From 395532a050a33dd8009d34a7f87dc96afbfe0ca5 Mon Sep 17 00:00:00 2001 From: Lianghai Wu Date: Tue, 5 Dec 2023 10:11:57 +0000 Subject: [PATCH 001/129] First M7 import before compiling test --- ifs-source/arpifs/chem/chem_tm5.F90 | 3 +- ifs-source/arpifs/chem/tm5_macc_aerosol.F90 | 11 +- ifs-source/arpifs/control/cnt4.F90 | 26 + .../module/model_physics_aerosol_mod.F90 | 4 +- ifs-source/arpifs/module/yoeaerop.F90 | 8 + ifs-source/arpifs/module/yoerad.F90 | 6 + ifs-source/arpifs/module/yom_ygfl.F90 | 16 + ifs-source/arpifs/module/yomphyder.F90 | 3 + ifs-source/arpifs/phys_ec/OIFS_to_HAM.F90 | 80 + ifs-source/arpifs/phys_ec/aer_phy3.F90 | 6 +- ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 | 78 +- ifs-source/arpifs/phys_ec/aer_so2so4_v2.F90 | 22 +- ifs-source/arpifs/phys_ec/aer_src.F90 | 4 +- ifs-source/arpifs/phys_ec/aer_ssalt_ms.F90 | 7 +- ifs-source/arpifs/phys_ec/aerini_layer.F90 | 56 + ifs-source/arpifs/phys_ec/aero_init.F90 | 13 + ifs-source/arpifs/phys_ec/callpar.F90 | 10 +- ifs-source/arpifs/phys_ec/hamm7_init.F90 | 485 ++ ifs-source/arpifs/phys_ec/hamm7_interface.F90 | 1825 +++++++ .../arpifs/phys_ec/local_arrays_fin.F90 | 7 + ifs-source/arpifs/phys_ec/m7.F90 | 268 + ifs-source/arpifs/phys_ec/m7_box.F90 | 205 + .../phys_ec/m7_simple_sulfur_drydep.F90 | 378 ++ ifs-source/arpifs/phys_ec/mo_activ.F90 | 728 +++ ifs-source/arpifs/phys_ec/mo_advection.F90 | 35 + ifs-source/arpifs/phys_ec/mo_constants.F90 | 25 + ifs-source/arpifs/phys_ec/mo_control.F90 | 144 + ifs-source/arpifs/phys_ec/mo_conv.F90 | 77 + .../phys_ec/mo_convert_concentrations.F90 | 197 + ifs-source/arpifs/phys_ec/mo_exception.F90 | 270 + ifs-source/arpifs/phys_ec/mo_filename.F90 | 40 + ifs-source/arpifs/phys_ec/mo_ham.F90 | 865 +++ ifs-source/arpifs/phys_ec/mo_ham_activ.F90 | 820 +++ ifs-source/arpifs/phys_ec/mo_ham_drydep.F90 | 1080 ++++ ifs-source/arpifs/phys_ec/mo_ham_init.F90 | 1191 +++++ ifs-source/arpifs/phys_ec/mo_ham_kappa.F90 | 403 ++ ifs-source/arpifs/phys_ec/mo_ham_m7.F90 | 4715 +++++++++++++++++ ifs-source/arpifs/phys_ec/mo_ham_m7_nucl.F90 | 1134 ++++ ifs-source/arpifs/phys_ec/mo_ham_m7_trac.F90 | 287 + ifs-source/arpifs/phys_ec/mo_ham_m7ctl.F90 | 688 +++ ifs-source/arpifs/phys_ec/mo_ham_rad.F90 | 2257 ++++++++ ifs-source/arpifs/phys_ec/mo_ham_rad_data.F90 | 467 ++ .../arpifs/phys_ec/mo_ham_sedimentation.F90 | 275 + ifs-source/arpifs/phys_ec/mo_ham_soa.F90 | 782 +++ ifs-source/arpifs/phys_ec/mo_ham_species.F90 | 441 ++ ifs-source/arpifs/phys_ec/mo_ham_subm.F90 | 794 +++ .../arpifs/phys_ec/mo_ham_subm_species.F90 | 241 + ifs-source/arpifs/phys_ec/mo_ham_tools.F90 | 529 ++ ifs-source/arpifs/phys_ec/mo_ham_wetdep.F90 | 1612 ++++++ .../arpifs/phys_ec/mo_ham_wetdep_data.F90 | 1098 ++++ .../arpifs/phys_ec/mo_hammoz_drydep.F90 | 551 ++ .../phys_ec/mo_hammoz_sedimentation.F90 | 290 + .../arpifs/phys_ec/mo_hammoz_wetdep.F90 | 1243 +++++ ifs-source/arpifs/phys_ec/mo_io_units.F90 | 44 + ifs-source/arpifs/phys_ec/mo_kind.F90 | 9 + .../arpifs/phys_ec/mo_math_constants.F90 | 106 + ifs-source/arpifs/phys_ec/mo_namelist.F90 | 220 + ifs-source/arpifs/phys_ec/mo_netcdf.F90 | 854 +++ .../arpifs/phys_ec/mo_param_switches.F90 | 60 + .../arpifs/phys_ec/mo_physical_constants.F90 | 255 + .../phys_ec/mo_radiation_parameters.F90 | 251 + .../arpifs/phys_ec/mo_read_netcdf77.F90 | 1144 ++++ ifs-source/arpifs/phys_ec/mo_species.F90 | 827 +++ ifs-source/arpifs/phys_ec/mo_submodel.F90 | 888 ++++ ifs-source/arpifs/phys_ec/mo_time_control.F90 | 19 + ifs-source/arpifs/phys_ec/mo_tracdef.F90 | 330 ++ ifs-source/arpifs/phys_ec/mo_tracer.F90 | 1083 ++++ .../arpifs/phys_ec/mo_tracer_processes.F90 | 1229 +++++ ifs-source/arpifs/phys_ec/mo_util_string.F90 | 122 + ifs-source/arpifs/phys_ec/su_aerw.F90 | 45 + ifs-source/arpifs/phys_ec/tm5m7_drydep.F90 | 639 +++ .../arpifs/phys_ec/tm5m7_get_refr_idx.F90 | 409 ++ ifs-source/arpifs/phys_ec/tm5m7_init.F90 | 269 + .../arpifs/phys_ec/tm5m7_optics_aop_get.F90 | 249 + .../phys_ec/tm5m7_optics_calculate_aop.F90 | 416 ++ .../arpifs/phys_ec/tm5m7_optics_get.F90 | 240 + .../arpifs/phys_ec/tm5m7_optics_init.F90 | 532 ++ ifs-source/arpifs/phys_ec/tm5m7_phy2.F90 | 453 ++ ifs-source/arpifs/phys_ec/tm5m7_scav.F90 | 542 ++ ifs-source/arpifs/phys_ec/tm5m7_sediment.F90 | 360 ++ ifs-source/arpifs/phys_ec/tm5m7_src.F90 | 856 +++ ifs-source/arpifs/phys_ec/tm5m7_src_dust.F90 | 1445 +++++ .../arpifs/phys_ec/tm5m7_src_dust_init.F90 | 208 + ifs-source/arpifs/phys_ec/tm5m7_src_ss.F90 | 373 ++ ifs-source/arpifs/phys_radi/raddrv.F90 | 91 +- .../arpifs/phys_radi/radiation_scheme.F90 | 70 +- ifs-source/arpifs/phys_radi/radintg.F90 | 95 +- ifs-source/arpifs/phys_radi/suecrad.F90 | 13 + ifs-source/arpifs/setup/sugfl1.F90 | 31 +- ifs-source/arpifs/setup/sugfl2.F90 | 66 + ifs-source/arpifs/setup/sugfl3.F90 | 16 + .../module/radiation_aerosol_optics.F90 | 74 + .../radiation/module/radiation_interface.F90 | 42 +- 93 files changed, 41717 insertions(+), 58 deletions(-) create mode 100644 ifs-source/arpifs/phys_ec/OIFS_to_HAM.F90 create mode 100644 ifs-source/arpifs/phys_ec/hamm7_init.F90 create mode 100755 ifs-source/arpifs/phys_ec/hamm7_interface.F90 create mode 100755 ifs-source/arpifs/phys_ec/m7.F90 create mode 100644 ifs-source/arpifs/phys_ec/m7_box.F90 create mode 100644 ifs-source/arpifs/phys_ec/m7_simple_sulfur_drydep.F90 create mode 100644 ifs-source/arpifs/phys_ec/mo_activ.F90 create mode 100644 ifs-source/arpifs/phys_ec/mo_advection.F90 create mode 100644 ifs-source/arpifs/phys_ec/mo_constants.F90 create mode 100644 ifs-source/arpifs/phys_ec/mo_control.F90 create mode 100644 ifs-source/arpifs/phys_ec/mo_conv.F90 create mode 100644 ifs-source/arpifs/phys_ec/mo_convert_concentrations.F90 create mode 100644 ifs-source/arpifs/phys_ec/mo_exception.F90 create mode 100644 ifs-source/arpifs/phys_ec/mo_filename.F90 create mode 100644 ifs-source/arpifs/phys_ec/mo_ham.F90 create mode 100644 ifs-source/arpifs/phys_ec/mo_ham_activ.F90 create mode 100644 ifs-source/arpifs/phys_ec/mo_ham_drydep.F90 create mode 100644 ifs-source/arpifs/phys_ec/mo_ham_init.F90 create mode 100644 ifs-source/arpifs/phys_ec/mo_ham_kappa.F90 create mode 100644 ifs-source/arpifs/phys_ec/mo_ham_m7.F90 create mode 100644 ifs-source/arpifs/phys_ec/mo_ham_m7_nucl.F90 create mode 100644 ifs-source/arpifs/phys_ec/mo_ham_m7_trac.F90 create mode 100644 ifs-source/arpifs/phys_ec/mo_ham_m7ctl.F90 create mode 100755 ifs-source/arpifs/phys_ec/mo_ham_rad.F90 create mode 100755 ifs-source/arpifs/phys_ec/mo_ham_rad_data.F90 create mode 100644 ifs-source/arpifs/phys_ec/mo_ham_sedimentation.F90 create mode 100644 ifs-source/arpifs/phys_ec/mo_ham_soa.F90 create mode 100755 ifs-source/arpifs/phys_ec/mo_ham_species.F90 create mode 100755 ifs-source/arpifs/phys_ec/mo_ham_subm.F90 create mode 100644 ifs-source/arpifs/phys_ec/mo_ham_subm_species.F90 create mode 100644 ifs-source/arpifs/phys_ec/mo_ham_tools.F90 create mode 100755 ifs-source/arpifs/phys_ec/mo_ham_wetdep.F90 create mode 100644 ifs-source/arpifs/phys_ec/mo_ham_wetdep_data.F90 create mode 100644 ifs-source/arpifs/phys_ec/mo_hammoz_drydep.F90 create mode 100644 ifs-source/arpifs/phys_ec/mo_hammoz_sedimentation.F90 create mode 100755 ifs-source/arpifs/phys_ec/mo_hammoz_wetdep.F90 create mode 100644 ifs-source/arpifs/phys_ec/mo_io_units.F90 create mode 100644 ifs-source/arpifs/phys_ec/mo_kind.F90 create mode 100644 ifs-source/arpifs/phys_ec/mo_math_constants.F90 create mode 100644 ifs-source/arpifs/phys_ec/mo_namelist.F90 create mode 100644 ifs-source/arpifs/phys_ec/mo_netcdf.F90 create mode 100644 ifs-source/arpifs/phys_ec/mo_param_switches.F90 create mode 100644 ifs-source/arpifs/phys_ec/mo_physical_constants.F90 create mode 100644 ifs-source/arpifs/phys_ec/mo_radiation_parameters.F90 create mode 100644 ifs-source/arpifs/phys_ec/mo_read_netcdf77.F90 create mode 100644 ifs-source/arpifs/phys_ec/mo_species.F90 create mode 100644 ifs-source/arpifs/phys_ec/mo_submodel.F90 create mode 100644 ifs-source/arpifs/phys_ec/mo_time_control.F90 create mode 100644 ifs-source/arpifs/phys_ec/mo_tracdef.F90 create mode 100644 ifs-source/arpifs/phys_ec/mo_tracer.F90 create mode 100755 ifs-source/arpifs/phys_ec/mo_tracer_processes.F90 create mode 100644 ifs-source/arpifs/phys_ec/mo_util_string.F90 create mode 100644 ifs-source/arpifs/phys_ec/tm5m7_drydep.F90 create mode 100644 ifs-source/arpifs/phys_ec/tm5m7_get_refr_idx.F90 create mode 100755 ifs-source/arpifs/phys_ec/tm5m7_init.F90 create mode 100644 ifs-source/arpifs/phys_ec/tm5m7_optics_aop_get.F90 create mode 100644 ifs-source/arpifs/phys_ec/tm5m7_optics_calculate_aop.F90 create mode 100644 ifs-source/arpifs/phys_ec/tm5m7_optics_get.F90 create mode 100644 ifs-source/arpifs/phys_ec/tm5m7_optics_init.F90 create mode 100644 ifs-source/arpifs/phys_ec/tm5m7_phy2.F90 create mode 100644 ifs-source/arpifs/phys_ec/tm5m7_scav.F90 create mode 100644 ifs-source/arpifs/phys_ec/tm5m7_sediment.F90 create mode 100644 ifs-source/arpifs/phys_ec/tm5m7_src.F90 create mode 100644 ifs-source/arpifs/phys_ec/tm5m7_src_dust.F90 create mode 100644 ifs-source/arpifs/phys_ec/tm5m7_src_dust_init.F90 create mode 100644 ifs-source/arpifs/phys_ec/tm5m7_src_ss.F90 diff --git a/ifs-source/arpifs/chem/chem_tm5.F90 b/ifs-source/arpifs/chem/chem_tm5.F90 index 24b94280..e33447ba 100644 --- a/ifs-source/arpifs/chem/chem_tm5.F90 +++ b/ifs-source/arpifs/chem/chem_tm5.F90 @@ -329,6 +329,7 @@ SUBROUTINE CHEM_TM5& ASSOCIATE(YDECLD=>YDMODEL%YRML_PHY_EC%YRECLD,YGFL=>YDMODEL%YRML_GCONF%YGFL,& & YDCHEM=>YDMODEL%YRML_CHEM%YRCHEM, YDERDI=>YDMODEL%YRML_PHY_RAD%YRERDI, & & YDEAERSRC=>YDMODEL%YRML_PHY_AER%YREAERSRC, YDEAERSNK=>YDMODEL%YRML_PHY_AER%YREAERSNK, & + & YDEAERVOL=>YDMODEL%YRML_PHY_AER%YREAERVOL, & YDEAERATM=>YDMODEL%YRML_PHY_RAD%YREAERATM, YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO, & & LPHYLIN=>YDMODEL%YRML_PHY_SLIN%YREPHLI%LPHYLIN) ASSOCIATE(NACTAERO=>YGFL%NACTAERO, NCHEM=>YGFL%NCHEM, NCHEM_DV=>YGFL%NCHEM_DV, & @@ -497,7 +498,7 @@ SUBROUTINE CHEM_TM5& IF ( LCHEM_AEROI ) THEN IF (TRIM(AERO_SCHEME)=="aer" )THEN ! * from MACC fields - CALL TM5_MACC_AEROSOL(KIDIA,KFDIA,KLON,KLEV, KAERO, & + CALL TM5_MACC_AEROSOL(YDEAERSNK,YDEAERVOL,YDEAERATM, KIDIA,KFDIA,KLON,KLEV, KAERO, & & PRS1 , PAEROP , ZRHCL , & & ZTAUS_AER,ZTAUA_AER,ZPMAER) ELSEIF (TRIM(AERO_SCHEME)=="glomap") THEN diff --git a/ifs-source/arpifs/chem/tm5_macc_aerosol.F90 b/ifs-source/arpifs/chem/tm5_macc_aerosol.F90 index 56c95087..4e6e0126 100644 --- a/ifs-source/arpifs/chem/tm5_macc_aerosol.F90 +++ b/ifs-source/arpifs/chem/tm5_macc_aerosol.F90 @@ -6,7 +6,7 @@ ! granted to it by virtue of its status as an intergovernmental organisation ! nor does it submit to any jurisdiction -SUBROUTINE TM5_MACC_AEROSOL ( KIDIA,KFDIA,KLON,KLEV, KACTAERO, & +SUBROUTINE TM5_MACC_AEROSOL (YREAERSNK,YREAERVOL,YREAERATM, KIDIA,KFDIA,KLON,KLEV, KACTAERO, & & PAPH , PAEROK , PRHCL , & & PTAUS_AER,PTAUA_AER, PMAER ) @@ -63,12 +63,12 @@ SUBROUTINE TM5_MACC_AEROSOL ( KIDIA,KFDIA,KLON,KLEV, KACTAERO, & USE TM5_PHOTOLYSIS , ONLY : NBANDS_TROP, NGRID, WL_EFF, WL_AER USE YOMCST ,ONLY : RG -USE YOEAERATM ,ONLY : YREAERATM +USE YOEAERATM ,ONLY : TEAERATM!YREAERATM USE YOEAEROP ,ONLY : ALF_SU, ALF_OM, ALF_DD, ALF_SS, ALF_BC, ALF_NI, ALF_AM, ALF_SOA, & & ASY_SU, ASY_OM, ASY_DD, ASY_SS, ASY_BC, ASY_NI, ASY_AM, ASY_SOA, & & OMG_SU, OMG_OM, OMG_DD, OMG_SS, OMG_BC, OMG_NI, OMG_AM, OMG_SOA -USE YOEAERSNK ,ONLY : YREAERSNK -USE YOEAERVOL ,ONLY : YREAERVOL +USE YOEAERSNK ,ONLY : TEAERSNK!YREAERSNK +USE YOEAERVOL ,ONLY : TEAERVOL!YREAERVOL IMPLICIT NONE @@ -76,6 +76,9 @@ SUBROUTINE TM5_MACC_AEROSOL ( KIDIA,KFDIA,KLON,KLEV, KACTAERO, & !* 0.1 ARGUMENTS ! --------- +TYPE(TEAERSNK), INTENT(INOUT) :: YREAERSNK +TYPE(TEAERVOL), INTENT(INOUT) :: YREAERVOL +TYPE(TEAERATM), INTENT(INOUT) :: YREAERATM INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA, KFDIA, KLON, KLEV INTEGER(KIND=JPIM),INTENT(IN) :: KACTAERO ! Number of active aerosol species diff --git a/ifs-source/arpifs/control/cnt4.F90 b/ifs-source/arpifs/control/cnt4.F90 index bde29021..899de4c7 100644 --- a/ifs-source/arpifs/control/cnt4.F90 +++ b/ifs-source/arpifs/control/cnt4.F90 @@ -295,6 +295,8 @@ SUBROUTINE CNT4(YDGEOMETRY,YDFIELDS,YDMTRAJ,YDMODEL,YDJOT,YDVARBC,YDTCV,YDGOM5,Y !#include "couplo4_definitions.intfb.h" #include "fullpos_drv.intfb.h" #include "chem_init.intfb.h" +#include "tm5m7_init.intfb.h"!m7 +#include "hamm7_init.intfb.h"!m7 @@ -328,9 +330,11 @@ SUBROUTINE CNT4(YDGEOMETRY,YDFIELDS,YDMTRAJ,YDMODEL,YDJOT,YDVARBC,YDTCV,YDGOM5,Y & YGFL=>YDMODEL%YRML_GCONF%YGFL,YDEPHY=>YDMODEL%YRML_PHY_EC%YREPHY,YDCHEM=>YDMODEL%YRML_CHEM%YRCHEM) ASSOCIATE(NCHEM=>YGFL%NCHEM, NDIM=>YGFL%NDIM, NUMFLDS=>YGFL%NUMFLDS, & + & NAERO=>YGFL%NAERO, & & YCOMP=>YGFL%YCOMP, & & GFUBUF=>YDCFU%GFUBUF, XFUBUF=>YDXFU%XFUBUF, & & LCHEM_DIA=>YDCOMPO%LCHEM_DIA, & + & AERO_SCHEME=>YDCOMPO%AERO_SCHEME, & & NPROMA=>YDDIM%NPROMA, & & NFLEVG=>YDDIMV%NFLEVG, & & NGPTOT=>YDGEM%NGPTOT, & @@ -503,6 +507,28 @@ SUBROUTINE CNT4(YDGEOMETRY,YDFIELDS,YDMTRAJ,YDMODEL,YDJOT,YDVARBC,YDTCV,YDGOM5,Y END IF ENDIF +! Initialize aerosol indices (tm5m7 - if active) +! moving the CASE-clause that tests AERO_SCHEME from +! ./src/ifs/phys_ec/tm5m7_init.F90 here +IF (NAERO > 0 .AND. NCONF /= 131 ) THEN + SELECT CASE (TRIM(AERO_SCHEME)) + + CASE ("aer") + ! Setup of 'aer' configuration is done in su_aerw.F90 + CASE ("tm5m7") + CALL TM5M7_INIT(YDGEOMETRY, YDMODEL%YRML_CHEM%YRCOMPO, YGFL, YDMODEL%YRML_PHY_RAD%YRERAD) + CASE ("hamm7") + ! HAM-M7 only calculates aerosol micro-physics, + ! all other processes are dealt with in TM5-M7 + ! therefore we also have to initialize TM5-M7 + CALL TM5M7_INIT(YDGEOMETRY, YDMODEL%YRML_CHEM%YRCOMPO, YGFL, YDMODEL%YRML_PHY_RAD%YRERAD) + CALL HAMM7_INIT(YGFL) !requires stuff which is defined in TM5M7_INIT + CASE DEFAULT + ! Option not implemented + CALL ABOR1(" NO AEROSOL SCHEME "//TRIM(AERO_SCHEME)) + END SELECT +ENDIF + !IF (LCOUPLO4_ENV) THEN ! CALL COUPLO4_DEFINITIONS !ENDIF diff --git a/ifs-source/arpifs/module/model_physics_aerosol_mod.F90 b/ifs-source/arpifs/module/model_physics_aerosol_mod.F90 index 152dd8ce..eeb358a0 100644 --- a/ifs-source/arpifs/module/model_physics_aerosol_mod.F90 +++ b/ifs-source/arpifs/module/model_physics_aerosol_mod.F90 @@ -16,7 +16,8 @@ MODULE MODEL_PHYSICS_AEROSOL_MOD USE YOEAERSNK, ONLY : TEAERSNK USE YOEAERSRC, ONLY : TEAERSRC USE YOEAERVOL, ONLY : TEAERVOL - USE YOEDBUG, ONLY : TEDBUG + USE YOEAEROP, ONLY : TEAERM7 + USE YOEDBUG, ONLY : TEDBUG IMPLICIT NONE TYPE MODEL_PHYSICS_AEROSOL_TYPE @@ -28,6 +29,7 @@ MODULE MODEL_PHYSICS_AEROSOL_MOD TYPE(TEAERSRC) :: YREAERSRC !! sources TYPE(TEAERVOL) :: YREAERVOL !! volcanic aerosols TYPE(TEDBUG) :: YREDBUG !! aerosol debugging help + TYPE(TEAERM7) :: YREAEROPT !! M7 aerosol optical properties CONTAINS diff --git a/ifs-source/arpifs/module/yoeaerop.F90 b/ifs-source/arpifs/module/yoeaerop.F90 index 49bded7a..b31e2b14 100644 --- a/ifs-source/arpifs/module/yoeaerop.F90 +++ b/ifs-source/arpifs/module/yoeaerop.F90 @@ -49,6 +49,14 @@ MODULE YOEAEROP REAL(KIND=JPRB) :: ALFL_SU(12,16) , ASYL_SU(12,16) , OMGL_SU(12,16) +! M7 aerosol optical properties +TYPE:: TEAERM7 + +REAL(KIND=JPRB), ALLOCATABLE, PUBLIC :: M7AOD(:,:,:,:) +REAL(KIND=JPRB), ALLOCATABLE, PUBLIC :: M7SSA(:,:,:,:) +REAL(KIND=JPRB), ALLOCATABLE, PUBLIC :: M7ASYM(:,:,:,:) +REAL(KIND=JPRB), ALLOCATABLE, PUBLIC :: M7AODLW(:,:,:,:) +END TYPE TEAERM7 ! ------------------------------------------------------------------ ! 9 refers to up to 9 bins (3 operationally for SS and DD) ! 20 to 19 SW channel radiances + 1 channel at 10 micron diff --git a/ifs-source/arpifs/module/yoerad.F90 b/ifs-source/arpifs/module/yoerad.F90 index 9e222565..9b9c4373 100644 --- a/ifs-source/arpifs/module/yoerad.F90 +++ b/ifs-source/arpifs/module/yoerad.F90 @@ -141,6 +141,12 @@ MODULE YOERAD ! Look-up table for Planck function in emissivity intervals TYPE(TSPECTRALPLANCK) :: YSPECTPLANCK + + +INTEGER :: NCLOUDACT + +INTEGER :: NAEROOPT + !---------------------------------------------------------------------------- CONTAINS PROCEDURE, PASS :: PRINT => PRINT_CONFIGURATION diff --git a/ifs-source/arpifs/module/yom_ygfl.F90 b/ifs-source/arpifs/module/yom_ygfl.F90 index 02370c2a..30e1b456 100644 --- a/ifs-source/arpifs/module/yom_ygfl.F90 +++ b/ifs-source/arpifs/module/yom_ygfl.F90 @@ -387,6 +387,13 @@ MODULE YOM_YGFL TYPE(TYPE_GFL_COMP),POINTER :: YLIMA(:) => NULL() ! LIMA prognostic fields + +! water and ice cloud variables when using online aerosols +TYPE(TYPE_GFL_COMP),POINTER :: YCDNC ! Cloud droplet number concentration +TYPE(TYPE_GFL_COMP),POINTER :: YICNC ! Ice crystal number concentration +TYPE(TYPE_GFL_COMP),POINTER :: YRE_LIQ ! Effective radius of liquid water droplets +TYPE(TYPE_GFL_COMP),POINTER :: YRE_ICE ! Effective radius of ice crystals + ! cloud heterogeneity FSD TYPE(TYPE_GFL_COMP),POINTER :: YFSD => NULL() ! PHYS output @@ -467,6 +474,15 @@ MODULE YOM_YGFL TYPE(TYPE_AERO_WVL_DIAG) :: YAERO_WVL_DIAG_NL(NPAERO_WVL_DIAG) ! Per-wavelength aerosol optical diagnostics TYPE(TYPE_GFL_NAML) :: YLIMA_NL(JPLIMA) ! LIMA prognostic fields + +!-->eehol: added these +! water and ice cloud variables when using online aerosols +TYPE(TYPE_GFL_NAML) :: YCDNC_NL ! Cloud droplet number concentration +TYPE(TYPE_GFL_NAML) :: YICNC_NL ! Ice crystal number concentration +TYPE(TYPE_GFL_NAML) :: YRE_LIQ_NL ! Effective radius of liquid water droplets +TYPE(TYPE_GFL_NAML) :: YRE_ICE_NL ! Effective radius of ice crystals +!-->eehol + END TYPE TYPE_GFLD ! GFL general descriptor diff --git a/ifs-source/arpifs/module/yomphyder.F90 b/ifs-source/arpifs/module/yomphyder.F90 index 1eece5ce..382e5a6b 100644 --- a/ifs-source/arpifs/module/yomphyder.F90 +++ b/ifs-source/arpifs/module/yomphyder.F90 @@ -45,6 +45,9 @@ MODULE YOMPHYDER REAL(KIND=JPRB), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZAERAOTLEV,ZAERAAOTLEV, ZAERASYLEV REAL(KIND=JPRB), DIMENSION(:,:) , POINTER, CONTIGUOUS :: ZAERSRC, ZAERDDP, ZAERSDM, ZAERFLX, ZAERLIF REAL(KIND=JPRB), DIMENSION(:) , POINTER, CONTIGUOUS :: ZAZ0M, ZAZ0H +!--aerosol optical properties at 14 SW wavelengths (TM5M7) + REAL(KIND=JPRB), DIMENSION(:,:,:), POINTER :: ZAEROTAU, ZAEROSSA,ZAEROASY,ZAEROTAULW + ! - DMS-related aerosol local arrays REAL(KIND=JPRB), DIMENSION(:) , POINTER, CONTIGUOUS :: ZDMSO, ZLDAY, ZLISS, ZSO2, ZTDMS, ZDMSI, ZODMS !-- other prognostic aerosol-related quantities diff --git a/ifs-source/arpifs/phys_ec/OIFS_to_HAM.F90 b/ifs-source/arpifs/phys_ec/OIFS_to_HAM.F90 new file mode 100644 index 00000000..bcfaee8a --- /dev/null +++ b/ifs-source/arpifs/phys_ec/OIFS_to_HAM.F90 @@ -0,0 +1,80 @@ +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! \filename +!! OIFS_to_HAM.f90 +!! +!! \brief +!! Contains all the variables for needed to make HAM compatible with OIFS. +!! +!! \author Eemeli Holopainen (FMI) +!! +!! \responsible_coder +!! Eemeli Holopainen, eemeli.holopainen@fmi.fi +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +MODULE OIFS_to_HAM + + USE mo_ham, ONLY: nclass, naerocomp, subm_ngasspec + + IMPLICIT NONE + + PUBLIC :: init_ind_oifs_ham + + !-->eehol: allocatable integer list for HAM and OIFS + type ind_oifs_ham_type + INTEGER, PUBLIC, ALLOCATABLE :: ind_class_OIFS(:) !eehol: index list for sizeclass OIFS tracers + INTEGER, PUBLIC, ALLOCATABLE :: ind_mass_OIFS(:) !eehol: index list for mass OIFS tracers + INTEGER, PUBLIC, ALLOCATABLE :: ind_gas_OIFS(:) !eehol: index list for gas OIFS tracers + INTEGER, PUBLIC, ALLOCATABLE :: ind_cloud_OIFS(:) !eehol: index list for cloud OIFS tracers + INTEGER, PUBLIC, ALLOCATABLE :: ind_class_HAM(:) !eehol: index list for sizeclass HAM tracers + INTEGER, PUBLIC, ALLOCATABLE :: ind_mass_HAM(:) !eehol: index list for mass HAM tracers + INTEGER, PUBLIC, ALLOCATABLE :: ind_gas_HAM(:) !eehol: index list for gas HAM tracers + INTEGER, PUBLIC, ALLOCATABLE :: ind_cloud_HAM(:) !eehol: index list for cloud HAM tracers + end type ind_oifs_ham_type + !<--eehol + + TYPE(ind_oifs_ham_type) :: ind_oifs_ham + !!$OMP THREADPRIVATE(ind_oifs_ham) + +CONTAINS + + SUBROUTINE init_ind_oifs_ham(knclass,knaerocomp,ksubm_ngasspec,kcloudind) + + ! *ind_oif_ham* allocates and initializes the index list for OIFS tracers and HAM tracers + ! Authors: + ! ------- + ! Eemeli Holopainen, FMI 4/2022 + + INTEGER, INTENT(IN) :: knclass,knaerocomp,ksubm_ngasspec,kcloudind + + IF (ALLOCATED(ind_oifs_ham%ind_class_OIFS)) DEALLOCATE(ind_oifs_ham%ind_class_OIFS) + IF (ALLOCATED(ind_oifs_ham%ind_class_HAM)) DEALLOCATE(ind_oifs_ham%ind_class_HAM) + IF (ALLOCATED(ind_oifs_ham%ind_mass_OIFS)) DEALLOCATE(ind_oifs_ham%ind_mass_OIFS) + IF (ALLOCATED(ind_oifs_ham%ind_mass_HAM)) DEALLOCATE(ind_oifs_ham%ind_mass_HAM) + IF (ALLOCATED(ind_oifs_ham%ind_gas_OIFS)) DEALLOCATE(ind_oifs_ham%ind_gas_OIFS) + IF (ALLOCATED(ind_oifs_ham%ind_gas_HAM)) DEALLOCATE(ind_oifs_ham%ind_gas_HAM) + IF (ALLOCATED(ind_oifs_ham%ind_cloud_OIFS)) DEALLOCATE(ind_oifs_ham%ind_cloud_OIFS) + IF (ALLOCATED(ind_oifs_ham%ind_cloud_HAM)) DEALLOCATE(ind_oifs_ham%ind_cloud_HAM) + + ALLOCATE(ind_oifs_ham%ind_class_OIFS(knclass)) + ALLOCATE(ind_oifs_ham%ind_class_HAM(knclass)) + ALLOCATE(ind_oifs_ham%ind_mass_OIFS(knaerocomp)) + ALLOCATE(ind_oifs_ham%ind_mass_HAM(knaerocomp)) + ALLOCATE(ind_oifs_ham%ind_gas_OIFS(ksubm_ngasspec)) + ALLOCATE(ind_oifs_ham%ind_gas_HAM(ksubm_ngasspec)) + ALLOCATE(ind_oifs_ham%ind_cloud_OIFS(kcloudind)) + ALLOCATE(ind_oifs_ham%ind_cloud_HAM(kcloudind)) + + ind_oifs_ham%ind_class_OIFS(:) = 0 + ind_oifs_ham%ind_mass_OIFS(:) = 0 + ind_oifs_ham%ind_gas_OIFS(:) = 0 + ind_oifs_ham%ind_cloud_OIFS(:) = 0 + ind_oifs_ham%ind_class_HAM(:) = 0 + ind_oifs_ham%ind_mass_HAM(:) = 0 + ind_oifs_ham%ind_gas_HAM(:) = 0 + ind_oifs_ham%ind_cloud_HAM(:) = 0 + + END SUBROUTINE init_ind_oifs_ham + +END MODULE OIFS_to_HAM diff --git a/ifs-source/arpifs/phys_ec/aer_phy3.F90 b/ifs-source/arpifs/phys_ec/aer_phy3.F90 index 00d64431..02f4541d 100644 --- a/ifs-source/arpifs/phys_ec/aer_phy3.F90 +++ b/ifs-source/arpifs/phys_ec/aer_phy3.F90 @@ -160,7 +160,7 @@ SUBROUTINE AER_PHY3 & REAL(KIND=JPRB) :: ZBCPHI(KLON,KLEV), ZBCPHO(KLON,KLEV), ZOMPHI(KLON,KLEV) , ZOMPHO(KLON,KLEV) REAL(KIND=JPRB) :: ZTBCPHI(KLON,KLEV),ZTBCPHO(KLON,KLEV),ZTOMPHI(KLON,KLEV), ZTOMPHO(KLON,KLEV) REAL(KIND=JPRB) :: ZITBCPHO(KLON,KLEV),ZITOMPHO(KLON,KLEV),ZITSO2(KLON,KLEV) -REAL(KIND=JPRB) :: ZFSO2(KLON) , ZFSO4(KLON), ZFSOA(KLON,4) +REAL(KIND=JPRB) :: ZFSO2(KLON) , ZFSO4(KLON), ZFSO4_AQ(KLON), ZFSOA(KLON,4) REAL(KIND=JPRB) :: ZQSAT(KLON,KLEV), ZRHCL(KLON,KLEV), ZRHO(KLON,KLEV) REAL(KIND=JPRB) :: ZTAER(KLON,KLEV), ZTAERI(KLON,KLEV),ZTAERGASA(KLON,KLEV),ZTAERSOAA(KLON,KLEV) @@ -171,7 +171,7 @@ SUBROUTINE AER_PHY3 & REAL(KIND=JPRB) :: ZHNO3OK(KLON,KLEV) REAL(KIND=JPRB) :: ZITNO3_1(KLON,KLEV) REAL(KIND=JPRB) :: ZSO4(KLON,KLEV) -REAL(KIND=JPRB) :: ZSO2(KLON,KLEV), ZTSO2(KLON,KLEV) , ZTSO4(KLON,KLEV) +REAL(KIND=JPRB) :: ZSO2(KLON,KLEV), ZTSO2(KLON,KLEV) , ZTSO4(KLON,KLEV), ZTSO4_AQ(KLON,KLEV) REAL(KIND=JPRB) :: ZNO3_1(KLON,KLEV),ZNO3_2(KLON,KLEV), ZNH4(KLON,KLEV) REAL(KIND=JPRB) :: ZDUST1(KLON,KLEV), ZDUST2(KLON,KLEV), ZDUST3(KLON,KLEV) REAL(KIND=JPRB) :: ZTDUST1(KLON,KLEV), ZTDUST2(KLON,KLEV), ZTDUST3(KLON,KLEV) @@ -501,7 +501,7 @@ SUBROUTINE AER_PHY3 & & PTSPHY, PTP , PRSF1 , PAP , ZQLI , PGELAT, PGELAM, & & ZSO2 , ZITSO2, PGFL(:,:,YAEROCLIM(1)%MP), & & PGFL(:,:,YAEROCLIM(2)%MP), PGFL(:,:,YAEROCLIM(3)%MP) ,& - & ZTSO2 , ZTSO4, ZFSO2, ZFSO4, ZDP ) + & ZTSO2 , ZTSO4, ZTSO4_AQ, ZFSO2, ZFSO4, ZFSO4_AQ, ZDP ) CASE DEFAULT CALL ABOR1('ABORT: IN AER_PHY3, NSO4SCHEME MUST BE 1 OR 2') diff --git a/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 b/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 index 12d52608..279b1346 100644 --- a/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 +++ b/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 @@ -96,6 +96,7 @@ SUBROUTINE AER_PHY3_LAYER(YDSURF, & TYPE (AUX_RAD_TYPE) , INTENT(INOUT) :: PRAD !----------------------------------------------------------------------- INTEGER(KIND=JPIM) :: JAER, JVAR, JWVL, JGFL, JK, JL +INTEGER(KIND=JPIM) :: IBLK REAL(KIND=JPRB) :: ZTH(KDIM%KLON,KDIM%KLEV+1),ZSNM(KDIM%KLON) REAL(KIND=JPRB) :: ZAERO_WVL_DIAG(KDIM%KLON,YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG,YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG_TYPES) REAL(KIND=JPRB),ALLOCATABLE :: ZAREA(:) @@ -114,14 +115,16 @@ SUBROUTINE AER_PHY3_LAYER(YDSURF, & REAL(KIND=JPRB) :: ZO3(KDIM%KLON,KDIM%KLEV) REAL(KIND=JPHOOK) :: ZHOOK_HANDLE +!VH temporary variables - need to think of a good way to port this further +REAL(KIND=JPRB) :: ZTAUS_AER(KDIM%KLON,KDIM%KLEV,NBANDS_TROP,2) +REAL(KIND=JPRB) :: ZTAUA_AER(KDIM%KLON,KDIM%KLEV,NBANDS_TROP,2) +REAL(KIND=JPRB) :: ZPMAER(KDIM%KLON,KDIM%KLEV,NBANDS_TROP,2) + !----------------------------------------------------------------------- #include "aer_phy3.intfb.h" - - - - +#include "hamm7_interface.intfb.h" #include "aer_diagglomap.intfb.h" #include "abor1.intfb.h" @@ -130,7 +133,9 @@ SUBROUTINE AER_PHY3_LAYER(YDSURF, & IF (LHOOK) CALL DR_HOOK('AER_PHY3_LAYER',0,ZHOOK_HANDLE) ASSOCIATE(YGFL=>YDMODEL%YRML_GCONF%YGFL,YDPHY2=>YDMODEL%YRML_PHY_MF%YRPHY2, & - & YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO,YDCHEM=>YDMODEL%YRML_CHEM%YRCHEM) + & YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO,YDCHEM=>YDMODEL%YRML_CHEM%YRCHEM, & + & YDECLDP=>YDMODEL%YRML_PHY_EC%YRECLDP, & + & YDAERM7=>YDMODEL%YRML_PHY_AER%YREAEROPT)! use this to transfer AOD, SSA and ASY to rad scheme ASSOCIATE(TSPHY=>YDPHY2%TSPHY, & & YSP_RR=>YDSURF%YSP_RR, YSP_SG=>YDSURF%YSP_SG, YSD_VF=>YDSURF%YSD_VF, & & YSP_SB=>YDSURF%YSP_SB, YSD_VD=>YDSURF%YSD_VD, NDIM=>YGFL%NDIM, & @@ -138,6 +143,7 @@ SUBROUTINE AER_PHY3_LAYER(YDSURF, & & NAERO_WVL_DIAG=>YGFL%NAERO_WVL_DIAG, & & NAERO_WVL_DIAG_TYPES=>YGFL%NAERO_WVL_DIAG_TYPES, & & NACTAERO=>YGFL%NACTAERO, & + & NAERCLD=>YDECLDP%NAERCLD, & & LAERCHEM=>YGFL%LAERCHEM, & & AERO_SCHEME=>YDCOMPO%AERO_SCHEME, & & YO3=>YGFL%YO3, & @@ -182,6 +188,68 @@ SUBROUTINE AER_PHY3_LAYER(YDSURF, & CASE ("glomap") CALL ABOR1("OIFS - glomap should never be called from OIFS, EXIT") + CASE ("tm5m7", "hamm7") + !Optical properties calculated only for radiation timesteps. + !Using previous optical properties if not calculated + ! introduce simple routine to ensure values are non-zero: + + + IBLK=(KDIM%KSTGLO-1)/KDIM%KLON + 1 + + DO JAER=1,14 + DO JK=1,KDIM%KLEV + DO JL=KDIM%KIDIA,KDIM%KFDIA + + GEMSL%ZAEROTAU(JL,JK,JAER)=YDAERM7%M7AOD(JL,JK,JAER,IBLK) + GEMSL%ZAEROSSA(JL,JK,JAER)=YDAERM7%M7SSA(JL,JK,JAER,IBLK) + GEMSL%ZAEROASY(JL,JK,JAER)=YDAERM7%M7ASYM(JL,JK,JAER,IBLK) + ENDDO + ENDDO + ENDDO + + CALL HAMM7_INTERFACE & + &( YDMODEL, & + & KDIM%KIDIA , KDIM%KFDIA , KDIM%KLON , KDIM%KTDIA , KDIM%KLEV , KDIM%KTILES , & + & KDIM%KFLDX , KDIM%KLEVX, & + & GEMSL%ITRAC , GEMSL%IAERO , GEMSL%ICHEM, KDIM%KSTGLO, PAUX%PGEOMH,& + & PAUX%PRS1 , PAUX%PRSF1 , GEMSL%ZAEROP, GEMSL%ZCAERO, GEMSL%ZCEN , PAUX%PAPHIF, & + & FLUX%PFPLCL , FLUX%PFPLCN , FLUX%PFPLSL , FLUX%PFPLSN , PAUX%PGELAT, PAUX%PGELAM, & + & STATE%A , STATE%CLD(:,:,NCLDQI), STATE%CLD(:,:,NCLDQL), STATE%CLD(:,:,NCLDQR), & + & STATE%CLD(:,:,NCLDQS), PDIAG%PCOVPTOT, PDIAG%ZLU , & + & ZO3 , STATE%Q , STATE%T , ZTH , GEMSL%ZTENC , GEMSL%ZCFLX , & + & GEMSL%ZAERDDP, GEMSL%ZAERSDM, GEMSL%ZAERSRC, GEMSL%ZAERWS , GEMSL%ZAERGUST , GEMSL%ZAERUST, GEMSL%ZAERMAP, & + & GEMSL%ZCLAERS, GEMSL%ZPRAERS, PCHEM2AER, & + & SURFL%ZALBD , SURFL%ZFRTI , PSURF%PSD_VF(:,YSD_VF%YLSM%MP) , & + & ZSNM , AUXL%ZWND , PSURF%PSP_SB(:,1,YSP_SB%YQ%MP9) , & + & GEMSL%ZAERFLX, GEMSL%ZAERLIF, & + & FLUX%PAERODDF, TSPHY , PGFL , & +!VH total optical depth output... + & PSURF%PSD_VD(:,YSD_VD%YODTOACC%MP), & + & ZAERO_WVL_DIAG, & + !& PSURF%PSD_VD(:,YSD_VD%YODTO469%MP), PSURF%PSD_VD(:,YSD_VD%YODTO670%MP), & + !& PSURF%PSD_VD(:,YSD_VD%YODTO865%MP), PSURF%PSD_VD(:,YSD_VD%YODTO1240%MP), & + & GEMSL%ZAEROTAU, GEMSL%ZAEROSSA,GEMSL%ZAEROASY, GEMSL%ZAEROTAULW,& +!VH Variables ZTAUS_AER etc ideally convoluted with GEMSL%ZAERTAULT, or similar. + & ZTAUS_AER , ZTAUA_AER, ZPMAER, & +!VH + & PSURF%PSD_XA, PAUX%PVERVEL, AUXL%ZCCNL, AUXL%ZCCNO, PSURF%PAHFSTI, PSURF%PSD_VF(:,YSD_VF%YCI%MP), GEMSL%ZAZ0M, FLUX%PFTLHEV, & + & STATE%U, STATE%V, PSURF%PCVL, PSURF%PCVH,PSURF%PSD_VF(:,YSD_VF%YSO2DD%MP), PAUX%PGEMU)!,ZTSO2,ZTSO4,ZTSO4_AQ,ZFSO2,ZFSO4 ,ZFSO4_AQ& + !&) !eehol: u-wind,v-wind,low veg. cover, high veg. cover, sine of latitude + + + DO JAER=1,14 + DO JK=1,KDIM%KLEV + DO JL=KDIM%KIDIA,KDIM%KFDIA + + YDAERM7%M7AOD(JL,JK,JAER,IBLK) = GEMSL%ZAEROTAU(JL,JK,JAER) + YDAERM7%M7SSA(JL,JK,JAER,IBLK) = GEMSL%ZAEROSSA(JL,JK,JAER)!*GEMSL%ZAEROTAU(JL,JK,JAER) + YDAERM7%M7ASYM(JL,JK,JAER,IBLK) = GEMSL%ZAEROASY(JL,JK,JAER)!*GEMSL%ZAEROSSA(JL,JK,JAER)*GEMSL%ZAEROTAU(JL,JK,JAER) + YDAERM7%M7AODLW(JL,JK,JAER,IBLK) = GEMSL%ZAEROTAULW(JL,JK,JAER) + !weighed values calculated in raddvr. + ENDDO + ENDDO + ENDDO + CASE ("aer") diff --git a/ifs-source/arpifs/phys_ec/aer_so2so4_v2.F90 b/ifs-source/arpifs/phys_ec/aer_so2so4_v2.F90 index 56e6f1f8..eddb9e73 100644 --- a/ifs-source/arpifs/phys_ec/aer_so2so4_v2.F90 +++ b/ifs-source/arpifs/phys_ec/aer_so2so4_v2.F90 @@ -10,7 +10,7 @@ SUBROUTINE AER_SO2SO4_V2 & &( YDRIP, KIDIA , KFDIA , KLON , KLEV , & & PTSPHY, PTP , PRSF1 , PNEB , PQLI , PGELAT, PGELAM, & & PSO2 , PITSO2, POH, PO3, PH2O2 , & - & PTSO2 , PTSO4, PFSO2, PFSO4, PDP ) + & PTSO2 , PTSO4, PTSO4_AQ, PFSO2, PFSO4, PFSO4_AQ, PDP ) !*** *AER_SO2SO4_V2* - GAS-TO-PARTICLE (SULPHATE AEROSOLS) @@ -80,8 +80,8 @@ SUBROUTINE AER_SO2SO4_V2 & REAL(KIND=JPRB) ,INTENT(IN) :: PDP(KLON,KLEV) -REAL(KIND=JPRB) ,INTENT(INOUT) :: PTSO2(KLON,KLEV), PTSO4(KLON,KLEV) ! new tendencies [kg / kg(air) / s] -REAL(KIND=JPRB) ,INTENT(OUT) :: PFSO2(KLON), PFSO4(KLON) +REAL(KIND=JPRB) ,INTENT(INOUT) :: PTSO2(KLON,KLEV), PTSO4(KLON,KLEV), PTSO4_AQ(KLON,KLEV)! new tendencies [kg / kg(air) / s] +REAL(KIND=JPRB) ,INTENT(OUT) :: PFSO2(KLON), PFSO4(KLON), PFSO4_AQ(KLON) !* 0.3 LOCAL PARAMETERS @@ -310,6 +310,7 @@ SUBROUTINE AER_SO2SO4_V2 & !! since the total tendency will be the sum of "sub-tendencies" PTSO2(:,:) = 0._JPRB PTSO4(:,:) = 0._JPRB +PTSO4_AQ(:,:) = 0._JPRB CALL COMPO_DIURNAL(YDRIP, KIDIA, KFDIA, KLON, 'Sine', PGELAM, PGELAT, ZSCALEOH, PAMPLITUDE=0.7_JPRB, PHOURPEAK=15.0_JPRB) CALL COMPO_DIURNAL(YDRIP, KIDIA, KFDIA, KLON, 'Sine', PGELAM, PGELAT, ZSCALEO3, PAMPLITUDE=0.7_JPRB, PHOURPEAK=15.0_JPRB) @@ -660,8 +661,9 @@ SUBROUTINE AER_SO2SO4_V2 & ZTend_Sum = ZTend_Aq_Sum + ZTend_OH_Sum - PTSO2(JL,JK) = PTSO2(JL,JK) -ZTend_Sum * ZRMSO2 / ZAIR_DENS / PTSPHY - PTSO4(JL,JK) = PTSO4(JL,JK) + ZTend_Sum * ZRMSO4 / ZAIR_DENS / PTSPHY + PTSO2(JL,JK) = PTSO2(JL,JK) - ZTend_Sum * ZRMSO2 / ZAIR_DENS / PTSPHY + PTSO4(JL,JK) = PTSO4(JL,JK) + ZTend_Sum * ZRMSO4 / ZAIR_DENS / PTSPHY + PTSO4_AQ(JL,JK) = PTSO4_AQ(JL,JK) + ZTend_Aq_Sum * ZRMSO4 / ZAIR_DENS / PTSPHY ! -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- @@ -672,15 +674,17 @@ SUBROUTINE AER_SO2SO4_V2 & ENDDO DO JL=KIDIA,KFDIA - PFSO4(JL)=0.0_JPRB - PFSO2(JL)=0.0_JPRB + PFSO4(JL) =0.0_JPRB + PFSO4_AQ(JL)=0.0_JPRB + PFSO2(JL) =0.0_JPRB ENDDO DO JK=1,KLEV DO JL=KIDIA,KFDIA - PFSO4(JL) = PFSO4(JL) + PTSO4(JL,JK)*(PDP(JL,JK))/RG - PFSO2(JL) = PFSO2(JL) + PTSO2(JL,JK)*(PDP(JL,JK))/RG + PFSO4(JL) = PFSO4(JL) + PTSO4(JL,JK)*(PDP(JL,JK))/RG + PFSO4_AQ(JL) = PFSO4_AQ(JL) + PTSO4_AQ(JL,JK)*(PDP(JL,JK))/RG + PFSO2(JL) = PFSO2(JL) + PTSO2(JL,JK)*(PDP(JL,JK))/RG ENDDO ENDDO diff --git a/ifs-source/arpifs/phys_ec/aer_src.F90 b/ifs-source/arpifs/phys_ec/aer_src.F90 index 0968a72a..974f4824 100644 --- a/ifs-source/arpifs/phys_ec/aer_src.F90 +++ b/ifs-source/arpifs/phys_ec/aer_src.F90 @@ -205,7 +205,7 @@ SUBROUTINE AER_SRC & !----------------------------------------------------------------------- #include "updcal.intfb.h" -#include "fcttim.func.h" +!#include "fcttim.func.h" #include "surf_inq.h" @@ -897,7 +897,7 @@ SUBROUTINE AER_SRC & & PCI, PLSM, PCLK, ZWNDSS, ZFLX_SSALT) CASE (2) - CALL AER_SSALT_MS (KIDIA, KFDIA, KLON,& + CALL AER_SSALT_MS (YDEAERATM, KIDIA, KFDIA, KLON,& & PCI, PLSM, PCLK, ZWNDSS, ZFLX_SSALT) CASE (3) diff --git a/ifs-source/arpifs/phys_ec/aer_ssalt_ms.F90 b/ifs-source/arpifs/phys_ec/aer_ssalt_ms.F90 index 5ee9522e..38e95b12 100644 --- a/ifs-source/arpifs/phys_ec/aer_ssalt_ms.F90 +++ b/ifs-source/arpifs/phys_ec/aer_ssalt_ms.F90 @@ -7,7 +7,7 @@ ! nor does it submit to any jurisdiction SUBROUTINE AER_SSALT_MS & - &( KIDIA, KFDIA, KLON, & + &( YDEAERATM, KIDIA, KFDIA, KLON, & & PCI , PLSM , PCLK, PWIND, & & PFLXSS & &) @@ -41,7 +41,7 @@ SUBROUTINE AER_SSALT_MS & USE PARKIND1 ,ONLY : JPIM ,JPRB USE YOMHOOK ,ONLY : LHOOK, DR_HOOK, JPHOOK -USE YOEAERATM ,ONLY : YREAERATM +USE YOEAERATM ,ONLY : TEAERATM!YREAERATM !USE YOEAERSRC ,ONLY : RSSFLX IMPLICIT NONE @@ -51,6 +51,7 @@ SUBROUTINE AER_SSALT_MS & !* 0.1 ARGUMENTS ! --------- +TYPE(TEAERATM) ,INTENT(IN) :: YDEAERATM INTEGER(KIND=JPIM),INTENT(IN) :: KLON INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA INTEGER(KIND=JPIM),INTENT(IN) :: KFDIA @@ -123,7 +124,7 @@ SUBROUTINE AER_SSALT_MS & REAL(KIND=JPHOOK) :: ZHOOK_HANDLE !----------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('AER_SSALT_MS',0,ZHOOK_HANDLE) -ASSOCIATE(RSS_RH80_MASSFAC=>YREAERATM%RSS_RH80_MASSFAC) +ASSOCIATE(RSS_RH80_MASSFAC=>YDEAERATM%RSS_RH80_MASSFAC) IF (.NOT. LLENTERED) THEN ZDMASS1(0:79) = ZMASS1FLUX(1:80)-ZMASS1FLUX(0:79) diff --git a/ifs-source/arpifs/phys_ec/aerini_layer.F90 b/ifs-source/arpifs/phys_ec/aerini_layer.F90 index 260a65fa..b0cf5462 100644 --- a/ifs-source/arpifs/phys_ec/aerini_layer.F90 +++ b/ifs-source/arpifs/phys_ec/aerini_layer.F90 @@ -117,6 +117,8 @@ SUBROUTINE AERINI_LAYER(YDGEOMETRY,YDSURF,& #include "aer_wind.intfb.h" #include "aer_phy2.intfb.h" +#include "tm5m7_phy2.intfb.h" +#include "simple_sulfur_src.intfb.h" #include "abor1.intfb.h" @@ -135,6 +137,7 @@ SUBROUTINE AERINI_LAYER(YDGEOMETRY,YDSURF,& & NSTART=>YDRIP%NSTART, & & LAERNITRATE => YDCOMPO%LAERNITRATE, & & YCHEM=>YGFL%YCHEM, & + & LAERCHEM=>YGFL%LAERCHEM, & & AERO_SCHEME=>YDCOMPO%AERO_SCHEME, & & YSD_VD=>YDSURF%YSD_VD, YSD_VF=>YDSURF%YSD_VF, YSP_RR=>YDSURF%YSP_RR, & & YSP_SB=>YDSURF%YSP_SB, YSP_SG=>YDSURF%YSP_SG, TSPHY=>YDPHY2%TSPHY) @@ -162,11 +165,64 @@ SUBROUTINE AERINI_LAYER(YDGEOMETRY,YDSURF,& ZSNM = SUM(PSURF%PSP_SG(:,:,YSP_SG%YF%MP9),DIM=2) ! pre-compute total snow mass + +IF(.not. LAERCHEM)THEN + call simple_sulfur_src(YDGEOMETRY, KDIM%KIDIA, KDIM%KFDIA, KDIM%KLON , KDIM%KTDIA, KDIM%KLEV,& + & KDIM%KSTGLO, GEMSL%ITRAC, GEMSL%IAERO, & + & PAUX%PAPHI, & + & PSURF%PSD_VF(:,YSD_VF%YSO2L%MP), PSURF%PSD_VF(:,YSD_VF%YSO2H%MP), & + & PSURF%PSD_VF(:,YSD_VF%YSOGF%MP),& + & PSURF%PSD_VF(:,YSD_VF%YSOA%MP) ,& + & PSURF%PSD_VF(:,YSD_VF%YSOACO%MP),PSURF%PSD_VF(:,YSD_VF%YVOLC%MP), PSURF%PSD_VF(:,YSD_VF%YVOLE%MP),PSURF%PSD_VF(:,YSD_VF%YDMSO%MP),& + & PSURF%PSD_VF(:,YSD_VF%YCI%MP) , PSURF%PSD_VF(:,YSD_VF%YINJF%MP) , PSURF%PSD_VD(:,YSD_VD%YBLH%MP) ,& + & PAUX%PRS1, PAUX%PRSF1,PAUX%PGELAM, PAUX%PGELAT,& + & PSURF%PSD_VF(:,YSD_VF%YLSM%MP) , PSURF%PSP_RR(:,YSP_RR%YT%MP9) , TSPHY,& + & GEMSL%ZAERWS,& + & GEMSL%ZDMSO, GEMSL%ZLDAY, GEMSL%ZLISS, GEMSL%ZSO2, GEMSL%ZTDMS,& + & GEMSL%ZODMS, PSO4SRC,PSO2SRC) +ELSE + ! Set to zero + PSO4SRC(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV)=0.0_JPRB + PSO2SRC(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV)=0.0_JPRB +END IF + SELECT CASE (TRIM(AERO_SCHEME)) CASE ("glomap") CALL ABOR1("OIFS - glomap should never be called from OIFS, EXIT") + ! HAM-M7 only implements the micro-physics part + ! all other processes are still handled by the TM5-M7 code + CASE ("tm5m7", "hamm7") + + CALL TM5M7_PHY2 & + &( YDGEOMETRY, YDMODEL, KDIM%KIDIA, KDIM%KFDIA, KDIM%KLON , KDIM%KTDIA, KDIM%KLEV, KDIM%KFLDX , KDIM%KLEVX,& + & KDIM%KTILES, KDIM%KSTGLO, GEMSL%ITRAC, GEMSL%IAERO, NSW,& + & PAUX%PRS1 , PAUX%PRSF1, PAUX%PAPHI, STATE%T , PAUX%PVERVEL, GEMSL%ZCEN , PAUX%PGEOMH,& + & PSURF%PSD_VD(:,YSD_VD%YALB%MP), SURFL%ZALBD, PSURF%PSD_VF(:,YSD_VF%YALUVD%MP),& + & PSURF%PSD_VF(:,YSD_VF%YAERDEP%MP),PSURF%PSD_VF(:,YSD_VF%YAERLTS%MP),PSURF%PSD_VF(:,YSD_VF%YAERSCC%MP),& + & GEMSL%ZAERWS, GEMSL%ZAERGUST, GEMSL%ZAERUST,& + & PSURF%PSD_VF(:,YSD_VF%YBCBF%MP), PSURF%PSD_VF(:,YSD_VF%YBCFF%MP), PSURF%PSD_VF(:,YSD_VF%YBCGF%MP),& + & PSURF%PSD_VF(:,YSD_VF%YOMBF%MP), PSURF%PSD_VF(:,YSD_VF%YOMFF%MP), PSURF%PSD_VF(:,YSD_VF%YOMGF%MP),& + & PSURF%PSD_VF(:,YSD_VF%YSO2L%MP), PSURF%PSD_VF(:,YSD_VF%YSO2H%MP), PSURF%PSD_VF(:,YSD_VF%YSO2DD%MP),& + & PSURF%PSD_VF(:,YSD_VF%YSOGF%MP),& + & PSURF%PSD_VF(:,YSD_VF%YVOLC%MP), PSURF%PSD_VF(:,YSD_VF%YVOLE%MP), PSURF%PSD_VF(:,YSD_VF%YSOA%MP) ,& + & PSURF%PSD_VF(:,YSD_VF%YSOACO%MP),PSURF%PSD_VF(:,YSD_VF%YDMSO%MP), PSURF%PSD_VF(:,YSD_VF%YSOILTYPE%MP), & + !TB added lake cover: YCLK + & PSURF%PSD_VF(:,YSD_VF%YCI%MP), PSURF%PSD_VF(:,YSD_VF%YCLK%MP) , PSURF%PSD_VF(:,YSD_VF%YINJF%MP) , PSURF%PSD_VD(:,YSD_VD%YBLH%MP) ,& + & SURFL%ZFRTI, PSURF%PSD_VF(:,YSD_VF%YLSM%MP) , PSURF%PSD_VF(:,YSD_VF%YSST%MP), STATE%Q, & + & PSURF%PSP_SG(:,YSP_SG%YF%MP9) , PSURF%PSP_RR(:,YSP_RR%YT%MP9) , PAUX%PGELAM, PAUX%PGELAT, PAUX%PGEMU, SURFL%ZHSDFOR,& + & STATE%U(:,KDIM%KLEV) , STATE%V(:,KDIM%KLEV) , PSURF%PSP_SB(:,1,YSP_SB%YQ%MP9), TSPHY, GEMSL%ZAZ0M,& + & GEMSL%ICHEM,& + !VH - Introduce Land use info... + & PSURF%PCVL, PSURF%PCVH,PSURF%ITVL,PSURF%ITVH, & + & PSURF%PAHFSTI,FLUX%PFTLHEV, & + !VH - end + & GEMSL%ZCFLX, GEMSL%ZTENC,& + & GEMSL%ZDMSO, GEMSL%ZLDAY, GEMSL%ZLISS, GEMSL%ZSO2, GEMSL%ZTDMS,& + & GEMSL%ZAERDDP, GEMSL%ZAERSDM, GEMSL%ZAERSRC, GEMSL%ZAERMAP, GEMSL%ZAERFLX, GEMSL%ZAERLIF,& + & GEMSL%ZDMSI, GEMSL%ZODMS, PSURF%PSD_XA, & + &PSO4SRC,PSO2SRC) CASE ("aer") diff --git a/ifs-source/arpifs/phys_ec/aero_init.F90 b/ifs-source/arpifs/phys_ec/aero_init.F90 index 430cbe4a..84a29ca6 100644 --- a/ifs-source/arpifs/phys_ec/aero_init.F90 +++ b/ifs-source/arpifs/phys_ec/aero_init.F90 @@ -86,6 +86,19 @@ SUBROUTINE AERO_INIT(YGFL,YDCOMPO,YDEAERATM,KDIM,GEMSL) GEMSL%ZAERASYLEV(:,:,:)=0._JPRB GEMSL%ZAERLISI(:,:,:,:)=0._JPRB + +!M7 aerosols +ALLOCATE( GEMSL%ZAEROTAU(KDIM%KLON,KDIM%KLEV,14) ) +ALLOCATE( GEMSL%ZAEROSSA(KDIM%KLON,KDIM%KLEV,14) ) +ALLOCATE( GEMSL%ZAEROASY(KDIM%KLON,KDIM%KLEV,14) ) +ALLOCATE( GEMSL%ZAEROTAULW(KDIM%KLON,KDIM%KLEV,16) ) +GEMSL%ZAEROTAU(:,:,:)=0._JPRB +GEMSL%ZAEROSSA(:,:,:)=0._JPRB +GEMSL%ZAEROASY(:,:,:)=0._JPRB +GEMSL%ZAEROTAULW(:,:,:)=0._JPRB + + + IF (TRIM(YDCOMPO%AERO_SCHEME)=='glomap') THEN ! Extra diags for GLOMAP: dry and wet diameter/volume + effective radius ALLOCATE( GEMSL%ZDRYDIAM(KDIM%KLON,KDIM%KLEV,NMODES) ) diff --git a/ifs-source/arpifs/phys_ec/callpar.F90 b/ifs-source/arpifs/phys_ec/callpar.F90 index bc157df2..bc4d4372 100644 --- a/ifs-source/arpifs/phys_ec/callpar.F90 +++ b/ifs-source/arpifs/phys_ec/callpar.F90 @@ -1114,7 +1114,15 @@ SUBROUTINE CALLPAR(YDGEOMETRY,YDVARS,YDSURF,YDMODEL,KDIM,& ! ------------------------------------------------------ IF (NAERCLD > 0) THEN - CALL AER_CLOUD_LAYER(YDMODEL,KDIM,PAUX,STATE_T0,PDIAG,GEMSL,AUXL) + SELECT CASE (TRIM(AERO_SCHEME)) + CASE ("tm5m7", "hamm7")!!! introduce this to avoid modification within cloud_layer.F90 + AUXL%ZCCN(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV) = PGFL(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV,YGFL%YCDNC%MP9_PH)!!! liquid cloud condensation nuclei + AUXL%ZNICE(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV) = PGFL(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV,YGFL%YICNC%MP9_PH)!!! ice number concentration (cf. CCN) + CASE ("aer3") + CALL AER_CLOUD_LAYER(YDMODEL,KDIM,PAUX,STATE_T0,PDIAG,GEMSL,AUXL) + CASE DEFAULT + CALL ABOR1(" NO AEROSOL SCHEME "//TRIM(AERO_SCHEME) ) + END SELECT ELSE ! routine is by-passed AUXL%ZLCRIT_AER(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV)=0.0_JPRB diff --git a/ifs-source/arpifs/phys_ec/hamm7_init.F90 b/ifs-source/arpifs/phys_ec/hamm7_init.F90 new file mode 100644 index 00000000..1b9fbcb1 --- /dev/null +++ b/ifs-source/arpifs/phys_ec/hamm7_init.F90 @@ -0,0 +1,485 @@ +SUBROUTINE hamm7_init(YGFL) + +!** DESCRIPTION +! ---------- +! +! init routine HAM-M7 aerosol in OpenIFS +! +! +! +!** INTERFACE. +! ---------- +! *hamm7_init* is called from *CNT4*. +! REMARK: the code assumes that TM5M7_INIT has already been called! + +! Externals. +! --------- + +! +! AUTHOR. +! ------- +! Thomas Kühn (thk), FMI + +! MODIFICATIONS. +! -------------- +! ORIGINAL : 2020-11-11 + +!---------------------------------------------------------------------- +!* 0.0 USE STATEMENTS +! --------------- + +USE PARKIND1 , ONLY : & + JPRB + +!!!!TEMPORARY +Use YOMMP0,only: & + MYPROC +!!!!TEMPORARY + +USE YOMHOOK , ONLY : & + LHOOK, DR_HOOK + +!USE YOM_YGFL , ONLY : & +! YGFL +USE YOM_YGFL , ONLY : TYPE_GFLD!YGFL + +! --> thk: bug fix +USE MO_TIME_CONTROL, ONLY: & + init_mo_time_control +! <-- thk + +USE MO_SPECIES, ONLY: & + speclist ! tracer species in HAM + +USE MO_HAM, ONLY: & + sizeclass, & ! aerosol classes in HAM + nclass, & ! number of aerosol classes in HAM + aerocomp, & ! aerosol compounds by size class in HAM + naerocomp, & ! amount of aerosol mass tracers in HAM + subm_gasspec, & ! gas phase species in HAM + subm_ngasspec ! number of gas phase species in HAM + +USE OIFS_to_HAM, ONLY: init_ind_oifs_ham, & ! init index list for OIFS and HAM + ind_oifs_ham! index list type + !ind_class_OIFS, & ! index list for aerosol sizeclasses from OIFS + !ind_class_HAM, & ! index list for aerosol sizeclasses from HAM + !ind_mass_OIFS, & ! index list for aerosol masses from OIFS + !ind_mass_HAM, & ! index list for aerosol masses from HAM + !ind_gas_OIFS, & ! index list for gases from OIFS + !ind_gas_HAM, & ! index list for gases from HAM + !ind_cloud_OIFS, & ! index list for cloud variables from OIFS + !ind_cloud_HAM ! index list for cloud variables from HAM + +USE MO_TRACDEF, ONLY: & + GAS, AEROSOL, & ! species type identifiers + GAS_OR_AEROSOL, ntrac, trlist + +USE MO_HAM_M7_TRAC, ONLY: & + idt_cdnc_ham, & !index for HAM CDNC + idt_icnc_ham !index for HAM ICNC + +USE MO_HAM_INIT, ONLY: & + start_ham, & + ham_initialize, & + ham_define_tracer !eehol: added ham_define_tracer + +USE MO_ADVECTION, ONLY: & !eehol: added for advection initialization + iadvec, tpcore + +USE MO_SUBMODEL, & + ONLY: & !eehol: added mo_submodel routines + setsubmodel, lham, id_ham, starttracdef, endtracdef + +USE MO_SPECIES, & + ONLY: speclist, init_splist !eehol: added initialization for species list + +USE MO_HAM_SOA, & + ONLY: soaprop + +!eehol: activation initialization +USE MO_ACTIV, & + ONLY: activ_initialize, idt_cdnc, idt_icnc + +USE MO_PARAM_SWITCHES, & + ONLY: ncd_activ, nactivpdf + + +IMPLICIT NONE +TYPE(TYPE_GFLD) ,INTENT(IN) :: YGFL + +!---------------------------------------------------------------------- +!* 0.5 LOCAL VARIABLES +! --------------- +INTEGER :: & ! looping indices + j_yaero, j_ychem, & ! IFS + j_class, j_mass, j_spec, j_gas, j_cloud, & ! HAM + kt, znclass, znaerocomp, zsubm_ngasspec, zcloudind ! eehol: indices for OIFS to HAM + +REAL(KIND=JPRB) :: & + ZHOOK_HANDLE ! return status + +CHARACTER(len=64) :: int_str, int_str_ham !eehol: integer as string + +!---------------------------------------------------------------------- +!* 1.0 EXECUTABLE CODE +! --------------- +!ASSOCIATE(NACTAERO=>YGFL%NACTAERO, LAERCHEM=>YGFL%LAERCHEM) + +IF (LHOOK) CALL DR_HOOK('HAMM7_INIT',0,ZHOOK_HANDLE) + +! getting the correct time step: +CALL init_mo_time_control + +!eehol: set advection scheme +iadvec = tpcore !comes from ECHAM mo_control.f90 + +!eehol: set submodel parameters and flags +CALL setsubmodel +! start_ham calls: +! sethamm7, +! m7_initialize, +! ham_species, +! map_m7_species, +! ham_define_modes +CALL init_splist !eehol: added init for splist + +CALL start_ham + +!eehol: define tracer numbers, idt, etc. with ham_define_tracer +IF (lham) THEN + CALL starttracdef(id_ham) + CALL ham_define_tracer + CALL endtracdef(id_ham) +END IF + +! ham_initialize calls: +! start_kappa, if nwater == 1 +!eehol: added testing for lham +!calls also: +! ham_m7_set_idt +IF (lham) THEN + CALL ham_initialize +END IF +! ham_init_memory calls: +! ham_nucl_initialize, if nsnucl+nonucl > 0 +!CALL ham_init_memory !eehol: this is not needed now + +!eehol: activation initialization +nactivpdf = 1 !eehol: using PDF to calculate updraft. Hardcoded for now.. need to check this later (add setphys to oifs?) +ncd_activ = 2 !eehol: Abdul-Razzak and Ghan activation scheme. Hardcoded for now.. need to check this later (add setphys to oifs?) +CALL activ_initialize + +!eehol: set cdnc and icnc indices for HAM +idt_cdnc = idt_cdnc_ham +idt_icnc = idt_icnc_ham + +!<--eehol: initialize index lists for OIFS and HAM +znclass = nclass +znaerocomp = naerocomp +zsubm_ngasspec = subm_ngasspec +zcloudind = 2 !eehol CDNC and ICNC + +CALL init_ind_oifs_ham(znclass,znaerocomp,zsubm_ngasspec,zcloudind) +!-->eehol + +! assigning tracer indices as found in YGFL to the +! corresponding metadata fields in HAM +ASSOCIATE(& + NAERO=>YGFL%NAERO, YAERO=>YGFL%YAERO, & ! aerosol tracer meta-data + NCHEM=>YGFL%NCHEM, YCHEM=>YGFL%YCHEM, LAERCHEM=>YGFL%LAERCHEM & ! chemistry tracer meta-data +) + +! The following code tries to identify the dynamically generated tracers +! in OpenIFS to the independently generated metadata generated in HAM. +! The point of this procedure is to be able to directly access the +! tracer data stored in PCEN and PTENC in the HAM routines without +! having to copy the data into new fields. +! The naming conventions in IFS and HAM are somewhat different, so +! tracher naming is somewhat hard-coded. As a first instance to troubleshooting, +! check the logfile 'fort.2001' in the run directory and see which tracers +! are not recognised by HAM. Then check the file +! AC-experiments/ctrl/Table/bins_hamm7ver1.csv and compare the names you get +! in the files. + +! aerosol tracers +LABEL_IFS_AERO: DO j_yaero = 1,NAERO + + ! looping over the number tracers in HAM + LABEL_CLASS: DO j_class = 1,nclass + + ! sizeclass names in HAM-M7 are two-letter (xy) combinations: + ! x: N,K,A,C = nucleation, Aitken, accumulation, and coarse, respectively, while + ! y: S,I = soluble, insoluble, respectively. + ! In the IFS-csv table, these combinations are prefixed with '_N' + IF (TRIM(YAERO(j_yaero)%CNAME) == TRIM(sizeclass(j_class)%shortname)//'_N') THEN + + ! In case of a match, we set the tracer index in the HAM meta data to the + ! according IFS-index and write a note into the logfile + !sizeclass(j_class)%idt_no = j_yaero + + kt = sizeclass(j_class)%idt_no + ind_oifs_ham%ind_class_OIFS(j_class) = j_yaero !eehol: take indices for sizeclass to a vector for OIFS + ind_oifs_ham%ind_class_HAM(j_class) = kt !eehol: take indices for sizeclass to a vector for HAM + IF (MYPROC == 1) THEN + WRITE(int_str,*) j_yaero + WRITE(int_str_ham,*) kt !sizeclass(j_class)%idt_no + WRITE(2000+MYPROC,'(a)') 'sizeclass: '//TRIM(YAERO(j_yaero)%CNAME) + WRITE(3000+MYPROC,'(a)') 'OIFS size: '//TRIM(YAERO(j_yaero)%CNAME) + WRITE(3000+MYPROC,'(a)') 'j_yaero ='//TRIM(int_str) + WRITE(3000+MYPROC,'(a)') 'HAM size: '//TRIM(trlist%ti(sizeclass(j_class)%idt_no)%fullname) + WRITE(3000+MYPROC,'(a)') 'sizeclass idt_no ='//TRIM(int_str_ham) + END IF + + ! once the tracer is identified, we can check the next one + CYCLE LABEL_IFS_AERO + END IF + END DO LABEL_CLASS + + ! looping over the aerosol compound tracers in HAM + LABEL_MASS: DO j_mass = 1,naerocomp + ! aerosol compound names in HAM-M7 are combinations of the chemical species + ! and the sizeclass. The format is zzz_xy, where x and y are as in the sizeclass + ! and zzz is a 2- or 3-letter abbreviation + ! standard names are OC, BC, SO4, DU, and SS for organic carbon, black carbon + ! sulfate, mineral dust and seasalt, respectively. Other species may be + ! included as well, depending on the HAM setup. + j_class = aerocomp(j_mass)%iclass ! index to size class + j_spec = aerocomp(j_mass)%spid ! index to species + + IF (TRIM(YAERO(j_yaero)%CNAME) == (TRIM(speclist(j_spec)%shortname)//'_'//TRIM(sizeclass(j_class)%shortname))) THEN + + ! In case of a match, we set the tracer index in the HAM meta data to the + ! according IFS-index and write a note into the logfile + !aerocomp(j_mass)%idt = j_yaero + !ind_mass_OIFS(j_mass) = j_yaero !eehol: take indices for masses to a vector + !ind_mass_HAM(j_mass) = aerocomp(j_mass)%idt !eehol: take indices for masses to a vector + kt = aerocomp(j_mass)%idt + ind_oifs_ham%ind_mass_OIFS(j_mass) = j_yaero !eehol: take indices for masses to a vector for OIFS + ind_oifs_ham%ind_mass_HAM(j_mass) = kt !eehol: take indices for masses to a vector for HAM + IF (MYPROC == 1) THEN + WRITE(int_str,*) j_yaero + WRITE(int_str_ham,*) kt + WRITE(2000+MYPROC,'(a)') 'mass: '//TRIM(YAERO(j_yaero)%CNAME) + WRITE(6000+MYPROC,'(a)') 'OIFS mass: '//TRIM(YAERO(j_yaero)%CNAME) + WRITE(6000+MYPROC,'(a)') 'j_yaero ='//TRIM(int_str) + WRITE(6000+MYPROC,'(a)') 'HAM mass: '//TRIM(trlist%ti(aerocomp(j_mass)%idt)%fullname) + WRITE(6000+MYPROC,'(a)') 'mass idt_no ='//TRIM(int_str_ham) + END IF + + ! once the tracer is identified we can check the next one + CYCLE LABEL_IFS_AERO + ELSE IF ( (TRIM(YAERO(j_yaero)%CNAME) == 'POM_'//TRIM(sizeclass(j_class)%shortname)) .AND. (TRIM(speclist(j_spec)%shortname) == 'OC') ) THEN + + ! In case of a match, we set the tracer index in the HAM meta data to the + ! according IFS-index and write a note into the logfile + !aerocomp(j_mass)%idt = j_yaero + + kt = aerocomp(j_mass)%idt + ind_oifs_ham%ind_mass_OIFS(j_mass) = j_yaero !eehol: take indices for masses to a vector for OIFS + ind_oifs_ham%ind_mass_HAM(j_mass) = kt !eehol: take indices for masses to a vector for HAM + + IF (MYPROC == 1) THEN + WRITE(int_str,*) j_yaero + WRITE(int_str_ham,*) kt + WRITE(2000+MYPROC,'(a)') 'mass: '//TRIM(YAERO(j_yaero)%CNAME) + WRITE(6000+MYPROC,'(a)') 'OIFS mass: '//TRIM(YAERO(j_yaero)%CNAME) + WRITE(6000+MYPROC,'(a)') 'j_yaero ='//TRIM(int_str) + WRITE(6000+MYPROC,'(a)') 'HAM mass: '//TRIM(trlist%ti(aerocomp(j_mass)%idt)%fullname) + WRITE(6000+MYPROC,'(a)') 'mass idt_no ='//TRIM(int_str_ham) + END IF + + ! once the tracer is identified we can check the next one + CYCLE LABEL_IFS_AERO + END IF + + END DO LABEL_MASS + + !eehol: looping over cloud compounds + LABEL_CLOUD: DO j_cloud = idt_cdnc,idt_icnc !eehol: only CDNC and ICNC + + IF (TRIM(YAERO(j_yaero)%CNAME) == TRIM(trlist%ti(j_cloud)%fullname)) THEN + + ! In case of a match, we set the tracer index in the HAM meta data to the + ! according IFS-index and write a note into the logfile + !sizeclass(j_class)%idt_no = j_yaero + kt = j_cloud + ind_oifs_ham%ind_cloud_OIFS(j_cloud-idt_cdnc+1) = j_yaero !eehol: take indices for sizeclass to a vector for OIFS + ind_oifs_ham%ind_cloud_HAM(j_cloud-idt_cdnc+1) = kt !eehol: take indices for sizeclass to a vector for HAM + IF (MYPROC == 1) THEN + WRITE(int_str,*) j_yaero + WRITE(int_str_ham,*) kt !sizeclass(j_class)%idt_no + WRITE(2000+MYPROC,'(a)') 'cloud class: '//TRIM(YAERO(j_yaero)%CNAME) + WRITE(3000+MYPROC,'(a)') 'OIFS size: '//TRIM(YAERO(j_yaero)%CNAME) + WRITE(3000+MYPROC,'(a)') 'j_yaero ='//TRIM(int_str) + WRITE(3000+MYPROC,'(a)') 'HAM size: '//TRIM(trlist%ti(kt)%fullname) + WRITE(3000+MYPROC,'(a)') 'sizeclass idt_no ='//TRIM(int_str_ham) + END IF + + ! once the tracer is identified, we can check the next one + CYCLE LABEL_IFS_AERO + END IF + + END DO LABEL_CLOUD + + ! If we end up here, the tracer is not a sizeclass or mass + IF (MYPROC == 1) THEN + WRITE(2000+MYPROC,'(a)') 'neither mass nor sizeclass in HAM: '//TRIM(YAERO(j_yaero)%CNAME) + END IF + +END DO LABEL_IFS_AERO + +! chemistry tracers +! chemistry tracers in HAM do not have separate metadata, because there is only one +! tracer per species. Therefore we have to check the HAM species metadata and +! make sure that the metadata actually describes a gas. +IF (LAERCHEM)THEN + LABEL_IFS_CHEM: DO j_ychem = 1,NCHEM + + ! looping over the gas phase tracers in HAM + LABEL_GAS: DO j_gas = 1,subm_ngasspec + j_spec = subm_gasspec(j_gas) + + ! If the species does not exist in gas form in HAM, we don't consider it further + IF ((speclist(j_spec)%nphase == GAS) .OR. (speclist(j_spec)%nphase == GAS_OR_AEROSOL)) THEN + IF (TRIM(YCHEM(j_ychem)%CNAME) == TRIM(speclist(j_spec)%shortname)) THEN + ! In case of a match, we set the tracer index in the HAM meta data to the + ! according IFS-index and write a note into the logfile + !speclist(j_spec)%idt = j_ychem + kt = speclist(j_spec)%idt + ind_oifs_ham%ind_gas_OIFS(j_gas) = j_ychem !eehol: take indices for gases to a vector for OIFS + ind_oifs_ham%ind_gas_HAM(j_gas) = kt !eehol: take indices for gases to a vector for HAM + + ! turn wetdep off for gases if LAERCHEM=.true. + trlist%ti(kt)%nwetdep=0 + IF (MYPROC == 1) THEN + WRITE(int_str,*) j_ychem + WRITE(int_str_ham,*) kt + WRITE(2000+MYPROC,'(a)') 'gas: '//TRIM(YCHEM(j_ychem)%CNAME) + WRITE(7000+MYPROC,'(a)') 'OIFS gas: '//TRIM(YCHEM(j_ychem)%CNAME) + WRITE(7000+MYPROC,'(a)') 'j_ychem ='//TRIM(int_str) + WRITE(7000+MYPROC,'(a)') 'HAM gas: '//TRIM(trlist%ti(speclist(j_spec)%idt)%fullname) + WRITE(7000+MYPROC,'(a)') 'gas idt_no ='//TRIM(int_str_ham) + WRITE(7000+MYPROC,'(a)') 'wetdep',trlist%ti(kt) + END IF + + ! once the tracer is identified we can check the next one + CYCLE LABEL_IFS_CHEM + + END IF + ! sulfuric acid is special, because in HAM it is tagges as H2SO4, while in IFS it + ! is called SO4 -- hard-coding for now + IF ( (TRIM(YCHEM(j_ychem)%CNAME) == 'SO4') .AND. (TRIM(speclist(j_spec)%shortname) == 'H2SO4') ) THEN + ! In case of a match, we set the tracer index in the HAM meta data to the + ! according IFS-index and write a note into the logfile + kt = speclist(j_spec)%idt + ind_oifs_ham%ind_gas_OIFS(j_gas) = j_ychem !eehol: take indices for gases to a vector for OIFS + ind_oifs_ham%ind_gas_HAM(j_gas) = kt !eehol: take indices for gases to a vector for HAM + ! turn wetdep off for SO4 if LAERCHEM=.true. + trlist%ti(kt)%nwetdep=0 + + IF (MYPROC == 1) THEN + WRITE(int_str,*) j_ychem + WRITE(int_str_ham,*) kt + WRITE(2000+MYPROC,'(a)') 'gas: '//TRIM(YCHEM(j_ychem)%CNAME) + WRITE(7000+MYPROC,'(a)') 'OIFS gas: '//TRIM(YCHEM(j_ychem)%CNAME) + WRITE(7000+MYPROC,'(a)') 'j_ychem ='//TRIM(int_str) + WRITE(7000+MYPROC,'(a)') 'HAM gas: '//TRIM(trlist%ti(speclist(j_spec)%idt)%fullname) + WRITE(7000+MYPROC,'(a)') 'gas idt_no ='//TRIM(int_str_ham) + WRITE(7000+MYPROC,'(a)') 'wetdep',trlist%ti(kt)%nwetdep + END IF + + ! once the tracer is identified we can check the next one + CYCLE LABEL_IFS_CHEM + END IF + END IF + END DO LABEL_GAS + + ! If we end up here, the tracer is not a sizeclass or mass + IF (MYPROC == 1) THEN + WRITE(2000+MYPROC,'(a)') 'not a gas in HAM: '//TRIM(YCHEM(j_ychem)%CNAME) + END IF + END DO LABEL_IFS_CHEM +ELSE + Write(9191,*)'simple SO4 in development' + + LABEL_IFS_CHEM_SO4: DO j_ychem = 1,NAERO + + ! looping over the gas phase tracers in HAM + LABEL_GAS_SO4: DO j_gas = 1,subm_ngasspec + j_spec = subm_gasspec(j_gas) + ! If the species does not exist in gas form in HAM, we don't consider it further + IF ((speclist(j_spec)%nphase == GAS) .OR. (speclist(j_spec)%nphase == GAS_OR_AEROSOL)) THEN + IF(MYPROC==1)THEN + write(4001,*)TRIM(YAERO(j_ychem)%CNAME),TRIM(speclist(j_spec)%shortname) + END IF + IF (TRIM(YAERO(j_ychem)%CNAME) == TRIM(speclist(j_spec)%shortname)) THEN + ! In case of a match, we set the tracer index in the HAM meta data to the + ! according IFS-index and write a note into the logfile + !speclist(j_spec)%idt = j_ychem + kt = speclist(j_spec)%idt + ind_oifs_ham%ind_gas_OIFS(j_gas) = j_ychem !eehol: take indices for gases to a vector for OIFS + ind_oifs_ham%ind_gas_HAM(j_gas) = kt !eehol: take indices for gases to a vector for HAM + ! turn wetdep on for gases if LAERCHEM=.false. + trlist%ti(kt)%nwetdep=1 + IF (MYPROC == 1) THEN + WRITE(int_str,*) j_ychem + WRITE(int_str_ham,*) kt + WRITE(2000+MYPROC,'(a)') 'gas: '//TRIM(YCHEM(j_ychem)%CNAME) + WRITE(7000+MYPROC,'(a)') 'OIFS gas: '//TRIM(YCHEM(j_ychem)%CNAME) + WRITE(7000+MYPROC,'(a)') 'j_ychem ='//TRIM(int_str) + WRITE(7000+MYPROC,'(a)') 'HAM gas: '//TRIM(trlist%ti(speclist(j_spec)%idt)%fullname) + WRITE(7000+MYPROC,'(a)') 'gas idt_no ='//TRIM(int_str_ham) + END IF + ! once the tracer is identified we can check the next one + CYCLE LABEL_IFS_CHEM_SO4 + END IF + + ! sulfuric acid is special, because in HAM it is tagges as H2SO4, while in IFS it + ! is called SO4 -- hard-coding for now + IF ( (TRIM(YAERO(j_ychem)%CNAME) == 'SO4_gas') .AND. (TRIM(speclist(j_spec)%shortname) == 'H2SO4') ) THEN + ! In case of a match, we set the tracer index in the HAM meta data to the + ! according IFS-index and write a note into the logfile + kt = speclist(j_spec)%idt + ind_oifs_ham%ind_gas_OIFS(j_gas) = j_ychem !eehol: take indices for gases to a vector for OIFS + ind_oifs_ham%ind_gas_HAM(j_gas) = kt !eehol: take indices for gases to a vector for HAM + ! turn wetdep on for gases if LAERCHEM=.false. + trlist%ti(kt)%nwetdep=1 + IF (MYPROC == 1) THEN + WRITE(int_str,*) j_ychem + WRITE(int_str_ham,*) kt + WRITE(2000+MYPROC,'(a)') 'gas: '//TRIM(YCHEM(j_ychem)%CNAME) + WRITE(7000+MYPROC,'(a)') 'OIFS gas: '//TRIM(YCHEM(j_ychem)%CNAME) + WRITE(7000+MYPROC,'(a)') 'j_ychem ='//TRIM(int_str) + WRITE(7000+MYPROC,'(a)') 'HAM gas: '//TRIM(trlist%ti(speclist(j_spec)%idt)%fullname) + WRITE(7000+MYPROC,'(a)') 'gas idt_no ='//TRIM(int_str_ham) + END IF + + ! once the tracer is identified we can check the next one + CYCLE LABEL_IFS_CHEM_SO4 + END IF + END IF + END DO LABEL_GAS_SO4 + END DO LABEL_IFS_CHEM_SO4 + + ! If we end up here, the tracer is not a sizeclass or mass + IF (MYPROC == 1) THEN + WRITE(2000+MYPROC,'(a)') 'not a gas in HAM: '//TRIM(YCHEM(j_ychem)%CNAME) + END IF +END IF + +IF (MYPROC == 1) THEN + WRITE(5001+MYPROC,*) 'HAM class idts =', ind_oifs_ham%ind_class_HAM(:) + WRITE(5001+MYPROC,*) 'OIFS class idts =', ind_oifs_ham%ind_class_OIFS(:) + WRITE(5001+MYPROC,*) 'HAM mass idts =', ind_oifs_ham%ind_mass_HAM(:) + WRITE(5001+MYPROC,*) 'OIFS mass idts =', ind_oifs_ham%ind_mass_OIFS(:) + WRITE(5001+MYPROC,*) 'HAM gas idts =', ind_oifs_ham%ind_gas_HAM(:) + WRITE(5001+MYPROC,*) 'OIFS gas idts =', ind_oifs_ham%ind_gas_OIFS(:) + WRITE(5001+MYPROC,*) 'HAM cloud idts =', ind_oifs_ham%ind_cloud_HAM(:) + WRITE(5001+MYPROC,*) 'OIFS cloud idts =', ind_oifs_ham%ind_cloud_OIFS(:) +END IF + +END ASSOCIATE + +IF (LHOOK) CALL DR_HOOK('HAMM7_INIT',1,ZHOOK_HANDLE) +!END ASSOCIATE +END SUBROUTINE hamm7_init diff --git a/ifs-source/arpifs/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/phys_ec/hamm7_interface.F90 new file mode 100755 index 00000000..8405e04a --- /dev/null +++ b/ifs-source/arpifs/phys_ec/hamm7_interface.F90 @@ -0,0 +1,1825 @@ +SUBROUTINE HAMM7_INTERFACE & + &( YDMODEL, KIDIA , KFDIA , KLON , KTDIA , KLEV , KTILES , & + & KFLDX, KLEVX, KTRAC , KAERO , KCHEM, KSTGLO, PGEOH, & + & PRS1 , PRSF1 , PAEROP , PCAERO , PCEN , PAPHIF , & + & PFPLCL , PFPLCN , PFPLSL , PFPLSN , PGELAT, PGELAM, & + & PAP , PIP , PLP , PRP , PSP , PCOVPTOT, PLU , PO3P ,PQP , PTP , PTHP , PTENC , PCFLX , & + & PAERDDP, PAERSDM, PAERSRC, PAERWS , PAERGUST , PAERUST, PAERMAP, & + & PCLAERS, PPRAERS, PCHEM2AER, & + & PALBD , PFRTI , PLSM , PSNS , PWND , PWS1 , PAERFLX, PAERLIF, & + & PAERODDF,PTSPHY , PGFL , & + & PODTO , PAERO_WVL_DIAG, & + & !PODTO469 , PODTO670 , PODTO865 , PODTO1240 , & + & PAER_TAU, PAER_SSA,PAER_ASYM,PAER_TAU_LW,& + & PTAUS_AER,PTAUA_AER,PPMAER, & + & PEXTRA, PVERVEL, PCCNL, PCCNO, PAHFSTI, PCI, PZ0M, PAHFLEV, & !eehol: added here vertical velocity, CCN over land, CCN over ocean + & PUP, PVP, PCVL, PCVH, PSO2DD, PGEMU)!, PTSO2, PTSO4, PTSO4_AQ, PFSO2,PFSO4,PFSO4_AQ& + !&) + ! u-wind, v-wind, low veg. cover, high veg. cover, sine of latitude + +!**** *TM5M7* - ROUTINE DEALING WITH THE TM5M7 AEROSOL COMPUTATIONS: +! SCAVENGING, MASS DIAGNOSTICS, AEROSOL-PERTURBED RADIANCES + +! Vincent Huijnen , KNMI +! Tommi Bergman, FMI +! Thomas Kuehn (FMI/UEF), November 2020 + +!** INTERFACE. +! ---------- +! *TM5M7* IS CALLED FROM *AER_PHY3_LAYER*. + +! INPUTS: +! ------- +! PCHEM2AER (KLON,KLEV,xx) : chemistry tendency of selected processes because of specific reactions (kg/kg s-1) +! OUTPUTS: +! -------- + +! EXTERNALS. +! ---------- +! *TM5M7_SCAV* , ... + +! MODIFICATIONS. +! ------------- +! +! V. Huijnen 20200501 Modification for TM5M7 +! T Bergman 20200925 TM5M7 work + +! SWITCHES. +! -------- + +! MODEL PARAMETERS +! ---- +! PARAMETER DESCRIPTION UNITS +! --------- ----------- ----- +! INPUT PARAMETERS (INTEGER): + +! *KIDIA* START POINT +! *KFDIA* END POINT +! *KLEV* NUMBER OF LEVELS +! *KLON* NUMBER OF GRID POINTS PER PACKET +! *KLEVS* NUMBER OF SOIL LAYERS +! *KTILES* NUMBER OF TILES (I.E. SUBGRID AREAS WITH DIFFERENT +! OF SURFACE BOUNDARY CONDITION) +! *KVTYPES* NUMBER OF biomes for land carbon +! *KTRAC* Number of tracers +! KLEVXG : number of levels to compute +! KAERO : Number of aerosol fields +! KCHEM : Number of chemistry tracers +! KFLDX - number of the last field. of what??? TB +! PRS1(KLON,0:KLEV) : HALF-LEVEL PRESSURE (Pa) +! PRSF1(KLON,KLEV) : FULL-LEVEL PRESSURE (Pa) +! PAEROP(KLON,KLEV,KAERO) : Aerosol concentrations (kg/kg) - Note that fields are only non-zero if NACTAERO > 0 +! PCAERO is the aerosol density kg cm-3 (KWHAT=0) +! PCAERO is the optical thickness ND (KWHAT=2) +! PCEN(KLON,KLEV,KCHEM) : CONCENTRATION OF TRACERS (kg/kg) TB:Chemistry +! PAPHIF : geopotential height "gz" at full levels. +! PFPLCL (KLON,KLEV+1) : CONVECTIVE PRECIPITATION AS RAIN (kg/m2s) +! PFPLCN : convective precipitation as snow. +! *PFPLSL* LARGE SCALE RAIN FLUX KG/(M2*S) +! *PFPLSN* LARGE SCALE SNOW FLUX KG/(M2*S) +! PGELAT(KLON) : LATITUDE (RADIANS) +! *PGELAM* LONGITUDE RADIANS +! PAP : (KLON,KLEV) ; CLOUD FRACTION +! PIP (KLON,KLEV) : ICWC (kg/kg) +! PLP (KLON,KLEV) : LWC (kg/kg) +! *PSP* (KLON,KLEV) : Snow water content (kg/kg) +! PRP (KLON,KLEV) : Rain water content (kg/kg) +! PCOVPTOT(KLON,KLEV) : PRECIP FRACTION 0..1 +! *PLU* LIQUID WATER CONTENT IN UPDRAFTS KG/KG +! PQP(KLON,KLEV) : FULL-LEVEL HUMIDITY (W. DYN.TEND.) (kg kg-1) +! PTP (KLON,KLEV) : TEMPERATURE (K)! +! pthp ? ZPPTHPW(KPROMA,KOPLEV) ! theta'w??? +! PTENC (KLON,KLEV,KTRAC) : TENDENCY OF CONCENTRATION OF TRACERS including chemistry(kg/kg s-1) +! PCFLX(KLON,KTRAC) : SURFACE FLUX OF TRACERS (xx m-2) +! PAERDDP(KLON,NACTAERO) : aerosol dry deposition +! PAERSDM(KLON,NACTAERO) : aerosol sedimentation +! PAERSRC(KLON,NACTAERO) : SOURCE FLUX (xx m-2) +! PAERWS : Wind speed (average of horizontal wind speed) (m/s) +! PAERGUST : Wind gust (maximum 3 second gust in the hour) (m/s) +! PAERMAP(KLON,5) : DUST MASK-RELATED QUANTITIES +! ??? PCLAERS(KLON) ! aerosol +! PPRAERS(KLON) ! radvis.f90 +! PALBD : (KPROMA,NTSW) ; DIFFUSE ALBEDO IN THE NSW SW INTERVALS +! *PFRTI* TILE FRACTIONS (0-1) +! PLSM (KLON) : land-sea mask [0-1] +! PSNS : MASS OF SNOW PER UNIT SURFACE +! PWND(KLON) : Surface wind +! PWS1 : REAL : TOP LAYER SOIL MOISTURE CONTENT +! PAERFLX(KLON,12,9) : DIAGNOSTIC DUST SOURCE FLUXES +! PAERLIF(KLON,9) : DIAGNOSTIC LIFTING THRESHOLD SPEED +! PAERODDF ! Diagnostic array with aerosol fluxes (sources and sinks) +! PTSPHY : TIMESTEP (s) +! PGFL : GFL fields +! PVERVEL : Vertical velocity [Pa s-1] +! PCCNL : CCN over land +! PCCNO : CCN over ocean +! *PAHFSTI* SURFACE SENSIBLE HEAT FLUX W/M2 +! PCI(KLON) : FRACTION OF SEA-ICE +! PZ0M : roughness length for momentum (m) +! PAHFLEV : latent heat flux (W/m2) +! PUP : u-wind (m/s) +! PVP : v-wind (m/s) +! PCVL : low vegetation cover +! PCVH : high vegetation cover +! PGEMU : sine of latitude +! PGEOH : geopotential at half levels (M2/S2) +!------------ + +!----------------------------------------------------------------------- + +USE PARKIND1 , ONLY : JPIM, JPRB +USE YOMHOOK , ONLY : LHOOK, DR_HOOK +!USE YOEAERSRC, ONLY : YREAERSRC +!USE YOEAERATM, ONLY : YREAERATM +!USE YOEAERLID, ONLY : YREAERLID +!USE YOEAERSNK ,ONLY : YREAERSNK +!USE YOM_YGFL , ONLY : YGFL +!USE YOERAD , ONLY : YRERAD +!USE YOEPHY , ONLY : YREPHY +USE YOMCST , ONLY : RD, RG, RPI, RMSO2, RMSO4, RMD, RNAVO +!USE YOMPRAD , ONLY : RADGRID ! sine of latitude from RADGRID to effective radius calculations +!USE YOECLDP , ONLY : YRECLDP ! for default ICNC and effective radius +USE YOMCT0 , ONLY : LIFSMIN, LIFSTRAJ +!USE YOMRIP , ONLY : YRRIP +USE YOESRTCOP, ONLY : RSASWA, RSASWB, RSFUA0, RSFUA1 +USE YOMCT3 , ONLY : NSTEP + +!! USE YOMLUN , ONLY : NULOUT +USE TM5M7_DATA, ONLY: mode_tracers,mode_tracers_by_mods,mode_start,mode_end_so4,naermod,nmod,nsol,iisvoc,ielvoc,iacs_n,iso4,MODAL_DATA, MODE_TRACERS, MODE_TRACERS_BY_MODS, & + MODE_START, MODE_END_SO4, NAERMOD, NMOD, NSOL, IISVOC, IELVOC, IACS_N, ISO4, ISO4ACS,ISO4COS +USE YOMCHEM , ONLY : YRCHEM,IEXTR_WD, IEXTR_CH, IEXTR_NG, IEXTR_DD, IEXTR_CHTR +!USE YOMCOMPO , ONLY : YRCOMPO +! implementation of HAM-M7 +USE MO_HAM, ONLY: nclass, naerocomp, sizeclass, nccndiag, subm_ngasspec +USE OIFS_TO_HAM, ONLY: ind_oifs_ham +USE MO_HAM_SUBM, ONLY: HAM_SUBM_INTERFACE !eehol: replaced HAM-M7 call with submodel interface +USE MO_ACTIV, ONLY: activ_updraft,nw,idt_cdnc,idt_icnc !eehol: HAM-M7 activation updraft calculation, effective radii +USE MO_HAM_ACTIV, ONLY: ham_activ_abdulrazzak_ghan, ham_activ_koehler_ab !eehol: HAM-M7 activation +USE MO_PARAM_SWITCHES, ONLY: ncd_activ !eehol: for activation +USE MO_TRACDEF, ONLY: ntrac, trlist !eehol: number of tracer for mass/number mixing ratio conversion, trlist for wet deposition flags +USE MO_TRACER_PROCESSES, ONLY: xt_borrow !eehol: conserving the negative tracer values from tendency +USE MO_SUBMODEL, ONLY: lwetdep,lsedimentation !eehol: logical for wetdeposition, sedimentation +USE MO_SPECIES, ONLY: speclist !SO2 wetdep for simple sulfur scheme +USE mo_ham_species, ONLY: id_so2 !SO2 wetdep for simple sulfur scheme + +USE MO_TIME_CONTROL, ONLY: time_step_len ! time step length for tendency +USE MO_HAMMOZ_WETDEP, ONLY: wetdep_interface ! wet deposition interface call +USE MO_HAM_WETDEP, ONLY: ham_conv_lfraq_so2 +USE MO_HAMMOZ_SEDIMENTATION, ONLY: sedi_interface ! sedimentation interface call +USE MO_HAMMOZ_DRYDEP, ONLY: drydep_interface ! dry deposition interface call +USE MO_HAM_RAD,ONLY: ham_rad,ham_rad_cache_cleanup,ham_rad_cache +USE YOMMP0 , ONLY : MYPROC, NPROC +USE TM5M7_OPTICS_DATA, ONLY : NWDEP, WDEP,NASWBAND,ASWBAND!,AER_TAU, AER_SSA,AER_ASYM, & +!& AER_TAU_LW +USE TM5_PHOTOLYSIS, ONLY : NBANDS_TROP, WAV_GRID, WAV_GRIDA +USE TM5M7_EMIS_DATA, ONLY : VKARMAN ! von karman constant for dry deposition +!----------------------------------------------------------------------- + +IMPLICIT NONE +TYPE(MODEL) ,INTENT(INOUT):: YDMODEL +INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA, KFDIA, KLON +INTEGER(KIND=JPIM),INTENT(IN) :: KTDIA, KLEV, KFLDX, KLEVX +INTEGER(KIND=JPIM),INTENT(IN) :: KTILES +INTEGER(KIND=JPIM),INTENT(IN) :: KTRAC +INTEGER(KIND=JPIM),INTENT(IN) :: KAERO(YDMODEL%YRML_GCONF%YGFL%NAERO) +INTEGER(KIND=JPIM),INTENT(IN) :: KCHEM(YDMODEL%YRML_GCONF%YGFL%NCHEM) +INTEGER(KIND=JPIM),INTENT(IN) :: KSTGLO + +REAL(KIND=JPRB),INTENT(IN) :: PGEOH(KLON,0:KLEV) +REAL(KIND=JPRB),INTENT(IN) :: PRSF1(KLON,KLEV), PRS1(KLON,0:KLEV), PAPHIF(KLON,KLEV) +REAL(KIND=JPRB),INTENT(IN) :: PAP(KLON,KLEV) , PIP(KLON,KLEV) , PLP(KLON,KLEV) , PLU(KLON,KLEV) +REAL(KIND=JPRB),INTENT(IN) :: PRP(KLON,KLEV) , PSP(KLON,KLEV), PCOVPTOT(KLON,KLEV) +REAL(KIND=JPRB),INTENT(IN) :: PAEROP(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO), PCAERO(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO) +REAL(KIND=JPRB),INTENT(IN) :: PCEN(KLON,KLEV,KTRAC), PCFLX(KLON,KTRAC) +REAL(KIND=JPRB),INTENT(IN) :: PO3P(KLON,KLEV), PQP(KLON,KLEV), PTP(KLON,KLEV), PTHP(KLON,0:KLEV) +REAL(KIND=JPRB),INTENT(IN) :: PFPLCL(KLON,0:KLEV),PFPLCN(KLON,0:KLEV),PFPLSL(KLON,0:KLEV),PFPLSN(KLON,0:KLEV) +REAL(KIND=JPRB),INTENT(IN) :: PGELAT(KLON) , PGELAM(KLON) +REAL(KIND=JPRB),INTENT(IN) :: PALBD(KLON,YDMODEL%YRML_PHY_RAD%YRERAD%NTSW), PFRTI(KLON,KTILES) +REAL(KIND=JPRB),INTENT(IN) :: PAERWS(KLON), PAERGUST(KLON), PAERUST(KLON), PAERMAP(KLON,5) +REAL(KIND=JPRB),INTENT(IN) :: PAERSRC(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO) +REAL(KIND=JPRB),INTENT(IN) :: PCHEM2AER(KLON,KLEV,6) +REAL(KIND=JPRB),INTENT(IN) :: PAERFLX(KLON,12,9), PAERLIF(KLON,9), PCLAERS(KLON) +REAL(KIND=JPRB),INTENT(IN) :: PLSM(KLON) , PSNS(KLON) , PWND(KLON) , PWS1(KLON) +REAL(KIND=JPRB),INTENT(IN) :: PTSPHY +REAL(KIND=JPRB),INTENT(IN) :: PVERVEL(KLON,KLEV) ! added vertical velocity as an input to TM5M7 as this is needed in HAM-M7 activation +REAL(KIND=JPRB),INTENT(IN) :: PCCNL(KLON) ! added CCN over land as an input to TM5M7 as this is needed in liquid effective radius calculation +REAL(KIND=JPRB),INTENT(IN) :: PCCNO(KLON) ! added CCN over ocean as an input to TM5M7 as this is needed in liquid effective radius calculation +REAL(KIND=JPRB),INTENT(IN) :: PAHFSTI(KLON,KTILES) ! added surface sensible heat flux for dry deposition +REAL(KIND=JPRB),INTENT(IN) :: PCI(KLON) ! added fraction of sea-ice for dry deposition +REAL(KIND=JPRB),INTENT(IN) :: PZ0M(KLON) ! added roughness length for momentum for dry deposition +REAL(KIND=JPRB),INTENT(IN) :: PAHFLEV(KLON) ! added latent heat flux for dry deposition +REAL(KIND=JPRB),INTENT(IN) :: PUP(KLON,KLEV) ! added u component of wind +REAL(KIND=JPRB),INTENT(IN) :: PVP(KLON,KLEV) ! added v component of wind +REAL(KIND=JPRB),INTENT(IN) :: PCVL(KLON) ! added low vegetation cover +REAL(KIND=JPRB),INTENT(IN) :: PCVH(KLON) ! added high vegetation cover +REAL(KIND=JPRB),INTENT(IN) :: PGEMU(KLON) ! sine of latitude + +REAL(KIND=JPRB),INTENT(INOUT) :: PTENC(KLON,KLEV,KTRAC) +REAL(KIND=JPRB),INTENT(INOUT) :: PAERDDP(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO), PAERSDM(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO) +! Total optical depth at various wavelenghts. +! NOTE!! These wavelength definitions are not necessarily consistent +! with what is used in IFS-AER +REAL(KIND=JPRB),INTENT(OUT) :: PODTO(KLON) +!REAL(KIND=JPRB),INTENT(OUT) :: PODTO469(KLON), PODTO670(KLON), PODTO865(KLON), PODTO1240(KLON) + +REAL(KIND=JPRB),INTENT(OUT) :: PAERO_WVL_DIAG(KLON,YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG,YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG_TYPES) +REAL(KIND=JPRB),INTENT(OUT) :: PAERODDF(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO,8) +REAL(KIND=JPRB),INTENT(INOUT) :: PEXTRA(KLON,KLEVX,KFLDX) +REAL(KIND=JPRB),INTENT(INOUT) :: PAER_TAU(KLON,KLEV,14), PAER_SSA(KLON,KLEV,14),PAER_ASYM(KLON,KLEV,14) +REAL(KIND=JPRB),INTENT(INOUT) :: PAER_TAU_LW(KLON,KLEV,16) +REAL(KIND=JPRB),INTENT(OUT) :: PTAUS_AER(KLON,KLEV,NBANDS_TROP,2),PTAUA_AER(KLON,KLEV,NBANDS_TROP,2) +REAL(KIND=JPRB),INTENT(OUT) :: PPMAER(KLON,KLEV,NBANDS_TROP,2) +REAL(KIND=JPRB),INTENT(INOUT) :: PGFL(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NDIM), PPRAERS(KLON) +! Simple sulfur scheme variables: +REAL(KIND=JPRB),INTENT(INOUT) :: PSO2DD(KLON) + +!REAL(KIND=JPRB), INTENT(INOUT) :: PFSO2(KLON) , PFSO4(KLON), PFSO4_AQ(KLON) +!REAL(KIND=JPRB), INTENT(INOUT) :: PTSO2(KLON, KLEV) , PTSO4(KLON, KLEV), PTSO4_AQ(KLON, KLEV) + +REAL(KIND=JPRB), INTENT(INOUT) :: ZFSO2(KLON), ZFSO4(KLON), ZFSO4_AQ(KLON) +REAL(KIND=JPRB), INTENT(INOUT) :: ZTSO2(KLON, KLEV), ZTSO4(KLON, KLEV), ZTSO4_AQ(KLON, KLEV) + +!* 0.5 LOCAL VARIABLES +! --------------- + +INTEGER(KIND=JPIM) :: JAER, JK, JL, JMMD, JSCAV, JSW, JWAVL, JT, JB, JN, JSPEC, ITRC, JEXT, IKLEVTROP(KLON), IW +INTEGER(KIND=JPIM) :: JCLASS, JTILE, j_yaero, JMASS, JGAS, JCLOUD ! local loop indice for activation and dry deposition and tracer indexing +INTEGER(KIND=JPIM) :: IAER, IEX3D, IEX3DP +INTEGER(KIND=JPIM) :: IEXTR2,ISHIFT1, IKPAER, IKP, ISTO, IWHERE +INTEGER(KIND=JPIM) :: IMODE ,NSO4SCHEME +REAL(KIND=JPRB) :: ZLON,ZLAT + +REAL(KIND=JPRB) :: ZAEROK(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO), ZTAEROK(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO), ZTAERO0(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO) +REAL(KIND=JPRB) :: ZFAERO(KLON,ntrac)!YGFL%NACTAERO) + +REAL(KIND=JPRB) :: ZAER(KLON,KLEV), ZAERNEG(KLON,KLEV), ZBETAB(KLON,KLEV), ZBETAI(KLON,KLEV) +REAL(KIND=JPRB) :: ZAP(KLON,KLEV), ZCLDWAT(KLON,KLEV), ZDUM(KLON,KLEV) +REAL(KIND=JPRB) :: ZSO2(KLON,KLEV), ZDP(KLON,KLEV), ZDZ(KLON,KLEV) + +REAL(KIND=JPRB) :: ZBCPHI(KLON,KLEV), ZBCPHO(KLON,KLEV), ZOMPHI(KLON,KLEV) , ZOMPHO(KLON,KLEV) +REAL(KIND=JPRB) :: ZTBCPHI(KLON,KLEV),ZTBCPHO(KLON,KLEV),ZTOMPHI(KLON,KLEV), ZTOMPHO(KLON,KLEV) +REAL(KIND=JPRB) :: ZITBCPHO(KLON,KLEV),ZITOMPHO(KLON,KLEV),ZITSO2(KLON,KLEV) +REAL(KIND=JPRB) :: ZFSO2(KLON) , ZFSO4(KLON), ZFSO4_AQ(KLON) +REAL(KIND=JPRB) :: ZTSO2(KLON, KLEV) , ZTSO4(KLON, KLEV) +REAL(KIND=JPRB) :: ZAIRDM(KLON) + +REAL(KIND=JPRB) :: ZQSAT(KLON,KLEV), ZRHCL(KLON,KLEV), ZRHO(KLON,KLEV) +REAL(KIND=JPRB) :: ZTAER(KLON,KLEV), ZTAERI(KLON,KLEV,YGFL%NACTAERO) +REAL(KIND=JPRB) :: ZTAERO(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO), ZTENV(KLON) +REAL(KIND=JPRB) :: ZAERWET(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO) +REAL(KIND=JPRB) :: ZRH(KLON,KLEV),ZTENC0(KLON,KLEV)!,ZTSO4(KLON,KLEV) + +REAL(KIND=JPRB) :: ZAERNL(KLON,KLEV,NMOD) +REAL(KIND=JPRB) :: ZAERML(KLON,KLEV,NAERMOD) +INTEGER(KIND=JPIM) :: JMOD,JAERCLASS,IFLAG +REAL(KIND=JPRB) :: ZM6RP(KLON,KLEV,NMOD) +REAL(KIND=JPRB) :: ZM6DRY(KLON,KLEV,NSOL) +REAL(KIND=JPRB) :: ZWW(KLON,KLEV,NMOD) +REAL(KIND=JPRB) :: ZRHOP(KLON,KLEV,NMOD) +REAL(KIND=JPRB) :: ZSVOC(KLON,KLEV) +REAL(KIND=JPRB) :: ZELVOC(KLON,KLEV) +REAL(KIND=JPRB) :: ZSO4G(KLON,KLEV) +REAL(KIND=JPRB) :: ZCEN(KLON,KLEV,KTRAC) ! local tracer number and mixing ratios and gas concentrations for not tendency updated values +REAL(KIND=JPRB), DIMENSION(:,:,:), ALLOCATABLE :: ZTAUS_AER, ZTAUA_AER, ZPMAER ! extinctions + +REAL(KIND=JPRB) :: PODTO469(KLON), PODTO670(KLON), PODTO865(KLON), PODTO1240(KLON) +REAL(KIND=JPRB) :: PAER_TAU(KLON,KLEV,14), PAER_SSA(KLON,KLEV,14),PAER_ASYM(KLON,KLEV,14) + +REAL(KIND=JPRB) :: ZAER_TAU(KLON,KLEV,14,1), ZAER_SSA(KLON,KLEV,14),ZAER_ASYM(KLON,KLEV,14),ZAER_TAU_LW(KLON,KLEV,16) + +! Optics output fields (to be used and allocated by methods using the optics) +REAL(KIND=JPRB), DIMENSION(:,:,:,:), ALLOCATABLE :: ZAOP_OUT_EXT ! extinctions +REAL(KIND=JPRB), DIMENSION(:,:,:), ALLOCATABLE :: ZAOP_OUT_A ! single scattering albedo +REAL(KIND=JPRB), DIMENSION(:,:,:), ALLOCATABLE :: ZAOP_OUT_G ! assymetry factor + + +!Defined here, but should be passed in Call really: +TYPE(MODAL_DATA), DIMENSION(NMOD), TARGET :: RW_MODE +TYPE(MODAL_DATA), DIMENSION(NSOL), TARGET :: RWD_MODE +TYPE(MODAL_DATA), DIMENSION(NSOL), TARGET :: H2O_MODE +TYPE(MODAL_DATA), DIMENSION(NMOD), TARGET :: DENS_MODE + +REAL(KIND=JPRB), ALLOCATABLE :: ZAERSRC(:,:), ZAERNGT(:,:) , ZAERSCC(:,:) + +REAL(KIND=JPRB) :: ZCLWAT, ZDEGRAD, ZEPSCOV, ZEPSWAT, ZRWSAT, ZRWPWP +REAL(KIND=JPRB) :: Z1CLD , ZDENSVIS,ZGDT , ZQIWP , ZQLWP(KLON,KLEV) , ZQRWP , ZQSWP +REAL(KIND=JPRB) :: ZDESIC, ZRELRA , ZLIQRAI, ZSNOICE, ZCFLIRA, ZCFSNIC, ZVISCON, ZVISRAY +REAL(KIND=JPRB) :: ZNS , ZRANGE , ZSIGAIR, ZVISICL, ZVISIPR, ZVISCAE, ZVISPAE + +REAL(KIND=JPRB) :: ZTMPA,ZRHOP1(KLON,KLEV)!,zdummy,zdum2d(KLON,KLEV),zdum3d(KLON,KLEV,nmod),zlfrac_so2(KLON,KLEV),ZFLXR,ZFLXS,ZFLXRB,ZFLXSB +REAL(KIND=JPRB) :: pmrateps(KLON,KLEV),pmrater(KLON,KLEV),pfevapr(KLON,KLEV),pfsubls(KLON,KLEV),pmsnowacl(KLON,KLEV)!,ZDPG(KLON,KLEV),zxtp1c(KLON,KLEV,KTRAC),zxtp10(KLON,KLEV,KTRAC) +LOGICAL :: LLIQCLD(KLON,KLEV) ! logical for liquid cloud +LOGICAL :: LICECLD(KLON,KLEV) ! logical for ice cloud +INTEGER(KIND=JPIM) ::KTOP +REAL(KIND=JPRB) :: ZEPSEC=1e-14 +REAL(KIND=JPRB) :: ZAEROUT1(KLON,KLEV),ZAEROUT2(KLON,KLEV),ZAEROUT3(KLON,KLEV),ZAEROUT4(KLON,KLEV),ZAEROUT5(KLON,KLEV) + +REAL(KIND=JPRB),PARAMETER :: INFINITY=HUGE(1._JPRB) + +REAL(KIND=JPRB) :: ZHOOK_HANDLE + +INTEGER(kind=JPIM) :: jj ! loop index + +! variables for the M7 call +REAL(KIND=JPRB) :: ZGRVOL(KLON,KLEV) !grid box volume for diagnostics +REAL(KIND=JPRB) :: ZPBL(KLON) !planetary boundary layer top level (in vdfmain.F90 ITOP=1) +REAL(KIND=JPRB) :: ZXTM1(KLON,KLEV,ntrac) !tracer mixing ratios for HAM +REAL(KIND=JPRB) :: ZXTTE(KLON,KLEV,ntrac) !tracer tendency for HAM +REAL(KIND=JPRB) :: ZXTTEM1(KLON,KLEV,ntrac) !tracer tendency for HAM +! added here variables for HAM-M7 activation +REAL(KIND=JPRB), ALLOCATABLE :: ZW(:,:,:) !mean or bins of updraft velocity [m s-1] +REAL(KIND=JPRB), ALLOCATABLE :: ZWPDF(:,:,:) !updraft velocity PDF over bins +REAL(KIND=JPRB), ALLOCATABLE :: ZRC(:,:,:,:) !critical radius of activation per mode [m] +REAL(KIND=JPRB), ALLOCATABLE :: ZSMAX(:,:,:) !maximum supersaturation +REAL(KIND=JPRB) :: ZTKEM1(KLON,KLEV) !turbulent kinetic energy as zero as it is not used for now +REAL(KIND=JPRB) :: ZWCAPE(KLON) !CAPE as zero as it is not used +REAL(KIND=JPRB) :: ZRDRY(KLON,KLEV,nclass) !dry radius for each class +REAL(KIND=JPRB) :: ZESW(KLON,KLEV) !saturation water vapor pressure +REAL(KIND=JPRB) :: ZA(KLON,KLEV,nclass) !curvature parameter A of the Koehler equation +REAL(KIND=JPRB) :: ZB(KLON,KLEV,nclass) !hygroscopicity parameter B of the Koehler equation +REAL(KIND=JPRB) :: ZSC(KLON,KLEV,nclass) !critical supersaturation [% 0-1] +REAL(KIND=JPRB) :: ZNACT(KLON,KLEV,nclass) !number of activated particles per mode [m-3] +REAL(KIND=JPRB) :: ZFRACN(KLON,KLEV,nclass) !fraction of activated particles per mode +REAL(KIND=JPRB) :: ZCDNCACT(KLON,KLEV) !number of activated particles +REAL(KIND=JPRB) :: ZRE_LIQ(KLON,KLEV)! liquid effective radius +! variables for HAM-M7 wet deposition +REAL(KIND=JPRB) :: ZXTP1(KLON,KLEV,ntrac) !updated tracer mass/number mixing ratio +REAL(KIND=JPRB) :: ZXTP1C(KLON,KLEV,ntrac) !in-cloud tracer mass/number mixing ratio +REAL(KIND=JPRB) :: ZXTP10(KLON,KLEV,ntrac) !ambient tracer mass/number mixing ratio +REAL(KIND=JPRB) :: ZDUMMY(KLON,ntrac) !placeholder for pxtbound which is only necessary in the conv. case (conv. massfix boundary condition) +REAL(KIND=JPRB) :: ZDUM3D(KLON,KLEV,ntrac) !updraft mass flux (for conv case only) +REAL(KIND=JPRB) :: ZDUM2D(KLON,KLEV) !convective flux needed only for conv. case (see cuflx) +REAL(KIND=JPRB) :: ZLFRAC_SO2(KLON,KLEV) !liquid tracer fraction (SO2) -ham specific- +REAL(KIND=JPRB) :: ZDPG(KLON,KLEV) !dp/g +REAL(KIND=JPRB) :: ZQP(KLON,KLEV) !full level humidity with treshold +LOGICAL :: LSTRAT = .TRUE. !logical switch for stratiform or convective case (TRUE for strat., FALSE for conv.) +REAL(KIND=JPRB) :: ZFEVAPR(KLON,KLEV) !evaporation of rain [kg/m2/s] +REAL(KIND=JPRB) :: ZFSUBLS(KLON,KLEV) !sublimation of snow [kg/m2/s] +REAL(KIND=JPRB) :: ZMRATEPR(KLON,KLEV) !rain formation rate in cloudy part +REAL(KIND=JPRB) :: ZMRATEPS(KLON,KLEV) !ice formation rate in cloudy part +REAL(KIND=JPRB) :: ZMSNOWACL(KLON,KLEV) !accretion rate of snow with cloud droplets in cloudy part +REAL(KIND=JPRB) :: ZFLXR, ZFLXS, ZFLXRB, ZFLXSB !variables to calculate rain and snow evap/formation +REAL(KIND=JPRB) :: ZLP(KLON,KLEV) !temporary variable for cloud water content +REAL(KIND=JPRB) :: ZIP(KLON,KLEV) !temporary variable for cloud ice water content +! variables for ICNC calculations +REAL(KIND=JPRB) :: ZICNC(KLON,KLEV) ! ice crystal number concentration [#/cm3] +! added here variables for dry deposition and sedimentation +REAL(KIND=JPRB) :: ZTENCIH(KLON,KLEV,ntrac) !for HAM tendencies +REAL(KIND=JPRB) :: ZTENCI(KLON,KLEV,KTRAC) !for OIFS tendencies +REAL(KIND=JPRB) :: ZAHFSM(KLON) +REAL(KIND=JPRB) :: ZWND(KLON) +! variables not needed for HAM aerosol dry deposition (if gas deposition and different surfaces are taken into account these need to be revised!) +REAL(KIND=JPRB) :: ZCFML(KLON), ZCFMW(KLON), ZCFMI(KLON), ZCFNCL(KLON), ZCFNCW(KLON), ZCFNCI(KLON), ZEPDU2, ZKAP +REAL(KIND=JPRB) :: ZGEOM1(KLON,KLEV), ZRIL(KLON), ZRIW(KLON), ZRII(KLON), ZTVIR1(KLON,KLEV), ZTVL(KLON), ZTVW(KLON) +REAL(KIND=JPRB) :: ZTVI(KLON), ZAZ0(KLON), ZFRL(KLON), ZSRFL(KLON), ZFOREST(KLON), ZTSI(KLON), ZAZ0L(KLON) +REAL(KIND=JPRB) :: ZAZ0I(KLON), ZCDNI(KLON) +! variables needed for HAM aerosol dry deposition +LOGICAL :: ZLOLAND(KLON) !logical land mask +REAL(KIND=JPRB) :: ZXTEMS(KLON,ntrac) !surface emissions modified by dry deposition +REAL(KIND=JPRB) :: ZAZ0W(KLON), ZFRW(KLON), ZCVS(KLON), ZCVW(KLON), ZVGRAT(KLON) !rough. len. wat., wat. frac., snow cov. frac., wet skin frac., veg. ratio +REAL(KIND=JPRB) :: ZCDNL(KLON), ZCDNW(KLON) !ustar (in not used variable), aerodynamic resis. on surface (in not used variable) +REAL(KIND=JPRB) :: ZXTMD1(KLON,KLEV,ntrac) !tracer mixing ratios for HAM drydep (updated with tend) +! output diagnostics +REAL(KIND=JPRB) :: ZOUT(KLON,ntrac),ZOUT2(KLON,14),zout3(KLON,KLEV,2*(naerocomp+nclass)) +REAL(KIND=JPRB) :: ZOUT4(KLON,KLEV),ZOUT5(KLON,klev),ZOUT6(KLON,klev),ZOUT7(KLON,klev),ZOUT8(KLON,klev),ZOUT9(KLON,klev) +REAL(KIND=JPRB) :: ZZOUT1(KLON,KLEV),ZZOUT2(KLON,klev),ZZOUT3(KLON,KLEV),ZZOUT4(KLON,KLEV),ZZOUT5(KLON,klev),ZZOUT6(KLON,KLEV) +REAL(KIND=JPRB) :: ZZOUT7(KLON,KLEV),ZZOUT8(KLON,klev),ZZOUT9(KLON,KLEV),ZZOUT10(KLON,KLEV),ZZOUT11(KLON,klev),ZZOUT12(KLON,KLEV) + +REAL(KIND=JPRB) :: sedout(KLON,KLEV,ktrac) +REAL(KIND=JPRB) :: ddepout(KLON,KLEV,KTRAC) +REAL(KIND=JPRB) :: Wdepout(KLON,KLEV,ktrac) +REAL(KIND=JPRB) :: sedout_2D(KLON,ktrac) +REAL(KIND=JPRB) :: ddepout_2D(KLON,KTRAC) +REAL(KIND=JPRB) :: Wdepout_2D(KLON,ktrac) +REAL(KIND=JPRB) :: M7TEND_OUT(KLON,KLEV,KTRAC) +REAL(KIND=JPRB) :: M7TEND_IN(KLON,KLEV,KTRAC) +REAL(KIND=JPRB):: zaveragep(KLON,klev,(nclass+naerocomp)) +REAL(KIND=JPRB):: zm7kappa(KLON,klev,(nclass+naerocomp)) +REAL(KIND=JPRB):: zh2so4cs(KLON,klev,(nclass+naerocomp)) +REAL(KIND=JPRB):: zm7prodcond(KLON,klev,(nclass+naerocomp)) +REAL(KIND=JPRB) :: ZVDA(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO) +REAL(KIND=JPRB) :: ZSEDIFLUX(KLON,KLEV,ntrac) +REAL(KIND=JPRB) :: ZDDEPFLUX(KLON,ntrac) +REAL(KIND=JPRB) :: ZDDEPFLUX_SO2(KLON) +REAL(KIND=JPRB) :: ZVDEP(KLON,ntrac) !ddep velocity for diagnostics from ham +INTEGER(kind=JPIM)::ZISO4 ! temporary tracer index of gas-phase SO4 (retrieved from chemistry module) +INTEGER(kind=JPIM), parameter::ZKROW=1 ! KROW only used in ECHAM but needed inside HAM-codes so set as 1. +INTEGER(kind=JPIM):: IBLK + +REAL(KIND=JPRB) :: reffi(KLON,KLEV,ZKROW), reffl(KLON,KLEV,ZKROW) + +INTEGER(kind=JPIM)::ISO4_C, ISSO4_C ! temporary tracer index of gas-phase SO4 (retrieved from chemistry module) +REAL(KIND=JPRB)::zhenry_so2(2),zheneff(KLON,klev),ze2(KLON,KLEV),zqtp1(KLON,KLEV),zza(KLON,klev),ze3(KLON,klev) + +INTEGER(kind=JPIM)::LWBANDS !laakso: number of LW bands +INTEGER(KIND=JPIM) :: IWHAT, INWAVL, ITWAVL(20) +REAL(KIND=JPRB) ::PRS1D(KLON,KLEV) +!TEST +REAL(KIND=JPRB) :: TEST1(KLON,KLEV) +REAL(KIND=JPRB) :: TEST2(KLON,KLEV) +REAL(KIND=JPRB) :: TEST3(KLON,KLEV) +REAL(KIND=JPRB) :: TEST4(KLON,KLEV) +REAL(KIND=JPRB) :: TEST5(KLON,KLEV) +REAL(KIND=JPRB) :: TEST6(KLON,KLEV) +REAL(KIND=JPRB) :: TEST7(KLON,KLEV) +REAL(KIND=JPRB) :: TEST8(KLON,KLEV) +REAL(KIND=JPRB) :: PAOD(KLON,NASWBAND), PSSA(KLON,NASWBAND), PABS(KLON,NASWBAND), PASY(KLON,NASWBAND),PFAOD(KLON,NASWBAND) + + +!----------------------------------------------------------------------- + +#include "surf_inq.h" +#include "aer_so2so4_v2.intfb.h" +#include "satur.intfb.h" +#include "aer_negat.intfb.h" +#include "tm5m7_optics_aop_get.intfb.h" +#include "troplev.intfb.h" +#include "chem_inext.intfb.h" +!#include "m7.intfb.h" +#include "m7_simple_sulfur_drydep.intfb.h" +! include calculations for ice effective radius +#include "ice_effective_radius.intfb.h" + +!----------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('TM5M7',0,ZHOOK_HANDLE) +ASSOCIATE(& YGFL=>YDMODEL%YRML_GCONF%YGFL, YREAERSRC=>YDMODEL%YRML_PHY_AER%YREAERSRC,YREAERATM=>YDMODEL%YRML_PHY_RAD%YREAERATM, & + & YREAERLID=>YDMODEL%YRML_PHY_AER%YREAERLID, YREAERSNK=>YDMODEL%YRML_PHY_AER%YREAERSNK, YRERAD=>YDMODEL%YRML_PHY_RAD%YRERAD,& + & YDRIP=>YDMODEL%YRML_GCONF%YRRIP, YRCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO, YREPHY=>YREPHY%YRML_PHY_EC%YREPHY, & + & YRECLDP=>YRECLDP%YRML_PHY_EC%YRECLDP, & + & YDSPP_CONFIG=>YDMODEL%YRML_GCONF%YRSPP_CONFIG, & + & NACTAERO=>YGFL%NACTAERO, NAERO=>YGFL%NAERO, NGHG=>YGFL%NGHG, NCHEM=>YGFL%NCHEM, ZTRAC=>YGFL%NTRAC, NSO4SCHEME => YREAERSRC%NSO4SCHEME, & + & NDIM=>YGFL%NDIM, YAEROUT=>YGFL%YAEROUT, YR=>YGFL%YR, YS=>YGFL%YS, & + & LCHEM_DIA=>YRCOMPO%LCHEM_DIA, YCHEM=>YGFL%YCHEM, YAERO=>YGFL%YAERO, YGHG=>YGFL%YGHG, YTRAC=>YGFL%YTRAC, & + & YDAERM7=>YDMODEL%YRML_PHY_AER%YREAEROPT, &! use this to transfer AOD, SSA and ASY to rad scheme + & LAERDRYDP=>YREAERATM%LAERDRYDP, LAERSEDIM=>YREAERATM%LAERSEDIM, LAERSURF=>YREAERATM%LAERSURF, & !add logicals for dry dep and sedi + & YCDNC=>YGFL%YCDNC, YICNC=>YGFL%YICNC, YRE_LIQ=>YGFL%YRE_LIQ, YRE_ICE=>YGFL%YRE_ICE, & !included CDNC, ICNC, liq and ice eff rad + & LAER6SDIA=>YREAERATM%LAER6SDIA, LAERCLIMG=>YREAERATM%LAERCLIMG, & + & LAERCLIMZ=>YREAERATM%LAERCLIMZ, LAERGTOP=>YREAERATM%LAERGTOP, & + & LAERHYGRO=>YREAERATM%LAERHYGRO, LAERLISI=>YREAERATM%LAERLISI, & + & LAERNGAT=>YREAERATM%LAERNGAT, LAERSCAV=>YREAERATM%LAERSCAV, & + & LAERNITRATE => YREAERATM%LAERNITRATE, & + & LAERSCAV_CHEM=>YREAERATM%LAERSCAV_CHEM, LAERVOL=>YREAERATM%LAERVOL, & + & LAERCHEM=>YGFL%LAERCHEM, & + & NINDSCAV=>YREAERATM%NINDSCAV, NTSCAV=>YREAERATM%NTSCAV, & + & NXT3DAER=>YREAERATM%NXT3DAER, & + & NWLID=>YREAERLID%NWLID, & + & NDDUST=>YREAERSRC%NDDUST, NTYPAER=>YREAERSRC%NTYPAER, & + & YSURF=>YREPHY%YSURF, & + & RRHTAB=>YREAERSNK%RRHTAB, & + & RNICE=>YRECLDP%RNICE, & !default for ICNC + & RCLDMAX=>YRECLDP%RCLDMAX, & !max cloud value + & LAERVISI=>YRERAD%LAERVISI, NTSW=>YRERAD%NTSW, RNS=>YRERAD%RNS, & + & RSIGAIR=>YRERAD%RSIGAIR,YAERCLIM=>YGFL%YAERCLIM, & + & NSTART=>YDRIP%NSTART,AERO_SCHEME=>YRCOMPO%AERO_SCHEME,CHEM_SCHEME=>YRCHEM%CHEM_SCHEME,& + & NAERO_WVL_DIAG=>YGFL%NAERO_WVL_DIAG, & + & NRADFR=>YRERAD%NRADFR,NAEROOPT=>YRERAD%NAEROOPT) !FREQUENCY OF FULL RADIATION COMPUTATIONS +! ------------------------------------------------------------------ + +!* 0. PROGNOSTIC AEROSOLS - FINAL COMPUTATIONS +! ---------------------------------------- + +ZEPSCOV=1.E-03_JPRB +ZEPSWAT=1.E-18_JPRB +ZDEGRAD=180._JPRB/RPI +CALL SURF_INQ(YSURF,PRWSAT=ZRWSAT) +CALL SURF_INQ(YSURF,PRWPWP=ZRWPWP) + +!* 0.1 SWITCHING ON POSSIBLE DEBUG PRINTS AND ALLOCATING MEMORY +! -------------------------------------------------------- + +ALLOCATE( ZAERSRC(KLON,NACTAERO) ) +ALLOCATE( ZAERNGT(KLON,NACTAERO) ) +ALLOCATE( ZAERSCC(KLON,NACTAERO) ) + +ZAERSRC(KIDIA:KFDIA,1:NACTAERO) =0._JPRB +ZAERNGT(KIDIA:KFDIA,1:NACTAERO) =0._JPRB +ZAERSCC(KIDIA:KFDIA,1:NACTAERO) =0._JPRB + +ZAEROUT1(:,:) =0._JPRB +ZAEROUT2(:,:) =0._JPRB +ZAEROUT3(:,:) =0._JPRB +ZAEROUT4(:,:) =0._JPRB +ZAEROUT5(:,:) =0._JPRB + +ZOUT(:,:) =0._JPRB +ZOUT2(:,:) =0._JPRB +ZOUT3(:,:,:) =0._JPRB +ZOUT4(:,:) =0._JPRB +ZOUT5(:,:) =0._JPRB +ZOUT6(:,:) =0._JPRB +ZOUT7(:,:) =0._JPRB +ZOUT8(:,:) =0._JPRB +ZOUT9(:,:) =0._JPRB + +ZZOUT1(:,:) =0._JPRB +ZZOUT2(:,:) =0._JPRB +ZZOUT3(:,:) =0._JPRB +ZZOUT4(:,:) =0._JPRB +ZZOUT5(:,:) =0._JPRB +ZZOUT6(:,:) =0._JPRB +ZZOUT7(:,:) =0._JPRB +ZZOUT8(:,:) =0._JPRB +ZZOUT9(:,:) =0._JPRB +ZZOUT10(:,:) =0._JPRB +ZZOUT11(:,:) =0._JPRB +ZZOUT12(:,:) =0._JPRB + +M7TEND_IN(:,:,:)=0._JPRB +M7TEND_OUT(:,:,:)=0._JPRB +SEDOUT(:,:,:)=0._JPRB +DDEPOUT(:,:,:)=0._JPRB +WDEPOUT(:,:,:)=0._JPRB +ZSEDIFLUX(:,:,:)=0._JPRB +ZDDEPFLUX(:,:)=0._JPRB +ZDDEPFLUX_SO2(:)=0._JPRB +ZVDA(:,:)=0._JPRB +SEDOUT_2D(:,:)=0._JPRB +DDEPOUT_2D(:,:)=0._JPRB +WDEPOUT_2D(:,:)=0._JPRB + +zaveragep(:,:,:)= 0.0_JPRB +zm7kappa(:,:,:)= 0.0_JPRB +zh2so4cs(:,:,:)= 0.0_JPRB +zm7prodcond(:,:,:)= 0.0_JPRB + +ZTAERO(:,:,:)=0._JPRB + +ZAERSRC(KIDIA:KFDIA,1:NACTAERO)=PAERSRC(KIDIA:KFDIA,1:NACTAERO) + +! computation of tropopause level +CALL TROPLEV(KLON,KIDIA,KFDIA,KLEV,.FALSE.,PTP,PQP,PRSF1,IKLEVTROP) + +! Initializing tracer number and mixing ratios and gas concentrations to not be tendency updated values +ZCEN(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB +ITRC=0 +DO JEXT=1,NGHG + ITRC=ITRC+1 + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZCEN(JL,JK,ITRC) = PGFL(JL,JK,YGHG(JEXT)%MP9_PH) + ENDDO + ENDDO +ENDDO +DO JEXT=1,ZTRAC + ITRC=ITRC+1 + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZCEN(JL,JK,ITRC) = PGFL(JL,JK,YTRAC(JEXT)%MP9_PH) + ENDDO + ENDDO +ENDDO +DO JEXT=1,NAERO + ITRC=ITRC+1 + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZCEN(JL,JK,ITRC) = PGFL(JL,JK,YAERO(JEXT)%MP9_PH) + ENDDO + ENDDO +ENDDO +if(LAERCHEM) then + DO JEXT=1,NCHEM + ITRC=ITRC+1 + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZCEN(JL,JK,ITRC) = PGFL(JL,JK,YCHEM(JEXT)%MP9_PH) + ENDDO + ENDDO + ENDDO +end if + +DO JAER=1,NACTAERO + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ! check on max-values here to prevent excessive values in OPTICS_AOP_GET.. probably to be removed again!! + ZAEROK(JL,JK,JAER) =MIN(ZCEN (JL,JK,KAERO(JAER)), 1e10) + ZTAEROK(JL,JK,JAER)=PTENC(JL,JK,KAERO(JAER)) + ENDDO + ENDDO +ENDDO + +! Initialize output aerosol tendencies +DO JAER=1,NACTAERO + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZAEROK(JL,JK,JAER) =ZCEN (JL,JK,KAERO(JAER)) + ZTAEROK(JL,JK,JAER)=PTENC(JL,JK,KAERO(JAER)) + ENDDO + ENDDO +ENDDO + +DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZRHO(JL,JK)=PRSF1(JL,JK)/(RD*PTP(JL,JK)) + ZDP(JL,JK)= PRS1(JL,JK) - PRS1(JL,JK-1) + ZDPG(JL,JK)= (PRS1(JL,JK) - PRS1(JL,JK-1))/RG ! calculate dp/g + ZDZ(JL,JK)= ZDP(JL,JK) / (ZRHO(JL,JK)*RG) + ENDDO +ENDDO + +ZM6RP(KIDIA:KFDIA,:,:)=0.0_JPRB +ZM6DRY(KIDIA:KFDIA,:,:)=0.0_JPRB +ZRHOP(KIDIA:KFDIA,:,:)=0.0_JPRB +ZWW(KIDIA:KFDIA,:,:)=0.0_JPRB +ZAERML(KIDIA:KFDIA,:,:)=0.0_JPRB +ZAERNL(KIDIA:KFDIA,:,:)=0.0_JPRB + +IF (LCHEM_DIA) THEN + ZTAERO0(KIDIA:KFDIA,1:KLEV,1:NACTAERO) = ZTAEROK(KIDIA:KFDIA,1:KLEV,1:NACTAERO) + ZTENC0(KIDIA:KFDIA,1:KLEV) = 0._JPRB +ENDIF + + + + +!* 0.2 Preliminary computation +!* GAS-TO-PARTICLE CONVERSION (SO2 -> SO4) +!* (SO2 -> SO4) + +IF(.NOT. LAERCHEM) THEN + + do JGAS=1,2 + IF (TRIM(YAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))%CNAME)=='SO2') THEN + ISSO2=ind_oifs_ham%ind_gas_OIFS(JGAS) + ELSE IF (TRIM(YAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))%CNAME)=='SO4_gas')THEN + ISSO4=ind_oifs_ham%ind_gas_OIFS(JGAS) + ELSE + CALL ABOR1('ABORT: IN AER_PHY3_layer, SO2 not defined. Wrong table in use') + END IF + end do + DO JAER=1,NACTAERO + IF (TRIM(YAERO(JAER)%CNAME)=='SO4_AS') THEN + ISSO4_ACS=JAER + EXIT + END IF + END DO + + DO JK=1,KDIM%KLEV + DO JL=KDIM%KIDIA,KDIM%KFDIA + !!!ZDP(JL,JK)= PAUX%PRS1(JL,JK) - PAUX%PRS1(JL,JK-1) + ZTSO2(JL,JK)=PTENC(JL,JK,ISSO2) + ZTSO4(JL,JK)=PTENC(JL,JK,ISSO4) + ZTSO4_AQ(JL,JK)=0.0_JPRB + ZSO2(JL,JK)=PAEROP(JL,JK,ISSO2) + ZITSO2(JL,JK)=PTENC(JL,JK,ISSO2) + END DO + END DO + + !CALL AER_SO2SO4_V2 ( & + ! KIDIA, KFDIA, KLON, KLEV, & +! ! TSPHY, STATE%T, PAUX%PRSF1 , PRAD%PNEB, PRAD%PQLI, PAUX%PGELAM,& + ! ! take the liquidwater and cloud fraction from state variables i + ! ! instead of radiation data structures, in 43r3 PRAD% are zero + ! ! between radiation time steps + ! TSPHY, STATE%T, PAUX%PRSF1 , STATE%A, STATE%CLD(:,:,NCLDQL), PAUX%PGELAM,& + ! ZSO2, ZITSO2, PGFL(:,:,YAERCLIM(1)%MP),& + ! PGFL(:,:,YAERCLIM(2)%MP), PGFL(:,:,YAERCLIM(3)%MP) ,& + ! ZTSO2 , ZTSO4, ZTSO4_AQ, ZFSO2, ZFSO4, ZFSO4_AQ, ZDP ) + + CALL AER_SO2SO4_V2 ( YDRIP, & + & KIDIA , KFDIA , KLON , KLEV , & + & PTSPHY, PTP , PRSF1 , PAP , PLP , PGELAT, PGELAM, & + & ZSO2 , ZITSO2, PGFL(:,:,YGFL%YAEROCLIM(1)%MP), & + & PGFL(:,:,YGFL%YAEROCLIM(2)%MP), PGFL(:,:,YGFL%YAEROCLIM(3)%MP) ,& + & ZTSO2 , ZTSO4, ZTSO4_AQ, ZFSO2, ZFSO4, ZFSO4_AQ, ZDP) + + + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ! ZTSO2 + PTENC(JL,JK,ISSO2)=PTENC(JL,JK,ISSO2)+ZTSO2(JL,JK) + ! ZTSO4 + PTENC(JL,JK,ISSO4)=PTENC(JL,JK,ISSO4)+ZTSO4(JL,JK) + ! SO4 formed in clouds is applied to Accumulati + !write(7700,*)ISSO4_ACS,shape(GEMSL%ZTENC(JL,JK,:)) + PTENC(JL,JK,ISSO4_ACS)=PTENC(JL,JK,ISSO4_ACS)+ZTSO4_AQ(JL,JK) + !This is done insed aer_phy3.F90: + ! ELSE IF(AERO_SCHEME == "aer") THEN + ! GEMSL%ZTENC(JL,JK,ISSO4)=GEMSL%ZTENC(JL,JK,ISSO4)+ZTSO4(JL,JK) + + END DO + END DO + +ENDIF +!end of * (SO2 -> SO4) + + + + + + +!* 1.1 COMPUTE RELATIVE HUMIDITY WITHOUT VERTICAL SMOOTING +! --------------------------------------------------- +! Q at saturation for RH calculation +IFLAG=2 +CALL SATUR(KIDIA , KFDIA , KLON , KTDIA , KLEV, YDMODEL%YRML_PHY_SLIN%YREPHLI%LPHYLIN, & + & PRSF1, PTP , ZQSAT , IFLAG) + +! RH calculation +DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZQP(JL,JK)=MAX(0.0_JPRB,PQP(JL,JK)) !add treshold for full level humid + ZRH(JL,JK)=ZQP(JL,JK)/(MAX(1.E-30_JPRB,ZQSAT(JL,JK))) + ZRH(JL,JK)=MIN(1.0_JPRB,MAX(0.0_JPRB,ZRH(JL,JK))) + ZAP(JL,JK)=MIN(1.0_JPRB,MAX(0.0_JPRB,PAP(JL,JK))) !add threshold for cloud cover + ENDDO +ENDDO + +! TB apparently unnecessary in current implementation, but ISSO4_C still needed for chem_inext in the code. +! needs to be reviewed if it can be removed. +IF(LAERCHEM .AND. NCHEM>0) THEN + DO JT=1,NCHEM + IF(TRIM(YCHEM(JT)%CNAME)== 'SO4' ) THEN + ISSO4_C=KCHEM(JT) + ISO4_C=JT + ENDIF + ENDDO + ZSO4G(KIDIA:KFDIA,1:KLEV)=ZCEN(KIDIA:KFDIA,1:KLEV,ISSO4_C) +ELSE + ZSO4G(KIDIA:KFDIA,1:KLEV)=0._JPRB +ENDIF + + +! change kg kg-1 to molec cm-3 + +if (LAERCHEM) then + + ZELVOC(KIDIA:KFDIA,1:KLEV)=ZCEN(KIDIA:KFDIA,1:KLEV,KAERO(ielvoc)) + ZSVOC(KIDIA:KFDIA,1:KLEV)=ZCEN(KIDIA:KFDIA,1:KLEV,KAERO(iisvoc)) + +else + ZELVOC(KIDIA:KFDIA,1:KLEV)=0.0_JPRB + ZSVOC(KIDIA:KFDIA,1:KLEV)=0.0_JPRB +end if + +!calculate ICNC +ZICNC(KIDIA:KFDIA,1:KLEV) = 0._JPRB +ZICNC(KIDIA:KFDIA,1:KLEV) = RNICE +!Put tracer mixing ratios and tendencies to from OIFS to HAM +!initialize to zero +ZXTM1(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB +ZXTTE(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB +ZXTTEM1(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB +!number +DO JCLASS=1,nclass + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZXTM1(JL,JK,ind_oifs_ham%ind_class_HAM(JCLASS)) = ZCEN(JL,JK,KAERO(ind_oifs_ham%ind_class_OIFS(JCLASS))) + ZXTTE(JL,JK,ind_oifs_ham%ind_class_HAM(JCLASS)) = PTENC(JL,JK,KAERO(ind_oifs_ham%ind_class_OIFS(JCLASS))) + END DO + END DO +END DO +!mass +DO JMASS=1,naerocomp + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZXTM1(JL,JK,ind_oifs_ham%ind_mass_HAM(JMASS)) = ZCEN(JL,JK,KAERO(ind_oifs_ham%ind_mass_OIFS(JMASS))) + + ZXTTE(JL,JK,ind_oifs_ham%ind_mass_HAM(JMASS)) = PTENC(JL,JK,KAERO(ind_oifs_ham%ind_mass_OIFS(JMASS))) + ! in case of simple sulfur scheme add SO4_AQ part into SO4_ACS + ! both original tendency and m7tendency + + END DO + END DO +END DO +!gas +DO JGAS=1,subm_ngasspec + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + if (LAERCHEM) then +!<<<<<<< HEAD + ZXTM1(JL,JK,ind_oifs_ham%ind_gas_HAM(JGAS)) = ZCEN(JL,JK,KCHEM(ind_oifs_ham%ind_gas_OIFS(JGAS))) + ZXTTE(JL,JK,ind_oifs_ham%ind_gas_HAM(JGAS)) = PTENC(JL,JK,KCHEM(ind_oifs_ham%ind_gas_OIFS(JGAS))) +!======= + !ZXTM1(JL,JK,ind_gas_HAM(JGAS)) = ZCEN(JL,JK,KCHEM(ind_gas_OIFS(JGAS))) + !ZXTTE(JL,JK,ind_gas_HAM(JGAS)) = PTENC(JL,JK,KCHEM(ind_gas_OIFS(JGAS))) + !ADD SO4 from wet chemistry to tendencies + if (ind_oifs_ham%ind_gas_OIFS(JGAS) == ISO4ACS )THEN + ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_gas_OIFS(JGAS))=ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_gas_OIFS(JGAS))+PCHEM2AER(KIDIA:KFDIA,1:KLEV,2) + elseif( ind_oifs_ham%ind_gas_OIFS(JGAS) == ISO4COS)then + ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_gas_OIFS(JGAS))=ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_gas_OIFS(JGAS))+PCHEM2AER(KIDIA:KFDIA,1:KLEV,3) + end if +!>>>>>>> origin/feature/fmi-hamm7-bugfixes + ELSE !simple sulfur scheme + IF(TRIM(YAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))%CNAME)=='SO2')THEN + ZXTM1(JL,JK,ind_oifs_ham%ind_gas_HAM(JGAS)) = ZCEN(JL,JK,KAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))) + ! + ZXTTE(JL,JK,ind_oifs_ham%ind_gas_HAM(JGAS)) = PTENC(JL,JK,KAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))) + ZXTTEM1(JL,JK,ind_oifs_ham%ind_gas_HAM(JGAS)) = PTENC(JL,JK,KAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))) + + ELSE IF (TRIM(YAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))%CNAME)=='SO4_gas')THEN + ZXTM1(JL,JK,ind_oifs_ham%ind_gas_HAM(JGAS)) = ZCEN(JL,JK,KAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))) + ZXTTE(JL,JK,ind_oifs_ham%ind_gas_HAM(JGAS)) = PTENC(JL,JK,KAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))) + ZXTTEM1(JL,JK,ind_oifs_ham%ind_gas_HAM(JGAS)) = PTENC(JL,JK,KAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))) + END IF + + END if + END DO + END DO +END DO +!cloud +DO JCLOUD=1,2 !CDNC and ICNC + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZXTM1(JL,JK,ind_oifs_ham%ind_cloud_HAM(JCLOUD)) = ZCEN(JL,JK,KAERO(ind_oifs_ham%ind_cloud_OIFS(JCLOUD))) + ZXTTE(JL,JK,ind_oifs_ham%ind_cloud_HAM(JCLOUD)) = PTENC(JL,JK,KAERO(ind_oifs_ham%ind_cloud_OIFS(JCLOUD))) + END DO + END DO +END DO + +! implementation of HAM-M7 +ZWND(:) = 0._JPRB +DO JL=KIDIA,KFDIA + ZWND(JL)=MAX(1.0E-10_JPRB,PAERWS(JL)) ! make threshold for wind speed + ! Compute average fluxes over tiles + DO JTILE=1,KTILES + ZAHFSM(JL)=ZAHFSM(JL)+PFRTI(JL,JTILE)*PAHFSTI(JL,JTILE) + ENDDO +ENDDO +! --> calling the correct microphysics scheme depending on setup + +SELECT CASE (TRIM(AERO_SCHEME)) + CASE ("tm5m7") + + + !alaak: commented out because model crashes + !kg(air)-1 to cm-3 + !!$ + !do JK =1,KLEV + ! do JL =KIDIA,KFDIA + ! ZAIRDM(JL) = (7.24291E16_JPRB*PRSF1(JL,JK)/PTP(JL,JK)) * RMD + ! !end do + ! DO JMOD=1,NMOD + ! ZAERNL(JL,JK,JMOD)=MAX(PAEROP(JL,JK,MODE_START(JMOD))/ZAIRDM(JL),0.0_JPRB) + ! END DO + ! + ! end do + !end do + +!!$ DO JMOD=1,NMOD +!!$ DO JAERCLASS=1,NAERMOD +!!$ IF (MODE_TRACERS_BY_MODS(JAERCLASS,JMOD)>0) THEN +!!$ ZAERML(KIDIA:KFDIA,1:KLEV,JAERCLASS)=ZCEN(KIDIA:KFDIA,1:KLEV,MODE_TRACERS_BY_MODS(JAERCLASS,JMOD)) +!!$ END IF +!!$ END DO +!!$ END DO +!!$ +!!$ call M7(KIDIA , KFDIA , KLON , KLEV , & +!!$ ! & KFLDX, KLEVX, KTRAC , KAERO , KCHEM, & +!!$ PRSF1,ZRH,PTP,& +!!$ ZSO4G,ZELVOC, ZSVOC,ZAERML,ZAERNL,& +!!$ ZRHOP,ZWW,ZM6RP,ZM6DRY,& +!!$ PTSPHY) + + CASE("hamm7") + + ! Initializations for submodel interface + ZGRVOL(KIDIA:KFDIA,1:KLEV) = 1.79e12_JPRB ! ZGRVOL is only used for diagnostics (only when HAMMOZ is on) + ZPBL = 1 ! boundary layer top = 1 (ITOP=1) + ! Allocate variables for aerosol processes + ALLOCATE(ZW(KLON,KLEV,nw)) + ALLOCATE(ZWPDF(KLON,KLEV,nw)) + !IF (.NOT. ALLOCATED(w_large)) ALLOCATE(w_large(KLON,KLEV,ZKROW)) + !IF (.NOT. ALLOCATED(w_turb)) ALLOCATE(w_turb(KLON,KLEV,ZKROW)) + ALLOCATE(ZRC(KLON,KLEV,nclass,nw)) + ALLOCATE(ZSMAX(KLON,KLEV,nw)) + !IF (.NOT. ALLOCATED(reffi)) ALLOCATE(reffi(KLON,KLEV,ZKROW)) + !IF (.NOT. ALLOCATED(reffl)) ALLOCATE(reffl(KLON,KLEV,ZKROW)) + DO IMODE=1,NMOD + ALLOCATE(RW_MODE (IMODE)%d2(KLON,KLEV)) + ALLOCATE(DENS_MODE(IMODE)%d2(KLON,KLEV)) + ENDDO + DO IMODE=1,NMOD + IF (sizeclass(IMODE)%lsoluble) THEN + ALLOCATE(RWD_MODE(IMODE)%d2(KLON,KLEV)) + ALLOCATE(H2O_MODE(IMODE)%d2(KLON,KLEV)) + END IF + ENDDO + ! End allocate variables for aerosol processes + + + !----------------------------------------------------------------- + ! Submodel interface call (HAM aerosol microphysics) + + ! changes to particles: + ! Update SO4ACS and SO4OCS tendencies to include the contribution from wet chemistry + IF (LAERCHEM) THEN + ZTAEROK(KIDIA:KFDIA,1:KLEV,ISO4ACS)=ZTAEROK(KIDIA:KFDIA,1:KLEV,ISO4ACS)+PCHEM2AER(KIDIA:KFDIA,1:KLEV,2) + ZTAEROK(KIDIA:KFDIA,1:KLEV,ISO4COS)=ZTAEROK(KIDIA:KFDIA,1:KLEV,ISO4COS)+PCHEM2AER(KIDIA:KFDIA,1:KLEV,3) + END IF + CALL GSTATS(2501,0) + + CALL HAM_SUBM_INTERFACE(KFDIA, KLON, KLEV, ZKROW, & !dimension indices + ntrac, PRSF1, PRS1, & !number of tracers, pressure full levels, pressure half levels + PTP, ZQP, ZQSAT, & !temperature, specific humidity, saturation spec. hum. + ZXTM1, ZXTTE, & !tracer mass/number mr, tracer tendencies + ZM6RP, ZM6DRY, ZRHOP, ZWW, & !mean mode actual radius [m], dry radius for soluble modes [m], mean mode particle density [kg m-3], aerosol water content for each mode [kg(water)-3(air)] + ZAP, ZGRVOL, & !cloud fraction, grid box volume (only for diagnostics) + ZPBL, zout3) !boundary layer top level, outputs + +!!!REAL(KIND=JPRB) :: zm6rp(kbdim,klev,nclass), & ! mean mode actual radius (wet for soluble and dry for insoluble modes) [cm] +!!! zm6dry(kbdim,klev,nsol), & ! dry radius for soluble modes [cm] +!!! zrhop(kbdim,klev,nclass), & ! mean mode particle density [g cm-3] +!!! zww(kbdim,klev,nclass) & ! aerosol water content for each mode [kg(water) m-3(air)] + CALL GSTATS(2501,1) + + ! updating wet and dry radii, aerosol density and water content + DO IMODE=1,NMOD + RW_MODE(IMODE)%d2(KIDIA:KFDIA,1:KLEV)=ZM6RP(KIDIA:KFDIA,1:KLEV,IMODE) ! m ( , KLEV, NMOD) + DENS_MODE(IMODE)%d2(KIDIA:KFDIA,1:KLEV)=ZRHOP(KIDIA:KFDIA,1:KLEV,IMODE) ! kg/m3 + ENDDO + DO IMODE=1,NMOD + IF (sizeclass(IMODE)%lsoluble) THEN + RWD_MODE(IMODE)%d2(KIDIA:KFDIA,1:KLEV) = ZM6DRY(KIDIA:KFDIA,1:KLEV,IMODE) ! m + H2O_MODE(IMODE)%d2(KIDIA:KFDIA,1:KLEV) = ZWW(KIDIA:KFDIA,1:KLEV,IMODE) ! ? + END IF + ENDDO + !----------------------------------------------------------------- + + + !----------------------------------------------------------------- + CALL GSTATS(2502,0) + + !---calculate updraft velocity + ZTKEM1(KIDIA:KFDIA,1:KLEV) = 0._JPRB ! turbulent kinetic energy as zero for now as it is not used (YET!) + ZWCAPE(KIDIA:KFDIA) = 0._JPRB ! CAPE as zero as it is not used + + CALL activ_updraft(KFDIA, KLON, KLEV, ZKROW, & ! krow = 1 + ZTKEM1, ZWCAPE, PVERVEL, ZRHO, & ! turbulent kinetic energy, CAPE contr. to conv. vert. veloc. [m s-1], large scale vert. veloc. + ZW, ZWPDF) + + IF (ncd_activ == 2 .OR. nccndiag > 0) THEN + CALL ham_activ_koehler_ab(KFDIA, KLON, KLEV, ZKROW, KTDIA, & ! krow=1 ktdia=1 + ZXTM1, PTP, ZA, ZB) + END IF + + DO JCLASS = 1,nclass + IF (sizeclass(jclass)%lsoluble) THEN + + !ZRDRY(KIDIA:KFDIA,1:KLEV,JCLASS) = rdry_m7(KIDIA:KFDIA,1:KLEV,JCLASS) !eehol: for soluble modes rdry from rdry_m7 + ZRDRY(KIDIA:KFDIA,1:KLEV,JCLASS) = ZM6DRY(KIDIA:KFDIA,1:KLEV,JCLASS) !eehol: for soluble modes rdry from rdry_m7 + ELSE + !ZRDRY(KIDIA:KFDIA,1:KLEV,JCLASS) = rwet_m7(KIDIA:KFDIA,1:KLEV,JCLASS) !eehol: for insoluble modes rdry from rwet_m7 + ZRDRY(KIDIA:KFDIA,1:KLEV,JCLASS) = ZM6RP(KIDIA:KFDIA,1:KLEV,JCLASS) !eehol: for insoluble modes rdry from rwet_m7 + END IF + END DO + + !calculate saturation water vapor pressure from saturation specific humidity + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZESW(JL,JK)=(ZQSAT(JL,JK)*PRSF1(JL,JK))/(0.62198_JPRB) + ENDDO + ENDDO + + CALL ham_activ_abdulrazzak_ghan(KFDIA, KLON, KLEV, ZKROW, KTDIA, & ! in original 1 = ktdia... for diagnostics so krow=1 and ktdia=1 + ZCDNCACT, ZESW, ZRHO, & ! number of activated particles, saturation vapor pressure, air density + ZXTM1, PTP, PRSF1, ZQP, & ! tracer mix rat, temperature, air pressure, spec. humid. + ZW, ZWPDF, ZA, ZB, ZRDRY, & ! mean udr veloc, pdf of udr. veloc, Koehler A, Koehler B, dry radius + ZNACT, ZFRACN, ZSC, ZRC, ZSMAX) ! num. act. part., frac ", crit. ssat., crit. radius, max ssat + CALL GSTATS(2502,1) + + !<-- End activation for HAM-M7 + !----------------------------------------------------------------- + + + !<-- Store CDNC (number of activated particles) and ICNC as a number mixing ratio to tracer values and to PGFL fields + ZXTM1(KIDIA:KFDIA,1:KLEV,idt_cdnc) = ZCDNCACT(KIDIA:KFDIA,1:KLEV)/ZRHO(KIDIA:KFDIA,1:KLEV) ! [#/kg] + ZXTM1(KIDIA:KFDIA,1:KLEV,idt_icnc) = (1.0E6_JPRB)*ZICNC(KIDIA:KFDIA,1:KLEV)/ZRHO(KIDIA:KFDIA,1:KLEV) !ice crystal number conc = #/cm3 --> number mix rat [#/kg] + + PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH) = (1.0E-6_JPRB)*ZCDNCACT(KIDIA:KFDIA,1:KLEV) ! add CDNC to PGFL field (convert from #/m3 to #/cm3) + PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH) = ZICNC(KIDIA:KFDIA,1:KLEV) ! add ICNC to PGFL field (does not need convert) + !--> End store CDNC and ICNC + + + !----------------------------------------------------------------- + !--> Calculation for effective radii and put to PGFL fields + + ! put default values for effective radii + reffl(KIDIA:KFDIA,1:KLEV,ZKROW) = 4._JPRB ! comes from liquid effective radius routine (PP_MIN_RE_UM) + reffi(KIDIA:KFDIA,1:KLEV,ZKROW) = 80._JPRB*0.64952_JPRB ! comes from ice effective radius routine (ZDEFAULT_RE_UM) + + ! liquid effective radius + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZTMPA = 1.0_JPRB/MAX(ZAP(JL,JK),ZEPSEC) + LLIQCLD(JL,JK) = ( PLP(JL,JK)*ZTMPA ) > ZEPSEC ! logical for liquid cloud + LICECLD(JL,JK) = ( PIP(JL,JK)*ZTMPA ) > ZEPSEC ! logical for ice cloud + ZQLWP(JL,JK) = PLP(JL,JK)/MAX(ZAP(JL,JK),1.E-10_JPRB) ! calculate lwp + ZQLWP(JL,JK) = MIN(MAX(ZQLWP(JL,JK),0.0_JPRB),RCLDMAX) ! treshold lwp + ! effective radius calculated similarly as in radlswr.F90 + ! 2.387e-10 is 3/(4*pi*rho_liq*10^6) [10^6 for N in right units] + ZRE_LIQ(JL,JK) = 1.E+06_JPRB*(2.387e-10_JPRB*ZRHO(JL,JK)*ZQLWP(JL,JK)/(MAX(PGFL(JL,JK,YCDNC%MP9_PH),10._JPRB)))**0.333_JPRB ! calculate effective radius in um (use minimum value for CDNC if CDNC is small) + END DO + END DO + + reffl(KIDIA:KFDIA,1:KLEV,ZKROW) = MERGE(ZRE_LIQ(KIDIA:KFDIA,1:KLEV),4._JPRB,LLIQCLD(KIDIA:KFDIA,1:KLEV)) ! add liq. eff. rad. to HAM variables (only if there is liquid cloud else minimum value) + CALL ICE_EFFECTIVE_RADIUS(YRERAD, YDSPP_CONFIG, KIDIA, KFDIA, KLON, KLEV, & + & PRSF1, PTP, ZAP, PIP, PSP, PGEMU, & ! pressure, temp, cloud fr., IWC, SWC, sine of latitude + & reffi(1:KLON,1:KLEV,ZKROW)) ! ice effective radius (updated to mo_activ variable 'reffi' which used in mo_ham_wetdep) + + reffi(KIDIA:KFDIA,1:KLEV,ZKROW) = MERGE(reffi(KIDIA:KFDIA,1:KLEV,ZKROW),20._JPRB,LICECLD(KIDIA:KFDIA,1:KLEV)) ! only if there is ice cloud else minimum value + + ! add effective radii to PGFL fields + PGFL(KIDIA:KFDIA,1:KLEV,YRE_LIQ%MP9_PH) = 1.0E-06_JPRB * reffl(KIDIA:KFDIA,1:KLEV,ZKROW) ! convert um to meters and save to PGFL fields + PGFL(KIDIA:KFDIA,1:KLEV,YRE_ICE%MP9_PH) = 1.0E-06_JPRB * reffi(KIDIA:KFDIA,1:KLEV,ZKROW) ! convert um to meters and save to PGFL fields + + !<-- End calculation for effective radii + !----------------------------------------------------------------- + + + !--- Mass conserving correction of negative tracer values: + CALL xt_borrow(KFDIA, KLON, KLEV, KLEV+1, ntrac, & + PRSF1, PRS1, & + ZXTM1, ZXTTE) + + + !----------------------------------------------------------------- + !--> Wet deposition for HAM-M7 + CALL GSTATS(2503,0) + + IF ( LAERSCAV ) THEN + + !--> initialize mixing ratios for wet deposition + !-- initialise in-cloud and interstitial mixing ratios + ! set both equal to tracer mixing ratio as starting point + ! ham_wet_chemistry will re-compute these values if lham=true + DO JT = 1,ntrac + + ZXTP1(KIDIA:KFDIA,1:KLEV,JT) = ZXTM1(KIDIA:KFDIA,1:KLEV,JT) + ZXTTE(KIDIA:KFDIA,1:KLEV,JT) * time_step_len + ZXTP1C(KIDIA:KFDIA,1:KLEV,JT) = ZXTP1(KIDIA:KFDIA,1:KLEV,JT) + ZXTP10(KIDIA:KFDIA,1:KLEV,JT) = ZXTP1(KIDIA:KFDIA,1:KLEV,JT) + + END DO + + !<-- call wetdep interface for wet deposition + !-- interface to wet deposition routine (also from cuflx_subm) + IF ( lwetdep .AND. ANY(trlist%ti(:)%nwetdep > 0) ) THEN + + ! for calculating the rain and snow evaporation/formation variables used in wet deposition + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZFLXR=PFPLCL(JL,JK-1) + ZFLXS=PFPLCN(JL,JK-1) + ZFLXRB=PFPLCL(JL,JK) + ZFLXSB=PFPLCN(JL,JK) + IF (PCOVPTOT(JL,JK) > 1e-40_JPRB) THEN + ZMRATEPR(JL,JK) = ( ZFLXRB-ZFLXR ) / PCOVPTOT(JL,JK) + ZMRATEPS(JL,JK) = ( ZFLXSB-ZFLXS ) / PCOVPTOT(JL,JK) + !same formula negatives/positives for evap or formation + ZFEVAPR(JL,JK) = ( ZFLXRB-ZFLXR ) / PCOVPTOT(JL,JK) + ZFSUBLS(JL,JK) = ( ZFLXSB-ZFLXS ) / PCOVPTOT(JL,JK) + ELSE + ZMRATEPR(JL,JK) = 0.0_JPRB + ZMRATEPS(JL,JK) = 0.0_JPRB + !same formula negatives/positives for evap or formation + ZFEVAPR(JL,JK) = 0.0_JPRB + ZFSUBLS(JL,JK) = 0.0_JPRB + END IF + END DO + END DO + ZMSNOWACL(KIDIA:KFDIA,1:KLEV) = ZMRATEPS(KIDIA:KFDIA,1:KLEV) !? + + ZDUMMY(KIDIA:KFDIA,:) = 0._JPRB ! initialize dummy variables for conv. case only + ZDUM2D(KIDIA:KFDIA,1:KLEV) = 0._JPRB ! initialize dummy variables for conv. case only + ZDUM3D(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB ! initialize dummy variables for conv. case only + ZLFRAC_SO2(KIDIA:KFDIA,1:KLEV) = 0._JPRB ! zlfrac_so2 only needed in gas scavenging and this is off for now (put this zero) + + ZLP(KIDIA:KFDIA,1:KLEV) = PLP(KIDIA:KFDIA,1:KLEV) ! temporary variable for cloud water content (modified in wetdep) + ZIP(KIDIA:KFDIA,1:KLEV) = PIP(KIDIA:KFDIA,1:KLEV) ! temporary variable for cloud ice water content (modified in wetdep) + ZTENCIH(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB + ZTENCIH(KIDIA:KFDIA,1:KLEV,1:ntrac)=ZXTTE(KIDIA:KFDIA,1:KLEV,1:ntrac) + IF (.NOT.LAERCHEM)THEN + call ham_conv_lfraq_so2(KFDIA,KLON,KLEV,PTP,zxtm1,zrho,ZLP,zlfrac_so2) + END IF +!<<<<<<< HEAD:src/ifs/phys_ec/tm5m7.F90 + CALL wetdep_interface(KFDIA, KLON, KLEV, 1, ZKROW, LSTRAT, & !eehol: ktop = 1 (top level index), lstrat = TRUE for strat. case + ZDPG, ZMRATEPR, ZMRATEPS, ZMSNOWACL, & !eehol: dp/g, evap. of rain, subl. of snow, accr. rate of snow with cl. drop in-cl. + ZLP, ZIP, & !eehol: cloud water content, cloud ice water content + ZM6RP, ZM6DRY, & ! m7 aerosol: to replace rwet_m7, dry radius for soluble modes [cm] + reffi, reffl, & ! m7 aerosol + ZNACT, ZFRACN, & + PTP, ZXTM1, ZLFRAC_SO2, ZXTTE, ZXTP10, ZXTP1C, & !eehol: temperature, zlfrac_so2 only needed in gas scavenging (0 for now) + PFPLSL, PFPLSN, ZFEVAPR, ZFSUBLS, & !eehol: rain flux, snow flux, + ZDUM2D, ZDUM3D, & !eehol: as zero as these are not needed in strat. case + ZAP, PCOVPTOT, ZRHO, ZDUMMY) !eehol: cloud frac., precip. frac., air dens. +! do JK=1,kLEV +! wdepout_2D(KIDIA:KFDIA,:)=wdepout_2D(KIDIA:KFDIA,:)+(ZTENCIH(KIDIA:KFDIA, JK,:)-ZXTTE(KIDIA:KFDIA, JK,:))!/RG*ZDP(KIDIA:KFDIA,JK) +! END do +!======= + +! CALL wetdep_interface(KFDIA, KLON, KLEV, 1, ZKROW, LSTRAT, & ! ktop = 1 (top level index), lstrat = TRUE for strat. case +! ZDPG, ZMRATEPR, ZMRATEPS, ZMSNOWACL, & ! dp/g, evap. of rain, subl. of snow, accr. rate of snow with cl. drop in-cl. +! ZLP, ZIP, & ! cloud water content, cloud ice water content +! PTP, ZXTM1, ZLFRAC_SO2, ZXTTE, ZXTP10, ZXTP1C, & ! temperature, zlfrac_so2 only needed in gas scavenging (0 for now) +! PFPLSL, PFPLSN, ZFEVAPR, ZFSUBLS, & ! rain flux, snow flux, +! ZDUM2D, ZDUM3D, & ! as zero as these are not needed in strat. case +! ZAP, PCOVPTOT, ZRHO, ZDUMMY) ! cloud frac., precip. frac., air dens. + + DO JMASS=1,naerocomp + + wdepout_2D(KIDIA:KFDIA,KAERO(ind_oifs_ham%ind_mass_OIFS(JMASS)))=wdepout_2D(KIDIA:KFDIA,KAERO(ind_oifs_ham%ind_mass_OIFS(JMASS)))+ZDUMMY(KIDIA:KFDIA,ind_oifs_ham%ind_mass_ham(JMASS)) + END DO + + DO JCLASS=1,nclass + + wdepout_2D(KIDIA:KFDIA,KAERO(ind_oifs_ham%ind_class_OIFS(JCLASS)))=wdepout_2D(KIDIA:KFDIA,KAERO(ind_oifs_ham%ind_class_OIFS(JCLASS)))+ZDUMMY(KIDIA:KFDIA, ind_oifs_ham%ind_class_ham(JCLASS)) + + END DO + +!>>>>>>> origin/feature/knmi-chem:src/ifs/phys_ec/hamm7_interface.F90 + END IF + END IF + CALL GSTATS(2503,1) + + !<-- End wet deposition for HAM-M7 + !----------------------------------------------------------------- + + + !--- Mass conserving correction of negative tracer values: + CALL xt_borrow(KFDIA, KLON, KLEV, KLEV+1, ntrac, & + PRSF1, PRS1, & + ZXTM1, ZXTTE) + + + !----------------------------------------------------------------- + !--> Sedimentation for HAM-M7 + CALL GSTATS(2504,0) + + !!!rwet_m7(1:kproma,:,:) = pm6rp(1:kproma,:,:)/100._dp + !!!rdry_m7(1:kproma,:,:) = pm6dry(1:kproma,:,:)/100._dp + !!!densaer_m7(1:kproma,:,:) = prhop(1:kproma,:,:)*1000._dp !eehol: g/cm3 to kg/m3 + !!!aerwat_m7(1:kproma,:,:) = pww(1:kproma,:,:) + IF (LAERSEDIM) THEN + + IF ( lsedimentation .AND. ANY(trlist%ti(:)%nsedi > 0) ) THEN + + ZTENCIH(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB + ZTENCIH(KIDIA:KFDIA,1:KLEV,1:ntrac)=ZXTTE(KIDIA:KFDIA,1:KLEV,1:ntrac) + + CALL sedi_interface(KLON, KFDIA, KLEV, ZKROW, & + PTP, ZQP, PRSF1, PRS1, & !eehol: temperature, specific humidity, pressure at full level, pressure at half level + ZM6RP, ZRHOP, & !mean mode actual radius [m], mean mode particle density [kg m-3] + ZXTM1, ZXTTE, ZSEDIFLUX) !eehol: tracer mixing ratios and tendency (sediflux for diagnostics) + + SEDOUT(KIDIA:KFDIA, 1:KLEV,:)=(ZTENCIH(KIDIA:KFDIA, 1:KLEV,:)-ZXTTE(KIDIA:KFDIA, 1:KLEV,:)) + DO JK=1,KLEV + do JCLASS=1,nclass + SEDOUT_2D(KIDIA:KFDIA,KAERO(ind_oifs_ham%ind_class_OIFS(JCLASS)))=SEDOUT_2D(KIDIA:KFDIA,KAERO(ind_oifs_ham%ind_class_OIFS(JCLASS))) + ZSEDIFLUX(KIDIA:KFDIA, JK,ind_oifs_ham%ind_class_HAM(JCLASS)) + end do + do JMASS=1,naerocomp + SEDOUT_2D(KIDIA:KFDIA,KAERO(ind_oifs_ham%ind_mass_OIFS(JMASS)))=SEDOUT_2D(KIDIA:KFDIA,KAERO(ind_oifs_ham%ind_mass_OIFS(JMASS))) + ZSEDIFLUX(KIDIA:KFDIA,JK,ind_oifs_ham%ind_mass_HAM(JMASS)) + end do + end DO + END IF + + ENDIF + CALL GSTATS(2504,1) + + !<-- End sedimentation for HAM-M7 + !----------------------------------------------------------------- + + + !--- Mass conserving correction of negative tracer values: + CALL xt_borrow(KFDIA, KLON, KLEV, KLEV+1, ntrac, & + PRSF1, PRS1, & + ZXTM1, ZXTTE) + + + + !----------------------------------------------------------------- + !--> Dry deposition for HAM-M7 + IF (.NOT.LAERSURF) THEN + PAERDDP(:,:) =0._JPRB + ELSEIF (LAERSURF) THEN + + !* DRY DEPOSITION INCLUDED AS MODIFICATION TO SURFACE FLUXES + ! --------------------------------------------------------- + CALL GSTATS(2505,0) + + IF (LAERDRYDP) THEN + + !--> variables not needed for aerosol dry deposition + ZCFML(:) = 0._JPRB + ZCFMW(:) = 0._JPRB + ZCFMI(:) = 0._JPRB + ZCFNCL(:) = 0._JPRB + ZCFNCW(:) = 0._JPRB + ZCFNCI(:) = 0._JPRB + ZEPDU2 = 0._JPRB + ZKAP = 0._JPRB + ZGEOM1(:,:) = 0._JPRB + ZRIL(:) = 0._JPRB + ZRIW(:) = 0._JPRB + ZRII(:) = 0._JPRB + ZTVIR1(:,:) = 0._JPRB + ZTVL(:) = 0._JPRB + ZTVW(:) = 0._JPRB + ZTVI(:) = 0._JPRB + ZAZ0(:) = 0._JPRB + ZFRL(:) = 0._JPRB + ZSRFL(:) = 0._JPRB + ZFOREST(:) = 0._JPRB + ZTSI(:) = 0._JPRB + ZAZ0L(:) = 0._JPRB + ZAZ0I(:) = 0._JPRB + ZCDNI(:) = 0._JPRB + + !--> variables calculated for dry deposition + DO JL = KIDIA,KFDIA + IF ( PLSM(JL) < 0.99_JPRB ) THEN + ZLOLAND(JL) = .FALSE. + ZAZ0W(JL) = PZ0M(JL) + ELSE + ZLOLAND(JL) = .TRUE. + ZAZ0W(JL) = 0._JPRB + END IF + ZAZ0W(JL) = MAX(1.0E-5_JPRB,ZAZ0W(JL)) ! treshold roughness length to min value + ZFRW(JL) = MAX(0.,1.-PLSM(JL)-PCI(JL)) ! water fraction = 1 - land mask - sea ice fraction + ZCVS(JL) = PFRTI(JL,5)+PFRTI(JL,7) ! snow cover fraction = Snow on low-veg + snow on bare-soil + snow under high-veg + ZCVW(JL) = PFRTI(JL,3) ! wet skin fraction + ZVGRAT(JL) = PCVL(JL)+PCVH(JL) ! vegetation ratio = low veg. cover + high veg. cover + ZCDNL(JL) = PAERUST(JL) ! adding ustar to not used variable + ZCDNW(JL)=LOG(ZDZ(JL,KLEV)/PZ0M(JL))/(VKARMAN*PAERUST(JL)) ! calculate aerodyn. resistance on surface to not used variable + END DO + + !--> init values + ZTENCIH(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB + ZTENCIH(KIDIA:KFDIA,1:KLEV,:) = ZXTTE(KIDIA:KFDIA,1:KLEV,:) ! init tendency before drydep + ZXTEMS(KIDIA:KFDIA,:) = 0._JPRB ! surface emissions as zero for input + ZXTMD1(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB + ZXTMD1(KIDIA:KFDIA,1:KLEV,:) = ZXTM1(KIDIA:KFDIA,1:KLEV,:) + (ZTENCIH(KIDIA:KFDIA,1:KLEV,:) * time_step_len) ! update mixrat with tendency + ZVDEP(KIDIA:KFDIA,:) = 0._JPRB ! ddep velocity as zero + + CALL drydep_interface(KLON, KFDIA, KLEV, ZKROW, & + ZQP(:,KLEV), ZQSAT(:,KLEV), PTP(:,KLEV), ZCFML, ZCFMW, ZCFMI, & + ZCFNCL, ZCFNCW, ZCFNCI, & + ZEPDU2, ZKAP, PUP, PVP, ZGEOM1, ZRIL, ZRIW, & + ZRII, & + ZTVIR1, ZTVL, ZTVW, ZTVI, ZAZ0, & + PTP(:,KLEV), ZLOLAND, & + ZM6RP, ZRHOP, & ! M7 + ZFRL, ZFRW, PCI, ZCVS, ZCVW, ZVGRAT, & + ZSRFL, PUP(:,KLEV), PVP(:,KLEV), & !eehol: 10m u and v wind from lowest level.. needs to be revised in future!! + ZXTEMS, ZXTMD1, ZRHO(:,KLEV), PRS1, ZFOREST, ZTSI, & !eehol: air dens lowest, air press at int. + ZAZ0L, ZAZ0W, ZAZ0I, ZCDNL, ZCDNW, ZCDNI, ZDDEPFLUX, ZVDEP) !eehol: ZCDNL and ZCDNW used for ustar and aerodyn. resist. + + + IF (.not. LAERCHEM)THEN + CALL m7_simple_sulfur_drydep(YDMODEL, KIDIA,KFDIA, KLON, KLEV, & + Zxtm1, PCFLX(:,KAERO(1):KAERO(NACTAERO)), & + ZDP, PGEOH, ZRHO, ZXTTE, PTSPHY,& + PSO2DD, PGELAM, & + ZFAERO, Zxtp1, ZDDEPFLUX_SO2) + ZDDEPFLUX(KIDIA:KFDIA,2)=ZDDEPFLUX_SO2(KIDIA:KFDIA) + END IF + + !--> modify tendency at surface according to changes in surface emissions + DO JT = 1,ntrac + DO JL = KIDIA,KFDIA + ZXTTE(JL,KLEV,JT) = ZTENCIH(JL,KLEV,JT) + ((ZXTEMS(JL,JT)*RG)/(ZDP(JL,KLEV))) + END DO + END DO + + ENDIF ! LAERDRYDP + END IF + CALL GSTATS(2505,1) + + !<-- End dry deposition for HAM-M7 + !----------------------------------------------------------------- + + + !--- Mass conserving correction of negative tracer values: + CALL xt_borrow(KFDIA, KLON, KLEV, KLEV+1, ntrac, & + PRSF1, PRS1, & + ZXTM1, ZXTTE) + + + !----------------------------------------------------------------- + !--> Add HAM modified tendency back to PTENC (OIFS values) + + !number + DO JCLASS=1,nclass + PTENC(KIDIA:KFDIA,1:KLEV,KAERO(ind_oifs_ham%ind_class_OIFS(JCLASS))) = ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_class_HAM(JCLASS)) + END DO + !mass + DO JMASS=1,naerocomp + PTENC(KIDIA:KFDIA,1:KLEV,KAERO(ind_oifs_ham%ind_mass_OIFS(JMASS))) = ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_mass_HAM(JMASS)) + END DO + !gas + IF(LAERCHEM) THEN + + DO JGAS=1,subm_ngasspec + PTENC(KIDIA:KFDIA,1:KLEV,KCHEM(ind_oifs_ham%ind_gas_OIFS(JGAS))) = ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_gas_HAM(JGAS)) + END DO + ELSE + DO JGAS=1,subm_ngasspec + PTENC(KIDIA:KFDIA,1:KLEV,KAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))) = ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_gas_HAM(JGAS)) + END DO + END IF + !cloud variables + DO JCLOUD=1,2 !CDNC and ICNC + PTENC(KIDIA:KFDIA,1:KLEV,KAERO(ind_oifs_ham%ind_cloud_OIFS(JCLOUD))) = ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_cloud_HAM(JCLOUD)) + END DO + + !<-- End adding HAM modified tendency back to PTENC + !----------------------------------------------------------------- + + + + CASE DEFAULT + ! this case should never occur, as it is handled in the calling subroutine + CALL ABOR1(" AEROSOL SCHEME "//TRIM(AERO_SCHEME)//" IS NOT HANDLED IN TM5M7" ) + + +END SELECT + +! write flux to extra fields for diagnostic of aerosol 'chemical' conversion +IF (LCHEM_DIA) THEN + + CALL CHEM_INEXT( KIDIA , KFDIA , KLON , KLEV , 1, 1, & + & ZDP, PTSPHY, ZTSO4,ZTENC0,PEXTRA(:,ISO4_C,IEXTR_CH)) + +END IF + + +!* 4. ELIMINATION OF NEGATIVE PROGNOSTIC AEROSOL CONCENTRATIONS +! --------------------------------------------------------- + +IF (LAERNGAT) THEN + + IF (LCHEM_DIA) THEN + ZTAERO0(KIDIA:KFDIA,1:KLEV,1:NACTAERO) = ZTAEROK(KIDIA:KFDIA,1:KLEV,1:NACTAERO) + ENDIF + + DO JAER=1,NACTAERO + + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZAER(JL,JK) = ZCEN(JL,JK,KAERO(JAER)) + ZTAER(JL,JK)= PTENC(JL,JK,KAERO(JAER)) + ENDDO + ENDDO + + CALL AER_NEGAT & + & ( KIDIA , KFDIA, KLON , KLEV, & + & PTSPHY , & + & ZAER , ZTAER, PRS1, & + & ZAERNEG ) + + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZTAERO(JL,JK,JAER)=ZTAER(JL,JK) + ENDDO + ENDDO + DO JL=KIDIA,KFDIA + ZAERNGT(JL,JAER)=ZAERNEG(JL,KLEV) + ENDDO + + ENDDO + +! collect neg fix tendencies +IF (LCHEM_DIA) THEN + CALL CHEM_INEXT( KIDIA , KFDIA , KLON , KLEV , NACTAERO, NACTAERO , & + & ZDP, PTSPHY, ZTAERO ,ZTAERO0, PEXTRA(:,NCHEM+1:NCHEM+NACTAERO,IEXTR_NG)) +ENDIF + + +! do not fix the tendencies for now, number concentration fixes will break the +! correlation between mass and number + PTENC(KIDIA:KFDIA,1:KLEV,KAERO(1):KAERO(NACTAERO)) = ZTAERO(KIDIA:KFDIA,1:KLEV,1:NACTAERO) + +!ELSE +! ZAERNGT(:,:)=0._JPRB +ENDIF + +!------------------------------------------------------------------------------ +!* 7. STORE ALL AEROSOL VERTICALLY INTEGRATED FLUXES +! ---------------------------------------------- + +DO JAER=1,NACTAERO + DO JL=KIDIA,KFDIA + PAERODDF(JL,JAER,1)=PAERSRC(JL,JAER) !aerosol so4 source term + PAERODDF(JL,JAER,2)=PAERDDP(JL,JAER) ! aerosol dry deposition + PAERODDF(JL,JAER,3)=PAERSDM(JL,JAER) ! aerosol sedimentation + PAERODDF(JL,JAER,4)=0.0!ZAERSCL(JL,JAER) ! so2 sink added to scavenging + PAERODDF(JL,JAER,5)=0.0!ZAERSCC(JL,JAER) ! scavenging (in-cloud & below cloud) so wet deposition + PAERODDF(JL,JAER,6)=ZAERNGT(JL,JAER) + PAERODDF(JL,JAER,7)=0.0!ZAERTAUT(JL,JAER,1) !total AOD? + ENDDO +ENDDO + +!----------------------------------------------------------------------- + + +!* 5. OPTICAL DEPTH +! -------------------------------------------------- +!calculate optical properties only when radiation is calculated +!radiation is calculated before microphysics -> nstep+1 + +INWAVL = 20 +ITWAVL( 1)= 9 ! 550 nm +ITWAVL( 2)= 1 ! 340 nm +ITWAVL( 3)= 2 ! 355 nm +ITWAVL( 4)= 3 ! 380 nm +ITWAVL( 5)= 4 ! 400 nm +ITWAVL( 6)= 5 ! 440 nm +ITWAVL( 7)= 6 ! 469 nm +ITWAVL( 8)= 7 ! 500 nm +ITWAVL( 9)= 8 ! 532 nm +ITWAVL(10)=10 ! 645 nm +ITWAVL(11)=11 ! 670 nm +ITWAVL(12)=12 ! 800 nm +ITWAVL(13)=13 ! 858 nm +ITWAVL(14)=14 ! 865 nm +ITWAVL(15)=15 ! 1020 nm +ITWAVL(16)=16 ! 1064 nm +ITWAVL(17)=17 ! 1240 nm +ITWAVL(18)=18 ! 1640 nm +ITWAVL(19)=19 ! 2130 nm +ITWAVL(20)=20 ! 10 microns + + + +IBLK=(KSTGLO-1)/KLON + 1 + + +DO JK=1,KLEV + DO JL=KIDIA,KFDIA + DO JAER=1,14 + PAER_TAU(JL,JK,JAER) = YDAERM7%M7AOD(JL,JK,JAER,IBLK) + PAER_SSA(JL,JK,JAER) = YDAERM7%M7SSA(JL,JK,JAER,IBLK) + PAER_ASYM(JL,JK,JAER ) = YDAERM7%M7ASYM(JL,JK,JAER,IBLK) + ENDDO + DO JAER=1,16 + PAER_TAU_LW(JL,JK,JAER)= YDAERM7%M7AODLW(JL,JK,JAER,IBLK) + ENDDO + ENDDO +ENDDO + + +IF(MOD(NSTEP+1,NRADFR) == 0) THEN +CALL GSTATS(2506,0) +ZAER_TAU(KIDIA:KFDIA,:,:,:)=0.0_JPRB +ZAER_SSA(KIDIA:KFDIA,:,:)=0.0_JPRB +ZAER_ASYM(KIDIA:KFDIA,:,:)=0.0_JPRB +ZAER_TAU_LW(KIDIA:KFDIA,:,:)=0.0_JPRB + + + +SELECT CASE (NAEROOPT) + +CASE (0) + + ! Optical properties is not calculated + +CASE (1) + ! Use TM5 codes to calculate optical properties (optical properties for LW = 0) + !--> Add HAM updated tendency to ZTAERO and use that in optics + ZTAERO(:,:,:) = 0._JPRB + DO JAER=1,NACTAERO + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZTAERO(JL,JK,JAER)= PTENC(JL,JK,KAERO(JAER)) + ENDDO + ENDDO + ENDDO + CALL TM5M7_OPTICS_AOP_GET(KIDIA,KFDIA, KLON, KLEV,NACTAERO, & + & NASWBAND, ASWBAND, 1, .false., & + & ZRHO, ZAEROK+(ZTAERO*time_step_len),RW_MODE,RWD_MODE,H2O_MODE,& + & ZAER_TAU, ZAER_SSA, ZAER_ASYM) + + PAOD(KIDIA:KFDIA,:)=0._JPRB + do JK = 1, KLEV + do JL = KIDIA,KFDIA + do IW=1,NASWBAND + PAER_TAU(JL,JK,IW)=ZAER_TAU(JL,JK,IW,1)*(PGEOH(JL,JK-1) - PGEOH(JL,JK)) + PAER_SSA(JL,JK,IW)=ZAER_SSA(JL,JK,IW) + PAER_ASYM(JL,JK,IW)=ZAER_ASYM(JL,JK,IW) + !PAOD(JL,IW)=ZAER_TAU(JL,JK,IW,1)*(PGEOH(JL,JK-1) - PGEOH(JL,JK))+PAOD(JL,IW) + enddo + do IW=1,16 + PAER_TAU_LW(JL,JK,IW)=0.0_JPRB + end do + enddo + enddo + + + + + !I am not sure if the rest is needed + + allocate( Zaop_out_ext( KLON, KLEV, nwdep, 1)) ; Zaop_out_ext = 0.0_JPRB + allocate( Zaop_out_a ( KLON, KLEV, nwdep) ) ; Zaop_out_a = 0.0_JPRB + allocate( Zaop_out_g ( KLON, KLEV, nwdep) ) ; zaop_out_g = 0.0_JPRB + + + allocate(Ztaus_aer (KLON, KLEV,nwdep)); Ztaus_aer = 0.0 + allocate(Ztaua_aer (KLON, KLEV,nwdep)); Ztaua_aer = 0.0 + allocate(Zpmaer (KLON, KLEV,nwdep)); Zpmaer = 0.0 + + do JB=1, nbands_trop + Ptaus_aer(:,:,JB,1) = Ztaus_aer(:,:,wav_grid(JB)) + Ptaua_aer(:,:,JB,1) = Ztaua_aer(:,:,wav_grid(JB)) + Ppmaer (:,:,JB,1) = Zpmaer (:,:,wav_grid(JB)) + + Ptaus_aer(:,:,JB,2) = Ztaus_aer(:,:,wav_gridA(JB)) + Ptaua_aer(:,:,JB,2) = Ztaua_aer(:,:,wav_gridA(JB)) + Ppmaer (:,:,JB,2) = Zpmaer (:,:,wav_gridA(JB)) + enddo + deallocate(Ztaus_aer) + deallocate(Ztaua_aer) + deallocate(Zpmaer) + + Deallocate(Zaop_out_ext) + Deallocate(Zaop_out_a ) + Deallocate(Zaop_out_g ) + +CASE (2) + ! Use HAM codes to calculate optical properties + LWBANDS=16 + PRS1D(KIDIA:KFDIA,:) = PRS1(KIDIA:KFDIA,1:KLEV)-PRS1(KIDIA:KFDIA,0:KLEV-1) + !CALL ham_rad_cache(KLON,KLEV) + CALL ham_rad(KFDIA,KLON, KLEV, ZKROW, LWBANDS, NASWBAND, & + ZXTM1+ZXTTE*time_step_len, PRS1D, & +!<<<<<<< HEAD + ZAER_TAU(:,:,:,1), ZAER_SSA, ZAER_ASYM, ZAER_TAU_LW,ZM6RP) + !CALL ham_rad_cache_cleanup + !PAOD(KIDIA:KFDIA,:)=0._JPRB + do JK = 1, KLEV + do JL = KIDIA,KFDIA + do IW=1,NASWBAND + PAER_TAU(JL,JK,IW)=ZAER_TAU(JL,JK,IW,1)!*(PGEOH(JL,JK-1) - PGEOH(JL,JK)) + PAER_SSA(JL,JK,IW)=ZAER_SSA(JL,JK,IW) + PAER_ASYM(JL,JK,IW)=ZAER_ASYM(JL,JK,IW) + !PAOD(JL,IW)=ZAER_TAU(JL,JK,IW,1)+PAOD(JL,IW) + enddo + do IW=1,16 + PAER_TAU_LW(JL,JK,IW)=ZAER_TAU_LW(JL,JK,IW) + end do + enddo + enddo +!======= +! ZAER_TAU(:,:,:,1), ZAER_SSA, ZAER_ASYM, ZAER_TAU_LW,rwet_m7) +! CALL HAM_RAD_CACHE_CLEANUP +! +! do JK = 1, KLEV +! do JL = KIDIA,KFDIA +! do IW=1,NASWBAND +! PAER_TAU(JL,JK,IW)=ZAER_TAU(JL,JK,IW,1)!*(PGEOH(JL,JK-1) - PGEOH(JL,JK)) +! PAER_SSA(JL,JK,IW)=ZAER_SSA(JL,JK,IW) +! PAER_ASYM(JL,JK,IW)=ZAER_ASYM(JL,JK,IW) +! enddo +! do IW=1,16 +! PAER_TAU_LW(JL,JK,IW)=ZAER_TAU_LW(JL,JK,IW) +! end do +! +! +! enddo +!>>>>>>> origin/feature/fmi-hamm7-bugfixes + +END SELECT + + +CALL GSTATS(2506,1) +ENDIF ! (MOD(NSTEP+1,NRADFR) == 0) + +PAOD(KIDIA:KFDIA,:) =0._JPRB +PABS(KIDIA:KFDIA,:) =0._JPRB +PFAOD(KIDIA:KFDIA,:)=0._JPRB +PSSA(KIDIA:KFDIA,:) =0._JPRB +PASY(KIDIA:KFDIA,:) =0._JPRB +do JK = 1, KLEV + do JL = KIDIA,KFDIA + do IW=1,NASWBAND + PAOD(JL,IW)=PAER_TAU(JL,JK,IW)+PAOD(JL,IW) + PSSA(JL,IW)=PAER_SSA(JL,JK,IW)*PAER_TAU(JL,JK,IW)+PSSA(JL,IW) + PASY(JL,IW)=PAER_ASYM(JL,JK,IW)*PAER_TAU(JL,JK,IW)+PASY(JL,IW) + end do + PSSA(JL,:) =PSSA(JL,:)/PAOD(JL,IW)! AOD average + PASY(JL,:) =PASY(JL,:)/PAOD(JL,IW)! AOD average + end do +end do + + +!------------------------------------------------------------------------------ +!* 6.0 Fill selective aerosol OD fields in structure as available in IFS-AER + +DO JWAVL=1,MIN(INWAVL,NAERO_WVL_DIAG) + DO JL=KIDIA,KFDIA + IF (NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_AOD) THEN + PAERO_WVL_DIAG(JL,JWAVL,JPAERO_WVL_AOD) = PAOD(JL,JWAVL) + ENDIF + IF (NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_AODABS) THEN + PAERO_WVL_DIAG(JL,JWAVL,JPAERO_WVL_AODABS) = PABS(JL,JWAVL)! 0.0 + ENDIF + IF (NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_AODFM) THEN + PAERO_WVL_DIAG(JL,JWAVL,JPAERO_WVL_AODFM) = PFAOD(JL,JWAVL)! 0.0 + ENDIF + IF (NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_SSA) THEN + PAERO_WVL_DIAG(JL,JWAVL,JPAERO_WVL_SSA) = PSSA(JL,JWAVL) + ENDIF + IF (NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_ASSIMETRY) THEN + PAERO_WVL_DIAG(JL,JWAVL,JPAERO_WVL_ASSIMETRY) = PASY(JL,JWAVL) + ENDIF + ENDDO +ENDDO + + + +!* +!* VH - Requires full checking by expert if this makes sense +!* + DO JL=KIDIA,KFDIA + PODTO(JL) =PTAUS_AER(JL,KLEV,1,1) + PODTO469(JL) =PTAUS_AER(JL,KLEV,2,1) + PODTO670(JL) =PTAUS_AER(JL,KLEV,3,1) + PODTO865(JL) =PTAUS_AER(JL,KLEV,4,1) + PODTO1240(JL)=PTAUS_AER(JL,KLEV,5,1) + ENDDO + + +!* 6.1 STORE IN AEROUT-1 +! ------------------------------ + +!-- total instantaneous optical depth + DO JB=1,NBANDS_TROP + DO JL=KIDIA,KFDIA + ZAEROUT1(JL,JB)= PTAUS_AER(JL,KLEV,JB,1) + ZAEROUT1(JL,NBANDS_TROP+JB)= PTAUA_AER(JL,KLEV,JB,1) + ENDDO + ENDDO + +!-- + +!* 6.1 STORE IN AEROUT2-AEROUT4 +! ------------------------------ + +!-- the total extinction coefficient at wavelengths ?? nm is archived in GFL%AEROUT + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZAEROUT2(JL,JK)=PTAUS_AER(JL,JK, 1,1) + ZAEROUT3(JL,JK)=PTAUA_AER(JL,JK, 1,1) + ZAEROUT4(JL,JK)=Ppmaer(JL,JK,1,1) + ENDDO + ENDDO + + + + IF(.NOT.LIFSMIN .AND. .NOT.LIFSTRAJ) THEN + ! input for HAM-M7 + PGFL(KIDIA:KFDIA,1,YAEROUT(1)%MP)=PAOD(KIDIA:KFDIA,10)!PAER_TAU(KIDIA:KFDIA,1:KLEV,10) !533nm + do JK=1,KLEV + + PGFL(KIDIA:KFDIA,2,YAEROUT(1)%MP)= PGFL(KIDIA:KFDIA,2,YAEROUT(1)%MP)+PAER_SSA(KIDIA:KFDIA,JK,10)!PAER_TAU(KIDIA:KFDIA,1:KLEV,10) !533nm + PGFL(KIDIA:KFDIA,3,YAEROUT(1)%MP)= PGFL(KIDIA:KFDIA,3,YAEROUT(1)%MP)+PAER_ASYM(KIDIA:KFDIA,JK,10)!PAER_TAU(KIDIA:KFDIA,1:KLEV,10) !533nm + end do + PGFL(KIDIA:KFDIA,1:14,YAEROUT(12)%MP)=PAOD(KIDIA:KFDIA,1:14) + + do JN=1,naerocomp!ntrac!NACTAERO + PGFL(KIDIA:KFDIA,ind_oifs_ham%ind_mass_OIFS(JN),YAEROUT(2)%MP)=ZDDEPFLUX(KIDIA:KFDIA,ind_oifs_ham%IND_mass_HAM(JN)) + end do + do JN=1,nclass + PGFL(KIDIA:KFDIA,ind_oifs_ham%ind_class_OIFS(JN),YAEROUT(2)%MP)=ZDDEPFLUX(KIDIA:KFDIA,ind_oifs_ham%IND_class_HAM(JN)) + end do + do JN=1,NACTAERO!ktrac + + if ( NSTEP==10)then + do JL=KIDIA,KFDIA + write(3345,*)JN,WDEPOUT_2D(JL,KAERO(JN)) + end do + end if + + PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(3)%MP)=WDEPOUT_2D(KIDIA:KFDIA,KAERO(JN)) + + end do + do JN=1,NACTAERO!ktrac + PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(4)%MP)=SEDOUT_2D(KIDIA:KFDIA,KAERO(JN)) + end do + do JN=1,NACTAERO!KTRAC + PGFL(KIDIA:KFDIA,JN,YAEROUT(5)%MP)=ZAERSRC(KIDIA:KFDIA,KAERO(JN)) + end do + PGFL(KIDIA:KFDIA,1,YAEROUT(6)%MP)=PAERFLX(KIDIA:KFDIA,3,9) + PGFL(KIDIA:KFDIA,:,YAEROUT(7)%MP)=0.0_JPRB + ! 1=TOtal SO4 not in use + ! 2 Ammonium not in use + ! 3 Nitrate not in use + do JK=1,KLEV + ! save load for each N/M as one level + ! kg/kg -> kg/m2 N/kg-> N/m2 + + do JN=1,naerocomp!ntrac!NACTAERO + PGFL(KIDIA:KFDIA,ind_oifs_ham%ind_mass_OIFS(JN),YAEROUT(7)%MP)=PGFL(KIDIA:KFDIA,ind_oifs_ham%ind_mass_OIFS(JN),YAEROUT(7)%MP) + (ZXTM1(KIDIA:KFDIA,JK,ind_oifs_ham%IND_mass_HAM(JN))+(ZXTTE(KIDIA:KFDIA,JK,ind_oifs_ham%IND_mass_HAM(JN))*time_step_len)) * ZDPG(KIDIA:KFDIA,JK) + end do + do JN=1,nclass + PGFL(KIDIA:KFDIA,ind_oifs_ham%ind_class_OIFS(JN),YAEROUT(7)%MP)=PGFL(KIDIA:KFDIA,ind_oifs_ham%ind_class_OIFS(JN),YAEROUT(7)%MP)+ (ZXTM1(KIDIA:KFDIA,JK,ind_oifs_ham%IND_class_HAM(JN))+(ZXTTE(KIDIA:KFDIA,JK,ind_oifs_ham%IND_class_HAM(JN))*time_step_len)) * ZDPG(KIDIA:KFDIA,JK) + + + + end do + + end do + + IF (.NOT. LAERCHEM)THEN + PGFL(KIDIA:KFDIA,1,YAEROUT(8)%MP)=ZDDEPFLUX_SO2(KIDIA:KFDIA) ! aergn7 SO4 gas + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(9)%MP)=PGFL(KIDIA:KFDIA,1:KLEV,YAERCLIM(1)%MP) + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(10)%MP)=PGFL(KIDIA:KFDIA,1:KLEV,YAERCLIM(2)%MP) + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(11)%MP)=PGFL(KIDIA:KFDIA,1:KLEV,YAERCLIM(3)%MP) + END IF + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(12)%MP)=PGFL(KIDIA:KFDIA,1:KLEV,YRE_LIQ%MP9_PH) + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(13)%MP)=PGFL(KIDIA:KFDIA,1:KLEV,YRE_ICE%MP9_PH) + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(14)%MP)=PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH) + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(15)%MP)=PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH) + PGFL(KIDIA:KFDIA,KLEV,YAEROUT(16)%MP)=ZDUMMY(KIDIA:KFDIA,17) !SS CS wdepflux + PGFL(KIDIA:KFDIA,KLEV-1,YAEROUT(16)%MP)=ZDUMMY(KIDIA:KFDIA,7) !SO4 CS wdepflux + PGFL(KIDIA:KFDIA,KLEV-2,YAEROUT(16)%MP)=ZDUMMY(KIDIA:KFDIA,25) !NUM CS wdepflux + + PGFL(KIDIA:KFDIA,KLEV,YAEROUT(17)%MP)=ZDDEPFLUX(KIDIA:KFDIA,25) ! drydep flux NUM CS ham + PGFL(KIDIA:KFDIA,KLEV-1,YAEROUT(17)%MP)=ZDDEPFLUX(KIDIA:KFDIA,17) ! drydep flux SS CS ham + PGFL(KIDIA:KFDIA,KLEV-2,YAEROUT(17)%MP)=ZDDEPFLUX(KIDIA:KFDIA,7) ! drydep flux SO4 CS ham + PGFL(KIDIA:KFDIA,KLEV,YAEROUT(18)%MP)=ZVDEP(KIDIA:KFDIA,25) ! ddepveloc NUM CS ham + PGFL(KIDIA:KFDIA,KLEV-1,YAEROUT(18)%MP)=ZVDEP(KIDIA:KFDIA,17) ! ddepveloc SS CS ham + PGFL(KIDIA:KFDIA,KLEV-2,YAEROUT(18)%MP)=ZVDEP(KIDIA:KFDIA,7) ! ddepveloc SO4 CS ham + PGFL(KIDIA:KFDIA,KLEV,YAEROUT(19)%MP)=ZXTTE(KIDIA:KFDIA,KLEV,3) ! tendency SS CS ham after update surface + PGFL(KIDIA:KFDIA,KLEV-1,YAEROUT(20)%MP)=ZTENCIH(KIDIA:KFDIA,KLEV,17) ! tendency SS CS ham before update surface + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(21)%MP)=ZXTMD1(KIDIA:KFDIA,1:KLEV,17) ! mix rat SS CS ham before update + + do JN=1,NACTAERO + PGFL(KIDIA:KFDIA,JN,YAEROUT(22)%MP)=DDEPOUT(KIDIA:KFDIA,KLEV,KAERO(JN)) + end do + do JN=1,ntrac + PGFL(KIDIA:KFDIA,JN,YAEROUT(23)%MP)=WDEPOUT(KIDIA:KFDIA,KLEV,JN) + end do + do JN=1,ntrac + PGFL(KIDIA:KFDIA,JN,YAEROUT(24)%MP)=SEDOUT(KIDIA:KFDIA,KLEV,JN) + PGFL(KIDIA:KFDIA,JN,YAEROUT(39)%MP)=ZXTEMS(KIDIA:KFDIA,JN) + end do + do JN=1,subm_ngasspec + PGFL(KIDIA:KFDIA,JN,YAEROUT(25)%MP)=zxtm1(KIDIA:KFDIA,KLEV,ind_oifs_ham%ind_gas_HAM(JN)) + end do + + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(26)%MP)=ZSEDIFLUX(KIDIA:KFDIA,1:KLEV,25) + + do JN=1,NACTAERO + PGFL(KIDIA:KFDIA,JN,YAEROUT(28)%MP)=ZAERSRC(KIDIA:KFDIA,KAERO(JN)) + end do + if (LAERCHEM)THEN + DO JGAS=1,subm_ngasspec + !ZXTM1(JL,JK,ind_gas_HAM(JGAS)) = MAX(0._JPRB,ZCEN(JL,JK,KCHEM(ind_gas_OIFS(JGAS)))) !eehol: remove negative values + !PGFL(KIDIA:KFDIA,JN,YAEROUT(28+JGAS)%MP)=ZCEN(JL,JK,KCHEM(ind_gas_OIFS(JGAS))) + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(28+JGAS)%MP)= PTENC(KIDIA:KFDIA,1:KLEV,KCHEM(ind_oifs_ham%ind_gas_OIFS(JGAS))) + END DO + ELSE + DO JGAS=1,subm_ngasspec + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(28+JGAS)%MP)= PTENC(KIDIA:KFDIA,1:KLEV,KAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))) + END DO + + END if + DO IMODE=1,NMOD + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(30+IMODE)%MP)=RW_MODE(IMODE)%d2(KIDIA:KFDIA,1:KLEV) ! m + ENDDO + if (.not.LAERCHEM)THEN + PGFL(KIDIA:KFDIA,KLEV,YAEROUT(40)%MP)=PFSO2(KIDIA:KFDIA) ! tendency SS CS ham after update surface + PGFL(KIDIA:KFDIA,KLEV,YAEROUT(41)%MP)=PFSO4(KIDIA:KFDIA) ! tendency SS CS ham after update surfac + PGFL(KIDIA:KFDIA,KLEV,YAEROUT(42)%MP)=PFSO4_AQ(KIDIA:KFDIA) ! tendency SS CS ham after update surface + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(43)%MP)=PTSO4(KIDIA:KFDIA,1:KLEV) ! tendency SS CS ham after update surface + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(44)%MP)=PTSO4_AQ(KIDIA:KFDIA,1:KLEV) ! tendency SS CS ham after update surface + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(45)%MP)=PTSO2(KIDIA:KFDIA,1:KLEV) ! tendency SS CS ham after update surface + END if + + ENDIF + + +!------------------------------------------------------------------------------ +!* 9. RELEASE LOCAL MEMORY +! -------------------- +DEALLOCATE( ZAERSRC ) +DEALLOCATE( ZAERNGT ) +DEALLOCATE( ZAERSCC ) + +DEALLOCATE( ZWPDF ) +DEALLOCATE( ZW ) +if (allocated(ZRC) ) DEALLOCATE( ZRC ) +if (allocated(ZSMAX)) DEALLOCATE( ZSMAX ) + + +DO IMODE=1,NMOD + DEALLOCATE(RW_MODE(IMODE)%d2) + DEALLOCATE(DENS_MODE(IMODE)%d2) +ENDDO +DO IMODE=1,NMOD + IF (sizeclass(IMODE)%lsoluble) THEN + DEALLOCATE(RWD_MODE(IMODE)%d2) + DEALLOCATE(H2O_MODE(IMODE)%d2) + END IF +ENDDO + +!if (allocated(reffi)) DEALLOCATE( reffi ) +!if (allocated(reffl)) DEALLOCATE( reffl ) +!if (allocated(w_large)) DEALLOCATE( w_large ) +!if (allocated(w_turb)) DEALLOCATE( w_turb ) + +END ASSOCIATE + +IF (LHOOK) CALL DR_HOOK('TM5M7',1,ZHOOK_HANDLE) + +END SUBROUTINE HAMM7_INTERFACE + diff --git a/ifs-source/arpifs/phys_ec/local_arrays_fin.F90 b/ifs-source/arpifs/phys_ec/local_arrays_fin.F90 index a656b021..93dec7df 100644 --- a/ifs-source/arpifs/phys_ec/local_arrays_fin.F90 +++ b/ifs-source/arpifs/phys_ec/local_arrays_fin.F90 @@ -129,6 +129,13 @@ SUBROUTINE LOCAL_ARRAYS_FIN(LLKEYS,AUXL,SURFL,PERTL,GEMSL) IF (ASSOCIATED(GEMSL%ZMDT)) DEALLOCATE(GEMSL%ZMDT) IF (ASSOCIATED(GEMSL%ZND)) DEALLOCATE(GEMSL%ZND) + +! M7 fields +IF (ASSOCIATED(GEMSL%ZAEROTAU)) DEALLOCATE(GEMSL%ZAEROTAU) +IF (ASSOCIATED(GEMSL%ZAEROSSA)) DEALLOCATE(GEMSL%ZAEROSSA) +IF (ASSOCIATED(GEMSL%ZAEROASY)) DEALLOCATE(GEMSL%ZAEROASY) +IF (ASSOCIATED(GEMSL%ZAEROTAULW)) DEALLOCATE(GEMSL%ZAEROTAULW) + ! dry depostion and effective flux fields IF (ASSOCIATED(GEMSL%ZDDVLC)) DEALLOCATE(GEMSL%ZDDVLC) IF (ASSOCIATED(GEMSL%ZCFLXO)) DEALLOCATE(GEMSL%ZCFLXO) diff --git a/ifs-source/arpifs/phys_ec/m7.F90 b/ifs-source/arpifs/phys_ec/m7.F90 new file mode 100755 index 00000000..0407e3df --- /dev/null +++ b/ifs-source/arpifs/phys_ec/m7.F90 @@ -0,0 +1,268 @@ +SUBROUTINE m7(KIDIA, KFDIA, KLON, KLEV, & ! TM5 indices + papp1, prelhum, ptp1, & ! " thermodynamics + pso4g, pelvoc, psvoc, paerml, paernl, & ! M7 tracers + prhop, pww, pm6rp, pm6dry, & ! " aerosol properties + ptime ) ! TM5 time step + ! + ! ****m7* Aerosol model for the system so4,bc,oc,soa,ss,dust in 7 modes. + ! + ! Authors: + ! --------- + ! E. Vignati, JRC/EI (original source) 2000 + ! P. Stier, MPI (f90-version, changes, comments) 2001 + ! E. Vignati, JRC/IES (so2 is not required in this version) 2005 + ! T Bergman FMI (modification for IFS) 2020 + ! + ! Purpose + ! --------- + ! Aerosol model for the system so4,bc,oc,ss,dust in 7 modes. + ! + ! Externals + ! --------- + ! + ! *m7_averageproperties* + ! calculates the average mass for all modes and the particle + ! dry radius and density for the insoluble modes. + ! + ! *m7_equiz* + ! calculates the ambient radius of sulphate particles + ! + ! *m7_equimix* + ! calculates the ambient radius of so4,bc,oc (dust) particles + ! + ! *m7_equil* + ! calculates the ambient radius of so4,ss particles + ! + ! *m7_dgas* + ! calculates the sulfate condensation on existing particles + ! + ! *m7_dnum* + ! calculates new gas phase sulfate and aerosol numbers and masses + ! after condensation, nucleation and coagulation over one timestep + ! + ! *m7_dconc* + ! repartitions aerosol number and mass between the + ! the modes to account for condensational growth and the formation + ! of an accumulation mode from the upper tail of the aitken mode and + ! of a coarse mode from the upper tail of the accumulation mode + ! + + !USE mo_aero_m7, ONLY: lsnucl, lscoag, lscond, & + USE TM5M7_DATA, ONLY: nmod, nss, nsol, naermod +USE PARKIND1 , ONLY : JPIM, JPRB +! use tracer_data, only : tracer_print +! use GO, only : gol, goErr, goPr, goBug + ! use mo_aero, only : nsoa !RM + + IMPLICIT NONE + + !--- Parameter list: + ! + ! papp1 = atmospheric pressure at time t+1 [Pa] + ! prelhum = atmospheric relative humidity [% (0-1)] + ! ptp1 = atmospheric temperature at time t+1 [K] + ! pso4g = mass of gas phase sulfate [molec. cm-3] + ! paerml = total aerosol mass for each compound + ! [molec. cm-3 for sulphate and ug m-3 for bc, oc, ss, and dust] + ! paernl = aerosol number for each mode [cm-3] + ! prhop = mean mode particle density [g cm-3] + ! pm6rp = mean mode actual radius (wet radius for soluble modes + ! and dry radius for insoluble modes) [cm] + ! pm6dry = dry radius for soluble modes [cm] + ! pww = aerosol water content for each mode [kg(water) m-3(air)] + ! + !--- Local variables: + ! + ! zttn = average mass for single compound in each mode + ! [in molec. for sulphate and in ug for bc, oc, ss, and dust] + ! zhplus = number of h+ in mole [???] (kg water)-1 + ! zso4_x = mass of sulphate condensed on insoluble mode x [molec. cm-3] + ! (calculated in dgas used in concoag) + + + ! Parameters: + + INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA, KFDIA, KLON, KLEV + + REAL(KIND=JPRB),INTENT(IN) :: ptime + + REAL(KIND=JPRB),INTENT(IN) :: prelhum(KLON,KLEV), papp1(KLON,KLEV), & + ptp1(KLON,KLEV) + REAL(KIND=JPRB),INTENT(INOUT) :: pso4g(KLON,KLEV), pelvoc(KLON,KLEV), psvoc(KLON,KLEV) !RM + + REAL(KIND=JPRB),INTENT(INOUT) :: paerml(KLON,KLEV,naermod), paernl(KLON,KLEV,nmod), & + pm6rp(KLON,KLEV,nmod), pm6dry(KLON,KLEV,nsol), & + prhop(KLON,KLEV,nmod), pww(KLON,KLEV,nmod) + + ! Local variables: + + + REAL(KIND=JPRB) :: zso4_5(KLON,KLEV), zso4_6(KLON,KLEV), & + zso4_7(KLON,KLEV) + + REAL(KIND=JPRB) :: zhplus(KLON,KLEV,nss) + + REAL(KIND=JPRB) :: zttn(KLON,KLEV,naermod) + + ! + !--- 0) Initialisations: ------------------------------------------------- + ! + zhplus(:,:,:) = 0. + pm6dry(:,:,:) = 0. + pm6rp(:,:,:) = 0. + zttn(:,:,:) = 0. + prhop(:,:,:) = 0. + pww(:,:,:) = 0. + zso4_5(:,:) = 0. + zso4_6(:,:) = 0. + zso4_7(:,:) = 0. + + + +!!$ ! +!!$ !--- 1) Calculation of particle properties under ambient conditions: ----- +!!$ ! +!!$ !--- 1.1) Calculate mean particle mass for all modes +!!$ ! and dry radius and density for the insoluble modes. +!!$ ! +!!$ CALL m7_averageproperties(KIDIA, KFDIA, KLON, KLEV, paernl, paerml, zttn, pm6rp, prhop) +!!$ ! +!!$ !--- 1.2) Calculate ambient count median radii and density +!!$ ! for lognormal distribution of particles. +!!$ ! +!!$ ! Sulfate particles: +!!$ ! +!!$ CALL m7_equiz(KIDIA, KFDIA, KLON, KLEV, & +!!$ papp1, zttn, ptp1, & +!!$ prelhum, pm6rp, pm6dry, & +!!$ prhop, pww, paernl ) +!!$ ! +!!$ ! Mixed particles with sulfate, b/o carbon and dust: +!!$ ! +!!$ CALL m7_equimix(KIDIA, KFDIA, KLON, KLEV, & +!!$ papp1, zttn, ptp1, & +!!$ prelhum, pm6rp, pm6dry, & +!!$ prhop, pww, paernl ) +!!$ ! +!!$ ! Accumulation and coarse mode particles in presence of +!!$ ! sea salt particles: +!!$ ! +!!$ CALL m7_equil(KIDIA, KFDIA, KLON, KLEV, prelhum, paerml, paernl, & +!!$ pm6rp, pm6dry, zhplus, pww, prhop, ptp1 ) +!!$ ! +!!$ ! +!!$ !--- 2) Calculate changes in aerosol mass and gas phase sulfate ---------- +!!$ ! due to sulfate condensation: +!!$ ! No change in particle mass/number relationships. +!!$ ! +!!$ IF (lscond) CALL m7_dgas(KIDIA, KFDIA, KLON, KLEV, pso4g, paerml, paernl, & +!!$ ptp1, papp1, pm6rp, zso4_5, zso4_6, zso4_7, & +!!$ ptime) +!!$ +!!$ !--- 2b) Calculate changes in aerosol mass ---------- +!!$ ! due to organic condensation: +!!$ ! No change in particle mass/number relationships. +!!$ ! +!!$ +!!$ IF (nsoa .GT. 0 .AND. lscond) THEN +!!$ CALL m7_dgas_org(KIDIA, KFDIA, KLON, KLEV, pelvoc, psvoc, paerml, paernl, & +!!$ ptp1, papp1, pm6rp, & +!!$ ptime) +!!$ END IF +!!$ ! +!!$ ! +!!$ !--- 3) Calculate change in particle number concentrations --------------- +!!$ ! due to nucleation and coagulation: +!!$ ! Change particle mass/number relationships. +!!$ ! +!!$ ! JadB: Removed "If (lsnucl .OR. lscoag)". +!!$ ! If only lscond is set, the m7_dnum is required for storing sulfuric acid on insoluble aerosols (making the soluble). +!!$ ! Without m7_dnum, the sulfuric acid condensed on insoluble particles is turned into void. +!!$ ! IF (lsnucl.OR.lscoag) CALL m7_dnum(KIDIA, KFDIA, KLON, KLEV, & +!!$ ! pso4g, paerml, paernl, ptp1, & +!!$ ! papp1, prelhum, pm6rp, prhop, & +!!$ ! zso4_5, zso4_6, zso4_7, ptime ) +!!$ +!!$ CALL m7_dnum(KIDIA, KFDIA, KLON, KLEV, & +!!$ pso4g, pelvoc, paerml, paernl, ptp1, & +!!$ papp1, prelhum, pm6rp, prhop, & +!!$ zso4_5, zso4_6, zso4_7, ptime ) +!!$ ! +!!$ ! +!!$ !--- 4) Recalculation of particle properties under ambient conditions: --- +!!$ ! +!!$ !--- 4.1) Recalculate mean masses for all modes +!!$ ! and dry radius and density for the insoluble modes. +!!$ ! +!!$ CALL m7_averageproperties(KIDIA, KFDIA, KLON, KLEV, paernl, paerml, zttn, pm6rp, prhop) +!!$ ! +!!$ !--- 4.2) Calculate ambient count median radii and density +!!$ ! for lognormal distribution of particles. +!!$ ! +!!$ ! Sulfate particles: +!!$ ! +!!$ CALL m7_equiz(KIDIA, KFDIA, KLON, KLEV, & +!!$ papp1, zttn, ptp1, & +!!$ prelhum, pm6rp, pm6dry, & +!!$ prhop, pww, paernl ) +!!$ ! +!!$ ! Mixed particles with sulfate, b/o carbon and dust: +!!$ ! +!!$ CALL m7_equimix(KIDIA, KFDIA, KLON, KLEV, & +!!$ papp1, zttn, ptp1, & +!!$ prelhum, pm6rp, pm6dry, & +!!$ prhop, pww, paernl ) +!!$ ! +!!$ ! Accumulation and coarse mode particles in presence of +!!$ ! sea salt particles: +!!$ ! +!!$ CALL m7_equil(KIDIA, KFDIA, KLON, KLEV, prelhum, paerml, paernl, & +!!$ pm6rp, pm6dry, zhplus, pww, prhop, ptp1 ) +!!$ ! +!!$ !--- 5) Repartitition particles among the modes: ------------------------- +!!$ ! +!!$ IF (lscond.OR.lscoag) THEN +!!$ +!!$ CALL m7_dconc(KIDIA, KFDIA, KLON, KLEV, paerml, paernl, pm6dry) +!!$ +!!$ END IF +!!$ ! +!!$ !--- 6) Recalculation of particle properties under ambient conditions: --- +!!$ ! +!!$ !--- 6.1) Calculate mean particle mass for all modes +!!$ ! and dry radius and density for the insoluble modes: +!!$ ! +!!$ CALL m7_averageproperties(KIDIA, KFDIA, KLON, KLEV, paernl, paerml, zttn, pm6rp, prhop) +!!$ ! +!!$ !--- 6.2) Calculate ambient count median radii and density +!!$ ! for lognormal distribution of particles. +!!$ ! +!!$ ! Sulfate particles: +!!$ ! +!!$ CALL m7_equiz(KIDIA, KFDIA, KLON, KLEV, & +!!$ papp1, zttn, ptp1, & +!!$ prelhum, pm6rp, pm6dry, & +!!$ prhop, pww, paernl ) +!!$ ! +!!$ ! Mixed particles with sulfate, b/o carbon and dust: +!!$ ! +!!$ CALL m7_equimix(KIDIA, KFDIA, KLON, KLEV, & +!!$ papp1, zttn, ptp1, & +!!$ prelhum, pm6rp, pm6dry, & +!!$ prhop, pww, paernl ) +!!$ ! +!!$ ! Accumulation and coarse mode particles in presence of +!!$ ! sea salt particles: +!!$ ! +!!$ CALL m7_equil(KIDIA, KFDIA, KLON, KLEV, prelhum, paerml, paernl, & +!!$ pm6rp, pm6dry, zhplus, pww, prhop, ptp1 ) +!!$ + +! write(*,*) 'ou2', 'h2so4= ', pso4g(2100,1),'num1= ',paernl(2100,1,1) +! write(*,*) 'ou2', 'BCsol= ', paerml(2100,1,5),'BCins= ', paerml(2100,1,8) +! write(*,*) 'ou2', 'POsol= ', paerml(2100,1,9),'POins= ', paerml(2100,1,12) +! write(*,*) 'ou2', 'num2= ', paernl(2100,1,2), 'num5= ', paernl(2100,1,5) +! write(*,*) 'ou2', 'BCtot= ', paerml(2100,1,5)+ paerml(2100,1,8)+paerml(2100,1,6)+paerml(2100,1,7) +! write(*,*) 'ou2', 'cond5= ', zso4_5(2100,1), '6= ',zso4_6(2100,1), '7= ',zso4_7(2100,1) + ! +END SUBROUTINE m7 diff --git a/ifs-source/arpifs/phys_ec/m7_box.F90 b/ifs-source/arpifs/phys_ec/m7_box.F90 new file mode 100644 index 00000000..0cbb74a4 --- /dev/null +++ b/ifs-source/arpifs/phys_ec/m7_box.F90 @@ -0,0 +1,205 @@ +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! \filename +!! m7_box.f90 +!! +!! \brief +!! Boxmodel of the M7 aerosol microphysics scheme currently in ECHAM6-HAMMOZ. +!! To find out what is exactly the corresponding version number of ECHAM6-HAMMOZ, +!! please read: +!! echam6-hammoz_base_version.txt +!! +!! \author Grazia Frontoso, Nov 2012 (C2SM-ETHZ) +!! +!! \responsible_coder +!! Grazia Frontoso, grazia.frontoso@env.ethz.ch +!! +!! \revision_history +!! +!! \limitations +!! None +!! +!! \bibliographic_references +!! - Vignati E., Wilson J. and Stier P., M7: a size resolved aerosol mixture module +!! for the use in global aerosol models, JGR 109, D22 202, doi:10.1029/2003JD004 485, 2004. +!! - Stier P. et al, The aerosol-climate model ECHAM5-HAM, ACP, 5, 1125-1156, 2005 +!! +!! +!! \copyright +!! Copyright and licencing conditions are defined in the ECHAM-HAMMOZ +!! licencing agreement to be found at: +!! https://redmine.hammoz.ethz.ch/projects/hammoz/wiki/1_Licencing_conditions +!! The ECHAM-HAMMOZ software is provided "as is" and without warranty of any kind. +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +PROGRAM m7_box + + USE mo_kind, ONLY: dp + USE mo_ham_m7, ONLY: m7 + USE mo_ham_init, ONLY: ham_init_memory, ham_free_memory, & + ham_initialize, start_ham + USE mo_ham_m7ctl, ONLY: kproma, kbdim, klev, & + nmod, nsol, naerocompmax, & + iso4ns, iso4ks, iso4as, iso4cs, & + ibcks, ibcas, ibccs, ibcki, & + iocks, iocas, ioccs, iocki, & + issas, isscs, & + iduas, iducs, iduai, iduci, & + inucs, iaits, iaccs, icoas, & + iaiti, iacci, icoai + USE mo_namelist, ONLY: open_nml, position_nml, POSITIONED + + IMPLICIT NONE + !--- Initial conditions for m7.box : + REAL(dp):: pap(kbdim,klev) = 1013.25_dp ! Pressure [Pa] + REAL(dp):: pt(kbdim,klev) = 265.0_dp ! Temperature at [K] + REAL(dp):: prh(kbdim,klev) = 0.3_dp ! Relative humidity at [0,1] + REAL(dp):: pipr(kbdim,klev) = 5.0_dp ! Ionization rate [cm-3 s-1] + REAL(dp):: pdgso4(kbdim,klev)= 5.0E4_dp ! d[H2SO4(g)]/dt [cm-3 s-1] + REAL(dp):: pgso4(kbdim,klev) = 1.0E4_dp ! [H2SO4(g)] [cm-3] + REAL(dp):: paclc(kbdim,klev) = 0.0_dp ! Cloud cover [0,1] + REAL(dp):: pforest(kbdim) = 1.0_dp ! Forest fraction + REAL(dp):: paerml(kbdim,klev,naerocompmax) + ! aerosol mass concentrations for individual compounds + ! [molec. cm-3 for sulfate and ug m-3 for bc, oc, ss, and dust] + REAL(dp):: paernl(kbdim,klev,nmod) + ! aerosol number concentrations for each mode [cm-3] + REAL(dp):: pm6rp(kbdim,klev,nmod) + ! mean mode actual radius for each mode (wet for soluble and dry for insoluble modes) [cm] + REAL(dp):: pm6dry(kbdim,klev,nsol) + ! dry radius for soluble modes [cm] + REAL(dp):: prhop(kbdim,klev,nmod) + ! mean mode particle density for each mode [g cm-3] + REAL(dp):: pww(kbdim,klev,nmod) + ! aerosol water content for each mode [kg(water) m-3(air)] + INTEGER :: ierr, inml, iunit + INCLUDE 'ini_m7ctl.inc' + ! Initialization: + paerml(1:kproma,:,:) = 0.0_dp + paernl(1:kproma,:,:) = 0.0_dp + pm6rp(1:kproma,:,:) = 0.0_dp + pm6dry(1:kproma,:,:) = 0.0_dp + prhop(1:kproma,:,:) = 0.0_dp + pww(1:kproma,:,:) = 0.0_dp + CALL start_ham + CALL ham_initialize + CALL ham_init_memory + ! Read initial values from namelist: ini_m7ctl.inc + inml = open_nml('namelist.echam') + iunit = position_nml ('INI_M7CTL', inml, status=ierr) + SELECT CASE (ierr) + CASE (POSITIONED) + READ (iunit, ini_m7ctl) + END SELECT + CALL m7(pap, pt, prh, & ! Pressure, temperature, RH + pgso4, pdgso4, & ! [H2SO4(g)], derivative (production rate) + paerml, paernl, & ! Aerosol mass and number + pm6rp, pm6dry, prhop, pww, & ! Aerosol properties + pipr, paclc, pforest ) ! Ionization rate, cloud cover, forest fraction + ! + ! Print the output: + ! + + WRITE(*,'(A)') '-------------------' + WRITE(*,'(A)') 'M7 boxmodel outputs' + WRITE(*,'(A)') '-------------------' + + ! H2SO4 gas phase concentration: + + WRITE(*,'(A,E14.7)') '[H2SO4] (cm-3) : ',pgso4(1:kproma,:) + + ! Aerosol mass concentrations for individual compounds, (molec. cm-3 for sulfate and + ! ug m-3 for bc, oc, ss, and dust): + + ! Sulfate: + + WRITE(*,'(A)') '' + WRITE(*,'(A,E14.7)') 'NS SO4-- concents (molec. cm-3) : ',paerml(1:kproma,:,iso4ns) + WRITE(*,'(A,E14.7)') 'KS SO4-- concents (molec. cm-3) : ',paerml(1:kproma,:,iso4ks) + WRITE(*,'(A,E14.7)') 'AS SO4-- concents (molec. cm-3) : ',paerml(1:kproma,:,iso4as) + WRITE(*,'(A,E14.7)') 'CS SO4-- concents (molec. cm-3) : ',paerml(1:kproma,:,iso4cs) + + ! Black Carbon: + + WRITE(*,'(A)') '' + WRITE(*,'(A,E14.7)') 'BC KS (ug cm-3) : ',paerml(1:kproma,:,ibcks) + WRITE(*,'(A,E14.7)') 'BC KI (ug cm-3) : ',paerml(1:kproma,:,ibcki) + WRITE(*,'(A,E14.7)') 'BC AS (ug cm-3) : ',paerml(1:kproma,:,ibcas) + WRITE(*,'(A,E14.7)') 'BC CS (ug cm-3) : ',paerml(1:kproma,:,ibccs) + + ! Organic Carbon: + + WRITE(*,'(A)') '' + WRITE(*,'(A,E14.7)') 'OC KS (ug cm-3) : ',paerml(1:kproma,:,iocks) + WRITE(*,'(A,E14.7)') 'OC KI (ug cm-3) : ',paerml(1:kproma,:,iocki) + WRITE(*,'(A,E14.7)') 'OC AS (ug cm-3) : ',paerml(1:kproma,:,iocas) + WRITE(*,'(A,E14.7)') 'OC CS (ug cm-3) : ',paerml(1:kproma,:,ioccs) + + ! Sea Salt: + + WRITE(*,'(A)') '' + WRITE(*,'(A,E14.7)') 'SS AS (ug cm-3) : ',paerml(1:kproma,:,issas) + WRITE(*,'(A,E14.7)') 'SS CS (ug cm-3) : ',paerml(1:kproma,:,isscs) + + ! Dust: + + WRITE(*,'(A)') '' + WRITE(*,'(A,E14.7)') 'DU AS (ug cm-3) : ',paerml(1:kproma,:,iduas) + WRITE(*,'(A,E14.7)') 'DU AI (ug cm-3) : ',paerml(1:kproma,:,iduai) + WRITE(*,'(A,E14.7)') 'DU CS (ug cm-3) : ',paerml(1:kproma,:,iducs) + WRITE(*,'(A,E14.7)') 'DU CI (ug cm-3) : ',paerml(1:kproma,:,iduci) + + ! Particle number concentrations for each mode (cm-3): + + WRITE(*,'(A)') '' + WRITE(*,'(A,E14.7)') '[NS] (cm-3) : ',paernl(1:kproma,:,inucs) + WRITE(*,'(A,E14.7)') '[KI] (cm-3) : ',paernl(1:kproma,:,iaiti) + WRITE(*,'(A,E14.7)') '[KS] (cm-3) : ',paernl(1:kproma,:,iaits) + WRITE(*,'(A,E14.7)') '[AI] (cm-3) : ',paernl(1:kproma,:,iacci) + WRITE(*,'(A,E14.7)') '[AS] (cm-3) : ',paernl(1:kproma,:,iaccs) + WRITE(*,'(A,E14.7)') '[CI] (cm-3) : ',paernl(1:kproma,:,icoai) + WRITE(*,'(A,E14.7)') '[CS] (cm-3) : ',paernl(1:kproma,:,icoas) + + ! Particle radii for each mode (nm): + + WRITE(*,'(A)') '' + WRITE(*,'(A,E14.7)') 'NS geom. mean rad. (nm) : ',1.0E9_dp*pm6rp(1:kproma,:,inucs) + WRITE(*,'(A,E14.7)') 'KI geom. mean rad. (nm) : ',1.0E9_dp*pm6rp(1:kproma,:,iaiti) + WRITE(*,'(A,E14.7)') 'KS geom. mean rad. (nm) : ',1.0E9_dp*pm6rp(1:kproma,:,iaits) + WRITE(*,'(A,E14.7)') 'AI geom. mean rad. (nm) : ',1.0E9_dp*pm6rp(1:kproma,:,iacci) + WRITE(*,'(A,E14.7)') 'AS geom. mean rad. (nm) : ',1.0E9_dp*pm6rp(1:kproma,:,iaccs) + WRITE(*,'(A,E14.7)') 'CI geom. mean rad. (nm) : ',1.0E9_dp*pm6rp(1:kproma,:,icoai) + WRITE(*,'(A,E14.7)') 'CS geom. mean rad. (nm) : ',1.0E9_dp*pm6rp(1:kproma,:,icoas) + + WRITE(*,'(A)') '' + WRITE(*,'(A,E14.7)') 'NS dry rad. (nm) : ',1.0E9_dp*pm6dry(1:kproma,:,inucs) + WRITE(*,'(A,E14.7)') 'KS dry rad. (nm) : ',1.0E9_dp*pm6dry(1:kproma,:,iaits) + WRITE(*,'(A,E14.7)') 'AS dry rad. (nm) : ',1.0E9_dp*pm6dry(1:kproma,:,iaccs) + WRITE(*,'(A,E14.7)') 'CS dry rad. (nm) : ',1.0E9_dp*pm6dry(1:kproma,:,icoas) + ! Mean mode particle density for each mode [g cm-3] + WRITE(*,'(A)') '' + WRITE(*,'(A,E14.7)') 'NS particle density (g cm-3) : ',prhop(1:kproma,:,inucs) + WRITE(*,'(A,E14.7)') 'KI particle density (g cm-3) : ',prhop(1:kproma,:,iaiti) + WRITE(*,'(A,E14.7)') 'KS particle density (g cm-3) : ',prhop(1:kproma,:,iaits) + WRITE(*,'(A,E14.7)') 'AI particle density (g cm-3) : ',prhop(1:kproma,:,iacci) + WRITE(*,'(A,E14.7)') 'AS particle density (g cm-3) : ',prhop(1:kproma,:,iaccs) + WRITE(*,'(A,E14.7)') 'CI particle density (g cm-3) : ',prhop(1:kproma,:,icoai) + WRITE(*,'(A,E14.7)') 'CS particle density (g cm-3) : ',prhop(1:kproma,:,icoas) + + ! Water content for each mode [kg(water) m-3(air)] + + WRITE(*,'(A)') '' + WRITE(*,'(A,E14.7)') 'NS water content (kg(H2O) m-3(air)) : ',pww(1:kproma,:,inucs) + WRITE(*,'(A,E14.7)') 'KI water content (kg(H2O) m-3(air)) : ',pww(1:kproma,:,iaiti) + WRITE(*,'(A,E14.7)') 'KS water content (kg(H2O) m-3(air)) : ',pww(1:kproma,:,iaits) + WRITE(*,'(A,E14.7)') 'AI water content (kg(H2O) m-3(air)) : ',pww(1:kproma,:,iacci) + WRITE(*,'(A,E14.7)') 'AS water content (kg(H2O) m-3(air)) : ',pww(1:kproma,:,iaccs) + WRITE(*,'(A,E14.7)') 'CI water content (kg(H2O) m-3(air)) : ',pww(1:kproma,:,icoai) + WRITE(*,'(A,E14.7)') 'CS water content (kg(H2O) m-3(air)) : ',pww(1:kproma,:,icoas) + + WRITE(*,'(A)') '' + + ! Clean up: + + CALL ham_free_memory +END PROGRAM m7_box diff --git a/ifs-source/arpifs/phys_ec/m7_simple_sulfur_drydep.F90 b/ifs-source/arpifs/phys_ec/m7_simple_sulfur_drydep.F90 new file mode 100644 index 00000000..5049b4b3 --- /dev/null +++ b/ifs-source/arpifs/phys_ec/m7_simple_sulfur_drydep.F90 @@ -0,0 +1,378 @@ +SUBROUTINE m7_simple_sulfur_DRYDEP & +!---inputs + & ( YDMODEL, KIDIA , KFDIA , KLON , KLEV , & + & PAERO , PFAERI , & + & PDP , PGEOH, PRHO , PTAERI, PTSPHY, & + & PSO2DD, PGELAM, & +!-- outputs + & PFAERO , PTAERO, PFDRYD) + + +!**** *m7_simple_sulfur_DRYDEP* - ROUTINE FOR PARAMETRIZATION OF DRY DEPOSITION + + ! Modified from Dry dep routine for AER aerosols (aer_drydep.f90) for use in + ! OpenIFS/AC dry deposition of so2 when using simple sulfur chemistry + ! Original by + ! Jean-Jacques Morcrette + ! following O.Boucher's formulation for LMD-Z + + ! Modifications Tommi Bergman (FMI) + ! + ! Dry deposition is (simply) represented by a modification of the + ! instantaneous surface flux by what comes down from layer just + ! above the surface + +!** INTERFACE. +! ---------- +! *M7_simple_sulfur_DRYDEP* IS CALLED FROM *TM5M7*. + +! INPUTS: +! ------- +! PFAERI(KLON,NACTAERO) : INPUT SURFACE FLUX (xx m-2) +! PTAERI(KLON,KLEV,NACTAERO) : INPUT TENDENCIES (xx kg s-1) + +! OUTPUTS: +! -------- +! PFAERO(KLON,NACTAERO) : SURFACE FLUX (xx m-2) +! PTAERO(KLON,KLEV,NACTAERO) : UPDATED TENDENCIES (xx kg s-1) +! PFDRYD(KLON) : DIAGNOSTIC DRY DEPOSITION AT THE SURFACE (xx m-2) + +! EXTERNALS. +! ---------- +! NONE + +! MODIFICATIONS. +! ------------- +! JJMorcrette 20110725 maximum deposition speed +! SRémy 20160309 SO2 dry deposition velocity from SUMO (same as +! CHEM) +! SRémy 20160830 dry deposition velocities (except SO2) computed +! following Zhang et al 2001. +! TBergman 20230207 remove most of the code which is not needed for so2 + +! SWITCHES. +! -------- + +! MODEL PARAMETERS +! ---------------- + +!----------------------------------------------------------------------- +USE PARKIND1 ,ONLY : JPIM ,JPRB +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK + +!USE YOEAERATM, ONLY : YREAERATM +!USE YOEAERSNK, ONLY : YREAERSNK +!USE YOEAERSRC ,ONLY : YREAERSRC +!USE YOM_YGFL , ONLY : YGFL +USE YOMCST , ONLY : RG, RPI +!USE YOMRIP , ONLY : YRRIP +!USE YOMLUN , ONLY : NULOUT +USE MO_TRACDEF, ONLY: ntrac, trlist +USE MO_HAM, ONLY: nclass, naerocomp, sizeclass, nccndiag, subm_ngasspec + +IMPLICIT NONE + +!----------------------------------------------------------------------- + +!* 0.1 ARGUMENTS +! --------- + +!---input fields +TYPE(MODEL) ,INTENT(IN) :: YDMODEL +INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA +INTEGER(KIND=JPIM),INTENT(IN) :: KFDIA +INTEGER(KIND=JPIM),INTENT(IN) :: KLON +!INTEGER(KIND=JPIM),INTENT(IN) :: KTDIA +INTEGER(KIND=JPIM),INTENT(IN) :: KLEV +!INTEGER(KIND=JPIM),INTENT(IN) :: KSTEP + +!REAL(KIND=JPRB) ,INTENT(IN) :: PLSM(KLON), PCI(KLON) +REAL(KIND=JPRB) ,INTENT(IN) :: PAERO(KLON,KLEV,YGFL%NACTAERO), PTAERI(KLON,KLEV,YGFL%NACTAERO) +!REAL(KIND=JPRB) ,INTENT(IN) :: PAPH(KLON,0:KLEV) +!REAL(KIND=JPRB) ,INTENT(IN) :: PAP(KLON,KLEV) +REAL(KIND=JPRB) ,INTENT(IN) :: PDP(KLON,KLEV), PGEOH(KLON,0:KLEV), PRHO(KLON,KLEV) +REAL(KIND=JPRB) ,INTENT(IN) :: PFAERI(KLON,YGFL%NACTAERO) +REAL(KIND=JPRB) ,INTENT(IN) :: PTSPHY +REAL(KIND=JPRB) ,INTENT(IN) :: PSO2DD(KLON) +REAL(KIND=JPRB) ,INTENT(IN) :: PGELAM(KLON) +!REAL(KIND=JPRB) ,INTENT(IN) :: PAERUST(KLON) +!REAL(KIND=JPRB) ,INTENT(IN) :: PZ0M(KLON) +!REAL(KIND=JPRB) ,INTENT(IN) :: PT(KLON,KLEV) +!REAL(KIND=JPRB) ,INTENT(IN) :: PQ(KLON) +!REAL(KIND=JPRB) ,INTENT(IN) :: PDZ(KLON) + +!---output fields +REAL(KIND=JPRB) ,INTENT(OUT) :: PFAERO(KLON,YGFL%NACTAERO) +REAL(KIND=JPRB) ,INTENT(OUT) :: PTAERO(KLON,KLEV,YGFL%NACTAERO) +REAL(KIND=JPRB) ,INTENT(OUT) :: PFDRYD(KLON)!,YGFL%NACTAERO) + +!--- local variables +INTEGER(KIND=JPIM) :: JL, JAER, JAERO +REAL(KIND=JPRB) :: ZAERO, ZFROC, ZOCEA, ZLAND, ZLICE, ZSICE, ZRHO +REAL(KIND=JPRB) :: Z1RG , Z1TSPHY, ZHGT, ZALPHA, ZAERI +REAL(KIND=JPRB) :: ZVDEP,ZVDEP2(YGFL%NACTAERO) + +REAL(KIND=JPRB) :: ZRHOP +REAL(KIND=JPRB) :: ZWETD +REAL(KIND=JPRB) :: ZSIGMA + +!!$!* Taken from J.J.Morcrette +!!$REAL(KIND=JPRB), PARAMETER :: ZR_OM = 0.13E-6 !m +!!$REAL(KIND=JPRB), PARAMETER :: ZR_BC = 0.04E-6 !m +!!$REAL(KIND=JPRB), PARAMETER :: ZR_SO4 = 0.9E-6 !m SO4 dry particle radius,Martin et al., 2003 +!!$REAL(KIND=JPRB), PARAMETER :: ZR_AM = 0.35E-6 !m Wang et al ACP 2014 +!!$REAL(KIND=JPRB), DIMENSION(2),PARAMETER :: ZR_NI =(/0.35E-6,1.5E-6/) !m Wang et al ACP 2014 +!!$!* Growth factors corresponding to RH table as given in RRHTAB, according to +!!$!J.J. Morcrette +!!$REAL(KIND=JPRB), DIMENSION(12), PARAMETER :: ZRH_GROWTH_SO4= & +!!$ & (/1.00,1.00,1.00,1.00,1.169,1.220,1.282,1.363,1.485,1.581,1.732,2.085/) +!!$! According to Chin et al., AMS 2002 +!!$REAL(KIND=JPRB), DIMENSION(12), PARAMETER :: ZRH_GROWTH_BC= & +!!$ & (/1.00,1.00,1.00,1.00,1.00,1.000,1.000,1.000,1.200,1.300,1.400,1.500/) +!!$REAL(KIND=JPRB), DIMENSION(12), PARAMETER :: ZRH_GROWTH_OM= & +!!$ & (/1.00,1.00,1.00,1.00,1.169,1.200,1.300,1.400,1.500,1.550,1.600,1.800/) +!!$! Nitrate : Svenningsson et al ACP 2006 +!!$REAL(KIND=JPRB), DIMENSION(12), PARAMETER :: ZRH_GROWTH_NI= & +!!$ & (/1.00,1.00,1.00,1.00,1.100,1.200,1.250,1.300,1.350,1.500,1.700,2.100/) +!!$REAL(KIND=JPRB), DIMENSION(12), PARAMETER :: ZRH_GROWTH_AM= & +!!$ & (/1.00,1.00,1.00,1.00,1.169,1.220,1.282,1.363,1.485,1.581,1.732,2.085/) + +!!$REAL(KIND=JPRB), PARAMETER :: ZRHO_OM=1800 ! kg/m^3 +!!$REAL(KIND=JPRB), PARAMETER :: ZRHO_BC=1000 ! kg/m^3 +!!$REAL(KIND=JPRB), PARAMETER :: ZRHO_SO4=1760 ! kg/m^3 +!!$REAL(KIND=JPRB), PARAMETER :: ZRHO_H2O=1000 ! kg/m^3 (water) +!!$REAL(KIND=JPRB), PARAMETER :: ZRHO_AM=1760 ! kg/m^3 (water) +!!$REAL(KIND=JPRB), DIMENSION(2), PARAMETER :: ZRHO_NI=(/1730,1400/) ! kg/m^3 (water) + + + +REAL(KIND=JPRB) :: ZMAXVDRY(KLON), ZDZ(KLON),ZDVMAX,ZHOURLT, ZSCALE, ZVFRAC +REAL(KIND=JPRB) :: ZQSAT(KLON,KLEV) +REAL(KIND=JPRB) :: ZRHCL(KLON) +INTEGER(KIND=JPIM) :: IAER, ICAER, ITAER, ITYP, IBIN, JTAB +INTEGER(KIND=JPIM) :: INAER(18),IRH(KLON) + + + +LOGICAL :: LLPRINT + + +REAL(KIND=JPRB) :: ZHOOK_HANDLE + +#include "aer_drydepvel.intfb.h" +#include "satur.intfb.h" + +!----------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('M7_SIMPLE_SULFUR_DRYDEP',0,ZHOOK_HANDLE) +ASSOCIATE(YGFL=>YDMODEL%YRML_GCONF%YGFL, YREAERATM=>YDMODEL%YRML_PHY_RAD%YREAERATM, & + YREAERSRC=>YDMODEL%YRML_PHY_AER%YREAERSRC, YREAERSNK=>YDMODEL%YRML_PHY_AER%YREAERSNK, & + YDRIP=>YDMODEL%YRML_GCONF%YRRIP ) + +ASSOCIATE(NDRYDEP=>YREAERATM%NDRYDEP, & + & RVDPLIC=>YREAERSNK%RVDPLIC, RVDPLND=>YREAERSNK%RVDPLND, & + & RVDPOCE=>YREAERSNK%RVDPOCE, RVDPSIC=>YREAERSNK%RVDPSIC, & + & RRHO_DD=>YREAERSNK%RRHO_DD, RRHO_SS=>YREAERSNK%RRHO_SS, & + & RMMD_DD=>YREAERSNK%RMMD_DD, RMMD_SS=>YREAERSNK%RMMD_SS, & + & RSSDENS_RHTAB=>YREAERSNK%RSSDENS_RHTAB, & + & RSSGROWTH_RHTAB=>YREAERSNK%RSSGROWTH_RHTAB, & + & RRHTAB=>YREAERSNK%RRHTAB, & + & NACTAERO=>YGFL%NACTAERO, & + & NINDDDEP=>YREAERATM%NINDDDEP, & + & LDRYDEPVEL_DYN => YREAERSNK%LDRYDEPVEL_DYN, & + & NTDDEP=>YREAERATM%NTDDEP,YAERO=>YGFL%YAERO, & + & NMAXTAER=>YREAERSRC%NMAXTAER, NTYPAER=>YREAERSRC%NTYPAER) + +!- PFAERI in unit of xx m-2 s-1 (surface flux) +!- PFAERO in unit of xx m-2 s-1 (surface flux) +!- N.B. Surface emission fluxes are negative upward, so contribution of +! dry deposition is to make the surface flux less negative + +LLPRINT=.FALSE. +!DO JL=1,NSTPDBG +! IF (KSTEP == KSTPDBG(JL)) THEN +! LLPRINT=.TRUE. +! ENDIF +!ENDDO + +!!$ICAER=0 +!!$DO JAER=1,NMAXTAER +!!$ IF (NTYPAER(JAER) /= 0) THEN +!!$ ITAER=NTYPAER(JAER) +!!$ DO IAER=1,ITAER +!!$ ICAER=ICAER+1 +!!$ INAER(ICAER)=JAER*10+IAER +!!$ ENDDO +!!$ ENDIF +!!$ENDDO + + +Z1RG = 1.0_JPRB/RG +Z1TSPHY= 1.0_JPRB/PTSPHY +PTAERO(KIDIA:KFDIA,1:KLEV,1:YGFL%NACTAERO)=PTAERI(KIDIA:KFDIA,1:KLEV,1:YGFL%NACTAERO) +PFAERO(KIDIA:KFDIA,1:YGFL%NACTAERO)= PFAERI(KIDIA:KFDIA,1:YGFL%NACTAERO) +ZVDEP=0._JPRB +!!$ZVDEP2(:)=0._JPRB + +!!$DO JL=KIDIA,KFDIA +!!$ ZDZ(JL)=(PAPH(JL,KLEV)-PAPH(JL,KLEV-1)) / (RG*PRHO(JL,KLEV)) +!!$ ZMAXVDRY(JL)= ZDZ(JL) / PTSPHY +!!$ENDDO + +! limit max der dep velocity based on 30 m box height (it is 10-15 m) +ZDVMAX=30.0_JPRB/PTSPHY + +!CALL SATUR (KIDIA, KFDIA, KLON , KTDIA, KLEV, PAP, PT, ZQSAT, 2 ) +PFDRYD(:)=0.0_JPRB +!IRH=12 +!write(3434,*)NDRYDEP +!NDRYDEP=1 +DO JAERO=1,subm_ngasspec!NACTAERO!NTDDEP + !JAER=NINDDDEP(JDDEP) + !write(3535,*)JAERO,TRIM(trlist%ti(JAERO)%basename) + !IF (TRIM(YAERO(JAERO)%CNAME)=='SO2')THEN + IF(TRIM(trlist%ti(JAERO)%basename)=='SO2')THEN + JAER=JAERO + ELSE + CYCLE + END IF +! ITYP=INAER(JAER)/10 +! IBIN=INAER(JAER)-ITYP*10 + DO JL=KIDIA,KFDIA + +!!$ ZRHCL(JL)=PQ(JL)/ZQSAT(JL,KLEV) + ZRHO = PRHO(JL,KLEV) +!!$ DO JTAB=1,12 +!!$ IF (ZRHCL(JL)*100._JPRB > RRHTAB(JTAB)) THEN +!!$ IRH(JL)=JTAB +!!$ ENDIF +!!$ ENDDO + ZAERO = PAERO(JL,KLEV,JAER) + PTSPHY * PTAERI(JL,KLEV,JAER) + !write(3434,*)PAERO(JL,KLEV,JAER) , PTSPHY * PTAERI(JL,KLEV,JAER) + !IF (ITYP == 5 .AND. IBIN == 2) THEN +! IF (.true.) THEN + ! use SUMO dry dep velocity for SO2 + !ZVDEP(JAER)=PSO2DD(JL) + ZVDEP=PSO2DD(JL) + ZHOURLT = (RPI - YDRIP%RWSOVR) - PGELAM(JL) + ! Difference w.r.t to longitude of sza max + ZSCALE = 1.0 + COS(ZHOURLT) * 0.7_JPRB + !ZVDEP(JAER) = ZSCALE * MIN(ZDVMAX,ZSCALE*ZVDEP(JAER)) + ZVDEP = ZSCALE * MIN(ZDVMAX,ZSCALE*ZVDEP) +!!$ ELSE +!!$ ZLAND= PLSM(JL) +!!$ ZOCEA= 1._JPRB-PLSM(JL) +!!$ ZFROC= ZOCEA*(1._JPRB-PCI(JL)) +!!$ ZSICE= ZOCEA*PCI(JL) +!!$ ZLICE= 0._JPRB +!!$ +!!$ ZVDEP2(JAER)= ZLAND * RVDPLND(JAER) + ZFROC * RVDPOCE(JAER) + & +!!$ & ZSICE * RVDPSIC(JAER) + ZLICE * RVDPLIC(JAER) +!!$ ZVDEP2(JAER)= MIN(ZVDEP2(JAER),ZMAXVDRY(JL)) +!!$ +!!$ ! set RHOP and WETD for each aerosol type +!!$ ZSIGMA=2.0_JPRB +!!$ IF (ITYP == 1) THEN + ! for land, adjust size +!!$ IF (PLSM(JL) > 0.5_JPRB) THEN +!!$ ZRHOP=RSSDENS_RHTAB(12) +!!$ ZWETD=1.E-6_JPRB*RMMD_SS(IBIN)*RSSGROWTH_RHTAB(12)/RSSGROWTH_RHTAB(9) +!!$ ELSE +!!$ ZRHOP=RSSDENS_RHTAB(IRH(JL)) +!!$ ZWETD=1.E-6_JPRB*RMMD_SS(IBIN)*RSSGROWTH_RHTAB(IRH(JL))/RSSGROWTH_RHTAB(9) +!!$ ENDIF +!!$ ELSEIF (ITYP == 2) THEN +!!$ ZRHOP=RRHO_DD(IBIN) +!!$ ZWETD=1.E-6_JPRB*RMMD_DD(IBIN) +!!$ ELSEIF (ITYP == 3) THEN +!!$ ZWETD=2._JPRB*ZR_OM*ZRH_GROWTH_OM(IRH(JL)) +!!$ ZVFRAC = 1.0 / ZRH_GROWTH_OM(IRH(JL))**3 +!!$ ZRHOP = ZRHO_H2O*(1.0-ZVFRAC) + ZVFRAC*ZRHO_OM +!!$ ELSEIF (ITYP == 4) THEN +!!$ ZVFRAC = 1.0 / ZRH_GROWTH_BC(IRH(JL))**3 +!!$ ZRHOP = ZRHO_H2O*(1.0-ZVFRAC) + ZVFRAC*ZRHO_BC +!!$ ZWETD=2._JPRB*ZR_BC*ZRH_GROWTH_BC(IRH(JL)) +!!$ ELSEIF (ITYP == 5) THEN ! SO4 only +!!$ ZVFRAC = 1.0 / ZRH_GROWTH_SO4(IRH(JL))**3 +!!$ ZRHOP = ZRHO_H2O*(1.0-ZVFRAC) + ZVFRAC*ZRHO_SO4 +!!$ ZWETD=2._JPRB*ZR_SO4*ZRH_GROWTH_SO4(IRH(JL)) +!!$ ELSEIF (ITYP == 6) THEN ! nitrate +!!$ ZVFRAC = 1.0 / ZRH_GROWTH_NI(IRH(JL))**3 +!!$ ZRHOP = ZRHO_H2O*(1.0-ZVFRAC) + ZVFRAC*ZRHO_NI(IBIN) +!!$ ZWETD=2._JPRB*ZR_NI(IBIN)*ZRH_GROWTH_NI(IRH(JL)) +!!$ ELSEIF (ITYP == 7) THEN ! Ammonium +!!$ ZVFRAC = 1.0 / ZRH_GROWTH_AM(IRH(JL))**3 +!!$ ZRHOP = ZRHO_H2O*(1.0-ZVFRAC) + ZVFRAC*ZRHO_AM +!!$ ZWETD=2._JPRB*ZR_AM*ZRH_GROWTH_AM(IRH(JL)) +!!$ ENDIF +!!$ +!!$ IF (LDRYDEPVEL_DYN) THEN +!!$ ! compute deposition velocity following Zhang et al 2001 +!!$ ! CALL AER_DRYDEPVEL(ZRHOP,ZWETD,ZSIGMA,PZ0M(JL),PCI(JL),PAERUST(JL),PDZ(JL),PT(JL,KLEV),ZRHO,ZVDEP(JAER)) +!!$ CALL ABOR1("dynamic dry dep for AER not yet supported in OIFS!") +!!$ +!!$ ZVDEP=MIN(0.1_JPRB,ZVDEP) +!!$ ELSE +!!$ ZVDEP(JAER)=ZVDEP2(JAER) +!!$ ENDIF + +! RVDPxxx (from su_aerp, derived from LMDZ in m s-1) +! formula is consistent: (xx m-2 s-1) - (m s-1) * (xx kg-1) * (kg m-3) +! PFAERO is then in xx m-2 s-1 +! ENDIF + + IF (NDRYDEP == 1) THEN + +!-- only the surface flux is diminished of the equivalent effect of the dry deposition +! but the vertical distribution of tendencies is untouched + + PFAERO(JL,JAER)=PFAERI(JL,JAER) & + & + ZVDEP * ZAERO * ZRHO + !PFDRYD(JL,JAER)=0._JPRB + PFDRYD(JL)=0._JPRB + + ELSE + +!-- Alternate formulation +! using the analytical solution (Flemming et al., 2011, D_GRG_4.6) +! The tendency in the lowest layer is modified, but the surface flux remains +! untouched. + + ZHGT= PGEOH(JL,KLEV-1) * Z1RG + ZALPHA= PTSPHY* ZVDEP/ZHGT +!-- using Euler forward +! ZAERI = ZAERO * (1.0_JPRB - ZALPHA) +!-- using Euler backward +! ZAERI = ZAERO * (1.0_JPRB + ZALPHA) +!-- using Euler centered +! ZAERI = ZAERO * ((1.0_JPRB - ZALPHA)/(1.0_JPRB + ZALPHA)) +!-- using the analytical solution (Flemming et al., 2011, D_GRG_4.6) + ZAERI = ZAERO * EXP(-1.0_JPRB * ZALPHA) +! PTAERO(JL,KLEV,JAER)= PTAERI(JL,KLEV,JAER) & +! & + (ZAERI-PAERO(JL,KLEV,JAER)) * Z1TSPHY + PTAERO(JL,KLEV,JAER)= PTAERO(JL,KLEV,JAER) & + & + (ZAERI-ZAERO) * Z1TSPHY + !write(3434,*)ZAERO , ZAERI + !write(3434,*)Z1TSPHY + !write(3434,*)PDP(JL,KLEV) + !write(3434,*)Z1RG + !if (((ZAERO - ZAERI))>1e-20_JPRB)THEN + PFDRYD(JL)= (ZAERO - ZAERI)*Z1TSPHY * PDP(JL,KLEV) * Z1RG + !ELSE + ! PFDRYD(JL)= 0.0_JPRB + !END if + PFAERO(JL,JAER)= PFAERI(JL,JAER) + + ENDIF +! write(3434,*)NDRYDEP,JL,PFAERO(JL,JAER),PFDRYD(JL) + ENDDO +ENDDO + +!IF (LLPRINT) THEN +! WRITE(UNIT=NULOUT,FMT='(1x,''DRYDEP'',I5,9E12.5)') KSTEP,PRHO(KIDIA,KLEV),& +! & (PFAERI(KIDIA,JAER),PFAERO(KIDIA,JAER),ZVDEP(JAER),PAERO(KIDIA,KLEV,JAER),JAER=3,YGFL%NACTAERO,3) +!ENDIF + +!----------------------------------------------------------------------- +END ASSOCIATE +IF (LHOOK) CALL DR_HOOK('M7_SIMPLE_SULFUR_DRYDEP',1,ZHOOK_HANDLE) +END SUBROUTINE M7_SIMPLE_SULFUR_DRYDEP diff --git a/ifs-source/arpifs/phys_ec/mo_activ.F90 b/ifs-source/arpifs/phys_ec/mo_activ.F90 new file mode 100644 index 00000000..f012ba40 --- /dev/null +++ b/ifs-source/arpifs/phys_ec/mo_activ.F90 @@ -0,0 +1,728 @@ +MODULE mo_activ + + USE mo_kind, ONLY: dp + +#ifdef HAMMOZ + USE mo_linked_list, ONLY: t_stream + USE mo_submodel_diag, ONLY: vmem3d +#endif + + IMPLICIT NONE + + PUBLIC activ_initialize + PUBLIC activ_updraft +#ifdef HAMMOZ + PUBLIC activ_lin_leaitch + PUBLIC construct_activ_stream +#endif + + PRIVATE + + INTEGER, PUBLIC :: idt_cdnc, idt_icnc, nfrzmod + +#ifdef HAMMOZ + TYPE (t_stream), PUBLIC, POINTER :: activ +#endif + + INTEGER, PUBLIC :: nw ! actual number of updraft velocity (w) bins + ! (can be 1 if characteristic updraft is used) +#ifndef HAMMOZ + TYPE :: vmem3d + REAL(dp), POINTER :: ptr(:,:,:) + END TYPE vmem3d +#endif + + REAL(dp), PUBLIC, POINTER :: swat(:,:,:) + REAL(dp), PUBLIC, POINTER :: w_cape(:,:) + REAL(dp), PUBLIC, POINTER :: w_sigma(:,:,:) +#ifdef HAMMOZ + REAL(dp), PUBLIC, POINTER :: reffl(:,:,:) + REAL(dp), PUBLIC, POINTER :: reffi(:,:,:) + REAL(dp), PUBLIC, POINTER :: w_large(:,:,:) + REAL(dp), PUBLIC, POINTER :: w_turb(:,:,:) +#else + !REAL(dp), PUBLIC, ALLOCATABLE :: reffl(:,:,:) + !REAL(dp), PUBLIC, ALLOCATABLE :: reffi(:,:,:) + !REAL(dp), PUBLIC, ALLOCATABLE :: w_large(:,:,:) + !REAL(dp), PUBLIC, ALLOCATABLE :: w_turb(:,:,:) +#endif + REAL(dp), PUBLIC, POINTER :: na(:,:,:) + REAL(dp), PUBLIC, POINTER :: qnuc(:,:,:) + REAL(dp), PUBLIC, POINTER :: qaut(:,:,:) + REAL(dp), PUBLIC, POINTER :: qacc(:,:,:) + REAL(dp), PUBLIC, POINTER :: qfre(:,:,:) + REAL(dp), PUBLIC, POINTER :: qeva(:,:,:) + REAL(dp), PUBLIC, POINTER :: qmel(:,:,:) + REAL(dp), PUBLIC, POINTER :: cdnc_acc(:,:,:) + REAL(dp), PUBLIC, POINTER :: cdnc(:,:,:) + REAL(dp), PUBLIC, POINTER :: icnc_acc(:,:,:) + REAL(dp), PUBLIC, POINTER :: icnc(:,:,:) + REAL(dp), PUBLIC, POINTER :: icnc_instantan(:,:,:) ! Ice crystal number concentration (ICNC), actual instantaneous value [1/m3] + REAL(dp), PUBLIC, POINTER :: lwc_acc(:,:,:) + REAL(dp), PUBLIC, POINTER :: iwc_acc(:,:,:) + REAL(dp), PUBLIC, POINTER :: cloud_time(:,:,:) + REAL(dp), PUBLIC, POINTER :: cliwc_time(:,:,:) + REAL(dp), PUBLIC, POINTER :: cdnc_burden_acc(:,:) + REAL(dp), PUBLIC, POINTER :: cdnc_burden(:,:) + REAL(dp), PUBLIC, POINTER :: icnc_burden_acc(:,:) + REAL(dp), PUBLIC, POINTER :: icnc_burden(:,:) + REAL(dp), PUBLIC, POINTER :: burden_time(:,:) + REAL(dp), PUBLIC, POINTER :: burdic_time(:,:) + REAL(dp), PUBLIC, POINTER :: reffl_acc(:,:,:) + REAL(dp), PUBLIC, POINTER :: reffi_acc(:,:,:) + REAL(dp), PUBLIC, POINTER :: cloud_cover_duplic(:,:,:) + REAL(dp), PUBLIC, POINTER :: sice(:,:,:) + REAL(dp), PUBLIC, POINTER :: reffl_ct(:,:) + REAL(dp), PUBLIC, POINTER :: reffl_time(:,:) + REAL(dp), PUBLIC, POINTER :: cdnc_ct(:,:) + REAL(dp), PUBLIC, POINTER :: reffi_tovs(:,:) + REAL(dp), PUBLIC, POINTER :: reffi_time(:,:) + REAL(dp), PUBLIC, POINTER :: iwp_tovs(:,:) + + TYPE(vmem3d), PUBLIC, ALLOCATABLE :: w(:) + TYPE(vmem3d), PUBLIC, ALLOCATABLE :: w_pdf(:) + TYPE(vmem3d), PUBLIC, ALLOCATABLE :: swat_max_strat(:) + TYPE(vmem3d), PUBLIC, ALLOCATABLE :: swat_max_conv(:) + + REAL(dp) :: w_min = 0.0_dp ! minimum characteristic w for activation [m s-1] + REAL(dp), PARAMETER :: w_sigma_min = 0.1_dp ! minimum value of w standard deviation [m s-1] + + !--- Subroutines: + +CONTAINS + + SUBROUTINE activ_updraft(kproma, kbdim, klev, krow, & + ptkem1, pwcape, pvervel, prho, & + pw, pwpdf ) + + ! *activ_updraft* calculates the updraft vertical velocity + ! as sum of large scale and turbulent velocities + ! + ! Author: + ! ------- + ! Philip Stier, University of Oxford 2008 + ! + ! References: + ! ----------- + ! Lohmann et al., ACP, (2008) + ! + + USE mo_physical_constants, ONLY: grav + !>>SF #345 +#ifdef HAMMOZ + USE mo_cloud_utils, ONLY: fact_tke +#endif + USE mo_param_switches, ONLY: ncd_activ + !<0.0) [m s-1] + REAL(dp), INTENT(out) :: pwpdf(kbdim,klev,nw) ! stratiform updraft velocity PDF + + + REAL(dp), INTENT(in) :: prho(kbdim,klev), & ! air density + ptkem1(kbdim,klev), & ! turbulent kinetic energy + pvervel(kbdim,klev), & ! large scale vertical velocity [Pa s-1] + pwcape(kbdim) ! CAPE contribution to convective vertical velocity [m s-1] +#ifndef HAMMOZ + REAL(dp) :: fact_tke = 0.7_dp !SF #345 +#endif + REAL(dp) :: w_turb(kbdim,klev, 1) ! zkrow =1 + REAL(dp) :: zwlarge(kbdim, klev), & ! large-scale vertical velocity [m s-1] + zwturb(kbdim, klev) ! TKE-derived vertical velocity or st. dev. thereof [m s-1] + + !--- Large scale vertical velocity in SI units: + + zwlarge(1:kproma,:) = -1._dp* pvervel(1:kproma,:)/(grav*prho(1:kproma,:)) + !w_large(1:kproma,:,krow) = zwlarge(1:kproma,:) + + !--- Turbulent vertical velocity: + + w_turb(1:kproma,:,krow) = fact_tke*SQRT(ptkem1(1:kproma,:)) + + !>>SF #345: correction for the TKE prefactor, in case of Lin & Leaitch scheme only + IF (ncd_activ == 1) THEN ! Lin & Leaitch scheme + w_turb(1:kproma,:,krow) = 1.33_dp*SQRT(ptkem1(1:kproma,:)) + ENDIF + !< HK: Lin & Leaitch only to be used with HAMMOZ +#ifdef HAMMOZ + SUBROUTINE activ_lin_leaitch(kproma, kbdim, klev, krow, & + pw, pcdncact ) + + ! *activ_lin_leaitch* calculates the number of activated aerosol + ! particles from the aerosol number concentration + !SF now independent of HAM, since HAM-specific calculation are computed in mo_ham_activ + ! + ! Author: + ! ------- + ! Philip Stier, MPI-MET 2004 + ! + ! Method: + ! ------- + ! The parameterisation follows the simple empirical relations of + ! Lin and Leaitch (1997). + ! Updraft velocity is parameterized following Lohmann et al. (1999). + ! + + USE mo_kind, ONLY: dp + USE mo_conv, ONLY: na_cv, cdncact_cv + + IMPLICIT NONE + + INTEGER, INTENT(IN) :: kproma, kbdim, klev, krow + + REAL(dp), INTENT(IN) :: pw(kbdim,klev) ! stratiform updraft velocity, large-scale+TKE (>0.0) [m s-1] + REAL(dp), INTENT(out) :: pcdncact(kbdim,klev) ! number of activated particles + + REAL(dp), PARAMETER :: c2=2.3E-10_dp, & ! [m4 s-1] + c3=1.27_dp ! [1] + + INTEGER :: jl, jk + REAL(dp) :: zNmax, zeps + + zeps=EPSILON(1.0_dp) + + pcdncact(:,:) = 0._dp + cdncact_cv(:,:,krow) = 0._dp + + !--- Aerosol activation: + + DO jk=1, klev + DO jl=1, kproma + + !--- Stratiform clouds: + + ! Activation occurs only in occurrence of supersaturation + + !>>SF note: + ! The previous temperature restriction (temp > homogeneous freezing temp) + ! has been removed because it was preventing to diagnose the number of + ! dust and BC particules in soluble modes where temp < hom. freezing. + ! The rationale behind is that diagnosing this allows further + ! devel to implement concurrent homogeneous vs heterogenous freezing processes + ! (which is not yet part of this version, though). + ! + !IMPORTANT: + ! This temperature condition removal is completely transparent for the sanity + ! of the current code, since relevant temperature ranges are now safely checked + ! directly in cloud_cdnc_icnc + !<zeps .AND. na(jl,jk,krow)>zeps) THEN + + !--- Maximum number of activated particles [m-3]: + + zNmax=(na(jl,jk,krow)*pw(jl,jk))/(pw(jl,jk)+c2*na(jl,jk,krow)) + + ! Average number of activated particles [m-3]: + ! zNmax need to be converted to [cm-3] and the + ! result to be converted back to [m-3]. + + pcdncact(jl,jk)=0.1E6_dp*(1.0E-6_dp*zNmax)**c3 + + END IF + + !--- Convective clouds: + + IF(pw(jl,jk)>zeps .AND. na_cv(jl,jk,krow)>zeps) THEN + + zNmax=(na_cv(jl,jk,krow)*pw(jl,jk))/(pw(jl,jk)+c2*na_cv(jl,jk,krow)) + cdncact_cv(jl,jk,krow)=0.1E6_dp*(1.0E-6_dp*zNmax)**c3 + + ENDIF + + END DO + END DO + + END SUBROUTINE activ_lin_leaitch +#endif +!<-- HK + + SUBROUTINE activ_initialize + + USE mo_control, ONLY: nlev, nn, & + lcouple !SF +#ifdef HAMMOZ + USE mo_exception, ONLY: message, em_param + USE mo_submodel, ONLY: print_value, lham, lhammoz, lccnclim + USE mo_echam_cloud_params, ONLY: ccsaut, ccraut + USE mo_tracer, ONLY: get_tracer +#endif + USE mo_param_switches, ONLY : icover, nauto, & !++mgs + ncd_activ, nactivpdf, nic_cirrus, lcdnc_progn, & + cdnc_min_fixed + USE mo_ham, ONLY: nham_subm, HAM_SALSA, HAM_M7 + + CHARACTER(len=24) :: csubmname + + !--- Set number of updraft bins: + + SELECT CASE(ABS(nactivpdf)) + CASE(0) + nw = 1 + CASE(1) + nw = 20 + CASE DEFAULT + nw = ABS(nactivpdf) + END SELECT + +!--> HK: HAMMOZ related variables +#ifdef HAMMOZ + IF (nactivpdf <= 0) THEN + ! These are used either if not using a PDF, or if per-bin + ! diagnostics are requested. + ALLOCATE(w(nw)) + ALLOCATE(w_pdf(nw)) + ALLOCATE(swat_max_strat(nw)) + ALLOCATE(swat_max_conv(nw)) + END IF + + ! + !-- overwrite values for coupled CDNC/ICNC cloud scheme + ! + IF (lcdnc_progn) THEN + IF (nlev == 31) THEN + IF (nn == 63) THEN + SELECT CASE (ncd_activ) + CASE(1) ! LL activtion + !SF: updated on 2015.02.25 (David Neubauer / Katty Huang, pure atm run, HAM-M7, LL activation) + ccsaut = 1200._dp + ccraut = 3.5_dp + CASE(2) !AR&G activation + SELECT CASE(cdnc_min_fixed) + CASE(10) + !SF: updated on 2017.02.14 (David Neubauer, pure atm run, HAM-M7) + ccsaut = 900._dp + ccraut = 2.8_dp + CASE(40) + !SF: updated on 2017.02.14 (David Neubauer, pure atm run, HAM-M7) + ccsaut = 900._dp + ccraut = 10.6_dp + END SELECT + END SELECT + ENDIF + ENDIF + + IF (nlev == 47) THEN + IF (nn == 63) THEN + SELECT CASE (ncd_activ) + CASE(1) ! LL activtion + !SF: updated on 2015.02.19 (David Neubauer, pure atm run, HAM-M7, LL activation) + ccsaut = 800._dp + ccraut = 5._dp + CASE(2) ! AR&G activtion + SELECT CASE(cdnc_min_fixed) + CASE(10) + !SF: updated on 2017.02.14 (David Neubauer, pure atm run, HAM-M7) + IF(nham_subm == HAM_M7) THEN + ccsaut = 900._dp + ccraut = 2.8_dp + END IF + !alaak: updated on 2019.02.xx (pure atm run, HAM-SALSA) + IF(nham_subm == HAM_SALSA) THEN + ccsaut = 1200._dp + ccraut = 4.0_dp + END IF + CASE(40) + !alaak: updated on 2019.02.xx (pure atm run, HAM-SALSA) + IF(nham_subm == HAM_M7) THEN + ccsaut = 900._dp + ccraut = 10.6_dp + END IF + IF(nham_subm == HAM_SALSA) THEN + ccsaut = 900._dp + ccraut = 15_dp + END IF + END SELECT + END SELECT + ENDIF + ENDIF + ENDIF +!#endif +!<-- HK + +!>>SF + !-- Define the cdnc and icnc tracer index to point to the correct tracer: + CALL get_tracer('CDNC',idx=idt_cdnc) + CALL get_tracer('ICNC',idx=idt_icnc) +!< HK: writing out only for HAMMOZ +!#ifdef HAMMOZ + ! + !-- Write out new parameters + ! + IF (ncd_activ>0 .OR. nic_cirrus>0) THEN + + csubmname = 'UNKNOWN' + IF (lham) csubmname = 'HAM' + IF (lhammoz) csubmname = 'HAMMOZ' + IF (lccnclim) csubmname = 'CCNCLIM' + + CALL message('','') + CALL message('','----------------------------------------------------------') + CALL message('activ_initialize','Parameter settings for the ECHAM-'//TRIM(csubmname) & + //' cloud microphysics scheme') + CALL message('','---') + CALL print_value(' ncd_activ = ', ncd_activ) + CALL print_value(' nic_cirrus = ', nic_cirrus) + CALL message('', ' => Parameter adjustments in mo_activ:', level=em_param) + CALL print_value(' ccsaut =', ccsaut) + CALL print_value(' ccraut =', ccraut) + CALL message('','---') + CALL message('','----------------------------------------------------------') + + ENDIF +#endif +!<--HK + + END SUBROUTINE activ_initialize + +!--> HK: Streams to be only used with HAMMOZ +#ifdef HAMMOZ + SUBROUTINE construct_activ_stream + + ! *construct_stream_activ* allocates output streams + ! for the activation schemes + ! + ! Author: + ! ------- + ! Philip Stier, MPI-MET 2004 + ! + + USE mo_memory_base, ONLY: new_stream, add_stream_element, AUTO, & + default_stream_setting, add_stream_reference + USE mo_filename, ONLY: trac_filetype + USE mo_linked_list, ONLY: HYBRID + USE mo_param_switches, ONLY: ncd_activ, nactivpdf, nic_cirrus !SF + + IMPLICIT NONE + + INTEGER :: jw + CHARACTER(len=10) :: cbin + + + !--- Create new stream: + + CALL new_stream (activ ,'activ',filetype=trac_filetype) + + + !--- Add standard fields for post-processing: + + CALL add_stream_reference (activ, 'geosp' ,'g3b' ,lpost=.TRUE.) + CALL add_stream_reference (activ, 'lsp' ,'sp' ,lpost=.TRUE.) + CALL add_stream_reference (activ, 'aps' ,'g3b' ,lpost=.TRUE.) + CALL add_stream_reference (activ, 'gboxarea','geoloc',lpost=.TRUE.) + + CALL default_stream_setting (activ, lpost = .TRUE. , & + lrerun = .TRUE. , & + leveltype = HYBRID , & + table = 199, & + code = AUTO ) + !--- 1) Cloud Properties: + + CALL add_stream_element (activ, 'SWAT', swat, & + longname='ECHAM supersaturation over water', units='% [0-1]' ) + + IF (ncd_activ==2) THEN + + IF (nactivpdf == 0) THEN + CALL add_stream_element (activ, 'SWAT_MAX_STRAT', swat_max_strat(1)%ptr, & + longname='maximum supersaturation stratiform', units='% [0-1]' ) + + CALL add_stream_element (activ, 'SWAT_MAX_CONV', swat_max_conv(1)%ptr, & + longname='maximum supersaturation convective', units='% [0-1]' ) + ELSE IF (nactivpdf < 0) THEN + DO jw=1,nw + WRITE (cbin, "(I2.2)") jw + CALL add_stream_element (activ, 'SWAT_MAX_STRAT_'//TRIM(cbin), swat_max_strat(jw)%ptr, & + longname='maximum supersaturation stratiform, vertical velocity bin '//TRIM(cbin), & + units='% [0-1]' ) + + CALL add_stream_element (activ, 'SWAT_MAX_CONV_'//TRIM(cbin), swat_max_conv(jw)%ptr, & + longname='maximum supersaturation convective, vertical velocity bin '//TRIM(cbin), & + units='% [0-1]' ) + END DO + END IF + ENDIF + + IF (nactivpdf == 0) THEN + CALL add_stream_element (activ, 'W', w(1)%ptr, & + longname='total vertical velocity for activation',units='m s-1') + ELSE IF (nactivpdf < 0) THEN + DO jw=1, nw + WRITE (cbin, "(I2.2)") jw + CALL add_stream_element (activ, 'W_'//TRIM(cbin), w(jw)%ptr, & + longname='Vertical velocity bin '//TRIM(cbin)//' for activation', & + units='m s-1') + + CALL add_stream_element (activ, 'W_PDF_'//TRIM(cbin), w_pdf(jw)%ptr, & + longname='Vertical velocity PDF in bin '//TRIM(cbin)//' for activation', & + units='s m-1') + END DO + END IF + + CALL add_stream_element (activ, 'W_LARGE', w_large, & + longname='large scale vertical velocity', units='m s-1' ) + + IF (nactivpdf == 0) THEN + CALL add_stream_element (activ, 'W_TURB', w_turb, & + longname='turbulent vertical velocity', units='m s-1' ) + ELSE + CALL add_stream_element (activ, 'W_SIGMA', w_sigma, & + longname='sub-grid st. dev. of vertical velocity', units='m s-1' ) + END IF + + CALL add_stream_element (activ, 'W_CAPE', w_cape, & + longname='convective updraft velocity from CAPE', units='m s-1') + + CALL add_stream_element (activ, 'REFFL', reffl, & + longname='cloud drop effectiv radius', units='um' ) + + IF (nic_cirrus>0) THEN + + CALL add_stream_element (activ, 'REFFI', reffi, & + longname='ice crystal effectiv radius', units='um' ) + END IF + + CALL add_stream_element (activ, 'NA', na, & + longname='aerosol number for activation', units='m-3' ) + + CALL default_stream_setting (activ, laccu=.TRUE.) + + CALL add_stream_element (activ, 'QNUC', qnuc, & + longname='CD nucleation rate', units='m-3 s-1' ) + + CALL add_stream_element (activ, 'QAUT', qaut, & + longname='CD autoconversion rate', units='m-3 s-1' ) + + CALL add_stream_element (activ, 'QACC', qacc, & + longname='CD accretion rate', units='m-3 s-1' ) + + CALL add_stream_element (activ, 'QFRE', qfre, & + longname='CD freezing rate', units='m-3 s-1' ) + !>>dod deleted QEVA, not used anywhere + ! CALL add_stream_element (activ, 'QEVA', qeva, & + ! longname='CD evaporation rate', units='m-3 s-1' ) + + CALL add_stream_element (activ, 'QMEL', qmel, & + longname='CD source rate from melting ice', units='m-3 s-1' ) + + CALL add_stream_element (activ, 'CDNC_ACC', cdnc_acc, & + longname='CDNC occurence acc.+ cloud weighted',units='m-3' ) + + CALL add_stream_element (activ, 'CDNC', cdnc, & + longname='CDNC',units='m-3' ) + + CALL add_stream_element (activ, 'CDNC_BURDEN_ACC',cdnc_burden_acc, & + longname='CDNC burden occurence accumulated', units='m-2' ) + + CALL add_stream_element (activ, 'CDNC_BURDEN',cdnc_burden, & + longname='CDNC burden', units='m-2' ) + + CALL add_stream_element (activ, 'BURDEN_TIME',burden_time, & + longname='acc. cdnc burden occ.time fraction', units='1' ) + + CALL add_stream_element (activ, 'LWC_ACC', lwc_acc, & + longname='liq wat cont acc.+ cloud weighted', units='kg m-3' ) + + CALL add_stream_element (activ, 'CLOUD_TIME', cloud_time, & + longname='acc. cloud occurence time fraction', units='1' ) + + CALL add_stream_element (activ, 'REFFL_ACC', reffl_acc, & + longname='cloud drop effectiv radius weighted',units='um' ) + + CALL add_stream_element (activ, 'REFFL_CT', reffl_ct, & + longname='cloud top effectiv radius weighted',units='um' ) + + CALL add_stream_element (activ, 'REFFL_TIME', reffl_time, & + longname='cloud top effectiv radius occ.time',units='1' ) + + CALL add_stream_element (activ, 'CDNC_CT', cdnc_ct, & + longname='cloud top cloud droplet number conc.',units='cm-3' ) + + CALL add_stream_element (activ, 'IWC_ACC', iwc_acc, & + longname='ice wat cont acc.+ cloud weighted', units='kg m-3' ) + + CALL add_stream_element (activ, 'CLIWC_TIME', cliwc_time, & + longname='acc. cloud occurence time fraction', units='1' ) + + CALL default_stream_setting (activ, laccu=.FALSE., lpost=.FALSE.) + + CALL add_stream_element (activ, 'CLOUD_COVER_DUPLIC', cloud_cover_duplic, & + longname='cloud cover duplicate for record at t+1', units='1' ) + + + IF (nic_cirrus>0) THEN + + CALL add_stream_element (activ, 'ICNC_instantaneous', icnc_instantan, & + longname='ICNC instantaneous', units='m-3', & + laccu=.FALSE., lpost=.TRUE., lrerun=.TRUE.) + + CALL default_stream_setting (activ, laccu=.TRUE., lpost=.TRUE.) + + CALL add_stream_element (activ, 'ICNC_ACC', icnc_acc, & + longname='ICNC occurence acc.+ cloud weighted',units='m-3' ) + + CALL add_stream_element (activ, 'ICNC', icnc, & + longname='ICNC',units='m-3' ) + + CALL add_stream_element (activ, 'ICNC_BURDEN_ACC',icnc_burden_acc, & + longname='ICNC burden occurence accumulated', units='m-2' ) + + CALL add_stream_element (activ, 'ICNC_BURDEN',icnc_burden, & + longname='ICNC burden', units='m-2' ) + + CALL add_stream_element (activ, 'BURDIC_TIME',burdic_time, & + longname='acc. icnc burden occ.time fraction', units='1' ) + + CALL add_stream_element (activ, 'REFFI_ACC', reffi_acc, & + longname='ice crystal effectiv radius weighted',units='um' ) + + CALL add_stream_element (activ, 'REFFI_TOVS', reffi_tovs, & + longname='semi-transparent cirrus effectiv radius',units='um' ) + + CALL add_stream_element (activ, 'REFFI_TIME', reffi_time, & + longname='accumulted semi-transp. cirrus time',units='1' ) + + CALL add_stream_element (activ, 'IWP_TOVS', iwp_tovs, & + longname='IWP sampled a la TOVS',units='kg m-2' ) + + CALL default_stream_setting (activ, laccu=.FALSE.) + + CALL add_stream_element (activ, 'SICE', sice, & + longname='ECHAM supersaturation over ice', units='% [0-1]' ) + + END IF + + CALL default_stream_setting (activ, laccu=.FALSE.) + +END SUBROUTINE construct_activ_stream +#endif +!<-- HK + +END MODULE mo_activ diff --git a/ifs-source/arpifs/phys_ec/mo_advection.F90 b/ifs-source/arpifs/phys_ec/mo_advection.F90 new file mode 100644 index 00000000..8b3fd2ff --- /dev/null +++ b/ifs-source/arpifs/phys_ec/mo_advection.F90 @@ -0,0 +1,35 @@ +!> +!! @par Copyright +!! This code is subject to the MPI-M-Software - License - Agreement in it's most recent form. +!! Please see URL http://www.mpimet.mpg.de/en/science/models/model-distribution.html and the +!! file COPYING in the root of the source tree for this code. +!! Where software is supplied by third parties, it is indicated in the headers of the routines. +!! +MODULE mo_advection + + ! L. Kornblueh, MPI, August 2001, initial coding + ! L. Kornblueh, MPI, Februrary 2012, remove spitfire + + IMPLICIT NONE + + PUBLIC + + ! defined advection schemes for passive tracer (in advection sense) + + INTEGER, PARAMETER :: no_advection = 0 + INTEGER, PARAMETER :: semi_lagrangian = 1 + INTEGER, PARAMETER :: tpcore = 3 + + ! select variable, set in namelist runctl + + INTEGER :: iadvec + + ! general dimension parameters to be set in the init section of + ! the diferent advection modules + + INTEGER :: nalatd, nalond, nalev, nacnst, nalat, nalon + + INTEGER, PARAMETER :: jps = 3 ! basic advected variables without tracers: + ! water vapour, cloud water, cloud ice + +END MODULE mo_advection diff --git a/ifs-source/arpifs/phys_ec/mo_constants.F90 b/ifs-source/arpifs/phys_ec/mo_constants.F90 new file mode 100644 index 00000000..c9a6f005 --- /dev/null +++ b/ifs-source/arpifs/phys_ec/mo_constants.F90 @@ -0,0 +1,25 @@ +MODULE mo_constants +!- Description: +! +! This module contains basic constants and derived constants +! +!- Author: +! +! M. Giorgetta, MPI, April 1999 +! I. Kirchner, MPI, December 2000, time control +! L. Kornblueh, MPI, January 2001, cleanup + USE mo_kind, ONLY: dp + +! eehol: added pointers to constants + USE RTTOV_CONST, ONLY: & + api => PI, & + argas => RGC, & + avo => NA + + IMPLICIT NONE +! Universal constants + !REAL(dp), PARAMETER :: api = 3.14159265358979323846_dp ! pi !<--eehol + REAL(dp), PARAMETER :: asqrt2 = 1.41421356237309504880_dp + !REAL(dp), PARAMETER :: argas = 8.314409_dp ! universal gas constant (R) in J/K/mol !<--eehol + !REAL(dp), PARAMETER :: avo = 6.02214e23_dp ! Avogadro constant in 1/mol !<--eehol +END MODULE mo_constants diff --git a/ifs-source/arpifs/phys_ec/mo_control.F90 b/ifs-source/arpifs/phys_ec/mo_control.F90 new file mode 100644 index 00000000..a4efb2ed --- /dev/null +++ b/ifs-source/arpifs/phys_ec/mo_control.F90 @@ -0,0 +1,144 @@ +!> +!! @par Copyright +!! This code is subject to the MPI-M-Software - License - Agreement in it's most recent form. +!! Please see URL http://www.mpimet.mpg.de/en/science/models/model-distribution.html and the +!! file COPYING in the root of the source tree for this code. +!! Where software is supplied by third parties, it is indicated in the headers of the routines. +!! +MODULE mo_control + + ! Control variables for model housekeeping. + ! + ! U. Schlese, DKRZ, December 1994 + ! A. Rhodin, MPI, January 1999, + ! Subroutine m_control renamed to alloc_mods and moved from + ! module mo_control to module m_alloc_mods. + ! L. Kornblueh, MPI, June 1999, + ! added nproca and nprocb for driving the parallel decomposition + ! M. Esch, MPI, June 1999, ECHAM5-modifications + ! I. Kirchner, MPI, December 2000, time control + ! I. Kirchner, MPI, March 2001, revision + ! M. Esch, MPI, September 2002, add switch for mixed layer ocean + ! M. Esch, MPI, November 2003, add switch for scenario runs + ! L. Kornblueh, MPI, April 2010, more switches for parallel I/O + ! D. Popke, MPI, Nov 2013, Implementation of RCE (lrce) + ! ------------------------------------------------------------------ + + USE mo_kind, ONLY: dp + + IMPLICIT NONE + + SAVE ! to assure that the scope of all variables is for the whole program run + + REAL(dp), POINTER :: vct(:)=>NULL() ! vertical coefficients table. + + INTEGER :: nproma = -1 ! working dimension for grid-point computations + INTEGER :: nproca = 1 ! number of processors in set A + INTEGER :: nprocb = 1 ! number of processors in set B + INTEGER :: nprocio = 0 ! number of processors for I/O server + + INTEGER :: nm ! max zonal wave number. + INTEGER :: nn ! max meridional wave number for m=0. + INTEGER :: nk ! max meridional wave number. + INTEGER :: ngl ! number of gaussian latitudes. + INTEGER :: nlon ! max number of points on each latitude line. + INTEGER :: nlev ! number of vertical levels. + INTEGER :: nmp1 ! max zonal wave number + 1. + INTEGER :: nnp1 ! max meridional wave number + 1. + INTEGER :: nkp1 + INTEGER :: n2mp1 ! 2 * (max zonal wave number + 1). + INTEGER :: n4mp1 ! 4 * (max zonal wave number + 1). + INTEGER :: nlp2 ! max number of points per latitude line + 2. + INTEGER :: nlevp1 ! *nlev+1. + INTEGER :: nsp ! number of spectral coefficients. + INTEGER :: n2sp ! 2*number of spectral coefficients. + INTEGER :: nhgl ! (number of gaussian latitudes)/2. + INTEGER :: nscan ! current scan number. + + INTEGER :: nspace1 ! memory manager space for use of root task + INTEGER :: nspace2 ! memory manager space for use of subtasks + + INTEGER :: nspadd ! memory manager space increase + + INTEGER :: nvclev ! number of levels with vertical coefficients. + + LOGICAL :: ldebug = .FALSE. ! .true. for mass fixer diagnostics + LOGICAL :: ldailysst = .FALSE. ! .true. for using daily SST and SIC + LOGICAL :: lamip = .FALSE. ! .true. for using variable sst + LOGICAL :: ldiagamip = .FALSE. ! .true. for AMIP diagnostics + LOGICAL :: lcouple = .FALSE. ! .true. for a coupled run + LOGICAL :: lcouple_co2 = .FALSE. ! .true. if coupled run includes co2 + LOGICAL :: lcouple_parallel = .FALSE. ! .true. if all PEs should communicate with oasis + LOGICAL :: lnwp = .FALSE. ! .false. for climate mode .true. for NWP mode + LOGICAL :: lnudge = .FALSE. ! .true. for Nudging mode + LOGICAL :: lmidatm = .TRUE. ! .true. for middle atmosphere model version + LOGICAL :: lmlo = .FALSE. ! .true. for mixed layer ocean + LOGICAL :: lmeltpond = .TRUE. ! .true. for calculation of meltponds + LOGICAL :: lmlo_ice = .TRUE. ! .true. for sea ice calculation in mixed layer ocean + REAL(dp):: rmlo_depth = 50._dp ! default mixed layer depth + REAL(dp):: earth_angular_velocity = 7.29212e-5_dp !! [rad/s] default value for model angular + !velocity, is set to namelist value once + !runctl is read in inictl.f90 + LOGICAL :: lrce = .FALSE. ! .true. if ECHAM is run in radiative-convective equilibrium + ! configuration; switches to RCE radiation calculation, + ! regulates pbl height calculation (vdiff.f90), + ! sets oceans surface albedo of direct radiation to constant + LOGICAL :: lfractional_mask = .FALSE. ! .true. for fractional land sea mask + + LOGICAL :: lprint_m0 = .FALSE. ! .false. for printing t(m0) and timestep time in stepon + LOGICAL :: lnmi = .FALSE. ! .true. normal mode initialisation + LOGICAL :: ltdiag = .FALSE. ! .true. run with additional tendency diagnostics + LOGICAL :: lcolumn = .FALSE. ! .true. column model mode + LOGICAL :: lvctch = .FALSE. ! .true. if column model has changed vct + + LOGICAL :: l_volc = .FALSE. ! switch for volcanic forcing + + REAL(dp):: satoverpasstime = 10.5_dp ! satellite overpass time at 10.30 a.m. [s] + + LOGICAL :: lhd ! activates hydrologic discharge (HD) model (defined in jsbach namelist jsbach_ctl) + + + ! Spectral and grid point initial files. + INTEGER, PARAMETER :: nisp = 23 ! unit for initial spectral fields. + INTEGER, PARAMETER :: nigp = 24 ! unit for initial grid point fields. + + ! Climate sea surface temperature and sea ice annual cycle file + INTEGER, PARAMETER :: nist = 20 ! unit for surf.temp. file + INTEGER, PARAMETER :: nice = 96 ! unit for amip ice file + + ! Climate flux correction file + INTEGER, PARAMETER :: nflu = 42 ! unit for flux correction file + + ! Climate leaf area index and vegetation ratio annual cycle file + INTEGER, PARAMETER :: nvltcl = 90 ! unit for climate leaf area index + INTEGER, PARAMETER :: nvgratcl = 91 ! unit for climate vegetation ratio + + ! Climate land surface temperature annual cycle file + INTEGER, PARAMETER :: ntslcl = 92 ! unit for climate land surface temperature + + INTEGER, PARAMETER :: nsurface = 79 ! unit for boundary atm-surface jsbach + + ! optional files + INTEGER :: ndiahdf = 10 ! I/O unit for hdiff diagnostics. + + ! Switches + LOGICAL :: ltimer = .FALSE. ! to use timer + LOGICAL :: ldebugio = .FALSE. ! to debug IO + LOGICAL :: ldebugmem = .FALSE. ! to debug memory + LOGICAL :: ltctest = .FALSE. ! to test time control + LOGICAL :: ldebugs = .FALSE. ! to enable debug stream + LOGICAL :: lindependent_read = .FALSE. ! to read initial/restart input on each MPI rank separatly + LOGICAL :: lcollective_write = .FALSE. ! to write restart in parallel on each MPI rank + LOGICAL :: ldebugcpl = .FALSE. ! to debug coupling +!>>SF: to switchable internal rerun + LOGICAL :: lforcererun = .TRUE. ! to switch on/off internal rerun: + ! - true means internal rerun are forced (default in ECHAM6) + ! - false means internal rerun are bypassed (compulsory in ECHAM-HAMMOZ) +!<>dod<< + lrerun = .TRUE. , & + leveltype = HYBRID , & + table = 199, & + code = AUTO ) + + ! cloud Properties: + + CALL add_stream_element (conv, 'TWC_CONV', twc_conv, & + longname='LWC+IWC from detr.+ cloud weighted', units='kg m-3') + + CALL add_stream_element (conv, 'CONV_TIME', conv_time, & + longname='acc. cloud occ. conv time fraction', units='1' ) + + CALL add_stream_element (conv, 'CDNCACT_CV', cdncact_cv, lpost=.false., laccu=.false., & + longname='activated CDNC in conv', units='m-3' ) + + CALL add_stream_element (conv, 'NA_CV', na_cv, lpost=.false., laccu=.false., & + longname='aerosols for nucleation in conv', units='m-3' ) + + END SUBROUTINE construct_stream_conv +#endif +END MODULE mo_conv + diff --git a/ifs-source/arpifs/phys_ec/mo_convert_concentrations.F90 b/ifs-source/arpifs/phys_ec/mo_convert_concentrations.F90 new file mode 100644 index 00000000..396db687 --- /dev/null +++ b/ifs-source/arpifs/phys_ec/mo_convert_concentrations.F90 @@ -0,0 +1,197 @@ +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! \filename +!! mo_convert_concentrations.f90 +!! +!! \brief +!! Contains subroutines and functions to convert initial concentrations to pxtm1 and then pxtm1 back +!! to concentrations and mixing ratios. In addition, the gas conversion to mixing ratio +!! is done in a different routine as it is calculated for different time steps. +!! +!! +!! \author Eemeli Holopainen (FMI) +!! +!! \responsible_coder +!! Eemeli Holopainen, eemeli.holopainen@fmi.fi +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +MODULE mo_convert_concentrations + + PUBLIC :: conc2mmr + PUBLIC :: mmr2conc + +CONTAINS + + SUBROUTINE conc2mmr(kproma,kbdim,klev, & + ktrac,pxtm1,paerml,paernl,prhoa) + + USE mo_kind, ONLY : dp + + USE mo_species, ONLY: & + speclist + + USE mo_ham_species, ONLY: & + id_so4 + + USE mo_ham, ONLY: naerocomp, aerocomp, subm_aerounitconv, subm_aero_idx, & + sizeclass, mw_so4, nclass, immr2molec + + USE mo_physical_constants, ONLY: avo + + USE mo_exception, ONLY: finish, message, message_text + + IMPLICIT NONE + + INTEGER, PARAMETER :: nmod = 7 + + !-- input output variables -------- + INTEGER, INTENT(IN) :: & + kproma, & + kbdim, & + klev, & ! number of vertical levels + ktrac + + REAL(dp), INTENT(IN) :: prhoa(kbdim,klev), & ! air mass density [kg m-3] + paerml(kbdim,klev,naerocomp), & + paernl(kbdim,klev,nclass) + + REAL(dp), INTENT(INOUT) :: & + pxtm1(kbdim,klev,ktrac) ! tracer mass/number mixing ratio + + + !-- local variables -------- + + INTEGER :: ii, jj, kk + INTEGER :: jt, jn ,jl, jk, jspec ! for indexing + + REAL(dp):: zfac, & + zfacm, & + zfacn, & + zfac1, & + zqunitfac, & + zmvsu + + + zmvsu = (speclist(id_so4)%moleweight/1000.)/avo/speclist(id_so4)%density + + !--- Factor to transform mass SO4 in kg into molecules per kg: + zfacm = 6.022e+20_dp/mw_so4 + + !--- Factor to transform kg into micro gram: + + zfac = 1.e09_dp + + !--- Factor to transform N/m**3 into N/cm**3: + + zfacn = 1.0e-06_dp + + !--- Calculate mixing ratios from paerml + DO jn=1, naerocomp + jt = aerocomp(jn)%idt ! get tracer id + jspec = aerocomp(jn)%spid ! get species id + jl = subm_aero_idx(jspec) ! get index to subm_aerospec list + !!mgs=old code!! IF (aerocomp(jn)%species%m7unitconv == immr2molec) THEN + IF (jl <= 0) THEN + WRITE(message_text,*) 'SUBM_AERO_IDX Mapping error !! No index for jspec=',jspec + CALL finish('ham_subm_interface', message_text) + END IF + IF (subm_aerounitconv(jl) == immr2molec) THEN + zfac1 = zfacm + ELSE + zfac1 = zfac + END IF + + pxtm1(1:kproma,:,jt) = paerml(1:kproma,:,jn)/ (zfac1*prhoa(1:kproma,:)) + + END DO + + !--- Calculate particle numbers from paernl + + DO jn=1, nclass + jt = sizeclass(jn)%idt_no + !paernl(1:kproma,:,jn) = paernl(1:kproma,:,jn)*1.e-6_dp !eehol: convert 1/m3 to 1/cm3 + pxtm1(1:kproma,:,jt) = paernl(1:kproma,:,jn) / (zfacn*prhoa(1:kproma,:)) + END DO + + END SUBROUTINE conc2mmr + + SUBROUTINE mmr2conc(kproma,kbdim,klev, & + ktrac,pxtm1,paerml,paernl,prhoa) + + USE mo_kind, ONLY : dp + + !USE mo_ham_salsactl, ONLY: fn2b + + USE mo_ham, ONLY: naerocomp, aerocomp, subm_aerounitconv, subm_aero_idx, & + sizeclass, mw_so4, nclass, immr2molec + + USE mo_exception, ONLY: finish, message, message_text + + !-- input output variables -------- + + INTEGER, INTENT(in) :: & + kproma, & + kbdim, & + klev, & ! number of vertical levels + ktrac + + REAL(dp), INTENT(INOUT) :: & + paerml(kbdim,klev,naerocomp), & + paernl(kbdim,klev,nclass) + + REAL(dp), INTENT(IN) :: & + pxtm1(kbdim,klev,ktrac), & ! tracer mass/number mixing ratio + prhoa(kbdim,klev) ! air mass density [kg m-3] + + !-- local variables -------- + + REAL(dp):: zfac, & + zfacm, & + zfacn, & + zfac1, & + zqunitfac, & + zmvsu + + INTEGER :: jt, jn ,jl, jk, jspec ! for indexing + + + !--- Factor to transform mass SO4 in kg into molecules per kg: + zfacm = 6.022e+20_dp/mw_so4 + + !--- Factor to transform kg into micro gram: + + zfac = 1.e09_dp + + !--- Factor to transform N/m**3 into N/cm**3: + + zfacn = 1.0e-06_dp + + !--- Calculate mixing ratios from pxtm1 + DO jn=1, naerocomp + jt = aerocomp(jn)%idt ! get tracer id + jspec = aerocomp(jn)%spid ! get species id + jl = subm_aero_idx(jspec) ! get index to subm_aerospec list + !!mgs=old code!! IF (aerocomp(jn)%species%m7unitconv == immr2molec) THEN + IF (jl <= 0) THEN + WRITE(message_text,*) 'SUBM_AERO_IDX Mapping error !! No index for jspec=',jspec + CALL finish('ham_subm_interface', message_text) + END IF + IF (subm_aerounitconv(jl) == immr2molec) THEN + zfac1 = zfacm + ELSE + zfac1 = zfac + END IF + + paerml(1:kproma,:,jn) = pxtm1(1:kproma,:,jt)*(zfac1*prhoa(1:kproma,:)) + + END DO + + !--- Calculate particle numbers from pxtm1 + + DO jn=1, nclass + jt = sizeclass(jn)%idt_no + paernl(1:kproma,:,jn) = zfacn*prhoa(1:kproma,:)*pxtm1(1:kproma,:,jt)!*1.e6_dp !eehol: convert 1/cm3 to 1/m3 + END DO + + END SUBROUTINE mmr2conc +END MODULE mo_convert_concentrations diff --git a/ifs-source/arpifs/phys_ec/mo_exception.F90 b/ifs-source/arpifs/phys_ec/mo_exception.F90 new file mode 100644 index 00000000..fd0e4da9 --- /dev/null +++ b/ifs-source/arpifs/phys_ec/mo_exception.F90 @@ -0,0 +1,270 @@ +!> +!! @par Copyright +!! This code is subject to the MPI-M-Software - License - Agreement in it's most recent form. +!! Please see URL http://www.mpimet.mpg.de/en/science/models/model-distribution.html and the +!! file COPYING in the root of the source tree for this code. +!! Where software is supplied by third parties, it is indicated in the headers of the routines. +!! +MODULE mo_exception + + USE mo_io_units, ONLY: nerr, nlog +#ifdef HAMMOZ + USE mo_mpi, ONLY: p_abort, p_parallel, p_parallel_io, p_pe +#endif + + IMPLICIT NONE + + PRIVATE + + PUBLIC :: message_text + PUBLIC :: message, finish + PUBLIC :: em_none, em_info, em_warn, em_error, em_param, em_debug + PUBLIC :: open_log, close_log + PUBLIC :: debug_messages_on, debug_messages_off + PUBLIC :: end_of_init_phase + PUBLIC :: number_of_warnings, number_of_errors + + INTEGER, PARAMETER :: em_none = 0 ! normal message + INTEGER, PARAMETER :: em_info = 1 ! informational message + INTEGER, PARAMETER :: em_warn = 2 ! warning message: number of warnings counted + INTEGER, PARAMETER :: em_error = 3 ! error message: number of errors counted + INTEGER, PARAMETER :: em_param = 4 ! report parameter value + INTEGER, PARAMETER :: em_debug = 5 ! debugging message + + CHARACTER(len=256) :: message_text = '' !++mgs + + LOGICAL :: l_debug = .FALSE. + LOGICAL :: l_log = .FALSE. + LOGICAL :: l_init_phase = .TRUE. ! don't report PE during initialisation + + INTEGER :: number_of_warnings = 0 + INTEGER :: number_of_errors = 0 + +CONTAINS + + SUBROUTINE debug_messages_on + l_debug = .TRUE. + END SUBROUTINE debug_messages_on + + SUBROUTINE debug_messages_off + l_debug = .FALSE. + END SUBROUTINE debug_messages_off + + SUBROUTINE end_of_init_phase + l_init_phase = .FALSE. + END SUBROUTINE end_of_init_phase + + SUBROUTINE finish (name, text, exit_no) + +#ifdef __INTEL_COMPILER + USE ifcore +#endif + + CHARACTER(len=*), INTENT(in) :: name + CHARACTER(len=*), INTENT(in), OPTIONAL :: text + INTEGER, INTENT(in), OPTIONAL :: exit_no + + INTEGER :: iexit + +#ifdef HAMMOZ +#ifndef __STANDALONE + EXTERNAL :: util_exit +#if ! (defined (__SX__) || defined (__INTEL_COMPILER) || defined (__xlC__)) + EXTERNAL :: util_backtrace +#endif +#endif +#endif + + WRITE (nerr,'(/,80("="),/)') + IF (l_log) WRITE (nlog,'(/,80("="),/)') + + IF (PRESENT(exit_no)) THEN + iexit = exit_no + ELSE + iexit = 1 ! POSIX defines this as EXIT_FAILURE + END IF + + IF (PRESENT(text)) THEN + IF (iexit == 1) THEN + WRITE (nerr,'(a,a,a,a)') 'FATAL ERROR in ', TRIM(name), ': ', TRIM(text) + ELSE + WRITE (nerr,'(1x,a,a,a)') TRIM(name), ': ', TRIM(text) + ENDIF + IF (l_log) WRITE (nlog,'(1x,a,a,a)') TRIM(name), ': ', TRIM(text) + ELSE + IF (iexit == 1) THEN + WRITE (nerr,'(a,a)') 'FATAL ERROR in ', TRIM(name) + ELSE + WRITE (nerr,'(1x,a)') TRIM(name) + ENDIF + IF (l_log) WRITE (nlog,'(a,a)') TRIM(name) + ENDIF + +#ifdef HAMMOZ + IF (p_parallel .AND. iexit == 1) THEN + WRITE (nerr,'(1x,a,i0)') 'FINISH called from PE: ', p_pe + IF (l_log) WRITE (nlog,'(1x,a,i0)') 'FINISH called from PE: ', p_pe + ENDIF +#endif + + ! generate traceback in error cases + IF (iexit == 1) THEN + WRITE (nerr,'(/,80("-"),/,/)') + IF (l_log) WRITE (nlog,'(/,80("-"),/,/)') +#ifdef HAMMOZ +#ifdef __INTEL_COMPILER + CALL tracebackqq +#else +#ifdef __xlC__ + CALL xl__trbk +#else +#ifdef __SX__ + CALL mesput('Traceback: ', 11, 1) +#else +#ifndef __STANDALONE + CALL util_backtrace +#endif +#endif +#endif +#endif +#endif + ENDIF + + WRITE (nerr,'(/,80("="),/)') + IF (l_log) WRITE (nlog,'(/,80("="),/)') + +#ifdef HAMMOZ + IF (p_parallel) THEN + CALL p_abort + ELSE +#endif + +#ifdef HAMMOZ +#ifndef __STANDALONE + CALL util_exit(iexit) +#else + STOP 'mo_exception: finish ..' + + END IF +#endif +#endif + +#ifndef HAMMOZ + STOP 'mo_exception: finish ..' +#endif + + END SUBROUTINE finish + + SUBROUTINE message (name, text, out, level, all_print, adjust_right) + + CHARACTER (len=*), INTENT(in) :: name + CHARACTER (len=*), INTENT(in) :: text + INTEGER, INTENT(in), OPTIONAL :: out + INTEGER, INTENT(in), OPTIONAL :: level + LOGICAL, INTENT(in), OPTIONAL :: all_print + LOGICAL, INTENT(in), OPTIONAL :: adjust_right + + INTEGER :: iout + INTEGER :: ilevel + LOGICAL :: lprint + LOGICAL :: ladjustr !++mgs renamed from ladjust to ladjustr + + CHARACTER(len=32) :: prefix + + CHARACTER(len=LEN(message_text)) :: write_text + + IF (PRESENT(all_print)) THEN + lprint = all_print + ELSE + lprint = .FALSE. + ENDIF + + IF (PRESENT(adjust_right)) THEN + ladjustr = adjust_right + ELSE + ladjustr = .FALSE. + ENDIF + + IF (PRESENT(out)) THEN + iout = out + ELSE + iout = nerr + END IF + + IF (PRESENT(level)) THEN + ilevel = level + ELSE + ilevel = em_none + END IF + + SELECT CASE (ilevel) + CASE (em_none) ; prefix = ' ' + CASE (em_info) ; prefix = 'INFO :' + CASE (em_warn) ; prefix = 'WARNING:' ; number_of_warnings = number_of_warnings+1 + CASE (em_error) ; prefix = 'ERROR :' ; number_of_errors = number_of_errors+1 + CASE (em_param) ; prefix = '--- ' + CASE (em_debug) ; prefix = 'DEBUG :' + END SELECT + + IF (ladjustr) THEN + message_text = text + ELSE + message_text = TRIM(ADJUSTL(text)) + ENDIF + IF (name /= '') THEN + message_text = TRIM(name) // ': ' // TRIM(message_text) + ENDIF + IF (ilevel > em_none) THEN + message_text = TRIM(prefix) // ' ' // TRIM(message_text) + ENDIF + +#ifdef HAMMOZ + IF (p_parallel .AND. (l_debug .OR. ilevel == em_error)) THEN + WRITE(write_text,'(1x,a,i6,a,a)') 'PE ', p_pe, ' ', TRIM(message_text) + lprint = .TRUE. + ELSE + write_text = message_text + END IF + + IF (p_parallel_io .OR. lprint) THEN + WRITE(iout,'(1x,a)') TRIM(write_text) + IF (l_log) WRITE(nlog,'(1x,a)') TRIM(write_text) + END IF +#endif + + END SUBROUTINE message + + SUBROUTINE open_log (logfile_name) + + CHARACTER(len=*), INTENT(in) :: logfile_name + LOGICAL :: l_opened + + INQUIRE (UNIT=nlog,OPENED=l_opened) + + IF (l_opened) THEN + WRITE (message_text,'(a)') 'log file unit has been used already.' + CALL message ('open_log', message_text) + WRITE (message_text,'(a)') 'Close unit and reopen for log file.' + CALL message ('open_log', message_text, level=em_warn) + CLOSE (nlog) + ENDIF + + OPEN (nlog,file=TRIM(logfile_name)) + + l_log = .TRUE. + + END SUBROUTINE open_log + + SUBROUTINE close_log + LOGICAL :: l_opened + + INQUIRE (UNIT=nlog,OPENED=l_opened) + IF (l_opened) THEN + CLOSE (nlog) + ENDIF + + l_log = .FALSE. + + END SUBROUTINE close_log + +END MODULE mo_exception diff --git a/ifs-source/arpifs/phys_ec/mo_filename.F90 b/ifs-source/arpifs/phys_ec/mo_filename.F90 new file mode 100644 index 00000000..6dcb6246 --- /dev/null +++ b/ifs-source/arpifs/phys_ec/mo_filename.F90 @@ -0,0 +1,40 @@ +MODULE mo_filename + ! ----------------------------------------------------------------- + ! + ! module *mo_filename* - quantities needed for file names etc. + ! + ! ----------------------------------------------------------------- + ! + ! L. Kornblueh, MPI, April 1998, added NWP forecast mode + ! I. Kirchner, MPI, April 2001, revision + ! A. Rhodin, MPI, June 2001, adapted to stream interface + IMPLICIT NONE + PRIVATE + PUBLIC :: find_next_free_unit +CONTAINS +!------------------------------------------------------------------------------ + FUNCTION find_next_free_unit(istart,istop) RESULT(unit) + INTEGER :: istart, istop, unit + LOGICAL :: found, opened + INTEGER :: i + found = .FALSE. + DO i=istart,istop + INQUIRE(unit=i,opened=opened) + IF (.NOT.opened) THEN + unit = i + found = .TRUE. + EXIT + END IF + END DO + IF (.NOT. found) THEN +!gf +! WRITE(message_text,'(a,i2.2,a,i2.2,a)') & +! 'No unit in range <',istart,':',istop,'> free.' +! CALL finish('find_next_free_unit',message_text) + WRITE(*,'(a,i2.2,a,i2.2,a)') 'No unit in range <',istart,':',istop,'> free.' + STOP +!gf + END IF + END FUNCTION find_next_free_unit +!------------------------------------------------------------------------------ +END MODULE mo_filename diff --git a/ifs-source/arpifs/phys_ec/mo_ham.F90 b/ifs-source/arpifs/phys_ec/mo_ham.F90 new file mode 100644 index 00000000..af2484e8 --- /dev/null +++ b/ifs-source/arpifs/phys_ec/mo_ham.F90 @@ -0,0 +1,865 @@ +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! \filename +!! mo_ham.f90 +!! +!! \brief +!! mo_ham contains physical switches and other control parameters for +!! ECHAM aerosol models (particularly HAM). +!! +!! \author P. Stier (MPI-Met) +!! +!! \responsible_coder +!! Martin Schultz, m.schultz@fz-juelich.de +!! +!! \revision_history +!! -# P. Stier (MPI-Met) - original version - (2002-12-xx) +!! -# K. Zhang (MPI-Met) - changes for ECHAM6 - (2009-08-11) +!! -# M. Schultz (FZ Juelich) - cleanup (2009-09-23) +!! -# H. Kokkola (FMI) - definition of aerocomp (former mo_ham mode) (2011-12-12) +!! +!! \limitations +!! None +!! +!! \details +!! None +!! +!! \bibliographic_references +!! None +!! +!! \belongs_to +!! HAMMOZ +!! +!! SPDX-License-Identifier: BSD-3-Clause +!! Copyright (c) 2021 hammoz + +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +MODULE mo_ham + + ! *mo_ham* contains physical switches and parameters + ! for the ECHAM-HAM aerosol model. + ! + ! Author: + ! ------- + ! Philip Stier, MPI-MET 12/2002 + ! + + USE mo_kind, ONLY: dp + USE mo_species, ONLY: t_species, nmaxspec +#ifdef HAMMOZ + USE mo_external_field_processor, ONLY: EF_FILE, EF_MODULE !SF #244 +#endif + +!#ifdef _OPENMP +! use omp_lib +!#endif + + IMPLICIT NONE + + PRIVATE + + PUBLIC :: new_aerocomp ! create aerosol component + PUBLIC :: setham !TB initialise ham +#ifdef HAMMOZ + PUBLIC :: print_aerocomp_info +#endif + PUBLIC :: nham_subm ! choice for aerosol microphysics submodel + PUBLIC :: naeroclass, naerosol ! arrays of possible number of classes (resp. soluble classes) + PUBLIC :: nclass ! number of classes in current model + PUBLIC :: nsol ! number of soluble classes in current model + PUBLIC :: naerocomp, naerorad, nraddiag, nrad, nradmix, nseasalt, nmaxclass + PUBLIC :: HAM_BULK, HAM_M7, HAM_SALSA + PUBLIC :: npist, laerocom_diag, ndrydep, nwetdep, lomassfix + PUBLIC :: ndust !SF #479 + PUBLIC :: burden_keytype + PUBLIC :: mw_s, mw_so2, mw_so4, mw_dms, mw_oc + PUBLIC :: lhetfreeze +#ifdef HAMMOZ + PUBLIC :: nlai_drydep_ef_type !gf #244 +#endif + PUBLIC :: lscond ! Condensation of H2SO4 + PUBLIC :: lscoag ! Coagulation + PUBLIC :: lgcr ! galactic cosmic ray ionization + PUBLIC :: nsolact ! solar activity parameter + PUBLIC :: lmass_diag ! Mass diagnostics switch + PUBLIC :: nccndiag ! (C)CN diagnostics at fixed supersaturations + PUBLIC :: ibc_dust, ibc_seasalt, idsec_dust, idsec_biogenic !alaak moved from mo_ham_m7/salsa_emissions + PUBLIC :: sigma_fine, sigma_coarse !SF #320 + + INTEGER, PARAMETER :: nmaxclass = 20 ! maximum number of aerosol modes or bins + ! flags for aerosol microphysics scheme + INTEGER, PARAMETER :: HAM_BULK = 1 + INTEGER, PARAMETER :: HAM_M7 = 2 + INTEGER, PARAMETER :: HAM_SALSA = 3 + + !--- derived types + TYPE, PUBLIC :: t_aeroclass + INTEGER :: iclass ! Aerosol mode or bin number + TYPE(t_species), POINTER :: species ! Aerosol species + INTEGER :: spid ! Index in species list + INTEGER :: aero_idx ! Index to aerosol species list + INTEGER :: tracer_type ! Tracer type (none/diagnostic/prognostic) + INTEGER :: idt ! Tracer identity + END TYPE t_aeroclass + + TYPE, PUBLIC :: t_sizeclass + CHARACTER (LEN=32) :: classname ! Long mode name, e.g. "nucleation soluble" + CHARACTER (LEN=4) :: shortname ! Short mode name, e.g. "NS" + INTEGER :: self ! =mode index, for quick comparisons, etc + LOGICAL :: lsoluble ! Mode soluble (T/F) + LOGICAL :: lactivation ! Mode can activate to cloud droplets !dod #377 + LOGICAL :: lsed ! Sedimentation for this mode (T/F) + LOGICAL :: lsoainclass ! Secondary organics occur in this mode (T/F) + INTEGER :: idt_no ! Tracer identity for aerosol number + END TYPE t_sizeclass ! sigma, sigmaln and the conversion factors are + ! kept separate to avoid too many impacts on + ! other modules and subroutines + INTEGER, SAVE :: nclass=7 ! number of aerosol modes or size bins (e.g. 7 for M7) + INTEGER, SAVE :: nsol=4 ! number of aerosol modes or size bins (e.g. 4 for M7) + INTEGER :: naerocomp ! number of aerocomps defined (see mo_ham_init) + + TYPE(t_sizeclass), TARGET, PUBLIC :: sizeclass(nmaxclass) + !--- aerocomp: linear list of class*species + + TYPE(t_aeroclass), PUBLIC, ALLOCATABLE :: aerocomp(:) + TYPE(t_aeroclass), PUBLIC, ALLOCATABLE :: aerowater(:) + + INTEGER, PUBLIC :: subm_ngasspec = 0 + INTEGER, PUBLIC :: subm_naerospec = 0 + INTEGER, PUBLIC :: subm_gasspec(nmaxspec) ! gas species indices for microphysical processes + INTEGER, PUBLIC :: subm_aerospec(nmaxspec) ! aero species indices for microphysical processes + !>>SF for convenience: special mapping for all but water aero species + INTEGER, PUBLIC :: subm_naerospec_nowat = 0 + INTEGER, PUBLIC :: subm_aerospec_nowat(nmaxspec) ! all but water aero species indices for microphysical processes + !<>gf #244 + INTEGER :: nlai_drydep_ef_type = EF_MODULE ! Choice of lai external field type in the drydep scheme + ! = EF_FILE (2) from external input file + ! = EF_MODULE (3) online from jsbach + !<>dod deleted <>dod deleted iwritetrac <>dod deleted. + + !>>SF #320: these are std's for fine and coarse modes. This is placed here and not in M7-only code, + ! because it's needed outside of M7-specific code (see radiation, sea salt emisions...) + REAL(dp), PARAMETER :: sigma_fine = 1.59_dp ! std for fine modes + REAL(dp), PARAMETER :: sigma_coarse = 2._dp ! std for coarse modes + !< +!! setham modifies pre-set switches of the hamctl namelist for the +!! configuration of the ECHAM/HAM aerosol model +!! +!! @author see above +!! +!! $Id: 1423$ +!! +!! @par Revision History +!! see above +!! +!! @par This subroutine is called by +!! init_ham +!! +!! @par Externals: +!!
    +!!
  1. None +!!
+!! +!! @par Notes +!! +!! +!! @par Responsible coder +!! kai.zhang@zmaw.de +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + + SUBROUTINE setham + + ! *setham* modifies pre-set switches of the hamctl + ! namelist for the configuration of the + ! ECHAM/HAM aerosol model + ! + ! Authors: + ! -------- + ! Philip Stier, MPI-MET 12/2002 + ! Martin Schultz, FZ Juelich, Oct 2009, added nmod parameter + ! +#ifdef HAMMOZ + USE mo_mpi, ONLY: p_parallel, p_parallel_io, p_bcast, p_io + USE mo_namelist, ONLY: open_nml, position_nml, POSITIONED, MISSING + USE mo_control, ONLY: nn, nlev + USE mo_boundary_condition, ONLY: bc_nml, bc_define, p_bcast_bc, & + BC_REPLACE, BC_EVERYWHERE + ! other available options (bc_domain=BC_EVERYWHERE): BC_ALTITUDE, BC_PRESSURE, BC_LEVEL, BC_TOP, BC_BOTTOM + ! (bc_mode=BC_REPLACE): BC_SPECIAL, BC_RELAX, BC_ADD + USE mo_external_field_processor, ONLY: EF_FILE, & + EF_3D, EF_IGNOREYEAR, EF_NOINTER +#endif + USE mo_radiation_parameters,ONLY: iaero !SF obsolete to remove , l_srtm, l_lrtm + USE mo_util_string, ONLY: separator + USE mo_exception, ONLY: finish, message, message_text, em_info, em_error, em_param, & + em_info, em_warn +#ifdef HAMMOZ + USE mo_submodel, ONLY: print_value + USE mo_submodel_diag, ONLY: OFF, ON, BYTRACER, BYSPECIES +#endif + USE mo_param_switches, ONLY: nic_cirrus, ncd_activ + + ! other available options: EF_CONSTANT, EF_TIMERESOLVED, EF_LATLEV, EF_LONLAT, EF_UNDEFINED + USE mo_submodel, ONLY: lham, lhammoz + USE mo_physical_constants, ONLY: amd + + IMPLICIT NONE +#ifdef HAMMOZ + TYPE(bc_nml) :: bc_oh, bc_o3, bc_h2o2, bc_no2, & ! tracer boundary conditions/input specs + bc_no3 ! SOA oxidant + + INCLUDE 'hamctl.inc' +#endif +! INTEGER :: nclass ! number of modes/bins + + !--- Local variables + + CHARACTER(len=24) :: csubmname ! name of aerosol sub model + INTEGER :: jj, ierr, inml, iunit + + + !--- 0) Set defaults + ibc_oh = 0 + ibc_o3 = 0 + ibc_h2o2 = 0 + ibc_no2 = 0 + ibc_no3 = 0 +#ifdef HAMMOZ + + burden_keytype = BYSPECIES + + !--- Set defaults for tracer boundary conditions + ! If lhammoz is active, default is to use tracer fields from gas-phase chemistry module + ! else the fields are read from file + ! define entries for first tracer, then copy + ! explanation: %bc_... = how to apply + ! %ef_... = how to get values + bc_oh%bc_domain = BC_EVERYWHERE + bc_oh%bc_mode = BC_REPLACE + bc_oh%ef_type = EF_FILE + bc_oh%ef_template = 'ham_oxidants_monthly.nc' + bc_oh%ef_varname = 'OH_VMR_avrg' + bc_oh%ef_geometry = EF_3D + bc_oh%ef_timedef = EF_IGNOREYEAR + !! additional options (just for illustration) - see mo_boundary_condition + !! bc_oh%ef_timeoffset = 0._dp + !! bc_oh%ef_timeindex = 1 + !! bc_oh%ef_value = 0._dp + bc_oh%ef_factor = 17._dp/amd ! convert from VMR to MMR + bc_oh%ef_interpolate = EF_NOINTER ! none + bc_oh%ef_actual_unit = 'VMR' + + bc_o3 = bc_oh + bc_o3%ef_varname = 'O3_VMR_avrg' + bc_o3%ef_factor = 48._dp/amd ! convert from VMR to MMR + bc_h2o2 = bc_oh + bc_h2o2%ef_varname = 'H2O2_VMR_avrg' + bc_h2o2%ef_factor = 34._dp/amd ! convert from VMR to MMR + bc_no2 = bc_oh + bc_no2%ef_varname = 'NO2_VMR_avrg' + bc_no2%ef_factor = 46._dp/amd ! convert from VMR to MMR + bc_no3 = bc_oh + bc_no3%ef_varname = 'NO3_VMR_avrg' + bc_no3%ef_factor = 62._dp/amd ! convert from VMR to MMR +#endif + nrad(1) = 0 + nrad(2:nmaxclass) = 3 + nradmix(:) = 1 + + subm_gasspec(:) = 0 + subm_aerospec(:) = 0 + subm_aero_idx(:) = 0 +#ifdef HAMMOZ + !--- 1) Read namelist: + + CALL message('',separator) + CALL message('setham', 'Reading namelist hamctl...', level=em_info) + + IF (p_parallel_io) THEN + inml = open_nml('namelist.echam') + iunit = position_nml ('HAMCTL', inml, status=ierr) + SELECT CASE (ierr) + CASE (POSITIONED) + READ (iunit, hamctl) + CASE (MISSING) + WRITE(message_text,'(a,i0,a)') 'Namelist HAMCTL not found. Will use default values' + CALL message('setham', message_text, level=em_warn) + CASE DEFAULT ! LENGTH_ERROR or READ_ERROR + WRITE(message_text,'(a,i0)') 'Namelist HAMCTL not correctly read! ierr = ', ierr + CALL finish('setham', message_text) + END SELECT + ENDIF + + !--- 2) Broadcast over processors: + IF (p_parallel) THEN + CALL p_bcast (nham_subm, p_io) + CALL p_bcast (nseasalt, p_io) + CALL p_bcast (npist, p_io) + CALL p_bcast (naerorad, p_io) + CALL p_bcast (ndrydep, p_io) + CALL p_bcast (nwetdep, p_io) + CALL p_bcast (ndust, p_io) !SF #479 + CALL p_bcast (laerocom_diag, p_io) + CALL p_bcast (nrad, p_io) + CALL p_bcast (nradmix, p_io) + CALL p_bcast (nraddiag, p_io) + CALL p_bcast (lomassfix, p_io) + CALL p_bcast (nsoa, p_io) + CALL p_bcast (nsoalumping, p_io) + CALL p_bcast (lhetfreeze, p_io) + CALL p_bcast (burden_keytype,p_io) + CALL p_bcast_bc (bc_oh, p_io) + CALL p_bcast_bc (bc_o3, p_io) + CALL p_bcast_bc (bc_h2o2, p_io) + CALL p_bcast_bc (bc_no2, p_io) + CALL p_bcast_bc (bc_no3, p_io) + CALL p_bcast(nlai_drydep_ef_type, p_io) !gf #244 + CALL p_bcast (lscond, p_io) + CALL p_bcast (lscoag, p_io) + CALL p_bcast (lgcr, p_io) + CALL p_bcast (nsolact, p_io) + CALL p_bcast (lmass_diag, p_io) + CALL p_bcast (nccndiag, p_io) + + END IF +#endif + !--------------------------------------------------------------------------------------------------- + !--- 3) Consistency and dependency checks: + +!### normally this test for lham is not necessary, but perhaps needed when we support additional modules + IF (lham) THEN + +#ifdef HAMMOZ + !--- consistency check for microphysics scheme + IF (nham_subm < 1 .OR. nham_subm > 3) THEN + WRITE(message_text,'(a,i0)') 'Illegal option for aerosol microphysics scheme nham_subm = ', & + nham_subm + CALL message('setham',message_text, level=em_error) + END IF + + IF (nham_subm == 1) THEN + WRITE(message_text,'(a,i0,a)') 'Bulk microphysics nham_subm = ',nham_subm,'has not been implemented' + CALL message('setham',message_text, level=em_error) + END IF + + IF (nham_subm == HAM_SALSA) THEN + IF (nwetdep > 1 .AND. ncd_activ /= 2) THEN !! -->eehol: included SALSA wetdeposition scheme + WRITE(message_text,'(a,i0)') & + 'SALSA microphysics wet deposition option nwetdep = ', nwetdep, 'only works with ncd_activ = 2' + CALL message('setham',message_text, level=em_error) + END IF + + IF (nccndiag > 0) THEN + WRITE(message_text,'(a,i0)') & + 'SALSA microphysics does not support detailed CCN diagnostics nccndiag = ', nccndiag + CALL message('setham',message_text, level=em_error) + END IF + + ENDIF + +!>>SF #299 + !--- Check authorized values for burden_keytype + SELECT CASE(burden_keytype) + CASE(OFF,BYTRACER,BYSPECIES) + CONTINUE + CASE default + WRITE(message_text,'(a,i0,a,i0,a,i0,a,i0)') 'invalid value for burden_keytype: ',& + burden_keytype,'. Authorized values: ',OFF,' ',BYTRACER,' ',BYSPECIES + CALL finish('setham',message_text) + END SELECT +!<>SF #479 + !--- Check authorized values for ndust + IF (ndust < 2 .OR. ndust > 5) THEN + WRITE(message_text,'(a,i0)') 'Illegal option for the parameter set of the BGC dust scheme ndust = ', & + ndust + CALL message('setham',message_text, level=em_error) + ENDIF +!<>gf #244 + !--- consistency check for lai in the drydep scheme !SF + user information + SELECT CASE(nlai_drydep_ef_type) + CASE(EF_FILE) + WRITE(message_text,'(a)') 'Leaf area index read from file' + CASE(EF_MODULE) + WRITE(message_text,'(a)') 'Leaf area index from JSBACH' + CASE default + WRITE(message_text,'(a,i0,2a,2(i0,a))') 'nlai_drydep_ef_type = ',nlai_drydep_ef_type, & + ' --> this is not currently supported.', & + ' Only ',EF_FILE,' (from file) or ',EF_MODULE, & + ' (from another module) external field types are possible!' + CALL finish('setham',message_text) + END SELECT + WRITE(message_text,'(a,a)') TRIM(message_text),' for usage by the drydep scheme.' + CALL message('setham',message_text,level=em_info) +#endif +!< nmaxclass) CALL finish('setham', 'Maximum number of aerosol modes/bins exceeded!') + + !--- consistency checks for radiation + IF(naerorad>0) THEN + IF (ANY(nrad(:)>3) .OR. ANY(nrad(:)<0) ) THEN + CALL message('setham','nrad>3 or nrad<0 not supported', level=em_warn) + CALL message('', 'Will reset all nrad and nradmix values to default values!', level=em_info) + nrad(1) = 0 + nrad(2:nclass) = 1 + nradmix(1:nclass) = 1 + END IF + IF (iaero/=iaeroham .AND. ANY(nrad(:)>0) .AND. naerorad/=2) THEN + CALL message('setham','inconsistent setting of iaero, nrad and naerorad', level=em_warn) + CALL message('', 'Will run ECHAM with selected iaero and switch HAM radiation to diagnostic mode', level=em_info) + naerorad = 2 + END IF + IF (iaero==iaeroham .AND. .NOT. ANY(nrad(:)>0)) THEN + CALL message('setham','HAM radiation requested but all nrad set to zero.', level=em_warn) + CALL message('', 'Will reset all nrad and nradmix values to default values!', level=em_info) + nrad(1) = 0 + nrad(2:nclass) = 1 + nradmix(1:nclass) = 1 + ENDIF + + END IF + + !--- consistency checks for SOA scheme choices + IF ((nham_subm .NE. HAM_SALSA) .AND. nsoa == 2) THEN + + CALL message('setham','nsoa = 2 currently only supported with SALSA (nham_subm = 3)', & + level=em_error) + + ENDIF + +!>>SF override the following check with -DWITH_LHET in your Makefile +! note: lhet-dependent code has not be fully tested yet +! (implemented here to avoid losing existing code in earlier versions) +#ifndef WITH_LHET + IF (lhetfreeze) CALL message('setham','lhetfreeze=.TRUE. is not currently supported', level=em_error) +#endif +!< Monahan (1986)',level=em_param) + CASE (2) + CALL message('',' -> Schulz et al. (2002)',level=em_param) + !>>dod (redmine #44) + CASE (4) + CALL message('',' -> Monahan (1986), bin scheme',level=em_param) + CASE (5) + CALL message('',' -> Guelle et al. (2001)',level=em_param) + CASE (6) + CALL message('',' -> Gong et al. (2003)',level=em_param) + CASE (7) + CALL message('',' -> Long et al.(2011)',level=em_param) + CASE (8) + CALL message('',' -> Gong et al.(2003)+T-dep.',level=em_param) + !< Liss & Merlivat (1986)',level=em_param) + CASE (2) + CALL message('',' -> Wanninkhof (1992)',level=em_param) + CASE (3) + CALL message('',' -> Nightingale (2000)',level=em_param) + CASE DEFAULT + WRITE (message_text,'(a,i0,a)') ' npist = ',npist,' not supported.' + CALL message('setham',message_text, level=em_error) + END SELECT + + CALL message('','---') + CALL print_value(' Aerosol diagnostics (laerocom_diag) = ', laerocom_diag) +!! ### is there a check that any(nrad > 0) if naerorad=true ??? + CALL print_value('Aerosol feedback with radiation (naerorad) = ', naerorad) + IF (naerorad>0) THEN + !WRITE (message_text,'(a,i3)') ' nrad = ', nrad !### hardcoded 25 + !CALL message ('', message_text, level=em_param) + CALL message ('', ' mode/bin SW LW nradmix', level=em_param) + DO jj=1, nclass + IF (nrad(jj)==0) THEN + WRITE (message_text,'(i0,t12,a1,t17,a1,t21,i0)') jj, 'F', 'F', nradmix(jj) + ELSE IF (nrad(jj)==1) THEN + WRITE (message_text,'(i0,t12,a1,t17,a1,t21,i0)') jj, 'T', 'F', nradmix(jj) + ELSE IF (nrad(jj)==2) THEN + WRITE (message_text,'(i0,t12,a1,t17,a1,t21,i0)') jj, 'F', 'T', nradmix(jj) + ELSE IF (nrad(jj)==3) THEN + WRITE (message_text,'(i0,t12,a1,t17,a1,t21,i0)') jj, 'T', 'T', nradmix(jj) + END IF + CALL message ('', message_text, level=em_param) + IF (nrad(jj) > 3 .OR. nradmix(jj) > 3) THEN + WRITE (message_text,'(a,i0,a,i0,a,i0)') 'Invalid nrad or nradmix: jbin=',jj,' nrad(jbin)=', & + nrad(jj),' nradmix(jbin)=',nradmix(jj) + CALL message('setham',message_text, level=em_error) + END IF + END DO + CALL message('','Refractive index mixing rule (nradmix):', level=em_param) + CALL message('',' 0 = ---, 1 = volume weighted, 2 = Maxwell-Garnett, 3 = Bruggeman', & + level=em_param) + + CALL message('','---') + + SELECT CASE(nraddiag) + CASE (0) + CALL message ('','No extended radiation diagnostics (nraddiag=0).',level=em_param) + CASE (1) + CALL message ('','Extended radiation diagnostics 2D (nraddiag=1).',level=em_param) + CASE (2) + CALL message ('','Extended radiation diagnostics 2D and 3D (nraddiag=2).',level=em_param) + CASE DEFAULT + WRITE (message_text,'(a,i0)') 'Invalid value for nraddiag: ', nraddiag + CALL message ('setham', message_text, level=em_error) + END SELECT + + ELSE ! naerorad==0 + CALL message('setham','Aerosol radiation interactions deactivated!', level=em_warn) + END IF + + CALL message('','---') + CALL print_value (' Mass fixer in convection : ', lomassfix) + + CALL message('','---') + CALL message('', separator) + + !>>dod ndrydep = 1 is not tested. Override this check (at your own risk) with -DDRYDEP1 in your Makefile +#ifndef DRYDEP1 + IF (ndrydep == 1) THEN + CALL message('', 'ndrydep = 1 in namelist hamctl: this value is not tested!') + CALL message('', 'to proceed with ndrydep=1 set flag -DDRYDEP1 in the fortran 90 flags in your Makefile and re-compile') + CALL message('', 'then run the model again at your own risk') + CALL message('', 'else select another value for ndrydep') + CALL finish('setham', 'unsupported namelist value ndrydep=1') + END IF +#endif + !< OFF',level=em_param) + CASE (1) + CALL message('','-> 2D CCN diagnostics',level=em_param) + CASE (2) + CALL message('','-> 3D CCN diagnostics',level=em_param) + CASE (3) + CALL message('','-> 2D CCN + CN diagnostics',level=em_param) + CASE (4) + CALL message('','-> 3D CCN + CN diagnostics',level=em_param) + CASE (5) + CALL message('','-> 2D CCN + CN diagnostics + burdens',level=em_param) + CASE (6) + CALL message('','-> 3D CCN + CN diagnostics + burdens',level=em_param) + CASE DEFAULT + WRITE (message_text,*) 'nccndiag = ',nccndiag,' not supported.' + CALL message('setham',message_text, level=em_error) + END SELECT +#endif + + END SUBROUTINE setham + + + INTEGER FUNCTION new_aerocomp(iclass, ispec, itrtype) + + USE mo_species, ONLY: speclist + USE mo_tracdef, ONLY: itrprog + + IMPLICIT NONE + + !---function interface + INTEGER, INTENT(IN) :: iclass + INTEGER, INTENT(IN) :: ispec + INTEGER, INTENT(IN), OPTIONAL :: itrtype + + !---local variables + INTEGER :: i + + naerocomp = naerocomp + 1 + i = naerocomp + + aerocomp(i)%iclass = iclass + aerocomp(i)%spid = ispec + aerocomp(i)%species => speclist(ispec) + + IF (PRESENT(itrtype)) THEN + aerocomp(i)%tracer_type = itrtype + ELSE + aerocomp(i)%tracer_type = itrprog + END IF + + new_aerocomp = i + + END FUNCTION new_aerocomp + +#ifdef HAMMOZ + SUBROUTINE print_aerocomp_info + + USE mo_tracdef, ONLY: trlist + USE mo_exception, ONLY: message_text, message, em_param, em_info + USE mo_util_string, ONLY: separator + + INTEGER :: jt + + CALL message('',separator) + WRITE(message_text,'(a)') 'Aerosol component information' + CALL message('',message_text,level=em_info) + CALL message('','',level=em_param) + WRITE(message_text,'(a)') ': aerocomp id iclass spid idt tracer name' + CALL message('',message_text,level=em_param) + DO jt=1,naerocomp + WRITE(message_text,'(a,5x,4(i7,1x),3x,a)') ':',jt, aerocomp(jt)%iclass, & + aerocomp(jt)%spid, aerocomp(jt)%idt, & + trlist%ti(aerocomp(jt)%idt)%fullname + CALL message('',message_text,level=em_param) + ENDDO + CALL message('','',level=em_param) + CALL message('',separator) + + END SUBROUTINE print_aerocomp_info +#endif + +END MODULE mo_ham diff --git a/ifs-source/arpifs/phys_ec/mo_ham_activ.F90 b/ifs-source/arpifs/phys_ec/mo_ham_activ.F90 new file mode 100644 index 00000000..73adbbe1 --- /dev/null +++ b/ifs-source/arpifs/phys_ec/mo_ham_activ.F90 @@ -0,0 +1,820 @@ +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! \filename +!! mo_ham_activ.f90 +!! +!! \brief +!! This code handles all ham-dependent activation processes +!! +!! +!! \author Philip Stier (MPI-Met) +!! \author Sylvaine Ferrachat (ETHZ) +!! +!! \responsible_coder +!! Sylvaine Ferrachat, sylvaine.ferrachat@env.ethz.ch +!! +!! \revision_history +!! -# P. Stier (MPI-Met) - original code +!! -# S. Ferrachat (ETHZ) - new code structure (separate HAM-dependent pieces +!! from the general activation schemes) - (2010-03) +!! +!! \limitations +!! None +!! +!! \details +!! Implementation of : +!! - the Abdul-Razzak & Ghan scheme which calculates the number of activated aerosol +!! particles from the aerosol size-distribution, composition and ambient supersaturation +!! (see subroutine ham_activ_abdulrazzak_ghan) +!! - a preparatory routine for Lin & Leaitch activation scheme (HAM-specific), which computes +!! the fractional mass and number of each mode larger than the cutoff of the instrument and add them up +!! +!! \bibliographic_references +!! - Abdul-Razzak et al., JGR, 103, D6, 6123-6131, 1998. +!! - Abdul-Razzak and Ghan, JGR, 105, D5, 6837-6844, 2000. +!! - Pruppbacher and Klett, Kluewer Ac. Pub., 1997. +!! +!! \belongs_to +!! HAMMOZ +!! +!! SPDX-License-Identifier: BSD-3-Clause +!! Copyright (c) 2021 hammoz + +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +MODULE mo_ham_activ + + USE mo_kind, ONLY: dp + USE mo_ham, ONLY: sizeclass,nclass + +!#ifdef _OPENMP +! use omp_lib +!#endif + + + + IMPLICIT NONE + + PUBLIC ham_activ_abdulrazzak_ghan +!-->HK: diagnostics streams to be only used with HAMMOZ +#ifdef HAMMOZ + ham_activ_diag_abdulrazzak_ghan_strat, ham_activ_diag_abdulrazzak_ghan_conv +! Lin & Leaitch only to be used with HAMMOZ + PUBLIC ham_avail_activ_lin_leaitch, ham_activ_diag_lin_leaitch +#endif +!<--HK + PUBLIC ham_activ_koehler_ab + !-->HK + !REAL(dp), PUBLIC, ALLOCATABLE :: pfrac_m7(:,:,:), pna_m7(:,:,:) + !<--HK + + PRIVATE + + !--- Subroutines: + +CONTAINS + + SUBROUTINE ham_activ_abdulrazzak_ghan(kproma, kbdim, klev, krow, ktdia, & + pcdncact, pesw, prho, & + pxtm1, ptm1, papm1, pqm1, & + pw, pwpdf, pa, pb, & + prdry, pnact, pfracn, & + psc, prc, psmax ) + + + ! *ham_activ_abdulrazzak_ghan* calculates the number of activated aerosol + ! particles from the aerosol size-distribution, + ! composition and ambient supersaturation + ! + ! Author: + ! ------- + ! Philip Stier, MPI-MET, Caltech, University of Oxford 2002-2009 + ! + ! Method: + ! ------- + ! The calculation of the activation can be reduced to 4 tasks: + ! + ! 0) Calculation of Koehler A/B coefficients + ! (now done in ham_activ_koehler_ab) + ! I) Calculate the maximum supersaturation + ! II) Calculate the corresponding radius of activation + ! for each mode + ! III) Calculate the number of particles that are larger + ! then the radius of activation for each mode. + ! + ! III) Calculation of the number of activated particles: + ! See the routine ham_m7_logtail below. + ! + ! The calculations are now performed separately for + ! stratiform and convective updraft velocities. + ! + ! References: + ! ----------- + ! Abdul-Razzak et al., JGR, 103, D6, 6123-6131, 1998. + ! Abdul-Razzak and Ghan, JGR, 105, D5, 6837-6844, 2000. + ! Pruppbacher and Klett, Kluewer Ac. Pub., 1997. + + !>>dod soa + USE mo_ham_m7ctl, ONLY: sigmaln + !<>SF + USE mo_conv, ONLY: cdncact_cv + !<>DN #364 +#ifdef HAMMOZ + USE mo_ham_streams, ONLY: frac + USE mo_activ, ONLY: na +#endif + USE mo_activ, ONLY: nw + !<0.0) [m s-1] + pwpdf(kbdim,klev,nw), & ! PDF of updraft velocity [s m-1] + pxtm1(kbdim,klev,ntrac), & + pa(kbdim,klev,nclass), & ! curvature parameter A of the Koehler equation + pb(kbdim,klev,nclass), & ! hygroscopicity parameter B of the Koehler equation + prdry(kbdim,klev,nclass) ! dry radius for each mode + + !--- Local variables: + + INTEGER :: jclass, jk, & + jt, jl, & + jw + + REAL(dp):: zkv, & + zeps, zalpha, & + zgamma, & + zgrowth, & + zdif, zxv, & + zk, zka + + REAL(dp):: zamw, & ! molecular weight of water [kg mol-1] + zamd ! molecular weight of dry air [kg mol-1] + + REAL(dp):: zf(nclass), zg(nclass) + + REAL(dp):: zfracn(kbdim,klev) ! fraction of activated aerosol numbers for current mode and w bin + + REAL(dp):: zfracn_top(kbdim,klev,nclass), & ! w * dw weighted activated aerosol fraction + zfracn_bot(kbdim,klev,nclass) ! weighting factor (sum of w * dw) + + REAL(dp):: zn(kbdim,klev,nclass), & ! aerosol number concentration for each mode [m-3] + zsm(kbdim,klev,nclass) ! critical supersaturation for activating particles + ! with the mode number median radius + + REAL(dp) :: zeta(nw), zxi(nw), zsum(nw) + + REAL(dp), PARAMETER :: zsten = 75.0E-3_dp ! surface tension of H2O [J m-2] + ! neglecting salts and temperature + ! (also tried P&K 5.12 - erroneous!) + + LOGICAL, PARAMETER :: ll_numb = .TRUE. ! switch between number/mass in logtail calculation !SF + + + !--- 0) Initializations: + + zsm(1:kproma,:,:) = 0._dp + zfracn_top(1:kproma,:,:) = 0._dp + zfracn_bot(1:kproma,:,:) = 0._dp + prc(1:kproma,:,:,:) = 1._dp ! [m] initialized with 1m, only changed if activation occurs + pnact(1:kproma,:,:) = 0._dp + pfracn(1:kproma,:,:) = 0._dp + pcdncact(1:kproma,:) = 0._dp + + zeps=EPSILON(1._dp) + + !--- Conversions to SI units [g mol-1 to kg mol-1]: + + zamw=amw*1.E-3_dp + zamd=amd*1.E-3_dp + + !--- Number per unit volume for each mode: + DO jclass=1, nclass + jt = sizeclass(jclass)%idt_no + !>>dod #377 + IF (sizeclass(jclass)%lactivation) THEN + zn(1:kproma,:,jclass)=pxtm1(1:kproma,:,jt)*prho(1:kproma,:) + END IF + !<1 .OR. pw(jl,jk,1)>zeps) .AND. & + pqm1(jl,jk)>zeps .AND. & + ptm1(jl,jk)>(tmelt-35.0_dp) ) THEN !eehol: temp greater than homogenic ice nucleation temperature + + !--- Abdul-Razzak et al. (1998) (Eq. 11): + + zalpha=(grav*zamw*alv)/(cpd*argas*ptm1(jl,jk)**2) - & + (grav*zamd)/(argas*ptm1(jl,jk)) + + zgamma=(argas*ptm1(jl,jk))/(pesw(jl,jk)*zamw) + & + (zamw*alv**2)/(cpd*papm1(jl,jk)*zamd*ptm1(jl,jk)) + + !--- Diffusivity of water vapour in air (P&K, 13.3) [m2 s-1]: + + zdif=0.211_dp * (ptm1(jl,jk)/tmelt)**1.94_dp * (101325._dp/papm1(jl,jk)) *1.E-4_dp + + !--- Thermal conductivity zk (P&K, 13.18) [cal cm-1 s-1 K-1]: + + ! Mole fraction of water: + + zxv=pqm1(jl,jk)*(zamd/zamw) + + zka=(5.69_dp+0.017_dp*(ptm1(jl,jk)-273.15_dp))*1.E-5_dp + + zkv=(3.78_dp+0.020_dp*(ptm1(jl,jk)-273.15_dp))*1.E-5_dp + + ! Moist air, convert to [J m-1 s-1 K-1]: + + zk =zka*(1._dp-(1.17_dp-1.02_dp*zkv/zka)*zxv) * 4.1868_dp*1.E2_dp + + !--- Abdul-Razzak et al. (1998) (Eq. 16): + + zgrowth=1._dp/ & + ( (rhoh2o*argas*ptm1(jl,jk))/(pesw(jl,jk)*zdif*zamw) + & + (alv*rhoh2o)/(zk*ptm1(jl,jk)) * ((alv*zamw)/(ptm1(jl,jk)*argas) -1._dp) ) + + !--- Summation for equation (6): + + zsum(:)=0._dp + + DO jclass=1, nclass + !>>dod #377 + IF (sizeclass(jclass)%lactivation) THEN + IF (zn(jl,jk,jclass) > zeps .AND. & + prdry(jl,jk,jclass) > 1.E-9_dp .AND. & + pa(jl,jk,jclass) > zeps .AND. & + pb(jl,jk,jclass) > zeps ) THEN + + ! (9): + + zsm(jl,jk,jclass)=2._dp/SQRT(pb(jl,jk,jclass)) * & + (pa(jl,jk,jclass)/(3._dp*prdry(jl,jk,jclass)))**1.5_dp + + ! (10): + + zxi(:)=2._dp*pa(jl,jk,jclass)/3._dp * SQRT(zalpha*pw(jl,jk,:)/zgrowth) + + ! (11): + + zeta(:)=((zalpha*pw(jl,jk,:)/zgrowth)**1.5_dp) / & + (2._dp*pi*rhoh2o*zgamma*zn(jl,jk,jclass)) + + ! (6): + + WHERE (pw(jl,jk,:)>zeps) + zsum(:)=zsum(:) + ( 1._dp/zsm(jl,jk,jclass)**2 & + * ( zf(jclass)*(zxi(:)/zeta(:))**1.5_dp & + + zg(jclass)*( zsm(jl,jk,jclass)**2._dp & + / (zeta(:)+3._dp*zxi(:)) )**0.75_dp ) ) + END WHERE + + ENDIF + END IF + !< zeps) + psmax(jl,jk,:)=1._dp/SQRT(zsum(:)) + ELSEWHERE + psmax(jl,jk,:)=0._dp + END WHERE + + ELSE + psmax(jl,jk,:)=0._dp + END IF + + END DO ! jl + END DO ! jk + + !--- Diagnostics: + DO jclass=1, nclass + !>>dod #377 + IF (sizeclass(jclass)%lactivation) THEN + psc(1:kproma,:,jclass) = zsm(1:kproma,:,jclass) + END IF + !<>dod<< #377 + + WHERE (psmax(1:kproma,ktdia:klev,jw)>zeps .AND. & + zsm(1:kproma,ktdia:klev,jclass)>zeps .AND. & + zn(1:kproma,ktdia:klev,jclass)>zeps .AND. & + prdry(1:kproma,ktdia:klev,jclass)>1.E-9_dp ) + + prc(1:kproma,ktdia:klev,jclass,jw) & + = prdry(1:kproma,ktdia:klev,jclass) & + * ( zsm(1:kproma,ktdia:klev,jclass) & + / psmax(1:kproma,ktdia:klev,jw) )**(2._dp/3._dp) + + END WHERE + + !--- 3.2) Calculate the fractional number of each mode + ! larger than the mode critical radius: + CALL ham_m7_logtail(kproma, kbdim, klev, krow, jclass, & + ll_numb, prdry(:,:,jclass), & + prc(:,:,jclass,jw), zfracn(:,:)) + + !--- 3.3) Sum up the total number of activated particles, integrating over updraft PDF [m-3]: + ! The weighting here should be correct (up to discretisation error) + ! provided that the w bins are equally spaced and cover the whole + ! range of integration. + zfracn_top(1:kproma,:,jclass) = zfracn_top(1:kproma,:,jclass) & + + zfracn(1:kproma,:)*pwpdf(1:kproma,:,jw) + zfracn_bot(1:kproma,:,jclass) = zfracn_bot(1:kproma,:,jclass) & + + pwpdf(1:kproma,:,jw) + + END IF ! lactivation !>>dod<< + + END DO ! jclass + END DO ! jw + + !-->HK + !IF (.NOT. ALLOCATED(pfrac_m7)) ALLOCATE(pfrac_m7(kbdim,klev,nclass)) + !IF (.NOT. ALLOCATED(pna_m7)) ALLOCATE(pna_m7(kbdim,klev,nclass)) + !<--HK + + DO jclass=1, nclass + IF (sizeclass(jclass)%lactivation) THEN !>>dod<< #377 + pfracn(1:kproma,:,jclass) = zfracn_top(1:kproma,:,jclass)/zfracn_bot(1:kproma,:,jclass) + pnact(1:kproma,:,jclass) = pfracn(1:kproma,:,jclass) * zn(1:kproma,:,jclass) + pcdncact(1:kproma,:) = pcdncact(1:kproma,:) + pnact(1:kproma,:,jclass) + !-->HK + !pfrac_m7(1:kproma,:,jclass) = pfracn(1:kproma,:,jclass) + !pna_m7(1:kproma,:,jclass) = pnact(1:kproma,:,jclass) + !<--HK + END IF + END DO + + END SUBROUTINE ham_activ_abdulrazzak_ghan + +!-->HK: diagnostics streams to be only used with HAMMOZ +#ifdef HAMMOZ + SUBROUTINE ham_activ_diag_abdulrazzak_ghan_strat(kproma, kbdim, klev, & + krow, pnact, pfracn, & + prc, psmax ) + + USE mo_activ, ONLY: na, nw, swat_max_strat + USE mo_ham_streams, ONLY: frac, nact_strat, rc_strat + USE mo_param_switches, ONLY: nactivpdf + + INTEGER, INTENT(IN) :: kproma, kbdim, klev, krow + REAL(dp), INTENT(IN) :: pnact(kbdim,klev,nclass), & ! number of activated particles per mode [m-3] + pfracn(kbdim,klev,nclass),& ! fraction of activated particles per mode + prc(kbdim,klev,nclass,nw),& ! critical radius of activation per mode and w bin [m] + psmax(kbdim,klev,nw) ! maximum supersaturation per w bin [% 0-1] + + INTEGER :: jclass, jw + + IF (nactivpdf <= 0) THEN + DO jw=1, nw + swat_max_strat(jw)%ptr(1:kproma,:,krow) = psmax(1:kproma,:,jw) + + DO jclass=1, nclass + !>>dod #377 + IF (sizeclass(jclass)%lactivation) THEN + WHERE(prc(1:kproma,:,jclass,jw) /= 1._dp) + rc_strat(jclass,jw)%ptr(1:kproma,:,krow)=prc(1:kproma,:,jclass,jw) + ENDWHERE + END IF + !>>dod + END DO + END DO + END IF + + na(1:kproma,:,krow) = 0._dp + + !-->HK + !IF (.NOT. ALLOCATED(pfrac_m7)) ALLOCATE(pfrac_m7(kproma,klev,nclass)) + !<--HK + + DO jclass=1, nclass + !>>dod #377 + IF (sizeclass(jclass)%lactivation) THEN + nact_strat(jclass)%ptr(1:kproma,:,krow)=pnact(1:kproma,:,jclass) + frac(jclass)%ptr(1:kproma,:,krow)=pfracn(1:kproma,:,jclass) + na(1:kproma,:,krow)=na(1:kproma,:,krow)+pnact(1:kproma,:,jclass) + !-->HK + !pfrac_m7(1:kproma,:,jclass) = pfracn(1:kproma,:,jclass) + !-->dod + END DO + + END SUBROUTINE ham_activ_diag_abdulrazzak_ghan_strat + + SUBROUTINE ham_activ_diag_abdulrazzak_ghan_conv(kproma, kbdim, klev, & + krow, pnact, prc, psmax ) + + USE mo_activ, ONLY: nw, swat_max_conv + USE mo_ham_streams, ONLY: nact_conv, rc_conv + USE mo_param_switches, ONLY: nactivpdf + + INTEGER, INTENT(IN) :: kproma, kbdim, klev, krow + REAL(dp), INTENT(IN) :: pnact(kbdim,klev,nclass), & ! number of activated particles per mode [m-3] + prc(kbdim,klev,nclass,nw),& ! critical radius of activation per mode and w bin [m] + psmax(kbdim,klev,nw) ! maximum supersaturation per w bin [% 0-1] + + INTEGER :: jclass, jw + + IF (nactivpdf <= 0) THEN + DO jw=1,nw + swat_max_conv(jw)%ptr(1:kproma,:,krow) = psmax(1:kproma,:,jw) + DO jclass=1, nclass + !>>dod #377 + IF (sizeclass(jclass)%lactivation) THEN + WHERE(prc(1:kproma,:,jclass,jw) /= 1._dp) + rc_conv(jclass,jw)%ptr(1:kproma,:,krow)=prc(1:kproma,:,jclass,jw) + ENDWHERE + END IF + !>>dod + END DO + END DO + END IF + + DO jclass=1, nclass + !>>dod #377 + IF (sizeclass(jclass)%lactivation) THEN + nact_conv(jclass)%ptr(1:kproma,:,krow)=pnact(1:kproma,:,jclass) + END IF + !>>dod + END DO + + END SUBROUTINE ham_activ_diag_abdulrazzak_ghan_conv +#endif +!-->dod #377 + IF (sizeclass(jclass)%lactivation) THEN + zmasssum(1:kproma,:,jclass)=zmasssum(1:kproma,:,jclass)+pxtm1(1:kproma,:,jt) + END IF + !< 0 .AND. sizeclass(jclass)%lactivation) THEN !>>dod<< #377 + WHERE(zmasssum(1:kproma,:,jclass)>zeps) + + zmassfrac(1:kproma,:)=pxtm1(1:kproma,:,jt)/zmasssum(1:kproma,:,jclass) + + zsumtop(1:kproma,:,jclass)=zsumtop(1:kproma,:,jclass)+pxtm1(1:kproma,:,jt)*znion*zosm*zmassfrac(1:kproma,:)/zmoleweight + zsumbot(1:kproma,:,jclass)=zsumbot(1:kproma,:,jclass)+pxtm1(1:kproma,:,jt)/zrhoaer + + END WHERE + + END IF! nion>0 + + END DO !naerocomp + + DO jclass=1,nclass + !>>dod #377 + IF(sizeclass(jclass)%lactivation) THEN + WHERE (zsumbot(1:kproma,:,jclass)>zeps) + + !--- 1.1.1) Hygroscopicity parameter B (Eq. 4) [1]: + + pb(1:kproma,:,jclass)=(zamw*zsumtop(1:kproma,:,jclass))/(rhoh2o*zsumbot(1:kproma,:,jclass)) + + !--- 1.1.2) Calculate the curvature parameter A [m]: + + pa(1:kproma,:,jclass)= zafac/ptm1(1:kproma,:) + + END WHERE + END IF + !< HK: Lin & Leaitch only to be used with HAMMOZ +#ifdef HAMMOZ + !--------------------------------------------------------------------------- + !> + !! @brief Computes available particules for activation + !! + !! @remarks Preparatory routine for Lin&Leaitch activation scheme (HAM-specific) + !! Basically it computes the fractional mass and number of each mode + !! larger than the cutoff of the instrument and add them up + !! Derived from the former aero_activ_lin_leaitch subroutine + + SUBROUTINE ham_avail_activ_lin_leaitch(kproma, kbdim, klev, krow, & + prho, pxtm1) + + USE mo_activ, ONLY: na + USE mo_conv, ONLY: na_cv + USE mo_ham_tools, ONLY: ham_m7_logtail + USE mo_tracdef, ONLY: ntrac + USE mo_ham_streams, ONLY: frac, rwet + + !SF note: lwetrad is true in this routine, ie wet radius is used + USE mo_ham, ONLY: nham_subm, HAM_M7, HAM_SALSA, sizeclass !>>dod<< #377 + + INTEGER, INTENT(IN) :: kproma, kbdim, klev, krow + REAL(dp), INTENT(IN) :: prho(kbdim,klev) ! air density + REAL(dp), INTENT(IN) :: pxtm1(kbdim,klev,ntrac) ! tracer mmr + + REAL(dp), PARAMETER :: crcut=0.03*1E-6_dp ! Assumed lower cut-off of the + ! aerosol size distribution [m] + + !--- Ulrike: included for activation in convective clouds + REAL(dp), PARAMETER :: crcut_cv=0.02*1E-6_dp ! Assumed lower cut-off of the + ! aerosol size distribution in convective clouds [m] + + REAL(dp) :: cfracn(nclass) + + LOGICAL, PARAMETER :: lcut=.TRUE. ! explicit calculation of cut-off crcut or + ! usage of prescribed values cfracn + + LOGICAL, PARAMETER :: ll_numb = .TRUE. ! switch between number/mass in logtail calculation !SF + + INTEGER :: jclass, it + + REAL(dp) :: zr(kbdim,klev,nclass) + REAL(dp) :: zfracn(kbdim,klev,nclass) + REAL(dp) :: zfracn_cv(kbdim,klev,nclass) + + SELECT CASE(nham_subm) + CASE(HAM_M7) + cfracn(:) = (/1.0_dp,1.0_dp,1.0_dp,1.0_dp,0.0_dp,0.0_dp,0.0_dp/) + CASE(HAM_SALSA) + cfracn(:) = 1.0_dp + END SELECT + !>>dod bugfix + na(1:kproma,:,krow) = 0._dp + na_cv(1:kproma,:,krow) = 0._dp + !<>dod redmine #377: calculations and diagnotics restricted to relevant modes only. + !--- Calculate the fractional number of each mode + ! larger than the cutoff of the instrument: + SELECT CASE(nham_subm) + CASE(HAM_M7) + IF (lcut) THEN + + DO jclass=1, nclass !SF the ham_m7_logtail calculation is now done mode per mode for better efficiency + IF (sizeclass(jclass)%lactivation) THEN + IF (cfracn(jclass) > EPSILON(1._dp)) THEN !SF #279: only performs this calculation when relevant + !SF stratiform: + zr(1:kproma,:,jclass)=crcut + + CALL ham_m7_logtail(kproma, kbdim, klev, krow, jclass, & + ll_numb, rwet(jclass)%ptr(:,:,krow), & + zr(:,:,jclass), zfracn(:,:,jclass) ) + + !SF convective: + zr(1:kproma,:,jclass)=crcut_cv + + CALL ham_m7_logtail(kproma, kbdim, klev, krow, jclass, & + ll_numb, rwet(jclass)%ptr(:,:,krow), & + zr(:,:,jclass), zfracn_cv(:,:,jclass) ) + ELSE !SF #279: ensures that zfracn and zfracn_cv are set to 0. when size class + ! is not relevant for activation + zfracn(1:kproma,:,jclass) = 0._dp + zfracn_cv(1:kproma,:,jclass) = 0._dp + ENDIF + END IF + END DO + + ELSE + + DO jclass=1, nclass + IF (sizeclass(jclass)%lactivation) THEN + zfracn(1:kproma,:,jclass) = cfracn(jclass) + zfracn_cv(1:kproma,:,jclass) = cfracn(jclass) !SF was missing in previous version. Mistake?? + END IF + END DO + + END IF + + CASE(HAM_SALSA) + DO jclass=1, nclass + zfracn(1:kproma,:,jclass) = cfracn(jclass) + zfracn_cv(1:kproma,:,jclass) = cfracn(jclass) !SF was missing in previous version. Mistake?? + END DO + ! If lcut for SALSA cut out the particles in 1a r=~25nm + ! Approximately the same as with M7 having crcut=30nm + IF (lcut) THEN + zfracn(1:kproma,:,1:3)=0.0_dp + ! For convective clouds.. cut out 1a r=~25nm, (M7 crcut=20nm) + zfracn_cv(1:kproma,:,1:3)=0.0_dp + END IF + END SELECT + !--- Sum up aerosol number concentrations and convert from [kg-1] to [m-3]: + DO jclass=1, nclass + !>>dod #377 + IF(sizeclass(jclass)%lactivation) THEN + + !>>dod soa + it = sizeclass(jclass)%idt_no + !<>dod<< #377 + + INTEGER, INTENT(IN) :: kproma, kbdim, klev, krow + REAL(dp), INTENT(IN) :: prho(kbdim,klev) ! air density + REAL(dp), INTENT(IN) :: pxtm1(kbdim,klev,ntrac) ! tracer mmr + REAL(dp), INTENT(IN) :: pcdncact(kbdim,klev) ! number of activated particles + + INTEGER :: jclass, it + LOGICAL :: ll1(kbdim,klev) + REAL(dp) :: zeps + REAL(dp) :: ztmp1(kbdim,klev), ztmp2(kbdim,klev) + + zeps = EPSILON(1._dp) + + DO jclass=1, nclass + !>>dod #377 + IF(sizeclass(jclass)%lactivation) THEN + !>>dod soa + it = sizeclass(jclass)%idt_no + !<>SF #458 (replacing where statements) + ll1(1:kproma,:) = (na(1:kproma,:,krow) > zeps) + ztmp1(1:kproma,:) = MERGE(na(1:kproma,:,krow), 1._dp, ll1(1:kproma,:)) !SF 1._dp is a dummy val. + ztmp2(1:kproma,:) = pxtm1(1:kproma,:,it) * prho(1:kproma,:) & + * frac(jclass)%ptr(1:kproma,:,krow) / ztmp1(1:kproma,:) + + nact_strat(jclass)%ptr(1:kproma,:,krow) = MERGE( & + pcdncact(1:kproma,:) * ztmp2(1:kproma,:), & + nact_strat(jclass)%ptr(1:kproma,:,krow), & + ll1(1:kproma,:)) + + nact_conv(jclass)%ptr(1:kproma,:,krow) = MERGE( & + cdncact_cv(1:kproma,:,krow) * ztmp2(1:kproma,:), & + nact_conv(jclass)%ptr(1:kproma,:,krow), & + ll1(1:kproma,:)) + !< +!! \filename +!! mo_ham_drydep.f90 +!! +!! \brief +!! This module handles all input terms required for the calculations +!! of the surface aerosol dry deposition in HAM. +!! +!! \author Martin Schultz (MPIfM) +!! \author Hans-Stefan Bauer (MPIfM) +!! +!! \responsible_coder +!! Martin Schultz, m.schultz@fz-juelich.de +!! +!! \revision_history +!! -# M. Schultz and H.-S. Bauer (MPIfM) - original code (2000-07) +!! -# L. Ganzeveld and A. Rhodin () - (2001-10) +!! -# P. Stier (MPIfM) - (2002-2006) +!! -# M. Schultz (FZJ) and S. Ferrachat (ETHZ) - new module structure (2009-11) +!! -# G. Frontoso (C2SM) - distinguish between land / water / ice to +!! account for non-linearity (2012-02) +!! -# T. Bergman (FMI) - nmod->nclass to facilitate new aerosol models (2013-02-05) +!! +!! \limitations +!! None +!! +!! \details +!! This module handles all input terms required for the calculations +!! of the surface aerosol dry deposition in HAM. In particular, +!! the routine ham_vdaer calculates the dry deposition velocities for +!! HAM aerosol tracers. +!! Most of parameters are vegetation and soil data derived from satellite data +!! a high-resolution geograhical databases. For more details see the +!! routine where the actual reading occurs. The data are monthly mean +!! values, whenever there is an annual cycle in the data. In this +!! module, there is also the initialisation of the surface resistances +!! used for the dry deposition calculations. +!! Individual subroutines for calculation of vd by mode and integrated +!! +!! \bibliographic_references +!! None +!! +!! \belongs_to +!! HAMMOZ +!! +!! \copyright +!! Copyright and licencing conditions are defined in the ECHAM-HAMMOZ +!! licencing agreement to be found at: +!! https://redmine.hammoz.ethz.ch/projects/hammoz/wiki/1_Licencing_conditions +!! The ECHAM-HAMMOZ software is provided "as is" and without warranty of any kind. +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +MODULE mo_ham_drydep + + USE mo_kind, ONLY: dp + USE mo_tracdef, ONLY: ntrac + !USE mo_ham_m7, ONLY: rwet_m7, densaer_m7 + + IMPLICIT NONE + !---------------- + ! Public entities + !---------------- + PRIVATE + + PUBLIC :: ham_vdaer ! 'big leaf' aerosol dry deposition scheme +#ifdef HAMMOZ + PUBLIC :: ham_vd_presc ! prescribed drydep velocities for HAM tracers +#endif + + LOGICAL, PARAMETER :: lwhitecap = .TRUE. ! consider role of whitecaps + LOGICAL, PARAMETER :: ldr_rh = .FALSE. ! consider relative hum. effect + LOGICAL, PARAMETER :: lvd_bymode = .TRUE. ! calculate drydep velocities + ! individually by mode or as integrated + ! quantity. + + + +CONTAINS + +SUBROUTINE ham_vdaer( kproma, kbdim, klev, krow, loland, pvgrat, & + pcvs, pcvw, pfri, pcvbs, pfrw, pum1, & + pvm1, pustarl, pustarw, pustari, pustveg, pustslsn, & + pu10, pv10, & + pm6rp, prhop, & ! m7 + paz0w, paz0i, prahwat, prahice, prahveg, prahslsn, & + ptslm1, prh, pxtm1, pvd ) + + !===================================================================== + ! Program to calculate the dry deposition velocity for + ! aerosols as a function of the particle radius considering the + ! impaction and difussion. Sedimentation is also calculated but not + ! included in the calculated deposition velocity since this process + ! is considered in a separate routine + !===================================================================== + + ! Author: + ! ------- + ! Laurens Ganzeveld, MPI Mainz 04/2001 + ! + ! Modifications: + ! -------------- + ! Philip Stier, MPI Hamburg (adaption to ECHAM/M7, + ! non-integrated scheme) 12/2001 + ! Sylvaine Ferrachart, Martin Schultz: new module structure 11/2009 + ! + ! Methodology: + ! + ! This program calculates the integrated deposition velocity from + ! the mass size distribution for a log normal aerosol distribution + ! defined by the radius and the log sigma. The model calculates the + ! Vd over land and over sea considering the diffusion,impaction and + ! sedimentation. Over sea the effect op particle growth due to the + ! large relative humidity is accounted for and the effect of + ! bubble bursting is also considered. The bubble bursting enhances + ! the dry deposition since it causes the breakdown of the laminar + ! boundary layer and the scavenging of the particles by the sea spray. + ! This model version does not contain yet a parameterization which + ! specifically considers the deposition to vegetated surfaces. For + ! these surfaces, a surface resistance as a function of canopy + ! structure should be incorporated. This might possible be implemented + ! in the future (Laurens Ganzeveld, 29-01-2002) + ! + ! The model requires as input parameters: + ! ------------------------------------------------------------------- + ! - UM, windspeed at reference height + ! - PAZ0M, surface roughness, over sea this term is calculated from UM + ! - PTSLM1, Air or surface temperature + ! - LOLAND, land-sea mask + ! - N, aerosol number [cm -3] + ! - R, aerosol radius [m] + ! - LSIGMA, LOG sigma of the log normal distribution + ! - RHOA_AEROS, the density of the aerosol + ! replaced by: densaer (Philip Stier) + !======================================================================== + ! LG- the parameter names in M7 for the parameters R, LSIGMA, and RHOA + ! are pm6rp, sigma (are similar for all the modes of M7, + ! LG 23-01-2002) and densaer + ! ======================================================================= + + USE mo_ham_m7ctl, ONLY: cmr2mmr, sigmaln + USE mo_ham, ONLY: nclass,nham_subm,HAM_BULK, HAM_M7, HAM_SALSA + USE mo_tracdef, ONLY: trlist, AEROSOLNUMBER, AEROSOLMASS + USE mo_math_constants, ONLY: pi + USE mo_physical_constants, ONLY: grav + + IMPLICIT NONE + + !--- input parameters from echam, the parameter pevap has still to be + ! checked more carefully, if this is a used constant or actually the + ! echam evaporation + + INTEGER, INTENT(in) :: kproma, kbdim, klev, krow + + LOGICAL, INTENT(in) :: loland(kbdim) + + REAL(dp), INTENT(in) :: pvgrat(kbdim), & + pcvs(kbdim), & + pcvw(kbdim), & + pfri(kbdim), & + pcvbs(kbdim), & + pfrw(kbdim), & + pum1(kbdim,klev), & + pvm1(kbdim,klev), & + pustarl(kbdim), & + pustarw(kbdim), & + pustari(kbdim), & + pustveg(kbdim), & + pustslsn(kbdim), & + pu10(kbdim), & + pv10(kbdim), & + paz0w(kbdim), & + paz0i(kbdim), & + prahwat(kbdim), & + prahice(kbdim), & + prahveg(kbdim), & + prahslsn(kbdim), & + ptslm1(kbdim), & + prh(kbdim) + + REAL(dp), INTENT(in) :: pm6rp(kbdim,klev,nclass), prhop(kbdim,klev,nclass) +!gf REAL(dp), INTENT(in) :: pevap(kbdim) + + REAL(dp), INTENT(in) :: pxtm1(kbdim,klev,ntrac) + + REAL(dp), INTENT(inout) :: pvd(kbdim,ntrac) + + + !--- stream variable references +#ifdef HAMMOZ + REAL(dp), POINTER :: rwet_p(:,:,:) + REAL(dp), POINTER :: densaer_p(:,:,:) +#endif + !--- Local Variables: + + INTEGER :: ji, jl, jt, jclass, jtype + + INTEGER, PARAMETER :: NNUMBER=1, MASS=2 + + ! Aerosol properties and parameters relevant to the calculations: + + REAL(dp) :: rx1,rx2,um10,s,sc,cunning,vb_veg,vb_slsn, & + vim_veg, vim_slsn, st_veg, st_slsn, st_wat, st_ice, rew, vb_sea, & + vb_ice, vim_sea, vim_ice, vkdaccsea, & + eff, rdrop, zdrop, qdrop, vkd_veg, vkd_slsn, vkd_wat, vkd_ice, & + vkc_veg, vkc_slsn, vkc_wat, vkc_ice, vdpart_veg, vdpart_slsn, & + vdpart_wat, vdpart_ice, dc, relax, & + eps,phi,alpha1,alpharat,vk1,vk2,zm,zmvd,zn,zdm,zdn,zdlnr + + ! mz_lg_20031014+ added for some modifications of the vegetation surface + ! resistance based on the paper by Gallagher et al., JGR, 2002. The + ! paper shows some more details about the parameterization by + ! Slinn, Atmos. Environment, Vol 16, 1785-1794, 1982 + REAL(dp) :: vin_veg, zrebound + ! mz_lg_20031014- + + REAL(dp) :: zrint + REAL(dp) :: zvdrydep(kbdim) ! Aerosol Dry Deposition Velocity defined for each mode + REAL(dp) :: zr(kbdim) ! Aerosol Radius of the respective tracer at klev + REAL(dp) :: znmr(kbdim) ! Aerosol Number Mixing ratio at t=t+1 + + REAL(dp) :: zevap(kbdim) !gf + + !--- Auxiliary fields: + + REAL(dp) :: um(kbdim), alpha(kbdim), beta(kbdim), & + alphae(kbdim), bubble(kbdim) + + LOGICAL :: ldrydep + + INTEGER, PARAMETER :: nint=199 ! number of integration intervals + REAL(dp) :: zintstep(nint) ! integration intervals + + REAL(dp), PARAMETER :: crmin=0.01E-6_dp ! smallest radius for which a dry deposition + ! velocity is calculated [cm] + + !--- Assign values to used constants: + + REAL(dp), PARAMETER :: fln10=2.302585_dp + REAL(dp), PARAMETER :: w2pi=2.506638_dp + REAL(dp), PARAMETER :: g=grav*1.e2_dp ! cm s-2 at sea level (SF #369: changed to model-wide constant) + REAL(dp), PARAMETER :: dynvisc=1.789e-4_dp ! g cm-1 s-1 + REAL(dp), PARAMETER :: cl=0.066*1e-4_dp ! mean free path [cm] (particle size also in cm) + REAL(dp), PARAMETER :: bc= 1.38e-16_dp ! boltzman constant [g cm-2 s-1 K-1] (1.38e-23 J deg-1) + REAL(dp), PARAMETER :: kappa=1._dp ! shapefactor + REAL(dp), PARAMETER :: visc=0.15_dp ! molecular viscocity [cm2 s-1] + REAL(dp), PARAMETER :: daccm=0._dp ! factor which corrects for evaporation (see paper slinn) + REAL(dp), PARAMETER :: vkar=0.40_dp ! von karman constant + + ! mz_lg_20031014+ added for the Vd aerosol over vegetation + ! mz_lg_20040602+ modified + REAL(dp), PARAMETER :: zAS = 10.E-6_dp*1.E2_dp ! um -> CM, see paper Gallagher and Slinn, 1982 + ! here the smallest collector size is set at 10 um + ! Those are the values for Slinn's 82 model (see Table 1) + REAL(dp), PARAMETER :: zAL = 1.E-3_dp*1.E2_dp ! mm -> CM, see paper Gallagher and Slinn, 1982 + ! here the largest collector size is set at 1 mm + ! mz_lg_20040602-+ modified + ! mz_lg_20031014- + + !@@@ Check with Laurens (see comments above) + + zevap(1:kproma)=0._dp + + !--- Integration stepsizes [m], 0-10 and 10-100,100-1000 um + ! the first interval is divided into 1000 steps of 0.1 um + ! whereas for the interval >10 um 90 steps of 1 um are selected + ! and for the radius > 100 um 90 steps of 10 um are selected + + DATA zintstep /100*.01E-6_dp,90*1.E-6_dp,9*10.E-6_dp/ + + !--- 1) Calculate correction factors: + + DO jl=1,kproma + + ! LG- calculation of some parameters required for the deposition calculations + + um(jl)=MAX(0.001_dp,SQRT(pum1(jl,klev)**2+pvm1(jl,klev)**2)) + um10=MAX(0.001_dp,SQRT(pu10(jl)**2+pv10(jl)**2)) + + ! bubble bursting effect,see Hummelshoj, equation 10 + ! relationship by Wu (1988), note that Hummelshoj has not + ! considered the cunningham factor which yields a different + ! vb curve, with smaller values for small particles + + IF (lwhitecap) THEN + alpha(jl)=MAX(1.e-10_dp,1.7e-6_dp*um10**3.75_dp) ! old 10 m windspeed !! + eff=0.5_dp + rdrop=0.005_dp ! cm + zdrop=10.0_dp ! cm + qdrop=5._dp*(100._dp*alpha(jl)) + bubble(jl)=((100._dp*pustarw(jl))**2)/(100._dp*um(jl))+eff* & + (2._dp*pi*rdrop**2)*(2._dp*zdrop)*(qdrop/alpha(jl)) + ELSE + alpha(jl)=0._dp + bubble(jl)=0._dp + ENDIF + + !--- Correction of particle radius for particle growth close to the + ! surface according to Fitzgerald, 1975, the relative humidity over + ! the ocean is restricted to 98% (0.98) due to the salinity + + s=MIN(0.98_dp,prh(jl)) + eps=0.6_dp + beta(jl)=EXP((0.00077_dp*s)/(1.009_dp-s)) + phi=1.058_dp-((0.0155_dp*(s-0.97_dp))/(1.02_dp-s**1.4_dp)) + alpha1=1.2_dp*EXP((0.066_dp*s)/(phi-s)) + vk1=10.2_dp-23.7_dp*s+14.5_dp*s**2 + vk2=-6.7_dp+15.5_dp*s-9.2_dp*s**2 + alpharat=1._dp-vk1*(1._dp-eps)-vk2*(1._dp-eps**2) + alphae(jl)=alpharat*alpha1 + + !--- Over land no correction for large humidity close to the surface: + + IF (loland(jl).OR..NOT.ldr_rh) THEN + alphae(jl)=1._dp + beta(jl)=1._dp + ENDIF + + END DO! jl=1, kproma + + !--- 2)Calculate dry deposition velocity for each internally mixed mode: + + IF (lvd_bymode) THEN + CALL ham_vdaer_bymode + ELSE + CALL ham_vdaer_integrated + END IF + + + + CONTAINS + +!--------------------------------------------------------------------------------------------- +! calculation by aerosol mode + + SUBROUTINE ham_vdaer_bymode + + + DO jclass=1, nclass + +#ifdef HAMMOZ + rwet_p => rwet(jclass)%ptr + densaer_p => densaer(jclass)%ptr +#endif + + DO jtype=1, 2 ! number (= 1) and mass (= 2) + + !--- Calculations are done in [cm] to get results in [cm s-1]: + + SELECT CASE(jtype) + CASE(1) + ldrydep=ANY(trlist%ti(:)%ndrydep==2 .AND. trlist%ti(:)%mode==jclass & + .AND. trlist%ti(:)%nphase==AEROSOLNUMBER) +#ifdef HAMMOZ + zr(1:kproma)=rwet_p(1:kproma,klev,krow)*1.E2_dp +#else + !zr(1:kproma)=rwet_m7(1:kproma,klev,jclass)*1.E2_dp + zr(1:kproma)=pm6rp(1:kproma,klev,jclass)*1.E2_dp +#endif + CASE(2) + ldrydep=ANY(trlist%ti(:)%ndrydep==2 .AND. trlist%ti(:)%mode==jclass & + .AND. trlist%ti(:)%nphase==AEROSOLMASS) + SELECT CASE(nham_subm) + CASE(HAM_M7) +#ifdef HAMMOZ + zr(1:kproma)=rwet_p(1:kproma,klev,krow)*1.E2_dp*cmr2mmr(jclass) +#else + !zr(1:kproma)=rwet_m7(1:kproma,klev,jclass)*1.E2_dp*cmr2mmr(jclass) + zr(1:kproma)=pm6rp(1:kproma,klev,jclass)*1.E2_dp*cmr2mmr(jclass) +#endif + CASE(HAM_SALSA) + !Deposition size is the same for mass and number in SALSA +#ifdef HAMMOZ + zr(1:kproma)=rwet_p(1:kproma,klev,krow)*1.E2_dp +#endif + END SELECT + END SELECT + + IF(ldrydep) THEN + + DO jl=1, kproma + + !--- Do calculations only for particles larger than 0.0001 um : + + IF (zr(jl) > crmin) THEN + + !--- Cunningham factor: + + cunning=1._dp+(cl/(alphae(jl)*zr(jl))**beta(jl)) & + *(2.514_dp+0.800_dp*EXP(-0.55_dp*(zr(jl))/cl)) + + !--- Diffusivity: + + dc=(bc*ptslm1(jl)*cunning)/(3._dp*pi*dynvisc*(alphae(jl)*zr(jl))**beta(jl)) + + ! Relaxation: + + ! mz_lg_20021311, modified based on discussions with + ! Philip Stier [kg m-3 => g cm-3] + +#ifdef HAMMOZ + relax=(densaer_p(jl,klev,krow)*1.E-3_dp*(((alphae(jl)*zr(jl))**beta(jl))**2)* & + cunning)/(18._dp*dynvisc*kappa) +#else + !relax=(densaer_m7(jl,klev,jclass)*1.E-3_dp*(((alphae(jl)*zr(jl))**beta(jl))**2)* & + ! cunning)/(18._dp*dynvisc*kappa) + relax=(prhop(jl,klev,jclass)*1.E-3_dp*(((alphae(jl)*zr(jl))**beta(jl))**2)* & + cunning)/(18._dp*dynvisc*kappa) +#endif + + ! Calculation of schmidt and stokes number + + sc =visc/dc + st_veg =(relax*(100._dp*pustveg(jl))**2)/visc + + ! mz_lg_20031014+, modified calculation of the Stokes number + ! over vegetated surfaces, see paper by Gallagher et al., + ! JGR 2002. zAL is a characteristic radius for the + ! largest collectors comprising the surface + ! ham_ps_20031201+ included minumum value for Stokes numbers: + st_veg =MAX((relax*(100._dp*pustveg(jl))**2)/(g*zAL),1.E-1_dp) + ! mz_lg_20031014- + st_slsn =MAX((relax*(100._dp*pustslsn(jl))**2)/visc,1.E-1_dp) + st_wat =MAX((relax*(100._dp*pustarw(jl))**2)/visc,1.E-1_dp) + st_ice =MAX((relax*(100._dp*pustari(jl))**2)/visc,1.E-1_dp) + ! ham_ps_20031201- + + !--- Calculation of the dry deposition velocity + ! See paper slinn and slinn, 1980, vd is related to d**2/3 + ! over land, whereas over sea there is accounted for slip + ! vb represents the contribution in vd of the brownian diffusion + ! and vi represents the impaction. + ! + !--- Over land, the vegetation and snow and bare soil fractions + ! are considered: + + vb_veg =(1._dp/vkar)*((pustveg(jl)/um(jl))**2)*100._dp*um(jl)*(sc**(-2._dp/3._dp)) + vb_slsn =(1._dp/vkar)*((pustslsn(jl)/um(jl))**2)*100._dp*um(jl)*(sc**(-2._dp/3._dp)) + vb_ice =(1._dp/vkar)*((pustari(jl)/um(jl))**2)*100._dp*um(jl)*(sc**(-2._dp/3._dp)) + vim_veg =(1._dp/vkar)*((pustveg(jl)/um(jl))**2)*100._dp*um(jl) & + *(10._dp**(-3._dp/st_veg)) + + ! mz_lg_20031014+, modified calculation of the impaction over + ! vegetated surfaces, see paper by Gallagher et al., JGR 2002. + ! We have applied here the parameterization by Slinn [1982] + ! over vegetated surfaces + vim_veg =(1._dp/vkar)*((pustveg(jl)/um(jl))**2)*100._dp*um(jl)* & + (st_veg**2/(1._dp+st_veg**2)) + ! mz_lg_20031014- + + vim_slsn =(1._dp/vkar)*((pustslsn(jl)/um(jl))**2)*100._dp*um(jl) & + *(10._dp**(-3._dp/st_slsn)) + vim_ice =(1._dp/vkar)*((pustari(jl)/um(jl))**2)*100._dp*um(jl) & + *(10._dp**(-3._dp/st_ice)) + + ! LG- the term evap has not been defined yet (30-01-2002) and the + ! term daccm is set to zero anyhow. It still must be checked if + ! this term should be included and how it relates to the factors + ! that correct for particle growth close to the surface, according + ! to Fitzjarald, 1975 (see ALPHAE and BETA) + + ! mz_lg_20031014+, modified calculation of the surface resistance over + ! vegetated surfaces, see paper by Gallagher et al., JGR 2002. + ! The calculation includes the interception collection efficiency + ! vim and a rebound correction factor R + !vkd_veg =pevap(jl)*daccm+(vb_veg+vim_veg) + vin_veg =(1._dp/vkar)*((pustveg(jl)/um(jl))**2)*100._dp*um(jl)* & + (1._dp/2._dp)*(zr(jl)/zAS)**2 ! equation 18 + zrebound =EXP(-st_veg**0.5_dp) ! equation 19 + vkd_veg =zevap(jl)*daccm+zrebound*(vb_veg+vim_veg+vin_veg) + ! mz_lg_20031014- + + vkd_slsn =zevap(jl)*daccm+(vb_slsn+vim_slsn) + vkd_ice =zevap(jl)*daccm+(vb_ice+vim_ice) + + !--- Over sea: + ! Brownian diffusion for rough elements, see Hummelshoj + ! re is the reynolds stress: + + rew =(100._dp*pustarw(jl)*100._dp*paz0w(jl))/visc + + vb_sea =(1._dp/3._dp)*100._dp*pustarw(jl)*((sc**(-0.5_dp))*rew**(-0.5_dp)) + vim_sea =100._dp*pustarw(jl)*10._dp**(-3._dp/st_wat) + vkdaccsea =vb_sea+vim_sea + vkd_wat =(1._dp-alpha(jl))*vkdaccsea+alpha(jl)*(bubble(jl)) + + ! Slinn and Slinn parameterization, calculation of vd: + ! ==================================================== + ! LG- without considering the role of sedimentation ! + ! This process is being calculated in a separate + ! subroutine in echam5! + ! ==================================================== + + vkc_veg =(100._dp/prahveg(jl)) + vkc_slsn =(100._dp/prahslsn(jl)) + vkc_wat =(100._dp/prahwat(jl)) + vkc_ice =(100._dp/prahice(jl)) + + !@@@ Included security checks for small values of vxx_yyy: + + IF(vkc_veg > 1.E-5_dp .AND. vkd_veg > 1.E-5_dp) THEN + vdpart_veg =1._dp/((1._dp/vkc_veg)+(1._dp/vkd_veg)) + ELSE + vdpart_veg = 0._dp + END IF + IF(vkc_slsn > 1.E-5_dp .AND. vkd_slsn > 1.E-5_dp) THEN + vdpart_slsn = 1._dp/((1._dp/vkc_slsn)+(1._dp/vkd_slsn)) + ELSE + vdpart_slsn = 0._dp + END IF + IF(vkc_wat > 1.E-5_dp .AND. vkd_wat > 1.E-5_dp) THEN + vdpart_wat =1._dp/((1._dp/vkc_wat)+(1._dp/vkd_wat)) + ELSE + vdpart_wat = 0._dp + END IF + IF(vkc_ice > 1.E-5_dp .AND. vkd_ice > 1.E-5_dp) THEN + vdpart_ice =1._dp/((1._dp/vkc_ice)+(1._dp/vkd_ice)) + ELSE + vdpart_ice = 0._dp + END IF + + !--- Calculate the dry deposition velocity weighted according to the surface types: + ! pcvs: snow fraction + ! pcvbs: bare soil fraction + ! pvgrat: vegetation ratio + ! pcvw: wet skin fraction + ! pfri: (sea) ice fraction + ! pfrw: open water fraction + + zvdrydep(jl) = pcvs(jl)*vdpart_slsn & + + pcvbs(jl)*vdpart_slsn & + + (1._dp-pcvs(jl))*(1._dp-pcvw(jl))*pvgrat(jl)*vdpart_veg & + + (1._dp-pcvs(jl))*pcvw(jl)*vdpart_veg & + + pfri(jl)*vdpart_ice & + + pfrw(jl)*vdpart_wat + + ELSE + + zvdrydep(jl)=0._dp + + END IF !zr(jl) > crmin + + END DO ! jl=1, kproma + + !--- save drydep velocity + SELECT CASE(jtype) + CASE(1) + DO jt=1,ntrac + IF (trlist%ti(jt)%ndrydep>0 .AND. & + trlist%ti(jt)%mode==jclass .AND. & + trlist%ti(jt)%nphase==AEROSOLNUMBER)THEN + + pvd(1:kproma,jt) = zvdrydep(1:kproma)*1.E-2_dp ! conversion from cm s-1 to m s-1 + + END IF + END DO + CASE(2) + DO jt=1,ntrac + IF (trlist%ti(jt)%ndrydep>0 .AND. & + trlist%ti(jt)%mode==jclass .AND. & + trlist%ti(jt)%nphase==AEROSOLMASS)THEN + + pvd(1:kproma,jt) = zvdrydep(1:kproma)*1.E-2_dp ! conversion from cm s-1 to m s-1 + + END IF + END DO + END SELECT + + END IF ! ldrydep + + END DO ! jtype=1, 2 + + END DO ! jclass=1, nclass + + END SUBROUTINE ham_vdaer_bymode + + +!--------------------------------------------------------------------------------------------- +! integrated calculation + + SUBROUTINE ham_vdaer_integrated + + DO jl=1, kproma + + DO jtype=1, 2 ! number (= 1) and mass (= 2) + + DO jclass=1, nclass + +#ifdef HAMMOZ + rwet_p => rwet(jclass)%ptr + densaer_p => densaer(jclass)%ptr +#endif + ! mz_lg_20030521+, small change in criteria to determine if calculations + ! should be bypassed, see also the same criteria for lvd_integrated=.false. +#ifdef HAMMOZ + IF ( ANY(trlist%ti(:)%mode==jclass.AND.trlist%ti(:)%ndrydep>0) .AND. & + rwet_p(jl,klev,krow) > crmin) THEN +#else + !IF ( ANY(trlist%ti(:)%mode==jclass.AND.trlist%ti(:)%ndrydep>0) .AND. & + ! rwet_m7(jl,klev,jclass) > crmin) THEN + IF ( ANY(trlist%ti(:)%mode==jclass.AND.trlist%ti(:)%ndrydep>0) .AND. & + pm6rp(jl,klev,jclass) > crmin) THEN +#endif + !--- Initialisations: + + DO jt=1, ntrac + IF (trlist%ti(jt)%mode==jclass .AND. trlist%ti(jt)%nphase==AEROSOLNUMBER ) THEN + znmr(jl)=pxtm1(jl,klev,jt) + END IF + END DO + + SELECT CASE(jtype) + CASE(1) +#ifdef HAMMOZ + zr(jl)=rwet_p(jl,klev,krow) +#else + !zr(jl)=rwet_m7(jl,klev,jclass) + zr(jl)=pm6rp(jl,klev,jclass) +#endif + CASE(2) +#ifdef HAMMOZ + zr(jl)=rwet_p(jl,klev,krow)*cmr2mmr(jclass) +#else + !zr(jl)=rwet_m7(jl,klev,jclass)*cmr2mmr(jclass) + zr(jl)=pm6rp(jl,klev,jclass)*cmr2mmr(jclass) +#endif + END SELECT + + rx1 = 0.0_dp + zmvd = 0.0_dp + zm = 0.0_dp + + DO ji=1,nint-1 + + ! Integration size interval is rx2-rx1: + + rx1=rx1+zintstep(ji) + rx2=rx1+zintstep(ji+1) + + !--- Calculate the number of particles in the intervall r+dr + ! for a log-normal distribution with the moments: + ! N=znmr, sigma, CountMeanRadius=pm6rp + ! dn=n(ln(r))dln(r) [m-3] + ! where: + ! r = (rx1+rx2)/2 + ! and + ! n(ln(r)) = N/(sqrt(2 PI)*ln(sigma)) * exp(-(ln(r)-ln(CMR))/(2ln(sigma)**2) + + zrint = (rx1+rx2)/2._dp + + !--- Particle Numbers: + + zdlnr = LOG(rx2)-LOG(rx1) + + zn = znmr(jl)/(2._dp*pi*sigmaln(jclass)) * & + EXP(-(LOG(zrint)-LOG(zr(jl)))/(2._dp*sigmaln(jclass)**2)) + zdn = zn * zdlnr + + !--- Average particle mass: + ! in intervall (zrint-dr,zrint+dr) [kg(tracer)/kg(air)] + +#ifdef HAMMOZ + zdm = 4._dp/3._dp*pi*zrint**3 * densaer_p(jl,klev,krow) * zdn +#else + !zdm = 4._dp/3._dp*pi*zrint**3 * densaer_m7(jl,klev,jclass) * zdn + zdm = 4._dp/3._dp*pi*zrint**3 * prhop(jl,klev,jclass) * zdn +#endif + + !--- Cunningham factor: + ! (Philip Stier, 11-2001, Separation into dry and wet not needed + ! as the ambient radius pm6rp incorporates the particle growth) + ! ================================================================= + ! LG- It still must be checked if it is indeed allright to + ! calculate only the parameters for the aerosol modal + ! parameters given by M7 to include the effect of particle + ! growth. The parameterization of the effect of particle growth + ! that was included in the original scheme of the aerosol + ! dry deposition module corrects for the growth close to the + ! surface for a large relative humidity in quasi-laminar layer, + ! which is actual a sub-grid scale effect occuring in the + ! surface layer of echam. We have included again the calculation + ! of the parameters that are used to introduce this effect, + ! ALPHAE and BETA and use of this terms can easily be considered + ! or ignored, for the latter option setting the calculated values + ! to 1 (this is default done for over-land grids) + ! + ! Laurens Ganzeveld, 30-01-2002 + ! ================================================================= + + !--- Convert radii to cm to get the results in cm s-1: + + cunning=1._dp+(cl/(alphae(jl)*zrint*1.E2_dp)**beta(jl)) & + *(2.514_dp+0.800_dp*EXP(-0.55_dp*(zrint*1.E2_dp)/cl)) + + !--- Diffusivity: + + dc=(bc*ptslm1(jl)*cunning)/(3._dp*pi*dynvisc*(alphae(jl)*zrint*1.E2_dp)**beta(jl)) + + ! Relaxation: + + ! mz_lg_20021311, modified based on discussions with + ! Philip Stier [kg m-3 => g cm-3] +#ifdef HAMMOZ + relax=(densaer_p(jl,klev,krow)*1.E-3_dp*(((alphae(jl)*zrint)**beta(jl))**2)* & + cunning)/(18._dp*dynvisc*kappa) +#else + !relax=(densaer_m7(jl,klev,jclass)*1.E-3_dp*(((alphae(jl)*zrint)**beta(jl))**2)* & + ! cunning)/(18._dp*dynvisc*kappa) + relax=(prhop(jl,klev,jclass)*1.E-3_dp*(((alphae(jl)*zrint)**beta(jl))**2)* & + cunning)/(18._dp*dynvisc*kappa) +#endif + + ! Calculation of schmidt and stokes number + + sc =visc/dc + st_veg =(relax*(100._dp*pustveg(jl))**2)/visc + + ! mz_lg_20031014+, modified calculation of the Stokes number + ! over vegetated surfaces, see paper by Gallagher et al., + ! JGR 2002. zAL is a characteristic radius for the + ! largest collectors comprising the surface + st_veg =(relax*(100._dp*pustveg(jl))**2)/(g*zAL) + ! mz_lg_20031014- + + st_slsn =(relax*(100._dp*pustslsn(jl))**2)/visc + st_wat =(relax*(100._dp*pustarw(jl))**2)/visc + st_ice =(relax*(100._dp*pustari(jl))**2)/visc + + !--- Calculation of the dry deposition velocity + ! See paper slinn and slinn, 1980, vd is related to d**2/3 + ! over land, whereas over sea there is accounted for slip + ! vb represents the contribution in vd of the brownian diffusion + ! and vi represents the impaction. + ! + !--- Over land, the vegetation and snow and bare soil fractions + ! are considered: + + vb_veg =(1._dp/vkar)*((pustveg(jl)/um(jl))**2)*100._dp*um(jl)*(sc**(-2._dp/3._dp)) + vb_slsn =(1._dp/vkar)*((pustslsn(jl)/um(jl))**2)*100._dp*um(jl)*(sc**(-2._dp/3._dp)) + vb_ice =(1._dp/vkar)*((pustari(jl)/um(jl))**2)*100._dp*um(jl)*(sc**(-2._dp/3._dp)) + + ! mz_lg_20031014+, modified calculation of the impaction over + ! vegetated surfaces, see paper by Gallagher et al., JGR 2002. + ! We have applied here the parameterization by Slinn [1982] + ! over vegetated surfaces + ! (Philip Stier 30/10/2003, corrected um to um(jl)) + !vim_veg =(1./vkar)*((pustveg(jl)/um(jl))**2)*100.*um(jl)*(10.**(-3./st_veg)) + + vim_veg =(1._dp/vkar)*((pustveg(jl)/um(jl))**2)*100._dp*um(jl) & + *(st_veg**2/(1._dp+st_veg**2)) + ! mz_lg_20031014- + + vim_slsn =(1._dp/vkar)*((pustslsn(jl)/um(jl))**2)*100._dp*um(jl) & + *(10._dp**(-3._dp/st_slsn)) + vim_ice =(1._dp/vkar)*((pustari(jl)/um(jl))**2)*100._dp*um(jl) & + *(10._dp**(-3._dp/st_ice)) + + ! LG- the term evap has not been defined yet (30-01-2002) and the + ! term daccm is set to zero anyhow. It still must be checked if + ! this term should be included and how it relates to the factors + ! that correct for particle growth close to the surface, according + ! to Fitzjarald, 1975 (see ALPHAE and BETA) + + + ! mz_lg_20031014+, modified calculation of the surface resistance over + ! vegetated surfaces, see paper by Gallagher et al., JGR 2002. + ! The calculation includes the interception collection efficiency + ! vim and a rebound correction factor R + !vkd_veg =pevap(jl)*daccm+(vb_veg+vim_veg) + + vin_veg =(1._dp/vkar)*((pustveg(jl)/um(jl))**2)*100._dp*um(jl)* & + (1._dp/2._dp)*(zrint/zAS)**2 ! equation 18 + zrebound =EXP(-st_veg**0.5_dp) ! equation 19 + vkd_veg =zevap(jl)*daccm+zrebound*(vb_veg+vim_veg+vin_veg) + ! mz_lg_20031014- + + vkd_slsn =zevap(jl)*daccm+(vb_slsn+vim_slsn) + + !--- Over sea: + ! Brownian diffusion for rough elements, see Hummelshoj + ! re is the reynolds stress: + + rew =(100._dp*pustarw(jl)*100._dp*paz0w(jl))/visc + vb_sea =(1._dp/3._dp)*100._dp*pustarw(jl)*((sc**(-0.5_dp))*rew**(-0.5_dp)) + vim_sea =100._dp*pustarw(jl)*10._dp**(-3._dp/st_wat) + vkdaccsea =vb_sea+vim_sea + vkd_wat =(1._dp-alpha(jl))*vkdaccsea+alpha(jl)*(bubble(jl)) + + ! Slinn and Slinn parameterization, calculation of vd: + ! ==================================================== + ! LG- without considering the role of sedimentation ! + ! This process is being calculated in a separate + ! subroutine in echam5! + ! ==================================================== + + vkc_veg =(100._dp/prahveg(jl)) + vkc_slsn =(100._dp/prahslsn(jl)) + vkc_wat =(100._dp/prahwat(jl)) + vkc_ice =(100._dp/prahice(jl)) + vdpart_veg =1._dp/((1._dp/vkc_veg)+(1._dp/vkd_veg)) + vdpart_slsn =1._dp/((1._dp/vkc_slsn)+(1._dp/vkd_slsn)) + vdpart_wat =1._dp/((1._dp/vkc_wat)+(1._dp/vkd_wat)) + vdpart_ice =1._dp/((1._dp/vkc_ice)+(1._dp/vkd_ice)) + + !--- Calculate sum(dm*vd(dm)): + ! pcvs: snow fraction + ! pcvbs: bare soil fraction + ! pvgrat: vegetation ratio + ! pcvw: wet skin fraction + ! pfri: (sea) ice fraction + ! pfrw: open water fraction + + + zmvd = zmvd + zdm*( & + pcvs(jl)*vdpart_slsn+ & ! snow fraction + pcvbs(jl)*vdpart_slsn+ & ! bare soil fraction + (1._dp-pcvs(jl))*(1._dp-pcvw(jl))*pvgrat(jl)*vdpart_veg+ & ! vegetation fraction + (1._dp-pcvs(jl))*pcvw(jl)*vdpart_veg+ & ! wet skin fraction + pfri(jl)*vdpart_ice+ & ! sea ice fraction + pfrw(jl)*vdpart_wat ) ! water fraction + + !--- Calculate m=sum(dm) [kg(tracer)/kg(air)]: + + zm = zm + zdm + + END DO !ji=1,nint-1 + + !--- Calculate integrated dry deposition velocity [cm s-1]: + ! vd = sum(dm*vd) / m + + zvdrydep(jl)= zmvd/zm + + ELSE + + zvdrydep(jl)=0._dp + + END IF + + END DO ! jl=1, kproma + + !--- Assign the calculated deposition velocity to all tracers + ! in the respecive mode and re-convert it to [m s-1]: + + ! this can cause the same fields to be written many times if drydep diag is BYTRACER + ! needs improvement + + SELECT CASE(jtype) + CASE(1) + DO jt=1,ntrac + IF (trlist%ti(jt)%ndrydep>0 .AND. & + trlist%ti(jt)%mode==jclass .AND. & + trlist%ti(jt)%nphase==AEROSOLNUMBER)THEN + + pvd(1:kproma,jt) = zvdrydep(1:kproma)*1.E-2_dp ! conversion cm s-1 to m s-1 + END IF + END DO + CASE(2) + DO jt=1,ntrac + IF (trlist%ti(jt)%ndrydep>0 .AND. & + trlist%ti(jt)%mode==jclass .AND. & + trlist%ti(jt)%nphase==AEROSOLMASS)THEN + + pvd(1:kproma,jt) = zvdrydep(1:kproma)*1.E-2_dp ! conversion cm s-1 to m s-1 + END IF + END DO + END SELECT + + END DO ! jclass=1, nclass + + END DO ! jtype=1, 2 + + END SUBROUTINE ham_vdaer_integrated + + +END SUBROUTINE ham_vdaer + +!------------------------------------------------------------------------------ +#ifdef HAMMOZ +SUBROUTINE ham_vd_presc(kproma, kbdim, klev, krow, loland, & + paphp1, pcvs, pforest, pfri, ptsi, & + pcvw, ptslm1, pws, pwsmx, pdensair, & + pvd ) + + ! Purpose: + ! --------- + ! This routine prescribes dry deposition velocities for + ! aerosols and gases in dependency of surface type, etc. + ! ... + ! + ! Authors: + ! ---------- + ! Hans Feichter, MPI-MET + ! Philip Stier, MPI-MET + ! + ! Method: + ! ------- + ! Currently rudimentary! + ! + ! Interface: + ! ---------- + ! *xt_vdrydep_presc* is called from *xt_drydep* + + USE mo_kind, ONLY: dp + USE mo_control, ONLY: nlev + USE mo_time_control, ONLY: time_step_len + USE mo_physical_constants, ONLY: tmelt, grav + USE mo_tracdef, ONLY: trlist, ntrac, AEROSOLMASS, AEROSOLNUMBER, GAS + USE mo_physc2, ONLY: ctfreez, & ! sea water freezing temp. + csncri ! m water equivalent critical snow depth + USE mo_vphysc, ONLY: vphysc +!! USE mo_submodel_diag, ONLY: get_diag_pointer + + + IMPLICIT NONE + + !--- Parameters: + !--- Local variables: + ! + ! zvdrd dry deposition velocity in m/s + ! zvdrd(jl,1) for so2 gas + ! zvdrd(jl,2) for aerosols + ! zvdcoarse for dust and seasalt aerosols (coarse mode) + + ! Parameters: + + INTEGER, INTENT(in) :: kproma, kbdim, klev, krow + + REAL(dp), INTENT(in) :: pfri(kbdim), & + pcvs(kbdim), & + pcvw(kbdim), & + pforest(kbdim), & + ptsi(kbdim), & + ptslm1(kbdim), & + pws(kbdim), & + pwsmx(kbdim), & + pdensair(kbdim), & + paphp1(kbdim,klev+1) + + REAL(dp), INTENT(inout) :: pvd(kbdim,ntrac) + + ! Local scalars: + + INTEGER :: jl, jt + + REAL(dp):: zvd2ice, zvd4ice, zvd2nof, zvd4nof, & + zvwc2, zvw02, zvwc4, zvw04 + + ! Local arrays: + + REAL(dp):: zmaxvdry(kbdim) + REAL(dp):: zvdrd(kbdim,2) + + LOGICAL :: loland(kbdim) + + ! Constants: + + REAL(dp), PARAMETER :: zvdcoarse = 0.01_dp, & ! V_dep coarse mode [m/s] + zvdaitken = 0.01_dp ! V_dep aitken mode [m/s] + + + !--- 1) Calculation of the dry deposition velocity: ----------------------- + + !--- Coefficients for zvdrd = function of soil moisture: + ! + zvwc2=(0.8e-2_dp - 0.2e-2_dp)/(1._dp - 0.9_dp) + zvw02=zvwc2-0.8e-2_dp + zvwc4=(0.2e-2_dp - 0.025e-2_dp)/(1._dp - 0.9_dp) + zvw04=zvwc4-0.2e-2_dp + + !--- Maximal deposition velocity is maximal vertical grid velocity: + + DO jl=1,kproma + zmaxvdry(jl)=(paphp1(jl,nlev+1)-paphp1(jl,nlev))/(grav*pdensair(jl)*time_step_len) + END DO + + + DO jl=1,kproma + + !--- 1.1) Over sea: + + IF (.NOT.loland(jl)) THEN + ! - sea ice - + ! - melting/not melting seaice- + IF (ptsi(jl).GE.(ctfreez-0.01_dp)) THEN + zvd2ice=0.8e-2_dp ! SO2 + zvd4ice=0.2e-2_dp ! others + ELSE + zvd2ice=0.1e-2_dp + zvd4ice=0.025e-2_dp + END IF + zvdrd(jl,1)=(1._dp-pfri(jl))*1.0e-2_dp+pfri(jl)*zvd2ice + zvdrd(jl,2)=(1._dp-pfri(jl))*0.2e-2_dp+pfri(jl)*zvd4ice + ELSE + + !--- 1.2) Over land: + ! - non-forest areas - + ! - snow/no snow - + IF (pcvs(jl).GT.csncri) THEN + ! - melting/not melting snow - + IF (vphysc%smelt(jl,krow).GT.0._dp) THEN + zvd2nof=0.8e-2_dp + zvd4nof=0.2e-2_dp + ELSE + zvd2nof=0.1e-2_dp + zvd4nof=0.025e-2_dp + END IF + ELSE + ! - frozen/not frozen soil - + IF (ptslm1(jl).LE.tmelt) THEN + zvd2nof=0.2e-2_dp + zvd4nof=0.025e-2_dp + ELSE + ! - wet/dry - + ! - completely wet - + IF (pcvw(jl).GE.0.01_dp .OR. pws(jl).EQ.pwsmx(jl)) THEN + zvd2nof=0.8e-2_dp + zvd4nof=0.2e-2_dp + ELSE + ! - dry - + IF ((pws(jl)/pwsmx(jl)).LT.0.9_dp) THEN + zvd2nof=0.2e-2_dp + zvd4nof=0.025e-2_dp + ELSE + ! - partly wet - + zvd2nof=zvwc2*(pws(jl)/pwsmx(jl))-zvw02 + zvd4nof=zvwc4*(pws(jl)/pwsmx(jl))-zvw04 + END IF + END IF + END IF + END IF + zvdrd(jl,1)=pforest(jl)*0.8e-2_dp+(1._dp-pforest(jl))*zvd2nof + zvdrd(jl,2)=pforest(jl)*0.2e-2_dp+(1._dp-pforest(jl))*zvd4nof + END IF + ! + !--- Ask zvdrd for maximum: + ! + zvdrd(jl,1)=MIN(zvdrd(jl,1),zmaxvdry(jl)) + zvdrd(jl,2)=MIN(zvdrd(jl,2),zmaxvdry(jl)) + + END DO + + DO jt=1, ntrac + + IF (trlist%ti(jt)%ndrydep/=1) CYCLE ! only set vd for tracers that request prescribed values + + ! HAM gas-phase tracers + IF (trlist%ti(jt)%basename=='SO2' .OR. & + (trlist%ti(jt)%basename=='SO4'.AND. trlist%ti(jt)%nphase==GAS) ) THEN + + pvd(1:kproma,jt) = zvdrd(1:kproma,1) + + ! HAM aerosol tracers + ELSE IF(trlist%ti(jt)%nphase==AEROSOLMASS .OR. trlist%ti(jt)%nphase==AEROSOLNUMBER) THEN + + SELECT CASE (trlist%ti(jt)%mode) + CASE(1) + pvd(1:kproma,jt) = 0._dp + CASE(2) + pvd(1:kproma,jt) = zvdaitken + CASE(3) + pvd(1:kproma,jt) = zvdrd(1:kproma,2) + CASE(4) + pvd(1:kproma,jt) = zvdcoarse + CASE(5) + pvd(1:kproma,jt) = zvdaitken + CASE(6) + pvd(1:kproma,jt) = zvdrd(1:kproma,2) + CASE(7) + pvd(1:kproma,jt) = zvdcoarse + END SELECT + + END IF + + END DO + +END SUBROUTINE ham_vd_presc +#endif + +END MODULE mo_ham_drydep diff --git a/ifs-source/arpifs/phys_ec/mo_ham_init.F90 b/ifs-source/arpifs/phys_ec/mo_ham_init.F90 new file mode 100644 index 00000000..3a6e5f3a --- /dev/null +++ b/ifs-source/arpifs/phys_ec/mo_ham_init.F90 @@ -0,0 +1,1191 @@ +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! \filename +!! mo_ham_init.f90 +!! +!! \brief +!! Initialisation routines for HAM aerosol model +!! +!! \author Martin Schultz (FZ Juelich) +!! +!! \responsible_coder +!! Martin Schultz, m.schultz@fz-juelich.de +!! +!! \revision_history +!! -# M. Schultz (FZ Juelich) - original code (2009-09-22) +!! -# D. O'Donnell, ETH-Z - added SOA support (2010-04-22) +!! +!! \limitations +!! None +!! +!! \details +!! This module contains the general HAM initialisation routine which is called +!! from submodel_initialise. +!! It first calls setham to initialize ham module variables and read the hamctl namelist. +!! Then other namelists are read and the M7 module is started. Next, the HAM species are +!! defined and the aerosol modes are populated. +!! Adopted from former init_ham routine. Contributors to +!! the code from which the present routines were derived include: +!! P. Stier, D. O'Donnell, K. Zhang +!! +!! \bibliographic_references +!! None +!! +!! \belongs_to +!! HAMMOZ +!! +!! SPDX-License-Identifier: BSD-3-Clause +!! Copyright (c) 2021 hammoz + +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +MODULE mo_ham_init + + IMPLICIT NONE + + PRIVATE + + SAVE + + PUBLIC :: start_ham, & + ham_initialize +#ifdef HAMMOZ + PUBLIC :: ham_init_memory, & + ham_free_memory +#endif + PUBLIC :: ham_define_tracer + + +! Variable declarations + + + CONTAINS + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! start_ham: high-level initialisation routine; interface for HAM aerosol module +!! initialisation including species definition +!! +!! @author see module info +!! +!! $Id: 1423$ +!! +!! @par Revision History +!! see module info +!! +!! @par This subroutine is called by +!! init_submodels +!! +!! @par Responsible coder +!! m.schultz@fz-juelich.de +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + SUBROUTINE start_ham + + USE mo_ham, ONLY : setham +#ifdef HAMMOZ + USE mo_ham_dust, ONLY : setdust +#endif + USE mo_ham, ONLY : naerosol, & + nsoa, & + nham_subm, & + sizeclass, & + nclass, & + HAM_BULK, & + HAM_M7, & + HAM_SALSA, & + subm_naerospec + USE mo_ham_m7ctl, ONLY : sethamM7, m7_initialize +#ifdef SALSA + USE mo_ham_salsactl, ONLY : setham_salsa + USE mo_ham_salsa_init, ONLY : salsa_initialize +#endif + USE mo_ham_subm_species,ONLY : map_ham_subm_species + USE mo_ham_species, ONLY : ham_species +#ifdef HAMMOZ + USE mo_ham_soa, ONLY : soa_species, start_soa_aerosols + ! >> thk: volatility basis set (VBS) + USE mo_ham_vbsctl, ONLY : setham_vbs, laqsoa + USE mo_ham_vbs, ONLY : vbs_species + ! << thk +#endif + + !-- local variables + LOGICAL :: lsoainclass(nclass) ! copy from sizeclass(:)%lsoainclass for code structure reasons + INTEGER :: jm + + ! -- 1. set default values and read hamctl namelist + + CALL setham +#ifdef HAMMOZ + ! -- read ham_dustctl namelist + CALL setdust +#endif + + SELECT CASE(nham_subm) + + ! Initialization for bulk microphysics + + CASE(HAM_BULK) + + ! CALL sethambulk + + ! -- initialize bulk scheme + ! CALL bulk_initialize + + CASE(HAM_M7) + + + ! -- initialize M7 scheme + CALL sethamM7 + CALL m7_initialize +#ifdef SALSA + CASE(HAM_SALSA) + + ! -- initialize SALSA scheme + CALL setham_salsa + CALL salsa_initialize +#endif + END SELECT + + ! -- 3. define aerosol species + CALL ham_species +#ifdef HAMMOZ + SELECT CASE (nsoa) + CASE(1) + CALL soa_species + CASE(2) + CALL setham_vbs + ! this had to be moved here from mo_ham_species, + ! because it caused a circular dependence + CALL vbs_species + END SELECT +#endif + + SELECT CASE (nham_subm) + + CASE(HAM_BULK) + + ! CALL map_bulk_species + + CASE(HAM_M7) + + ! -- map general species list onto M7 condensed list + CALL map_ham_subm_species + + ! -- 4. generate mode x species matrix + CALL ham_define_modes(nclass, naerosol(nham_subm), subm_naerospec) +#ifdef HAMMOZ + IF (nsoa == 1) THEN + DO jm=1,nclass + lsoainclass(jm) = sizeclass(jm)%lsoainclass + END DO + CALL start_soa_aerosols(nclass, lsoainclass) + END IF +#endif +#ifdef SALSA + CASE(HAM_SALSA) + + ! CALL map_salsa_species + CALL map_ham_subm_species + + CALL ham_define_bins(nclass, naerosol(nham_subm), subm_naerospec) +#endif + END SELECT + + + END SUBROUTINE start_ham + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! ham_define_tracer: create ECHAM tracers based on HAM species +!! +!! @author see module info +!! +!! $Id: 1423$ +!! +!! @par Revision History +!! see module info +!! +!! @par This subroutine is called by +!! init_submodels +!! +!! @par Externals: +!!
    +!!
  1. none +!!
+!! +!! @par Notes +!! ### ToDo: complete allocation of burden diagnostics +!! +!! @par Responsible coder +!! m.schultz@fz-juelich.de +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + SUBROUTINE ham_define_tracer + + ! + ! uses local grib table 131 (tracer) + ! codes >= 160 : gas-phase species + ! codes >= 201 : aerosol species + ! + + USE mo_exception, ONLY: message, message_text, em_error + USE mo_species, ONLY: nspec, speclist + USE mo_tracdef, ONLY: OK, RESTART, CONSTANT, INITIAL, & + ON, OFF, itrprog, itrdiag, itrpresc, & + itrnone, & !gf #57 + GAS, GAS_OR_AEROSOL, AEROSOLNUMBER, AEROSOLMASS, & + SOLUBLE, INSOLUBLE, t_flag, ln, ll + USE mo_tracer, ONLY: new_tracer, new_diag_burden +#ifdef HAMMOZ + USE mo_submodel_diag, ONLY: BYTRACER, BYSPECIES +#endif + USE mo_physical_constants, ONLY: rhoh2o + USE mo_advection, ONLY: iadvec + USE mo_ham, ONLY: naerocomp, aerocomp, aerowater, & + naerosol,nham_subm,& + ndrydep, nwetdep, nsoa, & + burden_keytype, sizeclass,nclass + USE mo_ham, ONLY: nsol + USE mo_ham_m7_trac, ONLY: idt_cdnc_ham, idt_icnc_ham +#ifdef HAMMOZ + USE mo_ham_soa, ONLY: soaprop, set_soa_tracer_attr +#endif + IMPLICIT NONE + + INTEGER :: jn, jclass, igribc, idt, ierr, jspid + INTEGER :: init, iwrite, iburdenid, idrydep, iwetdep, itran, iconv, ivdiff, iint, isol, isedi + + CHARACTER(LEN=ll) :: trac_lname + CHARACTER(LEN=ln) :: trac_sname + CHARACTER(LEN=ln) :: trac_fullname + CHARACTER(LEN=ln) :: str1 + CHARACTER(LEN=ln) :: csubname + + !>>dod fix for missing gas burdens + CHARACTER(LEN=ln) :: burden_name + !<>dod SOA has unusual tracer handling, let the SOA module set the tracer attributes + IF (nsoa == 1 .AND. ( (ANY(soaprop(:)%spid_tot == jn)) .OR. & + (ANY(soaprop(:)%spid_soa == jn)) ) ) THEN + CALL set_soa_tracer_attr(jn, init, itran, iwrite, iconv, ivdiff, iint, iwetdep, idrydep) + ELSE +#endif + SELECT CASE(speclist(jn)%itrtype) + + CASE(itrprog) + init = RESTART+CONSTANT+INITIAL ! Note: File(s) containing initial values for tracers must be in MMR!!! + iwrite = ON + itran = iadvec ! ++mgs ### was ON + iconv = ON + ivdiff = ON + iint = ON + + CASE(itrdiag) + init = -1 + iwrite = ON + itran = OFF + iconv = ON + ivdiff = ON + iint = OFF + + CASE(itrpresc) + init = -1 + iwrite = OFF + itran = OFF + iconv = OFF + ivdiff = OFF + iint = OFF + idrydep = OFF + iwetdep = OFF + + END SELECT +#ifdef HAMMOZ + END IF +#endif + + csubname = '' + !>>dod fix for missing gas burdens + IF (speclist(jn)%nphase == GAS_OR_AEROSOL) THEN ! if species exists in aerosol and gas phase + csubname = 'gas' + burden_name=TRIM(trac_sname)//'_gas' + ELSE + burden_name=TRIM(trac_sname) + END IF + !<>dod SOA has unusual tracer handling, let the SOA module set the tracer attributes + !>>dod bugfix (redmine #59 and #60) + IF (nsoa == 1 .AND. (ANY(soaprop(:)%spid_soa == jspid) ) ) THEN + CALL set_soa_tracer_attr(jspid, init, itran, iwrite, iconv, ivdiff, iint, iwetdep, idrydep) + !<>gf fix for missing aerosol number burden (#218 Redmine) + IF (burden_keytype == BYTRACER) THEN ! burden per species and per mode (i.e. per tracer) + iburdenid = new_diag_burden('NUM_'//sizeclass(jn)%shortname, itype=1, lclobber=.false.) + ELSE IF (burden_keytype == BYSPECIES) THEN ! burden per species + iburdenid = -1 !SF #299 this diag make no sense. Just set iburdenid to a negative value here + ! so that no burden is computed in this case + END IF + !<>dod fix for missing aerosol water burden + IF (burden_keytype == BYTRACER) THEN ! burden per species and per mode (i.e. per tracer) + iburdenid = new_diag_burden('WAT_'//sizeclass(jn)%shortname, itype=1, lclobber=.false.) + ELSE IF (burden_keytype == BYSPECIES) THEN ! burden per species + iburdenid = new_diag_burden('WAT', itype=1, lclobber=.true.) + END IF + !< 0) THEN + iburdenid = new_diag_burden('CDNC', itype=1, lclobber=.false.) + END IF +! write(3333,*)'CDNC',idt_cdnc_ham + CALL new_tracer('CDNC', 'HAM', ierr=ierr, & + idx=idt_cdnc_ham, & + units='1 kg-1', & + table=131, & + code=131, & + nwrite=ON, & + burdenid=iburdenid, & + nconv=OFF, & + !! nconvmassfix=OFF, & + nvdiff=ON, & + nint=ON, & + longname='cloud droplet number concentration') + + IF (ierr /= OK) THEN + WRITE(message_text,'(a,i0)') 'new_tracer CDNC returned error code ',ierr + CALL message('ham_define_tracer', message_text, level=em_error) + END IF + + iburdenid = 0 + IF (burden_keytype > 0) THEN + iburdenid = new_diag_burden('ICNC', itype=1, lclobber=.false.) + END IF +! write(3333,*)'ICNC',idt_cdnc_ham + CALL new_tracer('ICNC', 'HAM', ierr=ierr, & + idx=idt_icnc_ham, & + units='1 kg-1', & + table=131, & + code=132, & + nwrite=ON, & + burdenid=iburdenid, & + nconv=OFF, & + !! nconvmassfix=OFF, & + nvdiff=ON, & + nint=ON, & + longname='ice crystal number concentration') + + IF (ierr /= OK) THEN + WRITE(message_text,'(a,i0)') 'new_tracer ICNC returned error code ',ierr + CALL message('ham_define_tracer', message_text, level=em_error) + END IF + + END SUBROUTINE ham_define_tracer + + ! -- utility function to allow definition of tracer with same name for gas and aero species + LOGICAL FUNCTION lsubname_needed(i) + + USE mo_species, ONLY: speclist, naerospec, aero_idx + + IMPLICIT NONE + + !---function interface + INTEGER, INTENT(IN) :: i + + !---function variables + INTEGER :: j + + !---executable procedure + + lsubname_needed = .FALSE. + + DO j=1,naerospec + IF (speclist(aero_idx(j))%shortname == speclist(i)%shortname) lsubname_needed = .TRUE. + END DO + + END FUNCTION lsubname_needed + + + SUBROUTINE ham_define_modes(nclass, nsol, naerospec) + + USE mo_exception, ONLY: finish + USE mo_species, ONLY: speclist + USE mo_ham_species, ONLY: id_so4, & + id_bc, & + id_oc, & + id_ss, & + id_du, & + id_wat + USE mo_ham, ONLY: aerocomp, aerowater, naerocomp, & + new_aerocomp + USE mo_ham_m7ctl, ONLY: inucs, iaits, iaccs, icoas, & + iaiti, iacci, icoai, & + iso4ns, iso4ks, iso4as, iso4cs, & + ibcks, ibcas, ibccs, ibcki, & + iocks, iocas, ioccs, iocki, & + issas, isscs, & + iduas, iducs, iduai, iduci + + + INTEGER, INTENT(in) :: nclass ! number of aerosol modes + INTEGER, INTENT(in) :: nsol ! number of soluble modes + INTEGER, INTENT(in) :: naerospec ! number of aerosol species defined + + INTEGER :: jn + + IF (ALLOCATED(aerocomp)) CALL finish('ham_define_modes', 'aerocomp already allocated!') ! ### + ALLOCATE(aerocomp(nclass * naerospec)) + ALLOCATE(aerowater(nsol)) + + !---1) Aerosol compounds in the basic model (SO4, BC, OC, SS, DU) in applicable modes------ + naerocomp = 0 + + !---sulphate in soluble modes + iso4ns = new_aerocomp(inucs, id_so4) + iso4ks = new_aerocomp(iaits, id_so4) + iso4as = new_aerocomp(iaccs, id_so4) + iso4cs = new_aerocomp(icoas, id_so4) + + IF (.NOT. ALLOCATED(speclist(id_so4)%iaerocomp)) ALLOCATE(speclist(id_so4)%iaerocomp(nclass)) + speclist(id_so4)%iaerocomp(:) = 0 + speclist(id_so4)%iaerocomp(inucs) = iso4ns ! ### replaces former im7table construct + speclist(id_so4)%iaerocomp(iaits) = iso4ks + speclist(id_so4)%iaerocomp(iaccs) = iso4as + speclist(id_so4)%iaerocomp(icoas) = iso4cs + + !---black carbon in aitken, accumulation and coarse soluble and aitken insoluble modes + ibcks = new_aerocomp(iaits, id_bc) + ibcas = new_aerocomp(iaccs, id_bc) + ibccs = new_aerocomp(icoas, id_bc) + ibcki = new_aerocomp(iaiti, id_bc) + + IF (.NOT. ALLOCATED(speclist(id_bc)%iaerocomp)) ALLOCATE(speclist(id_bc)%iaerocomp(nclass)) + speclist(id_bc)%iaerocomp(:) = 0 + speclist(id_bc)%iaerocomp(iaits) = ibcks + speclist(id_bc)%iaerocomp(iaccs) = ibcas + speclist(id_bc)%iaerocomp(icoas) = ibccs + speclist(id_bc)%iaerocomp(iaiti) = ibcki + !---organic carbon in aitken, accumulation and coarse soluble and aitken insoluble modes + iocks = new_aerocomp(iaits, id_oc) + iocas = new_aerocomp(iaccs, id_oc) + ioccs = new_aerocomp(icoas, id_oc) + iocki = new_aerocomp(iaiti, id_oc) + + IF (.NOT. ALLOCATED(speclist(id_oc)%iaerocomp)) ALLOCATE(speclist(id_oc)%iaerocomp(nclass)) + speclist(id_oc)%iaerocomp(:) = 0 + speclist(id_oc)%iaerocomp(iaits) = iocks + speclist(id_oc)%iaerocomp(iaccs) = iocas + speclist(id_oc)%iaerocomp(icoas) = ioccs + speclist(id_oc)%iaerocomp(iaiti) = iocki + + !---sea salt in accumulation and coarse soluble modes + issas = new_aerocomp(iaccs, id_ss) + isscs = new_aerocomp(icoas, id_ss) + + IF (.NOT. ALLOCATED(speclist(id_ss)%iaerocomp)) ALLOCATE(speclist(id_ss)%iaerocomp(nclass)) + speclist(id_ss)%iaerocomp(:) = 0 + speclist(id_ss)%iaerocomp(iaccs) = issas + speclist(id_ss)%iaerocomp(icoas) = isscs + + !---dust in accumulation and coarse modes + iduas = new_aerocomp(iaccs, id_du) + iducs = new_aerocomp(icoas, id_du) + iduai = new_aerocomp(iacci, id_du) + iduci = new_aerocomp(icoai, id_du) + + IF (.NOT. ALLOCATED(speclist(id_du)%iaerocomp)) ALLOCATE(speclist(id_du)%iaerocomp(nclass)) + speclist(id_du)%iaerocomp(:) = 0 + speclist(id_du)%iaerocomp(iaccs) = iduas + speclist(id_du)%iaerocomp(icoas) = iducs + speclist(id_du)%iaerocomp(iacci) = iduai + speclist(id_du)%iaerocomp(icoai) = iduci + + !---2) Aerosol water ---------------------------------------------------------------------- +!ham_ps: introduce aerosol water as species, but not component into aerocomp (no new_aerocomp call) +! (this will need revisions) + IF (.NOT. ALLOCATED(speclist(id_wat)%iaerocomp)) ALLOCATE(speclist(id_wat)%iaerocomp(nclass)) + speclist(id_wat)%iaerocomp(:) = -1 +!!$ speclist(id_wat)%iaerocomp(inucs) = 0 +!!$ speclist(id_wat)%iaerocomp(iaits) = 0 +!!$ speclist(id_wat)%iaerocomp(iaccs) = 0 +!!$ speclist(id_wat)%iaerocomp(icoas) = 0 + DO jn = 1,nsol + aerowater(jn)%iclass = jn + aerowater(jn)%species => speclist(id_wat) + aerowater(jn)%spid = id_wat + ! note: %aero_idx and %idt are left undefined and should not be used. + END DO + + END SUBROUTINE ham_define_modes +#ifdef SALSA + SUBROUTINE ham_define_bins(nclass, nsol, naerospec) + ! --A. Laakso (FMI) 2013-05 + + USE mo_exception, ONLY: finish + USE mo_species, ONLY: speclist + USE mo_ham_species, ONLY: id_so4, & + id_bc, & + id_oc, & + id_ss, & + id_du, & + id_wat + USE mo_ham, ONLY: aerocomp, aerowater, naerocomp, & + new_aerocomp + USE mo_ham_salsactl, ONLY: iso4b, ibcb,iocb,issb, idub, & + in1a, in2a, in2b, & + fn1a, fn2a, fn2b +#ifdef HAMMOZ + ! >> thk: VBS + USE mo_ham, ONLY:& + sizeclass, & + nsoa + + USE mo_ham_vbsctl, ONLY:& + vbs_ngroup, & + vbs_nvocs, & + vbs_voc_prec, & + vbs_set, & + nclass_vbs, & + laqsoa, & + aqsoa_ngroup, & + aqsoa_set, & + nclass_aqsoa + ! << thk +#endif + INTEGER, INTENT(in) :: nclass ! number of aerosol bins + INTEGER, INTENT(in) :: nsol ! number of soluble bins + INTEGER, INTENT(in) :: naerospec ! number of aerosol species defined + + INTEGER :: jn,i + + ! << thk: VBS + INTEGER :: jv, jg, jg2, jc, spid + ! >> thk + + iso4b(:) = 0 + ibcb(:) = 0 + iocb(:) = 0 + issb(:) = 0 + idub(:) = 0 + + IF (ALLOCATED(aerocomp)) CALL finish('ham_define_bins', 'aerocomp already allocated!') ! ### + ALLOCATE(aerocomp(nclass * naerospec)) + ALLOCATE(aerowater(nsol)) + + !---1) Aerosol compounds in the basic model (SO4, BC, OC, SS, DU) in applicable modes------ + naerocomp = 0 + + !---sulphate +!! write(0,*) '### new_ham_aerocomp: id_so4 = ',id_so4 + DO i = in1a,fn2b + iso4b(i) = new_aerocomp(i, id_so4) + END DO + + IF (.NOT. ALLOCATED(speclist(id_so4)%iaerocomp)) ALLOCATE(speclist(id_so4)%iaerocomp(nclass)) + speclist(id_so4)%iaerocomp(:) = 0 + + DO i = in1a,fn2b + speclist(id_so4)%iaerocomp(i) = iso4b(i) + END DO + + !--oc + DO i = in1a,fn2b + iocb(i) = new_aerocomp(i, id_oc) + END DO + IF (.NOT. ALLOCATED(speclist(id_oc)%iaerocomp)) ALLOCATE(speclist(id_oc)%iaerocomp(nclass)) + + speclist(id_oc)%iaerocomp(:) = 0 + DO i = in1a,fn2b + + speclist(id_oc)%iaerocomp(i) = iocb(i) + END DO + + !bc + DO i = in2a,fn2b + ibcb(i) = new_aerocomp(i, id_bc) + END DO + IF (.NOT. ALLOCATED(speclist(id_bc)%iaerocomp)) ALLOCATE(speclist(id_bc)%iaerocomp(nclass)) + speclist(id_bc)%iaerocomp(:) = 0 + DO i = in2a,fn2b + speclist(id_bc)%iaerocomp(i) = ibcb(i) + END DO + + + + !dust + DO i = in2a,fn2b + idub(i) = new_aerocomp(i, id_du) + END DO + + IF (.NOT. ALLOCATED(speclist(id_du)%iaerocomp)) ALLOCATE(speclist(id_du)%iaerocomp(nclass)) + speclist(id_du)%iaerocomp(:) = 0 + + DO i = in2a,fn2b + speclist(id_du)%iaerocomp(i) = idub(i) + END DO + + !seasalt, only soluble + DO i = in2a,fn2a + issb(i) = new_aerocomp(i, id_ss) + END DO + IF (.NOT. ALLOCATED(speclist(id_ss)%iaerocomp)) ALLOCATE(speclist(id_ss)%iaerocomp(nclass)) + speclist(id_ss)%iaerocomp(:) = 0 + DO i = in2a,fn2a + speclist(id_ss)%iaerocomp(i) = issb(i) + END DO +#ifdef HAMMOZ + ! >> thk: VBS + IF (nsoa == 2) THEN + ! creating the per-class aerosol tracers + DO jg = 1,vbs_ngroup + spid = vbs_set(jg)%spid + + ! allocating memory for aerosol tracer indices in vbs_set + IF (.NOT. ALLOCATED(vbs_set(jg)%idx)) THEN + ALLOCATE(vbs_set(jg)%idx(nclass)) + END IF + vbs_set(jg)%idx(:) = 0 + + IF (vbs_set(jg)%lcreateaero) THEN + + ! allocating memory for aerosol tracer indices in speclist + IF (.NOT. ALLOCATED(speclist(spid)%iaerocomp)) THEN + ALLOCATE(speclist(spid)%iaerocomp(nclass)) + END IF + speclist(spid)%iaerocomp(:) = 0 + + ! creating tracers and saving id's + DO i = 1, nclass + IF (sizeclass(i)%lsoainclass) THEN + vbs_set(jg)%idx(i) = new_aerocomp(i, spid) + speclist(spid)%iaerocomp(i) = vbs_set(jg)%idx(i) + END IF + END DO + ELSE + + ! getting the tracer ids from the given spid: + DO i = 1, nclass + IF (sizeclass(i)%lsoainclass) THEN + vbs_set(jg)%idx(i) = speclist(vbs_set(jg)%spid_aero)%iaerocomp(i) + END IF + END DO + END IF + END DO + ! counting all modes/bins that include VBS soa: + nclass_vbs = 0 + DO jc = 1,nclass + IF (sizeclass(jc)%lsoainclass) nclass_vbs = nclass_vbs+1 + END DO + + IF (laqsoa) THEN + ! creating the per-class aerosol tracers + DO jg2 = 1,aqsoa_ngroup + spid = aqsoa_set(jg2)%spid + + + ! allocating memory for aerosol tracer indices in aqsoa_set + IF (.NOT. ALLOCATED(aqsoa_set(jg2)%idx)) THEN + ALLOCATE(aqsoa_set(jg2)%idx(nclass)) + END IF + aqsoa_set(jg2)%idx(:) = 0 + + IF (aqsoa_set(jg2)%lcreateaero) THEN + + ! allocating memory for aerosol tracer indices in speclist + IF (.NOT. ALLOCATED(speclist(spid)%iaerocomp)) THEN + ALLOCATE(speclist(spid)%iaerocomp(nclass)) + END IF + speclist(spid)%iaerocomp(:) = 0 + + ! creating tracers and saving id's + DO i = 1, nclass + IF (sizeclass(i)%lsoainclass) THEN + aqsoa_set(jg2)%idx(i) = new_aerocomp(i, spid) + speclist(spid)%iaerocomp(i) = aqsoa_set(jg2)%idx(i) + END IF + END DO + ELSE + + ! getting the tracer ids from the given spid: + DO i = 1, nclass + IF (sizeclass(i)%lsoainclass) THEN + aqsoa_set(jg2)%idx(i) = speclist(aqsoa_set(jg2)%spid_aero)%iaerocomp(i) + END IF + END DO + END IF + END DO + ! counting all modes/bins that include wet soa: + nclass_aqsoa = 0 + DO jc = 1,nclass + IF (sizeclass(jc)%lsoainclass) nclass_aqsoa = nclass_aqsoa+1 + END DO + + END IF ! laqsoa + END IF ! nsoa == 2 + ! << thk +#endif + !---2) Aerosol water ---------------------------------------------------------------------- +!ham_ps: introduce aerosol water as species, but not component into aerocomp (no new_aerocomp call) +! (this will need revisions) no sepa kiva + IF (.NOT. ALLOCATED(speclist(id_wat)%iaerocomp)) ALLOCATE(speclist(id_wat)%iaerocomp(nclass)) + speclist(id_wat)%iaerocomp(:) = -1 + DO jn = 1,nsol + aerowater(jn)%iclass = jn + aerowater(jn)%species => speclist(id_wat) + aerowater(jn)%spid = id_wat + ! note: %aero_idx and %idt are left undefined and should not be used. + END DO + + END SUBROUTINE ham_define_bins +#endif + + SUBROUTINE ham_initialize + + ! Purpose: + ! --------- + ! Initializes constants and parameters used in the HAM aerosol model. + ! Performs consistency checks. + ! + ! Author: + ! --------- + ! Philip Stier, MPI 03/2003 + ! Martin Schultz, FZJ 09/2009 - renamed to ham_ + ! - cleanup + ! + ! Interface: + ! --------- + ! *ham_initialize* is called from *init_subm* in mo_submodel_interface + ! needs to be called after initialization of the + ! submodel as it may make use of parameters in mo_ham_m7ctl, + ! + + USE mo_exception, ONLY: message, em_error + USE mo_ham, ONLY: naerorad,nclass, nham_subm, & + HAM_BULK, & + HAM_M7, & + HAM_SALSA + USE mo_ham_m7ctl, ONLY: nwater +!#ifdef HAMMOZ + USE mo_ham_rad, ONLY: ham_rad_initialize +!#endif + USE mo_ham_kappa, ONLY: start_kappa + USE mo_ham_m7_trac, ONLY: ham_M7_set_idt +#ifdef SALSA + USE mo_ham_salsa_trac, ONLY: ham_salsa_set_idt +#endif + USE mo_activ, ONLY: nfrzmod + !>>dod (redmine #44) import of seasalt emission schemes from HAM2 +#ifdef HAMMOZ + USE mo_ham_m7_emi_seasalt, ONLY: start_emi_seasalt +#endif + !<>SF #390 (for security) + USE mo_param_switches, ONLY: lcdnc_progn + USE mo_ham, ONLY: nwetdep +!<0) CALL ham_rad_initialize(nclass) +!#endif + IF (nwater == 1 .AND. nham_subm == HAM_M7) CALL start_kappa + !>>dod (redmine #44) import of seasalt emission schemes from HAM2 +#ifdef HAMMOZ + CALL start_emi_seasalt + + !<>SF security + IF (nfrzmod /= 1) THEN + call message('ham_initialize','nfrzmod must be equal to 1!',level=em_error) + ENDIF +!<>SF #390 + IF (.NOT. lcdnc_progn .AND. nwetdep == 3) THEN + call message('ham_initialize','nwetdep = 3 is not possible when lcdnc_progn is false!',level=em_error) + ENDIF +!<>dod<< +!!mgs!! CALL construct_stream_input + IF (naerorad>0) CALL new_stream_ham_rad !Philip +#ifdef HAMMOZ + IF (lgcr) CALL gcr_initialize !Jan + IF (nham_subm == HAM_M7) THEN + IF (nsnucl+nonucl.gt.0) CALL ham_nucl_initialize !Jan + IF (lnucl_stat) CALL ham_nucl_diag_initialize !Jan + ENDIF +#endif + IF (nsoa == 1) CALL construct_soa_streams !Declan + + END SUBROUTINE ham_init_memory + + + ! --- release of memory + + SUBROUTINE ham_free_memory + + USE mo_ham, ONLY: naerorad, nham_subm, HAM_M7, lgcr + USE mo_ham_rad, ONLY: ham_rad_mem_cleanup + USE mo_ham_dust, ONLY: bgc_dust_cleanup + USE mo_ham_m7ctl, ONLY: nsnucl, nonucl, lnucl_stat, nwater + USE mo_ham_gcrion, ONLY: gcr_cleanup + USE mo_ham_m7_nucl, ONLY: ham_nucl_cleanup + USE mo_ham_m7_nucl_diag, ONLY: ham_nucl_diag_cleanup + USE mo_ham_kappa, ONLY: term_kappa + + IMPLICIT NONE + + IF (nham_subm == HAM_M7) THEN + IF (nwater == 1) CALL term_kappa + IF (nsnucl+nonucl.gt.0) CALL ham_nucl_cleanup + IF (lnucl_stat) CALL ham_nucl_diag_cleanup + ENDIF + IF (naerorad>0) CALL ham_rad_mem_cleanup + CALL bgc_dust_cleanup + IF (lgcr) CALL gcr_cleanup + + END SUBROUTINE ham_free_memory +#endif +END MODULE mo_ham_init + + + + + + diff --git a/ifs-source/arpifs/phys_ec/mo_ham_kappa.F90 b/ifs-source/arpifs/phys_ec/mo_ham_kappa.F90 new file mode 100644 index 00000000..85ae1e6a --- /dev/null +++ b/ifs-source/arpifs/phys_ec/mo_ham_kappa.F90 @@ -0,0 +1,403 @@ +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! \filename +!! mo_ham_kappa.f90 +!! +!! \brief +!! Defines data for ham_kappa routine in mo_m7 +!! +!! \author Declan O'Donnell (MPI-M) +!! +!! \responsible_coder +!! Declan O'Donnell, declan.odonnell@fmi.fi +!! +!! \revision_history +!! -# Declan O'Donnell (MPI-Met) - original code (2007) +!! -# Declan O'Donnell (FMI) - lookup table version 2 (2014) +!! +!! \limitations +!! None +!! +!! \details +!! ham_kappa implements the parameterisation of the hygroscopic +!! growth of aerosols, as measured by the growth factor (gf), as a +!! function of the hygroscopicity parameter kappa and +!! the ambient temperature and relative humidity. The relation is: +!! [ A ] (gf**3 -1) +!! RH*exp[- ----- ] = ---------------- +!! [ Rd*gf ] gf**3 - (1-kappa) +!! +!! (eqn 11 of M.D. Petters and S.M. Kreidenweis, ACP 7, 2007, see +!! bibliographic references below) +!! +!! The above-quoted equation from the cited Petters & Kreidenweis paper expresses +!! the hygroscopic growth factor (gf) as a function of aerosol dry radius (Rd), +!! temperature (T), relative humidity (rh) and a substance property denoted kappa +!! that encapsulates hygroscopic properties of that substance. This transcendental +!! equation is solved offline for various Rd, T, rh and kappa of atmospheric +!! relevance and the results stored in a lookup table. +!! The m7 subroutine ham_kappa uses the ambient T and rh, uses the mode count median +!! dry radius and the volume-weighted average kappa to find the entry point into +!! the GF lookup table. Using the growth factor the wet median radius and water +!! uptake of the mode are calculated. +!! +!! This module contains relevant constants and a routine to read the lookup table +!! +!! NEW FOR VERSION 2 LOOKUP TABLE +!! ============================== +!! In version 1, the relative humidity axis consists of evenly-spaced increments starting +!! at 0.15 and ending at 0.95. This has several problems. Firstly, the maximum value is +!! too low which causes a significant underestimate of hygroscopic growth at high RH. +!! Secondly, the growth factor (GF) is highly sensitive to RH at high RH +!! values, but not at low RH. This means that the coarse, even spacing of the RH axis values +!! results in inaccurate GF estimates at high RH. Thirdly, GF is very low at low RH and +!! in practice we can neglect it below rh of 0.3 (or perhaps 0.4). +!! Version 2 of the lookup table implements a RH axis that has uneven value spacing, +!! monotonically decreasing from the minimum RH (now 0.3) to the maximum (now 0.995). +!! +!! The nth RH axis value is now given by +!! RH(n) = RH(n-1) + deltaRH*c**(n-1), n=1,2,3... +!! where c is a constant (c < 1) and deltaRH is the initial spacing factor (i.e. RH(1)-RH(0)). +!! c is chosen to be 0.96, RH(0) = 0.30 and deltaRH = 0.03 for practical reasons. +!! c and deltaRH are obtained from the lookup table by: +!! +!! deltaRH = RH(1) - RH(0) (actually RH(2)-RH(1) since fortran does not use zero indexing) +!! c = (RH(2) - RH(1))/deltaRH (again add 1 to index for fortran implementation) +!! +!! Other changes: +!! The water uptake is almost totally insensitive to the temperature value (in the kappa-koehler +!! equation considered as an independent variable from RH). Accordingly, the temperature axis has been +!! reduced in range and more coarsely spaced. Taking advantage of the resulting size (=memory) +!! saving, the dry radius axis is more finely spaced. +!! The kappa axis is slightly reduced by removing values above the range in the model (max. now 1.12). +!! Lastly, version number is included in the file as a string "x.y". x is intended to denote a major +!! revision (which I define as any revision that requires an update to the HAMMOZ fortran code) +!! and y is a minor revision (anything else). Note this means that minor revisions in the file can +!! result in major changes in model results and vice-versa. +!! +!! NB This implementation is compatible with both versions 1 and 2 of the lookup table. The same +!! file name is expected (lut_kappa.nc). However, version 1 is DEPRECATED and should be phased out. +!! +!! \bibliographic_references +!! M.D. Petters and S.M. Kreidenweis, A single parameter representation of hygroscopic +!! growth and cloud condensation nucleus activity, ACP 7, 1961-1971, 2007 +!! +!! \belongs_to +!! HAMMOZ +!! +!! SPDX-License-Identifier: BSD-3-Clause +!! Copyright (c) 2021 hammoz + +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +MODULE mo_ham_kappa + + !--- inherited types, functions and data + USE mo_kind, ONLY: dp + +!#ifdef _OPENMP +! use omp_lib +!#endif + IMPLICIT NONE + + !--- public member functions + PUBLIC :: start_kappa, term_kappa + + !--- module parameters + !>>dod redmine #260 ... also removed unused parameter sigma_sa + INTEGER, PUBLIC :: lut_kappa_version ! Lookup table version + !<>dod redmine #260 + ! For non-linear spacing of the RH axis in version 2: initial rh, initial step size + ! (plus its reciprocal) and step compression factor (plus its log) + REAL(dp), PUBLIC :: rh_init_step + REAL(dp), PUBLIC :: inv_rh_init_step + REAL(dp), PUBLIC :: rh_step_compress + REAL(dp), PUBLIC :: log_rh_step_compress + !<>dod redmine #260 + !--- read file version (not included in version 1, so default to that version if + ! the version attribute is missing) + ! ECHAM's implementation is poor: instead of writing "not available" in the attribute + ! value string when the requested attribute is not found, it overwrites the + ! attribute name + attrname = cattr_version + CALL IO_GET_ATT_TEXT(zncid, nf_global, attrname, versval) + + IF (TRIM(attrname) == "not available") THEN + lut_kappa_version = 1 + versval="1.0" + CALL message('mo_ham_kappa.start_kappa', & + 'Deprecated lookup table version! Consider updating to the latest version', level=em_warn) + ELSE + versmaj = versval(1:1) + IF (versmaj == "2") THEN + lut_kappa_version = 2 + ELSE + CALL finish('mo_ham_kappa.start_kappa', & + 'Lookup table '//TRIM(lut_fn)//' version '//versval//' not supported') + END IF + END IF + !<>dod redmine #260 + CALL p_bcast(lut_kappa_version, p_io) + !<>dod redmine #260 + CALL p_bcast(rh_init_step, p_io) + CALL p_bcast(inv_rh_init_step, p_io) + CALL p_bcast(rh_step_compress, p_io) + CALL p_bcast(log_rh_step_compress, p_io) + !< +!! \filename +!! mo_ham_m7.f90 +!! +!! \brief +!! Module to provide interface to the M7 aerosol microphysics scheme +!! +!! \author Martin G. Schultz (FZ Juelich) +!! +!! \responsible_coder +!! Martin G. Schultz, m.schultz@fz-juelich.de +!! +!! \revision_history +!! -# The original code is from J. Feichter, J. Wilson and E. Vignatti, JRC Ispra +!! and was adapted for ECHAM by P. Stier, Oxford. Other contributions include +!! D. O'Donnell, K. Zhang and others +!! -# M.G. Schultz (FZ Juelich) - new code structure for integration into echam6-hammoz (2009-09-24) +!! -# T. Bergman (FMI) - nmod->nclass to facilitate new aerosol models (2013-02-05) +!! -# H. Kokkola (FMI) - moved and renamed m7_interface into a general ham_subm_interface routine +!! +!! \limitations +!! None +!! +!! \details +!! This module contains the m7_interface routine and all individual routines +!! which make up M7. Parameter lists and flags are defined in mo_ham_m7ctl. +!! This module contains the following subroutines which used to be individual files. +!! m7_cumulative_normal (renamed from m7_cumnor) +!! m7 +!! m7_averageproperties +!! m7_kappa +!! m7_equiz +!! m7_equimix +!! m7_equil +!! m7_h2so4_cs +!! m7_prod_cond +!! m7_nuck +!! m7_dnum +!! m7_dconc +!! m7_dconc_soa +!! m7_coaset +!! m7_concoag +!! m7_delcoa +!! +!! \bibliographic_references +!! - Vignati E., Wilson J. and Stier P., M7: a size resolved aerosol mixture module +!! for the use in global aerosol models, JGR 109, D22 202, doi:10.1029/2003JD004 485, 2004. +!! - Stier P. et al, The aerosol-climate model ECHAM5-HAM, ACP, 5, 1125–1156, 2005 +!! +!! \belongs_to +!! HAMMOZ +!! +!! SPDX-License-Identifier: BSD-3-Clause +!! Copyright (c) 2021 hammoz + +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +MODULE mo_ham_m7 + +USE mo_kind, ONLY: dp + +IMPLICIT NONE + +PRIVATE + +PUBLIC :: m7, m7_cumulative_normal + +!REAL(dp), PUBLIC, ALLOCATABLE :: rwet_m7(:,:,:), rdry_m7(:,:,:) +!REAL(dp), PUBLIC, ALLOCATABLE :: densaer_m7(:,:,:), aerwat_m7(:,:,:) + +CONTAINS + + +! --------------------------------------------------------------------------- + +SUBROUTINE m7_cumulative_normal ( arg, presult, ccum ) + ! + !******************************************************************************* + ! + !! CUMNOR computes the cumulative normal distribution. + ! + ! + ! the integral from -infinity to x of + ! (1/sqrt(2*pi)) exp(-u*u/2) du + ! + ! Author: + ! ------- + ! Original source: + ! + ! W. J. Cody Mathematics and Computer Science Division + ! Argonne National Laboratory + ! Argonne, IL 60439 + ! + ! DCDFLIB is attributed to Barry Brown, James Lovato, and Kathy Russell + ! bwb@odin.mda.uth.tmc.edu. + ! + ! Adopted to ECHAM/M7: + ! + ! Philip Stier (MPI-MET) 2001 + ! + ! + ! Reference: + ! ---------- + ! + ! W D Cody, + ! "ALGORITHM 715: SPECFUN - A Portable FORTRAN Package of Special + ! Function Routines and Test Drivers" + ! ACM Transactions on Mathematical Software, + ! Volume 19, 1993, pages 22-32. + ! + ! Parameters: + ! + ! ARG --> Upper limit of integration. + ! X is double precision + ! + ! RESULT <-- Cumulative normal distribution. + ! RESULT is double precision + ! + ! CCUM <-- Complement of Cumulative normal distribution. + ! CCUM is double precision + ! + ! + ! Original Comments: + ! + ! + ! This function evaluates the normal distribution function: + ! + ! / x + ! 1 | -t*t/2 + ! P(x) = ----------- | e dt + ! sqrt(2 pi) | + ! /-oo + ! + ! The main computation evaluates near-minimax approximations + ! derived from those in "Rational Chebyshev approximations for + ! the error function" by W. J. Cody, Math. Comp., 1969, 631-637. + ! This transportable program uses rational functions that + ! theoretically approximate the normal distribution function to + ! at least 18 significant decimal digits. The accuracy achieved + ! depends on the arithmetic system, the compiler, the intrinsic + ! functions, and proper selection of the machine-dependent + ! constants. + ! + ! Explanation of machine-dependent constants. + ! + ! MIN = smallest machine representable number. + ! + ! EPS = argument below which anorm(x) may be represented by + ! 0.5 and above which x*x will not underflow. + ! A conservative value is the largest machine number X + ! such that 1.0 + X = 1.0 to machine precision. + ! + ! Error returns + ! + ! The program returns ANORM = 0 for ARG .LE. XLOW. + ! + ! Author: + ! + ! W. J. Cody + ! Mathematics and Computer Science Division + ! Argonne National Laboratory + ! Argonne, IL 60439 + ! + ! Latest modification: March 15, 1992 + ! + USE mo_kind, ONLY: dp + ! + IMPLICIT NONE + ! + REAL(dp), PARAMETER, DIMENSION ( 5 ) :: a = (/ & + 2.2352520354606839287e00_dp, & + 1.6102823106855587881e02_dp, & + 1.0676894854603709582e03_dp, & + 1.8154981253343561249e04_dp, & + 6.5682337918207449113e-2_dp /) + REAL(dp) :: arg + REAL(dp), PARAMETER, DIMENSION ( 4 ) :: b = (/ & + 4.7202581904688241870e01_dp, & + 9.7609855173777669322e02_dp, & + 1.0260932208618978205e04_dp, & + 4.5507789335026729956e04_dp /) + REAL(dp), PARAMETER, DIMENSION ( 9 ) :: c = (/ & + 3.9894151208813466764e-1_dp, & + 8.8831497943883759412e00_dp, & + 9.3506656132177855979e01_dp, & + 5.9727027639480026226e02_dp, & + 2.4945375852903726711e03_dp, & + 6.8481904505362823326e03_dp, & + 1.1602651437647350124e04_dp, & + 9.8427148383839780218e03_dp, & + 1.0765576773720192317e-8_dp /) + REAL(dp) :: ccum + REAL(dp), PARAMETER, DIMENSION ( 8 ) :: d = (/ & + 2.2266688044328115691e01_dp, & + 2.3538790178262499861e02_dp, & + 1.5193775994075548050e03_dp, & + 6.4855582982667607550e03_dp, & + 1.8615571640885098091e04_dp, & + 3.4900952721145977266e04_dp, & + 3.8912003286093271411e04_dp, & + 1.9685429676859990727e04_dp /) + REAL(dp) :: del +!@@@ REAL(dp) :: dpmpar + REAL(dp) :: eps + INTEGER :: i + REAL(dp) :: zmin + REAL(dp), PARAMETER, DIMENSION ( 6 ) :: p = (/ & + 2.1589853405795699e-1_dp, & + 1.274011611602473639e-1_dp, & + 2.2235277870649807e-2_dp, & + 1.421619193227893466e-3_dp, & + 2.9112874951168792e-5_dp, & + 2.307344176494017303e-2_dp /) + REAL(dp), PARAMETER, DIMENSION ( 5 ) :: q = (/ & + 1.28426009614491121e00_dp, & + 4.68238212480865118e-1_dp, & + 6.59881378689285515e-2_dp, & + 3.78239633202758244e-3_dp, & + 7.29751555083966205e-5_dp /) + REAL(dp) :: presult + REAL(dp), PARAMETER :: root32 = 5.656854248_dp + REAL(dp), PARAMETER :: sixten = 16.0_dp + REAL(dp) :: temp + REAL(dp), PARAMETER :: sqrpi = 3.9894228040143267794e-1_dp + REAL(dp), PARAMETER :: thrsh = 0.66291_dp + REAL(dp) :: x + REAL(dp) :: xden + REAL(dp) :: xnum + REAL(dp) :: y + REAL(dp) :: xsq + + + !REAL(dp), ALLOCATABLE :: rwet_m7(:,:,:), rdry_m7(:,:,:) + !REAL(dp), ALLOCATABLE :: densaer_m7(:,:,:), aerwat_m7(:,:,:) + ! + ! Machine dependent constants + ! + eps = EPSILON ( 1.0_dp ) * 0.5_dp + ! + !@@@ Simplified calculation of the smallest machine representable number + ! (Higher accuracy than needed!) + ! + !@@@ min = dpmpar(2) + + zmin = EPSILON ( 1.0_dp ) + + x = arg + y = ABS ( x ) + + IF ( y <= thrsh ) THEN + ! + ! Evaluate anorm for |X| <= 0.66291 + ! + IF ( y > eps ) THEN + xsq = x * x + ELSE + xsq = 0.0_dp + END IF + + xnum = a(5) * xsq + xden = xsq + DO i = 1, 3 + xnum = ( xnum + a(i) ) * xsq + xden = ( xden + b(i) ) * xsq + END DO + presult = x * ( xnum + a(4) ) / ( xden + b(4) ) + temp = presult + presult = 0.5_dp + temp + ccum = 0.5_dp - temp + ! + ! Evaluate ANORM for 0.66291 <= |X| <= sqrt(32) + ! + ELSE IF ( y <= root32 ) THEN + + xnum = c(9) * y + xden = y +!DIR$ UNROLL +!CDIR UNROLL=7 + DO i = 1, 7 + xnum = ( xnum + c(i) ) * y + xden = ( xden + d(i) ) * y + END DO + presult = ( xnum + c(8) ) / ( xden + d(8) ) + xsq = AINT ( y * sixten ) / sixten + del = ( y - xsq ) * ( y + xsq ) + presult = EXP(-xsq*xsq*0.5_dp) * EXP(-del*0.5_dp) * presult + ccum = 1.0_dp - presult + + IF ( x > 0.0_dp ) THEN + temp = presult + presult = ccum + ccum = temp + END IF + ! + ! Evaluate anorm for |X| > sqrt(32). + ! + ELSE + + presult = 0.0_dp + xsq = 1.0_dp / ( x * x ) + xnum = p(6) * xsq + xden = xsq + DO i = 1, 4 + xnum = ( xnum + p(i) ) * xsq + xden = ( xden + q(i) ) * xsq + END DO + + presult = xsq * ( xnum + p(5) ) / ( xden + q(5) ) + presult = ( sqrpi - presult ) / y + xsq = AINT ( x * sixten ) / sixten + del = ( x - xsq ) * ( x + xsq ) + presult = EXP ( - xsq * xsq * 0.5_dp ) * EXP ( - del * 0.5_dp ) * presult + ccum = 1.0_dp - presult + + IF ( x > 0.0_dp ) THEN + temp = presult + presult = ccum + ccum = temp + END IF + + END IF + + IF ( presult < zmin ) THEN + presult = 0.0_dp + END IF + + IF ( ccum < zmin ) THEN + ccum = 0.0_dp + END IF + +END SUBROUTINE m7_cumulative_normal + +! --------------------------------------------------------------------------- + +SUBROUTINE m7(kproma, kbdim, klev, krow, & + papp1, ptp1, prhp1, & + !>>dod soa + pgas, & + !<>dod soa + USE mo_ham, ONLY: nsoa, naerocomp, nclass, nsol, lscond, lscoag + !<>dod timers + USE mo_control, ONLY: ltimer + USE mo_hammoz_timer, ONLY: timer_start, timer_stop, & + timer_ham_m7_avg, timer_ham_m7_hygro, & + timer_ham_m7_cs, timer_ham_m7_cond, & + timer_ham_m7_nucl, & + timer_ham_m7_dnum, timer_ham_m7_redistr + !<>dod soa + REAL(dp) :: pgas(kbdim,klev,subm_ngasspec) ! gas phase tracers + !<>dod timers + IF (ltimer) CALL timer_start(timer_ham_m7_avg) + !<>dod timers + IF (ltimer) THEN + CALL timer_stop(timer_ham_m7_avg) + CALL timer_start(timer_ham_m7_hygro) + END IF + !<>dod soa + IF (nsoa == 0) & + !<>dod timers + IF (ltimer) THEN + CALL timer_stop(timer_ham_m7_hygro) + CALL timer_start(timer_ham_m7_cs) + END IF + !<>dod timers + IF (ltimer) CALL timer_stop(timer_ham_m7_cs) + !<>dod timers + IF (ltimer) CALL timer_start(timer_ham_m7_cond) + !<>dod timers + IF (ltimer) THEN + CALL timer_stop(timer_ham_m7_cond) + CALL timer_start(timer_ham_m7_nucl) + END IF + !<>dod timers + IF (ltimer) THEN + CALL timer_stop(timer_ham_m7_nucl) + CALL timer_start(timer_ham_m7_dnum) + END IF + !<>dod soa: added zttn + zso4_5, zso4_6, zso4_7, zanew, za4delt, zttn) + !<>dod timers + IF (ltimer) THEN + CALL timer_stop(timer_ham_m7_dnum) + CALL timer_start(timer_ham_m7_avg) + END IF + !<>dod timers + IF (ltimer) THEN + CALL timer_stop(timer_ham_m7_avg) + CALL timer_start(timer_ham_m7_hygro) + END IF + !<>dod soa + IF (nsoa == 0) & + !<>dod timers + IF (ltimer) THEN + CALL timer_stop(timer_ham_m7_hygro) + CALL timer_start(timer_ham_m7_redistr) + END IF + !<>dod merged HAM R2 versions of m7_dconc + IF (lscond .OR. lscoag .OR. nsoa == 1) THEN + + CALL m7_dconc(kproma, kbdim, klev, krow, paerml, paernl, pm6dry) + + END IF + do jclass=1,nclass + zout3(1:kproma,KLEV,nclass+naerocomp+jclass)=paernl(1:kproma,klev,jclass) + end do + do jn=1,naerocomp + zout3(1:kproma,KLEV,nclass+naerocomp+nclass+jn)=paerml(1:kproma,klev,jn) + end do +!zout3(1:kproma,KLEV,14)=pm6dry(1:kproma,klev,iaccs) +! zout3(1:kproma,KLEV,3)=paernl(1:kproma,klev,iaccs) + !<>dod timers + IF (ltimer) THEN + CALL timer_stop(timer_ham_m7_redistr) + CALL timer_start(timer_ham_m7_avg) + END IF + !<>dod timers + IF (ltimer) THEN + CALL timer_stop(timer_ham_m7_avg) + CALL timer_start(timer_ham_m7_hygro) + END IF + !<>dod soa + IF (nsoa == 0) & + !<HK + !IF (.NOT. ALLOCATED(rwet_m7)) ALLOCATE(rwet_m7(kbdim,klev,nclass)) + !IF (.NOT. ALLOCATED(rdry_m7)) ALLOCATE(rdry_m7(kbdim,klev,nsol)) + !IF (.NOT. ALLOCATED(densaer_m7)) ALLOCATE(densaer_m7(kbdim,klev,nclass)) + !IF (.NOT. ALLOCATED(aerwat_m7)) ALLOCATE(aerwat_m7(kbdim,klev,nclass)) + + !!!rwet_m7(1:kproma,:,:) = pm6rp(1:kproma,:,:)/100._dp + !!!rdry_m7(1:kproma,:,:) = pm6dry(1:kproma,:,:)/100._dp + !!!densaer_m7(1:kproma,:,:) = prhop(1:kproma,:,:)*1000._dp !eehol: g/cm3 to kg/m3 + !!!aerwat_m7(1:kproma,:,:) = pww(1:kproma,:,:) + !<--HK +#ifdef HAMMOZ + !>>dod timers + IF (ltimer) CALL timer_stop(timer_ham_m7_hygro) + !<>dod soa + pgas(1:kproma,:,isubm_so4g) = pso4g(1:kproma,:) + !<>dod + REAL(dp), PARAMETER :: fac_ug = 1.E-12_dp ! conversion of ug m-3 -> g cm-3 + REAL(dp), PARAMETER :: fac_molec = 1._dp ! sulphate: no unit conversion + REAL(dp), PARAMETER :: z4piover3 = 4._dp*pi/3._dp + !<>SF #458 (replacing WHERE statements) + zaltern_val = MERGE(critn, 0._dp, (jn == iso4ns)) + + ll1(1:kproma,:) = (paernl(1:kproma,:,jclass) > cmin_aernl) & + .AND. (paerml(1:kproma,:,jn) > cmin_aerml) + + ztmp1(1:kproma,:) = MERGE(paernl(1:kproma,:,jclass), 1._dp, ll1(1:kproma,:)) !SF 1. is a dummy val. + + pttn(1:kproma,:,jn) = MERGE( & + zunitfac*paerml(1:kproma,:,jn)/ztmp1(1:kproma,:), & + zaltern_val, & + ll1(1:kproma,:)) + !<>SF #458 (replacing WHERE statements) + ll1(1:kproma,:) = (paernl(1:kproma,:,jclass) > cmin_aernl) & + .AND. (zinsvol(1:kproma,:,jclass) > cminvol) + + ztmp1(1:kproma,:) = MERGE(zinsvol(1:kproma,:,jclass), 1._dp, ll1(1:kproma,:)) !SF 1. is a dummy val. + + prhop(1:kproma,:,jclass) = MERGE( & + zinsmas(1:kproma,:,jclass) / ztmp1(1:kproma,:), & + prhop(1:kproma,:,jclass), & + ll1(1:kproma,:)) + + ztmp1(1:kproma,:) = ram2cmr(jclass)*((ztmp1(1:kproma,:)/z4piover3)**(1._dp/3._dp)) + + pm6rp(1:kproma,:,jclass) = MERGE(ztmp1(1:kproma,:), pm6rp(1:kproma,:,jclass), ll1(1:kproma,:)) + + !< cminrad + REAL(dp) :: zww_tmp(kbdim,klev) ! tmp duplicate of pww + REAL(dp) :: zm6rp_tmp(kbdim,klev) ! tmp duplicate of pm6rp + REAL(dp) :: zrhop_tmp(kbdim,klev) ! tmp duplicate of prhop + REAL(dp) :: zgf ! growth factor + REAL(dp) :: zunitfac, zmass, zdensity, zvolume + REAL(dp) :: zwetvol, zdvol, zwatervol, zwatermass + REAL(dp) :: zTrange, zRHrange, zKrange, zRDrange + REAL(dp) :: ztsteps, zrhsteps, zksteps, zrdsteps + REAL(dp) :: zt1, zrh1, zk1, zr1, zr2, zr3 + + LOGICAL :: ll1(kbdim,klev) + + INTEGER :: ix_rd, ix_k ! index to radius and kappa in lookup table + INTEGER :: ix_t(kbdim,klev) ! index to temperature in lookup table + INTEGER :: ix_rh(kbdim,klev) ! index to RH in lookup table + INTEGER :: jk, jl, jn, jclass, jspec ! loop counters + + !--- executable procedure + + !---initialisations + zdrymass(:,:,:) = 0._dp + zdryvol(:,:,:) = 0._dp + zkappa(:,:,:) = 0._dp + + !---range of possible values of temperature, RH, kappa and radius in the lookup table: + zTrange = T_max-T_min + zRHrange = rh_max-rh_min + zKrange = kappa_max-kappa_min + zRDrange = ln_Rd_max - ln_Rd_min + + ztsteps = REAL((N_t-1),dp) ! number of steps on the temp axis + zrhsteps = REAL((N_rh-1),dp) ! number of steps on the RH axis + zksteps = REAL((N_kappa-1),dp) ! number of steps on the kappa axis + zrdsteps = REAL((N_Rd-1),dp) ! number of steps on the radius axis + + !---since temperature and RH are independent of mode and species we can + ! calculate the coordinate value for the lookup table just once + ! rather than per mode, so we do this for the first loop iteration only + DO jk=1,klev + DO jl=1,kproma + + zt1 = MAX(ptp1(jl,jk), T_min) ! limit to at least T_min + zt1 = MIN(zt1, T_max) ! limit to at most T_max + ix_t(jl,jk) = 1 + NINT(ztsteps*(zt1-T_min)/zTrange) ! linear interpolation from actual + ! temperature to lookup table entry + !>>dod redmine #260 + END DO + END DO + + IF (lut_kappa_version == 1) THEN + DO jk=1,klev + DO jl=1,kproma + zrh1 = MAX(prelhum(jl,jk), rh_min) ! limit to at least RH_min + zrh1 = MIN(zrh1, rh_max) ! limit to at most T_max + ix_rh(jl,jk) = 1 + NINT(zrhsteps*(zrh1-rh_min)/zRHrange) ! linear interpolation from actual + ! RH to lookup table entry + END DO + END DO + ELSE ! lookup table version 2 + DO jk=1,klev + DO jl=1,kproma + ix_rh(jl,jk) = CEILING( & ! see redmine #260 + (LOG(1._dp-(1._dp-rh_step_compress)*(prelhum(jl,jk)-rh_min)*inv_rh_init_step)) & + / log_rh_step_compress ) + ix_rh(jl,jk) = MAX(ix_rh(jl,jk),1) + ix_rh(jl,jk) = MIN(ix_rh(jl,jk),N_rh) + END DO + END DO + END IF + !< cminrad ) + zm6dry_safe(1:kproma,:) = MERGE(pm6dry(1:kproma,:,jclass), cminrad, ll1(1:kproma,:)) + !SFNote: cminrad is dummy in the above line. This is merely a protection against LOG(0.) later on + + DO jk = 1,klev + DO jl = 1,kproma + + zk1 = MAX (zkappa(jl,jk,jclass), kappa_min) ! limit to at least kappa_min + + zk1 = MIN(zk1, kappa_max) ! limit to at most kappa_max + ix_k = 1 + NINT(zksteps*(zk1-kappa_min)/zKrange) ! linear interpolation from actual + ! kappa to lookup table entry + + zr1 = 1.E-2*zm6dry_safe(jl,jk) ! LOG of radius in m. + zr2 = LOG(zr1) + + zr3 = MAX(zr2, ln_Rd_min) ! limit to at least Rd_min + zr3 = MIN(zr3, ln_Rd_max) ! limit to at most Rd_max + ix_rd = 1 + NINT(zrdsteps*(zr3-ln_Rd_min) / zRDrange ) ! to lookup table entry + + !---get the growth factor + zgf = gf(ix_rd, ix_t(jl,jk), ix_rh(jl,jk), ix_k) + + !---wet radius = dryradius * growth factor + zm6rp_tmp(jl,jk) = zm6dry_safe(jl,jk) * zgf + + !---calculate water uptake and wet count median radius + ! We assume that the volume of dissolved material is the same as the volume of + ! the dry material. + + zdvol = z4piover3*(cmr2ram(jclass)*zm6dry_safe(jl,jk))**3 + zwetvol = z4piover3*(cmr2ram(jclass)*zm6rp_tmp(jl,jk))**3 + + zwatervol = zwetvol - zdvol + + zwatermass = 1._dp * zwatervol ! water in g per particle + + !---aerosol water in kg m-3 + zww_tmp(jl,jk) = 1.E3_dp*paernl(jl,jk,jclass)* zwatermass + + zrhop_tmp(jl,jk) = (zdrymass(jl,jk,jclass) + zwatermass) / zwetvol + + END DO + END DO + + pww(1:kproma,:,jclass) = MERGE(zww_tmp(1:kproma,:), 0._dp, ll1(1:kproma,:)) + pm6rp(1:kproma,:,jclass) = MERGE(zm6rp_tmp(1:kproma,:), pm6dry(1:kproma,:,jclass), ll1(1:kproma,:)) + prhop(1:kproma,:,jclass) = MERGE(zrhop_tmp(1:kproma,:), 1._dp, ll1(1:kproma,:)) + + END IF + END DO + +END SUBROUTINE m7_kappa + + +SUBROUTINE m7_equiz(kproma, kbdim, klev, krow, & + papp1, pttn, ptp1, & + prelhum, pm6rp, pm6dry, & + prhop, pww, paernl ) + ! + ! *m7_equiz* calculates the ambient radii of the sulphate particles + ! + ! Authors: + ! -------- + ! J. Wilson, E. Vignati, JRC/EI (original source) 05/2000 + ! P. Stier, MPI (f90-version, changes, comments) 2001 + ! + ! Purpose: + ! -------- + ! This routine calculates the ambient radii for sulfate particles + ! with mass of ttn molecules, converts them to count mean radii and + ! stores them in the array with address pm6rp. + ! It additionally calculates the ambient particle density. + ! + ! Method: + ! ------- + ! The calculations of the ambient particle properties are based on + ! parameterisations of the mass of sulfate and density derived + ! by Julian Wilson from a regression analysis of results of solving + ! the generalised Kelvin equation using (F. J. Zeleznik, J. Phys. Chem. + ! Ref. Data 20, 1157, 1991), for an H2SO4-H2O mixture, in the + ! following parameter ranges: + + ! 1e2 < pttn < 1E11 [molecules] + ! 0.2 < prelhum < 0.9 [1] + ! 240 < ptp1 < 330 [K] + ! 10000 < papp1 < 100000 [Pa] + ! + ! Due to the limitations of the parametrisation, the ambient temperature + ! is restricted to a minimum of 240 K within this subroutine. + ! + ! Interface: + ! ---------- + ! *m7_equiz* is called from *m7* and *m7_dconc* + ! + ! Externals: + ! ---------- + ! none + ! + ! + USE mo_kind, ONLY: dp + USE mo_physical_constants, ONLY: avo + USE mo_math_constants, ONLY: pi + USE mo_ham_m7ctl, ONLY: dh2so4, dh2o, & + wvb, gmb, wh2so4, ram2cmr, cmin_aerml + USE mo_species, ONLY: speclist + USE mo_ham_species, ONLY: id_so4 + USE mo_ham, ONLY: naerocomp, aerocomp, sizeclass, nclass, nsol + ! + ! pttn = average mass for single compound in each mode + ! [in molec. for sulphate and in ug for bc, oc, ss, and dust] + ! pm6rp = count mean radius under ambient conditions [cm] + ! pm6dry = count mean radius under dry conditions [cm] + ! paernl = aerosol number for each mode [cm-3] + ! pww = aerosol water content for each mode [kg(water) m-3(air)] + ! zwso4 = percentage by mass of sulfate in a H2O-H2SO4 particle + ! containing pttn molecules of sulfate under ambient conditions + ! zvso4 = volume of pttn molecules of sulfate [cm3] + ! zmso4 = mass of pttn molecules of sulfate [g] + ! zdso4h2o = density of sulfate-h2o fraction of a particle with average + ! mass [g.cm-3] + ! zmso4h2o = mass of sulfate-h2o fraction of a particle with average mass [g] + ! zvso4h2o = volume of sulfate-h2o fraction of a particle with average + ! mass [cm3] + + IMPLICIT NONE + + INTEGER :: kproma, kbdim, klev, krow + + REAL(dp):: papp1(kbdim,klev), ptp1(kbdim,klev), & + prelhum(kbdim,klev) + + REAL(dp):: pttn(kbdim,klev,naerocomp), prhop(kbdim,klev,nclass), & + pm6dry(kbdim,klev,nsol), pm6rp(kbdim,klev,nclass), & + pww(kbdim,klev,nclass), paernl(kbdim,klev,nclass) + + !--- Local variables: + + INTEGER :: jk, jl, jclass, jn + + REAL(dp) :: zaerelse(kbdim,klev,nsol) + + REAL(dp):: zwso4, zvso4, zmso4, & + zvso4h2o, zmso4h2o, zdso4h2o, & + zapp1, ztk, zrh + + REAL(dp):: ztk2, zln3, zln32, & + zlnm, zss2, zlnm2 + + INTEGER :: ixso4 + !------------------------------------------------------------------------------ + + zaerelse(:,:,:) = 0._dp + + !--- 1) Determine mass of non sulfate compounds in a particle: --------- + + DO jn = 1,naerocomp ! for each mode+species + jclass = aerocomp(jn)%iclass ! check if the species is NOT sulphate + ! if so, add to the total mode non-S mass + IF (aerocomp(jn)%spid /= id_so4 .AND. & + sizeclass(jclass)%lsoluble) THEN + zaerelse(1:kproma,:,jclass) = zaerelse(1:kproma,:,jclass) + pttn(1:kproma,:,jn) + END IF + + END DO + + DO 100 jclass=1,nsol + ixso4 = speclist(id_so4)%iaerocomp(jclass) !!mgs!! im7table(jclass, id_so4) + DO 90 jk=1,klev + DO 80 jl=1,kproma + + ! other compounds than sulfate: + + IF (pttn(jl,jk,ixso4) > 0.0_dp .AND. zaerelse(jl,jk,jclass) < cmin_aerml) THEN + ! + !--- 2.1) Calculation of the ambient particle properties: ----------- + ! + !--- Constrain ambient temperature to conditions for which the + ! parametrisation of the liquid water content works: + + ! Temperature: + ztk = ptp1(jl,jk) + ztk = MAX(ztk , 240._dp) + + ! Relative Humidity: + zrh = prelhum(jl,jk) + zrh = MAX(zrh , 0.05_dp) + zrh = MIN(zrh , 0.90_dp) + + !--- Assign auxiliary variables: + + zapp1=papp1(jl,jk) + zlnm = LOG(pttn(jl,jk,ixso4)) + zlnm2 = zlnm*zlnm + zss2 = zrh**2 + ztk2 = ztk*ztk + zln3 = zlnm/3.0_dp + zln32 = zln3*zln3 + ! + !--- Percentage by weight of sulfate in the particle [%]: + ! (Here we ignore any insoluble mass.) + ! + zwso4 = wvb(1) + wvb(2)*zlnm + wvb(3)*zrh*zlnm + wvb(4)*ztk*zlnm + & + wvb(5)*zrh/ztk + wvb(6)*zlnm2*zrh + wvb(7)*zlnm2*ztk + & + wvb(8)*zlnm*zss2 + wvb(9)*zlnm*ztk2 + wvb(10)*zlnm2*zss2 + & + wvb(11)*zlnm2*ztk2 + wvb(12)*zss2/ztk2 + wvb(13)*zlnm2 + & + wvb(14)*zlnm2*zlnm + wvb(15)*zlnm2*zlnm2 + & + wvb(16)*zss2*zrh/(ztk2*ztk) + wvb(17)*LOG(zrh*ztk/zapp1) + + !--- Dry mass of sulfate in an average particle [g]: + + zmso4 = pttn(jl,jk,ixso4)*wh2so4/avo + + !--- Dry volume of sulfate in an average particle [cm3]: + ! Any temperature or pressure dependency of the + ! sulfate density is ingored. + + zvso4 = zmso4/dh2so4 + + !--- Mass of sulfate + water in an average particle [g]: + + zmso4h2o = zmso4/(zwso4/100.0_dp) + + !--- Density of the sulfate-water fraction of an average particle [g cm-3]: + !@@@ Check: changed zwvso4 into zwso4 (now the mass!) + + zdso4h2o = gmb(1) + gmb(2)*zwso4 + gmb(3)*zln3 + gmb(4)*zrh + & + gmb(5)*ztk + gmb(6)*zln32 + gmb(7)*zln3/zrh + & + gmb(8)*zln3/ztk + gmb(9)*ztk2 + + !--- Limits for zdso4h2o: H2O(0.99) and pure H2SO4 (1.841): + ! + zdso4h2o=MAX(zdso4h2o,dh2o) + zdso4h2o=MIN(zdso4h2o,dh2so4) + + !--- Volume of sulfate-water fraction of an average particle [cm3]: + + zvso4h2o = zmso4h2o/zdso4h2o + + !--- 2.2) Calculatiion of the particle radii: ---------------------------- + + !--- 2.2.1) Dry count mean radius [cm]: + + pm6dry(jl,jk,jclass)=((zvso4)*0.75_dp/pi)**(1._dp/3._dp)*ram2cmr(jclass) + + !--- 2.2.2) Equilibrium wet count mean radius [cm]: + + pm6rp(jl,jk,jclass) =((zvso4h2o)*0.75_dp/pi)**(1._dp/3._dp)*ram2cmr(jclass) + + !--- 2.3) Assignment of the particle density [g cm-3]: ------------------- + + prhop(jl,jk,jclass)=zdso4h2o + + !--- 2.4) Store aerosol water for each mode [kg(water) m-3(air)]: + + pww(jl,jk,jclass)=(zmso4h2o-zmso4)*paernl(jl,jk,jclass)*1.E3_dp + + END IF +80 END DO +90 END DO +100 END DO + +END SUBROUTINE m7_equiz + + +SUBROUTINE m7_equimix(kproma, kbdim, klev, krow, & + papp1, pttn, ptp1, & + prelhum, pm6rp, pm6dry, & + prhop, pww, paernl ) + ! + ! *m7_equimix* calculates the ambient radii of the particles with + ! sulphate, b/o carbon and dust. + ! + ! Authors: + ! -------- + ! J. Wilson and E. Vignati, JRC (original source) 05/2000 + ! P. Stier, MPI (f90-version, changes, comments) 2001 + ! + ! Purpose: + ! -------- + ! This routine calculates the ambient radii for mixed particles without + ! sea salt with mass of ttn molecules, converts them to count mean radii and + ! stores them in the array with address pm6rp. + ! It additionally calculates the ambient particle density. + ! + ! Method: + ! ------- + ! The calculations of the ambient particle properties are based on + ! parameterisations of the mass of sulfate and density derived + ! by Julian Wilson from a regression analysis of results of solving + ! the generalised Kelvin equation using (F. J. Zeleznik, J. Phys. Chem. + ! Ref. Data 20, 1157, 1991), for an H2SO4-H2O mixture, in the + ! following parameter ranges: + + ! 1e2 < pttn < 1E11 [molecules] + ! 0.2 < prelhum < 0.9 [1] + ! 240 < ptp1 < 330 [K] + ! 10000 < papp1 < 100000 [Pa] + ! + ! Due to the limitations of the parametrisation, the ambient temperature + ! is restricted to a minimum of 240 K within this subroutine. + ! + ! For this application to mixed aerosols with an insoluble core we + ! assume the H2O uptake by the particle to be that of a pure + ! H2SO4 / H2O particle containing the H2SO4 mass of the mixed aerosol. + ! + ! Interface: + ! ---------- + ! *m7_equimix* is called from *m7* + ! + ! Externals: + ! ---------- + ! none + ! + USE mo_kind, ONLY: dp + USE mo_physical_constants, ONLY: avo + USE mo_math_constants, ONLY: pi + USE mo_ham_m7ctl, ONLY: dh2so4, dh2o, wvb, gmb, wh2so4, & + ram2cmr, cmin_aerml, cdconv + USE mo_species, ONLY: speclist + USE mo_ham_species, ONLY: id_ss, id_so4 + USE mo_ham, ONLY: naerocomp, aerocomp, sizeclass, nclass, nsol + + IMPLICIT NONE + ! + ! pttn = average mass for single compound in each mode + ! [in molec. for sulphate and in ug for bc, oc, ss, and dust] + ! pm6rp = count mean radius under ambient conditions + ! pm6dry = count mean radius under dry conditions + ! paernl = aerosol number for each mode [cm-3] + ! pww = aerosol water content for each mode [kg(water) m-3(air)] + ! zwso4 = percentage by mass of sulfate in a H2O-H2SO4 particle + ! containing pttn molecules of sulfate under ambient conditions + ! zvso4 = volume of pttn molecules of sulfate [cm3] + ! zmso4 = mass of pttn molecules of sulfate [g] + ! zdso4h2o = density of sulfate-h2o fraction of a particle with average + ! mass [g.cm-3] + ! zmso4h2o = mass of sulfate-h2o fraction of a particle with average mass [g] + ! zvso4h2o = volume of sulfate-h2o fraction of a particle with average + ! mass [cm3] + ! zinsvol = total volume of insoluble compounds in a single particle of + ! average mass [cm3] + ! zinsmass = total mass of insoluble compounds in a single + ! particle of average mass [cm3] + + INTEGER :: kproma, kbdim, klev, krow + + REAL(dp):: papp1(kbdim,klev), ptp1(kbdim,klev), & + prelhum(kbdim,klev) + + REAL(dp):: pttn(kbdim,klev,naerocomp), prhop(kbdim,klev,nclass), & + pm6dry(kbdim,klev,nsol), pm6rp(kbdim,klev,nclass), & + pww(kbdim,klev,nclass), paernl(kbdim,klev,nclass) + ! + ! Local variables: + ! + + INTEGER :: jk, jl, jclass + + REAL(dp):: zseasalt, & + zwso4, zvso4, zmso4, & + zvso4h2o, zmso4h2o, zdso4h2o, & + zapp1, zrh, ztk + + REAL(dp):: zlnm2, zln3, zln32, ztk2, & + zlnm, zss2 + + REAL(dp) :: zinsmas(kbdim,klev,nsol) + REAL(dp) :: zinsvol(kbdim,klev,nsol) + REAL(dp) :: zdens + INTEGER :: ixso4, ixss, jspec, jn + !------------------------------------------------------------------------------ + ! + zinsmas(:,:,:) = 0._dp + zinsvol(:,:,:) = 0._dp + + !--- 1) Determine mass of non sulfate compounds in a particle: --------- + + DO jn = 1,naerocomp ! for each mode+species + jclass = aerocomp(jn)%iclass ! check if the species is neither sulphate nor seasalt + jspec = aerocomp(jn)%spid ! if so, add to the total mode 'others' mass + IF (sizeclass(jclass)%lsoluble .AND. (.NOT. speclist(jspec)%lelectrolyte)) THEN + zdens = cdconv*speclist(jspec)%density + zinsmas(1:kproma,:,jclass) = zinsmas(1:kproma,:,jclass) + pttn(1:kproma,:,jn) + zinsvol(1:kproma,:,jclass) = zinsvol(1:kproma,:,jclass) + pttn(1:kproma,:,jn)/zdens + zinsmas(1:kproma,:,jclass) = MAX(zinsmas(1:kproma,:,jclass),0._dp) + zinsvol(1:kproma,:,jclass) = MAX(zinsvol(1:kproma,:,jclass),0._dp) + END IF + + END DO + +!CDIR unroll=5 + DO 100 jclass=1,nsol + ixso4 = speclist(id_so4)%iaerocomp(jclass) !!mgs!! im7table(jclass,id_so4) + ixss = speclist(id_ss)%iaerocomp(jclass) !!mgs!! im7table(jclass, id_ss) + + DO 90 jk=1,klev + DO 80 jl=1,kproma + + !--- 1) Split particle quantities into soluble (sea salt) and -------------- + ! non soluble (organic carbon + black carbon + dust) parts: + ! (N.B. densities are assumed independent of temperature & pressure) + + IF (ixss > 0) THEN + zseasalt = pttn(jl,jk,ixss) + ELSE + zseasalt = 0._dp + END IF + + !--- 2) Calculation of the particle properties in the absense of sea salt: -- + ! + IF (pttn(jl,jk,ixso4) > 0.0_dp .AND. zseasalt < cmin_aerml ) THEN + + !--- 2.1) Calculation of the ambient particle properties: ---------------- + ! + !--- Constrain ambient temperature and relative humidity to + ! conditions for which the parametrisation of the liquid + ! water content works: + ! + ! Temperature: + ztk = ptp1(jl,jk) + ztk = MAX(ztk , 240._dp) + + ! Relative Humidity: + zrh = prelhum(jl,jk) + zrh = MAX(zrh , 0.05_dp) + zrh = MIN(zrh , 0.90_dp) + + !--- Assign auxiliary variables: + + zapp1=papp1(jl,jk) + zlnm = LOG(pttn(jl,jk,ixso4)) + zlnm2 = zlnm*zlnm + zss2 = zrh**2 + ztk2 = ztk*ztk + zln3 = zlnm/3.0_dp + zln32 = zln3*zln3 + + !--- Percentage by weight of sulfate in the particle [%]: + ! (Here we ignore any insoluble mass.) + + zwso4 = wvb(1) + wvb(2)*zlnm + wvb(3)*zrh*zlnm + wvb(4)*ztk*zlnm + & + wvb(5)*zrh/ztk + wvb(6)*zlnm2*zrh + wvb(7)*zlnm2*ztk + & + wvb(8)*zlnm*zss2 + wvb(9)*zlnm*ztk2 + wvb(10)*zlnm2*zss2 + & + wvb(11)*zlnm2*ztk2 + wvb(12)*zss2/ztk2 + wvb(13)*zlnm2 + & + wvb(14)*zlnm2*zlnm + wvb(15)*zlnm2*zlnm2 + & + wvb(16)*zss2*zrh/(ztk2*ztk) + wvb(17)*LOG(zrh*ztk/zapp1) + + !--- Dry mass of sulfate in an average particle [g]: + + zmso4 = pttn(jl,jk,ixso4)*wh2so4/avo + + !--- Dry volume of sulfate in an average particle [cm3]: + ! Any temperature or pressure dependency of the + ! sulfate density is ingored. + + zvso4 = zmso4/dh2so4 + + !--- Mass of sulfate + water in an average particle [g]: + + zmso4h2o = zmso4/(zwso4/100.0_dp) + + !--- Density of the sulfate-water fraction of an average particle [g cm-3]: + !@@@ Check: changed zwvso4 into zwso4 (now the mass!) + + zdso4h2o = gmb(1) + gmb(2)*zwso4 + gmb(3)*zln3 + gmb(4)*zrh + & + gmb(5)*ztk + gmb(6)*zln32 + gmb(7)*zln3/zrh + & + gmb(8)*zln3/ztk + gmb(9)*ztk2 + + !--- Limits for zdso4h2o: H2O(0.99) and pure H2SO4 (1.841): + ! + zdso4h2o=MAX(zdso4h2o,dh2o) + zdso4h2o=MIN(zdso4h2o,dh2so4) + + !--- Volume of sulfate-water fraction of an average particle [cm3]: + + zvso4h2o = zmso4h2o/zdso4h2o + + !--- 2.2) Calculatiion of the particle radii: ---------------------------- + + !--- 2.2.1) Dry count mean radius [cm]: + + pm6dry(jl,jk,jclass)=((zvso4+zinsvol(jl,jk,jclass))*0.75_dp/pi)**(1._dp/3._dp)*ram2cmr(jclass) + + !--- 2.2.2) Equilibrium wet count mean radius [cm]: + + pm6rp(jl,jk,jclass) =((zvso4h2o+zinsvol(jl,jk,jclass))*0.75_dp/pi)**(1._dp/3._dp)*ram2cmr(jclass) + + !--- 2.3) Calculation of the particle density [g cm-3]:------------------- + + prhop(jl,jk,jclass)=(zmso4h2o+zinsmas(jl,jk,jclass))/ & + (zvso4h2o+zinsvol(jl,jk,jclass)) + + !--- 2.4) Store aerosol water for each mode [kg(water) m-3(air)]: + + pww(jl,jk,jclass)=(zmso4h2o-zmso4)*paernl(jl,jk,jclass)*1.E3_dp + + END IF + +80 END DO +90 END DO +100 END DO + +END SUBROUTINE m7_equimix + + +SUBROUTINE m7_equil (kproma, kbdim, klev, krow, prelhum, paerml, paernl, & + pm6rp, pm6dry, pww, prhop, ptp1 ) + ! + !**** *m7_equil* calculates the ambient radii of accumulation + ! and coarse mode particles in presence of sea salt + ! + ! + ! Authors: + ! -------- + ! E. Vignati, JRC/EI (original source) 01/2000 + ! P. Stier, MPI (f90-version, changes, comments) 2001 + ! D. O'Donnell, MPI-M, see Revision information below 2007-2008 + + ! Purpose: + ! -------- + ! This routine calculates the equilibrium radius of sea salt + ! particles, and of sea salt particles mixed with sulphate for + ! accumulation and coarse modes. + ! + ! Interface: + ! ---------- + ! *m7_equil* is called from *m7* + ! + ! References: + ! ----------- + ! Jacobson, M.Z., Tabazadeh, A., Turco, R.P., (1996). Simulating + ! equilibrium within aerosols and nonequilibrium between gases + ! and aerosols. + ! Tang, I.N., (1997). Thermodynamic and optical properties of + ! mixed-salt aerosols of atmospheric importance. + + ! Revision information + ! -------------------- + ! Based on: m7_equil from HAM_me_v1 (svn rev:266) + ! Major changes: changed to become more generic with respect to non-electrolytic species + ! i.e. should not require updating if more such species are added to the model + ! Minor changes: 1. removed computation of [H+]: this is not used anywhere (this also affects + ! the subroutine call in m7) + ! 2. cleaned up mode and species indexing - fixed relations between mode numbers + ! and species identities no longer required + + !--- Local variables: to be completed + + USE mo_kind, ONLY: dp + USE mo_physical_constants, ONLY: avo + USE mo_math_constants, ONLY: pi + USE mo_ham, ONLY: naerocomp, nclass, nsol, subm_naerospec, subm_aerospec + USE mo_ham_m7ctl, ONLY: iaccs, icoas, & + wnacl, wna2so4, wnahso4, wh2so4, & + dna2so4, dnahso4, dh2so4, dh2o, & + crh, ram2cmr, cmin_aerml, cmin_aernl, cdconv + USE mo_ham_subm_species, ONLY: isubm_wat + + USE mo_species, ONLY: speclist + USE mo_ham_species, ONLY: id_ss, id_so4 !!mgs!! ham_aerospec, ham_naerospec + + IMPLICIT NONE + ! + !--- Parameter list: + ! + ! + !--- Local variables: + ! + ! !@@@ To be completed! + ! + ! Indices for the arrays zmm and zmmr: + ! ----------------------------------- + ! | ions ion pair | + ! | (mole m-3) (mole m-3) | + ! | i zmm(i) zmmr(i) | + ! | 1 Na+ NaCl | + ! | 2 Cl- NaHSO4 | + ! | 3 SO4-- Na2SO4 | + ! | 4 HSO4- H2-SO4 | + ! | 5 H+ | + ! ----------------------------------- + + !--- Parameters: + + INTEGER :: kproma, kbdim, klev, krow + + REAL(dp):: prelhum(kbdim,klev), ptp1(kbdim,klev) + + REAL(dp):: paerml(kbdim,klev,naerocomp), paernl(kbdim,klev,nclass), & + pm6rp(kbdim,klev,nclass), pm6dry(kbdim,klev,nsol), & + prhop(kbdim,klev,nclass), pww(kbdim,klev,nclass) + + !--- Local variables: + + INTEGER :: jl, jk, jclass, jn, jm + + REAL(dp):: zaw, zvolw, zdryvol, zdrymass, & + zdryvol_mean, zambvol_mean + + !>>dod soa removed zmol + REAL(dp):: zmm(4), zmmr(4), zmo(4), zmmt(4) + !< cmin_aerml) .AND. (paernl(jl,jk,jclass)>cmin_aernl)) THEN + ! + !--- 1) Dry Calculations: -------------------------------------------------- + ! + !--- 1.1) Calculate initial concentrations of the compounds in mole/m+3: + ! + !--- Na, Cl: + ! + zmm(1)=paerml(jl,jk,ixss)*1.E-6_dp / wnacl ! n(Na) [mole m-3] + zmm(2)=paerml(jl,jk,ixss)*1.E-6_dp / wnacl ! n(Cl) [mole m-3] + ! [ g m-3 ] / [g mole-1] = [mole m-3] + ! + !--- SO4--: + ! + zmm(3)=paerml(jl,jk,ixso4) *1.E+6_dp / avo ! n(H2SO4) [mole m-3] + ! [ m-3 ] / [mole-1] = [mole m-3] + ! + !--- HSO4-: + ! + zmm(4)=0._dp ! n(HSO4) [mole m-3] + ! + !--- 1.2) Calculation of the concentration of the different species: + ! The ions are supposed to be arranged such that + ! sodium is associated to sulphate first in + ! Na2SO4, the remaining sodium is associated to Cl + ! in form of NaCl. + ! + zmmt(1)=zmm(1) ! n(Na) + zmmt(3)=zmm(3) ! n(SO4) + ! + zmmr(3)=MIN(zmmt(1)/2._dp , zmmt(3)) ! n(Na2SO4) + zmmt(1)=zmmt(1)-2._dp*zmmr(3) ! Remaining n(Na) after association + ! with Na2SO4: n(Na)=n(Na)-2*n(Na2SO4) + ! + zmmr(1)=MIN(zmm(2),zmmt(1)) ! n(NaCl) + ! + zmm(2)=zmmr(1) ! n(Cl) bound in NaCl, the rest is + ! assumed to evaporate in presence of SO4 + ! + zmmr(2)=0._dp ! n(NaHSO4) + ! + zmmr(4)=zmm(3)-zmmr(2)-zmmr(3) ! n(H2-SO4)(t)=n(H2SO4)(t0)-n(NaHSO4)-n(Na2SO4) + ! ! as n(H2SO4)(t0)=n(SO4--)(t0) + ! + !--- 1.3) Total aerosol dry volume [cm3/m3]: + ! + zdryvol= zmmr(1)*wnacl/zdss + & + zmmr(2)*wnahso4/dnahso4 + & + zmmr(3)*wna2so4/dna2so4 + & + zmmr(4)*wh2so4/dh2so4 + & + zothervol(jl,jk) + + ! + !--- 1.4) Mean aerosol dry volume [cm+3]: + zdryvol_mean = zdryvol / (paernl(jl,jk,jclass)*1.E6_dp) + ! [cm+3] = [cm+3/m+3] / [ m-3 ] + ! + !--- 1.5) Dry radius [cm]: + ! + pm6dry(jl,jk,jclass)=((3._dp/(4._dp*pi))*zdryvol_mean)**(1._dp/3._dp) * & + ram2cmr(jclass) + ! + !--- 1.6) Total aerosol dry mass [gr/m3]: + ! + zdrymass= zmmr(1)*wnacl + & + zmmr(2)*wnahso4 + & + zmmr(3)*wna2so4 + & + zmmr(4)*wh2so4 + & + zothermass(jl,jk) + ! + ! + !--- 2) Wet calculations: -------------------------------------------------- + ! + !--- Set threshold for relative humidity: + ! If RH is smaller than the Critical Relative Humidity + ! (currently crh=0.45) the equilibrium radius is set to the dry radius: + + IF (prelhum(jl,jk) < crh) THEN + ! + pww(jl,jk,jclass) = 0._dp + ! + pm6rp(jl,jk,jclass) = pm6dry(jl,jk,jclass) + ! + prhop(jl,jk,jclass) = zdrymass/zdryvol + ! + ELSE + ! + !--- 2.1) Calculate thermodynamic properties under ambient conditions + ! + !--- 2.1.1) Water activity: + ! + zaw=prelhum(jl,jk) + ! + !--- 2.1.2) Molality as function of the water activity: + ! Currently sulfate is assumed to be fully dissociated, + ! i.e. zmmr(2)=0. and zmo(2) is not calculated. + ! + ! Changed reference to Jacobson et al. (1996): + ! + !--- NaCl: + + zmo(1)=(-1.918004E2_dp+2.001540E3_dp*zaw-8.557205E3_dp*zaw**2 & + +1.987670E4_dp*zaw**3-2.717192E4_dp*zaw**4+2.187103E4_dp*zaw**5 & + -9.591577E3_dp*zaw**6+1.763672E3_dp*zaw**7 )**2 + + !--- NaHSO4: + + zmo(2)=(+4.662777E0_dp-1.128472E1_dp*zaw+7.049464E1_dp*zaw**2 & + -2.788050E2_dp*zaw**3+6.103105E2_dp*zaw**4-7.409417E2_dp*zaw**5 & + +4.614577E2_dp*zaw**6-1.150735E2_dp*zaw**7 )**2 + + !--- Na2SO4: + + zmo(3)=(-3.295311E3_dp+3.188349E4_dp*zaw-1.305168E5_dp*zaw**2 & + +2.935608E5_dp*zaw**3-3.920423E5_dp*zaw**4+3.109519E5_dp*zaw**5 & + -1.356439E5_dp*zaw**6+2.510249E4_dp*zaw**7 )**2 + + !--- H2-SO4: + + zmo(4)=(+5.611895_dp-1.387446E1_dp*zaw+1.750682E1_dp*zaw**2 & + +7.138146E1_dp*zaw**3-3.109173E2_dp*zaw**4+4.662288E2_dp*zaw**5 & + -3.128612E2_dp*zaw**6+7.76097E1_dp*zaw**7 )**2 + ! + ! + !--- 2.2) Calculation of the water content in kg water/m3 air: + ! (zmmr[mole/m3(air)]/zmo[mole/kg(water)] =zww[kg(water)/m3(air)] + ! + pww(jl,jk,jclass)=zmmr(1)/zmo(1)+zmmr(2)/zmo(2)+zmmr(3)/zmo(3)+zmmr(4)/zmo(4) + ! + !--- 2.3) Calculate the molality of the ions + ! + !--- 2.3.1) For Na+, Cl-, SO4--, HSO4- : + ! + !>>dod soa removed these calculations - not used anywhere + !< cmin_aerml) .AND. (paernl(jl,jk,jclass) > cmin_aernl)) + +70 END DO +60 END DO +50 END DO + +END SUBROUTINE m7_equil + + + + +SUBROUTINE m7_h2so4_cs(kproma,kbdim,klev,ptp1,papp1,paernl,pm6rp,pcs,pcsi) + +! +! *m7_h2so4_cs* calculates the H2SO4 condensation sink (s-1) of the given +! aerosol size distribution and of the individual modes. +! +! Method: +! ----------------- +! The transfer of sulfate to the particles is based on Fuchs (1959). Soluble +! and insoluble particles are distinguished by a different accomodation +! coefficient "caccso4" defined in mo_ham_m7ctl. (Currently 1.0 for soluble and +! 0.3 for insoluble modes). +! +! References: +! ----------- +! Fuchs, N.A. (1959). Evaporation and droplet growth in gaseous media; Pergamon, New York, pp72. +! +! Authors: +! +! 2001 Philip Stier AOPP, University of Oxford +! 2000 J. Wilson, E. Vignati, JRC/EI (original source) + +USE mo_kind, ONLY: dp +USE mo_time_control, ONLY: time_step_len +USE mo_ham_m7ctl, ONLY: wh2so4,rerg,caccso4 +USE mo_math_constants, ONLY: pi +USE mo_ham, ONLY: nclass + +IMPLICIT NONE + +! +! Input +! + +INTEGER :: kproma, kbdim, klev + +REAL(dp):: ptp1(kbdim,klev) ! Temperature (K) +REAL(dp):: papp1(kbdim,klev) ! Pressure (Pa) +REAL(dp):: paernl(kbdim,klev,nclass) ! Aerosol number for each mode (cm-3) +REAL(dp):: pm6rp(kbdim,klev,nclass) ! Mean mode actual radius (wet radius for soluble modes and dry radius for insoluble modes) (cm) + +! +! Output +! + +REAL(dp):: pcs(kbdim,klev) ! H2SO4 condensation sink of the aerosol population (s-1) +REAL(dp):: pcsi(kbdim,klev,nclass) ! H2SO4 condensation sink of the individual aerosol modes (s-1) + +! +! Local variables: +! + +INTEGER :: jclass,jk,jl + +REAL(dp):: zpbyone,zde2,zvelb,zxibc,zm6rp,zf1,zqtmst + +!--- 0) Initizalizations: ------------------------------------------------ + +pcs(:,:)=0.0_dp + +pcsi(:,:,:) = 0.0_dp + +zqtmst=1._dp/time_step_len + +!--- 1) Calculate condensation rate for cm diameter sulphate aerosols: --- + +DO jclass=1,nclass + DO jk=1,klev + DO jl=1,kproma + IF (pm6rp(jl,jk,jclass).GT.0._dp) THEN ! try re-code avgprops so that this is never the case. (call 1 of avgprops) + + !--- Diffusion coefficient (Reference???): + + zpbyone=1000.0_dp / (papp1(jl,jk)/100.0_dp) + + zde2=0.073_dp * zpbyone * (ptp1(jl,jk) / 298.15_dp)**1.5_dp ! merge this and the previous statement a la coaset. In + ! fact consider re-using it in coaset. NB multiply by 4. + ! in subsequent usage, zde2 is always multiplied by 4. + + !--- Mean molecule velocity (Moore, 1962 (S+P equ. 8.2)): + + zvelb=SQRT(8.0_dp * rerg * ptp1(jl,jk) / pi / wh2so4) ! merge the constants. isolate sqrt(t) since it usually doesn't vectorise. + + !--- ???Fuchs??? + + zxibc=8.0_dp * zde2 / pi / zvelb ! again merge constants. consider separate calc of 3*zxibc + + ! Use count median radius: + + zm6rp=pm6rp(jl,jk,jclass) + + !--- Distance from particle up to which the kinetic regime applies: + + zf1=( (zm6rp + zxibc)**3 - (zm6rp**2 + zxibc**2)**1.5_dp ) / & + (3.0_dp * zm6rp * zxibc) - zm6rp + + !--- Diffusive flux to single particle surface: + ! (Elisabetta's thesis: fraction in equ. 2.26) + + pcsi(jl,jk,jclass)=(4.0_dp * pi * zde2 * zm6rp ) / & + ((4.0_dp * zde2) / (zvelb * zm6rp * caccso4(jclass)) + & + (zm6rp/(zm6rp+zf1)) ) + + !--- Total diffusive flux to all particles in the respective mode: + ! (per concentration of gas phase sulfate) + + pcsi(jl,jk,jclass)=pcsi(jl,jk,jclass) * paernl(jl,jk,jclass) + + !--- Total diffusive flux to all particles in all modes: + ! (per concentration of gas phase sulfate) + + pcs(jl,jk)=pcs(jl,jk)+ pcsi(jl,jk,jclass) + + END IF + END DO + END DO +END DO + +END SUBROUTINE m7_h2so4_cs + + + + +SUBROUTINE m7_prod_cond(kproma, kbdim, klev, krow, & + pso4g, dpso4g, paerml, & + pso4_5, pso4_6, pso4_7, & + pcs, pcsi, paclc, pdz) + ! + ! Authors: + ! -------- + ! + ! 2000 J. Wilson and E. Vignati(original code) + ! 2001 P. Stier (f90-version, changes, comments) + ! 2008 J. Kazil + ! - cloud correction + ! - new time integration scheme + ! - comments + ! + ! Interface: + ! ---------- + ! + ! *m7_prod_cond* is called from *m7* before *m7_nuck* + ! + ! Purpose: + ! -------- + ! + ! *prod_cond* performs the production/condensation part of the time + ! integration of the differential equation for sulfate production/condensation + ! /nucleation over a time step, removes the condensing H2SO4 from the gas + ! phase and distributes it onto the individual aerosol modes, given their + ! H2SO4 condensation sinks. Inside clouds, all H2SO4 is removed from the gas + ! phase. + + USE mo_kind, ONLY: dp + USE mo_time_control, ONLY: time_step_len + USE mo_physical_constants, ONLY: avo + USE mo_ham_m7ctl, ONLY: iso4ns,iso4ks,iso4as,iso4cs,cmin_aernl + USE mo_ham, ONLY: naerocomp, mw_so4, nclass +#ifdef HAMMOZ + USE mo_time_control, ONLY: delta_time + USE mo_ham_streams, ONLY: d_cond_so4 +#endif + + IMPLICIT NONE + + ! + ! Input/output: + ! + + INTEGER :: kproma, kbdim, klev, krow ! ECHAM indices + + REAL(dp):: pso4g(kbdim,klev) ! [H2SO4(g)] [molec. cm-3] + REAL(dp):: dpso4g(kbdim,klev) ! [H2SO4(g)] production rate [molec. cm-3] + REAL(dp):: paerml(kbdim,klev,naerocomp) ! aerosol mass for individual compounds [molec. cm-3 for sulfate and ug m-3 for bc, oc, ss, and dust] + REAL(dp):: pso4_5(kbdim,klev) ! H2SO4 condensing on insoluble mode 5 [molec. cm-3] + REAL(dp):: pso4_6(kbdim,klev) ! H2SO4 condensing on insoluble mode 6 [molec. cm-3] + REAL(dp):: pso4_7(kbdim,klev) ! H2SO4 condensing on insoluble mode 7 [molec. cm-3] + REAL(dp):: pcs(kbdim,klev) ! H2SO4 condensation sink of the aerosol population [s-1] + REAL(dp):: pcsi(kbdim,klev,nclass) ! H2SO4 condensation sink of the individual aerosol modes [s-1] + REAL(dp):: paclc(kbdim,klev) ! Cloud cover [0,1] + REAL(dp):: pdz(kbdim,klev) ! layer thickness dz for diagnostics [m] + + ! + ! Local variables: + ! + + INTEGER :: jl,jk + + REAL(dp):: zqtmst + REAL(dp):: zh2so4_cf0 ! Start [H2SO4(g)] [molec. cm-3] in the cloud-free part of the grid box + REAL(dp):: zh2so4_cf1 ! End [H2SO4(g)] [molec. cm-3] in the cloud-free part of the grid box + REAL(dp):: zh2so4_cy0 ! Start [H2SO4(g)] [molec. cm-3] in the cloudy part of the grid box + REAL(dp):: zh2so4_cy1 ! End [H2SO4(g)] [molec. cm-3] in the cloudy part of the grid box + + REAL(dp):: zfcond_cf ! [H2SO4(g)] condensing during the time step in the cloud-free part of the grid box + REAL(dp):: zfcond_cy ! [H2SO4(g)] condensing during the time step in the cloudy part of the grid box + + REAL(dp):: cc ! Corrected cloud cover [0,1] + + ! Initialisations: + + zqtmst=1.0_dp/time_step_len + + ! Calculation of the new sulfate aerosol masses and of the mass of sulfate + ! condensing on the respective modes: + + DO jk=1,klev + DO jl=1,kproma + + IF (pcs(jl,jk) > 1.0E-10_dp) THEN ! Regular H2SO4 condensation sink of the aerosol + + ! Safety check on the cloud fraction: + cc = min(paclc(jl,jk),1.0_dp) + cc = max(cc,0.0_dp) + + ! + ! Cloud-free part of the grid box: + ! + + ! Start [H2SO4(g)]: + zh2so4_cf0 = pso4g(jl,jk) + + ! End [H2SO4(g)]: + zh2so4_cf1 = & + (zh2so4_cf0 - dpso4g(jl,jk)/pcs(jl,jk))*exp(-pcs(jl,jk)*time_step_len) & + + dpso4g(jl,jk)/pcs(jl,jk) + + ! Safety check: + zh2so4_cf1 = max(zh2so4_cf1,0.0_dp) + + ! + ! Cloudy part of the grid box: + ! + + ! Start [H2SO4(g)]: + zh2so4_cy0 = pso4g(jl,jk) + + ! End [H2SO4(g)]: + zh2so4_cy1 = 0.0_dp + + ! + ! New grid box-averaged [H2SO4(g)]: + ! + + pso4g(jl,jk) = (1.0_dp-cc)*zh2so4_cf1 + cc*zh2so4_cy1 + + ! [H2SO4(g)] that condensed onto aerosol particles during the time step + ! in the cloud-free and cloudy part of the grid box: + + zfcond_cf = (1.0_dp-cc)*(zh2so4_cf0 - zh2so4_cf1 + dpso4g(jl,jk)*time_step_len) + zfcond_cy = cc*(zh2so4_cy0 - zh2so4_cy1 + dpso4g(jl,jk)*time_step_len) + + ! Distribute H2SO4(g) condensing in the cloud-free part of the grid box + ! on the soluble and insoluble aerosol modes according to their + ! condensation sinks: + + paerml(jl,jk,iso4ns) = paerml(jl,jk,iso4ns) + pcsi(jl,jk,iso4ns)/pcs(jl,jk)*zfcond_cf + paerml(jl,jk,iso4ks) = paerml(jl,jk,iso4ks) + pcsi(jl,jk,iso4ks)/pcs(jl,jk)*zfcond_cf + paerml(jl,jk,iso4as) = paerml(jl,jk,iso4as) + pcsi(jl,jk,iso4as)/pcs(jl,jk)*zfcond_cf + paerml(jl,jk,iso4cs) = paerml(jl,jk,iso4cs) + pcsi(jl,jk,iso4cs)/pcs(jl,jk)*zfcond_cf + + ! Number of H2SO4 molecules condensing on the insoluble modes: + ! (Transfer from insoluble to soluble modes is calculated in m7_concoag) + + pso4_5(jl,jk) = pcsi(jl,jk,5)/pcs(jl,jk)*zfcond_cf + pso4_6(jl,jk) = pcsi(jl,jk,6)/pcs(jl,jk)*zfcond_cf + pso4_7(jl,jk) = pcsi(jl,jk,7)/pcs(jl,jk)*zfcond_cf + + ! Commit the H2SO4(g) condensing in the cloudy part of the grid box + ! to the largest aerosol mode, assuming that that mode contributes + ! aerosol particles that activated and became cloud droplets: + + IF (pcsi(jl,jk,iso4cs) > 0.0_dp) THEN + paerml(jl,jk,iso4cs) = paerml(jl,jk,iso4cs) + zfcond_cy + ELSEIF (pcsi(jl,jk,iso4as) > 0.0_dp) THEN + paerml(jl,jk,iso4as) = paerml(jl,jk,iso4as) + zfcond_cy + ELSEIF (pcsi(jl,jk,iso4ks) > 0.0_dp) THEN + paerml(jl,jk,iso4ks) = paerml(jl,jk,iso4ks) + zfcond_cy + ELSEIF (pcsi(jl,jk,iso4ns) > 0.0_dp) THEN + paerml(jl,jk,iso4ns) = paerml(jl,jk,iso4ns) + zfcond_cy + ELSEIF (pcsi(jl,jk,7) > 0.0_dp) THEN + pso4_7(jl,jk) = pso4_7(jl,jk) + zfcond_cy + ELSEIF (pcsi(jl,jk,6) > 0.0_dp) THEN + pso4_6(jl,jk) = pso4_6(jl,jk) + zfcond_cy + ELSEIF (pcsi(jl,jk,5) > 0.0_dp) THEN + pso4_5(jl,jk) = pso4_5(jl,jk) + zfcond_cy + ENDIF + + ! Vertically integrate mass of condensed sulfate for diagnostics, + ! converting [molec. cm-3] to [kg(SO4) m-2]: +#ifdef HAMMOZ + d_cond_so4(jl,krow) = d_cond_so4(jl,krow) & + + (((zfcond_cf + zfcond_cy)*mw_so4*1.E3_dp)/avo)*pdz(jl,jk)*zqtmst*delta_time +#endif + ELSE ! H2SO4 condensation sink of the aerosol extremely small: + + ! New grid box-averaged [H2SO4(g)]: + pso4g(jl,jk) = pso4g(jl,jk) + time_step_len*dpso4g(jl,jk) + + ! Number of H2SO4 molecules condensing on the insoluble modes: + ! (Transfer from insoluble to soluble modes is calculated in m7_concoag) + pso4_5(jl,jk) = 0.0_dp + pso4_6(jl,jk) = 0.0_dp + pso4_7(jl,jk) = 0.0_dp + + END IF + END DO + END DO + +END SUBROUTINE m7_prod_cond + + +SUBROUTINE m7_nuck(kproma, kbdim, klev, krow, & + papp1, ptp1, prhp1, paclc, pipr, & + ph2so4, pcs, panew, pa4delt, pdz, & + ppbl) + ! + ! Authors: + ! -------- + ! + ! 2000 J. Wilson and E. Vignati (original code) + ! 2001-2003 P. Stier + ! - F90-version + ! - Changes + ! - Comments + ! - Modularisation + ! - Implemented H2SO4/H2O nucleation scheme (Vehkamaeki et al., JGR 2002) + ! 2008 J. Kazil + ! - Removed H2SO4/H2O nucleation (Kulmala et al., JGR 1998) + ! - Implemented neutral and charged H2SO4/H2O nucleation (Kazil and Lovejoy, ACP 2007) + ! - Implemented organic nucleation parameterizations: + ! activation nucleation (Kulmala et al., ACP 2006) + ! kinetic nucleation (Laakso et al., ACP 2004) + ! - Implemented a cloud correction + ! - Implemented new time integration scheme + ! + ! Interface: + ! ---------- + ! + ! *m7_nuck* is called from *m7* after *m7_prod_cond* + ! + ! Purpose: + ! -------- + ! + ! *m7_nuck* performes the nucleation part of the time integration of the + ! differential equation for sulfate production/condensation/nucleation over a + ! time step. + ! + ! Method: + ! ------- + ! + ! First, the grid box averaged H2SO4 gas phase concentration is converted to + ! the H2SO4 gas phase concentration in the cloud-free portion of the grid box, + ! assuming that [H2SO4(g)] = 0 in the cloudy part. Then the nucleation rate J + ! is calculated for the cloud-free portion of the grid box and the resulting + ! change in gas phase H2SO4 integrated over the time step. From this change, + ! the number of newly formed aerosol particles is calculated. Finally, the + ! concentrations of H2SO4(g) and newly formed aerosol particles are converted + ! to grid box averaged values. + ! + ! Note: The removal rate of H2SO4 from the gas phase due to nucleation and its + ! conversion rate to freshly nucleated particles are approximated with n*J, + ! where n is the H2SO4 content of the smallest newly formed particles. These + ! are approximations which neglect the loss of freshly nucleated particles + ! containing < n H2SO4 molecules onto pre-existing aerosol, and the + ! contribution to new particle formation by coagulation. + ! + ! References: + ! ----------- + ! + ! Vignati, E., Modelling Interactions between Aerosols and + ! Gaseous Compounds in the Polluted Marine Atmosphere. PhD-Thesis, + ! RISO National Laborartory Copenhagen, Riso-R-1163(EN), 1999 + + USE mo_time_control, ONLY: time_step_len!, delta_time + USE mo_kind, ONLY: dp + USE mo_physical_constants, ONLY: avo + USE mo_ham_m7ctl, ONLY: nsnucl, nonucl + USE mo_ham, ONLY: naerocomp, mw_so4 + USE mo_ham_m7_nucl, ONLY: nucl_vehkamaeki, nucl_kazil_lovejoy, & + nucl_activation, nucl_kinetic +#ifdef HAMMOZ + USE mo_time_control, ONLY: delta_time + USE mo_ham_streams, ONLY: d_nuc_so4 + USE mo_memory_g3b, ONLY: forest +#endif + IMPLICIT NONE + + ! + ! Input/output: + ! + + INTEGER :: kproma, kbdim, klev, krow ! ECHAM indices + + REAL(dp):: papp1(kbdim,klev) ! Atmospheric pressure at time t+1 [Pa] + REAL(dp):: ptp1(kbdim,klev) ! Atmospheric temperature at time t+1 [K] + REAL(dp):: prhp1(kbdim,klev) ! Relative humidity at time t+1 [0,1] + REAL(dp):: paclc(kbdim,klev) ! Cloud cover [0,1] + REAL(dp):: pipr(kbdim,klev) ! Ion pair production rate [cm-3 s-1] + REAL(dp):: ph2so4(kbdim,klev) ! Gas phase H2SO4 concentration [molec. cm-3] + REAL(dp):: pcs(kbdim,klev) ! H2SO4 condensation sink [s-1] + REAL(dp):: panew(kbdim,klev) ! Concentration of nucleated particles [cm-3] over a timestep + REAL(dp):: pa4delt(kbdim,klev,naerocomp) ! pa4delt(:,:,1) = Number of H2SO4 per cm-3 added + ! to the nucleation mode due to H2SO4 nucleation over a timestep + REAL(dp):: pdz(kbdim,klev) ! Layer thickness dz for diagnostics [m] + REAL(dp):: ppbl(kbdim) ! Planetary boundary layer top level + + ! + ! Local variables: + ! + + INTEGER :: jk,jl + + REAL(dp):: ztmst,zqtmst,zeps + + REAL(dp):: zrh(kbdim,klev) ! Relative humidity [%] + REAL(dp):: zh2so4_cf0(kbdim,klev) ! Initial gas phase H2SO4 concentration in the cloud-free portion of the grid box [molec. cm-3] + REAL(dp):: zh2so4_cf1(kbdim,klev) ! Final gas phase H2SO4 concentration in the cloud-free portion of the grid box [molec. cm-3] + REAL(dp):: zsnrate(kbdim,klev) ! H2SO4/H2O nucleation rate in the cloud-free portion of the grid box [cm-3 s-1] + REAL(dp):: zsns(kbdim,klev) ! Number of H2SO4 molecules new particles from H2SO4/H2O nucleation + REAL(dp):: zonrate(kbdim,klev) ! Organic aerosol nucleation rate in the cloud-free portion of the grid box [cm-3 s-1] + REAL(dp):: zons(kbdim,klev) ! Number of H2SO4 molecules new particles from organic nucleation + + REAL(dp):: znucrate ! Total nucleation (particle formation) rate + REAL(dp):: zsnucloss ! Total H2SO4(g) loss due to nucleation + + ! Initialisations + + ztmst = time_step_len + + zqtmst = 1.0_dp/ztmst + + zeps = EPSILON(1.0_dp) + + ! Relative humidity [%]: + + zrh(1:kproma,:) = 100.0_dp*prhp1(1:kproma,:) + + ! Gas phase H2SO4 concentration in the cloud-free portion of the grid box: + + DO jk = 1, klev + DO jl = 1, kproma + + IF (paclc(jl,jk) >= 1.0_dp) THEN + zh2so4_cf0(jl,jk) = 0.0_dp + ELSEIF (paclc(jl,jk) <= 0.0_dp) THEN + zh2so4_cf0(jl,jk) = ph2so4(jl,jk) + ELSE + zh2so4_cf0(jl,jk) = ph2so4(jl,jk)/(1.0_dp-paclc(jl,jk)) + ENDIF + + ENDDO + ENDDO + + ! H2SO4/H2O nucleation: + + IF (nsnucl == 1) THEN + CALL nucl_vehkamaeki(kproma,kbdim,klev,ptp1,prhp1,zh2so4_cf0,zsnrate,zsns) + ELSE IF (nsnucl == 2) THEN + CALL nucl_kazil_lovejoy(kproma,kbdim,klev,ptp1,zrh,zh2so4_cf0,pcs,pipr,zsnrate,zsns) + ELSE + zsns(1:kproma,:) = 0.0_dp + zsnrate(1:kproma,:) = 0.0_dp + END IF + + ! Organic nucleation: +#ifdef HAMMOZ + IF (nonucl == 1) THEN + CALL nucl_activation(kproma,kbdim,klev,zh2so4_cf0,forest(:,krow),ppbl,zonrate,zons) + ELSEIF (nonucl == 2) THEN + CALL nucl_kinetic(kproma,kbdim,klev,zh2so4_cf0,forest(:,krow),ppbl,zonrate,zons) + ELSE +#endif + zons(1:kproma,:) = 0.0_dp + zonrate(1:kproma,:) = 0.0_dp +#ifdef HAMMOZ + END IF +#endif + DO jk = 1, klev + DO jl = 1, kproma + + ! Total nucleation (particle formation) rate: + znucrate = zsnrate(jl,jk) + zonrate(jl,jk) + + IF (znucrate > zeps) THEN + + ! H2SO4(g) loss due to nucleation: + zsnucloss = zsns(jl,jk)*zsnrate(jl,jk) + zons(jl,jk)*zonrate(jl,jk) + + ! Calculate the gas phase concentration after nucleation: + ! N(t) = N(0) - (zsnucloss * dt)/( 1 + pcs * dt) + ! [cm-3] = [cm-3] - ([cm-3 s-1] * [s])/([1] + [s-1] * [s]) + zh2so4_cf1(jl,jk) = zh2so4_cf0(jl,jk) - ztmst*zsnucloss/(1.0_dp+ztmst*pcs(jl,jk)) + + ! Safety check: + zh2so4_cf1(jl,jk) = max(zh2so4_cf1(jl,jk),0.0_dp) + zh2so4_cf1(jl,jk) = min(zh2so4_cf1(jl,jk),zh2so4_cf0(jl,jk)) + + ! Calculate concentration of nucleated H2SO4 from the net loss of gas + ! phase H2SO4 in the cloud-free grid box portion, and average it over + ! the grid box: + pa4delt(jl,jk,1) = (zh2so4_cf0(jl,jk)-zh2so4_cf1(jl,jk))*(1.0_dp-paclc(jl,jk)) + + ! Calculate the number of nucleated particles, making sure that total + ! H2SO4 (gas + aerosol contributions) is conserved: + panew(jl,jk) = pa4delt(jl,jk,1)*znucrate/zsnucloss + + ! Calculate the new grid box averaged gas phase H2SO4 concentration: + ph2so4(jl,jk) = ph2so4(jl,jk)-pa4delt(jl,jk,1) +#ifdef HAMMOZ + ! Vertically integrate the mass of nucleated sulfate for diagnostics; + ! convert [molec. cm-3] to [kg(S04) m-2]: + d_nuc_so4(jl,krow) = d_nuc_so4(jl,krow) & + + pa4delt(jl,jk,1)*mw_so4*1.E+03_dp/avo*pdz(jl,jk)*zqtmst*delta_time +#endif + END IF + + END DO + END DO + +END SUBROUTINE m7_nuck + + +SUBROUTINE m7_dnum(kproma, kbdim, klev, krow, & + paerml, paernl, ptp1, & + papp1, pm6rp, prhop, & + !>>dod soa: added pttn + pso4_5, pso4_6, pso4_7, panew, pa4delt, pttn) + !<>dod timers + USE mo_control, ONLY: ltimer + USE mo_hammoz_timer, ONLY: timer_start, timer_stop, timer_ham_m7_coaset, timer_ham_m7_delcoa + !<>dod soa + REAL(dp) :: pttn(kbdim,klev,naerocomp) + !<>dod opt deleted zbfract6 and zbfract7 (not used) + REAL(dp):: zbfract1(kbdim,klev,nclass-1),zbfract2(kbdim,klev,nclass-1), & + zbfract5(kbdim,klev,3) + !<>dod opt changed from 4-D (kbdim,klev,nclass,nclass) to 3-D (kbdim,klev,ncoag) + REAL(dp):: zcom(kbdim,klev,ncoag) + !<>dod timers + IF (ltimer) CALL timer_start(timer_ham_m7_coaset) + !<>dod opt added krow for debugging + IF (lscoag) CALL m7_coaset(kproma, kbdim, klev, krow, paernl, ptp1, & + papp1, pm6rp, prhop, zcom ) +#ifdef HAMMOZ + !>>dod timers + IF (ltimer) CALL timer_stop(timer_ham_m7_coaset) + !<>dod opt changed indexing of zcom + za(jl,jk,1)=zcom(jl,jk,1)/2._dp ! Unimodal coagulation + za(jl,jk,2)=zcom(jl,jk,8)/2._dp ! only allowed for modes + za(jl,jk,3)=zcom(jl,jk,14)/2._dp ! 1,2,3 and 5. + za(jl,jk,4)=0._dp + za(jl,jk,5)=zcom(jl,jk,16)/2._dp + za(jl,jk,6)=0._dp + za(jl,jk,7)=0._dp + !<>dod opt changed indexing of zcom + zbfract1(jl,jk,1)=zcom(jl,jk,2)*paernl(jl,jk,2) + zbfract1(jl,jk,2)=zcom(jl,jk,3)*paernl(jl,jk,3) + zbfract1(jl,jk,3)=zcom(jl,jk,4)*paernl(jl,jk,4) + zbfract1(jl,jk,4)=zcom(jl,jk,5)*paernl(jl,jk,5) + zbfract1(jl,jk,5)=zcom(jl,jk,6)*paernl(jl,jk,6) + zbfract1(jl,jk,6)=zcom(jl,jk,7)*paernl(jl,jk,7) + !<>dod moved IF to try to improve prefetch + !<>dod changed zcom indexing...also commented out pointless calculation + zbfract2(jl,jk,2)=zcom(jl,jk,9)*paernl(jl,jk,3) + zbfract2(jl,jk,3)=zcom(jl,jk,10)*paernl(jl,jk,4) + ! zbfract2(jl,jk,4)=zcom(jl,jk,11)*paernl(jl,jk,5) + zbfract2(jl,jk,4)=0._dp + zbfract2(jl,jk,5)=zcom(jl,jk,12)*paernl(jl,jk,6) + zbfract2(jl,jk,6)=zcom(jl,jk,13)*paernl(jl,jk,7) + !<>dod moved IF to try to improve prefetch + !<>dod removed calculation for modes 6 and 7, which were not used + + END DO + END DO + + ELSE + + za(:,:,:) = 0._dp + zb(:,:,:) = 0._dp + zbfract1(:,:,:) = 0._dp + zbfract2(:,:,:) = 0._dp + zbfract5(:,:,:) = 0._dp + !>>dod removed modes 6 and 7 + + END IF !(lscoag) +#ifdef HAMMOZ + !>>dod timers + IF (ltimer) CALL timer_start(timer_ham_m7_delcoa) + !<>dod soa added krow and pttn to call of m7_delcoa + CALL m7_delcoa(kproma, kbdim, klev, krow, paerml, & + paernl, pm6rp, pttn, pa4delt, panew, & + za, zb, zbfract1, zbfract2, & + zbfract5, pso4_5, pso4_6, pso4_7 ) +#ifdef HAMMOZ + !>>dod timers + IF (ltimer) CALL timer_stop(timer_ham_m7_delcoa) + !<>dod replaced isoa_ix + USE mo_species, ONLY: speclist + USE mo_ham_soa, ONLY: soaprop + !<>dod deleted arrays zsumm, sumn + !< re-introduction of the variables zsumm/-n + ! in the buggy version, zsumm + REAL(dp) :: zsumn(kbdim,klev,nclass), & ! new number concentration + zsumm(kbdim,klev,naerocomp) ! new mass concentration + + REAL(dp) :: zfconn(kbdim,klev,nclass), zfconm(kbdim,klev,nclass) + + REAL(dp) :: zdummy, & ! Unused output from m7_cumulative_normal + zr1, & ! Mode lower boundary (cm) + zr2, & ! Mode upper boundary (cm) + zmr1, & ! Mass equivalent of zr1 + zmr2, & ! Mass equivalent of zr2 + zdm, & ! Radius of average mass of the mode + zdm3, & ! zdm**3 + zdens ! density + + REAL(dp) :: zt ! see comments above + + REAL(dp) :: zeps + + REAL(dp) :: zcdf1, zr23, zmrad + + INTEGER :: ispec, iaero, isoans, isoaks, isoaas, isoacs + + !--------------------------------------------------------------------------------------------- + + + !------- executable procedure ---------------------------------------------------------------- + + !--- 0) Initialisations: ---------------------------------------------------------- + + zfconm(:,:,:) = 1._dp + zfconn(:,:,:) = 1._dp + + zeps = EPSILON(1._dp) + + ! + !--- 1) Identify how much the mode jclass has grown into the next higher mode + ! All compound masses are expressed in cgs units in this subroutine + ! For sulphate, held in molecules per cm-3 in paerml, we1 have to convert units + + DO jclass=1,nsol-1 + + !--- Total volume mixing ratio the mode - assumed to be the sum of the vmr's of the + ! individual compounds + + ! Start with inorganics, bc and nonvolatiles (oc) + + SELECT CASE(jclass) + CASE(inucs) + ! Sulphate mmr in molecules cm-3 -> g cm-3 + ztotmass(1:kproma,:) = paerml(1:kproma,:,iso4ns)*zfacso4m + ! Sulphate in molecules cm-3 -> vmr + ztotvmr(1:kproma,:) = paerml(1:kproma,:,iso4ns)*zfacso4v + + CASE(iaits) + ztotmass(1:kproma,:) = paerml(1:kproma,:,iso4ks)*zfacso4m + & + zfac2cgs*(paerml(1:kproma,:,ibcks) + paerml(1:kproma,:,iocks)) + + ztotvmr(1:kproma,:) = paerml(1:kproma,:,iso4ks)*zfacso4v + & + zfac2cgs*(paerml(1:kproma,:,ibcks)/dbc+paerml(1:kproma,:,iocks)/doc) + + CASE(iaccs) + ztotmass(1:kproma,:) = paerml(1:kproma,:,iso4as)*zfacso4m + & + zfac2cgs*(paerml(1:kproma,:,ibcas) + paerml(1:kproma,:,iocas) + & + paerml(1:kproma,:,issas) + paerml(1:kproma,:,iduas) ) + + ztotvmr(1:kproma,:) = paerml(1:kproma,:,iso4as)*zfacso4v + & + zfac2cgs*(paerml(1:kproma,:,ibcas)/dbc+paerml(1:kproma,:,iocas)/doc+ & + paerml(1:kproma,:,issas)/dnacl+paerml(1:kproma,:,iduas)/ddust) + + END SELECT + + !--- Add SOA for all modes + + IF (nsoa == 1 .AND. sizeclass(jclass)%lsoainclass) THEN + DO jm = 1,nsoaspec ! SOA in ug m-3 -> vmr + ispec = soaprop(jm)%spid_soa + iaero = speclist(ispec)%iaerocomp(jclass) + zdens = 1.E-3_dp*aerocomp(iaero)%species%density + ztotmass(1:kproma,:) = ztotmass(1:kproma,:) + zfac2cgs*paerml(1:kproma,:,iaero) + ztotvmr(1:kproma,:) = ztotvmr(1:kproma,:) + & + zfac2cgs*paerml(1:kproma,:,iaero)/zdens + END DO + END IF + + !--- Set minimum radius and maximum radius: + + zr1 = crdiv(jclass) + zr2 = crdiv(jclass+1) + + !--- Radius of average mass for a lognormal distribution + ! @@@ TO DO: Move this to mo_ham_m7ctl + + zdm = EXP((LOG(zr1)+LOG(zr2))/2.0_dp)*cmr2ram(jclass) + zdm3 = zdm**3 + + !--- For calculating average mass of particles of radius zr1 and zr2 within the gridpoint loop + + zr23 = zr2**3 ! Mode upper boundary + zmr1 = z4piover3*(zr1**3) ! Mode volume lower boundary + + DO jk=1,klev + DO jl=1,kproma + + zmrad = pm6dry(jl,jk,jclass) + + IF ((paernl(jl,jk,jclass) > cmin_aernl) .AND. (zmrad > cminrad) & + .AND. ztotvmr(jl,jk) > 0._dp) THEN + + !--- Average mass of a particle in the mode + zttnj = ztotmass(jl,jk)/paernl(jl,jk,jclass) + + !--- Average particle density: + zavdens = ztotmass(jl,jk)/ztotvmr(jl,jk) + + !--- mass of a particle with radius zdm + zavnj = z4piover3*zdm3*zavdens + + !--- mass of a particle with radius zr2 + zmr2 = z4piover3*zr23*zavdens + + !--- If the average mass contained in the mode is larger than the average mass + ! for a particle with radius zdm, the transfer of number and mass is done, + ! from mode jclass to mode jclass+1. Not for the coarse mode, obviously, but + ! this is taken care of by the fact that zfconn =1 for the coarse mode + + IF (zttnj > zavnj) THEN + + IF (jclass /= icoas) THEN + + + !--- Calculate the cumulative of the log-normal number distribution: + ! Fraction of particles having radius < upper mode boundary + ! Input to m7_cumnor is t as described in the comments at the beginning of the + ! subroutine. t = [log(crdiv(jnum+1)-log(pm6dry(jclass))]/sigmaln(jclass) + ! t is the distance of the CMD of the mode from the upper threshold mode + ! diameter in terms of geometric standard deviations: + ! Output from m7_cumnor is zfconn(:,:,jclass), see description under 'parameters' + ! in the comments at the beginning of the subroutine + + zt = LOG(zr2/zmrad)/sigmaln(jclass) + !DIR$ INLINE + CALL m7_cumulative_normal(zt, zcdf1, zdummy) + + ! if mode cmr >> upper mode boundary (this can happen due to SOA condensation) + ! m7_cumulative_normal can return cumulative distribution functions < zeps at the mode + ! boundary. Then no transfer would take place even though the particles have grown + ! by more than an order of magnitude. So the following Q&D is applied until someone + ! thinks of something better. + + IF (zmrad > (zr2*10._dp)) THEN + zfconn(jl,jk,jclass) = 0._dp + ELSE + IF (zcdf1 > zeps) zfconn(jl,jk,jclass) = zcdf1 + END IF + + !--- Numbers transferred + znt=(1.0_dp-zfconn(jl,jk,jclass))*paernl(jl,jk,jclass) + + !---mass transferred + IF (ztotmass(jl,jk) > 0._dp .AND. paernl(jl,jk,jclass) > 0._dp .AND. znt > 0._dp) THEN + + !--- Mass remaining in the mode + zmrj = zfconn(jl,jk,jclass)*paernl(jl,jk,jclass)*zavnj + zmrj = MAX(zmrj, 0._dp) + + !--- Mass transferred + zmt = ztotmass(jl,jk)-zmrj + + zfconm(jl,jk,jclass)=zmrj/ztotmass(jl,jk) + + !--- If the average mass of particle transferred is smaller than the average mass + ! mass of particles with radius zmr2 then reduce the particles transferred + ! so that average mass per particle transferred is (zmr2*zavdens) + + IF ((zmt/znt) < zmr2 ) THEN + zfconn(jl,jk,jclass) = 1.0_dp - & + (zmt/zmr2)/paernl(jl,jk,jclass) + END IF + ELSE + zfconn(jl,jk,jclass) = 1._dp + zfconm(jl,jk,jclass) = 1._dp + END IF + + END IF + + END IF !--- end IF avg mass =< mass for radius zdm + END IF !--- end IF enough particles + + END DO + END DO + END DO + + ! ---- number concentrations ------------------------------------------------------------------------------- + + ! Nucleation mode: particles that stay in nucl. mode + + zsumn(1:kproma,:,inucs) = paernl(1:kproma,:,inucs)*zfconn(1:kproma,:,inucs) + + ! Aitken mode: particles that stay in aitken mode (do not transfer into accum. mode) plus + ! particles transferred from the nucl. mode (considering upwards transfer) + + zsumn(1:kproma,:,iaits) = paernl(1:kproma,:,iaits)*zfconn(1:kproma,:,iaits) + & + paernl(1:kproma,:,inucs)*(1._dp-zfconn(1:kproma,:,inucs)) + + ! Accumulation mode: particles that stay in accum. mode plus: + ! particles transferred from the aitken soluble mode + + zsumn(1:kproma,:,iaccs) = paernl(1:kproma,:,iaccs)*zfconn(1:kproma,:,iaccs) + & + paernl(1:kproma,:,iaits)*(1._dp-zfconn(1:kproma,:,iaits)) + + ! Coarse mode: particles that stay in coarse mode plus particles transferred from accum. mode + + zsumn(1:kproma,:,icoas) = paernl(1:kproma,:,icoas) + & + paernl(1:kproma,:,iaccs)*(1._dp-zfconn(1:kproma,:,iaccs)) + +!csld bug burden + ! Store the final number concentration + paernl(1:kproma,:,inucs) = zsumn(1:kproma,:,inucs) + paernl(1:kproma,:,iaits) = zsumn(1:kproma,:,iaits) + paernl(1:kproma,:,iaccs) = zsumn(1:kproma,:,iaccs) + paernl(1:kproma,:,icoas) = zsumn(1:kproma,:,icoas) + !end csld bug burden + ! ---- end number concentrations --------------------------------------------------------------------------- + + ! ---- sulphate mass --------------------------------------------------------------------------------------- + + ! Nucleation mode: mass that stays in nucl. mode + + zsumm(1:kproma,:,iso4ns) = paerml(1:kproma,:,iso4ns)*zfconm(1:kproma,:,inucs) + + ! Aitken mode: mass that stays in aitken mode plus mass transferred from the nucl. mode + + zsumm(1:kproma,:,iso4ks) = paerml(1:kproma,:,iso4ks)*zfconm(1:kproma,:,iaits) + & + paerml(1:kproma,:,iso4ns)*(1._dp-zfconm(1:kproma,:,inucs)) + + ! Accumulation mode: mass that stays in accum. mode plus mass transferred from the aitken mode + + zsumm(1:kproma,:,iso4as) = paerml(1:kproma,:,iso4as)*zfconm(1:kproma,:,iaccs) + & + paerml(1:kproma,:,iso4ks)*(1._dp-zfconm(1:kproma,:,iaits)) + + ! Coarse mode: mass that stays in coarse mode plus mass transferred from accum. mode + + zsumm(1:kproma,:,iso4cs) = paerml(1:kproma,:,iso4cs) + & + paerml(1:kproma,:,iso4as)*(1._dp-zfconm(1:kproma,:,iaccs)) + + !csld bug burden + ! Store the final sulphate mass concentrations + paerml(1:kproma,:,iso4ns) = zsumm(1:kproma,:,iso4ns) + paerml(1:kproma,:,iso4ks) = zsumm(1:kproma,:,iso4ks) + paerml(1:kproma,:,iso4as) = zsumm(1:kproma,:,iso4as) + paerml(1:kproma,:,iso4cs) = zsumm(1:kproma,:,iso4cs) + !end csld + ! ---- end sulphate mass ----------------------------------------------------------------------------------- + + ! ---- SOA mass -------------------------------------------------------------------------------------------- + + IF (nsoa == 1) THEN + DO jm = 1,nsoaspec + ispec = soaprop(jm)%spid_soa + + ! Nucleation mode: mass that stays in nucl. mode + IF (sizeclass(inucs)%lsoainclass) THEN + isoans = speclist(ispec)%iaerocomp(inucs) + zsumm(1:kproma,:,isoans) = paerml(1:kproma,:,isoans)*zfconm(1:kproma,:,inucs) + END IF + + ! Aitken mode: mass that stays in aitken mode plus mass transferred from the nucl. mode + isoaks = speclist(ispec)%iaerocomp(iaits) + + zsumm(1:kproma,:,isoaks) = paerml(1:kproma,:,isoaks)*zfconm(1:kproma,:,iaits) + + IF (sizeclass(inucs)%lsoainclass) THEN + zsumm(1:kproma,:,isoaks) = zsumm(1:kproma,:,isoaks) + & + paerml(1:kproma,:,isoans)*(1._dp-zfconm(1:kproma,:,inucs)) + END IF + + ! Accumulation mode: mass that stays in accum. mode plus: + ! mass transferred from the aitken mode + isoaas = speclist(ispec)%iaerocomp(iaccs) + + zsumm(1:kproma,:,isoaas) = paerml(1:kproma,:,isoaas)*zfconm(1:kproma,:,iaccs) + & + paerml(1:kproma,:,isoaks)*(1._dp-zfconm(1:kproma,:,iaits)) + + ! Coarse mode: mass that stays in coarse mode plus mass transferred from accum. mode + isoacs = speclist(ispec)%iaerocomp (icoas) + + zsumm(1:kproma,:,isoacs) = paerml(1:kproma,:,isoacs) + & + paerml(1:kproma,:,isoaas)*(1._dp-zfconm(1:kproma,:,iaccs)) + +!csld bug burden + IF (sizeclass(inucs)%lsoainclass) THEN + isoans = speclist(ispec)%iaerocomp(inucs) + paerml(1:kproma,:,isoans)=zsumm(1:kproma,:,isoans) + ENDIF + paerml(1:kproma,:,isoaks)=zsumm(1:kproma,:,isoaks) + paerml(1:kproma,:,isoaas)=zsumm(1:kproma,:,isoaas) + paerml(1:kproma,:,isoacs)=zsumm(1:kproma,:,isoacs) +!end csld + END DO + END IF + + ! ---- end SOA mass ---------------------------------------------------------------------------------------- + + ! ---- Black carbon (bc) and nonvolatile organic carbon (oc) mass ------------------------------------------ + + ! Aitken mode: mass that stays in aitken mode + + zsumm(1:kproma,:,ibcks) = paerml(1:kproma,:,ibcks)*zfconm(1:kproma,:,iaits) + + zsumm(1:kproma,:,iocks) = paerml(1:kproma,:,iocks)*zfconm(1:kproma,:,iaits) + + ! Accumulation mode: mass that stays in accum. mode plus: + ! mass transferred from the aitken mode + + zsumm(1:kproma,:,ibcas) = paerml(1:kproma,:,ibcas)*zfconm(1:kproma,:,iaccs) + & + paerml(1:kproma,:,ibcks)*(1._dp-zfconm(1:kproma,:,iaits)) + + zsumm(1:kproma,:,iocas) = paerml(1:kproma,:,iocas)*zfconm(1:kproma,:,iaccs) + & + paerml(1:kproma,:,iocks)*(1._dp-zfconm(1:kproma,:,iaits)) + + + ! Coarse mode: mass that stays in coarse mode plus mass transferred from accum. mode + + zsumm(1:kproma,:,ibccs) = paerml(1:kproma,:,ibccs) + & + paerml(1:kproma,:,ibcas)*(1._dp-zfconm(1:kproma,:,iaccs)) + + zsumm(1:kproma,:,ioccs) = paerml(1:kproma,:,ioccs) + & + paerml(1:kproma,:,iocas)*(1._dp-zfconm(1:kproma,:,iaccs)) + +!csld bug burden + ! Store the final mass concentrations + paerml(1:kproma,:,ibcks) = zsumm(1:kproma,:,ibcks) + paerml(1:kproma,:,iocks) = zsumm(1:kproma,:,iocks) + paerml(1:kproma,:,ibcas) = zsumm(1:kproma,:,ibcas) + paerml(1:kproma,:,iocas) = zsumm(1:kproma,:,iocas) + paerml(1:kproma,:,ibccs) = zsumm(1:kproma,:,ibccs) + paerml(1:kproma,:,ioccs) = zsumm(1:kproma,:,ioccs) + !end csld + ! ---- end black carbon (bc) and nonvolatile organic carbon (oc) mass -------------------------------------- + + + ! ---- sea salt and dust mass ------------------------------------------------------------------------------ + + ! Accumulation mode: mass that stays in accum. mode + + zsumm(1:kproma,:,issas) = paerml(1:kproma,:,issas)*zfconm(1:kproma,:,iaccs) + + zsumm(1:kproma,:,iduas) = paerml(1:kproma,:,iduas)*zfconm(1:kproma,:,iaccs) + + ! Coarse mode: mass that stays in coarse mode plus mass transferred from accum. mode + + zsumm(1:kproma,:,isscs) = paerml(1:kproma,:,isscs) + & + paerml(1:kproma,:,issas)*(1._dp-zfconm(1:kproma,:,iaccs)) + + zsumm(1:kproma,:,iducs) = paerml(1:kproma,:,iducs) + & + paerml(1:kproma,:,iduas)*(1._dp-zfconm(1:kproma,:,iaccs)) + +!csld bug burden + ! ---- store the mass concentrations + paerml(1:kproma,:,issas) = zsumm(1:kproma,:,issas) + paerml(1:kproma,:,iduas) = zsumm(1:kproma,:,iduas) + paerml(1:kproma,:,isscs) = zsumm(1:kproma,:,isscs) + paerml(1:kproma,:,iducs) = zsumm(1:kproma,:,iducs) + !end csld + ! ---- end sea salt and dust mass -------------------------------------------------------------------------- + +END SUBROUTINE m7_dconc + + +SUBROUTINE m7_coaset(kproma, kbdim, klev, krow, paernl, ptp1, & + papp1, pm6rp, prhop, pcom ) + + ! + ! *m7_coaset* calculates the coagulation kernels between the modes + ! + ! Authors: + ! --------- + ! J. Wilson and E. Vignati, JRC/EI (original source) 09/2000 + ! P. Stier, MPI (f90-version, changes, comments) 2001 + ! + ! Modifications: + ! -------------- + ! Philip Stier, MPI 2001 + ! Declan O'Donnell, MPI-M, 2009: performance improvements + ! + ! Purpose + ! --------- + ! This routine calculates the coaglation kernels between particles + ! with the count median radii of the three modes. + ! Coagulation allowed between the following modes: + ! soluble modes: 1+1=1, 2+2=2, 1+2=2, 1+3=3, 1+4=4, 2+3=3, 2+4=4 + ! insoluble modes: 2i+2i=2i + ! mixed modes: 1+2i=2, 1+4i=4, 2+2i=2, 2+4i=4, 3+2i=3, 4+2i=4 + ! + ! Interface: + ! ----------- + ! *m7_coaset* is called from *m7_dnum* + ! + ! Externals: + ! ----------- + ! none + ! + ! Reference: + ! ----------- + ! The calculations are based on: + ! Fuchs, N.A. (1964). The Mechanics of Aerosols. Pergamon Press. Oxford. + ! (Chapter VII, Section 49) + ! + ! Warning: + ! -------- + ! For optimization purposes currently only "physically reasonable" elements of the + ! coagulation kernel pcom are calculated in m7_concoag. These elements are specified + ! in the matrix locoagmask in mo_ham_m7ctl. Check carefully and adapt locoagmask + ! accordingly before changes in the code below. + ! + USE mo_ham, ONLY: nclass + USE mo_kind, ONLY: dp + USE mo_ham_m7ctl, ONLY: bk, ncoag, coag_modes, & + cmin_aernl, cminrad, cminrho + USE mo_math_constants, ONLY: pi, sqrt2 + ! + + IMPLICIT NONE + ! + !--- Parameter list: + ! + ! paernl = aerosol number for each mode [cm-3] + ! ptp1 = atmospheric temperature at time t+1 [K] + ! papp1 = atmospheric pressure at time t+1 [Pa] + ! pm6rp = mean mode actual radius (wet radius for soluble modes + ! and dry radius for insoluble modes) [cm] + ! prhop = mean mode particle density [g cm-3] + ! pcom(:,:,jm) = Coagulation coefficient + ! + !--- List of local variables: + ! + ! zwlc = mean free pathlength [] + ! zairvisc = air viscosity [] + ! zrpav = average radius of the two interacting modes + ! zpvx = volume of the xth interacting mode + ! zpmx = mass of the xth interacting mode + ! + ! zrknudx = knudsen number of the xth interacting mode + ! zpd2x = particle diffusion of the xth interacting mode + ! + !---subroutine interface + INTEGER, INTENT(IN) :: kproma, kbdim, klev, krow + REAL(dp), INTENT(IN) :: ptp1(kbdim,klev) + REAL(dp), INTENT(IN) :: papp1(kbdim,klev) + REAL(dp), INTENT(IN) :: pm6rp(kbdim,klev,nclass) + REAL(dp), INTENT(IN) :: prhop(kbdim,klev,nclass) + REAL(dp), INTENT(IN) :: paernl(kbdim,klev,nclass) + REAL(dp), INTENT(OUT) :: pcom(kbdim,klev,ncoag) + + !--- Local variables: + ! Parameters: + REAL(dp), PARAMETER :: zbkover6pi = bk / (6._dp*pi) + REAL(dp), PARAMETER :: z4piover3 = 4._dp*pi/3._dp + REAL(dp), PARAMETER :: z16pi = 16._dp*pi + REAL(dp), PARAMETER :: z8overpi = 8._dp/pi + REAL(dp), PARAMETER :: z8bkoverpi = 8._dp*bk/pi + REAL(dp), PARAMETER :: qsqrt2 = 1._dp / sqrt2 + + ! Local variables + INTEGER :: jm, jm2, jm1, jl, jk, jclass + ! + REAL(dp) :: zbtketc(kbdim,klev) + REAL(dp) :: zwlc(kbdim,klev) + REAL(dp) :: zpd(kbdim,klev,nclass) + REAL(dp) :: zcv2(kbdim,klev,nclass) + REAL(dp) :: zh2(kbdim,klev,nclass) + + LOGICAL :: lsuffaero(kbdim,klev,nclass) + + REAL(dp):: zairvisc, zeps, & + zrpvm, z2rpvm, zrpav, zpv1, & + zpm1, & + zcv2av, zrknud, & + ze, & + zpdav, zxd, & + zh2av, zcoc, zhu1, & + zhu2, zhu + + !---executable procedure + zeps = EPSILON(1._dp) + + !---1) gridpoint properties + DO jk=1,klev + DO jl=1,kproma + + !--- Mean free pathlength ? (from Knudsen Number below): + ! Parametrisation? + ! Grid point calculation, can be done once rather than 16 times. + ! old: + ! zpbyone=1000.0_dp / (papp1(jl,jk)/100.0_dp) + ! zwlc(jl,jk)=6.6e-6_dp * ptp1(jl,jk) / 293.15_dp * zpbyone + ! new: + zwlc(jl,jk) = 2.251E-3_dp * ptp1(jl,jk) / papp1(jl,jk) + + !--- Viscosity: (291.15..?) + zairvisc=1.827e-4_dp * (ptp1(jl,jk) / 291.15_dp)**0.74_dp + + !--- + zbtketc(jl,jk) = zbkover6pi * ptp1(jl,jk) / zairvisc + + END DO + END DO + + !---2) Per-mode properties + DO jclass=1,nclass + DO jk=1,klev + DO jl=1,kproma + + lsuffaero(jl,jk,jclass) = (paernl(jl,jk,jclass) > cmin_aernl .AND. & + pm6rp(jl,jk,jclass) > cminrad .AND. & + prhop(jl,jk,jclass) > cminrho) + + IF (lsuffaero(jl,jk,jclass)) THEN + + !---mode radius + zrpvm = pm6rp(jl,jk,jclass) + + !--- Volume and mass of mode: + zpv1=z4piover3 * zrpvm**3 + zpm1=zpv1 * prhop(jl,jk,jclass) + + !--- Squared mean particle velocity of mode: + zcv2(jl,jk,jclass)=z8bkoverpi * ptp1(jl,jk) / zpm1 + + !---Knudsen number of the mode: + zrknud=0.5_dp*zwlc(jl,jk)/zrpvm + + !---Diffusivity of the mode: + ze=EXP(-0.43_dp/zrknud) + zpd(jl,jk,jclass)=zbtketc(jl,jk) * (1.0_dp + zrknud*2.492_dp + zrknud*0.84_dp*ze) / zrpvm + + !--- Average mean free path of particles in the mode: + zxd=z8overpi * zpd(jl,jk,jclass) / SQRT(zcv2(jl,jk,jclass)) + + !--- Mean distance from surface after mean free path (Eq. 49.13): + z2rpvm = 2._dp*zrpvm + zh2(jl,jk,jclass)=(((z2rpvm + zxd)**3 - & + SQRT((z2rpvm*z2rpvm + zxd*zxd)**3) ) / & + (6.0_dp*zrpvm*zxd) - z2rpvm ) * sqrt2 + + ELSE + zpd(jl,jk,jclass) = 0._dp + zcv2(jl,jk,jclass) = 0._dp + zh2(jl,jk,jclass) = 0._dp + END IF + + END DO + END DO + END DO + + !--- 1) Calculation of the coagulation coefficient: --------------------------- + ! + DO jm=1,ncoag + + jm1 = coag_modes(jm)%mode1 + jm2 = coag_modes(jm)%mode2 + + DO jk=1,klev + DO jl=1,kproma + + IF (lsuffaero(jl,jk,jm1) .AND. lsuffaero(jl,jk,jm2)) THEN + !--- Average radius of the modes: + zrpav=zeps+0.5_dp*(pm6rp(jl,jk,jm1)+pm6rp(jl,jk,jm2)) + + !--- Fuchs: G_r (below Eq. 49.27): + zcv2av=SQRT(zcv2(jl,jk,jm1) + zcv2(jl,jk,jm2)) + + !--- Average diffusivity of the modes: + zpdav=0.5_dp*(zpd(jl,jk,jm1) + zpd(jl,jk,jm2)) + + !--- Fuchs: delta_r !@@@ (why division by sqrt2?) + !>>dod deleted the division by sqrt(2) (redmine #58) + zh2av=SQRT(zh2(jl,jk,jm1)*zh2(jl,jk,jm1) + zh2(jl,jk,jm2)*zh2(jl,jk,jm2)) + !<>dod soa added pttn, removed bc, oc, dust averages + pa4av1, pa4av2, pttn, & + pso4_5, pso4_6, pso4_7, & +!<>dod soa + USE mo_ham, ONLY: nsoa, nsoaspec, naerocomp, nclass + USE mo_ham_soa, ONLY: soaprop + !>>dod deleted isoa_ix + USE mo_species, ONLY: speclist + !< zso4x/zcrtcst is the total number of particles that could be moved + ! from insoluble mode x to soluble modes. + ! + ! zcrit_x = total available number of particles in mode x that are moved from + ! insoluble mode x to the corresponding soluble mode. + !>>dod soa added krow + INTEGER :: kproma, kbdim, klev, krow + !<>dod soa removed bc, oc and du averages + pa4av1(kbdim,klev), pa4av2(kbdim,klev) + !<>dod soa + REAL(dp) :: pttn(kbdim,klev,naerocomp) + !<>dod soa + INTEGER :: jm, jn, jn2, jspec + !<= cmin_aernl .AND. zcrtcst(5)>zeps) THEN + zcrit_5=MIN(paernl(jl,jk,iaiti), zso45/zcrtcst(5)) + ELSE + zcrit_5=0._dp + END IF + IF(paernl(jl,jk,iacci) >= cmin_aernl .AND. zcrtcst(6)>zeps) THEN + zcrit_6=MIN(paernl(jl,jk,iacci), zso46/zcrtcst(6)) + ELSE + zcrit_6=0._dp + END IF + IF(paernl(jl,jk,icoai) >= cmin_aernl .AND. zcrtcst(7)>zeps) THEN + zcrit_7=MIN(paernl(jl,jk,icoai), zso47/zcrtcst(7)) + ELSE + zcrit_7=0._dp + END IF + + !--- 1.3) Number of particles moved from the mode 5 to 2 due to + ! interaction with 1 and due to condensation: + + paernl(jl,jk,iaits)=paernl(jl,jk,iaits)+zcrit_5 + paernl(jl,jk,iaiti)=paernl(jl,jk,iaiti)-zcrit_5 + + !--- 1.4) Mass moved from mode 5 to 2: + + pa4delt(jl,jk,2)=pa4delt(jl,jk,2)+pso4_5(jl,jk) + pa4delt(jl,jk,ibcks)=pa4delt(jl,jk,ibcks)+zcrit_5 * 1.E12_dp * pttn(jl,jk,ibcki) + pa4delt(jl,jk,iocks)=pa4delt(jl,jk,iocks)+zcrit_5 * 1.E12_dp * pttn(jl,jk,iocki) + + !>>dod soa + IF (nsoa ==1) THEN + DO jm=1,nsoaspec + IF (.NOT. soaprop(jm)%lvolatile) THEN + !>>dod deleted isoa_ix + jspec = soaprop(jm)%spid_soa + jn = speclist(jspec)%iaerocomp(iaits) + jn2 = speclist(jspec)%iaerocomp(iaiti) + !<>dod soa + IF (nsoa == 1) THEN + DO jm=1,nsoaspec + IF (.NOT. soaprop(jm)%lvolatile) THEN + !>>dod deleted isoa_ix + jspec = soaprop(jm)%spid_soa + jn = speclist(jspec)%iaerocomp(iaiti) + !<>dod soa + pa4delt(jl,jk,iso4as)=pa4delt(jl,jk,iso4as)+pso4_6(jl,jk) + pa4delt(jl,jk,iduas)=pa4delt(jl,jk,iduas)+zcrit_6 * 1.E12_dp * pttn(jl,jk,iduai) + !<>dod soa + paerml(jl,jk,iduai)=paerml(jl,jk,iduai)-zcrit_6 * 1.E12_dp * pttn(jl,jk,iduai) + !<>dod soa + pa4delt(jl,jk,iso4cs)=pa4delt(jl,jk,iso4cs)+pso4_7(jl,jk) + pa4delt(jl,jk,iducs)=pa4delt(jl,jk,iducs)+zcrit_7 * 1.E12_dp * pttn(jl,jk,iduci) + + !--- 1.11) Mass remaining in mode 7: + + paerml(jl,jk,iduci)=paerml(jl,jk,iduci)-zcrit_7 * 1.E12_dp * pttn(jl,jk,iduci) + + END DO + END DO + +END SUBROUTINE m7_concoag + + + SUBROUTINE m7_coat(pm6rp_lon_lev, pcrtcst) + + ! Purpose: + ! --------- + ! *m7_coat* calculates the number of sulfate + ! molecules required to coat a particle + ! with cLayerThickness of sulfate + ! + ! Author: + ! --------- + ! Philip Stier, MPI 2001 + ! + ! Interface: + ! --------- + ! *m7_coat* is called from *m7_concoag* + ! + + USE mo_ham, ONLY: nclass + USE mo_kind, ONLY: dp + USE mo_math_constants, ONLY: pi + USE mo_ham_m7ctl, ONLY: so4_coating_threshold, & + cmr2ras + + IMPLICIT NONE + + INTEGER :: jclass + + REAL(dp) :: pm6rp_lon_lev(nclass) ! Ambient radii for current + ! longitude and level [cm] + REAL(dp) :: pcrtcst(nclass) ! Critical constant, i.e. number of + ! sulfate to cover an average particle + ! of the mode with a layer of the + ! thickness determined by cLayerThickness. + REAL(dp) :: zras(nclass) ! Radius of average surface + ! for a single particle [cm] + REAL(dp) :: zas(nclass) ! Average surface + ! for single particle [cm+2] + + REAL(dp), PARAMETER :: csurf_molec = 2.39E-15_dp ! Average cross-section + ! of a single H2SO4 molecule [cm+2] + + !--- 1) Calculate the radii of average surface for modes 5-7: + + zras(5) = pm6rp_lon_lev(5) * cmr2ras(5) + zras(6) = pm6rp_lon_lev(6) * cmr2ras(6) + zras(7) = pm6rp_lon_lev(7) * cmr2ras(7) + + DO jclass=5, 7 + + !--- 2) Calculate the average surface of an particle for modes 5-7: + + zas(jclass) = 4._dp * zras(jclass)**2 * pi + + !--- 3) Determine the number of sulfate molecules needed to form + ! a cLayerThickness thick layer of sulfate on the particles + ! in modes 5-7: + + pcrtcst(jclass) = (zas(jclass) / csurf_molec) * so4_coating_threshold + + END DO + + END SUBROUTINE m7_coat + + + + SUBROUTINE m7_delcoa(kproma, kbdim, klev, krow, paerml, & + !>>dod soa (added pttn) + paernl, pm6rp, pttn, pa4delt, panew, & + !<1 1+2=>2 1+3=>3, 2+2=>2 2+3=>3, 3+3=>3. + ! zc is now non zero for mode 1 only (nucleation). + ! All formation of higher mode particles is handled in dconc. + ! + ! For climatological studies, 5 day accumulation mode concs are + ! within a factor of 2 of the full model. + ! + ! Interface + ! ----------- + ! *m7_delcoa* is called from *m7_dnum* + ! + ! Externals + ! ----------- + ! none + ! + + USE mo_kind, ONLY: dp + USE mo_time_control, ONLY: time_step_len + USE mo_ham_m7ctl, ONLY: cmin_aernl, cmin_aerml, & + iaiti, ibcki, iocki, ibcks, & + iocks, ibcas, iocas, ibccs, & + ioccs, iacci, & + !>>dod soa + iso4ns, iso4ks, iso4as, iso4cs, & + icoai, iaits, inucs, iaccs, & + icoas + !<>dod deleted isoa_ix + USE mo_ham_soa, ONLY: soaprop + !<>dod timers + USE mo_control, ONLY: ltimer + USE mo_hammoz_timer, ONLY: timer_start, timer_stop, timer_ham_m7_concoag +#endif + IMPLICIT NONE + + !--- Parameter list: + ! + ! paerml = total aerosol mass for each compound + ! [molec. cm-3 for sulphate; ug m-3 for others] + ! paernl = aerosol number for each mode [cm-3] + ! pm6rp = mean mode actual radius (wet radius for soluble modes + ! and dry radius for insoluble modes) [cm] + ! pa4delt(:,:,:) = change in H2SO4 mass of the respective mode over one timstep + ! due to: + ! - nucleation of H2SO4 (calculated in m7_nuck) + ! - coagulation (calculated in m7_concoag) + ! panew = number of nucleated particles (during 1 timestep) [1] + ! pa = unimodal coagulation coefficient (zcom(mod)) [] + ! pb = inter-modal coagulation with higher modes + ! (zcom(mod) * n(jclass+1)) [] + ! pbfractx(:,:,y) = fraction of the total number of particles removed by + ! coagulation from mode x that is moved to mode y+1 [1] + ! pso4_x = mass of sulphate condensed on insoluble mode x [molec. cm-3] + ! + !--- Local variables: + ! + ! zansum = aerosol number in the respective mode [cm-3] + ! zxxsum = aerosol mass for compound xx in the respective + ! mode, e.g. xx = bc, oc, a4 (sulfate) + ! [g cm-3 for bc,oc and molec. cm-3 for sulfate] + ! zxxav = average mass of a sulfate particle in the respective + ! mode [molecules] + ! zxxavy = average mass of species xx in mode y [] + ! where xx is ss, du, bc, oc, or a4 for sulfate + ! [molecules for sulfate and ug for others] + ! zanli(:,:,:) = Number of particles moved by the inter-modal + ! coagulation [] + ! zansq(:,:,:) = Number of particles moved by the intra-modal + ! coagulation [] + ! zaernt(:,:,:) = New particle number n(t+dt) after the integration + ! of the aerosol dynamics equation [cm-3] + + !--- Parameters: + + INTEGER :: kproma, kbdim, klev, krow + + REAL(dp):: paerml(kbdim,klev,naerocomp), paernl(kbdim,klev,nclass), & + pa4delt(kbdim,klev,naerocomp), panew(kbdim,klev), & + pm6rp(kbdim,klev,nclass) + !>>dod soa + REAL(dp) :: pttn(kbdim,klev,naerocomp) + !<>dod soa: removed arrays of average particle mass (replaced by pttn) + REAL(dp):: za4av1(kbdim,klev), za4av2(kbdim,klev) + !<>dod replaced arrays zansq and zaernt with scalars + REAL(dp):: zanli(kbdim,klev,nclass), zansq, zaernt + !<>dod soa + REAL(dp) :: zbcmass, zocmass, zsoamass + INTEGER :: jspec, isoans, isoaks, isoaas, isoacs, jn2 + !<>dod soa deleted array initialisations but inserted zanli + zanli(:,:,:) = 0._dp + !<>dod soa : do nothing. + !< cmin_aernl) THEN + + !--- 1.1) Case of no coagulation: + ! + ! (pa(jl,jk,iaiti) < 1.e-15 .AND. pb(jl,jk,iaiti) < 1.e-15) + ! + ! => Nothing to be done + + !--- 1.2) Case with coagulation: + + IF (pa(jl,jk,iaiti) >= zmin_coag .OR. pb(jl,jk,iaiti) >= zmin_coag) THEN + + !--- 1.2.1) Case of no inter-modal coagulation: + ! dn/dt = -a*n**2 => + ! n(t) = n0/(1 + n0*a*(t-t0)) + + IF (pb(jl,jk,iaiti) < zmin_coag) THEN + zaernt = zansum/(1.0_dp+zansum*pa(jl,jk,iaiti)*ztmst) + !---zanli unchanged = 0 + zansq = zansum-zaernt + + !--- 1.2.2) Case with inter- and intra-modal coagulation: + ! dn/dt = -a*n**2 - b*n => + ! n(t) = (b*n0*exp(-b(t-t0)))/((n0*a)(1-exp(-b(t-t0)))+b) + ELSE + !--- Calculate n(t+dt): + ze1=EXP(-pb(jl,jk,iaiti)*ztmst) + ztop=pb(jl,jk,iaiti)*zansum*ze1 + zbot=zansum*pa(jl,jk,iaiti)*(1.0_dp-ze1)+pb(jl,jk,iaiti) + zaernt=ztop/zbot + !--- Limit n(t+dt) to available particle in the mode: + zaernt=MIN(zaernt, zansum) + !--- Total change in particle numbers of the mode due to coagulation: + zatot=zansum-zaernt + !--- Contribution of the intra-modal coagulation: + zanse=zansum*zansum*pa(jl,jk,iaiti) + !--- Contribution of the inter-modal coagulation: + zanle=zansum*pb(jl,jk,iaiti) + !--- Number of particles moved by the inter-modal coagulation: + zanli(jl,jk,iaiti)=zatot*zanle/(zanse+zanle) + !--- Number of particles moved by the intra-modal coagulation: + zansq=zatot*zanse/(zanse+zanle) + + END IF + + !--- 1.2.3) Change masses of the insoluble aitken mode due to + ! intra-modal coagulation and the coagulation with the + ! nucleation mode (transfers to the soluble modes + ! of the particles coagulating with the nucleation mode + ! are done in m7_concoag): + + paerml(jl,jk,ibcki)=( zaernt + zansq + pbfract5(jl,jk,1)*zanli(jl,jk,iaiti) ) * & + pttn(jl,jk,ibcki)*1.e12_dp + + paerml(jl,jk,iocki)=( zaernt + zansq + pbfract5(jl,jk,1)*zanli(jl,jk,iaiti) ) * & + pttn(jl,jk,iocki)*1.e12_dp + + !--- 1.2.4) Change the numbers of the insoluble aitken mode due to + ! intra-modal coagulation: + + paernl(jl,jk,iaiti)=zaernt + pbfract5(jl,jk,1)*zanli(jl,jk,iaiti) + + !--- 1.2.5) Store changes in masses of compounds in the insoluble + ! aitken mode due to inter-modal coagulation: + ! (zanli(:,:,x) = total number of particles moved from mode x + ! pbfract5(:,:,x)= fraction of the total number of particles + ! moved from mode 5 that is moved to mode x ) + + pa4delt(jl,jk,ibcks)=pbfract5(jl,jk,2)*zanli(jl,jk,iaiti)*pttn(jl,jk,ibcki)*1.e12_dp + pa4delt(jl,jk,iocks)=pbfract5(jl,jk,2)*zanli(jl,jk,iaiti)*pttn(jl,jk,iocki)*1.e12_dp + pa4delt(jl,jk,ibcas)=pbfract5(jl,jk,3)*zanli(jl,jk,iaiti)*pttn(jl,jk,ibcki)*1.e12_dp + pa4delt(jl,jk,iocas)=pbfract5(jl,jk,3)*zanli(jl,jk,iaiti)*pttn(jl,jk,iocki)*1.e12_dp + + IF (nsoa == 1) THEN + DO jm=1,nsoaspec + IF (.NOT. soaprop(jm)%lvolatile) THEN + !>>dod deleted isoa_ix + jspec = soaprop(jm)%spid_soa + jn = speclist(jspec)%iaerocomp(iaiti) + !<>dod deleted isoa_ix + jn = speclist(jspec)%iaerocomp(iaits) + jn2 = speclist(jspec)%iaerocomp(iaccs) + + pa4delt(jl,jk,jn) = pbfract5(jl,jk,2)*zanli(jl,jk,iaiti) * zsoamass + pa4delt(jl,jk,jn2) = pbfract5(jl,jk,3)*zanli(jl,jk,iaiti) * zsoamass + !< cmin_aernl) THEN + + za4av=za4sum/zansum + + IF (jclass.EQ.1) THEN + za4av1(jl,jk)=za4av + ELSE IF (jclass.EQ.2) THEN + za4av2(jl,jk)=za4av + END IF + + !--- 2.1) Case of no coagulation: + ! + IF (pa(jl,jk,jclass) < zmin_coag .AND. pb(jl,jk,jclass) < zmin_coag) THEN + !--- Nucleation in mode 1 only. + ! Nothing to be done for other modes. + + IF(jclass.EQ.1) THEN + paerml(jl,jk,iso4ns)=za4sum + paernl(jl,jk,inucs)=zansum + + END IF + + !--- 2.2) Case with coagulation: + + ELSE + + !--- 2.2.1) Case of no nucleation: + + !--- Not Mode 1 or Nucleation rate below 1/s: + + IF ( (jclass .NE. 1) .OR. (panew(jl,jk)/ztmst < 1.0_dp) ) THEN + + paernl(jl,jk,jclass)=zansum + + !--- 2.2.1a) Case of no inter-modal coagulation: + ! dn/dt = -a*n**2 => + ! n(t) = n0/(1 + n0*a*(t-t0)) + + IF (pb(jl,jk,jclass) < zmin_coag) THEN + zaernt=zansum/(1.0_dp+zansum*pa(jl,jk,jclass)*ztmst) + !---zanli unchanged (=0) + zansq=zansum-zaernt + + !--- 2.2.1b) Case with inter- and intra-modal coagulation: + ! dn/dt = -a*n**2 - b*n => + ! n(t) = (b*n0*exp(-b(t-t0)))/((n0*a)(1-exp(-b(t-t0)))+b) + + ELSE + !--- Calculate n(t+dt): + ze1=EXP(-pb(jl,jk,jclass)*ztmst) + ztop=pb(jl,jk,jclass)*zansum*ze1 + zbot=zansum*pa(jl,jk,jclass)*(1.0_dp-ze1)+pb(jl,jk,jclass) + zaernt=ztop/zbot + !--- Limit n(t+dt) to available particle in the mode: + zaernt=MIN(zaernt, zansum) + !--- Total change in particle numbers of the mode due to coagulation: + zatot=zansum-zaernt + !--- Contribution of the intra-modal coagulation: + zanse=zansum*zansum*pa(jl,jk,jclass) + !--- Contribution of the inter-modal coagulation: + zanle=zansum*pb(jl,jk,jclass) + !--- Number of particles moved by the inter-modal coagulation: + zanli(jl,jk,jclass)=zatot*zanle/(zanse+zanle) + !--- Number of particles moved by the intra-modal coagulation: + zansq=zatot*zanse/(zanse+zanle) + END IF + + !--- 2.2.2) Case with nucleation: + + ELSE IF ( (jclass .EQ. 1) .AND. (panew(jl,jk)/ztmst >= 1.0_dp) ) THEN + + !--- 2.2.2a) Nucleation, inter- and intra-modal coagulation: + ! dn/dt = -a*n**2 - b*n + c => + ! n(t) = -(b/(2a)) + + ! R/2a * [ ((1 - (-2ax0-b+R)/(+2ax0+b+R))exp(-Rt)) / + ! ((1 + (-2ax0-b+R)/(+2ax0+b+R))exp(-Rt)) ] + ! where: R=SQRT(b**2+4ac) + ! + ! If b/=0 then always a/=0. The only case where a would be 0 + ! and b unequal zero is the case of no pre-existing particles + ! in the nucleation mode but pre-existing particles in other + ! modes. For this case a is calculated for an assumed radius + ! of a critical cluster in m7_coaset. + + IF (pb(jl,jk,jclass) >= zmin_coag) THEN + !--- Calculate n(t): + !--- c: + zc=panew(jl,jk)/ztmst + !--- R: + zf1=pb(jl,jk,jclass)*pb(jl,jk,jclass)+4.0_dp*pa(jl,jk,jclass)*zc + zr1=SQRT(zf1) + !--- exp(-Rt): + ze1=EXP(-zr1*ztmst) + !--- 2ax0+b: + zf2=2.0_dp*pa(jl,jk,jclass)*paernl(jl,jk,jclass)+pb(jl,jk,jclass) + !--- Term in squared bracket: + zf3=ze1*(zr1-zf2)/(zr1+zf2) + zf4=(1.0_dp-zf3)/(1.0_dp+zf3) + !--- n(t): + zaernt=(zr1*zf4-pb(jl,jk,jclass))/2.0_dp/pa(jl,jk,jclass) + !--- Limit n(t+dt) to available particle in the mode: + zaernt=MIN(zaernt, zansum) + !--- Total change in particle numbers of the mode due to coagulation: + zatot=zansum-zaernt + !--- Contribution of the intra-modal coagulation: + zanse=zansum*zansum*pa(jl,jk,jclass) + !--- Contribution of the inter-modal coagulation: + zanle=zansum*pb(jl,jk,jclass) + !--- Number of particles moved by the inter-modal coagulation: + zanli(jl,jk,jclass)=zatot*zanle/(zanse+zanle) + !--- Number of particles moved by the intra-modal coagulation: + zansq=zatot*zanse/(zanse+zanle) + + !--- 2.2.2b) Nucleation and intra-modal coagulation: + ! dn/dt = -a*n**2 - b*n + c with b=0 => + ! dn/dt = -a*n**2 + c => + ! n(t) = R/2a * [ ((1 - (-2ax0+R)/(+2ax0+R))exp(-Rt)) / + ! ((1 + (-2ax0+R)/(+2ax0+R))exp(-Rt)) ] + ! where: R=SQRT(4ac) + ! + ! Can be shown to be equivalent to: + ! + ! n(t) = R1*((x0+R1)/(x0-R1)+exp(-SQRT(-4ac)t)) / + ! ((x0+R1)/(x0-R1)-exp(-SQRT(-4ac)t)) + ! where R1=SQRT(c/a) + + ELSE IF (pb(jl,jk,jclass) < zmin_coag) THEN + !--- c: + zc=panew(jl,jk)/ztmst + !--- R1: + zr1=SQRT(zc/pa(jl,jk,jclass)) + !--- exp(-Rt): + ze1=EXP(-zr1*2.0_dp*pa(jl,jk,jclass)*ztmst) + !--- n(t): + zf1=(paernl(jl,jk,jclass)+zr1)/(paernl(jl,jk,jclass)-zr1) + ztop=zr1*(zf1+ze1) + zbot=zf1-ze1 + IF (zbot < zmin_coag) THEN + zaernt=zansum + ELSE + zaernt=ztop/zbot + END IF + !--- Limit n(t+dt) to available particle in the mode: + zaernt=MIN(zaernt, zansum) + !--- Number of particles moved by the inter-modal coagulation: + zanli(jl,jk,jclass)=0.0_dp + !--- Number of particles moved by the intra-modal coagulation: + zansq=zansum-zaernt + END IF + END IF + !---2.2.3 New bit for insoluble/souble coagulation + !--- sum total insoluble+soluble paticles in mode jclass JJNW + IF (jclass .EQ. 1 .AND. zanli(jl,jk,jclass)>0.0_dp) THEN + zaerni=paernl(jl,jk,iaiti)+paernl(jl,jk,iacci)+paernl(jl,jk,icoai) + zaerns=zansum+paernl(jl,jk,iaits) + ! zaerns=zansum + ztotn=zaerns+zaerni + IF (zaerns .gt. zaerni .and. zaerni .gt. zeps) THEN !SF (#136): use zeps instead of 0._dp + ! calculate analytical solution no of mixed particles for coagulation + ! between paernl(jl,jk,jclass) soluble particles and zaerni insouble of + ! the same dimensions + IF (zaerni .gt. 1.0_dp) then + zanytni=4.0_dp*zaerni/((2.0_dp+pa(jl,jk,jclass)*ztmst*ztotn)* & + (2.0_dp+pa(jl,jk,jclass)*ztmst*(ztotn-zaerni))) + ELSE + zanytni = 0.0_dp + ENDIF + zanytnt=2.0_dp*ztotn/(2.0_dp+pa(jl,jk,jclass)*ztmst*ztotn) + zanytns=4.0_dp*zaerns/((2.0_dp+pa(jl,jk,jclass)*ztmst*ztotn)* & + (2.0_dp+pa(jl,jk,jclass)*ztmst*(ztotn-zaerns))) + zanytnm=zanytnt-(zanytni+zanytns) + zanytnm=min(zanytnm,zaerni) + zanytni=zaerni-zanytnm + zanytns=zaernt + + IF (za4av > 0._dp) THEN +!DIR$ UNROLL +!CDIR UNROLL=7 + DO kmod=1,nclass + zm6rp(kmod)=pm6rp(jl,jk,kmod) + END DO + CALL m7_coat(zm6rp,zcrtcst) + zamloss5=paernl(jl,jk,5)/zaerni*zanytnm*zcrtcst(5) + zanloss5=zamloss5/za4av + zamloss6=paernl(jl,jk,6)/zaerni*zanytnm*zcrtcst(6) + zanloss6=zamloss6/za4av + zamloss7=paernl(jl,jk,7)/zaerni*zanytnm*zcrtcst(7) + zanloss7=zamloss7/za4av + ELSE + zamloss5 = 0._dp + zamloss6 = 0._dp + zamloss7 = 0._dp + zanloss5 = 0._dp + zanloss6 = 0._dp + zanloss7 = 0._dp + END IF + ztloss=zanloss5+zanloss6+zanloss7 + zms=zansq*0.95_dp + + ztloss=min(ztloss,zansq*0.95_dp) + zbfofac=zanli(jl,jk,jclass)/(zanli(jl,jk,jclass)+ztloss) + zbfnfac=ztloss/(zanli(jl,jk,jclass)+ztloss) + zanli(jl,jk,jclass)=zanli(jl,jk,jclass)+ztloss + zansq=zansq-ztloss + zbftot=0.0_dp +!DIR$ UNROLL +!CDIR UNROLL=7 + DO kmod=1,nclass + IF(kmod>jclass) THEN + pbfract1(jl,jk,kmod-jclass)=pbfract1(jl,jk,kmod-jclass)*zbfofac + + + IF (kmod.GE.5) THEN + pbfract1(jl,jk,kmod-jclass)=pbfract1(jl,jk,kmod-jclass)+ & + zbfnfac*paernl(jl,jk,kmod)/zaerni + + END IF + zbftot=zbftot+pbfract1(jl,jk,kmod-jclass) + END IF + END DO +!DIR$ UNROLL +!CDIR UNROLL=7 + DO kmod=1,nclass + IF (kmod>jclass) THEN +!kai + IF (abs(zbftot).gt.zeps) then + pbfract1(jl,jk,kmod-jclass)=pbfract1(jl,jk,kmod-jclass)/zbftot + ELSE + pbfract1(jl,jk,kmod-jclass)=0._dp + END IF + + END IF + END DO + END IF + END IF + !---- End of new inslouble/soluble caogulation routine JJNW + !--- 2.3) Change masses and numbers of the respective modes to account----------- + ! for intra-modal coagulation (zansq) and coagulation with + ! higher modes (zaernt): + ! + !--- 2.3.1) Change mass of the sulfur compounds: + + paerml(jl,jk,jclass)=(zaernt+zansq)*za4av + + !--- 2.3.2) Change mass of the carbon compounds: + + IF (jclass.EQ.2) THEN + paerml(jl,jk,ibcks)=(zaernt+zansq)*pttn(jl,jk,ibcks)*1.E12_dp + paerml(jl,jk,iocks)=(zaernt+zansq)*pttn(jl,jk,iocks)*1.E12_dp + ELSE IF (jclass.EQ.3) THEN + paerml(jl,jk,ibcas)=(zaernt+zansq)*pttn(jl,jk,ibcas)*1.E12_dp + paerml(jl,jk,iocas)=(zaernt+zansq)*pttn(jl,jk,iocas)*1.E12_dp + ELSE IF (jclass.EQ.4) THEN + paerml(jl,jk,ibccs)=(zaernt+zansq)*pttn(jl,jk,ibccs)*1.E12_dp + paerml(jl,jk,ioccs)=(zaernt+zansq)*pttn(jl,jk,ioccs)*1.E12_dp + END IF + + IF (nsoa == 1) THEN + DO jm=1,nsoaspec + IF (sizeclass(jclass)%lsoainclass .AND. (.NOT. soaprop(jm)%lvolatile)) THEN + !>>dod deleted isoa_ix + jspec = soaprop(jm)%spid_soa + jn = speclist(jspec)%iaerocomp(jclass) + !<>dod deleted isoa_ix + jspec = soaprop(jm)%spid_soa + isoans = speclist(jspec)%iaerocomp(inucs) + isoaks = speclist(jspec)%iaerocomp(iaits) + isoaas = speclist(jspec)%iaerocomp(iaccs) + isoacs = speclist(jspec)%iaerocomp(icoas) + + zsoamass = 1.E12_dp*pttn(jl,jk,isoans)*zanli(jl,jk,1) + + !---mass from nucs to aits + pa4delt(jl,jk,isoaks) = zsoamass * ( pbfract1(jl,jk,1) + & + !---add mass from nucs to aits due to coag with aiti + pbfract1(jl,jk,4) ) + + !---mass from nucs to accs + pa4delt(jl,jk,isoaas) = zsoamass * ( pbfract1(jl,jk,2) + & + !---add mass from nucs to accs due to coag with acci + pbfract1(jl,jk,5) ) + + !---mass from nucs to coas + pa4delt(jl,jk,isoacs) = zsoamass * ( pbfract1(jl,jk,3) + & + !---add mass from nucs to coas due to coag with coai + pbfract1(jl,jk,6) ) + !<>dod deleted isoa_ix + jspec = soaprop(jm)%spid_soa + isoaks = speclist(jspec)%iaerocomp(iaits) + isoaas = speclist(jspec)%iaerocomp(iaccs) + isoacs = speclist(jspec)%iaerocomp(icoas) + + zsoamass = 1.E12_dp*pttn(jl,jk,isoaks)*zanli(jl,jk,2) + + !---mass from aits to accs + pa4delt(jl,jk,isoaas) = pa4delt(jl,jk,isoaas) + & + zsoamass * ( pbfract2(jl,jk,2) + & + !---add mass from aits to accs due to coag with acci + pbfract2(jl,jk,5) ) + + !---mass from aits to coas + pa4delt(jl,jk,isoacs) = pa4delt(jl,jk,isoacs) + & + zsoamass * ( pbfract2(jl,jk,3) + & + !---add mass from aits to coas due to coag with coai + pbfract2(jl,jk,6) ) + !<>dod soa + IF (nsoa == 1) THEN + DO jm=1,nsoaspec + IF (.NOT. soaprop(jm)%lvolatile) THEN + !>>dod deleted isoa_ix + jspec = soaprop(jm)%spid_soa + isoaks = speclist(jspec)%iaerocomp(iaits) + + zsoamass = 1.E12_dp*pttn(jl,jk,isoaks)*zanli(jl,jk,2) + + pa4delt(jl,jk,isoaks) = pa4delt(jl,jk,isoaks) + zsoamass * pbfract2(jl,jk,4) + !<>dod timers + IF (ltimer) CALL timer_start(timer_ham_m7_concoag) + !<>dod soa: added pttn, removed bc,oc and du averages + za4av1, za4av2, pttn, & + pso4_5, pso4_6, pso4_7, & + !<>dod timers + IF (ltimer) CALL timer_stop(timer_ham_m7_concoag) + !<>dod soa + DO jclass=1,nclass + jm = speclist(id_so4)%iaerocomp(jclass) !!mgs!! im7table(jclass,id_so4) + IF (jm > 0 .AND. jclass /= inucs) paerml(1:kproma,:,jm) = paerml(1:kproma,:,jm) + & + pa4delt(1:kproma,:,jm) + jm = speclist(id_bc)%iaerocomp(jclass) !!mgs!! im7table(jclass,id_bc) + IF (jm > 0) paerml(1:kproma,:,jm)=paerml(1:kproma,:,jm)+pa4delt(1:kproma,:,jm) + jm = speclist(id_oc)%iaerocomp(jclass) !!mgs!! im7table(jclass,id_oc) + IF (jm > 0) paerml(1:kproma,:,jm)=paerml(1:kproma,:,jm)+pa4delt(1:kproma,:,jm) + jm = speclist(id_du)%iaerocomp(jclass) !!mgs!! im7table(jclass,id_du) + IF (jm > 0) paerml(1:kproma,:,jm)=paerml(1:kproma,:,jm)+pa4delt(1:kproma,:,jm) + + IF (nsoa == 1) THEN + DO jm=1,nsoaspec + IF (sizeclass(jclass)%lsoainclass .AND. (.NOT. soaprop(jm)%lvolatile)) THEN + !>>dod deleted isoa_ix + jspec = soaprop(jm)%spid_soa + jn = speclist(jspec)%iaerocomp(jclass) + paerml(1:kproma,:,jn) = paerml(1:kproma,:,jn) + pa4delt(1:kproma,:,jn) + !< +!! \filename +!! mo_ham_m7_nucl.f90 +!! +!! \brief +!! mo_ham_m7_nucl provides routines for calculating aerosol nucleation rates. +!! +!! \author Philip Stier (MPI-Met) +!! +!! \responsible_coder +!! Philip Stier, philip.stier@physics.ox.ac.uk +!! +!! \revision_history +!! -# Philip Stier (MPI-Met) - original code (2003-01) +!! -# Jan Kazil (MPI-Met) (2007-10-07) +!! +!! \limitations +!! None +!! +!! \details +!! This module provides routines for calculating nucleation rates for +!! neutral and charged H2SO4/H2O and neutral H2SO4/organic clusters. +!! +!! \bibliographic_references +!! - Vignati, E. (1999), Modelling Interactions between Aerosols and +!! Gaseous Compounds in the Polluted Marine Atmosphere. PhD-Thesis, +!! RISO National Laborartory Copenhagen, Riso-R-1163(EN) +!! +!! \belongs_to +!! HAMMOZ +!! +!! SPDX-License-Identifier: BSD-3-Clause +!! Copyright (c) 2021 hammoz + +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +MODULE mo_ham_m7_nucl + + USE mo_kind, ONLY: dp + USE mo_netcdf + + IMPLICIT NONE + + ! Sulfate aerosol formation rates (cm-3 s-1) lookup table for the Kazil and + ! Lovejoy nucleation scheme: + + INTEGER, PRIVATE :: t_n,rh_n,h2so4_n,ipr_n,cs_n + + REAL(dp), PRIVATE, ALLOCATABLE :: t_table(:) ! Temperature + REAL(dp), PRIVATE, ALLOCATABLE :: rh_table(:) ! Relative humidity + REAL(dp), PRIVATE, ALLOCATABLE :: h2so4_table(:) ! [H2SO4(g)] + REAL(dp), PRIVATE, ALLOCATABLE :: ipr_table(:) ! Ionization rate + REAL(dp), PRIVATE, ALLOCATABLE :: cs_table(:) ! H2SO4 condensation sink + + REAL(dp), PRIVATE, ALLOCATABLE :: pfr_table(:,:,:,:,:) + +!! INCLUDE 'netcdf.inc' + +CONTAINS + +SUBROUTINE nucl_vehkamaeki(kproma, kbdim, klev, & ! ECHAM5 dimensions + ptp1, psatrat, pmolecH2SO4, & ! ECHAM5 temperature, water vapor saturaion ratio, [H2SO4]g + pxtrnucr, pntot ) ! nucleation rate, number of molecules in the critical cluster + ! + ! Authors: + ! --------- + ! C. TIMMRECK, MPI HAMBURG 2002 + ! + ! Purpose + ! --------- + ! Calculation of classical nucleation rate + ! + ! calculation of the nucleation rate after Vehkamaeki et al. (2002) + ! The calculation of the nucrate ZKNH2SO4 is in cm^-3 s^-1 + ! and a coarse approxmation for the first class + ! + ! Modifications: + ! -------------- + ! R. Hommel; rewrite in f90, adopted to ECHAM5; MPI HAMBURG; Dec. 2002 + ! P. Stier; bugfixes, modularisation and optimization; MPI HAMBURG; 2003-2004 + ! + ! H2SO4 still fixed to xxx molc/cm3, no sulfur cycle coupling yet + ! + ! References: + ! ----------- + ! Vehkamaeki et al. (2002), An improved parameterization for sulfuric + ! acid/water nucleation rates for tropospheric and stratospheric + ! conditions, J. Geophys. Res, 107, D22, 4622 + ! + ! Parameters + ! ---------- + ! prho = prhop_neu in *sam* + ! + ! psatrat = water vapor saturation ratio + ! + ! pxtrnucr = nucleation rate in [1/m3s] + ! xrhoc = density of the critical nucleus in kg/m^3 + ! zrxc = ? + + !---------------------------------------------------- + + IMPLICIT NONE + + !---------------------------------------------------- + + INTEGER :: kproma, kbdim, klev + + INTEGER :: jk, jl + + !---------------------------------------------------- + ! + + REAL(dp):: ptp1(kbdim,klev), psatrat(kbdim,klev), & + pxtrnucr(kbdim,klev), & + pmolecH2SO4(kbdim,klev), & ! revisited, ok + pntot(kbdim,klev) + + !---------------------------------------------------- + ! Local Arrays + + REAL(dp):: zrxc(kbdim) + + REAL(dp):: zrhoa, zrh, zt, x, zjnuc, zrc, zxmole, zntot + + REAL(dp):: zlogrh, zlogrh2, zlogrh3, zlogrhoa, zlogrhoa2, zlogrhoa3, & + zix, zt2, zt3 + + !--- 0) Initializations: + + DO jk=1, klev + DO jl=1,kproma + + !----1.) Parameterization of nucleation rate after Vehkamaeki et al. (2002) + + ! t: temperature in K (190.15-300.15K) + ! zrh: saturatio ratio of water (0.0001-1) + ! zrhoa: sulfuric acid concentration in 1/cm3 (10^4-10^11 1/cm3) + ! jnuc: nucleation rate in 1/cm3s (10^-7-10^10 1/cm3s) + ! ntot: total number of molecules in the critical cluster (ntot>4) + ! x: molefraction of H2SO4 in the critical cluster + ! rc: radius of the critical cluster in nm + + ! Calculate nucleation only for valid thermodynamic conditions: + + zrhoa = max(pmolecH2SO4(jl,jk),1.E+4_dp) + zrhoa = min(zrhoa,1.E11_dp) + + zrh = max(psatrat(jl,jk),1.E-4_dp) + zrh = min(zrh,1.0_dp) + + zt = max(ptp1(jl,jk),190.15_dp) + zt = min(zt,300.15_dp) + + zt2 = zt*zt + zt3 = zt2*zt + + ! Equation (11) - molefraction of H2SO4 in the critical cluster + + zlogrh = LOG(zrh) + zlogrh2 = zlogrh*zlogrh + zlogrh3 = zlogrh2*zlogrh + + zlogrhoa = LOG(zrhoa) + zlogrhoa2 = zlogrhoa*zlogrhoa + zlogrhoa3 = zlogrhoa2*zlogrhoa + + x=0.7409967177282139_dp - 0.002663785665140117_dp*zt & + + 0.002010478847383187_dp*zlogrh & + - 0.0001832894131464668_dp*zt*zlogrh & + + 0.001574072538464286_dp*zlogrh2 & + - 0.00001790589121766952_dp*zt*zlogrh2 & + + 0.0001844027436573778_dp*zlogrh3 & + - 1.503452308794887e-6_dp*zt*zlogrh3 & + - 0.003499978417957668_dp*zlogrhoa & + + 0.0000504021689382576_dp*zt*zlogrhoa + + zxmole=x + + zix = 1.0_dp/x + + ! Equation (12) - nucleation rate in 1/cm3s + + zjnuc=0.1430901615568665_dp + 2.219563673425199_dp*zt - & + 0.02739106114964264_dp*zt2 + & + 0.00007228107239317088_dp*zt3 + 5.91822263375044_dp*zix + & + 0.1174886643003278_dp*zlogrh + 0.4625315047693772_dp*zt*zlogrh - & + 0.01180591129059253_dp*zt2*zlogrh + & + 0.0000404196487152575_dp*zt3*zlogrh + & + (15.79628615047088_dp*zlogrh)*zix - & + 0.215553951893509_dp*zlogrh2 - & + 0.0810269192332194_dp*zt*zlogrh2 + & + 0.001435808434184642_dp*zt2*zlogrh2 - & + 4.775796947178588e-6_dp*zt3*zlogrh2 - & + (2.912974063702185_dp*zlogrh2)*zix - & + 3.588557942822751_dp*zlogrh3 + & + 0.04950795302831703_dp*zt*zlogrh3 - & + 0.0002138195118737068_dp*zt2*zlogrh3 + & + 3.108005107949533e-7_dp*zt3*zlogrh3 - & + (0.02933332747098296_dp*zlogrh3)*zix + & + 1.145983818561277_dp*zlogrhoa - & + 0.6007956227856778_dp*zt*zlogrhoa + & + 0.00864244733283759_dp*zt2*zlogrhoa - & + 0.00002289467254710888_dp*zt3*zlogrhoa - & + (8.44984513869014_dp*zlogrhoa)*zix + & + 2.158548369286559_dp*zlogrh*zlogrhoa + & + 0.0808121412840917_dp*zt*zlogrh*zlogrhoa - & + 0.0004073815255395214_dp*zt2*zlogrh*zlogrhoa - & + 4.019572560156515e-7_dp*zt3*zlogrh*zlogrhoa + & + (0.7213255852557236_dp*zlogrh*zlogrhoa)*zix + & + 1.62409850488771_dp*zlogrh2*zlogrhoa - & + 0.01601062035325362_dp*zt*zlogrh2*zlogrhoa + & + 0.00003771238979714162_dp*zt2*zlogrh2*zlogrhoa + & + 3.217942606371182e-8_dp*zt3*zlogrh2*zlogrhoa - & + (0.01132550810022116_dp*zlogrh2*zlogrhoa)*zix + & + 9.71681713056504_dp*zlogrhoa2 - & + 0.1150478558347306_dp*zt*zlogrhoa2 + & + 0.0001570982486038294_dp*zt2*zlogrhoa2 + & + 4.009144680125015e-7_dp*zt3*zlogrhoa2 + & + (0.7118597859976135_dp*zlogrhoa2)*zix - & + 1.056105824379897_dp*zlogrh*zlogrhoa2 + & + 0.00903377584628419_dp*zt*zlogrh*zlogrhoa2 - & + 0.00001984167387090606_dp*zt2*zlogrh*zlogrhoa2 + & + 2.460478196482179e-8_dp*zt3*zlogrh*zlogrhoa2 - & + (0.05790872906645181_dp*zlogrh*zlogrhoa2)*zix - & + 0.1487119673397459_dp*zlogrhoa3 + & + 0.002835082097822667_dp*zt*zlogrhoa3 - & + 9.24618825471694e-6_dp*zt2*zlogrhoa3 + & + 5.004267665960894e-9_dp*zt3*zlogrhoa3 - & + (0.01270805101481648_dp*zlogrhoa3)*zix + + zjnuc=EXP(zjnuc) ! add. Eq. (12) [1/(cm^3s)] + + + ! Equation (13) - total number of molecules in the critical cluster + + zntot=-0.002954125078716302_dp - 0.0976834264241286_dp*zt + & + 0.001024847927067835_dp*zt2 - 2.186459697726116e-6_dp*zt3 - & + 0.1017165718716887_dp*zix - 0.002050640345231486_dp*zlogrh - & + 0.007585041382707174_dp*zt*zlogrh + & + 0.0001926539658089536_dp*zt2*zlogrh - & + 6.70429719683894e-7_dp*zt3*zlogrh - & + (0.2557744774673163_dp*zlogrh)*zix + & + 0.003223076552477191_dp*zlogrh2 + & + 0.000852636632240633_dp*zt*zlogrh2 - & + 0.00001547571354871789_dp*zt2*zlogrh2 + & + 5.666608424980593e-8_dp*zt3*zlogrh2 + & + (0.03384437400744206_dp*zlogrh2)*zix + & + 0.04743226764572505_dp*zlogrh3 - & + 0.0006251042204583412_dp*zt*zlogrh3 + & + 2.650663328519478e-6_dp*zt2*zlogrh3 - & + 3.674710848763778e-9_dp*zt3*zlogrh3 - & + (0.0002672510825259393_dp*zlogrh3)*zix - & + 0.01252108546759328_dp*zlogrhoa + & + 0.005806550506277202_dp*zt*zlogrhoa - & + 0.0001016735312443444_dp*zt2*zlogrhoa + & + 2.881946187214505e-7_dp*zt3*zlogrhoa + & + (0.0942243379396279_dp*zlogrhoa)*zix - & + 0.0385459592773097_dp*zlogrh*zlogrhoa - & + 0.0006723156277391984_dp*zt*zlogrh*zlogrhoa + & + 2.602884877659698e-6_dp*zt2*zlogrh*zlogrhoa + & + 1.194163699688297e-8_dp*zt3*zlogrh*zlogrhoa - & + (0.00851515345806281_dp*zlogrh*zlogrhoa)*zix - & + 0.01837488495738111_dp*zlogrh2*zlogrhoa + & + 0.0001720723574407498_dp*zt*zlogrh2*zlogrhoa - & + 3.717657974086814e-7_dp*zt2*zlogrh2*zlogrhoa - & + 5.148746022615196e-10_dp*zt3*zlogrh2*zlogrhoa + & + (0.0002686602132926594_dp*zlogrh2*zlogrhoa)*zix - & + 0.06199739728812199_dp*zlogrhoa2 + & + 0.000906958053583576_dp*zt*zlogrhoa2 - & + 9.11727926129757e-7_dp*zt2*zlogrhoa2 - & + 5.367963396508457e-9_dp*zt3*zlogrhoa2 - & + (0.007742343393937707_dp*zlogrhoa2)*zix + & + 0.0121827103101659_dp*zlogrh*zlogrhoa2 - & + 0.0001066499571188091_dp*zt*zlogrh*zlogrhoa2 + & + 2.534598655067518e-7_dp*zt2*zlogrh*zlogrhoa2 - & + 3.635186504599571e-10_dp*zt3*zlogrh*zlogrhoa2 + & + (0.0006100650851863252_dp*zlogrh*zlogrhoa2)*zix + & + 0.0003201836700403512_dp*zlogrhoa3 - & + 0.0000174761713262546_dp*zt*zlogrhoa3 + & + 6.065037668052182e-8_dp*zt2*zlogrhoa3 - & + 1.421771723004557e-11_dp*zt3*zlogrhoa3 + & + (0.0001357509859501723_dp*zlogrhoa3)*zix + + zntot=EXP(zntot) ! add. Eq. (13) + + + ! Equation (14) - radius of the critical cluster in nm + + zrc=EXP(-1.6524245_dp+0.42316402_dp*x+0.33466487_dp*LOG(zntot)) ! [nm] + + ! Conversion [nm -> m] + + zrxc(jl)=zrc*1e-9_dp + + !----1.2) Limiter + + IF(zjnuc<1.e-7_dp .OR. zntot<4.0_dp) zjnuc=0.0_dp + + ! limitation to 1E+10 [1/cm3s] + + zjnuc=MIN(zjnuc,1.e10_dp) + + pxtrnucr(jl,jk) = zjnuc + + ! convert total number of molecules in the critical cluster + ! to number of sulfate molecules: + + pntot(jl,jk)=zntot*zxmole + + ENDDO ! kproma + + ENDDO ! klev + + END SUBROUTINE nucl_vehkamaeki + + !============================================================================= + + SUBROUTINE nucl_kazil_lovejoy(kproma,kbdim,klev, & + ptemp,prh,ph2so4,pcs,pipr, & + ppfr,pns) + + ! *nucl_kazil_lovejoy* returns the formation rate of sulfate aerosol + ! particles containing a fixed number of H2SO4 molecules. The particle + ! formation rate is determined by interpolating a lookup table that was + ! generated with the code PARNUC, which implements the method described by + ! Kazil and Lovejoy (2007). Currently. lookup tables for different + ! nucleation processes (neutral and/or negative nucleation of H2SO4 nad H2O) + ! and with different resolutions are available. + ! + ! References: + ! + ! Kazil J., and Lovejoy, E. R., A semi-analytical method for + ! calculating rates of new sulfate aerosol formation from the gas phase, + ! Atmos. Chem. Phys., 7, 3447-3459, 2007 + + USE mo_kind, ONLY: dp + + IMPLICIT NONE + + ! + ! Input variables: + ! + + INTEGER :: kproma, & ! " geographic block number of locations + kbdim, & ! " geographic block maximum number of locations + klev ! " numer of levels + + REAL(dp):: ptemp(kbdim,klev), & ! Temperature (K) + prh(kbdim,klev), & ! Relative humidity (%) + ph2so4(kbdim,klev), & ! H2SO4 gas phase concentration (cm-3) + pcs(kbdim,klev), & ! H2SO4 condensation sink (s-1) + pipr(kbdim,klev) ! Ion pair production rate (cm-3 s-1) + + ! + ! Output variables: + ! + + REAL(dp) :: ppfr(kbdim,klev) ! Sulfate aerosol formation rate (cm-3 s-1) + REAL(dp) :: pns(kbdim,klev) ! Number of H2SO4 molecules in the newly formed aerosol particles + + ! + ! Local variables: + ! + + REAL(dp) :: ztemp, & ! Temperature (K) + zrh, & ! Relative humidity (%) + zh2so4, & ! H2SO4 gas phase concentration (cm-3) + zipr, & ! Ionization rate (cm-3 s-1) + zcs ! H2SO4 condensation sink (s-1) + + ! Interpolation coefficients: + + REAL(dp) :: zc(32) + + ! Temporary values: + + REAL(dp) :: zv,zw,zx,zy,zz, & + zv_,zw_,zx_,zy_,zz_, & + zvw,zxy,zv_w,zx_y,zvw_,zxy_,zv_w_,zx_y_, & + zxyz,zxyz_,zx_yz,zx_yz_,zxy_z,zxy_z_,zx_y_z,zx_y_z_ + + ! Array indices: + + INTEGER :: ik + + INTEGER :: i_temp_0,i_rh_0,i_h2so4_0,i_ipr_0,i_cs_0 + INTEGER :: i_temp_1,i_rh_1,i_h2so4_1,i_ipr_1,i_cs_1 + + ! Loop indices: + + INTEGER :: ji,jj + + ! Logical variables: + + LOGICAL :: lerror,lset_zero + + ! Number of H2SO4 molecules in the newly formed aerosol: + pns(1:kproma,:) = 15.0_dp + + ! + ! Calculate the nucleation rate by interpolating the lookup table: + ! + + DO ji=1,klev ! Levels loop + DO jj=1,kproma ! Geographic locations loop + + ztemp = ptemp(jj,ji) + zrh = prh(jj,ji) + zh2so4 = ph2so4(jj,ji) + zipr = pipr(jj,ji) + zcs = pcs(jj,ji) + + ! Check if the current variables which particle formation depends upon + ! are within the limits of the particle formation lookup table, and if + ! not, take appropriate action: + + lerror = .false. + lset_zero = .false. + + IF (ztemp < t_table(1)) THEN + lerror = .true. + ztemp = t_table(1) + ENDIF + + IF (ztemp > t_table(t_n)) THEN + lerror = .true. + ztemp = t_table(t_n) + lset_zero = .true. + ENDIF + + IF (zrh < rh_table(1)) THEN + lerror = .true. + zrh = rh_table(1) + lset_zero = .true. + ENDIF + + IF (zrh > rh_table(rh_n)) THEN + lerror = .true. + zrh = rh_table(rh_n) + ENDIF + + IF (zh2so4 < h2so4_table(1)) THEN + lerror = .true. + zh2so4 = h2so4_table(1) + lset_zero = .true. + ENDIF + + IF (zh2so4 > h2so4_table(h2so4_n)) THEN + lerror = .true. + zh2so4 = h2so4_table(h2so4_n) + ENDIF + + IF (zipr < ipr_table(1)) THEN + lerror = .true. + zipr = ipr_table(1) + ENDIF + + IF (zipr > ipr_table(ipr_n)) THEN + lerror = .true. + zipr = ipr_table(ipr_n) + ENDIF + + IF (zcs < cs_table(1)) THEN + lerror = .true. + zcs = cs_table(1) + ENDIF + + IF (zcs > cs_table(cs_n)) THEN + lerror = .true. + zcs = cs_table(cs_n) + ENDIF + + ! If needed, set the particle formation rate to zero: + + IF (lset_zero) THEN + ppfr(jj,ji) = 0.0_dp + CYCLE + ENDIF + + ! Identify the intervals in the ambient conditions arrays where the + ! current ambient conditions are located: + + i_temp_0 = 1 + i_temp_1 = t_n + + DO WHILE(i_temp_1-i_temp_0.gt.1) + + ik = (i_temp_1+i_temp_0)/2 + + IF (t_table(ik).gt.ztemp) THEN + i_temp_1 = ik + ELSE + i_temp_0 = ik + ENDIF + + ENDDO + + i_rh_0 = 1 + i_rh_1 = rh_n + + DO WHILE(i_rh_1-i_rh_0.gt.1) + + ik = (i_rh_1+i_rh_0)/2 + + IF (rh_table(ik).gt.zrh) THEN + i_rh_1 = ik + ELSE + i_rh_0 = ik + ENDIF + + ENDDO + + i_h2so4_0 = 1 + i_h2so4_1 = h2so4_n + + DO WHILE(i_h2so4_1-i_h2so4_0.gt.1) + + ik = (i_h2so4_1+i_h2so4_0)/2 + + IF (h2so4_table(ik).gt.zh2so4) THEN + i_h2so4_1 = ik + ELSE + i_h2so4_0 = ik + ENDIF + + ENDDO + + i_ipr_0 = 1 + i_ipr_1 = ipr_n + + DO WHILE(i_ipr_1-i_ipr_0.gt.1) + + ik = (i_ipr_1+i_ipr_0)/2 + + IF (ipr_table(ik).gt.zipr) THEN + i_ipr_1 = ik + ELSE + i_ipr_0 = ik + ENDIF + + ENDDO + + i_cs_0 = 1 + i_cs_1 = cs_n + + DO WHILE(i_cs_1-i_cs_0.gt.1) + + ik = (i_cs_1+i_cs_0)/2 + + IF (cs_table(ik).gt.zcs) THEN + i_cs_1 = ik + ELSE + i_cs_0 = ik + ENDIF + + ENDDO + + ! Calculate coefficients for the interpolation of the lookup tables: + + zv = (ztemp-t_table(i_temp_0))/(t_table(i_temp_1)-t_table(i_temp_0)) + zw = (zrh-rh_table(i_rh_0))/(rh_table(i_rh_1)-rh_table(i_rh_0)) + zx = (zh2so4-h2so4_table(i_h2so4_0))/(h2so4_table(i_h2so4_1)-h2so4_table(i_h2so4_0)) + zy = (zipr-ipr_table(i_ipr_0))/(ipr_table(i_ipr_1)-ipr_table(i_ipr_0)) + zz = (zcs-cs_table(i_cs_0))/(cs_table(i_cs_1)-cs_table(i_cs_0)) + + zv_ = zv - 1.0_dp + zw_ = zw - 1.0_dp + zx_ = zx - 1.0_dp + zy_ = zy - 1.0_dp + zz_ = zz - 1.0_dp + + zvw = zv*zw + zvw_ = zv*zw_ + zv_w = zv_*zw + zv_w_ = zv_*zw_ + + zxy = zx*zy + zxy_ = zx*zy_ + zx_y = zx_*zy + zx_y_ = zx_*zy_ + + zxyz = zxy*zz + zxyz_ = zxy*zz_ + zxy_z = zxy_*zz + zx_yz = zx_y*zz + zxy_z_ = zxy_*zz_ + zx_yz_ = zx_y*zz_ + zx_y_z = zx_y_*zz + zx_y_z_ = zx_y_*zz_ + + zc(1) = zv_w_*zx_y_z_ + zc(2) = zv_w_*zx_y_z + zc(3) = zv_w_*zx_yz_ + zc(4) = zv_w_*zx_yz + zc(5) = zv_w_*zxy_z_ + zc(6) = zv_w_*zxy_z + zc(7) = zv_w_*zxyz_ + zc(8) = zv_w_*zxyz + zc(9) = zv_w*zx_y_z_ + zc(10) = zv_w*zx_y_z + zc(11) = zv_w*zx_yz_ + zc(12) = zv_w*zx_yz + zc(13) = zv_w*zxy_z_ + zc(14) = zv_w*zxy_z + zc(15) = zv_w*zxyz_ + zc(16) = zv_w*zxyz + zc(17) = zvw_*zx_y_z_ + zc(18) = zvw_*zx_y_z + zc(19) = zvw_*zx_yz_ + zc(20) = zvw_*zx_yz + zc(21) = zvw_*zxy_z_ + zc(22) = zvw_*zxy_z + zc(23) = zvw_*zxyz_ + zc(24) = zvw_*zxyz + zc(25) = zvw*zx_y_z_ + zc(26) = zvw*zx_y_z + zc(27) = zvw*zx_yz_ + zc(28) = zvw*zx_yz + zc(29) = zvw*zxy_z_ + zc(30) = zvw*zxy_z + zc(31) = zvw*zxyz_ + zc(32) = zvw*zxyz + + ! Interpolation of the particle formation rates table + ! within the current 5D hypercuboid: + + ppfr(jj,ji) = & + - zc(1)*pfr_table(i_cs_0,i_ipr_0,i_h2so4_0,i_rh_0,i_temp_0) & + + zc(2)*pfr_table(i_cs_1,i_ipr_0,i_h2so4_0,i_rh_0,i_temp_0) & + + zc(3)*pfr_table(i_cs_0,i_ipr_1,i_h2so4_0,i_rh_0,i_temp_0) & + - zc(4)*pfr_table(i_cs_1,i_ipr_1,i_h2so4_0,i_rh_0,i_temp_0) & + + zc(5)*pfr_table(i_cs_0,i_ipr_0,i_h2so4_1,i_rh_0,i_temp_0) & + - zc(6)*pfr_table(i_cs_1,i_ipr_0,i_h2so4_1,i_rh_0,i_temp_0) & + - zc(7)*pfr_table(i_cs_0,i_ipr_1,i_h2so4_1,i_rh_0,i_temp_0) & + + zc(8)*pfr_table(i_cs_1,i_ipr_1,i_h2so4_1,i_rh_0,i_temp_0) & + + zc(9)*pfr_table(i_cs_0,i_ipr_0,i_h2so4_0,i_rh_1,i_temp_0) & + - zc(10)*pfr_table(i_cs_1,i_ipr_0,i_h2so4_0,i_rh_1,i_temp_0) & + - zc(11)*pfr_table(i_cs_0,i_ipr_1,i_h2so4_0,i_rh_1,i_temp_0) & + + zc(12)*pfr_table(i_cs_1,i_ipr_1,i_h2so4_0,i_rh_1,i_temp_0) & + - zc(13)*pfr_table(i_cs_0,i_ipr_0,i_h2so4_1,i_rh_1,i_temp_0) & + + zc(14)*pfr_table(i_cs_1,i_ipr_0,i_h2so4_1,i_rh_1,i_temp_0) & + + zc(15)*pfr_table(i_cs_0,i_ipr_1,i_h2so4_1,i_rh_1,i_temp_0) & + - zc(16)*pfr_table(i_cs_1,i_ipr_1,i_h2so4_1,i_rh_1,i_temp_0) & + + zc(17)*pfr_table(i_cs_0,i_ipr_0,i_h2so4_0,i_rh_0,i_temp_1) & + - zc(18)*pfr_table(i_cs_1,i_ipr_0,i_h2so4_0,i_rh_0,i_temp_1) & + - zc(19)*pfr_table(i_cs_0,i_ipr_1,i_h2so4_0,i_rh_0,i_temp_1) & + + zc(20)*pfr_table(i_cs_1,i_ipr_1,i_h2so4_0,i_rh_0,i_temp_1) & + - zc(21)*pfr_table(i_cs_0,i_ipr_0,i_h2so4_1,i_rh_0,i_temp_1) & + + zc(22)*pfr_table(i_cs_1,i_ipr_0,i_h2so4_1,i_rh_0,i_temp_1) & + + zc(23)*pfr_table(i_cs_0,i_ipr_1,i_h2so4_1,i_rh_0,i_temp_1) & + - zc(24)*pfr_table(i_cs_1,i_ipr_1,i_h2so4_1,i_rh_0,i_temp_1) & + - zc(25)*pfr_table(i_cs_0,i_ipr_0,i_h2so4_0,i_rh_1,i_temp_1) & + + zc(26)*pfr_table(i_cs_1,i_ipr_0,i_h2so4_0,i_rh_1,i_temp_1) & + + zc(27)*pfr_table(i_cs_0,i_ipr_1,i_h2so4_0,i_rh_1,i_temp_1) & + - zc(28)*pfr_table(i_cs_1,i_ipr_1,i_h2so4_0,i_rh_1,i_temp_1) & + + zc(29)*pfr_table(i_cs_0,i_ipr_0,i_h2so4_1,i_rh_1,i_temp_1) & + - zc(30)*pfr_table(i_cs_1,i_ipr_0,i_h2so4_1,i_rh_1,i_temp_1) & + - zc(31)*pfr_table(i_cs_0,i_ipr_1,i_h2so4_1,i_rh_1,i_temp_1) & + + zc(32)*pfr_table(i_cs_1,i_ipr_1,i_h2so4_1,i_rh_1,i_temp_1) + + ppfr(jj,ji) = exp(ppfr(jj,ji)) + + ENDDO + ENDDO + + END SUBROUTINE nucl_kazil_lovejoy + + !============================================================================= + + SUBROUTINE nucl_activation(kproma,kbdim,klev,ph2so4,pforest,ppbl,ppfr,pns) + + ! *nucl_activation* returns the formation rate of aerosol particles from + ! organic nucleation (activation type). + ! + ! References: + ! + ! Kulmala, M., Lehtinen, K. E. J., and Laaksonen, A.: Cluster activation + ! theory as an explanation of the linear dependence between formation rate of + ! 3nm particles and sulphuric acid concentration, Atmos. Chem. Phys., 6, + ! 787-793, 2006 + ! + ! Riipinen, I., Sihto, S.-L., Kulmala, M., Arnold, F., Dal Maso, M., Birmili, + ! W., Saarnio, K., Teinila, K., Kerminen, V.-M., Laaksonen, A., and Lehtinen, + ! K. E. J.: Connections between atmospheric sulphuric acid and new particle + ! formation during QUEST III-IV campaigns in Heidelberg and Hyytiala, + ! Atmos. Chem. Phys., 7, 1899-1914, 2007. + + IMPLICIT NONE + + ! + ! Input variables: + ! + + INTEGER :: kproma, & ! " geographic block number of locations + kbdim, & ! " geographic block maximum number of locations + klev ! " numer of levels + + REAL(dp):: ph2so4(kbdim,klev), & ! Gas phase H2SO4 concentration [molec. cm-3] + ppbl(kbdim), & ! Planetary boundary layer top level + pforest(kbdim) ! Forest fraction + + ! + ! Output variables: + ! + + REAL(dp) :: ppfr(kbdim,klev) ! Aerosol formation rate (cm-3 s-1) + REAL(dp) :: pns(kbdim,klev) ! Number of H2SO4 molecules in the newly formed aerosol particles + + ! + ! Local variables: + ! + + INTEGER :: jk,jl + + ! Activation nucleation (Kulmala et al., ACP 2006), parameterized by + ! Riipinen et al., ACP 2007, using Hyytiala QUEST II campaign median. + ! Proceeds only over forests, in proportion to the forest fraction, + ! and only in the boundary layer. + + + DO jl = 1, kproma + ! Above the boundary layer: + DO jk = 1, int(ppbl(jl)) - 1 + pns(jl,jk) = 0.0_dp + ppfr(jl,jk) = 0.0_dp + ENDDO + ! In the boundary layer: + DO jk = int(ppbl(jl)), klev + pns(jl,jk) = 1.0_dp + ppfr(jl,jk) = 1.0E-6_dp*ph2so4(jl,jk)*pforest(jl) + ENDDO + ENDDO + + END SUBROUTINE nucl_activation + + !============================================================================= + + SUBROUTINE nucl_kinetic(kproma,kbdim,klev,ph2so4,pforest,ppbl,ppfr,pns) + + ! *nucl_kinetic* returns the formation rate of aerosol particles from + ! organic nucleation (kinetic type). + ! + ! References: + ! + ! Kuang, C., P. H. McMurry, A. V. McCormick, and F. L. Eisele, + ! Dependence of nucleation rates on sulfuric acid vapor concentration in + ! diverse atmospheric locations, J. Geophys. Res., 113, D10209, + ! doi:10.1029/2007JD009253, 2008 + ! + ! Laakso, L., Anttila, T., Lehtinen, K. E. J., Aalto, P. P., Kulmala, + ! M., Horrak, U., Paatero, J., Hanke, M., and Arnold, F.: Kinetic nucleation + ! and ions in boreal forest particle formation events, Atmos. Chem. Phys., 4, + ! 2353-2366, 2004 + ! + ! Sihto, S.-L., Kulmala, M., Kerminen, V.-M., Dal Maso, M., Petaja, T., + ! Riipinen, I., Korhonen, H., Arnold, F., Janson, R., Boy, M., Laaksonen, + ! A., and Lehtinen, K. E. J.: Atmospheric sulphuric acid and aerosol + ! formation: implications from atmospheric measurements for nucleation and + ! early growth mechanisms, Atmos. Chem. Phys., 6, 4079-4091, 2006 + + IMPLICIT NONE + + ! + ! Input variables: + ! + + INTEGER :: kproma, & ! " geographic block number of locations + kbdim, & ! " geographic block maximum number of locations + klev ! " numer of levels + + REAL(dp):: ph2so4(kbdim,klev), & ! Gas phase H2SO4 concentration [molec. cm-3] + ppbl(kbdim), & ! Planetary boundary layer top level + pforest(kbdim) ! Forest fraction + + ! + ! Output variables: + ! + + REAL(dp) :: ppfr(kbdim,klev) ! Aerosol formation rate (cm-3 s-1) + REAL(dp) :: pns(kbdim,klev) ! Number of H2SO4 molecules in the newly formed aerosol particles + + ! + ! Local variables: + ! + + INTEGER :: jk,jl + + ! Kinetic nucleation (Laakso et al., ACP 2004), parameterized by Kuang et + ! al., JGR 2008, using Hyytiala QUEST II campaign data (Sihto et al., ACP + ! 2006). Proceeds only over forests, in proportion to the forest fraction, + ! and only in the boundary layer. + + DO jl = 1, kproma + ! Above the boundary layer: + DO jk = 1, int(ppbl(jl)) - 1 + pns(jl,jk) = 0.0_dp + ppfr(jl,jk) = 0.0_dp + ENDDO + ! In the boundary layer: + DO jk = int(ppbl(jl)), klev + pns(jl,jk) = 2.0_dp + ppfr(jl,jk) = 3.86E-13_dp*ph2so4(jl,jk)*ph2so4(jl,jk)*pforest(jl) + ENDDO + ENDDO + + END SUBROUTINE nucl_kinetic + +!============================================================================= +#ifdef HAMMOZ + SUBROUTINE ham_nucl_initialize() + + ! *ham_nucl_initialize* reads data needed to calculate formation rates of + ! aerosol particles from the gas phase. + + USE mo_ham_m7ctl, ONLY: nsnucl + USE mo_netcdf + USE mo_mpi, ONLY: p_parallel,p_parallel_io,p_io,p_bcast + + IMPLICIT NONE + + ! + ! Local variables: + ! + + CHARACTER(LEN=32) :: file + + INTEGER :: i_status,i_nc_id,i_dim_id,i_var_id + + INTEGER :: ji + + REAL(dp) :: zvalue + + IF (nsnucl==2) THEN ! Kazil and Lovejoy nucleation scheme + + ! Read tabulated formation rates of sulfate aerosol particles containing + ! at least 15 H2SO4 molecules from the netCDF archive: + + file = 'parnuc.15H2SO4.nc' + + IF (p_parallel) THEN ! In parallel mode + + IF (p_parallel_io) THEN ! We are on the I/O processor + + i_status = nf_open(file,NF_NOWRITE,i_nc_id) + CALL nf_check(i_status,file) + + ! + ! Read the lenghts of the dimensions of the particle formation rate tables: + ! + + CALL IO_INQ_DIMID(i_nc_id,'temperature',i_dim_id) + CALL IO_INQ_DIMLEN(i_nc_id,i_dim_id,t_n) + CALL IO_INQ_DIMID(i_nc_id,'RH',i_dim_id) + CALL IO_INQ_DIMLEN(i_nc_id,i_dim_id,rh_n) + ! As the dimension/variable name used for the H2SO4 gas phase + ! concentration we try both '[H2SO4]' and 'H2SO4'. '[H2SO4]' is + ! obsolete, as newer versions of the netCDF library do not allow + ! special characters such as '[' as first character of a dimension/ + ! variable name, but lookup tables using '[H2SO4]' may still be in + ! use. + + i_status = NF_INQ_DIMID(i_nc_id,'H2SO4',i_dim_id) + IF (i_status /= nf_noerr) i_status = NF_INQ_DIMID(i_nc_id,'[H2SO4]',i_dim_id) + CALL IO_INQ_DIMLEN(i_nc_id,i_dim_id,h2so4_n) + CALL IO_INQ_DIMID(i_nc_id,'ionization',i_dim_id) + CALL IO_INQ_DIMLEN(i_nc_id,i_dim_id,ipr_n) + CALL IO_INQ_DIMID(i_nc_id,'condensation_sink',i_dim_id) + CALL IO_INQ_DIMLEN(i_nc_id,i_dim_id,cs_n) + + i_status = nf_close(i_nc_id) + + ENDIF + + ! Broadcast the dimensions: + + CALL p_bcast(t_n,p_io) + CALL p_bcast(rh_n,p_io) + CALL p_bcast(h2so4_n,p_io) + CALL p_bcast(ipr_n,p_io) + CALL p_bcast(cs_n,p_io) + + ELSE ! In serial mode + + i_status = nf_open(file,NF_NOWRITE,i_nc_id) + CALL nf_check(i_status,file) + + ! + ! Read the lenghts of the dimensions of the particle formation rate tables: + ! + + CALL IO_INQ_DIMID(i_nc_id,'temperature',i_dim_id) + CALL IO_INQ_DIMLEN(i_nc_id,i_dim_id,t_n) + + CALL IO_INQ_DIMID(i_nc_id,'RH',i_dim_id) + CALL IO_INQ_DIMLEN(i_nc_id,i_dim_id,rh_n) + + ! As the dimension/variable name used for the H2SO4 gas phase + ! concentration we try both '[H2SO4]' and 'H2SO4'. '[H2SO4]' is + ! obsolete, as newer versions of the netCDF library do not allow + ! special characters such as '[' as first character of a dimension/ + ! variable name, but lookup tables using '[H2SO4]' may still be in + ! use. + + i_status = NF_INQ_DIMID(i_nc_id,'H2SO4',i_dim_id) + IF (i_status /= nf_noerr) i_status = NF_INQ_DIMID(i_nc_id,'[H2SO4]',i_dim_id) + CALL IO_INQ_DIMLEN(i_nc_id,i_dim_id,h2so4_n) + + CALL IO_INQ_DIMID(i_nc_id,'ionization',i_dim_id) + CALL IO_INQ_DIMLEN(i_nc_id,i_dim_id,ipr_n) + + CALL IO_INQ_DIMID(i_nc_id,'condensation_sink',i_dim_id) + CALL IO_INQ_DIMLEN(i_nc_id,i_dim_id,cs_n) + + i_status = nf_close(i_nc_id) + + ENDIF + + ! + ! Allocate memory for the ambient conditions and the particle + ! formation rate arrays: + ! + + ALLOCATE(t_table(t_n)) + ALLOCATE(rh_table(rh_n)) + ALLOCATE(h2so4_table(h2so4_n)) + ALLOCATE(ipr_table(ipr_n)) + ALLOCATE(cs_table(cs_n)) + + ALLOCATE(pfr_table(cs_n,ipr_n,h2so4_n,rh_n,t_n)) + + IF (p_parallel) THEN ! In parallel mode + + IF (p_parallel_io) THEN ! We are on the I/O processor + + i_status = nf_open(file,NF_NOWRITE,i_nc_id) + CALL nf_check(i_status,file) + + ! + ! Read the ambient conditions: + ! + + ! Temperature: + + CALL IO_INQ_VARID(i_nc_id,'temperature',i_var_id) + + DO ji = 1, t_n + i_status = nf_get_var1_double(i_nc_id,i_var_id,ji,zvalue) + CALL nf_check(i_status,file) + t_table(ji) = zvalue + ENDDO + + ! RH: + + CALL IO_INQ_VARID(i_nc_id,'RH',i_var_id) + + DO ji = 1, rh_n + i_status = nf_get_var1_double(i_nc_id,i_var_id,ji,zvalue) + CALL nf_check(i_status,file) + rh_table(ji) = zvalue + ENDDO + + ! [H2SO4]g: + + ! As the dimension/variable name used for the H2SO4 gas phase + ! concentration we try both '[H2SO4]' and 'H2SO4'. '[H2SO4]' is + ! obsolete, as newer versions of the netCDF library do not allow + ! special characters such as '[' as first character of a dimension/ + ! variable name, but lookup tables using '[H2SO4]' may still be in + ! use. + + i_status = NF_INQ_VARID(i_nc_id,'H2SO4',i_var_id) + IF (i_status /= nf_noerr) i_status = NF_INQ_DIMID(i_nc_id,'[H2SO4]',i_var_id) + + DO ji = 1, h2so4_n + i_status = nf_get_var1_double(i_nc_id,i_var_id,ji,zvalue) + CALL nf_check(i_status,file) + h2so4_table(ji) = zvalue + ENDDO + + ! Ionization rate: + + CALL IO_INQ_VARID(i_nc_id,'ionization',i_var_id) + + DO ji = 1, ipr_n + i_status = nf_get_var1_double(i_nc_id,i_var_id,ji,zvalue) + CALL nf_check(i_status,file) + ipr_table(ji) = zvalue + ENDDO + + ! H2SO4 condensation sink: + + CALL IO_INQ_VARID(i_nc_id,'condensation_sink',i_var_id) + + DO ji = 1, cs_n + i_status = nf_get_var1_double(i_nc_id,i_var_id,ji,zvalue) + CALL nf_check(i_status,file) + cs_table(ji) = zvalue + ENDDO + + ! + ! Read the particle formation rate: + ! + + CALL IO_INQ_VARID(i_nc_id,'pfr',i_var_id) + i_status = nf_get_var_double(i_nc_id,i_var_id,pfr_table) + CALL nf_check(i_status,file) + + i_status = nf_close(i_nc_id) + + ENDIF + + ! Broadcast the ambient conditions: + + CALL p_bcast(t_table,p_io) + CALL p_bcast(rh_table,p_io) + CALL p_bcast(h2so4_table,p_io) + CALL p_bcast(ipr_table,p_io) + CALL p_bcast(cs_table,p_io) + + ! Broadcast the particle formation rates: + + CALL p_bcast(pfr_table,p_io) + + ELSE ! In serial mode + + i_status = nf_open(file,NF_NOWRITE,i_nc_id) + CALL nf_check(i_status,file) + + ! + ! Read the ambient conditions: + ! + + ! Temperature: + + CALL IO_INQ_VARID(i_nc_id,'temperature',i_var_id) + + DO ji = 1, t_n + i_status = nf_get_var1_double(i_nc_id,i_var_id,ji,zvalue) + CALL nf_check(i_status,file) + t_table(ji) = zvalue + ENDDO + + ! RH: + + CALL IO_INQ_VARID(i_nc_id,'RH',i_var_id) + + DO ji = 1, rh_n + i_status = nf_get_var1_double(i_nc_id,i_var_id,ji,zvalue) + CALL nf_check(i_status,file) + rh_table(ji) = zvalue + ENDDO + + ! [H2SO4]g: + + ! As the dimension/variable name used for the H2SO4 gas phase + ! concentration we try both '[H2SO4]' and 'H2SO4'. '[H2SO4]' is + ! obsolete, as newer versions of the netCDF library do not allow + ! special characters such as '[' as first character of a dimension/ + ! variable name, but lookup tables using '[H2SO4]' may still be in + ! use. + + i_status = NF_INQ_VARID(i_nc_id,'H2SO4',i_var_id) + IF (i_status /= nf_noerr) i_status = NF_INQ_DIMID(i_nc_id,'[H2SO4]',i_var_id) + + DO ji = 1, h2so4_n + i_status = nf_get_var1_double(i_nc_id,i_var_id,ji,zvalue) + CALL nf_check(i_status,file) + h2so4_table(ji) = zvalue + ENDDO + + ! Ionization rate: + + CALL IO_INQ_VARID(i_nc_id,'ionization',i_var_id) + + DO ji = 1, ipr_n + i_status = nf_get_var1_double(i_nc_id,i_var_id,ji,zvalue) + CALL nf_check(i_status,file) + ipr_table(ji) = zvalue + ENDDO + + ! H2SO4 condensation sink: + + CALL IO_INQ_VARID(i_nc_id,'condensation_sink',i_var_id) + + DO ji = 1, cs_n + i_status = nf_get_var1_double(i_nc_id,i_var_id,ji,zvalue) + CALL nf_check(i_status,file) + cs_table(ji) = zvalue + ENDDO + + ! + ! Read the particle formation rate: + ! + + CALL IO_INQ_VARID(i_nc_id,'pfr',i_var_id) + + i_status = nf_get_var_double(i_nc_id,i_var_id,pfr_table) + CALL nf_check(i_status,file) + + i_status = nf_close(i_nc_id) + + ENDIF + + ENDIF + + END SUBROUTINE ham_nucl_initialize + + !============================================================================= + + SUBROUTINE ham_nucl_cleanup() + + ! *ham_nucl_cleanup* deallocates the memory of the module mo_ham_m7_nucl. + + USE mo_ham_m7ctl, ONLY: nsnucl + + IMPLICIT NONE + + IF (nsnucl==2) THEN ! Kazil and Lovejoy nucleation scheme + + DEALLOCATE(t_table) + DEALLOCATE(rh_table) + DEALLOCATE(h2so4_table) + DEALLOCATE(ipr_table) + DEALLOCATE(cs_table) + + DEALLOCATE(pfr_table) + + ENDIF + + END SUBROUTINE ham_nucl_cleanup +#endif +END MODULE mo_ham_m7_nucl diff --git a/ifs-source/arpifs/phys_ec/mo_ham_m7_trac.F90 b/ifs-source/arpifs/phys_ec/mo_ham_m7_trac.F90 new file mode 100644 index 00000000..5309da8f --- /dev/null +++ b/ifs-source/arpifs/phys_ec/mo_ham_m7_trac.F90 @@ -0,0 +1,287 @@ +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! \filename +!! mo_ham_m7_trac.f90 +!! +!! \brief +!! mo_ham_m7_trac contains routines to requests tracers for ECHAM/HAM and +!! prescribes their physical and chemical properties. +!! It controls the aerosol physics by providing the necessary switches. +!! +!! \author Philip Stier (MPI-Met) +!! +!! \responsible_coder +!! Martin G. Schultz, m.schultz@fz-juelich.de +!! +!! \revision_history +!! -# P. Stier (MPI-Met) - original code (2001) +!! -# D. O'Donnell (MPI-Met) - code generalization and changes for soa (2009-02-xx) +!! -# K. Zhang (MPI-Met) - adaption for new species list and tracer defination (2009-08-11) +!! -# M.G. Schultz (FZ Juelich) - cleanup and adaptation to new structure (2009-11-20) +!! +!! \limitations +!! None +!! +!! \details +!! None +!! +!! \bibliographic_references +!! None +!! +!! \belongs_to +!! HAMMOZ +!! +!! SPDX-License-Identifier: BSD-3-Clause +!! Copyright (c) 2021 hammoz + +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +!!### Questionable whether this module is needed with new emissions scheme. +!! idt_ seem to be used primarily for identiyfing tracers for emissions. + +MODULE mo_ham_m7_trac + + ! Parameters: + ! ----------- + ! User defined flags: density density [kg m-3] + ! osm osmotic coefficient [???] + ! nion number of ions the tracer + ! dissolves into [1] + + USE mo_kind, ONLY: dp + USE mo_tracdef, ONLY: ntrac, & ! number of tracers + OFF, ON, & ! ON/OFF index + GAS, & ! phase indicators + AEROSOLMASS, & ! + AEROSOLNUMBER, & ! + SOLUBLE, & ! soluble indicator + INSOLUBLE, & + itrprog, itrdiag, itrpresc + USE mo_species, ONLY: speclist + USE mo_physical_constants, ONLY: rhoh2o + USE mo_ham_species, ONLY: id_dms, id_so2, id_so4g, id_oh, id_h2o2, id_o3, & + id_no2, id_so4, id_bc, id_oc, id_ss, id_du, id_wat + + IMPLICIT NONE + + !--- Public entities: + + PUBLIC :: idt_dms, idt_so2, idt_so4, idt_ocnv, & + idt_ms4ns, idt_ms4ks, idt_ms4as, idt_ms4cs, & + idt_mbcki, idt_mbcks, idt_mbcas, idt_mbccs, & + idt_mocki, idt_mocks, idt_mocas, idt_moccs, & + idt_mssas, idt_msscs, & + idt_mduai, idt_mduas, idt_mduci, idt_mducs, & + idt_nns, idt_nki, idt_nks, idt_nai, & + idt_nas, idt_nci, idt_ncs, & + idt_cdnc_ham, idt_icnc_ham, & + idt_mwans, idt_mwaks, idt_mwaas, idt_mwacs + + PUBLIC:: ham_m7_set_idt + PUBLIC:: ham_get_class_flag ! for tracer diagnostics + + !--- Module variables: + ! + ! Tracer indices: + ! + ! Legend: iABBCD + ! + ! A: m = particle mass mixing ratio, n number mixing ratio + ! BB: s4 = sulfate, bc/oc = black/organic carbon, du = dust, ss = seasalt + ! C: n = nucleation , k = Aitken, a = accumulation, c = coarse mode + ! D: i = insoluble, s = soluble + + INTEGER :: idt_dms ! mass mixing ratio dms + INTEGER :: idt_so2 ! mass mixing ratio so2 + INTEGER :: idt_so4 ! mass mixing ratio so4 + INTEGER :: idt_ocnv ! mass mixing ratio nonvolatile organic + + INTEGER :: idt_ms4ns ! mass mixing ratio sulfate nuclea. soluble + INTEGER :: idt_ms4ks ! mass mixing ratio sulfate aitken soluble + INTEGER :: idt_ms4as ! mass mixing ratio sulfate accum. soluble + INTEGER :: idt_ms4cs ! mass mixing ratio sulfate coarse soluble + INTEGER :: idt_mbcki ! mass mixing ratio black carbon aitken insoluble + INTEGER :: idt_mbcks ! mass mixing ratio black carbon aitken soluble + INTEGER :: idt_mbcas ! mass mixing ratio black carbon accum. soluble + INTEGER :: idt_mbccs ! mass mixing ratio black carbon coarse soluble + INTEGER :: idt_mocki ! mass mixing ratio organic carbon aitken insoluble + INTEGER :: idt_mocks ! mass mixing ratio organic carbon aitken soluble + INTEGER :: idt_mocas ! mass mixing ratio organic carbon accum. soluble + INTEGER :: idt_moccs ! mass mixing ratio organic carbon coarse soluble + INTEGER :: idt_mssas ! mass mixing ratio seasalt accum. soluble + INTEGER :: idt_msscs ! mass mixing ratio seasalt coarse soluble + INTEGER :: idt_mduai ! mass mixing ratio dust accum. insoluble + INTEGER :: idt_mduas ! mass mixing ratio dust accum. soluble + INTEGER :: idt_mduci ! mass mixing ratio dust coarse insoluble + INTEGER :: idt_mducs ! mass mixing ratio dust coarse soluble + INTEGER :: idt_mwans ! mass mixing ratio aerosol water nuclea. soluble + INTEGER :: idt_mwaks ! mass mixing ratio aerosol water aitken soluble + INTEGER :: idt_mwaas ! mass mixing ratio aerosol water accum. soluble + INTEGER :: idt_mwacs ! mass mixing ratio aerosol water coarse soluble + + + INTEGER :: idt_nns ! number mixing ratio nuclea. soluble + INTEGER :: idt_nki ! number mixing ratio aitken insoluble + INTEGER :: idt_nks ! number mixing ratio aitken soluble + INTEGER :: idt_nai ! number mixing ratio accum. insoluble + INTEGER :: idt_nas ! number mixing ratio accum. soluble + INTEGER :: idt_nci ! number mixing ratio coarse insoluble + INTEGER :: idt_ncs ! number mixing ratio coarse soluble + + INTEGER :: idt_cdnc_ham ! cloud droplet number concentration + INTEGER :: idt_icnc_ham ! ice cristal number concentration + + + CONTAINS + + + + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! Define HAM tracers +!! +!! @author see module info +!! +!! $Id: 1423$ +!! +!! @par Revision History +!! see module info +!! +!! @par This subroutine is called by +!! to_be_filled +!! +!! @par Externals: +!!
    +!!
  1. none +!!
+!! +!! @par Notes +!! +!! @par Responsible coder +!! m.schultz@fz-juelich.de +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + + + SUBROUTINE ham_m7_set_idt + + USE mo_ham, ONLY: aerocomp, aerowater, sizeclass + USE mo_ham_m7ctl, ONLY: inucs, iaits, iaccs, icoas, & + iaiti, iacci, icoai, & + iso4ns, iso4ks, iso4as, iso4cs, & + ibcks, ibcas, ibccs, ibcki, & + iocks, iocas, ioccs, iocki, & + issas, isscs, & + iduas, iducs, iduai, iduci + + + idt_dms = speclist(id_dms)%idt + idt_so2 = speclist(id_so2)%idt + idt_so4 = speclist(id_so4g)%idt + + idt_ms4ns = aerocomp(iso4ns)%idt + idt_ms4ks = aerocomp(iso4ks)%idt + idt_ms4as = aerocomp(iso4as)%idt + idt_ms4cs = aerocomp(iso4cs)%idt + + idt_mbcks = aerocomp(ibcks)%idt + idt_mbcas = aerocomp(ibcas)%idt + idt_mbccs = aerocomp(ibccs)%idt + idt_mbcki = aerocomp(ibcki)%idt + + idt_mocks = aerocomp(iocks)%idt + idt_mocas = aerocomp(iocas)%idt + idt_moccs = aerocomp(ioccs)%idt + idt_mocki = aerocomp(iocki)%idt + + idt_mssas = aerocomp(issas)%idt + idt_msscs = aerocomp(isscs)%idt + + idt_mduas = aerocomp(iduas)%idt + idt_mducs = aerocomp(iducs)%idt + idt_mduai = aerocomp(iduai)%idt + idt_mduci = aerocomp(iduci)%idt + + idt_nns = sizeclass(inucs)%idt_no + idt_nks = sizeclass(iaits)%idt_no + idt_nas = sizeclass(iaccs)%idt_no + idt_ncs = sizeclass(icoas)%idt_no + idt_nki = sizeclass(iaiti)%idt_no + idt_nai = sizeclass(iacci)%idt_no + idt_nci = sizeclass(icoai)%idt_no + + idt_mwans = aerowater(inucs)%idt + idt_mwaks = aerowater(iaits)%idt + idt_mwaas = aerowater(iaccs)%idt + idt_mwacs = aerowater(icoas)%idt + +END SUBROUTINE ham_m7_set_idt + +!@brief: set a list of flag values and mode names for th eindividual aerosol modes +! +! The flag values depend on the optional property flags ldrydep, ... +! +! @author: Martin Schultz, FZ Juelich (2010-04-16) +! +SUBROUTINE ham_get_class_flag(nclass, classflag, classname, classnumname, & + ldrydep, lwetdep, lsedi) !>>dod added lsedi <nclass + USE mo_tracdef, ONLY: ln + !>>dod + USE mo_exception, ONLY:finish + !<>dod + + INTEGER :: jclass + + !>>dod + IF (PRESENT(lwetdep) .AND. PRESENT(ldrydep)) CALL finish('mo_ham_m7_trac', 'ham_get_class_flag received multiple requests') + IF (PRESENT(lwetdep) .AND. PRESENT(lsedi)) CALL finish('mo_ham_m7_trac', 'ham_get_class_flag received multiple requests') + IF (PRESENT(ldrydep) .AND. PRESENT(lsedi)) CALL finish('mo_ham_m7_trac', 'ham_get_class_flag received multiple requests') + ! + ! define number of values returned + nclass = aero_nclass + ! define values + DO jclass = 1,nclass + classname(jclass) = sizeclass(jclass)%shortname + !>>SF #299: added mode number name + classnumname(jclass) = 'NUM_'//TRIM(sizeclass(jclass)%shortname) + !<>dod: drydep is true for all modes + IF (PRESENT(ldrydep)) THEN + IF (ldrydep) classflag(:) = .TRUE. + END IF + !<>dod: so is wetdep... + IF (PRESENT(lwetdep)) THEN + IF (lwetdep) classflag(:) = .TRUE. + END IF + + !>>dod + IF (PRESENT(lsedi)) THEN + IF (lsedi) THEN + DO jclass = 1,nclass + classflag(jclass) = sizeclass(jclass)%lsed + END DO + END IF + END IF + !< +!! \filename +!! mo_ham_m7ctl.f90 +!! +!! \brief +!! mo_ham_m7ctl contains parameters, switches and initialization routines for the m7 aerosol module. +!! +!! \author Elisabetta Vignatti (JRC/EI) +!! \author Philip Stier (MPI-Met) +!! +!! \responsible_coder +!! Martin G. Schultz, m.schultz@fz-juelich.de +!! +!! \revision_history +!! -# E. Vignati and J. Wilson (JRC/EI) - original code (2000) +!! -# P. Stier (MPI-Met) (2001/2002) +!! -# J. Kazil (MPI-Met) (2008) +!! -# D. O'Donnell (MPI-Met) (2007-2007) +!! -# M.G. Schultz (FZ Juelich) - new module struture (2009) +!! +!! \limitations +!! Currently, there are two index lists for aerosol species: aero_idx in mo_species +!! and subm_aerospec in this module. I hope these are identical for the current model set-up +!! in preparation for CMIP5. Later, one may wish to distinguish between the two: aero_idx +!! could contain additional aerosol species (e.g. from MOZART or climatologies), and this could +!! mess up the M7 code. If this can be generalized: fine. if not we should keep the two +!! lists separate. mo_ham_rad (for example) works on aero_idx to be independent of M7 specifics. +!! +!! \details +!! None +!! +!! \bibliographic_references +!! None +!! +!! \belongs_to +!! HAMMOZ +!! +!! SPDX-License-Identifier: BSD-3-Clause +!! Copyright (c) 2021 hammoz + +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +MODULE mo_ham_m7ctl + + USE mo_kind, ONLY: dp + USE mo_math_constants, ONLY: pi + USE mo_physical_constants, ONLY: avo + USE mo_species, ONLY: nmaxspec + USE mo_ham, ONLY: HAM_M7, naeroclass, sigma_fine, sigma_coarse + + IMPLICIT NONE + + PRIVATE + + ! -- subroutines + PUBLIC :: sethamM7, m7_initialize + + ! -- variables + PUBLIC :: nwater, nsnucl, nonucl + PUBLIC :: lnucl_stat + PUBLIC :: inucs, iaits, iaccs, icoas, iaiti, iacci, icoai + + PUBLIC :: critn, cmin_aernl, cmin_aerml, cminvol, cminrad, cminrho, cdconv + PUBLIC :: wna2so4, wh2so4, wnacl, wnahso4 + PUBLIC :: dna2so4, dh2so4, dnacl, dnahso4 + PUBLIC :: dbc, doc, ddust + PUBLIC :: crh + + PUBLIC :: sigma, sigmaln + PUBLIC :: crdiv, caccso4, gmb, wvb, dh2o + PUBLIC :: bk, rerg, r_kcal + + PUBLIC :: so4_coating_threshold + PUBLIC :: cmr2ras, cmr2mmr, cmedr2mmedr, cmr2ram, ram2cmr + + !--- 1) Define and pre-set switches for the processes of M7: ----------------------- + + !--- Physical: + + INTEGER :: nwater = 1 ! Aerosol water uptake scheme: + ! + ! nwater = 0 Jacobson et al., JGR 1996 + ! = 1 Kappa-Koehler theory based approach (Petters and Kreidenweis, ACP 2007) + + INTEGER :: nsnucl = 0!eehol: nucleation off for M7 originally: 2 ! Choice of the H2SO4/H2O nucleation scheme: + ! + ! nsnucl = 0 off + ! = 1 Vehkamaeki et al., JGR 2002 + ! = 2 Kazil and Lovejoy, ACP 2007 + + INTEGER :: nonucl = 0!eehol: organic nucleation off for M7 originally 1 ! Choice of the organic nucleation scheme: + ! + ! nonucl = 0 off + ! = 1 Activation nucleation, Kulmala et al., ACP 2006 + ! = 2 Activation nucleation, Laakso et al., ACP 2004 + + LOGICAL :: lnucl_stat = .FALSE. ! Sample the cloud-free volume as function of T, RH, [H2SO4(g)], + ! H2SO4 condensation sink, and ionization rate (memory intensive) + + !--- Mass index (in array aerml and ttn): + ! + ! Attention: + ! The mass of sulfate compounds is always given in [molec. cm-3] + ! whilst the mass of other compounds is given in [ug cm-3]. + ! + ! Compounds: + ! + ! so4 = sulphate + ! bc = black carbon + ! oc = organic carbon, + ! ss = sea salt + ! du = dust + ! + ! Modes: + ! + ! n = nucleation mode + ! k = aitken mode + ! a = accumulation mode + ! c = coarse mode + ! + ! Type: + ! + ! s = soluble mode + ! i = insoluble mode + + ! M7 aerosol mode indices + ! i*[n|k|a|c][i|s] : n = nucleation mode + ! k = aitken mode + ! a = accumulation mode + ! c = coarse mode + ! i = insoluble + ! s = soluble + ! empty matrix entries are not populated. + INTEGER, PUBLIC :: iso4ns, iso4ks, iso4as, iso4cs, & + ibcks, ibcas, ibccs, & + ibcki, & + iocks, iocas, ioccs, & + iocki, & + issas, isscs, & + iduas, iducs, & + iduai, iduci + + !--- Number index (in array aernl): + ! + + INTEGER, PARAMETER :: & + inucs=1, iaits=2, iaccs=3, icoas=4, iaiti=5, iacci=6, icoai=7 + ! MODE: | | | | | + ! nucl. | aitk. | acc. | coar. | aitk. | acc. | coar. | + ! soluble | soluble | soluble | soluble | insol. | insol. | insol. | + + + !--- 4) Definition of the modes of M7: ------------------------------------------------------ + + !--- 4.1) Threshold radii between the different modes [cm]: + ! Used for the repartititioning in m7_dconc. + ! crdiv(jclass) is the lower bound and crdiv(jclass+1) is + ! the upper bound of the respective geometric mode. + + REAL(dp) :: crdiv(4)=(/ 0.0005E-4_dp, 0.005E-4_dp, 0.05E-4_dp, 0.5E-4_dp /) + ! | | | | + ! | | | | + ! nucleation aitken accum coarse mode + + !--- 4.2) Standard deviation for the modes: + + REAL(dp), PARAMETER :: sigma(naeroclass(HAM_M7))=(/ sigma_fine, sigma_fine, sigma_fine, sigma_coarse, & + sigma_fine, sigma_fine, sigma_coarse /) + + !--- Natural logarithm of the standard deviation of each mode: + ! Calulated in m7_initialize. + + REAL(dp) :: sigmaln(naeroclass(HAM_M7)) + + !--- 5) Conversion factors for lognormal particle size distributions: ------------- + ! Calulated in m7_initialize. + + REAL(dp) :: cmr2ras(naeroclass(HAM_M7)) ! Conversion factor: count median radius to radius of average surface + + REAL(dp) :: cmr2mmr(naeroclass(HAM_M7)) ! Conversion factor: count median radius to mass mean radius + + REAL(dp) :: cmedr2mmedr(naeroclass(HAM_M7)) ! Conversion factor: count median radius to mass median radius + + REAL(dp) :: cmr2ram(naeroclass(HAM_M7)) ! Conversion factor: count median radius to radius of average mass + + REAL(dp) :: ram2cmr(naeroclass(HAM_M7)) ! Conversion factor: radius of average mass to count median radius + + + !--- 6) Assumed thresholds for occurence of specific quantities: ------------- + + REAL(dp), PARAMETER :: cmin_aerml = 1.E-15_dp , & ! threshold for aerosol mass + cmin_aernl = 1.E-10_dp , & ! threshold for aerosol number +!>>gf #240 + cminvol = 1.E-23_dp, & ! threshold for aerosol volume + cminrad = 1.E-8_dp, & ! threshold for aerosol radius + cminrho = 1.E-10_dp ! threshold for aerosol density + + !--- 6.1) Density conversion + + REAL(dp), PARAMETER :: cdconv = 1.E-3_dp ! density conversion from kg m-3 to g cm-3 + +!<>dod soa +!!mgs!! REAL(dp), PARAMETER :: ws = 32._dp ! atomic weight of sulphur +!!mgs!! !<>dod changed handling of coagulation + TYPE, PUBLIC :: t_coag + INTEGER :: mode1 + INTEGER :: mode2 + END TYPE t_coag + + INTEGER, PARAMETER, PUBLIC :: ncoag = 16 + + TYPE(t_coag), PUBLIC :: coag_modes(ncoag) + !<>dod soa + !---executable procedure + + sizeclass(1)%classname = "Nucleation soluble" + sizeclass(1)%shortname = "NS" + sizeclass(1)%self = 1 + sizeclass(1)%lsoluble = .TRUE. + sizeclass(1)%lsed = .FALSE. + sizeclass(1)%lsoainclass = .FALSE. + sizeclass(1)%lactivation = .FALSE. + + sizeclass(2)%classname = "Aitken soluble" + sizeclass(2)%shortname = "KS" + sizeclass(2)%self = 2 + sizeclass(2)%lsoluble = .TRUE. + sizeclass(2)%lsed = .FALSE. + sizeclass(2)%lsoainclass = .TRUE. + sizeclass(2)%lactivation = .TRUE. + + sizeclass(3)%classname = "Accumulation soluble" + sizeclass(3)%shortname = "AS" + sizeclass(3)%self = 3 + sizeclass(3)%lsoluble = .TRUE. + sizeclass(3)%lsed = .TRUE. + sizeclass(3)%lsoainclass = .TRUE. + sizeclass(3)%lactivation = .TRUE. + + sizeclass(4)%classname = "Coarse soluble" + sizeclass(4)%shortname = "CS" + sizeclass(4)%self = 4 + sizeclass(4)%lsoluble = .TRUE. + sizeclass(4)%lsed = .TRUE. + sizeclass(4)%lsoainclass = .TRUE. + sizeclass(4)%lactivation = .TRUE. + + sizeclass(5)%classname = "Aitken insoluble" + sizeclass(5)%shortname = "KI" + sizeclass(5)%self = 5 + sizeclass(5)%lsoluble = .FALSE. + sizeclass(5)%lsed = .FALSE. + sizeclass(5)%lsoainclass = .TRUE. + sizeclass(5)%lactivation = .FALSE. + + sizeclass(6)%classname = "Accumulation insoluble" + sizeclass(6)%shortname = "AI" + sizeclass(6)%self = 6 + sizeclass(6)%lsoluble = .FALSE. + sizeclass(6)%lsed = .TRUE. + sizeclass(6)%lsoainclass = .FALSE. + sizeclass(6)%lactivation = .FALSE. + + sizeclass(7)%classname = "Coarse insoluble" + sizeclass(7)%shortname = "CI" + sizeclass(7)%self = 7 + sizeclass(7)%lsoluble = .FALSE. + sizeclass(7)%lsed = .TRUE. + sizeclass(7)%lsoainclass = .FALSE. + sizeclass(7)%lactivation = .FALSE. + !<>dod optimisation of coagulation + ! nucleation mode + coag_modes(1)%mode1 = inucs + coag_modes(1)%mode2 = inucs + coag_modes(2)%mode1 = inucs + coag_modes(2)%mode2 = iaits + coag_modes(3)%mode1 = inucs + coag_modes(3)%mode2 = iaccs + coag_modes(4)%mode1 = inucs + coag_modes(4)%mode2 = icoas + coag_modes(5)%mode1 = inucs + coag_modes(5)%mode2 = iaiti + coag_modes(6)%mode1 = inucs + coag_modes(6)%mode2 = iacci + coag_modes(7)%mode1 = inucs + coag_modes(7)%mode2 = icoai + + ! aitken soluble mode + coag_modes(8)%mode1 = iaits + coag_modes(8)%mode2 = iaits + coag_modes(9)%mode1 = iaits + coag_modes(9)%mode2 = iaccs + coag_modes(10)%mode1 = iaits + coag_modes(10)%mode2 = icoas + coag_modes(11)%mode1 = iaits + coag_modes(11)%mode2 = iaiti + coag_modes(12)%mode1 = iaits + coag_modes(12)%mode2 = iacci + coag_modes(13)%mode1 = iaits +!gf(#135) coag_modes(13)%mode2 = icoas + coag_modes(13)%mode2 = icoai + + ! accumulation soluble mode + coag_modes(14)%mode1 = iaccs + coag_modes(14)%mode2 = iaccs + coag_modes(15)%mode1 = iaccs +!gf #158 coag_modes(15)%mode2 = iacci + coag_modes(15)%mode2 = iaiti + + ! aitken insoluble mode + coag_modes(16)%mode1 = iaiti + coag_modes(16)%mode2 = iaiti + + !--- 4) Set prescribed scavenging ratios + ! + !SF Note: this was formerly hardcoded in mo_ham_m7_wetdep_data. + ! In order to handle more transparently M7 and SALSA, it is + ! necessary to make this initialization dynamic. + + IF (.NOT. ALLOCATED(csr_strat_wat)) ALLOCATE(csr_strat_wat(naeroclass(HAM_M7))) + IF (.NOT. ALLOCATED(csr_strat_mix)) ALLOCATE(csr_strat_mix(naeroclass(HAM_M7))) + IF (.NOT. ALLOCATED(csr_strat_ice)) ALLOCATE(csr_strat_ice(naeroclass(HAM_M7))) + IF (.NOT. ALLOCATED(csr_conv)) ALLOCATE(csr_conv(naeroclass(HAM_M7))) + IF (.NOT. ALLOCATED(cbcr)) ALLOCATE(cbcr(naeroclass(HAM_M7))) + IF (.NOT. ALLOCATED(cbcs)) ALLOCATE(cbcs(naeroclass(HAM_M7))) + + csr_strat_wat(1:naeroclass(HAM_M7)) = (/0.10_dp, 0.25_dp, 0.85_dp, 0.99_dp, 0.20_dp, 0.40_dp, 0.40_dp/) + csr_strat_mix(1:naeroclass(HAM_M7)) = (/0.10_dp, 0.40_dp, 0.75_dp, 0.75_dp, 0.10_dp, 0.40_dp, 0.40_dp/) + csr_strat_ice(1:naeroclass(HAM_M7)) = (/0.10_dp, 0.10_dp, 0.10_dp, 0.10_dp, 0.10_dp, 0.10_dp, 0.10_dp/) + csr_conv(1:naeroclass(HAM_M7)) = (/0.20_dp, 0.60_dp, 0.99_dp, 0.99_dp, 0.20_dp, 0.40_dp, 0.40_dp/) + !--- Mean mass scavenging coefficients normalized by rain-rate [kg m-2]: + ! Rain: Seinfeld & Pandis, Fig 20.15: + cbcr(1:naeroclass(HAM_M7)) = & + (/ 5.0E-4_dp, 1.0E-4_dp, 1.0E-3_dp, 1.0E-1_dp, 1.0E-4_dp, 1.0E-3_dp, 1.0E-1_dp /) + ! Snow: Little available, graphs in Prupbacher show similar order of magnitude in + ! collection efficiency as rain,therefore assume typical mean value as above: + cbcs(1:naeroclass(HAM_M7)) = & + (/ 5.0E-3_dp, 5.0E-3_dp, 5.0E-3_dp, 5.0E-3_dp, 5.0E-3_dp, 5.0E-3_dp, 5.0E-3_dp /) + + END SUBROUTINE m7_initialize + + + SUBROUTINE sethamM7 + + ! *sethamM7* modifies pre-set switches of the aeroM7ctl + ! namelist for the configuration of the + ! M7 component of the ECHAM/HAM aerosol model + ! + ! Authors: + ! -------- + ! Philip Stier, MPI-M 12/2002 + ! Jan Kazil, MPI-M 2008-03-03 20:34:52 + ! + ! *sethamM7* is called from *init_subm* in mo_submodel_interface + ! + +#ifdef HAMMOZ + USE mo_mpi, ONLY: p_parallel_io, p_bcast, p_io +#endif + USE mo_namelist, ONLY: open_nml, position_nml, POSITIONED + USE mo_exception, ONLY: message, em_warn, em_info + USE mo_util_string, ONLY: separator + USE mo_ham, ONLY: lgcr + + IMPLICIT NONE + + INCLUDE 'ham_m7ctl.inc' + + ! Local variables: + + INTEGER :: ierr, inml, iunit + + ! Read the namelist with the switches: + + CALL message('',separator) + CALL message('sethamM7', 'Reading namelist ham_m7ctl...', level=em_info) +#ifdef HAMMOZ + IF (p_parallel_io) THEN +#endif + + inml = open_nml('namelist.echam') + iunit = position_nml ('HAM_M7CTL', inml, status=ierr) + SELECT CASE (ierr) + CASE (POSITIONED) + READ (iunit, ham_m7ctl) + END SELECT + +#ifdef HAMMOZ + ENDIF +#endif + ! Broadcast the switches over the processors: + +#ifdef HAMMOZ + CALL p_bcast (nwater, p_io) + CALL p_bcast (nsnucl, p_io) + CALL p_bcast (nonucl, p_io) + CALL p_bcast (lnucl_stat, p_io) +#endif + + !--- error checking + IF (nsnucl > 1 .AND. .NOT. lgcr) THEN + CALL message('sethamM7', 'nsnucl > 1 requires lgcr=.TRUE.! Setting lgcr=.TRUE. now.', & + level=em_warn) + lgcr = .TRUE. + END IF + + !--- write the values of the switches: +#ifdef HAMMOZ + CALL sethamM7_log(nwater,nsnucl,nonucl,lnucl_stat) +#endif + + END SUBROUTINE sethamM7 + +#ifdef HAMMOZ + SUBROUTINE sethamM7_log(nwater,nsnucl,nonucl,lnucl_stat) + + ! *sethamM7_log* writes the values of the given switches in a given output + ! unit and conducts selceted consistency checks. + ! + ! Authors: + ! -------- + ! + ! 2008 Jan Kazil, MPI-M + + USE mo_exception, ONLY: message, message_text, em_param, em_error, em_info + USE mo_submodel, ONLY: print_value + USE mo_util_string, ONLY: separator + USE mo_ham, ONLY: lgcr + + IMPLICIT NONE + + ! + ! Input variables: + ! + + LOGICAL :: lnucl_stat + INTEGER :: nwater, nsnucl, nonucl + + CALL message('','',level=em_param) + CALL message('sethamM7','Initialization of the M7 aerosol module', level=em_info) + + CALL print_value('nwater', nwater) + SELECT CASE(nwater) + CASE (0) + CALL message('', ' --> Jacobson, Tabazadeh, and Turco (Jacobson et al., JGR 1996)', & + level=em_param) + CASE (1) + CALL message('', ' --> Kappa-Koehler theory based approach (Petters and Kreidenweis, ACP 2007)', & + level=em_param) + CASE DEFAULT + WRITE(message_text,'(a,i0,a)') 'nwater must be 0 or 1 (present value = ',nwater,')' + CALL message('sethamM7', message_text, level=em_error) + END SELECT + + + CALL print_value('nsnucl', nsnucl) + SELECT CASE(nsnucl) + CASE (0) + CALL message('', 'H2SO4/H2O nucleation off', & + level=em_param) + CASE (1) + CALL message('', ' --> Neutral H2SO4/H2O nucleation (Vehkamaeki et al., JGR 2002)', & + level=em_param) + CASE (2) + CALL message('', ' --> Neutral and charged H2SO4/H2O nucleation (Kazil and Lovejoy, ACP 2007)', & + level=em_param) + CASE DEFAULT + WRITE(message_text,'(a,i0,a)') 'nsnucl must be 0, 1 or 2 (present value = ',nsnucl,')' + CALL message('sethamM7', message_text, level=em_error) + END SELECT + + + CALL print_value('nonucl', nonucl) + SELECT CASE(nonucl) + CASE (0) + CALL message('', ' --> Organic aerosol nucleation off', & + level=em_param) + CASE (1) + CALL message('', ' --> Organic aerosol (activation) nucleation (Kulmala et al., ACP 2006)', & + level=em_param) + CASE (2) + CALL message('', ' --> Organic aerosol (kinetic) nucleation after (Laakso et al., ACP 2004)', & + level=em_param) + CASE DEFAULT + WRITE(message_text,'(a,i0,a)') 'nonucl must be 0, 1 or 2 (present value = ',nonucl,')' + CALL message('sethamM7', message_text, level=em_error) + END SELECT + + + IF (lnucl_stat) THEN + CALL message('', 'lnucl_stat=.TRUE. : Sampling the cloud-free volume as function of', & + level=em_param) + CALL message('', 'T, RH, [H2SO4(g)], H2SO4 condensation sink, and ionization rate', & + level=em_param) + END IF + + CALL message('', separator) + + END SUBROUTINE sethamM7_log +#endif + +END MODULE mo_ham_m7ctl diff --git a/ifs-source/arpifs/phys_ec/mo_ham_rad.F90 b/ifs-source/arpifs/phys_ec/mo_ham_rad.F90 new file mode 100755 index 00000000..4e31e822 --- /dev/null +++ b/ifs-source/arpifs/phys_ec/mo_ham_rad.F90 @@ -0,0 +1,2257 @@ +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! \filename +!! mo_ham_rad.f90 +!! +!! \brief +!! mo_ham_rad holds the parameters and routines for +!! the calculation of the optical parameters +!! for the aerosol distribution simulated +!! by the ECHAM/HAM aerosol module. +!! +!! \author Olivier Boucher (Univ. Lille) +!! \author Philip Stier (MPI-Met) +!! +!! \responsible_coder +!! [ John Doe, john.doe@blabla.com -Compulsory- ] +!! +!! \revision_history +!! -# O. Boucher (Univ. Lille) - original csource of some radiation routines (2003) +!! -# P. Stier (MPI-Met) - (2003-05-08) +!! -# P. Stier (Caltech) - adaption to ECHAM5/HAM, additional routines, refractive indices (2007) +!! -# S. Rast (MPI-Met) - adaptation to echam5.3.2 (2007-03) +!! -# D. O'Donnell (MPI-Met) - SOA (XXXX) +!! -# K. Zhang (MPI-Met) - submodel interface (2009-07) +!! -# M.G. Schultz (FZ Juelich) - cleanup (XXXX) +!! -# P. Stier (Uni Oxford) - adaptation to RRTM-SW (2010) +!! -# T. Bergman (FMI) - nmod->nclass to facilitate new aerosol models (2013-02-05) +!! -# H. Kokkola (FMI) - modified to include SALSA (2013-06) +!! +!! \limitations +!! None +!! +!! \details +!! None +!! +!! \bibliographic_references +!! - Stier et al., ACP, 2005 (SW, volume weighted refractive indices) +!! - Stier et al., ACPD, 2007 (LW, mixing rules,...) +!! +!! \belongs_to +!! HAMMOZ +!! +!! \copyright +!! Copyright and licencing conditions are defined in the ECHAM-HAMMOZ +!! licencing agreement to be found at: +!! https://redmine.hammoz.ethz.ch/projects/hammoz/wiki/1_Licencing_conditions +!! The ECHAM-HAMMOZ software is provided "as is" and without warranty of any kind. +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +MODULE mo_ham_rad + + USE mo_ham_rad_data, ONLY: Nwv_sw, Nwv_sw_opt, Nwv_lw, & + Nwv_tot, Nwv_sw_tot, & + cnr, cni, & + log_x0_min, log_x0_max, & + log_ni_min, & + x0_min, x0_max, & + nnrmax, nnimax, ndismax, & + nr_min, nr_max, ni_min, ni_max, & + inc_nr, inc_ni, & + lambda, lambda_sw_opt, & + ham_rad_data_initialize + USE mo_ham, ONLY: naerocomp, & + aerocomp, & + aerowater, & + nraddiag, nrad, & + sizeclass, & + nclass + USE mo_ham, ONLY: subm_aerospec + USE mo_kind, ONLY: dp + USE mo_species, ONLY: speclist, naerospec, nmaxspec + !>>dod soa + USE mo_ham_species, ONLY: id_oc, id_wat !!mgs!! , naerospec=>ham_naerospec, aerospec=>ham_aerospec + !<>dod omp bugfix + SUBROUTINE ham_rad_refrac_volume(kproma, kbdim, klev, krow, ktrac, kmod, kwv, & + pxtm1, pnr, pni ) + !<>dod openmp bugfix + REAL(dp) :: zvsum(kbdim,klev), & + znrsum(kbdim,klev), & + znisum(kbdim,klev) + !<>dod openmp bugfix removed allocation of arrays + + + !---sum over aerosol compounds: + + zvsum(1:kproma,:) =0._dp + znrsum(1:kproma,:)=0._dp + znisum(1:kproma,:)=0._dp + + !>>dod soa + DO jn = 1,naerocomp + IF (aerocomp(jn)%iclass == kmod .AND. nrad(kmod) > 0) THEN + jt = aerocomp(jn)%idt + zdensity=aerocomp(jn)%species%density + ikey = aerocomp(jn)%species%iaerorad + + DO jk=1,klev + DO jl=1,kproma + IF(pxtm1(jl,jk,jt)>zeps) THEN + + zv=pxtm1(jl,jk,jt) / zdensity + + znrsum(jl,jk)=znrsum(jl,jk)+cnr(kwv,ikey)*zv + znisum(jl,jk)=znisum(jl,jk)+cni(kwv,ikey)*zv + + zvsum(jl,jk) =zvsum(jl,jk)+zv + + END IF + END DO + END DO + + END IF + + END DO + + ! Add aerosol water + IF (sizeclass(kmod)%lsoluble .AND. nrad(kmod) > 0) THEN + jt = aerowater(kmod)%idt + zdensity = aerowater(kmod)%species%density + ikey = aerowater(kmod)%species%iaerorad + + DO jk=1, klev + DO jl=1, kproma + IF(pxtm1(jl,jk,jt)>zeps) THEN + + zv=pxtm1(jl,jk,jt)/zdensity + + znrsum(jl,jk)=znrsum(jl,jk)+cnr(kwv,ikey)*zv + znisum(jl,jk)=znisum(jl,jk)+cni(kwv,ikey)*zv + + zvsum(jl,jk) =zvsum(jl,jk)+zv + + END IF + END DO + END DO + + END IF + + + !---Weighted averaging: + DO jk=1,klev + DO jl=1,kproma + IF(zvsum(jl,jk)>zeps) THEN + + pnr(jl,jk)=znrsum(jl,jk)/zvsum(jl,jk) + pni(jl,jk)=znisum(jl,jk)/zvsum(jl,jk) + + ELSE + + pnr(jl,jk)=0._dp + pni(jl,jk)=0._dp + + END IF + END DO + END DO + + !>>dod openmp bugfix removed deallocation of arrays + !<>dod omp bugfix + SUBROUTINE ham_rad_refrac_maxgar(kproma, kbdim, klev, krow, ktrac, kmod, kwv, & + pxtm1, pnr, pni ) + !<>dod openmp bugfix removed allocatable property of arrays + LOGICAL :: lcore(kbdim,klev) + + REAL(dp) :: zvsum(kbdim,klev), zvcore(kbdim,klev), & + znrsum(kbdim,klev), znisum(kbdim,klev) + + COMPLEX :: ce ! component dielectric constant + + COMPLEX :: cn_eff(kbdim,klev), & ! mode effective refractive index + ce_eff(kbdim,klev), & ! mode effective dielectric constant + cn_0(kbdim,klev), & ! host medium effective refractive index + ce_0(kbdim,klev), & ! host medium effective dielectric constant + csum(kbdim,klev) ! local summation term + !<>dod openmp bugfix removed allocation of arrays + !<>dod soa + DO jn = 1,naerocomp + IF (aerocomp(jn)%iclass == kmod .AND. nrad(kmod) > 0) THEN + jt = aerocomp(jn)%idt + zdensity=aerocomp(jn)%species%density + ikey = aerocomp(jn)%species%iaerorad + + !---volume of insoluble core: + + IF (.NOT. aerocomp(jn)%species%lwatsol) THEN + zvcore(1:kproma,:) = zvcore(1:kproma,:)+pxtm1(1:kproma,:,jt)/zdensity + END IF + + !--- Total mode volume and summation of refractive indices: + + DO jk=1,klev + DO jl=1,kproma + IF(pxtm1(jl,jk,jt)>zeps) THEN + + zv=pxtm1(jl,jk,jt)/zdensity + + znrsum(jl,jk)=znrsum(jl,jk)+cnr(kwv,ikey)*zv + znisum(jl,jk)=znisum(jl,jk)+cni(kwv,ikey)*zv + + zvsum(jl,jk) =zvsum(jl,jk)+zv + + END IF + END DO + END DO + + END IF + END DO + + ! Add aerosol water + IF (sizeclass(kmod)%lsoluble .AND. nrad(kmod) > 0) THEN + jt = aerowater(kmod)%idt + zdensity = aerowater(kmod)%species%density + ikey = aerowater(kmod)%species%iaerorad + + DO jk=1, klev + DO jl=1, kproma + IF(pxtm1(jl,jk,jt)>zeps) THEN + + zv=pxtm1(jl,jk,jt)/zdensity + + znrsum(jl,jk)=znrsum(jl,jk)+cnr(kwv,ikey)*zv + znisum(jl,jk)=znisum(jl,jk)+cni(kwv,ikey)*zv + + zvsum(jl,jk) =zvsum(jl,jk)+zv + + END IF + END DO + END DO + + END IF + !<>dod openmp bugfix + DO jk=1,klev + DO jl=1,kproma + !<zeps) THEN + cn_eff(jl,jk)=CMPLX( znrsum(jl,jk)/zvsum(jl,jk) , znisum(jl,jk)/zvsum(jl,jk), kind=dp ) + ELSE + cn_eff(jl,jk)=CMPLX( 0.0_dp , 0.0_dp, kind=dp ) + END IF + + END DO + END DO + + !--- 2) Apply Maxwell-Garnett for regions with insoluble core: + + !--- Find regions with insoluble core: + + lcore(1:kproma,:)=.FALSE. + + !>>dod openmp bugfix + DO jk=1,klev + DO jl=1,kproma + !<zeps) THEN + IF (zvcore(jl,jk)/zvsum(jl,jk)>zeps .AND. zvcore(jl,jk)/zvsum(jl,jk)<(1.0_dp-zeps)) THEN + lcore(jl,jk)=.TRUE. + END IF + END IF + END DO + END DO + + !--- 2.1) Calculate volume weighted refractive index of host medium: + + zvsum(1:kproma,:) = 0.0_dp + znrsum(1:kproma,:) = 0.0_dp + znisum(1:kproma,:) = 0.0_dp + + DO jn = 1,naerocomp + IF (aerocomp(jn)%iclass == kmod .AND. nrad(kmod) > 0) THEN + IF (aerocomp(jn)%species%lwatsol) THEN + jt = aerocomp(jn)%idt + zdensity=aerocomp(jn)%species%density + ikey = aerocomp(jn)%species%iaerorad + + DO jk=1,klev + DO jl=1,kproma + IF(pxtm1(jl,jk,jt)>zeps .AND. lcore(jl,jk)) THEN + + zv=pxtm1(jl,jk,jt)/zdensity + + znrsum(jl,jk)=znrsum(jl,jk)+cnr(kwv,ikey)*zv + znisum(jl,jk)=znisum(jl,jk)+cni(kwv,ikey)*zv + + zvsum(jl,jk) =zvsum(jl,jk)+zv + + END IF + END DO + END DO + + END IF + END IF + + END DO + + ! Add aerosol water + IF (sizeclass(kmod)%lsoluble .AND. nrad(kmod) > 0) THEN + jt = aerowater(kmod)%idt + zdensity = aerowater(kmod)%species%density + ikey = aerowater(kmod)%species%iaerorad + + DO jk=1, klev + DO jl=1, kproma + IF(pxtm1(jl,jk,jt)>zeps) THEN + + zv=pxtm1(jl,jk,jt)/zdensity + + znrsum(jl,jk)=znrsum(jl,jk)+cnr(kwv,ikey)*zv + znisum(jl,jk)=znisum(jl,jk)+cni(kwv,ikey)*zv + + zvsum(jl,jk) =zvsum(jl,jk)+zv + + END IF + END DO + END DO + + END IF + !<zeps .AND. lcore(jl,jk)) THEN + cn_0(jl,jk)=CMPLX( znrsum(jl,jk)/zvsum(jl,jk) , znisum(jl,jk)/zvsum(jl,jk), kind=dp ) + ELSE + cn_0(jl,jk)=CMPLX( 0.0_dp , 0.0_dp, kind=dp ) + END IF + + !--- Dielectric constant: + + ce_0(jl,jk)=cn_0(jl,jk)**2 + + END DO + END DO + + !--- 2.2) Apply Maxwell-Garnett mixing rule for insoluble core: + + !--- Calculate total mode volume + + zvsum(1:kproma,:) = 0.0_dp + + DO jn = 1,naerocomp + IF (aerocomp(jn)%iclass == kmod .AND. nrad(kmod) > 0) THEN + IF (aerocomp(jn)%species%lwatsol) THEN + jt = aerocomp(jn)%idt + zdensity=aerocomp(jn)%species%density + ikey = aerocomp(jn)%species%iaerorad + + DO jk=1,klev + DO jl=1,kproma + IF(pxtm1(jl,jk,jt)>zeps .AND. lcore(jl,jk)) THEN + zvsum(jl,jk) =zvsum(jl,jk)+pxtm1(jl,jk,jt)/zdensity + END IF + END DO + END DO + + END IF + END IF + END DO + + ! Add aerosol water + IF (sizeclass(kmod)%lsoluble .AND. nrad(kmod) > 0) THEN + jt = aerowater(kmod)%idt + zdensity = aerowater(kmod)%species%density + ikey = aerowater(kmod)%species%iaerorad + + DO jk=1, klev + DO jl=1, kproma + IF(pxtm1(jl,jk,jt)>zeps .AND. lcore(jl,jk)) THEN + zvsum(jl,jk) =zvsum(jl,jk)+pxtm1(jl,jk,jt)/zdensity + END IF + END DO + END DO + END IF + + !--- Apply M&G for the insoluble core components embedded in soluble host medium: + + csum(1:kproma,:)=CMPLX(0.0_dp,0.0_dp, kind=dp) + + !>>dod soa + DO jn = 1,naerocomp + IF (aerocomp(jn)%iclass == kmod .AND. nrad(kmod) > 0) THEN + + IF (.NOT. aerocomp(jn)%species%lwatsol) THEN + jt = aerocomp(jn)%idt + + zdensity=aerocomp(jn)%species%density + ikey = aerocomp(jn)%species%iaerorad + + + ce=CMPLX(cnr(kwv,ikey),cni(kwv,ikey), kind=dp)**2 + + DO jk=1,klev + DO jl=1,kproma + IF(pxtm1(jl,jk,jt)>zeps .AND. lcore(jl,jk)) THEN + + zvfrac=(pxtm1(jl,jk,jt)/zdensity) / zvsum(jl,jk) + + csum(jl,jk)=csum(jl,jk)+zvfrac*(ce-ce_0(jl,jk))/(ce+2.0_dp*ce_0(jl,jk)) + + END IF + END DO + END DO + + END IF + END IF + + END DO + !<>dod openmp bugfix + DO jk=1,klev + DO jl=1,kproma + !<>dod omp bugfix + SUBROUTINE ham_rad_refrac_brugge(kproma, kbdim, klev, krow, ktrac, kmod, kwv, & + pxtm1, pnr, pni ) + !<>dod soa + INTEGER :: ikey + !<>dod openmp bugfix removed allocatable property of arrays + + REAL(dp) :: zvsum(kbdim,klev) + + COMPLEX :: ce, cn_eff_old ! component dielectric constant + + COMPLEX :: cn_eff(kbdim,klev), & ! mode effective refractive index + ce_eff(kbdim,klev), & ! mode effective dielectric constant + cfe(kbdim,klev), & ! f(e) + cfep(kbdim,klev) ! f'(e) + + INTEGER, PARAMETER :: niter=7 ! maximum number of iterations + ! (1 year test run showed convergence + ! after 6 iterations everywhere ) + + + !---executable procedure + + zeps=EPSILON(1.0_dp) + + !>>dod deleted allocation of arrays + !<>dod soa + DO jn = 1,naerocomp + IF (aerocomp(jn)%iclass == kmod .AND. nrad(kmod) > 0) THEN + jt = aerocomp(jn)%idt + zdensity=aerocomp(jn)%species%density + ikey = aerocomp(jn)%species%iaerorad + + zvsum(1:kproma,:) =zvsum(1:kproma,:)+pxtm1(1:kproma,:,jt)/zdensity + + END IF + + END DO + + ! Add aerosol water + IF (sizeclass(kmod)%lsoluble .AND. nrad(kmod) > 0) THEN + jt = aerowater(kmod)%idt + zdensity = aerowater(kmod)%species%density + ikey = aerowater(kmod)%species%iaerorad + + zvsum(1:kproma,:) =zvsum(1:kproma,:)+pxtm1(1:kproma,:,jt)/zdensity + + END IF + + + !--- 2) Calculate f(e0) and f'(e0) + ! and start Newtonian iteration: + + !--- First guess for effective dielectric constant: + + + !--- Newtonian iteration: + + !--- Choose POM values as initial guess (approximate zero) for Newton-Raphson method: + ! (Radiative properties of POM lie within range of other compounds) + + ce_eff(1:kproma,:)=CMPLX(cnr(kwv,speclist(id_oc)%iaerorad),cni(kwv,speclist(id_oc)%iaerorad), kind=dp)**2 + + DO jiter=1, niter + + cfe(1:kproma,:) = CMPLX(0.0_dp,0.0_dp, kind=dp) + cfep(1:kproma,:) = CMPLX(0.0_dp,0.0_dp, kind=dp) + + !>>dod soa + DO jn = 1,naerocomp + IF (aerocomp(jn)%iclass == kmod .AND. nrad(kmod) > 0) THEN + jt = aerocomp(jn)%idt + zdensity=aerocomp(jn)%species%density + ikey = aerocomp(jn)%species%iaerorad + + !--- Component dielectric constant: + + ce=CMPLX(cnr(kwv,ikey),cni(kwv,ikey), kind=dp)**2 + + DO jk=1,klev + DO jl=1,kproma + IF(pxtm1(jl,jk,jt)>zeps) THEN + + !--- Component volume fraction: + + zvfrac = (pxtm1(jl,jk,jt)/zdensity) / zvsum(jl,jk) + + !--- Calculate f(e): + + cfe(jl,jk)=cfe(jl,jk) + & + zvfrac*(ce-ce_eff(jl,jk))/(ce+2.0_dp*ce_eff(jl,jk)) + + !--- Calculate f'(e): + + cfep(jl,jk)=cfep(jl,jk) + & + zvfrac*( (-3.0_dp*ce) / ( (ce+2.0_dp*ce_eff(jl,jk))**2 ) ) + + END IF + END DO + END DO + + !--- Solve for new approximation of effective dielectric constant: + + DO jk=1,klev + DO jl=1,kproma + IF(zvsum(jl,jk)>zeps) THEN + + ! IF (CABS(cfep(jl,jk))sigma + USE mo_math_constants, ONLY: pi + USE mo_physical_constants, ONLY: grav + USE mo_kind, ONLY: dp + USE mo_exception, ONLY: finish + USE mo_tracdef, ONLY: ntrac +#ifdef HAMMOZ + USE mo_ham_streams, ONLY: rwet +#endif +#ifdef SALSA + USE mo_ham_salsa, ONLY: rwet_salsa + USE mo_ham_salsactl, ONLY: fn2a, fn2b, nbin3 +#endif + USE mo_control, ONLY: ltimer + !>>dod split of mo_timer (#51) +#ifdef HAMMOZ + USE mo_hammoz_timer, ONLY: timer_start, timer_stop, & + timer_ham_rad_fitplus, & + timer_ham_rad_refrac +#endif + USE mo_ham_rad_data, ONLY: nraddiagwv +#ifdef HAMMOZ + USE mo_ham_streams, ONLY: tau_mode +#endif + + + IMPLICIT NONE + + !--- Arguments: + + INTEGER,INTENT(IN) :: kproma , kbdim, klev, krow, kpband, kb_sw + + REAL(dp), INTENT(in) :: ppd_hl(kbdim,klev) ! pressure diff between half levels [Pa] + + REAL(dp),INTENT(IN) :: pxtm1(kbdim,klev,ntrac) ! tracer mass/number mixing ratio (t-dt) [kg/kg]/[#/kg] + + REAL(dp), INTENT(inout) :: aer_tau_lw_vr(kbdim,klev,kpband),& !< LW optical thickness of aerosols + aer_tau_sw_vr(kbdim,klev,kb_sw), & !< aerosol optical thickness + aer_cg_sw_vr(kbdim,klev,kb_sw), & !< aerosol asymmetry factor + aer_piz_sw_vr(kbdim,klev,kb_sw) !< aerosol single scattering albedo + + !--- Local Variables: +#ifdef HAMMOZ + +#else + REAL(dp), INTENT(in) :: rwet_m7(kbdim,klev,nclass) +#endif + INTEGER :: jclass, jl, jk, jwv, itable, itrac, ikl + + REAL(dp) :: zeps + + REAL(dp) :: zxx(kbdim,klev), & ! size parameter + zdpg(kbdim,klev) ! auxiliary parameter dp/grav + + REAL(dp) :: zaer_tau_sw_vr(kbdim,klev,Nwv_sw_tot,nclass),& ! SW optical depth for each band and mode + zaer_tau_lw_vr(kbdim,klev,Nwv_lw,nclass) ! LW optical depth for each band and mode + +!>>gf: needed to avoid architecture-dependent problems (Cray XT5) + REAL(dp) :: znr2d(kbdim,klev), & ! 2D subset of 4D array nr + zni2d(kbdim,klev), & ! 2D subset of 4D array ni + zsigma2d(kbdim,klev), & ! 2D subste of 4D array sigma + zomega2d(kbdim,klev), & ! 2D subste of 4D array omega + zasym2d(kbdim,klev) ! 2D subste of 4D array asym +!< rwet(jclass)%ptr +#endif + + DO jwv=1,Nwv_sw+Nwv_sw_opt + + !--- 1.1) Calculate volume averaged refractive index nr and ni: +#ifdef HAMMOZ + IF (ltimer) CALL timer_start(timer_ham_rad_refrac) +#endif + !gf: the former usage of nr(1:kproma,:,jwv,jclass) and ni(1:kproma,:,jwv,jclass) + ! directly in the call to ham_rad_refrac is causing architecture-dependent problems (Cray XT5) + ! Therefore intermediate variables znr2d and zni2d are introduced + + znr2d(1:kproma,:) = nr(1:kproma,:,jwv,jclass) + zni2d(1:kproma,:) = ni(1:kproma,:,jwv,jclass) + + CALL ham_rad_refrac(kproma, kbdim, klev, krow, & + ntrac, jclass, jwv, & + pxtm1, znr2d, zni2d ) + +#ifdef HAMMOZ + IF (ltimer) CALL timer_stop(timer_ham_rad_refrac) +#endif + !--- 1.1) Calculate size parameter: +#ifdef HAMMOZ + zxx(1:kproma,:) = 2._dp*pi*rwet_p(1:kproma,:,krow)/lambda(jwv) +#else + zxx(1:kproma,:) = 2._dp*pi*rwet_m7(1:kproma,:,jclass)/lambda(jwv) +#endif + + !--- 1.2) Table-lookup for optical properties: +#ifdef HAMMOZ + IF (ltimer) CALL timer_start(timer_ham_rad_fitplus) +#endif + !gf: same as in the call to ham_rad_refrac, for the call to ham_rad_fitplus + + zsigma2d(1:kproma,:) = sigma(1:kproma,:,jwv,jclass) + zomega2d(1:kproma,:) = omega(1:kproma,:,jwv,jclass) + zasym2d(1:kproma,:) = asym(1:kproma,:,jwv,jclass) + + SELECT CASE(nham_subm) + + CASE(HAM_M7) + + IF (ABS(modesigma(jclass)-sigma_fine) fn2a .AND. jclass < fn2b-(nbin3-1))) THEN + itable=1 + ELSE + itable=2 + END IF +#endif + END SELECT + + IF (itable == 1) THEN + + CALL ham_rad_fitplus(kproma, kbdim, klev, & + zxx, znr2d, zni2d, & + itable, lut1_sigma, zsigma2d, & + lut1_omega, zomega2d, & + lut1_g, zasym2d ) + + ELSE + + CALL ham_rad_fitplus(kproma, kbdim, klev, & + zxx, znr2d, zni2d, & + itable, lut2_sigma, zsigma2d, & + lut2_omega, zomega2d, & + lut2_g, zasym2d ) + + END IF +#ifdef HAMMOZ + IF (ltimer) CALL timer_stop(timer_ham_rad_fitplus) +#endif + !>>gf: update the original 4d arrays + sigma(1:kproma,:,jwv,jclass) = zsigma2d(1:kproma,:)*lambda(jwv)*lambda(jwv) + omega(1:kproma,:,jwv,jclass) = zomega2d(1:kproma,:) + asym(1:kproma,:,jwv,jclass) = zasym2d(1:kproma,:) + nr(1:kproma,:,jwv,jclass) = znr2d(1:kproma,:) + ni(1:kproma,:,jwv,jclass) = zni2d(1:kproma,:) + !<0) THEN + DO jwv=1, Nwv_sw+Nwv_sw_opt + zaer_tau_sw_vr(1:kproma,:,jwv,jclass)=znum(1:kproma,:,jclass)*sigma(1:kproma,:,jwv,jclass) + END DO + END IF + END DO + + !--- Diagnose AOD for requested each mode (nrad) and wavelength (nraddiagwv): +#ifdef HAMMOZ + DO jclass=1, nclass + IF(nrad(jclass)>0) THEN + DO jwv=1, Nwv_sw+Nwv_sw_opt + IF (nraddiagwv(jwv)>0) THEN + tau_mode(jclass,jwv)%ptr(1:kproma,:,krow)=zaer_tau_sw_vr(1:kproma,:,jwv,jclass) + END IF + END DO + END IF + END DO +#endif + !--- Calculation of weighted properties and vertical reordering to RRTM structure: + + DO jwv=1, Nwv_sw !ham_ps +Nwv_sw_opt + + DO jclass=1, nclass + DO jk=1, klev +#ifdef HAMMOZ + ikl=klev+1-jk +#else + !No vertical reordering here + ikl=jk +#endif + DO jl=1, kproma + aer_tau_sw_vr(jl,jk,jwv)=aer_tau_sw_vr(jl,jk,jwv) + & + zaer_tau_sw_vr(jl,ikl,jwv,jclass) + aer_piz_sw_vr(jl,jk,jwv)=aer_piz_sw_vr(jl,jk,jwv) + & + zaer_tau_sw_vr(jl,ikl,jwv,jclass)*omega(jl,ikl,jwv,jclass) + aer_cg_sw_vr(jl,jk,jwv) =aer_cg_sw_vr(jl,jk,jwv) + & + zaer_tau_sw_vr(jl,ikl,jwv,jclass)*omega(jl,ikl,jwv,jclass)*asym(jl,ikl,jwv,jclass) + END DO + END DO + END DO + + DO jk=1, klev + DO jl=1, kproma + IF(aer_piz_sw_vr(jl,jk,jwv)>EPSILON(1.0_dp)) THEN + aer_cg_sw_vr(jl,jk,jwv) =aer_cg_sw_vr(jl,jk,jwv)/aer_piz_sw_vr(jl,jk,jwv) + aer_piz_sw_vr(jl,jk,jwv)=aer_piz_sw_vr(jl,jk,jwv)/aer_tau_sw_vr(jl,jk,jwv) + END IF + END DO + END DO + + END DO + + END IF + + !--- 2) Calculate optical properties for GCM LW bands: + + IF (ANY(nrad(:)==2) .OR. ANY(nrad(:)==3)) THEN + + DO jclass=1, nclass + IF (nrad(jclass)==2 .OR. nrad(jclass)==3) THEN + +#ifdef HAMMOZ + rwet_p => rwet(jclass)%ptr +#endif + + DO jwv=1, Nwv_lw + + jlwv = Nwv_sw+Nwv_sw_opt+jwv ! Total SW wavelengths + LW + + !--- 1.1) Calculate volume averaged refractive index nr and ni: +#ifdef HAMMOZ + IF (ltimer) CALL timer_start(timer_ham_rad_refrac) +#endif + !gf: the former usage of nr(1:kproma,:,jwv,jclass) and ni(1:kproma,:,jwv,jclass) + ! directly in the call to ham_rad_refrac is causing architecture-dependent problems (Cray XT5) + ! Therefore intermediate variables znr2d and zni2d are introduced + + znr2d(1:kproma,:) = nr(1:kproma,:,jlwv,jclass) + zni2d(1:kproma,:) = ni(1:kproma,:,jlwv,jclass) + + CALL ham_rad_refrac(kproma, kbdim, klev, krow, & + ntrac, jclass, jlwv, & + pxtm1, znr2d, zni2d ) +#ifdef HAMMOZ + IF (ltimer) CALL timer_stop(timer_ham_rad_refrac) +#endif + !--- 1.1) Calculate size parameter: +#ifdef HAMMOZ + zxx(1:kproma,:)=2._dp*pi*rwet_p(1:kproma,:,krow)/lambda(jlwv) +#else + zxx(1:kproma,:) = 2._dp*pi*rwet_m7(1:kproma,:,jclass)/lambda(jwv) +#endif + + !--- 1.2) Table-lookup for optical properties: +#ifdef HAMMOZ + IF (ltimer) CALL timer_start(timer_ham_rad_fitplus) +#endif + !gf: same as in the call to ham_rad_refrac, for the call to ham_rad_fitplus + + zsigma2d(1:kproma,:) = sigma(1:kproma,:,jlwv,jclass) + + SELECT CASE(nham_subm) + + CASE(HAM_M7) + + + IF (ABS(modesigma(jclass)-sigma_fine) fn2a .AND. jclass < fn2b-(nbin3-1))) THEN + itable=3 + ELSE + itable=4 + END IF +#endif + END SELECT + + IF (itable == 3) THEN + + CALL ham_rad_fitplus(kproma, kbdim, klev, & + zxx, znr2d, zni2d, & + itable, lut3_sigma, zsigma2d ) + + ELSE + + CALL ham_rad_fitplus(kproma, kbdim, klev, & + zxx, znr2d, zni2d, & + itable, lut4_sigma, zsigma2d ) + + END IF +#ifdef HAMMOZ + IF (ltimer) CALL timer_stop(timer_ham_rad_fitplus) +#endif + !>>gf: update the original 4d arrays + sigma(1:kproma,:,jlwv,jclass) = zsigma2d(1:kproma,:) + nr(1:kproma,:,jlwv,jclass) = znr2d(1:kproma,:) + ni(1:kproma,:,jlwv,jclass) = zni2d(1:kproma,:) + !<0) THEN + DO jwv=1, Nwv_lw + jlwv = Nwv_sw+Nwv_sw_opt+jwv ! Total SW wavelengths + LW + + DO jk=1, klev +#ifdef HAMMOZ + ikl=klev+1-jk +#else + !No vertical reordering in openifs (here) + ikl=jk +#endif + DO jl=1, kproma + zaer_tau_lw_vr(jl,jk,jwv,jclass)=znum(jl,jk,jclass)*sigma(jl,jk,jlwv,jclass) + aer_tau_lw_vr(jl,ikl,jwv)=aer_tau_lw_vr(jl,ikl,jwv) + & + zaer_tau_lw_vr(jl,jk,jwv,jclass) + END DO + END DO + + !--- Diagnose AOD for requested each mode (nrad) and wavelength (nraddiagwv): +#ifdef HAMMOZ + IF (nraddiagwv(jwv)>0) THEN + tau_mode(jclass,jwv)%ptr(1:kproma,:,krow)=zaer_tau_lw_vr(1:kproma,:,jwv,jclass) + END IF +#endif + END DO + END IF + END DO + + END IF + + !--- 3) Set echam fields to zero for diagnostic aerosol radiative properties only: + + IF (naerorad==2) THEN + aer_tau_lw_vr(1:kproma,:,:) = 0.0_dp + aer_tau_sw_vr(1:kproma,:,:) = 0.0_dp + aer_piz_sw_vr(1:kproma,:,:) = 0.0_dp + aer_cg_sw_vr(1:kproma,:,:) = 0.0_dp + END IF + + END SUBROUTINE ham_rad + + !---------------------------------------------------------------------------------------------------------------- + !>>dod removed wavelength from subroutine interface + SUBROUTINE ham_rad_fitplus(kproma, kbdim, klev, & + pxx, pnr, pni, & + ktable, plut1, pfit1, & + plut2, pfit2, & + plut3, pfit3 ) + !<>dod changed arrays to 2-dimensional (removed wavelength dimension since the + ! calling subroutine now contains the loop over the wavelengths) + REAL(dp), INTENT(out) :: pfit1(kbdim,klev) + REAL(dp), INTENT(out), OPTIONAL :: pfit2(kbdim,klev) + REAL(dp), INTENT(out), OPTIONAL :: pfit3(kbdim,klev) + + REAL(dp), INTENT(in) :: pnr(kbdim,klev), pni(kbdim,klev), pxx(kbdim,klev) + + REAL(dp), INTENT(in) :: plut1(0:Nnrmax(ktable), 0:Nnimax(ktable), 0:Ndismax(ktable)) + REAL(dp), INTENT(in), OPTIONAL :: plut2(0:Nnrmax(ktable), 0:Nnimax(ktable), 0:Ndismax(ktable)) + REAL(dp), INTENT(in), OPTIONAL :: plut3(0:Nnrmax(ktable), 0:Nnimax(ktable), 0:Ndismax(ktable)) + + !--- Local variables: + + LOGICAL, PARAMETER :: laerocom_diag=.FALSE. !-- Diagnostic for values out of range + LOGICAL, PARAMETER :: loint =.FALSE. !-- Linear interpolation in look-up table + + INTEGER :: jl,jk + + REAL(dp) :: zeps + + INTEGER :: Ndis, Nnr, Nni + !>>dod deleted security check + REAL(dp) :: xx1, xx2, nr1, nr2, ni1, ni2 + REAL(dp) :: fitndisnr, fitndisp1nr, fitndisnrp1, fitndisp1nrp1, fitndis, fitndisp1 + + !--- 0) + !>>dod moved calculation of inc_nr and inc_ni to mo_ham_rad_data + !<>dod deleted: clearly untested in parallel environment, so deleted rather than modified + + !--- 1) Quick and dirty linear interpolation: + ! + IF(loint) THEN + !>>dod WARNING : NEEDS UPDATING! DOES NOT WORK! + !>>dod removed loop over wavelengths + DO jk=1, klev + DO jl=1, kproma + IF ((pxx(jl,jk)>=x0_min(ktable)) .AND. (pxx(jl,jk)<=x0_max(ktable)) .AND. & + (pnr(jl,jk)>=nr_min(ktable)) .AND. (pnr(jl,jk)<=nr_max(ktable)) .AND. & + (pni(jl,jk)>=ni_min(ktable)) .AND. (pni(jl,jk)<=ni_max(ktable)) ) THEN + + Ndis=INT( (LOG(pxx(jl,jk))-LOG(x0_min(ktable))) / & + (LOG(x0_max(ktable)) -LOG(x0_min(ktable)))*REAL(Ndismax(ktable),dp) ) + Ndis=MIN(Ndismax(ktable)-1,MAX(0,Ndis)) + + xx1=EXP(LOG(x0_min(ktable))+(LOG(x0_max(ktable))-LOG(x0_min(ktable)))*REAL(Ndis,dp)/REAL(Ndismax(ktable),dp)) + xx2=EXP(LOG(x0_min(ktable))+(LOG(x0_max(ktable))-LOG(x0_min(ktable)))*REAL(Ndis+1,dp)/REAL(Ndismax(ktable),dp)) + + Nnr=INT((pnr(jl,jk)-nr_min(ktable))/inc_nr(ktable)) + Nnr=MIN(Nnrmax(ktable)-1,MAX(0,Nnr)) + + nr1=nr_min(ktable)+REAL(Nnr,dp)*inc_nr(ktable) + nr2=nr_min(ktable)+REAL(Nnr+1,dp)*inc_nr(ktable) + + Nni=INT((LOG(pni(jl,jk))-LOG(ni_min(ktable)))/inc_ni(ktable)) + Nni=MIN(Nnimax(ktable)-1,MAX(0,Nni)) + + ni1=EXP(LOG(ni_min(ktable))+REAL(Nni,dp)*inc_ni(ktable)) + ni2=EXP(LOG(ni_min(ktable))+REAL(Nni+1,dp)*inc_ni(ktable)) + + fitndisnr =plut1(Nnr,Nni,Ndis)+(pni(jl,jk)-ni1)/(ni2-ni1)* & + (plut1(Nnr,Nni+1,Ndis)-plut1(Nnr,Nni,Ndis)) + fitndisnrp1 =plut1(Nnr+1,Nni,Ndis)+(pni(jl,jk)-ni1)/(ni2-ni1)* & + (plut1(Nnr+1,Nni+1,Ndis)-plut1(Nnr+1,Nni,Ndis)) + fitndisp1nr =plut1(Nnr,Nni,Ndis+1)+(pni(jl,jk)-ni1)/(ni2-ni1)* & + (plut1(Nnr,Nni+1,Ndis+1)-plut1(Nnr,Nni,Ndis+1)) + fitndisp1nrp1 =plut1(Nnr+1,Nni,Ndis+1)+(pni(jl,jk)-ni1)/(ni2-ni1)* & + (plut1(Nnr+1,Nni+1,Ndis+1)-plut1(Nnr+1,Nni,Ndis+1)) + fitndis =fitndisnr+(pnr(jl,jk)-nr1)/(nr2-nr1)*(fitndisnrp1-fitndisnr) + fitndisp1 =fitndisp1nr+(pnr(jl,jk)-nr1)/(nr2-nr1)*(fitndisp1nrp1-fitndisp1nr) + + pfit1(jl,jk)=fitndis+(pxx(jl,jk)-xx1)/(xx2-xx1)*(fitndisp1-fitndis) + + ELSE + + pfit1(jl,jk)=0._dp + + END IF + END DO + END DO + !<>dod removed loop over wavelengths + DO jk=1, klev + DO jl=1, kproma + IF ((pxx(jl,jk)>=x0_min(ktable)) .AND. (pxx(jl,jk)<=x0_max(ktable)) .AND. & + (pnr(jl,jk)>=nr_min(ktable)) .AND. (pnr(jl,jk)<=nr_max(ktable)) .AND. & + (pni(jl,jk)>=ni_min(ktable)) .AND. (pni(jl,jk)<=ni_max(ktable)) ) THEN + + Ndis=NINT( (LOG(pxx(jl,jk))-log_x0_min(ktable)) / & + (log_x0_max(ktable) - log_x0_min(ktable))*REAL(Ndismax(ktable),dp) ) + Ndis=MIN(Ndismax(ktable)-1,MAX(0,Ndis)) + + Nnr=NINT((pnr(jl,jk)-nr_min(ktable))/inc_nr(ktable)) + Nnr=MIN(Nnrmax(ktable)-1,MAX(0,Nnr)) + + Nni=NINT((LOG(pni(jl,jk))-log_ni_min(ktable))/inc_ni(ktable)) + Nni=MIN(Nnimax(ktable)-1,MAX(0,Nni)) + + pfit1(jl,jk)=plut1(Nnr,Nni,Ndis) + + IF (PRESENT(plut2)) pfit2(jl,jk) = plut2(Nnr, Nni,Ndis) + IF (PRESENT(plut3)) pfit3(jl,jk) = plut3(Nnr, Nni,Ndis) + + ELSE + + pfit1(jl,jk)=0._dp + IF (PRESENT(plut2)) pfit2(jl,jk) = 0._dp + IF (PRESENT(plut3)) pfit3(jl,jk) = 0._dp + + END IF + END DO + END DO + !<wavenum1, wavenum2_sw=>wavenum2 + USE mo_rrtm_params, ONLY: nbndlw + USE mo_lrtm_setup, ONLY: wavenum1, wavenum2 + USE mo_ham, ONLY: nrad, nham_subm, HAM_SALSA, HAM_M7 + USE mo_read_netcdf77, ONLY: read_var_nf77_3d + USE mo_util_string, ONLY: separator +#else !OIFS + USE YOERAD ,ONLY : nbndlw=> STRATO_CMIP6_NTB !this is really stupid solution + USE YOMMP0 ,ONLY : MYPROC + USE MPL_MODULE ,ONLY : MPL_BROADCAST + USE TM5M7_OPTICS_DATA, ONLY : NASWBAND,ASWBAND,wavenum1=>ALWWN1, wavenum2=>ALWWN2 +#endif + USE mo_read_netcdf77, ONLY: read_var_nf77_3d + USE mo_exception, ONLY: finish, message, message_text, em_param, em_error, & + em_info + USE mo_species, ONLY: aero_idx + + + + + + IMPLICIT NONE + + INTEGER, INTENT(in) :: nclass ! number of aerosol bins/modes + + INTEGER, PARAMETER :: jpsw = 14 !SF new rad scheme to check + + INTEGER :: jwv, iwv, jt, ierr + + LOGICAL :: lex + + CHARACTER(len=256) :: cfile + + INTEGER, PARAMETER :: RPRC = 1 !for OIFS + INTEGER, PARAMETER :: ITAG = 98784 !for OIFS +#ifdef HAMMOZ + CALL message('','') + CALL message('',separator) + CALL message('ham_rad_initialize','Parameter settings for the aerosol radiation interaction', & + level=em_info) + CALL message('','',level=em_param) +#endif + + nhamaer = nclass + + ! construct species indices from speclist into aerosol species list + aero_ridx(:) = 0 + DO jt = 1, naerospec + aero_ridx(aero_idx(jt)) = jt + END DO + + CALL ham_rad_data_initialize + + !--- 1) Set total number of wavelengths (GCM + optional): + + !--- 2) Consistency checks: + + IF ( Nwv_sw /= jpsw .OR. Nwv_lw /= nbndlw) THEN + + CALL finish('ham_rad_initialize','inconsistent number of wavelengths') + + END IF + + IF (ANY(nrad(:)==1)) THEN + IF ( SIZE(cnr,1) 0 ) THEN + + tau_2d_p => tau_2d(jwv)%ptr + tau_2d_p(1:kproma,krow) = 0._dp + + DO jclass=1, nclass + IF( nrad(jclass) > 0 )THEN + + tau_p => tau_mode(jclass,jwv)%ptr + + !--- Optical thickness per mode at optional wavelengths: + + tau_p(1:kproma,:,krow) = znum(1:kproma,:,jclass)*sigma(1:kproma,:,jwv,jclass) + + !--- 2) Vertical integral summed over all modes: + + + DO jk=1, klev + DO jl=1, kproma + tau_2d_p(jl,krow)=tau_2d_p(jl,krow)+tau_p(jl,jk,krow) + END DO + END DO + + END IF + + END DO + + END IF ! nraddiagwv(jwv)>0 + + !--- 2) 2D extended diatnostics of mode radiative parameters: + + IF (nraddiagwv(jwv)>1) THEN + + IF (nraddiag>0) THEN + + !--- Integrate mode radiative properties to 2D and weight with aerosol optical depth: + + znr_2d(1:kproma)=0.0_dp + zni_2d(1:kproma)=0.0_dp + + DO jclass=1, nclass + IF( nrad(jclass) > 0 )THEN + + tau_p => tau_mode(jclass,jwv)%ptr + + zomega(1:kproma)=0.0_dp + zsigma(1:kproma)=0.0_dp + zasym(1:kproma) =0.0_dp + znr(1:kproma) =0.0_dp + zni(1:kproma) =0.0_dp + ztau(1:kproma) =0.0_dp + + DO jk=1, klev + DO jl=1, kproma + zomega(jl)=zomega(jl)+omega(jl,jk,jwv,jclass)*tau_p(jl,jk,krow) + zsigma(jl)=zsigma(jl)+sigma(jl,jk,jwv,jclass)*tau_p(jl,jk,krow) + zasym(jl) =zasym(jl) +asym(jl,jk,jwv,jclass) *tau_p(jl,jk,krow) + znr(jl) =znr(jl) +nr(jl,jk,jwv,jclass) *tau_p(jl,jk,krow) + zni(jl) =zni(jl) +ni(jl,jk,jwv,jclass) *tau_p(jl,jk,krow) + znr_2d(jl)=znr_2d(jl)+nr(jl,jk,jwv,jclass) *tau_p(jl,jk,krow) + zni_2d(jl)=zni_2d(jl)+ni(jl,jk,jwv,jclass) *tau_p(jl,jk,krow) + ztau(jl) =ztau(jl) +tau_p(jl,jk,krow) + END DO + END DO + + !>>SF #458 (replacing WHERE statements) + ll1(1:kproma) = (ztau(1:kproma) > zeps) + ztmp1(1:kproma) = MERGE(ztau(1:kproma), 1._dp, ll1(1:kproma)) !SF 1._dp is a dummy val. + + ztmp1(1:kproma) = 1._dp / ztmp1(1:kproma) + + omega_2d_mode(jclass,jwv)%ptr(1:kproma,krow) = & + MERGE(zomega(1:kproma)*ztmp1(1:kproma), 0._dp, ll1(1:kproma)) + + sigma_2d_mode(jclass,jwv)%ptr(1:kproma,krow) = & + MERGE(zsigma(1:kproma)*ztmp1(1:kproma), 0._dp, ll1(1:kproma)) + + asym_2d_mode(jclass,jwv)%ptr(1:kproma,krow) = & + MERGE(zasym(1:kproma)*ztmp1(1:kproma), 0._dp, ll1(1:kproma)) + + nr_2d_mode(jclass,jwv)%ptr(1:kproma,krow) = & + MERGE(znr(1:kproma)*ztmp1(1:kproma), 0._dp, ll1(1:kproma)) + + ni_2d_mode(jclass,jwv)%ptr(1:kproma,krow) = & + MERGE(zni(1:kproma)*ztmp1(1:kproma), 0._dp, ll1(1:kproma)) + + !< 0 )THEN + omega_mode(jclass,jwv)%ptr(1:kproma,:,krow)=omega(1:kproma,:,jwv,jclass) + sigma_mode(jclass,jwv)%ptr(1:kproma,:,krow)=sigma(1:kproma,:,jwv,jclass) + asym_mode(jclass,jwv)%ptr(1:kproma,:,krow) =asym(1:kproma,:,jwv,jclass) + nr_mode(jclass,jwv)%ptr(1:kproma,:,krow) =nr(1:kproma,:,jwv,jclass) + ni_mode(jclass,jwv)%ptr(1:kproma,:,krow) =ni(1:kproma,:,jwv,jclass) + END IF + END DO + END IF + + !--- 4) Calculate absorption optical depth: + + abs_2d(jwv)%ptr(1:kproma,krow)=0.0_dp + + DO jclass=1, nclass + IF(nrad(jclass)>0)THEN + + abs_p => abs_mode(jclass,jwv)%ptr + tau_p => tau_mode(jclass,jwv)%ptr + + !--- For each mode: + + abs_p(1:kproma,:,krow) =(1.0_dp-omega(1:kproma,:,jwv,jclass))*tau_p(1:kproma,:,krow) + + !--- Total vertical integral: + + DO jk=1, klev + abs_2d(jwv)%ptr(1:kproma,krow)=abs_2d(jwv)%ptr(1:kproma,krow)+abs_p(1:kproma,jk,krow) + END DO + + END IF + END DO + + !--- 5) Split up according to compounds + ! (based on volume average for optical thickness, + ! additionally weighted with ni for absorption ): + + zvcomp(1:kproma,:,:,:) = 0._dp + zvsum(1:kproma,:,:) = 0._dp + znivsum(1:kproma,:,:) = 0._dp + + DO jclass=1,nclass + DO jspec=1,naerospec + + !--- Check if species jspec exists in mode jclass: + + !ham_ps: this has been included until consistent definition of aerosol water as species within HAM / M7: + ! iaerocomp of water is currently set to -1 in mo_ham_init + IF (speclist(aero_idx(jspec))%iaerocomp(jclass)>0) THEN + + jt=aerocomp( speclist(aero_idx(jspec))%iaerocomp(jclass) )%idt + + zdensity=speclist(aero_idx(jspec))%density + + IF (nrad(jclass)>0) THEN + + ! jspec = aerocomp(jn)%spid + ! ikey = aerocomp(jn)%species%iaerorad + ikey=speclist(aero_idx(jspec))%iaerorad + + !--- Sum volume of compound weighted by volume: + + DO jk=1, klev + DO jl=1, kproma + IF(pxtm1(jl,jk,jt)>zeps) THEN + + !ham_ps:redundant + ! zv=pxtm1(jl,jk,jt)*zmassfac/zdensity + zv=pxtm1(jl,jk,jt)/zdensity + + zvcomp(jl,jk,jspec,jclass)=zvcomp(jl,jk,jspec,jclass) + zv + zvsum(jl,jk,jclass) =zvsum(jl,jk,jclass) + zv + znivsum(jl,jk,jclass) =znivsum(jl,jk,jclass) + zv * cni(jwv,ikey) + + END IF + END DO + END DO + END IF + + END IF + + END DO + END DO + + ! add aerosol water + + DO jclass=1,nclass + IF (nrad(jclass) > 0 .AND. sizeclass(jclass)%lsoluble) THEN + jt = aerowater(jclass)%idt + ikey = speclist(id_wat)%iaerorad + zdensity = speclist(id_wat)%density + + DO jk=1, klev + DO jl=1, kproma + zv=pxtm1(jl,jk,jt)/zdensity + + zvcomp(jl,jk,aero_ridx(id_wat),jclass)=zvcomp(jl,jk,aero_ridx(id_wat),jclass) + zv + zvsum(jl,jk,jclass) =zvsum(jl,jk,jclass) + zv + znivsum(jl,jk,jclass) =znivsum(jl,jk,jclass) + zv * cni(jwv,ikey) + END DO + END DO + END IF + END DO + + DO jspec=1,naerospec + + ztaucomp(1:kproma) =0._dp + zabscomp(1:kproma) =0._dp + !ham_ps:why m7 specific? + !ikey = speclist(subm_aerospec(jspec))%iaerorad + ikey=speclist(aero_idx(jspec))%iaerorad + + !--- Weighted averaging and vertical integration: + + DO jclass=1, nclass + IF (nrad(jclass) > 0) THEN + + tau_p => tau_mode(jclass,jwv)%ptr + abs_p => abs_mode(jclass,jwv)%ptr + + DO jk=1, klev + DO jl=1, kproma + IF (zvsum(jl,jk,jclass)>zeps) THEN + ztaucomp(jl)=ztaucomp(jl) + & + tau_p(jl,jk,krow)*zvcomp(jl,jk,jspec,jclass)/zvsum(jl,jk,jclass) + zabscomp(jl)=zabscomp(jl) + & + abs_p(jl,jk,krow)*zvcomp(jl,jk,jspec,jclass)*cni(jwv,ikey) / & + znivsum(jl,jk,jclass) + END IF + END DO + END DO + + END IF + END DO !jclass + + !--- Store in output streams: + + tau_comp(jspec,jwv)%ptr(1:kproma,krow)=ztaucomp(1:kproma) + abs_comp(jspec,jwv)%ptr(1:kproma,krow)=zabscomp(1:kproma) + + END DO !jspec + + END IF !nraddiagwv(jwv)>1 + + END DO !jwv + + !--- 5) Calculate Angstroem parameter between two wavelengths: + + IF (nradang(1)/=0 .AND. nradang(2)/=0) THEN + + !>>SF #458 (replacing WHERE statements) + ll1(1:kproma) = (tau_2d(nradang(1))%ptr(1:kproma,krow)>zeps) & + .AND. (tau_2d(nradang(2))%ptr(1:kproma,krow)>zeps) + + ztmp1(1:kproma) = MERGE(tau_2d(nradang(1))%ptr(1:kproma,krow), 1._dp, ll1(1:kproma)) !SF 1. is dummy + ztmp2(1:kproma) = MERGE(tau_2d(nradang(2))%ptr(1:kproma,krow), 1._dp, ll1(1:kproma)) !SF 1. is dummy + + ang(1:kproma,krow) = MERGE( & + LOG(ztmp2(1:kproma)/ztmp1(1:kproma)) / LOG(lambda(nradang(1))/lambda(nradang(2))), & + ang(1:kproma,krow), & + ll1(1:kproma)) + + !< +!! \filename +!! mo_ham_rad_data.f90 +!! +!! \brief +!! mo_ham_rad_data holds the parameters and routines for the calculation of the +!! optical parameters for the aerosol distribution simulated by the ECHAM/HAM aerosol module. +!! +!! \author Philip Stier (MPI-Met) +!! +!! \responsible_coder +!! Philip Stier, philip.stier@physics.ox.ac.uk +!! +!! \revision_history +!! -# P. Stier (MPI-Met) - original code (2003-05-08) +!! -# P. Stier (Caltech) (2006-02) +!! -# S. Rast (MPI-Met) - adaption to echam5.3.2 (2007-03) +!! -# D. O'Donnell (MPI-Met) - changed to flexible number of species and added SOA (XXXX) +!! -# M.G. Schultz (FZ Juelich) - added irad... parameters and removed pseudo-flexibility +!! (this module requires manual editing anyhow if number of species is changed) (XXXX) +!! -# P. Stier (Uni Oxford) - adaptation to RRTM-SW (2010-02) +!! -# H. Kokkola (FMI) - modified to include SALSA (2013-06) +!! +!! \limitations +!! None +!! +!! \details +!! None +!! +!! \bibliographic_references +!! - M. Hess, P. Koepke, and I. Schult (1998): Optical Properties of Aerosols and clouds: +!! The software package OPAC, Bull. Am. Met. Soc., 79, 831-844. +!! - Nilsson, B. (1979): Meteorological influence on aerosol extinction in the 0.2-40 um +!! wavelength range, Appl. Opt. 18, 3457-3473. +!! +!! \belongs_to +!! HAMMOZ +!! +!! SPDX-License-Identifier: BSD-3-Clause +!! Copyright (c) 2021 hammoz + +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +MODULE mo_ham_rad_data + + USE mo_kind, ONLY: dp + + IMPLICIT NONE + + PRIVATE + + !---public data + PUBLIC :: iradso4, iradbc, iradoc, iradss, iraddu, iradwat, iradsoa + + PUBLIC :: Nwv_sw, Nwv_sw_opt, Nwv_lw, & + Nwv_tot, Nwv_swlw, Nwv_sw_tot, & + cnr, cni, & + log_x0_min, log_x0_max, & + log_ni_min, & + x0_min, x0_max, & + nnrmax, nnimax, ndismax, & + nr_min, nr_max, ni_min, ni_max, & + inc_nr, inc_ni, & + lambda, lambda_sw_opt, & + nradang + + + !---public member functions + + PUBLIC :: ham_rad_data_initialize, nraddiagwv + + !--- species indices for radiation tables + + INTEGER, PARAMETER :: iradso4 = 1 + INTEGER, PARAMETER :: iradbc = 2 + INTEGER, PARAMETER :: iradoc = 3 + INTEGER, PARAMETER :: iradss = 4 + INTEGER, PARAMETER :: iraddu = 5 + INTEGER, PARAMETER :: iradwat = 6 + INTEGER, PARAMETER :: iradsoa = 7 + + INTEGER, PARAMETER :: naeroradspec = 7 ! for dimensioning of tables + + !--- Parameter space for the 4 lookup tables: + ! + ! Table 1 : SW fine std. dev: sigma_fine (1.59) + ! 2 : SW coarse sigma_coarse (2.00) + ! 3 : LW fine sigma_fine (1.59) + ! 4 : LW coarse sigma_coarse (2.00) + + INTEGER, PARAMETER :: Ndismax(4)=(/ 100, 100, 100, 100 /) + INTEGER, PARAMETER :: Nnrmax(4) =(/ 100, 100, 100, 100 /) + INTEGER, PARAMETER :: Nnimax(4) =(/ 200, 200, 200, 200 /) + + REAL(dp), PARAMETER :: nr_min(4)=(/ 1.33_dp, 1.33_dp, 1.0_dp, 1.0_dp /) !--min ref. ind. real + REAL(dp), PARAMETER :: nr_max(4)=(/ 2.00_dp, 2.00_dp, 3.0_dp, 3.0_dp /) !--max ref. ind. real + REAL(dp), PARAMETER :: ni_min(4)=(/ 1.E-9_dp, 1.E-9_dp, 1.E-9_dp, 1.E-9_dp /) !--min ref. ind. imag. + REAL(dp), PARAMETER :: ni_max(4)=(/ 1.00_dp, 1.00_dp, 2.0_dp, 2.0_dp /) !--max ref. ind. imag. + + REAL(dp) :: x0_min(4) + REAL(dp) :: x0_max(4) + REAL(dp) :: log_x0_min(4) + REAL(dp) :: log_x0_max(4) + REAL(dp) :: log_nr_min(4) + REAL(dp) :: log_nr_max(4) + REAL(dp) :: log_ni_min(4) + REAL(dp) :: log_ni_max(4) + + REAL(dp) :: inc_nr(4) + REAL(dp) :: inc_ni(4) + + !--- Indices and dimensions: + + INTEGER, PARAMETER :: Nwv_sw = 14, & !-- RRTM-SW GCM wavebands +#ifdef HAMMOZ + Nwv_sw_opt = 2, & !--Optional SW wavebands (550nm+865nm) +#else + Nwv_sw_opt = 0, & !--Optional SW wavebands (550nm+865nm) +#endif +! Nwv_sw_opt = 2, & !--Optional SW wavebands (550nm+865nm+440nm) + Nwv_sw_tot = Nwv_sw+Nwv_sw_opt, & + Nwv_lw = 16, & !--RRTM-LW GCM wavebands + Nwv_swlw = Nwv_sw+Nwv_lw, & + Nwv_tot = Nwv_sw+Nwv_sw_opt+Nwv_lw + + REAL(dp), PARAMETER :: lambda_sw_opt(2)=(/ 0.550E-6_dp, 0.865E-6_dp /) !used only with #HAMMOZ +! REAL(dp), PARAMETER :: lambda_sw_opt(2)=(/ 0.550E-6_dp, 0.865E-6_dp , 0.440E-6_dp/) + + !--- Define mask for output of wavelengths: + ! + ! nraddiagwv(jwv)=0 Off + ! =1 AOD + ! =2 AOD+AAOD + ! =3 AOD+AAOD+... + + INTEGER :: nraddiagwv(Nwv_tot) + + INTEGER :: nradang(2) + + !--- 1) Mid-band wavelengths: + ! 3.46, 2.79, 2.33, 2.05, 1.78, 1.46, 1.27, 1.01, 0.70, 0.53, 0.39, 0.30, 0.23, 8.02 [um] + + REAL(dp) :: lambda(1:Nwv_tot) + + +! REAL(dp), PARAMETER :: lambda(Nwv_tot) = (/ 3.46E-6_dp, 2.79E-6_dp, 2.33E-6_dp, 2.05E-6_dp, 1.78E-6_dp, 1.46E-6_dp, 1.27E-6_dp, 1.01E-6_dp, 0.70E-6_dp, 0.53E-6_dp, 0.39E-6_dp, 0.30E-6_dp, 0.23E-6_dp, 8.02E-6_dp, 0.340E-6_dp, 0.355E-6_dp, 0.380E-6_dp, 0.400E-6_dp, 0.440E-6_dp, 0.469E-6_dp, 0.500E-6_dp, 0.532E-6_dp, 0.555E-6_dp, 0.645E-6_dp, 0.670E-6_dp, 0.800E-6_dp, 0.858E-6_dp, 0.865E-6_dp, 0.1020E-6_dp, 0.1064E-6_dp /) + + + + !--- 2) LW refractive indices: + + REAL(dp) :: cnr(Nwv_tot, naeroradspec), & ! real part of refractive index + cni(Nwv_tot, naeroradspec) ! imaginary part of refractive index + + +CONTAINS + + SUBROUTINE ham_rad_data_initialize + + !---inherited types, data and functions + ! - + + USE mo_ham, ONLY: naerorad, nrad, nham_subm, HAM_M7, HAM_SALSA + + IMPLICIT NONE + + !---subroutine interface + ! - + + !---local variables + INTEGER :: itable + + !--- Initialize wavelength settings + + + !--- Default output masks for wavelengths, currently only for the optional wavelengths: + !ham_ps:radiation This could/should become namelist controlled + + IF (naerorad>0) THEN + + nraddiagwv(1:NWv_tot)=0 !--- Default: no diagnostic +#ifdef HAMMOZ + nraddiagwv(Nwv_sw+1:Nwv_sw+Nwv_sw_opt)=1 ! AOD only for all optional wavelengths + nraddiagwv(Nwv_sw+1)=2 ! Additional diagnostics for 550nm +#endif + IF (ANY(nrad(:)==2) .OR. ANY(nrad(:)==3)) THEN + nraddiagwv(Nwv_sw+Nwv_sw_opt+1)=1 ! AOD for first LW band + END IF + + !--- Define wavelengths for Angstroem diagnostics (currently first two optional wavelengths): +#ifdef HAMMOZ + nradang(1)=Nwv_sw+1 + nradang(2)=nradang(1)+1 +#endif + END IF + + + + !--- 1.0) SW Refractive Indices: + + ! Note the RRTM-SW specific band ordering: + ! 3.46, 2.79, 2.33, 2.05, 1.78, 1.46, 1.27, 1.01, 0.70, 0.53, 0.39, 0.30, 0.23, 8.02 [um] + + !--- Sulfate (Palmer & Williams, Appl.Opt., 1975; provided by Stefan Kinne): + + cnr(1:Nwv_sw,iradso4) = & + (/ 1.361_dp, 1.295_dp, 1.364_dp, 1.382_dp, 1.393_dp, 1.406_dp, & + 1.413_dp, 1.422_dp, 1.427_dp, 1.432_dp, 1.445_dp, 1.450_dp, & + 1.450_dp, 1.400_dp /) + + cni(1:Nwv_sw,iradso4) = & + (/ 1.400E-01_dp, 5.500E-02_dp, 2.100E-03_dp, 1.300E-03_dp, 5.100E-04_dp, 9.000E-05_dp, & + 7.900E-06_dp, 1.300E-06_dp, 5.200E-08_dp, 1.000E-09_dp, 1.000E-09_dp, 1.000E-09_dp, & + 1.000E-09_dp, 2.600E-01_dp /) + + !--- Optional Wavelengths at 550 and 865nm: +#ifdef HAMMOZ + cnr(Nwv_sw+1:Nwv_sw+Nwv_sw_opt,iradso4) = & + (/ 1.432_dp, 1.424_dp /) + + cni(Nwv_sw+1:Nwv_sw+Nwv_sw_opt,iradso4) = & + (/ 1.000E-09_dp, 7.384E-07_dp /) +#endif + !--- Black Carbon (Medium-absorbing values from Bond & Bergstrom, 2006): + ! + ! - at 550 nm: n=1.85-0.71i + ! - wavelength dependency scaled from OPAC (Hess et al., 1998) + + cnr(1:Nwv_sw,iradbc) = & + (/1.984_dp, 1.936_dp, 1.917_dp, 1.905_dp, 1.894_dp, 1.869_dp, & + 1.861_dp, 1.861_dp, 1.850_dp, 1.850_dp, 1.839_dp, 1.839_dp, & + 1.713_dp, 2.245_dp /) + + cni(1:Nwv_sw,iradbc) = & + (/ 8.975E-01_dp, 8.510E-01_dp, 8.120E-01_dp, 7.939E-01_dp, 7.765E-01_dp, 7.397E-01_dp, & + 7.274E-01_dp, 7.106E-01_dp, 6.939E-01_dp, 7.213E-01_dp, 7.294E-01_dp, 7.584E-01_dp, & + 7.261E-01_dp, 1.088E+00_dp /) +#ifdef HAMMOZ + !--- Optional Wavelengths at 550nm and 865nm: + + cnr(Nwv_sw+1:Nwv_sw+Nwv_sw_opt,iradbc) = & + (/ 1.85_dp, 1.85_dp /) + + cni(Nwv_sw+1:Nwv_sw+Nwv_sw_opt,iradbc) = & + (/ 7.10E-01_dp, 6.99E-01_dp /) +#endif + !--- Organic Carbon (Medium-absorbing values from Bond & Bergstrom, 2006): + ! + ! - wavelength dependency scaled from OPAC (Hess et al., 1998) + + cnr(1:Nwv_sw,iradoc) = & + (/ 1.530_dp, 1.510_dp, 1.510_dp, 1.420_dp, 1.464_dp, 1.520_dp, & + 1.420_dp, 1.420_dp, 1.530_dp, 1.530_dp, 1.530_dp, 1.443_dp, & + 1.530_dp, 1.124_dp /) + + cni(1:Nwv_sw,iradoc) = & + (/ 2.75E-02_dp, 7.33E-03_dp, 7.33E-03_dp, 4.58E-03_dp, 6.42E-03_dp, 1.43E-02_dp, & + 1.77E-02_dp, 2.01E-02_dp, 1.50E-02_dp, 7.70E-03_dp, 9.75E-03_dp, 1.63E-02_dp, & + 5.27E-03_dp, 7.24E-02_dp /) + + !--- Optional Wavelengths at 550nm and 865nm: +#ifdef HAMMOZ + cnr(Nwv_sw+1:Nwv_sw+Nwv_sw_opt,iradoc) = & + (/ 1.53_dp, 1.52_dp /) + + cni(Nwv_sw+1:Nwv_sw+Nwv_sw_opt,iradoc) = & + (/ 5.50E-03_dp, 1.10E-02_dp /) +#endif + !--- Sea Salt (Nilsson, 1979): + + cnr(1:Nwv_sw,iradss) = & + (/ 1.480_dp, 1.400_dp, 1.440_dp, 1.450_dp, 1.450_dp, 1.460_dp, & + 1.470_dp, 1.470_dp, 1.480_dp, 1.490_dp, 1.500_dp, 1.510_dp, & + 1.510_dp, 1.400_dp /) + + cni(1:Nwv_sw,iradss) = & + (/ 1.300E-02_dp, 8.000E-03_dp, 2.500E-03_dp, 1.500E-03_dp, 1.000E-03_dp, 5.500E-04_dp, & + 3.300E-04_dp, 1.000E-04_dp, 1.000E-07_dp, 1.000E-08_dp, 2.000E-08_dp, 1.000E-06_dp, & + 1.000E-05_dp, 1.400E-02_dp /) + + !--- Optional Wavelengths at 550nm and 865nm: +#ifdef HAMMOZ + cnr(Nwv_sw+1:Nwv_sw+Nwv_sw_opt,iradss) = & + (/ 1.450_dp, 1.470_dp /) + + cni(Nwv_sw+1:Nwv_sw+Nwv_sw_opt,iradss) = & + (/ 1.000E-08_dp, 1.000E-8_dp /) +#endif + !--- Dust (provided by Stefan Kinne, MPI-MET: + ! mainly based on Sokolik & Toon, JGR, 1999) + ! imaginary parts in the visible modified according to AERONET statistics + ! much less absorption in the VIS (mainly based on Kinne et.al, JGR, 2003): + + cnr(1:Nwv_sw,iraddu) = & + (/ 1.460_dp, 1.460_dp, 1.460_dp, 1.450_dp, 1.450_dp, 1.450_dp, & + 1.450_dp, 1.450_dp, 1.450_dp, 1.450_dp, 1.450_dp, 1.450_dp, & + 1.450_dp, 1.170_dp /) + + cni(1:Nwv_sw,iraddu) = & + (/ 1.180E-02_dp, 6.000E-03_dp, 2.500E-03_dp, 1.500E-03_dp, 1.000E-03_dp, 8.000E-04_dp, & + 6.000E-04_dp, 7.500E-04_dp, 9.500E-04_dp, 1.000E-03_dp, 2.500E-03_dp, 2.000E-02_dp, & + 2.500E-02_dp, 1.000E-01_dp /) + + !--- Optional Wavelengths at 550nm and 865nm: +#ifdef HAMMOZ + cnr(Nwv_sw+1:Nwv_sw+Nwv_sw_opt,iraddu) = & + (/ 1.450_dp, 1.450_dp /) + + cni(Nwv_sw+1:Nwv_sw+Nwv_sw_opt,iraddu) = & + (/ 1.000E-03_dp, 8.400E-4_dp /) +#endif + !--- Water (provided by Stefan Kinne interpolated with code by Andy Lacis (NASA-GISS): + ! (Hale and Querry [1973] for 0.2 to 0.7 mm, + ! Palmer and Williams [1974] for 0.7 to 2.0 mm) + + cnr(1:Nwv_sw,iradwat) = & + (/ 1.423_dp, 1.244_dp, 1.283_dp, 1.300_dp, 1.312_dp, 1.319_dp, & + 1.324_dp, 1.328_dp, 1.331_dp, 1.335_dp, 1.341_dp, 1.350_dp, & + 1.377_dp, 1.300_dp /) + + cni(1:Nwv_sw,iradwat) = & + (/ 5.000E-02_dp, 1.300E-01_dp, 6.500E-04_dp, 6.700E-04_dp, 1.200E-04_dp, 1.100E-04_dp, & + 1.200E-05_dp, 2.100E-06_dp, 6.800E-08_dp, 2.800E-09_dp, 3.900E-09_dp, 1.700E-08_dp, & + 6.400E-08_dp, 4.000E-02_dp /) + + !--- Optional Wavelengths at 550nm and 865nm: +#ifdef HAMMOZ + cnr(Nwv_sw+1:Nwv_sw+Nwv_sw_opt,iradwat) = & + (/ 1.335_dp, 1.329_dp /) + + cni(Nwv_sw+1:Nwv_sw+Nwv_sw_opt,iradwat) = & + (/ 2.800E-09, 1.186E-06 /) +#endif + + !--- 2) LW refractive indices: + ! Note that the RRTM spectral bands are ordered with increasing wavenumber, + ! i.e. decreasing wavelengths. + + !--- Sulfate (Ammonium Sulfate from Toon and Pollack, 1976) + ! Interpolated with subroutine of Andy Lacis (NASA-GISS) + + cnr(Nwv_sw+Nwv_sw_opt+1:Nwv_tot,iradso4) = & + (/ 1.889_dp, 1.588_dp, 1.804_dp, 1.537_dp, 1.709_dp, 1.879_dp, & + 2.469_dp, 0.685_dp, 1.427_dp, 0.956_dp, 1.336_dp, 1.450_dp, & + 1.489_dp, 1.512_dp, 1.541_dp, 1.602_dp /) + + cni(Nwv_sw+Nwv_sw_opt+1:Nwv_tot,iradso4) = & + (/ 0.967E-01_dp, 0.380E-01_dp, 0.287E-01_dp, 0.225E-01_dp, 0.200E-01_dp, 0.396E-01_dp, & + 0.269E+00_dp, 0.111E+01_dp, 0.705E-01_dp, 0.678E+00_dp, 0.143E-01_dp, 0.664E-02_dp, & + 0.657E-02_dp, 0.944E-02_dp, 0.148E-01_dp, 0.156E+00_dp /) + + !--- Black Carbon (Medium-absorbing values from Bond & Bergstrom, 2006): + ! + ! - at 550 nm: n=1.85-0.71i + ! - wavelength dependency scaled from OPAC (Hess et al., 1998) + + cnr(Nwv_sw+Nwv_sw_opt+1:Nwv_tot,iradbc) = & + (/ 2.84_dp, 2.63_dp, 2.53_dp, 2.46_dp, 2.42_dp, 2.36_dp, & + 2.33_dp, 2.30_dp, 2.23_dp, 2.17_dp, 2.14_dp, 2.09_dp, & + 2.06_dp, 2.04_dp, 2.03_dp, 1.98_dp /) + + cni(Nwv_sw+Nwv_sw_opt+1:Nwv_tot,iradbc) = & + (/ 1.61E+00_dp, 1.42E+00_dp, 1.33E+00_dp, 1.28E+00_dp, 1.23E+00_dp, 1.18E+00_dp, & + 1.16E+00_dp, 1.14E+00_dp, 1.08E+00_dp, 1.04E+00_dp, 1.00E+00_dp, 9.73E-01_dp, & + 9.56E-01_dp, 9.46E-01_dp, 9.37E-01_dp, 8.91E-01_dp /) + + !--- Organic Carbon: + ! OPAC WaSo Category (M. Hess, P. Koepke, and I. Schult, 1998): + + cnr(Nwv_sw+Nwv_sw_opt+1:Nwv_tot,iradoc) = & + (/ 1.86_dp, 1.95_dp, 2.02_dp, 1.43_dp, 1.61_dp, 1.71_dp, & + 1.81_dp, 2.64_dp, 1.23_dp, 1.42_dp, 1.42_dp, 1.45_dp, & + 1.46_dp, 1.46_dp, 1.46_dp, 1.44_dp /) + + cni(Nwv_sw+Nwv_sw_opt+1:Nwv_tot,iradoc) = & + (/ 4.58E-01_dp, 2.35E-01_dp, 1.86E-01_dp, 1.82E-01_dp, 5.31E-02_dp, 4.52E-02_dp, & + 4.54E-02_dp, 3.76E-01_dp, 6.04E-02_dp, 5.30E-02_dp, 2.29E-02_dp, 1.27E-02_dp, & + 1.17E-02_dp, 9.28E-03_dp, 4.88E-03_dp, 5.95E-03_dp /) + + !--- Sea Salt: + ! (Shettle and Fenn, 1979; Nilsson, 1979; both based on Volz, 1972 measurements) + ! Inter with subroutine of Andy Lacis (NASA-GISS) + + cnr(Nwv_sw+Nwv_sw_opt+1:Nwv_tot,iradss) = & + (/ 1.668_dp, 1.749_dp, 1.763_dp, 1.447_dp, 1.408_dp, 1.485_dp, & + 1.563_dp, 1.638_dp, 1.401_dp, 1.450_dp, 1.505_dp, 1.459_dp, & + 1.483_dp, 1.488_dp, 1.478_dp, 1.484_dp /) + + cni(Nwv_sw+Nwv_sw_opt+1:Nwv_tot,iradss) = & + (/ 0.981E+00_dp, 0.193E+00_dp, 0.111E+00_dp, 0.344E-01_dp, 0.192E-01_dp, 0.140E-01_dp, & + 0.179E-01_dp, 0.293E-01_dp, 0.138E-01_dp, 0.543E-02_dp, 0.180E-01_dp, 0.288E-02_dp, & + 0.251E-02_dp, 0.246E-02_dp, 0.175E-02_dp, 0.206E-02_dp /) + + !--- Dust (Irina Sokolik, personal communication, 2006): + + cnr(Nwv_sw+Nwv_sw_opt+1:Nwv_tot,iraddu) = & + (/ 2.552_dp, 2.552_dp, 1.865_dp, 1.518_dp, 1.697_dp, 1.816_dp, & + 2.739_dp, 1.613_dp, 1.248_dp, 1.439_dp, 1.423_dp, 1.526_dp, & + 1.502_dp, 1.487_dp, 1.480_dp, 1.468_dp /) + + cni(Nwv_sw+Nwv_sw_opt+1:Nwv_tot,iraddu) = & + (/ 0.7412_dp, 0.7412_dp, 0.5456_dp, 0.2309_dp, 0.1885_dp, 0.2993_dp, & + 0.7829_dp, 0.4393_dp, 0.1050_dp, 0.0976_dp, 0.0540_dp, 0.0228_dp, & + 0.0092_dp, 0.0053_dp, 0.0044_dp, 0.0101_dp /) + + !--- Water: + ! (Downing and Williams, 1975) + ! Interpolated with subroutine by Andy Lacis (NASA-GISS) + + cnr(Nwv_sw+Nwv_sw_opt+1:Nwv_tot,iradwat) = & + (/ 1.689_dp, 1.524_dp, 1.401_dp, 1.283_dp, 1.171_dp, 1.149_dp, & + 1.230_dp, 1.264_dp, 1.295_dp, 1.314_dp, 1.312_dp, 1.316_dp, & + 1.327_dp, 1.333_dp, 1.348_dp, 1.416_dp /) + + cni(Nwv_sw+Nwv_sw_opt+1:Nwv_tot,iradwat) = & + (/ 0.618E+00_dp, 0.392E+00_dp, 0.428E+00_dp, 0.395E+00_dp, 0.317E+00_dp, 0.107E+00_dp, & + 0.481E-01_dp, 0.392E-01_dp, 0.347E-01_dp, 0.348E-01_dp, 0.132E+00_dp, 0.106E-01_dp, & + 0.151E-01_dp, 0.881E-02_dp, 0.483E-02_dp, 0.169E-01_dp /) + + !--- Secondary Organic Carbons: + ! Assume values of primary organics, i.e. OPAC WaSo Category (M. Hess, P. Koepke, and I. Schult, 1998): + + cni(:,iradsoa) = cni(:,iradoc) + cnr(:,iradsoa) = cnr(:,iradoc) + + !---calculations for optimisation of reading of lookup tables + + SELECT CASE(nham_subm) + + CASE(HAM_M7) + + x0_min=(/ 0.001_dp, 0.4_dp, 5.E-6_dp, 0.0015_dp /) !--min Mie parameter + x0_max=(/ 25.0_dp, 40.0_dp, 3._dp, 4._dp /) !--max Mie parameter + + CASE(HAM_SALSA) + + x0_min=(/ 0.001_dp, 0.16_dp, 5.E-6_dp, 0.0015_dp /) !--min Mie parameter + + x0_max=(/ 25.0_dp, 210.0_dp, 3._dp, 17._dp /) !--max Mie parameter + + END SELECT + + DO itable=1,4 + + log_x0_min(itable) = LOG(x0_min(itable)) + log_x0_max(itable) = LOG(x0_max(itable)) + + log_nr_min(itable) = LOG(nr_min(itable)) + log_nr_max(itable) = LOG(nr_max(itable)) + + log_ni_min(itable) = LOG(ni_min(itable)) + log_ni_max(itable) = LOG(ni_max(itable)) + + !--- Real part: + inc_nr(itable)=(nr_max(itable)-nr_min(itable))/REAL(Nnrmax(itable),dp) + + !--- Imaginary part in log-space: + inc_ni(itable)=(log_ni_max(itable)-log_ni_min(itable))/REAL(Nnimax(itable),dp) + + END DO + + + END SUBROUTINE ham_rad_data_initialize + +END MODULE mo_ham_rad_data diff --git a/ifs-source/arpifs/phys_ec/mo_ham_sedimentation.F90 b/ifs-source/arpifs/phys_ec/mo_ham_sedimentation.F90 new file mode 100644 index 00000000..efa076da --- /dev/null +++ b/ifs-source/arpifs/phys_ec/mo_ham_sedimentation.F90 @@ -0,0 +1,275 @@ +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! \filename +!! mo_ham_sedimentation.f90 +!! +!! \brief +!! Calculate sedimentation rates for aerosol tracers in the HAM model +!! +!! \author Michael Schulz (LSCE) +!! \author P. Stier (MPI-Met) +!! +!! \responsible_coder +!! [ John Doe, john.doe@blabla.com -Compulsory- ] +!! +!! \revision_history +!! -# Michael Schulz (LSCE) - original code (2001-02-05) +!! -# P. Stier (MPI-Met) - adapted to ECHAM5-HAM (2002) +!! -# Martin grav. Schultz (FZ Juelich) - adapted to ECHAM6-HAMMOZ (integrated in modular structure) (2009) +!! +!! \limitations +!! None +!! +!! \details +!! This module is derived from the former xt_sedimentation routine (ECHAM5-HAM). +!! +!! \bibliographic_references +!! - Seinfeld &Pandis (1998) +!! +!! \belongs_to +!! HAMMOZ +!! +!! SPDX-License-Identifier: BSD-3-Clause +!! Copyright (c) 2021 hammoz +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +MODULE mo_ham_sedimentation + + USE mo_kind, ONLY: dp + + IMPLICIT NONE + + PRIVATE + + PUBLIC :: ham_prep_sedi, ham_sedimentation + + + CONTAINS + +!! The subroutine ham_prep_sedi calculates tracer-independent physical parameters +!! needed in the ham_sedimentation routine + + SUBROUTINE ham_prep_sedi(kproma, kbdim, klev, & + pt, pq, pap, paph, & + ptempc, & + pvis, plair, prho, & + pdpg, pdz ) + + USE mo_physical_constants, ONLY: rd, vtmpc1, grav, tmelt + + !--- parameters + INTEGER, INTENT(in) :: kproma, kbdim, klev ! indices + REAL(dp), INTENT(in) :: pt(kbdim, klev), & ! temperature + pq(kbdim, klev), & ! specific humidity + pap(kbdim, klev), & ! full level pressure + paph(kbdim, klev+1) ! half level pressure + REAL(dp), INTENT(out) :: ptempc(kbdim, klev), & ! temp. above melting + pvis(kbdim, klev), & ! air viscosity + plair(kbdim, klev), & ! mean free path length + prho(kbdim, klev), & ! air density + pdpg(kbdim, klev), & ! layer thickness (pressure) + pdz(kbdim, klev) ! layer thickness (length) + + !--- local variables + INTEGER :: jk + REAL(dp) :: ztmp1(kbdim,klev) !SF #458 + + !--- code + + !--- Temperature at t=t+1: + ptempc(1:kproma,:) = pt(1:kproma,:) - tmelt + + !--- Dynamic viscosity of air after Prup.Klett: pvis [Pa s] + !>>SF #458 (replacing where statements) + ztmp1(1:kproma,:) = 1.718_dp + 0.0049_dp*ptempc(1:kproma,:) + + pvis(1:kproma,:) = MERGE( & + ztmp1(1:kproma,:)*1.E-5_dp, & + (ztmp1(1:kproma,:) - 1.2E-05_dp*(ptempc(1:kproma,:)**2))*1.E-5_dp, & + (ptempc(1:kproma,:) >= 0._dp)) + !< rwet(imod)%ptr + densaer_p => densaer(imod)%ptr +#endif + !--- Select diameter and limit it to maximal 50 um: + ! If tracer is: + ! aerosol number mixing ratio: use number median radius + ! aerosol mass mixing ratio: use mass median radius + + !TB + ! With SALSA bins are considered monodisperse so no need for cmedr2mmedr + + SELECT CASE(nham_subm) + CASE(HAM_M7) + IF (trlist%ti(kt)%nphase==AEROSOLNUMBER) THEN +#ifdef HAMMOZ + zmd(1:kproma,:)=MIN( rwet_p(1:kproma,:,krow)*2._dp , 50.E-6_dp) +#else + zmd(1:kproma,:)=MIN( prwetm7(1:kproma,:,imod)*2._dp , 50.E-6_dp) +#endif + ELSE IF (trlist%ti(kt)%nphase==AEROSOLMASS) THEN +#ifdef HAMMOZ + zmd(1:kproma,:)=MIN( rwet_p(1:kproma,:,krow)*cmedr2mmedr(imod)*2._dp , 50.E-6_dp) +#else + zmd(1:kproma,:)=MIN( prwetm7(1:kproma,:,imod)*cmedr2mmedr(imod)*2._dp , 50.E-6_dp) +#endif + ELSE + WRITE(message_text,'(a)') 'unexpected tracer phase' + CALL message('ham_sedimentation', message_text, level=em_error) + END IF + + !--- Slinn correction for sedimentation velocity of a + ! size distribution with a given sigma: + slinnfac=sigma(imod)**(2._dp*sigmaln(imod)) + + CASE(HAM_SALSA) +#ifdef HAMMOZ + zmd(1:kproma,:)=MIN( rwet_p(1:kproma,:,krow)*2._dp , 50.E-6_dp) +#else + zmd(1:kproma,:)=MIN( prwetm7(1:kproma,:,imod)*2._dp , 50.E-6_dp) +#endif + !TB + !slinnfac not needed + slinnfac=1.0_dp + END SELECT + +!>>SF #458 (replacing where statements) + ll1(1:kproma,:) = (zmd(1:kproma,:) > 0._dp) + + ztmp1(1:kproma,:) = MERGE(zmd(1:kproma,:), 1._dp, ll1(1:kproma,:)) !SF protection against division by 0 further below + ! 1._dp is a dummy value + !--- Stokes-velocity (S&P, Equation 8.42): +#ifdef HAMMOZ + ztmp2(1:kproma,:) = 2._dp/9._dp*(densaer_p(1:kproma,:,krow)-prho(1:kproma,:)) & + * grav/pvis(1:kproma,:)*(ztmp1(1:kproma,:)/2._dp)**2._dp +#else + ztmp2(1:kproma,:) = 2._dp/9._dp*(pdensaerm7(1:kproma,:,imod)-prho(1:kproma,:)) & + * grav/pvis(1:kproma,:)*(ztmp1(1:kproma,:)/2._dp)**2._dp +#endif + !--- With Cunnigham slip- flow correction (S&P, Equation 8.34): + SELECT CASE(nham_subm) + CASE(HAM_M7) + ztmp2(1:kproma,:) = ztmp2(1:kproma,:) & +!>>DN #328 + * (slinnfac + & + 1.246_dp*2._dp*plair(1:kproma,:) & + /ztmp1(1:kproma,:)*exp((0.5_dp*sigmaln(imod)**2._dp))) +!< +!! \filename +!! mo_ham_soa.f90 +!! +!! \brief +!! This module contains HAM routines related to the handling of secondary organic aerosols. +!! +!! \author Declan O'Donnell (MPI-M) +!! +!! \responsible_coder +!! Declan O'Donnell, declan.Odonnell@fmi.fi +!! +!! \revision_history +!! -# Declan O'Donnell (MPI-Met) - original code (YYYY) +!! -# Kai Zhang (MPI-Met) - rewrite species registeration part, change longname +!! and shortname to avoid duplicate longnames in species list (2009-08) +!! +!! \limitations +!! None +!! +!! \details +!! None +!! +!! \bibliographic_references +!! None +!! +!! \belongs_to +!! HAMMOZ +!! +!! SPDX-License-Identifier: BSD-3-Clause +!! Copyright (c) 2021 hammoz + +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +MODULE mo_ham_soa + + !--- inherited types, data and functions + USE mo_kind, ONLY: dp + USE mo_ham, ONLY: nsoaspec, new_aerocomp + USE mo_tracdef, ONLY: ON, OFF, itrnone, itrdiag, itrprog, itrpresc + USE mo_ham_species, ONLY: id_oc + !USE mo_decomposition,ONLY: lc => local_decomposition + USE mo_species, ONLY: t_species, new_species + USE mo_tracdef, ONLY: GAS, AEROSOL, GAS_OR_AEROSOL, ON, OFF + + IMPLICIT NONE + + !---public member functions +#ifdef HAMMOZ + PUBLIC :: soa_species + !>>dod deleted start_map_soaspec <>dod + PUBLIC :: set_soa_tracer_attr + !<>dod deleted dead code (t_soa_rxn) + !<< dod + TYPE, PUBLIC :: t_soa_prop ! SOA properties + LOGICAL :: lvolatile ! Volatile species T/F + REAL(dp) :: Kp ! 2-product model parameter: + ! partitioning coefficient + REAL(dp) :: tref ! 2-product model parameter: + ! temperature at which Kp was derived + REAL(dp) :: dH ! 2-product model parameter: + ! Enthalpy of vaporisation + INTEGER :: spid_tot ! Species id, prognostic species (gas+aerosol total mass) + INTEGER :: spid_soa ! Species id, diagnostic species (gas or aerosol) + END TYPE t_soa_prop + +!!mgs!! removed obsolete t_soa_species and replaced with soagas_idx + + !---public module data + + !---maximum number of SOA species + INTEGER, PARAMETER, PUBLIC :: nmaxsoa = 7 + + !---species identities for SOA precursors, gases and aerosols ### now in mo_soa_species + ! soa precursors + !>>csld #404 + !define new monoterpene species for use of MEGAN2.1 + INTEGER, PUBLIC :: id_apin, id_tbeta, id_bpin, id_lim, id_sab, id_myrc, id_car + !<>dod removed dead code (soa_rxn) + !<< dod + + !---model functional switches + LOGICAL, PUBLIC :: lso4_in_m0 = .FALSE. ! include sulphate in SOA absorbing mass? + + !---diagnostic fields... + REAL(dp), PUBLIC, POINTER :: d_prod_soa_mterp(:,:) + REAL(dp), PUBLIC, POINTER :: d_prod_soa_isop(:,:) + REAL(dp), PUBLIC, POINTER :: d_prod_soa_tol(:,:) + REAL(dp), PUBLIC, POINTER :: d_prod_soa_xyl(:,:) + REAL(dp), PUBLIC, POINTER :: d_prod_soa_benz(:,:) + REAL(dp), PUBLIC, POINTER :: d_chem_sink_mterp(:,:) + REAL(dp), PUBLIC, POINTER :: d_chem_sink_isop(:,:) + REAL(dp), PUBLIC, POINTER :: d_chem_sink_tol(:,:) + REAL(dp), PUBLIC, POINTER :: d_chem_sink_xyl(:,:) + REAL(dp), PUBLIC, POINTER :: d_chem_sink_benz(:,:) + + !----------------------------------------------------------------------------------------------- + + CONTAINS + !----------------------------------------------------------------------------------------------- + + +#ifdef HAMMOZ + SUBROUTINE soa_species +!### NOTE: species type shall be changed to cover both gas-phase and aerosol definitions in one structure +!### Will require nphase as bit flags (1 = gas, 2=aerosol [4=liquid...]) - only one species per oxidation product then. + + USE mo_ham, ONLY: nsoalumping +!++mgs + USE mo_ham_rad_data, ONLY: iradsoa +!--mgs + !>> dod + ! USE mo_submodel, ONLY: lham, lhammoz + USE mo_tracdef, ONLY: GAS, AEROSOL, GAS_OR_AEROSOL + !<< + IMPLICIT NONE + + !---local data: + INTEGER :: i + !---executable procedure + + + !---create precursors + ! Monoterpenes + !>>dod changed lwetdep to FALSE on the basis that it is negligible in runs where it was used + +!>>csld #404 new species for use of MEGAN2.1 + + CALL new_species(nphase = GAS, & + longname = 'alpha pinene', & + shortname = 'APIN', & + units = 'kg kg-1', & + mw = 136._dp, & + tsubmname = 'HAM', & + itrtype = itrprog, & + ldrydep = .FALSE., & + lwetdep = .FALSE., & + lburden = .TRUE., & + idx = id_apin ) + + CALL new_species(nphase = GAS, & + longname = 't beta ocimene', & + shortname = 'TBETAOCI', & + units = 'kg kg-1', & + mw = 136._dp, & + tsubmname = 'HAM', & + itrtype = itrprog, & + ldrydep = .FALSE., & + lwetdep = .FALSE., & + lburden = .TRUE., & + idx = id_tbeta ) + + CALL new_species(nphase = GAS, & + longname = 'b pinene', & + shortname = 'BPIN', & + units = 'kg kg-1', & + mw = 136._dp, & + tsubmname = 'HAM', & + itrtype = itrprog, & + ldrydep = .FALSE., & + lwetdep = .FALSE., & + lburden = .TRUE., & + idx = id_bpin ) + + CALL new_species(nphase = GAS, & + longname = 'limonene', & + shortname = 'LIMON', & + units = 'kg kg-1', & + mw = 136._dp, & + tsubmname = 'HAM', & + itrtype = itrprog, & + ldrydep = .FALSE., & + lwetdep = .FALSE., & + lburden = .TRUE., & + idx = id_lim ) + + CALL new_species(nphase = GAS, & + longname = 'sabinene', & + shortname = 'SABIN', & + units = 'kg kg-1', & + mw = 136._dp, & + tsubmname = 'HAM', & + itrtype = itrprog, & + ldrydep = .FALSE., & + lwetdep = .FALSE., & + lburden = .TRUE., & + idx = id_sab ) + + CALL new_species(nphase = GAS, & + longname = 'myrcene', & + shortname = 'MYRC', & + units = 'kg kg-1', & + mw = 136._dp, & + tsubmname = 'HAM', & + itrtype = itrprog, & + ldrydep = .FALSE., & + lwetdep = .FALSE., & + lburden = .TRUE., & + idx = id_myrc ) + + CALL new_species(nphase = GAS, & + longname = '3-carene', & + shortname = 'CARENE3', & + units = 'kg kg-1', & + mw = 136._dp, & + tsubmname = 'HAM', & + itrtype = itrprog, & + ldrydep = .FALSE., & + lwetdep = .FALSE., & + lburden = .TRUE., & + idx = id_car ) +!<>no, but I am not sure that it is not, either. It is reactive stuff, so dry dep. + ! is kept, wet dep is removed, as for monoterpenes...might delete drydep too, align with + ! the chemistry model + CALL new_species(nphase = GAS, & + longname = 'Isoprene', & + shortname = 'C5H8', & + units = 'kg kg-1', & + mw = 68._dp, & + tsubmname = 'HAM', & + itrtype = itrprog, & + ldrydep = .FALSE., & + lwetdep = .FALSE., & + lburden = .TRUE., & + idx = id_isop ) + !<> dod anthropogenics: removed henry since wetdep=F + CALL new_species(nphase = GAS, & + longname = 'Toluene', & + shortname = 'TOL', & + units = 'kg kg-1', & + mw = 92._dp, & + tsubmname = 'HAM', & + itrtype = itrprog, & + ldrydep = .FALSE., & + lwetdep = .FALSE., & + lburden = .TRUE., & + idx = id_tol ) + + ! Xylene + + CALL new_species(nphase = GAS, & + longname = 'Xylene', & + shortname = 'XYL', & + units = 'kg kg-1', & + mw = 106._dp, & + tsubmname = 'HAM', & + itrtype = itrprog, & + ldrydep = .FALSE., & + lwetdep = .FALSE., & + lburden = .TRUE., & + idx = id_xyl ) + + ! Benzene + + CALL new_species(nphase = GAS, & + longname = 'Benzene', & + shortname = 'BENZ', & + units = 'kg kg-1', & + mw = 66._dp, & + tsubmname = 'HAM', & + itrtype = itrprog, & + ldrydep = .FALSE., & + lwetdep = .FALSE., & + lburden = .TRUE., & + idx = id_benz ) + + !<< dod + + !---create biogenic gas phase SOA species +!++mgs: note: ltrreq now moved to aerosol species to avoid duplicate subname 'gas' + + !>> dod + ! semi-volatile species are handled in a special way. Such species may exist both in the + ! gas and aerosol phases, and in many different aerosol size modes. Partitioning between + ! gas and aerosol is done with an equilibrium model. This has the consequence that from the + ! point of view of tracer transport, we do not actually need separate aerosol and gas phase + ! tracers: since both gas and aerosol are transported in the same way, we can simply transport + ! the total mass (gas+aerosol) and then diagnose the gas and aerosol masses using the + ! equilibrium model. This cuts the tracer transport requirements by a factor of 5 or so. + ! For purposes of calculating radiative effects, wet deposition, + ! etc., it is convenient to also implement the separated gas and aerosols as tracers. + + ! First the prognostic species (total). Define it as a gas, otherwise HAM will + ! allocate many tracers. + CALL new_species(nphase = GAS, & + longname = 'Monoterpene SOA Total 1', & + shortname = 'SOA_MT_T1', & + units = 'kg kg-1', & + mw = 186._dp, & + tsubmname = 'HAM', & + itrtype = itrprog, & + lburden = .FALSE., & + idx = soaprop(1)%spid_tot ) + + + CALL new_species(nphase = GAS, & + longname = 'Monoterpene SOA Total 2', & + shortname = 'SOA_MT_T2', & + units = 'kg kg-1', & +!gf mw = 186._dp, & + mw = 168._dp, & + tsubmname = 'HAM', & + itrtype = itrprog, & + lburden = .FALSE., & + idx = soaprop(2)%spid_tot ) + + + ! now the gases and aerosols... + CALL new_species(nphase = GAS_OR_AEROSOL, & + longname = 'Monoterpene SOA 1', & + shortname = 'SOA_MT1', & + units = 'kg kg-1', & + mw = 186._dp, & + tsubmname = 'HAM', & + itrtype = itrdiag, & + ldrydep = .TRUE., & + lwetdep = .TRUE., & + dryreac = 0._dp, & +!gf(#94) henry = (/ 1.E4_dp, 0._dp /), & + henry = (/ 1.E5_dp, 0._dp /), & + density = 1320._dp, & + iaerorad = iradsoa, & + lwatsol = .TRUE., & + kappa = 0.06_dp, & !>>dod << + lburden = .TRUE., & + idx = soaprop(1)%spid_soa ) + + + CALL new_species(nphase = GAS_OR_AEROSOL, & + longname = 'Monoterpene SOA 2', & + shortname = 'SOA_MT2', & + units = 'kg kg-1', & +!gf mw = 186._dp, & + mw = 168._dp, & + tsubmname = 'HAM', & + itrtype = itrdiag, & + ldrydep = .TRUE., & + lwetdep = .TRUE., & + dryreac = 0._dp, & + henry = (/ 1.E5_dp, 0._dp /), & + density = 1320._dp, & + iaerorad = iradsoa, & + lwatsol = .TRUE., & + kappa = 0.06_dp, & !>>dod << + lburden = .TRUE., & + idx = soaprop(2)%spid_soa ) + + + ! End of monoterpene definition + + ! Isoprene + + ! Prognostic species (total mass) + CALL new_species(nphase = GAS, & + longname = 'Isoprene SOA Total 1', & + shortname = 'SOA_IS_T1', & + units = 'kg kg-1', & + mw = 125._dp, & + tsubmname = 'HAM', & + itrtype = itrprog, & + lburden = .FALSE., & + idx = soaprop(3)%spid_tot ) + + CALL new_species(nphase = GAS, & + longname = 'Isoprene SOA Total 2', & + shortname = 'SOA_IS_T2', & + units = 'kg kg-1', & + mw = 125._dp, & + tsubmname = 'HAM', & + itrtype = itrprog, & + lburden = .FALSE., & + idx = soaprop(4)%spid_tot ) + + ! Diagnostic species. + CALL new_species(nphase = GAS_OR_AEROSOL, & + longname = 'Isoprene SOA 1', & + shortname = 'SOA_IS1', & + units = 'kg kg-1', & + mw = 125._dp, & + tsubmname = 'HAM', & + itrtype = itrdiag, & + ldrydep = .TRUE., & + lwetdep = .TRUE., & + dryreac = 0._dp, & +!gf(#94) henry = (/ 1.E4_dp, 0._dp /), & + henry = (/ 1.E5_dp, 0._dp /), & + density = 1320._dp, & + iaerorad = iradsoa, & + lwatsol = .TRUE., & + kappa = 0.06_dp, & !>>dod << + lburden = .TRUE., & + idx = soaprop(3)%spid_soa ) + + CALL new_species(nphase = GAS_OR_AEROSOL, & + longname = 'Isoprene SOA 2', & + shortname = 'SOA_IS2', & + units = 'kg kg-1', & + mw = 125._dp, & + tsubmname = 'HAM', & + itrtype = itrdiag, & + ldrydep = .TRUE., & + lwetdep = .TRUE., & + dryreac = 0._dp, & + henry = (/ 1.E5_dp, 0._dp /), & + lburden = .TRUE., & + density = 1320._dp, & + iaerorad = iradsoa, & + lwatsol = .TRUE., & + kappa = 0.06_dp, & !>>dod << + idx = soaprop(4)%spid_soa ) + + ! End isoprene definitons + + !---create anthropogenic gas phase SOA species according to lumping parameter + ! + SELECT CASE(nsoalumping) + CASE(0) ! no lumping, all anthropogenics distinct + + CALL new_species(nphase = AEROSOL, & + longname = 'Toluene SOA', & + shortname = 'SOA_TOL', & + units = 'kg kg-1', & + mw = 124._dp, & + tsubmname = 'HAM', & + itrtype = itrprog, & + ldrydep = .TRUE., & + lwetdep = .TRUE., & + density = 1450._dp, & + iaerorad = iradsoa, & + lwatsol = .TRUE., & + kappa = 0.06_dp, & !>>dod << + lburden = .TRUE., & + idx = soaprop(5)%spid_soa ) + + + CALL new_species(nphase = AEROSOL, & + longname = 'Xylene SOA', & + shortname = 'SOA_XYL', & + units = 'kg kg-1', & + mw = 138._dp, & + tsubmname = 'HAM', & + itrtype = itrprog, & + ldrydep = .TRUE., & + lwetdep = .TRUE., & + density = 1330._dp, & + iaerorad = iradsoa, & + lwatsol = .TRUE., & + kappa = 0.06_dp, & !>>dod << + lburden = .TRUE., & + idx = soaprop(6)%spid_soa ) + + CALL new_species(nphase = AEROSOL, & + longname = 'Benzene SOA', & + shortname = 'SOA_BENZ', & + units = 'kg kg-1', & + mw = 98._dp, & + tsubmname = 'HAM', & + itrtype = itrprog, & + ldrydep = .TRUE., & + lwetdep = .TRUE., & + density = 1450._dp, & + iaerorad = iradsoa, & + lwatsol = .TRUE., & + kappa = 0.06_dp, & !>>dod << + lburden = .TRUE., & + idx = soaprop(7)%spid_soa ) + + CASE(1) ! lump all anthropogenics into one distinct SOA species + + CALL new_species(nphase = AEROSOL, & + longname = 'Anthropogenic SOA', & + shortname = 'ASOA', & + units = 'kg kg-1', & + mw = 124._dp, & + tsubmname = 'HAM', & + itrtype = itrprog, & + ldrydep = .TRUE., & + lwetdep = .TRUE., & + density = 1450._dp, & + iaerorad = iradsoa, & + lwatsol = .TRUE., & + kappa = 0.06_dp, & !>>dod << + lburden = .TRUE., & + idx = soaprop(5)%spid_soa ) + + CASE(2) ! lump all anthropogenic SOA together with primary OC + + !! soaprop(5)%spid_soa = id_oc + + END SELECT + + !---SOA 2-product properties + + !---biogenics + ! monoterpene SOA + soaprop(1)%lvolatile = .TRUE. + !soaprop(1)%Kp = 0.0637_dp ! Presto et al EST 2005 + ! soaprop(1)%tref = 295._dp ! Presto et al EST 2005 + !soaprop(1)%Kp = 0.038 ! Griffin et al JGR 1999 + !soaprop(1)%tref = 307._dp ! Griffin et al JGR 1999 + soaprop(1)%Kp = 2.3_dp ! Saathoff et al ACPD 2008 + soaprop(1)%tref = 293.3_dp ! Saathoff et al ACPD 2008 + soaprop(1)%dH = 5.9E4_dp + + soaprop(2)%lvolatile = .TRUE. + !soaprop(2)%Kp = 0.0026_dp ! Presto et al EST 2005 + !soaprop(2)%tref = 295._dp ! Presto et al EST 2005 + !soaprop(2)%Kp = 0.326 ! Griffin et al JGR 1999 + !soaprop(2)%tref = 307._dp ! Griffin et al JGR 1999 + soaprop(2)%Kp = 0.028 ! Saathoff et al ACPD 2008 + soaprop(2)%tref = 293.3_dp ! Saathoff et al ACPD 2008 + soaprop(2)%dH = 2.4E4_dp + + ! isoprene SOA + soaprop(3)%lvolatile = .TRUE. + soaprop(3)%Kp = 0.00862 ! Henze and Seinfeld GRL 2006 + soaprop(3)%tref = 295._dp + soaprop(3)%dH = 4.2E4_dp + + soaprop(4)%lvolatile = .TRUE. + soaprop(4)%Kp = 1.62_dp ! Henze and Seinfeld GRL 2006 + soaprop(4)%tref = 295._dp + soaprop(4)%dH = 4.2E4_dp + + + !---anthropogenics according to lumping parameter + SELECT CASE(nsoalumping) + CASE(0) ! no lumping, all anthropogenics distinct + ! toluene SOA + soaprop(5)%lvolatile = .FALSE. + soaprop(5)%Kp = 0._dp + soaprop(5)%tref = 298._dp + soaprop(5)%dH = 0._dp + soaprop(5)%spid_tot = -1 + + ! xylene SOA + soaprop(6)%lvolatile = .FALSE. + soaprop(6)%Kp = 0._dp + soaprop(6)%tref = 298._dp + soaprop(6)%dH = 0._dp + soaprop(6)%spid_tot = -1 + + ! benzene SOA + soaprop(7)%lvolatile = .FALSE. + soaprop(7)%Kp = 0._dp + soaprop(7)%tref = 298._dp + soaprop(7)%dH = 0._dp + soaprop(7)%spid_tot = -1 + + nsoaspec = 7 + + CASE(1) ! lump all anthropogenics into one distinct SOA species + + soaprop(5)%lvolatile = .FALSE. + soaprop(5)%Kp = 0._dp + soaprop(5)%tref = 298._dp + soaprop(5)%dH = 0._dp + soaprop(5)%spid_tot = -1 + + nsoaspec = 5 + + CASE(2) + nsoaspec = 4 + END SELECT + + !---set species id for unused array elements to 'undefined' + IF (nsoaspec < nmaxsoa) THEN + soaprop(nsoaspec+1:nmaxsoa)%spid_tot = -1 + soaprop(nsoaspec+1:nmaxsoa)%spid_soa = -1 + END IF + + !---count the number of non-volatile species (needed by soa2prod and soa_part + ! see mo_ham_soa_processes). + nnvol = 0 + DO i=1,nsoaspec + IF (.NOT. soaprop(i)%lvolatile) nnvol = nnvol + 1 + END DO + + IF (nsoalumping == 2) nnvol = 1 + + END SUBROUTINE soa_species + + !----------------------------------------------------------------------------------------------- + + SUBROUTINE start_soa_aerosols(nmod, lsoainclass) + + USE mo_ham, ONLY: new_aerocomp + USE mo_species, ONLY: speclist + + IMPLICIT NONE + + INTEGER, INTENT(in) :: nmod + LOGICAL, INTENT(in) :: lsoainclass(nmod) + + !---local data: + INTEGER :: jn, jm, ispec + + !---executable procedure + + DO jn = 1,nmod + IF (lsoainclass(jn)) THEN + + DO jm=1,nsoaspec + + ispec = soaprop(jm)%spid_soa + + !---allocate memory for the aerosol phase tracers + IF (.NOT. ALLOCATED(speclist(ispec)%iaerocomp) ) THEN + ALLOCATE(speclist(ispec)%iaerocomp(nmod)) + speclist(ispec)%iaerocomp(:) = 0 + END IF + + speclist(ispec)%iaerocomp(jn) = new_aerocomp(jn, ispec, speclist(ispec)%itrtype) + END DO + END IF + END DO + + END SUBROUTINE start_soa_aerosols + !----------------------------------------------------------------------------------------------- + + !----------------------------------------------------------------------------------------------- + SUBROUTINE construct_soa_streams + + ! adds input and diagnostic output streams for SOA + ! called from: call_submodels + + ! Author: + ! Declan O'Donnell, MPI-M, 2007 + + !---inherited types, functions and data --- + USE mo_memory_base, ONLY: new_stream, default_stream_setting, add_stream_element, add_stream_reference + USE mo_linked_list, ONLY: t_stream, SURFACE + USE mo_filename, ONLY: trac_filetype + + IMPLICIT NONE + + !--- subroutine interface --- + ! - + + !--- Local data --- + TYPE(t_stream), POINTER :: stream_soa + + !--- executable procedure --- +!++mgs ### Open a new soa stream (disentangling) + CALL new_stream(stream_soa, 'soadiag', filetype=trac_filetype) + + !---diagnostics + CALL default_stream_setting (stream_soa, units='kg m-2 s-1', lrerun=.TRUE., laccu=.TRUE., & + lpost=.TRUE., leveltype=SURFACE ) + + !>>dod redmine #113 + !--- Add standard fields for post-processing: + CALL add_stream_reference (stream_soa, 'geosp' ,'g3b', lpost=.TRUE.) + CALL add_stream_reference (stream_soa, 'lsp' ,'sp', lpost=.TRUE.) + CALL add_stream_reference (stream_soa, 'aps' ,'g3b', lpost=.TRUE.) + CALL add_stream_reference (stream_soa, 'gboxarea','geoloc', lpost=.TRUE.) + !< +!! \filename +!! mo_ham_species.f90 +!! +!! \brief +!! mo_ham_species assigns identities and properties to species in the HAM model +!! +!! \author Declan O'Donnell (MPI-Met) +!! +!! \responsible_coder +!! Declan O'Donnell, declan.Odonnell@fmi.fi +!! +!! \revision_history +!! -# Declan O'Donnell (MPI-Met) - original code (2008) +!! -# K. Zhang (MPI-Met) - seperate species list for ham; new_species (2009-07) +!! +!! \limitations +!! None +!! +!! \details +!! None +!! +!! \bibliographic_references +!! None +!! +!! \belongs_to +!! HAMMOZ +!! +!! SPDX-License-Identifier: BSD-3-Clause +!! Copyright (c) 2021 hammoz + +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +MODULE mo_ham_species + + !--- inherited types, data and functions + USE mo_kind, ONLY: dp + USE mo_tracdef, ONLY: jptrac + USE mo_species, ONLY: t_species + + + IMPLICIT NONE + + !--- public member functions + + PUBLIC :: ham_species + + !--- public module data + + + ! Maximum number of species in the model + INTEGER, PARAMETER, PUBLIC :: nmaxspec = 100 + + ! tracer request types + INTEGER, PARAMETER, PUBLIC :: inotr = 0 ! request no tracer + INTEGER, PARAMETER, PUBLIC :: idiagtr = 1 ! request a diagnostic (not transported) tracer + INTEGER, PARAMETER, PUBLIC :: iprogtr = 2 ! request a prognostic (transported) tracer + + ! ### keys to refractive index tables now in mo_ham_rad_data + + ! basic HAM model, gas phase compounds + INTEGER, PUBLIC :: id_dms, & ! Dimethyl sulphide + id_so2, & ! Sulphur dioxide + id_so4g, & ! Sulphate (gas) + id_oh, & ! Hydroxyl radical + id_h2o2, & ! Hydrogen Peroxide + id_o3, & ! Ozone + id_no2, & ! Nitrogen dioxide +!gf see #146 + id_no3!, & ! Nitrate radical +!gf + !id_ocnv ! Organic carbon (gas) !eehol: leave this out + + ! basic HAM model, aerosol phase compounds + INTEGER, PUBLIC :: id_so4, & ! Sulphate (aerosol) + id_bc, & ! Black carbon + id_oc, & ! Organic carbon + id_ss, & ! Sea Salt + id_du, & ! Dust + id_wat ! Aerosol water + + ! Number of model species + INTEGER, PUBLIC :: ham_nspec ! number of species in HAM + INTEGER, PUBLIC :: ham_naerospec ! number of aerosol species in HAM + + ! Model species. These arrays are overdimensioned: the sum of defined species + ! (gas plus aerosol) shall not exceed nmaxspec + TYPE(t_species), PUBLIC, ALLOCATABLE, TARGET :: ham_aerospec(:) + + + + CONTAINS + + + + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! Register ham gas and aerosol species (except for SOA) +!! +!! @author +!! D. O'Dannel (MPI-Met) +!! K. Zhang (MPI-Met) +!! +!! $Id: 1423$ +!! +!! @par Revision History +!! D. O'Dannel (MPI-Met) - original version - (2008-??) +!! K. Zhang (MPI-Met) - seperate species list for ham - (2009-07) +!! +!! @par This subroutine is called by +!! to-be-filled +!! +!! @par Externals: +!!
    +!!
  1. new_species +!!
+!! +!! @par Notes +!! +!! @par Responsible coder +!! kai.zhang@zmaw.de +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + SUBROUTINE ham_species + + !---inherited types, data and functions + USE mo_ham, ONLY: nham_subm, HAM_SALSA, HAM_M7 + USE mo_submodel, ONLY: lham + USE mo_tracdef, ONLY: GAS, AEROSOL, GAS_OR_AEROSOL, itrprog, itrpresc, itrnone + USE mo_species, ONLY: new_species + USE mo_ham_rad_data, ONLY: iradso4, iradbc, iradoc, iradss, iraddu, iradwat +!gf + USE mo_ham, ONLY: mw_so2, mw_so4, mw_dms +!gf + + IMPLICIT NONE + + !--- executable procedure ---- + + !--------- 0. Initialisations + + !--- instantiate the model species. start with the gas phase + IF (lham) THEN + + !--------- 1. Dimethyl Sulphide (DMS) + ! + + CALL new_species(nphase = GAS, & + longname = 'Dimethyl sulphide', & + shortname = 'DMS', & + units = 'kg kg-1', & +!gf mw = 62.019_dp, & + mw = mw_dms, & + tsubmname = 'HAM', & + itrtype = itrprog, & + ldrydep = .FALSE., & + lwetdep = .FALSE., & + henry = (/ 0.54_dp, 3460._dp /), & !csld(#275) + idx = id_dms ) + + !--------- 2. Sulphur Dioxide + ! + + CALL new_species(nphase = GAS, & + longname = 'Sulphur Dioxide', & + shortname = 'SO2', & + units = 'kg kg-1', & +!gf mw = 63.692_dp, & + mw = mw_so2, & + tsubmname = 'HAM', & + itrtype = itrprog, & + ldrydep = .TRUE., & + lwetdep = .TRUE., & + dryreac = 0._dp, & + henry = (/ 1.36_dp, 4250._dp /), & !csld(#275) + idx = id_so2 ) + + + !--------- 4. Hydroxyl Radical + ! + + CALL new_species(nphase = GAS, & + longname = 'Hydroxyl radical', & + shortname = 'OH', & + units = 'VMR', & + mw = 17.003_dp, & + tsubmname = 'HAM', & + itrtype = itrnone, & !gf #57 + ldrydep = .FALSE., & + lwetdep = .FALSE., & + dryreac = 0._dp, & + henry = (/ 39._dp, 0._dp /), & !csld(#275) + idx = id_oh ) + + !--------- 5. Hydrogen Peroxide + ! + + CALL new_species(nphase = GAS, & + longname = 'Hydrogen peroxide', & + shortname = 'H2O2', & + units = 'VMR', & + mw = 34.005_dp, & + tsubmname = 'HAM', & + itrtype = itrnone, & !gf #57 + ldrydep = .FALSE., & + lwetdep = .FALSE., & + dryreac = 1._dp, & + henry = (/ 8.44E4_dp, 7600._dp /), & !csld(#275) + idx = id_h2o2 ) + + !--------- 6. Ozone + ! + + CALL new_species(nphase = GAS, & + longname = 'Ozone', & + shortname = 'O3', & + units = 'VMR', & + mw = 48.0_dp, & + tsubmname = 'HAM', & + itrtype = itrnone, & !gf #57 + ldrydep = .FALSE., & + lwetdep = .FALSE., & + dryreac = 1._dp, & + henry = (/ 1.03E-2_dp, 2830._dp /), & !csld(#275) + idx = id_o3 ) + + !--------- 7. Nitrogen Dioxide + ! + + CALL new_species(nphase = GAS, & + longname = 'Nitrogen dioxide', & + shortname = 'NO2', & + units = 'VMR', & + mw = 46.006_dp, & + tsubmname = 'HAM', & + itrtype = itrnone, & !gf #57 + ldrydep = .FALSE., & + lwetdep = .FALSE., & + dryreac = 1._dp, & + henry = (/ 1.2E-2_dp, 2360._dp /), & !csld(#275) + idx = id_no2 ) +!gf see #146 + + !--------- 8. Nitrate radical + ! + + CALL new_species(nphase = GAS, & + longname = 'Nitrate radical', & + shortname = 'NO3', & + units = 'VMR', & + mw = 62.049_dp, & + tsubmname = 'HAM', & + itrtype = itrnone, & !gf #57 + ldrydep = .FALSE., & + henry = (/ 3.8E-2_dp, 0._dp /), & !csld(#275) + lwetdep = .FALSE., & + idx = id_no3 ) + +!gf + + !--------- 3.a Gas phase sulphate + ! (sulphate can be present in both the gas-phase and the aerosol phase) + ! density here is that of H2SO4 +!>>DT + CALL new_species(nphase = GAS, & + longname = 'Sulphuric acid', & + shortname = 'H2SO4', & + units = 'kg kg-1', & + mw = mw_so4, & + tsubmname = 'HAM', & + itrtype = itrprog, & + ldrydep = .TRUE., & + lwetdep = .TRUE., & + henry = (/ 1.3e15_dp, 20000._dp /), & !SF #571 + dryreac = 0._dp, & + idx = id_so4g ) +!<
>DT + CALL new_species(nphase = AEROSOL, & + longname = 'Sulphate', & + shortname = 'SO4', & + units = 'kg kg-1', & + mw = mw_so4, & + tsubmname = 'HAM', & + itrtype = itrprog, & + ldrydep = .TRUE., & + lwetdep = .TRUE., & + density = 1841._dp, & + iaerorad = iradso4, & + lwatsol = .TRUE., & + lelectrolyte = .TRUE., & + nion = 2, & + osm = 1._dp, & + kappa = 0.60_dp, & + lburden = .TRUE., & + idx = id_so4 ) +!<
>dod<< + ldrydep = .TRUE., & + lwetdep = .TRUE., & + idx = id_ss ) + + + !--------- 12. Mineral Dust + ! + + CALL new_species(nphase = AEROSOL, & + longname = 'Dust', & + shortname = 'DU', & + units = 'kg kg-1', & + mw = 250._dp, & + tsubmname = 'HAM', & + itrtype = itrprog, & + density = 2650._dp, & + iaerorad = iraddu, & + lwatsol = .FALSE., & + ldrydep = .TRUE., & + lwetdep = .TRUE., & + idx = id_du ) + + + !--------- 13. Water (includes only water on aerosols, not water vapour, cloud water or cloud ice) + ! + + CALL new_species(nphase = AEROSOL, & + longname = 'Aerosol water', & + shortname = 'WAT', & + units = 'kg kg-1', & + mw = 18.0_dp, & + tsubmname = 'HAM', & + itrtype = itrprog, & + density = 1000._dp, & + iaerorad = iradwat, & + lwatsol = .TRUE., & + lemis = .FALSE., & + ldrydep = .FALSE., & + lwetdep = .FALSE., & + idx = id_wat ) + + + !--------- end of basic model aerosol phase species + END IF + END SUBROUTINE ham_species + +END MODULE mo_ham_species + diff --git a/ifs-source/arpifs/phys_ec/mo_ham_subm.F90 b/ifs-source/arpifs/phys_ec/mo_ham_subm.F90 new file mode 100755 index 00000000..3ad98a40 --- /dev/null +++ b/ifs-source/arpifs/phys_ec/mo_ham_subm.F90 @@ -0,0 +1,794 @@ +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! \filename +!! mo_ham_subm.f90 +!! +!! \brief +!! Module to provide interface to the aerosol microphysics schemes +!! +!! \author Martin G. Schultz (FZ Juelich) +!! +!! \responsible_coder +!! Sylvaine Ferrachat, sylvaine.ferrachat@env.ethz.ch +!! +!! \revision_history +!! -# The original code is from J. Feichter, J. Wilson and E. Vignatti, JRC Ispra +!! and was adapted for ECHAM by P. Stier, Oxford. Other contributions include +!! D. O'Donnell, K. Zhang and others +!! -# M.G. Schultz (FZ Juelich) - new code structure for integration into echam6-hammoz (2009-09-24) +!! -# T. Bergman (FMI) - nmod->nclass to facilitate new aerosol models (2013-02-05) +!! -# H. Kokkola (FMI) - generalization to include also SALSA aerosol microphysics (2014) +!! +!! \limitations +!! None +!! +!! \details +!! This module contains the ham_subm_interface routine and common routines +!! for aerosol microphysics interfaces. +!! This module contains the following subroutines which used to be individual files. +!! ham_subm_interface +!! subm_mass_sum +!! +!! \belongs_to +!! HAMMOZ +!! +!! SPDX-License-Identifier: BSD-3-Clause +!! Copyright (c) 2021 hammoz + +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +MODULE mo_ham_subm + +IMPLICIT NONE + +PRIVATE + +PUBLIC :: ham_subm_interface + + +CONTAINS + +! --------------------------------------------------------------------------- +! ham_subm_interface: called from mo_submodel_interface +! --------------------------------------------------------------------------- + +SUBROUTINE ham_subm_interface(kproma, kbdim, klev, krow, ktrac, & + pap, paph, & + pt, pq, pqs, & + pxtm1, pxtte, & + pm6rp, pm6dry, prhop, pww, & + paclc, pgrvolm1, ppbl,zout3) + ! + ! Authors: + ! -------- + ! + ! 1997 J. Feichter and J. Wilson (original code) + ! 2000 J. Feichter and E. Vignati (adopted to m7) + ! 2001 P. Stier + ! 2008 J. Kazil + ! - Ionization rate calculation + ! - Changed m7 interface and call + ! - Extended comments + ! 2008 D.O'Donnell, MPI-Met, Hamburg + ! - generalisation of the species (no more hardcoded so4, bc, oc, etc.) + ! - added sizeclass and new modules, removed dependency on mo_ham_m7_trac, + ! 2009 Kai Zhang, MPI-Met, Hamburg + ! - submodel interface + ! 2013 Harri Kokkola, FMI, Kuopio + ! - implementation of SALSA microphysics + ! - M7 microphysics routines separated to mo_ham_m7 + ! + ! + ! Method: + ! ------- + ! + ! The interface takes the tracer mixing ratios of the at the time t-dt, adds + ! the tendencies (pxtte) of the preceeding processes, converts the units, + ! calculates ambient and auxiliary quantities, and hands the appropriate + ! quantities to microphysics modules. A mass conservation check is performed + ! (before and after calling the microphysics) if requested. + ! + ! After the call of microfysical module, the returning concentrations are + ! reconverted to mixing ratios, the tendencies of the mixing ratios are + ! calculated and returned to ECHAM. + + USE mo_kind, ONLY: dp + USE mo_physical_constants, ONLY: rd, vtmpc1, grav, avo, argas + USE mo_time_control, ONLY: time_step_len + !USE mo_echam_convect_tables, ONLY: tlucuaw, jptlucu1, jptlucu2 !eehol: removed ECHAM dependency + USE mo_exception, ONLY: finish, message, message_text, em_warn + USE mo_species, ONLY: speclist +#ifdef HAMMOZ + USE mo_ham, ONLY: lgcr, nsolact +#endif + USE mo_ham, ONLY: subm_ngasspec, subm_gasspec, subm_gasunitconv, & + subm_naerospec, subm_aerospec, subm_aerounitconv, & + subm_aero_idx, & + immr2ug, immr2molec, ivmr2molec + USE mo_ham_subm_species, ONLY: isubm_so4g, isubm_ocnv + USE mo_ham, ONLY: naerocomp, aerocomp, aerowater, mw_so4, mw_oc, & + sizeclass, nclass, & + nham_subm, & + HAM_BULK, & + HAM_M7, & + HAM_SALSA, nsol!, & + USE mo_tracer_processes, ONLY: xt_borrow +#ifdef HAMMOZ + USE mo_ham, ONLY: lmass_diag + USE mo_ham_streams, ONLY: rdry, rwet, densaer, relhum, ipr + USE mo_ham_gcrion, ONLY: solar_activity,gcr_ionization + !>>dod timers + USE mo_control, ONLY: ltimer + USE mo_hammoz_timer, ONLY: timer_start, timer_stop, timer_ham_m7_main +#endif +#ifdef SALSA + USE mo_ham_salsa, ONLY: salsa +#endif + USE mo_ham_m7, ONLY: m7 + USE mo_ham_m7ctl, ONLY: iaits,iaccs + + !<>dod changed index to naerospec + REAL(dp):: zmass_pre(subm_naerospec), & ! mass of aerosol compounds before and + zmass_post(subm_naerospec) ! after microphysics call, for mass conservation check + !<>dod soa + REAL(dp) :: zgas(kbdim,klev,subm_ngasspec) + REAL(dp) :: zunitfac, zqunitfac, zfac1 + !<>dod from array + LOGICAL :: labort + !<>dod + labort = .FALSE. + !< physc) + zrhoa(jl,jk) = pap(jl,jk)/(pt(jl,jk)*rd*(1._dp+vtmpc1*pq(jl,jk))) + !--- 2.2) New calculation of the relative humidity (over water): + + !-->eehol: these are not needed as saturation spec. hum. comes as an input + !it = NINT(pt(jl,jk)*1000._dp) + !it = MAX(MIN(it,jptlucu2),jptlucu1) + + !zqs = tlucuaw(it)/pap(jl,jk) + !zqs = MIN(zqs,0.5_dp) + !zqs = zqs/(1._dp-vtmpc1*zqs) + !<--eehol + zqs = pqs(jl,jk) !eehol: read zqs from input sat. spec. hum + + zaclc = MIN(paclc(jl,jk),1.0_dp-zeps) + + zq_amb = MAX( 0.0_dp , (pq(jl,jk)-zqs*zaclc)/(1._dp-zaclc) ) + + !zrh(jl,jk) = zq_amb/zqs + zrh(jl,jk) = pq(jl,jk)/zqs !changed to same as OIFS + + zrh(jl,jk) = MAX(0.0_dp,MIN(zrh(jl,jk),1.0_dp)) + + !--- Air mass auxiliary variable: + + zdpg(jl,jk) = (paph(jl,jk+1)-paph(jl,jk))/grav + + !--- Layer thickness zdz = dp/(rho*grav) [m]: + + zdz(jl,jk) = zdpg(jl,jk)/zrhoa(jl,jk) + + END DO + + !ham_ps:changed position to suppress loop-fusion on NEC-SX6 +#ifdef HAMMOZ + relhum(1:kproma,jk,krow) = zrh(1:kproma,jk) +#endif + END DO + +#ifdef HAMMOZ + !--- 2.3) Ionization rate + ! + + IF (lgcr) then + + !--- Solar activity: + + IF (abs(nsolact) > 1.0_dp) then + ! Parameterize solar activity as function of the current date: + zsolact = solar_activity() + ELSE + ! Use solar activity parameter set by user: + zsolact = nsolact + ENDIF + + !--- Galactic cosmic ray ionization rate: + + CALL gcr_ionization(krow,kproma,kbdim,klev,zsolact,pt,pap,zipr) + + !--- Save the ionization rate: + + ipr(1:kproma,1:klev,krow) = 1.0e6_dp*zipr(1:kproma,1:klev) + + ENDIF +#endif + !--- 3) Convert units and add the tendencies of preceeding proceses: --------- + ! Convert: +!!mgs(S)!! ! - mass of sulfur species from [mass(S)/mass(air)] +!!mgs(S)!! ! to [molecules/cm+3] + ! - mass of sulfur species from [mass(SO4)/mass(air)] + ! - mass of all other species to micro-gram/cubic-meter + ! - particle numbers are converted from [N/kg(air)] to [N/cm+3] + ! + !--- 3.1) Gases: + +!++mgs: Note that logic changed here - looping only over subm_gasspec !! +!! this is equivalent to the former "IF (gasspec(jn)%lm7gas) THEN" +!! the former "gasspec(jn)%m7unitconv" is now replaced with subm_gasunitconv(jn) +!--mgs +!++mgs: initialize zgso4p1 + zgso4p1(:,:) = 0._dp + + DO jn=1,subm_ngasspec + jt = speclist(subm_gasspec(jn))%idt + + SELECT CASE(subm_gasunitconv(jn)) + CASE(immr2ug) + DO jk=1,klev + DO jl=1,kproma + zunitfac = zfac*zrhoa(jl,jk) + zgas(jl,jk,jn) = zunitfac*(pxtm1(jl,jk,jt)+pxtte(jl,jk,jt)*ztmst) + END DO + END DO + + CASE(immr2molec) + DO jk=1,klev + DO jl=1,kproma + ! >> thk #513 + zunitfac = 1e-3*zrhoa(jl,jk)*avo/speclist(subm_gasspec(jn))%moleweight + ! << thk + zgas(jl,jk,jn) = zunitfac*(pxtm1(jl,jk,jt)+pxtte(jl,jk,jt)*ztmst) + END DO + END DO + + !---need gas phase SO4 tendency for Jan Kazil's SO4 condensation scheme + IF (jn == isubm_so4g) THEN + DO jk=1,klev + DO jl=1,kproma + zunitfac = zfacm*zrhoa(jl,jk) + zgso4m1(jl,jk) = zunitfac*pxtm1(jl,jk,jt) + zdgso4(jl,jk) = zunitfac*pxtte(jl,jk,jt) + zgso4p1(jl,jk) = zgso4m1(jl,jk)+zdgso4(jl,jk)*time_step_len + END DO + END DO + END IF + + CASE(ivmr2molec) + DO jk=1,klev + DO jl=1,kproma + zunitfac = zfac_vmr*pap(jl,jk)/pt(jl,jk) + zgas(jl,jk,jn) = zunitfac*(pxtm1(jl,jk,jt)+pxtte(jl,jk,jt)*ztmst) + END DO + END DO + END SELECT + + END DO + + !--- 3.2 Particle mass: + + DO jn=1, naerocomp + jt = aerocomp(jn)%idt ! get tracer id + jspec = aerocomp(jn)%spid ! get species id + jl = subm_aero_idx(jspec) ! get index to subm_aerospec list + !!mgs=old code!! IF (aerocomp(jn)%species%m7unitconv == immr2molec) THEN + IF (jl <= 0) THEN +#ifdef HAMMOZ + WRITE(message_text,*) 'SUBM_AERO_IDX Mapping error !! No index for jspec=',jspec +#endif + CALL finish('ham_subm_interface', message_text) + END IF + IF (subm_aerounitconv(jl) == immr2molec) THEN + zfac1 = zfacm + ELSE + zfac1 = zfac + END IF + zaerml(1:kproma,:,jn) = zfac1*zrhoa(1:kproma,:)*(pxtm1(1:kproma,:,jt) + pxtte(1:kproma,:,jt)*ztmst) + + END DO + + !--- 3.3) Particle numbers: + + DO jn=1, nclass + jt = sizeclass(jn)%idt_no + zaernl(1:kproma,:,jn) = zfacn*zrhoa(1:kproma,:)*(pxtm1(1:kproma,:,jt)+pxtte(1:kproma,:,jt)*ztmst) + !zout3(kidia:kproma,1:klev,jn) = zaernl(1:kproma,1:klev,jn) +! write(3334,*)jt,'NUM',sizeclass(jn)%shortname,jn + + END DO + !<>dod moved to separate subroutine + + IF (lmass_diag) CALL subm_mass_sum(kbdim, kproma, klev, krow, zgas, zaerml, zdpg, zmass_pre) + !<>dod timers + IF (ltimer) CALL timer_start(timer_ham_m7_main) + !<>dod timers + IF (ltimer) CALL timer_stop(timer_ham_m7_main) + !<>dod again special handling for so4 gas for Jan Kazil's SO4 condensation scheme + + zgas(1:kproma,:, isubm_so4g) = zgso4(1:kproma,:) +#ifdef SALSA + CASE(HAM_SALSA) + + ! Number concentration converted from cm-3 to m-3 for SALSA + zaernl(1:kproma,:,:) = zaernl(1:kproma,:,:) * 1.e6_dp + + ! >> thk: adapting for VBS + ! Gas phase concentrations converted from cm-3 to m-3 for SALSA + zgas(1:kproma,:,:) = zgas(1:kproma,:,:) * 1.e6_dp + + CALL salsa(kproma, kbdim, klev, krow, & ! ECHAM indices + pap, zrh, pt, ztmst,& ! Pressure, RH, temperature, time step length + !zgso4, zgocnv, zgocsv, & ! [H2SO4(g)], [OCNV(g)], [OCSV(g)] + zgas, & ! gas phase concentrations + zaerml, zaernl, & ! Aerosol volume and number + zm6rp, zm6dry, zrhop, zww, & ! Aerosol properties + ppbl & + ) ! Planetary boundary layer top level + + ! Number concentration converted from m-3 to cm-3 for compatibility with M7 + zaernl(1:kproma,:,:) = zaernl(1:kproma,:,:) * 1.e-6_dp + + ! Gas phase concentrations converted from m-3 to cm-3 for compatibility with M7 + zgas(1:kproma,:,:) = zgas(1:kproma,:,:) * 1.e-6_dp + ! << thk +#endif + END SELECT + + !--- 5) Reconvert masses and numbers into mixing ratios, other --------------- + ! quantities to SI units and calculate the tendencies (xtte): + ! + !>>dod soa + !---5.1) Gases +!++mgs: changes to replace gasspec and m7unitconv (see above) + DO jn = 1,subm_ngasspec + jt=speclist(subm_gasspec(jn))%idt + + SELECT CASE(subm_gasunitconv(jn)) + CASE(immr2ug) + DO jk=1,klev + DO jl=1,kproma + zqunitfac = zqfac/zrhoa(jl,jk) + pxtte(jl,jk,jt) = (zgas(jl,jk,jn)*zqunitfac-pxtm1(jl,jk,jt))*zqtmst + END DO + END DO + + CASE(immr2molec) + DO jk=1,klev + DO jl=1,kproma + ! >> thk #513 + zqunitfac = 1e3*speclist(subm_gasspec(jn))%moleweight/(avo*zrhoa(jl,jk)) + ! << thk + pxtte(jl,jk,jt) = (zgas(jl,jk,jn)*zqunitfac-pxtm1(jl,jk,jt))*zqtmst + END DO + END DO + END SELECT + +!>>csld #538 +! csld : A more elegant way to resolve this bug could be to define an extra case +! for h2so4 (subm_gasunitconv(jn)). Another alternative would be to do the back unit conversion +! inside the HAM_M7 case. +! I let this cosmetic issue for the moment. + IF ((nham_subm == HAM_M7) .AND. (jn == isubm_so4g)) THEN + DO jk=1,klev + DO jl=1,kproma + zqunitfac = zqfacm/zrhoa(jl,jk) + pxtte(jl,jk,jt) = (zgas(jl,jk,jn)*zqunitfac-pxtm1(jl,jk,jt))*zqtmst + END DO + END DO + END IF +!< rdry(jclass)%ptr + rwet_p => rwet(jclass)%ptr + densaer_p => densaer(jclass)%ptr + + !--- Mean mode density from [g/cm3] to [kg/m3]: + densaer_p(1:kproma,:,krow) = zrhop(1:kproma,:,jclass)*1.E3_dp + + !--- Ambient Count Median Radius from [cm] to [m]: + + rwet_p(1:kproma,:,krow) = zm6rp(1:kproma,:,jclass)/100._dp + + !--- Dry Count Median Radius from [cm] to [m]: + + IF (jclass <= nsol .AND. nham_subm == HAM_M7) THEN + rdry_p(1:kproma,:,krow) = zm6dry(1:kproma,:,jclass)/100._dp + ELSE IF (nham_subm == HAM_SALSA) THEN + !--> thk: addition to bugfix #756 + !rdry_p(1:kproma,:,krow) = zm6rp(1:kproma,:,jclass)/100._dp + rdry_p(1:kproma,:,krow) = zm6dry(1:kproma,:,jclass)/100._dp + !<--thk + END IF + + END DO +#endif + !--- Store diagnostic aerosol properties in pseudo-tracers: + !>>dod soa + DO jn=1,nsol + pxtm1(1:kproma,:,aerowater(jn)%idt)=zww(1:kproma,:,jn)/zrhoa(1:kproma,:) + END DO + !<>dod soa rewritten to avoid hardcoding of individual species + DO jc=1,subm_naerospec + + IF( ABS(zmass_pre(jc)-zmass_post(jc)) > 0.100_dp*ABS(MAX(zmass_pre(jc),zmass_post(jc)))) THEN + + CALL message('ham_subm_interface', 'microphysics module violates mass conservation by >10% for '// & + speclist(subm_aerospec(jc))%longname, level=em_warn) + + labort=.TRUE. + + ELSE IF( ABS(zmass_pre(jc)-zmass_post(jc)) > 0.010_dp*ABS(MAX(zmass_pre(jc),zmass_post(jc)))) THEN + + CALL message('ham_subm_interface', 'microphysics module violates mass conservation by >1% for '// & + speclist(subm_aerospec(jc))%longname) + + ELSE IF( ABS(zmass_pre(jc)-zmass_post(jc)) > 0.001_dp*ABS(MAX(zmass_pre(jc),zmass_post(jc)))) THEN + + CALL message('ham_subm_interface', 'microphysics module violates mass conservation by >0.1% for '// & + speclist(subm_aerospec(jc))%longname) + END IF + + END DO + + END IF +#endif + +END SUBROUTINE ham_subm_interface + +#ifdef HAMMOZ +! --------------------------------------------------------------------------- + +SUBROUTINE subm_mass_sum(kbdim, kproma, klev, krow, pgas, paerml, pdpg, pmasssum) + + ! Purpose: sum the total mass per species over the gridpoints on one processor + ! This subroutine is called if the namelist variables nsoa == 1 and lomassdiag == .TRUE. + ! It is called twice, from ham_subm_interface, once before and once after the + ! microphysical processes have been calculated. + ! It tests the total mass and throws an exception if mass conservation is violated + + !---inherited functions, types and data + USE mo_kind, ONLY: dp + USE mo_ham, ONLY: naerocomp, aerocomp, nsoa, nsoaspec, nham_subm, HAM_SALSA + USE mo_ham, ONLY: subm_ngasspec, subm_naerospec + USE mo_ham_subm_species, ONLY: isubm_so2, isubm_so4, isubm_so4g, isubm_oc, isubm_ocnv + USE mo_geoloc, ONLY: gboxarea_2d + USE mo_ham_soa, ONLY: soaprop + + IMPLICIT NONE + + !---subroutine interface + INTEGER, INTENT(IN) :: kbdim, kproma, klev, krow ! grid parameters + REAL(dp), INTENT(IN) :: pgas(kbdim,klev,subm_ngasspec) ! gas concentrations + REAL(dp), INTENT(IN) :: paerml(kbdim,klev,naerocomp) ! aerosol concentrations + REAL(dp), INTENT(IN) :: pdpg(kbdim,klev) ! air mass auxiliary variable + REAL(dp), INTENT(OUT) :: pmasssum(subm_naerospec) ! total mass + + !---Local data + ! Parameters: + ! - + ! Local variables + REAL(dp) :: zarea(kbdim) ! gridbox area + INTEGER :: jspec ! species index + INTEGER :: jl, jk, jn, jm ! loop counter + + + !---executable procedure + pmasssum(:) = 0._dp + zarea(1:kproma) = gboxarea_2d(1:kproma,krow) + +!!mgs(S)!!: ### update needed to obtain correct mass?? + + !---sum aerosol masses per species + DO jn=1,naerocomp + !---get species index + jspec = aerocomp(jn)%spid + + DO jk=1,klev + DO jl=1,kproma + pmasssum(jspec) = pmasssum(jspec) + paerml(jl,jk,jn)*pdpg(jl,jk)*zarea(jl) + END DO + END DO + + END DO + + !---sulphate: add SO2 and gas phase SO4 + DO jk=1,klev + DO jl=1,kproma + pmasssum(isubm_so4) = pmasssum(isubm_so4) + (pgas(jl,jk,isubm_so2)+pgas(jl,jk,isubm_so4g)) * & + pdpg(jl,jk)*zarea(jl) + END DO + END DO + + !---SOA.... + IF (nsoa == 1) THEN + DO jm=1,nsoaspec + IF (soaprop(jm)%lvolatile) THEN + !---gas species index + jspec = soaprop(jm)%spid_soa + + DO jk=1,klev + DO jl=1,kproma + pmasssum(jspec) = pmasssum(jspec)+pgas(jl,jk,jspec)*pdpg(jl,jk)*zarea(jl) + END DO + END DO + + END IF + END DO + + END IF + + END SUBROUTINE subm_mass_sum + ! + !******************************************************************************* + ! +#endif + +END MODULE mo_ham_subm diff --git a/ifs-source/arpifs/phys_ec/mo_ham_subm_species.F90 b/ifs-source/arpifs/phys_ec/mo_ham_subm_species.F90 new file mode 100644 index 00000000..53dfcd42 --- /dev/null +++ b/ifs-source/arpifs/phys_ec/mo_ham_subm_species.F90 @@ -0,0 +1,241 @@ +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! \filename +!! mo_ham_subm_species.f90 +!! +!! \brief +!! Species mapping from ECHAM species list to condensed gas-phase and aerosol lists in M7 +!! +!! \author Martin G. Schultz (FZ Juelich) +!! +!! \responsible_coder +!! Martin G. Schultz, m.schultz@fz-juelich.de +!! +!! \revision_history +!! -# Martin G. Schultz (FZ Juelich) - original code (2009-10) +!! -# Harri Kokkola (FMI) - Implementation of SALSA aerosol microphysics model (2014) +!! +!! \limitations +!! None +!! +!! \details +!! None +!! +!! \bibliographic_references +!! None +!! +!! \belongs_to +!! HAMMOZ +!! +!! SPDX-License-Identifier: BSD-3-Clause +!! Copyright (c) 2021 hammoz + +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +MODULE mo_ham_subm_species + + IMPLICIT NONE + + PRIVATE + + PUBLIC :: map_ham_subm_species + + PUBLIC :: isubm_so2, isubm_so4g, isubm_oc, isubm_ocnv, isubm_so4, isubm_wat + + + !-- species indices for microphysics routines + INTEGER :: isubm_so2, isubm_so4g, isubm_oc, isubm_ocnv, isubm_so4, isubm_wat + + ! >> thk: volatility basis set (VBS) + INTEGER :: isubm_bc, isubm_ss, isubm_du + ! << thk + + CONTAINS + +! --------------------------------------------------------------------------- +! map_ham_subm_species: construct condensed species lists for M7 gas phase and +! aerosol species from the general speclist +! --------------------------------------------------------------------------- + +SUBROUTINE map_ham_subm_species + + USE mo_species, ONLY: nspec, speclist + USE mo_ham, ONLY: nsoa, nsoaspec, nham_subm, HAM_SALSA + USE mo_ham_species, ONLY: id_so2, id_so4g, &!, id_ocnv, &!eehol: deleted id_ocnv + id_so4, id_bc, id_oc, id_ss, id_du, id_wat + USE mo_ham_soa, ONLY: soaprop + USE mo_ham, ONLY: immr2molec, ivmr2molec, immr2ug, & + subm_ngasspec, subm_gasspec, subm_naerospec, subm_aerospec, & + subm_naerospec_nowat, subm_aerospec_nowat + USE mo_exception, ONLY: message, message_text, em_info, em_param + USE mo_util_string, ONLY: separator +#ifdef HAMMOZ + USE mo_ham_vbsctl, ONLY: vbs_nvocs, vbs_voc_prec, vbs_ngroup, & + vbs_set, laqsoa,aqsoa_ngroup, aqsoa_set +#endif + INTEGER :: jt, jm, jb, jv + + + DO jt = 1, nspec + IF (jt == id_so2) CALL new_subm_gasspec(id_so2, immr2molec, isubm_so2) + IF (jt == id_so4g) CALL new_subm_gasspec(id_so4g, immr2molec, isubm_so4g) + !eehol: id_ocnv not used anymore + !IF(nham_subm == HAM_SALSA) THEN + ! IF (jt == id_ocnv) CALL new_subm_gasspec(id_ocnv, immr2molec, isubm_ocnv) + !END IF + + IF (jt == id_so4) CALL new_subm_aerospec(id_so4, immr2molec, isubm_so4) + IF (jt == id_bc) CALL new_subm_aerospec(id_bc, immr2ug, isubm_bc) + IF (jt == id_oc) CALL new_subm_aerospec(id_oc, immr2ug, isubm_oc) + IF (jt == id_ss) CALL new_subm_aerospec(id_ss, immr2ug, isubm_ss) + IF (jt == id_du) CALL new_subm_aerospec(id_du, immr2ug, isubm_du) + IF (jt == id_wat) CALL new_subm_aerospec(id_wat, immr2ug, isubm_wat) + + SELECT CASE (nsoa) + CASE(1) + + DO jm = 1,nsoaspec + IF (jt == soaprop(jm)%spid_soa) CALL new_subm_aerospec(soaprop(jm)%spid_soa, immr2ug) + END DO +#ifdef HAMMOZ + CASE(2) !thk: VBS + + DO jb = 1, vbs_ngroup + IF (jt == vbs_set(jb)%spid) THEN + IF (vbs_set(jb)%lcreateaero) THEN + CALL new_subm_gasspec(jt, immr2molec, vbs_set(jb)%id_gasspec) + CALL new_subm_aerospec(jt, immr2ug, vbs_set(jb)%id_aerospec) + vbs_set(jb)%id_vols = subm_naerospec_nowat + ELSE + DO jm = 1,subm_ngasspec + IF (subm_gasspec(jm) == jt) vbs_set(jb)%id_gasspec = jm + END DO + +!>>SF special case + IF (vbs_set(jb)%spid_aero /= 0) THEN + vbs_set(jb)%id_vols = subm_naerospec_nowat + ENDIF +!< nmaxspec) CALL finish('new_subm_gasspec', & + 'Number of gas species for HAM (subm_ngasspec) exceeds nmaxspec!') + + subm_gasspec(subm_ngasspec) = nspid + subm_gasunitconv(subm_ngasspec) = nunitconv + + IF (PRESENT(idlocal)) idlocal = subm_ngasspec + +END SUBROUTINE new_subm_gasspec + + +! --------------------------------------------------------------------------- +! new_subm_aerospec: add a species id of a aero species to the list of species to +! be considered in aerosol processes. +! --------------------------------------------------------------------------- + + SUBROUTINE new_subm_aerospec(nspid, nunitconv, idlocal) + + USE mo_exception, ONLY: finish + USE mo_species, ONLY: nmaxspec + USE mo_ham, ONLY: subm_naerospec, subm_aerospec, subm_aerounitconv, subm_aero_idx, & + subm_naerospec_nowat, subm_aerospec_nowat !SF for convenience + USE mo_ham_species, ONLY: id_wat + + INTEGER, INTENT(in) :: nspid, nunitconv + INTEGER, INTENT(out), OPTIONAL :: idlocal ! local species id for M7 routines + !### note: minimial error checking, because use of this routine is practically hardwired in HAM + + subm_naerospec = subm_naerospec + 1 + IF (subm_naerospec > nmaxspec) CALL finish('new_subm_aerospec', & + 'Number of aerosol species exceeds nmaxspec!') + + subm_aerospec(subm_naerospec) = nspid + subm_aerounitconv(subm_naerospec) = nunitconv + ! reverse mapping + subm_aero_idx(nspid) = subm_naerospec + + IF (PRESENT(idlocal)) idlocal = subm_naerospec + + !>>SF for convenience only: introduce a special mapping for all but water aero species + ! (mostly used in SALSA for now, but could be more widely used in future) + IF (nspid /= id_wat) THEN + subm_naerospec_nowat = subm_naerospec_nowat + 1 + subm_aerospec_nowat(subm_naerospec_nowat) = nspid + ENDIF + !< +!! \filename +!! mo_ham_tools.f90 +!! +!! \brief +!! mo_ham_tools hold auxiliary routines for the +!! HAM aerosol model +!! +!! \author Philip Stier (MPI-Met) +!! +!! \responsible_coder +!! Philip Stier, philip.stier@physics.ox.ac.uk +!! +!! \revision_history +!! -# Philip Stier (MPI-Met) - original code (2002) +!! -# Philip Stier (MPI-Met) - added ham_logtail (2004) +!! -# Betty Croft (Dalhousie University) - added scavenging coefficient bilinear interpolation (2008) +!! -# Sylvaine Ferrachat (ETH Zurich) - cleanup and security (2011) +!! +!! \limitations +!! None +!! +!! \details +!! None +!! +!! \bibliographic_references +!! None +!! +!! \belongs_to +!! HAMMOZ +!! +!! SPDX-License-Identifier: BSD-3-Clause +!! Copyright (c) 2021 hammoz + +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +MODULE mo_ham_tools + + ! *mo_ham_tools* hold auxiliary routines for the + ! HAM aerosol model + + USE mo_kind, ONLY: dp + USE mo_exception, ONLY: finish + + IMPLICIT NONE + +CONTAINS + +#ifdef HAMMOZ + SUBROUTINE geoindex (plon, plat, klon, klat) + + ! *geoindex* calculates the corresponding lat-lon (klon,klat) index + ! for given lat-lon [-90,90][0,360] coordinates (plon, plat) + ! + ! Authors: + ! --------- + ! Philip Stier, MPI-MET 2002 + ! + ! Externals + ! ----------- + ! none + + + USE mo_exception, ONLY: finish + USE mo_control, ONLY: ngl, nlon + USE mo_gaussgrid, ONLY: philat, philon + IMPLICIT NONE + + REAL(dp),INTENT(IN) :: plon, plat ! Coordinates in degrees + INTEGER, INTENT(OUT) :: klon, klat ! Corresponding indices + + REAL(dp) :: zxdif, zydif + INTEGER :: jlon, jlat + + + IF((NINT(plon)<0).OR.(NINT(plon)>360).OR.(NINT(plat)<-90).OR.(NINT(plat)>90)) THEN + CALL finish('geoindex:', 'Coordinates out of range') + END IF + + klon=-999 + klat=-999 + + zxdif=360._dp + zydif=180._dp + + !--- 1) Search for closest longitude in [0,360}: + + DO jlon = 1, nlon + IF(ABS(plon-philon(jlon)) < zxdif) THEN + klon=jlon + zxdif=ABS(plon-philon(jlon)) + END IF + END DO + + !--- 2) Search for closest latitude [90,-90]: + + DO jlat = 1, ngl + IF( ABS(plat-philat(jlat)) < zydif ) THEN + klat=jlat + zydif=ABS(plat-philat(jlat)) + END IF + END DO + + + IF(klon==-999 .OR. klat==-999) CALL finish('geoindex:', 'No index found') + + END SUBROUTINE geoindex +#endif +!--------------------------------------------------------------------------------------------- +#ifdef HAMMOZ + SUBROUTINE calc_daylength + + ! *dayfac* calculates relative daylength + ! + ! Author: + ! ------- + ! Philip Stier, MPI-Met 14/11/2002 + ! + ! Method: + ! ------- + ! Adapted from the routines "solang" and "prerad" + + USE mo_kind, ONLY: dp + USE mo_control, ONLY: nlon, ngl + USE mo_gaussgrid, ONLY: coslon, sinlon, gl_twomu, gl_sqcst + USE mo_time_control, ONLY: get_clock, current_date + USE mo_radiation_parameters, ONLY: decl_sun_cur + USE mo_decomposition, ONLY: gdc => global_decomposition + USE mo_transpose, ONLY: scatter_gp + USE mo_test_trans, ONLY: test_gridpoint + USE mo_ham_streams, ONLY: daylength + + IMPLICIT NONE + + INTEGER :: jl, jlat + + LOGICAL :: lo + + REAL(dp):: zclock + REAL(dp):: czen1, czen2, czen3, ztim1, ztim2, ztim3, zsum + + REAL(dp):: zmu0(nlon), zrdayl(nlon) + + REAL(dp), POINTER :: zdaylength(:,:) + + + !--- 0) Initialization: + + ALLOCATE (zdaylength(nlon,ngl)) + + + !--- 1) Compute orbital parameters for present time step: + + zclock = get_clock(current_date) + +!!mgs: removed orbital calculation - can now make use of variables from mo_radiation_parameters + + czen1 = SIN(decl_sun_cur) + czen2 = COS(decl_sun_cur)*COS(zclock) + czen3 = COS(decl_sun_cur)*SIN(zclock) + + !--- 2) Calculate relative daylength (from routine solang): + + DO jlat = 1, ngl + + ztim1 = czen1*0.5_dp*gl_twomu(jlat) + ztim2 = -czen2*gl_sqcst(jlat) + ztim3 = czen3*gl_sqcst(jlat) + + DO jl = 1, nlon + zmu0(jl) = ztim1 + ztim2*coslon(jl) + ztim3*sinlon(jl) + lo = zmu0(jl) >= 0._dp + zrdayl(jl) = MERGE(1._dp,0._dp,lo) + END DO + + zsum = SUM(zrdayl(1:nlon)) + + IF (ABS(zsum) > 0._dp) THEN + zdaylength(:,jlat) = zsum/REAL(nlon,dp) + ELSE + zdaylength(:,jlat) = 0._dp + END IF + + END DO + + + !--- 3) Scatter in stream element: + + CALL scatter_gp(zdaylength, daylength, gdc) + + CALL test_gridpoint(daylength, 'daylength') + + DEALLOCATE (zdaylength) + + END SUBROUTINE calc_daylength +#endif +!--------------------------------------------------------------------------------------------- + + SUBROUTINE ham_m7_logtail(kproma, kbdim, klev, krow, kmod, & + ld_numb, pcmr, pr, pfrac) + + ! *ham_m7_logtail* calculates mass- or number-fraction larger than + ! the radius pr for one given mode of a superposition + ! of nclass log-normal aerosol distributions + ! + ! Author: + ! ------- + ! Philip Stier, MPI-MET 2004 + ! + ! Revision: + ! --------- + ! Sylvaine Ferrachat, ETH Zurich, 2013 + ! --> this routine computes now one mode at a time, which allows to reduce the computational load + ! for all irrelevant modes + ! + ! Method: + ! ------- + + ! + ! The calculation of the activated number fraction and mass fraction + ! from the radius of activation is done by a transformation of the + ! log-normal distribution to the error function which is then computed + ! using the routine m7_cumulative_normal: + ! + ! / x _ + ! N | 1 1 ln(R)-ln(R) 2 + ! N(0,x) = --------- | -------- exp(- - ( ----------- ) ) d ln(R) + ! ln(sigma) | sqrt(2PI) 2 ln(sigma) + ! / 0 + ! + ! /tx 2 + ! | 1 t + ! = N | -------- exp(- - ) d t + ! | sqrt(2PI) 2 + ! /-inf + ! + ! where: + ! + ! _ + ! ln(R)-ln(R) + ! t = ----------- + ! ln(sigma) + ! + ! and: + ! _ + ! ln(x)-ln(R) + ! tx = ----------- + ! ln(sigma) + + + USE mo_ham_m7ctl, ONLY: sigmaln, cmedr2mmedr + USE mo_ham_m7, ONLY: m7_cumulative_normal + + IMPLICIT NONE + + !--- Subroutine parameters: + + INTEGER, INTENT(in) :: kproma, kbdim, klev, krow, kmod + + LOGICAL, INTENT(in) :: ld_numb !number vs mass switch + + REAL(dp), INTENT(in) :: pcmr(kbdim,klev) !count mean radius + REAL(dp), INTENT(in) :: pr(kbdim,klev) !lower bound radius + + REAL(dp), INTENT(out) :: pfrac(kbdim,klev) + + !--- Local variables: + + INTEGER :: jl, jk + + REAL(dp) :: zt, zdummy, zeps, zfact + + + !--- 0) + + zeps=EPSILON(1.0_dp) + + !--- 1) + + !>>SF + IF (ld_numb) THEN !number calculation + zfact = 1._dp + ELSE !mass calculation + zfact = cmedr2mmedr(kmod) + ENDIF + !<zeps .AND. pcmr(jl,jk)>zeps) THEN + + !--- Transform number distribution to error function: + + zt=(LOG(pr(jl,jk))-LOG(pcmr(jl,jk)*zfact))/sigmaln(kmod) + + !--- Calculate the cumulative of the log-normal number distribution: + + CALL m7_cumulative_normal(zt,zdummy,pfrac(jl,jk)) + + !--- Calculate the cumulative of the log-normal mass distribution: + + ELSE IF (pr(jl,jk)zeps) THEN + + pfrac(jl,jk)=1.0_dp + + ELSE + + pfrac(jl,jk)=0.0_dp + + END IF + + END DO !kproma + END DO !klev + + END SUBROUTINE ham_m7_logtail + +!>>gf +! ------------------------------------------------------------------------------------------------------ + + SUBROUTINE ham_m7_invertlogtail(kproma, kbdim, klev, krow, kmod, & + pcmr, pxie, pcritrad ) + + ! *ham_m7_invertlogtail* calculates the critical + + ! radius for one mode with a log-normal aerosol distribution + + ! that contains a given number in the logtail + + ! The input to the subroutine is pxie, the x for erf^-1(x) + + ! Author: + + ! ------- + + ! Betty Croft, Dalhousie University 2007 + + ! Updates: + ! Grazia Frontoso, C2SM-ETHZ, adjusted for e6-h2 2013 + ! Sylvaine Ferrachat, ETHZ 2013 + ! ---> cleanup, optimization, and change so that it computes one mode only (allows to reduce the + ! computational load for all irrelevant modes) + ! + ! Method: + + ! The cumulative number in a logtail is: + ! + ! ln (R/Rg) + ! Tail = N - Fn(r) = N/2 - N/2 * erf [ --------------------] + ! sqrt (2) * ln (sigma) + ! + ! This can be solved for R by inverting the error function (inverf) + ! + ! R = Rg *exp( sqrt (2) * ln (sigma) * inverf(1 - (Tail*2/N))) + ! + ! The approximation for the inverse error function used is (valid for x in (0,1)): + ! + ! -2 ln(1-x^2) 2 ln(1-x^2) ln(1-x^2) + ! erf^-1 (x) = sqrt( --- - -------- + sqrt((( --- + ------- ))^2 - --------- )) + ! pi*a 2 pi*a 2 a + ! + ! + ! where a = 8(pi-3)/(3*pi*(4-pi)) + + USE mo_ham_m7ctl, ONLY: sigmaln + !USE mo_ham_streams, ONLY: rwet, rdry + !USE mo_ham_m7, ONLY: rwet_m7, rdry_m7 + USE mo_math_constants, ONLY: pi + + IMPLICIT NONE + + !--- Subroutine parameters: + + INTEGER, INTENT(in) :: kproma, kbdim, klev, krow, kmod + + REAL(dp), INTENT(in) :: pcmr(kbdim,klev) + REAL(dp), INTENT(in) :: pxie(kbdim,klev) + + REAL(dp), INTENT(out) :: pcritrad(kbdim,klev) + + !--- Local variables: + + INTEGER :: jl, jk + + LOGICAL :: ll1(kbdim, klev), ll2(kbdim,klev), ll3(kbdim,klev) + + REAL(dp) :: za_rcp, zb(kbdim, klev), zc(kbdim, klev), & + zx2(kbdim, klev), zy(kbdim, klev), zcritrad(1:kbdim, klev), & + zpre_fact, zfact(kbdim, klev) + + za_rcp = (3._dp * pi * (4._dp-pi)) / (8._dp * (pi-3._dp)) + + zpre_fact = SQRT(2._dp)*sigmaln(kmod) + + pcritrad(1:kproma,:) = 0._dp !initialization + + ll1(1:kproma,:) = (ABS(pxie(1:kproma,:)) < 1._dp) + ll2(1:kproma,:) = (pxie(1:kproma,:) >= 1._dp) + ll3(1:kproma,:) = ll1(1:kproma,:) .AND. (pxie(1:kproma,:) < 0._dp) + + zx2(1:kproma,:) = pxie(1:kproma,:)**2 + zx2(1:kproma,:) = MERGE(zx2(1:kproma,:), 0._dp, ll1(1:kproma,:)) !to avoid illegal operations + zb(1:kproma,:) = 2.0_dp/pi*za_rcp + (0.5_dp * LOG(1.0_dp-zx2(1:kproma,:))) + zc(1:kproma,:) = LOG(1.0_dp-zx2(1:kproma,:))*za_rcp + zy(1:kproma,:) = SQRT(-zb(1:kproma,:) + SQRT(zb(1:kproma,:)**2-zc(1:kproma,:))) + zy(1:kproma,:) = MERGE(-zy(1:kproma,:), zy(1:kproma,:), ll3(1:kproma,:)) + + zfact(1:kproma,:) = zpre_fact * zy(1:kproma,:) + zcritrad(1:kproma,:) = EXP(zfact(1:kproma,:)) * pcmr(1:kproma,:) + + pcritrad(1:kproma,:) = MERGE(zcritrad(1:kproma,:), pcritrad(1:kproma,:), ll1(1:kproma,:)) + + ! Minimal scavenging of the mode by using an artificial large critical radius: + pcritrad(1:kproma,:) = MERGE(500.e-6_dp, pcritrad(1:kproma,:), ll2(1:kproma,:)) + + END SUBROUTINE ham_m7_invertlogtail +!< +!! \filename +!! mo_ham_wetdep.f90 +!! +!! \brief +!! Module to compute HAM-specific aerosol wet deposition. +!! Originally contained in xt_wetdep.f90 and reorganized here by processes: +!! in-cloud (liq/ice phase), below-cloud (liq/ice phase) +!! +!! \author Philip Stier (MPI-Met) +!! \author Betty Croft (Dalhousie University) +!! \author Sylvaine Ferrachat (ETH Zurich) +!! +!! \responsible_coder +!! Sylvaine Ferrachat, sylvaine.ferrachat@env.ethz.ch +!! +!! \revision_history +!! -# Johann Feicher (MPI-MET) - original code (xt_wetdep) (2001) +!! -# Claudia Timmreck (MPI-MET) (2001) +!! -# Philip Stier (MPI-Met) (2001-2004) +!! -# Johann Sebastian Rast (MPI-Met) - introduction of nwetdep (2004) +!! -# Betty Croft (Dalhousie Uni.) - size-dependent below-cloud scavenging (2005-2008) +!! -# Sylvaine Ferrachat (ETH Zurich) - complete code cleanup and reorganisation (2009-11-04) +!! -# Grazia Frontoso (C2SM) - porting of the in-cloud size-dep scavenging from Betty Croft (2013-06) +!! -# Sylvaine Ferrachat (ETH Zurich) - code refactoring to optimize for mode-wise only calculations (2013-08) +!! +!! \limitations +!! None +!! +!! \details +!! Stratiform and convective cases are handled transparently (former code duplication in +!! xt_wetdep was removed). +!! +!! \bibliographic_references +!! -# Croft et al, 2009, Aerosol size-dependent below-cloud scavenging by rain and snow in the ECHAM5-HAM, +!! Atmos. Chem. Phys. ; 9 ; 4653-4675 +!! -# Croft et all, 2010, Influences of in-cloud aerosol scavenging parameterizations on aerosol concentrations +!! and wet deposition in ECHAM5-HAM, Atmos. Chem. Phys. ; 10 ; 1511-1543 +!! +!! \belongs_to +!! HAMMOZ +!! +!! SPDX-License-Identifier: BSD-3-Clause +!! Copyright (c) 2021 hammoz +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +MODULE mo_ham_wetdep + + USE mo_kind, ONLY: dp + USE mo_physical_constants, ONLY: tmelt + USE mo_exception, ONLY: finish + USE mo_tracdef, ONLY: ntrac, trlist, AEROSOLNUMBER, AEROSOLMASS + !USE mo_echam_cloud_params, ONLY: cthomi !eehol: this does not need to be from echam + USE mo_time_control, ONLY: time_step_len + USE mo_ham, ONLY: nclass + + +!#ifdef _OPENMP +! use omp_lib +!#endif + + IMPLICIT none + + PRIVATE + + PUBLIC :: ham_wetdep + PUBLIC :: ham_setscav ! to set the scavenging flags + PUBLIC :: ham_conv_lfraq_so2 ! ++mgs: calculate liquid fraction of SO2 for conv cases + ! ++mgs: former code from cuflx.f90 + PUBLIC :: prep_ham_mode_init + + !--- Constants: + REAL(dp), PARAMETER :: zmin = 1.e-10_dp + REAL(dp), PARAMETER :: UNDEF = -999._dp + REAL(dp), PARAMETER :: zeps = EPSILON(1._dp) + REAL(dp), PARAMETER :: zeps_mass = 1.e-30_dp + + !--- Mode-wise scavenging coefficients and related + INTEGER, POINTER :: indexy1(:,:,:,:) => NULL() + INTEGER, POINTER :: indexy2(:,:,:,:) => NULL() ! indices necessary for lookup table searches + ! shape: (kbdim,klev,numb/mass,mode) + + REAL(dp), POINTER :: mr(:,:,:,:) => NULL() ! median radius (wet) + ! shape: (kbdim,klev, numb/mass, mode) + REAL(dp), POINTER :: rcritrad(:,:,:,:) => NULL() ! critical radius [m] (ie min bound) for scav of mode + ! shape: (kbdim,klev, liq/ice, mode) + REAL(dp), POINTER :: sfnuc(:,:,:,:,:) => NULL() ! in-cloud, nucleation scavenging fraction + ! shape: (kbdim,klev, liq/ice, numb/mass, mode) + REAL(dp), POINTER :: sfimp(:,:,:,:,:) => NULL() ! in-cloud, impaction scavenging fraction + ! shape: (kbdim,klev, liq/ice, numb/mass, mode) + REAL(dp), POINTER :: sfrain(:,:,:,:) => NULL() ! below-cloud, scavenging fraction by rain + ! shape: (kbdim,klev,numb/mass, mode) + REAL(dp), POINTER :: sfsnow(:,:,:,:) => NULL() ! below-cloud, scavenging fraction by snow + ! (kbdim,klev,numb/mass, mode) + !INTEGER, allocatable :: indexy1(:,:,:,:) + !INTEGER, allocatable :: indexy2(:,:,:,:) ! indices necessary for lookup table searches + ! ! shape: (kbdim,klev,numb/mass,mode) + + !REAL(dp), allocatable :: mr(:,:,:,:) ! median radius (wet) + ! ! shape: (kbdim,klev, numb/mass, mode) + !REAL(dp), allocatable :: rcritrad(:,:,:,:) ! critical radius [m] (ie min bound) for scav of mode + ! ! shape: (kbdim,klev, liq/ice, mode) + !REAL(dp), allocatable :: sfnuc(:,:,:,:,:) ! in-cloud, nucleation scavenging fraction + ! ! shape: (kbdim,klev, liq/ice, numb/mass, mode) + !REAL(dp), allocatable :: sfimp(:,:,:,:,:) ! in-cloud, impaction scavenging fraction + ! ! shape: (kbdim,klev, liq/ice, numb/mass, mode) + !REAL(dp), allocatable :: sfrain(:,:,:,:) ! below-cloud, scavenging fraction by rain + ! ! shape: (kbdim,klev,numb/mass, mode) + !REAL(dp), allocatable :: sfsnow(:,:,:,:) ! below-cloud, scavenging fraction by snow + ! (kbdim,klev,numb/mass, mode) + + + INTERFACE init_var + MODULE PROCEDURE init_var_i_4d + MODULE PROCEDURE init_var_r_4d + MODULE PROCEDURE init_var_r_5d + END INTERFACE init_var + + !$OMP THREADPRIVATE(indexy1,indexy2,mr,rcritrad, sfnuc, sfimp, sfrain, sfsnow) + + CONTAINS + + !!---------------------------------------------------------------------------- + SUBROUTINE ham_wetdep(kproma, kbdim, klev, krow, ktop, kt, & + kscavICtype, kscavBCtype, & + kscavICphase, kscavBCphase, & + lstrat, ptm1, pxtm1, pxtte, & + pxtp10, pxtp1c, pxtp1c_sav, & + pfrain, pfsnow, paclc, pmfu, & + pmfuxt, prhop1, pdpg, & + pm6rp, pm6dry, & + reffi, reffl, & + pnact, pfracn, & + pice, & + peffice, peffwat, pclc, prevap, & + pdepint, pdepintbc, pdepintbcr, pdepintbcs, & + pdepintic, pdepintic_nucw, pdepintic_nucm, & + pdepintic_nucc, pdepintic_impw, pdepintic_impm, pdepintic_impc) + + ! master routine for ham scavenging calculations + + ! HK --> USE mo_ham_streams, ONLY: rwet + !USE mo_ham_m7, ONLY: rwet_m7 +#ifdef SALSA + USE mo_ham_salsa, ONLY: rwet_salsa +#endif + USE mo_ham_m7ctl, ONLY: cmedr2mmedr + USE mo_ham, ONLY: nham_subm, HAM_M7 + + !--- arguments + INTEGER, INTENT(in) :: kproma ! geographic block number of locations + INTEGER, INTENT(in) :: kbdim ! geographic block maximum number of locations + INTEGER, INTENT(in) :: klev ! numer of levels + INTEGER, INTENT(in) :: krow ! geographic block number + INTEGER, INTENT(in) :: ktop ! top layer index + INTEGER, INTENT(in) :: kt ! tracer index + INTEGER, INTENT(in) :: kscavICtype ! indicates in-cloud scavenging scheme + INTEGER, INTENT(in) :: kscavBCtype ! indicates below-cloud scavenging scheme + INTEGER, INTENT(in) :: kscavICphase ! indicates in-cloud scavenging by water and/or ice + INTEGER, INTENT(in) :: kscavBCphase ! indicates below-cloud scavenging by water and/or ice + + LOGICAL, INTENT(in) :: lstrat ! stratiform or convective clouds case + + REAL(dp), INTENT(in) :: ptm1(kbdim,klev), & ! temperature + pxtm1(kbdim,klev,ntrac), & ! tracer mixing ratio + pfrain(kbdim,klev), & ! rain rate + pfsnow(kbdim,klev), & ! snow rate + paclc(kbdim,klev), & ! cloud cover + pmfu(kbdim,klev), & ! convective flux + pdpg(kbdim,klev), & ! grid box thickness + pice(kbdim,klev), & ! ice fraction + peffice(kbdim,klev), & ! autoconversion rate (ice) + peffwat(kbdim,klev), & ! autoconversion rate (liq water) + pclc(kbdim,klev), & ! fraction of grid covered by precip + prevap(kbdim,klev), & + pxtp1c_sav(kbdim,klev,ntrac), & ! cloudy mixing ratio, untouched by wetdep + prhop1(kbdim,klev) ! air density (t-dt) + + REAL(dp), INTENT(in) :: pm6rp(kbdim,klev,nclass), pm6dry(kbdim,klev,nclass) ! m7: rwet_m7 + REAL(dp), INTENT(in) :: reffi(kbdim,klev,1), reffl(kbdim,klev,1) + REAL(dp), INTENT(in) :: pnact(kbdim,klev,nclass) !number of activated particles per mode [m-3] + REAL(dp), INTENT(in) :: pfracn(kbdim,klev,nclass) !fraction of activated particles per mode + + REAL(dp), INTENT(inout) :: pxtte(kbdim,klev,ntrac), & ! tracer tendency + pxtp10(kbdim,klev,ntrac), & ! cloud-free mixing ratio + pxtp1c(kbdim,klev,ntrac), & ! cloudy mixing ratio + pmfuxt(kbdim,klev,ntrac), & ! updraft mmr + pdepint(kbdim), & ! global scavenged mr + pdepintbc(kbdim), & ! below-cloud scavenged mr + pdepintbcr(kbdim), & ! below-cloud scavenged by rain mr + pdepintbcs(kbdim), & ! below-cloud scavenged by snow mr + pdepintic(kbdim), & ! in-cloud scavenged mr + pdepintic_nucw(kbdim), & ! in-cloud by nucleation (warm cl) scav. mr + pdepintic_nucm(kbdim), & ! in-cloud by nucleation (mixed-phase cl) scav. mr + pdepintic_nucc(kbdim), & ! in-cloud by nucleation (cold cl) scav. mr + pdepintic_impw(kbdim), & ! in-cloud by impaction (warm cl) scav. mr + pdepintic_impm(kbdim), & ! in-cloud by impaction (mixed-phase cl) scav. mr + pdepintic_impc(kbdim) ! in-cloud by impaction (cold cl) scav. mr + + !--- local variables + + INTEGER :: jk, imod, itrac_phase, itmp1(kbdim,klev), itmp2(kbdim,klev) + + LOGICAL :: ll1(kbdim,klev) + LOGICAL :: ll_wat(kbdim,klev), ll_mxp(kbdim,klev), ll_ice(kbdim,klev) + + REAL(dp) :: ztmst, zrad_fac ! conversion factor for median radius (mass vs number) + + REAL(dp):: zxtice(kbdim,klev), zxtwat(kbdim,klev), & + zxtp1(kbdim,klev), zdxtwat(kbdim,klev), & + zdxtice(kbdim,klev), zdxtcol(kbdim,klev), & + zdep(kbdim,klev), & + zdxtwat_nuc(kbdim,klev), zdxtice_nuc(kbdim,klev), & + zdxtwat_imp(kbdim,klev), zdxtice_imp(kbdim,klev), & + zdxtcolr(kbdim,klev), zdxtcols(kbdim,klev), & + zdxtevapic(kbdim,klev), zdxtevapbc(kbdim,klev), & + zdxtevapic_nucw(kbdim,klev), zdxtevapic_nucm(kbdim,klev), & + zdxtevapic_nucc(kbdim,klev), & + zdxtevapic_impw(kbdim,klev), zdxtevapic_impm(kbdim,klev), & + zdxtevapic_impc(kbdim,klev), & + zdxtevapbcr(kbdim,klev), & + zdxtevapbcs(kbdim,klev), zdep_nuc(kbdim,klev), & + zdep_imp(kbdim,klev), & + zxtte(kbdim,klev), zxtp10(kbdim,klev), & + zmf(kbdim,klev), & + zxtfrac_col(kbdim,klev), zxtfrac_colr(kbdim,klev), & + zxtfrac_cols(kbdim,klev), & + zcoeffr(kbdim,klev), zcoeffs(kbdim,klev), & + ztmp1(kbdim,klev), ztmp2(kbdim,klev) + + !--- 0/ Initializations: + + !CALL prep_ham_mode_init(kproma, kbdim, klev) + + ztmst = time_step_len + + imod = trlist%ti(kt)%mode + + zrad_fac = 1._dp !SF #380: proper initialization + + IF (trlist%ti(kt)%nphase == AEROSOLNUMBER) THEN + itrac_phase = 1 + ELSE IF (trlist%ti(kt)%nphase == AEROSOLMASS) THEN + itrac_phase = 2 + !TB: count to mode median calculatin needed only for M7 (see #380) + ! + IF (nham_subm == HAM_M7) THEN + zrad_fac = cmedr2mmedr(imod) + ENDIF + ENDIF + + zdxtevapic(1:kproma,:) = 0._dp + zdxtevapbc(1:kproma,:) = 0._dp + + zxtfrac_col(1:kproma,:) = 0._dp + zxtfrac_colr(1:kproma,:) = 0._dp + zxtfrac_cols(1:kproma,:) = 0._dp + + zdxtwat(1:kproma,:) = 0._dp + zdxtice(1:kproma,:) = 0._dp + + zdxtwat_nuc(1:kproma,:) = 0._dp + zdxtice_nuc(1:kproma,:) = 0._dp + zdxtwat_imp(1:kproma,:) = 0._dp + zdxtice_imp(1:kproma,:) = 0._dp + + IF (lstrat) THEN !stratiform case + + !--- Weight mixing ratios with cloud fraction: + + pxtp1c(1:kproma,:,kt) = pxtp1c(1:kproma,:,kt)*paclc(1:kproma,:) + pxtp10(1:kproma,:,kt) = pxtp10(1:kproma,:,kt)*(1._dp-paclc(1:kproma,:)) + zxtp10(1:kproma,:) = pxtp10(1:kproma,:,kt) + zmf(1:kproma,:) = pdpg(1:kproma,:) / ztmst + !SF note: zxtp10 is needed in order to transparently + ! handle the strat and the conv cases without writing too many separate, + ! but very similar, equations + ELSE + zxtp10(1:kproma,:) = 0._dp + zmf(1:kproma,:) = pmfu(1:kproma,:) + ENDIF + + !--- Associate tracer masses in the cloud fraction to water/ice phase + ! to the respective mass fractions: + zxtwat(1:kproma,:) = pxtp1c(1:kproma,:,kt)*(1._dp-pice(1:kproma,:)) + zxtice(1:kproma,:) = pxtp1c(1:kproma,:,kt)*pice(1:kproma,:) + + !--- 1/ Process: + + IF (kscavBCtype == 3 .OR. kscavICtype == 3 ) THEN !only necessary for size-dep scavenging: + + IF (indexy1(1,1,itrac_phase,imod) == UNDEF) THEN ! mode-phase calculation required! + + !--- Select aerosol wet radius and limit it to maximal 50 um: + ! + ! If tracer is: + ! + ! aerosol number mixing ratio: use number median radius + ! aerosol mass mixing ratio: use mass median radius + !--- Convert radius from metres to micrometres + IF ( nham_subm == HAM_M7 ) THEN + + !mr(1:kproma,:,itrac_phase,imod) = MIN(rwet_m7(1:kproma,:,imod)*zrad_fac, 50.E-6_dp) + mr(1:kproma,:,itrac_phase,imod) = MIN(pm6rp(1:kproma,:,imod)*zrad_fac, 50.E-6_dp) +#ifdef SALSA + ELSE + mr(1:kproma,:,itrac_phase,imod) = MIN(rwet_salsa(1:kproma,:,imod)*zrad_fac, 50.E-6_dp) +#endif + END IF + mr(1:kproma,:,itrac_phase,imod) = mr(1:kproma,:,itrac_phase,imod)*1.E+6_dp + + ll1(1:kproma,:) = (mr(1:kproma,:,itrac_phase,imod) > zeps) !SF#294 replaced 0. by zeps + + ztmp1(1:kproma,:) = MERGE(mr(1:kproma,:,itrac_phase,imod), 1._dp, ll1(1:kproma,:)) !1. is just dummy + ztmp2(1:kproma,:) = FLOOR((3._dp*(log(1.e4_dp*ztmp1(1:kproma,:))/log(2._dp)))+1._dp) + + itmp1(1:kproma,:) = MAX(0, MIN(60, INT(ztmp2(1:kproma,:)))) + itmp2(1:kproma,:) = MAX(0, MIN(60, INT(1._dp+ztmp2(1:kproma,:)))) + + indexy1(1:kproma,:,itrac_phase,imod) = MERGE(itmp1(1:kproma,:), 0, ll1(1:kproma,:)) + indexy2(1:kproma,:,itrac_phase,imod) = MERGE(itmp2(1:kproma,:), 0, ll1(1:kproma,:)) + + ENDIF !indexy1(itrac_phase,imod) == UNDEF + + ENDIF !kscavBCtype == 3 .OR. kscavICtype == 3 + + !--- 1.1/ In-cloud scavenging + IF(kscavICtype > 0) THEN + + !--- Set logical for temperature ranges (needed several times below) + ll_wat(1:kproma,:) = (ptm1(1:kproma,:) > tmelt) + ll_mxp(1:kproma,:) = .NOT. ll_wat(1:kproma,:) .AND. (ptm1(1:kproma,:) > (tmelt-35.0_dp)) !eehol: temp greater than homogenic ice nucleation temperature + ll_ice(1:kproma,:) = (ptm1(1:kproma,:) <= (tmelt-35.0_dp)) !eehol: temp lesser or equal than homogenic ice nucleation temperature + + !--- 1.1.1/ Phase-specific calculations: + + IF (IAND(kscavICphase,1) /= 0) THEN !water scavenging on (kscavICphase==1 .or. 3) + + CALL ic_scav(kproma, kbdim, klev, krow, ktop, kt, & + imod, 1, itrac_phase, kscavICtype, & + lstrat, ll_wat, ll_mxp, ll_ice, & + prhop1, pxtp1c, pxtp1c_sav, paclc, peffwat, & + pm6rp, pm6dry, & + reffi, reffl, & + pnact, pfracn, & + zdxtwat_nuc, zdxtwat_imp, zdxtwat, zxtwat) + + ENDIF !water scavenging on + + IF (IAND(kscavICphase,2) /= 0) THEN !ice scavenging on (kscavICphase==2 .or. 3) + + CALL ic_scav(kproma, kbdim, klev, krow, ktop, kt, & + imod, 2, itrac_phase, kscavICtype, & + lstrat, ll_wat, ll_mxp, ll_ice, & + prhop1, pxtp1c, pxtp1c_sav, paclc, peffice, & + pm6rp, pm6dry, & + reffi, reffl, & + pnact, pfracn, & + zdxtice_nuc, zdxtice_imp, zdxtice, zxtice) + + ENDIF !ice scavenging on + + !--- 1.1.2/ Put everything together: + + pxtp1c(1:kproma,:,kt) = zxtwat(1:kproma,:) + zxtice(1:kproma,:) + + !--- Local deposition mass-flux [grid-box mean kg m-2 s-1]: + zdep(1:kproma,:) = (zdxtwat(1:kproma,:) + zdxtice(1:kproma,:) )*zmf(1:kproma,:) + zdep_nuc(1:kproma,:) = (zdxtwat_nuc(1:kproma,:) + zdxtice_nuc(1:kproma,:))*zmf(1:kproma,:) + zdep_imp(1:kproma,:) = (zdxtwat_imp(1:kproma,:) + zdxtice_imp(1:kproma,:))*zmf(1:kproma,:) + + DO jk=ktop,klev + + !--- Integrated deposition mass flux: + pdepintic(1:kproma) = pdepintic(1:kproma) + zdep(1:kproma,jk) + + !>>SF #458 (replacing where statements) + pdepintic_nucw(1:kproma) = pdepintic_nucw(1:kproma) & + + MERGE(zdep_nuc(1:kproma,jk), 0._dp, ll_wat(1:kproma,jk)) + pdepintic_impw(1:kproma) = pdepintic_impw(1:kproma) & + + MERGE(zdep_imp(1:kproma,jk), 0._dp, ll_wat(1:kproma,jk)) + + pdepintic_nucm(1:kproma) = pdepintic_nucm(1:kproma) & + + MERGE(zdep_nuc(1:kproma,jk), 0._dp, ll_mxp(1:kproma,jk)) + pdepintic_impm(1:kproma) = pdepintic_impm(1:kproma) & + + MERGE(zdep_imp(1:kproma,jk), 0._dp, ll_mxp(1:kproma,jk)) + + pdepintic_nucc(1:kproma) = pdepintic_nucc(1:kproma) & + + MERGE(zdep_nuc(1:kproma,jk), 0._dp, ll_ice(1:kproma,jk)) + pdepintic_impc(1:kproma) = pdepintic_impc(1:kproma) & + + MERGE(zdep_imp(1:kproma,jk), 0._dp, ll_ice(1:kproma,jk)) + !< 0) THEN + + !--- 1.2.1/ Phase-specific calculations: + + IF (IAND(kscavBCphase,1) /= 0) THEN !rain scavenging on (kscavBCphase==1 .or. 3) + + CALL bc_rain(kproma, kbdim, klev, krow, ktop, imod, itrac_phase, kscavBCtype, pfrain) + + ENDIF !rain scavenging on + + IF (IAND(kscavBCphase,2) /= 0) THEN !snow scavenging on (kscavBCphase==2 .or. 3) + + CALL bc_snow(kproma, kbdim, klev, krow, ktop, imod, itrac_phase, kscavBCtype, pfsnow) + + ENDIF !snow scavenging on + + !--- 1.2.2/ Put everything together: + + !--- Calculate fraction of below cloud scavenged tracer: + ll1(1:kproma,:) = (paclc(1:kproma,:) < zmin) + + ztmp1(1:kproma,:) = -ztmst*MAX(sfrain(1:kproma,:,itrac_phase,imod),0._dp) + ztmp2(1:kproma,:) = -ztmst*MAX(sfsnow(1:kproma,:,itrac_phase,imod),0._dp) +!SFnote: in the above two expressions, the MAX function is here only to rule out the cases where sfrain and/or +! sfsnow is/are equal to UNDEF, ie in cases where scavenging by rain and/or snow is not relevant. +! Initializing sfrain and sfsnow to 0 at the beginning would defeat the concept of having an UNDEF value, +! which is necessary to flag cases where mode-wise (and trace phase-wise) calculations are necessary. +! This concept allows to perform these potentially expensive calculations only once per mode +! and tracer phase. + + !>>SF #458 (replacing where statements) + zcoeffr(1:kproma,:) = MERGE(ztmp1(1:kproma,:), 0._dp, ll1(1:kproma,:)) + zcoeffs(1:kproma,:) = MERGE(ztmp2(1:kproma,:), 0._dp, ll1(1:kproma,:)) + + zxtfrac_colr(1:kproma,:) = 1._dp - EXP(zcoeffr(1:kproma,:) ) + zxtfrac_cols(1:kproma,:) = 1._dp - EXP( zcoeffs(1:kproma,:)) + zxtfrac_col(1:kproma,:) = 1._dp - EXP(zcoeffr(1:kproma,:)+zcoeffs(1:kproma,:)) + + zxtfrac_colr(1:kproma,:) = MAX(0._dp, MIN(1._dp, zxtfrac_colr(1:kproma,:) ) ) + zxtfrac_cols(1:kproma,:) = MAX(0._dp, MIN(1._dp, zxtfrac_cols(1:kproma,:) ) ) + zxtfrac_col(1:kproma,:) = MAX(0._dp, MIN(1._dp, zxtfrac_col(1:kproma,:) ) ) + + ll1(1:kproma,:) = (pclc(1:kproma,:) > zmin) + + ztmp1(1:kproma,:) = pxtp10(1:kproma,:,kt)*pclc(1:kproma,:)*zxtfrac_col(1:kproma,:) + zdxtcol(1:kproma,:) = MERGE(ztmp1(1:kproma,:), 0._dp, ll1(1:kproma,:)) + + zxtp10(1:kproma,:) = zxtp10(1:kproma,:) - zdxtcol(1:kproma,:) + + zdxtcol(1:kproma,:) = zdxtcol(1:kproma,:)*pdpg(1:kproma,:)/ztmst + + ztmp1(1:kproma,:) = pxtp10(1:kproma,:,kt)*pclc(1:kproma,:)*zxtfrac_colr(1:kproma,:)*pdpg(1:kproma,:)/ztmst + zdxtcolr(1:kproma,:) = MERGE(ztmp1(1:kproma,:), 0._dp, ll1(1:kproma,:)) + + ztmp1(1:kproma,:) = pxtp10(1:kproma,:,kt)*pclc(1:kproma,:)*zxtfrac_cols(1:kproma,:)*pdpg(1:kproma,:)/ztmst + zdxtcols(1:kproma,:) = MERGE(ztmp1(1:kproma,:), 0._dp, ll1(1:kproma,:)) + !< water; kwat_phase=2 --> ice + INTEGER, INTENT(in) :: ktrac_phase ! ktrac_phase=1 --> number; kwat_phase=2 --> mass + INTEGER, INTENT(in) :: kscavICtype ! in-cloud scavenging scheme + + LOGICAL, INTENT(in) :: lstrat ! flag to stratiform or convective clouds + LOGICAL, INTENT(in) :: ld_wat(kbdim,klev) ! liq water: ptm1 > tmelt + LOGICAL, INTENT(in) :: ld_mxp(kbdim,klev) ! mixed-phase clouds: cthomi < ptm1 <= tmelt + LOGICAL, INTENT(in) :: ld_ice(kbdim,klev) ! ice: ptm1 <= cthomi + + REAL(dp), INTENT(in) :: pxtp1c(kbdim,klev,ntrac) ! in-cloud tracer concentration + REAL(dp), INTENT(in) :: pxtp1c_sav(kbdim,klev,ntrac) ! in-cloud tracer concentration, untouched by wetdep + REAL(dp), INTENT(in) :: prhop1(kbdim,klev) ! air density (t-dt) + REAL(dp), INTENT(in) :: paclc(kbdim,klev) ! cloud cover + REAL(dp), INTENT(in) :: peff(kbdim,klev) ! autoconversion rate (liq or ice) + REAL(dp), INTENT(in) :: pm6rp(kbdim,klev,nclass), pm6dry(kbdim,klev,nclass) ! m7: + REAL(dp), INTENT(in) :: reffi(kbdim,klev,1), reffl(kbdim,klev,1) + + REAL(dp), INTENT(in) :: pnact(kbdim,klev,nclass) !number of activated particles per mode [m-3] + REAL(dp), INTENT(in) :: pfracn(kbdim,klev,nclass) !fraction of activated particles per mode + + REAL(dp), INTENT(out) :: pdxt_nuc(kbdim,klev) ! change in tracer mass assoc. with nucleation scav + ! (for relevant phase) + REAL(dp), INTENT(out) :: pdxt_imp(kbdim,klev) ! change in tracer mass assoc. with impaction scav + ! (for relevant phase) + REAL(dp), INTENT(out) :: pdxt(kbdim,klev) ! change in tracer mass (total) + ! (for relevant phase) + REAL(dp), INTENT(inout) :: pxt(kbdim,klev) ! tracer mass (total) + ! (for relevant phase) + + !local vars: + LOGICAL :: ll1(1:kproma,klev) + + REAL(dp) :: zxtfrac(kbdim,klev), zxtfrac_nuc(kbdim,klev), zxtfrac_imp(kbdim,klev) + REAL(dp) :: ztmp1(1:kbdim,klev) + + !--- Get the proper scavenging fractions + CALL get_icscavfrac(kproma, kbdim, klev, krow, ktop, kt, & + kmod, kwat_phase, ktrac_phase, kscavICtype, lstrat, & + ld_wat, ld_mxp, ld_ice, & + prhop1, pxtp1c, pxtp1c_sav, & + pm6rp, pm6dry, & !in + reffi, reffl, & !in + pnact, pfracn, & + zxtfrac, zxtfrac_nuc, zxtfrac_imp) + + !--- Change in in-cloud (strat) or updraft (conv) tracer concentration: + !>>SF #458 (replacing where statements) + ll1(1:kproma,:) = (paclc(1:kproma,:) > zmin) + + ztmp1(1:kproma,:) = pxt(1:kproma,:)*zxtfrac_nuc(1:kproma,:)*peff(1:kproma,:) + pdxt_nuc(1:kproma,:) = MERGE(ztmp1(1:kproma,:), 0._dp, ll1(1:kproma,:)) + + ztmp1(1:kproma,:) = pxt(1:kproma,:)*zxtfrac_imp(1:kproma,:)*peff(1:kproma,:) + pdxt_imp(1:kproma,:) = MERGE(ztmp1(1:kproma,:), 0._dp, ll1(1:kproma,:)) + + ztmp1(1:kproma,:) = pxt(1:kproma,:)*zxtfrac(1:kproma,:)*peff(1:kproma,:) + pdxt(1:kproma,:) = MERGE(ztmp1(1:kproma,:), 0._dp, ll1(1:kproma,:)) + !< eehol + + !--> USE mo_ham_streams, ONLY: frac, rwet + USE mo_math_constants, ONLY: pi + !--> HK +#ifdef SALSA + USE mo_ham_salsa_cloud, ONLY: pfrac_salsa + USE mo_ham_salsa, ONLY: rwet_salsa +#endif + !USE mo_ham_activ, ONLY: pfrac_m7 + !<-- HK + IMPLICIT NONE + !<-- eehol + + INTEGER, INTENT(in) :: kproma, kbdim, klev, krow, ktop, kt, kmod + INTEGER, INTENT(in) :: kwat_phase ! kwat_phase=1 --> water; kwat_phase=2 --> ice + INTEGER, INTENT(in) :: ktrac_phase ! ktrac_phase=1 --> number; kwat_phase=2 --> mass + INTEGER, INTENT(in) :: kscavICtype + + LOGICAL, INTENT(in) :: lstrat ! flag to stratiform or convective clouds + LOGICAL, INTENT(in) :: ld_wat(kbdim,klev) ! liq water: ptm1 > tmelt + LOGICAL, INTENT(in) :: ld_mxp(kbdim,klev) ! mixed-phase clouds: cthomi < ptm1 <= tmelt + LOGICAL, INTENT(in) :: ld_ice(kbdim,klev) ! ice: ptm1 <= cthomi + + REAL(dp), INTENT(in) :: pxtp1c(kbdim,klev,ntrac) ! in-cloud tracer concentration multiplied by cloud fraction + REAL(dp), INTENT(in) :: pxtp1c_sav(kbdim,klev,ntrac) ! in-cloud tracer concentration multiplied by cloud fraction + !SFnote: same as pxtp1c, but untouched by wetdep. + ! this is necessary for nucleation scavenging + REAL(dp), INTENT(in) :: prhop1(kbdim,klev) ! air density (t-dt) + + REAL(dp), INTENT(in) :: pm6rp(kbdim,klev,nclass), pm6dry(kbdim,klev,nclass) ! m7: + REAL(dp), INTENT(in) :: reffi(kbdim,klev,1), reffl(kbdim,klev,1) + REAL(dp), INTENT(in) :: pnact(kbdim,klev,nclass) !number of activated particles per mode [m-3] + REAL(dp), INTENT(in) :: pfracn(kbdim,klev,nclass) !fraction of activated particles per mode + + REAL(dp), INTENT(out) :: pfrac(kbdim,klev), & ! total scavenging fraction + pfrac_nuc(kbdim,klev), & ! nucleation scavenging fraction + pfrac_imp(kbdim,klev) ! impaction scavenging fraction + + REAL(dp) :: zcoeff_warm, zcoeff_mix, zcoeff_cold + + !--> eehol: local variables for SALSA wet deposition + REAL(dp) :: area_tot(kbdim,klev) !total area of particles (ice cloud scavenging fractions) + INTEGER :: jj !for loop indices + !<-- eehol + + LOGICAL :: ll1(kbdim,klev) + + pfrac_imp(1:kproma,:) = 0._dp + + SELECT CASE(kscavICtype) + + !CASE(1) ! prescribed fractions !not implemented here + + CASE(2) ! mode-wise fractions + + !--- Nucleation scavenging params: + + IF (lstrat) THEN !SF stratiform case + + IF (kwat_phase == 1) THEN + !water + zcoeff_warm = csr_strat_wat(kmod) + zcoeff_mix = csr_strat_mix(kmod) + zcoeff_cold = csr_strat_wat(kmod) + ELSE + !ice + zcoeff_warm = csr_strat_wat(kmod) + zcoeff_mix = csr_strat_mix(kmod) + zcoeff_cold = csr_strat_ice(kmod) + ENDIF + + !>>SF #458 (replacing where statements) + pfrac_nuc(1:kproma,:) = MERGE(zcoeff_warm, 0._dp , ld_wat(1:kproma,:)) + pfrac_nuc(1:kproma,:) = MERGE(zcoeff_mix, pfrac_nuc(1:kproma,:), ld_mxp(1:kproma,:)) + pfrac_nuc(1:kproma,:) = MERGE(zcoeff_cold, pfrac_nuc(1:kproma,:), ld_ice(1:kproma,:)) + !< zeps) !SF#294 replaced 0. by zeps + pfrac_imp(1:kproma,:) = MERGE(sfimp(1:kproma,:,kwat_phase,ktrac_phase,kmod), 0._dp, ll1(1:kproma,:)) + + ELSE !GF convective case + + pfrac_nuc(1:kproma,:) = csr_conv(kmod) !no size-dep nuc scavenging for convective clouds! + + ENDIF +#ifdef SALSA + CASE(HAM_SALSA) + !! --> eehol: IMPLEMENTING SALSA SCAVENGING FRACTIONS + !This calculation is only needed once for every bin so it doesnt need to be calculated for each tracer! + + IF (lstrat) THEN !stratiform case SALSA + + SELECT CASE(kwat_phase) + CASE(1) !liq water + + !Nucleation scavenging SALSA for liq water: + !Liq water case the nucleation scavenging fraction from Abdul-Razzak&Ghan + !HK: changed for pfrac_wetdep to pfrac_salsa + pfrac_nuc(1:kproma,:) = pfrac_salsa(1:kproma,:,kmod) !pfrac_salsa comes from mo_ham_salsa_cloud.f90 (pfracn) + + CASE(2) !ice + !Nucleation scavenging SALSA for ice: + + area_tot(1:kproma,:) = 0._dp !make area_tot = 0 before the summation + + DO jj=1,nclass !calculate the total area of aerosols (this could be done outside of module) + + area_tot(1:kproma,:) = area_tot(1:kproma,:) + (4._dp*pi*(rwet_salsa(1:kproma,:,jj))**(2._dp)) & + *pxtp1c_sav(1:kproma,:,jj) + END DO + + !calculate the nucleation scavenging fractions for ice case as: area of particles in bin i divided by total area of particles in all bins (A_i/A_tot) + pfrac_nuc(1:kproma,:) = ((4._dp*pi*(rwet_salsa(1:kproma,:,jj))**(2._dp)) & + *pxtp1c_sav(1:kproma,:,kmod)) / (area_tot(1:kproma,:)+zeps) + + END SELECT + !Impaction scavenging SALSA (same as M7 but for bins): + IF (sfimp(1,1,kwat_phase,ktrac_phase,kmod) == UNDEF) THEN + + CALL ic_scav_imp(kproma, kbdim, klev, krow, ktop, kwat_phase, & + ktrac_phase, kmod, prhop1, pxtp1c, reffi, reffl) + + END IF + + ll1(1:kproma,:) = (pxtp1c(1:kproma,:,kt) > zeps) !SF#294 replaced 0. by zeps + pfrac_imp(1:kproma,:) = MERGE(sfimp(1:kproma,:,kwat_phase,ktrac_phase,kmod), 0._dp, ll1(1:kproma,:)) + + ELSE !convective case + + pfrac_nuc(1:kproma,:) = csr_conv(kmod) !no size-dep nuc scavenging for convective clouds! + + END IF + !! <-- eehol +#endif + END SELECT + + CASE default + + CALL finish('get_icscavfrac','wrong kscavICtype value') + + END SELECT !kscavICtype + + !--- Calculate the scavenging parameter as sum over the processes: + pfrac(1:kproma,:) = pfrac_nuc(1:kproma,:) + pfrac_imp(1:kproma,:) + + !--- Confine the fraction between 0% and 100% : + pfrac(1:kproma,:) = MAX(0._dp, MIN(1._dp, pfrac(1:kproma,:))) + pfrac_nuc(1:kproma,:) = MAX(0._dp, MIN(1._dp, pfrac_nuc(1:kproma,:))) + pfrac_imp(1:kproma,:) = MAX(0._dp, MIN(1._dp, pfrac_imp(1:kproma,:))) + + END SUBROUTINE get_icscavfrac + + !! --------------------------------------------------------------------------------------- + SUBROUTINE ic_scav_nuc(kproma, kbdim, klev, krow, kwat_phase, & + ktrac_phase, kmod, pm6rp, pm6dry, pnact, pfracn,prhop1, pxtp1c_sav) + +! Grazia Frontoso, C2SM-ETHZ, 2013 - compute in-cloud size dependent +! nucleation scavenging coefficients +! from Croft et al. 2010 +! +!SF: output of this subroutine: sfnuc +! sfnuc is defined in the whole module instead of being passed as an intent(out) because +! it needs to be kept from one instance to the next + + USE mo_ham_m7_trac, ONLY: idt_nks, idt_nas, idt_ncs + !HK --> USE mo_activ, ONLY: na, idt_cdnc, idt_icnc + !--> HK + USE mo_activ, ONLY: idt_cdnc, idt_icnc + !HK --> USE mo_ham_streams, ONLY: frac, rdry, rwet + USE mo_ham_tools, ONLY: ham_m7_logtail, ham_m7_invertlogtail + USE mo_param_switches, ONLY: ncd_activ + USE mo_tracdef, ONLY: ntrac + !-->HK + !USE mo_ham_m7, ONLY: rwet_m7, rdry_m7 + !USE mo_ham_activ, ONLY: pfrac_m7, pna_m7 + !<--HK + INTEGER, INTENT(in) :: kproma, kbdim, klev, krow + INTEGER, INTENT(in) :: kwat_phase ! kwat_phase=1 --> water; kwat_phase=2 --> ice + INTEGER, INTENT(in) :: ktrac_phase ! ktrac_phase=1 --> number; ktrac_phase=2 --> mass + INTEGER, INTENT(in) :: kmod ! mode index + + REAL(dp), INTENT(in) :: pxtp1c_sav(kbdim,klev,ntrac) ! in-cloud tracer concentration as untouched by wetdep + REAL(dp), INTENT(in) :: prhop1(kbdim,klev) ! air density (t-dt) + REAL(dp), INTENT(in) :: pm6rp(kbdim,klev,nclass), pm6dry(kbdim,klev,nclass) ! m7: + REAL(dp), INTENT(in) :: pnact(kbdim,klev,nclass) !number of activated particles per mode [m-3] + REAL(dp), INTENT(in) :: pfracn(kbdim,klev,nclass) !fraction of activated particles per mode + + ! Local variables + REAL(dp) :: zxie(kbdim,klev), & ! factor for inverse error function calculation + zxtp1c(kbdim,klev,ntrac), & ! in-cloud tracer concentration + ztmp1(kbdim,klev) + + !--> HK + !REAL(dp), POINTER :: zrad_p(:,:) ! Pointer to dry or wet radius field, + ! ! as appropriate to activation scheme + REAL(dp) :: zrad_p(kbdim,klev) + + LOGICAL :: ll_trac_phase, ll1(kbdim,klev) + + ! Initialization + + !SF note: the following is M7-dependent! It could be potentially generalized + ! by replacing this condition by a true size condition + some generalized way + ! of distinguishing mixed modes from insoluble ones + ! For now, this is kept so, and size-dep nucleation scavenging is made unuseable + ! if an alternate aerosol microphysics scheme is used (e.g. SALSA) + IF (kmod < 2 .OR. kmod > 4) THEN !do nothing for non-relevant modes + sfnuc(1:kproma,:,kwat_phase,ktrac_phase,kmod) = 0._dp + RETURN + ENDIF + + IF (ncd_activ == 2) THEN + !zrad_p(:,:) = rdry_m7(:,:,kmod) ! ARG activation is based on dry radius + zrad_p(:,:) = pm6dry(:,:,kmod) ! ARG activation is based on dry radius + ELSE + !zrad_p(:,:) = rwet_m7(:,:,kmod) ! Lin & Leaitch activation is based on wet radius + zrad_p(:,:) = pm6rp(:,:,kmod) ! Lin & Leaitch activation is based on wet radius + END IF + + ! Critical radius for scavenged mode. + ! This calculation is only needed *once per mode* because it is not + ! dependent of whether this is a mass or number calculation + ! (ie not dependent on ktrac_phase) + + IF (rcritrad(1,1,kwat_phase,kmod) == UNDEF) THEN ! rcritrad calculation required + zxtp1c(1:kproma,:,:) = pxtp1c_sav(1:kproma,:,:) + zxtp1c(1:kproma,:,:) = MAX(0._dp,zxtp1c(1:kproma,:,:)) !SFnote: this should be already ensured elsewhere!! + !SF--> to cleanup + SELECT CASE(kwat_phase) + CASE(1) !liq water + + !ll1(1:kproma,:) = (zxtp1c(1:kproma,:,idt_cdnc) > zeps_mass) .AND. & + ! (pna_m7(1:kproma,:,kmod) > zeps) + ll1(1:kproma,:) = (zxtp1c(1:kproma,:,idt_cdnc) > zeps_mass) .AND. & + (pnact(1:kproma,:,kmod) > zeps) + + !--> HK: modified to use variables instead of streams + !ztmp1(1:kproma,:) = zxtp1c(1:kproma,:,idt_cdnc) * prhop1(1:kproma,:) & + ! * pfrac_m7(1:kproma,:,kmod) / MAX(pna_m7(1:kproma,:,kmod),zeps) + ztmp1(1:kproma,:) = zxtp1c(1:kproma,:,idt_cdnc) * prhop1(1:kproma,:) & + * pfracn(1:kproma,:,kmod) / MAX(pnact(1:kproma,:,kmod),zeps) + !<-- HK + + CASE(2) !ice + + ll1(1:kproma,:) = (zxtp1c(1:kproma,:,idt_icnc) > zeps_mass) + +!>>SF to refactor! (M7-dependency) + IF (kmod == 4) ztmp1(1:kproma,:) = MIN(1._dp, & + zxtp1c(1:kproma,:,idt_icnc) / (zxtp1c(1:kproma,:,idt_ncs)+zeps)) + IF (kmod == 3) ztmp1(1:kproma,:) = MIN(1._dp, & + MAX(0._dp, & + zxtp1c(1:kproma,:,idt_icnc)-zxtp1c(1:kproma,:,idt_ncs)) & + /(zxtp1c(1:kproma,:,idt_nas)+zeps)) + IF (kmod == 2) ztmp1(1:kproma,:) = MIN(1._dp, & + MAX(0._dp, & + zxtp1c(1:kproma,:,idt_icnc)-zxtp1c(1:kproma,:,idt_ncs) & + -zxtp1c(1:kproma,:,idt_nas)) & + /(zxtp1c(1:kproma,:,idt_nks)+zeps)) +!< water; kwat_phase=2 --> ice + INTEGER, INTENT(in) :: ktrac_phase ! ktrac_phase=1 --> number; ktrac_phase=2 --> mass + INTEGER, INTENT(in) :: kmod + REAL(dp), INTENT(in) :: reffi(kbdim,klev,1), reffl(kbdim,klev,1) + REAL(dp), INTENT(in) :: pxtp1c(kbdim,klev,ntrac) ! in-cloud tracer mass + REAL(dp), INTENT(in) :: prhop1(kbdim,klev) ! air density (t-dt) + + ! Local variables + + INTEGER :: jk, jl + INTEGER :: indexdropx1(kbdim,klev), indexdropx2(kbdim,klev), & + indexplatex1(kbdim,klev), indexplatex2(kbdim,klev), & + itmp1(kbdim,klev), itmp2(kbdim,klev) + + REAL(dp) :: X1(kbdim,klev), X2(kbdim,klev), & + Y1(kbdim,klev), Y2(kbdim,klev) , & + Q11(kbdim,klev), Q12(kbdim,klev) , & + Q21(kbdim,klev), Q22(kbdim,klev) + + REAL(dp) :: zscavcoefplate(kbdim,klev), & ! scavenging coefficient for plate (ice) + zscavcoefdrop(kbdim,klev), & ! scavenging coefficient for cloud droplets + zicnc(kbdim,klev) ! ice crystal number concentration [# m-3] + + LOGICAL :: ll1(kbdim,klev), ll2(kbdim,klev) + + ! Initialization + Q11(1:kproma,:) = 0._dp + Q12(1:kproma,:) = 0._dp + Q21(1:kproma,:) = 0._dp + Q22(1:kproma,:) = 0._dp + X1(1:kproma,:) = 0._dp + X2(1:kproma,:) = 0._dp + Y1(1:kproma,:) = 0._dp + Y2(1:kproma,:) = 0._dp + + zicnc(1:kproma,:) = pxtp1c(1:kproma,:,idt_icnc)*prhop1(1:kproma,:) + + ! Calculate collision rates + SELECT CASE(kwat_phase) + + CASE(1) !liq + + ll1(1:kproma,:) = (reffl(1:kproma,:,krow) > zeps) !SF#294 replaced 0. by zeps + + itmp1(1:kproma,:) = MAX(0, MIN(9,INT(FLOOR(reffl(1:kproma,:,krow)/5._dp)))) + itmp2(1:kproma,:) = MAX(0, MIN(9,INT(1._dp + FLOOR(reffl(1:kproma,:,krow)/5._dp)))) + + indexdropx1(1:kproma,:) = MERGE(itmp1(1:kproma,:), 0, ll1(1:kproma,:)) + indexdropx2(1:kproma,:) = MERGE(itmp2(1:kproma,:), 0, ll1(1:kproma,:)) + + ! Assign in-cloud impaction scavenging coefficients (droplets) + SELECT CASE(ktrac_phase) + CASE(1) ! number + DO jk=ktop,klev + DO jl=1,kproma + Q11(jl,jk) = scavdropn(indexdropx1(jl,jk),indexy1(jl,jk,ktrac_phase,kmod)) + Q12(jl,jk) = scavdropn(indexdropx2(jl,jk),indexy1(jl,jk,ktrac_phase,kmod)) + Q21(jl,jk) = scavdropn(indexdropx1(jl,jk),indexy2(jl,jk,ktrac_phase,kmod)) + Q22(jl,jk) = scavdropn(indexdropx2(jl,jk),indexy2(jl,jk,ktrac_phase,kmod)) + ENDDO + ENDDO + CASE(2) ! mass + DO jk=ktop,klev + DO jl=1,kproma + Q11(jl,jk) = scavdropm(indexdropx1(jl,jk),indexy1(jl,jk,ktrac_phase,kmod)) + Q12(jl,jk) = scavdropm(indexdropx2(jl,jk),indexy1(jl,jk,ktrac_phase,kmod)) + Q21(jl,jk) = scavdropm(indexdropx1(jl,jk),indexy2(jl,jk,ktrac_phase,kmod)) + Q22(jl,jk) = scavdropm(indexdropx2(jl,jk),indexy2(jl,jk,ktrac_phase,kmod)) + ENDDO + ENDDO + END SELECT + + DO jk=ktop,klev + DO jl=1,kproma + X1(jl,jk) = cdroprad(indexdropx1(jl,jk)) + X2(jl,jk) = cdroprad(indexdropx2(jl,jk)) + Y1(jl,jk) = caerorad(indexy1(jl,jk,ktrac_phase,kmod)) + Y2(jl,jk) = caerorad(indexy2(jl,jk,ktrac_phase,kmod)) + ENDDO + ENDDO + + CALL scavcoef_bilinterp (kproma, kbdim, klev, krow, ktop, & + reffl(:,:,krow), mr(:,:,ktrac_phase,kmod), & + X1, X2, Y1, Y2, & + Q11, Q12, Q21, Q22, & + zscavcoefdrop) + + sfimp(1:kproma,:,kwat_phase,ktrac_phase,kmod) = zscavcoefdrop(1:kproma,:) + + CASE(2) !ice + + ll1(1:kproma,:) = (zicnc(1:kproma,:) >= zeps) + + ll2(1:kproma,:) = ll1(1:kproma,:) .AND. & + (reffi(1:kproma,:,krow) < 50._dp) .AND. & + (reffi(1:kproma,:,krow) >= 1._dp) + + itmp1(1:kproma,:) = MAX(0, MIN(10,INT(FLOOR(reffi(1:kproma,:,krow)/5._dp)))) + itmp2(1:kproma,:) = MAX(0, MIN(10,INT(1._dp + FLOOR(reffi(1:kproma,:,krow)/5._dp)))) + + indexplatex1(1:kproma,:) = MERGE(itmp1(1:kproma,:), 0, ll2(1:kproma,:)) + indexplatex2(1:kproma,:) = MERGE(itmp2(1:kproma,:), 0, ll2(1:kproma,:)) + + ll2(1:kproma,:) = ll1(1:kproma,:) .AND. & + (reffi(1:kproma,:,krow) >= 50._dp) + + itmp1(1:kproma,:) = MAX(0, MIN(34,INT(8._dp+FLOOR(reffi(1:kproma,:,krow)/50._dp)))) + itmp2(1:kproma,:) = MAX(0, MIN(34,INT(9._dp + FLOOR(reffi(1:kproma,:,krow)/50._dp)))) + + indexplatex1(1:kproma,:) = MERGE(itmp1(1:kproma,:), indexplatex1(1:kproma,:), ll2(1:kproma,:)) + indexplatex2(1:kproma,:) = MERGE(itmp2(1:kproma,:), indexplatex2(1:kproma,:), ll2(1:kproma,:)) + + ! Assign in-cloud impaction scavenging coefficients (ice plates) + DO jk=ktop,klev + DO jl=1,kproma + Q11(jl,jk) = scaviceplate(indexplatex1(jl,jk),indexy1(jl,jk,ktrac_phase,kmod)) + Q12(jl,jk) = scaviceplate(indexplatex2(jl,jk),indexy1(jl,jk,ktrac_phase,kmod)) + Q21(jl,jk) = scaviceplate(indexplatex1(jl,jk),indexy2(jl,jk,ktrac_phase,kmod)) + Q22(jl,jk) = scaviceplate(indexplatex2(jl,jk),indexy2(jl,jk,ktrac_phase,kmod)) + ENDDO + ENDDO + + DO jk=ktop,klev + DO jl=1,kproma + X1(jl,jk) = cplaterad(indexplatex1(jl,jk)) + X2(jl,jk) = cplaterad(indexplatex2(jl,jk)) + Y1(jl,jk) = caerorad(indexy1(jl,jk,ktrac_phase,kmod)) + Y2(jl,jk) = caerorad(indexy2(jl,jk,ktrac_phase,kmod)) + ENDDO + ENDDO + + CALL scavcoef_bilinterp (kproma, kbdim, klev, & + krow, ktop, & + reffi(:,:,krow), mr(:,:,ktrac_phase,kmod), & + X1, X2, Y1, Y2, & + Q11, Q12, Q21, Q22, & + zscavcoefplate) + + sfimp(1:kproma,:,kwat_phase,ktrac_phase,kmod) = 1._dp - EXP(-zscavcoefplate(1:kproma,:)*1.e-6_dp & + *zicnc(1:kproma,:)*time_step_len) + + END SELECT !kwat_phase + + END SUBROUTINE ic_scav_imp + + !!---------------------------------------------------------------------------- + SUBROUTINE bc_rain(kproma, kbdim, klev, krow, ktop, kmod, & !in + ktrac_phase, kscavBCtype, & !in + pfrain) !in + + ! Below-cloud rain scavenging routine + + +!SF: output of this subroutine: sfrain +! sfrain is defined in the whole module instead of being passed as an intent(out) because +! it needs to be kept from one instance to the next + + USE mo_ham_tools, ONLY: scavcoef_bilinterp + USE mo_ham_wetdep_data, ONLY: cbcr, cscavbcrn, cscavbcrm, crainrate, caerorad + + INTEGER, INTENT(in) :: kproma, kbdim, klev, krow, ktop, kmod, kscavBCtype, ktrac_phase + REAL(dp), INTENT(in) :: pfrain(kbdim,klev) + + !local vars: + INTEGER :: jk, jl, indexbcrx1(kbdim,klev), indexbcrx2(kbdim,klev) + + LOGICAL :: ll1(1:kproma, klev) + + REAL(dp) :: ztmp1(kbdim,klev), & + X1(kbdim,klev), X2(kbdim,klev), & + Y1(kbdim,klev), Y2(kbdim,klev) , & + Q11(kbdim,klev), Q12(kbdim,klev) , & + Q21(kbdim,klev), Q22(kbdim,klev) + + SELECT CASE (kscavBCtype) + !CASE (1) ! prescribed scavenging ratio !!not implemented yet!! + !sfrain(1:kproma,:,ktrac_phase,kmod) = + + CASE (2) ! standard mode-wise scavenging ratio + + sfrain(1:kproma,:,ktrac_phase,kmod) = cbcr(kmod)*pfrain(1:kproma,:) + + CASE (3) ! aerosol size-dep scavenging coeff + + IF (sfrain(1,1,ktrac_phase,kmod) == UNDEF) THEN !calculation required! + + !>>SF #458 (replacing where statements) + ll1(1:kproma,:) = (pfrain(1:kproma,:) > 0._dp) + + ztmp1(1:kproma,:) = MERGE(pfrain(1:kproma,:), 1._dp, ll1(1:kproma,:)) !SF 1._dp is a dummy value + ztmp1(1:kproma,:) = FLOOR( 2._dp*log10( 3600._dp*ztmp1(1:kproma,:) ) + 5._dp ) + + indexbcrx1(1:kproma,:) = MERGE( & + MAX( 0, MIN( 9, INT( ztmp1(1:kproma,:) ))), & + 0, & + ll1(1:kproma,:) ) + + indexbcrx2(1:kproma,:) = MERGE( & + MAX( 0, MIN( 9, INT( 1_dp + ztmp1(1:kproma,:) ))), & + 0, & + ll1(1:kproma,:) ) + !<>SF #458 (replacing where statements) + ll1(1:kproma,:) = (pfsnow(1:kproma,:) > zeps) !SF#294 replaced 0. by zeps + + ztmp1(1:kproma,:) = (0.6_dp/0.027_dp)*pfsnow(1:kproma,:)*sfsnow(1:kproma,:,ktrac_phase,kmod) + + sfsnow(1:kproma,:,ktrac_phase,kmod) = MERGE(ztmp1(1:kproma,:), 0._dp, ll1(1:kproma,:)) + !<idt_so2, idt_so4s=>idt_so4, idt_ms4 !TB (!SF #397) + USE mo_ham_salsactl, ONLY: fn2b, in1a +#endif + USE mo_species, ONLY: speclist + USE mo_ham_species, ONLY: id_so2 + + INTEGER, INTENT(in) :: kproma, kbdim, klev + REAL(dp), INTENT(in) :: ptu(kbdim,klev) + REAL(dp), INTENT(in) :: pxtu(kbdim,klev,ntrac) + REAL(dp), INTENT(in) :: prhou(kbdim,klev) + REAL(dp), INTENT(in) :: pmlwc(kbdim,klev) + + REAL(dp), INTENT(out) :: plfrac_so2(kbdim,klev) !liquid fraction of SO2 + + !--- local variables: + LOGICAL :: ll1(kbdim, klev) + + REAL(dp) :: zqtp1(kbdim,klev), ze2(kbdim,klev), & + ze3(kbdim,klev), zfac(kbdim,klev), & + zfac4(kbdim,klev), & !!mgs(S)!! + zso4l(kbdim,klev), zso2l(kbdim,klev), & + zza(kbdim,klev), zzb(kbdim,klev), & + zzp(kbdim,klev), zzq(kbdim,klev), & + zqhp(kbdim,klev), & + zheneff(kbdim,klev), zhp(kbdim,klev), & + zhenry_so2(2) + + INTEGER :: jt, jn_idt_so4, jdx, idt_so2_loc + INTEGER, ALLOCATABLE :: idt_so4_array(:) + + !--- Calculate the solubility of SO2. Total sulfate + ! is only used to calculate the ph of cloud water: + + zhenry_so2(:) = speclist(id_so2)%henry(:) ! Henry's law constant and activation energy + + zqtp1(1:kproma,:) = 1._dp/ptu(1:kproma,:) - 1._dp/298._dp + ze2(1:kproma,:) = zhenry_so2(1)*EXP(zhenry_so2(2)*zqtp1(1:kproma,:)) + ze3(1:kproma,:) = 1.2e-02_dp*EXP(2010._dp*zqtp1(1:kproma,:)) + + !>>SF #458 (replacing where statements) + ll1(1:kproma,:) = (pmlwc(1:kproma,:) > 1.E-15_dp) + + zfac(1:kproma,:) = MERGE( & + 1000._dp/(pmlwc(1:kproma,:)*mw_so2), & + 0._dp, & + ll1(1:kproma,:) ) + + zfac4(1:kproma,:) = MERGE( & + 1000._dp/(pmlwc(1:kproma,:)*mw_so4), & + 0._dp, & + ll1(1:kproma,:) ) + !< 0) .AND. (.NOT. ANY( (idt_so4_array(:) <= 0) ))) .AND. & + ((nham_subm == HAM_M7) .OR. (nham_subm == HAM_SALSA)) ) THEN + + zso4l(1:kproma,:) = 0._dp + + DO jt=1,jn_idt_so4 + jdx = idt_so4_array(jt) + zso4l(1:kproma,:) = zso4l(1:kproma,:) + pxtu(1:kproma,:,jdx) + ENDDO + + zso4l(1:kproma,:) = zso4l(1:kproma,:) * zfac4(1:kproma,:) !!mgs(S)!! + + zso4l(1:kproma,:) = MAX(zso4l(1:kproma,:),0._dp) + + zso2l(1:kproma,:) = pxtu(1:kproma,:,idt_so2_loc)*zfac(1:kproma,:) + zso2l(1:kproma,:) = MAX(zso2l(1:kproma,:),0._dp) + + zza(1:kproma,:) = ze2(1:kproma,:)*8.2e-02_dp*ptu(1:kproma,:) & + * pmlwc(1:kproma,:)*prhou(1:kproma,:)*1.e-03_dp + + zzb(1:kproma,:) = 2.5e-06_dp + zso4l(1:kproma,:) + zzp(1:kproma,:) = ( zza(1:kproma,:)*ze3(1:kproma,:) - zzb(1:kproma,:) & + - zza(1:kproma,:)*zzb(1:kproma,:) & + ) / (1._dp+zza(1:kproma,:)) * 0.5_dp + + zzq(1:kproma,:) = - zza(1:kproma,:)*ze3(1:kproma,:) & + * (zzb(1:kproma,:)+zso2l(1:kproma,:)) / (1._dp+zza(1:kproma,:)) + + zhp(1:kproma,:) = -zzp(1:kproma,:) + SQRT(zzp(1:kproma,:)**2 - zzq(1:kproma,:)) + + zqhp(1:kproma,:) = 1._dp / zhp(1:kproma,:) + + zheneff(1:kproma,:) = 1._dp + ze3(1:kproma,:)*zqhp(1:kproma,:) + + plfrac_so2(1:kproma,:) = zza(1:kproma,:)*zheneff(1:kproma,:) + + ELSE + + plfrac_so2(1:kproma,:) = 0._dp + + END IF + + END SUBROUTINE ham_conv_lfraq_so2 + + !----------------------------------------------------------------------- + + SUBROUTINE prep_ham_mode_init(kproma, kbdim, klev) + + ! Sylvaine Ferrachat Sept. 2013: + ! + ! This routine initializes all the necessary variables that are mode-dependent + ! and not tracer-dependent. + ! This allows to reduce significantly the computing load by computing these variables + ! only once per mode and phase (number or mass), when relevant. + ! + ! 'Mode' is meant to be general here (not M7-dependent) + + INTEGER, INTENT(in) :: kproma, kbdim, klev + + !INTEGER, POINTER :: indexy1(kbdim,klev,2,nclass) => NULL() + !INTEGER, POINTER :: indexy2(kbdim,klev,2,nclass) => NULL() ! indices necessary for lookup table searches + ! ! shape: (kbdim,klev,numb/mass,mode) + + !REAL(dp), POINTER :: mr(kbdim,klev,2,nclass) => NULL() ! median radius (wet) + ! ! shape: (kbdim,klev, numb/mass, mode) + !REAL(dp), POINTER :: rcritrad(kbdim,klev,2,nclass) => NULL() ! critical radius [m] (ie min bound) for scav of mode + ! ! shape: (kbdim,klev, liq/ice, mode) + !REAL(dp), POINTER :: sfnuc(kbdim,klev,2,2,nclass) => NULL() ! in-cloud, nucleation scavenging fraction + ! ! shape: (kbdim,klev, liq/ice, numb/mass, mode) + !REAL(dp), POINTER :: sfimp(kbdim,klev,2,2,nclass) => NULL() ! in-cloud, impaction scavenging fraction + ! ! shape: (kbdim,klev, liq/ice, numb/mass, mode) + !REAL(dp), POINTER :: sfrain(kbdim,klev,2,nclass) => NULL() ! below-cloud, scavenging fraction by rain + ! ! shape: (kbdim,klev,numb/mass, mode) + !REAL(dp), POINTER :: sfsnow(kbdim,klev,2,nclass) => NULL() ! below-cloud, scavenging fraction by snow + ! ! (kbdim,klev,numb/mass, mode) + !indexy1(1:kproma,:,:) = UNDEF + !indexy2(1:kproma,:,:) = UNDEF + !mr(1:kproma,:,:) = UNDEF + !rcritrad(1:kproma,:,:) = UNDEF + + !sfnuc(1:kproma,:,:,:) = UNDEF + !sfimp(1:kproma,:,:,:) = UNDEF + + !sfrain(1:kproma,:,:) = UNDEF + !sfrain(1:kproma,:,:) = UNDEF + CALL init_var(kproma, kbdim, klev, indexy1) + CALL init_var(kproma, kbdim, klev, indexy2) + CALL init_var(kproma, kbdim, klev, mr) + CALL init_var(kproma, kbdim, klev, rcritrad) + CALL init_var(kproma, kbdim, klev, sfnuc) + CALL init_var(kproma, kbdim, klev, sfimp) + CALL init_var(kproma, kbdim, klev, sfrain) + CALL init_var(kproma, kbdim, klev, sfsnow) + + END SUBROUTINE prep_ham_mode_init + + !----------------------------------------------------------------------- + + SUBROUTINE init_var_r_4d(kproma, kbdim, klev, pvar) + + ! small utility to allocate, if relevant, and initialize + + INTEGER, INTENT(in) :: kproma, kbdim, klev + REAL(dp), POINTER :: pvar(:,:,:,:) + !REAL(dp), allocatable :: pvar(:,:,:,:) + + IF (.NOT. ASSOCIATED(pvar)) ALLOCATE(pvar(kbdim,klev,2,nclass)) + pvar(1:kproma,:,:,:) = UNDEF + + END SUBROUTINE init_var_r_4d + + !----------------------------------------------------------------------- + + SUBROUTINE init_var_r_5d(kproma, kbdim, klev, pvar) + + ! small utility to allocate, if relevant, and initialize + + INTEGER, INTENT(in) :: kproma, kbdim, klev + REAL(dp), POINTER :: pvar(:,:,:,:,:) + !REAL(dp), allocatable :: pvar(:,:,:,:,:) + + IF (.NOT. ASSOCIATED(pvar)) ALLOCATE(pvar(kbdim,klev,2,2,nclass)) + pvar(1:kproma,:,:,:,:) = UNDEF + + END SUBROUTINE init_var_r_5d + + !----------------------------------------------------------------------- + + SUBROUTINE init_var_i_4d(kproma, kbdim, klev, kvar) + + ! small utility to allocate, if relevant, and initialize + + INTEGER, INTENT(in) :: kproma, kbdim, klev + INTEGER, POINTER:: kvar(:,:,:,:) + + IF (.NOT. ASSOCIATED(kvar)) ALLOCATE(kvar(kbdim,klev,2,nclass)) + kvar(1:kproma,:,:,:) = UNDEF + + END SUBROUTINE init_var_i_4d + + !----------------------------------------------------------------------- + SUBROUTINE ham_setscav(kt, & + kscavICtype, kscavBCtype, & + kscavICphase, kscavBCphase) + + ! this routine sets the wetdep flags to handle: + ! - in-cloud and/or below-cloud scav + ! - water and/or ice scav (resp. rain and/or snow) + + ! kscavICtype = 0 no in-cloud scavenging + ! 1 prescribed in-cloud scavenging params + ! 2 standard in-cloud scav params (mode-wise step function) + ! 3 aerosol-size dependent in-cloud params + ! + ! kscavBCtype = 0 no below-cloud scavenging + ! 1 prescribed below-cloud scavenging params + ! 2 standard below-cloud scav params (mode-wise step function) + ! 3 aerosol-size dependent in-cloud params + ! + ! kscavICphase = 0 no in-cloud scavenging + ! 1 in-cloud water-only scavenging + ! 2 in-cloud ice-only scavenging + ! 3 in-cloud water+ice scavenging + ! + ! kscavBCphase = 0 no below-cloud scavenging + ! 1 below-cloud rain-only scavenging + ! 2 below-cloud snow-only scavenging + ! 3 below-cloud rain+snow scavenging + + USE mo_tracdef, ONLY: trlist + !SF demo - deactivated USE mo_species, ONLY: speclist + + INTEGER, INTENT(in) :: kt + INTEGER, INTENT(out) :: kscavICtype, kscavBCtype, & + kscavICphase, kscavBCphase + + ! local variables + !SF demo - deactivated INTEGER :: ispec + + !--- Normal setting: + + SELECT CASE (trlist%ti(kt)%nwetdep) + CASE(0) !wet dep off + kscavICtype = 0 + kscavBCtype = 0 + kscavICphase = 0 + kscavBCphase = 0 + CASE(1) !standard scavenging (mode-wise step function params) + kscavICtype = 2 + kscavBCtype = 2 + kscavICphase = 3 + kscavBCphase = 3 + CASE(2) !standard in-cloud scavenging + aerosol size-dependent below-cloud scavenging + kscavICtype = 2 + kscavBCtype = 3 + kscavICphase = 3 + kscavBCphase = 3 + CASE(3) !aerosol size-dependent in-cloud + below-cloud scavenging + kscavICtype = 3 + kscavBCtype = 3 + kscavICphase = 3 + kscavBCphase = 3 +! CASE(4) !Define here your own additional setup +! kscavICtype = +! kscavBCtype = +! kscavICphase = +! kscavBCphase = + CASE default + CALL finish('ham_setscav','wrong nwetdep setting') + END SELECT + + !--- Tracer- or species-specific setting (demo -activate it if necessary-) + +! ispec = trlist%ti(kt)%spid +! IF (speclist(ispec)%shortname == 'BC') THEN +! kscavICtype = +! kscavBCtype = +! kscavICphase = +! kscavBCphase = +! ENDIF + + END SUBROUTINE ham_setscav + +END MODULE mo_ham_wetdep diff --git a/ifs-source/arpifs/phys_ec/mo_ham_wetdep_data.F90 b/ifs-source/arpifs/phys_ec/mo_ham_wetdep_data.F90 new file mode 100644 index 00000000..2d688eb6 --- /dev/null +++ b/ifs-source/arpifs/phys_ec/mo_ham_wetdep_data.F90 @@ -0,0 +1,1098 @@ +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! \filename +!! mo_ham_wetdep_data.f90 +!! +!! \brief +!! mo_ham_wetdep_data contains variables and switches for the HAM aerosol wet-deposition +!! +!! \author Philip Stier (Caltech) +!! +!! \responsible_coder +!! Sylvaine Ferrachat, sylvaine.ferrachat@env.ethz.ch +!! +!! \revision_history +!! -# Philip Stier (Caltech) - original code (2006-07) +!! -# Grazia Frontoso, C2SM-ETHZ (2013) +!! new lookup table for plate +!! (in-cloud size dependent wetscavenging) +!! provided by Betty Croft +!! -# Sylvaine Ferrachat (ETH Zurich) (2015-02) +!! Generalization to handle both M7 and SALSA +!! +!! \limitations +!! None +!! +!! \details +!! None +!! +!! \bibliographic_references +!! - Stier P. et al, The aerosol-climate model ECHAM5-HAM, ACP, 5, 1125–1156, 2005 +!! +!! \belongs_to +!! HAMMOZ +!! +!! SPDX-License-Identifier: BSD-3-Clause +!! Copyright (c) 2021 hammoz + +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +MODULE mo_ham_wetdep_data + + USE mo_kind, ONLY: dp + + IMPLICIT NONE + + INTEGER, PARAMETER :: izrain = 9 + INTEGER, PARAMETER :: izsnow = 1 + INTEGER, PARAMETER :: izrad = 60 + INTEGER, PARAMETER :: izcloud = 10 + INTEGER, PARAMETER :: iziceplate = 34 + + !--- 1) Prescribed in-cloud scaventing ratios: + + !--- 1.1) Stratiform: + + !--- Liquid water clouds: + REAL(dp), ALLOCATABLE :: csr_strat_wat(:) + + !--- Mixed phase clouds: + REAL(dp), ALLOCATABLE :: csr_strat_mix(:) + + !--- Ice Clouds: + REAL(dp), ALLOCATABLE :: csr_strat_ice(:) + + !--- 1.2) Convective Clouds: + REAL(dp), ALLOCATABLE :: csr_conv(:) + + !--- 2) Prescribed below-cloud scavenging ratios: + + !--- Mean mass scavenging coefficients normalized by rain-rate [kg m-2]: + + ! Rain: + REAL(dp), ALLOCATABLE :: cbcr(:) + + ! Snow: + REAL(dp), ALLOCATABLE :: cbcs(:) + + !--- + + INTEGER :: ja + REAL(dp) :: scaviceplate(0:iziceplate,0:izrad) + + !--- Below-cloud scavenging look-up tables ----------------------------- + + REAL(dp), PARAMETER :: crainrate(0:izrain) = (/ & + 0.0000E+00_dp, 0.2778E-05_dp, 0.8784E-05_dp, 0.2778E-04_dp, & + 0.8784E-04_dp, 0.2778E-03_dp, 0.8784E-03_dp, 0.2778E-02_dp, & + 0.8784E-02_dp, 0.2778E-01_dp /) + + REAL(dp), PARAMETER :: caerorad(0:izrad) = (/ & + 0.0000E+00_dp, 0.1000E-03_dp, 0.1260E-03_dp, 0.1587E-03_dp, & + 0.2000E-03_dp, 0.2520E-03_dp, 0.3175E-03_dp, 0.4000E-03_dp, & + 0.5040E-03_dp, 0.6350E-03_dp, 0.8000E-03_dp, 0.1008E-02_dp, & + 0.1270E-02_dp, 0.1600E-02_dp, 0.2016E-02_dp, 0.2540E-02_dp, & + 0.3200E-02_dp, 0.4032E-02_dp, 0.5080E-02_dp, 0.6400E-02_dp, & + 0.8063E-02_dp, 0.1016E-01_dp, 0.1280E-01_dp, 0.1613E-01_dp, & + 0.2032E-01_dp, 0.2560E-01_dp, 0.3225E-01_dp, 0.4064E-01_dp, & + 0.5120E-01_dp, 0.6451E-01_dp, 0.8127E-01_dp, 0.1024E+00_dp, & + 0.1290E+00_dp, 0.1625E+00_dp, 0.2048E+00_dp, 0.2580E+00_dp, & + 0.3251E+00_dp, 0.4096E+00_dp, 0.5161E+00_dp, 0.6502E+00_dp, & + 0.8192E+00_dp, 0.1032E+01_dp, 0.1300E+01_dp, 0.1638E+01_dp, & + 0.2064E+01_dp, 0.2601E+01_dp, 0.3277E+01_dp, 0.4129E+01_dp, & + 0.5202E+01_dp, 0.6554E+01_dp, 0.8257E+01_dp, 0.1040E+02_dp, & + 0.1311E+02_dp, 0.1651E+02_dp, 0.2081E+02_dp, 0.2621E+02_dp, & + 0.3303E+02_dp, 0.4161E+02_dp, 0.5243E+02_dp, 0.6606E+02_dp, & + 0.8323E+02_dp /) + + REAL(DP) :: csnowcolleff(0:1,0:60) = RESHAPE ( (/ & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.1624E+00_dp, 0.1196E+00_dp, 0.8811E-01_dp, 0.6496E-01_dp, 0.4792E-01_dp, 0.3540E-01_dp, 0.2617E-01_dp, & + 0.1938E-01_dp, 0.1438E-01_dp, 0.1070E-01_dp, 0.7978E-02_dp, 0.5973E-02_dp, 0.4493E-02_dp, 0.3401E-02_dp, 0.2593E-02_dp, & + 0.1993E-02_dp, 0.1545E-02_dp, 0.1207E-02_dp, 0.9507E-03_dp, 0.7539E-03_dp, 0.6022E-03_dp, 0.4846E-03_dp, 0.3931E-03_dp, & + 0.3947E-03_dp, 0.3970E-03_dp, 0.4009E-03_dp, 0.4069E-03_dp, 0.4165E-03_dp, 0.4317E-03_dp, 0.4559E-03_dp, 0.4942E-03_dp, & + 0.5551E-03_dp, 0.6518E-03_dp, 0.8053E-03_dp, 0.9211E-01_dp, 0.4867E+00_dp, 0.7042E+00_dp, 0.8248E+00_dp, 0.8955E+00_dp, & + 0.9393E+00_dp, 0.9684E+00_dp, 0.9902E+00_dp, 0.1000E+01_dp, 0.1000E+01_dp, 0.1000E+01_dp, 0.1000E+01_dp, 0.1000E+01_dp, & + 0.1000E+01_dp, 0.1000E+01_dp, 0.1000E+01_dp, 0.1000E+01_dp, 0.1000E+01_dp, 0.1000E+01_dp, 0.1000E+01_dp, 0.1000E+01_dp, & + 0.1000E+01_dp, 0.1000E+01_dp, 0.1000E+01_dp, 0.1000E+01_dp, 0.1000E+01_dp /), (/2, 61/), order = (/2, 1/) ) + + REAL(DP) :: cscavbcrn(0:9,0:60) = RESHAPE( (/ & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.7446E-18_dp, 0.6828E-17_dp, 0.5371E-16_dp, 0.3786E-15_dp, 0.2391E-14_dp, 0.1354E-13_dp, 0.6875E-13_dp, & + 0.3131E-12_dp, 0.1279E-11_dp, 0.4693E-11_dp, 0.1546E-10_dp, 0.4575E-10_dp, 0.1218E-09_dp, 0.2917E-09_dp, 0.6296E-09_dp, & + 0.1226E-08_dp, 0.2156E-08_dp, 0.3433E-08_dp, 0.4963E-08_dp, 0.6531E-08_dp, 0.7856E-08_dp, 0.8684E-08_dp, 0.8875E-08_dp, & + 0.8455E-08_dp, 0.7580E-08_dp, 0.6467E-08_dp, 0.5316E-08_dp, 0.4262E-08_dp, 0.3377E-08_dp, 0.2681E-08_dp, 0.2190E-08_dp, & + 0.1971E-08_dp, 0.2267E-08_dp, 0.3747E-08_dp, 0.7981E-08_dp, 0.1822E-07_dp, 0.4038E-07_dp, 0.8402E-07_dp, 0.1625E-06_dp, & + 0.2921E-06_dp, 0.4886E-06_dp, 0.7640E-06_dp, 0.1121E-05_dp, 0.1553E-05_dp, 0.2041E-05_dp, 0.2560E-05_dp, 0.3083E-05_dp, & + 0.3588E-05_dp, 0.4060E-05_dp, 0.4490E-05_dp, 0.4879E-05_dp, 0.5236E-05_dp, 0.5580E-05_dp, 0.5957E-05_dp, 0.6476E-05_dp, & + 0.7375E-05_dp, 0.9155E-05_dp, 0.1280E-04_dp, 0.2020E-04_dp, 0.3479E-04_dp, & + 0.0000E+00_dp, 0.1568E-17_dp, 0.1389E-16_dp, 0.1093E-15_dp, 0.7702E-15_dp, 0.4865E-14_dp, 0.2755E-13_dp, 0.1399E-12_dp, & + 0.6372E-12_dp, 0.2604E-11_dp, 0.9551E-11_dp, 0.3146E-10_dp, 0.9313E-10_dp, 0.2479E-09_dp, 0.5939E-09_dp, 0.1282E-08_dp, & + 0.2496E-08_dp, 0.4392E-08_dp, 0.6995E-08_dp, 0.1011E-07_dp, 0.1331E-07_dp, 0.1602E-07_dp, 0.1772E-07_dp, 0.1812E-07_dp, & + 0.1727E-07_dp, 0.1550E-07_dp, 0.1324E-07_dp, 0.1089E-07_dp, 0.8744E-08_dp, 0.6943E-08_dp, 0.5545E-08_dp, 0.4617E-08_dp, & + 0.4412E-08_dp, 0.5727E-08_dp, 0.1066E-07_dp, 0.2402E-07_dp, 0.5545E-07_dp, 0.1221E-06_dp, 0.2510E-06_dp, 0.4787E-06_dp, & + 0.8478E-06_dp, 0.1399E-05_dp, 0.2158E-05_dp, 0.3129E-05_dp, 0.4286E-05_dp, 0.5578E-05_dp, 0.6937E-05_dp, 0.8293E-05_dp, & + 0.9586E-05_dp, 0.1077E-04_dp, 0.1184E-04_dp, 0.1278E-04_dp, 0.1361E-04_dp, 0.1436E-04_dp, 0.1508E-04_dp, 0.1588E-04_dp, & + 0.1703E-04_dp, 0.1913E-04_dp, 0.2338E-04_dp, 0.3218E-04_dp, 0.4992E-04_dp, & + 0.0000E+00_dp, 0.3177E-17_dp, 0.2816E-16_dp, 0.2215E-15_dp, 0.1561E-14_dp, 0.9864E-14_dp, 0.5586E-13_dp, 0.2837E-12_dp, & + 0.1292E-11_dp, 0.5280E-11_dp, 0.1937E-10_dp, 0.6380E-10_dp, 0.1889E-09_dp, 0.5028E-09_dp, 0.1205E-08_dp, 0.2601E-08_dp, & + 0.5065E-08_dp, 0.8912E-08_dp, 0.1420E-07_dp, 0.2053E-07_dp, 0.2703E-07_dp, 0.3255E-07_dp, 0.3600E-07_dp, 0.3684E-07_dp, & + 0.3513E-07_dp, 0.3154E-07_dp, 0.2696E-07_dp, 0.2220E-07_dp, 0.1785E-07_dp, 0.1420E-07_dp, 0.1142E-07_dp, 0.9752E-08_dp, & + 0.1001E-07_dp, 0.1466E-07_dp, 0.3000E-07_dp, 0.7005E-07_dp, 0.1626E-06_dp, 0.3558E-06_dp, 0.7235E-06_dp, 0.1363E-05_dp, & + 0.2384E-05_dp, 0.3885E-05_dp, 0.5923E-05_dp, 0.8495E-05_dp, 0.1152E-04_dp, 0.1487E-04_dp, 0.1837E-04_dp, 0.2182E-04_dp, & + 0.2510E-04_dp, 0.2807E-04_dp, 0.3071E-04_dp, 0.3299E-04_dp, 0.3496E-04_dp, 0.3666E-04_dp, 0.3816E-04_dp, 0.3960E-04_dp, & + 0.4124E-04_dp, 0.4376E-04_dp, 0.4859E-04_dp, 0.5863E-04_dp, 0.7945E-04_dp, & + 0.0000E+00_dp, 0.6413E-17_dp, 0.5685E-16_dp, 0.4472E-15_dp, 0.3152E-14_dp, 0.1991E-13_dp, 0.1128E-12_dp, 0.5726E-12_dp, & + 0.2608E-11_dp, 0.1066E-10_dp, 0.3910E-10_dp, 0.1288E-09_dp, 0.3814E-09_dp, 0.1015E-08_dp, 0.2433E-08_dp, 0.5252E-08_dp, & + 0.1023E-07_dp, 0.1800E-07_dp, 0.2869E-07_dp, 0.4149E-07_dp, 0.5464E-07_dp, 0.6579E-07_dp, 0.7281E-07_dp, 0.7452E-07_dp, & + 0.7110E-07_dp, 0.6387E-07_dp, 0.5461E-07_dp, 0.4500E-07_dp, 0.3622E-07_dp, 0.2890E-07_dp, 0.2344E-07_dp, 0.2061E-07_dp, & + 0.2288E-07_dp, 0.3739E-07_dp, 0.8200E-07_dp, 0.1961E-06_dp, 0.4561E-06_dp, 0.9932E-06_dp, 0.2003E-05_dp, 0.3740E-05_dp, & + 0.6479E-05_dp, 0.1045E-04_dp, 0.1579E-04_dp, 0.2245E-04_dp, 0.3022E-04_dp, 0.3873E-04_dp, 0.4756E-04_dp, 0.5626E-04_dp, & + 0.6445E-04_dp, 0.7186E-04_dp, 0.7834E-04_dp, 0.8387E-04_dp, 0.8853E-04_dp, 0.9243E-04_dp, 0.9573E-04_dp, 0.9861E-04_dp, & + 0.1013E-03_dp, 0.1047E-03_dp, 0.1101E-03_dp, 0.1211E-03_dp, 0.1443E-03_dp, & + 0.0000E+00_dp, 0.1288E-16_dp, 0.1142E-15_dp, 0.8980E-15_dp, 0.6330E-14_dp, 0.3999E-13_dp, 0.2265E-12_dp, 0.1150E-11_dp, & + 0.5238E-11_dp, 0.2141E-10_dp, 0.7853E-10_dp, 0.2587E-09_dp, 0.7661E-09_dp, 0.2040E-08_dp, 0.4887E-08_dp, 0.1055E-07_dp, & + 0.2055E-07_dp, 0.3617E-07_dp, 0.5764E-07_dp, 0.8338E-07_dp, 0.1098E-06_dp, 0.1323E-06_dp, 0.1464E-06_dp, 0.1499E-06_dp, & + 0.1431E-06_dp, 0.1286E-06_dp, 0.1100E-06_dp, 0.9067E-07_dp, 0.7304E-07_dp, 0.5844E-07_dp, 0.4786E-07_dp, 0.4349E-07_dp, & + 0.5227E-07_dp, 0.9372E-07_dp, 0.2162E-06_dp, 0.5251E-06_dp, 0.1223E-05_dp, 0.2654E-05_dp, 0.5325E-05_dp, 0.9880E-05_dp, & + 0.1700E-04_dp, 0.2724E-04_dp, 0.4086E-04_dp, 0.5772E-04_dp, 0.7724E-04_dp, 0.9851E-04_dp, 0.1205E-03_dp, 0.1420E-03_dp, & + 0.1623E-03_dp, 0.1805E-03_dp, 0.1963E-03_dp, 0.2096E-03_dp, 0.2205E-03_dp, 0.2295E-03_dp, 0.2368E-03_dp, 0.2429E-03_dp, & + 0.2481E-03_dp, 0.2531E-03_dp, 0.2596E-03_dp, 0.2712E-03_dp, 0.2956E-03_dp, & + 0.0000E+00_dp, 0.2569E-16_dp, 0.2278E-15_dp, 0.1792E-14_dp, 0.1263E-13_dp, 0.7980E-13_dp, 0.4519E-12_dp, 0.2295E-11_dp, & + 0.1045E-10_dp, 0.4272E-10_dp, 0.1567E-09_dp, 0.5164E-09_dp, 0.1529E-08_dp, 0.4071E-08_dp, 0.9755E-08_dp, 0.2106E-07_dp, & + 0.4103E-07_dp, 0.7222E-07_dp, 0.1151E-06_dp, 0.1665E-06_dp, 0.2193E-06_dp, 0.2642E-06_dp, 0.2925E-06_dp, 0.2995E-06_dp, & + 0.2859E-06_dp, 0.2570E-06_dp, 0.2199E-06_dp, 0.1814E-06_dp, 0.1463E-06_dp, 0.1174E-06_dp, 0.9713E-07_dp, 0.9147E-07_dp, & + 0.1187E-06_dp, 0.2297E-06_dp, 0.5496E-06_dp, 0.1349E-05_dp, 0.3148E-05_dp, 0.6815E-05_dp, 0.1363E-04_dp, 0.2517E-04_dp, & + 0.4312E-04_dp, 0.6879E-04_dp, 0.1027E-03_dp, 0.1445E-03_dp, 0.1926E-03_dp, 0.2448E-03_dp, 0.2985E-03_dp, 0.3511E-03_dp, & + 0.4003E-03_dp, 0.4445E-03_dp, 0.4826E-03_dp, 0.5142E-03_dp, 0.5397E-03_dp, 0.5600E-03_dp, 0.5762E-03_dp, 0.5892E-03_dp, & + 0.5998E-03_dp, 0.6088E-03_dp, 0.6177E-03_dp, 0.6298E-03_dp, 0.6534E-03_dp, & + 0.0000E+00_dp, 0.5088E-16_dp, 0.4513E-15_dp, 0.3550E-14_dp, 0.2503E-13_dp, 0.1581E-12_dp, 0.8954E-12_dp, 0.4547E-11_dp, & + 0.2071E-10_dp, 0.8465E-10_dp, 0.3106E-09_dp, 0.1023E-08_dp, 0.3030E-08_dp, 0.8067E-08_dp, 0.1933E-07_dp, 0.4174E-07_dp, & + 0.8131E-07_dp, 0.1431E-06_dp, 0.2281E-06_dp, 0.3300E-06_dp, 0.4348E-06_dp, 0.5238E-06_dp, 0.5799E-06_dp, 0.5939E-06_dp, & + 0.5672E-06_dp, 0.5099E-06_dp, 0.4365E-06_dp, 0.3602E-06_dp, 0.2907E-06_dp, 0.2339E-06_dp, 0.1958E-06_dp, 0.1914E-06_dp, & + 0.2669E-06_dp, 0.5501E-06_dp, 0.1353E-05_dp, 0.3349E-05_dp, 0.7822E-05_dp, 0.1692E-04_dp, 0.3375E-04_dp, 0.6221E-04_dp, & + 0.1063E-03_dp, 0.1691E-03_dp, 0.2518E-03_dp, 0.3531E-03_dp, 0.4694E-03_dp, 0.5953E-03_dp, 0.7244E-03_dp, 0.8506E-03_dp, & + 0.9686E-03_dp, 0.1074E-02_dp, 0.1164E-02_dp, 0.1239E-02_dp, 0.1298E-02_dp, 0.1343E-02_dp, 0.1379E-02_dp, 0.1406E-02_dp, & + 0.1428E-02_dp, 0.1445E-02_dp, 0.1460E-02_dp, 0.1473E-02_dp, 0.1493E-02_dp, & + 0.0000E+00_dp, 0.9998E-16_dp, 0.8871E-15_dp, 0.6979E-14_dp, 0.4919E-13_dp, 0.3108E-12_dp, 0.1760E-11_dp, 0.8938E-11_dp, & + 0.4071E-10_dp, 0.1664E-09_dp, 0.6105E-09_dp, 0.2012E-08_dp, 0.5956E-08_dp, 0.1586E-07_dp, 0.3800E-07_dp, 0.8206E-07_dp, & + 0.1599E-06_dp, 0.2814E-06_dp, 0.4485E-06_dp, 0.6490E-06_dp, 0.8551E-06_dp, 0.1030E-05_dp, 0.1141E-05_dp, 0.1168E-05_dp, & + 0.1116E-05_dp, 0.1003E-05_dp, 0.8591E-06_dp, 0.7092E-06_dp, 0.5729E-06_dp, 0.4625E-06_dp, 0.3920E-06_dp, 0.3983E-06_dp, & + 0.5941E-06_dp, 0.1290E-05_dp, 0.3240E-05_dp, 0.8071E-05_dp, 0.1887E-04_dp, 0.4080E-04_dp, 0.8132E-04_dp, 0.1497E-03_dp, & + 0.2553E-03_dp, 0.4054E-03_dp, 0.6027E-03_dp, 0.8438E-03_dp, 0.1120E-02_dp, 0.1418E-02_dp, 0.1723E-02_dp, 0.2021E-02_dp, & + 0.2299E-02_dp, 0.2547E-02_dp, 0.2758E-02_dp, 0.2930E-02_dp, 0.3064E-02_dp, 0.3165E-02_dp, 0.3242E-02_dp, 0.3299E-02_dp, & + 0.3343E-02_dp, 0.3377E-02_dp, 0.3402E-02_dp, 0.3420E-02_dp, 0.3434E-02_dp, & + 0.0000E+00_dp, 0.1947E-15_dp, 0.1729E-14_dp, 0.1360E-13_dp, 0.9585E-13_dp, 0.6055E-12_dp, 0.3429E-11_dp, 0.1742E-10_dp, & + 0.7933E-10_dp, 0.3242E-09_dp, 0.1190E-08_dp, 0.3920E-08_dp, 0.1161E-07_dp, 0.3090E-07_dp, 0.7406E-07_dp, 0.1599E-06_dp, & + 0.3115E-06_dp, 0.5484E-06_dp, 0.8742E-06_dp, 0.1265E-05_dp, 0.1667E-05_dp, 0.2008E-05_dp, 0.2224E-05_dp, 0.2278E-05_dp, & + 0.2176E-05_dp, 0.1957E-05_dp, 0.1676E-05_dp, 0.1384E-05_dp, 0.1119E-05_dp, 0.9063E-06_dp, 0.7783E-06_dp, 0.8226E-06_dp, & + 0.1306E-05_dp, 0.2961E-05_dp, 0.7564E-05_dp, 0.1894E-04_dp, 0.4434E-04_dp, 0.9585E-04_dp, 0.1909E-03_dp, 0.3512E-03_dp, & + 0.5985E-03_dp, 0.9495E-03_dp, 0.1410E-02_dp, 0.1972E-02_dp, 0.2615E-02_dp, 0.3308E-02_dp, 0.4017E-02_dp, 0.4707E-02_dp, & + 0.5350E-02_dp, 0.5922E-02_dp, 0.6406E-02_dp, 0.6798E-02_dp, 0.7100E-02_dp, 0.7323E-02_dp, 0.7485E-02_dp, 0.7603E-02_dp, & + 0.7689E-02_dp, 0.7753E-02_dp, 0.7798E-02_dp, 0.7822E-02_dp, 0.7822E-02_dp /), & + (/10, 61/), ORDER = (/2, 1/) ) + + REAL(DP) :: cscavbcrm(0:9,0:60) = RESHAPE( (/ & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.6821E-12_dp, 0.1941E-11_dp, 0.5172E-11_dp, 0.1341E-10_dp, 0.3358E-10_dp, 0.8062E-10_dp, 0.1839E-09_dp, & + 0.3945E-09_dp, 0.7881E-09_dp, 0.1454E-08_dp, 0.2459E-08_dp, 0.3799E-08_dp, 0.5352E-08_dp, 0.6883E-08_dp, 0.8108E-08_dp, & + 0.8789E-08_dp, 0.8827E-08_dp, 0.8280E-08_dp, 0.7329E-08_dp, 0.6190E-08_dp, 0.5052E-08_dp, 0.4035E-08_dp, 0.3194E-08_dp, & + 0.2545E-08_dp, 0.2108E-08_dp, 0.1979E-08_dp, 0.2473E-08_dp, 0.4419E-08_dp, 0.9706E-08_dp, 0.2212E-07_dp, 0.4839E-07_dp, & + 0.9899E-07_dp, 0.1881E-06_dp, 0.3323E-06_dp, 0.5468E-06_dp, 0.8418E-06_dp, 0.1218E-05_dp, 0.1665E-05_dp, 0.2162E-05_dp, & + 0.2685E-05_dp, 0.3206E-05_dp, 0.3704E-05_dp, 0.4166E-05_dp, 0.4586E-05_dp, 0.4967E-05_dp, 0.5318E-05_dp, 0.5664E-05_dp, & + 0.6062E-05_dp, 0.6643E-05_dp, 0.7693E-05_dp, 0.9803E-05_dp, 0.1413E-04_dp, 0.2285E-04_dp, 0.3993E-04_dp, 0.7236E-04_dp, & + 0.1321E-03_dp, 0.2387E-03_dp, 0.4225E-03_dp, 0.7260E-03_dp, 0.1202E-02_dp, & + 0.0000E+00_dp, 0.1436E-11_dp, 0.3950E-11_dp, 0.1053E-10_dp, 0.2728E-10_dp, 0.6834E-10_dp, 0.1641E-09_dp, 0.3743E-09_dp, & + 0.8031E-09_dp, 0.1605E-08_dp, 0.2961E-08_dp, 0.5010E-08_dp, 0.7740E-08_dp, 0.1091E-07_dp, 0.1403E-07_dp, 0.1654E-07_dp, & + 0.1794E-07_dp, 0.1802E-07_dp, 0.1692E-07_dp, 0.1499E-07_dp, 0.1267E-07_dp, 0.1035E-07_dp, 0.8281E-08_dp, 0.6572E-08_dp, & + 0.5277E-08_dp, 0.4486E-08_dp, 0.4538E-08_dp, 0.6453E-08_dp, 0.1282E-07_dp, 0.2937E-07_dp, 0.6731E-07_dp, 0.1460E-06_dp, & + 0.2948E-06_dp, 0.5522E-06_dp, 0.9613E-06_dp, 0.1560E-05_dp, 0.2370E-05_dp, 0.3389E-05_dp, 0.4584E-05_dp, 0.5898E-05_dp, & + 0.7263E-05_dp, 0.8609E-05_dp, 0.9880E-05_dp, 0.1104E-04_dp, 0.1208E-04_dp, 0.1299E-04_dp, 0.1380E-04_dp, 0.1453E-04_dp, & + 0.1525E-04_dp, 0.1611E-04_dp, 0.1741E-04_dp, 0.1988E-04_dp, 0.2494E-04_dp, 0.3537E-04_dp, 0.5624E-04_dp, 0.9656E-04_dp, & + 0.1717E-03_dp, 0.3068E-03_dp, 0.5403E-03_dp, 0.9265E-03_dp, 0.1533E-02_dp, & + 0.0000E+00_dp, 0.2912E-11_dp, 0.8009E-11_dp, 0.2134E-10_dp, 0.5533E-10_dp, 0.1386E-09_dp, 0.3328E-09_dp, 0.7592E-09_dp, & + 0.1629E-08_dp, 0.3256E-08_dp, 0.6008E-08_dp, 0.1017E-07_dp, 0.1571E-07_dp, 0.2214E-07_dp, 0.2850E-07_dp, 0.3359E-07_dp, & + 0.3645E-07_dp, 0.3664E-07_dp, 0.3442E-07_dp, 0.3051E-07_dp, 0.2581E-07_dp, 0.2111E-07_dp, 0.1691E-07_dp, 0.1346E-07_dp, & + 0.1091E-07_dp, 0.9584E-08_dp, 0.1057E-07_dp, 0.1699E-07_dp, 0.3654E-07_dp, 0.8592E-07_dp, 0.1971E-06_dp, 0.4243E-06_dp, & + 0.8472E-06_dp, 0.1568E-05_dp, 0.2695E-05_dp, 0.4321E-05_dp, 0.6489E-05_dp, 0.9180E-05_dp, 0.1230E-04_dp, 0.1570E-04_dp, & + 0.1920E-04_dp, 0.2263E-04_dp, 0.2584E-04_dp, 0.2873E-04_dp, 0.3128E-04_dp, 0.3349E-04_dp, 0.3539E-04_dp, 0.3703E-04_dp, & + 0.3850E-04_dp, 0.3995E-04_dp, 0.4173E-04_dp, 0.4462E-04_dp, 0.5036E-04_dp, 0.6233E-04_dp, 0.8698E-04_dp, 0.1358E-03_dp, & + 0.2285E-03_dp, 0.3973E-03_dp, 0.6914E-03_dp, 0.1180E-02_dp, 0.1947E-02_dp, & + 0.0000E+00_dp, 0.5877E-11_dp, 0.1617E-10_dp, 0.4309E-10_dp, 0.1117E-09_dp, 0.2798E-09_dp, 0.6720E-09_dp, 0.1533E-08_dp, & + 0.3290E-08_dp, 0.6576E-08_dp, 0.1214E-07_dp, 0.2054E-07_dp, 0.3174E-07_dp, 0.4475E-07_dp, 0.5760E-07_dp, 0.6792E-07_dp, & + 0.7371E-07_dp, 0.7413E-07_dp, 0.6966E-07_dp, 0.6178E-07_dp, 0.5230E-07_dp, 0.4280E-07_dp, 0.3432E-07_dp, 0.2741E-07_dp, & + 0.2248E-07_dp, 0.2053E-07_dp, 0.2479E-07_dp, 0.4427E-07_dp, 0.1008E-06_dp, 0.2409E-06_dp, 0.5527E-06_dp, 0.1182E-05_dp, & + 0.2341E-05_dp, 0.4292E-05_dp, 0.7308E-05_dp, 0.1160E-04_dp, 0.1726E-04_dp, 0.2421E-04_dp, 0.3220E-04_dp, 0.4083E-04_dp, & + 0.4966E-04_dp, 0.5827E-04_dp, 0.6630E-04_dp, 0.7349E-04_dp, 0.7975E-04_dp, 0.8506E-04_dp, 0.8952E-04_dp, 0.9327E-04_dp, & + 0.9645E-04_dp, 0.9925E-04_dp, 0.1020E-03_dp, 0.1057E-03_dp, 0.1120E-03_dp, 0.1252E-03_dp, 0.1529E-03_dp, 0.2098E-03_dp, & + 0.3208E-03_dp, 0.5270E-03_dp, 0.8913E-03_dp, 0.1501E-02_dp, 0.2465E-02_dp, & + 0.0000E+00_dp, 0.1180E-10_dp, 0.3247E-10_dp, 0.8654E-10_dp, 0.2244E-09_dp, 0.5620E-09_dp, 0.1350E-08_dp, 0.3080E-08_dp, & + 0.6609E-08_dp, 0.1321E-07_dp, 0.2438E-07_dp, 0.4126E-07_dp, 0.6379E-07_dp, 0.8994E-07_dp, 0.1158E-06_dp, 0.1365E-06_dp, & + 0.1482E-06_dp, 0.1491E-06_dp, 0.1402E-06_dp, 0.1244E-06_dp, 0.1053E-06_dp, 0.8626E-07_dp, 0.6925E-07_dp, 0.5551E-07_dp, & + 0.4611E-07_dp, 0.4395E-07_dp, 0.5801E-07_dp, 0.1128E-06_dp, 0.2672E-06_dp, 0.6459E-06_dp, 0.1482E-05_dp, 0.3156E-05_dp, & + 0.6214E-05_dp, 0.1132E-04_dp, 0.1914E-04_dp, 0.3018E-04_dp, 0.4460E-04_dp, 0.6216E-04_dp, 0.8219E-04_dp, 0.1037E-03_dp, & + 0.1257E-03_dp, 0.1470E-03_dp, 0.1668E-03_dp, 0.1845E-03_dp, 0.1997E-03_dp, 0.2124E-03_dp, 0.2228E-03_dp, 0.2313E-03_dp, & + 0.2383E-03_dp, 0.2442E-03_dp, 0.2493E-03_dp, 0.2545E-03_dp, 0.2617E-03_dp, 0.2754E-03_dp, 0.3048E-03_dp, 0.3673E-03_dp, & + 0.4942E-03_dp, 0.7375E-03_dp, 0.1177E-02_dp, 0.1924E-02_dp, 0.3116E-02_dp, & + 0.0000E+00_dp, 0.2354E-10_dp, 0.6480E-10_dp, 0.1727E-09_dp, 0.4478E-09_dp, 0.1122E-08_dp, 0.2694E-08_dp, 0.6147E-08_dp, & + 0.1319E-07_dp, 0.2637E-07_dp, 0.4867E-07_dp, 0.8238E-07_dp, 0.1274E-06_dp, 0.1796E-06_dp, 0.2312E-06_dp, 0.2727E-06_dp, & + 0.2961E-06_dp, 0.2980E-06_dp, 0.2802E-06_dp, 0.2486E-06_dp, 0.2107E-06_dp, 0.1726E-06_dp, 0.1388E-06_dp, 0.1116E-06_dp, & + 0.9408E-07_dp, 0.9382E-07_dp, 0.1345E-06_dp, 0.2799E-06_dp, 0.6821E-06_dp, 0.1661E-05_dp, 0.3811E-05_dp, 0.8097E-05_dp, & + 0.1588E-04_dp, 0.2881E-04_dp, 0.4850E-04_dp, 0.7613E-04_dp, 0.1120E-03_dp, 0.1555E-03_dp, 0.2048E-03_dp, 0.2575E-03_dp, & + 0.3112E-03_dp, 0.3632E-03_dp, 0.4114E-03_dp, 0.4542E-03_dp, 0.4907E-03_dp, 0.5208E-03_dp, 0.5450E-03_dp, 0.5642E-03_dp, & + 0.5795E-03_dp, 0.5919E-03_dp, 0.6020E-03_dp, 0.6108E-03_dp, 0.6200E-03_dp, 0.6339E-03_dp, 0.6623E-03_dp, 0.7253E-03_dp, & + 0.8604E-03_dp, 0.1132E-02_dp, 0.1640E-02_dp, 0.2526E-02_dp, 0.3965E-02_dp, & + 0.0000E+00_dp, 0.4664E-10_dp, 0.1284E-09_dp, 0.3422E-09_dp, 0.8872E-09_dp, 0.2223E-08_dp, 0.5339E-08_dp, 0.1218E-07_dp, & + 0.2614E-07_dp, 0.5226E-07_dp, 0.9646E-07_dp, 0.1633E-06_dp, 0.2524E-06_dp, 0.3560E-06_dp, 0.4584E-06_dp, 0.5408E-06_dp, & + 0.5873E-06_dp, 0.5910E-06_dp, 0.5558E-06_dp, 0.4933E-06_dp, 0.4181E-06_dp, 0.3428E-06_dp, 0.2758E-06_dp, 0.2229E-06_dp, & + 0.1907E-06_dp, 0.1993E-06_dp, 0.3079E-06_dp, 0.6766E-06_dp, 0.1684E-05_dp, 0.4126E-05_dp, 0.9469E-05_dp, 0.2009E-04_dp, & + 0.3933E-04_dp, 0.7116E-04_dp, 0.1195E-03_dp, 0.1870E-03_dp, 0.2743E-03_dp, 0.3797E-03_dp, 0.4988E-03_dp, 0.6260E-03_dp, & + 0.7550E-03_dp, 0.8797E-03_dp, 0.9950E-03_dp, 0.1097E-02_dp, 0.1184E-02_dp, 0.1254E-02_dp, 0.1310E-02_dp, 0.1353E-02_dp, & + 0.1386E-02_dp, 0.1412E-02_dp, 0.1432E-02_dp, 0.1449E-02_dp, 0.1463E-02_dp, 0.1477E-02_dp, 0.1501E-02_dp, 0.1555E-02_dp, & + 0.1682E-02_dp, 0.1958E-02_dp, 0.2507E-02_dp, 0.3505E-02_dp, 0.5173E-02_dp, & + 0.0000E+00_dp, 0.9165E-10_dp, 0.2524E-09_dp, 0.6727E-09_dp, 0.1744E-08_dp, 0.4369E-08_dp, 0.1049E-07_dp, 0.2395E-07_dp, & + 0.5139E-07_dp, 0.1027E-06_dp, 0.1896E-06_dp, 0.3210E-06_dp, 0.4964E-06_dp, 0.7000E-06_dp, 0.9015E-06_dp, 0.1064E-05_dp, & + 0.1155E-05_dp, 0.1163E-05_dp, 0.1093E-05_dp, 0.9708E-06_dp, 0.8230E-06_dp, 0.6750E-06_dp, 0.5439E-06_dp, 0.4413E-06_dp, & + 0.3841E-06_dp, 0.4207E-06_dp, 0.6961E-06_dp, 0.1598E-05_dp, 0.4043E-05_dp, 0.9949E-05_dp, 0.2285E-04_dp, 0.4845E-04_dp, & + 0.9472E-04_dp, 0.1711E-03_dp, 0.2868E-03_dp, 0.4481E-03_dp, 0.6564E-03_dp, 0.9069E-03_dp, 0.1189E-02_dp, 0.1491E-02_dp, & + 0.1795E-02_dp, 0.2090E-02_dp, 0.2361E-02_dp, 0.2600E-02_dp, 0.2802E-02_dp, 0.2965E-02_dp, 0.3091E-02_dp, 0.3186E-02_dp, & + 0.3257E-02_dp, 0.3310E-02_dp, 0.3352E-02_dp, 0.3384E-02_dp, 0.3407E-02_dp, 0.3423E-02_dp, 0.3438E-02_dp, 0.3468E-02_dp, & + 0.3559E-02_dp, 0.3793E-02_dp, 0.4316E-02_dp, 0.5344E-02_dp, 0.7155E-02_dp, & + 0.0000E+00_dp, 0.1785E-09_dp, 0.4918E-09_dp, 0.1311E-08_dp, 0.3398E-08_dp, 0.8514E-08_dp, 0.2045E-07_dp, 0.4666E-07_dp, & + 0.1002E-06_dp, 0.2002E-06_dp, 0.3696E-06_dp, 0.6257E-06_dp, 0.9674E-06_dp, 0.1364E-05_dp, 0.1757E-05_dp, 0.2073E-05_dp, & + 0.2252E-05_dp, 0.2267E-05_dp, 0.2132E-05_dp, 0.1893E-05_dp, 0.1605E-05_dp, 0.1317E-05_dp, 0.1063E-05_dp, 0.8663E-06_dp, & + 0.7675E-06_dp, 0.8813E-06_dp, 0.1551E-05_dp, 0.3690E-05_dp, 0.9457E-05_dp, 0.2336E-04_dp, 0.5368E-04_dp, 0.1138E-03_dp, & + 0.2224E-03_dp, 0.4015E-03_dp, 0.6723E-03_dp, 0.1049E-02_dp, 0.1535E-02_dp, 0.2119E-02_dp, 0.2777E-02_dp, 0.3477E-02_dp, & + 0.4184E-02_dp, 0.4866E-02_dp, 0.5493E-02_dp, 0.6045E-02_dp, 0.6508E-02_dp, 0.6878E-02_dp, 0.7160E-02_dp, 0.7367E-02_dp, & + 0.7517E-02_dp, 0.7626E-02_dp, 0.7706E-02_dp, 0.7766E-02_dp, 0.7805E-02_dp, 0.7824E-02_dp, 0.7819E-02_dp, 0.7801E-02_dp, & + 0.7804E-02_dp, 0.7912E-02_dp, 0.8282E-02_dp, 0.9168E-02_dp, 0.1091E-01_dp /), & + (/10, 61/), ORDER = (/2, 1/) ) + + !--- In-cloud impaction scavenging look-up tables ----------------------------- + +! Water + + REAL(dp), PARAMETER :: cdroprad(0:izcloud) = (/ & + 0._dp, 5.0_dp, 10.0_dp, 15.0_dp, 20.0_dp, 25.0_dp, & + 0.0_dp, 35.0_dp, 40.0_dp, 45.0_dp, 50.0_dp /) + + REAL(DP) :: scavdropm(0:9,0:60) = RESHAPE( (/ & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, & + 0.0000E+00_dp, 0.2877E-10_dp, 0.7852E-10_dp, 0.2096E-09_dp, 0.5446E-09_dp, & + 0.1368E-08_dp, 0.3294E-08_dp, 0.7538E-08_dp, 0.1623E-07_dp, 0.3258E-07_dp, & + 0.6041E-07_dp, 0.1028E-06_dp, 0.1599E-06_dp, 0.2269E-06_dp, 0.2944E-06_dp, & + 0.3502E-06_dp, 0.3837E-06_dp, 0.3897E-06_dp, 0.3697E-06_dp, 0.3308E-06_dp, & + 0.2821E-06_dp, 0.2317E-06_dp, 0.1854E-06_dp, 0.1459E-06_dp, 0.1140E-06_dp, & + 0.8885E-07_dp, 0.6941E-07_dp, 0.5446E-07_dp, 0.4293E-07_dp, 0.3395E-07_dp, & + 0.2687E-07_dp, 0.2118E-07_dp, 0.1658E-07_dp, 0.1294E-07_dp, 0.1035E-07_dp, & + 0.9278E-08_dp, 0.1111E-07_dp, 0.2035E-07_dp, 0.5237E-07_dp, 0.1588E-06_dp, & + 0.5058E-06_dp, 0.1597E-05_dp, 0.4873E-05_dp, 0.1419E-04_dp, 0.3933E-04_dp, & + 0.1037E-03_dp, 0.2606E-03_dp, 0.6271E-03_dp, 0.1450E-02_dp, 0.3241E-02_dp, & + 0.7029E-02_dp, 0.1485E-01_dp, 0.3066E-01_dp, 0.6198E-01_dp, 0.1228E+00_dp, & + 0.2383E+00_dp, 0.4527E+00_dp, 0.8396E+00_dp, 0.1514E+01_dp, 0.2641E+01_dp, & + 0.4429E+01_dp, & + 0.0000E+00_dp, 0.1282E-09_dp, 0.3491E-09_dp, 0.9300E-09_dp, 0.2410E-08_dp, & + 0.6034E-08_dp, 0.1448E-07_dp, 0.3302E-07_dp, 0.7079E-07_dp, 0.1413E-06_dp, & + 0.2605E-06_dp, 0.4402E-06_dp, 0.6791E-06_dp, 0.9551E-06_dp, 0.1226E-05_dp, & + 0.1440E-05_dp, 0.1555E-05_dp, 0.1555E-05_dp, 0.1450E-05_dp, 0.1274E-05_dp, & + 0.1066E-05_dp, 0.8605E-06_dp, 0.6781E-06_dp, 0.5276E-06_dp, 0.4090E-06_dp, & + 0.3177E-06_dp, 0.2481E-06_dp, 0.1952E-06_dp, 0.1545E-06_dp, 0.1230E-06_dp, & + 0.9853E-07_dp, 0.8011E-07_dp, 0.6856E-07_dp, 0.6734E-07_dp, 0.8412E-07_dp, & + 0.1326E-06_dp, 0.2352E-06_dp, 0.4275E-06_dp, 0.7723E-06_dp, 0.1407E-05_dp, & + 0.2688E-05_dp, 0.5594E-05_dp, 0.1274E-04_dp, 0.3078E-04_dp, 0.7565E-04_dp, & + 0.1836E-03_dp, 0.4339E-03_dp, 0.9936E-03_dp, 0.2207E-02_dp, 0.4774E-02_dp, & + 0.1009E-01_dp, 0.2091E-01_dp, 0.4256E-01_dp, 0.8516E-01_dp, 0.1675E+00_dp, & + 0.3235E+00_dp, 0.6122E+00_dp, 0.1132E+01_dp, 0.2037E+01_dp, 0.3548E+01_dp, & + 0.5940E+01_dp, & + 0.0000E+00_dp, 0.2591E-09_dp, 0.7056E-09_dp, 0.1879E-08_dp, 0.4869E-08_dp, & + 0.1219E-07_dp, 0.2924E-07_dp, 0.6664E-07_dp, 0.1428E-06_dp, 0.2851E-06_dp, & + 0.5252E-06_dp, 0.8870E-06_dp, 0.1368E-05_dp, 0.1922E-05_dp, 0.2465E-05_dp, & + 0.2894E-05_dp, 0.3125E-05_dp, 0.3122E-05_dp, 0.2911E-05_dp, 0.2557E-05_dp, & + 0.2141E-05_dp, 0.1730E-05_dp, 0.1366E-05_dp, 0.1065E-05_dp, 0.8282E-06_dp, & + 0.6455E-06_dp, 0.5061E-06_dp, 0.4000E-06_dp, 0.3194E-06_dp, 0.2602E-06_dp, & + 0.2231E-06_dp, 0.2179E-06_dp, 0.2703E-06_dp, 0.4318E-06_dp, 0.7934E-06_dp, & + 0.1497E-05_dp, 0.2744E-05_dp, 0.4791E-05_dp, 0.7944E-05_dp, 0.1257E-04_dp, & + 0.1923E-04_dp, 0.2905E-04_dp, 0.4493E-04_dp, 0.7431E-04_dp, 0.1354E-03_dp, & + 0.2699E-03_dp, 0.5689E-03_dp, 0.1223E-02_dp, 0.2623E-02_dp, 0.5549E-02_dp, & + 0.1155E-01_dp, 0.2364E-01_dp, 0.4766E-01_dp, 0.9462E-01_dp, 0.1849E+00_dp, & + 0.3553E+00_dp, 0.6698E+00_dp, 0.1235E+01_dp, 0.2217E+01_dp, 0.3853E+01_dp, & + 0.6442E+01_dp, & + 0.0000E+00_dp, 0.4068E-09_dp, 0.1108E-08_dp, 0.2951E-08_dp, 0.7646E-08_dp, & + 0.1914E-07_dp, 0.4593E-07_dp, 0.1047E-06_dp, 0.2244E-06_dp, 0.4478E-06_dp, & + 0.8251E-06_dp, 0.1394E-05_dp, 0.2149E-05_dp, 0.3021E-05_dp, 0.3876E-05_dp, & + 0.4551E-05_dp, 0.4916E-05_dp, 0.4915E-05_dp, 0.4586E-05_dp, 0.4033E-05_dp, & + 0.3381E-05_dp, 0.2736E-05_dp, 0.2164E-05_dp, 0.1691E-05_dp, 0.1318E-05_dp, & + 0.1030E-05_dp, 0.8106E-06_dp, 0.6463E-06_dp, 0.5300E-06_dp, 0.4682E-06_dp, & + 0.4935E-06_dp, 0.6874E-06_dp, 0.1215E-05_dp, 0.2370E-05_dp, 0.4613E-05_dp, & + 0.8589E-05_dp, 0.1510E-04_dp, 0.2505E-04_dp, 0.3928E-04_dp, 0.5852E-04_dp, & + 0.8336E-04_dp, 0.1146E-03_dp, 0.1543E-03_dp, 0.2089E-03_dp, 0.2958E-03_dp, & + 0.4577E-03_dp, 0.7904E-03_dp, 0.1498E-02_dp, 0.2996E-02_dp, 0.6117E-02_dp, & + 0.1250E-01_dp, 0.2532E-01_dp, 0.5065E-01_dp, 0.9997E-01_dp, 0.1944E+00_dp, & + 0.3719E+00_dp, 0.6986E+00_dp, 0.1284E+01_dp, 0.2300E+01_dp, 0.3990E+01_dp, & + 0.6662E+01_dp, & + 0.0000E+00_dp, 0.5740E-09_dp, 0.1563E-08_dp, 0.4165E-08_dp, 0.1079E-07_dp, & + 0.2701E-07_dp, 0.6482E-07_dp, 0.1477E-06_dp, 0.3167E-06_dp, 0.6322E-06_dp, & + 0.1165E-05_dp, 0.1968E-05_dp, 0.3036E-05_dp, 0.4269E-05_dp, 0.5478E-05_dp, & + 0.6436E-05_dp, 0.6955E-05_dp, 0.6958E-05_dp, 0.6497E-05_dp, 0.5719E-05_dp, & + 0.4801E-05_dp, 0.3891E-05_dp, 0.3082E-05_dp, 0.2412E-05_dp, 0.1883E-05_dp, & + 0.1476E-05_dp, 0.1169E-05_dp, 0.9491E-06_dp, 0.8236E-06_dp, 0.8448E-06_dp, & + 0.1156E-05_dp, 0.2071E-05_dp, 0.4178E-05_dp, 0.8452E-05_dp, 0.1632E-04_dp, & + 0.2963E-04_dp, 0.5042E-04_dp, 0.8065E-04_dp, 0.1218E-03_dp, 0.1747E-03_dp, & + 0.2391E-03_dp, 0.3145E-03_dp, 0.4010E-03_dp, 0.5026E-03_dp, 0.6339E-03_dp, & + 0.8353E-03_dp, 0.1202E-02_dp, 0.1943E-02_dp, 0.3491E-02_dp, 0.6712E-02_dp, & + 0.1331E-01_dp, 0.2656E-01_dp, 0.5272E-01_dp, 0.1035E+00_dp, 0.2005E+00_dp, & + 0.3824E+00_dp, 0.7163E+00_dp, 0.1314E+01_dp, 0.2348E+01_dp, 0.4067E+01_dp, & + 0.6782E+01_dp, & + 0.0000E+00_dp, 0.7693E-09_dp, 0.2096E-08_dp, 0.5582E-08_dp, 0.1446E-07_dp, & + 0.3621E-07_dp, 0.8690E-07_dp, 0.1981E-06_dp, 0.4247E-06_dp, 0.8479E-06_dp, & + 0.1563E-05_dp, 0.2641E-05_dp, 0.4074E-05_dp, 0.5730E-05_dp, 0.7356E-05_dp, & + 0.8646E-05_dp, 0.9348E-05_dp, 0.9358E-05_dp, 0.8745E-05_dp, 0.7705E-05_dp, & + 0.6475E-05_dp, 0.5253E-05_dp, 0.4167E-05_dp, 0.3267E-05_dp, 0.2555E-05_dp, & + 0.2010E-05_dp, 0.1607E-05_dp, 0.1343E-05_dp, 0.1266E-05_dp, 0.1544E-05_dp, & + 0.2577E-05_dp, 0.5199E-05_dp, 0.1091E-04_dp, 0.2208E-04_dp, 0.4204E-04_dp, & + 0.7475E-04_dp, 0.1243E-03_dp, 0.1939E-03_dp, 0.2854E-03_dp, 0.3985E-03_dp, & + 0.5311E-03_dp, 0.6798E-03_dp, 0.8416E-03_dp, 0.1017E-02_dp, 0.1217E-02_dp, & + 0.1477E-02_dp, 0.1890E-02_dp, 0.2662E-02_dp, 0.4234E-02_dp, 0.7491E-02_dp, & + 0.1418E-01_dp, 0.2767E-01_dp, 0.5434E-01_dp, 0.1061E+00_dp, 0.2049E+00_dp, & + 0.3898E+00_dp, 0.7285E+00_dp, 0.1333E+01_dp, 0.2380E+01_dp, 0.4116E+01_dp, & + 0.6856E+01_dp, & + 0.0000E+00_dp, 0.9995E-09_dp, 0.2722E-08_dp, 0.7252E-08_dp, 0.1879E-07_dp, & + 0.4705E-07_dp, 0.1129E-06_dp, 0.2575E-06_dp, 0.5520E-06_dp, 0.1102E-05_dp, & + 0.2032E-05_dp, 0.3434E-05_dp, 0.5299E-05_dp, 0.7455E-05_dp, 0.9575E-05_dp, & + 0.1126E-04_dp, 0.1218E-04_dp, 0.1220E-04_dp, 0.1141E-04_dp, 0.1006E-04_dp, & + 0.8461E-05_dp, 0.6872E-05_dp, 0.5458E-05_dp, 0.4285E-05_dp, 0.3359E-05_dp, & + 0.2653E-05_dp, 0.2147E-05_dp, 0.1862E-05_dp, 0.1932E-05_dp, 0.2743E-05_dp, & + 0.5180E-05_dp, 0.1101E-04_dp, 0.2334E-04_dp, 0.4694E-04_dp, 0.8818E-04_dp, & + 0.1544E-03_dp, 0.2523E-03_dp, 0.3868E-03_dp, 0.5589E-03_dp, 0.7659E-03_dp, & + 0.1002E-02_dp, 0.1259E-02_dp, 0.1529E-02_dp, 0.1808E-02_dp, 0.2105E-02_dp, & + 0.2448E-02_dp, 0.2926E-02_dp, 0.3739E-02_dp, 0.5326E-02_dp, 0.8581E-02_dp, & + 0.1528E-01_dp, 0.2886E-01_dp, 0.5581E-01_dp, 0.1082E+00_dp, 0.2083E+00_dp, & + 0.3953E+00_dp, 0.7376E+00_dp, 0.1348E+01_dp, 0.2402E+01_dp, 0.4151E+01_dp, & + 0.6908E+01_dp, & + 0.0000E+00_dp, 0.1268E-08_dp, 0.3454E-08_dp, 0.9202E-08_dp, 0.2385E-07_dp, & + 0.5971E-07_dp, 0.1433E-06_dp, 0.3268E-06_dp, 0.7007E-06_dp, 0.1399E-05_dp, & + 0.2580E-05_dp, 0.4361E-05_dp, 0.6731E-05_dp, 0.9472E-05_dp, 0.1217E-04_dp, & + 0.1431E-04_dp, 0.1549E-04_dp, 0.1552E-04_dp, 0.1453E-04_dp, 0.1282E-04_dp, & + 0.1079E-04_dp, 0.8774E-05_dp, 0.6976E-05_dp, 0.5485E-05_dp, 0.4308E-05_dp, & + 0.3419E-05_dp, 0.2806E-05_dp, 0.2538E-05_dp, 0.2895E-05_dp, 0.4624E-05_dp, & + 0.9394E-05_dp, 0.2046E-04_dp, 0.4339E-04_dp, 0.8658E-04_dp, 0.1609E-03_dp, & + 0.2783E-03_dp, 0.4492E-03_dp, 0.6797E-03_dp, 0.9693E-03_dp, 0.1311E-02_dp, & + 0.1691E-02_dp, 0.2096E-02_dp, 0.2512E-02_dp, 0.2931E-02_dp, 0.3355E-02_dp, & + 0.3810E-02_dp, 0.4377E-02_dp, 0.5249E-02_dp, 0.6854E-02_dp, 0.1009E-01_dp, & + 0.1675E-01_dp, 0.3030E-01_dp, 0.5735E-01_dp, 0.1101E+00_dp, 0.2110E+00_dp, & + 0.3996E+00_dp, 0.7446E+00_dp, 0.1359E+01_dp, 0.2420E+01_dp, 0.4178E+01_dp, & + 0.6946E+01_dp, & + 0.0000E+00_dp, 0.1577E-08_dp, 0.4295E-08_dp, 0.1144E-07_dp, 0.2966E-07_dp, & + 0.7426E-07_dp, 0.1783E-06_dp, 0.4065E-06_dp, 0.8717E-06_dp, 0.1741E-05_dp, & + 0.3210E-05_dp, 0.5427E-05_dp, 0.8378E-05_dp, 0.1179E-04_dp, 0.1515E-04_dp, & + 0.1783E-04_dp, 0.1930E-04_dp, 0.1935E-04_dp, 0.1812E-04_dp, 0.1600E-04_dp, & + 0.1348E-04_dp, 0.1097E-04_dp, 0.8730E-05_dp, 0.6873E-05_dp, 0.5410E-05_dp, & + 0.4315E-05_dp, 0.3596E-05_dp, 0.3398E-05_dp, 0.4227E-05_dp, 0.7372E-05_dp, & + 0.1565E-04_dp, 0.3445E-04_dp, 0.7289E-04_dp, 0.1444E-03_dp, 0.2659E-03_dp, & + 0.4557E-03_dp, 0.7285E-03_dp, 0.1092E-02_dp, 0.1541E-02_dp, 0.2064E-02_dp, & + 0.2636E-02_dp, 0.3236E-02_dp, 0.3841E-02_dp, 0.4437E-02_dp, 0.5023E-02_dp, & + 0.5622E-02_dp, 0.6306E-02_dp, 0.7258E-02_dp, 0.8895E-02_dp, 0.1210E-01_dp, & + 0.1868E-01_dp, 0.3213E-01_dp, 0.5911E-01_dp, 0.1120E+00_dp, 0.2133E+00_dp, & + 0.4031E+00_dp, 0.7501E+00_dp, 0.1368E+01_dp, 0.2434E+01_dp, 0.4198E+01_dp, & + 0.6976E+01_dp, & + 0.0000E+00_dp, 0.1926E-08_dp, 0.5247E-08_dp, 0.1398E-07_dp, 0.3623E-07_dp, & + 0.9073E-07_dp, 0.2178E-06_dp, 0.4966E-06_dp, 0.1065E-05_dp, 0.2128E-05_dp, & + 0.3923E-05_dp, 0.6634E-05_dp, 0.1024E-04_dp, 0.1442E-04_dp, 0.1853E-04_dp, & + 0.2181E-04_dp, 0.2362E-04_dp, 0.2370E-04_dp, 0.2220E-04_dp, 0.1961E-04_dp, & + 0.1653E-04_dp, 0.1346E-04_dp, 0.1072E-04_dp, 0.8451E-05_dp, 0.6666E-05_dp, & + 0.5344E-05_dp, 0.4525E-05_dp, 0.4470E-05_dp, 0.6002E-05_dp, 0.1117E-04_dp, & + 0.2436E-04_dp, 0.5390E-04_dp, 0.1136E-03_dp, 0.2235E-03_dp, 0.4086E-03_dp, & + 0.6948E-03_dp, 0.1102E-02_dp, 0.1639E-02_dp, 0.2298E-02_dp, 0.3053E-02_dp, & + 0.3872E-02_dp, 0.4718E-02_dp, 0.5558E-02_dp, 0.6374E-02_dp, 0.7161E-02_dp, & + 0.7936E-02_dp, 0.8768E-02_dp, 0.9829E-02_dp, 0.1152E-01_dp, 0.1470E-01_dp, & + 0.2117E-01_dp, 0.3445E-01_dp, 0.6126E-01_dp, 0.1141E+00_dp, 0.2156E+00_dp, & + 0.4061E+00_dp, 0.7546E+00_dp, 0.1375E+01_dp, 0.2445E+01_dp, 0.4215E+01_dp, & + 0.6999E+01_dp/), & + (/10, 61/), ORDER = (/2, 1/) ) + + REAL(DP) :: scavdropn(0:9,0:60) = RESHAPE( (/ & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, & + 0.0000E+00_dp, 0.3119E-16_dp, 0.2740E-15_dp, 0.2157E-14_dp, 0.1522E-13_dp, & + 0.9626E-13_dp, 0.5458E-12_dp, 0.2775E-11_dp, 0.1266E-10_dp, 0.5184E-10_dp, & + 0.1905E-09_dp, 0.6292E-09_dp, 0.1868E-08_dp, 0.4988E-08_dp, 0.1199E-07_dp, & + 0.2600E-07_dp, 0.5087E-07_dp, 0.8999E-07_dp, 0.1442E-06_dp, 0.2100E-06_dp, & + 0.2788E-06_dp, 0.3385E-06_dp, 0.3781E-06_dp, 0.3907E-06_dp, 0.3765E-06_dp, & + 0.3413E-06_dp, 0.2941E-06_dp, 0.2435E-06_dp, 0.1958E-06_dp, 0.1546E-06_dp, & + 0.1209E-06_dp, 0.9427E-07_dp, 0.7359E-07_dp, 0.5767E-07_dp, 0.4541E-07_dp, & + 0.3590E-07_dp, 0.2841E-07_dp, 0.2243E-07_dp, 0.1759E-07_dp, 0.1372E-07_dp, & + 0.1086E-07_dp, 0.9349E-08_dp, 0.1026E-07_dp, 0.1697E-07_dp, 0.4095E-07_dp, & + 0.1210E-06_dp, 0.3835E-06_dp, 0.1218E-05_dp, 0.3750E-05_dp, 0.1105E-04_dp, & + 0.3099E-04_dp, 0.8266E-04_dp, 0.2101E-03_dp, 0.5106E-03_dp, 0.1192E-02_dp, & + 0.2684E-02_dp, 0.5859E-02_dp, 0.1245E-01_dp, 0.2585E-01_dp, 0.5251E-01_dp, & + 0.1045E+00_dp, & + 0.0000E+00_dp, 0.1400E-15_dp, 0.1229E-14_dp, 0.9668E-14_dp, 0.6813E-13_dp, & + 0.4303E-12_dp, 0.2436E-11_dp, 0.1237E-10_dp, 0.5632E-10_dp, 0.2301E-09_dp, & + 0.8437E-09_dp, 0.2778E-08_dp, 0.8220E-08_dp, 0.2187E-07_dp, 0.5236E-07_dp, & + 0.1129E-06_dp, 0.2197E-06_dp, 0.3860E-06_dp, 0.6140E-06_dp, 0.8861E-06_dp, & + 0.1164E-05_dp, 0.1396E-05_dp, 0.1538E-05_dp, 0.1565E-05_dp, 0.1483E-05_dp, & + 0.1320E-05_dp, 0.1116E-05_dp, 0.9080E-06_dp, 0.7189E-06_dp, 0.5605E-06_dp, & + 0.4346E-06_dp, 0.3372E-06_dp, 0.2630E-06_dp, 0.2065E-06_dp, 0.1633E-06_dp, & + 0.1298E-06_dp, 0.1038E-06_dp, 0.8394E-07_dp, 0.7056E-07_dp, 0.6637E-07_dp, & + 0.7787E-07_dp, 0.1172E-06_dp, 0.2043E-06_dp, 0.3709E-06_dp, 0.6710E-06_dp, & + 0.1216E-05_dp, 0.2289E-05_dp, 0.4656E-05_dp, 0.1040E-04_dp, 0.2487E-04_dp, & + 0.6108E-04_dp, 0.1490E-03_dp, 0.3545E-03_dp, 0.8179E-03_dp, 0.1830E-02_dp, & + 0.3981E-02_dp, 0.8459E-02_dp, 0.1761E-01_dp, 0.3598E-01_dp, 0.7229E-01_dp, & + 0.1428E+00_dp, & + 0.0000E+00_dp, 0.2832E-15_dp, 0.2486E-14_dp, 0.1955E-13_dp, 0.1378E-12_dp, & + 0.8702E-12_dp, 0.4926E-11_dp, 0.2500E-10_dp, 0.1138E-09_dp, 0.4649E-09_dp, & + 0.1705E-08_dp, 0.5612E-08_dp, 0.1660E-07_dp, 0.4415E-07_dp, 0.1057E-06_dp, & + 0.2278E-06_dp, 0.4429E-06_dp, 0.7780E-06_dp, 0.1237E-05_dp, 0.1784E-05_dp, & + 0.2341E-05_dp, 0.2807E-05_dp, 0.3090E-05_dp, 0.3143E-05_dp, 0.2977E-05_dp, & + 0.2650E-05_dp, 0.2242E-05_dp, 0.1825E-05_dp, 0.1447E-05_dp, 0.1131E-05_dp, & + 0.8794E-06_dp, 0.6847E-06_dp, 0.5360E-06_dp, 0.4227E-06_dp, 0.3366E-06_dp, & + 0.2724E-06_dp, 0.2296E-06_dp, 0.2153E-06_dp, 0.2504E-06_dp, 0.3793E-06_dp, & + 0.6824E-06_dp, 0.1289E-05_dp, 0.2385E-05_dp, 0.4215E-05_dp, 0.7074E-05_dp, & + 0.1131E-04_dp, 0.1742E-04_dp, 0.2632E-04_dp, 0.4032E-04_dp, 0.6538E-04_dp, & + 0.1163E-03_dp, 0.2275E-03_dp, 0.4749E-03_dp, 0.1019E-02_dp, 0.2189E-02_dp, & + 0.4648E-02_dp, 0.9712E-02_dp, 0.1996E-01_dp, 0.4038E-01_dp, 0.8046E-01_dp, & + 0.1579E+00_dp, & + 0.0000E+00_dp, 0.4448E-15_dp, 0.3905E-14_dp, 0.3071E-13_dp, 0.2164E-12_dp, & + 0.1367E-11_dp, 0.7736E-11_dp, 0.3927E-10_dp, 0.1788E-09_dp, 0.7302E-09_dp, & + 0.2677E-08_dp, 0.8813E-08_dp, 0.2607E-07_dp, 0.6934E-07_dp, 0.1660E-06_dp, & + 0.3578E-06_dp, 0.6958E-06_dp, 0.1222E-05_dp, 0.1943E-05_dp, 0.2803E-05_dp, & + 0.3680E-05_dp, 0.4414E-05_dp, 0.4861E-05_dp, 0.4947E-05_dp, 0.4689E-05_dp, & + 0.4178E-05_dp, 0.3539E-05_dp, 0.2885E-05_dp, 0.2292E-05_dp, 0.1795E-05_dp, & + 0.1398E-05_dp, 0.1092E-05_dp, 0.8574E-06_dp, 0.6810E-06_dp, 0.5533E-06_dp, & + 0.4768E-06_dp, 0.4763E-06_dp, 0.6188E-06_dp, 0.1046E-05_dp, 0.2017E-05_dp, & + 0.3949E-05_dp, 0.7443E-05_dp, 0.1327E-04_dp, 0.2232E-04_dp, 0.3545E-04_dp, & + 0.5345E-04_dp, 0.7690E-04_dp, 0.1065E-03_dp, 0.1438E-03_dp, 0.1938E-03_dp, & + 0.2705E-03_dp, 0.4085E-03_dp, 0.6873E-03_dp, 0.1278E-02_dp, 0.2532E-02_dp, & + 0.5157E-02_dp, 0.1055E-01_dp, 0.2142E-01_dp, 0.4299E-01_dp, 0.8513E-01_dp, & + 0.1661E+00_dp, & + 0.0000E+00_dp, 0.6275E-15_dp, 0.5508E-14_dp, 0.4332E-13_dp, 0.3053E-12_dp, & + 0.1928E-11_dp, 0.1091E-10_dp, 0.5540E-10_dp, 0.2522E-09_dp, 0.1030E-08_dp, & + 0.3778E-08_dp, 0.1244E-07_dp, 0.3679E-07_dp, 0.9787E-07_dp, 0.2343E-06_dp, & + 0.5052E-06_dp, 0.9824E-06_dp, 0.1726E-05_dp, 0.2745E-05_dp, 0.3960E-05_dp, & + 0.5201E-05_dp, 0.6241E-05_dp, 0.6877E-05_dp, 0.7003E-05_dp, 0.6642E-05_dp, & + 0.5924E-05_dp, 0.5024E-05_dp, 0.4101E-05_dp, 0.3262E-05_dp, 0.2559E-05_dp, & + 0.1997E-05_dp, 0.1563E-05_dp, 0.1234E-05_dp, 0.9937E-06_dp, 0.8433E-06_dp, & + 0.8209E-06_dp, 0.1043E-05_dp, 0.1772E-05_dp, 0.3522E-05_dp, 0.7168E-05_dp, & + 0.1403E-04_dp, 0.2586E-04_dp, 0.4468E-04_dp, 0.7250E-04_dp, 0.1110E-03_dp, & + 0.1610E-03_dp, 0.2227E-03_dp, 0.2955E-03_dp, 0.3792E-03_dp, 0.4765E-03_dp, & + 0.5984E-03_dp, 0.7772E-03_dp, 0.1091E-02_dp, 0.1715E-02_dp, 0.3013E-02_dp, & + 0.5721E-02_dp, 0.1129E-01_dp, 0.2253E-01_dp, 0.4481E-01_dp, 0.8825E-01_dp, & + 0.1715E+00_dp, & + 0.0000E+00_dp, 0.8408E-15_dp, 0.7381E-14_dp, 0.5805E-13_dp, 0.4091E-12_dp, & + 0.2584E-11_dp, 0.1463E-10_dp, 0.7425E-10_dp, 0.3381E-09_dp, 0.1381E-08_dp, & + 0.5064E-08_dp, 0.1667E-07_dp, 0.4933E-07_dp, 0.1312E-06_dp, 0.3141E-06_dp, & + 0.6775E-06_dp, 0.1318E-05_dp, 0.2316E-05_dp, 0.3683E-05_dp, 0.5316E-05_dp, & + 0.6983E-05_dp, 0.8383E-05_dp, 0.9242E-05_dp, 0.9417E-05_dp, 0.8938E-05_dp, & + 0.7979E-05_dp, 0.6774E-05_dp, 0.5536E-05_dp, 0.4410E-05_dp, 0.3464E-05_dp, & + 0.2709E-05_dp, 0.2126E-05_dp, 0.1691E-05_dp, 0.1392E-05_dp, 0.1262E-05_dp, & + 0.1429E-05_dp, 0.2227E-05_dp, 0.4364E-05_dp, 0.9156E-05_dp, 0.1876E-04_dp, & + 0.3628E-04_dp, 0.6557E-04_dp, 0.1107E-03_dp, 0.1753E-03_dp, 0.2616E-03_dp, & + 0.3696E-03_dp, 0.4979E-03_dp, 0.6431E-03_dp, 0.8019E-03_dp, 0.9736E-03_dp, & + 0.1165E-02_dp, 0.1406E-02_dp, 0.1769E-02_dp, 0.2427E-02_dp, 0.3750E-02_dp, & + 0.6488E-02_dp, 0.1213E-01_dp, 0.2356E-01_dp, 0.4628E-01_dp, 0.9057E-01_dp, & + 0.1754E+00_dp, & + 0.0000E+00_dp, 0.1092E-14_dp, 0.9587E-14_dp, 0.7540E-13_dp, 0.5314E-12_dp, & + 0.3356E-11_dp, 0.1900E-10_dp, 0.9646E-10_dp, 0.4392E-09_dp, 0.1794E-08_dp, & + 0.6579E-08_dp, 0.2166E-07_dp, 0.6410E-07_dp, 0.1705E-06_dp, 0.4083E-06_dp, & + 0.8807E-06_dp, 0.1713E-05_dp, 0.3011E-05_dp, 0.4791E-05_dp, 0.6916E-05_dp, & + 0.9088E-05_dp, 0.1091E-04_dp, 0.1204E-04_dp, 0.1227E-04_dp, 0.1166E-04_dp, & + 0.1041E-04_dp, 0.8849E-05_dp, 0.7240E-05_dp, 0.5774E-05_dp, 0.4542E-05_dp, & + 0.3559E-05_dp, 0.2803E-05_dp, 0.2250E-05_dp, 0.1906E-05_dp, 0.1869E-05_dp, & + 0.2446E-05_dp, 0.4375E-05_dp, 0.9175E-05_dp, 0.1959E-04_dp, 0.3997E-04_dp, & + 0.7636E-04_dp, 0.1359E-03_dp, 0.2258E-03_dp, 0.3513E-03_dp, 0.5145E-03_dp, & + 0.7137E-03_dp, 0.9434E-03_dp, 0.1196E-02_dp, 0.1463E-02_dp, 0.1741E-02_dp, & + 0.2031E-02_dp, 0.2359E-02_dp, 0.2792E-02_dp, 0.3497E-02_dp, 0.4840E-02_dp, & + 0.7579E-02_dp, 0.1323E-01_dp, 0.2472E-01_dp, 0.4766E-01_dp, 0.9248E-01_dp, & + 0.1784E+00_dp, & + 0.0000E+00_dp, 0.1385E-14_dp, 0.1216E-13_dp, 0.9565E-13_dp, 0.6741E-12_dp, & + 0.4258E-11_dp, 0.2411E-10_dp, 0.1224E-09_dp, 0.5573E-09_dp, 0.2277E-08_dp, & + 0.8348E-08_dp, 0.2749E-07_dp, 0.8135E-07_dp, 0.2164E-06_dp, 0.5183E-06_dp, & + 0.1118E-05_dp, 0.2175E-05_dp, 0.3824E-05_dp, 0.6085E-05_dp, 0.8786E-05_dp, & + 0.1155E-04_dp, 0.1387E-04_dp, 0.1531E-04_dp, 0.1562E-04_dp, 0.1484E-04_dp, & + 0.1327E-04_dp, 0.1128E-04_dp, 0.9241E-05_dp, 0.7378E-05_dp, 0.5811E-05_dp, & + 0.4561E-05_dp, 0.3607E-05_dp, 0.2926E-05_dp, 0.2561E-05_dp, 0.2724E-05_dp, & + 0.4019E-05_dp, 0.7841E-05_dp, 0.1700E-04_dp, 0.3645E-04_dp, 0.7390E-04_dp, & + 0.1397E-03_dp, 0.2458E-03_dp, 0.4032E-03_dp, 0.6193E-03_dp, 0.8952E-03_dp, & + 0.1225E-02_dp, 0.1598E-02_dp, 0.1998E-02_dp, 0.2413E-02_dp, 0.2831E-02_dp, & + 0.3253E-02_dp, 0.3696E-02_dp, 0.4224E-02_dp, 0.4996E-02_dp, 0.6368E-02_dp, & + 0.9095E-02_dp, 0.1470E-01_dp, 0.2616E-01_dp, 0.4915E-01_dp, 0.9425E-01_dp, & + 0.1808E+00_dp, & + 0.0000E+00_dp, 0.1722E-14_dp, 0.1512E-13_dp, 0.1189E-12_dp, 0.8381E-12_dp, & + 0.5294E-11_dp, 0.2997E-10_dp, 0.1522E-09_dp, 0.6929E-09_dp, 0.2831E-08_dp, & + 0.1038E-07_dp, 0.3419E-07_dp, 0.1012E-06_dp, 0.2692E-06_dp, 0.6447E-06_dp, & + 0.1391E-05_dp, 0.2707E-05_dp, 0.4758E-05_dp, 0.7573E-05_dp, 0.1094E-04_dp, & + 0.1438E-04_dp, 0.1728E-04_dp, 0.1908E-04_dp, 0.1947E-04_dp, 0.1851E-04_dp, & + 0.1656E-04_dp, 0.1409E-04_dp, 0.1155E-04_dp, 0.9231E-05_dp, 0.7279E-05_dp, & + 0.5724E-05_dp, 0.4543E-05_dp, 0.3729E-05_dp, 0.3380E-05_dp, 0.3886E-05_dp, & + 0.6296E-05_dp, 0.1297E-04_dp, 0.2860E-04_dp, 0.6130E-04_dp, 0.1235E-03_dp, & + 0.2314E-03_dp, 0.4034E-03_dp, 0.6554E-03_dp, 0.9968E-03_dp, 0.1427E-02_dp, & + 0.1934E-02_dp, 0.2497E-02_dp, 0.3092E-02_dp, 0.3697E-02_dp, 0.4296E-02_dp, & + 0.4883E-02_dp, 0.5475E-02_dp, 0.6128E-02_dp, 0.6990E-02_dp, 0.8406E-02_dp, & + 0.1112E-01_dp, 0.1666E-01_dp, 0.2801E-01_dp, 0.5092E-01_dp, 0.9608E-01_dp, & + 0.1831E+00_dp, & + 0.0000E+00_dp, 0.2104E-14_dp, 0.1847E-13_dp, 0.1453E-12_dp, 0.1024E-11_dp, & + 0.6466E-11_dp, 0.3661E-10_dp, 0.1859E-09_dp, 0.8465E-09_dp, 0.3458E-08_dp, & + 0.1268E-07_dp, 0.4177E-07_dp, 0.1236E-06_dp, 0.3290E-06_dp, 0.7878E-06_dp, & + 0.1700E-05_dp, 0.3308E-05_dp, 0.5817E-05_dp, 0.9259E-05_dp, 0.1337E-04_dp, & + 0.1759E-04_dp, 0.2114E-04_dp, 0.2335E-04_dp, 0.2383E-04_dp, 0.2267E-04_dp, & + 0.2030E-04_dp, 0.1728E-04_dp, 0.1417E-04_dp, 0.1134E-04_dp, 0.8948E-05_dp, & + 0.7048E-05_dp, 0.5617E-05_dp, 0.4667E-05_dp, 0.4384E-05_dp, 0.5412E-05_dp, & + 0.9423E-05_dp, 0.2012E-04_dp, 0.4474E-04_dp, 0.9566E-04_dp, 0.1915E-03_dp, & + 0.3562E-03_dp, 0.6162E-03_dp, 0.9935E-03_dp, 0.1500E-02_dp, 0.2131E-02_dp, & + 0.2866E-02_dp, 0.3673E-02_dp, 0.4516E-02_dp, 0.5360E-02_dp, 0.6183E-02_dp, & + 0.6975E-02_dp, 0.7750E-02_dp, 0.8558E-02_dp, 0.9539E-02_dp, 0.1102E-01_dp, & + 0.1373E-01_dp, 0.1918E-01_dp, 0.3038E-01_dp, 0.5311E-01_dp, 0.9815E-01_dp, & + 0.1852E+00_dp /), & + (/10, 61/), ORDER = (/2, 1/) ) + +! Ice - plate assumption + + REAL(dp), PARAMETER :: cplaterad(0:iziceplate) = (/0._dp, 5._dp, 10._dp, 15._dp, 20._dp, & + 25._dp, 30._dp, 35._dp, 40._dp, 45._dp, 50._dp, 75._dp, 100._dp, & + 125._dp, 150._dp, 175._dp, 200._dp, 225._dp, 250._dp, 275._dp, & + 300._dp, 325._dp, 350._dp, 375._dp, 400._dp, 425._dp, 450._dp, & + 475._dp, 500._dp, 525._dp, 550._dp, 575._dp, 600._dp, 625._dp, 650._dp /) + +!>>gf + DATA (scaviceplate(0,ja),ja=0,60)/ & + 0._dp, & + 0._dp, 0._dp, 0._dp, 0._dp, 0._dp, & + 0._dp, 0._dp, 0._dp, 0._dp, 0._dp, & + 0._dp, 0._dp, 0._dp, 0._dp, 0._dp, & + 0._dp, 0._dp, 0._dp, 0._dp, 0._dp, & + 0._dp, 0._dp, 0._dp, 0._dp, 0._dp, & + 0._dp, 0._dp, 0._dp, 0._dp, 0._dp, & + 0._dp, 0._dp, 0._dp, 0._dp, 0._dp, & + 0._dp, 0._dp, 0._dp, 0._dp, 0._dp, & + 0._dp, 0._dp, 0._dp, 0._dp, 0._dp, & + 0._dp, 0._dp, 0._dp, 0._dp, 0._dp, & + 0._dp, 0._dp, 0._dp, 0._dp, 0._dp, & + 0._dp, 0._dp, 0._dp, 0._dp, 0._dp/ + DATA (scaviceplate(1,ja),ja=0,60)/ & + 0._dp, & + 0.3545E-06_dp, 0.3545E-06_dp, 0.3545E-06_dp, 0.3545E-06_dp, 0.3545E-06_dp, & + 0.3545E-06_dp, 0.3545E-06_dp, 0.3545E-06_dp, 0.3545E-06_dp, 0.3545E-06_dp, & + 0.3545E-06_dp, 0.3545E-06_dp, 0.3546E-06_dp, 0.3546E-06_dp, 0.3547E-06_dp, & + 0.3548E-06_dp, 0.3549E-06_dp, 0.3551E-06_dp, 0.3552E-06_dp, 0.3555E-06_dp, & + 0.3558E-06_dp, 0.3561E-06_dp, 0.3566E-06_dp, 0.3557E-06_dp, 0.3071E-06_dp, & + 0.2240E-06_dp, 0.1657E-06_dp, 0.1242E-06_dp, 0.9415E-07_dp, 0.7218E-07_dp, & + 0.5591E-07_dp, 0.4373E-07_dp, 0.3453E-07_dp, 0.2752E-07_dp, 0.2212E-07_dp, & + 0.1793E-07_dp, 0.1463E-07_dp, 0.1188E-07_dp, 0.8906E-08_dp, 0.6669E-08_dp, & + 0.3231E-08_dp, 0.3564E-10_dp, 0.5550E-12_dp, 0.2924E-10_dp, 0.9890E-09_dp, & + 0.2592E-08_dp, 0.3126E-08_dp, 0.1653E-08_dp, 0.1807E-07_dp, 0.5574E-07_dp, & + 0.1268E-06_dp, 0.4422E-06_dp, 0.1480E-05_dp, 0.5460E-05_dp, 0.2730E-04_dp, & + 0.8571E-04_dp, 0.3768E-03_dp, 0.1540E-02_dp, 0.4415E-02_dp, 0.1106E-01_dp/ + DATA (scaviceplate(2,ja),ja=0,60)/ & + 0._dp, & + 0.5623E-05_dp, 0.5623E-05_dp, 0.5623E-05_dp, 0.5623E-05_dp, 0.5623E-05_dp, & + 0.5623E-05_dp, 0.5623E-05_dp, 0.5623E-05_dp, 0.5623E-05_dp, 0.5623E-05_dp, & + 0.5623E-05_dp, 0.5624E-05_dp, 0.5624E-05_dp, 0.5625E-05_dp, 0.5625E-05_dp, & + 0.5626E-05_dp, 0.5627E-05_dp, 0.5628E-05_dp, 0.5614E-05_dp, 0.5087E-05_dp, & + 0.3577E-05_dp, 0.2539E-05_dp, 0.1822E-05_dp, 0.1322E-05_dp, 0.9710E-06_dp, & + 0.7224E-06_dp, 0.5441E-06_dp, 0.4145E-06_dp, 0.3191E-06_dp, 0.2481E-06_dp, & + 0.1946E-06_dp, 0.1540E-06_dp, 0.1229E-06_dp, 0.9885E-07_dp, 0.8013E-07_dp, & + 0.6544E-07_dp, 0.5378E-07_dp, 0.4382E-07_dp, 0.3228E-07_dp, 0.2373E-07_dp, & + 0.1207E-07_dp, 0.2567E-09_dp, 0.7402E-11_dp, 0.4077E-09_dp, 0.1381E-07_dp, & + 0.3719E-07_dp, 0.6588E-07_dp, 0.1012E-06_dp, 0.1332E-06_dp, 0.1246E-06_dp, & + 0.6847E-07_dp, 0.1015E-05_dp, 0.4624E-05_dp, 0.1920E-04_dp, 0.1005E-03_dp, & + 0.3161E-03_dp, 0.1400E-02_dp, 0.3800E-02_dp, 0.8500E-02_dp, 0.1800E-01_dp/ + DATA (scaviceplate(3,ja),ja=0,60)/ & + 0._dp, & + 0.2800E-04_dp, 0.2800E-04_dp, 0.2800E-04_dp, 0.2800E-04_dp, 0.2800E-04_dp, & + 0.2800E-04_dp, 0.2800E-04_dp, 0.2800E-04_dp, 0.2800E-04_dp, 0.2800E-04_dp, & + 0.2800E-04_dp, 0.2800E-04_dp, 0.2800E-04_dp, 0.2800E-04_dp, 0.2800E-04_dp, & + 0.2800E-04_dp, 0.2776E-04_dp, 0.1978E-04_dp, 0.1387E-04_dp, 0.9806E-05_dp, & + 0.6989E-05_dp, 0.5024E-05_dp, 0.3647E-05_dp, 0.2675E-05_dp, 0.1984E-05_dp, & + 0.1489E-05_dp, 0.1131E-05_dp, 0.8676E-06_dp, 0.6722E-06_dp, 0.5256E-06_dp, & + 0.4144E-06_dp, 0.3294E-06_dp, 0.2639E-06_dp, 0.2131E-06_dp, 0.1733E-06_dp, & + 0.1419E-06_dp, 0.1169E-06_dp, 0.9540E-07_dp, 0.6977E-07_dp, 0.5090E-07_dp, & + 0.2668E-07_dp, 0.8296E-09_dp, 0.3401E-10_dp, 0.1833E-08_dp, 0.6496E-07_dp, & + 0.2661E-06_dp, 0.5598E-06_dp, 0.9637E-06_dp, 0.1493E-05_dp, 0.2098E-05_dp, & + 0.2386E-05_dp, 0.9829E-06_dp, 0.1270E-05_dp, 0.1793E-04_dp, 0.1537E-03_dp, & + 0.5966E-03_dp, 0.1738E-02_dp, 0.4092E-02_dp, 0.9004E-02_dp, 0.1945E-01_dp/ + DATA (scaviceplate(4,ja),ja=0,60)/ & + 0._dp, & + 0.8711E-04_dp, 0.8711E-04_dp, 0.8711E-04_dp, 0.8711E-04_dp, 0.8711E-04_dp, & + 0.8711E-04_dp, 0.8711E-04_dp, 0.8711E-04_dp, 0.8711E-04_dp, 0.8711E-04_dp, & + 0.8711E-04_dp, 0.8712E-04_dp, 0.8712E-04_dp, 0.8712E-04_dp, 0.8645E-04_dp, & + 0.6434E-04_dp, 0.4492E-04_dp, 0.3158E-04_dp, 0.2236E-04_dp, 0.1595E-04_dp, & + 0.1146E-04_dp, 0.8303E-05_dp, 0.6069E-05_dp, 0.4480E-05_dp, 0.3342E-05_dp, & + 0.2522E-05_dp, 0.1923E-05_dp, 0.1481E-05_dp, 0.1152E-05_dp, 0.9034E-06_dp, & + 0.7142E-06_dp, 0.5692E-06_dp, 0.4570E-06_dp, 0.3697E-06_dp, 0.3012E-06_dp, & + 0.2470E-06_dp, 0.2038E-06_dp, 0.1664E-06_dp, 0.1212E-06_dp, 0.8806E-07_dp, & + 0.4722E-07_dp, 0.1924E-08_dp, 0.1012E-09_dp, 0.5365E-08_dp, 0.1942E-06_dp, & + 0.9191E-06_dp, 0.2000E-05_dp, 0.3497E-05_dp, 0.5548E-05_dp, 0.8243E-05_dp, & + 0.1118E-04_dp, 0.1088E-04_dp, 0.5078E-05_dp, 0.4263E-05_dp, 0.1107E-03_dp, & + 0.5908E-03_dp, 0.1894E-02_dp, 0.4547E-02_dp, 0.9857E-02_dp, 0.2087E-01_dp/ + DATA (scaviceplate(5,ja),ja=0,60)/ & + 0._dp, & + 0.2079E-03_dp, 0.2079E-03_dp, 0.2079E-03_dp, 0.2079E-03_dp, 0.2079E-03_dp, & + 0.2079E-03_dp, 0.2079E-03_dp, 0.2079E-03_dp, 0.2079E-03_dp, 0.2079E-03_dp, & + 0.2079E-03_dp, 0.2079E-03_dp, 0.2074E-03_dp, 0.1899E-03_dp, 0.1317E-03_dp, & + 0.9204E-04_dp, 0.6473E-04_dp, 0.4583E-04_dp, 0.3267E-04_dp, 0.2345E-04_dp, & + 0.1694E-04_dp, 0.1234E-04_dp, 0.9062E-05_dp, 0.6717E-05_dp, 0.5030E-05_dp, & + 0.3807E-05_dp, 0.2911E-05_dp, 0.2248E-05_dp, 0.1752E-05_dp, 0.1377E-05_dp, & + 0.1090E-05_dp, 0.8703E-06_dp, 0.6997E-06_dp, 0.5667E-06_dp, 0.4622E-06_dp, & + 0.3794E-06_dp, 0.3133E-06_dp, 0.2558E-06_dp, 0.1860E-06_dp, 0.1347E-06_dp, & + 0.7358E-07_dp, 0.3688E-08_dp, 0.2349E-09_dp, 0.1230E-07_dp, 0.5363E-06_dp, & + 0.5235E-05_dp, 0.1268E-04_dp, 0.2296E-04_dp, 0.3714E-04_dp, 0.5647E-04_dp, & + 0.8291E-04_dp, 0.1052E-03_dp, 0.9688E-04_dp, 0.5462E-04_dp, 0.3098E-04_dp, & + 0.4472E-03_dp, 0.1762E-02_dp, 0.4712E-02_dp, 0.1051E-01_dp, 0.2239E-01_dp/ + DATA (scaviceplate(6,ja),ja=0,60)/ & + 0._dp, & + 0.2501E-03_dp, 0.2501E-03_dp, 0.2501E-03_dp, 0.2501E-03_dp, 0.2501E-03_dp, & + 0.2501E-03_dp, 0.2501E-03_dp, 0.2501E-03_dp, 0.2501E-03_dp, 0.2501E-03_dp, & + 0.2501E-03_dp, 0.2498E-03_dp, 0.2388E-03_dp, 0.2024E-03_dp, 0.1407E-03_dp, & + 0.9843E-04_dp, 0.6933E-04_dp, 0.4915E-04_dp, 0.3508E-04_dp, 0.2520E-04_dp, & + 0.1823E-04_dp, 0.1329E-04_dp, 0.9768E-05_dp, 0.7246E-05_dp, 0.5430E-05_dp, & + 0.4112E-05_dp, 0.3146E-05_dp, 0.2431E-05_dp, 0.1895E-05_dp, 0.1490E-05_dp, & + 0.1180E-05_dp, 0.9421E-06_dp, 0.7576E-06_dp, 0.6137E-06_dp, 0.5006E-06_dp, & + 0.4110E-06_dp, 0.3395E-06_dp, 0.2772E-06_dp, 0.2014E-06_dp, 0.1459E-06_dp, & + 0.7998E-07_dp, 0.4200E-08_dp, 0.2808E-09_dp, 0.1466E-07_dp, 0.6387E-06_dp, & + 0.6223E-05_dp, 0.1505E-04_dp, 0.2721E-04_dp, 0.4395E-04_dp, 0.6689E-04_dp, & + 0.1009E-03_dp, 0.1517E-03_dp, 0.1510E-03_dp, 0.1068E-03_dp, 0.5517E-04_dp, & + 0.3994E-03_dp, 0.1704E-02_dp, 0.4678E-02_dp, 0.1055E-01_dp, 0.2259E-01_dp/ + DATA (scaviceplate(7,ja),ja=0,60)/ & + 0._dp, & + 0.2923E-03_dp, 0.2923E-03_dp, 0.2923E-03_dp, 0.2923E-03_dp, 0.2923E-03_dp, & + 0.2923E-03_dp, 0.2923E-03_dp, 0.2923E-03_dp, 0.2923E-03_dp, 0.2923E-03_dp, & + 0.2923E-03_dp, 0.2917E-03_dp, 0.2701E-03_dp, 0.2150E-03_dp, 0.1496E-03_dp, & + 0.1048E-03_dp, 0.7392E-04_dp, 0.5246E-04_dp, 0.3748E-04_dp, 0.2696E-04_dp, & + 0.1952E-04_dp, 0.1424E-04_dp, 0.1047E-04_dp, 0.7775E-05_dp, 0.5829E-05_dp, & + 0.4417E-05_dp, 0.3381E-05_dp, 0.2613E-05_dp, 0.2038E-05_dp, 0.1602E-05_dp, & + 0.1270E-05_dp, 0.1014E-05_dp, 0.8156E-06_dp, 0.6608E-06_dp, 0.5391E-06_dp, & + 0.4427E-06_dp, 0.3657E-06_dp, 0.2986E-06_dp, 0.2169E-06_dp, 0.1570E-06_dp, & + 0.8638E-07_dp, 0.4712E-08_dp, 0.3266E-09_dp, 0.1702E-07_dp, 0.7412E-06_dp, & + 0.7212E-05_dp, 0.1742E-04_dp, 0.3145E-04_dp, 0.5076E-04_dp, 0.7731E-04_dp, & + 0.1190E-03_dp, 0.1981E-03_dp, 0.2051E-03_dp, 0.1590E-03_dp, 0.7936E-04_dp, & + 0.3517E-03_dp, 0.1646E-02_dp, 0.4645E-02_dp, 0.1060E-01_dp, 0.2279E-01_dp/ + DATA (scaviceplate(8,ja),ja=0,60)/ & + 0._dp, & + 0.3345E-03_dp, 0.3345E-03_dp, 0.3345E-03_dp, 0.3345E-03_dp, 0.3345E-03_dp, & + 0.3345E-03_dp, 0.3345E-03_dp, 0.3345E-03_dp, 0.3345E-03_dp, 0.3345E-03_dp, & + 0.3345E-03_dp, 0.3335E-03_dp, 0.3015E-03_dp, 0.2275E-03_dp, 0.1586E-03_dp, & + 0.1112E-03_dp, 0.7851E-04_dp, 0.5578E-04_dp, 0.3989E-04_dp, 0.2871E-04_dp, & + 0.2081E-04_dp, 0.1519E-04_dp, 0.1118E-04_dp, 0.8304E-05_dp, 0.6229E-05_dp, & + 0.4722E-05_dp, 0.3616E-05_dp, 0.2796E-05_dp, 0.2181E-05_dp, 0.1715E-05_dp, & + 0.1359E-05_dp, 0.1086E-05_dp, 0.8735E-06_dp, 0.7078E-06_dp, 0.5775E-06_dp, & + 0.4743E-06_dp, 0.3918E-06_dp, 0.3200E-06_dp, 0.2323E-06_dp, 0.1682E-06_dp, & + 0.9278E-07_dp, 0.5224E-08_dp, 0.3725E-09_dp, 0.1938E-07_dp, 0.8436E-06_dp, & + 0.8201E-05_dp, 0.1979E-04_dp, 0.3569E-04_dp, 0.5757E-04_dp, 0.8772E-04_dp, & + 0.1370E-03_dp, 0.2446E-03_dp, 0.2592E-03_dp, 0.2112E-03_dp, 0.1036E-03_dp, & + 0.3039E-03_dp, 0.1588E-02_dp, 0.4612E-02_dp, 0.1064E-01_dp, 0.2299E-01_dp/ + DATA (scaviceplate(9,ja),ja=0,60)/ & + 0._dp, & + 0.3766E-03_dp, 0.3766E-03_dp, 0.3766E-03_dp, 0.3766E-03_dp, 0.3766E-03_dp, & + 0.3766E-03_dp, 0.3766E-03_dp, 0.3766E-03_dp, 0.3766E-03_dp, 0.3766E-03_dp, & + 0.3766E-03_dp, 0.3754E-03_dp, 0.3328E-03_dp, 0.2401E-03_dp, 0.1675E-03_dp, & + 0.1176E-03_dp, 0.8310E-04_dp, 0.5910E-04_dp, 0.4230E-04_dp, 0.3047E-04_dp, & + 0.2210E-04_dp, 0.1614E-04_dp, 0.1189E-04_dp, 0.8833E-05_dp, 0.6629E-05_dp, & + 0.5027E-05_dp, 0.3851E-05_dp, 0.2978E-05_dp, 0.2324E-05_dp, 0.1828E-05_dp, & + 0.1449E-05_dp, 0.1158E-05_dp, 0.9315E-06_dp, 0.7549E-06_dp, 0.6160E-06_dp, & + 0.5060E-06_dp, 0.4180E-06_dp, 0.3414E-06_dp, 0.2478E-06_dp, 0.1793E-06_dp, & + 0.9918E-07_dp, 0.5736E-08_dp, 0.4183E-09_dp, 0.2174E-07_dp, 0.9460E-06_dp, & + 0.9190E-05_dp, 0.2216E-04_dp, 0.3993E-04_dp, 0.6438E-04_dp, 0.9814E-04_dp, & + 0.1550E-03_dp, 0.2911E-03_dp, 0.3132E-03_dp, 0.2634E-03_dp, 0.1277E-03_dp, & + 0.2562E-03_dp, 0.1530E-02_dp, 0.4578E-02_dp, 0.1068E-01_dp, 0.2318E-01_dp/ + DATA (scaviceplate(10,ja),ja=0,60)/ & + 0._dp, & + 0.3658E-03_dp, 0.3658E-03_dp, 0.3658E-03_dp, 0.3658E-03_dp, 0.3658E-03_dp, & + 0.3658E-03_dp, 0.3658E-03_dp, 0.3658E-03_dp, 0.3658E-03_dp, 0.3658E-03_dp, & + 0.3658E-03_dp, 0.2754E-03_dp, 0.1791E-03_dp, 0.1077E-03_dp, 0.6859E-04_dp, & + 0.4468E-04_dp, 0.2915E-04_dp, 0.1943E-04_dp, 0.1331E-04_dp, 0.9352E-05_dp, & + 0.7232E-05_dp, 0.5486E-05_dp, 0.4642E-05_dp, 0.3556E-05_dp, 0.2881E-05_dp, & + 0.2233E-05_dp, 0.1979E-05_dp, 0.1743E-05_dp, 0.1743E-05_dp, 0.1743E-05_dp, & + 0.1775E-05_dp, 0.1411E-05_dp, 0.1082E-05_dp, 0.8761E-06_dp, 0.8309E-06_dp, & + 0.8309E-06_dp, 0.8309E-06_dp, 0.8309E-06_dp, 0.8309E-06_dp, 0.8309E-06_dp, & + 0.8826E-06_dp, 0.1084E-05_dp, 0.1411E-05_dp, 0.1653E-05_dp, 0.1653E-05_dp, & + 0.1653E-05_dp, 0.1653E-05_dp, 0.1653E-05_dp, 0.1653E-05_dp, 0.1653E-05_dp, & + 0.1653E-05_dp, 0.1653E-05_dp, 0.1653E-05_dp, 0.1653E-05_dp, 0.1653E-05_dp, & + 0.1653E-05_dp, 0.1653E-05_dp, 0.1653E-05_dp, 0.1653E-05_dp, 0.1653E-05_dp/ + DATA (scaviceplate(11,ja),ja=0,60)/ & + 0._dp, & + 0.1541E-02_dp, 0.1541E-02_dp, 0.1541E-02_dp, 0.1541E-02_dp, 0.1541E-02_dp, & + 0.1541E-02_dp, 0.1541E-02_dp, 0.1541E-02_dp, 0.1541E-02_dp, 0.1541E-02_dp, & + 0.1541E-02_dp, 0.1059E-02_dp, 0.6070E-03_dp, 0.3505E-03_dp, 0.2166E-03_dp, & + 0.1272E-03_dp, 0.8082E-04_dp, 0.4703E-04_dp, 0.2927E-04_dp, 0.1870E-04_dp, & + 0.1308E-04_dp, 0.1034E-04_dp, 0.8459E-05_dp, 0.7069E-05_dp, 0.6327E-05_dp, & + 0.5536E-05_dp, 0.5131E-05_dp, 0.4551E-05_dp, 0.4183E-05_dp, 0.3830E-05_dp, & + 0.3795E-05_dp, 0.3614E-05_dp, 0.3237E-05_dp, 0.3074E-05_dp, 0.2901E-05_dp, & + 0.2749E-05_dp, 0.2758E-05_dp, 0.3022E-05_dp, 0.3327E-05_dp, 0.4015E-05_dp, & + 0.4951E-05_dp, 0.5886E-05_dp, 0.7069E-05_dp, 0.8036E-05_dp, 0.8036E-05_dp, & + 0.8036E-05_dp, 0.8036E-05_dp, 0.8036E-05_dp, 0.8036E-05_dp, 0.8036E-05_dp, & + 0.8036E-05_dp, 0.8036E-05_dp, 0.8036E-05_dp, 0.8036E-05_dp, 0.8036E-05_dp, & + 0.8036E-05_dp, 0.8036E-05_dp, 0.8036E-05_dp, 0.8036E-05_dp, 0.8036E-05_dp/ + DATA (scaviceplate(12,ja),ja=0,60)/ & + 0._dp, & + 0.1807E-02_dp, 0.1807E-02_dp, 0.1807E-02_dp, 0.1807E-02_dp, 0.1807E-02_dp, & + 0.1807E-02_dp, 0.1807E-02_dp, 0.1807E-02_dp, 0.1807E-02_dp, 0.1807E-02_dp, & + 0.1807E-02_dp, 0.1278E-02_dp, 0.7567E-03_dp, 0.4822E-03_dp, 0.2984E-03_dp, & + 0.1882E-03_dp, 0.1260E-03_dp, 0.8015E-04_dp, 0.5343E-04_dp, 0.3657E-04_dp, & + 0.2738E-04_dp, 0.2135E-04_dp, 0.1792E-04_dp, 0.1444E-04_dp, 0.1195E-04_dp, & + 0.1023E-04_dp, 0.8896E-05_dp, 0.7895E-05_dp, 0.6811E-05_dp, 0.6213E-05_dp, & + 0.5911E-05_dp, 0.5620E-05_dp, 0.5408E-05_dp, 0.5205E-05_dp, 0.5154E-05_dp, & + 0.4964E-05_dp, 0.4849E-05_dp, 0.4923E-05_dp, 0.4920E-05_dp, 0.5920E-05_dp, & + 0.7414E-05_dp, 0.6511E-05_dp, 0.6155E-05_dp, 0.6371E-05_dp, 0.6371E-05_dp, & + 0.6371E-05_dp, 0.6371E-05_dp, 0.6371E-05_dp, 0.6371E-05_dp, 0.6371E-05_dp, & + 0.6371E-05_dp, 0.6371E-05_dp, 0.6371E-05_dp, 0.6371E-05_dp, 0.6371E-05_dp, & + 0.6371E-05_dp, 0.6371E-05_dp, 0.6371E-05_dp, 0.6371E-05_dp, 0.6371E-05_dp/ + DATA (scaviceplate(13,ja),ja=0,60)/ & + 0._dp, & + 0.1740E-02_dp, 0.1740E-02_dp, 0.1740E-02_dp, 0.1740E-02_dp, 0.1740E-02_dp, & + 0.1740E-02_dp, 0.1740E-02_dp, 0.1740E-02_dp, 0.1740E-02_dp, 0.1740E-02_dp, & + 0.1740E-02_dp, 0.1267E-02_dp, 0.8458E-03_dp, 0.5811E-03_dp, 0.3720E-03_dp, & + 0.2461E-03_dp, 0.1736E-03_dp, 0.1233E-03_dp, 0.8764E-04_dp, 0.6523E-04_dp, & + 0.4988E-04_dp, 0.3717E-04_dp, 0.2953E-04_dp, 0.2212E-04_dp, 0.1725E-04_dp, & + 0.1412E-04_dp, 0.1137E-04_dp, 0.9989E-05_dp, 0.8831E-05_dp, 0.8405E-05_dp, & + 0.8056E-05_dp, 0.8607E-05_dp, 0.9877E-05_dp, 0.1151E-04_dp, 0.1453E-04_dp, & + 0.1717E-04_dp, 0.1957E-04_dp, 0.2094E-04_dp, 0.2095E-04_dp, 0.2035E-04_dp, & + 0.1861E-04_dp, 0.8468E-05_dp, 0.2460E-05_dp, 0.1103E-05_dp, 0.1103E-05_dp, & + 0.1103E-05_dp, 0.1103E-05_dp, 0.1103E-05_dp, 0.1103E-05_dp, 0.1103E-05_dp, & + 0.1103E-05_dp, 0.1103E-05_dp, 0.1103E-05_dp, 0.1103E-05_dp, 0.1103E-05_dp, & + 0.1103E-05_dp, 0.1103E-05_dp, 0.1103E-05_dp, 0.1103E-05_dp, 0.1103E-05_dp/ + DATA (scaviceplate(14,ja),ja=0,60)/ & + 0._dp, & + 0.2353E-02_dp, 0.2353E-02_dp, 0.2353E-02_dp, 0.2353E-02_dp, 0.2353E-02_dp, & + 0.2353E-02_dp, 0.2353E-02_dp, 0.2353E-02_dp, 0.2353E-02_dp, 0.2353E-02_dp, & + 0.2353E-02_dp, 0.1669E-02_dp, 0.1182E-02_dp, 0.7722E-03_dp, 0.5121E-03_dp, & + 0.3289E-03_dp, 0.2327E-03_dp, 0.1713E-03_dp, 0.1243E-03_dp, 0.9585E-04_dp, & + 0.7249E-04_dp, 0.5249E-04_dp, 0.3838E-04_dp, 0.2727E-04_dp, 0.2095E-04_dp, & + 0.1661E-04_dp, 0.1271E-04_dp, 0.1102E-04_dp, 0.1082E-04_dp, 0.1098E-04_dp, & + 0.1131E-04_dp, 0.1415E-04_dp, 0.1825E-04_dp, 0.2443E-04_dp, 0.3333E-04_dp, & + 0.4201E-04_dp, 0.4997E-04_dp, 0.5477E-04_dp, 0.5618E-04_dp, 0.5145E-04_dp, & + 0.4223E-04_dp, 0.1690E-04_dp, 0.3497E-05_dp, 0.1208E-05_dp, 0.1208E-05_dp, & + 0.1208E-05_dp, 0.1208E-05_dp, 0.1208E-05_dp, 0.1208E-05_dp, 0.1208E-05_dp, & + 0.1208E-05_dp, 0.1208E-05_dp, 0.1208E-05_dp, 0.1208E-05_dp, 0.1208E-05_dp, & + 0.1208E-05_dp, 0.1208E-05_dp, 0.1208E-05_dp, 0.1208E-05_dp, 0.1208E-05_dp/ + DATA (scaviceplate(15,ja),ja=0,60)/ & + 0._dp, & + 0.3047E-02_dp, 0.3047E-02_dp, 0.3047E-02_dp, 0.3047E-02_dp, 0.3047E-02_dp, & + 0.3047E-02_dp, 0.3047E-02_dp, 0.3047E-02_dp, 0.3047E-02_dp, 0.3047E-02_dp, & + 0.3047E-02_dp, 0.2215E-02_dp, 0.1514E-02_dp, 0.9771E-03_dp, 0.6620E-03_dp, & + 0.4390E-03_dp, 0.3035E-03_dp, 0.2227E-03_dp, 0.1682E-03_dp, 0.1277E-03_dp, & + 0.1017E-03_dp, 0.7686E-04_dp, 0.5615E-04_dp, 0.4240E-04_dp, 0.3245E-04_dp, & + 0.2583E-04_dp, 0.2035E-04_dp, 0.1777E-04_dp, 0.1834E-04_dp, 0.1977E-04_dp, & + 0.2264E-04_dp, 0.2860E-04_dp, 0.3696E-04_dp, 0.5196E-04_dp, 0.6686E-04_dp, & + 0.8369E-04_dp, 0.9816E-04_dp, 0.1069E-03_dp, 0.1121E-03_dp, 0.9689E-04_dp, & + 0.7585E-04_dp, 0.2810E-04_dp, 0.6556E-05_dp, 0.2357E-05_dp, 0.2357E-05_dp, & + 0.2357E-05_dp, 0.2357E-05_dp, 0.2357E-05_dp, 0.2357E-05_dp, 0.2357E-05_dp, & + 0.2357E-05_dp, 0.2357E-05_dp, 0.2357E-05_dp, 0.2357E-05_dp, 0.2357E-05_dp, & + 0.2357E-05_dp, 0.2357E-05_dp, 0.2357E-05_dp, 0.2357E-05_dp, 0.2357E-05_dp/ + DATA (scaviceplate(16,ja),ja=0,60)/ & + 0._dp, & + 0.3741E-02_dp, 0.3741E-02_dp, 0.3741E-02_dp, 0.3741E-02_dp, 0.3741E-02_dp, & + 0.3741E-02_dp, 0.3741E-02_dp, 0.3741E-02_dp, 0.3741E-02_dp, 0.3741E-02_dp, & + 0.3741E-02_dp, 0.2761E-02_dp, 0.1847E-02_dp, 0.1182E-02_dp, 0.8118E-03_dp, & + 0.5491E-03_dp, 0.3743E-03_dp, 0.2741E-03_dp, 0.2122E-03_dp, 0.1595E-03_dp, & + 0.1310E-03_dp, 0.1012E-03_dp, 0.7393E-04_dp, 0.5752E-04_dp, 0.4395E-04_dp, & + 0.3505E-04_dp, 0.2799E-04_dp, 0.2453E-04_dp, 0.2587E-04_dp, 0.2856E-04_dp, & + 0.3398E-04_dp, 0.4304E-04_dp, 0.5566E-04_dp, 0.7949E-04_dp, 0.1004E-03_dp, & + 0.1254E-03_dp, 0.1463E-03_dp, 0.1589E-03_dp, 0.1681E-03_dp, 0.1423E-03_dp, & + 0.1095E-03_dp, 0.3929E-04_dp, 0.9615E-05_dp, 0.3505E-05_dp, 0.3505E-05_dp, & + 0.3505E-05_dp, 0.3505E-05_dp, 0.3505E-05_dp, 0.3505E-05_dp, 0.3505E-05_dp, & + 0.3505E-05_dp, 0.3505E-05_dp, 0.3505E-05_dp, 0.3505E-05_dp, 0.3505E-05_dp, & + 0.3505E-05_dp, 0.3505E-05_dp, 0.3505E-05_dp, 0.3505E-05_dp, 0.3505E-05_dp/ + DATA (scaviceplate(17,ja),ja=0,60)/ & + 0._dp, & + 0.4646E-02_dp, 0.4646E-02_dp, 0.4646E-02_dp, 0.4646E-02_dp, 0.4646E-02_dp, & + 0.4646E-02_dp, 0.4646E-02_dp, 0.4646E-02_dp, 0.4646E-02_dp, 0.4646E-02_dp, & + 0.4646E-02_dp, 0.3529E-02_dp, 0.2310E-02_dp, 0.1493E-02_dp, 0.1033E-02_dp, & + 0.7077E-03_dp, 0.4809E-03_dp, 0.3509E-03_dp, 0.2702E-03_dp, 0.2024E-03_dp, & + 0.1649E-03_dp, 0.1290E-03_dp, 0.9374E-04_dp, 0.7278E-04_dp, 0.5621E-04_dp, & + 0.4550E-04_dp, 0.3871E-04_dp, 0.3659E-04_dp, 0.4115E-04_dp, 0.5098E-04_dp, & + 0.6341E-04_dp, 0.7921E-04_dp, 0.9941E-04_dp, 0.1338E-03_dp, 0.1651E-03_dp, & + 0.1969E-03_dp, 0.2267E-03_dp, 0.2457E-03_dp, 0.2578E-03_dp, 0.2372E-03_dp, & + 0.2278E-03_dp, 0.2691E-03_dp, 0.6426E-03_dp, 0.1614E-02_dp, 0.1614E-02_dp, & + 0.1614E-02_dp, 0.1614E-02_dp, 0.1614E-02_dp, 0.1614E-02_dp, 0.1614E-02_dp, & + 0.1614E-02_dp, 0.1614E-02_dp, 0.1614E-02_dp, 0.1614E-02_dp, 0.1614E-02_dp, & + 0.1614E-02_dp, 0.1614E-02_dp, 0.1614E-02_dp, 0.1614E-02_dp, 0.1614E-02_dp/ + DATA (scaviceplate(18,ja),ja=0,60)/ & + 0._dp, & + 0.5779E-02_dp, 0.5779E-02_dp, 0.5779E-02_dp, 0.5779E-02_dp, 0.5779E-02_dp, & + 0.5779E-02_dp, 0.5779E-02_dp, 0.5779E-02_dp, 0.5779E-02_dp, 0.5779E-02_dp, & + 0.5779E-02_dp, 0.4537E-02_dp, 0.2914E-02_dp, 0.1920E-02_dp, 0.1333E-02_dp, & + 0.9189E-03_dp, 0.6260E-03_dp, 0.4553E-03_dp, 0.3435E-03_dp, 0.2572E-03_dp, & + 0.2038E-03_dp, 0.1606E-03_dp, 0.1158E-03_dp, 0.8816E-04_dp, 0.6930E-04_dp, & + 0.5729E-04_dp, 0.5277E-04_dp, 0.5440E-04_dp, 0.6484E-04_dp, 0.8817E-04_dp, & + 0.1125E-03_dp, 0.1389E-03_dp, 0.1703E-03_dp, 0.2171E-03_dp, 0.2636E-03_dp, & + 0.3009E-03_dp, 0.3419E-03_dp, 0.3699E-03_dp, 0.3840E-03_dp, 0.3856E-03_dp, & + 0.4378E-03_dp, 0.7357E-03_dp, 0.1958E-02_dp, 0.4969E-02_dp, 0.4969E-02_dp, & + 0.4969E-02_dp, 0.4969E-02_dp, 0.4969E-02_dp, 0.4969E-02_dp, 0.4969E-02_dp, & + 0.4969E-02_dp, 0.4969E-02_dp, 0.4969E-02_dp, 0.4969E-02_dp, 0.4969E-02_dp, & + 0.4969E-02_dp, 0.4969E-02_dp, 0.4969E-02_dp, 0.4969E-02_dp, 0.4969E-02_dp/ + DATA (scaviceplate(19,ja),ja=0,60)/ & + 0._dp, & + 0.6912E-02_dp, 0.6912E-02_dp, 0.6912E-02_dp, 0.6912E-02_dp, 0.6912E-02_dp, & + 0.6912E-02_dp, 0.6912E-02_dp, 0.6912E-02_dp, 0.6912E-02_dp, 0.6912E-02_dp, & + 0.6912E-02_dp, 0.5545E-02_dp, 0.3519E-02_dp, 0.2347E-02_dp, 0.1632E-02_dp, & + 0.1130E-02_dp, 0.7711E-03_dp, 0.5596E-03_dp, 0.4169E-03_dp, 0.3121E-03_dp, & + 0.2427E-03_dp, 0.1921E-03_dp, 0.1378E-03_dp, 0.1036E-03_dp, 0.8239E-04_dp, & + 0.6908E-04_dp, 0.6683E-04_dp, 0.7221E-04_dp, 0.8853E-04_dp, 0.1254E-03_dp, & + 0.1615E-03_dp, 0.1986E-03_dp, 0.2412E-03_dp, 0.3005E-03_dp, 0.3621E-03_dp, & + 0.4049E-03_dp, 0.4572E-03_dp, 0.4942E-03_dp, 0.5103E-03_dp, 0.5340E-03_dp, & + 0.6478E-03_dp, 0.1202E-02_dp, 0.3273E-02_dp, 0.8324E-02_dp, 0.8324E-02_dp, & + 0.8324E-02_dp, 0.8324E-02_dp, 0.8324E-02_dp, 0.8324E-02_dp, 0.8324E-02_dp, & + 0.8324E-02_dp, 0.8324E-02_dp, 0.8324E-02_dp, 0.8324E-02_dp, 0.8324E-02_dp, & + 0.8324E-02_dp, 0.8324E-02_dp, 0.8324E-02_dp, 0.8324E-02_dp, 0.8324E-02_dp/ + DATA (scaviceplate(20,ja),ja=0,60)/ & + 0._dp, & + 0.8112E-02_dp, 0.8112E-02_dp, 0.8112E-02_dp, 0.8112E-02_dp, 0.8112E-02_dp, & + 0.8112E-02_dp, 0.8112E-02_dp, 0.8112E-02_dp, 0.8112E-02_dp, 0.8112E-02_dp, & + 0.8112E-02_dp, 0.6509E-02_dp, 0.4155E-02_dp, 0.2793E-02_dp, 0.1935E-02_dp, & + 0.1349E-02_dp, 0.9293E-03_dp, 0.6722E-03_dp, 0.4995E-03_dp, 0.3734E-03_dp, & + 0.2899E-03_dp, 0.2268E-03_dp, 0.1626E-03_dp, 0.1215E-03_dp, 0.9599E-04_dp, & + 0.8251E-04_dp, 0.8276E-04_dp, 0.9306E-04_dp, 0.1193E-03_dp, 0.1715E-03_dp, & + 0.2235E-03_dp, 0.2809E-03_dp, 0.3529E-03_dp, 0.4399E-03_dp, 0.5415E-03_dp, & + 0.6330E-03_dp, 0.7281E-03_dp, 0.7844E-03_dp, 0.7899E-03_dp, 0.8247E-03_dp, & + 0.1022E-02_dp, 0.1945E-02_dp, 0.5344E-02_dp, 0.1345E-01_dp, 0.1345E-01_dp, & + 0.1345E-01_dp, 0.1345E-01_dp, 0.1345E-01_dp, 0.1345E-01_dp, 0.1345E-01_dp, & + 0.1345E-01_dp, 0.1345E-01_dp, 0.1345E-01_dp, 0.1345E-01_dp, 0.1345E-01_dp, & + 0.1345E-01_dp, 0.1345E-01_dp, 0.1345E-01_dp, 0.1345E-01_dp, 0.1345E-01_dp/ + DATA (scaviceplate(21,ja),ja=0,60)/ & + 0._dp, & + 0.9397E-02_dp, 0.9397E-02_dp, 0.9397E-02_dp, 0.9397E-02_dp, 0.9397E-02_dp, & + 0.9397E-02_dp, 0.9397E-02_dp, 0.9397E-02_dp, 0.9397E-02_dp, 0.9397E-02_dp, & + 0.9397E-02_dp, 0.7418E-02_dp, 0.4831E-02_dp, 0.3265E-02_dp, 0.2241E-02_dp, & + 0.1576E-02_dp, 0.1104E-02_dp, 0.7952E-03_dp, 0.5940E-03_dp, 0.4429E-03_dp, & + 0.3478E-03_dp, 0.2656E-03_dp, 0.1908E-03_dp, 0.1427E-03_dp, 0.1103E-03_dp, & + 0.9805E-04_dp, 0.1011E-03_dp, 0.1178E-03_dp, 0.1592E-03_dp, 0.2292E-03_dp, & + 0.3020E-03_dp, 0.3917E-03_dp, 0.5168E-03_dp, 0.6506E-03_dp, 0.8238E-03_dp, & + 0.1019E-02_dp, 0.1197E-02_dp, 0.1286E-02_dp, 0.1265E-02_dp, 0.1296E-02_dp, & + 0.1604E-02_dp, 0.3038E-02_dp, 0.8376E-02_dp, 0.2084E-01_dp, 0.2084E-01_dp, & + 0.2084E-01_dp, 0.2084E-01_dp, 0.2084E-01_dp, 0.2084E-01_dp, 0.2084E-01_dp, & + 0.2084E-01_dp, 0.2084E-01_dp, 0.2084E-01_dp, 0.2084E-01_dp, 0.2084E-01_dp, & + 0.2084E-01_dp, 0.2084E-01_dp, 0.2084E-01_dp, 0.2084E-01_dp, 0.2084E-01_dp/ + DATA (scaviceplate(22,ja),ja=0,60)/ & + 0._dp, & + 0.1068E-01_dp, 0.1068E-01_dp, 0.1068E-01_dp, 0.1068E-01_dp, 0.1068E-01_dp, & + 0.1068E-01_dp, 0.1068E-01_dp, 0.1068E-01_dp, 0.1068E-01_dp, 0.1068E-01_dp, & + 0.1068E-01_dp, 0.8328E-02_dp, 0.5507E-02_dp, 0.3736E-02_dp, 0.2547E-02_dp, & + 0.1803E-02_dp, 0.1279E-02_dp, 0.9183E-03_dp, 0.6884E-03_dp, 0.5123E-03_dp, & + 0.4056E-03_dp, 0.3043E-03_dp, 0.2191E-03_dp, 0.1640E-03_dp, 0.1245E-03_dp, & + 0.1136E-03_dp, 0.1194E-03_dp, 0.1425E-03_dp, 0.1990E-03_dp, 0.2868E-03_dp, & + 0.3805E-03_dp, 0.5026E-03_dp, 0.6806E-03_dp, 0.8614E-03_dp, 0.1106E-02_dp, & + 0.1406E-02_dp, 0.1666E-02_dp, 0.1787E-02_dp, 0.1739E-02_dp, 0.1768E-02_dp, & + 0.2186E-02_dp, 0.4132E-02_dp, 0.1141E-01_dp, 0.2822E-01_dp, 0.2822E-01_dp, & + 0.2822E-01_dp, 0.2822E-01_dp, 0.2822E-01_dp, 0.2822E-01_dp, 0.2822E-01_dp, & + 0.2822E-01_dp, 0.2822E-01_dp, 0.2822E-01_dp, 0.2822E-01_dp, 0.2822E-01_dp, & + 0.2822E-01_dp, 0.2822E-01_dp, 0.2822E-01_dp, 0.2822E-01_dp, 0.2822E-01_dp/ + DATA (scaviceplate(23,ja),ja=0,60)/ & + 0._dp, & + 0.1197E-01_dp, 0.1197E-01_dp, 0.1197E-01_dp, 0.1197E-01_dp, 0.1197E-01_dp, & + 0.1197E-01_dp, 0.1197E-01_dp, 0.1197E-01_dp, 0.1197E-01_dp, 0.1197E-01_dp, & + 0.1197E-01_dp, 0.9237E-02_dp, 0.6183E-02_dp, 0.4207E-02_dp, 0.2853E-02_dp, & + 0.2031E-02_dp, 0.1454E-02_dp, 0.1041E-02_dp, 0.7829E-03_dp, 0.5818E-03_dp, & + 0.4635E-03_dp, 0.3430E-03_dp, 0.2473E-03_dp, 0.1852E-03_dp, 0.1388E-03_dp, & + 0.1291E-03_dp, 0.1377E-03_dp, 0.1673E-03_dp, 0.2388E-03_dp, 0.3445E-03_dp, & + 0.4591E-03_dp, 0.6135E-03_dp, 0.8444E-03_dp, 0.1072E-02_dp, 0.1388E-02_dp, & + 0.1792E-02_dp, 0.2135E-02_dp, 0.2289E-02_dp, 0.2214E-02_dp, 0.2240E-02_dp, & + 0.2769E-02_dp, 0.5226E-02_dp, 0.1444E-01_dp, 0.3561E-01_dp, 0.3561E-01_dp, & + 0.3561E-01_dp, 0.3561E-01_dp, 0.3561E-01_dp, 0.3561E-01_dp, 0.3561E-01_dp, & + 0.3561E-01_dp, 0.3561E-01_dp, 0.3561E-01_dp, 0.3561E-01_dp, 0.3561E-01_dp, & + 0.3561E-01_dp, 0.3561E-01_dp, 0.3561E-01_dp, 0.3561E-01_dp, 0.3561E-01_dp/ + DATA (scaviceplate(24,ja),ja=0,60)/ & + 0._dp, & + 0.1325E-01_dp, 0.1325E-01_dp, 0.1325E-01_dp, 0.1325E-01_dp, 0.1325E-01_dp, & + 0.1325E-01_dp, 0.1325E-01_dp, 0.1325E-01_dp, 0.1325E-01_dp, 0.1325E-01_dp, & + 0.1325E-01_dp, 0.1015E-01_dp, 0.6859E-02_dp, 0.4678E-02_dp, 0.3160E-02_dp, & + 0.2259E-02_dp, 0.1628E-02_dp, 0.1164E-02_dp, 0.8773E-03_dp, 0.6512E-03_dp, & + 0.5213E-03_dp, 0.3817E-03_dp, 0.2756E-03_dp, 0.2065E-03_dp, 0.1530E-03_dp, & + 0.1447E-03_dp, 0.1559E-03_dp, 0.1920E-03_dp, 0.2786E-03_dp, 0.4021E-03_dp, & + 0.5376E-03_dp, 0.7244E-03_dp, 0.1008E-02_dp, 0.1283E-02_dp, 0.1671E-02_dp, & + 0.2178E-02_dp, 0.2604E-02_dp, 0.2791E-02_dp, 0.2689E-02_dp, 0.2712E-02_dp, & + 0.3351E-02_dp, 0.6319E-02_dp, 0.1747E-01_dp, 0.4299E-01_dp, 0.4299E-01_dp, & + 0.4299E-01_dp, 0.4299E-01_dp, 0.4299E-01_dp, 0.4299E-01_dp, 0.4299E-01_dp, & + 0.4299E-01_dp, 0.4299E-01_dp, 0.4299E-01_dp, 0.4299E-01_dp, 0.4299E-01_dp, & + 0.4299E-01_dp, 0.4299E-01_dp, 0.4299E-01_dp, 0.4299E-01_dp, 0.4299E-01_dp/ + DATA (scaviceplate(25,ja),ja=0,60)/ & + 0._dp, & + 0.1492E-01_dp, 0.1492E-01_dp, 0.1492E-01_dp, 0.1492E-01_dp, 0.1492E-01_dp, & + 0.1492E-01_dp, 0.1492E-01_dp, 0.1492E-01_dp, 0.1492E-01_dp, 0.1492E-01_dp, & + 0.1492E-01_dp, 0.1145E-01_dp, 0.7710E-02_dp, 0.5261E-02_dp, 0.3610E-02_dp, & + 0.2559E-02_dp, 0.1864E-02_dp, 0.1326E-02_dp, 0.9913E-03_dp, 0.7496E-03_dp, & + 0.5930E-03_dp, 0.4297E-03_dp, 0.3055E-03_dp, 0.2338E-03_dp, 0.1816E-03_dp, & + 0.1866E-03_dp, 0.2202E-03_dp, 0.2822E-03_dp, 0.4817E-03_dp, 0.7990E-03_dp, & + 0.1196E-02_dp, 0.1670E-02_dp, 0.2281E-02_dp, 0.2885E-02_dp, 0.3655E-02_dp, & + 0.4450E-02_dp, 0.5109E-02_dp, 0.5615E-02_dp, 0.5505E-02_dp, 0.5488E-02_dp, & + 0.6268E-02_dp, 0.9452E-02_dp, 0.2059E-01_dp, 0.4521E-01_dp, 0.4523E-01_dp, & + 0.4523E-01_dp, 0.4523E-01_dp, 0.4523E-01_dp, 0.4523E-01_dp, 0.4523E-01_dp, & + 0.4523E-01_dp, 0.4523E-01_dp, 0.4523E-01_dp, 0.4523E-01_dp, 0.4523E-01_dp, & + 0.4523E-01_dp, 0.4523E-01_dp, 0.4523E-01_dp, 0.4523E-01_dp, 0.4523E-01_dp/ + DATA (scaviceplate(26,ja),ja=0,60)/ & + 0._dp, & + 0.1665E-01_dp, 0.1665E-01_dp, 0.1665E-01_dp, 0.1665E-01_dp, 0.1665E-01_dp, & + 0.1665E-01_dp, 0.1665E-01_dp, 0.1665E-01_dp, 0.1665E-01_dp, 0.1665E-01_dp, & + 0.1665E-01_dp, 0.1283E-01_dp, 0.8593E-02_dp, 0.5864E-02_dp, 0.4088E-02_dp, & + 0.2874E-02_dp, 0.2111E-02_dp, 0.1495E-02_dp, 0.1109E-02_dp, 0.8534E-03_dp, & + 0.6674E-03_dp, 0.4794E-03_dp, 0.3358E-03_dp, 0.2624E-03_dp, 0.2128E-03_dp, & + 0.2336E-03_dp, 0.2931E-03_dp, 0.3848E-03_dp, 0.7159E-03_dp, 0.1261E-02_dp, & + 0.1964E-02_dp, 0.2775E-02_dp, 0.3766E-02_dp, 0.4752E-02_dp, 0.5964E-02_dp, & + 0.7081E-02_dp, 0.8001E-02_dp, 0.8882E-02_dp, 0.8768E-02_dp, 0.8704E-02_dp, & + 0.9631E-02_dp, 0.1297E-01_dp, 0.2373E-01_dp, 0.4644E-01_dp, 0.4648E-01_dp, & + 0.4648E-01_dp, 0.4648E-01_dp, 0.4648E-01_dp, 0.4648E-01_dp, 0.4648E-01_dp, & + 0.4648E-01_dp, 0.4648E-01_dp, 0.4648E-01_dp, 0.4648E-01_dp, 0.4648E-01_dp, & + 0.4648E-01_dp, 0.4648E-01_dp, 0.4648E-01_dp, 0.4648E-01_dp, 0.4648E-01_dp/ + DATA (scaviceplate(27,ja),ja=0,60)/ & + 0._dp, & + 0.1839E-01_dp, 0.1839E-01_dp, 0.1839E-01_dp, 0.1839E-01_dp, 0.1839E-01_dp, & + 0.1839E-01_dp, 0.1839E-01_dp, 0.1839E-01_dp, 0.1839E-01_dp, 0.1839E-01_dp, & + 0.1839E-01_dp, 0.1421E-01_dp, 0.9477E-02_dp, 0.6468E-02_dp, 0.4566E-02_dp, & + 0.3189E-02_dp, 0.2359E-02_dp, 0.1664E-02_dp, 0.1227E-02_dp, 0.9572E-03_dp, & + 0.7417E-03_dp, 0.5291E-03_dp, 0.3661E-03_dp, 0.2910E-03_dp, 0.2441E-03_dp, & + 0.2806E-03_dp, 0.3661E-03_dp, 0.4875E-03_dp, 0.9502E-03_dp, 0.1722E-02_dp, & + 0.2732E-02_dp, 0.3880E-02_dp, 0.5251E-02_dp, 0.6618E-02_dp, 0.8273E-02_dp, & + 0.9711E-02_dp, 0.1089E-01_dp, 0.1215E-01_dp, 0.1203E-01_dp, 0.1192E-01_dp, & + 0.1299E-01_dp, 0.1650E-01_dp, 0.2687E-01_dp, 0.4767E-01_dp, 0.4773E-01_dp, & + 0.4773E-01_dp, 0.4773E-01_dp, 0.4773E-01_dp, 0.4773E-01_dp, 0.4773E-01_dp, & + 0.4773E-01_dp, 0.4773E-01_dp, 0.4773E-01_dp, 0.4773E-01_dp, 0.4773E-01_dp, & + 0.4773E-01_dp, 0.4773E-01_dp, 0.4773E-01_dp, 0.4773E-01_dp, 0.4773E-01_dp/ + DATA (scaviceplate(28,ja),ja=0,60)/ & + 0._dp, & + 0.2013E-01_dp, 0.2013E-01_dp, 0.2013E-01_dp, 0.2013E-01_dp, 0.2013E-01_dp, & + 0.2013E-01_dp, 0.2013E-01_dp, 0.2013E-01_dp, 0.2013E-01_dp, 0.2013E-01_dp, & + 0.2013E-01_dp, 0.1559E-01_dp, 0.1036E-01_dp, 0.7071E-02_dp, 0.5044E-02_dp, & + 0.3504E-02_dp, 0.2606E-02_dp, 0.1833E-02_dp, 0.1344E-02_dp, 0.1061E-02_dp, & + 0.8161E-03_dp, 0.5788E-03_dp, 0.3964E-03_dp, 0.3195E-03_dp, 0.2753E-03_dp, & + 0.3276E-03_dp, 0.4390E-03_dp, 0.5902E-03_dp, 0.1184E-02_dp, 0.2184E-02_dp, & + 0.3500E-02_dp, 0.4985E-02_dp, 0.6735E-02_dp, 0.8485E-02_dp, 0.1058E-01_dp, & + 0.1234E-01_dp, 0.1378E-01_dp, 0.1542E-01_dp, 0.1529E-01_dp, 0.1514E-01_dp, & + 0.1636E-01_dp, 0.2002E-01_dp, 0.3001E-01_dp, 0.4890E-01_dp, 0.4899E-01_dp, & + 0.4899E-01_dp, 0.4899E-01_dp, 0.4899E-01_dp, 0.4899E-01_dp, 0.4899E-01_dp, & + 0.4899E-01_dp, 0.4899E-01_dp, 0.4899E-01_dp, 0.4899E-01_dp, 0.4899E-01_dp, & + 0.4899E-01_dp, 0.4899E-01_dp, 0.4899E-01_dp, 0.4899E-01_dp, 0.4899E-01_dp/ + DATA (scaviceplate(29,ja),ja=0,60)/ & + 0._dp, & + 0.2186E-01_dp, 0.2186E-01_dp, 0.2186E-01_dp, 0.2186E-01_dp, 0.2186E-01_dp, & + 0.2186E-01_dp, 0.2186E-01_dp, 0.2186E-01_dp, 0.2186E-01_dp, 0.2186E-01_dp, & + 0.2186E-01_dp, 0.1697E-01_dp, 0.1124E-01_dp, 0.7675E-02_dp, 0.5522E-02_dp, & + 0.3819E-02_dp, 0.2854E-02_dp, 0.2002E-02_dp, 0.1462E-02_dp, 0.1165E-02_dp, & + 0.8904E-03_dp, 0.6286E-03_dp, 0.4267E-03_dp, 0.3481E-03_dp, 0.3066E-03_dp, & + 0.3745E-03_dp, 0.5120E-03_dp, 0.6928E-03_dp, 0.1419E-02_dp, 0.2645E-02_dp, & + 0.4269E-02_dp, 0.6090E-02_dp, 0.8220E-02_dp, 0.1035E-01_dp, 0.1289E-01_dp, & + 0.1497E-01_dp, 0.1668E-01_dp, 0.1868E-01_dp, 0.1856E-01_dp, 0.1835E-01_dp, & + 0.1972E-01_dp, 0.2354E-01_dp, 0.3315E-01_dp, 0.5012E-01_dp, 0.5024E-01_dp, & + 0.5024E-01_dp, 0.5024E-01_dp, 0.5024E-01_dp, 0.5024E-01_dp, 0.5024E-01_dp, & + 0.5024E-01_dp, 0.5024E-01_dp, 0.5024E-01_dp, 0.5024E-01_dp, 0.5024E-01_dp, & + 0.5024E-01_dp, 0.5024E-01_dp, 0.5024E-01_dp, 0.5024E-01_dp, 0.5024E-01_dp/ + DATA (scaviceplate(30,ja),ja=0,60)/ & + 0._dp, & + 0.2360E-01_dp, 0.2360E-01_dp, 0.2360E-01_dp, 0.2360E-01_dp, 0.2360E-01_dp, & + 0.2360E-01_dp, 0.2360E-01_dp, 0.2360E-01_dp, 0.2360E-01_dp, 0.2360E-01_dp, & + 0.2360E-01_dp, 0.1835E-01_dp, 0.1213E-01_dp, 0.8278E-02_dp, 0.6000E-02_dp, & + 0.4134E-02_dp, 0.3101E-02_dp, 0.2171E-02_dp, 0.1580E-02_dp, 0.1269E-02_dp, & + 0.9648E-03_dp, 0.6783E-03_dp, 0.4570E-03_dp, 0.3766E-03_dp, 0.3378E-03_dp, & + 0.4215E-03_dp, 0.5850E-03_dp, 0.7955E-03_dp, 0.1653E-02_dp, 0.3107E-02_dp, & + 0.5037E-02_dp, 0.7195E-02_dp, 0.9704E-02_dp, 0.1222E-01_dp, 0.1520E-01_dp, & + 0.1760E-01_dp, 0.1957E-01_dp, 0.2195E-01_dp, 0.2182E-01_dp, 0.2157E-01_dp, & + 0.2308E-01_dp, 0.2706E-01_dp, 0.3629E-01_dp, 0.5136E-01_dp, 0.5149E-01_dp, & + 0.5149E-01_dp, 0.5149E-01_dp, 0.5149E-01_dp, 0.5149E-01_dp, 0.5149E-01_dp, & + 0.5149E-01_dp, 0.5149E-01_dp, 0.5149E-01_dp, 0.5149E-01_dp, 0.5149E-01_dp, & + 0.5149E-01_dp, 0.5149E-01_dp, 0.5149E-01_dp, 0.5149E-01_dp, 0.5149E-01_dp/ + DATA (scaviceplate(31,ja),ja=0,60)/ & + 0._dp, & + 0.2534E-01_dp, 0.2534E-01_dp, 0.2534E-01_dp, 0.2534E-01_dp, 0.2534E-01_dp, & + 0.2534E-01_dp, 0.2534E-01_dp, 0.2534E-01_dp, 0.2534E-01_dp, 0.2534E-01_dp, & + 0.2534E-01_dp, 0.1973E-01_dp, 0.1301E-01_dp, 0.8881E-02_dp, 0.6478E-02_dp, & + 0.4449E-02_dp, 0.3349E-02_dp, 0.2339E-02_dp, 0.1698E-02_dp, 0.1372E-02_dp, & + 0.1039E-02_dp, 0.7280E-03_dp, 0.4873E-03_dp, 0.4052E-03_dp, 0.3691E-03_dp, & + 0.4685E-03_dp, 0.6579E-03_dp, 0.8981E-03_dp, 0.1887E-02_dp, 0.3569E-02_dp, & + 0.5805E-02_dp, 0.8300E-02_dp, 0.1119E-01_dp, 0.1409E-01_dp, 0.1751E-01_dp, & + 0.2023E-01_dp, 0.2246E-01_dp, 0.2522E-01_dp, 0.2508E-01_dp, 0.2478E-01_dp, & + 0.2644E-01_dp, 0.3058E-01_dp, 0.3942E-01_dp, 0.5258E-01_dp, 0.5274E-01_dp, & + 0.5274E-01_dp, 0.5274E-01_dp, 0.5274E-01_dp, 0.5274E-01_dp, 0.5274E-01_dp, & + 0.5274E-01_dp, 0.5274E-01_dp, 0.5274E-01_dp, 0.5274E-01_dp, 0.5274E-01_dp, & + 0.5274E-01_dp, 0.5274E-01_dp, 0.5274E-01_dp, 0.5274E-01_dp, 0.5274E-01_dp/ + DATA (scaviceplate(32,ja),ja=0,60)/ & + 0._dp, & + 0.2707E-01_dp, 0.2707E-01_dp, 0.2707E-01_dp, 0.2707E-01_dp, 0.2707E-01_dp, & + 0.2707E-01_dp, 0.2707E-01_dp, 0.2707E-01_dp, 0.2707E-01_dp, 0.2707E-01_dp, & + 0.2707E-01_dp, 0.2111E-01_dp, 0.1390E-01_dp, 0.9485E-02_dp, 0.6956E-02_dp, & + 0.4764E-02_dp, 0.3596E-02_dp, 0.2508E-02_dp, 0.1815E-02_dp, 0.1476E-02_dp, & + 0.1113E-02_dp, 0.7777E-03_dp, 0.5175E-03_dp, 0.4337E-03_dp, 0.4003E-03_dp, & + 0.5155E-03_dp, 0.7309E-03_dp, 0.1001E-02_dp, 0.2121E-02_dp, 0.4030E-02_dp, & + 0.6574E-02_dp, 0.9405E-02_dp, 0.1267E-01_dp, 0.1595E-01_dp, 0.1982E-01_dp, & + 0.2286E-01_dp, 0.2535E-01_dp, 0.2848E-01_dp, 0.2834E-01_dp, 0.2800E-01_dp, & + 0.2981E-01_dp, 0.3410E-01_dp, 0.4256E-01_dp, 0.5381E-01_dp, 0.5400E-01_dp, & + 0.5400E-01_dp, 0.5400E-01_dp, 0.5400E-01_dp, 0.5400E-01_dp, 0.5400E-01_dp, & + 0.5400E-01_dp, 0.5400E-01_dp, 0.5400E-01_dp, 0.5400E-01_dp, 0.5400E-01_dp, & + 0.5400E-01_dp, 0.5400E-01_dp, 0.5400E-01_dp, 0.5400E-01_dp, 0.5400E-01_dp/ + DATA (scaviceplate(33,ja),ja=0,60)/ & + 0._dp, & + 0.2881E-01_dp, 0.2881E-01_dp, 0.2881E-01_dp, 0.2881E-01_dp, 0.2881E-01_dp, & + 0.2881E-01_dp, 0.2881E-01_dp, 0.2881E-01_dp, 0.2881E-01_dp, 0.2881E-01_dp, & + 0.2881E-01_dp, 0.2249E-01_dp, 0.1478E-01_dp, 0.1009E-01_dp, 0.7434E-02_dp, & + 0.5079E-02_dp, 0.3844E-02_dp, 0.2677E-02_dp, 0.1933E-02_dp, 0.1580E-02_dp, & + 0.1188E-02_dp, 0.8274E-03_dp, 0.5478E-03_dp, 0.4623E-03_dp, 0.4316E-03_dp, & + 0.5625E-03_dp, 0.8039E-03_dp, 0.1103E-02_dp, 0.2355E-02_dp, 0.4492E-02_dp, & + 0.7342E-02_dp, 0.1051E-01_dp, 0.1416E-01_dp, 0.1782E-01_dp, 0.2213E-01_dp, & + 0.2550E-01_dp, 0.2825E-01_dp, 0.3175E-01_dp, 0.3160E-01_dp, 0.3122E-01_dp, & + 0.3317E-01_dp, 0.3762E-01_dp, 0.4570E-01_dp, 0.5504E-01_dp, 0.5525E-01_dp, & + 0.5525E-01_dp, 0.5525E-01_dp, 0.5525E-01_dp, 0.5525E-01_dp, 0.5525E-01_dp, & + 0.5525E-01_dp, 0.5525E-01_dp, 0.5525E-01_dp, 0.5525E-01_dp, 0.5525E-01_dp, & + 0.5525E-01_dp, 0.5525E-01_dp, 0.5525E-01_dp, 0.5525E-01_dp, 0.5525E-01_dp/ + DATA (scaviceplate(34,ja),ja=0,60)/ & + 0._dp, & + 0.2978E-01_dp, 0.2978E-01_dp, 0.2978E-01_dp, 0.2978E-01_dp, 0.2978E-01_dp, & + 0.2978E-01_dp, 0.2978E-01_dp, 0.2978E-01_dp, 0.2978E-01_dp, 0.2978E-01_dp, & + 0.2978E-01_dp, 0.2326E-01_dp, 0.1527E-01_dp, 0.1043E-01_dp, 0.7702E-02_dp, & + 0.5255E-02_dp, 0.3982E-02_dp, 0.2772E-02_dp, 0.1999E-02_dp, 0.1638E-02_dp, & + 0.1230E-02_dp, 0.8553E-03_dp, 0.5648E-03_dp, 0.4783E-03_dp, 0.4491E-03_dp, & + 0.5888E-03_dp, 0.8447E-03_dp, 0.1161E-02_dp, 0.2487E-02_dp, 0.4750E-02_dp, & + 0.7772E-02_dp, 0.1113E-01_dp, 0.1499E-01_dp, 0.1886E-01_dp, 0.2342E-01_dp, & + 0.2697E-01_dp, 0.2987E-01_dp, 0.3358E-01_dp, 0.3343E-01_dp, 0.3302E-01_dp, & + 0.3505E-01_dp, 0.3960E-01_dp, 0.4746E-01_dp, 0.5573E-01_dp, 0.5595E-01_dp, & + 0.5595E-01_dp, 0.5595E-01_dp, 0.5595E-01_dp, 0.5595E-01_dp, 0.5595E-01_dp, & + 0.5595E-01_dp, 0.5595E-01_dp, 0.5595E-01_dp, 0.5595E-01_dp, 0.5595E-01_dp, & + 0.5595E-01_dp, 0.5595E-01_dp, 0.5595E-01_dp, 0.5595E-01_dp, 0.5595E-01_dp/ +!< +!! \filename +!! mo_hammoz_drydep.f90 +!! +!! \brief +!! Module to interface ECHAM submodules with dry deposition module(s). +!! +!! \author M. Schultz (FZ Juelich) +!! \author Grazia Frontoso (C2SM) +!! +!! \responsible_coder +!! M. Schultz, m.schultz@fz-juelich.de +!! +!! \revision_history +!! -# M. Schultz (FZ Juelich) - original code (2009-10-26) +!! -# M. Schultz (FZ Juelich) - improved diag routines (2010-04-16) +!! -# Grazia Frontoso (C2SM) - usage of the input variables defined over land, water, ice to account +!! for the non-linearity in the drydep calculations for gridboxes +!! containing both water and sea ice (2012-02-01) +!! +!! \limitations +!! All diag_lists must be defined in order to avoid problems with +!! get_diag_pointer in the actual sedi_interface routine. Lists can be empty. +!! +!! \details +!! Currently there is only one unified interactive drydep scheme for +!! aerosols (HAM) and gas-phase species (MOZ). +!! This module initializes the scheme based on the namelist parameters +!! in submodeldiagctl and creates a stream for variable pointers and +!! diagnostic quantities used in the dry deposition scheme. It also +!! provides a generic interface to the actual dry deposition routine(s). +!! +!! \bibliographic_references +!! None +!! +!! \belongs_to +!! HAMMOZ +!! +!! \copyright +!! Copyright and licencing conditions are defined in the ECHAM-HAMMOZ +!! licencing agreement to be found at: +!! https://redmine.hammoz.ethz.ch/projects/hammoz/wiki/1_Licencing_conditions +!! The ECHAM-HAMMOZ software is provided "as is" and without warranty of any kind. +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +MODULE mo_hammoz_drydep + + USE mo_kind, ONLY: dp +#ifdef HAMMOZ + USE mo_submodel_diag, ONLY: t_diag_list +#endif + IMPLICIT NONE + + PRIVATE + + ! public variables (see declaration below) + + ! subprograms +#ifdef HAMMOZ + PUBLIC :: init_drydep_stream, & + drydep_interface, drydep_init +#else + PUBLIC :: drydep_interface +#endif + ! drydep_stream + INTEGER, PARAMETER :: ndrydepvars=2 + CHARACTER(LEN=32) :: drydepvars(1:ndrydepvars)= & + (/'ddep ', & ! total drydep flux + 'vddep ' /) ! deposition velocity + + ! variable pointers and diagnostic lists +!! TYPE (t_diag_list), PUBLIC :: ddepinst ! inst. dry deposition flux ### needed ??? ### +#ifdef HAMMOZ + TYPE (t_diag_list), PUBLIC :: ddep ! dry deposition flux + TYPE (t_diag_list), PUBLIC :: vddep ! dry deposition velocity +#endif + INTEGER :: idt_ddep_detail + + CONTAINS +#ifdef HAMMOZ +!>>gf #244 + SUBROUTINE drydep_init + + USE mo_hammoz_drydep_lg, ONLY: drydep_lg_init + USE mo_tracdef, ONLY: ntrac, trlist + + !--- initialize the interactive drydep scheme (ndrydep==2) + IF (ANY(trlist%ti(1:ntrac)%ndrydep == 2)) CALL drydep_lg_init + + END SUBROUTINE drydep_init +!< 0) CALL finish ( 'ini_drydep_stream', 'variable '// & + drydepnam(ierr)//' does not exist in drydep stream' ) + END IF + + !-- find out which gas-phase tracers shall be included in diagnostics + CALL validate_traclist(drydep_gastrac, defaultgas, nphase=GAS, & + ldrydep=.true.) !>>dod SOA: removed ltran < 0) THEN + tracflag(jt) = trlist%ti(jt)%ndrydep > 0 + END IF + END IF + END DO + specflag(:) = .FALSE. + DO jt = 1,nspec + specname(jt) = speclist(jt)%shortname + IF (drydep_keytype == BYSPECIES .AND. & + IAND(speclist(jt)%nphase, AEROSOL) /= 0 .AND. & !>>dod SOA removed check of trtype < 0) THEN + specflag(jt) = speclist(jt)%ldrydep + END IF + END DO + DO jt = 1,ntrac + tracname(jt) = trlist%ti(jt)%fullname + IF (trlist%ti(jt)%nphase == GAS) THEN + tracflag(jt) = st1_in_st2_proof(trlist%ti(jt)%fullname, drydep_gastrac) + END IF + END DO +!--mgs + modflag(:) = .FALSE. + modname(:) = '' + !SF #228, adding a condition to check that HAM is active: + !SF #299, adding a condition to check if BYMODE is relevant: + IF (lham .AND. nclass > 0 .AND. (drydep_keytype == BYMODE)) & + CALL ham_get_class_flag(nclass, modflag, modname, modnumname, ldrydep=.true.) + + !-- open new diagnostic stream + CALL new_stream (sdrydep,'drydep',lpost=drydep_lpost,lrerun=.FALSE., & + interval=drydep_tinterval) + CALL default_stream_setting (sdrydep, lrerun = .FALSE., & + leveltype=SURFACE, & !++mgs 20140519: added this for safety + contnorest = .TRUE., table = 199, & + laccu = .false., code = AUTO) + + !-- add standard ECHAM variables + IF (drydep_lpost) THEN + CALL add_stream_reference (sdrydep, 'geosp' ,'g3b' ,lpost=.TRUE.) + CALL add_stream_reference (sdrydep, 'lsp' ,'sp' ,lpost=.TRUE.) + CALL add_stream_reference (sdrydep, 'aps' ,'g3b' ,lpost=.TRUE.) + CALL add_stream_reference (sdrydep, 'gboxarea','geoloc',lpost=.TRUE.) + END IF + + !-- add instantaneous drydep rates (always by tracer) + !-- these are used in the calculation and must always be present in the stream + !-- it is never output +!! CALL default_stream_setting (drydep, lrerun=.TRUE.) +!! CALL new_diag_list (ddepinst, drydep, diagname='ddep_inst', tsubmname='', & +!! longname='dry deposition mass flux', units='kg m-2 s-1', & +!! ndims=2, nmaxkey=(/ntrac, 0, 0, 0 /) ) +!! DO jt = 1,ntrac +!! IF (trlist%ti(jt)%ndrydep > 0) THEN +!! cunit = 'kg m-2 s-1' +!! CALL new_diag(ddepinst, 'ddepinst_'//TRIM(trlist%ti(jt)%fullname), & +!! 'dry deposition mass flux of '//TRIM(trlist%ti(jt)%fullname), & +!! cunit, BYTRACER, jt, lpost=.false.) +!! END IF +!! END DO + + !-- instantaneous diagnostic quantities + + CALL default_stream_setting (sdrydep, lrerun=.FALSE., laccu=.FALSE.) + + !-- drydep velocities + !-- these are used in the calculation and must always be present in the stream + !-- drydep_gastrac only controls output + lpost = st1_in_st2_proof( 'vddep', drydepnam) .AND. drydep_lpost + CALL new_diag_list (vddep, sdrydep, diagname='vddep', tsubmname='', & + longname='dry deposition velocity', units='m s-1', & + ndims=2, nmaxkey=(/ntrac, 0, nclass, nclass, 0 /), lpost=lpost ) + CALL new_diag(vddep, ntrac, tracflag, tracname, BYTRACER) + IF (ANY(modflag)) THEN !SF #299 added mode mass diags and fix for mode number name + CALL new_diag(vddep, nclass, modflag, modname, BYMODE) + CALL new_diag(vddep, nclass, modflag, modnumname, BYNUMMODE) + END IF + + !-- averaged diagnostic quantities + + CALL default_stream_setting (sdrydep, lrerun=.FALSE., laccu=.TRUE.) + + !-- total drydep flux + lpost = st1_in_st2_proof( 'ddep', drydepnam) .AND. drydep_lpost + CALL new_diag_list (ddep, sdrydep, diagname='ddep', tsubmname='', & + longname='accumulated dry deposition flux',& + units='kg m-2 s-1', ndims=2, & + nmaxkey=(/ntrac, nspec, nclass, nclass, 0 /), lpost=lpost ) + ! add diagnostic elements only when output is activated + IF (lpost) THEN + CALL new_diag(ddep, ntrac, tracflag, tracname, BYTRACER) + CALL new_diag(ddep, nspec, specflag, specname, BYSPECIES) + IF (ANY(modflag)) THEN !SF #299 added mode mass diags and fix for mode number name + CALL new_diag(ddep, nclass, modflag, modname, BYMODE) + CALL new_diag(ddep, nclass, modflag, modnumname, BYNUMMODE) + END IF + END IF + + !++mgs 20140519 : detailed diagnostics + IF (drydep_ldetail) CALL init_drydep_lg_stream(sdrydep, drydep_trac_detail, idt_ddep_detail) + + END SUBROUTINE init_drydep_stream +#endif + !! --------------------------------------------------------------------------------------- + !! drydep_interface: generic interface routine to dry deposition + + SUBROUTINE drydep_interface(kbdim, kproma, klev, krow, & +!>>gf modified argument list (see#78) + pqsfc, pqsssfc, ptsfc, pcfml, pcfmw, pcfmi, & + pcfncl, pcfncw, pcfnci, & + pepdu2, pkap, pum1, pvm1, pgeom1, pril, priw, & + prii, & + ptvir1, ptvl, ptvw, ptvi, paz0, & + ptslm1, loland, & + pm6rp, prhop, & ! m7 + pfrl, pfrw, pfri, pcvs, pcvw, pvgrat, & + psrfl, pu10, pv10, & + pxtems, pxtm1, pdensair, paphp1, pforest, ptsi, & + paz0l, paz0w, paz0i, pcdnl, pcdnw, pcdni, pddepflux, pvdep) !eehol: added pddepflux for diagnostics, pvdep for diagnostics + +!<> gf see #78 + REAL(dp), INTENT(in) :: pcfml (kbdim) ! stability dependend transfer coeff. for momentum over land + REAL(dp), INTENT(in) :: pcfmw (kbdim) ! stability dependend transfer coeff. for momentum over water + REAL(dp), INTENT(in) :: pcfmi (kbdim) ! stability dependend transfer coeff. for momentum over ice + REAL(dp), INTENT(in) :: pcfncl (kbdim) ! function of heat transfer coeff. over land + REAL(dp), INTENT(in) :: pcfncw (kbdim) ! function of heat transfer coeff. over water + REAL(dp), INTENT(in) :: pcfnci (kbdim) ! function of heat transfer coeff. over ice +!<>gf see #78 + REAL(dp), INTENT(in) :: pril (kbdim) ! moist richardson number ocer land + REAL(dp), INTENT(in) :: priw (kbdim) ! moist richardson number over water + REAL(dp), INTENT(in) :: prii (kbdim) ! moist richardson number over ice +!<>gf see #78 + REAL(dp), INTENT(in) :: ptvl (kbdim) ! virtual potential temp. over land + REAL(dp), INTENT(in) :: ptvw (kbdim) ! virtual potential temp. over ocean + REAL(dp), INTENT(in) :: ptvi (kbdim) ! virtual potential temp. over ice +!<>gf see #78 + REAL(dp), INTENT(in) :: pcdnl (kbdim) ! see mo_surface_land + REAL(dp), INTENT(in) :: pcdnw (kbdim) ! see mo_surface_ocean + REAL(dp), INTENT(in) :: pcdni (kbdim) ! see mo_surface_ice +#ifndef HAMMOZ + REAL(dp), PARAMETER :: ustarmin=1.e-5_dp +#endif +!<>gf see #78 + zustveg(kbdim), zustslsn(kbdim), & + zustarl(kbdim), zustarw(kbdim), zustari(kbdim), & + zvgrat(kbdim), zcvbs(kbdim), zrh(kbdim), zhgt(kbdim) !eehol: added zhgt (geopotential height) for analytical calculations +!<2) ) THEN + CALL finish('drydep_interface', 'Dry deposition with ndrydep > 2 not implemented') + END IF + + !--- 2.1) Prescibed dry deposition velocities: +#ifdef HAMMOZ + IF( ANY(trlist%ti(:)%ndrydep==1) ) THEN + CALL ham_vd_presc(kproma, kbdim, klev, krow, loland, & + paphp1, pcvs, pforest, pfri, ptsi, & + pcvw, ptslm1, zws, zwsmx, pdensair, & + zvd ) + END IF +#endif + !--- 2.2) Explicitly calculated dry deposition velocities (Ganzeveld scheme): + + IF ( ANY(trlist%ti(:)%ndrydep==2) ) THEN +#ifdef HAMMOZ + !--- Calculate the aerodynamic resistance: + CALL drydep_lg_calcra (kproma, kbdim, klev, krow, & +!>>gf modified argument list (see #78) + pepdu2, pkap, pum1, pvm1, pgeom1, pril, priw, prii, & + ptvir1, ptvl, ptvw, ptvi, ptslm1, loland, & + pcdnl, pcdnw, pcdni, pcfml, pcfmw, pcfmi, & + pcfncl, pcfncw, pcfnci, & + paz0w, paz0i, paz0l, & + zrahwat, zrahice, zrahveg, zrahslsn, & + zustarl, zustarw, zustari, zustveg, zustslsn ) +!<>gf modified argument list (see#78) + psrfl, ptslm1, pum1, pvm1, zrh, & + pfrl, pfrw, pfri, zcvbs, pcvs, & + pcvw, zvgrat, zrahwat, zrahice, zrahveg, & + zrahslsn, zws, zwsmx, & + zustarw, zustari, zustveg, zustslsn, & + zvd, zvdstom, idt_ddep_detail ) +!<>gf modified argument list (see#78) + pvm1, zustarl, zustarw, zustari, zustveg, zustslsn,& + pu10, pv10, & + pm6rp, prhop, & ! m7 + paz0w, paz0i, zrahwat, zrahice, zrahveg, zrahslsn,& + ptslm1, zrh, pxtm1, zvd ) +!< 0) THEN + !--- Calculate the tracer flux to the surface that is + ! equivalent to the deposition velocity: + pvdep(1:kproma,jt) = zvd(1:kproma,jt) !eehol: dry deposition velocity for diagnostics + + !-->eehol: analytical ddep flux calculations + zhgt(1:kproma)=(paphp1(1:kproma,klev+1)-paphp1(1:kproma,klev))/(pdensair(1:kproma)*grav) + zalpha(1:kproma)=time_step_len*zvd(1:kproma,jt)/zhgt(1:kproma) + zaeri(1:kproma)=pxtm1(1:kproma,klev,jt)*EXP(-1.0_dp*zalpha(1:kproma)) + zdrydepflux(1:kproma)=(pxtm1(1:kproma,klev,jt)-zaeri(1:kproma))*(paphp1(1:kproma,klev+1)-paphp1(1:kproma,klev))*(1.0_dp/time_step_len)*(1.0_dp/grav) + zdrydepflux(1:kproma)=MAX(0._dp,zdrydepflux(1:kproma)) + !<--eehol + + !zdrydepflux(1:kproma)=pxtm1(1:kproma,klev,jt)*pdensair(1:kproma)*zvd(1:kproma,jt) + !zdrydepflux(1:kproma)=MAX(0._dp,(pxtm1(1:kproma,klev,jt)*pdensair(1:kproma)*zvd(1:kproma,jt))) !eehol: ddepflux cant be negative + + !--- Reduce emission flux: + pxtems(1:kproma,jt)=pxtems(1:kproma,jt)-zdrydepflux(1:kproma) + !-->eehol: drydep flux for diagnostics + pddepflux(1:kproma,jt) = zdrydepflux(1:kproma) + !<--eehol + ELSE ! trlist%ti(jt)%ndrydep <= 0 + zdrydepflux(1:kproma)=0._dp + !-->eehol: drydep flux for diagnostics + pddepflux(1:kproma,jt) = zdrydepflux(1:kproma) + !<--eehol + END IF +#ifdef HAMMOZ + ! get diagnostics pointer + CALL get_diag_pointer(ddep, fld2d, jt, ierr=ierr) + IF (ierr == 0) fld2d(1:kproma,krow)=fld2d(1:kproma,krow)+zdrydepflux(1:kproma)*delta_time +!### add stomatal deposition flux ... ### + ! special diagnostics for MOZ + !! CALL moz_drydep_diag() .... ### to be done in mo_moz_diag +#endif + END DO + + END SUBROUTINE drydep_interface + + +END MODULE mo_hammoz_drydep diff --git a/ifs-source/arpifs/phys_ec/mo_hammoz_sedimentation.F90 b/ifs-source/arpifs/phys_ec/mo_hammoz_sedimentation.F90 new file mode 100644 index 00000000..40043ce9 --- /dev/null +++ b/ifs-source/arpifs/phys_ec/mo_hammoz_sedimentation.F90 @@ -0,0 +1,290 @@ +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! \filename +!! mo_hammoz_sedimentation.f90 +!! +!! \brief +!! module to interface ECHAM submodules with sedimentation module(s) +!! +!! \author M. Schultz (FZ Juelich) +!! +!! \responsible_coder +!! M. Schultz, m.schultz@fz-juelich.de +!! +!! \revision_history +!! -# M. Schultz (FZ Juelich) - original code (2009-10-26) +!! -# M. Schultz (FZ Juelich) - improved diag routines (2010-04-16) +!! +!! \limitations +!! All diag_lists must be defined in order to avoid problems with +!! get_diag_pointer in the actual sedi_interface routine. Lists can be empty. +!! Currently there is only one unified interactive sedimentation scheme for +!! aerosols (HAM). +!! +!! \details +!! This module initializes the scheme based on the namelist parameters +!! in submodeldiagctl and creates a stream for variable pointers and +!! diagnostic quantities used in the sedimentation scheme. It also +!! provides a generic interface to the actual sedimentation routine(s). +!! +!! \bibliographic_references +!! None +!! +!! \belongs_to +!! HAMMOZ +!! +!! +!! SPDX-License-Identifier: BSD-3-Clause +!! Copyright (c) 2021 hammoz +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +MODULE mo_hammoz_sedimentation + + USE mo_kind, ONLY: dp +#ifdef HAMMOZ + USE mo_submodel_diag, ONLY: t_diag_list +#endif + + IMPLICIT NONE + + PRIVATE + + ! public variables (see declaration below) + + ! subprograms + PUBLIC :: sedi_interface +#ifdef HAMMOZ + PUBLIC :: init_sedi_stream + + ! sedi_stream + INTEGER, PARAMETER :: nsedivars=2 + CHARACTER(LEN=32) :: sedivars(1:nsedivars)= & + (/'sed ', & ! total sedimentation flux + 'vsedi ' /) ! sedimentation velocity + + ! variable pointers and diagnostic lists + TYPE (t_diag_list), PUBLIC :: sed ! sedimentation flux + TYPE (t_diag_list), PUBLIC :: vsedi ! sedimentation velocity +#endif + + CONTAINS + +#ifdef HAMMOZ + SUBROUTINE init_sedi_stream + + USE mo_string_utls, ONLY: st1_in_st2_proof + USE mo_util_string, ONLY: tolower + USE mo_exception, ONLY: finish + USE mo_memory_base, ONLY: t_stream, new_stream, & + default_stream_setting, & + add_stream_reference, & + AUTO + USE mo_ham_m7_trac, ONLY: ham_get_class_flag + USE mo_tracdef, ONLY: ln, ntrac, trlist, AEROSOL + USE mo_species, ONLY: nspec, speclist + USE mo_ham, ONLY: nclass + USE mo_submodel_streams, ONLY: sedi_lpost, sedi_tinterval, sedinam, sedi_keytype + USE mo_submodel_diag, ONLY: new_diag_list, new_diag, & + BYTRACER, BYSPECIES, BYNUMMODE, BYMODE !SF #299 added BYMODE + USE mo_submodel, ONLY: lham !SF, see #228 + + + ! local variables + INTEGER, PARAMETER :: ndefault = 2 + CHARACTER(LEN=32) :: defnam(1:ndefault) = & ! default output + (/ 'sed ', & ! total sedimentation flux + 'vsedi ' /) ! sedimentation velocity + + LOGICAL :: tracflag(ntrac), specflag(nspec), modflag(MAX(nclass,1)) + CHARACTER(LEN=ln) :: tracname(ntrac), specname(nspec), modname(MAX(nclass,1)), & + modnumname(MAX(nclass,1)) !SF #299 + TYPE (t_stream), POINTER :: ssedi + INTEGER :: ierr, jt + LOGICAL :: lpost + + !++mgs: default values and namelist read are done in init_submodel_streams ! + + !-- handle ALL, DETAIL and DEFAULT options for sedi output variables + !-- Note: ALL and DETAIL are identical for sedi output + IF (TRIM(tolower(sedinam(1))) == 'detail') sedinam(1:nsedivars) = sedivars(:) + IF (TRIM(tolower(sedinam(1))) == 'all') sedinam(1:nsedivars) = sedivars(:) + IF (TRIM(tolower(sedinam(1))) == 'default') sedinam(1:ndefault) = defnam(:) + + !-- check that all variable names from namelist are valid + IF (.NOT. st1_in_st2_proof( sedinam, sedivars, ierr=ierr) ) THEN + IF (ierr > 0) CALL finish ( 'ini_sedi_stream', 'variable '// & + sedinam(ierr)//' does not exist in sedi stream' ) + END IF + + !-- define the flags and names for the diagnostic lists. We need one set of flags and + ! names for each key_type (BYTRACER, BYSPECIES, BYMODE) + ! gas-phase tracers will always be defined BYTRACER, for aerosol tracers one of the + ! following lists will be empty. + tracflag(:) = .FALSE. + DO jt = 1,ntrac + tracname(jt) = trlist%ti(jt)%fullname + IF (IAND(trlist%ti(jt)%nphase,AEROSOL) /= 0 .AND. & !>>dod diagnostics bugfix < 0) THEN + tracflag(jt) = trlist%ti(jt)%nsedi > 0 + END IF + END DO + specflag(:) = .FALSE. + DO jt = 1,nspec + specname(jt) = speclist(jt)%shortname + IF (sedi_keytype == BYSPECIES .AND. & + IAND(speclist(jt)%nphase, AEROSOL) /= 0 .AND. & + nclass > 0) THEN + specflag(jt) = .TRUE. + END IF + END DO + modflag(:) = .false. + modname(:) = '' + !SF #228, adding a condition to check that HAM is active: + !SF #299, adding a condition to check if BYMODE is relevant: + IF (lham .AND. nclass > 0 .AND. (sedi_keytype == BYMODE)) & + CALL ham_get_class_flag(nclass, modflag, modname, modnumname, lsedi=.TRUE.) ! get all modes + + !-- open new stream + CALL new_stream (ssedi,'sedi',lpost=sedi_lpost,lrerun=.FALSE., & + interval=sedi_tinterval) + CALL default_stream_setting (ssedi, lrerun = .FALSE., & + contnorest = .TRUE., table = 199, & + laccu = .false., code = AUTO) + + !-- add standard ECHAM variables + IF (sedi_lpost) THEN + CALL add_stream_reference (ssedi, 'geosp' ,'g3b' ,lpost=.TRUE.) + CALL add_stream_reference (ssedi, 'lsp' ,'sp' ,lpost=.TRUE.) + CALL add_stream_reference (ssedi, 'aps' ,'g3b' ,lpost=.TRUE.) + CALL add_stream_reference (ssedi, 'gboxarea','geoloc',lpost=.TRUE.) + END IF + + !-- instantaneous diagnostic quantities + + CALL default_stream_setting (ssedi, lrerun=.FALSE., laccu=.FALSE.) + + !-- sedimentation velocities by tracer or by aerosol mode + lpost = st1_in_st2_proof( 'vsedi', sedinam) .AND. sedi_lpost + CALL new_diag_list (vsedi, ssedi, diagname='vsedi', tsubmname='', & + longname='sedimentation velocity', units='m s-1', & + ndims=2, nmaxkey=(/ntrac, 0, nclass, nclass, 0 /), lpost=lpost ) + CALL new_diag(vsedi, ntrac, tracflag, tracname, BYTRACER) + IF (ANY(modflag)) THEN !SF #299 added mode mass diags and fix for mode number name + CALL new_diag(vsedi, nclass, modflag, modname, BYMODE) + CALL new_diag(vsedi, nclass, modflag, modnumname, BYNUMMODE) + END IF + + !-- average diagnostic quantities + + CALL default_stream_setting (ssedi, lrerun=.FALSE., laccu=.TRUE.) + + !-- total sedi flux + lpost = st1_in_st2_proof( 'sed', sedinam) .AND. sedi_lpost + CALL new_diag_list (sed, ssedi, diagname='sed', tsubmname='', & + longname='accumulated sedimentation flux',& + units='kg m-2 s-1', ndims=2, & + nmaxkey=(/ntrac, nspec, nclass, nclass, 0 /), lpost=lpost ) + ! add diagnostic elements only when output is activated + IF (lpost) THEN + CALL new_diag(sed, ntrac, tracflag, tracname, BYTRACER) + CALL new_diag(sed, nspec, specflag, specname, BYSPECIES) + IF (ANY(modflag)) THEN !SF #299 added mode mass diags and fix for mode number name + CALL new_diag(sed, nclass, modflag, modname, BYMODE) + CALL new_diag(sed, nclass, modflag, modnumname, BYNUMMODE) + END IF + END IF + + END SUBROUTINE init_sedi_stream + +#endif + + !! --------------------------------------------------------------------------------------- + !! sedi_interface: generic interface routine to sedimentation + !! currently, the only sedimentation scheme implemented is that of HAM + + SUBROUTINE sedi_interface(kbdim, kproma, klev, krow, & + pt, pq, & + pap, paph, & + pm6rp, prhop, & !mean mode actual radius [m], mean mode particle density [kg m-3] + pxtm1, pxtte ,psediflux ) + + + USE mo_tracdef, ONLY: ntrac, trlist + USE mo_time_control, ONLY: time_step_len +#ifdef HAMMOZ + USE mo_time_control, ONLY: delta_time + USE mo_submodel_diag, ONLY: get_diag_pointer +#endif + USE mo_ham_sedimentation, ONLY: ham_prep_sedi, ham_sedimentation + USE mo_ham, ONLY: nclass + + !--- parameters + INTEGER, INTENT(in) :: kbdim, kproma, klev, krow + REAL(dp), INTENT(in) :: pt(kbdim, klev), & ! temperature + pq(kbdim, klev), & ! specific humidity + pap(kbdim, klev), & ! full level pressure + paph(kbdim, klev+1), & ! half level pressure + pxtm1(kbdim,klev,ntrac) ! tracer mass/number mixing ratio + + REAL(dp), INTENT(in) :: pm6rp(kbdim, klev, nclass), prhop(kbdim, klev, nclass) + + REAL(dp), INTENT(inout) :: pxtte(kbdim,klev,ntrac), & ! tracer tendency + psediflux(kbdim,klev,ntrac) + !--- local variables + INTEGER :: jt, ierr + REAL(dp) :: ztempc(kbdim, klev), & ! temp. above melting + zvis(kbdim, klev), & ! air viscosity + zlair(kbdim, klev), & ! mean free path + zrho(kbdim, klev), & ! air density + zdpg(kbdim, klev), & ! layer thickness (pressure) + zdz(kbdim, klev), & ! layer thickness (length) + zxtp1(kbdim, klev), & ! updated tracer(jt) + zxtte(kbdim, klev), & ! tracer(jt) tendency + zvsedi(kbdim, klev), & ! sedimentation velocity + zsediflux(kbdim, klev) ! sedimentation flux + REAL(dp), POINTER :: fld2d(:,:) ! pointer for diagnostics + + !--- calculate tracer independent physical variables + ! note: IF (ANY(trlist%ti(:)%nsedi)/=0) THEN not needed -- this is checked upon calling + CALL ham_prep_sedi(kproma, kbdim, klev, & + pt, pq, & + pap, paph, & + ztempc, zvis, & + zlair, zrho, & + zdpg, zdz ) + + !--- tracer loop + DO jt=1, ntrac + IF (trlist%ti(jt)%nsedi==0) CYCLE ! do nothing if tracer doesn't sediment + + !--- update tracer concentration + zxtp1(1:kproma,:) = pxtm1(1:kproma,:,jt) + pxtte(1:kproma,:,jt) * time_step_len + zxtte(1:kproma,:) = pxtte(1:kproma,:,jt) + + !--- call HAM sedimentation routine + CALL ham_sedimentation(kproma, kbdim, klev, krow, & + jt, zvis, zlair, zrho, & + pm6rp, prhop, & + zdpg, zdz, & + zxtp1, zxtte, & + zvsedi, zsediflux) + +#ifdef HAMMOZ + !--- store diagnostics + CALL get_diag_pointer(sed, fld2d, jt, ierr=ierr) + IF (ierr == 0) fld2d(1:kproma,krow) = fld2d(1:kproma,krow) & + + zsediflux(1:kproma,klev)*delta_time + CALL get_diag_pointer(vsedi, fld2d, jt, ierr=ierr) + IF (ierr == 0) fld2d(1:kproma,krow) = zvsedi(1:kproma,klev) +#endif + + psediflux(1:kproma,:,jt)=zsediflux(1:kproma,:) !TB diagnostic output + pxtte(1:kproma,:,jt)=zxtte(1:kproma,:) !csld write tendency out + + END DO + + END SUBROUTINE sedi_interface + + +END MODULE mo_hammoz_sedimentation diff --git a/ifs-source/arpifs/phys_ec/mo_hammoz_wetdep.F90 b/ifs-source/arpifs/phys_ec/mo_hammoz_wetdep.F90 new file mode 100755 index 00000000..ea54c3b8 --- /dev/null +++ b/ifs-source/arpifs/phys_ec/mo_hammoz_wetdep.F90 @@ -0,0 +1,1243 @@ +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! \filename +!! mo_hammoz_wetdep.f90 +!! +!! \brief +!! module to interface ECHAM submodules with wet deposition module(s) +!! +!! \author M. Schultz (FZ Juelich) +!! \author S. Ferrachat (ETH-Zuerich) +!! +!! \responsible_coder +!! M. Schultz, m.schultz@fz-juelich.de +!! +!! \revision_history +!! -# M. Schultz (FZ Juelich) - original code (2009-10-02) +!! -# S. Ferrachat (ETH-Zuerich) - revision (2009-12-16) +!! +!! \limitations +!! None +!! +!! \details +!! This module initializes the scheme based on the namelist parameters +!! in submodeldiagctl and creates a stream for variable pointers and +!! diagnostic quantities used in the wet deposition scheme. It also +!! provides a generic interface to the actual wet deposition routine(s). +!! +!! \bibliographic_references +!! None +!! +!! \belongs_to +!! HAMMOZ +!! +!! SPDX-License-Identifier: BSD-3-Clause +!! Copyright (c) 2021 hammoz + +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +MODULE mo_hammoz_wetdep + + USE mo_kind, ONLY: dp +#ifdef HAMMOZ + USE mo_submodel_diag, ONLY: t_diag_list +#endif + USE mo_ham, ONLY: nclass + + IMPLICIT NONE + + PRIVATE + + ! public variables (see declaration below) + + ! helper flags for use in the computational routines +#ifdef HAMMOZ + PUBLIC :: lwetdepdetail +#endif + + ! subprograms +#ifdef HAMMOZ + PUBLIC :: init_wetdep_stream +#endif + PUBLIC :: wetdep_interface + +#ifdef HAMMOZ + ! wetdep_stream + INTEGER, PARAMETER :: nwetdepvars=24 + CHARACTER(LEN=32) :: wetdepvars(1:nwetdepvars)= & + (/'precipform ', & ! precip. formation rate in kg m-2 s-1 (3D) + 'precipevap ', & ! precip. evaporation rate in kg m-2 s-1 (3D) + 'uparfrac ', & ! updraft grid box fraction (3D) + 'wdep ', & ! total wetdep flux + 'wdep_conv ', & ! wet dep. in convective clouds + 'wdep_strat ', & ! wet dep. in stratiform clouds + 'wdep_incl ', & ! total wet dep. in clouds + 'wdep_blcl ', & ! wet dep. below (convective(?) clouds + 'wdep_incl_swn ', & ! .. in cloud stratiform warm nucleation + 'wdep_incl_swi ', & ! .. in cloud stratiform warm impaction + 'wdep_incl_smn ', & ! .. in cloud stratiform mixed nucleation + 'wdep_incl_smi ', & ! .. in cloud stratiform mixed impaction + 'wdep_incl_scn ', & ! .. in cloud stratiform cold nucleation + 'wdep_incl_sci ', & ! .. in cloud stratiform cold impaction + 'wdep_incl_cwn ', & ! .. in cloud convective warm nucleation + 'wdep_incl_cwi ', & ! .. in cloud convective warm impaction + 'wdep_incl_cmn ', & ! .. in cloud convective mixed nucleation + 'wdep_incl_cmi ', & ! .. in cloud convective mixed impaction + 'wdep_incl_ccn ', & ! .. in cloud convective cold nucleation + 'wdep_incl_cci ', & ! .. in cloud convective cold impaction + 'wdep_blcl_sr ', & ! .. below cloud stratiform rain + 'wdep_blcl_ss ', & ! .. below cloud stratiform snow + 'wdep_blcl_cr ', & ! .. below cloud convective rain + 'wdep_blcl_cs ' /) ! .. below cloud convective snow + + + ! variable pointers and diagnostic lists + REAL(dp), POINTER, PUBLIC :: precipform(:,:,:), precipevap(:,:,:), & + uparfrac(:,:,:) + TYPE (t_diag_list), PUBLIC, TARGET :: wdep ! wet deposition flux + TYPE (t_diag_list), PUBLIC, TARGET :: wdep_conv ! .. in convective precip. + TYPE (t_diag_list), PUBLIC, TARGET :: wdep_strat ! .. in stratiform clouds + TYPE (t_diag_list), PUBLIC, TARGET :: wdep_incl ! .. total in clouds + TYPE (t_diag_list), PUBLIC, TARGET :: wdep_blcl ! .. below clouds + TYPE (t_diag_list), PUBLIC, TARGET :: wdep_blcl_sr ! detailed diagnostics + TYPE (t_diag_list), PUBLIC, TARGET :: wdep_blcl_ss + TYPE (t_diag_list), PUBLIC, TARGET :: wdep_blcl_cr + TYPE (t_diag_list), PUBLIC, TARGET :: wdep_blcl_cs + TYPE (t_diag_list), PUBLIC, TARGET :: wdep_incl_swn + TYPE (t_diag_list), PUBLIC, TARGET :: wdep_incl_swi + TYPE (t_diag_list), PUBLIC, TARGET :: wdep_incl_smn + TYPE (t_diag_list), PUBLIC, TARGET :: wdep_incl_smi + TYPE (t_diag_list), PUBLIC, TARGET :: wdep_incl_scn + TYPE (t_diag_list), PUBLIC, TARGET :: wdep_incl_sci + TYPE (t_diag_list), PUBLIC, TARGET :: wdep_incl_cwn + TYPE (t_diag_list), PUBLIC, TARGET :: wdep_incl_cwi + TYPE (t_diag_list), PUBLIC, TARGET :: wdep_incl_cmn + TYPE (t_diag_list), PUBLIC, TARGET :: wdep_incl_cmi + TYPE (t_diag_list), PUBLIC, TARGET :: wdep_incl_ccn + TYPE (t_diag_list), PUBLIC, TARGET :: wdep_incl_cci + + LOGICAL :: lwetdepdetail ! produce detailed wetdep diagnostics +#endif + + CONTAINS + +#ifdef HAMMOZ + SUBROUTINE init_wetdep_stream + + USE mo_string_utls, ONLY: st1_in_st2_proof + USE mo_util_string, ONLY: tolower + USE mo_exception, ONLY: finish + USE mo_memory_base, ONLY: t_stream, new_stream, & + default_stream_setting, & + add_stream_reference, & + add_stream_element, & + AUTO + USE mo_ham_m7_trac, ONLY: ham_get_class_flag + USE mo_tracer, ONLY: validate_traclist + USE mo_tracdef, ONLY: ln, ntrac, trlist, GAS, AEROSOL + USE mo_species, ONLY: nspec, speclist + USE mo_submodel_streams, ONLY: wetdep_lpost, wetdep_tinterval, wetdepnam, & + wetdep_gastrac, wetdep_keytype + USE mo_submodel_diag, ONLY: new_diag_list, new_diag, & + BYTRACER, BYSPECIES, BYMODE, BYNUMMODE + USE mo_submodel, ONLY: lham !SF, see #228 + + ! local variables + INTEGER, PARAMETER :: ndefault = 1 + CHARACTER(LEN=32) :: defnam(1:ndefault) = & ! default output + (/ 'wdep ' /) ! total wetdep flux + + INTEGER, PARAMETER :: nall = 8 + CHARACTER(LEN=32) :: allnam(1:nall) = & ! output for ALL + (/'precipform ', & ! precip. formation rate in kg m-2 s-1 (3D) + 'precipevap ', & ! precip. evaporation rate in kg m-2 s-1 (3D) + 'uparfrac ', & ! updraft grid box fraction (3D) + 'wdep ', & ! total wetdep flux + 'wdep_conv ', & ! wet dep. in convective clouds + 'wdep_strat ', & ! wet dep. in stratiform clouds + 'wdep_incl ', & ! total wet dep. in clouds + 'wdep_blcl ' /) ! wet dep. below (convective(?) clouds + + CHARACTER(len=ln) :: defaultgas(3) = & ! default gas-phase tracers for diagnost + (/ 'SO2 ', & + 'H2SO4 ', & + 'HNO3 ' /) + + LOGICAL :: tracflag(ntrac), specflag(nspec), modflag(MAX(nclass,1)) + CHARACTER(LEN=ln) :: tracname(ntrac), specname(nspec), modname(MAX(nclass,1)), & + modnumname(MAX(nclass,1)) !SF #299 + CHARACTER(LEN=32) :: cdiagname + CHARACTER(LEN=64) :: clongname + TYPE (t_stream), POINTER :: swetdep + INTEGER :: ierr, jt, idiag + LOGICAL :: lpost + TYPE (t_diag_list), POINTER :: ptrwdep ! to avoid code repetition + + !++mgs: default values and namelist read are done in init_submodel_streams ! + + !-- initialize output control variables. Will be set automatically! + lwetdepdetail = .FALSE. + + !-- handle ALL, DETAIL and DEFAULT options for wetdep output variables + !-- Note: ALL means "all you would normally want", use DETAIL to get everything + IF (TRIM(tolower(wetdepnam(1))) == 'detail') THEN + wetdepnam(1:nwetdepvars) = wetdepvars(:) + lwetdepdetail = .TRUE. !SF #567 + ENDIF + IF (TRIM(tolower(wetdepnam(1))) == 'all') wetdepnam(1:nall) = allnam(:) + IF (TRIM(tolower(wetdepnam(1))) == 'default') wetdepnam(1:ndefault) = defnam(:) + + !-- check that all variable names from namelist are valid + IF (.NOT. st1_in_st2_proof( wetdepnam, wetdepvars, ierr=ierr) ) THEN + IF (ierr > 0) CALL finish ( 'ini_wetdep_stream', 'variable '// & + wetdepnam(ierr)//' does not exist in wetdep stream' ) + END IF + + !-- find out which gas-phase tracers shall be included in diagnostics + CALL validate_traclist(wetdep_gastrac, defaultgas, nphase=GAS, & + lwetdep=.true.) !>>dod bugfix << 0) THEN + tracflag(jt) = trlist%ti(jt)%nwetdep > 0 + END IF + END IF + END DO + specflag(:) = .FALSE. + DO jt = 1,nspec + specname(jt) = speclist(jt)%shortname + IF (wetdep_keytype == BYSPECIES .AND. & + IAND(speclist(jt)%nphase, AEROSOL) /= 0 .AND. & !>>dod soa: removed check of trtype < 0) THEN + specflag(jt) = speclist(jt)%lwetdep + END IF + END DO + modflag(:) = .FALSE. + modname(:) = '' + + !SF #228, adding a condition to check that HAM is active: + !SF #299, adding a condition to check if BYMODE is relevant: + IF (lham .AND. nclass > 0 .AND. (wetdep_keytype == BYMODE)) & + CALL ham_get_class_flag(nclass, modflag, modname, modnumname, lwetdep=.true.) + + !-- open new diagnostic stream + CALL new_stream (swetdep,'wetdep',lpost=wetdep_lpost,lrerun=.FALSE., & + interval=wetdep_tinterval) + CALL default_stream_setting (swetdep, lrerun = .FALSE., & + contnorest = .TRUE., table = 199, & + laccu = .false., code = AUTO) + + !-- add standard ECHAM variables + IF (wetdep_lpost) THEN + CALL add_stream_reference (swetdep, 'geosp' ,'g3b' ,lpost=.TRUE.) + CALL add_stream_reference (swetdep, 'lsp' ,'sp' ,lpost=.TRUE.) + CALL add_stream_reference (swetdep, 'aps' ,'g3b' ,lpost=.TRUE.) + CALL add_stream_reference (swetdep, 'gboxarea','geoloc',lpost=.TRUE.) + END IF + + !-- add physical variables to stream + lpost = st1_in_st2_proof( 'precipform', wetdepnam) + CALL add_stream_element (swetdep, 'precipform', precipform, & + longname = 'precipitation formation rate', & + units = 'kg m-2 s-1', lpost = lpost) + + lpost = st1_in_st2_proof( 'precipevap', wetdepnam) + CALL add_stream_element (swetdep, 'precipevap', precipevap, & + longname = 'precipitation evaporation rate', & + units = 'kg m-2 s-1', lpost = lpost) + + lpost = st1_in_st2_proof( 'uparfrac', wetdepnam) + CALL add_stream_element (swetdep, 'uparfrac', uparfrac, & + longname = 'fraction of grid cell covered by convective clouds', & + units = '1', lpost = lpost) + + !-- pure diagnostic quantities (averaged) + + CALL default_stream_setting (swetdep, lrerun=.FALSE., laccu=.TRUE.) + + ! add total wetdep flux and detailed diagnostics + DO idiag = 1,21 + SELECT CASE (idiag) + CASE (1) + ptrwdep => wdep + cdiagname = 'wdep' + clongname = 'wet deposition flux total' + CASE (2) + ptrwdep => wdep_conv + cdiagname = 'wdep_conv' + clongname = 'wet deposition flux in convective clouds' + CASE (3) + ptrwdep => wdep_strat + cdiagname = 'wdep_strat' + clongname = 'wet deposition flux in stratiform clouds' + CASE (4) + ptrwdep => wdep_incl + cdiagname = 'wdep_incl' + clongname = 'wet deposition flux in-cloud' + CASE (5) + ptrwdep => wdep_blcl + cdiagname = 'wdep_blcl' + clongname = 'wet deposition flux below-cloud' + CASE (6) + ptrwdep => wdep_blcl_sr + cdiagname = 'wdep_blcl_sr' + clongname = 'wet deposition flux below-cloud stratiform rain' + CASE (7) + ptrwdep => wdep_blcl_ss + cdiagname = 'wdep_blcl_ss' + clongname = 'wet deposition flux below-cloud stratiform snow' + CASE (8) + ptrwdep => wdep_blcl_cr + cdiagname = 'wdep_blcl_cr' + clongname = 'wet deposition flux below-cloud convective rain' + CASE (9) + ptrwdep => wdep_blcl_cs + cdiagname = 'wdep_blcl_cs' + clongname = 'wet deposition flux below-cloud convective snow' + CASE (10) + ptrwdep => wdep_incl_swn + cdiagname = 'wdep_incl_swn' + clongname = 'wet deposition flux in-cloud stratiform warm nucleation' + CASE (11) + ptrwdep => wdep_incl_swi + cdiagname = 'wdep_incl_swi' + clongname = 'wet deposition flux in-cloud stratiform warm impaction' + CASE (12) + ptrwdep => wdep_incl_smn + cdiagname = 'wdep_incl_smn' + clongname = 'wet deposition flux in-cloud stratiform mixed nucleation' + CASE (13) + ptrwdep => wdep_incl_smi + cdiagname = 'wdep_incl_smi' + clongname = 'wet deposition flux in-cloud stratiform mixed impaction' + CASE (14) + ptrwdep => wdep_incl_scn + cdiagname = 'wdep_incl_scn' + clongname = 'wet deposition flux in-cloud stratiform cold nucleation' + CASE (15) + ptrwdep => wdep_incl_sci + cdiagname = 'wdep_incl_sci' + clongname = 'wet deposition flux in-cloud stratiform cold impaction' + CASE (16) + ptrwdep => wdep_incl_cwn + cdiagname = 'wdep_incl_cwn' + clongname = 'wet deposition flux in-cloud convective warm nucleation' + CASE (17) + ptrwdep => wdep_incl_cwi + cdiagname = 'wdep_incl_cwi' + clongname = 'wet deposition flux in-cloud convective warm impaction' + CASE (18) + ptrwdep => wdep_incl_cmn + cdiagname = 'wdep_incl_cmn' + clongname = 'wet deposition flux in-cloud convective mixed nucleation' + CASE (19) + ptrwdep => wdep_incl_cmi + cdiagname = 'wdep_incl_cmi' + clongname = 'wet deposition flux in-cloud convective mixed impaction' + CASE (20) + ptrwdep => wdep_incl_ccn + cdiagname = 'wdep_incl_ccn' + clongname = 'wet deposition flux in-cloud convective cold nucleation' + CASE (21) + ptrwdep => wdep_incl_cci + cdiagname = 'wdep_incl_cci' + clongname = 'wet deposition flux in-cloud convective cold impaction' + END SELECT + lpost = st1_in_st2_proof( cdiagname, wetdepnam) .AND. wetdep_lpost + CALL new_diag_list (ptrwdep, swetdep, diagname=cdiagname, tsubmname='', & + longname=TRIM(clongname),& + units='kg m-2 s-1', ndims=2, & + nmaxkey=(/ntrac, nspec, nclass, nclass, 0 /), lpost=lpost ) + ! add diagnostic elements only when output is activated + IF (lpost) THEN + IF (ANY(tracflag)) CALL new_diag(ptrwdep, ntrac, tracflag, tracname, BYTRACER) + IF (ANY(specflag)) CALL new_diag(ptrwdep, nspec, specflag, specname, BYSPECIES) + IF (ANY(modflag)) THEN + CALL new_diag(ptrwdep, nclass , modflag, modname, BYMODE) + CALL new_diag(ptrwdep, nclass , modflag, modnumname, BYNUMMODE) !SF #299: add mode number + END IF + END IF + END DO + + END SUBROUTINE init_wetdep_stream +#endif + !! --------------------------------------------------------------------------------------- + !!SF prep_wetdep: preparation routine to wet deposition calculations + !! (collect hydrological variables) + + SUBROUTINE prep_wetdep_hydro(kproma, kbdim, klev, ktop, krow, lstrat, & + pdpg, pmratepr, pmrateps, pmsnowacl, & + pmlwc, pmiwc, paclc, & + pice, peffwat, peffice, pmfu, prhou, & + pfrain, pfsnow, pfevapr, pfsubls, prevap, & + pclceff ) + + USE mo_time_control, ONLY: time_step_len + + INTEGER, INTENT(in) :: kproma ! geographic block number of locations + INTEGER, INTENT(in) :: kbdim ! geographic block maximum number of locations + INTEGER, INTENT(in) :: klev ! numer of levels + INTEGER, INTENT(in) :: ktop ! top layer index + INTEGER, INTENT(in) :: krow ! geographic block number + LOGICAL, INTENT(in) :: lstrat ! indicates stratiform clouds (call from cloud) + REAL(dp), INTENT(in) :: pdpg(kbdim,klev) ! dp/g + REAL(dp), INTENT(in) :: pmratepr(kbdim,klev) ! rain formation in cloudy part + REAL(dp), INTENT(in) :: pmrateps(kbdim,klev) ! snow formation in cloudy part + REAL(dp), INTENT(in) :: pmsnowacl(kbdim,klev) ! accretion rate of snow with cloud drop. in cl [kg/kg] + REAL(dp), INTENT(in) :: pmfu(kbdim,klev) ! convective flux + REAL(dp), INTENT(in) :: prhou(kbdim,klev) ! air density + REAL(dp), INTENT(in) :: pfrain(kbdim,klev) ! rain rate + REAL(dp), INTENT(in) :: pfsnow(kbdim,klev) ! snow rate + REAL(dp), INTENT(in) :: pfevapr(kbdim,klev) ! evaporation of rain + REAL(dp), INTENT(in) :: pfsubls(kbdim,klev) ! sublimation of snow + REAL(dp), INTENT(inout) :: pmlwc(kbdim,klev) ! liquid water content before rain + REAL(dp), INTENT(inout) :: pmiwc(kbdim,klev) ! ice water content before snow + REAL(dp), INTENT(inout) :: paclc(kbdim,klev) ! cloud cover + REAL(dp), INTENT(out) :: pice(kbdim,klev) ! ice mass fraction over total water + REAL(dp), INTENT(out) :: peffwat(kbdim,klev) ! autoconversion rate (liq water) + REAL(dp), INTENT(out) :: peffice(kbdim,klev) ! autoconversion rate (ice) + REAL(dp), INTENT(out) :: prevap(kbdim,klev) ! + REAL(dp), INTENT(out) :: pclceff(kbdim,klev) ! + + !--- Local arrays: + LOGICAL :: lo_2d(1:kbdim,klev) + REAL(dp) :: zilwc(kbdim,klev), zfprec(kbdim,klev) + + !--- Constants: + REAL(dp), PARAMETER :: zmin = 1.e-10_dp, & + zwu = 2.0_dp ! Assumed updraft velocity in convective clouds [m s-1]: + + !--- 1.1) Calculate ice mass-fraction of the total water: + + pmiwc(1:kproma,:) = MAX(pmiwc(1:kproma,:),0._dp) + pmlwc(1:kproma,:) = MAX(pmlwc(1:kproma,:),0._dp) + + zilwc(1:kproma,:) = pmiwc(1:kproma,:)+pmlwc(1:kproma,:) + + lo_2d(1:kproma,:) = (zilwc(1:kproma,:) > zmin) + + paclc(1:kproma,:) = MERGE(paclc(1:kproma,:) , 0._dp, lo_2d(1:kproma,:)) + pice(1:kproma,:) = MERGE(pmiwc(1:kproma,:)/zilwc(1:kproma,:), 0._dp, lo_2d(1:kproma,:)) + + !--- 1.2) Calculate autoconversion rate: + + lo_2d(1:kproma,:) = (pmiwc(1:kproma,:) > zmin) + + peffice(1:kproma,:) = MERGE(pmrateps(1:kproma,:)/pmiwc(1:kproma,:), 0._dp, lo_2d(1:kproma,:)) + peffice(1:kproma,:) = MAX(0._dp,MIN(1._dp,peffice(1:kproma,:))) + + lo_2d(1:kproma,:) = (pmlwc(1:kproma,:) > zmin) + + peffwat(1:kproma,:) = MERGE( (pmratepr(1:kproma,:)+pmsnowacl(1:kproma,:))/pmlwc(1:kproma,:) , & + 0._dp, lo_2d(1:kproma,:)) + peffwat(1:kproma,:) = MAX(0._dp,MIN(1._dp,peffwat(1:kproma,:))) + + !--- 1.3) Calculate the effective grid-box fraction + ! affected by precipitation (zclceff): + +#ifdef HAMMOZ + !--- Precipitation formation (store for diagnostics [kg m-2 s-1]): + precipform(1:kproma,:,krow) = (pmratepr(1:kproma,:)+pmrateps(1:kproma,:)+pmsnowacl(1:kproma,:)) & + * pdpg(1:kproma,:) / time_step_len + +#endif + !--- 1.3.1) Stratiform clouds: + !--- 1.3.2) Convective clouds: + + IF (.not. lstrat) THEN + + !--- Assume updraft area fraction as precipitiating + ! fraction of grid box + ! + ! Estimate updraft area from prescribed updraft + ! velocities + + pclceff(1:kproma,:) = pmfu(1:kproma,:) / (zwu*prhou(1:kproma,:)) + +#ifdef HAMMOZ + !---updraft grid box fraction (3D) stored for diagnostics + uparfrac(1:kproma,:,krow) = pclceff(1:kproma,:) +#endif + + END IF + + !--- 1.4) Re-evaporation + + zfprec(1:kproma,:) = pfrain(1:kproma,:) + pfsnow(1:kproma,:) + + lo_2d(1:kproma,:) = (zfprec(1:kproma,:) > zmin) + + prevap(1:kproma,:) = MERGE((pfevapr(1:kproma,:)+pfsubls(1:kproma,:))/zfprec(1:kproma,:), & + 0._dp, lo_2d(1:kproma,:)) + + prevap(1:kproma,:) = MAX(0._dp,MIN(1._dp,prevap(1:kproma,:))) + +#ifdef HAMMOZ + !--- Store re-evaporation + sublimation for diagnostics: + precipevap(1:kproma,:,krow) = pfevapr(1:kproma,:)+pfsubls(1:kproma,:) +#endif + + END SUBROUTINE prep_wetdep_hydro + + !! --------------------------------------------------------------------------------------- + !! SF: get_lfrac: gas tracer liquid fraction calculation + + SUBROUTINE get_lfrac(kproma, kbdim, krow, klev, ktop, & + ptemp, pmlwc, prho, phenry, plfrac) + + USE mo_physical_constants, ONLY: argas,p0sl_bg + + INTEGER, INTENT(in) :: kproma ! geographic block number of locations + INTEGER, INTENT(in) :: kbdim ! geographic block maximum number of locations + INTEGER, INTENT(in) :: krow ! for diagnostic purposes + INTEGER, INTENT(in) :: klev ! number of levels + INTEGER, INTENT(in) :: ktop ! top layer index + REAL(dp), INTENT(IN) :: ptemp(kbdim,klev) ! temperature + REAL(dp), INTENT(IN) :: pmlwc(kbdim,klev) ! liquid water content + REAL(dp), INTENT(IN) :: prho(kbdim,klev) ! density of air + REAL(dp), INTENT(IN) :: phenry(2) ! Henry's law vars (constant, and activation energy) + REAL(dp), INTENT(OUT) :: plfrac(kbdim,klev) ! liquid tracer fraction + + !--- Gas constant in atm M-1 K-1 (Seinfeld & Pandis 2ed. p290) + REAL(dp), PARAMETER :: zrgas = argas / p0sl_bg * 1.e03_dp, & + zq298 = 1._dp / 298._dp + + !--- Local arrays: + REAL(dp) :: zp(kbdim,klev), zq(kbdim,klev) + + zq(1:kproma,:) = 1._dp / ptemp(1:kproma,:) - zq298 + zp(1:kproma,:) = zrgas*ptemp(1:kproma,:)*pmlwc(1:kproma,:)*prho(1:kproma,:)*1.e-03_dp*phenry(1) & + * exp(phenry(2)*zq(1:kproma,:)) + + plfrac(1:kproma,:) = zp(1:kproma,:) / (1._dp + zp(1:kproma,:)) + + ! make sure vector is filled + IF (kproma.lt.kbdim) plfrac(kproma+1:kbdim,:)=0._dp + + END SUBROUTINE get_lfrac + + !! --------------------------------------------------------------------------------------- + !! gas_setscav: rotuine to set the wetdep flags to handle: + !! - in-cloud and/or below-cloud scav + !! - water and/or ice scav (resp. rain and/or snow) + + SUBROUTINE gas_setscav(kt, & + kscavICtype, kscavBCtype, & + kscavICphase, kscavBCphase) + + ! kscavICtype = 0 no in-cloud scavenging + ! 1 prescribed in-cloud scavenging params + ! + ! kscavBCtype = 0 no below-cloud scavenging + ! 1 prescribed below-cloud scavenging params + ! + ! kscavICphase = 0 no in-cloud scavenging + ! 1 in-cloud water-only scavenging + ! 2 in-cloud ice-only scavenging + ! 3 in-cloud water+ice scavenging + ! + ! kscavBCphase = 0 no below-cloud scavenging + ! 1 below-cloud rain-only scavenging + ! 2 below-cloud snow-only scavenging + ! 3 below-cloud rain+snow scavenging + + USE mo_tracdef, ONLY: trlist + USE mo_species, ONLY: speclist + + INTEGER, INTENT(in) :: kt + INTEGER, INTENT(out) :: kscavICtype, kscavBCtype, & + kscavICphase, kscavBCphase + + ! local variables + INTEGER :: ispec + + !--- Normal setting: + + SELECT CASE (trlist%ti(kt)%nwetdep) + CASE(0) !wet dep off + kscavICtype = 0 + kscavBCtype = 0 + kscavICphase = 0 + kscavBCphase = 0 + CASE(1:) !wet dep on + kscavICtype = 1 + kscavBCtype = 0 + !SF kscavICphase = 1 !SFnote: a value of 1 reproduces the echam5.5-ham2 gas scavenging settings + kscavICphase = 3 !SFnote: a value of 3 reproduces the echam5-hammoz gas scavenging settings + kscavBCphase = 3 + END SELECT + + !--- Tracer- or species-specific setting: + + ispec = trlist%ti(kt)%spid + + ! allow below-cloud scavenging for HNO3: + IF (speclist(ispec)%shortname == 'HNO3') kscavBCtype = 1 + + ! allow below-cloud scavenging for H2SO4 + !SF #508: now allows H2SO4 below-cloud scav *also* in case of pure HAM + IF (speclist(ispec)%shortname == 'H2SO4') kscavBCtype = 1 + + END SUBROUTINE gas_setscav + + !! --------------------------------------------------------------------------------------- + !! gas_wetdep: routine to handle gas wet deposition + + SUBROUTINE gas_wetdep(kproma, kbdim, klev, ktop, & + kt, & + kscavICtype, kscavBCtype, & + kscavICphase, kscavBCphase, & + lstrat, & + pxtm1, & + paclc, & + pmfu, & + pdpg, & + peffwat, & + peffice, & + prevap, & + pice, & + plfrac, & + pclc, & + pfrain, & + pfsnow, & + pxtte, & + pxtp10, & + pxtp1c, & + pdepint, & + pdepintbc, & + pdepintbcr, & + pdepintbcs, & + pdepintic, & + pmfuxt ) + + USE mo_time_control, ONLY: time_step_len + USE mo_tracdef, ONLY: ntrac + + INTEGER, INTENT(in) :: kproma ! geographic block number of locations + INTEGER, INTENT(in) :: kbdim ! geographic block maximum number of locations + INTEGER, INTENT(in) :: klev ! numer of levels + INTEGER, INTENT(in) :: ktop ! top layer index + INTEGER, INTENT(in) :: kt ! tracer index + INTEGER, INTENT(in) :: kscavICtype ! indicates in-cloud scavenging scheme + INTEGER, INTENT(in) :: kscavBCtype ! indicates below-cloud scavenging scheme + INTEGER, INTENT(in) :: kscavICphase ! indicates in-cloud scavenging by water and/or ice + INTEGER, INTENT(in) :: kscavBCphase ! indicates below-cloud scavenging by water and/or ice + + LOGICAL, INTENT(in) :: lstrat ! flag for stratiform or convective case + + REAL(dp), INTENT(in) :: pxtm1(kbdim,klev,ntrac), & ! tracer mixing ratio + paclc(kbdim,klev), & ! cloud cover + pmfu(kbdim,klev), & ! convective flux + pdpg(kbdim,klev), & ! grid box thickness + peffwat(kbdim,klev), & ! + peffice(kbdim,klev), & ! + prevap(kbdim,klev), & ! evaporation rate + pice(kbdim,klev), & ! ice fraction + plfrac(kbdim,klev), & ! liquid fraction of corresponding tracer + pclc(kbdim,klev), & ! fraction of grid covered by precip + pfrain(kbdim,klev), & ! rain flux + pfsnow(kbdim,klev) ! snow flux + + REAL(dp), INTENT(inout) :: pxtte(kbdim,klev,ntrac), & ! tracer tendency + pxtp10(kbdim,klev,ntrac), & ! cloud-free mixing ratio + pxtp1c(kbdim,klev,ntrac), & ! cloudy mixing ratio + pdepint(kbdim), & ! global scavenged mr + pdepintbc(kbdim), & ! below-cloud scavenged mr + pdepintbcr(kbdim), & ! below-cloud scavenged by rain mr + pdepintbcs(kbdim), & ! below-cloud scavenged by snow mr + pdepintic(kbdim), & ! in-cloud scavenged mr + pmfuxt(kbdim,klev,ntrac) ! updraft mmr + + !--- local variables + INTEGER :: jk + + LOGICAL :: ll_cloud_cov(kbdim,klev), ll_prcp(kbdim,klev), ll1(1:kproma,klev) !SF #458 + + REAL(dp) :: ztmst + REAL(dp) :: zdxtevapic(kbdim,klev), zdxtevapbc(kbdim,klev), & + zdxtwat(kbdim,klev), zdxtice(kbdim,klev), & + zxtwat(kbdim,klev), zxtice(kbdim,klev), & + zxtp10(kbdim,klev), zmf(kbdim,klev), & + zdep(kbdim,klev), & + zxtp1(kbdim,klev), zxtte(kbdim,klev), & + zxtfrac_col(kbdim,klev), & + zxtfrac_colr(kbdim,klev), zxtfrac_cols(kbdim,klev), & + zscavcoefbcr(kbdim,klev), zscavcoefbcs(kbdim,klev), & + zcoeffr(kbdim,klev), zcoeffs(kbdim,klev), & + zcoeff(kbdim,klev), & + zdxtcol(kbdim,klev), & + zdxtcolr(kbdim,klev), zdxtcols(kbdim,klev) + + REAL(dp) :: ztmp1(kbdim,klev) !SF #458 dummy variable + + !--- Constants: + REAL(dp), PARAMETER :: zmin =1.e-10_dp + + ztmst = time_step_len + + zdxtevapic(1:kproma,:) = 0._dp + zdxtevapbc(1:kproma,:) = 0._dp + + zxtfrac_col(1:kproma,:) = 0._dp + zxtfrac_colr(1:kproma,:) = 0._dp + zxtfrac_cols(1:kproma,:) = 0._dp + + zscavcoefbcr(1:kproma,:) = 0._dp + zscavcoefbcs(1:kproma,:) = 0._dp + + zdxtwat(1:kproma,:) = 0._dp + zdxtice(1:kproma,:) = 0._dp + + IF (lstrat) THEN !stratiform case + + !--- Weight mixing ratios with cloud fraction: + + pxtp1c(1:kproma,:,kt) = pxtp1c(1:kproma,:,kt)*paclc(1:kproma,:) + pxtp10(1:kproma,:,kt) = pxtp10(1:kproma,:,kt)*(1._dp-paclc(1:kproma,:)) + zxtp10(1:kproma,:) = pxtp10(1:kproma,:,kt) + zmf(1:kproma,:) = pdpg(1:kproma,:) / ztmst + !SF note: zxtp10 and zmf are needed in order to transparently + ! handle the strat and the conv cases without writing too many separate, + ! but very similar, equations + ELSE + zxtp10(1:kproma,:) = 0._dp + zmf(1:kproma,:) = pmfu(1:kproma,:) + ENDIF + + !--- Associate tracer masses in the cloud fraction to water/ice phase + ! to the respective mass fractions: + zxtwat(1:kproma,:) = pxtp1c(1:kproma,:,kt)*(1._dp-pice(1:kproma,:)) + zxtice(1:kproma,:) = pxtp1c(1:kproma,:,kt)*pice(1:kproma,:) + + !--- Setting logical masks necessary for MERGE statements (!SF #458) + ll_cloud_cov(1:kproma,:) = (paclc(1:kproma,:) > zmin) + ll_prcp(1:kproma,:) = (pclc(1:kproma,:) > zmin) + + !--- 1/ Process: + + !--- 1.1/ In-cloud scavenging + + IF(kscavICtype > 0) THEN + + !--- 1.1.1/ Phase-specific calculations: + + IF (IAND(kscavICphase,1) /= 0) THEN !water scavenging on (kscavICphase==1 .or. 3) + + !--- Change in in-cloud (strat) or updraft (conv) tracer concentration: + !>>SF #458 (replacing where statements) + zdxtwat(1:kproma,:) = MERGE( & + zxtwat(1:kproma,:)*plfrac(1:kproma,:)*peffwat(1:kproma,:), & + 0._dp, & + ll_cloud_cov(1:kproma,:)) + !<>SF #458 (replacing where statements) + zdxtice(1:kproma,:) = MERGE( & + zxtice(1:kproma,:)*plfrac(1:kproma,:)*peffice(1:kproma,:), & + 0._dp, & + ll_cloud_cov(1:kproma,:)) + !< 0) THEN + + !--- 1.2.1/ Phase-specific calculations: + + IF (IAND(kscavBCphase,1) /= 0) THEN !rain scavenging on (kscavBCphase==1 .or. 3) + !SFtemporary dummy values for now (in waiting to define two separate rain and snow coeffs) + zscavcoefbcr(1:kproma,:) = 0._dp + ENDIF + + IF (IAND(kscavBCphase,2) /= 0) THEN !snow scavenging on (kscavBCphase==2 .or. 3) + !SFtemporary dummy values for now (in waiting to define two separate rain and snow coeffs) + zscavcoefbcs(1:kproma,:) = 0._dp + ENDIF + !--- 1.2.2/ Put everything together: + + !--- Calculate fraction of below cloud scavenged tracer: + !>>SF #458 (replacing where statements) + ll1(1:kproma,:) = .NOT. ll_cloud_cov(1:kproma,:) .AND. ll_prcp(1:kproma,:) + + zcoeffr (1:kproma,:) = MERGE( & + -ztmst*zscavcoefbcr(1:kproma,:), & + 0._dp, & + ll1(1:kproma,:) ) + + zcoeffs (1:kproma,:) = MERGE( & + -ztmst*zscavcoefbcs(1:kproma,:), & + 0._dp, & + ll1(1:kproma,:) ) + + ztmp1(1:kproma,:) = MERGE(pclc(1:kproma,:), 1._dp, ll1(1:kproma,:)) !SF 1._dp is a dummy value + !>>SFtemporary (in waiting to define two separate rain and snow coeffs): + ztmp1(1:kproma,:) = -ztmst * 1.626e-2_dp & + * (MAX(0._dp,pfrain(1:kproma,:)+pfsnow(1:kproma,:)) & + / ztmp1(1:kproma,:))**0.6169_dp + !SF The final expression should be: ztmp1(1:kproma,:) = zcoeffr(1:kproma,:)+zcoeffs(1:kproma,:) + !< +!! @par Copyright +!! This code is subject to the MPI-M-Software - License - Agreement in it's most recent form. +!! Please see URL http://www.mpimet.mpg.de/en/science/models/model-distribution.html and the +!! file COPYING in the root of the source tree for this code. +!! Where software is supplied by third parties, it is indicated in the headers of the routines. +!! +MODULE mo_io_units + + IMPLICIT NONE + + PUBLIC + + ! This paramter is taken from /usr/include/stdio.h (ANSI C standard). If + ! problems with filename length appear, check the before mentioned file. + + INTEGER, PARAMETER :: filename_max = 1024 + + ! Standard I/O-units + +#ifdef hpux + INTEGER, PARAMETER :: nerr = 7 ! error output +#else + INTEGER, PARAMETER :: nerr = 0 ! error output +#endif + INTEGER, PARAMETER :: nlog = 1 ! standard log file unit + INTEGER, PARAMETER :: nin = 5 ! standard input + INTEGER, PARAMETER :: nout = 6 ! standard output + + INTEGER, PARAMETER, PRIVATE :: none = -1 ! unit given back, when nothing + ! in the allowed range is available + +END MODULE mo_io_units + + + + + + + + + + + diff --git a/ifs-source/arpifs/phys_ec/mo_kind.F90 b/ifs-source/arpifs/phys_ec/mo_kind.F90 new file mode 100644 index 00000000..c28edcd8 --- /dev/null +++ b/ifs-source/arpifs/phys_ec/mo_kind.F90 @@ -0,0 +1,9 @@ +MODULE mo_kind + ! --> thk: bug fix: + ! changed the order of the two lines + ! removed commented-out code + USE parkind1, ONLY: dp => JPRB !TeMi + USE parkind1, ONLY: wp => JPRB !eehol + IMPLICIT NONE + ! <-- thk +END MODULE mo_kind diff --git a/ifs-source/arpifs/phys_ec/mo_math_constants.F90 b/ifs-source/arpifs/phys_ec/mo_math_constants.F90 new file mode 100644 index 00000000..d970dd76 --- /dev/null +++ b/ifs-source/arpifs/phys_ec/mo_math_constants.F90 @@ -0,0 +1,106 @@ +!> +!! @par Copyright +!! This code is subject to the MPI-M-Software - License - Agreement in it's most recent form. +!! Please see URL http://www.mpimet.mpg.de/en/science/models/model-distribution.html and the +!! file COPYING in the root of the source tree for this code. +!! Where software is supplied by third parties, it is indicated in the headers of the routines. +!! +!! Module defines main mathematical constants +!! +!! These constants are provided to more significant digits than is necessary for a 64-bit +!! double precision number; they may be used for other purposes where the extra precision +!! is necessary or useful. +!! +!! The variables are calculated by a multi-precision floating point package +!! (mpmath in python). +!! +!! @par Revision History +!! Developed by Luis Kornblueh (2004) +!! Modified to ProTeX-style by Luca Bonaventura and Thomas Heinze (2004). +!! Modified according to style guide by Thomas Heinze (2005-06-24): +!! - module renamed from mo_math to mo_math_constants +!! - eps moved from mo_physical_constants +!! - pid180i renamed to rad2deg +!! Including some more constants from math.h by Thomas Heinze (2005-07-18) +!! pid5 renamed to pi_5 by Thomas Heinze (2005-07-26) +!! Modification by Thomas Heinze (2006-02-21): +!! - renamed m_modules to mo_modules +!! Modification by Thomas Heinze (2006-05-18): +!! - introduced dbl_eps +!! Modified by Luis Kornblueh (2012) +!! - replaced arbitrary number of digits by 42 significant decimal digits calculated by +!! multi-precision algorithms +!! +MODULE mo_math_constants + + USE mo_kind, ONLY: wp + + IMPLICIT NONE + + PUBLIC + + CHARACTER(len=*), PARAMETER, PRIVATE :: version = '$Id$' + + ! Mathematical constants defined: + ! + !-------------------------------------------------------------- + ! Fortran name | C name | meaning | + !-------------------------------------------------------------- + ! euler | M_E | e | + ! log2e | M_LOG2E | log2(e) | + ! log10e | M_LOG10E | log10(e) | + ! ln2 | M_LN2 | ln(2) | + ! ln10 | M_LN10 | ln(10) | + ! pi | M_PI | pi | + ! pi_2 | M_PI_2 | pi/2 | + ! pi_4 | M_PI_4 | pi/4 | + !>>SF/HK #525 | + ! pi_6 | M_PI_6 | pi/6 | + !<>SF/HK #525 + REAL(wp), PARAMETER :: pi_6 = 0.523598775598298873077107230546583814032862_wp +!< 0) THEN + DO ihandler = 1, top + IF (TRIM(namelist_file_list(ihandler)%filename) == file) THEN + IF (namelist_file_list(ihandler)%fileunit == -1) THEN + iunit = find_next_free_unit(100,200) + OPEN (iunit, file=file, iostat=istat, status='old', action='read', delim='apostrophe') + namelist_file_list(ihandler)%fileunit = iunit +!gf CALL message('', 'Namelist file '//TRIM(file)//' reopened') + WRITE(*,*) 'Namelist file --> '//TRIM(file)//' --> reopened' + ELSE +!gf CALL message('', 'Namelist file '//TRIM(file)//' already opened, rewind file to beginning') + WRITE(*,*) 'Namelist file --> '//TRIM(file)//' --> already opened, rewind file to beginning' + REWIND (namelist_file_list(ihandler)%fileunit) + ENDIF + unit = ihandler + RETURN + ENDIF + ENDDO + ENDIF + ! If no entry was found, open file and create table entry. + iunit = find_next_free_unit(100,200) + OPEN (iunit, file=file, iostat=istat, status='old', action='read', delim='apostrophe') + IF (istat == 0) THEN + top = top+1 + namelist_file_list(top)%filename = TRIM(file) + namelist_file_list(top)%fileunit = iunit + unit = top +!gf CALL message('', 'Opened namelist file '//TRIM(file)) + WRITE(*,*) 'Opened namelist file --> '//TRIM(file) + ELSE +!gf +! CALL finish('open_nml','Could not open namelist file '//TRIM(file)) + WRITE(*,*) 'open_nml:Could not open namelist file --> '//TRIM(file) + STOP +!gf + ENDIF + END FUNCTION open_nml + !================================================================================================ + FUNCTION position_nml (name, unit, rewind, status) RESULT (iunit) + + INTEGER :: iunit ! Fortran unit to read namelist from + ! position namelist file for reading on first occurrence + ! namelist /name/ (case independent). + CHARACTER(len=*), INTENT(in) :: name ! namelist group name + INTEGER, INTENT(in) :: unit ! file handler + LOGICAL, INTENT(in) ,OPTIONAL :: rewind ! default: true + INTEGER, INTENT(out) ,OPTIONAL :: status ! error return value + CHARACTER(len=256) :: yline ! line read + CHARACTER(len=256) :: test ! potentially uppercase namelist group name + INTEGER :: stat ! local copy of status variable + INTEGER :: ios ! status variable from read operation + LOGICAL :: lrew ! local copy of rewind flag + CHARACTER(len=64) :: yfilename ! local copy of namelist filename + INTEGER :: len_name ! length of requested namelist group name + CHARACTER :: ytest ! character to test for delimiter + CHARACTER(len=12) :: action ! current action + INTEGER :: ind ! index from index routine + INTEGER :: indc ! index of comment character (!) + CHARACTER(len=256) :: iomsg + IF (namelist_file_list(unit)%fileunit == -1) THEN +!gf +! CALL finish('position_nml','Namelist file '//TRIM(namelist_file_list(unit)%filename)//' already closed') + WRITE(*,*) 'position_nml:Namelist file --> '//TRIM(namelist_file_list(unit)%filename)//' --> already closed' + STOP +!gf + ELSEIF (unit > top) THEN +!gf +! WRITE (message_text,'(a,i0,a)') 'Namelist file for handler ', unit, ' has not been opened' +! CALL finish('position_nml',message_text) + WRITE(*,*) 'Namelist file for handler --> ', unit, ' --> has not been opened' + STOP +!gf + ELSE + iunit = namelist_file_list(unit)%fileunit + yfilename = TRIM(namelist_file_list(unit)%filename) + ENDIF + lrew = .TRUE. + IF (PRESENT(rewind)) lrew = rewind + stat = missing + action = 'missing' + len_name = LEN_TRIM (name) + IF (len_name > LEN(test)) THEN + stat = length_error + action = 'length_error' + ENDIF + test = tolower (name) + + ! Reposition file at beginning: + IF (lrew) THEN + REWIND (iunit) + ENDIF + ! Search start of namelist + + DO + IF (stat /= MISSING) EXIT + yline = '' + + READ (iunit,'(a)',IOSTAT=ios,IOMSG=iomsg) yline + IF (ios < 0) THEN + EXIT ! missing + ELSE IF (ios > 0) THEN + stat = read_error + action = 'read_error' + EXIT + END IF + yline = tolower (yline) + + ind = INDEX(yline,'&'//TRIM(test)) + + IF (ind == 0) CYCLE + + indc = INDEX(yline,'!') + IF (indc > 0 .AND. indc < ind) CYCLE + ! test for delimiter + + ytest = yline(ind+len_name+1:ind+len_name+1) + IF ( (LGE(ytest,'0') .AND. LLE(ytest,'9')) .OR. & + (LGE(ytest,'a') .AND. LLE(ytest,'z')) .OR. & + ytest == '_' .OR. & + (LGE(ytest,'A') .AND. LLE(ytest,'Z'))) THEN + CYCLE + ELSE + stat = positioned + BACKSPACE (iunit) + EXIT + END IF + ENDDO + + IF (PRESENT (status)) status = stat + SELECT CASE (stat) + CASE (positioned) + RETURN + CASE (missing) + IF (PRESENT (status)) RETURN + END SELECT +!gf CALL message ('position_nml','File '//TRIM(yfilename)// 'namelist /'//TRIM(test)//'/ '//TRIM(action)) + WRITE(*,*) 'position_nml: File --> '//TRIM(yfilename)// 'namelist /'//TRIM(test)//'/ '//TRIM(action) + END FUNCTION position_nml + !================================================================================================ + SUBROUTINE close_nml (unit) + INTEGER, INTENT(in) :: unit ! file handler + INTEGER :: istat + IF (unit == -1) THEN +!gf CALL finish('close_nml','Namelist file not opened') + WRITE(*,*) 'close_nml: Namelist file not opened' + ELSE + IF (namelist_file_list(unit)%fileunit == -1) THEN +!gf CALL finish ('close_nml','Namelist file '//TRIM(namelist_file_list(unit)%filename)//' already closed') + WRITE(*,*) 'close_nml: Namelist file --> '//TRIM(namelist_file_list(unit)%filename)//' --> already closed' + ENDIF + ENDIF + CLOSE (namelist_file_list(unit)%fileunit, IOSTAT=istat) + IF (istat == 0) THEN + namelist_file_list(unit)%fileunit = -1 + ELSE +!gf +! CALL finish('close_nml','Could not close namelist file '//TRIM(namelist_file_list(unit)%filename)) + WRITE(*,*) 'close_nml:Could not close namelist file --> '//TRIM(namelist_file_list(unit)%filename) + STOP +!gf + ENDIF + END SUBROUTINE close_nml + !================================================================================================ +END MODULE mo_namelist diff --git a/ifs-source/arpifs/phys_ec/mo_netcdf.F90 b/ifs-source/arpifs/phys_ec/mo_netcdf.F90 new file mode 100644 index 00000000..d2203a6f --- /dev/null +++ b/ifs-source/arpifs/phys_ec/mo_netcdf.F90 @@ -0,0 +1,854 @@ +!> +!! @par Copyright +!! This code is subject to the MPI-M-Software - License - Agreement in it's most recent form. +!! Please see URL http://www.mpimet.mpg.de/en/science/models/model-distribution.html and the +!! file COPYING in the root of the source tree for this code. +!! Where software is supplied by third parties, it is indicated in the headers of the routines. +!! +MODULE mo_netcdf + + USE mo_kind, ONLY: dp + USE mo_exception, ONLY: finish, message, message_text + USE mo_control, ONLY: ldebugio +#ifdef HAMMOZ + USE mo_filename, ONLY: NETCDF +#endif + IMPLICIT NONE + + PRIVATE + + PUBLIC :: io_get_varindx ! mo_memory_base + PUBLIC :: add_dim ! + PUBLIC :: add_unknown_dim ! + PUBLIC :: max_dim_name ! mo_memory_gl + PUBLIC :: FILE_INFO ! mo_io + PUBLIC :: nf_check ! checks/print the status of netcdf operations + PUBLIC :: nf_noerr ! mo_io + PUBLIC :: nf_enotnc ! mo_io + PUBLIC :: nf_nowrite ! mo_io + PUBLIC :: nf_write ! mo_io + PUBLIC :: nf_nofill ! mo_io + PUBLIC :: nf_max_var_dims ! mo_read_netcdf + PUBLIC :: io_ndim_ids ! mo_io + PUBLIC :: io_dim_ids ! mo_io + PUBLIC :: io_dim ! io_dim_ids + PUBLIC :: nf_max_name ! mo_io + PUBLIC :: nf_inq_varid ! mo_io + PUBLIC :: nf_inq_dimid ! mo_io + PUBLIC :: nf_inq_dimlen ! + PUBLIC :: nf_get_var_double ! + PUBLIC :: nf_get_vara_double ! + PUBLIC :: nf_get_att_int ! + PUBLIC :: nf_global ! mo_io + PUBLIC :: nf_double ! mo_io + PUBLIC :: nf_create ! mo_io + PUBLIC :: nf__create ! mo_io, version allows setting I/O buffer size +#ifdef PARALLEL_NC4 + PUBLIC :: nf_create_par ! mo_io, version allows parallel I/O HDF5 based +#endif + PUBLIC :: nf_set_fill ! mo_io + PUBLIC :: nf_fill_real ! mo_io + PUBLIC :: nf_strerror ! mo_io + PUBLIC :: nf_open ! mo_io + PUBLIC :: nf__open ! mo_io, version allows setting I/O buffer size + PUBLIC :: nf_clobber ! mo_io + PUBLIC :: nf_close ! mo_io + PUBLIC :: nf_64bit_offset ! mo_io + PUBLIC :: nf_netcdf4 ! mo_io, version allows netcdf I/O HDF5 based + PUBLIC :: nf_def_dim + PUBLIC :: nf_def_var + PUBLIC :: nf_enddef + PUBLIC :: nf_inq_vardimid ! mo_read_ncdf_f77 + PUBLIC :: nf_inq_varndims + PUBLIC :: nf_inq_dimname + PUBLIC :: nf_inq_varname + PUBLIC :: nf_inq_nvars + PUBLIC :: nf_inq_unlimdim + PUBLIC :: nf_inq_attlen + PUBLIC :: nf_get_att_text + PUBLIC :: nf_get_var1_double + PUBLIC :: nf_put_var_double + PUBLIC :: nf_put_var1_double + PUBLIC :: nf_put_vara_double + PUBLIC :: nf_put_att_text + PUBLIC :: nf_unlimited + PUBLIC :: nf_noclobber + PUBLIC :: nf_float + PUBLIC :: nf_real + PUBLIC :: io_inq_dimid ! mo_o3clim + PUBLIC :: io_inq_dimlen ! mo_o3clim + PUBLIC :: io_inq_varid ! mo_o3clim + PUBLIC :: io_get_var_double ! mo_o3clim + PUBLIC :: io_get_var_double1 + PUBLIC :: io_get_vara_double ! mo_o3clim +#ifdef HAMMOZ + PUBLIC :: io_info_print ! mo_sst +#endif + PUBLIC :: message_text ! mo_sst +#ifdef HAMMOZ + PUBLIC :: io_init_dims ! inictl +#endif + PUBLIC :: io_get_att_int ! mo_io + PUBLIC :: io_get_att_double ! mo_io + PUBLIC :: io_get_att_text ! mo_io + PUBLIC :: io_def_var ! mo_io + PUBLIC :: io_put_var_double ! mo_io + PUBLIC :: io_put_var_double1 + PUBLIC :: io_put_att_text ! mo_io + PUBLIC :: io_put_att_int ! mo_io + PUBLIC :: io_put_att_double ! mo_io + PUBLIC :: io_enddef ! mo_io + PUBLIC :: io_def_dim ! mo_io + PUBLIC :: io_info_construct ! mo_io + PUBLIC :: t_att_text ! text attributes data type + PUBLIC :: put_att ! store attribute in attributes data type + PUBLIC :: global_att ! global text attributes + + PUBLIC :: initialsize ! initial size of netCDF file + PUBLIC :: chunksize ! preferred netCDF I/O buffer size + + PUBLIC :: cleanup_netcdf ! deallocate module variables + + INCLUDE 'netcdf.inc' + + PUBLIC :: BELOWSUR, SURFACE, ABOVESUR2, ABOVESUR10, HYBRID, HYBRID_H, TILES, & + SOILLEV, ROOTZONES, CANOPY, & + COSP_LEVELS !ZK #474 + + !----------------------------------------------------------------------------- + ! + ! Due to I/O performance problems, means insufficient return values by + ! OS information in the stat() system call, we change the buffer size + ! to 16 MB fuer netcdf I/O buffer, cannot be PARAMETER, because the netCDF + ! library is written in C and we get trouble passing parameters. + +#if defined (__SX__) || defined (ES) || defined (__PGI) + INTEGER :: initialsize = 33554432 ! that's 32 MByte + INTEGER :: chunksize = 33554432 ! too +#else + INTEGER :: initialsize = 32768 ! that's 32 kByte + INTEGER :: chunksize = 32768 ! too +#endif + + !----------------------------------------------------------------------------- + TYPE FILE_INFO + + LOGICAL :: opened ! open = .true. or closed = .false. + LOGICAL :: parallel ! parallel .true. else .false. + INTEGER :: file_id ! netCDF file id + INTEGER :: access_mode ! access mode for that file + INTEGER :: ncdims(NF_MAX_VAR_DIMS) + INTEGER :: FORMAT ! file format NETCDF + + CHARACTER(len=NF_MAX_NAME) :: creation_program ! name of this program + CHARACTER(len=NF_MAX_NAME) :: creation_user ! who has run this program + CHARACTER(len=NF_MAX_NAME) :: creation_date ! created netCDF file at + CHARACTER(len=NF_MAX_NAME) :: binary_source ! binary type (CRAY or IEEE) + CHARACTER(len=NF_MAX_NAME) :: file_type ! initital or restart file + CHARACTER(len=NF_MAX_NAME) :: file_name ! nc file name + CHARACTER(len=NF_MAX_NAME) :: title + END TYPE FILE_INFO + !----------------------------------------------------------------------------- + INTEGER, PARAMETER :: max_dim_name = 32 + !----------------------------------------------------------------------------- + TYPE IO_dim + INTEGER :: dim_id = 0 ! temporary NetCDF id + INTEGER :: var_id = 0 ! temporary NetCDF id + INTEGER :: dim_len = -1 + CHARACTER(len=max_dim_name) :: dim_name = '' + CHARACTER(len=64) :: longname = '' + CHARACTER(len=32) :: units = '' + INTEGER :: levtyp = 0 ! GRIB level type + LOGICAL :: single = .FALSE. ! single level + REAL(dp) ,POINTER :: VALUE(:) => NULL() + END TYPE IO_dim + !----------------------------------------------------------------------------- + INTEGER ,PARAMETER :: max_dim_ids = 50 + INTEGER :: IO_ndim_ids + TYPE (IO_dim) ,TARGET ,SAVE :: IO_dim_ids (max_dim_ids) + + INTEGER :: BELOWSUR != 111 + INTEGER :: SOILLEV != 71 + INTEGER :: SURFACE != 1 + INTEGER :: ABOVESUR2 != 105 + INTEGER :: ABOVESUR10 != 105 + INTEGER :: HYBRID != 109 ? + INTEGER :: HYBRID_H != 110 ? + INTEGER :: TILES != 70 + INTEGER :: ROOTZONES != 72 + INTEGER :: CANOPY != 73 + INTEGER :: COSP_LEVELS!= 103 !ZK #474 + + !----------------------------------------------------------------------------- + ! data type to hold file attributes + !---------------------------------- + TYPE t_att_text + CHARACTER(len= 32) :: name = '' + CHARACTER(len=128) :: text = '' + END TYPE t_att_text + + TYPE (t_att_text) ,SAVE :: global_att (20) + !----------------------------------------------------------------------------- +CONTAINS + !----------------------------------------------------------------------------- + SUBROUTINE put_att (att, name, VALUE) + TYPE (t_att_text), INTENT(inout) :: att(:) + CHARACTER(len=*), INTENT(in) :: name + CHARACTER(len=*), INTENT(in) :: VALUE + !---------------------------------------------- + ! store an attribute in the attribute data type + !---------------------------------------------- + INTEGER :: i + DO i = 1, SIZE(att) + IF (att(i)% name == '' .OR. att(i)% name == name) THEN + att(i)% name = name + att(i)% text = VALUE + EXIT + ENDIF + END DO + END SUBROUTINE put_att + !----------------------------------------------------------------------------- + SUBROUTINE IO_info_construct(fileinfo) + TYPE(FILE_INFO), INTENT(inout) :: fileinfo + + fileinfo%opened = .FALSE. + fileinfo%parallel = .FALSE. + fileinfo%file_id = 0 + fileinfo%access_mode = 0 + fileinfo%ncdims(:) = 0 + fileinfo%creation_program = '?' + fileinfo%creation_user = '?' + fileinfo%creation_date = '?' + fileinfo%binary_source = '?' + fileinfo%file_type = '?' + fileinfo%file_name = '?' + fileinfo%title = '?' + + END SUBROUTINE IO_info_construct + !----------------------------------------------------------------------------- + FUNCTION IO_get_varindx (dimname) RESULT(indx) + CHARACTER(len=*), INTENT(in) :: dimname + INTEGER :: indx + + DO indx = 1, IO_ndim_ids + IF (IO_dim_ids(indx)%dim_name == dimname) RETURN + END DO + + indx = -1 + + END FUNCTION IO_get_varindx +#ifdef HAMMOZ + !----------------------------------------------------------------------------- + SUBROUTINE IO_init_dims + !--------------------- + ! predifine dimensions + !--------------------- + USE mo_parameters, ONLY: jpgrnd ! hard coded number of soil layers + USE mo_control, ONLY: ngl, nhgl, nlon, nlev, nlevp1, nsp, nvclev, nmp1 + USE mo_cosp_constants, ONLY: Nlr !ZK #474 + + IO_ndim_ids = 0 + !------------------------------- + ! definitions used in rerun file + !------------------------------- + CALL add_dim ("lon", nlon, "longitude", "degrees_east" ) + CALL add_dim ("lat", ngl, "latitude" , "degrees_north") + CALL add_dim ("nhgl", nhgl) + CALL add_dim ("nlevp1", nlevp1) + CALL add_dim ("spc", nsp, "spectral coefficients") + CALL add_dim ("nvclev" , nvclev) + CALL add_dim ("complex", 2, "real, imaginary part") + CALL add_dim ("nmp1", nmp1 ) +!vg ! in conflict with the more flexible definition of "belowsurface" in mo_soil +!vg +!vg CALL add_dim ("belowsurface", jpgrnd, "levels below the surface", & +!vg levtyp = 111, & +!vg indx = BELOWSUR, & +!vg units = 'cm', & +!vg VALUE = (/ 3.0_dp, & +!vg 19.0_dp, & +!vg 78.0_dp, & +!vg 268.0_dp, & +!vg 698.0_dp/)) + !------------------------------------------------------- + ! different/additional definitions used in output stream + !------------------------------------------------------- + CALL add_dim ("lev", nlev, "hybrid level at layer midpoints", & + units = "level", & + levtyp = 109, & + indx = HYBRID) + CALL add_dim ("ilev", nlev+1, "hybrid level at layer interfaces",& + units = "level", & + levtyp = 109, & + indx = HYBRID_H) + ! call add_dim ("time",nf_unlimited) + !-------------------- + ! single level fields + !-------------------- + CALL add_dim ("surface",1, levtyp = 1, & + single = .TRUE., & + indx = SURFACE) + CALL add_dim ("height2m", 1, units = "m", & + levtyp = 105, & + single = .TRUE., & + VALUE = (/2.0_dp/), & + indx = ABOVESUR2) + CALL add_dim ("height10m", 1, units = "m", & + levtyp = 105, & + single = .TRUE., & + VALUE = (/10.0_dp/), & + indx = ABOVESUR10) +!>>ZK #474 + ! Special dimensions used by COSP + CALL add_dim ("cosplev", Nlr, "height of COSP level above MSL", & + units = "m", & + levtyp = 103, & + VALUE = REAL( (/ & + 480, 960, 1440, 1920,& + 2400, 2880, 3360, 3840,& + 4320, 4800, 5280, 5760,& + 6240, 6720, 7200, 7680,& + 8160, 8640, 9120, 9600,& + 10080,10560,11040,11520,& + 12000,12480,12960,13440,& + 13920,14400,14880,15360,& + 15840,16320,16800,17280,& + 17760,18240,18720,19200 & + /), KIND=dp), & + indx = COSP_LEVELS) +!< SIZE(IO_dim_ids)) & + CALL finish ('add_dim','increase size of IO_dim_ids') + idx = IO_ndim_ids + ENDIF + dim => IO_dim_ids(idx) + !--------------------------------------------------------- + ! define attributes, chose defaults or optional parameters + !--------------------------------------------------------- + dim% dim_id = 0 + dim% var_id = 0 + dim% dim_len = len + dim% dim_name = name + dim% longname = '' ; IF (PRESENT (longname)) dim% longname = longname + dim% units = '' ; IF (PRESENT (units )) dim% units = units + dim% levtyp = 0 ; IF (PRESENT (levtyp )) dim% levtyp = levtyp + dim% single = .FALSE.; IF (PRESENT (single )) dim% single = single + IF (ASSOCIATED (dim% VALUE)) DEALLOCATE (dim% VALUE) + IF (PRESENT (VALUE)) THEN + IF (SIZE (VALUE) /= dim% dim_len) & + CALL finish ('add_dim',TRIM(name)//' len /= size (value)') + ALLOCATE (dim% VALUE (SIZE (VALUE))) + dim% VALUE = VALUE + ENDIF + IF (PRESENT(indx)) indx = idx + END SUBROUTINE add_dim + !----------------------------------------------------------------------------- + SUBROUTINE add_unknown_dim (len, indx) + !----------------------------------------- + ! add a dummy entry in the dimension table + !----------------------------------------- + INTEGER, INTENT(in) :: len ! size of dimension + INTEGER, INTENT(out) :: indx ! index of entry in table + + CHARACTER(len=4) :: nam + CHARACTER(len=4) :: form + INTEGER :: i + + SELECT CASE (len) + CASE (1:9) + form ='(i1)' + CASE (10:99) + form ='(i2)' + CASE (100:999) + form ='(i3)' + CASE default + CALL finish ('add_unknown_dim','len < 1 or len > 999') + END SELECT + nam = 'n' + WRITE (nam(2:4),form) len + DO i=1, IO_ndim_ids + IF (IO_dim_ids(i)% dim_name == nam) THEN + indx = i + RETURN + ENDIF + END DO + CALL add_dim (nam, len, levtyp=109, indx=indx) + END SUBROUTINE add_unknown_dim + !----------------------------------------------------------------------------- + SUBROUTINE IO_DEF_DIM (ncid, name, len, dimid) + INTEGER :: ncid, len, dimid, status, indx + CHARACTER(len=*) :: name + + status = NF_DEF_DIM (ncid, name, len, dimid) + IF (status /= NF_NOERR) THEN + WRITE(message_text,*) ncid, name, len + CALL message ('IO_DEF_DIM', message_text) + CALL message ('IO_DEF_DIM', NF_STRERROR(status)) + CALL finish ('IO_DEF_DIM', 'Run terminated.') + END IF + + DO indx = 1, IO_ndim_ids + IF (name == IO_dim_ids(indx)%dim_name) THEN + IO_dim_ids(indx)%dim_id = dimid + RETURN + END IF + END DO + + WRITE (message_text,*) 'element ',name,' not available ...' + CALL message ('IO_DEF_DIM', message_text) + CALL finish('IO_DEF_DIM','IO_dim_ids error') + + END SUBROUTINE IO_DEF_DIM + !----------------------------------------------------------------------------- + SUBROUTINE IO_INQ_DIMID (ncid, name, dimid) + INTEGER :: ncid, dimid, status + CHARACTER(len=*) :: name + + status = NF_INQ_DIMID (ncid, name, dimid) + IF (status /= NF_NOERR) THEN + CALL message ('IO_INQ_DIMID', name) + CALL message ('IO_INQ_DIMID', NF_STRERROR(status)) + CALL finish ('IO_INQ_DIMID', 'Run terminated.') + END IF + + END SUBROUTINE IO_INQ_DIMID + !----------------------------------------------------------------------------- + SUBROUTINE IO_INQ_DIMLEN (ncid, dimid, len) + INTEGER :: ncid, dimid, len, status + + status = NF_INQ_DIMLEN (ncid, dimid, len) + IF (status /= NF_NOERR) THEN + WRITE(message_text,*) ncid, dimid + CALL message ('IO_INQ_DIMLEN', NF_STRERROR(status)) + CALL finish ('IO_INQ_DIMLEN', 'Run terminated.') + END IF + + END SUBROUTINE IO_INQ_DIMLEN + !----------------------------------------------------------------------------- + SUBROUTINE IO_INQ_VARID (ncid, name, varid, lstat) + INTEGER :: ncid, varid, status + CHARACTER(len=*) :: name + LOGICAL, INTENT(out), OPTIONAL :: lstat + + status = NF_INQ_VARID (ncid, name, varid) + + IF (PRESENT(lstat)) THEN + lstat = status == NF_NOERR + RETURN + ENDIF + + IF (ldebugio) THEN + WRITE(message_text,*) ' Id=',ncid,' varid=',varid,' ',name + CALL message ('IO_INQ_VARID', message_text) + END IF + + IF (status /= NF_NOERR) THEN + WRITE(message_text,*) ncid, name + CALL message ('IO_INQ_VARID', message_text) + CALL message ('IO_INQ_VARID', NF_STRERROR(status)) + CALL finish ('IO_INQ_VARID', 'Run terminated.') + END IF + + END SUBROUTINE IO_INQ_VARID + !----------------------------------------------------------------------------- + SUBROUTINE IO_DEF_VAR (ncid, name, xtype, nvdims, vdims, varid, lparallel) + INTEGER :: ncid, varid, xtype, nvdims + CHARACTER(len=*) :: name + INTEGER :: vdims(*) + INTEGER :: status + LOGICAL, OPTIONAL, INTENT(in) :: lparallel + + status = NF_DEF_VAR (ncid, name, xtype, nvdims, vdims, varid) + IF (status /= NF_NOERR) THEN + WRITE(message_text,*) ncid, name, xtype, nvdims,vdims(1:nvdims) + CALL message ('IO_DEF_VAR', message_text) + CALL message ('IO_DEF_VAR', NF_STRERROR(status)) + CALL finish ('IO_DEF_VAR', 'Run terminated.') + ENDIF + IF (PRESENT(lparallel)) THEN + IF (lparallel) THEN +#ifdef PARALLEL_NC4 + status = NF_VAR_PAR_ACCESS(ncid, varid, NF_INDEPENDENT) + IF (status /= NF_NOERR) THEN + WRITE(message_text,*) ncid, name, xtype, nvdims,vdims(1:nvdims) + CALL message ('IO_DEF_VAR collective', message_text) + CALL message ('IO_DEF_VAR collective', NF_STRERROR(status)) + CALL finish ('IO_DEF_VAR collective', 'Run terminated.') + ENDIF +#else + CALL finish('IO_DEV_VAR', 'Parallel write requires -DPARALLEL_NC4 enabled during compilation') +#endif + ENDIF + ENDIF + + END SUBROUTINE IO_DEF_VAR + !----------------------------------------------------------------------------- + SUBROUTINE IO_GET_ATT_TEXT (ncid, varid, name, text) + INTEGER :: ncid, varid, TYPE, len + CHARACTER(len=*) :: name, text + INTEGER :: status + + status = NF_INQ_ATT(ncid, varid, name, TYPE, len) + IF (status /= NF_NOERR) THEN + name = 'not available' + RETURN + ENDIF + + status = NF_GET_ATT_TEXT (ncid, varid, name, text) + IF (status /= NF_NOERR) THEN + WRITE(message_text,*) ncid, varid, name + CALL message ('IO_GET_ATT_TEXT', message_text) + CALL message ('IO_GET_ATT_TEXT', NF_STRERROR(status)) + CALL finish ('IO_GET_ATT_TEXT', 'Run terminated.') + END IF + + END SUBROUTINE IO_GET_ATT_TEXT + !----------------------------------------------------------------------------- + SUBROUTINE IO_PUT_ATT_TEXT (ncid, varid, name, text) + INTEGER :: ncid, varid + CHARACTER(len=*) :: name, text + INTEGER :: status + INTEGER :: lentext + + lentext = LEN(TRIM(text)) + + status = NF_PUT_ATT_TEXT (ncid, varid, name, lentext, text) + IF (status /= NF_NOERR) THEN + WRITE(message_text,*) ncid, varid, name, lentext, text + CALL message ('IO_PUT_ATT_TEXT', message_text) + CALL message ('IO_PUT_ATT_TEXT', NF_STRERROR(status)) + CALL finish ('IO_PUT_ATT_TEXT', 'Run terminated.') + END IF + + END SUBROUTINE IO_PUT_ATT_TEXT + !----------------------------------------------------------------------------- + SUBROUTINE IO_GET_ATT_INT (ncid, varid, name, ival, lstat) + INTEGER :: ncid, varid + CHARACTER(len=*) :: name + INTEGER :: ival + LOGICAL, INTENT(out), OPTIONAL :: lstat + + INTEGER :: status + + status = NF_GET_ATT_INT (ncid, varid, name, ival) + + IF (PRESENT(lstat)) THEN + lstat = status == NF_NOERR + RETURN + ENDIF + + IF (status /= NF_NOERR) THEN + WRITE(message_text,*) ncid, varid, name + CALL message ('IO_GET_ATT_INT', message_text) + CALL message ('IO_GET_ATT_INT', NF_STRERROR(status)) + CALL finish ('IO_GET_ATT_INT', 'Run terminated.') + END IF + + END SUBROUTINE IO_GET_ATT_INT + !----------------------------------------------------------------------------- + SUBROUTINE IO_PUT_ATT_INT (ncid, varid, name, ival) + INTEGER :: ncid, varid + CHARACTER(len=*) :: name + INTEGER :: ival + INTEGER :: xtype, len + INTEGER :: status + + len = 1 + xtype = NF_INT + status = NF_PUT_ATT_INT (ncid, varid, name, xtype, len, ival) + IF (status /= NF_NOERR) THEN + WRITE(message_text,*) ncid, varid, name + CALL message ('IO_PUT_ATT_INT', message_text) + CALL message ('IO_PUT_ATT_INT', NF_STRERROR(status)) + CALL finish ('IO_PUT_ATT_INT', 'Run terminated.') + END IF + + END SUBROUTINE IO_PUT_ATT_INT + !----------------------------------------------------------------------------- + SUBROUTINE IO_GET_ATT_DOUBLE (ncid, varid, name, rval) + INTEGER :: ncid, varid + CHARACTER(len=*) :: name + REAL(dp) :: rval + INTEGER :: status + + status = NF_GET_ATT_DOUBLE (ncid, varid, name, rval) + IF (status /= NF_NOERR) THEN + WRITE(message_text,*) ncid, varid, name + CALL message ('IO_GET_ATT_DOUBLE', message_text) + CALL message ('IO_GET_ATT_DOUBLE', NF_STRERROR(status)) + CALL finish ('IO_GET_ATT_DOUBLE', 'Run terminated.') + END IF + + END SUBROUTINE IO_GET_ATT_DOUBLE + !----------------------------------------------------------------------------- + SUBROUTINE IO_PUT_ATT_DOUBLE (ncid, varid, name, rval) + INTEGER :: ncid, varid + CHARACTER(len=*) :: name + REAL(dp) :: rval + INTEGER :: xtype, len + INTEGER :: status + + len = 1 + xtype = NF_DOUBLE + + status = NF_PUT_ATT_DOUBLE (ncid, varid, name, xtype, len, rval) + IF (status /= NF_NOERR) THEN + WRITE(message_text,*) ncid, varid, name + CALL message ('IO_PUT_ATT_DOUBLE', message_text) + CALL message ('IO_PUT_ATT_DOUBLE', NF_STRERROR(status)) + CALL finish ('IO_PUT_ATT_DOUBLE', 'Run terminated.') + END IF + + END SUBROUTINE IO_PUT_ATT_DOUBLE + !----------------------------------------------------------------------------- + SUBROUTINE IO_GET_VAR_DOUBLE (ncid, varid, dvals) + INTEGER :: ncid, varid + REAL(dp) :: dvals(*) + INTEGER :: status + + status = NF_GET_VAR_DOUBLE (ncid, varid, dvals) + + IF (ldebugio) THEN + WRITE(message_text,*) ' Id=',ncid,' varid=',varid + CALL message ('IO_GET_VAR_DOUBLE', message_text) + END IF + + IF (status /= NF_NOERR) THEN + WRITE(message_text,*) ncid, varid + CALL message ('IO_GET_VAR_DOUBLE', message_text) + CALL message ('IO_GET_VAR_DOUBLE', NF_STRERROR(status)) + CALL finish ('IO_GET_VAR_DOUBLE', 'Run terminated.') + END IF + + END SUBROUTINE IO_GET_VAR_DOUBLE + !----------------------------------------------------------------------------- + SUBROUTINE IO_GET_VAR_DOUBLE1 (ncid, varid, dval) + INTEGER :: ncid, varid + REAL(dp) :: dval + INTEGER :: status + + status = NF_GET_VAR_DOUBLE (ncid, varid, dval) + + IF (ldebugio) THEN + WRITE(message_text,*) 'IO_GET_VAR_DOUBLE :',' Id=',ncid,' varid=',varid + CALL message ('IO_GET_VAR_DOUBLE', message_text) + END IF + + IF (status /= NF_NOERR) THEN + WRITE(message_text,*) ncid, varid + CALL message ('IO_GET_VAR_DOUBLE', message_text) + CALL message ('IO_GET_VAR_DOUBLE', NF_STRERROR(status)) + CALL finish ('IO_GET_VAR_DOUBLE', 'Run terminated.') + END IF + + END SUBROUTINE IO_GET_VAR_DOUBLE1 + !----------------------------------------------------------------------------- + SUBROUTINE IO_GET_VARA_DOUBLE (ncid, varid, istart, icount, dvals) + INTEGER :: ncid, varid + INTEGER :: istart(*), icount(*) + REAL(dp) :: dvals(*) + INTEGER :: status + + status = NF_GET_VARA_DOUBLE (ncid, varid, istart, icount, dvals) + IF (status /= NF_NOERR) THEN + WRITE(message_text,*) ncid, varid, istart(1:4), icount(1:4) + CALL message ('IO_GET_VARA_DOUBLE', message_text) + CALL message ('IO_GET_VARA_DOUBLE', NF_STRERROR(status)) + CALL finish ('IO_GET_VARA_DOUBLE', 'Run terminated.') + END IF + + END SUBROUTINE IO_GET_VARA_DOUBLE + !----------------------------------------------------------------------------- + SUBROUTINE IO_PUT_VARA_DOUBLE (ncid, varid, istart, icount, dvals) + INTEGER :: ncid, varid + INTEGER :: istart(*), icount(*) + REAL(dp) :: dvals(*) + INTEGER :: status + CHARACTER(len=80) :: varname + + status = NF_PUT_VARA_DOUBLE (ncid, varid, istart, icount, dvals) + IF (status /= NF_NOERR) THEN + status = NF_INQ_VARNAME (ncid, varid, varname) + WRITE(message_text,*) ncid, varid, varname + CALL message ('IO_PUT_VARA_DOUBLE', message_text) + CALL message ('IO_PUT_VARA_DOUBLE', NF_STRERROR(status)) + CALL finish ('IO_PUT_VARA_DOUBLE', 'Run terminated.') + END IF + + END SUBROUTINE IO_PUT_VARA_DOUBLE + !----------------------------------------------------------------------------- + SUBROUTINE IO_PUT_VAR_DOUBLE (ncid, varid, dvals) + INTEGER :: ncid, varid + REAL(dp) :: dvals(*) + INTEGER :: status + CHARACTER(len=80) :: varname + + IF (ldebugio) THEN + status = NF_INQ_VARNAME (ncid, varid, varname) + WRITE(message_text,*) ncid, varid, varname + CALL message ('IO_PUT_VAR_DOUBLE', message_text) + IF (status /= NF_NOERR) THEN + WRITE(message_text,*) ncid, varid + CALL message ('IO_PUT_VAR_DOUBLE', message_text) + CALL message ('IO_PUT_VAR_DOUBLE', NF_STRERROR(status)) + CALL finish ('IO_PUT_VAR_DOUBLE', 'Run terminated.') + END IF + END IF + + status = NF_PUT_VAR_DOUBLE (ncid, varid, dvals) + IF (status /= NF_NOERR) THEN + WRITE(message_text,*) ncid, varid + CALL message ('IO_PUT_VAR_DOUBLE', message_text) + CALL message ('IO_PUT_VAR_DOUBLE', NF_STRERROR(status)) + CALL finish ('IO_PUT_VAR_DOUBLE', 'Run terminated.') + END IF + + END SUBROUTINE IO_PUT_VAR_DOUBLE + !----------------------------------------------------------------------------- + SUBROUTINE IO_PUT_VAR_DOUBLE1 (ncid, varid, dval) + INTEGER :: ncid, varid + REAL(dp) :: dval + INTEGER :: status + CHARACTER (80) :: varname + + IF (ldebugio) THEN + status = NF_INQ_VARNAME (ncid, varid, varname) + WRITE(message_text,*) 'IO_PUT_VAR_DOUBLE :', ncid, varid, varname + IF (status /= NF_NOERR) THEN + WRITE(message_text,*) 'IO_PUT_VAR_DOUBLE :', ncid, varid + CALL message ('IO_PUT_VAR_DOUBLE', NF_STRERROR(status)) + CALL finish ('IO_PUT_VAR_DOUBLE', 'Run terminated.') + END IF + END IF + + status = NF_PUT_VAR_DOUBLE (ncid, varid, dval) + IF (status /= NF_NOERR) THEN + WRITE(message_text,*) 'IO_PUT_VAR_DOUBLE :', ncid, varid + CALL message ('IO_PUT_VAR_DOUBLE', NF_STRERROR(status)) + CALL finish ('IO_PUT_VAR_DOUBLE', 'Run terminated.') + END IF + + END SUBROUTINE IO_PUT_VAR_DOUBLE1 + !----------------------------------------------------------------------------- + SUBROUTINE IO_ENDDEF (ncid) + INTEGER :: ncid, status + + status = NF_ENDDEF (ncid) + IF (status /= NF_NOERR) THEN + CALL message ('IO_ENDDEF', NF_STRERROR(status)) + CALL finish ('IO_ENDDEF', 'Run terminated.') + END IF + + END SUBROUTINE IO_ENDDEF +#ifdef HAMMOZ + !----------------------------------------------------------------------------- + SUBROUTINE IO_info_print(fileinfo) + TYPE(FILE_INFO) :: fileinfo + INTEGER :: i + + CALL message('',' ') + WRITE(message_text,*) & + 'File name ',TRIM(fileinfo%file_name), & + ' type ', TRIM(fileinfo%file_type), & + ' title ', TRIM(fileinfo%title) + CALL message('',message_text) + SELECT CASE (fileinfo%format) + CASE (NETCDF) + CALL message('',' File type : NETCDF') + CASE default + CALL message('',' File type : UNKNOWN') + END SELECT + IF (fileinfo%opened) THEN + CALL message('',' File open.') + ELSE + CALL message('',' File closed.') + END IF + WRITE(message_text,*) & + 'File id :', fileinfo%file_id,& + ' access mode :',fileinfo%access_mode + CALL message('',message_text) + DO i = 1, NF_MAX_VAR_DIMS + IF (fileinfo%ncdims(i) /= 0) THEN + WRITE(message_text,*) & + 'Variable id :',i,' field dimension :',fileinfo%ncdims(i) + CALL message('',message_text) + END IF + END DO + WRITE(message_text,*) & + 'Created by ',TRIM(fileinfo%creation_user), & + ' with ', TRIM(fileinfo%creation_program), & + ' at ', TRIM(fileinfo%creation_date), & + ' source ', TRIM(fileinfo%binary_source) + CALL message('',message_text) + CALL message('',' ') + + END SUBROUTINE IO_info_print + !----------------------------------------------------------------------------- +#endif + SUBROUTINE cleanup_netcdf + ! + ! deallocate module variables + ! + INTEGER :: i + + DO i=1, SIZE(IO_dim_ids) + IF (ASSOCIATED (IO_dim_ids(i)% VALUE)) DEALLOCATE (IO_dim_ids(i)% VALUE) + END DO + + END SUBROUTINE cleanup_netcdf + !----------------------------------------------------------------------------- + ! turns nf_* function into subroutine and checks status + SUBROUTINE nf_check(status, fname) + INTEGER :: status + CHARACTER(len=*), OPTIONAL :: fname + + IF (status /= nf_noerr) THEN + IF (PRESENT(fname)) THEN + CALL finish('netcdf error in '//TRIM(fname),nf_strerror(status)) + ELSE + CALL finish('netcdf error',nf_strerror(status)) + END IF + ENDIF + + END SUBROUTINE nf_check + !----------------------------------------------------------------------------- +END MODULE mo_netCDF diff --git a/ifs-source/arpifs/phys_ec/mo_param_switches.F90 b/ifs-source/arpifs/phys_ec/mo_param_switches.F90 new file mode 100644 index 00000000..74815c6b --- /dev/null +++ b/ifs-source/arpifs/phys_ec/mo_param_switches.F90 @@ -0,0 +1,60 @@ +!> +!! @par Copyright +!! This code is subject to the MPI-M-Software - License - Agreement in it's most recent form. +!! Please see URL http://www.mpimet.mpg.de/en/science/models/model-distribution.html and the +!! file COPYING in the root of the source tree for this code. +!! Where software is supplied by third parties, it is indicated in the headers of the routines. +!! +MODULE mo_param_switches + + IMPLICIT NONE + + ! M.A. Giorgetta, March 2000, lrad added + ! + ! ---------------------------------------------------------------- + ! + ! module *mo_param_switches* switches related to the parameterisations of + ! diabatic processes except for radiation. + ! + ! ---------------------------------------------------------------- + + LOGICAL :: lphys ! *true for parameterisation of diabatic processes. + LOGICAL :: lrad ! *true for radiation. + LOGICAL :: lvdiff ! *true for vertical diffusion. + LOGICAL :: lcond ! *true for large scale condensation scheme. + LOGICAL :: lsurf ! *true for surface exchanges. + LOGICAL :: lconv ! *true to allow convection + LOGICAL :: lgwdrag ! *true for gravity wave drag scheme + LOGICAL :: lice ! *true for sea-ice temperature calculation + LOGICAL :: lconvmassfix ! *false for switching off aerosol mass fixer in conv + + INTEGER :: iconv = 1 ! *1,2,3 for different convection schemes + INTEGER :: icover = 1 ! *1 for default cloud cover scheme + ! *2 for prognostic cloud cover scheme + +!++mgs : new switches for interactive cloud scheme + LOGICAL :: lcdnc_progn ! true for prognostic cloud droplet activation + INTEGER :: ncd_activ ! type of cloud droplet activation scheme (see physctl.inc) + INTEGER :: nactivpdf ! sub-grid scale PDF of updraft velocities (see physctl.inc) !ZK +!>>SF changed the former logical lice_supersat into an integer characterizing the cirrus scheme + INTEGER :: nic_cirrus ! type of cirrus scheme (see physctl.inc) +!< orographic cirrus clouds) + ! lorocirrus = .FALSE. (default, no orographic cirrus clouds) + ! = .TRUE. (orographic cirrus clouds on) +!>>SF #475 + LOGICAL :: ldyn_cdnc_min ! switch to turn on the dynamical setting of the minimum cloud droplet number concentration + ! ldyn_cdnc_min = .FALSE. (default, fixed minimum CDNC) + ! .TRUE. (dynamical min CDNC) +!<>SF #589 + INTEGER :: cdnc_min_fixed ! fixed value for min CDNC in cm-3 (used when ldyn_cdnc_min is FALSE) + ! Warning! So far only values of 40 or 10 are accepted. +!< +!! @par Copyright +!! This code is subject to the MPI-M-Software - License - Agreement in it's most recent form. +!! Please see URL http://www.mpimet.mpg.de/en/science/models/model-distribution.html and the +!! file COPYING in the root of the source tree for this code. +!! Where software is supplied by third parties, it is indicated in the headers of the routines. +!! +!! This module provides physical constants for the ICON general circulation models. +!! +!! Physical constants are grouped as follows: +!! - Natural constants +!! - Molar weights +!! - Earth and Earth orbit constants +!! - Thermodynamic constants for the dry and moist atmosphere +!! - Constants used for the computation of lookup tables of the saturation +!! mixing ratio over liquid water (*c_les*) or ice(*c_ies*) +!! (to be shifted to the module that computes the lookup tables) + +!! +!! @par Revision History +!! Developed by Luis Kornblueh and Luca Bonaventura (2002-03) +!! Modified to ProTeX-style by Luca Bonaventura and Thomas Heinze (2004). +!! Modified according to style guide by Thomas Heinze (2005-06-24): +!! - module renamed from mo_constants to mo_physical_constants +!! - eps moved to mo_math_constants +!! - su0 renamed to u0 (as in Williamson et al. (1992) paper) +!! Adding units to comments by Thomas Heinze (2005-07-26) +!! Modification by Thomas Heinze (2006-02-21): +!! - renamed m_modules to mo_modules +!! Modification by Hui Wan (2007-01-12): +!! - added more constants from ECHAM5 +!! Modification by Hui Wan (2007-01-16): +!! - parameter u0 moved to mo_sw_testcases +!! Modification by Kristina Froehlich (2010-05-07): +!! - start to introduce consolidated physical constants +!! Modification by Marco Giorgetta (2010-07-16): +!! - improve comments and structure +!! - add "day" for length of day in [s] +!! - move constants "*_bg" for the background structure of the atmosphere of the nh-model +!! to mo_vertical_grid, which is the only module using these constants +!! - move "grav_o_cpd" to mo_divergent_modes.f90, which is th only module using this +!! derived constant +!! Modification by Felix Rieper (2012-02) +!! - added some constants needed in cloud physics scheme +!! +MODULE mo_physical_constants + + USE mo_kind, ONLY: wp + + IMPLICIT NONE + + PUBLIC + + ! Natural constants + ! ----------------- + ! + ! WMO/SI values + REAL(wp), PARAMETER :: avo = 6.02214179e23_wp !> [1/mo] Avogadro constant + REAL(wp), PARAMETER :: ak = 1.3806504e-23_wp !! [J/K] Boltzmann constant + REAL(wp), PARAMETER :: argas = 8.314472_wp !! [J/K/mol] molar/universal/ideal gas constant + REAL(wp), PARAMETER :: stbo = 5.6704E-8_wp !! [W/m2/K4] Stephan-Boltzmann constant + ! + !> Molar weights + !! ------------- + !! + !! Pure species + REAL(wp), PARAMETER :: amco2 = 44.0095_wp !>[g/mol] CO2 (National Institute for + !! Standards and Technology (NIST)) + REAL(wp), PARAMETER :: amch4 = 16.043_wp !! [g/mol] CH4 + REAL(wp), PARAMETER :: amo3 = 47.9982_wp !! [g/mol] O3 + REAL(wp), PARAMETER :: amo2 = 31.9988_wp !! [g/mol] O2 + REAL(wp), PARAMETER :: amn2o = 44.013_wp !! [g/mol] N2O + REAL(wp), PARAMETER :: amc11 =137.3686_wp !! [g/mol] CFC11 + REAL(wp), PARAMETER :: amc12 =120.9140_wp !! [g/mol] CFC12 + REAL(wp), PARAMETER :: amw = 18.0154_wp !! [g/mol] H2O + REAL(wp), PARAMETER :: ams = 32.064_wp !! [g/mol] S + REAL(wp), PARAMETER :: amso4 = 96.0631_wp !! [g/mol] SO4 + ! + !> Mixed species + REAL(wp), PARAMETER :: amd = 28.970_wp !> [g/mol] dry air + ! + !> Auxiliary constants + ! ppmv2gg converts ozone from volume mixing ratio in ppmv + ! to mass mixing ratio in g/g + REAL(wp), PARAMETER :: ppmv2gg=1.e-6_wp*amo3/amd + ! + !> Earth and Earth orbit constants + !! ------------------------------- + !! + REAL(wp), PARAMETER :: earth_radius = 6.371229e6_wp !! [m] average radius + REAL(wp), PARAMETER :: inverse_earth_radius = 1._wp/earth_radius !! [1/m] + !REAL(wp), PARAMETER :: earth_angular_velocity = 7.29212e-5_wp !! [rad/s] angular velocity + ! read from namelist runctl, is saved in mo_control (for RCE) + ! + ! WMO/SI value + REAL(wp), PARAMETER :: grav = 9.80665_wp !> [m/s2] av. gravitational acceleration + REAL(wp), PARAMETER :: rgrav = 1._wp/grav !! [s2/m] + ! + REAL(wp), PARAMETER :: rae = 0.1277E-2_wp !> [m/m] ratio of atm. scale height + ! !! to Earth radius + REAL(wp), PARAMETER :: secperday = 86400._wp ! seconds per day + ! + !> Thermodynamic constants for the dry and moist atmosphere + !! -------------------------------------------------------- + ! + !> Dry air + REAL(wp), PARAMETER :: rd = 287.04_wp !> [J/K/kg] gas constant + REAL(wp), PARAMETER :: cpd = 1004.64_wp !! [J/K/kg] specific heat at constant pressure + REAL(wp), PARAMETER :: cvd = cpd-rd !! [J/K/kg] specific heat at constant volume + REAL(wp), PARAMETER :: con_m = 1.50E-5_wp !! [m^2/s] kinematic viscosity of dry air + REAL(wp), PARAMETER :: con_h = 2.20E-5_wp !! [m^2/s] scalar conductivity of dry air + REAL(wp), PARAMETER :: con0_h= 2.40e-2_wp !! [J/m/s/K]thermal conductivity of dry air + REAL(wp), PARAMETER :: eta0d = 1.717e-5_wp !! [N*s/m2] dyn viscosity of dry air at tmelt +!>>SF/HK #525 + REAL(wp), PARAMETER :: mair = 28.97e-3_wp !! [kg/mol] molar mass +!< H2O + !! - gas + REAL(wp), PARAMETER :: rv = 461.51_wp !> [J/K/kg] gas constant for water vapor + REAL(wp), PARAMETER :: cpv = 1869.46_wp !! [J/K/kg] specific heat at constant pressure + REAL(wp), PARAMETER :: cvv = cpv-rv !! [J/K/kg] specific heat at constant volume + REAL(wp), PARAMETER :: dv0 = 2.22e-5_wp !! [m^2/s] diff coeff of H2O vapor in dry air at tmelt + !> - liquid / water + REAL(wp), PARAMETER :: rhoh2o= 1000._wp !> [kg/m3] density of liquid water + !> H2O related constants (liquid, ice, snow), phase change constants + ! echam values + REAL(wp), PARAMETER :: rhosea = 1025.0_wp ! density of sea water in kg/m3 + REAL(wp), PARAMETER :: rhoice = 917.0_wp ! density of ice in kg/m3 + REAL(wp), PARAMETER :: rhosno = 300.0_wp ! density of snow in kg/m3 + REAL(wp), PARAMETER :: rhoiw = rhoice/rhoh2o ! density ratio (ice/water) + REAL(wp), PARAMETER :: cpliq = 4218._wp ! specific heat for liquid water J/K/kg + REAL(wp), PARAMETER :: cpsea = 3994._wp ! specific heat for sea water J/K/kg + REAL(wp), PARAMETER :: cpice = 2106._wp ! specific heat for ice J/K/kg + REAL(wp), PARAMETER :: cpsno = 2090._wp ! specific heat for snow J/K/kg + REAL(wp), PARAMETER :: alice = 2.1656_wp ! thermal conductivity of ice in W/K/m + REAL(wp), PARAMETER :: alsno = 0.31_wp ! thermal conductivity of snow in W/K/m + ! echam values end + ! + !REAL(wp), PARAMETER :: clw = 4186.84_wp !! [J/K/kg] specific heat of water + ! !! see below + REAL(wp), PARAMETER :: cv_i = 2000.0_wp + !> - phase changes + REAL(wp), PARAMETER :: alv = 2.5008e6_wp !> [J/kg] latent heat for vaporisation + REAL(wp), PARAMETER :: als = 2.8345e6_wp !! [J/kg] latent heat for sublimation + REAL(wp), PARAMETER :: alf = als-alv !! [J/kg] latent heat for fusion + REAL(wp), PARAMETER :: tmelt = 273.15_wp !! [K] melting temperature of ice/snow + ! + !> Auxiliary constants + REAL(wp), PARAMETER :: rdv = rd/rv !> [ ] + ! the next 2 values not as parameters due to ECHAM-dyn + REAL(wp) :: vtmpc1= rv/rd-1.0_wp !! [ ] + REAL(wp) :: vtmpc2= cpv/cpd-1.0_wp !! [ ] + REAL(wp), PARAMETER :: rcpv = cpd/cpv-1.0_wp !! [ ] + REAL(wp), PARAMETER :: alvdcp= alv/cpd !! [K] + REAL(wp), PARAMETER :: alsdcp= als/cpd !! [K] + REAL(wp), PARAMETER :: rcpd = 1.0_wp/cpd !! [K*kg/J] + REAL(wp), PARAMETER :: rcvd = 1.0_wp/cvd !! [K*kg/J] + REAL(wp), PARAMETER :: rcpl = 3.1733_wp !! cp_d / cp_l - 1 + ! + REAL(wp), PARAMETER :: clw = (rcpl + 1.0_wp) * cpd !> specific heat capacity of liquid water + REAL(wp), PARAMETER :: cv_v = (rcpv + 1.0_wp) * cpd - rv + ! + REAL(wp), PARAMETER :: O_m_rdv = 1._wp-rd/rv !> [ ] + REAL(wp), PARAMETER :: rd_o_cpd = rd/cpd !! [ ] + REAL(wp), PARAMETER :: cvd_o_rd = cvd/rd !! [ ] + ! + REAL(wp), PARAMETER :: p0ref = 100000.0_wp !> [Pa] reference pressure for Exner function + !> Auxiliary constants used in ECHAM + ! Constants used for computation of saturation mixing ratio + ! over liquid water (*c_les*) or ice(*c_ies*) + REAL(wp), PARAMETER :: c1es = 610.78_wp ! + REAL(wp), PARAMETER :: c2es = c1es*rd/rv ! + REAL(wp), PARAMETER :: c3les = 17.269_wp ! + REAL(wp), PARAMETER :: c3ies = 21.875_wp ! + REAL(wp), PARAMETER :: c4les = 35.86_wp ! + REAL(wp), PARAMETER :: c4ies = 7.66_wp ! + ! + !> Variables for computing cloud cover in RH scheme + REAL(wp), PARAMETER :: uc1 = 0.8_wp + REAL(wp), PARAMETER :: ucl = 1.00_wp + ! + !> vertical profile parameters (vpp) of CH4 and N2O + REAL(wp), PARAMETER :: vpp_ch4(3) = (/1.25e-01_wp, 683.0_wp, -1.43_wp/) + REAL(wp), PARAMETER :: vpp_n2o(3) = (/1.20e-02_wp, 1395.0_wp, -1.43_wp/) + ! + !> constants for radiation module + REAL(wp), PARAMETER :: zemiss_def = 0.996_wp !> lw sfc default emissivity factor + ! + !--------------------------- + ! Specifications, thresholds, and derived constants for the following subroutines: + ! s_lake, s_licetemp, s_sicetemp, meltpond, meltpond_ice, update_albedo_ice_meltpond + ! + REAL(wp), PARAMETER :: dmix = 10.0_wp ! mixed-layer depth of lakes in m + !REAL(wp), PARAMETER :: dmixsea = 50.0_wp ! mixed-layer depth of ocean in m + ! read from namelist runctl as rmlo_depth, is saved in mo_control + REAL(wp), PARAMETER :: dice = 0.05_wp ! minimum ice thickness in m + REAL(wp), PARAMETER :: dicepond = 0.01_wp ! minimum ice thickness of pond ice in m + REAL(wp), PARAMETER :: dicelim = 0.10_wp ! threshold ice thickness for pond closing in m + REAL(wp), PARAMETER :: dpondmin = 0.01_wp ! minimum pond depth for pond fraction in m + REAL(wp), PARAMETER :: albpondi = 0.30_wp ! albedo of pond ice + ! + REAL(wp), PARAMETER :: snicecond = alice/alsno * rhoh2o/rhosno + REAL(wp), PARAMETER :: hcapmix = rhoh2o*cpliq*dmix ! heat capacity of lake mixed layer + ! ! in J/K/m2 + REAL(wp), PARAMETER :: hcapice = rhoice*cpice*dice ! heat capacity of upper ice layer + REAL(wp), PARAMETER :: hcapicep = rhoice*cpice*dicepond ! heat capacity of upper pond ice layer + ! + REAL(wp), PARAMETER :: rhoilf = rhoice*alf ! [J/m3] + REAL(wp), PARAMETER :: rhowlf = rhoh2o*alf ! [J/m3] + REAL(wp), PARAMETER :: hcaprilf = hcapmix/rhoilf ! [m/K] + REAL(wp), PARAMETER :: rilfhcap = rhoilf/hcapmix ! [K/m] + REAL(wp), PARAMETER :: tfreez = dice*rilfhcap ! cooling below tmelt required to form dice + !--------------------------- + ! + !------------below are parameters for ocean model--------------- + ! coefficients in linear EOS + REAL(wp), PARAMETER :: a_T = 2.55E-04_wp ! thermal expansion coefficient (kg/m3/K) + REAL(wp), PARAMETER :: b_S = 7.64E-01_wp ! haline contraction coefficient (kg/m3/psu) + ! + ! density reference values, to be constant in Boussinesq ocean models + REAL(wp), PARAMETER :: rho_ref = 1025.022_wp ! reference density [kg/m^3] + REAL(wp), PARAMETER :: rho_inv = 0.0009755881663_wp ! inverse reference density [m^3/kg] + REAL(wp), PARAMETER :: sal_ref = 35.0_wp ! reference salinity [psu] + ! + REAL(wp), PARAMETER :: SItodBar = 1.0e-4_wp !Conversion from pressure [p] to pressure [bar] + ! !used in ocean thermodynamics + REAL(wp), PARAMETER :: sfc_press_pascal = 101300.0_wp + REAL(wp), PARAMETER :: sfc_press_bar = 101300.0_wp*SItodBar + ! + REAL(wp), PARAMETER :: p0sl_bg = 101325._wp ! [Pa] sea level pressure + ! + !----------below are parameters for sea-ice model--------------- + REAL(wp), PARAMETER :: ks = 0.31_wp ! heat conductivity snow [J / (m s K)] + REAL(wp), PARAMETER :: ki = 2.03_wp ! heat conductivity ice [J / (m s K)] + REAL(wp), PARAMETER :: rhoi = 910.0_wp ! density of sea ice [kg / m3] + REAL(wp), PARAMETER :: rhos = 330.0_wp ! density of snow [kg / m3] + REAL(wp), PARAMETER :: ci = 2100.0_wp ! Heat capacity of ice [J / (kg K)] + REAL(wp), PARAMETER :: Tf = -1.80_wp ! Temperature ice bottom [C] + REAL(wp), PARAMETER :: Sice = 5.0_wp ! Sea-ice bulk salinity [ppt] + REAL(wp), PARAMETER :: mu = 0.054_wp ! Constant in linear freezing- + ! ! point relationship [C/ppt] + REAL(wp), PARAMETER :: muS = mu*Sice ! = - (sea-ice liquidus + ! ! (aka melting) temperature) [C] + !REAL(wp), PARAMETER :: muS = -(-0.0575 + 1.710523E-3*Sqrt(Sice) - 2.154996E-4*Sice) * Sice + REAL(wp), PARAMETER :: albs = 0.75_wp ! Albedo of snow (not melting) + REAL(wp), PARAMETER :: albsm = 0.65_wp ! Albedo of snow (melting) + REAL(wp), PARAMETER :: albi = 0.66_wp ! Albedo of ice (not melting) + REAL(wp), PARAMETER :: albim = 0.64_wp ! Albedo of ice (melting) + REAL(wp), PARAMETER :: albedoW = 0.1_wp ! albedo of the ocean + !REAL(wp), PARAMETER :: I_0 = 0.3 ! Ice-surface penetrating shortwave fraction + REAL(wp), PARAMETER :: I_0 = 0.0_wp ! Ice-surface penetrating shortwave fraction + !------------------------------------------------------------ + +END MODULE mo_physical_constants diff --git a/ifs-source/arpifs/phys_ec/mo_radiation_parameters.F90 b/ifs-source/arpifs/phys_ec/mo_radiation_parameters.F90 new file mode 100644 index 00000000..c9c39b69 --- /dev/null +++ b/ifs-source/arpifs/phys_ec/mo_radiation_parameters.F90 @@ -0,0 +1,251 @@ +!> +!! @par Copyright +!! This code is subject to the MPI-M-Software - License - Agreement in it's most recent form. +!! Please see URL http://www.mpimet.mpg.de/en/science/models/model-distribution.html and the +!! file COPYING in the root of the source tree for this code. +!! Where software is supplied by third parties, it is indicated in the headers of the routines. +!! +!++mgs: new module 14.03.2010 +!++mgs: added decl_sun_cur (for MOZ photolysis) 02.06.2010 +!! @brief Module to provide parameters to radiation routines and avoid circular dependencies. +!! +!! @remarks +!! This module contains the public parameters provided by the radiation module +!! mo_radiation. +!! +!! @author Bjorn Stevens, MPI-M, Hamburg (2009-09-19): +!! +!! Martin Schultz, FZJ, Juelich (2010-04-13): +!! extracted parameters from mo_radiation +!! Dagmar Popke, MPI-M, Hamburg (2013-11-15): +!! Implementation of RCE +!! +!! $ID: n/a$ +!! +!! @par Origin +!! see mo_radiation.f90 +!! +! +MODULE mo_radiation_parameters + + USE mo_kind, ONLY: wp + USE mo_math_constants, ONLY: pi + USE mo_control, ONLY: lrce + +IMPLICIT NONE + + PRIVATE + + PUBLIC :: ldiur, lradforcing + PUBLIC :: lyr_perp, yr_perp, nmonth, isolrad, nb_sw + PUBLIC :: lw_spec_samp, sw_spec_samp, lw_gpts_ts, sw_gpts_ts, rad_perm + PUBLIC :: i_overlap, l_do_sep_clear_sky + PUBLIC :: ih2o, ico2, ich4, io3, io2, in2o, icfc, ighg, iaero, fco2 + PUBLIC :: co2vmr, ch4vmr, o2vmr, n2ovmr, cfcvmr + PUBLIC :: co2mmr, ch4mmr, o2mmr, n2ommr + PUBLIC :: twopi, deg2rad, ch4_v, n2o_v + PUBLIC :: cemiss, diff, rad_undef, solc + PUBLIC :: psct, psctm, ssi_factor, flx_ratio_cur, flx_ratio_rad, decl_sun_cur + PUBLIC :: l_interp_rad_in_time, zepzen + + ! 1.0 NAMELIST global variables and parameters + ! -------------------------------- + LOGICAL :: ldiur = .TRUE. !< diurnal cycle + LOGICAL :: lradforcing(2) = (/.FALSE.,.FALSE./) !< &! switch on/off diagnostic + !of instantaneous aerosol solar (lradforcing(1)) and + !thermal (lradforcing(2)) radiation forcing + LOGICAL :: lyr_perp = .FALSE. !< switch to specify perpetual vsop87 year + INTEGER :: yr_perp = -99999 !< year if (lyr_perp == .TRUE.) + INTEGER :: nmonth = 0 !< 0=annual cycle; 1-12 for perpetual month + ! nmonth currently works for zonal mean ozone and the orbit (year 1987) only + INTEGER :: isolrad = 3 !< mode of solar constant calculation + !< default is rrtm solar constant + INTEGER :: nb_sw !< number of shortwave bands, set in setup + + ! Spectral sampling + INTEGER :: lw_spec_samp = 1, sw_spec_samp = 1 ! 1 is broadband, 2 is MCSI, 3 and up are teams + INTEGER :: lw_gpts_ts = 1, sw_gpts_ts = 1 ! Number of g-points per time step using MCSI + INTEGER :: rad_perm = 0 ! Integer for perturbing random number seeds + ! Radiation driver + LOGICAL :: l_do_sep_clear_sky = .TRUE. ! Compute clear-sky fluxes by removing clouds + INTEGER :: i_overlap = 1 ! 1 = max-ran, 2 = max, 3 = ran + LOGICAL :: l_interp_rad_in_time = .TRUE. + ! + ! --- Switches for radiative agents + ! + INTEGER :: ih2o = 1 !< water vapor, clouds and ice for radiation + INTEGER :: ico2 = 2 !< carbon dioxide + INTEGER :: ich4 = 3 !< methane + INTEGER :: io3 = 3 !< ozone + INTEGER :: io2 = 2 !< molecular oxygen + INTEGER :: in2o = 3 !< nitrous oxide + INTEGER :: icfc = 2 !< cfc11 and cfc12 + INTEGER :: ighg = 0 !< greenhouse gase scenario + INTEGER :: iaero = 2 !< aerosol model + REAL(wp) :: fco2 = 1._wp !< factor for external co2 scenario (ico2=4) + ! + ! --- Default gas volume mixing ratios - 1990 values (CMIP5) + ! + REAL(wp) :: co2vmr = 353.9e-06_wp !< CO2 + REAL(wp) :: ch4vmr = 1693.6e-09_wp !< CH4 + REAL(wp) :: o2vmr = 0.20946_wp !< O2 + REAL(wp) :: n2ovmr = 309.5e-09_wp !< N20 + REAL(wp) :: cfcvmr(2) = (/252.8e-12_wp,466.2e-12_wp/) !< CFC 11 and CFC 12 + ! + ! 2.0 Non NAMELIST global variables and parameters + ! -------------------------------- + REAL(wp), PARAMETER :: twopi = 2.0_wp*pi + REAL(wp), PARAMETER :: deg2rad = pi/180.0_wp + REAL(wp), PARAMETER :: ch4_v(3) = (/1.25e-01_wp, 683.0_wp, -1.43_wp /) + REAL(wp), PARAMETER :: n2o_v(3) = (/1.20e-02_wp, 1395.0_wp, -1.43_wp/) + ! + ! --- radiative transfer parameters + ! + REAL(wp), PARAMETER :: cemiss = 0.996_wp !< LW Emissivity Factor + REAL(wp), PARAMETER :: diff = 1.66_wp !< LW Diffusivity Factor + REAL(wp), PARAMETER :: rad_undef = -999._wp + REAL(wp), PARAMETER :: zepzen = 1.e-10_wp + ! + ! + REAL(wp) :: solc = 1361.371_wp !< default solar constant [W/m2] for + ! AMIP-type CMIP5 simulation + !++hs + REAL(wp) :: psct !< local (orbit relative and possibly + ! time dependent) solar constant + REAL(wp) :: psctm !< orbit and time dependent solar constant for radiation time step + REAL(wp) :: ssi_factor(14) !< fraction of TSI in the 14 RRTM SW bands + !--hs + REAL(wp) :: flx_ratio_cur, flx_ratio_rad + REAL(wp) :: decl_sun_cur !< solar declination at current time step + ! + ! 3.0 Variables computed by routines in mo_radiation (export to submodels) + ! -------------------------------- + ! + REAL(wp) :: co2mmr, ch4mmr, o2mmr, n2ommr ! setup_radiation + + public solar_parameters + +contains + + !--------------------------------------------------------------------------- + !> + !! @brief Scans a block and fills with solar parameters + !! + !! @remarks: This routine calculates the solar zenith angle for each + !! point in a block of data. For simulations with no dirunal cycle + !! the cosine of the zenith angle is set to its average value (assuming + !! negatives to be zero and for a day divided into nds intervals). + !! Additionally a field is set indicating the fraction of the day over + !! which the solar zenith angle is greater than zero. Otherwise the field + !! is set to 1 or 0 depending on whether the zenith angle is greater or + !! less than 1. + ! + SUBROUTINE solar_parameters(decl_sun, dist_sun, time_of_day & + & ,sinlon, sinlat, coslon, coslat & + & ,flx_ratio, cos_mu0, daylght_frc) + + REAL(wp), INTENT(in) :: & + decl_sun, & !< delination of the sun + dist_sun, & !< distance from the sun in astronomical units + time_of_day, & !< time_of_day (in radians) + sinlon(:,:), & !< sines of longitudes + sinlat(:,:), & !< and latitudes + coslon(:,:), & !< cosines of longitudes + coslat(:,:) !< and latitudes + REAL(wp), INTENT(out) :: & + flx_ratio, & !< ratio of actual to average solar constant + cos_mu0(:,:), & !< cos_mu_0, cosine of the solar zenith angle + daylght_frc(:,:) !< daylight fraction (0 or 1) with diurnal cycle + + INTEGER :: i, j + REAL(wp) :: zen1, zen2, zen3, z1, z2, z3, xx + + LOGICAL, SAVE :: initialized = .FALSE. + INTEGER, PARAMETER :: nds = 128 !< number of diurnal samples + REAL (wp), SAVE :: cosrad(nds), sinrad(nds) + REAL (wp) :: xsmpl(nds), xnmbr(nds) + + IF (.NOT.initialized) THEN + DO i = 1, nds + xx = twopi*(i-1.0_wp)/nds + sinrad(i) = SIN(xx) + cosrad(i) = COS(xx) + END DO + initialized = .TRUE. + END IF + + flx_ratio = 1.0_wp/dist_sun**2 + zen1 = SIN(decl_sun) + zen2 = COS(decl_sun)*COS(time_of_day) + zen3 = COS(decl_sun)*SIN(time_of_day) + + IF (lrce) THEN ! radiation calculation in RCE configuration (same equatorial zenith + ! angle for all gridpoints) + IF (ldiur) THEN ! all grid points have diurnal cycle of equator + cos_mu0(:,:) = -zen2 + daylght_frc(:,:) = 1.0_wp + WHERE (cos_mu0(:,:) < 0.0_wp) + cos_mu0(:,:) = 0.0_wp + daylght_frc(:,:) = 0.0_wp + END WHERE + ELSE + DO j = 1, SIZE(cos_mu0,2) + DO i = 1, SIZE(cos_mu0,1) + + xsmpl(:) = 0.7854_wp ! solar weighted zenith angle of equator + xnmbr(:) = 1.0_wp + WHERE (xsmpl(:) < EPSILON(1.0_wp)) + xsmpl(:) = 0.0_wp + xnmbr(:) = 0.0_wp + END WHERE + + cos_mu0(i,j) = SUM(xsmpl(:)) + daylght_frc(i,j) = SUM(xnmbr(:)) + END DO + END DO + + WHERE (daylght_frc(:,:) > EPSILON(1.0_wp)) + cos_mu0(:,:) = cos_mu0(:,:)/daylght_frc(:,:) + daylght_frc(:,:) = daylght_frc(:,:)/nds + END WHERE + END IF + ELSE ! normal radiation calculation + IF (ldiur) THEN + cos_mu0(:,:) = zen1*sinlat(:,:) & + & -zen2*coslat(:,:)*coslon(:,:) & + & +zen3*coslat(:,:)*sinlon(:,:) + daylght_frc(:,:) = 1.0_wp + WHERE (cos_mu0(:,:) < 0.0_wp) + cos_mu0(:,:) = 0.0_wp + daylght_frc(:,:) = 0.0_wp + END WHERE + ELSE + DO j = 1, SIZE(cos_mu0,2) + DO i = 1, SIZE(cos_mu0,1) + + z1 = zen1*sinlat(i,j) + z2 = -zen2*coslat(i,j) + z3 = zen3*coslat(i,j) + + xsmpl(:) = z1 + z2*cosrad(:) + z3*sinrad(:) + xnmbr(:) = 1.0_wp + WHERE (xsmpl(:) < EPSILON(1.0_wp)) + xsmpl(:) = 0.0_wp + xnmbr(:) = 0.0_wp + END WHERE + + cos_mu0(i,j) = SUM(xsmpl(:)) + daylght_frc(i,j) = SUM(xnmbr(:)) + END DO + END DO + + WHERE (daylght_frc(:,:) > EPSILON(1.0_wp)) + cos_mu0(:,:) = cos_mu0(:,:)/daylght_frc(:,:) + daylght_frc(:,:) = daylght_frc(:,:)/nds + END WHERE + END IF + END IF + + END SUBROUTINE solar_parameters + +END MODULE mo_radiation_parameters diff --git a/ifs-source/arpifs/phys_ec/mo_read_netcdf77.F90 b/ifs-source/arpifs/phys_ec/mo_read_netcdf77.F90 new file mode 100644 index 00000000..d08fcb11 --- /dev/null +++ b/ifs-source/arpifs/phys_ec/mo_read_netcdf77.F90 @@ -0,0 +1,1144 @@ +!> +!! @par Copyright +!! This code is subject to the MPI-M-Software - License - Agreement in it's most recent form. +!! Please see URL http://www.mpimet.mpg.de/en/science/models/model-distribution.html and the +!! file COPYING in the root of the source tree for this code. +!! Where software is supplied by third parties, it is indicated in the headers of the routines. +!! +MODULE mo_read_netcdf77 + ! + ! Description: + ! + ! subroutines for reading (hyperslabs) of variables from netcdf files + ! order of dimensions in netcdf files and fortran variable can be different + ! + ! Authors: + ! + ! J.S. Rast, MPI, May 2005, change all netcdf routines to fortran 77 calls + ! D.O'Donnell, MPI-M, Feb 2008, added read 4-D variable + + USE mo_kind, ONLY: dp + USE mo_exception, ONLY: finish + USE mo_netcdf, ONLY: nf_check, nf_max_var_dims, nf_open, nf__open, & + nf_close, chunksize, nf_nowrite, & + nf_inq_dimlen, nf_inq_dimid, nf_inq_varid, & + nf_get_vara_double, nf_inq_varndims, & + nf_inq_nvars, nf_inq_vardimid, nf_inq_varname, & + nf_get_var_double + + IMPLICIT NONE + + PRIVATE + + PUBLIC :: read_var_nf77_0d ! read 0D-variable + PUBLIC :: read_var_nf77_1d ! read 1D-variable + PUBLIC :: read_var_nf77_2d ! read 2D-variable + PUBLIC :: read_var_nf77_3d ! read 3D-variable + PUBLIC :: read_var_nf77_4d ! read 4D-variable + PUBLIC :: read_sumvar_nf77_2d ! read sum of hyperslab of 3D-variables (third dim. has to + ! have length 12, sum of all such 3D-variables is calc. + PUBLIC :: read_var_hs_nf77_0d + PUBLIC :: read_var_hs_nf77_1d ! read hyperslab of 2D-variable (second dim. is time) + PUBLIC :: read_var_hs_nf77_2d ! read hyperslab of 3D-variable (third dim. is time) + PUBLIC :: read_var_hs_nf77_3d ! read hyperslab of 4D-variable (fourth dim. is time) + PUBLIC :: search_var_nf77 ! searches for variable in file + PUBLIC :: read_diml_nf77 ! gives length of a dimension + +CONTAINS +!=============================================================================== + SUBROUTINE read_var_nf77_0d (file_name, varname, var, ierr) + + ! Description: + ! + ! read variable varname from file file_name + ! + ! Method: + ! + ! Open the netCDF file named file_name and read varname into var. + ! The routine is to be intended to run on the I/O-processor + ! + ! Parameter list: + ! + ! CHARACTER (LEN = *), INTENT (in) :: file_name ! file name of the netCDF file + ! from which variable should be read + ! CHARACTER (LEN = *), INTENT (in) :: varname ! name of variable to be read + ! REAL(dp), INTENT(out) :: var ! variable value on exit + ! INTEGER, INTENT(out) :: ierr ! ierr is 0 if variable varname + ! was sucessfully read, 1 otherwise + ! + ! Authors: + ! + ! J.S. Rast, MPI, January 2010, original source + ! + ! Arguments: + ! + ! + CHARACTER (LEN = *), INTENT (in) :: file_name + CHARACTER (LEN = *), INTENT (in) :: varname + REAL(dp), INTENT(out) :: var + INTEGER, INTENT (out) :: ierr + ! + ! Local variables: + ! + INTEGER :: zncid, znvar +! open netCDF file + CALL nf_check(nf__open(TRIM(file_name), nf_nowrite, chunksize, zncid), fname=TRIM(file_name)) +! inquire variable and number of dimensions + ierr=nf_inq_varid(zncid, TRIM(varname), znvar) + IF (ierr == 0) THEN + CALL nf_check(nf_get_var_double(zncid, znvar, var), fname=TRIM(file_name)) + ELSE + CALL finish('read_var_nf77_0d:', & + 'variable '//TRIM(varname)//' not found in '//TRIM(file_name)) + END IF + CALL nf_check(nf_close(zncid)) + END SUBROUTINE read_var_nf77_0d +!=============================================================================== +!=============================================================================== + SUBROUTINE read_var_nf77_1d (file_name, dimname, varname, varptr, ierr) + + ! Description: + ! + ! read in from a netCDF file variable varname(dimname). + ! + ! Method: + ! + ! Open the netCDF file named file_name and read in varptr varname(dimname). + ! The routine is to be intended to run on the I/O-processor + ! + ! Parameter list: + ! + ! CHARACTER (LEN = *), INTENT (in) :: file_name ! file name of the netCDF file + ! from which variable should be read + ! CHARACTER (LEN = *), INTENT (in) :: dimname ! name of dimension in the netCDF + ! file which shall appear as the dimension of varptr. + ! CHARACTER (LEN = *), INTENT (in) :: varname ! name of variable to be read + ! REAL(dp), INTENT(out) :: varptr(:) ! variable values on exit, has to have + ! dimension exactly as the lengths of dimname in netCDF file + ! INTEGER, INTENT(out) :: ierr ! ierr is 0 if variable varname is successfully + ! read, 1 otherwise + ! + ! Authors: + ! + ! J.S. Rast, MPI, August 2004, original source + ! + ! Arguments: + ! + CHARACTER (LEN = *), INTENT (in) :: file_name + CHARACTER (LEN = *), INTENT (in) :: dimname + CHARACTER (LEN = *), INTENT (in) :: varname + REAL(dp), INTENT(out) :: varptr(:) + INTEGER, INTENT (out) :: ierr + ! + ! Local variables: + ! + INTEGER :: zncid, zdimlength, znvar, zvardims + INTEGER :: zdims, zdimid + zdims = SIZE (varptr) +! open netCDF file + CALL nf_check(nf__open(TRIM(file_name), nf_nowrite, chunksize, zncid), fname=TRIM(file_name)) +! verify lenght of dimension + CALL nf_check(nf_inq_dimid(zncid, TRIM(dimname), zdimid), fname=TRIM(file_name)) + CALL nf_check(nf_inq_dimlen(zncid, zdimid, zdimlength), fname=TRIM(file_name)) + IF (zdimlength /= zdims) THEN + CALL finish('read_var_nf77_1d:', 'wrong length of dim in file '//TRIM(file_name)) + END IF +! inquire variable and number of dimensions + ierr=nf_inq_varid(zncid, TRIM(varname), znvar) + IF (ierr == 0) THEN + CALL nf_check(nf_inq_varndims(zncid, znvar, zvardims), fname=TRIM(file_name)) + IF (zvardims /= 1) THEN + CALL finish('read_var_nf77_1d:', & + 'wrong number of dimension of variable '//TRIM(varname)) + END IF + CALL nf_check(nf_get_vara_double(zncid, znvar, (/1/), (/zdims/), varptr), fname=TRIM(file_name)) + ELSE + CALL finish('read_var_nf77_1d:', & + 'variable '//TRIM(varname)//' not found in '//TRIM(file_name)) + END IF + END SUBROUTINE read_var_nf77_1d +!=============================================================================== +!=============================================================================== + SUBROUTINE read_var_nf77_2d (file_name, dimname1, dimname2, var_name, varptr, ierr) + + ! Description: + ! + ! read in a variable from a netCDF file ******************(not yet tested)******************* + ! + ! Method: + ! + ! Open the netCDF file named file_name and read in varptr the values of var_name + ! dimname1,dimname2 are the names of the dimension in the order as they will + ! be in varptr. The order of the dimensions in the netCDF file is irrelevant. + ! The routine is to be intended to run on the I/O-processor + ! + ! Parameter list: + ! + ! CHARACTER (LEN = *), INTENT (in) :: file_name ! file name of the netCDF file + ! from which variable should be read + ! CHARACTER (LEN = *), INTENT (in) :: dimname1 ! name of dimension in the netCDF + ! file which shall appear as the first dimension of varptr. var_name can + ! have this dimension at any of the three possible positions + ! CHARACTER (LEN = *), INTENT (in) :: dimname2 ! name of dimension in the netCDF + ! file which shall appear as the second dimension of varptr. var_name can + ! have this dimension at any of the three possible positions + ! CHARACTER (LEN = *), INTENT (in) :: var_name ! name of the variable to be read + ! REAL(dp), INTENT(out) :: varptr(:,:,:) ! variable values on exit, has to + ! dimension exactly as the lengths of dimname1,...,dimname3 in netCDF file + ! INTEGER, INTENT(out) :: ierr ! ierr is 0 if variable var_name is successfully + ! read, 1 if it was not found in file file_name + ! + ! Authors: + ! + ! J.S. Rast, MPI, December 2002, original source + ! + ! Arguments: + ! + CHARACTER (LEN = *), INTENT (in) :: file_name + CHARACTER (LEN = *), INTENT (in) :: dimname1 + CHARACTER (LEN = *), INTENT (in) :: dimname2 + CHARACTER (LEN = *), INTENT (in) :: var_name + REAL(dp), INTENT(out) :: varptr(:,:) + INTEGER, INTENT (out) :: ierr + ! + ! Local variables: + ! + INTEGER :: zncid, zdimlength, zvarid, zvardims, i, j + INTEGER, DIMENSION(2) :: zdims, zdimid, zorder, zcountvar + INTEGER, DIMENSION(NF_MAX_VAR_DIMS) :: zvardimids + REAL(dp), POINTER :: zin(:,:) + +! define dimension length vector + zdims(1) = SIZE (varptr, DIM = 1) + zdims(2) = SIZE (varptr, DIM = 2) +! open netCDF file + CALL nf_check(nf__open(TRIM(file_name), nf_nowrite, chunksize, zncid), fname=TRIM(file_name)) +! verify lenghts of dimensions + CALL nf_check(nf_inq_dimid(zncid, TRIM(dimname1), zdimid(1)), fname=TRIM(file_name)) + CALL nf_check(nf_inq_dimlen(zncid, zdimid(1), zdimlength), fname=TRIM(file_name)) + IF (zdimlength /= zdims(1)) THEN + CALL finish('read_var_nf77_2d:', 'wrong length of dim1 in initial file '//TRIM(file_name)) + END IF + CALL nf_check(nf_inq_dimid(zncid, TRIM(dimname2), zdimid(2)), fname=TRIM(file_name)) + CALL nf_check(nf_inq_dimlen(zncid, zdimid(2), zdimlength), fname=TRIM(file_name)) + IF (zdimlength /= zdims(2)) THEN + CALL finish('read_var_nf77_2d:', 'wrong length of dim2 in initial file '//TRIM(file_name)) + END IF + ierr=nf_inq_varid(zncid, TRIM(var_name), zvarid) + IF (ierr == 0) THEN + CALL nf_check(nf_inq_varndims(zncid, zvarid, zvardims), fname=TRIM(file_name)) + CALL nf_check(nf_inq_vardimid(zncid, zvarid, zvardimids), fname=TRIM(file_name)) + IF (zvardims /= 2) THEN + CALL finish('read_var_nf77_2d:', & + 'wrong number of dimension of variable '//TRIM(var_name)) + END IF + DO i = 1, zvardims + DO j = 1, zvardims + IF (zvardimids(j) == zdimid(i)) THEN + zorder(i)=j + EXIT + END IF + END DO + END DO + ALLOCATE(zin(zdims(zorder(1)), zdims(zorder(2)))) + zcountvar(1)=zdims(zorder(1)) + zcountvar(2)=zdims(zorder(2)) + CALL nf_check(nf_get_vara_double(zncid, zvarid, (/1,1/), zcountvar, zin), fname=TRIM(file_name)) + CALL nf_check(nf_close(zncid), fname=TRIM(file_name)) + IF (ALL(zorder == (/ 1, 2 /))) THEN + varptr = zin + ELSE + varptr = RESHAPE(zin, zdims, order=zorder) + ENDIF + IF (ASSOCIATED(zin)) DEALLOCATE(zin) + ELSE + CALL finish('read_var_nf77_2d:', & + 'variable '//TRIM(var_name)//' not found in '//TRIM(file_name)) + END IF + END SUBROUTINE read_var_nf77_2d +!=============================================================================== +!=============================================================================== + SUBROUTINE read_var_nf77_3d (file_name, dimname1, dimname2, dimname3, var_name, varptr, ierr) + + ! Description: + ! + ! read in a variable from a netCDF file + ! + ! Method: + ! + ! Open the netCDF file named file_name and read in varptr the values of var_name + ! dimname1,...,dimname3 are the names of the dimension in the order as they will + ! be in varptr. The order of the dimensions in the netCDF file is irrelevant. + ! The routine is to be intended to run on the I/O-processor + ! + ! Parameter list: + ! + ! CHARACTER (LEN = *), INTENT (in) :: file_name ! file name of the netCDF file + ! from which variable should be read + ! CHARACTER (LEN = *), INTENT (in) :: dimname1 ! name of dimension in the netCDF + ! file which shall appear as the first dimension of varptr. var_name can + ! have this dimension at any of the three possible positions + ! CHARACTER (LEN = *), INTENT (in) :: dimname2 ! name of dimension in the netCDF + ! file which shall appear as the second dimension of varptr. var_name can + ! have this dimension at any of the three possible positions + ! CHARACTER (LEN = *), INTENT (in) :: dimname3 ! name of dimension in the netCDF + ! file which shall appear as the third dimension of varptr. var_name can + ! have this dimension at any of the three possible positions + ! CHARACTER (LEN = *), INTENT (in) :: var_name ! name of the variable to be read + ! REAL(dp), INTENT(out) :: varptr(:,:,:) ! variable values on exit, has to + ! dimension exactly as the lengths of dimname1,...,dimname3 in netCDF file + ! INTEGER, INTENT(out) :: ierr ! ierr is 0 if variable var_name is successfully + ! read, 1 if it was not found in file file_name + ! + ! Authors: + ! + ! J.S. Rast, MPI, December 2002, original source + ! + ! Arguments: + ! + CHARACTER (LEN = *), INTENT (in) :: file_name + CHARACTER (LEN = *), INTENT (in) :: dimname1 + CHARACTER (LEN = *), INTENT (in) :: dimname2 + CHARACTER (LEN = *), INTENT (in) :: dimname3 + CHARACTER (LEN = *), INTENT (in) :: var_name + REAL(dp), INTENT(out) :: varptr(:,:,:) + INTEGER, INTENT (out) :: ierr + ! + ! Local variables: + ! + INTEGER :: zncid, zdimlength, zvarid, zvardims, i, j + INTEGER, DIMENSION(3) :: zdims, zdimid, zorder, zcountvar + INTEGER, DIMENSION(NF_MAX_VAR_DIMS) :: zvardimids + REAL(dp), POINTER :: zin(:,:,:) + +! define dimension length vector + zdims(1) = SIZE (varptr, DIM = 1) + zdims(2) = SIZE (varptr, DIM = 2) + zdims(3) = SIZE (varptr, DIM = 3) +! open netCDF file + CALL nf_check(nf__open(TRIM(file_name), nf_nowrite, chunksize, zncid), fname=TRIM(file_name)) +! verify lenghts of dimensions + CALL nf_check(nf_inq_dimid(zncid, TRIM(dimname1), zdimid(1)), fname=TRIM(file_name)) + CALL nf_check(nf_inq_dimlen(zncid, zdimid(1), zdimlength), fname=TRIM(file_name)) + IF (zdimlength /= zdims(1)) THEN + CALL finish('rad_var_nf77_3d:', 'wrong length of dim1 in initial file '//TRIM(file_name)) + END IF + CALL nf_check(nf_inq_dimid(zncid, TRIM(dimname2), zdimid(2)), fname=TRIM(file_name)) + CALL nf_check(nf_inq_dimlen(zncid, zdimid(2), zdimlength), fname=TRIM(file_name)) + IF (zdimlength /= zdims(2)) THEN + CALL finish('rad_var_nf77_3d:', 'wrong length of dim2 in initial file '//TRIM(file_name)) + END IF + CALL nf_check(nf_inq_dimid(zncid, TRIM(dimname3), zdimid(3)), fname=TRIM(file_name)) + CALL nf_check(nf_inq_dimlen(zncid, zdimid(3), zdimlength), fname=TRIM(file_name)) + IF (zdimlength /= zdims(3)) THEN + CALL finish('rad_var_nf77_3d:', 'wrong length of dim3 in initial file '//TRIM(file_name)) + END IF + ierr=nf_inq_varid(zncid, TRIM(var_name), zvarid) + IF (ierr == 0) THEN + CALL nf_check(nf_inq_varndims(zncid, zvarid, zvardims), fname=TRIM(file_name)) + CALL nf_check(nf_inq_vardimid(zncid, zvarid, zvardimids), fname=TRIM(file_name)) + IF (zvardims /= 3) THEN + CALL finish('rad_var_nf77_3d:', & + 'wrong number of dimension of variable '//TRIM(var_name)) + END IF + DO i = 1, zvardims + DO j = 1, zvardims + IF (zvardimids(j) == zdimid(i)) THEN + zorder(i)=j + EXIT + END IF + END DO + END DO + ALLOCATE(zin(zdims(zorder(1)), zdims(zorder(2)), zdims(zorder(3)))) + zcountvar(1)=zdims(zorder(1)) + zcountvar(2)=zdims(zorder(2)) + zcountvar(3)=zdims(zorder(3)) + CALL nf_check(nf_get_vara_double(zncid, zvarid, (/1,1,1/), zcountvar, zin), fname=TRIM(file_name)) + CALL nf_check(nf_close(zncid), fname=TRIM(file_name)) + IF (ALL(zorder == (/ 1, 2, 3 /))) THEN + varptr = zin + ELSE + varptr = RESHAPE(zin, zdims, order=zorder) + ENDIF + IF (ASSOCIATED(zin)) DEALLOCATE(zin) + ELSE + CALL finish('read_var_nf77_3d:', & + 'variable '//TRIM(var_name)//' not found in '//TRIM(file_name)) + END IF + END SUBROUTINE read_var_nf77_3d +!=============================================================================== +!=============================================================================== + SUBROUTINE read_var_nf77_4d (file_name, dimname1, dimname2, dimname3, dimname4, & + var_name, varptr, ierr) + + ! Description: + ! + ! read in a variable from a netCDF file + ! + ! Method: + ! + ! Open the netCDF file named file_name and read in varptr the values of var_name + ! dimname1,...,dimname4 are the names of the dimension in the order as they will + ! be in varptr. The order of the dimensions in the netCDF file is irrelevant. + ! The routine is to be intended to run on the I/O-processor + ! + ! Parameter list: + ! + ! CHARACTER (LEN = *), INTENT (in) :: file_name ! file name of the netCDF file + ! from which variable should be read + ! CHARACTER (LEN = *), INTENT (in) :: dimname1 ! name of dimension in the netCDF + ! file which shall appear as the first dimension of varptr. var_name can + ! have this dimension at any of the three possible positions + ! CHARACTER (LEN = *), INTENT (in) :: dimname2 ! name of dimension in the netCDF + ! file which shall appear as the second dimension of varptr. var_name can + ! have this dimension at any of the three possible positions + ! CHARACTER (LEN = *), INTENT (in) :: dimname3 ! name of dimension in the netCDF + ! file which shall appear as the third dimension of varptr. var_name can + ! have this dimension at any of the three possible positions + ! CHARACTER (LEN = *), INTENT (in) :: dimname4 ! name of dimension in the netCDF + ! file which shall appear as the fourth dimension of varptr. var_name can + ! have this dimension at any of the three possible positions + ! CHARACTER (LEN = *), INTENT (in) :: var_name ! name of the variable to be read + ! REAL(dp), INTENT(out) :: varptr(:,:,:,:) ! variable values on exit, has to + ! dimension exactly as the lengths of dimname1,...,dimname4 in netCDF file + ! INTEGER, INTENT(out) :: ierr ! ierr is 0 if variable var_name is successfully + ! read, 1 if it was not found in file file_name + ! + ! Authors: + ! + ! D. O'Donnell, MPI-M, Feb 2008, based on other read_var_... subroutines by J.S.Rast + ! + ! + ! Arguments: + ! + + CHARACTER (LEN = *), INTENT (in) :: file_name + CHARACTER (LEN = *), INTENT (in) :: dimname1 + CHARACTER (LEN = *), INTENT (in) :: dimname2 + CHARACTER (LEN = *), INTENT (in) :: dimname3 + CHARACTER (LEN = *), INTENT (in) :: dimname4 + CHARACTER (LEN = *), INTENT (in) :: var_name + REAL(dp), INTENT(out) :: varptr(:,:,:,:) + INTEGER, INTENT (out) :: ierr + ! + ! Local variables: + ! + INTEGER :: zncid, zdimlength, zvarid, zvardims, i, j + INTEGER, DIMENSION(4) :: zdims, zdimid, zorder, zcountvar + INTEGER, DIMENSION(NF_MAX_VAR_DIMS) :: zvardimids + REAL(dp), POINTER :: zin(:,:,:,:) + +! define dimension length vector + zdims(1) = SIZE (varptr, DIM = 1) + zdims(2) = SIZE (varptr, DIM = 2) + zdims(3) = SIZE (varptr, DIM = 3) + zdims(4) = SIZE (varptr, DIM = 4) +! open netCDF file + CALL nf_check(nf__open(TRIM(file_name), nf_nowrite, chunksize, zncid), fname=TRIM(file_name)) +! verify lenghts of dimensions + CALL nf_check(nf_inq_dimid(zncid, TRIM(dimname1), zdimid(1)), fname=TRIM(file_name)) + CALL nf_check(nf_inq_dimlen(zncid, zdimid(1), zdimlength), fname=TRIM(file_name)) + IF (zdimlength /= zdims(1)) THEN + CALL finish('read_var_nf77_4d:', 'wrong length of dim1 in initial file '//TRIM(file_name)) + END IF + CALL nf_check(nf_inq_dimid(zncid, TRIM(dimname2), zdimid(2)), fname=TRIM(file_name)) + CALL nf_check(nf_inq_dimlen(zncid, zdimid(2), zdimlength), fname=TRIM(file_name)) + IF (zdimlength /= zdims(2)) THEN + CALL finish('read_var_nf77_4d:', 'wrong length of dim2 in initial file '//TRIM(file_name)) + END IF + CALL nf_check(nf_inq_dimid(zncid, TRIM(dimname3), zdimid(3)), fname=TRIM(file_name)) + CALL nf_check(nf_inq_dimlen(zncid, zdimid(3), zdimlength), fname=TRIM(file_name)) + IF (zdimlength /= zdims(3)) THEN + CALL finish('read_var_nf77_4d:', 'wrong length of dim3 in initial file '//TRIM(file_name)) + END IF + CALL nf_check(nf_inq_dimid(zncid, TRIM(dimname4), zdimid(4)), fname=TRIM(file_name)) + CALL nf_check(nf_inq_dimlen(zncid, zdimid(4), zdimlength), fname=TRIM(file_name)) + IF (zdimlength /= zdims(4)) THEN + CALL finish('read_var_nf77_4d:', 'wrong length of dim4 in initial file '//TRIM(file_name)) + END IF + ierr=nf_inq_varid(zncid, TRIM(var_name), zvarid) + IF (ierr == 0) THEN + CALL nf_check(nf_inq_varndims(zncid, zvarid, zvardims), fname=TRIM(file_name)) + CALL nf_check(nf_inq_vardimid(zncid, zvarid, zvardimids), fname=TRIM(file_name)) + IF (zvardims /= 4) THEN + CALL finish('read_var_nf77_4d:', & + 'wrong number of dimension of variable '//TRIM(var_name)) + END IF + DO i = 1, zvardims + DO j = 1, zvardims + IF (zvardimids(j) == zdimid(i)) THEN + zorder(i)=j + EXIT + END IF + END DO + END DO + ALLOCATE(zin(zdims(zorder(1)), zdims(zorder(2)), zdims(zorder(3)), zdims(zorder(4)) )) + zcountvar(1)=zdims(zorder(1)) + zcountvar(2)=zdims(zorder(2)) + zcountvar(3)=zdims(zorder(3)) + zcountvar(4)=zdims(zorder(4)) + CALL nf_check(nf_get_vara_double(zncid, zvarid, (/1,1,1,1/), zcountvar, zin), fname=TRIM(file_name)) + CALL nf_check(nf_close(zncid), fname=TRIM(file_name)) + IF (ALL(zorder == (/ 1, 2, 3, 4 /))) THEN + varptr = zin + ELSE + varptr = RESHAPE(zin, zdims, order=zorder) + ENDIF + IF (ASSOCIATED(zin)) DEALLOCATE(zin) + ELSE + CALL finish('read_var_nf77_4d:', & + 'variable '//TRIM(var_name)//' not found in '//TRIM(file_name)) + END IF + END SUBROUTINE read_var_nf77_4d +!=============================================================================== +!=============================================================================== + SUBROUTINE read_sumvar_nf77_2d (file_name, dimname1, dimname2, dimname3, imonth, varptr, ierr) + + ! Description: + ! + ! read in from a netCDF file the sum of all variables containing dimname1 + ! and dimname2 and a time dimension of size 12 + ! + ! Method: + ! + ! Open the netCDF file named file_name and read in varptr the sum of the + ! values of all variables containing the dimensions dimname1, dimname2 + ! which are the names of the dimensions in the order + ! as they will be in varptr. The order of the dimensions in the netCDF file is + ! irrelevant. + ! The routine is to be intended to run on the I/O-processor + ! + ! Parameter list: + ! + ! CHARACTER (LEN = *), INTENT (in) :: file_name ! file name of the netCDF file + ! from which variable should be read + ! CHARACTER (LEN = *), INTENT (in) :: dimname1 ! name of dimension in the netCDF + ! file which shall appear as the first dimension of varptr. var_name can + ! have this dimension at any of the three possible positions + ! CHARACTER (LEN = *), INTENT (in) :: dimname2 ! name of dimension in the netCDF + ! file which shall appear as the second dimension of varptr. var_name can + ! have this dimension at any of the three possible positions + ! CHARACTER (LEN = *), INTENT (in) :: dimname3 ! name of the time dimension + ! currently, there must be 12 values for the 12 months + ! INTEGER, INTENT (in) :: imonth ! number of month in the + ! year (range 1..12) + ! REAL(dp), INTENT(out) :: varptr(:,:) ! variable values on exit, has to + ! dimension exactly as the lengths of dimname1,dimname2 in netCDF file + ! INTEGER, INTENT(out) :: ierr ! ierr is 0 if variable var_name is successfully + ! read, 1 otherwise + ! + ! Authors: + ! + ! J.S. Rast, MPI, January 2003, original source + ! + ! Arguments: + ! + CHARACTER (LEN = *), INTENT (in) :: file_name + CHARACTER (LEN = *), INTENT (in) :: dimname1 + CHARACTER (LEN = *), INTENT (in) :: dimname2 + CHARACTER (LEN = *), INTENT (in) :: dimname3 + INTEGER, INTENT(in) :: imonth + REAL(dp), INTENT(out) :: varptr(:,:) + INTEGER, INTENT (out) :: ierr + ! + ! Local variables: + ! + INTEGER :: zncid, znvar, zdimlength, zvardims, i, j, ivar + INTEGER, DIMENSION(3) :: zdims, zdimid, zvardimids, zorder, zstart, zcount, & + zstartvar, zcountvar + LOGICAL, DIMENSION(3) :: zorderlog + REAL(dp), POINTER :: zin(:,:,:) +!,zinre(:,:,:) + character (len = 256) :: zvarname + +! define dimension length vector + zdims(1) = SIZE (varptr, DIM = 1) + zdims(2) = SIZE (varptr, DIM = 2) + zdims(3) = 1 ! the dimension length is 12, but we only read one month +! define start vector of dimensions and number of indices in each dimension to be read + zstart(1) = 1 + zstart(2) = 1 + zstart(3) = imonth + zcount(1) = zdims(1) + zcount(2) = zdims(2) + zcount(3) = 1 +! open netCDF file + CALL nf_check(nf__open(TRIM(file_name), nf_nowrite, chunksize, zncid),fname=TRIM(file_name)) +! verify lenghts of dimensions + CALL nf_check(nf_inq_dimid(zncid, TRIM(dimname1), zdimid(1)),fname=TRIM(file_name)) + CALL nf_check(nf_inq_dimlen(zncid, zdimid(1), zdimlength),fname=TRIM(file_name)) + IF (zdimlength /= zdims(1)) THEN + CALL finish('read_sumvar_nf77_2d:', 'wrong length of dim1 in initial file '//TRIM(file_name)) + END IF + CALL nf_check(nf_inq_dimid(zncid, TRIM(dimname2), zdimid(2)),fname=TRIM(file_name)) + CALL nf_check(nf_inq_dimlen(zncid, zdimid(2), zdimlength),fname=TRIM(file_name)) + IF (zdimlength /= zdims(2)) THEN + CALL finish('read_sumvar_nf77_2d:', 'wrong length of dim2 in initial file '//TRIM(file_name)) + END IF + CALL nf_check(nf_inq_dimid(zncid, TRIM(dimname3), zdimid(3)),fname=TRIM(file_name)) + CALL nf_check(nf_inq_dimlen(zncid, zdimid(3), zdimlength),fname=TRIM(file_name)) + IF (zdimlength /= 12) THEN + CALL finish('read_sumvar_nf77_2d:', 'wrong length of dim3 in initial file '//TRIM(file_name)) + END IF +! determine number of variables in netCDF file + CALL nf_check(nf_inq_nvars(zncid, znvar),fname=TRIM(file_name)) + IF (znvar == 0) THEN + ierr=1 + RETURN + END IF + varptr = 0._dp + DO ivar=1,znvar + CALL nf_check(nf_inq_varndims(zncid,ivar,zvardims),fname=TRIM(file_name)) + CALL nf_check(nf_inq_varname(zncid,ivar,zvarname),fname=TRIM(file_name)) + IF (zvardims == 3) THEN + CALL nf_check(nf_inq_vardimid(zncid,ivar,zvardimids),fname=TRIM(file_name)) + zorderlog(:)=.false. + DO i = 1, zvardims + DO j = 1, zvardims + IF (zvardimids(j) == zdimid(i)) THEN + zorder(i)=j + zorderlog(i)=.true. + EXIT + END IF + END DO + END DO + IF ( ANY (zorderlog .eqv. .false. )) THEN + CALL finish ('read_sumvar_nf77_2d:','dimensions of variable '//TRIM(zvarname)//' of file '// & + TRIM(file_name)//' unknown') + END IF + ALLOCATE(zin(zdims(zorder(1)), zdims(zorder(2)), zdims(zorder(3)))) +! ALLOCATE(zinre(zdims(1),zdims(2),zdims(3))) + zstartvar(1)=zstart(zorder(1)) + zstartvar(2)=zstart(zorder(2)) + zstartvar(3)=zstart(zorder(3)) + zcountvar(1)=zcount(zorder(1)) + zcountvar(2)=zcount(zorder(2)) + zcountvar(3)=zcount(zorder(3)) + CALL nf_check(nf_get_vara_double(zncid, ivar, zstartvar, zcountvar, zin),fname=TRIM(file_name)) +! zinre=RESHAPE(zin, zdims, order=zorder) + varptr = varptr + RESHAPE(RESHAPE(zin, zdims, order=zorder),zdims(1:2)) + IF (ASSOCIATED(zin)) DEALLOCATE(zin) + END IF + END DO + CALL nf_check(nf_close(zncid),fname=TRIM(file_name)) + END SUBROUTINE read_sumvar_nf77_2d +!=============================================================================== +!=============================================================================== + SUBROUTINE read_var_hs_nf77_0d (file_name, dimname, & + idx, varname, varptr, ierr) + + ! Description: + ! + ! read in from a netCDF file variable varname. + ! dimname2 has to be the unlimited time dimension of arbitrary length. + ! The hyperslab dimname2(idx) will be read. + ! + ! Method: + ! + ! Open the netCDF file named file_name and read in varptr varname. + ! The routine is intended to be run on the I/O-processor + ! + ! Parameter list: + ! + ! CHARACTER (LEN = *), INTENT (in) :: file_name ! file name of the netCDF file + ! from which variable should be read + ! CHARACTER (LEN = *), INTENT (in) :: dimname ! name of the unlimited (time) dimension + ! can have an arbitrary length, but idx <= length of this dimension constrained + ! INTEGER, INTENT (in) :: idx ! index number of unlimited (time) + ! dimension2 (<= length of unlimited (time) dimension) + ! CHARACTER (LEN = *), INTENT (in) :: varname ! name of variable to be read + ! REAL(dp), INTENT(out) :: varptr ! variable value on exit + ! INTEGER, INTENT(out) :: ierr ! ierr is 0 if variable varname is successfully + ! read, 1 otherwise + ! + ! Authors: + ! + ! J.S. Rast, MPI, March 2010, original source + ! + ! Arguments: + ! + CHARACTER (LEN = *), INTENT (in) :: file_name + CHARACTER (LEN = *), INTENT (in) :: dimname + INTEGER, INTENT(in) :: idx + CHARACTER (LEN = *), INTENT (in) :: varname + REAL(dp), INTENT(out) :: varptr + INTEGER, INTENT (out) :: ierr + ! + ! Local variables: + ! + INTEGER :: zncid, znvar, zdimlength, zvardims + INTEGER :: zdimid + INTEGER, DIMENSION(1) :: zstart, zcount, zvardimid + REAL(dp), POINTER :: zin(:) + + character (len = 256) :: zerrstrg + +! define dimension length vector +! zdims(1) = SIZE (varptr, DIM = 1) +! zdims(2) = 1 ! the dimension length is arbitrary, but we only read one +! month define start vector of dimensions and number of indices in each +! dimension to be read + zstart(1) = idx + zcount(1) = 1 +! open netCDF file + CALL nf_check(nf__open(TRIM(file_name), nf_nowrite, chunksize, zncid),fname=TRIM(file_name)) +! verify lenght of time dimension + CALL nf_check(nf_inq_dimid(zncid, TRIM(dimname), zdimid),fname=TRIM(file_name)) + CALL nf_check(nf_inq_dimlen(zncid, zdimid, zdimlength),fname=TRIM(file_name)) + IF (zdimlength < idx) THEN + WRITE (zerrstrg,*) idx + CALL finish('read_var_hs_nf77_0d:', 'actual length of unlimited dimension is less than index ' & + //TRIM(zerrstrg)) + END IF +! inquire variable and number of dimension including the unlimited (time) dimension + ierr=nf_inq_varid(zncid, TRIM(varname), znvar) + IF (ierr == 0) THEN + CALL nf_check(nf_inq_varndims(zncid, znvar, zvardims),fname=TRIM(file_name)) + CALL nf_check(nf_inq_vardimid(zncid, znvar, zvardimid),fname=TRIM(file_name)) + IF (zvardims /= 1) THEN + CALL finish('read_var_hs_nf77_0d:', & + 'wrong number of dimension of variable '//TRIM(varname)) + END IF + ALLOCATE(zin(1)) + CALL nf_check(nf_get_vara_double(zncid, znvar, zstart, zcount, zin),fname=TRIM(file_name)) + varptr = zin(1) + IF (ASSOCIATED(zin)) DEALLOCATE(zin) + ELSE + CALL finish('read_var_hs_nf77_1d:', & + 'variable '//TRIM(varname)//' not found in '//TRIM(file_name)) + END IF + CALL nf_check(nf_close(zncid),fname=TRIM(file_name)) + END SUBROUTINE read_var_hs_nf77_0d +!=============================================================================== +!=============================================================================== + SUBROUTINE read_var_hs_nf77_1d (file_name, dimname1, dimname2, & + idx, varname, varptr, ierr) + + ! Description: + ! + ! read in from a netCDF file variable varname(dimname1). + ! dimname2 has to be the unlimited time dimension of arbitrary length. + ! The hyperslab dimname2(idx) will be read. + ! + ! Method: + ! + ! Open the netCDF file named file_name and read in varptr varname(dimname1). + ! The routine is intended to be run on the I/O-processor + ! + ! Parameter list: + ! + ! CHARACTER (LEN = *), INTENT (in) :: file_name ! file name of the netCDF file + ! from which variable should be read + ! CHARACTER (LEN = *), INTENT (in) :: dimname1 ! name of dimension in the netCDF + ! file which shall appear as the first dimension of varptr. varname can + ! have this dimension at any of the four possible positions + ! CHARACTER (LEN = *), INTENT (in) :: dimname2 ! name of the unlimited (time) dimension + ! can have an arbitrary length, but idx <= length of this dimension constrained + ! INTEGER, INTENT (in) :: idx ! index number of unlimited (time) + ! dimension2 (<= length of unlimited (time) dimension) + ! CHARACTER (LEN = *), INTENT (in) :: varname ! name of variable to be read + ! REAL(dp), INTENT(out) :: varptr(:) ! variable values on exit, has to have + ! dimension exactly as the lengths of dimname1 in netCDF file + ! INTEGER, INTENT(out) :: ierr ! ierr is 0 if variable varname is successfully + ! read, 1 otherwise + ! + ! Authors: + ! + ! J.S. Rast, MPI, August 2004, original source + ! + ! Arguments: + ! + CHARACTER (LEN = *), INTENT (in) :: file_name + CHARACTER (LEN = *), INTENT (in) :: dimname1 + CHARACTER (LEN = *), INTENT (in) :: dimname2 + INTEGER, INTENT(in) :: idx + CHARACTER (LEN = *), INTENT (in) :: varname + REAL(dp), INTENT(out) :: varptr(:) + INTEGER, INTENT (out) :: ierr + ! + ! Local variables: + ! + INTEGER :: zncid, znvar, zdimlength, zvardims + INTEGER, DIMENSION(2) :: zdims, zdimid, zvardimids, & + zstart, zcount + REAL(dp), POINTER :: zin(:,:) + + character (len = 256) :: zerrstrg + +! define dimension length vector + zdims(1) = SIZE (varptr, DIM = 1) + zdims(2) = 1 ! the dimension length is arbitrary, but we only read one +! month define start vector of dimensions and number of indices in each +! dimension to be read + zstart(1) = 1 + zstart(2) = idx + zcount(1) = zdims(1) + zcount(2) = 1 +! open netCDF file + CALL nf_check(nf__open(TRIM(file_name), nf_nowrite, chunksize, zncid),fname=TRIM(file_name)) +! verify lenghts of dimensions + CALL nf_check(nf_inq_dimid(zncid, TRIM(dimname1), zdimid(1)),fname=TRIM(file_name)) + CALL nf_check(nf_inq_dimlen(zncid, zdimid(1), zdimlength),fname=TRIM(file_name)) + IF (zdimlength /= zdims(1)) THEN + CALL finish('read_var_hs_nf77_1d:', 'wrong length of dim1 in file '//TRIM(file_name)) + END IF + CALL nf_check(nf_inq_dimid(zncid, TRIM(dimname2), zdimid(2)),fname=TRIM(file_name)) + CALL nf_check(nf_inq_dimlen(zncid, zdimid(2), zdimlength),fname=TRIM(file_name)) + IF (zdimlength < idx) THEN + WRITE (zerrstrg,*) idx + CALL finish('read_var_hs_nf77_1d:', 'actual length of unlimited dimension is less than index ' & + //TRIM(zerrstrg)) + END IF +! inquire variable and number of dimension including the unlimited (time) dimension + ierr=nf_inq_varid(zncid, TRIM(varname), znvar) + IF (ierr == 0) THEN + CALL nf_check(nf_inq_varndims(zncid, znvar, zvardims),fname=TRIM(file_name)) + CALL nf_check(nf_inq_vardimid(zncid, znvar, zvardimids),fname=TRIM(file_name)) + IF (zvardims /= 2) THEN + CALL finish('read_var_hs_nf77_1d:', & + 'wrong number of dimension of variable '//TRIM(varname)) + END IF + ALLOCATE(zin(zdims(1), zdims(2))) + CALL nf_check(nf_get_vara_double(zncid, znvar, zstart, zcount, zin),fname=TRIM(file_name)) + varptr = zin(:,1) + IF (ASSOCIATED(zin)) DEALLOCATE(zin) + ELSE + CALL finish('read_var_hs_nf77_1d:', & + 'variable '//TRIM(varname)//' not found in '//TRIM(file_name)) + END IF + CALL nf_check(nf_close(zncid),fname=TRIM(file_name)) + END SUBROUTINE read_var_hs_nf77_1d +!=============================================================================== +!=============================================================================== + SUBROUTINE read_var_hs_nf77_2d (file_name, dimname1, dimname2, dimname3, idx, varname, varptr, ierr) + + ! Description: + ! + ! read in from a netCDF file variable varname(dimname1, dimname2). + ! dimname3 has to be the unlimited time dimension of arbitrary length. + ! The hyperslab dimname3(idx) will be read. + ! + ! Method: + ! + ! Open the netCDF file named file_name and read in varptr varname(dimname1, dimname2). + ! The order of the dimensions in the netCDF file is irrelevant. + ! The routine is to be intended to run on the I/O-processor + ! + ! Parameter list: + ! + ! CHARACTER (LEN = *), INTENT (in) :: file_name ! file name of the netCDF file + ! from which variable should be read + ! CHARACTER (LEN = *), INTENT (in) :: dimname1 ! name of dimension in the netCDF + ! file which shall appear as the first dimension of varptr. varname can + ! have this dimension at any of the three possible positions + ! CHARACTER (LEN = *), INTENT (in) :: dimname2 ! name of dimension in the netCDF + ! file which shall appear as the second dimension of varptr. varname can + ! have this dimension at any of the three possible positions + ! CHARACTER (LEN = *), INTENT (in) :: dimname3 ! name of the unlimited (time) dimension + ! can have an arbitrary length, but idx <= length of this dimension constrained + ! INTEGER, INTENT (in) :: idx ! index number of unlimited (time) + ! dimension3 + ! CHARACTER (LEN = *), INTENT (in) :: varname ! name of variable to be read + ! REAL(dp), INTENT(out) :: varptr(:,:) ! variable values on exit, has to + ! dimension exactly as the lengths of dimname1,dimname2 in netCDF file + ! INTEGER, INTENT(out) :: ierr ! ierr is 0 if variable varname is successfully + ! read, 1 otherwise + ! + ! Authors: + ! + ! J.S. Rast, MPI, January 2003, original source + ! + ! Arguments: + ! + CHARACTER (LEN = *), INTENT (in) :: file_name + CHARACTER (LEN = *), INTENT (in) :: dimname1 + CHARACTER (LEN = *), INTENT (in) :: dimname2 + CHARACTER (LEN = *), INTENT (in) :: dimname3 + INTEGER, INTENT(in) :: idx + CHARACTER (LEN = *), INTENT (in) :: varname + REAL(dp), INTENT(out) :: varptr(:,:) + INTEGER, INTENT (out) :: ierr + ! + ! Local variables: + ! + INTEGER :: zncid, znvar, zdimlength, zvardims, i, j + INTEGER, DIMENSION(3) :: zdims, zdimid, zvardimids, zorder, zstart, zcount, & + zstartvar, zcountvar + REAL(dp), POINTER :: zin(:,:,:) +!,zinre(:,:,:) + character (len = 256) :: zerrstrg + +! define dimension length vector + zdims(1) = SIZE (varptr, DIM = 1) + zdims(2) = SIZE (varptr, DIM = 2) + zdims(3) = 1 ! the dimension length normally is arbitrary, but we only read one month +! define start vector of dimensions and number of indices in each dimension to be read + zstart(1) = 1 + zstart(2) = 1 + zstart(3) = idx + zcount(1) = zdims(1) + zcount(2) = zdims(2) + zcount(3) = 1 +! open netCDF file + CALL nf_check(nf__open(TRIM(file_name), nf_nowrite, chunksize, zncid), fname=TRIM(file_name)) +! verify lenghts of dimensions + CALL nf_check(nf_inq_dimid(zncid, TRIM(dimname1), zdimid(1)), fname=TRIM(file_name)) + CALL nf_check(nf_inq_dimlen(zncid, zdimid(1), zdimlength), fname=TRIM(file_name)) + IF (zdimlength /= zdims(1)) THEN + CALL finish('read_var_hs_nf77_2d:', 'wrong length of dim1 in initial file '//TRIM(file_name)) + END IF + CALL nf_check(nf_inq_dimid(zncid, TRIM(dimname2), zdimid(2)), fname=TRIM(file_name)) + CALL nf_check(nf_inq_dimlen(zncid, zdimid(2), zdimlength), fname=TRIM(file_name)) + IF (zdimlength /= zdims(2)) THEN + CALL finish('read_var_hs_nf77_2d:', 'wrong length of dim2 in initial file '//TRIM(file_name)) + END IF + CALL nf_check(nf_inq_dimid(zncid, TRIM(dimname3), zdimid(3)), fname=TRIM(file_name)) + CALL nf_check(nf_inq_dimlen(zncid, zdimid(3), zdimlength), fname=TRIM(file_name)) + IF (zdimlength < idx) THEN + WRITE (zerrstrg,*) idx + CALL finish('read_var_hs_nf77_2d:', 'actual length of unlimited dimension is less than index ' & + //TRIM(zerrstrg)) + END IF +! inquire variable and number of dimension including the unlimited (time) dimension + ierr=nf_inq_varid(zncid, TRIM(varname), znvar) + IF (ierr == 0) THEN + CALL nf_check(nf_inq_varndims(zncid, znvar, zvardims), fname=TRIM(file_name)) + CALL nf_check(nf_inq_vardimid(zncid, znvar, zvardimids),fname=TRIM(file_name)) + IF (zvardims /= 3) THEN + CALL finish('read_var_hs_nf77_2d:', & + 'wrong number of dimension of variable '//TRIM(varname)) + END IF + DO i = 1, zvardims + DO j = 1, zvardims + IF (zvardimids(j) == zdimid(i)) THEN + zorder(i)=j + EXIT + END IF + END DO + END DO + ALLOCATE(zin(zdims(zorder(1)), zdims(zorder(2)), zdims(zorder(3)))) + zstartvar(1)=zstart(zorder(1)) + zstartvar(2)=zstart(zorder(2)) + zstartvar(3)=zstart(zorder(3)) + zcountvar(1)=zcount(zorder(1)) + zcountvar(2)=zcount(zorder(2)) + zcountvar(3)=zcount(zorder(3)) + CALL nf_check(nf_get_vara_double(zncid, znvar, zstartvar, zcountvar, zin), fname=TRIM(file_name)) + varptr = RESHAPE(RESHAPE(zin, zdims, order=zorder),zdims(1:2)) + IF (ASSOCIATED(zin)) DEALLOCATE(zin) + ELSE + CALL finish('read_var_hs_nf77_2d:', & + 'variable '//TRIM(varname)//' not found in '//TRIM(file_name)) + END IF + CALL nf_check(nf_close(zncid),fname=TRIM(file_name)) + END SUBROUTINE read_var_hs_nf77_2d +!=============================================================================== +!=============================================================================== + SUBROUTINE read_var_hs_nf77_3d (file_name, dimname1, dimname2, dimname3, dimname4, & + idx, varname, varptr, ierr) + + ! Description: + ! + ! read in from a netCDF file variable varname(dimname1, dimname2, dimname3). + ! dimname4 has to be the unlimited time dimension of arbitrary length. + ! The hyperslab dimname4(idx) will be read. + ! + ! Method: + ! + ! Open the netCDF file named file_name and read in varptr varname(dimname1, dimname2, dimname3). + ! The order of the dimensions in the netCDF file is irrelevant. + ! The routine is to be intended to run on the I/O-processor + ! + ! Parameter list: + ! + ! CHARACTER (LEN = *), INTENT (in) :: file_name ! file name of the netCDF file + ! from which variable should be read + ! CHARACTER (LEN = *), INTENT (in) :: dimname1 ! name of dimension in the netCDF + ! file which shall appear as the first dimension of varptr. varname can + ! have this dimension at any of the four possible positions + ! CHARACTER (LEN = *), INTENT (in) :: dimname2 ! name of dimension in the netCDF + ! file which shall appear as the second dimension of varptr. varname can + ! have this dimension at any of the four possible positions + ! CHARACTER (LEN = *), INTENT (in) :: dimname3 ! name of dimension in the netCDF + ! file which shall appear as the third dimension of varptr. varname can + ! have this dimension at any of the four possible positions + ! CHARACTER (LEN = *), INTENT (in) :: dimname4 ! name of the unlimited (time) dimension + ! can have an arbitrary length, but idx <= length of this dimension constrained + ! INTEGER, INTENT (in) :: idx ! index number of unlimited (time) + ! dimension4 (<= length of unlimited (time) dimension) + ! CHARACTER (LEN = *), INTENT (in) :: varname ! name of variable to be read + ! REAL(dp), INTENT(out) :: varptr(:,:,:) ! variable values on exit, has to + ! dimension exactly as the lengths of dimname1,dimname2,dimname3 in netCDF file + ! INTEGER, INTENT(out) :: ierr ! ierr is 0 if variable varname is successfully + ! read, 1 otherwise + ! + ! Authors: + ! + ! J.S. Rast, MPI, January 2003, original source + ! + ! Arguments: + ! + CHARACTER (LEN = *), INTENT (in) :: file_name + CHARACTER (LEN = *), INTENT (in) :: dimname1 + CHARACTER (LEN = *), INTENT (in) :: dimname2 + CHARACTER (LEN = *), INTENT (in) :: dimname3 + CHARACTER (LEN = *), INTENT (in) :: dimname4 + INTEGER, INTENT(in) :: idx + CHARACTER (LEN = *), INTENT (in) :: varname + REAL(dp), INTENT(out) :: varptr(:,:,:) + INTEGER, INTENT (out) :: ierr + ! + ! Local variables: + ! + INTEGER :: zncid, znvar, zdimlength, zvardims, i, j + INTEGER, DIMENSION(4) :: zdims, zdimid, zvardimids, zorder, zstart, zcount, & + zstartvar, zcountvar + REAL(dp), POINTER :: zin(:,:,:,:) + + + character (len = 256) :: zerrstrg + +! define dimension length vector + zdims(1) = SIZE (varptr, DIM = 1) + zdims(2) = SIZE (varptr, DIM = 2) + zdims(3) = SIZE (varptr, DIM = 3) + zdims(4) = 1 ! the dimension length is arbitrary, but we only read one +! month define start vector of dimensions and number of indices in each +! dimension to be read + zstart(1) = 1 + zstart(2) = 1 + zstart(3) = 1 + + zstart(4) = idx + zcount(1) = zdims(1) + zcount(2) = zdims(2) + zcount(3) = zdims(3) + zcount(4) = 1 +! open netCDF file + CALL nf_check(nf__open(TRIM(file_name), nf_nowrite, chunksize, zncid),fname=TRIM(file_name)) +! verify lenghts of dimensions + CALL nf_check(nf_inq_dimid(zncid, TRIM(dimname1), zdimid(1)),fname=TRIM(file_name)) + CALL nf_check(nf_inq_dimlen(zncid, zdimid(1), zdimlength),fname=TRIM(file_name)) + IF (zdimlength /= zdims(1)) THEN + CALL finish('read_var_hs_nf77_3d:', 'wrong length of dim1 in initial file '//TRIM(file_name)) + END IF + CALL nf_check(nf_inq_dimid(zncid, TRIM(dimname2), zdimid(2)),fname=TRIM(file_name)) + CALL nf_check(nf_inq_dimlen(zncid, zdimid(2), zdimlength),fname=TRIM(file_name)) + IF (zdimlength /= zdims(2)) THEN + CALL finish('read_var_hs_nf77_3d:', 'wrong length of dim2 in initial file '//TRIM(file_name)) + END IF + CALL nf_check(nf_inq_dimid(zncid, TRIM(dimname3), zdimid(3)),fname=TRIM(file_name)) + CALL nf_check(nf_inq_dimlen(zncid, zdimid(3), zdimlength),fname=TRIM(file_name)) + IF (zdimlength /= zdims(3)) THEN + CALL finish('read_var_hs_nf77_3d:', 'wrong length of dim3 in initial file '//TRIM(file_name)) + END IF + CALL nf_check(nf_inq_dimid(zncid, TRIM(dimname4), zdimid(4)),fname=TRIM(file_name)) + CALL nf_check(nf_inq_dimlen(zncid, zdimid(4), zdimlength),fname=TRIM(file_name)) + IF (zdimlength < idx) THEN + WRITE (zerrstrg,*) idx + CALL finish('read_var_hs_nf77_3d:', 'actual length of unlimited dimension is less than index ' & + //TRIM(zerrstrg)) + END IF +! inquire variable and number of dimension including the unlimited (time) dimension + ierr=nf_inq_varid(zncid, TRIM(varname), znvar) + IF (ierr == 0) THEN + CALL nf_check(nf_inq_varndims(zncid, znvar, zvardims),fname=TRIM(file_name)) + CALL nf_check(nf_inq_vardimid(zncid, znvar, zvardimids),fname=TRIM(file_name)) + IF (zvardims /= 4) THEN + CALL finish('read_var_hs_nf77_3d:', & + 'wrong number of dimension of variable '//TRIM(varname)) + END IF + DO i = 1, zvardims + DO j = 1, zvardims + IF (zvardimids(j) == zdimid(i)) THEN + zorder(i)=j + EXIT + END IF + END DO + END DO + ALLOCATE(zin(zdims(zorder(1)), zdims(zorder(2)), zdims(zorder(3)), zdims(zorder(4)))) + zstartvar(1)=zstart(zorder(1)) + zstartvar(2)=zstart(zorder(2)) + zstartvar(3)=zstart(zorder(3)) + zstartvar(4)=zstart(zorder(4)) + zcountvar(1)=zcount(zorder(1)) + zcountvar(2)=zcount(zorder(2)) + zcountvar(3)=zcount(zorder(3)) + zcountvar(4)=zcount(zorder(4)) + CALL nf_check(nf_get_vara_double(zncid, znvar, zstartvar, zcountvar, zin),fname=TRIM(file_name)) + varptr = RESHAPE(RESHAPE(zin, zdims, order=zorder),zdims(1:3)) + IF (ASSOCIATED(zin)) DEALLOCATE(zin) + ELSE + CALL finish('read_var_hs_nf77_3d:', & + 'variable '//TRIM(varname)//' not found in '//TRIM(file_name)) + END IF + CALL nf_check(nf_close(zncid),fname=TRIM(file_name)) + END SUBROUTINE read_var_hs_nf77_3d +!=============================================================================== +!============================================================================================= + LOGICAL FUNCTION search_var_nf77(file_name, varname) + + ! Description: + ! + ! search for the variable varname in file file_name + ! + ! LOGICAL :: search_var_nf77 ! if varname is in file_name, then + ! search_var_nf77=.true., else it is .false. + ! CHARACTER (LEN = *) :: file_name ! file name of the netCDF file + ! in which the variable varname should be searched + ! CHARACTER (LEN = *) :: varname ! name of variable you are searching + ! for + ! + ! Authors: + ! + ! J.S. Rast, MPI, July 2006, original source + ! + + CHARACTER (LEN = *) :: file_name + CHARACTER (LEN = *) :: varname + + ! local variables + INTEGER :: zncid, znvar, ierr + + search_var_nf77=.false. +! open netCDF file + CALL nf_check(nf_open(TRIM(file_name), nf_nowrite, zncid),fname=TRIM(file_name)) + ierr=nf_inq_varid(zncid, TRIM(varname), znvar) + IF (ierr == 0) THEN + search_var_nf77=.true. + END IF + END FUNCTION search_var_nf77 +!=============================================================================== +!=============================================================================== + INTEGER FUNCTION read_diml_nf77(file_name, dimname) + + ! Description: + ! + ! gives length of dimension dimname in file file_name + ! + ! INTEGER :: read_diml_nf77 ! length of dimension dimname, + ! if dimname is not present in file_name, read_diml_nf77=-1 + ! CHARACTER (LEN = *) :: file_name ! file name of the netCDF file + ! containing dimension dimname + ! CHARACTER (LEN = *) :: dimname ! name of dimension the length + ! of which is searched + ! + ! Authors: + ! + ! J.S. Rast, MPI, January 2010, original source + + CHARACTER (LEN = *) :: file_name + CHARACTER (LEN = *) :: dimname + + ! local variables + INTEGER :: zncid, zdimid, ierr + read_diml_nf77=-1 + CALL nf_check(nf_open(TRIM(file_name), nf_nowrite, zncid),fname=TRIM(file_name)) + ierr=nf_inq_dimid(zncid, TRIM(dimname), zdimid) + IF (ierr == 0) THEN + CALL nf_check(nf_inq_dimlen(zncid, zdimid, read_diml_nf77),fname=TRIM(file_name)) + END IF + CALL nf_check(nf_close(zncid)) + END FUNCTION read_diml_nf77 +!=============================================================================== + END MODULE mo_read_netcdf77 diff --git a/ifs-source/arpifs/phys_ec/mo_species.F90 b/ifs-source/arpifs/phys_ec/mo_species.F90 new file mode 100644 index 00000000..87689b42 --- /dev/null +++ b/ifs-source/arpifs/phys_ec/mo_species.F90 @@ -0,0 +1,827 @@ +!> +!! @par Copyright +!! This code is subject to the MPI-M-Software - License - Agreement in it's most recent form. +!! Please see URL http://www.mpimet.mpg.de/en/science/models/model-distribution.html and the +!! file COPYING in the root of the source tree for this code. +!! Where software is supplied by third parties, it is indicated in the headers of the routines. +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!! mo_species assigns identities and properties to species. +!! Former ECHAM versions had physical and chemical information stored with tracers which +!! meant duplication of fields when more than one tracer was defined for a given species. +!! Examples are aerosol modes or tagged gas-phase tracers. +!! With mo_species, these species characteristics are defined once and the tracerinfo +!! is trimmed down to the essential quantities that vary with tracer. +!! Some duplication is unavoidable in order to keep flexibility. +!! +!! @author +!!
    +!!
  1. Declan O'Donnell (MPI-Met) +!!
  2. M. Schultz (FZ-Juelich) +!!
+!! +!! $Id: 1423$ +!! +!! @par Revision History +!!
    +!!
  1. Declan O'Donnell (MPI-Met) - original version - (2008-xx-xx) +!!
  2. M. Schultz (FZ-Juelich) - generalisation and only one species list for everything - (2009-06-xx) +!!
  3. K. Zhang (MPI-Met) - merge Declan's and Martin's version - (2009-08-11) +!!
  4. M. Schultz (FZ-Juelich) - further cleanup (2009-09-21) +!!
+!! +!! @par This module is used by +!! to_be_added +!! +!! @par Notes +!! +!! @par Responsible coder +!! m.schultz@fz-juelich.de +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + +!! ### nphase is additive and lumps all phases of a chemical species +!! ### into one definition of a species. +!! ### nphase: 1 = gas, 2 = aerosol, (4 = liquid) (3 = gas + aerosol, etc.) +!! ### must replace IF (speclist()%nphase == GAS) by IF (IAND(speclist()%nphase,GAS)) +!! ### must think about diagnostics: BYSPECIES = BYSPECIES_AND_PHASE ?? + + +MODULE mo_species + + !--- inherited types, data and functions + + USE mo_kind, ONLY: dp + USE mo_tracdef, ONLY: GAS, AEROSOL, GAS_OR_AEROSOL, jptrac + USE mo_exception, ONLY: message, finish, em_error, em_warn, em_none + + + IMPLICIT NONE + + PRIVATE + + !--- public member functions + + PUBLIC :: init_splist + PUBLIC :: new_species + PUBLIC :: query_species + PUBLIC :: get_nspec ! return number of species defined, optionally keyed by submodel name + PUBLIC :: printspec + + !--- Parameters and integer declarations + + INTEGER, PARAMETER, PUBLIC :: nmaxspec = jptrac ! maximum number of species in the model + INTEGER, PARAMETER, PUBLIC :: nmaxtrspec = 42 ! maximum number of tracers per species + + ! Tracer types + + INTEGER, PARAMETER, PUBLIC :: itrnone = 0 ! No ECHAM tracer + INTEGER, PARAMETER, PUBLIC :: itrpresc = 1 ! Prescribed tracer, read from file + INTEGER, PARAMETER, PUBLIC :: itrdiag = 2 ! Diagnostic tracer, no transport + INTEGER, PARAMETER, PUBLIC :: itrprog = 3 ! Prognostic tracer, transport by ECHAM + + ! Number of species + INTEGER, PUBLIC :: nspec ! number of all species defined + INTEGER, PUBLIC :: naerospec ! number of species in aerosol phase + + ! Species-Tracer relationship + + INTEGER, PUBLIC :: spec_idt(nmaxspec, nmaxtrspec) + INTEGER, PUBLIC :: spec_ntrac(nmaxspec) + + ! Basic 'species' type common for gas and aerosol. + + TYPE, PUBLIC :: t_species + + ! --- basic information --- + CHARACTER(LEN=64) :: longname ! Name of the species + CHARACTER(LEN=32) :: shortname ! Shorthand name + CHARACTER(LEN=15) :: units ! Units for 'outside world', usually kg kg-1 + REAL(dp) :: moleweight ! Molecular weight [g mol-1] + ! --- transport --- + INTEGER :: itrtype ! Tracer transport mechanism + ! --- physical and chemical parameters --- + INTEGER :: nphase ! phase of specie + ! && gas && + REAL(dp) :: tdecay ! Exponential decay rate (simple tracers) + ! e-folding time in seconds + ! will always be applied if /= 0 !! + REAL(dp) :: henry(2) ! Henry's law coefficient and activation energy + REAL(dp) :: dryreac ! Dry reactivity if species is subject to dry deposition + ! && aerosol && + REAL(dp) :: density ! Density of solid or liquid phase [g cm-3] + LOGICAL :: lwatsol ! Species dissolves in water + ! NBB THIS IS NOT THE SAME AS M7 'soluble', which means + ! that an M7 mode can take up water. This flag means + ! that the species can physically dissolve in water. + ! Should be set = TRUE for weakly soluble substances + ! and FALSE only for e.g. dust, black carbon + LOGICAL :: lelectrolyte ! Species dissociates into ions in aqueous solution + INTEGER :: nion ! Number of ions if electrolyte + REAL(dp) :: osm ! Osmotic coefficient + REAL(dp) :: kappa ! Kappa-Koehler coefficient for the species. + ! See: Petters and Kreidenweis + ! ACP 7, 1961-1971, 2007 + ! --- process instructions --- + LOGICAL :: lburden ! Calculate column burden for this species + LOGICAL :: lrad ! Corresponding tracer should interact with radiation + LOGICAL :: lemis ! Corresponding tracer should be emitted + LOGICAL :: ldrydep ! Corresponding tracer should be dry deposited + LOGICAL :: lwetdep ! Corresponding tracer should be scavenged + INTEGER :: nbudg ! Budget calculations + INTEGER :: iaerorad ! Index to aerosol radiation table + ! --- accounting --- + LOGICAL :: ltrreq ! Tracer request + INTEGER :: idt ! Tracer index for gas-phase tracer + INTEGER, ALLOCATABLE :: iaerocomp(:) ! Index to aerocomp array. Dimension nmod. + ! --- in which submodel --- + CHARACTER(LEN=15) :: tsubmname ! the submodel that the tracer belongs to + END TYPE t_species + + ! derived variables + + TYPE(t_species), TARGET, PUBLIC :: speclist(nmaxspec) ! aerosol and gas-phase species lists + ! (analogy to trlist in mo_tracdef) + INTEGER, PUBLIC :: aero_idx(nmaxspec) ! indices of aerosol species + + CONTAINS + + + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! Set defaults in the species lists +!! +!! @author see module info +!! +!! $Id: 1423$ +!! +!! @par Revision History +!! see module info +!! +!! @par This subroutine is called by +!! initialize before calling init_trlist +!! +!! @par Externals: +!!
    +!!
  1. none +!!
+!! +!! @par Notes +!! +!! @par Responsible coder +!! m.schultz@fz-juelich.de +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + + SUBROUTINE init_splist + + USE mo_kind, ONLY: dp + USE mo_physical_constants, ONLY: amd ! dry air mass + + nspec = 0 + naerospec = 0 + + speclist(:)% longname = '' + speclist(:)% shortname = '' + speclist(:)% units = '' + speclist(:)% moleweight = amd + speclist(:)% idt = -1 + speclist(:)% tdecay = 0._dp + speclist(:)% itrtype = itrprog + speclist(:)% nbudg = 0 + speclist(:)% lburden = .TRUE. + speclist(:)% henry(1) = 0._dp + speclist(:)% henry(2) = 0._dp + speclist(:)% dryreac = 0._dp + speclist(:)% density = 0._dp + speclist(:)% lwatsol = .FALSE. + speclist(:)% lelectrolyte = .FALSE. + speclist(:)% nion = 0 + speclist(:)% osm = 0._dp + speclist(:)% kappa = 0._dp + speclist(:)% lrad = .FALSE. + speclist(:)% lemis = .FALSE. + speclist(:)% ldrydep = .FALSE. + speclist(:)% lwetdep = .FALSE. + speclist(:)% iaerorad = 0 + speclist(:)% ltrreq = .FALSE. + speclist(:)% tsubmname = '' + + aero_idx(:) = 0 + + spec_idt(:,:) = -1 + spec_ntrac(:) = 0 + + END SUBROUTINE init_splist + + + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! new_species defines the physical and chemical properties of a chemical species. +!! Normally, each species will also be defined as tracer (new_tracer routine in mo_tracer). +!! The same species can be used in the definition of various tracers (for example +!! different aerosol modes) +!! +!! @author see module info +!! +!! $Id: 1423$ +!! +!! @par Revision History +!! see module info +!! +!! @par This subroutine is called by +!!
    +!!
  1. ham_define_tracers +!!
  2. moz_define_tracers +!!
+!! +!! @par Externals: +!!
    +!!
  1. none +!!
+!! +!! @par Notes +!! +!! @par Responsible coder +!! m.schultz@fz-juelich.de +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + SUBROUTINE new_species(nphase, & + longname, & + shortname, & + units, & + mw, & + tsubmname, & + itrtype, & + tdecay, &!gas + henry, & + dryreac, & + density, &!aerosol + lwatsol, & + lelectrolyte, & + nion, & + osm, & + kappa, & + lemis, & + ldrydep, & + lwetdep, & + nbudg, & + lrad, & + iaerorad, & + lburden, & + ltrreq, & + idx) + + + + USE mo_exception, ONLY: message, message_text + + + INTEGER, INTENT(IN) :: nphase ! GAS or AEROSOL + CHARACTER(LEN=*), INTENT(IN) :: longname ! full name (e.g. for diagnostics) + CHARACTER(LEN=*), INTENT(IN) :: shortname ! short name (e.g. variable name in output files) + CHARACTER(LEN=*), INTENT(IN) :: units ! concentration units, eg 'kg kg-1', 'VMR' + REAL(dp), INTENT(IN) :: mw ! Molecular weight (required for conversions) + CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: tsubmname ! name of module defining the species + INTEGER, INTENT(IN), OPTIONAL :: itrtype ! apply tracer transport? + INTEGER, INTENT(IN), OPTIONAL :: nbudg ! Calculate species budget + REAL(dp), INTENT(IN), OPTIONAL :: tdecay ! e-folding time in seconds + ! will always be applied if /= 0 !! + REAL(dp), INTENT(IN), OPTIONAL :: henry(2) ! Henry coefficient + REAL(dp), INTENT(IN), OPTIONAL :: dryreac ! dry reactivity coefficient + REAL(dp), INTENT(IN), OPTIONAL :: density ! (aerosol) density + LOGICAL, INTENT(IN), OPTIONAL :: lwatsol ! flag for water soluble (SOA scheme) + LOGICAL, INTENT(IN), OPTIONAL :: lelectrolyte ! flag for dissociation in water + INTEGER, INTENT(IN), OPTIONAL :: nion ! number of ions formed + REAL(dp), INTENT(IN), OPTIONAL :: osm ! osmotic coefficient + REAL(dp), INTENT(IN), OPTIONAL :: kappa ! Kappa-Koehler coefficient + LOGICAL, INTENT(IN), OPTIONAL :: lemis ! flag for emission + LOGICAL, INTENT(IN), OPTIONAL :: ldrydep ! flag for dry deposition + LOGICAL, INTENT(IN), OPTIONAL :: lwetdep ! flag for wet deposition + LOGICAL, INTENT(IN), OPTIONAL :: lrad ! flag for radiation interaction + INTEGER, INTENT(IN), OPTIONAL :: iaerorad ! index to aerosol radiation table + LOGICAL, INTENT(IN), OPTIONAL :: lburden ! Calculate column burden + LOGICAL, INTENT(IN), OPTIONAL :: ltrreq ! if or not request tracer + INTEGER, INTENT(OUT),OPTIONAL :: idx ! index to species list + + + !--- Local data + INTEGER :: i + CHARACTER(len=16) :: cphasenam + + !--- executable procedure + ! Default return value + IF (PRESENT(idx)) idx = 0 + + ! Check validity of nphase + SELECT CASE(nphase) + CASE(GAS) + cphasenam = 'Gas-phase' + CASE(AEROSOL) + cphasenam = 'Aerosol' + CASE(GAS_OR_AEROSOL) + cphasenam = 'Gas or Aerosol' + CASE DEFAULT + CALL message('new_species', 'Invalid value for nphase. Only GAS or AEROSOL allowed.', level=em_error) + RETURN + END SELECT + + ! Check if a species of this name has already been defined + CALL query_species(longname=longname, nphase=nphase, index=i) +!!mgs!! write(0,*) ' new_species: query longname='//longname,' nphase=',nphase,', index=',i + + IF (i > 0) THEN + CALL message('new_species', TRIM(cphasenam)//' species '//TRIM(longname)//' already defined.', & + level=em_warn) + CALL message('', 'Will use existing properties.', level=em_none) + IF (PRESENT(idx)) idx = i ! return index + RETURN + END IF + +!!bug fix mgs: added shortname= ! 2010-02-01 + CALL query_species(shortname=shortname, nphase=nphase, index=i) +!!mgs!! write(0,*) ' new_species: query shortname='//shortname,' nphase=',nphase,', index=',i + + IF (i > 0) THEN + CALL message('new_species', TRIM(cphasenam)//' species '//TRIM(shortname)//' already defined.', & + level=em_warn) + CALL message('', 'Will use existing properties.', level=em_none) + IF (PRESENT(idx)) idx = i ! return index + RETURN + END IF + + ! Check if table is full + IF (nspec >= nmaxspec) THEN + WRITE (message_text,*) 'Species list full. nmaxspec = ',nmaxspec + CALL finish('new_species', message_text) + END IF + + ! Increment number of species instances and store data + nspec = nspec + 1 + i = nspec + + ! set species properties + speclist(i)% nphase = nphase + speclist(i)% longname = longname + speclist(i)% shortname = shortname + speclist(i)% units = units + speclist(i)% moleweight = mw + IF (PRESENT(tsubmname)) speclist(i)% tsubmname = tsubmname + IF (PRESENT(tdecay)) speclist(i)% tdecay = tdecay + IF (PRESENT(nbudg)) speclist(i)% nbudg = nbudg + IF (PRESENT(lburden)) speclist(i)% lburden = lburden + IF (PRESENT(lrad)) speclist(i)% lrad = lrad + IF (PRESENT(lemis)) speclist(i)% lemis = lemis + IF (PRESENT(ldrydep)) speclist(i)% ldrydep = ldrydep + IF (PRESENT(lwetdep)) speclist(i)% lwetdep = lwetdep + IF (PRESENT(ltrreq)) speclist(i)% ltrreq = ltrreq + IF (PRESENT(itrtype)) speclist(i)% itrtype = itrtype + +!!mgs!! write(0,*) '### new_species: defining new species: index=',i,', shortname=',shortname,', tsubmname=',tsubmname + ! for gas only + IF (PRESENT(dryreac)) speclist(i)% dryreac = dryreac ! ## rename to drygamma ??? + IF (PRESENT(henry)) speclist(i)% henry = henry + ! for aerosol only + IF (PRESENT(density)) speclist(i)% density = density + IF (PRESENT(lwatsol)) speclist(i)% lwatsol = lwatsol + IF (PRESENT(lelectrolyte)) speclist(i)% lelectrolyte = lelectrolyte + IF (PRESENT(nion)) speclist(i)% nion = nion + IF (PRESENT(osm)) speclist(i)% osm = osm + IF (PRESENT(kappa)) speclist(i)% kappa = kappa + IF (PRESENT(iaerorad)) speclist(i)% iaerorad = iaerorad + + ! capture species definition errors + IF (IAND(nphase, AEROSOL) == 0) THEN + + ! capture errors + IF (PRESENT(density)) CALL message('new_species', & + 'Property "density" undefined for gas-phase species '//TRIM(shortname), & + level=em_error) + IF (PRESENT(lwatsol)) CALL message('new_species', & + 'Property "lwatsol" undefined for gas-phase species '//TRIM(shortname), & + level=em_error) + IF (PRESENT(lelectrolyte)) CALL message('new_species', & + 'Property "lelectrolyte" undefined for gas-phase species '//TRIM(shortname), & + level=em_error) + IF (PRESENT(nion)) CALL message('new_species', & + 'Property "nion" undefined for gas-phase species '//TRIM(shortname), & + level=em_error) + IF (PRESENT(osm)) CALL message('new_species', & + 'Property "osm" undefined for gas-phase species '//TRIM(shortname), & + level=em_error) + IF (PRESENT(kappa)) CALL message('new_species', & + 'Property "kappa" undefined for gas-phase species '//TRIM(shortname), & + level=em_error) + IF (PRESENT(iaerorad)) CALL message('new_species', & + 'Property "iaerorad" undefined for gas-phase species '//TRIM(shortname), & + level=em_error) + + ELSE IF (IAND(nphase, GAS) == 0) THEN + + ! capture errors + IF (PRESENT(dryreac)) CALL message('new_species', & + 'Property "dryreac" undefined for aerosol species '//TRIM(shortname), & + level=em_error) + IF (PRESENT(henry)) CALL message('new_species', & + 'Property "henry" undefined for aerosol species '//TRIM(shortname), & + level=em_error) + + END IF + + ! test validity of aerosol species + IF (IAND(nphase, AEROSOL) /= 0) THEN + + CALL check_aerosol_species(i) + ! add aerosol species to aero_idx list + naerospec = naerospec + 1 + aero_idx(naerospec) = i + + END IF + +! CALL message('new_species', speclist(i)%shortname) + + ! Note: no warning if phase is neither gas or aerosol. Nothing will happen: quiet ignorance... + ! idx will be 0 -- this can be used as indicator for an error + + IF (PRESENT(idx)) idx = i ! return index + + + END SUBROUTINE new_species + + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! Check the metadata for consistency +!! +!! @author see module info +!! +!! $Id: 1423$ +!! +!! @par Revision History +!! see module info +!! +!! @par This subroutine is called by +!!
    +!!
  1. new_species +!!
+!! +!! @par Externals: +!!
    +!!
  1. none +!!
+!! +!! @par Notes +!! +!! @par Responsible coder +!! m.schultz@fz-juelich.de +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + SUBROUTINE check_aerosol_species (idx) + + + INTEGER, INTENT(IN) :: idx ! species index + + ! lelectrolyte & nion + + IF (speclist(idx)% lelectrolyte) THEN + IF (speclist(idx)% nion < 2) THEN + CALL message('new_species', TRIM(speclist(idx)% shortname) // & + ': lelectrolyte=T requires nion > 1.', level=em_error) + END IF + ELSE ! electrolyte=F so nion cannot be accepted unless 0 or 1 + IF (speclist(idx)% nion > 1) THEN + CALL message('new_species', TRIM(speclist(idx)% shortname) // & + ': nion > 1 requires lelectrolyte=T.', level=em_error) + END IF + END IF + + ! kappa & lwatsol + + IF (ABS(speclist(idx)% kappa) > 1.e-20_dp) THEN + IF (.NOT. speclist(idx)% lwatsol) THEN + CALL message('new_species', TRIM(speclist(idx)% shortname) // & + ': kappa /= 0 requires lwatsol=T.', level=em_error) + END IF + END IF + + ! lrad & iaerorad + + IF (speclist(idx)% lrad) THEN + +!SF Note: I think the following is a pretty much reasonable requirement, even if outside of a +! HAM-related context. I therefore think this should stay as is. + IF (speclist(idx)% iaerorad < 0) THEN + CALL message('new_species', TRIM(speclist(idx)% shortname) // & + ': iradkey requires >= 0', level=em_error) + END IF + +!SF Note: in the process of fixing #360, I wanted to clean up the following, but the simple fix +! introduces a circular dependency (importing naeroradspec from mo_ham_rad_data, enclosed into +! #ifdef HAMMOZ / #endif statements). +! --> I leave that off for the moment... + IF (speclist(idx)% iaerorad > 7) THEN + CALL message('new_species', TRIM(speclist(idx)% shortname) // & + ': iradkey requires <= 7', level=em_error) + END IF + + END IF + + END SUBROUTINE check_aerosol_species + + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! get properties of a specific species identified by +!! either its longname or shortname. Query by index is ambivalent due to split +!! in gas-phase and aerosol species lists. If you want to know species properties +!! for a given index in speclist, you can get the result directly as +!! speclist(idx)% . +!! This routine will return ierr/=0 if the species is undefined. +!! +!! @author see module info +!! +!! $Id: 1423$ +!! +!! @par Revision History +!! see module info +!! +!! @par This subroutine is called by +!!
    +!!
  1. new_species +!!
+!! +!! @par Externals: +!!
    +!!
  1. none +!!
+!! +!! @par Notes +!! +!! @par Responsible coder +!! m.schultz@fz-juelich.de +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + SUBROUTINE query_species (longname, shortname, & ! search criteria + index, & ! query results ... + nphase, units, & + mw, & + tsubmname, & + tdecay, & + henry, dryreac, & + density, & + lwatsol, lelectrolyte, & + nion, osm, kappa, & + lrad, & + lemis, ldrydep, lwetdep, & + iaerorad, & + itrtype, & + idt, & + ierr) + + + CHARACTER(len=*) ,INTENT(in) ,OPTIONAL :: longname ! name of species + CHARACTER(len=*) ,INTENT(in) ,OPTIONAL :: shortname ! subname of species + INTEGER ,INTENT(in) ,OPTIONAL :: nphase ! GAS or AEROSOL + + INTEGER ,INTENT(out) ,OPTIONAL :: index ! index of species as query result + CHARACTER(len=*) ,INTENT(out) ,OPTIONAL :: units ! physical units of tracer + REAL(dp) ,INTENT(out) ,OPTIONAL :: mw ! molecular weight + CHARACTER(len=*) ,INTENT(out) ,OPTIONAL :: tsubmname ! tsubmname + REAL(dp) ,INTENT(out) ,OPTIONAL :: tdecay ! e-folding time in seconds + REAL(dp) ,INTENT(out) ,OPTIONAL :: henry(2) ! Henry coefficient + REAL(dp) ,INTENT(out) ,OPTIONAL :: dryreac ! dry reactivity coefficient + REAL(dp) ,INTENT(out) ,OPTIONAL :: density ! (aerosol) density + LOGICAL ,INTENT(out) ,OPTIONAL :: lwatsol ! flag for water soluble (SOA scheme) + LOGICAL ,INTENT(out) ,OPTIONAL :: lelectrolyte ! flag for dissociation in water + INTEGER ,INTENT(out) ,OPTIONAL :: nion ! number of ions formed + REAL(dp) ,INTENT(out) ,OPTIONAL :: osm ! osmotic coefficient + REAL(dp) ,INTENT(out) ,OPTIONAL :: kappa ! Kappa-Koehler coefficient + LOGICAL ,INTENT(out) ,OPTIONAL :: lrad ! flag for radiation interaction + LOGICAL ,INTENT(out) ,OPTIONAL :: lemis ! flag for emissions + LOGICAL ,INTENT(out) ,OPTIONAL :: ldrydep ! flag for dry deposition + LOGICAL ,INTENT(out) ,OPTIONAL :: lwetdep ! flag for wet deposition + INTEGER ,INTENT(out) ,OPTIONAL :: iaerorad ! index to aerosol radiation table + INTEGER ,INTENT(out) ,OPTIONAL :: itrtype ! tracer type (transport characteristics) + INTEGER ,INTENT(out) ,OPTIONAL :: idt ! associated tracer index + INTEGER ,INTENT(out) ,OPTIONAL :: ierr ! error return value + + ! --- local variables + INTEGER :: i + INTEGER :: ispec ! local species id + INTEGER :: iphase + INTEGER, PARAMETER :: OK = 0 + INTEGER, PARAMETER :: UNDEF = 1 + + ! -- set defaults + ispec = 0 + IF (PRESENT(ierr)) ierr = UNDEF ! default error: species not found + IF (PRESENT(index)) index = 0 + IF (PRESENT(units)) units = '' + IF (PRESENT(mw)) mw = 0._dp + IF (PRESENT(tsubmname)) tsubmname = '' + IF (PRESENT(tdecay)) tdecay = 0._dp + IF (PRESENT(henry)) henry(:) = 0._dp + IF (PRESENT(dryreac)) dryreac = 0._dp + IF (PRESENT(density)) density = 0._dp + IF (PRESENT(lwatsol)) lwatsol = .FALSE. + IF (PRESENT(lelectrolyte)) lelectrolyte = .FALSE. + IF (PRESENT(nion)) nion = 0 + IF (PRESENT(osm)) osm = 0._dp + IF (PRESENT(kappa)) kappa = 0._dp + IF (PRESENT(lrad)) lrad = .FALSE. + IF (PRESENT(lemis)) lemis = .FALSE. + IF (PRESENT(ldrydep)) ldrydep = .FALSE. + IF (PRESENT(lwetdep)) lwetdep = .FALSE. + IF (PRESENT(itrtype)) itrtype = 0 + IF (PRESENT(idt)) idt = 0 + IF (PRESENT(iaerorad)) iaerorad = 0 + + ! -- test if phase if given + iphase = -1 ! undefined + IF (PRESENT(nphase)) THEN + iphase = nphase + IF (IAND(iphase, GAS+AEROSOL) == 0) CALL message('query_species', & + 'Invalid value for nphase!', level=em_error) + END IF + + ! -- search for species: always search for longname first + IF (PRESENT(longname)) THEN +!!mgs!! IF (iphase == 1 .OR. iphase == 2 .OR. iphase == 4) THEN +!!mgs!! DO i=1, nspec +!!mgs!! IF (TRIM(speclist(i)%longname) == TRIM(longname) .AND. IAND(speclist(i)%nphase,iphase) /= 0) THEN +!!mgs!! ispec = i +!!mgs!! EXIT +!!mgs!! END IF +!!mgs!! END DO +!!mgs!! ELSE + DO i=1, nspec + IF (TRIM(speclist(i)%longname) == TRIM(longname)) THEN + ispec = i + EXIT + END IF + END DO +!!mgs!! END IF + END IF + + ! -- if no species found or longname not given look for shortname + IF (ispec == 0 .AND. PRESENT(shortname)) THEN +!!mgs!! IF (iphase == 1 .OR. iphase == 2 .OR. iphase == 4) THEN +!!mgs!! DO i=1, nspec +!!mgs!! IF (TRIM(speclist(i)%shortname) == TRIM(shortname) .AND. IAND(speclist(i)%nphase,iphase) /= 0) THEN +!!mgs!! ispec = i +!!mgs!! EXIT +!!mgs!! END IF +!!mgs!! END DO +!!mgs!! ELSE + DO i=1, nspec + IF (TRIM(speclist(i)%shortname) == TRIM(shortname)) THEN + ispec = i + EXIT + END IF + END DO +!!mgs!! END IF + END IF + + ! --- Collect species properties + IF (ispec > 0) THEN + IF (PRESENT(ierr)) ierr = OK ! error status: OK + IF (PRESENT(index)) index = ispec + IF (PRESENT(units)) units = speclist(ispec)% units + IF (PRESENT(mw)) mw = speclist(ispec)% moleweight + IF (PRESENT(tsubmname)) tsubmname = speclist(ispec)% tsubmname + IF (PRESENT(tdecay)) tdecay = speclist(ispec)% tdecay + IF (PRESENT(henry)) henry(:) = speclist(ispec)% henry + IF (PRESENT(dryreac)) dryreac = speclist(ispec)% dryreac + IF (PRESENT(density)) density = speclist(ispec)% density + IF (PRESENT(lwatsol)) lwatsol = speclist(ispec)% lwatsol + IF (PRESENT(lelectrolyte)) lelectrolyte = speclist(ispec)% lelectrolyte + IF (PRESENT(nion)) nion = speclist(ispec)% nion + IF (PRESENT(osm)) osm = speclist(ispec)% osm + IF (PRESENT(kappa)) kappa = speclist(ispec)% kappa + IF (PRESENT(lrad)) lrad = speclist(ispec)% lrad + IF (PRESENT(lemis)) lemis = speclist(ispec)% lemis + IF (PRESENT(ldrydep)) ldrydep = speclist(ispec)% ldrydep + IF (PRESENT(lwetdep)) lwetdep = speclist(ispec)% lwetdep + IF (PRESENT(itrtype)) itrtype = speclist(ispec)% itrtype + IF (PRESENT(idt)) idt = speclist(ispec)% idt + IF (PRESENT(iaerorad)) iaerorad = speclist(ispec)% iaerorad + END IF + + END SUBROUTINE query_species + + +!! get_nspec: return number of specers defined, optionally keyed by submodel name + + FUNCTION get_nspec (tsubmname) RESULT (ispec) + + INTEGER :: ispec + CHARACTER(len=*), INTENT(in), OPTIONAL :: tsubmname + + INTEGER :: jt + + ispec = 0 + + IF (PRESENT(tsubmname)) THEN + DO jt = 1,nspec + IF (speclist(jt)%tsubmname == tsubmname) ispec = ispec + 1 + END DO + ELSE + ispec = nspec ! return number of all specers + END IF + + END FUNCTION + + SUBROUTINE printspec + !! print species definitions + !! and fill spec_idt matrix + + USE mo_exception, ONLY: message, message_text, em_info, em_param + USE mo_tracdef, ONLY: ntrac, trlist + USE mo_util_string, ONLY: separator + + INTEGER :: jt, ispec, i + CHARACTER(len=11) :: cstring + + CALL message('', 'Species definitions:', level=em_info) + CALL message('','',level=em_param) + WRITE(message_text,'(a)') 'Id shortname phase submodel '//& + 'mol.wght unit itrtype idt longname' + CALL message('', message_text, level=em_param) + DO jt = 1, nspec + + SELECT CASE(speclist(jt)%nphase) + CASE (GAS) + cstring = 'gas ' + CASE (AEROSOL) + cstring = 'aerosol ' + CASE (GAS_OR_AEROSOL) + cstring = 'gas|aerosol' + END SELECT + +!SF Note: in the line below, all string fields are meant to be printed with their original declared length +! (which should make sense!), except for the shortname property (otherwise these lines are +! extremely long and unreadable). Therefore it may be that the shortname property is truncated in the +! printed lines (> 18 characters...) + WRITE(message_text,'(i0,t4,a,t22,2(a,1x),f7.3,3x,a,1x,i3,1x,i3,2x,a)') & + jt,TRIM(speclist(jt)%shortname), cstring, speclist(jt)%tsubmname, & + speclist(jt)%moleweight, speclist(jt)%units, speclist(jt)%itrtype, & + speclist(jt)%idt, speclist(jt)%longname + + CALL message('', message_text, level=em_param) + + END DO + + CALL message('','',level=em_param) + WRITE(message_text,'(a)') 'Notes:' + CALL message('', message_text, level=em_param) + WRITE(message_text,'(a)') '1. itrtype meaning: ' + CALL message('', message_text, level=em_param) + WRITE(message_text,'(a,i0,a)') ' --> ',itrnone,' = No ECHAM tracer, ' + CALL message('', message_text, level=em_param) + WRITE(message_text,'(a,i0,a)') ' --> ',itrpresc,' = Prescribed tracer, read from file' + CALL message('', message_text, level=em_param) + WRITE(message_text,'(a,i0,a)') ' --> ',itrdiag,' = Diagnostic tracer, no transport' + CALL message('', message_text, level=em_param) + WRITE(message_text,'(a,i0,a)') ' --> ',itrprog,' = Prognostic tracer, transport by ECHAM' + CALL message('', message_text, level=em_param) + CALL message('','',level=em_param) + WRITE(message_text,'(a)') '2. idt is the tracer index for gas-phase tracers only' + CALL message('', message_text, level=em_param) + + !! fill spec_idt matrix + DO jt = 1, ntrac + ispec = trlist%ti(jt)%spid + IF (ispec > 0) THEN + spec_ntrac(ispec) = spec_ntrac(ispec) + 1 + spec_idt(ispec, spec_ntrac(ispec)) = jt + END IF + END DO + + CALL message('','',level=em_param) + CALL message('', 'Species-tracer matrix:', level=em_param) + CALL message('', 'Species index : Tracer index/indices', level=em_param) + !>>dod removed use of list-directed I/O to variable + message_text='' + DO jt = 1, nspec + WRITE(message_text, '(i0,t15,a1)') jt,':' + DO i=1,spec_ntrac(jt) + WRITE(cstring,'(i0,1x)') spec_idt(jt,i) + WRITE(message_text,'(a,1x,a)') TRIM(message_text), TRIM(cstring) + END DO + CALL message('', message_text, level=em_param) + END DO + !< +!! @par Copyright +!! This code is subject to the MPI-M-Software - License - Agreement in it's most recent form. +!! Please see URL http://www.mpimet.mpg.de/en/science/models/model-distribution.html and the +!! file COPYING in the root of the source tree for this code. +!! Where software is supplied by third parties, it is indicated in the headers of the routines. +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!! This file defines and sets the control flags for the HAM, MOZ and +!! HAMMONIA submodels including the settings that control the HAM and +!! MOZ coupling and the switches for MEGAN, AIRCRAFT (emissions) and +!! LIGHTNING. +!! +!! These switches are controlled by the *submodelctl* namelist. +!! This namelist defines general submodel switches which are needed in +!! the interface layer (*mo_submodel_interface* or other parts of the +!! standard ECHAM code). Also included are switches which define the +!! coupling between various submodels (for example in HAMMOZ, which coupled +!! aerosol and gas-phase chemical processes). Other submodel-specific switches +!! should be defined and maintained in extra namelists which carry the name +!! of the submodel itself (e.g. mozctl or hamctl). +!! +!! Change this file to attach different or additional submodels to ECHAM. +!! +!! +!! @author +!!
    +!!
  1. M. Schultz (FZ-Juelich) +!!
  2. S. Rast (MPI-Met) +!!
  3. K. Zhang (MPI-Met) +!!
+!! +!! $Id: 1423$ +!! +!! @par Revision History +!!
    +!!
  1. M. Schultz (FZ-Juelich) +!! - original idea and code structure (2009-05-xx) +!!
  2. S. Rast (MPI-Met) +!! - original idea and code structure (2009-06-xx) +!!
  3. K. Zhang (MPI-Met) +!! - restucture and new style, implementation in ECHAM6 (2009-07-xx) +!!
  4. L. Kornblueh (MPI-Met) +!! - remove spitfire (2012-02-xx) +!!
+!! +!! @par This module is used by +!! ... +!! +!! @par Notes +!! mgs: new module - contains module variables for submodels and submodel +!! stuff from old mo_tracer +!! linterh2o: info from Hauke: even if linterh2o=true, output of H2O as tracer may differ from +!! ECHAM's sh output. Reason unclear. +!! +!! @par Responsible coder +!! m.schultz@fz-juelich.de +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + + MODULE mo_submodel + + USE mo_tracdef, ONLY: ln ! length of caracter string (module name) + + IMPLICIT NONE + + PRIVATE + + PUBLIC :: submlist ! submodel list (formerly in mo_tracdef) + PUBLIC :: t_submlist ! submodel list element data type (formerly in mo_tracdef) + PUBLIC :: nsubm ! number of submodel list entries (formerly in mo_tracdef) + PUBLIC :: new_submodel ! define a new submodel + PUBLIC :: setsubmodel ! read namelist + PUBLIC :: query_submodel ! check if a submodel was defined + PUBLIC :: starttracdef ! flag first tracer index of a submodel + PUBLIC :: endtracdef ! flag last tracer index of a submodel + + PUBLIC :: print_status ! utility routines + PUBLIC :: print_value ! utility routines + + PUBLIC :: lanysubmodel ! general submodel flag for fast testing + PUBLIC :: lchemistry ! general process switches + PUBLIC :: lemissions ! switch for emission diagnostics + PUBLIC :: ldrydep ! switch for dry diagnostics + PUBLIC :: lwetdep ! switch for wet diagnostics + PUBLIC :: lsedimentation ! switch for sedimentation + PUBLIC :: laero_micro ! switch for microphysics + PUBLIC :: lburden ! switch for burden diagnostics + +! central switches for submodels + PUBLIC :: lmethox ! switch for upper atmospheric H2O production from methane + PUBLIC :: lco2 ! switch on/off CO2 transport submodel + PUBLIC :: ltransdiag ! switch for turning on atmospheric energy transport diagnostic + ! submodel switches: + PUBLIC :: lhammoz ! HAMMOZ gas-phase and aerosol chemistry (lmoz+lham) + PUBLIC :: lham ! HAM aerosol module + PUBLIC :: lmoz ! MOZ chemistry module + PUBLIC :: lhammonia ! HAMMOZ with upper atmosphere extensions + PUBLIC :: llght ! (MOZ) lightning module (can run independently) + PUBLIC :: lbioemi_stdalone ! Biogenic emissions as a standalone submodel + PUBLIC :: lxt ! simple tracer module [yet to be completed] + PUBLIC :: losat ! satellite simulator switches + PUBLIC :: loisccp ! ISCCP simulator switches + PUBLIC :: lccnclim ! switch for CCN climatology (as submodel) + PUBLIC :: lflighttrack ! switch for flight-track simulator + + PUBLIC :: lhmzphoto ! HAMMOZ coupling switches + PUBLIC :: lhmzoxi ! + PUBLIC :: lhmzhet ! + PUBLIC :: lhmzhetwet ! + PUBLIC :: lhmzhetdust ! + + PUBLIC :: lchemfeedback ! Switches for chemistry feedbacks on ECHAM physics + PUBLIC :: lchemrad ! + PUBLIC :: linterh2o ! feedback water content from MOZ to ECHAM and vice versa + PUBLIC :: lchemheat ! HAMMONIA coupling switches + PUBLIC :: linteram ! + PUBLIC :: lintercp ! + PUBLIC :: laoa ! age-of-air submodel switch + + PUBLIC :: emi_basepath + PUBLIC :: emi_scenario !sschr See #411 (HAMMOZ) + + PUBLIC :: id_xt + PUBLIC :: id_ham + PUBLIC :: id_bioemi + PUBLIC :: id_moz + PUBLIC :: id_hammonia + PUBLIC :: id_lightning + PUBLIC :: id_isccp + PUBLIC :: id_sat + PUBLIC :: id_hrates + PUBLIC :: id_ccnclim + PUBLIC :: id_flighttrack + PUBLIC :: id_aoa + + ! + ! interfaces + ! + INTERFACE print_value ! report on a parameter value + MODULE PROCEDURE print_lvalue ! logical + MODULE PROCEDURE print_ivalue ! integer + MODULE PROCEDURE print_rvalue ! real + END INTERFACE + ! + ! Type declarations + ! + INTEGER, PARAMETER :: ns = 20 ! max number of submodels + + TYPE t_submlist + CHARACTER(len=ln) :: modulename ! name of sub-model + INTEGER :: idtfirst ! id of first tracer defined for this submodel + INTEGER :: idtlast ! id of last tracer defined for this submodel + END TYPE t_submlist + + + ! + ! module variables + ! + + TYPE(t_submlist) ,SAVE :: submlist (ns) ! submodel list + INTEGER ,SAVE :: nsubm = 0 ! number of submodels defined + +! submodel master switch: default false, set to true if any submodel registers + LOGICAL :: lanysubmodel = .FALSE. + +! general chemical process interface switches for debugging purposes: +! Default is true - will be turned off if no submodel is defined (*mo_submodel_interface*) +! or if switch is turned off in SUBMODELCTL namelist + LOGICAL :: lemissions = .TRUE. + LOGICAL :: lchemistry = .TRUE. + LOGICAL :: ldrydep = .TRUE. + LOGICAL :: lwetdep = .TRUE. + LOGICAL :: lsedimentation = .TRUE. + LOGICAL :: laero_micro = .TRUE. +!!$ LOGICAL :: lburden = .TRUE. ! .true. for burden diagnostics +!!$ ! (defaults to false if neither HAM nor MOZ are active) + LOGICAL :: lburden = .FALSE. ! has to be set by namelist + +! submodel switches (default: all submodels turned off) + LOGICAL :: lxt = .FALSE. ! .true. to activate simple generic tracer submodel + LOGICAL :: lmethox = .FALSE. ! .true. for upper atmospheric H2O production from methane + LOGICAL :: lco2 = .FALSE. ! .true. for interactive transport CO2 subm. + LOGICAL :: ltransdiag = .FALSE. ! .true. for atmospheric energy transport diagnostic + LOGICAL :: lhammoz = .FALSE. ! .true. to turn on HAM and MOZ and activate coupling + LOGICAL :: lham = .FALSE. ! .true. for aerosol module HAM + LOGICAL :: lmoz = .FALSE. ! .true. for gas-phase chemistry module MOZ + LOGICAL :: llght = .FALSE. ! .true. for enabling lightning emissions + LOGICAL :: lbioemi_stdalone = .FALSE. ! .true. for enabling biogenic emissions as + ! a standalone submodel + ! Diagnostics submodel switches + ! Satellite and ISCCP cloud diagnostic processors + LOGICAL :: losat = .FALSE. ! .true. for satellite simulator + LOGICAL :: loisccp = .FALSE. ! .true. for ISCCP diagnostics processor + LOGICAL :: lccnclim = .FALSE. ! .true. for CCN climatology + LOGICAL :: lflighttrack = .FALSE. ! .true. for flight-track simulator + + +! HAMMOZ coupling switches (default: true -- they are automatically turned off if one module is inactive) +! see also Liao et al, JGR, 2005, table 1. + LOGICAL :: lhmzphoto = .TRUE. ! switch HAMMOZ photolysis coupling off + LOGICAL :: lhmzoxi = .TRUE. ! switch HAMMOZ oxidant coupling off + LOGICAL :: lhmzhet = .TRUE. ! switch on/off all the HAMMOZ heterogenous reactions + LOGICAL :: lhmzhetwet = .TRUE. ! switch on/off het. reactions on SU,SS,BC,OC and wet aerosol + LOGICAL :: lhmzhetdust= .TRUE. ! switch on/off het. reactions on mineral dust + +! chemistry feedback switches + LOGICAL :: lchemfeedback = .FALSE. ! combined switch for linterh2o, lchemheat, linteram, lintercp + radiation + LOGICAL :: lchemrad = .FALSE. ! switch chemistry feedback on radiation + LOGICAL :: linterh2o = .FALSE. ! switch return of water vapour from chemistry to ECHAM physics +! HAMMONIA switches + LOGICAL :: lhammonia = .FALSE. ! switch HAMMONIA (not possible in this version) + LOGICAL :: lchemheat = .FALSE. ! switch chemical heating (HAMMONIA only) + LOGICAL :: linteram = .FALSE. ! switch calculation of air mass from chemistry (HAMMONIA only) + LOGICAL :: lintercp = .FALSE. ! switch calculation of cp from chemistry (HAMMONIA only) + LOGICAL :: laoa = .FALSE. ! .true. for enabling age-of-air submodel + + CHARACTER(LEN=256) :: emi_basepath = '' + CHARACTER(LEN=8) :: emi_scenario = '' + +!!mgs&jsr!! questionable if we need these id values. Might be removed later... + INTEGER :: id_methox + INTEGER :: id_co2 + INTEGER :: id_transdiag + INTEGER :: id_xt + INTEGER :: id_ham + INTEGER :: id_bioemi + INTEGER :: id_moz + INTEGER :: id_hammonia + INTEGER :: id_lightning + INTEGER :: id_isccp + INTEGER :: id_sat + INTEGER :: id_hrates + INTEGER :: id_ccnclim + INTEGER :: id_flighttrack + + INTEGER :: id_aoa + + CONTAINS + + + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! Check status of a given submodel. Return id of submodel if requested. +!! Function result is logical value indicating proper initialisation. +!! +!! @author see above +!! +!! $Id: 1423$ +!! +!! @par Revision History +!! see above +!! +!! @par This subroutine is called by +!! init_subm +!! +!! @par Externals +!! +!! @par Notes +!! not yet used +!! +!! @par Responsible coder +!! M.Schultz@fz-juelich.de +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + + LOGICAL FUNCTION query_submodel (modulename, id) + + + USE mo_util_string, ONLY : toupper + + CHARACTER(len=*) ,INTENT(in) :: modulename ! name of submodel + INTEGER ,INTENT(out) ,OPTIONAL :: id ! index of submodel, 0 if undefined + + !-- local variables -- + + INTEGER :: i + + IF (PRESENT(id)) id = 0 + + query_submodel = .false. + DO i=1, nsubm + IF (submlist(i)% modulename == toupper(modulename)) THEN + query_submodel = .true. + RETURN + END IF + END DO + + END FUNCTION query_submodel + + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! Request a new submodel with name 'name'. +!! Name is always stored in uppercase characters +!! +!! @author see above +!! +!! $Id: 1423$ +!! +!! @par Revision History +!! see above +!! +!! @par This subroutine is called by +!! setsubmodel +!! +!! @par Externals +!! +!! @par Notes +!! +!! @par Responsible coder +!! M.Schultz@fz-juelich.de +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + + SUBROUTINE new_submodel(name,id) + + USE mo_util_string, ONLY: toupper + USE mo_exception, ONLY: message_text, finish + + CHARACTER (len=*) ,INTENT(in) :: name + INTEGER ,INTENT(out) ,OPTIONAL :: id ! index of submodel, 0 if undefined + + IF (PRESENT(id)) id = 0 + nsubm = nsubm + 1 + IF (nsubm > ns) THEN + WRITE(message_text,*) 'Submodel list full. ns = ', ns + CALL finish ('new_submodel', message_text) + END IF + IF (PRESENT(id)) id = nsubm + submlist (nsubm)% modulename = toupper(name) + lanysubmodel = .true. + + END SUBROUTINE new_submodel + + + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! It reads the submodel.ctl namelist to set the submodel control switches. +!! +!! @author see above +!! +!! $Id: 1423$ +!! +!! @par Revision History +!! see above +!! +!! @par This subroutine is called by +!! initialize +!! +!! @par Externals: +!! +!! @par Notes +!! +!! @par Responsible coder +!! M.Schultz@fz-juelich.de +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + + SUBROUTINE setsubmodel + + +#ifdef HAMMOZ + USE mo_mpi, ONLY: p_io, p_parallel, p_parallel_io, p_bcast +#endif + USE mo_exception, ONLY: message, finish, em_info, em_param, & + message_text, em_warn, em_error + USE mo_namelist, ONLY: open_nml, position_nml, POSITIONED + USE mo_util_string, ONLY: separator ! format string (----) +#ifdef HAMMOZ + USE mo_advection, ONLY: iadvec, & + no_advection, & ! for diagnostic printout + semi_lagrangian, & + tpcore +#endif +! local variables + + INTEGER :: i, inml, iunit, ierr + + INCLUDE 'submodelctl.inc' + + + CALL message('', ' ') + CALL message('', '|') + CALL message('', '| setsubmodel ') + CALL message('', '|') + CALL message('', ' ') + + ! initialize submodel list + + submlist (:)% modulename = '' + submlist (:)% idtfirst = 0 + submlist (:)% idtlast = 0 + +#ifdef HAMMOZ + IF (p_parallel_io) THEN +#endif + + ! read namelist + + inml = open_nml('namelist.echam') + iunit = position_nml ('SUBMODELCTL', inml, status=ierr) + + SELECT CASE (ierr) + CASE (POSITIONED) + READ (iunit, submodelctl) + END SELECT + + ! evaluate HAMMONIA switch: exit model if activated. This code does not run HAMMONIA + + IF ( lhammonia ) THEN + CALL finish('setsubmodel', & + 'LHAMMONIA=.true. --> Abort program execution. This code version ' // & + 'does not contain HAMMONIA routines.') + END IF + + ! overwrite HAMMONIA flags for safety + + lchemheat = .false. + linteram = .false. + lintercp = .false. + +#ifdef HAMMOZ + ENDIF +#endif + +#ifdef HAMMOZ + IF (p_parallel) THEN + + ! submodel switches + CALL p_bcast (lmethox, p_io) + CALL p_bcast (lco2, p_io) + CALL p_bcast (ltransdiag, p_io) + CALL p_bcast (lxt, p_io) + CALL p_bcast (lham, p_io) + CALL p_bcast (lmoz, p_io) + CALL p_bcast (lhammoz, p_io) + CALL p_bcast (lhammonia, p_io) + CALL p_bcast (llght, p_io) + CALL p_bcast (lbioemi_stdalone, p_io) + CALL p_bcast (losat, p_io) + CALL p_bcast (loisccp, p_io) + CALL p_bcast (lccnclim, p_io) + CALL p_bcast (lflighttrack, p_io) + + ! generic process switches + CALL p_bcast (lchemistry, p_io) + CALL p_bcast (ldrydep, p_io) + CALL p_bcast (lwetdep, p_io) + CALL p_bcast (lemissions, p_io) + CALL p_bcast (lsedimentation, p_io) + CALL p_bcast (laero_micro, p_io) + + ! coupling and diagnostic switches + CALL p_bcast (lhmzphoto, p_io) + CALL p_bcast (lhmzoxi, p_io) + CALL p_bcast (lhmzhet, p_io) + CALL p_bcast (lchemfeedback, p_io) + CALL p_bcast (lchemrad, p_io) + CALL p_bcast (linterh2o, p_io) + CALL p_bcast (lchemheat, p_io) + CALL p_bcast (linteram, p_io) + CALL p_bcast (lintercp, p_io) + CALL p_bcast (lburden, p_io) + + CALL p_bcast (emi_basepath, p_io) + CALL p_bcast (emi_scenario, p_io) + + ! age-of-air tracer switch + CALL p_bcast (laoa, p_io) + + END IF +#endif + +!sschr: this is the right place for the following commands! + + ! evaluate HAMMOZ switches + ! hammoz always means moz and ham are on. By default all hammoz couplings are also on, + ! but you can switch them off in the namelist. The coupling is always off if lhammoz is not + ! set. + + IF ( lhammoz ) THEN + lham = .true. + lmoz = .true. + ELSE + lhmzphoto = .false. + lhmzoxi = .false. + lhmzhet = .false. + END IF + + ! set individual switches if lchemfeedback is true + IF ( lchemfeedback .AND. lmoz ) THEN + lchemrad = .TRUE. + linterh2o = .TRUE. + IF ( lhammonia ) THEN + lchemheat = .TRUE. + linteram = .TRUE. + lintercp = .TRUE. + ENDIF + ENDIF + + ! global flag for burden diagnostics + +!!$ IF (.NOT. lmoz .AND. .NOT. lham) THEN +!!$ lburden = .false. +!!$ END IF + + ! make sure that chemheat, linteram and lintercp are only set if HAMMONIA is active + IF ( .NOT. lhammonia ) THEN + IF ( lchemheat ) CALL message('setsubmodel', & + 'Switching off lchemheat now, because LHAMMONIA = false.', & + level=em_warn) + IF ( linteram ) CALL message('setsubmodel', & + 'Switching off linteram now, because LHAMMONIA = false.', & + level=em_warn) + IF ( lintercp ) CALL message('setsubmodel', & + 'Switching off lintercp now, because LHAMMONIA = false.', & + level=em_warn) + ENDIF + + ! evaluate MOZ and chemistry switches + + IF ( .NOT. lmoz .OR. .NOT. lchemistry ) THEN + IF ( lchemfeedback ) CALL message('setsubmodel', & + 'Switching off lchemfeedback now, because LMOZ = false. or lchemistry = .false.', & + level=em_warn) + IF ( lchemrad ) CALL message('setsubmodel', & + 'Switching off lchemrad now, because LMOZ = false. or lchemistry = .false.', & + level=em_warn) + IF ( linterh2o ) CALL message('setsubmodel', & + 'Switching off linterh2o now, because LMOZ = false. or lchemistry = .false.', & + level=em_warn) + IF ( lchemheat ) CALL message('setsubmodel', & + 'Switching off lchemheat now, because LMOZ = false. or lchemistry = .false.', & + level=em_warn) + IF ( linteram ) CALL message('setsubmodel', & + 'Switching off linteram now, because LMOZ = false. or lchemistry = .false.', & + level=em_warn) + IF ( lintercp ) CALL message('setsubmodel', & + 'Switching off lintercp now, because LMOZ = false. or lchemistry = .false.', & + level=em_warn) + lchemfeedback = .false. + lchemrad = .false. + linterh2o = .false. + lchemheat = .false. + linteram = .false. + lintercp = .false. + END IF + + ! make sure that ECHAM methox is not called if MOZART is active and linterh2o=true + + IF ( linterh2o .AND. lmethox ) THEN + CALL message('setsubmodel', & + 'Switching off lmethox, because stratospheric H2O is handled by MOZ and linterh2o=true.', & + level=em_warn) + lmethox = .FALSE. + ENDIF + + ! evaluate CCNCLIM and HAM switches + + IF ( lccnclim .AND. lham ) THEN + CALL message('setsubmodel', 'De-activating CCNCLIM, because LHAM=.TRUE.', level=em_warn) + lccnclim = .false. + END IF + + ! force chemical water vapour if radiative feedback is activated (???) !!baustelle!! +!!IF ( linterchem ) THEN +!! linterh2o = .true. +!!END IF + + ! individual het coupling processes + ! presently these are not independently controlled by namelist switches + + IF ( lhmzhet ) THEN + lhmzhetwet = .true. + lhmzhetdust = .true. + ELSE + lhmzhetwet = .false. + lhmzhetdust = .false. + END IF + +!!++mgs: potentially need to turn off lhmz switches if lchemistry=false... + + ! turn general chemistry process switches off if no submodel has been activated +!++mgs + IF (.NOT. (lham .OR. lmoz .OR. llght .OR. lbioemi_stdalone .OR. lco2) ) THEN +!--mgs + lchemistry = .FALSE. + lemissions = .FALSE. + ldrydep = .FALSE. + lwetdep = .FALSE. + lsedimentation = .FALSE. + laero_micro = .FALSE. + CALL message('setsubmodel', & + 'This run is without any chemical processes (lchemistry=F, lemissions=F'// & + ', ldrydep=F, lwetdep=F, lsedimentation=F, laero_micro=F)', level=em_info ) + END IF + +!>>SF check for biogenic emissions inconsistency: +! Biogenic emissions can be both handled by the standalone submodel and by +! HAM or MOZ at the same time + IF ((lham .OR. lmoz) .AND. lbioemi_stdalone) THEN + CALL message('setsubmodel', & + 'Biogenic emissions cannot be run as standalone if HAM or MOZ are active! '// & + 'Try and turn off lbioemi_stdalone or lham and/or lmoz', level=em_error) + ENDIF +!< 0 ) THEN + WRITE (message_text,*) nsubm, ' submodels registered:', & + (' '//TRIM(submlist(i)%modulename),i=1,nsubm) + ELSE + WRITE (message_text,*) 'No submodels registered (=> lanysubmodel = .false.)' + END IF + CALL message('', message_text, level=em_param) + CALL message('', 'Submodel switches processed.', level=em_param) + CALL print_status('METHOX module', lmethox) + CALL print_status('TRANSDIAG module', ltransdiag) + CALL print_status('HAM aerosol module', lham) + CALL print_status('MOZ chemistry module', lmoz) + + IF ( lham .AND. lmoz ) THEN + CALL print_status('HAMMOZ photolysis coupling', lhmzphoto) + CALL print_status('HAMMOZ oxidant coupling', lhmzoxi) + CALL print_status('HAMMOZ het. chemistry coupling', lhmzhet) + END IF + + IF ( lmoz ) THEN + CALL print_status('Chemistry feedback on radiation', lchemrad) + CALL print_status('Use of water vapour from chemistry', linterh2o) + IF (lhammonia) THEN + CALL print_status('Chemical heating', lchemheat) + CALL print_status('Use of air mass from chemistry', linteram) + CALL print_status('Use of specific heat from chemistry', lintercp) + END IF + CALL print_status('Lightning NOx emissions', llght) + END IF + + IF ( lbioemi_stdalone ) & + CALL print_status('Biogenic NMVOC emissions as standalone submodel', lbioemi_stdalone) + CALL print_status('Satellite processor diagnostics', losat) + CALL print_status('ISCCP cloud diagnostics', loisccp) + CALL print_status('Burden diagnostics', lburden) + CALL print_status('CCN climatology', lccnclim) + CALL print_status('Flight-track simulator', lflighttrack) + + SELECT CASE ( iadvec ) + CASE (no_advection) + CALL message('', 'Run without tracer advection!', level=em_warn) + CASE (semi_lagrangian) + CALL message('', 'Run with semi-lagrangian tracer advection! (are you sure?)', & + level=em_warn) + CASE (tpcore) + CALL message('', 'Run with Lin&Rood (tpcore) tracer advection.', level=em_param) + END SELECT + +!++mgs + IF (lham .OR. lmoz .OR. llght .OR. lbioemi_stdalone .OR. lco2) THEN +!--mgs + IF ( .NOT. lchemistry ) CALL message('', 'Run with lchemistry = false !', level=em_warn) + IF ( .NOT. lemissions ) CALL message('', 'Run with lemissions = false !', level=em_warn) + IF ( .NOT. ldrydep ) CALL message('', 'Run with ldrydep = false !', level=em_warn) + IF ( .NOT. lwetdep ) CALL message('', 'Run with lwetdep = false !', level=em_warn) + IF ( .NOT. lsedimentation ) CALL message('', 'Run with lsedimentation = false !', level=em_warn) + IF ( .NOT. laero_micro ) CALL message('', 'Run with laero_micro = false !', level=em_warn) + END IF + IF (lmoz .AND. .NOT. llght) THEN + CALL message('', 'Run with MOZ chemistry but without lightning NO!', level=em_warn) + END IF + + CALL print_status('Age-of-air submodel', laoa) + + CALL message('', separator) + + END IF +#endif + +END SUBROUTINE setsubmodel + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! Flag first tracer defined in a given submodel. +!! +!! @author see above +!! +!! $Id: 1423$ +!! +!! @par Revision History +!! see above +!! +!! @par This subroutine is called by +!! init_subm +!! +!! @par Externals +!! +!! @par Notes +!! not yet used +!! +!! @par Responsible coder +!! M.Schultz@fz-juelich.de +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + SUBROUTINE starttracdef (idm) + ! helper routine to manage tracer ids in submodel list + USE mo_tracdef, ONLY: ntrac + INTEGER, INTENT(in) :: idm + + submlist (idm) % idtfirst = ntrac+1 + END SUBROUTINE starttracdef + + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! Flag last tracer defined in a given submodel. +!! +!! @author see above +!! +!! $Id: 1423$ +!! +!! @par Revision History +!! see above +!! +!! @par This subroutine is called by +!! init_subm +!! +!! @par Externals +!! +!! @par Notes +!! not yet used +!! +!! @par Responsible coder +!! M.Schultz@fz-juelich.de +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + SUBROUTINE endtracdef (idm) + ! helper routine to manage tracer ids in submodel list + USE mo_tracdef, ONLY: ntrac + USE mo_exception, ONLY: message, message_text, em_info, em_error + + INTEGER, INTENT(in) :: idm + + submlist (idm) % idtlast = ntrac + + IF (submlist (idm) % idtfirst > submlist (idm) % idtlast ) THEN + CALL message('init_subm','No tracers defined for submodel '//submlist (idm) % modulename, & + level=em_error) + ELSE + WRITE (message_text,*) submlist (idm) % idtlast - submlist (idm) % idtfirst + 1, & + ' tracers defined for submodel '//submlist (idm) % modulename + CALL message('init_subm', message_text, level=em_info) + END IF + + END SUBROUTINE endtracdef + + + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! Print status of a submodel or parameterisation (active or not active). +!! +!! @author see above +!! +!! $Id: 1423$ +!! +!! @par Revision History +!! see above +!! +!! @par This subroutine is called by +!! setsubmodel +!! +!! @par Externals +!! +!! @par Notes +!! not yet used +!! +!! @par Responsible coder +!! M.Schultz@fz-juelich.de +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +SUBROUTINE print_status (mstring, flag) + + USE mo_exception, ONLY: message, message_text, em_param + + IMPLICIT NONE + + CHARACTER(len=*), intent(in) :: mstring + LOGICAL, intent(in) :: flag + + IF ( flag ) THEN + write(message_text,'(a60,1x,":",a)') mstring,'active' + ELSE + write(message_text,'(a60,1x,":",a)') mstring,'*not* active' + END IF + CALL message('', message_text, level=em_param) + +END SUBROUTINE print_status + + + +SUBROUTINE print_lvalue (mstring, lvalue) + +!------------------------------------------------------------------------------ +! Report the value of a logical, integer or real variable +! Convenience routine interfaced by print_value(mstring, value) + + USE mo_exception, ONLY: message, message_text, em_param + + IMPLICIT NONE + + CHARACTER(len=*), intent(in) :: mstring + LOGICAL, intent(in) :: lvalue + + IF (lvalue) THEN + write(message_text,'(a60,1x,": ",a)') mstring,'TRUE' + ELSE + write(message_text,'(a60,1x,": ",a)') mstring,'FALSE' + END IF + CALL message('', message_text, level=em_param) + +END SUBROUTINE print_lvalue + + + +SUBROUTINE print_ivalue (mstring, ivalue) + + USE mo_exception, ONLY: message, message_text, em_param + + IMPLICIT NONE + + CHARACTER(len=*), intent(in) :: mstring + INTEGER, intent(in) :: ivalue + + write(message_text,'(a60,1x,":",i10)') mstring, ivalue + CALL message('', message_text, level=em_param) + +END SUBROUTINE print_ivalue + + + +SUBROUTINE print_rvalue (mstring, rvalue) + + USE mo_kind, ONLY: wp + USE mo_exception, ONLY: message, message_text, em_param + + IMPLICIT NONE + + CHARACTER(len=*), intent(in) :: mstring + REAL(wp), intent(in) :: rvalue + + write(message_text,'(a60,1x,":",g12.5)') mstring, rvalue + CALL message('', message_text, level=em_param) + +END SUBROUTINE print_rvalue + + + +END MODULE mo_submodel diff --git a/ifs-source/arpifs/phys_ec/mo_time_control.F90 b/ifs-source/arpifs/phys_ec/mo_time_control.F90 new file mode 100644 index 00000000..28a6f2a7 --- /dev/null +++ b/ifs-source/arpifs/phys_ec/mo_time_control.F90 @@ -0,0 +1,19 @@ +Module mo_time_control + USE mo_kind, only : dp + USE YOMRIP , ONLY : YRRIP + IMPLICIT NONE + ! <-- thk: bug fix + !REAL(dp), PUBLIC :: time_step_len = 720.0_dp + REAL(dp), PUBLIC :: time_step_len + !REAL(dp), PUBLIC :: delta_time !eehol: not needed + ! this does not work: + !ASSOCIATE(time_step_len=>YRPHY2%TSPHY) !TeMi + + CONTAINS + SUBROUTINE init_mo_time_control + ! copy the time step length from IFS control structure + time_step_len = YRRIP%TSTEP + END SUBROUTINE init_mo_time_control + ! --> thk +END MODULE mo_time_control + diff --git a/ifs-source/arpifs/phys_ec/mo_tracdef.F90 b/ifs-source/arpifs/phys_ec/mo_tracdef.F90 new file mode 100644 index 00000000..bf3b5418 --- /dev/null +++ b/ifs-source/arpifs/phys_ec/mo_tracdef.F90 @@ -0,0 +1,330 @@ +!> +!! @par Copyright +!! This code is subject to the MPI-M-Software - License - Agreement in it's most recent form. +!! Please see URL http://www.mpimet.mpg.de/en/science/models/model-distribution.html and the +!! file COPYING in the root of the source tree for this code. +!! Where software is supplied by third parties, it is indicated in the headers of the routines. +!! +!! -------------------------------------------------------------------------------------------------- +!!mgs : henry and dryreac removed from trlist (see speclist!) +!!mgs : Cleanups ToDo: +!! -- ndrydep, nwetdep, n... : consistent scheme with -1 = interactive (choice in submodelctl) +!! 0 = OFF +!! 1 = prescribed (boundary condition) +!! -------------------------------------------------------------------------------------------------- + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! Definition of tracer information data type and variable +!! +!! +!! @author +!!
    +!!
  1. ECHAM5 developers +!!
  2. M. Schultz (FZ-Juelich) +!!
  3. S. Rast (MPI-Met) +!!
  4. K. Zhang(MPI-Met) +!!
+!! +!! $Id: 1423$ +!! +!! @par Revision History +!!
    +!!
  1. ECHAM5 developers - (before 2009) +!!
  2. M. Schultz (FZ-Juelich), S. Rast (MPI-Met) - new tracer defination - (2009-05-xx) +!!
  3. K. Zhang (MPI-Met) - implementation in ECHAM6 and doxygen support - (2009-07-20) +!!
+!! +!! @par This module is used by +!! to_be_added +!! +!! @par Notes +!! +!! +!! @par Current responsible coder +!! kai.zhang@zmaw.de +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +MODULE mo_tracdef + + + USE mo_kind, ONLY: dp +#ifdef HAMMOZ + USE mo_advection, ONLY: NO_ADVECTION, &! choice of advection scheme + SEMI_LAGRANGIAN,&! (copied for convenience) + TPCORE ! + USE mo_memory_base, ONLY: AUTO ! flag to chose unique GRIB code + USE mo_linked_list, ONLY: memory_info ! I/O meta information data type + USE mo_time_conversion,ONLY: time_days ! date (days,seconds) data type +#endif + + IMPLICIT NONE + + PRIVATE + + PUBLIC :: trlist ! tracer info list variable + PUBLIC :: t_trlist, t_trinfo, t_flag ! "" type definitions +#ifdef HAMMOZ + PUBLIC :: t_p_mi + PUBLIC :: time_days ! type definition + PUBLIC :: memory_info ! type definition +#endif + PUBLIC :: ln, ll, lf, nf ! length of names in trlist + + PUBLIC :: jptrac ! max. number of tracers + PUBLIC :: ntrac ! number of tracers actually defined (*) + ! Note (*): ntrac always equal trlist% ntrac. + ! It's just more convenient. + + !-- flag values +!!mgs!! PUBLIC :: OK, NAME_USED, NAME_MISS, TABLE_FULL ! error values + ! general flag values + PUBLIC :: OK + PUBLIC :: ON + PUBLIC :: OFF + ! initialization mode 'ninit' + PUBLIC :: INITIAL + PUBLIC :: RESTART + PUBLIC :: CONSTANT + PUBLIC :: PERIODIC + ! 'nsoluble' + PUBLIC :: SOLUBLE + PUBLIC :: INSOLUBLE + ! 'nphase' + PUBLIC :: GAS + PUBLIC :: AEROSOL + PUBLIC :: GAS_OR_AEROSOL + PUBLIC :: AEROSOLMASS + PUBLIC :: AEROSOLNUMBER + PUBLIC :: UNDEFINED + ! choice of advection scheme 'ntran' +#ifdef HAMMOZ + PUBLIC :: NO_ADVECTION + PUBLIC :: SEMI_LAGRANGIAN + PUBLIC :: TPCORE +#endif + ! tracer type 'itrtype' + PUBLIC :: ITRNONE + PUBLIC :: ITRPRESC + PUBLIC :: ITRDIAG + PUBLIC :: ITRPROG + ! choose GRIB code automatically +#ifdef HAMMOZ + PUBLIC :: AUTO +#endif + ! + ! Type declarations + ! + + + ! + ! Limits + ! + INTEGER, PARAMETER :: jptrac = 500 ! maximum number of tracers allowed + + ! + ! Individual settings for each tracer + ! + INTEGER, PARAMETER :: ln = 24 ! length of name (char) components + INTEGER, PARAMETER :: ll = 256 ! length of longname and standardname + INTEGER, PARAMETER :: lf = 8 ! length of flag character string + INTEGER, PARAMETER :: nf = 10 ! number of user defined flags + INTEGER, PARAMETER :: ns = 20 ! max number of submodels + + ! + ! Constants (argument values for new_tracer routine in mo_tracer) + ! + ! + ! error return values + ! + INTEGER, PARAMETER :: OK = 0 + INTEGER, PARAMETER :: NAME_USED = 2 + INTEGER, PARAMETER :: NAME_MISS = 3 + INTEGER, PARAMETER :: TABLE_FULL = 4 + ! + ! general flags + ! + INTEGER, PARAMETER :: OFF = 0 + INTEGER, PARAMETER :: ON = 1 + ! + ! initialisation flag (ninit) + ! + INTEGER, PARAMETER :: CONSTANT = 1 + INTEGER, PARAMETER :: RESTART = 2 + INTEGER, PARAMETER :: INITIAL = 4 + INTEGER, PARAMETER :: PERIODIC = 8 + ! + ! Tracer type + ! + INTEGER, PARAMETER :: ITRNONE = 0 ! No ECHAM tracer + INTEGER, PARAMETER :: ITRPRESC = 1 ! Prescribed tracer, read from file + INTEGER, PARAMETER :: ITRDIAG = 2 ! Diagnostic tracer, no transport + INTEGER, PARAMETER :: ITRPROG = 3 ! Prognostic tracer, transport by ECHAM + ! + ! soluble flag (nsoluble) + ! + INTEGER, PARAMETER :: INSOLUBLE = 0 ! insoluble + INTEGER, PARAMETER :: SOLUBLE = 1 ! soluble + ! + ! phase indicator (nphase) + ! + INTEGER, PARAMETER :: GAS = 1 ! gas + INTEGER, PARAMETER :: AEROSOL = 2 ! aerosol (for species definition) + INTEGER, PARAMETER :: GAS_OR_AEROSOL = 3 ! gas or aerosol (for species definition) + INTEGER, PARAMETER :: AEROSOLMASS = 2 ! aerosol mass + INTEGER, PARAMETER :: AEROSOLNUMBER = -2 ! particle number concentration + INTEGER, PARAMETER :: UNDEFINED = 0 ! other tracers (e.g. CDNC) + + ! + ! General purpose flag (additional tracer property) + ! + TYPE t_flag + CHARACTER(len=lf) :: c ! character string + REAL(dp) :: v ! value + END TYPE t_flag + + ! + ! Individual settings for each tracer + ! Default values are marked with * * + ! + + !=============! + TYPE t_trinfo + !=============! + ! + ! identification of transported quantity + ! + CHARACTER(len=ln) :: basename ! name (instead of xt..) + CHARACTER(len=ln) :: subname ! optional for 'colored' tracer + CHARACTER(len=ln) :: fullname ! name_subname + CHARACTER(len=ln) :: modulename ! name of requesting sub-model + CHARACTER(len=ln) :: units ! units + CHARACTER(len=ll) :: longname ! long name + CHARACTER(len=ll) :: standardname ! CF standard name + INTEGER :: trtype ! type of tracer: 0=undef., 1=prescribed, 2=diagnostic (no transport), + ! *3*=prognostic (transported) + INTEGER :: spid ! species id (index in speclist) where physical/chemical + ! properties are defined + INTEGER :: nphase ! phase (1=GAS, 2=AEROSOLMASS, 3=AEROSOLNUMBER, ...??) + ! [add liquid or ice phase ??] + INTEGER :: mode ! aerosol mode or bin number (default 0) + REAL(dp) :: moleweight ! molecular mass (copied from species upon initialisation) +! INTEGER :: tag ! tag of requesting routine + + ! + ! Requested resources ... + ! + INTEGER :: burdenid ! index in burden diagnostics + INTEGER :: nbudget ! calculate budgets (default 0) + INTEGER :: ntran ! perform transport (default 1) + INTEGER :: nfixtyp ! type of mass fixer for semi lagrangian adv. (default 1) + INTEGER :: nconvmassfix ! use xt_conv_massfix in cumastr + INTEGER :: nvdiff ! vertical diffusion flag (default 1) + INTEGER :: nconv ! convection flag (default 1) + INTEGER :: ndrydep ! dry deposition flag: *0*=no drydep, 1=prescribed vd, + ! 2=Ganzeveld + INTEGER :: nwetdep ! wet deposition flag (default 0) + INTEGER :: nsedi ! sedimentation flag (default 0) + REAL(dp) :: tdecay ! decay time (exponential) (default 0.sec) + INTEGER :: nemis ! surface emission flag (default 0) + ! emission flag: *0*=no emissions, + ! 1=surface flux cond., + ! 2=tendency (2D emis.) [additive] +! INTEGER :: nint ! integration flag (default 1) + + ! + ! initialization and restart + ! + INTEGER :: ninit ! initialization request flag + INTEGER :: nrerun ! rerun flag + REAL(dp) :: vini ! initialisation value (default 0.) + INTEGER :: init ! initialisation method actually used + ! + ! Flags used for postprocessing + ! + INTEGER :: nwrite ! write flag (default 1) + INTEGER :: code ! tracer code, (default 235...) + INTEGER :: table ! tracer code table (default 0) + INTEGER :: gribbits ! bits for encoding (default 16) + INTEGER :: nint ! integration (accumulation) flag (default 1) + + ! + ! Flags to be used by chemistry or tracer modules + ! +!### henry constant will be removed from trlist -- available as species property instead +!!mgs!! REAL(dp) :: henry ! Henry coefficient [?] (default 1.e-10) +!!mgs!! REAL(dp) :: dryreac ! dry reactivity coeff. (default 0.) + INTEGER :: nsoluble ! soluble flag (default 0) + + TYPE(t_flag) :: myflag (nf)! user defined flag +#ifdef HAMMOZ + TYPE(time_days) :: tupdatel ! last update time + TYPE(time_days) :: tupdaten ! next update time +#endif + ! + ! Indicate actions actually performed by ECHAM + ! + + END TYPE t_trinfo + + + ! + ! Reference to memory buffer information for each tracer + ! used to access the 'restart' flags + ! + +#ifdef HAMMOZ + !===========! + TYPE t_p_mi ! pointers to memory info type + !===========! + TYPE (memory_info), POINTER :: xt ! tracers ,meta information + TYPE (memory_info), POINTER :: xtm1 ! tracers at t-dt ,meta information + END TYPE t_p_mi +#endif + + ! + ! Basic data type definition for tracer info list + ! + + !=============! + TYPE t_trlist + !=============! + ! + ! global tracer list information + ! + INTEGER :: ntrac ! number of tracers specified + INTEGER :: anyfixtyp ! mass fixer types used + INTEGER :: anywetdep ! wet deposition requested for any tracer + INTEGER :: anydrydep ! wet deposition requested for any tracer + INTEGER :: anysedi ! sedimentation requested for any tracer + INTEGER :: anysemis ! surface emission flag for any tracer + INTEGER :: anyconv ! convection flag + INTEGER :: anyvdiff ! vertical diffusion flag + INTEGER :: anyconvmassfix ! + INTEGER :: nadvec ! number of advected tracers + LOGICAL :: oldrestart ! true to read old restart format + ! + ! individual information for each tracer + ! + TYPE (t_trinfo) :: ti (jptrac) ! Individual settings for each tracer + ! + ! reference to memory buffer info + ! +#ifdef HAMMOZ + TYPE (t_p_mi) :: mi (jptrac) ! memory buffer information for each tracer + + TYPE (memory_info), POINTER :: mixt ! memory buffer information for XT + TYPE (memory_info), POINTER :: mixtm1 ! memory buffer information for XTM1 +#endif + END TYPE t_trlist + + ! + ! module variables + ! + + TYPE(t_trlist) ,SAVE ,TARGET :: trlist ! tracer list + INTEGER ,SAVE :: ntrac = 0 ! number of tracers actually defined + +END MODULE mo_tracdef + diff --git a/ifs-source/arpifs/phys_ec/mo_tracer.F90 b/ifs-source/arpifs/phys_ec/mo_tracer.F90 new file mode 100644 index 00000000..bcfd950b --- /dev/null +++ b/ifs-source/arpifs/phys_ec/mo_tracer.F90 @@ -0,0 +1,1083 @@ +!> +!! @par Copyright +!! This code is subject to the MPI-M-Software - License - Agreement in it's most recent form. +!! Please see URL http://www.mpimet.mpg.de/en/science/models/model-distribution.html and the +!! file COPYING in the root of the source tree for this code. +!! Where software is supplied by third parties, it is indicated in the headers of the routines. +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!! Definition of tracer meta information and structure for burden diagnostics. Also contains +!! generic routines to define tracers, get tracer ids or retrieve flag values. +!! +!! +!! +!! @author +!!
    +!!
  1. ECHAM5 developers +!!
  2. M. Schultz (FZ-Juelich) +!!
+!! +!! $Id: 1423$ +!! +!! @par Revision History +!!
    +!!
  1. ECHAM5 developers - original code - (before 2009) +!!
  2. M. Schultz (FZ-Juelich) - new tracer definition scheme - (2009-05-xx) +!! +!!
+!! +!! @par This module is used by +!! a lot of subroutines +!! +!! @par Responsible coder +!! m.schultz@fz-juelich.de +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + +MODULE mo_tracer + + USE mo_kind, ONLY: dp + USE mo_util_string, ONLY: separator ! format string (----) +#ifdef HAMMOZ + USE mo_time_conversion, ONLY: tc_set ! routine to set 'time_days' +#endif + USE mo_tracdef, ONLY: trlist, & ! tracer info variable +!!mgs!! t_trlist, & ! tracer info data type + t_trinfo, & ! data type, component of t_trlist + t_flag, & ! data type, component of t_trlist + ln, nf ! len of char components of trlist + USE mo_tracdef, ONLY: jptrac, & ! maximum number of prog. tracers + ntrac, & ! number of tracers defined + RESTART, & + CONSTANT, & ! + GAS, & ! + AEROSOLMASS, & ! + AEROSOLNUMBER ! +! USE mo_memory_gl, ONLY: xt ! tracer field array +! USE mo_memory_g1a, ONLY: xtm1 ! tracer field array (t-1) + USE mo_exception, ONLY: finish, & + message, & + message_text + USE mo_advection, ONLY: iadvec ! selected advection scheme + + IMPLICIT NONE + + + PRIVATE + + + !! Tracer info list + +!!mgs!! PUBLIC :: t_trinfo ! +!!mgs!! PUBLIC :: t_flag ! type definition + + PUBLIC :: nburden, diag_burden, d_burden ! burden diagnostics + + !! Interface routines ! purpose ! called by + + PUBLIC :: new_tracer ! request tracer ! chemical modules +#ifdef HAMMOZ + PUBLIC :: get_tracer ! get reference to tracer ! chemical modules +#endif + PUBLIC :: get_ntrac ! get number of tracers optionally keyed to submodel name +#ifdef HAMMOZ + PUBLIC :: validate_traclist ! evaluate a list of tracer names for certain properties + PUBLIC :: flag ! get value of userdef.flag ! chemical modules + PUBLIC :: init_trlist + PUBLIC :: finish_tracer_definition +#endif + PUBLIC :: new_diag_burden ! get_diag_burden(?) + + ! type declaration + TYPE diag_burden + CHARACTER(len=ln) :: name + INTEGER :: itype ! type of burden calculation (see below) + ! additive binary values + ! ### also add 64 = global totals (old trastat function)? + REAL(dp), POINTER :: ptr1(:,:) ! pointer for type= 1 : total column mass + REAL(dp), POINTER :: ptr2(:,:) ! pointer for type= 2 : tropospheric column mass + REAL(dp), POINTER :: ptr4(:,:) ! pointer for type= 4 : stratospheric column mass + REAL(dp), POINTER :: ptr8(:,:) ! pointer for type= 8 : column density + REAL(dp), POINTER :: ptr16(:,:) ! pointer for type=16 : tropospheric column density + REAL(dp), POINTER :: ptr32(:,:) ! pointer for type=32 : stratospheric column density + END TYPE diag_burden + + ! Parameters + INTEGER, PARAMETER :: nmaxburden = jptrac ! maximum number of burden diagnostics allowed + + ! module variables + INTEGER :: nburden = 0 ! number of burden diagnostics currently defined + +!!mgs!! --- for trastat ---------------------- +!!mgs!! INTEGER :: icount = 0 ! counter for time steps +!!mgs!! -------------------------------------- + + + TYPE (diag_burden) :: d_burden(nmaxburden) + + +!!mgs!! --- for trastat ---------------------- +!!mgs!! REAL(dp), ALLOCATABLE :: tropm (:,:) ! zonal mass budgets of tracers, troposphere +!!mgs!! REAL(dp), ALLOCATABLE :: stratm(:,:) ! zonal mass budgets of tracers, stratosphere +!!mgs!! -------------------------------------- + + + !! error return values + + INTEGER, PARAMETER :: OK = 0 + INTEGER, PARAMETER :: NAME_USED = 2 + INTEGER, PARAMETER :: NAME_MISS = 3 + INTEGER, PARAMETER :: TABLE_FULL = 4 + INTEGER, PARAMETER :: UNDEFINED = 5 !mgs + INTEGER, PARAMETER :: INVALID_ID = 6 !mgs + + INTEGER ,PARAMETER :: IUNDEF = -999 + REAL(dp) ,PARAMETER :: RUNDEF = -999.0_dp + + + !! interfaces +#ifdef HAMMOZ + INTERFACE flag + MODULE PROCEDURE flag_by_name + MODULE PROCEDURE flag_by_index + END INTERFACE ! flag +#endif + + CONTAINS + + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! Set defaults of the tracer info data type. +!! +!! @author see above +!! +!! $Id: 1423$ +!! +!! @par Revision History +!! see above +!! +!! @par This subroutine is called by +!! initialize +!! +!! @par Externals: +!!
    +!!
  1. None +!!
+!! +!! @par Notes +!! combination of the original code and mgs02 +!! +!! @par Responsible coder +!! kai.zhang@zmaw.de +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +#ifdef HAMMOZ + SUBROUTINE init_trlist + + INTEGER :: i + + trlist% ti(:)% code = 0 + trlist% ti(:)% table = 131 ! MPI-Meteorology, Hamburg + trlist% ti(:)% gribbits = 16 + trlist% ti(:)% basename = '' + trlist% ti(:)% subname = '' + trlist% ti(:)% fullname = '' + trlist% ti(:)% modulename = '' + trlist% ti(:)% units = '' + trlist% ti(:)% longname = '' + trlist% ti(:)% moleweight = 0._dp! molecular mass (copied from species upon initialisation) + + trlist% ti(:)% nbudget = 0 + trlist% ti(:)% ntran = iadvec + trlist% ti(:)% nfixtyp = 1 + trlist% ti(:)% nvdiff = 1 + trlist% ti(:)% nconv = 1 + + trlist% ti(:)% nwrite = 1 + trlist% ti(:)% ninit = RESTART+CONSTANT + trlist% ti(:)% vini = 0._dp + trlist% ti(:)% ndrydep = 0 + trlist% ti(:)% nwetdep = 0 + trlist% ti(:)% nsedi = 0 + trlist% ti(:)% nemis = 0 + trlist% ti(:)% nint = 1 ! default: accumulate (average) tracer concentrations + + trlist% ti(:)% nsoluble = 0 + trlist% ti(:)% nphase = 0 ! phase undefined + trlist% ti(:)% mode = 0 ! aerosol mode or bin (0 is ok for gas-phase tracers) + trlist% ti(:)% init = 0 + trlist% ti(:)% nrerun = 1 ! save in rerun file + + !ori but not msg02 +!!mgs!! trlist% ti(:)% henry = 1.e-10_dp +!!mgs!! trlist% ti(:)% dryreac = 0._dp + trlist% ti(:)% tdecay = 0._dp + + !msg02 but not ori + trlist% ti(:)% standardname = '' + trlist% ti(:)% trtype = 0 ! tracer undefined + trlist% ti(:)% spid = 0 ! no species index attached + trlist% ti(:)% burdenid = -1 + + + DO i = 1, UBOUND(trlist% ti,1) + trlist% ti(i) % myflag = t_flag ('',0._dp) + CALL tc_set (0,0,trlist% ti(i)% tupdatel) + CALL tc_set (0,0,trlist% ti(i)% tupdaten) + END DO + + END SUBROUTINE init_trlist +#endif + + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! Print tracer information as set by namelist and modules. +!! +!! @author see above +!! +!! $Id: 1423$ +!! +!! @par Revision History +!! see above +!! +!! @par This subroutine is called by +!! finish_tracer_definition +!! +!! @par Externals: +!!
    +!!
  1. None +!!
+!! +!! @par Notes +!! original version +!! +!! +!! @par Responsible coder +!! kai.zhang@zmaw.de +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + +#ifdef HAMMOZ + SUBROUTINE printtrac !! please keep this subroutine for testing use + + USE mo_mpi, ONLY: p_parallel_io + + INTEGER :: i + CHARACTER(len=*) ,PARAMETER :: form = '(2x,i4,1x,2a16,2i5,3i2,g11.3,6i2)' + + + IF (ntrac > 0 .AND. p_parallel_io) THEN + CALL message('',separator) + CALL message('','') + WRITE(message_text,'(a,i4)') ' Number of tracers:', trlist% ntrac + CALL message('',message_text) + CALL message('','') + IF (ntrac > 0) THEN + CALL message('',' p r n w d s s p m') + CALL message('',' r e i e r e o h o') + CALL message('',' grib i s n t y d l a d') + CALL message('',' name module code table n t i vini d d i u s e') + CALL message('',' t a t e e b e ') + CALL message('',' r p p l ') + ENDIF + CALL message('','') + DO i=1,ntrac + WRITE(message_text,form) i, & + trlist% ti(i)% fullname, & + trlist% ti(i)% modulename, & + trlist% ti(i)% code, & + trlist% ti(i)% table, & + trlist% ti(i)% nwrite, & + trlist% ti(i)% nrerun, & + trlist% ti(i)% ninit, & + trlist% ti(i)% vini, & + trlist% ti(i)% nwetdep, & + trlist% ti(i)% ndrydep, & + trlist% ti(i)% nsedi, & + trlist% ti(i)% nsoluble, & + trlist% ti(i)% nphase, & + trlist% ti(i)% mode + CALL message('',message_text) + END DO + CALL message('','') + CALL message('',separator) + ENDIF + + END SUBROUTINE printtrac +#endif + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! Print tracer information as set by namelist and modules. +!! +!! @author see above +!! +!! $Id: 1423$ +!! +!! @par Revision History +!! see above +!! +!! @par This subroutine is called by +!! finish_tracer_definition +!! +!! @par Externals: +!!
    +!!
  1. None +!!
+!! +!! @par Notes +!! new version by Martin +!! +!! +!! @par Responsible coder +!! kai.zhang@zmaw.de +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +#ifdef HAMMOZ + SUBROUTINE printtrac2 + + + USE mo_mpi, ONLY: p_parallel_io + USE mo_tracdef, ONLY: trlist, &! tracer info variable + ITRPRESC, &! tracer type + ITRDIAG, &! ... + ITRPROG ! ... + USE mo_exception, ONLY: message, & + message_text, & + em_param + + + INTEGER :: i + CHARACTER(len=*) ,PARAMETER :: form1 = '(2x,2a16,6i6,g11.3)' + CHARACTER(len=*) ,PARAMETER :: form2 = '(2x,2a16,6i6,g11.3)' + CHARACTER(len=6) :: ctype, cphase + + + IF (p_parallel_io) THEN + CALL message('',separator) + CALL message('','', level=em_param) + WRITE(message_text,'(a,i4)') ' Number of tracers:', trlist% ntrac + CALL message('',message_text, level=em_param) + CALL message('','', level=em_param) + IF (ntrac > 0) THEN + CALL message('',' Tracer properties and processes:', level=em_param) + CALL message('',' name module type phase mode species ndryd nwetd nsedi nsol', & + level=em_param) + CALL message('','', level=em_param) + DO i=1,ntrac + ctype = ' undef' + SELECT CASE (trlist% ti(i)% trtype) + CASE (ITRPRESC) ; ctype = ' presc' + CASE (ITRDIAG) ; ctype = ' diag' + CASE (ITRPROG) ; ctype = ' progn' + END SELECT + cphase = ' undef' + SELECT CASE (trlist% ti(i)% nphase) + CASE (GAS) ; cphase = ' gas' + CASE (AEROSOLMASS) ; cphase = ' aerom' + CASE (AEROSOLNUMBER) ; cphase = ' aeron' + END SELECT + WRITE(message_text,form1) trlist% ti(i)% fullname, & + trlist% ti(i)% modulename, & + ctype, & + cphase, & + trlist% ti(i)% mode, & + trlist% ti(i)% spid, & + trlist% ti(i)% ndrydep, & + trlist% ti(i)% nwetdep, & + trlist% ti(i)% nsedi, & + trlist% ti(i)% nsoluble + CALL message('',message_text, level=em_param) + CALL message('','', level=em_param) + END DO + CALL message('','', level=em_param) + CALL message('',' Tracer initialisation and output:', level=em_param) + CALL message('',' name module nwrite nint grbc grbt ninit nrerun vini', & + level=em_param) + CALL message('','', level=em_param) + DO i=1,ntrac + WRITE(message_text,form2) trlist% ti(i)% fullname, & + trlist% ti(i)% modulename, & + trlist% ti(i)% nwrite, & + trlist% ti(i)% nint, & + trlist% ti(i)% code, & + trlist% ti(i)% table, & + trlist% ti(i)% ninit, & + trlist% ti(i)% nrerun, & + trlist% ti(i)% vini + CALL message('',message_text, level=em_param) + END DO + CALL message('','', level=em_param) + ENDIF + CALL message('',separator) + ENDIF + + END SUBROUTINE printtrac2 +#endif + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! Call this routine from modules to define new tracers +!! +!! Normally, before defining a tracer, the corresponding species metadata should be +!! defined by calling the new_species subroutine. New_tracer will then store +!! the species index in the spid field. +!! If spid and nphase are valid, name can be left empty. In this case, the species +!! shortname will be used as tracer name. +!! For backward-compatibility new_tracer can also be called if the corresponding species +!! has not been defined. In this case, a new species will be created based on the +!! parameters provided (at a minimum, name and moleweight must be given). Note, +!! however, that new_tracer allows to control fewer parameters than new_species. +!! It is therefore recommended to adapt existing code to use new_species first and +!! new_tracer with the species id. +!! +!! @author see above +!! +!! $Id: 1423$ +!! +!! @par Revision History +!! see above +!! +!! @par This subroutine is called by +!! initrac +!! +!! @par Externals: +!!
    +!!
  1. None +!!
+!! +!! @par Notes +!! original version +!! +!! +!! @par Responsible coder +!! kai.zhang@zmaw.de +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + + SUBROUTINE new_tracer (name, modulename, spid, subname, longname, & ! names... + units, trtype, nphase, mode, & + ninit, nrerun, vini, & ! initialisation + nwrite, nint, code, table, bits, & ! output + burdenid, nbudget, & ! diagnostics + ntran, nfixtyp, nvdiff, nconv, & ! processes + ndrydep, nwetdep, nsedi, nemis, nsoluble, & + moleweight, tdecay, & ! species properties + !!mgs!! moleweight, henry, dryreac, tdecay, & ! species properties + idx, myflag, ierr) ! return info + + USE mo_exception, ONLY: message, message_text, em_warn, em_error + + CHARACTER(len=*) ,INTENT(in) :: name ! name of tracer + CHARACTER(len=*) ,INTENT(in) :: modulename! name of routine/module + INTEGER ,INTENT(in) ,OPTIONAL :: spid ! species index + CHARACTER(len=*) ,INTENT(in) ,OPTIONAL :: subname ! optional for 'colored' + CHARACTER(len=*) ,INTENT(in) ,OPTIONAL :: longname ! long name + CHARACTER(len=*) ,INTENT(in) ,OPTIONAL :: units ! units + INTEGER ,INTENT(in) ,OPTIONAL :: trtype ! tracer type + INTEGER ,INTENT(in) ,OPTIONAL :: nphase ! phase indicator + INTEGER ,INTENT(in) ,OPTIONAL :: mode ! mode indicator or bin number + INTEGER ,INTENT(in) ,OPTIONAL :: ninit ! initialisation flag + INTEGER ,INTENT(in) ,OPTIONAL :: nrerun ! restart flag + REAL(dp) ,INTENT(in) ,OPTIONAL :: vini ! initialisation value + INTEGER ,INTENT(in) ,OPTIONAL :: nwrite ! flag to print tracer + INTEGER ,INTENT(in) ,OPTIONAL :: nint ! integration flag + INTEGER ,INTENT(in) ,OPTIONAL :: code ! grib code + INTEGER ,INTENT(in) ,OPTIONAL :: table ! grib table + INTEGER ,INTENT(in) ,OPTIONAL :: bits ! grib encoding bits + INTEGER ,INTENT(in) ,OPTIONAL :: burdenid ! burden diagnostics number + INTEGER ,INTENT(in) ,OPTIONAL :: nbudget ! budget diagnostics + INTEGER ,INTENT(in) ,OPTIONAL :: ntran ! transport switch + INTEGER ,INTENT(in) ,OPTIONAL :: nfixtyp ! type of mass fixer + INTEGER ,INTENT(in) ,OPTIONAL :: nvdiff ! vertical diffusion fl. + INTEGER ,INTENT(in) ,OPTIONAL :: nconv ! convection flag + INTEGER ,INTENT(in) ,OPTIONAL :: ndrydep ! dry deposition flag + INTEGER ,INTENT(in) ,OPTIONAL :: nwetdep ! wet deposition flag + INTEGER ,INTENT(in) ,OPTIONAL :: nsedi ! sedimentation flag + INTEGER ,INTENT(in) ,OPTIONAL :: nemis ! surface emission flag + INTEGER ,INTENT(in) ,OPTIONAL :: nsoluble ! soluble flag + + !! species properties (to be removed in future versions (ICON?)) + REAL(dp) ,INTENT(in) ,OPTIONAL :: moleweight! molecular weight +!!mgs!! REAL(dp) ,INTENT(in) ,OPTIONAL :: henry ! Henry coefficient +!!mgs!! REAL(dp) ,INTENT(in) ,OPTIONAL :: dryreac ! reactivity coefficient + REAL(dp) ,INTENT(in) ,OPTIONAL :: tdecay ! tracer exp-decay-time + TYPE(t_flag) ,INTENT(in) ,OPTIONAL :: myflag(:) ! user defined flags + + !! return values + INTEGER ,INTENT(out) ,OPTIONAL :: idx ! position in tracerinfo + INTEGER ,INTENT(out) ,OPTIONAL :: ierr ! error return value + + INTEGER :: i + CHARACTER(len=ln) :: fullname + TYPE(t_trinfo) ,POINTER :: ti + LOGICAL :: lspec ! species id provided as input? + !INTEGER :: iphase ! local copy -- needed for species definition + ! Variable IPHASE set but never referenced + CHARACTER(len=ln) :: cname ! local copy + INTEGER :: ispid ! local copy of species index + INTEGER :: ierrlevel ! local error level (em_error if ierr not present, em_warn otherwise) + ! "module settings": ### these default values should be re-defined in the wetdep and drydep modules + ! ### in analogy to iadvec in mo_transport. Then one would find a USE mo_drydep, ONLY: idrydep here. + !INTEGER, PARAMETER :: iwetdep = 1 + !INTEGER, PARAMETER :: idrydep= 2 ! interactive Ganzeveld scheme + !INTEGER, PARAMETER :: isoluble= 1 + ! + ! note: nconvmassfix is set automatically (ON for aerosol tracers, OFF for others) + ! + ! set default values for optional INTENT(out) parameters + ! + IF (PRESENT(ierr)) ierr = UNDEFINED ! fail safe + IF (PRESENT(idx)) idx = 0 + + ! set error level for message output + IF (PRESENT(ierr)) THEN + ierrlevel = em_warn + ELSE + ierrlevel = em_error + END IF + + ! test for presence of valid spid + lspec = PRESENT(spid) + ispid = 0 + + IF (lspec) THEN + ! ### WARNING: no error check for validity of species index value ! + ispid = spid + END IF + + ! make sure that nphase is defined if spid is given + IF (lspec) THEN + ! IF (PRESENT(nphase)) THEN + ! iphase = nphase + ! ELSE + ! iphase = 0 + ! CALL message('new_tracer', 'Undefined phase for tracer ' // TRIM(name), level=em_error) + ! END IF + ! Variable IPHASE set but never referenced !! + IF (.NOT. PRESENT(nphase)) & + CALL message('new_tracer', 'Undefined phase for tracer ' // TRIM(name), level=em_error) + END IF + + ! + ! derive full name + ! + ! error if name is empty + cname = name + IF (LEN_TRIM(name) == 0) THEN + WRITE(message_text,*) 'Empty species name, ntrac=', ntrac + CALL message('new_tracer', message_text, level=em_error) + END IF +!++mgs: fix for empty subnames (mo_ham_m7_trac) + IF(PRESENT(subname)) THEN + IF(TRIM(subname) /= '') THEN + fullname = TRIM(cname)//'_'//subname + ELSE + fullname = cname + END IF +!--mgs + ELSE + fullname = cname + END IF + ! + ! check for table full and name used errors + ! + IF (ntrac >= jptrac) THEN + WRITE (message_text, *) 'Tracer table full. jptrac =',jptrac + CALL finish('new_tracer', message_text) + IF (PRESENT(ierr)) ierr = TABLE_FULL + RETURN + END IF + IF (ANY(trlist% ti(1:ntrac)% fullname==fullname)) THEN + CALL message('new_tracer', 'Tracer name already used: ' // TRIM(fullname), level=ierrlevel) + IF (PRESENT(ierr)) ierr = NAME_USED + RETURN + ENDIF + + + ! complete warnings +!!mgs!! IF (PRESENT(henry)) CALL message('new_tracer', 'Henry value definition obsolete - now done in new_species.' & +!!mgs!! // ' Value will be ignored.', level=em_warn) + ! + ! set tracer info for the new tracer + ! + ntrac = ntrac + 1 + trlist% ntrac = ntrac + ti => trlist% ti (ntrac) + IF (PRESENT(idx)) idx = ntrac + IF (PRESENT(ierr)) ierr = OK ! now we have a valid new entry even if it may contain rubbish + ! + ! special handling for colored tracers: + ! take over properties of previous tracer + ! use same attributes + ! + IF (PRESENT(subname) .AND. ntrac > 1) THEN + DO i=1,ntrac-1 + IF ( trlist% ti (i)% basename == name & + .AND.trlist% ti (i)% subname == '' ) THEN + ti = trlist% ti (i) + IF (trlist% ti (i)% code > 0) ti% code = 0 + ENDIF + END DO + ENDIF + ! + ! define tracer properties + ! + ti% basename = name + ti% fullname = fullname + ti% modulename = modulename + ti% longname = fullname + ti% spid = ispid + + IF (PRESENT(subname)) ti% subname = subname + IF (PRESENT(longname)) ti% longname = longname + IF (PRESENT(units)) ti% units = units + IF (PRESENT(trtype)) ti% trtype = trtype + IF (PRESENT(nphase)) ti% nphase = nphase + IF (PRESENT(mode)) ti% mode = mode + IF (PRESENT(ninit)) ti% ninit = ninit + IF (PRESENT(nrerun)) ti% nrerun = nrerun + IF (PRESENT(vini)) ti% vini = vini + IF (PRESENT(nwrite)) ti% nwrite = nwrite + IF (PRESENT(nint)) ti% nint = nint + IF (PRESENT(code)) ti% code = code + IF (PRESENT(table)) ti% table = table + IF (PRESENT(bits)) ti% gribbits = bits + IF (PRESENT(burdenid)) ti% burdenid = burdenid + IF (PRESENT(nbudget)) ti% nbudget = nbudget + IF (PRESENT(ntran)) ti% ntran = ntran + IF (PRESENT(nfixtyp)) ti% nfixtyp = nfixtyp + IF (PRESENT(nvdiff)) ti% nvdiff = nvdiff + IF (PRESENT(nconv)) ti% nconv = nconv + IF (PRESENT(ndrydep)) ti% ndrydep = ndrydep + IF (PRESENT(nwetdep)) ti% nwetdep = nwetdep + IF (PRESENT(nsedi)) ti% nsedi = nsedi + IF (PRESENT(nemis)) ti% nemis = nemis + IF (PRESENT(nsoluble)) ti% nsoluble = nsoluble + IF (PRESENT(moleweight)) ti% moleweight = moleweight +!!mgs!! IF (PRESENT(henry)) ti% henry = henry +!!mgs!! IF (PRESENT(dryreac)) ti% dryreac = dryreac + IF (PRESENT(tdecay)) ti% tdecay = tdecay + + ! set nconvmassfix + ti% nconvmassfix = 0 + IF (ti% nphase == AEROSOLMASS .OR. ti% nphase == AEROSOLNUMBER) ti% nconvmassfix = 1 + + IF (PRESENT(myflag)) THEN + IF (SIZE(myflag) > nf) CALL finish ('new_tracer','size(myflag) > nf') + ti% myflag (:SIZE(myflag)) = myflag + ENDIF + + IF (PRESENT(myflag)) THEN + IF (SIZE(myflag) > nf) CALL finish ('new_tracer','size(myflag) > nf') + ti% myflag (:SIZE(myflag)) = myflag + ENDIF + + ! + ! Add tracer index to species structure + ! + + END SUBROUTINE new_tracer + +#ifdef HAMMOZ + + FUNCTION flag_by_name (string, name, subname, undefined) RESULT (value) + REAL(dp) :: value ! value of flag + CHARACTER(len=*) ,INTENT(in) :: string ! name of flag + CHARACTER(len=*) ,INTENT(in) :: name ! name of tracer + CHARACTER(len=*) ,INTENT(in) ,OPTIONAL :: subname ! subname of tracer + REAL(dp) ,INTENT(in) ,OPTIONAL :: undefined ! return value on error + INTEGER :: i + CHARACTER(len=ln) :: fullname + + IF(PRESENT(subname)) THEN + fullname = name//'_'//subname + ELSE + fullname = name + ENDIF + + DO i=1,trlist% ntrac + IF (trlist% ti(i)% fullname == fullname) THEN + value = flag (string, i, undefined) + RETURN + ENDIF + END DO + + CALL finish ('function flag','tracer not found: '//fullname) + + END FUNCTION flag_by_name + + + + FUNCTION flag_by_index (string, idx, undefined) RESULT (value) + REAL(dp) :: value ! value of flag + CHARACTER(len=*) ,INTENT(in) :: string ! name of flag + INTEGER ,INTENT(in) :: idx ! index of tracer + REAL(dp) ,INTENT(in) ,OPTIONAL :: undefined ! return value on error + + INTEGER :: j + + DO j=1,nf + IF (trlist% ti(idx)% myflag(j)% c == string) THEN + value = trlist% ti(idx)% myflag(j)% v + RETURN + ENDIF + END DO + + IF (PRESENT (undefined)) THEN + value = undefined + RETURN + ELSE + CALL finish ('function flag','flag not found: '//string) + ENDIF + + END FUNCTION flag_by_index + + SUBROUTINE get_tracer (name, subname, modulename, idx, pxt, pxtm1, ierr) + ! + ! get pointer or index of tracer + ! + CHARACTER(len=*) ,INTENT(in) :: name ! name of tracer + CHARACTER(len=*) ,INTENT(in) ,OPTIONAL :: subname ! subname of tracer + CHARACTER(len=*) ,INTENT(out) ,OPTIONAL :: modulename ! name of module + INTEGER ,INTENT(out) ,OPTIONAL :: idx ! index of tracer + REAL(dp) ,POINTER ,OPTIONAL :: pxt (:,:,:) ! pointer to tracer + REAL(dp) ,POINTER ,OPTIONAL :: pxtm1(:,:,:) ! ptr to tr. at t-1 + INTEGER ,INTENT(out) ,OPTIONAL :: ierr ! error return value + + CHARACTER(len=ln) :: fullname + INTEGER :: i + + + IF(PRESENT(subname)) THEN + fullname = name//'_'//subname + ELSE + fullname = name + ENDIF + + IF (PRESENT(modulename)) modulename='' + IF (PRESENT(idx)) idx=0 + IF (PRESENT(pxt)) NULLIFY(pxt) + IF (PRESENT(pxtm1)) NULLIFY(pxtm1) + + DO i=1, trlist% ntrac + IF (trlist% ti(i)% fullname == fullname) THEN + IF (PRESENT(modulename)) modulename = trlist% ti(i)% modulename + IF (PRESENT(idx)) idx = i + IF (PRESENT(pxt)) pxt => xt (:,:,i,:) + IF (PRESENT(pxtm1)) pxtm1 => xtm1 (:,:,i,:) + IF (PRESENT(ierr)) ierr = 0 + RETURN + ENDIF + END DO + + IF (PRESENT(ierr)) THEN + ierr = 1 + ELSE + CALL finish ('get_tracer','tracer not found: '//fullname) + ENDIF + + END SUBROUTINE get_tracer +#endif + +!! get_ntrac: return number of tracers defined, optionally keyed by submodel name + + FUNCTION get_ntrac (tsubmname) RESULT (itrac) + + INTEGER :: itrac + CHARACTER(len=*), INTENT(in), OPTIONAL :: tsubmname + + INTEGER :: jt + + itrac = 0 + + IF (PRESENT(tsubmname)) THEN + DO jt = 1,ntrac + IF (trlist%ti(jt)%modulename == tsubmname) itrac = itrac + 1 + END DO + ELSE + itrac = ntrac ! return number of all tracers + END IF + + END FUNCTION +#ifdef HAMMOZ + !@brief: evaluate a list of tracer names for certain properties + !! + !! the tracnam array will contain only valid tracer names after this routine. + !! invalid names will be set to empty strings (there may thus be "holes" in the array) + + SUBROUTINE validate_traclist(tracnam, defaultnam, nphase, & + ltran, ldrydep, lwetdep, lsedi, lemis) + + USE mo_tracdef, ONLY: ln, jptrac, ntrac, trlist + USE mo_string_utls, ONLY: st1_in_st2_idx + USE mo_util_string, ONLY: tolower + USE mo_exception, ONLY: finish, message, message_text, em_error, em_warn + USE mo_mpi, ONLY: p_parallel_io + + CHARACTER(len=*), INTENT(inout) :: tracnam(:) ! tracer names to be tested + CHARACTER(len=*), OPTIONAL, INTENT(in) :: defaultnam(:) ! default names in list + ! expanded when first entry is 'default' + INTEGER, OPTIONAL, INTENT(in) :: nphase ! phase value to be tested + LOGICAL, OPTIONAL, INTENT(in) :: ltran ! test for ntran>0 + LOGICAL, OPTIONAL, INTENT(in) :: ldrydep ! test for ndrydep>0 + LOGICAL, OPTIONAL, INTENT(in) :: lwetdep ! test for nwetdep>0 + LOGICAL, OPTIONAL, INTENT(in) :: lsedi ! test for nsedi>0 + LOGICAL, OPTIONAL, INTENT(in) :: lemis ! test for nemis>0 + + CHARACTER(len=ln) :: allnam(jptrac) ! complete array of tracer names defined + INTEGER :: tridx(jptrac) ! map tracnam to trlist indices + INTEGER :: listsize, ndef, jt, ind + LOGICAL :: ltest(jptrac) ! result of tracer property test + LOGICAL :: lspecial ! default or all option was used + + !-- initialize + listsize = SIZE(tracnam) + IF (p_parallel_io) write(0,*) 'tracnam list size = ',listsize, ' string length = ',LEN(tracnam(1)) + ltest(:) = .true. ! default: accept all tracers as valid + lspecial = .false. + ndef = 0 ! number of tracers copied from default list + DO jt = 1,ntrac + allnam(jt) = trlist%ti(jt)%fullname + END DO + tridx(:) = 0 + + !-- establish list of valid tracer names + !-- handle special keyword "all" + IF (tolower(tracnam(1)) == 'all') THEN + DO jt = 1,ntrac + tracnam(jt) = TRIM(allnam(jt)) + END DO + lspecial = .true. + END IF + + !-- handle special keyword "default" + IF (tolower(tracnam(1)) == 'default') THEN + IF (PRESENT(defaultnam)) THEN + ndef = SIZE(defaultnam) + !-- copy extra entries after "default" to make room for default tracers + ! (in extreme cases some tracers could get lost, but this would mean a bizarre tracnam list) + DO jt = listsize-ndef,2,-1 + tracnam(jt+ndef) = tracnam(jt) + END DO + !-- fill in the default tracer names + DO jt=1,ndef + tracnam(jt) = TRIM(defaultnam(jt)) + END DO + lspecial = .true. + ELSE + CALL message('validate_traclist', 'Found string "default" in tracnam, '// & + 'but there is no defaultnam argument!', level=em_error) + tracnam(1) = '' + END IF + END IF + + !-- validity check: make sure that all tracers in tracnam are valid tracer names + DO jt = 1, listsize + ind = st1_in_st2_idx(tracnam(jt), allnam) + IF (ind <= 0) THEN + !-- report error and remove invalid tracer name + IF (TRIM(tracnam(jt)) /= '' .AND. (.NOT. lspecial .OR. (lspecial .AND. jt > ndef))) THEN + WRITE (message_text,'(a,a,a,i0,a)') 'Invalid tracer name in tracnam list : ', & + '>'//TRIM(tracnam(jt))//'<', ', ind = ',jt,' (simply discarded)' + CALL message('validate_traclist', message_text, level=em_warn) + + END IF + !-- defuse invalid tracnam + tracnam(jt) = '' + ELSE + tridx(jt) = ind + END IF + END DO + + !-- tracer property tests + IF (PRESENT(nphase)) THEN + DO jt = 1,listsize + IF (tridx(jt) > 0) THEN + ! test if tracer nphase is not equal to argument. If so, set ltest(jt) to false + IF (trlist%ti(tridx(jt))%nphase /= nphase) ltest(jt) = .false. +!! IF (trlist%ti(tridx(jt))%nphase /= nphase) write(0,*) '##DEBUG## ltest(',jt,')=false because nphase/=',nphase + END IF + END DO + END IF + IF (PRESENT(ltran)) THEN + DO jt = 1,listsize + IF (tridx(jt) > 0) THEN + ! test if tracer is not transported. If so, remove from list + IF (trlist%ti(tridx(jt))%ntran == 0) ltest(jt) = .false. +!! IF (trlist%ti(tridx(jt))%ntran == 0) write(0,*) '##DEBUG## ltest(',jt,')=false because ntran = 0' + END IF + END DO + END IF + IF (PRESENT(ldrydep)) THEN + DO jt = 1,listsize + IF (tridx(jt) > 0) THEN + ! test if tracer is attached to dry deposition scheme + IF (trlist%ti(tridx(jt))%ndrydep == 0) ltest(jt) = .false. +!! IF (trlist%ti(tridx(jt))%ndrydep == 0) write(0,*) '##DEBUG## ltest(',jt,')=false because ndrydep==0' + END IF + END DO + END IF + IF (PRESENT(lwetdep)) THEN + DO jt = 1,listsize + IF (tridx(jt) > 0) THEN + ! test if tracer is attached to wet deposition scheme + IF (trlist%ti(tridx(jt))%nwetdep == 0) ltest(jt) = .false. +!! IF (trlist%ti(tridx(jt))%nwetdep == 0) write(0,*) '##DEBUG## ltest(',jt,')=false because nwetdep==0' + END IF + END DO + END IF + IF (PRESENT(lsedi)) THEN + DO jt = 1,listsize + IF (tridx(jt) > 0) THEN + ! test if tracer is attached to sedimentation scheme + IF (trlist%ti(tridx(jt))%nsedi == 0) ltest(jt) = .false. +!! IF (trlist%ti(tridx(jt))%nsedi == 0) write(0,*) '##DEBUG## ltest(',jt,')=false because nsedi==0' + END IF + END DO + END IF + IF (PRESENT(lemis)) THEN + DO jt = 1,listsize + IF (tridx(jt) > 0) THEN + ! test if tracer is attached to emissions scheme + IF (trlist%ti(tridx(jt))%nemis == 0) ltest(jt) = .false. +!! IF (trlist%ti(tridx(jt))%nemis == 0) write(0,*) '##DEBUG## ltest(',jt,')=false because nemis==0' + END IF + END DO + END IF + + !-- remove "false" tracers from tracnam list + DO jt = 1,listsize + IF (.NOT. ltest(jt)) tracnam(jt) = '' + END DO + +!###DEBUG### +IF (p_parallel_io) THEN +write(0,*) '---------------------------------------------------------' +write(0,*) 'validate_traclist: final tracnam list' +DO jt=1,listsize +IF (TRIM(tracnam(jt)) /= '') write(0,*) jt,': ',tracnam(jt) +END DO +write(0,*) '---------------------------------------------------------' +END IF + END SUBROUTINE validate_traclist + + + + SUBROUTINE finish_tracer_definition + + ! Description: + ! + ! Set global flags for trlist and print tracer definitions. + ! + ! *finish_tracer_definition* is called from *initialise*. + ! + ! Local scalars: + + INTEGER :: jt + + +! trlist% ntrac = ntrac ! not needed because these fields are synchronized in new_tracer + trlist% anyfixtyp = 0 + trlist% anydrydep = 0 + trlist% anywetdep = 0 + trlist% anysedi = 0 + trlist% anysemis = 0 + trlist% anyvdiff = 0 + trlist% anyconv = 0 + trlist% anyconvmassfix = 0 + trlist% nadvec = COUNT (trlist% ti(1:ntrac)% ntran /= 0) + DO jt=1,ntrac + trlist% anyfixtyp = IOR (trlist% anyfixtyp, trlist% ti(jt)% nfixtyp) + trlist% anydrydep = IOR (trlist% anydrydep, trlist% ti(jt)% ndrydep) + trlist% anywetdep = IOR (trlist% anywetdep, trlist% ti(jt)% nwetdep) + trlist% anysedi = IOR (trlist% anysedi, trlist% ti(jt)% nsedi) + trlist% anysemis = IOR (trlist% anysemis, trlist% ti(jt)% nemis) + trlist% anyvdiff = IOR (trlist% anyvdiff, trlist% ti(jt)% nvdiff) + trlist% anyconv = IOR (trlist% anyconv, trlist% ti(jt)% nconv) + trlist% anyconvmassfix = IOR (trlist% anyconvmassfix, trlist% ti(jt)% nconvmassfix) + END DO + + trlist% oldrestart = .FALSE. + + ! + ! printout + ! +#ifdef HAMMOZ + CALL printtrac +#endif + + END SUBROUTINE finish_tracer_definition + +#endif +!--- initialize burden diagnostics --------------------------------------- + + ! Description: + ! + ! Preparations for diagnostics of tracer burdens (column integrals) + ! + ! Authors: + ! + ! P. Stier, MPI, 2001, original source + ! M. Schultz, FZ Juelich - adaptation to ECHAM6 (2009-09-25) + ! + ! for more details see file AUTHORS + ! + + INTEGER FUNCTION new_diag_burden (name, itype, lclobber) + + USE mo_exception, ONLY : message, em_error, em_info + + ! Arguments + CHARACTER(len=*), INTENT(in) :: name + INTEGER, INTENT(in), OPTIONAL :: itype + LOGICAL, INTENT(in), OPTIONAL :: lclobber ! return existing index if true, error if false + + ! Local variables + INTEGER :: jtype, jn + LOGICAL :: loclob + + ! Set defaults and check arguments + new_diag_burden = -1 + jtype = 1 ! total column mass + IF (PRESENT(itype)) jtype = itype + IF (jtype > 7) CALL message('new_diag_burden', 'ITYPE > 7 presently not implemented!', level=em_error) + loclob = .false. ! return error if burden name already defined + IF (PRESENT(lclobber)) loclob = lclobber + + ! look for existing burden diag of the same name + DO jn = 1,nburden + IF (TRIM(d_burden(jn)%name) == TRIM(name)) THEN + IF (loclob) THEN + new_diag_burden = jn + ELSE + CALL message('new_diag_burden', 'Burden diagnostics with name '//name//' already defined!', & + level=em_error) + END IF + RETURN ! nothing else to be done + END IF + END DO + + ! Add new entry to the list + nburden = nburden + 1 + IF (nburden > nmaxburden) THEN + CALL message('new_diag_burden', 'Maximum number of burden diagnostics exceeded!', level=em_error) + CALL message('new_diag_burden', 'Error occured while trying to add burden diag for '//name, & + level=em_info) + RETURN + END IF + d_burden(nburden)%name = TRIM(name) + d_burden(nburden)%itype = jtype + new_diag_burden = nburden + CALL message('new_diag_burden', 'Defined burden diag for '//name, level=em_info) + + END FUNCTION new_diag_burden + +END MODULE mo_tracer diff --git a/ifs-source/arpifs/phys_ec/mo_tracer_processes.F90 b/ifs-source/arpifs/phys_ec/mo_tracer_processes.F90 new file mode 100755 index 00000000..a41c7f7c --- /dev/null +++ b/ifs-source/arpifs/phys_ec/mo_tracer_processes.F90 @@ -0,0 +1,1229 @@ +!> +!! @par Copyright +!! This code is subject to the MPI-M-Software - License - Agreement in it's most recent form. +!! Please see URL http://www.mpimet.mpg.de/en/science/models/model-distribution.html and the +!! file COPYING in the root of the source tree for this code. +!! Where software is supplied by third parties, it is indicated in the headers of the routines. +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!! mo_tracer_processes: collection of generic routines affecting the xt arrays: +!! xt_initialize : intialisation of tracer concentrations +!! xt_burden_init_mem : initialisation of burden diagnostics for tracers +!! xt_burden : burden diagnostics +!! xt_conv_massfix : mass fixer for convective transport (borrowing scheme) +!! xt_borrow : borrowing scheme to prevent negative tracer mass +!! +!! +!! @author +!!
    +!!
  1. ECHAM5 developers +!!
  2. M. Schultz (FZ-Juelich) +!!
+!! +!! $Id: 1423$ +!! +!! @par Responsible coder +!! m.schultzfz-juelich.de +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + +MODULE mo_tracer_processes + + USE mo_kind, ONLY: wp +#ifdef HAMMOZ + USE mo_filename, ONLY: trac_filetype, find_next_free_unit +#endif + IMPLICIT NONE + + + PRIVATE + + !! Interface routines ! purpose ! called by +#ifdef HAMMOZ + PUBLIC :: xt_initialize ! set initial values ! ioinitial, iorestart (### former xtini) + PUBLIC :: xt_burden_init_mem ! set up burden diagnostics + PUBLIC :: xt_burden ! calculate tracer burdens + PUBLIC :: xt_conv_massfix ! adjust tracer mass in convection +#endif + PUBLIC :: xt_borrow ! another mass fixer + +#ifdef HAMMOZ + !--- module variables + REAL(wp), ALLOCATABLE :: zxtte_old(:,:,:) ! for xt_convmassfix + !$OMP THREADPRIVATE(zxtte_old) +#endif + CONTAINS + +#ifdef HAMMOZ + SUBROUTINE xt_initialize (xt, xtm1) + + ! Description: + ! + ! Initialize the tracer fields + ! + ! Method: + ! + ! This routine is called from *ioinitial* and from *iorestart*. + ! Tracers not yet initialised are set to constant values. + ! Tracer input from file will be possible in the future. + ! + ! Authors: + ! + ! J. Feichter, MI, August 1991, original source + ! L. Kornblueh, MPI, May 1998, f90 rewrite + ! U. Schulzweida, MPI, May 1998, f90 rewrite + ! A. Rhodin, MPI, rewrite + ! M. Schultz, FZ Juelich - adaptation to ECHAM6 (2009-09-25) + ! + ! for more details see file AUTHORS + ! + + USE mo_mpi, ONLY: p_parallel_io + USE mo_semi_impl, ONLY: eps + USE mo_exception, ONLY: finish, & + message, & + message_text + USE mo_util_string, ONLY: separator ! format string (----) + USE mo_tracdef, ONLY: trlist, & ! tracer info variable +!!mgs!! ln, ll, nf, & ! len of char components of trlist + ntrac, & ! number of tracers defined + INITIAL, & ! + RESTART, & + CONSTANT + + ! + ! Arguments + ! + REAL(wp),INTENT(inout) :: xt (:,:,:,:) ! tracer array + REAL(wp),INTENT(inout) ,OPTIONAL :: xtm1(:,:,:,:) ! tracer array at t-dt + ! + ! Local scalars: + ! + INTEGER :: jt ! tracer index variable + CHARACTER(len=9) :: cini ! initialisation method to print + LOGICAL :: fault ! indicates that some tracer was not initialised + ! + ! Loop over all tracers , flag tracers read from restart file. + ! + DO jt = 1, trlist% ntrac + trlist% ti(jt)% init = 0 + IF (trlist% mi(jt)% xt% restart_read .AND. & + trlist% mi(jt)% xtm1% restart_read ) & + trlist% ti(jt)% init = RESTART + END DO + ! + ! If restart flag is not set, ignore values read so far. + ! + trlist% ti(1:ntrac)% init = IAND (trlist% ti(1:ntrac)% init, & + trlist% ti(1:ntrac)% ninit) + ! + ! Set 'lrerun' flag to .false. for XT and XTM1 on output. + ! Old restart file format is not written any more. + ! + trlist% mixt % lrerun = .FALSE. + trlist% mixtm1% lrerun = .FALSE. + ! + ! read initial concentrations from file + ! + CALL xt_init_file(xt,xtm1) + ! + ! loop over tracers not initialised so far + ! + DO jt = 1, trlist% ntrac + IF (trlist% ti(jt)% init > 0) CYCLE ! skip if already initialised + ! + ! Set to constant value + ! + IF (IAND (trlist% ti(jt)% ninit, CONSTANT) /= 0) THEN + xt(:,:,jt,:) = trlist% ti(jt)% vini + trlist% ti(jt)% init = CONSTANT + IF (PRESENT(xtm1)) xtm1(:,:,jt,:) = (1._wp - eps) * xt(:,:,jt,:) + ENDIF + END DO + ! + ! loop over all tracers, print initialisation method and min,max value + ! + IF (ntrac > 0 .AND. p_parallel_io) THEN + CALL message('',separator) + CALL message('','') + CALL message('','') + CALL message('xt_initialize','initial values of tracers:') + CALL message('','') + CALL message('',' tracer source minval maxval minval,maxval(xtm1)') + fault = .FALSE. + DO jt = 1, trlist% ntrac + SELECT CASE (trlist% ti(jt)% init) + CASE (CONSTANT) + cini = 'constant' + CASE (INITIAL) + cini = 'initial ' + CASE (RESTART) + cini = 'restart ' + CASE (0) + cini = 'NOT INIT.' + fault=.TRUE. + CASE DEFAULT + cini = 'unknown ' + END SELECT + IF(PRESENT(xtm1)) THEN + WRITE(message_text,'(2x,a16,a8,2x,4g10.3)') & + trlist%ti(jt)%fullname, cini, & + MINVAL(xt(:,:,jt,:)),MAXVAL(xt(:,:,jt,:)), & + MINVAL(xtm1(:,:,jt,:)),MAXVAL(xtm1(:,:,jt,:)) + CALL message('',message_text) + ELSE + WRITE(message_text,'(2x,a16,a8,2x,4g10.3)') & + trlist%ti(jt)%fullname, cini, & + MINVAL(xt(:,:,jt,:)),MAXVAL(xt(:,:,jt,:)) + CALL message('',message_text) + ENDIF + END DO + CALL message('','') + CALL message('',separator) + ! + ! Abort if any tracer is not initialised + ! + IF(fault) CALL finish ('xt_initialize','tracer not initialised') + ENDIF + + END SUBROUTINE xt_initialize + + + + SUBROUTINE xt_init_file(xt, xtm1) + + ! + ! This routine is called from xt_initialize to allow initialization of tracer + ! variables besides initialization with constant values or from the + ! rerun file. + ! + ! Base the decision whether to initialize on the following conditions: + ! + ! trlist%ti(jt)%init == 0 (not initialized so far) + ! trlist%ti(jt)%ninit: >= INITIAL (initialisation requested) + ! + ! Set trlist%ti(jt)%init to a value =/0 afterwards. + ! + + USE mo_control, ONLY: ngl, nlon, nlev, ldebugio + USE mo_mpi, ONLY: p_parallel_io, p_io, p_bcast + USE mo_exception, ONLY: message, message_text, em_error, em_warn, em_info, em_debug + USE mo_netcdf + USE mo_transpose, ONLY: scatter_gp + USE mo_decomposition, ONLY: dcg => global_decomposition + USE mo_read_netcdf77, ONLY: read_var_nf77_3d, read_var_hs_nf77_3d + USE mo_tracdef, ONLY: trlist, INITIAL + USE mo_physical_constants, ONLY: amd + USE mo_filename, ONLY: find_next_free_unit + + REAL(wp),INTENT(inout) :: xt (:,:,:,:) ! tracer array + REAL(wp),INTENT(inout) ,OPTIONAL :: xtm1(:,:,:,:) ! tracer array at t-dt + + CHARACTER(len=16), PARAMETER :: trinifile = 'tracer_ic.nc' ! file name for tracer file + CHARACTER(len=16) :: clon, clat, clev, ctime ! variable names for coordinates + CHARACTER(len=16) :: varname ! variable name for tracer variable + CHARACTER(len=80) :: cunits ! units string of variable + CHARACTER(len=32) :: cfactor ! character string of conversion factor + INTEGER :: jt, ierr, ierr0, iunit + INTEGER :: fileID, varID, timeID, nrec ! netcdf indices + INTEGER :: ndims ! number of variable dimensions + INTEGER :: nnodef ! number of tracers not found in file + CHARACTER(len=194) :: cnodef ! names of tracers not found in file + LOGICAL :: lfirst = .TRUE., & ! first attempt to read + lfound = .FALSE. ! netcdf file trinifile valid + REAL(wp) :: zfactor ! factor for unit conversion + REAL(wp), POINTER :: zptr(:,:,:) ! for reading variables from netCDF-file + + !-- Initialisation + IF (p_parallel_io) THEN + ALLOCATE(zptr(nlon, nlev, ngl)) + ELSE + NULLIFY(zptr) + ENDIF + clon = 'lon' + clat = 'lat' + clev = 'mlev' + ctime = 'time' ! optional 4th dimension: last index will be read + nnodef = 0 + cnodef = '' + cunits = '' + cfactor = '' + + !-- Find tracer file + !-- Find tracer file + ! check, if there is a file existing (probably with 0 bytes -- see issue #225) + iunit = find_next_free_unit (30, 100) + OPEN(iunit,file=TRIM(trinifile),status='OLD',iostat=ierr0) + ierr = NF_OPEN(TRIM(trinifile), NF_NOWRITE, fileID) + IF (ierr == NF_NOERR) THEN + lfound = .TRUE. + CALL nf_check(NF_CLOSE(fileID), fname=TRIM(trinifile)) + ELSE + IF (ierr0 == 0) CALL message('xt_init_file', 'damaged or empty tracer_ic.nc!', level=em_error) + END IF + IF(ldebugio) THEN + ! Note: if ldebugio=false we give a warning only when tracers are actually expected to be read + IF (lfound) THEN + CALL message('xt_init_file', 'Successfully opened tracer IC file '//TRIM(trinifile), & + level=em_debug) + ELSE + CALL message('xt_init_file', 'Failed to open tracer IC file '//TRIM(trinifile), & + level=em_debug) + END IF + END IF + + !-- Loop over all tracers and read all of those that have not yet been initialized and + ! which allow initialisation (from file) + DO jt = 1, trlist%ntrac + IF (trlist%ti(jt)%init == 0 .AND. IAND(trlist%ti(jt)%ninit,INITIAL) /= 0 ) THEN + ierr=1 ! default: return error + !-- report warning if no initial tracer file was found + IF (lfirst .AND. .NOT. lfound) THEN + CALL message('xt_init_file', 'Cannot find file '//TRIM(trinifile)//'!', level=em_warn) + CALL message('', 'Problem occured while trying to initialize '//TRIM(trlist%ti(jt)%basename), & + level=em_info) + RETURN ! no sense to continue + END IF + lfirst = .FALSE. + !-- try to read variable from file + IF (p_parallel_io) THEN + ! look for variable containing tracer mixing ratio + CALL nf_check(NF_OPEN(TRIM(trinifile), NF_NOWRITE, fileID), fname=TRIM(trinifile)) + CALL get_nf_varname(fileID, trlist%ti(jt)%fullname, varname, varID) + ! ... if not found try again with tracer basename + IF (varID < 0) CALL get_nf_varname(fileID, trlist%ti(jt)%basename, varname, varID) + IF (ldebugio) THEN + WRITE(message_text,*) 'Variable ID for '//TRIM(varname)//' : ', varID, & + ' (tracer name='//TRIM(trlist%ti(jt)%basename)//')' + CALL message('', message_text, level=em_debug) + END IF + IF (varID >= 0) THEN + ! find out number of dimensions + CALL nf_check(nf_inq_varndims(fileID, varID, ndims), fname=TRIM(trinifile)) + IF (ndims == 4) THEN + ! find maximum index of time dimension + CALL nf_check(nf_inq_dimid(fileID, ctime, timeID), fname=TRIM(trinifile)) + CALL nf_check(nf_inq_dimlen(fileID, timeID, nrec), fname=TRIM(trinifile)) + CALL nf_check(NF_CLOSE(fileID), fname=TRIM(trinifile)) + CALL read_var_hs_nf77_3d (trinifile, clon, clev, clat, ctime, & + nrec, varname, zptr, ierr) + IF (ldebugio) THEN + WRITE(message_text,*) 'Read in hyperslab for variable '//TRIM(varname)// & + ': nrec=', nrec, ', ierr = ', ierr + CALL message('', message_text, level=em_debug) + END IF + ELSE IF (ndims == 3) THEN + CALL nf_check(NF_CLOSE(fileID), fname=TRIM(trinifile)) + CALL read_var_nf77_3d (trinifile, clon, clev, clat, & + trlist%ti(jt)%basename, zptr, ierr) + IF (ldebugio) THEN + WRITE(message_text,*) 'Read in variable '//TRIM(varname)// & + ': ierr = ', ierr + CALL message('', message_text, level=em_debug) + END IF + ELSE + WRITE(message_text,*) 'Invalid dimensions of variable '//TRIM(trlist%ti(jt)%basename)// & + ' in file '//TRIM(trinifile)//'! ndims = ',ndims + CALL message('xt_init_file', message_text, level=em_error) + CYCLE + END IF + ! report error if reading failed + IF (ierr /= 0) THEN + WRITE(message_text,*) 'Error while reading variable '//TRIM(trlist%ti(jt)%basename)// & + ' from file '//TRIM(trinifile)//'! ierr = ',ierr + CALL message('xt_init_file', message_text, level=em_error) + CYCLE + END IF + ! obtain text of units attribute and appropriate scaling factor + CALL get_units_factor (trinifile, varname, & + trlist%ti(jt)%moleweight, amd, zfactor, cunits, ierr) + IF (ierr == 0) THEN + WRITE(cfactor,*) zfactor + WRITE(message_text,*) 'Read '//TRIM(trlist%ti(jt)%basename)// & + ' from '//TRIM(trinifile)// & + '. Units = '//TRIM(cunits)// & + ', conversion factor = '//TRIM(cfactor) + CALL message('xt_init_file', message_text, level=em_info) + zptr(:,:,:) = zptr(:,:,:) * zfactor + ELSE + WRITE(message_text,*) 'Error while trying to convert units for variable '// & + TRIM(trlist%ti(jt)%basename)//' in file '//TRIM(trinifile) + CALL message('xt_init_file', message_text, level=em_error) + END IF + + END IF ! variable found in file + END IF + CALL p_bcast (ierr, p_io) + IF (ierr == 0) THEN + CALL scatter_gp(zptr,xt(:,:,jt,:),dcg) + IF (PRESENT(xtm1)) xtm1(:,:,jt,:) = xt(:,:,jt,:) + ! set flag that shows that tracer is already initialized + trlist%ti(jt)%init = INITIAL + ELSE + IF (nnodef == 0) THEN + cnodef = TRIM(trlist%ti(jt)%fullname) + ELSE + IF (len(TRIM(cnodef)//', '//TRIM(trlist%ti(jt)%fullname)) <= 194) THEN + cnodef = TRIM(cnodef)//', '//TRIM(trlist%ti(jt)%fullname) + ELSE +! already write undefined tracers to logfile +! make sure message_text is not longer than defined in subroutine message (len=256) +! subroutine "message" changes public variable "message_text" in extending it with +! (in this case!) "WARNING: xt_init_file: "!!! +! ==> make sure that extended message_text will not exceed 256 characters! +! string "WARNING: xt_init_file: Tracers not found in TRIM(trinifile): " already accounts for 62 characters +! The following if statement is just for security reasons if max length of trinifile is modified. + IF (len(TRIM('WARNING: xt_init_file: Tracers not found in '// & + TRIM(trinifile)//': '//TRIM(cnodef))) <= 256) THEN + message_text='Tracers not found in '//TRIM(trinifile)//': '//TRIM(cnodef) + CALL message('xt_init_file', message_text, level=em_warn) + ELSE + message_text='Tracers not found in trinifile: '//TRIM(cnodef) + CALL message('xt_init_file', message_text, level=em_warn) + END IF + cnodef = "...(continued) "//TRIM(trlist%ti(jt)%fullname) + END IF + END IF + nnodef = nnodef+1 + END IF + END IF ! tracer needs initialisation from file + END DO + + IF (nnodef > 0) THEN +! make sure message_text is not longer than defined in subroutine message (len=256) +! (see explanation above) + IF (len(TRIM('WARNING: xt_init_file: Tracers not found in '// & + TRIM(trinifile)//': '//TRIM(cnodef))) <= 256) THEN + message_text='Tracers not found in '//TRIM(trinifile)//': '//TRIM(cnodef) + CALL message('xt_init_file', message_text, level=em_warn) + ELSE + message_text='Tracers not found in trinifile: '//TRIM(cnodef) + CALL message('xt_init_file', message_text, level=em_warn) + END IF + END IF + + IF (ASSOCIATED(zptr)) DEALLOCATE(zptr) + + END SUBROUTINE xt_init_file + + + SUBROUTINE get_nf_varname(fileID, trname, varname, varID) + + ! find a tracer variable in the initial condition file. The search is greedy and will + ! allow for upper and lower case characters or prepended or appended 'vmr_' or 'mmr_' strings + ! The netcdf file must be open and fileID must be valid + + USE mo_netcdf + USE mo_util_string, ONLY: tolower + + INTEGER, INTENT(in) :: fileID + CHARACTER(len=*), INTENT(in) :: trname + CHARACTER(len=*), INTENT(out) :: varname + INTEGER, INTENT(out) :: varID + + CHARACTER(len=256) :: ctmp + INTEGER :: jv, nvars, ierr + + ! test original tracer name first + varname = TRIM(trname) + ierr=nf_inq_varid(fileID, TRIM(varname), varID) + ! if not successful, try pattern match for each variable + IF (ierr /= 0) THEN + varID = -1 + CALL nf_check(nf_inq_nvars(fileID, nvars)) + DO jv=1,nvars + CALL nf_check(nf_inq_varname(fileID, jv, ctmp)) + IF (TRIM(tolower(varname)) == TRIM(tolower(ctmp))) THEN + varID = jv + varname = TRIM(ctmp) ! copy to preserve upper/lower case spelling + ELSE IF ('vmr_'//TRIM(tolower(varname)) == TRIM(tolower(ctmp))) THEN + varID = jv + varname = TRIM(ctmp) + ELSE IF (TRIM(tolower(varname))//'_vmr' == TRIM(tolower(ctmp))) THEN + varID = jv + varname = TRIM(ctmp) + ELSE IF ('mmr_'//TRIM(tolower(varname)) == TRIM(tolower(ctmp))) THEN + varID = jv + varname = TRIM(ctmp) + ELSE IF (TRIM(tolower(varname))//'_mmr' == TRIM(tolower(ctmp))) THEN + varID = jv + varname = TRIM(ctmp) + END IF + END DO + END IF + + END SUBROUTINE get_nf_varname + + + SUBROUTINE get_units_factor(file_name, var_name, var_mwght, air_mwght, & + pfactor, punits, ierr) + ! Description: + ! + ! Obtain conversion factor for initial tracer concentrations. + ! Currently handles only mass mixing ratio (factor = 1) and volume mixing + ! ratio (factor = var_mwght/air_mwght) + ! + ! Authors: + ! + ! J.S. Rast, MPI, December 2003, original source + ! M.G. Schultz, FZ Juelich, May 2010 -- adapted for ECHAM6-HAMMOZ + + USE mo_netcdf + USE mo_kind, ONLY: wp + USE mo_util_string, ONLY: tolower + USE mo_exception, ONLY: message, em_warn + ! + ! Arguments: + ! + CHARACTER (LEN = *), INTENT (in) :: file_name + CHARACTER (LEN = *), INTENT (in) :: var_name + REAL(wp), INTENT(in) :: var_mwght + REAL(wp), INTENT(in) :: air_mwght + REAL(wp), INTENT(out) :: pfactor + CHARACTER (len=80), INTENT(out) :: punits + INTEGER, INTENT(out) :: ierr + ! + ! Local variables: + ! + INTEGER :: zncid, zvarid, zierr, zlen + LOGICAL :: lfound + CHARACTER (len=80) :: ctmp, zunits + + !-- Initialize + pfactor = 1.0_wp + ierr = 0 + lfound = .FALSE. + + !-- Open netCDF file + CALL nf_check(nf_open(TRIM(file_name), nf_nowrite, zncid), & + fname=TRIM(file_name)) + !-- inquire variable name + zierr=nf_inq_varid(zncid, TRIM(var_name), zvarid) + IF (zierr /= NF_NOERR) THEN + ierr = zierr + write(0,*) '**** mo_tracer_processes: get_units_factor :: Should never be here! ***' + CALL nf_check(nf_close(zncid), fname=TRIM(file_name)) + RETURN + END IF + !-- inquire units attribute + zierr = nf_inq_attlen(zncid, zvarid, 'units', zlen) + IF (zierr /= NF_NOERR) THEN + ierr = zierr + CALL nf_check(nf_close(zncid), fname=TRIM(file_name)) + RETURN ! failed to read units attribute + END IF + !-- Get text of units attribute + ctmp = ' ' + zierr = nf_get_att_text(zncid, zvarid, 'units', ctmp) + IF (zierr /= NF_NOERR) THEN + ierr = zierr + zunits = 'unknown' + CALL nf_check(nf_close(zncid), fname=TRIM(file_name)) + RETURN ! failed to read units attribute + END IF + CALL nf_check(nf_close(zncid), fname=TRIM(file_name)) + !-- Process units string + zunits = tolower(TRIM(ctmp)) + !-- Check for mass mixing ratio units (safety check) + IF (zunits(1:7) == 'kg kg-1' .OR. zunits(1:5) == 'kg/kg' .OR. & + zunits(1:3) == 'mmr') THEN + lfound = .TRUE. + pfactor = 1.0_wp ! no conversion necessary + !-- Check for volume mixing ratio units + ELSE IF (zunits(1:11) == 'mole mole-1' .OR. zunits(1:9) == 'mole/mole' .OR. & + zunits(1:3) == 'vmr') THEN + lfound = .TRUE. + pfactor = var_mwght / air_mwght + END IF + + IF (.NOT. lfound) THEN + CALL message('get_units_factor', & + 'Cannot find mass or volume mixing ratio unit. Units = '//TRIM(zunits), & + level=em_warn) + END IF + + punits = zunits ! for reporting + + END SUBROUTINE get_units_factor + +!----- xt_burden --------------------------------------------------------------- + + ! Description: + ! + ! Calculation of tracer burdens (column integrals) + ! The mo_tracer module comprises the formerly independent routine xt_burden and the + ! burden memory management which was formerly handled in mo_aero_mem + ! + ! Authors: + ! + ! P. Stier, MPI, 2001, original source + ! M. Schultz, FZ Juelich - adaptation to ECHAM6 (2009-09-25) + ! + ! for more details see file AUTHORS + ! + +!### tstream: option to add burden diag to existing stream. May be obsolete, but leave for now. + SUBROUTINE xt_burden_init_mem ( tstream ) + + USE mo_submodel, ONLY: lburden ! switch burden diagnostics on/off + USE mo_tracer, ONLY: nburden, d_burden + USE mo_linked_list, ONLY: t_stream, SURFACE + USE mo_memory_base, ONLY: new_stream, add_stream_element, & + default_stream_setting, add_stream_reference, AUTO + + ! Arguments + TYPE (t_stream), TARGET, INTENT(inout), OPTIONAL :: tstream ! diag stream reference + + ! Local variables + TYPE (t_stream), POINTER :: diagstream + CHARACTER(len=32) :: cunit + INTEGER :: jn + + + IF (.NOT. lburden) RETURN ! don't do anything if burden diagnostics is inactive + + ! Set stream pointer to existing stream if given + IF (PRESENT(tstream)) THEN + diagstream => tstream + ELSE + ! Otherwise open a new diagnostic stream for burden diagnostics + ! file type taken from tracer files. + CALL new_stream (diagstream ,'burden',filetype=trac_filetype) + !--- Add standard fields for post-processing: + CALL add_stream_reference (diagstream, 'geosp' ,'g3b' ,lpost=.TRUE.) + CALL add_stream_reference (diagstream, 'lsp' ,'sp' ,lpost=.TRUE.) + CALL add_stream_reference (diagstream, 'aps' ,'g3b' ,lpost=.TRUE.) + CALL add_stream_reference (diagstream, 'gboxarea','geoloc',lpost=.TRUE.) + !--- Default stream element settings + CALL default_stream_setting (diagstream, lrerun = .TRUE. , & + contnorest= .TRUE. , & + laccu = .TRUE. , & + lpost = .TRUE. , & + leveltype = SURFACE, & + table = 199, & + code = AUTO ) + END IF + + ! Add burden fields for all d_burden entries + ! total column mass + DO jn=1, nburden + IF (IAND(d_burden(jn)%itype, 1) /= 0) THEN + cunit = 'kg m-2' + CALL add_stream_element(diagstream, 'burden_'//TRIM(d_burden(jn)%name), & + d_burden(jn)%ptr1, units=cunit, & + longname='atmospheric burden of '//TRIM(d_burden(jn)%name)) + END IF + END DO + ! tropospheric column mass + DO jn=1, nburden + IF (IAND(d_burden(jn)%itype, 2) /= 0) THEN + cunit = 'kg m-2' + CALL add_stream_element(diagstream, 'trburden_'//TRIM(d_burden(jn)%name), & + d_burden(jn)%ptr2, units=cunit, & + longname='tropospheric burden of '//TRIM(d_burden(jn)%name)) + END IF + END DO + ! stratospheric column mass + DO jn=1, nburden + IF (IAND(d_burden(jn)%itype, 4) /= 0) THEN + cunit = 'kg m-2' + CALL add_stream_element(diagstream, 'stburden_'//TRIM(d_burden(jn)%name), & + d_burden(jn)%ptr4, units=cunit, & + longname='stratospheric burden of '//TRIM(d_burden(jn)%name)) + END IF + END DO + ! total column density + DO jn=1, nburden + IF (IAND(d_burden(jn)%itype, 8) /= 0) THEN + cunit = 'm-2' + CALL add_stream_element(diagstream, 'coldensity_'//TRIM(d_burden(jn)%name), & + d_burden(jn)%ptr8, units=cunit, & + longname='atmospheric column density of '//TRIM(d_burden(jn)%name)) + END IF + END DO + ! tropospheric column density + DO jn=1, nburden + IF (IAND(d_burden(jn)%itype, 16) /= 0) THEN + cunit = 'm-2' + CALL add_stream_element(diagstream, 'trcoldensity_'//TRIM(d_burden(jn)%name), & + d_burden(jn)%ptr16, units=cunit, & + longname='tropospheric column density of '//TRIM(d_burden(jn)%name)) + END IF + END DO + ! stratospheric column density + DO jn=1, nburden + IF (IAND(d_burden(jn)%itype, 32) /= 0) THEN + cunit = 'm-2' + CALL add_stream_element(diagstream, 'stcoldensity_'//TRIM(d_burden(jn)%name), & + d_burden(jn)%ptr32, units=cunit, & + longname='stratospheric column density of '//TRIM(d_burden(jn)%name)) + END IF + END DO + + END SUBROUTINE xt_burden_init_mem + + + SUBROUTINE xt_burden(kproma, kbdim, klev, klevp1, krow, & ! Local dimensions + papp1, paphp1, & ! Thermodynamic quantities + pxtm1, pxtte ) ! Tracer fields + + ! *xt_burden* calculates the atmospheric burden and column densities for tracers + ! for which a burden diagnostics was defined. Note that several tracers can share + ! the same diagnostics to allow output for example by aerosol species or mode. + ! + ! Author: + ! ------- + ! Martin Schultz, FZ-Juelich (2009-09-25) + ! based on code from P. Stier (2002) + ! + ! Method: + ! ------- + ! Calculate burden [kg m-2] from mixing ratio [kg kg-1] by multiplying + ! with the term dp/g and summing up the vertical integral. + ! The burden is multiplied by dt and divided by the output interval + ! in the stream management to give a mean over the output interval. + ! + ! ToDo: + ! ----- + ! ### implement column density calculation (burden%itype >= 8) + ! ### implement global sum diagnostics (itype=64) - use trastat. ?? + + USE mo_kind, ONLY: wp + USE mo_exception, ONLY: finish, message, em_info, em_warn + USE mo_time_control, ONLY: delta_time, time_step_len + USE mo_physical_constants, ONLY: grav + USE mo_submodel, ONLY: lburden + USE mo_vphysc, ONLY: vphysc + USE mo_tracdef, ONLY: ntrac, trlist + USE mo_tracer, ONLY: nburden, d_burden + + + !--- Dummy Variables: + + INTEGER, INTENT(in) :: kproma, kbdim, klev, klevp1, krow + + REAL(wp), INTENT(in) :: paphp1(kbdim,klevp1), papp1(kbdim,klev) + REAL(wp), INTENT(in) :: pxtm1(kbdim,klev,ntrac), pxtte(kbdim,klev,ntrac) + + + !--- Local Variables: + + INTEGER :: jl, jk, jt, iburden, itype + + REAL(wp) :: zxtp1(kbdim) + REAL(wp) :: zdpg(kbdim,klev) + + LOGICAL, SAVE :: lfirst=.TRUE. + + + + !--- 0) Initializations: + + IF (ntrac == 0 .OR. .NOT. lburden) RETURN ! don't do anything if burden diagnostics is inactive + + !--- Calculate burden only for tracers that are given the unit of mixing ratio, + ! i.e. assume that the unit is mixing ratio occurs if the string kg-1 occurs + ! in the tracer units: + + IF (lfirst) THEN + CALL message('xt_burden', '----------------------------------------------------', level=em_info) + ! test for validity of burdenid + DO jt = 1, ntrac + IF (trlist%ti(jt)%burdenid > nburden) CALL finish('xt_burden', 'Invalid burden id for tracer '// & + trlist%ti(jt)%fullname) + END DO + END IF + + !--- 1) Calculate auxiliary variable dp/g : + + !--- Uppermost level: + zdpg(1:kproma,1)=2._wp*(paphp1(1:kproma,2)-papp1(1:kproma,1))/grav + !--- Other levels: + DO jk=2, klev + zdpg(1:kproma,jk)=(paphp1(1:kproma,jk+1)-paphp1(1:kproma,jk))/grav + END DO + + + !--- 2) Calculate and store d_burden: + + DO jt=1, ntrac + iburden = trlist%ti(jt)%burdenid + IF (iburden <= 0) CYCLE ! nothing to be done for this tracer + + itype = d_burden(iburden)%itype + + ! total column mass + IF (IAND(itype, 1) /= 0) THEN + DO jk=1, klev + zxtp1(1:kproma)=pxtm1(1:kproma,jk,jt)+pxtte(1:kproma,jk,jt)*time_step_len + d_burden(iburden)%ptr1(1:kproma,krow) = d_burden(iburden)%ptr1(1:kproma,krow) & + + zxtp1(1:kproma)*zdpg(1:kproma,jk)*delta_time + END DO + END IF + ! tropospheric column mass + IF (IAND(itype, 2) /= 0) THEN + DO jk=1, klev + DO jl=1, kproma + IF (vphysc%trpwmo(jl,krow) < jk) THEN + zxtp1(jl)=pxtm1(jl,jk,jt)+pxtte(jl,jk,jt)*time_step_len + d_burden(iburden)%ptr2(jl,krow) = d_burden(iburden)%ptr2(jl,krow) & + + zxtp1(jl)*zdpg(jl,jk)*delta_time + END IF + END DO + END DO + END IF + ! stratospheric column mass + IF (IAND(itype, 4) /= 0) THEN + DO jk=1, klev + DO jl=1, kproma + IF (vphysc%trpwmo(jl,krow) > jk) THEN + zxtp1(jl)=pxtm1(jl,jk,jt)+pxtte(jl,jk,jt)*time_step_len + d_burden(iburden)%ptr4(jl,krow) = d_burden(iburden)%ptr4(jl,krow) & + + zxtp1(jl)*zdpg(jl,jk)*delta_time + END IF + END DO + END DO + END IF + +!### MUST ADD UNIT CONVERSION / CHECK HERE !!! +!### the following code is just providing the structure but will not work properly!! + ! total column density + IF (IAND(itype, 8) /= 0) THEN +IF (lfirst) CALL message('xt_burden','burdentype 8 not properly implemented yet!', level=em_warn) + DO jk=1, klev + zxtp1(1:kproma)=pxtm1(1:kproma,jk,jt)+pxtte(1:kproma,jk,jt)*time_step_len + d_burden(iburden)%ptr8(1:kproma,krow) = d_burden(iburden)%ptr8(1:kproma,krow) & + + zxtp1(1:kproma)*zdpg(1:kproma,jk)*delta_time + END DO + END IF + ! tropospheric column density + IF (IAND(itype, 16) /= 0) THEN +IF (lfirst) CALL message('xt_burden','burdentype 16 not properly implemented yet!', level=em_warn) + DO jk=1, klev + DO jl=1, kproma + IF (vphysc%trpwmo(jl,krow) < jk) THEN + zxtp1(jl)=pxtm1(jl,jk,jt)+pxtte(jl,jk,jt)*time_step_len + d_burden(iburden)%ptr16(jl,krow) = d_burden(iburden)%ptr16(jl,krow) & + + zxtp1(jl)*zdpg(jl,jk)*delta_time + END IF + END DO + END DO + END IF + ! stratospheric column density + IF (IAND(itype, 32) /= 0) THEN +IF (lfirst) CALL message('xt_burden','burdentype 32 not properly implemented yet!', level=em_warn) + DO jk=1, klev + DO jl=1, kproma + IF (vphysc%trpwmo(jl,krow) > jk) THEN + zxtp1(jl)=pxtm1(jl,jk,jt)+pxtte(jl,jk,jt)*time_step_len + d_burden(iburden)%ptr32(jl,krow) = d_burden(iburden)%ptr32(jl,krow) & + + zxtp1(jl)*zdpg(jl,jk)*delta_time + END IF + END DO + END DO + END IF + END DO + + + lfirst=.FALSE. + + END SUBROUTINE xt_burden + + + SUBROUTINE xt_conv_massfix (kproma, kbdim, klev, & + klevp1, ktrac, krow, & + papp1, paphp1, pxtte, & +#ifdef HAMMOZ + loini, pxtbound) +#else + loini) +#endif + + ! *xt_massfix* corrects the tendencies of each column to + ! conserve mass + ! + ! Author: + ! ------- + ! Philip Stier, MPI-Met, 11/2003 + ! + ! Method: + ! ------- + ! To keep the model as closely as possible to the intended physical + ! tendency changes, the correction of the tendencies is + ! imposed proportionally to the absolute values of the + ! applied tendency in each layer. + ! + ! Total mass error tendency [kg m-2 s-1]: + ! + ! dxtdt(jl)=SUM(xtte(jl,jk)*dpg(jl,jk))+xtbound(jl,jk) + ! + ! where xtbound is a boundary condition, i.e. deposition flux + ! + ! Correction proportional to tendency [kg m-2 s-1]: + ! + ! - ABS(xtte(jl,jk)*dpg(jl,jk)) + ! dxtfix(jl,jk) = --------------------------------- * dxdt(jl) + ! SUM(ABS(xtte(jl,jk)*dpg(jl,jk))) + ! + ! Resulting in a corrective tendency [kg kg-1 s-1]: + ! + ! zxttefix(jl,jk) = dxtfix(jl,jk) / dpg(jl,jk) + ! + ! + ! Arguments: + ! ---------- + ! + ! pxtte = cumulative tendency for all tracers [kg kg-1 s-1] + ! + ! Usage: + ! ------ + ! Call twice: first with loini=.TRUE. to store the old tendency + ! then to fix the mass of processes that have modified + ! pxtte meanwhile with the current pxtte and loini=.FALSE. + + USE mo_tracdef, ONLY: trlist ! tracer info variable + USE mo_physical_constants, ONLY: grav + + IMPLICIT NONE + + + !--- Arguments: + INTEGER, INTENT(IN) :: kproma, kbdim, klev, klevp1, ktrac, krow + LOGICAL, INTENT(IN) :: loini + REAL(wp), INTENT(IN) :: papp1(kbdim,klev), & + paphp1(kbdim,klevp1) + REAL(wp), INTENT(INOUT) :: pxtte(kbdim,klev,ktrac) +!>>SF +#ifdef HAMMOZ + REAL(wp), INTENT(IN) :: pxtbound(kbdim,ktrac) ! boundary condition (wet deposition) [kg m-2 s-1] +#endif +!< 0) THEN + IF(trlist%ti(jt)%nconvmassfix > 0) THEN + + zdxtdt(1:kproma) =0.0_wp + zdxtdtsum(1:kproma)=0.0_wp + + !--- Accumulated tendency since initialization: + zxtte(1:kproma,:)=pxtte(1:kproma,:,jt)-zxtte_old(1:kproma,:,jt) + + !--- Calculate vertically integrated mass error tendency [kg m-2 s-1]: + DO jk=1, klev + DO jl=1, kproma + + zdxtdt(jl)=zdxtdt(jl) +zxtte(jl,jk)*zdpg(jl,jk) + + zdxtdtsum(jl)=zdxtdtsum(jl)+ABS(zxtte(jl,jk)*zdpg(jl,jk)) + + END DO + END DO + +!>>SF +#ifdef HAMMOZ + zdxtdt(1:kproma)=zdxtdt(1:kproma)+pxtbound(1:kproma,jt) !SF restore boundary cond. calc. +#endif +!< zeps) THEN + + zxttefix=-((ABS(zxtte(jl,jk)*zdpg(jl,jk))/zdxtdtsum(jl))*zdxtdt(jl))/zdpg(jl,jk) + + pxtte(jl,jk,jt)=pxtte(jl,jk,jt)+zxttefix + + END IF + END DO ! kproma + END DO ! klev + + END IF ! nwetdep + END DO ! ktrac + + + END SUBROUTINE xt_conv_massfix +#endif + + SUBROUTINE xt_borrow(kproma, kbdim, klev, klevp1, ktrac, & + papp1, paphp1, & + pxtm1, pxtte ) + + ! *xt_borrow* borrowing scheme to correct for negative + ! tracer masses conserveing mass within the + ! column + ! Note by SF: actually, the scheme is also good for non-mass tracers, therefore it is + ! now applied to all transported tracers. + ! + ! Author: + ! ------- + ! Philip Stier, MPI-Met, 06/2004 + ! + ! Method: + ! ------- + ! If negative tracer values occur the scheme is iteratively + ! borrowing tracer mixing ratios from the grid-box below. + ! If the lowest layer can not compensate for accumulated remaining + ! corrections, the procedure is repeated from bottom to top. + ! + ! Restrictions: + ! ------------- + ! Columns with a negative total integrated tracer + ! content are set to zero despite the associated mass + ! error. + + USE mo_physical_constants, ONLY: grav + USE mo_time_control, ONLY: time_step_len + USE mo_tracdef, ONLY: trlist, AEROSOLMASS, GAS, AEROSOLNUMBER + USE mo_advection, ONLY: no_advection !SF #246 + USE mo_submodel, ONLY: lmoz !csld #330 + + IMPLICIT NONE + + INTEGER, INTENT(IN) :: kproma, kbdim, klev, klevp1, ktrac + REAL(wp),INTENT(IN) :: papp1(kbdim,klev), paphp1(kbdim,klevp1) + REAL(wp),INTENT(IN) :: pxtm1(kbdim,klev,ktrac) + REAL(wp),INTENT(INOUT) :: pxtte(kbdim,klev,ktrac) + + !--- Local variables: + + INTEGER :: jl, jk, jt + + REAL(wp):: zxtp1, ztmst, zeps + + REAL(wp):: zxtbor(kbdim) + + REAL(wp):: zdpg(kbdim,klev) + + LOGICAL :: lborrtrac !csld #330 : determines if the tracer can be borrowed or not + + !--- 0) Initializations: + ztmst=time_step_len + zeps=10._wp*EPSILON(1.0_wp) + + !--- 1) Calculate auxiliary variable dp/g : + + !--- Uppermost level: + + zdpg(1:kproma,1)=2._wp*(paphp1(1:kproma,2)-papp1(1:kproma,1))/grav + + !--- Other levels: + + DO jk=2, klev + + zdpg(1:kproma,jk)=(paphp1(1:kproma,jk+1)-paphp1(1:kproma,jk))/grav + + END DO + + !--- 2) Borrowing scheme: + + DO jt=1, ktrac + + !>>csld #330 + ! use xt_borrow on all aerosols species + lborrtrac = trlist%ti(jt)%nphase == AEROSOLMASS .OR. trlist%ti(jt)%nphase == AEROSOLNUMBER + + IF (.NOT. lmoz) THEN ! in case of "ham only" runs, use of xt_borrow on gaz species as well + lborrtrac = lborrtrac .OR. (trlist%ti(jt)%nphase == GAS) + END IF + + IF ( (trlist%ti(jt)%ntran /= no_advection) .AND. & !SF #246 exclude non-advected tracers + lborrtrac) THEN + !< 0.0_wp ) THEN + + !--- Subtract corrected tracer mass from current layer: + ! (zxtbor is negative) + + pxtte(jl,jk,jt)=pxtte(jl,jk,jt)+zxtbor(jl)/(zdpg(jl,jk)*ztmst) + + !--- Reset mass correction: + + zxtbor(jl)=0.0_wp + + ELSE + + !--- Adjust tendency to yield zero: + + pxtte(jl,jk,jt)=-pxtm1(jl,jk,jt)/ztmst + + !--- Add correcting mass mixing ratio and convert to [kg m-2]: + ! (implicit summation due to the inclusion + ! of zxtbor(jk-1) in zxtp1) + + zxtbor(jl)=zxtp1*zdpg(jl,jk) + + END IF + + END DO + END DO + + !--- If surface layer cannot compensate accumulated correction: + ! Iterate from bottom to top + + DO jk=klev, 1, -1 + DO jl=1, kproma + IF (zxtbor(jl) < -zeps) THEN + + !--- Check if corrected mass, including the fix of the layer below, + ! yields a negative mixing ratio: + ! (Convert mass correction converted to [kg kg-1] in current layer) + + zxtp1=pxtm1(jl,jk,jt)+pxtte(jl,jk,jt)*ztmst + zxtbor(jl)/zdpg(jl,jk) + + IF ( zxtp1 > 0.0_wp ) THEN + + !--- Subtract corrected tracer mass from current layer: + ! (zxtbor is negative) + + pxtte(jl,jk,jt)=pxtte(jl,jk,jt)+zxtbor(jl)/(zdpg(jl,jk)*ztmst) + + !--- Reset mass correction: + + zxtbor(jl)=0.0_wp + + ELSE + + !--- Adjust tendency to yield zero: + + pxtte(jl,jk,jt)=-pxtm1(jl,jk,jt)/ztmst + + !--- Add correcting mass mixing ratio and convert to [kg m-2]: + ! (implicit summation due to the inclusion + ! of zxtbor(jk-1) in zxtp1) + + zxtbor(jl)=zxtp1*zdpg(jl,jk) + + END IF + + END IF + END DO + END DO + + END IF + END DO + + END SUBROUTINE xt_borrow + + + + + + +!!mgs!! ------- obsolete code (perhaps re-use some parts of this to enhance burden diag? ------ +!!mgs!! SUBROUTINE trastat +!!mgs!! +!!mgs!! ! Description: +!!mgs!! ! +!!mgs!! ! Prints out accumulated mass budgets for tracers at +!!mgs!! ! the end of a run +!!mgs!! +!!mgs!! USE mo_control, ONLY: ngl +!!mgs!! USE mo_mpi, ONLY: p_sum, p_communicator_d, p_pe, p_io +!!mgs!! +!!mgs!! ! Local scalars: +!!mgs!! REAL(wp) :: zmglob, zmnhk, zmshk, zmstrat, zmtrop, zqcount +!!mgs!! INTEGER :: jt +!!mgs!! +!!mgs!! ! Local arrays: +!!mgs!! REAL(wp) :: zmstratn(ntrac+1), zmstrats(ntrac+1), zmtropn(ntrac+1), & +!!mgs!! zmtrops(ntrac+1) +!!mgs!! +!!mgs!! ! Intrinsic functions +!!mgs!! INTRINSIC SUM +!!mgs!! +!!mgs!! +!!mgs!! ! Executable statements +!!mgs!! +!!mgs!! zqcount = 1.0_wp/(REAL(icount,wp)) +!!mgs!! IF (p_pe == p_io) THEN +!!mgs!! CALL message('',' Tracer mass budget:') +!!mgs!! CALL message('',separator) +!!mgs!! CALL message('',' Averaged mass budgets in [kg] ') +!!mgs!! CALL message('',' global n-hem s-hem tropo strat n-tro s-tro n-str s-str ') +!!mgs!! ENDIF +!!mgs!! DO jt = 1, ntrac + 1 +!!mgs!! zmtropn(jt) = SUM(tropm(1:ngl/2,jt)) * zqcount +!!mgs!! zmstratn(jt) = SUM(stratm(1:ngl/2,jt)) * zqcount +!!mgs!! zmtrops(jt) = SUM(tropm(ngl/2+1:ngl,jt)) * zqcount +!!mgs!! zmstrats(jt) = SUM(stratm(ngl/2+1:ngl,jt)) * zqcount +!!mgs!! END DO +!!mgs!! zmtropn = p_sum (zmtropn, p_communicator_d) +!!mgs!! zmstratn = p_sum (zmstratn, p_communicator_d) +!!mgs!! zmtrops = p_sum (zmtrops, p_communicator_d) +!!mgs!! zmstrats = p_sum (zmstrats, p_communicator_d) +!!mgs!! +!!mgs!! IF (p_pe == p_io) THEN +!!mgs!! DO jt = 1, ntrac + 1 +!!mgs!! zmnhk = zmtropn(jt) + zmstratn(jt) +!!mgs!! zmshk = zmtrops(jt) + zmstrats(jt) +!!mgs!! zmtrop = zmtropn(jt) + zmtrops(jt) +!!mgs!! zmstrat = zmstratn(jt) + zmstrats(jt) +!!mgs!! zmglob = zmnhk + zmshk +!!mgs!! +!!mgs!! IF (jt <= ntrac) THEN +!!mgs!! WRITE (message_text,'(a,i2,9e9.2)') & +!!mgs!! ' Tracer: ', jt, zmglob, zmnhk, & +!!mgs!! zmshk, zmtrop, zmstrat, zmtropn(jt), zmtrops(jt), & +!!mgs!! zmstratn(jt), zmstrats(jt) +!!mgs!! CALL message('',message_text) +!!mgs!! ELSE +!!mgs!! WRITE (message_text,'(a ,9e9.2)') & +!!mgs!! ' Air mass: ', zmglob, zmnhk, & +!!mgs!! zmshk, zmtrop, zmstrat, zmtropn(jt), zmtrops(jt), & +!!mgs!! zmstratn(jt), zmstrats(jt) +!!mgs!! CALL message('',message_text) +!!mgs!! END IF +!!mgs!! END DO +!!mgs!! END IF +!!mgs!! +!!mgs!! END SUBROUTINE trastat +!!mgs!! + +END MODULE mo_tracer_processes + diff --git a/ifs-source/arpifs/phys_ec/mo_util_string.F90 b/ifs-source/arpifs/phys_ec/mo_util_string.F90 new file mode 100644 index 00000000..bbbcdc1c --- /dev/null +++ b/ifs-source/arpifs/phys_ec/mo_util_string.F90 @@ -0,0 +1,122 @@ +!> +!! @par Copyright +!! This code is subject to the MPI-M-Software - License - Agreement in it's most recent form. +!! Please see URL http://www.mpimet.mpg.de/en/science/models/model-distribution.html and the +!! file COPYING in the root of the source tree for this code. +!! Where software is supplied by third parties, it is indicated in the headers of the routines. +!! +MODULE mo_util_string + !---------------------------------------------- + ! This module holds string conversion utilities + !---------------------------------------------- + USE mo_kind, ONLY: dp + IMPLICIT NONE + PRIVATE + PUBLIC :: tolower ! Conversion : 'ABCXYZ' -> 'abcxyz' + PUBLIC :: toupper ! Conversion : 'abcxyz' -> 'ABCXYZ' + PUBLIC :: char2 ! Conversion : INTEGER -> CHAR (LEN=2) + PUBLIC :: separator ! Format string: (/"-----...-----"/) + PUBLIC :: int2string ! returns integer n as a string + PUBLIC :: real2string ! returns real n as a string + PUBLIC :: logical2string ! returns logical n as a string + !----------------- + ! module variables + !----------------- + CHARACTER(len=*), PARAMETER :: separator = REPEAT('-',78) +!============================================================================== +CONTAINS +!============================================================================== + FUNCTION tolower (upper) + !----------------------------------- + ! Conversion: Uppercase -> Lowercase + !----------------------------------- + CHARACTER(LEN=*) ,INTENT(in) :: upper + CHARACTER(LEN=LEN_TRIM(upper)) :: tolower + + INTEGER :: i + INTEGER ,PARAMETER :: idel = ICHAR('a')-ICHAR('A') + + DO i=1,LEN_TRIM(upper) + IF (ICHAR(upper(i:i)) >= ICHAR('A') .AND. & + ICHAR(upper(i:i)) <= ICHAR('Z')) THEN + tolower(i:i) = CHAR( ICHAR(upper(i:i)) + idel ) + ELSE + tolower(i:i) = upper(i:i) + END IF + END DO + + END FUNCTION tolower +!------------------------------------------------------------------------------ + FUNCTION toupper (lower) + !----------------------------------- + ! Conversion: Lowercase -> Uppercase + !----------------------------------- + CHARACTER(LEN=*) ,INTENT(in) :: lower + CHARACTER(LEN=LEN_TRIM(lower)) :: toupper + + INTEGER :: i + INTEGER ,PARAMETER :: idel = ICHAR('A')-ICHAR('a') + + DO i=1,LEN_TRIM(lower) + IF (ICHAR(lower(i:i)) >= ICHAR('a') .AND. & + ICHAR(lower(i:i)) <= ICHAR('z')) THEN + toupper(i:i) = CHAR( ICHAR(lower(i:i)) + idel ) + ELSE + toupper(i:i) = lower(i:i) + END IF + END DO + + END FUNCTION toupper +!------------------------------------------------------------------------------ + FUNCTION char2 (i, zero) + !---------------------------------------- + ! Conversion: INTEGER -> CHARACTER(LEN=2) + !---------------------------------------- + CHARACTER(LEN=2) :: char2 ! result + INTEGER ,INTENT(in) :: i ! argument + CHARACTER ,INTENT(in) ,OPTIONAL :: zero ! padding instead of '0' + + INTEGER ,PARAMETER :: i0 = ICHAR ('0') + + IF (i>99 .OR. i<0) THEN + char2 = '**' + ELSE + char2(1:1) = CHAR( i/10 + i0) + char2(2:2) = CHAR(MOD(i,10) + i0) + ENDIF + + IF(PRESENT(zero)) THEN + IF(char2(1:1) == '0') char2(1:1) = zero + IF(char2(2:2) == '0') char2(2:2) = zero + ENDIF + END FUNCTION char2 +!------------------------------------------------------------------------------ + FUNCTION int2string(n) ! returns integer n as a string (often needed in printing messages) + + INTEGER :: n + CHARACTER(len=10) :: int2string + + WRITE(int2string,'(I10)') n + int2string = ADJUSTL(int2string) + + END FUNCTION int2string +!------------------------------------------------------------------------------ + CHARACTER(len=32) FUNCTION real2string(n) ! returns real n as a string (often needed in printing messages) + + REAL(dp), INTENT(in) :: n + + WRITE(real2string,'(G32.5)') n + real2string = ADJUSTL(real2string) + + END FUNCTION real2string +!------------------------------------------------------------------------------ + CHARACTER(len=10) FUNCTION logical2string(n) ! returns integer n as a string (often needed in printing messages) + + LOGICAL, INTENT(in) :: n + + WRITE(logical2string,'(L10)') n + logical2string = ADJUSTL(logical2string) + + END FUNCTION logical2string + +END MODULE mo_util_string diff --git a/ifs-source/arpifs/phys_ec/su_aerw.F90 b/ifs-source/arpifs/phys_ec/su_aerw.F90 index 70cfc357..2bb93463 100644 --- a/ifs-source/arpifs/phys_ec/su_aerw.F90 +++ b/ifs-source/arpifs/phys_ec/su_aerw.F90 @@ -371,6 +371,51 @@ SUBROUTINE SU_AERW(YDMODEL) !-- define a default configuration that can be modified through the "naeaer" namelist CASE ("glomap") CALL ABOR1("OIFS - glomap should never be called from OIFS, EXIT") +!-- define a default configuration that can be modified through the "naeaer" namelist + ! HAM-M7 only solves micro-physics, all other processes are handled + ! by the TM5-M7 routines. We therefore set all TM5-M7 switches, but + ! use HAM-M7-specific switches in the micro-physics routines. + CASE ("tm5m7", "hamm7") + + LAERCLIMG=.FALSE. + LAERCLIMZ=.FALSE. + LAERCLIST=.FALSE. + + LAERDRYDP=.TRUE. + LAERGTOP =.TRUE. + LAERLISI =.FALSE. + LAERCALIP=.FALSE. + LAERNGAT =.TRUE. + LAERSCAV =.TRUE. + LAERSCAV_CHEM =.FALSE. + LAERSEDIM=.TRUE. + LAERSURF =.TRUE. + LAERELVS =.FALSE. + LAER6SDIA=.FALSE. + LAERCCN =.FALSE. + LAERCSTR =.FALSE. + LAERRRTM =.FALSE. + LAERUVP =.FALSE. + LUVINDX =.FALSE. + LAERNITRATE = .FALSE. + LDRYDEPVEL_DYN=.FALSE. + + !-- minimum oceanic production of DMS + RDMSMIN = 5.E-11_JPRB + NDMSO = 2 + NPIST = 1 + ! Various other settings may/may not be used, see scheme 'aer' below + +!-- default value are for use of "plain" or "gusty" 10-m wind as predictor for SS and DU + NAERWND = 2 +!-- other values would be: (see *aer_src*) +!- NAERWND = 0 for "plain" 10-m wind as predictor for sea salt and desert dust emissions +!- NAERWND = 1 for wind+gust in sea salt emission +!- NAERWND = 2 for wind+gust in dust emission +!- NAERWND = 3 for wind+gust in sea salt and dust emissions + + WRITE(UNIT=NULOUT,FMT='('' NAERWND= '',I1)') & + & NAERWND CASE ("aer") diff --git a/ifs-source/arpifs/phys_ec/tm5m7_drydep.F90 b/ifs-source/arpifs/phys_ec/tm5m7_drydep.F90 new file mode 100644 index 00000000..c9e608bf --- /dev/null +++ b/ifs-source/arpifs/phys_ec/tm5m7_drydep.F90 @@ -0,0 +1,639 @@ +SUBROUTINE TM5M7_DRYDEP & + !---input + & ( KIDIA , KFDIA , KLON, KLEV, KTRAC, KAERO , & + & PTSPHY, PTENCI, PT , PAP , PAPH, PWIND, & + & PLSM,PCI, PAERUST, PZ0M,PRHCL,PGEOH, PDZ,& + & SSHF, SLHF, & + !---prognostic fields + & RW_MODE, DENS_MODE, PCEN, & + !---output + & PFLUXAER, PTENC, PVDA) + +!**** *TM5M7_DRYDEP* - ROUTINE FOR PARAMETRIZATION OF TM5M7 AEROSOL DEPOSITION +! +! !DESCRIPTION: This module calculates deposition of aerosol particles +! +! It is assumed that the distribution is described by nmodes log-normal +! distributions +! +! Each mode has a number and mass and a sigma_lognormal. Number and mass are +! related and the mean aerosol radius can thus be calculated for each mode. +! +! mass=pi*4./3.*radius**3.*number*exp(9./2.*ln2s) /1e18*density, with: +! +! density = density of aerosol type +! ln2s = (alog(sigma_lognormal(mode)))**2 +! mass = mode mass +! number = mode number +! +! mode1 : accumulation +! mode2 : coarse +! mode3 : super coarse (ss) coarse +! +! For each mode a separate fall velocity is calculated according to the mass +! and number mean radii. Water take-up by seasalt particles is taken into +! account. This changes the density, radius, and sigma of the distribution. +! +! Also included is the deposition calculation. based on a lookup table +! calculated for a reference aerosol density (e.g. 1800 kg/m3) and a number of +! radii. This deposition curve is convoluted with the number/volume +! distribution of the aerosols. +! + +! Again, for SS the water takeup is accounted for, and the effects on density, +! sigma and radius are calculated. The density has effect on the impaction +! term is the depotion calculation. This can be modeled by a shift in the +! radius. Thus the radii of the lookup table are adapted for density +! differences when impaction becomes important. + +!** INTERFACE. +! ---------- +! *TM5M7_DRYDEP* IS CALLED FROM *TM5M7_PHY2*. + +! INPUTS: +! ------- +! PTSPHY : TIMESTEP (s) +! PTENCI(KLON,KLEV,KTRAC) : INPUT TENDENCIES (xx kg s-1) +! PAP (KLON,KLEV) : LEVEL PRESSURE (Pa) +! PAPH (KLON,KLEV+1) : HALF-LEVEL PRESSURE (Pa) +! PWIND (KLON) : 10-meter wind speed +! PCI (KLON) : FRACTION OF SEA ICE +! PLSM (KLON) : LAND-SEA MASK +! PAERUST KLON) : Friction velocity +! PZ0M : roughness length for momentum (m) +! PRHCL (KLON) : Rel. humidity at surface level (0-1) +! PT (KLON) : SURFACE LEVEL TEMPERATURE (K) +! PCEN (KLON,KLEV,KTRAC) : CONCENTRATION OF TRACERS (xx kg-1) + +! OUTPUTS: +! -------- +! PTENC (KLON,KLEV,KTRAC) : TENDENCY (xx kg-1 s-1) +! PVDA (KLON,NACTAERO) : dry deposition velocities (m/sec) + +! EXTERNALS. +! ---------- +! NONE + +! MODIFICATIONS. +! ------------- + +! SWITCHES. +! -------- + +! MODEL PARAMETERS +! ---------------- + +!----------------------------------------------------------------------- +USE PARKIND1 ,ONLY : JPIM ,JPRB +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK + +USE YOMLUN, ONLY : NULERR +USE YOEAERSRC ,ONLY : YREAERSRC +USE YOEAERSNK ,ONLY : YREAERSNK +USE YOMCST ,ONLY : RG, RD,RNAVO,RPI +USE YOM_YGFL ,ONLY : YGFL +USE TM5M7_DATA, ONLY : NMOD, MODE_NM_SED, mode_start, mode_tracers_sed, XMAIR,MODAL_DATA, & + & SIGMA_LOGNORMAL, NRDEP, LUR, DENSITY_REF +USE TM5M7_EMIS_DATA, ONLY : VKARMAN + +IMPLICIT NONE + +!----------------------------------------------------------------------- + +!* 0.1 ARGUMENTS +! --------- + +!---input fields +INTEGER(KIND=JPIM),INTENT(IN) :: KLON +INTEGER(KIND=JPIM),INTENT(IN) :: KLEV +INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA +INTEGER(KIND=JPIM),INTENT(IN) :: KFDIA +INTEGER(KIND=JPIM),INTENT(IN) :: KTRAC +INTEGER(KIND=JPIM),INTENT(IN) :: KAERO(YGFL%NAERO) +REAL(KIND=JPRB) ,INTENT(IN) :: PTSPHY +REAL(KIND=JPRB) ,INTENT(IN) :: PTENCI(KLON,KLEV,KTRAC) +REAL(KIND=JPRB) ,INTENT(IN) :: PT(KLON) ! Temp +REAL(KIND=JPRB) ,INTENT(IN) :: PAP(KLON,KLEV)! Mid-lev pres +REAL(KIND=JPRB) ,INTENT(IN) :: PWIND(KLON),PLSM(KLON),PCI(KLON) +REAL(KIND=JPRB) ,INTENT(IN) :: PAERUST(KLON),PZ0M(KLON) +REAL(KIND=JPRB) ,INTENT(IN) :: PRHCL(KLON) +REAL(KIND=JPRB) ,INTENT(IN) :: PGEOH(KLON,0:KLEV),PDZ(KLON) +REAL(KIND=JPRB) ,INTENT(IN) :: SSHF(KLON),SLHF(KLON) ! sensible and latent heat fluxes (W/m2) +REAL(KIND=JPRB) ,INTENT(IN) :: PAPH(KLON,KLEV+1) ! interface pres +TYPE(MODAL_DATA) ,INTENT(IN) :: RW_MODE(NMOD) +TYPE(MODAL_DATA) ,INTENT(IN) :: DENS_MODE(NMOD) + +REAL(KIND=JPRB) ,INTENT(IN) :: PCEN(KLON,KLEV,KTRAC) +!---output fields +REAL(KIND=JPRB) ,INTENT(INOUT) :: PFLUXAER(KLON,YGFL%NACTAERO) +REAL(KIND=JPRB) ,INTENT(INOUT) :: PTENC(KLON,KLEV,KTRAC) +REAL(KIND=JPRB) ,INTENT(INOUT) :: PVDA(KLON,YGFL%NACTAERO) !eehol: correct indices + +!---local fields +REAL(KIND=JPRB) :: TEMP, PB, DP, ZVIS, RHO_AIR, TO_PASCAL,RADIUS,VT +REAL(KIND=JPRB) :: UM,ZR, VD_SEA,CUNNING,DC,DENSAER,RELAX,SC +REAL(KIND=JPRB) :: UST_LAND, ST_LAND,VB_LAND,VI_LAND, VKD_LAND, VD_LAND +REAL(KIND=JPRB) :: FREESEA, UST_SEA, ST_SEA, RE, VBSEA,VISEA, VKDACCSEA, VKD_SEA + +REAL(KIND=JPRB) :: ZRAERO(KLON) +REAL(KIND=JPRB) :: USTAR_SEA(KLON), SR_SEA(KLON), ALPHA(KLON), BUBBLE(KLON),ALPHAE(KLON) +REAL(KIND=JPRB) :: Y0,YRA, ZRA,OBUK, BUOY, TSTV, Z1TSPHY, ZAERI, ZAERO + +INTEGER(KIND=JPIM) :: JK, JL, JN, JNN, MODE, IMODE, INMODE, IRDEP, ITN, NRD, JAER + +REAL(KIND=JPRB) :: m_to_pa !factor from m/s --> Pa/s + +REAL(KIND=JPRB), PARAMETER :: dynvisc=1.789e-4*2. ! g cm-1 s-1 CHECKED FD OK, there is temp. dependence Perry p. 3-248. + ! unit is g cm-1 s+1 FD + ! checked with Seinfeld---> factor 2. came out (diameter ? radius) +REAL(KIND=JPRB), PARAMETER :: cl=0.066*1e-4 ! mean free path [cm] (particle size also in cm) +REAL(KIND=JPRB), PARAMETER :: bc= 1.38e-16 ! boltzman constant [g cm-2 s-1 K-1] (1.38e-23 J deg-1) =>binas +REAL(KIND=JPRB), PARAMETER :: kappa=1. ! shapefactor +REAL(KIND=JPRB), PARAMETER :: visc=0.15 ! KINEMATIC molecular viscocity [cm2 s-1] + ! this is also function of temperature FD + + +REAL(KIND=JPRB),PARAMETER :: eff=0.5 ! parameters needed for sea/bubble formation +REAL(KIND=JPRB),PARAMETER :: rdrop=0.005 ! cm +REAL(KIND=JPRB),PARAMETER :: zdrop=10.0 ! cm +REAL(KIND=JPRB),PARAMETER :: eps=0.6 ! parameter related to bubble formation +REAL(KIND=JPRB) :: qdrop,ZS,phi,alpha1,vk1,vk2,alpharat ! auxiliary parameters for bubble formation +REAL(KIND=JPRB) :: sr_help ! surface roughnes consistent with 10 m wind. + + + ! Href: constant reference height for calculations of raero + real, parameter :: Href=30. + real,parameter :: rhoCp = 1231.0 + real,parameter :: rhoLv = 3013000.0 + + +REAL(KIND=JPRB),DIMENSION(KLON,NRDEP) :: ZVDA + +REAL(KIND=JPRB) :: LNS (NMOD) + +REAL(KIND=JPRB),DIMENSION(:),POINTER :: VS + + + +REAL(KIND=JPRB), DIMENSION(nrdep) :: d_aer ! diameter vd loopup table (um) +REAL(KIND=JPRB), DIMENSION(nrdep) :: nnumb,nvolume ! number and volume distribution +REAL(KIND=JPRB), DIMENSION(nrdep) :: vdi ! for the integration +REAL(KIND=JPRB), DIMENSION(nrdep) :: vdi_def ! for the integration +REAL(KIND=JPRB), DIMENSION(nrdep) :: lure ! effective loo +REAL(KIND=JPRB), DIMENSION(nrdep) :: ddpi ! integration bin-sizes +REAL(KIND=JPRB), DIMENSION(nrdep+1) :: dlogdp,ddp ! integration edges +REAL(KIND=JPRB), DIMENSION(nrdep) :: logdp,logde ! log(diameter) + +REAL(KIND=JPRB) :: SIGMA, LNSIGMA, DENSITY, DPG, NTOT +INTEGER(KIND=JPIM) :: NSHIFT, IR1, IR + +REAL(KIND=JPRB) :: Z1RG, ZALPHA, ZHGT, ZZ0M,ZAERUST,ZDP(KLON,KLEV) + +! Arrays to collect deposition velocities +TYPE(MODAL_DATA), DIMENSION(NMOD), TARGET :: vn_deposition +TYPE(MODAL_DATA), DIMENSION(NMOD), TARGET :: vm_deposition + + +REAL(KIND=JPRB) :: ZHOOK_HANDLE +!----------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('TM5M7_DRYDEP',0,ZHOOK_HANDLE) + +! Initialize.. +PVDA(1:KLON,1:KLEV)=0._JPRB + +do JK=1,KLEV + ZDP(KIDIA:KFDIA,JK)=PAPH(KIDIA:KFDIA,JK)-PAPH(KIDIA:KFDIA,JK-1) +end do +!-- Compute aerodynamic resistance. +! VH - for now use fixed resistance. Particul +! VH - there is an issue with SSHF and SLHF (and in turn buoy), +! VH - which does not seem to lead to reasonable numbers. +! VH - needs to be double-checked if these quantities are already computed before call to aerini_layer +! DO JL=KIDIA,KFDIA +! ZZ0M=MAX(1e-9_JPRB,PZ0M(JL)) +! ZAERUST=MAX(1e-9_JPRB,PAERUST(JL)) +! buoy = -SSHF(JL) / rhoCp & +! & -0.61 * PT(JL) * SLHF(JL)/rhoLv +! tstv=-buoy/ZAERUST +! obuk=1E-6_JPRB +! IF( abs(tstv) .gt. 1.E-25_JPRB .AND. abs(tstv) .LT. 1E25_JPRB ) THEN +! obuk = ZAERUST*ZAERUST*PT(JL)/(tstv*RG*vKarman) +! ENDIF +! +! IF( obuk > 0. ) THEN ! stable conditions +! ZRA = 0.74*( alog(Href/ZZ0M) + 6.4*(Href-ZZ0M)/obuk )& +! & / (vKarman*ZAERUST) +! ELSE ! unstable +! y0 = sqrt(1.-9.*ZZ0M/obuk)+1. +! yra = sqrt(1.-9.*Href/obuk)+1. +! ZRA = 0.74*(alog(Href/ZZ0M)+2.*(alog(y0)-alog(yra)))/ & +! & (vKarman*ZAERUST) +! ENDIF +! IF (ZRA .GT. 0._JPRB) THEN +! ZRA=ZRA +! ELSE +!!VH DEBUG +! WRITE(NULERR,*)"DDEP DEBUG: ",ZRA, PZ0M(JL), ZZ0M, OBUK +! WRITE(NULERR,*)"DDEB DEBUG-B:",TSTV,buoy,SSHF(JL),SLHF(JL) +!!VH END DEBUG +! +! ENDIF +! +! ZRAERO(JL)=max(10._JPRB,min(ZRA,1e10_JPRB)) +! ENDDO +! VH end. +! VH For now take aerodynamic resistance as from 'AER' model. + DO JL=KIDIA,KFDIA + ZRAERO(JL)=LOG(PDZ(JL)/PZ0M(JL))/(VKARMAN*PAERUST(JL)) + ENDDO + + + DO JL=KIDIA,KFDIA + ! SEA: + ! surface roughness from Charnock equation + ! friction velocity from surface stress + ! + if(PLSM(JL) < 0.99) then + !VH ustar_sea(JL)=sqrt(sstr(JL)) + !VH sr_sea(JL)=alfa_charnock1*v_charnock/ustar_sea(JL) + & + !VH alfa_charnock2*sstr(JL)/RG + !VH replace with something (hopefully) appropriate... (check?!) + ustar_sea(JL)=PAERUST(JL) + sr_sea(JL)=PZ0M(JL) + else + ustar_sea(JL)=0.0 + sr_sea(JL)=0.0 + endif + + + freesea = MAX(0.,1.-PLSM(JL)-PCI(JL)) + if (freesea>0.01) then ! + + ! bubble bursting effect,see Hummelshoj, equation 10 + ! relationship by Wu (1988), note that Hummelshoj has not + ! considered the cunningham factor which yields a different + ! vb curve, with smaller values for small particles + ! according to LG indeed 10 m windspeed (instead of 1 m windspeed in use in ECHAM5 + + alpha(JL)=MIN(1.0,MAX(1.e-10,1.7e-6*PWIND(JL)**3.75)) ! set maximum! + + qdrop=5.*(100.*alpha(JL)) ! 100 is the flux of bubbles per cm^2/s (see Monohan(1988)) + + bubble(JL)=((100.*ustar_sea(JL))**2.)/(100.*PWIND(JL)) + & + eff*(2.*rpi*rdrop**2.)*(2.*zdrop)*(qdrop/alpha(JL)) + + !--- Correction of particle radius for particle growth close to the + ! surface according to Fitzgerald, 1975, the relative humidity over + ! the ocean is restricted to 98% (0.98) due to the salinity + + ZS=MIN(0.98,PRHCL(JL)) + + !fd23012004 beta(JL)=EXP((0.00077*ZS)/(1.009-ZS)) THIS term was present in ECHAM code ! + !; max. value reached for this parameter is 1.04 and is ignored here. + + phi=1.058-((0.0155*(ZS-0.97))/(1.02-ZS**1.4)) + alpha1=1.2*EXP((0.066*ZS)/(phi-ZS)) + vk1=10.2-23.7*ZS+14.5*ZS**2. + vk2=-6.7+15.5*ZS-9.2*ZS**2. + alpharat=1.-vk1*(1.-eps)-vk2*(1.-eps**2) + alphae(JL)=alpharat*alpha1 + + !--- Over land no correction for large humidity close to the surface: + + else ! land surface + alpha(JL)=0. + bubble(JL)=0. + alphae(JL)=1. + endif + ENDDO + + + + ! look up table for different aerosol radii: + do irdep = 1, nrdep + + do JL=KIDIA,KFDIA + + zr = 2.0e-4 * lur(irdep) ! diameter in cm ! + vd_land=0. + vd_sea=0. + + + um=PWIND(JL) + ! xland = PLSM(JL) ![]fraction . xland replaced with PLSM(JL) + + !--- Cunningham factor: + + cunning=1.+(cl/(alphae(JL)*zr))*(2.514+0.800*EXP(-0.55*zr/cl)) + + !--- Diffusivity: + + dc=(bc* PT(JL)*cunning)/(3.*RPI*dynvisc*(alphae(JL)*zr)) ! [cm2/s] FD + + ! Relaxation: + ! relax represents characteristic relaxation time scale [Seinfeld, p. 319] + ! [ kg m-3 => g cm-3 ] + densaer = density_ref ! reference density (e.q. 1800 kg/m3) + relax=cunning*densaer*1.E-3*((alphae(JL)*zr)**2. ) & + & /(18.*dynvisc*kappa) + + + ! Sedimentation is calculated operator split in the subroutine sedimentation: + ! + ! sedspeed=(((((alphae(JL)*zr(JL)))**2.)* & + ! densaer(jl,klev,jmod,jrow)*1.E-3*grav*cunning)/(18.*dynvisc)) ! note grav should be in cm + ! [ kg m-3 => g cm-3 ] + + ! Calculation of schmidt + + sc =visc/dc ![cm2 s-1]/[cm2 s-1] dimensionless + + if (PLSM(JL).gt.0.01) then + ! note that in ECHAM there is a difference between vegetaton and snow/bare soil + + ust_land=PAERUST(JL) + + ! + ! calculation of stokes numbers + + st_land =max(0.1,(relax*(100.*ust_land)**2.)/visc) + + !--- Calculation of the dry deposition velocity + ! See paper slinn and slinn, 1980, vd is related to d**2/3 + ! over land, whereas over sea there is accounted for slip + ! vb_ represents the contribution in vd of the brownian diffusion [cm s-1] + ! and vi_ represents the impaction [cm s-1] + ! + + vb_land =(1./vkarman)*((ust_land/um)**2)*100.*um*(sc**(-2./3.)) ![cm s-1] + vi_land =(1./vkarman)*((ust_land/um)**2)*100.*um*(10.**(-3./st_land)) ![cm s-1] + vkd_land =(vb_land+vi_land)*1e-2 ![m s-1] + vd_land=1./(ZRAERO(JL)+1./vkd_land) + ! if (vkd_land.gt.1.) write(*,999) & + ! 'after vb',i,j,'jtype',jtype,'jmod',jmod,'vb',vb_land,'vi',vi_land,& + ! 'um10',um,'ust_land',ust_land,'dc',dc,'relax',relax,'schmidt',sc,'stokes',st_land + endif ! PLSM.gt.0 + if (PLSM(JL) < 0.99) then + !--- Over sea: + ! Brownian diffusion for rough elements, see Hummelshoj + ! re is the reynolds stress: + + ust_sea=ustar_sea(JL) + st_sea =max(0.1,(relax*(100.*ust_sea)**2.)/visc) + re =(100.*ust_sea*100.*sr_sea(JL))/visc ! [cm/s]*[cm]/[cm2/s] + vbsea =(1./3.)*100.*ust_sea*((sc**(-0.5))*re**(-0.5)) + visea =100.*ust_sea*10.**(-3./st_sea) + vkdaccsea =vbsea+visea + vkd_sea =((1.-alpha(JL))*vkdaccsea+alpha(JL)*bubble(JL))*1e-2 ! [m s-1] + vd_sea=1./(ZRAERO(JL)+1./vkd_sea) ! [m s-1] + ! if (vkd_sea.gt.1.) write(*,999) 'sea',i,j,'jtype',jtype,'jmod',jmod,'vb',vbsea,& + ! 'vi',visea,'vkd_sea',vkd_sea,'alpha*bubble',alpha(JL)*bubble(JL),'alpha',alpha(JL) + + endif ! PLSM.lt.0.99 + + ZVDA(JL,IRDEP) = min(0.1,(1.-PLSM(JL))*vd_sea + PLSM(JL)*vd_land) ! [m s-1] limit to 10 cm/s + + enddo !JL +enddo ! loop over nrdep + + + + + + +! ----------------------------------------- +! Part 2: Apply aerosol deposition velocity +! ----------------------------------------- + + + + + +m_to_pa = 7.24e16*RG*xmair*1e3/RNAVO !factor from m/s --> Pa/s + +!- PCEN in unit of kg kg-1 (mass mixing ratio) +!- ZRHO in unit of kg m-3 +!- v[n|m]_deposition in unit of m s-1 speed + + +DO IMODE=1,NMOD + ALLOCATE(vn_deposition(IMODE)%surf(KIDIA:KFDIA)) + ALLOCATE(vm_deposition(IMODE)%surf(KIDIA:KFDIA)) + + vn_deposition(IMODE)%surf(KIDIA:KFDIA)=0.0_JPRB + vm_deposition(IMODE)%surf(KIDIA:KFDIA)=0.0_JPRB +ENDDO + + + do mode =1,nmod + lns(mode) = log(sigma_lognormal(mode)) + enddo + + ! calculate the binsizes (um) around the radii of the pre-calculated vd's + d_aer(1:NRDEP) = 2.0*lur(1:NRDEP) ! diameter (um) + logdp(1:NRDEP) = log10(d_aer(1:NRDEP)) ! log(diameter) + + + do JL=KIDIA, KFDIA + + + temp = PT(JL) ! at surface to temp box + pb = PAPH(JL,KLEV+1) ! pressure at bottom of box (Pa) + dp = PAPH(JL,KLEV+1)-PAPH(JL,KLEV) ! layer thickness + ! to_pascal = m_to_pa*dt*pb/temp ! convert from m/s ---> Pa/timestep + + ! do IRDEP=1,nrdep + ! vdi_def(IRDEP) = VDA(JL,IRDEP) + ! enddo + + M7MODES: do mode = 1, nmod + + vt = 0.0_JPRB + + itn = mode_start(mode) ! position of number tracer + + ! compute radius: + radius = rw_mode(mode)%d2(JL,KLEV) + + ! initial deposition velocities for increasing radia: + vdi(1:NRDEP) = ZVDA(JL,1:NRDEP) + + sigma = sigma_lognormal(mode) + lnsigma = log(sigma) + density = dens_mode(mode)%d2(JL,KLEV) + + !if(okdebug) then + ! if(radius > tiny(radius)) then + ! r_mean(mode) = r_mean(mode) + radius + ! nr(mode) = nr(mode) + 1 + ! r_max(mode) = max(r_max(mode), radius) + ! endif + !endif + + RADENS: if (radius > 1e-11 .and. density > 1e-2) then + + ! account for density different than density_ref of the look-up table (lur --> vdi): + lure(:) = lur(:) + logde(:) = logdp(:) + do ir = 2, nrdep + if(vdi(ir) > vdi(ir-1)) exit ! for bigger r's : impaction dominates (density effects) + if ( ir == nrdep ) exit ! trap upper boundary + enddo + do ir1 = ir, nrdep + lure(ir1) = lur(ir1)*sqrt(density_ref/density) + logde(ir1) = log10(2*lure(ir1)) + enddo + + ! compress look-up table such that radii are increasing monotonic: + nshift = 0 + ir1 = ir + do + if ( logde(ir1) > logde(ir-1) ) exit + nshift = nshift + 1 + ir = ir -1 + if(ir == 1) exit + enddo + nrd = nrdep - nshift + if (nshift > 0) then + do ir1 = ir, nrd + logde(ir1) = logde(ir1+nshift) + lure(ir1) = lure(ir1+nshift) + vdi(ir1) = vdi(ir1+nshift) + enddo + endif + + ! do the integration of the shifted lookup table: + dlogdp(1) = -3.0 + do ir=2,nrd + dlogdp(ir) = 0.5*(logde(ir-1)+logde(ir)) ! take middle of the log scale + enddo + dlogdp(nrd+1) = 3.0 ! 1000 um + ddp(1:nrd+1) = 10**dlogdp(1:nrd+1) + ddpi(1:nrd) = ddp(2:nrd+1)-ddp(1:nrd) ! integration intervals (um) + d_aer(1:nrd) = 2.0*lure(1:nrd) + + ! perform convolution with log-normal distribution: + dpg = 2*radius*1e6 ! diameter in um + ! In TM5: ntot=rm(JL,1,itn). Double-check if this is consistent?! + ntot = PCEN(JL,KLEV,KAERO(itn)) + + ! calculate the distribution (number and mass) over the deposition bins: + if(ntot > 1.0 .and. radius > tiny(radius) ) then ! you need some aerosol! + do JNN=1,nrd + nnumb(JNN) = ntot/(sqrt(2.*RPI)*d_aer(JNN)*lnsigma)*exp(-(log(d_aer(JNN))-log(dpg))**2/(2*lnsigma**2)) + nvolume(JNN) = nnumb(JNN)*(RPI/6.0)*d_aer(JNN)**3 + enddo + vt = sum(nnumb(1:nrd)*ddpi(1:nrd)*vdi(1:nrd))/sum(nnumb(1:nrd)*ddpi(1:nrd)) + else + vt = 0.0 + endif + + ! vn_deposition_mean%surf(JL,mode) = vn_deposition_mean%surf(JL, mode) + vt + ! vn_deposition(mode)%surf(JL) = min(to_pascal*vt,ndp*dp) ! in Pa/timestep downwards + vn_deposition(mode)%surf(JL) = max(0._JPRB,vt) ! keep units in (presumably ) m/sec + + !if(okdebug) then + ! if ( vt > tiny(vt) ) then + ! vd_mean(mode,1) = vd_mean(mode,1) + vt + ! vd_max(mode,1) = max(vd_max(mode,1) , vt) + ! nvd(mode,1) = nvd(mode,1) + 1 + ! endif + !endif + + ! for mass: + if(ntot > 1.0 .and. radius > tiny(radius) ) then ! you need some aerosol! + vt = sum(nvolume(1:nrd)*ddpi(1:nrd)*vdi(1:nrd))/sum(nvolume(1:nrd)*ddpi(1:nrd)) + else + vt = 0.0 + endif + ! vm_deposition_mean%surf(JL, mode) = vm_deposition_mean%surf(JL, mode) + vt + ! vm_deposition(mode)%surf(JL) = min(to_pascal*vt,ndp*dp) ! in Pa/timestep downwards + vm_deposition(mode)%surf(JL) = max(0._JPRB, vt) ! in m/sec + + + !if(okdebug) then + ! if ( vt > tiny(vt) ) then + ! vd_mean(mode,2) = vd_mean(mode,2) + vt + ! vd_max(mode,2) = max(vd_max(mode,2) , vt) + ! nvd(mode,2) = nvd(mode,2) + 1 + ! endif + !endif ! + + else + vm_deposition(mode)%surf(JL) = 0.0 + vn_deposition(mode)%surf(JL) = 0.0 + endif RADENS + + end do M7MODES + + enddo ! JL + + + +! Compute corresponding tendencies +Z1RG = 1.0_JPRB/RG +Z1TSPHY = 1.0_JPRB/PTSPHY + +! ================= +! Loop over tracers +! ================= +do mode =1,nmod + !do inmode=0,mode_nm(mode) + do inmode=0,mode_nm_sed(mode) + + JN = mode_tracers_sed(inmode,mode) + JAER=KAERO(JN) + + !------------- reset + NULLIFY(VS) + if (inmode == 0) then ! number or mass tracer + vs => vn_deposition(mode)%surf + else + vs => vm_deposition(mode)%surf + endif + + !output velocity field for diagnostics purposes.. + PVDA(KIDIA:KFDIA,JAER)=VS(KIDIA:KFDIA) + + DO JL =KIDIA,KFDIA + ZAERO = PCEN(JL,KLEV,JAER) + PTSPHY * PTENCI(JL,KLEV,JAER) + +! using the analytical solution (Flemming et al., 2011, D_GRG_4.6) +! The tendency in the lowest layer is modified, but the surface flux remains +! untouched. + + ZHGT= PGEOH(JL,KLEV-1) * Z1RG + ZALPHA= PTSPHY* VS(JL) /ZHGT +!-- using Euler forward +! ZAERI = ZAERO * (1.0_JPRB - ZALPHA) +!-- using Euler backward +! ZAERI = ZAERO * (1.0_JPRB + ZALPHA) +!-- using Euler centered +! ZAERI = ZAERO * ((1.0_JPRB - ZALPHA)/(1.0_JPRB + ZALPHA)) +!-- using the analytical solution (Flemming et al., 2011, D_GRG_4.6) + ZAERI = ZAERO * EXP(-1.0_JPRB * ZALPHA) + PTENC(JL,KLEV,JAER)= PTENCI(JL,KLEV,JAER) & + & + (ZAERI-ZAERO) * Z1TSPHY + !vh check indices.. PFLUXAER(JL,JAER)= (ZAERO - ZAERI)*Z1TSPHY * PDP(JL,KLEV) * Z1RG + ! No update of surface flux: + PFLUXAER(JL,JAER)= (ZAERO - ZAERI)*Z1TSPHY * ZDP(JL,KLEV) * Z1RG!PFLUXAER(JL,JAER) + ENDDO + + enddo ! loop over tracers in mode +enddo ! loop over modes + + + +DO IMODE=1,NMOD + DEALLOCATE(vn_deposition(IMODE)%surf) + DEALLOCATE(vm_deposition(IMODE)%surf) +ENDDO + + + +!----------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('TM5M7_DRYDEP',1,ZHOOK_HANDLE) + + + +END SUBROUTINE TM5M7_DRYDEP diff --git a/ifs-source/arpifs/phys_ec/tm5m7_get_refr_idx.F90 b/ifs-source/arpifs/phys_ec/tm5m7_get_refr_idx.F90 new file mode 100644 index 00000000..4ea5f82c --- /dev/null +++ b/ifs-source/arpifs/phys_ec/tm5m7_get_refr_idx.F90 @@ -0,0 +1,409 @@ +SUBROUTINE TM5M7_GET_REFR_IDX(wdep, SO4, BC, OC, SOA, SS, DU, water, mode, m_eff) + +!*** * TM5M7_GET_REFR_IDX* +! +! +!----------------------------------------------------------------------------- +! TM5 ! +!----------------------------------------------------------------------------- +!BOP +! +! !IROUTINE: TM5M7_GET_REFR_IDX +! +! !DESCRIPTION: Compute refractive index of internally mixed aerosols by use +! of effective medium theory for the size-dependent aerosol +! mixtures assumed in M7. +! +!\\ +!\\ + +! SOURCE. +! ------- +! +! Taken from TM5-code +! +! MODIFICATIONS. +! -------------- +! +! +! !REVISION HISTORY: +! +! 12 Aug 2008 - Michael Kahnert, SMHI +! 6 Feb 2011 - Achim Strunk - +! +! Sep 2021 - V. Huijnen: first introduction into OpenIFS +! +! +!----------------------------------------------------------------------- + +USE PARKIND1 ,ONLY : JPIM ,JPRB +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE YOMLUN ,ONLY : NULERR + +USE YOMCST, ONLY : RPI +USE TM5M7_DATA, ONLY : ss_density, dust_density, carbon_density, & + & pom_density, so4_density, soa_density +USE TM5M7_OPTICS_DATA, ONLY: WAVELENDEP + +IMPLICIT NONE + +!----------------------------------------------------------------------- + +!* 0.1 ARGUMENTS +! --------- + +type(wavelendep), INTENT(IN) :: wdep ! wavelength properties (wavelength, re/img part of refractive index) +REAL(KIND=JPRB), INTENT(IN) :: SO4, BC, OC,SOA ! mass mixing ratios or concentrations of sulphate, black carbon, organic carbon +REAL(KIND=JPRB), INTENT(IN) :: SS, DU, water ! sea salt, dust, and water +INTEGER(KIND=JPIM), INTENT(IN) :: mode ! mode number (M7) +! +! !OUTPUT PARAMETERS: +! +COMPLEX, INTENT(OUT) :: m_eff ! effective refractive index of mixture +!INTEGER(KIND=JPIM), INTENT(OUT) :: status + + + +!* 0.2 LOCAL VARIABLES +! --------------- + +! refractive indices +COMPLEX :: m_SO4, m_BC, m_OC, m_SOA, m_SS, m_DU, m_water + +! volume fractions +REAL(KIND=JPRB) :: v_SO4, v_BC, v_OC, v_SOA, v_SS, v_DU, v_water, water_iv + +REAL(KIND=JPRB) :: vtot, v2 +COMPLEX :: m00, m0, m1, m2 + +!VH REAL(KIND=JPRB) :: rpls, ipls +REAL(KIND=JPRB),PARAMETER :: ROL = 1000. ! kg/m^3 + + +REAL(KIND=JPRB) :: ZHOOK_HANDLE + +!----------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('TM5M7_GET_REFR_IDX',0,ZHOOK_HANDLE) + + ! Get the refractive indices from the lookup-tables and put them into COMPLEX numbers. + m_so4 = cmplx( wdep%n(1),wdep%k(1) ) ! H2-SO4 + NH4NO3 + m_bc = cmplx( wdep%n(2),wdep%k(2) ) ! BC + m_oc = cmplx( wdep%n(3),wdep%k(3) ) ! POM + m_soa = cmplx( wdep%n(4),wdep%k(4) ) ! SOA + m_ss = cmplx( wdep%n(5),wdep%k(5) ) ! SS + m_du = cmplx( wdep%n(6),wdep%k(6) ) ! DU + m_water = cmplx( wdep%n(7),wdep%k(7) ) ! Water + + !status = 0 + ! no mixing for mode=6,7: + if(mode.ge.6)then + m_eff=m_DU + IF(LHOOK) CALL DR_HOOK('TM5M7_GET_REFR_IDX',1,ZHOOK_HANDLE) + RETURN + endif + + ! compute volume fractions: + v_SO4=0._JPRB + v_BC=0._JPRB + v_OC=0._JPRB + v_SOA=0._JPRB + v_SS=0._JPRB + v_DU=0._JPRB + v_water=0._JPRB + vtot=0._JPRB + + ! Added sanity check (15-7-2010 - P. Le Sager) : Avoid negative water + ! mixing ratio! + ! The bruggeman logically assumes that v_water is between 0 and 1, but + ! this is never checked in the call chain : + ! ECEarth_Optics_Step -> calculate_aop -> get_refr_idx [here] -> + ! Bruggeman + ! We do it here, with a warning since it reflects a problem upstream: + if(water.lt.0.0_JPRB)then + !write (gol,*)" WARNING - [Get_refr_idx] : negative relative humidity..." + !write (gol,*)" WARNING - [Get_refr_idx] : .....set to 0" + water_iv=0.0_JPRB + else + water_iv=water + endif + + if(mode.le.4)then + v_SO4=SO4/so4_density + v_water=water_iv/rol + vtot=vtot+v_SO4+v_water + endif + if(mode.le.5)then + !v_OC=OC/pom_density + v_SOA=SOA/soa_density + vtot=vtot+v_SOA + end if + if(mode.ge.2.and.mode.le.5)then + v_BC=BC/carbon_density + v_OC=OC/pom_density + vtot=vtot+v_BC+v_OC + endif + if(mode.ge.3.and.mode.le.4)then + v_SS=SS/ss_density + vtot=vtot+v_SS + endif + if(mode.ge.3.and.mode.ne.5)then + v_DU=DU/dust_density + vtot=vtot+v_DU + endif + ! If vtot is zero, we will get 0.0/0.0's causing NaNs. In that case, the + ! refractive index does not matter and will be set to (1.0,1.0e-9). The + ! reason not to take (1.0,0.0) is that someone with humour might take + ! the logarithm of the imaginary part. Dust particles get their usual + ! refractive index, because they already returned m_DU. But that does + ! not matter, because there are zero aerosols in this case. + if (vtot .le. 1E-20_JPRB) then + m_eff = Cmplx(1.0,1.0e-9) + else + v_SO4=MAX(1E-20,v_SO4/vtot) + v_BC=MAX(1E-20,v_BC/vtot) + v_OC=MAX(1E-20,v_OC/vtot) + v_SOA=MAX(1E-20,v_SOA/vtot) + v_SS=MAX(1E-20,v_SS/vtot) + v_DU=MAX(1E-20,v_DU/vtot) + v_water=MAX(1E-20,v_water/vtot) + + !----------------------------------------------------------------------- + ! effective medium computations for each mode + !----------------------------------------------------------------------- + if(mode.eq.1)then + ! Bruggeman mixing rule for SO4 OC and water: + m1=m_SO4 + m2=m_SOA + vtot=v_SO4+v_SOA + v2=v_SOA/vtot + call Bruggeman(m1,m2,v2,m0) + m1=m0 + m2=m_water + v2=v_water + call Bruggeman(m1,m2,v2,m0) + elseif(mode.eq.2)then + ! iterative Bruggeman mixing rule for SO4, OC, and water: + m1=m_SO4 + m2=m_OC + vtot=v_SO4+v_OC + v2=v_OC/vtot + call Bruggeman(m1,m2,v2,m00) + m1=m00 + m2=m_SOA + vtot=vtot+v_SOA + v2=v_SOA/vtot + call Bruggeman(m1,m2,v2,m00) + m1=m00 + m2=m_water + vtot=vtot+v_water + v2=v_water/vtot + call Bruggeman(m1,m2,v2,m00) + ! Maxwell-Garnett mixing rule for BC inclusions: + m1=m00 + m2=m_BC + v2=v_BC + call Maxwell_Garnett(m1,m2,v2,m0) + elseif(mode.eq.3.or.mode.eq.4)then + ! iterative Bruggeman mixing rule for SO4, OC, SS, and water: + m1=m_SO4 + m2=m_OC + vtot=v_SO4+v_OC + if ( vtot < TINY( vtot ) ) then + v2=0.0_JPRB + else + v2=v_OC/vtot + end if + call Bruggeman(m1,m2,v2,m00) + m1=m00 + m2=m_SOA + vtot=vtot+v_SOA + if ( vtot < TINY( vtot ) ) then + v2=0.0_JPRB + else + v2=v_SOA/vtot + end if + call Bruggeman(m1,m2,v2,m00) + m1=m00 + m2=m_SS + vtot=vtot+v_SS + if ( vtot < TINY( vtot ) ) then + v2=0.0_JPRB + else + v2=v_SS/vtot + end if + call Bruggeman(m1,m2,v2,m00) + m1=m00 + m2=m_water + vtot=vtot+v_water + v2=v_water/vtot + call Bruggeman(m1,m2,v2,m00) + ! iterative Maxwell-Garnett mixing rule for BC and dust + ! inclusions: + m1=m00 + m2=m_BC + vtot=vtot+v_BC + if ( vtot < TINY( vtot ) ) then + v2=0.0_JPRB + else + v2=v_BC/vtot + end if + call Maxwell_Garnett(m1,m2,v2,m00) + m1=m00 + m2=m_DU + v2=v_DU + call Maxwell_Garnett(m1,m2,v2,m0) + elseif(mode.eq.5)then + + m1=m_SOA + m2=m_OC + vtot=v_SOA+v_OC + v2=v_OC/vtot + call Bruggeman(m1,m2,v2,m00) + ! Maxwell-Garnett mixing rule for BC inclusions: + m1=m00 + m2=m_BC + v2=v_BC + call Maxwell_Garnett(m1,m2,v2,m0) + + endif + m_eff = m0 + End If + + ! Debug : trap for a NAN (13-7-2010 - P. Le Sager) + ! rpls=real(m_eff) + ! ipls=imag(m_eff) + ! IF ((rpls.NE.rpls).or.(ipls.NE.ipls)) then + ! status = 1 + ! write (NULERR,'(" GET_REFR_IDX-NAN: ", 3(E16.4,2x),i4,2x,7(E16.4,2x))') rpls, ipls, vtot, mode,& + ! & SO4,BC,OC,SOA,SS,DU,water + ! endif + +IF(LHOOK) CALL DR_HOOK('TM5M7_GET_REFR_IDX',1,ZHOOK_HANDLE) +END SUBROUTINE TM5M7_GET_REFR_IDX + + + + +!-------------------------------------------------------------------------- +! TM5 ! +!-------------------------------------------------------------------------- +!BOP +! +! !IROUTINE: BRUGGEMAN +! +! !DESCRIPTION: Compute effective refractive index of a mixture of 2 components +! by use of the Bruggeman mixing rule +!\\ +!\\ +! !INTERFACE: +! +PURE SUBROUTINE BRUGGEMAN(m1,m2,v2,m0) + ! + ! !INPUT PARAMETERS: + ! + USE PARKIND1 ,ONLY : JPIM ,JPRB + COMPLEX, INTENT(IN) :: m1,m2 + REAL(KIND=JPRB), INTENT(IN) :: v2 + ! + ! !OUTPUT PARAMETERS: + ! + COMPLEX, INTENT(OUT):: m0 + ! + ! !REVISION HISTORY: + ! 12 Aug 2008 - Michael Kahnert, SMHI + ! 6 Feb 2011 - Achim Strunk - + ! + ! !REMARKS: + ! + !EOP + !------------------------------------------------------------------------ + !BOC + + !local: + COMPLEX :: m1s,m2s,mt + REAL(KIND=JPRB) :: fac1,fac2 + + !Begin + + if(v2.eq.1.0_JPRB)then + m0=m2 + ! IF(LHOOK) CALL DR_HOOK('routine_name',1,ZHOOK_HANDLE) + RETURN + elseif(v2.eq.0.0_JPRB)then + m0=m1 + ! IF(LHOOK) CALL DR_HOOK('routine_name',1,ZHOOK_HANDLE) + RETURN + endif + + fac1=2._JPRB-3._JPRB*v2 + fac2=3._JPRB*v2-1._JPRB + m1s=m1**2_JPIM + m2s=m2**2_JPIM + mt=m1s*fac1+m2s*fac2 + m0=1._JPRB/16._JPRB*mt**2_JPIM+0.5_JPRB*m1s*m2s + m0=csqrt(m0) + m0=m0+0.25_JPRB*mt + m0=csqrt(m0) + + END SUBROUTINE BRUGGEMAN +!EOC + + + + + +!-------------------------------------------------------------------------- +! TM5 ! +!-------------------------------------------------------------------------- +!BOP +! +! !IROUTINE: MAXWELL_GARNETT +! +! !DESCRIPTION: Compute effective refractive index for a medium consisting of +! a matrix with refractive index m1 and inclusions with refractive +! index m2 and volume fraction v2 by use of the Maxwell-Garnett +! mixing rule. +!\\ +!\\ +! !INTERFACE: +! +PURE SUBROUTINE MAXWELL_GARNETT( m1, m2, v2, m0) + ! + ! !INPUT PARAMETERS: + ! + USE PARKIND1 ,ONLY : JPIM ,JPRB + COMPLEX, INTENT(IN) :: m1, m2 + REAL(KIND=JPRB), INTENT(IN) :: v2 + ! + ! !OUTPUT PARAMETERS: + ! + COMPLEX, INTENT(OUT):: m0 + ! + ! !REVISION HISTORY: + ! 12 Aug 2008 - Michael Kahnert, SMHI + ! 6 Feb 2011 - Achim Strunk - + ! + ! !REMARKS: + ! + !EOP + !------------------------------------------------------------------------ + !BOC + + !local: + COMPLEX :: m1s,m2s + REAL(KIND=JPRB) :: fac1,fac2 + + ! Begin: + + fac1=3.0_JPRB-2.0_JPRB*v2 + fac2=3.0_JPRB-v2 + m1s=m1**2_JPIM + m2s=m2**2_JPIM + + m0=m2s*(fac1*m1s+2.0*v2*m2s)/(v2*m1s+fac2*m2s) + m0=csqrt(m0) + +END SUBROUTINE MAXWELL_GARNETT +!EOC + + diff --git a/ifs-source/arpifs/phys_ec/tm5m7_init.F90 b/ifs-source/arpifs/phys_ec/tm5m7_init.F90 new file mode 100755 index 00000000..66ef8e8a --- /dev/null +++ b/ifs-source/arpifs/phys_ec/tm5m7_init.F90 @@ -0,0 +1,269 @@ + SUBROUTINE TM5M7_INIT(YDGEOMETRY, YRCOMPO, YGFL, YDERAD) + +!** DESCRIPTION +! ---------- +! +! init routine for IFS tm5m7 aerosol +! +! +! +!** INTERFACE. +! ---------- +! *TM5M7_INIT* IS CALLED FROM *CNT4*. +! + +! Externals. +! --------- + +! +! AUTHOR. +! ------- +! Vincent Huijnen *KNMI* + +! MODIFICATIONS. +! -------------- +! ORIGINAL : 2020-08-24 + + + +USE GEOMETRY_MOD , ONLY : GEOMETRY +USE PARKIND1 , ONLY : JPRB, JPIM +USE YOMHOOK , ONLY : LHOOK, DR_HOOK +USE YOMLUN , ONLY : NULOUT +!USE YOMCOMPO , ONLY : YRCOMPO +USE YOMCOMPO , ONLY : TCOMPO +USE YOM_YGFL , ONLY : TYPE_GFLD!YGFL +USE TM5_PHOTOLYSIS, ONLY : NBANDS_TROP,LMID,LMID_GRIDA,WAVE,WAV_GRID,WAV_GRIDA,LL_TM5_PHOTO_INI +USE TM5M7_DATA, ONLY : & + & ISO4 , INH4 , INO3_A , IACS_N , ISO4ACS , IBCACS , IPOMACS , ISSACS , IDUACS , & + & ISOANUS , ISOAAIS , ISOAACS , ISOACOS , ISOAAII , IH2OPART ,IAII_N , IBCAII , & + & IPOMAII , IACI_N , IDUACI , IAIS_N , ISO4AIS , IBCAIS , IPOMAIS , ICOI_N , & + & IDUCOI , ICOS_N , ISO4COS , IBCCOS , IPOMCOS , ISSCOS , IDUCOS , INUS_N , & + & ISO4NUS , IELVOC , IISVOC , IMSA, & +! Needed for the emissions declaration.. + & sigma_lognormal, & + & xmc, sigma_lognormal, pom_density, & + & mode_aii, mode_ais, mode_acs +USE TM5M7_OPTICS_DATA, ONLY :WAVELENDEP,NWDEP,WDEP, & + & ASWBAND, NASWBAND,ALWWN1,ALWWN2 +USE YOERAD , ONLY : TERAD!YRERAD +!USE YOMPRAD , ONLY : RADGRID + +IMPLICIT NONE + + +TYPE(GEOMETRY) ,INTENT(IN) :: YDGEOMETRY +TYPE(TCOMPO) ,INTENT(IN) :: YRCOMPO +TYPE(TYPE_GFLD) ,INTENT(IN) :: YGFL +TYPE(TERAD),INTENT(IN) :: YDERAD +!----------------------------------------------------------------------- +!* 0.5 LOCAL VARIABLES +! --------------- +INTEGER(KIND=JPIM) :: JI,JL,JK +LOGICAL :: LLFOUND +REAL(KIND=JPRB),DIMENSION(:),ALLOCATABLE :: PHOTO_WAVELENGTHS + +REAL(KIND=JPRB) :: ZHOOK_HANDLE + + +!----------------------------------------------------------------------- +!----------------------------------------------------------------------- +#include "abor1.intfb.h" +#include "tm5m7_src_dust_init.intfb.h" +#include "tm5m7_optics_init.intfb.h" + + +IF (LHOOK) CALL DR_HOOK('TM5M7_INIT',0,ZHOOK_HANDLE) +ASSOCIATE(NACTAERO=>YGFL%NACTAERO, YAERO=>YGFL%YAERO, & + & NAERO=>YGFL%NAERO, & + & AERO_SCHEME=>YRCOMPO%AERO_SCHEME,LAERCHEM=>YGFL%LAERCHEM) + + + +!* Init aerosol scheme +! --------------- + + +SELECT CASE (TRIM(AERO_SCHEME)) + + CASE ("aer") + + ! Setup of 'aer' configuration is done in su_aerw.F90 + IF (LHOOK) CALL DR_HOOK('TM5M7_INIT',1,ZHOOK_HANDLE) + RETURN + + CASE ("tm5m7","hamm7") + + ! initialization of tm5m7 aerosol tracer indices. All may be moved to a separate + ! routine, if becomse too lengthy. + +! Following now handled in hamm7_init + +!!$ ! Make sure that aerosol indices are set correctly +!!$ DO JK=1,NAERO +!!$ +!!$ LLFOUND = .FALSE. +!!$ SELECT CASE (TRIM(YAERO(JK)%CNAME) ) +!!$ CASE ('SO4') ; LLFOUND = (ISO4 == JK) +!!$ CASE ('NH4') ; LLFOUND = (INH4 == JK) +!!$ CASE ('NO3_A') ; LLFOUND = (INO3_A == JK) +!!$ CASE ('ACS_N') ; LLFOUND = (IACS_N == JK) +!!$ CASE ('SO4ACS'); LLFOUND = (ISO4ACS == JK) +!!$ CASE ('BCACS') ; LLFOUND = (IBCACS == JK) +!!$ CASE ('POMACS'); LLFOUND = (IPOMACS == JK) +!!$ CASE ('SSACS') ; LLFOUND = (ISSACS == JK) +!!$ CASE ('DUACS') ; LLFOUND = (IDUACS == JK) +!!$ CASE ('SOANUS'); LLFOUND = (ISOANUS == JK) +!!$ CASE ('SOAAIS'); LLFOUND = (ISOAAIS == JK) +!!$ CASE ('SOAACS'); LLFOUND = (ISOAACS == JK) +!!$ CASE ('SOACOS'); LLFOUND = (ISOACOS == JK) +!!$ CASE ('SOAAII'); LLFOUND = (ISOAAII == JK) +!!$ CASE ('H2OPART');LLFOUND = (IH2OPART == JK) +!!$ CASE ('AII_N') ; LLFOUND = (IAII_N == JK) +!!$ CASE ('BCAII') ; LLFOUND = (IBCAII == JK) +!!$ CASE ('POMAII'); LLFOUND = (IPOMAII == JK) +!!$ CASE ('ACI_N') ; LLFOUND = (IACI_N == JK) +!!$ CASE ('DUACI') ; LLFOUND = (IDUACI == JK) +!!$ CASE ('AIS_N') ; LLFOUND = (IAIS_N == JK) +!!$ CASE ('SO4AIS'); LLFOUND = (ISO4AIS == JK) +!!$ CASE ('BCAIS') ; LLFOUND = (IBCAIS == JK) +!!$ CASE ('POMAIS'); LLFOUND = (IPOMAIS == JK) +!!$ CASE ('COI_N') ; LLFOUND = (ICOI_N == JK) +!!$ CASE ('DUCOI') ; LLFOUND = (IDUCOI == JK) +!!$ CASE ('COS_N') ; LLFOUND = (ICOS_N == JK) +!!$ CASE ('SO4COS'); LLFOUND = (ISO4COS == JK) +!!$ CASE ('BCCOS') ; LLFOUND = (IBCCOS == JK) +!!$ CASE ('POMCOS'); LLFOUND = (IPOMCOS == JK) +!!$ CASE ('SSCOS') ; LLFOUND = (ISSCOS == JK) +!!$ CASE ('DUCOS') ; LLFOUND = (IDUCOS == JK) +!!$ CASE ('NUS_N') ; LLFOUND = (INUS_N == JK) +!!$ CASE ('SO4NUS'); LLFOUND = (ISO4NUS == JK) +!!$ CASE ('ELVOC') ; LLFOUND = (IELVOC == JK) +!!$ CASE ('ISVOC') ; LLFOUND = (IISVOC == JK) +!!$ CASE ('MSA') ; LLFOUND = (IMSA == JK) +!!$ CASE ('Total_aerosol') ; LLFOUND = .TRUE. +!!$ +!!$ CASE DEFAULT +!!$ WRITE(NULOUT,*) 'ERROR tm5m7_init: no matching aerosol name for '//TRIM(YAERO(JK)%CNAME) +!!$ CALL ABOR1('tm5m7_init: No matching tracer name available') +!!$ END SELECT +!!$ +!!$ IF (.NOT. LLFOUND) THEN +!!$ WRITE(NULOUT,*) 'ERROR tm5m7_init: Wrong tracer index or status for '//TRIM(YAERO(JK)%CNAME) +!!$ CALL ABOR1('tm5m7_init: wrong tracer index or tracer name') +!!$ ENDIF +!!$ +!!$ ENDDO + +! CALL TM5M7_DIAGNOSTICS_DATA + + ! Initialize various dust properties + CALL TM5M7_SRC_DUST_INIT + + !IF(.not.LAERCHEM)THEN + ! Initialize optics: + ! Make sure that 'WAVE' is already initialized (in tm5_init.F90) + IF (.NOT. LL_TM5_PHOTO_INI) THEN + if (.NOT. LAERCHEM)THEN + call PHOTOLYSIS_INI + ELSE + CALL ABOR1('tm5-based photolysis not yet initialized!!') + END if + + ENDIF + !END IF + ! define wavelengths for optics calculations + nwdep = nbands_trop + count(lmid.ne.lmid_gridA) + wav_grid = 0 + wav_gridA = 0 + allocate(photo_wavelengths(nwdep)) + + JL=1 + do JI=1,nbands_trop + if (lmid(JI)==lmid_gridA(JI)) then + photo_wavelengths(JL) = wave(lmid(JI))*1.e4 ! cm to um + wav_grid(JI) = JL + wav_gridA(JI) = JL + JL=JL+1 + else + photo_wavelengths(JL) = wave(lmid(JI))*1.e4 ! cm to um + photo_wavelengths(JL+1) = wave(lmid_gridA(JI))*1.e4 ! cm to um + wav_grid(JI) = JL + wav_gridA(JI) = JL+1 + JL=JL+2 + endif + enddo + allocate(wdep(nwdep)) + wdep(:)%wl = photo_wavelengths + wdep(:)%split = .false. + wdep(:)%insitu = .false. + + CALL TM5M7_OPTICS_INIT(NWDEP,WDEP) + + + deallocate(photo_wavelengths) + +! nwdep=14 +! !! A.Laakso: Taken from ecearth_optics (TM5-ECEARTH3) + ! HAM aerosol optics are using these too + NASWBAND=YDERAD%NTSW + allocate(ASWBAND(YDERAD%NTSW)) + ASWBAND( 13)%wl = 0.257_JPRB + ASWBAND( 12)%wl = 0.313_JPRB + ASWBAND( 11)%wl = 0.398_JPRB + ASWBAND( 10)%wl = 0.530_JPRB + ASWBAND( 9)%wl = 0.697_JPRB + ASWBAND( 8)%wl = 0.973_JPRB + ASWBAND( 7)%wl = 1.269_JPRB + ASWBAND( 6)%wl = 1.447_JPRB + ASWBAND( 5)%wl = 1.767_JPRB + ASWBAND(4)%wl = 2.040_JPRB + ASWBAND(3)%wl = 2.308_JPRB + ASWBAND(2)%wl = 2.752_JPRB + ASWBAND(1)%wl = 3.407_JPRB + ASWBAND(14)%wl = 5.254_JPRB + +! ASWBAND( 1)%wl = 0.257 +! ASWBAND( 2)%wl = 0.313 +! ASWBAND( 3)%wl = 0.398 +! ASWBAND( 4)%wl = 0.530 +! ASWBAND( 5)%wl = 0.697 +! ASWBAND( 6)%wl = 0.973 +! ASWBAND( 7)%wl = 1.269 +! ASWBAND( 8)%wl = 1.447 +! ASWBAND( 9)%wl = 1.767 +! ASWBAND(10)%wl = 2.040 +! ASWBAND(11)%wl = 2.308 +! ASWBAND(12)%wl = 2.752 +! ASWBAND(13)%wl = 3.407 +! ASWBAND(14)%wl = 5.254 + + ASWBAND(:)%split = .false. + ASWBAND(:)%insitu = .false. + + CALL TM5M7_OPTICS_INIT(NASWBAND,ASWBAND) + + !LW wavenumbers for ham optics + ALWWN1 = (/ & !< Spectral band lower boundary in wavenumbers + & 10._JPRB, 350._JPRB, 500._JPRB, 630._JPRB, 700._JPRB, 820._JPRB, & + & 980._JPRB,1080._JPRB,1180._JPRB,1390._JPRB,1480._JPRB,1800._JPRB, & + & 2080._JPRB,2250._JPRB,2380._JPRB,2600._JPRB/) + ALWWN2 = (/ & !< Spectral band upper boundary in wavenumbers + & 350._JPRB, 500._JPRB, 630._JPRB, 700._JPRB, 820._JPRB, 980._JPRB, & + & 1080._JPRB,1180._JPRB,1390._JPRB,1480._JPRB,1800._JPRB,2080._JPRB, & + & 2250._JPRB,2380._JPRB,2600._JPRB,3250._JPRB/) + + + CASE DEFAULT + + ! Option not implemented + CALL ABOR1(" NO AEROSOL SCHEME "//TRIM(AERO_SCHEME)) + +END SELECT + + + +END ASSOCIATE +IF (LHOOK) CALL DR_HOOK('TM5M7_INIT',1,ZHOOK_HANDLE) +END SUBROUTINE TM5M7_INIT + diff --git a/ifs-source/arpifs/phys_ec/tm5m7_optics_aop_get.F90 b/ifs-source/arpifs/phys_ec/tm5m7_optics_aop_get.F90 new file mode 100644 index 00000000..f8cdfdfc --- /dev/null +++ b/ifs-source/arpifs/phys_ec/tm5m7_optics_aop_get.F90 @@ -0,0 +1,249 @@ +SUBROUTINE TM5M7_OPTICS_AOP_GET( KIDIA,KFDIA,KLON, KLEV, NACTAERO, & + & nwav, wdep, ncontr, ecearth_units, & + & PRHO, PAERO, RW_MODE,RWD_MODE,H2O_MODE, & + & Paop_out_ext, Paop_out_a, Paop_out_g, aop_out_add ) + +!*** * TM5M7_OPTICS_AOP_GET* +! +! +!----------------------------------------------------------------------------- +! TM5 ! +!----------------------------------------------------------------------------- +!BOP +! +! !IROUTINE: OPTICS_AOP_GET +! +! !DESCRIPTION: Initialise the fields "aop_in" and then calculate the +! optical properties through a call to optics_calculate_aop. +!\\ +!\\ + +! SOURCE. +! ------- +! +! Taken from TM5-code +! +! MODIFICATIONS. +! -------------- +! +! Sep 2021 - V. Huijnen: first introduction into OpenIFS +! +! +!----------------------------------------------------------------------- + +USE PARKIND1 ,ONLY : JPIM ,JPRB +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE YOMLUN ,ONLY : NULOUT +USE YOEAERSRC, ONLY : YREAERSRC +!USE YOMCST, ONLY : +USE TM5M7_DATA, ONLY : H2SO4_FACTOR,NH4NO3_FACTOR, SO4_DENSITY,MSA_DENSITY, & + & NH4NO3_DENSITY, & + & MODAL_DATA,NMOD,NSOL +USE TM5M7_OPTICS_DATA, ONLY: WAVELENDEP, AOPI,NADD +USE YOM_YGFL , ONLY : YGFL +USE TM5M7_DATA, ONLY : & + & INO3_A , IACS_N , ISO4ACS , IBCACS , IPOMACS , ISSACS , IDUACS , & + & ISOANUS , ISOAAIS , ISOAACS , ISOACOS , ISOAAII , IH2OPART ,IAII_N , IBCAII , & + & IPOMAII , IACI_N , IDUACI , IAIS_N , ISO4AIS , IBCAIS , IPOMAIS , ICOI_N , & + & IDUCOI , ICOS_N , ISO4COS , IBCCOS , IPOMCOS , ISSCOS , IDUCOS , INUS_N , & + & ISO4NUS , IELVOC , IISVOC , IMSA + + +IMPLICIT NONE + +!----------------------------------------------------------------------- + +!* 0.1 ARGUMENTS +! --------- + +INTEGER(KIND=JPIM), INTENT(IN) :: KIDIA,KFDIA,KLON,KLEV,NACTAERO, NWAV,NCONTR +TYPE(WAVELENDEP), DIMENSION(NWAV), INTENT(IN):: WDEP +LOGICAL, INTENT(IN) :: ECEARTH_UNITS +REAL(KIND=JPRB), INTENT(IN) :: PRHO(KLON,KLEV) ! air Density [kg/m3] +REAL(KIND=JPRB), INTENT(IN) :: PAERO(KLON,KLEV,NACTAERO) + + +TYPE(MODAL_DATA), INTENT(IN) :: RW_MODE(NMOD) +TYPE(MODAL_DATA), INTENT(IN) :: RWD_MODE(NSOL) +TYPE(MODAL_DATA), INTENT(IN) :: H2O_MODE(NSOL) + +REAL(KIND=JPRB), INTENT(OUT):: PAOP_OUT_EXT(KLON,KLEV,NWAV,NCONTR) +REAL(KIND=JPRB), INTENT(OUT):: PAOP_OUT_A(KLON,KLEV,NWAV) +REAL(KIND=JPRB), INTENT(OUT):: PAOP_OUT_G(KLON,KLEV,NWAV) +REAL(KIND=JPRB), INTENT(OUT), OPTIONAL :: AOP_OUT_ADD(KLON,KLEV,NWAV,NADD) ! additional parameters + + +!* 0.2 LOCAL VARIABLES +! --------------- + +TYPE(AOPI), dimension(:,:), allocatable :: aop_in +INTEGER(KIND=JPRB) :: IMODE + +REAL(KIND=JPRB) :: ZHOOK_HANDLE +INTEGER(kind=JPIM)::NCHEM + +!----------------------------------------------------------------------- + +#include "tm5m7_optics_calculate_aop.intfb.h" +associate(NCHEM => YGFL%NCHEM) +!----------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('TM5M7_OPTICS_AOP_GET',0,ZHOOK_HANDLE) + + + + ! --- start ------------------------------ + + + allocate( aop_in(KLON,KLEV) ) + + ! Initialize full array to zero. + DO IMODE = 1, nmod + aop_in(1:KLON,1:KLEV)%so4 (IMODE) = 0.0_JPRB ; aop_in(1:KLON,1:KLEV)%bc (IMODE) = 0.0_JPRB + aop_in(1:KLON,1:KLEV)%oc (IMODE) = 0.0_JPRB ; aop_in(1:KLON,1:KLEV)%soa (IMODE) = 0.0_JPRB + aop_in(1:KLON,1:KLEV)%ss (IMODE) = 0.0_JPRB + aop_in(1:KLON,1:KLEV)%du (IMODE) = 0.0_JPRB ; aop_in(1:KLON,1:KLEV)%h2o (IMODE) = 0.0_JPRB + aop_in(1:KLON,1:KLEV)%numdens(IMODE) = 0.0_JPRB ; aop_in(1:KLON,1:KLEV)%rg (IMODE) = 0.0_JPRB + aop_in(1:KLON,1:KLEV)%rgd (IMODE) = 0.0_JPRB ; aop_in(1:KLON,1:KLEV)%no3 (IMODE) = 0.0_JPRB + END DO + +!>>> TvN +! In M7 sulphate is assumed to be H2-SO4 with corresponding particle density so4_density +! The sulphate mass should therefore also include the small contribution from the H atoms + ! NUS + aop_in(KIDIA:KFDIA,1:KLEV)%so4(1) = 1.E9_JPRB * h2so4_factor * PAERO(KIDIA:KFDIA,1:KLEV,iso4nus) + aop_in(KIDIA:KFDIA,1:KLEV)%soa(1) = 1.E9_JPRB * PAERO(KIDIA:KFDIA,1:KLEV,isoanus) + + ! AIS + aop_in(KIDIA:KFDIA,1:KLEV)%so4(2) = 1.E9_JPRB * h2so4_factor * PAERO(KIDIA:KFDIA,1:KLEV,iso4ais) + aop_in(KIDIA:KFDIA,1:KLEV)%bc (2) = 1.E9_JPRB * PAERO(KIDIA:KFDIA,1:KLEV,ibcais ) + aop_in(KIDIA:KFDIA,1:KLEV)%oc (2) = 1.E9_JPRB * PAERO(KIDIA:KFDIA,1:KLEV,ipomais) + aop_in(KIDIA:KFDIA,1:KLEV)%soa(2) = 1.E9_JPRB * PAERO(KIDIA:KFDIA,1:KLEV,isoaais) + ! ACS (additional: NO3) +! The contribution from methane sulfonate (MSA-) aerosol is added +! to that for sulfate. +! As the addition is done by volume, +! we need to account for the difference in densities +! (as done below for ammonium nitrate). + if(NCHEM<1) then + aop_in(KIDIA:KFDIA,1:KLEV)%so4(3) = 1.E9_JPRB * ( h2so4_factor * PAERO(KIDIA:KFDIA,1:KLEV,iso4acs)) + ELSE + aop_in(KIDIA:KFDIA,1:KLEV)%so4(3) = 1.E9_JPRB * ( h2so4_factor * PAERO(KIDIA:KFDIA,1:KLEV,iso4acs) + & + (so4_density / msa_density) * PAERO(KIDIA:KFDIA,1:KLEV,imsa) ) + END if +! Since nh4no3_density is the density of NH4NO3, the contribution from NH4 should be included. +! Moreover, assuming the same refractive index for NH4NO3 as for H2-SO4, +! the contributions from both components can be added by volume; +! thus we need to account for the difference in densities. +! Estimates of the refractive index of NH4NO3 are available from literature +! (e.g. Lowenthal et al., Atmos. Environ., 2000). +! For practical purposes, it can be set equal to the value used for sulfate, +! i.e. the value for a solution containing 75% H2SO4 (Fenn et al., 1985). + if(NCHEM>0) then + aop_in(KIDIA:KFDIA,1:KLEV)%no3(3) = 1.E9_JPRB * nh4no3_factor * (so4_density / nh4no3_density) * & + PAERO(KIDIA:KFDIA,1:KLEV,ino3_a ) + END if + aop_in(KIDIA:KFDIA,1:KLEV)%bc (3) = 1.E9_JPRB * PAERO(KIDIA:KFDIA,1:KLEV,ibcacs ) + aop_in(KIDIA:KFDIA,1:KLEV)%oc (3) = 1.E9_JPRB * PAERO(KIDIA:KFDIA,1:KLEV,ipomacs) + aop_in(KIDIA:KFDIA,1:KLEV)%soa(3) = 1.E9_JPRB * PAERO(KIDIA:KFDIA,1:KLEV,isoaacs) + aop_in(KIDIA:KFDIA,1:KLEV)%ss (3) = 1.E9_JPRB * PAERO(KIDIA:KFDIA,1:KLEV,issacs ) + aop_in(KIDIA:KFDIA,1:KLEV)%du (3) = 1.E9_JPRB * PAERO(KIDIA:KFDIA,1:KLEV,iduacs ) + ! COS + aop_in(KIDIA:KFDIA,1:KLEV)%so4(4) = 1.E9_JPRB * h2so4_factor * PAERO(KIDIA:KFDIA,1:KLEV,iso4cos) +!<<< TvN + aop_in(KIDIA:KFDIA,1:KLEV)%bc (4) = 1.E9_JPRB * PAERO(KIDIA:KFDIA,1:KLEV,ibccos ) + aop_in(KIDIA:KFDIA,1:KLEV)%oc (4) = 1.E9_JPRB * PAERO(KIDIA:KFDIA,1:KLEV,ipomcos) + aop_in(KIDIA:KFDIA,1:KLEV)%soa(4) = 1.E9_JPRB * PAERO(KIDIA:KFDIA,1:KLEV,isoacos) + aop_in(KIDIA:KFDIA,1:KLEV)%ss (4) = 1.E9_JPRB * PAERO(KIDIA:KFDIA,1:KLEV,isscos ) + aop_in(KIDIA:KFDIA,1:KLEV)%du (4) = 1.E9_JPRB * PAERO(KIDIA:KFDIA,1:KLEV,iducos ) + ! AII + aop_in(KIDIA:KFDIA,1:KLEV)%bc (5) = 1.E9_JPRB * PAERO(KIDIA:KFDIA,1:KLEV,ibcaii ) + aop_in(KIDIA:KFDIA,1:KLEV)%oc (5) = 1.E9_JPRB * PAERO(KIDIA:KFDIA,1:KLEV,ipomaii) + aop_in(KIDIA:KFDIA,1:KLEV)%soa(5) = 1.E9_JPRB * PAERO(KIDIA:KFDIA,1:KLEV,isoaaii) + ! ACI + aop_in(KIDIA:KFDIA,1:KLEV)%du (6) = 1.E9_JPRB * PAERO(KIDIA:KFDIA,1:KLEV,iduaci ) + ! COI + aop_in(KIDIA:KFDIA,1:KLEV)%du (7) = 1.E9_JPRB * PAERO(KIDIA:KFDIA,1:KLEV,iducoi ) + ! Water in (hydrophillic) modes + aop_in(KIDIA:KFDIA,1:KLEV)%h2o(1) = 1.E9_JPRB * h2o_mode(1)%d2(KIDIA:KFDIA,1:KLEV) + aop_in(KIDIA:KFDIA,1:KLEV)%h2o(2) = 1.E9_JPRB * h2o_mode(2)%d2(KIDIA:KFDIA,1:KLEV) + aop_in(KIDIA:KFDIA,1:KLEV)%h2o(3) = 1.E9_JPRB * h2o_mode(3)%d2(KIDIA:KFDIA,1:KLEV) + aop_in(KIDIA:KFDIA,1:KLEV)%h2o(4) = 1.E9_JPRB * h2o_mode(4)%d2(KIDIA:KFDIA,1:KLEV) + + aop_in(KIDIA:KFDIA,1:KLEV)%rg (1) = 1.E6_JPRB * rw_mode (1)%d2(KIDIA:KFDIA,1:KLEV) + aop_in(KIDIA:KFDIA,1:KLEV)%rg (2) = 1.E6_JPRB * rw_mode (2)%d2(KIDIA:KFDIA,1:KLEV) + aop_in(KIDIA:KFDIA,1:KLEV)%rg (3) = 1.E6_JPRB * rw_mode (3)%d2(KIDIA:KFDIA,1:KLEV) + aop_in(KIDIA:KFDIA,1:KLEV)%rg (4) = 1.E6_JPRB * rw_mode (4)%d2(KIDIA:KFDIA,1:KLEV) + aop_in(KIDIA:KFDIA,1:KLEV)%rg (5) = 1.E6_JPRB * rw_mode (5)%d2(KIDIA:KFDIA,1:KLEV) + aop_in(KIDIA:KFDIA,1:KLEV)%rg (6) = 1.E6_JPRB * rw_mode (6)%d2(KIDIA:KFDIA,1:KLEV) + aop_in(KIDIA:KFDIA,1:KLEV)%rg (7) = 1.E6_JPRB * rw_mode (7)%d2(KIDIA:KFDIA,1:KLEV) + + ! dry radius for soluble modes / rest equals the usual radii + aop_in(KIDIA:KFDIA,1:KLEV)%rgd(1) = 1.E6_JPRB * rwd_mode(1)%d2(KIDIA:KFDIA,1:KLEV) + aop_in(KIDIA:KFDIA,1:KLEV)%rgd(2) = 1.E6_JPRB * rwd_mode(2)%d2(KIDIA:KFDIA,1:KLEV) + aop_in(KIDIA:KFDIA,1:KLEV)%rgd(3) = 1.E6_JPRB * rwd_mode(3)%d2(KIDIA:KFDIA,1:KLEV) + aop_in(KIDIA:KFDIA,1:KLEV)%rgd(4) = 1.E6_JPRB * rwd_mode(4)%d2(KIDIA:KFDIA,1:KLEV) + aop_in(KIDIA:KFDIA,1:KLEV)%rgd(5) = aop_in(KIDIA:KFDIA,1:KLEV)%rg (5) + aop_in(KIDIA:KFDIA,1:KLEV)%rgd(6) = aop_in(KIDIA:KFDIA,1:KLEV)%rg (6) + aop_in(KIDIA:KFDIA,1:KLEV)%rgd(7) = aop_in(KIDIA:KFDIA,1:KLEV)%rg (7) + + + !VH original: rm/vol ->units [N/gridbox] / [m3/gridbox] -> [Number/m3] + !VH new PAERO/ DENS-> units [N/kg] * [kg/m3] = [N/m3] + aop_in(KIDIA:KFDIA,1:KLEV)%numdens(1) = PAERO(KIDIA:KFDIA,1:KLEV,inus_n) * PRHO(KIDIA:KFDIA,1:KLEV) + aop_in(KIDIA:KFDIA,1:KLEV)%numdens(2) = PAERO(KIDIA:KFDIA,1:KLEV,iais_n) * PRHO(KIDIA:KFDIA,1:KLEV) + aop_in(KIDIA:KFDIA,1:KLEV)%numdens(3) = PAERO(KIDIA:KFDIA,1:KLEV,iacs_n) * PRHO(KIDIA:KFDIA,1:KLEV) + aop_in(KIDIA:KFDIA,1:KLEV)%numdens(4) = PAERO(KIDIA:KFDIA,1:KLEV,icos_n) * PRHO(KIDIA:KFDIA,1:KLEV) + aop_in(KIDIA:KFDIA,1:KLEV)%numdens(5) = PAERO(KIDIA:KFDIA,1:KLEV,iaii_n) * PRHO(KIDIA:KFDIA,1:KLEV) + aop_in(KIDIA:KFDIA,1:KLEV)%numdens(6) = PAERO(KIDIA:KFDIA,1:KLEV,iaci_n) * PRHO(KIDIA:KFDIA,1:KLEV) + aop_in(KIDIA:KFDIA,1:KLEV)%numdens(7) = PAERO(KIDIA:KFDIA,1:KLEV,icoi_n) * PRHO(KIDIA:KFDIA,1:KLEV) + !TB safeguard for early timesteps when very small negatives may appear + where(aop_in(KIDIA:KFDIA,1:KLEV)%numdens(1) .lt. 1.E-15_JPRB )aop_in(KIDIA:KFDIA,1:KLEV)%numdens(1) = 1.E-15_JPRB + where(aop_in(KIDIA:KFDIA,1:KLEV)%numdens(2).lt. 1.E-15_JPRB ) aop_in(KIDIA:KFDIA,1:KLEV)%numdens(2) = 1.E-15_JPRB + where(aop_in(KIDIA:KFDIA,1:KLEV)%numdens(3) .lt. 1.E-15_JPRB )aop_in(KIDIA:KFDIA,1:KLEV)%numdens(3) = 1.E-15_JPRB + where(aop_in(KIDIA:KFDIA,1:KLEV)%numdens(4).lt. 1.E-15_JPRB )aop_in(KIDIA:KFDIA,1:KLEV)%numdens(4) = 1.E-15_JPRB + where(aop_in(KIDIA:KFDIA,1:KLEV)%numdens(5).lt. 1.E-15_JPRB ) aop_in(KIDIA:KFDIA,1:KLEV)%numdens(5) = 1.E-15_JPRB + where(aop_in(KIDIA:KFDIA,1:KLEV)%numdens(6) .lt. 1.E-15_JPRB ) aop_in(KIDIA:KFDIA,1:KLEV)%numdens(6) = 1.E-15_JPRB + where(aop_in(KIDIA:KFDIA,1:KLEV)%numdens(7).lt. 1.E-15_JPRB ) aop_in(KIDIA:KFDIA,1:KLEV)%numdens(7) = 1.E-15_JPRB + + ! check valid ranges in particle sizes (might be zero) + where( aop_in(KIDIA:KFDIA,1:KLEV)%rg (1) .lt. 1.E-15_JPRB ) aop_in(KIDIA:KFDIA,1:KLEV)%rg (1) = 1.E-15_JPRB + where( aop_in(KIDIA:KFDIA,1:KLEV)%rgd(1) .lt. 1.E-15_JPRB ) aop_in(KIDIA:KFDIA,1:KLEV)%rgd(1) = 1.E-15_JPRB + where( aop_in(KIDIA:KFDIA,1:KLEV)%rg (2) .lt. 1.E-15_JPRB ) aop_in(KIDIA:KFDIA,1:KLEV)%rg (2) = 1.E-15_JPRB + where( aop_in(KIDIA:KFDIA,1:KLEV)%rgd(2) .lt. 1.E-15_JPRB ) aop_in(KIDIA:KFDIA,1:KLEV)%rgd(2) = 1.E-15_JPRB + where( aop_in(KIDIA:KFDIA,1:KLEV)%rg (3) .lt. 1.E-15_JPRB ) aop_in(KIDIA:KFDIA,1:KLEV)%rg (3) = 1.E-15_JPRB + where( aop_in(KIDIA:KFDIA,1:KLEV)%rgd(3) .lt. 1.E-15_JPRB ) aop_in(KIDIA:KFDIA,1:KLEV)%rgd(3) = 1.E-15_JPRB + where( aop_in(KIDIA:KFDIA,1:KLEV)%rg (4) .lt. 1.E-15_JPRB ) aop_in(KIDIA:KFDIA,1:KLEV)%rg (4) = 1.E-15_JPRB + where( aop_in(KIDIA:KFDIA,1:KLEV)%rgd(4) .lt. 1.E-15_JPRB ) aop_in(KIDIA:KFDIA,1:KLEV)%rgd(4) = 1.E-15_JPRB + where( aop_in(KIDIA:KFDIA,1:KLEV)%rg (5) .lt. 1.E-15_JPRB ) aop_in(KIDIA:KFDIA,1:KLEV)%rg (5) = 1.E-15_JPRB + where( aop_in(KIDIA:KFDIA,1:KLEV)%rgd(5) .lt. 1.E-15_JPRB ) aop_in(KIDIA:KFDIA,1:KLEV)%rgd(5) = 1.E-15_JPRB + where( aop_in(KIDIA:KFDIA,1:KLEV)%rg (6) .lt. 1.E-15_JPRB ) aop_in(KIDIA:KFDIA,1:KLEV)%rg (6) = 1.E-15_JPRB + where( aop_in(KIDIA:KFDIA,1:KLEV)%rgd(6) .lt. 1.E-15_JPRB ) aop_in(KIDIA:KFDIA,1:KLEV)%rgd(6) = 1.E-15_JPRB + where( aop_in(KIDIA:KFDIA,1:KLEV)%rg (7) .lt. 1.E-15_JPRB ) aop_in(KIDIA:KFDIA,1:KLEV)%rg (7) = 1.E-15_JPRB + where( aop_in(KIDIA:KFDIA,1:KLEV)%rgd(7) .lt. 1.E-15_JPRB ) aop_in(KIDIA:KFDIA,1:KLEV)%rgd(7) = 1.E-15_JPRB + + + ! Initialization to zero is done in tm5m7_optics_calculate_aop + !Paop_out_ext=0.0_JPRB + !Paop_out_a=0.0_JPRB + !Paop_out_g=0.0_JPRB + if (present(aop_out_add)) then + call tm5m7_optics_calculate_aop(KIDIA,KFDIA, KLON,KLEV, nwav,NCONTR, wdep, ecearth_units, & + & AOP_IN, & + & Paop_out_ext, Paop_out_a, Paop_out_g, aop_out_add ) + else + call tm5m7_optics_calculate_aop( KIDIA,KFDIA,KLON,KLEV, nwav, NCONTR, wdep, ecearth_units, & + & AOP_IN, & + & Paop_out_ext, Paop_out_a, Paop_out_g ) + endif + + ! OK + Deallocate( aop_in ) + + + + + + +IF(LHOOK) CALL DR_HOOK('TM5M7_OPTICS_AOP_GET',1,ZHOOK_HANDLE) +end associate +END SUBROUTINE TM5M7_OPTICS_AOP_GET diff --git a/ifs-source/arpifs/phys_ec/tm5m7_optics_calculate_aop.F90 b/ifs-source/arpifs/phys_ec/tm5m7_optics_calculate_aop.F90 new file mode 100644 index 00000000..1a92013e --- /dev/null +++ b/ifs-source/arpifs/phys_ec/tm5m7_optics_calculate_aop.F90 @@ -0,0 +1,416 @@ +SUBROUTINE TM5M7_OPTICS_CALCULATE_AOP(KIDIA,KFDIA,KLON,KLEV, nwl,NCONTR, wdep, ecearth_units, & + & AOP_IN, & + & PAOP_OUT_EXT, PAOP_OUT_A, PAOP_OUT_G, PAOP_OUT_ADD ) + +!*** * TM5M7_OPTICS_CALCULATE_AOP* +! +! +!----------------------------------------------------------------------------- +! TM5 ! +!----------------------------------------------------------------------------- +!BOP +! +! !IROUTINE: OPTICS_CALCULATE_AOP +! +! !DESCRIPTION: This routine writes on PAOP_OUT_* (module wide parameters) +! the retrieved aerosol properties. The caller has to ensure +! that these fields have been allocated properly. +! IMPORTANT: OC is actually POM. +! Remember converting OC to POM when sending it to this method. +!\\ +!\\ + +! SOURCE. +! ------- +! +! Taken from TM5-code +! +! MODIFICATIONS. +! -------------- +! +! +! !REVISION HISTORY: +! 12 Aug 2008 - Michael Kahnert, SMHI +! 6 Feb 2011 - Achim Strunk - +! +! Sep 2021 - V. Huijnen: first introduction into OpenIFS +! +! +!----------------------------------------------------------------------- + +USE PARKIND1 ,ONLY : JPIM ,JPRB +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE YOMLUN ,ONLY : NULOUT,NULERR + +USE YOMCST, ONLY : RPI +USE TM5M7_DATA, ONLY : SIGMA, H2SO4_FACTOR,NH4NO3_FACTOR, SO4_DENSITY,MSA_DENSITY, & + & CMEDR2MMEDR,CARBON_DENSITY,POM_DENSITY,SOA_DENSITY,SS_DENSITY,DUST_DENSITY,& + & MODAL_DATA,NMOD,NSOL +USE TM5M7_OPTICS_DATA, ONLY: WAVELENDEP, AOPI,NADD, & + & cext_159, a_159, g_159, cext_200, a_200, g_200 + +IMPLICIT NONE + +!----------------------------------------------------------------------- + +!* 0.1 ARGUMENTS +! --------- + +INTEGER(KIND=JPIM) , INTENT(IN) :: KIDIA,KFDIA,KLON,KLEV,NWL,NCONTR +TYPE(WAVELENDEP), DIMENSION(NWL), INTENT(IN) :: WDEP +LOGICAL , INTENT(IN) :: ECEARTH_UNITS +TYPE(AOPI), DIMENSION(KLON,KLEV), INTENT(IN) :: AOP_IN + + +REAL(KIND=JPRB), INTENT(OUT):: PAOP_OUT_EXT(KLON,KLEV,NWL,NCONTR) +REAL(KIND=JPRB), INTENT(OUT):: PAOP_OUT_A(KLON,KLEV,NWL) +REAL(KIND=JPRB), INTENT(OUT):: PAOP_OUT_G(KLON,KLEV,NWL) +REAL(KIND=JPRB), INTENT(OUT), OPTIONAL :: PAOP_OUT_ADD(KLON,KLEV,NWL,NADD) ! additional parameters + + + +!* 0.2 LOCAL VARIABLES +! --------------- +REAL(KIND=JPRB), DIMENSION(KLON,KLEV) :: NCsca, incext +REAL(KIND=JPRB) :: Cexti, ai, gi, NCscai, xg +COMPLEX :: m_eff +REAL(KIND=JPRB), DIMENSION(:),allocatable :: lnsigma + +INTEGER(KIND=JPIM) :: i, imode, JL,JK +INTEGER(KIND=JPIM) :: statusomp +LOGICAL :: coarse +REAL(KIND=JPRB) :: totvoldry, modfrac +REAL(KIND=JPRB), DIMENSION(:,:,:), Pointer :: cext_table, a_table, g_table +REAL(KIND=JPRB) :: TWOPI + +REAL(KIND=JPRB) :: ZHOOK_HANDLE +!----------------------------------------------------------------------- + +#include "tm5m7_get_refr_idx.intfb.h" +#include "tm5m7_optics_get.intfb.h" + + +!----------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('TM5M7_OPTICS_CALCULATE_AOP',0,ZHOOK_HANDLE) + + + TWOPI=2*RPI + +! allocate( NCsca ( KLON,KLEV ) ) +! allocate( incext( KLON,KLEV ) ) + STATUSOMP=0 + + + ! Sulphate based on OPAC (Hess et al., 1998): + + !======================================================================= + ! Get refractive indices of each component at the given wavelength: + !======================================================================= + do i = 1, nwl ! loop over wavelengths + + if( wdep(i)%split .or. wdep(i)%insitu ) then + allocate( lnsigma( nmod ) ) + lnsigma = log(sigma) + end if + + PAOP_OUT_EXT(KIDIA:KFDIA,1:KLEV,i,:) = 0.0_JPRB + PAOP_OUT_G (KIDIA:KFDIA,1:KLEV,i) = 0.0_JPRB + PAOP_OUT_A (KIDIA:KFDIA,1:KLEV,i) = 0.0_JPRB + if( wdep(i)%insitu ) PAOP_OUT_ADD(KIDIA:KFDIA,1:KLEV,i,:) = 0.0_JPRB + NCsca (KIDIA:KFDIA,1:KLEV) = 0.0_JPRB + + do imode = 1, 7 ! loop over M7 modes + coarse = (imode .eq. 4 .or. imode .eq. 7) + + If (coarse) then + cext_table => cext_200 + a_table => a_200 + g_table => g_200 + Else + cext_table => cext_159 + a_table => a_159 + g_table => g_159 + End if + + + !======================================================================= + ! Compute effective refractive index of internally mixed aerosols + ! for each grid cell and mode: + !======================================================================= + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + !write(1001,*) aop_in(JL,JK)%SO4(imode) + !write(1002,*) aop_in(JL,JK)%SOA(imode) + !write(1003,*) aop_in(JL,JK)%BC(imode) + !write(1005,*) aop_in(JL,JK)%OC(imode) + !write(1004,*) aop_in(JL,JK)%SS(imode) + !write(1006,*) aop_in(JL,JK)%DU(imode) + !write(1007,*) aop_in(JL,JK)%NO3(imode) + call tm5m7_get_refr_idx( wdep(i), & + aop_in(JL,JK)%SO4(imode) + aop_in(JL,JK)%NO3(imode), & ! H2-SO4 + NH4NO3 + aop_in(JL,JK)%BC (imode), aop_in(JL,JK)%OC (imode), & + aop_in(JL,JK)%SOA (imode), & + aop_in(JL,JK)%SS (imode), aop_in(JL,JK)%DU (imode), & + aop_in(JL,JK)%h2o(imode), imode, m_eff) + !if (statusomp ==1) then + ! WRITE(NULERR,'(" Problem with GET_REFR_IDX-NAN inputs: ", 9(E16.4,2x))') & + ! aop_in(JL,JK)%SO4(imode), aop_in(JL,JK)%NO3(imode), aop_in(JL,JK)%h2o(imode), & + ! aop_in(JL,JK)%SOA(imode),aop_in(JL,JK)%BC(imode), aop_in(JL,JK)%OC(imode),& + ! aop_in(JL,JK)%SS(imode), aop_in(JL,JK)%DU(imode) + ! ! Assume edge case not caught. Set m_eff to default (1.0,1.0e-9), same as in ref_idx + ! ! (subroutine problems with inputs SO4 and WATER?) + ! m_eff= Cmplx(1.0,1.0e-9) + ! ! If all edge cases were handled correctly, that should be: + ! !CALL ABOR1("Problem with tm5m7_get_refr_idx" ) + !endif + + ! cmk added towpi for new netcdf lookup table + xg = twopi*aop_in(JL,JK)%rg(imode) / wdep(i)%wl + + !======================================================================= + ! get aerosol optical properties from data base for each mode + !======================================================================= + ! add extra safeguard for negative xg. It is unphysical, but have a safeguard anyway + ! added for refr_idx_nan problem + + if (xg .gt. 0.0) then + call TM5M7_OPTICS_GET(m_eff, xg, Cexti, ai, gi, cext_table, a_table, g_table, statusomp ) + else + Cexti=0.0 + ai=1.0 + gi=1.0 + end if + if (statusomp ==1) then + call ABOR1("ERROR due to TM5M7_OPTICS_GET") + endif + + ! Multiply Cext with lambda^2 to get the cross section. + Cexti = Cexti*(wdep(i)%wl**2) + ! this here is extinction coefficient in this mode + incext(JL,JK) = aop_in(JL,JK)%numdens(imode) * Cexti + ! sum up partial coefficients + PAOP_OUT_EXT(JL,JK,i,1) = PAOP_OUT_EXT(JL,JK,i,1) + incext(JL,JK) + + ! scattering portion + NCscai = ai * incext(JL,JK) + + ! sum up weights for average (both albedo and asymmetry) + NCsca (JL,JK) = NCsca (JL,JK) + NCscai + PAOP_OUT_G(JL,JK,i) = PAOP_OUT_G(JL,JK,i) + NCscai * gi + + END DO + END DO + + ! Split extinction to separate contributions from constituents in modes. + ! A volume mixing is assumed (in contrast to the explicit mixing in get_refr_ind). + if( wdep(i)%split .or. wdep(i)%insitu) then + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + + if (wdep(i)%split) then + + ! The fine-mode contributions to the extinction + ! includes the contributions from particles + ! with (wet) diameters smaller than 1 micron. + ! For wet particles, only part of the accumulation mode + ! should be included, and the coarse mode should be excluded. + if (.not.coarse) then + ! Currently, the contribution of the accumulation mode + ! is approximated using weighting by volume scaling factor modfrac. + ! For extinction, area weighting would probably be more appropriate!! + if (imode .eq. 3 .or. imode .eq. 6 ) then + ! - convert number mean radius to volume mean radius (by cmedr2mmedr(imode)) + ! - 1 micron diameter --> radius is 0.5 microns (rg is also in microns) + modfrac = 0.5 + 0.5 * ERF( log( 0.5 / (aop_in(JL,JK)%rg(imode) * cmedr2mmedr(imode)) ) / & + (sqrt(2.0) * lnsigma(imode)) ) + else + ! Include full nucleation and Aitken mode contributions. + modfrac = 1.0 + endif + PAOP_OUT_EXT(JL,JK,i,10) = PAOP_OUT_EXT(JL,JK,i,10) + modfrac * incext(JL,JK) + endif + ! total volume from so4/no3/bc/oc/ss/du in this mode (ATTENTION: DRY!!) + ! take no3 as so4 + totvoldry = aop_in(JL,JK)%so4(imode)/so4_density + aop_in(JL,JK)%no3(imode)/so4_density + & + aop_in(JL,JK)%bc (imode)/carbon_density + aop_in(JL,JK)%oc (imode)/pom_density + & + aop_in(JL,JK)%soa (imode)/soa_density + & + aop_in(JL,JK)%ss (imode)/ss_density + aop_in(JL,JK)%du (imode)/dust_density + ! check whether there is some volume available + ! otherwise assign zeros to extinction increments + if( totvoldry < tiny(totvoldry) ) then + write(NULOUT,'("WARNING: no volume in mode (",i3,"). assigning zero extinctions")') imode + cycle + end if + ! H2-SO4 contribution + PAOP_OUT_EXT(JL,JK,i,2) = PAOP_OUT_EXT(JL,JK,i,2) + incext(JL,JK) * (aop_in(JL,JK)%so4(imode)/so4_density ) / totvoldry + ! BC contribution + PAOP_OUT_EXT(JL,JK,i,3) = PAOP_OUT_EXT(JL,JK,i,3) + incext(JL,JK) * (aop_in(JL,JK)%bc (imode)/carbon_density) / totvoldry + ! POM contribution + PAOP_OUT_EXT(JL,JK,i,4) = PAOP_OUT_EXT(JL,JK,i,4) + incext(JL,JK) * (aop_in(JL,JK)%oc (imode)/pom_density ) / totvoldry + ! SOA contribution + PAOP_OUT_EXT(JL,JK,i,5) = PAOP_OUT_EXT(JL,JK,i,5) + incext(JL,JK) * (aop_in(JL,JK)%soa (imode)/soa_density ) / totvoldry + ! SS contribution + PAOP_OUT_EXT(JL,JK,i,6) = PAOP_OUT_EXT(JL,JK,i,6) + incext(JL,JK) * (aop_in(JL,JK)%ss (imode)/ss_density ) / totvoldry + ! DU contribution + PAOP_OUT_EXT(JL,JK,i,7) = PAOP_OUT_EXT(JL,JK,i,7) + incext(JL,JK) * (aop_in(JL,JK)%du (imode)/dust_density ) / totvoldry + ! NH4NO3 contribution + PAOP_OUT_EXT(JL,JK,i,8) = PAOP_OUT_EXT(JL,JK,i,8) + incext(JL,JK) * (aop_in(JL,JK)%no3(imode)/so4_density ) / totvoldry + ! Fine-mode contributions for dust and sea salt + if (.not.coarse) then + PAOP_OUT_EXT(JL,JK,i,11) = PAOP_OUT_EXT(JL,JK,i,11) + incext(JL,JK) * (aop_in(JL,JK)%du (imode)/dust_density ) / totvoldry * modfrac + + PAOP_OUT_EXT(JL,JK,i,12) = PAOP_OUT_EXT(JL,JK,i,12) + incext(JL,JK) * (aop_in(JL,JK)%ss (imode)/ss_density ) / totvoldry * modfrac + endif + endif + + ! Water contribution: + ! Get optical properties without water, the difference will be extinction due to + ! water existence + ! - mis-use gi for this + gi = 0.0 + call tm5m7_get_refr_idx( wdep(i), & + aop_in(JL,JK)%SO4(imode),&! + aop_in(JL,JK)%NO3(imode), & + aop_in(JL,JK)%BC (imode), aop_in(JL,JK)%OC (imode), & + aop_in(JL,JK)%SOA(imode), & + aop_in(JL,JK)%SS (imode), aop_in(JL,JK)%DU (imode), & + gi, imode, m_eff) + !if (statusomp ==1) then + ! write (NULERR,'("Problem with GET_REFR_IDX-NAN inputs: ", 9(E16.4,2x))') & + ! aop_in(JL,JK)%SO4(imode), aop_in(JL,JK)%NO3(imode), aop_in(JL,JK)%h2o(imode), & + ! aop_in(JL,JK)%SOA(imode),aop_in(JL,JK)%BC(imode), aop_in(JL,JK)%OC(imode),& + ! aop_in(JL,JK)%SS(imode), aop_in(JL,JK)%DU(imode) + ! ! Assume edge case not caught. Set m_eff to default (1.0,1.0e-9), same as in ref_idx + ! ! (subroutine problems with inputs SO4 and WATER?) + ! m_eff= Cmplx(1.0,1.0e-9) + ! ! If all edge cases were handled correctly, that should be: + ! ! call ABOR1("error in tm5m7_optics_calculate_aop") + ! endif + + ! here we need the dry radius!!! + !>>> TvN + ! 2*pi should be included (see comment above) + !xg = aop_in(JL,JK)%rgd(imode) / wdep(i)%wl + xg = twopi*aop_in(JL,JK)%rgd(imode) / wdep(i)%wl + !<<< TvN + ! TB + ! add extra safeguard for negative xg, unphysical but have a safeguard + ! added for refr_idx_nan problem + if (xg .gt. 0.0) then + call TM5M7_OPTICS_GET(m_eff, xg, Cexti, ai, gi, cext_table, a_table, g_table, statusomp ) + else + Cexti=0.0 + ai=1.0 + gi=1.0 + end if + + if (statusomp ==1) then + call ABOR1("error in tm5m7_optics_calculate_aop") + endif + + Cexti = Cexti*(wdep(i)%wl**2) + + if (wdep(i)%split) then + ! add difference to water subarray + PAOP_OUT_EXT(JL,JK,i,9) = PAOP_OUT_EXT(JL,JK,i,9) + (incext(JL,JK) - aop_in(JL,JK)%numdens(imode) * Cexti) + endif + + if (wdep(i)%insitu) then + ! Surface dry extinction and absorption: + !>>> TvN + ! Remove cut off for the total values: + !modfrac = 0.5 + 0.5 * ERF( log( 5.0 / (aop_in(JL,JK)%rgd(imode) * cmedr2mmedr(imode)) ) / & + ! (sqrt(2.0) * lnsigma(imode)) ) + ! extinction and absorption (extinction-scattering): + !PAOP_OUT_ADD(JL,JK,i,1) = PAOP_OUT_ADD(JL,JK,i,1) + modfrac * aop_in(JL,JK)%numdens(imode) * Cexti + !PAOP_OUT_ADD(JL,JK,i,2) = PAOP_OUT_ADD(JL,JK,i,2) + modfrac * aop_in(JL,JK)%numdens(imode) * Cexti * (1. - ai) + PAOP_OUT_ADD(JL,JK,i,1) = PAOP_OUT_ADD(JL,JK,i,1) + aop_in(JL,JK)%numdens(imode) * Cexti + PAOP_OUT_ADD(JL,JK,i,2) = PAOP_OUT_ADD(JL,JK,i,2) + aop_in(JL,JK)%numdens(imode) * Cexti * (1. - ai) + PAOP_OUT_ADD(JL,JK,i,3) = PAOP_OUT_ADD(JL,JK,i,3) + aop_in(JL,JK)%numdens(imode) * Cexti * ai * gi + ! Add fine-mode contributions + ! For dry aerosol, the fine-mode optical properties include + ! the full accumulation mode, but not the coarse mode: + if (.not.coarse) then + PAOP_OUT_ADD(JL,JK,i,4) = PAOP_OUT_ADD(JL,JK,i,4) + aop_in(JL,JK)%numdens(imode) * Cexti + PAOP_OUT_ADD(JL,JK,i,5) = PAOP_OUT_ADD(JL,JK,i,5) + aop_in(JL,JK)%numdens(imode) * Cexti * (1. - ai) + endif + !<<< TvN + endif + + end do ! JL + end do ! JK + end if + + enddo ! modes + + if (ecearth_units) then + ! return extinction due to absorption + ! and asymmetry factor multiplied by extinction due to scattering + ! and convert um**2/m**3 into 1/m (as for extinction below) + PAOP_OUT_A(KIDIA:KFDIA,1:KLEV,i) = ( PAOP_OUT_EXT(KIDIA:KFDIA,1:KLEV,i,1) - NCsca(KIDIA:KFDIA,1:KLEV) ) * 1.e-12 + PAOP_OUT_G(KIDIA:KFDIA,1:KLEV,i) = PAOP_OUT_G(KIDIA:KFDIA,1:KLEV,i) * 1.e-12 + else + ! return single-scattering albedo and asymmetry factor + ! take into account small extinction values + where( PAOP_OUT_EXT(KIDIA:KFDIA,1:KLEV,i,1) > tiny(0.0) ) + PAOP_OUT_A(KIDIA:KFDIA,1:KLEV,i) = NCsca(KIDIA:KFDIA,1:KLEV) / PAOP_OUT_EXT(KIDIA:KFDIA,1:KLEV,i,1) + elsewhere + ! No extinction -> Fill 1.0 for albedo because it looks clean. + PAOP_OUT_A(KIDIA:KFDIA,1:KLEV,i) = 1.0 + endwhere + + ! take into account small extinction values + where( NCsca(KIDIA:KFDIA,1:KLEV) > tiny(0.0) ) + PAOP_OUT_G(KIDIA:KFDIA,1:KLEV,i) = PAOP_OUT_G(KIDIA:KFDIA,1:KLEV,i) / NCsca(KIDIA:KFDIA,1:KLEV) + elsewhere + ! No scattering at all -> Fill 1.0 for asymmetry because it looks clean. + PAOP_OUT_G(KIDIA:KFDIA,1:KLEV,i) = 1.0 + endwhere + endif + + ! convert um**2/m**3 into 1/m + PAOP_OUT_EXT(KIDIA:KFDIA,1:KLEV,i,:) = PAOP_OUT_EXT(KIDIA:KFDIA,1:KLEV,i,:) * 1e-12 + + if( wdep(i)%insitu) then + ! take into account small extinction values + where( PAOP_OUT_ADD(KIDIA:KFDIA,1:KLEV,i,1) - PAOP_OUT_ADD(KIDIA:KFDIA,1:KLEV,i,2) > tiny(0.0) ) + PAOP_OUT_ADD(KIDIA:KFDIA,1:KLEV,i,3) = PAOP_OUT_ADD(KIDIA:KFDIA,1:KLEV,i,3) / (PAOP_OUT_ADD(KIDIA:KFDIA,1:KLEV,i,1)-PAOP_OUT_ADD(KIDIA:KFDIA,1:KLEV,i,2)) + elsewhere + ! No scattering at all -> Fill 1.0 for asymmetry because it looks clean. + PAOP_OUT_ADD(KIDIA:KFDIA,1:KLEV,i,3) = 1.0 + endwhere + + PAOP_OUT_ADD(KIDIA:KFDIA,1:KLEV,i,1) = PAOP_OUT_ADD(KIDIA:KFDIA,1:KLEV,i,1) * 1e-12 + PAOP_OUT_ADD(KIDIA:KFDIA,1:KLEV,i,2) = PAOP_OUT_ADD(KIDIA:KFDIA,1:KLEV,i,2) * 1e-12 + PAOP_OUT_ADD(KIDIA:KFDIA,1:KLEV,i,4) = PAOP_OUT_ADD(KIDIA:KFDIA,1:KLEV,i,4) * 1e-12 + PAOP_OUT_ADD(KIDIA:KFDIA,1:KLEV,i,5) = PAOP_OUT_ADD(KIDIA:KFDIA,1:KLEV,i,5) * 1e-12 + endif + + if( wdep(i)%split .or. wdep(i)%insitu ) then + deallocate( lnsigma ) + endif + + !======================================================================= + enddo ! loop over wavelengths + + + + Nullify(Cext_table) + Nullify(a_table) + Nullify(g_table) + + + !do imode = 1,7 + ! print *, 'Radius,mode :', imode, sum(aop_in(KIDIA:KFDIA,1:KLEV)%rg(imode))/((KFDIA-KIDIA+1)*KLEV) + ! print *, 'numden,mode :', imode, sum(aop_in(KIDIA:KFDIA,1:KLEV)%numdens(imode))/((KFDIA-KIDIA+1)*KLEV) + !enddo + + ! deallocate( NCsca, incext ) + + !do i = 1,nwl + ! print *, 'AOD per grid box:', wdep(i)%wl, sum(PAOP_OUT_EXT(KIDIA:KFDIA,1:KLEV,i,1))/((KFDIA-KIDIA+1)*KLEV) + !enddo + + + +IF(LHOOK) CALL DR_HOOK('TM5M7_OPTICS_CALCULATE_AOP',1,ZHOOK_HANDLE) +END SUBROUTINE TM5M7_OPTICS_CALCULATE_AOP diff --git a/ifs-source/arpifs/phys_ec/tm5m7_optics_get.F90 b/ifs-source/arpifs/phys_ec/tm5m7_optics_get.F90 new file mode 100644 index 00000000..fb1e805c --- /dev/null +++ b/ifs-source/arpifs/phys_ec/tm5m7_optics_get.F90 @@ -0,0 +1,240 @@ +SUBROUTINE TM5M7_OPTICS_GET(m_eff, xg, Cext, a, g, cext_table, a_table, g_table,status) + +!*** * TM5M7_OPTICS_GET* +! +! +!----------------------------------------------------------------------------- +! TM5 ! +!----------------------------------------------------------------------------- +!BOP +! +! !IROUTINE: TM5M7_OPTICS_GET +! +! !DESCRIPTION: Main optical properties routine. Here the interpolated +! values for extinction coefficient, single scattering +! albedo and assymetry parameter are retrieved and returned. +! +!\\ +!\\ + +! SOURCE. +! ------- +! +! Taken from TM5-code +! +! MODIFICATIONS. +! -------------- +! +! +! !REVISION HISTORY: +! +! 12 Aug 2008 - Michael Kahnert, SMHI +! 6 Feb 2011 - Achim Strunk - +! +! Sep 2021 - V. Huijnen: first introduction into OpenIFS +! +! +!----------------------------------------------------------------------- + +USE PARKIND1 ,ONLY : JPIM ,JPRB +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE YOMLUN ,ONLY : NULERR + +USE TM5M7_OPTICS_DATA, ONLY : LKVAL, KVAL,N1R,N_RIR,N_RII,XS,N_X + +IMPLICIT NONE + +!----------------------------------------------------------------------- + +!* 0.1 ARGUMENTS +! --------- + + + +! +! !INPUT PARAMETERS: +! +complex, INTENT(IN) :: m_eff +REAL(KIND=JPRB), INTENT(IN) :: xg +REAL(KIND=JPRB), dimension(:,:,:), INTENT(IN) :: cext_table, a_table, g_table +! +! !OUTPUT PARAMETERS: +! +REAL(KIND=JPRB), INTENT(OUT) :: Cext, a, g +INTEGER(KIND=JPIM), INTENT(INOUT) :: status + + + + + +!* 0.2 LOCAL VARIABLES +! --------------- +REAL(KIND=JPRB) :: n, k, n1, k1, dk1, dk2, lk +REAL(KIND=JPRB) :: modrad, modrad1, dr, dr1, slope, cext1, a1, g1 +INTEGER(KIND=JPIM) :: i +INTEGER(KIND=JPIM) :: i_n, i_k, i_knew + + +REAL(KIND=JPRB) :: ZHOOK_HANDLE + +!----------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('TM5M7_OPTICS_GET',0,ZHOOK_HANDLE) + + + + status = 0 + !FAILS when K=1.00 because kval(15)=1.0 and k.lt.kval(15) false + !k1=15 + + n=real(m_eff) + k=imag(m_eff) + if(k.lt.kval(1))then + k1=kval(1) + i_knew=1 + elseif(k.gt.kval(15))then + k1=kval(15) + i_knew=15 + else + get_k: do i=2,15 + if(k.lt.kval(i))then + dk1=k-kval(i-1) + dk2=kval(i)-k + if(dk1.le.dk2)then + k1=kval(i-1) + i_knew=i-1 + else + k1=kval(i) + i_knew=i + endif + exit get_k + elseif (i==15 .and. abs(kval(i)-k) <1e-20)then + k1=kval(i) + i_knew=i + endif + enddo get_k + endif + lk=-log10(k1) + !#n1=float(int(50*n+0.5))/50. + !do i_n = 1, n_rir + ! if (abs(n1 - n1r(i_n)) < 1e-4) exit + !enddo + + !i_n = 1 + int((n-1.12)*50+0.5) + !AJS: I guess n is a number on the (increasing) n1r axis; search nearest index: + i_n = size(n1r) + do i = 1, size(n1r) + if ( n <= n1r(i) ) then + i_n = i + exit + end if + end do + if ( i_n > 1 ) then + if ( abs(n-n1r(i_n-1)) < abs(n-n1r(i_n)) ) i_n = i_n - 1 + else if ( i_n < n_rir ) then + if ( abs(n-n1r(i_n+1)) < abs(n-n1r(i_n)) ) i_n = i_n + 1 + end if + + do i_k = 1, n_rii + if (abs(lk - lkval(i_k)) < 1e-4) exit + enddo + + ! ! PLS - test : ik can be determined without the preceding loop "do i_k = 1, n_rii" + ! if (i_k.ne.i_knew) then + ! status = 1 + ! write (NULERR,'(" PLSPLS ik NE iknew = ",2(i2,2x))')i_k,i_knew + ! endif + + ! following the "get_k" loop above, the only way to get into this is to + ! have a NaN for k in the first place ? + if (i_k > n_rii) then + status = 1 + write(NULERR,*)'FATAL ERROR: i_k value outside LUT' + write (NULERR,'(" lk = ",E16.4)')lk + write (NULERR,'(" k1 = ",E16.4)')k1 + write (NULERR,'(" k = ",E16.4)')k + write (NULERR,'(" n = ",E16.4)')n + write (NULERR,'(" i_k = ",I6)')i_k + write (NULERR,'(" n_rii = ",I6)')n_rii + + do i_n = 1, 15 + write (NULERR,'(" lkval(",i2,") = ",E16.4)')i_n,lkval(i_n) + ! call goPr + write (NULERR,'(" kval(",i2,") = ",E16.4)')i_n,kval(i_n) + ! call goPr + enddo + + IF(LHOOK) CALL DR_HOOK('TM5M7_OPTICS_GET',1,ZHOOK_HANDLE) + RETURN + endif + + ! Added check (15-7-2010 - P. Le Sager) + if (i_n > n_rir) then + status = 1 + WRITE(NULERR,*)'FATAL ERROR: i_n value out of range' + IF(LHOOK) CALL DR_HOOK('TM5M7_OPTICS_GET',1,ZHOOK_HANDLE) + RETURN + endif + + + !>>> TvN + ! Since xs(1) equals zero a problem may occur when xg is negative, + ! because modrad.gt.xg would become true for i=1 in that case, + ! while modrad1, Cext1, a1 and g1 are not yet set. + ! It is not clear if negative xg values can ever occur, + ! but if they do that should be prevented when calculating rg. + ! + ! However, the problem may perhaps already occur + ! when xg equals zero, because of the finite machine precision. + ! + ! In any case, it is desired to initialize modrad1, Cext1, a1 and g1. + ! Cext1, a1 and g1 should be set to their table entries for i=1, + ! which are all zero: + Cext1 = cext_table(1,i_n,i_k) + a1 = a_table(1,i_n,i_k) + g1 = g_table(1,i_n,i_k) + ! modrad1 can be initialized to any value different from xs(1), + ! to prevent division by zero. + modrad1=xs(1)-9.99e-4 + ! This combination will force slope to zero + ! and Cext, a and g to the table entries for i=1 (zero), + ! in case modrad.gt.xg is true for i=1. + !<<< TvN + get_values: do i = 1, n_x + modrad = xs(i) + a = a_table(i,i_n, i_k) + g = g_table(i,i_n, i_k) + cext = cext_table(i,i_n, i_k) + ! With small concentrations, like in the stratosphere, M7 does not trust its radii. + ! See m7_averageproperties -> zinsvol. The M7-radius goes to zero + ! Modrad may never be larger than xg the first time. Modrad1 is not set, + ! will be zero (or something worse) and dr will be zero (or something worse). + ! slope is demolished, makeing all values NaN. Therefore, it is modrad .gt. xg + ! instead of modrad .ge. xg + ! + ! PLS-TRANSLATION - It boils down to: "on the first iteration of this loop, if modrad=xg and + ! you go into the if-statement below, you are in trouble, because modrad1 can be + ! anything. To prevent that, replace GE with GT to avoid going into the if-statement at the + ! first iteration." + ! + if(modrad.gt.xg)then + dr=modrad-modrad1 + dr1=xg-modrad1 + slope=(Cext-Cext1)/dr + Cext=Cext1+slope*dr1 + slope=(a-a1)/dr + a=a1+slope*dr1 + slope=(g-g1)/dr + g=g1+slope*dr1 + exit get_values + endif + modrad1=modrad + Cext1=Cext + a1=a + g1=g + enddo get_values + + + +IF(LHOOK) CALL DR_HOOK('TM5M7_OPTICS_GET',1,ZHOOK_HANDLE) +END SUBROUTINE TM5M7_OPTICS_GET + diff --git a/ifs-source/arpifs/phys_ec/tm5m7_optics_init.F90 b/ifs-source/arpifs/phys_ec/tm5m7_optics_init.F90 new file mode 100644 index 00000000..0dbe5ba4 --- /dev/null +++ b/ifs-source/arpifs/phys_ec/tm5m7_optics_init.F90 @@ -0,0 +1,532 @@ +SUBROUTINE TM5M7_OPTICS_INIT(NWAV,WDEP) + +!*** * TM5M7_OPTICS_INIT* +! +! +!----------------------------------------------------------------------------- +! TM5 ! +!----------------------------------------------------------------------------- +!BOP +! +! !MODULE: OPTICS +! +! !DESCRIPTION: Optics module to calculate optical depth from m7 output, +! based on the AOP_Package op Michael Kahnert. +! +! The optics code should be used in the following way (see +! examples in photolysis.F90, ecearth_optics.F90, and +! user_output_aerocom.F90): +! +! 1) prepare the optics calculation by calling +! 'OPTICS_INIT' --> lookuptables etc. +! this routine reads the wavelengths, lookupable and calculates +! refr. indices at these wavelengths. +! +! 2) allocate AOP arrays aop_out_ext/a/g with +! (n_gridcells, n_wavelengths, n_split), with: +! 'n_split' = 1 for (split == .false.) or +! 'n_split' = 11 for (split == .true. ), ie. +! partial contributions by +! Total, SO4, BC, OC, SS, DU, NO3, Water, Fine, Fine Dust, Fine SS +! additional fields are also provided for split==.true. in +! aop_out_add, which has to have size +! (n_gridcells, n_wavelengths, n_add) with nadd = 2 for +! surface PM10 dry extinction and surface PM10 dry absorption +! 3) Compute AOP for current conditions by calling 'OPTICS_AOP_GET' +! 4) done: 'OPTICS_DONE' +! +! IMPORTANT: *) Skipped the ZOOM options! (temporary) +! *) OC is actually POM. Remember converting OC to POM +! when sending it to optics_calculate_aop +!\\ +! +! +!** INTERFACE. +! ---------- +! *TM5M7_OPTICS_INIT* IS CALLED FROM *TM5M7_INIT*. + +! AUTHOR. +! ------- +! +! 6 Feb 2011 - Achim Strunk - worked on DECOUPLING optics routines +! from (optics)_output, in order to +! (re)establish a flexible way of using it +! - remaining parts have been moved to +! (the new routine) user_output_optics +! +! 24 Jun 2011 - Achim Strunk - added NO3 explicitly in order to allow +! for a slightly better split of the +! optical properties of (SO4+NO3) + +! SOURCE. +! ------- +! +! Taken from TM5-code +! +! MODIFICATIONS. +! -------------- +! +! Sep 2021 - V. Huijnen: first introduction into OpenIFS +! +! +!----------------------------------------------------------------------- + +USE PARKIND1 ,ONLY : JPIM ,JPRB +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE YOMLUN ,ONLY : NULOUT + +USE YOMCST, ONLY : +USE TM5M7_DATA, ONLY : TM5M7_DATADIR +USE TM5M7_EMIS_DATA, ONLY : +USE TM5M7_OPTICS_DATA, ONLY: WAVELENDEP, N_RIR,N_RII,N_X, & + & lkval, & ! -log img part refr. index + & kval, & ! img part refr. index, 10^(-lkval) + & n1r, & ! real part refr. index + & xs, cext_159, a_159, g_159, cext_200, a_200, g_200, & + & opacdim,echamhamdim,segelsteindim,& + & opac,echamham,segelstein + + +IMPLICIT NONE + +!----------------------------------------------------------------------- + +!* 0.1 ARGUMENTS +! --------- + +INTEGER(KIND=JPIM), INTENT(IN) :: NWAV +TYPE(WAVELENDEP), DIMENSION(NWAV), INTENT(INOUT) :: WDEP + + +!* 0.2 LOCAL VARIABLES +! --------------- + + character(len=256) :: lookuptable, refractive_indices + character(len=256) :: CL_FILE_NAME + INTEGER(KIND=JPIM) :: JL + + +REAL(KIND=JPRB) :: ZHOOK_HANDLE +!----------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('TM5M7_OPTICS_INIT',0,ZHOOK_HANDLE) + + allocate( opac (7, opacdim ) ) + allocate( echamham (5, echamhamdim ) ) + allocate( segelstein(3, segelsteindim) ) + + ! identify filenames from input + lookuptable = "lookup_table.nc" + !CL_FILE_NAME="/perm/ms/nl/nm6/TM5_INPUT/photolysis/lookup_table.nc" + CL_FILE_NAME = TRIM(TM5M7_DATADIR)//lookuptable + + + CALL LOAD_TM5M7_OPTICS_DATA_1D(CL_FILE_NAME, 'mr', n_rir,n1r) + CALL LOAD_TM5M7_OPTICS_DATA_1D(CL_FILE_NAME, 'mi', n_rii,kval) + CALL LOAD_TM5M7_OPTICS_DATA_1D(CL_FILE_NAME, 'x' , n_x ,xs) + + lkval = -log10(kval) + + CALL LOAD_TM5M7_OPTICS_DATA_3D(CL_FILE_NAME, 'ext_159', n_x,n_rir,n_rii,cext_159) + CALL LOAD_TM5M7_OPTICS_DATA_3D(CL_FILE_NAME, 'ext_200', n_x,n_rir,n_rii,cext_200) + CALL LOAD_TM5M7_OPTICS_DATA_3D(CL_FILE_NAME, 'a_159', n_x,n_rir,n_rii,a_159) + CALL LOAD_TM5M7_OPTICS_DATA_3D(CL_FILE_NAME, 'a_200', n_x,n_rir,n_rii,a_200) + CALL LOAD_TM5M7_OPTICS_DATA_3D(CL_FILE_NAME, 'g_159', n_x,n_rir,n_rii,g_159) + CALL LOAD_TM5M7_OPTICS_DATA_3D(CL_FILE_NAME, 'g_200', n_x,n_rir,n_rii,g_200) + + + refractive_indices = "refractive_indices_hdfstyle.nc" + CL_FILE_NAME = TRIM(TM5M7_DATADIR)//refractive_indices + + CALL LOAD_TM5M7_OPTICS_DATA_2D(CL_FILE_NAME, 'Opac', 7,opacdim,opac) + CALL LOAD_TM5M7_OPTICS_DATA_2D(CL_FILE_NAME, 'ECHAM-HAM', 5,echamhamdim,echamham) + CALL LOAD_TM5M7_OPTICS_DATA_2D(CL_FILE_NAME, 'Segelstein', 3,segelsteindim,segelstein) + + call TM5M7_optics_wavelen_init( wdep,NWAV ) + + write(NULOUT,*) 'Optical parameters:' + do JL = 1, NWAV + write(NULOUT,*) 'Wavelength :', wdep(JL)%wl + write(NULOUT,*) ' SO4 (real/img) :', wdep(JL)%n(1), wdep(JL)%k(1) + write(NULOUT,*) ' BC (real/img) :', wdep(JL)%n(2), wdep(JL)%k(2) + write(NULOUT,*) ' OC (real/img) :', wdep(JL)%n(3), wdep(JL)%k(3) + write(NULOUT,*) ' SOA (real/img) :', wdep(JL)%n(4), wdep(JL)%k(4) + write(NULOUT,*) ' SS (real/img) :', wdep(JL)%n(5), wdep(JL)%k(5) + write(NULOUT,*) ' DU (real/img) :', wdep(JL)%n(6), wdep(JL)%k(6) + write(NULOUT,*) ' H2O (real/img) :', wdep(JL)%n(7), wdep(JL)%k(7) + enddo + + + deallocate( opac, echamham, segelstein ) + + !-- + + IF(LHOOK) CALL DR_HOOK('TM5_OPTICS_INIT',1,ZHOOK_HANDLE) +CONTAINS + + ! Load an individual field (or receive it from the first + ! MPI task) + SUBROUTINE LOAD_TM5M7_OPTICS_DATA_3D(CD_FILE_NAME, CD_VAR_NAME, ILEN,JLEN,KLEN,PVAR) + USE YOMMP0 , ONLY : MYPROC, NPROC + USE MPL_MODULE, ONLY : MPL_BROADCAST + USE YOMTAG , ONLY : MTAGRAD + USE EASY_NETCDF,ONLY : NETCDF_FILE + USE YOMLUN , ONLY : NULERR + USE YOMHOOK , ONLY : LHOOK, DR_HOOK + + IMPLICIT NONE + + ! Full name of the aerosol climatology file + CHARACTER(LEN=*), INTENT(IN) :: CD_FILE_NAME + ! Name of the variable in the file + CHARACTER(LEN=*), INTENT(IN) :: CD_VAR_NAME + ! Expected dimensions for input file + INTEGER(KIND=JPIM), INTENT(IN) :: ILEN,JLEN,KLEN + ! Variable to be filled + REAL(KIND=JPRB), INTENT(OUT) :: PVAR(ILEN,JLEN,KLEN) + + ! Local variable .. + REAL(KIND=JPRB), ALLOCATABLE :: ZVAR(:,:,:) + + + ! The NetCDF file containing the input climatology + TYPE(NETCDF_FILE) :: FILE + + REAL(KIND=JPRB) :: ZHOOK_HANDLE + + IF (LHOOK) CALL DR_HOOK('TM5M7_OPTICS_INIT:LOAD_TM5M7_OPTICS_DATA_3D',0,ZHOOK_HANDLE) + + ! First process actually loads the file - expected 3-dim array. + IF (MYPROC == 1) THEN + CALL FILE%OPEN(TRIM(CD_FILE_NAME), IVERBOSE=4) + CALL FILE%GET(TRIM(CD_VAR_NAME), ZVAR) + CALL FILE%CLOSE() + + ! Check dimensions + IF (SIZE(ZVAR,1) /= ILEN .OR. SIZE(ZVAR,2) /= JLEN & + & .OR. SIZE(ZVAR,3) /= KLEN) THEN + WRITE(NULERR,*) CD_VAR_NAME, 'in', CD_FILE_NAME, 'must be dimensioned (', & + & ILEN, ",", JLEN, ",", KLEN, ")" + CALL ABOR1("Error reading TM5-M7 optics NetCDF file") + ELSE + PVAR(:,:,:)=ZVAR(:,:,:) + ENDIF + ENDIF + + ! If there are more than one processes then broadcast the data + ! (which means receive the data if MYPROC==1) + IF (NPROC > 1) THEN + CALL MPL_BROADCAST(PVAR, MTAGRAD, 1, & + & CDSTRING='TM5M7_OPTICS_INIT:LOAD_TM5M7_OPTICS_DATA_3D') + ENDIF + + IF (LHOOK) CALL DR_HOOK('TM5M7_OPTICS_INIT:TM5M7_OPTICS_INIT:LOAD_TM5M7_OPTICS_DATA_3D',1,ZHOOK_HANDLE) + + END SUBROUTINE LOAD_TM5M7_OPTICS_DATA_3D + + + + ! Load an individual field (or receive it from the first + ! MPI task) + SUBROUTINE LOAD_TM5M7_OPTICS_DATA_2D(CD_FILE_NAME, CD_VAR_NAME, ILEN,JLEN,PVAR) + USE YOMMP0 , ONLY : MYPROC, NPROC + USE MPL_MODULE, ONLY : MPL_BROADCAST + USE YOMTAG , ONLY : MTAGRAD + USE EASY_NETCDF,ONLY : NETCDF_FILE + USE YOMLUN , ONLY : NULERR + USE YOMHOOK , ONLY : LHOOK, DR_HOOK + + IMPLICIT NONE + + ! Full name of the aerosol climatology file + CHARACTER(LEN=*), INTENT(IN) :: CD_FILE_NAME + ! Name of the variable in the file + CHARACTER(LEN=*), INTENT(IN) :: CD_VAR_NAME + ! Expected dimensions for input file + INTEGER(KIND=JPIM), INTENT(IN) :: ILEN,JLEN + ! Variable to be filled + REAL(KIND=JPRB), INTENT(OUT) :: PVAR(ILEN,JLEN) + + ! Local variable .. + REAL(KIND=JPRB), ALLOCATABLE :: ZVAR(:,:) + + + ! The NetCDF file containing the input climatology + TYPE(NETCDF_FILE) :: FILE + + REAL(KIND=JPRB) :: ZHOOK_HANDLE + + IF (LHOOK) CALL DR_HOOK('TM5M7_OPTICS_INIT:LOAD_TM5M7_OPTICS_DATA_2D',0,ZHOOK_HANDLE) + + ! First process actually loads the file - expected 2-dim array. + IF (MYPROC == 1) THEN + CALL FILE%OPEN(TRIM(CD_FILE_NAME), IVERBOSE=4) + CALL FILE%GET(TRIM(CD_VAR_NAME), ZVAR) + CALL FILE%CLOSE() + + ! Check dimensions + IF (SIZE(ZVAR,1) /= ILEN .OR. SIZE(ZVAR,2) /= JLEN) THEN + WRITE(NULERR,*) CD_VAR_NAME, 'in', CD_FILE_NAME, 'must be dimensioned (', & + & ILEN, ",", JLEN, ")" + CALL ABOR1("Error reading TM5-M7 optics NetCDF file") + ELSE + PVAR(:,:)=ZVAR(:,:) + ENDIF + ENDIF + + ! If there are more than one processes then broadcast the data + ! (which means receive the data if MYPROC==1) + IF (NPROC > 1) THEN + CALL MPL_BROADCAST(PVAR, MTAGRAD, 1, & + & CDSTRING='TM5M7_OPTICS_INIT:LOAD_TM5M7_OPTICS_DATA_2D') + ENDIF + + IF (LHOOK) CALL DR_HOOK('TM5M7_OPTICS_INIT:TM5M7_OPTICS_INIT:LOAD_TM5M7_OPTICS_DATA_2D',1,ZHOOK_HANDLE) + + END SUBROUTINE LOAD_TM5M7_OPTICS_DATA_2D + + + + ! Load an individual field (or receive it from the first + ! MPI task) + SUBROUTINE LOAD_TM5M7_OPTICS_DATA_1D(CD_FILE_NAME, CD_VAR_NAME, KLEN,PVAR) + USE YOMMP0 , ONLY : MYPROC, NPROC + USE MPL_MODULE, ONLY : MPL_BROADCAST + USE YOMTAG , ONLY : MTAGRAD + USE EASY_NETCDF,ONLY : NETCDF_FILE + USE YOMLUN , ONLY : NULERR + USE YOMHOOK , ONLY : LHOOK, DR_HOOK + + IMPLICIT NONE + + ! Full name of the aerosol climatology file + CHARACTER(LEN=*), INTENT(IN) :: CD_FILE_NAME + ! Name of the variable in the file + CHARACTER(LEN=*), INTENT(IN) :: CD_VAR_NAME + ! Expected dimension lengths for input file + INTEGER(KIND=JPIM), INTENT(IN) :: KLEN + ! Variable to be filled + REAL(KIND=JPRB), INTENT(OUT) :: PVAR(KLEN) + ! Variable to be filled + REAL(KIND=JPRB), ALLOCATABLE :: ZVAR(:) + + + ! The NetCDF file containing the input climatology + TYPE(NETCDF_FILE) :: FILE + + REAL(KIND=JPRB) :: ZHOOK_HANDLE + + IF (LHOOK) CALL DR_HOOK('TM5M7_OPTICS_INIT:LOAD_TM5M7_OPTICS_DATA_1D',0,ZHOOK_HANDLE) + + ! First process actually loads the file - expected 1-dim array. + IF (MYPROC == 1) THEN + CALL FILE%OPEN(TRIM(CD_FILE_NAME), IVERBOSE=4) + CALL FILE%GET(TRIM(CD_VAR_NAME), ZVAR) + CALL FILE%CLOSE() + ! Check dimensions + IF (SIZE(ZVAR,1) /= KLEN ) THEN + WRITE(NULERR,*) CD_VAR_NAME, 'in', CD_FILE_NAME, 'must be dimensioned (', & + & KLEN, ")" + CALL ABOR1("Error reading TM5-M7 optics NetCDF file") + ELSE + PVAR(:)=ZVAR(:) + ENDIF + ENDIF + + ! If there are more than one processes then broadcast the data + ! (which means receive the data if MYPROC==1) + IF (NPROC > 1) THEN + CALL MPL_BROADCAST(PVAR, MTAGRAD, 1, & + & CDSTRING='TM5M7_OPTICS_INIT:LOAD_TM5M7_OPTICS_DATA_1D') + ENDIF + + IF (LHOOK) CALL DR_HOOK('TM5M7_OPTICS_INIT:TM5M7_OPTICS_INIT:LOAD_TM5M7_OPTICS_DATA_1D',1,ZHOOK_HANDLE) + + END SUBROUTINE LOAD_TM5M7_OPTICS_DATA_1D + +END SUBROUTINE TM5M7_OPTICS_INIT + + + + + !-------------------------------------------------------------------------- + ! TM5 ! + !-------------------------------------------------------------------------- + !BOP + ! + ! !IROUTINE: OPTICS_WAVELEN_INIT + ! + ! !DESCRIPTION: Initialise parameters which are depending on given + ! wavelengths. + !\\ + !\\ + ! !INTERFACE: + ! + SUBROUTINE TM5M7_OPTICS_WAVELEN_INIT( wdep,NWL ) + + USE PARKIND1, ONLY : JPIM,JPRB + USE TM5M7_OPTICS_DATA, ONLY : WAVELENDEP, OPAC,ECHAMHAM,SEGELSTEIN, & + & opacdim, echamhamdim, segelsteindim + USE YOMHOOK , ONLY : LHOOK, DR_HOOK + + IMPLICIT NONE + ! + ! !INPUT/OUTPUT PARAMETERS: + ! + ! wavelength properties (wavelength itself and real/img part of refractive index) + INTEGER(KIND=JPIM), INTENT(IN) :: NWL + type(wavelendep), intent(inout), dimension(NWL) :: wdep + ! + ! + !EOP + !------------------------------------------------------------------------ + !BOC + + INTEGER(KIND=JPIM) :: i, idx + REAL(KIND=JPRB) :: wl, h + REAL(KIND=JPRB) :: nscale, kscale + + REAL(KIND=JPRB) :: ZHOOK_HANDLE + !----------------------------------------------------------------------- + IF (LHOOK) CALL DR_HOOK('TM5M7_OPTICS_WAVELEN_INIT',0,ZHOOK_HANDLE) + + + + ! Real part n and imaginary part k of refractive index + ! for each wavelength: + + !>>> TvN + ! The refractive index for 'sulfate' is taken from + ! the OPAC database (Hess et al., 1998; + ! Koepke et al., MPI report no. 243, 1997). + ! The value used is that of 'sulfate solution', + ! i.e. particles consisting of 75% of sulfuric acid (H2SO4), + ! based on Fenn et al. (chapter 18 in Handbook of Geophysics + ! and Space Environment, 1985). + ! This is in line with Kinne et al. (JGR, 2003), + ! who write that refractive indices for sulfate + ! are usually based on 75% sulfuric acid solution. + ! Actually, the OPAC refractive index agrees very well + ! with the expression given by Boucher and Anderson (JGR, 1995) + ! for H2SO4 at visible wavelengths. + ! Thus, the OPAC data can be considered to apply to pure H2SO4, + ! which is consistent of our application of mixing rules. + + ! For BC, the OPAC refractive index is scaled to one of + ! the values proposed by Bond and Bergstrom (2006), + ! valid at 550 nm (see their Table 5). + ! Selected values for high, medium and low absorption are + ! 1.95 + 0.79 i, 1.85 + 0.71 i, and 1.75 + 0.63 i, respectively. + ! We select the low-absorption value, + ! because it produces results in best agreement + ! with AAOD from MODIS Collection 6 Deep Blue. + ! Note that the medium-absorption value 1.85 + 0.71 i + ! was used in ECHAM simulations by Stier et al. (2007), + ! and found to give reasonable results. + ! Lowenthal et al. (Atmos. Environ., 2000) + ! give a value of 1.90 + 0.6 i. + ! The reference value used in the scaling + ! is the OPAC value at 550 nm: 1.75 + 0.44 i. + ! It would be better to include the scaling + ! in the input file. + !nscale = 1.0 ! for using OPAC + !kscale = 1.0 ! for using OPAC + !nscale = 1.95/1.75 + !kscale = 0.79/0.44 + nscale = 1.85/1.75 + kscale = 0.71/0.44 + !nscale = 1.75/1.75 + !kscale = 0.63/0.44 + !<<< TvN + + !VH take from input: nwl = size(wdep) + do i = 1, nwl + wl = wdep(i)%wl + + ! Interpolate Opac data + findOpac: Do idx = 1,opacdim + If(opac(1,idx) .gt. wl) exit findOpac + End Do findOpac + If(idx .gt. opacdim) then + idx = opacdim + h = 1.0 + Else If(idx .eq. 1) then + idx = 2 + h = 0.0 + Else + h = (wl-opac(1,idx-1))/(opac(1,idx)-opac(1,idx-1)) + End If + + ! SO4 + wdep(i)%n(1) = opac(2,idx-1)+h*(opac(2,idx)-opac(2,idx-1)) + wdep(i)%k(1) = opac(3,idx-1)+h*(opac(3,idx)-opac(3,idx-1)) + ! BC + !>>> TvN + !wdep(i)%n(2) = opac(4,idx-1)+h*(opac(4,idx)-opac(4,idx-1)) + !wdep(i)%k(2) = opac(5,idx-1)+h*(opac(5,idx)-opac(5,idx-1)) + wdep(i)%n(2) = nscale * ( opac(4,idx-1)+h*(opac(4,idx)-opac(4,idx-1)) ) + wdep(i)%k(2) = kscale * ( opac(5,idx-1)+h*(opac(5,idx)-opac(5,idx-1)) ) + !<<< TvN + ! SS + wdep(i)%n(5) = opac(6,idx-1)+h*(opac(6,idx)-opac(6,idx-1)) + wdep(i)%k(5) = opac(7,idx-1)+h*(opac(7,idx)-opac(7,idx-1)) + + ! Interpolate ECHAM-HAM data + findEchamham: Do idx = 1,echamhamdim + If(echamham(1,idx) .gt. wl) exit findEchamham + End Do findEchamham + If(idx .gt. echamhamdim) then + idx = echamhamdim + h = 1.0 + Else If(idx .eq. 1) then + idx = 2 + h = 0.0 + Else + h = (wl-echamham(1,idx-1))/(echamham(1,idx)-echamham(1,idx-1)) + End If + + ! OC + !>>> TvN + ! The 'ECHAM-HAM' data currently used for POM + ! are based on the data from Fenn et al. (1985) + ! for the 'water soluble' component, + ! but at a reduced number of wavelengths up to 15 um. + ! It would be better to use the original table + ! in the input file. + !<<< TvN + wdep(i)%n(3) = echamham(2,idx-1)+h*(echamham(2,idx)-echamham(2,idx-1)) + wdep(i)%k(3) = echamham(3,idx-1)+h*(echamham(3,idx)-echamham(3,idx-1)) + + + ! SOA + ! >>TB + ! For now (March 2017) we use OC indices for SOA + ! <YDGEOMETRY%YRDIM,YDDIMV=>YDGEOMETRY%YRDIMV,YDGEM=>YDGEOMETRY%YRGEM,YDMP=>YDGEOMETRY%YRMP, & + & YGFL=>YDMODEL%YRML_GCONF%YGFL, & + & YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO, & + & YDEAERSRC=>YDMODEL%YRML_PHY_AER%YREAERSRC, & + & YDEAERATM=>YDMODEL%YRML_PHY_RAD%YREAERATM, & + & YDCHEM=>YDMODEL%YRML_CHEM%YRCHEM, & + & YDRIP=>YDMODEL%YRML_GCONF%YRRIP) +ASSOCIATE(NACTAERO=>YGFL%NACTAERO, NAERO=>YGFL%NAERO, & + & LAERDRYDP=>YDEAERATM%LAERDRYDP, LAERSEDIM=>YDEAERATM%LAERSEDIM, & + & LAERSURF=>YDEAERATM%LAERSURF, LAERVOL=>YDEAERATM%LAERVOL, & + & NDRYDEP=>YDEAERATM%NDRYDEP, NINDSEDM=>YDEAERATM%NINDSEDM, & + & NTSEDM=>YDEAERATM%NTSEDM, & + & LCHEM_JOUT=>YDCHEM%LCHEM_JOUT, & + & NTYPAER=>YDEAERSRC%NTYPAER, AERO_SCHEME=>YDCOMPO%AERO_SCHEME, & + & NSTART=>YDRIP%NSTART, LCHEM_DIA=>YDCOMPO%LCHEM_DIA, NCHEM=>YGFL%NCHEM , YAERO=>YGFL%YAERO) +! ------------------------------------------------------------------ + +!* 1. PROGNOSTIC AEROSOLS - INITIAL COMPUTATIONS +! ------------------------------------------ + +ZAEROP(:,:,:) = 0.0_JPRB + +LLPRINT=.FALSE. + +ZAEROP(KIDIA:KFDIA,1:KLEV,1:NACTAERO) = PCEN(KIDIA:KFDIA,1:KLEV,KAERO(1):KAERO(NACTAERO)) +ZTAERI(KIDIA:KFDIA,1:KLEV,1:NACTAERO) = PTENC(KIDIA:KFDIA,1:KLEV,KAERO(1):KAERO(NACTAERO)) + + +!---- + +DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZRHO(JL,JK)=PRSF1(JL,JK)/(RD*PTP(JL,JK)) + ZDP(JL,JK)= PRS1(JL,JK) - PRS1(JL,JK-1) + ZDZ(JL,JK)= ZDP(JL,JK) / (ZRHO(JL,JK)*RG) + ENDDO +ENDDO +DO JL=KIDIA,KFDIA + ZALT(JL,KLEV)=PAPHI(JL,KLEV)/RG +ENDDO +DO JK=KLEV-1,0,-1 + DO JL=KIDIA,KFDIA + ZALT(JL,JK)=ZALT(JL,JK+1)+ZDZ(JL,JK+1) + ENDDO +ENDDO + + +! WARNING: This should come from actual M7 aerosol information, +! rather than initialized here. +! Code to be updated once the M7 conversion routine has been introduced +!DO IMODE=1,NMOD +! ALLOCATE(RW_MODE(IMODE)%d2(KIDIA:KFDIA,1:KLEV)) +! ALLOCATE(DENS_MODE(IMODE)%d2(KIDIA:KFDIA,1:KLEV)) +! +! ! Place holder - to be replaced with actual data using aedensm7 and aeradm7 etc!! +! RW_MODE(IMODE)%d2(KIDIA:KFDIA,1:KLEV) = 0.1e-6 ! m +! DENS_MODE(IMODE)%d2(KIDIA:KFDIA,1:KLEV)= 1800.0 ! kg/m3! +! +!ENDDO + + +! NB: The physical calculations for the prognostic aerosols are done in a +! sequential mode, with any given process adding its tendency to the +! initial tendency (giving ZTENC), the field itself (ZCEN) remaining +! the same. + + +!-- set all fluxes relevant to surface emissions, dry deposition and sedimentation to zero +IF (.NOT.LAERSURF) THEN + PAERMAP(:,:) =0._JPRB + PAERFLX(:,:,:)=0._JPRB + PAERLIF(:,:) =0._JPRB + PAERDDP(:,:) =0._JPRB + PAERSDM(:,:) =0._JPRB + PAERSRC(:,:) =0._JPRB + ZWND(:) =0._JPRB + DO JAER=1,NACTAERO + DO JL=KIDIA,KFDIA + ZFAERO(JL,JAER) =0._JPRB + PCFLX(JL,KAERO(JAER))=0._JPRB + ENDDO + ENDDO +ELSEIF (LAERSURF) THEN + +!* 2. SURFACE FLUXES OF AEROSOLS +! -------------------------- + +! N.B: COMPUTATIONS USE SURFACE PRECIPITATION AT T-DT + + DO JL=KIDIA,KFDIA +! ZWND(JL)=SQRT(PUP(JL)*PUP(JL)+PVP(JL)*PVP(JL)) + ZWND(JL)=PAERWS(JL) + PDMSO(JL)=0._JPRB + PLDAY(JL)=0._JPRB + PLISS(JL)=0._JPRB + PSO2(JL) =0._JPRB + PTDMS(JL)=0._JPRB + PODMS(JL)=0._JPRB + PDMSI(JL)=PDMS(JL) + ENDDO + +! DO JTILE=1,KTILES +! write(8000+MYPROC,*)jtile,jl,PFRTI(JL,JTILE),PAHFSTI(JL,JTILE),PFRTI(JL,JTILE)*PAHFSTI(JL,JTILE) + !write(3334,*)jtile,jl,PFRTI(JL,JTILE),PAHFSTI(JL,JTILE) +!end DO + CALL TM5M7_SRC & + &( YDGEOMETRY, YDMODEL, KIDIA , KFDIA , KLON , KTDIA, KLEV , KTILES, NSTART, NSTEP , KSTGLO, & + & KSW , KTRAC , KAERO, & + & PALB , PALBD , PAPHI , & + & PAERDEP,PAERLTS, PAERSCC, PAERGUST, ZALT, & + & PBCBF , PBCFF , PBCGF, POMBF, POMFF, POMGF, & + & PRS1 , PRSF1 , PCI , PCLAKE, PINJF, PBLH, ZDP, PGELAM, PGELAT, PGEMU, PFRTI, PHSDFOR, & + & PLSM , PSST , PQP , ZRHO , PSNS , PTP , PTL , PTSPHY, PZ0M, KCHEM, & + & ZWND , PWSA1 , PSOIL_TYPE, & + & PCVL , PCVH, KTVL, KTVH, & + & PLDAY , PAERFLX, PCFLX, PCEN , PTENC, ZEMIDIAG, PSO2SRC,PSO4SRC,PSOA,PSOACO) + + +! sea salt and desert dust fluxes in kg m-2 s-1, thus: +! dynamics, vert.diff, convection see mixing ratio in kg kg-1 (PCEN, ZAEROP) +! and corresponding tendencies ZTENC are in kg kg-1 s-1 + + DO JAER=1,NACTAERO + DO JL=KIDIA,KFDIA + PAERSRC(JL,JAER)=ZEMIDIAG(JL,JAER) !PCFLX(JL,KAERO(JAER)) + ! add SO2 and SO4 production for diagnostics in case of simple sulfur chemistry + ENDDO + ENDDO + ! collect distributed fluxes + IF (LCHEM_DIA) THEN + CALL CHEM_INEXT( KIDIA , KFDIA , KLON , KLEV , NACTAERO, NACTAERO , & + & ZDP, PTSPHY, PTENC(:,:,KAERO(1):KAERO(NACTAERO)) , ZTAERI, PEXTRA(:,NCHEM+1:NCHEM+NACTAERO,IEXTR_EM)) + ENDIF + +!* 3. DRY DEPOSITION INCLUDED AS MODIFICATION TO SURFACE FLUXES +! --------------------------------------------------------- + +! +! IF (LAERDRYDP) THEN +! +! ! Compute relative humidity +! IFLAG=2 +! CALL SATUR (KIDIA , KFDIA , KLON , KTDIA , 1,& +! & PRSF1(:,KLEV), PTP(:,KLEV) , ZQSAT(:,1) , IFLAG) +! +! DO JL=KIDIA,KFDIA +! ZRHCL(JL)=PQP(JL,KLEV)/(MAX(1.E-30_JPRB, ZQSAT(JL,1))) +! ENDDO +! +! +!!-- Dry deposition is applied to all aerosols. +! +! ZTENCI(KIDIA:KFDIA, 1:KLEV,:)=PTENC(KIDIA:KFDIA,1:KLEV,:) +! +! ! Compute average fluxes over tiles +! DO JTILE=1,KTILES +! ZAHFSM(JL)=ZAHFSM(JL)+PFRTI(JL,JTILE)*PAHFSTI(JL,JTILE) +! ENDDO +! +! CALL TM5M7_DRYDEP ( & +! & KIDIA , KFDIA , KLON, KLEV, KTRAC, KAERO , & +! & PTSPHY, ZTENCI, PTP(:,KLEV) , PRSF1 , PRS1, ZWND, & +! & PLSM, PCI,PAERUST,PZ0M,ZRHCL,PGEOH, ZDZ(:,KLEV), & +! & ZAHFSM, PAHFLEV, & +! & RW_MODE, DENS_MODE, PCEN, & +! & PAERDDP, PTENC,ZVDA) +! +! +! ! Compute dry deposition budgets +! IF (LCHEM_DIA) THEN +! CALL CHEM_INEXT(KIDIA, KFDIA, KLON, KLEV, NACTAERO, NACTAERO , & +! & ZDP, PTSPHY, PTENC(:,:, KAERO(1):KAERO(NACTAERO)), ZTENCI(:,:,KAERO(1):KAERO(NACTAERO)),PEXTRA(:,NCHEM+1:NCHEM+NACTAERO,IEXTR_DD) ) +! ENDIF +! +! ! Output deposition velocity fields.. +! !IF(LCHEM_JOUT) THEN +! ! DO JK=1,KLEV +! ! DO JL=KIDIA,KFDIA +! ! PEXTRA(JL,JK,2)=ZVDA(JL,JK) +! ! ENDDO +! ! ENDDO +! !ENDIF +! +! +!!-- The dry deposition at the surface has been explicitly computed, and the +!! tendency in the first layer above the surface is to be updated. The +!! emission flux is kept untouched. +! +!!VH DO JAER=1,NACTAERO +!!VH DO JL=KIDIA,KFDIA +!!VH PAERDDP(JL,JAER)=ZFDRYD(JL,JAER) +!!VH ENDDO +!!VH ENDDO +!!VH !-- update tendencies +!!VH PTENC(KIDIA:KFDIA,1:KLEV,KAERO(1):KAERO(NACTAERO)) = ZTAERO(KIDIA:KFDIA,1:KLEV,1:NACTAERO) +! +! ENDIF ! LAERDRYDP + +ENDIF + +!!* 4. SEDIMENTATION OF AEROSOLS +!! ------------------------- +! +!IF (LAERSEDIM) THEN +! +!ZTAERI(KIDIA:KFDIA,1:KLEV,1:NACTAERO) = PTENC(KIDIA:KFDIA,1:KLEV,KAERO(1):KAERO(NACTAERO)) +! +!CALL TM5M7_SEDIMENT & +! & ( KIDIA , KFDIA , KLON, KLEV, KTRAC, KAERO , & +! & PTSPHY, PTP , PRSF1 , PRS1, & +! & RW_MODE, DENS_MODE, PCEN, & +! & PAERSDM, PTENC) +! +!! collect distributed fluxes - should really be given its own budget accumulator, and not combined with dry dep.. +! IF (LCHEM_DIA) THEN +! CALL CHEM_INEXT( KIDIA , KFDIA , KLON , KLEV , NACTAERO, NACTAERO , & +! & ZDP, PTSPHY, PTENC(:,:,KAERO(1):KAERO(NACTAERO)) , ZTAERI, PEXTRA(:,NCHEM+1:NCHEM+NACTAERO,IEXTR_DD)) +! ENDIF +! +! +!ELSE +!!-- If sedimentation is not called, tendencies after dry depo. stay the same. +! DO JL=KIDIA,KFDIA +! PAERSDM(JL,:)=0._JPRB +! ENDDO +!ENDIF + + +! Deallocate.. Here?? +!DO IMODE=1,NMOD +! DEALLOCATE(RW_MODE(IMODE)%d2) +! DEALLOCATE(DENS_MODE(IMODE)%d2) +!ENDDO + +!----------------------------------------------------------------------- +END ASSOCIATE +END ASSOCIATE +IF (LHOOK) CALL DR_HOOK('TM5M7_PHY2',1,ZHOOK_HANDLE) +END SUBROUTINE TM5M7_PHY2 diff --git a/ifs-source/arpifs/phys_ec/tm5m7_scav.F90 b/ifs-source/arpifs/phys_ec/tm5m7_scav.F90 new file mode 100644 index 00000000..97864ce5 --- /dev/null +++ b/ifs-source/arpifs/phys_ec/tm5m7_scav.F90 @@ -0,0 +1,542 @@ +SUBROUTINE TM5M7_SCAV & + & ( KIDIA , KFDIA , KLON , KLEV , KAER , KSTEP, PTSPHY, & + & PRSF1, PDP , PTP, PFLXR, PFLXS, PCLCOV, PCLWAT, PCLICE, PRAIN, PSNOW, PCEN, PTENC0, & + & PTENC1, PFAERO, PPRCOV ) + +!*** * TM5M7_SCAV* - IN-CLOUD AND BELOW CLOUD SCAVENGING OF TRACERS +! CALLED SEPARATELY FOR CONVECTIVE AND LARGE-SCALE PRECIP. +! COPY of CHEM_SCAV + +! INPUTS: +! ------- +! KSTEP : Time step number +! KIDIA : Start of Array +! KFDIA : End of Array +! KLON : Length of Arrays +! KLEV : Number of Levels +! KCHEM : Number of aerosol tracers + + +! PTSPHY: Time step length in seconds +! PDP(KLON,KLEV) : PRESSURE DELTA in PRESSURE UNITES (Pa) +! PRSF1(KLON,KLEV) : Mid-level pressure (Pa) +! PTP(KLON,KLEV) : Temperature in (T) +! PCLWAT (KLON,KLEV) : Cloud water content (kg/kg) - stratiform and convective +! PCLICE (KLON,KLEV) : Cloud ice water content (kg/kg) - stratiform and convective +! PRAIN (KLON,KLEV) : Rain water content (kg/kg) for stratiform precip +! PSNOW (KLON,KLEV) : Snow water content (kg/kg) for stratiform precip +! PFLXR (KLON,KLEV+1) : Precip flux rain (kg/m2s) - either stratiform or convective (depending on argument) +! PFLXS (KLON,KLEV+1) : Precip flux snow (kg/m2s) - either stratoform or convective (depending on argument) +! PCLCOV (KLON,KLEV) : cloud fraction 0..1 +! PPRCOV (KLON,KLEV) : precipitation fraction 0..1 +! PCEN(KLON,KLEV,KCHEM) : CONCENTRATION OF TRACERS (kg/kg) +! PTENC0(KLON,KLEV,KCHEM) : TOTAL TENDENCY OF CONCENTRATION OF TRACERS BEFORE(kg/kg s-1) +! +! NB: PCLWAT is the in-cloud water mixing ratio +! OUTPUTS: +! ------- +! PTENC1 (KLON,KLEV,KCHEM) : TENDENCY OF CONCENTRATION OF TRACERS after (kg/kg s-1) +! +!** INTERFACE. +! ---------- +! *TM5M7_SCAV* IS CALLED FROM *TM5M7*. +! +! AUTHOR. +! ------- +! Johannes Flemming (original CHEM_SCAV) +! +! +! MODIFICATIONS. +! -------------- +! ORIGINAL (J Flemming) : 2009-11-09 +! V. Huijnen : Modification following routine wet_deposition.F90 from TM5 2021-08-26 +!----------------------------------------------------------------------- + +USE PARKIND1 ,ONLY : JPIM ,JPRB +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE YOMCST ,ONLY : RG, RD, RLVTT ,RLSTT ,RTT +USE YOMLUN , ONLY : NULOUT,NULERR +USE YOEDBUG ,ONLY : YREDBUG +USE YOM_YGFL , ONLY : YGFL +USE YOECLDP , ONLY : YRECLDP +USE YOEAERSRC ,ONLY : YREAERSRC +USE YOEAERATM ,ONLY : YREAERATM +USE YOEAERSNK ,ONLY : YREAERSNK +USE YOMCHEM , ONLY : YRCHEM +USE YOETHF , ONLY : R2ES ,R3LES ,R3IES ,R4LES ,& + & R4IES ,R5LES ,R5IES ,R5ALVCP ,R5ALSCP ,& + & RALVDCP ,RALSDCP ,RTWAT ,& + & RTICE ,RTICECU ,& + & RTWAT_RTICE_R ,RTWAT_RTICECU_R +USE TM5M7_DATA, ONLY : NSCAV, NSCAV_INDEX, NSCAV_TYPE, & + & INUS_N,IAIS_N,IACS_N,ICOS_N,IAII_N,IACI_N,ICOI_N + + +IMPLICIT NONE + +!----------------------------------------------------------------------- + +!* 0.1 ARGUMENTS +! --------- + +INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA, KFDIA, KLON, KLEV, KAER, KSTEP + +REAL(KIND=JPRB),INTENT(IN) :: PDP(KLON,KLEV) , PRSF1(KLON,KLEV) , PTP(KLON,KLEV) +REAL(KIND=JPRB),INTENT(IN) :: PCLCOV(KLON,KLEV) , PCLWAT(KLON,KLEV),PCLICE(KLON,KLEV) , PRAIN(KLON,KLEV), PSNOW(KLON,KLEV) +REAL(KIND=JPRB),OPTIONAL, INTENT(IN) :: PPRCOV(KLON,KLEV) +REAL(KIND=JPRB),INTENT(IN) :: PFLXR(KLON,KLEV+1), PFLXS(KLON,KLEV+1) +REAL(KIND=JPRB),INTENT(IN) :: PTENC0(KLON,KLEV,KAER), PCEN(KLON,KLEV,KAER) +REAL(KIND=JPRB),INTENT(IN) :: PTSPHY + +REAL(KIND=JPRB),INTENT(OUT) :: PTENC1(KLON,KLEV,KAER) +REAL(KIND=JPRB),INTENT(OUT) :: PFAERO(KLON,KAER) + +!* 0.5 LOCAL VARIABLES +! --------------- + +INTEGER(KIND=JPIM) :: JK, JL, JT, JSCAV, IWETDEP + +REAL(KIND=JPRB) :: ZSCAV +REAL(KIND=JPRB) :: ZBETA, ZBETAR, ZBETAR_M7 +REAL(KIND=JPRB) :: INCLOUD, BELOWCLOUD +REAL(KIND=JPRB) :: ZDP, ZDX, ZDZ, ZFRAC, ZFUNC, ZRHO,ZTEMP +REAL(KIND=JPRB) :: ZEPSQLIQ, ZEPSFLX, ZEPSQLIQ2 +REAL(KIND=JPRB) :: ZRD, ZLMMR2VMR, ZH2R, ZRET, ZHNRYEFT, ZHNRYEF +REAL(KIND=JPRB) :: ZLIQ2TOT, ZICE2TOT, ZLIQ2GAS, ZICE2GAS, ZRAINW, ZFALLSP +REAL(KIND=JPRB) :: ZPRCOV, ZCLCOV, ZFLXR, ZFLXS,ZFLXRB, ZFLXSB, ZCLWAT, ZCLICE,ZCLTOT, ZMINCLCOV, ZMINPRCOV + ! Interstitial Fraction: 30% of aerosol remains in atmosphere +REAL(KIND=JPRB) :: ZINTERST_FR +REAL(KIND=JPRB),PARAMETER :: ZDGHNO3 = 0.136 ! viscosity of HNO3 in [cm2/s] +REAL(KIND=JPRB),PARAMETER :: ZDGAIR = 0.133 ! viscosity of air in [cm2/s] +REAL(KIND=JPRB),PARAMETER :: ZXMHNO3 =1.008_JPRB + 14.007_JPRB + 3*16.0_JPRB ! HNO3 tracer mass +REAL(KIND=JPRB),PARAMETER :: ZRDRAD2 = (1E-5)**2 ! square of raindroplet radius (20 microns) +REAL(KIND=JPRB),PARAMETER :: ZMAX_LWC =2.E-3 ! kg/m3 +REAL(KIND=JPRB),PARAMETER :: ZHPLUS =3.16227E-6_JPRB ! is rain water ph=5.5 H+ + +! how much less efficient is tracer scavenged from ice +! cloud droplet compared to water cloud droplet. +! This should be tracer dependent. +REAL(KIND=JPRB),PARAMETER :: ZICE_EFF=0.2 + +REAL(KIND=JPRB) :: ZRLWC,ZRDRAD, ZRU, ZNRE,ZNSC,ZNSH, ZKG, ZTR, ZKSO2, ZKHSO3, ZFACTSO2 +REAL(KIND=JPRB) :: ZRL ! composite factor of Rgas and liquid water content of raining cloud + ! rgas (8.314 J/mol/K) ---> 0.08314 atm/(mol/l)/K + ! 1e-6 corresponds to 1 g/m3 dimensionless +REAL(KIND=JPRB) :: ZWLOSS(KLON,KAER) + +LOGICAL :: LLWDAER +LOGICAL :: LLPRINT, LLCHEM_WDFR, LLCONV + +REAL(KIND=JPRB) :: ZHOOK_HANDLE + +#include "fcttre.func.h" +!#include "fccld.h" + + +!----------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('TM5M7_SCAV',0,ZHOOK_HANDLE) +ASSOCIATE(YCHEM=>YGFL%YCHEM,YAERO=>YGFL%YAERO, & + & LCHEM_WDFR=>YRCHEM%LCHEM_WDFR, & + & RCOVPMIN=>YRECLDP%RCOVPMIN, & + & NINDAER=>YREAERSRC%NINDAER, & + & RFRAER=>YREAERSNK%RFRAER, RFRBC=>YREAERSNK%RFRBC, RFRDD=>YREAERSNK%RFRDD, & + & RFRIF=>YREAERSNK%RFRIF, RFROM=>YREAERSNK%RFROM, RFRSO4=>YREAERSNK%RFRSO4, & + & RFRSS=>YREAERSNK%RFRSS) + + + +LLPRINT=.FALSE. +LLCHEM_WDFR=LCHEM_WDFR +LLCONV=.FALSE. + +ZINTERST_FR = 0.3_JPRB +!VH IF ( LLCHEM_WDFR ) ZINTERST_FR = 0.0_JPRB + +! deposition for convective Precip +IF (.NOT. PRESENT(PPRCOV) ) LLCONV=.TRUE. + +!* set flux to zero +ZWLOSS(:,:)=0._JPRB + +ZEPSFLX =1.E-18_JPRB +ZEPSQLIQ=2.E-6_JPRB +ZEPSQLIQ2=2.E-7_JPRB + +!* mini cloud cover and precip cover +ZMINCLCOV=0.001_JPRB +ZMINPRCOV=0.001_JPRB + +!* precip fall speed +ZFALLSP = 5.0_JPRB + +!* ideal gas constant in atm M-1 +ZRD=1000.0_JPRB * RD * 9.8692_JPRB / 1000000.0_JPRB +ZRD=0.082_JPRB +ZRL=RG/1E2_JPRB*1E-6_JPRB +PFAERO(:,:)=0._JPRB + +!* initialisation +!* re-evaporation fraction to account for drop shrinking without releasing species +! Jacob says +!ZFRAC=0.5_JPRB +ZFRAC=0.2_JPRB + +!* update tendecies + +!* if not LLCHEM_WDFR +ZPRCOV = 1.0_JPRB +ZCLCOV = 1.0_JPRB + +PTENC1(KIDIA:KFDIA,1:KLEV,1:KAER) =PTENC0(KIDIA:KFDIA,1:KLEV,1:KAER) + +!* LOOP OVER LAYERS +DO JK=1,KLEV + DO JL=KIDIA,KFDIA + +!- temperature + ZTEMP = PTP(JL,JK) +!- precip flux at box top + ZFLXR = PFLXR(JL,JK) + ZFLXS = PFLXS(JL,JK) + ZFLXRB = PFLXR(JL,JK+1) + ZFLXSB = PFLXS(JL,JK+1) + +!-- Precip flux change grid box average - indicator for rain/snow formation or evaporation + ZBETA = ( ZFLXRB - ZFLXR ) + ( ZFLXSB - ZFLXS ) ! in kg m-2 s-1 + ZCLWAT = PCLWAT(JL,JK) + ZCLICE = PCLICE(JL,JK) + + IF ( ZBETA == 0.0_JPRB .AND. ZFLXR < ZEPSFLX ) CYCLE + IF ( LLCHEM_WDFR ) THEN +!* use effective flux and cloud cover for liquid water content + IF (.NOT. LLCONV ) THEN + ZPRCOV = MIN(MAX(RCOVPMIN,PPRCOV(JL,JK)),1.0_JPRB) ! grid scale precip + ZCLCOV = MIN(1.0_JPRB,MAX(0.0_JPRB,PCLCOV(JL,JK))) + ELSE + ZPRCOV = 0.05 ! convective precip + ZCLCOV = 0.05 ! convective precip + ! ZPRCOV = 0.1 ! convective precip + ENDIF + IF (ZPRCOV >= ZMINPRCOV) THEN + ZFLXR = ZFLXR / ZPRCOV + ZFLXS = ZFLXS / ZPRCOV + ZFLXRB = ZFLXRB / ZPRCOV + ZFLXSB = ZFLXSB / ZPRCOV + ZBETA = ZBETA / ZPRCOV + ELSE + ZFLXR = 0.0_JPRB + ZFLXS = 0.0_JPRB + ZFLXRB = 0.0_JPRB + ZFLXSB = 0.0_JPRB + ZBETA = 0.0_JPRB + ENDIF + IF (ZCLCOV >= ZMINCLCOV ) THEN + ZCLWAT = MAX(0.0_JPRB,PCLWAT(JL,JK) / ZCLCOV) + ZCLICE = MAX(0.0_JPRB,PCLICE(JL,JK) / ZCLCOV) + ELSE + ZCLWAT = 0.0_JPRB + ZCLICE = 0.0_JPRB + ENDIF + ENDIF + +!* calculate air density, layer depth + ZRHO=PRSF1(JL,JK)/(RD*ZTEMP) + ZDZ= PDP(JL,JK) / (ZRHO*RG) + ZDP = PDP(JL,JK) +! clwc mass mixing ratio to volume mixing ratio : rho air / rho cloud water - note it is liquid water not vapor + ZLMMR2VMR=ZRHO/1000.0_JPRB + IWETDEP=0 + +!* LOOP over species + DO JSCAV=1,NSCAV + + ! Identify aerosol tracer + JT=NSCAV_INDEX(JSCAV) + LLWDAER=.TRUE. + IWETDEP=IWETDEP+1 + + !VH This whole 'selection mechanism is ideally coded in an alternative way, + ! using a lookup table approach. That should be comuptationally much more efficient. + SELECT CASE (NSCAV_TYPE(JSCAV)) + case(0) + incloud = 0.0 + belowcloud = 0.0 + case(1) ! 100% solubility + !incloud = 1. + !belowcloud = corr_diff + CALL ABOR1(" option not supported") + case(2) ! henry solubility assumed + ! rtl = rtl*henry(n,itemp) / ( 1.0 + rtl*henry(n,itemp) ) + ! incloud = rloss1(region)%d3(i,j,k)*rtl + ! belowcloud = rloss2(region)%d3(i,j,k)*rtl*corr_diff + CALL ABOR1("Henry solubility currently not supported") + case(3) ! bulk aerosol + incloud = (1.0 - ZINTERST_FR) + !>>>TvN + ! Alternative would be to make the interstitial fraction for bulk aerosols + ! consistent the values used for the M7 modes, + ! which are taken from Bourgeois and Bey (JGR, 2011) + ! and distinguish between warm, mixed and ice clouds + !<<hso3m+hplus + ! dkhso3 = 6.6e-8*exp(1510.*ztr) !hso3m<=>so3-- + hplus + ! factor = 1.0 + dkso2/hplus + (dkso2*dkhso3)/(hplus**2) + ! heff = factor*henry(n,itemp) + ! rtl = rtl*heff/ ( 1.0 + rtl*heff ) + ! incloud = rloss1(region)%d3(i,j,k)*rtl ! + ! belowcloud = rloss2(region)%d3(i,j,k)*rtl*corr_diff + CALL ABOR1("SO2 solubility currently not supported") + + +!>>>TvN +! The in-cloud scavenging coefficients are defined as the fraction of the tracer +! in the cloudy part of the grid box that is embedded in the cloud liquid or ice water, +! i.e. the non-interstitial part. +! We distinguish between liquid, mixed and ice stratiform clouds (Stier et al., 2005), +! depending on the local temperature in the grid cell (Croft et al., ACP, 2010). +! The in-cloud scavenging coefficients depend on size and composition; +! revised values for the M7 modes were provided by Bourgeois and Bey (JGR, 2011). +! For mixed clouds, an alternative method was presented by Zhang et al. (ACP, 2012), +! which uses a continuous temperature dependency. +! Note that these in-cloud scavenging coefficients account for both nucleation scavenging +! and impaction scavenging (Croft et al., ACP, 2009; 2010). +! Thus, the below-cloud scavenging rates should only account for +! the impaction scavenging by precipitation coming from clouds above the current level. +! +! Estimates for below-cloud scavenging coefficients can be derived +! from Fig. 2 of Dana and Hales (AE, 1975). +! For estimating these values from the figure, I used aerodynamic radii of +! 0.007, 0.07, and 0.7 micron as the boundaries of the M7 modes +! (corresponding to a particle density of about 1800 g/cm^3). +! As in Stier et al. (2005), we do not distinguish between soluble and insoluble modes. +! Thus, dry particle radii can be used for estimating the scavenging coefficients from the figure +! (see also the mode boundaries applied in Fig. 2 in Croft et al., 2009). +! I thus arrive at the following rough estimates for below-cloud mass scavenging coefficients +! for the nucleation, aitken, accumulation, and coarse modes: ~0.01, 0.002, 0.01, and 1 mm^-1. +! These numbers are close to the estimates derived earlier from the same figure +! by Elisabetta Vignati, which were previously used: 0.005, 0.002, 0.008, and 1 mm^-1. +! +! However, both sets of estimates based on Dana and Hales are substantially higher +! than the values presented by Croft et al. (2009). +! From the curves presented in their Fig. 2 for the standard Marshall-Palmer rain distribution, +! rough estimates of the mass scavenging coefficients for the four size modes can be obtained. +! My estimates are 0.002, 0.0002, 0.03, and 0.7 mm^-1. +! Note that especially the value for the accumulation mode is very sensitive to the +! actual mean particle size, and hard to estimate from the figure. +! Since the mean droplet size of the Marshall-Palmer distribution depends on the rain intensity, +! these estimates are only valid for a rain rate of 1 mm/hr. +! For simplicity, we assume that the scavenging coefficients derived from the figure at 1 mm/hr +! can also be applied at other rain intensities. +! +! In the new implementation particle masses and numbers are scavenged at different rates. +! Rough estimates of the number scavenging coefficients for the four size modes +! can be obtained from the same figure in Croft et al. +! My estimates are 0.02, 0.001, 0.0003, and 0.3 mm^-1. + +! Ideally, the below-cloud mass/number scavenging coefficients should be calculated +! using look-up tables to describe the dependence on median radius and precipitation rate, +! e.g. following the formulation/curves presented by Croft et al. +! + + + case(5) ! soluble nu + if (JT /= inus_n) then + belowcloud=0.5 ! 0.5*0.004 = 0.002 mm^-2 + else + belowcloud=5. ! 5.*0.004 = 0.02 mm^-2 + endif + incloud=0.06 + + case(6) ! soluble ai + if (jt /= iais_n) then + belowcloud=0.05 ! 0.05*0.004 = 0.0002 mm^-2 + else + belowcloud=0.25 ! 0.25*0.004 = 0.001 mm^-2 + endif + if (ZTEMP.gt.273.15) then + incloud=0.25 + else + incloud=0.06 + endif + + case(7) ! soluble ac + if (jt /= iacs_n) then + belowcloud=7.5 ! 7.5*0.004 = 0.03 mm^-1 + else + belowcloud=0.075 ! 0.075*0.004 = 0.0003 mm^-1 + endif + + if (ZTEMP.gt.273.15) then + incloud=0.85 + else + incloud=0.06 + endif + + case(8) ! soluble co + if (jt /= icos_n) then + belowcloud=175. ! 175*0.004 = 0.7 mm^-1 + else + belowcloud=75. ! 75*0.004 = 0.3 mm^-1 + endif + if (ZTEMP.gt.273.15) then + incloud=0.99 + else if (ZTEMP.gt.238.15) then + incloud=0.75 + else + incloud=0.06 + endif + + case(9) ! insoluble ai + if (jt /= iaii_n) then + belowcloud=0.05 + else + belowcloud=0.25 + endif + !incloud=0.0 + if (ZTEMP.gt.273.15) then + incloud=0.2 + else + incloud=0.06 + endif + + case(10) ! insoluble ac + if (jt /= iaci_n) then + belowcloud=7.5 + else + belowcloud=0.075 + endif + if (ZTEMP.gt.273.15) then + incloud=0.4 + else + incloud=0.06 + endif + + case(11) ! insoluble co + if (jt /= icoi_n) then + belowcloud=175. + else + belowcloud=75. + endif + if (ZTEMP.gt.238.15) then + incloud=0.4 + else + incloud=0.06 + endif + + case default + incloud = 0.0 + belowcloud = 0.0 + end select + + + + + + !* total cloud water and ice + ZCLTOT=ZCLWAT + ZCLICE + !* Rain-out in Cloud + IF (ZCLTOT > ZEPSQLIQ .AND. ZBETA > 0.0_JPRB ) THEN + !* water loss due to precip formation relative to total (water and ice) cloud + ZBETAR_M7=ZBETA / ( ZCLTOT*ZDP / RG ) ! in s-1 + !* safety check + ZBETAR_M7=MIN( 200._JPRB, MAX( ZBETAR_M7, 0._JPRB )) + + !* water loss due to precip formation relative to cloud, with reduced weight for ice cloud. + !* Relevant to trace gas scavenging, but not treated here. + ! ZINC_RDF=ZCLICE/ZCLTOT*ICE_EFF + ZCLWAT/ZCLTOT + ! ZBETAR=ZBETA *ZINC_RDF / ( ZCLTOT*ZDP / RG ) ! in s-1 + !* safety check + ! ZBETAR=MIN( 200._JPRB, MAX( ZBETAR, 0._JPRB )) + + + !* scavenging coefficient in s-1 + !In-cloud scavenging is different for aerosol than for gas-phase + ZSCAV=ZBETAR_M7 *INCLOUD + + ZFUNC=EXP(-ZSCAV*PTSPHY) ! N.D. (N.D.) + IF (.NOT. LLCONV) THEN + ZFUNC=MAX(0.95_JPRB, ZFUNC) + ENDIF + ZDX = PCEN(JL,JK,JT)*(ZFUNC - 1._JPRB) * ZPRCOV ! in kg kg-1 + PTENC1 (JL,JK,JT) = PTENC1(JL,JK,JT) + ZDX/PTSPHY ! in kg kg-1 s-1 + ZWLOSS(JL,IWETDEP) = ZWLOSS(JL,IWETDEP) - ZDX/PTSPHY * ZDP/RG ! in kg m-2 s-1 + ENDIF + + + + + +!* reevaporation ! bottom flux smaller and top flux above limit + IF (ZBETA < 0.0_JPRB .AND. ZFLXR+ZFLXS > ZEPSFLX ) THEN + ZBETAR=ZBETA/(ZFLXR+ZFLXS) + IF ( ZFLXRB+ZFLXSB <= ZEPSFLX) THEN +!-- total reevaporation, bottom flux <= ZEPSFLX + ZBETAR=MIN(MAX(0._JPRB, -ZBETAR), 1._JPRB) ! N.D. + ELSE +!-- partial reevaporation + ZBETAR=MIN(MAX(0._JPRB, -ZBETAR)*ZFRAC, 1._JPRB) ! N.D. + ENDIF + ZDX = (ZBETAR*ZWLOSS(JL,IWETDEP) * (RG/ZDP) *PTSPHY) * ZPRCOV + PTENC1(JL,JK,JT) = PTENC1(JL,JK,JT) + ZDX/PTSPHY + ZWLOSS(JL,IWETDEP) = ZWLOSS(JL,IWETDEP) - ZDX/PTSPHY * ZDP/RG ! in kg m-2 s-1 + IF (LLPRINT .AND. ZBETAR > 0._JPRB) THEN + WRITE(UNIT=NULOUT,FMT='(1x,''ZSCAV3'',5I3,(11E10.3))') KSTEP,JL,JK,& +& PTENC0(JL,JK,JT),PCEN(JL,JK,JT),PTENC1(JL,JK,JT),ZWLOSS(JL,IWETDEP),ZBETAR,ZDX + ENDIF + ENDIF + + + + +!!* wash-out with rain when flux is positive and no rain formation or evaporation (below-cloud) +! IF (ZFLXR > ZEPSFLX .AND. ABS(ZBETA) <= ZEPSFLX ) THEN +!* wash-out with rain when flux is positive + IF (ZFLXR > ZEPSFLX ) THEN + + ! calculate fraction in rainwater according to Henry + !* rain water in box in kg/kg + IF (LLCONV ) THEN + ZRAINW=(ZFLXR/(ZFALLSP*ZRHO)) / ZPRCOV + ELSE + ZRAINW = (PRAIN(JL,JK)+PSNOW(JL,JK)) / ZPRCOV ! + PSNOW(JL,JK) ! use prognostic variable from input + ENDIF + + ! Rain + ZSCAV=ZFLXR * BELOWCLOUD + ZFUNC=EXP(-ZSCAV*PTSPHY) ! N.D. (N.D.) + ZDX = PCEN(JL,JK,JT)*(ZFUNC -1._JPRB)*ZPRCOV ! in kg kg-1 + ZFUNC=MAX(0.97_JPRB, ZFUNC) + + ! snow + ZSCAV=ZFLXS*5.E-3 ! first assumption - requires review/update! + ZFUNC=EXP(-ZSCAV*PTSPHY) ! N.D. (N.D.) + ZDX = ZDX + PCEN(JL,JK,JT)*(ZFUNC - 1._JPRB)*ZPRCOV ! in kg kg-1 + ZFUNC=MAX(0.97_JPRB, ZFUNC) + + PTENC1 (JL,JK,JT) = PTENC1(JL,JK,JT) + ZDX/PTSPHY ! in kg kg-1 s-1 + ZWLOSS(JL,IWETDEP) = ZWLOSS(JL,IWETDEP) - ZDX/PTSPHY * ZDP/RG ! in kg m-2 s-1 + + ENDIF ! rainout + ENDDO + ENDDO +ENDDO + + + +!* LOOP OVER LAYERS +DO JK=1,KLEV + DO JL=KIDIA,KFDIA + PFAERO(JL,:) = PFAERO(JL,:) -(PTENC1(JL,JK,:)-PTENC0(JL,JK,:))*(PDP(JL,JK))/RG + ENDDO +ENDDO + + +!! debug undo anything +! PTENC1(KIDIA:KFDIA,1:KLEV,1:KCHEM) =PTENC0(KIDIA:KFDIA,1:KLEV,1:KCHEM) +!----------------------------------------------------------------------- +END ASSOCIATE +IF (LHOOK) CALL DR_HOOK('TM5M7_SCAV',1,ZHOOK_HANDLE) +END SUBROUTINE TM5M7_SCAV diff --git a/ifs-source/arpifs/phys_ec/tm5m7_sediment.F90 b/ifs-source/arpifs/phys_ec/tm5m7_sediment.F90 new file mode 100644 index 00000000..e7d7566d --- /dev/null +++ b/ifs-source/arpifs/phys_ec/tm5m7_sediment.F90 @@ -0,0 +1,360 @@ +SUBROUTINE TM5M7_SEDIMENT & + !---input + & ( KIDIA , KFDIA , KLON, KLEV, KTRAC, KAERO , & + & PTSPHY, PT , PAP , PAPH, & + !---prognostic fields + & RW_MODE, DENS_MODE, PCEN, & + !---output + & PFLUXAER, PTENC) + +!**** *TM5M7_SEDIMENT* - ROUTINE FOR PARAMETRIZATION OF TM5M7 AEROSOL SEDIMENTATION +! +! !DESCRIPTION: This module calculates sedimentation of aerosol particles. +! Also the deposition at the surface is calculated here since +! it uses similar routines. +! +! It is assumed that the distribution is described by nmodes log-normal +! distributions +! +! Each mode has a number and mass and a sigma_lognormal. Number and mass are +! related and the mean aerosol radius can thus be calculated for each mode. +! +! mass=pi*4./3.*radius**3.*number*exp(9./2.*ln2s) /1e18*density, with: +! +! density = density of aerosol type +! ln2s = (log(sigma_lognormal(mode)))**2 +! mass = mode mass +! number = mode number +! +! mode1 : accumulation +! mode2 : coarse +! mode3 : super coarse (ss) coarse +! +! For each mode a separate fall velocity is calculated according to the mass +! and number mean radii. Water take-up by seasalt particles is taken into +! account. This changes the density, radius, and sigma of the distribution. +! +! Also included is the deposition calculation. based on a lookup table +! calculated for a reference aerosol density (e.g. 1800 kg/m3) and a number of +! radii. This deposition curve is convoluted with the number/volume +! distribution of the aerosols. +! + +! Again, for SS the water takeup is accounted for, and the effects on density, +! sigma and radius are calculated. The density has effect on the impaction +! term is the depotion calculation. This can be modeled by a shift in the +! radius. Thus the radii of the lookup table are adapted for density +! differences when impaction becomes important. + +!** INTERFACE. +! ---------- +! *TM5M7_SEDIMENT* IS CALLED FROM *TM5M7_PHY2*. + +! INPUTS: +! ------- +! PTSPHY : TIMESTEP (s) +! PAP (KLON,KLEV) : LEVEL PRESSURE (Pa) +! PAPH (KLON,KLEV+1) : HALF-LEVEL PRESSURE (Pa) +! PCI (KLON) : FRACTION OF SEA ICE +! PLSM (KLON) : LAND-SEA MASK +! PT (KLON,KLEV) : LEVEL TEMPERATURE (K) +! PCEN (KLON,KLEV,KTRAC) : CONCENTRATION OF TRACERS (xx kg-1) + +! OUTPUTS: +! -------- +! PTENC (KLON,KLEV,KTRAC) : TENDENCY (xx kg-1 s-1) + +! EXTERNALS. +! ---------- +! NONE + +! MODIFICATIONS. +! ------------- + +! SWITCHES. +! -------- + +! MODEL PARAMETERS +! ---------------- + +!----------------------------------------------------------------------- +USE PARKIND1 ,ONLY : JPIM ,JPRB +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK + +USE YOEAERSRC ,ONLY : YREAERSRC +USE YOEAERSNK ,ONLY : YREAERSNK +USE YOMCST ,ONLY : RG, RD,RNAVO +USE YOM_YGFL ,ONLY : YGFL +USE TM5M7_DATA, ONLY : NMOD, MODE_NM_SED, mode_tracers_sed, XMAIR,MODAL_DATA, & + & SIGMA_LOGNORMAL + +IMPLICIT NONE + +!----------------------------------------------------------------------- + +!* 0.1 ARGUMENTS +! --------- + +!---input fields +INTEGER(KIND=JPIM),INTENT(IN) :: KLON +INTEGER(KIND=JPIM),INTENT(IN) :: KLEV +INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA +INTEGER(KIND=JPIM),INTENT(IN) :: KFDIA +INTEGER(KIND=JPIM),INTENT(IN) :: KTRAC +INTEGER(KIND=JPIM),INTENT(IN) :: KAERO(YGFL%NAERO) +REAL(KIND=JPRB) ,INTENT(IN) :: PTSPHY +REAL(KIND=JPRB) ,INTENT(IN) :: PT(KLON,KLEV) ! Temp +REAL(KIND=JPRB) ,INTENT(IN) :: PAP(KLON,KLEV)! Mid-lev pres +REAL(KIND=JPRB) ,INTENT(IN) :: PAPH(KLON,KLEV+1) ! interface pres +!REAL(KIND=JPRB) ,INTENT(IN) :: PAERO(KLON,KLEV) +!REAL(KIND=JPRB) ,INTENT(IN) :: PTAERI(KLON,KLEV) +TYPE(MODAL_DATA) ,INTENT(IN) :: RW_MODE(NMOD) +TYPE(MODAL_DATA) ,INTENT(IN) :: DENS_MODE(NMOD) + +REAL(KIND=JPRB) ,INTENT(IN) :: PCEN(KLON,KLEV,KTRAC) +!---output fields +REAL(KIND=JPRB) ,INTENT(OUT) :: PFLUXAER(KLON,YGFL%NACTAERO) +REAL(KIND=JPRB) ,INTENT(INOUT) :: PTENC(KLON,KLEV,KTRAC) + + +!---local fields +REAL(KIND=JPRB) :: TEMP, PB, DP, ZVIS, RHO_AIR, TO_PASCAL,RADIUS,DPG,VT +REAL(KIND=JPRB) :: ZSEDFLX(KLON), ZAERONWM1(KLON), ZAERI(KLON,KLEV), & + & ZSOLAERS, ZSOLAERB, ZGDP, ZDTGDP, ZKK, & + & SIGMA, LNSIGMA,DENSITY,SLINNFAC, & + & ZRHO, ZAERONW +INTEGER(KIND=JPIM) :: JK, JL, JN, MODE, IMODE, INMODE +INTEGER(KIND=JPIM), PARAMETER :: ndp = 3 ! limit of the velocity to ndp times the layer thickness + ! iteration will account for a fall length through multiple layers + +REAL(KIND=JPRB) :: m_to_pa !factor from m/s --> Pa/s + +REAL(KIND=JPRB),DIMENSION(:,:),POINTER :: VS + +! Arrays to collect sedimentation velocities +TYPE(MODAL_DATA), DIMENSION(NMOD), TARGET :: VN_SEDIMENTATION +TYPE(MODAL_DATA), DIMENSION(NMOD), TARGET :: VM_SEDIMENTATION + + +REAL(KIND=JPRB) :: ZHOOK_HANDLE +!----------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('TM5M7_SEDIMENT',0,ZHOOK_HANDLE) + + +m_to_pa = 7.24e16*RG*xmair*1e3/RNAVO !factor from m/s --> Pa/s + +!- PAERO in unit of xx kg-1 (mixing ratio) +!- ZAERONW in unit of xx kg-1 +!- ZSOLAERS, ZSOLAERB in xx kg-1 as m s-2/DeltaP xx m-2 = m s-2/(kg m-1 s-2) xx m-2 +!- ZSEDFLX in unit of xx m-2 +!- ZRHO in unit of kg m-3 +!- v[n|m]_sedimentation in unit of m s-1 speed + + +DO IMODE=1,NMOD + ALLOCATE(VN_SEDIMENTATION(IMODE)%d2(KIDIA:KFDIA,KLEV)) + ALLOCATE(VM_SEDIMENTATION(IMODE)%d2(KIDIA:KFDIA,KLEV)) + + VN_SEDIMENTATION(IMODE)%d2(KIDIA:KFDIA,1:KLEV)=0.0_JPRB + VM_SEDIMENTATION(IMODE)%d2(KIDIA:KFDIA,1:KLEV)=0.0_JPRB +ENDDO + +! Loop over levels +do JK=2, KLEV + + + do JL=KIDIA, KFDIA + + if(JK == KLEV) then + temp = PT(JL,KLEV) ! at surface to temp box + else + temp = 0.5*(PT(JL,JK)+PT(JL,JK+1)) ! interpolate to bottom of box + endif + + pb = PAPH(JL,JK) ! pressure at bottom of box (Pa) + dp = PAPH(JL,JK)-PAPH(JL,JK-1) ! layer thickness + zvis = 0.0000014963*temp*sqrt(temp)/(temp+120.) ! viscosity (kg/ms) + rho_air = 7.24e16*pb/temp * xmair*1e3/RNAVO ! kg/m3 + to_pascal = m_to_pa*pb/temp ! convert from m/s ---> Pa/sec + + M7MODES: do mode = 1, nmod + + radius = rw_mode(mode)%d2(JL,JK) + + sigma = sigma_lognormal(mode) + lnsigma = log(sigma) + density = dens_mode(mode)%d2(JL,JK) + + slinnfac = exp(2.0*lnsigma*lnsigma) + + + ! for number: take first mode (Seinfeld, 1986, pg 286) + dpg = radius*2.0*exp(lnsigma*lnsigma) ! diameter in m + vt = TM5M7_fall1(pb,Dpg,zvis,temp,rho_air,density) + + + !VH vn_sedimentation(mode)%d2(JL,JK) = min(to_pascal*vt,ndp*dp) ! in Pa/sec downwards + vn_sedimentation(mode)%d2(JL,JK) = vt ! in m/sec downwards + + !VH if(JK == KLEV) then + !VH vn_sedimentation_mean%surf(JL,mode) = & + !VH vn_sedimentation_mean%surf(JL,mode) + vt + !VH endif + + ! for mass: the third moment + dpg = radius*2.0*exp(3*lnsigma*lnsigma) ! diameter in m + vt = TM5M7_fall1(pb,Dpg,zvis,temp,rho_air,density) + + + !VH vm_sedimentation(mode)%d2(JL,JK) = min(to_pascal*vt*slinnfac,ndp*dp) ! multiply with slinnfac + vm_sedimentation(mode)%d2(JL,JK) = vt*slinnfac ! multiply with slinnfac + + !VH if(JK == KLEV) then + !VH vm_sedimentation_mean%surf(JL,mode) = & + !VH vm_sedimentation_mean%surf(JL,mode) + vt*slinnfac + !VH endif + + enddo M7MODES + enddo ! JL +enddo ! LEVS + + + +! Compute corresponding tendencies +! ================= +! Loop over tracers +! ================= +do mode =1,nmod + !do inmode=0,mode_nm(mode) + do inmode=0,mode_nm_sed(mode) + + JN = mode_tracers_sed(inmode,mode) + + !------------- reset + NULLIFY(VS) + if (inmode == 0) then ! number or mass tracer + vs => vn_sedimentation(mode)%d2 + else + vs => vm_sedimentation(mode)%d2 + endif + + + !--initialisations of variables carried out from one layer to the next layer + !--actually not needed if (JK>1) test is on + ZSEDFLX(KIDIA:KFDIA)=0.0_JPRB + ZAERONWM1(KIDIA:KFDIA)=0.0_JPRB + + DO JK=1, KLEV + + DO JL=KIDIA, KFDIA + !--initialisations + ZSOLAERS=0.0 + ZSOLAERB=0.0 + ZGDP=RG/(PAPH(JL,JK+1)-PAPH(JL,JK)) + ZDTGDP=PTSPHY*ZGDP + + !- Starting point is input concentration field + + ZAERI(JL,JK) = PCEN(JL,JK,KAERO(JN)) + + ! (Or: apply intermediate tendencies??) + ! ZAERI(JL,JK) = PCEN(JL,JK,KAERO(JN)) + PTSPHY * PTAERI(JL,JK,KAERO(JN)) + ! with PTAERI containing the tendencies from dry deposition + + ! source from above + IF (JK>1) THEN + ZSEDFLX(JL)=ZSEDFLX(JL)*ZAERONWM1(JL) + ZSOLAERS=ZSOLAERS+ZSEDFLX(JL)*ZDTGDP + ENDIF + + ! sink to next layer + ZRHO=PAP(JL,JK)/(RD*PT(JL,JK)) + ZSEDFLX(JL)=VS(JL,JK)*ZRHO + ZSOLAERB=ZSOLAERB+ZDTGDP*ZSEDFLX(JL) + + !---implicit solver + ZAERONW=(ZAERI(JL,JK)+ZSOLAERS)/(1.0_JPRB+ZSOLAERB) + + !---new time-step AER variable needed for next layer + ZAERONWM1(JL)=ZAERONW + + !---tendency in unit of xx kg-1 s-1 + PTENC(JL,JK,KAERO(JN))=PTENC(JL,JK,KAERO(JN))+(ZAERONW-ZAERI(JL,JK))/PTSPHY + ! + ENDDO + ENDDO + + !---sedimentation flux to the surface + !---ZAERONWM1 now contains the surface concentration at the new timestep + !---PFLUXAER in unit of xx m-2 s-1 + DO JL=KIDIA,KFDIA + ZRHO=PAP(JL,KLEV)/(RD*PT(JL,KLEV)) + PFLUXAER(JL,JN)=ZRHO*ZAERONWM1(JL)*VS(JL,KLEV) + ENDDO + + enddo ! loop over tracers in mode +enddo ! loop over modes + + + +DO IMODE=1,NMOD + DEALLOCATE(VN_SEDIMENTATION(IMODE)%d2) + DEALLOCATE(VM_SEDIMENTATION(IMODE)%d2) +ENDDO + + + +!----------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('TM5M7_SEDIMENT',1,ZHOOK_HANDLE) +CONTAINS + + + + ! !IROUTINE: TM5M7_FALL1 + ! + ! !DESCRIPTION: function to calculate the fall velocity from the particle + ! diameter, as a function of density, temperature and pressure. + !\\ + !\\ + ! !INTERFACE: + ! + REAL(KIND=JPRB) FUNCTION TM5M7_FALL1( press, zmd, zvis, t, zdensair, densaer_p) result(vt) + ! + ! !INPUT PARAMETERS: + ! + REAL(KIND=JPRB), INTENT(IN) :: press ! pressure in Pa (or bar?) + REAL(KIND=JPRB), INTENT(IN) :: zmd ! median radius of aerosol (m) + REAL(KIND=JPRB), INTENT(IN) :: zvis ! viscosity (kg/(sm)) + REAL(KIND=JPRB), INTENT(IN) :: t ! temperature (K) + REAL(KIND=JPRB), INTENT(IN) :: zdensair ! density air (kg/m3) + REAL(KIND=JPRB), INTENT(IN) :: densaer_p ! density aerosol particles (kg/m3) + ! + ! !REVISION HISTORY: + ! 2 Apr 2010 - P. Le Sager - + ! + ! !REMARKS: + ! Called in Sedimentation_Apply, only if m7 used. + ! + !EOP + !------------------------------------------------------------------------------ + !BOC + + REAL(KIND=JPRB) :: zlair + + ! ----------- start + if (zmd > tiny(zmd)) then + vt=2./9.*(densaer_p-zdensair) * RG/zvis*(zmd/2.)**2. + + zlair=0.066*(1.01325e5/press)*t/293.15*1e-6 + + !--- With cunnigham slip- flow correction (S&P, Equation 8.34): + + vt = vt * (1.+ 1.257*zlair/zmd*2. + 0.4*zlair/zmd*2. * exp(-1.1/(zlair/zmd*2.)) ) + else + vt = 0.0 + endif + + END FUNCTION TM5M7_FALL1 + + +END SUBROUTINE TM5M7_SEDIMENT diff --git a/ifs-source/arpifs/phys_ec/tm5m7_src.F90 b/ifs-source/arpifs/phys_ec/tm5m7_src.F90 new file mode 100644 index 00000000..51e2e768 --- /dev/null +++ b/ifs-source/arpifs/phys_ec/tm5m7_src.F90 @@ -0,0 +1,856 @@ +SUBROUTINE TM5M7_SRC & + &( YDGEOMETRY, YDMODEL, KIDIA, KFDIA, KLON , KTDIA, KLEV, KTILES, KSTART, KSTEP ,KSTGLO,& + & KSW , KTRAC, KAERO,& + & PALB , PALBD, PAPHI ,& + & PAERDEP, PAERLTS, PAERSCC, PAERGUST, PALTH ,& + & PBCBF, PBCFF, PBCGF, POMBF, POMFF, POMGF,& + & PAPH , PAP , PCI , PCLAKE, PINJF, PBLH, PDELP, PGELAM, PGELAT, PGEMU , PFRTI , PHSDFOR,& + & PLSM , PSST , PQ , PRHO , PSNS , PT , PTL , PTSPHY, PZ0M, KCHEM,& + & PWIND, PWS1 ,PSOIL_TYPE, & + & PCVL, PCVH, KTVL, KTVH, & + & PLDAY, PAERFLX, PCFLX , PCEN , PTENC, PEMIDIAG, PSO2SRC,PSO4SRC,PSOA,PSOACO) + +!*** * TM5M7_SRC* - SOURCE TERMS FOR TM5M7 AEROSOL SCHEME + +!** INTERFACE. +! ---------- +! *TM5M7_SRC* IS CALLED FROM *TM5M7_PHY2* + + +! AUTHOR. +! ------- +! Vincent Huijnen *KNMI* +! ORIGINAL : 2020-08-25 + +! MODIFICATIONS. +! -------------- +! +! +!----------------------------------------------------------------------- + +USE GEOMETRY_MOD , ONLY : GEOMETRY +USE TYPE_MODEL , ONLY : MODEL +USE PARKIND1 ,ONLY : JPIM, JPRB +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE YOMLUN ,ONLY : NULOUT, NULERR +!USE YOM_YGFL ,ONLY : YGFL +USE YOMCST ,ONLY : RA, RPI, RDAY, RG +USE YOMRIP0 ,ONLY : NINDAT, NSSSSS +!USE YOMRIP ,ONLY : YRRIP +!USE YOEPHY ,ONLY : YREPHY +!USE YOEAERATM ,ONLY : YREAERATM +!USE YOEAERMAP ,ONLY : YREAERMAP +!USE YOEAERSRC ,ONLY : YREAERSRC +!USE YOEAERVOL ,ONLY : YREAERVOL +!USE YOEAERSNK, ONLY : YREAERSNK +!USE YOMCOMPO, ONLY : YRCOMPO +USE TM5M7_DATA, ONLY : NMOD, MODE_NM, MODE_NM_SED, MODE_TRACERS_SED, & + & xmc, sigma_lognormal, pom_density, carbon_density, & + & mode_aii, mode_ais, mode_acs, mode_aci,iduai,iaii_n,& + & INO3_A, INH4,IMSA +USE TM5M7_EMIS_DATA, ONLY : MODAL_EMISSIONS, & + & rad_emi_ff_insol, rad_emi_ene_insol,rad_emi_ind_insol, & + & rad_emi_tra_insol, rad_emi_shp_insol,rad_emi_air_insol, & + & rad_emi_bf_insol, rad_emi_bb_insol,& + & rad_emi_ff_sol, rad_emi_ene_sol,rad_emi_ind_sol, & + & rad_emi_tra_sol, rad_emi_shp_sol,rad_emi_air_sol, & + & rad_emi_bf_sol, rad_emi_bb_sol, & + & frac_pom_sol_bf, frac_pom_sol_bb, frac_pom_sol_ff, & + & frac_bc_sol_bf, frac_bc_sol_bb, frac_bc_sol_ff + USE OIFS_TO_HAM, ONLY: ind_oifs_ham!% ind_gas_OIFS + +IMPLICIT NONE + +!----------------------------------------------------------------------- + +!* 0.1 ARGUMENTS +! --------- + +TYPE(GEOMETRY) ,INTENT(IN) :: YDGEOMETRY +TYPE(MODEL) ,INTENT(IN) :: YDMODEL +INTEGER(KIND=JPIM),INTENT(IN) :: KLON, KIDIA, KFDIA +INTEGER(KIND=JPIM),INTENT(IN) :: KLEV, KTDIA, KSTGLO +INTEGER(KIND=JPIM),INTENT(IN) :: KTILES +INTEGER(KIND=JPIM),INTENT(IN) :: KSTEP, KSTART +INTEGER(KIND=JPIM),INTENT(IN) :: KSW +INTEGER(KIND=JPIM),INTENT(IN) :: KTRAC +INTEGER(KIND=JPIM),INTENT(IN) :: KAERO(YDMODEL%YRML_GCONF%YGFL%NAERO) + +REAL(KIND=JPRB) ,INTENT(IN) :: PALB(KLON), PALBD(KLON,KSW) +REAL(KIND=JPRB) ,INTENT(IN) :: PAPHI(KLON,0:KLEV), PALTH(KLON,0:KLEV) +REAL(KIND=JPRB) ,INTENT(IN) :: PAERDEP(KLON), PAERLTS(KLON), PAERSCC(KLON) +REAL(KIND=JPRB) ,INTENT(IN) :: PBCBF(KLON), PBCFF(KLON), PBCGF(KLON), POMBF(KLON), POMFF(KLON), POMGF(KLON) +REAL(KIND=JPRB), INTENT(IN) :: PAERGUST(KLON), PHSDFOR(KLON) +REAL(KIND=JPRB) ,INTENT(IN) :: PAP(KLON,KLEV), PAPH(KLON,0:KLEV) +REAL(KIND=JPRB) ,INTENT(IN) :: PGELAM(KLON), PGELAT(KLON), PGEMU(KLON) +REAL(KIND=JPRB) ,INTENT(IN) :: PFRTI(KLON,KTILES) +REAL(KIND=JPRB) ,INTENT(IN) :: PCI(KLON), PCLAKE(KLON), PLSM(KLON), PSST(KLON) +REAL(KIND=JPRB) ,INTENT(IN) :: PINJF(KLON) +REAL(KIND=JPRB) ,INTENT(IN) :: PBLH(KLON) +REAL(KIND=JPRB) ,INTENT(IN) :: PDELP(KLON,KLEV) +REAL(KIND=JPRB) ,INTENT(IN) :: PQ(KLON,KLEV), PRHO(KLON,KLEV), PSNS(KLON) +REAL(KIND=JPRB) ,INTENT(IN) :: PT(KLON,KLEV) +REAL(KIND=JPRB) ,INTENT(IN) :: PTL(KLON) +REAL(KIND=JPRB) ,INTENT(IN) :: PWIND(KLON) +REAL(KIND=JPRB) ,INTENT(IN) :: PWS1(KLON) +REAL(KIND=JPRB) ,INTENT(IN) :: PSOIL_TYPE(KLON) +REAL(KIND=JPRB) ,INTENT(IN) :: PTSPHY +REAL(KIND=JPRB) ,INTENT(IN) :: PZ0M(KLON) +INTEGER(KIND=JPIM),INTENT(IN) :: KCHEM(YDMODEL%YRML_GCONF%YGFL%NCHEM) + +REAL(KIND=JPRB) ,INTENT(INOUT) :: PAERFLX(KLON,12,9) +REAL(KIND=JPRB) ,INTENT(INOUT) :: PCFLX(KLON,KTRAC) + +REAL(KIND=JPRB) , INTENT(IN) :: PCVL(KLON), PCVH(KLON) ! Low/High vegetation cover +INTEGER(KIND=JPIM), INTENT(IN) :: KTVL(KLON), KTVH(KLON) ! Low/High vegetation type + +REAL(KIND=JPRB) ,INTENT(INOUT) :: PCEN(KLON,KLEV,KTRAC) +REAL(KIND=JPRB) ,INTENT(INOUT) :: PTENC(KLON,KLEV,KTRAC) +REAL(KIND=JPRB) ,INTENT(INOUT) :: PLDAY(KLON) +REAL(KIND=JPRB) ,INTENT(INOUT) :: PEMIDIAG(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO) +REAL(KIND=JPRB),INTENT(INOUT) :: PSO4SRC(KLON,KLEV),PSO2SRC(KLON,KLEV) +REAL(KIND=JPRB) ,INTENT(IN) :: PSOACO(KLON) +REAL(KIND=JPRB) ,INTENT(IN) :: PSOA(KLON) + + +!* 0.5 LOCAL VARIABLES +! --------------- + +INTEGER(KIND=JPIM) :: JAER, JK, JL, IMODE, INMODE, JN, II, JGAS +INTEGER(KIND=JPIM) :: IGLGLO, IHTST + +! TM5-M7 data + +! Arrays to collect emissions +TYPE(MODAL_EMISSIONS), DIMENSION(NMOD), TARGET :: EMIS_MASS +TYPE(MODAL_EMISSIONS), DIMENSION(NMOD), TARGET :: EMIS_NUMBER + + +REAL(KIND=JPRB) :: ZFAERO(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO) , ZAEROCLIS(KLON,KLEV,2) +REAL(KIND=JPRB) :: ZAEROK(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO), ZTAEROK(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO) + +REAL(KIND=JPRB) :: ZGLAT(KLON), ZGLON(KLON) +REAL(KIND=JPRB) :: ZHDD, ZHSS +REAL(KIND=JPRB) :: ZDETAH(KLON,KLEV), ZETA(KLON,KLEV) , ZETAH(KLON,0:KLEV) + +!-- various sources +REAL(KIND=JPRB) :: ZLOCALTIM , ZDIURN(KLON) +REAL(KIND=JPRB) :: ZBCGF(KLON) +REAL(KIND=JPRB) :: ZWNDDU(KLON), ZWNDSS(KLON) +REAL(KIND=JPRB) :: ZBCSOURC, ZOMSOURC +REAL(KIND=JPRB) :: ZDEGRAD +REAL(KIND=JPRB) :: ZRWPWP , ZRWSAT + +!-- volcano-related variables +INTEGER(KIND=JPIM) :: IYY, IMM, IDD, IMDATE +INTEGER(KIND=JPIM) :: IY0, IM0, ID0, INC, IMON(12) + +REAL(KIND=JPRB) :: ZGRDLON(KLON) , ZGELAT(KLON), ZGDLAT(KLON), ZGDLON(KLON) +REAL(KIND=JPRB) :: ZDLAT, ZDLON +REAL(KIND=JPRB) :: ZGRDLAT, ZGRDLAT2, ZGRDLON2, ZINCLAT, Z1GP + +!-- map +REAL(KIND=JPRB) :: ZLAT, ZLON + +!-- QnD oceanic DMS +REAL(KIND=JPRB) :: ZCOS0, ZSIN0, ZRAD2DEG +REAL(KIND=JPRB) :: ZGEMU(KLON), ZLATK(KLON) + + +REAL(KIND=JPRB) :: numbscale_exp, mass2numb_fact, & + & mass2numb_ff_sol, mass2numb_ff_insol, mass2numb_ene_sol, mass2numb_ene_insol, & + & mass2numb_ind_sol, mass2numb_ind_insol, mass2numb_tra_sol, mass2numb_tra_insol, & + & mass2numb_shp_sol, mass2numb_shp_insol, & + & mass2numb_air_sol, mass2numb_air_insol, mass2numb_bf_sol, mass2numb_bf_insol, & + & mass2numb_bb_sol, mass2numb_bb_insol, mass2numb_nonbf_sol, mass2numb_nonbf_insol, & + & oc2pom + +REAL(KIND=JPRB) :: ZSOA(KLON) + +REAL(KIND=JPRB) :: FRAC_BF(KLON), EMIT(KLON,KLEV) + +INTEGER(KIND=JPIM) :: ISSO2, ISSO4 +!-- Injection height for biomass burning emissions +INTEGER(KIND=JPIM) :: ILINJ1, ILINJ2, IX(1) +REAL(KIND=JPRB) :: ZDELP + +REAL(KIND=JPRB) :: ZAERMAP(KLON,5) +#ifdef __PGI +REAL(KIND=JPRB) :: ERF +#else +INTRINSIC ERF +#endif + +REAL(KIND=JPRB) :: ZHOOK_HANDLE + +!----------------------------------------------------------------------- + +#include "updcal.intfb.h" +!#include "fcttim.func.h" + +#include "surf_inq.h" + +#include "tm5m7_src_ss.intfb.h" +#include "tm5m7_src_dust.intfb.h" +!#include "satur.intfb.h" +!#include "aer_volce.intfb.h" +!#include "aer_stratcl.intfb.h" + +IF (LHOOK) CALL DR_HOOK('TM5M7_SRC',0,ZHOOK_HANDLE) + + +!----------------------------------------------------------------------- +ASSOCIATE(YDVAB=>YDGEOMETRY%YRVAB,YDVETA=>YDGEOMETRY%YRVETA,YDVFE=>YDGEOMETRY%YRVFE,& + & YDCSGLEG=>YDGEOMETRY%YRCSGLEG,YDVSPLIP=>YDGEOMETRY%YRVSPLIP,YDVSLETA=>YDGEOMETRY%YRVSLETA,& + & YDEPHY=>YDMODEL%YRML_PHY_EC%YREPHY, & + & YDEAERMAP=>YDMODEL%YRML_PHY_AER%YREAERMAP, & + & YGFL=>YDMODEL%YRML_GCONF%YGFL, & + & YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO, & + & YDEAERSRC=>YDMODEL%YRML_PHY_AER%YREAERSRC, & + & YDEAERATM=>YDMODEL%YRML_PHY_RAD%YREAERATM, & + & YDRIP=>YDMODEL%YRML_GCONF%YRRIP) + + + +ASSOCIATE(LAERODIU=>YDCOMPO%LAERODIU, YAERO=>YGFL%YAERO, LFIRE=>YDCOMPO%LFIRE, LINJ=>YDCOMPO%LINJ, & + & NACTAERO=>YGFL%NACTAERO, NAERO=>YGFL%NAERO, & + & NDGLG=>YDGEOMETRY%YRDIM%NDGLG, RHGMT=>YDRIP%RHGMT, & + & RSTATI => YDRIP%RSTATI, RSIDECA=>YDEAERSRC%RSIDECA, & + & NAERWND=>YDEAERSRC%NAERWND, & + & RSIVSRA=>YDEAERSRC%RSIVSRA, & + & RCODECA=>YDEAERSRC%RCODECA, RCOVSRA=>YDEAERSRC%RCOVSRA, & + & NLOENG=>YDGEOMETRY%YRGEM%NLOENG, & + & NGLOBALAT=>YDGEOMETRY%YRMP%NGLOBALAT, & + & YSURF=>YDEPHY%YSURF,LVDFTRAC=>YDEPHY%LVDFTRAC, & + & NCHEM=>YGFL%NCHEM, YCHEM=>YGFL%YCHEM, LAERSOA_CHEM=>YDEAERATM%LAERSOA_CHEM, & + & LAERCHEM=>YGFL%LAERCHEM) + +! N.B.: In ECMWF model conventions, flux going upward from the surface +! are negative +! All surface fluxes PCFLUX in kg m-2 s-1 + +!----------------------------------------------------------------------- + +!* 0.1 TIME AND DATE OF THE MODEL +! -------------------------- + +IY0=NCCAA(NINDAT) +IM0=NMM(NINDAT) +ID0=NDD(NINDAT) +INC=(NSSSSS + NINT(RSTATI)/NINT(RDAY)) +CALL UPDCAL (ID0, IM0, IY0, INC, IDD, IMM, IYY, IMON, -1) +IMDATE=IYY*10000+IMM*100+IDD + +!* 0.2 A LENGTH OF DAY INDEX +! --------------------- + +DO JL=KIDIA,KFDIA + IGLGLO=NGLOBALAT(KSTGLO+JL-1) + ZGEMU(JL)=YDCSGLEG%RMU(IGLGLO) ! sine of latitude + ZLAT=ASIN(YDCSGLEG%RMU(IGLGLO))*ZRAD2DEG + ZLATK(JL)=ZLAT + ZCOS0=1._JPRB + ZSIN0=0._JPRB + PLDAY(JL)=MAX( RSIDECA*ZGEMU(JL)& + & -RCODECA*RCOVSRA*SQRT(1.0_JPRB-ZGEMU(JL)**2)* ZCOS0& + & +RCODECA*RSIVSRA*SQRT(1.0_JPRB-ZGEMU(JL)**2)* ZSIN0& + & ,0.0_JPRB) +ENDDO + +!----------------------------------------------------------------------- + +!* 0.3 CONSTANTS AND ACCESS TO DATA (remove?) +! ---------------------------- + +CALL SURF_INQ(YSURF,PRWPWP=ZRWPWP) +CALL SURF_INQ(YSURF,PRWSAT=ZRWSAT) + + + +!----------------------------------------------------------------------- + +!* 0.4 Time data +! ---------------------------- + +ZETAH(KIDIA:KFDIA,0)=0._JPRB +DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZETA(JL,JK) =PAP(JL,JK) /PAPH(JL,KLEV) + ZETAH(JL,JK)=PAPH(JL,JK)/PAPH(JL,KLEV) + ENDDO +ENDDO + +ZDEGRAD= 180._JPRB/RPI +ZDLAT = 180._JPRB / NDGLG ! distance in degrees between latitude lines +ZGRDLAT= RPI / NDGLG ! distance in radians between latitude lines +ZGRDLAT2=ZGRDLAT*0.55_JPRB + +DO JL=KIDIA,KFDIA + IGLGLO=NGLOBALAT(KSTGLO+JL-1) + Z1GP=1.0_JPRB/REAL(NLOENG(IGLGLO),JPRB) + ZDLON=Z1GP*2.0_JPRB*RPI ! distance in radians between longitude points on a given latitude line + ZGRDLON(JL)=ZDLON + ZLAT=ASIN(YDCSGLEG%RMU(IGLGLO)) ! latitude in radians + + ZGLON(JL)=PGELAM(JL)*ZDEGRAD + ZGLAT(JL)=ZLAT*ZDEGRAD + ZGDLAT(JL)=ZDLAT + ZGDLON(JL)=360._JPRB*Z1GP + + ZLOCALTIM =RHGMT + ZGLON(JL)/360._JPRB*RDAY + ZDIURN(JL)=COS( ((ZLOCALTIM-54000._JPRB)/RDAY) * 2._JPRB*RPI)+1._JPRB +ENDDO +IF (.NOT.LAERODIU) THEN + ZDIURN(KIDIA:KFDIA)=1.0_JPRB +ENDIF + + + +!----------------------------------------------------------------------- + +!* 0.5 Array initializations +! ---------------------- + +IHTST=20 + +DO IMODE=1,NMOD + ALLOCATE(EMIS_NUMBER(IMODE)%d3(KIDIA:KFDIA,KLEV,MODE_NM(IMODE))) + ALLOCATE(EMIS_MASS(IMODE)%d3(KIDIA:KFDIA,KLEV,MODE_NM(IMODE))) + + EMIS_NUMBER(IMODE)%d3(KIDIA:KFDIA,1:KLEV,1:MODE_NM(IMODE))=0.0_JPRB + EMIS_MASS(IMODE)%d3(KIDIA:KFDIA,1:KLEV,1:MODE_NM(IMODE))=0.0_JPRB +ENDDO + +!DO JAER=1,NACTAERO +! DO JL=KIDIA,KFDIA +! PCFLX(JL,KAERO(JAER))=0._JPRB +! END DO +!END DO + +ZFAERO (KIDIA:KFDIA, 1:NACTAERO) = 0.0_JPRB +ZAEROK (KIDIA:KFDIA, 1:KLEV, 1:NACTAERO) = PCEN (KIDIA:KFDIA, 1:KLEV, KAERO(1):KAERO(NACTAERO)) +ZTAEROK(KIDIA:KFDIA, 1:KLEV, 1:NACTAERO) = PTENC(KIDIA:KFDIA, 1:KLEV, KAERO(1):KAERO(NACTAERO)) + +PEMIDIAG(KIDIA:KFDIA, 1:NACTAERO)= 0.0_JPRB +!----------------------------------------------------------------------- + +!* 0.6 SURFACE WIND VARIABLE RELEVANT FOR SS AND DU EMISSIONS +! ------------------------------------------------------ + +IF (NAERWND == 0) THEN +!-- no gust accounted for + ZWNDDU(KIDIA:KFDIA) = PWIND(KIDIA:KFDIA) + ZWNDSS(KIDIA:KFDIA) = PWIND(KIDIA:KFDIA) +ELSEIF (NAERWND == 1) THEN +!-- gust only for SS, 10-m wind for DU + ZWNDDU(KIDIA:KFDIA) = PWIND(KIDIA:KFDIA) + ZWNDSS(KIDIA:KFDIA) = PAERGUST(KIDIA:KFDIA) +ELSEIF (NAERWND == 2) THEN +!-- gust only for DU, 10-m wind for SS + ZWNDDU(KIDIA:KFDIA) = PAERGUST(KIDIA:KFDIA) + ZWNDSS(KIDIA:KFDIA) = PWIND(KIDIA:KFDIA) +ELSEIF (NAERWND == 3) THEN +!-- gust for both SS and DU + ZWNDDU(KIDIA:KFDIA) = PAERGUST(KIDIA:KFDIA) + ZWNDSS(KIDIA:KFDIA) = PAERGUST(KIDIA:KFDIA) +ENDIF + +! correction to account for the decrease of mean wind and gusts with decreasing +! time step +IF (PTSPHY < 1000) THEN + ZWNDDU(KIDIA:KFDIA)=1.06_JPRB*ZWNDDU(KIDIA:KFDIA) + ZWNDSS(KIDIA:KFDIA)=1.08_JPRB*ZWNDSS(KIDIA:KFDIA) +ENDIF + +!----------------------------------------------------------------------- + +!* 1.0 SEA SALT +! -------- + +!- Simplistic lifting from surface based on 10-m wind and land-sea mask +! (currently not used!) +ZHSS=8434._JPRB/1000._JPRB + + + CALL TM5M7_SRC_SS(YDEAERSRC, KIDIA, KFDIA, KLON, KLEV, & + & PCI, PCLAKE, PLSM, PSST, ZWNDSS, & + & emis_mass, emis_number ) + + + +!----------------------------------------------------------------------- + +!* 2.0 DESERT DUST +! ----------- + +!- Simplistic lifting from surface based on 10-m wind and surface albedo +ZHDD=MAX(1.0_JPRB,8434._JPRB/1000._JPRB) + +PAERFLX(KIDIA:KFDIA,1:12,1:9)=0._JPRB +ZAERMAP(KIDIA:KFDIA,1:5)=0._JPRB +CALL TM5M7_SRC_DUST(YDMODEL, KIDIA, KFDIA, KLON, KLEV, KTILES, KSW,& + & PLSM, ZWNDDU, PSNS, PZ0M, & + & PAP(:,KLEV), PTL, PSOIL_TYPE, & + & PFRTI, PCVL, PCVH, KTVL, KTVH, & + & emis_mass, emis_number ,PAERFLX,ZGLON,ZGLAT& + ,ZRWPWP,ZRWSAT,ZAERMAP,PALB,PALBD,PWS1,PHSDFOR) +!write(2345,*) 'test',ptsphy, emis_mass(mode_aci)%d3(KIDIA:KFDIA,91,1),emis_number(mode_aci)%d3(KIDIA:KFDIA,91,1),PAERFLX(:,1,:) +!write(2346,*) 'test',ptsphy, emis_mass(mode_aii)%d3(KIDIA:KFDIA,91,1),emis_number(mode_aii)%d3(KIDIA:KFDIA,91,1),PAERFLX(:,1,:) +!DO JK=1,KLEV +! DO JL=KIDIA,KFDIA +! ZAEROUT5(JL,JK)=emis_mass(mode_aci)%d3(Jl,JK,1) +! END DO +!END DO +!----------------------------------------------------------------------- + +!* 3.0 PARTICULATE ORGANIC MATTER +! -------------------------------------------------------------- + + + ! mass to number conversion factors for the relevant modes + numbscale_exp = EXP(1.5*(LOG(sigma_lognormal(mode_aii)))**2) + mass2numb_fact = 3./(4.*RPI*(numbscale_exp**3)*pom_density) + mass2numb_ff_insol = mass2numb_fact/(rad_emi_ff_insol**3) + mass2numb_ene_insol = mass2numb_fact/(rad_emi_ene_insol**3) + mass2numb_ind_insol = mass2numb_fact/(rad_emi_ind_insol**3) + mass2numb_tra_insol = mass2numb_fact/(rad_emi_tra_insol**3) + mass2numb_shp_insol = mass2numb_fact/(rad_emi_shp_insol**3) + mass2numb_air_insol = mass2numb_fact/(rad_emi_air_insol**3) + mass2numb_bf_insol = mass2numb_fact/(rad_emi_bf_insol**3) + mass2numb_bb_insol = mass2numb_fact/(rad_emi_bb_insol**3) + + numbscale_exp = EXP(1.5*(LOG(sigma_lognormal(mode_ais)))**2) + mass2numb_fact = 3./(4.*RPI*(numbscale_exp**3)*pom_density) + mass2numb_ff_sol = mass2numb_fact/(rad_emi_ff_sol**3) + mass2numb_ene_sol = mass2numb_fact/(rad_emi_ene_sol**3) + mass2numb_ind_sol = mass2numb_fact/(rad_emi_ind_sol**3) + mass2numb_tra_sol = mass2numb_fact/(rad_emi_tra_sol**3) + mass2numb_shp_sol = mass2numb_fact/(rad_emi_shp_sol**3) + mass2numb_air_sol = mass2numb_fact/(rad_emi_air_sol**3) + + numbscale_exp = EXP(1.5*(LOG(sigma_lognormal(mode_acs)))**2) + mass2numb_fact = 3./(4.*RPI*(numbscale_exp**3)*pom_density) + mass2numb_bf_sol = mass2numb_fact/(rad_emi_bf_sol**3) + mass2numb_bb_sol = mass2numb_fact/(rad_emi_bb_sol**3) + mass2numb_nonbf_sol = mass2numb_ff_sol + mass2numb_nonbf_insol = mass2numb_ff_insol + + frac_bf(KIDIA:KFDIA)=1.0_JPRB + ! calculate mass fraction related to solid biofuel + where ( POMFF(KIDIA:KFDIA) > 1E-30_JPRB ) + frac_bf(KIDIA:KFDIA) = POMBF(KIDIA:KFDIA) / & + POMFF(KIDIA:KFDIA) + elsewhere + frac_bf(KIDIA:KFDIA) = 0.0_JPRB + endwhere + + ! for safety, prevent fractions larger than unity. + where (frac_bf(KIDIA:KFDIA) > 1.0_JPRB ) + frac_bf(KIDIA:KFDIA) = 1.0_JPRB + endwhere + + + ! add to emis target arrays. + ! For now treat all sectors identical, and put all emissions in lowest model layer (KLEV) + + ! Fossil fuel categories.. + DO JL=KIDIA,KFDIA + emis_mass (mode_aii)%d3(JL,KLEV,2) = & + & emis_mass (mode_aii)%d3(JL,KLEV,2) + POMFF(JL) * & + & ( (1.-frac_bf(JL)) * (1.-frac_pom_sol_ff) + & + & frac_bf(JL) * (1.-frac_pom_sol_bf) ) + + emis_number(mode_aii)%d3(JL,KLEV,2) = & + & emis_number(mode_aii)%d3(JL,KLEV,2) + POMFF(JL) * & + & ( (1.-frac_bf(JL)) * (1.-frac_pom_sol_ff) * mass2numb_nonbf_insol + & + & frac_bf(JL) * (1.-frac_pom_sol_bf) * mass2numb_bf_insol ) + + emis_mass (mode_ais)%d3(JL,KLEV,3) = & + & emis_mass (mode_ais)%d3(JL,KLEV,3) + POMFF(JL) * & + & ( (1.-frac_bf(JL)) * frac_pom_sol_ff ) + + emis_number(mode_ais)%d3(JL,KLEV,3) = & + & emis_number(mode_ais)%d3(JL,KLEV,3) + POMFF(JL) * & + & ( (1.-frac_bf(JL)) * frac_pom_sol_ff * mass2numb_nonbf_sol ) + + emis_mass (mode_acs)%d3(JL,KLEV,3) = & + & emis_mass (mode_acs)%d3(JL,KLEV,3) + POMFF(JL) * & + & ( frac_bf(JL) * frac_pom_sol_bf ) + + emis_number(mode_acs)%d3(JL,KLEV,3) = & + & emis_number(mode_acs)%d3(JL,KLEV,3) + POMFF(JL) * & + & ( frac_bf(JL) * frac_pom_sol_bf * mass2numb_bf_sol ) + ENDDO + + ! Biofuel categories ? (POMBF emissions) + +!!$ IF (.not. LAERCHEM)THEN +!!$ ! SOA from CO + DO JL=KIDIA,KFDIA + ZSOA(JL)=0._JPRB + IF (LAERSOA_CHEM) THEN + ZSOA(JL)=MAX(PSOACO(JL),PSOA(JL)) + ELSE + ZSOA(JL)=PSOACO(JL) + ENDIF + ZOMSOURC=ZOMSOURC+ZSOA(JL) + END DO + ! These do not apply for M7 +!!$ PCFLX(JL,KAERO(INBAER+1))= -ZOMSOURC * ROMPHIL +!!$ PCFLX(JL,KAERO(INBAER+2))= -ZOMSOURC * ROMPHOB +!!$ END IF + ! biomass burning + + IF (LFIRE) THEN + IF (LINJ) THEN + DO JL=KIDIA,KFDIA + ! Height of injection for biomass burning emissions : update emis_mass + IF (PINJF(JL) > 200._JPRB .AND. PBLH(JL) > 1500._JPRB) THEN + IX=MINLOC( ABS( (PAPHI(JL,1:KLEV)-PAPHI(JL,KLEV))/RG - PINJF(JL))) + ILINJ1=IX(1) + ILINJ2=ILINJ1 + ! calculate total deltap over injected levels + ZDELP=0.0_JPRB + DO JK = ILINJ1, ILINJ2 + ZDELP = ZDELP + PDELP(JL,JK) + ENDDO + DO JK = ILINJ1, ILINJ2 + + ! add to emis target arrays + emis_mass (mode_aii)%d3(JL,JK,2) = & + & emis_mass (mode_aii)%d3(JL,JK,2) + POMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & + & (1.-frac_pom_sol_bb) + + emis_number(mode_aii)%d3(JL,JK,2) = & + & emis_number(mode_aii)%d3(JL,JK,2) + POMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & + & (1.-frac_pom_sol_bb) * mass2numb_bb_insol + + emis_mass (mode_acs)%d3(JL,JK,3) = & + & emis_mass (mode_acs)%d3(JL,JK,3) + POMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & + & frac_pom_sol_bb + + emis_number(mode_acs)%d3(JL,JK,3) = & + & emis_number(mode_acs)%d3(JL,JK,3) + POMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & + & frac_pom_sol_bb * mass2numb_bb_sol + ENDDO + ELSE + ZDELP=0.0_JPRB + DO JK = KLEV-3, KLEV-2 + ZDELP = ZDELP + PDELP(JL,JK) + ENDDO + DO JK = KLEV-3, KLEV-2 + ! add to emis target arrays + emis_mass (mode_aii)%d3(JL,JK,2) = & + & emis_mass (mode_aii)%d3(JL,JK,2) + POMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & + & (1.-frac_pom_sol_bb) + + emis_number(mode_aii)%d3(JL,JK,2) = & + & emis_number(mode_aii)%d3(JL,JK,2) + POMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & + & (1.-frac_pom_sol_bb) * mass2numb_bb_insol + + emis_mass (mode_acs)%d3(JL,JK,3) = & + & emis_mass (mode_acs)%d3(JL,JK,3) + POMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & + & frac_pom_sol_bb + + emis_number(mode_acs)%d3(JL,JK,3) = & + & emis_number(mode_acs)%d3(JL,JK,3) + POMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & + & frac_pom_sol_bb * mass2numb_bb_sol + ENDDO + ENDIF + ENDDO + ELSE ! LINJ=false: always injection at lowest levels + DO JL=KIDIA,KFDIA + ZDELP=0.0_JPRB + DO JK = KLEV-2, KLEV-1 + ZDELP = ZDELP + PDELP(JL,JK) + ENDDO + DO JK = KLEV-2, KLEV + ! add to emis target arrays + emis_mass (mode_aii)%d3(JL,JK,2) = & + & emis_mass (mode_aii)%d3(JL,JK,2) + POMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & + & (1.-frac_pom_sol_bb) + + emis_number(mode_aii)%d3(JL,JK,2) = & + & emis_number(mode_aii)%d3(JL,JK,2) + POMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & + & (1.-frac_pom_sol_bb) * mass2numb_bb_insol + + emis_mass (mode_acs)%d3(JL,JK,3) = & + & emis_mass (mode_acs)%d3(JL,JK,3) + POMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & + & frac_pom_sol_bb + + emis_number(mode_acs)%d3(JL,JK,3) = & + & emis_number(mode_acs)%d3(JL,JK,3) + POMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & + & frac_pom_sol_bb * mass2numb_bb_sol + ENDDO + ENDDO + ENDIF ! LINJ + ENDIF ! LFIRE + + +!----------------------------------------------------------------------- + +!* 4.0 BLACK CARBON +! ------------ + + + + ! mass to number conversion factors for the relevant modes + numbscale_exp = EXP(1.5*(LOG(sigma_lognormal(mode_aii)))**2) + mass2numb_fact = 3./(4.*RPI*(numbscale_exp**3)*carbon_density) + mass2numb_ff_insol = mass2numb_fact/(rad_emi_ff_insol**3) + mass2numb_ene_insol = mass2numb_fact/(rad_emi_ene_insol**3) + mass2numb_ind_insol = mass2numb_fact/(rad_emi_ind_insol**3) + mass2numb_tra_insol = mass2numb_fact/(rad_emi_tra_insol**3) + mass2numb_shp_insol = mass2numb_fact/(rad_emi_shp_insol**3) + mass2numb_air_insol = mass2numb_fact/(rad_emi_air_insol**3) + mass2numb_bf_insol = mass2numb_fact/(rad_emi_bf_insol**3) + mass2numb_bb_insol = mass2numb_fact/(rad_emi_bb_insol**3) + + numbscale_exp = EXP(1.5*(LOG(sigma_lognormal(mode_ais)))**2) + mass2numb_fact = 3./(4.*RPI*(numbscale_exp**3)*carbon_density) + mass2numb_ff_sol = mass2numb_fact/(rad_emi_ff_sol**3) + mass2numb_ene_sol = mass2numb_fact/(rad_emi_ene_sol**3) + mass2numb_ind_sol = mass2numb_fact/(rad_emi_ind_sol**3) + mass2numb_tra_sol = mass2numb_fact/(rad_emi_tra_sol**3) + mass2numb_shp_sol = mass2numb_fact/(rad_emi_shp_sol**3) + mass2numb_air_sol = mass2numb_fact/(rad_emi_air_sol**3) + + numbscale_exp = EXP(1.5*(LOG(sigma_lognormal(mode_acs)))**2) + mass2numb_fact = 3./(4.*RPI*(numbscale_exp**3)*carbon_density) + mass2numb_bf_sol = mass2numb_fact/(rad_emi_bf_sol**3) + mass2numb_bb_sol = mass2numb_fact/(rad_emi_bb_sol**3) + mass2numb_nonbf_sol = mass2numb_ff_sol + mass2numb_nonbf_insol = mass2numb_ff_insol + +! frac_bf(KIDIA:KFDIA)=1.0_JPRB + ! calculate mass fraction related to solid biofuel + where ( PBCFF(KIDIA:KFDIA) > 1E-30_JPRB ) + frac_bf(KIDIA:KFDIA) = PBCBF(KIDIA:KFDIA) / & + PBCFF(KIDIA:KFDIA) + elsewhere + frac_bf(KIDIA:KFDIA) = 0.0_JPRB + endwhere + + ! for safety, prevent fractions larger than unity. + where (frac_bf(KIDIA:KFDIA) > 1.0_JPRB ) + frac_bf(KIDIA:KFDIA) = 1.0_JPRB + endwhere + + + + ! add to emis target arrays. + ! For now treat all sectors identical, and put all emissions in lowest model layer (KLEV) + + ! Fossil fuel categories.. + DO JL=KIDIA,KFDIA + emis_mass (mode_aii)%d3(JL,KLEV,1) = & + & emis_mass (mode_aii)%d3(JL,KLEV,1) + PBCFF(JL) * & + & ( (1.-frac_bf(JL)) * (1.-frac_bc_sol_ff) + & + & frac_bf(JL) * (1.-frac_bc_sol_bf) ) + + emis_number(mode_aii)%d3(JL,KLEV,1) = & + & emis_number(mode_aii)%d3(JL,KLEV,1) + PBCFF(JL) * & + & ( (1.-frac_bf(JL)) * (1.-frac_bc_sol_ff) * mass2numb_nonbf_insol + & + & frac_bf(JL) * (1.-frac_bc_sol_bf) * mass2numb_bf_insol ) + + emis_mass (mode_ais)%d3(JL,KLEV,2) = & + & emis_mass (mode_ais)%d3(JL,KLEV,2) + PBCFF(JL) * & + & ( (1.-frac_bf(JL)) * frac_bc_sol_ff ) + + emis_number(mode_ais)%d3(JL,KLEV,2) = & + & emis_number(mode_ais)%d3(JL,KLEV,2) + PBCFF(JL) * & + & ( (1.-frac_bf(JL)) * frac_bc_sol_ff * mass2numb_nonbf_sol ) + + emis_mass (mode_acs)%d3(JL,KLEV,2) = & + & emis_mass (mode_acs)%d3(JL,KLEV,2) + PBCFF(JL) * & + & ( frac_bf(JL) * frac_bc_sol_bf ) + + emis_number(mode_acs)%d3(JL,KLEV,2) = & + & emis_number(mode_acs)%d3(JL,KLEV,2) + PBCFF(JL) * & + & ( frac_bf(JL) * frac_bc_sol_bf * mass2numb_bf_sol ) + ENDDO + + ! Biofuel categories ? (PBCBF emissions - currently not treated..) + + + ! biomass burning + + IF (LFIRE) THEN + IF (LINJ) THEN + DO JL=KIDIA,KFDIA + ! Height of injection for biomass burning emissions : update emis_mass + + IF (PINJF(JL) > 200._JPRB .AND. PBLH(JL) > 1500._JPRB) THEN + IX=MINLOC( ABS( (PAPHI(JL,1:KLEV)-PAPHI(JL,KLEV))/RG - PINJF(JL))) + ILINJ1=IX(1) + ILINJ2=ILINJ1 + ! calculate total deltap over injected levels + ZDELP=0.0_JPRB + DO JK = ILINJ1, ILINJ2 + ZDELP = ZDELP + PDELP(JL,JK) + ENDDO + DO JK = ILINJ1, ILINJ2 + + ! add to emis target arrays + emis_mass (mode_aii)%d3(JL,JK,1) = & + & emis_mass (mode_aii)%d3(JL,JK,1) + PBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & + & (1.-frac_bc_sol_bb) + + emis_number(mode_aii)%d3(JL,JK,1) = & + & emis_number(mode_aii)%d3(JL,JK,1) + PBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & + & (1.-frac_bc_sol_bb) * mass2numb_bb_insol + + emis_mass (mode_acs)%d3(JL,JK,2) = & + & emis_mass (mode_acs)%d3(JL,JK,2) + PBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & + & frac_bc_sol_bb + + emis_number(mode_acs)%d3(JL,JK,2) = & + & emis_number(mode_acs)%d3(JL,JK,2) + PBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & + & frac_bc_sol_bb * mass2numb_bb_sol + ENDDO + ELSE + ZDELP=0.0_JPRB + DO JK = KLEV-3, KLEV-2 + ZDELP = ZDELP + PDELP(JL,JK) + ENDDO + DO JK = KLEV-3, KLEV-2 + ! add to emis target arrays + emis_mass (mode_aii)%d3(JL,JK,1) = & + & emis_mass (mode_aii)%d3(JL,JK,1) + PBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & + & (1.-frac_bc_sol_bb) + + emis_number(mode_aii)%d3(JL,JK,1) = & + & emis_number(mode_aii)%d3(JL,JK,1) + PBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & + & (1.-frac_bc_sol_bb) * mass2numb_bb_insol + + emis_mass (mode_acs)%d3(JL,JK,2) = & + & emis_mass (mode_acs)%d3(JL,JK,2) + PBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & + & frac_bc_sol_bb + + emis_number(mode_acs)%d3(JL,JK,2) = & + & emis_number(mode_acs)%d3(JL,JK,2) + PBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & + & frac_bc_sol_bb * mass2numb_bb_sol + ENDDO + ENDIF + ENDDO + ELSE ! LINJ=false: always injection at lowest levels + DO JL=KIDIA,KFDIA + ZDELP=0.0_JPRB + DO JK = KLEV-2, KLEV-1 + ZDELP = ZDELP + PDELP(JL,JK) + ENDDO + DO JK = KLEV-2, KLEV + ! add to emis target arrays + emis_mass (mode_aii)%d3(JL,JK,1) = & + & emis_mass (mode_aii)%d3(JL,JK,1) + PBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & + & (1.-frac_bc_sol_bb) + + emis_number(mode_aii)%d3(JL,JK,1) = & + & emis_number(mode_aii)%d3(JL,JK,1) + PBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & + & (1.-frac_bc_sol_bb) * mass2numb_bb_insol + + emis_mass (mode_acs)%d3(JL,JK,2) = & + & emis_mass (mode_acs)%d3(JL,JK,2) + PBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & + & frac_bc_sol_bb + + emis_number(mode_acs)%d3(JL,JK,2) = & + & emis_number(mode_acs)%d3(JL,JK,2) + PBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & + & frac_bc_sol_bb * mass2numb_bb_sol + ENDDO + ENDDO + ENDIF ! LINJ + ENDIF ! LFIRE + + + + +!----------------------------------------------------------------------- + +!* 5.0 Convert emissions into tendencies: loop over tracers in mode +! ------------ + + DO IMODE=1,NMOD + DO INMODE=0,MODE_NM_SED(IMODE) + JN = MODE_TRACERS_SED(INMODE,IMODE) + if (JN==ino3_a.or.JN==inh4.or.JN==imsa) then + emit(KIDIA:KFDIA,:) = 0.0 + else if(inmode == 0) then + emit(KIDIA:KFDIA,:) = 0.0 + do ii=1,mode_nm(IMODE) ! add up all number emissions in the mode 'imode'... + emit(KIDIA:KFDIA,:) = emit(KIDIA:KFDIA,:) + emis_number(IMODE)%d3(KIDIA:KFDIA,:,ii) + enddo + else ! this is a 'mass' emission with index nmode + emit(KIDIA:KFDIA,:) = emis_mass(IMODE)%d3(KIDIA:KFDIA,:,inmode) + endif + ! Change units from kg/m2/sec to kg/kg/sec and update tendency.. + DO JL=KIDIA,KFDIA + ! Should limit to troposphere?! (for now sfc only) + !JK=91 + !if (JN==iduai)then + ! write(2020,*)jk,emit(jl,jk) + !end if + !if (JN==iaii_n)then + ! write(2020,*)jk,emit(jl,jk) + !end if + !write(2929,*)JN,KAERO(JN) + PEMIDIAG(JL,KAERO(JN))=PEMIDIAG(JL,JN)+sum(emit(JL,:)) + DO JK=1,KLEV + !PCFLX(JL,KAERO(JN))=PCFLX(JL,KAERO(JN))+emit(JL,JK) + + PTENC(JL,JK,KAERO(JN))=PTENC(JL,JK,KAERO(JN))+emit(JL,JK) * RG /PDELP(JL,JK) + ENDDO + + ENDDO + ENDDO + ENDDO +! write(9292,*)PSO2SRC(JL,JK),PSO4SRC(JL,JK) + IF (.not. LAERCHEM) THEN + DO JL=KIDIA,KFDIA + DO JK=1,KLEV + DO JGAS=1,2 + IF (TRIM(YAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))%CNAME)=='SO2') THEN + ISSO2=ind_oifs_ham%ind_gas_OIFS(JGAS) + !write(9292,*)ISSO2,PSO2SRC(JL,JK) + PTENC(JL,JK,KAERO(ISSO2))=PTENC(JL,JK,KAERO(ISSO2))+ PSO2SRC(JL,JK) + !PCFLX(JL,KAERO(ISSO2))=PCFLX(JL,KAERO(ISSO2)) + PSO2SRC(JL,JK) + PEMIDIAG(JL,KAERO(ISSO2))=PEMIDIAG(JL,KAERO(ISSO2))+ PSO2SRC(JL,JK) + ELSE IF (TRIM(YAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))%CNAME)=='SO4_gas') THEN + ISSO4=ind_oifs_ham%ind_gas_OIFS(JGAS) + !write(9292,*)ISSO4, PSO4SRC(JL,JK) + PTENC(JL,JK,KAERO(ISSO4))=PTENC(JL,JK,KAERO(ISSO4))+ PSO4SRC(JL,JK) + !PCFLX(JL,KAERO(ISSO4))=PCFLX(JL,KAERO(ISSO4)) + PSO4SRC(JL,JK) + PEMIDIAG(JL,KAERO(ISSO4))=PEMIDIAG(JL,KAERO(ISSO4)) + PSO4SRC(JL,JK) + END IF + END DO + END DO + + + ! For add SOA from CO into ISVOC tracer +!!$ DO JGAS=1,NACTAERO +!!$ IF (TRIM(YAERO(JGAS)%CNAME)=='ISVOC') THEN +!!$ +!!$ PTENC(JL,JK,KAERO(JGAS))=PTENC(JL,JK,KAERO(JGAS))+ PSOACO(JL) +!!$ PEMIDIAG(JL,KAERO(JGAS))=PEMIDIAG(JL,KAERO(JGAS)) + PSOACO(JL) +!!$ END IF +!!$ END DO + + END DO + END IF +! PGFL(KIDIA:KFDIA,:,YAEROUT(5)%MP)=ZAEROUT5(KIDIA:KFDIA,:) + +!----------------------------------------------------------------------- + +!* 6.0 De-allocate arrays +! ------------ + + +DO IMODE=1,NMOD + DEALLOCATE(EMIS_NUMBER(IMODE)%d3) + DEALLOCATE(EMIS_MASS(IMODE)%d3) +ENDDO + +END ASSOCIATE +END ASSOCIATE +IF (LHOOK) CALL DR_HOOK('TM5M7_SRC',1,ZHOOK_HANDLE) +END SUBROUTINE TM5M7_SRC + diff --git a/ifs-source/arpifs/phys_ec/tm5m7_src_dust.F90 b/ifs-source/arpifs/phys_ec/tm5m7_src_dust.F90 new file mode 100644 index 00000000..464a9945 --- /dev/null +++ b/ifs-source/arpifs/phys_ec/tm5m7_src_dust.F90 @@ -0,0 +1,1445 @@ +SUBROUTINE TM5M7_SRC_DUST & + &( YDMODEL, KIDIA, KFDIA, KLON, KLEV, KTILES, KSW,& + & PLSM , PWIND, PSNS, PZ0M, & +! Required as input fields... + & SP, PTL, & + & Psoil_type, & + & PFRTI, PCVL, PCVH, KTVL, KTVH, & +! + & emis_mass, emis_number ,PAERFLX,PGLON,& + PGLAT,PRWPWP,PRWSAT,PAERMAP,PALB,PALBD,PWS1,PHSDFOR) + +!*** * TM5M7_SRC_DUST* - SOURCE TERMS FOR DUST AEROSOLS +! +! Online dust emissions based on Tegen/Vignati/Strunk +! --------------------------------------------------- +! +! Please read the section above for background information about the underlying +! approach. An improved and modified online implementation has been accomplished +! from which. It can be activated by setting +! +! input.emis.dust : ONLINE +! +! in the rc-file. An additional netcdf file is needed for some input parameters. +! The path to which needs to be defined in the key +! +! input.emis.dust.dir : /ms_perm/TM/TM5/emissions/other/Dust_online/onlinedust.nc +! +! For every time step there will be particles emitted, scaled to monthly +! amounts (both mass and numbers) in order to keep compliance with assumptions +! about the aerosol emissions in sedimentation.F90. +! +! +!** INTERFACE. +! ---------- +! *TM5M7_SRC_DUST* IS CALLED FROM *TM5M7_SRC*. + +! AUTHOR. +! ------- +! +! T. van Noije et al. (?) +! +! SOURCE. +! ------- +! +! MODIFICATIONS. +! -------------- +! +! Nov 2011 - Achim Strunk - v0 +! +! xxxx - ?? +! +! Sep 2020 - V. Huijnen: first (partial) introduction into OpenIFS +!----------------------------------------------------------------------- +USE TYPE_MODEL, ONLY MODEL +USE YOMLUN, ONLY : NULOUT +USE PARKIND1 ,ONLY : JPIM ,JPRB +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK + +USE YOMCST, ONLY : RPI +USE TM5M7_DATA, ONLY: NMOD, MODE_ACI, MODE_COI, sigma, sigma_lognormal, ddust,iacci,icoai +USE TM5M7_EMIS_DATA, ONLY : MODAL_EMISSIONS, & + & nclass, nmode,nbin, nats,solspe, nsoilph, nfpar, NTRACED, & + & umin, z0_min, lai_lim,lai_lim2, ROA, & + & U1FAC,cd, min_ai,max_ai,min_ci,max_ci,& + & vkarman,zz,airfac, DMIN,DMAX,DSTEP, & + & UTH,SREL,SRELV,SU_SRELV, & + & ratio_coa,ratio_acc,denom_acc_inv,denom_coa_inv, & + & mf_coa_r12_inv,mf_acc_r12_inv, & + & mmr_ai,mmr_ci +!AER +!USE GEOMETRY_MOD , ONLY : GEOMETRY +!USE YOEAERATM ,ONLY : YREAERATM +!USE YOEAERMAP ,ONLY : YREAERMAP +!USE YOEAERSRC ,ONLY : YREAERSRC +!USE YOEAERVOL ,ONLY : YREAERVOL +!USE YOEAERSNK, ONLY : YREAERSNK +!USE YOMRIP ,ONLY : YRRIP +!USE YOEPHY ,ONLY : YREPHY +!USE YOMCT3 , ONLY : NSTEP + +IMPLICIT NONE + +!----------------------------------------------------------------------- + +!* 0.1 ARGUMENTS +! --------- + +TYPE(MODEL) ,INTENT(IN) :: YDMODEL +INTEGER(KIND=JPIM),INTENT(IN) :: KLON +INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA +INTEGER(KIND=JPIM),INTENT(IN) :: KFDIA +INTEGER(KIND=JPIM),INTENT(IN) :: KLEV +INTEGER(KIND=JPIM),INTENT(IN) :: KTILES + + +REAL(KIND=JPRB) ,INTENT(IN) :: PLSM(KLON) +REAL(KIND=JPRB) ,INTENT(IN) :: PWIND(KLON) ! 10m wind speed, see tm5m7_src.F90 +REAL(KIND=JPRB) ,INTENT(IN) :: PSNS(KLON) ! Snow depth +REAL(KIND=JPRB) ,INTENT(IN) :: PZ0M(KLON) ! Roughness length [m] +REAL(KIND=JPRB) ,INTENT(IN) :: SP(KLON) ! Surface pressure +REAL(KIND=JPRB) ,INTENT(IN) :: PTL(KLON) ! surface temperature +REAL(KIND=JPRB) ,INTENT(IN) :: PSOIL_TYPE(KLON) +! REAL(KIND=JPRB) ,INTENT(IN) :: POT_SOURCE(KLON),CULT(KLON) +! REAL(KIND=JPRB) ,INTENT(IN) :: SOILPH(KLON,NSOILPH) +! REALD(KIND=JPRB) ,INTENT(IN) :: FPAR(KLON,NFPAR) +REAL(KIND=JPRB) ,INTENT(IN) :: PFRTI(KLON,KTILES) ! Tile fraction (0-1) +! 1 : Water 5 : Snow on low-veg + bare-soil +! 2 : Ice 6 : Dry snow-free high veg +! 3 : Wet skin 7 : snow under high-veg +! 4 : Dry snow-free low-veg 8 : bare soil +REAL(KIND=JPRB) , INTENT(IN) :: PCVL(KLON), PCVH(KLON) ! Low/High vegetation cover +INTEGER(KIND=JPIM), INTENT(IN) :: KTVL(KLON), KTVH(KLON) ! Low/High vegetation type +REAL(KIND=JPRB) ,INTENT(INOUT) :: PAERFLX(KLON,12,9) + +TYPE(MODAL_EMISSIONS),INTENT(INOUT) :: emis_mass(NMOD) +TYPE(MODAL_EMISSIONS),INTENT(INOUT) :: emis_number(NMOD) +INTEGER(KIND=JPIM),INTENT(IN) :: KSW +REAL(KIND=JPRB) ,INTENT(INOUT) :: PRWPWP,PRWSAT,PAERMAP(KLON,5) +REAL(KIND=JPRB) ,INTENT(IN) :: PALB(KLON),PWS1(KLON),PHSDFOR(KLON),PGLON(KLON),PGLAT(KLON), PALBD(KLON,KSW) +!* 0.5 LOCAL VARIABLES +! --------------- + +INTEGER(KIND=JPIM) :: JL, IVEG, I_S1,I_S11, ID,JK,JAER, INBAER +INTEGER(KIND=JPIM) :: IDUST,KK,KKK,KFIRST,KKMIN,NN +REAL(KIND=JPRB) :: NORM, XSEA, AREA_FRAC, TT, T_SCALE, DENS, RG1, RG2 ,FDP1,FDP2 +REAL(KIND=JPRB) :: VEGET,LAI_MAX,LAI_AVG, LAI_CUR,z0s,dpd,uthp,flux_diam,cultfac1 +REAL(KIND=JPRB) :: AAA,BB, CCC, AEFF,FF, XEFF, feff, DBSTART, USTAR, rho_air +REAL(KIND=JPRB) :: DLAST,DP +REAL(KIND=JPRB) :: AIRDENS_RATIO,AIRDENS_RATIO2 +REAL(KIND=JPRB) :: FLUX_R1,FLUX_R2 +REAL(KIND=JPRB) :: EMIS_FAC(KLON) +REAL(KIND=JPRB) :: NUMBER(KLON), MASS(KLON) +REAL(KIND=JPRB) :: SNOWCOVER(KLON), DESERT(KLON) +REAL(KIND=JPRB) :: LAI_EFF(KLON),UMIN2(KLON), ALPHA(KLON), C_EFF(KLON) +REAL(KIND=JPRB) :: Z0(KLON) ! Local copy of roughness length +REAL(KIND=JPRB) :: SOIL_TYPE(KLON) ! Local copy of soil type + +REAL(KIND=JPRB) :: FLUX_AI(KLON), FLUX_CI(KLON),FNUM_AI(KLON),FNUM_CI(KLON) +REAL(KIND=JPRB) :: FLUXTOT(NTRACED),FDUST(NTRACED) +REAL(KIND=JPRB) :: FLUXTYP(NCLASS) +REAL(KIND=JPRB) :: ZDEPTILE +REAL(KIND=JPRB) :: TV_DAT(20) ! Local grid box fractions (0-1) for each of presumeably 20 IFS vegetation types + +!!! AER +REAL(KIND=JPRB) :: ZGLAT(KLON), ZGLON(KLON),ZLAT,ZLON,ZLONE,ZLONW,ZINCLAT,IFF,ITYPDU +REAL(KIND=JPRB) :: ZHDD, ZHSS +REAL(KIND=JPRB) :: ZDETAH(KLON,KLEV), ZETA(KLON,KLEV) , ZETAH(KLON,0:KLEV) +!REAL(KIND=JPRB) :: ZQSAT(KLON,KLEV) , ZRHCL(KLON,KLEV), ZTH(KLON,0:KLEV) +!-- various alternate sources can be tested +REAL(KIND=JPRB) :: ZFLX_SDUST(KLON,9,12), ZFLX_SSALT(KLON,9,3) +!REAL(KIND=JPRB) :: ZLOCALTIM , ZDIURN(KLON) +REAL(KIND=JPRB) :: ZSCC2(KLON) , ZDEP2(KLON) , ZLTS2(KLON), ZLTSMIN(KLON), ZLTSMAX(KLON) +REAL(KIND=JPRB) :: ZWNDDU(KLON), ZWNDSS(KLON), ZWND3(KLON) +REAL(KIND=JPRB) :: ZDUEMPOT(KLON,3) +REAL(KIND=JPRB) :: ZDEGRAD , ZFSWET , ZSWETN, ZSWETN2 +REAL(KIND=JPRB) :: ZRWPWP , ZRWSAT , ZSO2MSS +REAL(KIND=JPRB) :: ZEPSISS, ZEPSIDD, ZEPSIRA, ZEPSSNO, ZEPSARE +REAL(KIND=JPRB) :: ZBNDA, ZBNDB, ZBNDC, ZBNDD, ZBNDE, ZBNDF, ZBNDG, ZBNDH, ZBNDI +REAL(KIND=JPRB) :: ZBNDJ, ZBNDK, ZBNDL, ZBNDM +REAL(KIND=JPRB) :: ZREFRAD, ZREFSPD, ZRADREF,ZLONGB +LOGICAL :: LLDUST(KLON,12), LLPDUSTS(KLON) +!REAL(KIND=JPRB) :: ZFLX_SDUST(KLON,9,12) +INTEGER(KIND=JPIM)::KBINDD + +REAL(KIND=JPRB) :: ZHOOK_HANDLE +!----------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('TM5M7_SRC_DUST',0,ZHOOK_HANDLE) + + + + + ASSOCIATE( YDEPHY=>YDMODEL%YRML_PHY_EC%YREPHY, & + & YDEAERMAP=>YDMODEL%YRML_PHY_AER%YREAERMAP, & + & YGFL=>YDMODEL%YRML_GCONF%YGFL, & + & YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO, & + & YDEAERSRC=>YDMODEL%YRML_PHY_AER%YREAERSRC, & + & YDEAERSNK=>YDMODEL%YRML_PHY_AER%YREAERSNK, & + & YDEAERATM=>YDMODEL%YRML_PHY_RAD%YREAERATM, & + & YDRIP=>YDMODEL%YRML_GCONF%YRRIP) + +ASSOCIATE(RSSFLX=>YDEAERSRC%RSSFLX) + +ASSOCIATE( NDUSRCP=>YDEAERMAP%NDUSRCP, RDDUAER=>YDEAERMAP%RDDUAER, & + & RDUSRCP=>YDEAERMAP%RDUSRCP, & + & RRHO_DD=>YDEAERSNK%RRHO_DD, & + & NAERWND=>YDEAERSRC%NAERWND, & + & NDDUST=>YDEAERSRC%NDDUST, NDMSO=>YDEAERSRC%NDMSO, NSSALT=>YDEAERSRC%NSSALT, & + & NTYPAER=>YDEAERSRC%NTYPAER, RAERDUB=>YDEAERSRC%RAERDUB, & + & RBCPHIL=>YDEAERSRC%RBCPHIL, RBCPHOB=>YDEAERSRC%RBCPHOB, & + & RCODECA=>YDEAERSRC%RCODECA, RCOVSRA=>YDEAERSRC%RCOVSRA, & + & RDDUSRC=>YDEAERSRC%RDDUSRC, RDMSMIN=>YDEAERSRC%RDMSMIN, & + & RFCTSS=>YDEAERSRC%RFCTSS, ROMPHIL=>YDEAERSRC%ROMPHIL, & + & ROMPHOB=>YDEAERSRC%ROMPHOB, RSIDECA=>YDEAERSRC%RSIDECA, & + & RSIVSRA=>YDEAERSRC%RSIVSRA, & + & LE4ALB=>YDEPHY%LE4ALB, LVDFTRAC=>YDEPHY%LVDFTRAC, YSURF=>YDEPHY%YSURF)!, & + !& NLOENG=>YDGEOMETRY%YRGEM%NLOENG, & + !& NGLOBALAT=>YDGEOMETRY%YRMP%NGLOBALAT, & + !& NSTASS=>YRRIP%NSTASS, RHGMT=>YRRIP%RHGMT, RSTATI=>YRRIP%RSTATI,& + !& NCHEM=>YGFL%NCHEM, YCHEM=>YGFL%YCHEM, LAERSOA_CHEM=>YREAERATM%LAERSOA_CHEM, & + !& LAERCHEM=>YGFL%LAERCHEM) + + +! ifs vegetation +! +!1) L ! Crops, Mixed Farming +!2) L ! Short Grass +!3) H ! Evergreen Needleleaf Trees +!4) H ! Deciduous Needleleaf Trees +!5) H ! Deciduous Broadleaf Trees +!6) H ! Evergreen Broadleaf Trees +!7) L ! Tall Grass +!8) ! Desert +!9) L ! Tundra +!10) L ! Irrigated Crops +!11) L ! Semidesert +!12) ! Ice Caps and Glaciers +!13) L ! Bogs and Marshes +!14) ! Inland Water +!15) ! Ocean +!16) L ! Evergreen Shrubs +!17) L ! Deciduous Shrubs +!18) H ! Mixed Forest/woodland +!19) H ! Interrupted Forest +!20) L ! Water and Land Mixtures + +if (NDDUST==4)then +! Make local copy: +SOIL_TYPE(KIDIA:KFDIA)=PSOIL_TYPE(KIDIA:KFDIA) +! init +xeff=10.0_JPRB +aeff=0.35_JPRB +! Ensure initialization is done elsewhere (tm5m7_init.F90) +! Also - are necessary input data available.. (soil type, ...) + + + ! ideally only once per day .. not yet possible +!VH IF( newday ) THEN + + ! calculation of snow cover from snow dept + ! Tegen et al. fraction (0-1) + snowcover(KIDIA:KFDIA) = PSNS(KIDIA:KFDIA) / 0.015 + WHERE( snowcover(KIDIA:KFDIA) > 1. ) snowcover(KIDIA:KFDIA) = 1. + + !--------------------------------------------------------------------------------------- + ! Prepare the flux calculation + !--------------------------------------------------------------------------------------- + ! + ! Calculations done on monthly fields + + ! default: no dust source due to + ! - vegetation + ! - not a desert pixel or + ! - no pure land grid cell + lai_eff(KIDIA:KFDIA) = 0. + + ! per grid box + DO JL=KIDIA,KFDIA + + TV_DAT(:)=0. ! Fraction IFS land type in grid cell, between 0-1 + ! VH identify dominant ifs land use type. + DO ID=1,KTILES + ZDEPTILE=PFRTI(JL,ID) + IF (ZDEPTILE < 0.01) CYCLE !skip if not contributing + SELECT CASE(ID) + CASE(1) ! Water + TV_DAT(15)=TV_DAT(15)+ZDEPTILE + ! TV_DAT(14)=ZDEPTILE (alternative: inland water?) + CASE(2) ! ICE + TV_DAT(12)=TV_DAT(12)+ZDEPTILE + CASE(3) ! wet skin + IF (PCVL(JL) + PCVH(JL) < 0.5) THEN + TV_DAT(8)=TV_DAT(8)+ZDEPTILE + ELSE + TV_DAT(KTVL(JL))=TV_DAT(KTVL(JL))+PCVL(JL) + TV_DAT(KTVH(JL))=TV_DAT(KTVH(JL))+PCVH(JL) + ENDIF + CASE(4,5) ! Low veg, with/without snow + TV_DAT(KTVL(JL))=TV_DAT(KTVL(JL))+ZDEPTILE ! make sure to filter out snow-events below + CASE(6,7) ! high veg, with/without snow + TV_DAT(KTVH(JL))=TV_DAT(KTVL(JL))+ZDEPTILE ! make sure to filter out snow-events below + CASE(8) ! Bare soil + TV_DAT(8)= TV_DAT(8)+ZDEPTILE + END SELECT + ENDDO + + + !--------------------------------------------------------------------------------------- + ! Selection of potential dust sources areas + !--------------------------------------------------------------------------------------- + ! Preferential Sources = Potential lakes + + !>>> TvN + ! If monthly surface roughness is not available + ! use the annual mean value, if available. + ! Since the annual mean is calculated + ! based on all available months, + ! it has a much better spatial coverage + ! than the individual months. + ! VH IF( PZ0M(JL) <= 0. .AND. Pz0M(JL) > 0. ) THEN + ! VH z0(JL) = Pz0M(JL) + ! VH ENDIF + !<<< TvN + +!VH - for now neglect this 'pot_source' input. Can we use ECMWF quantities? +!VH IF( pot_source(JL) > 0.5 ) THEN +!VH ! if the potential lake area is > 50%, it is a pot. lake grid +!VH soil_type(JL) = 10. + !>>> TvN + ! Use minimum value for roughness length. + ! Since there are only few potential source areas + ! where the annual mean is not available, + ! this will only have a limited impact. + !IF( z0(JL,idate(2)) <= 0. ) z0(JL,idate(2)) = 0.001 !! if z0 is not valid or missing (cm), PhD thesis Marticorena p.85 +!VH IF( PZ0M(JL) <= 0. ) z0(JL) = z0_min +!VH !<<< TvN +!VH END IF + + !--------------------------------------------------------------------------------------- + ! Calculation of the ratio: horizontal/vertical flux (alpha) + !--------------------------------------------------------------------------------------- + !--------------------------------------------------------------------------------------- + ! Test on the vegetation type + !--------------------------------------------------------------------------------------- + ! When cult=0, the cultivation field info is not used. Otherwise: cult(JL)=3 +!!$ cult(JL) = 0. + +!VH desert(JL) = soilph(JL,3) + soilph(JL,4) +!VH is this good enough?? + desert(JL)=TV_DAT(8)+TV_DAT(11) + veget=0. + veget = veget + PFRTI(JL,4)+PFRTI(JL,6)+PFRTI(JL,7) ! dry low veg + dry high veg + snow under high veg + + ! default: no dust emissions + idust = 0 + ! dust emissions only when + ! 1) there is only land (almost) + ! 2) 'desert' is positive or vegetation active + IF( PLSM(JL) >= 0.99 .AND. (desert(JL) > 0.001 .OR. veget > TINY(veget)) ) & + idust = 1 + + ! here is dust uptake possible + IF( idust == 1 ) THEN + !--------------------------------------------------------------------------------------- + !-- Calculate effective surface for fpar < lai_lim (as proxy for + !-- veg. cover), shrubby vegetation is determined by max + !-- annual fpar, grassy by monthly fpar (Tegen et al.2002) + !--------------------------------------------------------------------------------------- + + ! so we start with no vegetation --> full area available + lai_eff(JL) = 1. + + !VH consider alternative computation for lai_eff, without use of fpar, but use of PCVH/PCVL or so. + !VH !-- get max/mean fpar of the full year --> needed for shrub land + !VH lai_max = MAXVAL(fpar(JL,1:12)) + !VH lai_avg = SUM(fpar(JL,1:12)) / 12. + !VH lai_cur = fpar(JL,idate(2)) +!VH +!VH +!VH ! --------------------------------------------- +!VH ! 3 classes: grass, shrub, mixed{grass,shrub} +!VH ! --------------------------------------------- +!VH +!VH ! first: grass dominated (tv(2) and tv(7)) +!VH ! current fpar determines available area +!VH !VH IF( (tv_dat(iglbsfc,2)%data(JL,1) + tv_dat(iglbsfc,7)%data(JL,1)) > 50 ) THEN +!VH !VH: over 50% tile fraction is low veg, with dominant veg type being agricultural land or range land: +!VH IF ((TV_DAT(2) + TV_DAT(7)) > 0.5 ) THEN +!VH +!VH lai_eff (JL) = 1. - lai_cur / lai_lim +!VH +!VH ! second: shrub dominated (tv(16) and tv(17)) +!VH ! if max(fpar) > 0.25 --> no dust +!VH ! else max(fpar) determines area +!VH ELSEIF( (tv_dat(16) + tv_dat(17)) > 0.5 ) THEN +!VH +!VH ! lai_eff is zero for lai_max > lai_min and +!VH ! [0,1] for lai_max < lai_lim +!VH lai_eff (JL) = 1. - lai_max / lai_lim +!VH +!VH ! third: mixtures of grass and shrub land +!VH ! if mean(fpar) > 0.5 --> shrub dominated --> use max(fpar) for scaling +!VH ! else grass dominated --> use current(fpar) for scaling +!VH ELSE +!VH +!VH IF( lai_avg > lai_lim2 ) THEN +!VH lai_eff (JL) = 1. - lai_max / lai_lim +!VH ELSE +!VH lai_eff (JL) = 1. - lai_cur / lai_lim +!VH END IF +!VH +!VH END IF + + ! limit to valid range [0,1] + lai_eff(JL) = MAX( 0., MIN( 1., lai_eff(JL) ) ) + + +!!$ ............... !!!!hier ist das AND falsch!!!! .................. +!!$ DO month = 1, 12 +!!$ IF( ( tv_dat(JL,16) > 50 ) .OR. ( tv_dat(JL,17) > 50 ) .AND. ( lai_flag == 0 ) ) then +!!$ lai_eff(JL,month) = 1. - fpar(JL,month) / lai_lim !lai_lim=0.25 +!!$ ELSEIF( ( tv_dat(JL, 2) > 50 ) .OR. ( tv_dat(JL, 7) > 50 ) .OR. ( desert(JL) > 0.) ) then +!!$ lai_eff(JL,month) = 1. - fpar(JL,month) / lai_lim !lai_lim=0.25 +!!$ ELSE +!!$ lai_eff(JL,month) = 1. - lai_max / lai_lim !shrubs=1 +!!$ END IF +!!$ ! original formulation +!!$ ! lai_eff(j,i,1,month)=1.-(lai(j,i,1,month) & +!!$ ! *(1.-shrub(int(sp(j,i,1,5)))) & +!!$ ! +lai_max*shrub(int(sp(j,i,1,5))) & +!!$ ! )*1./lai_lim +!!$ IF( lai_eff(JL,month) <= 0 ) lai_eff(JL,month) = 0 +!!$ IF( lai_eff(JL,month) > 1 ) lai_eff(JL,month) = 1 +!!$ END DO !month + + END IF ! if idust=1 + + ! print *, 'lai_eff=1 everywhere' + !--------------------------------------------------------------------------------------- + ! Lowering the threshold friction velocity depending on the presence of cultivations + !--------------------------------------------------------------------------------------- + ! Factors according to dsf increase seen in data ** + !--------------------------------------------------------------------------------------- + umin2(JL) = umin + ! + !--------------------------------------------------------------------------------------- +!VH IF( cult(JL) <= 0.5 .AND. cult(JL) > 0.08 ) THEN +!VH IF( desert(JL) > 0. .OR. tv_dat(16) > 0.5 .OR. tv_dat(17) > 0.5 ) & +!VH umin2(JL) = umin * 0.93 +!VH ! +!VH !--------------------------------------------------------------------------------------- +!VH IF( tv_dat(2) > 0.5 .OR. tv_dat(7) > 0.5 ) & +!VH umin2(JL) = umin * 0.99 +!VH END IF !cult=2 +!VH +!VH ! +!VH !--------------------------------------------------------------------------------------- +!VH IF( cult(JL) > 0.5 ) THEN +!VH IF( ( desert(JL) > 0 ) .OR. ( tv_dat(16) > 0.5 ) .OR. ( tv_dat(17) > 0.5 ) ) & +!VH umin2(JL) = umin * 0.73 +!VH END IF !cult=1 + + !--------------------------------------------------------------------------------------- + ! Daily z0 and efficient fraction feff + !--------------------------------------------------------------------------------------- + + i_s1 = INT( soil_type(JL) ) ! soil type index for the calcl. of horiz. dust flux + IF( i_s1 == 0 ) i_s1 = 9 ! set it the same as ice if the soil type is not defined + PAERFLX(JL,3,2)=i_s1 + ! Roughness length [cm] of the surface without obstacles, i.e. of the smooth surface: + Z0S = 0.001 !! en cm, these Marticorena p.85 ! optimum value for the calculation of energy loss + + + ! Soil-type dependent saltation efficiency, + ! i.e. the ratio between vertical and horizontal fluxes, + ! (see Eq. (42) in MB95; Eq. (3) in Heinold et al.): + !write(5545,*)solspe(i_s1,nmode*3+1),i_s1,nmode*3+1,nmode + !write(5546,*)i_s1,solspe(i_s1,:) + + alpha(JL) = solspe(i_s1,nmode*3+1) + PAERFLX(JL,3,4)=alpha(JL) !=2 on land + + ! for now moist is not included but when it is done then: + + !--------------------------------------------------------------------------------------- + ! Calculation of the threshold soil moisture (w') [Fecan, F. et al., 1999] + !--------------------------------------------------------------------------------------- + ! when moist is included !!!!!!!!!!!!!!!!!! + ! w_str(j,i,1) = 0.0014*(solspe(i_s1,nmode*3)*100)**2 + 0.17*(solspe(i_s1,nmode*3)*100) + ! W0 = 0.99 ! used by Bernd solspe(i_s1,nmode*3+2) + feff = 0. + ! * partition of energy between the surface and the elements of rugosity * + ! these pp 111-112 + + IF( PZ0M(JL ) <= 0. ) THEN ! if there are no info on z0 and no potential sources + z0(JL) = 1. ! then z0 is set to 1 and no dust can be produced + feff = 0. + ELSE + !>>> TvN + ! Use minimum value for roughness length. + ! VH convert PZ0M from [m] to [cm] + !z0(JL) = z0_min !max(z0_min,PZ0M(JL)*100._JPRB ) + z0(JL) = max(z0_min,PZ0M(JL)*100._JPRB ) + !write(3000,*)z0(JL),z0_min + !<<< TvN + ! Eq. (20) in MB95: + AAA = LOG( z0(JL) / Z0S ) + BB = LOG( aeff * (xeff / Z0S)**0.8) + !write(5547,*)aeff,xeff,z0s + CCC = 1. - AAA/BB + ! * partition between Z01 and Z02 * which are z0 of larger stone which cannot be mobilized + FF = 1. ! we do not separate roughness length between soil which + ! gives dust and solid material which is not mobilised + ! total efficient friction velocity ratio: + feff = FF * CCC + PAERFLX(JL,3,5)=feff + PAERFLX(JL,4,1)=AAA + PAERFLX(JL,4,2)=BB + PAERFLX(JL,4,3)=CCC + + ! restrict to [0,1] + feff = MIN( 1., feff ) + feff = MAX( 0., feff ) + !write(3001,*)feff + END IF + + c_eff(JL) = feff ! scaling parameter for the threshold friction velocity + + ! due to energy loss + !--------------------------------------------------------------------------------------- + END DO ! JL + !--------------------------------------------------------------------------------------- + ! End of daily base calculations + +!VH END IF ! newday + + + + + + ! reset flux masses + flux_ai(KIDIA:KFDIA) = 0. + flux_ci(KIDIA:KFDIA) = 0. + + DO JL = KIDIA,KFDIA + + !-- initialisation of the fields + ! size: ntraced + fluxtot = 0. + fdust = 0. + + + !----- -------------------------------------------------------------------------- + ! Calculation of dust emission flux + ! dependent on the 3 hourly wind fields + !---------------------------------------------------------------------- + IF( c_eff(JL) > 0. ) THEN + + ! Calculation of ustar + + ! AS: initialise ustar (for those cases where if statement(s) are not fulfilled) + ustar = 0. + + IF( PLSM(JL) > 0. ) THEN + ! wind10m = SQRT(u10m_dat(iglbsfc)%data(JL,1)**2 + & + ! v10m_dat(iglbsfc)%data(JL,1)**2) * 100. ! cm/s + ustar = (vKarman * PWIND(JL)*100._JPRB) / ( log( ZZ / z0(JL) ) ) ! cm/s + ENDIF + + IF( Ustar > 0 .AND. (Ustar > umin2(JL) / c_eff(JL)) ) THEN + + !>>> TvN + rho_air = SP(JL)/PTL(JL)*airfac ! g/cm3 + airdens_ratio = rho_air/roa + airdens_ratio2 = sqrt(roa/rho_air) + !<<< TvN + + !-- initialisation of the fields + ! size: ntraced + !dbmin = 0. + !dbmax = 0. + ! size: nclass + fluxtyp = 0. + + + ! soil type index for the calcl. of horiz. dust flux + i_s1 = INT( soil_type(JL) ) + ! set it the same as ice + IF( i_s1 == 0 ) i_s1 = 9 + ! to separate from now on between saltation and mobilisation + i_s11 = i_s1 + ! to separate between mobilisation and saltation and dust particles + IF( i_s1 == 10 .OR. i_s1 == 12 ) i_s11 = 11 + kk = 0 + dp = Dmin + DO WHILE( dp <= Dmax+1E-5) + kk = kk+1 + uthp = uth(kk) * umin2(JL) / umin * u1fac !reduce saltation threshold for cultivated soils + !>>> TvN + ! Include correction factor for variable air density + uthp = uthp * airdens_ratio2 + !<<< TvN + + ! See Eq. (28) in MB95; Eq. (6) in Tegen et al.; Eq. (2) in Heinold et al. + ! Note that (1+R)^2 * (1-R) = (1+R) * (1-R^2) + fdp1 = (1.-(Uthp/(c_eff(JL) * Ustar))) ! component of the horiz. flux + fdp2 = (1.+(Uthp/(c_eff(JL) * Ustar)))**2. ! + + IF( fdp1 > 0 .AND. fdp2 > 0) THEN + + ! vertical flux dust weighted by the surface area relative to each soil type + flux_diam = srel(i_s1,kk) * fdp1 * fdp2 * cd * Ustar**3 * alpha(JL) + !>>> TvN + ! Include correction factor for variable air density + flux_diam = flux_diam * airdens_ratio + !<<< TvN + + !---------------------------------------------------------------------- + ! all particles even the small ones can be mobilised by saltation + !---------------------------------------------------------------------- + dbstart = dmin + + IF( dbstart >= dp ) THEN + fluxtyp(kk) = fluxtyp(kk) + flux_diam + ELSE + !---------------------------------------------------------------------- + ! loop over dislocated dust particle sizes + !---------------------------------------------------------------------- + dpd = dmin + kkk = 0 + kfirst = 0 + DO WHILE( dpd <= dp+1e-5 ) + kkk = kkk + 1 + IF( dpd >= dbstart ) THEN ! the particles produced by saltation are put + IF( kfirst == 0 ) kkmin = kkk ! in finer bins + kfirst = 1 + !---------------------------------------------------------------------- + ! scaling with relative contribution of dust size fraction + ! we take into account the volume contribution of the particle types: + ! all the particles from soil type 10 are put into the 11 soil type when + ! we are in the production region + !---------------------------------------------------------------------- + IF( kk > kkmin ) THEN + ! remember: i_s11 puts the mobilised + fluxtyp(kkk) = fluxtyp(kkk) + flux_diam * srelV(i_s11,kkk) / & + (su_srelV(i_s11,kk) - su_srelV(i_s11,kkmin) ) + ! particles in smaller bins + END IF !kk.gt.kmin + END IF !dpd.gt.dbstart + dpd = dpd * EXP(dstep) + END DO !dpd + !---------------------------------------------------------------------- + ! end of saltation loop + !---------------------------------------------------------------------- + END IF !dbstart.lt.dp + + END IF !fdp1 + + dp = dp * EXP(Dstep) + + END DO !dp + !---------------------------------------------------------------------- + ! assign fluxes to bins: flux is in g cm-2 s-1 for each bin + ! 192 sub-bins are put into 8 bins + !---------------------------------------------------------------------- + dp = dmin + dlast = dmin + nn = 1 + kk = 0 + DO WHILE( dp <= dmax+1e-5 ) + kk = kk+1 + ! add to total + IF( nn <= ntraced ) fluxtot(nn) = fluxtot(nn) + fluxtyp(kk) + + IF( MOD(kk,nbin) == 0 ) THEN + !dbmax(nn) = dp * 10000. * 0.5 !radius in um + !dbmin(nn) = dlast * 10000. * 0.5 + !dpk(nn) = SQRT( dbmax(nn) * dbmin(nn) ) + nn = nn+1 + dlast = dp + END IF + + dp = dp * EXP(Dstep) + + END DO !dp + + END IF !ustar + END IF !c_eff + + ! Masking the area covered by snow, vegetation and [...?...] + cultfac1 = 1. + + DO nn = 1, ntraced + ! fluxtot: g/cm2/sec + ! MASK: Effective area determined by cultfac1/snow + fdust(nn) = fluxtot(nn) * cultfac1 * (1.-snowcover(JL)) + + ! MASK: Effective area determined by fpar: + + fdust(nn) = fdust(nn) * lai_eff(JL) ! turn off vegetation limitation here! + ! TvN: an alternative approach based on surface roughness + ! is applied by Laurent et al. (JGR, 2006). + + + ! MASK: Soil moisture threshold, using w0 + ! when moisture is included !!!!!!!!!!!!!!!!!! + ! IF(qrsur(JL).GE.w0) THEN + ! fdust(JL,nn)=0. + ! END IF + PAERFLX(JL,1,nn)=fdust(nn) + PAERFLX(JL,2,nn)=fluxtot(nn) + END DO + PAERFLX(JL,3,1)=snowcover(JL) + !PAERFLX(JL,3,2)=cultfac1 !=1 + PAERFLX(JL,3,3)=c_eff(JL) + !PAERFLX(JL,3,5)=ustar + !PAERFLX(JL,3,6)=umin2(JL) !=13.75 + PAERFLX(JL,3,6)=uthp + PAERFLX(JL,3,7)=lai_eff(JL) !=1 most of land + PAERFLX(JL,3,8)=PWIND(JL)*100._JPRB + PAERFLX(JL,3,9)=Z0(JL) + ! ------------------------------------------------------------------------------ + ! Grouping into 2 modes: 1sec accumulation + ! + !>>> TvN + ! Accumulation + flux_r1 = 0. + DO nn = min_ai, max_ai + !flux_ai(JL) = flux_ai(JL) + fdust(nn) + flux_r1 = flux_r1 + fdust(nn) + END DO + + ! Coarse + flux_r2 = 0. + DO nn = min_ci, max_ci + !flux_ci(JL) = flux_ci(JL) + fdust(nn) + flux_r2 = flux_r2 + fdust(nn) + END DO + + ! The solution of the system of linear equations + ! (see comments above). + ! For special conditions, + ! the solution can give a negative mass flux + ! in either the accumulation or coarse mode. + ! In those case, all mass is put into + ! the other mode. + flux_ai(JL) = flux_r1 - ratio_coa * flux_r2 + flux_ci(JL) = flux_r2 - ratio_acc * flux_r1 + IF (flux_ai(JL) .gt. 0. .AND. flux_ci(JL) .gt. 0.) THEN + flux_ai(JL) = flux_ai(JL) * denom_acc_inv + flux_ci(JL) = flux_ci(JL) * denom_coa_inv + ELSEIF (flux_ai(JL) .lt. 0.) THEN + flux_ai(JL) = 0. + flux_ci(JL) = (flux_r1 + flux_r2) * mf_coa_r12_inv + ELSEIF (flux_ci(JL) .lt. 0.) THEN + flux_ai(JL) = (flux_r1 + flux_r2) * mf_acc_r12_inv + flux_ci(JL) = 0. + ENDIF + !<<< TvN + + ! now scale the emissions + ! convert from g/cm2/s to g/grid_cell/month (area is in m2) + !VH flux_ai(JL) = flux_ai(JL) * sec_month * 1.E4 * area(JL) + !VH flux_ci(JL) = flux_ci(JL) * sec_month * 1.E4 * area(JL) + ! convert from g/cm2/s to g/m2/sec + flux_ai(JL) = flux_ai(JL) * 1.E4 + flux_ci(JL) = flux_ci(JL) * 1.E4 + + !------------------------------------------------------------------------------- + ! Calculating number flux (#/m2/sec) + ! + ! Accumulation + fnum_ai(JL) = flux_ai(JL) * 3. / (4.*RPI*ddust*mmr_ai**3) * EXP(4.5*LOG(sigma(iacci))**2) + ! Coarse + fnum_ci(JL) = flux_ci(JL) * 3. / (4.*RPI*ddust*mmr_ci**3) * EXP(4.5*LOG(sigma(icoai))**2) + + + ! scale the flux from g to kg + flux_ai(JL) = flux_ai(JL) * 1.E-03 + flux_ci(JL) = flux_ci(JL) * 1.E-03 + + END DO ! JL + + ! free memory + ! DEALLOCATE( fluxtyp, fluxtot, fdust ) + + + ! ------------------------------ + ! add sources to emission arrays + ! ------------------------------ + + ! vertical splitting is that class + ! splittype = 'nearsurface' + + ! ------------------------------ + ! accumulation mode + + ! number + + ! vertically distribute according to sector + ! CALL emission_vdist_by_sector( splittype, 'DUST', region, emis_temp(region), emis3d(region), status ) + + emis_number(mode_aci)%d3(KIDIA:KFDIA,KLEV,1) = fnum_ai(KIDIA:KFDIA) + + ! mass + + ! vertically distribute according to sector + ! CALL emission_vdist_by_sector( splittype, 'DUST', region, emis_temp(region), emis3d(region), status ) + + emis_mass(mode_aci)%d3(KIDIA:KFDIA,KLEV,1) = flux_ai(KIDIA:KFDIA) + + ! ------------------------------ + ! coarse mode + + ! number + + ! vertically distribute according to sector + ! CALL emission_vdist_by_sector( splittype, 'DUST', region, emis_temp(region), emis3d(region), status ) + + emis_number(mode_coi)%d3(KIDIA:KFDIA,KLEV,1) = fnum_ci(KIDIA:KFDIA) + + ! mass + + ! vertically distribute according to sector + !CALL emission_vdist_by_sector( splittype, 'DUST', region, emis_temp(region), emis3d(region), status ) + !write(8331,*) flux_ci(KIDIA),fnum_ci(KIDIA) + !write(8332,*) flux_ai(KIDIA),fnum_ai(KIDIA) + emis_mass(mode_coi)%d3(KIDIA:KFDIA,KLEV,1) = flux_ci(KIDIA:KFDIA) + + !else + else IF (NDDUST == 3 ) THEN ! case ECMWF formulation + !end if + +!!!!! AER emissions +!!$CALL SURF_INQ(YSURF,PRWPWP=ZRWPWP) +!!$CALL SURF_INQ(YSURF,PRWSAT=ZRWSAT) + +!!$ZETAH(KIDIA:KFDIA,0)=0._JPRB +!!$DO JK=1,KLEV +!!$ DO JL=KIDIA,KFDIA +!!$ ZETA(JL,JK) =PAP(JL,JK) /PAPH(JL,KLEV) +!!$ ZETAH(JL,JK)=PAPH(JL,JK)/PAPH(JL,KLEV) +!!$ ENDDO +!!$ENDDO + +!ITEST=0 +!ZDEGRAD= 180._JPRB/RPI +!ZDLAT = 180._JPRB / NDGLG ! distance in degrees between latitude lines +!ZGRDLAT= RPI / NDGLG ! distance in radians between latitude lines +!ZGRDLAT2=ZGRDLAT*0.55_JPRB + +!ZDDUAER(:) = 1.00_JPRB +KBINDD=3 + +RDDUAER(:) = 0.0_JPRB +RDDUSRC(:,:)= 0.0_JPRB +NDUSRCP(:) = 1 +RDUSRCP(:,:) = 0.0_JPRB + +!* Default values for RDDUAER +RDDUAER(1)=1.0_JPRB +RDDUAER(2)=1.0_JPRB +RDDUAER(3)=0.5_JPRB +RDDUAER(4)=0.6_JPRB +RDDUAER(5)=0.6_JPRB +RDDUAER(6)=1.0_JPRB +RDDUAER(7)=1.0_JPRB +RDDUAER(8)=1.0_JPRB +RDDUAER(9)=1.0_JPRB +RDDUAER(10)=1.0_JPRB +RDDUAER(11)=1.0_JPRB +RDDUAER(12)=1.0_JPRB +RDDUAER(13)=0.0_JPRB +RDDUAER(14)=0.2_JPRB +RDDUAER(15)=0.5_JPRB +RDDUAER(16)=1.0_JPRB +RDDUAER(17)=1.0_JPRB +RDDUAER(18)=0.5_JPRB +RDDUAER(19)=0.5_JPRB +RDDUAER(20)=0.8_JPRB +RDDUAER(21)=1.2_JPRB +RDDUAER(22)=1.5_JPRB +RDDUAER(23)=1.5_JPRB +RDDUAER(24)=0.5_JPRB +RDDUAER(25)=1.0_JPRB +RDDUAER(26)=0.5_JPRB +RDDUAER(27)=1.0_JPRB +RDDUAER(28)=0.5_JPRB +RDDUAER(29)=1.0_JPRB +RDDUAER(30)=1.0_JPRB +RDDUAER(31)=0.1_JPRB +RDDUAER(32)=0.1_JPRB +RDDUAER(33)=0.3_JPRB +RDDUAER(34)=0.8_JPRB +RDDUAER(35)=0.5_JPRB +RDDUAER(36)=0.4_JPRB +RDDUAER(37)=0.6_JPRB + +!* default reference values for threshold speed and reference particle radius +! -- 1 N & S America, Europe +RDUSRCP(1,1) = 6.0_JPRB +RDUSRCP(1,2) = 5.0_JPRB +! -- 2 Russia, Urals +RDUSRCP(2,1) = 6.0_JPRB +RDUSRCP(2,2) = 5.0_JPRB +! -- 3 Africa, Sahara, S. Africa +RDUSRCP(3,1) = 6.0_JPRB +RDUSRCP(3,2) = 5.0_JPRB +! -- 4 Australasia +RDUSRCP(4,1) = 4.0_JPRB +RDUSRCP(4,2) = 5.0_JPRB +! -- 5 Asian deserts +RDUSRCP(5,1) = 3.5_JPRB +RDUSRCP(5,2) = 5.0_JPRB +! -- 6 dry lands of S.America +RDUSRCP(6,1) = 4.0_JPRB +RDUSRCP(6,2) = 5.0_JPRB +! -- 7 the rest (Japan, Greenland, Antarctica) +RDUSRCP(7,1) = 4.0_JPRB +RDUSRCP(7,2) = 5.0_JPRB +RDDUSRC(:,1)=0.3_JPRB +RDDUSRC(:,2)=0.8_JPRB +RDDUSRC(:,3)=5.5_JPRB +!-- default values are for use of 10-m wind as predictor for SS and DU +!RFCTDU = 1.0_JPRB +!RFCTSS = 1.0_JPRB +!* New defaults taken from previous namelist; stj - 27-10-2010 +!RFCTDUR = 1.0_JPRB +!RFCTSSR = 1.0_JPRB +!!$CLAERWND(0) = '10-M WIND AS PREDICTOR FOR SS AND DU ' +!!$CLAERWND(1) = 'PREDICTORS: WIND GUST FOR SS, 10M-WIND FOR DU' +!!$CLAERWND(2) = 'PREDICTORS: WIND GUST FOR DU, 10M-WIND FOR SS' +!!$CLAERWND(3) = 'WIND GUST AS PREDICTORS FOR SS AND DU ' + + + !* 0.6 EMPIRICAL EFFICIENCY FACTORS FOR SOURCES +! ---------------------------------------- +! N.B.: Security parameters +ZEPSISS=1.E-09_JPRB +ZEPSIDD=1.E-12_JPRB +ZEPSIRA=1.E-06_JPRB +ZEPSISS=0.E+00_JPRB +ZEPSIDD=0.E+00_JPRB +ZEPSIRA=0.E+00_JPRB +ZEPSSNO=1.E-03_JPRB +ZEPSARE=1.E-03_JPRB + +!PAERMAP(KIDIA:KFDIA,1:5) = 0._JPRB +DO JL=KIDIA,KFDIA + ZLAT=PGLAT(JL) + ZLON=PGLON(JL) + ZBNDA= 30._JPRB+(36._JPRB -ZLAT)*14._JPRB/24._JPRB + ZBNDB= 30._JPRB+(36._JPRB -ZLAT)*40._JPRB/16._JPRB + ZBNDC= 38._JPRB+(ZLON-124._JPRB)*12._JPRB/29._JPRB + ZBNDD= 32._JPRB-(ZLON-243._JPRB)* 6._JPRB/21._JPRB + +!-- Eastern border Canada/USA + ZBNDE= 49._JPRB + IF (ZLON > 268._JPRB .AND. ZLON < 277._JPRB) THEN + ZBNDE= 49._JPRB-(ZLON-268._JPRB)*7._JPRB/9._JPRB + ELSEIF (ZLON >= 277._JPRB .AND. ZLON < 285._JPRB) THEN + ZBNDE= 42._JPRB+(ZLON-277._JPRB)*2._JPRB/8._JPRB + ELSEIF (ZLON >= 285._JPRB .AND. ZLON < 310._JPRB) THEN + ZBNDE= 44._JPRB+(ZLON-285._JPRB)*3._JPRB/25._JPRB + ENDIF + +!-- limits Britain + ZLONGB=-9999._JPRB + IF (ZLON > 354._JPRB .AND. ZLON < 360._JPRB) THEN + ZLONGB=ZLON + ELSEIF (ZLON >= 0._JPRB .AND. ZLON < 3._JPRB) THEN + ZLONGB=ZLON+360._JPRB + ENDIF + ZBNDF= 47._JPRB+(ZLONGB-349._JPRB)*4.5_JPRB/14._JPRB + +!-- limits Ireland + ZBNDG= 61._JPRB-(ZLON-349._JPRB)*7._JPRB/6._JPRB + ZBNDH= 45._JPRB+(ZLON-349._JPRB)*9._JPRB/6._JPRB + +!-- Western border Brazil + IF (ZLAT <= 4._JPRB .AND. ZLAT > 2._JPRB) THEN + ZBNDI= 296._JPRB + ELSEIF (ZLAT <= 2._JPRB .AND. ZLAT > -4._JPRB) THEN + ZBNDI= 290._JPRB + ELSEIF (ZLAT <= -4._JPRB .AND. ZLAT > -7._JPRB) THEN + ZBNDI= 290._JPRB-(-4._JPRB-ZLAT)*4._JPRB/3._JPRB + ELSEIF (ZLAT <= -7._JPRB .AND. ZLAT > -11._JPRB) THEN + ZBNDI= 286._JPRB+(-7._JPRB-ZLAT)*4._JPRB/4._JPRB + ENDIF + + IF (ZLAT <= -11._JPRB .AND. ZLAT > -18._JPRB) THEN + ZBNDJ= 294._JPRB+(-11._JPRB-ZLAT)*8._JPRB/7._JPRB + ELSEIF (ZLAT <= -18._JPRB .AND. ZLAT > -27._JPRB) THEN + ZBNDJ= 302._JPRB+(-18._JPRB-ZLAT)*4._JPRB/9._JPRB + ELSEIF (ZLAT <= -27._JPRB .AND. ZLAT > -30._JPRB) THEN + ZBNDJ= 306._JPRB-(-27._JPRB-ZLAT)*3._JPRB/3._JPRB + ELSEIF (ZLAT <= -30._JPRB .AND. ZLAT >= -34._JPRB) THEN + ZBNDJ= 303._JPRB+(-30._JPRB-ZLAT)*4._JPRB/4._JPRB + ENDIF + +!-- Northern border India + IF (ZLON > 70._JPRB .AND. ZLON <= 90._JPRB) THEN + ZBNDK= 35._JPRB-(ZLON-70._JPRB)*0.5_JPRB + ENDIF + +!-- South border of Asian deserts + IF (ZLON > 90._JPRB .AND. ZLON <= 135._JPRB) THEN + ZBNDL= 25._JPRB+(ZLON-90._JPRB)*15._JPRB/45._JPRB + ENDIF + +!-- North limit of the Argentinian pampas + IF (ZLON > 285._JPRB .AND. ZLON <= 297._JPRB) THEN + ZBNDM= -42._JPRB+(ZLON-285._JPRB)*6._JPRB/12._JPRB + ENDIF + + IFF=0 + ITYPDU=0 + +!-- North America +! ITYPDU=1 +!----- Canada + IF ( ZLAT >= ZBNDE .AND.& + & (ZLON > 190._JPRB .AND. ZLON < 330._JPRB) ) THEN + IFF=1 +!----- USA + ELSEIF ( (ZLAT >= ZBNDD .AND. ZLAT < ZBNDE )& + & .AND. (ZLON > 190._JPRB .AND. ZLON < 330._JPRB) ) THEN + IFF=3 + ENDIF +!-- Alaska + IF ( (ZLAT < 72._JPRB .AND. ZLAT > 52._JPRB)& + & .AND. (ZLON > 190._JPRB .AND. ZLON <= 219._JPRB) ) THEN + IFF=2 + ENDIF + +!-- Central America + IF (ZLAT < ZBNDD .AND.& + & (ZLON > 190._JPRB .AND. ZLON < 330._JPRB) ) THEN + IFF=4 + ENDIF + +!-- South America + IF ( ZLAT < 12._JPRB .AND.& + & (ZLON > 190._JPRB .AND. ZLON < 330._JPRB) ) THEN + IFF=5 + ENDIF +!-- Brazil + IF ( (ZLAT <= 4._JPRB .AND. ZLAT > 2._JPRB)& + & .AND. (ZLON >= 296._JPRB .AND. ZLON <= 300._JPRB) ) THEN + IFF=6 + ENDIF + IF ( (ZLAT <= 2._JPRB .AND. ZLAT > -11._JPRB)& + & .AND. (ZLON >= ZBNDI .AND. ZLON < 330._JPRB) ) THEN + IFF=6 + ENDIF + IF ( (ZLAT <= -11._JPRB .AND. ZLAT >= -34._JPRB)& + & .AND. (ZLON >= ZBNDJ .AND. ZLON < 330._JPRB) ) THEN + IFF=6 + ENDIF + +!-- Western Europe + IF ( ZLAT > 36._JPRB .AND. ( ZLON >= 330._JPRB .OR. ZLON <= 30._JPRB) ) THEN + IFF=10 + ENDIF + +!----- Iceland + IF ( (ZLAT < 67._JPRB .AND. ZLAT > 63._JPRB)& + & .AND. ( ZLON > 335._JPRB .AND. ZLON < 353._JPRB) ) THEN + IFF=7 + ENDIF +!----- Britain + IF ( (ZLAT < 63._JPRB .AND. ZLAT > ZBNDF)& + & .AND. ( ZLON > 354._JPRB .OR. ZLON < 3._JPRB) ) THEN + IFF=9 + ENDIF +!----- Ireland + IF ( (ZLAT < ZBNDG .AND. ZLAT > ZBNDH)& + & .AND. ( ZLON > 349._JPRB .AND. ZLON < 355._JPRB) ) THEN + IFF=8 + ENDIF + ITYPDU=1 + IF ( (IFF >= 1 .AND. IFF <= 10) .OR. IFF == 16) THEN + NDUSRCP(IFF)=ITYPDU + ENDIF + +! ITYPDU=2 +!-- Russia to Urals + IF ( ZLON > 30._JPRB .AND. ZLON <= 70._JPRB ) THEN + IF ( ZLAT > 51._JPRB ) THEN + IFF=11 + ELSEIF ( ZLAT > 36._JPRB ) THEN + IFF=12 + ENDIF + ENDIF + ITYPDU=2 + IF ( IFF >= 11 .AND. IFF <= 12 ) THEN + NDUSRCP(IFF)=ITYPDU + ENDIF + +! ITYPDU=3 +!-- Northern Sahara +! if ( ( zlat <= 36._JPRB .and. zlat >= 21._JPRB) & +! & .and. ( zlon >= 330._JPRB .or. zlon <= zbnda) ) then +! iff=13 +!-- Northern Sahara (West) + IF ( ( ZLAT <= 36._JPRB .AND. ZLAT >= 21._JPRB)& + & .AND. ( ZLON >= 330._JPRB .OR. ZLON < 2._JPRB) ) THEN + IFF=36 +!-- Northern Sahara (East) + ELSEIF ( ( ZLAT <= 36._JPRB .AND. ZLAT >= 21._JPRB)& + & .AND. ( ZLON >= 2._JPRB .OR. ZLON <= ZBNDA) ) THEN + IFF=37 +!-- Southern Sahara (West) + ELSEIF ( ( ZLAT < 21._JPRB .AND. ZLAT >= 12._JPRB)& + & .AND. ( ZLON >= 330._JPRB .OR. ZLON < 8._JPRB) ) THEN + IFF=34 +!-- Southern Sahara (East) + ELSEIF ( ( ZLAT < 21._JPRB .AND. ZLAT >= 12._JPRB)& + & .AND. ( ZLON >= 8._JPRB .AND. ZLON <= ZBNDA) ) THEN + IFF=35 +!-- Central Africa + ELSEIF ( ( ZLAT < 12._JPRB .AND. ZLAT >= -12._JPRB)& + & .AND. ( ZLON >= 330._JPRB .OR. ZLON <= 60._JPRB) ) THEN + IFF=14 +!-- Southern Africa + ELSEIF ( ZLAT < -12._JPRB .AND. ZLAT >= -60._JPRB& + & .AND. ( ZLON >= 330._JPRB .OR. ZLON <= 60._JPRB) ) THEN + IFF=15 + ENDIF + ITYPDU=3 + IF ( (IFF >= 13 .AND. IFF <= 15) .OR. (IFF >= 34 .AND. IFF <= 37) ) THEN + NDUSRCP(IFF)=ITYPDU + ENDIF + +! ITYPDU=4 +!-- Australasia + IF (ZLON > 70._JPRB .AND. ZLON <= 190._JPRB) THEN + IFF=26 + +!-- Siberia + IF (ZLAT <= 90._JPRB .AND. ZLAT > 51._JPRB) THEN + IFF=16 + +!-- South Australasia +!---- Tropical Pacific Islands + ELSEIF ( ZLAT > -10.5_JPRB) THEN + IFF=27 +!---- Australia + ELSEIF ( ZLAT <= -10.5_JPRB .AND. ZLAT >= -60._JPRB) THEN + IFF=28 + ENDIF + ENDIF + ITYPDU=4 + IF ( IFF >= 26 .AND. IFF <= 28 ) THEN + NDUSRCP(IFF)=ITYPDU + ENDIF + +! ITYPDU=5 +!-- Asian deserts + IF ((ZLON > 90._JPRB .AND. ZLON <= 135._JPRB)& + & .AND. (ZLAT <= 51._JPRB .AND. ZLAT > ZBNDL)) THEN + IFF=17 + ENDIF + +!-- Saudi Arabia + IF ((ZLAT <= 36._JPRB .AND. ZLAT >= 12._JPRB)& + & .AND.( ZLON > ZBNDA .AND. ZLON < ZBNDB) ) THEN + IFF=18 + ENDIF +!-- Irak, Iran, Pakistan + IF ((ZLAT <= 36._JPRB .AND. ZLAT >= 20._JPRB)& + & .AND.( ZLON > ZBNDB .AND. ZLON < 70._JPRB) ) THEN + IFF=19 + ENDIF + +!-- Central Asia and India + IF ( ZLON > 70._JPRB .AND. ZLON <= 90._JPRB) THEN +!----- Central Asia: Taklamakan + IF (ZLAT <= 43._JPRB .AND. ZLAT >= ZBNDK) THEN + IFF=20 +!----- India + ELSEIF (ZLAT <= ZBNDK .AND. ZLAT > 7._JPRB) THEN + IFF=21 + ENDIF + ENDIF +!-- other Gobi(s) in South Mongolia and Central China + IF ( ZLAT <= 49._JPRB .AND. ZLAT > 35._JPRB) THEN + IF (ZLON > 90._JPRB .AND. ZLON <= 110._JPRB) THEN + IFF=22 + ELSEIF (ZLON > 110._JPRB .AND. ZLON <= 125._JPRB) THEN + IFF=23 + ENDIF + ENDIF + +!-- South China + IF ( (ZLON > 90._JPRB .AND. ZLON <= 135._JPRB) .AND.& + & (ZLAT <= ZBNDL .AND. ZLAT > 7._JPRB) ) THEN + IFF=24 + ENDIF + ITYPDU=5 + IF ( IFF >= 17 .AND. IFF <= 24 ) THEN + NDUSRCP(IFF)=ITYPDU + ENDIF + + +! ITYPDU=7 +!-- Japan and S.Korea + IF ( (ZLON > 124._JPRB .AND. ZLON < 153._JPRB)& + & .AND. (ZLAT > 24._JPRB .AND. ZLAT < ZBNDC) ) THEN + IFF=25 + ENDIF + +!-- Greenland + IF (ZLAT > 50._JPRB) THEN + ZINCLAT=(90._JPRB-ZLAT)/40._JPRB*45._JPRB + ZLONW=270._JPRB +ZINCLAT + ZLONE=360._JPRB -ZINCLAT + IF ( ZLON > ZLONW .AND. ZLON < ZLONE ) THEN + IFF=29 + ENDIF + ENDIF + +!-- Antarctica + IF (ZLAT < -60._JPRB) THEN + IFF=30 + ENDIF + ITYPDU=7 + IF ( (IFF >= 29 .AND. IFF <= 30) .OR. IFF == 25 ) THEN + NDUSRCP(IFF)=ITYPDU + ENDIF + +!-- awaiting a proper recoding, new areas are set between iff=31 and 35 +! ITYPDU=6 + IF ( ZLON > 285._JPRB .AND. ZLON < 295._JPRB) THEN +!- Atacama desert and Salar de Uyuni + IF ( ZLAT < -16._JPRB .AND. ZLAT > -28._JPRB) THEN + IFF=31 + ENDIF +!- Salar de Pipanaco and other small ones + IF ( ZLAT <= -28._JPRB .AND. ZLAT > ZBNDM) THEN + IFF=32 + ENDIF + ENDIF +!- Argentinian pampas + IF ( (ZLON > 285._JPRB .AND. ZLON < 297._JPRB)& + & .AND. ZLAT <= ZBNDM ) THEN + IFF=33 + ENDIF + ITYPDU=6 + IF ( IFF >= 31 .AND. IFF <= 33 ) THEN + NDUSRCP(IFF)=ITYPDU + ENDIF + + IF (IFF /= 0) THEN + PAERMAP(JL,1)=IFF*PLSM(JL) ! area index + PAERMAP(JL,3)=RDUSRCP(NDUSRCP(IFF),1) ! reference speed + PAERMAP(JL,4)=RDUSRCP(NDUSRCP(IFF),2) ! reference particule radius + DO JAER=1,KBINDD + ZDUEMPOT(JL,JAER)=RDDUAER(IFF)*RDDUSRC(IFF,JAER)*PLSM(JL) ! dust emission potential factor (including land-sea mask) + ENDDO + PAERMAP(JL,2)=ZDUEMPOT(JL,1) ! for diagnostics only + ELSE + WRITE(NULOUT,FMT='(''aer_src: Unassigned grid for Lat,Lon='',2F8.2)') ZLAT,ZLON + PAERMAP(JL,:)=0._JPRB + ENDIF +ENDDO + + +!----------------------------------------------------------------------- + +!* 0.3 SURFACE WIND VARIABLE RELEVANT FOR SS AND DU EMISSIONS +! ------------------------------------------------------ + +!!$IF (NAERWND == 0) THEN +!!$!-- no gust accounted for +!!$ ZWNDDU(KIDIA:KFDIA) = PWIND(KIDIA:KFDIA) +!!$ ZWNDSS(KIDIA:KFDIA) = PWIND(KIDIA:KFDIA) +!!$ELSEIF (NAERWND == 1) THEN +!!$!-- gust only for SS, 10-m wind for DU +!!$ ZWNDDU(KIDIA:KFDIA) = PWIND(KIDIA:KFDIA) +!!$ ZWNDSS(KIDIA:KFDIA) = PAERGUST(KIDIA:KFDIA) +!!$ELSEIF (NAERWND == 2) THEN +!!$!-- gust only for DU, 10-m wind for SS +!!$ ZWNDDU(KIDIA:KFDIA) = PAERGUST(KIDIA:KFDIA) +!!$ ZWNDSS(KIDIA:KFDIA) = PWIND(KIDIA:KFDIA) +!!$ELSEIF (NAERWND == 3) THEN +!!$!-- gust for both SS and DU +!!$ ZWNDDU(KIDIA:KFDIA) = PAERGUST(KIDIA:KFDIA) +!!$ ZWNDSS(KIDIA:KFDIA) = PAERGUST(KIDIA:KFDIA) +!!$ENDIF + +! correction to account for the decrease of mean wind and gusts with decreasing +! time step +!!$IF (PTSPHY < 1000) THEN +!!$ ZWNDDU(KIDIA:KFDIA)=1.06_JPRB*ZWNDDU(KIDIA:KFDIA) +!!$ ZWNDSS(KIDIA:KFDIA)=1.08_JPRB*ZWNDSS(KIDIA:KFDIA) +!!$ENDIF +ZRWPWP=PRWPWP +ZRWSAT=PRWSAT +!* 2.0 DESERT DUST +! ----------- + +!- Simplistic lifting from surface based on 10-m wind and surface albedo +ZHDD=MAX(1.0_JPRB,8434._JPRB/1000._JPRB) + +!PAERLIF(KIDIA:KFDIA,1:9)=0._JPRB +PAERFLX(KIDIA:KFDIA,1:12,1:9)=0._JPRB +ZFLX_SDUST(KIDIA:KFDIA,1:9,1:12)=0._JPRB + + !----------------------------------------------- + + +INBAER=0 +RAERDUB=1.E-11_JPRB + + !- ECMWF dust emission fluxes come in either 3- or 10-size bins + ! 0.03 - 0.55 - 0.9 - 20. + ! 0.03 - 0.06 - 0.12 - 0.24 - 0.48 - 0.96 - 1.92 - 3.84 - 7.68 - 15.36 - 30.72 + + !!-- for potential dust sources, select land points, snow-free, and zero ice, no wet skin cover + !! with fraction of bare soil > 10%, no high vegetation, possible low vegetation < 50% but + !! with soil moisture below moisture corresponding to twice the wilting point (0.171), and + !! a flatish surface (st.dev.orog < 50) with total albedo < 50% + + !-- for potential dust sources, select land points, snow-free, and zero ice, + ! no wet skin cover, with some fraction of bare soil, with test on soil + ! moisture, and a flatish surface (st.dev.orog < 50) with total albedo < 52% + + DO JL=KIDIA,KFDIA +!-- default values for non-land points + LLPDUSTS(JL)=.FALSE. + PAERMAP(JL,5)=0.0_JPRB + ZSCC2(JL)=0._JPRB + ZDEP2(JL)=0._JPRB + ZLTS2(JL)=0._JPRB + IF (PLSM(JL) >= 0.99_JPRB) THEN + ZREFSPD = PAERMAP(JL,3) + ZREFRAD = PAERMAP(JL,4) + ZRADREF = ZREFSPD * ZREFRAD**0.25_JPRB +!-- default min and max of LTS correspond to PWS1 = ZRWPWP and PSW1 = ZRWSAT + ZLTSMIN(JL) = 0.6_JPRB * ZRADREF ! ZFSWET = 0.6 + ZLTSMAX(JL) = 1.2_JPRB * ZRADREF ! ZFSWET = 1.2 + ZSWETN = MIN(1._JPRB, MAX(0.001_JPRB, (PWS1(JL)-ZRWPWP)/(ZRWSAT-ZRWPWP) ) ) + ZFSWET = 1.2_JPRB+0.2_JPRB*LOG10(ZSWETN) +!-- background lifting threshold speed (defined for all land points) + ZLTS2(JL) = MIN( ZLTSMAX(JL), MAX( ZLTSMIN(JL), ZFSWET * ZRADREF )) +!-- replace by simpler test on: +! absence of snow +! flatish surface +! total albedo < 0.52 (no permanent ice) +! type 8 fraction bare soil > 10% +! type 4 cover by dry snow-free low vegetated < 50% +! all other cover types < 0.1% + IF (PSNS(JL) < ZEPSSNO .AND. PHSDFOR(JL) <= 50._JPRB .AND. PALB(JL) < 0.52_JPRB .AND.& + & PFRTI(JL,2) < ZEPSARE .AND. PFRTI(JL,3) < ZEPSARE .AND.&! no ice, no wet skin + & PFRTI(JL,5) < ZEPSARE .AND. PFRTI(JL,6) < ZEPSARE .AND.&! no snow under bare soil-low veg, no dry high veg + & PFRTI(JL,7) < ZEPSARE .AND.&! no snow under high veg + & PFRTI(JL,8) > 0.1_JPRB .AND. PFRTI(JL,4) < 0.5_JPRB ) THEN + + LLPDUSTS(JL)=.TRUE. + + PAERMAP(JL,5)=RAERDUB * ZDUEMPOT(JL,1) ! for diagnostics only + ENDIF + ENDIF + ENDDO + +! ZFLX_SDUST is positive in kg m-2 s-1 +! but ECMWF conventions have PCFLX as a negative upward flux +! input parameters from climatology are: +! -- soil clay content (%) +! dust emission potential (kg s2 m-5) +! lifting thereshold speed (m s-1) +! + DO JAER=1,KBINDD + +!-- surface source of dust is assumed if LLPTDUSTS is true, and/or UVis albedo > 0.11 +! 10m wind > threshold = f(soil wetness, mean particle radius) + DO JL=KIDIA,KFDIA + LLDUST(JL,:)=.FALSE. + ZFLX_SDUST(JL,JAER,1:12)=0._JPRB + +!--------------------------------------------------------------------- +!-- ECMWF formulation + + IF (LLPDUSTS(JL)) THEN + ZDEP2(JL)= RAERDUB * ZDUEMPOT(JL,JAER) + ZSCC2(JL)= 20._JPRB + +!-- Present formulation in MACC (June'11, still kept June'13) +! use a formula of threshold wind velocity modified from Ginoux et al., 2001 +! based on 1st layer soil wetness and an averaged particle radius +!-- All of the above limes computed above + !PAERLIF(JL,JAER)=ZLTS2(JL) ! for diagnostics only + +!- compare surface 10-m wind with threshold wind velocity + + ZWND3(JL) = MAX(0._JPRB, (PWIND(JL)-ZLTS2(JL)) *PWIND(JL)*PWIND(JL) ) + +!- preferred approach: flux is based on MODIS-derived UVis_Alb (0.3-0.7 um) + IF (LE4ALB) THEN +! IF (PALBD(JL,1) >= 0.20_JPRB .AND. PALBD(JL,1) < 0.55_JPRB ) THEN + IF (PALBD(JL,1) >= 0.08_JPRB .AND. PALBD(JL,1) < 0.55_JPRB ) THEN + ZFLX_SDUST(JL,JAER,3)= ZDEP2(JL) * PALBD(JL,1) * ZWND3(JL) + ENDIF +!-- alternate approach, if MODIS-derived albedo not available, use total albedo + ELSE + ZFLX_SDUST(JL,JAER,3)= ZDEP2(JL) * PALB(JL) * ZWND3(JL) + + ENDIF + + LLDUST(JL,3)=.TRUE. + PAERFLX(JL,3,JAER) = ZFLX_SDUST(JL,JAER,3) + !write(9504,*)ZFLX_SDUST(JL,JAER,3) + !if (NSTEP==2.or.NSTEP==3 )write(9501,*)JAER,ZDEP2(JL), ZDUEMPOT(JL,JAER),PALB(JL) + !write(9502,*)PALB(JL) + !write(9503,*)ZWND3(JL) + ENDIF + ENDDO +ENDDO +ENDIF ! case NDDUST == 3 + +!-- PCFLX in kg m-2 s-1 + +DO JAER=1,KBINDD + INBAER=INBAER+1 + DO JL=KIDIA,KFDIA + IF (LLDUST(JL,NDDUST) .AND. ZFLX_SDUST(JL,JAER,NDDUST) > 0._JPRB) THEN + ZFLX_SDUST(JL,JAER,NDDUST)=ZFLX_SDUST(JL,JAER,NDDUST) + ENDIF + !PCFLX(JL,KAERO(INBAER))=-ZFLX_SDUST(JL,JAER,NDDUST) * 1.E+00_JPRB + if (JAER<2) then + !---- + ! accumulation mode + ! number + emis_number(mode_aci)%d3(JL,KLEV,1) = emis_number(mode_aci)%d3(JL,KLEV,1) +ZFLX_SDUST(JL,JAER,NDDUST)* 3. / (4.*RPI*ddust*mmr_ai**3) * EXP(4.5*LOG(sigma(iacci))**2) + ! mass + emis_mass(mode_aci)%d3(JL,KLEV,1) = emis_mass(mode_aci)%d3(JL,KLEV,1)+ZFLX_SDUST(JL,JAER,NDDUST)!flux_ai(KIDIA:KFDIA) + else if(JAER>=2 )then + + ! ------------------------------ + ! coarse mode + ! number + emis_number(mode_coi)%d3(JL,KLEV,1) = emis_number(mode_coi)%d3(JL,KLEV,1) +ZFLX_SDUST(JL,JAER,NDDUST)* 3. / (4.*RPI*ddust*mmr_ci**3) * EXP(4.5*LOG(sigma(icoai))**2) + ! mass + emis_mass(mode_coi)%d3(JL,KLEV,1) = emis_mass(mode_coi)%d3(JL,KLEV,1) +ZFLX_SDUST(JL,JAER,NDDUST) + end if + ENDDO +END DO +!-- if no vertical diffusion, distribute the flux in layers with scale height +!-- between half-levels IHTST-1 and KLEV +!!$ IF (.NOT.LVDFTRAC) THEN +!!$ DO JK=IHTST,KLEV +!!$ DO JL=KIDIA,KFDIA +!!$ ZDETAH(JL,JK) = ZETAH(JL,JK)**ZHDD - ZETAH(JL,JK-1)**ZHDD +!!$ PTENC(JL,JK,KAERO(INBAER)) = PTENC(JL,JK,KAERO(INBAER))+PCFLX(JL,KAERO(INBAER))*ZDETAH(JL,JK) +!!$ ENDDO +!!$ ENDDO +!!$ ENDIF +!!$ ENDDO + + +END ASSOCIATE +END ASSOCIATE +IF (LHOOK) CALL DR_HOOK('TM5M7_SRC_DUST',1,ZHOOK_HANDLE) +END SUBROUTINE TM5M7_SRC_DUST + diff --git a/ifs-source/arpifs/phys_ec/tm5m7_src_dust_init.F90 b/ifs-source/arpifs/phys_ec/tm5m7_src_dust_init.F90 new file mode 100644 index 00000000..8cbfaad7 --- /dev/null +++ b/ifs-source/arpifs/phys_ec/tm5m7_src_dust_init.F90 @@ -0,0 +1,208 @@ +SUBROUTINE TM5M7_SRC_DUST_INIT + +!*** * TM5M7_SRC_DUST_INIT* - SOURCE TERMS FOR DUST AEROSOLS +! +! Online dust emissions based on Tegen/Vignati/Strunk +! --------------------------------------------------- +! +! Please read the section above for background information about the underlying +! approach. An improved and modified online implementation has been accomplished +! from which. It can be activated by setting +! +! input.emis.dust : ONLINE +! +! in the rc-file. An additional netcdf file is needed for some input parameters. +! The path to which needs to be defined in the key +! +! input.emis.dust.dir : /ms_perm/TM/TM5/emissions/other/Dust_online/onlinedust.nc +! +! For every time step there will be particles emitted, scaled to monthly +! amounts (both mass and numbers) in order to keep compliance with assumptions +! about the aerosol emissions in sedimentation.F90. +! +! +!** INTERFACE. +! ---------- +! *TM5M7_SRC_DUST_INIT* IS CALLED FROM *TM5M7_INIT*. + +! AUTHOR. +! ------- +! +! T. van Noije et al. (?) +! +! SOURCE. +! ------- +! +! MODIFICATIONS. +! -------------- +! +! Nov 2011 - Achim Strunk - v0 +! +! xxxx - ?? +! +! Sep 2020 - V. Huijnen: first (partial) introduction into OpenIFS +!----------------------------------------------------------------------- + +USE PARKIND1 ,ONLY : JPIM ,JPRB +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK + +USE YOMCST, ONLY : RPI, RG +USE TM5M7_DATA, ONLY : DDUST +USE TM5M7_EMIS_DATA, ONLY : nmode, nats,nclass, solspe, UTH, SREL, SRELV, SU_SRELV, & + & DMIN, DMAX,DSTEP, A_RNOLDS,B_RNOLDS,X_RNOLDS, ROA, D_THRSLD + +IMPLICIT NONE + +!----------------------------------------------------------------------- + +!* 0.1 ARGUMENTS +! --------- + +! ... None ... + + +!* 0.2 LOCAL VARIABLES +! --------------- + +INTEGER(KIND=JPIM) :: NN, ND, NS, KK, NM, NSI, NP +REAL(KIND=JPRB) :: BB, CCC, DDD, EE, FF, DP, XK, STOTAL,STOTALV +REAL(KIND=JPRB) :: SU, SUV, SU_LOC, SU_LOCV, XL, XM, XN, XNV + +REAL, DIMENSION(:), ALLOCATABLE :: su_class, su_classv, utest + +REAL(KIND=JPRB) :: ZHOOK_HANDLE +!----------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('TM5M7_SRC_DUST_INIT',0,ZHOOK_HANDLE) + + +! global fields, which have to be available throughout the whole + + +! only needed within "initial" +ALLOCATE( su_class ( nclass ) ) +ALLOCATE( su_classv( nclass ) ) +ALLOCATE( utest ( nats ) ) + + +! --------------------------------------------- +! read input file ... CHECK HOW TO HANDLE THIS ... +! --------------------------------------------- + + + +!--------------------------------------------------------------------------------------- +! initializations +!--------------------------------------------------------------------------------------- +uth = 0. +srel = 0. ! fraction of the grid area correspondent to each soil population +srelV = 0. ! fraction of volume +su_srelV = 0. +utest = 0. + +!--------------------------------------------------------------------------------------- +! Uth calculation +! Threshold friction velocity dependent on the particle diameter +! following Eqs. (3-5) in MB95. +!--------------------------------------------------------------------------------------- +nn = 0 +dp = Dmin +DO WHILE( dp <= Dmax + 1E-05 ) + nn = nn + 1 + BB = a_rnolds * (dp ** x_rnolds) + b_rnolds + XK = SQRT(ddust * RG *100. * dp / roa) ! grav should be in cm s-2 + CCC = SQRT(1. + d_thrsld /(dp ** 2.5)) + IF( BB < 10. ) THEN + DDD = SQRT(1.928 * (BB ** 0.092) - 1.) + Uth(nn) = 0.129 * XK * CCC / DDD + ELSE + EE = -0.0617 * (BB - 10.) + FF = 1. -0.0858 * EXP(EE) + Uth(nn) = 0.12 * XK * CCC * FF + END IF + dp = dp * EXP(Dstep) +END DO + + +!--------------------------------------------------------------------------------------- +! surface calculation - calculation of the soil size distribution +! Through all soil particle diameter the calculation of the relative contribution +! in surface and volume of the soil population independently of the grid +!--------------------------------------------------------------------------------------- +DO ns = 1, nats ! soil types + + Stotal = 0. + StotalV = 0. + su_class = 0. + su_classV = 0. + + kk = 0 + dp = Dmin + DO WHILE( dp <= Dmax + 1.0E-5 ) + kk = kk + 1 + su = 0. + suV = 0. + DO nm = 1, Nmode ! particle size populations in soils + nd = ((nm - 1) *3 ) + 1 ! index to mass median diameter + nsi = nd + 1 ! index to standard deviation + np = nd + 2 ! index to relative contribution + ! + ! based on soil type and contribution of population of the soil type the soil size + ! distribution population is calculated + ! + + !>>> TvN + ! Bug in the original code: nd should be np + ! Since solspe(ns,nd) is never zero + ! and the final result is proportional to solspe(ns,np), + ! the bug has no impact on the results. + !IF (solspe(ns,nd).EQ.0.) THEN + IF (solspe(ns,np).EQ.0. .or. solspe(ns,nsi).EQ.0..or. solspe(ns,nd).EQ.0.) THEN + !<<< TvN + su_loc = 0. + su_locV=0. + ELSE + xk = solspe(ns,np)/(SQRT(2.* RPI)*LOG(solspe(ns,nsi))) + xl = ( (LOG(dp) - LOG( solspe(ns,nd ) ))**2 ) / & + (2.*(LOG( solspe(ns,nsi) ))**2 ) + xm = xk * EXP(-xl) ! value of the lognormal mass size distribution + ! dM/dln(dp) in Eq. (29) in MB95 + ! (Aerosol Sci. Technol., 1994) + xn = ddust*(2./3.)*(dp/2.) ! surface + ! cf. the denominator in Eq. (30) in MB95 + ! The factor 2 difference is irrelevant, + ! since only relative contributions are used. + xnV = 1. !volume + su_loc = (xm*Dstep/xn) ! Eq. (30) in MB95 + su_locV = (xm*Dstep/xnV) + END IF ! + su = su + su_loc + suV = suV + su_locV + END DO !Nmode + + su_class(kk) = su + su_classV(kk) = suV + Stotal = Stotal + su + StotalV = StotalV + suV + dp = dp * EXP(Dstep) + END DO !dp + + DO nn = 1,Nclass + IF (Stotal.EQ.0.)THEN + srel (ns,nn) = 0. + srelV(ns,nn) = 0. + ELSE + srel (ns,nn) = su_class(nn)/Stotal + srelV (ns,nn) = su_classV(nn)/StotalV + utest (ns ) = utest(ns)+srelV(ns,nn) + su_srelV(ns,nn) = utest(ns) + END IF + END DO !j=1,nclass +END DO !ns (soil type) + + +DEALLOCATE( su_class, su_classV, utest ) + + +IF (LHOOK) CALL DR_HOOK('TM5M7_SRC_DUST_INIT',1,ZHOOK_HANDLE) +END SUBROUTINE TM5M7_SRC_DUST_INIT + diff --git a/ifs-source/arpifs/phys_ec/tm5m7_src_ss.F90 b/ifs-source/arpifs/phys_ec/tm5m7_src_ss.F90 new file mode 100644 index 00000000..09cb86c9 --- /dev/null +++ b/ifs-source/arpifs/phys_ec/tm5m7_src_ss.F90 @@ -0,0 +1,373 @@ +SUBROUTINE TM5M7_SRC_SS & + &( YDEAERSRC, KIDIA, KFDIA, KLON, KLEV, & + & PCI , PCLAKE, PLSM , PSST, PWIND, & + & emis_mass, emis_number & + &) + +!*** * TM5M7_SRC_SS* - SOURCE TERMS FOR SEA SALT AEROSOLS + +!** INTERFACE. +! ---------- +! *TM5M7_SRC_SS* IS CALLED FROM *TM5M7_SRC*. + +! AUTHOR. +! ------- +! +! T. van Noije et al. +! +! SOURCE. +! ------- +! !DESCRIPTION: Calculate emitted numbers and mass as function of the ten-meter +! wind speed as described in Vignati et al. (2010) and Gong +! (2003). Sea salt is emitted in both the soluble accumulation +! mode and the soluble coarse mode. +! +! Ref: Vignati et al. (2010) : Global scale emission and +! distribution of sea-spray aerosol: Sea-salt and organic +! enrichment, Atmos. Environ., 44, 670-677, +! doi:10.1016/j.atmosenv.2009.11.013 +! +! Gong (2003) : A parameterization of sea-salt aerosol source +! function for sub- and super-micron particles, Global +! Biogeochem. Cy., 17, 1097, doi:10.1029/2003GB002079 + +! MODIFICATIONS. +! -------------- +! +! ? ??? 2006 - EV and MK - changed for introducing the sea salt +! source function developed from Gong (2003) in two modes +! ? ??? ???? - AJS - switch from default aerocom emissions to Gong +! parameterisation if 'seasalt_emis_gong' is defined. +! 1 Sep 2010 - Achim Strunk - deleted procedures +! - removed with_seasalt-switch +! - introduced vertical splitting +! 25 Jun 2012 - Ph. Le Sager - adapted for lon-lat MPI domain decomposition +! April 2015 - T. van Noije - modified mode prefactors +! Sep 2020 - V. Huijnen: first (partial) introduction into OpenIFS +!----------------------------------------------------------------------- + +USE PARKIND1 ,ONLY : JPIM ,JPRB +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK + +USE YOEAERSRC ,ONLY : TEAERSRC!YREAERSRC +!USE YOEAERSNK, ONLY : YREAERSNK +USE YOMCST, ONLY : RPI +USE TM5M7_DATA, ONLY: NMOD, MODE_ACS, MODE_COS, sigma_lognormal, SS_DENSITY +USE TM5M7_EMIS_DATA, ONLY : MODAL_EMISSIONS, radius_ssa, radius_ssc + +IMPLICIT NONE + +!----------------------------------------------------------------------- + +!* 0.1 ARGUMENTS +! --------- +TYPE(TEAERSRC) ,INTENT(IN) :: YDEAERSRC +INTEGER(KIND=JPIM),INTENT(IN) :: KLON +INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA +INTEGER(KIND=JPIM),INTENT(IN) :: KFDIA +INTEGER(KIND=JPIM),INTENT(IN) :: KLEV + + +REAL(KIND=JPRB) ,INTENT(IN) :: PCI(KLON), PCLAKE(KLON), PLSM(KLON), PSST(KLON) +REAL(KIND=JPRB) ,INTENT(IN) :: PWIND(KLON) ! 10m wind speed, see tm5m7_src.F90 + +TYPE(MODAL_EMISSIONS),INTENT(INOUT) :: emis_mass(NMOD) +TYPE(MODAL_EMISSIONS),INTENT(INOUT) :: emis_number(NMOD) + + +!* 0.5 LOCAL VARIABLES +! --------------- + +INTEGER(KIND=JPIM) :: JL +REAL(KIND=JPRB) :: NORM, XSEA, AREA_FRAC, TT, T_SCALE, DENS, RG1, RG2 +REAL(KIND=JPRB) :: EMIS_FAC(KLON) +REAL(KIND=JPRB) :: NUMBER(KLON), MASS(KLON) + + +REAL(KIND=JPRB) :: ZHOOK_HANDLE +!----------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('TM5M7_SRC_SS',0,ZHOOK_HANDLE) + +ASSOCIATE(RSSFLX=>YREAERSRC%RSSFLX) + + + !>>> TvN + ! The parameterization of Gong (2003) + ! gives the particle number flux as a function + ! of the radius and the 10-m wind speed u_10: + ! dF/dr80 = f(u_10) x g(r80). + ! The dependence on wind speed is given by + ! the power law f(u_10) = u_10^3.41, + ! and does not affect the size distribution. + ! r80 is the radius at 80% humidity, + ! which is almost exactly 2.0 times the dry radius + ! (Lewis and Schwartz, Sea Salt Aerosol Production, 2004). + ! Note also that in Eq. (2) of Gong + ! B is defined in terms of log(10,r) not ln(r). + ! + ! The number mean radii defined in chem_param.F90, + ! i.e. 0.09 um for the accumulation mode, + ! and 0.794 for the coarse mode, + ! were obtained by fitting an accumulation + ! and coarse mode to the dF/dln(r), + ! with r the dry particle radius + ! (see presentation E. Vignati, 21 December 2005). + ! It was verified that the size distribution of Gong + ! can be reasonable well described using these mode radii. + ! + ! It is not totally clear how the corresponding prefactors + ! for the two modes were obtained. + ! One way to calculate these prefactors, + ! is to define two size ranges + ! and require that the numbers of particles emitted + ! in both ranges correspond to Gong + ! This procedure is similar to that used in emission_dust.F90, + ! but for particle number instead of mass. + ! Using ranges r1 and r2 for the dry particle radii + ! with r1 from 0.05 to 0.5 um and r2 from 0.5 to 5 um, + ! the resulting prefactors are 9.62013e-3 and 9.05658e-4 + ! for the accumulation and coarse mode, respectively. + ! These numbers are very close to the values + ! of 9e-3 and 9e-4, obtained by E. Vignati. + ! They are also insensitive to the + ! value used for the upper bound of r2. + ! (Using a value of 10 instead of 5 um, + ! the prefactors would be 9.62536e-3 and 8.91184e-3.) + ! + + norm=1E4 * 1._JPRB * 1._JPRB ! Conversion from #/cm2 to #/m2 + + !TB added zero init in case no sea + emis_fac(:) = 0.0_JPRB + + DO JL=KIDIA,KFDIA + +!VH norm = 1.e4 * dxy11(JL) * sec_month ! Used in TM5.. +!VH but dxy11 is not available.. use unity area and per sec. instead.. + + ! sea fraction + xsea=1.-PLSM(JL) + + ! sea salt is emitted only over sea without ice cover + area_frac = xsea * (1.-PCI(JL)) + !write(6566,*)area_frac,xsea,PCI(JL),PCLAKE(JL) + if (area_frac .LT. 1.e-10_JPRB .or. PCLAKE(JL)>0.0_JPRB) CYCLE + + emis_fac(JL) = norm * area_frac + + ! Wind speed dependence following W10 parameterization + ! of Salisbury et al. (JGR, 2013; GRL, 2014), + ! which replaces the dependence of Gong. + ! Salisbury et al. suggest that "at this stage ... + ! use of W10 is preferable to W37". + ! In TM5, W10 gives better results than W37, + ! which leads to high AOD values compared to MODIS C6, + ! at mid- and high latitudes. + ! The same is true for the wind dependence + ! proposed by Albert et al. (ACPD, 2015). + ! xwind = SQRT(u10m_dat(iglbsfc)%data(JL,1)**2+v10m_dat(iglbsfc)%data (JL,1)**2) + + ! Revert to original wind speed dependence of Monahan et al. (1986) + ! used by Gong (2003): + !emis_fac(JL) = emis_fac(JL) * W10_fac * xwind**W10_exp + emis_fac(JL) = emis_fac(JL) * PWIND(JL)**3.41 + ENDDO + !<<< TvN + + !=================== + ! Accumulation mode + !=================== + + ! emitted numbers + ! --------------- + DO JL=KIDIA,KFDIA + !>>> TvN + ! sea fraction + !xsea=1.-PLSM(JL) + + !xwind=SQRT(u10m_dat(iglbsfc)%data(JL,1)**2+v10m_dat(iglbsfc)%data (JL,1)**2) + + !number(JL) = 0.009*xwind**(3.4269)*1e4*dxy11(j)*xsea*(1.-ci_dat(iglbsfc)%data(JL,1))*sec_month ! #/gridbox/month + number(JL) = emis_fac(JL)*9.62013e-3 ! #/m2/sec + !TB emis_fac includes all the rest but first multiplier + !although dxy11 is not there, assumed 1 earlier, is that correct? + ! multiplier needs an explanation! + ! cm2->m2*land*ice*wind*prefacor (see above) + ! 1e4* (1-PLSM)*(1-pci)* pwind**3.41*9.602e-3 + + !Include temperature dependence following Salter et al. (ACP, 2015). + !We assume that the emissions in our accumulation mode + !follow the temperature dependence of the smallest mode described by Santer et al. + !In reality our mode is in between the smallest and middle mode of Santer et al., + !so the temperature dependence might also be. + !The corresponding third-order polynomial for the smallest mode + !decreases with temperature between -1 and about 15 degC, + !remains almost constant between 15 degC and 25 degC, + !and shows a very small decrease between 25 degC and 30 degC. + !The latter dependence seems an artefact of the fitting procedure, + !and is neglected here. + !As for the coarse mode, + !we rescale the polynomial of Salter et al. + !so that it goes through 1 at some reference temperature, + !which can currently be set to either 15 or 20 degC. + !Because of the small difference between 15 and 20 degC, + !it really doesn't matter which reference value + !is chosen for the accumulation mode. + !This temperature dependency is used to produce + !the pre-industrial aerosol climatology v4.0, + !which is used in all CMIP6 versions of EC-Earth3 that use MACv2-SP, + !and will therefore also be used in EC-Earth3-AerChem. + ! PSST in Kelvin + tt=max(-1.,PSST(JL)-273.15_JPRB) + + !For a reference temperature of 20 degC, use: + !if (tt .lt. 20.) then + ! t_scale = -8.88108055e-5*tt*tt*tt + 5.64728654e-3*tt*tt & + ! -0.118363619*tt + 1.81884421 + ! number(JL) = number(JL) * t_scale + !endif + !For a reference temperature of 15 degC, use: + if (tt .lt. 15.) then + t_scale = -8.75593266e-5*tt*tt*tt + 5.56770771e-3*tt*tt & + -0.116695696*tt + 1.79321393 + number(JL) = number(JL) * t_scale + endif + + !Using the above relation we still underestimate CDNC by a factor 2 to 4 + !over the Soutern Ocean. + !The enhancement factor from Salter et al. (2015) is only 1.9 at -1 degC, + !while earlier studies measured a stronger enhancement + !in the number of submicron particles as SST decreases + !from about 9 to -1 (or -1.3) degC + !(Salter et al., JGR, 2014, Bowyer et al., JGR, 1990; + !Zabori et al. (ACP, 2012a; 2012b) + !In these studies the enhancement at about -1 degC varies + !from ~3 (Salter et al.; Bowyer et al., 1990), + !~7 (Zabori et al., 2012b), to ~10 (Zabori et al., 2012a). + !As the studies don't provide an expression for the enhancement factor + !as a function of temperature, + !I have approximated it by a quadratic function + !which reaches 1 at t0=9 degC with a zero slope: + ![(F-1)/(t0-tmin)^2]*(t-t0)^2 + 1 + !where F is the enhancement factor at tmin=-1 degC. + !Using t0=9 and tmin=-1, the quadratic coefficient + !becomes (F-1)/100. + !I have implemented this expression for F=3, F=5, and F=7. + !With F=5 or F=7, the zonal mean AOD over the Southern Ocean + !is overestimated at high latitudes + !compared to observational estimates from AATSR. + !For v5.0 of the pre-industrial aerosol climatology + !we have therefore used F=3. + !tt=max(-1.,temperature(JL)) + !if (tt .lt. 9.) then + !F=3: + !t_scale = 0.02*(tt-9.)*(tt-9.) + 1.0 + !F=5: + !t_scale = 0.04*(tt-9.)*(tt-9.) + 1.0 + !F=7: + !t_scale = 0.06*(tt-9.)*(tt-9.) + 1.0 + !number(JL) = number(JL) * t_scale + !endif + !<<< TvN + END DO + + ! vertically distribute according to sector + ! CALL emission_vdist_by_sector( splittype, 'SS', region, emis_temp(region), emis3d, status ) + + ! For now fill in surface layer + emis_number(mode_acs)%d3(KIDIA:KFDIA,KLEV,4) = number(KIDIA:KFDIA) !#/m2/sec + !write(6565,*) number(KIDIA:KFDIA) + + ! emitted mass + ! ------------ + dens = ss_density*0.001 ! in g/cm3 + rg1 = radius_ssa*1e6 ! in micron + mass(KIDIA:KFDIA) = number(KIDIA:KFDIA)*RPI*4./3. *(rg1*1e-4)**3 & + & * EXP(9./2.*log(sigma_lognormal(3))**2)*dens*1e-3 ! kg/m2/sec + + + ! vertically distribute according to sector + ! CALL emission_vdist_by_sector( splittype, 'SS', region, emis_temp(region), emis3d, status ) + emis_mass (mode_acs)%d3(KIDIA:KFDIA,KLEV,4) = mass(KIDIA:KFDIA) !kg/m2/sec + + + !=================== + ! Coarse mode + !=================== + + ! emitted numbers + ! --------------- + DO JL=KIDIA,KFDIA + ! >>> TvN + ! sea fraction + !xsea=1.-lsmask_dat(iglbsfc)%data(JL,1)/100. + + !xwind=SQRT(u10m_dat(iglbsfc)%data(JL,1)**2+v10m_dat(iglbsfc)%data (JL,1)**2) + + !number(JL) = 0.0009*xwind**(3.4195)*dxy11(j)*1e4*xsea*(1.-ci_dat(iglbsfc)%data(JL,1))*sec_month !#/cm2/s-->#/gridbox/month + number(JL) = emis_fac(JL)*9.05658e-4 !#/cm2/s-->#/m2/sec + !TB + ! multiplier needs an explanation! + + !Include temperature dependence following Salter et al. (ACP, 2015). + !We assume that the emissions in our coarse mode + !follow the temperature dependence of the largest mode described by Santer et al. + !Indeed, the mode radii of these modes are close (0.794 vs. 0.75 micron). + !The corresponding second-order polynomial (valid between -1 and 30 degC) + !shows almost linear increase with temperature. + !The higher order terms are therefore irrelevant. + !We rescale the resulting linear function + !so that it goes through 1 at some reference temperature, + !which can currently be set to either 15 or 20 degC. + !The resulting expression is then used as + !an additional factor multiplying the expression from Gong. + !Gong uses the relation between whitecap coverage and wind speed + !from Monahan and Muircheartaigh (1980). + !It was derived from data in the Atlantic and Pacific Ocean, + !where most measurements were made at sea water temperatures + !between 20 and 30 degC: 46 out of 54 points in the Atlantic data set + !and all 36 points in the Pacific data set. + !Based on this, one would argue that a reference temperature + !in the range 20-25 degC would be most reasonable. + !As the emissions in the coarse mode increase with temperature, + !the smaller the reference temperature the higher the emissions. + !For example, the emissions will increase by 18.76% + !when the reference temperature is reduced from 20 to 15 degC. + !The resulting temperature dependence is somewhat weaker than + !the quasi-linear dependence obtained by Ovadnevaite et al. + ![ACP, 2014; see also Gantt et al., GMD, 2015, Eq. (2)]. + !The function proposed by Jaegle et al. (JGR, 2011) + !oscillates around or mostly below + !(reference temperature at 20 degC or 15 degC, resp.) + !our linear function up to about 20 degC, + !but increases more strongly at higher temperatures. + !For CMIP6 a reference temperature of 15 degC is used. + ! PSST in Kelvin + tt=min(30.,max(-1.0,PSST(JL)-273.15)) + !For a reference temperature of 20 degC, use: + !t_scale = 0.03159982*tt + 0.36800362 + !For a reference temperature to 15 degC, use: + t_scale = 0.03752944*tt + 0.43705846 + number(JL) = number(JL) * t_scale + ! <<< TvN + ENDDO + + !VH: For now emitted at surface, to be fixed + emis_number(mode_cos)%d3(KIDIA:KFDIA,KLEV,4) = number(KIDIA:KFDIA) !#/grid/month + + + ! emitted mass + ! ------------ + dens = ss_density*0.001 ! im g/cm3 + rg2 = radius_ssc*1e6 ! in micron + mass(KIDIA:KFDIA) = number(KIDIA:KFDIA)*RPI*4./3. *(rg2*1e-4)**3 * EXP(9./2.*log(sigma_lognormal(4))**2)*dens*1e-3 ! kg/m2/sec + + !For now introduce emissions in surface layer. Should be fixed. + emis_mass(mode_cos)%d3(KIDIA:KFDIA,KLEV,4) = mass(KIDIA:KFDIA) !kg/m2/sec + + + +END ASSOCIATE +IF (LHOOK) CALL DR_HOOK('TM5M7_SRC_SS',1,ZHOOK_HANDLE) +END SUBROUTINE TM5M7_SRC_SS + diff --git a/ifs-source/arpifs/phys_radi/raddrv.F90 b/ifs-source/arpifs/phys_radi/raddrv.F90 index a1721699..010f6129 100644 --- a/ifs-source/arpifs/phys_radi/raddrv.F90 +++ b/ifs-source/arpifs/phys_radi/raddrv.F90 @@ -83,7 +83,7 @@ SUBROUTINE RADDRV(YDGEOMETRY,YDFIELDS,YDMODEL,KGPTOT,KFLDS,KBLOCKS,PGPIN) USE GEOMETRY_MOD , ONLY : GEOMETRY USE PARKIND1 , ONLY : JPIM, JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK - +USE YOMCT3 , ONLY : NSTEP ! ------------------------------------------------------------------ IMPLICIT NONE @@ -196,6 +196,9 @@ SUBROUTINE RADDRV(YDGEOMETRY,YDFIELDS,YDMODEL,KGPTOT,KFLDS,KBLOCKS,PGPIN) REAL(KIND=JPRB) :: ZTRENU9T(KGPTOT) REAL(KIND=JPRB) :: ZVFLSMT (KGPTOT) +REAL(KIND=JPRB), ALLOCATABLE :: ZRE_LIQT(:,:) +REAL(KIND=JPRB), ALLOCATABLE :: ZRE_ICET(:,:) + !-- REAL(KIND=JPRB) :: ZFRTED (KGPTOT,YDMODEL%YRML_PHY_RAD%YRERAD%NLWOUT) REAL(KIND=JPRB) :: ZTRSODT (KGPTOT) @@ -245,6 +248,13 @@ SUBROUTINE RADDRV(YDGEOMETRY,YDFIELDS,YDMODEL,KGPTOT,KFLDS,KBLOCKS,PGPIN) REAL(KIND=JPRB), ALLOCATABLE :: Z2T9T (:,:) REAL(KIND=JPRB), ALLOCATABLE :: Z2O39T (:,:) REAL(KIND=JPRB), ALLOCATABLE :: ZAEROT(:,:,:) + + +REAL(KIND=JPRB), ALLOCATABLE :: ZAEROTAU(:,:,:) +REAL(KIND=JPRB), ALLOCATABLE :: ZAEROASYM(:,:,:) +REAL(KIND=JPRB), ALLOCATABLE :: ZAEROSSA(:,:,:) +REAL(KIND=JPRB), ALLOCATABLE :: ZAEROTAULW(:,:,:) + REAL(KIND=JPRB), ALLOCATABLE :: ZLWDERIVATIVE(:,:) INTEGER(KIND=JPIM) :: IBL, IEND, IFDIA, IGL1,& @@ -269,11 +279,14 @@ SUBROUTINE RADDRV(YDGEOMETRY,YDFIELDS,YDMODEL,KGPTOT,KFLDS,KBLOCKS,PGPIN) & YDDIM=>YDGEOMETRY%YRDIM,YDDIMV=>YDGEOMETRY%YRDIMV, YDGEM=>YDGEOMETRY%YRGEM, & & YDGSGEOM=>YDGEOMETRY%YRGSGEOM, YDOROG=>YDGEOMETRY%YROROG, YDEPHY=>YDMODEL%YRML_PHY_EC%YREPHY, & & YDPHY=>YDMODEL%YRML_PHY_MF%YRPHY,YDRADF=>YDMODEL%YRML_PHY_RAD%YRRADF, & + & YDAERM7=>YDMODEL%YRML_PHY_AER%YREAEROPT, & ! use this to transfer AOD, SSA and ASY to rad scheme + & YDRIP=>YDMODEL%YRML_GCONF%YRRIP, & & YDERAD=>YDMODEL%YRML_PHY_RAD%YRERAD,YGFL=>YDMODEL%YRML_GCONF%YGFL,YDERDI=>YDMODEL%YRML_PHY_RAD%YRERDI, & & YDCHEM=>YDMODEL%YRML_CHEM%YRCHEM, YDSPP_CONFIG=>YDMODEL%YRML_GCONF%YRSPP_CONFIG, YDSPP=>YDMODEL%YRML_SPP) ASSOCIATE(NACTAERO=>YGFL%NACTAERO, NAERO=>YGFL%NAERO, NDIM=>YGFL%NDIM, & & YAERO=>YGFL%YAERO, YI=>YGFL%YI, YL=>YGFL%YL, YO3=>YGFL%YO3, YQ=>YGFL%YQ, & + & YRE_LIQ=>YGFL%YRE_LIQ, YRE_ICE=>YGFL%YRE_ICE, & & YR=>YGFL%YR, YS=>YGFL%YS,NFSD=>YGFL%NFSD, & & GFL=>YDGFL%GFL,GMVT1=>YDGMV%GMVT1,GMVT1S=>YDGMV%GMVT1S, & & GMV=>YDGMV%GMV,GMVS=>YDGMV%GMVS,YT1=>YDGMV%YT1,YPH9=>YDGMV%YPH9, & @@ -281,6 +294,7 @@ SUBROUTINE RADDRV(YDGEOMETRY,YDFIELDS,YDMODEL,KGPTOT,KFLDS,KBLOCKS,PGPIN) & NFLEVG=>YDDIMV%NFLEVG, LERADIMPL=>YDEPHY%LERADIMPL, & & LAPPROXLWUPDATE=>YDERAD%LAPPROXLWUPDATE, LDIAGFORCING=>YDERAD%LDIAGFORCING, & & LEPO3RA=>YDERAD%LEPO3RA, NMODE=>YDERAD%NMODE, NRPROMA=>YDERAD%NRPROMA, & + & NCLOUDACT=>YDERAD%NCLOUDACT, & & NTSW=>YDERAD%NTSW, NLWEMISS=>YDERAD%NLWEMISS, NLWOUT=>YDERAD%NLWOUT, & & RCARDI=>YDERDI%RCARDI, & & NGPTOT=>YDGEM%NGPTOT, & @@ -334,13 +348,30 @@ SUBROUTINE RADDRV(YDGEOMETRY,YDFIELDS,YDMODEL,KGPTOT,KFLDS,KBLOCKS,PGPIN) ALLOCATE(ZFSDT(KGPTOT,NFLEVG)) ELSE ALLOCATE(ZFSDT(1,1)) -ENDIF +ENDIF + IF(NACTAERO > 0) THEN ALLOCATE(ZAEROT(KGPTOT,NFLEVG,NAERO)) + ALLOCATE(ZAEROTAU(KGPTOT,NFLEVG,14)) + ALLOCATE(ZAEROSSA(KGPTOT,NFLEVG,14)) + ALLOCATE(ZAEROASYM(KGPTOT,NFLEVG,14)) + ALLOCATE(ZAEROTAULW(KGPTOT,NFLEVG,16)) ELSE ALLOCATE(ZAEROT(1,1,1)) + ALLOCATE(ZAEROTAU(1,1,1)) + ALLOCATE(ZAEROSSA(1,1,1)) + ALLOCATE(ZAEROASYM(1,1,1)) + ALLOCATE(ZAEROTAULW(1,1,1)) ENDIF +IF (NCLOUDACT > 0) THEN + ALLOCATE(ZRE_LIQT(KGPTOT,NFLEVG)) + ALLOCATE(ZRE_ICET(KGPTOT,NFLEVG)) +ELSE + ALLOCATE(ZRE_LIQT(1,1)) + ALLOCATE(ZRE_ICET(1,1)) +END IF + IF( LRAYFM )THEN CALL GSTATS(1201,0) ! METEO FRANCE REQUIRE THESE ARRAYS @@ -627,7 +658,53 @@ SUBROUTINE RADDRV(YDGEOMETRY,YDFIELDS,YDMODEL,KGPTOT,KFLDS,KBLOCKS,PGPIN) ENDDO ENDDO ENDDO + + IF (NSTEP == YDRIP%NSTART) THEN + DO JAER=1,14 + DO JK=1,NFLEVG + DO JL=IST,IEND + ZAEROTAU(JSTGLO+JL-1,JK,JAER)=0.0 + ZAEROSSA(JSTGLO+JL-1,JK,JAER)=0.0 + ZAEROASYM(JSTGLO+JL-1,JK,JAER)=0.0 + ENDDO + ENDDO + ENDDO + DO JAER=1,16 + DO JK=1,NFLEVG + DO JL=IST,IEND + ZAEROTAULW(JSTGLO+JL-1,JK,JAER)=0.0 + ENDDO + ENDDO + ENDDO + else + DO JAER=1,14 + DO JK=1,NFLEVG + DO JL=IST,IEND + ZAEROTAU(JSTGLO+JL-1,JK,JAER) = YDAERM7%M7AOD(JL,JK,JAER,IBL) + ZAEROSSA(JSTGLO+JL-1,JK,JAER) = YDAERM7%M7SSA(JL,JK,JAER,IBL)*YDAERM7%M7AOD(JL,JK,JAER,IBL) + ZAEROASYM(JSTGLO+JL-1,JK,JAER)= YDAERM7%M7ASYM(JL,JK,JAER,IBL)*YDAERM7%M7SSA(JL,JK,JAER,IBL)*YDAERM7%M7AOD(JL,JK,JAER,IBL) + ENDDO + ENDDO + ENDDO + DO JAER=1,16 + DO JK=1,NFLEVG + DO JL=IST,IEND + ZAEROTAULW(JSTGLO+JL-1,JK,JAER)=YDAERM7%M7AODLW(JL,JK,JAER,IBL) + ENDDO + ENDDO + ENDDO ENDIF + ENDIF + + IF (NCLOUDACT > 0) THEN + DO JK=1,NFLEVG + DO JL=IST,IEND + ZRE_LIQT(JSTGLO+JL-1,JK) = GFL(JL,JK,YRE_LIQ%MP9_PH,IBL) + ZRE_ICET(JSTGLO+JL-1,JK) = GFL(JL,JK,YRE_ICE%MP9_PH,IBL) + END DO + END DO + END IF + DO JK=1,NFLEVG DO JL=IST,IEND ZDELP9T (JSTGLO+JL-1,JK)=ZDELP9(JL,JK) @@ -690,7 +767,8 @@ SUBROUTINE RADDRV(YDGEOMETRY,YDFIELDS,YDMODEL,KGPTOT,KFLDS,KBLOCKS,PGPIN) & NFLEVG ,NMODE,& & ZALBDT ,ZALBPT ,ZCCNLT ,ZCCNOT ,ZPRE9T ,ZPRE9FT ,RCARDI ,ZNEBT,& & ZQO3 ,ZAER ,ZAERMACCS,ZAERMACCL,ZAERMACCSJ,ZAERMACCLJ,& - & ZAERTGS,ZAERTGL,ZAEROT ,ZGHG,& + & ZAERTGS ,ZAERTGL ,ZAEROT ,ZGHG,& + & ZAEROTAU ,ZAEROSSA ,ZAEROASYM ,ZAEROTAULW,& & ZDELP9T ,ZSPECTRALEMISST,& & ZMU0MT ,Z2Q9T,& & ZQSATT ,ZQICET ,ZQSNOWT ,ZQLIT ,ZFSDT ,ZQRAIT ,ZRAITT,& @@ -700,7 +778,9 @@ SUBROUTINE RADDRV(YDGEOMETRY,YDFIELDS,YDMODEL,KGPTOT,KFLDS,KBLOCKS,PGPIN) ! ML: move zpertt before flux outputs & ZPERTT,& & ZEMITT ,ZTHT ,ZFRTED, ZTRSODT ,ZTRSODCT,ZTRTEDCT,ZSUDUT ,ZUVDFT ,ZPARFT ,ZPARCFT, ZTINCFT,& - & ZFDIRT ,ZCDIRT , ZLWDERIVATIVE ) + & ZFDIRT ,ZCDIRT , ZLWDERIVATIVE, & + & ZRE_LIQT, ZRE_ICET) + ! PERFORM RADIATION DIAGNOSTICS @@ -840,6 +920,9 @@ SUBROUTINE RADDRV(YDGEOMETRY,YDFIELDS,YDMODEL,KGPTOT,KFLDS,KBLOCKS,PGPIN) IF(ALLOCATED(ZAERTGS))DEALLOCATE(ZAERTGS) IF(ALLOCATED(ZAERTGL))DEALLOCATE(ZAERTGL) IF(ALLOCATED(ZLWDERIVATIVE)) DEALLOCATE(ZLWDERIVATIVE) +IF(ALLOCATED(ZRE_LIQT))DEALLOCATE(ZRE_LIQT) +IF(ALLOCATED(ZRE_ICET))DEALLOCATE(ZRE_ICET) + ! ------------------------------------------------------------------ END ASSOCIATE diff --git a/ifs-source/arpifs/phys_radi/radiation_scheme.F90 b/ifs-source/arpifs/phys_radi/radiation_scheme.F90 index 52537c5b..3a0c8f2f 100644 --- a/ifs-source/arpifs/phys_radi/radiation_scheme.F90 +++ b/ifs-source/arpifs/phys_radi/radiation_scheme.F90 @@ -17,12 +17,15 @@ SUBROUTINE RADIATION_SCHEME & & PQ, PCO2, PCH4, PN2O, PNO2, PCFC11, PCFC12, PHCFC22, PCCL4, PO3_DP, & & PCLOUD_FRAC, PQ_LIQUID, PQ_ICE, PQ_RAIN, PQ_SNOW, & & PAEROSOL_OLD, PAEROSOL, & + & PAEROM7_TAU, PAEROM7_SSA, PAEROM7_ASYM, & ! add for M7 aerosol & PFLUX_SW, PFLUX_LW, PFLUX_SW_CLEAR, PFLUX_LW_CLEAR, & & PFLUX_SW_DN, PFLUX_LW_DN, PFLUX_SW_DN_CLEAR, PFLUX_LW_DN_CLEAR, & & PFLUX_DIR, PFLUX_DIR_CLEAR, PFLUX_DIR_INTO_SUN, & & PFLUX_UV, PFLUX_PAR, PFLUX_PAR_CLEAR, & & PFLUX_SW_DN_TOA, PEMIS_OUT, PLWDERIVATIVE, & - & PSWDIFFUSEBAND, PSWDIRECTBAND, PPERT, PFSD) + & PSWDIFFUSEBAND, PSWDIRECTBAND, & + & PRE_LIQ, PRE_ICE, & + & PPERT, PFSD) ! RADIATION_SCHEME - Interface to modular radiation scheme ! @@ -146,6 +149,11 @@ SUBROUTINE RADIATION_SCHEME & REAL(KIND=JPRB), INTENT(IN) :: PAEROSOL_OLD(KLON,6,KLEV) REAL(KIND=JPRB), INTENT(IN) :: PAEROSOL(KLON,KLEV,KAEROSOL) +REAL(KIND=JPRB), INTENT(IN) :: PAEROM7_TAU(KLON,KLEV,14) +REAL(KIND=JPRB), INTENT(IN) :: PAEROM7_SSA(KLON,KLEV,14) +REAL(KIND=JPRB), INTENT(IN) :: PAEROM7_ASYM(KLON,KLEV,14) +!REAL(KIND=JPRB), INTENT(IN) :: PAEROM7_TAULW(KLON,KLEV,16) + REAL(KIND=JPRB), INTENT(IN) :: PCCN_LAND(KLON) REAL(KIND=JPRB), INTENT(IN) :: PCCN_SEA(KLON) @@ -193,6 +201,9 @@ SUBROUTINE RADIATION_SCHEME & REAL(KIND=JPRB), INTENT(OUT) :: PSWDIFFUSEBAND(KLON,YDMODEL%YRML_PHY_RAD%YRERAD%NSW) REAL(KIND=JPRB), INTENT(OUT) :: PSWDIRECTBAND (KLON,YDMODEL%YRML_PHY_RAD%YRERAD%NSW) +REAL(KIND=JPRB), INTENT(IN) :: PRE_LIQ(KLON,KLEV) +REAL(KIND=JPRB), INTENT(IN) :: PRE_ICE(KLON,KLEV) + ! SPP perturbations REAL(KIND=JPRB), INTENT(IN), OPTIONAL :: PPERT(KLON, YDMODEL%YRML_GCONF%YRSPP_CONFIG%SM%NRFTOTAL_RADGRID) @@ -204,7 +215,7 @@ SUBROUTINE RADIATION_SCHEME & TYPE(THERMODYNAMICS_TYPE) :: THERMODYNAMICS TYPE(GAS_TYPE) :: GAS TYPE(CLOUD_TYPE) :: YLCLOUD -TYPE(AEROSOL_TYPE) :: AEROSOL +TYPE(AEROSOL_TYPE) :: AEROSOL, AEROSOl_HAM TYPE(FLUX_TYPE) :: FLUX ! Mass mixing ratio of ozone (kg/kg) @@ -299,6 +310,9 @@ SUBROUTINE RADIATION_SCHEME & ENDIF CALL FLUX%ALLOCATE(RAD_CONFIG, 1, KLON, KLEV) + CALL AEROSOL_HAM%ALLOCATE(KLON, 1, KLEV, YRERAD%NTSW) ! HAM aerosols + !(Number of columns,istartlev, iendlev, number of SW+LW bands) + ! Set thermodynamic profiles: simply copy over the half-level ! pressure and temperature THERMODYNAMICS%PRESSURE_HL (KIDIA:KFDIA,:) = PPRESSURE_H (KIDIA:KFDIA,:) @@ -404,19 +418,28 @@ SUBROUTINE RADIATION_SCHEME & YLCLOUD%Q_ICE(KIDIA:KFDIA,:) = PQ_ICE(KIDIA:KFDIA,:) + PQ_SNOW(KIDIA:KFDIA,:) YLCLOUD%FRACTION(KIDIA:KFDIA,:) = PCLOUD_FRAC(KIDIA:KFDIA,:) + + + + +IF(NCLOUDACT > 0) THEN + ZRE_LIQUID_UM(KIDIA:KFDIA,:) = MAX(2.0E-06_JPRB, PRE_LIQ(KIDIA:KFDIA,:)) * 1.E6_JPRB + ZRE_ICE_UM(KIDIA:KFDIA,:) = PRE_ICE(KIDIA:KFDIA,:) * 1.E6_JPRB +ELSE ! Compute effective radii and convert to metres -CALL LIQUID_EFFECTIVE_RADIUS(YDMODEL%YRML_PHY_RAD%YRERAD, & - & YDMODEL%YRML_PHY_EC%YRECLDP,YDSPP_CONFIG,YDMODEL%YRML_GCONF%YGFL, & - & KIDIA, KFDIA, KLON, KLEV, & - & PPRESSURE, PTEMPERATURE, PCLOUD_FRAC, PQ_LIQUID, PQ_RAIN, & - & PLAND_SEA_MASK, PCCN_LAND, PCCN_SEA, & - & ZRE_LIQUID_UM, PPERT=PPERT) + CALL LIQUID_EFFECTIVE_RADIUS(YDMODEL%YRML_PHY_RAD%YRERAD, & + & YDMODEL%YRML_PHY_EC%YRECLDP,YDSPP_CONFIG,YDMODEL%YRML_GCONF%YGFL, & + & KIDIA, KFDIA, KLON, KLEV, & + & PPRESSURE, PTEMPERATURE, PCLOUD_FRAC, PQ_LIQUID, PQ_RAIN, & + & PLAND_SEA_MASK, PCCN_LAND, PCCN_SEA, & + & ZRE_LIQUID_UM, PPERT=PPERT) + + CALL ICE_EFFECTIVE_RADIUS(YRERAD, YDSPP_CONFIG, KIDIA, KFDIA, KLON, KLEV, & + & PPRESSURE, PTEMPERATURE, PCLOUD_FRAC, PQ_ICE, PQ_SNOW, PGEMU, & + & ZRE_ICE_UM, PPERT=PPERT) +ENDIF YLCLOUD%RE_LIQ(KIDIA:KFDIA,:) = ZRE_LIQUID_UM(KIDIA:KFDIA,:) * 1.0E-6_JPRB - -CALL ICE_EFFECTIVE_RADIUS(YRERAD, YDSPP_CONFIG, KIDIA, KFDIA, KLON, KLEV, & - & PPRESSURE, PTEMPERATURE, PCLOUD_FRAC, PQ_ICE, PQ_SNOW, PGEMU, & - & ZRE_ICE_UM, PPERT=PPERT) YLCLOUD%RE_ICE(KIDIA:KFDIA,:) = ZRE_ICE_UM(KIDIA:KFDIA,:) * 1.0E-6_JPRB ! Get the cloud overlap decorrelation length (for cloud boundaries), @@ -427,7 +450,6 @@ SUBROUTINE RADIATION_SCHEME & CALL CLOUD_OVERLAP_DECORR_LEN(YDMODEL%YRML_PHY_EC%YRECLD,KIDIA,KFDIA,KLON, & & PGEMU,YRERAD%NDECOLAT, & & PDECORR_LEN_EDGES_KM=ZDECORR_LEN_KM, PDECORR_LEN_RATIO=ZDECORR_LEN_RATIO) - ! prepare SPP IF (YDSPP_CONFIG%LSPP) THEN @@ -561,6 +583,25 @@ SUBROUTINE RADIATION_SCHEME & ENDDO ENDIF +!real(jprb), allocatable, dimension(:,:,:) :: & +! & od_sw, ssa_sw, g_sw, & ! Shortwave optical properties + + +AEROSOL_HAM%od_sw(KIDIA:KFDIA,:,:) = 0.0_JPRB +AEROSOL_HAM%ssa_sw(KIDIA:KFDIA,:,:) = 0.0_JPRB +AEROSOL_HAM%g_sw(KIDIA:KFDIA,:,:) = 0.0_JPRB +!Alaakso: Optical properties of HAM aerosols - Should be 0 if not used +IF (YRERAD%NAEROOPT>0) THEN +!already weighted (see aer_phy3_layer) SW + AEROSOL_HAM%od_sw(KIDIA:KFDIA,:,1:YRERAD%NTSW) =PAEROM7_TAU(KIDIA:KFDIA,:,1:YRERAD%NTSW) + AEROSOL_HAM%ssa_sw(KIDIA:KFDIA,:,1:YRERAD%NTSW) =PAEROM7_SSA(KIDIA:KFDIA,:,1:YRERAD%NTSW) + AEROSOL_HAM%g_sw(KIDIA:KFDIA,:,1:YRERAD%NTSW) =PAEROM7_ASYM(KIDIA:KFDIA,:,1:YRERAD%NTSW) +!!LW, need to make sure that PAEROM7_TAULW = 0, when NAEROOPT=1 (TM5 optics, no LW opt) +!aerosol_opt%aod(KIDIA:KFDIA,:,YRERAD%NTSW+1:YRERAD%NTSW+STRATO_CMIP6_NTB)=PAEROM7_TAULW(KIDIA:KFDIA,:,1:STRATO_CMIP6_NTB) +!aerosol_opt%ssa(KIDIA:KFDIA,:,YRERAD%NTSW+1:YRERAD%NTSW+STRATO_CMIP6_NTB)=0.0_JPRB !only absorbtion for LW +!aerosol_opt%asym(KIDIA:KFDIA,:,YRERAD%NTSW+1:YRERAD%NTSW+STRATO_CMIP6_NTB)=0.0_JPRB +ENDIF + ! Convert ozone Pa*kg/kg to kg/kg @@ -589,7 +630,7 @@ SUBROUTINE RADIATION_SCHEME & ! Call radiation scheme CALL RADIATION(KLON, KLEV, KIDIA, KFDIA, RAD_CONFIG,& - & SINGLE_LEVEL, THERMODYNAMICS, GAS, YLCLOUD, AEROSOL, FLUX) + & SINGLE_LEVEL, THERMODYNAMICS, GAS, YLCLOUD, AEROSOL, AEROSOL_HAM, FLUX) ! Check fluxes are within physical bounds IF (YRERAD%NDUMPBADINPUTS /= 0 & @@ -720,6 +761,7 @@ SUBROUTINE RADIATION_SCHEME & CALL GAS%DEALLOCATE CALL YLCLOUD%DEALLOCATE CALL AEROSOL%DEALLOCATE +CALL AEROSOL_HAM%DEALLOCATE CALL FLUX%DEALLOCATE END ASSOCIATE diff --git a/ifs-source/arpifs/phys_radi/radintg.F90 b/ifs-source/arpifs/phys_radi/radintg.F90 index ee696a52..4567d317 100644 --- a/ifs-source/arpifs/phys_radi/radintg.F90 +++ b/ifs-source/arpifs/phys_radi/radintg.F90 @@ -15,6 +15,7 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& & PAPRS , PAPRSF, PCCO2 , PCLFR,& & PQO3 , PAER , PAERMACCS,PAERMACCL,PAERMACCSJ,PAERMACCLJ,& & PAERTGS,PAERTGL, PAERO , PGHG,& + & PAEROTAU,PAEROSSA, PAEROASYM, PAEROTAULW,& & PDP , PSPECTRALEMISS,& & PMU0 , PQ,& & PQS , PQIWP , PQSWP , PQLWP , PFSDP , PQRAIN, PRAINT, PSLM , PT,& @@ -23,7 +24,9 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& & PPERTT,& & PEMIT , PTH , PFRTED, PTRSOD, PTRSODC, PEMTDC,& & PSUDU , PUVDF , PPARF , PPARCF, PTINCF,& - & PFDIR , PCDIR , PLWDERIVATIVE) + & PFDIR , PCDIR , PLWDERIVATIVE, & + & PRE_LIQ, PRE_ICE ) + !**** *RADINTG* - RADIATION INTERFACE TO ACTUAL RADIATION SCHEME @@ -211,7 +214,13 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& !extra diagnostics to debug new aerosols REAL(KIND=JPRB) ,INTENT(IN) :: PAERO(YDGEOMETRY%YRGEM%NGPTOT,KLEV,YDMODEL%YRML_GCONF%YGFL%NAERO) -REAL(KIND=JPRB) ,INTENT(OUT) :: PGHG(YDGEOMETRY%YRGEM%NGPTOT,8,KLEV) +REAL(KIND=JPRB) ,INTENT(OUT) :: PGHG(YDGEOMETRY%YRGEM%NGPTOT,8,KLEV) + +REAL(KIND=JPRB) ,INTENT(IN) :: PAEROTAU(YDGEOMETRY%YRGEM%NGPTOT, KLEV,14) +REAL(KIND=JPRB) ,INTENT(IN) :: PAEROSSA(YDGEOMETRY%YRGEM%NGPTOT, KLEV,14) +REAL(KIND=JPRB) ,INTENT(IN) :: PAEROASYM(YDGEOMETRY%YRGEM%NGPTOT, KLEV,14) +REAL(KIND=JPRB) ,INTENT(IN) :: PAEROTAULW(YDGEOMETRY%YRGEM%NGPTOT,KLEV,16) + REAL(KIND=JPRB) ,INTENT(IN) :: PDP(YDGEOMETRY%YRGEM%NGPTOT,KLEV) REAL(KIND=JPRB) ,INTENT(IN) :: PSPECTRALEMISS(YDGEOMETRY%YRGEM%NGPTOT,YDMODEL%YRML_PHY_RAD%YRERAD%NLWEMISS) REAL(KIND=JPRB) ,INTENT(IN) :: PMU0(YDGEOMETRY%YRGEM%NGPTOT) @@ -247,6 +256,10 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& REAL(KIND=JPRB) ,INTENT(OUT) :: PPARCF(YDGEOMETRY%YRGEM%NGPTOT),PTINCF(YDGEOMETRY%YRGEM%NGPTOT) REAL(KIND=JPRB) ,INTENT(OUT) :: PFDIR(YDGEOMETRY%YRGEM%NGPTOT) ,PCDIR(YDGEOMETRY%YRGEM%NGPTOT) REAL(KIND=JPRB) ,INTENT(OUT) :: PLWDERIVATIVE(YDGEOMETRY%YRGEM%NGPTOT,KLEV+1) +REAL(KIND=JPRB) ,INTENT(IN) :: PRE_LIQ(YDGEOMETRY%YRGEM%NGPTOT,KLEV) +REAL(KIND=JPRB) ,INTENT(IN) :: PRE_ICE(YDGEOMETRY%YRGEM%NGPTOT,KLEV) + + ! ------------------------------------------------------------------ REAL(KIND=JPRB) :: ZAMU0 (YDGEOMETRY%YRGEM%NGPTOT) @@ -355,7 +368,10 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& & IALD,IALP,ITI,IPR,IQS,IWV,ICLC,ILWA,IIWA,ISWA,IRWA,& & IRRA,IDP,IOZ,IHTI,IHPR,IFRSO,ISWFC,IFRTH,ILWFC,IAE,IAER,IAERO,IPERT,& & IAPRS,IGELAM,IGEMU,ICLON,ISLON,IECPO3,ICCNL,ICCNO,& - & ICO2,ICH4,IN2O,INO2,IC11,IC12,IC22,ICL4,IFSD + & ICO2,ICH4,IN2O,INO2,IC11,IC12,IC22,ICL4,IFSD,& + & IHAMAEROAOD,IHAMAEROSSA,IHAMAEROASYM!,IHAMAEROAODLW + +INTEGER(KIND=JPIM) :: IRE_LIQ, IRE_ICE INTEGER(KIND=JPIM) :: IDUMARR(2) INTEGER(KIND=JPIM) :: IULTMP @@ -472,7 +488,7 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& & LAERVOL=>YDEAERATM%LAERVOL, & & LAPPROXLWUPDATE=>YDERAD%LAPPROXLWUPDATE, & & LAPPROXSWUPDATE=>YDERAD%LAPPROXSWUPDATE, LDIAGFORCING=>YDERAD%LDIAGFORCING, & - & LEPO3RA=>YDERAD%LEPO3RA, LHVOLCA=>YDERAD%LHVOLCA, & + & LEPO3RA=>YDERAD%LEPO3RA, LHVOLCA=>YDERAD%LHVOLCA, NCLOUDACT=>YDERAD%NCLOUDACT & & LNOTROAER=>YDERAD%LNOTROAER, LSRTM=>YDERAD%LSRTM, NAER=>YDERAD%NAER, & & NAERMACC=>YDERAD%NAERMACC, NGHGRAD=>YDERAD%NGHGRAD, NOZOCL=>YDERAD%NOZOCL, & & NPERTAER=>YDERAD%NPERTAER, NPERTOZ=>YDERAD%NPERTOZ, NRADINT=>YDERAD%NRADINT, & @@ -637,6 +653,14 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& IAPRS =INDRAD(INEXT,KLEV+1,.TRUE.) IHTI =INDRAD(INEXT,KLEV+1,.TRUE.) IAERO =INDRAD(INEXT,IRADAER*KLEV,.NOT.LRAYFM .AND. LLACTAERO .AND. NAERMACC == 0) + +IHAMAEROAOD =INDRAD(INEXT,NTSW*KLEV,.TRUE.) +IHAMAEROSSA =INDRAD(INEXT,NTSW*KLEV,.TRUE.) +IHAMAEROASYM =INDRAD(INEXT,NTSW*KLEV,.TRUE.) +!IHAMAEROAODLW =INDRAD(STRATO_CMIP6_NTB*KLEV,.TRUE.) + + + IPERT =INDRAD(INEXT,YDSPP_CONFIG%SM%NRFTOTAL_RADGRID, LLSPPRAD ) !ICO2 =INDRAD(INEXT,KLEV,.TRUE.) @@ -648,6 +672,9 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& !IC22 =INDRAD(INEXT,KLEV,.TRUE.) !ICL4 =INDRAD(INEXT,KLEV,.TRUE.) +IRE_LIQ = INDRAD(INEXT,KLEV, NCLOUDACT > 0) +IRE_ICE = INDRAD(INEXT,KLEV, NCLOUDACT > 0) + IINEND =INEXT-1 ! end of input variables IOUTBEG=INEXT ! start of output variables @@ -767,6 +794,8 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& WRITE(NULOUT,'("RADINTG: IC12 =",I0)')IC12 WRITE(NULOUT,'("RADINTG: IC22 =",I0)')IC22 WRITE(NULOUT,'("RADINTG: ICL4 =",I0)')ICL4 + WRITE(NULOUT,'("RADINTG: IRE_LIQ =",I0)')IRE_LIQ + WRITE(NULOUT,'("RADINTG: IRE_ICE =",I0)')IRE_ICE ENDIF @@ -966,6 +995,50 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& ZRGP(1:IL,IAERO+IAE:IAERO+IAE+KLEV-1,IB) =REPSCAER ENDIF ENDIF + + + + !A.Laakso: + IF (NSTEP == YDRIP%NSTART) THEN + DO JAERO=1,YRERAD%NTSW + IAE=(JAERO-1)*KLEV + ZRGP(1:IL,IHAMAEROAOD+IAE:IHAMAEROAOD+IAE+KLEV-1,IB) =0._JPRB + ZRGP(1:IL,IHAMAEROSSA+IAE:IHAMAEROSSA+IAE+KLEV-1,IB) =0._JPRB + ZRGP(1:IL,IHAMAEROASYM+IAE:IHAMAEROASYM+IAE+KLEV-1,IB) =0._JPRB + END DO + + !DO JAERO=1,STRATO_CMIP6_NTB + !IAE=(JAERO-1)*KLEV + !ZRGP(1:IL,IHAMAEROAODLW+IAE:IHAMAEROAODLW+IAE+KLEV-1,IB) =0._JPRB + !END DO + + ELSE + DO JAERO=1,YDMODEL%YRML_PHY_RAD%YRERAD%NTSW + IAE=(JAERO-1)*KLEV + ZRGP(1:IL,IHAMAEROAOD+IAE:IHAMAEROAOD+IAE+KLEV-1,IB) =MAX(0._JPRB, PAEROTAU(IBEG:IEND,1:KLEV,JAERO)) + + ENDDO + DO JAERO=1,YDMODEL%YRML_PHY_RAD%YRERAD%NTSW + IAE=(JAERO-1)*KLEV + ZRGP(1:IL,IHAMAEROSSA+IAE:IHAMAEROSSA+IAE+KLEV-1,IB) =MAX(0._JPRB, PAEROSSA(IBEG:IEND,1:KLEV,JAERO)) + + ENDDO + DO JAERO=1,YDMODEL%YRML_PHY_RAD%YRERAD%NTSW + IAE=(JAERO-1)*KLEV + ZRGP(1:IL,IHAMAEROASYM+IAE:IHAMAEROASYM+IAE+KLEV-1,IB) =MAX(0._JPRB, PAEROASYM(IBEG:IEND,1:KLEV,JAERO)) + + ENDDO + + !DO JAERO=1,STRATO_CMIP6_NTB + !IAE=(JAERO-1)*KLEV + !ZRGP(1:IL,IHAMAEROAODLW+IAE:IHAMAEROAODLW+IAE+KLEV-1,IB) =MAX(0._JPRB, PAEROTAULW(IBEG:IEND,1:KLEV,JAERO)) + + ENDDO + + ENDIF + + + !SPP: compute and store SPP random patterns on radiation grid IF (LLSPPRAD) THEN DO JARP=1,YDSPP_CONFIG%SM%NRFTOTAL_RADGRID @@ -974,6 +1047,18 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& ENDDO ENDIF + + IF (NCLOUDACT > 0) THEN + IF (NSTEP == YDRIP%NSTART) THEN + ZRGP(1:IL,IRE_LIQ:IRE_LIQ+KLEV-1,IB) = 2.E-6_JPRB + ZRGP(1:IL,IRE_ICE:IRE_ICE+KLEV-1,IB) = 30.E-6_JPRB + ELSE + ZRGP(1:IL,IRE_LIQ:IRE_LIQ+KLEV-1,IB) = PRE_LIQ(IBEG:IEND,1:KLEV) + ZRGP(1:IL,IRE_ICE:IRE_ICE+KLEV-1,IB) = PRE_ICE(IBEG:IEND,1:KLEV) + END IF + END IF + + ZRGP(1:IL,IHPR:IHPR+KLEV ,IB) =ZCAPH (1:IL,1:KLEV+1) ZRGP(1:IL,IAPRS:IAPRS+KLEV ,IB) =PAPRS (IBEG:IEND,1:KLEV+1) ZRGP(1:IL,IHTI:IHTI+KLEV ,IB) =ZCHTI (1:IL,1:KLEV+1) @@ -1593,6 +1678,7 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& & ZRGP(1,ICLC,IB), ZRGP(1,ILWA,IB), ZRGP(1,IIWA,IB), ZRGP(1,IRWA,IB), & & ZRGP(1,ISWA,IB), & & ZRGP(1,IAER,IB), ZRGP(1,IAERO,IB), & + & ZRGP(1,IHAMAEROAOD,IB), ZRGP(1,IHAMAEROSSA,IB), ZRGP(1,IHAMAEROASYM,IB), & ! added for M7 aerosol ! Flux outputs & ZRGP(1,IFRSO,IB), ZRGP(1,IFRTH,IB), ZRGP(1,ISWFC,IB),ZRGP(1,ILWFC,IB),& & ZRGP(1,IFRSOD,IB),ZRGP(1,IFRTED,IB), & @@ -1602,6 +1688,7 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& & ZRGP(1,IPARCF,IB),ZRGP(1,ITINCF,IB), & & ZRGP(1,IEMIT,IB) ,ZRGP(1,ILwDerivative,IB), & & ZRGP(1,ISwDiffuseBand,IB), ZRGP(1,ISwDirectBand,IB),& + & ZRGP(1,IRE_LIQ,IB), ZRGP(1,IRE_ICE,IB),& ! OPTIONAL ARGUMENTS & PPERT=ZRGP(1,IPERT,IB), PFSD=ZRGP(1,IFSD,IB) ) ENDIF diff --git a/ifs-source/arpifs/phys_radi/suecrad.F90 b/ifs-source/arpifs/phys_radi/suecrad.F90 index 5c871120..5cbe3bbe 100644 --- a/ifs-source/arpifs/phys_radi/suecrad.F90 +++ b/ifs-source/arpifs/phys_radi/suecrad.F90 @@ -305,6 +305,7 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) & YGFL=>YDMODEL%YRML_GCONF%YGFL, & & YDEPHY=>YDMODEL%YRML_PHY_EC%YREPHY,YDEAERATM=>YDMODEL%YRML_PHY_RAD%YREAERATM, & & YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO, & + & YDAERM7=>YDMODEL%YRML_PHY_AER%YREAEROPT,&! use this to transfer AOD, SSA and ASY to rad scheme & YDEAERD=>YDMODEL%YRML_PHY_RAD%YREAERD, RADGRID=>YDMODEL%YRML_PHY_RAD%RADGRID, & & YDPHNC=>YDMODEL%YRML_PHY_SLIN%YRPHNC, YDRADF=>YDMODEL%YRML_PHY_RAD%YRRADF, YDRI=>YDMODEL%YRML_PHY_RAD%YRRI, & & YDRO=>YDMODEL%YRML_PHY_RAD%YRRO,YDRADIATION=>YDMODEL%YRML_PHY_RAD%YRADIATION) @@ -348,6 +349,10 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) & LPHYLIN=>YDMODEL%YRML_PHY_SLIN%YREPHLI%LPHYLIN, & & LHLRADUPD=>YDPHY%LHLRADUPD, RADGR=>YDPARAR%RADGR, RADSN=>YDPARAR%RADSN) ! Associate pointers for variables in namelist NAERAD + +NCLOUDACT => YRERAD%NCLOUDACT +NAEROOPT => YRERAD%NAEROOPT + LERAD1H => YDERAD%LERAD1H LEPO3RA => YDERAD%LEPO3RA LONEWSW => YDERAD%LONEWSW @@ -513,6 +518,8 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) IDUM=0 !* 2.1 PRESET INDICES IN *YOERAD* ! -------------------------- +NCLOUDACT= 0 +NAEROOPT = 2 !Default (will be)=2, HAM optics (faster and calculated for LW too) LERAD1H=.FALSE. NLNGR1H=12 @@ -2106,6 +2113,12 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) !* 6. INITIALIZE AEROSOL OPTICAL PARAMETERS AND DISTRIBUTION ! ------------------------------------------------------ +ALLOCATE(YDAERM7%M7AOD(NPROMA, NFLEVG,NTSW,NGPBLKS)) +ALLOCATE(YDAERM7%M7SSA(NPROMA, NFLEVG,NTSW,NGPBLKS)) +ALLOCATE(YDAERM7%M7ASYM(NPROMA,NFLEVG,NTSW,NGPBLKS)) +YDAERM7%M7AOD(:,:,:,:) =0.0_JPRB +YDAERM7%M7SSA(:,:,:,:) =0.0_JPRB +YDAERM7%M7ASYM(:,:,:,:) =0.0_JPRB ! - 6.1. PARAMETERS FOR THE STANDARD TEGEN AEROSOL CLIMATOLOGY ! ----------------------------------------------------- diff --git a/ifs-source/arpifs/setup/sugfl1.F90 b/ifs-source/arpifs/setup/sugfl1.F90 index f7e839a9..1f532f19 100644 --- a/ifs-source/arpifs/setup/sugfl1.F90 +++ b/ifs-source/arpifs/setup/sugfl1.F90 @@ -122,6 +122,8 @@ SUBROUTINE SUGFL1(YDMODEL,KGFLCONF) INTEGER(KIND=JPIM), POINTER :: M_soliter_ASIS REAL(KIND=JPRB), POINTER :: solcv_ASIS,RTOL_ASIS,ATOL_ASIS INTEGER(KIND=JPIM), POINTER :: N_F_RTOL_ASIS,N_F_ATOL_ASIS +! pointers for HAM-M7CTL +INTEGER(KIND=JPIM), POINTER :: NWATER, NSNUCL, NONUCL ! ------------------------------------------------------------------ @@ -131,6 +133,7 @@ SUBROUTINE SUGFL1(YDMODEL,KGFLCONF) & YGHG_NL(JPGHG), YCHEM_NL(JPCHEM), YAERO_NL(JPAERO), YERA40_NL(JPERA40), & & YNOGW_NL(JPNOGW), YEDRP_NL(JPEDRP), YSLDIA_NL(JPSLDIA), YAERAOT_NL(NPAERAOT), & & YAERLISI_NL(NPAERLISI_WVL,NPAERLISI_VAR), YAEROCLIM_NL(JPAEROCLIM), & + & YCDNC_NL, YICNC_NL, YRE_LIQ_NL, YRE_ICE_NL, & !eehol: added cloud prop & YAEROUT_NL(JPAEROUT), YUVP_NL(JPUVP), YFORC_NL(JPFORC), & & YEZDIAG_NL(JPEZDIAG), YLIMA_NL(JPLIMA), & & YEXT_NL(JPGFL-JPNAMED_GFL-JPGHG-JPFORC-JPEZDIAG-JPAERO-JPERA40-JPNOGW-JPEDRP-JPSLDIA-& @@ -187,6 +190,7 @@ SUBROUTINE SUGFL1(YDMODEL,KGFLCONF) #include "namgfl.nam.h" #include "namcompo.nam.h" +#include "namm7ctl.nam.h" #include "namchem.nam.h" #include "posnam.intfb.h" @@ -222,6 +226,11 @@ SUBROUTINE SUGFL1(YDMODEL,KGFLCONF) RCHEM_DIA_PERIOD => YDCOMPO%RCHEM_DIA_PERIOD KGHG_CHEMTEND_CH4=> YDCOMPO%KGHG_CHEMTEND_CH4 +! Associate pointers for variables in namelist NAMM7CTL +NWATER => YRM7CTL%NWATER +NSNUCL => YRM7CTL%NSNUCL +NONUCL => YRM7CTL%NONUCL + ! Associate pointers for variables in namelist NAMCHEM LCHEM_LIGHT => YDCHEM%LCHEM_LIGHT RCHEM_LINOX_SCALING => YDCHEM%RCHEM_LINOX_SCALING @@ -309,6 +318,13 @@ SUBROUTINE SUGFL1(YDMODEL,KGFLCONF) YPHYCTY_NL => YGFL%YPHYCTY_NL YSLDIA_NL => YGFL%YSLDIA_NL YLRCH4_NL => YGFL%YLRCH4_NL + +YCDNC_NL => YGFL%YCDNC_NL !eehol: CDNC +YICNC_NL => YGFL%YICNC_NL !eehol: ICNC +YRE_LIQ_NL => YGFL%YRE_LIQ_NL !eehol: liq eff rad +YRE_ICE_NL => YGFL%YRE_ICE_NL !eehol: ice eff rad + + YAERAOT_NL => YGFL%YAERAOT_NL YAERLISI_NL => YGFL%YAERLISI_NL YAEROUT_NL => YGFL%YAEROUT_NL @@ -650,13 +666,26 @@ SUBROUTINE SUGFL1(YDMODEL,KGFLCONF) LAERNUCL=.TRUE. KGHG_CHEMTEND_CH4=0_JPIM ! -AERO_SCHEME="aer" +!AERO_SCHEME="aer" + + +! M7CTL namelist +NWATER=1 +NSNUCL=2 +NONUCL=1 + + ! WRITE(NULOUT,*) ' BEFORE READ NAMCOMP ' IF (NCHEM+NGHG+NAERO > 0 ) THEN CALL POSNAM(NULNAM,'NAMCOMPO') READ(NULNAM,NAMCOMPO) + IF (trim(AERO_SCHEME) == 'hamm7' ) THEN + CALL POSNAM(NULNAM,'NAMM7CTL') !Read only if AERO_SCHEME=hamm7 + READ(NULNAM,NAMM7CTL) + ENDIF + AERO_SCHEME_OP_OBS = AERO_SCHEME WRITE(NULOUT,'(11(A,L2),A,I2)')& diff --git a/ifs-source/arpifs/setup/sugfl2.F90 b/ifs-source/arpifs/setup/sugfl2.F90 index 5779467b..336b3518 100644 --- a/ifs-source/arpifs/setup/sugfl2.F90 +++ b/ifs-source/arpifs/setup/sugfl2.F90 @@ -114,6 +114,7 @@ SUBROUTINE SUGFL2(YDEPHY,YDML_GCONF,YDCOMPO) & YMXL_NL=>YGFL%YMXL_NL, NUVP=>YGFL%NUVP, YUVP_NL=>YGFL%YUVP_NL, & & YRKTQC_NL=>YGFL%YRKTQC_NL, LTRCMFMG=>YGFL%LTRCMFMG, YO3_NL=>YGFL%YO3_NL, & & YL_NL=>YGFL%YL_NL, YLRCH4_NL=>YGFL%YLRCH4_NL, YCOMP=>YGFL%YCOMP, & + & YCDNC_NL=>YGFL%YCDNC_NL, YICNC_NL=>YGFL%YICNC_NL, YRE_LIQ_NL=>YGFL%YRE_LIQ_NL, YRE_ICE_NL=>YGFL%YRE_ICE_NL, & !eehol: added cloud prop & YQVA_NL=>YGFL%YQVA_NL, YS_NL=>YGFL%YS_NL, YA_NL=>YGFL%YA_NL, NNOGW=>YGFL%NNOGW, & & YDOM_NL=>YGFL%YDOM_NL, YSLDIA_NL=>YGFL%YSLDIA_NL, YAERO_NL=>YGFL%YAERO_NL, & & YFQTUR_NL=>YGFL%YFQTUR_NL, YSDSAT_NL=>YGFL%YSDSAT_NL, YLRAD_NL=>YGFL%YLRAD_NL, & @@ -256,6 +257,20 @@ SUBROUTINE SUGFL2(YDEPHY,YDML_GCONF,YDCOMPO) INCR=INCR+1 YGFL%YFSD => YGFL%YCOMP(JPGFL-INCR) INCR=INCR+1 + + !--> eehol: added cdnc,icnc,liq and ice eff rad + YGFL%YCDNC => YGFL%YCOMP(JPGFL-INCR) + INCR = INCR+1 + YGFL%YICNC => YGFL%YCOMP(JPGFL-INCR) + INCR = INCR+1 + YGFL%YRE_LIQ => YGFL%YCOMP(JPGFL-INCR) + INCR = INCR+1 + YGFL%YRE_ICE => YGFL%YCOMP(JPGFL-INCR) + INCR = INCR+1 + !<-- eehol + + + ! * Groups of multiple GFL variables: ! (order should be the same in parts 1.1, 1.2 and 1.3). IF (NGFL_EXT == 0) THEN @@ -758,6 +773,57 @@ SUBROUTINE SUGFL2(YDEPHY,YDML_GCONF,YDCOMPO) & LDERS=LLDERS,LD5=LL5,LDT1=.FALSE.,LDGPINGP=.TRUE.,& & LDTRAJIO=.FALSE.) ENDIF + + + !eehol: define cloud properties + IF (YCDNC_NL%LGP) THEN + IGFLPTR=NUMFLDS+1 + YGFL%YCDNC=>YGFL%YCOMP(IGFLPTR) + CALL DEFINE_GFL_COMP(YDCOMP=YGFL%YCDNC,CDNAME=YCDNC_NL%CNAME,& + & KGRIB=YCDNC_NL%IGRBCODE,LDGP=.TRUE., & + & KREQIN=YCDNC_NL%NREQIN,& + & PREFVALI=YCDNC_NL%REFVALI,LDREQOUT=YCDNC_NL%LREQOUT,& +! & LDERS=.FALSE.,LD5=.FALSE.,LDT1=LLT1,LDDIFF=.FALSE.,LDCONV=.FALSE., & + & LDERS=.FALSE.,LD5=.FALSE.,LDT1=.FALSE.,LDDIFF=.FALSE.,LDCONV=.FALSE., & + & LDMASSFIX=.FALSE.) + END IF + IF (YICNC_NL%LGP) THEN + IGFLPTR=NUMFLDS+1 + YGFL%YICNC=>YGFL%YCOMP(IGFLPTR) + CALL DEFINE_GFL_COMP(YDCOMP=YGFL%YICNC,CDNAME=YICNC_NL%CNAME,& + & KGRIB=YICNC_NL%IGRBCODE,LDGP=.TRUE., & + & KREQIN=YICNC_NL%NREQIN,& + & PREFVALI=YICNC_NL%REFVALI,LDREQOUT=YICNC_NL%LREQOUT,& +! & LDERS=.FALSE.,LD5=.FALSE.,LDT1=LLT1,LDDIFF=.FALSE.,LDCONV=.FALSE., & + & LDERS=.FALSE.,LD5=.FALSE.,LDT1=.FALSE.,LDDIFF=.FALSE.,LDCONV=.FALSE., & + & LDMASSFIX=.FALSE.) + END IF + IF (YRE_LIQ_NL%LGP) THEN + IGFLPTR=NUMFLDS+1 + YGFL%YRE_LIQ=>YGFL%YCOMP(IGFLPTR) + CALL DEFINE_GFL_COMP(YDCOMP=YGFL%YRE_LIQ,CDNAME=YRE_LIQ_NL%CNAME,& + & KGRIB=YRE_LIQ_NL%IGRBCODE,LDGP=.TRUE., & + & KREQIN=YRE_LIQ_NL%NREQIN,& + & PREFVALI=YRE_LIQ_NL%REFVALI,LDREQOUT=YRE_LIQ_NL%LREQOUT,& +! & LDERS=.FALSE.,LD5=.FALSE.,LDT1=LLT1,LDDIFF=.FALSE.,LDCONV=.FALSE., & + & LDERS=.FALSE.,LD5=.FALSE.,LDT1=.FALSE.,LDDIFF=.FALSE.,LDCONV=.FALSE., & + & LDMASSFIX=.FALSE.) + END IF + IF (YRE_ICE_NL%LGP) THEN + IGFLPTR=NUMFLDS+1 + YGFL%YRE_ICE=>YGFL%YCOMP(IGFLPTR) + CALL DEFINE_GFL_COMP(YDCOMP=YGFL%YRE_ICE,CDNAME=YRE_ICE_NL%CNAME,& + & KGRIB=YRE_ICE_NL%IGRBCODE,LDGP=.TRUE., & + & KREQIN=YRE_ICE_NL%NREQIN,& + & PREFVALI=YRE_ICE_NL%REFVALI,LDREQOUT=YRE_ICE_NL%LREQOUT,& +! & LDERS=.FALSE.,LD5=.FALSE.,LDT1=LLT1,LDDIFF=.FALSE.,LDCONV=.FALSE., & + & LDERS=.FALSE.,LD5=.FALSE.,LDT1=.FALSE.,LDDIFF=.FALSE.,LDCONV=.FALSE., & + & LDMASSFIX=.FALSE.) + END IF + !eehol + + + ! Extra GFL variables ! - do a preliminary test to see if, when there are extra-GFL and when at ! least one of them is a grid-point one, there is no extra-GFL which is diff --git a/ifs-source/arpifs/setup/sugfl3.F90 b/ifs-source/arpifs/setup/sugfl3.F90 index 13e48a81..2395ae24 100644 --- a/ifs-source/arpifs/setup/sugfl3.F90 +++ b/ifs-source/arpifs/setup/sugfl3.F90 @@ -106,6 +106,7 @@ SUBROUTINE SUGFL3(YDDIMV,YDMODEL) & LTRCMFMG=>YGFL%LTRCMFMG, YFQTUR=>YGFL%YFQTUR, & & YO3_NL=>YGFL%YO3_NL, YSLDIA=>YGFL%YSLDIA, YFORC=>YGFL%YFORC, & & YL_NL=>YGFL%YL_NL, YLRCH4_NL=>YGFL%YLRCH4_NL, YTKE=>YGFL%YTKE, & + & YCDNC_NL=>YGFL%YCDNC_NL, YICNC_NL=>YGFL%YICNC_NL, YRE_LIQ_NL=>YGFL%YRE_LIQ_NL, YRE_ICE_NL=>YGFL%YRE_ICE_NL, & !eehol: add cloud prop & YNOGW=>YGFL%YNOGW, YCOMP=>YGFL%YCOMP, YQVA_NL=>YGFL%YQVA_NL, & & YSLDIA_NL=>YGFL%YSLDIA_NL, YUEN=>YGFL%YUEN, YEZDIAG=>YGFL%YEZDIAG, & & YERA40=>YGFL%YERA40, YFQTUR_NL=>YGFL%YFQTUR_NL, YS_NL=>YGFL%YS_NL, & @@ -116,6 +117,7 @@ SUBROUTINE SUGFL3(YDDIMV,YDMODEL) & YGHG=>YGFL%YGHG, YCPF_NL=>YGFL%YCPF_NL, NNEGAFIX=>YGFL%NNEGAFIX, & & YLCONV_NL=>YGFL%YLCONV_NL, YRCONV_NL=>YGFL%YRCONV_NL, & & NMFIXFLDS=>YGFL%NMFIXFLDS, YLRCH4=>YGFL%YLRCH4, YDOM=>YGFL%YDOM, & + & YCDNC=>YGFL%YCDNC, YICNC=>YGFL%YICNC, YRE_LIQ=>YGFL%YRE_LIQ, YRE_ICE=>YGFL%YRE_ICE, & !eehol: add cloud prop & YAERAOT_NL=>YGFL%YAERAOT_NL, YAERLISI_NL=>YGFL%YAERLISI_NL, & & YAEROUT_NL=>YGFL%YAEROUT_NL, YSCONV_NL=>YGFL%YSCONV_NL, YFSTUR=>YGFL%YFSTUR, & & YUNEBH=>YGFL%YUNEBH, YAEROCLIM_NL=>YGFL%YAEROCLIM_NL, & @@ -941,6 +943,20 @@ SUBROUTINE SUGFL3(YDDIMV,YDMODEL) & KCOUPLING=YAEROUT_NL(JGFL)%NCOUPLING,& & PREFVALC=YAEROUT_NL(JGFL)%REFVALC) ENDDO +!eehol: cloud prop +! Aerosol-cloud interaction fields, EC-EARTH +IF (YCDNC%LACTIVE) THEN + CALL SET_GFL_ATTR(YDDIMV, YCDNC, LDADV=.FALSE., LDT9=.FALSE., LDPHY=.FALSE.) +END IF +IF (YICNC%LACTIVE) THEN + CALL SET_GFL_ATTR(YDDIMV, YICNC, LDADV=.FALSE., LDT9=.FALSE., LDPHY=.FALSE.) +END IF +IF (YRE_LIQ%LACTIVE) THEN + CALL SET_GFL_ATTR(YDDIMV, YRE_LIQ, LDADV=.FALSE., LDT9=.FALSE., LDPHY=.FALSE.) +END IF +IF (YRE_ICE%LACTIVE) THEN + CALL SET_GFL_ATTR(YDDIMV, YRE_ICE, LDADV=.FALSE., LDT9=.FALSE., LDPHY=.FALSE.) +END IF ! * NAEROCLIM fields: aerosol 3D input fields used for ECMWF applications DO JGFL=1,NAEROCLIM diff --git a/ifs-source/radiation/module/radiation_aerosol_optics.F90 b/ifs-source/radiation/module/radiation_aerosol_optics.F90 index 31dceaeb..c658bc51 100644 --- a/ifs-source/radiation/module/radiation_aerosol_optics.F90 +++ b/ifs-source/radiation/module/radiation_aerosol_optics.F90 @@ -518,6 +518,80 @@ subroutine add_aerosol_optics_direct(nlev,istartcol,iendcol, & end subroutine add_aerosol_optics_direct + !A.Laakso (FMI): + !Adds aod, ssa, asym of aerosols to corresponding variables in radiation module + !Note1: Weighting of SSA, ASYM (added not background) is done before calling this subroutine + !Note2: For LW only AOD is added + subroutine add_aerosol_aod_ssa_asym(ncol,nlev,istartcol,iendcol, config,aerosol_ham, & + & od_lw, ssa_lw, g_lw, od_sw, ssa_sw, g_sw) + use parkind1, only : jprb + use radiation_io, only : nulout, nulerr, radiation_abort + use yomhook, only : lhook, dr_hook + use radiation_config, only : config_type + use radiation_aerosol, only : aerosol_type + integer, intent(in) :: ncol ! number of columns + integer, intent(in) :: nlev ! number of model levels + integer, intent(in) :: istartcol, iendcol ! range of columns to process + type(config_type), intent(in), target :: config + type(aerosol_type), intent(in) :: aerosol_ham + real(jprb), dimension(config%n_g_lw,nlev,istartcol:iendcol), & + & intent(inout) :: od_lw + real(jprb), dimension(config%n_g_lw_if_scattering,nlev,istartcol:iendcol), & + & intent(inout) :: ssa_lw, g_lw + real(jprb), dimension(config%n_g_sw,nlev,istartcol:iendcol), & + & intent(inout) :: od_sw, ssa_sw + real(jprb), dimension(config%n_g_sw,nlev,istartcol:iendcol), & + & intent(inout) :: g_sw + ! Loop indices for column, level, g point, band and aerosol type + integer :: jcol, jlev, jg, jtype, iband + real(jprb) :: hook_handle, temp_remove + + ! Range of levels over which aerosols are present + integer :: istartlev, iendlev + + if (lhook) call dr_hook('radiation_aerosol_optics:add_aerosol_aod_ssa_asym',0,hook_handle) + + istartlev = lbound(aerosol_ham%od_sw,2) + iendlev = ubound(aerosol_ham%od_sw,2) + ! Loop over position + + do jlev = istartlev,iendlev + do jcol = istartcol,iendcol + do jg = 1,config%n_g_lw + + od_lw(jg,jlev,jcol) = od_lw(jg,jlev,jcol)& + + aerosol_ham%od_sw(jcol,jlev,config%n_bands_sw+config%i_band_from_reordered_g_lw(jg)) + end do + + ! Weighting - only for existing aerosols + do jg = 1,config%n_g_sw + iband=config%i_band_from_reordered_g_sw(jg) + IF (aerosol_ham%od_sw(jcol,jlev,iband) > 0.0_jprb) THEN + g_sw(jg,jlev,jcol) = g_sw(jg,jlev,jcol)*ssa_sw(jg,jlev,jcol)*od_sw(jg,jlev,jcol) & + +aerosol_ham%g_sw(jcol,jlev,iband) + + ssa_sw(jg,jlev,jcol) = ssa_sw(jg,jlev,jcol)*od_sw(jg,jlev,jcol) & + +aerosol_ham%ssa_sw(jcol,jlev,iband) + + od_sw(jg,jlev,jcol) = od_sw(jg,jlev,jcol) & + +aerosol_ham%od_sw(jcol,jlev,iband) + + IF (ssa_sw(jg,jlev,jcol) /= 0.0_jprb) THEN + g_sw(jg,jlev,jcol)=g_sw(jg,jlev,jcol)/ssa_sw(jg,jlev,jcol) + ENDIF + !IF (od_sw(jg,jlev,jcol) /= 0.0_jprb) THEN + ssa_sw(jg,jlev,jcol)=ssa_sw(jg,jlev,jcol)/od_sw(jg,jlev,jcol) + ENDIF + end do + + end do ! Loop over column + end do ! Loop over level + + + + if (lhook) call dr_hook('radiation_aerosol_optics:add_aerosol_aod_ssa_asym',1,hook_handle) + end subroutine + !--------------------------------------------------------------------- ! Sometimes it is useful to specify aerosol in terms of its optical diff --git a/ifs-source/radiation/module/radiation_interface.F90 b/ifs-source/radiation/module/radiation_interface.F90 index d9eb70c2..2df28da6 100644 --- a/ifs-source/radiation/module/radiation_interface.F90 +++ b/ifs-source/radiation/module/radiation_interface.F90 @@ -194,7 +194,7 @@ end subroutine set_gas_units ! to reverse the order for the computation and then reverse the ! order of the output fluxes to match the inputs. subroutine radiation(ncol, nlev, istartcol, iendcol, config, & - & single_level, thermodynamics, gas, cloud, aerosol, flux) + & single_level, thermodynamics, gas, cloud, aerosol, aerosol_ham, flux) use parkind1, only : jprb use yomhook, only : lhook, dr_hook, jphook @@ -244,7 +244,7 @@ subroutine radiation(ncol, nlev, istartcol, iendcol, config, & type(thermodynamics_type),intent(in) :: thermodynamics type(gas_type), intent(in) :: gas type(cloud_type), intent(inout):: cloud - type(aerosol_type), intent(in) :: aerosol + type(aerosol_type), intent(in) :: aerosol, aerosol_ham ! Output type(flux_type), intent(inout):: flux @@ -311,7 +311,7 @@ subroutine radiation(ncol, nlev, istartcol, iendcol, config, & ! call the radiation scheme and then reverses the returned ! fluxes call radiation_reverse(ncol, nlev, istartcol, iendcol, config, & - & single_level, thermodynamics, gas, cloud, aerosol, flux) + & single_level, thermodynamics, gas, cloud, aerosol, aerosol_ham, flux) else ! Input arrays arranged in order of increasing pressure / @@ -386,6 +386,13 @@ subroutine radiation(ncol, nlev, istartcol, iendcol, config, & call add_aerosol_optics(nlev,istartcol,iendcol, & & config, thermodynamics, gas, aerosol, & & od_lw, ssa_lw, g_lw, od_sw, ssa_sw, g_sw) + + !optical properties from aerosol model + !fields are 0 if not used (or should be) + call add_aerosol_aod_ssa_asym(ncol,nlev,istartcol,iendcol, & + & config, aerosol_ham, & + & od_lw, ssa_lw, g_lw, od_sw, ssa_sw, g_sw) + end if else g_sw = 0.0_jprb @@ -511,7 +518,7 @@ end subroutine radiation ! subroutine calls, and is called by "radiation", it must be in this ! module to avoid circular dependencies. subroutine radiation_reverse(ncol, nlev, istartcol, iendcol, config, & - & single_level, thermodynamics, gas, cloud, aerosol, flux) + & single_level, thermodynamics, gas, cloud, aerosol, aerosol_ham, flux) use parkind1, only : jprb @@ -533,7 +540,7 @@ subroutine radiation_reverse(ncol, nlev, istartcol, iendcol, config, & type(thermodynamics_type),intent(in) :: thermodynamics type(gas_type), intent(in) :: gas type(cloud_type), intent(in) :: cloud - type(aerosol_type), intent(in) :: aerosol + type(aerosol_type), intent(in) :: aerosol, aerosol_ham ! Output type(flux_type), intent(inout):: flux @@ -541,7 +548,7 @@ subroutine radiation_reverse(ncol, nlev, istartcol, iendcol, config, & type(thermodynamics_type) :: thermodynamics_rev type(gas_type) :: gas_rev type(cloud_type) :: cloud_rev - type(aerosol_type) :: aerosol_rev + type(aerosol_type) :: aerosol_rev, aerosol_ham_rev type(flux_type) :: flux_rev ! Start and end levels for aerosol data @@ -561,6 +568,12 @@ subroutine radiation_reverse(ncol, nlev, istartcol, iendcol, config, & call aerosol_rev%allocate(ncol, istartlev, iendlev, & & config%n_aerosol_types) end if + if (allocated(aerosol_ham%od_sw)) then + istartlev = nlev + 1 - aerosol_ham%iendlev + iendlev = nlev + 1 - aerosol_ham%istartlev + call aerosol_ham_rev%allocate(ncol, istartlev, iendlev, & + & config%n_g_sw+config%n_g_lw) + end if ! Fill reversed thermodynamic arrays thermodynamics_rev%pressure_hl(istartcol:iendcol,:) & @@ -604,6 +617,20 @@ subroutine radiation_reverse(ncol, nlev, istartcol, iendcol, config, & & = aerosol%mixing_ratio(:,aerosol%iendlev:aerosol%istartlev:-1,:) end if + if (allocated(aerosol_ham%od_sw)) then + aerosol_ham_rev%od_sw(:,istartlev:iendlev,:) & + & = aerosol_ham%od_sw(:,aerosol_ham%iendlev:aerosol_ham%istartlev:-1,:) + end if + if (allocated(aerosol_ham%ssa_sw)) then + aerosol_ham_rev%ssa_sw(:,istartlev:iendlev,:) & + & = aerosol_ham%ssa_sw(:,aerosol_ham%iendlev:aerosol_ham%istartlev:-1,:) + end if + if (allocated(aerosol_ham%g_sw)) then + aerosol_ham_rev%g_sw(:,istartlev:iendlev,:) & + & = aerosol_ham%g_sw(:,aerosol_ham%iendlev:aerosol_ham%istartlev:-1,:) + end if + + ! Run radiation scheme on reversed profiles call radiation(ncol, nlev,istartcol,iendcol, & & config, single_level, thermodynamics_rev, gas_rev, & @@ -652,6 +679,9 @@ subroutine radiation_reverse(ncol, nlev, istartcol, iendcol, config, & call aerosol_rev%deallocate end if + if (allocated(aerosol_ham%od_sw)) then + call aerosol_ham_rev%deallocate + end if end subroutine radiation_reverse end module radiation_interface From a3c6e275737e8d1df4b60d2d7be71368102bc139 Mon Sep 17 00:00:00 2001 From: Lianghai Wu Date: Tue, 5 Dec 2023 10:13:07 +0000 Subject: [PATCH 002/129] include some m7 F90 files --- ifs-source/arpifs/chem/tm5_wetchem_m7.F90 | 276 ++++++++ ifs-source/arpifs/module/tm5m7_data.F90 | 533 ++++++++++++++ ifs-source/arpifs/module/tm5m7_emis_data.F90 | 660 ++++++++++++++++++ .../arpifs/module/tm5m7_optics_data.F90 | 56 ++ ifs-source/arpifs/phys_ec/aer_negat.F90 | 151 ++++ 5 files changed, 1676 insertions(+) create mode 100644 ifs-source/arpifs/chem/tm5_wetchem_m7.F90 create mode 100644 ifs-source/arpifs/module/tm5m7_data.F90 create mode 100644 ifs-source/arpifs/module/tm5m7_emis_data.F90 create mode 100644 ifs-source/arpifs/module/tm5m7_optics_data.F90 create mode 100644 ifs-source/arpifs/phys_ec/aer_negat.F90 diff --git a/ifs-source/arpifs/chem/tm5_wetchem_m7.F90 b/ifs-source/arpifs/chem/tm5_wetchem_m7.F90 new file mode 100644 index 00000000..9eda3046 --- /dev/null +++ b/ifs-source/arpifs/chem/tm5_wetchem_m7.F90 @@ -0,0 +1,276 @@ +SUBROUTINE TM5_WETCHEM_M7(KIDIA, KFDIA, KLON,KAERO,PDT,PTEMP,PAP,PRS,PLP,PY0,PHPLUS,PY, & + & PAEROP ) +!********************************************************************** +! +!TM5_WETCHEM_M7 - aqueous phase chemistry of sulfur (and other) +!programmed by Ad Jeuken (KNMI) and Frank Dentener (IMAU) +!adapted for TM5 by Maarten Krol (IMAU) 1-2002 +! +!purpose +!------- +!oxidation of SO2 and uptake of other gases in the aqueous phase +! +!interface +!--------- +!PY0 initial concentration - at the end of this routine PY0 will be updated +! with the final concentrations 'PY' because otherwise the conc.changes due +! to wet chemistry will be 'forgotten' in TM5_DO_EBI. +!PDT chemistry timestep +!PY concentrations at time is t +! +!method +!------ +!implicit solution of oxidation of SO2 +! +!external +!-------- +!none +! +!reference +!--------- +!- +!********************************************************************** + +USE PARKIND1 , ONLY : JPIM, JPRB +USE YOMHOOK , ONLY : LHOOK, DR_HOOK +USE YOMCST , ONLY : RNAVO,RMD +USE YOM_YGFL , ONLY : YGFL +USE TM5_CHEM_MODULE,ONLY: NREACW,NTLOW,NTEMP,KSO2HP,KSO2O3, & + & HENRY,IMSA,ISO4,IHNO3,INH4,IH2O2,IO3,ISO2,INH3,INO3_A +USE TM5M7_DATA, ONLY: IACS_N,ICOS_N,ISO4COS,ISO4ACS,ISO4NUS,ISO4AIS + +IMPLICIT NONE + +! input/output + +INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA , KFDIA , KLON,KAERO +REAL(KIND=JPRB),INTENT(IN) :: PDT +REAL(KIND=JPRB), INTENT(INOUT) :: PY0(KLON,YGFL%NCHEM) +REAL(KIND=JPRB), INTENT(IN) :: PTEMP(KLON) +REAL(KIND=JPRB), INTENT(IN) :: PRS(KLON) +REAL(KIND=JPRB), INTENT(IN) :: PLP(KLON) +REAL(KIND=JPRB), INTENT(IN) :: PAP(KLON) ! cloud cover +REAL(KIND=JPRB), INTENT(OUT) :: PHPLUS(KLON) ! concentration H+ +REAL(KIND=JPRB), INTENT(INOUT) :: PY(KLON,YGFL%NCHEM+3) +REAL(KIND=JPRB), INTENT(INOUT) :: PAEROP(KLON,KAERO) + + +! * LOCAL +REAL(KIND=JPRB) :: ZHOOK_HANDLE + +INTEGER(KIND=JPIM) :: ITEMP,ITER,JL +REAL(KIND=JPRB) :: ZX1,ZX2,ZX3,ZB1,ZB2,ZSO2X,ZDSO2,ZDISC,ZDNH3,ZXSO2O3A,ZXSO2O3B +REAL(KIND=JPRB),PARAMETER :: ZCO2=3.90E-4 ! approx Global mean CO2 mixing ratio, 2000-2010 period +REAL(KIND=JPRB),PARAMETER :: ZRG=0.08314 +REAL(KIND=JPRB) :: ZAIRD +REAL(KIND=JPRB),DIMENSION(KLON) :: ZXLIQ ! liquid water content +REAL(KIND=JPRB),DIMENSION(KLON) :: ZHKSO2 ! Henry's constant for sulfur dioxide +REAL(KIND=JPRB),DIMENSION(KLON) :: ZHKH2O2 ! Henry's constant for hydroperoxide +REAL(KIND=JPRB),DIMENSION(KLON) :: ZHKO3 ! Henry's constant for ozone +REAL(KIND=JPRB),DIMENSION(KLON) :: ZDKSO2 ! Dissociation constant for SO2 +REAL(KIND=JPRB),DIMENSION(KLON) :: ZDKHSO3 ! Dissociation constant for HSO3- +REAL(KIND=JPRB),DIMENSION(KLON) :: ZDKH2O ! dissociation constant water +REAL(KIND=JPRB),DIMENSION(KLON) :: ZDKNH3 ! dissociation constant ammonia +REAL(KIND=JPRB),DIMENSION(KLON) :: ZHKNH3 ! Henry's constant ammonia +REAL(KIND=JPRB),DIMENSION(KLON) :: ZHKCO2 ! Henry's constant CO2 +REAL(KIND=JPRB),DIMENSION(KLON) :: ZDKCO2 ! Dissociation constant CO2 +REAL(KIND=JPRB) :: ZPHS4 ! effective dissolvation of S(IV) +REAL(KIND=JPRB) :: ZPHSO2 ! effective dissolvation of SO2 +REAL(KIND=JPRB) :: ZPHH2O2 ! effective dissolvation of H2O2 +REAL(KIND=JPRB) :: ZPHOZONE ! effective dissolvation of O3 +REAL(KIND=JPRB),DIMENSION(KLON) :: ZPH ! pH +REAL(KIND=JPRB) :: ZA1,ZA2,ZA,ZB,ZC,ZZ ! help variables +REAL(KIND=JPRB) :: ZSULPH(KLON),ZFT +REAL(KIND=JPRB) :: ZXCOV,ZXLIQR,ZXL,ZTEMP,ZRT,ZTR ! meteo +REAL(KIND=JPRB),DIMENSION(KLON,NREACW) :: ZRW ! reaction rates +LOGICAL,DIMENSION(KLON):: LLCLOUDY + +! --- begin -------------------------------- +IF (LHOOK) CALL DR_HOOK('TM5_WETCHEM_M7',0,ZHOOK_HANDLE ) + +!----------------------------- +! wet phase reactions +!----------------------------- + + +DO JL=KIDIA,KFDIA + LLCLOUDY(JL)=.FALSE. + + ZTEMP=PTEMP(JL) + ZAIRD = 7.24291E16_JPRB*PRS(JL)/ZTEMP + ! zx1: kg water to m3 water (m3 water/ kg air) + ZX1=PLP(JL)*1.E-3_JPRB + ZX2=RMD*1.E3_JPRB*ZAIRD/RNAVO ! kg/m3 (air) + ZXLIQ(JL) = ZX1/ZX2 ! dimensionless number (m^3/m^3) + ! avoid negatives and artificial values(1e-10 is about 0.0001 g/m3) + IF ( ZXLIQ(JL) < 1E-10_JPRB ) ZXLIQ(JL)=0._JPRB + + ! lwc is dimensionless + IF ((ZXLIQ(JL) > 1E-10_JPRB).AND.(PAP(JL) > 0.01_JPRB)) THEN + LLCLOUDY(JL)=.TRUE. + ZTR=(1._JPRB/ZTEMP-1._JPRB/298_JPRB) + ZRT=ZTEMP*ZRG + ITEMP=MIN(NTEMP,MAX(1_JPIM, NINT(ZTEMP-FLOAT(NTLOW)))) + ! + ! Henry and dissociation equilibria + ! + ZDKH2O(JL) =1.01E-14_JPRB*EXP(-6706.0_JPRB *ZTR) !h2o<=>hplus+so3-- + ZHKCO2(JL) =3.4E-2_JPRB*EXP(2420._JPRB*ZTR) ! is already dimensionless + !CMK BUG 092005 hkco2(JL) =3.4e-2*(2420.*ZTR) ! is already dimensionless + ZDKCO2(JL) =4.5E-7_JPRB*EXP(-1000._JPRB*ZTR) !co2aq<=>hco3- + hplus + ZHKSO2(JL) =HENRY(ISO2,ITEMP)*ZRT !dimensionless + ZDKNH3(JL) =1.8E-5_JPRB*EXP(-450._JPRB*ZTR) !nh3<=>nh4+ + OH- + ZHKNH3(JL) =HENRY(INH3,ITEMP)*ZRT !dimensionless + ZHKH2O2(JL)=HENRY(IH2O2,ITEMP)*ZRT !dimensionless + ZHKO3(JL) =HENRY(IO3,ITEMP)*ZRT !dimensionless + ZDKSO2(JL) =1.7E-2_JPRB*EXP(2090._JPRB*ZTR) !so2<=>hso3m+hplus + ZDKHSO3(JL)=6.6E-8_JPRB*EXP(1510._JPRB*ZTR) !hso3m<=>so3-- + hplus + ! + ! calculate H+ from initial sulfate, ammonium, hno3, and nh3 + ! if solution is strongly acidic no further calculations are performed + ! + + ZXL=ZXLIQ(JL)*RNAVO*1E-3_JPRB/PAP(JL) + !ZX1 is initial strong acidity from SO4 and NO3 + ! + !acidity from strong acids alone + ! + ! Stelios: small contributions from nucleation and Aitken mode + ! as well as gas-phase should be added for pH calculation + ZSULPH(JL)=PY0(JL,ISO4)+PAEROP(JL,ISO4COS)+PAEROP(JL,ISO4ACS)+PAEROP(JL,ISO4NUS)+PAEROP(JL,ISO4AIS) + + PHPLUS(JL)=(2._JPRB*ZSULPH(JL)+PY0(JL,IMSA)-PY0(JL,INH4)+ & + & PY0(JL,IHNO3)+PY0(JL,INO3_A))/ZXL + PHPLUS(JL)=MAX(PHPLUS(JL),1E-20_JPRB) + + ENDIF +ENDDO +DO ITER=1,10 + DO JL=KIDIA,KFDIA + ! only if solution pH>4.5 + IF ( LLCLOUDY(JL) ) THEN + IF ( (PHPLUS(JL) < 3E-5_JPRB) ) THEN + ZXL=ZXLIQ(JL)*RNAVO*1E-3_JPRB/PAP(JL) + ZX1=(2._JPRB*ZSULPH(JL)+PY0(JL,IMSA)+PY0(JL,IHNO3)+PY0(JL,INO3_A))/ZXL + !ZX2 is initial total NHx + ZX2=(PY0(JL,INH3)+PY0(JL,INH4))/ZXL + !ZX3 is combined dissolution and solubility const for CO2 + ZX3=ZDKCO2(JL)*ZHKCO2(JL)*ZCO2 + ZA1=ZDKH2O(JL)/ZDKNH3(JL)*(1._JPRB+1._JPRB/ZHKNH3(JL)) ! integration constant + ZA2=PY0(JL,ISO2)/ZXL !initial SO2 + ZZ =ZA2/(PHPLUS(JL)/ZDKSO2(JL)*(1._JPRB+1._JPRB/ZHKSO2(JL))+ & + & ZDKHSO3(JL)/PHPLUS(JL)+1._JPRB) + ZA=1._JPRB+ZX2/(ZA1+PHPLUS(JL)) + ZB=-ZX1-ZZ + ZC=-ZX3-2._JPRB*ZDKHSO3(JL)*ZZ + ZZ=MAX(0._JPRB,(ZB*ZB-4._JPRB*ZA*ZC)) + PHPLUS(JL)=MAX(1.E-10_JPRB,(-ZB+SQRT(ZZ))/(2._JPRB*ZA)) + ENDIF + ENDIF + ENDDO ! +ENDDO !iter +DO JL=KIDIA,KFDIA + IF (LLCLOUDY(JL)) THEN + ZTEMP=PTEMP(JL) + ZTR=(1._JPRB/ZTEMP-1._JPRB/298_JPRB) + ZXLIQR=ZXLIQ(JL)/PAP(JL) + ZXL=ZXLIQ(JL)*RNAVO*1E-3_JPRB/PAP(JL) + ZPH(JL)=-LOG10(PHPLUS(JL)) ! pH for diagnostics + + ! phase factor ratio of aqueous phase to gas phase concentration + + ZPHS4 = ZHKSO2(JL) *(1._JPRB+ZDKSO2(JL)/PHPLUS(JL)+ & + & ZDKSO2(JL)*ZDKHSO3(JL)/PHPLUS(JL)/PHPLUS(JL))*ZXLIQR + ZPHSO2 =ZHKSO2(JL) *ZXLIQR + ZPHH2O2 =ZHKH2O2(JL) *ZXLIQR + ZPHOZONE=ZHKO3(JL) *ZXLIQR + + ! the original rate equations could be partly in look-up table + + ZRW(JL,KSO2HP) =8E4_JPRB *EXP(-3560._JPRB*ZTR)/(0.1_JPRB+PHPLUS(JL)) + ZXSO2O3A =4.39E11_JPRB*EXP(-4131._JPRB/ZTEMP)+2.56E3_JPRB*EXP(-966._JPRB/ZTEMP) !S(IV) + ZXSO2O3B =2.56E3_JPRB *EXP(-966._JPRB /ZTEMP)/PHPLUS(JL) + !divide by [H+]!S(IV) + + ! make rate constants dimensionless by multiplying + ! by (1./ZXLIQR/avo=6e20) + ! multiply with the fractions of concentrations residing + ! in the aqueous phase + + ZRW(JL,KSO2HP)=ZRW(JL,KSO2HP)/ZXL*ZPHSO2/(1._JPRB+ZPHS4)*ZPHH2O2/(1._JPRB+ZPHH2O2) + ZRW(JL,KSO2O3)=(ZXSO2O3A+ZXSO2O3B)/ZXL*ZPHS4/(1._JPRB+ZPHS4)*ZPHOZONE/ & + & (1._JPRB+ZPHOZONE) + ENDIF !cloudy +ENDDO ! JL LOOP + + +DO JL=KIDIA,KFDIA + ! + ! only cloud chemistry if substantial amount of clouds are present + ! + IF (LLCLOUDY(JL)) THEN + ! + ! oxidation of S(IV) by O3 + ! + ZSO2X=PY0(JL,ISO2) + ZXCOV=PAP(JL) + ZX1=MIN(100._JPRB,ZRW(JL,KSO2O3)*PY0(JL,IO3)*PDT) + ZDSO2=PY0(JL,ISO2)*ZXCOV*(EXP(-ZX1)-1._JPRB) + !only applied to ZXCOV part of cloud + ZDSO2=MAX(-PY0(JL,IO3)*ZXCOV,ZDSO2)! limit to o3 availability + + ZFT = PAEROP(JL,IACS_N)+PAEROP(JL,ICOS_N) + IF (ZFT > TINY(ZFT)) THEN + PAEROP(JL,ISO4ACS)=PAEROP(JL,ISO4ACS)-ZDSO2*(PAEROP(JL,IACS_N)/ZFT) + PAEROP(JL,ISO4COS)=PAEROP(JL,ISO4COS)-ZDSO2*(PAEROP(JL,ICOS_N)/ZFT) + PY(JL,ISO2)=PY0(JL,ISO2)+ZDSO2 + PY(JL,IO3) =PY0(JL,IO3) +ZDSO2 + ELSE + ! PAEROP(JL,ISO4ACS)=PAEROP(JL,ISO4ACS) + ! PAEROP(JL,ISO4COS)=PAEROP(JL,ISO4COS) + PY(JL,ISO2)=PY0(JL,ISO2) + PY(JL,IO3) =PY0(JL,IO3) + ENDIF + + ! + ! oxidation of S(IV) by H2O2 + ! + !*** here we explicitly solve the dv: + ! y'=P-Q*y-R*y*y (P and Q are 0=>b3=0.) + ! + ZSO2X=PY(JL,ISO2) + IF ( ZSO2X > TINY(ZSO2X) ) THEN + ZB1=ZRW(JL,KSO2HP) + ZB2=ZB1*(PY0(JL,IH2O2)-ZSO2X) + ZDISC=MIN(100._JPRB,SQRT(ZB2*ZB2)) ! disc is b2 for b3=0.0 + ZX1=(ZB2-ZDISC)/(-2._JPRB*ZB1) ! in this case ZX1 =0. + ZX2=(ZB2+ZDISC)/(-2._JPRB*ZB1) + ZX3=(ZSO2X-ZX1)/(ZSO2X-ZX2)*EXP(-ZDISC*PDT) + ZSO2X=(ZX1-ZX2*ZX3)/(1.-ZX3) + ZDSO2=(ZSO2X-PY(JL,ISO2))*ZXCOV + ZDSO2=MAX(ZDSO2,-PY0(JL,IH2O2)*ZXCOV) + + + ZFT=PAEROP(JL,IACS_N)+PAEROP(JL,ICOS_N) + IF (ZFT > TINY(ZFT)) THEN + PAEROP(JL,ISO4ACS)=PAEROP(JL,ISO4ACS)-ZDSO2*(PAEROP(JL,IACS_N)/ZFT) + PAEROP(JL,ISO4COS)=PAEROP(JL,ISO4COS)-ZDSO2*(PAEROP(JL,ICOS_N)/ZFT) + PY(JL,ISO2) = PY(JL,ISO2)+ZDSO2 ! dso2 is loss of SO2 and H2O2 + PY(JL,IH2O2) = PY0(JL,IH2O2)+ZDSO2 + ELSE + PY(JL,IH2O2)=PY0(JL,IH2O2) + ENDIF + ENDIF + + ! Finally also update PY0 concentrations + PY0(JL,ISO2)=PY(JL,ISO2) + PY0(JL,IO3) =PY(JL,IO3) + PY0(JL,IH2O2)=PY(JL,IH2O2) + + + ENDIF !cloudy +ENDDO + + +IF (LHOOK) CALL DR_HOOK('TM5_WETCHEM_M7',1,ZHOOK_HANDLE ) +END SUBROUTINE TM5_WETCHEM_M7 diff --git a/ifs-source/arpifs/module/tm5m7_data.F90 b/ifs-source/arpifs/module/tm5m7_data.F90 new file mode 100644 index 00000000..3cb5e266 --- /dev/null +++ b/ifs-source/arpifs/module/tm5m7_data.F90 @@ -0,0 +1,533 @@ +MODULE TM5M7_DATA + +USE PARKIND1 ,ONLY : JPIM ,JPRB + +IMPLICIT NONE + +SAVE + + +! Location of lookup table data. Default location is at the directory of the executable +!CHARACTER(LEN=256) :: TM5M7_DATADIR='/perm/ms/nl/nk9/oifs43r3/data/cifs_input/tm5m7/optics/' +CHARACTER(LEN=256) :: TM5M7_DATADIR='./' + +TYPE MODAL_DATA + REAL(KIND=JPRB), DIMENSION(:,:), POINTER :: d2 ! KLON, KLEV + REAL(KIND=JPRB), DIMENSION(:) , POINTER :: surf ! KLON +END TYPE MODAL_DATA + + ! *TM5M7_DATA* Contains parameters, switches and initialization + ! routines for the tm5m7 aerosol scheme. + ! + ! Authors: + ! -------- + ! E. Vignati (JRC/IES) 2005 + ! P. Stier (MPI) 2001/2002 + ! E. Vignati and J. Wilson (JRC / EI) 2000 + ! V. Huijnen (KNMI): copied from TM5 to IFS code 2020 + + !--- 1) Define and pre-set switches for the processes of M7: ----------------------- + + !--- Physical: + + LOGICAL :: lsnucl = .TRUE., & ! nucleation + lscoag = .TRUE., & ! coagulation + lscond = .TRUE. ! condensation of H2SO4 + + INTEGER(KIND=JPIM) :: nnucl = 1 ! Choice of the nucleation scheme: + ! + ! nnucl = 1 Vehkamaeki (2002) + ! = 2 Kulmala (1998) -NOT RECOMMENDED- + + !--- Technical: + + LOGICAL :: lmass_diag = .FALSE. ! mass balance check in m7_interface + + !--- 2) Numbers of compounds and modes of m7: -------------------------------------- + + INTEGER(KIND=JPIM), PARAMETER :: naermod=23, & !number of all compounds + nmod=7, & !number of modes + nss=2, & !number of sea salt compounds + nsol=4, & !number of soluble compounds + ngas=3, & !number of gaseous compounds + nsulf=4,& !number of sulfate compounds + ncomp=5 !number of compounds + !--- 3) List of indexes corresponding to the compound masses and mode numbers:------ + + !--- 3.1) Mass index (in array aerml and ttn): + ! + ! Attention: + ! The mass of sulfate compounds is always given in [molec. cm-3] + ! whilst the mass of other compounds is given in [ug cm-3]. + ! + ! Compounds: + ! + ! so4 = sulphate + ! bc = black carbon + ! oc = organic carbon, + ! ss = sea salt + ! du = dust + ! + ! Modes: + ! + ! n = nucleation mode + ! k = aitken mode + ! a = accumulation mode + ! c = coarse mode + ! + ! Type: + ! + ! s = soluble mode + ! i = insoluble mode + ! COMPOUND: + INTEGER(KIND=JPIM), PARAMETER :: & + & iso4ns=1, iso4ks=2, iso4as=3, iso4cs=4, & !- Sulfate + & ibcks =5, ibcas =6, ibccs =7, ibcki =8, & !- Black Carbon + & iocks =9, iocas=10, ioccs=11, iocki=12, & !- Organic Carbon + & issas=13, isscs=14, & !- Sea Salt + & iduas=15, iducs=16, iduai=17, iduci=18,& !- Dust + & isoans=19,isoaks=20,isoaas=21,isoacs=22,isoaki=23 !- SOA + ! MODE: | | | | | + ! nucl. | aitk. | acc. | coar. | aitk. | acc. | coar. | + ! soluble | soluble | soluble | soluble | insol. | insol. | insol. | + + + !--- 3.2) Number index (in array aernl): + ! + + INTEGER(KIND=JPIM), PARAMETER :: & + & inucs=1, iaits=2, iaccs=3, icoas=4, iaiti=5, iacci=6, icoai=7 + ! MODE: | | | | | + ! nucl. | aitk. | acc. | coar. | aitk. | acc. | coar. | + ! soluble | soluble | soluble | soluble | insol. | insol. | insol. | + + + !--- 4) Definition of the modes of M7: ------------------------------------------------------ + + !--- 4.1) Threshold radii between the different modes [cm]: + ! Used for the repartititioning in m7_dconc. + ! crdiv(jmod) is the lower bound and crdiv(jmod+1) is + ! the upper bound of the respective geometric mode + ! Default value for nucleation mode is modified by the + ! choice of the nuclation scheme. + + REAL(KIND=JPRB) :: crdiv(4)=(/ 0.0005E-4, 0.005E-4, 0.05E-4, 0.5E-4 /) + ! | | | + ! | | | + ! nucleation -- aitken - accum -- coarse mode + + !--- 4.2) Standard deviation for the modes: + + REAL(KIND=JPRB), PARAMETER :: sigma(nmod)=(/ 1.59, 1.59, 1.59, 2.00, 1.59, 1.59, 2.00 /) + + !--- Natural logarithm of the standard deviation of each mode: + ! Calulated in m7_initialize. + + REAL(KIND=JPRB) :: sigmaln(nmod) + + !--- 5) Conversion factors for lognormal particle size distributions: ------------- + ! Calulated in m7_initialize. + + REAL(KIND=JPRB) :: cmr2ras(nmod) ! Conversion factor: count median radius to radius of average surface + + REAL(KIND=JPRB) :: cmr2mmr(nmod) ! Conversion factor: count median radius to mass mean radius + + REAL(KIND=JPRB) :: cmedr2mmedr(nmod) ! Conversion factor: count median radius to mass median radius + + REAL(KIND=JPRB) :: cmr2ram(nmod) ! Conversion factor: count median radius to radius of average mass + + REAL(KIND=JPRB) :: ram2cmr(nmod) ! Conversion factor: radius of average mass to count median radius + + + !--- 6) Assumed thresholds for occurence of specific quantities: ------------- + !@@@ To be done! + + ! REAL, PARAMETER :: cmin_aerml = 1.E-15 , ! Aerosol mass + ! cmin_aernl = 1.E-10 , ! Aerosol number + ! + + !--- 7) Chemical constants: ---------------------------------------------------- + ! + !--- Accomodation coefficient of H2SO4 on aerosols: + ! (reduced for insoluble modes) + + REAL(KIND=JPRB), PARAMETER :: caccso4(nmod) = (/ 1.0, 1.0, 1.0, 1.0, 0.3, 0.3, 0.3 /) + + !--- Critical relative humidity: + + REAL(KIND=JPRB), PARAMETER :: crh = 0.45 ! Assumed relative humidity for the + ! Na2SO4 / NaCl system below which + ! crystalization occurs. + ! (estimated from Tang, I.N.; JGR 102, D2 1883-1893) + + !--- 8) Physical constants: ---------------------------------------------------- + ! + !--- 8.1) General physical constants: + + REAL(KIND=JPRB), PARAMETER :: & + & bk = 1.38e-16, & ! Bolzman constant [] + & avo = 6.02217E+23,& ! Avogadro number [mol-1] + & rerg = 8.314E+7, & ! Ideal gas constant [erg.K-1.mole-1] + & r_kcal = 1.986E-3 ! Ideal gas constant [kcal K-1.mole-1] + + !--- 8.2) Type specific physical constants: + ! + REAL(KIND=JPRB), PARAMETER :: & + & dh2so4 = 1.841, & ! Density H2SO4 [g cm-3] + & ddust = 2.650, & ! Density du [g cm-3] + !>>> TvN + ! The density of BC is in the range 1.7 to 1.9 g/cm3. + ! (Bond and Bergstrom, Aerosol Sci. Technol., 2006). + ! We therefore adopt a value of 1.8 g/cm3. + ! Details can be found in Bond et al. (JGR, 2013), + ! and references therein: + ! Park et al. (J. Nanoparticle Research, 2004) measured + ! 1.77 +- 0.07 g/cm3 for the non-volatile components of diesel soot, + ! and give a range 1.7-1.8 g/cm3 in their conclusions. + ! Kondo et al. (Aerosol Sci. Techn., 2011) measured + ! 1.718 +- 0.004 g/cm3 for fullerene soot. + ! Schmid et al. (Environ. Sci. Technol., 2009) + ! derive a value 1.8 +- 0.2 g/cm3 + ! for elemental carbon from biomass burning. + ! For comparison, in GLOMAP a value of 1.5 g/cm3 is used. + ! Note that these density estimates measure the mass per volume + ! occupied by the spherules, as should be the case: + ! "If the radiative forcing of BC particles is to be + ! calculated from their mass concentrations, + ! as it is usually the case, density should represent + ! the material density of the spherules, and not that + ! of their ramiform (branched) or aciniform (packed) aggregates." + ! (A. Gelencser, Carbonaceous Aerosol, Springer, 2004, p. 228). + ! This is explained in more detail by Bond and Bergstrom + ! (Aerosol Sci. Technol., 2005). + ! + !dbc = 2., & ! Density bc [g cm-3] + & dbc = 1.8, & ! Density bc [g cm-3] + ! The density of OA is highly variable, + ! but in any case substantially lower than 2 g/cm3. + ! We adopt an average value of 1.3 g/cm3, + ! based on a number of studies: + ! Turpin and Lim (Aerosol Sci. Technol., 2001) + ! suggest that 1.2 g/cm3 is a reasonable estimate. + ! Lee et al. (ACP, 2010) measured 1.26 +- 0.24 g/cm3 + ! at during FAME-2009 at Finokalia after evaporation + ! Cross et al. (Aerosol Sci. Technol., 2007) assume an + ! average bulk density of 1.27 g/cm3 + ! Nakao et al. (Atmos. Environ., 2013) measure average densities + ! for SOA between 1.22 and 1.42 g/cm3, depending of species. + ! This is in line with predictions from the OA density model + ! by Kuwata et al. (Environ. Sci. Technol., 2012), + ! who find a range between 1.23 and 1.46 g/cm3 for SOA. + ! This model can be used to estimate OA density + ! as function of O:C and H:C elemental ratios, + ! with an accuracy of 12% or more. + ! As a further simplication, it is often assumed that + ! H:C = 2 - O:C (e.g. Murphy et al., ACP, 2011). + ! The model, however, is restricted to particle components + ! having negligible quantities of additional elements, + ! most notably nitrogen. + ! Schmid et al. (Environ. Sci. Technol., 2009) + ! derive a value of 1.39 +- 0.13 for OA from biomass burning. + ! + !doc = 2., & ! Density oc [g cm-3] + & doc = 1.3, & ! Density POM [g cm-3] + !<<< TvN + & dnacl = 2.165, & ! Density NaCl [g cm-3] + & dna2so4 = 2.68, & ! Density Na2SO4 [g cm-3] + & dnahso4 = 2.435, & ! Density NaHSO4 [g cm-3] + & dh2o = 1.0, & ! Density H2O [g cm-3] + + & wh2so4 = 98.0734, & ! Molecular weight H2SO4 [g mol-1] + & wh2o = 18.0, & ! Molecular weight H2O [g mol-1] + & wso4 = 96.0576, & ! Molecular weight SO4 [g mol-1] + & wso2 = 64.0, & ! Molecular weight SO2 [g mol-1] + & wna = 22.99, & ! Atomic weight Na [g mol-1] + & wcl = 35.453, & ! Atomic weight Cl [g mol-1] + & wnacl = 58.443, & ! Molecular weight NaCl [g mol-1] + & wna2so4 = 142.0376, & ! Molecular weight Na2SO4 [g mol-1] + & wnahso4 = 120.0555 ! Molecular weight NaHSO4 [g mol-1] + + + !--- 9) Assumed parameters: ------------------------------------------------------ + + REAL(KIND=JPRB), PARAMETER :: critn=100.,& ! Assumed mass of an nucleated sulfate + ! particle for the Kulmala scheme [molecules] + & fmax=0.95, & ! Factor that limits the condensation + ! of sulfate to fmax times the available + ! sulfate in the gas phase [1]. + ! (m7_dgas) + & cLayerThickness = 1.0 ! Assumed required layer thickness of + ! sulfate to transfer an insoluble + ! particle to a soluble mode. It is + ! given in units of layers of + ! monomolecular sulfate. Determines the + ! transfer rate from insoluble to + ! soluble modes. + + !--- 10) Computational constants: ------------------------------------------------ + + REAL(KIND=JPRB), PARAMETER :: sqrt2=1.4142136, & + pi=3.141592654 + + !--- 11) Data used for the calculation of the aerosol properties ----------------- + ! under ambient conditions: + ! (Included the conversion from Pa to hPa in the first parameter.) + + REAL(KIND=JPRB), PARAMETER :: wvb(17)= & + & (/ 95.80188, -28.5257, -1.082153, 0.1466501, & + & -20627.51, 0.0461242, -0.003935, -3.36115, & + & -0.00024137, 0.067938345, 0.00000649899, 8616124.373, & + & 1.168155578, -0.021317481, 0.000270358, -1353332314.0, & + & -0.002403805 /) + + REAL(KIND=JPRB), PARAMETER :: gmb(9)= & + & (/ 1.036391467, 0.00728531, -0.011013887, -0.068887407, & + & 0.001047842, 0.001049607, 0.000740534, -1.081202685, & + & -0.0000029113 /) + + !--- 4) Logical mask for coagulation kernel: ------------------------------------- + ! (The coagulation kernel mask is symmetric and not all + ! values are used for physical considerations. As its + ! calculation is very expensive, a mask is used to + ! calculate only the necessarey elements.) + + LOGICAL :: locoagmask(nmod,nmod) + + DATA locoagmask(1:nmod,1) / .TRUE., .TRUE., .TRUE., .TRUE., .TRUE., .TRUE., .TRUE. / + + DATA locoagmask(1:nmod,2) / .FALSE., .TRUE., .TRUE., .TRUE., .TRUE., .TRUE., .TRUE. / + + DATA locoagmask(1:nmod,3) / .FALSE., .FALSE., .TRUE., .FALSE., .TRUE., .FALSE., .FALSE. / + + DATA locoagmask(1:nmod,4) / .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE. / + + DATA locoagmask(1:nmod,5) / .FALSE., .FALSE., .FALSE., .FALSE., .TRUE., .FALSE., .FALSE. / + + DATA locoagmask(1:nmod,6) / .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE. / + + DATA locoagmask(1:nmod,7) / .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE. / + + + + + + + + ! TM5M7-aerosol-specific elements, taken from chem_param.F90 + + ! + ! component indices and families, to identify tracer + ! + INTEGER(KIND=JPIM), PARAMETER :: ISO4 = 1 + INTEGER(KIND=JPIM), PARAMETER :: INH4 = 2 ! Note: these are tracer fields in the scope of aerosol module. + INTEGER(KIND=JPIM), PARAMETER :: INO3_A = 3 ! Check how to treat when running with chemistry. + INTEGER(KIND=JPIM), PARAMETER :: IACS_N = 4 + INTEGER(KIND=JPIM), PARAMETER :: ISO4ACS = 5 + INTEGER(KIND=JPIM), PARAMETER :: IBCACS = 6 + INTEGER(KIND=JPIM), PARAMETER :: IPOMACS = 7 + INTEGER(KIND=JPIM), PARAMETER :: ISSACS = 8 + INTEGER(KIND=JPIM), PARAMETER :: IDUACS = 9 + INTEGER(KIND=JPIM), PARAMETER :: ISOANUS= 10 + INTEGER(KIND=JPIM), PARAMETER :: ISOAAIS = 11 + INTEGER(KIND=JPIM), PARAMETER :: ISOAACS = 12 + INTEGER(KIND=JPIM), PARAMETER :: ISOACOS = 13 + INTEGER(KIND=JPIM), PARAMETER :: ISOAAII = 14 + INTEGER(KIND=JPIM), PARAMETER :: IH2OPART = 15 + INTEGER(KIND=JPIM), PARAMETER :: IAII_N = 16 + INTEGER(KIND=JPIM), PARAMETER :: IBCAII = 17 + INTEGER(KIND=JPIM), PARAMETER :: IPOMAII = 18 + INTEGER(KIND=JPIM), PARAMETER :: IACI_N = 19 + INTEGER(KIND=JPIM), PARAMETER :: IDUACI = 20 + INTEGER(KIND=JPIM), PARAMETER :: IAIS_N = 21 + INTEGER(KIND=JPIM), PARAMETER :: ISO4AIS = 22 + INTEGER(KIND=JPIM), PARAMETER :: IBCAIS = 23 + INTEGER(KIND=JPIM), PARAMETER :: IPOMAIS = 24 + INTEGER(KIND=JPIM), PARAMETER :: ICOI_N = 25 + INTEGER(KIND=JPIM), PARAMETER :: IDUCOI = 26 + INTEGER(KIND=JPIM), PARAMETER :: ICOS_N= 27 + INTEGER(KIND=JPIM), PARAMETER :: ISO4COS = 28 + INTEGER(KIND=JPIM), PARAMETER :: IBCCOS= 29 + INTEGER(KIND=JPIM), PARAMETER :: IPOMCOS = 30 + INTEGER(KIND=JPIM), PARAMETER :: ISSCOS = 31 + INTEGER(KIND=JPIM), PARAMETER :: IDUCOS = 32 + INTEGER(KIND=JPIM), PARAMETER :: INUS_N = 33 + INTEGER(KIND=JPIM), PARAMETER :: ISO4NUS = 34 + INTEGER(KIND=JPIM), PARAMETER :: IELVOC = 35 + INTEGER(KIND=JPIM), PARAMETER :: IISVOC = 36 + INTEGER(KIND=JPIM), PARAMETER :: IMSA = 37 + + + ! + ! molar weights of selected components. + ! + REAL(KIND=JPRB), PARAMETER :: xmair=28.94 ! mass of air, g/mol + REAL(KIND=JPRB), PARAMETER :: xmh=1.0079 + REAL(KIND=JPRB), PARAMETER :: xmn=14.0067 + REAL(KIND=JPRB), PARAMETER :: xmc=12.01115 + REAL(KIND=JPRB), PARAMETER :: xms=32.064 + REAL(KIND=JPRB), PARAMETER :: xmo=15.9994 + REAL(KIND=JPRB), PARAMETER :: xmna=22.990 + REAL(KIND=JPRB), PARAMETER :: xmcl=35.453 + + + REAL(KIND=JPRB), PARAMETER :: xmno3=xmn+3.*xmo + REAL(KIND=JPRB), PARAMETER :: xmh2so4=2.*xmh+xms+4.*xmo + REAL(KIND=JPRB), PARAMETER :: xmdust=xmair + REAL(KIND=JPRB), PARAMETER :: xmnumb=xmair + ! attention xmso2: conversion emissions done when added... + REAL(KIND=JPRB), PARAMETER :: xmso2=xms+2.*xmo + REAL(KIND=JPRB), PARAMETER :: xmdms=xms+2*xmc+6*xmh + ! attention xmnh3: conversion emissions when added... + REAL(KIND=JPRB), PARAMETER :: xmnh3=xmn+3.*xmh + ! attention: conversion emissions when added... + REAL(KIND=JPRB), PARAMETER :: xmnh4=xmn+4.*xmh + REAL(KIND=JPRB), PARAMETER :: xmmsa=xms+xmc+3*xmo+4*xmh + REAL(KIND=JPRB), PARAMETER :: xmnh2=xmn+xmh*2. + REAL(KIND=JPRB), PARAMETER :: xmnh2o2=xmnh2+2.*xmo + REAL(KIND=JPRB), PARAMETER :: xmso4=xms+4.*xmo + + + + ! densities (kg/m3) used in emission and/or optics routines + REAL(KIND=JPRB), PARAMETER :: density_ref = 1800.0 ! for 'reference' density calculations + REAL(KIND=JPRB), PARAMETER :: ss_density = dnacl * 1.e3 + REAL(KIND=JPRB), PARAMETER :: dust_density = ddust * 1.e3 + REAL(KIND=JPRB), PARAMETER :: carbon_density = dbc * 1.e3 + REAL(KIND=JPRB), PARAMETER :: pom_density = doc * 1.e3 ! Note that doc actually is the density of POM not OC + REAL(KIND=JPRB), PARAMETER :: soa_density = pom_density ! TB first order approx. same as pom + ! H2-SO4 particle density: + REAL(KIND=JPRB), PARAMETER :: so4_density = dh2so4 * 1.e3 + REAL(KIND=JPRB), PARAMETER :: h2so4_factor = xmh2so4 / xmso4 + ! Ammonium-nitrate particle density used in the optics routine: + ! Value based on Lowenthal et al. (Atmos. Environ., 2000) (see also De Meij et al., ACP, 2006). + !REAL(KIND=JPRB), PARAMETER :: nh4no3_density = 1700. + REAL(KIND=JPRB), PARAMETER :: nh4no3_density = 1.73 * 1.e3 + REAL(KIND=JPRB), PARAMETER :: nh4no3_factor = (xmnh4+xmno3)/xmno3 + REAL(KIND=JPRB), PARAMETER :: msa_density = 1.48 * 1.e3 + + ! Kappa values + REAL(KIND=JPRB), PARAMETER :: Kap_su = 0.6 + REAL(KIND=JPRB), PARAMETER :: Kap_pom = 0.1 + REAL(KIND=JPRB), PARAMETER :: Kap_soa = 0.1 + REAL(KIND=JPRB), PARAMETER :: Kap_bc = 0. + REAL(KIND=JPRB), PARAMETER :: Kap_ss = 1.0 + REAL(KIND=JPRB), PARAMETER :: Kap_du = 0. + REAL(KIND=JPRB), PARAMETER :: Kap_na2so4 = 0.95 + REAL(KIND=JPRB), PARAMETER :: Kap_msa = 0.6 + REAL(KIND=JPRB), PARAMETER :: Kap_no3 = 0.6 + + REAL(KIND=JPRB), DIMENSION(NMOD), PARAMETER :: sigma_lognormal = (/ 1.59, 1.59, 1.59, 2.00, 1.59, 1.59, 2.00 /) + ! + ! mode numbers + ! + INTEGER(KIND=JPIM), PARAMETER :: mode_nuc = 1 + INTEGER(KIND=JPIM), PARAMETER :: mode_ais = 2 + INTEGER(KIND=JPIM), PARAMETER :: mode_acs = 3 + INTEGER(KIND=JPIM), PARAMETER :: mode_cos = 4 + INTEGER(KIND=JPIM), PARAMETER :: mode_aii = 5 + INTEGER(KIND=JPIM), PARAMETER :: mode_aci = 6 + INTEGER(KIND=JPIM), PARAMETER :: mode_coi = 7 + + ! mode_number => mode_start + INTEGER(KIND=JPIM), PARAMETER :: mode_start (nmod) = (/ inus_n, iais_n, iacs_n, icos_n, iaii_n, iaci_n, icoi_n /) ! first tracer in mode + INTEGER(KIND=JPIM), PARAMETER :: mode_end_so4 (nmod) = (/ iso4nus, iso4ais, iso4acs, iso4cos, 0, 0, 0 /) + INTEGER(KIND=JPIM), PARAMETER :: mode_end_bc (nmod) = (/ 0, ibcais, ibcacs, ibccos, ibcaii, 0, 0 /) + INTEGER(KIND=JPIM), PARAMETER :: mode_end_pom (nmod) = (/ 0, ipomais, ipomacs, ipomcos, ipomaii, 0, 0 /) + INTEGER(KIND=JPIM), PARAMETER :: mode_end_ss (nmod) = (/ 0, 0, issacs, isscos, 0, 0, 0 /) + INTEGER(KIND=JPIM), PARAMETER :: mode_end_dust(nmod) = (/ 0, 0, iduacs, iducos, 0, iduaci, iducoi /) + INTEGER(KIND=JPIM), PARAMETER :: mode_end_soa (nmod) = (/ isoanus, isoaais, isoaacs, isoacos, isoaaii, 0, 0 /) + INTEGER(KIND=JPIM), PARAMETER :: mode_nm (nmod) = (/ 2, 4, 6, 6, 3, 1, 1 /) ! # tracers in mode + INTEGER(KIND=JPIM), PARAMETER :: mode_nm_sed (nmod) = (/ 2, 4, 9, 6, 3, 1, 1 /) ! # tracers in mode + INTEGER(KIND=JPIM), PARAMETER :: mode_end (nmod) = mode_start + mode_nm ! last tracer in mode + INTEGER(KIND=JPIM), PARAMETER :: mode_tracers(0:6,nmod) = & + & RESHAPE( (/ inus_n, iso4nus, isoanus, 0, 0, 0, 0, & + & iais_n, iso4ais, ibcais, ipomais,isoaais, 0, 0, & + & iacs_n, iso4acs, ibcacs, ipomacs, issacs, iduacs, isoaacs, & + & icos_n, iso4cos, ibccos, ipomcos, isscos, iducos, isoacos, & + & iaii_n, ibcaii, ipomaii,isoaaii, 0, 0, 0, & + & iaci_n, iduaci, 0, 0, 0, 0, 0, & + & icoi_n, iducoi, 0, 0, 0, 0, 0 /), (/ 7, nmod/) ) + INTEGER(KIND=JPIM), PARAMETER :: mode_tracers_by_mods(0:6,nmod) = & + & RESHAPE( (/ inus_n, iso4nus, 0 , 0 , isoanus, 0 , 0 , & + & iais_n, iso4ais, ibcais, ipomais, isoaais, 0 , 0 , & + & iacs_n, iso4acs, ibcacs, ipomacs, isoaacs, issacs , iduacs, & + & icos_n, iso4cos, ibccos, ipomcos, isoacos, isscos , iducos, & + & iaii_n, 0 , ibcaii, ipomaii, isoaaii, 0 , 0 , & + & iaci_n, 0 , 0 , 0 , 0 , 0 , iduaci , & + & icoi_n, 0 , 0 , 0 , 0 , 0 , iducoi /), (/ 7, nmod/) ) + INTEGER(KIND=JPIM), PARAMETER :: mode_tracers_sed(0:9,nmod) = & + & RESHAPE( (/ inus_n, iso4nus, isoanus, 0, 0, 0, 0, 0,0,0,& + & iais_n, iso4ais, ibcais, ipomais,isoaais, 0, 0, 0,0,0,& + & iacs_n, iso4acs, ibcacs, ipomacs, issacs, iduacs, isoaacs, inh4,ino3_a,imsa,& + & icos_n, iso4cos, ibccos, ipomcos, isscos, iducos, isoacos, 0,0,0,& + & iaii_n, ibcaii, ipomaii,isoaaii, 0, 0, 0, 0,0,0,& + & iaci_n, iduaci, 0, 0, 0, 0, 0, 0,0,0,& + & icoi_n, iducoi, 0, 0, 0, 0, 0 ,0,0,0/), (/ 10, nmod/) ) + + + + ! number of aerosol bins used for deposition: + integer, parameter :: nrdep = 23 + + ! aerosol radii used for each bin: + real, parameter :: lur(nrdep) = & + (/ 0.001, 0.01, 0.05, 0.1, 0.3, & + 0.5 , 0.7 , 0.8 , 0.9, 1.0, & + 1.2 , 1.5 , 2.0 , 3.0, 4.0, & + 5.0 , 6.0 , 8.0 , 10.0, 15.0, & + 20.0 , 50.0 , 100.0 /) + + + + ! ******************************************************************** + ! wet deposition + ! ******************************************************************** + + ! nscav : selected species for scavenging + ! nscav_index : index for scavenging: + ! nscav_type : type of scavenging: + ! 0 no scavenging + ! 1 scavenging 100 % solubility assumed + ! 2 scavenging henry solubility assumed + ! 3 scavenging, aerosol removal assumed + ! 4 scavenging, special case for SO2 with aq phase diss. + ! + integer,parameter :: nscav=30 + + integer,parameter,dimension(nscav) :: nscav_index = (/ & + inus_n, iais_n, iacs_n, icos_n, iaii_n, iaci_n, icoi_n, & + iso4nus, iso4ais, iso4acs, iso4cos, & + ibcais, ibcacs, ibccos, ibcaii, & + ipomais, ipomacs, ipomcos, ipomaii, & + issacs, isscos, & + iduacs, iducos, iduaci, iducoi, & + isoanus, isoaais, isoaacs, isoacos, isoaaii & + /) + + ! nscav_type = 5 : nu mode soluble aerosol + ! nscav_type = 6 : ai mode soluble aerosol + ! nscav_type = 7 : ac mode soluble aerosol + ! nscav_type = 8 : co mode soluble aerosol + ! nscav_type = 9 : ai mode insoluble aerosol + ! nscav_type = 10 : ac mode insoluble aerosol + ! nscav_type = 11 : co mode insoluble aerosol + +! in m7-version so4 is treated as gas-phase sulphuric acid (H2SO4) (scav-type 2) +! Since ammonium-nitrate and MSA are assumed to be in the soluble accumulation mode, +! their scavenging efficiency has been changed to the value for that mode. +! For consistency, the same value is used for Pb210. + integer, dimension(nscav),parameter :: & + nscav_type = (/ & + 5, 6, 7, 8, 9, 10, 11, & ! particle number + 5, 6, 7, 8, & ! sulphate mass + 6, 7, 8, 9, & ! BC mass + 6, 7, 8, 9, & ! POM mass + 7, 8, & ! SS mass + 7, 8, 10, 11, & ! DUST mass + 5, 6, 7, 8, 9 /) ! SOA mass + + + + + +END MODULE TM5M7_DATA diff --git a/ifs-source/arpifs/module/tm5m7_emis_data.F90 b/ifs-source/arpifs/module/tm5m7_emis_data.F90 new file mode 100644 index 00000000..9fa08fe6 --- /dev/null +++ b/ifs-source/arpifs/module/tm5m7_emis_data.F90 @@ -0,0 +1,660 @@ +MODULE TM5M7_EMIS_DATA + +USE PARKIND1 ,ONLY : JPIM ,JPRB +USE M7_DATA, ONLY : zbb_wsoc_perc, zbge_wsoc_perc, cmr_ff,cmr_bb, facso2, & + & cmr_sk, cmr_sa, cmr_sc +USE TM5M7_DATA, ONLY : XMAIR + +IMPLICIT NONE + +SAVE + +! Array to collect emissions. Note that this is a 3D array, and not 4D as in TM5. +TYPE MODAL_EMISSIONS + REAL(KIND=JPRB), DIMENSION(:,:,:), POINTER :: d3 ! KLON, BB_LM, mode_nm(mode) +END TYPE MODAL_EMISSIONS + + + ! Count median / geometric mean radii of + ! primary carbonaceous and sulfate emissions + ! based on AeroCom-I recommendations (Dentener et al., ACP, 2006). + ! The corresponding values for the M7 modes are given by Stier et al. (ACP, 2005). + ! The same values have also been adopted in GLOMAP (Mann et al., 2010). + ! + ! Count median radii for carbonaceous aerosol emissions from Dentener et al., + ! corresponding to sigma = 1.8: + !REAL(KIND=JPRB), PARAMETER :: rad_emi_ff = 0.015e-6 + !REAL(KIND=JPRB), PARAMETER :: rad_emi_bb = 0.04e-6 + ! The corresponding values for sigma = 1.59 used in M7 + ! are cmr_ff and cmr_bb, specified in m7_data.F90. + + ! For comparison, Bond et al. (JGR, 2013) give number median radii + ! between 25 and 40 nm for fresh BC in the urban areas + ! of Tokyo, Nagoya, and Seoul, + ! of 60 nm in plumes associated with wildfires, + ! and about 15 nm from aircraft jet engines. + ! These values are volume-equivalent radii (see their Fig. 4). + ! + ! According to the original paper by Schwarz et al. (GRL, 2008) + ! the corresponding geometric standard deviation + ! is sigma = 1.71 for the urban BC + ! and 1.43 for the biomass burning aerosol. + ! + ! For BC in biomass burning plumes, + ! Kondo et al (JGR, 2011) estimated + ! number median radii in the range 68-70.5 nm (+- 6-8 nm) + ! and geometric standard deviation between 1.32 and 1.36 (+- 0.01-0.04), + ! for particles thickly coated by organics. + ! + ! Janhaell et al. (ACP, 2010) have compiled measurements of + ! particle size in fresh biomass burning smoke from vegetation fires. + ! They mention that particles from biomass burning are dominated + ! by an accumulation mode. + ! They also present a relation between the geometric mean diameter Dg + ! and geometric standard deviation sigma for fresh smoke: + ! Dg (um) = (584 +- 5) - (269 +-1) sigma + ! This gives a geometric mean radius of 78 um for sigma = 1.59, + ! in close agreement with the value used by Stier et al. + ! + ! Another way to account for differences in sigma + ! is to modify the number median radius rg + ! such that the number of particles (N) + ! emitted for a certain mass (M) is the same. + ! N is proportional to M/rv^3, + ! where rv is the volume mean radius, + ! which is related to rg by + ! rv = rg * exp(1.5*(ln(sigma))^2). + ! According to Janhall, fresh smoke has an average + ! Dg of 117 +- 13 nm and sigma of 1.7 +- 0.1. + ! At sigma=1.59, this would translate into Dg of about 129 nm, + ! or rg of about 65 nm. + ! For the estimates from Kondo et al. and Schwarz et al., + ! this would give somewhat smaller rg values + ! of about 58 and 53 nm, resp. + ! + ! Particles emitted by grass and savannah fires are generally + ! somewhat smaller than those from wood burning. + ! Janhaell et al. estimate that the mean emission radii + ! for grass and savannah fires, resp., are 12.5 and 10 nm smaller. + ! These differences is not accounted for in the model. + ! + ! In a later version of ECHAM-HAM particles the emission radius + ! for biomass burning was reduced to the value for fossil fuel + ! (Zhang et al., ACP, 2012). + ! However, such as a small value seems inconsistent with measurements. + ! + ! In the CMIP6 emission data set, + ! the contributions from solid biofuel combustion + ! are included in the 2-D anthropogenic sectors, + ! and provided separately in a supplementary data set. + ! In CMIP6, biofuel is only non-zero + ! for the energy, industry and residential and + ! transportation sectors. + ! Most of the residential emissions are due + ! to solid biofuel combustion. + ! The contribution to the industrial sector + ! is only substantial in developing countries, + ! while the contributions to the energy + ! and transportation sectors are generally very small. + ! + ! For inventories other than CMIP6, + ! no distinction between fossil and biofuel emissions + ! is made in the model. + ! + ! Winijkul et al. (Atm. Env., 2015) have measured + ! size distributions from energy-related combustion + ! sources for the residential, industrial, power and + ! transportation sectors. + ! They give regional and global estimates of + ! mass median diameters. + ! In their supplementary material they give + ! an overview of results from other studies. + ! These results indicate that the size distribution + ! for both biofuel and fossil fuel combustion sources + ! are strongly dependent on the technique. + ! Count median radii for the residential sector, + ! presented in their Table S1, vary between about + ! 15 nm for modern (improved) wood-fueled stoves, + ! and 25-30 for fireplaces, + ! to 160 nm for (regular) wood-fueled heating stoves, + ! to 270 nm for traditional cookstoves. + + ! General fossil fuel (2-d sectors) + ! emitted in the Aitken mode + REAL(KIND=JPRB), PARAMETER :: rad_emi_ff_sol = cmr_ff + REAL(KIND=JPRB), PARAMETER :: rad_emi_ff_insol = cmr_ff + + ! Energy sector + ! emitted in the Aitken mode. + REAL(KIND=JPRB), PARAMETER :: rad_emi_ene_sol = cmr_ff + REAL(KIND=JPRB), PARAMETER :: rad_emi_ene_insol = cmr_ff + + ! Industry sector + ! emitted in the Aitken mode. + REAL(KIND=JPRB), PARAMETER :: rad_emi_ind_sol = cmr_ff + REAL(KIND=JPRB), PARAMETER :: rad_emi_ind_insol = cmr_ff + + ! Transportation sector + ! emitted in the Aitken mode. + REAL(KIND=JPRB), PARAMETER :: rad_emi_tra_sol = cmr_ff + REAL(KIND=JPRB), PARAMETER :: rad_emi_tra_insol = cmr_ff + + ! Shipping sector + ! emitted in the Aitken mode. + ! Currently set to cmr_ff, + ! but could be changed. + REAL(KIND=JPRB), PARAMETER :: rad_emi_shp_sol = cmr_ff + REAL(KIND=JPRB), PARAMETER :: rad_emi_shp_insol = cmr_ff + + ! Aircraft sector + ! emitted in the Aitken mode. + ! Currently set to cmr_ff, + ! but a smaller value could be used, + ! e.g. 10 or 15 nm. + REAL(KIND=JPRB), PARAMETER :: rad_emi_air_sol = cmr_ff + REAL(KIND=JPRB), PARAMETER :: rad_emi_air_insol = cmr_ff + + ! Open biomass burning + ! Soluble part emitted in the accumulation mode, + ! insoluble part in the Aitken mode. + ! Stier et al. apply cmr_ff to the insoluble part, + ! but a slightly larger value seems more realistic, + ! e.g. 40 nm. + REAL(KIND=JPRB), PARAMETER :: rad_emi_bb_sol = cmr_bb + REAL(KIND=JPRB), PARAMETER :: rad_emi_bb_insol = cmr_ff + + ! Solid biofuel combustion + ! Currently treated as biomass burning, + ! but could be changed (see comments above). + ! The value cmr_bb = 75 nm corresponds + ! with the value of 50 nm at sigma=2 + ! assumed by Kondros et al. (ACP, 2015) + ! for emissions from biofuel combusion + ! in their baseline run. + ! In one of their sensitivity runs, + ! they increase it by a factor of 2. + REAL(KIND=JPRB), PARAMETER :: rad_emi_bf_sol = cmr_bb + REAL(KIND=JPRB), PARAMETER :: rad_emi_bf_insol = cmr_ff + + ! not used anymore: + !REAL(KIND=JPRB), PARAMETER :: rad_soa = 0.01e-6 ! soa average radius + ! assuming 3nm particle formation and growth to + ! that size in half an hour + + ! Count median radii for sulfate aerosol emissions adapted to the M7 modes: + REAL(KIND=JPRB), PARAMETER :: rad_so4_ait = cmr_sk ! aitken mode radius + REAL(KIND=JPRB), PARAMETER :: rad_so4_acc = cmr_sa ! accumulation mode radius + REAL(KIND=JPRB), PARAMETER :: rad_so4_coa = cmr_sc ! coarse mode radius + + ! Count median dry radii for sea salt emissions. + ! These values have been updated + ! following Vignati et al. (Atmos. Environ., 2010) + ! For further explanations, see emission_ss.F90. + !REAL(KIND=JPRB), PARAMETER :: radius_ssa = 0.0794e-6 + !REAL(KIND=JPRB), PARAMETER :: radius_ssc = 0.63e-6 + REAL(KIND=JPRB), PARAMETER :: radius_ssa = 0.09e-6 ! accumulation mode + REAL(KIND=JPRB), PARAMETER :: radius_ssc = 0.794e-6 ! coarse mode + + ! Soluble fraction of POM mass + ! According to Janhall et al. (ACP, 2010) + ! 40 to 80% of the organic matter from + ! vegetation fires is water soluble. + ! Kondros et al. (ACP, 2015) use 80% + ! for POM from biofuel combustion + ! in their base run. + ! For the moment, emisions from + ! biofuel combustion and open biomass burning + ! are treated in the same way. + ! + ! open biomass burning + REAL(KIND=JPRB), PARAMETER :: frac_pom_sol_bb = zbb_wsoc_perc + ! solid biofuel combustion + REAL(KIND=JPRB), PARAMETER :: frac_pom_sol_bf = zbb_wsoc_perc + !REAL(KIND=JPRB), PARAMETER :: frac_pom_sol_bf = 0.8 ! alternative value + ! fossil fuel combustion + !REAL(KIND=JPRB), PARAMETER :: frac_pom_sol_ff = 0.65 ! original value + REAL(KIND=JPRB), PARAMETER :: frac_pom_sol_ff = 0.0 ! value since 2015 revision + + ! Soluble fraction of BC mass + ! In the original code, + ! fresh BC was assumed 100% insoluble, + ! and therefore emitted into the Aitken mode. + ! The new code allows to use a non-zero fraction, + ! to account for non-resolved ageing close to the source. + ! See e.g. Kondros et al., + ! who use 50% for biofuel combustion + ! in their base run. + ! In the standard EMEP MSC-W model, + ! 20% of the elemental carbon (EC) from + ! anthropogenic sources + ! (representative of fossil fuel combustion) + ! and all EC from open biomass fires + ! is assumed hygroscopic. + ! + ! open biomass burning + !REAL(KIND=JPRB), PARAMETER :: frac_bc_sol_bb = 0.0 ! original value + !REAL(KIND=JPRB), PARAMETER :: frac_bc_sol_bb = 0.5 + REAL(KIND=JPRB), PARAMETER :: frac_bc_sol_bb = 0.95 ! To reduce the AOD over china and outflow region of + ! Africa the water soluble fraction was increasde to 95% + ! in preparation for CMIP6. + ! solid biofuel combustion + !REAL(KIND=JPRB), PARAMETER :: frac_bc_sol_bf = 0.0 ! original value + !REAL(KIND=JPRB), PARAMETER :: frac_bc_sol_bf = 0.5 ! Aerocom + REAL(KIND=JPRB), PARAMETER :: frac_bc_sol_bf = 0.95 ! TB: + ! To reduce the AOD over china and outflow region of + ! Africa the water soluble fraction was increasde to 95% + ! in preparation for CMIP6. + ! + ! Some basiss for the choice can be found here: + ! (e.g. Janhall et al., 2010; + ! https://doi.org/10.5194/acp-10-1427-2010 ; Winijkul et al., 2015; + ! https://doi.org/10.1016/j.atmosenv.2015.02.037; Li et al., 2009; + ! https://pubs.acs.org/doi/abs/10.1021/es803330j). + + ! fossil fuel combustion + REAL(KIND=JPRB), PARAMETER :: frac_bc_sol_ff = 0.0 + + ! Soluble fraction of surrogate SOA emissions + ! POM from SOA is considered 65% soluble, + ! as recommended by AeroCom. + ! The paper by Kanakidou et al. (ACP, 2004) + ! (mentioned in emission_pom.F90) + ! does not seem to support 100% solubility, + ! as was previously assumed. + !REAL(KIND=JPRB), PARAMETER :: frac_soa_sol = 1.0 ! original value + REAL(KIND=JPRB), PARAMETER :: frac_soa_sol = zbge_wsoc_perc ! value since 2015 revision + + ! Fraction of SOx mass emitted directly as sulfate + REAL(KIND=JPRB), PARAMETER :: frac_so4=1.-facso2 + + + ! The value of 1.4 for the POM to OC mass ratio, + ! set in m7_data.F90, is an outdated estimate, + ! see e.g. Turpin and Lim (Aerosol Sci. Technol., 2001) and + ! Aiken et al. (Environ. Sci. Technol., 2008). + ! Turpin and Lim estimate a ratio of 1.6 +- 0.2 for urban aerosol, + ! and 2.1 +- 0.2 for aged (nonurban) aerosol; + ! They also note that aerosols heavily impacted by woodsmoke can + ! have an even higher ratio (2.2 to 2.6). + ! According to Reid et al. (ACP, 2005), + ! the POM to OC ratio in fresh biomass burning smoke is very uncertain, + ! somewhere in between 1.4 and ~2. + ! Aiken et al. measure ambient aerosol values + ! between 1.25 for O/C = 0 to 2.44 for O/C = 1.0. + ! For OA from biomass burning, they measure 1.56-1.70, + ! lower than the estimates from Turpin and Lim (~2.0). + ! They find the highest ratios for + ! aged and freshly formed SOA (~2.4 and ~1.9, respectively) + ! and lowest values for primary OA from urban combustion. + ! Based on these studies, we apply different values + ! for emissions from biomass burning versus other emissions, + ! as is also done in some other models + ! (see Table 1 in Tsigaridis et al., ACP, 2014), + ! For SOA (seem emission_pom.F90) + ! we apply a relatively high value valid for aged SOA. + ! This compensates for the lack of SOA formation from isoprene, + ! and improves the agreement with aerosol optical depth (AOD) + ! derived from satellite observations (MODIS). + ! + ! We could go even further and apply different values for the + ! water soluble and insoluble fractions (Turpin and Lim). + ! + ! It should be acknowledged that the representation of OA + ! with a single tracer is very simplistic. + ! In particular, increase in OA mass due to ageing + ! is not properly accounted for. + ! + !REAL(KIND=JPRB), PARAMETER :: oc2pom = zom2oc !factor for conversion of OC mass to POM + REAL(KIND=JPRB), PARAMETER :: oc2pom_ff = 1.6 ! fossil fuel + REAL(KIND=JPRB), PARAMETER :: oc2pom_bf = 1.6 ! solid biofuel combustion + REAL(KIND=JPRB), PARAMETER :: oc2pom_bb = 1.6 ! open biomass burning + REAL(KIND=JPRB), PARAMETER :: oc2pom_soa = 2.4 ! SOA + + + ! ----------- + ! Dust data + ! ----------- + + + ! parameters for online dust calculations + INTEGER(KIND=JPIM), PARAMETER :: ntraced=8 ! number of coarse-grained bins + ! in the original emission model + INTEGER(KIND=JPIM), PARAMETER :: nbin=24 ! number of discretization points per bin + INTEGER(KIND=JPIM), PARAMETER :: nclass=ntraced*nbin ! total number of discretization points + INTEGER(KIND=JPIM), PARAMETER :: nats=12 ! number of soil types + INTEGER(KIND=JPIM), PARAMETER :: nmode=4 ! number of particle size distributions in soils, + ! which distinguishes between clay, silt, + ! medium/fine sand, and coarse sand + INTEGER(KIND=JPIM), PARAMETER :: nspe=nmode*3+2 ! for explanation, see below + + + ! parameters for online emission input file ("onlinedust.nc") + ! fields on 1x1 deg grid + INTEGER(KIND=JPIM), PARAMETER :: nsoilph = 5, & + nfpar = 12, & + nz0 = 13 ! number of {soilph, par, z0} fields + ! entry nz0 indicates the annual mean. + + ! von Karman constant + REAL(KIND=JPRB), PARAMETER :: VKARMAN=0.4 + + ! Constants used in the parameterization of the efficient friction velocity ratio, + ! see Eqs. (17-20) in MB95: + REAL(KIND=JPRB), PARAMETER :: aeff=0.35 + REAL(KIND=JPRB), PARAMETER :: xeff=10. + ! + ! -- scaling factor for threshold friction velocity + ! u1fac is a tuning parameter necessary to obtain a reasonable global annual + ! emission amount. u1fac < 1 is used to reduce the threshold friction + ! velocity. In ECHAM-HAM simulations at T63 values of 0.86 and 0.56 were + ! used by Cheng et al. (ACP, 2008). The lower value was introduced to + ! increase emissions when surface roughness lengths were increased from a + ! constant value of 0.001 cm to values based on satellite measurements from + ! Prigent et al. (JGR, 2005). It is unclear where the value 0.66 specified + ! below is based on. In ECHAM-HAM2 (Zhang et al., ACP, 2012) the satellite + ! based surface roughness values were abandoned again. + REAL(KIND=JPRB), PARAMETER :: u1fac=0.6 ! 0.7 in EC-Earth 3.2.3 + + REAL(KIND=JPRB), PARAMETER :: cd=1.2507E-06 ! flux dimensioning parameter [g s^2/cm^4] + + !<<< TvN ! (=roa/(grav*1.e2)) + ! ustar_min is not used: + !REAL(KIND=JPRB), PARAMETER :: ustar_min=5. ! min. fricton velocity (cm/s) + ! minimum surface roughness length z0 (cm) + ! The minimum value in the data set + ! from Prigent et al. is 1e-3 cm. + ! but that seems very low. + ! For instance, the minimum value in the + ! measurements used in the regression + ! in that study is 2.3e-3 cm. + ! Also, at very low z0, volume scattering + ! of the microwave radiation will take place + ! that can significantly decrease the radar + ! backscatter coefficient (p. 8). + ! Furthermore, using 1e-3 cm leads to + ! an overestimation of AOD (compared to MODIS) + ! in the areas concerned, + ! in particular around the dust hot spots + ! of the Sahara (using current u1fac value). + ! For these reasons the minimum value + ! has been increased. + !REAL(KIND=JPRB), PARAMETER :: z0_min=1.e-3 + !REAL(KIND=JPRB), PARAMETER :: z0_min=5.e-3 + REAL(KIND=JPRB), PARAMETER :: z0_min=1.e-2 + !REAL(KIND=JPRB), PARAMETER :: z0_min=2.e-2 + !<<< TvN + + REAL(KIND=JPRB), PARAMETER :: lai_lim=0.25 + REAL(KIND=JPRB), PARAMETER :: lai_lim2=0.5 + + ! d_thrsld [cm^2.5] = 0.006/(ddust * grav*1.e2) with ddust = 2.65 g/cm^3, + ! see Eq. (4) in MB95: + REAL(KIND=JPRB), PARAMETER :: d_thrsld=2.31e-6 ! threshold value + !>>> TvN + ! There are eight coarse-grained size bins, + ! of which only the first four are used here. + ! According to Tegen et al., Heinold et al., + ! the radius boundaries of the first seven bins are + ! at 0.1, 0.3, 0.9, 2.6, 8.0, 24, 72, and 220 um. + ! However, these number don't seem to be exact. + ! Since there is a constant ratio between the right + ! and low boundaries, it seems this ratio is 3.0. + ! Indeed, in Laurent et al. (JGR, 2010), + ! 2.6 is corrected to 2.7, which would be consistent + ! with 8.0/3.0 = 2.67. + ! This would imply that the radius boundaries are at + ! 0.0987654 = 72./(3.^6), 0.296296, 0.889, 2.67, 8.0, 24, 72, 216, + ! and 648 um. + + ! Next, each bin is discretized with 24 size points, + ! where d(n+1) = d(n) * exp(Dstep). + ! Thus, Dstep = ln(3.)/24 = 0.04577551202. + ! Dmin is the diameter of the first size point, + ! given by 2* 72./(3.^6)) * exp(0.5*Dstep) = 0.20210403762 um. + ! Similarly, the last size point is at a diameter + ! 2* 648. * exp(-0.5*Dstep) = 1266.67434757 um. + ! + ! With the original bin settings, + ! the number of size points is 191 not 192 (=8*24). + ! + !REAL(KIND=JPRB), PARAMETER :: Dmin=0.00002 ! minimum partic. diameter (cm) + !REAL(KIND=JPRB), PARAMETER :: Dmax=0.130 ! maximum partic. diameter (cm) + !REAL(KIND=JPRB), PARAMETER :: Dstep=0.0460517018598807 ! diameter increment + REAL(KIND=JPRB), PARAMETER :: Dmin=2.0210403762e-5 ! diameter (cm) at first discretization point + REAL(KIND=JPRB), PARAMETER :: Dmax=0.126667434757 ! diameter (cm) at last discretization point + REAL(KIND=JPRB), PARAMETER :: Dstep=0.04577551202 ! diameter increment in log-space + !<<< TvN + + ! Constants in the parameterization of the Reynolds number, + ! see Eq. (5) in MB95: + REAL(KIND=JPRB), PARAMETER :: a_rnolds=1331.647 ! Reynolds constant + REAL(KIND=JPRB), PARAMETER :: b_rnolds=0.38194 ! Reynolds constant + REAL(KIND=JPRB), PARAMETER :: x_rnolds=1.561228 ! Reynolds constant + ! + ! Air density has been made variable, + ! to account for orographic effects. + ! Previously, a global value for the + ! threshold friction velocity Uth was calculated. + ! To keep its unit the same, + ! roa is kept as a reference value, + ! but its exact value is not important anymore. + REAL(KIND=JPRB), PARAMETER :: roa=0.001227 ! reference air density (g/cm^3) + REAL(KIND=JPRB), PARAMETER :: airfac=1./8.3144*xmair*1.e-6 ! factor for rho_air + !<<< TvN + REAL(KIND=JPRB), PARAMETER :: umin=13.75 ! minimum threshold friction velocity (cm/s) + REAL(KIND=JPRB), PARAMETER :: ZZ=1000. ! wind measurement height (cm) + + ! parameters for the grouping in 2 modes + ! The code follows the ECHAM-HAM implementation + ! of Stier et al. (JGR, 2005), + ! where the emission distribution is + ! fitted onto three log-normal modes + ! corresponding to the accumulation, coarse and super-coarse mode. + ! (see presentation E. Vignati, TM meeting, 6 June 2008). + ! + ! According to Heinold et al., + ! the three largest dust bins + ! are less important for long-range transport, + ! so particles with radius larger than 24 um + ! can safely be neglected. + ! However, a substantial part of the emitted mass + ! is carried by particles with a radius larger than 10 um + ! (see Tegen et al., Table 5). + ! + ! The amounts of mass emitted in the accumulation and coarse modes + ! are calculated from the masses emitted in the bin model, + ! using two size ranges: + ! r1 from 0.0987654 to 0.296296 um, and + ! r2 from 0.296296 to 8.0 um. + ! + ! Boundaries for Acc. mode + INTEGER(KIND=JPIM), PARAMETER :: min_ai=1 + INTEGER(KIND=JPIM), PARAMETER :: max_ai=1 + ! Boundaries for Coa. mode + INTEGER(KIND=JPIM), PARAMETER :: min_ci=2 + INTEGER(KIND=JPIM), PARAMETER :: max_ci=4 + ! + ! These size ranges include only part of + ! the mass in the accumulation and coarse modes. + ! The corresponding mass fractions are given by + ! mf(rmin,rmax) = 0.5*( + ! erf(ln(rmax/mmr)/(sqrt(2)*ln(sigma)))- + ! erf(ln(rmin/mmr)/(sqrt(2)*ln(sigma))) ), + ! where mmr is the mass median radius. + ! Applying this formula, + ! we find the following numbers: + ! mf_acc(0,0.0987654)=0.00219913 + ! mf_acc_r1=mf_acc(0.0987654,0.296296)=0.313758 + ! mf_acc_r2=mf_acc(0.296296,8.0)=0.684043 + ! mf_acc(0.296296,inf)=0.684043 + ! + ! mf_coa(0,0.296296)=0.00519991 + ! mf_coa_r1=mf_coa(0.0987654,0.296296)=0.00518309 + ! mf_coa_r2=mf_coa(0.296296,8.0)=0.980634 + ! mf_coa(8.0,inf)=0.0141665 + ! + REAL(KIND=JPRB), PARAMETER :: mf_acc_r1 = 0.313758 + REAL(KIND=JPRB), PARAMETER :: mf_acc_r2 = 0.684043 + REAL(KIND=JPRB), PARAMETER :: mf_coa_r1 = 0.00518309 + REAL(KIND=JPRB), PARAMETER :: mf_coa_r2 = 0.980634 + ! + ! Most importantly, r1 contains only about 31.4% + ! of the mass in the accumulation mode! + ! This implies that we cannot just put the emissions + ! from r1 to the accumulation mode, + ! and those from r2 to the coarse mode! + ! + ! Instead, the modal emissions are determined + ! by the following system of linear equations: + ! mf_acc_r1 * flux_ai + mf_coa_r1 * flux_ci = flux_r1 + ! mf_acc_r2 * flux_ai + mf_coa_r2 * flux_ci = flux_r2, + ! which relates the mass emitted in the ranges r1 and r2 + ! to the mass emitted in the accumulation and coarse modes. + ! The solution is expressed using + ! the following parameters: + ! + REAL(KIND=JPRB), PARAMETER :: ratio_coa = mf_coa_r1/mf_coa_r2 + REAL(KIND=JPRB), PARAMETER :: ratio_acc = mf_acc_r2/mf_acc_r1 + REAL(KIND=JPRB), PARAMETER :: denom_acc_inv = 1./(mf_acc_r1-ratio_coa*mf_acc_r2) + REAL(KIND=JPRB), PARAMETER :: denom_coa_inv = 1./(mf_coa_r2-ratio_acc*mf_coa_r1) + REAL(KIND=JPRB), PARAMETER :: mf_acc_r12_inv = 1./(mf_acc_r1+mf_acc_r2) + REAL(KIND=JPRB), PARAMETER :: mf_coa_r12_inv = 1./(mf_coa_r1+mf_coa_r2) + ! + ! Source mass median radius (cm) + ! Stier et al. (2005) uses very similar numbers + ! for mass median radii, + ! but uses 0.37 um for the accumulation mode. + ! Thus, it seems these numbers are not mass mean, + ! but mass median radii. + ! + ! The super-coarse mode has + ! a mass median radius of 15.0 and sigma=2.0, + ! but is not included. + ! + ! The AeroCom recommendation of Dentener et al. (ACP, 2006) + ! is to use a number median radius + ! of 0.65 um for the coarse mode, + ! which corresponds to mass median radius of 2.75 um + ! (the conversion factor is exp(3.0*ln(sigma)^2), + ! see Zender, Particle Size Distributions: + ! Theory and Application to Aerosols, Clouds, and Soils, 2002). + ! + !REAL(KIND=JPRB), PARAMETER :: mmr_ai=0.35E-4 + REAL(KIND=JPRB), PARAMETER :: mmr_ai=0.37E-4 + REAL(KIND=JPRB), PARAMETER :: mmr_ci=1.75E-4 + !<<< TvN + + !---------------------------------------------------------------- + ! SOIL CARACTERISTICS: + ! ZOBLER texture classes + !---------------------------------------------------------------- + + ! solspe includes for each soil type (first dimension) + ! the mass median diameter (cm) and standard deviation (see Table 1, MB95) + ! and the relative contribution (Table 2, MP95) for the four size populations. + ! The two additional entries describe the saltation efficiency alpha (cm^-1), + ! and the residual moisture, which is currently not used. + ! Efficiencies are calculated as averages over the four populations + ! (as in Eq. (8) in Marticorena et al. (JGR, 1997), + ! where 1e-7, 1e-6 and 1e-5 cm^-1 is used for coarse sand, + ! medium/fine sand and silt, respectively, + ! and 1e-6 for clay for soils with clay fractions below 45% + ! and 1e-7 for clay for soils with clay fractions above 45%. + ! (Tegen et al.). + REAL(KIND=JPRB), PARAMETER, DIMENSION(nats,nspe) :: solspe=RESHAPE( (/ & + !-- soil type 1 : Coarse + 0.0707, 2., 0.43 , & + 0.0158, 2., 0.4 , & + 0.0015, 2., 0.17 , & + 0.0002 ,2., 0. , & + 2.1E-06, 0.2, & + !-- soil type 2 : Medium + 0.0707, 2., 0. , & + 0.0158, 2., 0.37 , & + 0.0015, 2., 0.33 , & + 0.0002, 2., 0.3 , & + 4.0e-6, 0.25, & + !-- soil type 3 : Fine + 0.0707, 2., 0. , & + 0.0158, 2., 0. , & + 0.0015, 2., 0.33 , & + 0.0002, 2., 0.67 , & + !>>> TvN + ! 33% x 1e-5 + 67% x 1e-7 = 3.367e-6 cm^-1 + !1.E-07, 0.5, & + 3.4e-6, 0.5, & + !<<< TvN + !-- soil type 4 : Coarse Medium + 0.0707, 2., 0.1 , & + 0.0158, 2., 0.5 , & + 0.0015, 2., 0.2 , & + 0.0002, 2., 0.2 , & + 2.7E-06, 0.23, & + !-- soil type 5 : Coarse Fine + 0.0707, 2., 0. , & + 0.0158, 2., 0.5 , & + 0.0015, 2., 0.12 , & + 0.0002, 2., 0.38 , & + !>>> TvN + ! 50% x 1e-6 + 12% x 1e-5 + 38% x 1e-6 = 2.08e-6 cm^-1 + !2.8E-06, 0.25, & + 2.1e-6, 0.25, & + !<<< TvN + !-- soil type 6 : Medium Fine + 0.0707, 2., 0. , & + 0.0158, 2., 0.27 , & + 0.0015, 2., 0.25 , & + 0.0002, 2., 0.48 , & + !>>> TvN + ! 27% x 1e-6 + 25% x 1e-5 + 48% x 1e-7 = 2.818e-6 cm^-1 + !1e-07, 0.36, & + 2.8e-6, 0.36, & + !<<< TvN + !-- soil type 7 : Coarse, Medium, Fine + 0.0707, 2., 0.23 , & + 0.0158, 2., 0.23 , & + 0.0015, 2., 0.19 , & + 0.0002, 2., 0.35 , & + 2.5E-06, 0.25, & + !-- soil type 8 : Organic + 0.0707, 2., 0.25 , & + 0.0158, 2., 0.25 , & + 0.0015, 2., 0.25 , & + 0.0002, 2., 0.25 , & + 0., 0.5, & + !-- soil type 9 : Ice + 0.0707, 2., 0.25 , & + 0.0158, 2., 0.25 , & + 0.0015, 2., 0.25 , & + 0.0002, 2., 0.25 , & + 0., 0.5, & + !-- soil type 10 : Potential Lakes (additional) + ! GENERAL CASE + 0.0707, 2., 0. , & + 0.0158, 2., 0. , & + 0.0015, 2., 1. , & + 0.0002, 2., 0. , & + 1.E-05, 0.25, & + !-- soil type 11 : Potential Lakes (clay) + ! GENERAL CASE + 0.0707, 2., 0. , & + 0.0158, 2., 0. , & + 0.0015, 2., 0. , & + 0.0002, 2., 1. , & + 1.E-05, 0.25, & + !-- soil type 12 : Potential Lakes Australia + 0.0707, 2., 0. , & + 0.0158, 2., 0. , & + 0.0027, 2., 1. , & + 0.0002, 2., 0. , & + 1.E-05, 0.25 /),(/nats,nspe/),order=(/2,1/) ) + + REAL(KIND=JPRB) :: UTH ( NCLASS) + REAL(KIND=JPRB) :: SREL (NATS,NCLASS) + REAL(KIND=JPRB) :: SRELV(NATS,NCLASS) + REAL(KIND=JPRB) :: SU_SRELV(NATS,NCLASS) + + + + +END MODULE TM5M7_EMIS_DATA diff --git a/ifs-source/arpifs/module/tm5m7_optics_data.F90 b/ifs-source/arpifs/module/tm5m7_optics_data.F90 new file mode 100644 index 00000000..705f3497 --- /dev/null +++ b/ifs-source/arpifs/module/tm5m7_optics_data.F90 @@ -0,0 +1,56 @@ +MODULE TM5M7_OPTICS_DATA + +USE PARKIND1 ,ONLY : JPIM ,JPRB +USE TM5M7_DATA, ONLY: NMOD + +IMPLICIT NONE + +SAVE + + ! wavelength type (to be used by methods using the optics) + type, public :: WAVELENDEP + real :: wl ! user requested wavelength unit = um (e.g. 0.550) + real, dimension(7) :: n ! SO4, BC, OC, SOA, SS, DU, WATER + real, dimension(7) :: k ! SO4, BC, OC, SOA, SS, DU, WATER + logical :: split, insitu + end type WAVELENDEP + + ! AOP input type and field + type aopi + REAL(KIND=JPRB), dimension(nmod) :: SO4, NO3, BC, OC, SOA, SS, DU, H2O, numdens, rg, rgd + end type aopi + + + + ! Characteristics of the lookup-table + INTEGER(KIND=JPIM), PARAMETER :: N_RII=15 + INTEGER(KIND=JPIM), PARAMETER :: N_RIR=40 + INTEGER(KIND=JPIM), PARAMETER :: N_X=100 + + REAL(KIND=JPRB),DIMENSION(N_RII) :: lkval ! -log img part refr. index + REAL(KIND=JPRB),DIMENSION(N_RII) :: kval ! img part refr. index, 10^(-lkval) + REAL(KIND=JPRB),DIMENSION(N_RIR) :: n1r ! real part refr. index + + REAL(KIND=JPRB),DIMENSION(N_X) :: XS + REAL(KIND=JPRB),DIMENSION(N_X,N_RIR,N_RII),TARGET :: CEXT_159,A_159,G_159 + REAL(KIND=JPRB),DIMENSION(N_X,N_RIR,N_RII),TARGET :: CEXT_200,A_200,G_200 + + INTEGER(KIND=JPIM), PARAMETER :: OPACDIM = 61 + INTEGER(KIND=JPIM), PARAMETER :: ECHAMHAMDIM=49 + INTEGER(KIND=JPIM), PARAMETER :: SEGELSTEINDIM=1261 + REAL(KIND=JPRB),DIMENSION(:,:), ALLOCATABLE:: OPAC,ECHAMHAM,SEGELSTEIN + + INTEGER(KIND=JPIM) :: NWDEP + TYPE(WAVELENDEP),DIMENSION(:),ALLOCATABLE :: WDEP + + + INTEGER(KIND=JPIM) :: NASWBAND + TYPE(WAVELENDEP),DIMENSION(:),ALLOCATABLE :: ASWBAND + + INTEGER(KIND=JPIM), PARAMETER :: NALWBAND =16 + REAL(KIND=JPRB),DIMENSION(NALWBAND) :: ALWWN1 + REAL(KIND=JPRB),DIMENSION(NALWBAND) :: ALWWN2 + ! dimension for array AOP_OUT_ADD + INTEGER(KIND=JPIM), PARAMETER :: NADD = 5 + +END MODULE TM5M7_OPTICS_DATA diff --git a/ifs-source/arpifs/phys_ec/aer_negat.F90 b/ifs-source/arpifs/phys_ec/aer_negat.F90 new file mode 100644 index 00000000..843edadb --- /dev/null +++ b/ifs-source/arpifs/phys_ec/aer_negat.F90 @@ -0,0 +1,151 @@ +SUBROUTINE AER_NEGAT & + & ( KIDIA , KFDIA , KLON, KLEV,& + & PTSPHY , & + & PCAERO , PTAERO, PAPHP1, & + & PFAERNG ) + +!**** *AER_NEGAT* - AVOIDS NEGATIVE VALUES FOR AEROSOL CONCENTRATION. + +! JJMorcrette ECMWF 2005/08/16 +! JJMorcrette ECMWF 2005/08/16 +! from QNEGAT by B.RITTER E.C.M.W.F. 29/04/83. + +! PURPOSE. +! -------- + +! THIS ROUTINE RESETS TO A VERY SMALL MINIMUM VALUE ALL THE +! AEROSOL MIXING RATIOS SMALLER THAN THIS (IN PARTICULAR ALL THE +! NEGATIVE VALUES THAT MIGHT HAVE APPEARED IN THE COURSE OF THE +! TIME STEP). + +!** INTERFACE. +! ---------- + +! *AER_NEGAT* IS CALLED FROM *CALLPAR*. +! THE ROUTINE TAKES ITS INPUT FROM THE LONG-TERM STORAGE: PCAERO +! AT T+1 AND P ON LEVEL BOUNDARIES AT T+1. IT RETURNS ITS OUTPUT +! TO THE SAME SPACE: CORRECTED PTAERO TENDENCIES. +! THE TEMPERATURE WILL NOT BE ADJUSTED AND SURFACE +! FLUXES (OF AEROSOLS) WILL NOT BE MODIFIED. + +! METHOD. +! ------- + +! FOR EACH LAYER (FROM TOP TO BOTTOM) THE AEROSOL CONCENTRATION +! IS COMPARED WITH ITS CRITICAL VALUE. IF NECESSARY THE ADJUSTMENT IS +! PERFORMED AND THE NECESSARY WATER IS TAKEN FROM THE LAYER UNDERNEATH. + +! EXTERNALS. +! ---------- + +! NONE. + +! REFERENCE. +! ---------- + +! SEE RELEVANT PART OF THE DOCUMENTATION. + +! ------------------------------------------------------------------ + +USE PARKIND1 ,ONLY : JPIM ,JPRB +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK + +USE YOMCST , ONLY : RG +USE YOEAERATM, ONLY : YREAERATM + +IMPLICIT NONE + +INTEGER(KIND=JPIM),INTENT(IN) :: KLON +INTEGER(KIND=JPIM),INTENT(IN) :: KLEV +INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA +INTEGER(KIND=JPIM),INTENT(IN) :: KFDIA + +REAL(KIND=JPRB) ,INTENT(IN) :: PTSPHY +REAL(KIND=JPRB) ,INTENT(IN) :: PCAERO(KLON,KLEV) +REAL(KIND=JPRB) ,INTENT(INOUT) :: PTAERO(KLON,KLEV) +REAL(KIND=JPRB) ,INTENT(IN) :: PAPHP1(KLON,KLEV+1) + +REAL(KIND=JPRB) ,INTENT(OUT) :: PFAERNG(KLON,KLEV+1) + +!* flux outputs + +! PFAERNG : PSEUDO-FLUX OF AEROSOLS TO CORRECT FOR NEGATIVE AEROSOL CONCENTRATION + + +REAL(KIND=JPRB) :: ZAEROLD(KLON,KLEV), ZDP(KLON), ZDPO(KLON) + +INTEGER(KIND=JPIM) :: JK, JL + +REAL(KIND=JPRB) :: ZCONS1, ZDAER, ZGDPH, ZTMST +REAL(KIND=JPRB) :: ZHOOK_HANDLE + +!------------------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('AER_NEGAT',0,ZHOOK_HANDLE) +ASSOCIATE(REPSCAER=>YREAERATM%REPSCAER) + +!* COMPUTATIONAL CONSTANTS. +! ------------- ---------- + +ZTMST=PTSPHY + +ZCONS1=1.0_JPRB/ZTMST +!*** + +! ------------------------------------------------------------------ + +!* 2. ADJUSTMENT FOR ALL LAYERS. +! ---------- --- --- ------- + +!* 2.1 SAVE INITIAL TENDENCY VALUES + +DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZAEROLD(JL,JK)=PTAERO(JL,JK) + ENDDO + ENDDO + + +!* 2.2 PRELIMINARY COMPUTATIONS FOR THE TOP LAYER. + +DO JL=KIDIA,KFDIA + ZDP(JL)=PAPHP1(JL,2)-PAPHP1(JL,1) +ENDDO + +!* 2.3 VERTICAL LOOP EXCLUDING THE BOTTOM LAYER. + +DO JK=1,KLEV-1 + DO JL=KIDIA,KFDIA + ZDPO(JL)=ZDP(JL) + ENDDO + DO JL=KIDIA,KFDIA + ZDP(JL)=PAPHP1(JL,JK+2)-PAPHP1(JL,JK+1) + ZDAER=ZCONS1*MAX(0.0_JPRB,REPSCAER-(PCAERO(JL,JK)+ZTMST*PTAERO(JL,JK))) + PTAERO(JL,JK)=PTAERO(JL,JK)+ZDAER + ZDAER=ZDAER*ZDPO(JL)/ZDP(JL) + PTAERO(JL,JK+1)=PTAERO(JL,JK+1)-ZDAER + ENDDO +ENDDO + +!* 2.3 BOTTOM LAYER. + +DO JL=KIDIA,KFDIA + ZDAER=ZCONS1*MAX(0.0_JPRB,REPSCAER-(PCAERO(JL,KLEV)+ZTMST*PTAERO(JL,KLEV))) + PTAERO(JL,KLEV)=PTAERO(JL,KLEV)+ZDAER +ENDDO + +!* 3. FLUX COMPUTATIONS + +DO JL=KIDIA,KFDIA + PFAERNG(JL,1)=0.0_JPRB +ENDDO +DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZGDPH = -RG /(PAPHP1(JL,JK+1)-PAPHP1(JL,JK)) + PFAERNG(JL,JK+1)=(PTAERO(JL,JK)-ZAEROLD(JL,JK))/ZGDPH + PFAERNG(JL,JK) + ENDDO +ENDDO + +!------------------------------------------------------------------------------- +END ASSOCIATE +IF (LHOOK) CALL DR_HOOK('AER_NEGAT',1,ZHOOK_HANDLE) +END SUBROUTINE AER_NEGAT From e25fa03d707654eedcf6bf489900b83b3a1c41de Mon Sep 17 00:00:00 2001 From: Lianghai Wu Date: Mon, 18 Dec 2023 13:55:29 +0000 Subject: [PATCH 003/129] Fix compilation issues --- build/atlas/src/atlas/atlas_f.fypp | 1 + ifs-source/arpifs/chem/chem_bascoetm5.F90 | 13 +- ifs-source/arpifs/chem/chem_tm5.F90 | 11 +- ifs-source/arpifs/chem/tm5_glomap_aerosol.F90 | 168 ------ ifs-source/arpifs/chem/tm5_wetchem_m7.F90 | 4 +- ifs-source/arpifs/control/cnt4.F90 | 2 +- .../arpifs/module/surface_fields_mix.F90 | 17 + ifs-source/arpifs/module/tm5_photolysis.F90 | 8 +- ifs-source/arpifs/module/yoeaeratm.F90 | 8 +- ifs-source/arpifs/module/yoeaersnk.F90 | 1 + ifs-source/arpifs/module/yom_ygfl.F90 | 5 + ifs-source/arpifs/module/yomcompo.F90 | 5 + ifs-source/arpifs/namelist/namm7ctl.nam.h | 7 + ifs-source/arpifs/phys_ec/aer_negat.F90 | 5 +- ifs-source/arpifs/phys_ec/aer_phy3.F90 | 2 +- ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 | 1 + ifs-source/arpifs/phys_ec/aer_src.F90 | 2 +- ifs-source/arpifs/phys_ec/aerini_layer.F90 | 9 +- ifs-source/arpifs/phys_ec/hamm7_init.F90 | 6 +- ifs-source/arpifs/phys_ec/hamm7_interface.F90 | 75 +-- ifs-source/arpifs/phys_ec/m7_box.F90 | 205 ------- .../phys_ec/m7_simple_sulfur_drydep.F90 | 51 +- ifs-source/arpifs/phys_ec/mo_ham_m7ctl.F90 | 53 +- ifs-source/arpifs/phys_ec/mo_ham_rad.F90 | 6 +- ifs-source/arpifs/phys_ec/mo_netcdf.F90 | 2 +- ifs-source/arpifs/phys_ec/mo_submodel.F90 | 52 +- ifs-source/arpifs/phys_ec/mo_time_control.F90 | 5 +- ifs-source/arpifs/phys_ec/su_aerw.F90 | 12 +- .../arpifs/phys_ec/tm5m7_optics_aop_get.F90 | 8 +- .../arpifs/phys_ec/tm5m7_optics_get.F90 | 4 +- ifs-source/arpifs/phys_ec/tm5m7_phy2.F90 | 14 +- ifs-source/arpifs/phys_ec/tm5m7_scav.F90 | 542 ------------------ ifs-source/arpifs/phys_ec/tm5m7_src.F90 | 8 +- ifs-source/arpifs/phys_ec/tm5m7_src_dust.F90 | 35 +- ifs-source/arpifs/phys_ec/tm5m7_src_ss.F90 | 2 +- .../arpifs/phys_radi/radiation_scheme.F90 | 14 +- ifs-source/arpifs/phys_radi/radintg.F90 | 11 +- ifs-source/arpifs/phys_radi/suecrad.F90 | 6 +- ifs-source/arpifs/setup/su0yomb.F90 | 3 +- ifs-source/arpifs/setup/sugfl1.F90 | 3 + ifs-source/arpifs/setup/sugfl2.F90 | 8 +- ifs-source/arpifs/setup/sugfl3.F90 | 8 +- .../radiation/module/radiation_interface.F90 | 2 +- 43 files changed, 330 insertions(+), 1074 deletions(-) create mode 120000 build/atlas/src/atlas/atlas_f.fypp delete mode 100644 ifs-source/arpifs/chem/tm5_glomap_aerosol.F90 create mode 100644 ifs-source/arpifs/namelist/namm7ctl.nam.h delete mode 100644 ifs-source/arpifs/phys_ec/m7_box.F90 delete mode 100644 ifs-source/arpifs/phys_ec/tm5m7_scav.F90 diff --git a/build/atlas/src/atlas/atlas_f.fypp b/build/atlas/src/atlas/atlas_f.fypp new file mode 120000 index 00000000..517689f9 --- /dev/null +++ b/build/atlas/src/atlas/atlas_f.fypp @@ -0,0 +1 @@ +/etc/ecmwf/nfs/dh1_perm_b/nklw/FOCI/openifs-48r1.1/source/atlas/src/atlas_f/atlas_f.fypp \ No newline at end of file diff --git a/ifs-source/arpifs/chem/chem_bascoetm5.F90 b/ifs-source/arpifs/chem/chem_bascoetm5.F90 index fff33ead..d1cdd779 100644 --- a/ifs-source/arpifs/chem/chem_bascoetm5.F90 +++ b/ifs-source/arpifs/chem/chem_bascoetm5.F90 @@ -374,7 +374,7 @@ SUBROUTINE CHEM_BASCOETM5 & #include "tm5_boundary_ch4.intfb.h" #include "tm5_calrates.intfb.h" #include "tm5_eqsam.intfb.h" -#include "tm5_glomap_aerosol.intfb.h" +!#include "tm5_glomap_aerosol.intfb.h" #include "tm5_macc_aerosol.intfb.h" #include "tm5_ibud.intfb.h" #include "tm5_o3s.intfb.h" @@ -391,6 +391,7 @@ SUBROUTINE CHEM_BASCOETM5 & IF (LHOOK) CALL DR_HOOK('CHEM_BASCOETM5',0,ZHOOK_HANDLE ) ASSOCIATE(YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO,YDERDI=>YDMODEL%YRML_PHY_RAD%YRERDI, & & YDCHEM=>YDMODEL%YRML_CHEM%YRCHEM, YDEAERSNK=>YDMODEL%YRML_PHY_AER%YREAERSNK, & + & YDEAERVOL=>YDMODEL%YRML_PHY_AER%YREAERVOL, & & YDEAERSRC=>YDMODEL%YRML_PHY_AER%YREAERSRC, YDEAERATM=>YDMODEL%YRML_PHY_RAD%YREAERATM, & & YDECLD=>YDMODEL%YRML_PHY_EC%YRECLD, & & YGFL=>YDMODEL%YRML_GCONF%YGFL, YDRIP=>YDMODEL%YRML_GCONF%YRRIP, & @@ -818,13 +819,15 @@ SUBROUTINE CHEM_BASCOETM5 & IF ( LCHEM_AEROI ) THEN IF (TRIM(AERO_SCHEME)=="aer" )THEN ! * from MACC fields - CALL TM5_MACC_AEROSOL(KIDIA,KFDIA,KLON,KLEV, KAERO, & + CALL TM5_MACC_AEROSOL(YDEAERSNK,YDEAERVOL,YDEAERATM, KIDIA,KFDIA,KLON,KLEV, KAERO, & & PRS1 , PAEROP , ZRHCL , & & ZTAUS_AER,ZTAUA_AER,ZPMAER) ELSEIF (TRIM(AERO_SCHEME)=="glomap") THEN - CALL TM5_GLOMAP_AEROSOL(KIDIA,KFDIA,KLON,KLEV, & - & PAERAOT, PAERAAOT, PAERASY, & - & ZTAUS_AER,ZTAUA_AER,ZPMAER) + + WRITE(NULERR,*)'Not a valid Aerosol interaction scheme:',TRIM(AERO_SCHEME) + !CALL TM5_GLOMAP_AEROSOL(KIDIA,KFDIA,KLON,KLEV, & + !& PAERAOT, PAERAAOT, PAERASY, & + !& ZTAUS_AER,ZTAUA_AER,ZPMAER) ELSE WRITE(NULERR,*)'No valid Aerosol interaction available:',LCHEM_AEROI,TRIM(AERO_SCHEME) ENDIF diff --git a/ifs-source/arpifs/chem/chem_tm5.F90 b/ifs-source/arpifs/chem/chem_tm5.F90 index e33447ba..034e3609 100644 --- a/ifs-source/arpifs/chem/chem_tm5.F90 +++ b/ifs-source/arpifs/chem/chem_tm5.F90 @@ -305,7 +305,7 @@ SUBROUTINE CHEM_TM5& #include "tm5_do_ebi.intfb.h" ! #include "tm5_do_ebi_tc02b.intfb.h" #include "tm5_eqsam.intfb.h" -#include "tm5_glomap_aerosol.intfb.h" +!#include "tm5_glomap_aerosol.intfb.h" #include "tm5_ibud.intfb.h" #include "tm5_macc_aerosol.intfb.h" #include "tm5_o3s.intfb.h" @@ -329,7 +329,7 @@ SUBROUTINE CHEM_TM5& ASSOCIATE(YDECLD=>YDMODEL%YRML_PHY_EC%YRECLD,YGFL=>YDMODEL%YRML_GCONF%YGFL,& & YDCHEM=>YDMODEL%YRML_CHEM%YRCHEM, YDERDI=>YDMODEL%YRML_PHY_RAD%YRERDI, & & YDEAERSRC=>YDMODEL%YRML_PHY_AER%YREAERSRC, YDEAERSNK=>YDMODEL%YRML_PHY_AER%YREAERSNK, & - & YDEAERVOL=>YDMODEL%YRML_PHY_AER%YREAERVOL, + & YDEAERVOL=>YDMODEL%YRML_PHY_AER%YREAERVOL, & & YDEAERATM=>YDMODEL%YRML_PHY_RAD%YREAERATM, YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO, & & LPHYLIN=>YDMODEL%YRML_PHY_SLIN%YREPHLI%LPHYLIN) ASSOCIATE(NACTAERO=>YGFL%NACTAERO, NCHEM=>YGFL%NCHEM, NCHEM_DV=>YGFL%NCHEM_DV, & @@ -502,9 +502,10 @@ SUBROUTINE CHEM_TM5& & PRS1 , PAEROP , ZRHCL , & & ZTAUS_AER,ZTAUA_AER,ZPMAER) ELSEIF (TRIM(AERO_SCHEME)=="glomap") THEN - CALL TM5_GLOMAP_AEROSOL(KIDIA,KFDIA,KLON,KLEV, & - & PAERAOT, PAERAAOT, PAERASY, & - & ZTAUS_AER,ZTAUA_AER,ZPMAER) + WRITE(NULERR,*)'This option for AEROSOL_SCHEME is not possible yet',TRIM(AERO_SCHEME) + !CALL TM5_GLOMAP_AEROSOL(KIDIA,KFDIA,KLON,KLEV, & + !& PAERAOT, PAERAAOT, PAERASY, & + !& ZTAUS_AER,ZTAUA_AER,ZPMAER) ELSE WRITE(NULERR,*)'No valid Aerosol interaction available:',LCHEM_AEROI,TRIM(AERO_SCHEME) ENDIF diff --git a/ifs-source/arpifs/chem/tm5_glomap_aerosol.F90 b/ifs-source/arpifs/chem/tm5_glomap_aerosol.F90 deleted file mode 100644 index fdb5008b..00000000 --- a/ifs-source/arpifs/chem/tm5_glomap_aerosol.F90 +++ /dev/null @@ -1,168 +0,0 @@ -! (C) Copyright 2009- ECMWF. -! This software is licensed under the terms of the Apache Licence Version 2.0 -! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. -! -! In applying this licence, ECMWF does not waive the privileges and immunities -! granted to it by virtue of its status as an intergovernmental organisation -! nor does it submit to any jurisdiction - -SUBROUTINE TM5_GLOMAP_AEROSOL ( KIDIA,KFDIA,KLON,KLEV, & - & PAERAOT, PAERAAOT, PAERASY, & - & PTAUS_AER,PTAUA_AER, PMAER ) - - -!** DESCRIPTION -! ---------- -! -! Part of TM5 routines for IFS chemistry: -! -! -! assignment of aerosol optical depths -! To be used for TM5 phosolysis at specific wavelengths. -! Interpolated from GLOMAP fields -! -!------------------------------------------------------------------ -! -! -!** INTERFACE. -! ---------- -! *TM5_GLOMAP_AEROSOL* IS CALLED FROM *CHEM_tm5*. - -! INPUTS: -! ------- -! KIDIA : Start of Array -! KFDIA : End of Array -! KLON : Length of Arrays -! KLEV : NUMBER OF LEVELS -! PAERAOT(KLON,KLEV,6) : Glomap extinction AOD per model level at 6 wavelengths -! PAERAAOT(KLON,KLEV,6) : Glomap absorption AOD per model level at 6 wavelengths -! PAERASY(KLON,KLEV,6) : Glomap asymetry factor -! -! OUTPUTS: -! ------- -! -! PMAER -! PTAUS_AER -! PTAUA_AER -! -! LOCAL: -! ------- -! -! -! AUTHOR. -! ------- -! Original : 2018-08-31 Vincent Huijnen (KNMI) -! -! -! MODIFICATIONS. -! -------------- -! -!----------------------------------------------------------------------- - -USE PARKIND1 , ONLY : JPIM ,JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK -USE TM5_PHOTOLYSIS , ONLY : NBANDS_TROP, NGRID, WL_EFF, WL_GLOMAP - - -IMPLICIT NONE - -!----------------------------------------------------------------------- -!* 0.1 ARGUMENTS -! --------- - -INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA, KFDIA, KLON, KLEV - -REAL(KIND=JPRB) ,INTENT(IN) :: PAERAOT(KLON,KLEV,6) -REAL(KIND=JPRB) ,INTENT(IN) :: PAERAAOT(KLON,KLEV,6) -REAL(KIND=JPRB) ,INTENT(IN) :: PAERASY(KLON,KLEV,6) - -REAL(KIND=JPRB), INTENT(OUT) :: PTAUS_AER(KLON,KLEV,NBANDS_TROP,NGRID) -REAL(KIND=JPRB), INTENT(OUT) :: PTAUA_AER(KLON,KLEV,NBANDS_TROP,NGRID) -REAL(KIND=JPRB), INTENT(OUT) :: PMAER(KLON,KLEV,NBANDS_TROP,NGRID) - - - -! * LOCAL -INTEGER(KIND=JPIM) :: JB, JK, JL - -! REAL(KIND=JPRB) :: ZFAC, ZF1,ZF2 - -REAL(KIND=JPHOOK) :: ZHOOK_HANDLE - -!----------------------------------------------------------------------- -!----------------------------------------------------------------------- -!----------------------------------------------------------------------- - -IF (LHOOK) CALL DR_HOOK('TM5_GLOMAP_AEROSOL',0,ZHOOK_HANDLE ) - -! 6 GLOMAP wavelengths correspond to: 380, 440, 550, 670, 870 and 1020 nm - -DO JB = 1,6 - ! For these wavelengths don't interpolate the asymetry. - ! just take its value at lowest wavelength. - ! For AOD, assume AOD(lambda) ~ lambda^(-1), so: - ! AOD(lambda) = AOD(lambda=380) *(380/lambda) - DO JK=1,KLEV - DO JL=KIDIA,KFDIA - ! Fill Absorption aerosol layer - PTAUA_AER(JL,JK,JB,1)=PAERAAOT(JL,JK,1)*WL_GLOMAP(1)/WL_EFF(JB) - PTAUA_AER(JL,JK,JB,2)=PTAUA_AER(JL,JK,JB,1) - - - ! Fill scattering aerosol layer: (note: scattering = extinction - absorption) - PTAUS_AER(JL,JK,JB,1)= MAX(0._JPRB, PAERAOT(JL,JK,1)-PAERAAOT(JL,JK,1))*WL_GLOMAP(1)/WL_EFF(JB) - PTAUS_AER(JL,JK,JB,2)= PTAUS_AER(JL,JK,JB,1) - - PMAER(JL,JK,JB,1)=MAX(MIN(PAERASY(JL,JK,1),1._JPRB),0._JPRB) - PMAER(JL,JK,JB,2)=PMAER(JL,JK,JB,1) - ENDDO - ENDDO -ENDDO - -JB=7 -! For 580 nm just take closest value which is at 550 nm, which is index 3 -DO JK=1,KLEV - DO JL=KIDIA,KFDIA - ! Fill Absorption aerosol layer - PTAUA_AER(JL,JK,JB,1)=PAERAAOT(JL,JK,3) - PTAUA_AER(JL,JK,JB,2)=PTAUA_AER(JL,JK,JB,1) - - - ! Fill scattering aerosol layer: (note: scattering = extinction - absorption) - PTAUS_AER(JL,JK,JB,1)= MAX(0._JPRB, PAERAOT(JL,JK,3)-PAERAAOT(JL,JK,3)) - PTAUS_AER(JL,JK,JB,2)= PTAUS_AER(JL,JK,JB,1) - - PMAER(JL,JK,JB,1)=MAX(MIN(PAERASY(JL,JK,3),1._JPRB),0._JPRB) - PMAER(JL,JK,JB,2)=PMAER(JL,JK,JB,1) - ENDDO -ENDDO - - -! ! Code to interpolate for specified wavelengths . Not used -! DO JB = 7 ,7 -! ZF1=(WL_EFF(JB)-WL_GLOMAP(1)) / (WL_GLOMAP(2)-WL_GLOMAP(1)) -! ! ensure validity -! ZF1=MAX(0._JPRB,MIN(1._JPRB,ZF1)) -! ZF2=1.-ZF1 -! DO JK=1,KLEV -! DO JL = KIDIA,KFDIA -! PTAUA_AER(JL,JK,JB,1)=MAX(0._JPRB,ZF2*PAERAAOT(JL,JK,1)+ ZF1*PAERAAOT(JL,JK,2)) -! PTAUA_AER(JL,JK,JB,2)=PTAUA_AER(JL,JK,JB,1) -! -! PTAUS_AER(JL,JK,JB,1)=MAX(0._JPRB,ZF2*(PAERAOT(JL,JK,1)-PAERAAOT(JL,JK,1))+ ZF1*(PAERAOT(JL,JK,2)-PAERAAOT(JL,JK,2))) -! PTAUS_AER(JL,JK,JB,2)=PTAUS_AER(JL,JK,JB,1) -! IF (PTAUS_AER(JL,JK,JB,1) > 0._JPRB ) THEN -! PMAER(JL,JK,JB,1)=MAX(MIN(ZF2*PAERASY(JL,JK,1)+ZF1*PAERASY(JL,JK,2),1._JPRB),0._JPRB) -! PMAER(JL,JK,JB,2)=PMAER(JL,JK,JB,1) -! ELSE -! PMAER(JL,JK,JB,1)=0._JPRB -! PMAER(JL,JK,JB,2)=0._JPRB -! ENDIF -! ENDDO -! ENDDO -! ENDDO - - -IF (LHOOK) CALL DR_HOOK('TM5_GLOMAP_AEROSOL',1,ZHOOK_HANDLE ) -END SUBROUTINE TM5_GLOMAP_AEROSOL - diff --git a/ifs-source/arpifs/chem/tm5_wetchem_m7.F90 b/ifs-source/arpifs/chem/tm5_wetchem_m7.F90 index 9eda3046..ef85620e 100644 --- a/ifs-source/arpifs/chem/tm5_wetchem_m7.F90 +++ b/ifs-source/arpifs/chem/tm5_wetchem_m7.F90 @@ -32,7 +32,7 @@ SUBROUTINE TM5_WETCHEM_M7(KIDIA, KFDIA, KLON,KAERO,PDT,PTEMP,PAP,PRS,PLP,PY0,PHP !********************************************************************** USE PARKIND1 , ONLY : JPIM, JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK +USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK USE YOMCST , ONLY : RNAVO,RMD USE YOM_YGFL , ONLY : YGFL USE TM5_CHEM_MODULE,ONLY: NREACW,NTLOW,NTEMP,KSO2HP,KSO2O3, & @@ -56,7 +56,7 @@ SUBROUTINE TM5_WETCHEM_M7(KIDIA, KFDIA, KLON,KAERO,PDT,PTEMP,PAP,PRS,PLP,PY0,PHP ! * LOCAL -REAL(KIND=JPRB) :: ZHOOK_HANDLE +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE INTEGER(KIND=JPIM) :: ITEMP,ITER,JL REAL(KIND=JPRB) :: ZX1,ZX2,ZX3,ZB1,ZB2,ZSO2X,ZDSO2,ZDISC,ZDNH3,ZXSO2O3A,ZXSO2O3B diff --git a/ifs-source/arpifs/control/cnt4.F90 b/ifs-source/arpifs/control/cnt4.F90 index 899de4c7..849322ac 100644 --- a/ifs-source/arpifs/control/cnt4.F90 +++ b/ifs-source/arpifs/control/cnt4.F90 @@ -522,7 +522,7 @@ SUBROUTINE CNT4(YDGEOMETRY,YDFIELDS,YDMTRAJ,YDMODEL,YDJOT,YDVARBC,YDTCV,YDGOM5,Y ! all other processes are dealt with in TM5-M7 ! therefore we also have to initialize TM5-M7 CALL TM5M7_INIT(YDGEOMETRY, YDMODEL%YRML_CHEM%YRCOMPO, YGFL, YDMODEL%YRML_PHY_RAD%YRERAD) - CALL HAMM7_INIT(YGFL) !requires stuff which is defined in TM5M7_INIT + CALL HAMM7_INIT(YGFL, YDRIP) !requires stuff which is defined in TM5M7_INIT CASE DEFAULT ! Option not implemented CALL ABOR1(" NO AEROSOL SCHEME "//TRIM(AERO_SCHEME)) diff --git a/ifs-source/arpifs/module/surface_fields_mix.F90 b/ifs-source/arpifs/module/surface_fields_mix.F90 index e2e081f0..8cadd00f 100644 --- a/ifs-source/arpifs/module/surface_fields_mix.F90 +++ b/ifs-source/arpifs/module/surface_fields_mix.F90 @@ -335,7 +335,23 @@ MODULE SURFACE_FIELDS_MIX ! Indices to start/end albedo climatology coefficients currently in use INTEGER(KIND=JPIM) :: IALSTART, IALEND TYPE(TYPE_SURF_MTL_2D), POINTER :: YFP1 =>NULL() ! surface orography in the 2nd part of FULLPOS-927 + + TYPE(TYPE_SURF_MTL_2D), POINTER :: YBCBF ! black carbon biogenic + TYPE(TYPE_SURF_MTL_2D), POINTER :: YBCFF ! black carbon fossil fuel + TYPE(TYPE_SURF_MTL_2D), POINTER :: YBCGF ! black carbon GFED + TYPE(TYPE_SURF_MTL_2D), POINTER :: YOMBF ! organic matter biogenic + TYPE(TYPE_SURF_MTL_2D), POINTER :: YOMFF ! organic matter fossil fuel + TYPE(TYPE_SURF_MTL_2D), POINTER :: YOMGF ! organic matter GFED + + TYPE(TYPE_SURF_MTL_2D), POINTER :: YINJF =>NULL() ! height of maximum injection for biomass burning emissions + TYPE(TYPE_SURF_MTL_2D), POINTER :: YSO2L=>NULL() ! sulphate low level + TYPE(TYPE_SURF_MTL_2D), POINTER :: YSO2H=>NULL() ! sulphate higher level TYPE(TYPE_SURF_MTL_2D), POINTER :: YSO2DD=>NULL() ! sulphate dry dep velocity + TYPE(TYPE_SURF_MTL_2D), POINTER :: YSOGF=>NULL() ! sulphate GFED + TYPE(TYPE_SURF_MTL_2D), POINTER :: YSOA=>NULL() ! secondary organic + TYPE(TYPE_SURF_MTL_2D), POINTER :: YVOLC=>NULL() ! volcanic continuous + TYPE(TYPE_SURF_MTL_2D), POINTER :: YVOLE=>NULL() ! volcanic explosive + TYPE(TYPE_SURF_MTL_2D), POINTER :: YSOACO=>NULL() ! SOA from CO TYPE(TYPE_SURF_MTL_2D), POINTER :: YDMSO =>NULL() ! oceanic DMS TYPE(TYPE_SURF_MTL_2D), POINTER :: YURBF =>NULL() ! Urban fraction TYPE(TYPE_SURF_MTL_2D), POINTER :: YFCA1 =>NULL() ! Fraction of calcite over dust 1st bin @@ -343,6 +359,7 @@ MODULE SURFACE_FIELDS_MIX TYPE(TYPE_SURF_MTL_2D), POINTER :: YAERDEP=>NULL() ! dust emission potential TYPE(TYPE_SURF_MTL_2D), POINTER :: YAERLTS=>NULL() ! dust lifting threshold speed TYPE(TYPE_SURF_MTL_2D), POINTER :: YAERSCC=>NULL() ! dust soil clay content + TYPE(TYPE_SURF_MTL_2D), POINTER :: YSOILTYPE ! TM5M7 soil type information TYPE(TYPE_SURF_MTL_2D), POINTER :: YDSF =>NULL() ! dust source function TYPE(TYPE_SURF_MTL_2D), POINTER :: YDSZ =>NULL() ! dust size distribution modulation TYPE(TYPE_SURF_MTL_2D), POINTER :: YCHEMFLXO(:)=>NULL() ! total chemistry flux (emissions + deposition) diff --git a/ifs-source/arpifs/module/tm5_photolysis.F90 b/ifs-source/arpifs/module/tm5_photolysis.F90 index 789b9c3c..81a57bd6 100644 --- a/ifs-source/arpifs/module/tm5_photolysis.F90 +++ b/ifs-source/arpifs/module/tm5_photolysis.F90 @@ -145,10 +145,7 @@ MODULE TM5_PHOTOLYSIS REAL(KIND=JPRB), DIMENSION(2), PARAMETER :: WL_AER = (/ & & 340., 645. /) -! Wavelengths at which glomap aerosol input is expected -REAL(KIND=JPRB), DIMENSION(2), PARAMETER :: WL_GLOMAP = (/ & - & 320., 542. /) - +INTEGER(KIND=JPIM),DIMENSION(NBANDS_TROP) :: WAV_GRID, WAV_GRIDA INTEGER(KIND=JPIM),DIMENSION(7),PARAMETER :: & & LINI = (/1, 18, 31, 40, 48, 61, 78 /), & @@ -608,4 +605,7 @@ MODULE TM5_PHOTOLYSIS & (/.253817E+01 ,.253817E+01 ,.254719E+01 ,.254719E+01 ,.254719E+01 ,.253815E+01,.250875E+01/) +! Logical to test whether photolysis data has been initialized +LOGICAL :: LL_TM5_PHOTO_INI = .FALSE. + END MODULE TM5_PHOTOLYSIS diff --git a/ifs-source/arpifs/module/yoeaeratm.F90 b/ifs-source/arpifs/module/yoeaeratm.F90 index 107816fc..75112719 100644 --- a/ifs-source/arpifs/module/yoeaeratm.F90 +++ b/ifs-source/arpifs/module/yoeaeratm.F90 @@ -62,11 +62,13 @@ MODULE YOEAERATM REAL(KIND=JPRB) :: REPSCAER LOGICAL :: LAERCLIMG, LAERCLIMZ, LAERCLIST, LAERDRYDP, LAERHYGRO, LAERLISI -LOGICAL :: LAERNGAT , LAERSEDIM, LAERSURF , LAERELVS , LAER6SDIA,LAERSEDIMSS +LOGICAL :: LAERNGAT , LAERSCAV, LAERSEDIM, LAERSURF , LAERELVS , LAER6SDIA,LAERSEDIMSS LOGICAL :: LAERGTOP , LAERRAD , LAERCCN , LAEROPT(9),LAERINIT , LAERVOL -LOGICAL :: LAERCSTR , LAERDIAG1, LAERDIAG2, LAERRRTM , LAERUVP -LOGICAL :: LAEREXTR , LAERGBUD , LAERPRNT +LOGICAL :: LAERCSTR , LAERDIAG1, LAERDIAG2, LAERRRTM , LAERUVP, LUVINDX +LOGICAL :: LAEREXTR , LAERGBUD , LAERPRNT, LAERCALIP LOGICAL :: LAERNITRATE +LOGICAL :: LAERSOA_CHEM +LOGICAL :: LAERSCAV_CHEM LOGICAL :: LSEASALT_RH80 LOGICAL :: LAERDUSTSOURCE LOGICAL :: LAERDUSTSIZEVAR diff --git a/ifs-source/arpifs/module/yoeaersnk.F90 b/ifs-source/arpifs/module/yoeaersnk.F90 index 33300310..e8ed809b 100644 --- a/ifs-source/arpifs/module/yoeaersnk.F90 +++ b/ifs-source/arpifs/module/yoeaersnk.F90 @@ -23,6 +23,7 @@ MODULE YOEAERSNK ! ------------------------------------------------------------------ TYPE :: TEAERSNK +LOGICAL :: LDRYDEPVEL_DYN INTEGER(KIND=JPIM):: NDRYDEPVEL_DYN INTEGER(KIND=JPIM) :: NDRYDEP REAL(KIND=JPRB) :: R_R, R_S diff --git a/ifs-source/arpifs/module/yom_ygfl.F90 b/ifs-source/arpifs/module/yom_ygfl.F90 index 30e1b456..a7329fea 100644 --- a/ifs-source/arpifs/module/yom_ygfl.F90 +++ b/ifs-source/arpifs/module/yom_ygfl.F90 @@ -236,6 +236,7 @@ MODULE YOM_YGFL INTEGER(KIND=JPIM) :: NGFL_FORC INTEGER(KIND=JPIM) :: NGFL_EZDIAG INTEGER(KIND=JPIM) :: NGHG +INTEGER(KIND=JPIM) :: NTRAC !!! added due to M7 INTEGER(KIND=JPIM) :: NGHG_ASSIM INTEGER(KIND=JPIM) :: NAERO INTEGER(KIND=JPIM) :: NACTAERO @@ -351,6 +352,10 @@ MODULE YOM_YGFL TYPE(TYPE_GFL_COMP),POINTER :: YGHG(:) => NULL() ! Greenhouse Gases TYPE(TYPE_GFL_COMP),POINTER :: YCHEM(:) => NULL() ! Chemistry TYPE(TYPE_GFL_COMP),POINTER :: YAERO(:) => NULL() ! Aerosols + +TYPE(TYPE_GFL_COMP),POINTER :: YTRAC(:) => NULL() ! tracers for diagnostics, due to M7 + + TYPE(TYPE_GFL_COMP),POINTER :: YLRCH4 => NULL() ! CH4 loss rate (instantaneous field) TYPE(TYPE_GFL_COMP),POINTER :: YEMIS3D(:) => NULL() ! 3D emissions for atmospheric composition TYPE(TYPE_GFL_COMP),POINTER :: YFORC(:) => NULL() ! large scale forcing diff --git a/ifs-source/arpifs/module/yomcompo.F90 b/ifs-source/arpifs/module/yomcompo.F90 index 1de46865..ee0ef657 100644 --- a/ifs-source/arpifs/module/yomcompo.F90 +++ b/ifs-source/arpifs/module/yomcompo.F90 @@ -76,6 +76,11 @@ MODULE YOMCOMPO END TYPE TCOMPO_EMIS_AUX TYPE :: TCOMPO +! m7 related + + LOGICAL :: LAERODIU + LOGICAL :: LFIRE + LOGICAL :: LINJ ! mass diagnostics switch for global budget LOGICAL :: LCHEM_DIA ! period (in hours) on which to output budget diff --git a/ifs-source/arpifs/namelist/namm7ctl.nam.h b/ifs-source/arpifs/namelist/namm7ctl.nam.h new file mode 100644 index 00000000..19194d0f --- /dev/null +++ b/ifs-source/arpifs/namelist/namm7ctl.nam.h @@ -0,0 +1,7 @@ +! AUTHOR. +! ------- +! 2020-11-17 Tero Mielonen (TeMi) +! ----------------------------------------------------------------- +NAMELIST/NAMM7CTL/& + & NWATER, NSNUCL, NONUCL +! ----------------------------------------------------------------- \ No newline at end of file diff --git a/ifs-source/arpifs/phys_ec/aer_negat.F90 b/ifs-source/arpifs/phys_ec/aer_negat.F90 index 843edadb..08dab845 100644 --- a/ifs-source/arpifs/phys_ec/aer_negat.F90 +++ b/ifs-source/arpifs/phys_ec/aer_negat.F90 @@ -1,5 +1,5 @@ SUBROUTINE AER_NEGAT & - & ( KIDIA , KFDIA , KLON, KLEV,& + & ( YREAERATM, KIDIA , KFDIA , KLON, KLEV,& & PTSPHY , & & PCAERO , PTAERO, PAPHP1, & & PFAERNG ) @@ -51,10 +51,11 @@ SUBROUTINE AER_NEGAT & USE YOMHOOK ,ONLY : LHOOK, DR_HOOK USE YOMCST , ONLY : RG -USE YOEAERATM, ONLY : YREAERATM +USE YOEAERATM, ONLY :TEAERATM! YREAERATM IMPLICIT NONE +TYPE(TEAERATM), INTENT(IN) :: YREAERATM INTEGER(KIND=JPIM),INTENT(IN) :: KLON INTEGER(KIND=JPIM),INTENT(IN) :: KLEV INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA diff --git a/ifs-source/arpifs/phys_ec/aer_phy3.F90 b/ifs-source/arpifs/phys_ec/aer_phy3.F90 index 02f4541d..4469555e 100644 --- a/ifs-source/arpifs/phys_ec/aer_phy3.F90 +++ b/ifs-source/arpifs/phys_ec/aer_phy3.F90 @@ -624,7 +624,7 @@ SUBROUTINE AER_PHY3 & & PTSPHY, PTP , PRSF1 , PAP , ZQLI , PGELAT, PGELAM, & & ZSO2 , ZITSO2, PGFL(:,:,YAEROCLIM(1)%MP), & & PGFL(:,:,YAEROCLIM(2)%MP), PGFL(:,:,YAEROCLIM(3)%MP) ,& - & ZTSO2 , ZTSO4, ZFSO2, ZFSO4, ZDP ) + & ZTSO2 , ZTSO4, ZTSO4_AQ, ZFSO2, ZFSO4, ZFSO4_AQ, ZDP ) CASE DEFAULT CALL ABOR1('ABORT: IN AER_PHY3, NSO4SCHEME MUST BE 1 OR 2') END SELECT diff --git a/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 b/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 index 279b1346..0c979fd5 100644 --- a/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 +++ b/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 @@ -73,6 +73,7 @@ SUBROUTINE AER_PHY3_LAYER(YDSURF, & & AUX_DIAG_LOCAL_TYPE, SURF_AND_MORE_TYPE, FLUX_TYPE, & & GEMS_LOCAL_TYPE, SURF_AND_MORE_LOCAL_TYPE, AUX_RAD_TYPE, AUX_DIAG_TYPE USE YOECLDP , ONLY : NCLDQL, NCLDQI, NCLDQR, NCLDQS +USE TM5_PHOTOLYSIS, ONLY : NBANDS_TROP USE YOE_AERODIAG, ONLY : NPAERAOT, NPAERLISI_VAR, NPAERLISI_WVL, JPAERO_WVL_AOD USE TM5_CHEM_MODULE , ONLY : NCHEM2AER diff --git a/ifs-source/arpifs/phys_ec/aer_src.F90 b/ifs-source/arpifs/phys_ec/aer_src.F90 index 974f4824..54cdcddc 100644 --- a/ifs-source/arpifs/phys_ec/aer_src.F90 +++ b/ifs-source/arpifs/phys_ec/aer_src.F90 @@ -205,7 +205,7 @@ SUBROUTINE AER_SRC & !----------------------------------------------------------------------- #include "updcal.intfb.h" -!#include "fcttim.func.h" +#include "fcttim.func.h" #include "surf_inq.h" diff --git a/ifs-source/arpifs/phys_ec/aerini_layer.F90 b/ifs-source/arpifs/phys_ec/aerini_layer.F90 index b0cf5462..2f68ba7b 100644 --- a/ifs-source/arpifs/phys_ec/aerini_layer.F90 +++ b/ifs-source/arpifs/phys_ec/aerini_layer.F90 @@ -112,6 +112,7 @@ SUBROUTINE AERINI_LAYER(YDGEOMETRY,YDSURF,& REAL(KIND=JPHOOK) :: ZHOOK_HANDLE +REAL(KIND=JPRB) :: PSO4SRC(KDIM%KLON,KDIM%KLEV),PSO2SRC(KDIM%KLON,KDIM%KLEV) REAL(KIND=JPRB) :: ZSNM(KDIM%KLON) !----------------------------------------------------------------------- @@ -167,7 +168,7 @@ SUBROUTINE AERINI_LAYER(YDGEOMETRY,YDSURF,& IF(.not. LAERCHEM)THEN - call simple_sulfur_src(YDGEOMETRY, KDIM%KIDIA, KDIM%KFDIA, KDIM%KLON , KDIM%KTDIA, KDIM%KLEV,& + call simple_sulfur_src(YDGEOMETRY, YDMODEL, KDIM%KIDIA, KDIM%KFDIA, KDIM%KLON , KDIM%KTDIA, KDIM%KLEV,& & KDIM%KSTGLO, GEMSL%ITRAC, GEMSL%IAERO, & & PAUX%PAPHI, & & PSURF%PSD_VF(:,YSD_VF%YSO2L%MP), PSURF%PSD_VF(:,YSD_VF%YSO2H%MP), & @@ -208,15 +209,15 @@ SUBROUTINE AERINI_LAYER(YDGEOMETRY,YDSURF,& & PSURF%PSD_VF(:,YSD_VF%YSOGF%MP),& & PSURF%PSD_VF(:,YSD_VF%YVOLC%MP), PSURF%PSD_VF(:,YSD_VF%YVOLE%MP), PSURF%PSD_VF(:,YSD_VF%YSOA%MP) ,& & PSURF%PSD_VF(:,YSD_VF%YSOACO%MP),PSURF%PSD_VF(:,YSD_VF%YDMSO%MP), PSURF%PSD_VF(:,YSD_VF%YSOILTYPE%MP), & - !TB added lake cover: YCLK + !TB added lake cover: YCLK, !!!PSP_SG 2 dims becomes now 3 dims & PSURF%PSD_VF(:,YSD_VF%YCI%MP), PSURF%PSD_VF(:,YSD_VF%YCLK%MP) , PSURF%PSD_VF(:,YSD_VF%YINJF%MP) , PSURF%PSD_VD(:,YSD_VD%YBLH%MP) ,& & SURFL%ZFRTI, PSURF%PSD_VF(:,YSD_VF%YLSM%MP) , PSURF%PSD_VF(:,YSD_VF%YSST%MP), STATE%Q, & - & PSURF%PSP_SG(:,YSP_SG%YF%MP9) , PSURF%PSP_RR(:,YSP_RR%YT%MP9) , PAUX%PGELAM, PAUX%PGELAT, PAUX%PGEMU, SURFL%ZHSDFOR,& + & PSURF%PSP_SG(:,1,YSP_SG%YF%MP9) , PSURF%PSP_RR(:,YSP_RR%YT%MP9) , PAUX%PGELAM, PAUX%PGELAT, PAUX%PGEMU, SURFL%ZHSDFOR,& & STATE%U(:,KDIM%KLEV) , STATE%V(:,KDIM%KLEV) , PSURF%PSP_SB(:,1,YSP_SB%YQ%MP9), TSPHY, GEMSL%ZAZ0M,& & GEMSL%ICHEM,& !VH - Introduce Land use info... & PSURF%PCVL, PSURF%PCVH,PSURF%ITVL,PSURF%ITVH, & - & PSURF%PAHFSTI,FLUX%PFTLHEV, & + & PSURF%PAHFSTI, &!!!FLUX%PFTLHEV, & !VH - end & GEMSL%ZCFLX, GEMSL%ZTENC,& & GEMSL%ZDMSO, GEMSL%ZLDAY, GEMSL%ZLISS, GEMSL%ZSO2, GEMSL%ZTDMS,& diff --git a/ifs-source/arpifs/phys_ec/hamm7_init.F90 b/ifs-source/arpifs/phys_ec/hamm7_init.F90 index 1b9fbcb1..497d31de 100644 --- a/ifs-source/arpifs/phys_ec/hamm7_init.F90 +++ b/ifs-source/arpifs/phys_ec/hamm7_init.F90 @@ -1,4 +1,4 @@ -SUBROUTINE hamm7_init(YGFL) +SUBROUTINE hamm7_init(YGFL, YRRIP) !** DESCRIPTION ! ---------- @@ -41,6 +41,7 @@ SUBROUTINE hamm7_init(YGFL) !USE YOM_YGFL , ONLY : & ! YGFL +USE YOMRIP, ONLY: TRIP USE YOM_YGFL , ONLY : TYPE_GFLD!YGFL ! --> thk: bug fix @@ -106,6 +107,7 @@ SUBROUTINE hamm7_init(YGFL) IMPLICIT NONE TYPE(TYPE_GFLD) ,INTENT(IN) :: YGFL +TYPE(TRIP) ,INTENT(IN) :: YRRIP !---------------------------------------------------------------------- !* 0.5 LOCAL VARIABLES @@ -128,7 +130,7 @@ SUBROUTINE hamm7_init(YGFL) IF (LHOOK) CALL DR_HOOK('HAMM7_INIT',0,ZHOOK_HANDLE) ! getting the correct time step: -CALL init_mo_time_control +CALL init_mo_time_control(YRRIP) !eehol: set advection scheme iadvec = tpcore !comes from ECHAM mo_control.f90 diff --git a/ifs-source/arpifs/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/phys_ec/hamm7_interface.F90 index 8405e04a..2975b8e9 100755 --- a/ifs-source/arpifs/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/phys_ec/hamm7_interface.F90 @@ -9,12 +9,10 @@ SUBROUTINE HAMM7_INTERFACE & & PALBD , PFRTI , PLSM , PSNS , PWND , PWS1 , PAERFLX, PAERLIF, & & PAERODDF,PTSPHY , PGFL , & & PODTO , PAERO_WVL_DIAG, & - & !PODTO469 , PODTO670 , PODTO865 , PODTO1240 , & & PAER_TAU, PAER_SSA,PAER_ASYM,PAER_TAU_LW,& & PTAUS_AER,PTAUA_AER,PPMAER, & & PEXTRA, PVERVEL, PCCNL, PCCNO, PAHFSTI, PCI, PZ0M, PAHFLEV, & !eehol: added here vertical velocity, CCN over land, CCN over ocean & PUP, PVP, PCVL, PCVH, PSO2DD, PGEMU)!, PTSO2, PTSO4, PTSO4_AQ, PFSO2,PFSO4,PFSO4_AQ& - !&) ! u-wind, v-wind, low veg. cover, high veg. cover, sine of latitude !**** *TM5M7* - ROUTINE DEALING WITH THE TM5M7 AEROSOL COMPUTATIONS: @@ -136,7 +134,8 @@ SUBROUTINE HAMM7_INTERFACE & !USE YOM_YGFL , ONLY : YGFL !USE YOERAD , ONLY : YRERAD !USE YOEPHY , ONLY : YREPHY -USE YOMCST , ONLY : RD, RG, RPI, RMSO2, RMSO4, RMD, RNAVO +USE TYPE_MODEL, ONLY : MODEL +USE YOMCST , ONLY : RD, RG, RPI, RMSO2, RMSO4, RMD, RNAVO !USE YOMPRAD , ONLY : RADGRID ! sine of latitude from RADGRID to effective radius calculations !USE YOECLDP , ONLY : YRECLDP ! for default ICNC and effective radius USE YOMCT0 , ONLY : LIFSMIN, LIFSTRAJ @@ -147,7 +146,12 @@ SUBROUTINE HAMM7_INTERFACE & !! USE YOMLUN , ONLY : NULOUT USE TM5M7_DATA, ONLY: mode_tracers,mode_tracers_by_mods,mode_start,mode_end_so4,naermod,nmod,nsol,iisvoc,ielvoc,iacs_n,iso4,MODAL_DATA, MODE_TRACERS, MODE_TRACERS_BY_MODS, & MODE_START, MODE_END_SO4, NAERMOD, NMOD, NSOL, IISVOC, IELVOC, IACS_N, ISO4, ISO4ACS,ISO4COS -USE YOMCHEM , ONLY : YRCHEM,IEXTR_WD, IEXTR_CH, IEXTR_NG, IEXTR_DD, IEXTR_CHTR +!USE YOMCHEM , ONLY : YRCHEM,IEXTR_WD, IEXTR_CH, IEXTR_NG, IEXTR_DD, IEXTR_CHTR +USE YOMCHEM , ONLY : IEXTR_WD, IEXTR_CH, IEXTR_NG, IEXTR_DD, IEXTR_CHTR + +USE YOE_AERODIAG , ONLY : JPAERO_WVL_AOD, JPAERO_WVL_AODABS, JPAERO_WVL_AODFM, & + & JPAERO_WVL_SSA, JPAERO_WVL_ASSIMETRY + !USE YOMCOMPO , ONLY : YRCOMPO ! implementation of HAM-M7 USE MO_HAM, ONLY: nclass, naerocomp, sizeclass, nccndiag, subm_ngasspec @@ -176,7 +180,7 @@ SUBROUTINE HAMM7_INTERFACE & !----------------------------------------------------------------------- IMPLICIT NONE -TYPE(MODEL) ,INTENT(INOUT):: YDMODEL +TYPE(MODEL) ,INTENT(INOUT):: YDMODEL INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA, KFDIA, KLON INTEGER(KIND=JPIM),INTENT(IN) :: KTDIA, KLEV, KFLDX, KLEVX INTEGER(KIND=JPIM),INTENT(IN) :: KTILES @@ -236,14 +240,15 @@ SUBROUTINE HAMM7_INTERFACE & !REAL(KIND=JPRB), INTENT(INOUT) :: PFSO2(KLON) , PFSO4(KLON), PFSO4_AQ(KLON) !REAL(KIND=JPRB), INTENT(INOUT) :: PTSO2(KLON, KLEV) , PTSO4(KLON, KLEV), PTSO4_AQ(KLON, KLEV) -REAL(KIND=JPRB), INTENT(INOUT) :: ZFSO2(KLON), ZFSO4(KLON), ZFSO4_AQ(KLON) -REAL(KIND=JPRB), INTENT(INOUT) :: ZTSO2(KLON, KLEV), ZTSO4(KLON, KLEV), ZTSO4_AQ(KLON, KLEV) +!REAL(KIND=JPRB), INTENT(INOUT) :: ZFSO2(KLON), ZFSO4(KLON), ZFSO4_AQ(KLON) +!REAL(KIND=JPRB), INTENT(INOUT) :: ZTSO2(KLON, KLEV), ZTSO4(KLON, KLEV), ZTSO4_AQ(KLON, KLEV) !* 0.5 LOCAL VARIABLES ! --------------- INTEGER(KIND=JPIM) :: JAER, JK, JL, JMMD, JSCAV, JSW, JWAVL, JT, JB, JN, JSPEC, ITRC, JEXT, IKLEVTROP(KLON), IW INTEGER(KIND=JPIM) :: JCLASS, JTILE, j_yaero, JMASS, JGAS, JCLOUD ! local loop indice for activation and dry deposition and tracer indexing +INTEGER(KIND=JPIM) :: ISSO2, ISSO4, ISSO4_ACS INTEGER(KIND=JPIM) :: IAER, IEX3D, IEX3DP INTEGER(KIND=JPIM) :: IEXTR2,ISHIFT1, IKPAER, IKP, ISTO, IWHERE INTEGER(KIND=JPIM) :: IMODE ,NSO4SCHEME @@ -260,11 +265,11 @@ SUBROUTINE HAMM7_INTERFACE & REAL(KIND=JPRB) :: ZTBCPHI(KLON,KLEV),ZTBCPHO(KLON,KLEV),ZTOMPHI(KLON,KLEV), ZTOMPHO(KLON,KLEV) REAL(KIND=JPRB) :: ZITBCPHO(KLON,KLEV),ZITOMPHO(KLON,KLEV),ZITSO2(KLON,KLEV) REAL(KIND=JPRB) :: ZFSO2(KLON) , ZFSO4(KLON), ZFSO4_AQ(KLON) -REAL(KIND=JPRB) :: ZTSO2(KLON, KLEV) , ZTSO4(KLON, KLEV) +REAL(KIND=JPRB) :: ZTSO2(KLON, KLEV) , ZTSO4(KLON, KLEV), ZTSO4_AQ(KLON, KLEV) REAL(KIND=JPRB) :: ZAIRDM(KLON) REAL(KIND=JPRB) :: ZQSAT(KLON,KLEV), ZRHCL(KLON,KLEV), ZRHO(KLON,KLEV) -REAL(KIND=JPRB) :: ZTAER(KLON,KLEV), ZTAERI(KLON,KLEV,YGFL%NACTAERO) +REAL(KIND=JPRB) :: ZTAER(KLON,KLEV), ZTAERI(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO) REAL(KIND=JPRB) :: ZTAERO(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO), ZTENV(KLON) REAL(KIND=JPRB) :: ZAERWET(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO) REAL(KIND=JPRB) :: ZRH(KLON,KLEV),ZTENC0(KLON,KLEV)!,ZTSO4(KLON,KLEV) @@ -283,7 +288,7 @@ SUBROUTINE HAMM7_INTERFACE & REAL(KIND=JPRB), DIMENSION(:,:,:), ALLOCATABLE :: ZTAUS_AER, ZTAUA_AER, ZPMAER ! extinctions REAL(KIND=JPRB) :: PODTO469(KLON), PODTO670(KLON), PODTO865(KLON), PODTO1240(KLON) -REAL(KIND=JPRB) :: PAER_TAU(KLON,KLEV,14), PAER_SSA(KLON,KLEV,14),PAER_ASYM(KLON,KLEV,14) +!REAL(KIND=JPRB) :: PAER_TAU(KLON,KLEV,14), PAER_SSA(KLON,KLEV,14),PAER_ASYM(KLON,KLEV,14) REAL(KIND=JPRB) :: ZAER_TAU(KLON,KLEV,14,1), ZAER_SSA(KLON,KLEV,14),ZAER_ASYM(KLON,KLEV,14),ZAER_TAU_LW(KLON,KLEV,16) @@ -442,10 +447,10 @@ SUBROUTINE HAMM7_INTERFACE & !----------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('TM5M7',0,ZHOOK_HANDLE) -ASSOCIATE(& YGFL=>YDMODEL%YRML_GCONF%YGFL, YREAERSRC=>YDMODEL%YRML_PHY_AER%YREAERSRC,YREAERATM=>YDMODEL%YRML_PHY_RAD%YREAERATM, & +ASSOCIATE(YGFL=>YDMODEL%YRML_GCONF%YGFL, YREAERSRC=>YDMODEL%YRML_PHY_AER%YREAERSRC,YREAERATM=>YDMODEL%YRML_PHY_RAD%YREAERATM, & & YREAERLID=>YDMODEL%YRML_PHY_AER%YREAERLID, YREAERSNK=>YDMODEL%YRML_PHY_AER%YREAERSNK, YRERAD=>YDMODEL%YRML_PHY_RAD%YRERAD,& - & YDRIP=>YDMODEL%YRML_GCONF%YRRIP, YRCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO, YREPHY=>YREPHY%YRML_PHY_EC%YREPHY, & - & YRECLDP=>YRECLDP%YRML_PHY_EC%YRECLDP, & + & YDRIP=>YDMODEL%YRML_GCONF%YRRIP,YDCHEM=>YDMODEL%YRML_CHEM%YRCHEM, YRCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO, YREPHY=>YDMODEL%YRML_PHY_EC%YREPHY, & + & YRECLDP=>YDMODEL%YRML_PHY_EC%YRECLDP, & & YDSPP_CONFIG=>YDMODEL%YRML_GCONF%YRSPP_CONFIG, & & NACTAERO=>YGFL%NACTAERO, NAERO=>YGFL%NAERO, NGHG=>YGFL%NGHG, NCHEM=>YGFL%NCHEM, ZTRAC=>YGFL%NTRAC, NSO4SCHEME => YREAERSRC%NSO4SCHEME, & & NDIM=>YGFL%NDIM, YAEROUT=>YGFL%YAEROUT, YR=>YGFL%YR, YS=>YGFL%YS, & @@ -460,17 +465,17 @@ SUBROUTINE HAMM7_INTERFACE & & LAERNITRATE => YREAERATM%LAERNITRATE, & & LAERSCAV_CHEM=>YREAERATM%LAERSCAV_CHEM, LAERVOL=>YREAERATM%LAERVOL, & & LAERCHEM=>YGFL%LAERCHEM, & - & NINDSCAV=>YREAERATM%NINDSCAV, NTSCAV=>YREAERATM%NTSCAV, & +! & NINDSCAV=>YREAERATM%NINDSCAV, NTSCAV=>YREAERATM%NTSCAV, & & NXT3DAER=>YREAERATM%NXT3DAER, & & NWLID=>YREAERLID%NWLID, & - & NDDUST=>YREAERSRC%NDDUST, NTYPAER=>YREAERSRC%NTYPAER, & +! & NDDUST=>YREAERSRC%NDDUST, NTYPAER=>YREAERSRC%NTYPAER, & & YSURF=>YREPHY%YSURF, & & RRHTAB=>YREAERSNK%RRHTAB, & & RNICE=>YRECLDP%RNICE, & !default for ICNC & RCLDMAX=>YRECLDP%RCLDMAX, & !max cloud value & LAERVISI=>YRERAD%LAERVISI, NTSW=>YRERAD%NTSW, RNS=>YRERAD%RNS, & - & RSIGAIR=>YRERAD%RSIGAIR,YAERCLIM=>YGFL%YAERCLIM, & - & NSTART=>YDRIP%NSTART,AERO_SCHEME=>YRCOMPO%AERO_SCHEME,CHEM_SCHEME=>YRCHEM%CHEM_SCHEME,& + & RSIGAIR=>YRERAD%RSIGAIR,YAEROCLIM=>YGFL%YAEROCLIM, & !!! YAERCLIM is now become YAEROCLIM + & NSTART=>YDRIP%NSTART,AERO_SCHEME=>YRCOMPO%AERO_SCHEME,& !CHEM_SCHEME=>YDCHEM%CHEM_SCHEME,& & NAERO_WVL_DIAG=>YGFL%NAERO_WVL_DIAG, & & NRADFR=>YRERAD%NRADFR,NAEROOPT=>YRERAD%NAEROOPT) !FREQUENCY OF FULL RADIATION COMPUTATIONS ! ------------------------------------------------------------------ @@ -653,8 +658,8 @@ SUBROUTINE HAMM7_INTERFACE & END IF END DO - DO JK=1,KDIM%KLEV - DO JL=KDIM%KIDIA,KDIM%KFDIA + DO JK=1,KLEV + DO JL=KIDIA,KFDIA !!!ZDP(JL,JK)= PAUX%PRS1(JL,JK) - PAUX%PRS1(JL,JK-1) ZTSO2(JL,JK)=PTENC(JL,JK,ISSO2) ZTSO4(JL,JK)=PTENC(JL,JK,ISSO4) @@ -1360,7 +1365,7 @@ SUBROUTINE HAMM7_INTERFACE & ENDDO CALL AER_NEGAT & - & ( KIDIA , KFDIA, KLON , KLEV, & + & ( YREAERATM, KIDIA , KFDIA, KLON , KLEV, & & PTSPHY , & & ZAER , ZTAER, PRS1, & & ZAERNEG ) @@ -1482,7 +1487,7 @@ SUBROUTINE HAMM7_INTERFACE & ENDDO ENDDO ENDDO - CALL TM5M7_OPTICS_AOP_GET(KIDIA,KFDIA, KLON, KLEV,NACTAERO, & + CALL TM5M7_OPTICS_AOP_GET(YGFL, YREAERSRC, KIDIA,KFDIA, KLON, KLEV,NACTAERO, & & NASWBAND, ASWBAND, 1, .false., & & ZRHO, ZAEROK+(ZTAERO*time_step_len),RW_MODE,RWD_MODE,H2O_MODE,& & ZAER_TAU, ZAER_SSA, ZAER_ASYM) @@ -1605,19 +1610,19 @@ SUBROUTINE HAMM7_INTERFACE & DO JWAVL=1,MIN(INWAVL,NAERO_WVL_DIAG) DO JL=KIDIA,KFDIA - IF (NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_AOD) THEN + IF (YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_AOD) THEN PAERO_WVL_DIAG(JL,JWAVL,JPAERO_WVL_AOD) = PAOD(JL,JWAVL) ENDIF - IF (NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_AODABS) THEN + IF (YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_AODABS) THEN PAERO_WVL_DIAG(JL,JWAVL,JPAERO_WVL_AODABS) = PABS(JL,JWAVL)! 0.0 ENDIF - IF (NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_AODFM) THEN + IF (YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_AODFM) THEN PAERO_WVL_DIAG(JL,JWAVL,JPAERO_WVL_AODFM) = PFAOD(JL,JWAVL)! 0.0 ENDIF - IF (NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_SSA) THEN + IF (YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_SSA) THEN PAERO_WVL_DIAG(JL,JWAVL,JPAERO_WVL_SSA) = PSSA(JL,JWAVL) ENDIF - IF (NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_ASSIMETRY) THEN + IF (YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_ASSIMETRY) THEN PAERO_WVL_DIAG(JL,JWAVL,JPAERO_WVL_ASSIMETRY) = PASY(JL,JWAVL) ENDIF ENDDO @@ -1720,9 +1725,9 @@ SUBROUTINE HAMM7_INTERFACE & IF (.NOT. LAERCHEM)THEN PGFL(KIDIA:KFDIA,1,YAEROUT(8)%MP)=ZDDEPFLUX_SO2(KIDIA:KFDIA) ! aergn7 SO4 gas - PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(9)%MP)=PGFL(KIDIA:KFDIA,1:KLEV,YAERCLIM(1)%MP) - PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(10)%MP)=PGFL(KIDIA:KFDIA,1:KLEV,YAERCLIM(2)%MP) - PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(11)%MP)=PGFL(KIDIA:KFDIA,1:KLEV,YAERCLIM(3)%MP) + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(9)%MP)=PGFL(KIDIA:KFDIA,1:KLEV,YAEROCLIM(1)%MP) + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(10)%MP)=PGFL(KIDIA:KFDIA,1:KLEV,YAEROCLIM(2)%MP) + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(11)%MP)=PGFL(KIDIA:KFDIA,1:KLEV,YAEROCLIM(3)%MP) END IF PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(12)%MP)=PGFL(KIDIA:KFDIA,1:KLEV,YRE_LIQ%MP9_PH) PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(13)%MP)=PGFL(KIDIA:KFDIA,1:KLEV,YRE_ICE%MP9_PH) @@ -1777,12 +1782,12 @@ SUBROUTINE HAMM7_INTERFACE & PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(30+IMODE)%MP)=RW_MODE(IMODE)%d2(KIDIA:KFDIA,1:KLEV) ! m ENDDO if (.not.LAERCHEM)THEN - PGFL(KIDIA:KFDIA,KLEV,YAEROUT(40)%MP)=PFSO2(KIDIA:KFDIA) ! tendency SS CS ham after update surface - PGFL(KIDIA:KFDIA,KLEV,YAEROUT(41)%MP)=PFSO4(KIDIA:KFDIA) ! tendency SS CS ham after update surfac - PGFL(KIDIA:KFDIA,KLEV,YAEROUT(42)%MP)=PFSO4_AQ(KIDIA:KFDIA) ! tendency SS CS ham after update surface - PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(43)%MP)=PTSO4(KIDIA:KFDIA,1:KLEV) ! tendency SS CS ham after update surface - PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(44)%MP)=PTSO4_AQ(KIDIA:KFDIA,1:KLEV) ! tendency SS CS ham after update surface - PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(45)%MP)=PTSO2(KIDIA:KFDIA,1:KLEV) ! tendency SS CS ham after update surface + PGFL(KIDIA:KFDIA,KLEV,YAEROUT(40)%MP)=ZFSO2(KIDIA:KFDIA) ! tendency SS CS ham after update surface + PGFL(KIDIA:KFDIA,KLEV,YAEROUT(41)%MP)=ZFSO4(KIDIA:KFDIA) ! tendency SS CS ham after update surfac + PGFL(KIDIA:KFDIA,KLEV,YAEROUT(42)%MP)=ZFSO4_AQ(KIDIA:KFDIA) ! tendency SS CS ham after update surface + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(43)%MP)=ZTSO4(KIDIA:KFDIA,1:KLEV) ! tendency SS CS ham after update surface + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(44)%MP)=ZTSO4_AQ(KIDIA:KFDIA,1:KLEV) ! tendency SS CS ham after update surface + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(45)%MP)=ZTSO2(KIDIA:KFDIA,1:KLEV) ! tendency SS CS ham after update surface END if ENDIF diff --git a/ifs-source/arpifs/phys_ec/m7_box.F90 b/ifs-source/arpifs/phys_ec/m7_box.F90 deleted file mode 100644 index 0cbb74a4..00000000 --- a/ifs-source/arpifs/phys_ec/m7_box.F90 +++ /dev/null @@ -1,205 +0,0 @@ -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!> -!! \filename -!! m7_box.f90 -!! -!! \brief -!! Boxmodel of the M7 aerosol microphysics scheme currently in ECHAM6-HAMMOZ. -!! To find out what is exactly the corresponding version number of ECHAM6-HAMMOZ, -!! please read: -!! echam6-hammoz_base_version.txt -!! -!! \author Grazia Frontoso, Nov 2012 (C2SM-ETHZ) -!! -!! \responsible_coder -!! Grazia Frontoso, grazia.frontoso@env.ethz.ch -!! -!! \revision_history -!! -!! \limitations -!! None -!! -!! \bibliographic_references -!! - Vignati E., Wilson J. and Stier P., M7: a size resolved aerosol mixture module -!! for the use in global aerosol models, JGR 109, D22 202, doi:10.1029/2003JD004 485, 2004. -!! - Stier P. et al, The aerosol-climate model ECHAM5-HAM, ACP, 5, 1125-1156, 2005 -!! -!! -!! \copyright -!! Copyright and licencing conditions are defined in the ECHAM-HAMMOZ -!! licencing agreement to be found at: -!! https://redmine.hammoz.ethz.ch/projects/hammoz/wiki/1_Licencing_conditions -!! The ECHAM-HAMMOZ software is provided "as is" and without warranty of any kind. -!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -PROGRAM m7_box - - USE mo_kind, ONLY: dp - USE mo_ham_m7, ONLY: m7 - USE mo_ham_init, ONLY: ham_init_memory, ham_free_memory, & - ham_initialize, start_ham - USE mo_ham_m7ctl, ONLY: kproma, kbdim, klev, & - nmod, nsol, naerocompmax, & - iso4ns, iso4ks, iso4as, iso4cs, & - ibcks, ibcas, ibccs, ibcki, & - iocks, iocas, ioccs, iocki, & - issas, isscs, & - iduas, iducs, iduai, iduci, & - inucs, iaits, iaccs, icoas, & - iaiti, iacci, icoai - USE mo_namelist, ONLY: open_nml, position_nml, POSITIONED - - IMPLICIT NONE - !--- Initial conditions for m7.box : - REAL(dp):: pap(kbdim,klev) = 1013.25_dp ! Pressure [Pa] - REAL(dp):: pt(kbdim,klev) = 265.0_dp ! Temperature at [K] - REAL(dp):: prh(kbdim,klev) = 0.3_dp ! Relative humidity at [0,1] - REAL(dp):: pipr(kbdim,klev) = 5.0_dp ! Ionization rate [cm-3 s-1] - REAL(dp):: pdgso4(kbdim,klev)= 5.0E4_dp ! d[H2SO4(g)]/dt [cm-3 s-1] - REAL(dp):: pgso4(kbdim,klev) = 1.0E4_dp ! [H2SO4(g)] [cm-3] - REAL(dp):: paclc(kbdim,klev) = 0.0_dp ! Cloud cover [0,1] - REAL(dp):: pforest(kbdim) = 1.0_dp ! Forest fraction - REAL(dp):: paerml(kbdim,klev,naerocompmax) - ! aerosol mass concentrations for individual compounds - ! [molec. cm-3 for sulfate and ug m-3 for bc, oc, ss, and dust] - REAL(dp):: paernl(kbdim,klev,nmod) - ! aerosol number concentrations for each mode [cm-3] - REAL(dp):: pm6rp(kbdim,klev,nmod) - ! mean mode actual radius for each mode (wet for soluble and dry for insoluble modes) [cm] - REAL(dp):: pm6dry(kbdim,klev,nsol) - ! dry radius for soluble modes [cm] - REAL(dp):: prhop(kbdim,klev,nmod) - ! mean mode particle density for each mode [g cm-3] - REAL(dp):: pww(kbdim,klev,nmod) - ! aerosol water content for each mode [kg(water) m-3(air)] - INTEGER :: ierr, inml, iunit - INCLUDE 'ini_m7ctl.inc' - ! Initialization: - paerml(1:kproma,:,:) = 0.0_dp - paernl(1:kproma,:,:) = 0.0_dp - pm6rp(1:kproma,:,:) = 0.0_dp - pm6dry(1:kproma,:,:) = 0.0_dp - prhop(1:kproma,:,:) = 0.0_dp - pww(1:kproma,:,:) = 0.0_dp - CALL start_ham - CALL ham_initialize - CALL ham_init_memory - ! Read initial values from namelist: ini_m7ctl.inc - inml = open_nml('namelist.echam') - iunit = position_nml ('INI_M7CTL', inml, status=ierr) - SELECT CASE (ierr) - CASE (POSITIONED) - READ (iunit, ini_m7ctl) - END SELECT - CALL m7(pap, pt, prh, & ! Pressure, temperature, RH - pgso4, pdgso4, & ! [H2SO4(g)], derivative (production rate) - paerml, paernl, & ! Aerosol mass and number - pm6rp, pm6dry, prhop, pww, & ! Aerosol properties - pipr, paclc, pforest ) ! Ionization rate, cloud cover, forest fraction - ! - ! Print the output: - ! - - WRITE(*,'(A)') '-------------------' - WRITE(*,'(A)') 'M7 boxmodel outputs' - WRITE(*,'(A)') '-------------------' - - ! H2SO4 gas phase concentration: - - WRITE(*,'(A,E14.7)') '[H2SO4] (cm-3) : ',pgso4(1:kproma,:) - - ! Aerosol mass concentrations for individual compounds, (molec. cm-3 for sulfate and - ! ug m-3 for bc, oc, ss, and dust): - - ! Sulfate: - - WRITE(*,'(A)') '' - WRITE(*,'(A,E14.7)') 'NS SO4-- concents (molec. cm-3) : ',paerml(1:kproma,:,iso4ns) - WRITE(*,'(A,E14.7)') 'KS SO4-- concents (molec. cm-3) : ',paerml(1:kproma,:,iso4ks) - WRITE(*,'(A,E14.7)') 'AS SO4-- concents (molec. cm-3) : ',paerml(1:kproma,:,iso4as) - WRITE(*,'(A,E14.7)') 'CS SO4-- concents (molec. cm-3) : ',paerml(1:kproma,:,iso4cs) - - ! Black Carbon: - - WRITE(*,'(A)') '' - WRITE(*,'(A,E14.7)') 'BC KS (ug cm-3) : ',paerml(1:kproma,:,ibcks) - WRITE(*,'(A,E14.7)') 'BC KI (ug cm-3) : ',paerml(1:kproma,:,ibcki) - WRITE(*,'(A,E14.7)') 'BC AS (ug cm-3) : ',paerml(1:kproma,:,ibcas) - WRITE(*,'(A,E14.7)') 'BC CS (ug cm-3) : ',paerml(1:kproma,:,ibccs) - - ! Organic Carbon: - - WRITE(*,'(A)') '' - WRITE(*,'(A,E14.7)') 'OC KS (ug cm-3) : ',paerml(1:kproma,:,iocks) - WRITE(*,'(A,E14.7)') 'OC KI (ug cm-3) : ',paerml(1:kproma,:,iocki) - WRITE(*,'(A,E14.7)') 'OC AS (ug cm-3) : ',paerml(1:kproma,:,iocas) - WRITE(*,'(A,E14.7)') 'OC CS (ug cm-3) : ',paerml(1:kproma,:,ioccs) - - ! Sea Salt: - - WRITE(*,'(A)') '' - WRITE(*,'(A,E14.7)') 'SS AS (ug cm-3) : ',paerml(1:kproma,:,issas) - WRITE(*,'(A,E14.7)') 'SS CS (ug cm-3) : ',paerml(1:kproma,:,isscs) - - ! Dust: - - WRITE(*,'(A)') '' - WRITE(*,'(A,E14.7)') 'DU AS (ug cm-3) : ',paerml(1:kproma,:,iduas) - WRITE(*,'(A,E14.7)') 'DU AI (ug cm-3) : ',paerml(1:kproma,:,iduai) - WRITE(*,'(A,E14.7)') 'DU CS (ug cm-3) : ',paerml(1:kproma,:,iducs) - WRITE(*,'(A,E14.7)') 'DU CI (ug cm-3) : ',paerml(1:kproma,:,iduci) - - ! Particle number concentrations for each mode (cm-3): - - WRITE(*,'(A)') '' - WRITE(*,'(A,E14.7)') '[NS] (cm-3) : ',paernl(1:kproma,:,inucs) - WRITE(*,'(A,E14.7)') '[KI] (cm-3) : ',paernl(1:kproma,:,iaiti) - WRITE(*,'(A,E14.7)') '[KS] (cm-3) : ',paernl(1:kproma,:,iaits) - WRITE(*,'(A,E14.7)') '[AI] (cm-3) : ',paernl(1:kproma,:,iacci) - WRITE(*,'(A,E14.7)') '[AS] (cm-3) : ',paernl(1:kproma,:,iaccs) - WRITE(*,'(A,E14.7)') '[CI] (cm-3) : ',paernl(1:kproma,:,icoai) - WRITE(*,'(A,E14.7)') '[CS] (cm-3) : ',paernl(1:kproma,:,icoas) - - ! Particle radii for each mode (nm): - - WRITE(*,'(A)') '' - WRITE(*,'(A,E14.7)') 'NS geom. mean rad. (nm) : ',1.0E9_dp*pm6rp(1:kproma,:,inucs) - WRITE(*,'(A,E14.7)') 'KI geom. mean rad. (nm) : ',1.0E9_dp*pm6rp(1:kproma,:,iaiti) - WRITE(*,'(A,E14.7)') 'KS geom. mean rad. (nm) : ',1.0E9_dp*pm6rp(1:kproma,:,iaits) - WRITE(*,'(A,E14.7)') 'AI geom. mean rad. (nm) : ',1.0E9_dp*pm6rp(1:kproma,:,iacci) - WRITE(*,'(A,E14.7)') 'AS geom. mean rad. (nm) : ',1.0E9_dp*pm6rp(1:kproma,:,iaccs) - WRITE(*,'(A,E14.7)') 'CI geom. mean rad. (nm) : ',1.0E9_dp*pm6rp(1:kproma,:,icoai) - WRITE(*,'(A,E14.7)') 'CS geom. mean rad. (nm) : ',1.0E9_dp*pm6rp(1:kproma,:,icoas) - - WRITE(*,'(A)') '' - WRITE(*,'(A,E14.7)') 'NS dry rad. (nm) : ',1.0E9_dp*pm6dry(1:kproma,:,inucs) - WRITE(*,'(A,E14.7)') 'KS dry rad. (nm) : ',1.0E9_dp*pm6dry(1:kproma,:,iaits) - WRITE(*,'(A,E14.7)') 'AS dry rad. (nm) : ',1.0E9_dp*pm6dry(1:kproma,:,iaccs) - WRITE(*,'(A,E14.7)') 'CS dry rad. (nm) : ',1.0E9_dp*pm6dry(1:kproma,:,icoas) - ! Mean mode particle density for each mode [g cm-3] - WRITE(*,'(A)') '' - WRITE(*,'(A,E14.7)') 'NS particle density (g cm-3) : ',prhop(1:kproma,:,inucs) - WRITE(*,'(A,E14.7)') 'KI particle density (g cm-3) : ',prhop(1:kproma,:,iaiti) - WRITE(*,'(A,E14.7)') 'KS particle density (g cm-3) : ',prhop(1:kproma,:,iaits) - WRITE(*,'(A,E14.7)') 'AI particle density (g cm-3) : ',prhop(1:kproma,:,iacci) - WRITE(*,'(A,E14.7)') 'AS particle density (g cm-3) : ',prhop(1:kproma,:,iaccs) - WRITE(*,'(A,E14.7)') 'CI particle density (g cm-3) : ',prhop(1:kproma,:,icoai) - WRITE(*,'(A,E14.7)') 'CS particle density (g cm-3) : ',prhop(1:kproma,:,icoas) - - ! Water content for each mode [kg(water) m-3(air)] - - WRITE(*,'(A)') '' - WRITE(*,'(A,E14.7)') 'NS water content (kg(H2O) m-3(air)) : ',pww(1:kproma,:,inucs) - WRITE(*,'(A,E14.7)') 'KI water content (kg(H2O) m-3(air)) : ',pww(1:kproma,:,iaiti) - WRITE(*,'(A,E14.7)') 'KS water content (kg(H2O) m-3(air)) : ',pww(1:kproma,:,iaits) - WRITE(*,'(A,E14.7)') 'AI water content (kg(H2O) m-3(air)) : ',pww(1:kproma,:,iacci) - WRITE(*,'(A,E14.7)') 'AS water content (kg(H2O) m-3(air)) : ',pww(1:kproma,:,iaccs) - WRITE(*,'(A,E14.7)') 'CI water content (kg(H2O) m-3(air)) : ',pww(1:kproma,:,icoai) - WRITE(*,'(A,E14.7)') 'CS water content (kg(H2O) m-3(air)) : ',pww(1:kproma,:,icoas) - - WRITE(*,'(A)') '' - - ! Clean up: - - CALL ham_free_memory -END PROGRAM m7_box diff --git a/ifs-source/arpifs/phys_ec/m7_simple_sulfur_drydep.F90 b/ifs-source/arpifs/phys_ec/m7_simple_sulfur_drydep.F90 index 5049b4b3..318b1530 100644 --- a/ifs-source/arpifs/phys_ec/m7_simple_sulfur_drydep.F90 +++ b/ifs-source/arpifs/phys_ec/m7_simple_sulfur_drydep.F90 @@ -57,6 +57,7 @@ SUBROUTINE m7_simple_sulfur_DRYDEP & ! ---------------- !----------------------------------------------------------------------- +USE TYPE_MODEL , ONLY : MODEL USE PARKIND1 ,ONLY : JPIM ,JPRB USE YOMHOOK ,ONLY : LHOOK, DR_HOOK @@ -87,11 +88,11 @@ SUBROUTINE m7_simple_sulfur_DRYDEP & !INTEGER(KIND=JPIM),INTENT(IN) :: KSTEP !REAL(KIND=JPRB) ,INTENT(IN) :: PLSM(KLON), PCI(KLON) -REAL(KIND=JPRB) ,INTENT(IN) :: PAERO(KLON,KLEV,YGFL%NACTAERO), PTAERI(KLON,KLEV,YGFL%NACTAERO) +REAL(KIND=JPRB) ,INTENT(IN) :: PAERO(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO), PTAERI(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO) !REAL(KIND=JPRB) ,INTENT(IN) :: PAPH(KLON,0:KLEV) !REAL(KIND=JPRB) ,INTENT(IN) :: PAP(KLON,KLEV) REAL(KIND=JPRB) ,INTENT(IN) :: PDP(KLON,KLEV), PGEOH(KLON,0:KLEV), PRHO(KLON,KLEV) -REAL(KIND=JPRB) ,INTENT(IN) :: PFAERI(KLON,YGFL%NACTAERO) +REAL(KIND=JPRB) ,INTENT(IN) :: PFAERI(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO) REAL(KIND=JPRB) ,INTENT(IN) :: PTSPHY REAL(KIND=JPRB) ,INTENT(IN) :: PSO2DD(KLON) REAL(KIND=JPRB) ,INTENT(IN) :: PGELAM(KLON) @@ -102,15 +103,15 @@ SUBROUTINE m7_simple_sulfur_DRYDEP & !REAL(KIND=JPRB) ,INTENT(IN) :: PDZ(KLON) !---output fields -REAL(KIND=JPRB) ,INTENT(OUT) :: PFAERO(KLON,YGFL%NACTAERO) -REAL(KIND=JPRB) ,INTENT(OUT) :: PTAERO(KLON,KLEV,YGFL%NACTAERO) +REAL(KIND=JPRB) ,INTENT(OUT) :: PFAERO(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO) +REAL(KIND=JPRB) ,INTENT(OUT) :: PTAERO(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO) REAL(KIND=JPRB) ,INTENT(OUT) :: PFDRYD(KLON)!,YGFL%NACTAERO) !--- local variables INTEGER(KIND=JPIM) :: JL, JAER, JAERO REAL(KIND=JPRB) :: ZAERO, ZFROC, ZOCEA, ZLAND, ZLICE, ZSICE, ZRHO REAL(KIND=JPRB) :: Z1RG , Z1TSPHY, ZHGT, ZALPHA, ZAERI -REAL(KIND=JPRB) :: ZVDEP,ZVDEP2(YGFL%NACTAERO) +REAL(KIND=JPRB) :: ZVDEP,ZVDEP2(YDMODEL%YRML_GCONF%YGFL%NACTAERO) REAL(KIND=JPRB) :: ZRHOP REAL(KIND=JPRB) :: ZWETD @@ -159,28 +160,27 @@ SUBROUTINE m7_simple_sulfur_DRYDEP & REAL(KIND=JPRB) :: ZHOOK_HANDLE -#include "aer_drydepvel.intfb.h" -#include "satur.intfb.h" +!#include "aer_drydepvel.intfb.h"! +!#include "satur.intfb.h"! !----------------------------------------------------------------------- -IF (LHOOK) CALL DR_HOOK('M7_SIMPLE_SULFUR_DRYDEP',0,ZHOOK_HANDLE) -ASSOCIATE(YGFL=>YDMODEL%YRML_GCONF%YGFL, YREAERATM=>YDMODEL%YRML_PHY_RAD%YREAERATM, & - YREAERSRC=>YDMODEL%YRML_PHY_AER%YREAERSRC, YREAERSNK=>YDMODEL%YRML_PHY_AER%YREAERSNK, & - YDRIP=>YDMODEL%YRML_GCONF%YRRIP ) - -ASSOCIATE(NDRYDEP=>YREAERATM%NDRYDEP, & - & RVDPLIC=>YREAERSNK%RVDPLIC, RVDPLND=>YREAERSNK%RVDPLND, & - & RVDPOCE=>YREAERSNK%RVDPOCE, RVDPSIC=>YREAERSNK%RVDPSIC, & - & RRHO_DD=>YREAERSNK%RRHO_DD, RRHO_SS=>YREAERSNK%RRHO_SS, & - & RMMD_DD=>YREAERSNK%RMMD_DD, RMMD_SS=>YREAERSNK%RMMD_SS, & - & RSSDENS_RHTAB=>YREAERSNK%RSSDENS_RHTAB, & - & RSSGROWTH_RHTAB=>YREAERSNK%RSSGROWTH_RHTAB, & - & RRHTAB=>YREAERSNK%RRHTAB, & - & NACTAERO=>YGFL%NACTAERO, & - & NINDDDEP=>YREAERATM%NINDDDEP, & - & LDRYDEPVEL_DYN => YREAERSNK%LDRYDEPVEL_DYN, & - & NTDDEP=>YREAERATM%NTDDEP,YAERO=>YGFL%YAERO, & - & NMAXTAER=>YREAERSRC%NMAXTAER, NTYPAER=>YREAERSRC%NTYPAER) +IF (LHOOK) CALL DR_HOOK('M7_SIMPLE_SULFUR_DRYDEP',0,ZHOOK_HANDLE) +ASSOCIATE(YGFL=>YDMODEL%YRML_GCONF%YGFL, YREAERSNK=>YDMODEL%YRML_PHY_AER%YREAERSNK, YDRIP=>YDMODEL%YRML_GCONF%YRRIP) +ASSOCIATE(NDRYDEP=>YREAERSNK%NDRYDEP, NACTAERO=>YGFL%NACTAERO) + + +! & RVDPLIC=>YREAERSNK%RVDPLIC, RVDPLND=>YREAERSNK%RVDPLND, & +! & RVDPOCE=>YREAERSNK%RVDPOCE, RVDPSIC=>YREAERSNK%RVDPSIC, & +! & RRHO_DD=>YREAERSNK%RRHO_DD, RRHO_SS=>YREAERSNK%RRHO_SS, & +! & RMMD_DD=>YREAERSNK%RMMD_DD, RMMD_SS=>YREAERSNK%RMMD_SS, & +! & RSSDENS_RHTAB=>YREAERSNK%RSSDENS_RHTAB, & +! & RSSGROWTH_RHTAB=>YREAERSNK%RSSGROWTH_RHTAB, & +! & RRHTAB=>YREAERSNK%RRHTAB, & +! & NACTAERO=>YGFL%NACTAERO, & +! & NINDDDEP=>YREAERATM%NINDDDEP, & +! & LDRYDEPVEL_DYN => YREAERSNK%LDRYDEPVEL_DYN, & +! & NTDDEP=>YREAERATM%NTDDEP,YAERO=>YGFL%YAERO, & +! & NMAXTAER=>YREAERSRC%NMAXTAER, NTYPAER=>YREAERSRC%NTYPAER) !- PFAERI in unit of xx m-2 s-1 (surface flux) !- PFAERO in unit of xx m-2 s-1 (surface flux) @@ -374,5 +374,6 @@ SUBROUTINE m7_simple_sulfur_DRYDEP & !----------------------------------------------------------------------- END ASSOCIATE +END ASSOCIATE IF (LHOOK) CALL DR_HOOK('M7_SIMPLE_SULFUR_DRYDEP',1,ZHOOK_HANDLE) END SUBROUTINE M7_SIMPLE_SULFUR_DRYDEP diff --git a/ifs-source/arpifs/phys_ec/mo_ham_m7ctl.F90 b/ifs-source/arpifs/phys_ec/mo_ham_m7ctl.F90 index cf3c33b2..5d1455b0 100644 --- a/ifs-source/arpifs/phys_ec/mo_ham_m7ctl.F90 +++ b/ifs-source/arpifs/phys_ec/mo_ham_m7ctl.F90 @@ -550,9 +550,60 @@ SUBROUTINE sethamM7 IMPLICIT NONE - INCLUDE 'ham_m7ctl.inc' + !INCLUDE 'ham_m7ctl.inc' ! Local variables: +!! +!! \brief +!! namelist for the M7 aerosol model +!! +!! \author Philip Stier (MPI-Met) +!! +!! \responsible_coder +!! Philip Stier, philip.stier@physics.ox.ac.uk +!! +!! \revision_history +!! -# Philip Stier (MPI-Met) - original code (2003-01) +!! -# Jan Kazil (MPI-M) (2008-05) +!! +!! \limitations +!! None +!! +!! \details +!! None +!! +!! \bibliographic_references +!! None +!! +!! \belongs_to +!! HAMMOZ +!! +!! \copyright +!! Copyright and licencing conditions are defined in the ECHAM-HAMMOZ +!! licencing agreement to be found at: +!! https://redmine.hammoz.ethz.ch/projects/hammoz/wiki/1_Licencing_conditions +!! The ECHAM-HAMMOZ software is provided "as is" and without warranty of any kind. +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +NAMELIST /ham_m7ctl/ nwater, & !< Aerosol water uptake scheme: + !! + !! nwater = 0 Jacobson et al., JGR 1996 + !! = 1 Kappa-Koehler theory based approach (Petters and Kreidenweis, ACP 2007) + nsnucl, & !< Choice of the sulfate aerosol nucleation scheme: + !! + !! nsnucl = 0 off + !! = 1 Vehkamaeki et al., JGR 2002 + !! = 2 Kazil and Lovejoy, ACP 2007 + !! + nonucl, & !< Choice of the organic aerosol nucleation scheme: + !! + !! nonucl = 0 off + !! = 1 Activation nucleation, Kulmala et al., ACP 2006 + !! = 2 Kinetic nucleation, Laakso et al., ACP 2004 + !! + lnucl_stat !< Sample the cloud-free volume as function of T, RH, [H2SO4(g)], + !! H2SO4 condensation sink, and ionization rate (memory intensive) INTEGER :: ierr, inml, iunit diff --git a/ifs-source/arpifs/phys_ec/mo_ham_rad.F90 b/ifs-source/arpifs/phys_ec/mo_ham_rad.F90 index 4e31e822..afc729ba 100755 --- a/ifs-source/arpifs/phys_ec/mo_ham_rad.F90 +++ b/ifs-source/arpifs/phys_ec/mo_ham_rad.F90 @@ -1502,7 +1502,8 @@ SUBROUTINE ham_rad_initialize(nclass) USE mo_read_netcdf77, ONLY: read_var_nf77_3d USE mo_util_string, ONLY: separator #else !OIFS - USE YOERAD ,ONLY : nbndlw=> STRATO_CMIP6_NTB !this is really stupid solution + !USE YOERAD ,ONLY : nbndlw=> STRATO_CMIP6_NTB !this is really stupid solution + ! commented by Lwu USE YOMMP0 ,ONLY : MYPROC USE MPL_MODULE ,ONLY : MPL_BROADCAST USE TM5M7_OPTICS_DATA, ONLY : NASWBAND,ASWBAND,wavenum1=>ALWWN1, wavenum2=>ALWWN2 @@ -1552,7 +1553,8 @@ SUBROUTINE ham_rad_initialize(nclass) !--- 2) Consistency checks: - IF ( Nwv_sw /= jpsw .OR. Nwv_lw /= nbndlw) THEN + !IF ( Nwv_sw /= jpsw .OR. Nwv_lw /= nbndlw) THEN! stratosphere aerosol should be updated + IF ( Nwv_sw /= jpsw ) THEN CALL finish('ham_rad_initialize','inconsistent number of wavelengths') diff --git a/ifs-source/arpifs/phys_ec/mo_netcdf.F90 b/ifs-source/arpifs/phys_ec/mo_netcdf.F90 index d2203a6f..8ee66cef 100644 --- a/ifs-source/arpifs/phys_ec/mo_netcdf.F90 +++ b/ifs-source/arpifs/phys_ec/mo_netcdf.F90 @@ -6,7 +6,7 @@ !! Where software is supplied by third parties, it is indicated in the headers of the routines. !! MODULE mo_netcdf - + USE netcdf USE mo_kind, ONLY: dp USE mo_exception, ONLY: finish, message, message_text USE mo_control, ONLY: ldebugio diff --git a/ifs-source/arpifs/phys_ec/mo_submodel.F90 b/ifs-source/arpifs/phys_ec/mo_submodel.F90 index 9454bf2d..13e45a5c 100644 --- a/ifs-source/arpifs/phys_ec/mo_submodel.F90 +++ b/ifs-source/arpifs/phys_ec/mo_submodel.F90 @@ -383,7 +383,57 @@ SUBROUTINE setsubmodel INTEGER :: i, inml, iunit, ierr - INCLUDE 'submodelctl.inc' + +! This namelist defines general submodel switches which are needed in the interface +! layer (*mo_submodel_interface* or other parts of the standard ECHAM code). Also +! included are switches which define the coupling between various submodels (for +! example in HAMMOZ, which coupled aerosol and gas-phase chemical processes). Other +! submodel-specific switches should be defined and maintained in extra namelists +! which carry the name of the submodel itself (e.g. mozctl or hamctl). +! +! ------------------------------------------------------------------ +NAMELIST /submodelctl/ & + lxt, & ! switch generic test tracer submodule on/off + lmethox, & ! switch for upper atmospheric H2O production from methane + ltransdiag, & ! switch to turn on atmospheric energy transport diagnostics + lco2, & ! switch for CO2 submodel (JSBACH related) + lham, & ! switch HAM aerosol module on/off + lmoz, & ! switch MOZART on/off + lhammoz, & ! switch HAM and MOZ on/off together with the coupling between the two + ! note: lhammoz overrides lham and lmoz + lhammonia, & ! switch HAMMONIA on/off + llght, & ! switch lightning emissions on/off + lbioemi_stdalone, & ! switch biogenic emissions model as a standalone submodel + ! (ie not embedded in HAM or MOZ) on/off + losat, & ! satellite simulator on/off + loisccp, & ! isccp diagnostics on/off + lhmzphoto, & ! hammoz photolysis frequency coupling on/off + lhmzoxi, & ! hammoz coupling of oxidant fields on/off + lhmzhet, & ! hammoz heterogeneous chemistry coupling on/off + lchemfeedback, & ! combi-switch for interactive chemistry: + ! for moz: lchemrad and linterh2o = true + ! for hammonia: as above plus lchemheat, atmospheric mass and cp + lchemrad, & ! chemistry interacts with radiation on/off + linterh2o, & ! feedback water content from MOZ to ECHAM and vice versa + lchemheat, & ! chemical heating on/off + lccnclim, & ! activate CCN climatology as submodel + lflighttrack, & ! flight-track simulator + linteram, & ! hammonia air mass from chemistry on/off + lintercp, & ! hammonia specific heat from chemistry on/off + lemissions, & ! switch emissions on/off + lchemistry, & ! switch chemistry calculations on/off + ldrydep, & ! switch dry deposition on/off + lwetdep, & ! switch wet deposition on/off + lsedimentation, & ! switch sedimentation on/off + laero_micro, & ! switch aerosol microphysical processes on/off + lburden, & ! activate burden (column integral) diagnostics for mass mixing ratio tracers + emi_basepath, & ! path to emission files specified in emi_spec.txt + emi_scenario, & ! RCP (Representative Concentration Pathway) to be modelled + laoa ! age-of-air tracer submodel +! ------------------------------------------------------------------ + + + !INCLUDE 'submodelctl.inc' CALL message('', ' ') diff --git a/ifs-source/arpifs/phys_ec/mo_time_control.F90 b/ifs-source/arpifs/phys_ec/mo_time_control.F90 index 28a6f2a7..026f7573 100644 --- a/ifs-source/arpifs/phys_ec/mo_time_control.F90 +++ b/ifs-source/arpifs/phys_ec/mo_time_control.F90 @@ -1,6 +1,6 @@ Module mo_time_control USE mo_kind, only : dp - USE YOMRIP , ONLY : YRRIP + USE YOMRIP , ONLY :TRIP !YRRIP IMPLICIT NONE ! <-- thk: bug fix !REAL(dp), PUBLIC :: time_step_len = 720.0_dp @@ -10,7 +10,8 @@ Module mo_time_control !ASSOCIATE(time_step_len=>YRPHY2%TSPHY) !TeMi CONTAINS - SUBROUTINE init_mo_time_control + SUBROUTINE init_mo_time_control(YRRIP) + TYPE(TRIP), intent(in) :: YRRIP ! copy the time step length from IFS control structure time_step_len = YRRIP%TSTEP END SUBROUTINE init_mo_time_control diff --git a/ifs-source/arpifs/phys_ec/su_aerw.F90 b/ifs-source/arpifs/phys_ec/su_aerw.F90 index 2bb93463..b178ec94 100644 --- a/ifs-source/arpifs/phys_ec/su_aerw.F90 +++ b/ifs-source/arpifs/phys_ec/su_aerw.F90 @@ -98,10 +98,10 @@ SUBROUTINE SU_AERW(YDMODEL) ! ---------------------------------------------------------------- LOGICAL, POINTER :: LAERCLIMG, LAERCLIMZ, LAERCLIST, LAERDRYDP, LAERELVS,& - & LAEREXTR, LAERGBUD, LAERHYGRO, LAERNGAT, LAERPRNT, & + & LAEREXTR, LAERGBUD, LAERHYGRO, LAERLISI, LAERNGAT, LAERPRNT, LAERSCAV, & & LAERSEDIM, LAERSURF, LAERGTOP, LAER6SDIA, LAERCCN, LAERSEDIMSS, & - & LAERINIT, LAERCSTR, LAERRRTM, LAERDIAG1, LAERDIAG2, LAERUVP,& - & LAERVOL, LEPAERO, LAEROMIN, LOCNDMS,& + & LAERINIT, LAERCSTR, LAERRRTM, LAERDIAG1, LAERDIAG2, LAERUVP, LUVINDX, & + & LAERVOL, LAERCALIP, LEPAERO, LAEROMIN, LOCNDMS ,LAERSCAV_CHEM, LDRYDEPVEL_DYN, & & LSEASALT_RH80, LAERDUSTSOURCE, LAERDUST_NEWBIN, LAERDUSTSIZEVAR INTEGER(KIND=JPIM), POINTER :: NAERCONF, NXT3DAER, NINIDAY, NBCOPTP,& @@ -152,6 +152,7 @@ SUBROUTINE SU_AERW(YDMODEL) ! Associate pointers for variables in namelist LAERCLIMG => YDEAERATM%LAERCLIMG NDRYDEPVEL_DYN=> YDEAERSNK%NDRYDEPVEL_DYN +LDRYDEPVEL_DYN=> YDEAERSNK%LDRYDEPVEL_DYN LAERCLIMZ => YDEAERATM%LAERCLIMZ LAERCLIST => YDEAERATM%LAERCLIST LAERDRYDP => YDEAERATM%LAERDRYDP @@ -163,8 +164,10 @@ SUBROUTINE SU_AERW(YDMODEL) LAERDUST_NEWBIN=>YDEAERATM%LAERDUST_NEWBIN LAERDUSTSIZEVAR=>YDEAERATM%LAERDUSTSIZEVAR LAERHYGRO => YDEAERATM%LAERHYGRO +LAERLISI => YDEAERATM%LAERLISI LAERNGAT => YDEAERATM%LAERNGAT LAERPRNT => YDEAERATM%LAERPRNT +LAERSCAV => YDEAERATM%LAERSCAV LAERSEDIM => YDEAERATM%LAERSEDIM LAERSEDIMSS => YDEAERATM%LAERSEDIMSS LAERSURF => YDEAERATM%LAERSURF @@ -177,7 +180,9 @@ SUBROUTINE SU_AERW(YDMODEL) LAERDIAG1 => YDEAERATM%LAERDIAG1 LAERDIAG2 => YDEAERATM%LAERDIAG2 LAERUVP => YDEAERATM%LAERUVP +LUVINDX => YDEAERATM%LUVINDX LAERVOL => YDEAERATM%LAERVOL +LAERCALIP => YDEAERATM%LAERCALIP NAERCONF => YDEAERATM%NAERCONF NXT3DAER => YDEAERATM%NXT3DAER NINIDAY => YDEAERATM%NINIDAY @@ -187,6 +192,7 @@ SUBROUTINE SU_AERW(YDMODEL) NSSOPTP => YDEAERATM%NSSOPTP NSUOPTP => YDEAERATM%NSUOPTP NVISWL => YDEAERATM%NVISWL +LAERSCAV_CHEM => YDEAERATM%LAERSCAV_CHEM NAERSCAV => YDEAERATM%NAERSCAV LSEASALT_RH80=> YDEAERATM%LSEASALT_RH80 NTYPAER => YDEAERATM%NTYPAER diff --git a/ifs-source/arpifs/phys_ec/tm5m7_optics_aop_get.F90 b/ifs-source/arpifs/phys_ec/tm5m7_optics_aop_get.F90 index f8cdfdfc..967b2933 100644 --- a/ifs-source/arpifs/phys_ec/tm5m7_optics_aop_get.F90 +++ b/ifs-source/arpifs/phys_ec/tm5m7_optics_aop_get.F90 @@ -1,4 +1,4 @@ -SUBROUTINE TM5M7_OPTICS_AOP_GET( KIDIA,KFDIA,KLON, KLEV, NACTAERO, & +SUBROUTINE TM5M7_OPTICS_AOP_GET(YGFL, YREAERSRC, KIDIA,KFDIA,KLON, KLEV, NACTAERO, & & nwav, wdep, ncontr, ecearth_units, & & PRHO, PAERO, RW_MODE,RWD_MODE,H2O_MODE, & & Paop_out_ext, Paop_out_a, Paop_out_g, aop_out_add ) @@ -34,13 +34,13 @@ SUBROUTINE TM5M7_OPTICS_AOP_GET( KIDIA,KFDIA,KLON, KLEV, NACTAERO, & USE PARKIND1 ,ONLY : JPIM ,JPRB USE YOMHOOK ,ONLY : LHOOK, DR_HOOK USE YOMLUN ,ONLY : NULOUT -USE YOEAERSRC, ONLY : YREAERSRC +USE YOEAERSRC, ONLY : TEAERSRC !YREAERSRC !USE YOMCST, ONLY : USE TM5M7_DATA, ONLY : H2SO4_FACTOR,NH4NO3_FACTOR, SO4_DENSITY,MSA_DENSITY, & & NH4NO3_DENSITY, & & MODAL_DATA,NMOD,NSOL USE TM5M7_OPTICS_DATA, ONLY: WAVELENDEP, AOPI,NADD -USE YOM_YGFL , ONLY : YGFL +USE YOM_YGFL , ONLY : TYPE_GFLD!YGFL USE TM5M7_DATA, ONLY : & & INO3_A , IACS_N , ISO4ACS , IBCACS , IPOMACS , ISSACS , IDUACS , & & ISOANUS , ISOAAIS , ISOAACS , ISOACOS , ISOAAII , IH2OPART ,IAII_N , IBCAII , & @@ -56,6 +56,8 @@ SUBROUTINE TM5M7_OPTICS_AOP_GET( KIDIA,KFDIA,KLON, KLEV, NACTAERO, & !* 0.1 ARGUMENTS ! --------- +TYPE(TEAERSRC), INTENT(IN) :: YREAERSRC +TYPE(TYPE_GFLD) ,INTENT(IN) :: YGFL INTEGER(KIND=JPIM), INTENT(IN) :: KIDIA,KFDIA,KLON,KLEV,NACTAERO, NWAV,NCONTR TYPE(WAVELENDEP), DIMENSION(NWAV), INTENT(IN):: WDEP LOGICAL, INTENT(IN) :: ECEARTH_UNITS diff --git a/ifs-source/arpifs/phys_ec/tm5m7_optics_get.F90 b/ifs-source/arpifs/phys_ec/tm5m7_optics_get.F90 index fb1e805c..c88636b4 100644 --- a/ifs-source/arpifs/phys_ec/tm5m7_optics_get.F90 +++ b/ifs-source/arpifs/phys_ec/tm5m7_optics_get.F90 @@ -37,7 +37,7 @@ SUBROUTINE TM5M7_OPTICS_GET(m_eff, xg, Cext, a, g, cext_table, a_table, g_table, !----------------------------------------------------------------------- USE PARKIND1 ,ONLY : JPIM ,JPRB -USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK, JPHOOK USE YOMLUN ,ONLY : NULERR USE TM5M7_OPTICS_DATA, ONLY : LKVAL, KVAL,N1R,N_RIR,N_RII,XS,N_X @@ -75,7 +75,7 @@ SUBROUTINE TM5M7_OPTICS_GET(m_eff, xg, Cext, a, g, cext_table, a_table, g_table, INTEGER(KIND=JPIM) :: i_n, i_k, i_knew -REAL(KIND=JPRB) :: ZHOOK_HANDLE +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE !----------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('TM5M7_OPTICS_GET',0,ZHOOK_HANDLE) diff --git a/ifs-source/arpifs/phys_ec/tm5m7_phy2.F90 b/ifs-source/arpifs/phys_ec/tm5m7_phy2.F90 index 41233c60..02d10402 100644 --- a/ifs-source/arpifs/phys_ec/tm5m7_phy2.F90 +++ b/ifs-source/arpifs/phys_ec/tm5m7_phy2.F90 @@ -10,7 +10,7 @@ SUBROUTINE TM5M7_PHY2 & & PTL ,PGELAM,PGELAT,PGEMU , PHSDFOR, & & PUP , PVP , PWSA1, PTSPHY, PZ0M, KCHEM, & & PCVL, PCVH, KTVL, KTVH, & - & PAHFSTI, PAHFLEV, & + & PAHFSTI, & !-- OUTPUTS & PCFLX, PTENC, & & PDMSO, PLDAY, PLISS, PSO2 , PTDMS, PAERDDP, PAERSDM, PAERSRC, PAERMAP, PAERFLX, PAERLIF, & @@ -56,7 +56,7 @@ SUBROUTINE TM5M7_PHY2 & ! PWSA1(KLON) : MOISTURE IN TOP LAYER OF SURFACE ! PTSPHY : PHYSICS TIME-STEP ! PAHFSTI : sensible heat flux (W/m2) -! PAHFLEV : latent heat flux (W/m2) +!! PAHFLEV : latent heat flux (W/m2) ! PZ0M : roughness length for momentum (m) !-- aerosol climatological fields ! PAERDEP, PAERLTS, PAERSCC, PBCBF, PBCFF, PBCGF, POMBF, POMFF, POMGF, @@ -124,7 +124,7 @@ SUBROUTINE TM5M7_PHY2 & IMPLICIT NONE TYPE(GEOMETRY) ,INTENT(IN) :: YDGEOMETRY -TYPE(MODEL) ,INTENT(IN) :: YDMODEL +TYPE(MODEL) ,INTENT(INOUT) :: YDMODEL INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA, KFDIA, KLON, KFLDX, KLEVX INTEGER(KIND=JPIM),INTENT(IN) :: KTDIA, KLEV ,KSTGLO INTEGER(KIND=JPIM),INTENT(IN) :: KSW @@ -157,7 +157,7 @@ SUBROUTINE TM5M7_PHY2 & REAL(KIND=JPRB), INTENT(IN) :: PCVL(KLON), PCVH(KLON) ! Low/High vegetation cover INTEGER(KIND=JPIM), INTENT(IN):: KTVL(KLON), KTVH(KLON) ! Low/High vegetation type REAL(KIND=JPRB),INTENT(IN) :: PAHFSTI(KLON,KTILES) -REAL(KIND=JPRB),INTENT(IN) :: PAHFLEV(KLON) +!!!REAL(KIND=JPRB),INTENT(IN) :: PAHFLEV(KLON) REAL(KIND=JPRB),INTENT(INOUT) :: PTENC(KLON,KLEV,KTRAC) @@ -216,16 +216,16 @@ SUBROUTINE TM5M7_PHY2 & & YGFL=>YDMODEL%YRML_GCONF%YGFL, & & YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO, & & YDEAERSRC=>YDMODEL%YRML_PHY_AER%YREAERSRC, & + & YDEAERSNK=>YDMODEL%YRML_PHY_AER%YREAERSNK, & & YDEAERATM=>YDMODEL%YRML_PHY_RAD%YREAERATM, & & YDCHEM=>YDMODEL%YRML_CHEM%YRCHEM, & & YDRIP=>YDMODEL%YRML_GCONF%YRRIP) ASSOCIATE(NACTAERO=>YGFL%NACTAERO, NAERO=>YGFL%NAERO, & & LAERDRYDP=>YDEAERATM%LAERDRYDP, LAERSEDIM=>YDEAERATM%LAERSEDIM, & & LAERSURF=>YDEAERATM%LAERSURF, LAERVOL=>YDEAERATM%LAERVOL, & - & NDRYDEP=>YDEAERATM%NDRYDEP, NINDSEDM=>YDEAERATM%NINDSEDM, & - & NTSEDM=>YDEAERATM%NTSEDM, & + & NDRYDEP=>YDEAERSNK%NDRYDEP, & & LCHEM_JOUT=>YDCHEM%LCHEM_JOUT, & - & NTYPAER=>YDEAERSRC%NTYPAER, AERO_SCHEME=>YDCOMPO%AERO_SCHEME, & + & AERO_SCHEME=>YDCOMPO%AERO_SCHEME, & & NSTART=>YDRIP%NSTART, LCHEM_DIA=>YDCOMPO%LCHEM_DIA, NCHEM=>YGFL%NCHEM , YAERO=>YGFL%YAERO) ! ------------------------------------------------------------------ diff --git a/ifs-source/arpifs/phys_ec/tm5m7_scav.F90 b/ifs-source/arpifs/phys_ec/tm5m7_scav.F90 deleted file mode 100644 index 97864ce5..00000000 --- a/ifs-source/arpifs/phys_ec/tm5m7_scav.F90 +++ /dev/null @@ -1,542 +0,0 @@ -SUBROUTINE TM5M7_SCAV & - & ( KIDIA , KFDIA , KLON , KLEV , KAER , KSTEP, PTSPHY, & - & PRSF1, PDP , PTP, PFLXR, PFLXS, PCLCOV, PCLWAT, PCLICE, PRAIN, PSNOW, PCEN, PTENC0, & - & PTENC1, PFAERO, PPRCOV ) - -!*** * TM5M7_SCAV* - IN-CLOUD AND BELOW CLOUD SCAVENGING OF TRACERS -! CALLED SEPARATELY FOR CONVECTIVE AND LARGE-SCALE PRECIP. -! COPY of CHEM_SCAV - -! INPUTS: -! ------- -! KSTEP : Time step number -! KIDIA : Start of Array -! KFDIA : End of Array -! KLON : Length of Arrays -! KLEV : Number of Levels -! KCHEM : Number of aerosol tracers - - -! PTSPHY: Time step length in seconds -! PDP(KLON,KLEV) : PRESSURE DELTA in PRESSURE UNITES (Pa) -! PRSF1(KLON,KLEV) : Mid-level pressure (Pa) -! PTP(KLON,KLEV) : Temperature in (T) -! PCLWAT (KLON,KLEV) : Cloud water content (kg/kg) - stratiform and convective -! PCLICE (KLON,KLEV) : Cloud ice water content (kg/kg) - stratiform and convective -! PRAIN (KLON,KLEV) : Rain water content (kg/kg) for stratiform precip -! PSNOW (KLON,KLEV) : Snow water content (kg/kg) for stratiform precip -! PFLXR (KLON,KLEV+1) : Precip flux rain (kg/m2s) - either stratiform or convective (depending on argument) -! PFLXS (KLON,KLEV+1) : Precip flux snow (kg/m2s) - either stratoform or convective (depending on argument) -! PCLCOV (KLON,KLEV) : cloud fraction 0..1 -! PPRCOV (KLON,KLEV) : precipitation fraction 0..1 -! PCEN(KLON,KLEV,KCHEM) : CONCENTRATION OF TRACERS (kg/kg) -! PTENC0(KLON,KLEV,KCHEM) : TOTAL TENDENCY OF CONCENTRATION OF TRACERS BEFORE(kg/kg s-1) -! -! NB: PCLWAT is the in-cloud water mixing ratio -! OUTPUTS: -! ------- -! PTENC1 (KLON,KLEV,KCHEM) : TENDENCY OF CONCENTRATION OF TRACERS after (kg/kg s-1) -! -!** INTERFACE. -! ---------- -! *TM5M7_SCAV* IS CALLED FROM *TM5M7*. -! -! AUTHOR. -! ------- -! Johannes Flemming (original CHEM_SCAV) -! -! -! MODIFICATIONS. -! -------------- -! ORIGINAL (J Flemming) : 2009-11-09 -! V. Huijnen : Modification following routine wet_deposition.F90 from TM5 2021-08-26 -!----------------------------------------------------------------------- - -USE PARKIND1 ,ONLY : JPIM ,JPRB -USE YOMHOOK ,ONLY : LHOOK, DR_HOOK -USE YOMCST ,ONLY : RG, RD, RLVTT ,RLSTT ,RTT -USE YOMLUN , ONLY : NULOUT,NULERR -USE YOEDBUG ,ONLY : YREDBUG -USE YOM_YGFL , ONLY : YGFL -USE YOECLDP , ONLY : YRECLDP -USE YOEAERSRC ,ONLY : YREAERSRC -USE YOEAERATM ,ONLY : YREAERATM -USE YOEAERSNK ,ONLY : YREAERSNK -USE YOMCHEM , ONLY : YRCHEM -USE YOETHF , ONLY : R2ES ,R3LES ,R3IES ,R4LES ,& - & R4IES ,R5LES ,R5IES ,R5ALVCP ,R5ALSCP ,& - & RALVDCP ,RALSDCP ,RTWAT ,& - & RTICE ,RTICECU ,& - & RTWAT_RTICE_R ,RTWAT_RTICECU_R -USE TM5M7_DATA, ONLY : NSCAV, NSCAV_INDEX, NSCAV_TYPE, & - & INUS_N,IAIS_N,IACS_N,ICOS_N,IAII_N,IACI_N,ICOI_N - - -IMPLICIT NONE - -!----------------------------------------------------------------------- - -!* 0.1 ARGUMENTS -! --------- - -INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA, KFDIA, KLON, KLEV, KAER, KSTEP - -REAL(KIND=JPRB),INTENT(IN) :: PDP(KLON,KLEV) , PRSF1(KLON,KLEV) , PTP(KLON,KLEV) -REAL(KIND=JPRB),INTENT(IN) :: PCLCOV(KLON,KLEV) , PCLWAT(KLON,KLEV),PCLICE(KLON,KLEV) , PRAIN(KLON,KLEV), PSNOW(KLON,KLEV) -REAL(KIND=JPRB),OPTIONAL, INTENT(IN) :: PPRCOV(KLON,KLEV) -REAL(KIND=JPRB),INTENT(IN) :: PFLXR(KLON,KLEV+1), PFLXS(KLON,KLEV+1) -REAL(KIND=JPRB),INTENT(IN) :: PTENC0(KLON,KLEV,KAER), PCEN(KLON,KLEV,KAER) -REAL(KIND=JPRB),INTENT(IN) :: PTSPHY - -REAL(KIND=JPRB),INTENT(OUT) :: PTENC1(KLON,KLEV,KAER) -REAL(KIND=JPRB),INTENT(OUT) :: PFAERO(KLON,KAER) - -!* 0.5 LOCAL VARIABLES -! --------------- - -INTEGER(KIND=JPIM) :: JK, JL, JT, JSCAV, IWETDEP - -REAL(KIND=JPRB) :: ZSCAV -REAL(KIND=JPRB) :: ZBETA, ZBETAR, ZBETAR_M7 -REAL(KIND=JPRB) :: INCLOUD, BELOWCLOUD -REAL(KIND=JPRB) :: ZDP, ZDX, ZDZ, ZFRAC, ZFUNC, ZRHO,ZTEMP -REAL(KIND=JPRB) :: ZEPSQLIQ, ZEPSFLX, ZEPSQLIQ2 -REAL(KIND=JPRB) :: ZRD, ZLMMR2VMR, ZH2R, ZRET, ZHNRYEFT, ZHNRYEF -REAL(KIND=JPRB) :: ZLIQ2TOT, ZICE2TOT, ZLIQ2GAS, ZICE2GAS, ZRAINW, ZFALLSP -REAL(KIND=JPRB) :: ZPRCOV, ZCLCOV, ZFLXR, ZFLXS,ZFLXRB, ZFLXSB, ZCLWAT, ZCLICE,ZCLTOT, ZMINCLCOV, ZMINPRCOV - ! Interstitial Fraction: 30% of aerosol remains in atmosphere -REAL(KIND=JPRB) :: ZINTERST_FR -REAL(KIND=JPRB),PARAMETER :: ZDGHNO3 = 0.136 ! viscosity of HNO3 in [cm2/s] -REAL(KIND=JPRB),PARAMETER :: ZDGAIR = 0.133 ! viscosity of air in [cm2/s] -REAL(KIND=JPRB),PARAMETER :: ZXMHNO3 =1.008_JPRB + 14.007_JPRB + 3*16.0_JPRB ! HNO3 tracer mass -REAL(KIND=JPRB),PARAMETER :: ZRDRAD2 = (1E-5)**2 ! square of raindroplet radius (20 microns) -REAL(KIND=JPRB),PARAMETER :: ZMAX_LWC =2.E-3 ! kg/m3 -REAL(KIND=JPRB),PARAMETER :: ZHPLUS =3.16227E-6_JPRB ! is rain water ph=5.5 H+ - -! how much less efficient is tracer scavenged from ice -! cloud droplet compared to water cloud droplet. -! This should be tracer dependent. -REAL(KIND=JPRB),PARAMETER :: ZICE_EFF=0.2 - -REAL(KIND=JPRB) :: ZRLWC,ZRDRAD, ZRU, ZNRE,ZNSC,ZNSH, ZKG, ZTR, ZKSO2, ZKHSO3, ZFACTSO2 -REAL(KIND=JPRB) :: ZRL ! composite factor of Rgas and liquid water content of raining cloud - ! rgas (8.314 J/mol/K) ---> 0.08314 atm/(mol/l)/K - ! 1e-6 corresponds to 1 g/m3 dimensionless -REAL(KIND=JPRB) :: ZWLOSS(KLON,KAER) - -LOGICAL :: LLWDAER -LOGICAL :: LLPRINT, LLCHEM_WDFR, LLCONV - -REAL(KIND=JPRB) :: ZHOOK_HANDLE - -#include "fcttre.func.h" -!#include "fccld.h" - - -!----------------------------------------------------------------------- -IF (LHOOK) CALL DR_HOOK('TM5M7_SCAV',0,ZHOOK_HANDLE) -ASSOCIATE(YCHEM=>YGFL%YCHEM,YAERO=>YGFL%YAERO, & - & LCHEM_WDFR=>YRCHEM%LCHEM_WDFR, & - & RCOVPMIN=>YRECLDP%RCOVPMIN, & - & NINDAER=>YREAERSRC%NINDAER, & - & RFRAER=>YREAERSNK%RFRAER, RFRBC=>YREAERSNK%RFRBC, RFRDD=>YREAERSNK%RFRDD, & - & RFRIF=>YREAERSNK%RFRIF, RFROM=>YREAERSNK%RFROM, RFRSO4=>YREAERSNK%RFRSO4, & - & RFRSS=>YREAERSNK%RFRSS) - - - -LLPRINT=.FALSE. -LLCHEM_WDFR=LCHEM_WDFR -LLCONV=.FALSE. - -ZINTERST_FR = 0.3_JPRB -!VH IF ( LLCHEM_WDFR ) ZINTERST_FR = 0.0_JPRB - -! deposition for convective Precip -IF (.NOT. PRESENT(PPRCOV) ) LLCONV=.TRUE. - -!* set flux to zero -ZWLOSS(:,:)=0._JPRB - -ZEPSFLX =1.E-18_JPRB -ZEPSQLIQ=2.E-6_JPRB -ZEPSQLIQ2=2.E-7_JPRB - -!* mini cloud cover and precip cover -ZMINCLCOV=0.001_JPRB -ZMINPRCOV=0.001_JPRB - -!* precip fall speed -ZFALLSP = 5.0_JPRB - -!* ideal gas constant in atm M-1 -ZRD=1000.0_JPRB * RD * 9.8692_JPRB / 1000000.0_JPRB -ZRD=0.082_JPRB -ZRL=RG/1E2_JPRB*1E-6_JPRB -PFAERO(:,:)=0._JPRB - -!* initialisation -!* re-evaporation fraction to account for drop shrinking without releasing species -! Jacob says -!ZFRAC=0.5_JPRB -ZFRAC=0.2_JPRB - -!* update tendecies - -!* if not LLCHEM_WDFR -ZPRCOV = 1.0_JPRB -ZCLCOV = 1.0_JPRB - -PTENC1(KIDIA:KFDIA,1:KLEV,1:KAER) =PTENC0(KIDIA:KFDIA,1:KLEV,1:KAER) - -!* LOOP OVER LAYERS -DO JK=1,KLEV - DO JL=KIDIA,KFDIA - -!- temperature - ZTEMP = PTP(JL,JK) -!- precip flux at box top - ZFLXR = PFLXR(JL,JK) - ZFLXS = PFLXS(JL,JK) - ZFLXRB = PFLXR(JL,JK+1) - ZFLXSB = PFLXS(JL,JK+1) - -!-- Precip flux change grid box average - indicator for rain/snow formation or evaporation - ZBETA = ( ZFLXRB - ZFLXR ) + ( ZFLXSB - ZFLXS ) ! in kg m-2 s-1 - ZCLWAT = PCLWAT(JL,JK) - ZCLICE = PCLICE(JL,JK) - - IF ( ZBETA == 0.0_JPRB .AND. ZFLXR < ZEPSFLX ) CYCLE - IF ( LLCHEM_WDFR ) THEN -!* use effective flux and cloud cover for liquid water content - IF (.NOT. LLCONV ) THEN - ZPRCOV = MIN(MAX(RCOVPMIN,PPRCOV(JL,JK)),1.0_JPRB) ! grid scale precip - ZCLCOV = MIN(1.0_JPRB,MAX(0.0_JPRB,PCLCOV(JL,JK))) - ELSE - ZPRCOV = 0.05 ! convective precip - ZCLCOV = 0.05 ! convective precip - ! ZPRCOV = 0.1 ! convective precip - ENDIF - IF (ZPRCOV >= ZMINPRCOV) THEN - ZFLXR = ZFLXR / ZPRCOV - ZFLXS = ZFLXS / ZPRCOV - ZFLXRB = ZFLXRB / ZPRCOV - ZFLXSB = ZFLXSB / ZPRCOV - ZBETA = ZBETA / ZPRCOV - ELSE - ZFLXR = 0.0_JPRB - ZFLXS = 0.0_JPRB - ZFLXRB = 0.0_JPRB - ZFLXSB = 0.0_JPRB - ZBETA = 0.0_JPRB - ENDIF - IF (ZCLCOV >= ZMINCLCOV ) THEN - ZCLWAT = MAX(0.0_JPRB,PCLWAT(JL,JK) / ZCLCOV) - ZCLICE = MAX(0.0_JPRB,PCLICE(JL,JK) / ZCLCOV) - ELSE - ZCLWAT = 0.0_JPRB - ZCLICE = 0.0_JPRB - ENDIF - ENDIF - -!* calculate air density, layer depth - ZRHO=PRSF1(JL,JK)/(RD*ZTEMP) - ZDZ= PDP(JL,JK) / (ZRHO*RG) - ZDP = PDP(JL,JK) -! clwc mass mixing ratio to volume mixing ratio : rho air / rho cloud water - note it is liquid water not vapor - ZLMMR2VMR=ZRHO/1000.0_JPRB - IWETDEP=0 - -!* LOOP over species - DO JSCAV=1,NSCAV - - ! Identify aerosol tracer - JT=NSCAV_INDEX(JSCAV) - LLWDAER=.TRUE. - IWETDEP=IWETDEP+1 - - !VH This whole 'selection mechanism is ideally coded in an alternative way, - ! using a lookup table approach. That should be comuptationally much more efficient. - SELECT CASE (NSCAV_TYPE(JSCAV)) - case(0) - incloud = 0.0 - belowcloud = 0.0 - case(1) ! 100% solubility - !incloud = 1. - !belowcloud = corr_diff - CALL ABOR1(" option not supported") - case(2) ! henry solubility assumed - ! rtl = rtl*henry(n,itemp) / ( 1.0 + rtl*henry(n,itemp) ) - ! incloud = rloss1(region)%d3(i,j,k)*rtl - ! belowcloud = rloss2(region)%d3(i,j,k)*rtl*corr_diff - CALL ABOR1("Henry solubility currently not supported") - case(3) ! bulk aerosol - incloud = (1.0 - ZINTERST_FR) - !>>>TvN - ! Alternative would be to make the interstitial fraction for bulk aerosols - ! consistent the values used for the M7 modes, - ! which are taken from Bourgeois and Bey (JGR, 2011) - ! and distinguish between warm, mixed and ice clouds - !<<hso3m+hplus - ! dkhso3 = 6.6e-8*exp(1510.*ztr) !hso3m<=>so3-- + hplus - ! factor = 1.0 + dkso2/hplus + (dkso2*dkhso3)/(hplus**2) - ! heff = factor*henry(n,itemp) - ! rtl = rtl*heff/ ( 1.0 + rtl*heff ) - ! incloud = rloss1(region)%d3(i,j,k)*rtl ! - ! belowcloud = rloss2(region)%d3(i,j,k)*rtl*corr_diff - CALL ABOR1("SO2 solubility currently not supported") - - -!>>>TvN -! The in-cloud scavenging coefficients are defined as the fraction of the tracer -! in the cloudy part of the grid box that is embedded in the cloud liquid or ice water, -! i.e. the non-interstitial part. -! We distinguish between liquid, mixed and ice stratiform clouds (Stier et al., 2005), -! depending on the local temperature in the grid cell (Croft et al., ACP, 2010). -! The in-cloud scavenging coefficients depend on size and composition; -! revised values for the M7 modes were provided by Bourgeois and Bey (JGR, 2011). -! For mixed clouds, an alternative method was presented by Zhang et al. (ACP, 2012), -! which uses a continuous temperature dependency. -! Note that these in-cloud scavenging coefficients account for both nucleation scavenging -! and impaction scavenging (Croft et al., ACP, 2009; 2010). -! Thus, the below-cloud scavenging rates should only account for -! the impaction scavenging by precipitation coming from clouds above the current level. -! -! Estimates for below-cloud scavenging coefficients can be derived -! from Fig. 2 of Dana and Hales (AE, 1975). -! For estimating these values from the figure, I used aerodynamic radii of -! 0.007, 0.07, and 0.7 micron as the boundaries of the M7 modes -! (corresponding to a particle density of about 1800 g/cm^3). -! As in Stier et al. (2005), we do not distinguish between soluble and insoluble modes. -! Thus, dry particle radii can be used for estimating the scavenging coefficients from the figure -! (see also the mode boundaries applied in Fig. 2 in Croft et al., 2009). -! I thus arrive at the following rough estimates for below-cloud mass scavenging coefficients -! for the nucleation, aitken, accumulation, and coarse modes: ~0.01, 0.002, 0.01, and 1 mm^-1. -! These numbers are close to the estimates derived earlier from the same figure -! by Elisabetta Vignati, which were previously used: 0.005, 0.002, 0.008, and 1 mm^-1. -! -! However, both sets of estimates based on Dana and Hales are substantially higher -! than the values presented by Croft et al. (2009). -! From the curves presented in their Fig. 2 for the standard Marshall-Palmer rain distribution, -! rough estimates of the mass scavenging coefficients for the four size modes can be obtained. -! My estimates are 0.002, 0.0002, 0.03, and 0.7 mm^-1. -! Note that especially the value for the accumulation mode is very sensitive to the -! actual mean particle size, and hard to estimate from the figure. -! Since the mean droplet size of the Marshall-Palmer distribution depends on the rain intensity, -! these estimates are only valid for a rain rate of 1 mm/hr. -! For simplicity, we assume that the scavenging coefficients derived from the figure at 1 mm/hr -! can also be applied at other rain intensities. -! -! In the new implementation particle masses and numbers are scavenged at different rates. -! Rough estimates of the number scavenging coefficients for the four size modes -! can be obtained from the same figure in Croft et al. -! My estimates are 0.02, 0.001, 0.0003, and 0.3 mm^-1. - -! Ideally, the below-cloud mass/number scavenging coefficients should be calculated -! using look-up tables to describe the dependence on median radius and precipitation rate, -! e.g. following the formulation/curves presented by Croft et al. -! - - - case(5) ! soluble nu - if (JT /= inus_n) then - belowcloud=0.5 ! 0.5*0.004 = 0.002 mm^-2 - else - belowcloud=5. ! 5.*0.004 = 0.02 mm^-2 - endif - incloud=0.06 - - case(6) ! soluble ai - if (jt /= iais_n) then - belowcloud=0.05 ! 0.05*0.004 = 0.0002 mm^-2 - else - belowcloud=0.25 ! 0.25*0.004 = 0.001 mm^-2 - endif - if (ZTEMP.gt.273.15) then - incloud=0.25 - else - incloud=0.06 - endif - - case(7) ! soluble ac - if (jt /= iacs_n) then - belowcloud=7.5 ! 7.5*0.004 = 0.03 mm^-1 - else - belowcloud=0.075 ! 0.075*0.004 = 0.0003 mm^-1 - endif - - if (ZTEMP.gt.273.15) then - incloud=0.85 - else - incloud=0.06 - endif - - case(8) ! soluble co - if (jt /= icos_n) then - belowcloud=175. ! 175*0.004 = 0.7 mm^-1 - else - belowcloud=75. ! 75*0.004 = 0.3 mm^-1 - endif - if (ZTEMP.gt.273.15) then - incloud=0.99 - else if (ZTEMP.gt.238.15) then - incloud=0.75 - else - incloud=0.06 - endif - - case(9) ! insoluble ai - if (jt /= iaii_n) then - belowcloud=0.05 - else - belowcloud=0.25 - endif - !incloud=0.0 - if (ZTEMP.gt.273.15) then - incloud=0.2 - else - incloud=0.06 - endif - - case(10) ! insoluble ac - if (jt /= iaci_n) then - belowcloud=7.5 - else - belowcloud=0.075 - endif - if (ZTEMP.gt.273.15) then - incloud=0.4 - else - incloud=0.06 - endif - - case(11) ! insoluble co - if (jt /= icoi_n) then - belowcloud=175. - else - belowcloud=75. - endif - if (ZTEMP.gt.238.15) then - incloud=0.4 - else - incloud=0.06 - endif - - case default - incloud = 0.0 - belowcloud = 0.0 - end select - - - - - - !* total cloud water and ice - ZCLTOT=ZCLWAT + ZCLICE - !* Rain-out in Cloud - IF (ZCLTOT > ZEPSQLIQ .AND. ZBETA > 0.0_JPRB ) THEN - !* water loss due to precip formation relative to total (water and ice) cloud - ZBETAR_M7=ZBETA / ( ZCLTOT*ZDP / RG ) ! in s-1 - !* safety check - ZBETAR_M7=MIN( 200._JPRB, MAX( ZBETAR_M7, 0._JPRB )) - - !* water loss due to precip formation relative to cloud, with reduced weight for ice cloud. - !* Relevant to trace gas scavenging, but not treated here. - ! ZINC_RDF=ZCLICE/ZCLTOT*ICE_EFF + ZCLWAT/ZCLTOT - ! ZBETAR=ZBETA *ZINC_RDF / ( ZCLTOT*ZDP / RG ) ! in s-1 - !* safety check - ! ZBETAR=MIN( 200._JPRB, MAX( ZBETAR, 0._JPRB )) - - - !* scavenging coefficient in s-1 - !In-cloud scavenging is different for aerosol than for gas-phase - ZSCAV=ZBETAR_M7 *INCLOUD - - ZFUNC=EXP(-ZSCAV*PTSPHY) ! N.D. (N.D.) - IF (.NOT. LLCONV) THEN - ZFUNC=MAX(0.95_JPRB, ZFUNC) - ENDIF - ZDX = PCEN(JL,JK,JT)*(ZFUNC - 1._JPRB) * ZPRCOV ! in kg kg-1 - PTENC1 (JL,JK,JT) = PTENC1(JL,JK,JT) + ZDX/PTSPHY ! in kg kg-1 s-1 - ZWLOSS(JL,IWETDEP) = ZWLOSS(JL,IWETDEP) - ZDX/PTSPHY * ZDP/RG ! in kg m-2 s-1 - ENDIF - - - - - -!* reevaporation ! bottom flux smaller and top flux above limit - IF (ZBETA < 0.0_JPRB .AND. ZFLXR+ZFLXS > ZEPSFLX ) THEN - ZBETAR=ZBETA/(ZFLXR+ZFLXS) - IF ( ZFLXRB+ZFLXSB <= ZEPSFLX) THEN -!-- total reevaporation, bottom flux <= ZEPSFLX - ZBETAR=MIN(MAX(0._JPRB, -ZBETAR), 1._JPRB) ! N.D. - ELSE -!-- partial reevaporation - ZBETAR=MIN(MAX(0._JPRB, -ZBETAR)*ZFRAC, 1._JPRB) ! N.D. - ENDIF - ZDX = (ZBETAR*ZWLOSS(JL,IWETDEP) * (RG/ZDP) *PTSPHY) * ZPRCOV - PTENC1(JL,JK,JT) = PTENC1(JL,JK,JT) + ZDX/PTSPHY - ZWLOSS(JL,IWETDEP) = ZWLOSS(JL,IWETDEP) - ZDX/PTSPHY * ZDP/RG ! in kg m-2 s-1 - IF (LLPRINT .AND. ZBETAR > 0._JPRB) THEN - WRITE(UNIT=NULOUT,FMT='(1x,''ZSCAV3'',5I3,(11E10.3))') KSTEP,JL,JK,& -& PTENC0(JL,JK,JT),PCEN(JL,JK,JT),PTENC1(JL,JK,JT),ZWLOSS(JL,IWETDEP),ZBETAR,ZDX - ENDIF - ENDIF - - - - -!!* wash-out with rain when flux is positive and no rain formation or evaporation (below-cloud) -! IF (ZFLXR > ZEPSFLX .AND. ABS(ZBETA) <= ZEPSFLX ) THEN -!* wash-out with rain when flux is positive - IF (ZFLXR > ZEPSFLX ) THEN - - ! calculate fraction in rainwater according to Henry - !* rain water in box in kg/kg - IF (LLCONV ) THEN - ZRAINW=(ZFLXR/(ZFALLSP*ZRHO)) / ZPRCOV - ELSE - ZRAINW = (PRAIN(JL,JK)+PSNOW(JL,JK)) / ZPRCOV ! + PSNOW(JL,JK) ! use prognostic variable from input - ENDIF - - ! Rain - ZSCAV=ZFLXR * BELOWCLOUD - ZFUNC=EXP(-ZSCAV*PTSPHY) ! N.D. (N.D.) - ZDX = PCEN(JL,JK,JT)*(ZFUNC -1._JPRB)*ZPRCOV ! in kg kg-1 - ZFUNC=MAX(0.97_JPRB, ZFUNC) - - ! snow - ZSCAV=ZFLXS*5.E-3 ! first assumption - requires review/update! - ZFUNC=EXP(-ZSCAV*PTSPHY) ! N.D. (N.D.) - ZDX = ZDX + PCEN(JL,JK,JT)*(ZFUNC - 1._JPRB)*ZPRCOV ! in kg kg-1 - ZFUNC=MAX(0.97_JPRB, ZFUNC) - - PTENC1 (JL,JK,JT) = PTENC1(JL,JK,JT) + ZDX/PTSPHY ! in kg kg-1 s-1 - ZWLOSS(JL,IWETDEP) = ZWLOSS(JL,IWETDEP) - ZDX/PTSPHY * ZDP/RG ! in kg m-2 s-1 - - ENDIF ! rainout - ENDDO - ENDDO -ENDDO - - - -!* LOOP OVER LAYERS -DO JK=1,KLEV - DO JL=KIDIA,KFDIA - PFAERO(JL,:) = PFAERO(JL,:) -(PTENC1(JL,JK,:)-PTENC0(JL,JK,:))*(PDP(JL,JK))/RG - ENDDO -ENDDO - - -!! debug undo anything -! PTENC1(KIDIA:KFDIA,1:KLEV,1:KCHEM) =PTENC0(KIDIA:KFDIA,1:KLEV,1:KCHEM) -!----------------------------------------------------------------------- -END ASSOCIATE -IF (LHOOK) CALL DR_HOOK('TM5M7_SCAV',1,ZHOOK_HANDLE) -END SUBROUTINE TM5M7_SCAV diff --git a/ifs-source/arpifs/phys_ec/tm5m7_src.F90 b/ifs-source/arpifs/phys_ec/tm5m7_src.F90 index 51e2e768..30f58e56 100644 --- a/ifs-source/arpifs/phys_ec/tm5m7_src.F90 +++ b/ifs-source/arpifs/phys_ec/tm5m7_src.F90 @@ -30,7 +30,7 @@ SUBROUTINE TM5M7_SRC & USE GEOMETRY_MOD , ONLY : GEOMETRY USE TYPE_MODEL , ONLY : MODEL -USE PARKIND1 ,ONLY : JPIM, JPRB +USE PARKIND1 ,ONLY : JPIM, JPRB, JPRD USE YOMHOOK ,ONLY : LHOOK, DR_HOOK USE YOMLUN ,ONLY : NULOUT, NULERR !USE YOM_YGFL ,ONLY : YGFL @@ -67,7 +67,7 @@ SUBROUTINE TM5M7_SRC & ! --------- TYPE(GEOMETRY) ,INTENT(IN) :: YDGEOMETRY -TYPE(MODEL) ,INTENT(IN) :: YDMODEL +TYPE(MODEL) ,INTENT(INOUT) :: YDMODEL INTEGER(KIND=JPIM),INTENT(IN) :: KLON, KIDIA, KFDIA INTEGER(KIND=JPIM),INTENT(IN) :: KLEV, KTDIA, KSTGLO INTEGER(KIND=JPIM),INTENT(IN) :: KTILES @@ -186,7 +186,7 @@ SUBROUTINE TM5M7_SRC & !----------------------------------------------------------------------- #include "updcal.intfb.h" -!#include "fcttim.func.h" +#include "fcttim.func.h" #include "surf_inq.h" @@ -201,7 +201,7 @@ SUBROUTINE TM5M7_SRC & !----------------------------------------------------------------------- ASSOCIATE(YDVAB=>YDGEOMETRY%YRVAB,YDVETA=>YDGEOMETRY%YRVETA,YDVFE=>YDGEOMETRY%YRVFE,& - & YDCSGLEG=>YDGEOMETRY%YRCSGLEG,YDVSPLIP=>YDGEOMETRY%YRVSPLIP,YDVSLETA=>YDGEOMETRY%YRVSLETA,& + & YDCSGLEG=>YDGEOMETRY%YRCSGLEG,& & YDEPHY=>YDMODEL%YRML_PHY_EC%YREPHY, & & YDEAERMAP=>YDMODEL%YRML_PHY_AER%YREAERMAP, & & YGFL=>YDMODEL%YRML_GCONF%YGFL, & diff --git a/ifs-source/arpifs/phys_ec/tm5m7_src_dust.F90 b/ifs-source/arpifs/phys_ec/tm5m7_src_dust.F90 index 464a9945..c959fd0d 100644 --- a/ifs-source/arpifs/phys_ec/tm5m7_src_dust.F90 +++ b/ifs-source/arpifs/phys_ec/tm5m7_src_dust.F90 @@ -51,7 +51,7 @@ SUBROUTINE TM5M7_SRC_DUST & ! ! Sep 2020 - V. Huijnen: first (partial) introduction into OpenIFS !----------------------------------------------------------------------- -USE TYPE_MODEL, ONLY MODEL +USE TYPE_MODEL,ONLY : MODEL USE YOMLUN, ONLY : NULOUT USE PARKIND1 ,ONLY : JPIM ,JPRB USE YOMHOOK ,ONLY : LHOOK, DR_HOOK @@ -85,7 +85,7 @@ SUBROUTINE TM5M7_SRC_DUST & !* 0.1 ARGUMENTS ! --------- -TYPE(MODEL) ,INTENT(IN) :: YDMODEL +TYPE(MODEL) ,INTENT(INOUT) :: YDMODEL INTEGER(KIND=JPIM),INTENT(IN) :: KLON INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA INTEGER(KIND=JPIM),INTENT(IN) :: KFDIA @@ -160,6 +160,8 @@ SUBROUTINE TM5M7_SRC_DUST & REAL(KIND=JPRB) :: ZREFRAD, ZREFSPD, ZRADREF,ZLONGB LOGICAL :: LLDUST(KLON,12), LLPDUSTS(KLON) !REAL(KIND=JPRB) :: ZFLX_SDUST(KLON,9,12) +REAL(KIND=JPRB), POINTER :: RDDUAER(:), RDUSRCP(:) +REAL(KIND=JPRB), POINTER :: RDDUSRC(:)!!! dimensions changed from (0:50,9) to (9) INTEGER(KIND=JPIM)::KBINDD REAL(KIND=JPRB) :: ZHOOK_HANDLE @@ -178,21 +180,20 @@ SUBROUTINE TM5M7_SRC_DUST & & YDEAERATM=>YDMODEL%YRML_PHY_RAD%YREAERATM, & & YDRIP=>YDMODEL%YRML_GCONF%YRRIP) -ASSOCIATE(RSSFLX=>YDEAERSRC%RSSFLX) -ASSOCIATE( NDUSRCP=>YDEAERMAP%NDUSRCP, RDDUAER=>YDEAERMAP%RDDUAER, & +ASSOCIATE( RSSFLX=>YDEAERSRC%RSSFLX, NDUSRCP=>YDEAERMAP%NDUSRCP, RDDUAER=>YDEAERMAP%RDDUAER, & & RDUSRCP=>YDEAERMAP%RDUSRCP, & & RRHO_DD=>YDEAERSNK%RRHO_DD, & & NAERWND=>YDEAERSRC%NAERWND, & & NDDUST=>YDEAERSRC%NDDUST, NDMSO=>YDEAERSRC%NDMSO, NSSALT=>YDEAERSRC%NSSALT, & - & NTYPAER=>YDEAERSRC%NTYPAER, RAERDUB=>YDEAERSRC%RAERDUB, & - & RBCPHIL=>YDEAERSRC%RBCPHIL, RBCPHOB=>YDEAERSRC%RBCPHOB, & + & NTYPAER=>YDEAERATM%NTYPAER, RAERDUB=>YDEAERSRC%RAERDUB, & & RCODECA=>YDEAERSRC%RCODECA, RCOVSRA=>YDEAERSRC%RCOVSRA, & & RDDUSRC=>YDEAERSRC%RDDUSRC, RDMSMIN=>YDEAERSRC%RDMSMIN, & - & RFCTSS=>YDEAERSRC%RFCTSS, ROMPHIL=>YDEAERSRC%ROMPHIL, & - & ROMPHOB=>YDEAERSRC%ROMPHOB, RSIDECA=>YDEAERSRC%RSIDECA, & - & RSIVSRA=>YDEAERSRC%RSIVSRA, & - & LE4ALB=>YDEPHY%LE4ALB, LVDFTRAC=>YDEPHY%LVDFTRAC, YSURF=>YDEPHY%YSURF)!, & + & NALBEDOSCHEME=>YDEPHY%NALBEDOSCHEME) ! LE4ALB to NALBEDOSCHEME +! & RFCTSS=>YDEAERSRC%RFCTSS, ROMPHIL=>YDEAERSRC%ROMPHIL, & +! & ROMPHOB=>YDEAERSRC%ROMPHOB, RSIDECA=>YDEAERSRC%RSIDECA, & +! & RSIVSRA=>YDEAERSRC%RSIVSRA, & + !& LE4ALB=>YDEPHY%LE4ALB, LVDFTRAC=>YDEPHY%LVDFTRAC, YSURF=>YDEPHY%YSURF)!, & !& NLOENG=>YDGEOMETRY%YRGEM%NLOENG, & !& NGLOBALAT=>YDGEOMETRY%YRMP%NGLOBALAT, & !& NSTASS=>YRRIP%NSTASS, RHGMT=>YRRIP%RHGMT, RSTATI=>YRRIP%RSTATI,& @@ -832,7 +833,7 @@ SUBROUTINE TM5M7_SRC_DUST & KBINDD=3 RDDUAER(:) = 0.0_JPRB -RDDUSRC(:,:)= 0.0_JPRB +RDDUSRC(:)= 0.0_JPRB NDUSRCP(:) = 1 RDUSRCP(:,:) = 0.0_JPRB @@ -897,9 +898,9 @@ SUBROUTINE TM5M7_SRC_DUST & ! -- 7 the rest (Japan, Greenland, Antarctica) RDUSRCP(7,1) = 4.0_JPRB RDUSRCP(7,2) = 5.0_JPRB -RDDUSRC(:,1)=0.3_JPRB -RDDUSRC(:,2)=0.8_JPRB -RDDUSRC(:,3)=5.5_JPRB +RDDUSRC(1)=0.3_JPRB +RDDUSRC(2)=0.8_JPRB +RDDUSRC(3)=5.5_JPRB !-- default values are for use of 10-m wind as predictor for SS and DU !RFCTDU = 1.0_JPRB !RFCTSS = 1.0_JPRB @@ -1235,7 +1236,8 @@ SUBROUTINE TM5M7_SRC_DUST & PAERMAP(JL,3)=RDUSRCP(NDUSRCP(IFF),1) ! reference speed PAERMAP(JL,4)=RDUSRCP(NDUSRCP(IFF),2) ! reference particule radius DO JAER=1,KBINDD - ZDUEMPOT(JL,JAER)=RDDUAER(IFF)*RDDUSRC(IFF,JAER)*PLSM(JL) ! dust emission potential factor (including land-sea mask) + !ZDUEMPOT(JL,JAER)=RDDUAER(IFF)*RDDUSRC(IFF,JAER)*PLSM(JL) ! dust emission potential factor (including land-sea mask) + ZDUEMPOT(JL,JAER)=RDDUAER(IFF)*RDDUSRC(JAER)*PLSM(JL) ! dust emission potential factor (including land-sea mask) ENDDO PAERMAP(JL,2)=ZDUEMPOT(JL,1) ! for diagnostics only ELSE @@ -1376,7 +1378,8 @@ SUBROUTINE TM5M7_SRC_DUST & ZWND3(JL) = MAX(0._JPRB, (PWIND(JL)-ZLTS2(JL)) *PWIND(JL)*PWIND(JL) ) !- preferred approach: flux is based on MODIS-derived UVis_Alb (0.3-0.7 um) - IF (LE4ALB) THEN +! IF (LE4ALB) THEN + IF (NALBEDOSCHEME>0) THEN ! IF (PALBD(JL,1) >= 0.20_JPRB .AND. PALBD(JL,1) < 0.55_JPRB ) THEN IF (PALBD(JL,1) >= 0.08_JPRB .AND. PALBD(JL,1) < 0.55_JPRB ) THEN ZFLX_SDUST(JL,JAER,3)= ZDEP2(JL) * PALBD(JL,1) * ZWND3(JL) diff --git a/ifs-source/arpifs/phys_ec/tm5m7_src_ss.F90 b/ifs-source/arpifs/phys_ec/tm5m7_src_ss.F90 index 09cb86c9..18d9ec41 100644 --- a/ifs-source/arpifs/phys_ec/tm5m7_src_ss.F90 +++ b/ifs-source/arpifs/phys_ec/tm5m7_src_ss.F90 @@ -88,7 +88,7 @@ SUBROUTINE TM5M7_SRC_SS & !----------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('TM5M7_SRC_SS',0,ZHOOK_HANDLE) -ASSOCIATE(RSSFLX=>YREAERSRC%RSSFLX) +ASSOCIATE(RSSFLX=>YDEAERSRC%RSSFLX) !>>> TvN diff --git a/ifs-source/arpifs/phys_radi/radiation_scheme.F90 b/ifs-source/arpifs/phys_radi/radiation_scheme.F90 index 3a0c8f2f..0647b94f 100644 --- a/ifs-source/arpifs/phys_radi/radiation_scheme.F90 +++ b/ifs-source/arpifs/phys_radi/radiation_scheme.F90 @@ -17,13 +17,13 @@ SUBROUTINE RADIATION_SCHEME & & PQ, PCO2, PCH4, PN2O, PNO2, PCFC11, PCFC12, PHCFC22, PCCL4, PO3_DP, & & PCLOUD_FRAC, PQ_LIQUID, PQ_ICE, PQ_RAIN, PQ_SNOW, & & PAEROSOL_OLD, PAEROSOL, & - & PAEROM7_TAU, PAEROM7_SSA, PAEROM7_ASYM, & ! add for M7 aerosol & PFLUX_SW, PFLUX_LW, PFLUX_SW_CLEAR, PFLUX_LW_CLEAR, & & PFLUX_SW_DN, PFLUX_LW_DN, PFLUX_SW_DN_CLEAR, PFLUX_LW_DN_CLEAR, & & PFLUX_DIR, PFLUX_DIR_CLEAR, PFLUX_DIR_INTO_SUN, & & PFLUX_UV, PFLUX_PAR, PFLUX_PAR_CLEAR, & & PFLUX_SW_DN_TOA, PEMIS_OUT, PLWDERIVATIVE, & & PSWDIFFUSEBAND, PSWDIRECTBAND, & + & PAEROM7_TAU, PAEROM7_SSA, PAEROM7_ASYM, & ! add for M7 aerosol & PRE_LIQ, PRE_ICE, & & PPERT, PFSD) @@ -149,9 +149,9 @@ SUBROUTINE RADIATION_SCHEME & REAL(KIND=JPRB), INTENT(IN) :: PAEROSOL_OLD(KLON,6,KLEV) REAL(KIND=JPRB), INTENT(IN) :: PAEROSOL(KLON,KLEV,KAEROSOL) -REAL(KIND=JPRB), INTENT(IN) :: PAEROM7_TAU(KLON,KLEV,14) -REAL(KIND=JPRB), INTENT(IN) :: PAEROM7_SSA(KLON,KLEV,14) -REAL(KIND=JPRB), INTENT(IN) :: PAEROM7_ASYM(KLON,KLEV,14) +REAL(KIND=JPRB), INTENT(IN), OPTIONAL :: PAEROM7_TAU(KLON,KLEV,14) +REAL(KIND=JPRB), INTENT(IN), OPTIONAL :: PAEROM7_SSA(KLON,KLEV,14) +REAL(KIND=JPRB), INTENT(IN), OPTIONAL :: PAEROM7_ASYM(KLON,KLEV,14) !REAL(KIND=JPRB), INTENT(IN) :: PAEROM7_TAULW(KLON,KLEV,16) REAL(KIND=JPRB), INTENT(IN) :: PCCN_LAND(KLON) @@ -201,8 +201,8 @@ SUBROUTINE RADIATION_SCHEME & REAL(KIND=JPRB), INTENT(OUT) :: PSWDIFFUSEBAND(KLON,YDMODEL%YRML_PHY_RAD%YRERAD%NSW) REAL(KIND=JPRB), INTENT(OUT) :: PSWDIRECTBAND (KLON,YDMODEL%YRML_PHY_RAD%YRERAD%NSW) -REAL(KIND=JPRB), INTENT(IN) :: PRE_LIQ(KLON,KLEV) -REAL(KIND=JPRB), INTENT(IN) :: PRE_ICE(KLON,KLEV) +REAL(KIND=JPRB), INTENT(IN), OPTIONAL :: PRE_LIQ(KLON,KLEV) +REAL(KIND=JPRB), INTENT(IN), OPTIONAL :: PRE_ICE(KLON,KLEV) ! SPP perturbations REAL(KIND=JPRB), INTENT(IN), OPTIONAL :: PPERT(KLON, YDMODEL%YRML_GCONF%YRSPP_CONFIG%SM%NRFTOTAL_RADGRID) @@ -286,7 +286,7 @@ SUBROUTINE RADIATION_SCHEME & ASSOCIATE(YDRADIATION=>YDMODEL%YRML_PHY_RAD%YRADIATION, & & YRERAD=>YDMODEL%YRML_PHY_RAD%YRERAD, & & YDSPP_CONFIG=>YDMODEL%YRML_GCONF%YRSPP_CONFIG) -ASSOCIATE(RAD_CONFIG=>YDRADIATION%RAD_CONFIG, & +ASSOCIATE(NCLOUDACT=>YRERAD%NCLOUDACT, RAD_CONFIG=>YDRADIATION%RAD_CONFIG, & & NWEIGHT_UV=>YDRADIATION%NWEIGHT_UV, & & IBAND_UV =>YDRADIATION%IBAND_UV(:), & & WEIGHT_UV =>YDRADIATION%WEIGHT_UV(:), & diff --git a/ifs-source/arpifs/phys_radi/radintg.F90 b/ifs-source/arpifs/phys_radi/radintg.F90 index 4567d317..999becc5 100644 --- a/ifs-source/arpifs/phys_radi/radintg.F90 +++ b/ifs-source/arpifs/phys_radi/radintg.F90 @@ -488,7 +488,7 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& & LAERVOL=>YDEAERATM%LAERVOL, & & LAPPROXLWUPDATE=>YDERAD%LAPPROXLWUPDATE, & & LAPPROXSWUPDATE=>YDERAD%LAPPROXSWUPDATE, LDIAGFORCING=>YDERAD%LDIAGFORCING, & - & LEPO3RA=>YDERAD%LEPO3RA, LHVOLCA=>YDERAD%LHVOLCA, NCLOUDACT=>YDERAD%NCLOUDACT & + & LEPO3RA=>YDERAD%LEPO3RA, LHVOLCA=>YDERAD%LHVOLCA, NCLOUDACT=>YDERAD%NCLOUDACT, & & LNOTROAER=>YDERAD%LNOTROAER, LSRTM=>YDERAD%LSRTM, NAER=>YDERAD%NAER, & & NAERMACC=>YDERAD%NAERMACC, NGHGRAD=>YDERAD%NGHGRAD, NOZOCL=>YDERAD%NOZOCL, & & NPERTAER=>YDERAD%NPERTAER, NPERTOZ=>YDERAD%NPERTOZ, NRADINT=>YDERAD%NRADINT, & @@ -1000,7 +1000,7 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& !A.Laakso: IF (NSTEP == YDRIP%NSTART) THEN - DO JAERO=1,YRERAD%NTSW + DO JAERO=1,YDERAD%NTSW IAE=(JAERO-1)*KLEV ZRGP(1:IL,IHAMAEROAOD+IAE:IHAMAEROAOD+IAE+KLEV-1,IB) =0._JPRB ZRGP(1:IL,IHAMAEROSSA+IAE:IHAMAEROSSA+IAE+KLEV-1,IB) =0._JPRB @@ -1032,8 +1032,7 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& !DO JAERO=1,STRATO_CMIP6_NTB !IAE=(JAERO-1)*KLEV !ZRGP(1:IL,IHAMAEROAODLW+IAE:IHAMAEROAODLW+IAE+KLEV-1,IB) =MAX(0._JPRB, PAEROTAULW(IBEG:IEND,1:KLEV,JAERO)) - - ENDDO + !ENDDO ENDIF @@ -1678,7 +1677,6 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& & ZRGP(1,ICLC,IB), ZRGP(1,ILWA,IB), ZRGP(1,IIWA,IB), ZRGP(1,IRWA,IB), & & ZRGP(1,ISWA,IB), & & ZRGP(1,IAER,IB), ZRGP(1,IAERO,IB), & - & ZRGP(1,IHAMAEROAOD,IB), ZRGP(1,IHAMAEROSSA,IB), ZRGP(1,IHAMAEROASYM,IB), & ! added for M7 aerosol ! Flux outputs & ZRGP(1,IFRSO,IB), ZRGP(1,IFRTH,IB), ZRGP(1,ISWFC,IB),ZRGP(1,ILWFC,IB),& & ZRGP(1,IFRSOD,IB),ZRGP(1,IFRTED,IB), & @@ -1688,8 +1686,9 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& & ZRGP(1,IPARCF,IB),ZRGP(1,ITINCF,IB), & & ZRGP(1,IEMIT,IB) ,ZRGP(1,ILwDerivative,IB), & & ZRGP(1,ISwDiffuseBand,IB), ZRGP(1,ISwDirectBand,IB),& - & ZRGP(1,IRE_LIQ,IB), ZRGP(1,IRE_ICE,IB),& ! OPTIONAL ARGUMENTS + & ZRGP(1,IHAMAEROAOD,IB), ZRGP(1,IHAMAEROSSA,IB), ZRGP(1,IHAMAEROASYM,IB), & ! added for M7 aerosol + & ZRGP(1,IRE_LIQ,IB), ZRGP(1,IRE_ICE,IB),& & PPERT=ZRGP(1,IPERT,IB), PFSD=ZRGP(1,IFSD,IB) ) ENDIF diff --git a/ifs-source/arpifs/phys_radi/suecrad.F90 b/ifs-source/arpifs/phys_radi/suecrad.F90 index 5cbe3bbe..adfa10b8 100644 --- a/ifs-source/arpifs/phys_radi/suecrad.F90 +++ b/ifs-source/arpifs/phys_radi/suecrad.F90 @@ -269,7 +269,7 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) & LAER3D, LINTERPINCLOUDMEAN INTEGER(KIND=JPIM), POINTER :: NICEOPT, NLIQOPT, NSWICEOPT, NLWICEOPT, NSWLIQOPT,& - & NLWLIQOPT, NMCICA, NRADIP, NRADLP,& + & NLWLIQOPT, NMCICA, NRADIP, NRADLP, NCLOUDACT,NAEROOPT, & & NREDGLW, NREDGSW, NAER, NMODE, NOZOCL, NINHOM, NLAYINH, NOVLP, NSW,& & NRADFR, NLNGR1H, NRADELG, NRADPFR, NRADPLA, NRPROMA, NRADINT, NRADRES,& & NGHGRAD, NDECOLAT, NMINICE, NVOLCVERT, NPERTAER, NPERTOZ, NHINCSOL, NSCEN,& @@ -350,8 +350,8 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) & LHLRADUPD=>YDPHY%LHLRADUPD, RADGR=>YDPARAR%RADGR, RADSN=>YDPARAR%RADSN) ! Associate pointers for variables in namelist NAERAD -NCLOUDACT => YRERAD%NCLOUDACT -NAEROOPT => YRERAD%NAEROOPT +NCLOUDACT => YDERAD%NCLOUDACT +NAEROOPT => YDERAD%NAEROOPT LERAD1H => YDERAD%LERAD1H LEPO3RA => YDERAD%LEPO3RA diff --git a/ifs-source/arpifs/setup/su0yomb.F90 b/ifs-source/arpifs/setup/su0yomb.F90 index 9d6a3c7d..ee404cd3 100644 --- a/ifs-source/arpifs/setup/su0yomb.F90 +++ b/ifs-source/arpifs/setup/su0yomb.F90 @@ -185,7 +185,8 @@ SUBROUTINE SU0YOMB(YDFPOS,YDGEOMETRY,YDFIELDS,YDMTRAJ,YDMODEL,YDJOT,YDVARBC,YDTC TYPE(CLASS_VARBC), INTENT(INOUT) :: YDVARBC TYPE(TOVSCV), INTENT(INOUT) :: YDTCV TYPE(TOVSCV_BGC), INTENT(INOUT) :: YDTCV_BGC -CLASS(DBASE), INTENT(OUT) :: YDODB +!CLASS(DBASE), INTENT(OUT) :: YDODB +CLASS(DBASE) :: YDODB CHARACTER (LEN = 35) :: CLINE CHARACTER(LEN=40) :: CLFILE diff --git a/ifs-source/arpifs/setup/sugfl1.F90 b/ifs-source/arpifs/setup/sugfl1.F90 index 1f532f19..afdc5648 100644 --- a/ifs-source/arpifs/setup/sugfl1.F90 +++ b/ifs-source/arpifs/setup/sugfl1.F90 @@ -77,6 +77,8 @@ SUBROUTINE SUGFL1(YDMODEL,KGFLCONF) USE YOM_YGFL , ONLY : JPCHEM_ASSIM, JPGHG_ASSIM, TYPE_GFL_NAML USE YOMANEB , ONLY : NGRBCHEM, NGRBGHGASSIM USE YOE_AERODIAG, ONLY : TYPE_AERO_WVL_DIAG +USE YOMM7CTL , ONLY : YRM7CTL !!! M7, looks ugly now + USE ARPCLIM_CHEM_MODULE #if defined(__PGI) USE PAR_GFL @@ -142,6 +144,7 @@ SUBROUTINE SUGFL1(YDMODEL,KGFLCONF) TYPE(TYPE_GFL_NAML), POINTER :: & & YGHG_NL(:), YCHEM_NL(:), YAERO_NL(:), YERA40_NL(:), YNOGW_NL(:), YSLDIA_NL(:), & & YAERAOT_NL(:), YAERLISI_NL(:,:), YAEROCLIM_NL(:), YAEROUT_NL(:), YUVP_NL(:), & + & YCDNC_NL, YICNC_NL, YRE_LIQ_NL, YRE_ICE_NL, & !eehol: added cloud prop & YFORC_NL(:), YEZDIAG_NL(:), YEXT_NL(:), YLIMA_NL(:), YEDRP_NL(:) #endif diff --git a/ifs-source/arpifs/setup/sugfl2.F90 b/ifs-source/arpifs/setup/sugfl2.F90 index 336b3518..16dd6df6 100644 --- a/ifs-source/arpifs/setup/sugfl2.F90 +++ b/ifs-source/arpifs/setup/sugfl2.F90 @@ -779,7 +779,7 @@ SUBROUTINE SUGFL2(YDEPHY,YDML_GCONF,YDCOMPO) IF (YCDNC_NL%LGP) THEN IGFLPTR=NUMFLDS+1 YGFL%YCDNC=>YGFL%YCOMP(IGFLPTR) - CALL DEFINE_GFL_COMP(YDCOMP=YGFL%YCDNC,CDNAME=YCDNC_NL%CNAME,& + CALL DEFINE_GFL_COMP(YGFL,YDCOMP=YGFL%YCDNC,CDNAME=YCDNC_NL%CNAME,& & KGRIB=YCDNC_NL%IGRBCODE,LDGP=.TRUE., & & KREQIN=YCDNC_NL%NREQIN,& & PREFVALI=YCDNC_NL%REFVALI,LDREQOUT=YCDNC_NL%LREQOUT,& @@ -790,7 +790,7 @@ SUBROUTINE SUGFL2(YDEPHY,YDML_GCONF,YDCOMPO) IF (YICNC_NL%LGP) THEN IGFLPTR=NUMFLDS+1 YGFL%YICNC=>YGFL%YCOMP(IGFLPTR) - CALL DEFINE_GFL_COMP(YDCOMP=YGFL%YICNC,CDNAME=YICNC_NL%CNAME,& + CALL DEFINE_GFL_COMP(YGFL,YDCOMP=YGFL%YICNC,CDNAME=YICNC_NL%CNAME,& & KGRIB=YICNC_NL%IGRBCODE,LDGP=.TRUE., & & KREQIN=YICNC_NL%NREQIN,& & PREFVALI=YICNC_NL%REFVALI,LDREQOUT=YICNC_NL%LREQOUT,& @@ -801,7 +801,7 @@ SUBROUTINE SUGFL2(YDEPHY,YDML_GCONF,YDCOMPO) IF (YRE_LIQ_NL%LGP) THEN IGFLPTR=NUMFLDS+1 YGFL%YRE_LIQ=>YGFL%YCOMP(IGFLPTR) - CALL DEFINE_GFL_COMP(YDCOMP=YGFL%YRE_LIQ,CDNAME=YRE_LIQ_NL%CNAME,& + CALL DEFINE_GFL_COMP(YGFL,YDCOMP=YGFL%YRE_LIQ,CDNAME=YRE_LIQ_NL%CNAME,& & KGRIB=YRE_LIQ_NL%IGRBCODE,LDGP=.TRUE., & & KREQIN=YRE_LIQ_NL%NREQIN,& & PREFVALI=YRE_LIQ_NL%REFVALI,LDREQOUT=YRE_LIQ_NL%LREQOUT,& @@ -812,7 +812,7 @@ SUBROUTINE SUGFL2(YDEPHY,YDML_GCONF,YDCOMPO) IF (YRE_ICE_NL%LGP) THEN IGFLPTR=NUMFLDS+1 YGFL%YRE_ICE=>YGFL%YCOMP(IGFLPTR) - CALL DEFINE_GFL_COMP(YDCOMP=YGFL%YRE_ICE,CDNAME=YRE_ICE_NL%CNAME,& + CALL DEFINE_GFL_COMP(YGFL,YDCOMP=YGFL%YRE_ICE,CDNAME=YRE_ICE_NL%CNAME,& & KGRIB=YRE_ICE_NL%IGRBCODE,LDGP=.TRUE., & & KREQIN=YRE_ICE_NL%NREQIN,& & PREFVALI=YRE_ICE_NL%REFVALI,LDREQOUT=YRE_ICE_NL%LREQOUT,& diff --git a/ifs-source/arpifs/setup/sugfl3.F90 b/ifs-source/arpifs/setup/sugfl3.F90 index 2395ae24..bf4fbd90 100644 --- a/ifs-source/arpifs/setup/sugfl3.F90 +++ b/ifs-source/arpifs/setup/sugfl3.F90 @@ -946,16 +946,16 @@ SUBROUTINE SUGFL3(YDDIMV,YDMODEL) !eehol: cloud prop ! Aerosol-cloud interaction fields, EC-EARTH IF (YCDNC%LACTIVE) THEN - CALL SET_GFL_ATTR(YDDIMV, YCDNC, LDADV=.FALSE., LDT9=.FALSE., LDPHY=.FALSE.) + CALL SET_GFL_ATTR(YDDIMV, YGFL, YCDNC, LDADV=.FALSE., LDT9=.FALSE., LDPHY=.FALSE.) END IF IF (YICNC%LACTIVE) THEN - CALL SET_GFL_ATTR(YDDIMV, YICNC, LDADV=.FALSE., LDT9=.FALSE., LDPHY=.FALSE.) + CALL SET_GFL_ATTR(YDDIMV, YGFL, YICNC, LDADV=.FALSE., LDT9=.FALSE., LDPHY=.FALSE.) END IF IF (YRE_LIQ%LACTIVE) THEN - CALL SET_GFL_ATTR(YDDIMV, YRE_LIQ, LDADV=.FALSE., LDT9=.FALSE., LDPHY=.FALSE.) + CALL SET_GFL_ATTR(YDDIMV, YGFL, YRE_LIQ, LDADV=.FALSE., LDT9=.FALSE., LDPHY=.FALSE.) END IF IF (YRE_ICE%LACTIVE) THEN - CALL SET_GFL_ATTR(YDDIMV, YRE_ICE, LDADV=.FALSE., LDT9=.FALSE., LDPHY=.FALSE.) + CALL SET_GFL_ATTR(YDDIMV, YGFL, YRE_ICE, LDADV=.FALSE., LDT9=.FALSE., LDPHY=.FALSE.) END IF ! * NAEROCLIM fields: aerosol 3D input fields used for ECMWF applications diff --git a/ifs-source/radiation/module/radiation_interface.F90 b/ifs-source/radiation/module/radiation_interface.F90 index 2df28da6..45475f6e 100644 --- a/ifs-source/radiation/module/radiation_interface.F90 +++ b/ifs-source/radiation/module/radiation_interface.F90 @@ -634,7 +634,7 @@ subroutine radiation_reverse(ncol, nlev, istartcol, iendcol, config, & ! Run radiation scheme on reversed profiles call radiation(ncol, nlev,istartcol,iendcol, & & config, single_level, thermodynamics_rev, gas_rev, & - & cloud_rev, aerosol_rev, flux_rev) + & cloud_rev, aerosol_rev, aerosol_ham, flux_rev) ! Reorder fluxes if (allocated(flux%lw_up)) then From c8fd981038117895f0e49b1327a89631591ebfc6 Mon Sep 17 00:00:00 2001 From: Lianghai Wu Date: Tue, 19 Dec 2023 09:02:43 +0000 Subject: [PATCH 004/129] 100% compiled --- ifs-source/arpifs/module/tm5_photolysis.F90 | 259 ++++++++++++++++++ ifs-source/arpifs/phys_ec/aer_negat.F90 | 4 +- ifs-source/arpifs/phys_ec/hamm7_init.F90 | 4 +- ifs-source/arpifs/phys_ec/hamm7_interface.F90 | 4 +- .../phys_ec/m7_simple_sulfur_drydep.F90 | 4 +- ifs-source/arpifs/phys_ec/tm5m7_drydep.F90 | 4 +- .../arpifs/phys_ec/tm5m7_get_refr_idx.F90 | 4 +- ifs-source/arpifs/phys_ec/tm5m7_init.F90 | 6 +- .../arpifs/phys_ec/tm5m7_optics_aop_get.F90 | 4 +- .../phys_ec/tm5m7_optics_calculate_aop.F90 | 4 +- .../arpifs/phys_ec/tm5m7_optics_init.F90 | 20 +- ifs-source/arpifs/phys_ec/tm5m7_phy2.F90 | 4 +- ifs-source/arpifs/phys_ec/tm5m7_sediment.F90 | 4 +- ifs-source/arpifs/phys_ec/tm5m7_src.F90 | 4 +- ifs-source/arpifs/phys_ec/tm5m7_src_dust.F90 | 4 +- .../arpifs/phys_ec/tm5m7_src_dust_init.F90 | 4 +- ifs-source/arpifs/phys_ec/tm5m7_src_ss.F90 | 4 +- .../module/radiation_aerosol_optics.F90 | 4 +- .../radiation/module/radiation_interface.F90 | 2 +- 19 files changed, 303 insertions(+), 44 deletions(-) diff --git a/ifs-source/arpifs/module/tm5_photolysis.F90 b/ifs-source/arpifs/module/tm5_photolysis.F90 index 81a57bd6..a0de0f02 100644 --- a/ifs-source/arpifs/module/tm5_photolysis.F90 +++ b/ifs-source/arpifs/module/tm5_photolysis.F90 @@ -608,4 +608,263 @@ MODULE TM5_PHOTOLYSIS ! Logical to test whether photolysis data has been initialized LOGICAL :: LL_TM5_PHOTO_INI = .FALSE. + +contains + + +! Initialize new photolysis routine +! ----------------------------------------------------------- +SUBROUTINE PHOTOLYSIS_INI +!USE TM5_PHOTOLYSIS , ONLY : WAVE_FULL, DWAVE_FULL, WAVE, DWAVE, MAXWAV, & +! & NWAV_NO2,NWAV_CO,NWAV_HNO3,NWAV_O3,NWAV_PAN,NWAV_H2O2,NWAV_N2O5,NWAV_CH2O,& +! & NWAV_NO3,NWAV_ACET, & +! & CS_RAY, PHI0, RD, FLUX, NTEMP_MAX, & +! & XS_O3_LOOK,XS_HNO3_LOOK,XS_PAN_LOOK,QY_O3_LOOK,XS_H2O2_LOOK, & +! & XS_N2O5_LOOK,XS_NO2_LOOK,QY_NO2_LOOK,QY_CO_LOOK,XS_NO3_LOOK, XS_CH2O_LOOK, & +! & A1_ACET,A2_ACET,A3_ACET,A4_ACET, & +! & SCA,ABS_EFF, GFAC, EXT , PN_REF + +USE YOMLUN , ONLY : NULOUT +USE PARKIND1 , ONLY : JPIM ,JPRB +USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK + +IMPLICIT NONE + +! Local parameters +INTEGER(KIND=JPIM), PARAMETER :: IUTMP=77 +INTEGER(KIND=JPIM) :: IK, IWAV, JL +REAL(KIND=JPRB) :: ZWL,ZX +LOGICAL :: LLFILEOK +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE + +!TM5 photolysis info file +CHARACTER(LEN=27) :: CL_TM5_PHOTO_LOOKUP='tropo_look_up_cbmhybrid.dat' +!TM5 extraterrestrial flux: +CHARACTER(LEN=21) :: CL_TM5_EXTRATERRESTRIAL='OMI.data.extraterrest' +!TM5 aerosol: +CHARACTER(LEN=18) :: CL_TM5_AEROSOL='aerosol_reduce.dat' +#include "abor1.intfb.h" + +IF (LHOOK) CALL DR_HOOK('TM5_CHEM_INI:PHOTOLYSIS_INI',0,ZHOOK_HANDLE) + +DO IK=1,13 + WAVE_FULL(IK)=1._JPRB/(56250._JPRB-500._JPRB*IK) +ENDDO + +DO IK=14,45 + WAVE_FULL(IK)=1._JPRB/(49750._JPRB-(IK-13)*500._JPRB) +ENDDO + +DO IK=46,68 + WAVE_FULL(IK)=(266._JPRB+(IK-13))*1.E-7_JPRB +ENDDO + +DO IK=69,71 + WAVE_FULL(IK)=(320.5_JPRB+2.*(IK-68))*1.E-7_JPRB +ENDDO +DO IK=72,176 + WAVE_FULL(IK)=(325._JPRB+5._JPRB*(IK-71))*1.E-7_JPRB +ENDDO + +DO IK=2,MAXWAV-1 + DWAVE_FULL(IK)=0.5_JPRB*(WAVE_FULL(IK+1)-WAVE_FULL(IK-1)) +ENDDO +DWAVE_FULL(1) = DWAVE_FULL(2) +DWAVE_FULL(MAXWAV) = DWAVE_FULL(MAXWAV-1) +! select a subset from the full spctral grid to remove the first band +WAVE=WAVE_FULL(14:135) +DWAVE=DWAVE_FULL(14:135) + + +!--------------------------------------------------------------------- +! Rayleigh scattering cross sections +! emp. formula of Nicolet plan. space sci.32, 1467f (1984) +!--------------------------------------------------------------------- + +DO IK=1,MAXWAV + ZWL=WAVE(IK)*1.E4_JPRB + ZX=0.389*ZWL+0.09426_JPRB/ZWL-0.3228_JPRB + CS_RAY(IK)=4.02E-28_JPRB/ZWL**(4._JPRB+ZX) +ENDDO + +!--------------------------------------------------------------------- +! QUANTUM YIELD OF METHYGLYOXAL S. KOCH and G. K. MOORTGAT +! J Phys Chem, 102, 9142-9153, 1998. +! +! JEW: the qy_ch3cocho array has been reduced to 52 bins to represent the pressure. +! dep. spectral bins ONLY !! +!--------------------------------------------------------------------- + +! Calculate co-efficients for METHYGLYOXAL qy outside loop +PHI0 = 1. +RD = 0. + +! for wave < 380nm qy is essentially = 1.0. +DO IK = 1,39 + IF(IK<32) THEN + PHI0(IK) = 1 + ELSEIF(IK>=32) THEN + PHI0(IK) = 8.15E-9_JPRB * EXP(7131._JPRB/WAVE(IK+37_JPIM)*1.E-7_JPRB) + ENDIF + RD(IK) = 7.34E-9_JPRB * EXP(8793._JPRB/WAVE(IK+37_JPIM)*1.E-7_JPRB) +ENDDO + +DO IK = 40,52 + PHI0(IK) = 3.63E-7_JPRB * EXP(5693._JPRB/WAVE(IK+37_JPIM)*1.E-7_JPRB) + RD(IK) = 1.93E4_JPRB*EXP(-5639._JPRB/WAVE(IK+37_JPIM)*1.E-7_JPRB) +ENDDO + +!-------------------------------------------------------------- +! Read and store temperature dependent cross-section values +!-------------------------------------------------------------- +LLFILEOK=.FALSE. +INQUIRE(FILE=TRIM(CL_TM5_PHOTO_LOOKUP),EXIST=LLFILEOK ) +IF(.NOT. LLFILEOK)THEN + WRITE(NULOUT,*) 'ERROR tm5_chem_ini: Cannot read TM5 file '//TRIM(CL_TM5_PHOTO_LOOKUP) + CALL ABOR1('tm5_chem_ini: photo inputfile does not exist.') +ELSE + WRITE(NULOUT,*) 'INFO tm5_chem_ini: Opening TM5 file '//TRIM(CL_TM5_PHOTO_LOOKUP) + OPEN(IUTMP,FORM='FORMATTED',ACTION='READ',STATUS='OLD', & + & FILE=TRIM(CL_TM5_PHOTO_LOOKUP)) + +READ(IUTMP,*) +READ(IUTMP,*) +READ(IUTMP,*) +DO IK=1,NTEMP_MAX + READ(IUTMP,*) (XS_O3_LOOK(IWAV,IK),IWAV=1,MAXWAV) +ENDDO +READ(IUTMP,*) +DO IK=1,NTEMP_MAX + READ(IUTMP,*) (XS_NO2_LOOK(IWAV,IK),IWAV=1,NWAV_NO2) +ENDDO +READ(IUTMP,*) +DO IK=1,NTEMP_MAX + READ(IUTMP,*) (XS_HNO3_LOOK(IWAV,IK),IWAV=1,NWAV_HNO3) +ENDDO +READ(IUTMP,*) +DO IK=1,NTEMP_MAX + READ(IUTMP,*) (XS_H2O2_LOOK(IWAV,IK),IWAV=1,NWAV_H2O2) +ENDDO +READ(IUTMP,*) +DO IK=1,NTEMP_MAX + READ(IUTMP,*) (XS_N2O5_LOOK(IWAV,IK),IWAV=1,NWAV_N2O5) +ENDDO +READ(IUTMP,*) +DO IK=1,NTEMP_MAX + READ(IUTMP,*) (XS_CH2O_LOOK(IWAV,IK),IWAV=1,NWAV_CH2O) +ENDDO +READ(IUTMP,*) +DO IK=1,NTEMP_MAX + READ(IUTMP,*) (XS_PAN_LOOK(IWAV,IK),IWAV=1,NWAV_PAN) +ENDDO +READ(IUTMP,*) +DO IK=1,NTEMP_MAX + READ(IUTMP,*) (XS_NO3_LOOK(IWAV,IK),IWAV=1,NWAV_NO3) +ENDDO +READ(IUTMP,*) +DO IK=1,NTEMP_MAX + READ(IUTMP,*) (QY_O3_LOOK(IWAV,IK),IWAV=1,NWAV_O3) +ENDDO +READ(IUTMP,*) +DO IK=1,NTEMP_MAX + READ(IUTMP,*)(QY_NO2_LOOK(IWAV,IK),IWAV=1,NWAV_NO2) +ENDDO +READ(IUTMP,*) +DO IK=1,NTEMP_MAX + READ(IUTMP,*)(QY_CO_LOOK(IWAV,IK),IWAV=1,NWAV_CO) +ENDDO +READ(IUTMP,*) +DO IK=1,NTEMP_MAX + READ(IUTMP,*)(A1_ACET(IWAV,IK),IWAV=1,NWAV_ACET) +ENDDO +READ(IUTMP,*) +DO IK=1,NTEMP_MAX + READ(IUTMP,*)(A2_ACET(IWAV,IK),IWAV=1,NWAV_ACET) +ENDDO +READ(IUTMP,*) +DO IK=1,NTEMP_MAX + READ(IUTMP,*)(A3_ACET(IWAV,IK),IWAV=1,NWAV_ACET) +ENDDO +READ(IUTMP,*) +DO IK=1,NTEMP_MAX + READ(IUTMP,*)(A4_ACET(IWAV,IK),IWAV=1,NWAV_ACET) +ENDDO +CLOSE(IUTMP) + +ENDIF + +! put constants in correct units + +A1_ACET=A1_ACET*1E-18_JPRB +A2_ACET=A2_ACET*1E-17_JPRB +A4_ACET=A4_ACET*1E-15_JPRB + +!-------------------------------------------------------------- +! Read and store temperature dependent cross-section values +! +!----- extraterrestrial flux from input file ------------------ +LLFILEOK=.FALSE. +INQUIRE(FILE=TRIM(CL_TM5_EXTRATERRESTRIAL),EXIST=LLFILEOK ) +IF(.NOT. LLFILEOK)THEN + WRITE(NULOUT,*) 'ERROR tm5_chem_ini: Cannot read TM5 file '//TRIM(CL_TM5_EXTRATERRESTRIAL) + CALL ABOR1('tm5_chem_ini: extraterrestrial inputfile does not exist.') +ELSE + WRITE(NULOUT,*) 'INFO tm5_chem_ini: Opening TM5 file '//TRIM(CL_TM5_EXTRATERRESTRIAL) + OPEN(IUTMP,FORM='FORMATTED',ACTION='READ',STATUS='OLD', & + & FILE=TRIM(CL_TM5_EXTRATERRESTRIAL)) + READ(IUTMP,*) + READ(IUTMP,*) FLUX + CLOSE(IUTMP) +ENDIF + + +!************************************************************************** +! aerosol data from: "Models for Aerosols of the Lower Atmosphere +! and the Effects of Humidity Variations on their Optical Properties +! E. P. Shettle and R. W. Fenn (1979), Environmental Research Paper +! No. 676 +!************************************************************************** +LLFILEOK=.FALSE. +INQUIRE(FILE=TRIM(CL_TM5_AEROSOL),EXIST=LLFILEOK ) +IF(.NOT. LLFILEOK)THEN + WRITE(NULOUT,*) 'ERROR tm5_chem_ini: Cannot read TM5 file '//TRIM(CL_TM5_AEROSOL) + CALL ABOR1('tm5_chem_ini: aerosol inputfile does not exist.') +ELSE + WRITE(NULOUT,*) 'INFO tm5_chem_ini: Opening TM5 file '//TRIM(CL_TM5_AEROSOL) + OPEN(IUTMP,FORM='FORMATTED',ACTION='READ',STATUS='OLD', & + & FILE=TRIM(CL_TM5_AEROSOL)) + DO JL = 1,4 + READ(IUTMP,*) + DO IK = 1,8 + READ(IUTMP,*) + READ(IUTMP,'(6(1X,F7.5))')(EXT(IWAV,IK,JL),IWAV=1,MAXWAV) + READ(IUTMP,'(6(1X,F7.5))')(ABS_EFF(IWAV,IK,JL),IWAV=1,MAXWAV) + READ(IUTMP,'(6(1X,F7.5))')(GFAC(IWAV,IK,JL),IWAV=1,MAXWAV) + DO IWAV=1,MAXWAV + SCA(IWAV,IK,JL) = EXT(IWAV,IK,JL) - ABS_EFF(IWAV,IK,JL) + ENDDO + ENDDO + ENDDO + CLOSE(IUTMP) + + DO IWAV=1,MAXWAV + DO IK=1,8 + DO JL=1,4 + SCA(IWAV,IK,JL) = SCA(IWAV,IK,JL)/PN_REF(JL)*1.E-5_JPRB + ABS_EFF(IWAV,IK,JL) = ABS_EFF(IWAV,IK,JL)/PN_REF(JL)*1.E-5_JPRB + ENDDO + ENDDO + ENDDO + +ENDIF + +!VH - file format(6(1X,F7.5)) + +WRITE(NULOUT,*) 'INFO tm5_chem_ini: Finished reading TM5 photolysis input files ' + + +IF (LHOOK) CALL DR_HOOK('TM5_CHEM_INI:PHOTOLYSIS_INI',1,ZHOOK_HANDLE) +END SUBROUTINE PHOTOLYSIS_INI + + END MODULE TM5_PHOTOLYSIS diff --git a/ifs-source/arpifs/phys_ec/aer_negat.F90 b/ifs-source/arpifs/phys_ec/aer_negat.F90 index 08dab845..09fbd263 100644 --- a/ifs-source/arpifs/phys_ec/aer_negat.F90 +++ b/ifs-source/arpifs/phys_ec/aer_negat.F90 @@ -48,7 +48,7 @@ SUBROUTINE AER_NEGAT & ! ------------------------------------------------------------------ USE PARKIND1 ,ONLY : JPIM ,JPRB -USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK, JPHOOK USE YOMCST , ONLY : RG USE YOEAERATM, ONLY :TEAERATM! YREAERATM @@ -78,7 +78,7 @@ SUBROUTINE AER_NEGAT & INTEGER(KIND=JPIM) :: JK, JL REAL(KIND=JPRB) :: ZCONS1, ZDAER, ZGDPH, ZTMST -REAL(KIND=JPRB) :: ZHOOK_HANDLE +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE !------------------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('AER_NEGAT',0,ZHOOK_HANDLE) diff --git a/ifs-source/arpifs/phys_ec/hamm7_init.F90 b/ifs-source/arpifs/phys_ec/hamm7_init.F90 index 497d31de..441a11cf 100644 --- a/ifs-source/arpifs/phys_ec/hamm7_init.F90 +++ b/ifs-source/arpifs/phys_ec/hamm7_init.F90 @@ -37,7 +37,7 @@ SUBROUTINE hamm7_init(YGFL, YRRIP) !!!!TEMPORARY USE YOMHOOK , ONLY : & - LHOOK, DR_HOOK + LHOOK, DR_HOOK, JPHOOK !USE YOM_YGFL , ONLY : & ! YGFL @@ -117,7 +117,7 @@ SUBROUTINE hamm7_init(YGFL, YRRIP) j_class, j_mass, j_spec, j_gas, j_cloud, & ! HAM kt, znclass, znaerocomp, zsubm_ngasspec, zcloudind ! eehol: indices for OIFS to HAM -REAL(KIND=JPRB) :: & +REAL(KIND=JPHOOK) :: & ZHOOK_HANDLE ! return status CHARACTER(len=64) :: int_str, int_str_ham !eehol: integer as string diff --git a/ifs-source/arpifs/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/phys_ec/hamm7_interface.F90 index 2975b8e9..d8ab1558 100755 --- a/ifs-source/arpifs/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/phys_ec/hamm7_interface.F90 @@ -126,7 +126,7 @@ SUBROUTINE HAMM7_INTERFACE & !----------------------------------------------------------------------- USE PARKIND1 , ONLY : JPIM, JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK +USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK !USE YOEAERSRC, ONLY : YREAERSRC !USE YOEAERATM, ONLY : YREAERATM !USE YOEAERLID, ONLY : YREAERLID @@ -321,7 +321,7 @@ SUBROUTINE HAMM7_INTERFACE & REAL(KIND=JPRB),PARAMETER :: INFINITY=HUGE(1._JPRB) -REAL(KIND=JPRB) :: ZHOOK_HANDLE +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE INTEGER(kind=JPIM) :: jj ! loop index diff --git a/ifs-source/arpifs/phys_ec/m7_simple_sulfur_drydep.F90 b/ifs-source/arpifs/phys_ec/m7_simple_sulfur_drydep.F90 index 318b1530..c05221b2 100644 --- a/ifs-source/arpifs/phys_ec/m7_simple_sulfur_drydep.F90 +++ b/ifs-source/arpifs/phys_ec/m7_simple_sulfur_drydep.F90 @@ -59,7 +59,7 @@ SUBROUTINE m7_simple_sulfur_DRYDEP & !----------------------------------------------------------------------- USE TYPE_MODEL , ONLY : MODEL USE PARKIND1 ,ONLY : JPIM ,JPRB -USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK, JPHOOK !USE YOEAERATM, ONLY : YREAERATM !USE YOEAERSNK, ONLY : YREAERSNK @@ -158,7 +158,7 @@ SUBROUTINE m7_simple_sulfur_DRYDEP & LOGICAL :: LLPRINT -REAL(KIND=JPRB) :: ZHOOK_HANDLE +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE !#include "aer_drydepvel.intfb.h"! !#include "satur.intfb.h"! diff --git a/ifs-source/arpifs/phys_ec/tm5m7_drydep.F90 b/ifs-source/arpifs/phys_ec/tm5m7_drydep.F90 index c9e608bf..84735237 100644 --- a/ifs-source/arpifs/phys_ec/tm5m7_drydep.F90 +++ b/ifs-source/arpifs/phys_ec/tm5m7_drydep.F90 @@ -85,7 +85,7 @@ SUBROUTINE TM5M7_DRYDEP & !----------------------------------------------------------------------- USE PARKIND1 ,ONLY : JPIM ,JPRB -USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK, JPHOOK USE YOMLUN, ONLY : NULERR USE YOEAERSRC ,ONLY : YREAERSRC @@ -194,7 +194,7 @@ SUBROUTINE TM5M7_DRYDEP & TYPE(MODAL_DATA), DIMENSION(NMOD), TARGET :: vm_deposition -REAL(KIND=JPRB) :: ZHOOK_HANDLE +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE !----------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('TM5M7_DRYDEP',0,ZHOOK_HANDLE) diff --git a/ifs-source/arpifs/phys_ec/tm5m7_get_refr_idx.F90 b/ifs-source/arpifs/phys_ec/tm5m7_get_refr_idx.F90 index 4ea5f82c..a39ca7b8 100644 --- a/ifs-source/arpifs/phys_ec/tm5m7_get_refr_idx.F90 +++ b/ifs-source/arpifs/phys_ec/tm5m7_get_refr_idx.F90 @@ -37,7 +37,7 @@ SUBROUTINE TM5M7_GET_REFR_IDX(wdep, SO4, BC, OC, SOA, SS, DU, water, mode, m_eff !----------------------------------------------------------------------- USE PARKIND1 ,ONLY : JPIM ,JPRB -USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK, JPHOOK USE YOMLUN ,ONLY : NULERR USE YOMCST, ONLY : RPI @@ -80,7 +80,7 @@ SUBROUTINE TM5M7_GET_REFR_IDX(wdep, SO4, BC, OC, SOA, SS, DU, water, mode, m_eff REAL(KIND=JPRB),PARAMETER :: ROL = 1000. ! kg/m^3 -REAL(KIND=JPRB) :: ZHOOK_HANDLE +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE !----------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('TM5M7_GET_REFR_IDX',0,ZHOOK_HANDLE) diff --git a/ifs-source/arpifs/phys_ec/tm5m7_init.F90 b/ifs-source/arpifs/phys_ec/tm5m7_init.F90 index 66ef8e8a..6afbcce0 100755 --- a/ifs-source/arpifs/phys_ec/tm5m7_init.F90 +++ b/ifs-source/arpifs/phys_ec/tm5m7_init.F90 @@ -28,12 +28,12 @@ SUBROUTINE TM5M7_INIT(YDGEOMETRY, YRCOMPO, YGFL, YDERAD) USE GEOMETRY_MOD , ONLY : GEOMETRY USE PARKIND1 , ONLY : JPRB, JPIM -USE YOMHOOK , ONLY : LHOOK, DR_HOOK +USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK USE YOMLUN , ONLY : NULOUT !USE YOMCOMPO , ONLY : YRCOMPO USE YOMCOMPO , ONLY : TCOMPO USE YOM_YGFL , ONLY : TYPE_GFLD!YGFL -USE TM5_PHOTOLYSIS, ONLY : NBANDS_TROP,LMID,LMID_GRIDA,WAVE,WAV_GRID,WAV_GRIDA,LL_TM5_PHOTO_INI +USE TM5_PHOTOLYSIS, ONLY : PHOTOLYSIS_INI, NBANDS_TROP,LMID,LMID_GRIDA,WAVE,WAV_GRID,WAV_GRIDA,LL_TM5_PHOTO_INI USE TM5M7_DATA, ONLY : & & ISO4 , INH4 , INO3_A , IACS_N , ISO4ACS , IBCACS , IPOMACS , ISSACS , IDUACS , & & ISOANUS , ISOAAIS , ISOAACS , ISOACOS , ISOAAII , IH2OPART ,IAII_N , IBCAII , & @@ -63,7 +63,7 @@ SUBROUTINE TM5M7_INIT(YDGEOMETRY, YRCOMPO, YGFL, YDERAD) LOGICAL :: LLFOUND REAL(KIND=JPRB),DIMENSION(:),ALLOCATABLE :: PHOTO_WAVELENGTHS -REAL(KIND=JPRB) :: ZHOOK_HANDLE +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE !----------------------------------------------------------------------- diff --git a/ifs-source/arpifs/phys_ec/tm5m7_optics_aop_get.F90 b/ifs-source/arpifs/phys_ec/tm5m7_optics_aop_get.F90 index 967b2933..ef7dbe15 100644 --- a/ifs-source/arpifs/phys_ec/tm5m7_optics_aop_get.F90 +++ b/ifs-source/arpifs/phys_ec/tm5m7_optics_aop_get.F90 @@ -32,7 +32,7 @@ SUBROUTINE TM5M7_OPTICS_AOP_GET(YGFL, YREAERSRC, KIDIA,KFDIA,KLON, KLEV, NACTAER !----------------------------------------------------------------------- USE PARKIND1 ,ONLY : JPIM ,JPRB -USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK, JPHOOK USE YOMLUN ,ONLY : NULOUT USE YOEAERSRC, ONLY : TEAERSRC !YREAERSRC !USE YOMCST, ONLY : @@ -81,7 +81,7 @@ SUBROUTINE TM5M7_OPTICS_AOP_GET(YGFL, YREAERSRC, KIDIA,KFDIA,KLON, KLEV, NACTAER TYPE(AOPI), dimension(:,:), allocatable :: aop_in INTEGER(KIND=JPRB) :: IMODE -REAL(KIND=JPRB) :: ZHOOK_HANDLE +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE INTEGER(kind=JPIM)::NCHEM !----------------------------------------------------------------------- diff --git a/ifs-source/arpifs/phys_ec/tm5m7_optics_calculate_aop.F90 b/ifs-source/arpifs/phys_ec/tm5m7_optics_calculate_aop.F90 index 1a92013e..226ebc37 100644 --- a/ifs-source/arpifs/phys_ec/tm5m7_optics_calculate_aop.F90 +++ b/ifs-source/arpifs/phys_ec/tm5m7_optics_calculate_aop.F90 @@ -39,7 +39,7 @@ SUBROUTINE TM5M7_OPTICS_CALCULATE_AOP(KIDIA,KFDIA,KLON,KLEV, nwl,NCONTR, wdep, e !----------------------------------------------------------------------- USE PARKIND1 ,ONLY : JPIM ,JPRB -USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK, JPHOOK USE YOMLUN ,ONLY : NULOUT,NULERR USE YOMCST, ONLY : RPI @@ -83,7 +83,7 @@ SUBROUTINE TM5M7_OPTICS_CALCULATE_AOP(KIDIA,KFDIA,KLON,KLEV, nwl,NCONTR, wdep, e REAL(KIND=JPRB), DIMENSION(:,:,:), Pointer :: cext_table, a_table, g_table REAL(KIND=JPRB) :: TWOPI -REAL(KIND=JPRB) :: ZHOOK_HANDLE +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE !----------------------------------------------------------------------- #include "tm5m7_get_refr_idx.intfb.h" diff --git a/ifs-source/arpifs/phys_ec/tm5m7_optics_init.F90 b/ifs-source/arpifs/phys_ec/tm5m7_optics_init.F90 index 0dbe5ba4..0bf4b157 100644 --- a/ifs-source/arpifs/phys_ec/tm5m7_optics_init.F90 +++ b/ifs-source/arpifs/phys_ec/tm5m7_optics_init.F90 @@ -72,7 +72,7 @@ SUBROUTINE TM5M7_OPTICS_INIT(NWAV,WDEP) !----------------------------------------------------------------------- USE PARKIND1 ,ONLY : JPIM ,JPRB -USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK, JPHOOK USE YOMLUN ,ONLY : NULOUT USE YOMCST, ONLY : @@ -106,7 +106,7 @@ SUBROUTINE TM5M7_OPTICS_INIT(NWAV,WDEP) INTEGER(KIND=JPIM) :: JL -REAL(KIND=JPRB) :: ZHOOK_HANDLE +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE !----------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('TM5M7_OPTICS_INIT',0,ZHOOK_HANDLE) @@ -171,7 +171,7 @@ SUBROUTINE LOAD_TM5M7_OPTICS_DATA_3D(CD_FILE_NAME, CD_VAR_NAME, ILEN,JLEN,KLEN,P USE YOMTAG , ONLY : MTAGRAD USE EASY_NETCDF,ONLY : NETCDF_FILE USE YOMLUN , ONLY : NULERR - USE YOMHOOK , ONLY : LHOOK, DR_HOOK + USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK IMPLICIT NONE @@ -191,7 +191,7 @@ SUBROUTINE LOAD_TM5M7_OPTICS_DATA_3D(CD_FILE_NAME, CD_VAR_NAME, ILEN,JLEN,KLEN,P ! The NetCDF file containing the input climatology TYPE(NETCDF_FILE) :: FILE - REAL(KIND=JPRB) :: ZHOOK_HANDLE + REAL(KIND=JPHOOK) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('TM5M7_OPTICS_INIT:LOAD_TM5M7_OPTICS_DATA_3D',0,ZHOOK_HANDLE) @@ -233,7 +233,7 @@ SUBROUTINE LOAD_TM5M7_OPTICS_DATA_2D(CD_FILE_NAME, CD_VAR_NAME, ILEN,JLEN,PVAR) USE YOMTAG , ONLY : MTAGRAD USE EASY_NETCDF,ONLY : NETCDF_FILE USE YOMLUN , ONLY : NULERR - USE YOMHOOK , ONLY : LHOOK, DR_HOOK + USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK IMPLICIT NONE @@ -253,7 +253,7 @@ SUBROUTINE LOAD_TM5M7_OPTICS_DATA_2D(CD_FILE_NAME, CD_VAR_NAME, ILEN,JLEN,PVAR) ! The NetCDF file containing the input climatology TYPE(NETCDF_FILE) :: FILE - REAL(KIND=JPRB) :: ZHOOK_HANDLE + REAL(KIND=JPHOOK) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('TM5M7_OPTICS_INIT:LOAD_TM5M7_OPTICS_DATA_2D',0,ZHOOK_HANDLE) @@ -294,7 +294,7 @@ SUBROUTINE LOAD_TM5M7_OPTICS_DATA_1D(CD_FILE_NAME, CD_VAR_NAME, KLEN,PVAR) USE YOMTAG , ONLY : MTAGRAD USE EASY_NETCDF,ONLY : NETCDF_FILE USE YOMLUN , ONLY : NULERR - USE YOMHOOK , ONLY : LHOOK, DR_HOOK + USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK IMPLICIT NONE @@ -313,7 +313,7 @@ SUBROUTINE LOAD_TM5M7_OPTICS_DATA_1D(CD_FILE_NAME, CD_VAR_NAME, KLEN,PVAR) ! The NetCDF file containing the input climatology TYPE(NETCDF_FILE) :: FILE - REAL(KIND=JPRB) :: ZHOOK_HANDLE + REAL(KIND=JPHOOK) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('TM5M7_OPTICS_INIT:LOAD_TM5M7_OPTICS_DATA_1D',0,ZHOOK_HANDLE) @@ -366,7 +366,7 @@ SUBROUTINE TM5M7_OPTICS_WAVELEN_INIT( wdep,NWL ) USE PARKIND1, ONLY : JPIM,JPRB USE TM5M7_OPTICS_DATA, ONLY : WAVELENDEP, OPAC,ECHAMHAM,SEGELSTEIN, & & opacdim, echamhamdim, segelsteindim - USE YOMHOOK , ONLY : LHOOK, DR_HOOK + USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK IMPLICIT NONE ! @@ -385,7 +385,7 @@ SUBROUTINE TM5M7_OPTICS_WAVELEN_INIT( wdep,NWL ) REAL(KIND=JPRB) :: wl, h REAL(KIND=JPRB) :: nscale, kscale - REAL(KIND=JPRB) :: ZHOOK_HANDLE + REAL(KIND=JPHOOK) :: ZHOOK_HANDLE !----------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('TM5M7_OPTICS_WAVELEN_INIT',0,ZHOOK_HANDLE) diff --git a/ifs-source/arpifs/phys_ec/tm5m7_phy2.F90 b/ifs-source/arpifs/phys_ec/tm5m7_phy2.F90 index 02d10402..996e9054 100644 --- a/ifs-source/arpifs/phys_ec/tm5m7_phy2.F90 +++ b/ifs-source/arpifs/phys_ec/tm5m7_phy2.F90 @@ -106,7 +106,7 @@ SUBROUTINE TM5M7_PHY2 & USE TYPE_MODEL , ONLY : MODEL USE PARKIND1 , ONLY : JPIM, JPRB USE TM5M7_DATA, ONLY : MODAL_DATA,NMOD, NRDEP -USE YOMHOOK , ONLY : LHOOK, DR_HOOK +USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK !USE YOEAERSRC, ONLY : YREAERSRC !USE YOEAERATM, ONLY : YREAERATM !USE YOM_YGFL , ONLY : YGFL @@ -195,7 +195,7 @@ SUBROUTINE TM5M7_PHY2 & TYPE(MODAL_DATA),DIMENSION(NMOD), TARGET :: RW_MODE TYPE(MODAL_DATA),DIMENSION(NMOD), TARGET :: DENS_MODE -REAL(KIND=JPRB) :: ZHOOK_HANDLE +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE REAL(KIND=JPRB) :: ZEMIDIAG(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO) diff --git a/ifs-source/arpifs/phys_ec/tm5m7_sediment.F90 b/ifs-source/arpifs/phys_ec/tm5m7_sediment.F90 index e7d7566d..ecae19e7 100644 --- a/ifs-source/arpifs/phys_ec/tm5m7_sediment.F90 +++ b/ifs-source/arpifs/phys_ec/tm5m7_sediment.F90 @@ -79,7 +79,7 @@ SUBROUTINE TM5M7_SEDIMENT & !----------------------------------------------------------------------- USE PARKIND1 ,ONLY : JPIM ,JPRB -USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK, JPHOOK USE YOEAERSRC ,ONLY : YREAERSRC USE YOEAERSNK ,ONLY : YREAERSNK @@ -136,7 +136,7 @@ SUBROUTINE TM5M7_SEDIMENT & TYPE(MODAL_DATA), DIMENSION(NMOD), TARGET :: VM_SEDIMENTATION -REAL(KIND=JPRB) :: ZHOOK_HANDLE +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE !----------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('TM5M7_SEDIMENT',0,ZHOOK_HANDLE) diff --git a/ifs-source/arpifs/phys_ec/tm5m7_src.F90 b/ifs-source/arpifs/phys_ec/tm5m7_src.F90 index 30f58e56..780a069b 100644 --- a/ifs-source/arpifs/phys_ec/tm5m7_src.F90 +++ b/ifs-source/arpifs/phys_ec/tm5m7_src.F90 @@ -31,7 +31,7 @@ SUBROUTINE TM5M7_SRC & USE GEOMETRY_MOD , ONLY : GEOMETRY USE TYPE_MODEL , ONLY : MODEL USE PARKIND1 ,ONLY : JPIM, JPRB, JPRD -USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK, JPHOOK USE YOMLUN ,ONLY : NULOUT, NULERR !USE YOM_YGFL ,ONLY : YGFL USE YOMCST ,ONLY : RA, RPI, RDAY, RG @@ -181,7 +181,7 @@ SUBROUTINE TM5M7_SRC & INTRINSIC ERF #endif -REAL(KIND=JPRB) :: ZHOOK_HANDLE +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE !----------------------------------------------------------------------- diff --git a/ifs-source/arpifs/phys_ec/tm5m7_src_dust.F90 b/ifs-source/arpifs/phys_ec/tm5m7_src_dust.F90 index c959fd0d..b87ec1b0 100644 --- a/ifs-source/arpifs/phys_ec/tm5m7_src_dust.F90 +++ b/ifs-source/arpifs/phys_ec/tm5m7_src_dust.F90 @@ -54,7 +54,7 @@ SUBROUTINE TM5M7_SRC_DUST & USE TYPE_MODEL,ONLY : MODEL USE YOMLUN, ONLY : NULOUT USE PARKIND1 ,ONLY : JPIM ,JPRB -USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK, JPHOOK USE YOMCST, ONLY : RPI USE TM5M7_DATA, ONLY: NMOD, MODE_ACI, MODE_COI, sigma, sigma_lognormal, ddust,iacci,icoai @@ -164,7 +164,7 @@ SUBROUTINE TM5M7_SRC_DUST & REAL(KIND=JPRB), POINTER :: RDDUSRC(:)!!! dimensions changed from (0:50,9) to (9) INTEGER(KIND=JPIM)::KBINDD -REAL(KIND=JPRB) :: ZHOOK_HANDLE +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE !----------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('TM5M7_SRC_DUST',0,ZHOOK_HANDLE) diff --git a/ifs-source/arpifs/phys_ec/tm5m7_src_dust_init.F90 b/ifs-source/arpifs/phys_ec/tm5m7_src_dust_init.F90 index 8cbfaad7..8d61717c 100644 --- a/ifs-source/arpifs/phys_ec/tm5m7_src_dust_init.F90 +++ b/ifs-source/arpifs/phys_ec/tm5m7_src_dust_init.F90 @@ -44,7 +44,7 @@ SUBROUTINE TM5M7_SRC_DUST_INIT !----------------------------------------------------------------------- USE PARKIND1 ,ONLY : JPIM ,JPRB -USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK, JPHOOK USE YOMCST, ONLY : RPI, RG USE TM5M7_DATA, ONLY : DDUST @@ -70,7 +70,7 @@ SUBROUTINE TM5M7_SRC_DUST_INIT REAL, DIMENSION(:), ALLOCATABLE :: su_class, su_classv, utest -REAL(KIND=JPRB) :: ZHOOK_HANDLE +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE !----------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('TM5M7_SRC_DUST_INIT',0,ZHOOK_HANDLE) diff --git a/ifs-source/arpifs/phys_ec/tm5m7_src_ss.F90 b/ifs-source/arpifs/phys_ec/tm5m7_src_ss.F90 index 18d9ec41..cb3ff0a9 100644 --- a/ifs-source/arpifs/phys_ec/tm5m7_src_ss.F90 +++ b/ifs-source/arpifs/phys_ec/tm5m7_src_ss.F90 @@ -47,7 +47,7 @@ SUBROUTINE TM5M7_SRC_SS & !----------------------------------------------------------------------- USE PARKIND1 ,ONLY : JPIM ,JPRB -USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK, JPHOOK USE YOEAERSRC ,ONLY : TEAERSRC!YREAERSRC !USE YOEAERSNK, ONLY : YREAERSNK @@ -84,7 +84,7 @@ SUBROUTINE TM5M7_SRC_SS & REAL(KIND=JPRB) :: NUMBER(KLON), MASS(KLON) -REAL(KIND=JPRB) :: ZHOOK_HANDLE +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE !----------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('TM5M7_SRC_SS',0,ZHOOK_HANDLE) diff --git a/ifs-source/radiation/module/radiation_aerosol_optics.F90 b/ifs-source/radiation/module/radiation_aerosol_optics.F90 index c658bc51..5436d826 100644 --- a/ifs-source/radiation/module/radiation_aerosol_optics.F90 +++ b/ifs-source/radiation/module/radiation_aerosol_optics.F90 @@ -526,7 +526,7 @@ subroutine add_aerosol_aod_ssa_asym(ncol,nlev,istartcol,iendcol, config,aerosol_ & od_lw, ssa_lw, g_lw, od_sw, ssa_sw, g_sw) use parkind1, only : jprb use radiation_io, only : nulout, nulerr, radiation_abort - use yomhook, only : lhook, dr_hook + use yomhook, only : lhook, dr_hook, jphook use radiation_config, only : config_type use radiation_aerosol, only : aerosol_type integer, intent(in) :: ncol ! number of columns @@ -544,7 +544,7 @@ subroutine add_aerosol_aod_ssa_asym(ncol,nlev,istartcol,iendcol, config,aerosol_ & intent(inout) :: g_sw ! Loop indices for column, level, g point, band and aerosol type integer :: jcol, jlev, jg, jtype, iband - real(jprb) :: hook_handle, temp_remove + real(jphook) :: hook_handle, temp_remove ! Range of levels over which aerosols are present integer :: istartlev, iendlev diff --git a/ifs-source/radiation/module/radiation_interface.F90 b/ifs-source/radiation/module/radiation_interface.F90 index 45475f6e..08bbe519 100644 --- a/ifs-source/radiation/module/radiation_interface.F90 +++ b/ifs-source/radiation/module/radiation_interface.F90 @@ -233,7 +233,7 @@ subroutine radiation(ncol, nlev, istartcol, iendcol, config, & #endif use radiation_ifs_rrtm, only : gas_optics use radiation_cloud_optics, only : cloud_optics - use radiation_aerosol_optics, only : add_aerosol_optics + use radiation_aerosol_optics, only : add_aerosol_optics, add_aerosol_aod_ssa_asym ! Inputs integer, intent(in) :: ncol ! number of columns From 0a667a812dc2d300d5334cf35a712064e62d1981 Mon Sep 17 00:00:00 2001 From: Lianghai Wu Date: Thu, 21 Dec 2023 10:59:04 +0000 Subject: [PATCH 005/129] include m7 files --- build/atlas/src/atlas/atlas_f.fypp | 1 - ifs-source/arpifs/module/m7_data.F90 | 203 +++++++++++ ifs-source/arpifs/module/yomm7ctl.F90 | 47 +++ .../arpifs/phys_ec/simple_sulfur_src.F90 | 331 ++++++++++++++++++ 4 files changed, 581 insertions(+), 1 deletion(-) delete mode 120000 build/atlas/src/atlas/atlas_f.fypp create mode 100755 ifs-source/arpifs/module/m7_data.F90 create mode 100644 ifs-source/arpifs/module/yomm7ctl.F90 create mode 100644 ifs-source/arpifs/phys_ec/simple_sulfur_src.F90 diff --git a/build/atlas/src/atlas/atlas_f.fypp b/build/atlas/src/atlas/atlas_f.fypp deleted file mode 120000 index 517689f9..00000000 --- a/build/atlas/src/atlas/atlas_f.fypp +++ /dev/null @@ -1 +0,0 @@ -/etc/ecmwf/nfs/dh1_perm_b/nklw/FOCI/openifs-48r1.1/source/atlas/src/atlas_f/atlas_f.fypp \ No newline at end of file diff --git a/ifs-source/arpifs/module/m7_data.F90 b/ifs-source/arpifs/module/m7_data.F90 new file mode 100755 index 00000000..c21f83ae --- /dev/null +++ b/ifs-source/arpifs/module/m7_data.F90 @@ -0,0 +1,203 @@ +MODULE M7_DATA + +USE PARKIND1, ONLY : JPIM , JPRB + + ! *M7_DATA* contains phyiscal switches and parameters + ! for the ECHAM/HAM aerosol model. + ! + ! Author: + ! ------- + ! Philip Stier, MPI-MET 12/2002 + ! + +USE TM5M7_DATA, ONLY: nmod + +IMPLICIT NONE + + !--- 0) Submodel ID: + + INTEGER(KIND=JPIM) :: id_ham + + !--- 1) Switches: + + !--- 1.1) Physical: + + !--- Define control variables and pre-set with default values: + + LOGICAL :: lm7 = .TRUE. ! Aerosol dynamics and thermodynamics scheme M7 + + + INTEGER(KIND=JPIM) :: ncdnc = 0, & ! CDNC activation scheme: + ! + ! ncdnc = 0 OFF => standard ECHAM5 + ! + ! = 1 Lohmann et al. (1999) + Lin and Leaitch (1997) + ! = 2 Lohmann et al. (1999) + Abdul-Razzak and Ghan (2000) + ! = 3 Lohmann et al. (1999) + ( Nenes et al. (2003) ) + ! + nicnc = 0, & ! ICNC scheme: + ! + ! ncdnc = 0 OFF + ! = 1 Kaercher and Lohmann (2002) + ! + nauto = 1, & ! Autoconversion scheme: + ! + ! nauto = 1 Beheng (1994) - ECHAM5 Standard + ! = 2 Khairoutdinov and Kogan (2000) + ! + ndust = 2, & ! Dust emission scheme: + ! + ! ndust = 1 Balkanski et al. (2002) + ! = 2 Tegen et al. (2002) + ! + nseasalt = 2, & ! Sea Salt emission scheme: + ! + ! nseasalt = 1 Monahan (1986) + ! = 2 Schulz et al. (2002) + ! + npist = 3, & ! DMS emission scheme: + ! + ! npist = 1 Liss & Merlivat (1986) + ! = 2 Wanninkhof (1992) + ! = 3 Nightingale (2000) + ! + nemiss = 1, & ! Emission inventory + ! + ! nemiss =1 old version + ! nemiss =2 AEROCOM emissions 2000 + ! + nsoa = 2 ! SOA formation scheme: + ! + ! nsoa = 0 POM mass emission into both Aitken modes (standard TM5) + ! 1 POM mass emission + distribution according to volatility assumptions to 5 modes + ! 2 atmospheric formation from precursors + distribution according to volatility assumptions to 5 modes + + LOGICAL :: lodiag = .FALSE. ! Extended diagnostics + + LOGICAL :: laero_rad = .FALSE. ! Radiation calculation + + LOGICAL :: lorad(nmod) = .FALSE. ! switch for each mode + + LOGICAL :: lodiagrad = .FALSE. ! Extended radiation diagnostics + + INTEGER(KIND=JPIM) :: nwv = 0 ! nwv: number of additional wavelengths + ! for the radiation calculations + ! (max currently set to 10) + + REAL(KIND=JPRB) :: cwv(10) = 0. ! cwv: array of additional wavelengths + ! for the radiation calculations [m] + + LOGICAL :: lomassfix = .TRUE. ! Mass fixer in convective scheme + + !--- 1.2) Technical: + +!!$ INTEGER(KIND=JPIM) :: NFILETYPE = GRIB ! Output stream filetypes + + + !--- 2) Parameters: + + !-- 2.1) Number of aerosol compounds: (needs to be harmonized with nmode in mo_aero_m7) + + INTEGER(KIND=JPIM), PARAMETER :: ntype=6 + + !--- 2.2) Mode names: + + CHARACTER(LEN=2), PARAMETER :: cmode(nmod)=(/'NS','KS','AS','CS','KI','AI','CI'/) + + !--- 2.3) Compound names: + + CHARACTER(LEN=3), PARAMETER :: ctype(ntype)=(/'SO4','BC ','OC ','SS ','DU ','WAT'/) + + !--- 2.4) Index field of tracer indices for the aerosol numbers in each mode: + + INTEGER(KIND=JPIM) :: nindex(nmod) + + !--- 2.5) Emissions: + + !--- Carbon Emissions + + +! REAL(KIND=JPRB), PARAMETER :: zbb_wsoc_perc = 0.65, & ! Biom. Burn. Percentage of Water Soluble OC (WSOC) [1] + ! (M.O. Andreae; Talk: Smoke and Climate) + + REAL(KIND=JPRB), PARAMETER :: zbb_wsoc_perc = 0.95, & ! TB: + ! To reduce the AOD over china and outflow region of + ! Africa the water soluble fraction was increasde to 95% + ! in preparation for CMIP6. + ! + ! Some basis for the choice can be found here: + ! e (e.g. Janhall et al., 2010; + ! https://doi.org/10.5194/acp-10-1427-2010 ; Winijkul et al., 2015; + ! https://doi.org/10.1016/j.atmosenv.2015.02.037; Li et al., 2009; + ! https://pubs.acs.org/doi/abs/10.1021/es803330j). + + + zbge_wsoc_perc = 0.65, & ! Assume same Percentage of WSOC for biogenic OC + !>>> TvN + ! The value of 1.4 for the POM to OC mass ratio is an outdated estimate. + ! In the current code we can apply different ratios + ! for emissions from different sources. + ! For further details, see comment in emission_data.F90. + ! The use of a single constant value, on the other hand, + ! would have the advantage that the simulated POM concentrations + ! can easily be converted to OC. + ! An average value of 1.8 seems reasonable. + ! Assuming that there are no substantial contributions from + ! elements other than H and O, a value of 1.8 can be obtained + ! with an H:C atomic ratio of 1.6 and and O:C ratio of 0.5, + ! which are well within the range of oxidation states + ! presented by Heald et al. (GRL, 2010). + ! According to the model of Kuwata et al. (Environ. Sci. Technol., 2012), + ! the resulting particle density would be close to the value + ! assumed in the model (doc = 1.3 g/cm3 in mo_aero_m7.F90). + !zom2oc = 1.4, & ! Mass ratio organic species to organic carbon + ! (Seinfeld and Pandis, 1998, p709; + ! Ferek et al., JGR, 1998) + ! + ! The emission radii for carbonaceous aerosols of the original code below + ! correspond to the values recommended by AeroCom (Dentener et al., ACP, 2006), + ! but adapted to sigma = 1.59 as used in M7 (Stier et al., ACP, 2005). + cmr_ff = 0.03E-6, & ! Fossil fuel emissions: + ! assumed number median radius of the emitted + ! particles with the standard deviation given + ! in mo_aero_m7 [m]. Has to lie within the + ! Aitken mode for the current setup! + cmr_bb = 0.075E-6, & ! Biomass burning emissions: + ! Assumed number median radius of the emitted + ! particles with the standard deviation given + ! in mo_aero_m7 [m]. Has to lie within the + ! Accumulation mode for the current setup! + cmr_bg = 0.03E-6, &! Biogenic secondary particle formation: + ! Assumed number median radius of the emitted + ! particles with the standard deviation given + ! in mo_aero_m7 [m]. Has to lie within the + ! Aitken mode for the current setup! + cmr_sk = 0.03E-6, &! SO4 primary emission ---> aitken mode + ! Assumed number median radius of the emitted + ! particles with the standard deviation given + ! in mo_aero_m7 [m]. Has to lie within the + ! Aitken mode for the current setup! + cmr_sa = 0.075E-6, &! SO4 primary emission ---> accumulation mode + ! Assumed number median radius of the emitted + ! particles with the standard deviation given + ! in mo_aero_m7 [m]. Has to lie within the + ! Accumulation mode for the current setup! + cmr_sc = 0.75E-6, &! SO4 primary emission ---> coarse mode + ! Assumed number median radius of the emitted + ! particles with the standard deviation given + ! in mo_aero_m7 [m]. Has to lie within the + ! Coarse mode for the current setup! + facso2 = 0.975, &! factor to scale primary SO4 emissions + ! AEROCOM assumption 2.5 % of the SO2 emissions + ! in the from of SO4 + so2ts = 1./1.998 ! conversion factor SO2 to S + + REAL(KIND=JPRB), PUBLIC :: zm2n_bcki_ff, zm2n_bcki_bb, & + zm2n_bcks_bb, zm2n_ocki_ff, & + zm2n_ocki_bb, zm2n_ocki_bg, & + zm2n_ocks_bb, zm2n_ocks_bg, & + zm2n_s4ks_sk, zm2n_s4as_sa, & + zm2n_s4cs_sc + + +END MODULE M7_DATA diff --git a/ifs-source/arpifs/module/yomm7ctl.F90 b/ifs-source/arpifs/module/yomm7ctl.F90 new file mode 100644 index 00000000..f416e020 --- /dev/null +++ b/ifs-source/arpifs/module/yomm7ctl.F90 @@ -0,0 +1,47 @@ +!**** YOMM7CTL +! +! PURPOSE. +! -------- +! MODULE CONTAINING VARIABLES FOR HAM-M7's M7CTL +! +! PARAMETER DESCRIPTION +! --------- ----------- ! +! +! REFERENCE. +! ---------- +! +! AUTHOR. +! ------- +! 2020-11-17 Tero Mielonen (TeMi) + +MODULE YOMM7CTL + +USE PARKIND1 ,ONLY : JPIM + +IMPLICIT NONE +SAVE + +TYPE :: TM7CTL + +!Aerosol water uptake scheme: +!NWATER = 0 Jacobson et al., JGR 1996 +! = 1 Kappa-Koehler theory based approach (Petters and Kreidenweis, ACP 2007) + INTEGER(KIND=JPIM) :: NWATER + +!Choice of the sulfate aerosol nucleation scheme: +! NSNUCL = 0 off +! = 1 Vehkamaeki et al., JGR 2002 +! = 2 Kazil and Lovejoy, ACP 2007 + INTEGER(KIND=JPIM) :: NSNUCL + +!Choice of the organic aerosol nucleation scheme: +!NONUCL = 0 off +! = 1 Activation nucleation, Kulmala et al., ACP 2006 +! = 2 Kinetic nucleation, Laakso et al., ACP 2004 + INTEGER(KIND=JPIM) :: NONUCL + +END TYPE TM7CTL + +TYPE(TM7CTL), POINTER :: YRM7CTL => NULL() + +END MODULE YOMM7CTL diff --git a/ifs-source/arpifs/phys_ec/simple_sulfur_src.F90 b/ifs-source/arpifs/phys_ec/simple_sulfur_src.F90 new file mode 100644 index 00000000..e26f08db --- /dev/null +++ b/ifs-source/arpifs/phys_ec/simple_sulfur_src.F90 @@ -0,0 +1,331 @@ +SUBROUTINE SIMPLE_SULFUR_SRC ( YDGEOMETRY, YDMODEL, KIDIA, KFDIA, KLON , KTDIA, KLEV,& + & KSTGLO, KTRAC, KAERO,& + & PAPHI,& + & PSO2L, PSO2H,& + & PSOGF, & + & PSOA ,& + & PSOACO, PVOLC, PVOLE, PDMS,& + & PCI , PINJF, PBLH,& + & PRS1, PRSF1, PGELAM, PGELAT, & + & PLSM , PTS , PTSPHY, & + & PWIND, & + & PDMSO, PLDAY, PLISS, PSO2 , PTDMS,& + & PODMS, PSO4SRC,PSO2SRC) + + USE PARKIND1 ,ONLY : JPIM, JPRB + USE YOMHOOK ,ONLY : LHOOK, DR_HOOK + USE YOMCST ,ONLY : RA, RPI, RDAY, RG + USE YOMLUN ,ONLY : NULOUT + USE TYPE_MODEL , ONLY : MODEL + !USE YOM_YGFL ,ONLY : YGFL + !USE YOEAERSRC ,ONLY : YREAERSRC + USE GEOMETRY_MOD , ONLY : GEOMETRY + !USE YOMCOMPO, ONLY : YRCOMPO + !USE YOEAERATM ,ONLY : YREAERATM + USE YOMCT3 , ONLY : NSTEP + USE YOMMP0 , ONLY : MYPROC, NPROC +! USE YOMRIP ,ONLY : YRRIP + +IMPLICIT NONE + +TYPE(GEOMETRY) ,INTENT(IN) :: YDGEOMETRY +TYPE(MODEL) ,INTENT(INOUT) :: YDMODEL +INTEGER(KIND=JPIM),INTENT(IN) :: KLON, KIDIA, KFDIA +INTEGER(KIND=JPIM),INTENT(IN) :: KLEV, KTDIA, KSTGLO +!INTEGER(KIND=JPIM),INTENT(IN) :: KSTEP +INTEGER(KIND=JPIM),INTENT(IN) :: KTRAC +INTEGER(KIND=JPIM),INTENT(IN) :: KAERO(YDMODEL%YRML_GCONF%YGFL%NAERO) + +REAL(KIND=JPRB) ,INTENT(IN) :: PAPHI(KLON,0:KLEV) + +REAL(KIND=JPRB) ,INTENT(IN) :: PSO2L(KLON), PSO2H(KLON), PSOGF(KLON), PSOA(KLON), PSOACO (KLON), PVOLC(KLON), PVOLE(KLON) +REAL(KIND=JPRB) ,INTENT(IN) :: PDMS(KLON) +REAL(KIND=JPRB) ,INTENT(IN) :: PGELAM(KLON), PGELAT(KLON)!, PGEMU(KLON) +REAL(KIND=JPRB) ,INTENT(IN) :: PCI(KLON), PLSM(KLON) +REAL(KIND=JPRB) ,INTENT(IN) :: PINJF(KLON) +REAL(KIND=JPRB) ,INTENT(IN) :: PBLH(KLON) +!REAL(KIND=JPRB) ,INTENT(IN) :: PDELP(KLON,KLEV) +!REAL(KIND=JPRB) ,INTENT(IN) :: PQ(KLON,KLEV), PRHO(KLON,KLEV) +REAL(KIND=JPRB) ,INTENT(IN) :: PTS(KLON) +REAL(KIND=JPRB) ,INTENT(IN) :: PWIND(KLON) +REAL(KIND=JPRB) ,INTENT(IN) :: PTSPHY +!DMS +REAL(KIND=JPRB) ,INTENT(INOUT) :: PDMSO(KLON), PLDAY(KLON), PLISS(KLON), PSO2(KLON), PTDMS(KLON) +REAL(KIND=JPRB) ,INTENT(INOUT) :: PODMS(KLON) +REAL(KIND=JPRB),INTENT(IN) :: PRS1(KLON,0:KLEV) +REAL(KIND=JPRB),INTENT(IN) :: PRSF1(KLON,KLEV) +REAL(KIND=JPRB) ,INTENT(OUT) ::PSO4SRC(KLON,KLEV) +REAL(KIND=JPRB) ,INTENT(OUT) ::PSO2SRC(KLON,KLEV) +!-- various alternate sources can be tested +REAL(KIND=JPRB) :: ZLOCALTIM , ZDIURN(KLON) +REAL(KIND=JPRB) :: ZSO2L(KLON) , ZSO2H(KLON) , ZSO2HD(KLON) +REAL(KIND=JPRB) :: ZSO2SOURC +REAL(KIND=JPRB) :: ZSOGF(KLON) , ZSOA(KLON) +REAL(KIND=JPRB) :: ZSO2MSS + +!-- QnD oceanic DMS +REAL(KIND=JPRB) :: ZCOS0, ZSIN0, ZRAD2DEG, Z_S_SO2, ZDMS2SO2 +REAL(KIND=JPRB) :: ZDMSMIN, ZSOA_CO +REAL(KIND=JPRB) :: ZDMSO(KLON), ZGEMU(KLON), ZLATK(KLON) + +!-- Injection height for biomass burning emissions +INTEGER(KIND=JPIM) :: ILINJ1, ILINJ2, IX(1) +REAL(KIND=JPRB) :: ZDELP + +INTEGER(KIND=JPIM) :: IGLGLO +REAL(KIND=JPRB) :: ZGRDLAT, ZGRDLAT2, ZGRDLON2, ZA, ZC, Z1GP +REAL(KIND=JPRB) :: ZDIST(KLON) , ZGRDLON(KLON), ZGDLAT(KLON), ZGDLON(KLON) +REAL(KIND=JPRB) :: ZDLAT, ZDLON +REAL(KIND=JPRB) :: ZLAT +REAL(KIND=JPRB) :: ZDEGRAD +REAL(KIND=JPRB) :: ZGLAT(KLON), ZGLON(KLON) +INTEGER(KIND=JPIM) :: IHTST, ITEST +!-- volcano-related variables +INTEGER(KIND=JPIM) :: INDLAT(KLON), JK, JL + +!AERPHYvars +REAL(KIND=JPRB) :: ZALT(KLON,0:KLEV), ZDP(KLON,KLEV), ZDZ(KLON,KLEV) + + +!LAERCHEM=>YGFL%LAERCHEM) +ASSOCIATE(YGFL=>YDMODEL%YRML_GCONF%YGFL,YDRIP=>YDMODEL%YRML_GCONF%YRRIP, & + & YDERAD=>YDMODEL%YRML_PHY_RAD%YRERAD, YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO, & + & YDEAERSRC=>YDMODEL%YRML_PHY_AER%YREAERSRC, & + & YDEAERATM=>YDMODEL%YRML_PHY_RAD%YREAERATM) + +ASSOCIATE(NDMSO=>YDEAERSRC%NDMSO,LOCNDMS=>YDEAERSRC%LOCNDMS,NDGLG=>YDGEOMETRY%YRDIM%NDGLG,LAERODIU=>YDCOMPO%LAERODIU,LFIRE=>YDCOMPO%LFIRE, & + & LINJ=>YDCOMPO%LINJ,YDCSGLEG=>YDGEOMETRY%YRCSGLEG,NGLOBALAT=>YDGEOMETRY%YRMP%NGLOBALAT, NLOENG=>YDGEOMETRY%YRGEM%NLOENG, & + & RCOVSRA=>YDEAERSRC%RCOVSRA, RCODECA=>YDEAERSRC%RCODECA,RSIDECA=>YDEAERSRC%RSIDECA,LAERCHEM=>YGFL%LAERCHEM, & + & RSIVSRA=>YDEAERSRC%RSIVSRA, RHGMT=>YDRIP%RHGMT, LAERELVS=>YDEAERATM%LAERELVS) + +Z_S_SO2=0.5_JPRB +ZSO2MSS=64.058E-03_JPRB +ZDMS2SO2=1.0_JPRB +ZDMSMIN = 5.E-11_JPRB +ZRAD2DEG= 180._JPRB/RPI +ZSOA_CO=0.15_JPRB + +PSO4SRC(:,:)=0.0_JPRB +PSO2SRC(:,:)=0.0_JPRB + +!* 0.2 A LENGTH OF DAY INDEX +! --------------------- + +DO JL=KIDIA,KFDIA + IGLGLO=NGLOBALAT(KSTGLO+JL-1) + ZGEMU(JL)=YDCSGLEG%RMU(IGLGLO) ! sine of latitude + ZLAT=ASIN(YDCSGLEG%RMU(IGLGLO))*ZRAD2DEG + ZLATK(JL)=ZLAT + ZCOS0=1._JPRB + ZSIN0=0._JPRB + PLDAY(JL)=MAX( RSIDECA*ZGEMU(JL)& + & -RCODECA*RCOVSRA*SQRT(1.0_JPRB-ZGEMU(JL)**2)* ZCOS0& + & +RCODECA*RSIVSRA*SQRT(1.0_JPRB-ZGEMU(JL)**2)* ZSIN0& + & ,0.0_JPRB) + PDMSO(JL)=0._JPRB + PLISS(JL)=0._JPRB + PSO2(JL) =0._JPRB + PTDMS(JL)=0._JPRB + PODMS(JL)=0._JPRB +ENDDO + + + +ITEST=0 +ZDEGRAD= 180._JPRB/RPI +ZDLAT = 180._JPRB / NDGLG ! distance in degrees between latitude lines +ZGRDLAT= RPI / NDGLG ! distance in radians between latitude lines +ZGRDLAT2=ZGRDLAT*0.55_JPRB + +DO JL=KIDIA,KFDIA + IGLGLO=NGLOBALAT(KSTGLO+JL-1) + INDLAT(JL)=IGLGLO + Z1GP=1.0_JPRB/REAL(NLOENG(IGLGLO),JPRB) + ZDLON=Z1GP*2.0_JPRB*RPI ! distance in radians between longitude points on a given latitude line + ZGRDLON(JL)=ZDLON + ZLAT=ASIN(YDCSGLEG%RMU(IGLGLO)) ! latitude in radians + ZA=COS(ZLAT)*SIN(ZDLON/2.0_JPRB) + ZC=2.0_JPRB * ASIN( MIN(1.0_JPRB,ZA) ) + ZDIST(JL)=RA * ZC /1000.0_JPRB ! distance in km between longitude points on a given latitude line + + ZGLON(JL)=PGELAM(JL)*ZDEGRAD + ZGLAT(JL)=ZLAT*ZDEGRAD + ZGDLAT(JL)=ZDLAT + ZGDLON(JL)=360._JPRB*Z1GP + + ZLOCALTIM =RHGMT + ZGLON(JL)/360._JPRB*RDAY + ZDIURN(JL)=COS( ((ZLOCALTIM-54000._JPRB)/RDAY) * 2._JPRB*RPI)+1._JPRB +ENDDO +IF (.NOT.LAERODIU) THEN + ZDIURN(KIDIA:KFDIA)=1.0_JPRB +ENDIF + + +DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZDP(JL,JK)= PRS1(JL,JK) - PRS1(JL,JK-1) + ENDDO +ENDDO + +! aerphy3: +DO JL=KIDIA,KFDIA + ZALT(JL,KLEV)=PAPHI(JL,KLEV)/RG +ENDDO +! IF (LAERCHEM) THEN +!MOVE OUTSIDE AER dependent + +! DO JL=KIDIA,KFDIA +! PCFLX(JL,KAERO(INBAER+1))= 0._JPRB +! ENDDO +! INBAER=INBAER+1 + +! ELSE +!-- originally, quick fix to produce a flux of oceanic DMS, following Liss & Merlivat, +! 1986, in "The Role of Air-Sea Exchange in Geochemical Cycling", +! ed. Buat-Menard, 113-128. + +IF (NDMSO /= 0 .AND. LOCNDMS) THEN + + CALL AER_DMSO (KIDIA, KFDIA, KLON,& + & PCI, PDMS, PLDAY, PLSM, PTS, PWIND,& + & ZDMSO, PLISS, PTDMS,& + & PODMS) + + IF (NDMSO == 1) THEN + DO JL=KIDIA,KFDIA + PDMSO(JL)=ZDMSO(JL) + ENDDO + ELSEIF (NDMSO == 2) THEN + DO JL=KIDIA,KFDIA + PDMSO(JL)=PODMS(JL) + ENDDO + ENDIF +ENDIF +!-- whatever the source representation (from parametrisation =1 or file =2) +! apply a weighting coefficient representing transfer from DMS to SO2 +! 30% from Kloster et al., 2005 +DO JL=KIDIA,KFDIA + PDMSO(JL)=ZDMS2SO2 * PDMSO(JL) +ENDDO + +IF(.NOT.LAERELVS) THEN + DO JL=KIDIA,KFDIA + ! renormalise by the mass of SO2 : no need with MACCity! + ZSO2L(JL)=PSO2L(JL) + ZSO2H(JL)=PSO2H(JL) + ZSO2SOURC=(ZSO2L(JL)*ZDIURN(JL)+ZSO2H(JL)) + PDMSO(JL) + PSO2(JL)=(ZSO2L(JL)*ZDIURN(JL)+ZSO2H(JL)) + IF (LFIRE) THEN + IF (PSOGF(JL) < 0._JPRB) THEN + ZSOGF(JL) = -PSOGF(JL) + ELSE + ZSOGF(JL) = PSOGF(JL) + ENDIF + ZSOGF(JL)=ZSOGF(JL)*ZSO2MSS + ! Height of injection for biomass burning emissions : update tendancy + IF (LINJ) THEN + IF (PINJF(JL) > 200._JPRB .AND. PBLH(JL) > 1500._JPRB) THEN + IX=MINLOC( ABS( (PAPHI(JL,1:KLEV)-PAPHI(JL,KLEV))/RG - PINJF(JL))) + ILINJ1=IX(1) + ILINJ2=ILINJ1 + ! calculate total detltap over injected levels + ZDELP=0.0_JPRB + DO JK = ILINJ1, ILINJ2 + ZDELP = ZDELP + ZDP(JL,JK) + ENDDO + DO JK = ILINJ1, ILINJ2 + + PSO2SRC(JL,JK) = ZSOGF(JL) * RG *ZDIURN(JL) / ZDELP + !PTENC(JL,JK,KAERO(INBAER+2)) = PTENC(JL,JK,KAERO(INBAER+2)) +& + !& ZSOGF(JL) * RG *ZDIURN(JL) / ZDELP + ENDDO + ELSE + ZDELP=0.0_JPRB + DO JK = KLEV-3, KLEV-2 + ZDELP = ZDELP + ZDP(JL,JK) + ENDDO + DO JK = KLEV-3, KLEV-2 + PSO2SRC(JL,JK) = ZSOGF(JL) * RG *ZDIURN(JL) / ZDELP + !PTENC(JL,JK,KAERO(INBAER+2)) = PTENC(JL,JK,KAERO(INBAER+2)) +& + !& ZSOGF(JL) * RG *ZDIURN(JL) / ZDELP + ENDDO + ENDIF + ELSE + ZSO2SOURC=ZSO2SOURC+ZSOGF(JL) + !PSO2SRC(JL,KLEV) = ZSOGF(JL) + ENDIF + ENDIF + PSO2SRC(JL,KLEV)= ZSO2SOURC + PSO4SRC(JL,KLEV)= 0.0_JPRB + !PCFLX(JL,KAERO(INBAER+2))= -ZSO2SOURC + !PCFLX(JL,KAERO(INBAER+1))= 0._JPRB + ENDDO + +ELSE !LAERELVS + DO JL=KIDIA,KFDIA + ! renormalise by the mass of SO2 : no need with MACCity! + ZSO2L(JL)=PSO2L(JL) + ZSO2H(JL)=PSO2H(JL) + ZSO2SOURC=ZSO2L(JL)*ZDIURN(JL) + PDMSO(JL) + PSO2(JL)=(ZSO2L(JL)*ZDIURN(JL)+ZSO2H(JL)) + IF (LFIRE) THEN + !THIS NEEDS a CHANGE for NETs!!!!!!! + IF (PSOGF(JL) < 0._JPRB) THEN + ZSOGF(JL) = -PSOGF(JL) + ELSE + ZSOGF(JL) = PSOGF(JL) + ENDIF + + ZSOGF(JL)=ZSOGF(JL)*ZSO2MSS + IF (LINJ) THEN + IF (PINJF(JL) > 200._JPRB .AND. PBLH(JL) > 1500._JPRB) THEN + IX=MINLOC( ABS( (PAPHI(JL,1:KLEV)-PAPHI(JL,KLEV))/RG - PINJF(JL))) + ILINJ1=IX(1) + ILINJ2=ILINJ1 + ! calculate total detltap over injected levels + ZDELP=0.0_JPRB + DO JK = ILINJ1, ILINJ2 + ZDELP = ZDELP + ZDP(JL,JK) + ENDDO + DO JK = ILINJ1, ILINJ2 + PSO2SRC(JL,JK) = PSO2SRC(JL,JK) + ZSOGF(JL) * RG *ZDIURN(JL) / ZDELP + !PTENC(JL,JK,KAERO(INBAER+2)) = PTENC(JL,JK,KAERO(INBAER+2)) +& + !& ZSOGF(JL) * RG *ZDIURN(JL) / ZDELP + ENDDO + ELSE + ZDELP=0.0_JPRB + DO JK = KLEV-3, KLEV-2 + ZDELP = ZDELP + ZDP(JL,JK) + ENDDO + DO JK = KLEV-3, KLEV-2 + PSO2SRC(JL,JK) = PSO2SRC(JL,JK) + ZSOGF(JL) * RG *ZDIURN(JL) / ZDELP + !PTENC(JL,JK,KAERO(INBAER+2)) = PTENC(JL,JK,KAERO(INBAER+2)) +& + !& ZSOGF(JL) * RG *ZDIURN(JL) / ZDELP + ENDDO + ENDIF + ELSE + ZSO2SOURC=ZSO2SOURC+ZSOGF(JL) + !PSO2SRC(JL,KLEV) = PSO2SRC(JL,KLEV)+ZSOGF(JL) + ENDIF + ENDIF + ! MOVE OUTSIDE + ! aerosol module depnedent + !PCFLX(JL,KAERO(INBAER+2))= -ZSO2SOURC !so2 + !PCFLX(JL,KAERO(INBAER+1))= 0._JPRB !so4 + PSO2SRC(JL,KLEV)= ZSO2SOURC + PSO4SRC(JL,KLEV)= 0.0_JPRB + ENDDO + ! distributing the elevated source of SO2 over the four lowest layers + ! original SO2 flux in kg m-2 s-1 (ZSO2H) +! Flux (kg m-2 s-1) = concentration (kg kg-1) DeltaPress(kg m-1 s-2) / [timestep (s) * gravity (m s-2)] + ! therefore, increment concentration (kg kg-1 s-1) = flux * timestep * gravity / [DeltaPress * timestep ] + + ! TB + ! TENDENCY update moved to respective aerosol modules + ! +ENDIF! LAERELVS + +!----------------------------------------------------------------------- +END ASSOCIATE +END ASSOCIATE +END SUBROUTINE SIMPLE_SULFUR_SRC From 000c4ae55da29be4b014517034247aa2586dee18 Mon Sep 17 00:00:00 2001 From: Lianghai Wu Date: Fri, 12 Jan 2024 10:25:46 +0000 Subject: [PATCH 006/129] Update for successful Ctest --- ifs-source/arpifs/dia/sucddh.F90 | 3 +- ifs-source/arpifs/module/yom_grib_codes.F90 | 7 +- ifs-source/arpifs/module/yomm7ctl.F90 | 3 +- ifs-source/arpifs/module/yomphyder.F90 | 2 +- ifs-source/arpifs/phys_ec/aerini_layer.F90 | 4 +- ifs-source/arpifs/phys_ec/hamm7_interface.F90 | 2 +- .../arpifs/phys_ec/local_arrays_fin.F90 | 1 + .../arpifs/phys_ec/local_arrays_ini.F90 | 7 + ifs-source/arpifs/phys_radi/raddrv.F90 | 20 ++- ifs-source/arpifs/phys_radi/radintg.F90 | 38 +++-- ifs-source/arpifs/phys_radi/suecrad.F90 | 8 +- ifs-source/arpifs/setup/su_surf_flds.F90 | 130 +++++++++++++++++- ifs-source/arpifs/setup/sugfl1.F90 | 40 +++--- scripts/exp_3d/run-oifs.ecmwf-hpc2020.job | 1 + 14 files changed, 210 insertions(+), 56 deletions(-) mode change 100644 => 100755 scripts/exp_3d/run-oifs.ecmwf-hpc2020.job diff --git a/ifs-source/arpifs/dia/sucddh.F90 b/ifs-source/arpifs/dia/sucddh.F90 index b8fcdc01..e260743d 100644 --- a/ifs-source/arpifs/dia/sucddh.F90 +++ b/ifs-source/arpifs/dia/sucddh.F90 @@ -84,7 +84,7 @@ SUBROUTINE SUCDDH(YDMODEL) ASSOCIATE(YDCDDH=>YDMODEL%YRML_DIAG%YRCDDH,YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO,YDMDDH=>YDMODEL%YRML_DIAG%YRMDDH, & & YGFL=>YDMODEL%YRML_GCONF%YGFL,YDEPHY=>YDMODEL%YRML_PHY_EC%YREPHY) -ASSOCIATE(NACTAERO=>YGFL%NACTAERO, NGHG=>YGFL%NGHG, & +ASSOCIATE(LAEROSFC=>YDCOMPO%LAEROSFC, NACTAERO=>YGFL%NACTAERO, NGHG=>YGFL%NGHG, & & YAERO=>YGFL%YAERO, YGHG=>YGFL%YGHG, & & LEFLAKE=>YDEPHY%LEFLAKE, & & NDHFFS=>YDMDDH%NDHFFS, NDHFIIS=>YDMDDH%NDHFIIS, NDHFSSS=>YDMDDH%NDHFSSS, & @@ -294,6 +294,7 @@ SUBROUTINE SUCDDH(YDMODEL) CLTXT(6)='NGT' CLTXT(7)='TAU' +! looks like LAEROSFC equals to NACTAERO>0 DO JVAR=1,NACTAERO DO JFLX=1,7 YDCDDH%CADHFSS(NDHVFS+IFSFLX_ECMWF+(JVAR-1)*7+JFLX)='SFGF'//TRIM(YAERO(JVAR)%CNAME)//CLTXT(JFLX) diff --git a/ifs-source/arpifs/module/yom_grib_codes.F90 b/ifs-source/arpifs/module/yom_grib_codes.F90 index e4c12ec6..0b306240 100644 --- a/ifs-source/arpifs/module/yom_grib_codes.F90 +++ b/ifs-source/arpifs/module/yom_grib_codes.F90 @@ -905,6 +905,8 @@ MODULE YOM_GRIB_CODES INTEGER(KIND=JPIM), PARAMETER :: NGRBAERLTS =210053 INTEGER(KIND=JPIM), PARAMETER :: NGRBAERSCC =210054 +INTEGER(KIND=JPIM), PARAMETER :: NGRBSOILTYPE =210055 + INTEGER(KIND=JPIM), PARAMETER :: NGRBAEPM1 =210072 INTEGER(KIND=JPIM), PARAMETER :: NGRBAEPM25 =210073 INTEGER(KIND=JPIM), PARAMETER :: NGRBAEPM10 =210074 @@ -942,10 +944,11 @@ MODULE YOM_GRIB_CODES !-- aerosols -- Table 216 -------------------------- INTEGER(KIND=JPIM), PARAMETER :: NGRBAERSO2DD =216006 +INTEGER(KIND=JPIM), PARAMETER :: NGRBAERSOAC =216007 INTEGER(KIND=JPIM), PARAMETER :: NGRBAERFCA1 =216043 INTEGER(KIND=JPIM), PARAMETER :: NGRBAERFCA2 =216044 -INTEGER(KIND=JPIM), PARAMETER :: NGRBAERDSF =216046 -INTEGER(KIND=JPIM), PARAMETER :: NGRBAERDSZ =216048 +INTEGER(KIND=JPIM), PARAMETER :: NGRBAERDSF =216046 +INTEGER(KIND=JPIM), PARAMETER :: NGRBAERDSZ =216048 INTEGER(KIND=JPIM), PARAMETER :: NGRBAERURBF =216122 !--------------------------------------------------- diff --git a/ifs-source/arpifs/module/yomm7ctl.F90 b/ifs-source/arpifs/module/yomm7ctl.F90 index f416e020..4c0e44e0 100644 --- a/ifs-source/arpifs/module/yomm7ctl.F90 +++ b/ifs-source/arpifs/module/yomm7ctl.F90 @@ -42,6 +42,7 @@ MODULE YOMM7CTL END TYPE TM7CTL -TYPE(TM7CTL), POINTER :: YRM7CTL => NULL() +!TYPE(TM7CTL), POINTER :: YRM7CTL => NULL() +TYPE(TM7CTL) :: YRM7CTL END MODULE YOMM7CTL diff --git a/ifs-source/arpifs/module/yomphyder.F90 b/ifs-source/arpifs/module/yomphyder.F90 index 382e5a6b..19c886d9 100644 --- a/ifs-source/arpifs/module/yomphyder.F90 +++ b/ifs-source/arpifs/module/yomphyder.F90 @@ -46,7 +46,7 @@ MODULE YOMPHYDER REAL(KIND=JPRB), DIMENSION(:,:) , POINTER, CONTIGUOUS :: ZAERSRC, ZAERDDP, ZAERSDM, ZAERFLX, ZAERLIF REAL(KIND=JPRB), DIMENSION(:) , POINTER, CONTIGUOUS :: ZAZ0M, ZAZ0H !--aerosol optical properties at 14 SW wavelengths (TM5M7) - REAL(KIND=JPRB), DIMENSION(:,:,:), POINTER :: ZAEROTAU, ZAEROSSA,ZAEROASY,ZAEROTAULW + REAL(KIND=JPRB), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZAEROTAU, ZAEROSSA,ZAEROASY,ZAEROTAULW ! - DMS-related aerosol local arrays REAL(KIND=JPRB), DIMENSION(:) , POINTER, CONTIGUOUS :: ZDMSO, ZLDAY, ZLISS, ZSO2, ZTDMS, ZDMSI, ZODMS diff --git a/ifs-source/arpifs/phys_ec/aerini_layer.F90 b/ifs-source/arpifs/phys_ec/aerini_layer.F90 index 2f68ba7b..9844b0e9 100644 --- a/ifs-source/arpifs/phys_ec/aerini_layer.F90 +++ b/ifs-source/arpifs/phys_ec/aerini_layer.F90 @@ -139,6 +139,7 @@ SUBROUTINE AERINI_LAYER(YDGEOMETRY,YDSURF,& & LAERNITRATE => YDCOMPO%LAERNITRATE, & & YCHEM=>YGFL%YCHEM, & & LAERCHEM=>YGFL%LAERCHEM, & + & LAEROSFC=>YDCOMPO%LAEROSFC, & & AERO_SCHEME=>YDCOMPO%AERO_SCHEME, & & YSD_VD=>YDSURF%YSD_VD, YSD_VF=>YDSURF%YSD_VF, YSP_RR=>YDSURF%YSP_RR, & & YSP_SB=>YDSURF%YSP_SB, YSP_SG=>YDSURF%YSP_SG, TSPHY=>YDPHY2%TSPHY) @@ -167,7 +168,8 @@ SUBROUTINE AERINI_LAYER(YDGEOMETRY,YDSURF,& ZSNM = SUM(PSURF%PSP_SG(:,:,YSP_SG%YF%MP9),DIM=2) ! pre-compute total snow mass -IF(.not. LAERCHEM)THEN + IF(.not. LAERCHEM .and. LAEROSFC)THEN + !IF(LAEROSFC) call simple_sulfur_src(YDGEOMETRY, YDMODEL, KDIM%KIDIA, KDIM%KFDIA, KDIM%KLON , KDIM%KTDIA, KDIM%KLEV,& & KDIM%KSTGLO, GEMSL%ITRAC, GEMSL%IAERO, & & PAUX%PAPHI, & diff --git a/ifs-source/arpifs/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/phys_ec/hamm7_interface.F90 index d8ab1558..0f76ec5f 100755 --- a/ifs-source/arpifs/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/phys_ec/hamm7_interface.F90 @@ -1469,7 +1469,6 @@ SUBROUTINE HAMM7_INTERFACE & ZAER_TAU_LW(KIDIA:KFDIA,:,:)=0.0_JPRB - SELECT CASE (NAEROOPT) CASE (0) @@ -1562,6 +1561,7 @@ SUBROUTINE HAMM7_INTERFACE & end do enddo enddo + !write(*,*)"max PAER_TAU", maxval(PAER_TAU) !======= ! ZAER_TAU(:,:,:,1), ZAER_SSA, ZAER_ASYM, ZAER_TAU_LW,rwet_m7) ! CALL HAM_RAD_CACHE_CLEANUP diff --git a/ifs-source/arpifs/phys_ec/local_arrays_fin.F90 b/ifs-source/arpifs/phys_ec/local_arrays_fin.F90 index 93dec7df..92806dde 100644 --- a/ifs-source/arpifs/phys_ec/local_arrays_fin.F90 +++ b/ifs-source/arpifs/phys_ec/local_arrays_fin.F90 @@ -131,6 +131,7 @@ SUBROUTINE LOCAL_ARRAYS_FIN(LLKEYS,AUXL,SURFL,PERTL,GEMSL) ! M7 fields +! REAL(KIND=JPRB), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZAEROTAU, ZAEROSSA,ZAEROASY,ZAEROTAULW IF (ASSOCIATED(GEMSL%ZAEROTAU)) DEALLOCATE(GEMSL%ZAEROTAU) IF (ASSOCIATED(GEMSL%ZAEROSSA)) DEALLOCATE(GEMSL%ZAEROSSA) IF (ASSOCIATED(GEMSL%ZAEROASY)) DEALLOCATE(GEMSL%ZAEROASY) diff --git a/ifs-source/arpifs/phys_ec/local_arrays_ini.F90 b/ifs-source/arpifs/phys_ec/local_arrays_ini.F90 index 384a9977..ee03e7c7 100644 --- a/ifs-source/arpifs/phys_ec/local_arrays_ini.F90 +++ b/ifs-source/arpifs/phys_ec/local_arrays_ini.F90 @@ -303,6 +303,13 @@ SUBROUTINE LOCAL_ARRAYS_INI(YDGEOMETRY,YDSURF,YDMODEL,KDIM, LLKEYS, PAUX, AUXL, ALLOCATE(GEMSL%ZAERASYLEV(1,1,1)) ALLOCATE(GEMSL%ZAERLISI(1,1,1,1)) + !M7 aerosols + ALLOCATE(GEMSL%ZAEROTAU(1,1,1)) + ALLOCATE(GEMSL%ZAEROSSA(1,1,1)) + ALLOCATE(GEMSL%ZAEROASY(1,1,1)) + ALLOCATE(GEMSL%ZAEROTAULW(1,1,1)) + + ALLOCATE( GEMSL%ZDRYDIAM(1,1,1)) ALLOCATE( GEMSL%ZWETDIAM(1,1,1)) ALLOCATE( GEMSL%ZDRYVOL(1,1,1)) diff --git a/ifs-source/arpifs/phys_radi/raddrv.F90 b/ifs-source/arpifs/phys_radi/raddrv.F90 index 010f6129..8b3aeea2 100644 --- a/ifs-source/arpifs/phys_radi/raddrv.F90 +++ b/ifs-source/arpifs/phys_radi/raddrv.F90 @@ -541,6 +541,7 @@ SUBROUTINE RADDRV(YDGEOMETRY,YDFIELDS,YDMODEL,KGPTOT,KFLDS,KBLOCKS,PGPIN) ENDIF ENDDO ENDIF + DO JSW=1,NTSW DO JL=IST,IEND ZALBDT (JSTGLO+JL-1,JSW) =ZALBD (JL,JSW) @@ -610,6 +611,7 @@ SUBROUTINE RADDRV(YDGEOMETRY,YDFIELDS,YDMODEL,KGPTOT,KFLDS,KBLOCKS,PGPIN) Z2Q9T (JSTGLO+JL-1,JK)=GFL(JL,JK,YQ%MP9_PH,IBL) ENDDO ENDDO + DO JK=1,NFLEVG if(LERADIMPL)THEN !DIR$ IVDEP @@ -623,6 +625,7 @@ SUBROUTINE RADDRV(YDGEOMETRY,YDFIELDS,YDMODEL,KGPTOT,KFLDS,KBLOCKS,PGPIN) ENDDO endif ENDDO + IF(LEPO3RA) THEN IF(YO3%LGP .AND. .NOT. (YGFL%NCHEM>0 .AND. YDCHEM%LCHEM_O3RAD) ) THEN DO JK=1,NFLEVG @@ -641,6 +644,8 @@ SUBROUTINE RADDRV(YDGEOMETRY,YDFIELDS,YDMODEL,KGPTOT,KFLDS,KBLOCKS,PGPIN) ENDDO ENDIF ENDIF + + IF (NFSD > 0) THEN DO JK=1,NFLEVG !DIR$ IVDEP @@ -648,7 +653,9 @@ SUBROUTINE RADDRV(YDGEOMETRY,YDFIELDS,YDMODEL,KGPTOT,KFLDS,KBLOCKS,PGPIN) ZFSDT(JSTGLO+JL-1,JK)=GFL(JL,JK,YFSD%MP9_PH,IBL) ENDDO ENDDO - ENDIF + ENDIF + + IF (NACTAERO > 0) THEN DO JAER=1,NAERO DO JK=1,NFLEVG @@ -663,16 +670,16 @@ SUBROUTINE RADDRV(YDGEOMETRY,YDFIELDS,YDMODEL,KGPTOT,KFLDS,KBLOCKS,PGPIN) DO JAER=1,14 DO JK=1,NFLEVG DO JL=IST,IEND - ZAEROTAU(JSTGLO+JL-1,JK,JAER)=0.0 - ZAEROSSA(JSTGLO+JL-1,JK,JAER)=0.0 - ZAEROASYM(JSTGLO+JL-1,JK,JAER)=0.0 + ZAEROTAU(JSTGLO+JL-1,JK,JAER) =0.0_JPRB + ZAEROSSA(JSTGLO+JL-1,JK,JAER) =0.0_JPRB + ZAEROASYM(JSTGLO+JL-1,JK,JAER)=0.0_JPRB ENDDO ENDDO ENDDO DO JAER=1,16 DO JK=1,NFLEVG DO JL=IST,IEND - ZAEROTAULW(JSTGLO+JL-1,JK,JAER)=0.0 + ZAEROTAULW(JSTGLO+JL-1,JK,JAER)=0.0_JPRB ENDDO ENDDO ENDDO @@ -682,7 +689,8 @@ SUBROUTINE RADDRV(YDGEOMETRY,YDFIELDS,YDMODEL,KGPTOT,KFLDS,KBLOCKS,PGPIN) DO JL=IST,IEND ZAEROTAU(JSTGLO+JL-1,JK,JAER) = YDAERM7%M7AOD(JL,JK,JAER,IBL) ZAEROSSA(JSTGLO+JL-1,JK,JAER) = YDAERM7%M7SSA(JL,JK,JAER,IBL)*YDAERM7%M7AOD(JL,JK,JAER,IBL) - ZAEROASYM(JSTGLO+JL-1,JK,JAER)= YDAERM7%M7ASYM(JL,JK,JAER,IBL)*YDAERM7%M7SSA(JL,JK,JAER,IBL)*YDAERM7%M7AOD(JL,JK,JAER,IBL) + ZAEROASYM(JSTGLO+JL-1,JK,JAER)= YDAERM7%M7ASYM(JL,JK,JAER,IBL)*YDAERM7%M7SSA(JL,JK,JAER,IBL)*YDAERM7%M7AOD(JL,JK,JAER,IBL) + ENDDO ENDDO ENDDO diff --git a/ifs-source/arpifs/phys_radi/radintg.F90 b/ifs-source/arpifs/phys_radi/radintg.F90 index 999becc5..64fb121d 100644 --- a/ifs-source/arpifs/phys_radi/radintg.F90 +++ b/ifs-source/arpifs/phys_radi/radintg.F90 @@ -975,12 +975,14 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& ZRGP(1:IL,IAERO+IAE:IAERO+IAE+KLEV-1,IB) = ZRGP(1:IL,IAERO+IAE:IAERO+IAE+KLEV-1,IB) * RSS_RH80_MASSFAC ENDIF ENDDO + IF (.NOT. LAERCHEM .AND. (LAERSOA .OR. LAERNITRATE .OR. LAERVOL)) THEN DO JAERO=IRADAER2+1,IRADAER2+ISUPP IAE=(JAERO-1)*KLEV ZRGP(1:IL,IAERO+IAE:IAERO+IAE+KLEV-1,IB) =MAX(REPSCAER, PAERO(IBEG:IEND,1:KLEV,JAERO)) ENDDO ENDIF + ! SR 05 2018 if LAERCHEM, shift one variable IF (LAERCHEM .AND. (LAERSOA .OR. LAERNITRATE .OR. LAERVOL)) THEN DO JAERO=IRADAER2+1,IRADAER2+ISUPP @@ -988,22 +990,21 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& ZRGP(1:IL,IAERO+IAE:IAERO+IAE+KLEV-1,IB) =MAX(REPSCAER, PAERO(IBEG:IEND,1:KLEV,JAERO-1)) ENDDO ENDIF + ! SR 06 2020 LAERCHEM and no nitrate/SOA IF (LAERCHEM .AND. .NOT. (LAERSOA .OR. LAERNITRATE .OR. LAERVOL)) THEN JAERO=IRADAER2+1 IAE=(JAERO-1)*KLEV ZRGP(1:IL,IAERO+IAE:IAERO+IAE+KLEV-1,IB) =REPSCAER ENDIF - ENDIF - - - !A.Laakso: + ! M7 aerosol + !A.Laakso IF (NSTEP == YDRIP%NSTART) THEN DO JAERO=1,YDERAD%NTSW IAE=(JAERO-1)*KLEV - ZRGP(1:IL,IHAMAEROAOD+IAE:IHAMAEROAOD+IAE+KLEV-1,IB) =0._JPRB - ZRGP(1:IL,IHAMAEROSSA+IAE:IHAMAEROSSA+IAE+KLEV-1,IB) =0._JPRB + ZRGP(1:IL,IHAMAEROAOD+IAE:IHAMAEROAOD+IAE+KLEV-1,IB) =REPSCAER + ZRGP(1:IL,IHAMAEROSSA+IAE:IHAMAEROSSA+IAE+KLEV-1,IB) =0._JPRB ZRGP(1:IL,IHAMAEROASYM+IAE:IHAMAEROASYM+IAE+KLEV-1,IB) =0._JPRB END DO @@ -1013,20 +1014,22 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& !END DO ELSE + DO JAERO=1,YDMODEL%YRML_PHY_RAD%YRERAD%NTSW - IAE=(JAERO-1)*KLEV - ZRGP(1:IL,IHAMAEROAOD+IAE:IHAMAEROAOD+IAE+KLEV-1,IB) =MAX(0._JPRB, PAEROTAU(IBEG:IEND,1:KLEV,JAERO)) - + IAE=(JAERO-1)*KLEV + write(*,*) "REPSCAER", REPSCAER + write(*,*) "PAEROTAU", PAEROTAU(IBEG:IEND,1:KLEV,JAERO) + ZRGP(1:IL,IHAMAEROAOD+IAE:IHAMAEROAOD+IAE+KLEV-1,IB) =MAX(REPSCAER, PAEROTAU(IBEG:IEND,1:KLEV,JAERO)) ENDDO + DO JAERO=1,YDMODEL%YRML_PHY_RAD%YRERAD%NTSW - IAE=(JAERO-1)*KLEV - ZRGP(1:IL,IHAMAEROSSA+IAE:IHAMAEROSSA+IAE+KLEV-1,IB) =MAX(0._JPRB, PAEROSSA(IBEG:IEND,1:KLEV,JAERO)) - + IAE=(JAERO-1)*KLEV + ZRGP(1:IL,IHAMAEROSSA+IAE:IHAMAEROSSA+IAE+KLEV-1,IB) =MAX(0._JPRB,PAEROSSA(IBEG:IEND,1:KLEV,JAERO)) ENDDO - DO JAERO=1,YDMODEL%YRML_PHY_RAD%YRERAD%NTSW - IAE=(JAERO-1)*KLEV - ZRGP(1:IL,IHAMAEROASYM+IAE:IHAMAEROASYM+IAE+KLEV-1,IB) =MAX(0._JPRB, PAEROASYM(IBEG:IEND,1:KLEV,JAERO)) + DO JAERO=1,YDMODEL%YRML_PHY_RAD%YRERAD%NTSW + IAE=(JAERO-1)*KLEV + ZRGP(1:IL,IHAMAEROASYM+IAE:IHAMAEROASYM+IAE+KLEV-1,IB) =MAX(0._JPRB, PAEROASYM(IBEG:IEND,1:KLEV,JAERO)) ENDDO !DO JAERO=1,STRATO_CMIP6_NTB @@ -1035,6 +1038,11 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& !ENDDO ENDIF + ENDIF + + + + diff --git a/ifs-source/arpifs/phys_radi/suecrad.F90 b/ifs-source/arpifs/phys_radi/suecrad.F90 index adfa10b8..c90b0d60 100644 --- a/ifs-source/arpifs/phys_radi/suecrad.F90 +++ b/ifs-source/arpifs/phys_radi/suecrad.F90 @@ -2116,9 +2116,11 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) ALLOCATE(YDAERM7%M7AOD(NPROMA, NFLEVG,NTSW,NGPBLKS)) ALLOCATE(YDAERM7%M7SSA(NPROMA, NFLEVG,NTSW,NGPBLKS)) ALLOCATE(YDAERM7%M7ASYM(NPROMA,NFLEVG,NTSW,NGPBLKS)) -YDAERM7%M7AOD(:,:,:,:) =0.0_JPRB -YDAERM7%M7SSA(:,:,:,:) =0.0_JPRB -YDAERM7%M7ASYM(:,:,:,:) =0.0_JPRB +ALLOCATE(YDAERM7%M7AODLW(NPROMA, NFLEVG,NTSW,NGPBLKS)) +YDAERM7%M7AOD(:,:,:,:) =0.0_JPRB +YDAERM7%M7SSA(:,:,:,:) =0.0_JPRB +YDAERM7%M7ASYM(:,:,:,:) =0.0_JPRB +YDAERM7%M7AODLW(:,:,:,:) =0.0_JPRB ! - 6.1. PARAMETERS FOR THE STANDARD TEGEN AEROSOL CLIMATOLOGY ! ----------------------------------------------------- diff --git a/ifs-source/arpifs/setup/su_surf_flds.F90 b/ifs-source/arpifs/setup/su_surf_flds.F90 index bd4aa0fe..af9949a1 100644 --- a/ifs-source/arpifs/setup/su_surf_flds.F90 +++ b/ifs-source/arpifs/setup/su_surf_flds.F90 @@ -194,9 +194,11 @@ SUBROUTINE SU_SURF_FLDS(YDDIMV,YDSURF,YDMODEL,LDVERBOSE) & NGRBALUVI,NGRBALUVV,NGRBALUVG,& & NGRBALNII,NGRBALNIV,NGRBALNIG,& & NGRBAERDEP,NGRBAERLTS,NGRBAERSCC,NGRBAERDSF, NGRBAERDSZ, & - & NGRBAERLS13,& + & NGRBAERLS13, NGRBSOILTYPE, & + & NGRBAERLS01,NGRBAERLS02,NGRBAERLS10,NGRBAERLS03,NGRBAERLS04,NGRBAERLS11,& + & NGRBAERLS05,NGRBAERLS06,NGRBAERLS12,NGRBAERLS07,NGRBAERLS08,NGRBAERLS09,& & NGRBAEODSS ,NGRBAEODDU ,NGRBAEODOM ,NGRBAEODBC ,NGRBAEODSU ,& - & NGRBAEODNI ,NGRBAEODAM, NGRBAEODSOA,& + & NGRBAEODNI ,NGRBAEODAM, NGRBAEODSOA, NGRBAERSOAC, & & NGRBAEODVFA,NGRBAEODVSU,NGRBACCAOD550,NGRBAEPM1 ,NGRBAEPM25 ,NGRBAEPM10 ,& & NGRBUVBED, NGRBUVBEDCS ,& & NGRBFASGPPCOEF, NGRBFASRECCOEF,NGRBCLBT, NGRBCSBT,& @@ -315,12 +317,13 @@ SUBROUTINE SU_SURF_FLDS(YDDIMV,YDSURF,YDMODEL,LDVERBOSE) & NCOM=>YDDPHY%NCOM, NVEXTRRAD=>YDDPHY%NVEXTRRAD, NCXP=>YDDPHY%NCXP, & & NVECOUT=>YDDPHY%NVECOUT, NSURFEXCTLMAX=>YDMSE%NSURFEXCTLMAX, & & LMSE=>YDARPHY%LMSE, NFPCLI=>YLNAMFPSCI%NFPCLI,NFPSWI=>YLNAMFPSCI%NFPSWI, & - & YGHG=>YGFL%YGHG, & + & YGHG=>YGFL%YGHG, NGEMS=>YGFL%NGEMS, & & YCHEM=>YGFL%YCHEM, NGHG=>YGFL%NGHG, & & NCHEM_TC=>YGFL%NCHEM_TC, NCHEM_DV=>YGFL%NCHEM_DV, & & NCHEM_FLXO=>YGFL%NCHEM_FLXO, NCHEM=>YGFL%NCHEM, & & NCHEM_WDFLX=>YGFL%NCHEM_WDFLX, NCHEM_DDFLX=>YGFL%NCHEM_DDFLX, & & NEMIS2D=>YGFL%NEMIS2D, NEMIS2D_DESC=>YDCOMPO%NEMIS2D_DESC, YEMIS2D_DESC=>YDCOMPO%YEMIS2D_DESC, & + & LAEROSFC=>YDCOMPO%LAEROSFC, & & NEMIS2DAUX=>YGFL%NEMIS2DAUX, YEMIS2DAUX_DESC=>YDCOMPO%YEMIS2DAUX_DESC, & & NACTAERO=>YGFL%NACTAERO, YAERO=>YGFL%YAERO, YAERO_DESC=>YDEAERATM%YAERO_DESC, & & NGP5_OOPS=>YDSURF%NGP5_OOPS, NTRAJ_CST_OOPS=>YDSURF%NTRAJ_CST_OOPS, & @@ -385,6 +388,7 @@ SUBROUTINE SU_SURF_FLDS(YDDIMV,YDSURF,YDMODEL,LDVERBOSE) & LDPRECIPS=>YDPHY%LDPRECIPS,LDPRECIPS2=>YDPHY%LDPRECIPS2, & & NDTPREC=>YDPHY%YRDPRECIPS%NDTPREC, NDTPREC2=>YDPHY%YRDPRECIPS%NDTPREC2,& & LAERCHEM=>YGFL%LAERCHEM, LAERNITRATE=>YDCOMPO%LAERNITRATE, & + & LFIRE=>YDCOMPO%LFIRE, & & AERO_SCHEME=>YDCOMPO%AERO_SCHEME, & & LAERSOA=>YDCOMPO%LAERSOA,LAERSOA_COUPLED=>YDCOMPO%LAERSOA_COUPLED,& & LAERRESUSPENSION=>YDCOMPO%LAERRESUSPENSION,& @@ -1107,9 +1111,28 @@ SUBROUTINE SU_SURF_FLDS(YDDIMV,YDSURF,YDMODEL,LDVERBOSE) YSD_VF%YDSZ => YSD_VF%YVF(JPMAXSFLDS) YSD_VF%YDMSO => YSD_VF%YVF(JPMAXSFLDS) YSD_VF%YURBF => YSD_VF%YVF(JPMAXSFLDS) -YSD_VF%YFCA1 => YSD_VF%YVF(JPMAXSFLDS) -YSD_VF%YFCA2 => YSD_VF%YVF(JPMAXSFLDS) -YSD_VF%YSO2DD => YSD_VF%YVF(JPMAXSFLDS) +YSD_VF%YFCA1 => YSD_VF%YVF(JPMAXSFLDS) +YSD_VF%YFCA2 => YSD_VF%YVF(JPMAXSFLDS) +YSD_VF%YSO2DD => YSD_VF%YVF(JPMAXSFLDS) +! + + IF (LAEROSFC) THEN + YSD_VF%YSOILTYPE=> YSD_VF%YVF(JPMAXSFLDS) + YSD_VF%YBCBF => YSD_VF%YVF(JPMAXSFLDS) + YSD_VF%YBCFF => YSD_VF%YVF(JPMAXSFLDS) + YSD_VF%YBCGF => YSD_VF%YVF(JPMAXSFLDS) + YSD_VF%YOMBF => YSD_VF%YVF(JPMAXSFLDS) + YSD_VF%YOMFF => YSD_VF%YVF(JPMAXSFLDS) + YSD_VF%YOMGF => YSD_VF%YVF(JPMAXSFLDS) + + YSD_VF%YSO2L => YSD_VF%YVF(JPMAXSFLDS) + YSD_VF%YSO2H => YSD_VF%YVF(JPMAXSFLDS) + YSD_VF%YSOGF => YSD_VF%YVF(JPMAXSFLDS) + YSD_VF%YVOLC => YSD_VF%YVF(JPMAXSFLDS) + YSD_VF%YVOLE => YSD_VF%YVF(JPMAXSFLDS) + YSD_VF%YSOA => YSD_VF%YVF(JPMAXSFLDS) + YSD_VF%YSOACO => YSD_VF%YVF(JPMAXSFLDS) + ENDIF YSD_VF%YCHEMFLXO => YSD_VF%YVF(JPMAXSFLDS:JPMAXSFLDS) YSD_VF%YCHEMDDFLX => YSD_VF%YVF(JPMAXSFLDS:JPMAXSFLDS) @@ -1263,6 +1286,10 @@ SUBROUTINE SU_SURF_FLDS(YDDIMV,YDSURF,YDMODEL,LDVERBOSE) CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YALNIG,& & KGRIB=NGRBALNIG,CDNAME='M_ALB.N-IRPARALG',KTRAJ=2,KREQIN=IREQIN_MODIS6) + + + + IF (NACTAERO > 0) THEN YSD_VF%YAERDEP => YSD_VF%YVF(YSD_VFD%IPTR) CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YAERDEP,& @@ -1301,12 +1328,100 @@ SUBROUTINE SU_SURF_FLDS(YDDIMV,YDSURF,YDMODEL,LDVERBOSE) ENDIF + + IF (NACTAERO > 0) THEN ! added for M7 + IF (LAEROSFC) THEN !!! + YSD_VF%YAERDEP => YSD_VF%YVF(YSD_VFD%IPTR) + CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YAERDEP,& + & KGRIB=NGRBAERDEP,CDNAME='Dust emiss poten',KTRAJ=2,KREQIN=-1) + YSD_VF%YAERLTS => YSD_VF%YVF(YSD_VFD%IPTR) + CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YAERLTS,& + & KGRIB=NGRBAERLTS,CDNAME='Lift thresh sped',KTRAJ=2,KREQIN=-1) + YSD_VF%YAERSCC => YSD_VF%YVF(YSD_VFD%IPTR) + CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YAERSCC,& + & KGRIB=NGRBAERSCC,CDNAME='Soil clay contnt',KTRAJ=2,KREQIN=-1) + !TM5/M7 ancillary data + YSD_VF%YSOILTYPE => YSD_VF%YVF(YSD_VFD%IPTR) + IF (TRIM(AERO_SCHEME) == "tm5m7" .or. TRIM(AERO_SCHEME) == "hamm7" ) THEN + IREQIN=1 + ELSE + IREQIN=-1 + END IF + CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YSOILTYPE, & + & KGRIB=NGRBSOILTYPE, CDNAME='TM5M7 soil type',KTRAJ=2,KREQIN=IREQIN) + + YSD_VF%YBCBF => YSD_VF%YVF(YSD_VFD%IPTR) + CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YBCBF,& + & KGRIB=NGRBAERLS01,CDNAME='BlckCarbn biogen',KTRAJ=2,KREQIN=1) + YSD_VF%YBCFF => YSD_VF%YVF(YSD_VFD%IPTR) + CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YBCFF,& + & KGRIB=NGRBAERLS02,CDNAME='BlckCarbn fossil',KTRAJ=2,KREQIN=1) + IF (LFIRE) THEN + YSD_VF%YBCGF => YSD_VF%YVF(YSD_VFD%IPTR) + CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YBCGF,& + & KGRIB=NGRBAERLS10,CDNAME='BlackCarbon GFED',KTRAJ=2,KREQIN=1) + ENDIF + YSD_VF%YOMBF => YSD_VF%YVF(YSD_VFD%IPTR) + CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YOMBF,& + & KGRIB=NGRBAERLS03,CDNAME='Organic biogenic',KTRAJ=2,KREQIN=1) + YSD_VF%YOMFF => YSD_VF%YVF(YSD_VFD%IPTR) + CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YOMFF,& + & KGRIB=NGRBAERLS04,CDNAME='Organic fossil ',KTRAJ=2,KREQIN=1) + IF (LFIRE) THEN + YSD_VF%YOMGF => YSD_VF%YVF(YSD_VFD%IPTR) + CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YOMGF,& + & KGRIB=NGRBAERLS11,CDNAME='Organic GFED ',KTRAJ=2,KREQIN=1) + ENDIF + IF (LAERCHEM) THEN + IREQIN=-1 + ELSE + IREQIN=1 + ENDIF + YSD_VF%YSO2L => YSD_VF%YVF(YSD_VFD%IPTR) + CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YSO2L,& + & KGRIB=NGRBAERLS05,CDNAME='Sulphate low-lvl',KTRAJ=2,KREQIN=IREQIN) + YSD_VF%YSO2H => YSD_VF%YVF(YSD_VFD%IPTR) + CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YSO2H,& + & KGRIB=NGRBAERLS06,CDNAME='Sulphate highlvl',KTRAJ=2,KREQIN=IREQIN) + YSD_VF%YSO2DD => YSD_VF%YVF(YSD_VFD%IPTR) + CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YSO2DD,& + & KGRIB=NGRBAERSO2DD,CDNAME='SO2 dry dep vel.',KTRAJ=2,KREQIN=IREQIN) + + IF (LFIRE) THEN + YSD_VF%YSOGF => YSD_VF%YVF(YSD_VFD%IPTR) + CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YSOGF,& + & KGRIB=NGRBAERLS12,CDNAME='Sulphate GFED ',KTRAJ=2,KREQIN=IREQIN) + ENDIF + YSD_VF%YVOLC => YSD_VF%YVF(YSD_VFD%IPTR) + CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YVOLC,& + & KGRIB=NGRBAERLS07,CDNAME='Volcanic continu',KTRAJ=2,KREQIN=-1) + YSD_VF%YVOLE => YSD_VF%YVF(YSD_VFD%IPTR) + CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YVOLE,& + & KGRIB=NGRBAERLS08,CDNAME='Volcanic explosi',KTRAJ=2,KREQIN=-1) + YSD_VF%YSOA => YSD_VF%YVF(YSD_VFD%IPTR) + CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YSOA,& + & KGRIB=NGRBAERLS09,CDNAME='SecondOrganicMat',KTRAJ=2,KREQIN=1) + + YSD_VF%YDMSO => YSD_VF%YVF(YSD_VFD%IPTR) + CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YDMSO,& + & KGRIB=NGRBAERLS13,CDNAME='Oceanic DMS ',KTRAJ=2,KREQIN=1) + + YSD_VF%YSOACO => YSD_VF%YVF(YSD_VFD%IPTR) + CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YSOACO,& + & KGRIB=NGRBAERSOAC,CDNAME='Sec. Org. Aer from CO',KTRAJ=2,KREQIN=1) + + ENDIF + ENDIF + + + IF (NACTAERO > 0) THEN ! ZKFIXME: revert to LAEROSFC once emission refactoring complete IF (LAERCHEM) THEN IREQIN=-1 ELSE IREQIN=1 ENDIF + YSD_VF%YSO2DD => YSD_VF%YVF(YSD_VFD%IPTR) IF (LAERCHEM .AND. .NOT.(LAERSOA .AND. .NOT. LAERSOA_COUPLED)) THEN IREQIN=-1 @@ -1317,6 +1432,9 @@ SUBROUTINE SU_SURF_FLDS(YDDIMV,YDSURF,YDMODEL,LDVERBOSE) & KGRIB=NGRBAERSO2DD,CDNAME='SO2 dry dep vel.',KTRAJ=2,KREQIN=IREQIN) ENDIF + + + IF (NACTAERO > 0) THEN ! GLOMAP somehow still uses its own DMS input and SO2 precursor even with LAERCHEM... IF (LAERCHEM .OR. NDMSO==0 .OR. .NOT. LOCNDMS) THEN diff --git a/ifs-source/arpifs/setup/sugfl1.F90 b/ifs-source/arpifs/setup/sugfl1.F90 index afdc5648..f9f6bcb9 100644 --- a/ifs-source/arpifs/setup/sugfl1.F90 +++ b/ifs-source/arpifs/setup/sugfl1.F90 @@ -77,7 +77,7 @@ SUBROUTINE SUGFL1(YDMODEL,KGFLCONF) USE YOM_YGFL , ONLY : JPCHEM_ASSIM, JPGHG_ASSIM, TYPE_GFL_NAML USE YOMANEB , ONLY : NGRBCHEM, NGRBGHGASSIM USE YOE_AERODIAG, ONLY : TYPE_AERO_WVL_DIAG -USE YOMM7CTL , ONLY : YRM7CTL !!! M7, looks ugly now +!USE YOMM7CTL , ONLY : YRM7CTL !!! M7, not sure where needed USE ARPCLIM_CHEM_MODULE #if defined(__PGI) @@ -107,15 +107,14 @@ SUBROUTINE SUGFL1(YDMODEL,KGFLCONF) & LCHEM_ANAO3, LCHEM_ANACH4, LCHEM_JOUT, LCHEM_0NOX, LCHEM_HTAP, LCHEM_O3RAD, LCHEM_WDFR, & & LCHEM_WEAK_CH4_RELAXATION, & & LCHEM_CONVSCAV, LCHEM_CSHAPE, LCHEM_AEROI, LCHEM_LCOMESO, LCHEM_LCOCSTCLIM, LCHEM_LCOLIMIT, & - & LCOMPO_DCDD, & + & LCOMPO_DCDD, LAEROSFC, & & LAERNITRATE, LAEREQSAM4CLIM, LAERSOA, LAERSOA_COUPLED, LCHEM_REVCHEM, LAERRESUSPENSION, LAERNUCL, & & LCHEM_ARPCLIM REAL(KIND=JPRB), POINTER :: RCHEM_DIA_PERIOD CHARACTER(LEN=20) :: CHEM_SCHEME, CHEM_LCOVERS, AERO_SCHEME -INTEGER(KIND=JPIM), POINTER :: NCHEM_LCOCOEF, KCHEM_SOLVE, KCHEM_YEARPI, KCHEM_NOXADV, KCHEM_WETDEP, KCHEM_DRYDEP, & - & KGHG_CHEMTEND_CH4 +INTEGER(KIND=JPIM), POINTER :: NCHEM_LCOCOEF, KCHEM_SOLVE, KCHEM_YEARPI, KCHEM_NOXADV, KCHEM_WETDEP, KCHEM_DRYDEP, KGHG_CHEMTEND_CH4 REAL(KIND=JPRB), POINTER :: RCHEM_LCOTAUTOP, RCHEM_LCOCLIMTOP, RCHEM_LCOCOEFA1 REAL(KIND=JPRB), POINTER :: RCHEM_LINOX_SCALING, RCH4CONST @@ -205,8 +204,7 @@ SUBROUTINE SUGFL1(YDMODEL,KGFLCONF) ! ------------------------------------------------------------------ IF (LHOOK) CALL DR_HOOK('SUGFL1',0,ZHOOK_HANDLE) -ASSOCIATE(YGFL=>YDMODEL%YRML_GCONF%YGFL,YDEPHY=>YDMODEL%YRML_PHY_EC%YREPHY, & - & YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO,YDCHEM=>YDMODEL%YRML_CHEM%YRCHEM) +ASSOCIATE(YGFL=>YDMODEL%YRML_GCONF%YGFL,YDEPHY=>YDMODEL%YRML_PHY_EC%YREPHY, YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO, YDCHEM=>YDMODEL%YRML_CHEM%YRCHEM) ASSOCIATE(NCHEM_ASSIM=>YGFL%NCHEM_ASSIM, NCHEM_DV=>YGFL%NCHEM_DV,& & NCHEM_FLXO=>YGFL%NCHEM_FLXO, NCHEM_TC=>YGFL%NCHEM_TC, & & NCHEM_WDFLX=>YGFL%NCHEM_WDFLX, NCHEM_DDFLX=>YGFL%NCHEM_DDFLX, & @@ -218,21 +216,22 @@ SUBROUTINE SUGFL1(YDMODEL,KGFLCONF) LCHEM_DIA => YDCOMPO%LCHEM_DIA LCHEM_DDFLX => YDCOMPO%LCHEM_DDFLX LCOMPO_DDFLX_DIR => YDCOMPO%LCOMPO_DDFLX_DIR +LAEROSFC => YDCOMPO%LAEROSFC LCHEM_TROPO => YDCOMPO%LCHEM_TROPO LCOMPO_DCDD => YDCOMPO%LCOMPO_DCDD LAERNITRATE => YDCOMPO%LAERNITRATE -LAEREQSAM4CLIM => YDCOMPO%LAEREQSAM4CLIM -LAERRESUSPENSION => YDCOMPO%LAERRESUSPENSION +LAEREQSAM4CLIM => YDCOMPO%LAEREQSAM4CLIM +LAERRESUSPENSION => YDCOMPO%LAERRESUSPENSION LAERSOA => YDCOMPO%LAERSOA LAERSOA_COUPLED => YDCOMPO%LAERSOA_COUPLED -LAERNUCL => YDCOMPO%LAERNUCL +LAERNUCL => YDCOMPO%LAERNUCL RCHEM_DIA_PERIOD => YDCOMPO%RCHEM_DIA_PERIOD KGHG_CHEMTEND_CH4=> YDCOMPO%KGHG_CHEMTEND_CH4 -! Associate pointers for variables in namelist NAMM7CTL -NWATER => YRM7CTL%NWATER -NSNUCL => YRM7CTL%NSNUCL -NONUCL => YRM7CTL%NONUCL +! Associate pointers for variables in namelist NAMM7CTL, not sure where needed +!NWATER => YRM7CTL%NWATER +!NSNUCL => YRM7CTL%NSNUCL +!NONUCL => YRM7CTL%NONUCL ! Associate pointers for variables in namelist NAMCHEM LCHEM_LIGHT => YDCHEM%LCHEM_LIGHT @@ -661,6 +660,7 @@ SUBROUTINE SUGFL1(YDMODEL,KGFLCONF) LCOMPO_DDFLX_DIR=.FALSE. LCHEM_TROPO=.FALSE. LCOMPO_DCDD=.TRUE. +LAEROSFC=.FALSE. LAERNITRATE=.FALSE. LAEREQSAM4CLIM=.FALSE. LAERRESUSPENSION=.FALSE. @@ -668,14 +668,15 @@ SUBROUTINE SUGFL1(YDMODEL,KGFLCONF) LAERSOA_COUPLED=.FALSE. LAERNUCL=.TRUE. KGHG_CHEMTEND_CH4=0_JPIM -! -!AERO_SCHEME="aer" +!! +!AERO_SCHEME="hamm7" +AERO_SCHEME="aer" -! M7CTL namelist -NWATER=1 -NSNUCL=2 -NONUCL=1 +! M7CTL namelist, not sure where needed +!NWATER=1 +!NSNUCL=2 +!NONUCL=1 ! @@ -697,6 +698,7 @@ SUBROUTINE SUGFL1(YDMODEL,KGFLCONF) & ' LCOMPO_DDFLX_DIR=',LCOMPO_DDFLX_DIR,& & ' LCHEM_TROPO=',LCHEM_TROPO,& & ' LCOMPO_DCDD=',LCOMPO_DCDD,& + & ' LAEROSFC=',LAEROSFC,& & ' LAERNITRATE=',LAERNITRATE, & & ' LAEREQSAM4CLIM=',LAEREQSAM4CLIM, & & ' LAERRESUSPENSION=',LAERRESUSPENSION, & diff --git a/scripts/exp_3d/run-oifs.ecmwf-hpc2020.job b/scripts/exp_3d/run-oifs.ecmwf-hpc2020.job old mode 100644 new mode 100755 index d2ae6e2a..0481e873 --- a/scripts/exp_3d/run-oifs.ecmwf-hpc2020.job +++ b/scripts/exp_3d/run-oifs.ecmwf-hpc2020.job @@ -96,6 +96,7 @@ env | grep -i slurm ####export MBX_SIZE=128000000 # Make sure process stack limit is increased +export OMP_STACKSIZE=128M ulimit -s unlimited ./oifs-run From 11231bc0d3ce9ea902cfa09c8226549b4e075d08 Mon Sep 17 00:00:00 2001 From: Lianghai Wu Date: Wed, 17 Jan 2024 13:17:18 +0000 Subject: [PATCH 007/129] Pass ab2a forecast experiment --- ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 | 2 +- ifs-source/arpifs/phys_radi/raddrv.F90 | 63 ++++++++++---------- ifs-source/arpifs/phys_radi/radintg.F90 | 2 - ifs-source/arpifs/phys_radi/suecrad.F90 | 29 ++++++--- 4 files changed, 54 insertions(+), 42 deletions(-) diff --git a/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 b/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 index 0c979fd5..e2b01bb8 100644 --- a/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 +++ b/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 @@ -184,7 +184,7 @@ SUBROUTINE AER_PHY3_LAYER(YDSURF, & ELSE ZO3(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV) = STATE%O3(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV) ENDIF - +write(*,*)"AERO_SCHEME",TRIM(AERO_SCHEME) SELECT CASE (TRIM(AERO_SCHEME)) CASE ("glomap") diff --git a/ifs-source/arpifs/phys_radi/raddrv.F90 b/ifs-source/arpifs/phys_radi/raddrv.F90 index 8b3aeea2..e884238a 100644 --- a/ifs-source/arpifs/phys_radi/raddrv.F90 +++ b/ifs-source/arpifs/phys_radi/raddrv.F90 @@ -279,7 +279,7 @@ SUBROUTINE RADDRV(YDGEOMETRY,YDFIELDS,YDMODEL,KGPTOT,KFLDS,KBLOCKS,PGPIN) & YDDIM=>YDGEOMETRY%YRDIM,YDDIMV=>YDGEOMETRY%YRDIMV, YDGEM=>YDGEOMETRY%YRGEM, & & YDGSGEOM=>YDGEOMETRY%YRGSGEOM, YDOROG=>YDGEOMETRY%YROROG, YDEPHY=>YDMODEL%YRML_PHY_EC%YREPHY, & & YDPHY=>YDMODEL%YRML_PHY_MF%YRPHY,YDRADF=>YDMODEL%YRML_PHY_RAD%YRRADF, & - & YDAERM7=>YDMODEL%YRML_PHY_AER%YREAEROPT, & ! use this to transfer AOD, SSA and ASY to rad scheme + & YDAERM7=>YDMODEL%YRML_PHY_AER%YREAEROPT,YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO, & ! use this to transfer AOD, SSA and ASY to rad scheme & YDRIP=>YDMODEL%YRML_GCONF%YRRIP, & & YDERAD=>YDMODEL%YRML_PHY_RAD%YRERAD,YGFL=>YDMODEL%YRML_GCONF%YGFL,YDERDI=>YDMODEL%YRML_PHY_RAD%YRERDI, & & YDCHEM=>YDMODEL%YRML_CHEM%YRCHEM, YDSPP_CONFIG=>YDMODEL%YRML_GCONF%YRSPP_CONFIG, YDSPP=>YDMODEL%YRML_SPP) @@ -298,6 +298,7 @@ SUBROUTINE RADDRV(YDGEOMETRY,YDFIELDS,YDMODEL,KGPTOT,KFLDS,KBLOCKS,PGPIN) & NTSW=>YDERAD%NTSW, NLWEMISS=>YDERAD%NLWEMISS, NLWOUT=>YDERAD%NLWOUT, & & RCARDI=>YDERDI%RCARDI, & & NGPTOT=>YDGEM%NGPTOT, & + & AERO_SCHEME=>YDCOMPO%AERO_SCHEME, & & NDIMGMV=>YDGMV%NDIMGMV, NDIMGMVS=>YDGMV%NDIMGMVS, & & DERIVATIVELW=>YDRADF%DERIVATIVELW, EMTC=>YDRADF%EMTC, EMTD=>YDRADF%EMTD, & & SRCDIR=>YDRADF%SRCDIR, SRFDIR=>YDRADF%SRFDIR, SRLWD=>YDRADF%SRLWD, & @@ -664,45 +665,47 @@ SUBROUTINE RADDRV(YDGEOMETRY,YDFIELDS,YDMODEL,KGPTOT,KFLDS,KBLOCKS,PGPIN) ZAEROT(JSTGLO+JL-1,JK,JAER)=GFL(JL,JK,YAERO(JAER)%MP9_PH,IBL) ENDDO ENDDO - ENDDO + ENDDO - IF (NSTEP == YDRIP%NSTART) THEN - DO JAER=1,14 - DO JK=1,NFLEVG - DO JL=IST,IEND - ZAEROTAU(JSTGLO+JL-1,JK,JAER) =0.0_JPRB - ZAEROSSA(JSTGLO+JL-1,JK,JAER) =0.0_JPRB - ZAEROASYM(JSTGLO+JL-1,JK,JAER)=0.0_JPRB - ENDDO - ENDDO - ENDDO - DO JAER=1,16 - DO JK=1,NFLEVG - DO JL=IST,IEND - ZAEROTAULW(JSTGLO+JL-1,JK,JAER)=0.0_JPRB - ENDDO - ENDDO - ENDDO - else DO JAER=1,14 DO JK=1,NFLEVG - DO JL=IST,IEND - ZAEROTAU(JSTGLO+JL-1,JK,JAER) = YDAERM7%M7AOD(JL,JK,JAER,IBL) - ZAEROSSA(JSTGLO+JL-1,JK,JAER) = YDAERM7%M7SSA(JL,JK,JAER,IBL)*YDAERM7%M7AOD(JL,JK,JAER,IBL) - ZAEROASYM(JSTGLO+JL-1,JK,JAER)= YDAERM7%M7ASYM(JL,JK,JAER,IBL)*YDAERM7%M7SSA(JL,JK,JAER,IBL)*YDAERM7%M7AOD(JL,JK,JAER,IBL) - + DO JL=IST,IEND + ZAEROTAU(JSTGLO+JL-1,JK,JAER) =0.0_JPRB + ZAEROSSA(JSTGLO+JL-1,JK,JAER) =0.0_JPRB + ZAEROASYM(JSTGLO+JL-1,JK,JAER)=0.0_JPRB ENDDO ENDDO ENDDO DO JAER=1,16 DO JK=1,NFLEVG - DO JL=IST,IEND - ZAEROTAULW(JSTGLO+JL-1,JK,JAER)=YDAERM7%M7AODLW(JL,JK,JAER,IBL) + DO JL=IST,IEND + ZAEROTAULW(JSTGLO+JL-1,JK,JAER)=0.0_JPRB ENDDO ENDDO - ENDDO - ENDIF - ENDIF + ENDDO + + IF (NSTEP /= YDRIP%NSTART) THEN + IF (TRIM(AERO_SCHEME) == "tm5m7" .or. TRIM(AERO_SCHEME) == "hamm7" ) THEN + DO JAER=1,14 + DO JK=1,NFLEVG + DO JL=IST,IEND + ZAEROTAU(JSTGLO+JL-1,JK,JAER) = YDAERM7%M7AOD(JL,JK,JAER,IBL) + ZAEROSSA(JSTGLO+JL-1,JK,JAER) = YDAERM7%M7SSA(JL,JK,JAER,IBL)*YDAERM7%M7AOD(JL,JK,JAER,IBL) + ZAEROASYM(JSTGLO+JL-1,JK,JAER)= YDAERM7%M7ASYM(JL,JK,JAER,IBL)*YDAERM7%M7SSA(JL,JK,JAER,IBL)*YDAERM7%M7AOD(JL,JK,JAER,IBL) + ENDDO + ENDDO + ENDDO + DO JAER=1,16 + DO JK=1,NFLEVG + DO JL=IST,IEND + ZAEROTAULW(JSTGLO+JL-1,JK,JAER)=YDAERM7%M7AODLW(JL,JK,JAER,IBL) + ENDDO + ENDDO + ENDDO + ENDIF! aero_scheme + ENDIF!nstep + + ENDIF! NACTAERO IF (NCLOUDACT > 0) THEN DO JK=1,NFLEVG diff --git a/ifs-source/arpifs/phys_radi/radintg.F90 b/ifs-source/arpifs/phys_radi/radintg.F90 index 64fb121d..836d787f 100644 --- a/ifs-source/arpifs/phys_radi/radintg.F90 +++ b/ifs-source/arpifs/phys_radi/radintg.F90 @@ -1017,8 +1017,6 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& DO JAERO=1,YDMODEL%YRML_PHY_RAD%YRERAD%NTSW IAE=(JAERO-1)*KLEV - write(*,*) "REPSCAER", REPSCAER - write(*,*) "PAEROTAU", PAEROTAU(IBEG:IEND,1:KLEV,JAERO) ZRGP(1:IL,IHAMAEROAOD+IAE:IHAMAEROAOD+IAE+KLEV-1,IB) =MAX(REPSCAER, PAEROTAU(IBEG:IEND,1:KLEV,JAERO)) ENDDO diff --git a/ifs-source/arpifs/phys_radi/suecrad.F90 b/ifs-source/arpifs/phys_radi/suecrad.F90 index c90b0d60..62c11cf5 100644 --- a/ifs-source/arpifs/phys_radi/suecrad.F90 +++ b/ifs-source/arpifs/phys_radi/suecrad.F90 @@ -333,6 +333,7 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) & NRADE1H=>YDERAD%NRADE1H, NRADE3H=>YDERAD%NRADE3H, NRADNFR=>YDERAD%NRADNFR, & & NRADSFR=>YDERAD%NRADSFR, NSPMAPL=>YDERAD%NSPMAPL, NSPMAPS=>YDERAD%NSPMAPS, & & NSWNL=>YDERAD%NSWNL, NSWTL=>YDERAD%NSWTL, NTSW=>YDERAD%NTSW, & + & AERO_SCHEME=>YDCOMPO%AERO_SCHEME, & & RNS=>YDERAD%RNS, RSIGAIR=>YDERAD%RSIGAIR, & & RCCCL4=>YDERDI%RCCCL4, RCCFC22=>YDERDI%RCCFC22, RCNO2=>YDERDI%RCNO2, & & RSOLINC=>YDERDI%RSOLINC, & @@ -2112,15 +2113,25 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) !* 6. INITIALIZE AEROSOL OPTICAL PARAMETERS AND DISTRIBUTION ! ------------------------------------------------------ - -ALLOCATE(YDAERM7%M7AOD(NPROMA, NFLEVG,NTSW,NGPBLKS)) -ALLOCATE(YDAERM7%M7SSA(NPROMA, NFLEVG,NTSW,NGPBLKS)) -ALLOCATE(YDAERM7%M7ASYM(NPROMA,NFLEVG,NTSW,NGPBLKS)) -ALLOCATE(YDAERM7%M7AODLW(NPROMA, NFLEVG,NTSW,NGPBLKS)) -YDAERM7%M7AOD(:,:,:,:) =0.0_JPRB -YDAERM7%M7SSA(:,:,:,:) =0.0_JPRB -YDAERM7%M7ASYM(:,:,:,:) =0.0_JPRB -YDAERM7%M7AODLW(:,:,:,:) =0.0_JPRB +!*** M7 +write(*,*) "NPROMA",NPROMA +write(*,*) "NFLEVG",NFLEVG +write(*,*) "NTSW",NTSW +write(*,*) "NGPBLKS",NGPBLKS +write(*,*) "AERO_SCHEME",TRIM(AERO_SCHEME) + +IF (NACTAERO > 0) THEN + IF (TRIM(AERO_SCHEME) == "tm5m7" .or. TRIM(AERO_SCHEME) == "hamm7" ) THEN + ALLOCATE(YDAERM7%M7AOD(NPROMA, NFLEVG,NTSW,NGPBLKS)) + ALLOCATE(YDAERM7%M7SSA(NPROMA, NFLEVG,NTSW,NGPBLKS)) + ALLOCATE(YDAERM7%M7ASYM(NPROMA,NFLEVG,NTSW,NGPBLKS)) + ALLOCATE(YDAERM7%M7AODLW(NPROMA, NFLEVG,NTSW,NGPBLKS)) + YDAERM7%M7AOD(:,:,:,:) =0.0_JPRB + YDAERM7%M7SSA(:,:,:,:) =0.0_JPRB + YDAERM7%M7ASYM(:,:,:,:) =0.0_JPRB + YDAERM7%M7AODLW(:,:,:,:) =0.0_JPRB + ENDIF +ENDIF ! - 6.1. PARAMETERS FOR THE STANDARD TEGEN AEROSOL CLIMATOLOGY ! ----------------------------------------------------- From 38e822aba6b4adc447a6f8378a09e63e7d2b95ea Mon Sep 17 00:00:00 2001 From: Lianghai Wu Date: Tue, 23 Jan 2024 13:03:49 +0000 Subject: [PATCH 008/129] configuration issues --- ifs-source/arpifs/module/par_gfl.F90 | 2 +- ifs-source/arpifs/module/yoerad.F90 | 2 -- ifs-source/arpifs/module/yomm7ctl.F90 | 3 +-- ifs-source/arpifs/namelist/naeaer.nam.h | 3 ++- ifs-source/arpifs/namelist/naerad.nam.h | 4 ++-- ifs-source/arpifs/phys_ec/aer_src.F90 | 1 + ifs-source/arpifs/phys_ec/hamm7_interface.F90 | 2 +- ifs-source/arpifs/phys_ec/su_aerw.F90 | 6 +++++- ifs-source/arpifs/phys_radi/suecrad.F90 | 2 +- ifs-source/arpifs/setup/sugfl1.F90 | 14 +++++++------- 10 files changed, 21 insertions(+), 18 deletions(-) diff --git a/ifs-source/arpifs/module/par_gfl.F90 b/ifs-source/arpifs/module/par_gfl.F90 index a5c21714..816061c9 100644 --- a/ifs-source/arpifs/module/par_gfl.F90 +++ b/ifs-source/arpifs/module/par_gfl.F90 @@ -47,7 +47,7 @@ MODULE PAR_GFL INTEGER(KIND=JPIM), PARAMETER :: JPEZDIAG=50 INTEGER(KIND=JPIM), PARAMETER :: JPCH4S=1 INTEGER(KIND=JPIM), PARAMETER :: JPNOGW=2 -INTEGER(KIND=JPIM), PARAMETER :: JPAEROUT=38 +INTEGER(KIND=JPIM), PARAMETER :: JPAEROUT=50 INTEGER(KIND=JPIM), PARAMETER :: JPAEROCLIM=3 INTEGER(KIND=JPIM), PARAMETER :: JPUVP=2 INTEGER(KIND=JPIM), PARAMETER :: JPPHYS=9 diff --git a/ifs-source/arpifs/module/yoerad.F90 b/ifs-source/arpifs/module/yoerad.F90 index 9b9c4373..e695092d 100644 --- a/ifs-source/arpifs/module/yoerad.F90 +++ b/ifs-source/arpifs/module/yoerad.F90 @@ -142,9 +142,7 @@ MODULE YOERAD ! Look-up table for Planck function in emissivity intervals TYPE(TSPECTRALPLANCK) :: YSPECTPLANCK - INTEGER :: NCLOUDACT - INTEGER :: NAEROOPT !---------------------------------------------------------------------------- diff --git a/ifs-source/arpifs/module/yomm7ctl.F90 b/ifs-source/arpifs/module/yomm7ctl.F90 index 4c0e44e0..87d2b6eb 100644 --- a/ifs-source/arpifs/module/yomm7ctl.F90 +++ b/ifs-source/arpifs/module/yomm7ctl.F90 @@ -42,7 +42,6 @@ MODULE YOMM7CTL END TYPE TM7CTL -!TYPE(TM7CTL), POINTER :: YRM7CTL => NULL() -TYPE(TM7CTL) :: YRM7CTL +TYPE(TM7CTL), TARGET :: YRM7CTL END MODULE YOMM7CTL diff --git a/ifs-source/arpifs/namelist/naeaer.nam.h b/ifs-source/arpifs/namelist/naeaer.nam.h index d512fdac..2839885b 100644 --- a/ifs-source/arpifs/namelist/naeaer.nam.h +++ b/ifs-source/arpifs/namelist/naeaer.nam.h @@ -12,7 +12,7 @@ ! ----------------------------------------------------------------- NAMELIST/NAEAER/& & LEPAERO , LAERCLIMG, LAERCLIMZ, LAERCLIST, LAERDRYDP, LAERELVS , LAEREXTR , & - & LAERGBUD , LAERHYGRO, LAERNGAT , LAERPRNT , LAERSEDIM, LAERSEDIMSS,& + & LAERGBUD , LAERHYGRO, LAERNGAT , LAERPRNT , LAERSCAV, LAERSEDIM, LAERSEDIMSS,& & LAERSURF , LAERGTOP , LAER6SDIA, LAERCCN , LAERINIT , & & LAERCSTR , LAERRRTM , LAERDIAG1, LAERDIAG2, LAERUVP , LAERVOL , & & LAEROMIN , LOCNDMS , & @@ -22,6 +22,7 @@ NAMELIST/NAEAER/& & NDRYDEP , NDUSRCP , & & RAERDUB , RDDUAER , RFCTDUR , RFCTSSR , RLATVOL , RLONVOL , & & RSUCV1 , RSUCV2 , & + & LAERSCAV_CHEM , LAERSOA_CHEM, LDRYDEPVEL_DYN, & & NAERSCAV , LSEASALT_RH80, NDRYDEPVEL_DYN, RAERDUST_REBOUND,& & LAERDUSTSOURCE, LAERDUST_NEWBIN, YAERO_DESC, NSO4SCHEME, & & NAER_BLNUCL, LAERDUSTSIZEVAR diff --git a/ifs-source/arpifs/namelist/naerad.nam.h b/ifs-source/arpifs/namelist/naerad.nam.h index f66ed9b2..33d4b00c 100644 --- a/ifs-source/arpifs/namelist/naerad.nam.h +++ b/ifs-source/arpifs/namelist/naerad.nam.h @@ -43,7 +43,7 @@ NAMELIST/NAERAD/& &, NSOLARSPECTRUM, NSWWVCONTINUUM, NDUMPBADINPUTS, LINTERPINCLOUDMEAN & &, NCLOUDOVERLAP, NDUMPINPUTS & &, RCLOUD_SEPARATION_SCALE_TOA, RCLOUD_SEPARATION_SCALE_SURF & -&, CGHGCLIMFILE, CGHGTIMESERIESFILE, CSOLARIRRADIANCEFILE - +&, CGHGCLIMFILE, CGHGTIMESERIESFILE, CSOLARIRRADIANCEFILE & +&, NCLOUDACT, NAEROOPT ! ----------------------------------------------------------------- diff --git a/ifs-source/arpifs/phys_ec/aer_src.F90 b/ifs-source/arpifs/phys_ec/aer_src.F90 index 54cdcddc..790e5d4d 100644 --- a/ifs-source/arpifs/phys_ec/aer_src.F90 +++ b/ifs-source/arpifs/phys_ec/aer_src.F90 @@ -348,6 +348,7 @@ SUBROUTINE AER_SRC & & LAERDUST_NEWBIN=>YDEAERATM%LAERDUST_NEWBIN, & & LAERDUSTSIZEVAR=>YDEAERATM%LAERDUSTSIZEVAR, & & LAERDUSTSOURCE=>YDEAERATM%LAERDUSTSOURCE, & + & LAERSOA_CHEM=>YDEAERATM%LAERSOA_CHEM, & & LAERCHEM=>YGFL%LAERCHEM) diff --git a/ifs-source/arpifs/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/phys_ec/hamm7_interface.F90 index 0f76ec5f..bca8314e 100755 --- a/ifs-source/arpifs/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/phys_ec/hamm7_interface.F90 @@ -462,7 +462,7 @@ SUBROUTINE HAMM7_INTERFACE & & LAERCLIMZ=>YREAERATM%LAERCLIMZ, LAERGTOP=>YREAERATM%LAERGTOP, & & LAERHYGRO=>YREAERATM%LAERHYGRO, LAERLISI=>YREAERATM%LAERLISI, & & LAERNGAT=>YREAERATM%LAERNGAT, LAERSCAV=>YREAERATM%LAERSCAV, & - & LAERNITRATE => YREAERATM%LAERNITRATE, & + & LAERNITRATE => YRCOMPO%LAERNITRATE, & & LAERSCAV_CHEM=>YREAERATM%LAERSCAV_CHEM, LAERVOL=>YREAERATM%LAERVOL, & & LAERCHEM=>YGFL%LAERCHEM, & ! & NINDSCAV=>YREAERATM%NINDSCAV, NTSCAV=>YREAERATM%NTSCAV, & diff --git a/ifs-source/arpifs/phys_ec/su_aerw.F90 b/ifs-source/arpifs/phys_ec/su_aerw.F90 index b178ec94..58d09a03 100644 --- a/ifs-source/arpifs/phys_ec/su_aerw.F90 +++ b/ifs-source/arpifs/phys_ec/su_aerw.F90 @@ -101,7 +101,7 @@ SUBROUTINE SU_AERW(YDMODEL) & LAEREXTR, LAERGBUD, LAERHYGRO, LAERLISI, LAERNGAT, LAERPRNT, LAERSCAV, & & LAERSEDIM, LAERSURF, LAERGTOP, LAER6SDIA, LAERCCN, LAERSEDIMSS, & & LAERINIT, LAERCSTR, LAERRRTM, LAERDIAG1, LAERDIAG2, LAERUVP, LUVINDX, & - & LAERVOL, LAERCALIP, LEPAERO, LAEROMIN, LOCNDMS ,LAERSCAV_CHEM, LDRYDEPVEL_DYN, & + & LAERVOL, LAERCALIP, LEPAERO, LAEROMIN, LOCNDMS ,LAERSCAV_CHEM,LAERSOA_CHEM, LDRYDEPVEL_DYN, & & LSEASALT_RH80, LAERDUSTSOURCE, LAERDUST_NEWBIN, LAERDUSTSIZEVAR INTEGER(KIND=JPIM), POINTER :: NAERCONF, NXT3DAER, NINIDAY, NBCOPTP,& @@ -193,6 +193,7 @@ SUBROUTINE SU_AERW(YDMODEL) NSUOPTP => YDEAERATM%NSUOPTP NVISWL => YDEAERATM%NVISWL LAERSCAV_CHEM => YDEAERATM%LAERSCAV_CHEM +LAERSOA_CHEM => YDEAERATM%LAERSOA_CHEM NAERSCAV => YDEAERATM%NAERSCAV LSEASALT_RH80=> YDEAERATM%LSEASALT_RH80 NTYPAER => YDEAERATM%NTYPAER @@ -311,6 +312,9 @@ SUBROUTINE SU_AERW(YDMODEL) LAERGTOP =.FALSE. LAERHYGRO=.FALSE. LAERNGAT =.FALSE. + LAERSCAV=.FALSE. + LAERSCAV_CHEM =.FALSE. + LAERSOA_CHEM =.FALSE. NAERSCAV = 0 LAERDUSTSOURCE =.FALSE. LAERDUST_NEWBIN =.FALSE. diff --git a/ifs-source/arpifs/phys_radi/suecrad.F90 b/ifs-source/arpifs/phys_radi/suecrad.F90 index 62c11cf5..f9227e72 100644 --- a/ifs-source/arpifs/phys_radi/suecrad.F90 +++ b/ifs-source/arpifs/phys_radi/suecrad.F90 @@ -773,7 +773,7 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) ELSE NAERMACC=0 ENDIF -LAER3D=.TRUE. !T=3d CAMS aerosol climatology +LAER3D=.FALSE. !T=3d CAMS aerosol climatology NMCLAT=1 diff --git a/ifs-source/arpifs/setup/sugfl1.F90 b/ifs-source/arpifs/setup/sugfl1.F90 index f9f6bcb9..140fd3e6 100644 --- a/ifs-source/arpifs/setup/sugfl1.F90 +++ b/ifs-source/arpifs/setup/sugfl1.F90 @@ -77,7 +77,7 @@ SUBROUTINE SUGFL1(YDMODEL,KGFLCONF) USE YOM_YGFL , ONLY : JPCHEM_ASSIM, JPGHG_ASSIM, TYPE_GFL_NAML USE YOMANEB , ONLY : NGRBCHEM, NGRBGHGASSIM USE YOE_AERODIAG, ONLY : TYPE_AERO_WVL_DIAG -!USE YOMM7CTL , ONLY : YRM7CTL !!! M7, not sure where needed +USE YOMM7CTL , ONLY : YRM7CTL !!! M7, not sure where needed USE ARPCLIM_CHEM_MODULE #if defined(__PGI) @@ -229,9 +229,9 @@ SUBROUTINE SUGFL1(YDMODEL,KGFLCONF) KGHG_CHEMTEND_CH4=> YDCOMPO%KGHG_CHEMTEND_CH4 ! Associate pointers for variables in namelist NAMM7CTL, not sure where needed -!NWATER => YRM7CTL%NWATER -!NSNUCL => YRM7CTL%NSNUCL -!NONUCL => YRM7CTL%NONUCL +NWATER => YRM7CTL%NWATER +NSNUCL => YRM7CTL%NSNUCL +NONUCL => YRM7CTL%NONUCL ! Associate pointers for variables in namelist NAMCHEM LCHEM_LIGHT => YDCHEM%LCHEM_LIGHT @@ -674,9 +674,9 @@ SUBROUTINE SUGFL1(YDMODEL,KGFLCONF) ! M7CTL namelist, not sure where needed -!NWATER=1 -!NSNUCL=2 -!NONUCL=1 +NWATER=1 +NSNUCL=2 +NONUCL=1 ! From 9e557e2d0a36364bb2fe24321388d3d73749a5db Mon Sep 17 00:00:00 2001 From: Vincent Huijnen Date: Mon, 12 Feb 2024 10:27:16 +0000 Subject: [PATCH 009/129] include logical to test if photolyis initialization was run --- ifs-source/arpifs/chem/tm5_chem_ini.F90 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ifs-source/arpifs/chem/tm5_chem_ini.F90 b/ifs-source/arpifs/chem/tm5_chem_ini.F90 index e6df0636..98eb89c6 100644 --- a/ifs-source/arpifs/chem/tm5_chem_ini.F90 +++ b/ifs-source/arpifs/chem/tm5_chem_ini.F90 @@ -290,7 +290,8 @@ SUBROUTINE PHOTOLYSIS_INI & XS_O3_LOOK,XS_HNO3_LOOK,XS_PAN_LOOK,QY_O3_LOOK,XS_H2O2_LOOK, & & XS_N2O5_LOOK,XS_NO2_LOOK,QY_NO2_LOOK,QY_CO_LOOK,XS_NO3_LOOK, XS_CH2O_LOOK, & & A1_ACET,A2_ACET,A3_ACET,A4_ACET, & - & SCA,ABS_EFF, GFAC, EXT , PN_REF + & SCA,ABS_EFF, GFAC, EXT , PN_REF, & + & LL_TM5_PHOTO_INI USE YOMLUN , ONLY : NULOUT USE PARKIND1 , ONLY : JPIM ,JPRB @@ -529,6 +530,7 @@ SUBROUTINE PHOTOLYSIS_INI !VH - file format(6(1X,F7.5)) WRITE(NULOUT,*) 'INFO tm5_chem_ini: Finished reading TM5 photolysis input files ' +LL_TM5_PHOTO_INI=.TRUE. IF (LHOOK) CALL DR_HOOK('TM5_CHEM_INI:PHOTOLYSIS_INI',1,ZHOOK_HANDLE) From 0e664015f62bddea7fd3dd642f830d1094c0b25e Mon Sep 17 00:00:00 2001 From: Vincent Huijnen Date: Mon, 12 Feb 2024 10:29:18 +0000 Subject: [PATCH 010/129] increase number of available fields --- ifs-source/arpifs/module/par_gfl.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ifs-source/arpifs/module/par_gfl.F90 b/ifs-source/arpifs/module/par_gfl.F90 index 816061c9..8e958d47 100644 --- a/ifs-source/arpifs/module/par_gfl.F90 +++ b/ifs-source/arpifs/module/par_gfl.F90 @@ -40,7 +40,7 @@ MODULE PAR_GFL INTEGER(KIND=JPIM), PARAMETER :: JPCHEM=220 INTEGER(KIND=JPIM), PARAMETER :: JPGHG_ASSIM=2 INTEGER(KIND=JPIM), PARAMETER :: JPCHEM_ASSIM=6 -INTEGER(KIND=JPIM), PARAMETER :: JPAERO=42 +INTEGER(KIND=JPIM), PARAMETER :: JPAERO=52 INTEGER(KIND=JPIM), PARAMETER :: JPFORC=1100 INTEGER(KIND=JPIM), PARAMETER :: JPERA40=14 INTEGER(KIND=JPIM), PARAMETER :: JPSLDIA=7 From fc77ccee703098fba3c224f7006a5de02789c488 Mon Sep 17 00:00:00 2001 From: Vincent Huijnen Date: Mon, 12 Feb 2024 10:30:04 +0000 Subject: [PATCH 011/129] increase nr fields, part 2 --- ifs-source/arpifs/module/parfpos.F90 | 4 +- ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 | 56 ++++++++++---------- ifs-source/arpifs/phys_ec/aerini_layer.F90 | 56 ++++++++++---------- 3 files changed, 58 insertions(+), 58 deletions(-) diff --git a/ifs-source/arpifs/module/parfpos.F90 b/ifs-source/arpifs/module/parfpos.F90 index b7bb6fd3..5375070c 100644 --- a/ifs-source/arpifs/module/parfpos.F90 +++ b/ifs-source/arpifs/module/parfpos.F90 @@ -90,7 +90,7 @@ MODULE PARFPOS INTEGER(KIND=JPIM), PARAMETER :: JPOSGHGFLX=6 INTEGER(KIND=JPIM), PARAMETER :: JPOSCHEM=150 INTEGER(KIND=JPIM), PARAMETER :: JPOSCHEMFLX=50 -INTEGER(KIND=JPIM), PARAMETER :: JPOSAERO=42 +INTEGER(KIND=JPIM), PARAMETER :: JPOSAERO=50 INTEGER(KIND=JPIM), PARAMETER :: JPOSAERO2=2*JPOSAERO INTEGER(KIND=JPIM), PARAMETER :: JPOSAERODIAG=8 INTEGER(KIND=JPIM), PARAMETER :: JPOSAEROCLIM=3 @@ -103,7 +103,7 @@ MODULE PARFPOS INTEGER(KIND=JPIM), PARAMETER :: JPOSAERLISI_VAR=6 INTEGER(KIND=JPIM), PARAMETER :: JPOSAERLISI_WVL=3 INTEGER(KIND=JPIM), PARAMETER :: JPOSAERLISI=JPOSAERLISI_VAR*JPOSAERLISI_WVL -INTEGER(KIND=JPIM), PARAMETER :: JPOSAEROUT=38 +INTEGER(KIND=JPIM), PARAMETER :: JPOSAEROUT=50 INTEGER(KIND=JPIM), PARAMETER :: JPOSAOD=9 INTEGER(KIND=JPIM), PARAMETER :: JPOSPM=3 INTEGER(KIND=JPIM), PARAMETER :: JPOSUVP=2 diff --git a/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 b/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 index e2b01bb8..7b496aee 100644 --- a/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 +++ b/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 @@ -208,34 +208,34 @@ SUBROUTINE AER_PHY3_LAYER(YDSURF, & ENDDO ENDDO - CALL HAMM7_INTERFACE & - &( YDMODEL, & - & KDIM%KIDIA , KDIM%KFDIA , KDIM%KLON , KDIM%KTDIA , KDIM%KLEV , KDIM%KTILES , & - & KDIM%KFLDX , KDIM%KLEVX, & - & GEMSL%ITRAC , GEMSL%IAERO , GEMSL%ICHEM, KDIM%KSTGLO, PAUX%PGEOMH,& - & PAUX%PRS1 , PAUX%PRSF1 , GEMSL%ZAEROP, GEMSL%ZCAERO, GEMSL%ZCEN , PAUX%PAPHIF, & - & FLUX%PFPLCL , FLUX%PFPLCN , FLUX%PFPLSL , FLUX%PFPLSN , PAUX%PGELAT, PAUX%PGELAM, & - & STATE%A , STATE%CLD(:,:,NCLDQI), STATE%CLD(:,:,NCLDQL), STATE%CLD(:,:,NCLDQR), & - & STATE%CLD(:,:,NCLDQS), PDIAG%PCOVPTOT, PDIAG%ZLU , & - & ZO3 , STATE%Q , STATE%T , ZTH , GEMSL%ZTENC , GEMSL%ZCFLX , & - & GEMSL%ZAERDDP, GEMSL%ZAERSDM, GEMSL%ZAERSRC, GEMSL%ZAERWS , GEMSL%ZAERGUST , GEMSL%ZAERUST, GEMSL%ZAERMAP, & - & GEMSL%ZCLAERS, GEMSL%ZPRAERS, PCHEM2AER, & - & SURFL%ZALBD , SURFL%ZFRTI , PSURF%PSD_VF(:,YSD_VF%YLSM%MP) , & - & ZSNM , AUXL%ZWND , PSURF%PSP_SB(:,1,YSP_SB%YQ%MP9) , & - & GEMSL%ZAERFLX, GEMSL%ZAERLIF, & - & FLUX%PAERODDF, TSPHY , PGFL , & -!VH total optical depth output... - & PSURF%PSD_VD(:,YSD_VD%YODTOACC%MP), & - & ZAERO_WVL_DIAG, & - !& PSURF%PSD_VD(:,YSD_VD%YODTO469%MP), PSURF%PSD_VD(:,YSD_VD%YODTO670%MP), & - !& PSURF%PSD_VD(:,YSD_VD%YODTO865%MP), PSURF%PSD_VD(:,YSD_VD%YODTO1240%MP), & - & GEMSL%ZAEROTAU, GEMSL%ZAEROSSA,GEMSL%ZAEROASY, GEMSL%ZAEROTAULW,& -!VH Variables ZTAUS_AER etc ideally convoluted with GEMSL%ZAERTAULT, or similar. - & ZTAUS_AER , ZTAUA_AER, ZPMAER, & -!VH - & PSURF%PSD_XA, PAUX%PVERVEL, AUXL%ZCCNL, AUXL%ZCCNO, PSURF%PAHFSTI, PSURF%PSD_VF(:,YSD_VF%YCI%MP), GEMSL%ZAZ0M, FLUX%PFTLHEV, & - & STATE%U, STATE%V, PSURF%PCVL, PSURF%PCVH,PSURF%PSD_VF(:,YSD_VF%YSO2DD%MP), PAUX%PGEMU)!,ZTSO2,ZTSO4,ZTSO4_AQ,ZFSO2,ZFSO4 ,ZFSO4_AQ& - !&) !eehol: u-wind,v-wind,low veg. cover, high veg. cover, sine of latitude +!VH CALL HAMM7_INTERFACE & +!VH &( YDMODEL, & +!VH & KDIM%KIDIA , KDIM%KFDIA , KDIM%KLON , KDIM%KTDIA , KDIM%KLEV , KDIM%KTILES , & +!VH & KDIM%KFLDX , KDIM%KLEVX, & +!VH & GEMSL%ITRAC , GEMSL%IAERO , GEMSL%ICHEM, KDIM%KSTGLO, PAUX%PGEOMH,& +!VH & PAUX%PRS1 , PAUX%PRSF1 , GEMSL%ZAEROP, GEMSL%ZCAERO, GEMSL%ZCEN , PAUX%PAPHIF, & +!VH & FLUX%PFPLCL , FLUX%PFPLCN , FLUX%PFPLSL , FLUX%PFPLSN , PAUX%PGELAT, PAUX%PGELAM, & +!VH & STATE%A , STATE%CLD(:,:,NCLDQI), STATE%CLD(:,:,NCLDQL), STATE%CLD(:,:,NCLDQR), & +!VH & STATE%CLD(:,:,NCLDQS), PDIAG%PCOVPTOT, PDIAG%ZLU , & +!VH & ZO3 , STATE%Q , STATE%T , ZTH , GEMSL%ZTENC , GEMSL%ZCFLX , & +!VH & GEMSL%ZAERDDP, GEMSL%ZAERSDM, GEMSL%ZAERSRC, GEMSL%ZAERWS , GEMSL%ZAERGUST , GEMSL%ZAERUST, GEMSL%ZAERMAP, & +!VH & GEMSL%ZCLAERS, GEMSL%ZPRAERS, PCHEM2AER, & +!VH & SURFL%ZALBD , SURFL%ZFRTI , PSURF%PSD_VF(:,YSD_VF%YLSM%MP) , & +!VH & ZSNM , AUXL%ZWND , PSURF%PSP_SB(:,1,YSP_SB%YQ%MP9) , & +!VH & GEMSL%ZAERFLX, GEMSL%ZAERLIF, & +!VH & FLUX%PAERODDF, TSPHY , PGFL , & +!VH!VH total optical depth output... +!VH & PSURF%PSD_VD(:,YSD_VD%YODTOACC%MP), & +!VH & ZAERO_WVL_DIAG, & +!VH !& PSURF%PSD_VD(:,YSD_VD%YODTO469%MP), PSURF%PSD_VD(:,YSD_VD%YODTO670%MP), & +!VH !& PSURF%PSD_VD(:,YSD_VD%YODTO865%MP), PSURF%PSD_VD(:,YSD_VD%YODTO1240%MP), & +!VH & GEMSL%ZAEROTAU, GEMSL%ZAEROSSA,GEMSL%ZAEROASY, GEMSL%ZAEROTAULW,& +!VH!VH Variables ZTAUS_AER etc ideally convoluted with GEMSL%ZAERTAULT, or similar. +!VH & ZTAUS_AER , ZTAUA_AER, ZPMAER, & +!VH!VH +!VH & PSURF%PSD_XA, PAUX%PVERVEL, AUXL%ZCCNL, AUXL%ZCCNO, PSURF%PAHFSTI, PSURF%PSD_VF(:,YSD_VF%YCI%MP), GEMSL%ZAZ0M, FLUX%PFTLHEV, & +!VH & STATE%U, STATE%V, PSURF%PCVL, PSURF%PCVH,PSURF%PSD_VF(:,YSD_VF%YSO2DD%MP), PAUX%PGEMU)!,ZTSO2,ZTSO4,ZTSO4_AQ,ZFSO2,ZFSO4 ,ZFSO4_AQ& +!VH !&) !eehol: u-wind,v-wind,low veg. cover, high veg. cover, sine of latitude DO JAER=1,14 diff --git a/ifs-source/arpifs/phys_ec/aerini_layer.F90 b/ifs-source/arpifs/phys_ec/aerini_layer.F90 index 9844b0e9..6fb883f8 100644 --- a/ifs-source/arpifs/phys_ec/aerini_layer.F90 +++ b/ifs-source/arpifs/phys_ec/aerini_layer.F90 @@ -198,34 +198,34 @@ SUBROUTINE AERINI_LAYER(YDGEOMETRY,YDSURF,& ! all other processes are still handled by the TM5-M7 code CASE ("tm5m7", "hamm7") - CALL TM5M7_PHY2 & - &( YDGEOMETRY, YDMODEL, KDIM%KIDIA, KDIM%KFDIA, KDIM%KLON , KDIM%KTDIA, KDIM%KLEV, KDIM%KFLDX , KDIM%KLEVX,& - & KDIM%KTILES, KDIM%KSTGLO, GEMSL%ITRAC, GEMSL%IAERO, NSW,& - & PAUX%PRS1 , PAUX%PRSF1, PAUX%PAPHI, STATE%T , PAUX%PVERVEL, GEMSL%ZCEN , PAUX%PGEOMH,& - & PSURF%PSD_VD(:,YSD_VD%YALB%MP), SURFL%ZALBD, PSURF%PSD_VF(:,YSD_VF%YALUVD%MP),& - & PSURF%PSD_VF(:,YSD_VF%YAERDEP%MP),PSURF%PSD_VF(:,YSD_VF%YAERLTS%MP),PSURF%PSD_VF(:,YSD_VF%YAERSCC%MP),& - & GEMSL%ZAERWS, GEMSL%ZAERGUST, GEMSL%ZAERUST,& - & PSURF%PSD_VF(:,YSD_VF%YBCBF%MP), PSURF%PSD_VF(:,YSD_VF%YBCFF%MP), PSURF%PSD_VF(:,YSD_VF%YBCGF%MP),& - & PSURF%PSD_VF(:,YSD_VF%YOMBF%MP), PSURF%PSD_VF(:,YSD_VF%YOMFF%MP), PSURF%PSD_VF(:,YSD_VF%YOMGF%MP),& - & PSURF%PSD_VF(:,YSD_VF%YSO2L%MP), PSURF%PSD_VF(:,YSD_VF%YSO2H%MP), PSURF%PSD_VF(:,YSD_VF%YSO2DD%MP),& - & PSURF%PSD_VF(:,YSD_VF%YSOGF%MP),& - & PSURF%PSD_VF(:,YSD_VF%YVOLC%MP), PSURF%PSD_VF(:,YSD_VF%YVOLE%MP), PSURF%PSD_VF(:,YSD_VF%YSOA%MP) ,& - & PSURF%PSD_VF(:,YSD_VF%YSOACO%MP),PSURF%PSD_VF(:,YSD_VF%YDMSO%MP), PSURF%PSD_VF(:,YSD_VF%YSOILTYPE%MP), & - !TB added lake cover: YCLK, !!!PSP_SG 2 dims becomes now 3 dims - & PSURF%PSD_VF(:,YSD_VF%YCI%MP), PSURF%PSD_VF(:,YSD_VF%YCLK%MP) , PSURF%PSD_VF(:,YSD_VF%YINJF%MP) , PSURF%PSD_VD(:,YSD_VD%YBLH%MP) ,& - & SURFL%ZFRTI, PSURF%PSD_VF(:,YSD_VF%YLSM%MP) , PSURF%PSD_VF(:,YSD_VF%YSST%MP), STATE%Q, & - & PSURF%PSP_SG(:,1,YSP_SG%YF%MP9) , PSURF%PSP_RR(:,YSP_RR%YT%MP9) , PAUX%PGELAM, PAUX%PGELAT, PAUX%PGEMU, SURFL%ZHSDFOR,& - & STATE%U(:,KDIM%KLEV) , STATE%V(:,KDIM%KLEV) , PSURF%PSP_SB(:,1,YSP_SB%YQ%MP9), TSPHY, GEMSL%ZAZ0M,& - & GEMSL%ICHEM,& - !VH - Introduce Land use info... - & PSURF%PCVL, PSURF%PCVH,PSURF%ITVL,PSURF%ITVH, & - & PSURF%PAHFSTI, &!!!FLUX%PFTLHEV, & - !VH - end - & GEMSL%ZCFLX, GEMSL%ZTENC,& - & GEMSL%ZDMSO, GEMSL%ZLDAY, GEMSL%ZLISS, GEMSL%ZSO2, GEMSL%ZTDMS,& - & GEMSL%ZAERDDP, GEMSL%ZAERSDM, GEMSL%ZAERSRC, GEMSL%ZAERMAP, GEMSL%ZAERFLX, GEMSL%ZAERLIF,& - & GEMSL%ZDMSI, GEMSL%ZODMS, PSURF%PSD_XA, & - &PSO4SRC,PSO2SRC) +!VH CALL TM5M7_PHY2 & +!VH &( YDGEOMETRY, YDMODEL, KDIM%KIDIA, KDIM%KFDIA, KDIM%KLON , KDIM%KTDIA, KDIM%KLEV, KDIM%KFLDX , KDIM%KLEVX,& +!VH & KDIM%KTILES, KDIM%KSTGLO, GEMSL%ITRAC, GEMSL%IAERO, NSW,& +!VH & PAUX%PRS1 , PAUX%PRSF1, PAUX%PAPHI, STATE%T , PAUX%PVERVEL, GEMSL%ZCEN , PAUX%PGEOMH,& +!VH & PSURF%PSD_VD(:,YSD_VD%YALB%MP), SURFL%ZALBD, PSURF%PSD_VF(:,YSD_VF%YALUVD%MP),& +!VH & PSURF%PSD_VF(:,YSD_VF%YAERDEP%MP),PSURF%PSD_VF(:,YSD_VF%YAERLTS%MP),PSURF%PSD_VF(:,YSD_VF%YAERSCC%MP),& +!VH & GEMSL%ZAERWS, GEMSL%ZAERGUST, GEMSL%ZAERUST,& +!VH & PSURF%PSD_VF(:,YSD_VF%YBCBF%MP), PSURF%PSD_VF(:,YSD_VF%YBCFF%MP), PSURF%PSD_VF(:,YSD_VF%YBCGF%MP),& +!VH & PSURF%PSD_VF(:,YSD_VF%YOMBF%MP), PSURF%PSD_VF(:,YSD_VF%YOMFF%MP), PSURF%PSD_VF(:,YSD_VF%YOMGF%MP),& +!VH & PSURF%PSD_VF(:,YSD_VF%YSO2L%MP), PSURF%PSD_VF(:,YSD_VF%YSO2H%MP), PSURF%PSD_VF(:,YSD_VF%YSO2DD%MP),& +!VH & PSURF%PSD_VF(:,YSD_VF%YSOGF%MP),& +!VH & PSURF%PSD_VF(:,YSD_VF%YVOLC%MP), PSURF%PSD_VF(:,YSD_VF%YVOLE%MP), PSURF%PSD_VF(:,YSD_VF%YSOA%MP) ,& +!VH & PSURF%PSD_VF(:,YSD_VF%YSOACO%MP),PSURF%PSD_VF(:,YSD_VF%YDMSO%MP), PSURF%PSD_VF(:,YSD_VF%YSOILTYPE%MP), & +!VH !TB added lake cover: YCLK, !!!PSP_SG 2 dims becomes now 3 dims +!VH & PSURF%PSD_VF(:,YSD_VF%YCI%MP), PSURF%PSD_VF(:,YSD_VF%YCLK%MP) , PSURF%PSD_VF(:,YSD_VF%YINJF%MP) , PSURF%PSD_VD(:,YSD_VD%YBLH%MP) ,& +!VH & SURFL%ZFRTI, PSURF%PSD_VF(:,YSD_VF%YLSM%MP) , PSURF%PSD_VF(:,YSD_VF%YSST%MP), STATE%Q, & +!VH & PSURF%PSP_SG(:,1,YSP_SG%YF%MP9) , PSURF%PSP_RR(:,YSP_RR%YT%MP9) , PAUX%PGELAM, PAUX%PGELAT, PAUX%PGEMU, SURFL%ZHSDFOR,& +!VH & STATE%U(:,KDIM%KLEV) , STATE%V(:,KDIM%KLEV) , PSURF%PSP_SB(:,1,YSP_SB%YQ%MP9), TSPHY, GEMSL%ZAZ0M,& +!VH & GEMSL%ICHEM,& +!VH !VH - Introduce Land use info... +!VH & PSURF%PCVL, PSURF%PCVH,PSURF%ITVL,PSURF%ITVH, & +!VH & PSURF%PAHFSTI, &!!!FLUX%PFTLHEV, & +!VH !VH - end +!VH & GEMSL%ZCFLX, GEMSL%ZTENC,& +!VH & GEMSL%ZDMSO, GEMSL%ZLDAY, GEMSL%ZLISS, GEMSL%ZSO2, GEMSL%ZTDMS,& +!VH & GEMSL%ZAERDDP, GEMSL%ZAERSDM, GEMSL%ZAERSRC, GEMSL%ZAERMAP, GEMSL%ZAERFLX, GEMSL%ZAERLIF,& +!VH & GEMSL%ZDMSI, GEMSL%ZODMS, PSURF%PSD_XA, & +!VH &PSO4SRC,PSO2SRC) CASE ("aer") From 83c8c4b0fd042a3f73cd34bd039d26bba194cd2d Mon Sep 17 00:00:00 2001 From: Vincent Huijnen Date: Mon, 12 Feb 2024 10:39:27 +0000 Subject: [PATCH 012/129] Revert to original coupling with optical depth computation --- ifs-source/arpifs/chem/chem_bascoetm5.F90 | 13 +- ifs-source/arpifs/chem/chem_tm5.F90 | 12 +- ifs-source/arpifs/chem/tm5_glomap_aerosol.F90 | 160 ++++++++++++++++++ ifs-source/arpifs/chem/tm5_macc_aerosol.F90 | 11 +- 4 files changed, 174 insertions(+), 22 deletions(-) create mode 100644 ifs-source/arpifs/chem/tm5_glomap_aerosol.F90 diff --git a/ifs-source/arpifs/chem/chem_bascoetm5.F90 b/ifs-source/arpifs/chem/chem_bascoetm5.F90 index d1cdd779..fff33ead 100644 --- a/ifs-source/arpifs/chem/chem_bascoetm5.F90 +++ b/ifs-source/arpifs/chem/chem_bascoetm5.F90 @@ -374,7 +374,7 @@ SUBROUTINE CHEM_BASCOETM5 & #include "tm5_boundary_ch4.intfb.h" #include "tm5_calrates.intfb.h" #include "tm5_eqsam.intfb.h" -!#include "tm5_glomap_aerosol.intfb.h" +#include "tm5_glomap_aerosol.intfb.h" #include "tm5_macc_aerosol.intfb.h" #include "tm5_ibud.intfb.h" #include "tm5_o3s.intfb.h" @@ -391,7 +391,6 @@ SUBROUTINE CHEM_BASCOETM5 & IF (LHOOK) CALL DR_HOOK('CHEM_BASCOETM5',0,ZHOOK_HANDLE ) ASSOCIATE(YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO,YDERDI=>YDMODEL%YRML_PHY_RAD%YRERDI, & & YDCHEM=>YDMODEL%YRML_CHEM%YRCHEM, YDEAERSNK=>YDMODEL%YRML_PHY_AER%YREAERSNK, & - & YDEAERVOL=>YDMODEL%YRML_PHY_AER%YREAERVOL, & & YDEAERSRC=>YDMODEL%YRML_PHY_AER%YREAERSRC, YDEAERATM=>YDMODEL%YRML_PHY_RAD%YREAERATM, & & YDECLD=>YDMODEL%YRML_PHY_EC%YRECLD, & & YGFL=>YDMODEL%YRML_GCONF%YGFL, YDRIP=>YDMODEL%YRML_GCONF%YRRIP, & @@ -819,15 +818,13 @@ SUBROUTINE CHEM_BASCOETM5 & IF ( LCHEM_AEROI ) THEN IF (TRIM(AERO_SCHEME)=="aer" )THEN ! * from MACC fields - CALL TM5_MACC_AEROSOL(YDEAERSNK,YDEAERVOL,YDEAERATM, KIDIA,KFDIA,KLON,KLEV, KAERO, & + CALL TM5_MACC_AEROSOL(KIDIA,KFDIA,KLON,KLEV, KAERO, & & PRS1 , PAEROP , ZRHCL , & & ZTAUS_AER,ZTAUA_AER,ZPMAER) ELSEIF (TRIM(AERO_SCHEME)=="glomap") THEN - - WRITE(NULERR,*)'Not a valid Aerosol interaction scheme:',TRIM(AERO_SCHEME) - !CALL TM5_GLOMAP_AEROSOL(KIDIA,KFDIA,KLON,KLEV, & - !& PAERAOT, PAERAAOT, PAERASY, & - !& ZTAUS_AER,ZTAUA_AER,ZPMAER) + CALL TM5_GLOMAP_AEROSOL(KIDIA,KFDIA,KLON,KLEV, & + & PAERAOT, PAERAAOT, PAERASY, & + & ZTAUS_AER,ZTAUA_AER,ZPMAER) ELSE WRITE(NULERR,*)'No valid Aerosol interaction available:',LCHEM_AEROI,TRIM(AERO_SCHEME) ENDIF diff --git a/ifs-source/arpifs/chem/chem_tm5.F90 b/ifs-source/arpifs/chem/chem_tm5.F90 index 034e3609..24b94280 100644 --- a/ifs-source/arpifs/chem/chem_tm5.F90 +++ b/ifs-source/arpifs/chem/chem_tm5.F90 @@ -305,7 +305,7 @@ SUBROUTINE CHEM_TM5& #include "tm5_do_ebi.intfb.h" ! #include "tm5_do_ebi_tc02b.intfb.h" #include "tm5_eqsam.intfb.h" -!#include "tm5_glomap_aerosol.intfb.h" +#include "tm5_glomap_aerosol.intfb.h" #include "tm5_ibud.intfb.h" #include "tm5_macc_aerosol.intfb.h" #include "tm5_o3s.intfb.h" @@ -329,7 +329,6 @@ SUBROUTINE CHEM_TM5& ASSOCIATE(YDECLD=>YDMODEL%YRML_PHY_EC%YRECLD,YGFL=>YDMODEL%YRML_GCONF%YGFL,& & YDCHEM=>YDMODEL%YRML_CHEM%YRCHEM, YDERDI=>YDMODEL%YRML_PHY_RAD%YRERDI, & & YDEAERSRC=>YDMODEL%YRML_PHY_AER%YREAERSRC, YDEAERSNK=>YDMODEL%YRML_PHY_AER%YREAERSNK, & - & YDEAERVOL=>YDMODEL%YRML_PHY_AER%YREAERVOL, & & YDEAERATM=>YDMODEL%YRML_PHY_RAD%YREAERATM, YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO, & & LPHYLIN=>YDMODEL%YRML_PHY_SLIN%YREPHLI%LPHYLIN) ASSOCIATE(NACTAERO=>YGFL%NACTAERO, NCHEM=>YGFL%NCHEM, NCHEM_DV=>YGFL%NCHEM_DV, & @@ -498,14 +497,13 @@ SUBROUTINE CHEM_TM5& IF ( LCHEM_AEROI ) THEN IF (TRIM(AERO_SCHEME)=="aer" )THEN ! * from MACC fields - CALL TM5_MACC_AEROSOL(YDEAERSNK,YDEAERVOL,YDEAERATM, KIDIA,KFDIA,KLON,KLEV, KAERO, & + CALL TM5_MACC_AEROSOL(KIDIA,KFDIA,KLON,KLEV, KAERO, & & PRS1 , PAEROP , ZRHCL , & & ZTAUS_AER,ZTAUA_AER,ZPMAER) ELSEIF (TRIM(AERO_SCHEME)=="glomap") THEN - WRITE(NULERR,*)'This option for AEROSOL_SCHEME is not possible yet',TRIM(AERO_SCHEME) - !CALL TM5_GLOMAP_AEROSOL(KIDIA,KFDIA,KLON,KLEV, & - !& PAERAOT, PAERAAOT, PAERASY, & - !& ZTAUS_AER,ZTAUA_AER,ZPMAER) + CALL TM5_GLOMAP_AEROSOL(KIDIA,KFDIA,KLON,KLEV, & + & PAERAOT, PAERAAOT, PAERASY, & + & ZTAUS_AER,ZTAUA_AER,ZPMAER) ELSE WRITE(NULERR,*)'No valid Aerosol interaction available:',LCHEM_AEROI,TRIM(AERO_SCHEME) ENDIF diff --git a/ifs-source/arpifs/chem/tm5_glomap_aerosol.F90 b/ifs-source/arpifs/chem/tm5_glomap_aerosol.F90 new file mode 100644 index 00000000..bbed4118 --- /dev/null +++ b/ifs-source/arpifs/chem/tm5_glomap_aerosol.F90 @@ -0,0 +1,160 @@ +SUBROUTINE TM5_GLOMAP_AEROSOL ( KIDIA,KFDIA,KLON,KLEV, & + & PAERAOT, PAERAAOT, PAERASY, & + & PTAUS_AER,PTAUA_AER, PMAER ) + + +!** DESCRIPTION +! ---------- +! +! Part of TM5 routines for IFS chemistry: +! +! +! assignment of aerosol optical depths +! To be used for TM5 phosolysis at specific wavelengths. +! Interpolated from GLOMAP fields +! +!------------------------------------------------------------------ +! +! +!** INTERFACE. +! ---------- +! *TM5_GLOMAP_AEROSOL* IS CALLED FROM *CHEM_tm5*. + +! INPUTS: +! ------- +! KIDIA : Start of Array +! KFDIA : End of Array +! KLON : Length of Arrays +! KLEV : NUMBER OF LEVELS +! PAERAOT(KLON,KLEV,6) : Glomap extinction AOD per model level at 6 wavelengths +! PAERAAOT(KLON,KLEV,6) : Glomap absorption AOD per model level at 6 wavelengths +! PAERASY(KLON,KLEV,6) : Glomap asymetry factor +! +! OUTPUTS: +! ------- +! +! PMAER +! PTAUS_AER +! PTAUA_AER +! +! LOCAL: +! ------- +! +! +! AUTHOR. +! ------- +! Original : 2018-08-31 Vincent Huijnen (KNMI) +! +! +! MODIFICATIONS. +! -------------- +! +!----------------------------------------------------------------------- + +USE PARKIND1 , ONLY : JPIM ,JPRB +USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK +USE TM5_PHOTOLYSIS , ONLY : NBANDS_TROP, NGRID, WL_EFF, WL_GLOMAP + + +IMPLICIT NONE + +!----------------------------------------------------------------------- +!* 0.1 ARGUMENTS +! --------- + +INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA, KFDIA, KLON, KLEV + +REAL(KIND=JPRB) ,INTENT(IN) :: PAERAOT(KLON,KLEV,6) +REAL(KIND=JPRB) ,INTENT(IN) :: PAERAAOT(KLON,KLEV,6) +REAL(KIND=JPRB) ,INTENT(IN) :: PAERASY(KLON,KLEV,6) + +REAL(KIND=JPRB), INTENT(OUT) :: PTAUS_AER(KLON,KLEV,NBANDS_TROP,NGRID) +REAL(KIND=JPRB), INTENT(OUT) :: PTAUA_AER(KLON,KLEV,NBANDS_TROP,NGRID) +REAL(KIND=JPRB), INTENT(OUT) :: PMAER(KLON,KLEV,NBANDS_TROP,NGRID) + + + +! * LOCAL +INTEGER(KIND=JPIM) :: JB, JK, JL + +! REAL(KIND=JPRB) :: ZFAC, ZF1,ZF2 + +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE + +!----------------------------------------------------------------------- +!----------------------------------------------------------------------- +!----------------------------------------------------------------------- + +IF (LHOOK) CALL DR_HOOK('TM5_GLOMAP_AEROSOL',0,ZHOOK_HANDLE ) + +! 6 GLOMAP wavelengths correspond to: 380, 440, 550, 670, 870 and 1020 nm + +DO JB = 1,6 + ! For these wavelengths don't interpolate the asymetry. + ! just take its value at lowest wavelength. + ! For AOD, assume AOD(lambda) ~ lambda^(-1), so: + ! AOD(lambda) = AOD(lambda=380) *(380/lambda) + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ! Fill Absorption aerosol layer + PTAUA_AER(JL,JK,JB,1)=PAERAAOT(JL,JK,1)*WL_GLOMAP(1)/WL_EFF(JB) + PTAUA_AER(JL,JK,JB,2)=PTAUA_AER(JL,JK,JB,1) + + + ! Fill scattering aerosol layer: (note: scattering = extinction - absorption) + PTAUS_AER(JL,JK,JB,1)= MAX(0._JPRB, PAERAOT(JL,JK,1)-PAERAAOT(JL,JK,1))*WL_GLOMAP(1)/WL_EFF(JB) + PTAUS_AER(JL,JK,JB,2)= PTAUS_AER(JL,JK,JB,1) + + PMAER(JL,JK,JB,1)=MAX(MIN(PAERASY(JL,JK,1),1._JPRB),0._JPRB) + PMAER(JL,JK,JB,2)=PMAER(JL,JK,JB,1) + ENDDO + ENDDO +ENDDO + +JB=7 +! For 580 nm just take closest value which is at 550 nm, which is index 3 +DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ! Fill Absorption aerosol layer + PTAUA_AER(JL,JK,JB,1)=PAERAAOT(JL,JK,3) + PTAUA_AER(JL,JK,JB,2)=PTAUA_AER(JL,JK,JB,1) + + + ! Fill scattering aerosol layer: (note: scattering = extinction - absorption) + PTAUS_AER(JL,JK,JB,1)= MAX(0._JPRB, PAERAOT(JL,JK,3)-PAERAAOT(JL,JK,3)) + PTAUS_AER(JL,JK,JB,2)= PTAUS_AER(JL,JK,JB,1) + + PMAER(JL,JK,JB,1)=MAX(MIN(PAERASY(JL,JK,3),1._JPRB),0._JPRB) + PMAER(JL,JK,JB,2)=PMAER(JL,JK,JB,1) + ENDDO +ENDDO + + +! ! Code to interpolate for specified wavelengths . Not used +! DO JB = 7 ,7 +! ZF1=(WL_EFF(JB)-WL_GLOMAP(1)) / (WL_GLOMAP(2)-WL_GLOMAP(1)) +! ! ensure validity +! ZF1=MAX(0._JPRB,MIN(1._JPRB,ZF1)) +! ZF2=1.-ZF1 +! DO JK=1,KLEV +! DO JL = KIDIA,KFDIA +! PTAUA_AER(JL,JK,JB,1)=MAX(0._JPRB,ZF2*PAERAAOT(JL,JK,1)+ ZF1*PAERAAOT(JL,JK,2)) +! PTAUA_AER(JL,JK,JB,2)=PTAUA_AER(JL,JK,JB,1) +! +! PTAUS_AER(JL,JK,JB,1)=MAX(0._JPRB,ZF2*(PAERAOT(JL,JK,1)-PAERAAOT(JL,JK,1))+ ZF1*(PAERAOT(JL,JK,2)-PAERAAOT(JL,JK,2))) +! PTAUS_AER(JL,JK,JB,2)=PTAUS_AER(JL,JK,JB,1) +! IF (PTAUS_AER(JL,JK,JB,1) > 0._JPRB ) THEN +! PMAER(JL,JK,JB,1)=MAX(MIN(ZF2*PAERASY(JL,JK,1)+ZF1*PAERASY(JL,JK,2),1._JPRB),0._JPRB) +! PMAER(JL,JK,JB,2)=PMAER(JL,JK,JB,1) +! ELSE +! PMAER(JL,JK,JB,1)=0._JPRB +! PMAER(JL,JK,JB,2)=0._JPRB +! ENDIF +! ENDDO +! ENDDO +! ENDDO + + +IF (LHOOK) CALL DR_HOOK('TM5_GLOMAP_AEROSOL',1,ZHOOK_HANDLE ) +END SUBROUTINE TM5_GLOMAP_AEROSOL + diff --git a/ifs-source/arpifs/chem/tm5_macc_aerosol.F90 b/ifs-source/arpifs/chem/tm5_macc_aerosol.F90 index 4e6e0126..56c95087 100644 --- a/ifs-source/arpifs/chem/tm5_macc_aerosol.F90 +++ b/ifs-source/arpifs/chem/tm5_macc_aerosol.F90 @@ -6,7 +6,7 @@ ! granted to it by virtue of its status as an intergovernmental organisation ! nor does it submit to any jurisdiction -SUBROUTINE TM5_MACC_AEROSOL (YREAERSNK,YREAERVOL,YREAERATM, KIDIA,KFDIA,KLON,KLEV, KACTAERO, & +SUBROUTINE TM5_MACC_AEROSOL ( KIDIA,KFDIA,KLON,KLEV, KACTAERO, & & PAPH , PAEROK , PRHCL , & & PTAUS_AER,PTAUA_AER, PMAER ) @@ -63,12 +63,12 @@ SUBROUTINE TM5_MACC_AEROSOL (YREAERSNK,YREAERVOL,YREAERATM, KIDIA,KFDIA,KLON,KLE USE TM5_PHOTOLYSIS , ONLY : NBANDS_TROP, NGRID, WL_EFF, WL_AER USE YOMCST ,ONLY : RG -USE YOEAERATM ,ONLY : TEAERATM!YREAERATM +USE YOEAERATM ,ONLY : YREAERATM USE YOEAEROP ,ONLY : ALF_SU, ALF_OM, ALF_DD, ALF_SS, ALF_BC, ALF_NI, ALF_AM, ALF_SOA, & & ASY_SU, ASY_OM, ASY_DD, ASY_SS, ASY_BC, ASY_NI, ASY_AM, ASY_SOA, & & OMG_SU, OMG_OM, OMG_DD, OMG_SS, OMG_BC, OMG_NI, OMG_AM, OMG_SOA -USE YOEAERSNK ,ONLY : TEAERSNK!YREAERSNK -USE YOEAERVOL ,ONLY : TEAERVOL!YREAERVOL +USE YOEAERSNK ,ONLY : YREAERSNK +USE YOEAERVOL ,ONLY : YREAERVOL IMPLICIT NONE @@ -76,9 +76,6 @@ SUBROUTINE TM5_MACC_AEROSOL (YREAERSNK,YREAERVOL,YREAERATM, KIDIA,KFDIA,KLON,KLE !* 0.1 ARGUMENTS ! --------- -TYPE(TEAERSNK), INTENT(INOUT) :: YREAERSNK -TYPE(TEAERVOL), INTENT(INOUT) :: YREAERVOL -TYPE(TEAERATM), INTENT(INOUT) :: YREAERATM INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA, KFDIA, KLON, KLEV INTEGER(KIND=JPIM),INTENT(IN) :: KACTAERO ! Number of active aerosol species From 3c58af8f22ba366146228216d75535bc52a4d014 Mon Sep 17 00:00:00 2001 From: Vincent Huijnen Date: Wed, 14 Feb 2024 15:01:46 +0000 Subject: [PATCH 013/129] first batch of clean-up code --- .../arpifs/module/surface_fields_mix.F90 | 15 - ifs-source/arpifs/module/tm5_photolysis.F90 | 5 + ifs-source/arpifs/module/yom_grib_codes.F90 | 1 - ifs-source/arpifs/module/yomcompo.F90 | 5 - ifs-source/arpifs/namelist/naeaer.nam.h | 3 +- ifs-source/arpifs/phys_ec/aerini_layer.F90 | 45 +- .../arpifs/phys_ec/simple_sulfur_src.F90 | 242 +++++----- ifs-source/arpifs/phys_ec/tm5m7_phy2.F90 | 26 +- ifs-source/arpifs/phys_ec/tm5m7_src.F90 | 415 +++++++++--------- ifs-source/arpifs/setup/su_surf_flds.F90 | 119 +---- ifs-source/arpifs/setup/sugfl1.F90 | 8 +- 11 files changed, 383 insertions(+), 501 deletions(-) diff --git a/ifs-source/arpifs/module/surface_fields_mix.F90 b/ifs-source/arpifs/module/surface_fields_mix.F90 index 8cadd00f..151eb9e8 100644 --- a/ifs-source/arpifs/module/surface_fields_mix.F90 +++ b/ifs-source/arpifs/module/surface_fields_mix.F90 @@ -336,22 +336,7 @@ MODULE SURFACE_FIELDS_MIX INTEGER(KIND=JPIM) :: IALSTART, IALEND TYPE(TYPE_SURF_MTL_2D), POINTER :: YFP1 =>NULL() ! surface orography in the 2nd part of FULLPOS-927 - TYPE(TYPE_SURF_MTL_2D), POINTER :: YBCBF ! black carbon biogenic - TYPE(TYPE_SURF_MTL_2D), POINTER :: YBCFF ! black carbon fossil fuel - TYPE(TYPE_SURF_MTL_2D), POINTER :: YBCGF ! black carbon GFED - TYPE(TYPE_SURF_MTL_2D), POINTER :: YOMBF ! organic matter biogenic - TYPE(TYPE_SURF_MTL_2D), POINTER :: YOMFF ! organic matter fossil fuel - TYPE(TYPE_SURF_MTL_2D), POINTER :: YOMGF ! organic matter GFED - - TYPE(TYPE_SURF_MTL_2D), POINTER :: YINJF =>NULL() ! height of maximum injection for biomass burning emissions - TYPE(TYPE_SURF_MTL_2D), POINTER :: YSO2L=>NULL() ! sulphate low level - TYPE(TYPE_SURF_MTL_2D), POINTER :: YSO2H=>NULL() ! sulphate higher level TYPE(TYPE_SURF_MTL_2D), POINTER :: YSO2DD=>NULL() ! sulphate dry dep velocity - TYPE(TYPE_SURF_MTL_2D), POINTER :: YSOGF=>NULL() ! sulphate GFED - TYPE(TYPE_SURF_MTL_2D), POINTER :: YSOA=>NULL() ! secondary organic - TYPE(TYPE_SURF_MTL_2D), POINTER :: YVOLC=>NULL() ! volcanic continuous - TYPE(TYPE_SURF_MTL_2D), POINTER :: YVOLE=>NULL() ! volcanic explosive - TYPE(TYPE_SURF_MTL_2D), POINTER :: YSOACO=>NULL() ! SOA from CO TYPE(TYPE_SURF_MTL_2D), POINTER :: YDMSO =>NULL() ! oceanic DMS TYPE(TYPE_SURF_MTL_2D), POINTER :: YURBF =>NULL() ! Urban fraction TYPE(TYPE_SURF_MTL_2D), POINTER :: YFCA1 =>NULL() ! Fraction of calcite over dust 1st bin diff --git a/ifs-source/arpifs/module/tm5_photolysis.F90 b/ifs-source/arpifs/module/tm5_photolysis.F90 index a0de0f02..c0348dfb 100644 --- a/ifs-source/arpifs/module/tm5_photolysis.F90 +++ b/ifs-source/arpifs/module/tm5_photolysis.F90 @@ -145,6 +145,11 @@ MODULE TM5_PHOTOLYSIS REAL(KIND=JPRB), DIMENSION(2), PARAMETER :: WL_AER = (/ & & 340., 645. /) +! Wavelengths at which glomap aerosol input is expected +REAL(KIND=JPRB), DIMENSION(2), PARAMETER :: WL_GLOMAP = (/ & + & 320., 542. /) + +!M7 related INTEGER(KIND=JPIM),DIMENSION(NBANDS_TROP) :: WAV_GRID, WAV_GRIDA INTEGER(KIND=JPIM),DIMENSION(7),PARAMETER :: & diff --git a/ifs-source/arpifs/module/yom_grib_codes.F90 b/ifs-source/arpifs/module/yom_grib_codes.F90 index 0b306240..03d849eb 100644 --- a/ifs-source/arpifs/module/yom_grib_codes.F90 +++ b/ifs-source/arpifs/module/yom_grib_codes.F90 @@ -944,7 +944,6 @@ MODULE YOM_GRIB_CODES !-- aerosols -- Table 216 -------------------------- INTEGER(KIND=JPIM), PARAMETER :: NGRBAERSO2DD =216006 -INTEGER(KIND=JPIM), PARAMETER :: NGRBAERSOAC =216007 INTEGER(KIND=JPIM), PARAMETER :: NGRBAERFCA1 =216043 INTEGER(KIND=JPIM), PARAMETER :: NGRBAERFCA2 =216044 INTEGER(KIND=JPIM), PARAMETER :: NGRBAERDSF =216046 diff --git a/ifs-source/arpifs/module/yomcompo.F90 b/ifs-source/arpifs/module/yomcompo.F90 index ee0ef657..1de46865 100644 --- a/ifs-source/arpifs/module/yomcompo.F90 +++ b/ifs-source/arpifs/module/yomcompo.F90 @@ -76,11 +76,6 @@ MODULE YOMCOMPO END TYPE TCOMPO_EMIS_AUX TYPE :: TCOMPO -! m7 related - - LOGICAL :: LAERODIU - LOGICAL :: LFIRE - LOGICAL :: LINJ ! mass diagnostics switch for global budget LOGICAL :: LCHEM_DIA ! period (in hours) on which to output budget diff --git a/ifs-source/arpifs/namelist/naeaer.nam.h b/ifs-source/arpifs/namelist/naeaer.nam.h index 2839885b..d512fdac 100644 --- a/ifs-source/arpifs/namelist/naeaer.nam.h +++ b/ifs-source/arpifs/namelist/naeaer.nam.h @@ -12,7 +12,7 @@ ! ----------------------------------------------------------------- NAMELIST/NAEAER/& & LEPAERO , LAERCLIMG, LAERCLIMZ, LAERCLIST, LAERDRYDP, LAERELVS , LAEREXTR , & - & LAERGBUD , LAERHYGRO, LAERNGAT , LAERPRNT , LAERSCAV, LAERSEDIM, LAERSEDIMSS,& + & LAERGBUD , LAERHYGRO, LAERNGAT , LAERPRNT , LAERSEDIM, LAERSEDIMSS,& & LAERSURF , LAERGTOP , LAER6SDIA, LAERCCN , LAERINIT , & & LAERCSTR , LAERRRTM , LAERDIAG1, LAERDIAG2, LAERUVP , LAERVOL , & & LAEROMIN , LOCNDMS , & @@ -22,7 +22,6 @@ NAMELIST/NAEAER/& & NDRYDEP , NDUSRCP , & & RAERDUB , RDDUAER , RFCTDUR , RFCTSSR , RLATVOL , RLONVOL , & & RSUCV1 , RSUCV2 , & - & LAERSCAV_CHEM , LAERSOA_CHEM, LDRYDEPVEL_DYN, & & NAERSCAV , LSEASALT_RH80, NDRYDEPVEL_DYN, RAERDUST_REBOUND,& & LAERDUSTSOURCE, LAERDUST_NEWBIN, YAERO_DESC, NSO4SCHEME, & & NAER_BLNUCL, LAERDUSTSIZEVAR diff --git a/ifs-source/arpifs/phys_ec/aerini_layer.F90 b/ifs-source/arpifs/phys_ec/aerini_layer.F90 index 6fb883f8..f9da7576 100644 --- a/ifs-source/arpifs/phys_ec/aerini_layer.F90 +++ b/ifs-source/arpifs/phys_ec/aerini_layer.F90 @@ -168,26 +168,26 @@ SUBROUTINE AERINI_LAYER(YDGEOMETRY,YDSURF,& ZSNM = SUM(PSURF%PSP_SG(:,:,YSP_SG%YF%MP9),DIM=2) ! pre-compute total snow mass - IF(.not. LAERCHEM .and. LAEROSFC)THEN - !IF(LAEROSFC) - call simple_sulfur_src(YDGEOMETRY, YDMODEL, KDIM%KIDIA, KDIM%KFDIA, KDIM%KLON , KDIM%KTDIA, KDIM%KLEV,& - & KDIM%KSTGLO, GEMSL%ITRAC, GEMSL%IAERO, & - & PAUX%PAPHI, & - & PSURF%PSD_VF(:,YSD_VF%YSO2L%MP), PSURF%PSD_VF(:,YSD_VF%YSO2H%MP), & - & PSURF%PSD_VF(:,YSD_VF%YSOGF%MP),& - & PSURF%PSD_VF(:,YSD_VF%YSOA%MP) ,& - & PSURF%PSD_VF(:,YSD_VF%YSOACO%MP),PSURF%PSD_VF(:,YSD_VF%YVOLC%MP), PSURF%PSD_VF(:,YSD_VF%YVOLE%MP),PSURF%PSD_VF(:,YSD_VF%YDMSO%MP),& - & PSURF%PSD_VF(:,YSD_VF%YCI%MP) , PSURF%PSD_VF(:,YSD_VF%YINJF%MP) , PSURF%PSD_VD(:,YSD_VD%YBLH%MP) ,& - & PAUX%PRS1, PAUX%PRSF1,PAUX%PGELAM, PAUX%PGELAT,& - & PSURF%PSD_VF(:,YSD_VF%YLSM%MP) , PSURF%PSP_RR(:,YSP_RR%YT%MP9) , TSPHY,& - & GEMSL%ZAERWS,& - & GEMSL%ZDMSO, GEMSL%ZLDAY, GEMSL%ZLISS, GEMSL%ZSO2, GEMSL%ZTDMS,& - & GEMSL%ZODMS, PSO4SRC,PSO2SRC) -ELSE +!VH IF(.not. LAERCHEM .and. LAEROSFC)THEN +!VH !IF(LAEROSFC) +!VH call simple_sulfur_src(YDGEOMETRY, YDMODEL, KDIM%KIDIA, KDIM%KFDIA, KDIM%KLON , KDIM%KTDIA, KDIM%KLEV,& +!VH & KDIM%KSTGLO, GEMSL%ITRAC, GEMSL%IAERO, & +!VH & PAUX%PAPHI, & +!VH & PSURF%PSD_VF(:,YSD_VF%YSO2L%MP), PSURF%PSD_VF(:,YSD_VF%YSO2H%MP), & +!VH & PSURF%PSD_VF(:,YSD_VF%YSOGF%MP),& +!VH & PSURF%PSD_VF(:,YSD_VF%YSOA%MP) ,& +!VH & PSURF%PSD_VF(:,YSD_VF%YSOACO%MP),PSURF%PSD_VF(:,YSD_VF%YVOLC%MP), PSURF%PSD_VF(:,YSD_VF%YVOLE%MP),PSURF%PSD_VF(:,YSD_VF%YDMSO%MP),& +!VH & PSURF%PSD_VF(:,YSD_VF%YCI%MP) , PSURF%PSD_VF(:,YSD_VF%YINJF%MP) , PSURF%PSD_VD(:,YSD_VD%YBLH%MP) ,& +!VH & PAUX%PRS1, PAUX%PRSF1,PAUX%PGELAM, PAUX%PGELAT,& +!VH & PSURF%PSD_VF(:,YSD_VF%YLSM%MP) , PSURF%PSP_RR(:,YSP_RR%YT%MP9) , TSPHY,& +!VH & GEMSL%ZAERWS,& +!VH & GEMSL%ZDMSO, GEMSL%ZLDAY, GEMSL%ZLISS, GEMSL%ZSO2, GEMSL%ZTDMS,& +!VH & GEMSL%ZODMS, PSO4SRC,PSO2SRC) +!VH ELSE ! Set to zero PSO4SRC(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV)=0.0_JPRB PSO2SRC(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV)=0.0_JPRB -END IF +!VH END IF SELECT CASE (TRIM(AERO_SCHEME)) @@ -205,12 +205,9 @@ SUBROUTINE AERINI_LAYER(YDGEOMETRY,YDSURF,& !VH & PSURF%PSD_VD(:,YSD_VD%YALB%MP), SURFL%ZALBD, PSURF%PSD_VF(:,YSD_VF%YALUVD%MP),& !VH & PSURF%PSD_VF(:,YSD_VF%YAERDEP%MP),PSURF%PSD_VF(:,YSD_VF%YAERLTS%MP),PSURF%PSD_VF(:,YSD_VF%YAERSCC%MP),& !VH & GEMSL%ZAERWS, GEMSL%ZAERGUST, GEMSL%ZAERUST,& -!VH & PSURF%PSD_VF(:,YSD_VF%YBCBF%MP), PSURF%PSD_VF(:,YSD_VF%YBCFF%MP), PSURF%PSD_VF(:,YSD_VF%YBCGF%MP),& -!VH & PSURF%PSD_VF(:,YSD_VF%YOMBF%MP), PSURF%PSD_VF(:,YSD_VF%YOMFF%MP), PSURF%PSD_VF(:,YSD_VF%YOMGF%MP),& -!VH & PSURF%PSD_VF(:,YSD_VF%YSO2L%MP), PSURF%PSD_VF(:,YSD_VF%YSO2H%MP), PSURF%PSD_VF(:,YSD_VF%YSO2DD%MP),& +!VH & PSURF%PSD_VF(:,YSD_VF%YSO2DD%MP),& !VH & PSURF%PSD_VF(:,YSD_VF%YSOGF%MP),& -!VH & PSURF%PSD_VF(:,YSD_VF%YVOLC%MP), PSURF%PSD_VF(:,YSD_VF%YVOLE%MP), PSURF%PSD_VF(:,YSD_VF%YSOA%MP) ,& -!VH & PSURF%PSD_VF(:,YSD_VF%YSOACO%MP),PSURF%PSD_VF(:,YSD_VF%YDMSO%MP), PSURF%PSD_VF(:,YSD_VF%YSOILTYPE%MP), & +!VH & PSURF%PSD_VF(:,YSD_VF%YSOILTYPE%MP), & !VH !TB added lake cover: YCLK, !!!PSP_SG 2 dims becomes now 3 dims !VH & PSURF%PSD_VF(:,YSD_VF%YCI%MP), PSURF%PSD_VF(:,YSD_VF%YCLK%MP) , PSURF%PSD_VF(:,YSD_VF%YINJF%MP) , PSURF%PSD_VD(:,YSD_VD%YBLH%MP) ,& !VH & SURFL%ZFRTI, PSURF%PSD_VF(:,YSD_VF%YLSM%MP) , PSURF%PSD_VF(:,YSD_VF%YSST%MP), STATE%Q, & @@ -222,9 +219,9 @@ SUBROUTINE AERINI_LAYER(YDGEOMETRY,YDSURF,& !VH & PSURF%PAHFSTI, &!!!FLUX%PFTLHEV, & !VH !VH - end !VH & GEMSL%ZCFLX, GEMSL%ZTENC,& -!VH & GEMSL%ZDMSO, GEMSL%ZLDAY, GEMSL%ZLISS, GEMSL%ZSO2, GEMSL%ZTDMS,& +!VH & GEMSL%ZLDAY, GEMSL%ZLISS, GEMSL%ZSO2, GEMSL%ZTDMS,& !VH & GEMSL%ZAERDDP, GEMSL%ZAERSDM, GEMSL%ZAERSRC, GEMSL%ZAERMAP, GEMSL%ZAERFLX, GEMSL%ZAERLIF,& -!VH & GEMSL%ZDMSI, GEMSL%ZODMS, PSURF%PSD_XA, & +!VH & GEMSL%ZODMS, PSURF%PSD_XA, & !VH &PSO4SRC,PSO2SRC) CASE ("aer") diff --git a/ifs-source/arpifs/phys_ec/simple_sulfur_src.F90 b/ifs-source/arpifs/phys_ec/simple_sulfur_src.F90 index e26f08db..15613e59 100644 --- a/ifs-source/arpifs/phys_ec/simple_sulfur_src.F90 +++ b/ifs-source/arpifs/phys_ec/simple_sulfur_src.F90 @@ -93,8 +93,8 @@ SUBROUTINE SIMPLE_SULFUR_SRC ( YDGEOMETRY, YDMODEL, KIDIA, KFDIA, KLON , KTDIA, & YDEAERSRC=>YDMODEL%YRML_PHY_AER%YREAERSRC, & & YDEAERATM=>YDMODEL%YRML_PHY_RAD%YREAERATM) -ASSOCIATE(NDMSO=>YDEAERSRC%NDMSO,LOCNDMS=>YDEAERSRC%LOCNDMS,NDGLG=>YDGEOMETRY%YRDIM%NDGLG,LAERODIU=>YDCOMPO%LAERODIU,LFIRE=>YDCOMPO%LFIRE, & - & LINJ=>YDCOMPO%LINJ,YDCSGLEG=>YDGEOMETRY%YRCSGLEG,NGLOBALAT=>YDGEOMETRY%YRMP%NGLOBALAT, NLOENG=>YDGEOMETRY%YRGEM%NLOENG, & +ASSOCIATE(NDMSO=>YDEAERSRC%NDMSO,LOCNDMS=>YDEAERSRC%LOCNDMS,NDGLG=>YDGEOMETRY%YRDIM%NDGLG, & + & YDCSGLEG=>YDGEOMETRY%YRCSGLEG,NGLOBALAT=>YDGEOMETRY%YRMP%NGLOBALAT, NLOENG=>YDGEOMETRY%YRGEM%NLOENG, & & RCOVSRA=>YDEAERSRC%RCOVSRA, RCODECA=>YDEAERSRC%RCODECA,RSIDECA=>YDEAERSRC%RSIDECA,LAERCHEM=>YGFL%LAERCHEM, & & RSIVSRA=>YDEAERSRC%RSIVSRA, RHGMT=>YDRIP%RHGMT, LAERELVS=>YDEAERATM%LAERELVS) @@ -156,9 +156,9 @@ SUBROUTINE SIMPLE_SULFUR_SRC ( YDGEOMETRY, YDMODEL, KIDIA, KFDIA, KLON , KTDIA, ZLOCALTIM =RHGMT + ZGLON(JL)/360._JPRB*RDAY ZDIURN(JL)=COS( ((ZLOCALTIM-54000._JPRB)/RDAY) * 2._JPRB*RPI)+1._JPRB ENDDO -IF (.NOT.LAERODIU) THEN - ZDIURN(KIDIA:KFDIA)=1.0_JPRB -ENDIF +!VH IF (.NOT.LAERODIU) THEN +!VH ZDIURN(KIDIA:KFDIA)=1.0_JPRB +!VH ENDIF DO JK=1,KLEV @@ -208,122 +208,122 @@ SUBROUTINE SIMPLE_SULFUR_SRC ( YDGEOMETRY, YDMODEL, KIDIA, KFDIA, KLON , KTDIA, PDMSO(JL)=ZDMS2SO2 * PDMSO(JL) ENDDO -IF(.NOT.LAERELVS) THEN - DO JL=KIDIA,KFDIA - ! renormalise by the mass of SO2 : no need with MACCity! - ZSO2L(JL)=PSO2L(JL) - ZSO2H(JL)=PSO2H(JL) - ZSO2SOURC=(ZSO2L(JL)*ZDIURN(JL)+ZSO2H(JL)) + PDMSO(JL) - PSO2(JL)=(ZSO2L(JL)*ZDIURN(JL)+ZSO2H(JL)) - IF (LFIRE) THEN - IF (PSOGF(JL) < 0._JPRB) THEN - ZSOGF(JL) = -PSOGF(JL) - ELSE - ZSOGF(JL) = PSOGF(JL) - ENDIF - ZSOGF(JL)=ZSOGF(JL)*ZSO2MSS - ! Height of injection for biomass burning emissions : update tendancy - IF (LINJ) THEN - IF (PINJF(JL) > 200._JPRB .AND. PBLH(JL) > 1500._JPRB) THEN - IX=MINLOC( ABS( (PAPHI(JL,1:KLEV)-PAPHI(JL,KLEV))/RG - PINJF(JL))) - ILINJ1=IX(1) - ILINJ2=ILINJ1 - ! calculate total detltap over injected levels - ZDELP=0.0_JPRB - DO JK = ILINJ1, ILINJ2 - ZDELP = ZDELP + ZDP(JL,JK) - ENDDO - DO JK = ILINJ1, ILINJ2 - - PSO2SRC(JL,JK) = ZSOGF(JL) * RG *ZDIURN(JL) / ZDELP - !PTENC(JL,JK,KAERO(INBAER+2)) = PTENC(JL,JK,KAERO(INBAER+2)) +& - !& ZSOGF(JL) * RG *ZDIURN(JL) / ZDELP - ENDDO - ELSE - ZDELP=0.0_JPRB - DO JK = KLEV-3, KLEV-2 - ZDELP = ZDELP + ZDP(JL,JK) - ENDDO - DO JK = KLEV-3, KLEV-2 - PSO2SRC(JL,JK) = ZSOGF(JL) * RG *ZDIURN(JL) / ZDELP - !PTENC(JL,JK,KAERO(INBAER+2)) = PTENC(JL,JK,KAERO(INBAER+2)) +& - !& ZSOGF(JL) * RG *ZDIURN(JL) / ZDELP - ENDDO - ENDIF - ELSE - ZSO2SOURC=ZSO2SOURC+ZSOGF(JL) - !PSO2SRC(JL,KLEV) = ZSOGF(JL) - ENDIF - ENDIF - PSO2SRC(JL,KLEV)= ZSO2SOURC - PSO4SRC(JL,KLEV)= 0.0_JPRB - !PCFLX(JL,KAERO(INBAER+2))= -ZSO2SOURC - !PCFLX(JL,KAERO(INBAER+1))= 0._JPRB - ENDDO - -ELSE !LAERELVS - DO JL=KIDIA,KFDIA - ! renormalise by the mass of SO2 : no need with MACCity! - ZSO2L(JL)=PSO2L(JL) - ZSO2H(JL)=PSO2H(JL) - ZSO2SOURC=ZSO2L(JL)*ZDIURN(JL) + PDMSO(JL) - PSO2(JL)=(ZSO2L(JL)*ZDIURN(JL)+ZSO2H(JL)) - IF (LFIRE) THEN - !THIS NEEDS a CHANGE for NETs!!!!!!! - IF (PSOGF(JL) < 0._JPRB) THEN - ZSOGF(JL) = -PSOGF(JL) - ELSE - ZSOGF(JL) = PSOGF(JL) - ENDIF - - ZSOGF(JL)=ZSOGF(JL)*ZSO2MSS - IF (LINJ) THEN - IF (PINJF(JL) > 200._JPRB .AND. PBLH(JL) > 1500._JPRB) THEN - IX=MINLOC( ABS( (PAPHI(JL,1:KLEV)-PAPHI(JL,KLEV))/RG - PINJF(JL))) - ILINJ1=IX(1) - ILINJ2=ILINJ1 - ! calculate total detltap over injected levels - ZDELP=0.0_JPRB - DO JK = ILINJ1, ILINJ2 - ZDELP = ZDELP + ZDP(JL,JK) - ENDDO - DO JK = ILINJ1, ILINJ2 - PSO2SRC(JL,JK) = PSO2SRC(JL,JK) + ZSOGF(JL) * RG *ZDIURN(JL) / ZDELP - !PTENC(JL,JK,KAERO(INBAER+2)) = PTENC(JL,JK,KAERO(INBAER+2)) +& - !& ZSOGF(JL) * RG *ZDIURN(JL) / ZDELP - ENDDO - ELSE - ZDELP=0.0_JPRB - DO JK = KLEV-3, KLEV-2 - ZDELP = ZDELP + ZDP(JL,JK) - ENDDO - DO JK = KLEV-3, KLEV-2 - PSO2SRC(JL,JK) = PSO2SRC(JL,JK) + ZSOGF(JL) * RG *ZDIURN(JL) / ZDELP - !PTENC(JL,JK,KAERO(INBAER+2)) = PTENC(JL,JK,KAERO(INBAER+2)) +& - !& ZSOGF(JL) * RG *ZDIURN(JL) / ZDELP - ENDDO - ENDIF - ELSE - ZSO2SOURC=ZSO2SOURC+ZSOGF(JL) - !PSO2SRC(JL,KLEV) = PSO2SRC(JL,KLEV)+ZSOGF(JL) - ENDIF - ENDIF - ! MOVE OUTSIDE - ! aerosol module depnedent - !PCFLX(JL,KAERO(INBAER+2))= -ZSO2SOURC !so2 - !PCFLX(JL,KAERO(INBAER+1))= 0._JPRB !so4 - PSO2SRC(JL,KLEV)= ZSO2SOURC - PSO4SRC(JL,KLEV)= 0.0_JPRB - ENDDO - ! distributing the elevated source of SO2 over the four lowest layers - ! original SO2 flux in kg m-2 s-1 (ZSO2H) -! Flux (kg m-2 s-1) = concentration (kg kg-1) DeltaPress(kg m-1 s-2) / [timestep (s) * gravity (m s-2)] - ! therefore, increment concentration (kg kg-1 s-1) = flux * timestep * gravity / [DeltaPress * timestep ] - - ! TB - ! TENDENCY update moved to respective aerosol modules - ! -ENDIF! LAERELVS +!VH IF(.NOT.LAERELVS) THEN +!VH DO JL=KIDIA,KFDIA +!VH ! renormalise by the mass of SO2 : no need with MACCity! +!VH ZSO2L(JL)=PSO2L(JL) +!VH ZSO2H(JL)=PSO2H(JL) +!VH ZSO2SOURC=(ZSO2L(JL)*ZDIURN(JL)+ZSO2H(JL)) + PDMSO(JL) +!VH PSO2(JL)=(ZSO2L(JL)*ZDIURN(JL)+ZSO2H(JL)) +!VH IF (LFIRE) THEN +!VH IF (PSOGF(JL) < 0._JPRB) THEN +!VH ZSOGF(JL) = -PSOGF(JL) +!VH ELSE +!VH ZSOGF(JL) = PSOGF(JL) +!VH ENDIF +!VH ZSOGF(JL)=ZSOGF(JL)*ZSO2MSS +!VH ! Height of injection for biomass burning emissions : update tendancy +!VH IF (LINJ) THEN +!VH IF (PINJF(JL) > 200._JPRB .AND. PBLH(JL) > 1500._JPRB) THEN +!VH IX=MINLOC( ABS( (PAPHI(JL,1:KLEV)-PAPHI(JL,KLEV))/RG - PINJF(JL))) +!VH ILINJ1=IX(1) +!VH ILINJ2=ILINJ1 +!VH ! calculate total detltap over injected levels +!VH ZDELP=0.0_JPRB +!VH DO JK = ILINJ1, ILINJ2 +!VH ZDELP = ZDELP + ZDP(JL,JK) +!VH ENDDO +!VH DO JK = ILINJ1, ILINJ2 +!VH +!VH PSO2SRC(JL,JK) = ZSOGF(JL) * RG *ZDIURN(JL) / ZDELP +!VH !PTENC(JL,JK,KAERO(INBAER+2)) = PTENC(JL,JK,KAERO(INBAER+2)) +& +!VH !& ZSOGF(JL) * RG *ZDIURN(JL) / ZDELP +!VH ENDDO +!VH ELSE +!VH ZDELP=0.0_JPRB +!VH DO JK = KLEV-3, KLEV-2 +!VH ZDELP = ZDELP + ZDP(JL,JK) +!VH ENDDO +!VH DO JK = KLEV-3, KLEV-2 +!VH PSO2SRC(JL,JK) = ZSOGF(JL) * RG *ZDIURN(JL) / ZDELP +!VH !PTENC(JL,JK,KAERO(INBAER+2)) = PTENC(JL,JK,KAERO(INBAER+2)) +& +!VH !& ZSOGF(JL) * RG *ZDIURN(JL) / ZDELP +!VH ENDDO +!VH ENDIF +!VH ELSE +!VH ZSO2SOURC=ZSO2SOURC+ZSOGF(JL) +!VH !PSO2SRC(JL,KLEV) = ZSOGF(JL) +!VH ENDIF +!VH ENDIF +!VH PSO2SRC(JL,KLEV)= ZSO2SOURC +!VH PSO4SRC(JL,KLEV)= 0.0_JPRB +!VH !PCFLX(JL,KAERO(INBAER+2))= -ZSO2SOURC +!VH !PCFLX(JL,KAERO(INBAER+1))= 0._JPRB +!VH ENDDO +!VH +!VH ELSE !LAERELVS +!VH DO JL=KIDIA,KFDIA +!VH ! renormalise by the mass of SO2 : no need with MACCity! +!VH ZSO2L(JL)=PSO2L(JL) +!VH ZSO2H(JL)=PSO2H(JL) +!VH ZSO2SOURC=ZSO2L(JL)*ZDIURN(JL) + PDMSO(JL) +!VH PSO2(JL)=(ZSO2L(JL)*ZDIURN(JL)+ZSO2H(JL)) +!VH IF (LFIRE) THEN +!VH !THIS NEEDS a CHANGE for NETs!!!!!!! +!VH IF (PSOGF(JL) < 0._JPRB) THEN +!VH ZSOGF(JL) = -PSOGF(JL) +!VH ELSE +!VH ZSOGF(JL) = PSOGF(JL) +!VH ENDIF +!VH +!VH ZSOGF(JL)=ZSOGF(JL)*ZSO2MSS +!VH IF (LINJ) THEN +!VH IF (PINJF(JL) > 200._JPRB .AND. PBLH(JL) > 1500._JPRB) THEN +!VH IX=MINLOC( ABS( (PAPHI(JL,1:KLEV)-PAPHI(JL,KLEV))/RG - PINJF(JL))) +!VH ILINJ1=IX(1) +!VH ILINJ2=ILINJ1 +!VH ! calculate total detltap over injected levels +!VH ZDELP=0.0_JPRB +!VH DO JK = ILINJ1, ILINJ2 +!VH ZDELP = ZDELP + ZDP(JL,JK) +!VH ENDDO +!VH DO JK = ILINJ1, ILINJ2 +!VH PSO2SRC(JL,JK) = PSO2SRC(JL,JK) + ZSOGF(JL) * RG *ZDIURN(JL) / ZDELP +!VH !PTENC(JL,JK,KAERO(INBAER+2)) = PTENC(JL,JK,KAERO(INBAER+2)) +& +!VH !& ZSOGF(JL) * RG *ZDIURN(JL) / ZDELP +!VH ENDDO +!VH ELSE +!VH ZDELP=0.0_JPRB +!VH DO JK = KLEV-3, KLEV-2 +!VH ZDELP = ZDELP + ZDP(JL,JK) +!VH ENDDO +!VH DO JK = KLEV-3, KLEV-2 +!VH PSO2SRC(JL,JK) = PSO2SRC(JL,JK) + ZSOGF(JL) * RG *ZDIURN(JL) / ZDELP +!VH !PTENC(JL,JK,KAERO(INBAER+2)) = PTENC(JL,JK,KAERO(INBAER+2)) +& +!VH !& ZSOGF(JL) * RG *ZDIURN(JL) / ZDELP +!VH ENDDO +!VH ENDIF +!VH ELSE +!VH ZSO2SOURC=ZSO2SOURC+ZSOGF(JL) +!VH !PSO2SRC(JL,KLEV) = PSO2SRC(JL,KLEV)+ZSOGF(JL) +!VH ENDIF +!VH ENDIF +!VH ! MOVE OUTSIDE +!VH ! aerosol module depnedent +!VH !PCFLX(JL,KAERO(INBAER+2))= -ZSO2SOURC !so2 +!VH !PCFLX(JL,KAERO(INBAER+1))= 0._JPRB !so4 +!VH PSO2SRC(JL,KLEV)= ZSO2SOURC +!VH PSO4SRC(JL,KLEV)= 0.0_JPRB +!VH ENDDO +!VH ! distributing the elevated source of SO2 over the four lowest layers +!VH ! original SO2 flux in kg m-2 s-1 (ZSO2H) +!VH ! Flux (kg m-2 s-1) = concentration (kg kg-1) DeltaPress(kg m-1 s-2) / [timestep (s) * gravity (m s-2)] +!VH ! therefore, increment concentration (kg kg-1 s-1) = flux * timestep * gravity / [DeltaPress * timestep ] +!VH +!VH ! TB +!VH ! TENDENCY update moved to respective aerosol modules +!VH ! +!VH ENDIF! LAERELVS !----------------------------------------------------------------------- END ASSOCIATE diff --git a/ifs-source/arpifs/phys_ec/tm5m7_phy2.F90 b/ifs-source/arpifs/phys_ec/tm5m7_phy2.F90 index 996e9054..39fb3ee9 100644 --- a/ifs-source/arpifs/phys_ec/tm5m7_phy2.F90 +++ b/ifs-source/arpifs/phys_ec/tm5m7_phy2.F90 @@ -4,8 +4,7 @@ SUBROUTINE TM5M7_PHY2 & & PRS1 , PRSF1, PAPHI, PTP , PVERVEL, PCEN , PGEOH, & & PALB , PALBD, PALUVD,& & PAERDEP,PAERLTS,PAERSCC , PAERWS,PAERGUST, PAERUST,& - & PBCBF, PBCFF, PBCGF, POMBF , POMFF , POMGF , & - & PSO2L, PSO2H, PSO2DD, PSOGF, PVOLC , PVOLE , PSOA, PSOACO, PDMS, PSOIL_TYPE, & + & PSO2DD, PSOIL_TYPE, & & PCI ,PCLAKE, PINJF, PBLH, PFRTI, PLSM , PSST, PQP , PSNS , & & PTL ,PGELAM,PGELAT,PGEMU , PHSDFOR, & & PUP , PVP , PWSA1, PTSPHY, PZ0M, KCHEM, & @@ -13,8 +12,8 @@ SUBROUTINE TM5M7_PHY2 & & PAHFSTI, & !-- OUTPUTS & PCFLX, PTENC, & - & PDMSO, PLDAY, PLISS, PSO2 , PTDMS, PAERDDP, PAERSDM, PAERSRC, PAERMAP, PAERFLX, PAERLIF, & - & PDMSI, PODMS, PEXTRA , PSO4SRC, PSO2SRC) + & PLDAY, PLISS, PSO2 , PTDMS, PAERDDP, PAERSDM, PAERSRC, PAERMAP, PAERFLX, PAERLIF, & + & PODMS, PEXTRA , PSO4SRC, PSO2SRC) !**** *TM5M7_PHY2* - ROUTINE DEALING WITH AEROSOL SOURCES, DRY DEPOSITION ! AND SEDIMENTATION for TM5M7 aerosol @@ -59,8 +58,8 @@ SUBROUTINE TM5M7_PHY2 & !! PAHFLEV : latent heat flux (W/m2) ! PZ0M : roughness length for momentum (m) !-- aerosol climatological fields -! PAERDEP, PAERLTS, PAERSCC, PBCBF, PBCFF, PBCGF, POMBF, POMFF, POMGF, -! PSO2L, PSO2H, PSO2DD, PSOGF, PVOLC, PVOLE, PSOA, PSOACO, PDMS, PSOIL_TYPE +! PAERDEP, PAERLTS, PAERSCC, +! PSO2DD, PSOIL_TYPE !-- dust aerosol predictors ! PAERWS : Wind speed (average of horizontal wind speed) (m/s) ! PAERGUST : Wind gust (maximum 3 second gust in the hour) (m/s) @@ -142,10 +141,8 @@ SUBROUTINE TM5M7_PHY2 & REAL(KIND=JPRB),INTENT(IN) :: PALUVD(KLON) REAL(KIND=JPRB),INTENT(IN) :: PAERDEP(KLON), PAERLTS(KLON), PAERSCC(KLON) REAL(KIND=JPRB),INTENT(IN) :: PAERWS(KLON) , PAERGUST(KLON), PAERUST(KLON) -REAL(KIND=JPRB),INTENT(IN) :: PBCBF(KLON), PBCFF(KLON), PBCGF(KLON), POMBF(KLON), POMFF(KLON), POMGF(KLON) -REAL(KIND=JPRB),INTENT(IN) :: PSO2L(KLON), PSO2H(KLON), PSO2DD(KLON), PSOGF(KLON) -REAL(KIND=JPRB),INTENT(IN) :: PVOLC(KLON), PVOLE(KLON), PSOA(KLON), PSOACO(KLON) -REAL(KIND=JPRB),INTENT(IN) :: PDMS(KLON), PSOIL_TYPE(KLON) +REAL(KIND=JPRB),INTENT(IN) :: PSO2DD(KLON) +REAL(KIND=JPRB),INTENT(IN) :: PSOIL_TYPE(KLON) REAL(KIND=JPRB),INTENT(IN) :: PCI(KLON) , PCLAKE(KLON) ,PSST(KLON), PFRTI(KLON,KTILES), PLSM(KLON), PSNS(KLON) REAL(KIND=JPRB),INTENT(IN) :: PINJF(KLON) REAL(KIND=JPRB),INTENT(IN) :: PBLH(KLON) @@ -165,8 +162,8 @@ SUBROUTINE TM5M7_PHY2 & REAL(KIND=JPRB),INTENT(OUT) :: PAERDDP(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO), PAERSDM(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO), PAERSRC(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO) REAL(KIND=JPRB),INTENT(OUT) :: PAERMAP(KLON,5) REAL(KIND=JPRB),INTENT(OUT) :: PAERFLX(KLON,12,9), PAERLIF(KLON,9) -REAL(KIND=JPRB),INTENT(OUT) :: PDMSO(KLON), PLDAY(KLON), PLISS(KLON), PSO2(KLON), PTDMS(KLON) -REAL(KIND=JPRB),INTENT(OUT) :: PDMSI(KLON), PODMS(KLON) +REAL(KIND=JPRB),INTENT(OUT) :: PLDAY(KLON), PLISS(KLON), PSO2(KLON), PTDMS(KLON) +REAL(KIND=JPRB),INTENT(OUT) :: PODMS(KLON) REAL(KIND=JPRB),INTENT(INOUT) :: PEXTRA(KLON,KLEVX,KFLDX) REAL(KIND=JPRB),INTENT(INOUT) :: PSO4SRC(KLON,KLEV),PSO2SRC(KLON,KLEV) @@ -304,13 +301,11 @@ SUBROUTINE TM5M7_PHY2 & DO JL=KIDIA,KFDIA ! ZWND(JL)=SQRT(PUP(JL)*PUP(JL)+PVP(JL)*PVP(JL)) ZWND(JL)=PAERWS(JL) - PDMSO(JL)=0._JPRB PLDAY(JL)=0._JPRB PLISS(JL)=0._JPRB PSO2(JL) =0._JPRB PTDMS(JL)=0._JPRB PODMS(JL)=0._JPRB - PDMSI(JL)=PDMS(JL) ENDDO ! DO JTILE=1,KTILES @@ -322,12 +317,11 @@ SUBROUTINE TM5M7_PHY2 & & KSW , KTRAC , KAERO, & & PALB , PALBD , PAPHI , & & PAERDEP,PAERLTS, PAERSCC, PAERGUST, ZALT, & - & PBCBF , PBCFF , PBCGF, POMBF, POMFF, POMGF, & & PRS1 , PRSF1 , PCI , PCLAKE, PINJF, PBLH, ZDP, PGELAM, PGELAT, PGEMU, PFRTI, PHSDFOR, & & PLSM , PSST , PQP , ZRHO , PSNS , PTP , PTL , PTSPHY, PZ0M, KCHEM, & & ZWND , PWSA1 , PSOIL_TYPE, & & PCVL , PCVH, KTVL, KTVH, & - & PLDAY , PAERFLX, PCFLX, PCEN , PTENC, ZEMIDIAG, PSO2SRC,PSO4SRC,PSOA,PSOACO) + & PLDAY , PAERFLX, PCFLX, PCEN , PTENC, ZEMIDIAG, PSO2SRC,PSO4SRC) ! sea salt and desert dust fluxes in kg m-2 s-1, thus: diff --git a/ifs-source/arpifs/phys_ec/tm5m7_src.F90 b/ifs-source/arpifs/phys_ec/tm5m7_src.F90 index 780a069b..cbc01ac7 100644 --- a/ifs-source/arpifs/phys_ec/tm5m7_src.F90 +++ b/ifs-source/arpifs/phys_ec/tm5m7_src.F90 @@ -3,12 +3,11 @@ SUBROUTINE TM5M7_SRC & & KSW , KTRAC, KAERO,& & PALB , PALBD, PAPHI ,& & PAERDEP, PAERLTS, PAERSCC, PAERGUST, PALTH ,& - & PBCBF, PBCFF, PBCGF, POMBF, POMFF, POMGF,& & PAPH , PAP , PCI , PCLAKE, PINJF, PBLH, PDELP, PGELAM, PGELAT, PGEMU , PFRTI , PHSDFOR,& & PLSM , PSST , PQ , PRHO , PSNS , PT , PTL , PTSPHY, PZ0M, KCHEM,& & PWIND, PWS1 ,PSOIL_TYPE, & & PCVL, PCVH, KTVL, KTVH, & - & PLDAY, PAERFLX, PCFLX , PCEN , PTENC, PEMIDIAG, PSO2SRC,PSO4SRC,PSOA,PSOACO) + & PLDAY, PAERFLX, PCFLX , PCEN , PTENC, PEMIDIAG, PSO2SRC,PSO4SRC) !*** * TM5M7_SRC* - SOURCE TERMS FOR TM5M7 AEROSOL SCHEME @@ -79,7 +78,10 @@ SUBROUTINE TM5M7_SRC & REAL(KIND=JPRB) ,INTENT(IN) :: PALB(KLON), PALBD(KLON,KSW) REAL(KIND=JPRB) ,INTENT(IN) :: PAPHI(KLON,0:KLEV), PALTH(KLON,0:KLEV) REAL(KIND=JPRB) ,INTENT(IN) :: PAERDEP(KLON), PAERLTS(KLON), PAERSCC(KLON) -REAL(KIND=JPRB) ,INTENT(IN) :: PBCBF(KLON), PBCFF(KLON), PBCGF(KLON), POMBF(KLON), POMFF(KLON), POMGF(KLON) +!Vincent Huijnen This piece of code should be removed and picked up elsewhere!! For now define local variables +!REAL(KIND=JPRB) ,INTENT(IN) :: ZBCBF(KLON), ZBCFF(KLON), ZBCGF(KLON), POMBF(KLON), POMFF(KLON), POMGF(KLON) +REAL(KIND=JPRB) :: ZBCBF(KLON), ZBCFF(KLON), ZBCGF(KLON), ZOMBF(KLON), ZOMFF(KLON), ZOMGF(KLON) +!End VH REAL(KIND=JPRB), INTENT(IN) :: PAERGUST(KLON), PHSDFOR(KLON) REAL(KIND=JPRB) ,INTENT(IN) :: PAP(KLON,KLEV), PAPH(KLON,0:KLEV) REAL(KIND=JPRB) ,INTENT(IN) :: PGELAM(KLON), PGELAT(KLON), PGEMU(KLON) @@ -109,8 +111,6 @@ SUBROUTINE TM5M7_SRC & REAL(KIND=JPRB) ,INTENT(INOUT) :: PLDAY(KLON) REAL(KIND=JPRB) ,INTENT(INOUT) :: PEMIDIAG(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO) REAL(KIND=JPRB),INTENT(INOUT) :: PSO4SRC(KLON,KLEV),PSO2SRC(KLON,KLEV) -REAL(KIND=JPRB) ,INTENT(IN) :: PSOACO(KLON) -REAL(KIND=JPRB) ,INTENT(IN) :: PSOA(KLON) !* 0.5 LOCAL VARIABLES @@ -135,7 +135,6 @@ SUBROUTINE TM5M7_SRC & !-- various sources REAL(KIND=JPRB) :: ZLOCALTIM , ZDIURN(KLON) -REAL(KIND=JPRB) :: ZBCGF(KLON) REAL(KIND=JPRB) :: ZWNDDU(KLON), ZWNDSS(KLON) REAL(KIND=JPRB) :: ZBCSOURC, ZOMSOURC REAL(KIND=JPRB) :: ZDEGRAD @@ -212,7 +211,7 @@ SUBROUTINE TM5M7_SRC & -ASSOCIATE(LAERODIU=>YDCOMPO%LAERODIU, YAERO=>YGFL%YAERO, LFIRE=>YDCOMPO%LFIRE, LINJ=>YDCOMPO%LINJ, & +ASSOCIATE(YAERO=>YGFL%YAERO, & & NACTAERO=>YGFL%NACTAERO, NAERO=>YGFL%NAERO, & & NDGLG=>YDGEOMETRY%YRDIM%NDGLG, RHGMT=>YDRIP%RHGMT, & & RSTATI => YDRIP%RSTATI, RSIDECA=>YDEAERSRC%RSIDECA, & @@ -300,9 +299,9 @@ SUBROUTINE TM5M7_SRC & ZLOCALTIM =RHGMT + ZGLON(JL)/360._JPRB*RDAY ZDIURN(JL)=COS( ((ZLOCALTIM-54000._JPRB)/RDAY) * 2._JPRB*RPI)+1._JPRB ENDDO -IF (.NOT.LAERODIU) THEN - ZDIURN(KIDIA:KFDIA)=1.0_JPRB -ENDIF +!VH IF (.NOT.LAERODIU) THEN +!VH ZDIURN(KIDIA:KFDIA)=1.0_JPRB +!VH ENDIF @@ -437,9 +436,9 @@ SUBROUTINE TM5M7_SRC & frac_bf(KIDIA:KFDIA)=1.0_JPRB ! calculate mass fraction related to solid biofuel - where ( POMFF(KIDIA:KFDIA) > 1E-30_JPRB ) - frac_bf(KIDIA:KFDIA) = POMBF(KIDIA:KFDIA) / & - POMFF(KIDIA:KFDIA) + where ( ZOMFF(KIDIA:KFDIA) > 1E-30_JPRB ) + frac_bf(KIDIA:KFDIA) = ZOMBF(KIDIA:KFDIA) / & + ZOMFF(KIDIA:KFDIA) elsewhere frac_bf(KIDIA:KFDIA) = 0.0_JPRB endwhere @@ -456,135 +455,135 @@ SUBROUTINE TM5M7_SRC & ! Fossil fuel categories.. DO JL=KIDIA,KFDIA emis_mass (mode_aii)%d3(JL,KLEV,2) = & - & emis_mass (mode_aii)%d3(JL,KLEV,2) + POMFF(JL) * & + & emis_mass (mode_aii)%d3(JL,KLEV,2) + ZOMFF(JL) * & & ( (1.-frac_bf(JL)) * (1.-frac_pom_sol_ff) + & & frac_bf(JL) * (1.-frac_pom_sol_bf) ) emis_number(mode_aii)%d3(JL,KLEV,2) = & - & emis_number(mode_aii)%d3(JL,KLEV,2) + POMFF(JL) * & + & emis_number(mode_aii)%d3(JL,KLEV,2) + ZOMFF(JL) * & & ( (1.-frac_bf(JL)) * (1.-frac_pom_sol_ff) * mass2numb_nonbf_insol + & & frac_bf(JL) * (1.-frac_pom_sol_bf) * mass2numb_bf_insol ) emis_mass (mode_ais)%d3(JL,KLEV,3) = & - & emis_mass (mode_ais)%d3(JL,KLEV,3) + POMFF(JL) * & + & emis_mass (mode_ais)%d3(JL,KLEV,3) + ZOMFF(JL) * & & ( (1.-frac_bf(JL)) * frac_pom_sol_ff ) emis_number(mode_ais)%d3(JL,KLEV,3) = & - & emis_number(mode_ais)%d3(JL,KLEV,3) + POMFF(JL) * & + & emis_number(mode_ais)%d3(JL,KLEV,3) + ZOMFF(JL) * & & ( (1.-frac_bf(JL)) * frac_pom_sol_ff * mass2numb_nonbf_sol ) emis_mass (mode_acs)%d3(JL,KLEV,3) = & - & emis_mass (mode_acs)%d3(JL,KLEV,3) + POMFF(JL) * & + & emis_mass (mode_acs)%d3(JL,KLEV,3) + ZOMFF(JL) * & & ( frac_bf(JL) * frac_pom_sol_bf ) emis_number(mode_acs)%d3(JL,KLEV,3) = & - & emis_number(mode_acs)%d3(JL,KLEV,3) + POMFF(JL) * & + & emis_number(mode_acs)%d3(JL,KLEV,3) + ZOMFF(JL) * & & ( frac_bf(JL) * frac_pom_sol_bf * mass2numb_bf_sol ) ENDDO - ! Biofuel categories ? (POMBF emissions) + ! Biofuel categories ? (ZOMBF emissions) !!$ IF (.not. LAERCHEM)THEN !!$ ! SOA from CO - DO JL=KIDIA,KFDIA - ZSOA(JL)=0._JPRB - IF (LAERSOA_CHEM) THEN - ZSOA(JL)=MAX(PSOACO(JL),PSOA(JL)) - ELSE - ZSOA(JL)=PSOACO(JL) - ENDIF - ZOMSOURC=ZOMSOURC+ZSOA(JL) - END DO +!VH DO JL=KIDIA,KFDIA +!VH ZSOA(JL)=0._JPRB +!VH IF (LAERSOA_CHEM) THEN +!VH ZSOA(JL)=MAX(PSOACO(JL),PSOA(JL)) +!VH ELSE +!VH ZSOA(JL)=PSOACO(JL) +!VH ENDIF +!VH ZOMSOURC=ZOMSOURC+ZSOA(JL) +!VH END DO ! These do not apply for M7 !!$ PCFLX(JL,KAERO(INBAER+1))= -ZOMSOURC * ROMPHIL !!$ PCFLX(JL,KAERO(INBAER+2))= -ZOMSOURC * ROMPHOB !!$ END IF ! biomass burning - IF (LFIRE) THEN - IF (LINJ) THEN - DO JL=KIDIA,KFDIA - ! Height of injection for biomass burning emissions : update emis_mass - IF (PINJF(JL) > 200._JPRB .AND. PBLH(JL) > 1500._JPRB) THEN - IX=MINLOC( ABS( (PAPHI(JL,1:KLEV)-PAPHI(JL,KLEV))/RG - PINJF(JL))) - ILINJ1=IX(1) - ILINJ2=ILINJ1 - ! calculate total deltap over injected levels - ZDELP=0.0_JPRB - DO JK = ILINJ1, ILINJ2 - ZDELP = ZDELP + PDELP(JL,JK) - ENDDO - DO JK = ILINJ1, ILINJ2 - - ! add to emis target arrays - emis_mass (mode_aii)%d3(JL,JK,2) = & - & emis_mass (mode_aii)%d3(JL,JK,2) + POMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & - & (1.-frac_pom_sol_bb) - - emis_number(mode_aii)%d3(JL,JK,2) = & - & emis_number(mode_aii)%d3(JL,JK,2) + POMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & - & (1.-frac_pom_sol_bb) * mass2numb_bb_insol - - emis_mass (mode_acs)%d3(JL,JK,3) = & - & emis_mass (mode_acs)%d3(JL,JK,3) + POMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & - & frac_pom_sol_bb - - emis_number(mode_acs)%d3(JL,JK,3) = & - & emis_number(mode_acs)%d3(JL,JK,3) + POMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & - & frac_pom_sol_bb * mass2numb_bb_sol - ENDDO - ELSE - ZDELP=0.0_JPRB - DO JK = KLEV-3, KLEV-2 - ZDELP = ZDELP + PDELP(JL,JK) - ENDDO - DO JK = KLEV-3, KLEV-2 - ! add to emis target arrays - emis_mass (mode_aii)%d3(JL,JK,2) = & - & emis_mass (mode_aii)%d3(JL,JK,2) + POMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & - & (1.-frac_pom_sol_bb) - - emis_number(mode_aii)%d3(JL,JK,2) = & - & emis_number(mode_aii)%d3(JL,JK,2) + POMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & - & (1.-frac_pom_sol_bb) * mass2numb_bb_insol - - emis_mass (mode_acs)%d3(JL,JK,3) = & - & emis_mass (mode_acs)%d3(JL,JK,3) + POMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & - & frac_pom_sol_bb - - emis_number(mode_acs)%d3(JL,JK,3) = & - & emis_number(mode_acs)%d3(JL,JK,3) + POMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & - & frac_pom_sol_bb * mass2numb_bb_sol - ENDDO - ENDIF - ENDDO - ELSE ! LINJ=false: always injection at lowest levels - DO JL=KIDIA,KFDIA - ZDELP=0.0_JPRB - DO JK = KLEV-2, KLEV-1 - ZDELP = ZDELP + PDELP(JL,JK) - ENDDO - DO JK = KLEV-2, KLEV - ! add to emis target arrays - emis_mass (mode_aii)%d3(JL,JK,2) = & - & emis_mass (mode_aii)%d3(JL,JK,2) + POMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & - & (1.-frac_pom_sol_bb) - - emis_number(mode_aii)%d3(JL,JK,2) = & - & emis_number(mode_aii)%d3(JL,JK,2) + POMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & - & (1.-frac_pom_sol_bb) * mass2numb_bb_insol - - emis_mass (mode_acs)%d3(JL,JK,3) = & - & emis_mass (mode_acs)%d3(JL,JK,3) + POMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & - & frac_pom_sol_bb - - emis_number(mode_acs)%d3(JL,JK,3) = & - & emis_number(mode_acs)%d3(JL,JK,3) + POMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & - & frac_pom_sol_bb * mass2numb_bb_sol - ENDDO - ENDDO - ENDIF ! LINJ - ENDIF ! LFIRE +!VH IF (LFIRE) THEN +!VH IF (LINJ) THEN +!VH DO JL=KIDIA,KFDIA +!VH ! Height of injection for biomass burning emissions : update emis_mass +!VH IF (PINJF(JL) > 200._JPRB .AND. PBLH(JL) > 1500._JPRB) THEN +!VH IX=MINLOC( ABS( (PAPHI(JL,1:KLEV)-PAPHI(JL,KLEV))/RG - PINJF(JL))) +!VH ILINJ1=IX(1) +!VH ILINJ2=ILINJ1 +!VH ! calculate total deltap over injected levels +!VH ZDELP=0.0_JPRB +!VH DO JK = ILINJ1, ILINJ2 +!VH ZDELP = ZDELP + PDELP(JL,JK) +!VH ENDDO +!VH DO JK = ILINJ1, ILINJ2 +!VH +!VH ! add to emis target arrays +!VH emis_mass (mode_aii)%d3(JL,JK,2) = & +!VH & emis_mass (mode_aii)%d3(JL,JK,2) + ZOMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & +!VH & (1.-frac_pom_sol_bb) +!VH +!VH emis_number(mode_aii)%d3(JL,JK,2) = & +!VH & emis_number(mode_aii)%d3(JL,JK,2) + ZOMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & +!VH & (1.-frac_pom_sol_bb) * mass2numb_bb_insol +!VH +!VH emis_mass (mode_acs)%d3(JL,JK,3) = & +!VH & emis_mass (mode_acs)%d3(JL,JK,3) + ZOMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & +!VH & frac_pom_sol_bb +!VH +!VH emis_number(mode_acs)%d3(JL,JK,3) = & +!VH & emis_number(mode_acs)%d3(JL,JK,3) + ZOMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & +!VH & frac_pom_sol_bb * mass2numb_bb_sol +!VH ENDDO +!VH ELSE +!VH ZDELP=0.0_JPRB +!VH DO JK = KLEV-3, KLEV-2 +!VH ZDELP = ZDELP + PDELP(JL,JK) +!VH ENDDO +!VH DO JK = KLEV-3, KLEV-2 +!VH ! add to emis target arrays +!VH emis_mass (mode_aii)%d3(JL,JK,2) = & +!VH & emis_mass (mode_aii)%d3(JL,JK,2) + ZOMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & +!VH & (1.-frac_pom_sol_bb) +!VH +!VH emis_number(mode_aii)%d3(JL,JK,2) = & +!VH & emis_number(mode_aii)%d3(JL,JK,2) + ZOMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & +!VH & (1.-frac_pom_sol_bb) * mass2numb_bb_insol +!VH +!VH emis_mass (mode_acs)%d3(JL,JK,3) = & +!VH & emis_mass (mode_acs)%d3(JL,JK,3) + ZOMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & +!VH & frac_pom_sol_bb +!VH +!VH emis_number(mode_acs)%d3(JL,JK,3) = & +!VH & emis_number(mode_acs)%d3(JL,JK,3) + ZOMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & +!VH & frac_pom_sol_bb * mass2numb_bb_sol +!VH ENDDO +!VH ENDIF +!VH ENDDO +!VH ELSE ! LINJ=false: always injection at lowest levels +!VH DO JL=KIDIA,KFDIA +!VH ZDELP=0.0_JPRB +!VH DO JK = KLEV-2, KLEV-1 +!VH ZDELP = ZDELP + PDELP(JL,JK) +!VH ENDDO +!VH DO JK = KLEV-2, KLEV +!VH ! add to emis target arrays +!VH emis_mass (mode_aii)%d3(JL,JK,2) = & +!VH & emis_mass (mode_aii)%d3(JL,JK,2) + ZOMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & +!VH & (1.-frac_pom_sol_bb) +!VH +!VH emis_number(mode_aii)%d3(JL,JK,2) = & +!VH & emis_number(mode_aii)%d3(JL,JK,2) + ZOMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & +!VH & (1.-frac_pom_sol_bb) * mass2numb_bb_insol +!VH +!VH emis_mass (mode_acs)%d3(JL,JK,3) = & +!VH & emis_mass (mode_acs)%d3(JL,JK,3) + ZOMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & +!VH & frac_pom_sol_bb +!VH +!VH emis_number(mode_acs)%d3(JL,JK,3) = & +!VH & emis_number(mode_acs)%d3(JL,JK,3) + ZOMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & +!VH & frac_pom_sol_bb * mass2numb_bb_sol +!VH ENDDO +!VH ENDDO +!VH ENDIF ! LINJ +!VH ENDIF ! LFIRE !----------------------------------------------------------------------- @@ -624,9 +623,9 @@ SUBROUTINE TM5M7_SRC & ! frac_bf(KIDIA:KFDIA)=1.0_JPRB ! calculate mass fraction related to solid biofuel - where ( PBCFF(KIDIA:KFDIA) > 1E-30_JPRB ) - frac_bf(KIDIA:KFDIA) = PBCBF(KIDIA:KFDIA) / & - PBCFF(KIDIA:KFDIA) + where ( ZBCFF(KIDIA:KFDIA) > 1E-30_JPRB ) + frac_bf(KIDIA:KFDIA) = ZBCBF(KIDIA:KFDIA) / & + ZBCFF(KIDIA:KFDIA) elsewhere frac_bf(KIDIA:KFDIA) = 0.0_JPRB endwhere @@ -644,122 +643,122 @@ SUBROUTINE TM5M7_SRC & ! Fossil fuel categories.. DO JL=KIDIA,KFDIA emis_mass (mode_aii)%d3(JL,KLEV,1) = & - & emis_mass (mode_aii)%d3(JL,KLEV,1) + PBCFF(JL) * & + & emis_mass (mode_aii)%d3(JL,KLEV,1) + ZBCFF(JL) * & & ( (1.-frac_bf(JL)) * (1.-frac_bc_sol_ff) + & & frac_bf(JL) * (1.-frac_bc_sol_bf) ) emis_number(mode_aii)%d3(JL,KLEV,1) = & - & emis_number(mode_aii)%d3(JL,KLEV,1) + PBCFF(JL) * & + & emis_number(mode_aii)%d3(JL,KLEV,1) + ZBCFF(JL) * & & ( (1.-frac_bf(JL)) * (1.-frac_bc_sol_ff) * mass2numb_nonbf_insol + & & frac_bf(JL) * (1.-frac_bc_sol_bf) * mass2numb_bf_insol ) emis_mass (mode_ais)%d3(JL,KLEV,2) = & - & emis_mass (mode_ais)%d3(JL,KLEV,2) + PBCFF(JL) * & + & emis_mass (mode_ais)%d3(JL,KLEV,2) + ZBCFF(JL) * & & ( (1.-frac_bf(JL)) * frac_bc_sol_ff ) emis_number(mode_ais)%d3(JL,KLEV,2) = & - & emis_number(mode_ais)%d3(JL,KLEV,2) + PBCFF(JL) * & + & emis_number(mode_ais)%d3(JL,KLEV,2) + ZBCFF(JL) * & & ( (1.-frac_bf(JL)) * frac_bc_sol_ff * mass2numb_nonbf_sol ) emis_mass (mode_acs)%d3(JL,KLEV,2) = & - & emis_mass (mode_acs)%d3(JL,KLEV,2) + PBCFF(JL) * & + & emis_mass (mode_acs)%d3(JL,KLEV,2) + ZBCFF(JL) * & & ( frac_bf(JL) * frac_bc_sol_bf ) emis_number(mode_acs)%d3(JL,KLEV,2) = & - & emis_number(mode_acs)%d3(JL,KLEV,2) + PBCFF(JL) * & + & emis_number(mode_acs)%d3(JL,KLEV,2) + ZBCFF(JL) * & & ( frac_bf(JL) * frac_bc_sol_bf * mass2numb_bf_sol ) ENDDO - ! Biofuel categories ? (PBCBF emissions - currently not treated..) + ! Biofuel categories ? (ZBCBF emissions - currently not treated..) ! biomass burning - IF (LFIRE) THEN - IF (LINJ) THEN - DO JL=KIDIA,KFDIA - ! Height of injection for biomass burning emissions : update emis_mass - - IF (PINJF(JL) > 200._JPRB .AND. PBLH(JL) > 1500._JPRB) THEN - IX=MINLOC( ABS( (PAPHI(JL,1:KLEV)-PAPHI(JL,KLEV))/RG - PINJF(JL))) - ILINJ1=IX(1) - ILINJ2=ILINJ1 - ! calculate total deltap over injected levels - ZDELP=0.0_JPRB - DO JK = ILINJ1, ILINJ2 - ZDELP = ZDELP + PDELP(JL,JK) - ENDDO - DO JK = ILINJ1, ILINJ2 - - ! add to emis target arrays - emis_mass (mode_aii)%d3(JL,JK,1) = & - & emis_mass (mode_aii)%d3(JL,JK,1) + PBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & - & (1.-frac_bc_sol_bb) - - emis_number(mode_aii)%d3(JL,JK,1) = & - & emis_number(mode_aii)%d3(JL,JK,1) + PBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & - & (1.-frac_bc_sol_bb) * mass2numb_bb_insol - - emis_mass (mode_acs)%d3(JL,JK,2) = & - & emis_mass (mode_acs)%d3(JL,JK,2) + PBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & - & frac_bc_sol_bb - - emis_number(mode_acs)%d3(JL,JK,2) = & - & emis_number(mode_acs)%d3(JL,JK,2) + PBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & - & frac_bc_sol_bb * mass2numb_bb_sol - ENDDO - ELSE - ZDELP=0.0_JPRB - DO JK = KLEV-3, KLEV-2 - ZDELP = ZDELP + PDELP(JL,JK) - ENDDO - DO JK = KLEV-3, KLEV-2 - ! add to emis target arrays - emis_mass (mode_aii)%d3(JL,JK,1) = & - & emis_mass (mode_aii)%d3(JL,JK,1) + PBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & - & (1.-frac_bc_sol_bb) - - emis_number(mode_aii)%d3(JL,JK,1) = & - & emis_number(mode_aii)%d3(JL,JK,1) + PBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & - & (1.-frac_bc_sol_bb) * mass2numb_bb_insol - - emis_mass (mode_acs)%d3(JL,JK,2) = & - & emis_mass (mode_acs)%d3(JL,JK,2) + PBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & - & frac_bc_sol_bb - - emis_number(mode_acs)%d3(JL,JK,2) = & - & emis_number(mode_acs)%d3(JL,JK,2) + PBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & - & frac_bc_sol_bb * mass2numb_bb_sol - ENDDO - ENDIF - ENDDO - ELSE ! LINJ=false: always injection at lowest levels - DO JL=KIDIA,KFDIA - ZDELP=0.0_JPRB - DO JK = KLEV-2, KLEV-1 - ZDELP = ZDELP + PDELP(JL,JK) - ENDDO - DO JK = KLEV-2, KLEV - ! add to emis target arrays - emis_mass (mode_aii)%d3(JL,JK,1) = & - & emis_mass (mode_aii)%d3(JL,JK,1) + PBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & - & (1.-frac_bc_sol_bb) - - emis_number(mode_aii)%d3(JL,JK,1) = & - & emis_number(mode_aii)%d3(JL,JK,1) + PBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & - & (1.-frac_bc_sol_bb) * mass2numb_bb_insol - - emis_mass (mode_acs)%d3(JL,JK,2) = & - & emis_mass (mode_acs)%d3(JL,JK,2) + PBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & - & frac_bc_sol_bb - - emis_number(mode_acs)%d3(JL,JK,2) = & - & emis_number(mode_acs)%d3(JL,JK,2) + PBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & - & frac_bc_sol_bb * mass2numb_bb_sol - ENDDO - ENDDO - ENDIF ! LINJ - ENDIF ! LFIRE +!VH IF (LFIRE) THEN +!VH IF (LINJ) THEN +!VH DO JL=KIDIA,KFDIA +!VH ! Height of injection for biomass burning emissions : update emis_mass +!VH +!VH IF (PINJF(JL) > 200._JPRB .AND. PBLH(JL) > 1500._JPRB) THEN +!VH IX=MINLOC( ABS( (PAPHI(JL,1:KLEV)-PAPHI(JL,KLEV))/RG - PINJF(JL))) +!VH ILINJ1=IX(1) +!VH ILINJ2=ILINJ1 +!VH ! calculate total deltap over injected levels +!VH ZDELP=0.0_JPRB +!VH DO JK = ILINJ1, ILINJ2 +!VH ZDELP = ZDELP + PDELP(JL,JK) +!VH ENDDO +!VH DO JK = ILINJ1, ILINJ2 +!VH +!VH ! add to emis target arrays +!VH emis_mass (mode_aii)%d3(JL,JK,1) = & +!VH & emis_mass (mode_aii)%d3(JL,JK,1) + ZBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & +!VH & (1.-frac_bc_sol_bb) +!VH +!VH emis_number(mode_aii)%d3(JL,JK,1) = & +!VH & emis_number(mode_aii)%d3(JL,JK,1) + ZBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & +!VH & (1.-frac_bc_sol_bb) * mass2numb_bb_insol +!VH +!VH emis_mass (mode_acs)%d3(JL,JK,2) = & +!VH & emis_mass (mode_acs)%d3(JL,JK,2) + ZBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & +!VH & frac_bc_sol_bb +!VH +!VH emis_number(mode_acs)%d3(JL,JK,2) = & +!VH & emis_number(mode_acs)%d3(JL,JK,2) + ZBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & +!VH & frac_bc_sol_bb * mass2numb_bb_sol +!VH ENDDO +!VH ELSE +!VH ZDELP=0.0_JPRB +!VH DO JK = KLEV-3, KLEV-2 +!VH ZDELP = ZDELP + PDELP(JL,JK) +!VH ENDDO +!VH DO JK = KLEV-3, KLEV-2 +!VH ! add to emis target arrays +!VH emis_mass (mode_aii)%d3(JL,JK,1) = & +!VH & emis_mass (mode_aii)%d3(JL,JK,1) + ZBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & +!VH & (1.-frac_bc_sol_bb) +!VH +!VH emis_number(mode_aii)%d3(JL,JK,1) = & +!VH & emis_number(mode_aii)%d3(JL,JK,1) + ZBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & +!VH & (1.-frac_bc_sol_bb) * mass2numb_bb_insol +!VH +!VH emis_mass (mode_acs)%d3(JL,JK,2) = & +!VH & emis_mass (mode_acs)%d3(JL,JK,2) + ZBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & +!VH & frac_bc_sol_bb +!VH +!VH emis_number(mode_acs)%d3(JL,JK,2) = & +!VH & emis_number(mode_acs)%d3(JL,JK,2) + ZBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & +!VH & frac_bc_sol_bb * mass2numb_bb_sol +!VH ENDDO +!VH ENDIF +!VH ENDDO +!VH ELSE ! LINJ=false: always injection at lowest levels +!VH DO JL=KIDIA,KFDIA +!VH ZDELP=0.0_JPRB +!VH DO JK = KLEV-2, KLEV-1 +!VH ZDELP = ZDELP + PDELP(JL,JK) +!VH ENDDO +!VH DO JK = KLEV-2, KLEV +!VH ! add to emis target arrays +!VH emis_mass (mode_aii)%d3(JL,JK,1) = & +!VH & emis_mass (mode_aii)%d3(JL,JK,1) + ZBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & +!VH & (1.-frac_bc_sol_bb) +!VH +!VH emis_number(mode_aii)%d3(JL,JK,1) = & +!VH & emis_number(mode_aii)%d3(JL,JK,1) + ZBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & +!VH & (1.-frac_bc_sol_bb) * mass2numb_bb_insol +!VH +!VH emis_mass (mode_acs)%d3(JL,JK,2) = & +!VH & emis_mass (mode_acs)%d3(JL,JK,2) + ZBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & +!VH & frac_bc_sol_bb +!VH +!VH emis_number(mode_acs)%d3(JL,JK,2) = & +!VH & emis_number(mode_acs)%d3(JL,JK,2) + ZBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & +!VH & frac_bc_sol_bb * mass2numb_bb_sol +!VH ENDDO +!VH ENDDO +!VH ENDIF ! LINJ +!VH ENDIF ! LFIRE diff --git a/ifs-source/arpifs/setup/su_surf_flds.F90 b/ifs-source/arpifs/setup/su_surf_flds.F90 index af9949a1..27dcf30a 100644 --- a/ifs-source/arpifs/setup/su_surf_flds.F90 +++ b/ifs-source/arpifs/setup/su_surf_flds.F90 @@ -198,7 +198,7 @@ SUBROUTINE SU_SURF_FLDS(YDDIMV,YDSURF,YDMODEL,LDVERBOSE) & NGRBAERLS01,NGRBAERLS02,NGRBAERLS10,NGRBAERLS03,NGRBAERLS04,NGRBAERLS11,& & NGRBAERLS05,NGRBAERLS06,NGRBAERLS12,NGRBAERLS07,NGRBAERLS08,NGRBAERLS09,& & NGRBAEODSS ,NGRBAEODDU ,NGRBAEODOM ,NGRBAEODBC ,NGRBAEODSU ,& - & NGRBAEODNI ,NGRBAEODAM, NGRBAEODSOA, NGRBAERSOAC, & + & NGRBAEODNI ,NGRBAEODAM, NGRBAEODSOA,& & NGRBAEODVFA,NGRBAEODVSU,NGRBACCAOD550,NGRBAEPM1 ,NGRBAEPM25 ,NGRBAEPM10 ,& & NGRBUVBED, NGRBUVBEDCS ,& & NGRBFASGPPCOEF, NGRBFASRECCOEF,NGRBCLBT, NGRBCSBT,& @@ -317,13 +317,12 @@ SUBROUTINE SU_SURF_FLDS(YDDIMV,YDSURF,YDMODEL,LDVERBOSE) & NCOM=>YDDPHY%NCOM, NVEXTRRAD=>YDDPHY%NVEXTRRAD, NCXP=>YDDPHY%NCXP, & & NVECOUT=>YDDPHY%NVECOUT, NSURFEXCTLMAX=>YDMSE%NSURFEXCTLMAX, & & LMSE=>YDARPHY%LMSE, NFPCLI=>YLNAMFPSCI%NFPCLI,NFPSWI=>YLNAMFPSCI%NFPSWI, & - & YGHG=>YGFL%YGHG, NGEMS=>YGFL%NGEMS, & + & YGHG=>YGFL%YGHG, & & YCHEM=>YGFL%YCHEM, NGHG=>YGFL%NGHG, & & NCHEM_TC=>YGFL%NCHEM_TC, NCHEM_DV=>YGFL%NCHEM_DV, & & NCHEM_FLXO=>YGFL%NCHEM_FLXO, NCHEM=>YGFL%NCHEM, & & NCHEM_WDFLX=>YGFL%NCHEM_WDFLX, NCHEM_DDFLX=>YGFL%NCHEM_DDFLX, & & NEMIS2D=>YGFL%NEMIS2D, NEMIS2D_DESC=>YDCOMPO%NEMIS2D_DESC, YEMIS2D_DESC=>YDCOMPO%YEMIS2D_DESC, & - & LAEROSFC=>YDCOMPO%LAEROSFC, & & NEMIS2DAUX=>YGFL%NEMIS2DAUX, YEMIS2DAUX_DESC=>YDCOMPO%YEMIS2DAUX_DESC, & & NACTAERO=>YGFL%NACTAERO, YAERO=>YGFL%YAERO, YAERO_DESC=>YDEAERATM%YAERO_DESC, & & NGP5_OOPS=>YDSURF%NGP5_OOPS, NTRAJ_CST_OOPS=>YDSURF%NTRAJ_CST_OOPS, & @@ -388,7 +387,6 @@ SUBROUTINE SU_SURF_FLDS(YDDIMV,YDSURF,YDMODEL,LDVERBOSE) & LDPRECIPS=>YDPHY%LDPRECIPS,LDPRECIPS2=>YDPHY%LDPRECIPS2, & & NDTPREC=>YDPHY%YRDPRECIPS%NDTPREC, NDTPREC2=>YDPHY%YRDPRECIPS%NDTPREC2,& & LAERCHEM=>YGFL%LAERCHEM, LAERNITRATE=>YDCOMPO%LAERNITRATE, & - & LFIRE=>YDCOMPO%LFIRE, & & AERO_SCHEME=>YDCOMPO%AERO_SCHEME, & & LAERSOA=>YDCOMPO%LAERSOA,LAERSOA_COUPLED=>YDCOMPO%LAERSOA_COUPLED,& & LAERRESUSPENSION=>YDCOMPO%LAERRESUSPENSION,& @@ -1116,23 +1114,9 @@ SUBROUTINE SU_SURF_FLDS(YDDIMV,YDSURF,YDMODEL,LDVERBOSE) YSD_VF%YSO2DD => YSD_VF%YVF(JPMAXSFLDS) ! - IF (LAEROSFC) THEN +IF (TRIM(AERO_SCHEME)=="tm5m7" .or. TRIM(AERO_SCHEME)=="hamm7" ) THEN YSD_VF%YSOILTYPE=> YSD_VF%YVF(JPMAXSFLDS) - YSD_VF%YBCBF => YSD_VF%YVF(JPMAXSFLDS) - YSD_VF%YBCFF => YSD_VF%YVF(JPMAXSFLDS) - YSD_VF%YBCGF => YSD_VF%YVF(JPMAXSFLDS) - YSD_VF%YOMBF => YSD_VF%YVF(JPMAXSFLDS) - YSD_VF%YOMFF => YSD_VF%YVF(JPMAXSFLDS) - YSD_VF%YOMGF => YSD_VF%YVF(JPMAXSFLDS) - - YSD_VF%YSO2L => YSD_VF%YVF(JPMAXSFLDS) - YSD_VF%YSO2H => YSD_VF%YVF(JPMAXSFLDS) - YSD_VF%YSOGF => YSD_VF%YVF(JPMAXSFLDS) - YSD_VF%YVOLC => YSD_VF%YVF(JPMAXSFLDS) - YSD_VF%YVOLE => YSD_VF%YVF(JPMAXSFLDS) - YSD_VF%YSOA => YSD_VF%YVF(JPMAXSFLDS) - YSD_VF%YSOACO => YSD_VF%YVF(JPMAXSFLDS) - ENDIF +ENDIF YSD_VF%YCHEMFLXO => YSD_VF%YVF(JPMAXSFLDS:JPMAXSFLDS) YSD_VF%YCHEMDDFLX => YSD_VF%YVF(JPMAXSFLDS:JPMAXSFLDS) @@ -1329,90 +1313,19 @@ SUBROUTINE SU_SURF_FLDS(YDDIMV,YDSURF,YDMODEL,LDVERBOSE) ENDIF - IF (NACTAERO > 0) THEN ! added for M7 - IF (LAEROSFC) THEN !!! - YSD_VF%YAERDEP => YSD_VF%YVF(YSD_VFD%IPTR) - CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YAERDEP,& - & KGRIB=NGRBAERDEP,CDNAME='Dust emiss poten',KTRAJ=2,KREQIN=-1) - YSD_VF%YAERLTS => YSD_VF%YVF(YSD_VFD%IPTR) - CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YAERLTS,& - & KGRIB=NGRBAERLTS,CDNAME='Lift thresh sped',KTRAJ=2,KREQIN=-1) - YSD_VF%YAERSCC => YSD_VF%YVF(YSD_VFD%IPTR) - CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YAERSCC,& - & KGRIB=NGRBAERSCC,CDNAME='Soil clay contnt',KTRAJ=2,KREQIN=-1) - !TM5/M7 ancillary data - YSD_VF%YSOILTYPE => YSD_VF%YVF(YSD_VFD%IPTR) - IF (TRIM(AERO_SCHEME) == "tm5m7" .or. TRIM(AERO_SCHEME) == "hamm7" ) THEN - IREQIN=1 - ELSE - IREQIN=-1 - END IF - CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YSOILTYPE, & - & KGRIB=NGRBSOILTYPE, CDNAME='TM5M7 soil type',KTRAJ=2,KREQIN=IREQIN) - - YSD_VF%YBCBF => YSD_VF%YVF(YSD_VFD%IPTR) - CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YBCBF,& - & KGRIB=NGRBAERLS01,CDNAME='BlckCarbn biogen',KTRAJ=2,KREQIN=1) - YSD_VF%YBCFF => YSD_VF%YVF(YSD_VFD%IPTR) - CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YBCFF,& - & KGRIB=NGRBAERLS02,CDNAME='BlckCarbn fossil',KTRAJ=2,KREQIN=1) - IF (LFIRE) THEN - YSD_VF%YBCGF => YSD_VF%YVF(YSD_VFD%IPTR) - CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YBCGF,& - & KGRIB=NGRBAERLS10,CDNAME='BlackCarbon GFED',KTRAJ=2,KREQIN=1) - ENDIF - YSD_VF%YOMBF => YSD_VF%YVF(YSD_VFD%IPTR) - CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YOMBF,& - & KGRIB=NGRBAERLS03,CDNAME='Organic biogenic',KTRAJ=2,KREQIN=1) - YSD_VF%YOMFF => YSD_VF%YVF(YSD_VFD%IPTR) - CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YOMFF,& - & KGRIB=NGRBAERLS04,CDNAME='Organic fossil ',KTRAJ=2,KREQIN=1) - IF (LFIRE) THEN - YSD_VF%YOMGF => YSD_VF%YVF(YSD_VFD%IPTR) - CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YOMGF,& - & KGRIB=NGRBAERLS11,CDNAME='Organic GFED ',KTRAJ=2,KREQIN=1) - ENDIF - IF (LAERCHEM) THEN - IREQIN=-1 - ELSE - IREQIN=1 - ENDIF - YSD_VF%YSO2L => YSD_VF%YVF(YSD_VFD%IPTR) - CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YSO2L,& - & KGRIB=NGRBAERLS05,CDNAME='Sulphate low-lvl',KTRAJ=2,KREQIN=IREQIN) - YSD_VF%YSO2H => YSD_VF%YVF(YSD_VFD%IPTR) - CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YSO2H,& - & KGRIB=NGRBAERLS06,CDNAME='Sulphate highlvl',KTRAJ=2,KREQIN=IREQIN) - YSD_VF%YSO2DD => YSD_VF%YVF(YSD_VFD%IPTR) - CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YSO2DD,& - & KGRIB=NGRBAERSO2DD,CDNAME='SO2 dry dep vel.',KTRAJ=2,KREQIN=IREQIN) - - IF (LFIRE) THEN - YSD_VF%YSOGF => YSD_VF%YVF(YSD_VFD%IPTR) - CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YSOGF,& - & KGRIB=NGRBAERLS12,CDNAME='Sulphate GFED ',KTRAJ=2,KREQIN=IREQIN) - ENDIF - YSD_VF%YVOLC => YSD_VF%YVF(YSD_VFD%IPTR) - CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YVOLC,& - & KGRIB=NGRBAERLS07,CDNAME='Volcanic continu',KTRAJ=2,KREQIN=-1) - YSD_VF%YVOLE => YSD_VF%YVF(YSD_VFD%IPTR) - CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YVOLE,& - & KGRIB=NGRBAERLS08,CDNAME='Volcanic explosi',KTRAJ=2,KREQIN=-1) - YSD_VF%YSOA => YSD_VF%YVF(YSD_VFD%IPTR) - CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YSOA,& - & KGRIB=NGRBAERLS09,CDNAME='SecondOrganicMat',KTRAJ=2,KREQIN=1) - - YSD_VF%YDMSO => YSD_VF%YVF(YSD_VFD%IPTR) - CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YDMSO,& - & KGRIB=NGRBAERLS13,CDNAME='Oceanic DMS ',KTRAJ=2,KREQIN=1) - - YSD_VF%YSOACO => YSD_VF%YVF(YSD_VFD%IPTR) - CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YSOACO,& - & KGRIB=NGRBAERSOAC,CDNAME='Sec. Org. Aer from CO',KTRAJ=2,KREQIN=1) + + !TM5/M7 ancillary data + YSD_VF%YSOILTYPE => YSD_VF%YVF(YSD_VFD%IPTR) + !VH 14 Feb. 2024: for time being de-activate request for field 210055. But this has to be re-activated rather sooner than latesr, likely. + !IF (TRIM(AERO_SCHEME) == "tm5m7" .or. TRIM(AERO_SCHEME) == "hamm7" ) THEN + ! IREQIN=1 + !ELSE + IREQIN=-1 + !END IF + CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YSOILTYPE, & + & KGRIB=NGRBSOILTYPE, CDNAME='TM5M7 soil type',KTRAJ=2,KREQIN=IREQIN) - ENDIF - ENDIF - + IF (NACTAERO > 0) THEN ! ZKFIXME: revert to LAEROSFC once emission refactoring complete diff --git a/ifs-source/arpifs/setup/sugfl1.F90 b/ifs-source/arpifs/setup/sugfl1.F90 index 140fd3e6..2411242c 100644 --- a/ifs-source/arpifs/setup/sugfl1.F90 +++ b/ifs-source/arpifs/setup/sugfl1.F90 @@ -107,7 +107,7 @@ SUBROUTINE SUGFL1(YDMODEL,KGFLCONF) & LCHEM_ANAO3, LCHEM_ANACH4, LCHEM_JOUT, LCHEM_0NOX, LCHEM_HTAP, LCHEM_O3RAD, LCHEM_WDFR, & & LCHEM_WEAK_CH4_RELAXATION, & & LCHEM_CONVSCAV, LCHEM_CSHAPE, LCHEM_AEROI, LCHEM_LCOMESO, LCHEM_LCOCSTCLIM, LCHEM_LCOLIMIT, & - & LCOMPO_DCDD, LAEROSFC, & + & LCOMPO_DCDD, & & LAERNITRATE, LAEREQSAM4CLIM, LAERSOA, LAERSOA_COUPLED, LCHEM_REVCHEM, LAERRESUSPENSION, LAERNUCL, & & LCHEM_ARPCLIM @@ -216,7 +216,6 @@ SUBROUTINE SUGFL1(YDMODEL,KGFLCONF) LCHEM_DIA => YDCOMPO%LCHEM_DIA LCHEM_DDFLX => YDCOMPO%LCHEM_DDFLX LCOMPO_DDFLX_DIR => YDCOMPO%LCOMPO_DDFLX_DIR -LAEROSFC => YDCOMPO%LAEROSFC LCHEM_TROPO => YDCOMPO%LCHEM_TROPO LCOMPO_DCDD => YDCOMPO%LCOMPO_DCDD LAERNITRATE => YDCOMPO%LAERNITRATE @@ -660,7 +659,6 @@ SUBROUTINE SUGFL1(YDMODEL,KGFLCONF) LCOMPO_DDFLX_DIR=.FALSE. LCHEM_TROPO=.FALSE. LCOMPO_DCDD=.TRUE. -LAEROSFC=.FALSE. LAERNITRATE=.FALSE. LAEREQSAM4CLIM=.FALSE. LAERRESUSPENSION=.FALSE. @@ -668,8 +666,7 @@ SUBROUTINE SUGFL1(YDMODEL,KGFLCONF) LAERSOA_COUPLED=.FALSE. LAERNUCL=.TRUE. KGHG_CHEMTEND_CH4=0_JPIM -!! -!AERO_SCHEME="hamm7" +! AERO_SCHEME="aer" @@ -698,7 +695,6 @@ SUBROUTINE SUGFL1(YDMODEL,KGFLCONF) & ' LCOMPO_DDFLX_DIR=',LCOMPO_DDFLX_DIR,& & ' LCHEM_TROPO=',LCHEM_TROPO,& & ' LCOMPO_DCDD=',LCOMPO_DCDD,& - & ' LAEROSFC=',LAEROSFC,& & ' LAERNITRATE=',LAERNITRATE, & & ' LAEREQSAM4CLIM=',LAEREQSAM4CLIM, & & ' LAERRESUSPENSION=',LAERRESUSPENSION, & From f6ad0164fef70fe3a59f581c74bd08aa37e03260 Mon Sep 17 00:00:00 2001 From: Eemeli Holopainen Date: Wed, 28 Feb 2024 12:58:19 +0200 Subject: [PATCH 014/129] OIFS-505 Fixed compile issue using GNU compiler in hamm7_interface.F90 --- ifs-source/arpifs/phys_ec/hamm7_interface.F90 | 46 +++++++++---------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/ifs-source/arpifs/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/phys_ec/hamm7_interface.F90 index bca8314e..62dc9df7 100755 --- a/ifs-source/arpifs/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/phys_ec/hamm7_interface.F90 @@ -452,32 +452,32 @@ SUBROUTINE HAMM7_INTERFACE & & YDRIP=>YDMODEL%YRML_GCONF%YRRIP,YDCHEM=>YDMODEL%YRML_CHEM%YRCHEM, YRCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO, YREPHY=>YDMODEL%YRML_PHY_EC%YREPHY, & & YRECLDP=>YDMODEL%YRML_PHY_EC%YRECLDP, & & YDSPP_CONFIG=>YDMODEL%YRML_GCONF%YRSPP_CONFIG, & - & NACTAERO=>YGFL%NACTAERO, NAERO=>YGFL%NAERO, NGHG=>YGFL%NGHG, NCHEM=>YGFL%NCHEM, ZTRAC=>YGFL%NTRAC, NSO4SCHEME => YREAERSRC%NSO4SCHEME, & - & NDIM=>YGFL%NDIM, YAEROUT=>YGFL%YAEROUT, YR=>YGFL%YR, YS=>YGFL%YS, & - & LCHEM_DIA=>YRCOMPO%LCHEM_DIA, YCHEM=>YGFL%YCHEM, YAERO=>YGFL%YAERO, YGHG=>YGFL%YGHG, YTRAC=>YGFL%YTRAC, & + & NACTAERO=>YDMODEL%YRML_GCONF%YGFL%NACTAERO, NAERO=>YDMODEL%YRML_GCONF%YGFL%NAERO, NGHG=>YDMODEL%YRML_GCONF%YGFL%NGHG, NCHEM=>YDMODEL%YRML_GCONF%YGFL%NCHEM, ZTRAC=>YDMODEL%YRML_GCONF%YGFL%NTRAC, NSO4SCHEME => YDMODEL%YRML_PHY_AER%YREAERSRC%NSO4SCHEME, & + & NDIM=>YDMODEL%YRML_GCONF%YGFL%NDIM, YAEROUT=>YDMODEL%YRML_GCONF%YGFL%YAEROUT, YR=>YDMODEL%YRML_GCONF%YGFL%YR, YS=>YDMODEL%YRML_GCONF%YGFL%YS, & + & LCHEM_DIA=>YDMODEL%YRML_CHEM%YRCOMPO%LCHEM_DIA, YCHEM=>YDMODEL%YRML_GCONF%YGFL%YCHEM, YAERO=>YDMODEL%YRML_GCONF%YGFL%YAERO, YGHG=>YDMODEL%YRML_GCONF%YGFL%YGHG, YTRAC=>YDMODEL%YRML_GCONF%YGFL%YTRAC, & & YDAERM7=>YDMODEL%YRML_PHY_AER%YREAEROPT, &! use this to transfer AOD, SSA and ASY to rad scheme - & LAERDRYDP=>YREAERATM%LAERDRYDP, LAERSEDIM=>YREAERATM%LAERSEDIM, LAERSURF=>YREAERATM%LAERSURF, & !add logicals for dry dep and sedi - & YCDNC=>YGFL%YCDNC, YICNC=>YGFL%YICNC, YRE_LIQ=>YGFL%YRE_LIQ, YRE_ICE=>YGFL%YRE_ICE, & !included CDNC, ICNC, liq and ice eff rad - & LAER6SDIA=>YREAERATM%LAER6SDIA, LAERCLIMG=>YREAERATM%LAERCLIMG, & - & LAERCLIMZ=>YREAERATM%LAERCLIMZ, LAERGTOP=>YREAERATM%LAERGTOP, & - & LAERHYGRO=>YREAERATM%LAERHYGRO, LAERLISI=>YREAERATM%LAERLISI, & - & LAERNGAT=>YREAERATM%LAERNGAT, LAERSCAV=>YREAERATM%LAERSCAV, & - & LAERNITRATE => YRCOMPO%LAERNITRATE, & - & LAERSCAV_CHEM=>YREAERATM%LAERSCAV_CHEM, LAERVOL=>YREAERATM%LAERVOL, & - & LAERCHEM=>YGFL%LAERCHEM, & + & LAERDRYDP=>YDMODEL%YRML_PHY_RAD%YREAERATM%LAERDRYDP, LAERSEDIM=>YDMODEL%YRML_PHY_RAD%YREAERATM%LAERSEDIM, LAERSURF=>YDMODEL%YRML_PHY_RAD%YREAERATM%LAERSURF, & !add logicals for dry dep and sedi + & YCDNC=>YDMODEL%YRML_GCONF%YGFL%YCDNC, YICNC=>YDMODEL%YRML_GCONF%YGFL%YICNC, YRE_LIQ=>YDMODEL%YRML_GCONF%YGFL%YRE_LIQ, YRE_ICE=>YDMODEL%YRML_GCONF%YGFL%YRE_ICE, & !included CDNC, ICNC, liq and ice eff rad + & LAER6SDIA=>YDMODEL%YRML_PHY_RAD%YREAERATM%LAER6SDIA, LAERCLIMG=>YDMODEL%YRML_PHY_RAD%YREAERATM%LAERCLIMG, & + & LAERCLIMZ=>YDMODEL%YRML_PHY_RAD%YREAERATM%LAERCLIMZ, LAERGTOP=>YDMODEL%YRML_PHY_RAD%YREAERATM%LAERGTOP, & + & LAERHYGRO=>YDMODEL%YRML_PHY_RAD%YREAERATM%LAERHYGRO, LAERLISI=>YDMODEL%YRML_PHY_RAD%YREAERATM%LAERLISI, & + & LAERNGAT=>YDMODEL%YRML_PHY_RAD%YREAERATM%LAERNGAT, LAERSCAV=>YDMODEL%YRML_PHY_RAD%YREAERATM%LAERSCAV, & + & LAERNITRATE => YDMODEL%YRML_CHEM%YRCOMPO%LAERNITRATE, & + & LAERSCAV_CHEM=>YDMODEL%YRML_PHY_RAD%YREAERATM%LAERSCAV_CHEM, LAERVOL=>YDMODEL%YRML_PHY_RAD%YREAERATM%LAERVOL, & + & LAERCHEM=>YDMODEL%YRML_GCONF%YGFL%LAERCHEM, & ! & NINDSCAV=>YREAERATM%NINDSCAV, NTSCAV=>YREAERATM%NTSCAV, & - & NXT3DAER=>YREAERATM%NXT3DAER, & - & NWLID=>YREAERLID%NWLID, & + & NXT3DAER=>YDMODEL%YRML_PHY_RAD%YREAERATM%NXT3DAER, & + & NWLID=>YDMODEL%YRML_PHY_AER%YREAERLID%NWLID, & ! & NDDUST=>YREAERSRC%NDDUST, NTYPAER=>YREAERSRC%NTYPAER, & - & YSURF=>YREPHY%YSURF, & - & RRHTAB=>YREAERSNK%RRHTAB, & - & RNICE=>YRECLDP%RNICE, & !default for ICNC - & RCLDMAX=>YRECLDP%RCLDMAX, & !max cloud value - & LAERVISI=>YRERAD%LAERVISI, NTSW=>YRERAD%NTSW, RNS=>YRERAD%RNS, & - & RSIGAIR=>YRERAD%RSIGAIR,YAEROCLIM=>YGFL%YAEROCLIM, & !!! YAERCLIM is now become YAEROCLIM - & NSTART=>YDRIP%NSTART,AERO_SCHEME=>YRCOMPO%AERO_SCHEME,& !CHEM_SCHEME=>YDCHEM%CHEM_SCHEME,& - & NAERO_WVL_DIAG=>YGFL%NAERO_WVL_DIAG, & - & NRADFR=>YRERAD%NRADFR,NAEROOPT=>YRERAD%NAEROOPT) !FREQUENCY OF FULL RADIATION COMPUTATIONS + & YSURF=>YDMODEL%YRML_PHY_EC%YREPHY%YSURF, & + & RRHTAB=>YDMODEL%YRML_PHY_AER%YREAERSNK%RRHTAB, & + & RNICE=>YDMODEL%YRML_PHY_EC%YRECLDP%RNICE, & !default for ICNC + & RCLDMAX=>YDMODEL%YRML_PHY_EC%YRECLDP%RCLDMAX, & !max cloud value + & LAERVISI=>YDMODEL%YRML_PHY_RAD%YRERAD%LAERVISI, NTSW=>YDMODEL%YRML_PHY_RAD%YRERAD%NTSW, RNS=>YDMODEL%YRML_PHY_RAD%YRERAD%RNS, & + & RSIGAIR=>YDMODEL%YRML_PHY_RAD%YRERAD%RSIGAIR,YAEROCLIM=>YDMODEL%YRML_GCONF%YGFL%YAEROCLIM, & !!! YAERCLIM is now become YAEROCLIM + & NSTART=>YDMODEL%YRML_GCONF%YRRIP%NSTART,AERO_SCHEME=>YDMODEL%YRML_CHEM%YRCOMPO%AERO_SCHEME,& !CHEM_SCHEME=>YDCHEM%CHEM_SCHEME,& + & NAERO_WVL_DIAG=>YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG, & + & NRADFR=>YDMODEL%YRML_PHY_RAD%YRERAD%NRADFR,NAEROOPT=>YDMODEL%YRML_PHY_RAD%YRERAD%NAEROOPT) !FREQUENCY OF FULL RADIATION COMPUTATIONS ! ------------------------------------------------------------------ !* 0. PROGNOSTIC AEROSOLS - FINAL COMPUTATIONS From 1928bf57a56ca9e16cbb0771852291fb21810205 Mon Sep 17 00:00:00 2001 From: Ramiro Checa Garcia Date: Wed, 6 Mar 2024 09:16:15 +0000 Subject: [PATCH 015/129] Add ifs-tests for m7 - t255 m7 tests should be passed - the t21 tests will fail as the initial conditions/emissions are inconsistent. --- .../arpifs/module/surface_fields_mix.F90 | 17 + ifs-source/arpifs/setup/suctrl_gflattr.F90 | 3 + ifs-test/bin/ifs-debug | 20 +- ifs-test/tests/CMakeLists.txt | 1 + ifs-test/tests/compo_data/m7 | 1 + ifs-test/tests/t21/CMakeLists.txt | 19 +- ifs-test/tests/t21/common/CMakeLists.txt | 19 +- ifs-test/tests/t21/common/m7/m7_aero.nml | 338 ++ .../tests/t21/common/m7/m7_aerowvldiag.nml | 19 + ifs-test/tests/t21/common/m7/m7_compoemis.nml | 283 + ifs-test/tests/t21/common/m7/m7_yaerodesc.nml | 163 + .../t21/common/namelist_m7_from_openifsrun | 4775 +++++++++++++++++ ifs-test/tests/t21/common/namelist_m7_ok | 4390 +++++++++++++++ .../t21/test_compo_fc_m7_noemi/README.md | 6 + .../tests/t21/test_compo_fc_m7_noemi/params | 2 + .../t21/test_compo_fc_m7_noemi/postprocessing | 4 + .../tests/t21/test_compo_fc_m7_noemi/setup | 191 + .../t21/test_compo_fc_m7_norad/README.md | 6 + .../tests/t21/test_compo_fc_m7_norad/params | 2 + .../t21/test_compo_fc_m7_norad/postprocessing | 4 + .../tests/t21/test_compo_fc_m7_norad/setup | 191 + ifs-test/tests/t255/CMakeLists.txt | 138 + ifs-test/tests/t255/common/CMakeLists.txt | 18 + ifs-test/tests/t255/common/env_vars | 24 + ifs-test/tests/t255/common/m7/m7_aero.nml | 338 ++ .../tests/t255/common/m7/m7_aerowvldiag.nml | 19 + ifs-test/tests/t255/common/m7/m7_chem.nml | 1120 ++++ .../tests/t255/common/m7/m7_compoemis.nml | 283 + .../t255/common/namelist_m7_from_openifsrun | 4775 +++++++++++++++++ ifs-test/tests/t255/common/namelist_m7_ok | 4390 +++++++++++++++ ifs-test/tests/t255/common/namelists | 121 + ifs-test/tests/t255/ifsdata/C11CLIM | 1 + ifs-test/tests/t255/ifsdata/C12CLIM | 1 + ifs-test/tests/t255/ifsdata/C22CLIM | 1 + ifs-test/tests/t255/ifsdata/CCL4CLIM | 1 + ifs-test/tests/t255/ifsdata/CH4CLIM | 1 + ifs-test/tests/t255/ifsdata/CO2CLIM | 1 + ifs-test/tests/t255/ifsdata/ECOZC | 1 + ifs-test/tests/t255/ifsdata/GCH4CLIM | 1 + ifs-test/tests/t255/ifsdata/GCO2CLIM | 1 + ifs-test/tests/t255/ifsdata/GOZOCLIM | 1 + ifs-test/tests/t255/ifsdata/MCH4CLIM | 1 + ifs-test/tests/t255/ifsdata/MCICA | 1 + ifs-test/tests/t255/ifsdata/MCO2CLIM | 1 + ifs-test/tests/t255/ifsdata/MOZOCLIM | 1 + ifs-test/tests/t255/ifsdata/N2OCLIM | 1 + ifs-test/tests/t255/ifsdata/NO2CLIM | 1 + ifs-test/tests/t255/ifsdata/OZOCLIM | 1 + ifs-test/tests/t255/ifsdata/RADRRTM | 1 + ifs-test/tests/t255/ifsdata/RADSRTM | 1 + ifs-test/tests/t255/ifsdata/SO4_A1B2000 | 1 + ifs-test/tests/t255/ifsdata/SO4_A1B2010 | 1 + ifs-test/tests/t255/ifsdata/SO4_A1B2020 | 1 + ifs-test/tests/t255/ifsdata/SO4_A1B2030 | 1 + ifs-test/tests/t255/ifsdata/SO4_A1B2040 | 1 + ifs-test/tests/t255/ifsdata/SO4_A1B2050 | 1 + ifs-test/tests/t255/ifsdata/SO4_A1B2060 | 1 + ifs-test/tests/t255/ifsdata/SO4_A1B2070 | 1 + ifs-test/tests/t255/ifsdata/SO4_A1B2080 | 1 + ifs-test/tests/t255/ifsdata/SO4_A1B2090 | 1 + ifs-test/tests/t255/ifsdata/SO4_A1B2100 | 1 + ifs-test/tests/t255/ifsdata/SO4_OBS1920 | 1 + ifs-test/tests/t255/ifsdata/SO4_OBS1930 | 1 + ifs-test/tests/t255/ifsdata/SO4_OBS1940 | 1 + ifs-test/tests/t255/ifsdata/SO4_OBS1950 | 1 + ifs-test/tests/t255/ifsdata/SO4_OBS1960 | 1 + ifs-test/tests/t255/ifsdata/SO4_OBS1970 | 1 + ifs-test/tests/t255/ifsdata/SO4_OBS1980 | 1 + ifs-test/tests/t255/ifsdata/SO4_OBS1990 | 1 + .../ifsdata/aerosol_cams_climatology_43R3a.nc | 1 + .../t255/ifsdata/aerosol_ifs_rrtm_43R3.nc | 1 + .../t255/ifsdata/aerosol_ifs_rrtm_45R2.nc | 1 + .../t255/ifsdata/aerosol_ifs_rrtm_46R1.nc | 1 + .../aerosol_ifs_rrtm_46R1_with_NI_AM.nc | 1 + .../t255/ifsdata/aerosol_ifs_rrtm_48R1.nc | 1 + .../t255/ifsdata/aerosol_ifs_rrtm_48R1_v2.nc | 1 + .../t255/ifsdata/aerosol_ifs_rrtm_tegen.nc | 1 + .../t255/ifsdata/fu_ice_scattering_rrtm.nc | 1 + .../greenhouse_gas_climatology_46r1.nc | 1 + .../greenhouse_gas_climatology_48r1.nc | 1 + ...timeseries_CMIP6_SSP370_CFC11equiv_47r1.nc | 1 + ifs-test/tests/t255/ifsdata/mcica_gamma.nc | 1 + ifs-test/tests/t255/ifsdata/rtable_2021 | 1 + ifs-test/tests/t255/ifsdata/rtables | 1 + .../socrates_droplet_scattering_rrtm.nc | 1 + .../total_solar_irradiance_CMIP6_47r1.nc | 1 + ifs-test/tests/t255/ifsdata/vtable_L19 | 1 + ifs-test/tests/t255/inidata/ICMCLham7INIT | 1 + ifs-test/tests/t255/inidata/ICMGGham7INIT | 1 + ifs-test/tests/t255/inidata/ICMGGham7INIUA | 1 + ifs-test/tests/t255/inidata/ICMSHham7INIT | 1 + .../tests/t255/test_compo_fc_m7/README.md | 6 + ifs-test/tests/t255/test_compo_fc_m7/params | 2 + .../t255/test_compo_fc_m7/postprocessing | 4 + ifs-test/tests/t255/test_compo_fc_m7/setup | 218 + oifs-config.nld5163.sh | 97 + scripts/build_test/openifs-test.sh | 2 +- 97 files changed, 22060 insertions(+), 9 deletions(-) create mode 120000 ifs-test/tests/compo_data/m7 create mode 100644 ifs-test/tests/t21/common/m7/m7_aero.nml create mode 100644 ifs-test/tests/t21/common/m7/m7_aerowvldiag.nml create mode 100644 ifs-test/tests/t21/common/m7/m7_compoemis.nml create mode 100644 ifs-test/tests/t21/common/m7/m7_yaerodesc.nml create mode 100644 ifs-test/tests/t21/common/namelist_m7_from_openifsrun create mode 100644 ifs-test/tests/t21/common/namelist_m7_ok create mode 100644 ifs-test/tests/t21/test_compo_fc_m7_noemi/README.md create mode 100644 ifs-test/tests/t21/test_compo_fc_m7_noemi/params create mode 100644 ifs-test/tests/t21/test_compo_fc_m7_noemi/postprocessing create mode 100644 ifs-test/tests/t21/test_compo_fc_m7_noemi/setup create mode 100644 ifs-test/tests/t21/test_compo_fc_m7_norad/README.md create mode 100644 ifs-test/tests/t21/test_compo_fc_m7_norad/params create mode 100644 ifs-test/tests/t21/test_compo_fc_m7_norad/postprocessing create mode 100644 ifs-test/tests/t21/test_compo_fc_m7_norad/setup create mode 100644 ifs-test/tests/t255/CMakeLists.txt create mode 100644 ifs-test/tests/t255/common/CMakeLists.txt create mode 100644 ifs-test/tests/t255/common/env_vars create mode 100644 ifs-test/tests/t255/common/m7/m7_aero.nml create mode 100644 ifs-test/tests/t255/common/m7/m7_aerowvldiag.nml create mode 100644 ifs-test/tests/t255/common/m7/m7_chem.nml create mode 100644 ifs-test/tests/t255/common/m7/m7_compoemis.nml create mode 100644 ifs-test/tests/t255/common/namelist_m7_from_openifsrun create mode 100644 ifs-test/tests/t255/common/namelist_m7_ok create mode 100644 ifs-test/tests/t255/common/namelists create mode 120000 ifs-test/tests/t255/ifsdata/C11CLIM create mode 120000 ifs-test/tests/t255/ifsdata/C12CLIM create mode 120000 ifs-test/tests/t255/ifsdata/C22CLIM create mode 120000 ifs-test/tests/t255/ifsdata/CCL4CLIM create mode 120000 ifs-test/tests/t255/ifsdata/CH4CLIM create mode 120000 ifs-test/tests/t255/ifsdata/CO2CLIM create mode 120000 ifs-test/tests/t255/ifsdata/ECOZC create mode 120000 ifs-test/tests/t255/ifsdata/GCH4CLIM create mode 120000 ifs-test/tests/t255/ifsdata/GCO2CLIM create mode 120000 ifs-test/tests/t255/ifsdata/GOZOCLIM create mode 120000 ifs-test/tests/t255/ifsdata/MCH4CLIM create mode 120000 ifs-test/tests/t255/ifsdata/MCICA create mode 120000 ifs-test/tests/t255/ifsdata/MCO2CLIM create mode 120000 ifs-test/tests/t255/ifsdata/MOZOCLIM create mode 120000 ifs-test/tests/t255/ifsdata/N2OCLIM create mode 120000 ifs-test/tests/t255/ifsdata/NO2CLIM create mode 120000 ifs-test/tests/t255/ifsdata/OZOCLIM create mode 120000 ifs-test/tests/t255/ifsdata/RADRRTM create mode 120000 ifs-test/tests/t255/ifsdata/RADSRTM create mode 120000 ifs-test/tests/t255/ifsdata/SO4_A1B2000 create mode 120000 ifs-test/tests/t255/ifsdata/SO4_A1B2010 create mode 120000 ifs-test/tests/t255/ifsdata/SO4_A1B2020 create mode 120000 ifs-test/tests/t255/ifsdata/SO4_A1B2030 create mode 120000 ifs-test/tests/t255/ifsdata/SO4_A1B2040 create mode 120000 ifs-test/tests/t255/ifsdata/SO4_A1B2050 create mode 120000 ifs-test/tests/t255/ifsdata/SO4_A1B2060 create mode 120000 ifs-test/tests/t255/ifsdata/SO4_A1B2070 create mode 120000 ifs-test/tests/t255/ifsdata/SO4_A1B2080 create mode 120000 ifs-test/tests/t255/ifsdata/SO4_A1B2090 create mode 120000 ifs-test/tests/t255/ifsdata/SO4_A1B2100 create mode 120000 ifs-test/tests/t255/ifsdata/SO4_OBS1920 create mode 120000 ifs-test/tests/t255/ifsdata/SO4_OBS1930 create mode 120000 ifs-test/tests/t255/ifsdata/SO4_OBS1940 create mode 120000 ifs-test/tests/t255/ifsdata/SO4_OBS1950 create mode 120000 ifs-test/tests/t255/ifsdata/SO4_OBS1960 create mode 120000 ifs-test/tests/t255/ifsdata/SO4_OBS1970 create mode 120000 ifs-test/tests/t255/ifsdata/SO4_OBS1980 create mode 120000 ifs-test/tests/t255/ifsdata/SO4_OBS1990 create mode 120000 ifs-test/tests/t255/ifsdata/aerosol_cams_climatology_43R3a.nc create mode 120000 ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_43R3.nc create mode 120000 ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_45R2.nc create mode 120000 ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_46R1.nc create mode 120000 ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_46R1_with_NI_AM.nc create mode 120000 ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_48R1.nc create mode 120000 ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_48R1_v2.nc create mode 120000 ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_tegen.nc create mode 120000 ifs-test/tests/t255/ifsdata/fu_ice_scattering_rrtm.nc create mode 120000 ifs-test/tests/t255/ifsdata/greenhouse_gas_climatology_46r1.nc create mode 120000 ifs-test/tests/t255/ifsdata/greenhouse_gas_climatology_48r1.nc create mode 120000 ifs-test/tests/t255/ifsdata/greenhouse_gas_timeseries_CMIP6_SSP370_CFC11equiv_47r1.nc create mode 120000 ifs-test/tests/t255/ifsdata/mcica_gamma.nc create mode 120000 ifs-test/tests/t255/ifsdata/rtable_2021 create mode 120000 ifs-test/tests/t255/ifsdata/rtables create mode 120000 ifs-test/tests/t255/ifsdata/socrates_droplet_scattering_rrtm.nc create mode 120000 ifs-test/tests/t255/ifsdata/total_solar_irradiance_CMIP6_47r1.nc create mode 120000 ifs-test/tests/t255/ifsdata/vtable_L19 create mode 120000 ifs-test/tests/t255/inidata/ICMCLham7INIT create mode 120000 ifs-test/tests/t255/inidata/ICMGGham7INIT create mode 120000 ifs-test/tests/t255/inidata/ICMGGham7INIUA create mode 120000 ifs-test/tests/t255/inidata/ICMSHham7INIT create mode 100644 ifs-test/tests/t255/test_compo_fc_m7/README.md create mode 100644 ifs-test/tests/t255/test_compo_fc_m7/params create mode 100644 ifs-test/tests/t255/test_compo_fc_m7/postprocessing create mode 100644 ifs-test/tests/t255/test_compo_fc_m7/setup create mode 100644 oifs-config.nld5163.sh diff --git a/ifs-source/arpifs/module/surface_fields_mix.F90 b/ifs-source/arpifs/module/surface_fields_mix.F90 index 151eb9e8..fe65c0bd 100644 --- a/ifs-source/arpifs/module/surface_fields_mix.F90 +++ b/ifs-source/arpifs/module/surface_fields_mix.F90 @@ -1236,10 +1236,27 @@ SUBROUTINE SETUP_SFLP2(YDSC,YD,KGRIB,CDNAME,PDEFAULT,KTRAJ,KREQIN) INTEGER(KIND=JPIM) :: IPTR REAL(KIND=JPHOOK) :: ZHOOK_HANDLE +!INTEGER(KIND=JPIM) :: PKGRIB +!CHARACTER(LEN=16) :: PCDNAME !------------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('SURFACE_FIELDS_MIX:SETUP_SFLP2',0,ZHOOK_HANDLE) +!if (present(KGRIB)) THEN +! PKGRIB=KGRIB +! else +! PKGRIB=-1234 +! endif + +! if (present(CDNAME)) THEN +! PCDNAME=CDNAME +! else +! PCDNAME='no-cdname' +!endif + +!WRITE(NULOUT,*) '[SETUP_SFLP2 SUBROUTINE]',PKGRIB, PCDNAME + + IPTR = YDSC%IPTR IF(IPTR > JPMAXSFLDS-1) THEN ! We are about to set the last element which is generally used as a diff --git a/ifs-source/arpifs/setup/suctrl_gflattr.F90 b/ifs-source/arpifs/setup/suctrl_gflattr.F90 index d7dbc2d9..f982064f 100644 --- a/ifs-source/arpifs/setup/suctrl_gflattr.F90 +++ b/ifs-source/arpifs/setup/suctrl_gflattr.F90 @@ -1186,6 +1186,9 @@ SUBROUTINE SUCTRL_GFLATTR(YDEPHY,YDML_GCONF,YDARPHY,YDPHY,YDSIMPHL,YDDYNA) IF (LLCOMAD_GFL .NEQV. LCOMAD_GFL) THEN + + WRITE(NULOUT,*) ' INCONSISTENCY BETWEEN LCOMAD_GFL AND GFL ATTRIBUTE LCOMAD.' + WRITE(NULOUT,*) LLCOMAD_GFL, LCOMAD_GFL WRITE(NULERR,*) ' INCONSISTENCY BETWEEN LCOMAD_GFL AND GFL ATTRIBUTE LCOMAD.' CALL ABOR1(' SUCTRL_GFLATTR: 1.6a') ENDIF diff --git a/ifs-test/bin/ifs-debug b/ifs-test/bin/ifs-debug index 07fc1c6b..97ddd7b0 100755 --- a/ifs-test/bin/ifs-debug +++ b/ifs-test/bin/ifs-debug @@ -3,8 +3,20 @@ set -x module load forge -if [[ ${ECPLATFORM:-unset} == "hpc2020" ]]; then - ./ifs-run --launcher='ddt srun --qos=np ' +if [[ $1 == "gdb" ]]; then + + if [[ ${ECPLATFORM:-unset} == "hpc2020" ]]; then + ./ifs-run --launcher='gdb' + else + ./ifs-run --launcher=gdb + fi + else - ./ifs-run --launcher=ddt -fi + + if [[ ${ECPLATFORM:-unset} == "hpc2020" ]]; then + ./ifs-run --launcher='ddt srun --qos=np ' + else + ./ifs-run --launcher=ddt + fi + +fi diff --git a/ifs-test/tests/CMakeLists.txt b/ifs-test/tests/CMakeLists.txt index 72d82a3d..e99777dc 100644 --- a/ifs-test/tests/CMakeLists.txt +++ b/ifs-test/tests/CMakeLists.txt @@ -13,6 +13,7 @@ set (COMPO_DATA_PATH "${DATA_CACHE_DIR}/compo_data") add_subdirectory(t21) add_subdirectory(t42) +add_subdirectory(t255) if( ENABLE_SCMEC ) add_subdirectory(scm) endif() diff --git a/ifs-test/tests/compo_data/m7 b/ifs-test/tests/compo_data/m7 new file mode 120000 index 00000000..da2a9f6f --- /dev/null +++ b/ifs-test/tests/compo_data/m7 @@ -0,0 +1 @@ +/ec/res4/hpcperm/nld5163/openifs/oifs_data/48r1/ifsdata_m7 \ No newline at end of file diff --git a/ifs-test/tests/t21/CMakeLists.txt b/ifs-test/tests/t21/CMakeLists.txt index 45d3b967..7d207961 100644 --- a/ifs-test/tests/t21/CMakeLists.txt +++ b/ifs-test/tests/t21/CMakeLists.txt @@ -22,6 +22,7 @@ add_subdirectory( common ) # Helper function function( add_ifs_test TARGET ) + ### (1) COMMON for all tests execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/${TARGET} ) execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink @@ -42,7 +43,7 @@ function( add_ifs_test TARGET ) execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink ${PROJECT_SOURCE_DIR}/bin/ifs-grep-norms.pl ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/ifs-grep-norms.pl ) - execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink ${PROJECT_SOURCE_DIR}/bin/set_launcher.bash ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/set_launcher.bash ) execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink @@ -179,6 +180,16 @@ function( add_ifs_test TARGET ) ${INIDATA_PATH}/ICMGGhmecINIT ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/ICMGGhmecIMIN ) endif() endif() + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${COMPO_DATA_PATH}/m7/lookup_table.nc ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/lookup_table.nc) + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${COMPO_DATA_PATH}/m7/refractive_indices_hdfstyle.nc ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/refractive_indices_hdfstyle.nc) + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${COMPO_DATA_PATH}/m7/parnuc.15H2SO4.nc ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/parnuc.15H2SO4.nc) + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${COMPO_DATA_PATH}/m7/lut_kappa.nc ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/lut_kappa.nc) + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${COMPO_DATA_PATH}/m7/namelist.echam ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/namelist.echam) execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink ${COMPO_DATA_PATH}/OMI.data.extraterrest ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/OMI.data.extraterrest ) execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink @@ -312,7 +323,8 @@ add_ifs_test( test_compo_cb05bascoe_fc ) add_ifs_test( test_compo_chemonly_RnPb_fc ) add_ifs_test( test_compo_chemonly_nwpo3_fc ) add_ifs_test( test_compo_updclie ) - +add_ifs_test( test_compo_fc_m7_noemi ) +add_ifs_test( test_compo_fc_m7_norad ) # Tests which will not succeed in OpenIFS-only builds. if( NOT ifs_HAVE_OPENIFS_ONLY ) @@ -375,6 +387,9 @@ if( ENABLE_TESTS ) set_property(TEST ifs_t21_test_compo_chemonly_nwpo3_fc APPEND PROPERTY LABELS forecast mpi threading composition nwpo3) set_property(TEST ifs_t21_test_compo_updclie APPEND PROPERTY LABELS forecast mpi threading composition climate mcc_compo) + set_property(TEST ifs_t21_test_compo_fc_m7_noemi APPEND PROPERTY LABELS forecast mpi threading composition m7) + set_property(TEST ifs_t21_test_compo_fc_m7_norad APPEND PROPERTY LABELS forecast mpi threading composition m7) + # Tests to include if this is not an OpenIFS-only build: if( NOT ifs_HAVE_OPENIFS_ONLY ) set_property(TEST ifs_t21_test_fc_nh APPEND PROPERTY LABELS forecast serial) diff --git a/ifs-test/tests/t21/common/CMakeLists.txt b/ifs-test/tests/t21/common/CMakeLists.txt index e41637d1..5ce8968d 100644 --- a/ifs-test/tests/t21/common/CMakeLists.txt +++ b/ifs-test/tests/t21/common/CMakeLists.txt @@ -1,4 +1,19 @@ # (C) Copyright 1996-2019 ECMWF. +# (C) Copyright 2024 KNMI. + +configure_file(env_vars env_vars COPYONLY) +configure_file(namelists namelists COPYONLY) + +# === Specific for m7 tests ==================================================== + +configure_file(m7/m7_aero.nml namelist_m7_aero COPYONLY) +configure_file(m7/m7_aerowvldiag.nml namelist_m7_aerowvldiag COPYONLY) +configure_file(m7/m7_yaerodesc.nml namelist_m7_yaerodesc COPYONLY) +configure_file(m7/m7_compoemis.nml namelist_m7_compoemis COPYONLY) + +# === Components copied from test_compo_fc ===================================== + +configure_file(aer/aer_compoemis.nml namelist_aer_compoemis COPYONLY) +configure_file(aer/aer_chem.nml namelist_aer_chem COPYONLY) + -configure_file(env_vars env_vars COPYONLY) -configure_file(namelists namelists COPYONLY) diff --git a/ifs-test/tests/t21/common/m7/m7_aero.nml b/ifs-test/tests/t21/common/m7/m7_aero.nml new file mode 100644 index 00000000..d5afe234 --- /dev/null +++ b/ifs-test/tests/t21/common/m7/m7_aero.nml @@ -0,0 +1,338 @@ +cat >> fort.4 << EOF +NAERO=37, +NACTAERO=37, +YAERO_NL(1)%CNAME='SO4', +YAERO_NL(1)%IGRBCODE=210011, +YAERO_NL(1)%LMASSFIX=.true., +!YAERO_NL(1)%LCOMAD=.true., +YAERO_NL(1)%LQM=.false., +YAERO_NL(1)%LQM3D=.true., +YAERO_NL(1)%BETAMFBC=-999, +YAERO_NL(1)%LADV=.true., +YAERO_NL(1)%NREQIN=0, +YAERO_NL(2)%CNAME='NH4', +YAERO_NL(2)%IGRBCODE=212035, +YAERO_NL(2)%LMASSFIX=.true., +!YAERO_NL(2)%LCOMAD=.true., +YAERO_NL(2)%LQM=.false., +YAERO_NL(2)%LQM3D=.true., +YAERO_NL(2)%BETAMFBC=-999, +YAERO_NL(2)%LADV=.true., +YAERO_NL(2)%NREQIN=0, +YAERO_NL(3)%CNAME='NO3_A', +YAERO_NL(3)%IGRBCODE=212036, +YAERO_NL(3)%LMASSFIX=.true., +!YAERO_NL(3)%LCOMAD=.true., +YAERO_NL(3)%LQM=.false., +YAERO_NL(3)%LQM3D=.true., +YAERO_NL(3)%BETAMFBC=-999, +YAERO_NL(3)%LADV=.true., +YAERO_NL(3)%NREQIN=0, +YAERO_NL(4)%CNAME='ACS_N', +YAERO_NL(4)%IGRBCODE=212001, +YAERO_NL(4)%LMASSFIX=.true., +!YAERO_NL(4)%LCOMAD=.true., +YAERO_NL(4)%LQM=.false., +YAERO_NL(4)%LQM3D=.true., +YAERO_NL(4)%BETAMFBC=-999, +YAERO_NL(4)%LADV=.true., +YAERO_NL(4)%NREQIN=0, +YAERO_NL(5)%CNAME='SO4ACS', +YAERO_NL(5)%IGRBCODE=212002, +YAERO_NL(5)%LMASSFIX=.true., +!YAERO_NL(5)%LCOMAD=.true., +YAERO_NL(5)%LQM=.false., +YAERO_NL(5)%LQM3D=.true., +YAERO_NL(5)%BETAMFBC=-999, +YAERO_NL(5)%LADV=.true., +YAERO_NL(5)%NREQIN=0, +YAERO_NL(6)%CNAME='BCACS', +YAERO_NL(6)%IGRBCODE=212003, +YAERO_NL(6)%LMASSFIX=.true., +!YAERO_NL(6)%LCOMAD=.true., +YAERO_NL(6)%LQM=.false., +YAERO_NL(6)%LQM3D=.true., +YAERO_NL(6)%BETAMFBC=-999, +YAERO_NL(6)%LADV=.true., +YAERO_NL(6)%NREQIN=0, +YAERO_NL(7)%CNAME='POMACS', +YAERO_NL(7)%IGRBCODE=212004, +YAERO_NL(7)%LMASSFIX=.true., +!YAERO_NL(7)%LCOMAD=.true., +YAERO_NL(7)%LQM=.false., +YAERO_NL(7)%LQM3D=.true., +YAERO_NL(7)%BETAMFBC=-999, +YAERO_NL(7)%LADV=.true., +YAERO_NL(7)%NREQIN=0, +YAERO_NL(8)%CNAME='SSACS', +YAERO_NL(8)%IGRBCODE=212005, +YAERO_NL(8)%LMASSFIX=.true., +!YAERO_NL(8)%LCOMAD=.true., +YAERO_NL(8)%LQM=.false., +YAERO_NL(8)%LQM3D=.true., +YAERO_NL(8)%BETAMFBC=-999, +YAERO_NL(8)%LADV=.true., +YAERO_NL(8)%NREQIN=0, +YAERO_NL(9)%CNAME='DUACS', +YAERO_NL(9)%IGRBCODE=212006, +YAERO_NL(9)%LMASSFIX=.true., +!YAERO_NL(9)%LCOMAD=.true., +YAERO_NL(9)%LQM=.false., +YAERO_NL(9)%LQM3D=.true., +YAERO_NL(9)%BETAMFBC=-999, +YAERO_NL(9)%LADV=.true., +YAERO_NL(9)%NREQIN=0, +YAERO_NL(10)%CNAME='SOANUS', +YAERO_NL(10)%IGRBCODE=212007, +YAERO_NL(10)%LMASSFIX=.true., +!YAERO_NL(10)%LCOMAD=.true., +YAERO_NL(10)%LQM=.false., +YAERO_NL(10)%LQM3D=.true., +YAERO_NL(10)%BETAMFBC=-999, +YAERO_NL(10)%LADV=.true., +YAERO_NL(10)%NREQIN=0, +YAERO_NL(11)%CNAME='SOAAIS', +YAERO_NL(11)%IGRBCODE=212008, +YAERO_NL(11)%LMASSFIX=.true., +!YAERO_NL(11)%LCOMAD=.true., +YAERO_NL(11)%LQM=.false., +YAERO_NL(11)%LQM3D=.true., +YAERO_NL(11)%BETAMFBC=-999, +YAERO_NL(11)%LADV=.true., +YAERO_NL(11)%NREQIN=0, +YAERO_NL(12)%CNAME='SOAACS', +YAERO_NL(12)%IGRBCODE=212009, +YAERO_NL(12)%LMASSFIX=.true., +!YAERO_NL(12)%LCOMAD=.true., +YAERO_NL(12)%LQM=.false., +YAERO_NL(12)%LQM3D=.true., +YAERO_NL(12)%BETAMFBC=-999, +YAERO_NL(12)%LADV=.true., +YAERO_NL(12)%NREQIN=0, +YAERO_NL(13)%CNAME='SOACOS', +YAERO_NL(13)%IGRBCODE=212010, +YAERO_NL(13)%LMASSFIX=.true., +!YAERO_NL(13)%LCOMAD=.true., +YAERO_NL(13)%LQM=.false., +YAERO_NL(13)%LQM3D=.true., +YAERO_NL(13)%BETAMFBC=-999, +YAERO_NL(13)%LADV=.true., +YAERO_NL(13)%NREQIN=0, +YAERO_NL(14)%CNAME='SOAAII', +YAERO_NL(14)%IGRBCODE=212011, +YAERO_NL(14)%LMASSFIX=.true., +!YAERO_NL(14)%LCOMAD=.true., +YAERO_NL(14)%LQM=.false., +YAERO_NL(14)%LQM3D=.true., +YAERO_NL(14)%BETAMFBC=-999, +YAERO_NL(14)%LADV=.true., +YAERO_NL(14)%NREQIN=0, +YAERO_NL(15)%CNAME='H2OPART', +YAERO_NL(15)%IGRBCODE=212012, +YAERO_NL(15)%LMASSFIX=.true., +!YAERO_NL(15)%LCOMAD=.true., +YAERO_NL(15)%LQM=.false., +YAERO_NL(15)%LQM3D=.true., +YAERO_NL(15)%BETAMFBC=-999, +YAERO_NL(15)%LADV=.true., +YAERO_NL(15)%NREQIN=0, +YAERO_NL(16)%CNAME='AII_N', +YAERO_NL(16)%IGRBCODE=212013, +YAERO_NL(16)%LMASSFIX=.true., +!YAERO_NL(16)%LCOMAD=.true., +YAERO_NL(16)%LQM=.false., +YAERO_NL(16)%LQM3D=.true., +YAERO_NL(16)%BETAMFBC=-999, +YAERO_NL(16)%LADV=.true., +YAERO_NL(16)%NREQIN=0, +YAERO_NL(17)%CNAME='BCAII', +YAERO_NL(17)%IGRBCODE=212014, +YAERO_NL(17)%LMASSFIX=.true., +!YAERO_NL(17)%LCOMAD=.true., +YAERO_NL(17)%LQM=.false., +YAERO_NL(17)%LQM3D=.true., +YAERO_NL(17)%BETAMFBC=-999, +YAERO_NL(17)%LADV=.true., +YAERO_NL(17)%NREQIN=0, +YAERO_NL(18)%CNAME='POMAII', +YAERO_NL(18)%IGRBCODE=212015, +YAERO_NL(18)%LMASSFIX=.true., +!YAERO_NL(18)%LCOMAD=.true., +YAERO_NL(18)%LQM=.false., +YAERO_NL(18)%LQM3D=.true., +YAERO_NL(18)%BETAMFBC=-999, +YAERO_NL(18)%LADV=.true., +YAERO_NL(18)%NREQIN=0, +YAERO_NL(19)%CNAME='ACI_N', +YAERO_NL(19)%IGRBCODE=212016, +YAERO_NL(19)%LMASSFIX=.true., +!YAERO_NL(19)%LCOMAD=.true., +YAERO_NL(19)%LQM=.false., +YAERO_NL(19)%LQM3D=.true., +YAERO_NL(19)%BETAMFBC=-999, +YAERO_NL(19)%LADV=.true., +YAERO_NL(19)%NREQIN=0, +YAERO_NL(20)%CNAME='DUACI', +YAERO_NL(20)%IGRBCODE=212017, +YAERO_NL(20)%LMASSFIX=.true., +!YAERO_NL(20)%LCOMAD=.true., +YAERO_NL(20)%LQM=.false., +YAERO_NL(20)%LQM3D=.true., +YAERO_NL(20)%BETAMFBC=-999, +YAERO_NL(20)%LADV=.true., +YAERO_NL(20)%NREQIN=0, +YAERO_NL(21)%CNAME='AIS_N', +YAERO_NL(21)%IGRBCODE=212018, +YAERO_NL(21)%LMASSFIX=.true., +!YAERO_NL(21)%LCOMAD=.true., +YAERO_NL(21)%LQM=.false., +YAERO_NL(21)%LQM3D=.true., +YAERO_NL(21)%BETAMFBC=-999, +YAERO_NL(21)%LADV=.true., +YAERO_NL(21)%NREQIN=0, +YAERO_NL(22)%CNAME='SO4AIS', +YAERO_NL(22)%IGRBCODE=212019, +YAERO_NL(22)%LMASSFIX=.true., +!YAERO_NL(22)%LCOMAD=.true., +YAERO_NL(22)%LQM=.false., +YAERO_NL(22)%LQM3D=.true., +YAERO_NL(22)%BETAMFBC=-999, +YAERO_NL(22)%LADV=.true., +YAERO_NL(22)%NREQIN=0, +YAERO_NL(23)%CNAME='BCAIS', +YAERO_NL(23)%IGRBCODE=212020, +YAERO_NL(23)%LMASSFIX=.true., +!YAERO_NL(23)%LCOMAD=.true., +YAERO_NL(23)%LQM=.false., +YAERO_NL(23)%LQM3D=.true., +YAERO_NL(23)%BETAMFBC=-999, +YAERO_NL(23)%LADV=.true., +YAERO_NL(23)%NREQIN=0, +YAERO_NL(24)%CNAME='POMAIS', +YAERO_NL(24)%IGRBCODE=212021, +YAERO_NL(24)%LMASSFIX=.true., +!YAERO_NL(24)%LCOMAD=.true., +YAERO_NL(24)%LQM=.false., +YAERO_NL(24)%LQM3D=.true., +YAERO_NL(24)%BETAMFBC=-999, +YAERO_NL(24)%LADV=.true., +YAERO_NL(24)%NREQIN=0, +YAERO_NL(25)%CNAME='COI_N', +YAERO_NL(25)%IGRBCODE=212022, +YAERO_NL(25)%LMASSFIX=.true., +!YAERO_NL(25)%LCOMAD=.true., +YAERO_NL(25)%LQM=.false., +YAERO_NL(25)%LQM3D=.true., +YAERO_NL(25)%BETAMFBC=-999, +YAERO_NL(25)%LADV=.true., +YAERO_NL(25)%NREQIN=0, +YAERO_NL(26)%CNAME='DUCOI', +YAERO_NL(26)%IGRBCODE=212023, +YAERO_NL(26)%LMASSFIX=.true., +!YAERO_NL(26)%LCOMAD=.true., +YAERO_NL(26)%LQM=.false., +YAERO_NL(26)%LQM3D=.true., +YAERO_NL(26)%BETAMFBC=-999, +YAERO_NL(26)%LADV=.true., +YAERO_NL(26)%NREQIN=0, +YAERO_NL(27)%CNAME='COS_N', +YAERO_NL(27)%IGRBCODE=212024, +YAERO_NL(27)%LMASSFIX=.true., +!YAERO_NL(27)%LCOMAD=.true., +YAERO_NL(27)%LQM=.false., +YAERO_NL(27)%LQM3D=.true., +YAERO_NL(27)%BETAMFBC=-999, +YAERO_NL(27)%LADV=.true., +YAERO_NL(27)%NREQIN=0, +YAERO_NL(28)%CNAME='SO4COS', +YAERO_NL(28)%IGRBCODE=212025, +YAERO_NL(28)%LMASSFIX=.true., +!YAERO_NL(28)%LCOMAD=.true., +YAERO_NL(28)%LQM=.false., +YAERO_NL(28)%LQM3D=.true., +YAERO_NL(28)%BETAMFBC=-999, +YAERO_NL(28)%LADV=.true., +YAERO_NL(28)%NREQIN=0, +YAERO_NL(29)%CNAME='BCCOS', +YAERO_NL(29)%IGRBCODE=212026, +YAERO_NL(29)%LMASSFIX=.true., +!YAERO_NL(29)%LCOMAD=.true., +YAERO_NL(29)%LQM=.false., +YAERO_NL(29)%LQM3D=.true., +YAERO_NL(29)%BETAMFBC=-999, +YAERO_NL(29)%LADV=.true., +YAERO_NL(29)%NREQIN=0, +YAERO_NL(30)%CNAME='POMCOS', +YAERO_NL(30)%IGRBCODE=212027, +YAERO_NL(30)%LMASSFIX=.true., +!YAERO_NL(30)%LCOMAD=.true., +YAERO_NL(30)%LQM=.false., +YAERO_NL(30)%LQM3D=.true., +YAERO_NL(30)%BETAMFBC=-999, +YAERO_NL(30)%LADV=.true., +YAERO_NL(30)%NREQIN=0, +YAERO_NL(31)%CNAME='SSCOS', +YAERO_NL(31)%IGRBCODE=212028, +YAERO_NL(31)%LMASSFIX=.true., +!YAERO_NL(31)%LCOMAD=.true., +YAERO_NL(31)%LQM=.false., +YAERO_NL(31)%LQM3D=.true., +YAERO_NL(31)%BETAMFBC=-999, +YAERO_NL(31)%LADV=.true., +YAERO_NL(31)%NREQIN=0, +YAERO_NL(32)%CNAME='DUCOS', +YAERO_NL(32)%IGRBCODE=212029, +YAERO_NL(32)%LMASSFIX=.true., +!YAERO_NL(32)%LCOMAD=.true., +YAERO_NL(32)%LQM=.false., +YAERO_NL(32)%LQM3D=.true., +YAERO_NL(32)%BETAMFBC=-999, +YAERO_NL(32)%LADV=.true., +YAERO_NL(32)%NREQIN=0, +YAERO_NL(33)%CNAME='NUS_N', +YAERO_NL(33)%IGRBCODE=212030, +YAERO_NL(33)%LMASSFIX=.true., +!YAERO_NL(33)%LCOMAD=.true., +YAERO_NL(33)%LQM=.false., +YAERO_NL(33)%LQM3D=.true., +YAERO_NL(33)%BETAMFBC=-999, +YAERO_NL(33)%LADV=.true., +YAERO_NL(33)%NREQIN=0, +YAERO_NL(34)%CNAME='SO4NUS', +YAERO_NL(34)%IGRBCODE=212031, +YAERO_NL(34)%LMASSFIX=.true., +!YAERO_NL(34)%LCOMAD=.true., +YAERO_NL(34)%LQM=.false., +YAERO_NL(34)%LQM3D=.true., +YAERO_NL(34)%BETAMFBC=-999, +YAERO_NL(34)%LADV=.true., +YAERO_NL(34)%NREQIN=0, +YAERO_NL(35)%CNAME='ELVOC', +YAERO_NL(35)%IGRBCODE=212032, +YAERO_NL(35)%LMASSFIX=.true., +!YAERO_NL(35)%LCOMAD=.true., +YAERO_NL(35)%LQM=.false., +YAERO_NL(35)%LQM3D=.true., +YAERO_NL(35)%BETAMFBC=-999, +YAERO_NL(35)%LADV=.true., +YAERO_NL(35)%NREQIN=0, +YAERO_NL(36)%CNAME='ISVOC', +YAERO_NL(36)%IGRBCODE=212033, +YAERO_NL(36)%LMASSFIX=.true., +!YAERO_NL(36)%LCOMAD=.true., +YAERO_NL(36)%LQM=.false., +YAERO_NL(36)%LQM3D=.true., +YAERO_NL(36)%BETAMFBC=-999, +YAERO_NL(36)%LADV=.true., +YAERO_NL(36)%NREQIN=0, +YAERO_NL(37)%CNAME='MSA', +YAERO_NL(37)%IGRBCODE=212034, +YAERO_NL(37)%LMASSFIX=.true., +!YAERO_NL(37)%LCOMAD=.true., +YAERO_NL(37)%LQM=.false., +YAERO_NL(37)%LQM3D=.true., +YAERO_NL(37)%BETAMFBC=-999, +YAERO_NL(37)%LADV=.true., +YAERO_NL(37)%NREQIN=0, +EOF + diff --git a/ifs-test/tests/t21/common/m7/m7_aerowvldiag.nml b/ifs-test/tests/t21/common/m7/m7_aerowvldiag.nml new file mode 100644 index 00000000..86a28150 --- /dev/null +++ b/ifs-test/tests/t21/common/m7/m7_aerowvldiag.nml @@ -0,0 +1,19 @@ +cat >> fort.4 << EOF +NAEROUT=0, +NAERO_WVL_DIAG=6, +NAERO_WVL_DIAG_TYPES=5, +YAERO_WVL_DIAG_NL(1)%IWVL=550, +YAERO_WVL_DIAG_NL(1)%IGRIBDIAG=210207,215104,215122,215140,215158, +YAERO_WVL_DIAG_NL(2)%IWVL=380, +YAERO_WVL_DIAG_NL(2)%IGRIBDIAG=210219,215098,215116,215134,215152, +YAERO_WVL_DIAG_NL(3)%IWVL=440, +YAERO_WVL_DIAG_NL(3)%IGRIBDIAG=210221,215100,215118,215136,215154, +YAERO_WVL_DIAG_NL(4)%IWVL=670, +YAERO_WVL_DIAG_NL(4)%IGRIBDIAG=210214,215106,215124,215142,215160, +YAERO_WVL_DIAG_NL(5)%IWVL=870, +YAERO_WVL_DIAG_NL(5)%IGRIBDIAG=210215,215109,215127,215145,215163, +YAERO_WVL_DIAG_NL(6)%IWVL=1020, +YAERO_WVL_DIAG_NL(6)%IGRIBDIAG=210227,215110,215128,215146,215164, +EOF + + diff --git a/ifs-test/tests/t21/common/m7/m7_compoemis.nml b/ifs-test/tests/t21/common/m7/m7_compoemis.nml new file mode 100644 index 00000000..e904f9d2 --- /dev/null +++ b/ifs-test/tests/t21/common/m7/m7_compoemis.nml @@ -0,0 +1,283 @@ +cat >> fort.4 << EOF + +&NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=219209 / +&NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="emiss_bio" THIS%PARAMID=212001 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.25 / +&NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="ene" THIS%PARAMID=212002 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="fef" THIS%PARAMID=212003 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="ind" THIS%PARAMID=212004 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="res" THIS%PARAMID=212006 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="shp" THIS%PARAMID=212007 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="slv" THIS%PARAMID=212189 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="swd" THIS%PARAMID=212008 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="tnr" THIS%PARAMID=212009 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="tro" THIS%PARAMID=212010 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="C10H16" THIS%SECTOR="emiss_bio" THIS%PARAMID=212011 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.65 / +&NAMCOMPO_EMIS THIS%SPECIES="C10H16" THIS%SECTOR="ene" THIS%PARAMID=212012 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="C10H16" THIS%SECTOR="fef" THIS%PARAMID=212013 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="C10H16" THIS%SECTOR="ind" THIS%PARAMID=212014 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="C10H16" THIS%SECTOR="res" THIS%PARAMID=212015 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="C10H16" THIS%SECTOR="shp" THIS%PARAMID=212016 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="C10H16" THIS%SECTOR="slv" THIS%PARAMID=212019 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="C10H16" THIS%SECTOR="swd" THIS%PARAMID=212017 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="C10H16" THIS%SECTOR="tnr" THIS%PARAMID=212018 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210106 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="emiss_bio" THIS%PARAMID=212021 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.25 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="emiss_nat" THIS%PARAMID=212022 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="ene" THIS%PARAMID=212023 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="fef" THIS%PARAMID=212024 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="ind" THIS%PARAMID=212025 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="ref" THIS%PARAMID=212020 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="res" THIS%PARAMID=212026 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="shp" THIS%PARAMID=212027 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="slv" THIS%PARAMID=212133 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="swd" THIS%PARAMID=212028 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="tnr" THIS%PARAMID=212029 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="tro" THIS%PARAMID=212030 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210104 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="emiss_bio" THIS%PARAMID=212031 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.25 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="ene" THIS%PARAMID=212032 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="fef" THIS%PARAMID=212033 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="ind" THIS%PARAMID=212034 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="ref" THIS%PARAMID=212040 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="res" THIS%PARAMID=212035 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="shp" THIS%PARAMID=212036 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="slv" THIS%PARAMID=212137 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="swd" THIS%PARAMID=212037 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="tnr" THIS%PARAMID=212038 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="tro" THIS%PARAMID=212039 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210118 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="emiss_bio" THIS%PARAMID=212041 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.65 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="emiss_nat" THIS%PARAMID=212042 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="ene" THIS%PARAMID=212043 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="fef" THIS%PARAMID=212044 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="ind" THIS%PARAMID=212045 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="ref" THIS%PARAMID=212134 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="res" THIS%PARAMID=212046 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="shp" THIS%PARAMID=212047 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="slv" THIS%PARAMID=212185 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="swd" THIS%PARAMID=212048 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="tnr" THIS%PARAMID=212049 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="tro" THIS%PARAMID=212050 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210107 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="emiss_bio" THIS%PARAMID=212051 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.65 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="emiss_nat" THIS%PARAMID=212052 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="ene" THIS%PARAMID=212053 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="fef" THIS%PARAMID=212054 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="ind" THIS%PARAMID=212055 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="ref" THIS%PARAMID=212135 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="res" THIS%PARAMID=212056 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="shp" THIS%PARAMID=212057 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="slv" THIS%PARAMID=212186 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="swd" THIS%PARAMID=212058 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="tnr" THIS%PARAMID=212059 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="tro" THIS%PARAMID=212060 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210105 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="emiss_bio" THIS%PARAMID=212061 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.65 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="emiss_nat" THIS%PARAMID=212062 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="ene" THIS%PARAMID=212063 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="fef" THIS%PARAMID=212064 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="ind" THIS%PARAMID=212065 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="ref" THIS%PARAMID=212136 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="res" THIS%PARAMID=212066 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="shp" THIS%PARAMID=212067 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="slv" THIS%PARAMID=212187 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="swd" THIS%PARAMID=212068 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="tnr" THIS%PARAMID=212069 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="tro" THIS%PARAMID=212070 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210108 / +&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="emiss_bio" THIS%PARAMID=212071 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.00 / +&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="ene" THIS%PARAMID=212072 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="fef" THIS%PARAMID=212073 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="ind" THIS%PARAMID=212074 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="ref" THIS%PARAMID=212080 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="res" THIS%PARAMID=212075 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="shp" THIS%PARAMID=212076 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="slv" THIS%PARAMID=212198 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="swd" THIS%PARAMID=212077 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="tnr" THIS%PARAMID=212078 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="tro" THIS%PARAMID=212079 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="CH2O" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210113 / +&NAMCOMPO_EMIS THIS%SPECIES="CH2O" THIS%SECTOR="emiss_bio" THIS%PARAMID=212081 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.25 / +&NAMCOMPO_EMIS THIS%SPECIES="CH2O" THIS%SECTOR="ene" THIS%PARAMID=212082 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="CH2O" THIS%SECTOR="fef" THIS%PARAMID=212083 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="CH2O" THIS%SECTOR="ind" THIS%PARAMID=212084 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="CH2O" THIS%SECTOR="res" THIS%PARAMID=212085 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="CH2O" THIS%SECTOR="shp" THIS%PARAMID=212086 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="CH2O" THIS%SECTOR="slv" THIS%PARAMID=212090 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="CH2O" THIS%SECTOR="swd" THIS%PARAMID=212087 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="CH2O" THIS%SECTOR="tnr" THIS%PARAMID=212088 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="CH2O" THIS%SECTOR="tro" THIS%PARAMID=212089 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="CH3CN" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=219220 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3CN" THIS%SECTOR="ene" THIS%SCALING=0.0015 THIS%PARAMID=212123 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3CN" THIS%SECTOR="ind" THIS%SCALING=0.0015 THIS%PARAMID=212125 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3CN" THIS%SECTOR="ref" THIS%SCALING=0.0015 THIS%PARAMID=212120 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3CN" THIS%SECTOR="res" THIS%SCALING=0.0015 THIS%PARAMID=212126 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210115 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="emiss_bio" THIS%PARAMID=212091 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.65 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="emiss_nat" THIS%SCALING=1.4 THIS%PARAMID=212122 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="ene" THIS%PARAMID=212092 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="fef" THIS%PARAMID=212093 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="ind" THIS%PARAMID=212094 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="ref" THIS%PARAMID=212100 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="res" THIS%PARAMID=212095 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="shp" THIS%PARAMID=212096 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="slv" THIS%PARAMID=212190 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="swd" THIS%PARAMID=212097 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="tnr" THIS%PARAMID=212098 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="tro" THIS%PARAMID=212099 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210103 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="emiss_bio" THIS%PARAMID=212111 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.25 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="ene" THIS%PARAMID=212112 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="fef" THIS%PARAMID=212113 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="ind" THIS%PARAMID=212114 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="ref" THIS%PARAMID=212110 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="res" THIS%PARAMID=212115 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="shp" THIS%PARAMID=212116 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="slv" THIS%PARAMID=212140 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="swd" THIS%PARAMID=212117 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="tnr" THIS%PARAMID=212118 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="tro" THIS%PARAMID=212119 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210081 / +&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="emiss_bio" THIS%PARAMID=212121 / +&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="emiss_nat" THIS%PARAMID=212122 / +&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="ene" THIS%PARAMID=212123 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="fef" THIS%PARAMID=212124 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="ind" THIS%PARAMID=212125 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="ref" THIS%PARAMID=212120 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="res" THIS%PARAMID=212126 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="shp" THIS%PARAMID=212127 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="swd" THIS%PARAMID=212128 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="tnr" THIS%PARAMID=212129 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="tro" THIS%PARAMID=212130 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="DMS" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210117 / +&NAMCOMPO_EMIS THIS%SPECIES="DMS" THIS%SECTOR="emiss_bio" THIS%PARAMID=212132 / +&NAMCOMPO_EMIS THIS%SPECIES="DMS" THIS%SECTOR="emiss_nat" THIS%PARAMID=212131 / +&NAMCOMPO_EMIS THIS%SPECIES="GLY" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=212244 / +&NAMCOMPO_EMIS THIS%SPECIES="HCN" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=219219 / +&NAMCOMPO_EMIS THIS%SPECIES="HCN" THIS%SECTOR="ene" THIS%SCALING=0.001 THIS%PARAMID=212123 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="HCN" THIS%SECTOR="ind" THIS%SCALING=0.001 THIS%PARAMID=212125 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="HCN" THIS%SECTOR="ref" THIS%SCALING=0.001 THIS%PARAMID=212120 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="HCN" THIS%SECTOR="res" THIS%SCALING=0.001 THIS%PARAMID=212126 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="HCOOH" THIS%SECTOR="emiss_bio" THIS%PARAMID=212141 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.25 / +&NAMCOMPO_EMIS THIS%SPECIES="HCOOH" THIS%SECTOR="ene" THIS%PARAMID=212142 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="HCOOH" THIS%SECTOR="fef" THIS%PARAMID=212143 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="HCOOH" THIS%SECTOR="ind" THIS%PARAMID=212144 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="HCOOH" THIS%SECTOR="res" THIS%PARAMID=212145 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="HCOOH" THIS%SECTOR="shp" THIS%PARAMID=212146 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="HCOOH" THIS%SECTOR="slv" THIS%PARAMID=212240 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="HCOOH" THIS%SECTOR="swd" THIS%PARAMID=212147 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="HCOOH" THIS%SECTOR="tnr" THIS%PARAMID=212148 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="HCOOH" THIS%SECTOR="tro" THIS%PARAMID=212149 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="ISPD" THIS%SECTOR="emiss_bio" THIS%PARAMID=212150 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.65 / +&NAMCOMPO_EMIS THIS%SPECIES="MCOOH" THIS%SECTOR="emiss_bio" THIS%PARAMID=212151 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.25 / +&NAMCOMPO_EMIS THIS%SPECIES="MCOOH" THIS%SECTOR="ene" THIS%PARAMID=212152 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="MCOOH" THIS%SECTOR="fef" THIS%PARAMID=212153 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="MCOOH" THIS%SECTOR="ind" THIS%PARAMID=212154 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="MCOOH" THIS%SECTOR="res" THIS%PARAMID=212155 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="MCOOH" THIS%SECTOR="shp" THIS%PARAMID=212156 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="MCOOH" THIS%SECTOR="slv" THIS%PARAMID=212241 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="MCOOH" THIS%SECTOR="swd" THIS%PARAMID=212157 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="MCOOH" THIS%SECTOR="tnr" THIS%PARAMID=212158 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="MCOOH" THIS%SECTOR="tro" THIS%PARAMID=212159 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210116 / +&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="agl" THIS%PARAMID=212163 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" / +&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="ags" THIS%PARAMID=212164 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGS" / +&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="emiss_bio" THIS%PARAMID=212161 / +&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="emiss_nat" THIS%PARAMID=212162 / +&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="ene" THIS%PARAMID=212165 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="ind" THIS%PARAMID=212166 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="ref" THIS%PARAMID=212138 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="res" THIS%PARAMID=212167 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="slv" THIS%PARAMID=212169 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="swd" THIS%PARAMID=212170 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="tnr" THIS%PARAMID=212171 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="tro" THIS%PARAMID=212172 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210085 / +&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="agl" THIS%PARAMID=212174 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" / +&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="emiss_nat" THIS%PARAMID=212173 / +&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="ene" THIS%PARAMID=212176 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="fef" THIS%PARAMID=212177 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="ind" THIS%PARAMID=212178 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="ref" THIS%PARAMID=212184 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="res" THIS%PARAMID=212179 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="shp" THIS%PARAMID=212180 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="swd" THIS%PARAMID=212181 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="tnr" THIS%PARAMID=212182 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="tro" THIS%PARAMID=212183 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="NO2" THIS%SECTOR="Aviation" THIS%VERTICAL_PROFILE_TYPE="3D" THIS%PARAMID=212255 THIS%SCALING=1.53333333333333 / +&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=219208 / +&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="emiss_bio" THIS%PARAMID=212191 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.65 / +&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="ene" THIS%PARAMID=212192 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="fef" THIS%PARAMID=212193 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="ind" THIS%PARAMID=212194 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="ref" THIS%PARAMID=212200 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="res" THIS%PARAMID=212195 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="shp" THIS%PARAMID=212196 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="slv" THIS%PARAMID=212242 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="swd" THIS%PARAMID=212197 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="tnr" THIS%PARAMID=212188 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="tro" THIS%PARAMID=212199 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=219207 / +&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="emiss_bio" THIS%PARAMID=212201 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.65 / +&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="ene" THIS%PARAMID=212202 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="fef" THIS%PARAMID=212203 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="ind" THIS%PARAMID=212204 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="ref" THIS%PARAMID=212139 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="res" THIS%PARAMID=212205 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="shp" THIS%PARAMID=212206 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="slv" THIS%PARAMID=212243 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="swd" THIS%PARAMID=212207 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="tnr" THIS%PARAMID=212208 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="tro" THIS%PARAMID=212209 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="Rn" THIS%SECTOR="emiss_nat" THIS%PARAMID=212210 / +&NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210102 / +&NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="emiss_nat" THIS%PARAMID=212211 THIS%VERTICAL_PROFILE_TYPE="AltitudeMap" THIS%VERTICAL_PARAMID=216045 THIS%VERTICAL_BASE_LEVEL=-1 THIS%VERTICAL_TOP_LEVEL=-4 THIS%VERTICAL_THRESHOLD=200 / +&NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="ene" THIS%PARAMID=212212 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="fef" THIS%PARAMID=212213 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="ind" THIS%PARAMID=212214 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="ref" THIS%PARAMID=212220 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="res" THIS%PARAMID=212215 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="shp" THIS%PARAMID=212216 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="swd" THIS%PARAMID=212217 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="tnr" THIS%PARAMID=212218 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="tro" THIS%PARAMID=212219 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="SOG2B" THIS%SECTOR="agl" THIS%PARAMID=216221 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" / +&NAMCOMPO_EMIS THIS%SPECIES="SOG2B" THIS%SECTOR="ene" THIS%PARAMID=216222 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="SOG2B" THIS%SECTOR="fef" THIS%PARAMID=216223 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="SOG2B" THIS%SECTOR="ind" THIS%PARAMID=216224 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="SOG2B" THIS%SECTOR="ref" THIS%PARAMID=216225 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="SOG2B" THIS%SECTOR="res" THIS%PARAMID=216226 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="SOG2B" THIS%SECTOR="shp" THIS%PARAMID=216227 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="SOG2B" THIS%SECTOR="slv" THIS%PARAMID=216228 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="SOG2B" THIS%SECTOR="swd" THIS%PARAMID=216229 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="SOG2B" THIS%SECTOR="tnr" THIS%PARAMID=216230 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="SOG2B" THIS%SECTOR="tro" THIS%PARAMID=216231 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=219212 / +&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="emiss_bio" THIS%PARAMID=216200 / +&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="ene" THIS%PARAMID=216201 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="fef" THIS%PARAMID=216202 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="ind" THIS%PARAMID=216203 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="ref" THIS%PARAMID=216204 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="res" THIS%PARAMID=216205 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="shp" THIS%PARAMID=216206 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="slv" THIS%PARAMID=216207 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="swd" THIS%PARAMID=216208 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="tnr" THIS%PARAMID=216209 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="tro" THIS%PARAMID=216210 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="XYL" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=219213 / +&NAMCOMPO_EMIS THIS%SPECIES="XYL" THIS%SECTOR="ene" THIS%PARAMID=216211 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="XYL" THIS%SECTOR="fef" THIS%PARAMID=216212 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="XYL" THIS%SECTOR="ind" THIS%PARAMID=216213 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="XYL" THIS%SECTOR="ref" THIS%PARAMID=216214 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="XYL" THIS%SECTOR="res" THIS%PARAMID=216215 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="XYL" THIS%SECTOR="shp" THIS%PARAMID=216216 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="XYL" THIS%SECTOR="slv" THIS%PARAMID=216217 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="XYL" THIS%SECTOR="swd" THIS%PARAMID=216218 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="XYL" THIS%SECTOR="tnr" THIS%PARAMID=216219 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="XYL" THIS%SECTOR="tro" THIS%PARAMID=216220 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS / +&NAMCOMPO_EMIS_AUX THIS%PARAMID=210060 / +&NAMCOMPO_EMIS_AUX THIS%PARAMID=216045 / +&NAMCOMPO_EMIS_AUX / + +EOF diff --git a/ifs-test/tests/t21/common/m7/m7_yaerodesc.nml b/ifs-test/tests/t21/common/m7/m7_yaerodesc.nml new file mode 100644 index 00000000..f14cf4ce --- /dev/null +++ b/ifs-test/tests/t21/common/m7/m7_yaerodesc.nml @@ -0,0 +1,163 @@ +cat >> fort.4 << EOF +NTYPAER=3,3,2,2,1,2,1,2,0,0, +YAERO_DESC(1)%IGRIBDIAG=215001,215004,215007,215010,215013,215016,215022,215019, +YAERO_DESC(1)%RDDEPVSEA=1.1000E-02, +YAERO_DESC(1)%RDDEPVLIC=1.1000E-02, +YAERO_DESC(1)%RSEDIMV=2.4000E-05, +YAERO_DESC(1)%RSCAVIN=0.9, +YAERO_DESC(1)%RSCAVBCR=0.001, +YAERO_DESC(1)%RSCAVBCS=0.005, +YAERO_DESC(1)%COPTCLASS='SeaSaltSmall', +YAERO_DESC(1)%CHYGCLASS='SeaSalt', +YAERO_DESC(1)%IAEROCV=1, +YAERO_DESC(2)%IGRIBDIAG=215002,215005,215008,215011,215014,215017,215023,215020, +YAERO_DESC(2)%RDDEPVSEA=1.1500E-02, +YAERO_DESC(2)%RDDEPVLIC=1.2000E-02, +YAERO_DESC(2)%RSEDIMV=1.9500E-03, +YAERO_DESC(2)%RSCAVIN=0.9, +YAERO_DESC(2)%RSCAVBCR=0.001, +YAERO_DESC(2)%RSCAVBCS=0.005, +YAERO_DESC(2)%COPTCLASS='SeaSaltMedium', +YAERO_DESC(2)%CHYGCLASS='SeaSalt', +YAERO_DESC(2)%IAEROCV=2, +YAERO_DESC(3)%IGRIBDIAG=215003,215006,215009,215012,215015,215018,215024,215021, +YAERO_DESC(3)%RDDEPVSEA=1.2000E-02, +YAERO_DESC(3)%RDDEPVLIC=1.5000E-02, +YAERO_DESC(3)%RSEDIMV=1.8000E-02, +YAERO_DESC(3)%RSCAVIN=0.9, +YAERO_DESC(3)%RSCAVBCR=0.1, +YAERO_DESC(3)%RSCAVBCS=0.005, +YAERO_DESC(3)%COPTCLASS='SeaSaltLarge', +YAERO_DESC(3)%CHYGCLASS='SeaSalt', +YAERO_DESC(3)%IAEROCV=2, +YAERO_DESC(4)%IGRIBDIAG=215025,215028,215031,215034,215037,215040,215046,215043, +YAERO_DESC(4)%RDDEPVSEA=2.0000E-04, +YAERO_DESC(4)%RDDEPVLIC=2.0000E-04, +YAERO_DESC(4)%RSEDIMV=6.9040E-05, +YAERO_DESC(4)%RSCAVIN=0.7, +YAERO_DESC(4)%RSCAVBCR=0.001, +YAERO_DESC(4)%RSCAVBCS=0.005, +YAERO_DESC(4)%COPTCLASS='DustSmall', +YAERO_DESC(4)%CHYGCLASS='Dust', +YAERO_DESC(4)%IAEROCV=1, +YAERO_DESC(5)%IGRIBDIAG=215026,215029,215032,215035,215038,215041,215047,215044, +YAERO_DESC(5)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(5)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(5)%RSEDIMV=1.9820E-04, +YAERO_DESC(5)%RSCAVIN=0.7, +YAERO_DESC(5)%RSCAVBCR=0.001, +YAERO_DESC(5)%RSCAVBCS=0.005, +YAERO_DESC(5)%COPTCLASS='DustMedium', +YAERO_DESC(5)%CHYGCLASS='Dust', +YAERO_DESC(5)%IAEROCV=2, +YAERO_DESC(6)%IGRIBDIAG=215027,215030,215033,215036,215039,215042,215048,215045, +YAERO_DESC(6)%RDDEPVSEA=1.2000E-02, +YAERO_DESC(6)%RDDEPVLIC=1.2000E-02, +YAERO_DESC(6)%RSEDIMV=1.9620E-03, +YAERO_DESC(6)%RSCAVIN=0.7, +YAERO_DESC(6)%RSCAVBCR=0.1, +YAERO_DESC(6)%RSCAVBCS=0.005, +YAERO_DESC(6)%COPTCLASS='DustLarge', +YAERO_DESC(6)%CHYGCLASS='Dust', +YAERO_DESC(6)%IAEROCV=2, +YAERO_DESC(7)%IGRIBDIAG=215050,215052,215054,215056,215058,215060,215064,215062, +YAERO_DESC(7)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(7)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(7)%RSEDIMV=2.0000E-04, +YAERO_DESC(7)%RSCAVIN=0.7, +YAERO_DESC(7)%RSCAVBCR=0.0001, +YAERO_DESC(7)%RSCAVBCS=0.005, +YAERO_DESC(7)%COPTCLASS='OrganicMatter', +YAERO_DESC(7)%CHYGCLASS='OrganicMatter', +YAERO_DESC(7)%IAEROCV=1, +YAERO_DESC(8)%IGRIBDIAG=215049,215051,215053,215055,215057,215059,215063,215061, +YAERO_DESC(8)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(8)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(8)%RSEDIMV=2.0000E-04, +YAERO_DESC(8)%RSCAVIN=0, +YAERO_DESC(8)%RSCAVBCR=0.0001, +YAERO_DESC(8)%RSCAVBCS=0.005, +YAERO_DESC(8)%COPTCLASS='OrganicMatter', +YAERO_DESC(8)%CHYGCLASS='Hydrophobic', +YAERO_DESC(8)%IAEROCV=1, +YAERO_DESC(9)%IGRIBDIAG=215066,215068,215070,215072,215074,215076,215080,215078, +YAERO_DESC(9)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(9)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(9)%RSEDIMV=2.0000E-04, +YAERO_DESC(9)%RSCAVIN=0.7, +YAERO_DESC(9)%RSCAVBCR=0.0001, +YAERO_DESC(9)%RSCAVBCS=0.005, +YAERO_DESC(9)%COPTCLASS='BlackCarbon', +YAERO_DESC(9)%CHYGCLASS='BlackCarbon', +YAERO_DESC(9)%IAEROCV=1, +YAERO_DESC(10)%IGRIBDIAG=215065,215067,215069,215071,215073,215075,215079,215077, +YAERO_DESC(10)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(10)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(10)%RSEDIMV=2.0000E-04, +YAERO_DESC(10)%RSCAVIN=0, +YAERO_DESC(10)%RSCAVBCR=0.0001, +YAERO_DESC(10)%RSCAVBCS=0.005, +YAERO_DESC(10)%COPTCLASS='BlackCarbon', +YAERO_DESC(10)%CHYGCLASS='Hydrophobic', +YAERO_DESC(10)%IAEROCV=1, +YAERO_DESC(11)%IGRIBDIAG=215081,215082,215083,215084,215085,215086,215088,215087, +YAERO_DESC(11)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(11)%RDDEPVLIC=2.5000E-03, +YAERO_DESC(11)%RSEDIMV=2.0000E-04, +YAERO_DESC(11)%RSCAVIN=0.7, +YAERO_DESC(11)%RSCAVBCR=0.0001, +YAERO_DESC(11)%RSCAVBCS=0.005, +YAERO_DESC(11)%COPTCLASS='Sulphate', +YAERO_DESC(11)%CHYGCLASS='Sulphate', +YAERO_DESC(11)%IAEROCV=1, +YAERO_DESC(12)%IGRIBDIAG=215189,215191,215193,215195,215197,215199,215203,215201, +YAERO_DESC(12)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(12)%RDDEPVLIC=1.5000E-03, +YAERO_DESC(12)%RSEDIMV=2.0000E-04, +YAERO_DESC(12)%RSCAVIN=0.8, +YAERO_DESC(12)%RSCAVBCR=0.0001, +YAERO_DESC(12)%RSCAVBCS=0.005, +YAERO_DESC(12)%COPTCLASS='NitrateFine', +YAERO_DESC(12)%CHYGCLASS='Nitrate', +YAERO_DESC(12)%IAEROCV=1, +YAERO_DESC(13)%IGRIBDIAG=215190,215192,215194,215196,215198,215200,215204,215202, +YAERO_DESC(13)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(13)%RDDEPVLIC=1.5000E-03, +YAERO_DESC(13)%RSEDIMV=1.3352E-03, +YAERO_DESC(13)%RSCAVIN=0.8, +YAERO_DESC(13)%RSCAVBCR=0.1, +YAERO_DESC(13)%RSCAVBCS=0.005, +YAERO_DESC(13)%COPTCLASS='NitrateCoarse', +YAERO_DESC(13)%CHYGCLASS='Nitrate', +YAERO_DESC(13)%IAEROCV=2, +YAERO_DESC(14)%IGRIBDIAG=215205,215206,215207,215208,215209,215210,216042,215211, +YAERO_DESC(14)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(14)%RDDEPVLIC=1.5000E-03, +YAERO_DESC(14)%RSEDIMV=2.0000E-04, +YAERO_DESC(14)%RSCAVIN=0.9, +YAERO_DESC(14)%RSCAVBCR=0.0001, +YAERO_DESC(14)%RSCAVBCS=0.005, +YAERO_DESC(14)%COPTCLASS='Ammonium', +YAERO_DESC(14)%CHYGCLASS='Ammonium', +YAERO_DESC(14)%IAEROCV=1, +YAERO_DESC(15)%IGRIBDIAG=215212,215213,215214,215215,215216,215217,216098,215218, +YAERO_DESC(15)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(15)%RDDEPVLIC=2.5000E-03, +YAERO_DESC(15)%RSEDIMV=2.4000E-04, +YAERO_DESC(15)%RSCAVIN=0.7, +YAERO_DESC(15)%RSCAVBCR=0.0001, +YAERO_DESC(15)%RSCAVBCS=0.005, +YAERO_DESC(15)%COPTCLASS='SecOrgBio', +YAERO_DESC(15)%CHYGCLASS='SecOrgBio', +YAERO_DESC(15)%IAEROCV=1, +YAERO_DESC(16)%IGRIBDIAG=215219,215220,215221,215222,215223,215224,216099,215225, +YAERO_DESC(16)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(16)%RDDEPVLIC=2.5000E-03, +YAERO_DESC(16)%RSEDIMV=2.4000E-04, +YAERO_DESC(16)%RSCAVIN=0.7, +YAERO_DESC(16)%RSCAVBCR=0.0001, +YAERO_DESC(16)%RSCAVBCS=0.005, +YAERO_DESC(16)%COPTCLASS='SecOrgAnth', +YAERO_DESC(16)%CHYGCLASS='SecOrgAnth', +YAERO_DESC(16)%IAEROCV=1, +EOF diff --git a/ifs-test/tests/t21/common/namelist_m7_from_openifsrun b/ifs-test/tests/t21/common/namelist_m7_from_openifsrun new file mode 100644 index 00000000..fbcaa40a --- /dev/null +++ b/ifs-test/tests/t21/common/namelist_m7_from_openifsrun @@ -0,0 +1,4775 @@ +&NAMIOS +CFRCF="./rcf", +CIOSPRF="./srf", +/ +&NAMGRIB +CFCLASS="rd", +NCYCLE=154, +/ +&NAMCVER +LVERTFE=true, +NVSCH=3, +LVFE_GWMPA=true, +LVFE_GW=false, +LVFE_Z_TERM=false, +LVFE_X_TERM=false, +LVFE_LAPL_BC=true, +LVFE_LAPL=true, +NDLNPR=0, +/ +&NAMMCC +LMCC_COMPO=false, +LMCCEC=true, +LMCCIEC=false, +/ +&NAMTRANS +LUSEFLT=false, +LFFTW=false, +/ +&NAMRES +NFRRES=1, +NRESTS(:)=-1,-32767, +/ +&NAERAD +CRTABLEDIR='./rtables/', +LECOMPGRID=false, +RMUZUV=0.01, +NUVTIM=72, +NRADUV=1, +NUV=24, +LUVPROC=false, +LUVAERP=true, +LO3_CHEM_UV=true, +KMODTS=2, +NAERMACC=0, +NRPROMA=0, +/ +&NAEPHY +LNEEONLINE=true, +LWETONLINE=false, +LBFASCO2=false, +LEPHYS=true, +LEVDIF=true, +LESURF=true, +LECOND=true, +LECUMF=true, +LEPCLD=true, +LEEVAP=true, +LEVGEN=true, +LESSRO=true, +LECURR=false, +LEOCWA=true, +LEGWDG=true, +LEGWWMS=true, +LEOZOC=true, +LEQNGT=true, +LERADI=true, +LERADS=true, +LESICE=true, +LEO3CH=true, +LO3CH_HLO=true, +CO3CHEM="H1.0", +LEDCLD=true, +LDUCTDIA=false, +LDIAGTURB_EC=false, +LELIGHT=false, +LWCOU=true, +LWCOU2W=true, +LWCOUHMF=false, +LWCOURNW=false, +NSTPW=1, +LSLPHY=true, +LESNML=true, +NSNMLWS=2, +LEFARQUHAR=true, +LEOPTSURF=false, +LEAIRCO2COUP=false, +LEC4MAP=true, +LEAGS=false, +/ +&NAMPAR1 +NOUTTYPE=1, +LSPLIT=true, +NWRTOUT=4, +NFLDIN=0, +NSTRIN=1, +/ +&NAMPAR0 +LXML_STATS=false, +LSTATS=true, +LDETAILED_STATS=false, +LSYNCSTATS=false, +LSTATSCPU=false, +NPRNT_STATS=512, +LBARRIER_STATS=false, +LBARRIER_STATS2=false, +NPROC=512, +NSPECRESMIN=256, +NOUTPUT=1, +MP_TYPE=1, +MBX_SIZE=0, +/ +&NAMDYNA +LSLAG=true, +LNHEE=false, +LNHQE=false, +LGRADSP=true, +LCOMAD_GFL=true, +LCOMADH=true, +/ +&NAMDYNCORE +LAQUA=false, +/ +&NAMDYN +LMASCOR=true, +NITMP=3, +/ +&NAMCT0 +LARPEGEF=false, +LFDBOP=false, +LSMSSIG=false, +N3DINI=0, +NFRDHP=12, +NFRDHFD=1, +NFRSDI=1, +NFRPOS=6, +NFRHIS=6, +NFRMASSCON=1, +NFPOS=2, +NPOSTS=0, +NHISTS=0, +NMASSCONS=0, +NFRCO=4, +NFRDHFZ=48, +NDHFZTS=0, +NDHFDTS=0, +NUNDEFLD=-999999, +CMETER="ecflow_client --meter", +CEVENT="ecflow_client --event", +/ +&NAMDDH +BDEDDH(1:6,1)=4.0,1.0,0.0,50.0,0.0,49.0, +NDHKD=120, +LHDZON=false, +LHDEFZ=false, +LHDDOP=false, +LHDEFD=false, +LHDGLB=false, +LHDPRG=false, +LHDHKS=false, +/ +&NAMIO_SERV +NPROCESS_LEVEL=5, +NIO_SERV_METHOD=2, +NMSG_LEVEL_CLIENT=0, +NMSG_LEVEL_SERVER=1, +/ +&NAMGFL +NAERO=37, +NACTAERO=37, +YAERO_NL(1)%CNAME='SO4', +YAERO_NL(1)%IGRBCODE=210011, +YAERO_NL(1)%LMASSFIX=.true., +YAERO_NL(1)%LCOMAD=.true., +YAERO_NL(1)%LQM=.false., +YAERO_NL(1)%LQM3D=.true., +YAERO_NL(1)%BETAMFBC=-999, +YAERO_NL(1)%LADV=.true., +YAERO_NL(1)%NREQIN=0, +YAERO_NL(2)%CNAME='NH4', +YAERO_NL(2)%IGRBCODE=212035, +YAERO_NL(2)%LMASSFIX=.true., +YAERO_NL(2)%LCOMAD=.true., +YAERO_NL(2)%LQM=.false., +YAERO_NL(2)%LQM3D=.true., +YAERO_NL(2)%BETAMFBC=-999, +YAERO_NL(2)%LADV=.true., +YAERO_NL(2)%NREQIN=0, +YAERO_NL(3)%CNAME='NO3_A', +YAERO_NL(3)%IGRBCODE=212036, +YAERO_NL(3)%LMASSFIX=.true., +YAERO_NL(3)%LCOMAD=.true., +YAERO_NL(3)%LQM=.false., +YAERO_NL(3)%LQM3D=.true., +YAERO_NL(3)%BETAMFBC=-999, +YAERO_NL(3)%LADV=.true., +YAERO_NL(3)%NREQIN=0, +YAERO_NL(4)%CNAME='ACS_N', +YAERO_NL(4)%IGRBCODE=212001, +YAERO_NL(4)%LMASSFIX=.true., +YAERO_NL(4)%LCOMAD=.true., +YAERO_NL(4)%LQM=.false., +YAERO_NL(4)%LQM3D=.true., +YAERO_NL(4)%BETAMFBC=-999, +YAERO_NL(4)%LADV=.true., +YAERO_NL(4)%NREQIN=0, +YAERO_NL(5)%CNAME='SO4ACS', +YAERO_NL(5)%IGRBCODE=212002, +YAERO_NL(5)%LMASSFIX=.true., +YAERO_NL(5)%LCOMAD=.true., +YAERO_NL(5)%LQM=.false., +YAERO_NL(5)%LQM3D=.true., +YAERO_NL(5)%BETAMFBC=-999, +YAERO_NL(5)%LADV=.true., +YAERO_NL(5)%NREQIN=0, +YAERO_NL(6)%CNAME='BCACS', +YAERO_NL(6)%IGRBCODE=212003, +YAERO_NL(6)%LMASSFIX=.true., +YAERO_NL(6)%LCOMAD=.true., +YAERO_NL(6)%LQM=.false., +YAERO_NL(6)%LQM3D=.true., +YAERO_NL(6)%BETAMFBC=-999, +YAERO_NL(6)%LADV=.true., +YAERO_NL(6)%NREQIN=0, +YAERO_NL(7)%CNAME='POMACS', +YAERO_NL(7)%IGRBCODE=212004, +YAERO_NL(7)%LMASSFIX=.true., +YAERO_NL(7)%LCOMAD=.true., +YAERO_NL(7)%LQM=.false., +YAERO_NL(7)%LQM3D=.true., +YAERO_NL(7)%BETAMFBC=-999, +YAERO_NL(7)%LADV=.true., +YAERO_NL(7)%NREQIN=0, +YAERO_NL(8)%CNAME='SSACS', +YAERO_NL(8)%IGRBCODE=212005, +YAERO_NL(8)%LMASSFIX=.true., +YAERO_NL(8)%LCOMAD=.true., +YAERO_NL(8)%LQM=.false., +YAERO_NL(8)%LQM3D=.true., +YAERO_NL(8)%BETAMFBC=-999, +YAERO_NL(8)%LADV=.true., +YAERO_NL(8)%NREQIN=0, +YAERO_NL(9)%CNAME='DUACS', +YAERO_NL(9)%IGRBCODE=212006, +YAERO_NL(9)%LMASSFIX=.true., +YAERO_NL(9)%LCOMAD=.true., +YAERO_NL(9)%LQM=.false., +YAERO_NL(9)%LQM3D=.true., +YAERO_NL(9)%BETAMFBC=-999, +YAERO_NL(9)%LADV=.true., +YAERO_NL(9)%NREQIN=0, +YAERO_NL(10)%CNAME='SOANUS', +YAERO_NL(10)%IGRBCODE=212007, +YAERO_NL(10)%LMASSFIX=.true., +YAERO_NL(10)%LCOMAD=.true., +YAERO_NL(10)%LQM=.false., +YAERO_NL(10)%LQM3D=.true., +YAERO_NL(10)%BETAMFBC=-999, +YAERO_NL(10)%LADV=.true., +YAERO_NL(10)%NREQIN=0, +YAERO_NL(11)%CNAME='SOAAIS', +YAERO_NL(11)%IGRBCODE=212008, +YAERO_NL(11)%LMASSFIX=.true., +YAERO_NL(11)%LCOMAD=.true., +YAERO_NL(11)%LQM=.false., +YAERO_NL(11)%LQM3D=.true., +YAERO_NL(11)%BETAMFBC=-999, +YAERO_NL(11)%LADV=.true., +YAERO_NL(11)%NREQIN=0, +YAERO_NL(12)%CNAME='SOAACS', +YAERO_NL(12)%IGRBCODE=212009, +YAERO_NL(12)%LMASSFIX=.true., +YAERO_NL(12)%LCOMAD=.true., +YAERO_NL(12)%LQM=.false., +YAERO_NL(12)%LQM3D=.true., +YAERO_NL(12)%BETAMFBC=-999, +YAERO_NL(12)%LADV=.true., +YAERO_NL(12)%NREQIN=0, +YAERO_NL(13)%CNAME='SOACOS', +YAERO_NL(13)%IGRBCODE=212010, +YAERO_NL(13)%LMASSFIX=.true., +YAERO_NL(13)%LCOMAD=.true., +YAERO_NL(13)%LQM=.false., +YAERO_NL(13)%LQM3D=.true., +YAERO_NL(13)%BETAMFBC=-999, +YAERO_NL(13)%LADV=.true., +YAERO_NL(13)%NREQIN=0, +YAERO_NL(14)%CNAME='SOAAII', +YAERO_NL(14)%IGRBCODE=212011, +YAERO_NL(14)%LMASSFIX=.true., +YAERO_NL(14)%LCOMAD=.true., +YAERO_NL(14)%LQM=.false., +YAERO_NL(14)%LQM3D=.true., +YAERO_NL(14)%BETAMFBC=-999, +YAERO_NL(14)%LADV=.true., +YAERO_NL(14)%NREQIN=0, +YAERO_NL(15)%CNAME='H2OPART', +YAERO_NL(15)%IGRBCODE=212012, +YAERO_NL(15)%LMASSFIX=.true., +YAERO_NL(15)%LCOMAD=.true., +YAERO_NL(15)%LQM=.false., +YAERO_NL(15)%LQM3D=.true., +YAERO_NL(15)%BETAMFBC=-999, +YAERO_NL(15)%LADV=.true., +YAERO_NL(15)%NREQIN=0, +YAERO_NL(16)%CNAME='AII_N', +YAERO_NL(16)%IGRBCODE=212013, +YAERO_NL(16)%LMASSFIX=.true., +YAERO_NL(16)%LCOMAD=.true., +YAERO_NL(16)%LQM=.false., +YAERO_NL(16)%LQM3D=.true., +YAERO_NL(16)%BETAMFBC=-999, +YAERO_NL(16)%LADV=.true., +YAERO_NL(16)%NREQIN=0, +YAERO_NL(17)%CNAME='BCAII', +YAERO_NL(17)%IGRBCODE=212014, +YAERO_NL(17)%LMASSFIX=.true., +YAERO_NL(17)%LCOMAD=.true., +YAERO_NL(17)%LQM=.false., +YAERO_NL(17)%LQM3D=.true., +YAERO_NL(17)%BETAMFBC=-999, +YAERO_NL(17)%LADV=.true., +YAERO_NL(17)%NREQIN=0, +YAERO_NL(18)%CNAME='POMAII', +YAERO_NL(18)%IGRBCODE=212015, +YAERO_NL(18)%LMASSFIX=.true., +YAERO_NL(18)%LCOMAD=.true., +YAERO_NL(18)%LQM=.false., +YAERO_NL(18)%LQM3D=.true., +YAERO_NL(18)%BETAMFBC=-999, +YAERO_NL(18)%LADV=.true., +YAERO_NL(18)%NREQIN=0, +YAERO_NL(19)%CNAME='ACI_N', +YAERO_NL(19)%IGRBCODE=212016, +YAERO_NL(19)%LMASSFIX=.true., +YAERO_NL(19)%LCOMAD=.true., +YAERO_NL(19)%LQM=.false., +YAERO_NL(19)%LQM3D=.true., +YAERO_NL(19)%BETAMFBC=-999, +YAERO_NL(19)%LADV=.true., +YAERO_NL(19)%NREQIN=0, +YAERO_NL(20)%CNAME='DUACI', +YAERO_NL(20)%IGRBCODE=212017, +YAERO_NL(20)%LMASSFIX=.true., +YAERO_NL(20)%LCOMAD=.true., +YAERO_NL(20)%LQM=.false., +YAERO_NL(20)%LQM3D=.true., +YAERO_NL(20)%BETAMFBC=-999, +YAERO_NL(20)%LADV=.true., +YAERO_NL(20)%NREQIN=0, +YAERO_NL(21)%CNAME='AIS_N', +YAERO_NL(21)%IGRBCODE=212018, +YAERO_NL(21)%LMASSFIX=.true., +YAERO_NL(21)%LCOMAD=.true., +YAERO_NL(21)%LQM=.false., +YAERO_NL(21)%LQM3D=.true., +YAERO_NL(21)%BETAMFBC=-999, +YAERO_NL(21)%LADV=.true., +YAERO_NL(21)%NREQIN=0, +YAERO_NL(22)%CNAME='SO4AIS', +YAERO_NL(22)%IGRBCODE=212019, +YAERO_NL(22)%LMASSFIX=.true., +YAERO_NL(22)%LCOMAD=.true., +YAERO_NL(22)%LQM=.false., +YAERO_NL(22)%LQM3D=.true., +YAERO_NL(22)%BETAMFBC=-999, +YAERO_NL(22)%LADV=.true., +YAERO_NL(22)%NREQIN=0, +YAERO_NL(23)%CNAME='BCAIS', +YAERO_NL(23)%IGRBCODE=212020, +YAERO_NL(23)%LMASSFIX=.true., +YAERO_NL(23)%LCOMAD=.true., +YAERO_NL(23)%LQM=.false., +YAERO_NL(23)%LQM3D=.true., +YAERO_NL(23)%BETAMFBC=-999, +YAERO_NL(23)%LADV=.true., +YAERO_NL(23)%NREQIN=0, +YAERO_NL(24)%CNAME='POMAIS', +YAERO_NL(24)%IGRBCODE=212021, +YAERO_NL(24)%LMASSFIX=.true., +YAERO_NL(24)%LCOMAD=.true., +YAERO_NL(24)%LQM=.false., +YAERO_NL(24)%LQM3D=.true., +YAERO_NL(24)%BETAMFBC=-999, +YAERO_NL(24)%LADV=.true., +YAERO_NL(24)%NREQIN=0, +YAERO_NL(25)%CNAME='COI_N', +YAERO_NL(25)%IGRBCODE=212022, +YAERO_NL(25)%LMASSFIX=.true., +YAERO_NL(25)%LCOMAD=.true., +YAERO_NL(25)%LQM=.false., +YAERO_NL(25)%LQM3D=.true., +YAERO_NL(25)%BETAMFBC=-999, +YAERO_NL(25)%LADV=.true., +YAERO_NL(25)%NREQIN=0, +YAERO_NL(26)%CNAME='DUCOI', +YAERO_NL(26)%IGRBCODE=212023, +YAERO_NL(26)%LMASSFIX=.true., +YAERO_NL(26)%LCOMAD=.true., +YAERO_NL(26)%LQM=.false., +YAERO_NL(26)%LQM3D=.true., +YAERO_NL(26)%BETAMFBC=-999, +YAERO_NL(26)%LADV=.true., +YAERO_NL(26)%NREQIN=0, +YAERO_NL(27)%CNAME='COS_N', +YAERO_NL(27)%IGRBCODE=212024, +YAERO_NL(27)%LMASSFIX=.true., +YAERO_NL(27)%LCOMAD=.true., +YAERO_NL(27)%LQM=.false., +YAERO_NL(27)%LQM3D=.true., +YAERO_NL(27)%BETAMFBC=-999, +YAERO_NL(27)%LADV=.true., +YAERO_NL(27)%NREQIN=0, +YAERO_NL(28)%CNAME='SO4COS', +YAERO_NL(28)%IGRBCODE=212025, +YAERO_NL(28)%LMASSFIX=.true., +YAERO_NL(28)%LCOMAD=.true., +YAERO_NL(28)%LQM=.false., +YAERO_NL(28)%LQM3D=.true., +YAERO_NL(28)%BETAMFBC=-999, +YAERO_NL(28)%LADV=.true., +YAERO_NL(8)%NREQIN=0, +YAERO_NL(29)%CNAME='BCCOS', +YAERO_NL(29)%IGRBCODE=212026, +YAERO_NL(29)%LMASSFIX=.true., +YAERO_NL(29)%LCOMAD=.true., +YAERO_NL(29)%LQM=.false., +YAERO_NL(29)%LQM3D=.true., +YAERO_NL(29)%BETAMFBC=-999, +YAERO_NL(29)%LADV=.true., +YAERO_NL(29)%NREQIN=0, +YAERO_NL(30)%CNAME='POMCOS', +YAERO_NL(30)%IGRBCODE=212027, +YAERO_NL(30)%LMASSFIX=.true., +YAERO_NL(30)%LCOMAD=.true., +YAERO_NL(30)%LQM=.false., +YAERO_NL(30)%LQM3D=.true., +YAERO_NL(30)%BETAMFBC=-999, +YAERO_NL(30)%LADV=.true., +YAERO_NL(30)%NREQIN=0, +YAERO_NL(31)%CNAME='SSCOS', +YAERO_NL(31)%IGRBCODE=212028, +YAERO_NL(31)%LMASSFIX=.true., +YAERO_NL(31)%LCOMAD=.true., +YAERO_NL(31)%LQM=.false., +YAERO_NL(31)%LQM3D=.true., +YAERO_NL(31)%BETAMFBC=-999, +YAERO_NL(31)%LADV=.true., +YAERO_NL(31)%NREQIN=0, +YAERO_NL(32)%CNAME='DUCOS', +YAERO_NL(32)%IGRBCODE=212029, +YAERO_NL(32)%LMASSFIX=.true., +YAERO_NL(32)%LCOMAD=.true., +YAERO_NL(32)%LQM=.false., +YAERO_NL(32)%LQM3D=.true., +YAERO_NL(32)%BETAMFBC=-999, +YAERO_NL(32)%LADV=.true., +YAERO_NL(32)%NREQIN=0, +YAERO_NL(33)%CNAME='NUS_N', +YAERO_NL(33)%IGRBCODE=212030, +YAERO_NL(33)%LMASSFIX=.true., +YAERO_NL(33)%LCOMAD=.true., +YAERO_NL(33)%LQM=.false., +YAERO_NL(33)%LQM3D=.true., +YAERO_NL(33)%BETAMFBC=-999, +YAERO_NL(33)%LADV=.true., +YAERO_NL(33)%NREQIN=0, +YAERO_NL(34)%CNAME='SO4NUS', +YAERO_NL(34)%IGRBCODE=212031, +YAERO_NL(34)%LMASSFIX=.true., +YAERO_NL(34)%LCOMAD=.true., +YAERO_NL(34)%LQM=.false., +YAERO_NL(34)%LQM3D=.true., +YAERO_NL(34)%BETAMFBC=-999, +YAERO_NL(34)%LADV=.true., +YAERO_NL(34)%NREQIN=0, +YAERO_NL(35)%CNAME='ELVOC', +YAERO_NL(35)%IGRBCODE=212032, +YAERO_NL(35)%LMASSFIX=.true., +YAERO_NL(35)%LCOMAD=.true., +YAERO_NL(35)%LQM=.false., +YAERO_NL(35)%LQM3D=.true., +YAERO_NL(35)%BETAMFBC=-999, +YAERO_NL(35)%LADV=.true., +YAERO_NL(35)%NREQIN=0, +YAERO_NL(36)%CNAME='ISVOC', +YAERO_NL(36)%IGRBCODE=212033, +YAERO_NL(36)%LMASSFIX=.true., +YAERO_NL(36)%LCOMAD=.true., +YAERO_NL(36)%LQM=.false., +YAERO_NL(36)%LQM3D=.true., +YAERO_NL(36)%BETAMFBC=-999, +YAERO_NL(36)%LADV=.true., +YAERO_NL(36)%NREQIN=0, +YAERO_NL(37)%CNAME='MSA', +YAERO_NL(37)%IGRBCODE=212034, +YAERO_NL(37)%LMASSFIX=.true., +YAERO_NL(37)%LCOMAD=.true., +YAERO_NL(37)%LQM=.false., +YAERO_NL(37)%LQM3D=.true., +YAERO_NL(37)%BETAMFBC=-999, +YAERO_NL(37)%LADV=.true., +YAERO_NL(37)%NREQIN=0, +LAERAOT=false, +LAERLISI=false, +NAEROUT=0,NAERO_WVL_DIAG=20, +NAERO_WVL_DIAG_TYPES=5, +YAERO_WVL_DIAG_NL(1)%IWVL=550, +YAERO_WVL_DIAG_NL(1)%IGRIBDIAG=210207,215104,215122,215140,215158, +YAERO_WVL_DIAG_NL(2)%IWVL=340, +YAERO_WVL_DIAG_NL(2)%IGRIBDIAG=210217,215096,215114,215132,215150, +YAERO_WVL_DIAG_NL(3)%IWVL=355, +YAERO_WVL_DIAG_NL(3)%IGRIBDIAG=210218,215097,215115,215133,215151, +YAERO_WVL_DIAG_NL(4)%IWVL=380, +YAERO_WVL_DIAG_NL(4)%IGRIBDIAG=210219,215098,215116,215134,215152, +YAERO_WVL_DIAG_NL(5)%IWVL=400, +YAERO_WVL_DIAG_NL(5)%IGRIBDIAG=210220,215099,215117,215135,215153, +YAERO_WVL_DIAG_NL(6)%IWVL=440, +YAERO_WVL_DIAG_NL(6)%IGRIBDIAG=210221,215100,215118,215136,215154, +YAERO_WVL_DIAG_NL(7)%IWVL=469, +YAERO_WVL_DIAG_NL(7)%IGRIBDIAG=210213,215101,215119,215137,215155, +YAERO_WVL_DIAG_NL(8)%IWVL=500, +YAERO_WVL_DIAG_NL(8)%IGRIBDIAG=210222,215102,215120,215138,215156, +YAERO_WVL_DIAG_NL(9)%IWVL=532, +YAERO_WVL_DIAG_NL(9)%IGRIBDIAG=210223,215103,215121,215139,215157, +YAERO_WVL_DIAG_NL(10)%IWVL=645, +YAERO_WVL_DIAG_NL(10)%IGRIBDIAG=210224,215105,215123,215141,215159, +YAERO_WVL_DIAG_NL(11)%IWVL=670, +YAERO_WVL_DIAG_NL(11)%IGRIBDIAG=210214,215106,215124,215142,215160, +YAERO_WVL_DIAG_NL(12)%IWVL=800, +YAERO_WVL_DIAG_NL(12)%IGRIBDIAG=210225,215107,215125,215143,215161, +YAERO_WVL_DIAG_NL(13)%IWVL=858, +YAERO_WVL_DIAG_NL(13)%IGRIBDIAG=210226,215108,215126,215144,215162, +YAERO_WVL_DIAG_NL(14)%IWVL=865, +YAERO_WVL_DIAG_NL(14)%IGRIBDIAG=210215,215109,215127,215145,215163, +YAERO_WVL_DIAG_NL(15)%IWVL=1020, +YAERO_WVL_DIAG_NL(15)%IGRIBDIAG=210227,215110,215128,215146,215164, +YAERO_WVL_DIAG_NL(16)%IWVL=1064, +YAERO_WVL_DIAG_NL(16)%IGRIBDIAG=210228,215111,215129,215147,215165, +YAERO_WVL_DIAG_NL(17)%IWVL=1240, +YAERO_WVL_DIAG_NL(17)%IGRIBDIAG=210216,215112,215130,215148,215166, +YAERO_WVL_DIAG_NL(18)%IWVL=1640, +YAERO_WVL_DIAG_NL(18)%IGRIBDIAG=210229,215113,215131,215149,215167, +YAERO_WVL_DIAG_NL(19)%IWVL=2130, +YAERO_WVL_DIAG_NL(19)%IGRIBDIAG=210230,215176,215177,215178,215179, +YAERO_WVL_DIAG_NL(20)%IWVL=10000, +YAERO_WVL_DIAG_NL(20)%IGRIBDIAG=216008,216009,216010,216011,216012, +LAERCHEM=true, +NCHEM=74, +YCHEM_NL(1)%CNAME='O3', +YCHEM_NL(1)%NREQIN=1, +YCHEM_NL(1)%RMOLMASS=48.0, +YCHEM_NL(1)%IGRBCODE=210203, +YCHEM_NL(1)%LNEGFIX=.TRUE., +YCHEM_NL(1)%IGRIBTC=210206, +YCHEM_NL(1)%IGRIBDV=221001, +YCHEM_NL(1)%HENRYA=1.0e-2, +YCHEM_NL(1)%HENRYB=2800.0, +YCHEM_NL(1)%LQM=.false., +YCHEM_NL(1)%LQM3D=.TRUE., +YCHEM_NL(1)%LCOMAD=.true., +YCHEM_NL(1)%LADV=.TRUE., +YCHEM_NL(1)%LMASSFIX=.TRUE., +YCHEM_NL(1)%BETAMFBC=-999.9, +YCHEM_NL(1)%LASSIM=.TRUE., +YCHEM_NL(1)%LADV5=.TRUE., +YCHEM_NL(2)%CNAME='NOx', +YCHEM_NL(2)%NREQIN=0, +YCHEM_NL(2)%RMOLMASS=14.0, +YCHEM_NL(2)%IGRBCODE=210129, +YCHEM_NL(2)%LNEGFIX=.TRUE., +YCHEM_NL(2)%IGRIBTC=210130, +YCHEM_NL(2)%LQM=.false., +YCHEM_NL(2)%LQM3D=.TRUE., +YCHEM_NL(2)%LCOMAD=.true., +YCHEM_NL(2)%LADV=.TRUE., +YCHEM_NL(2)%LMASSFIX=.TRUE., +YCHEM_NL(2)%BETAMFBC=-999.9, +YCHEM_NL(2)%LASSIM=.FALSE., +YCHEM_NL(3)%CNAME='H2O2', +YCHEM_NL(3)%NREQIN=1, +YCHEM_NL(3)%RMOLMASS=34.0, +YCHEM_NL(3)%IGRBCODE=217003, +YCHEM_NL(3)%LNEGFIX=.TRUE., +YCHEM_NL(3)%IGRIBTC=218003, +YCHEM_NL(3)%IGRIBDV=221003, +YCHEM_NL(3)%HENRYA=8.3e4, +YCHEM_NL(3)%HENRYB=7600.0, +YCHEM_NL(3)%LQM=.false., +YCHEM_NL(3)%LQM3D=.TRUE., +YCHEM_NL(3)%LCOMAD=.true., +YCHEM_NL(3)%LADV=.TRUE., +YCHEM_NL(3)%LMASSFIX=.TRUE., +YCHEM_NL(3)%BETAMFBC=-999.9, +YCHEM_NL(3)%LASSIM=.FALSE., +YCHEM_NL(4)%CNAME='CH4', +YCHEM_NL(4)%NREQIN=1, +YCHEM_NL(4)%RMOLMASS=16.0, +YCHEM_NL(4)%IGRBCODE=217004, +YCHEM_NL(4)%LNEGFIX=.TRUE., +YCHEM_NL(4)%IGRIBTC=218004, +YCHEM_NL(4)%LQM=.false., +YCHEM_NL(4)%LQM3D=.TRUE., +YCHEM_NL(4)%LCOMAD=.true., +YCHEM_NL(4)%LADV=.TRUE., +YCHEM_NL(4)%LMASSFIX=.TRUE., +YCHEM_NL(4)%BETAMFBC=-999.9, +YCHEM_NL(4)%LASSIM=.FALSE., +YCHEM_NL(5)%CNAME='CO', +YCHEM_NL(5)%NREQIN=1, +YCHEM_NL(5)%RMOLMASS=28.0, +YCHEM_NL(5)%IGRBCODE=210123, +YCHEM_NL(5)%LNEGFIX=.TRUE., +YCHEM_NL(5)%IGRIBTC=210127, +YCHEM_NL(5)%IGRIBDV=221005, +YCHEM_NL(5)%HENRYA=9.7e-4, +YCHEM_NL(5)%HENRYB=1300.0, +YCHEM_NL(5)%LQM=.false., +YCHEM_NL(5)%LQM3D=.TRUE., +YCHEM_NL(5)%LCOMAD=.true., +YCHEM_NL(5)%LADV=.TRUE., +YCHEM_NL(5)%LMASSFIX=.TRUE., +YCHEM_NL(5)%BETAMFBC=-999.9, +YCHEM_NL(5)%LASSIM=.TRUE., +YCHEM_NL(5)%LADV5=.TRUE., +YCHEM_NL(6)%CNAME='HNO3', +YCHEM_NL(6)%NREQIN=1, +YCHEM_NL(6)%RMOLMASS=63.0, +YCHEM_NL(6)%IGRBCODE=217006, +YCHEM_NL(6)%LNEGFIX=.TRUE., +YCHEM_NL(6)%IGRIBTC=218006, +YCHEM_NL(6)%IGRIBDV=221006, +YCHEM_NL(6)%HENRYA=3.2e11, +YCHEM_NL(6)%HENRYB=8700.0, +YCHEM_NL(6)%LQM=.false., +YCHEM_NL(6)%LQM3D=.TRUE., +YCHEM_NL(6)%LCOMAD=.true., +YCHEM_NL(6)%LADV=.TRUE., +YCHEM_NL(6)%LMASSFIX=.TRUE., +YCHEM_NL(6)%BETAMFBC=-999.9, +YCHEM_NL(6)%LASSIM=.FALSE., +YCHEM_NL(7)%CNAME='CH3OOH', +YCHEM_NL(7)%NREQIN=1, +YCHEM_NL(7)%RMOLMASS=48.0, +YCHEM_NL(7)%IGRBCODE=217007, +YCHEM_NL(7)%LNEGFIX=.TRUE., +YCHEM_NL(7)%IGRIBTC=218007, +YCHEM_NL(7)%IGRIBDV=221007, +YCHEM_NL(7)%HENRYA=2.9e2, +YCHEM_NL(7)%HENRYB=5200.0, +YCHEM_NL(7)%LQM=.false., +YCHEM_NL(7)%LQM3D=.TRUE., +YCHEM_NL(7)%LCOMAD=.true., +YCHEM_NL(7)%LADV=.TRUE., +YCHEM_NL(7)%LMASSFIX=.TRUE., +YCHEM_NL(7)%BETAMFBC=-999.9, +YCHEM_NL(7)%LASSIM=.FALSE., +YCHEM_NL(8)%CNAME='CH2O', +YCHEM_NL(8)%NREQIN=1, +YCHEM_NL(8)%RMOLMASS=30.0, +YCHEM_NL(8)%IGRBCODE=210124, +YCHEM_NL(8)%LNEGFIX=.TRUE., +YCHEM_NL(8)%IGRIBTC=210128, +YCHEM_NL(8)%IGRIBDV=221008, +YCHEM_NL(8)%HENRYA=3.2e3, +YCHEM_NL(8)%HENRYB=6800.0, +YCHEM_NL(8)%LQM=.false., +YCHEM_NL(8)%LQM3D=.TRUE., +YCHEM_NL(8)%LCOMAD=.true., +YCHEM_NL(8)%LADV=.TRUE., +YCHEM_NL(8)%LMASSFIX=.TRUE., +YCHEM_NL(8)%BETAMFBC=-999.9, +YCHEM_NL(8)%LASSIM=.TRUE., +YCHEM_NL(8)%LADV5=.TRUE., +YCHEM_NL(9)%CNAME='PAR', +YCHEM_NL(9)%NREQIN=1, +YCHEM_NL(9)%RMOLMASS=12.0, +YCHEM_NL(9)%IGRBCODE=217009, +YCHEM_NL(9)%LNEGFIX=.TRUE., +YCHEM_NL(9)%IGRIBTC=218009, +YCHEM_NL(9)%LQM=.false., +YCHEM_NL(9)%LQM3D=.TRUE., +YCHEM_NL(9)%LCOMAD=.true., +YCHEM_NL(9)%LADV=.TRUE., +YCHEM_NL(9)%LMASSFIX=.TRUE., +YCHEM_NL(9)%BETAMFBC=-999.9, +YCHEM_NL(9)%LASSIM=.FALSE., +YCHEM_NL(10)%CNAME='C2H4', +YCHEM_NL(10)%NREQIN=1, +YCHEM_NL(10)%RMOLMASS=28.0, +YCHEM_NL(10)%IGRBCODE=217010, +YCHEM_NL(10)%LNEGFIX=.TRUE., +YCHEM_NL(10)%IGRIBTC=218010, +YCHEM_NL(10)%LQM=.false., +YCHEM_NL(10)%LQM3D=.TRUE., +YCHEM_NL(10)%LCOMAD=.true., +YCHEM_NL(10)%LADV=.TRUE., +YCHEM_NL(10)%LMASSFIX=.TRUE., +YCHEM_NL(10)%BETAMFBC=-999.9, +YCHEM_NL(10)%LASSIM=.FALSE., +YCHEM_NL(11)%CNAME='OLE', +YCHEM_NL(11)%NREQIN=1, +YCHEM_NL(11)%RMOLMASS=24.0, +YCHEM_NL(11)%IGRBCODE=217011, +YCHEM_NL(11)%LNEGFIX=.TRUE., +YCHEM_NL(11)%IGRIBTC=218011, +YCHEM_NL(11)%LQM=.false., +YCHEM_NL(11)%LQM3D=.TRUE., +YCHEM_NL(11)%LCOMAD=.true., +YCHEM_NL(11)%LADV=.TRUE., +YCHEM_NL(11)%LMASSFIX=.TRUE., +YCHEM_NL(11)%BETAMFBC=-999.9, +YCHEM_NL(11)%LASSIM=.FALSE., +YCHEM_NL(12)%CNAME='ALD2', +YCHEM_NL(12)%NREQIN=1, +YCHEM_NL(12)%RMOLMASS=24.0, +YCHEM_NL(12)%IGRBCODE=217012, +YCHEM_NL(12)%LNEGFIX=.TRUE., +YCHEM_NL(12)%IGRIBTC=218012, +YCHEM_NL(12)%IGRIBDV=221012, +YCHEM_NL(12)%HENRYA=17.0, +YCHEM_NL(12)%HENRYB=5000.0, +YCHEM_NL(12)%LQM=.false., +YCHEM_NL(12)%LQM3D=.TRUE., +YCHEM_NL(12)%LCOMAD=.true., +YCHEM_NL(12)%LADV=.TRUE., +YCHEM_NL(12)%LMASSFIX=.TRUE., +YCHEM_NL(12)%BETAMFBC=-999.9, +YCHEM_NL(12)%LASSIM=.FALSE., +YCHEM_NL(13)%CNAME='PAN', +YCHEM_NL(13)%NREQIN=1, +YCHEM_NL(13)%RMOLMASS=121.0, +YCHEM_NL(13)%IGRBCODE=217013, +YCHEM_NL(13)%LNEGFIX=.TRUE., +YCHEM_NL(13)%IGRIBTC=218013, +YCHEM_NL(13)%IGRIBDV=221013, +YCHEM_NL(13)%HENRYA=2.9e+0, +YCHEM_NL(13)%HENRYB=5700.0, +YCHEM_NL(13)%LQM=.false., +YCHEM_NL(13)%LQM3D=.TRUE., +YCHEM_NL(13)%LCOMAD=.true., +YCHEM_NL(13)%LADV=.TRUE., +YCHEM_NL(13)%LMASSFIX=.TRUE., +YCHEM_NL(13)%BETAMFBC=-999.9, +YCHEM_NL(13)%LASSIM=.FALSE., +YCHEM_NL(14)%CNAME='ROOH', +YCHEM_NL(14)%NREQIN=1, +YCHEM_NL(14)%RMOLMASS=47.0, +YCHEM_NL(14)%IGRBCODE=217014, +YCHEM_NL(14)%LNEGFIX=.TRUE., +YCHEM_NL(14)%IGRIBTC=218014, +YCHEM_NL(14)%IGRIBDV=221014, +YCHEM_NL(14)%HENRYA=340.0, +YCHEM_NL(14)%HENRYB=6000.0, +YCHEM_NL(14)%LQM=.false., +YCHEM_NL(14)%LQM3D=.TRUE., +YCHEM_NL(14)%LCOMAD=.true., +YCHEM_NL(14)%LADV=.TRUE., +YCHEM_NL(14)%LMASSFIX=.TRUE., +YCHEM_NL(14)%BETAMFBC=-999.9, +YCHEM_NL(14)%LASSIM=.FALSE., +YCHEM_NL(15)%CNAME='ONIT', +YCHEM_NL(15)%NREQIN=1, +YCHEM_NL(15)%RMOLMASS=77.0, +YCHEM_NL(15)%IGRBCODE=217015, +YCHEM_NL(15)%LNEGFIX=.TRUE., +YCHEM_NL(15)%IGRIBTC=218015, +YCHEM_NL(15)%IGRIBDV=221015, +YCHEM_NL(15)%HENRYA=1.0e3, +YCHEM_NL(15)%HENRYB=6485., +YCHEM_NL(15)%LQM=.false., +YCHEM_NL(15)%LQM3D=.TRUE., +YCHEM_NL(15)%LCOMAD=.true., +YCHEM_NL(15)%LADV=.TRUE., +YCHEM_NL(15)%LMASSFIX=.TRUE., +YCHEM_NL(15)%BETAMFBC=-999.9, +YCHEM_NL(15)%LASSIM=.FALSE., +YCHEM_NL(16)%CNAME='C5H8', +YCHEM_NL(16)%NREQIN=1, +YCHEM_NL(16)%RMOLMASS=68.1, +YCHEM_NL(16)%IGRBCODE=217016, +YCHEM_NL(16)%LNEGFIX=.TRUE., +YCHEM_NL(16)%IGRIBTC=218016, +YCHEM_NL(16)%IGRIBDV=221016, +YCHEM_NL(16)%HENRYA=1.3e-2, +YCHEM_NL(16)%HENRYB=0.0, +YCHEM_NL(16)%LQM=.false., +YCHEM_NL(16)%LQM3D=.TRUE., +YCHEM_NL(16)%LCOMAD=.true., +YCHEM_NL(16)%LADV=.TRUE., +YCHEM_NL(16)%LMASSFIX=.TRUE., +YCHEM_NL(16)%BETAMFBC=-999.9, +YCHEM_NL(16)%LASSIM=.FALSE., +YCHEM_NL(17)%CNAME='SO2', +YCHEM_NL(17)%NREQIN=1, +YCHEM_NL(17)%RMOLMASS=64.1, +YCHEM_NL(17)%IGRBCODE=210122, +YCHEM_NL(17)%LNEGFIX=.TRUE., +YCHEM_NL(17)%IGRIBTC=210126, +YCHEM_NL(17)%IGRIBDV=221017, +YCHEM_NL(17)%HENRYA=1.0e5, +YCHEM_NL(17)%HENRYB=3000.0, +YCHEM_NL(17)%LQM=.false., +YCHEM_NL(17)%LQM3D=.TRUE., +YCHEM_NL(17)%LCOMAD=.true., +YCHEM_NL(17)%LADV=.TRUE., +YCHEM_NL(17)%LMASSFIX=.TRUE., +YCHEM_NL(17)%BETAMFBC=-999.9, +YCHEM_NL(17)%LASSIM=.TRUE., +YCHEM_NL(17)%LADV5=.TRUE., +YCHEM_NL(18)%CNAME='DMS', +YCHEM_NL(18)%NREQIN=1, +YCHEM_NL(18)%RMOLMASS=62.1, +YCHEM_NL(18)%IGRBCODE=217018, +YCHEM_NL(18)%LNEGFIX=.TRUE., +YCHEM_NL(18)%IGRIBTC=218018, +YCHEM_NL(18)%LQM=.false., +YCHEM_NL(18)%LQM3D=.TRUE., +YCHEM_NL(18)%LCOMAD=.true., +YCHEM_NL(18)%LADV=.TRUE., +YCHEM_NL(18)%LMASSFIX=.TRUE., +YCHEM_NL(18)%BETAMFBC=-999.9, +YCHEM_NL(18)%LASSIM=.FALSE., +YCHEM_NL(19)%CNAME='NH3', +YCHEM_NL(19)%NREQIN=1, +YCHEM_NL(19)%RMOLMASS=17.0, +YCHEM_NL(19)%IGRBCODE=217019, +YCHEM_NL(19)%LNEGFIX=.TRUE., +YCHEM_NL(19)%IGRIBTC=218019, +YCHEM_NL(19)%IGRIBDV=221019, +YCHEM_NL(19)%HENRYA=59.0, +YCHEM_NL(19)%HENRYB=4200.0, +YCHEM_NL(19)%LQM=.false., +YCHEM_NL(19)%LQM3D=.TRUE., +YCHEM_NL(19)%LCOMAD=.true., +YCHEM_NL(19)%LADV=.TRUE., +YCHEM_NL(19)%LMASSFIX=.TRUE., +YCHEM_NL(19)%BETAMFBC=-999.9, +YCHEM_NL(19)%LASSIM=.FALSE., +YCHEM_NL(20)%CNAME='SO4', +YCHEM_NL(20)%NREQIN=-1, +YCHEM_NL(20)%RMOLMASS=96.1, +YCHEM_NL(20)%IGRBCODE=217020, +YCHEM_NL(20)%LNEGFIX=.TRUE., +YCHEM_NL(20)%IGRIBTC=218020, +YCHEM_NL(20)%IGRIBDV=221020, +YCHEM_NL(20)%HENRYA=3.2e11, +YCHEM_NL(20)%HENRYB=8700.0, +YCHEM_NL(20)%LQM=.false., +YCHEM_NL(20)%LQM3D=.TRUE., +YCHEM_NL(20)%LCOMAD=.true., +YCHEM_NL(20)%LADV=.TRUE., +YCHEM_NL(20)%LMASSFIX=.TRUE., +YCHEM_NL(20)%BETAMFBC=-999.9, +YCHEM_NL(20)%LASSIM=.FALSE., +YCHEM_NL(21)%CNAME='NH4', +YCHEM_NL(21)%NREQIN=1, +YCHEM_NL(21)%RMOLMASS=18.0, +YCHEM_NL(21)%IGRBCODE=217021, +YCHEM_NL(21)%LNEGFIX=.TRUE., +YCHEM_NL(21)%IGRIBTC=218021, +YCHEM_NL(21)%IGRIBDV=221021, +YCHEM_NL(21)%HENRYA=3.2e11, +YCHEM_NL(21)%HENRYB=8700.0, +YCHEM_NL(21)%LQM=.false., +YCHEM_NL(21)%LQM3D=.TRUE., +YCHEM_NL(21)%LCOMAD=.true., +YCHEM_NL(21)%LADV=.TRUE., +YCHEM_NL(21)%LMASSFIX=.TRUE., +YCHEM_NL(21)%BETAMFBC=-999.9, +YCHEM_NL(21)%LASSIM=.FALSE., +YCHEM_NL(22)%CNAME='MSA', +YCHEM_NL(22)%NREQIN=1, +YCHEM_NL(22)%RMOLMASS=96.1, +YCHEM_NL(22)%IGRBCODE=217022, +YCHEM_NL(22)%LNEGFIX=.TRUE., +YCHEM_NL(22)%IGRIBTC=218022, +YCHEM_NL(22)%HENRYA=3.2e11, +YCHEM_NL(22)%HENRYB=8700.0, +YCHEM_NL(22)%LQM=.false., +YCHEM_NL(22)%LQM3D=.TRUE., +YCHEM_NL(22)%LCOMAD=.true., +YCHEM_NL(22)%LADV=.TRUE., +YCHEM_NL(22)%LMASSFIX=.TRUE., +YCHEM_NL(22)%BETAMFBC=-999.9, +YCHEM_NL(22)%LASSIM=.FALSE., +YCHEM_NL(23)%CNAME='CH3COCHO', +YCHEM_NL(23)%NREQIN=1, +YCHEM_NL(23)%RMOLMASS=72.1, +YCHEM_NL(23)%IGRBCODE=217023, +YCHEM_NL(23)%LNEGFIX=.TRUE., +YCHEM_NL(23)%IGRIBTC=218023, +YCHEM_NL(23)%IGRIBDV=221023, +YCHEM_NL(23)%HENRYA=3.4e3, +YCHEM_NL(23)%HENRYB=7500.0, +YCHEM_NL(23)%LQM=.false., +YCHEM_NL(23)%LQM3D=.TRUE., +YCHEM_NL(23)%LCOMAD=.true., +YCHEM_NL(23)%LADV=.TRUE., +YCHEM_NL(23)%LMASSFIX=.TRUE., +YCHEM_NL(23)%BETAMFBC=-999.9, +YCHEM_NL(23)%LASSIM=.FALSE., +YCHEM_NL(24)%CNAME='O3S', +YCHEM_NL(24)%NREQIN=1, +YCHEM_NL(24)%RMOLMASS=48.0, +YCHEM_NL(24)%IGRBCODE=217024, +YCHEM_NL(24)%LNEGFIX=.TRUE., +YCHEM_NL(24)%IGRIBTC=218024, +YCHEM_NL(24)%IGRIBDV=221024, +YCHEM_NL(24)%HENRYA=1.0e-2, +YCHEM_NL(24)%HENRYB=2800.0, +YCHEM_NL(24)%LQM=.false., +YCHEM_NL(24)%LQM3D=.TRUE., +YCHEM_NL(24)%LCOMAD=.true., +YCHEM_NL(24)%LADV=.TRUE., +YCHEM_NL(24)%LMASSFIX=.TRUE., +YCHEM_NL(24)%BETAMFBC=-999.9, +YCHEM_NL(24)%LASSIM=.FALSE., +YCHEM_NL(25)%CNAME='Rn', +YCHEM_NL(25)%NREQIN=1, +YCHEM_NL(25)%RMOLMASS=222.0, +YCHEM_NL(25)%IGRBCODE=210181, +YCHEM_NL(25)%LNEGFIX=.TRUE., +YCHEM_NL(25)%IGRIBTC=210183, +YCHEM_NL(25)%LQM=.false., +YCHEM_NL(25)%LQM3D=.TRUE., +YCHEM_NL(25)%LCOMAD=.true., +YCHEM_NL(25)%LADV=.TRUE., +YCHEM_NL(25)%LMASSFIX=.TRUE., +YCHEM_NL(25)%BETAMFBC=-999.9, +YCHEM_NL(25)%LASSIM=.FALSE., +YCHEM_NL(26)%CNAME='Pb', +YCHEM_NL(26)%NREQIN=1, +YCHEM_NL(26)%RMOLMASS=210.0, +YCHEM_NL(26)%IGRBCODE=217026, +YCHEM_NL(26)%LNEGFIX=.TRUE., +YCHEM_NL(26)%IGRIBTC=218026, +YCHEM_NL(26)%HENRYA=3.2e11, +YCHEM_NL(26)%HENRYB=8700.0, +YCHEM_NL(26)%LQM=.false., +YCHEM_NL(26)%LQM3D=.TRUE., +YCHEM_NL(26)%LCOMAD=.true., +YCHEM_NL(26)%LADV=.TRUE., +YCHEM_NL(26)%LMASSFIX=.TRUE., +YCHEM_NL(26)%BETAMFBC=-999.9, +YCHEM_NL(26)%LASSIM=.FALSE., +YCHEM_NL(27)%CNAME='NO', +YCHEM_NL(27)%NREQIN=1, +YCHEM_NL(27)%RMOLMASS=30.0, +YCHEM_NL(27)%IGRBCODE=217027, +YCHEM_NL(27)%LNEGFIX=.TRUE., +YCHEM_NL(27)%IGRIBTC=218027, +YCHEM_NL(27)%IGRIBDV=221027, +YCHEM_NL(27)%HENRYA=1.9e-3, +YCHEM_NL(27)%HENRYB=1600.0, +YCHEM_NL(27)%LQM=.false., +YCHEM_NL(27)%LQM3D=.TRUE., +YCHEM_NL(27)%LCOMAD=.true., +YCHEM_NL(27)%LADV=.TRUE., +YCHEM_NL(27)%LMASSFIX=.FALSE., +YCHEM_NL(27)%LASSIM=.FALSE., +YCHEM_NL(27)%LADV5=.TRUE., +YCHEM_NL(28)%CNAME='HO2', +YCHEM_NL(28)%NREQIN=1, +YCHEM_NL(28)%RMOLMASS=33.0, +YCHEM_NL(28)%IGRBCODE=217028, +YCHEM_NL(28)%LNEGFIX=.TRUE., +YCHEM_NL(28)%IGRIBTC=218028, +YCHEM_NL(28)%IGRIBDV=221028, +YCHEM_NL(28)%HENRYA=6.8e2, +YCHEM_NL(28)%HENRYB=0.0, +YCHEM_NL(28)%LQM=.false., +YCHEM_NL(28)%LQM3D=.TRUE., +YCHEM_NL(28)%LCOMAD=.true., +YCHEM_NL(28)%LADV=.FALSE., +YCHEM_NL(28)%LMASSFIX=.FALSE., +YCHEM_NL(28)%LMASSFIX=.FALSE., +YCHEM_NL(28)%LASSIM=.FALSE., +YCHEM_NL(29)%CNAME='CH3O2', +YCHEM_NL(29)%NREQIN=1, +YCHEM_NL(29)%RMOLMASS=47.0, +YCHEM_NL(29)%IGRBCODE=217029, +YCHEM_NL(29)%LNEGFIX=.TRUE., +YCHEM_NL(29)%IGRIBTC=218029, +YCHEM_NL(29)%IGRIBDV=221029, +YCHEM_NL(29)%HENRYA=1.5e1, +YCHEM_NL(29)%HENRYB=3700.0, +YCHEM_NL(29)%LQM=.false., +YCHEM_NL(29)%LQM3D=.TRUE., +YCHEM_NL(29)%LCOMAD=.true., +YCHEM_NL(29)%LADV=.FALSE., +YCHEM_NL(29)%LMASSFIX=.FALSE., +YCHEM_NL(29)%LMASSFIX=.FALSE., +YCHEM_NL(29)%LASSIM=.FALSE., +YCHEM_NL(30)%CNAME='OH', +YCHEM_NL(30)%NREQIN=1, +YCHEM_NL(30)%RMOLMASS=17.0, +YCHEM_NL(30)%IGRBCODE=217030, +YCHEM_NL(30)%LNEGFIX=.TRUE., +YCHEM_NL(30)%IGRIBTC=218030, +YCHEM_NL(30)%LQM=.false., +YCHEM_NL(30)%LQM3D=.TRUE., +YCHEM_NL(30)%LCOMAD=.true., +YCHEM_NL(30)%LADV=.FALSE., +YCHEM_NL(30)%LMASSFIX=.FALSE., +YCHEM_NL(30)%LMASSFIX=.FALSE., +YCHEM_NL(30)%LASSIM=.FALSE., +YCHEM_NL(30)%LADV5=.TRUE., +YCHEM_NL(31)%CNAME='NO2', +YCHEM_NL(31)%NREQIN=1, +YCHEM_NL(31)%RMOLMASS=46.0, +YCHEM_NL(31)%IGRBCODE=210121, +YCHEM_NL(31)%LNEGFIX=.TRUE., +YCHEM_NL(31)%IGRIBTC=210125, +YCHEM_NL(31)%IGRIBDV=221031, +YCHEM_NL(31)%HENRYA=1.2e-2, +YCHEM_NL(31)%HENRYB=2400.0, +YCHEM_NL(31)%LQM=.false., +YCHEM_NL(31)%LQM3D=.TRUE., +YCHEM_NL(31)%LCOMAD=.true., +YCHEM_NL(31)%LADV=.TRUE., +YCHEM_NL(31)%LMASSFIX=.FALSE., +YCHEM_NL(31)%LASSIM=.TRUE., +YCHEM_NL(31)%LADV5=.TRUE., +YCHEM_NL(32)%CNAME='NO3', +YCHEM_NL(32)%NREQIN=1, +YCHEM_NL(32)%RMOLMASS=62.0, +YCHEM_NL(32)%IGRBCODE=217032, +YCHEM_NL(32)%LNEGFIX=.TRUE., +YCHEM_NL(32)%IGRIBTC=218032, +YCHEM_NL(32)%IGRIBDV=221032, +YCHEM_NL(32)%HENRYA=3.8e-2, +YCHEM_NL(32)%HENRYB=0., +YCHEM_NL(32)%LQM=.false., +YCHEM_NL(32)%LQM3D=.TRUE., +YCHEM_NL(32)%LCOMAD=.true., +YCHEM_NL(32)%LADV=.TRUE., +YCHEM_NL(32)%LMASSFIX=.FALSE., +YCHEM_NL(32)%LASSIM=.FALSE., +YCHEM_NL(33)%CNAME='N2O5', +YCHEM_NL(33)%NREQIN=1, +YCHEM_NL(33)%RMOLMASS=108.0, +YCHEM_NL(33)%IGRBCODE=217033, +YCHEM_NL(33)%LNEGFIX=.TRUE., +YCHEM_NL(33)%IGRIBTC=218033, +YCHEM_NL(33)%IGRIBDV=221033, +YCHEM_NL(33)%HENRYA=2.1e+1, +YCHEM_NL(33)%HENRYB=3400.0, +YCHEM_NL(33)%LQM=.false., +YCHEM_NL(33)%LQM3D=.TRUE., +YCHEM_NL(33)%LCOMAD=.true., +YCHEM_NL(33)%LADV=.TRUE., +YCHEM_NL(33)%LMASSFIX=.TRUE., +YCHEM_NL(33)%BETAMFBC=-999.9, +YCHEM_NL(33)%LASSIM=.FALSE., +YCHEM_NL(34)%CNAME='HO2NO2', +YCHEM_NL(34)%NREQIN=1, +YCHEM_NL(34)%RMOLMASS=79.0, +YCHEM_NL(34)%IGRBCODE=217034, +YCHEM_NL(34)%LNEGFIX=.TRUE., +YCHEM_NL(34)%IGRIBTC=218034, +YCHEM_NL(34)%IGRIBDV=221034, +YCHEM_NL(34)%HENRYA=1.2e+4, +YCHEM_NL(34)%HENRYB=6900.0, +YCHEM_NL(34)%LQM=.false., +YCHEM_NL(34)%LQM3D=.TRUE., +YCHEM_NL(34)%LCOMAD=.true., +YCHEM_NL(34)%LADV=.TRUE., +YCHEM_NL(34)%LMASSFIX=.TRUE., +YCHEM_NL(34)%BETAMFBC=-999.9, +YCHEM_NL(34)%LASSIM=.FALSE., +YCHEM_NL(35)%CNAME='C2O3', +YCHEM_NL(35)%NREQIN=1, +YCHEM_NL(35)%RMOLMASS=75.0, +YCHEM_NL(35)%IGRBCODE=217035, +YCHEM_NL(35)%LNEGFIX=.TRUE., +YCHEM_NL(35)%IGRIBTC=218035, +YCHEM_NL(35)%LQM=.false., +YCHEM_NL(35)%LQM3D=.TRUE., +YCHEM_NL(35)%LCOMAD=.true., +YCHEM_NL(35)%LADV=.FALSE., +YCHEM_NL(35)%LMASSFIX=.FALSE., +YCHEM_NL(35)%LMASSFIX=.FALSE., +YCHEM_NL(35)%LASSIM=.FALSE., +YCHEM_NL(36)%CNAME='ROR', +YCHEM_NL(36)%NREQIN=1, +YCHEM_NL(36)%RMOLMASS=28.0, +YCHEM_NL(36)%IGRBCODE=217036, +YCHEM_NL(36)%LNEGFIX=.TRUE., +YCHEM_NL(36)%IGRIBTC=218036, +YCHEM_NL(36)%LQM=.false., +YCHEM_NL(36)%LQM3D=.TRUE., +YCHEM_NL(36)%LCOMAD=.true., +YCHEM_NL(36)%LADV=.FALSE., +YCHEM_NL(36)%LMASSFIX=.FALSE., +YCHEM_NL(36)%LMASSFIX=.FALSE., +YCHEM_NL(36)%LASSIM=.FALSE., +YCHEM_NL(37)%CNAME='RXPAR', +YCHEM_NL(37)%NREQIN=1, +YCHEM_NL(37)%RMOLMASS=12.0, +YCHEM_NL(37)%IGRBCODE=217037, +YCHEM_NL(37)%LNEGFIX=.TRUE., +YCHEM_NL(37)%IGRIBTC=218037, +YCHEM_NL(37)%LQM=.false., +YCHEM_NL(37)%LQM3D=.TRUE., +YCHEM_NL(37)%LCOMAD=.true., +YCHEM_NL(37)%LADV=.FALSE., +YCHEM_NL(37)%LMASSFIX=.FALSE., +YCHEM_NL(37)%LMASSFIX=.FALSE., +YCHEM_NL(37)%LASSIM=.FALSE., +YCHEM_NL(38)%CNAME='XO2', +YCHEM_NL(38)%NREQIN=1, +YCHEM_NL(38)%RMOLMASS=44.0, +YCHEM_NL(38)%IGRBCODE=217038, +YCHEM_NL(38)%LNEGFIX=.TRUE., +YCHEM_NL(38)%IGRIBTC=218038, +YCHEM_NL(38)%LQM=.false., +YCHEM_NL(38)%LQM3D=.TRUE., +YCHEM_NL(38)%LCOMAD=.true., +YCHEM_NL(38)%LADV=.FALSE., +YCHEM_NL(38)%LMASSFIX=.FALSE., +YCHEM_NL(38)%LMASSFIX=.FALSE., +YCHEM_NL(38)%LASSIM=.FALSE., +YCHEM_NL(39)%CNAME='XO2N', +YCHEM_NL(39)%NREQIN=1, +YCHEM_NL(39)%RMOLMASS=44.0, +YCHEM_NL(39)%IGRBCODE=217039, +YCHEM_NL(39)%LNEGFIX=.TRUE., +YCHEM_NL(39)%IGRIBTC=218039, +YCHEM_NL(39)%LQM=.false., +YCHEM_NL(39)%LQM3D=.TRUE., +YCHEM_NL(39)%LCOMAD=.true., +YCHEM_NL(39)%LADV=.FALSE., +YCHEM_NL(39)%LMASSFIX=.FALSE., +YCHEM_NL(39)%LMASSFIX=.FALSE., +YCHEM_NL(39)%LASSIM=.FALSE., +YCHEM_NL(40)%CNAME='NH2', +YCHEM_NL(40)%NREQIN=1, +YCHEM_NL(40)%RMOLMASS=16.0, +YCHEM_NL(40)%IGRBCODE=217040, +YCHEM_NL(40)%LNEGFIX=.TRUE., +YCHEM_NL(40)%IGRIBTC=218040, +YCHEM_NL(40)%LQM=.false., +YCHEM_NL(40)%LQM3D=.TRUE., +YCHEM_NL(40)%LCOMAD=.true., +YCHEM_NL(40)%LADV=.FALSE., +YCHEM_NL(40)%LMASSFIX=.FALSE., +YCHEM_NL(40)%LMASSFIX=.FALSE., +YCHEM_NL(40)%LASSIM=.FALSE., +YCHEM_NL(41)%CNAME='PSC', +YCHEM_NL(41)%NREQIN=0, +YCHEM_NL(41)%RMOLMASS=1.0, +YCHEM_NL(41)%IGRBCODE=217041, +YCHEM_NL(41)%LNEGFIX=.TRUE., +YCHEM_NL(41)%IGRIBTC=218041, +YCHEM_NL(41)%LQM=.false., +YCHEM_NL(41)%LQM3D=.TRUE., +YCHEM_NL(41)%LCOMAD=.true., +YCHEM_NL(41)%LADV=.TRUE., +YCHEM_NL(41)%LMASSFIX=.FALSE., +YCHEM_NL(41)%REFVALI=0.0, +YCHEM_NL(41)%NREQIN=-1, +YCHEM_NL(41)%LASSIM=.FALSE., +YCHEM_NL(42)%CNAME='CH3OH', +YCHEM_NL(42)%NREQIN=1, +YCHEM_NL(42)%RMOLMASS=31.01, +YCHEM_NL(42)%IGRBCODE=217042, +YCHEM_NL(42)%LNEGFIX=.TRUE., +YCHEM_NL(42)%IGRIBTC=218042, +YCHEM_NL(42)%IGRIBDV=221042, +YCHEM_NL(42)%HENRYA=200.0, +YCHEM_NL(42)%HENRYB=5600.0, +YCHEM_NL(42)%LQM=.false., +YCHEM_NL(42)%LQM3D=.TRUE., +YCHEM_NL(42)%LCOMAD=.true., +YCHEM_NL(42)%LADV=.TRUE., +YCHEM_NL(42)%LMASSFIX=.TRUE., +YCHEM_NL(42)%BETAMFBC=-999.9, +YCHEM_NL(42)%LASSIM=.FALSE., +YCHEM_NL(43)%CNAME='HCOOH', +YCHEM_NL(43)%NREQIN=1, +YCHEM_NL(43)%RMOLMASS=46.01, +YCHEM_NL(43)%IGRBCODE=217043, +YCHEM_NL(43)%LNEGFIX=.TRUE., +YCHEM_NL(43)%IGRIBTC=218043, +YCHEM_NL(43)%IGRIBDV=221043, +YCHEM_NL(43)%HENRYA=8.8e3, +YCHEM_NL(43)%HENRYB=6100.0, +YCHEM_NL(43)%LQM=.false., +YCHEM_NL(43)%LQM3D=.TRUE., +YCHEM_NL(43)%LCOMAD=.true., +YCHEM_NL(43)%LADV=.TRUE., +YCHEM_NL(43)%LMASSFIX=.TRUE., +YCHEM_NL(43)%BETAMFBC=-999.9, +YCHEM_NL(43)%LASSIM=.FALSE., +YCHEM_NL(44)%CNAME='MCOOH', +YCHEM_NL(44)%NREQIN=1, +YCHEM_NL(44)%RMOLMASS=62.02, +YCHEM_NL(44)%IGRBCODE=217044, +YCHEM_NL(44)%LNEGFIX=.TRUE., +YCHEM_NL(44)%IGRIBTC=218044, +YCHEM_NL(44)%IGRIBDV=221044, +YCHEM_NL(44)%HENRYA=4.1e3, +YCHEM_NL(44)%HENRYB=6300.0, +YCHEM_NL(44)%LQM=.false., +YCHEM_NL(44)%LQM3D=.TRUE., +YCHEM_NL(44)%LCOMAD=.true., +YCHEM_NL(44)%LADV=.TRUE., +YCHEM_NL(44)%LMASSFIX=.TRUE., +YCHEM_NL(44)%BETAMFBC=-999.9, +YCHEM_NL(44)%LASSIM=.FALSE., +YCHEM_NL(45)%CNAME='C2H6', +YCHEM_NL(45)%NREQIN=1, +YCHEM_NL(45)%RMOLMASS=30.02, +YCHEM_NL(45)%IGRBCODE=217045, +YCHEM_NL(45)%LNEGFIX=.TRUE., +YCHEM_NL(45)%IGRIBTC=218045, +YCHEM_NL(45)%IGRIBDV=221045, +YCHEM_NL(45)%HENRYA=1.9e-3, +YCHEM_NL(45)%HENRYB=2400.0, +YCHEM_NL(45)%LQM=.false., +YCHEM_NL(45)%LQM3D=.TRUE., +YCHEM_NL(45)%LCOMAD=.true., +YCHEM_NL(45)%LADV=.TRUE., +YCHEM_NL(45)%LMASSFIX=.TRUE., +YCHEM_NL(45)%BETAMFBC=-999.9, +YCHEM_NL(45)%LASSIM=.FALSE., +YCHEM_NL(46)%CNAME='C2H5OH', +YCHEM_NL(46)%NREQIN=1, +YCHEM_NL(46)%RMOLMASS=46.02, +YCHEM_NL(46)%IGRBCODE=217046, +YCHEM_NL(46)%LNEGFIX=.TRUE., +YCHEM_NL(46)%IGRIBTC=218046, +YCHEM_NL(46)%IGRIBDV=221046, +YCHEM_NL(46)%HENRYA=190.0, +YCHEM_NL(46)%HENRYB=6400.0, +YCHEM_NL(46)%LQM=.false., +YCHEM_NL(46)%LQM3D=.TRUE., +YCHEM_NL(46)%LCOMAD=.true., +YCHEM_NL(46)%LADV=.TRUE., +YCHEM_NL(46)%LMASSFIX=.TRUE., +YCHEM_NL(46)%BETAMFBC=-999.9, +YCHEM_NL(46)%LASSIM=.FALSE., +YCHEM_NL(47)%CNAME='C3H8', +YCHEM_NL(47)%NREQIN=1, +YCHEM_NL(47)%RMOLMASS=44.03, +YCHEM_NL(47)%IGRBCODE=217047, +YCHEM_NL(47)%LNEGFIX=.TRUE., +YCHEM_NL(47)%IGRIBTC=218047, +YCHEM_NL(47)%LQM=.false., +YCHEM_NL(47)%LQM3D=.TRUE., +YCHEM_NL(47)%LCOMAD=.true., +YCHEM_NL(47)%LADV=.TRUE., +YCHEM_NL(47)%LMASSFIX=.TRUE., +YCHEM_NL(47)%BETAMFBC=-999.9, +YCHEM_NL(47)%LASSIM=.FALSE., +YCHEM_NL(48)%CNAME='C3H6', +YCHEM_NL(48)%NREQIN=1, +YCHEM_NL(48)%RMOLMASS=42.03, +YCHEM_NL(48)%IGRBCODE=217048, +YCHEM_NL(48)%LNEGFIX=.TRUE., +YCHEM_NL(48)%IGRIBTC=218048, +YCHEM_NL(48)%LQM=.false., +YCHEM_NL(48)%LQM3D=.TRUE., +YCHEM_NL(48)%LCOMAD=.true., +YCHEM_NL(48)%LADV=.TRUE., +YCHEM_NL(48)%LMASSFIX=.TRUE., +YCHEM_NL(48)%BETAMFBC=-999.9, +YCHEM_NL(48)%LASSIM=.FALSE., +YCHEM_NL(49)%CNAME='C10H16', +YCHEM_NL(49)%NREQIN=1, +YCHEM_NL(49)%RMOLMASS=136.0, +YCHEM_NL(49)%IGRBCODE=217049, +YCHEM_NL(49)%LNEGFIX=.TRUE., +YCHEM_NL(49)%IGRIBTC=218049, +YCHEM_NL(49)%LQM=.false., +YCHEM_NL(49)%LQM3D=.TRUE., +YCHEM_NL(49)%LCOMAD=.true., +YCHEM_NL(49)%LADV=.TRUE., +YCHEM_NL(49)%LMASSFIX=.TRUE., +YCHEM_NL(49)%BETAMFBC=-999.9, +YCHEM_NL(49)%LASSIM=.FALSE., +YCHEM_NL(50)%CNAME='ISPD', +YCHEM_NL(50)%NREQIN=1, +YCHEM_NL(50)%RMOLMASS=70.0, +YCHEM_NL(50)%IGRBCODE=217050, +YCHEM_NL(50)%LNEGFIX=.TRUE., +YCHEM_NL(50)%IGRIBTC=218050, +YCHEM_NL(50)%IGRIBDV=221050, +YCHEM_NL(50)%HENRYA=4.3, +YCHEM_NL(50)%HENRYB=5300.0, +YCHEM_NL(50)%LQM=.false., +YCHEM_NL(50)%LQM3D=.TRUE., +YCHEM_NL(50)%LCOMAD=.true., +YCHEM_NL(50)%LADV=.TRUE., +YCHEM_NL(50)%LMASSFIX=.TRUE., +YCHEM_NL(50)%BETAMFBC=-999.9, +YCHEM_NL(50)%LASSIM=.FALSE., +YCHEM_NL(51)%CNAME='NO3_A', +YCHEM_NL(51)%NREQIN=1, +YCHEM_NL(51)%RMOLMASS=62.0, +YCHEM_NL(51)%IGRBCODE=217051, +YCHEM_NL(51)%LNEGFIX=.TRUE., +YCHEM_NL(51)%IGRIBTC=218051, +YCHEM_NL(51)%IGRIBDV=221051, +YCHEM_NL(51)%HENRYA=3.2e11, +YCHEM_NL(51)%HENRYB=8700.0, +YCHEM_NL(51)%LQM=.false., +YCHEM_NL(51)%LQM3D=.TRUE., +YCHEM_NL(51)%LCOMAD=.true., +YCHEM_NL(51)%LADV=.TRUE., +YCHEM_NL(51)%LMASSFIX=.TRUE., +YCHEM_NL(51)%BETAMFBC=-999.9, +YCHEM_NL(51)%LASSIM=.FALSE., +YCHEM_NL(52)%CNAME='CH3COCH3', +YCHEM_NL(52)%NREQIN=1, +YCHEM_NL(52)%RMOLMASS=58.0, +YCHEM_NL(52)%IGRBCODE=217052, +YCHEM_NL(52)%LNEGFIX=.TRUE., +YCHEM_NL(52)%IGRIBTC=218052, +YCHEM_NL(52)%IGRIBDV=221052, +YCHEM_NL(52)%HENRYA=27.0, +YCHEM_NL(52)%HENRYB=5500.0, +YCHEM_NL(52)%LQM=.false., +YCHEM_NL(52)%LQM3D=.TRUE., +YCHEM_NL(52)%LCOMAD=.true., +YCHEM_NL(52)%LADV=.TRUE., +YCHEM_NL(52)%LMASSFIX=.TRUE., +YCHEM_NL(52)%BETAMFBC=-999.9, +YCHEM_NL(52)%LASSIM=.FALSE., +YCHEM_NL(53)%CNAME='ACO2', +YCHEM_NL(53)%NREQIN=1, +YCHEM_NL(53)%RMOLMASS=58.0, +YCHEM_NL(53)%IGRBCODE=217053, +YCHEM_NL(53)%LNEGFIX=.TRUE., +YCHEM_NL(53)%IGRIBTC=218053, +YCHEM_NL(53)%LQM=.false., +YCHEM_NL(53)%LQM3D=.TRUE., +YCHEM_NL(53)%LCOMAD=.true., +YCHEM_NL(53)%LADV=.FALSE., +YCHEM_NL(53)%LMASSFIX=.FALSE., +YCHEM_NL(53)%LMASSFIX=.FALSE., +YCHEM_NL(53)%LASSIM=.FALSE., +YCHEM_NL(54)%CNAME='IC3H7O2', +YCHEM_NL(54)%NREQIN=1, +YCHEM_NL(54)%RMOLMASS=75.0, +YCHEM_NL(54)%IGRBCODE=217054, +YCHEM_NL(54)%LNEGFIX=.TRUE., +YCHEM_NL(54)%IGRIBTC=218054, +YCHEM_NL(54)%LQM=.false., +YCHEM_NL(54)%LQM3D=.TRUE., +YCHEM_NL(54)%LCOMAD=.true., +YCHEM_NL(54)%LADV=.FALSE., +YCHEM_NL(54)%LMASSFIX=.FALSE., +YCHEM_NL(54)%LMASSFIX=.FALSE., +YCHEM_NL(54)%LASSIM=.FALSE., +YCHEM_NL(55)%CNAME='HYPROPO2', +YCHEM_NL(55)%NREQIN=1, +YCHEM_NL(55)%RMOLMASS=91.0, +YCHEM_NL(55)%IGRBCODE=217055, +YCHEM_NL(55)%LNEGFIX=.TRUE., +YCHEM_NL(55)%IGRIBTC=218055, +YCHEM_NL(55)%LQM=.false., +YCHEM_NL(55)%LQM3D=.TRUE., +YCHEM_NL(55)%LCOMAD=.true., +YCHEM_NL(55)%LADV=.FALSE., +YCHEM_NL(55)%LMASSFIX=.FALSE., +YCHEM_NL(55)%LMASSFIX=.FALSE., +YCHEM_NL(55)%LASSIM=.FALSE., +YCHEM_NL(56)%CNAME='SO3', +YCHEM_NL(56)%NREQIN=1, +YCHEM_NL(56)%RMOLMASS=80.0, +YCHEM_NL(56)%IGRBCODE=217189, +YCHEM_NL(56)%LNEGFIX=.TRUE., +YCHEM_NL(56)%IGRIBTC=218189, +YCHEM_NL(56)%LQM=.false., +YCHEM_NL(56)%LQM3D=.TRUE., +YCHEM_NL(56)%LCOMAD=.true., +YCHEM_NL(56)%LADV=.TRUE., +YCHEM_NL(56)%LMASSFIX=.TRUE., +YCHEM_NL(56)%BETAMFBC=-999.9, +YCHEM_NL(56)%LASSIM=.FALSE., +YCHEM_NL(57)%CNAME='CH3O2NO2', +YCHEM_NL(57)%NREQIN=1, +YCHEM_NL(57)%RMOLMASS=93.0, +YCHEM_NL(57)%IGRBCODE=217225, +YCHEM_NL(57)%LNEGFIX=.TRUE., +YCHEM_NL(57)%IGRIBTC=218225, +YCHEM_NL(57)%LQM=.false., +YCHEM_NL(57)%LQM3D=.TRUE., +YCHEM_NL(57)%LCOMAD=.true., +YCHEM_NL(57)%LADV=.TRUE., +YCHEM_NL(57)%LMASSFIX=.TRUE., +YCHEM_NL(57)%BETAMFBC=-999.9, +YCHEM_NL(57)%LASSIM=.FALSE., +YCHEM_NL(58)%CNAME='HONO', +YCHEM_NL(58)%NREQIN=1, +YCHEM_NL(58)%RMOLMASS=47.0, +YCHEM_NL(58)%IGRBCODE=217086, +YCHEM_NL(58)%LNEGFIX=.TRUE., +YCHEM_NL(58)%IGRIBTC=218086, +YCHEM_NL(58)%IGRIBDV=221086, +YCHEM_NL(58)%HENRYA=4.8e+1, +YCHEM_NL(58)%HENRYB=4800.0, +YCHEM_NL(58)%LQM=.false., +YCHEM_NL(58)%LQM3D=.TRUE., +YCHEM_NL(58)%LCOMAD=.true., +YCHEM_NL(58)%LADV=.TRUE., +YCHEM_NL(58)%LMASSFIX=.TRUE., +YCHEM_NL(58)%BETAMFBC=-999.9, +YCHEM_NL(58)%LASSIM=.FALSE., +YCHEM_NL(59)%CNAME='HCN', +YCHEM_NL(59)%NREQIN=1, +YCHEM_NL(59)%RMOLMASS=27.0, +YCHEM_NL(59)%IGRBCODE=217226, +YCHEM_NL(59)%LNEGFIX=.TRUE., +YCHEM_NL(59)%IGRIBTC=218226, +YCHEM_NL(59)%IGRIBDV=221226, +YCHEM_NL(59)%HENRYA=12, +YCHEM_NL(59)%HENRYB=5000., +YCHEM_NL(59)%LQM=.false., +YCHEM_NL(59)%LQM3D=.TRUE., +YCHEM_NL(59)%LCOMAD=.true., +YCHEM_NL(59)%LADV=.TRUE., +YCHEM_NL(59)%LMASSFIX=.TRUE., +YCHEM_NL(59)%BETAMFBC=-999.9, +YCHEM_NL(59)%LASSIM=.FALSE., +YCHEM_NL(60)%CNAME='CH3CN', +YCHEM_NL(60)%NREQIN=1, +YCHEM_NL(60)%RMOLMASS=41.0, +YCHEM_NL(60)%IGRBCODE=217224, +YCHEM_NL(60)%LNEGFIX=.TRUE., +YCHEM_NL(60)%IGRIBTC=218224, +YCHEM_NL(60)%IGRIBDV=221224, +YCHEM_NL(60)%HENRYA=49, +YCHEM_NL(60)%HENRYB=4000., +YCHEM_NL(60)%LQM=.false., +YCHEM_NL(60)%LQM3D=.TRUE., +YCHEM_NL(60)%LCOMAD=.true., +YCHEM_NL(60)%LADV=.TRUE., +YCHEM_NL(60)%LMASSFIX=.TRUE., +YCHEM_NL(60)%BETAMFBC=-999.9, +YCHEM_NL(60)%LASSIM=.FALSE., +YCHEM_NL(61)%CNAME='XYL', +YCHEM_NL(61)%NREQIN=1, +YCHEM_NL(61)%RMOLMASS=106.0, +YCHEM_NL(61)%IGRBCODE=217100, +YCHEM_NL(61)%LNEGFIX=.TRUE., +YCHEM_NL(61)%IGRIBTC=218100, +YCHEM_NL(61)%IGRIBDV=221100, +YCHEM_NL(61)%HENRYA=0.14, +YCHEM_NL(61)%HENRYB=4200.0, +YCHEM_NL(61)%LQM=.false., +YCHEM_NL(61)%LQM3D=.TRUE., +YCHEM_NL(61)%LCOMAD=.true., +YCHEM_NL(61)%LADV=.TRUE., +YCHEM_NL(61)%LMASSFIX=.TRUE., +YCHEM_NL(61)%BETAMFBC=-999.9, +YCHEM_NL(61)%LASSIM=.FALSE., +YCHEM_NL(62)%CNAME='TOL', +YCHEM_NL(62)%NREQIN=1, +YCHEM_NL(62)%RMOLMASS=92.0, +YCHEM_NL(62)%IGRBCODE=217099, +YCHEM_NL(62)%LNEGFIX=.TRUE., +YCHEM_NL(62)%IGRIBTC=218099, +YCHEM_NL(62)%IGRIBDV=221099, +YCHEM_NL(62)%HENRYA=0.15, +YCHEM_NL(62)%HENRYB=4300.0, +YCHEM_NL(62)%LQM=.false., +YCHEM_NL(62)%LQM3D=.TRUE., +YCHEM_NL(62)%LCOMAD=.true., +YCHEM_NL(62)%LADV=.TRUE., +YCHEM_NL(62)%LMASSFIX=.TRUE., +YCHEM_NL(62)%BETAMFBC=-999.9, +YCHEM_NL(62)%LASSIM=.FALSE., +YCHEM_NL(63)%CNAME='AROO2', +YCHEM_NL(63)%NREQIN=1, +YCHEM_NL(63)%RMOLMASS=124.0, +YCHEM_NL(63)%IGRBCODE=217222, +YCHEM_NL(63)%LNEGFIX=.TRUE., +YCHEM_NL(63)%IGRIBTC=218222, +YCHEM_NL(63)%LQM=.false., +YCHEM_NL(63)%LQM3D=.TRUE., +YCHEM_NL(63)%LCOMAD=.true., +YCHEM_NL(63)%LADV=.FALSE., +YCHEM_NL(63)%LMASSFIX=.FALSE., +YCHEM_NL(63)%LMASSFIX=.FALSE., +YCHEM_NL(63)%LASSIM=.FALSE., +YCHEM_NL(64)%CNAME='HPALD1', +YCHEM_NL(64)%NREQIN=1, +YCHEM_NL(64)%RMOLMASS=148.0, +YCHEM_NL(64)%IGRBCODE=217227, +YCHEM_NL(64)%LNEGFIX=.TRUE., +YCHEM_NL(64)%IGRIBTC=218227, +YCHEM_NL(64)%HENRYA=17.0, +YCHEM_NL(64)%HENRYB=5000.0, +YCHEM_NL(64)%LQM=.false., +YCHEM_NL(64)%LQM3D=.TRUE., +YCHEM_NL(64)%LCOMAD=.true., +YCHEM_NL(64)%LADV=.TRUE., +YCHEM_NL(64)%LMASSFIX=.TRUE., +YCHEM_NL(64)%BETAMFBC=-999.9, +YCHEM_NL(64)%LASSIM=.FALSE., +YCHEM_NL(65)%CNAME='HPALD2', +YCHEM_NL(65)%NREQIN=1, +YCHEM_NL(65)%RMOLMASS=148.0, +YCHEM_NL(65)%IGRBCODE=217228, +YCHEM_NL(65)%LNEGFIX=.TRUE., +YCHEM_NL(65)%IGRIBTC=218228, +YCHEM_NL(65)%HENRYA=17.0, +YCHEM_NL(65)%HENRYB=5000.0, +YCHEM_NL(65)%LQM=.false., +YCHEM_NL(65)%LQM3D=.TRUE., +YCHEM_NL(65)%LCOMAD=.true., +YCHEM_NL(65)%LADV=.TRUE., +YCHEM_NL(65)%LMASSFIX=.TRUE., +YCHEM_NL(65)%BETAMFBC=-999.9, +YCHEM_NL(65)%LASSIM=.FALSE., +YCHEM_NL(66)%CNAME='ISOPOOH', +YCHEM_NL(66)%NREQIN=1, +YCHEM_NL(66)%RMOLMASS=118.0, +YCHEM_NL(66)%IGRBCODE=217161, +YCHEM_NL(66)%LNEGFIX=.TRUE., +YCHEM_NL(66)%IGRIBTC=218161, +YCHEM_NL(66)%IGRIBDV=221161, +YCHEM_NL(66)%HENRYA=3.2E11, +YCHEM_NL(66)%HENRYB=8700.0, +YCHEM_NL(66)%LQM=.false., +YCHEM_NL(66)%LQM3D=.TRUE., +YCHEM_NL(66)%LCOMAD=.true., +YCHEM_NL(66)%LADV=.TRUE., +YCHEM_NL(66)%LMASSFIX=.TRUE., +YCHEM_NL(66)%BETAMFBC=-999.9, +YCHEM_NL(66)%LASSIM=.FALSE., +YCHEM_NL(67)%CNAME='GLY', +YCHEM_NL(67)%NREQIN=1, +YCHEM_NL(67)%RMOLMASS=58.04, +YCHEM_NL(67)%IGRBCODE=217107, +YCHEM_NL(67)%LNEGFIX=.TRUE., +YCHEM_NL(67)%IGRIBTC=218107, +YCHEM_NL(67)%IGRIBDV=221107, +YCHEM_NL(67)%HENRYA=4.1E5, +YCHEM_NL(67)%HENRYB=7500.0, +YCHEM_NL(67)%LQM=.false., +YCHEM_NL(67)%LQM3D=.TRUE., +YCHEM_NL(67)%LCOMAD=.true., +YCHEM_NL(67)%LADV=.TRUE., +YCHEM_NL(67)%LMASSFIX=.TRUE., +YCHEM_NL(67)%BETAMFBC=-999.9, +YCHEM_NL(67)%LASSIM=.FALSE., +YCHEM_NL(68)%CNAME='GLYALD', +YCHEM_NL(68)%NREQIN=1, +YCHEM_NL(68)%RMOLMASS=60.05, +YCHEM_NL(68)%IGRBCODE=217101, +YCHEM_NL(68)%LNEGFIX=.TRUE., +YCHEM_NL(68)%IGRIBTC=218101, +YCHEM_NL(68)%IGRIBDV=221101, +YCHEM_NL(68)%HENRYA=4.1E4, +YCHEM_NL(68)%HENRYB=4600.0, +YCHEM_NL(68)%LQM=.false., +YCHEM_NL(68)%LQM3D=.TRUE., +YCHEM_NL(68)%LCOMAD=.true., +YCHEM_NL(68)%LADV=.TRUE., +YCHEM_NL(68)%LMASSFIX=.TRUE., +YCHEM_NL(68)%BETAMFBC=-999.9, +YCHEM_NL(68)%LASSIM=.FALSE., +YCHEM_NL(69)%CNAME='HYAC', +YCHEM_NL(69)%NREQIN=1, +YCHEM_NL(69)%RMOLMASS=74.1, +YCHEM_NL(69)%IGRBCODE=217118, +YCHEM_NL(69)%LNEGFIX=.TRUE., +YCHEM_NL(69)%IGRIBTC=218117, +YCHEM_NL(69)%IGRIBDV=221118, +YCHEM_NL(69)%HENRYA=6.3E3, +YCHEM_NL(69)%HENRYB=6460.0, +YCHEM_NL(69)%LQM=.false., +YCHEM_NL(69)%LQM3D=.TRUE., +YCHEM_NL(69)%LCOMAD=.true., +YCHEM_NL(69)%LADV=.TRUE., +YCHEM_NL(69)%LMASSFIX=.TRUE., +YCHEM_NL(69)%BETAMFBC=-999.9, +YCHEM_NL(69)%LASSIM=.FALSE., +YCHEM_NL(70)%CNAME='ISOPBO2', +YCHEM_NL(70)%NREQIN=1, +YCHEM_NL(70)%RMOLMASS=117.0, +YCHEM_NL(70)%IGRBCODE=217229, +YCHEM_NL(70)%LNEGFIX=.TRUE., +YCHEM_NL(70)%IGRIBTC=218229, +YCHEM_NL(70)%LQM=.false., +YCHEM_NL(70)%LQM3D=.TRUE., +YCHEM_NL(70)%LCOMAD=.true., +YCHEM_NL(70)%LADV=.FALSE., +YCHEM_NL(70)%LMASSFIX=.FALSE., +YCHEM_NL(70)%LMASSFIX=.FALSE., +YCHEM_NL(70)%LASSIM=.FALSE., +YCHEM_NL(71)%CNAME='ISOPDO2', +YCHEM_NL(71)%NREQIN=1, +YCHEM_NL(71)%RMOLMASS=117.0, +YCHEM_NL(71)%IGRBCODE=217230, +YCHEM_NL(71)%LNEGFIX=.TRUE., +YCHEM_NL(71)%IGRIBTC=218230, +YCHEM_NL(71)%LQM=.false., +YCHEM_NL(71)%LQM3D=.TRUE., +YCHEM_NL(71)%LCOMAD=.true., +YCHEM_NL(71)%LADV=.FALSE., +YCHEM_NL(71)%LMASSFIX=.FALSE., +YCHEM_NL(71)%LMASSFIX=.FALSE., +YCHEM_NL(71)%LASSIM=.FALSE., +YCHEM_NL(72)%CNAME='SOG1', +YCHEM_NL(72)%NREQIN=1, +YCHEM_NL(72)%RMOLMASS=180.0, +YCHEM_NL(72)%IGRBCODE=217186, +YCHEM_NL(72)%LNEGFIX=.TRUE., +YCHEM_NL(72)%IGRIBTC=218186, +YCHEM_NL(72)%HENRYA=1.E5, +YCHEM_NL(72)%HENRYB=6000.0, +YCHEM_NL(72)%LQM=.false., +YCHEM_NL(72)%LQM3D=.TRUE., +YCHEM_NL(72)%LCOMAD=.true., +YCHEM_NL(72)%LADV=.TRUE., +YCHEM_NL(72)%LMASSFIX=.TRUE., +YCHEM_NL(72)%BETAMFBC=-999.9, +YCHEM_NL(72)%LASSIM=.FALSE., +YCHEM_NL(73)%CNAME='SOG2A', +YCHEM_NL(73)%NREQIN=1, +YCHEM_NL(73)%RMOLMASS=120.0, +YCHEM_NL(73)%IGRBCODE=217187, +YCHEM_NL(73)%LNEGFIX=.TRUE., +YCHEM_NL(73)%IGRIBTC=218187, +YCHEM_NL(73)%HENRYA=1.E3, +YCHEM_NL(73)%HENRYB=6000.0, +YCHEM_NL(73)%LQM=.false., +YCHEM_NL(73)%LQM3D=.TRUE., +YCHEM_NL(73)%LCOMAD=.true., +YCHEM_NL(73)%LADV=.TRUE., +YCHEM_NL(73)%LMASSFIX=.TRUE., +YCHEM_NL(73)%BETAMFBC=-999.9, +YCHEM_NL(73)%LASSIM=.FALSE., +YCHEM_NL(74)%CNAME='SOG2B', +YCHEM_NL(74)%NREQIN=1, +YCHEM_NL(74)%RMOLMASS=120.0, +YCHEM_NL(74)%IGRBCODE=217188, +YCHEM_NL(74)%LNEGFIX=.TRUE., +YCHEM_NL(74)%IGRIBTC=218188, +YCHEM_NL(74)%HENRYA=1.E5, +YCHEM_NL(74)%HENRYB=6000.0, +YCHEM_NL(74)%LQM=.false., +YCHEM_NL(74)%LQM3D=.TRUE., +YCHEM_NL(74)%LCOMAD=.true., +YCHEM_NL(74)%LADV=.TRUE., +YCHEM_NL(74)%LMASSFIX=.TRUE., +YCHEM_NL(74)%BETAMFBC=-999.9, +YCHEM_NL(74)%LASSIM=.FALSE., +YEXT_NL(1)%CNAME='EMILI', +YEXT_NL(1)%NREQIN=0, +YEXT_NL(1)%IGRBCODE=212254, +YEXT_NL(1)%LADV=.FALSE., +YEXT_NL(1)%LGP=.TRUE., +YEXT_NL(1)%LGPINGP=.TRUE., +YEXT_NL(2)%CNAME='KCH4CHEM', +YEXT_NL(2)%NREQIN=0, +YEXT_NL(2)%IGRBCODE=210071, +YEXT_NL(2)%LADV=.FALSE., +YEXT_NL(2)%LGP=.TRUE., +YEXT_NL(2)%LGPINGP=.TRUE., +NGFL_EXT=2, +LAERCHEM=true +YQ_NL%LGP=true, +YQ_NL%LSP=false, +YL_NL%LGP=true, +YI_NL%LGP=true, +YA_NL%LGP=true, +YO3_NL%LGP=true, +LTRCMFQM=true, +/ +&NAMFPC +CFPFMT="MODEL", +NFP3DFS=96, +NFP3DFP=31, +NFP3DFT=25, +NFP3DFV=25, +MFP3DFS(:)=130,135,138,155,133,210001,210002,210003,210004,210005,210006,210007,210008,210009,210010,210011,210247,210248,210249,210252,210253,210203,210129,217003,217004,210123,217006,217007,210124,217009,217010,217011,217012,217013,217014,217015,217016,210122,217018,217019,217020,217021,217022,217023,217024,210181,217026,217027,217028,217029,217030,210121,217032,217033,217034,217035,217036,217037,217038,217039,217040,217041,217042,217043,217044,217045,217046,217047,217048,217049,217050,217051,217052,217053,217054,217055,217189,217225,217086,217226,217224,217100,217099,217222,217227,217228,217161,217107,217101,217118,217229,217230,217186,217187,217188,210071, +MFP3DFP(:)=129,130,135,138,155,157,133,210001,210002,210003,210004,210005,210006,210007,210008,210009,210010,210011,210247,210248,210249,210252,210253,210203,210123,217006,210124,210122,217019,217027,210121, +MFP3DFT=60,210001,210002,210003,210004,210005,210006,210007,210008,210009,210010,210011,210247,210248,210249,210252,210253,210203,210123,217006,210124,210122,217019,217027,210121, +MFP3DFV=133,210001,210002,210003,210004,210005,210006,210007,210008,210009,210010,210011,210247,210248,210249,210252,210253,210203,210123,217006,210124,210122,217019,217027,210121, +NFP2DF=2, +MFP2DF(:)=129,152, +NFPPHY=260, +MFPPHY(:)=31,32,33,34,35,36,37,38,39,40,41,42,44,45,47,49,50,57,58,59,78,79,129,134,136,137,139,141,142,143,228,144,145,146,147,148,151,159,164,165,166,167,168,169,170,172,175,176,177,178,179,180,181,182,183,186,187,188,189,195,196,197,198,201,202,205,208,209,210,211,235,236,238,243,244,245,229,230,231,232,213,212,8,9,228080,228081,228082,228083,228084,228085,228089,228090,228001,260121,260123,3020,228029,228251,228216,228217,228218,228219,228220,228221,260015,151131,151132,228141,228038,215022,215019,210208,215023,215020,215024,215021,215046,215043,210209,215047,215044,215048,215045,215064,215062,210210,215063,215061,215080,215078,210211,215079,215077,215088,215087,210212,215203,215201,210250,215204,215202,216042,215211,210251,216098,215218,215226,216099,215225,210072,210073,210074,210207,215104,215122,215140,215158,210217,215096,215114,215132,215150,210218,215097,215115,215133,215151,210219,215098,215116,215134,215152,210220,215099,215117,215135,215153,210221,215100,215118,215136,215154,210213,215101,215119,215137,215155,210222,215102,215120,215138,215156,210223,215103,215121,215139,215157,210224,215105,215123,215141,215159,210214,215106,215124,215142,215160,210225,215107,215125,215143,215161,210226,215108,215126,215144,215162,210215,215109,215127,215145,215163,210227,215110,215128,215146,215164,210228,215111,215129,215147,215165,210216,215112,215130,215148,215166,210229,215113,215131,215149,215167,210230,215176,215177,215178,215179,216008,216009,216010,216011,216012,210206,210127,218006,210128,210126,218019,218027,210125, +NRFP3S(:)=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137, +RFP3P(:)=100000.0,92500.0,85000.0,70000.0,50000.0,40000.0,30000.0,25000.0,20000.0,15000.0,10000.0,7000.0,5000.0,3000.0,2000.0,1000.0,700.0,500.0,300.0,200.0,100.0, +NFPCLI=0, +LFPQ=false, +LTRACEFP=false, +RFPCORR=60000., +/ +&NAMDIM +NPROMA=-16, +/ +&NAMDPHY +NVEXTR=7, +NCEXTR=137, +NCSNEC=5, +/ +&NAMGEM +LNONHYD_GEOM=false, +NHTYP=2, +/ +&NAMRIP +TSTEP=1800.0, +CSTOP='h240', +/ +&NAMARG +NCONF=1, +CNMEXP="abc3", +/ + &NAMRLX + / + &NAEAER + NTYPAER=3,3,2,2,1,2,1,2,0,0, + YAERO_DESC(1)%IGRIBDIAG=215001,215004,215007,215010,215013,215016,215022,215019, +YAERO_DESC(1)%RDDEPVSEA=1.1000E-02, +YAERO_DESC(1)%RDDEPVLIC=1.1000E-02, +YAERO_DESC(1)%RSEDIMV=2.4000E-05, +YAERO_DESC(1)%RSCAVIN=0.9, +YAERO_DESC(1)%RSCAVBCR=0.001, +YAERO_DESC(1)%RSCAVBCS=0.005, +YAERO_DESC(1)%COPTCLASS='SeaSaltSmall', +YAERO_DESC(1)%CHYGCLASS='SeaSalt', +YAERO_DESC(1)%IAEROCV=1, +YAERO_DESC(2)%IGRIBDIAG=215002,215005,215008,215011,215014,215017,215023,215020, +YAERO_DESC(2)%RDDEPVSEA=1.1500E-02, +YAERO_DESC(2)%RDDEPVLIC=1.2000E-02, +YAERO_DESC(2)%RSEDIMV=1.9500E-03, +YAERO_DESC(2)%RSCAVIN=0.9, +YAERO_DESC(2)%RSCAVBCR=0.001, +YAERO_DESC(2)%RSCAVBCS=0.005, +YAERO_DESC(2)%COPTCLASS='SeaSaltMedium', +YAERO_DESC(2)%CHYGCLASS='SeaSalt', +YAERO_DESC(2)%IAEROCV=2, +YAERO_DESC(3)%IGRIBDIAG=215003,215006,215009,215012,215015,215018,215024,215021, +YAERO_DESC(3)%RDDEPVSEA=1.2000E-02, +YAERO_DESC(3)%RDDEPVLIC=1.5000E-02, +YAERO_DESC(3)%RSEDIMV=1.8000E-02, +YAERO_DESC(3)%RSCAVIN=0.9, +YAERO_DESC(3)%RSCAVBCR=0.1, +YAERO_DESC(3)%RSCAVBCS=0.005, +YAERO_DESC(3)%COPTCLASS='SeaSaltLarge', +YAERO_DESC(3)%CHYGCLASS='SeaSalt', +YAERO_DESC(3)%IAEROCV=2, +YAERO_DESC(4)%IGRIBDIAG=215025,215028,215031,215034,215037,215040,215046,215043, +YAERO_DESC(4)%RDDEPVSEA=2.0000E-04, +YAERO_DESC(4)%RDDEPVLIC=2.0000E-04, +YAERO_DESC(4)%RSEDIMV=6.9040E-05, +YAERO_DESC(4)%RSCAVIN=0.7, +YAERO_DESC(4)%RSCAVBCR=0.001, +YAERO_DESC(4)%RSCAVBCS=0.005, +YAERO_DESC(4)%COPTCLASS='DustSmall', +YAERO_DESC(4)%CHYGCLASS='Dust', +YAERO_DESC(4)%IAEROCV=1, +YAERO_DESC(5)%IGRIBDIAG=215026,215029,215032,215035,215038,215041,215047,215044, +YAERO_DESC(5)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(5)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(5)%RSEDIMV=1.9820E-04, +YAERO_DESC(5)%RSCAVIN=0.7, +YAERO_DESC(5)%RSCAVBCR=0.001, +YAERO_DESC(5)%RSCAVBCS=0.005, +YAERO_DESC(5)%COPTCLASS='DustMedium', +YAERO_DESC(5)%CHYGCLASS='Dust', +YAERO_DESC(5)%IAEROCV=2, +YAERO_DESC(6)%IGRIBDIAG=215027,215030,215033,215036,215039,215042,215048,215045, +YAERO_DESC(6)%RDDEPVSEA=1.2000E-02, +YAERO_DESC(6)%RDDEPVLIC=1.2000E-02, +YAERO_DESC(6)%RSEDIMV=1.9620E-03, +YAERO_DESC(6)%RSCAVIN=0.7, +YAERO_DESC(6)%RSCAVBCR=0.1, +YAERO_DESC(6)%RSCAVBCS=0.005, +YAERO_DESC(6)%COPTCLASS='DustLarge', +YAERO_DESC(6)%CHYGCLASS='Dust', +YAERO_DESC(6)%IAEROCV=2, +YAERO_DESC(7)%IGRIBDIAG=215050,215052,215054,215056,215058,215060,215064,215062, +YAERO_DESC(7)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(7)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(7)%RSEDIMV=2.0000E-04, +YAERO_DESC(7)%RSCAVIN=0.7, +YAERO_DESC(7)%RSCAVBCR=0.0001, +YAERO_DESC(7)%RSCAVBCS=0.005, +YAERO_DESC(7)%COPTCLASS='OrganicMatter', +YAERO_DESC(7)%CHYGCLASS='OrganicMatter', +YAERO_DESC(7)%IAEROCV=1, +YAERO_DESC(8)%IGRIBDIAG=215049,215051,215053,215055,215057,215059,215063,215061, +YAERO_DESC(8)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(8)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(8)%RSEDIMV=2.0000E-04, +YAERO_DESC(8)%RSCAVIN=0, +YAERO_DESC(8)%RSCAVBCR=0.0001, +YAERO_DESC(8)%RSCAVBCS=0.005, +YAERO_DESC(8)%COPTCLASS='OrganicMatter', +YAERO_DESC(8)%CHYGCLASS='Hydrophobic', +YAERO_DESC(8)%IAEROCV=1, +YAERO_DESC(9)%IGRIBDIAG=215066,215068,215070,215072,215074,215076,215080,215078, +YAERO_DESC(9)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(9)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(9)%RSEDIMV=2.0000E-04, +YAERO_DESC(9)%RSCAVIN=0.7, +YAERO_DESC(9)%RSCAVBCR=0.0001, +YAERO_DESC(9)%RSCAVBCS=0.005, +YAERO_DESC(9)%COPTCLASS='BlackCarbon', +YAERO_DESC(9)%CHYGCLASS='BlackCarbon', +YAERO_DESC(9)%IAEROCV=1, +YAERO_DESC(10)%IGRIBDIAG=215065,215067,215069,215071,215073,215075,215079,215077, +YAERO_DESC(10)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(10)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(10)%RSEDIMV=2.0000E-04, +YAERO_DESC(10)%RSCAVIN=0, +YAERO_DESC(10)%RSCAVBCR=0.0001, +YAERO_DESC(10)%RSCAVBCS=0.005, +YAERO_DESC(10)%COPTCLASS='BlackCarbon', +YAERO_DESC(10)%CHYGCLASS='Hydrophobic', +YAERO_DESC(10)%IAEROCV=1, +YAERO_DESC(11)%IGRIBDIAG=215081,215082,215083,215084,215085,215086,215088,215087, +YAERO_DESC(11)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(11)%RDDEPVLIC=2.5000E-03, +YAERO_DESC(11)%RSEDIMV=2.0000E-04, +YAERO_DESC(11)%RSCAVIN=0.7, +YAERO_DESC(11)%RSCAVBCR=0.0001, +YAERO_DESC(11)%RSCAVBCS=0.005, +YAERO_DESC(11)%COPTCLASS='Sulphate', +YAERO_DESC(11)%CHYGCLASS='Sulphate', +YAERO_DESC(11)%IAEROCV=1, +YAERO_DESC(12)%IGRIBDIAG=215189,215191,215193,215195,215197,215199,215203,215201, +YAERO_DESC(12)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(12)%RDDEPVLIC=1.5000E-03, +YAERO_DESC(12)%RSEDIMV=2.0000E-04, +YAERO_DESC(12)%RSCAVIN=0.8, +YAERO_DESC(12)%RSCAVBCR=0.0001, +YAERO_DESC(12)%RSCAVBCS=0.005, +YAERO_DESC(12)%COPTCLASS='NitrateFine', +YAERO_DESC(12)%CHYGCLASS='Nitrate', +YAERO_DESC(12)%IAEROCV=1, +YAERO_DESC(13)%IGRIBDIAG=215190,215192,215194,215196,215198,215200,215204,215202, +YAERO_DESC(13)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(13)%RDDEPVLIC=1.5000E-03, +YAERO_DESC(13)%RSEDIMV=1.3352E-03, +YAERO_DESC(13)%RSCAVIN=0.8, +YAERO_DESC(13)%RSCAVBCR=0.1, +YAERO_DESC(13)%RSCAVBCS=0.005, +YAERO_DESC(13)%COPTCLASS='NitrateCoarse', +YAERO_DESC(13)%CHYGCLASS='Nitrate', +YAERO_DESC(13)%IAEROCV=2, +YAERO_DESC(14)%IGRIBDIAG=215205,215206,215207,215208,215209,215210,216042,215211, +YAERO_DESC(14)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(14)%RDDEPVLIC=1.5000E-03, +YAERO_DESC(14)%RSEDIMV=2.0000E-04, +YAERO_DESC(14)%RSCAVIN=0.9, +YAERO_DESC(14)%RSCAVBCR=0.0001, +YAERO_DESC(14)%RSCAVBCS=0.005, +YAERO_DESC(14)%COPTCLASS='Ammonium', +YAERO_DESC(14)%CHYGCLASS='Ammonium', +YAERO_DESC(14)%IAEROCV=1, +YAERO_DESC(15)%IGRIBDIAG=215212,215213,215214,215215,215216,215217,216098,215218, +YAERO_DESC(15)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(15)%RDDEPVLIC=2.5000E-03, +YAERO_DESC(15)%RSEDIMV=2.4000E-04, +YAERO_DESC(15)%RSCAVIN=0.7, +YAERO_DESC(15)%RSCAVBCR=0.0001, +YAERO_DESC(15)%RSCAVBCS=0.005, +YAERO_DESC(15)%COPTCLASS='SecOrgBio', +YAERO_DESC(15)%CHYGCLASS='SecOrgBio', +YAERO_DESC(15)%IAEROCV=1, +YAERO_DESC(16)%IGRIBDIAG=215219,215220,215221,215222,215223,215224,216099,215225, +YAERO_DESC(16)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(16)%RDDEPVLIC=2.5000E-03, +YAERO_DESC(16)%RSEDIMV=2.4000E-04, +YAERO_DESC(16)%RSCAVIN=0.7, +YAERO_DESC(16)%RSCAVBCR=0.0001, +YAERO_DESC(16)%RSCAVBCS=0.005, +YAERO_DESC(16)%COPTCLASS='SecOrgAnth', +YAERO_DESC(16)%CHYGCLASS='SecOrgAnth', +YAERO_DESC(16)%IAEROCV=1, + LAERVOL=false, + NDRYDEPVEL_DYN=2, + LAERDUSTSOURCE=true, + LAERDUSTSIZEVAR=true, + LAERDUST_NEWBIN=false, + RAERDUST_REBOUND=0.1, + LAERNGAT=true, + NAERSCAV=3, + LAERGTOP=true, + LAERHYGRO=true, + LAERSEDIM=true, + LAERSEDIMSS=true, + LAERDRYDP=true, + LAERSURF=true, + NSSALT=4, + NDDUST=2, + NSO4SCHEME=1, + LSEASALT_RH80=true, + LAERRRTM=true, + / + &NAMCOMPO + LCHEM_DIA=true, + LCHEM_DDFLX=true, + LCOMPO_DDFLX_DIR=true, + LCHEM_TROPO=true, + LCOMPO_DCDD=true, + LAERNITRATE=true, + LAEREQSAM4CLIM=false, + LAERSOA=true, + LAERSOA_COUPLED=true, + KGHG_CHEMTEND_CH4=1, + LAERNUCL=true, + AERO_SCHEME="hamm7", + +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219209 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212001 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="ene" + THIS%PARAMID=212002 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="fef" + THIS%PARAMID=212003 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="ind" + THIS%PARAMID=212004 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="res" + THIS%PARAMID=212006 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="shp" + THIS%PARAMID=212007 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="slv" + THIS%PARAMID=212189 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="swd" + THIS%PARAMID=212008 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="tnr" + THIS%PARAMID=212009 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="tro" + THIS%PARAMID=212010 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_A" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%SCALING=0.2 + THIS%PARAMID=210091 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_A" + THIS%SECTOR="ene" + THIS%PARAMID=212221 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%SCALING=0.2 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_A" + THIS%SECTOR="fef" + THIS%PARAMID=212222 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" + THIS%SCALING=0.2 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_A" + THIS%SECTOR="ind" + THIS%PARAMID=212223 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 + THIS%SCALING=0.2 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_A" + THIS%SECTOR="ref" + THIS%PARAMID=212229 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%SCALING=0.2 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_A" + THIS%SECTOR="res" + THIS%PARAMID=212224 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" + THIS%SCALING=0.2 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_A" + THIS%SECTOR="shp" + THIS%PARAMID=212225 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%SCALING=0.2 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_A" + THIS%SECTOR="swd" + THIS%PARAMID=212226 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%SCALING=0.2 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_A" + THIS%SECTOR="tnr" + THIS%PARAMID=212227 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" + THIS%SCALING=0.2 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_A" + THIS%SECTOR="tro" + THIS%PARAMID=212228 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" + THIS%SCALING=0.2 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_B" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%SCALING=0.8 + THIS%PARAMID=210091 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_B" + THIS%SECTOR="ene" + THIS%PARAMID=212221 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%SCALING=0.8 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_B" + THIS%SECTOR="fef" + THIS%PARAMID=212222 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" + THIS%SCALING=0.8 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_B" + THIS%SECTOR="ind" + THIS%PARAMID=212223 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 + THIS%SCALING=0.8 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_B" + THIS%SECTOR="ref" + THIS%PARAMID=212229 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%SCALING=0.8 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_B" + THIS%SECTOR="res" + THIS%PARAMID=212224 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" + THIS%SCALING=0.8 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_B" + THIS%SECTOR="shp" + THIS%PARAMID=212225 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%SCALING=0.8 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_B" + THIS%SECTOR="swd" + THIS%PARAMID=212226 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%SCALING=0.8 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_B" + THIS%SECTOR="tnr" + THIS%PARAMID=212227 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" + THIS%SCALING=0.8 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_B" + THIS%SECTOR="tro" + THIS%PARAMID=212228 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" + THIS%SCALING=0.8 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212011 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="ene" + THIS%PARAMID=212012 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="fef" + THIS%PARAMID=212013 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="ind" + THIS%PARAMID=212014 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="res" + THIS%PARAMID=212015 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="shp" + THIS%PARAMID=212016 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="slv" + THIS%PARAMID=212019 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="swd" + THIS%PARAMID=212017 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="tnr" + THIS%PARAMID=212018 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210106 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212021 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212022 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="ene" + THIS%PARAMID=212023 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="fef" + THIS%PARAMID=212024 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="ind" + THIS%PARAMID=212025 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="ref" + THIS%PARAMID=212020 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="res" + THIS%PARAMID=212026 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="shp" + THIS%PARAMID=212027 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="slv" + THIS%PARAMID=212133 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="swd" + THIS%PARAMID=212028 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="tnr" + THIS%PARAMID=212029 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="tro" + THIS%PARAMID=212030 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210104 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212031 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="ene" + THIS%PARAMID=212032 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="fef" + THIS%PARAMID=212033 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="ind" + THIS%PARAMID=212034 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="ref" + THIS%PARAMID=212040 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="res" + THIS%PARAMID=212035 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="shp" + THIS%PARAMID=212036 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="slv" + THIS%PARAMID=212137 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="swd" + THIS%PARAMID=212037 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="tnr" + THIS%PARAMID=212038 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="tro" + THIS%PARAMID=212039 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210118 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212041 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212042 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="ene" + THIS%PARAMID=212043 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="fef" + THIS%PARAMID=212044 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="ind" + THIS%PARAMID=212045 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="ref" + THIS%PARAMID=212134 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="res" + THIS%PARAMID=212046 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="shp" + THIS%PARAMID=212047 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="slv" + THIS%PARAMID=212185 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="swd" + THIS%PARAMID=212048 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="tnr" + THIS%PARAMID=212049 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="tro" + THIS%PARAMID=212050 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210107 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212051 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212052 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="ene" + THIS%PARAMID=212053 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="fef" + THIS%PARAMID=212054 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="ind" + THIS%PARAMID=212055 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="ref" + THIS%PARAMID=212135 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="res" + THIS%PARAMID=212056 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="shp" + THIS%PARAMID=212057 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="slv" + THIS%PARAMID=212186 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="swd" + THIS%PARAMID=212058 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="tnr" + THIS%PARAMID=212059 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="tro" + THIS%PARAMID=212060 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210105 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212061 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212062 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="ene" + THIS%PARAMID=212063 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="fef" + THIS%PARAMID=212064 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="ind" + THIS%PARAMID=212065 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="ref" + THIS%PARAMID=212136 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="res" + THIS%PARAMID=212066 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="shp" + THIS%PARAMID=212067 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="slv" + THIS%PARAMID=212187 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="swd" + THIS%PARAMID=212068 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="tnr" + THIS%PARAMID=212069 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="tro" + THIS%PARAMID=212070 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210108 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212071 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.00 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="ene" + THIS%PARAMID=212072 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="fef" + THIS%PARAMID=212073 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="ind" + THIS%PARAMID=212074 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="ref" + THIS%PARAMID=212080 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="res" + THIS%PARAMID=212075 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="shp" + THIS%PARAMID=212076 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="slv" + THIS%PARAMID=212198 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="swd" + THIS%PARAMID=212077 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="tnr" + THIS%PARAMID=212078 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="tro" + THIS%PARAMID=212079 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210113 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212081 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="ene" + THIS%PARAMID=212082 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="fef" + THIS%PARAMID=212083 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="ind" + THIS%PARAMID=212084 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="res" + THIS%PARAMID=212085 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="shp" + THIS%PARAMID=212086 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="slv" + THIS%PARAMID=212090 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="swd" + THIS%PARAMID=212087 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="tnr" + THIS%PARAMID=212088 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="tro" + THIS%PARAMID=212089 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219220 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="ene" + THIS%SCALING=0.0015 + THIS%PARAMID=212123 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="ind" + THIS%SCALING=0.0015 + THIS%PARAMID=212125 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="ref" + THIS%SCALING=0.0015 + THIS%PARAMID=212120 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="res" + THIS%SCALING=0.0015 + THIS%PARAMID=212126 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210115 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212091 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="emiss_nat" + THIS%SCALING=1.4 + THIS%PARAMID=212122 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="ene" + THIS%PARAMID=212092 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="fef" + THIS%PARAMID=212093 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="ind" + THIS%PARAMID=212094 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="ref" + THIS%PARAMID=212100 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="res" + THIS%PARAMID=212095 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="shp" + THIS%PARAMID=212096 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="slv" + THIS%PARAMID=212190 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="swd" + THIS%PARAMID=212097 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="tnr" + THIS%PARAMID=212098 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="tro" + THIS%PARAMID=212099 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210103 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212111 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="ene" + THIS%PARAMID=212112 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="fef" + THIS%PARAMID=212113 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="ind" + THIS%PARAMID=212114 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="ref" + THIS%PARAMID=212110 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="res" + THIS%PARAMID=212115 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="shp" + THIS%PARAMID=212116 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="slv" + THIS%PARAMID=212140 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="swd" + THIS%PARAMID=212117 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="tnr" + THIS%PARAMID=212118 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="tro" + THIS%PARAMID=212119 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210081 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212121 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212122 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="ene" + THIS%PARAMID=212123 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="fef" + THIS%PARAMID=212124 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="ind" + THIS%PARAMID=212125 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="ref" + THIS%PARAMID=212120 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="res" + THIS%PARAMID=212126 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="shp" + THIS%PARAMID=212127 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="swd" + THIS%PARAMID=212128 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="tnr" + THIS%PARAMID=212129 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="tro" + THIS%PARAMID=212130 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="DMS" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210117 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="DMS" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212132 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="DMS" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212131 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="GLY" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=212244 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219219 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="ene" + THIS%SCALING=0.001 + THIS%PARAMID=212123 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="ind" + THIS%SCALING=0.001 + THIS%PARAMID=212125 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="ref" + THIS%SCALING=0.001 + THIS%PARAMID=212120 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="res" + THIS%SCALING=0.001 + THIS%PARAMID=212126 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212141 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="ene" + THIS%PARAMID=212142 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="fef" + THIS%PARAMID=212143 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="ind" + THIS%PARAMID=212144 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="res" + THIS%PARAMID=212145 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="shp" + THIS%PARAMID=212146 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="slv" + THIS%PARAMID=212240 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="swd" + THIS%PARAMID=212147 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="tnr" + THIS%PARAMID=212148 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="tro" + THIS%PARAMID=212149 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ISPD" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212150 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212151 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="ene" + THIS%PARAMID=212152 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="fef" + THIS%PARAMID=212153 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="ind" + THIS%PARAMID=212154 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="res" + THIS%PARAMID=212155 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="shp" + THIS%PARAMID=212156 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="slv" + THIS%PARAMID=212241 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="swd" + THIS%PARAMID=212157 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="tnr" + THIS%PARAMID=212158 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="tro" + THIS%PARAMID=212159 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210116 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="agl" + THIS%PARAMID=212163 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ags" + THIS%PARAMID=212164 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGS" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212161 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212162 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ene" + THIS%PARAMID=212165 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ind" + THIS%PARAMID=212166 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ref" + THIS%PARAMID=212138 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="res" + THIS%PARAMID=212167 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="slv" + THIS%PARAMID=212169 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="swd" + THIS%PARAMID=212170 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="tnr" + THIS%PARAMID=212171 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="tro" + THIS%PARAMID=212172 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210085 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="agl" + THIS%PARAMID=212174 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212173 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="ene" + THIS%PARAMID=212176 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="fef" + THIS%PARAMID=212177 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="ind" + THIS%PARAMID=212178 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="ref" + THIS%PARAMID=212184 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="res" + THIS%PARAMID=212179 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="shp" + THIS%PARAMID=212180 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="swd" + THIS%PARAMID=212181 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="tnr" + THIS%PARAMID=212182 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="tro" + THIS%PARAMID=212183 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO2" + THIS%SECTOR="Aviation" + THIS%VERTICAL_PROFILE_TYPE="3D" + THIS%PARAMID=212255 + THIS%SCALING=1.53333333333333 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219208 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212191 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="ene" + THIS%PARAMID=212192 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="fef" + THIS%PARAMID=212193 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="ind" + THIS%PARAMID=212194 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="ref" + THIS%PARAMID=212200 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="res" + THIS%PARAMID=212195 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="shp" + THIS%PARAMID=212196 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="slv" + THIS%PARAMID=212242 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="swd" + THIS%PARAMID=212197 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="tnr" + THIS%PARAMID=212188 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="tro" + THIS%PARAMID=212199 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_A" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%SCALING=0.5 + THIS%PARAMID=210090 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_A" + THIS%SECTOR="ene" + THIS%PARAMID=212231 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_A" + THIS%SECTOR="fef" + THIS%PARAMID=212232 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_A" + THIS%SECTOR="ind" + THIS%PARAMID=212233 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_A" + THIS%SECTOR="ref" + THIS%PARAMID=212239 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_A" + THIS%SECTOR="res" + THIS%PARAMID=212234 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_A" + THIS%SECTOR="shp" + THIS%PARAMID=212235 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_A" + THIS%SECTOR="swd" + THIS%PARAMID=212236 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_A" + THIS%SECTOR="tnr" + THIS%PARAMID=212237 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_A" + THIS%SECTOR="tro" + THIS%PARAMID=212238 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_B" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%SCALING=0.5 + THIS%PARAMID=210090 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_B" + THIS%SECTOR="ene" + THIS%PARAMID=212231 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_B" + THIS%SECTOR="fef" + THIS%PARAMID=212232 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_B" + THIS%SECTOR="ind" + THIS%PARAMID=212233 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_B" + THIS%SECTOR="ref" + THIS%PARAMID=212239 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_B" + THIS%SECTOR="res" + THIS%PARAMID=212234 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_B" + THIS%SECTOR="shp" + THIS%PARAMID=212235 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_B" + THIS%SECTOR="swd" + THIS%PARAMID=212236 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_B" + THIS%SECTOR="tnr" + THIS%PARAMID=212237 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_B" + THIS%SECTOR="tro" + THIS%PARAMID=212238 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219207 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212201 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="ene" + THIS%PARAMID=212202 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="fef" + THIS%PARAMID=212203 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="ind" + THIS%PARAMID=212204 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="ref" + THIS%PARAMID=212139 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="res" + THIS%PARAMID=212205 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="shp" + THIS%PARAMID=212206 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="slv" + THIS%PARAMID=212243 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="swd" + THIS%PARAMID=212207 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="tnr" + THIS%PARAMID=212208 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="tro" + THIS%PARAMID=212209 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Rn" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212210 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210102 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212211 + THIS%VERTICAL_PROFILE_TYPE="AltitudeMap" + THIS%VERTICAL_PARAMID=216045 + THIS%VERTICAL_BASE_LEVEL=-1 + THIS%VERTICAL_TOP_LEVEL=-4 + THIS%VERTICAL_THRESHOLD=200 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="ene" + THIS%PARAMID=212212 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="fef" + THIS%PARAMID=212213 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="ind" + THIS%PARAMID=212214 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="ref" + THIS%PARAMID=212220 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="res" + THIS%PARAMID=212215 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="shp" + THIS%PARAMID=212216 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="swd" + THIS%PARAMID=212217 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="tnr" + THIS%PARAMID=212218 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="tro" + THIS%PARAMID=212219 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="agl" + THIS%PARAMID=216221 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="ene" + THIS%PARAMID=216222 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="fef" + THIS%PARAMID=216223 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="ind" + THIS%PARAMID=216224 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="ref" + THIS%PARAMID=216225 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="res" + THIS%PARAMID=216226 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="shp" + THIS%PARAMID=216227 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="slv" + THIS%PARAMID=216228 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="swd" + THIS%PARAMID=216229 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="tnr" + THIS%PARAMID=216230 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="tro" + THIS%PARAMID=216231 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219212 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=216200 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="ene" + THIS%PARAMID=216201 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="fef" + THIS%PARAMID=216202 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="ind" + THIS%PARAMID=216203 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="ref" + THIS%PARAMID=216204 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="res" + THIS%PARAMID=216205 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="shp" + THIS%PARAMID=216206 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="slv" + THIS%PARAMID=216207 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="swd" + THIS%PARAMID=216208 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="tnr" + THIS%PARAMID=216209 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="tro" + THIS%PARAMID=216210 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219213 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="ene" + THIS%PARAMID=216211 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="fef" + THIS%PARAMID=216212 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="ind" + THIS%PARAMID=216213 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="ref" + THIS%PARAMID=216214 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="res" + THIS%PARAMID=216215 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="shp" + THIS%PARAMID=216216 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="slv" + THIS%PARAMID=216217 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="swd" + THIS%PARAMID=216218 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="tnr" + THIS%PARAMID=216219 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="tro" + THIS%PARAMID=216220 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS +/ +&NAMCOMPO_EMIS_AUX + THIS%PARAMID=210060 +/ +&NAMCOMPO_EMIS_AUX + THIS%PARAMID=216045 +/ +&NAMCOMPO_EMIS_AUX +/ + &NAMCHEM + CHEM_SCHEME="tm5", + LCHEM_DIAC=false, + LCHEM_LIGHT=true, + + KCHEM_WETDEP=2, + LCHEM_0NOX=false, + KCHEM_NOXADV=0, + LCHEM_ANAO3=false, + KCHEM_SOLVE=2, + LCHEM_REVCHEM=false, + LCHEM_BASCOE_JON=false, + LCHEM_BASCOE_HETCHEM=true, + LCHEM_EXTENDJNO2=true, + LCHEM_JOUT=false, + LCHEM_AEROI=true, + LCHEM_O3RAD=true, + KCHEM_DRYDEP=3, + LCHEM_CSHAPE=.false., + LCHEM_WDFR=.true., + / + &NAMVAR + LMODERR=.false., + LJCDFI=.false., + LUSEJCDFI=.false., + LECV=false, + / + &NAMMCC + LMCC_COMPO=false, + / + &NAETLDIAG + / + &NAMVV0 + LLFORCE_READ=false, + / +&NAEAER +/ +&NAEPHY +/ +&NAERAD +/ +&NALBAR +/ +&NALORI +/ +&NAM_DISTRIBUTED_VECTORS +/ +&NAM926 +/ +&NAMAFN +/ +&NAMANA +/ +&NAMARPHY +/ +&NAMCA +/ +&NAMCAPE +/ +&NAMCFU +/ +&NAMCHK +/ +&NAMCHET +/ +&NAMCLDP +/ +&NAMCLTC +/ +&NAMCOM +/ +&NAMCOS +/ +&NAMCTAN +/ +&NAMCUMF +/ +&NAMCUMFS +/ +&NAMCT1 +/ +&NAMCVA +/ +&NAMDDH +/ +&NAMDFHD +/ +&NAMDFI +/ +&NAMDIF +/ +&NAMDIM +/ +&NAMDIMO +/ +&NAMDMSP +/ +&NAMDPHY +/ +&NAMDYN +/ +&NAMDYNA +/ +&NAMDYNA_STATIC +/ +&NAMDYNCORE +/ +&NAMEMIS_CONF +/ +&NAMENKF +/ +&NAMFA +/ +&NAMFFT +/ +&NAMFPC +/ +&NAMFPD +/ +&NAMFPDY2 +/ +&NAMFPDYH +/ +&NAMFPDYP +/ +&NAMFPDYS +/ +&NAMFPDYT +/ +&NAMFPDYV +/ +&NAMFPEZO +/ +&NAMFPF +/ +&NAMFPG +/ +&NAMFPIOS +/ +&NAMFPPHY +/ +&NAMFPSC2 +/ +&NAMFPSC2_DEP +/ +&NAMFY2 +/ +&NAMGEM +/ +&NAMGFL +/ +&NAMGMS +/ +&NAMGOES +/ +&NAMGOM +/ +&NAMGRIB +/ +&NAMGWD +/ +&NAMGWWMS +/ +&NAMHLOPT +/ +&NAMINI +/ +&NAMIOMI +/ +&NAMIOS +/ +&NAMJBCODES +/ +&NAMJFH +/ +&NAMJG +/ +&NAMJO +/ +&NAMKAP +/ +&NAMLCZ +/ +&NAMLEG +/ +&NAMLFI +/ +&NAMMCC +/ +&NAMMCUF +/ +&NAMMETEOSAT +/ +&NAMMTS +/ +&NAMMTSAT +/ +&NAMMTT +/ +&NAMMUL +/ +&NAMNMI +/ +&NAMNASA +/ +&NAMNN +/ +&NAMNPROF +/ +&NAMNUD +/ +&NAMOBS +/ +&NAMONEDVAR +/ +&NAMOPH +/ +&NAMOPTCMEM +/ +&NAMPAR0 +/ +&NAMPARAR +/ +&NAMPAR1 +/ +&NAMPHY +/ +&NAMPHY0 +/ +&NAMPHY1 +/ +&NAMPHY2 +/ +&NAMPHY3 +/ +&NAMPHYDS +/ +&NAMPPC +/ +&NAMPONG +/ +&NAMRAD15 +/ +&NAMRADCMEM +/ +&NAMRCOEF +/ +&NAMRES +/ +&NAMRINC +/ +&NAMRIP +/ +&NAMSATS +/ +&NAMSCC +/ +&NAMSCEN +/ +&NAMSCM +/ +&NAMSENS +/ +&NAMSIMPHL +/ +&NAMSKF +/ +&NAMSPSDT +/ +&NAMSPP +/ +&NAMSSMI +/ +&NAMSTA +/ +&NAMSTOPH +/ +&NAMTCWV +/ +&NAMTESTVAR +/ +&NAMTOPH +/ +&NAMTOVS +/ +&NAMTRAJP +/ +&NAMTRANS +/ +&NAMTRM +/ +&NAMVAR +/ +&NAMVARBC +/ +&NAMVARBC_AIREP +/ +&NAMVARBC_ALLSKY +/ +&NAMVARBC_GBRAD +/ +&NAMVARBC_RAD +/ +&NAMVARBC_SFCOBS +/ +&NAMVARBC_TCWV +/ +&NAMVARBC_TO3 +/ +&NAMVAREPS +/ +&NAMVDOZ +/ +&NAMVFP +/ +&NAMVRTL +/ +&NAMVV0 +/ +&NAMVV1 +/ +&NAMVV2 +/ +&NAMVWRK +/ +&NAMWAVELETJB +/ +&NAMXFU +/ +&NAMZDI +/ +&NAPHLC +/ +&NAV1IS +/ +&NAEPHLI +/ +&NAMCVER +/ +&NAMPPVI +/ +&NAMSPNG +/ +&NAMRLX +/ +&NAMTHLIM +/ +&NAMOOPS +/ +&NAMINTFLEX +/ +&NAMIAU +/ +&NAMDIM_TRAJ +/ +&NAMVDF +/ +&NAMGWDIAG +/ +&NAMTRANS0 +/ +&NAMMETHOX +/ +&NAM_ATLAS_IFS +/ +&NAETLDIAG +/ +&NAMACV +/ +&NAM_MGRIDS_ADVECTION +/ +&NAMTRAJ +/ +&NAMSATSIM +/ +&NAMCMEM_MW +/ +&NAMPHMSE +/ +&NAMNORGWD +/ +&NAMCLRADLID +/ +&NAMDVISI +/ +&NAM_MGRIDS_ADVECTION +/ +&NAMNUDGLH +/ +&NAMPERTOBS +/ +&NAMVARBC_MODES +/ +&NAMM7CTL +/ diff --git a/ifs-test/tests/t21/common/namelist_m7_ok b/ifs-test/tests/t21/common/namelist_m7_ok new file mode 100644 index 00000000..460717f3 --- /dev/null +++ b/ifs-test/tests/t21/common/namelist_m7_ok @@ -0,0 +1,4390 @@ +&NAMIOS +CFRCF="./rcf", +CIOSPRF="./srf", +/ +&NAMGRIB +CFCLASS="rd", +NCYCLE=154, +/ +&NAMCVER +LVERTFE=true, +NVSCH=3, +LVFE_GWMPA=true, +LVFE_GW=false, +LVFE_Z_TERM=false, +LVFE_X_TERM=false, +LVFE_LAPL_BC=true, +LVFE_LAPL=true, +NDLNPR=0, +/ +&NAMMCC +LMCC_COMPO=false, +LMCCEC=true, +LMCCIEC=false, +/ +&NAMTRANS +LUSEFLT=false, +LFFTW=false, +/ +&NAMRES +NFRRES=1, +NRESTS(:)=-1,-32767, +/ +&NAERAD +CRTABLEDIR='./rtables/', +LECOMPGRID=false, +RMUZUV=0.01, +NUVTIM=72, +NRADUV=1, +NUV=24, +LUVPROC=false, +LUVAERP=true, +LO3_CHEM_UV=true, +KMODTS=2, +NAERMACC=1, +NRPROMA=0, +/ +&NAEPHY +LNEEONLINE=true, +LWETONLINE=false, +LBFASCO2=false, +LEPHYS=true, +LEVDIF=true, +LESURF=true, +LECOND=true, +LECUMF=true, +LEPCLD=true, +LEEVAP=true, +LEVGEN=true, +LESSRO=true, +LECURR=false, +LEOCWA=true, +LEGWDG=true, +LEGWWMS=true, +LEOZOC=true, +LEQNGT=true, +LERADI=true, +LERADS=true, +LESICE=true, +LEO3CH=true, +LO3CH_HLO=true, +CO3CHEM="H1.0", +LEDCLD=true, +LDUCTDIA=false, +LDIAGTURB_EC=false, +LELIGHT=false, +LWCOU=true, +LWCOU2W=true, +LWCOUHMF=false, +LWCOURNW=false, +NSTPW=1, +LSLPHY=true, +LESNML=true, +NSNMLWS=2, +LEFARQUHAR=true, +LEOPTSURF=false, +LEAIRCO2COUP=false, +LEC4MAP=true, +LEAGS=false, +/ +&NAMPAR1 +NOUTTYPE=1, +LSPLIT=true, +NWRTOUT=4, +NFLDIN=0, +NSTRIN=1, +/ +&NAMPAR0 +LXML_STATS=false, +LSTATS=true, +LDETAILED_STATS=false, +LSYNCSTATS=false, +LSTATSCPU=false, +NPRNT_STATS=512, +LBARRIER_STATS=false, +LBARRIER_STATS2=false, +NPROC=512, +NSPECRESMIN=256, +NOUTPUT=1, +MP_TYPE=1, +MBX_SIZE=0, +/ +&NAMDYNA +LSLAG=true, +LNHEE=false, +LNHQE=false, +LGRADSP=true, +LCOMAD_GFL=true, +LCOMADH=true, +/ +&NAMDYNCORE +LAQUA=false, +/ +&NAMDYN +LMASCOR=true, +NITMP=3, +/ +&NAMCT0 +LARPEGEF=false, +LFDBOP=false, +LSMSSIG=false, +N3DINI=0, +NFRDHP=12, +NFRDHFD=1, +NFRSDI=1, +NFRPOS=6, +NFRHIS=6, +NFRMASSCON=1, +NFPOS=2, +NPOSTS=0, +NHISTS=0, +NMASSCONS=0, +NFRCO=4, +NFRDHFZ=48, +NDHFZTS=0, +NDHFDTS=0, +NUNDEFLD=-999999, +CMETER="ecflow_client --meter", +CEVENT="ecflow_client --event", +/ +&NAMDDH +BDEDDH(1:6,1)=4.0,1.0,0.0,50.0,0.0,49.0, +NDHKD=120, +LHDZON=false, +LHDEFZ=false, +LHDDOP=false, +LHDEFD=false, +LHDGLB=false, +LHDPRG=false, +LHDHKS=false, +/ +&NAMIO_SERV +NPROCESS_LEVEL=5, +NIO_SERV_METHOD=2, +NMSG_LEVEL_CLIENT=0, +NMSG_LEVEL_SERVER=1, +/ +&NAMGFL +NAERO=37, +NACTAERO=37, +YAERO_NL(1)%CNAME='SO4', +YAERO_NL(1)%IGRBCODE=210011, +YAERO_NL(1)%LMASSFIX=.true., +YAERO_NL(1)%LCOMAD=.true., +YAERO_NL(1)%LQM=.false., +YAERO_NL(1)%LQM3D=.true., +YAERO_NL(1)%BETAMFBC=-999, +YAERO_NL(1)%LADV=.true., +YAERO_NL(1)%NREQIN=0, +YAERO_NL(2)%CNAME='NH4', +YAERO_NL(2)%IGRBCODE=212035, +YAERO_NL(2)%LMASSFIX=.true., +YAERO_NL(2)%LCOMAD=.true., +YAERO_NL(2)%LQM=.false., +YAERO_NL(2)%LQM3D=.true., +YAERO_NL(2)%BETAMFBC=-999, +YAERO_NL(2)%LADV=.true., +YAERO_NL(2)%NREQIN=0, +YAERO_NL(3)%CNAME='NO3_A', +YAERO_NL(3)%IGRBCODE=212036, +YAERO_NL(3)%LMASSFIX=.true., +YAERO_NL(3)%LCOMAD=.true., +YAERO_NL(3)%LQM=.false., +YAERO_NL(3)%LQM3D=.true., +YAERO_NL(3)%BETAMFBC=-999, +YAERO_NL(3)%LADV=.true., +YAERO_NL(3)%NREQIN=0, +YAERO_NL(4)%CNAME='ACS_N', +YAERO_NL(4)%IGRBCODE=212001, +YAERO_NL(4)%LMASSFIX=.true., +YAERO_NL(4)%LCOMAD=.true., +YAERO_NL(4)%LQM=.false., +YAERO_NL(4)%LQM3D=.true., +YAERO_NL(4)%BETAMFBC=-999, +YAERO_NL(4)%LADV=.true., +YAERO_NL(4)%NREQIN=0, +YAERO_NL(5)%CNAME='SO4ACS', +YAERO_NL(5)%IGRBCODE=212002, +YAERO_NL(5)%LMASSFIX=.true., +YAERO_NL(5)%LCOMAD=.true., +YAERO_NL(5)%LQM=.false., +YAERO_NL(5)%LQM3D=.true., +YAERO_NL(5)%BETAMFBC=-999, +YAERO_NL(5)%LADV=.true., +YAERO_NL(5)%NREQIN=0, +YAERO_NL(6)%CNAME='BCACS', +YAERO_NL(6)%IGRBCODE=212003, +YAERO_NL(6)%LMASSFIX=.true., +YAERO_NL(6)%LCOMAD=.true., +YAERO_NL(6)%LQM=.false., +YAERO_NL(6)%LQM3D=.true., +YAERO_NL(6)%BETAMFBC=-999, +YAERO_NL(6)%LADV=.true., +YAERO_NL(6)%NREQIN=0, +YAERO_NL(7)%CNAME='POMACS', +YAERO_NL(7)%IGRBCODE=212004, +YAERO_NL(7)%LMASSFIX=.true., +YAERO_NL(7)%LCOMAD=.true., +YAERO_NL(7)%LQM=.false., +YAERO_NL(7)%LQM3D=.true., +YAERO_NL(7)%BETAMFBC=-999, +YAERO_NL(7)%LADV=.true., +YAERO_NL(7)%NREQIN=0, +YAERO_NL(8)%CNAME='SSACS', +YAERO_NL(8)%IGRBCODE=212005, +YAERO_NL(8)%LMASSFIX=.true., +YAERO_NL(8)%LCOMAD=.true., +YAERO_NL(8)%LQM=.false., +YAERO_NL(8)%LQM3D=.true., +YAERO_NL(8)%BETAMFBC=-999, +YAERO_NL(8)%LADV=.true., +YAERO_NL(8)%NREQIN=0, +YAERO_NL(9)%CNAME='DUACS', +YAERO_NL(9)%IGRBCODE=212006, +YAERO_NL(9)%LMASSFIX=.true., +YAERO_NL(9)%LCOMAD=.true., +YAERO_NL(9)%LQM=.false., +YAERO_NL(9)%LQM3D=.true., +YAERO_NL(9)%BETAMFBC=-999, +YAERO_NL(9)%LADV=.true., +YAERO_NL(9)%NREQIN=0, +YAERO_NL(10)%CNAME='SOANUS', +YAERO_NL(10)%IGRBCODE=212007, +YAERO_NL(10)%LMASSFIX=.true., +YAERO_NL(10)%LCOMAD=.true., +YAERO_NL(10)%LQM=.false., +YAERO_NL(10)%LQM3D=.true., +YAERO_NL(10)%BETAMFBC=-999, +YAERO_NL(10)%LADV=.true., +YAERO_NL(10)%NREQIN=0, +YAERO_NL(11)%CNAME='SOAAIS', +YAERO_NL(11)%IGRBCODE=212008, +YAERO_NL(11)%LMASSFIX=.true., +YAERO_NL(11)%LCOMAD=.true., +YAERO_NL(11)%LQM=.false., +YAERO_NL(11)%LQM3D=.true., +YAERO_NL(11)%BETAMFBC=-999, +YAERO_NL(11)%LADV=.true., +YAERO_NL(11)%NREQIN=0, +YAERO_NL(12)%CNAME='SOAACS', +YAERO_NL(12)%IGRBCODE=212009, +YAERO_NL(12)%LMASSFIX=.true., +YAERO_NL(12)%LCOMAD=.true., +YAERO_NL(12)%LQM=.false., +YAERO_NL(12)%LQM3D=.true., +YAERO_NL(12)%BETAMFBC=-999, +YAERO_NL(12)%LADV=.true., +YAERO_NL(12)%NREQIN=0, +YAERO_NL(13)%CNAME='SOACOS', +YAERO_NL(13)%IGRBCODE=212010, +YAERO_NL(13)%LMASSFIX=.true., +YAERO_NL(13)%LCOMAD=.true., +YAERO_NL(13)%LQM=.false., +YAERO_NL(13)%LQM3D=.true., +YAERO_NL(13)%BETAMFBC=-999, +YAERO_NL(13)%LADV=.true., +YAERO_NL(13)%NREQIN=0, +YAERO_NL(14)%CNAME='SOAAII', +YAERO_NL(14)%IGRBCODE=212011, +YAERO_NL(14)%LMASSFIX=.true., +YAERO_NL(14)%LCOMAD=.true., +YAERO_NL(14)%LQM=.false., +YAERO_NL(14)%LQM3D=.true., +YAERO_NL(14)%BETAMFBC=-999, +YAERO_NL(14)%LADV=.true., +YAERO_NL(14)%NREQIN=0, +YAERO_NL(15)%CNAME='H2OPART', +YAERO_NL(15)%IGRBCODE=212012, +YAERO_NL(15)%LMASSFIX=.true., +YAERO_NL(15)%LCOMAD=.true., +YAERO_NL(15)%LQM=.false., +YAERO_NL(15)%LQM3D=.true., +YAERO_NL(15)%BETAMFBC=-999, +YAERO_NL(15)%LADV=.true., +YAERO_NL(15)%NREQIN=0, +YAERO_NL(16)%CNAME='AII_N', +YAERO_NL(16)%IGRBCODE=212013, +YAERO_NL(16)%LMASSFIX=.true., +YAERO_NL(16)%LCOMAD=.true., +YAERO_NL(16)%LQM=.false., +YAERO_NL(16)%LQM3D=.true., +YAERO_NL(16)%BETAMFBC=-999, +YAERO_NL(16)%LADV=.true., +YAERO_NL(16)%NREQIN=0, +YAERO_NL(17)%CNAME='BCAII', +YAERO_NL(17)%IGRBCODE=212014, +YAERO_NL(17)%LMASSFIX=.true., +YAERO_NL(17)%LCOMAD=.true., +YAERO_NL(17)%LQM=.false., +YAERO_NL(17)%LQM3D=.true., +YAERO_NL(17)%BETAMFBC=-999, +YAERO_NL(17)%LADV=.true., +YAERO_NL(17)%NREQIN=0, +YAERO_NL(18)%CNAME='POMAII', +YAERO_NL(18)%IGRBCODE=212015, +YAERO_NL(18)%LMASSFIX=.true., +YAERO_NL(18)%LCOMAD=.true., +YAERO_NL(18)%LQM=.false., +YAERO_NL(18)%LQM3D=.true., +YAERO_NL(18)%BETAMFBC=-999, +YAERO_NL(18)%LADV=.true., +YAERO_NL(18)%NREQIN=0, +YAERO_NL(19)%CNAME='ACI_N', +YAERO_NL(19)%IGRBCODE=212016, +YAERO_NL(19)%LMASSFIX=.true., +YAERO_NL(19)%LCOMAD=.true., +YAERO_NL(19)%LQM=.false., +YAERO_NL(19)%LQM3D=.true., +YAERO_NL(19)%BETAMFBC=-999, +YAERO_NL(19)%LADV=.true., +YAERO_NL(19)%NREQIN=0, +YAERO_NL(20)%CNAME='DUACI', +YAERO_NL(20)%IGRBCODE=212017, +YAERO_NL(20)%LMASSFIX=.true., +YAERO_NL(20)%LCOMAD=.true., +YAERO_NL(20)%LQM=.false., +YAERO_NL(20)%LQM3D=.true., +YAERO_NL(20)%BETAMFBC=-999, +YAERO_NL(20)%LADV=.true., +YAERO_NL(20)%NREQIN=0, +YAERO_NL(21)%CNAME='AIS_N', +YAERO_NL(21)%IGRBCODE=212018, +YAERO_NL(21)%LMASSFIX=.true., +YAERO_NL(21)%LCOMAD=.true., +YAERO_NL(21)%LQM=.false., +YAERO_NL(21)%LQM3D=.true., +YAERO_NL(21)%BETAMFBC=-999, +YAERO_NL(21)%LADV=.true., +YAERO_NL(21)%NREQIN=0, +YAERO_NL(22)%CNAME='SO4AIS', +YAERO_NL(22)%IGRBCODE=212019, +YAERO_NL(22)%LMASSFIX=.true., +YAERO_NL(22)%LCOMAD=.true., +YAERO_NL(22)%LQM=.false., +YAERO_NL(22)%LQM3D=.true., +YAERO_NL(22)%BETAMFBC=-999, +YAERO_NL(22)%LADV=.true., +YAERO_NL(22)%NREQIN=0, +YAERO_NL(23)%CNAME='BCAIS', +YAERO_NL(23)%IGRBCODE=212020, +YAERO_NL(23)%LMASSFIX=.true., +YAERO_NL(23)%LCOMAD=.true., +YAERO_NL(23)%LQM=.false., +YAERO_NL(23)%LQM3D=.true., +YAERO_NL(23)%BETAMFBC=-999, +YAERO_NL(23)%LADV=.true., +YAERO_NL(23)%NREQIN=0, +YAERO_NL(24)%CNAME='POMAIS', +YAERO_NL(24)%IGRBCODE=212021, +YAERO_NL(24)%LMASSFIX=.true., +YAERO_NL(24)%LCOMAD=.true., +YAERO_NL(24)%LQM=.false., +YAERO_NL(24)%LQM3D=.true., +YAERO_NL(24)%BETAMFBC=-999, +YAERO_NL(24)%LADV=.true., +YAERO_NL(24)%NREQIN=0, +YAERO_NL(25)%CNAME='COI_N', +YAERO_NL(25)%IGRBCODE=212022, +YAERO_NL(25)%LMASSFIX=.true., +YAERO_NL(25)%LCOMAD=.true., +YAERO_NL(25)%LQM=.false., +YAERO_NL(25)%LQM3D=.true., +YAERO_NL(25)%BETAMFBC=-999, +YAERO_NL(25)%LADV=.true., +YAERO_NL(25)%NREQIN=0, +YAERO_NL(26)%CNAME='DUCOI', +YAERO_NL(26)%IGRBCODE=212023, +YAERO_NL(26)%LMASSFIX=.true., +YAERO_NL(26)%LCOMAD=.true., +YAERO_NL(26)%LQM=.false., +YAERO_NL(26)%LQM3D=.true., +YAERO_NL(26)%BETAMFBC=-999, +YAERO_NL(26)%LADV=.true., +YAERO_NL(26)%NREQIN=0, +YAERO_NL(27)%CNAME='COS_N', +YAERO_NL(27)%IGRBCODE=212024, +YAERO_NL(27)%LMASSFIX=.true., +YAERO_NL(27)%LCOMAD=.true., +YAERO_NL(27)%LQM=.false., +YAERO_NL(27)%LQM3D=.true., +YAERO_NL(27)%BETAMFBC=-999, +YAERO_NL(27)%LADV=.true., +YAERO_NL(27)%NREQIN=0, +YAERO_NL(28)%CNAME='SO4COS', +YAERO_NL(28)%IGRBCODE=212025, +YAERO_NL(28)%LMASSFIX=.true., +YAERO_NL(28)%LCOMAD=.true., +YAERO_NL(28)%LQM=.false., +YAERO_NL(28)%LQM3D=.true., +YAERO_NL(28)%BETAMFBC=-999, +YAERO_NL(28)%LADV=.true., +YAERO_NL(28)%NREQIN=0, +YAERO_NL(29)%CNAME='BCCOS', +YAERO_NL(29)%IGRBCODE=212026, +YAERO_NL(29)%LMASSFIX=.true., +YAERO_NL(29)%LCOMAD=.true., +YAERO_NL(29)%LQM=.false., +YAERO_NL(29)%LQM3D=.true., +YAERO_NL(29)%BETAMFBC=-999, +YAERO_NL(29)%LADV=.true., +YAERO_NL(29)%NREQIN=0, +YAERO_NL(30)%CNAME='POMCOS', +YAERO_NL(30)%IGRBCODE=212027, +YAERO_NL(30)%LMASSFIX=.true., +YAERO_NL(30)%LCOMAD=.true., +YAERO_NL(30)%LQM=.false., +YAERO_NL(30)%LQM3D=.true., +YAERO_NL(30)%BETAMFBC=-999, +YAERO_NL(30)%LADV=.true., +YAERO_NL(30)%NREQIN=0, +YAERO_NL(31)%CNAME='SSCOS', +YAERO_NL(31)%IGRBCODE=212028, +YAERO_NL(31)%LMASSFIX=.true., +YAERO_NL(31)%LCOMAD=.true., +YAERO_NL(31)%LQM=.false., +YAERO_NL(31)%LQM3D=.true., +YAERO_NL(31)%BETAMFBC=-999, +YAERO_NL(31)%LADV=.true., +YAERO_NL(31)%NREQIN=0, +YAERO_NL(32)%CNAME='DUCOS', +YAERO_NL(32)%IGRBCODE=212029, +YAERO_NL(32)%LMASSFIX=.true., +YAERO_NL(32)%LCOMAD=.true., +YAERO_NL(32)%LQM=.false., +YAERO_NL(32)%LQM3D=.true., +YAERO_NL(32)%BETAMFBC=-999, +YAERO_NL(32)%LADV=.true., +YAERO_NL(32)%NREQIN=0, +YAERO_NL(33)%CNAME='NUS_N', +YAERO_NL(33)%IGRBCODE=212030, +YAERO_NL(33)%LMASSFIX=.true., +YAERO_NL(33)%LCOMAD=.true., +YAERO_NL(33)%LQM=.false., +YAERO_NL(33)%LQM3D=.true., +YAERO_NL(33)%BETAMFBC=-999, +YAERO_NL(33)%LADV=.true., +YAERO_NL(33)%NREQIN=0, +YAERO_NL(34)%CNAME='SO4NUS', +YAERO_NL(34)%IGRBCODE=212031, +YAERO_NL(34)%LMASSFIX=.true., +YAERO_NL(34)%LCOMAD=.true., +YAERO_NL(34)%LQM=.false., +YAERO_NL(34)%LQM3D=.true., +YAERO_NL(34)%BETAMFBC=-999, +YAERO_NL(34)%LADV=.true., +YAERO_NL(34)%NREQIN=0, +YAERO_NL(35)%CNAME='ELVOC', +YAERO_NL(35)%IGRBCODE=212032, +YAERO_NL(35)%LMASSFIX=.true., +YAERO_NL(35)%LCOMAD=.true., +YAERO_NL(35)%LQM=.false., +YAERO_NL(35)%LQM3D=.true., +YAERO_NL(35)%BETAMFBC=-999, +YAERO_NL(35)%LADV=.true., +YAERO_NL(35)%NREQIN=0, +YAERO_NL(36)%CNAME='ISVOC', +YAERO_NL(36)%IGRBCODE=212033, +YAERO_NL(36)%LMASSFIX=.true., +YAERO_NL(36)%LCOMAD=.true., +YAERO_NL(36)%LQM=.false., +YAERO_NL(36)%LQM3D=.true., +YAERO_NL(36)%BETAMFBC=-999, +YAERO_NL(36)%LADV=.true., +YAERO_NL(36)%NREQIN=0, +YAERO_NL(37)%CNAME='MSA', +YAERO_NL(37)%IGRBCODE=212034, +YAERO_NL(37)%LMASSFIX=.true., +YAERO_NL(37)%LCOMAD=.true., +YAERO_NL(37)%LQM=.false., +YAERO_NL(37)%LQM3D=.true., +YAERO_NL(37)%BETAMFBC=-999, +YAERO_NL(37)%LADV=.true., +YAERO_NL(37)%NREQIN=0, +LAERAOT=false, +LAERLISI=false, +NAEROUT=0,NAERO_WVL_DIAG=6, +NAERO_WVL_DIAG_TYPES=5, +YAERO_WVL_DIAG_NL(1)%IWVL=550, +YAERO_WVL_DIAG_NL(1)%IGRIBDIAG=210207,215104,215122,215140,215158, +YAERO_WVL_DIAG_NL(2)%IWVL=380, +YAERO_WVL_DIAG_NL(2)%IGRIBDIAG=210219,215098,215116,215134,215152, +YAERO_WVL_DIAG_NL(3)%IWVL=440, +YAERO_WVL_DIAG_NL(3)%IGRIBDIAG=210221,215100,215118,215136,215154, +YAERO_WVL_DIAG_NL(4)%IWVL=670, +YAERO_WVL_DIAG_NL(4)%IGRIBDIAG=210214,215106,215124,215142,215160, +YAERO_WVL_DIAG_NL(5)%IWVL=870, +YAERO_WVL_DIAG_NL(5)%IGRIBDIAG=210215,215109,215127,215145,215163, +YAERO_WVL_DIAG_NL(6)%IWVL=1020, +YAERO_WVL_DIAG_NL(6)%IGRIBDIAG=210227,215110,215128,215146,215164, +NCHEM=74, +YCHEM_NL(1)%CNAME='O3', +YCHEM_NL(1)%NREQIN=1, +YCHEM_NL(1)%RMOLMASS=48.0, +YCHEM_NL(1)%IGRBCODE=210203, +YCHEM_NL(1)%LNEGFIX=.TRUE., +YCHEM_NL(1)%IGRIBTC=210206, +YCHEM_NL(1)%IGRIBDV=221001, +YCHEM_NL(1)%HENRYA=1.0e-2, +YCHEM_NL(1)%HENRYB=2800.0, +YCHEM_NL(1)%LQM=.false., +YCHEM_NL(1)%LQM3D=.TRUE., +YCHEM_NL(1)%LCOMAD=.true., +YCHEM_NL(1)%LADV=.TRUE., +YCHEM_NL(1)%LMASSFIX=.TRUE., +YCHEM_NL(1)%BETAMFBC=-999.9, +YCHEM_NL(1)%LASSIM=.TRUE., +YCHEM_NL(1)%LADV5=.TRUE., +YCHEM_NL(2)%CNAME='NOx', +YCHEM_NL(2)%NREQIN=0, +YCHEM_NL(2)%RMOLMASS=14.0, +YCHEM_NL(2)%IGRBCODE=210129, +YCHEM_NL(2)%LNEGFIX=.TRUE., +YCHEM_NL(2)%IGRIBTC=210130, +YCHEM_NL(2)%LQM=.false., +YCHEM_NL(2)%LQM3D=.TRUE., +YCHEM_NL(2)%LCOMAD=.true., +YCHEM_NL(2)%LADV=.TRUE., +YCHEM_NL(2)%LMASSFIX=.TRUE., +YCHEM_NL(2)%BETAMFBC=-999.9, +YCHEM_NL(2)%LASSIM=.FALSE., +YCHEM_NL(3)%CNAME='H2O2', +YCHEM_NL(3)%NREQIN=1, +YCHEM_NL(3)%RMOLMASS=34.0, +YCHEM_NL(3)%IGRBCODE=217003, +YCHEM_NL(3)%LNEGFIX=.TRUE., +YCHEM_NL(3)%IGRIBTC=218003, +YCHEM_NL(3)%IGRIBDV=221003, +YCHEM_NL(3)%HENRYA=8.3e4, +YCHEM_NL(3)%HENRYB=7600.0, +YCHEM_NL(3)%LQM=.false., +YCHEM_NL(3)%LQM3D=.TRUE., +YCHEM_NL(3)%LCOMAD=.true., +YCHEM_NL(3)%LADV=.TRUE., +YCHEM_NL(3)%LMASSFIX=.TRUE., +YCHEM_NL(3)%BETAMFBC=-999.9, +YCHEM_NL(3)%LASSIM=.FALSE., +YCHEM_NL(4)%CNAME='CH4', +YCHEM_NL(4)%NREQIN=1, +YCHEM_NL(4)%RMOLMASS=16.0, +YCHEM_NL(4)%IGRBCODE=217004, +YCHEM_NL(4)%LNEGFIX=.TRUE., +YCHEM_NL(4)%IGRIBTC=218004, +YCHEM_NL(4)%LQM=.false., +YCHEM_NL(4)%LQM3D=.TRUE., +YCHEM_NL(4)%LCOMAD=.true., +YCHEM_NL(4)%LADV=.TRUE., +YCHEM_NL(4)%LMASSFIX=.TRUE., +YCHEM_NL(4)%BETAMFBC=-999.9, +YCHEM_NL(4)%LASSIM=.FALSE., +YCHEM_NL(5)%CNAME='CO', +YCHEM_NL(5)%NREQIN=1, +YCHEM_NL(5)%RMOLMASS=28.0, +YCHEM_NL(5)%IGRBCODE=210123, +YCHEM_NL(5)%LNEGFIX=.TRUE., +YCHEM_NL(5)%IGRIBTC=210127, +YCHEM_NL(5)%IGRIBDV=221005, +YCHEM_NL(5)%HENRYA=9.7e-4, +YCHEM_NL(5)%HENRYB=1300.0, +YCHEM_NL(5)%LQM=.false., +YCHEM_NL(5)%LQM3D=.TRUE., +YCHEM_NL(5)%LCOMAD=.true., +YCHEM_NL(5)%LADV=.TRUE., +YCHEM_NL(5)%LMASSFIX=.TRUE., +YCHEM_NL(5)%BETAMFBC=-999.9, +YCHEM_NL(5)%LASSIM=.TRUE., +YCHEM_NL(5)%LADV5=.TRUE., +YCHEM_NL(6)%CNAME='HNO3', +YCHEM_NL(6)%NREQIN=1, +YCHEM_NL(6)%RMOLMASS=63.0, +YCHEM_NL(6)%IGRBCODE=217006, +YCHEM_NL(6)%LNEGFIX=.TRUE., +YCHEM_NL(6)%IGRIBTC=218006, +YCHEM_NL(6)%IGRIBDV=221006, +YCHEM_NL(6)%HENRYA=3.2e11, +YCHEM_NL(6)%HENRYB=8700.0, +YCHEM_NL(6)%LQM=.false., +YCHEM_NL(6)%LQM3D=.TRUE., +YCHEM_NL(6)%LCOMAD=.true., +YCHEM_NL(6)%LADV=.TRUE., +YCHEM_NL(6)%LMASSFIX=.TRUE., +YCHEM_NL(6)%BETAMFBC=-999.9, +YCHEM_NL(6)%LASSIM=.FALSE., +YCHEM_NL(7)%CNAME='CH3OOH', +YCHEM_NL(7)%NREQIN=1, +YCHEM_NL(7)%RMOLMASS=48.0, +YCHEM_NL(7)%IGRBCODE=217007, +YCHEM_NL(7)%LNEGFIX=.TRUE., +YCHEM_NL(7)%IGRIBTC=218007, +YCHEM_NL(7)%IGRIBDV=221007, +YCHEM_NL(7)%HENRYA=2.9e2, +YCHEM_NL(7)%HENRYB=5200.0, +YCHEM_NL(7)%LQM=.false., +YCHEM_NL(7)%LQM3D=.TRUE., +YCHEM_NL(7)%LCOMAD=.true., +YCHEM_NL(7)%LADV=.TRUE., +YCHEM_NL(7)%LMASSFIX=.TRUE., +YCHEM_NL(7)%BETAMFBC=-999.9, +YCHEM_NL(7)%LASSIM=.FALSE., +YCHEM_NL(8)%CNAME='CH2O', +YCHEM_NL(8)%NREQIN=1, +YCHEM_NL(8)%RMOLMASS=30.0, +YCHEM_NL(8)%IGRBCODE=210124, +YCHEM_NL(8)%LNEGFIX=.TRUE., +YCHEM_NL(8)%IGRIBTC=210128, +YCHEM_NL(8)%IGRIBDV=221008, +YCHEM_NL(8)%HENRYA=3.2e3, +YCHEM_NL(8)%HENRYB=6800.0, +YCHEM_NL(8)%LQM=.false., +YCHEM_NL(8)%LQM3D=.TRUE., +YCHEM_NL(8)%LCOMAD=.true., +YCHEM_NL(8)%LADV=.TRUE., +YCHEM_NL(8)%LMASSFIX=.TRUE., +YCHEM_NL(8)%BETAMFBC=-999.9, +YCHEM_NL(8)%LASSIM=.TRUE., +YCHEM_NL(8)%LADV5=.TRUE., +YCHEM_NL(9)%CNAME='PAR', +YCHEM_NL(9)%NREQIN=1, +YCHEM_NL(9)%RMOLMASS=12.0, +YCHEM_NL(9)%IGRBCODE=217009, +YCHEM_NL(9)%LNEGFIX=.TRUE., +YCHEM_NL(9)%IGRIBTC=218009, +YCHEM_NL(9)%LQM=.false., +YCHEM_NL(9)%LQM3D=.TRUE., +YCHEM_NL(9)%LCOMAD=.true., +YCHEM_NL(9)%LADV=.TRUE., +YCHEM_NL(9)%LMASSFIX=.TRUE., +YCHEM_NL(9)%BETAMFBC=-999.9, +YCHEM_NL(9)%LASSIM=.FALSE., +YCHEM_NL(10)%CNAME='C2H4', +YCHEM_NL(10)%NREQIN=1, +YCHEM_NL(10)%RMOLMASS=28.0, +YCHEM_NL(10)%IGRBCODE=217010, +YCHEM_NL(10)%LNEGFIX=.TRUE., +YCHEM_NL(10)%IGRIBTC=218010, +YCHEM_NL(10)%LQM=.false., +YCHEM_NL(10)%LQM3D=.TRUE., +YCHEM_NL(10)%LCOMAD=.true., +YCHEM_NL(10)%LADV=.TRUE., +YCHEM_NL(10)%LMASSFIX=.TRUE., +YCHEM_NL(10)%BETAMFBC=-999.9, +YCHEM_NL(10)%LASSIM=.FALSE., +YCHEM_NL(11)%CNAME='OLE', +YCHEM_NL(11)%NREQIN=1, +YCHEM_NL(11)%RMOLMASS=24.0, +YCHEM_NL(11)%IGRBCODE=217011, +YCHEM_NL(11)%LNEGFIX=.TRUE., +YCHEM_NL(11)%IGRIBTC=218011, +YCHEM_NL(11)%LQM=.false., +YCHEM_NL(11)%LQM3D=.TRUE., +YCHEM_NL(11)%LCOMAD=.true., +YCHEM_NL(11)%LADV=.TRUE., +YCHEM_NL(11)%LMASSFIX=.TRUE., +YCHEM_NL(11)%BETAMFBC=-999.9, +YCHEM_NL(11)%LASSIM=.FALSE., +YCHEM_NL(12)%CNAME='ALD2', +YCHEM_NL(12)%NREQIN=1, +YCHEM_NL(12)%RMOLMASS=24.0, +YCHEM_NL(12)%IGRBCODE=217012, +YCHEM_NL(12)%LNEGFIX=.TRUE., +YCHEM_NL(12)%IGRIBTC=218012, +YCHEM_NL(12)%IGRIBDV=221012, +YCHEM_NL(12)%HENRYA=17.0, +YCHEM_NL(12)%HENRYB=5000.0, +YCHEM_NL(12)%LQM=.false., +YCHEM_NL(12)%LQM3D=.TRUE., +YCHEM_NL(12)%LCOMAD=.true., +YCHEM_NL(12)%LADV=.TRUE., +YCHEM_NL(12)%LMASSFIX=.TRUE., +YCHEM_NL(12)%BETAMFBC=-999.9, +YCHEM_NL(12)%LASSIM=.FALSE., +YCHEM_NL(13)%CNAME='PAN', +YCHEM_NL(13)%NREQIN=1, +YCHEM_NL(13)%RMOLMASS=121.0, +YCHEM_NL(13)%IGRBCODE=217013, +YCHEM_NL(13)%LNEGFIX=.TRUE., +YCHEM_NL(13)%IGRIBTC=218013, +YCHEM_NL(13)%IGRIBDV=221013, +YCHEM_NL(13)%HENRYA=2.9e+0, +YCHEM_NL(13)%HENRYB=5700.0, +YCHEM_NL(13)%LQM=.false., +YCHEM_NL(13)%LQM3D=.TRUE., +YCHEM_NL(13)%LCOMAD=.true., +YCHEM_NL(13)%LADV=.TRUE., +YCHEM_NL(13)%LMASSFIX=.TRUE., +YCHEM_NL(13)%BETAMFBC=-999.9, +YCHEM_NL(13)%LASSIM=.FALSE., +YCHEM_NL(14)%CNAME='ROOH', +YCHEM_NL(14)%NREQIN=1, +YCHEM_NL(14)%RMOLMASS=47.0, +YCHEM_NL(14)%IGRBCODE=217014, +YCHEM_NL(14)%LNEGFIX=.TRUE., +YCHEM_NL(14)%IGRIBTC=218014, +YCHEM_NL(14)%IGRIBDV=221014, +YCHEM_NL(14)%HENRYA=340.0, +YCHEM_NL(14)%HENRYB=6000.0, +YCHEM_NL(14)%LQM=.false., +YCHEM_NL(14)%LQM3D=.TRUE., +YCHEM_NL(14)%LCOMAD=.true., +YCHEM_NL(14)%LADV=.TRUE., +YCHEM_NL(14)%LMASSFIX=.TRUE., +YCHEM_NL(14)%BETAMFBC=-999.9, +YCHEM_NL(14)%LASSIM=.FALSE., +YCHEM_NL(15)%CNAME='ONIT', +YCHEM_NL(15)%NREQIN=1, +YCHEM_NL(15)%RMOLMASS=77.0, +YCHEM_NL(15)%IGRBCODE=217015, +YCHEM_NL(15)%LNEGFIX=.TRUE., +YCHEM_NL(15)%IGRIBTC=218015, +YCHEM_NL(15)%IGRIBDV=221015, +YCHEM_NL(15)%HENRYA=1.0e3, +YCHEM_NL(15)%HENRYB=6485., +YCHEM_NL(15)%LQM=.false., +YCHEM_NL(15)%LQM3D=.TRUE., +YCHEM_NL(15)%LCOMAD=.true., +YCHEM_NL(15)%LADV=.TRUE., +YCHEM_NL(15)%LMASSFIX=.TRUE., +YCHEM_NL(15)%BETAMFBC=-999.9, +YCHEM_NL(15)%LASSIM=.FALSE., +YCHEM_NL(16)%CNAME='C5H8', +YCHEM_NL(16)%NREQIN=1, +YCHEM_NL(16)%RMOLMASS=68.1, +YCHEM_NL(16)%IGRBCODE=217016, +YCHEM_NL(16)%LNEGFIX=.TRUE., +YCHEM_NL(16)%IGRIBTC=218016, +YCHEM_NL(16)%IGRIBDV=221016, +YCHEM_NL(16)%HENRYA=1.3e-2, +YCHEM_NL(16)%HENRYB=0.0, +YCHEM_NL(16)%LQM=.false., +YCHEM_NL(16)%LQM3D=.TRUE., +YCHEM_NL(16)%LCOMAD=.true., +YCHEM_NL(16)%LADV=.TRUE., +YCHEM_NL(16)%LMASSFIX=.TRUE., +YCHEM_NL(16)%BETAMFBC=-999.9, +YCHEM_NL(16)%LASSIM=.FALSE., +YCHEM_NL(17)%CNAME='SO2', +YCHEM_NL(17)%NREQIN=1, +YCHEM_NL(17)%RMOLMASS=64.1, +YCHEM_NL(17)%IGRBCODE=210122, +YCHEM_NL(17)%LNEGFIX=.TRUE., +YCHEM_NL(17)%IGRIBTC=210126, +YCHEM_NL(17)%IGRIBDV=221017, +YCHEM_NL(17)%HENRYA=1.0e5, +YCHEM_NL(17)%HENRYB=3000.0, +YCHEM_NL(17)%LQM=.false., +YCHEM_NL(17)%LQM3D=.TRUE., +YCHEM_NL(17)%LCOMAD=.true., +YCHEM_NL(17)%LADV=.TRUE., +YCHEM_NL(17)%LMASSFIX=.TRUE., +YCHEM_NL(17)%BETAMFBC=-999.9, +YCHEM_NL(17)%LASSIM=.TRUE., +YCHEM_NL(17)%LADV5=.TRUE., +YCHEM_NL(18)%CNAME='DMS', +YCHEM_NL(18)%NREQIN=1, +YCHEM_NL(18)%RMOLMASS=62.1, +YCHEM_NL(18)%IGRBCODE=217018, +YCHEM_NL(18)%LNEGFIX=.TRUE., +YCHEM_NL(18)%IGRIBTC=218018, +YCHEM_NL(18)%LQM=.false., +YCHEM_NL(18)%LQM3D=.TRUE., +YCHEM_NL(18)%LCOMAD=.true., +YCHEM_NL(18)%LADV=.TRUE., +YCHEM_NL(18)%LMASSFIX=.TRUE., +YCHEM_NL(18)%BETAMFBC=-999.9, +YCHEM_NL(18)%LASSIM=.FALSE., +YCHEM_NL(19)%CNAME='NH3', +YCHEM_NL(19)%NREQIN=1, +YCHEM_NL(19)%RMOLMASS=17.0, +YCHEM_NL(19)%IGRBCODE=217019, +YCHEM_NL(19)%LNEGFIX=.TRUE., +YCHEM_NL(19)%IGRIBTC=218019, +YCHEM_NL(19)%IGRIBDV=221019, +YCHEM_NL(19)%HENRYA=59.0, +YCHEM_NL(19)%HENRYB=4200.0, +YCHEM_NL(19)%LQM=.false., +YCHEM_NL(19)%LQM3D=.TRUE., +YCHEM_NL(19)%LCOMAD=.true., +YCHEM_NL(19)%LADV=.TRUE., +YCHEM_NL(19)%LMASSFIX=.TRUE., +YCHEM_NL(19)%BETAMFBC=-999.9, +YCHEM_NL(19)%LASSIM=.FALSE., +YCHEM_NL(20)%CNAME='SO4', +YCHEM_NL(20)%NREQIN=-1, +YCHEM_NL(20)%RMOLMASS=96.1, +YCHEM_NL(20)%IGRBCODE=217020, +YCHEM_NL(20)%LNEGFIX=.TRUE., +YCHEM_NL(20)%IGRIBTC=218020, +YCHEM_NL(20)%IGRIBDV=221020, +YCHEM_NL(20)%HENRYA=3.2e11, +YCHEM_NL(20)%HENRYB=8700.0, +YCHEM_NL(20)%LQM=.false., +YCHEM_NL(20)%LQM3D=.TRUE., +YCHEM_NL(20)%LCOMAD=.true., +YCHEM_NL(20)%LADV=.TRUE., +YCHEM_NL(20)%LMASSFIX=.TRUE., +YCHEM_NL(20)%BETAMFBC=-999.9, +YCHEM_NL(20)%LASSIM=.FALSE., +YCHEM_NL(21)%CNAME='NH4', +YCHEM_NL(21)%NREQIN=1, +YCHEM_NL(21)%RMOLMASS=18.0, +YCHEM_NL(21)%IGRBCODE=217021, +YCHEM_NL(21)%LNEGFIX=.TRUE., +YCHEM_NL(21)%IGRIBTC=218021, +YCHEM_NL(21)%IGRIBDV=221021, +YCHEM_NL(21)%HENRYA=3.2e11, +YCHEM_NL(21)%HENRYB=8700.0, +YCHEM_NL(21)%LQM=.false., +YCHEM_NL(21)%LQM3D=.TRUE., +YCHEM_NL(21)%LCOMAD=.true., +YCHEM_NL(21)%LADV=.TRUE., +YCHEM_NL(21)%LMASSFIX=.TRUE., +YCHEM_NL(21)%BETAMFBC=-999.9, +YCHEM_NL(21)%LASSIM=.FALSE., +YCHEM_NL(22)%CNAME='MSA', +YCHEM_NL(22)%NREQIN=1, +YCHEM_NL(22)%RMOLMASS=96.1, +YCHEM_NL(22)%IGRBCODE=217022, +YCHEM_NL(22)%LNEGFIX=.TRUE., +YCHEM_NL(22)%IGRIBTC=218022, +YCHEM_NL(22)%HENRYA=3.2e11, +YCHEM_NL(22)%HENRYB=8700.0, +YCHEM_NL(22)%LQM=.false., +YCHEM_NL(22)%LQM3D=.TRUE., +YCHEM_NL(22)%LCOMAD=.true., +YCHEM_NL(22)%LADV=.TRUE., +YCHEM_NL(22)%LMASSFIX=.TRUE., +YCHEM_NL(22)%BETAMFBC=-999.9, +YCHEM_NL(22)%LASSIM=.FALSE., +YCHEM_NL(23)%CNAME='CH3COCHO', +YCHEM_NL(23)%NREQIN=1, +YCHEM_NL(23)%RMOLMASS=72.1, +YCHEM_NL(23)%IGRBCODE=217023, +YCHEM_NL(23)%LNEGFIX=.TRUE., +YCHEM_NL(23)%IGRIBTC=218023, +YCHEM_NL(23)%IGRIBDV=221023, +YCHEM_NL(23)%HENRYA=3.4e3, +YCHEM_NL(23)%HENRYB=7500.0, +YCHEM_NL(23)%LQM=.false., +YCHEM_NL(23)%LQM3D=.TRUE., +YCHEM_NL(23)%LCOMAD=.true., +YCHEM_NL(23)%LADV=.TRUE., +YCHEM_NL(23)%LMASSFIX=.TRUE., +YCHEM_NL(23)%BETAMFBC=-999.9, +YCHEM_NL(23)%LASSIM=.FALSE., +YCHEM_NL(24)%CNAME='O3S', +YCHEM_NL(24)%NREQIN=1, +YCHEM_NL(24)%RMOLMASS=48.0, +YCHEM_NL(24)%IGRBCODE=217024, +YCHEM_NL(24)%LNEGFIX=.TRUE., +YCHEM_NL(24)%IGRIBTC=218024, +YCHEM_NL(24)%IGRIBDV=221024, +YCHEM_NL(24)%HENRYA=1.0e-2, +YCHEM_NL(24)%HENRYB=2800.0, +YCHEM_NL(24)%LQM=.false., +YCHEM_NL(24)%LQM3D=.TRUE., +YCHEM_NL(24)%LCOMAD=.true., +YCHEM_NL(24)%LADV=.TRUE., +YCHEM_NL(24)%LMASSFIX=.TRUE., +YCHEM_NL(24)%BETAMFBC=-999.9, +YCHEM_NL(24)%LASSIM=.FALSE., +YCHEM_NL(25)%CNAME='Rn', +YCHEM_NL(25)%NREQIN=1, +YCHEM_NL(25)%RMOLMASS=222.0, +YCHEM_NL(25)%IGRBCODE=210181, +YCHEM_NL(25)%LNEGFIX=.TRUE., +YCHEM_NL(25)%IGRIBTC=210183, +YCHEM_NL(25)%LQM=.false., +YCHEM_NL(25)%LQM3D=.TRUE., +YCHEM_NL(25)%LCOMAD=.true., +YCHEM_NL(25)%LADV=.TRUE., +YCHEM_NL(25)%LMASSFIX=.TRUE., +YCHEM_NL(25)%BETAMFBC=-999.9, +YCHEM_NL(25)%LASSIM=.FALSE., +YCHEM_NL(26)%CNAME='Pb', +YCHEM_NL(26)%NREQIN=1, +YCHEM_NL(26)%RMOLMASS=210.0, +YCHEM_NL(26)%IGRBCODE=217026, +YCHEM_NL(26)%LNEGFIX=.TRUE., +YCHEM_NL(26)%IGRIBTC=218026, +YCHEM_NL(26)%HENRYA=3.2e11, +YCHEM_NL(26)%HENRYB=8700.0, +YCHEM_NL(26)%LQM=.false., +YCHEM_NL(26)%LQM3D=.TRUE., +YCHEM_NL(26)%LCOMAD=.true., +YCHEM_NL(26)%LADV=.TRUE., +YCHEM_NL(26)%LMASSFIX=.TRUE., +YCHEM_NL(26)%BETAMFBC=-999.9, +YCHEM_NL(26)%LASSIM=.FALSE., +YCHEM_NL(27)%CNAME='NO', +YCHEM_NL(27)%NREQIN=1, +YCHEM_NL(27)%RMOLMASS=30.0, +YCHEM_NL(27)%IGRBCODE=217027, +YCHEM_NL(27)%LNEGFIX=.TRUE., +YCHEM_NL(27)%IGRIBTC=218027, +YCHEM_NL(27)%IGRIBDV=221027, +YCHEM_NL(27)%HENRYA=1.9e-3, +YCHEM_NL(27)%HENRYB=1600.0, +YCHEM_NL(27)%LQM=.false., +YCHEM_NL(27)%LQM3D=.TRUE., +YCHEM_NL(27)%LCOMAD=.true., +YCHEM_NL(27)%LADV=.TRUE., +YCHEM_NL(27)%LMASSFIX=.FALSE., +YCHEM_NL(27)%LASSIM=.FALSE., +YCHEM_NL(27)%LADV5=.TRUE., +YCHEM_NL(28)%CNAME='HO2', +YCHEM_NL(28)%NREQIN=1, +YCHEM_NL(28)%RMOLMASS=33.0, +YCHEM_NL(28)%IGRBCODE=217028, +YCHEM_NL(28)%LNEGFIX=.TRUE., +YCHEM_NL(28)%IGRIBTC=218028, +YCHEM_NL(28)%IGRIBDV=221028, +YCHEM_NL(28)%HENRYA=6.8e2, +YCHEM_NL(28)%HENRYB=0.0, +YCHEM_NL(28)%LQM=.false., +YCHEM_NL(28)%LQM3D=.TRUE., +YCHEM_NL(28)%LCOMAD=.true., +YCHEM_NL(28)%LADV=.FALSE., +YCHEM_NL(28)%LMASSFIX=.FALSE., +YCHEM_NL(28)%LMASSFIX=.FALSE., +YCHEM_NL(28)%LASSIM=.FALSE., +YCHEM_NL(29)%CNAME='CH3O2', +YCHEM_NL(29)%NREQIN=1, +YCHEM_NL(29)%RMOLMASS=47.0, +YCHEM_NL(29)%IGRBCODE=217029, +YCHEM_NL(29)%LNEGFIX=.TRUE., +YCHEM_NL(29)%IGRIBTC=218029, +YCHEM_NL(29)%IGRIBDV=221029, +YCHEM_NL(29)%HENRYA=1.5e1, +YCHEM_NL(29)%HENRYB=3700.0, +YCHEM_NL(29)%LQM=.false., +YCHEM_NL(29)%LQM3D=.TRUE., +YCHEM_NL(29)%LCOMAD=.true., +YCHEM_NL(29)%LADV=.FALSE., +YCHEM_NL(29)%LMASSFIX=.FALSE., +YCHEM_NL(29)%LMASSFIX=.FALSE., +YCHEM_NL(29)%LASSIM=.FALSE., +YCHEM_NL(30)%CNAME='OH', +YCHEM_NL(30)%NREQIN=1, +YCHEM_NL(30)%RMOLMASS=17.0, +YCHEM_NL(30)%IGRBCODE=217030, +YCHEM_NL(30)%LNEGFIX=.TRUE., +YCHEM_NL(30)%IGRIBTC=218030, +YCHEM_NL(30)%LQM=.false., +YCHEM_NL(30)%LQM3D=.TRUE., +YCHEM_NL(30)%LCOMAD=.true., +YCHEM_NL(30)%LADV=.FALSE., +YCHEM_NL(30)%LMASSFIX=.FALSE., +YCHEM_NL(30)%LMASSFIX=.FALSE., +YCHEM_NL(30)%LASSIM=.FALSE., +YCHEM_NL(30)%LADV5=.TRUE., +YCHEM_NL(31)%CNAME='NO2', +YCHEM_NL(31)%NREQIN=1, +YCHEM_NL(31)%RMOLMASS=46.0, +YCHEM_NL(31)%IGRBCODE=210121, +YCHEM_NL(31)%LNEGFIX=.TRUE., +YCHEM_NL(31)%IGRIBTC=210125, +YCHEM_NL(31)%IGRIBDV=221031, +YCHEM_NL(31)%HENRYA=1.2e-2, +YCHEM_NL(31)%HENRYB=2400.0, +YCHEM_NL(31)%LQM=.false., +YCHEM_NL(31)%LQM3D=.TRUE., +YCHEM_NL(31)%LCOMAD=.true., +YCHEM_NL(31)%LADV=.TRUE., +YCHEM_NL(31)%LMASSFIX=.FALSE., +YCHEM_NL(31)%LASSIM=.TRUE., +YCHEM_NL(31)%LADV5=.TRUE., +YCHEM_NL(32)%CNAME='NO3', +YCHEM_NL(32)%NREQIN=1, +YCHEM_NL(32)%RMOLMASS=62.0, +YCHEM_NL(32)%IGRBCODE=217032, +YCHEM_NL(32)%LNEGFIX=.TRUE., +YCHEM_NL(32)%IGRIBTC=218032, +YCHEM_NL(32)%IGRIBDV=221032, +YCHEM_NL(32)%HENRYA=3.8e-2, +YCHEM_NL(32)%HENRYB=0., +YCHEM_NL(32)%LQM=.false., +YCHEM_NL(32)%LQM3D=.TRUE., +YCHEM_NL(32)%LCOMAD=.true., +YCHEM_NL(32)%LADV=.TRUE., +YCHEM_NL(32)%LMASSFIX=.FALSE., +YCHEM_NL(32)%LASSIM=.FALSE., +YCHEM_NL(33)%CNAME='N2O5', +YCHEM_NL(33)%NREQIN=1, +YCHEM_NL(33)%RMOLMASS=108.0, +YCHEM_NL(33)%IGRBCODE=217033, +YCHEM_NL(33)%LNEGFIX=.TRUE., +YCHEM_NL(33)%IGRIBTC=218033, +YCHEM_NL(33)%IGRIBDV=221033, +YCHEM_NL(33)%HENRYA=2.1e+1, +YCHEM_NL(33)%HENRYB=3400.0, +YCHEM_NL(33)%LQM=.false., +YCHEM_NL(33)%LQM3D=.TRUE., +YCHEM_NL(33)%LCOMAD=.true., +YCHEM_NL(33)%LADV=.TRUE., +YCHEM_NL(33)%LMASSFIX=.TRUE., +YCHEM_NL(33)%BETAMFBC=-999.9, +YCHEM_NL(33)%LASSIM=.FALSE., +YCHEM_NL(34)%CNAME='HO2NO2', +YCHEM_NL(34)%NREQIN=1, +YCHEM_NL(34)%RMOLMASS=79.0, +YCHEM_NL(34)%IGRBCODE=217034, +YCHEM_NL(34)%LNEGFIX=.TRUE., +YCHEM_NL(34)%IGRIBTC=218034, +YCHEM_NL(34)%IGRIBDV=221034, +YCHEM_NL(34)%HENRYA=1.2e+4, +YCHEM_NL(34)%HENRYB=6900.0, +YCHEM_NL(34)%LQM=.false., +YCHEM_NL(34)%LQM3D=.TRUE., +YCHEM_NL(34)%LCOMAD=.true., +YCHEM_NL(34)%LADV=.TRUE., +YCHEM_NL(34)%LMASSFIX=.TRUE., +YCHEM_NL(34)%BETAMFBC=-999.9, +YCHEM_NL(34)%LASSIM=.FALSE., +YCHEM_NL(35)%CNAME='C2O3', +YCHEM_NL(35)%NREQIN=1, +YCHEM_NL(35)%RMOLMASS=75.0, +YCHEM_NL(35)%IGRBCODE=217035, +YCHEM_NL(35)%LNEGFIX=.TRUE., +YCHEM_NL(35)%IGRIBTC=218035, +YCHEM_NL(35)%LQM=.false., +YCHEM_NL(35)%LQM3D=.TRUE., +YCHEM_NL(35)%LCOMAD=.true., +YCHEM_NL(35)%LADV=.FALSE., +YCHEM_NL(35)%LMASSFIX=.FALSE., +YCHEM_NL(35)%LMASSFIX=.FALSE., +YCHEM_NL(35)%LASSIM=.FALSE., +YCHEM_NL(36)%CNAME='ROR', +YCHEM_NL(36)%NREQIN=1, +YCHEM_NL(36)%RMOLMASS=28.0, +YCHEM_NL(36)%IGRBCODE=217036, +YCHEM_NL(36)%LNEGFIX=.TRUE., +YCHEM_NL(36)%IGRIBTC=218036, +YCHEM_NL(36)%LQM=.false., +YCHEM_NL(36)%LQM3D=.TRUE., +YCHEM_NL(36)%LCOMAD=.true., +YCHEM_NL(36)%LADV=.FALSE., +YCHEM_NL(36)%LMASSFIX=.FALSE., +YCHEM_NL(36)%LMASSFIX=.FALSE., +YCHEM_NL(36)%LASSIM=.FALSE., +YCHEM_NL(37)%CNAME='RXPAR', +YCHEM_NL(37)%NREQIN=1, +YCHEM_NL(37)%RMOLMASS=12.0, +YCHEM_NL(37)%IGRBCODE=217037, +YCHEM_NL(37)%LNEGFIX=.TRUE., +YCHEM_NL(37)%IGRIBTC=218037, +YCHEM_NL(37)%LQM=.false., +YCHEM_NL(37)%LQM3D=.TRUE., +YCHEM_NL(37)%LCOMAD=.true., +YCHEM_NL(37)%LADV=.FALSE., +YCHEM_NL(37)%LMASSFIX=.FALSE., +YCHEM_NL(37)%LMASSFIX=.FALSE., +YCHEM_NL(37)%LASSIM=.FALSE., +YCHEM_NL(38)%CNAME='XO2', +YCHEM_NL(38)%NREQIN=1, +YCHEM_NL(38)%RMOLMASS=44.0, +YCHEM_NL(38)%IGRBCODE=217038, +YCHEM_NL(38)%LNEGFIX=.TRUE., +YCHEM_NL(38)%IGRIBTC=218038, +YCHEM_NL(38)%LQM=.false., +YCHEM_NL(38)%LQM3D=.TRUE., +YCHEM_NL(38)%LCOMAD=.true., +YCHEM_NL(38)%LADV=.FALSE., +YCHEM_NL(38)%LMASSFIX=.FALSE., +YCHEM_NL(38)%LMASSFIX=.FALSE., +YCHEM_NL(38)%LASSIM=.FALSE., +YCHEM_NL(39)%CNAME='XO2N', +YCHEM_NL(39)%NREQIN=1, +YCHEM_NL(39)%RMOLMASS=44.0, +YCHEM_NL(39)%IGRBCODE=217039, +YCHEM_NL(39)%LNEGFIX=.TRUE., +YCHEM_NL(39)%IGRIBTC=218039, +YCHEM_NL(39)%LQM=.false., +YCHEM_NL(39)%LQM3D=.TRUE., +YCHEM_NL(39)%LCOMAD=.true., +YCHEM_NL(39)%LADV=.FALSE., +YCHEM_NL(39)%LMASSFIX=.FALSE., +YCHEM_NL(39)%LMASSFIX=.FALSE., +YCHEM_NL(39)%LASSIM=.FALSE., +YCHEM_NL(40)%CNAME='NH2', +YCHEM_NL(40)%NREQIN=1, +YCHEM_NL(40)%RMOLMASS=16.0, +YCHEM_NL(40)%IGRBCODE=217040, +YCHEM_NL(40)%LNEGFIX=.TRUE., +YCHEM_NL(40)%IGRIBTC=218040, +YCHEM_NL(40)%LQM=.false., +YCHEM_NL(40)%LQM3D=.TRUE., +YCHEM_NL(40)%LCOMAD=.true., +YCHEM_NL(40)%LADV=.FALSE., +YCHEM_NL(40)%LMASSFIX=.FALSE., +YCHEM_NL(40)%LMASSFIX=.FALSE., +YCHEM_NL(40)%LASSIM=.FALSE., +YCHEM_NL(41)%CNAME='PSC', +YCHEM_NL(41)%NREQIN=0, +YCHEM_NL(41)%RMOLMASS=1.0, +YCHEM_NL(41)%IGRBCODE=217041, +YCHEM_NL(41)%LNEGFIX=.TRUE., +YCHEM_NL(41)%IGRIBTC=218041, +YCHEM_NL(41)%LQM=.false., +YCHEM_NL(41)%LQM3D=.TRUE., +YCHEM_NL(41)%LCOMAD=.true., +YCHEM_NL(41)%LADV=.TRUE., +YCHEM_NL(41)%LMASSFIX=.FALSE., +YCHEM_NL(41)%REFVALI=0.0, +YCHEM_NL(41)%NREQIN=-1, +YCHEM_NL(41)%LASSIM=.FALSE., +YCHEM_NL(42)%CNAME='CH3OH', +YCHEM_NL(42)%NREQIN=1, +YCHEM_NL(42)%RMOLMASS=31.01, +YCHEM_NL(42)%IGRBCODE=217042, +YCHEM_NL(42)%LNEGFIX=.TRUE., +YCHEM_NL(42)%IGRIBTC=218042, +YCHEM_NL(42)%IGRIBDV=221042, +YCHEM_NL(42)%HENRYA=200.0, +YCHEM_NL(42)%HENRYB=5600.0, +YCHEM_NL(42)%LQM=.false., +YCHEM_NL(42)%LQM3D=.TRUE., +YCHEM_NL(42)%LCOMAD=.true., +YCHEM_NL(42)%LADV=.TRUE., +YCHEM_NL(42)%LMASSFIX=.TRUE., +YCHEM_NL(42)%BETAMFBC=-999.9, +YCHEM_NL(42)%LASSIM=.FALSE., +YCHEM_NL(43)%CNAME='HCOOH', +YCHEM_NL(43)%NREQIN=1, +YCHEM_NL(43)%RMOLMASS=46.01, +YCHEM_NL(43)%IGRBCODE=217043, +YCHEM_NL(43)%LNEGFIX=.TRUE., +YCHEM_NL(43)%IGRIBTC=218043, +YCHEM_NL(43)%IGRIBDV=221043, +YCHEM_NL(43)%HENRYA=8.8e3, +YCHEM_NL(43)%HENRYB=6100.0, +YCHEM_NL(43)%LQM=.false., +YCHEM_NL(43)%LQM3D=.TRUE., +YCHEM_NL(43)%LCOMAD=.true., +YCHEM_NL(43)%LADV=.TRUE., +YCHEM_NL(43)%LMASSFIX=.TRUE., +YCHEM_NL(43)%BETAMFBC=-999.9, +YCHEM_NL(43)%LASSIM=.FALSE., +YCHEM_NL(44)%CNAME='MCOOH', +YCHEM_NL(44)%NREQIN=1, +YCHEM_NL(44)%RMOLMASS=62.02, +YCHEM_NL(44)%IGRBCODE=217044, +YCHEM_NL(44)%LNEGFIX=.TRUE., +YCHEM_NL(44)%IGRIBTC=218044, +YCHEM_NL(44)%IGRIBDV=221044, +YCHEM_NL(44)%HENRYA=4.1e3, +YCHEM_NL(44)%HENRYB=6300.0, +YCHEM_NL(44)%LQM=.false., +YCHEM_NL(44)%LQM3D=.TRUE., +YCHEM_NL(44)%LCOMAD=.true., +YCHEM_NL(44)%LADV=.TRUE., +YCHEM_NL(44)%LMASSFIX=.TRUE., +YCHEM_NL(44)%BETAMFBC=-999.9, +YCHEM_NL(44)%LASSIM=.FALSE., +YCHEM_NL(45)%CNAME='C2H6', +YCHEM_NL(45)%NREQIN=1, +YCHEM_NL(45)%RMOLMASS=30.02, +YCHEM_NL(45)%IGRBCODE=217045, +YCHEM_NL(45)%LNEGFIX=.TRUE., +YCHEM_NL(45)%IGRIBTC=218045, +YCHEM_NL(45)%IGRIBDV=221045, +YCHEM_NL(45)%HENRYA=1.9e-3, +YCHEM_NL(45)%HENRYB=2400.0, +YCHEM_NL(45)%LQM=.false., +YCHEM_NL(45)%LQM3D=.TRUE., +YCHEM_NL(45)%LCOMAD=.true., +YCHEM_NL(45)%LADV=.TRUE., +YCHEM_NL(45)%LMASSFIX=.TRUE., +YCHEM_NL(45)%BETAMFBC=-999.9, +YCHEM_NL(45)%LASSIM=.FALSE., +YCHEM_NL(46)%CNAME='C2H5OH', +YCHEM_NL(46)%NREQIN=1, +YCHEM_NL(46)%RMOLMASS=46.02, +YCHEM_NL(46)%IGRBCODE=217046, +YCHEM_NL(46)%LNEGFIX=.TRUE., +YCHEM_NL(46)%IGRIBTC=218046, +YCHEM_NL(46)%IGRIBDV=221046, +YCHEM_NL(46)%HENRYA=190.0, +YCHEM_NL(46)%HENRYB=6400.0, +YCHEM_NL(46)%LQM=.false., +YCHEM_NL(46)%LQM3D=.TRUE., +YCHEM_NL(46)%LCOMAD=.true., +YCHEM_NL(46)%LADV=.TRUE., +YCHEM_NL(46)%LMASSFIX=.TRUE., +YCHEM_NL(46)%BETAMFBC=-999.9, +YCHEM_NL(46)%LASSIM=.FALSE., +YCHEM_NL(47)%CNAME='C3H8', +YCHEM_NL(47)%NREQIN=1, +YCHEM_NL(47)%RMOLMASS=44.03, +YCHEM_NL(47)%IGRBCODE=217047, +YCHEM_NL(47)%LNEGFIX=.TRUE., +YCHEM_NL(47)%IGRIBTC=218047, +YCHEM_NL(47)%LQM=.false., +YCHEM_NL(47)%LQM3D=.TRUE., +YCHEM_NL(47)%LCOMAD=.true., +YCHEM_NL(47)%LADV=.TRUE., +YCHEM_NL(47)%LMASSFIX=.TRUE., +YCHEM_NL(47)%BETAMFBC=-999.9, +YCHEM_NL(47)%LASSIM=.FALSE., +YCHEM_NL(48)%CNAME='C3H6', +YCHEM_NL(48)%NREQIN=1, +YCHEM_NL(48)%RMOLMASS=42.03, +YCHEM_NL(48)%IGRBCODE=217048, +YCHEM_NL(48)%LNEGFIX=.TRUE., +YCHEM_NL(48)%IGRIBTC=218048, +YCHEM_NL(48)%LQM=.false., +YCHEM_NL(48)%LQM3D=.TRUE., +YCHEM_NL(48)%LCOMAD=.true., +YCHEM_NL(48)%LADV=.TRUE., +YCHEM_NL(48)%LMASSFIX=.TRUE., +YCHEM_NL(48)%BETAMFBC=-999.9, +YCHEM_NL(48)%LASSIM=.FALSE., +YCHEM_NL(49)%CNAME='C10H16', +YCHEM_NL(49)%NREQIN=1, +YCHEM_NL(49)%RMOLMASS=136.0, +YCHEM_NL(49)%IGRBCODE=217049, +YCHEM_NL(49)%LNEGFIX=.TRUE., +YCHEM_NL(49)%IGRIBTC=218049, +YCHEM_NL(49)%LQM=.false., +YCHEM_NL(49)%LQM3D=.TRUE., +YCHEM_NL(49)%LCOMAD=.true., +YCHEM_NL(49)%LADV=.TRUE., +YCHEM_NL(49)%LMASSFIX=.TRUE., +YCHEM_NL(49)%BETAMFBC=-999.9, +YCHEM_NL(49)%LASSIM=.FALSE., +YCHEM_NL(50)%CNAME='ISPD', +YCHEM_NL(50)%NREQIN=1, +YCHEM_NL(50)%RMOLMASS=70.0, +YCHEM_NL(50)%IGRBCODE=217050, +YCHEM_NL(50)%LNEGFIX=.TRUE., +YCHEM_NL(50)%IGRIBTC=218050, +YCHEM_NL(50)%IGRIBDV=221050, +YCHEM_NL(50)%HENRYA=4.3, +YCHEM_NL(50)%HENRYB=5300.0, +YCHEM_NL(50)%LQM=.false., +YCHEM_NL(50)%LQM3D=.TRUE., +YCHEM_NL(50)%LCOMAD=.true., +YCHEM_NL(50)%LADV=.TRUE., +YCHEM_NL(50)%LMASSFIX=.TRUE., +YCHEM_NL(50)%BETAMFBC=-999.9, +YCHEM_NL(50)%LASSIM=.FALSE., +YCHEM_NL(51)%CNAME='NO3_A', +YCHEM_NL(51)%NREQIN=1, +YCHEM_NL(51)%RMOLMASS=62.0, +YCHEM_NL(51)%IGRBCODE=217051, +YCHEM_NL(51)%LNEGFIX=.TRUE., +YCHEM_NL(51)%IGRIBTC=218051, +YCHEM_NL(51)%IGRIBDV=221051, +YCHEM_NL(51)%HENRYA=3.2e11, +YCHEM_NL(51)%HENRYB=8700.0, +YCHEM_NL(51)%LQM=.false., +YCHEM_NL(51)%LQM3D=.TRUE., +YCHEM_NL(51)%LCOMAD=.true., +YCHEM_NL(51)%LADV=.TRUE., +YCHEM_NL(51)%LMASSFIX=.TRUE., +YCHEM_NL(51)%BETAMFBC=-999.9, +YCHEM_NL(51)%LASSIM=.FALSE., +YCHEM_NL(52)%CNAME='CH3COCH3', +YCHEM_NL(52)%NREQIN=1, +YCHEM_NL(52)%RMOLMASS=58.0, +YCHEM_NL(52)%IGRBCODE=217052, +YCHEM_NL(52)%LNEGFIX=.TRUE., +YCHEM_NL(52)%IGRIBTC=218052, +YCHEM_NL(52)%IGRIBDV=221052, +YCHEM_NL(52)%HENRYA=27.0, +YCHEM_NL(52)%HENRYB=5500.0, +YCHEM_NL(52)%LQM=.false., +YCHEM_NL(52)%LQM3D=.TRUE., +YCHEM_NL(52)%LCOMAD=.true., +YCHEM_NL(52)%LADV=.TRUE., +YCHEM_NL(52)%LMASSFIX=.TRUE., +YCHEM_NL(52)%BETAMFBC=-999.9, +YCHEM_NL(52)%LASSIM=.FALSE., +YCHEM_NL(53)%CNAME='ACO2', +YCHEM_NL(53)%NREQIN=1, +YCHEM_NL(53)%RMOLMASS=58.0, +YCHEM_NL(53)%IGRBCODE=217053, +YCHEM_NL(53)%LNEGFIX=.TRUE., +YCHEM_NL(53)%IGRIBTC=218053, +YCHEM_NL(53)%LQM=.false., +YCHEM_NL(53)%LQM3D=.TRUE., +YCHEM_NL(53)%LCOMAD=.true., +YCHEM_NL(53)%LADV=.FALSE., +YCHEM_NL(53)%LMASSFIX=.FALSE., +YCHEM_NL(53)%LMASSFIX=.FALSE., +YCHEM_NL(53)%LASSIM=.FALSE., +YCHEM_NL(54)%CNAME='IC3H7O2', +YCHEM_NL(54)%NREQIN=1, +YCHEM_NL(54)%RMOLMASS=75.0, +YCHEM_NL(54)%IGRBCODE=217054, +YCHEM_NL(54)%LNEGFIX=.TRUE., +YCHEM_NL(54)%IGRIBTC=218054, +YCHEM_NL(54)%LQM=.false., +YCHEM_NL(54)%LQM3D=.TRUE., +YCHEM_NL(54)%LCOMAD=.true., +YCHEM_NL(54)%LADV=.FALSE., +YCHEM_NL(54)%LMASSFIX=.FALSE., +YCHEM_NL(54)%LMASSFIX=.FALSE., +YCHEM_NL(54)%LASSIM=.FALSE., +YCHEM_NL(55)%CNAME='HYPROPO2', +YCHEM_NL(55)%NREQIN=1, +YCHEM_NL(55)%RMOLMASS=91.0, +YCHEM_NL(55)%IGRBCODE=217055, +YCHEM_NL(55)%LNEGFIX=.TRUE., +YCHEM_NL(55)%IGRIBTC=218055, +YCHEM_NL(55)%LQM=.false., +YCHEM_NL(55)%LQM3D=.TRUE., +YCHEM_NL(55)%LCOMAD=.true., +YCHEM_NL(55)%LADV=.FALSE., +YCHEM_NL(55)%LMASSFIX=.FALSE., +YCHEM_NL(55)%LMASSFIX=.FALSE., +YCHEM_NL(55)%LASSIM=.FALSE., +YCHEM_NL(56)%CNAME='SO3', +YCHEM_NL(56)%NREQIN=1, +YCHEM_NL(56)%RMOLMASS=80.0, +YCHEM_NL(56)%IGRBCODE=217189, +YCHEM_NL(56)%LNEGFIX=.TRUE., +YCHEM_NL(56)%IGRIBTC=218189, +YCHEM_NL(56)%LQM=.false., +YCHEM_NL(56)%LQM3D=.TRUE., +YCHEM_NL(56)%LCOMAD=.true., +YCHEM_NL(56)%LADV=.TRUE., +YCHEM_NL(56)%LMASSFIX=.TRUE., +YCHEM_NL(56)%BETAMFBC=-999.9, +YCHEM_NL(56)%LASSIM=.FALSE., +YCHEM_NL(57)%CNAME='CH3O2NO2', +YCHEM_NL(57)%NREQIN=1, +YCHEM_NL(57)%RMOLMASS=93.0, +YCHEM_NL(57)%IGRBCODE=217225, +YCHEM_NL(57)%LNEGFIX=.TRUE., +YCHEM_NL(57)%IGRIBTC=218225, +YCHEM_NL(57)%LQM=.false., +YCHEM_NL(57)%LQM3D=.TRUE., +YCHEM_NL(57)%LCOMAD=.true., +YCHEM_NL(57)%LADV=.TRUE., +YCHEM_NL(57)%LMASSFIX=.TRUE., +YCHEM_NL(57)%BETAMFBC=-999.9, +YCHEM_NL(57)%LASSIM=.FALSE., +YCHEM_NL(58)%CNAME='HONO', +YCHEM_NL(58)%NREQIN=1, +YCHEM_NL(58)%RMOLMASS=47.0, +YCHEM_NL(58)%IGRBCODE=217086, +YCHEM_NL(58)%LNEGFIX=.TRUE., +YCHEM_NL(58)%IGRIBTC=218086, +YCHEM_NL(58)%IGRIBDV=221086, +YCHEM_NL(58)%HENRYA=4.8e+1, +YCHEM_NL(58)%HENRYB=4800.0, +YCHEM_NL(58)%LQM=.false., +YCHEM_NL(58)%LQM3D=.TRUE., +YCHEM_NL(58)%LCOMAD=.true., +YCHEM_NL(58)%LADV=.TRUE., +YCHEM_NL(58)%LMASSFIX=.TRUE., +YCHEM_NL(58)%BETAMFBC=-999.9, +YCHEM_NL(58)%LASSIM=.FALSE., +YCHEM_NL(59)%CNAME='HCN', +YCHEM_NL(59)%NREQIN=1, +YCHEM_NL(59)%RMOLMASS=27.0, +YCHEM_NL(59)%IGRBCODE=217226, +YCHEM_NL(59)%LNEGFIX=.TRUE., +YCHEM_NL(59)%IGRIBTC=218226, +YCHEM_NL(59)%IGRIBDV=221226, +YCHEM_NL(59)%HENRYA=12, +YCHEM_NL(59)%HENRYB=5000., +YCHEM_NL(59)%LQM=.false., +YCHEM_NL(59)%LQM3D=.TRUE., +YCHEM_NL(59)%LCOMAD=.true., +YCHEM_NL(59)%LADV=.TRUE., +YCHEM_NL(59)%LMASSFIX=.TRUE., +YCHEM_NL(59)%BETAMFBC=-999.9, +YCHEM_NL(59)%LASSIM=.FALSE., +YCHEM_NL(60)%CNAME='CH3CN', +YCHEM_NL(60)%NREQIN=1, +YCHEM_NL(60)%RMOLMASS=41.0, +YCHEM_NL(60)%IGRBCODE=217224, +YCHEM_NL(60)%LNEGFIX=.TRUE., +YCHEM_NL(60)%IGRIBTC=218224, +YCHEM_NL(60)%IGRIBDV=221224, +YCHEM_NL(60)%HENRYA=49, +YCHEM_NL(60)%HENRYB=4000., +YCHEM_NL(60)%LQM=.false., +YCHEM_NL(60)%LQM3D=.TRUE., +YCHEM_NL(60)%LCOMAD=.true., +YCHEM_NL(60)%LADV=.TRUE., +YCHEM_NL(60)%LMASSFIX=.TRUE., +YCHEM_NL(60)%BETAMFBC=-999.9, +YCHEM_NL(60)%LASSIM=.FALSE., +YCHEM_NL(61)%CNAME='XYL', +YCHEM_NL(61)%NREQIN=1, +YCHEM_NL(61)%RMOLMASS=106.0, +YCHEM_NL(61)%IGRBCODE=217100, +YCHEM_NL(61)%LNEGFIX=.TRUE., +YCHEM_NL(61)%IGRIBTC=218100, +YCHEM_NL(61)%IGRIBDV=221100, +YCHEM_NL(61)%HENRYA=0.14, +YCHEM_NL(61)%HENRYB=4200.0, +YCHEM_NL(61)%LQM=.false., +YCHEM_NL(61)%LQM3D=.TRUE., +YCHEM_NL(61)%LCOMAD=.true., +YCHEM_NL(61)%LADV=.TRUE., +YCHEM_NL(61)%LMASSFIX=.TRUE., +YCHEM_NL(61)%BETAMFBC=-999.9, +YCHEM_NL(61)%LASSIM=.FALSE., +YCHEM_NL(62)%CNAME='TOL', +YCHEM_NL(62)%NREQIN=1, +YCHEM_NL(62)%RMOLMASS=92.0, +YCHEM_NL(62)%IGRBCODE=217099, +YCHEM_NL(62)%LNEGFIX=.TRUE., +YCHEM_NL(62)%IGRIBTC=218099, +YCHEM_NL(62)%IGRIBDV=221099, +YCHEM_NL(62)%HENRYA=0.15, +YCHEM_NL(62)%HENRYB=4300.0, +YCHEM_NL(62)%LQM=.false., +YCHEM_NL(62)%LQM3D=.TRUE., +YCHEM_NL(62)%LCOMAD=.true., +YCHEM_NL(62)%LADV=.TRUE., +YCHEM_NL(62)%LMASSFIX=.TRUE., +YCHEM_NL(62)%BETAMFBC=-999.9, +YCHEM_NL(62)%LASSIM=.FALSE., +YCHEM_NL(63)%CNAME='AROO2', +YCHEM_NL(63)%NREQIN=1, +YCHEM_NL(63)%RMOLMASS=124.0, +YCHEM_NL(63)%IGRBCODE=217222, +YCHEM_NL(63)%LNEGFIX=.TRUE., +YCHEM_NL(63)%IGRIBTC=218222, +YCHEM_NL(63)%LQM=.false., +YCHEM_NL(63)%LQM3D=.TRUE., +YCHEM_NL(63)%LCOMAD=.true., +YCHEM_NL(63)%LADV=.FALSE., +YCHEM_NL(63)%LMASSFIX=.FALSE., +YCHEM_NL(63)%LMASSFIX=.FALSE., +YCHEM_NL(63)%LASSIM=.FALSE., +YCHEM_NL(64)%CNAME='HPALD1', +YCHEM_NL(64)%NREQIN=1, +YCHEM_NL(64)%RMOLMASS=148.0, +YCHEM_NL(64)%IGRBCODE=217227, +YCHEM_NL(64)%LNEGFIX=.TRUE., +YCHEM_NL(64)%IGRIBTC=218227, +YCHEM_NL(64)%HENRYA=17.0, +YCHEM_NL(64)%HENRYB=5000.0, +YCHEM_NL(64)%LQM=.false., +YCHEM_NL(64)%LQM3D=.TRUE., +YCHEM_NL(64)%LCOMAD=.true., +YCHEM_NL(64)%LADV=.TRUE., +YCHEM_NL(64)%LMASSFIX=.TRUE., +YCHEM_NL(64)%BETAMFBC=-999.9, +YCHEM_NL(64)%LASSIM=.FALSE., +YCHEM_NL(65)%CNAME='HPALD2', +YCHEM_NL(65)%NREQIN=1, +YCHEM_NL(65)%RMOLMASS=148.0, +YCHEM_NL(65)%IGRBCODE=217228, +YCHEM_NL(65)%LNEGFIX=.TRUE., +YCHEM_NL(65)%IGRIBTC=218228, +YCHEM_NL(65)%HENRYA=17.0, +YCHEM_NL(65)%HENRYB=5000.0, +YCHEM_NL(65)%LQM=.false., +YCHEM_NL(65)%LQM3D=.TRUE., +YCHEM_NL(65)%LCOMAD=.true., +YCHEM_NL(65)%LADV=.TRUE., +YCHEM_NL(65)%LMASSFIX=.TRUE., +YCHEM_NL(65)%BETAMFBC=-999.9, +YCHEM_NL(65)%LASSIM=.FALSE., +YCHEM_NL(66)%CNAME='ISOPOOH', +YCHEM_NL(66)%NREQIN=1, +YCHEM_NL(66)%RMOLMASS=118.0, +YCHEM_NL(66)%IGRBCODE=217161, +YCHEM_NL(66)%LNEGFIX=.TRUE., +YCHEM_NL(66)%IGRIBTC=218161, +YCHEM_NL(66)%IGRIBDV=221161, +YCHEM_NL(66)%HENRYA=3.2E11, +YCHEM_NL(66)%HENRYB=8700.0, +YCHEM_NL(66)%LQM=.false., +YCHEM_NL(66)%LQM3D=.TRUE., +YCHEM_NL(66)%LCOMAD=.true., +YCHEM_NL(66)%LADV=.TRUE., +YCHEM_NL(66)%LMASSFIX=.TRUE., +YCHEM_NL(66)%BETAMFBC=-999.9, +YCHEM_NL(66)%LASSIM=.FALSE., +YCHEM_NL(67)%CNAME='GLY', +YCHEM_NL(67)%NREQIN=1, +YCHEM_NL(67)%RMOLMASS=58.04, +YCHEM_NL(67)%IGRBCODE=217107, +YCHEM_NL(67)%LNEGFIX=.TRUE., +YCHEM_NL(67)%IGRIBTC=218107, +YCHEM_NL(67)%IGRIBDV=221107, +YCHEM_NL(67)%HENRYA=4.1E5, +YCHEM_NL(67)%HENRYB=7500.0, +YCHEM_NL(67)%LQM=.false., +YCHEM_NL(67)%LQM3D=.TRUE., +YCHEM_NL(67)%LCOMAD=.true., +YCHEM_NL(67)%LADV=.TRUE., +YCHEM_NL(67)%LMASSFIX=.TRUE., +YCHEM_NL(67)%BETAMFBC=-999.9, +YCHEM_NL(67)%LASSIM=.FALSE., +YCHEM_NL(68)%CNAME='GLYALD', +YCHEM_NL(68)%NREQIN=1, +YCHEM_NL(68)%RMOLMASS=60.05, +YCHEM_NL(68)%IGRBCODE=217101, +YCHEM_NL(68)%LNEGFIX=.TRUE., +YCHEM_NL(68)%IGRIBTC=218101, +YCHEM_NL(68)%IGRIBDV=221101, +YCHEM_NL(68)%HENRYA=4.1E4, +YCHEM_NL(68)%HENRYB=4600.0, +YCHEM_NL(68)%LQM=.false., +YCHEM_NL(68)%LQM3D=.TRUE., +YCHEM_NL(68)%LCOMAD=.true., +YCHEM_NL(68)%LADV=.TRUE., +YCHEM_NL(68)%LMASSFIX=.TRUE., +YCHEM_NL(68)%BETAMFBC=-999.9, +YCHEM_NL(68)%LASSIM=.FALSE., +YCHEM_NL(69)%CNAME='HYAC', +YCHEM_NL(69)%NREQIN=1, +YCHEM_NL(69)%RMOLMASS=74.1, +YCHEM_NL(69)%IGRBCODE=217118, +YCHEM_NL(69)%LNEGFIX=.TRUE., +YCHEM_NL(69)%IGRIBTC=218117, +YCHEM_NL(69)%IGRIBDV=221118, +YCHEM_NL(69)%HENRYA=6.3E3, +YCHEM_NL(69)%HENRYB=6460.0, +YCHEM_NL(69)%LQM=.false., +YCHEM_NL(69)%LQM3D=.TRUE., +YCHEM_NL(69)%LCOMAD=.true., +YCHEM_NL(69)%LADV=.TRUE., +YCHEM_NL(69)%LMASSFIX=.TRUE., +YCHEM_NL(69)%BETAMFBC=-999.9, +YCHEM_NL(69)%LASSIM=.FALSE., +YCHEM_NL(70)%CNAME='ISOPBO2', +YCHEM_NL(70)%NREQIN=1, +YCHEM_NL(70)%RMOLMASS=117.0, +YCHEM_NL(70)%IGRBCODE=217229, +YCHEM_NL(70)%LNEGFIX=.TRUE., +YCHEM_NL(70)%IGRIBTC=218229, +YCHEM_NL(70)%LQM=.false., +YCHEM_NL(70)%LQM3D=.TRUE., +YCHEM_NL(70)%LCOMAD=.true., +YCHEM_NL(70)%LADV=.FALSE., +YCHEM_NL(70)%LMASSFIX=.FALSE., +YCHEM_NL(70)%LMASSFIX=.FALSE., +YCHEM_NL(70)%LASSIM=.FALSE., +YCHEM_NL(71)%CNAME='ISOPDO2', +YCHEM_NL(71)%NREQIN=1, +YCHEM_NL(71)%RMOLMASS=117.0, +YCHEM_NL(71)%IGRBCODE=217230, +YCHEM_NL(71)%LNEGFIX=.TRUE., +YCHEM_NL(71)%IGRIBTC=218230, +YCHEM_NL(71)%LQM=.false., +YCHEM_NL(71)%LQM3D=.TRUE., +YCHEM_NL(71)%LCOMAD=.true., +YCHEM_NL(71)%LADV=.FALSE., +YCHEM_NL(71)%LMASSFIX=.FALSE., +YCHEM_NL(71)%LMASSFIX=.FALSE., +YCHEM_NL(71)%LASSIM=.FALSE., +YCHEM_NL(72)%CNAME='SOG1', +YCHEM_NL(72)%NREQIN=1, +YCHEM_NL(72)%RMOLMASS=180.0, +YCHEM_NL(72)%IGRBCODE=217186, +YCHEM_NL(72)%LNEGFIX=.TRUE., +YCHEM_NL(72)%IGRIBTC=218186, +YCHEM_NL(72)%HENRYA=1.E5, +YCHEM_NL(72)%HENRYB=6000.0, +YCHEM_NL(72)%LQM=.false., +YCHEM_NL(72)%LQM3D=.TRUE., +YCHEM_NL(72)%LCOMAD=.true., +YCHEM_NL(72)%LADV=.TRUE., +YCHEM_NL(72)%LMASSFIX=.TRUE., +YCHEM_NL(72)%BETAMFBC=-999.9, +YCHEM_NL(72)%LASSIM=.FALSE., +YCHEM_NL(73)%CNAME='SOG2A', +YCHEM_NL(73)%NREQIN=1, +YCHEM_NL(73)%RMOLMASS=120.0, +YCHEM_NL(73)%IGRBCODE=217187, +YCHEM_NL(73)%LNEGFIX=.TRUE., +YCHEM_NL(73)%IGRIBTC=218187, +YCHEM_NL(73)%HENRYA=1.E3, +YCHEM_NL(73)%HENRYB=6000.0, +YCHEM_NL(73)%LQM=.false., +YCHEM_NL(73)%LQM3D=.TRUE., +YCHEM_NL(73)%LCOMAD=.true., +YCHEM_NL(73)%LADV=.TRUE., +YCHEM_NL(73)%LMASSFIX=.TRUE., +YCHEM_NL(73)%BETAMFBC=-999.9, +YCHEM_NL(73)%LASSIM=.FALSE., +YCHEM_NL(74)%CNAME='SOG2B', +YCHEM_NL(74)%NREQIN=1, +YCHEM_NL(74)%RMOLMASS=120.0, +YCHEM_NL(74)%IGRBCODE=217188, +YCHEM_NL(74)%LNEGFIX=.TRUE., +YCHEM_NL(74)%IGRIBTC=218188, +YCHEM_NL(74)%HENRYA=1.E5, +YCHEM_NL(74)%HENRYB=6000.0, +YCHEM_NL(74)%LQM=.false., +YCHEM_NL(74)%LQM3D=.TRUE., +YCHEM_NL(74)%LCOMAD=.true., +YCHEM_NL(74)%LADV=.TRUE., +YCHEM_NL(74)%LMASSFIX=.TRUE., +YCHEM_NL(74)%BETAMFBC=-999.9, +YCHEM_NL(74)%LASSIM=.FALSE., +YEXT_NL(1)%CNAME='EMILI', +YEXT_NL(1)%NREQIN=0, +YEXT_NL(1)%IGRBCODE=212254, +YEXT_NL(1)%LADV=.FALSE., +YEXT_NL(1)%LGP=.TRUE., +YEXT_NL(1)%LGPINGP=.TRUE., +YEXT_NL(2)%CNAME='KCH4CHEM', +YEXT_NL(2)%NREQIN=0, +YEXT_NL(2)%IGRBCODE=210071, +YEXT_NL(2)%LADV=.FALSE., +YEXT_NL(2)%LGP=.TRUE., +YEXT_NL(2)%LGPINGP=.TRUE., +NGFL_EXT=2, +LAERCHEM=true +YQ_NL%LGP=true, +YQ_NL%LSP=false, +YL_NL%LGP=true, +YI_NL%LGP=true, +YA_NL%LGP=true, +YO3_NL%LGP=true, +LTRCMFQM=true, +/ +&NAMFPC +CFPFMT="MODEL", +NFP3DFS=5, +NFP3DFP=5, +NFP3DFT=1, +NFP3DFV=1, +MFP3DFS(:)=130,135,138,155,133, +MFP3DFP(:)=129,130,135,138,155, +MFP3DFT=60, +MFP3DFV=133, +NFP2DF=2, +MFP2DF(:)=129,152, +NFPPHY=1, +MFPPHY(:)=31, +NRFP3S(:)=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137, +RFP3P(:)=100000.0,92500.0,85000.0,70000.0,50000.0,40000.0,30000.0,25000.0,20000.0,15000.0,10000.0,7000.0,5000.0,3000.0,2000.0,1000.0,700.0,500.0,300.0,200.0,100.0, +NFPCLI=0, +LFPQ=false, +LTRACEFP=false, +RFPCORR=60000., +/ +&NAMDIM +NPROMA=-16, +/ +&NAMDPHY +NVEXTR=7, +NCEXTR=137, +NCSNEC=5, +/ +&NAMGEM +LNONHYD_GEOM=false, +NHTYP=2, +/ +&NAMRIP +TSTEP=1800.0, +CSTOP='h24', +/ +&NAMARG +NCONF=1, +CNMEXP="abc3", +/ + &NAMRLX + / + &NAEAER + NTYPAER=3,3,2,2,1,2,1,2,0,0, + YAERO_DESC(1)%IGRIBDIAG=215001,215004,215007,215010,215013,215016,215022,215019, +YAERO_DESC(1)%RDDEPVSEA=1.1000E-02, +YAERO_DESC(1)%RDDEPVLIC=1.1000E-02, +YAERO_DESC(1)%RSEDIMV=2.4000E-05, +YAERO_DESC(1)%RSCAVIN=0.9, +YAERO_DESC(1)%RSCAVBCR=0.001, +YAERO_DESC(1)%RSCAVBCS=0.005, +YAERO_DESC(1)%COPTCLASS='SeaSaltSmall', +YAERO_DESC(1)%CHYGCLASS='SeaSalt', +YAERO_DESC(1)%IAEROCV=1, +YAERO_DESC(2)%IGRIBDIAG=215002,215005,215008,215011,215014,215017,215023,215020, +YAERO_DESC(2)%RDDEPVSEA=1.1500E-02, +YAERO_DESC(2)%RDDEPVLIC=1.2000E-02, +YAERO_DESC(2)%RSEDIMV=1.9500E-03, +YAERO_DESC(2)%RSCAVIN=0.9, +YAERO_DESC(2)%RSCAVBCR=0.001, +YAERO_DESC(2)%RSCAVBCS=0.005, +YAERO_DESC(2)%COPTCLASS='SeaSaltMedium', +YAERO_DESC(2)%CHYGCLASS='SeaSalt', +YAERO_DESC(2)%IAEROCV=2, +YAERO_DESC(3)%IGRIBDIAG=215003,215006,215009,215012,215015,215018,215024,215021, +YAERO_DESC(3)%RDDEPVSEA=1.2000E-02, +YAERO_DESC(3)%RDDEPVLIC=1.5000E-02, +YAERO_DESC(3)%RSEDIMV=1.8000E-02, +YAERO_DESC(3)%RSCAVIN=0.9, +YAERO_DESC(3)%RSCAVBCR=0.1, +YAERO_DESC(3)%RSCAVBCS=0.005, +YAERO_DESC(3)%COPTCLASS='SeaSaltLarge', +YAERO_DESC(3)%CHYGCLASS='SeaSalt', +YAERO_DESC(3)%IAEROCV=2, +YAERO_DESC(4)%IGRIBDIAG=215025,215028,215031,215034,215037,215040,215046,215043, +YAERO_DESC(4)%RDDEPVSEA=2.0000E-04, +YAERO_DESC(4)%RDDEPVLIC=2.0000E-04, +YAERO_DESC(4)%RSEDIMV=6.9040E-05, +YAERO_DESC(4)%RSCAVIN=0.7, +YAERO_DESC(4)%RSCAVBCR=0.001, +YAERO_DESC(4)%RSCAVBCS=0.005, +YAERO_DESC(4)%COPTCLASS='DustSmall', +YAERO_DESC(4)%CHYGCLASS='Dust', +YAERO_DESC(4)%IAEROCV=1, +YAERO_DESC(5)%IGRIBDIAG=215026,215029,215032,215035,215038,215041,215047,215044, +YAERO_DESC(5)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(5)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(5)%RSEDIMV=1.9820E-04, +YAERO_DESC(5)%RSCAVIN=0.7, +YAERO_DESC(5)%RSCAVBCR=0.001, +YAERO_DESC(5)%RSCAVBCS=0.005, +YAERO_DESC(5)%COPTCLASS='DustMedium', +YAERO_DESC(5)%CHYGCLASS='Dust', +YAERO_DESC(5)%IAEROCV=2, +YAERO_DESC(6)%IGRIBDIAG=215027,215030,215033,215036,215039,215042,215048,215045, +YAERO_DESC(6)%RDDEPVSEA=1.2000E-02, +YAERO_DESC(6)%RDDEPVLIC=1.2000E-02, +YAERO_DESC(6)%RSEDIMV=1.9620E-03, +YAERO_DESC(6)%RSCAVIN=0.7, +YAERO_DESC(6)%RSCAVBCR=0.1, +YAERO_DESC(6)%RSCAVBCS=0.005, +YAERO_DESC(6)%COPTCLASS='DustLarge', +YAERO_DESC(6)%CHYGCLASS='Dust', +YAERO_DESC(6)%IAEROCV=2, +YAERO_DESC(7)%IGRIBDIAG=215050,215052,215054,215056,215058,215060,215064,215062, +YAERO_DESC(7)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(7)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(7)%RSEDIMV=2.0000E-04, +YAERO_DESC(7)%RSCAVIN=0.7, +YAERO_DESC(7)%RSCAVBCR=0.0001, +YAERO_DESC(7)%RSCAVBCS=0.005, +YAERO_DESC(7)%COPTCLASS='OrganicMatter', +YAERO_DESC(7)%CHYGCLASS='OrganicMatter', +YAERO_DESC(7)%IAEROCV=1, +YAERO_DESC(8)%IGRIBDIAG=215049,215051,215053,215055,215057,215059,215063,215061, +YAERO_DESC(8)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(8)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(8)%RSEDIMV=2.0000E-04, +YAERO_DESC(8)%RSCAVIN=0, +YAERO_DESC(8)%RSCAVBCR=0.0001, +YAERO_DESC(8)%RSCAVBCS=0.005, +YAERO_DESC(8)%COPTCLASS='OrganicMatter', +YAERO_DESC(8)%CHYGCLASS='Hydrophobic', +YAERO_DESC(8)%IAEROCV=1, +YAERO_DESC(9)%IGRIBDIAG=215066,215068,215070,215072,215074,215076,215080,215078, +YAERO_DESC(9)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(9)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(9)%RSEDIMV=2.0000E-04, +YAERO_DESC(9)%RSCAVIN=0.7, +YAERO_DESC(9)%RSCAVBCR=0.0001, +YAERO_DESC(9)%RSCAVBCS=0.005, +YAERO_DESC(9)%COPTCLASS='BlackCarbon', +YAERO_DESC(9)%CHYGCLASS='BlackCarbon', +YAERO_DESC(9)%IAEROCV=1, +YAERO_DESC(10)%IGRIBDIAG=215065,215067,215069,215071,215073,215075,215079,215077, +YAERO_DESC(10)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(10)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(10)%RSEDIMV=2.0000E-04, +YAERO_DESC(10)%RSCAVIN=0, +YAERO_DESC(10)%RSCAVBCR=0.0001, +YAERO_DESC(10)%RSCAVBCS=0.005, +YAERO_DESC(10)%COPTCLASS='BlackCarbon', +YAERO_DESC(10)%CHYGCLASS='Hydrophobic', +YAERO_DESC(10)%IAEROCV=1, +YAERO_DESC(11)%IGRIBDIAG=215081,215082,215083,215084,215085,215086,215088,215087, +YAERO_DESC(11)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(11)%RDDEPVLIC=2.5000E-03, +YAERO_DESC(11)%RSEDIMV=2.0000E-04, +YAERO_DESC(11)%RSCAVIN=0.7, +YAERO_DESC(11)%RSCAVBCR=0.0001, +YAERO_DESC(11)%RSCAVBCS=0.005, +YAERO_DESC(11)%COPTCLASS='Sulphate', +YAERO_DESC(11)%CHYGCLASS='Sulphate', +YAERO_DESC(11)%IAEROCV=1, +YAERO_DESC(12)%IGRIBDIAG=215189,215191,215193,215195,215197,215199,215203,215201, +YAERO_DESC(12)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(12)%RDDEPVLIC=1.5000E-03, +YAERO_DESC(12)%RSEDIMV=2.0000E-04, +YAERO_DESC(12)%RSCAVIN=0.8, +YAERO_DESC(12)%RSCAVBCR=0.0001, +YAERO_DESC(12)%RSCAVBCS=0.005, +YAERO_DESC(12)%COPTCLASS='NitrateFine', +YAERO_DESC(12)%CHYGCLASS='Nitrate', +YAERO_DESC(12)%IAEROCV=1, +YAERO_DESC(13)%IGRIBDIAG=215190,215192,215194,215196,215198,215200,215204,215202, +YAERO_DESC(13)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(13)%RDDEPVLIC=1.5000E-03, +YAERO_DESC(13)%RSEDIMV=1.3352E-03, +YAERO_DESC(13)%RSCAVIN=0.8, +YAERO_DESC(13)%RSCAVBCR=0.1, +YAERO_DESC(13)%RSCAVBCS=0.005, +YAERO_DESC(13)%COPTCLASS='NitrateCoarse', +YAERO_DESC(13)%CHYGCLASS='Nitrate', +YAERO_DESC(13)%IAEROCV=2, +YAERO_DESC(14)%IGRIBDIAG=215205,215206,215207,215208,215209,215210,216042,215211, +YAERO_DESC(14)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(14)%RDDEPVLIC=1.5000E-03, +YAERO_DESC(14)%RSEDIMV=2.0000E-04, +YAERO_DESC(14)%RSCAVIN=0.9, +YAERO_DESC(14)%RSCAVBCR=0.0001, +YAERO_DESC(14)%RSCAVBCS=0.005, +YAERO_DESC(14)%COPTCLASS='Ammonium', +YAERO_DESC(14)%CHYGCLASS='Ammonium', +YAERO_DESC(14)%IAEROCV=1, +YAERO_DESC(15)%IGRIBDIAG=215212,215213,215214,215215,215216,215217,216098,215218, +YAERO_DESC(15)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(15)%RDDEPVLIC=2.5000E-03, +YAERO_DESC(15)%RSEDIMV=2.4000E-04, +YAERO_DESC(15)%RSCAVIN=0.7, +YAERO_DESC(15)%RSCAVBCR=0.0001, +YAERO_DESC(15)%RSCAVBCS=0.005, +YAERO_DESC(15)%COPTCLASS='SecOrgBio', +YAERO_DESC(15)%CHYGCLASS='SecOrgBio', +YAERO_DESC(15)%IAEROCV=1, +YAERO_DESC(16)%IGRIBDIAG=215219,215220,215221,215222,215223,215224,216099,215225, +YAERO_DESC(16)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(16)%RDDEPVLIC=2.5000E-03, +YAERO_DESC(16)%RSEDIMV=2.4000E-04, +YAERO_DESC(16)%RSCAVIN=0.7, +YAERO_DESC(16)%RSCAVBCR=0.0001, +YAERO_DESC(16)%RSCAVBCS=0.005, +YAERO_DESC(16)%COPTCLASS='SecOrgAnth', +YAERO_DESC(16)%CHYGCLASS='SecOrgAnth', +YAERO_DESC(16)%IAEROCV=1, + LAERVOL=false, + NDRYDEPVEL_DYN=2, + LAERDUSTSOURCE=true, + LAERDUSTSIZEVAR=true, + LAERDUST_NEWBIN=false, + RAERDUST_REBOUND=0.1, + LAERNGAT=true, + NAERSCAV=3, + LAERGTOP=true, + LAERHYGRO=true, + LAERSEDIM=true, + LAERSEDIMSS=true, + LAERDRYDP=true, + LAERSURF=true, + NSSALT=4, + NDDUST=2, + NSO4SCHEME=1, + LSEASALT_RH80=true, + LAERRRTM=false, + / + &NAMCOMPO + LCHEM_DIA=true, + LCHEM_DDFLX=true, + LCOMPO_DDFLX_DIR=true, + LCHEM_TROPO=true, + LCOMPO_DCDD=true, + LAERNITRATE=true, + LAEREQSAM4CLIM=false, + LAERSOA=false, + LAERSOA_COUPLED=false, + KGHG_CHEMTEND_CH4=0, + LAERNUCL=true, + AERO_SCHEME="hamm7", + +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219209 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212001 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="ene" + THIS%PARAMID=212002 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="fef" + THIS%PARAMID=212003 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="ind" + THIS%PARAMID=212004 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="res" + THIS%PARAMID=212006 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="shp" + THIS%PARAMID=212007 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="slv" + THIS%PARAMID=212189 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="swd" + THIS%PARAMID=212008 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="tnr" + THIS%PARAMID=212009 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="tro" + THIS%PARAMID=212010 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212011 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="ene" + THIS%PARAMID=212012 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="fef" + THIS%PARAMID=212013 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="ind" + THIS%PARAMID=212014 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="res" + THIS%PARAMID=212015 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="shp" + THIS%PARAMID=212016 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="slv" + THIS%PARAMID=212019 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="swd" + THIS%PARAMID=212017 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="tnr" + THIS%PARAMID=212018 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210106 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212021 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212022 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="ene" + THIS%PARAMID=212023 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="fef" + THIS%PARAMID=212024 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="ind" + THIS%PARAMID=212025 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="ref" + THIS%PARAMID=212020 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="res" + THIS%PARAMID=212026 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="shp" + THIS%PARAMID=212027 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="slv" + THIS%PARAMID=212133 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="swd" + THIS%PARAMID=212028 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="tnr" + THIS%PARAMID=212029 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="tro" + THIS%PARAMID=212030 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210104 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212031 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="ene" + THIS%PARAMID=212032 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="fef" + THIS%PARAMID=212033 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="ind" + THIS%PARAMID=212034 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="ref" + THIS%PARAMID=212040 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="res" + THIS%PARAMID=212035 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="shp" + THIS%PARAMID=212036 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="slv" + THIS%PARAMID=212137 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="swd" + THIS%PARAMID=212037 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="tnr" + THIS%PARAMID=212038 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="tro" + THIS%PARAMID=212039 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210118 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212041 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212042 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="ene" + THIS%PARAMID=212043 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="fef" + THIS%PARAMID=212044 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="ind" + THIS%PARAMID=212045 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="ref" + THIS%PARAMID=212134 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="res" + THIS%PARAMID=212046 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="shp" + THIS%PARAMID=212047 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="slv" + THIS%PARAMID=212185 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="swd" + THIS%PARAMID=212048 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="tnr" + THIS%PARAMID=212049 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="tro" + THIS%PARAMID=212050 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210107 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212051 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212052 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="ene" + THIS%PARAMID=212053 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="fef" + THIS%PARAMID=212054 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="ind" + THIS%PARAMID=212055 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="ref" + THIS%PARAMID=212135 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="res" + THIS%PARAMID=212056 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="shp" + THIS%PARAMID=212057 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="slv" + THIS%PARAMID=212186 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="swd" + THIS%PARAMID=212058 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="tnr" + THIS%PARAMID=212059 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="tro" + THIS%PARAMID=212060 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210105 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212061 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212062 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="ene" + THIS%PARAMID=212063 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="fef" + THIS%PARAMID=212064 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="ind" + THIS%PARAMID=212065 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="ref" + THIS%PARAMID=212136 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="res" + THIS%PARAMID=212066 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="shp" + THIS%PARAMID=212067 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="slv" + THIS%PARAMID=212187 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="swd" + THIS%PARAMID=212068 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="tnr" + THIS%PARAMID=212069 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="tro" + THIS%PARAMID=212070 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210108 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212071 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.00 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="ene" + THIS%PARAMID=212072 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="fef" + THIS%PARAMID=212073 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="ind" + THIS%PARAMID=212074 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="ref" + THIS%PARAMID=212080 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="res" + THIS%PARAMID=212075 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="shp" + THIS%PARAMID=212076 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="slv" + THIS%PARAMID=212198 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="swd" + THIS%PARAMID=212077 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="tnr" + THIS%PARAMID=212078 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="tro" + THIS%PARAMID=212079 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210113 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212081 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="ene" + THIS%PARAMID=212082 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="fef" + THIS%PARAMID=212083 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="ind" + THIS%PARAMID=212084 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="res" + THIS%PARAMID=212085 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="shp" + THIS%PARAMID=212086 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="slv" + THIS%PARAMID=212090 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="swd" + THIS%PARAMID=212087 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="tnr" + THIS%PARAMID=212088 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="tro" + THIS%PARAMID=212089 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219220 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="ene" + THIS%SCALING=0.0015 + THIS%PARAMID=212123 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="ind" + THIS%SCALING=0.0015 + THIS%PARAMID=212125 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="ref" + THIS%SCALING=0.0015 + THIS%PARAMID=212120 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="res" + THIS%SCALING=0.0015 + THIS%PARAMID=212126 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210115 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212091 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="emiss_nat" + THIS%SCALING=1.4 + THIS%PARAMID=212122 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="ene" + THIS%PARAMID=212092 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="fef" + THIS%PARAMID=212093 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="ind" + THIS%PARAMID=212094 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="ref" + THIS%PARAMID=212100 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="res" + THIS%PARAMID=212095 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="shp" + THIS%PARAMID=212096 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="slv" + THIS%PARAMID=212190 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="swd" + THIS%PARAMID=212097 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="tnr" + THIS%PARAMID=212098 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="tro" + THIS%PARAMID=212099 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210103 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212111 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="ene" + THIS%PARAMID=212112 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="fef" + THIS%PARAMID=212113 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="ind" + THIS%PARAMID=212114 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="ref" + THIS%PARAMID=212110 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="res" + THIS%PARAMID=212115 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="shp" + THIS%PARAMID=212116 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="slv" + THIS%PARAMID=212140 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="swd" + THIS%PARAMID=212117 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="tnr" + THIS%PARAMID=212118 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="tro" + THIS%PARAMID=212119 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210081 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212121 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212122 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="ene" + THIS%PARAMID=212123 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="fef" + THIS%PARAMID=212124 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="ind" + THIS%PARAMID=212125 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="ref" + THIS%PARAMID=212120 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="res" + THIS%PARAMID=212126 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="shp" + THIS%PARAMID=212127 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="swd" + THIS%PARAMID=212128 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="tnr" + THIS%PARAMID=212129 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="tro" + THIS%PARAMID=212130 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="DMS" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210117 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="DMS" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212132 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="DMS" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212131 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="GLY" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=212244 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219219 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="ene" + THIS%SCALING=0.001 + THIS%PARAMID=212123 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="ind" + THIS%SCALING=0.001 + THIS%PARAMID=212125 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="ref" + THIS%SCALING=0.001 + THIS%PARAMID=212120 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="res" + THIS%SCALING=0.001 + THIS%PARAMID=212126 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212141 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="ene" + THIS%PARAMID=212142 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="fef" + THIS%PARAMID=212143 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="ind" + THIS%PARAMID=212144 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="res" + THIS%PARAMID=212145 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="shp" + THIS%PARAMID=212146 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="slv" + THIS%PARAMID=212240 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="swd" + THIS%PARAMID=212147 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="tnr" + THIS%PARAMID=212148 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="tro" + THIS%PARAMID=212149 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ISPD" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212150 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212151 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="ene" + THIS%PARAMID=212152 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="fef" + THIS%PARAMID=212153 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="ind" + THIS%PARAMID=212154 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="res" + THIS%PARAMID=212155 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="shp" + THIS%PARAMID=212156 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="slv" + THIS%PARAMID=212241 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="swd" + THIS%PARAMID=212157 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="tnr" + THIS%PARAMID=212158 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="tro" + THIS%PARAMID=212159 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210116 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="agl" + THIS%PARAMID=212163 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ags" + THIS%PARAMID=212164 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGS" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212161 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212162 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ene" + THIS%PARAMID=212165 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ind" + THIS%PARAMID=212166 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ref" + THIS%PARAMID=212138 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="res" + THIS%PARAMID=212167 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="slv" + THIS%PARAMID=212169 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="swd" + THIS%PARAMID=212170 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="tnr" + THIS%PARAMID=212171 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="tro" + THIS%PARAMID=212172 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210085 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="agl" + THIS%PARAMID=212174 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212173 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="ene" + THIS%PARAMID=212176 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="fef" + THIS%PARAMID=212177 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="ind" + THIS%PARAMID=212178 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="ref" + THIS%PARAMID=212184 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="res" + THIS%PARAMID=212179 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="shp" + THIS%PARAMID=212180 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="swd" + THIS%PARAMID=212181 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="tnr" + THIS%PARAMID=212182 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="tro" + THIS%PARAMID=212183 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO2" + THIS%SECTOR="Aviation" + THIS%VERTICAL_PROFILE_TYPE="3D" + THIS%PARAMID=212255 + THIS%SCALING=1.53333333333333 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219208 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212191 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="ene" + THIS%PARAMID=212192 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="fef" + THIS%PARAMID=212193 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="ind" + THIS%PARAMID=212194 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="ref" + THIS%PARAMID=212200 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="res" + THIS%PARAMID=212195 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="shp" + THIS%PARAMID=212196 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="slv" + THIS%PARAMID=212242 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="swd" + THIS%PARAMID=212197 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="tnr" + THIS%PARAMID=212188 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="tro" + THIS%PARAMID=212199 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219207 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212201 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="ene" + THIS%PARAMID=212202 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="fef" + THIS%PARAMID=212203 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="ind" + THIS%PARAMID=212204 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="ref" + THIS%PARAMID=212139 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="res" + THIS%PARAMID=212205 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="shp" + THIS%PARAMID=212206 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="slv" + THIS%PARAMID=212243 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="swd" + THIS%PARAMID=212207 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="tnr" + THIS%PARAMID=212208 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="tro" + THIS%PARAMID=212209 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Rn" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212210 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210102 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212211 + THIS%VERTICAL_PROFILE_TYPE="AltitudeMap" + THIS%VERTICAL_PARAMID=216045 + THIS%VERTICAL_BASE_LEVEL=-1 + THIS%VERTICAL_TOP_LEVEL=-4 + THIS%VERTICAL_THRESHOLD=200 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="ene" + THIS%PARAMID=212212 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="fef" + THIS%PARAMID=212213 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="ind" + THIS%PARAMID=212214 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="ref" + THIS%PARAMID=212220 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="res" + THIS%PARAMID=212215 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="shp" + THIS%PARAMID=212216 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="swd" + THIS%PARAMID=212217 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="tnr" + THIS%PARAMID=212218 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="tro" + THIS%PARAMID=212219 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="agl" + THIS%PARAMID=216221 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="ene" + THIS%PARAMID=216222 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="fef" + THIS%PARAMID=216223 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="ind" + THIS%PARAMID=216224 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="ref" + THIS%PARAMID=216225 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="res" + THIS%PARAMID=216226 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="shp" + THIS%PARAMID=216227 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="slv" + THIS%PARAMID=216228 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="swd" + THIS%PARAMID=216229 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="tnr" + THIS%PARAMID=216230 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="tro" + THIS%PARAMID=216231 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219212 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=216200 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="ene" + THIS%PARAMID=216201 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="fef" + THIS%PARAMID=216202 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="ind" + THIS%PARAMID=216203 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="ref" + THIS%PARAMID=216204 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="res" + THIS%PARAMID=216205 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="shp" + THIS%PARAMID=216206 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="slv" + THIS%PARAMID=216207 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="swd" + THIS%PARAMID=216208 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="tnr" + THIS%PARAMID=216209 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="tro" + THIS%PARAMID=216210 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219213 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="ene" + THIS%PARAMID=216211 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="fef" + THIS%PARAMID=216212 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="ind" + THIS%PARAMID=216213 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="ref" + THIS%PARAMID=216214 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="res" + THIS%PARAMID=216215 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="shp" + THIS%PARAMID=216216 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="slv" + THIS%PARAMID=216217 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="swd" + THIS%PARAMID=216218 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="tnr" + THIS%PARAMID=216219 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="tro" + THIS%PARAMID=216220 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS +/ +&NAMCOMPO_EMIS_AUX + THIS%PARAMID=210060 +/ +&NAMCOMPO_EMIS_AUX + THIS%PARAMID=216045 +/ +&NAMCOMPO_EMIS_AUX +/ + &NAMCHEM + CHEM_SCHEME="tm5", + LCHEM_DIAC=false, + LCHEM_LIGHT=true, + + KCHEM_WETDEP=2, + LCHEM_0NOX=false, + KCHEM_NOXADV=0, + LCHEM_ANAO3=false, + KCHEM_SOLVE=2, + LCHEM_REVCHEM=false, + LCHEM_BASCOE_JON=false, + LCHEM_BASCOE_HETCHEM=true, + LCHEM_EXTENDJNO2=true, + LCHEM_JOUT=false, + LCHEM_AEROI=false, + LCHEM_O3RAD=true, + KCHEM_DRYDEP=3, + LCHEM_CSHAPE=.false., + LCHEM_WDFR=.true., + / + &NAMVAR + LMODERR=.false., + LJCDFI=.false., + LUSEJCDFI=.false., + LECV=false, + / + &NAMMCC + LMCC_COMPO=false, + / + &NAETLDIAG + / + &NAMVV0 + LLFORCE_READ=false, + / +&NAEAER +/ +&NAEPHY +/ +&NAERAD +/ +&NALBAR +/ +&NALORI +/ +&NAM_DISTRIBUTED_VECTORS +/ +&NAM926 +/ +&NAMAFN +/ +&NAMANA +/ +&NAMARPHY +/ +&NAMCA +/ +&NAMCAPE +/ +&NAMCFU +/ +&NAMCHK +/ +&NAMCHET +/ +&NAMCLDP +/ +&NAMCLTC +/ +&NAMCOM +/ +&NAMCOS +/ +&NAMCTAN +/ +&NAMCUMF +/ +&NAMCUMFS +/ +&NAMCT1 +/ +&NAMCVA +/ +&NAMDDH +/ +&NAMDFHD +/ +&NAMDFI +/ +&NAMDIF +/ +&NAMDIM +/ +&NAMDIMO +/ +&NAMDMSP +/ +&NAMDPHY +/ +&NAMDYN +/ +&NAMDYNA +/ +&NAMDYNA_STATIC +/ +&NAMDYNCORE +/ +&NAMEMIS_CONF +/ +&NAMENKF +/ +&NAMFA +/ +&NAMFFT +/ +&NAMFPC +/ +&NAMFPD +/ +&NAMFPDY2 +/ +&NAMFPDYH +/ +&NAMFPDYP +/ +&NAMFPDYS +/ +&NAMFPDYT +/ +&NAMFPDYV +/ +&NAMFPEZO +/ +&NAMFPF +/ +&NAMFPG +/ +&NAMFPIOS +/ +&NAMFPPHY +/ +&NAMFPSC2 +/ +&NAMFPSC2_DEP +/ +&NAMFY2 +/ +&NAMGEM +/ +&NAMGFL +/ +&NAMGMS +/ +&NAMGOES +/ +&NAMGOM +/ +&NAMGRIB +/ +&NAMGWD +/ +&NAMGWWMS +/ +&NAMHLOPT +/ +&NAMINI +/ +&NAMIOMI +/ +&NAMIOS +/ +&NAMJBCODES +/ +&NAMJFH +/ +&NAMJG +/ +&NAMJO +/ +&NAMKAP +/ +&NAMLCZ +/ +&NAMLEG +/ +&NAMLFI +/ +&NAMMCC +/ +&NAMMCUF +/ +&NAMMETEOSAT +/ +&NAMMTS +/ +&NAMMTSAT +/ +&NAMMTT +/ +&NAMMUL +/ +&NAMNMI +/ +&NAMNASA +/ +&NAMNN +/ +&NAMNPROF +/ +&NAMNUD +/ +&NAMOBS +/ +&NAMONEDVAR +/ +&NAMOPH +/ +&NAMOPTCMEM +/ +&NAMPAR0 +/ +&NAMPARAR +/ +&NAMPAR1 +/ +&NAMPHY +/ +&NAMPHY0 +/ +&NAMPHY1 +/ +&NAMPHY2 +/ +&NAMPHY3 +/ +&NAMPHYDS +/ +&NAMPPC +/ +&NAMPONG +/ +&NAMRAD15 +/ +&NAMRADCMEM +/ +&NAMRCOEF +/ +&NAMRES +/ +&NAMRINC +/ +&NAMRIP +/ +&NAMSATS +/ +&NAMSCC +/ +&NAMSCEN +/ +&NAMSCM +/ +&NAMSENS +/ +&NAMSIMPHL +/ +&NAMSKF +/ +&NAMSPSDT +/ +&NAMSPP +/ +&NAMSSMI +/ +&NAMSTA +/ +&NAMSTOPH +/ +&NAMTCWV +/ +&NAMTESTVAR +/ +&NAMTOPH +/ +&NAMTOVS +/ +&NAMTRAJP +/ +&NAMTRANS +/ +&NAMTRM +/ +&NAMVAR +/ +&NAMVARBC +/ +&NAMVARBC_AIREP +/ +&NAMVARBC_ALLSKY +/ +&NAMVARBC_GBRAD +/ +&NAMVARBC_RAD +/ +&NAMVARBC_SFCOBS +/ +&NAMVARBC_TCWV +/ +&NAMVARBC_TO3 +/ +&NAMVAREPS +/ +&NAMVDOZ +/ +&NAMVFP +/ +&NAMVRTL +/ +&NAMVV0 +/ +&NAMVV1 +/ +&NAMVV2 +/ +&NAMVWRK +/ +&NAMWAVELETJB +/ +&NAMXFU +/ +&NAMZDI +/ +&NAPHLC +/ +&NAV1IS +/ +&NAEPHLI +/ +&NAMCVER +/ +&NAMPPVI +/ +&NAMSPNG +/ +&NAMRLX +/ +&NAMTHLIM +/ +&NAMOOPS +/ +&NAMINTFLEX +/ +&NAMIAU +/ +&NAMDIM_TRAJ +/ +&NAMVDF +/ +&NAMGWDIAG +/ +&NAMTRANS0 +/ +&NAMMETHOX +/ +&NAM_ATLAS_IFS +/ +&NAETLDIAG +/ +&NAMACV +/ +&NAM_MGRIDS_ADVECTION +/ +&NAMTRAJ +/ +&NAMSATSIM +/ +&NAMCMEM_MW +/ +&NAMPHMSE +/ +&NAMNORGWD +/ +&NAMCLRADLID +/ +&NAMDVISI +/ +&NAM_MGRIDS_ADVECTION +/ +&NAMNUDGLH +/ +&NAMPERTOBS +/ +&NAMVARBC_MODES +/ +&NAMM7CTL +/ diff --git a/ifs-test/tests/t21/test_compo_fc_m7_noemi/README.md b/ifs-test/tests/t21/test_compo_fc_m7_noemi/README.md new file mode 100644 index 00000000..f590620a --- /dev/null +++ b/ifs-test/tests/t21/test_compo_fc_m7_noemi/README.md @@ -0,0 +1,6 @@ +title: test_compo_fc + +# Description + +Forecast test including prognostic composition (aerosols+chemistry) as +used by CAMS. diff --git a/ifs-test/tests/t21/test_compo_fc_m7_noemi/params b/ifs-test/tests/t21/test_compo_fc_m7_noemi/params new file mode 100644 index 00000000..1545ce42 --- /dev/null +++ b/ifs-test/tests/t21/test_compo_fc_m7_noemi/params @@ -0,0 +1,2 @@ +NPROC=2 +NTHREAD=1 diff --git a/ifs-test/tests/t21/test_compo_fc_m7_noemi/postprocessing b/ifs-test/tests/t21/test_compo_fc_m7_noemi/postprocessing new file mode 100644 index 00000000..40f80871 --- /dev/null +++ b/ifs-test/tests/t21/test_compo_fc_m7_noemi/postprocessing @@ -0,0 +1,4 @@ +echo "No sanity checks implemented" + +./ifs-check-tracers +./ifs-check-bitid diff --git a/ifs-test/tests/t21/test_compo_fc_m7_noemi/setup b/ifs-test/tests/t21/test_compo_fc_m7_noemi/setup new file mode 100644 index 00000000..474bdc87 --- /dev/null +++ b/ifs-test/tests/t21/test_compo_fc_m7_noemi/setup @@ -0,0 +1,191 @@ +# Source common environment variables +. ../common/env_vars + +# Pre-empt some common namelist settings. +# NAMARG: +CNMEXP="'hmec'" + +# NAEPHY: +LEO3CH=".TRUE." +NAEPHY_EXTRA="LO3CH_HLO=.FALSE.," + +# NAMDPHY: +NVEXTR="7" +NCEXTR="102" + +# NAMCT0: +NFRPOS=3 +# NAMCT0_EXTRA="NSPPR=1," # uncomment for per-level norms + +# Include common namelists +. ../common/namelists + +# Note: In this setup we include some details by blocks to have a +# more structured and easier to read setup file. For the final +# namelist please check fort.4 after run the experiment. + +cat >> fort.4 << EOF +&NAMGFL +NGHG=2, +YLRCH4_NL%CNAME='kCH4', +YLRCH4_NL%IGRBCODE=210071, +YLRCH4_NL%LGP=.TRUE.,YLRCH4_NL%LTRAJIO=.FALSE., +YGHG_NL(1)%CNAME='CO2_GHG', +YGHG_NL(1)%IGRBCODE=210061, +YGHG_NL(1)%LADV5=true, +YGHG_NL(1)%LASSIM=true, +YGHG_NL(1)%LMASSFIX=true, +YGHG_NL(1)%LNEGFIX=.FALSE., +YGHG_NL(1)%LQM=false, +YGHG_NL(1)%LQM3D=true, +YGHG_NL(1)%BETAMFBC=2, +YGHG_NL(2)%CNAME='CH4_GHG', +YGHG_NL(2)%IGRBCODE=210062, +YGHG_NL(2)%LADV5=true, +YGHG_NL(2)%LASSIM=true, +YGHG_NL(2)%LMASSFIX=true, +YGHG_NL(2)%LNEGFIX=.FALSE., +YGHG_NL(2)%LQM=false, +YGHG_NL(2)%LQM3D=true, +YGHG_NL(2)%BETAMFBC=2, +EOF + +# Include NAMGLF for aerosols (m7) +. ../common/namelist_m7_aero + +cat >> fort.4 << EOF +LAERAOT=false, +LAERLISI=false, +NAEROUT=0, +!YAEROUT_NL(1)%CNAME='AEROUT-7', +!YAEROUT_NL(1)%IGRBCODE=210022, +NUVP=1, +YUVP_NL(1)%CNAME='UVP2DRAD', +YUVP_NL(1)%IGRBCODE=210055, +EOF + +# Include NAMGLF for NAERO_WVL_DIAG +. ../common/namelist_m7_aerowvldiag + + +# Include chem NAMGLF and YEXT_NL (but only to describe species/outputs) +. ../common/namelist_aer_chem + +cat >> fort.4 << EOF + LAERCHEM=true + YQ_NL%LGP=true, + YQ_NL%LSP=false, + YL_NL%LGP=true, + YI_NL%LGP=true, + YA_NL%LGP=true, + YO3_NL%LGP=true, + YQ_NL%LGPINGP=true, + !YR_NL%NREQIN=-1, + !YS_NL%NREQIN=-1, +/ +&NAERAD + LECOMPGRID=false, + RMUZUV=0.01, + NUVTIM=72, + NRADUV=1, + NUV=24, + LUVPROC=false, !CHECK + LUVAERP=true, + KMODTS=2, + NRPROMA=0, + LEPO3RA=true, + LO3_CHEM_UV=true, + NGHGRAD=20, + NAERMACC=1, + !LAER3D=.false., ! CHECK +/ +&NAMFPC + CFPFMT="MODEL", + NFP3DFS=3, + NFP3DFP=4, + MFP3DFS(:)=210203,210061,212255 + MFP3DFP(:)=210011,217003,210062,212253 + NFP2DF=1, + MFP2DF(:)=152, + NFPPHY=8, + MFPPHY(:)=210072,210073,210074,210208,210052,214002,210207,215089, +!MFPPHY(:)=210031,210072,210073,210074,210119,215022,215020,210208,210052,214002,210207,215104,210217,215099,215120,215143,215179,215028,215032,215055,215058,215194,210206,215089,210064,219005,219052 + NRFP3S(:)=-99, + RFP3P=100000.,85000.,70000.,50000., +/ +&NAEAER +EOF + +# Include NAEAER description (YAERO_DESC) => possible not for m7 +. ../common/namelist_m7_yaerodesc + +cat >> fort.4 << EOF + LAERVOL=false, + NDRYDEPVEL_DYN=2, + LAERDUSTSOURCE=true, + LAERDUSTSIZEVAR=true, + LAERDUST_NEWBIN=false, + RAERDUST_REBOUND=0.1, + LAERNGAT=true, + NAERSCAV=3, + LAERGTOP=true, + LAERSEDIM=true, + LAERSEDIMSS=true, + LAERDRYDP=true, + LAERSURF=true, + NSSALT=4, + NDDUST=2, + NSO4SCHEME=1, + LSEASALT_RH80=true, + LAERHYGRO=true, + LAERRRTM=false, +/ +&NAMCOMPO + LCHEM_DIA=true, + LCHEM_DDFLX=true, + LCOMPO_DDFLX_DIR=true, + LCHEM_TROPO=true, + LCOMPO_DCDD=true, + LAERNITRATE=true, + LAEREQSAM4CLIM=false, + LAERSOA=false, + LAERSOA_COUPLED=false, + KGHG_CHEMTEND_CH4=0, + LAERNUCL=true, + AERO_SCHEME="hamm7", +/ +&NAMCHEM + CHEM_SCHEME="tm5", + LCHEM_DIAC=false, + LCHEM_LIGHT=true, + KCHEM_DRYDEP=2, + LCHEM_0NOX=false, + KCHEM_NOXADV=0, + LCHEM_ANAO3=false, + KCHEM_SOLVE=2, + LCHEM_REVCHEM=false, + LCHEM_BASCOE_JON=false, + LCHEM_BASCOE_HETCHEM=true, + LCHEM_EXTENDJNO2=true, + LCHEM_JOUT=false, + LCHEM_AEROI=false, + LCHEM_O3RAD=true, + LCHEM_CSHAPE=.false., + LCHEM_WDFR=.true., +/ + +&NAMMCC + LMCCEC=true, + LMCCIEC=false, + LMCC_COMPO=false, +/ +EOF +# Include compo emissions namelist (moved to end of file) +#. ../common/namelist_m7_compoemis + +. ../common/namelist_aer_compoemis + +cat >> fort.4 << EOF +&NAMM7CTL +/ +EOF diff --git a/ifs-test/tests/t21/test_compo_fc_m7_norad/README.md b/ifs-test/tests/t21/test_compo_fc_m7_norad/README.md new file mode 100644 index 00000000..f590620a --- /dev/null +++ b/ifs-test/tests/t21/test_compo_fc_m7_norad/README.md @@ -0,0 +1,6 @@ +title: test_compo_fc + +# Description + +Forecast test including prognostic composition (aerosols+chemistry) as +used by CAMS. diff --git a/ifs-test/tests/t21/test_compo_fc_m7_norad/params b/ifs-test/tests/t21/test_compo_fc_m7_norad/params new file mode 100644 index 00000000..1545ce42 --- /dev/null +++ b/ifs-test/tests/t21/test_compo_fc_m7_norad/params @@ -0,0 +1,2 @@ +NPROC=2 +NTHREAD=1 diff --git a/ifs-test/tests/t21/test_compo_fc_m7_norad/postprocessing b/ifs-test/tests/t21/test_compo_fc_m7_norad/postprocessing new file mode 100644 index 00000000..40f80871 --- /dev/null +++ b/ifs-test/tests/t21/test_compo_fc_m7_norad/postprocessing @@ -0,0 +1,4 @@ +echo "No sanity checks implemented" + +./ifs-check-tracers +./ifs-check-bitid diff --git a/ifs-test/tests/t21/test_compo_fc_m7_norad/setup b/ifs-test/tests/t21/test_compo_fc_m7_norad/setup new file mode 100644 index 00000000..0c874594 --- /dev/null +++ b/ifs-test/tests/t21/test_compo_fc_m7_norad/setup @@ -0,0 +1,191 @@ +# Source common environment variables +. ../common/env_vars + +# Pre-empt some common namelist settings. +# NAMARG: +CNMEXP="'hmec'" + +# NAEPHY: +LEO3CH=".TRUE." +NAEPHY_EXTRA="LO3CH_HLO=.FALSE.," + +# NAMDPHY: +NVEXTR="7" +NCEXTR="102" + +# NAMCT0: +NFRPOS=3 +# NAMCT0_EXTRA="NSPPR=1," # uncomment for per-level norms + +# Include common namelists +. ../common/namelists + +# Note: In this setup we include some details by blocks to have a +# more structured and easier to read setup file. For the final +# namelist please check fort.4 after run the experiment. + +cat >> fort.4 << EOF +&NAMGFL +NGHG=2, +YLRCH4_NL%CNAME='kCH4', +YLRCH4_NL%IGRBCODE=210071, +YLRCH4_NL%LGP=.TRUE.,YLRCH4_NL%LTRAJIO=.FALSE., +YGHG_NL(1)%CNAME='CO2_GHG', +YGHG_NL(1)%IGRBCODE=210061, +YGHG_NL(1)%LADV5=true, +YGHG_NL(1)%LASSIM=true, +YGHG_NL(1)%LMASSFIX=true, +YGHG_NL(1)%LNEGFIX=.FALSE., +YGHG_NL(1)%LQM=false, +YGHG_NL(1)%LQM3D=true, +YGHG_NL(1)%BETAMFBC=2, +YGHG_NL(2)%CNAME='CH4_GHG', +YGHG_NL(2)%IGRBCODE=210062, +YGHG_NL(2)%LADV5=true, +YGHG_NL(2)%LASSIM=true, +YGHG_NL(2)%LMASSFIX=true, +YGHG_NL(2)%LNEGFIX=.FALSE., +YGHG_NL(2)%LQM=false, +YGHG_NL(2)%LQM3D=true, +YGHG_NL(2)%BETAMFBC=2, +EOF + +# Include NAMGLF for aerosols (m7) +. ../common/namelist_m7_aero + +cat >> fort.4 << EOF +LAERAOT=false, +LAERLISI=false, +NAEROUT=0, +!YAEROUT_NL(1)%CNAME='AEROUT-7', +!YAEROUT_NL(1)%IGRBCODE=210022, +NUVP=1, +YUVP_NL(1)%CNAME='UVP2DRAD', +YUVP_NL(1)%IGRBCODE=210055, +EOF + +# Include NAMGLF for NAERO_WVL_DIAG +. ../common/namelist_m7_aerowvldiag + + +# Include chem NAMGLF and YEXT_NL (but only to describe species/outputs) +. ../common/namelist_aer_chem + +cat >> fort.4 << EOF + LAERCHEM=true + YQ_NL%LGP=true, + YQ_NL%LSP=false, + YL_NL%LGP=true, + YI_NL%LGP=true, + YA_NL%LGP=true, + YO3_NL%LGP=true, + YQ_NL%LGPINGP=true, + !YR_NL%NREQIN=-1, + !YS_NL%NREQIN=-1, +/ +&NAERAD + LECOMPGRID=false, + RMUZUV=0.01, + NUVTIM=72, + NRADUV=1, + NUV=24, + LUVPROC=false, !CHECK + LUVAERP=true, + KMODTS=2, + NRPROMA=0, + LEPO3RA=true, + LO3_CHEM_UV=true, + NGHGRAD=20, + NAERMACC=1, + !LAER3D=.false., ! CHECK +/ +&NAMFPC + CFPFMT="MODEL", + NFP3DFS=3, + NFP3DFP=4, + MFP3DFS(:)=210203,210061,212255 + MFP3DFP(:)=210011,217003,210062,212253 + NFP2DF=1, + MFP2DF(:)=152, + NFPPHY=8, + MFPPHY(:)=210072,210073,210074,210208,210052,214002,210207,215089, +!MFPPHY(:)=210031,210072,210073,210074,210119,215022,215020,210208,210052,214002,210207,215104,210217,215099,215120,215143,215179,215028,215032,215055,215058,215194,210206,215089,210064,219005,219052 + NRFP3S(:)=-99, + RFP3P=100000.,85000.,70000.,50000., +/ +&NAEAER +EOF + +# Include NAEAER description (YAERO_DESC) => possible not for m7 +. ../common/namelist_m7_yaerodesc + +cat >> fort.4 << EOF + LAERVOL=false, + NDRYDEPVEL_DYN=2, + LAERDUSTSOURCE=true, + LAERDUSTSIZEVAR=true, + LAERDUST_NEWBIN=false, + RAERDUST_REBOUND=0.1, + LAERNGAT=true, + NAERSCAV=3, + LAERGTOP=true, + LAERSEDIM=true, + LAERSEDIMSS=true, + LAERDRYDP=true, + LAERSURF=true, + NSSALT=4, + NDDUST=2, + NSO4SCHEME=1, + LSEASALT_RH80=true, + LAERHYGRO=true, + LAERRRTM=false, +/ +&NAMCOMPO + LCHEM_DIA=true, + LCHEM_DDFLX=true, + LCOMPO_DDFLX_DIR=true, + LCHEM_TROPO=true, + LCOMPO_DCDD=true, + LAERNITRATE=true, + LAEREQSAM4CLIM=false, + LAERSOA=false, + LAERSOA_COUPLED=false, + KGHG_CHEMTEND_CH4=0, + LAERNUCL=true, + AERO_SCHEME="hamm7", +/ +&NAMCHEM + CHEM_SCHEME="tm5", + LCHEM_DIAC=false, + LCHEM_LIGHT=true, + KCHEM_DRYDEP=2, + LCHEM_0NOX=false, + KCHEM_NOXADV=0, + LCHEM_ANAO3=false, + KCHEM_SOLVE=2, + LCHEM_REVCHEM=false, + LCHEM_BASCOE_JON=false, + LCHEM_BASCOE_HETCHEM=true, + LCHEM_EXTENDJNO2=true, + LCHEM_JOUT=false, + LCHEM_AEROI=false, + LCHEM_O3RAD=true, + LCHEM_CSHAPE=.false., + LCHEM_WDFR=.true., +/ + +&NAMMCC + LMCCEC=true, + LMCCIEC=false, + LMCC_COMPO=false, +/ +EOF +# Include compo emissions namelist (moved to end of file) +. ../common/namelist_aer_compoemis + +#. ../common/namelist_m7_compoemis + +cat >> fort.4 << EOF +&NAMM7CTL +/ +EOF diff --git a/ifs-test/tests/t255/CMakeLists.txt b/ifs-test/tests/t255/CMakeLists.txt new file mode 100644 index 00000000..90381e77 --- /dev/null +++ b/ifs-test/tests/t255/CMakeLists.txt @@ -0,0 +1,138 @@ +# (C) Copyright 1996-2019 ECMWF. + +get_filename_component(IFS_EXECUTABLE_NAME ${IFS_EXECUTABLE} NAME) + +if( TARGET ${IFS_EXECUTABLE_NAME} ) + list( APPEND TEST_DEPENDS ${IFS_EXECUTABLE_NAME} ) +endif() + +if( IFS_EXECUTABLE_NAME STREQUAL ifsMASTER.DP ) + set(DOUBLE_PRECISION ON) +endif() + +set(APATH_255l_2 /ec/res4/hpcperm/nld5163/openifs/oifs_data/48r1/climate.v020/255l_2) + +execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${CMAKE_CURRENT_SOURCE_DIR}/ifsdata ${CMAKE_CURRENT_BINARY_DIR}/ifsdata ) + +add_subdirectory( common ) + +################################################################# +# Helper function +function( add_ifs_test TARGET ) + + ### (1) COMMON for all tests + execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/${TARGET} ) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${PROJECT_SOURCE_DIR}/bin/ifs-run ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/ifs-run ) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${PROJECT_SOURCE_DIR}/bin/ifs-debug ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/ifs-debug ) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${PROJECT_SOURCE_DIR}/bin/ifs-clean ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/ifs-clean ) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${PROJECT_SOURCE_DIR}/bin/ifs-check-bitid ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/ifs-check-bitid ) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${PROJECT_SOURCE_DIR}/bin/ifs-check-tracers ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/ifs-check-tracers ) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${PROJECT_SOURCE_DIR}/bin/ifs-grep-norms.pl ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/ifs-grep-norms.pl ) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${PROJECT_SOURCE_DIR}/bin/set_launcher.bash ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/set_launcher.bash ) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${SHARE_BINARY_DIR}/ifs_env ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/ifs_env ) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${CMAKE_CURRENT_SOURCE_DIR}/inidata/ICMGGham7INIT ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/ICMGGham7INIT ) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${CMAKE_CURRENT_SOURCE_DIR}/inidata/ICMGGham7INIUA ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/ICMGGham7INIUA ) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${CMAKE_CURRENT_SOURCE_DIR}/inidata/ICMSHham7INIT ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/ICMSHham7INIT ) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${CMAKE_CURRENT_SOURCE_DIR}/inidata/ICMCLham7INIT ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/ICMCLham7INIT ) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${CMAKE_CURRENT_SOURCE_DIR}/../compo_data/m7/lookup_table.nc ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/lookup_table.nc) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${CMAKE_CURRENT_SOURCE_DIR}/../compo_data/m7/refractive_indices_hdfstyle.nc ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/refractive_indices_hdfstyle.nc) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${CMAKE_CURRENT_SOURCE_DIR}/../compo_data/m7/namelist.echam ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/namelist.echam) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${CMAKE_CURRENT_SOURCE_DIR}/../compo_data/m7/parnuc.15H2SO4.nc ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/parnuc.15H2SO4.nc) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${CMAKE_CURRENT_SOURCE_DIR}/../compo_data/m7/lut_kappa.nc ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/lut_kappa.nc) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${CMAKE_CURRENT_SOURCE_DIR}/../compo_data/OMI.data.extraterrest ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/OMI.data.extraterrest ) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${CMAKE_CURRENT_SOURCE_DIR}/../compo_data/aerosol_reduce.dat ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/aerosol_reduce.dat ) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${CMAKE_CURRENT_SOURCE_DIR}/../compo_data/tropo_look_up_cbmhybrid.dat ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/tropo_look_up_cbmhybrid.dat ) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${CMAKE_CURRENT_SOURCE_DIR}/../compo_data/uars_ratio.txt ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/uars_ratio.txt ) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${CMAKE_CURRENT_SOURCE_DIR}/../compo_data/haloe_ch4clim.dat ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/haloe_ch4clim.dat ) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink ${APATH_255l_2} ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/255l_2 ) + + # execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + # ${CMAKE_CURRENT_SOURCE_DIR}/../compo_data/255l_2 ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/255l_2 ) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${CMAKE_CURRENT_SOURCE_DIR}/ifsdata ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/ifsdata ) + + if( EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${TARGET}/params" ) + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${CMAKE_CURRENT_SOURCE_DIR}/${TARGET}/params ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/params ) + endif() + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${CMAKE_CURRENT_SOURCE_DIR}/${TARGET}/setup ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/setup ) + + if( EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${TARGET}/postprocessing" ) + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${CMAKE_CURRENT_SOURCE_DIR}/${TARGET}/postprocessing ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/postprocessing ) + endif() + + ecbuild_add_test( TARGET ifs_t255_${TARGET} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${TARGET} + COMMAND "./ifs-run" + DEPENDS ${TEST_DEPENDS} + ) + set_property(TEST ifs_t255_${TARGET} APPEND PROPERTY LABELS t255) + +endfunction() + +################################################################# +# add tests + +add_ifs_test( test_compo_fc_m7 ) + +# Test which can only be run if OOPS-IFS has been compiled: +# if( ifs_HAVE_OOPS ) +# add_ifs_test( test_compo_fc_dualconf ) +# endif() + + +if( ENABLE_TESTS ) + + set_property(TEST ifs_t255_test_compo_fc_m7 APPEND PROPERTY LABELS forecast mpi threading composition m7) + +endif() diff --git a/ifs-test/tests/t255/common/CMakeLists.txt b/ifs-test/tests/t255/common/CMakeLists.txt new file mode 100644 index 00000000..e361fb67 --- /dev/null +++ b/ifs-test/tests/t255/common/CMakeLists.txt @@ -0,0 +1,18 @@ +# (C) Copyright 1996-2019 ECMWF. +# (C) Copyright 2024 KNMI. + +configure_file(env_vars env_vars COPYONLY) +configure_file(namelists namelists COPYONLY) + +# === Specific for m7 tests ============================================= + +configure_file(m7/m7_aero.nml namelist_m7_aero COPYONLY) +configure_file(m7/m7_aerowvldiag.nml namelist_m7_aerowvldiag COPYONLY) +configure_file(m7/m7_chem.nml namelist_m7_chem COPYONLY) +configure_file(m7/m7_compoemis.nml namelist_m7_compoemis COPYONLY) + +# === Parts that are replicated from test_compo_fc ==================== + +configure_file(aer/aer_yaerodesc.nml namelist_aer_yaerodesc COPYONLY) +configure_file(aer/aer_chem.nml namelist_aer_chem COPYONLY) +configure_file(aer/aer_compoemis.nml namelist_aer_compoemis COPYONLY) diff --git a/ifs-test/tests/t255/common/env_vars b/ifs-test/tests/t255/common/env_vars new file mode 100644 index 00000000..76761244 --- /dev/null +++ b/ifs-test/tests/t255/common/env_vars @@ -0,0 +1,24 @@ +# Environment variables inherited by all t21 tests: + +export OMP_STACKSIZE="64M" + +export CRAYBLAS_AUTOTUNING_OFF=1 +export ATP_ENABLED=1 + +export MPICH_RANK_REORDER_DISPLAY=1 + +export GRIB_API_IO_BUFFER_SIZE=4194304 +export GRIB_API_WRITE_ON_FAIL=0 +export GRIB_API_LARGE_CONSTANT_FIELDS=1 + +export DR_HOOK=1 +export DR_HOOK_IGNORE_SIGNALS=0 + +export DR_HOOK_OPT="prof" +export DATA=${WORK_DIR} + +export FDB_DEBUG=no +export FDB_IO=aio +export TRACEBACK_LEVEL=2 + +export MPICH_MAX_THREAD_SAFETY=multiple diff --git a/ifs-test/tests/t255/common/m7/m7_aero.nml b/ifs-test/tests/t255/common/m7/m7_aero.nml new file mode 100644 index 00000000..d5afe234 --- /dev/null +++ b/ifs-test/tests/t255/common/m7/m7_aero.nml @@ -0,0 +1,338 @@ +cat >> fort.4 << EOF +NAERO=37, +NACTAERO=37, +YAERO_NL(1)%CNAME='SO4', +YAERO_NL(1)%IGRBCODE=210011, +YAERO_NL(1)%LMASSFIX=.true., +!YAERO_NL(1)%LCOMAD=.true., +YAERO_NL(1)%LQM=.false., +YAERO_NL(1)%LQM3D=.true., +YAERO_NL(1)%BETAMFBC=-999, +YAERO_NL(1)%LADV=.true., +YAERO_NL(1)%NREQIN=0, +YAERO_NL(2)%CNAME='NH4', +YAERO_NL(2)%IGRBCODE=212035, +YAERO_NL(2)%LMASSFIX=.true., +!YAERO_NL(2)%LCOMAD=.true., +YAERO_NL(2)%LQM=.false., +YAERO_NL(2)%LQM3D=.true., +YAERO_NL(2)%BETAMFBC=-999, +YAERO_NL(2)%LADV=.true., +YAERO_NL(2)%NREQIN=0, +YAERO_NL(3)%CNAME='NO3_A', +YAERO_NL(3)%IGRBCODE=212036, +YAERO_NL(3)%LMASSFIX=.true., +!YAERO_NL(3)%LCOMAD=.true., +YAERO_NL(3)%LQM=.false., +YAERO_NL(3)%LQM3D=.true., +YAERO_NL(3)%BETAMFBC=-999, +YAERO_NL(3)%LADV=.true., +YAERO_NL(3)%NREQIN=0, +YAERO_NL(4)%CNAME='ACS_N', +YAERO_NL(4)%IGRBCODE=212001, +YAERO_NL(4)%LMASSFIX=.true., +!YAERO_NL(4)%LCOMAD=.true., +YAERO_NL(4)%LQM=.false., +YAERO_NL(4)%LQM3D=.true., +YAERO_NL(4)%BETAMFBC=-999, +YAERO_NL(4)%LADV=.true., +YAERO_NL(4)%NREQIN=0, +YAERO_NL(5)%CNAME='SO4ACS', +YAERO_NL(5)%IGRBCODE=212002, +YAERO_NL(5)%LMASSFIX=.true., +!YAERO_NL(5)%LCOMAD=.true., +YAERO_NL(5)%LQM=.false., +YAERO_NL(5)%LQM3D=.true., +YAERO_NL(5)%BETAMFBC=-999, +YAERO_NL(5)%LADV=.true., +YAERO_NL(5)%NREQIN=0, +YAERO_NL(6)%CNAME='BCACS', +YAERO_NL(6)%IGRBCODE=212003, +YAERO_NL(6)%LMASSFIX=.true., +!YAERO_NL(6)%LCOMAD=.true., +YAERO_NL(6)%LQM=.false., +YAERO_NL(6)%LQM3D=.true., +YAERO_NL(6)%BETAMFBC=-999, +YAERO_NL(6)%LADV=.true., +YAERO_NL(6)%NREQIN=0, +YAERO_NL(7)%CNAME='POMACS', +YAERO_NL(7)%IGRBCODE=212004, +YAERO_NL(7)%LMASSFIX=.true., +!YAERO_NL(7)%LCOMAD=.true., +YAERO_NL(7)%LQM=.false., +YAERO_NL(7)%LQM3D=.true., +YAERO_NL(7)%BETAMFBC=-999, +YAERO_NL(7)%LADV=.true., +YAERO_NL(7)%NREQIN=0, +YAERO_NL(8)%CNAME='SSACS', +YAERO_NL(8)%IGRBCODE=212005, +YAERO_NL(8)%LMASSFIX=.true., +!YAERO_NL(8)%LCOMAD=.true., +YAERO_NL(8)%LQM=.false., +YAERO_NL(8)%LQM3D=.true., +YAERO_NL(8)%BETAMFBC=-999, +YAERO_NL(8)%LADV=.true., +YAERO_NL(8)%NREQIN=0, +YAERO_NL(9)%CNAME='DUACS', +YAERO_NL(9)%IGRBCODE=212006, +YAERO_NL(9)%LMASSFIX=.true., +!YAERO_NL(9)%LCOMAD=.true., +YAERO_NL(9)%LQM=.false., +YAERO_NL(9)%LQM3D=.true., +YAERO_NL(9)%BETAMFBC=-999, +YAERO_NL(9)%LADV=.true., +YAERO_NL(9)%NREQIN=0, +YAERO_NL(10)%CNAME='SOANUS', +YAERO_NL(10)%IGRBCODE=212007, +YAERO_NL(10)%LMASSFIX=.true., +!YAERO_NL(10)%LCOMAD=.true., +YAERO_NL(10)%LQM=.false., +YAERO_NL(10)%LQM3D=.true., +YAERO_NL(10)%BETAMFBC=-999, +YAERO_NL(10)%LADV=.true., +YAERO_NL(10)%NREQIN=0, +YAERO_NL(11)%CNAME='SOAAIS', +YAERO_NL(11)%IGRBCODE=212008, +YAERO_NL(11)%LMASSFIX=.true., +!YAERO_NL(11)%LCOMAD=.true., +YAERO_NL(11)%LQM=.false., +YAERO_NL(11)%LQM3D=.true., +YAERO_NL(11)%BETAMFBC=-999, +YAERO_NL(11)%LADV=.true., +YAERO_NL(11)%NREQIN=0, +YAERO_NL(12)%CNAME='SOAACS', +YAERO_NL(12)%IGRBCODE=212009, +YAERO_NL(12)%LMASSFIX=.true., +!YAERO_NL(12)%LCOMAD=.true., +YAERO_NL(12)%LQM=.false., +YAERO_NL(12)%LQM3D=.true., +YAERO_NL(12)%BETAMFBC=-999, +YAERO_NL(12)%LADV=.true., +YAERO_NL(12)%NREQIN=0, +YAERO_NL(13)%CNAME='SOACOS', +YAERO_NL(13)%IGRBCODE=212010, +YAERO_NL(13)%LMASSFIX=.true., +!YAERO_NL(13)%LCOMAD=.true., +YAERO_NL(13)%LQM=.false., +YAERO_NL(13)%LQM3D=.true., +YAERO_NL(13)%BETAMFBC=-999, +YAERO_NL(13)%LADV=.true., +YAERO_NL(13)%NREQIN=0, +YAERO_NL(14)%CNAME='SOAAII', +YAERO_NL(14)%IGRBCODE=212011, +YAERO_NL(14)%LMASSFIX=.true., +!YAERO_NL(14)%LCOMAD=.true., +YAERO_NL(14)%LQM=.false., +YAERO_NL(14)%LQM3D=.true., +YAERO_NL(14)%BETAMFBC=-999, +YAERO_NL(14)%LADV=.true., +YAERO_NL(14)%NREQIN=0, +YAERO_NL(15)%CNAME='H2OPART', +YAERO_NL(15)%IGRBCODE=212012, +YAERO_NL(15)%LMASSFIX=.true., +!YAERO_NL(15)%LCOMAD=.true., +YAERO_NL(15)%LQM=.false., +YAERO_NL(15)%LQM3D=.true., +YAERO_NL(15)%BETAMFBC=-999, +YAERO_NL(15)%LADV=.true., +YAERO_NL(15)%NREQIN=0, +YAERO_NL(16)%CNAME='AII_N', +YAERO_NL(16)%IGRBCODE=212013, +YAERO_NL(16)%LMASSFIX=.true., +!YAERO_NL(16)%LCOMAD=.true., +YAERO_NL(16)%LQM=.false., +YAERO_NL(16)%LQM3D=.true., +YAERO_NL(16)%BETAMFBC=-999, +YAERO_NL(16)%LADV=.true., +YAERO_NL(16)%NREQIN=0, +YAERO_NL(17)%CNAME='BCAII', +YAERO_NL(17)%IGRBCODE=212014, +YAERO_NL(17)%LMASSFIX=.true., +!YAERO_NL(17)%LCOMAD=.true., +YAERO_NL(17)%LQM=.false., +YAERO_NL(17)%LQM3D=.true., +YAERO_NL(17)%BETAMFBC=-999, +YAERO_NL(17)%LADV=.true., +YAERO_NL(17)%NREQIN=0, +YAERO_NL(18)%CNAME='POMAII', +YAERO_NL(18)%IGRBCODE=212015, +YAERO_NL(18)%LMASSFIX=.true., +!YAERO_NL(18)%LCOMAD=.true., +YAERO_NL(18)%LQM=.false., +YAERO_NL(18)%LQM3D=.true., +YAERO_NL(18)%BETAMFBC=-999, +YAERO_NL(18)%LADV=.true., +YAERO_NL(18)%NREQIN=0, +YAERO_NL(19)%CNAME='ACI_N', +YAERO_NL(19)%IGRBCODE=212016, +YAERO_NL(19)%LMASSFIX=.true., +!YAERO_NL(19)%LCOMAD=.true., +YAERO_NL(19)%LQM=.false., +YAERO_NL(19)%LQM3D=.true., +YAERO_NL(19)%BETAMFBC=-999, +YAERO_NL(19)%LADV=.true., +YAERO_NL(19)%NREQIN=0, +YAERO_NL(20)%CNAME='DUACI', +YAERO_NL(20)%IGRBCODE=212017, +YAERO_NL(20)%LMASSFIX=.true., +!YAERO_NL(20)%LCOMAD=.true., +YAERO_NL(20)%LQM=.false., +YAERO_NL(20)%LQM3D=.true., +YAERO_NL(20)%BETAMFBC=-999, +YAERO_NL(20)%LADV=.true., +YAERO_NL(20)%NREQIN=0, +YAERO_NL(21)%CNAME='AIS_N', +YAERO_NL(21)%IGRBCODE=212018, +YAERO_NL(21)%LMASSFIX=.true., +!YAERO_NL(21)%LCOMAD=.true., +YAERO_NL(21)%LQM=.false., +YAERO_NL(21)%LQM3D=.true., +YAERO_NL(21)%BETAMFBC=-999, +YAERO_NL(21)%LADV=.true., +YAERO_NL(21)%NREQIN=0, +YAERO_NL(22)%CNAME='SO4AIS', +YAERO_NL(22)%IGRBCODE=212019, +YAERO_NL(22)%LMASSFIX=.true., +!YAERO_NL(22)%LCOMAD=.true., +YAERO_NL(22)%LQM=.false., +YAERO_NL(22)%LQM3D=.true., +YAERO_NL(22)%BETAMFBC=-999, +YAERO_NL(22)%LADV=.true., +YAERO_NL(22)%NREQIN=0, +YAERO_NL(23)%CNAME='BCAIS', +YAERO_NL(23)%IGRBCODE=212020, +YAERO_NL(23)%LMASSFIX=.true., +!YAERO_NL(23)%LCOMAD=.true., +YAERO_NL(23)%LQM=.false., +YAERO_NL(23)%LQM3D=.true., +YAERO_NL(23)%BETAMFBC=-999, +YAERO_NL(23)%LADV=.true., +YAERO_NL(23)%NREQIN=0, +YAERO_NL(24)%CNAME='POMAIS', +YAERO_NL(24)%IGRBCODE=212021, +YAERO_NL(24)%LMASSFIX=.true., +!YAERO_NL(24)%LCOMAD=.true., +YAERO_NL(24)%LQM=.false., +YAERO_NL(24)%LQM3D=.true., +YAERO_NL(24)%BETAMFBC=-999, +YAERO_NL(24)%LADV=.true., +YAERO_NL(24)%NREQIN=0, +YAERO_NL(25)%CNAME='COI_N', +YAERO_NL(25)%IGRBCODE=212022, +YAERO_NL(25)%LMASSFIX=.true., +!YAERO_NL(25)%LCOMAD=.true., +YAERO_NL(25)%LQM=.false., +YAERO_NL(25)%LQM3D=.true., +YAERO_NL(25)%BETAMFBC=-999, +YAERO_NL(25)%LADV=.true., +YAERO_NL(25)%NREQIN=0, +YAERO_NL(26)%CNAME='DUCOI', +YAERO_NL(26)%IGRBCODE=212023, +YAERO_NL(26)%LMASSFIX=.true., +!YAERO_NL(26)%LCOMAD=.true., +YAERO_NL(26)%LQM=.false., +YAERO_NL(26)%LQM3D=.true., +YAERO_NL(26)%BETAMFBC=-999, +YAERO_NL(26)%LADV=.true., +YAERO_NL(26)%NREQIN=0, +YAERO_NL(27)%CNAME='COS_N', +YAERO_NL(27)%IGRBCODE=212024, +YAERO_NL(27)%LMASSFIX=.true., +!YAERO_NL(27)%LCOMAD=.true., +YAERO_NL(27)%LQM=.false., +YAERO_NL(27)%LQM3D=.true., +YAERO_NL(27)%BETAMFBC=-999, +YAERO_NL(27)%LADV=.true., +YAERO_NL(27)%NREQIN=0, +YAERO_NL(28)%CNAME='SO4COS', +YAERO_NL(28)%IGRBCODE=212025, +YAERO_NL(28)%LMASSFIX=.true., +!YAERO_NL(28)%LCOMAD=.true., +YAERO_NL(28)%LQM=.false., +YAERO_NL(28)%LQM3D=.true., +YAERO_NL(28)%BETAMFBC=-999, +YAERO_NL(28)%LADV=.true., +YAERO_NL(28)%NREQIN=0, +YAERO_NL(29)%CNAME='BCCOS', +YAERO_NL(29)%IGRBCODE=212026, +YAERO_NL(29)%LMASSFIX=.true., +!YAERO_NL(29)%LCOMAD=.true., +YAERO_NL(29)%LQM=.false., +YAERO_NL(29)%LQM3D=.true., +YAERO_NL(29)%BETAMFBC=-999, +YAERO_NL(29)%LADV=.true., +YAERO_NL(29)%NREQIN=0, +YAERO_NL(30)%CNAME='POMCOS', +YAERO_NL(30)%IGRBCODE=212027, +YAERO_NL(30)%LMASSFIX=.true., +!YAERO_NL(30)%LCOMAD=.true., +YAERO_NL(30)%LQM=.false., +YAERO_NL(30)%LQM3D=.true., +YAERO_NL(30)%BETAMFBC=-999, +YAERO_NL(30)%LADV=.true., +YAERO_NL(30)%NREQIN=0, +YAERO_NL(31)%CNAME='SSCOS', +YAERO_NL(31)%IGRBCODE=212028, +YAERO_NL(31)%LMASSFIX=.true., +!YAERO_NL(31)%LCOMAD=.true., +YAERO_NL(31)%LQM=.false., +YAERO_NL(31)%LQM3D=.true., +YAERO_NL(31)%BETAMFBC=-999, +YAERO_NL(31)%LADV=.true., +YAERO_NL(31)%NREQIN=0, +YAERO_NL(32)%CNAME='DUCOS', +YAERO_NL(32)%IGRBCODE=212029, +YAERO_NL(32)%LMASSFIX=.true., +!YAERO_NL(32)%LCOMAD=.true., +YAERO_NL(32)%LQM=.false., +YAERO_NL(32)%LQM3D=.true., +YAERO_NL(32)%BETAMFBC=-999, +YAERO_NL(32)%LADV=.true., +YAERO_NL(32)%NREQIN=0, +YAERO_NL(33)%CNAME='NUS_N', +YAERO_NL(33)%IGRBCODE=212030, +YAERO_NL(33)%LMASSFIX=.true., +!YAERO_NL(33)%LCOMAD=.true., +YAERO_NL(33)%LQM=.false., +YAERO_NL(33)%LQM3D=.true., +YAERO_NL(33)%BETAMFBC=-999, +YAERO_NL(33)%LADV=.true., +YAERO_NL(33)%NREQIN=0, +YAERO_NL(34)%CNAME='SO4NUS', +YAERO_NL(34)%IGRBCODE=212031, +YAERO_NL(34)%LMASSFIX=.true., +!YAERO_NL(34)%LCOMAD=.true., +YAERO_NL(34)%LQM=.false., +YAERO_NL(34)%LQM3D=.true., +YAERO_NL(34)%BETAMFBC=-999, +YAERO_NL(34)%LADV=.true., +YAERO_NL(34)%NREQIN=0, +YAERO_NL(35)%CNAME='ELVOC', +YAERO_NL(35)%IGRBCODE=212032, +YAERO_NL(35)%LMASSFIX=.true., +!YAERO_NL(35)%LCOMAD=.true., +YAERO_NL(35)%LQM=.false., +YAERO_NL(35)%LQM3D=.true., +YAERO_NL(35)%BETAMFBC=-999, +YAERO_NL(35)%LADV=.true., +YAERO_NL(35)%NREQIN=0, +YAERO_NL(36)%CNAME='ISVOC', +YAERO_NL(36)%IGRBCODE=212033, +YAERO_NL(36)%LMASSFIX=.true., +!YAERO_NL(36)%LCOMAD=.true., +YAERO_NL(36)%LQM=.false., +YAERO_NL(36)%LQM3D=.true., +YAERO_NL(36)%BETAMFBC=-999, +YAERO_NL(36)%LADV=.true., +YAERO_NL(36)%NREQIN=0, +YAERO_NL(37)%CNAME='MSA', +YAERO_NL(37)%IGRBCODE=212034, +YAERO_NL(37)%LMASSFIX=.true., +!YAERO_NL(37)%LCOMAD=.true., +YAERO_NL(37)%LQM=.false., +YAERO_NL(37)%LQM3D=.true., +YAERO_NL(37)%BETAMFBC=-999, +YAERO_NL(37)%LADV=.true., +YAERO_NL(37)%NREQIN=0, +EOF + diff --git a/ifs-test/tests/t255/common/m7/m7_aerowvldiag.nml b/ifs-test/tests/t255/common/m7/m7_aerowvldiag.nml new file mode 100644 index 00000000..86a28150 --- /dev/null +++ b/ifs-test/tests/t255/common/m7/m7_aerowvldiag.nml @@ -0,0 +1,19 @@ +cat >> fort.4 << EOF +NAEROUT=0, +NAERO_WVL_DIAG=6, +NAERO_WVL_DIAG_TYPES=5, +YAERO_WVL_DIAG_NL(1)%IWVL=550, +YAERO_WVL_DIAG_NL(1)%IGRIBDIAG=210207,215104,215122,215140,215158, +YAERO_WVL_DIAG_NL(2)%IWVL=380, +YAERO_WVL_DIAG_NL(2)%IGRIBDIAG=210219,215098,215116,215134,215152, +YAERO_WVL_DIAG_NL(3)%IWVL=440, +YAERO_WVL_DIAG_NL(3)%IGRIBDIAG=210221,215100,215118,215136,215154, +YAERO_WVL_DIAG_NL(4)%IWVL=670, +YAERO_WVL_DIAG_NL(4)%IGRIBDIAG=210214,215106,215124,215142,215160, +YAERO_WVL_DIAG_NL(5)%IWVL=870, +YAERO_WVL_DIAG_NL(5)%IGRIBDIAG=210215,215109,215127,215145,215163, +YAERO_WVL_DIAG_NL(6)%IWVL=1020, +YAERO_WVL_DIAG_NL(6)%IGRIBDIAG=210227,215110,215128,215146,215164, +EOF + + diff --git a/ifs-test/tests/t255/common/m7/m7_chem.nml b/ifs-test/tests/t255/common/m7/m7_chem.nml new file mode 100644 index 00000000..454a91b7 --- /dev/null +++ b/ifs-test/tests/t255/common/m7/m7_chem.nml @@ -0,0 +1,1120 @@ +cat >> fort.4 << EOF +NCHEM=74, +YCHEM_NL(1)%CNAME='O3', +YCHEM_NL(1)%NREQIN=1, +YCHEM_NL(1)%RMOLMASS=48.0, +YCHEM_NL(1)%IGRBCODE=210203, +YCHEM_NL(1)%LNEGFIX=.TRUE., +YCHEM_NL(1)%IGRIBTC=210206, +YCHEM_NL(1)%IGRIBDV=221001, +YCHEM_NL(1)%HENRYA=1.0e-2, +YCHEM_NL(1)%HENRYB=2800.0, +YCHEM_NL(1)%LQM=.false., +YCHEM_NL(1)%LQM3D=.TRUE., +!YCHEM_NL(1)%LCOMAD=.true., +YCHEM_NL(1)%LADV=.TRUE., +YCHEM_NL(1)%LMASSFIX=.TRUE., +YCHEM_NL(1)%BETAMFBC=-999.9, +YCHEM_NL(1)%LASSIM=.TRUE., +YCHEM_NL(1)%LADV5=.TRUE., +YCHEM_NL(2)%CNAME='NOx', +YCHEM_NL(2)%NREQIN=0, +YCHEM_NL(2)%RMOLMASS=14.0, +YCHEM_NL(2)%IGRBCODE=210129, +YCHEM_NL(2)%LNEGFIX=.TRUE., +YCHEM_NL(2)%IGRIBTC=210130, +YCHEM_NL(2)%LQM=.false., +YCHEM_NL(2)%LQM3D=.TRUE., +!YCHEM_NL(2)%LCOMAD=.true., +YCHEM_NL(2)%LADV=.TRUE., +YCHEM_NL(2)%LMASSFIX=.TRUE., +YCHEM_NL(2)%BETAMFBC=-999.9, +YCHEM_NL(2)%LASSIM=.FALSE., +YCHEM_NL(3)%CNAME='H2O2', +YCHEM_NL(3)%NREQIN=1, +YCHEM_NL(3)%RMOLMASS=34.0, +YCHEM_NL(3)%IGRBCODE=217003, +YCHEM_NL(3)%LNEGFIX=.TRUE., +YCHEM_NL(3)%IGRIBTC=218003, +YCHEM_NL(3)%IGRIBDV=221003, +YCHEM_NL(3)%HENRYA=8.3e4, +YCHEM_NL(3)%HENRYB=7600.0, +YCHEM_NL(3)%LQM=.false., +YCHEM_NL(3)%LQM3D=.TRUE., +!YCHEM_NL(3)%LCOMAD=.true., +YCHEM_NL(3)%LADV=.TRUE., +YCHEM_NL(3)%LMASSFIX=.TRUE., +YCHEM_NL(3)%BETAMFBC=-999.9, +YCHEM_NL(3)%LASSIM=.FALSE., +YCHEM_NL(4)%CNAME='CH4', +YCHEM_NL(4)%NREQIN=1, +YCHEM_NL(4)%RMOLMASS=16.0, +YCHEM_NL(4)%IGRBCODE=217004, +YCHEM_NL(4)%LNEGFIX=.TRUE., +YCHEM_NL(4)%IGRIBTC=218004, +YCHEM_NL(4)%LQM=.false., +YCHEM_NL(4)%LQM3D=.TRUE., +!YCHEM_NL(4)%LCOMAD=.true., +YCHEM_NL(4)%LADV=.TRUE., +YCHEM_NL(4)%LMASSFIX=.TRUE., +YCHEM_NL(4)%BETAMFBC=-999.9, +YCHEM_NL(4)%LASSIM=.FALSE., +YCHEM_NL(5)%CNAME='CO', +YCHEM_NL(5)%NREQIN=1, +YCHEM_NL(5)%RMOLMASS=28.0, +YCHEM_NL(5)%IGRBCODE=210123, +YCHEM_NL(5)%LNEGFIX=.TRUE., +YCHEM_NL(5)%IGRIBTC=210127, +YCHEM_NL(5)%IGRIBDV=221005, +YCHEM_NL(5)%HENRYA=9.7e-4, +YCHEM_NL(5)%HENRYB=1300.0, +YCHEM_NL(5)%LQM=.false., +YCHEM_NL(5)%LQM3D=.TRUE., +!YCHEM_NL(5)%LCOMAD=.true., +YCHEM_NL(5)%LADV=.TRUE., +YCHEM_NL(5)%LMASSFIX=.TRUE., +YCHEM_NL(5)%BETAMFBC=-999.9, +YCHEM_NL(5)%LASSIM=.TRUE., +YCHEM_NL(5)%LADV5=.TRUE., +YCHEM_NL(6)%CNAME='HNO3', +YCHEM_NL(6)%NREQIN=1, +YCHEM_NL(6)%RMOLMASS=63.0, +YCHEM_NL(6)%IGRBCODE=217006, +YCHEM_NL(6)%LNEGFIX=.TRUE., +YCHEM_NL(6)%IGRIBTC=218006, +YCHEM_NL(6)%IGRIBDV=221006, +YCHEM_NL(6)%HENRYA=3.2e11, +YCHEM_NL(6)%HENRYB=8700.0, +YCHEM_NL(6)%LQM=.false., +YCHEM_NL(6)%LQM3D=.TRUE., +!YCHEM_NL(6)%LCOMAD=.true., +YCHEM_NL(6)%LADV=.TRUE., +YCHEM_NL(6)%LMASSFIX=.TRUE., +YCHEM_NL(6)%BETAMFBC=-999.9, +YCHEM_NL(6)%LASSIM=.FALSE., +YCHEM_NL(7)%CNAME='CH3OOH', +YCHEM_NL(7)%NREQIN=1, +YCHEM_NL(7)%RMOLMASS=48.0, +YCHEM_NL(7)%IGRBCODE=217007, +YCHEM_NL(7)%LNEGFIX=.TRUE., +YCHEM_NL(7)%IGRIBTC=218007, +YCHEM_NL(7)%IGRIBDV=221007, +YCHEM_NL(7)%HENRYA=2.9e2, +YCHEM_NL(7)%HENRYB=5200.0, +YCHEM_NL(7)%LQM=.false., +YCHEM_NL(7)%LQM3D=.TRUE., +!YCHEM_NL(7)%LCOMAD=.true., +YCHEM_NL(7)%LADV=.TRUE., +YCHEM_NL(7)%LMASSFIX=.TRUE., +YCHEM_NL(7)%BETAMFBC=-999.9, +YCHEM_NL(7)%LASSIM=.FALSE., +YCHEM_NL(8)%CNAME='CH2O', +YCHEM_NL(8)%NREQIN=1, +YCHEM_NL(8)%RMOLMASS=30.0, +YCHEM_NL(8)%IGRBCODE=210124, +YCHEM_NL(8)%LNEGFIX=.TRUE., +YCHEM_NL(8)%IGRIBTC=210128, +YCHEM_NL(8)%IGRIBDV=221008, +YCHEM_NL(8)%HENRYA=3.2e3, +YCHEM_NL(8)%HENRYB=6800.0, +YCHEM_NL(8)%LQM=.false., +YCHEM_NL(8)%LQM3D=.TRUE., +!YCHEM_NL(8)%LCOMAD=.true., +YCHEM_NL(8)%LADV=.TRUE., +YCHEM_NL(8)%LMASSFIX=.TRUE., +YCHEM_NL(8)%BETAMFBC=-999.9, +YCHEM_NL(8)%LASSIM=.TRUE., +YCHEM_NL(8)%LADV5=.TRUE., +YCHEM_NL(9)%CNAME='PAR', +YCHEM_NL(9)%NREQIN=1, +YCHEM_NL(9)%RMOLMASS=12.0, +YCHEM_NL(9)%IGRBCODE=217009, +YCHEM_NL(9)%LNEGFIX=.TRUE., +YCHEM_NL(9)%IGRIBTC=218009, +YCHEM_NL(9)%LQM=.false., +YCHEM_NL(9)%LQM3D=.TRUE., +!YCHEM_NL(9)%LCOMAD=.true., +YCHEM_NL(9)%LADV=.TRUE., +YCHEM_NL(9)%LMASSFIX=.TRUE., +YCHEM_NL(9)%BETAMFBC=-999.9, +YCHEM_NL(9)%LASSIM=.FALSE., +YCHEM_NL(10)%CNAME='C2H4', +YCHEM_NL(10)%NREQIN=1, +YCHEM_NL(10)%RMOLMASS=28.0, +YCHEM_NL(10)%IGRBCODE=217010, +YCHEM_NL(10)%LNEGFIX=.TRUE., +YCHEM_NL(10)%IGRIBTC=218010, +YCHEM_NL(10)%LQM=.false., +YCHEM_NL(10)%LQM3D=.TRUE., +!YCHEM_NL(10)%LCOMAD=.true., +YCHEM_NL(10)%LADV=.TRUE., +YCHEM_NL(10)%LMASSFIX=.TRUE., +YCHEM_NL(10)%BETAMFBC=-999.9, +YCHEM_NL(10)%LASSIM=.FALSE., +YCHEM_NL(11)%CNAME='OLE', +YCHEM_NL(11)%NREQIN=1, +YCHEM_NL(11)%RMOLMASS=24.0, +YCHEM_NL(11)%IGRBCODE=217011, +YCHEM_NL(11)%LNEGFIX=.TRUE., +YCHEM_NL(11)%IGRIBTC=218011, +YCHEM_NL(11)%LQM=.false., +YCHEM_NL(11)%LQM3D=.TRUE., +!YCHEM_NL(11)%LCOMAD=.true., +YCHEM_NL(11)%LADV=.TRUE., +YCHEM_NL(11)%LMASSFIX=.TRUE., +YCHEM_NL(11)%BETAMFBC=-999.9, +YCHEM_NL(11)%LASSIM=.FALSE., +YCHEM_NL(12)%CNAME='ALD2', +YCHEM_NL(12)%NREQIN=1, +YCHEM_NL(12)%RMOLMASS=24.0, +YCHEM_NL(12)%IGRBCODE=217012, +YCHEM_NL(12)%LNEGFIX=.TRUE., +YCHEM_NL(12)%IGRIBTC=218012, +YCHEM_NL(12)%IGRIBDV=221012, +YCHEM_NL(12)%HENRYA=17.0, +YCHEM_NL(12)%HENRYB=5000.0, +YCHEM_NL(12)%LQM=.false., +YCHEM_NL(12)%LQM3D=.TRUE., +!YCHEM_NL(12)%LCOMAD=.true., +YCHEM_NL(12)%LADV=.TRUE., +YCHEM_NL(12)%LMASSFIX=.TRUE., +YCHEM_NL(12)%BETAMFBC=-999.9, +YCHEM_NL(12)%LASSIM=.FALSE., +YCHEM_NL(13)%CNAME='PAN', +YCHEM_NL(13)%NREQIN=1, +YCHEM_NL(13)%RMOLMASS=121.0, +YCHEM_NL(13)%IGRBCODE=217013, +YCHEM_NL(13)%LNEGFIX=.TRUE., +YCHEM_NL(13)%IGRIBTC=218013, +YCHEM_NL(13)%IGRIBDV=221013, +YCHEM_NL(13)%HENRYA=2.9e+0, +YCHEM_NL(13)%HENRYB=5700.0, +YCHEM_NL(13)%LQM=.false., +YCHEM_NL(13)%LQM3D=.TRUE., +!YCHEM_NL(13)%LCOMAD=.true., +YCHEM_NL(13)%LADV=.TRUE., +YCHEM_NL(13)%LMASSFIX=.TRUE., +YCHEM_NL(13)%BETAMFBC=-999.9, +YCHEM_NL(13)%LASSIM=.FALSE., +YCHEM_NL(14)%CNAME='ROOH', +YCHEM_NL(14)%NREQIN=1, +YCHEM_NL(14)%RMOLMASS=47.0, +YCHEM_NL(14)%IGRBCODE=217014, +YCHEM_NL(14)%LNEGFIX=.TRUE., +YCHEM_NL(14)%IGRIBTC=218014, +YCHEM_NL(14)%IGRIBDV=221014, +YCHEM_NL(14)%HENRYA=340.0, +YCHEM_NL(14)%HENRYB=6000.0, +YCHEM_NL(14)%LQM=.false., +YCHEM_NL(14)%LQM3D=.TRUE., +!YCHEM_NL(14)%LCOMAD=.true., +YCHEM_NL(14)%LADV=.TRUE., +YCHEM_NL(14)%LMASSFIX=.TRUE., +YCHEM_NL(14)%BETAMFBC=-999.9, +YCHEM_NL(14)%LASSIM=.FALSE., +YCHEM_NL(15)%CNAME='ONIT', +YCHEM_NL(15)%NREQIN=1, +YCHEM_NL(15)%RMOLMASS=77.0, +YCHEM_NL(15)%IGRBCODE=217015, +YCHEM_NL(15)%LNEGFIX=.TRUE., +YCHEM_NL(15)%IGRIBTC=218015, +YCHEM_NL(15)%IGRIBDV=221015, +YCHEM_NL(15)%HENRYA=1.0e3, +YCHEM_NL(15)%HENRYB=6485., +YCHEM_NL(15)%LQM=.false., +YCHEM_NL(15)%LQM3D=.TRUE., +!YCHEM_NL(15)%LCOMAD=.true., +YCHEM_NL(15)%LADV=.TRUE., +YCHEM_NL(15)%LMASSFIX=.TRUE., +YCHEM_NL(15)%BETAMFBC=-999.9, +YCHEM_NL(15)%LASSIM=.FALSE., +YCHEM_NL(16)%CNAME='C5H8', +YCHEM_NL(16)%NREQIN=1, +YCHEM_NL(16)%RMOLMASS=68.1, +YCHEM_NL(16)%IGRBCODE=217016, +YCHEM_NL(16)%LNEGFIX=.TRUE., +YCHEM_NL(16)%IGRIBTC=218016, +YCHEM_NL(16)%IGRIBDV=221016, +YCHEM_NL(16)%HENRYA=1.3e-2, +YCHEM_NL(16)%HENRYB=0.0, +YCHEM_NL(16)%LQM=.false., +YCHEM_NL(16)%LQM3D=.TRUE., +!YCHEM_NL(16)%LCOMAD=.true., +YCHEM_NL(16)%LADV=.TRUE., +YCHEM_NL(16)%LMASSFIX=.TRUE., +YCHEM_NL(16)%BETAMFBC=-999.9, +YCHEM_NL(16)%LASSIM=.FALSE., +YCHEM_NL(17)%CNAME='SO2', +YCHEM_NL(17)%NREQIN=1, +YCHEM_NL(17)%RMOLMASS=64.1, +YCHEM_NL(17)%IGRBCODE=210122, +YCHEM_NL(17)%LNEGFIX=.TRUE., +YCHEM_NL(17)%IGRIBTC=210126, +YCHEM_NL(17)%IGRIBDV=221017, +YCHEM_NL(17)%HENRYA=1.0e5, +YCHEM_NL(17)%HENRYB=3000.0, +YCHEM_NL(17)%LQM=.false., +YCHEM_NL(17)%LQM3D=.TRUE., +!YCHEM_NL(17)%LCOMAD=.true., +YCHEM_NL(17)%LADV=.TRUE., +YCHEM_NL(17)%LMASSFIX=.TRUE., +YCHEM_NL(17)%BETAMFBC=-999.9, +YCHEM_NL(17)%LASSIM=.TRUE., +YCHEM_NL(17)%LADV5=.TRUE., +YCHEM_NL(18)%CNAME='DMS', +YCHEM_NL(18)%NREQIN=1, +YCHEM_NL(18)%RMOLMASS=62.1, +YCHEM_NL(18)%IGRBCODE=217018, +YCHEM_NL(18)%LNEGFIX=.TRUE., +YCHEM_NL(18)%IGRIBTC=218018, +YCHEM_NL(18)%LQM=.false., +YCHEM_NL(18)%LQM3D=.TRUE., +!YCHEM_NL(18)%LCOMAD=.true., +YCHEM_NL(18)%LADV=.TRUE., +YCHEM_NL(18)%LMASSFIX=.TRUE., +YCHEM_NL(18)%BETAMFBC=-999.9, +YCHEM_NL(18)%LASSIM=.FALSE., +YCHEM_NL(19)%CNAME='NH3', +YCHEM_NL(19)%NREQIN=1, +YCHEM_NL(19)%RMOLMASS=17.0, +YCHEM_NL(19)%IGRBCODE=217019, +YCHEM_NL(19)%LNEGFIX=.TRUE., +YCHEM_NL(19)%IGRIBTC=218019, +YCHEM_NL(19)%IGRIBDV=221019, +YCHEM_NL(19)%HENRYA=59.0, +YCHEM_NL(19)%HENRYB=4200.0, +YCHEM_NL(19)%LQM=.false., +YCHEM_NL(19)%LQM3D=.TRUE., +!YCHEM_NL(19)%LCOMAD=.true., +YCHEM_NL(19)%LADV=.TRUE., +YCHEM_NL(19)%LMASSFIX=.TRUE., +YCHEM_NL(19)%BETAMFBC=-999.9, +YCHEM_NL(19)%LASSIM=.FALSE., +YCHEM_NL(20)%CNAME='SO4', +YCHEM_NL(20)%NREQIN=-1, +YCHEM_NL(20)%RMOLMASS=96.1, +YCHEM_NL(20)%IGRBCODE=217020, +YCHEM_NL(20)%LNEGFIX=.TRUE., +YCHEM_NL(20)%IGRIBTC=218020, +YCHEM_NL(20)%IGRIBDV=221020, +YCHEM_NL(20)%HENRYA=3.2e11, +YCHEM_NL(20)%HENRYB=8700.0, +YCHEM_NL(20)%LQM=.false., +YCHEM_NL(20)%LQM3D=.TRUE., +!YCHEM_NL(20)%LCOMAD=.true., +YCHEM_NL(20)%LADV=.TRUE., +YCHEM_NL(20)%LMASSFIX=.TRUE., +YCHEM_NL(20)%BETAMFBC=-999.9, +YCHEM_NL(20)%LASSIM=.FALSE., +YCHEM_NL(21)%CNAME='NH4', +YCHEM_NL(21)%NREQIN=1, +YCHEM_NL(21)%RMOLMASS=18.0, +YCHEM_NL(21)%IGRBCODE=217021, +YCHEM_NL(21)%LNEGFIX=.TRUE., +YCHEM_NL(21)%IGRIBTC=218021, +YCHEM_NL(21)%IGRIBDV=221021, +YCHEM_NL(21)%HENRYA=3.2e11, +YCHEM_NL(21)%HENRYB=8700.0, +YCHEM_NL(21)%LQM=.false., +YCHEM_NL(21)%LQM3D=.TRUE., +!YCHEM_NL(21)%LCOMAD=.true., +YCHEM_NL(21)%LADV=.TRUE., +YCHEM_NL(21)%LMASSFIX=.TRUE., +YCHEM_NL(21)%BETAMFBC=-999.9, +YCHEM_NL(21)%LASSIM=.FALSE., +YCHEM_NL(22)%CNAME='MSA', +YCHEM_NL(22)%NREQIN=1, +YCHEM_NL(22)%RMOLMASS=96.1, +YCHEM_NL(22)%IGRBCODE=217022, +YCHEM_NL(22)%LNEGFIX=.TRUE., +YCHEM_NL(22)%IGRIBTC=218022, +YCHEM_NL(22)%HENRYA=3.2e11, +YCHEM_NL(22)%HENRYB=8700.0, +YCHEM_NL(22)%LQM=.false., +YCHEM_NL(22)%LQM3D=.TRUE., +!YCHEM_NL(22)%LCOMAD=.true., +YCHEM_NL(22)%LADV=.TRUE., +YCHEM_NL(22)%LMASSFIX=.TRUE., +YCHEM_NL(22)%BETAMFBC=-999.9, +YCHEM_NL(22)%LASSIM=.FALSE., +YCHEM_NL(23)%CNAME='CH3COCHO', +YCHEM_NL(23)%NREQIN=1, +YCHEM_NL(23)%RMOLMASS=72.1, +YCHEM_NL(23)%IGRBCODE=217023, +YCHEM_NL(23)%LNEGFIX=.TRUE., +YCHEM_NL(23)%IGRIBTC=218023, +YCHEM_NL(23)%IGRIBDV=221023, +YCHEM_NL(23)%HENRYA=3.4e3, +YCHEM_NL(23)%HENRYB=7500.0, +YCHEM_NL(23)%LQM=.false., +YCHEM_NL(23)%LQM3D=.TRUE., +!YCHEM_NL(23)%LCOMAD=.true., +YCHEM_NL(23)%LADV=.TRUE., +YCHEM_NL(23)%LMASSFIX=.TRUE., +YCHEM_NL(23)%BETAMFBC=-999.9, +YCHEM_NL(23)%LASSIM=.FALSE., +YCHEM_NL(24)%CNAME='O3S', +YCHEM_NL(24)%NREQIN=1, +YCHEM_NL(24)%RMOLMASS=48.0, +YCHEM_NL(24)%IGRBCODE=217024, +YCHEM_NL(24)%LNEGFIX=.TRUE., +YCHEM_NL(24)%IGRIBTC=218024, +YCHEM_NL(24)%IGRIBDV=221024, +YCHEM_NL(24)%HENRYA=1.0e-2, +YCHEM_NL(24)%HENRYB=2800.0, +YCHEM_NL(24)%LQM=.false., +YCHEM_NL(24)%LQM3D=.TRUE., +!YCHEM_NL(24)%LCOMAD=.true., +YCHEM_NL(24)%LADV=.TRUE., +YCHEM_NL(24)%LMASSFIX=.TRUE., +YCHEM_NL(24)%BETAMFBC=-999.9, +YCHEM_NL(24)%LASSIM=.FALSE., +YCHEM_NL(25)%CNAME='Rn', +YCHEM_NL(25)%NREQIN=1, +YCHEM_NL(25)%RMOLMASS=222.0, +YCHEM_NL(25)%IGRBCODE=210181, +YCHEM_NL(25)%LNEGFIX=.TRUE., +YCHEM_NL(25)%IGRIBTC=210183, +YCHEM_NL(25)%LQM=.false., +YCHEM_NL(25)%LQM3D=.TRUE., +!YCHEM_NL(25)%LCOMAD=.true., +YCHEM_NL(25)%LADV=.TRUE., +YCHEM_NL(25)%LMASSFIX=.TRUE., +YCHEM_NL(25)%BETAMFBC=-999.9, +YCHEM_NL(25)%LASSIM=.FALSE., +YCHEM_NL(26)%CNAME='Pb', +YCHEM_NL(26)%NREQIN=1, +YCHEM_NL(26)%RMOLMASS=210.0, +YCHEM_NL(26)%IGRBCODE=217026, +YCHEM_NL(26)%LNEGFIX=.TRUE., +YCHEM_NL(26)%IGRIBTC=218026, +YCHEM_NL(26)%HENRYA=3.2e11, +YCHEM_NL(26)%HENRYB=8700.0, +YCHEM_NL(26)%LQM=.false., +YCHEM_NL(26)%LQM3D=.TRUE., +!YCHEM_NL(26)%LCOMAD=.true., +YCHEM_NL(26)%LADV=.TRUE., +YCHEM_NL(26)%LMASSFIX=.TRUE., +YCHEM_NL(26)%BETAMFBC=-999.9, +YCHEM_NL(26)%LASSIM=.FALSE., +YCHEM_NL(27)%CNAME='NO', +YCHEM_NL(27)%NREQIN=1, +YCHEM_NL(27)%RMOLMASS=30.0, +YCHEM_NL(27)%IGRBCODE=217027, +YCHEM_NL(27)%LNEGFIX=.TRUE., +YCHEM_NL(27)%IGRIBTC=218027, +YCHEM_NL(27)%IGRIBDV=221027, +YCHEM_NL(27)%HENRYA=1.9e-3, +YCHEM_NL(27)%HENRYB=1600.0, +YCHEM_NL(27)%LQM=.false., +YCHEM_NL(27)%LQM3D=.TRUE., +!YCHEM_NL(27)%LCOMAD=.true., +YCHEM_NL(27)%LADV=.TRUE., +YCHEM_NL(27)%LMASSFIX=.FALSE., +YCHEM_NL(27)%LASSIM=.FALSE., +YCHEM_NL(27)%LADV5=.TRUE., +YCHEM_NL(28)%CNAME='HO2', +YCHEM_NL(28)%NREQIN=1, +YCHEM_NL(28)%RMOLMASS=33.0, +YCHEM_NL(28)%IGRBCODE=217028, +YCHEM_NL(28)%LNEGFIX=.TRUE., +YCHEM_NL(28)%IGRIBTC=218028, +YCHEM_NL(28)%IGRIBDV=221028, +YCHEM_NL(28)%HENRYA=6.8e2, +YCHEM_NL(28)%HENRYB=0.0, +YCHEM_NL(28)%LQM=.false., +YCHEM_NL(28)%LQM3D=.TRUE., +!YCHEM_NL(28)%LCOMAD=.true., +YCHEM_NL(28)%LADV=.FALSE., +YCHEM_NL(28)%LMASSFIX=.FALSE., +YCHEM_NL(28)%LMASSFIX=.FALSE., +YCHEM_NL(28)%LASSIM=.FALSE., +YCHEM_NL(29)%CNAME='CH3O2', +YCHEM_NL(29)%NREQIN=1, +YCHEM_NL(29)%RMOLMASS=47.0, +YCHEM_NL(29)%IGRBCODE=217029, +YCHEM_NL(29)%LNEGFIX=.TRUE., +YCHEM_NL(29)%IGRIBTC=218029, +YCHEM_NL(29)%IGRIBDV=221029, +YCHEM_NL(29)%HENRYA=1.5e1, +YCHEM_NL(29)%HENRYB=3700.0, +YCHEM_NL(29)%LQM=.false., +YCHEM_NL(29)%LQM3D=.TRUE., +!YCHEM_NL(29)%LCOMAD=.true., +YCHEM_NL(29)%LADV=.FALSE., +YCHEM_NL(29)%LMASSFIX=.FALSE., +YCHEM_NL(29)%LMASSFIX=.FALSE., +YCHEM_NL(29)%LASSIM=.FALSE., +YCHEM_NL(30)%CNAME='OH', +YCHEM_NL(30)%NREQIN=1, +YCHEM_NL(30)%RMOLMASS=17.0, +YCHEM_NL(30)%IGRBCODE=217030, +YCHEM_NL(30)%LNEGFIX=.TRUE., +YCHEM_NL(30)%IGRIBTC=218030, +YCHEM_NL(30)%LQM=.false., +YCHEM_NL(30)%LQM3D=.TRUE., +!YCHEM_NL(30)%LCOMAD=.true., +YCHEM_NL(30)%LADV=.FALSE., +YCHEM_NL(30)%LMASSFIX=.FALSE., +YCHEM_NL(30)%LMASSFIX=.FALSE., +YCHEM_NL(30)%LASSIM=.FALSE., +YCHEM_NL(30)%LADV5=.TRUE., +YCHEM_NL(31)%CNAME='NO2', +YCHEM_NL(31)%NREQIN=1, +YCHEM_NL(31)%RMOLMASS=46.0, +YCHEM_NL(31)%IGRBCODE=210121, +YCHEM_NL(31)%LNEGFIX=.TRUE., +YCHEM_NL(31)%IGRIBTC=210125, +YCHEM_NL(31)%IGRIBDV=221031, +YCHEM_NL(31)%HENRYA=1.2e-2, +YCHEM_NL(31)%HENRYB=2400.0, +YCHEM_NL(31)%LQM=.false., +YCHEM_NL(31)%LQM3D=.TRUE., +!YCHEM_NL(31)%LCOMAD=.true., +YCHEM_NL(31)%LADV=.TRUE., +YCHEM_NL(31)%LMASSFIX=.FALSE., +YCHEM_NL(31)%LASSIM=.TRUE., +YCHEM_NL(31)%LADV5=.TRUE., +YCHEM_NL(32)%CNAME='NO3', +YCHEM_NL(32)%NREQIN=1, +YCHEM_NL(32)%RMOLMASS=62.0, +YCHEM_NL(32)%IGRBCODE=217032, +YCHEM_NL(32)%LNEGFIX=.TRUE., +YCHEM_NL(32)%IGRIBTC=218032, +YCHEM_NL(32)%IGRIBDV=221032, +YCHEM_NL(32)%HENRYA=3.8e-2, +YCHEM_NL(32)%HENRYB=0., +YCHEM_NL(32)%LQM=.false., +YCHEM_NL(32)%LQM3D=.TRUE., +!YCHEM_NL(32)%LCOMAD=.true., +YCHEM_NL(32)%LADV=.TRUE., +YCHEM_NL(32)%LMASSFIX=.FALSE., +YCHEM_NL(32)%LASSIM=.FALSE., +YCHEM_NL(33)%CNAME='N2O5', +YCHEM_NL(33)%NREQIN=1, +YCHEM_NL(33)%RMOLMASS=108.0, +YCHEM_NL(33)%IGRBCODE=217033, +YCHEM_NL(33)%LNEGFIX=.TRUE., +YCHEM_NL(33)%IGRIBTC=218033, +YCHEM_NL(33)%IGRIBDV=221033, +YCHEM_NL(33)%HENRYA=2.1e+1, +YCHEM_NL(33)%HENRYB=3400.0, +YCHEM_NL(33)%LQM=.false., +YCHEM_NL(33)%LQM3D=.TRUE., +!YCHEM_NL(33)%LCOMAD=.true., +YCHEM_NL(33)%LADV=.TRUE., +YCHEM_NL(33)%LMASSFIX=.TRUE., +YCHEM_NL(33)%BETAMFBC=-999.9, +YCHEM_NL(33)%LASSIM=.FALSE., +YCHEM_NL(34)%CNAME='HO2NO2', +YCHEM_NL(34)%NREQIN=1, +YCHEM_NL(34)%RMOLMASS=79.0, +YCHEM_NL(34)%IGRBCODE=217034, +YCHEM_NL(34)%LNEGFIX=.TRUE., +YCHEM_NL(34)%IGRIBTC=218034, +YCHEM_NL(34)%IGRIBDV=221034, +YCHEM_NL(34)%HENRYA=1.2e+4, +YCHEM_NL(34)%HENRYB=6900.0, +YCHEM_NL(34)%LQM=.false., +YCHEM_NL(34)%LQM3D=.TRUE., +!YCHEM_NL(34)%LCOMAD=.true., +YCHEM_NL(34)%LADV=.TRUE., +YCHEM_NL(34)%LMASSFIX=.TRUE., +YCHEM_NL(34)%BETAMFBC=-999.9, +YCHEM_NL(34)%LASSIM=.FALSE., +YCHEM_NL(35)%CNAME='C2O3', +YCHEM_NL(35)%NREQIN=1, +YCHEM_NL(35)%RMOLMASS=75.0, +YCHEM_NL(35)%IGRBCODE=217035, +YCHEM_NL(35)%LNEGFIX=.TRUE., +YCHEM_NL(35)%IGRIBTC=218035, +YCHEM_NL(35)%LQM=.false., +YCHEM_NL(35)%LQM3D=.TRUE., +!YCHEM_NL(35)%LCOMAD=.true., +YCHEM_NL(35)%LADV=.FALSE., +YCHEM_NL(35)%LMASSFIX=.FALSE., +YCHEM_NL(35)%LMASSFIX=.FALSE., +YCHEM_NL(35)%LASSIM=.FALSE., +YCHEM_NL(36)%CNAME='ROR', +YCHEM_NL(36)%NREQIN=1, +YCHEM_NL(36)%RMOLMASS=28.0, +YCHEM_NL(36)%IGRBCODE=217036, +YCHEM_NL(36)%LNEGFIX=.TRUE., +YCHEM_NL(36)%IGRIBTC=218036, +YCHEM_NL(36)%LQM=.false., +YCHEM_NL(36)%LQM3D=.TRUE., +!YCHEM_NL(36)%LCOMAD=.true., +YCHEM_NL(36)%LADV=.FALSE., +YCHEM_NL(36)%LMASSFIX=.FALSE., +YCHEM_NL(36)%LMASSFIX=.FALSE., +YCHEM_NL(36)%LASSIM=.FALSE., +YCHEM_NL(37)%CNAME='RXPAR', +YCHEM_NL(37)%NREQIN=1, +YCHEM_NL(37)%RMOLMASS=12.0, +YCHEM_NL(37)%IGRBCODE=217037, +YCHEM_NL(37)%LNEGFIX=.TRUE., +YCHEM_NL(37)%IGRIBTC=218037, +YCHEM_NL(37)%LQM=.false., +YCHEM_NL(37)%LQM3D=.TRUE., +!YCHEM_NL(37)%LCOMAD=.true., +YCHEM_NL(37)%LADV=.FALSE., +YCHEM_NL(37)%LMASSFIX=.FALSE., +YCHEM_NL(37)%LMASSFIX=.FALSE., +YCHEM_NL(37)%LASSIM=.FALSE., +YCHEM_NL(38)%CNAME='XO2', +YCHEM_NL(38)%NREQIN=1, +YCHEM_NL(38)%RMOLMASS=44.0, +YCHEM_NL(38)%IGRBCODE=217038, +YCHEM_NL(38)%LNEGFIX=.TRUE., +YCHEM_NL(38)%IGRIBTC=218038, +YCHEM_NL(38)%LQM=.false., +YCHEM_NL(38)%LQM3D=.TRUE., +!YCHEM_NL(38)%LCOMAD=.true., +YCHEM_NL(38)%LADV=.FALSE., +YCHEM_NL(38)%LMASSFIX=.FALSE., +YCHEM_NL(38)%LMASSFIX=.FALSE., +YCHEM_NL(38)%LASSIM=.FALSE., +YCHEM_NL(39)%CNAME='XO2N', +YCHEM_NL(39)%NREQIN=1, +YCHEM_NL(39)%RMOLMASS=44.0, +YCHEM_NL(39)%IGRBCODE=217039, +YCHEM_NL(39)%LNEGFIX=.TRUE., +YCHEM_NL(39)%IGRIBTC=218039, +YCHEM_NL(39)%LQM=.false., +YCHEM_NL(39)%LQM3D=.TRUE., +!YCHEM_NL(39)%LCOMAD=.true., +YCHEM_NL(39)%LADV=.FALSE., +YCHEM_NL(39)%LMASSFIX=.FALSE., +YCHEM_NL(39)%LMASSFIX=.FALSE., +YCHEM_NL(39)%LASSIM=.FALSE., +YCHEM_NL(40)%CNAME='NH2', +YCHEM_NL(40)%NREQIN=1, +YCHEM_NL(40)%RMOLMASS=16.0, +YCHEM_NL(40)%IGRBCODE=217040, +YCHEM_NL(40)%LNEGFIX=.TRUE., +YCHEM_NL(40)%IGRIBTC=218040, +YCHEM_NL(40)%LQM=.false., +YCHEM_NL(40)%LQM3D=.TRUE., +!YCHEM_NL(40)%LCOMAD=.true., +YCHEM_NL(40)%LADV=.FALSE., +YCHEM_NL(40)%LMASSFIX=.FALSE., +YCHEM_NL(40)%LMASSFIX=.FALSE., +YCHEM_NL(40)%LASSIM=.FALSE., +YCHEM_NL(41)%CNAME='PSC', +YCHEM_NL(41)%NREQIN=0, +YCHEM_NL(41)%RMOLMASS=1.0, +YCHEM_NL(41)%IGRBCODE=217041, +YCHEM_NL(41)%LNEGFIX=.TRUE., +YCHEM_NL(41)%IGRIBTC=218041, +YCHEM_NL(41)%LQM=.false., +YCHEM_NL(41)%LQM3D=.TRUE., +!YCHEM_NL(41)%LCOMAD=.true., +YCHEM_NL(41)%LADV=.TRUE., +YCHEM_NL(41)%LMASSFIX=.FALSE., +YCHEM_NL(41)%REFVALI=0.0, +YCHEM_NL(41)%NREQIN=-1, +YCHEM_NL(41)%LASSIM=.FALSE., +YCHEM_NL(42)%CNAME='CH3OH', +YCHEM_NL(42)%NREQIN=1, +YCHEM_NL(42)%RMOLMASS=31.01, +YCHEM_NL(42)%IGRBCODE=217042, +YCHEM_NL(42)%LNEGFIX=.TRUE., +YCHEM_NL(42)%IGRIBTC=218042, +YCHEM_NL(42)%IGRIBDV=221042, +YCHEM_NL(42)%HENRYA=200.0, +YCHEM_NL(42)%HENRYB=5600.0, +YCHEM_NL(42)%LQM=.false., +YCHEM_NL(42)%LQM3D=.TRUE., +!YCHEM_NL(42)%LCOMAD=.true., +YCHEM_NL(42)%LADV=.TRUE., +YCHEM_NL(42)%LMASSFIX=.TRUE., +YCHEM_NL(42)%BETAMFBC=-999.9, +YCHEM_NL(42)%LASSIM=.FALSE., +YCHEM_NL(43)%CNAME='HCOOH', +YCHEM_NL(43)%NREQIN=1, +YCHEM_NL(43)%RMOLMASS=46.01, +YCHEM_NL(43)%IGRBCODE=217043, +YCHEM_NL(43)%LNEGFIX=.TRUE., +YCHEM_NL(43)%IGRIBTC=218043, +YCHEM_NL(43)%IGRIBDV=221043, +YCHEM_NL(43)%HENRYA=8.8e3, +YCHEM_NL(43)%HENRYB=6100.0, +YCHEM_NL(43)%LQM=.false., +YCHEM_NL(43)%LQM3D=.TRUE., +!YCHEM_NL(43)%LCOMAD=.true., +YCHEM_NL(43)%LADV=.TRUE., +YCHEM_NL(43)%LMASSFIX=.TRUE., +YCHEM_NL(43)%BETAMFBC=-999.9, +YCHEM_NL(43)%LASSIM=.FALSE., +YCHEM_NL(44)%CNAME='MCOOH', +YCHEM_NL(44)%NREQIN=1, +YCHEM_NL(44)%RMOLMASS=62.02, +YCHEM_NL(44)%IGRBCODE=217044, +YCHEM_NL(44)%LNEGFIX=.TRUE., +YCHEM_NL(44)%IGRIBTC=218044, +YCHEM_NL(44)%IGRIBDV=221044, +YCHEM_NL(44)%HENRYA=4.1e3, +YCHEM_NL(44)%HENRYB=6300.0, +YCHEM_NL(44)%LQM=.false., +YCHEM_NL(44)%LQM3D=.TRUE., +!YCHEM_NL(44)%LCOMAD=.true., +YCHEM_NL(44)%LADV=.TRUE., +YCHEM_NL(44)%LMASSFIX=.TRUE., +YCHEM_NL(44)%BETAMFBC=-999.9, +YCHEM_NL(44)%LASSIM=.FALSE., +YCHEM_NL(45)%CNAME='C2H6', +YCHEM_NL(45)%NREQIN=1, +YCHEM_NL(45)%RMOLMASS=30.02, +YCHEM_NL(45)%IGRBCODE=217045, +YCHEM_NL(45)%LNEGFIX=.TRUE., +YCHEM_NL(45)%IGRIBTC=218045, +YCHEM_NL(45)%IGRIBDV=221045, +YCHEM_NL(45)%HENRYA=1.9e-3, +YCHEM_NL(45)%HENRYB=2400.0, +YCHEM_NL(45)%LQM=.false., +YCHEM_NL(45)%LQM3D=.TRUE., +!YCHEM_NL(45)%LCOMAD=.true., +YCHEM_NL(45)%LADV=.TRUE., +YCHEM_NL(45)%LMASSFIX=.TRUE., +YCHEM_NL(45)%BETAMFBC=-999.9, +YCHEM_NL(45)%LASSIM=.FALSE., +YCHEM_NL(46)%CNAME='C2H5OH', +YCHEM_NL(46)%NREQIN=1, +YCHEM_NL(46)%RMOLMASS=46.02, +YCHEM_NL(46)%IGRBCODE=217046, +YCHEM_NL(46)%LNEGFIX=.TRUE., +YCHEM_NL(46)%IGRIBTC=218046, +YCHEM_NL(46)%IGRIBDV=221046, +YCHEM_NL(46)%HENRYA=190.0, +YCHEM_NL(46)%HENRYB=6400.0, +YCHEM_NL(46)%LQM=.false., +YCHEM_NL(46)%LQM3D=.TRUE., +!YCHEM_NL(46)%LCOMAD=.true., +YCHEM_NL(46)%LADV=.TRUE., +YCHEM_NL(46)%LMASSFIX=.TRUE., +YCHEM_NL(46)%BETAMFBC=-999.9, +YCHEM_NL(46)%LASSIM=.FALSE., +YCHEM_NL(47)%CNAME='C3H8', +YCHEM_NL(47)%NREQIN=1, +YCHEM_NL(47)%RMOLMASS=44.03, +YCHEM_NL(47)%IGRBCODE=217047, +YCHEM_NL(47)%LNEGFIX=.TRUE., +YCHEM_NL(47)%IGRIBTC=218047, +YCHEM_NL(47)%LQM=.false., +YCHEM_NL(47)%LQM3D=.TRUE., +!YCHEM_NL(47)%LCOMAD=.true., +YCHEM_NL(47)%LADV=.TRUE., +YCHEM_NL(47)%LMASSFIX=.TRUE., +YCHEM_NL(47)%BETAMFBC=-999.9, +YCHEM_NL(47)%LASSIM=.FALSE., +YCHEM_NL(48)%CNAME='C3H6', +YCHEM_NL(48)%NREQIN=1, +YCHEM_NL(48)%RMOLMASS=42.03, +YCHEM_NL(48)%IGRBCODE=217048, +YCHEM_NL(48)%LNEGFIX=.TRUE., +YCHEM_NL(48)%IGRIBTC=218048, +YCHEM_NL(48)%LQM=.false., +YCHEM_NL(48)%LQM3D=.TRUE., +!YCHEM_NL(48)%LCOMAD=.true., +YCHEM_NL(48)%LADV=.TRUE., +YCHEM_NL(48)%LMASSFIX=.TRUE., +YCHEM_NL(48)%BETAMFBC=-999.9, +YCHEM_NL(48)%LASSIM=.FALSE., +YCHEM_NL(49)%CNAME='C10H16', +YCHEM_NL(49)%NREQIN=1, +YCHEM_NL(49)%RMOLMASS=136.0, +YCHEM_NL(49)%IGRBCODE=217049, +YCHEM_NL(49)%LNEGFIX=.TRUE., +YCHEM_NL(49)%IGRIBTC=218049, +YCHEM_NL(49)%LQM=.false., +YCHEM_NL(49)%LQM3D=.TRUE., +!YCHEM_NL(49)%LCOMAD=.true., +YCHEM_NL(49)%LADV=.TRUE., +YCHEM_NL(49)%LMASSFIX=.TRUE., +YCHEM_NL(49)%BETAMFBC=-999.9, +YCHEM_NL(49)%LASSIM=.FALSE., +YCHEM_NL(50)%CNAME='ISPD', +YCHEM_NL(50)%NREQIN=1, +YCHEM_NL(50)%RMOLMASS=70.0, +YCHEM_NL(50)%IGRBCODE=217050, +YCHEM_NL(50)%LNEGFIX=.TRUE., +YCHEM_NL(50)%IGRIBTC=218050, +YCHEM_NL(50)%IGRIBDV=221050, +YCHEM_NL(50)%HENRYA=4.3, +YCHEM_NL(50)%HENRYB=5300.0, +YCHEM_NL(50)%LQM=.false., +YCHEM_NL(50)%LQM3D=.TRUE., +!YCHEM_NL(50)%LCOMAD=.true., +YCHEM_NL(50)%LADV=.TRUE., +YCHEM_NL(50)%LMASSFIX=.TRUE., +YCHEM_NL(50)%BETAMFBC=-999.9, +YCHEM_NL(50)%LASSIM=.FALSE., +YCHEM_NL(51)%CNAME='NO3_A', +YCHEM_NL(51)%NREQIN=1, +YCHEM_NL(51)%RMOLMASS=62.0, +YCHEM_NL(51)%IGRBCODE=217051, +YCHEM_NL(51)%LNEGFIX=.TRUE., +YCHEM_NL(51)%IGRIBTC=218051, +YCHEM_NL(51)%IGRIBDV=221051, +YCHEM_NL(51)%HENRYA=3.2e11, +YCHEM_NL(51)%HENRYB=8700.0, +YCHEM_NL(51)%LQM=.false., +YCHEM_NL(51)%LQM3D=.TRUE., +!YCHEM_NL(51)%LCOMAD=.true., +YCHEM_NL(51)%LADV=.TRUE., +YCHEM_NL(51)%LMASSFIX=.TRUE., +YCHEM_NL(51)%BETAMFBC=-999.9, +YCHEM_NL(51)%LASSIM=.FALSE., +YCHEM_NL(52)%CNAME='CH3COCH3', +YCHEM_NL(52)%NREQIN=1, +YCHEM_NL(52)%RMOLMASS=58.0, +YCHEM_NL(52)%IGRBCODE=217052, +YCHEM_NL(52)%LNEGFIX=.TRUE., +YCHEM_NL(52)%IGRIBTC=218052, +YCHEM_NL(52)%IGRIBDV=221052, +YCHEM_NL(52)%HENRYA=27.0, +YCHEM_NL(52)%HENRYB=5500.0, +YCHEM_NL(52)%LQM=.false., +YCHEM_NL(52)%LQM3D=.TRUE., +!YCHEM_NL(52)%LCOMAD=.true., +YCHEM_NL(52)%LADV=.TRUE., +YCHEM_NL(52)%LMASSFIX=.TRUE., +YCHEM_NL(52)%BETAMFBC=-999.9, +YCHEM_NL(52)%LASSIM=.FALSE., +YCHEM_NL(53)%CNAME='ACO2', +YCHEM_NL(53)%NREQIN=1, +YCHEM_NL(53)%RMOLMASS=58.0, +YCHEM_NL(53)%IGRBCODE=217053, +YCHEM_NL(53)%LNEGFIX=.TRUE., +YCHEM_NL(53)%IGRIBTC=218053, +YCHEM_NL(53)%LQM=.false., +YCHEM_NL(53)%LQM3D=.TRUE., +!YCHEM_NL(53)%LCOMAD=.true., +YCHEM_NL(53)%LADV=.FALSE., +YCHEM_NL(53)%LMASSFIX=.FALSE., +YCHEM_NL(53)%LMASSFIX=.FALSE., +YCHEM_NL(53)%LASSIM=.FALSE., +YCHEM_NL(54)%CNAME='IC3H7O2', +YCHEM_NL(54)%NREQIN=1, +YCHEM_NL(54)%RMOLMASS=75.0, +YCHEM_NL(54)%IGRBCODE=217054, +YCHEM_NL(54)%LNEGFIX=.TRUE., +YCHEM_NL(54)%IGRIBTC=218054, +YCHEM_NL(54)%LQM=.false., +YCHEM_NL(54)%LQM3D=.TRUE., +!YCHEM_NL(54)%LCOMAD=.true., +YCHEM_NL(54)%LADV=.FALSE., +YCHEM_NL(54)%LMASSFIX=.FALSE., +YCHEM_NL(54)%LMASSFIX=.FALSE., +YCHEM_NL(54)%LASSIM=.FALSE., +YCHEM_NL(55)%CNAME='HYPROPO2', +YCHEM_NL(55)%NREQIN=1, +YCHEM_NL(55)%RMOLMASS=91.0, +YCHEM_NL(55)%IGRBCODE=217055, +YCHEM_NL(55)%LNEGFIX=.TRUE., +YCHEM_NL(55)%IGRIBTC=218055, +YCHEM_NL(55)%LQM=.false., +YCHEM_NL(55)%LQM3D=.TRUE., +!YCHEM_NL(55)%LCOMAD=.true., +YCHEM_NL(55)%LADV=.FALSE., +YCHEM_NL(55)%LMASSFIX=.FALSE., +YCHEM_NL(55)%LMASSFIX=.FALSE., +YCHEM_NL(55)%LASSIM=.FALSE., +YCHEM_NL(56)%CNAME='SO3', +YCHEM_NL(56)%NREQIN=1, +YCHEM_NL(56)%RMOLMASS=80.0, +YCHEM_NL(56)%IGRBCODE=217189, +YCHEM_NL(56)%LNEGFIX=.TRUE., +YCHEM_NL(56)%IGRIBTC=218189, +YCHEM_NL(56)%LQM=.false., +YCHEM_NL(56)%LQM3D=.TRUE., +!YCHEM_NL(56)%LCOMAD=.true., +YCHEM_NL(56)%LADV=.TRUE., +YCHEM_NL(56)%LMASSFIX=.TRUE., +YCHEM_NL(56)%BETAMFBC=-999.9, +YCHEM_NL(56)%LASSIM=.FALSE., +YCHEM_NL(57)%CNAME='CH3O2NO2', +YCHEM_NL(57)%NREQIN=1, +YCHEM_NL(57)%RMOLMASS=93.0, +YCHEM_NL(57)%IGRBCODE=217225, +YCHEM_NL(57)%LNEGFIX=.TRUE., +YCHEM_NL(57)%IGRIBTC=218225, +YCHEM_NL(57)%LQM=.false., +YCHEM_NL(57)%LQM3D=.TRUE., +!YCHEM_NL(57)%LCOMAD=.true., +YCHEM_NL(57)%LADV=.TRUE., +YCHEM_NL(57)%LMASSFIX=.TRUE., +YCHEM_NL(57)%BETAMFBC=-999.9, +YCHEM_NL(57)%LASSIM=.FALSE., +YCHEM_NL(58)%CNAME='HONO', +YCHEM_NL(58)%NREQIN=1, +YCHEM_NL(58)%RMOLMASS=47.0, +YCHEM_NL(58)%IGRBCODE=217086, +YCHEM_NL(58)%LNEGFIX=.TRUE., +YCHEM_NL(58)%IGRIBTC=218086, +YCHEM_NL(58)%IGRIBDV=221086, +YCHEM_NL(58)%HENRYA=4.8e+1, +YCHEM_NL(58)%HENRYB=4800.0, +YCHEM_NL(58)%LQM=.false., +YCHEM_NL(58)%LQM3D=.TRUE., +!YCHEM_NL(58)%LCOMAD=.true., +YCHEM_NL(58)%LADV=.TRUE., +YCHEM_NL(58)%LMASSFIX=.TRUE., +YCHEM_NL(58)%BETAMFBC=-999.9, +YCHEM_NL(58)%LASSIM=.FALSE., +YCHEM_NL(59)%CNAME='HCN', +YCHEM_NL(59)%NREQIN=1, +YCHEM_NL(59)%RMOLMASS=27.0, +YCHEM_NL(59)%IGRBCODE=217226, +YCHEM_NL(59)%LNEGFIX=.TRUE., +YCHEM_NL(59)%IGRIBTC=218226, +YCHEM_NL(59)%IGRIBDV=221226, +YCHEM_NL(59)%HENRYA=12, +YCHEM_NL(59)%HENRYB=5000., +YCHEM_NL(59)%LQM=.false., +YCHEM_NL(59)%LQM3D=.TRUE., +!YCHEM_NL(59)%LCOMAD=.true., +YCHEM_NL(59)%LADV=.TRUE., +YCHEM_NL(59)%LMASSFIX=.TRUE., +YCHEM_NL(59)%BETAMFBC=-999.9, +YCHEM_NL(59)%LASSIM=.FALSE., +YCHEM_NL(60)%CNAME='CH3CN', +YCHEM_NL(60)%NREQIN=1, +YCHEM_NL(60)%RMOLMASS=41.0, +YCHEM_NL(60)%IGRBCODE=217224, +YCHEM_NL(60)%LNEGFIX=.TRUE., +YCHEM_NL(60)%IGRIBTC=218224, +YCHEM_NL(60)%IGRIBDV=221224, +YCHEM_NL(60)%HENRYA=49, +YCHEM_NL(60)%HENRYB=4000., +YCHEM_NL(60)%LQM=.false., +YCHEM_NL(60)%LQM3D=.TRUE., +!YCHEM_NL(60)%LCOMAD=.true., +YCHEM_NL(60)%LADV=.TRUE., +YCHEM_NL(60)%LMASSFIX=.TRUE., +YCHEM_NL(60)%BETAMFBC=-999.9, +YCHEM_NL(60)%LASSIM=.FALSE., +YCHEM_NL(61)%CNAME='XYL', +YCHEM_NL(61)%NREQIN=1, +YCHEM_NL(61)%RMOLMASS=106.0, +YCHEM_NL(61)%IGRBCODE=217100, +YCHEM_NL(61)%LNEGFIX=.TRUE., +YCHEM_NL(61)%IGRIBTC=218100, +YCHEM_NL(61)%IGRIBDV=221100, +YCHEM_NL(61)%HENRYA=0.14, +YCHEM_NL(61)%HENRYB=4200.0, +YCHEM_NL(61)%LQM=.false., +YCHEM_NL(61)%LQM3D=.TRUE., +!YCHEM_NL(61)%LCOMAD=.true., +YCHEM_NL(61)%LADV=.TRUE., +YCHEM_NL(61)%LMASSFIX=.TRUE., +YCHEM_NL(61)%BETAMFBC=-999.9, +YCHEM_NL(61)%LASSIM=.FALSE., +YCHEM_NL(62)%CNAME='TOL', +YCHEM_NL(62)%NREQIN=1, +YCHEM_NL(62)%RMOLMASS=92.0, +YCHEM_NL(62)%IGRBCODE=217099, +YCHEM_NL(62)%LNEGFIX=.TRUE., +YCHEM_NL(62)%IGRIBTC=218099, +YCHEM_NL(62)%IGRIBDV=221099, +YCHEM_NL(62)%HENRYA=0.15, +YCHEM_NL(62)%HENRYB=4300.0, +YCHEM_NL(62)%LQM=.false., +YCHEM_NL(62)%LQM3D=.TRUE., +!YCHEM_NL(62)%LCOMAD=.true., +YCHEM_NL(62)%LADV=.TRUE., +YCHEM_NL(62)%LMASSFIX=.TRUE., +YCHEM_NL(62)%BETAMFBC=-999.9, +YCHEM_NL(62)%LASSIM=.FALSE., +YCHEM_NL(63)%CNAME='AROO2', +YCHEM_NL(63)%NREQIN=1, +YCHEM_NL(63)%RMOLMASS=124.0, +YCHEM_NL(63)%IGRBCODE=217222, +YCHEM_NL(63)%LNEGFIX=.TRUE., +YCHEM_NL(63)%IGRIBTC=218222, +YCHEM_NL(63)%LQM=.false., +YCHEM_NL(63)%LQM3D=.TRUE., +!YCHEM_NL(63)%LCOMAD=.true., +YCHEM_NL(63)%LADV=.FALSE., +YCHEM_NL(63)%LMASSFIX=.FALSE., +YCHEM_NL(63)%LMASSFIX=.FALSE., +YCHEM_NL(63)%LASSIM=.FALSE., +YCHEM_NL(64)%CNAME='HPALD1', +YCHEM_NL(64)%NREQIN=1, +YCHEM_NL(64)%RMOLMASS=148.0, +YCHEM_NL(64)%IGRBCODE=217227, +YCHEM_NL(64)%LNEGFIX=.TRUE., +YCHEM_NL(64)%IGRIBTC=218227, +YCHEM_NL(64)%HENRYA=17.0, +YCHEM_NL(64)%HENRYB=5000.0, +YCHEM_NL(64)%LQM=.false., +YCHEM_NL(64)%LQM3D=.TRUE., +!YCHEM_NL(64)%LCOMAD=.true., +YCHEM_NL(64)%LADV=.TRUE., +YCHEM_NL(64)%LMASSFIX=.TRUE., +YCHEM_NL(64)%BETAMFBC=-999.9, +YCHEM_NL(64)%LASSIM=.FALSE., +YCHEM_NL(65)%CNAME='HPALD2', +YCHEM_NL(65)%NREQIN=1, +YCHEM_NL(65)%RMOLMASS=148.0, +YCHEM_NL(65)%IGRBCODE=217228, +YCHEM_NL(65)%LNEGFIX=.TRUE., +YCHEM_NL(65)%IGRIBTC=218228, +YCHEM_NL(65)%HENRYA=17.0, +YCHEM_NL(65)%HENRYB=5000.0, +YCHEM_NL(65)%LQM=.false., +YCHEM_NL(65)%LQM3D=.TRUE., +!YCHEM_NL(65)%LCOMAD=.true., +YCHEM_NL(65)%LADV=.TRUE., +YCHEM_NL(65)%LMASSFIX=.TRUE., +YCHEM_NL(65)%BETAMFBC=-999.9, +YCHEM_NL(65)%LASSIM=.FALSE., +YCHEM_NL(66)%CNAME='ISOPOOH', +YCHEM_NL(66)%NREQIN=1, +YCHEM_NL(66)%RMOLMASS=118.0, +YCHEM_NL(66)%IGRBCODE=217161, +YCHEM_NL(66)%LNEGFIX=.TRUE., +YCHEM_NL(66)%IGRIBTC=218161, +YCHEM_NL(66)%IGRIBDV=221161, +YCHEM_NL(66)%HENRYA=3.2E11, +YCHEM_NL(66)%HENRYB=8700.0, +YCHEM_NL(66)%LQM=.false., +YCHEM_NL(66)%LQM3D=.TRUE., +!YCHEM_NL(66)%LCOMAD=.true., +YCHEM_NL(66)%LADV=.TRUE., +YCHEM_NL(66)%LMASSFIX=.TRUE., +YCHEM_NL(66)%BETAMFBC=-999.9, +YCHEM_NL(66)%LASSIM=.FALSE., +YCHEM_NL(67)%CNAME='GLY', +YCHEM_NL(67)%NREQIN=1, +YCHEM_NL(67)%RMOLMASS=58.04, +YCHEM_NL(67)%IGRBCODE=217107, +YCHEM_NL(67)%LNEGFIX=.TRUE., +YCHEM_NL(67)%IGRIBTC=218107, +YCHEM_NL(67)%IGRIBDV=221107, +YCHEM_NL(67)%HENRYA=4.1E5, +YCHEM_NL(67)%HENRYB=7500.0, +YCHEM_NL(67)%LQM=.false., +YCHEM_NL(67)%LQM3D=.TRUE., +!YCHEM_NL(67)%LCOMAD=.true., +YCHEM_NL(67)%LADV=.TRUE., +YCHEM_NL(67)%LMASSFIX=.TRUE., +YCHEM_NL(67)%BETAMFBC=-999.9, +YCHEM_NL(67)%LASSIM=.FALSE., +YCHEM_NL(68)%CNAME='GLYALD', +YCHEM_NL(68)%NREQIN=1, +YCHEM_NL(68)%RMOLMASS=60.05, +YCHEM_NL(68)%IGRBCODE=217101, +YCHEM_NL(68)%LNEGFIX=.TRUE., +YCHEM_NL(68)%IGRIBTC=218101, +YCHEM_NL(68)%IGRIBDV=221101, +YCHEM_NL(68)%HENRYA=4.1E4, +YCHEM_NL(68)%HENRYB=4600.0, +YCHEM_NL(68)%LQM=.false., +YCHEM_NL(68)%LQM3D=.TRUE., +!YCHEM_NL(68)%LCOMAD=.true., +YCHEM_NL(68)%LADV=.TRUE., +YCHEM_NL(68)%LMASSFIX=.TRUE., +YCHEM_NL(68)%BETAMFBC=-999.9, +YCHEM_NL(68)%LASSIM=.FALSE., +YCHEM_NL(69)%CNAME='HYAC', +YCHEM_NL(69)%NREQIN=1, +YCHEM_NL(69)%RMOLMASS=74.1, +YCHEM_NL(69)%IGRBCODE=217118, +YCHEM_NL(69)%LNEGFIX=.TRUE., +YCHEM_NL(69)%IGRIBTC=218117, +YCHEM_NL(69)%IGRIBDV=221118, +YCHEM_NL(69)%HENRYA=6.3E3, +YCHEM_NL(69)%HENRYB=6460.0, +YCHEM_NL(69)%LQM=.false., +YCHEM_NL(69)%LQM3D=.TRUE., +!YCHEM_NL(69)%LCOMAD=.true., +YCHEM_NL(69)%LADV=.TRUE., +YCHEM_NL(69)%LMASSFIX=.TRUE., +YCHEM_NL(69)%BETAMFBC=-999.9, +YCHEM_NL(69)%LASSIM=.FALSE., +YCHEM_NL(70)%CNAME='ISOPBO2', +YCHEM_NL(70)%NREQIN=1, +YCHEM_NL(70)%RMOLMASS=117.0, +YCHEM_NL(70)%IGRBCODE=217229, +YCHEM_NL(70)%LNEGFIX=.TRUE., +YCHEM_NL(70)%IGRIBTC=218229, +YCHEM_NL(70)%LQM=.false., +YCHEM_NL(70)%LQM3D=.TRUE., +!YCHEM_NL(70)%LCOMAD=.true., +YCHEM_NL(70)%LADV=.FALSE., +YCHEM_NL(70)%LMASSFIX=.FALSE., +YCHEM_NL(70)%LMASSFIX=.FALSE., +YCHEM_NL(70)%LASSIM=.FALSE., +YCHEM_NL(71)%CNAME='ISOPDO2', +YCHEM_NL(71)%NREQIN=1, +YCHEM_NL(71)%RMOLMASS=117.0, +YCHEM_NL(71)%IGRBCODE=217230, +YCHEM_NL(71)%LNEGFIX=.TRUE., +YCHEM_NL(71)%IGRIBTC=218230, +YCHEM_NL(71)%LQM=.false., +YCHEM_NL(71)%LQM3D=.TRUE., +!YCHEM_NL(71)%LCOMAD=.true., +YCHEM_NL(71)%LADV=.FALSE., +YCHEM_NL(71)%LMASSFIX=.FALSE., +YCHEM_NL(71)%LMASSFIX=.FALSE., +YCHEM_NL(71)%LASSIM=.FALSE., +YCHEM_NL(72)%CNAME='SOG1', +YCHEM_NL(72)%NREQIN=1, +YCHEM_NL(72)%RMOLMASS=180.0, +YCHEM_NL(72)%IGRBCODE=217186, +YCHEM_NL(72)%LNEGFIX=.TRUE., +YCHEM_NL(72)%IGRIBTC=218186, +YCHEM_NL(72)%HENRYA=1.E5, +YCHEM_NL(72)%HENRYB=6000.0, +YCHEM_NL(72)%LQM=.false., +YCHEM_NL(72)%LQM3D=.TRUE., +!YCHEM_NL(72)%LCOMAD=.true., +YCHEM_NL(72)%LADV=.TRUE., +YCHEM_NL(72)%LMASSFIX=.TRUE., +YCHEM_NL(72)%BETAMFBC=-999.9, +YCHEM_NL(72)%LASSIM=.FALSE., +YCHEM_NL(73)%CNAME='SOG2A', +YCHEM_NL(73)%NREQIN=1, +YCHEM_NL(73)%RMOLMASS=120.0, +YCHEM_NL(73)%IGRBCODE=217187, +YCHEM_NL(73)%LNEGFIX=.TRUE., +YCHEM_NL(73)%IGRIBTC=218187, +YCHEM_NL(73)%HENRYA=1.E3, +YCHEM_NL(73)%HENRYB=6000.0, +YCHEM_NL(73)%LQM=.false., +YCHEM_NL(73)%LQM3D=.TRUE., +!YCHEM_NL(73)%LCOMAD=.true., +YCHEM_NL(73)%LADV=.TRUE., +YCHEM_NL(73)%LMASSFIX=.TRUE., +YCHEM_NL(73)%BETAMFBC=-999.9, +YCHEM_NL(73)%LASSIM=.FALSE., +YCHEM_NL(74)%CNAME='SOG2B', +YCHEM_NL(74)%NREQIN=1, +YCHEM_NL(74)%RMOLMASS=120.0, +YCHEM_NL(74)%IGRBCODE=217188, +YCHEM_NL(74)%LNEGFIX=.TRUE., +YCHEM_NL(74)%IGRIBTC=218188, +YCHEM_NL(74)%HENRYA=1.E5, +YCHEM_NL(74)%HENRYB=6000.0, +YCHEM_NL(74)%LQM=.false., +YCHEM_NL(74)%LQM3D=.TRUE., +!YCHEM_NL(74)%LCOMAD=.true., +YCHEM_NL(74)%LADV=.TRUE., +YCHEM_NL(74)%LMASSFIX=.TRUE., +YCHEM_NL(74)%BETAMFBC=-999.9, +YCHEM_NL(74)%LASSIM=.FALSE., +NGFL_EXT=1, +YEXT_NL(1)%CNAME='EMILI', +YEXT_NL(1)%NREQIN=0, +YEXT_NL(1)%IGRBCODE=212254, +YEXT_NL(1)%LADV=.FALSE., +YEXT_NL(1)%LGP=.TRUE., +YEXT_NL(1)%LGPINGP=.TRUE., +!YEXT_NL(2)%CNAME='KCH4CHEM', +!YEXT_NL(2)%NREQIN=0, +!YEXT_NL(2)%IGRBCODE=210071, +!YEXT_NL(2)%LADV=.FALSE., +!YEXT_NL(2)%LGP=.TRUE., +!YEXT_NL(2)%LGPINGP=.TRUE., +EOF diff --git a/ifs-test/tests/t255/common/m7/m7_compoemis.nml b/ifs-test/tests/t255/common/m7/m7_compoemis.nml new file mode 100644 index 00000000..e904f9d2 --- /dev/null +++ b/ifs-test/tests/t255/common/m7/m7_compoemis.nml @@ -0,0 +1,283 @@ +cat >> fort.4 << EOF + +&NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=219209 / +&NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="emiss_bio" THIS%PARAMID=212001 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.25 / +&NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="ene" THIS%PARAMID=212002 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="fef" THIS%PARAMID=212003 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="ind" THIS%PARAMID=212004 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="res" THIS%PARAMID=212006 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="shp" THIS%PARAMID=212007 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="slv" THIS%PARAMID=212189 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="swd" THIS%PARAMID=212008 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="tnr" THIS%PARAMID=212009 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="tro" THIS%PARAMID=212010 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="C10H16" THIS%SECTOR="emiss_bio" THIS%PARAMID=212011 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.65 / +&NAMCOMPO_EMIS THIS%SPECIES="C10H16" THIS%SECTOR="ene" THIS%PARAMID=212012 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="C10H16" THIS%SECTOR="fef" THIS%PARAMID=212013 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="C10H16" THIS%SECTOR="ind" THIS%PARAMID=212014 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="C10H16" THIS%SECTOR="res" THIS%PARAMID=212015 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="C10H16" THIS%SECTOR="shp" THIS%PARAMID=212016 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="C10H16" THIS%SECTOR="slv" THIS%PARAMID=212019 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="C10H16" THIS%SECTOR="swd" THIS%PARAMID=212017 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="C10H16" THIS%SECTOR="tnr" THIS%PARAMID=212018 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210106 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="emiss_bio" THIS%PARAMID=212021 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.25 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="emiss_nat" THIS%PARAMID=212022 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="ene" THIS%PARAMID=212023 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="fef" THIS%PARAMID=212024 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="ind" THIS%PARAMID=212025 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="ref" THIS%PARAMID=212020 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="res" THIS%PARAMID=212026 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="shp" THIS%PARAMID=212027 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="slv" THIS%PARAMID=212133 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="swd" THIS%PARAMID=212028 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="tnr" THIS%PARAMID=212029 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="tro" THIS%PARAMID=212030 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210104 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="emiss_bio" THIS%PARAMID=212031 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.25 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="ene" THIS%PARAMID=212032 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="fef" THIS%PARAMID=212033 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="ind" THIS%PARAMID=212034 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="ref" THIS%PARAMID=212040 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="res" THIS%PARAMID=212035 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="shp" THIS%PARAMID=212036 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="slv" THIS%PARAMID=212137 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="swd" THIS%PARAMID=212037 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="tnr" THIS%PARAMID=212038 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="tro" THIS%PARAMID=212039 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210118 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="emiss_bio" THIS%PARAMID=212041 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.65 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="emiss_nat" THIS%PARAMID=212042 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="ene" THIS%PARAMID=212043 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="fef" THIS%PARAMID=212044 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="ind" THIS%PARAMID=212045 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="ref" THIS%PARAMID=212134 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="res" THIS%PARAMID=212046 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="shp" THIS%PARAMID=212047 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="slv" THIS%PARAMID=212185 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="swd" THIS%PARAMID=212048 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="tnr" THIS%PARAMID=212049 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="tro" THIS%PARAMID=212050 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210107 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="emiss_bio" THIS%PARAMID=212051 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.65 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="emiss_nat" THIS%PARAMID=212052 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="ene" THIS%PARAMID=212053 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="fef" THIS%PARAMID=212054 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="ind" THIS%PARAMID=212055 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="ref" THIS%PARAMID=212135 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="res" THIS%PARAMID=212056 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="shp" THIS%PARAMID=212057 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="slv" THIS%PARAMID=212186 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="swd" THIS%PARAMID=212058 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="tnr" THIS%PARAMID=212059 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="tro" THIS%PARAMID=212060 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210105 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="emiss_bio" THIS%PARAMID=212061 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.65 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="emiss_nat" THIS%PARAMID=212062 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="ene" THIS%PARAMID=212063 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="fef" THIS%PARAMID=212064 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="ind" THIS%PARAMID=212065 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="ref" THIS%PARAMID=212136 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="res" THIS%PARAMID=212066 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="shp" THIS%PARAMID=212067 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="slv" THIS%PARAMID=212187 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="swd" THIS%PARAMID=212068 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="tnr" THIS%PARAMID=212069 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="tro" THIS%PARAMID=212070 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210108 / +&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="emiss_bio" THIS%PARAMID=212071 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.00 / +&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="ene" THIS%PARAMID=212072 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="fef" THIS%PARAMID=212073 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="ind" THIS%PARAMID=212074 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="ref" THIS%PARAMID=212080 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="res" THIS%PARAMID=212075 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="shp" THIS%PARAMID=212076 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="slv" THIS%PARAMID=212198 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="swd" THIS%PARAMID=212077 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="tnr" THIS%PARAMID=212078 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="tro" THIS%PARAMID=212079 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="CH2O" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210113 / +&NAMCOMPO_EMIS THIS%SPECIES="CH2O" THIS%SECTOR="emiss_bio" THIS%PARAMID=212081 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.25 / +&NAMCOMPO_EMIS THIS%SPECIES="CH2O" THIS%SECTOR="ene" THIS%PARAMID=212082 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="CH2O" THIS%SECTOR="fef" THIS%PARAMID=212083 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="CH2O" THIS%SECTOR="ind" THIS%PARAMID=212084 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="CH2O" THIS%SECTOR="res" THIS%PARAMID=212085 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="CH2O" THIS%SECTOR="shp" THIS%PARAMID=212086 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="CH2O" THIS%SECTOR="slv" THIS%PARAMID=212090 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="CH2O" THIS%SECTOR="swd" THIS%PARAMID=212087 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="CH2O" THIS%SECTOR="tnr" THIS%PARAMID=212088 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="CH2O" THIS%SECTOR="tro" THIS%PARAMID=212089 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="CH3CN" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=219220 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3CN" THIS%SECTOR="ene" THIS%SCALING=0.0015 THIS%PARAMID=212123 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3CN" THIS%SECTOR="ind" THIS%SCALING=0.0015 THIS%PARAMID=212125 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3CN" THIS%SECTOR="ref" THIS%SCALING=0.0015 THIS%PARAMID=212120 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3CN" THIS%SECTOR="res" THIS%SCALING=0.0015 THIS%PARAMID=212126 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210115 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="emiss_bio" THIS%PARAMID=212091 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.65 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="emiss_nat" THIS%SCALING=1.4 THIS%PARAMID=212122 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="ene" THIS%PARAMID=212092 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="fef" THIS%PARAMID=212093 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="ind" THIS%PARAMID=212094 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="ref" THIS%PARAMID=212100 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="res" THIS%PARAMID=212095 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="shp" THIS%PARAMID=212096 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="slv" THIS%PARAMID=212190 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="swd" THIS%PARAMID=212097 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="tnr" THIS%PARAMID=212098 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="tro" THIS%PARAMID=212099 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210103 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="emiss_bio" THIS%PARAMID=212111 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.25 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="ene" THIS%PARAMID=212112 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="fef" THIS%PARAMID=212113 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="ind" THIS%PARAMID=212114 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="ref" THIS%PARAMID=212110 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="res" THIS%PARAMID=212115 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="shp" THIS%PARAMID=212116 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="slv" THIS%PARAMID=212140 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="swd" THIS%PARAMID=212117 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="tnr" THIS%PARAMID=212118 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="tro" THIS%PARAMID=212119 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210081 / +&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="emiss_bio" THIS%PARAMID=212121 / +&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="emiss_nat" THIS%PARAMID=212122 / +&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="ene" THIS%PARAMID=212123 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="fef" THIS%PARAMID=212124 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="ind" THIS%PARAMID=212125 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="ref" THIS%PARAMID=212120 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="res" THIS%PARAMID=212126 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="shp" THIS%PARAMID=212127 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="swd" THIS%PARAMID=212128 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="tnr" THIS%PARAMID=212129 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="tro" THIS%PARAMID=212130 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="DMS" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210117 / +&NAMCOMPO_EMIS THIS%SPECIES="DMS" THIS%SECTOR="emiss_bio" THIS%PARAMID=212132 / +&NAMCOMPO_EMIS THIS%SPECIES="DMS" THIS%SECTOR="emiss_nat" THIS%PARAMID=212131 / +&NAMCOMPO_EMIS THIS%SPECIES="GLY" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=212244 / +&NAMCOMPO_EMIS THIS%SPECIES="HCN" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=219219 / +&NAMCOMPO_EMIS THIS%SPECIES="HCN" THIS%SECTOR="ene" THIS%SCALING=0.001 THIS%PARAMID=212123 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="HCN" THIS%SECTOR="ind" THIS%SCALING=0.001 THIS%PARAMID=212125 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="HCN" THIS%SECTOR="ref" THIS%SCALING=0.001 THIS%PARAMID=212120 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="HCN" THIS%SECTOR="res" THIS%SCALING=0.001 THIS%PARAMID=212126 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="HCOOH" THIS%SECTOR="emiss_bio" THIS%PARAMID=212141 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.25 / +&NAMCOMPO_EMIS THIS%SPECIES="HCOOH" THIS%SECTOR="ene" THIS%PARAMID=212142 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="HCOOH" THIS%SECTOR="fef" THIS%PARAMID=212143 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="HCOOH" THIS%SECTOR="ind" THIS%PARAMID=212144 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="HCOOH" THIS%SECTOR="res" THIS%PARAMID=212145 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="HCOOH" THIS%SECTOR="shp" THIS%PARAMID=212146 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="HCOOH" THIS%SECTOR="slv" THIS%PARAMID=212240 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="HCOOH" THIS%SECTOR="swd" THIS%PARAMID=212147 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="HCOOH" THIS%SECTOR="tnr" THIS%PARAMID=212148 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="HCOOH" THIS%SECTOR="tro" THIS%PARAMID=212149 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="ISPD" THIS%SECTOR="emiss_bio" THIS%PARAMID=212150 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.65 / +&NAMCOMPO_EMIS THIS%SPECIES="MCOOH" THIS%SECTOR="emiss_bio" THIS%PARAMID=212151 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.25 / +&NAMCOMPO_EMIS THIS%SPECIES="MCOOH" THIS%SECTOR="ene" THIS%PARAMID=212152 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="MCOOH" THIS%SECTOR="fef" THIS%PARAMID=212153 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="MCOOH" THIS%SECTOR="ind" THIS%PARAMID=212154 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="MCOOH" THIS%SECTOR="res" THIS%PARAMID=212155 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="MCOOH" THIS%SECTOR="shp" THIS%PARAMID=212156 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="MCOOH" THIS%SECTOR="slv" THIS%PARAMID=212241 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="MCOOH" THIS%SECTOR="swd" THIS%PARAMID=212157 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="MCOOH" THIS%SECTOR="tnr" THIS%PARAMID=212158 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="MCOOH" THIS%SECTOR="tro" THIS%PARAMID=212159 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210116 / +&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="agl" THIS%PARAMID=212163 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" / +&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="ags" THIS%PARAMID=212164 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGS" / +&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="emiss_bio" THIS%PARAMID=212161 / +&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="emiss_nat" THIS%PARAMID=212162 / +&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="ene" THIS%PARAMID=212165 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="ind" THIS%PARAMID=212166 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="ref" THIS%PARAMID=212138 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="res" THIS%PARAMID=212167 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="slv" THIS%PARAMID=212169 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="swd" THIS%PARAMID=212170 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="tnr" THIS%PARAMID=212171 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="tro" THIS%PARAMID=212172 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210085 / +&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="agl" THIS%PARAMID=212174 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" / +&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="emiss_nat" THIS%PARAMID=212173 / +&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="ene" THIS%PARAMID=212176 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="fef" THIS%PARAMID=212177 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="ind" THIS%PARAMID=212178 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="ref" THIS%PARAMID=212184 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="res" THIS%PARAMID=212179 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="shp" THIS%PARAMID=212180 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="swd" THIS%PARAMID=212181 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="tnr" THIS%PARAMID=212182 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="tro" THIS%PARAMID=212183 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="NO2" THIS%SECTOR="Aviation" THIS%VERTICAL_PROFILE_TYPE="3D" THIS%PARAMID=212255 THIS%SCALING=1.53333333333333 / +&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=219208 / +&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="emiss_bio" THIS%PARAMID=212191 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.65 / +&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="ene" THIS%PARAMID=212192 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="fef" THIS%PARAMID=212193 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="ind" THIS%PARAMID=212194 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="ref" THIS%PARAMID=212200 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="res" THIS%PARAMID=212195 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="shp" THIS%PARAMID=212196 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="slv" THIS%PARAMID=212242 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="swd" THIS%PARAMID=212197 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="tnr" THIS%PARAMID=212188 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="tro" THIS%PARAMID=212199 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=219207 / +&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="emiss_bio" THIS%PARAMID=212201 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.65 / +&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="ene" THIS%PARAMID=212202 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="fef" THIS%PARAMID=212203 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="ind" THIS%PARAMID=212204 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="ref" THIS%PARAMID=212139 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="res" THIS%PARAMID=212205 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="shp" THIS%PARAMID=212206 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="slv" THIS%PARAMID=212243 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="swd" THIS%PARAMID=212207 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="tnr" THIS%PARAMID=212208 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="tro" THIS%PARAMID=212209 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="Rn" THIS%SECTOR="emiss_nat" THIS%PARAMID=212210 / +&NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210102 / +&NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="emiss_nat" THIS%PARAMID=212211 THIS%VERTICAL_PROFILE_TYPE="AltitudeMap" THIS%VERTICAL_PARAMID=216045 THIS%VERTICAL_BASE_LEVEL=-1 THIS%VERTICAL_TOP_LEVEL=-4 THIS%VERTICAL_THRESHOLD=200 / +&NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="ene" THIS%PARAMID=212212 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="fef" THIS%PARAMID=212213 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="ind" THIS%PARAMID=212214 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="ref" THIS%PARAMID=212220 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="res" THIS%PARAMID=212215 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="shp" THIS%PARAMID=212216 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="swd" THIS%PARAMID=212217 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="tnr" THIS%PARAMID=212218 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="tro" THIS%PARAMID=212219 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="SOG2B" THIS%SECTOR="agl" THIS%PARAMID=216221 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" / +&NAMCOMPO_EMIS THIS%SPECIES="SOG2B" THIS%SECTOR="ene" THIS%PARAMID=216222 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="SOG2B" THIS%SECTOR="fef" THIS%PARAMID=216223 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="SOG2B" THIS%SECTOR="ind" THIS%PARAMID=216224 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="SOG2B" THIS%SECTOR="ref" THIS%PARAMID=216225 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="SOG2B" THIS%SECTOR="res" THIS%PARAMID=216226 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="SOG2B" THIS%SECTOR="shp" THIS%PARAMID=216227 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="SOG2B" THIS%SECTOR="slv" THIS%PARAMID=216228 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="SOG2B" THIS%SECTOR="swd" THIS%PARAMID=216229 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="SOG2B" THIS%SECTOR="tnr" THIS%PARAMID=216230 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="SOG2B" THIS%SECTOR="tro" THIS%PARAMID=216231 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=219212 / +&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="emiss_bio" THIS%PARAMID=216200 / +&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="ene" THIS%PARAMID=216201 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="fef" THIS%PARAMID=216202 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="ind" THIS%PARAMID=216203 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="ref" THIS%PARAMID=216204 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="res" THIS%PARAMID=216205 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="shp" THIS%PARAMID=216206 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="slv" THIS%PARAMID=216207 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="swd" THIS%PARAMID=216208 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="tnr" THIS%PARAMID=216209 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="tro" THIS%PARAMID=216210 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="XYL" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=219213 / +&NAMCOMPO_EMIS THIS%SPECIES="XYL" THIS%SECTOR="ene" THIS%PARAMID=216211 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="XYL" THIS%SECTOR="fef" THIS%PARAMID=216212 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="XYL" THIS%SECTOR="ind" THIS%PARAMID=216213 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="XYL" THIS%SECTOR="ref" THIS%PARAMID=216214 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="XYL" THIS%SECTOR="res" THIS%PARAMID=216215 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="XYL" THIS%SECTOR="shp" THIS%PARAMID=216216 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="XYL" THIS%SECTOR="slv" THIS%PARAMID=216217 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="XYL" THIS%SECTOR="swd" THIS%PARAMID=216218 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="XYL" THIS%SECTOR="tnr" THIS%PARAMID=216219 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="XYL" THIS%SECTOR="tro" THIS%PARAMID=216220 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS / +&NAMCOMPO_EMIS_AUX THIS%PARAMID=210060 / +&NAMCOMPO_EMIS_AUX THIS%PARAMID=216045 / +&NAMCOMPO_EMIS_AUX / + +EOF diff --git a/ifs-test/tests/t255/common/namelist_m7_from_openifsrun b/ifs-test/tests/t255/common/namelist_m7_from_openifsrun new file mode 100644 index 00000000..fbcaa40a --- /dev/null +++ b/ifs-test/tests/t255/common/namelist_m7_from_openifsrun @@ -0,0 +1,4775 @@ +&NAMIOS +CFRCF="./rcf", +CIOSPRF="./srf", +/ +&NAMGRIB +CFCLASS="rd", +NCYCLE=154, +/ +&NAMCVER +LVERTFE=true, +NVSCH=3, +LVFE_GWMPA=true, +LVFE_GW=false, +LVFE_Z_TERM=false, +LVFE_X_TERM=false, +LVFE_LAPL_BC=true, +LVFE_LAPL=true, +NDLNPR=0, +/ +&NAMMCC +LMCC_COMPO=false, +LMCCEC=true, +LMCCIEC=false, +/ +&NAMTRANS +LUSEFLT=false, +LFFTW=false, +/ +&NAMRES +NFRRES=1, +NRESTS(:)=-1,-32767, +/ +&NAERAD +CRTABLEDIR='./rtables/', +LECOMPGRID=false, +RMUZUV=0.01, +NUVTIM=72, +NRADUV=1, +NUV=24, +LUVPROC=false, +LUVAERP=true, +LO3_CHEM_UV=true, +KMODTS=2, +NAERMACC=0, +NRPROMA=0, +/ +&NAEPHY +LNEEONLINE=true, +LWETONLINE=false, +LBFASCO2=false, +LEPHYS=true, +LEVDIF=true, +LESURF=true, +LECOND=true, +LECUMF=true, +LEPCLD=true, +LEEVAP=true, +LEVGEN=true, +LESSRO=true, +LECURR=false, +LEOCWA=true, +LEGWDG=true, +LEGWWMS=true, +LEOZOC=true, +LEQNGT=true, +LERADI=true, +LERADS=true, +LESICE=true, +LEO3CH=true, +LO3CH_HLO=true, +CO3CHEM="H1.0", +LEDCLD=true, +LDUCTDIA=false, +LDIAGTURB_EC=false, +LELIGHT=false, +LWCOU=true, +LWCOU2W=true, +LWCOUHMF=false, +LWCOURNW=false, +NSTPW=1, +LSLPHY=true, +LESNML=true, +NSNMLWS=2, +LEFARQUHAR=true, +LEOPTSURF=false, +LEAIRCO2COUP=false, +LEC4MAP=true, +LEAGS=false, +/ +&NAMPAR1 +NOUTTYPE=1, +LSPLIT=true, +NWRTOUT=4, +NFLDIN=0, +NSTRIN=1, +/ +&NAMPAR0 +LXML_STATS=false, +LSTATS=true, +LDETAILED_STATS=false, +LSYNCSTATS=false, +LSTATSCPU=false, +NPRNT_STATS=512, +LBARRIER_STATS=false, +LBARRIER_STATS2=false, +NPROC=512, +NSPECRESMIN=256, +NOUTPUT=1, +MP_TYPE=1, +MBX_SIZE=0, +/ +&NAMDYNA +LSLAG=true, +LNHEE=false, +LNHQE=false, +LGRADSP=true, +LCOMAD_GFL=true, +LCOMADH=true, +/ +&NAMDYNCORE +LAQUA=false, +/ +&NAMDYN +LMASCOR=true, +NITMP=3, +/ +&NAMCT0 +LARPEGEF=false, +LFDBOP=false, +LSMSSIG=false, +N3DINI=0, +NFRDHP=12, +NFRDHFD=1, +NFRSDI=1, +NFRPOS=6, +NFRHIS=6, +NFRMASSCON=1, +NFPOS=2, +NPOSTS=0, +NHISTS=0, +NMASSCONS=0, +NFRCO=4, +NFRDHFZ=48, +NDHFZTS=0, +NDHFDTS=0, +NUNDEFLD=-999999, +CMETER="ecflow_client --meter", +CEVENT="ecflow_client --event", +/ +&NAMDDH +BDEDDH(1:6,1)=4.0,1.0,0.0,50.0,0.0,49.0, +NDHKD=120, +LHDZON=false, +LHDEFZ=false, +LHDDOP=false, +LHDEFD=false, +LHDGLB=false, +LHDPRG=false, +LHDHKS=false, +/ +&NAMIO_SERV +NPROCESS_LEVEL=5, +NIO_SERV_METHOD=2, +NMSG_LEVEL_CLIENT=0, +NMSG_LEVEL_SERVER=1, +/ +&NAMGFL +NAERO=37, +NACTAERO=37, +YAERO_NL(1)%CNAME='SO4', +YAERO_NL(1)%IGRBCODE=210011, +YAERO_NL(1)%LMASSFIX=.true., +YAERO_NL(1)%LCOMAD=.true., +YAERO_NL(1)%LQM=.false., +YAERO_NL(1)%LQM3D=.true., +YAERO_NL(1)%BETAMFBC=-999, +YAERO_NL(1)%LADV=.true., +YAERO_NL(1)%NREQIN=0, +YAERO_NL(2)%CNAME='NH4', +YAERO_NL(2)%IGRBCODE=212035, +YAERO_NL(2)%LMASSFIX=.true., +YAERO_NL(2)%LCOMAD=.true., +YAERO_NL(2)%LQM=.false., +YAERO_NL(2)%LQM3D=.true., +YAERO_NL(2)%BETAMFBC=-999, +YAERO_NL(2)%LADV=.true., +YAERO_NL(2)%NREQIN=0, +YAERO_NL(3)%CNAME='NO3_A', +YAERO_NL(3)%IGRBCODE=212036, +YAERO_NL(3)%LMASSFIX=.true., +YAERO_NL(3)%LCOMAD=.true., +YAERO_NL(3)%LQM=.false., +YAERO_NL(3)%LQM3D=.true., +YAERO_NL(3)%BETAMFBC=-999, +YAERO_NL(3)%LADV=.true., +YAERO_NL(3)%NREQIN=0, +YAERO_NL(4)%CNAME='ACS_N', +YAERO_NL(4)%IGRBCODE=212001, +YAERO_NL(4)%LMASSFIX=.true., +YAERO_NL(4)%LCOMAD=.true., +YAERO_NL(4)%LQM=.false., +YAERO_NL(4)%LQM3D=.true., +YAERO_NL(4)%BETAMFBC=-999, +YAERO_NL(4)%LADV=.true., +YAERO_NL(4)%NREQIN=0, +YAERO_NL(5)%CNAME='SO4ACS', +YAERO_NL(5)%IGRBCODE=212002, +YAERO_NL(5)%LMASSFIX=.true., +YAERO_NL(5)%LCOMAD=.true., +YAERO_NL(5)%LQM=.false., +YAERO_NL(5)%LQM3D=.true., +YAERO_NL(5)%BETAMFBC=-999, +YAERO_NL(5)%LADV=.true., +YAERO_NL(5)%NREQIN=0, +YAERO_NL(6)%CNAME='BCACS', +YAERO_NL(6)%IGRBCODE=212003, +YAERO_NL(6)%LMASSFIX=.true., +YAERO_NL(6)%LCOMAD=.true., +YAERO_NL(6)%LQM=.false., +YAERO_NL(6)%LQM3D=.true., +YAERO_NL(6)%BETAMFBC=-999, +YAERO_NL(6)%LADV=.true., +YAERO_NL(6)%NREQIN=0, +YAERO_NL(7)%CNAME='POMACS', +YAERO_NL(7)%IGRBCODE=212004, +YAERO_NL(7)%LMASSFIX=.true., +YAERO_NL(7)%LCOMAD=.true., +YAERO_NL(7)%LQM=.false., +YAERO_NL(7)%LQM3D=.true., +YAERO_NL(7)%BETAMFBC=-999, +YAERO_NL(7)%LADV=.true., +YAERO_NL(7)%NREQIN=0, +YAERO_NL(8)%CNAME='SSACS', +YAERO_NL(8)%IGRBCODE=212005, +YAERO_NL(8)%LMASSFIX=.true., +YAERO_NL(8)%LCOMAD=.true., +YAERO_NL(8)%LQM=.false., +YAERO_NL(8)%LQM3D=.true., +YAERO_NL(8)%BETAMFBC=-999, +YAERO_NL(8)%LADV=.true., +YAERO_NL(8)%NREQIN=0, +YAERO_NL(9)%CNAME='DUACS', +YAERO_NL(9)%IGRBCODE=212006, +YAERO_NL(9)%LMASSFIX=.true., +YAERO_NL(9)%LCOMAD=.true., +YAERO_NL(9)%LQM=.false., +YAERO_NL(9)%LQM3D=.true., +YAERO_NL(9)%BETAMFBC=-999, +YAERO_NL(9)%LADV=.true., +YAERO_NL(9)%NREQIN=0, +YAERO_NL(10)%CNAME='SOANUS', +YAERO_NL(10)%IGRBCODE=212007, +YAERO_NL(10)%LMASSFIX=.true., +YAERO_NL(10)%LCOMAD=.true., +YAERO_NL(10)%LQM=.false., +YAERO_NL(10)%LQM3D=.true., +YAERO_NL(10)%BETAMFBC=-999, +YAERO_NL(10)%LADV=.true., +YAERO_NL(10)%NREQIN=0, +YAERO_NL(11)%CNAME='SOAAIS', +YAERO_NL(11)%IGRBCODE=212008, +YAERO_NL(11)%LMASSFIX=.true., +YAERO_NL(11)%LCOMAD=.true., +YAERO_NL(11)%LQM=.false., +YAERO_NL(11)%LQM3D=.true., +YAERO_NL(11)%BETAMFBC=-999, +YAERO_NL(11)%LADV=.true., +YAERO_NL(11)%NREQIN=0, +YAERO_NL(12)%CNAME='SOAACS', +YAERO_NL(12)%IGRBCODE=212009, +YAERO_NL(12)%LMASSFIX=.true., +YAERO_NL(12)%LCOMAD=.true., +YAERO_NL(12)%LQM=.false., +YAERO_NL(12)%LQM3D=.true., +YAERO_NL(12)%BETAMFBC=-999, +YAERO_NL(12)%LADV=.true., +YAERO_NL(12)%NREQIN=0, +YAERO_NL(13)%CNAME='SOACOS', +YAERO_NL(13)%IGRBCODE=212010, +YAERO_NL(13)%LMASSFIX=.true., +YAERO_NL(13)%LCOMAD=.true., +YAERO_NL(13)%LQM=.false., +YAERO_NL(13)%LQM3D=.true., +YAERO_NL(13)%BETAMFBC=-999, +YAERO_NL(13)%LADV=.true., +YAERO_NL(13)%NREQIN=0, +YAERO_NL(14)%CNAME='SOAAII', +YAERO_NL(14)%IGRBCODE=212011, +YAERO_NL(14)%LMASSFIX=.true., +YAERO_NL(14)%LCOMAD=.true., +YAERO_NL(14)%LQM=.false., +YAERO_NL(14)%LQM3D=.true., +YAERO_NL(14)%BETAMFBC=-999, +YAERO_NL(14)%LADV=.true., +YAERO_NL(14)%NREQIN=0, +YAERO_NL(15)%CNAME='H2OPART', +YAERO_NL(15)%IGRBCODE=212012, +YAERO_NL(15)%LMASSFIX=.true., +YAERO_NL(15)%LCOMAD=.true., +YAERO_NL(15)%LQM=.false., +YAERO_NL(15)%LQM3D=.true., +YAERO_NL(15)%BETAMFBC=-999, +YAERO_NL(15)%LADV=.true., +YAERO_NL(15)%NREQIN=0, +YAERO_NL(16)%CNAME='AII_N', +YAERO_NL(16)%IGRBCODE=212013, +YAERO_NL(16)%LMASSFIX=.true., +YAERO_NL(16)%LCOMAD=.true., +YAERO_NL(16)%LQM=.false., +YAERO_NL(16)%LQM3D=.true., +YAERO_NL(16)%BETAMFBC=-999, +YAERO_NL(16)%LADV=.true., +YAERO_NL(16)%NREQIN=0, +YAERO_NL(17)%CNAME='BCAII', +YAERO_NL(17)%IGRBCODE=212014, +YAERO_NL(17)%LMASSFIX=.true., +YAERO_NL(17)%LCOMAD=.true., +YAERO_NL(17)%LQM=.false., +YAERO_NL(17)%LQM3D=.true., +YAERO_NL(17)%BETAMFBC=-999, +YAERO_NL(17)%LADV=.true., +YAERO_NL(17)%NREQIN=0, +YAERO_NL(18)%CNAME='POMAII', +YAERO_NL(18)%IGRBCODE=212015, +YAERO_NL(18)%LMASSFIX=.true., +YAERO_NL(18)%LCOMAD=.true., +YAERO_NL(18)%LQM=.false., +YAERO_NL(18)%LQM3D=.true., +YAERO_NL(18)%BETAMFBC=-999, +YAERO_NL(18)%LADV=.true., +YAERO_NL(18)%NREQIN=0, +YAERO_NL(19)%CNAME='ACI_N', +YAERO_NL(19)%IGRBCODE=212016, +YAERO_NL(19)%LMASSFIX=.true., +YAERO_NL(19)%LCOMAD=.true., +YAERO_NL(19)%LQM=.false., +YAERO_NL(19)%LQM3D=.true., +YAERO_NL(19)%BETAMFBC=-999, +YAERO_NL(19)%LADV=.true., +YAERO_NL(19)%NREQIN=0, +YAERO_NL(20)%CNAME='DUACI', +YAERO_NL(20)%IGRBCODE=212017, +YAERO_NL(20)%LMASSFIX=.true., +YAERO_NL(20)%LCOMAD=.true., +YAERO_NL(20)%LQM=.false., +YAERO_NL(20)%LQM3D=.true., +YAERO_NL(20)%BETAMFBC=-999, +YAERO_NL(20)%LADV=.true., +YAERO_NL(20)%NREQIN=0, +YAERO_NL(21)%CNAME='AIS_N', +YAERO_NL(21)%IGRBCODE=212018, +YAERO_NL(21)%LMASSFIX=.true., +YAERO_NL(21)%LCOMAD=.true., +YAERO_NL(21)%LQM=.false., +YAERO_NL(21)%LQM3D=.true., +YAERO_NL(21)%BETAMFBC=-999, +YAERO_NL(21)%LADV=.true., +YAERO_NL(21)%NREQIN=0, +YAERO_NL(22)%CNAME='SO4AIS', +YAERO_NL(22)%IGRBCODE=212019, +YAERO_NL(22)%LMASSFIX=.true., +YAERO_NL(22)%LCOMAD=.true., +YAERO_NL(22)%LQM=.false., +YAERO_NL(22)%LQM3D=.true., +YAERO_NL(22)%BETAMFBC=-999, +YAERO_NL(22)%LADV=.true., +YAERO_NL(22)%NREQIN=0, +YAERO_NL(23)%CNAME='BCAIS', +YAERO_NL(23)%IGRBCODE=212020, +YAERO_NL(23)%LMASSFIX=.true., +YAERO_NL(23)%LCOMAD=.true., +YAERO_NL(23)%LQM=.false., +YAERO_NL(23)%LQM3D=.true., +YAERO_NL(23)%BETAMFBC=-999, +YAERO_NL(23)%LADV=.true., +YAERO_NL(23)%NREQIN=0, +YAERO_NL(24)%CNAME='POMAIS', +YAERO_NL(24)%IGRBCODE=212021, +YAERO_NL(24)%LMASSFIX=.true., +YAERO_NL(24)%LCOMAD=.true., +YAERO_NL(24)%LQM=.false., +YAERO_NL(24)%LQM3D=.true., +YAERO_NL(24)%BETAMFBC=-999, +YAERO_NL(24)%LADV=.true., +YAERO_NL(24)%NREQIN=0, +YAERO_NL(25)%CNAME='COI_N', +YAERO_NL(25)%IGRBCODE=212022, +YAERO_NL(25)%LMASSFIX=.true., +YAERO_NL(25)%LCOMAD=.true., +YAERO_NL(25)%LQM=.false., +YAERO_NL(25)%LQM3D=.true., +YAERO_NL(25)%BETAMFBC=-999, +YAERO_NL(25)%LADV=.true., +YAERO_NL(25)%NREQIN=0, +YAERO_NL(26)%CNAME='DUCOI', +YAERO_NL(26)%IGRBCODE=212023, +YAERO_NL(26)%LMASSFIX=.true., +YAERO_NL(26)%LCOMAD=.true., +YAERO_NL(26)%LQM=.false., +YAERO_NL(26)%LQM3D=.true., +YAERO_NL(26)%BETAMFBC=-999, +YAERO_NL(26)%LADV=.true., +YAERO_NL(26)%NREQIN=0, +YAERO_NL(27)%CNAME='COS_N', +YAERO_NL(27)%IGRBCODE=212024, +YAERO_NL(27)%LMASSFIX=.true., +YAERO_NL(27)%LCOMAD=.true., +YAERO_NL(27)%LQM=.false., +YAERO_NL(27)%LQM3D=.true., +YAERO_NL(27)%BETAMFBC=-999, +YAERO_NL(27)%LADV=.true., +YAERO_NL(27)%NREQIN=0, +YAERO_NL(28)%CNAME='SO4COS', +YAERO_NL(28)%IGRBCODE=212025, +YAERO_NL(28)%LMASSFIX=.true., +YAERO_NL(28)%LCOMAD=.true., +YAERO_NL(28)%LQM=.false., +YAERO_NL(28)%LQM3D=.true., +YAERO_NL(28)%BETAMFBC=-999, +YAERO_NL(28)%LADV=.true., +YAERO_NL(8)%NREQIN=0, +YAERO_NL(29)%CNAME='BCCOS', +YAERO_NL(29)%IGRBCODE=212026, +YAERO_NL(29)%LMASSFIX=.true., +YAERO_NL(29)%LCOMAD=.true., +YAERO_NL(29)%LQM=.false., +YAERO_NL(29)%LQM3D=.true., +YAERO_NL(29)%BETAMFBC=-999, +YAERO_NL(29)%LADV=.true., +YAERO_NL(29)%NREQIN=0, +YAERO_NL(30)%CNAME='POMCOS', +YAERO_NL(30)%IGRBCODE=212027, +YAERO_NL(30)%LMASSFIX=.true., +YAERO_NL(30)%LCOMAD=.true., +YAERO_NL(30)%LQM=.false., +YAERO_NL(30)%LQM3D=.true., +YAERO_NL(30)%BETAMFBC=-999, +YAERO_NL(30)%LADV=.true., +YAERO_NL(30)%NREQIN=0, +YAERO_NL(31)%CNAME='SSCOS', +YAERO_NL(31)%IGRBCODE=212028, +YAERO_NL(31)%LMASSFIX=.true., +YAERO_NL(31)%LCOMAD=.true., +YAERO_NL(31)%LQM=.false., +YAERO_NL(31)%LQM3D=.true., +YAERO_NL(31)%BETAMFBC=-999, +YAERO_NL(31)%LADV=.true., +YAERO_NL(31)%NREQIN=0, +YAERO_NL(32)%CNAME='DUCOS', +YAERO_NL(32)%IGRBCODE=212029, +YAERO_NL(32)%LMASSFIX=.true., +YAERO_NL(32)%LCOMAD=.true., +YAERO_NL(32)%LQM=.false., +YAERO_NL(32)%LQM3D=.true., +YAERO_NL(32)%BETAMFBC=-999, +YAERO_NL(32)%LADV=.true., +YAERO_NL(32)%NREQIN=0, +YAERO_NL(33)%CNAME='NUS_N', +YAERO_NL(33)%IGRBCODE=212030, +YAERO_NL(33)%LMASSFIX=.true., +YAERO_NL(33)%LCOMAD=.true., +YAERO_NL(33)%LQM=.false., +YAERO_NL(33)%LQM3D=.true., +YAERO_NL(33)%BETAMFBC=-999, +YAERO_NL(33)%LADV=.true., +YAERO_NL(33)%NREQIN=0, +YAERO_NL(34)%CNAME='SO4NUS', +YAERO_NL(34)%IGRBCODE=212031, +YAERO_NL(34)%LMASSFIX=.true., +YAERO_NL(34)%LCOMAD=.true., +YAERO_NL(34)%LQM=.false., +YAERO_NL(34)%LQM3D=.true., +YAERO_NL(34)%BETAMFBC=-999, +YAERO_NL(34)%LADV=.true., +YAERO_NL(34)%NREQIN=0, +YAERO_NL(35)%CNAME='ELVOC', +YAERO_NL(35)%IGRBCODE=212032, +YAERO_NL(35)%LMASSFIX=.true., +YAERO_NL(35)%LCOMAD=.true., +YAERO_NL(35)%LQM=.false., +YAERO_NL(35)%LQM3D=.true., +YAERO_NL(35)%BETAMFBC=-999, +YAERO_NL(35)%LADV=.true., +YAERO_NL(35)%NREQIN=0, +YAERO_NL(36)%CNAME='ISVOC', +YAERO_NL(36)%IGRBCODE=212033, +YAERO_NL(36)%LMASSFIX=.true., +YAERO_NL(36)%LCOMAD=.true., +YAERO_NL(36)%LQM=.false., +YAERO_NL(36)%LQM3D=.true., +YAERO_NL(36)%BETAMFBC=-999, +YAERO_NL(36)%LADV=.true., +YAERO_NL(36)%NREQIN=0, +YAERO_NL(37)%CNAME='MSA', +YAERO_NL(37)%IGRBCODE=212034, +YAERO_NL(37)%LMASSFIX=.true., +YAERO_NL(37)%LCOMAD=.true., +YAERO_NL(37)%LQM=.false., +YAERO_NL(37)%LQM3D=.true., +YAERO_NL(37)%BETAMFBC=-999, +YAERO_NL(37)%LADV=.true., +YAERO_NL(37)%NREQIN=0, +LAERAOT=false, +LAERLISI=false, +NAEROUT=0,NAERO_WVL_DIAG=20, +NAERO_WVL_DIAG_TYPES=5, +YAERO_WVL_DIAG_NL(1)%IWVL=550, +YAERO_WVL_DIAG_NL(1)%IGRIBDIAG=210207,215104,215122,215140,215158, +YAERO_WVL_DIAG_NL(2)%IWVL=340, +YAERO_WVL_DIAG_NL(2)%IGRIBDIAG=210217,215096,215114,215132,215150, +YAERO_WVL_DIAG_NL(3)%IWVL=355, +YAERO_WVL_DIAG_NL(3)%IGRIBDIAG=210218,215097,215115,215133,215151, +YAERO_WVL_DIAG_NL(4)%IWVL=380, +YAERO_WVL_DIAG_NL(4)%IGRIBDIAG=210219,215098,215116,215134,215152, +YAERO_WVL_DIAG_NL(5)%IWVL=400, +YAERO_WVL_DIAG_NL(5)%IGRIBDIAG=210220,215099,215117,215135,215153, +YAERO_WVL_DIAG_NL(6)%IWVL=440, +YAERO_WVL_DIAG_NL(6)%IGRIBDIAG=210221,215100,215118,215136,215154, +YAERO_WVL_DIAG_NL(7)%IWVL=469, +YAERO_WVL_DIAG_NL(7)%IGRIBDIAG=210213,215101,215119,215137,215155, +YAERO_WVL_DIAG_NL(8)%IWVL=500, +YAERO_WVL_DIAG_NL(8)%IGRIBDIAG=210222,215102,215120,215138,215156, +YAERO_WVL_DIAG_NL(9)%IWVL=532, +YAERO_WVL_DIAG_NL(9)%IGRIBDIAG=210223,215103,215121,215139,215157, +YAERO_WVL_DIAG_NL(10)%IWVL=645, +YAERO_WVL_DIAG_NL(10)%IGRIBDIAG=210224,215105,215123,215141,215159, +YAERO_WVL_DIAG_NL(11)%IWVL=670, +YAERO_WVL_DIAG_NL(11)%IGRIBDIAG=210214,215106,215124,215142,215160, +YAERO_WVL_DIAG_NL(12)%IWVL=800, +YAERO_WVL_DIAG_NL(12)%IGRIBDIAG=210225,215107,215125,215143,215161, +YAERO_WVL_DIAG_NL(13)%IWVL=858, +YAERO_WVL_DIAG_NL(13)%IGRIBDIAG=210226,215108,215126,215144,215162, +YAERO_WVL_DIAG_NL(14)%IWVL=865, +YAERO_WVL_DIAG_NL(14)%IGRIBDIAG=210215,215109,215127,215145,215163, +YAERO_WVL_DIAG_NL(15)%IWVL=1020, +YAERO_WVL_DIAG_NL(15)%IGRIBDIAG=210227,215110,215128,215146,215164, +YAERO_WVL_DIAG_NL(16)%IWVL=1064, +YAERO_WVL_DIAG_NL(16)%IGRIBDIAG=210228,215111,215129,215147,215165, +YAERO_WVL_DIAG_NL(17)%IWVL=1240, +YAERO_WVL_DIAG_NL(17)%IGRIBDIAG=210216,215112,215130,215148,215166, +YAERO_WVL_DIAG_NL(18)%IWVL=1640, +YAERO_WVL_DIAG_NL(18)%IGRIBDIAG=210229,215113,215131,215149,215167, +YAERO_WVL_DIAG_NL(19)%IWVL=2130, +YAERO_WVL_DIAG_NL(19)%IGRIBDIAG=210230,215176,215177,215178,215179, +YAERO_WVL_DIAG_NL(20)%IWVL=10000, +YAERO_WVL_DIAG_NL(20)%IGRIBDIAG=216008,216009,216010,216011,216012, +LAERCHEM=true, +NCHEM=74, +YCHEM_NL(1)%CNAME='O3', +YCHEM_NL(1)%NREQIN=1, +YCHEM_NL(1)%RMOLMASS=48.0, +YCHEM_NL(1)%IGRBCODE=210203, +YCHEM_NL(1)%LNEGFIX=.TRUE., +YCHEM_NL(1)%IGRIBTC=210206, +YCHEM_NL(1)%IGRIBDV=221001, +YCHEM_NL(1)%HENRYA=1.0e-2, +YCHEM_NL(1)%HENRYB=2800.0, +YCHEM_NL(1)%LQM=.false., +YCHEM_NL(1)%LQM3D=.TRUE., +YCHEM_NL(1)%LCOMAD=.true., +YCHEM_NL(1)%LADV=.TRUE., +YCHEM_NL(1)%LMASSFIX=.TRUE., +YCHEM_NL(1)%BETAMFBC=-999.9, +YCHEM_NL(1)%LASSIM=.TRUE., +YCHEM_NL(1)%LADV5=.TRUE., +YCHEM_NL(2)%CNAME='NOx', +YCHEM_NL(2)%NREQIN=0, +YCHEM_NL(2)%RMOLMASS=14.0, +YCHEM_NL(2)%IGRBCODE=210129, +YCHEM_NL(2)%LNEGFIX=.TRUE., +YCHEM_NL(2)%IGRIBTC=210130, +YCHEM_NL(2)%LQM=.false., +YCHEM_NL(2)%LQM3D=.TRUE., +YCHEM_NL(2)%LCOMAD=.true., +YCHEM_NL(2)%LADV=.TRUE., +YCHEM_NL(2)%LMASSFIX=.TRUE., +YCHEM_NL(2)%BETAMFBC=-999.9, +YCHEM_NL(2)%LASSIM=.FALSE., +YCHEM_NL(3)%CNAME='H2O2', +YCHEM_NL(3)%NREQIN=1, +YCHEM_NL(3)%RMOLMASS=34.0, +YCHEM_NL(3)%IGRBCODE=217003, +YCHEM_NL(3)%LNEGFIX=.TRUE., +YCHEM_NL(3)%IGRIBTC=218003, +YCHEM_NL(3)%IGRIBDV=221003, +YCHEM_NL(3)%HENRYA=8.3e4, +YCHEM_NL(3)%HENRYB=7600.0, +YCHEM_NL(3)%LQM=.false., +YCHEM_NL(3)%LQM3D=.TRUE., +YCHEM_NL(3)%LCOMAD=.true., +YCHEM_NL(3)%LADV=.TRUE., +YCHEM_NL(3)%LMASSFIX=.TRUE., +YCHEM_NL(3)%BETAMFBC=-999.9, +YCHEM_NL(3)%LASSIM=.FALSE., +YCHEM_NL(4)%CNAME='CH4', +YCHEM_NL(4)%NREQIN=1, +YCHEM_NL(4)%RMOLMASS=16.0, +YCHEM_NL(4)%IGRBCODE=217004, +YCHEM_NL(4)%LNEGFIX=.TRUE., +YCHEM_NL(4)%IGRIBTC=218004, +YCHEM_NL(4)%LQM=.false., +YCHEM_NL(4)%LQM3D=.TRUE., +YCHEM_NL(4)%LCOMAD=.true., +YCHEM_NL(4)%LADV=.TRUE., +YCHEM_NL(4)%LMASSFIX=.TRUE., +YCHEM_NL(4)%BETAMFBC=-999.9, +YCHEM_NL(4)%LASSIM=.FALSE., +YCHEM_NL(5)%CNAME='CO', +YCHEM_NL(5)%NREQIN=1, +YCHEM_NL(5)%RMOLMASS=28.0, +YCHEM_NL(5)%IGRBCODE=210123, +YCHEM_NL(5)%LNEGFIX=.TRUE., +YCHEM_NL(5)%IGRIBTC=210127, +YCHEM_NL(5)%IGRIBDV=221005, +YCHEM_NL(5)%HENRYA=9.7e-4, +YCHEM_NL(5)%HENRYB=1300.0, +YCHEM_NL(5)%LQM=.false., +YCHEM_NL(5)%LQM3D=.TRUE., +YCHEM_NL(5)%LCOMAD=.true., +YCHEM_NL(5)%LADV=.TRUE., +YCHEM_NL(5)%LMASSFIX=.TRUE., +YCHEM_NL(5)%BETAMFBC=-999.9, +YCHEM_NL(5)%LASSIM=.TRUE., +YCHEM_NL(5)%LADV5=.TRUE., +YCHEM_NL(6)%CNAME='HNO3', +YCHEM_NL(6)%NREQIN=1, +YCHEM_NL(6)%RMOLMASS=63.0, +YCHEM_NL(6)%IGRBCODE=217006, +YCHEM_NL(6)%LNEGFIX=.TRUE., +YCHEM_NL(6)%IGRIBTC=218006, +YCHEM_NL(6)%IGRIBDV=221006, +YCHEM_NL(6)%HENRYA=3.2e11, +YCHEM_NL(6)%HENRYB=8700.0, +YCHEM_NL(6)%LQM=.false., +YCHEM_NL(6)%LQM3D=.TRUE., +YCHEM_NL(6)%LCOMAD=.true., +YCHEM_NL(6)%LADV=.TRUE., +YCHEM_NL(6)%LMASSFIX=.TRUE., +YCHEM_NL(6)%BETAMFBC=-999.9, +YCHEM_NL(6)%LASSIM=.FALSE., +YCHEM_NL(7)%CNAME='CH3OOH', +YCHEM_NL(7)%NREQIN=1, +YCHEM_NL(7)%RMOLMASS=48.0, +YCHEM_NL(7)%IGRBCODE=217007, +YCHEM_NL(7)%LNEGFIX=.TRUE., +YCHEM_NL(7)%IGRIBTC=218007, +YCHEM_NL(7)%IGRIBDV=221007, +YCHEM_NL(7)%HENRYA=2.9e2, +YCHEM_NL(7)%HENRYB=5200.0, +YCHEM_NL(7)%LQM=.false., +YCHEM_NL(7)%LQM3D=.TRUE., +YCHEM_NL(7)%LCOMAD=.true., +YCHEM_NL(7)%LADV=.TRUE., +YCHEM_NL(7)%LMASSFIX=.TRUE., +YCHEM_NL(7)%BETAMFBC=-999.9, +YCHEM_NL(7)%LASSIM=.FALSE., +YCHEM_NL(8)%CNAME='CH2O', +YCHEM_NL(8)%NREQIN=1, +YCHEM_NL(8)%RMOLMASS=30.0, +YCHEM_NL(8)%IGRBCODE=210124, +YCHEM_NL(8)%LNEGFIX=.TRUE., +YCHEM_NL(8)%IGRIBTC=210128, +YCHEM_NL(8)%IGRIBDV=221008, +YCHEM_NL(8)%HENRYA=3.2e3, +YCHEM_NL(8)%HENRYB=6800.0, +YCHEM_NL(8)%LQM=.false., +YCHEM_NL(8)%LQM3D=.TRUE., +YCHEM_NL(8)%LCOMAD=.true., +YCHEM_NL(8)%LADV=.TRUE., +YCHEM_NL(8)%LMASSFIX=.TRUE., +YCHEM_NL(8)%BETAMFBC=-999.9, +YCHEM_NL(8)%LASSIM=.TRUE., +YCHEM_NL(8)%LADV5=.TRUE., +YCHEM_NL(9)%CNAME='PAR', +YCHEM_NL(9)%NREQIN=1, +YCHEM_NL(9)%RMOLMASS=12.0, +YCHEM_NL(9)%IGRBCODE=217009, +YCHEM_NL(9)%LNEGFIX=.TRUE., +YCHEM_NL(9)%IGRIBTC=218009, +YCHEM_NL(9)%LQM=.false., +YCHEM_NL(9)%LQM3D=.TRUE., +YCHEM_NL(9)%LCOMAD=.true., +YCHEM_NL(9)%LADV=.TRUE., +YCHEM_NL(9)%LMASSFIX=.TRUE., +YCHEM_NL(9)%BETAMFBC=-999.9, +YCHEM_NL(9)%LASSIM=.FALSE., +YCHEM_NL(10)%CNAME='C2H4', +YCHEM_NL(10)%NREQIN=1, +YCHEM_NL(10)%RMOLMASS=28.0, +YCHEM_NL(10)%IGRBCODE=217010, +YCHEM_NL(10)%LNEGFIX=.TRUE., +YCHEM_NL(10)%IGRIBTC=218010, +YCHEM_NL(10)%LQM=.false., +YCHEM_NL(10)%LQM3D=.TRUE., +YCHEM_NL(10)%LCOMAD=.true., +YCHEM_NL(10)%LADV=.TRUE., +YCHEM_NL(10)%LMASSFIX=.TRUE., +YCHEM_NL(10)%BETAMFBC=-999.9, +YCHEM_NL(10)%LASSIM=.FALSE., +YCHEM_NL(11)%CNAME='OLE', +YCHEM_NL(11)%NREQIN=1, +YCHEM_NL(11)%RMOLMASS=24.0, +YCHEM_NL(11)%IGRBCODE=217011, +YCHEM_NL(11)%LNEGFIX=.TRUE., +YCHEM_NL(11)%IGRIBTC=218011, +YCHEM_NL(11)%LQM=.false., +YCHEM_NL(11)%LQM3D=.TRUE., +YCHEM_NL(11)%LCOMAD=.true., +YCHEM_NL(11)%LADV=.TRUE., +YCHEM_NL(11)%LMASSFIX=.TRUE., +YCHEM_NL(11)%BETAMFBC=-999.9, +YCHEM_NL(11)%LASSIM=.FALSE., +YCHEM_NL(12)%CNAME='ALD2', +YCHEM_NL(12)%NREQIN=1, +YCHEM_NL(12)%RMOLMASS=24.0, +YCHEM_NL(12)%IGRBCODE=217012, +YCHEM_NL(12)%LNEGFIX=.TRUE., +YCHEM_NL(12)%IGRIBTC=218012, +YCHEM_NL(12)%IGRIBDV=221012, +YCHEM_NL(12)%HENRYA=17.0, +YCHEM_NL(12)%HENRYB=5000.0, +YCHEM_NL(12)%LQM=.false., +YCHEM_NL(12)%LQM3D=.TRUE., +YCHEM_NL(12)%LCOMAD=.true., +YCHEM_NL(12)%LADV=.TRUE., +YCHEM_NL(12)%LMASSFIX=.TRUE., +YCHEM_NL(12)%BETAMFBC=-999.9, +YCHEM_NL(12)%LASSIM=.FALSE., +YCHEM_NL(13)%CNAME='PAN', +YCHEM_NL(13)%NREQIN=1, +YCHEM_NL(13)%RMOLMASS=121.0, +YCHEM_NL(13)%IGRBCODE=217013, +YCHEM_NL(13)%LNEGFIX=.TRUE., +YCHEM_NL(13)%IGRIBTC=218013, +YCHEM_NL(13)%IGRIBDV=221013, +YCHEM_NL(13)%HENRYA=2.9e+0, +YCHEM_NL(13)%HENRYB=5700.0, +YCHEM_NL(13)%LQM=.false., +YCHEM_NL(13)%LQM3D=.TRUE., +YCHEM_NL(13)%LCOMAD=.true., +YCHEM_NL(13)%LADV=.TRUE., +YCHEM_NL(13)%LMASSFIX=.TRUE., +YCHEM_NL(13)%BETAMFBC=-999.9, +YCHEM_NL(13)%LASSIM=.FALSE., +YCHEM_NL(14)%CNAME='ROOH', +YCHEM_NL(14)%NREQIN=1, +YCHEM_NL(14)%RMOLMASS=47.0, +YCHEM_NL(14)%IGRBCODE=217014, +YCHEM_NL(14)%LNEGFIX=.TRUE., +YCHEM_NL(14)%IGRIBTC=218014, +YCHEM_NL(14)%IGRIBDV=221014, +YCHEM_NL(14)%HENRYA=340.0, +YCHEM_NL(14)%HENRYB=6000.0, +YCHEM_NL(14)%LQM=.false., +YCHEM_NL(14)%LQM3D=.TRUE., +YCHEM_NL(14)%LCOMAD=.true., +YCHEM_NL(14)%LADV=.TRUE., +YCHEM_NL(14)%LMASSFIX=.TRUE., +YCHEM_NL(14)%BETAMFBC=-999.9, +YCHEM_NL(14)%LASSIM=.FALSE., +YCHEM_NL(15)%CNAME='ONIT', +YCHEM_NL(15)%NREQIN=1, +YCHEM_NL(15)%RMOLMASS=77.0, +YCHEM_NL(15)%IGRBCODE=217015, +YCHEM_NL(15)%LNEGFIX=.TRUE., +YCHEM_NL(15)%IGRIBTC=218015, +YCHEM_NL(15)%IGRIBDV=221015, +YCHEM_NL(15)%HENRYA=1.0e3, +YCHEM_NL(15)%HENRYB=6485., +YCHEM_NL(15)%LQM=.false., +YCHEM_NL(15)%LQM3D=.TRUE., +YCHEM_NL(15)%LCOMAD=.true., +YCHEM_NL(15)%LADV=.TRUE., +YCHEM_NL(15)%LMASSFIX=.TRUE., +YCHEM_NL(15)%BETAMFBC=-999.9, +YCHEM_NL(15)%LASSIM=.FALSE., +YCHEM_NL(16)%CNAME='C5H8', +YCHEM_NL(16)%NREQIN=1, +YCHEM_NL(16)%RMOLMASS=68.1, +YCHEM_NL(16)%IGRBCODE=217016, +YCHEM_NL(16)%LNEGFIX=.TRUE., +YCHEM_NL(16)%IGRIBTC=218016, +YCHEM_NL(16)%IGRIBDV=221016, +YCHEM_NL(16)%HENRYA=1.3e-2, +YCHEM_NL(16)%HENRYB=0.0, +YCHEM_NL(16)%LQM=.false., +YCHEM_NL(16)%LQM3D=.TRUE., +YCHEM_NL(16)%LCOMAD=.true., +YCHEM_NL(16)%LADV=.TRUE., +YCHEM_NL(16)%LMASSFIX=.TRUE., +YCHEM_NL(16)%BETAMFBC=-999.9, +YCHEM_NL(16)%LASSIM=.FALSE., +YCHEM_NL(17)%CNAME='SO2', +YCHEM_NL(17)%NREQIN=1, +YCHEM_NL(17)%RMOLMASS=64.1, +YCHEM_NL(17)%IGRBCODE=210122, +YCHEM_NL(17)%LNEGFIX=.TRUE., +YCHEM_NL(17)%IGRIBTC=210126, +YCHEM_NL(17)%IGRIBDV=221017, +YCHEM_NL(17)%HENRYA=1.0e5, +YCHEM_NL(17)%HENRYB=3000.0, +YCHEM_NL(17)%LQM=.false., +YCHEM_NL(17)%LQM3D=.TRUE., +YCHEM_NL(17)%LCOMAD=.true., +YCHEM_NL(17)%LADV=.TRUE., +YCHEM_NL(17)%LMASSFIX=.TRUE., +YCHEM_NL(17)%BETAMFBC=-999.9, +YCHEM_NL(17)%LASSIM=.TRUE., +YCHEM_NL(17)%LADV5=.TRUE., +YCHEM_NL(18)%CNAME='DMS', +YCHEM_NL(18)%NREQIN=1, +YCHEM_NL(18)%RMOLMASS=62.1, +YCHEM_NL(18)%IGRBCODE=217018, +YCHEM_NL(18)%LNEGFIX=.TRUE., +YCHEM_NL(18)%IGRIBTC=218018, +YCHEM_NL(18)%LQM=.false., +YCHEM_NL(18)%LQM3D=.TRUE., +YCHEM_NL(18)%LCOMAD=.true., +YCHEM_NL(18)%LADV=.TRUE., +YCHEM_NL(18)%LMASSFIX=.TRUE., +YCHEM_NL(18)%BETAMFBC=-999.9, +YCHEM_NL(18)%LASSIM=.FALSE., +YCHEM_NL(19)%CNAME='NH3', +YCHEM_NL(19)%NREQIN=1, +YCHEM_NL(19)%RMOLMASS=17.0, +YCHEM_NL(19)%IGRBCODE=217019, +YCHEM_NL(19)%LNEGFIX=.TRUE., +YCHEM_NL(19)%IGRIBTC=218019, +YCHEM_NL(19)%IGRIBDV=221019, +YCHEM_NL(19)%HENRYA=59.0, +YCHEM_NL(19)%HENRYB=4200.0, +YCHEM_NL(19)%LQM=.false., +YCHEM_NL(19)%LQM3D=.TRUE., +YCHEM_NL(19)%LCOMAD=.true., +YCHEM_NL(19)%LADV=.TRUE., +YCHEM_NL(19)%LMASSFIX=.TRUE., +YCHEM_NL(19)%BETAMFBC=-999.9, +YCHEM_NL(19)%LASSIM=.FALSE., +YCHEM_NL(20)%CNAME='SO4', +YCHEM_NL(20)%NREQIN=-1, +YCHEM_NL(20)%RMOLMASS=96.1, +YCHEM_NL(20)%IGRBCODE=217020, +YCHEM_NL(20)%LNEGFIX=.TRUE., +YCHEM_NL(20)%IGRIBTC=218020, +YCHEM_NL(20)%IGRIBDV=221020, +YCHEM_NL(20)%HENRYA=3.2e11, +YCHEM_NL(20)%HENRYB=8700.0, +YCHEM_NL(20)%LQM=.false., +YCHEM_NL(20)%LQM3D=.TRUE., +YCHEM_NL(20)%LCOMAD=.true., +YCHEM_NL(20)%LADV=.TRUE., +YCHEM_NL(20)%LMASSFIX=.TRUE., +YCHEM_NL(20)%BETAMFBC=-999.9, +YCHEM_NL(20)%LASSIM=.FALSE., +YCHEM_NL(21)%CNAME='NH4', +YCHEM_NL(21)%NREQIN=1, +YCHEM_NL(21)%RMOLMASS=18.0, +YCHEM_NL(21)%IGRBCODE=217021, +YCHEM_NL(21)%LNEGFIX=.TRUE., +YCHEM_NL(21)%IGRIBTC=218021, +YCHEM_NL(21)%IGRIBDV=221021, +YCHEM_NL(21)%HENRYA=3.2e11, +YCHEM_NL(21)%HENRYB=8700.0, +YCHEM_NL(21)%LQM=.false., +YCHEM_NL(21)%LQM3D=.TRUE., +YCHEM_NL(21)%LCOMAD=.true., +YCHEM_NL(21)%LADV=.TRUE., +YCHEM_NL(21)%LMASSFIX=.TRUE., +YCHEM_NL(21)%BETAMFBC=-999.9, +YCHEM_NL(21)%LASSIM=.FALSE., +YCHEM_NL(22)%CNAME='MSA', +YCHEM_NL(22)%NREQIN=1, +YCHEM_NL(22)%RMOLMASS=96.1, +YCHEM_NL(22)%IGRBCODE=217022, +YCHEM_NL(22)%LNEGFIX=.TRUE., +YCHEM_NL(22)%IGRIBTC=218022, +YCHEM_NL(22)%HENRYA=3.2e11, +YCHEM_NL(22)%HENRYB=8700.0, +YCHEM_NL(22)%LQM=.false., +YCHEM_NL(22)%LQM3D=.TRUE., +YCHEM_NL(22)%LCOMAD=.true., +YCHEM_NL(22)%LADV=.TRUE., +YCHEM_NL(22)%LMASSFIX=.TRUE., +YCHEM_NL(22)%BETAMFBC=-999.9, +YCHEM_NL(22)%LASSIM=.FALSE., +YCHEM_NL(23)%CNAME='CH3COCHO', +YCHEM_NL(23)%NREQIN=1, +YCHEM_NL(23)%RMOLMASS=72.1, +YCHEM_NL(23)%IGRBCODE=217023, +YCHEM_NL(23)%LNEGFIX=.TRUE., +YCHEM_NL(23)%IGRIBTC=218023, +YCHEM_NL(23)%IGRIBDV=221023, +YCHEM_NL(23)%HENRYA=3.4e3, +YCHEM_NL(23)%HENRYB=7500.0, +YCHEM_NL(23)%LQM=.false., +YCHEM_NL(23)%LQM3D=.TRUE., +YCHEM_NL(23)%LCOMAD=.true., +YCHEM_NL(23)%LADV=.TRUE., +YCHEM_NL(23)%LMASSFIX=.TRUE., +YCHEM_NL(23)%BETAMFBC=-999.9, +YCHEM_NL(23)%LASSIM=.FALSE., +YCHEM_NL(24)%CNAME='O3S', +YCHEM_NL(24)%NREQIN=1, +YCHEM_NL(24)%RMOLMASS=48.0, +YCHEM_NL(24)%IGRBCODE=217024, +YCHEM_NL(24)%LNEGFIX=.TRUE., +YCHEM_NL(24)%IGRIBTC=218024, +YCHEM_NL(24)%IGRIBDV=221024, +YCHEM_NL(24)%HENRYA=1.0e-2, +YCHEM_NL(24)%HENRYB=2800.0, +YCHEM_NL(24)%LQM=.false., +YCHEM_NL(24)%LQM3D=.TRUE., +YCHEM_NL(24)%LCOMAD=.true., +YCHEM_NL(24)%LADV=.TRUE., +YCHEM_NL(24)%LMASSFIX=.TRUE., +YCHEM_NL(24)%BETAMFBC=-999.9, +YCHEM_NL(24)%LASSIM=.FALSE., +YCHEM_NL(25)%CNAME='Rn', +YCHEM_NL(25)%NREQIN=1, +YCHEM_NL(25)%RMOLMASS=222.0, +YCHEM_NL(25)%IGRBCODE=210181, +YCHEM_NL(25)%LNEGFIX=.TRUE., +YCHEM_NL(25)%IGRIBTC=210183, +YCHEM_NL(25)%LQM=.false., +YCHEM_NL(25)%LQM3D=.TRUE., +YCHEM_NL(25)%LCOMAD=.true., +YCHEM_NL(25)%LADV=.TRUE., +YCHEM_NL(25)%LMASSFIX=.TRUE., +YCHEM_NL(25)%BETAMFBC=-999.9, +YCHEM_NL(25)%LASSIM=.FALSE., +YCHEM_NL(26)%CNAME='Pb', +YCHEM_NL(26)%NREQIN=1, +YCHEM_NL(26)%RMOLMASS=210.0, +YCHEM_NL(26)%IGRBCODE=217026, +YCHEM_NL(26)%LNEGFIX=.TRUE., +YCHEM_NL(26)%IGRIBTC=218026, +YCHEM_NL(26)%HENRYA=3.2e11, +YCHEM_NL(26)%HENRYB=8700.0, +YCHEM_NL(26)%LQM=.false., +YCHEM_NL(26)%LQM3D=.TRUE., +YCHEM_NL(26)%LCOMAD=.true., +YCHEM_NL(26)%LADV=.TRUE., +YCHEM_NL(26)%LMASSFIX=.TRUE., +YCHEM_NL(26)%BETAMFBC=-999.9, +YCHEM_NL(26)%LASSIM=.FALSE., +YCHEM_NL(27)%CNAME='NO', +YCHEM_NL(27)%NREQIN=1, +YCHEM_NL(27)%RMOLMASS=30.0, +YCHEM_NL(27)%IGRBCODE=217027, +YCHEM_NL(27)%LNEGFIX=.TRUE., +YCHEM_NL(27)%IGRIBTC=218027, +YCHEM_NL(27)%IGRIBDV=221027, +YCHEM_NL(27)%HENRYA=1.9e-3, +YCHEM_NL(27)%HENRYB=1600.0, +YCHEM_NL(27)%LQM=.false., +YCHEM_NL(27)%LQM3D=.TRUE., +YCHEM_NL(27)%LCOMAD=.true., +YCHEM_NL(27)%LADV=.TRUE., +YCHEM_NL(27)%LMASSFIX=.FALSE., +YCHEM_NL(27)%LASSIM=.FALSE., +YCHEM_NL(27)%LADV5=.TRUE., +YCHEM_NL(28)%CNAME='HO2', +YCHEM_NL(28)%NREQIN=1, +YCHEM_NL(28)%RMOLMASS=33.0, +YCHEM_NL(28)%IGRBCODE=217028, +YCHEM_NL(28)%LNEGFIX=.TRUE., +YCHEM_NL(28)%IGRIBTC=218028, +YCHEM_NL(28)%IGRIBDV=221028, +YCHEM_NL(28)%HENRYA=6.8e2, +YCHEM_NL(28)%HENRYB=0.0, +YCHEM_NL(28)%LQM=.false., +YCHEM_NL(28)%LQM3D=.TRUE., +YCHEM_NL(28)%LCOMAD=.true., +YCHEM_NL(28)%LADV=.FALSE., +YCHEM_NL(28)%LMASSFIX=.FALSE., +YCHEM_NL(28)%LMASSFIX=.FALSE., +YCHEM_NL(28)%LASSIM=.FALSE., +YCHEM_NL(29)%CNAME='CH3O2', +YCHEM_NL(29)%NREQIN=1, +YCHEM_NL(29)%RMOLMASS=47.0, +YCHEM_NL(29)%IGRBCODE=217029, +YCHEM_NL(29)%LNEGFIX=.TRUE., +YCHEM_NL(29)%IGRIBTC=218029, +YCHEM_NL(29)%IGRIBDV=221029, +YCHEM_NL(29)%HENRYA=1.5e1, +YCHEM_NL(29)%HENRYB=3700.0, +YCHEM_NL(29)%LQM=.false., +YCHEM_NL(29)%LQM3D=.TRUE., +YCHEM_NL(29)%LCOMAD=.true., +YCHEM_NL(29)%LADV=.FALSE., +YCHEM_NL(29)%LMASSFIX=.FALSE., +YCHEM_NL(29)%LMASSFIX=.FALSE., +YCHEM_NL(29)%LASSIM=.FALSE., +YCHEM_NL(30)%CNAME='OH', +YCHEM_NL(30)%NREQIN=1, +YCHEM_NL(30)%RMOLMASS=17.0, +YCHEM_NL(30)%IGRBCODE=217030, +YCHEM_NL(30)%LNEGFIX=.TRUE., +YCHEM_NL(30)%IGRIBTC=218030, +YCHEM_NL(30)%LQM=.false., +YCHEM_NL(30)%LQM3D=.TRUE., +YCHEM_NL(30)%LCOMAD=.true., +YCHEM_NL(30)%LADV=.FALSE., +YCHEM_NL(30)%LMASSFIX=.FALSE., +YCHEM_NL(30)%LMASSFIX=.FALSE., +YCHEM_NL(30)%LASSIM=.FALSE., +YCHEM_NL(30)%LADV5=.TRUE., +YCHEM_NL(31)%CNAME='NO2', +YCHEM_NL(31)%NREQIN=1, +YCHEM_NL(31)%RMOLMASS=46.0, +YCHEM_NL(31)%IGRBCODE=210121, +YCHEM_NL(31)%LNEGFIX=.TRUE., +YCHEM_NL(31)%IGRIBTC=210125, +YCHEM_NL(31)%IGRIBDV=221031, +YCHEM_NL(31)%HENRYA=1.2e-2, +YCHEM_NL(31)%HENRYB=2400.0, +YCHEM_NL(31)%LQM=.false., +YCHEM_NL(31)%LQM3D=.TRUE., +YCHEM_NL(31)%LCOMAD=.true., +YCHEM_NL(31)%LADV=.TRUE., +YCHEM_NL(31)%LMASSFIX=.FALSE., +YCHEM_NL(31)%LASSIM=.TRUE., +YCHEM_NL(31)%LADV5=.TRUE., +YCHEM_NL(32)%CNAME='NO3', +YCHEM_NL(32)%NREQIN=1, +YCHEM_NL(32)%RMOLMASS=62.0, +YCHEM_NL(32)%IGRBCODE=217032, +YCHEM_NL(32)%LNEGFIX=.TRUE., +YCHEM_NL(32)%IGRIBTC=218032, +YCHEM_NL(32)%IGRIBDV=221032, +YCHEM_NL(32)%HENRYA=3.8e-2, +YCHEM_NL(32)%HENRYB=0., +YCHEM_NL(32)%LQM=.false., +YCHEM_NL(32)%LQM3D=.TRUE., +YCHEM_NL(32)%LCOMAD=.true., +YCHEM_NL(32)%LADV=.TRUE., +YCHEM_NL(32)%LMASSFIX=.FALSE., +YCHEM_NL(32)%LASSIM=.FALSE., +YCHEM_NL(33)%CNAME='N2O5', +YCHEM_NL(33)%NREQIN=1, +YCHEM_NL(33)%RMOLMASS=108.0, +YCHEM_NL(33)%IGRBCODE=217033, +YCHEM_NL(33)%LNEGFIX=.TRUE., +YCHEM_NL(33)%IGRIBTC=218033, +YCHEM_NL(33)%IGRIBDV=221033, +YCHEM_NL(33)%HENRYA=2.1e+1, +YCHEM_NL(33)%HENRYB=3400.0, +YCHEM_NL(33)%LQM=.false., +YCHEM_NL(33)%LQM3D=.TRUE., +YCHEM_NL(33)%LCOMAD=.true., +YCHEM_NL(33)%LADV=.TRUE., +YCHEM_NL(33)%LMASSFIX=.TRUE., +YCHEM_NL(33)%BETAMFBC=-999.9, +YCHEM_NL(33)%LASSIM=.FALSE., +YCHEM_NL(34)%CNAME='HO2NO2', +YCHEM_NL(34)%NREQIN=1, +YCHEM_NL(34)%RMOLMASS=79.0, +YCHEM_NL(34)%IGRBCODE=217034, +YCHEM_NL(34)%LNEGFIX=.TRUE., +YCHEM_NL(34)%IGRIBTC=218034, +YCHEM_NL(34)%IGRIBDV=221034, +YCHEM_NL(34)%HENRYA=1.2e+4, +YCHEM_NL(34)%HENRYB=6900.0, +YCHEM_NL(34)%LQM=.false., +YCHEM_NL(34)%LQM3D=.TRUE., +YCHEM_NL(34)%LCOMAD=.true., +YCHEM_NL(34)%LADV=.TRUE., +YCHEM_NL(34)%LMASSFIX=.TRUE., +YCHEM_NL(34)%BETAMFBC=-999.9, +YCHEM_NL(34)%LASSIM=.FALSE., +YCHEM_NL(35)%CNAME='C2O3', +YCHEM_NL(35)%NREQIN=1, +YCHEM_NL(35)%RMOLMASS=75.0, +YCHEM_NL(35)%IGRBCODE=217035, +YCHEM_NL(35)%LNEGFIX=.TRUE., +YCHEM_NL(35)%IGRIBTC=218035, +YCHEM_NL(35)%LQM=.false., +YCHEM_NL(35)%LQM3D=.TRUE., +YCHEM_NL(35)%LCOMAD=.true., +YCHEM_NL(35)%LADV=.FALSE., +YCHEM_NL(35)%LMASSFIX=.FALSE., +YCHEM_NL(35)%LMASSFIX=.FALSE., +YCHEM_NL(35)%LASSIM=.FALSE., +YCHEM_NL(36)%CNAME='ROR', +YCHEM_NL(36)%NREQIN=1, +YCHEM_NL(36)%RMOLMASS=28.0, +YCHEM_NL(36)%IGRBCODE=217036, +YCHEM_NL(36)%LNEGFIX=.TRUE., +YCHEM_NL(36)%IGRIBTC=218036, +YCHEM_NL(36)%LQM=.false., +YCHEM_NL(36)%LQM3D=.TRUE., +YCHEM_NL(36)%LCOMAD=.true., +YCHEM_NL(36)%LADV=.FALSE., +YCHEM_NL(36)%LMASSFIX=.FALSE., +YCHEM_NL(36)%LMASSFIX=.FALSE., +YCHEM_NL(36)%LASSIM=.FALSE., +YCHEM_NL(37)%CNAME='RXPAR', +YCHEM_NL(37)%NREQIN=1, +YCHEM_NL(37)%RMOLMASS=12.0, +YCHEM_NL(37)%IGRBCODE=217037, +YCHEM_NL(37)%LNEGFIX=.TRUE., +YCHEM_NL(37)%IGRIBTC=218037, +YCHEM_NL(37)%LQM=.false., +YCHEM_NL(37)%LQM3D=.TRUE., +YCHEM_NL(37)%LCOMAD=.true., +YCHEM_NL(37)%LADV=.FALSE., +YCHEM_NL(37)%LMASSFIX=.FALSE., +YCHEM_NL(37)%LMASSFIX=.FALSE., +YCHEM_NL(37)%LASSIM=.FALSE., +YCHEM_NL(38)%CNAME='XO2', +YCHEM_NL(38)%NREQIN=1, +YCHEM_NL(38)%RMOLMASS=44.0, +YCHEM_NL(38)%IGRBCODE=217038, +YCHEM_NL(38)%LNEGFIX=.TRUE., +YCHEM_NL(38)%IGRIBTC=218038, +YCHEM_NL(38)%LQM=.false., +YCHEM_NL(38)%LQM3D=.TRUE., +YCHEM_NL(38)%LCOMAD=.true., +YCHEM_NL(38)%LADV=.FALSE., +YCHEM_NL(38)%LMASSFIX=.FALSE., +YCHEM_NL(38)%LMASSFIX=.FALSE., +YCHEM_NL(38)%LASSIM=.FALSE., +YCHEM_NL(39)%CNAME='XO2N', +YCHEM_NL(39)%NREQIN=1, +YCHEM_NL(39)%RMOLMASS=44.0, +YCHEM_NL(39)%IGRBCODE=217039, +YCHEM_NL(39)%LNEGFIX=.TRUE., +YCHEM_NL(39)%IGRIBTC=218039, +YCHEM_NL(39)%LQM=.false., +YCHEM_NL(39)%LQM3D=.TRUE., +YCHEM_NL(39)%LCOMAD=.true., +YCHEM_NL(39)%LADV=.FALSE., +YCHEM_NL(39)%LMASSFIX=.FALSE., +YCHEM_NL(39)%LMASSFIX=.FALSE., +YCHEM_NL(39)%LASSIM=.FALSE., +YCHEM_NL(40)%CNAME='NH2', +YCHEM_NL(40)%NREQIN=1, +YCHEM_NL(40)%RMOLMASS=16.0, +YCHEM_NL(40)%IGRBCODE=217040, +YCHEM_NL(40)%LNEGFIX=.TRUE., +YCHEM_NL(40)%IGRIBTC=218040, +YCHEM_NL(40)%LQM=.false., +YCHEM_NL(40)%LQM3D=.TRUE., +YCHEM_NL(40)%LCOMAD=.true., +YCHEM_NL(40)%LADV=.FALSE., +YCHEM_NL(40)%LMASSFIX=.FALSE., +YCHEM_NL(40)%LMASSFIX=.FALSE., +YCHEM_NL(40)%LASSIM=.FALSE., +YCHEM_NL(41)%CNAME='PSC', +YCHEM_NL(41)%NREQIN=0, +YCHEM_NL(41)%RMOLMASS=1.0, +YCHEM_NL(41)%IGRBCODE=217041, +YCHEM_NL(41)%LNEGFIX=.TRUE., +YCHEM_NL(41)%IGRIBTC=218041, +YCHEM_NL(41)%LQM=.false., +YCHEM_NL(41)%LQM3D=.TRUE., +YCHEM_NL(41)%LCOMAD=.true., +YCHEM_NL(41)%LADV=.TRUE., +YCHEM_NL(41)%LMASSFIX=.FALSE., +YCHEM_NL(41)%REFVALI=0.0, +YCHEM_NL(41)%NREQIN=-1, +YCHEM_NL(41)%LASSIM=.FALSE., +YCHEM_NL(42)%CNAME='CH3OH', +YCHEM_NL(42)%NREQIN=1, +YCHEM_NL(42)%RMOLMASS=31.01, +YCHEM_NL(42)%IGRBCODE=217042, +YCHEM_NL(42)%LNEGFIX=.TRUE., +YCHEM_NL(42)%IGRIBTC=218042, +YCHEM_NL(42)%IGRIBDV=221042, +YCHEM_NL(42)%HENRYA=200.0, +YCHEM_NL(42)%HENRYB=5600.0, +YCHEM_NL(42)%LQM=.false., +YCHEM_NL(42)%LQM3D=.TRUE., +YCHEM_NL(42)%LCOMAD=.true., +YCHEM_NL(42)%LADV=.TRUE., +YCHEM_NL(42)%LMASSFIX=.TRUE., +YCHEM_NL(42)%BETAMFBC=-999.9, +YCHEM_NL(42)%LASSIM=.FALSE., +YCHEM_NL(43)%CNAME='HCOOH', +YCHEM_NL(43)%NREQIN=1, +YCHEM_NL(43)%RMOLMASS=46.01, +YCHEM_NL(43)%IGRBCODE=217043, +YCHEM_NL(43)%LNEGFIX=.TRUE., +YCHEM_NL(43)%IGRIBTC=218043, +YCHEM_NL(43)%IGRIBDV=221043, +YCHEM_NL(43)%HENRYA=8.8e3, +YCHEM_NL(43)%HENRYB=6100.0, +YCHEM_NL(43)%LQM=.false., +YCHEM_NL(43)%LQM3D=.TRUE., +YCHEM_NL(43)%LCOMAD=.true., +YCHEM_NL(43)%LADV=.TRUE., +YCHEM_NL(43)%LMASSFIX=.TRUE., +YCHEM_NL(43)%BETAMFBC=-999.9, +YCHEM_NL(43)%LASSIM=.FALSE., +YCHEM_NL(44)%CNAME='MCOOH', +YCHEM_NL(44)%NREQIN=1, +YCHEM_NL(44)%RMOLMASS=62.02, +YCHEM_NL(44)%IGRBCODE=217044, +YCHEM_NL(44)%LNEGFIX=.TRUE., +YCHEM_NL(44)%IGRIBTC=218044, +YCHEM_NL(44)%IGRIBDV=221044, +YCHEM_NL(44)%HENRYA=4.1e3, +YCHEM_NL(44)%HENRYB=6300.0, +YCHEM_NL(44)%LQM=.false., +YCHEM_NL(44)%LQM3D=.TRUE., +YCHEM_NL(44)%LCOMAD=.true., +YCHEM_NL(44)%LADV=.TRUE., +YCHEM_NL(44)%LMASSFIX=.TRUE., +YCHEM_NL(44)%BETAMFBC=-999.9, +YCHEM_NL(44)%LASSIM=.FALSE., +YCHEM_NL(45)%CNAME='C2H6', +YCHEM_NL(45)%NREQIN=1, +YCHEM_NL(45)%RMOLMASS=30.02, +YCHEM_NL(45)%IGRBCODE=217045, +YCHEM_NL(45)%LNEGFIX=.TRUE., +YCHEM_NL(45)%IGRIBTC=218045, +YCHEM_NL(45)%IGRIBDV=221045, +YCHEM_NL(45)%HENRYA=1.9e-3, +YCHEM_NL(45)%HENRYB=2400.0, +YCHEM_NL(45)%LQM=.false., +YCHEM_NL(45)%LQM3D=.TRUE., +YCHEM_NL(45)%LCOMAD=.true., +YCHEM_NL(45)%LADV=.TRUE., +YCHEM_NL(45)%LMASSFIX=.TRUE., +YCHEM_NL(45)%BETAMFBC=-999.9, +YCHEM_NL(45)%LASSIM=.FALSE., +YCHEM_NL(46)%CNAME='C2H5OH', +YCHEM_NL(46)%NREQIN=1, +YCHEM_NL(46)%RMOLMASS=46.02, +YCHEM_NL(46)%IGRBCODE=217046, +YCHEM_NL(46)%LNEGFIX=.TRUE., +YCHEM_NL(46)%IGRIBTC=218046, +YCHEM_NL(46)%IGRIBDV=221046, +YCHEM_NL(46)%HENRYA=190.0, +YCHEM_NL(46)%HENRYB=6400.0, +YCHEM_NL(46)%LQM=.false., +YCHEM_NL(46)%LQM3D=.TRUE., +YCHEM_NL(46)%LCOMAD=.true., +YCHEM_NL(46)%LADV=.TRUE., +YCHEM_NL(46)%LMASSFIX=.TRUE., +YCHEM_NL(46)%BETAMFBC=-999.9, +YCHEM_NL(46)%LASSIM=.FALSE., +YCHEM_NL(47)%CNAME='C3H8', +YCHEM_NL(47)%NREQIN=1, +YCHEM_NL(47)%RMOLMASS=44.03, +YCHEM_NL(47)%IGRBCODE=217047, +YCHEM_NL(47)%LNEGFIX=.TRUE., +YCHEM_NL(47)%IGRIBTC=218047, +YCHEM_NL(47)%LQM=.false., +YCHEM_NL(47)%LQM3D=.TRUE., +YCHEM_NL(47)%LCOMAD=.true., +YCHEM_NL(47)%LADV=.TRUE., +YCHEM_NL(47)%LMASSFIX=.TRUE., +YCHEM_NL(47)%BETAMFBC=-999.9, +YCHEM_NL(47)%LASSIM=.FALSE., +YCHEM_NL(48)%CNAME='C3H6', +YCHEM_NL(48)%NREQIN=1, +YCHEM_NL(48)%RMOLMASS=42.03, +YCHEM_NL(48)%IGRBCODE=217048, +YCHEM_NL(48)%LNEGFIX=.TRUE., +YCHEM_NL(48)%IGRIBTC=218048, +YCHEM_NL(48)%LQM=.false., +YCHEM_NL(48)%LQM3D=.TRUE., +YCHEM_NL(48)%LCOMAD=.true., +YCHEM_NL(48)%LADV=.TRUE., +YCHEM_NL(48)%LMASSFIX=.TRUE., +YCHEM_NL(48)%BETAMFBC=-999.9, +YCHEM_NL(48)%LASSIM=.FALSE., +YCHEM_NL(49)%CNAME='C10H16', +YCHEM_NL(49)%NREQIN=1, +YCHEM_NL(49)%RMOLMASS=136.0, +YCHEM_NL(49)%IGRBCODE=217049, +YCHEM_NL(49)%LNEGFIX=.TRUE., +YCHEM_NL(49)%IGRIBTC=218049, +YCHEM_NL(49)%LQM=.false., +YCHEM_NL(49)%LQM3D=.TRUE., +YCHEM_NL(49)%LCOMAD=.true., +YCHEM_NL(49)%LADV=.TRUE., +YCHEM_NL(49)%LMASSFIX=.TRUE., +YCHEM_NL(49)%BETAMFBC=-999.9, +YCHEM_NL(49)%LASSIM=.FALSE., +YCHEM_NL(50)%CNAME='ISPD', +YCHEM_NL(50)%NREQIN=1, +YCHEM_NL(50)%RMOLMASS=70.0, +YCHEM_NL(50)%IGRBCODE=217050, +YCHEM_NL(50)%LNEGFIX=.TRUE., +YCHEM_NL(50)%IGRIBTC=218050, +YCHEM_NL(50)%IGRIBDV=221050, +YCHEM_NL(50)%HENRYA=4.3, +YCHEM_NL(50)%HENRYB=5300.0, +YCHEM_NL(50)%LQM=.false., +YCHEM_NL(50)%LQM3D=.TRUE., +YCHEM_NL(50)%LCOMAD=.true., +YCHEM_NL(50)%LADV=.TRUE., +YCHEM_NL(50)%LMASSFIX=.TRUE., +YCHEM_NL(50)%BETAMFBC=-999.9, +YCHEM_NL(50)%LASSIM=.FALSE., +YCHEM_NL(51)%CNAME='NO3_A', +YCHEM_NL(51)%NREQIN=1, +YCHEM_NL(51)%RMOLMASS=62.0, +YCHEM_NL(51)%IGRBCODE=217051, +YCHEM_NL(51)%LNEGFIX=.TRUE., +YCHEM_NL(51)%IGRIBTC=218051, +YCHEM_NL(51)%IGRIBDV=221051, +YCHEM_NL(51)%HENRYA=3.2e11, +YCHEM_NL(51)%HENRYB=8700.0, +YCHEM_NL(51)%LQM=.false., +YCHEM_NL(51)%LQM3D=.TRUE., +YCHEM_NL(51)%LCOMAD=.true., +YCHEM_NL(51)%LADV=.TRUE., +YCHEM_NL(51)%LMASSFIX=.TRUE., +YCHEM_NL(51)%BETAMFBC=-999.9, +YCHEM_NL(51)%LASSIM=.FALSE., +YCHEM_NL(52)%CNAME='CH3COCH3', +YCHEM_NL(52)%NREQIN=1, +YCHEM_NL(52)%RMOLMASS=58.0, +YCHEM_NL(52)%IGRBCODE=217052, +YCHEM_NL(52)%LNEGFIX=.TRUE., +YCHEM_NL(52)%IGRIBTC=218052, +YCHEM_NL(52)%IGRIBDV=221052, +YCHEM_NL(52)%HENRYA=27.0, +YCHEM_NL(52)%HENRYB=5500.0, +YCHEM_NL(52)%LQM=.false., +YCHEM_NL(52)%LQM3D=.TRUE., +YCHEM_NL(52)%LCOMAD=.true., +YCHEM_NL(52)%LADV=.TRUE., +YCHEM_NL(52)%LMASSFIX=.TRUE., +YCHEM_NL(52)%BETAMFBC=-999.9, +YCHEM_NL(52)%LASSIM=.FALSE., +YCHEM_NL(53)%CNAME='ACO2', +YCHEM_NL(53)%NREQIN=1, +YCHEM_NL(53)%RMOLMASS=58.0, +YCHEM_NL(53)%IGRBCODE=217053, +YCHEM_NL(53)%LNEGFIX=.TRUE., +YCHEM_NL(53)%IGRIBTC=218053, +YCHEM_NL(53)%LQM=.false., +YCHEM_NL(53)%LQM3D=.TRUE., +YCHEM_NL(53)%LCOMAD=.true., +YCHEM_NL(53)%LADV=.FALSE., +YCHEM_NL(53)%LMASSFIX=.FALSE., +YCHEM_NL(53)%LMASSFIX=.FALSE., +YCHEM_NL(53)%LASSIM=.FALSE., +YCHEM_NL(54)%CNAME='IC3H7O2', +YCHEM_NL(54)%NREQIN=1, +YCHEM_NL(54)%RMOLMASS=75.0, +YCHEM_NL(54)%IGRBCODE=217054, +YCHEM_NL(54)%LNEGFIX=.TRUE., +YCHEM_NL(54)%IGRIBTC=218054, +YCHEM_NL(54)%LQM=.false., +YCHEM_NL(54)%LQM3D=.TRUE., +YCHEM_NL(54)%LCOMAD=.true., +YCHEM_NL(54)%LADV=.FALSE., +YCHEM_NL(54)%LMASSFIX=.FALSE., +YCHEM_NL(54)%LMASSFIX=.FALSE., +YCHEM_NL(54)%LASSIM=.FALSE., +YCHEM_NL(55)%CNAME='HYPROPO2', +YCHEM_NL(55)%NREQIN=1, +YCHEM_NL(55)%RMOLMASS=91.0, +YCHEM_NL(55)%IGRBCODE=217055, +YCHEM_NL(55)%LNEGFIX=.TRUE., +YCHEM_NL(55)%IGRIBTC=218055, +YCHEM_NL(55)%LQM=.false., +YCHEM_NL(55)%LQM3D=.TRUE., +YCHEM_NL(55)%LCOMAD=.true., +YCHEM_NL(55)%LADV=.FALSE., +YCHEM_NL(55)%LMASSFIX=.FALSE., +YCHEM_NL(55)%LMASSFIX=.FALSE., +YCHEM_NL(55)%LASSIM=.FALSE., +YCHEM_NL(56)%CNAME='SO3', +YCHEM_NL(56)%NREQIN=1, +YCHEM_NL(56)%RMOLMASS=80.0, +YCHEM_NL(56)%IGRBCODE=217189, +YCHEM_NL(56)%LNEGFIX=.TRUE., +YCHEM_NL(56)%IGRIBTC=218189, +YCHEM_NL(56)%LQM=.false., +YCHEM_NL(56)%LQM3D=.TRUE., +YCHEM_NL(56)%LCOMAD=.true., +YCHEM_NL(56)%LADV=.TRUE., +YCHEM_NL(56)%LMASSFIX=.TRUE., +YCHEM_NL(56)%BETAMFBC=-999.9, +YCHEM_NL(56)%LASSIM=.FALSE., +YCHEM_NL(57)%CNAME='CH3O2NO2', +YCHEM_NL(57)%NREQIN=1, +YCHEM_NL(57)%RMOLMASS=93.0, +YCHEM_NL(57)%IGRBCODE=217225, +YCHEM_NL(57)%LNEGFIX=.TRUE., +YCHEM_NL(57)%IGRIBTC=218225, +YCHEM_NL(57)%LQM=.false., +YCHEM_NL(57)%LQM3D=.TRUE., +YCHEM_NL(57)%LCOMAD=.true., +YCHEM_NL(57)%LADV=.TRUE., +YCHEM_NL(57)%LMASSFIX=.TRUE., +YCHEM_NL(57)%BETAMFBC=-999.9, +YCHEM_NL(57)%LASSIM=.FALSE., +YCHEM_NL(58)%CNAME='HONO', +YCHEM_NL(58)%NREQIN=1, +YCHEM_NL(58)%RMOLMASS=47.0, +YCHEM_NL(58)%IGRBCODE=217086, +YCHEM_NL(58)%LNEGFIX=.TRUE., +YCHEM_NL(58)%IGRIBTC=218086, +YCHEM_NL(58)%IGRIBDV=221086, +YCHEM_NL(58)%HENRYA=4.8e+1, +YCHEM_NL(58)%HENRYB=4800.0, +YCHEM_NL(58)%LQM=.false., +YCHEM_NL(58)%LQM3D=.TRUE., +YCHEM_NL(58)%LCOMAD=.true., +YCHEM_NL(58)%LADV=.TRUE., +YCHEM_NL(58)%LMASSFIX=.TRUE., +YCHEM_NL(58)%BETAMFBC=-999.9, +YCHEM_NL(58)%LASSIM=.FALSE., +YCHEM_NL(59)%CNAME='HCN', +YCHEM_NL(59)%NREQIN=1, +YCHEM_NL(59)%RMOLMASS=27.0, +YCHEM_NL(59)%IGRBCODE=217226, +YCHEM_NL(59)%LNEGFIX=.TRUE., +YCHEM_NL(59)%IGRIBTC=218226, +YCHEM_NL(59)%IGRIBDV=221226, +YCHEM_NL(59)%HENRYA=12, +YCHEM_NL(59)%HENRYB=5000., +YCHEM_NL(59)%LQM=.false., +YCHEM_NL(59)%LQM3D=.TRUE., +YCHEM_NL(59)%LCOMAD=.true., +YCHEM_NL(59)%LADV=.TRUE., +YCHEM_NL(59)%LMASSFIX=.TRUE., +YCHEM_NL(59)%BETAMFBC=-999.9, +YCHEM_NL(59)%LASSIM=.FALSE., +YCHEM_NL(60)%CNAME='CH3CN', +YCHEM_NL(60)%NREQIN=1, +YCHEM_NL(60)%RMOLMASS=41.0, +YCHEM_NL(60)%IGRBCODE=217224, +YCHEM_NL(60)%LNEGFIX=.TRUE., +YCHEM_NL(60)%IGRIBTC=218224, +YCHEM_NL(60)%IGRIBDV=221224, +YCHEM_NL(60)%HENRYA=49, +YCHEM_NL(60)%HENRYB=4000., +YCHEM_NL(60)%LQM=.false., +YCHEM_NL(60)%LQM3D=.TRUE., +YCHEM_NL(60)%LCOMAD=.true., +YCHEM_NL(60)%LADV=.TRUE., +YCHEM_NL(60)%LMASSFIX=.TRUE., +YCHEM_NL(60)%BETAMFBC=-999.9, +YCHEM_NL(60)%LASSIM=.FALSE., +YCHEM_NL(61)%CNAME='XYL', +YCHEM_NL(61)%NREQIN=1, +YCHEM_NL(61)%RMOLMASS=106.0, +YCHEM_NL(61)%IGRBCODE=217100, +YCHEM_NL(61)%LNEGFIX=.TRUE., +YCHEM_NL(61)%IGRIBTC=218100, +YCHEM_NL(61)%IGRIBDV=221100, +YCHEM_NL(61)%HENRYA=0.14, +YCHEM_NL(61)%HENRYB=4200.0, +YCHEM_NL(61)%LQM=.false., +YCHEM_NL(61)%LQM3D=.TRUE., +YCHEM_NL(61)%LCOMAD=.true., +YCHEM_NL(61)%LADV=.TRUE., +YCHEM_NL(61)%LMASSFIX=.TRUE., +YCHEM_NL(61)%BETAMFBC=-999.9, +YCHEM_NL(61)%LASSIM=.FALSE., +YCHEM_NL(62)%CNAME='TOL', +YCHEM_NL(62)%NREQIN=1, +YCHEM_NL(62)%RMOLMASS=92.0, +YCHEM_NL(62)%IGRBCODE=217099, +YCHEM_NL(62)%LNEGFIX=.TRUE., +YCHEM_NL(62)%IGRIBTC=218099, +YCHEM_NL(62)%IGRIBDV=221099, +YCHEM_NL(62)%HENRYA=0.15, +YCHEM_NL(62)%HENRYB=4300.0, +YCHEM_NL(62)%LQM=.false., +YCHEM_NL(62)%LQM3D=.TRUE., +YCHEM_NL(62)%LCOMAD=.true., +YCHEM_NL(62)%LADV=.TRUE., +YCHEM_NL(62)%LMASSFIX=.TRUE., +YCHEM_NL(62)%BETAMFBC=-999.9, +YCHEM_NL(62)%LASSIM=.FALSE., +YCHEM_NL(63)%CNAME='AROO2', +YCHEM_NL(63)%NREQIN=1, +YCHEM_NL(63)%RMOLMASS=124.0, +YCHEM_NL(63)%IGRBCODE=217222, +YCHEM_NL(63)%LNEGFIX=.TRUE., +YCHEM_NL(63)%IGRIBTC=218222, +YCHEM_NL(63)%LQM=.false., +YCHEM_NL(63)%LQM3D=.TRUE., +YCHEM_NL(63)%LCOMAD=.true., +YCHEM_NL(63)%LADV=.FALSE., +YCHEM_NL(63)%LMASSFIX=.FALSE., +YCHEM_NL(63)%LMASSFIX=.FALSE., +YCHEM_NL(63)%LASSIM=.FALSE., +YCHEM_NL(64)%CNAME='HPALD1', +YCHEM_NL(64)%NREQIN=1, +YCHEM_NL(64)%RMOLMASS=148.0, +YCHEM_NL(64)%IGRBCODE=217227, +YCHEM_NL(64)%LNEGFIX=.TRUE., +YCHEM_NL(64)%IGRIBTC=218227, +YCHEM_NL(64)%HENRYA=17.0, +YCHEM_NL(64)%HENRYB=5000.0, +YCHEM_NL(64)%LQM=.false., +YCHEM_NL(64)%LQM3D=.TRUE., +YCHEM_NL(64)%LCOMAD=.true., +YCHEM_NL(64)%LADV=.TRUE., +YCHEM_NL(64)%LMASSFIX=.TRUE., +YCHEM_NL(64)%BETAMFBC=-999.9, +YCHEM_NL(64)%LASSIM=.FALSE., +YCHEM_NL(65)%CNAME='HPALD2', +YCHEM_NL(65)%NREQIN=1, +YCHEM_NL(65)%RMOLMASS=148.0, +YCHEM_NL(65)%IGRBCODE=217228, +YCHEM_NL(65)%LNEGFIX=.TRUE., +YCHEM_NL(65)%IGRIBTC=218228, +YCHEM_NL(65)%HENRYA=17.0, +YCHEM_NL(65)%HENRYB=5000.0, +YCHEM_NL(65)%LQM=.false., +YCHEM_NL(65)%LQM3D=.TRUE., +YCHEM_NL(65)%LCOMAD=.true., +YCHEM_NL(65)%LADV=.TRUE., +YCHEM_NL(65)%LMASSFIX=.TRUE., +YCHEM_NL(65)%BETAMFBC=-999.9, +YCHEM_NL(65)%LASSIM=.FALSE., +YCHEM_NL(66)%CNAME='ISOPOOH', +YCHEM_NL(66)%NREQIN=1, +YCHEM_NL(66)%RMOLMASS=118.0, +YCHEM_NL(66)%IGRBCODE=217161, +YCHEM_NL(66)%LNEGFIX=.TRUE., +YCHEM_NL(66)%IGRIBTC=218161, +YCHEM_NL(66)%IGRIBDV=221161, +YCHEM_NL(66)%HENRYA=3.2E11, +YCHEM_NL(66)%HENRYB=8700.0, +YCHEM_NL(66)%LQM=.false., +YCHEM_NL(66)%LQM3D=.TRUE., +YCHEM_NL(66)%LCOMAD=.true., +YCHEM_NL(66)%LADV=.TRUE., +YCHEM_NL(66)%LMASSFIX=.TRUE., +YCHEM_NL(66)%BETAMFBC=-999.9, +YCHEM_NL(66)%LASSIM=.FALSE., +YCHEM_NL(67)%CNAME='GLY', +YCHEM_NL(67)%NREQIN=1, +YCHEM_NL(67)%RMOLMASS=58.04, +YCHEM_NL(67)%IGRBCODE=217107, +YCHEM_NL(67)%LNEGFIX=.TRUE., +YCHEM_NL(67)%IGRIBTC=218107, +YCHEM_NL(67)%IGRIBDV=221107, +YCHEM_NL(67)%HENRYA=4.1E5, +YCHEM_NL(67)%HENRYB=7500.0, +YCHEM_NL(67)%LQM=.false., +YCHEM_NL(67)%LQM3D=.TRUE., +YCHEM_NL(67)%LCOMAD=.true., +YCHEM_NL(67)%LADV=.TRUE., +YCHEM_NL(67)%LMASSFIX=.TRUE., +YCHEM_NL(67)%BETAMFBC=-999.9, +YCHEM_NL(67)%LASSIM=.FALSE., +YCHEM_NL(68)%CNAME='GLYALD', +YCHEM_NL(68)%NREQIN=1, +YCHEM_NL(68)%RMOLMASS=60.05, +YCHEM_NL(68)%IGRBCODE=217101, +YCHEM_NL(68)%LNEGFIX=.TRUE., +YCHEM_NL(68)%IGRIBTC=218101, +YCHEM_NL(68)%IGRIBDV=221101, +YCHEM_NL(68)%HENRYA=4.1E4, +YCHEM_NL(68)%HENRYB=4600.0, +YCHEM_NL(68)%LQM=.false., +YCHEM_NL(68)%LQM3D=.TRUE., +YCHEM_NL(68)%LCOMAD=.true., +YCHEM_NL(68)%LADV=.TRUE., +YCHEM_NL(68)%LMASSFIX=.TRUE., +YCHEM_NL(68)%BETAMFBC=-999.9, +YCHEM_NL(68)%LASSIM=.FALSE., +YCHEM_NL(69)%CNAME='HYAC', +YCHEM_NL(69)%NREQIN=1, +YCHEM_NL(69)%RMOLMASS=74.1, +YCHEM_NL(69)%IGRBCODE=217118, +YCHEM_NL(69)%LNEGFIX=.TRUE., +YCHEM_NL(69)%IGRIBTC=218117, +YCHEM_NL(69)%IGRIBDV=221118, +YCHEM_NL(69)%HENRYA=6.3E3, +YCHEM_NL(69)%HENRYB=6460.0, +YCHEM_NL(69)%LQM=.false., +YCHEM_NL(69)%LQM3D=.TRUE., +YCHEM_NL(69)%LCOMAD=.true., +YCHEM_NL(69)%LADV=.TRUE., +YCHEM_NL(69)%LMASSFIX=.TRUE., +YCHEM_NL(69)%BETAMFBC=-999.9, +YCHEM_NL(69)%LASSIM=.FALSE., +YCHEM_NL(70)%CNAME='ISOPBO2', +YCHEM_NL(70)%NREQIN=1, +YCHEM_NL(70)%RMOLMASS=117.0, +YCHEM_NL(70)%IGRBCODE=217229, +YCHEM_NL(70)%LNEGFIX=.TRUE., +YCHEM_NL(70)%IGRIBTC=218229, +YCHEM_NL(70)%LQM=.false., +YCHEM_NL(70)%LQM3D=.TRUE., +YCHEM_NL(70)%LCOMAD=.true., +YCHEM_NL(70)%LADV=.FALSE., +YCHEM_NL(70)%LMASSFIX=.FALSE., +YCHEM_NL(70)%LMASSFIX=.FALSE., +YCHEM_NL(70)%LASSIM=.FALSE., +YCHEM_NL(71)%CNAME='ISOPDO2', +YCHEM_NL(71)%NREQIN=1, +YCHEM_NL(71)%RMOLMASS=117.0, +YCHEM_NL(71)%IGRBCODE=217230, +YCHEM_NL(71)%LNEGFIX=.TRUE., +YCHEM_NL(71)%IGRIBTC=218230, +YCHEM_NL(71)%LQM=.false., +YCHEM_NL(71)%LQM3D=.TRUE., +YCHEM_NL(71)%LCOMAD=.true., +YCHEM_NL(71)%LADV=.FALSE., +YCHEM_NL(71)%LMASSFIX=.FALSE., +YCHEM_NL(71)%LMASSFIX=.FALSE., +YCHEM_NL(71)%LASSIM=.FALSE., +YCHEM_NL(72)%CNAME='SOG1', +YCHEM_NL(72)%NREQIN=1, +YCHEM_NL(72)%RMOLMASS=180.0, +YCHEM_NL(72)%IGRBCODE=217186, +YCHEM_NL(72)%LNEGFIX=.TRUE., +YCHEM_NL(72)%IGRIBTC=218186, +YCHEM_NL(72)%HENRYA=1.E5, +YCHEM_NL(72)%HENRYB=6000.0, +YCHEM_NL(72)%LQM=.false., +YCHEM_NL(72)%LQM3D=.TRUE., +YCHEM_NL(72)%LCOMAD=.true., +YCHEM_NL(72)%LADV=.TRUE., +YCHEM_NL(72)%LMASSFIX=.TRUE., +YCHEM_NL(72)%BETAMFBC=-999.9, +YCHEM_NL(72)%LASSIM=.FALSE., +YCHEM_NL(73)%CNAME='SOG2A', +YCHEM_NL(73)%NREQIN=1, +YCHEM_NL(73)%RMOLMASS=120.0, +YCHEM_NL(73)%IGRBCODE=217187, +YCHEM_NL(73)%LNEGFIX=.TRUE., +YCHEM_NL(73)%IGRIBTC=218187, +YCHEM_NL(73)%HENRYA=1.E3, +YCHEM_NL(73)%HENRYB=6000.0, +YCHEM_NL(73)%LQM=.false., +YCHEM_NL(73)%LQM3D=.TRUE., +YCHEM_NL(73)%LCOMAD=.true., +YCHEM_NL(73)%LADV=.TRUE., +YCHEM_NL(73)%LMASSFIX=.TRUE., +YCHEM_NL(73)%BETAMFBC=-999.9, +YCHEM_NL(73)%LASSIM=.FALSE., +YCHEM_NL(74)%CNAME='SOG2B', +YCHEM_NL(74)%NREQIN=1, +YCHEM_NL(74)%RMOLMASS=120.0, +YCHEM_NL(74)%IGRBCODE=217188, +YCHEM_NL(74)%LNEGFIX=.TRUE., +YCHEM_NL(74)%IGRIBTC=218188, +YCHEM_NL(74)%HENRYA=1.E5, +YCHEM_NL(74)%HENRYB=6000.0, +YCHEM_NL(74)%LQM=.false., +YCHEM_NL(74)%LQM3D=.TRUE., +YCHEM_NL(74)%LCOMAD=.true., +YCHEM_NL(74)%LADV=.TRUE., +YCHEM_NL(74)%LMASSFIX=.TRUE., +YCHEM_NL(74)%BETAMFBC=-999.9, +YCHEM_NL(74)%LASSIM=.FALSE., +YEXT_NL(1)%CNAME='EMILI', +YEXT_NL(1)%NREQIN=0, +YEXT_NL(1)%IGRBCODE=212254, +YEXT_NL(1)%LADV=.FALSE., +YEXT_NL(1)%LGP=.TRUE., +YEXT_NL(1)%LGPINGP=.TRUE., +YEXT_NL(2)%CNAME='KCH4CHEM', +YEXT_NL(2)%NREQIN=0, +YEXT_NL(2)%IGRBCODE=210071, +YEXT_NL(2)%LADV=.FALSE., +YEXT_NL(2)%LGP=.TRUE., +YEXT_NL(2)%LGPINGP=.TRUE., +NGFL_EXT=2, +LAERCHEM=true +YQ_NL%LGP=true, +YQ_NL%LSP=false, +YL_NL%LGP=true, +YI_NL%LGP=true, +YA_NL%LGP=true, +YO3_NL%LGP=true, +LTRCMFQM=true, +/ +&NAMFPC +CFPFMT="MODEL", +NFP3DFS=96, +NFP3DFP=31, +NFP3DFT=25, +NFP3DFV=25, +MFP3DFS(:)=130,135,138,155,133,210001,210002,210003,210004,210005,210006,210007,210008,210009,210010,210011,210247,210248,210249,210252,210253,210203,210129,217003,217004,210123,217006,217007,210124,217009,217010,217011,217012,217013,217014,217015,217016,210122,217018,217019,217020,217021,217022,217023,217024,210181,217026,217027,217028,217029,217030,210121,217032,217033,217034,217035,217036,217037,217038,217039,217040,217041,217042,217043,217044,217045,217046,217047,217048,217049,217050,217051,217052,217053,217054,217055,217189,217225,217086,217226,217224,217100,217099,217222,217227,217228,217161,217107,217101,217118,217229,217230,217186,217187,217188,210071, +MFP3DFP(:)=129,130,135,138,155,157,133,210001,210002,210003,210004,210005,210006,210007,210008,210009,210010,210011,210247,210248,210249,210252,210253,210203,210123,217006,210124,210122,217019,217027,210121, +MFP3DFT=60,210001,210002,210003,210004,210005,210006,210007,210008,210009,210010,210011,210247,210248,210249,210252,210253,210203,210123,217006,210124,210122,217019,217027,210121, +MFP3DFV=133,210001,210002,210003,210004,210005,210006,210007,210008,210009,210010,210011,210247,210248,210249,210252,210253,210203,210123,217006,210124,210122,217019,217027,210121, +NFP2DF=2, +MFP2DF(:)=129,152, +NFPPHY=260, +MFPPHY(:)=31,32,33,34,35,36,37,38,39,40,41,42,44,45,47,49,50,57,58,59,78,79,129,134,136,137,139,141,142,143,228,144,145,146,147,148,151,159,164,165,166,167,168,169,170,172,175,176,177,178,179,180,181,182,183,186,187,188,189,195,196,197,198,201,202,205,208,209,210,211,235,236,238,243,244,245,229,230,231,232,213,212,8,9,228080,228081,228082,228083,228084,228085,228089,228090,228001,260121,260123,3020,228029,228251,228216,228217,228218,228219,228220,228221,260015,151131,151132,228141,228038,215022,215019,210208,215023,215020,215024,215021,215046,215043,210209,215047,215044,215048,215045,215064,215062,210210,215063,215061,215080,215078,210211,215079,215077,215088,215087,210212,215203,215201,210250,215204,215202,216042,215211,210251,216098,215218,215226,216099,215225,210072,210073,210074,210207,215104,215122,215140,215158,210217,215096,215114,215132,215150,210218,215097,215115,215133,215151,210219,215098,215116,215134,215152,210220,215099,215117,215135,215153,210221,215100,215118,215136,215154,210213,215101,215119,215137,215155,210222,215102,215120,215138,215156,210223,215103,215121,215139,215157,210224,215105,215123,215141,215159,210214,215106,215124,215142,215160,210225,215107,215125,215143,215161,210226,215108,215126,215144,215162,210215,215109,215127,215145,215163,210227,215110,215128,215146,215164,210228,215111,215129,215147,215165,210216,215112,215130,215148,215166,210229,215113,215131,215149,215167,210230,215176,215177,215178,215179,216008,216009,216010,216011,216012,210206,210127,218006,210128,210126,218019,218027,210125, +NRFP3S(:)=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137, +RFP3P(:)=100000.0,92500.0,85000.0,70000.0,50000.0,40000.0,30000.0,25000.0,20000.0,15000.0,10000.0,7000.0,5000.0,3000.0,2000.0,1000.0,700.0,500.0,300.0,200.0,100.0, +NFPCLI=0, +LFPQ=false, +LTRACEFP=false, +RFPCORR=60000., +/ +&NAMDIM +NPROMA=-16, +/ +&NAMDPHY +NVEXTR=7, +NCEXTR=137, +NCSNEC=5, +/ +&NAMGEM +LNONHYD_GEOM=false, +NHTYP=2, +/ +&NAMRIP +TSTEP=1800.0, +CSTOP='h240', +/ +&NAMARG +NCONF=1, +CNMEXP="abc3", +/ + &NAMRLX + / + &NAEAER + NTYPAER=3,3,2,2,1,2,1,2,0,0, + YAERO_DESC(1)%IGRIBDIAG=215001,215004,215007,215010,215013,215016,215022,215019, +YAERO_DESC(1)%RDDEPVSEA=1.1000E-02, +YAERO_DESC(1)%RDDEPVLIC=1.1000E-02, +YAERO_DESC(1)%RSEDIMV=2.4000E-05, +YAERO_DESC(1)%RSCAVIN=0.9, +YAERO_DESC(1)%RSCAVBCR=0.001, +YAERO_DESC(1)%RSCAVBCS=0.005, +YAERO_DESC(1)%COPTCLASS='SeaSaltSmall', +YAERO_DESC(1)%CHYGCLASS='SeaSalt', +YAERO_DESC(1)%IAEROCV=1, +YAERO_DESC(2)%IGRIBDIAG=215002,215005,215008,215011,215014,215017,215023,215020, +YAERO_DESC(2)%RDDEPVSEA=1.1500E-02, +YAERO_DESC(2)%RDDEPVLIC=1.2000E-02, +YAERO_DESC(2)%RSEDIMV=1.9500E-03, +YAERO_DESC(2)%RSCAVIN=0.9, +YAERO_DESC(2)%RSCAVBCR=0.001, +YAERO_DESC(2)%RSCAVBCS=0.005, +YAERO_DESC(2)%COPTCLASS='SeaSaltMedium', +YAERO_DESC(2)%CHYGCLASS='SeaSalt', +YAERO_DESC(2)%IAEROCV=2, +YAERO_DESC(3)%IGRIBDIAG=215003,215006,215009,215012,215015,215018,215024,215021, +YAERO_DESC(3)%RDDEPVSEA=1.2000E-02, +YAERO_DESC(3)%RDDEPVLIC=1.5000E-02, +YAERO_DESC(3)%RSEDIMV=1.8000E-02, +YAERO_DESC(3)%RSCAVIN=0.9, +YAERO_DESC(3)%RSCAVBCR=0.1, +YAERO_DESC(3)%RSCAVBCS=0.005, +YAERO_DESC(3)%COPTCLASS='SeaSaltLarge', +YAERO_DESC(3)%CHYGCLASS='SeaSalt', +YAERO_DESC(3)%IAEROCV=2, +YAERO_DESC(4)%IGRIBDIAG=215025,215028,215031,215034,215037,215040,215046,215043, +YAERO_DESC(4)%RDDEPVSEA=2.0000E-04, +YAERO_DESC(4)%RDDEPVLIC=2.0000E-04, +YAERO_DESC(4)%RSEDIMV=6.9040E-05, +YAERO_DESC(4)%RSCAVIN=0.7, +YAERO_DESC(4)%RSCAVBCR=0.001, +YAERO_DESC(4)%RSCAVBCS=0.005, +YAERO_DESC(4)%COPTCLASS='DustSmall', +YAERO_DESC(4)%CHYGCLASS='Dust', +YAERO_DESC(4)%IAEROCV=1, +YAERO_DESC(5)%IGRIBDIAG=215026,215029,215032,215035,215038,215041,215047,215044, +YAERO_DESC(5)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(5)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(5)%RSEDIMV=1.9820E-04, +YAERO_DESC(5)%RSCAVIN=0.7, +YAERO_DESC(5)%RSCAVBCR=0.001, +YAERO_DESC(5)%RSCAVBCS=0.005, +YAERO_DESC(5)%COPTCLASS='DustMedium', +YAERO_DESC(5)%CHYGCLASS='Dust', +YAERO_DESC(5)%IAEROCV=2, +YAERO_DESC(6)%IGRIBDIAG=215027,215030,215033,215036,215039,215042,215048,215045, +YAERO_DESC(6)%RDDEPVSEA=1.2000E-02, +YAERO_DESC(6)%RDDEPVLIC=1.2000E-02, +YAERO_DESC(6)%RSEDIMV=1.9620E-03, +YAERO_DESC(6)%RSCAVIN=0.7, +YAERO_DESC(6)%RSCAVBCR=0.1, +YAERO_DESC(6)%RSCAVBCS=0.005, +YAERO_DESC(6)%COPTCLASS='DustLarge', +YAERO_DESC(6)%CHYGCLASS='Dust', +YAERO_DESC(6)%IAEROCV=2, +YAERO_DESC(7)%IGRIBDIAG=215050,215052,215054,215056,215058,215060,215064,215062, +YAERO_DESC(7)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(7)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(7)%RSEDIMV=2.0000E-04, +YAERO_DESC(7)%RSCAVIN=0.7, +YAERO_DESC(7)%RSCAVBCR=0.0001, +YAERO_DESC(7)%RSCAVBCS=0.005, +YAERO_DESC(7)%COPTCLASS='OrganicMatter', +YAERO_DESC(7)%CHYGCLASS='OrganicMatter', +YAERO_DESC(7)%IAEROCV=1, +YAERO_DESC(8)%IGRIBDIAG=215049,215051,215053,215055,215057,215059,215063,215061, +YAERO_DESC(8)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(8)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(8)%RSEDIMV=2.0000E-04, +YAERO_DESC(8)%RSCAVIN=0, +YAERO_DESC(8)%RSCAVBCR=0.0001, +YAERO_DESC(8)%RSCAVBCS=0.005, +YAERO_DESC(8)%COPTCLASS='OrganicMatter', +YAERO_DESC(8)%CHYGCLASS='Hydrophobic', +YAERO_DESC(8)%IAEROCV=1, +YAERO_DESC(9)%IGRIBDIAG=215066,215068,215070,215072,215074,215076,215080,215078, +YAERO_DESC(9)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(9)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(9)%RSEDIMV=2.0000E-04, +YAERO_DESC(9)%RSCAVIN=0.7, +YAERO_DESC(9)%RSCAVBCR=0.0001, +YAERO_DESC(9)%RSCAVBCS=0.005, +YAERO_DESC(9)%COPTCLASS='BlackCarbon', +YAERO_DESC(9)%CHYGCLASS='BlackCarbon', +YAERO_DESC(9)%IAEROCV=1, +YAERO_DESC(10)%IGRIBDIAG=215065,215067,215069,215071,215073,215075,215079,215077, +YAERO_DESC(10)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(10)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(10)%RSEDIMV=2.0000E-04, +YAERO_DESC(10)%RSCAVIN=0, +YAERO_DESC(10)%RSCAVBCR=0.0001, +YAERO_DESC(10)%RSCAVBCS=0.005, +YAERO_DESC(10)%COPTCLASS='BlackCarbon', +YAERO_DESC(10)%CHYGCLASS='Hydrophobic', +YAERO_DESC(10)%IAEROCV=1, +YAERO_DESC(11)%IGRIBDIAG=215081,215082,215083,215084,215085,215086,215088,215087, +YAERO_DESC(11)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(11)%RDDEPVLIC=2.5000E-03, +YAERO_DESC(11)%RSEDIMV=2.0000E-04, +YAERO_DESC(11)%RSCAVIN=0.7, +YAERO_DESC(11)%RSCAVBCR=0.0001, +YAERO_DESC(11)%RSCAVBCS=0.005, +YAERO_DESC(11)%COPTCLASS='Sulphate', +YAERO_DESC(11)%CHYGCLASS='Sulphate', +YAERO_DESC(11)%IAEROCV=1, +YAERO_DESC(12)%IGRIBDIAG=215189,215191,215193,215195,215197,215199,215203,215201, +YAERO_DESC(12)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(12)%RDDEPVLIC=1.5000E-03, +YAERO_DESC(12)%RSEDIMV=2.0000E-04, +YAERO_DESC(12)%RSCAVIN=0.8, +YAERO_DESC(12)%RSCAVBCR=0.0001, +YAERO_DESC(12)%RSCAVBCS=0.005, +YAERO_DESC(12)%COPTCLASS='NitrateFine', +YAERO_DESC(12)%CHYGCLASS='Nitrate', +YAERO_DESC(12)%IAEROCV=1, +YAERO_DESC(13)%IGRIBDIAG=215190,215192,215194,215196,215198,215200,215204,215202, +YAERO_DESC(13)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(13)%RDDEPVLIC=1.5000E-03, +YAERO_DESC(13)%RSEDIMV=1.3352E-03, +YAERO_DESC(13)%RSCAVIN=0.8, +YAERO_DESC(13)%RSCAVBCR=0.1, +YAERO_DESC(13)%RSCAVBCS=0.005, +YAERO_DESC(13)%COPTCLASS='NitrateCoarse', +YAERO_DESC(13)%CHYGCLASS='Nitrate', +YAERO_DESC(13)%IAEROCV=2, +YAERO_DESC(14)%IGRIBDIAG=215205,215206,215207,215208,215209,215210,216042,215211, +YAERO_DESC(14)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(14)%RDDEPVLIC=1.5000E-03, +YAERO_DESC(14)%RSEDIMV=2.0000E-04, +YAERO_DESC(14)%RSCAVIN=0.9, +YAERO_DESC(14)%RSCAVBCR=0.0001, +YAERO_DESC(14)%RSCAVBCS=0.005, +YAERO_DESC(14)%COPTCLASS='Ammonium', +YAERO_DESC(14)%CHYGCLASS='Ammonium', +YAERO_DESC(14)%IAEROCV=1, +YAERO_DESC(15)%IGRIBDIAG=215212,215213,215214,215215,215216,215217,216098,215218, +YAERO_DESC(15)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(15)%RDDEPVLIC=2.5000E-03, +YAERO_DESC(15)%RSEDIMV=2.4000E-04, +YAERO_DESC(15)%RSCAVIN=0.7, +YAERO_DESC(15)%RSCAVBCR=0.0001, +YAERO_DESC(15)%RSCAVBCS=0.005, +YAERO_DESC(15)%COPTCLASS='SecOrgBio', +YAERO_DESC(15)%CHYGCLASS='SecOrgBio', +YAERO_DESC(15)%IAEROCV=1, +YAERO_DESC(16)%IGRIBDIAG=215219,215220,215221,215222,215223,215224,216099,215225, +YAERO_DESC(16)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(16)%RDDEPVLIC=2.5000E-03, +YAERO_DESC(16)%RSEDIMV=2.4000E-04, +YAERO_DESC(16)%RSCAVIN=0.7, +YAERO_DESC(16)%RSCAVBCR=0.0001, +YAERO_DESC(16)%RSCAVBCS=0.005, +YAERO_DESC(16)%COPTCLASS='SecOrgAnth', +YAERO_DESC(16)%CHYGCLASS='SecOrgAnth', +YAERO_DESC(16)%IAEROCV=1, + LAERVOL=false, + NDRYDEPVEL_DYN=2, + LAERDUSTSOURCE=true, + LAERDUSTSIZEVAR=true, + LAERDUST_NEWBIN=false, + RAERDUST_REBOUND=0.1, + LAERNGAT=true, + NAERSCAV=3, + LAERGTOP=true, + LAERHYGRO=true, + LAERSEDIM=true, + LAERSEDIMSS=true, + LAERDRYDP=true, + LAERSURF=true, + NSSALT=4, + NDDUST=2, + NSO4SCHEME=1, + LSEASALT_RH80=true, + LAERRRTM=true, + / + &NAMCOMPO + LCHEM_DIA=true, + LCHEM_DDFLX=true, + LCOMPO_DDFLX_DIR=true, + LCHEM_TROPO=true, + LCOMPO_DCDD=true, + LAERNITRATE=true, + LAEREQSAM4CLIM=false, + LAERSOA=true, + LAERSOA_COUPLED=true, + KGHG_CHEMTEND_CH4=1, + LAERNUCL=true, + AERO_SCHEME="hamm7", + +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219209 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212001 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="ene" + THIS%PARAMID=212002 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="fef" + THIS%PARAMID=212003 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="ind" + THIS%PARAMID=212004 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="res" + THIS%PARAMID=212006 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="shp" + THIS%PARAMID=212007 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="slv" + THIS%PARAMID=212189 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="swd" + THIS%PARAMID=212008 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="tnr" + THIS%PARAMID=212009 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="tro" + THIS%PARAMID=212010 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_A" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%SCALING=0.2 + THIS%PARAMID=210091 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_A" + THIS%SECTOR="ene" + THIS%PARAMID=212221 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%SCALING=0.2 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_A" + THIS%SECTOR="fef" + THIS%PARAMID=212222 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" + THIS%SCALING=0.2 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_A" + THIS%SECTOR="ind" + THIS%PARAMID=212223 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 + THIS%SCALING=0.2 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_A" + THIS%SECTOR="ref" + THIS%PARAMID=212229 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%SCALING=0.2 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_A" + THIS%SECTOR="res" + THIS%PARAMID=212224 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" + THIS%SCALING=0.2 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_A" + THIS%SECTOR="shp" + THIS%PARAMID=212225 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%SCALING=0.2 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_A" + THIS%SECTOR="swd" + THIS%PARAMID=212226 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%SCALING=0.2 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_A" + THIS%SECTOR="tnr" + THIS%PARAMID=212227 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" + THIS%SCALING=0.2 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_A" + THIS%SECTOR="tro" + THIS%PARAMID=212228 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" + THIS%SCALING=0.2 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_B" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%SCALING=0.8 + THIS%PARAMID=210091 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_B" + THIS%SECTOR="ene" + THIS%PARAMID=212221 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%SCALING=0.8 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_B" + THIS%SECTOR="fef" + THIS%PARAMID=212222 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" + THIS%SCALING=0.8 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_B" + THIS%SECTOR="ind" + THIS%PARAMID=212223 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 + THIS%SCALING=0.8 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_B" + THIS%SECTOR="ref" + THIS%PARAMID=212229 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%SCALING=0.8 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_B" + THIS%SECTOR="res" + THIS%PARAMID=212224 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" + THIS%SCALING=0.8 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_B" + THIS%SECTOR="shp" + THIS%PARAMID=212225 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%SCALING=0.8 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_B" + THIS%SECTOR="swd" + THIS%PARAMID=212226 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%SCALING=0.8 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_B" + THIS%SECTOR="tnr" + THIS%PARAMID=212227 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" + THIS%SCALING=0.8 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_B" + THIS%SECTOR="tro" + THIS%PARAMID=212228 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" + THIS%SCALING=0.8 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212011 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="ene" + THIS%PARAMID=212012 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="fef" + THIS%PARAMID=212013 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="ind" + THIS%PARAMID=212014 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="res" + THIS%PARAMID=212015 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="shp" + THIS%PARAMID=212016 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="slv" + THIS%PARAMID=212019 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="swd" + THIS%PARAMID=212017 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="tnr" + THIS%PARAMID=212018 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210106 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212021 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212022 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="ene" + THIS%PARAMID=212023 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="fef" + THIS%PARAMID=212024 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="ind" + THIS%PARAMID=212025 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="ref" + THIS%PARAMID=212020 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="res" + THIS%PARAMID=212026 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="shp" + THIS%PARAMID=212027 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="slv" + THIS%PARAMID=212133 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="swd" + THIS%PARAMID=212028 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="tnr" + THIS%PARAMID=212029 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="tro" + THIS%PARAMID=212030 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210104 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212031 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="ene" + THIS%PARAMID=212032 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="fef" + THIS%PARAMID=212033 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="ind" + THIS%PARAMID=212034 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="ref" + THIS%PARAMID=212040 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="res" + THIS%PARAMID=212035 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="shp" + THIS%PARAMID=212036 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="slv" + THIS%PARAMID=212137 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="swd" + THIS%PARAMID=212037 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="tnr" + THIS%PARAMID=212038 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="tro" + THIS%PARAMID=212039 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210118 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212041 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212042 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="ene" + THIS%PARAMID=212043 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="fef" + THIS%PARAMID=212044 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="ind" + THIS%PARAMID=212045 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="ref" + THIS%PARAMID=212134 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="res" + THIS%PARAMID=212046 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="shp" + THIS%PARAMID=212047 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="slv" + THIS%PARAMID=212185 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="swd" + THIS%PARAMID=212048 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="tnr" + THIS%PARAMID=212049 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="tro" + THIS%PARAMID=212050 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210107 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212051 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212052 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="ene" + THIS%PARAMID=212053 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="fef" + THIS%PARAMID=212054 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="ind" + THIS%PARAMID=212055 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="ref" + THIS%PARAMID=212135 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="res" + THIS%PARAMID=212056 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="shp" + THIS%PARAMID=212057 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="slv" + THIS%PARAMID=212186 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="swd" + THIS%PARAMID=212058 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="tnr" + THIS%PARAMID=212059 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="tro" + THIS%PARAMID=212060 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210105 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212061 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212062 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="ene" + THIS%PARAMID=212063 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="fef" + THIS%PARAMID=212064 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="ind" + THIS%PARAMID=212065 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="ref" + THIS%PARAMID=212136 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="res" + THIS%PARAMID=212066 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="shp" + THIS%PARAMID=212067 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="slv" + THIS%PARAMID=212187 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="swd" + THIS%PARAMID=212068 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="tnr" + THIS%PARAMID=212069 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="tro" + THIS%PARAMID=212070 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210108 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212071 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.00 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="ene" + THIS%PARAMID=212072 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="fef" + THIS%PARAMID=212073 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="ind" + THIS%PARAMID=212074 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="ref" + THIS%PARAMID=212080 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="res" + THIS%PARAMID=212075 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="shp" + THIS%PARAMID=212076 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="slv" + THIS%PARAMID=212198 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="swd" + THIS%PARAMID=212077 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="tnr" + THIS%PARAMID=212078 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="tro" + THIS%PARAMID=212079 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210113 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212081 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="ene" + THIS%PARAMID=212082 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="fef" + THIS%PARAMID=212083 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="ind" + THIS%PARAMID=212084 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="res" + THIS%PARAMID=212085 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="shp" + THIS%PARAMID=212086 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="slv" + THIS%PARAMID=212090 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="swd" + THIS%PARAMID=212087 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="tnr" + THIS%PARAMID=212088 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="tro" + THIS%PARAMID=212089 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219220 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="ene" + THIS%SCALING=0.0015 + THIS%PARAMID=212123 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="ind" + THIS%SCALING=0.0015 + THIS%PARAMID=212125 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="ref" + THIS%SCALING=0.0015 + THIS%PARAMID=212120 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="res" + THIS%SCALING=0.0015 + THIS%PARAMID=212126 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210115 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212091 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="emiss_nat" + THIS%SCALING=1.4 + THIS%PARAMID=212122 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="ene" + THIS%PARAMID=212092 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="fef" + THIS%PARAMID=212093 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="ind" + THIS%PARAMID=212094 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="ref" + THIS%PARAMID=212100 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="res" + THIS%PARAMID=212095 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="shp" + THIS%PARAMID=212096 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="slv" + THIS%PARAMID=212190 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="swd" + THIS%PARAMID=212097 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="tnr" + THIS%PARAMID=212098 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="tro" + THIS%PARAMID=212099 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210103 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212111 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="ene" + THIS%PARAMID=212112 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="fef" + THIS%PARAMID=212113 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="ind" + THIS%PARAMID=212114 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="ref" + THIS%PARAMID=212110 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="res" + THIS%PARAMID=212115 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="shp" + THIS%PARAMID=212116 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="slv" + THIS%PARAMID=212140 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="swd" + THIS%PARAMID=212117 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="tnr" + THIS%PARAMID=212118 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="tro" + THIS%PARAMID=212119 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210081 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212121 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212122 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="ene" + THIS%PARAMID=212123 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="fef" + THIS%PARAMID=212124 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="ind" + THIS%PARAMID=212125 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="ref" + THIS%PARAMID=212120 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="res" + THIS%PARAMID=212126 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="shp" + THIS%PARAMID=212127 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="swd" + THIS%PARAMID=212128 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="tnr" + THIS%PARAMID=212129 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="tro" + THIS%PARAMID=212130 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="DMS" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210117 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="DMS" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212132 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="DMS" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212131 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="GLY" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=212244 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219219 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="ene" + THIS%SCALING=0.001 + THIS%PARAMID=212123 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="ind" + THIS%SCALING=0.001 + THIS%PARAMID=212125 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="ref" + THIS%SCALING=0.001 + THIS%PARAMID=212120 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="res" + THIS%SCALING=0.001 + THIS%PARAMID=212126 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212141 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="ene" + THIS%PARAMID=212142 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="fef" + THIS%PARAMID=212143 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="ind" + THIS%PARAMID=212144 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="res" + THIS%PARAMID=212145 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="shp" + THIS%PARAMID=212146 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="slv" + THIS%PARAMID=212240 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="swd" + THIS%PARAMID=212147 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="tnr" + THIS%PARAMID=212148 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="tro" + THIS%PARAMID=212149 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ISPD" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212150 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212151 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="ene" + THIS%PARAMID=212152 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="fef" + THIS%PARAMID=212153 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="ind" + THIS%PARAMID=212154 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="res" + THIS%PARAMID=212155 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="shp" + THIS%PARAMID=212156 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="slv" + THIS%PARAMID=212241 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="swd" + THIS%PARAMID=212157 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="tnr" + THIS%PARAMID=212158 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="tro" + THIS%PARAMID=212159 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210116 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="agl" + THIS%PARAMID=212163 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ags" + THIS%PARAMID=212164 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGS" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212161 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212162 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ene" + THIS%PARAMID=212165 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ind" + THIS%PARAMID=212166 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ref" + THIS%PARAMID=212138 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="res" + THIS%PARAMID=212167 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="slv" + THIS%PARAMID=212169 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="swd" + THIS%PARAMID=212170 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="tnr" + THIS%PARAMID=212171 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="tro" + THIS%PARAMID=212172 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210085 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="agl" + THIS%PARAMID=212174 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212173 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="ene" + THIS%PARAMID=212176 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="fef" + THIS%PARAMID=212177 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="ind" + THIS%PARAMID=212178 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="ref" + THIS%PARAMID=212184 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="res" + THIS%PARAMID=212179 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="shp" + THIS%PARAMID=212180 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="swd" + THIS%PARAMID=212181 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="tnr" + THIS%PARAMID=212182 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="tro" + THIS%PARAMID=212183 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO2" + THIS%SECTOR="Aviation" + THIS%VERTICAL_PROFILE_TYPE="3D" + THIS%PARAMID=212255 + THIS%SCALING=1.53333333333333 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219208 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212191 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="ene" + THIS%PARAMID=212192 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="fef" + THIS%PARAMID=212193 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="ind" + THIS%PARAMID=212194 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="ref" + THIS%PARAMID=212200 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="res" + THIS%PARAMID=212195 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="shp" + THIS%PARAMID=212196 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="slv" + THIS%PARAMID=212242 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="swd" + THIS%PARAMID=212197 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="tnr" + THIS%PARAMID=212188 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="tro" + THIS%PARAMID=212199 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_A" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%SCALING=0.5 + THIS%PARAMID=210090 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_A" + THIS%SECTOR="ene" + THIS%PARAMID=212231 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_A" + THIS%SECTOR="fef" + THIS%PARAMID=212232 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_A" + THIS%SECTOR="ind" + THIS%PARAMID=212233 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_A" + THIS%SECTOR="ref" + THIS%PARAMID=212239 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_A" + THIS%SECTOR="res" + THIS%PARAMID=212234 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_A" + THIS%SECTOR="shp" + THIS%PARAMID=212235 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_A" + THIS%SECTOR="swd" + THIS%PARAMID=212236 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_A" + THIS%SECTOR="tnr" + THIS%PARAMID=212237 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_A" + THIS%SECTOR="tro" + THIS%PARAMID=212238 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_B" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%SCALING=0.5 + THIS%PARAMID=210090 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_B" + THIS%SECTOR="ene" + THIS%PARAMID=212231 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_B" + THIS%SECTOR="fef" + THIS%PARAMID=212232 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_B" + THIS%SECTOR="ind" + THIS%PARAMID=212233 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_B" + THIS%SECTOR="ref" + THIS%PARAMID=212239 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_B" + THIS%SECTOR="res" + THIS%PARAMID=212234 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_B" + THIS%SECTOR="shp" + THIS%PARAMID=212235 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_B" + THIS%SECTOR="swd" + THIS%PARAMID=212236 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_B" + THIS%SECTOR="tnr" + THIS%PARAMID=212237 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_B" + THIS%SECTOR="tro" + THIS%PARAMID=212238 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219207 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212201 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="ene" + THIS%PARAMID=212202 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="fef" + THIS%PARAMID=212203 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="ind" + THIS%PARAMID=212204 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="ref" + THIS%PARAMID=212139 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="res" + THIS%PARAMID=212205 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="shp" + THIS%PARAMID=212206 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="slv" + THIS%PARAMID=212243 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="swd" + THIS%PARAMID=212207 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="tnr" + THIS%PARAMID=212208 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="tro" + THIS%PARAMID=212209 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Rn" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212210 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210102 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212211 + THIS%VERTICAL_PROFILE_TYPE="AltitudeMap" + THIS%VERTICAL_PARAMID=216045 + THIS%VERTICAL_BASE_LEVEL=-1 + THIS%VERTICAL_TOP_LEVEL=-4 + THIS%VERTICAL_THRESHOLD=200 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="ene" + THIS%PARAMID=212212 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="fef" + THIS%PARAMID=212213 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="ind" + THIS%PARAMID=212214 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="ref" + THIS%PARAMID=212220 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="res" + THIS%PARAMID=212215 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="shp" + THIS%PARAMID=212216 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="swd" + THIS%PARAMID=212217 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="tnr" + THIS%PARAMID=212218 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="tro" + THIS%PARAMID=212219 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="agl" + THIS%PARAMID=216221 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="ene" + THIS%PARAMID=216222 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="fef" + THIS%PARAMID=216223 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="ind" + THIS%PARAMID=216224 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="ref" + THIS%PARAMID=216225 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="res" + THIS%PARAMID=216226 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="shp" + THIS%PARAMID=216227 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="slv" + THIS%PARAMID=216228 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="swd" + THIS%PARAMID=216229 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="tnr" + THIS%PARAMID=216230 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="tro" + THIS%PARAMID=216231 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219212 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=216200 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="ene" + THIS%PARAMID=216201 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="fef" + THIS%PARAMID=216202 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="ind" + THIS%PARAMID=216203 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="ref" + THIS%PARAMID=216204 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="res" + THIS%PARAMID=216205 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="shp" + THIS%PARAMID=216206 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="slv" + THIS%PARAMID=216207 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="swd" + THIS%PARAMID=216208 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="tnr" + THIS%PARAMID=216209 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="tro" + THIS%PARAMID=216210 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219213 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="ene" + THIS%PARAMID=216211 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="fef" + THIS%PARAMID=216212 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="ind" + THIS%PARAMID=216213 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="ref" + THIS%PARAMID=216214 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="res" + THIS%PARAMID=216215 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="shp" + THIS%PARAMID=216216 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="slv" + THIS%PARAMID=216217 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="swd" + THIS%PARAMID=216218 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="tnr" + THIS%PARAMID=216219 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="tro" + THIS%PARAMID=216220 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS +/ +&NAMCOMPO_EMIS_AUX + THIS%PARAMID=210060 +/ +&NAMCOMPO_EMIS_AUX + THIS%PARAMID=216045 +/ +&NAMCOMPO_EMIS_AUX +/ + &NAMCHEM + CHEM_SCHEME="tm5", + LCHEM_DIAC=false, + LCHEM_LIGHT=true, + + KCHEM_WETDEP=2, + LCHEM_0NOX=false, + KCHEM_NOXADV=0, + LCHEM_ANAO3=false, + KCHEM_SOLVE=2, + LCHEM_REVCHEM=false, + LCHEM_BASCOE_JON=false, + LCHEM_BASCOE_HETCHEM=true, + LCHEM_EXTENDJNO2=true, + LCHEM_JOUT=false, + LCHEM_AEROI=true, + LCHEM_O3RAD=true, + KCHEM_DRYDEP=3, + LCHEM_CSHAPE=.false., + LCHEM_WDFR=.true., + / + &NAMVAR + LMODERR=.false., + LJCDFI=.false., + LUSEJCDFI=.false., + LECV=false, + / + &NAMMCC + LMCC_COMPO=false, + / + &NAETLDIAG + / + &NAMVV0 + LLFORCE_READ=false, + / +&NAEAER +/ +&NAEPHY +/ +&NAERAD +/ +&NALBAR +/ +&NALORI +/ +&NAM_DISTRIBUTED_VECTORS +/ +&NAM926 +/ +&NAMAFN +/ +&NAMANA +/ +&NAMARPHY +/ +&NAMCA +/ +&NAMCAPE +/ +&NAMCFU +/ +&NAMCHK +/ +&NAMCHET +/ +&NAMCLDP +/ +&NAMCLTC +/ +&NAMCOM +/ +&NAMCOS +/ +&NAMCTAN +/ +&NAMCUMF +/ +&NAMCUMFS +/ +&NAMCT1 +/ +&NAMCVA +/ +&NAMDDH +/ +&NAMDFHD +/ +&NAMDFI +/ +&NAMDIF +/ +&NAMDIM +/ +&NAMDIMO +/ +&NAMDMSP +/ +&NAMDPHY +/ +&NAMDYN +/ +&NAMDYNA +/ +&NAMDYNA_STATIC +/ +&NAMDYNCORE +/ +&NAMEMIS_CONF +/ +&NAMENKF +/ +&NAMFA +/ +&NAMFFT +/ +&NAMFPC +/ +&NAMFPD +/ +&NAMFPDY2 +/ +&NAMFPDYH +/ +&NAMFPDYP +/ +&NAMFPDYS +/ +&NAMFPDYT +/ +&NAMFPDYV +/ +&NAMFPEZO +/ +&NAMFPF +/ +&NAMFPG +/ +&NAMFPIOS +/ +&NAMFPPHY +/ +&NAMFPSC2 +/ +&NAMFPSC2_DEP +/ +&NAMFY2 +/ +&NAMGEM +/ +&NAMGFL +/ +&NAMGMS +/ +&NAMGOES +/ +&NAMGOM +/ +&NAMGRIB +/ +&NAMGWD +/ +&NAMGWWMS +/ +&NAMHLOPT +/ +&NAMINI +/ +&NAMIOMI +/ +&NAMIOS +/ +&NAMJBCODES +/ +&NAMJFH +/ +&NAMJG +/ +&NAMJO +/ +&NAMKAP +/ +&NAMLCZ +/ +&NAMLEG +/ +&NAMLFI +/ +&NAMMCC +/ +&NAMMCUF +/ +&NAMMETEOSAT +/ +&NAMMTS +/ +&NAMMTSAT +/ +&NAMMTT +/ +&NAMMUL +/ +&NAMNMI +/ +&NAMNASA +/ +&NAMNN +/ +&NAMNPROF +/ +&NAMNUD +/ +&NAMOBS +/ +&NAMONEDVAR +/ +&NAMOPH +/ +&NAMOPTCMEM +/ +&NAMPAR0 +/ +&NAMPARAR +/ +&NAMPAR1 +/ +&NAMPHY +/ +&NAMPHY0 +/ +&NAMPHY1 +/ +&NAMPHY2 +/ +&NAMPHY3 +/ +&NAMPHYDS +/ +&NAMPPC +/ +&NAMPONG +/ +&NAMRAD15 +/ +&NAMRADCMEM +/ +&NAMRCOEF +/ +&NAMRES +/ +&NAMRINC +/ +&NAMRIP +/ +&NAMSATS +/ +&NAMSCC +/ +&NAMSCEN +/ +&NAMSCM +/ +&NAMSENS +/ +&NAMSIMPHL +/ +&NAMSKF +/ +&NAMSPSDT +/ +&NAMSPP +/ +&NAMSSMI +/ +&NAMSTA +/ +&NAMSTOPH +/ +&NAMTCWV +/ +&NAMTESTVAR +/ +&NAMTOPH +/ +&NAMTOVS +/ +&NAMTRAJP +/ +&NAMTRANS +/ +&NAMTRM +/ +&NAMVAR +/ +&NAMVARBC +/ +&NAMVARBC_AIREP +/ +&NAMVARBC_ALLSKY +/ +&NAMVARBC_GBRAD +/ +&NAMVARBC_RAD +/ +&NAMVARBC_SFCOBS +/ +&NAMVARBC_TCWV +/ +&NAMVARBC_TO3 +/ +&NAMVAREPS +/ +&NAMVDOZ +/ +&NAMVFP +/ +&NAMVRTL +/ +&NAMVV0 +/ +&NAMVV1 +/ +&NAMVV2 +/ +&NAMVWRK +/ +&NAMWAVELETJB +/ +&NAMXFU +/ +&NAMZDI +/ +&NAPHLC +/ +&NAV1IS +/ +&NAEPHLI +/ +&NAMCVER +/ +&NAMPPVI +/ +&NAMSPNG +/ +&NAMRLX +/ +&NAMTHLIM +/ +&NAMOOPS +/ +&NAMINTFLEX +/ +&NAMIAU +/ +&NAMDIM_TRAJ +/ +&NAMVDF +/ +&NAMGWDIAG +/ +&NAMTRANS0 +/ +&NAMMETHOX +/ +&NAM_ATLAS_IFS +/ +&NAETLDIAG +/ +&NAMACV +/ +&NAM_MGRIDS_ADVECTION +/ +&NAMTRAJ +/ +&NAMSATSIM +/ +&NAMCMEM_MW +/ +&NAMPHMSE +/ +&NAMNORGWD +/ +&NAMCLRADLID +/ +&NAMDVISI +/ +&NAM_MGRIDS_ADVECTION +/ +&NAMNUDGLH +/ +&NAMPERTOBS +/ +&NAMVARBC_MODES +/ +&NAMM7CTL +/ diff --git a/ifs-test/tests/t255/common/namelist_m7_ok b/ifs-test/tests/t255/common/namelist_m7_ok new file mode 100644 index 00000000..bad30aea --- /dev/null +++ b/ifs-test/tests/t255/common/namelist_m7_ok @@ -0,0 +1,4390 @@ +&NAMIOS +CFRCF="./rcf", +CIOSPRF="./srf", +/ +&NAMGRIB +CFCLASS="rd", +NCYCLE=154, +/ +&NAMCVER +LVERTFE=true, +NVSCH=3, +LVFE_GWMPA=true, +LVFE_GW=false, +LVFE_Z_TERM=false, +LVFE_X_TERM=false, +LVFE_LAPL_BC=true, +LVFE_LAPL=true, +NDLNPR=0, +/ +&NAMMCC +LMCC_COMPO=false, +LMCCEC=true, +LMCCIEC=false, +/ +&NAMTRANS +LUSEFLT=false, +LFFTW=false, +/ +&NAMRES +NFRRES=1, +NRESTS(:)=-1,-32767, +/ +&NAERAD +CRTABLEDIR='./rtables/', +LECOMPGRID=false, +RMUZUV=0.01, +NUVTIM=72, +NRADUV=1, +NUV=24, +LUVPROC=false, +LUVAERP=true, +LO3_CHEM_UV=true, +KMODTS=2, +NAERMACC=1, +NRPROMA=0, +/ +&NAEPHY +LNEEONLINE=true, +LWETONLINE=false, +LBFASCO2=false, +LEPHYS=true, +LEVDIF=true, +LESURF=true, +LECOND=true, +LECUMF=true, +LEPCLD=true, +LEEVAP=true, +LEVGEN=true, +LESSRO=true, +LECURR=false, +LEOCWA=true, +LEGWDG=true, +LEGWWMS=true, +LEOZOC=true, +LEQNGT=true, +LERADI=true, +LERADS=true, +LESICE=true, +LEO3CH=true, +LO3CH_HLO=true, +CO3CHEM="H1.0", +LEDCLD=true, +LDUCTDIA=false, +LDIAGTURB_EC=false, +LELIGHT=false, +LWCOU=true, +LWCOU2W=true, +LWCOUHMF=false, +LWCOURNW=false, +NSTPW=1, +LSLPHY=true, +LESNML=true, +NSNMLWS=2, +LEFARQUHAR=true, +LEOPTSURF=false, +LEAIRCO2COUP=false, +LEC4MAP=true, +LEAGS=false, +/ +&NAMPAR1 +LSPLIT=true, +NFLDIN=0, +NOUTTYPE=1, +NSTRIN=1, +NWRTOUT=4, +/ +&NAMPAR0 +LBARRIER_STATS2=false, +LBARRIER_STATS=false, +LDETAILED_STATS=false, +LSTATS=true, +LSTATSCPU=false, +LSYNCSTATS=false, +LXML_STATS=false, +MBX_SIZE=0, +MP_TYPE=1, +NOUTPUT=1, +NPRNT_STATS=512, +NPROC=512, +NSPECRESMIN=256, +/ +&NAMDYNA +LSLAG=true, +LNHEE=false, +LNHQE=false, +LGRADSP=true, +LCOMAD_GFL=true, +LCOMADH=true, +/ +&NAMDYNCORE +LAQUA=false, +/ +&NAMDYN +LMASCOR=true, +NITMP=3, +/ +&NAMCT0 +CEVENT="ecflow_client --event", +CMETER="ecflow_client --meter", +LARPEGEF=false, +LFDBOP=false, +LSMSSIG=false, +N3DINI=0, +NDHFDTS=0, +NDHFZTS=0, +NFPOS=2, +NFRCO=4, +NFRDHFD=1, +NFRDHFZ=48, +NFRDHP=12, +NFRHIS=6, +NFRMASSCON=1, +NFRPOS=6, +NFRSDI=1, +NHISTS=0, +NMASSCONS=0, +NPOSTS=0, +NUNDEFLD=-999999, +/ +&NAMDDH +BDEDDH(1:6,1)=4.0,1.0,0.0,50.0,0.0,49.0, +NDHKD=120, +LHDZON=false, +LHDEFZ=false, +LHDDOP=false, +LHDEFD=false, +LHDGLB=false, +LHDPRG=false, +LHDHKS=false, +/ +&NAMIO_SERV +NPROCESS_LEVEL=5, +NIO_SERV_METHOD=2, +NMSG_LEVEL_CLIENT=0, +NMSG_LEVEL_SERVER=1, +/ +&NAMGFL +NAERO=37, +NACTAERO=37, +YAERO_NL(1)%CNAME='SO4', +YAERO_NL(1)%IGRBCODE=210011, +YAERO_NL(1)%LMASSFIX=.true., +YAERO_NL(1)%LCOMAD=.true., +YAERO_NL(1)%LQM=.false., +YAERO_NL(1)%LQM3D=.true., +YAERO_NL(1)%BETAMFBC=-999, +YAERO_NL(1)%LADV=.true., +YAERO_NL(1)%NREQIN=0, +YAERO_NL(2)%CNAME='NH4', +YAERO_NL(2)%IGRBCODE=212035, +YAERO_NL(2)%LMASSFIX=.true., +YAERO_NL(2)%LCOMAD=.true., +YAERO_NL(2)%LQM=.false., +YAERO_NL(2)%LQM3D=.true., +YAERO_NL(2)%BETAMFBC=-999, +YAERO_NL(2)%LADV=.true., +YAERO_NL(2)%NREQIN=0, +YAERO_NL(3)%CNAME='NO3_A', +YAERO_NL(3)%IGRBCODE=212036, +YAERO_NL(3)%LMASSFIX=.true., +YAERO_NL(3)%LCOMAD=.true., +YAERO_NL(3)%LQM=.false., +YAERO_NL(3)%LQM3D=.true., +YAERO_NL(3)%BETAMFBC=-999, +YAERO_NL(3)%LADV=.true., +YAERO_NL(3)%NREQIN=0, +YAERO_NL(4)%CNAME='ACS_N', +YAERO_NL(4)%IGRBCODE=212001, +YAERO_NL(4)%LMASSFIX=.true., +YAERO_NL(4)%LCOMAD=.true., +YAERO_NL(4)%LQM=.false., +YAERO_NL(4)%LQM3D=.true., +YAERO_NL(4)%BETAMFBC=-999, +YAERO_NL(4)%LADV=.true., +YAERO_NL(4)%NREQIN=0, +YAERO_NL(5)%CNAME='SO4ACS', +YAERO_NL(5)%IGRBCODE=212002, +YAERO_NL(5)%LMASSFIX=.true., +YAERO_NL(5)%LCOMAD=.true., +YAERO_NL(5)%LQM=.false., +YAERO_NL(5)%LQM3D=.true., +YAERO_NL(5)%BETAMFBC=-999, +YAERO_NL(5)%LADV=.true., +YAERO_NL(5)%NREQIN=0, +YAERO_NL(6)%CNAME='BCACS', +YAERO_NL(6)%IGRBCODE=212003, +YAERO_NL(6)%LMASSFIX=.true., +YAERO_NL(6)%LCOMAD=.true., +YAERO_NL(6)%LQM=.false., +YAERO_NL(6)%LQM3D=.true., +YAERO_NL(6)%BETAMFBC=-999, +YAERO_NL(6)%LADV=.true., +YAERO_NL(6)%NREQIN=0, +YAERO_NL(7)%CNAME='POMACS', +YAERO_NL(7)%IGRBCODE=212004, +YAERO_NL(7)%LMASSFIX=.true., +YAERO_NL(7)%LCOMAD=.true., +YAERO_NL(7)%LQM=.false., +YAERO_NL(7)%LQM3D=.true., +YAERO_NL(7)%BETAMFBC=-999, +YAERO_NL(7)%LADV=.true., +YAERO_NL(7)%NREQIN=0, +YAERO_NL(8)%CNAME='SSACS', +YAERO_NL(8)%IGRBCODE=212005, +YAERO_NL(8)%LMASSFIX=.true., +YAERO_NL(8)%LCOMAD=.true., +YAERO_NL(8)%LQM=.false., +YAERO_NL(8)%LQM3D=.true., +YAERO_NL(8)%BETAMFBC=-999, +YAERO_NL(8)%LADV=.true., +YAERO_NL(8)%NREQIN=0, +YAERO_NL(9)%CNAME='DUACS', +YAERO_NL(9)%IGRBCODE=212006, +YAERO_NL(9)%LMASSFIX=.true., +YAERO_NL(9)%LCOMAD=.true., +YAERO_NL(9)%LQM=.false., +YAERO_NL(9)%LQM3D=.true., +YAERO_NL(9)%BETAMFBC=-999, +YAERO_NL(9)%LADV=.true., +YAERO_NL(9)%NREQIN=0, +YAERO_NL(10)%CNAME='SOANUS', +YAERO_NL(10)%IGRBCODE=212007, +YAERO_NL(10)%LMASSFIX=.true., +YAERO_NL(10)%LCOMAD=.true., +YAERO_NL(10)%LQM=.false., +YAERO_NL(10)%LQM3D=.true., +YAERO_NL(10)%BETAMFBC=-999, +YAERO_NL(10)%LADV=.true., +YAERO_NL(10)%NREQIN=0, +YAERO_NL(11)%CNAME='SOAAIS', +YAERO_NL(11)%IGRBCODE=212008, +YAERO_NL(11)%LMASSFIX=.true., +YAERO_NL(11)%LCOMAD=.true., +YAERO_NL(11)%LQM=.false., +YAERO_NL(11)%LQM3D=.true., +YAERO_NL(11)%BETAMFBC=-999, +YAERO_NL(11)%LADV=.true., +YAERO_NL(11)%NREQIN=0, +YAERO_NL(12)%CNAME='SOAACS', +YAERO_NL(12)%IGRBCODE=212009, +YAERO_NL(12)%LMASSFIX=.true., +YAERO_NL(12)%LCOMAD=.true., +YAERO_NL(12)%LQM=.false., +YAERO_NL(12)%LQM3D=.true., +YAERO_NL(12)%BETAMFBC=-999, +YAERO_NL(12)%LADV=.true., +YAERO_NL(12)%NREQIN=0, +YAERO_NL(13)%CNAME='SOACOS', +YAERO_NL(13)%IGRBCODE=212010, +YAERO_NL(13)%LMASSFIX=.true., +YAERO_NL(13)%LCOMAD=.true., +YAERO_NL(13)%LQM=.false., +YAERO_NL(13)%LQM3D=.true., +YAERO_NL(13)%BETAMFBC=-999, +YAERO_NL(13)%LADV=.true., +YAERO_NL(13)%NREQIN=0, +YAERO_NL(14)%CNAME='SOAAII', +YAERO_NL(14)%IGRBCODE=212011, +YAERO_NL(14)%LMASSFIX=.true., +YAERO_NL(14)%LCOMAD=.true., +YAERO_NL(14)%LQM=.false., +YAERO_NL(14)%LQM3D=.true., +YAERO_NL(14)%BETAMFBC=-999, +YAERO_NL(14)%LADV=.true., +YAERO_NL(14)%NREQIN=0, +YAERO_NL(15)%CNAME='H2OPART', +YAERO_NL(15)%IGRBCODE=212012, +YAERO_NL(15)%LMASSFIX=.true., +YAERO_NL(15)%LCOMAD=.true., +YAERO_NL(15)%LQM=.false., +YAERO_NL(15)%LQM3D=.true., +YAERO_NL(15)%BETAMFBC=-999, +YAERO_NL(15)%LADV=.true., +YAERO_NL(15)%NREQIN=0, +YAERO_NL(16)%CNAME='AII_N', +YAERO_NL(16)%IGRBCODE=212013, +YAERO_NL(16)%LMASSFIX=.true., +YAERO_NL(16)%LCOMAD=.true., +YAERO_NL(16)%LQM=.false., +YAERO_NL(16)%LQM3D=.true., +YAERO_NL(16)%BETAMFBC=-999, +YAERO_NL(16)%LADV=.true., +YAERO_NL(16)%NREQIN=0, +YAERO_NL(17)%CNAME='BCAII', +YAERO_NL(17)%IGRBCODE=212014, +YAERO_NL(17)%LMASSFIX=.true., +YAERO_NL(17)%LCOMAD=.true., +YAERO_NL(17)%LQM=.false., +YAERO_NL(17)%LQM3D=.true., +YAERO_NL(17)%BETAMFBC=-999, +YAERO_NL(17)%LADV=.true., +YAERO_NL(17)%NREQIN=0, +YAERO_NL(18)%CNAME='POMAII', +YAERO_NL(18)%IGRBCODE=212015, +YAERO_NL(18)%LMASSFIX=.true., +YAERO_NL(18)%LCOMAD=.true., +YAERO_NL(18)%LQM=.false., +YAERO_NL(18)%LQM3D=.true., +YAERO_NL(18)%BETAMFBC=-999, +YAERO_NL(18)%LADV=.true., +YAERO_NL(18)%NREQIN=0, +YAERO_NL(19)%CNAME='ACI_N', +YAERO_NL(19)%IGRBCODE=212016, +YAERO_NL(19)%LMASSFIX=.true., +YAERO_NL(19)%LCOMAD=.true., +YAERO_NL(19)%LQM=.false., +YAERO_NL(19)%LQM3D=.true., +YAERO_NL(19)%BETAMFBC=-999, +YAERO_NL(19)%LADV=.true., +YAERO_NL(19)%NREQIN=0, +YAERO_NL(20)%CNAME='DUACI', +YAERO_NL(20)%IGRBCODE=212017, +YAERO_NL(20)%LMASSFIX=.true., +YAERO_NL(20)%LCOMAD=.true., +YAERO_NL(20)%LQM=.false., +YAERO_NL(20)%LQM3D=.true., +YAERO_NL(20)%BETAMFBC=-999, +YAERO_NL(20)%LADV=.true., +YAERO_NL(20)%NREQIN=0, +YAERO_NL(21)%CNAME='AIS_N', +YAERO_NL(21)%IGRBCODE=212018, +YAERO_NL(21)%LMASSFIX=.true., +YAERO_NL(21)%LCOMAD=.true., +YAERO_NL(21)%LQM=.false., +YAERO_NL(21)%LQM3D=.true., +YAERO_NL(21)%BETAMFBC=-999, +YAERO_NL(21)%LADV=.true., +YAERO_NL(21)%NREQIN=0, +YAERO_NL(22)%CNAME='SO4AIS', +YAERO_NL(22)%IGRBCODE=212019, +YAERO_NL(22)%LMASSFIX=.true., +YAERO_NL(22)%LCOMAD=.true., +YAERO_NL(22)%LQM=.false., +YAERO_NL(22)%LQM3D=.true., +YAERO_NL(22)%BETAMFBC=-999, +YAERO_NL(22)%LADV=.true., +YAERO_NL(22)%NREQIN=0, +YAERO_NL(23)%CNAME='BCAIS', +YAERO_NL(23)%IGRBCODE=212020, +YAERO_NL(23)%LMASSFIX=.true., +YAERO_NL(23)%LCOMAD=.true., +YAERO_NL(23)%LQM=.false., +YAERO_NL(23)%LQM3D=.true., +YAERO_NL(23)%BETAMFBC=-999, +YAERO_NL(23)%LADV=.true., +YAERO_NL(23)%NREQIN=0, +YAERO_NL(24)%CNAME='POMAIS', +YAERO_NL(24)%IGRBCODE=212021, +YAERO_NL(24)%LMASSFIX=.true., +YAERO_NL(24)%LCOMAD=.true., +YAERO_NL(24)%LQM=.false., +YAERO_NL(24)%LQM3D=.true., +YAERO_NL(24)%BETAMFBC=-999, +YAERO_NL(24)%LADV=.true., +YAERO_NL(24)%NREQIN=0, +YAERO_NL(25)%CNAME='COI_N', +YAERO_NL(25)%IGRBCODE=212022, +YAERO_NL(25)%LMASSFIX=.true., +YAERO_NL(25)%LCOMAD=.true., +YAERO_NL(25)%LQM=.false., +YAERO_NL(25)%LQM3D=.true., +YAERO_NL(25)%BETAMFBC=-999, +YAERO_NL(25)%LADV=.true., +YAERO_NL(25)%NREQIN=0, +YAERO_NL(26)%CNAME='DUCOI', +YAERO_NL(26)%IGRBCODE=212023, +YAERO_NL(26)%LMASSFIX=.true., +YAERO_NL(26)%LCOMAD=.true., +YAERO_NL(26)%LQM=.false., +YAERO_NL(26)%LQM3D=.true., +YAERO_NL(26)%BETAMFBC=-999, +YAERO_NL(26)%LADV=.true., +YAERO_NL(26)%NREQIN=0, +YAERO_NL(27)%CNAME='COS_N', +YAERO_NL(27)%IGRBCODE=212024, +YAERO_NL(27)%LMASSFIX=.true., +YAERO_NL(27)%LCOMAD=.true., +YAERO_NL(27)%LQM=.false., +YAERO_NL(27)%LQM3D=.true., +YAERO_NL(27)%BETAMFBC=-999, +YAERO_NL(27)%LADV=.true., +YAERO_NL(27)%NREQIN=0, +YAERO_NL(28)%CNAME='SO4COS', +YAERO_NL(28)%IGRBCODE=212025, +YAERO_NL(28)%LMASSFIX=.true., +YAERO_NL(28)%LCOMAD=.true., +YAERO_NL(28)%LQM=.false., +YAERO_NL(28)%LQM3D=.true., +YAERO_NL(28)%BETAMFBC=-999, +YAERO_NL(28)%LADV=.true., +YAERO_NL(28)%NREQIN=0, +YAERO_NL(29)%CNAME='BCCOS', +YAERO_NL(29)%IGRBCODE=212026, +YAERO_NL(29)%LMASSFIX=.true., +YAERO_NL(29)%LCOMAD=.true., +YAERO_NL(29)%LQM=.false., +YAERO_NL(29)%LQM3D=.true., +YAERO_NL(29)%BETAMFBC=-999, +YAERO_NL(29)%LADV=.true., +YAERO_NL(29)%NREQIN=0, +YAERO_NL(30)%CNAME='POMCOS', +YAERO_NL(30)%IGRBCODE=212027, +YAERO_NL(30)%LMASSFIX=.true., +YAERO_NL(30)%LCOMAD=.true., +YAERO_NL(30)%LQM=.false., +YAERO_NL(30)%LQM3D=.true., +YAERO_NL(30)%BETAMFBC=-999, +YAERO_NL(30)%LADV=.true., +YAERO_NL(30)%NREQIN=0, +YAERO_NL(31)%CNAME='SSCOS', +YAERO_NL(31)%IGRBCODE=212028, +YAERO_NL(31)%LMASSFIX=.true., +YAERO_NL(31)%LCOMAD=.true., +YAERO_NL(31)%LQM=.false., +YAERO_NL(31)%LQM3D=.true., +YAERO_NL(31)%BETAMFBC=-999, +YAERO_NL(31)%LADV=.true., +YAERO_NL(31)%NREQIN=0, +YAERO_NL(32)%CNAME='DUCOS', +YAERO_NL(32)%IGRBCODE=212029, +YAERO_NL(32)%LMASSFIX=.true., +YAERO_NL(32)%LCOMAD=.true., +YAERO_NL(32)%LQM=.false., +YAERO_NL(32)%LQM3D=.true., +YAERO_NL(32)%BETAMFBC=-999, +YAERO_NL(32)%LADV=.true., +YAERO_NL(32)%NREQIN=0, +YAERO_NL(33)%CNAME='NUS_N', +YAERO_NL(33)%IGRBCODE=212030, +YAERO_NL(33)%LMASSFIX=.true., +YAERO_NL(33)%LCOMAD=.true., +YAERO_NL(33)%LQM=.false., +YAERO_NL(33)%LQM3D=.true., +YAERO_NL(33)%BETAMFBC=-999, +YAERO_NL(33)%LADV=.true., +YAERO_NL(33)%NREQIN=0, +YAERO_NL(34)%CNAME='SO4NUS', +YAERO_NL(34)%IGRBCODE=212031, +YAERO_NL(34)%LMASSFIX=.true., +YAERO_NL(34)%LCOMAD=.true., +YAERO_NL(34)%LQM=.false., +YAERO_NL(34)%LQM3D=.true., +YAERO_NL(34)%BETAMFBC=-999, +YAERO_NL(34)%LADV=.true., +YAERO_NL(34)%NREQIN=0, +YAERO_NL(35)%CNAME='ELVOC', +YAERO_NL(35)%IGRBCODE=212032, +YAERO_NL(35)%LMASSFIX=.true., +YAERO_NL(35)%LCOMAD=.true., +YAERO_NL(35)%LQM=.false., +YAERO_NL(35)%LQM3D=.true., +YAERO_NL(35)%BETAMFBC=-999, +YAERO_NL(35)%LADV=.true., +YAERO_NL(35)%NREQIN=0, +YAERO_NL(36)%CNAME='ISVOC', +YAERO_NL(36)%IGRBCODE=212033, +YAERO_NL(36)%LMASSFIX=.true., +YAERO_NL(36)%LCOMAD=.true., +YAERO_NL(36)%LQM=.false., +YAERO_NL(36)%LQM3D=.true., +YAERO_NL(36)%BETAMFBC=-999, +YAERO_NL(36)%LADV=.true., +YAERO_NL(36)%NREQIN=0, +YAERO_NL(37)%CNAME='MSA', +YAERO_NL(37)%IGRBCODE=212034, +YAERO_NL(37)%LMASSFIX=.true., +YAERO_NL(37)%LCOMAD=.true., +YAERO_NL(37)%LQM=.false., +YAERO_NL(37)%LQM3D=.true., +YAERO_NL(37)%BETAMFBC=-999, +YAERO_NL(37)%LADV=.true., +YAERO_NL(37)%NREQIN=0, +LAERAOT=false, +LAERLISI=false, +NAEROUT=0,NAERO_WVL_DIAG=6, +NAERO_WVL_DIAG_TYPES=5, +YAERO_WVL_DIAG_NL(1)%IWVL=550, +YAERO_WVL_DIAG_NL(1)%IGRIBDIAG=210207,215104,215122,215140,215158, +YAERO_WVL_DIAG_NL(2)%IWVL=380, +YAERO_WVL_DIAG_NL(2)%IGRIBDIAG=210219,215098,215116,215134,215152, +YAERO_WVL_DIAG_NL(3)%IWVL=440, +YAERO_WVL_DIAG_NL(3)%IGRIBDIAG=210221,215100,215118,215136,215154, +YAERO_WVL_DIAG_NL(4)%IWVL=670, +YAERO_WVL_DIAG_NL(4)%IGRIBDIAG=210214,215106,215124,215142,215160, +YAERO_WVL_DIAG_NL(5)%IWVL=870, +YAERO_WVL_DIAG_NL(5)%IGRIBDIAG=210215,215109,215127,215145,215163, +YAERO_WVL_DIAG_NL(6)%IWVL=1020, +YAERO_WVL_DIAG_NL(6)%IGRIBDIAG=210227,215110,215128,215146,215164, +NCHEM=74, +YCHEM_NL(1)%CNAME='O3', +YCHEM_NL(1)%NREQIN=1, +YCHEM_NL(1)%RMOLMASS=48.0, +YCHEM_NL(1)%IGRBCODE=210203, +YCHEM_NL(1)%LNEGFIX=.TRUE., +YCHEM_NL(1)%IGRIBTC=210206, +YCHEM_NL(1)%IGRIBDV=221001, +YCHEM_NL(1)%HENRYA=1.0e-2, +YCHEM_NL(1)%HENRYB=2800.0, +YCHEM_NL(1)%LQM=.false., +YCHEM_NL(1)%LQM3D=.TRUE., +YCHEM_NL(1)%LCOMAD=.true., +YCHEM_NL(1)%LADV=.TRUE., +YCHEM_NL(1)%LMASSFIX=.TRUE., +YCHEM_NL(1)%BETAMFBC=-999.9, +YCHEM_NL(1)%LASSIM=.TRUE., +YCHEM_NL(1)%LADV5=.TRUE., +YCHEM_NL(2)%CNAME='NOx', +YCHEM_NL(2)%NREQIN=0, +YCHEM_NL(2)%RMOLMASS=14.0, +YCHEM_NL(2)%IGRBCODE=210129, +YCHEM_NL(2)%LNEGFIX=.TRUE., +YCHEM_NL(2)%IGRIBTC=210130, +YCHEM_NL(2)%LQM=.false., +YCHEM_NL(2)%LQM3D=.TRUE., +YCHEM_NL(2)%LCOMAD=.true., +YCHEM_NL(2)%LADV=.TRUE., +YCHEM_NL(2)%LMASSFIX=.TRUE., +YCHEM_NL(2)%BETAMFBC=-999.9, +YCHEM_NL(2)%LASSIM=.FALSE., +YCHEM_NL(3)%CNAME='H2O2', +YCHEM_NL(3)%NREQIN=1, +YCHEM_NL(3)%RMOLMASS=34.0, +YCHEM_NL(3)%IGRBCODE=217003, +YCHEM_NL(3)%LNEGFIX=.TRUE., +YCHEM_NL(3)%IGRIBTC=218003, +YCHEM_NL(3)%IGRIBDV=221003, +YCHEM_NL(3)%HENRYA=8.3e4, +YCHEM_NL(3)%HENRYB=7600.0, +YCHEM_NL(3)%LQM=.false., +YCHEM_NL(3)%LQM3D=.TRUE., +YCHEM_NL(3)%LCOMAD=.true., +YCHEM_NL(3)%LADV=.TRUE., +YCHEM_NL(3)%LMASSFIX=.TRUE., +YCHEM_NL(3)%BETAMFBC=-999.9, +YCHEM_NL(3)%LASSIM=.FALSE., +YCHEM_NL(4)%CNAME='CH4', +YCHEM_NL(4)%NREQIN=1, +YCHEM_NL(4)%RMOLMASS=16.0, +YCHEM_NL(4)%IGRBCODE=217004, +YCHEM_NL(4)%LNEGFIX=.TRUE., +YCHEM_NL(4)%IGRIBTC=218004, +YCHEM_NL(4)%LQM=.false., +YCHEM_NL(4)%LQM3D=.TRUE., +YCHEM_NL(4)%LCOMAD=.true., +YCHEM_NL(4)%LADV=.TRUE., +YCHEM_NL(4)%LMASSFIX=.TRUE., +YCHEM_NL(4)%BETAMFBC=-999.9, +YCHEM_NL(4)%LASSIM=.FALSE., +YCHEM_NL(5)%CNAME='CO', +YCHEM_NL(5)%NREQIN=1, +YCHEM_NL(5)%RMOLMASS=28.0, +YCHEM_NL(5)%IGRBCODE=210123, +YCHEM_NL(5)%LNEGFIX=.TRUE., +YCHEM_NL(5)%IGRIBTC=210127, +YCHEM_NL(5)%IGRIBDV=221005, +YCHEM_NL(5)%HENRYA=9.7e-4, +YCHEM_NL(5)%HENRYB=1300.0, +YCHEM_NL(5)%LQM=.false., +YCHEM_NL(5)%LQM3D=.TRUE., +YCHEM_NL(5)%LCOMAD=.true., +YCHEM_NL(5)%LADV=.TRUE., +YCHEM_NL(5)%LMASSFIX=.TRUE., +YCHEM_NL(5)%BETAMFBC=-999.9, +YCHEM_NL(5)%LASSIM=.TRUE., +YCHEM_NL(5)%LADV5=.TRUE., +YCHEM_NL(6)%CNAME='HNO3', +YCHEM_NL(6)%NREQIN=1, +YCHEM_NL(6)%RMOLMASS=63.0, +YCHEM_NL(6)%IGRBCODE=217006, +YCHEM_NL(6)%LNEGFIX=.TRUE., +YCHEM_NL(6)%IGRIBTC=218006, +YCHEM_NL(6)%IGRIBDV=221006, +YCHEM_NL(6)%HENRYA=3.2e11, +YCHEM_NL(6)%HENRYB=8700.0, +YCHEM_NL(6)%LQM=.false., +YCHEM_NL(6)%LQM3D=.TRUE., +YCHEM_NL(6)%LCOMAD=.true., +YCHEM_NL(6)%LADV=.TRUE., +YCHEM_NL(6)%LMASSFIX=.TRUE., +YCHEM_NL(6)%BETAMFBC=-999.9, +YCHEM_NL(6)%LASSIM=.FALSE., +YCHEM_NL(7)%CNAME='CH3OOH', +YCHEM_NL(7)%NREQIN=1, +YCHEM_NL(7)%RMOLMASS=48.0, +YCHEM_NL(7)%IGRBCODE=217007, +YCHEM_NL(7)%LNEGFIX=.TRUE., +YCHEM_NL(7)%IGRIBTC=218007, +YCHEM_NL(7)%IGRIBDV=221007, +YCHEM_NL(7)%HENRYA=2.9e2, +YCHEM_NL(7)%HENRYB=5200.0, +YCHEM_NL(7)%LQM=.false., +YCHEM_NL(7)%LQM3D=.TRUE., +YCHEM_NL(7)%LCOMAD=.true., +YCHEM_NL(7)%LADV=.TRUE., +YCHEM_NL(7)%LMASSFIX=.TRUE., +YCHEM_NL(7)%BETAMFBC=-999.9, +YCHEM_NL(7)%LASSIM=.FALSE., +YCHEM_NL(8)%CNAME='CH2O', +YCHEM_NL(8)%NREQIN=1, +YCHEM_NL(8)%RMOLMASS=30.0, +YCHEM_NL(8)%IGRBCODE=210124, +YCHEM_NL(8)%LNEGFIX=.TRUE., +YCHEM_NL(8)%IGRIBTC=210128, +YCHEM_NL(8)%IGRIBDV=221008, +YCHEM_NL(8)%HENRYA=3.2e3, +YCHEM_NL(8)%HENRYB=6800.0, +YCHEM_NL(8)%LQM=.false., +YCHEM_NL(8)%LQM3D=.TRUE., +YCHEM_NL(8)%LCOMAD=.true., +YCHEM_NL(8)%LADV=.TRUE., +YCHEM_NL(8)%LMASSFIX=.TRUE., +YCHEM_NL(8)%BETAMFBC=-999.9, +YCHEM_NL(8)%LASSIM=.TRUE., +YCHEM_NL(8)%LADV5=.TRUE., +YCHEM_NL(9)%CNAME='PAR', +YCHEM_NL(9)%NREQIN=1, +YCHEM_NL(9)%RMOLMASS=12.0, +YCHEM_NL(9)%IGRBCODE=217009, +YCHEM_NL(9)%LNEGFIX=.TRUE., +YCHEM_NL(9)%IGRIBTC=218009, +YCHEM_NL(9)%LQM=.false., +YCHEM_NL(9)%LQM3D=.TRUE., +YCHEM_NL(9)%LCOMAD=.true., +YCHEM_NL(9)%LADV=.TRUE., +YCHEM_NL(9)%LMASSFIX=.TRUE., +YCHEM_NL(9)%BETAMFBC=-999.9, +YCHEM_NL(9)%LASSIM=.FALSE., +YCHEM_NL(10)%CNAME='C2H4', +YCHEM_NL(10)%NREQIN=1, +YCHEM_NL(10)%RMOLMASS=28.0, +YCHEM_NL(10)%IGRBCODE=217010, +YCHEM_NL(10)%LNEGFIX=.TRUE., +YCHEM_NL(10)%IGRIBTC=218010, +YCHEM_NL(10)%LQM=.false., +YCHEM_NL(10)%LQM3D=.TRUE., +YCHEM_NL(10)%LCOMAD=.true., +YCHEM_NL(10)%LADV=.TRUE., +YCHEM_NL(10)%LMASSFIX=.TRUE., +YCHEM_NL(10)%BETAMFBC=-999.9, +YCHEM_NL(10)%LASSIM=.FALSE., +YCHEM_NL(11)%CNAME='OLE', +YCHEM_NL(11)%NREQIN=1, +YCHEM_NL(11)%RMOLMASS=24.0, +YCHEM_NL(11)%IGRBCODE=217011, +YCHEM_NL(11)%LNEGFIX=.TRUE., +YCHEM_NL(11)%IGRIBTC=218011, +YCHEM_NL(11)%LQM=.false., +YCHEM_NL(11)%LQM3D=.TRUE., +YCHEM_NL(11)%LCOMAD=.true., +YCHEM_NL(11)%LADV=.TRUE., +YCHEM_NL(11)%LMASSFIX=.TRUE., +YCHEM_NL(11)%BETAMFBC=-999.9, +YCHEM_NL(11)%LASSIM=.FALSE., +YCHEM_NL(12)%CNAME='ALD2', +YCHEM_NL(12)%NREQIN=1, +YCHEM_NL(12)%RMOLMASS=24.0, +YCHEM_NL(12)%IGRBCODE=217012, +YCHEM_NL(12)%LNEGFIX=.TRUE., +YCHEM_NL(12)%IGRIBTC=218012, +YCHEM_NL(12)%IGRIBDV=221012, +YCHEM_NL(12)%HENRYA=17.0, +YCHEM_NL(12)%HENRYB=5000.0, +YCHEM_NL(12)%LQM=.false., +YCHEM_NL(12)%LQM3D=.TRUE., +YCHEM_NL(12)%LCOMAD=.true., +YCHEM_NL(12)%LADV=.TRUE., +YCHEM_NL(12)%LMASSFIX=.TRUE., +YCHEM_NL(12)%BETAMFBC=-999.9, +YCHEM_NL(12)%LASSIM=.FALSE., +YCHEM_NL(13)%CNAME='PAN', +YCHEM_NL(13)%NREQIN=1, +YCHEM_NL(13)%RMOLMASS=121.0, +YCHEM_NL(13)%IGRBCODE=217013, +YCHEM_NL(13)%LNEGFIX=.TRUE., +YCHEM_NL(13)%IGRIBTC=218013, +YCHEM_NL(13)%IGRIBDV=221013, +YCHEM_NL(13)%HENRYA=2.9e+0, +YCHEM_NL(13)%HENRYB=5700.0, +YCHEM_NL(13)%LQM=.false., +YCHEM_NL(13)%LQM3D=.TRUE., +YCHEM_NL(13)%LCOMAD=.true., +YCHEM_NL(13)%LADV=.TRUE., +YCHEM_NL(13)%LMASSFIX=.TRUE., +YCHEM_NL(13)%BETAMFBC=-999.9, +YCHEM_NL(13)%LASSIM=.FALSE., +YCHEM_NL(14)%CNAME='ROOH', +YCHEM_NL(14)%NREQIN=1, +YCHEM_NL(14)%RMOLMASS=47.0, +YCHEM_NL(14)%IGRBCODE=217014, +YCHEM_NL(14)%LNEGFIX=.TRUE., +YCHEM_NL(14)%IGRIBTC=218014, +YCHEM_NL(14)%IGRIBDV=221014, +YCHEM_NL(14)%HENRYA=340.0, +YCHEM_NL(14)%HENRYB=6000.0, +YCHEM_NL(14)%LQM=.false., +YCHEM_NL(14)%LQM3D=.TRUE., +YCHEM_NL(14)%LCOMAD=.true., +YCHEM_NL(14)%LADV=.TRUE., +YCHEM_NL(14)%LMASSFIX=.TRUE., +YCHEM_NL(14)%BETAMFBC=-999.9, +YCHEM_NL(14)%LASSIM=.FALSE., +YCHEM_NL(15)%CNAME='ONIT', +YCHEM_NL(15)%NREQIN=1, +YCHEM_NL(15)%RMOLMASS=77.0, +YCHEM_NL(15)%IGRBCODE=217015, +YCHEM_NL(15)%LNEGFIX=.TRUE., +YCHEM_NL(15)%IGRIBTC=218015, +YCHEM_NL(15)%IGRIBDV=221015, +YCHEM_NL(15)%HENRYA=1.0e3, +YCHEM_NL(15)%HENRYB=6485., +YCHEM_NL(15)%LQM=.false., +YCHEM_NL(15)%LQM3D=.TRUE., +YCHEM_NL(15)%LCOMAD=.true., +YCHEM_NL(15)%LADV=.TRUE., +YCHEM_NL(15)%LMASSFIX=.TRUE., +YCHEM_NL(15)%BETAMFBC=-999.9, +YCHEM_NL(15)%LASSIM=.FALSE., +YCHEM_NL(16)%CNAME='C5H8', +YCHEM_NL(16)%NREQIN=1, +YCHEM_NL(16)%RMOLMASS=68.1, +YCHEM_NL(16)%IGRBCODE=217016, +YCHEM_NL(16)%LNEGFIX=.TRUE., +YCHEM_NL(16)%IGRIBTC=218016, +YCHEM_NL(16)%IGRIBDV=221016, +YCHEM_NL(16)%HENRYA=1.3e-2, +YCHEM_NL(16)%HENRYB=0.0, +YCHEM_NL(16)%LQM=.false., +YCHEM_NL(16)%LQM3D=.TRUE., +YCHEM_NL(16)%LCOMAD=.true., +YCHEM_NL(16)%LADV=.TRUE., +YCHEM_NL(16)%LMASSFIX=.TRUE., +YCHEM_NL(16)%BETAMFBC=-999.9, +YCHEM_NL(16)%LASSIM=.FALSE., +YCHEM_NL(17)%CNAME='SO2', +YCHEM_NL(17)%NREQIN=1, +YCHEM_NL(17)%RMOLMASS=64.1, +YCHEM_NL(17)%IGRBCODE=210122, +YCHEM_NL(17)%LNEGFIX=.TRUE., +YCHEM_NL(17)%IGRIBTC=210126, +YCHEM_NL(17)%IGRIBDV=221017, +YCHEM_NL(17)%HENRYA=1.0e5, +YCHEM_NL(17)%HENRYB=3000.0, +YCHEM_NL(17)%LQM=.false., +YCHEM_NL(17)%LQM3D=.TRUE., +YCHEM_NL(17)%LCOMAD=.true., +YCHEM_NL(17)%LADV=.TRUE., +YCHEM_NL(17)%LMASSFIX=.TRUE., +YCHEM_NL(17)%BETAMFBC=-999.9, +YCHEM_NL(17)%LASSIM=.TRUE., +YCHEM_NL(17)%LADV5=.TRUE., +YCHEM_NL(18)%CNAME='DMS', +YCHEM_NL(18)%NREQIN=1, +YCHEM_NL(18)%RMOLMASS=62.1, +YCHEM_NL(18)%IGRBCODE=217018, +YCHEM_NL(18)%LNEGFIX=.TRUE., +YCHEM_NL(18)%IGRIBTC=218018, +YCHEM_NL(18)%LQM=.false., +YCHEM_NL(18)%LQM3D=.TRUE., +YCHEM_NL(18)%LCOMAD=.true., +YCHEM_NL(18)%LADV=.TRUE., +YCHEM_NL(18)%LMASSFIX=.TRUE., +YCHEM_NL(18)%BETAMFBC=-999.9, +YCHEM_NL(18)%LASSIM=.FALSE., +YCHEM_NL(19)%CNAME='NH3', +YCHEM_NL(19)%NREQIN=1, +YCHEM_NL(19)%RMOLMASS=17.0, +YCHEM_NL(19)%IGRBCODE=217019, +YCHEM_NL(19)%LNEGFIX=.TRUE., +YCHEM_NL(19)%IGRIBTC=218019, +YCHEM_NL(19)%IGRIBDV=221019, +YCHEM_NL(19)%HENRYA=59.0, +YCHEM_NL(19)%HENRYB=4200.0, +YCHEM_NL(19)%LQM=.false., +YCHEM_NL(19)%LQM3D=.TRUE., +YCHEM_NL(19)%LCOMAD=.true., +YCHEM_NL(19)%LADV=.TRUE., +YCHEM_NL(19)%LMASSFIX=.TRUE., +YCHEM_NL(19)%BETAMFBC=-999.9, +YCHEM_NL(19)%LASSIM=.FALSE., +YCHEM_NL(20)%CNAME='SO4', +YCHEM_NL(20)%NREQIN=-1, +YCHEM_NL(20)%RMOLMASS=96.1, +YCHEM_NL(20)%IGRBCODE=217020, +YCHEM_NL(20)%LNEGFIX=.TRUE., +YCHEM_NL(20)%IGRIBTC=218020, +YCHEM_NL(20)%IGRIBDV=221020, +YCHEM_NL(20)%HENRYA=3.2e11, +YCHEM_NL(20)%HENRYB=8700.0, +YCHEM_NL(20)%LQM=.false., +YCHEM_NL(20)%LQM3D=.TRUE., +YCHEM_NL(20)%LCOMAD=.true., +YCHEM_NL(20)%LADV=.TRUE., +YCHEM_NL(20)%LMASSFIX=.TRUE., +YCHEM_NL(20)%BETAMFBC=-999.9, +YCHEM_NL(20)%LASSIM=.FALSE., +YCHEM_NL(21)%CNAME='NH4', +YCHEM_NL(21)%NREQIN=1, +YCHEM_NL(21)%RMOLMASS=18.0, +YCHEM_NL(21)%IGRBCODE=217021, +YCHEM_NL(21)%LNEGFIX=.TRUE., +YCHEM_NL(21)%IGRIBTC=218021, +YCHEM_NL(21)%IGRIBDV=221021, +YCHEM_NL(21)%HENRYA=3.2e11, +YCHEM_NL(21)%HENRYB=8700.0, +YCHEM_NL(21)%LQM=.false., +YCHEM_NL(21)%LQM3D=.TRUE., +YCHEM_NL(21)%LCOMAD=.true., +YCHEM_NL(21)%LADV=.TRUE., +YCHEM_NL(21)%LMASSFIX=.TRUE., +YCHEM_NL(21)%BETAMFBC=-999.9, +YCHEM_NL(21)%LASSIM=.FALSE., +YCHEM_NL(22)%CNAME='MSA', +YCHEM_NL(22)%NREQIN=1, +YCHEM_NL(22)%RMOLMASS=96.1, +YCHEM_NL(22)%IGRBCODE=217022, +YCHEM_NL(22)%LNEGFIX=.TRUE., +YCHEM_NL(22)%IGRIBTC=218022, +YCHEM_NL(22)%HENRYA=3.2e11, +YCHEM_NL(22)%HENRYB=8700.0, +YCHEM_NL(22)%LQM=.false., +YCHEM_NL(22)%LQM3D=.TRUE., +YCHEM_NL(22)%LCOMAD=.true., +YCHEM_NL(22)%LADV=.TRUE., +YCHEM_NL(22)%LMASSFIX=.TRUE., +YCHEM_NL(22)%BETAMFBC=-999.9, +YCHEM_NL(22)%LASSIM=.FALSE., +YCHEM_NL(23)%CNAME='CH3COCHO', +YCHEM_NL(23)%NREQIN=1, +YCHEM_NL(23)%RMOLMASS=72.1, +YCHEM_NL(23)%IGRBCODE=217023, +YCHEM_NL(23)%LNEGFIX=.TRUE., +YCHEM_NL(23)%IGRIBTC=218023, +YCHEM_NL(23)%IGRIBDV=221023, +YCHEM_NL(23)%HENRYA=3.4e3, +YCHEM_NL(23)%HENRYB=7500.0, +YCHEM_NL(23)%LQM=.false., +YCHEM_NL(23)%LQM3D=.TRUE., +YCHEM_NL(23)%LCOMAD=.true., +YCHEM_NL(23)%LADV=.TRUE., +YCHEM_NL(23)%LMASSFIX=.TRUE., +YCHEM_NL(23)%BETAMFBC=-999.9, +YCHEM_NL(23)%LASSIM=.FALSE., +YCHEM_NL(24)%CNAME='O3S', +YCHEM_NL(24)%NREQIN=1, +YCHEM_NL(24)%RMOLMASS=48.0, +YCHEM_NL(24)%IGRBCODE=217024, +YCHEM_NL(24)%LNEGFIX=.TRUE., +YCHEM_NL(24)%IGRIBTC=218024, +YCHEM_NL(24)%IGRIBDV=221024, +YCHEM_NL(24)%HENRYA=1.0e-2, +YCHEM_NL(24)%HENRYB=2800.0, +YCHEM_NL(24)%LQM=.false., +YCHEM_NL(24)%LQM3D=.TRUE., +YCHEM_NL(24)%LCOMAD=.true., +YCHEM_NL(24)%LADV=.TRUE., +YCHEM_NL(24)%LMASSFIX=.TRUE., +YCHEM_NL(24)%BETAMFBC=-999.9, +YCHEM_NL(24)%LASSIM=.FALSE., +YCHEM_NL(25)%CNAME='Rn', +YCHEM_NL(25)%NREQIN=1, +YCHEM_NL(25)%RMOLMASS=222.0, +YCHEM_NL(25)%IGRBCODE=210181, +YCHEM_NL(25)%LNEGFIX=.TRUE., +YCHEM_NL(25)%IGRIBTC=210183, +YCHEM_NL(25)%LQM=.false., +YCHEM_NL(25)%LQM3D=.TRUE., +YCHEM_NL(25)%LCOMAD=.true., +YCHEM_NL(25)%LADV=.TRUE., +YCHEM_NL(25)%LMASSFIX=.TRUE., +YCHEM_NL(25)%BETAMFBC=-999.9, +YCHEM_NL(25)%LASSIM=.FALSE., +YCHEM_NL(26)%CNAME='Pb', +YCHEM_NL(26)%NREQIN=1, +YCHEM_NL(26)%RMOLMASS=210.0, +YCHEM_NL(26)%IGRBCODE=217026, +YCHEM_NL(26)%LNEGFIX=.TRUE., +YCHEM_NL(26)%IGRIBTC=218026, +YCHEM_NL(26)%HENRYA=3.2e11, +YCHEM_NL(26)%HENRYB=8700.0, +YCHEM_NL(26)%LQM=.false., +YCHEM_NL(26)%LQM3D=.TRUE., +YCHEM_NL(26)%LCOMAD=.true., +YCHEM_NL(26)%LADV=.TRUE., +YCHEM_NL(26)%LMASSFIX=.TRUE., +YCHEM_NL(26)%BETAMFBC=-999.9, +YCHEM_NL(26)%LASSIM=.FALSE., +YCHEM_NL(27)%CNAME='NO', +YCHEM_NL(27)%NREQIN=1, +YCHEM_NL(27)%RMOLMASS=30.0, +YCHEM_NL(27)%IGRBCODE=217027, +YCHEM_NL(27)%LNEGFIX=.TRUE., +YCHEM_NL(27)%IGRIBTC=218027, +YCHEM_NL(27)%IGRIBDV=221027, +YCHEM_NL(27)%HENRYA=1.9e-3, +YCHEM_NL(27)%HENRYB=1600.0, +YCHEM_NL(27)%LQM=.false., +YCHEM_NL(27)%LQM3D=.TRUE., +YCHEM_NL(27)%LCOMAD=.true., +YCHEM_NL(27)%LADV=.TRUE., +YCHEM_NL(27)%LMASSFIX=.FALSE., +YCHEM_NL(27)%LASSIM=.FALSE., +YCHEM_NL(27)%LADV5=.TRUE., +YCHEM_NL(28)%CNAME='HO2', +YCHEM_NL(28)%NREQIN=1, +YCHEM_NL(28)%RMOLMASS=33.0, +YCHEM_NL(28)%IGRBCODE=217028, +YCHEM_NL(28)%LNEGFIX=.TRUE., +YCHEM_NL(28)%IGRIBTC=218028, +YCHEM_NL(28)%IGRIBDV=221028, +YCHEM_NL(28)%HENRYA=6.8e2, +YCHEM_NL(28)%HENRYB=0.0, +YCHEM_NL(28)%LQM=.false., +YCHEM_NL(28)%LQM3D=.TRUE., +YCHEM_NL(28)%LCOMAD=.true., +YCHEM_NL(28)%LADV=.FALSE., +YCHEM_NL(28)%LMASSFIX=.FALSE., +YCHEM_NL(28)%LMASSFIX=.FALSE., +YCHEM_NL(28)%LASSIM=.FALSE., +YCHEM_NL(29)%CNAME='CH3O2', +YCHEM_NL(29)%NREQIN=1, +YCHEM_NL(29)%RMOLMASS=47.0, +YCHEM_NL(29)%IGRBCODE=217029, +YCHEM_NL(29)%LNEGFIX=.TRUE., +YCHEM_NL(29)%IGRIBTC=218029, +YCHEM_NL(29)%IGRIBDV=221029, +YCHEM_NL(29)%HENRYA=1.5e1, +YCHEM_NL(29)%HENRYB=3700.0, +YCHEM_NL(29)%LQM=.false., +YCHEM_NL(29)%LQM3D=.TRUE., +YCHEM_NL(29)%LCOMAD=.true., +YCHEM_NL(29)%LADV=.FALSE., +YCHEM_NL(29)%LMASSFIX=.FALSE., +YCHEM_NL(29)%LMASSFIX=.FALSE., +YCHEM_NL(29)%LASSIM=.FALSE., +YCHEM_NL(30)%CNAME='OH', +YCHEM_NL(30)%NREQIN=1, +YCHEM_NL(30)%RMOLMASS=17.0, +YCHEM_NL(30)%IGRBCODE=217030, +YCHEM_NL(30)%LNEGFIX=.TRUE., +YCHEM_NL(30)%IGRIBTC=218030, +YCHEM_NL(30)%LQM=.false., +YCHEM_NL(30)%LQM3D=.TRUE., +YCHEM_NL(30)%LCOMAD=.true., +YCHEM_NL(30)%LADV=.FALSE., +YCHEM_NL(30)%LMASSFIX=.FALSE., +YCHEM_NL(30)%LMASSFIX=.FALSE., +YCHEM_NL(30)%LASSIM=.FALSE., +YCHEM_NL(30)%LADV5=.TRUE., +YCHEM_NL(31)%CNAME='NO2', +YCHEM_NL(31)%NREQIN=1, +YCHEM_NL(31)%RMOLMASS=46.0, +YCHEM_NL(31)%IGRBCODE=210121, +YCHEM_NL(31)%LNEGFIX=.TRUE., +YCHEM_NL(31)%IGRIBTC=210125, +YCHEM_NL(31)%IGRIBDV=221031, +YCHEM_NL(31)%HENRYA=1.2e-2, +YCHEM_NL(31)%HENRYB=2400.0, +YCHEM_NL(31)%LQM=.false., +YCHEM_NL(31)%LQM3D=.TRUE., +YCHEM_NL(31)%LCOMAD=.true., +YCHEM_NL(31)%LADV=.TRUE., +YCHEM_NL(31)%LMASSFIX=.FALSE., +YCHEM_NL(31)%LASSIM=.TRUE., +YCHEM_NL(31)%LADV5=.TRUE., +YCHEM_NL(32)%CNAME='NO3', +YCHEM_NL(32)%NREQIN=1, +YCHEM_NL(32)%RMOLMASS=62.0, +YCHEM_NL(32)%IGRBCODE=217032, +YCHEM_NL(32)%LNEGFIX=.TRUE., +YCHEM_NL(32)%IGRIBTC=218032, +YCHEM_NL(32)%IGRIBDV=221032, +YCHEM_NL(32)%HENRYA=3.8e-2, +YCHEM_NL(32)%HENRYB=0., +YCHEM_NL(32)%LQM=.false., +YCHEM_NL(32)%LQM3D=.TRUE., +YCHEM_NL(32)%LCOMAD=.true., +YCHEM_NL(32)%LADV=.TRUE., +YCHEM_NL(32)%LMASSFIX=.FALSE., +YCHEM_NL(32)%LASSIM=.FALSE., +YCHEM_NL(33)%CNAME='N2O5', +YCHEM_NL(33)%NREQIN=1, +YCHEM_NL(33)%RMOLMASS=108.0, +YCHEM_NL(33)%IGRBCODE=217033, +YCHEM_NL(33)%LNEGFIX=.TRUE., +YCHEM_NL(33)%IGRIBTC=218033, +YCHEM_NL(33)%IGRIBDV=221033, +YCHEM_NL(33)%HENRYA=2.1e+1, +YCHEM_NL(33)%HENRYB=3400.0, +YCHEM_NL(33)%LQM=.false., +YCHEM_NL(33)%LQM3D=.TRUE., +YCHEM_NL(33)%LCOMAD=.true., +YCHEM_NL(33)%LADV=.TRUE., +YCHEM_NL(33)%LMASSFIX=.TRUE., +YCHEM_NL(33)%BETAMFBC=-999.9, +YCHEM_NL(33)%LASSIM=.FALSE., +YCHEM_NL(34)%CNAME='HO2NO2', +YCHEM_NL(34)%NREQIN=1, +YCHEM_NL(34)%RMOLMASS=79.0, +YCHEM_NL(34)%IGRBCODE=217034, +YCHEM_NL(34)%LNEGFIX=.TRUE., +YCHEM_NL(34)%IGRIBTC=218034, +YCHEM_NL(34)%IGRIBDV=221034, +YCHEM_NL(34)%HENRYA=1.2e+4, +YCHEM_NL(34)%HENRYB=6900.0, +YCHEM_NL(34)%LQM=.false., +YCHEM_NL(34)%LQM3D=.TRUE., +YCHEM_NL(34)%LCOMAD=.true., +YCHEM_NL(34)%LADV=.TRUE., +YCHEM_NL(34)%LMASSFIX=.TRUE., +YCHEM_NL(34)%BETAMFBC=-999.9, +YCHEM_NL(34)%LASSIM=.FALSE., +YCHEM_NL(35)%CNAME='C2O3', +YCHEM_NL(35)%NREQIN=1, +YCHEM_NL(35)%RMOLMASS=75.0, +YCHEM_NL(35)%IGRBCODE=217035, +YCHEM_NL(35)%LNEGFIX=.TRUE., +YCHEM_NL(35)%IGRIBTC=218035, +YCHEM_NL(35)%LQM=.false., +YCHEM_NL(35)%LQM3D=.TRUE., +YCHEM_NL(35)%LCOMAD=.true., +YCHEM_NL(35)%LADV=.FALSE., +YCHEM_NL(35)%LMASSFIX=.FALSE., +YCHEM_NL(35)%LMASSFIX=.FALSE., +YCHEM_NL(35)%LASSIM=.FALSE., +YCHEM_NL(36)%CNAME='ROR', +YCHEM_NL(36)%NREQIN=1, +YCHEM_NL(36)%RMOLMASS=28.0, +YCHEM_NL(36)%IGRBCODE=217036, +YCHEM_NL(36)%LNEGFIX=.TRUE., +YCHEM_NL(36)%IGRIBTC=218036, +YCHEM_NL(36)%LQM=.false., +YCHEM_NL(36)%LQM3D=.TRUE., +YCHEM_NL(36)%LCOMAD=.true., +YCHEM_NL(36)%LADV=.FALSE., +YCHEM_NL(36)%LMASSFIX=.FALSE., +YCHEM_NL(36)%LMASSFIX=.FALSE., +YCHEM_NL(36)%LASSIM=.FALSE., +YCHEM_NL(37)%CNAME='RXPAR', +YCHEM_NL(37)%NREQIN=1, +YCHEM_NL(37)%RMOLMASS=12.0, +YCHEM_NL(37)%IGRBCODE=217037, +YCHEM_NL(37)%LNEGFIX=.TRUE., +YCHEM_NL(37)%IGRIBTC=218037, +YCHEM_NL(37)%LQM=.false., +YCHEM_NL(37)%LQM3D=.TRUE., +YCHEM_NL(37)%LCOMAD=.true., +YCHEM_NL(37)%LADV=.FALSE., +YCHEM_NL(37)%LMASSFIX=.FALSE., +YCHEM_NL(37)%LMASSFIX=.FALSE., +YCHEM_NL(37)%LASSIM=.FALSE., +YCHEM_NL(38)%CNAME='XO2', +YCHEM_NL(38)%NREQIN=1, +YCHEM_NL(38)%RMOLMASS=44.0, +YCHEM_NL(38)%IGRBCODE=217038, +YCHEM_NL(38)%LNEGFIX=.TRUE., +YCHEM_NL(38)%IGRIBTC=218038, +YCHEM_NL(38)%LQM=.false., +YCHEM_NL(38)%LQM3D=.TRUE., +YCHEM_NL(38)%LCOMAD=.true., +YCHEM_NL(38)%LADV=.FALSE., +YCHEM_NL(38)%LMASSFIX=.FALSE., +YCHEM_NL(38)%LMASSFIX=.FALSE., +YCHEM_NL(38)%LASSIM=.FALSE., +YCHEM_NL(39)%CNAME='XO2N', +YCHEM_NL(39)%NREQIN=1, +YCHEM_NL(39)%RMOLMASS=44.0, +YCHEM_NL(39)%IGRBCODE=217039, +YCHEM_NL(39)%LNEGFIX=.TRUE., +YCHEM_NL(39)%IGRIBTC=218039, +YCHEM_NL(39)%LQM=.false., +YCHEM_NL(39)%LQM3D=.TRUE., +YCHEM_NL(39)%LCOMAD=.true., +YCHEM_NL(39)%LADV=.FALSE., +YCHEM_NL(39)%LMASSFIX=.FALSE., +YCHEM_NL(39)%LMASSFIX=.FALSE., +YCHEM_NL(39)%LASSIM=.FALSE., +YCHEM_NL(40)%CNAME='NH2', +YCHEM_NL(40)%NREQIN=1, +YCHEM_NL(40)%RMOLMASS=16.0, +YCHEM_NL(40)%IGRBCODE=217040, +YCHEM_NL(40)%LNEGFIX=.TRUE., +YCHEM_NL(40)%IGRIBTC=218040, +YCHEM_NL(40)%LQM=.false., +YCHEM_NL(40)%LQM3D=.TRUE., +YCHEM_NL(40)%LCOMAD=.true., +YCHEM_NL(40)%LADV=.FALSE., +YCHEM_NL(40)%LMASSFIX=.FALSE., +YCHEM_NL(40)%LMASSFIX=.FALSE., +YCHEM_NL(40)%LASSIM=.FALSE., +YCHEM_NL(41)%CNAME='PSC', +YCHEM_NL(41)%NREQIN=0, +YCHEM_NL(41)%RMOLMASS=1.0, +YCHEM_NL(41)%IGRBCODE=217041, +YCHEM_NL(41)%LNEGFIX=.TRUE., +YCHEM_NL(41)%IGRIBTC=218041, +YCHEM_NL(41)%LQM=.false., +YCHEM_NL(41)%LQM3D=.TRUE., +YCHEM_NL(41)%LCOMAD=.true., +YCHEM_NL(41)%LADV=.TRUE., +YCHEM_NL(41)%LMASSFIX=.FALSE., +YCHEM_NL(41)%REFVALI=0.0, +YCHEM_NL(41)%NREQIN=-1, +YCHEM_NL(41)%LASSIM=.FALSE., +YCHEM_NL(42)%CNAME='CH3OH', +YCHEM_NL(42)%NREQIN=1, +YCHEM_NL(42)%RMOLMASS=31.01, +YCHEM_NL(42)%IGRBCODE=217042, +YCHEM_NL(42)%LNEGFIX=.TRUE., +YCHEM_NL(42)%IGRIBTC=218042, +YCHEM_NL(42)%IGRIBDV=221042, +YCHEM_NL(42)%HENRYA=200.0, +YCHEM_NL(42)%HENRYB=5600.0, +YCHEM_NL(42)%LQM=.false., +YCHEM_NL(42)%LQM3D=.TRUE., +YCHEM_NL(42)%LCOMAD=.true., +YCHEM_NL(42)%LADV=.TRUE., +YCHEM_NL(42)%LMASSFIX=.TRUE., +YCHEM_NL(42)%BETAMFBC=-999.9, +YCHEM_NL(42)%LASSIM=.FALSE., +YCHEM_NL(43)%CNAME='HCOOH', +YCHEM_NL(43)%NREQIN=1, +YCHEM_NL(43)%RMOLMASS=46.01, +YCHEM_NL(43)%IGRBCODE=217043, +YCHEM_NL(43)%LNEGFIX=.TRUE., +YCHEM_NL(43)%IGRIBTC=218043, +YCHEM_NL(43)%IGRIBDV=221043, +YCHEM_NL(43)%HENRYA=8.8e3, +YCHEM_NL(43)%HENRYB=6100.0, +YCHEM_NL(43)%LQM=.false., +YCHEM_NL(43)%LQM3D=.TRUE., +YCHEM_NL(43)%LCOMAD=.true., +YCHEM_NL(43)%LADV=.TRUE., +YCHEM_NL(43)%LMASSFIX=.TRUE., +YCHEM_NL(43)%BETAMFBC=-999.9, +YCHEM_NL(43)%LASSIM=.FALSE., +YCHEM_NL(44)%CNAME='MCOOH', +YCHEM_NL(44)%NREQIN=1, +YCHEM_NL(44)%RMOLMASS=62.02, +YCHEM_NL(44)%IGRBCODE=217044, +YCHEM_NL(44)%LNEGFIX=.TRUE., +YCHEM_NL(44)%IGRIBTC=218044, +YCHEM_NL(44)%IGRIBDV=221044, +YCHEM_NL(44)%HENRYA=4.1e3, +YCHEM_NL(44)%HENRYB=6300.0, +YCHEM_NL(44)%LQM=.false., +YCHEM_NL(44)%LQM3D=.TRUE., +YCHEM_NL(44)%LCOMAD=.true., +YCHEM_NL(44)%LADV=.TRUE., +YCHEM_NL(44)%LMASSFIX=.TRUE., +YCHEM_NL(44)%BETAMFBC=-999.9, +YCHEM_NL(44)%LASSIM=.FALSE., +YCHEM_NL(45)%CNAME='C2H6', +YCHEM_NL(45)%NREQIN=1, +YCHEM_NL(45)%RMOLMASS=30.02, +YCHEM_NL(45)%IGRBCODE=217045, +YCHEM_NL(45)%LNEGFIX=.TRUE., +YCHEM_NL(45)%IGRIBTC=218045, +YCHEM_NL(45)%IGRIBDV=221045, +YCHEM_NL(45)%HENRYA=1.9e-3, +YCHEM_NL(45)%HENRYB=2400.0, +YCHEM_NL(45)%LQM=.false., +YCHEM_NL(45)%LQM3D=.TRUE., +YCHEM_NL(45)%LCOMAD=.true., +YCHEM_NL(45)%LADV=.TRUE., +YCHEM_NL(45)%LMASSFIX=.TRUE., +YCHEM_NL(45)%BETAMFBC=-999.9, +YCHEM_NL(45)%LASSIM=.FALSE., +YCHEM_NL(46)%CNAME='C2H5OH', +YCHEM_NL(46)%NREQIN=1, +YCHEM_NL(46)%RMOLMASS=46.02, +YCHEM_NL(46)%IGRBCODE=217046, +YCHEM_NL(46)%LNEGFIX=.TRUE., +YCHEM_NL(46)%IGRIBTC=218046, +YCHEM_NL(46)%IGRIBDV=221046, +YCHEM_NL(46)%HENRYA=190.0, +YCHEM_NL(46)%HENRYB=6400.0, +YCHEM_NL(46)%LQM=.false., +YCHEM_NL(46)%LQM3D=.TRUE., +YCHEM_NL(46)%LCOMAD=.true., +YCHEM_NL(46)%LADV=.TRUE., +YCHEM_NL(46)%LMASSFIX=.TRUE., +YCHEM_NL(46)%BETAMFBC=-999.9, +YCHEM_NL(46)%LASSIM=.FALSE., +YCHEM_NL(47)%CNAME='C3H8', +YCHEM_NL(47)%NREQIN=1, +YCHEM_NL(47)%RMOLMASS=44.03, +YCHEM_NL(47)%IGRBCODE=217047, +YCHEM_NL(47)%LNEGFIX=.TRUE., +YCHEM_NL(47)%IGRIBTC=218047, +YCHEM_NL(47)%LQM=.false., +YCHEM_NL(47)%LQM3D=.TRUE., +YCHEM_NL(47)%LCOMAD=.true., +YCHEM_NL(47)%LADV=.TRUE., +YCHEM_NL(47)%LMASSFIX=.TRUE., +YCHEM_NL(47)%BETAMFBC=-999.9, +YCHEM_NL(47)%LASSIM=.FALSE., +YCHEM_NL(48)%CNAME='C3H6', +YCHEM_NL(48)%NREQIN=1, +YCHEM_NL(48)%RMOLMASS=42.03, +YCHEM_NL(48)%IGRBCODE=217048, +YCHEM_NL(48)%LNEGFIX=.TRUE., +YCHEM_NL(48)%IGRIBTC=218048, +YCHEM_NL(48)%LQM=.false., +YCHEM_NL(48)%LQM3D=.TRUE., +YCHEM_NL(48)%LCOMAD=.true., +YCHEM_NL(48)%LADV=.TRUE., +YCHEM_NL(48)%LMASSFIX=.TRUE., +YCHEM_NL(48)%BETAMFBC=-999.9, +YCHEM_NL(48)%LASSIM=.FALSE., +YCHEM_NL(49)%CNAME='C10H16', +YCHEM_NL(49)%NREQIN=1, +YCHEM_NL(49)%RMOLMASS=136.0, +YCHEM_NL(49)%IGRBCODE=217049, +YCHEM_NL(49)%LNEGFIX=.TRUE., +YCHEM_NL(49)%IGRIBTC=218049, +YCHEM_NL(49)%LQM=.false., +YCHEM_NL(49)%LQM3D=.TRUE., +YCHEM_NL(49)%LCOMAD=.true., +YCHEM_NL(49)%LADV=.TRUE., +YCHEM_NL(49)%LMASSFIX=.TRUE., +YCHEM_NL(49)%BETAMFBC=-999.9, +YCHEM_NL(49)%LASSIM=.FALSE., +YCHEM_NL(50)%CNAME='ISPD', +YCHEM_NL(50)%NREQIN=1, +YCHEM_NL(50)%RMOLMASS=70.0, +YCHEM_NL(50)%IGRBCODE=217050, +YCHEM_NL(50)%LNEGFIX=.TRUE., +YCHEM_NL(50)%IGRIBTC=218050, +YCHEM_NL(50)%IGRIBDV=221050, +YCHEM_NL(50)%HENRYA=4.3, +YCHEM_NL(50)%HENRYB=5300.0, +YCHEM_NL(50)%LQM=.false., +YCHEM_NL(50)%LQM3D=.TRUE., +YCHEM_NL(50)%LCOMAD=.true., +YCHEM_NL(50)%LADV=.TRUE., +YCHEM_NL(50)%LMASSFIX=.TRUE., +YCHEM_NL(50)%BETAMFBC=-999.9, +YCHEM_NL(50)%LASSIM=.FALSE., +YCHEM_NL(51)%CNAME='NO3_A', +YCHEM_NL(51)%NREQIN=1, +YCHEM_NL(51)%RMOLMASS=62.0, +YCHEM_NL(51)%IGRBCODE=217051, +YCHEM_NL(51)%LNEGFIX=.TRUE., +YCHEM_NL(51)%IGRIBTC=218051, +YCHEM_NL(51)%IGRIBDV=221051, +YCHEM_NL(51)%HENRYA=3.2e11, +YCHEM_NL(51)%HENRYB=8700.0, +YCHEM_NL(51)%LQM=.false., +YCHEM_NL(51)%LQM3D=.TRUE., +YCHEM_NL(51)%LCOMAD=.true., +YCHEM_NL(51)%LADV=.TRUE., +YCHEM_NL(51)%LMASSFIX=.TRUE., +YCHEM_NL(51)%BETAMFBC=-999.9, +YCHEM_NL(51)%LASSIM=.FALSE., +YCHEM_NL(52)%CNAME='CH3COCH3', +YCHEM_NL(52)%NREQIN=1, +YCHEM_NL(52)%RMOLMASS=58.0, +YCHEM_NL(52)%IGRBCODE=217052, +YCHEM_NL(52)%LNEGFIX=.TRUE., +YCHEM_NL(52)%IGRIBTC=218052, +YCHEM_NL(52)%IGRIBDV=221052, +YCHEM_NL(52)%HENRYA=27.0, +YCHEM_NL(52)%HENRYB=5500.0, +YCHEM_NL(52)%LQM=.false., +YCHEM_NL(52)%LQM3D=.TRUE., +YCHEM_NL(52)%LCOMAD=.true., +YCHEM_NL(52)%LADV=.TRUE., +YCHEM_NL(52)%LMASSFIX=.TRUE., +YCHEM_NL(52)%BETAMFBC=-999.9, +YCHEM_NL(52)%LASSIM=.FALSE., +YCHEM_NL(53)%CNAME='ACO2', +YCHEM_NL(53)%NREQIN=1, +YCHEM_NL(53)%RMOLMASS=58.0, +YCHEM_NL(53)%IGRBCODE=217053, +YCHEM_NL(53)%LNEGFIX=.TRUE., +YCHEM_NL(53)%IGRIBTC=218053, +YCHEM_NL(53)%LQM=.false., +YCHEM_NL(53)%LQM3D=.TRUE., +YCHEM_NL(53)%LCOMAD=.true., +YCHEM_NL(53)%LADV=.FALSE., +YCHEM_NL(53)%LMASSFIX=.FALSE., +YCHEM_NL(53)%LMASSFIX=.FALSE., +YCHEM_NL(53)%LASSIM=.FALSE., +YCHEM_NL(54)%CNAME='IC3H7O2', +YCHEM_NL(54)%NREQIN=1, +YCHEM_NL(54)%RMOLMASS=75.0, +YCHEM_NL(54)%IGRBCODE=217054, +YCHEM_NL(54)%LNEGFIX=.TRUE., +YCHEM_NL(54)%IGRIBTC=218054, +YCHEM_NL(54)%LQM=.false., +YCHEM_NL(54)%LQM3D=.TRUE., +YCHEM_NL(54)%LCOMAD=.true., +YCHEM_NL(54)%LADV=.FALSE., +YCHEM_NL(54)%LMASSFIX=.FALSE., +YCHEM_NL(54)%LMASSFIX=.FALSE., +YCHEM_NL(54)%LASSIM=.FALSE., +YCHEM_NL(55)%CNAME='HYPROPO2', +YCHEM_NL(55)%NREQIN=1, +YCHEM_NL(55)%RMOLMASS=91.0, +YCHEM_NL(55)%IGRBCODE=217055, +YCHEM_NL(55)%LNEGFIX=.TRUE., +YCHEM_NL(55)%IGRIBTC=218055, +YCHEM_NL(55)%LQM=.false., +YCHEM_NL(55)%LQM3D=.TRUE., +YCHEM_NL(55)%LCOMAD=.true., +YCHEM_NL(55)%LADV=.FALSE., +YCHEM_NL(55)%LMASSFIX=.FALSE., +YCHEM_NL(55)%LMASSFIX=.FALSE., +YCHEM_NL(55)%LASSIM=.FALSE., +YCHEM_NL(56)%CNAME='SO3', +YCHEM_NL(56)%NREQIN=1, +YCHEM_NL(56)%RMOLMASS=80.0, +YCHEM_NL(56)%IGRBCODE=217189, +YCHEM_NL(56)%LNEGFIX=.TRUE., +YCHEM_NL(56)%IGRIBTC=218189, +YCHEM_NL(56)%LQM=.false., +YCHEM_NL(56)%LQM3D=.TRUE., +YCHEM_NL(56)%LCOMAD=.true., +YCHEM_NL(56)%LADV=.TRUE., +YCHEM_NL(56)%LMASSFIX=.TRUE., +YCHEM_NL(56)%BETAMFBC=-999.9, +YCHEM_NL(56)%LASSIM=.FALSE., +YCHEM_NL(57)%CNAME='CH3O2NO2', +YCHEM_NL(57)%NREQIN=1, +YCHEM_NL(57)%RMOLMASS=93.0, +YCHEM_NL(57)%IGRBCODE=217225, +YCHEM_NL(57)%LNEGFIX=.TRUE., +YCHEM_NL(57)%IGRIBTC=218225, +YCHEM_NL(57)%LQM=.false., +YCHEM_NL(57)%LQM3D=.TRUE., +YCHEM_NL(57)%LCOMAD=.true., +YCHEM_NL(57)%LADV=.TRUE., +YCHEM_NL(57)%LMASSFIX=.TRUE., +YCHEM_NL(57)%BETAMFBC=-999.9, +YCHEM_NL(57)%LASSIM=.FALSE., +YCHEM_NL(58)%CNAME='HONO', +YCHEM_NL(58)%NREQIN=1, +YCHEM_NL(58)%RMOLMASS=47.0, +YCHEM_NL(58)%IGRBCODE=217086, +YCHEM_NL(58)%LNEGFIX=.TRUE., +YCHEM_NL(58)%IGRIBTC=218086, +YCHEM_NL(58)%IGRIBDV=221086, +YCHEM_NL(58)%HENRYA=4.8e+1, +YCHEM_NL(58)%HENRYB=4800.0, +YCHEM_NL(58)%LQM=.false., +YCHEM_NL(58)%LQM3D=.TRUE., +YCHEM_NL(58)%LCOMAD=.true., +YCHEM_NL(58)%LADV=.TRUE., +YCHEM_NL(58)%LMASSFIX=.TRUE., +YCHEM_NL(58)%BETAMFBC=-999.9, +YCHEM_NL(58)%LASSIM=.FALSE., +YCHEM_NL(59)%CNAME='HCN', +YCHEM_NL(59)%NREQIN=1, +YCHEM_NL(59)%RMOLMASS=27.0, +YCHEM_NL(59)%IGRBCODE=217226, +YCHEM_NL(59)%LNEGFIX=.TRUE., +YCHEM_NL(59)%IGRIBTC=218226, +YCHEM_NL(59)%IGRIBDV=221226, +YCHEM_NL(59)%HENRYA=12, +YCHEM_NL(59)%HENRYB=5000., +YCHEM_NL(59)%LQM=.false., +YCHEM_NL(59)%LQM3D=.TRUE., +YCHEM_NL(59)%LCOMAD=.true., +YCHEM_NL(59)%LADV=.TRUE., +YCHEM_NL(59)%LMASSFIX=.TRUE., +YCHEM_NL(59)%BETAMFBC=-999.9, +YCHEM_NL(59)%LASSIM=.FALSE., +YCHEM_NL(60)%CNAME='CH3CN', +YCHEM_NL(60)%NREQIN=1, +YCHEM_NL(60)%RMOLMASS=41.0, +YCHEM_NL(60)%IGRBCODE=217224, +YCHEM_NL(60)%LNEGFIX=.TRUE., +YCHEM_NL(60)%IGRIBTC=218224, +YCHEM_NL(60)%IGRIBDV=221224, +YCHEM_NL(60)%HENRYA=49, +YCHEM_NL(60)%HENRYB=4000., +YCHEM_NL(60)%LQM=.false., +YCHEM_NL(60)%LQM3D=.TRUE., +YCHEM_NL(60)%LCOMAD=.true., +YCHEM_NL(60)%LADV=.TRUE., +YCHEM_NL(60)%LMASSFIX=.TRUE., +YCHEM_NL(60)%BETAMFBC=-999.9, +YCHEM_NL(60)%LASSIM=.FALSE., +YCHEM_NL(61)%CNAME='XYL', +YCHEM_NL(61)%NREQIN=1, +YCHEM_NL(61)%RMOLMASS=106.0, +YCHEM_NL(61)%IGRBCODE=217100, +YCHEM_NL(61)%LNEGFIX=.TRUE., +YCHEM_NL(61)%IGRIBTC=218100, +YCHEM_NL(61)%IGRIBDV=221100, +YCHEM_NL(61)%HENRYA=0.14, +YCHEM_NL(61)%HENRYB=4200.0, +YCHEM_NL(61)%LQM=.false., +YCHEM_NL(61)%LQM3D=.TRUE., +YCHEM_NL(61)%LCOMAD=.true., +YCHEM_NL(61)%LADV=.TRUE., +YCHEM_NL(61)%LMASSFIX=.TRUE., +YCHEM_NL(61)%BETAMFBC=-999.9, +YCHEM_NL(61)%LASSIM=.FALSE., +YCHEM_NL(62)%CNAME='TOL', +YCHEM_NL(62)%NREQIN=1, +YCHEM_NL(62)%RMOLMASS=92.0, +YCHEM_NL(62)%IGRBCODE=217099, +YCHEM_NL(62)%LNEGFIX=.TRUE., +YCHEM_NL(62)%IGRIBTC=218099, +YCHEM_NL(62)%IGRIBDV=221099, +YCHEM_NL(62)%HENRYA=0.15, +YCHEM_NL(62)%HENRYB=4300.0, +YCHEM_NL(62)%LQM=.false., +YCHEM_NL(62)%LQM3D=.TRUE., +YCHEM_NL(62)%LCOMAD=.true., +YCHEM_NL(62)%LADV=.TRUE., +YCHEM_NL(62)%LMASSFIX=.TRUE., +YCHEM_NL(62)%BETAMFBC=-999.9, +YCHEM_NL(62)%LASSIM=.FALSE., +YCHEM_NL(63)%CNAME='AROO2', +YCHEM_NL(63)%NREQIN=1, +YCHEM_NL(63)%RMOLMASS=124.0, +YCHEM_NL(63)%IGRBCODE=217222, +YCHEM_NL(63)%LNEGFIX=.TRUE., +YCHEM_NL(63)%IGRIBTC=218222, +YCHEM_NL(63)%LQM=.false., +YCHEM_NL(63)%LQM3D=.TRUE., +YCHEM_NL(63)%LCOMAD=.true., +YCHEM_NL(63)%LADV=.FALSE., +YCHEM_NL(63)%LMASSFIX=.FALSE., +YCHEM_NL(63)%LMASSFIX=.FALSE., +YCHEM_NL(63)%LASSIM=.FALSE., +YCHEM_NL(64)%CNAME='HPALD1', +YCHEM_NL(64)%NREQIN=1, +YCHEM_NL(64)%RMOLMASS=148.0, +YCHEM_NL(64)%IGRBCODE=217227, +YCHEM_NL(64)%LNEGFIX=.TRUE., +YCHEM_NL(64)%IGRIBTC=218227, +YCHEM_NL(64)%HENRYA=17.0, +YCHEM_NL(64)%HENRYB=5000.0, +YCHEM_NL(64)%LQM=.false., +YCHEM_NL(64)%LQM3D=.TRUE., +YCHEM_NL(64)%LCOMAD=.true., +YCHEM_NL(64)%LADV=.TRUE., +YCHEM_NL(64)%LMASSFIX=.TRUE., +YCHEM_NL(64)%BETAMFBC=-999.9, +YCHEM_NL(64)%LASSIM=.FALSE., +YCHEM_NL(65)%CNAME='HPALD2', +YCHEM_NL(65)%NREQIN=1, +YCHEM_NL(65)%RMOLMASS=148.0, +YCHEM_NL(65)%IGRBCODE=217228, +YCHEM_NL(65)%LNEGFIX=.TRUE., +YCHEM_NL(65)%IGRIBTC=218228, +YCHEM_NL(65)%HENRYA=17.0, +YCHEM_NL(65)%HENRYB=5000.0, +YCHEM_NL(65)%LQM=.false., +YCHEM_NL(65)%LQM3D=.TRUE., +YCHEM_NL(65)%LCOMAD=.true., +YCHEM_NL(65)%LADV=.TRUE., +YCHEM_NL(65)%LMASSFIX=.TRUE., +YCHEM_NL(65)%BETAMFBC=-999.9, +YCHEM_NL(65)%LASSIM=.FALSE., +YCHEM_NL(66)%CNAME='ISOPOOH', +YCHEM_NL(66)%NREQIN=1, +YCHEM_NL(66)%RMOLMASS=118.0, +YCHEM_NL(66)%IGRBCODE=217161, +YCHEM_NL(66)%LNEGFIX=.TRUE., +YCHEM_NL(66)%IGRIBTC=218161, +YCHEM_NL(66)%IGRIBDV=221161, +YCHEM_NL(66)%HENRYA=3.2E11, +YCHEM_NL(66)%HENRYB=8700.0, +YCHEM_NL(66)%LQM=.false., +YCHEM_NL(66)%LQM3D=.TRUE., +YCHEM_NL(66)%LCOMAD=.true., +YCHEM_NL(66)%LADV=.TRUE., +YCHEM_NL(66)%LMASSFIX=.TRUE., +YCHEM_NL(66)%BETAMFBC=-999.9, +YCHEM_NL(66)%LASSIM=.FALSE., +YCHEM_NL(67)%CNAME='GLY', +YCHEM_NL(67)%NREQIN=1, +YCHEM_NL(67)%RMOLMASS=58.04, +YCHEM_NL(67)%IGRBCODE=217107, +YCHEM_NL(67)%LNEGFIX=.TRUE., +YCHEM_NL(67)%IGRIBTC=218107, +YCHEM_NL(67)%IGRIBDV=221107, +YCHEM_NL(67)%HENRYA=4.1E5, +YCHEM_NL(67)%HENRYB=7500.0, +YCHEM_NL(67)%LQM=.false., +YCHEM_NL(67)%LQM3D=.TRUE., +YCHEM_NL(67)%LCOMAD=.true., +YCHEM_NL(67)%LADV=.TRUE., +YCHEM_NL(67)%LMASSFIX=.TRUE., +YCHEM_NL(67)%BETAMFBC=-999.9, +YCHEM_NL(67)%LASSIM=.FALSE., +YCHEM_NL(68)%CNAME='GLYALD', +YCHEM_NL(68)%NREQIN=1, +YCHEM_NL(68)%RMOLMASS=60.05, +YCHEM_NL(68)%IGRBCODE=217101, +YCHEM_NL(68)%LNEGFIX=.TRUE., +YCHEM_NL(68)%IGRIBTC=218101, +YCHEM_NL(68)%IGRIBDV=221101, +YCHEM_NL(68)%HENRYA=4.1E4, +YCHEM_NL(68)%HENRYB=4600.0, +YCHEM_NL(68)%LQM=.false., +YCHEM_NL(68)%LQM3D=.TRUE., +YCHEM_NL(68)%LCOMAD=.true., +YCHEM_NL(68)%LADV=.TRUE., +YCHEM_NL(68)%LMASSFIX=.TRUE., +YCHEM_NL(68)%BETAMFBC=-999.9, +YCHEM_NL(68)%LASSIM=.FALSE., +YCHEM_NL(69)%CNAME='HYAC', +YCHEM_NL(69)%NREQIN=1, +YCHEM_NL(69)%RMOLMASS=74.1, +YCHEM_NL(69)%IGRBCODE=217118, +YCHEM_NL(69)%LNEGFIX=.TRUE., +YCHEM_NL(69)%IGRIBTC=218117, +YCHEM_NL(69)%IGRIBDV=221118, +YCHEM_NL(69)%HENRYA=6.3E3, +YCHEM_NL(69)%HENRYB=6460.0, +YCHEM_NL(69)%LQM=.false., +YCHEM_NL(69)%LQM3D=.TRUE., +YCHEM_NL(69)%LCOMAD=.true., +YCHEM_NL(69)%LADV=.TRUE., +YCHEM_NL(69)%LMASSFIX=.TRUE., +YCHEM_NL(69)%BETAMFBC=-999.9, +YCHEM_NL(69)%LASSIM=.FALSE., +YCHEM_NL(70)%CNAME='ISOPBO2', +YCHEM_NL(70)%NREQIN=1, +YCHEM_NL(70)%RMOLMASS=117.0, +YCHEM_NL(70)%IGRBCODE=217229, +YCHEM_NL(70)%LNEGFIX=.TRUE., +YCHEM_NL(70)%IGRIBTC=218229, +YCHEM_NL(70)%LQM=.false., +YCHEM_NL(70)%LQM3D=.TRUE., +YCHEM_NL(70)%LCOMAD=.true., +YCHEM_NL(70)%LADV=.FALSE., +YCHEM_NL(70)%LMASSFIX=.FALSE., +YCHEM_NL(70)%LMASSFIX=.FALSE., +YCHEM_NL(70)%LASSIM=.FALSE., +YCHEM_NL(71)%CNAME='ISOPDO2', +YCHEM_NL(71)%NREQIN=1, +YCHEM_NL(71)%RMOLMASS=117.0, +YCHEM_NL(71)%IGRBCODE=217230, +YCHEM_NL(71)%LNEGFIX=.TRUE., +YCHEM_NL(71)%IGRIBTC=218230, +YCHEM_NL(71)%LQM=.false., +YCHEM_NL(71)%LQM3D=.TRUE., +YCHEM_NL(71)%LCOMAD=.true., +YCHEM_NL(71)%LADV=.FALSE., +YCHEM_NL(71)%LMASSFIX=.FALSE., +YCHEM_NL(71)%LMASSFIX=.FALSE., +YCHEM_NL(71)%LASSIM=.FALSE., +YCHEM_NL(72)%CNAME='SOG1', +YCHEM_NL(72)%NREQIN=1, +YCHEM_NL(72)%RMOLMASS=180.0, +YCHEM_NL(72)%IGRBCODE=217186, +YCHEM_NL(72)%LNEGFIX=.TRUE., +YCHEM_NL(72)%IGRIBTC=218186, +YCHEM_NL(72)%HENRYA=1.E5, +YCHEM_NL(72)%HENRYB=6000.0, +YCHEM_NL(72)%LQM=.false., +YCHEM_NL(72)%LQM3D=.TRUE., +YCHEM_NL(72)%LCOMAD=.true., +YCHEM_NL(72)%LADV=.TRUE., +YCHEM_NL(72)%LMASSFIX=.TRUE., +YCHEM_NL(72)%BETAMFBC=-999.9, +YCHEM_NL(72)%LASSIM=.FALSE., +YCHEM_NL(73)%CNAME='SOG2A', +YCHEM_NL(73)%NREQIN=1, +YCHEM_NL(73)%RMOLMASS=120.0, +YCHEM_NL(73)%IGRBCODE=217187, +YCHEM_NL(73)%LNEGFIX=.TRUE., +YCHEM_NL(73)%IGRIBTC=218187, +YCHEM_NL(73)%HENRYA=1.E3, +YCHEM_NL(73)%HENRYB=6000.0, +YCHEM_NL(73)%LQM=.false., +YCHEM_NL(73)%LQM3D=.TRUE., +YCHEM_NL(73)%LCOMAD=.true., +YCHEM_NL(73)%LADV=.TRUE., +YCHEM_NL(73)%LMASSFIX=.TRUE., +YCHEM_NL(73)%BETAMFBC=-999.9, +YCHEM_NL(73)%LASSIM=.FALSE., +YCHEM_NL(74)%CNAME='SOG2B', +YCHEM_NL(74)%NREQIN=1, +YCHEM_NL(74)%RMOLMASS=120.0, +YCHEM_NL(74)%IGRBCODE=217188, +YCHEM_NL(74)%LNEGFIX=.TRUE., +YCHEM_NL(74)%IGRIBTC=218188, +YCHEM_NL(74)%HENRYA=1.E5, +YCHEM_NL(74)%HENRYB=6000.0, +YCHEM_NL(74)%LQM=.false., +YCHEM_NL(74)%LQM3D=.TRUE., +YCHEM_NL(74)%LCOMAD=.true., +YCHEM_NL(74)%LADV=.TRUE., +YCHEM_NL(74)%LMASSFIX=.TRUE., +YCHEM_NL(74)%BETAMFBC=-999.9, +YCHEM_NL(74)%LASSIM=.FALSE., +YEXT_NL(1)%CNAME='EMILI', +YEXT_NL(1)%NREQIN=0, +YEXT_NL(1)%IGRBCODE=212254, +YEXT_NL(1)%LADV=.FALSE., +YEXT_NL(1)%LGP=.TRUE., +YEXT_NL(1)%LGPINGP=.TRUE., +YEXT_NL(2)%CNAME='KCH4CHEM', +YEXT_NL(2)%NREQIN=0, +YEXT_NL(2)%IGRBCODE=210071, +YEXT_NL(2)%LADV=.FALSE., +YEXT_NL(2)%LGP=.TRUE., +YEXT_NL(2)%LGPINGP=.TRUE., +NGFL_EXT=2, +LAERCHEM=true +YQ_NL%LGP=true, +YQ_NL%LSP=false, +YL_NL%LGP=true, +YI_NL%LGP=true, +YA_NL%LGP=true, +YO3_NL%LGP=true, +LTRCMFQM=true, +/ +&NAMFPC +CFPFMT="MODEL", +NFP3DFS=5, +NFP3DFP=5, +NFP3DFT=1, +NFP3DFV=1, +MFP3DFS(:)=130,135,138,155,133, +MFP3DFP(:)=129,130,135,138,155, +MFP3DFT=60, +MFP3DFV=133, +NFP2DF=2, +MFP2DF(:)=129,152, +NFPPHY=1, +MFPPHY(:)=31, +NRFP3S(:)=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137, +RFP3P(:)=100000.0,92500.0,85000.0,70000.0,50000.0,40000.0,30000.0,25000.0,20000.0,15000.0,10000.0,7000.0,5000.0,3000.0,2000.0,1000.0,700.0,500.0,300.0,200.0,100.0, +NFPCLI=0, +LFPQ=false, +LTRACEFP=false, +RFPCORR=60000., +/ +&NAMDIM +NPROMA=-16, +/ +&NAMDPHY +NVEXTR=7, +NCEXTR=137, +NCSNEC=5, +/ +&NAMGEM +LNONHYD_GEOM=false, +NHTYP=2, +/ +&NAMRIP +TSTEP=1800.0, +CSTOP='h24', +/ +&NAMARG +NCONF=1, +CNMEXP="abc3", +/ + &NAMRLX + / + &NAEAER + NTYPAER=3,3,2,2,1,2,1,2,0,0, + YAERO_DESC(1)%IGRIBDIAG=215001,215004,215007,215010,215013,215016,215022,215019, +YAERO_DESC(1)%RDDEPVSEA=1.1000E-02, +YAERO_DESC(1)%RDDEPVLIC=1.1000E-02, +YAERO_DESC(1)%RSEDIMV=2.4000E-05, +YAERO_DESC(1)%RSCAVIN=0.9, +YAERO_DESC(1)%RSCAVBCR=0.001, +YAERO_DESC(1)%RSCAVBCS=0.005, +YAERO_DESC(1)%COPTCLASS='SeaSaltSmall', +YAERO_DESC(1)%CHYGCLASS='SeaSalt', +YAERO_DESC(1)%IAEROCV=1, +YAERO_DESC(2)%IGRIBDIAG=215002,215005,215008,215011,215014,215017,215023,215020, +YAERO_DESC(2)%RDDEPVSEA=1.1500E-02, +YAERO_DESC(2)%RDDEPVLIC=1.2000E-02, +YAERO_DESC(2)%RSEDIMV=1.9500E-03, +YAERO_DESC(2)%RSCAVIN=0.9, +YAERO_DESC(2)%RSCAVBCR=0.001, +YAERO_DESC(2)%RSCAVBCS=0.005, +YAERO_DESC(2)%COPTCLASS='SeaSaltMedium', +YAERO_DESC(2)%CHYGCLASS='SeaSalt', +YAERO_DESC(2)%IAEROCV=2, +YAERO_DESC(3)%IGRIBDIAG=215003,215006,215009,215012,215015,215018,215024,215021, +YAERO_DESC(3)%RDDEPVSEA=1.2000E-02, +YAERO_DESC(3)%RDDEPVLIC=1.5000E-02, +YAERO_DESC(3)%RSEDIMV=1.8000E-02, +YAERO_DESC(3)%RSCAVIN=0.9, +YAERO_DESC(3)%RSCAVBCR=0.1, +YAERO_DESC(3)%RSCAVBCS=0.005, +YAERO_DESC(3)%COPTCLASS='SeaSaltLarge', +YAERO_DESC(3)%CHYGCLASS='SeaSalt', +YAERO_DESC(3)%IAEROCV=2, +YAERO_DESC(4)%IGRIBDIAG=215025,215028,215031,215034,215037,215040,215046,215043, +YAERO_DESC(4)%RDDEPVSEA=2.0000E-04, +YAERO_DESC(4)%RDDEPVLIC=2.0000E-04, +YAERO_DESC(4)%RSEDIMV=6.9040E-05, +YAERO_DESC(4)%RSCAVIN=0.7, +YAERO_DESC(4)%RSCAVBCR=0.001, +YAERO_DESC(4)%RSCAVBCS=0.005, +YAERO_DESC(4)%COPTCLASS='DustSmall', +YAERO_DESC(4)%CHYGCLASS='Dust', +YAERO_DESC(4)%IAEROCV=1, +YAERO_DESC(5)%IGRIBDIAG=215026,215029,215032,215035,215038,215041,215047,215044, +YAERO_DESC(5)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(5)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(5)%RSEDIMV=1.9820E-04, +YAERO_DESC(5)%RSCAVIN=0.7, +YAERO_DESC(5)%RSCAVBCR=0.001, +YAERO_DESC(5)%RSCAVBCS=0.005, +YAERO_DESC(5)%COPTCLASS='DustMedium', +YAERO_DESC(5)%CHYGCLASS='Dust', +YAERO_DESC(5)%IAEROCV=2, +YAERO_DESC(6)%IGRIBDIAG=215027,215030,215033,215036,215039,215042,215048,215045, +YAERO_DESC(6)%RDDEPVSEA=1.2000E-02, +YAERO_DESC(6)%RDDEPVLIC=1.2000E-02, +YAERO_DESC(6)%RSEDIMV=1.9620E-03, +YAERO_DESC(6)%RSCAVIN=0.7, +YAERO_DESC(6)%RSCAVBCR=0.1, +YAERO_DESC(6)%RSCAVBCS=0.005, +YAERO_DESC(6)%COPTCLASS='DustLarge', +YAERO_DESC(6)%CHYGCLASS='Dust', +YAERO_DESC(6)%IAEROCV=2, +YAERO_DESC(7)%IGRIBDIAG=215050,215052,215054,215056,215058,215060,215064,215062, +YAERO_DESC(7)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(7)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(7)%RSEDIMV=2.0000E-04, +YAERO_DESC(7)%RSCAVIN=0.7, +YAERO_DESC(7)%RSCAVBCR=0.0001, +YAERO_DESC(7)%RSCAVBCS=0.005, +YAERO_DESC(7)%COPTCLASS='OrganicMatter', +YAERO_DESC(7)%CHYGCLASS='OrganicMatter', +YAERO_DESC(7)%IAEROCV=1, +YAERO_DESC(8)%IGRIBDIAG=215049,215051,215053,215055,215057,215059,215063,215061, +YAERO_DESC(8)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(8)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(8)%RSEDIMV=2.0000E-04, +YAERO_DESC(8)%RSCAVIN=0, +YAERO_DESC(8)%RSCAVBCR=0.0001, +YAERO_DESC(8)%RSCAVBCS=0.005, +YAERO_DESC(8)%COPTCLASS='OrganicMatter', +YAERO_DESC(8)%CHYGCLASS='Hydrophobic', +YAERO_DESC(8)%IAEROCV=1, +YAERO_DESC(9)%IGRIBDIAG=215066,215068,215070,215072,215074,215076,215080,215078, +YAERO_DESC(9)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(9)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(9)%RSEDIMV=2.0000E-04, +YAERO_DESC(9)%RSCAVIN=0.7, +YAERO_DESC(9)%RSCAVBCR=0.0001, +YAERO_DESC(9)%RSCAVBCS=0.005, +YAERO_DESC(9)%COPTCLASS='BlackCarbon', +YAERO_DESC(9)%CHYGCLASS='BlackCarbon', +YAERO_DESC(9)%IAEROCV=1, +YAERO_DESC(10)%IGRIBDIAG=215065,215067,215069,215071,215073,215075,215079,215077, +YAERO_DESC(10)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(10)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(10)%RSEDIMV=2.0000E-04, +YAERO_DESC(10)%RSCAVIN=0, +YAERO_DESC(10)%RSCAVBCR=0.0001, +YAERO_DESC(10)%RSCAVBCS=0.005, +YAERO_DESC(10)%COPTCLASS='BlackCarbon', +YAERO_DESC(10)%CHYGCLASS='Hydrophobic', +YAERO_DESC(10)%IAEROCV=1, +YAERO_DESC(11)%IGRIBDIAG=215081,215082,215083,215084,215085,215086,215088,215087, +YAERO_DESC(11)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(11)%RDDEPVLIC=2.5000E-03, +YAERO_DESC(11)%RSEDIMV=2.0000E-04, +YAERO_DESC(11)%RSCAVIN=0.7, +YAERO_DESC(11)%RSCAVBCR=0.0001, +YAERO_DESC(11)%RSCAVBCS=0.005, +YAERO_DESC(11)%COPTCLASS='Sulphate', +YAERO_DESC(11)%CHYGCLASS='Sulphate', +YAERO_DESC(11)%IAEROCV=1, +YAERO_DESC(12)%IGRIBDIAG=215189,215191,215193,215195,215197,215199,215203,215201, +YAERO_DESC(12)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(12)%RDDEPVLIC=1.5000E-03, +YAERO_DESC(12)%RSEDIMV=2.0000E-04, +YAERO_DESC(12)%RSCAVIN=0.8, +YAERO_DESC(12)%RSCAVBCR=0.0001, +YAERO_DESC(12)%RSCAVBCS=0.005, +YAERO_DESC(12)%COPTCLASS='NitrateFine', +YAERO_DESC(12)%CHYGCLASS='Nitrate', +YAERO_DESC(12)%IAEROCV=1, +YAERO_DESC(13)%IGRIBDIAG=215190,215192,215194,215196,215198,215200,215204,215202, +YAERO_DESC(13)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(13)%RDDEPVLIC=1.5000E-03, +YAERO_DESC(13)%RSEDIMV=1.3352E-03, +YAERO_DESC(13)%RSCAVIN=0.8, +YAERO_DESC(13)%RSCAVBCR=0.1, +YAERO_DESC(13)%RSCAVBCS=0.005, +YAERO_DESC(13)%COPTCLASS='NitrateCoarse', +YAERO_DESC(13)%CHYGCLASS='Nitrate', +YAERO_DESC(13)%IAEROCV=2, +YAERO_DESC(14)%IGRIBDIAG=215205,215206,215207,215208,215209,215210,216042,215211, +YAERO_DESC(14)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(14)%RDDEPVLIC=1.5000E-03, +YAERO_DESC(14)%RSEDIMV=2.0000E-04, +YAERO_DESC(14)%RSCAVIN=0.9, +YAERO_DESC(14)%RSCAVBCR=0.0001, +YAERO_DESC(14)%RSCAVBCS=0.005, +YAERO_DESC(14)%COPTCLASS='Ammonium', +YAERO_DESC(14)%CHYGCLASS='Ammonium', +YAERO_DESC(14)%IAEROCV=1, +YAERO_DESC(15)%IGRIBDIAG=215212,215213,215214,215215,215216,215217,216098,215218, +YAERO_DESC(15)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(15)%RDDEPVLIC=2.5000E-03, +YAERO_DESC(15)%RSEDIMV=2.4000E-04, +YAERO_DESC(15)%RSCAVIN=0.7, +YAERO_DESC(15)%RSCAVBCR=0.0001, +YAERO_DESC(15)%RSCAVBCS=0.005, +YAERO_DESC(15)%COPTCLASS='SecOrgBio', +YAERO_DESC(15)%CHYGCLASS='SecOrgBio', +YAERO_DESC(15)%IAEROCV=1, +YAERO_DESC(16)%IGRIBDIAG=215219,215220,215221,215222,215223,215224,216099,215225, +YAERO_DESC(16)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(16)%RDDEPVLIC=2.5000E-03, +YAERO_DESC(16)%RSEDIMV=2.4000E-04, +YAERO_DESC(16)%RSCAVIN=0.7, +YAERO_DESC(16)%RSCAVBCR=0.0001, +YAERO_DESC(16)%RSCAVBCS=0.005, +YAERO_DESC(16)%COPTCLASS='SecOrgAnth', +YAERO_DESC(16)%CHYGCLASS='SecOrgAnth', +YAERO_DESC(16)%IAEROCV=1, + LAERVOL=false, + NDRYDEPVEL_DYN=2, + LAERDUSTSOURCE=true, + LAERDUSTSIZEVAR=true, + LAERDUST_NEWBIN=false, + RAERDUST_REBOUND=0.1, + LAERNGAT=true, + NAERSCAV=3, + LAERGTOP=true, + LAERHYGRO=true, + LAERSEDIM=true, + LAERSEDIMSS=true, + LAERDRYDP=true, + LAERSURF=true, + NSSALT=4, + NDDUST=2, + NSO4SCHEME=1, + LSEASALT_RH80=true, + LAERRRTM=false, + / + &NAMCOMPO + LCHEM_DIA=true, + LCHEM_DDFLX=true, + LCOMPO_DDFLX_DIR=true, + LCHEM_TROPO=true, + LCOMPO_DCDD=true, + LAERNITRATE=true, + LAEREQSAM4CLIM=false, + LAERSOA=false, + LAERSOA_COUPLED=false, + KGHG_CHEMTEND_CH4=0, + LAERNUCL=true, + AERO_SCHEME="hamm7", + +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219209 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212001 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="ene" + THIS%PARAMID=212002 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="fef" + THIS%PARAMID=212003 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="ind" + THIS%PARAMID=212004 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="res" + THIS%PARAMID=212006 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="shp" + THIS%PARAMID=212007 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="slv" + THIS%PARAMID=212189 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="swd" + THIS%PARAMID=212008 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="tnr" + THIS%PARAMID=212009 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="tro" + THIS%PARAMID=212010 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212011 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="ene" + THIS%PARAMID=212012 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="fef" + THIS%PARAMID=212013 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="ind" + THIS%PARAMID=212014 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="res" + THIS%PARAMID=212015 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="shp" + THIS%PARAMID=212016 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="slv" + THIS%PARAMID=212019 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="swd" + THIS%PARAMID=212017 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="tnr" + THIS%PARAMID=212018 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210106 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212021 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212022 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="ene" + THIS%PARAMID=212023 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="fef" + THIS%PARAMID=212024 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="ind" + THIS%PARAMID=212025 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="ref" + THIS%PARAMID=212020 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="res" + THIS%PARAMID=212026 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="shp" + THIS%PARAMID=212027 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="slv" + THIS%PARAMID=212133 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="swd" + THIS%PARAMID=212028 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="tnr" + THIS%PARAMID=212029 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="tro" + THIS%PARAMID=212030 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210104 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212031 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="ene" + THIS%PARAMID=212032 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="fef" + THIS%PARAMID=212033 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="ind" + THIS%PARAMID=212034 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="ref" + THIS%PARAMID=212040 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="res" + THIS%PARAMID=212035 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="shp" + THIS%PARAMID=212036 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="slv" + THIS%PARAMID=212137 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="swd" + THIS%PARAMID=212037 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="tnr" + THIS%PARAMID=212038 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="tro" + THIS%PARAMID=212039 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210118 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212041 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212042 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="ene" + THIS%PARAMID=212043 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="fef" + THIS%PARAMID=212044 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="ind" + THIS%PARAMID=212045 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="ref" + THIS%PARAMID=212134 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="res" + THIS%PARAMID=212046 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="shp" + THIS%PARAMID=212047 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="slv" + THIS%PARAMID=212185 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="swd" + THIS%PARAMID=212048 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="tnr" + THIS%PARAMID=212049 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="tro" + THIS%PARAMID=212050 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210107 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212051 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212052 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="ene" + THIS%PARAMID=212053 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="fef" + THIS%PARAMID=212054 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="ind" + THIS%PARAMID=212055 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="ref" + THIS%PARAMID=212135 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="res" + THIS%PARAMID=212056 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="shp" + THIS%PARAMID=212057 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="slv" + THIS%PARAMID=212186 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="swd" + THIS%PARAMID=212058 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="tnr" + THIS%PARAMID=212059 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="tro" + THIS%PARAMID=212060 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210105 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212061 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212062 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="ene" + THIS%PARAMID=212063 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="fef" + THIS%PARAMID=212064 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="ind" + THIS%PARAMID=212065 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="ref" + THIS%PARAMID=212136 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="res" + THIS%PARAMID=212066 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="shp" + THIS%PARAMID=212067 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="slv" + THIS%PARAMID=212187 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="swd" + THIS%PARAMID=212068 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="tnr" + THIS%PARAMID=212069 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="tro" + THIS%PARAMID=212070 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210108 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212071 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.00 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="ene" + THIS%PARAMID=212072 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="fef" + THIS%PARAMID=212073 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="ind" + THIS%PARAMID=212074 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="ref" + THIS%PARAMID=212080 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="res" + THIS%PARAMID=212075 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="shp" + THIS%PARAMID=212076 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="slv" + THIS%PARAMID=212198 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="swd" + THIS%PARAMID=212077 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="tnr" + THIS%PARAMID=212078 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="tro" + THIS%PARAMID=212079 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210113 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212081 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="ene" + THIS%PARAMID=212082 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="fef" + THIS%PARAMID=212083 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="ind" + THIS%PARAMID=212084 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="res" + THIS%PARAMID=212085 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="shp" + THIS%PARAMID=212086 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="slv" + THIS%PARAMID=212090 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="swd" + THIS%PARAMID=212087 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="tnr" + THIS%PARAMID=212088 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="tro" + THIS%PARAMID=212089 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219220 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="ene" + THIS%SCALING=0.0015 + THIS%PARAMID=212123 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="ind" + THIS%SCALING=0.0015 + THIS%PARAMID=212125 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="ref" + THIS%SCALING=0.0015 + THIS%PARAMID=212120 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="res" + THIS%SCALING=0.0015 + THIS%PARAMID=212126 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210115 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212091 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="emiss_nat" + THIS%SCALING=1.4 + THIS%PARAMID=212122 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="ene" + THIS%PARAMID=212092 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="fef" + THIS%PARAMID=212093 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="ind" + THIS%PARAMID=212094 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="ref" + THIS%PARAMID=212100 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="res" + THIS%PARAMID=212095 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="shp" + THIS%PARAMID=212096 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="slv" + THIS%PARAMID=212190 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="swd" + THIS%PARAMID=212097 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="tnr" + THIS%PARAMID=212098 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="tro" + THIS%PARAMID=212099 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210103 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212111 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="ene" + THIS%PARAMID=212112 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="fef" + THIS%PARAMID=212113 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="ind" + THIS%PARAMID=212114 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="ref" + THIS%PARAMID=212110 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="res" + THIS%PARAMID=212115 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="shp" + THIS%PARAMID=212116 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="slv" + THIS%PARAMID=212140 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="swd" + THIS%PARAMID=212117 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="tnr" + THIS%PARAMID=212118 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="tro" + THIS%PARAMID=212119 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210081 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212121 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212122 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="ene" + THIS%PARAMID=212123 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="fef" + THIS%PARAMID=212124 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="ind" + THIS%PARAMID=212125 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="ref" + THIS%PARAMID=212120 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="res" + THIS%PARAMID=212126 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="shp" + THIS%PARAMID=212127 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="swd" + THIS%PARAMID=212128 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="tnr" + THIS%PARAMID=212129 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="tro" + THIS%PARAMID=212130 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="DMS" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210117 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="DMS" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212132 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="DMS" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212131 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="GLY" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=212244 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219219 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="ene" + THIS%SCALING=0.001 + THIS%PARAMID=212123 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="ind" + THIS%SCALING=0.001 + THIS%PARAMID=212125 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="ref" + THIS%SCALING=0.001 + THIS%PARAMID=212120 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="res" + THIS%SCALING=0.001 + THIS%PARAMID=212126 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212141 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="ene" + THIS%PARAMID=212142 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="fef" + THIS%PARAMID=212143 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="ind" + THIS%PARAMID=212144 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="res" + THIS%PARAMID=212145 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="shp" + THIS%PARAMID=212146 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="slv" + THIS%PARAMID=212240 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="swd" + THIS%PARAMID=212147 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="tnr" + THIS%PARAMID=212148 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="tro" + THIS%PARAMID=212149 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ISPD" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212150 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212151 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="ene" + THIS%PARAMID=212152 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="fef" + THIS%PARAMID=212153 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="ind" + THIS%PARAMID=212154 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="res" + THIS%PARAMID=212155 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="shp" + THIS%PARAMID=212156 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="slv" + THIS%PARAMID=212241 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="swd" + THIS%PARAMID=212157 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="tnr" + THIS%PARAMID=212158 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="tro" + THIS%PARAMID=212159 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210116 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="agl" + THIS%PARAMID=212163 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ags" + THIS%PARAMID=212164 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGS" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212161 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212162 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ene" + THIS%PARAMID=212165 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ind" + THIS%PARAMID=212166 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ref" + THIS%PARAMID=212138 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="res" + THIS%PARAMID=212167 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="slv" + THIS%PARAMID=212169 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="swd" + THIS%PARAMID=212170 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="tnr" + THIS%PARAMID=212171 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="tro" + THIS%PARAMID=212172 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210085 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="agl" + THIS%PARAMID=212174 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212173 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="ene" + THIS%PARAMID=212176 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="fef" + THIS%PARAMID=212177 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="ind" + THIS%PARAMID=212178 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="ref" + THIS%PARAMID=212184 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="res" + THIS%PARAMID=212179 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="shp" + THIS%PARAMID=212180 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="swd" + THIS%PARAMID=212181 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="tnr" + THIS%PARAMID=212182 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="tro" + THIS%PARAMID=212183 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO2" + THIS%SECTOR="Aviation" + THIS%VERTICAL_PROFILE_TYPE="3D" + THIS%PARAMID=212255 + THIS%SCALING=1.53333333333333 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219208 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212191 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="ene" + THIS%PARAMID=212192 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="fef" + THIS%PARAMID=212193 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="ind" + THIS%PARAMID=212194 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="ref" + THIS%PARAMID=212200 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="res" + THIS%PARAMID=212195 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="shp" + THIS%PARAMID=212196 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="slv" + THIS%PARAMID=212242 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="swd" + THIS%PARAMID=212197 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="tnr" + THIS%PARAMID=212188 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="tro" + THIS%PARAMID=212199 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219207 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212201 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="ene" + THIS%PARAMID=212202 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="fef" + THIS%PARAMID=212203 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="ind" + THIS%PARAMID=212204 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="ref" + THIS%PARAMID=212139 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="res" + THIS%PARAMID=212205 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="shp" + THIS%PARAMID=212206 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="slv" + THIS%PARAMID=212243 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="swd" + THIS%PARAMID=212207 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="tnr" + THIS%PARAMID=212208 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="tro" + THIS%PARAMID=212209 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Rn" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212210 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210102 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212211 + THIS%VERTICAL_PROFILE_TYPE="AltitudeMap" + THIS%VERTICAL_PARAMID=216045 + THIS%VERTICAL_BASE_LEVEL=-1 + THIS%VERTICAL_TOP_LEVEL=-4 + THIS%VERTICAL_THRESHOLD=200 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="ene" + THIS%PARAMID=212212 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="fef" + THIS%PARAMID=212213 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="ind" + THIS%PARAMID=212214 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="ref" + THIS%PARAMID=212220 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="res" + THIS%PARAMID=212215 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="shp" + THIS%PARAMID=212216 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="swd" + THIS%PARAMID=212217 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="tnr" + THIS%PARAMID=212218 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="tro" + THIS%PARAMID=212219 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="agl" + THIS%PARAMID=216221 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="ene" + THIS%PARAMID=216222 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="fef" + THIS%PARAMID=216223 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="ind" + THIS%PARAMID=216224 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="ref" + THIS%PARAMID=216225 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="res" + THIS%PARAMID=216226 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="shp" + THIS%PARAMID=216227 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="slv" + THIS%PARAMID=216228 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="swd" + THIS%PARAMID=216229 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="tnr" + THIS%PARAMID=216230 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="tro" + THIS%PARAMID=216231 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219212 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=216200 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="ene" + THIS%PARAMID=216201 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="fef" + THIS%PARAMID=216202 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="ind" + THIS%PARAMID=216203 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="ref" + THIS%PARAMID=216204 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="res" + THIS%PARAMID=216205 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="shp" + THIS%PARAMID=216206 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="slv" + THIS%PARAMID=216207 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="swd" + THIS%PARAMID=216208 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="tnr" + THIS%PARAMID=216209 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="tro" + THIS%PARAMID=216210 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219213 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="ene" + THIS%PARAMID=216211 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="fef" + THIS%PARAMID=216212 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="ind" + THIS%PARAMID=216213 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="ref" + THIS%PARAMID=216214 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="res" + THIS%PARAMID=216215 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="shp" + THIS%PARAMID=216216 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="slv" + THIS%PARAMID=216217 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="swd" + THIS%PARAMID=216218 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="tnr" + THIS%PARAMID=216219 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="tro" + THIS%PARAMID=216220 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS +/ +&NAMCOMPO_EMIS_AUX + THIS%PARAMID=210060 +/ +&NAMCOMPO_EMIS_AUX + THIS%PARAMID=216045 +/ +&NAMCOMPO_EMIS_AUX +/ + &NAMCHEM + CHEM_SCHEME="tm5", + LCHEM_DIAC=false, + LCHEM_LIGHT=true, + + KCHEM_WETDEP=2, + LCHEM_0NOX=false, + KCHEM_NOXADV=0, + LCHEM_ANAO3=false, + KCHEM_SOLVE=2, + LCHEM_REVCHEM=false, + LCHEM_BASCOE_JON=false, + LCHEM_BASCOE_HETCHEM=true, + LCHEM_EXTENDJNO2=true, + LCHEM_JOUT=false, + LCHEM_AEROI=false, + LCHEM_O3RAD=true, + KCHEM_DRYDEP=3, + LCHEM_CSHAPE=.false., + LCHEM_WDFR=.true., + / + &NAMVAR + LMODERR=.false., + LJCDFI=.false., + LUSEJCDFI=.false., + LECV=false, + / + &NAMMCC + LMCC_COMPO=false, + / + &NAETLDIAG + / + &NAMVV0 + LLFORCE_READ=false, + / +&NAEAER +/ +&NAEPHY +/ +&NAERAD +/ +&NALBAR +/ +&NALORI +/ +&NAM_DISTRIBUTED_VECTORS +/ +&NAM926 +/ +&NAMAFN +/ +&NAMANA +/ +&NAMARPHY +/ +&NAMCA +/ +&NAMCAPE +/ +&NAMCFU +/ +&NAMCHK +/ +&NAMCHET +/ +&NAMCLDP +/ +&NAMCLTC +/ +&NAMCOM +/ +&NAMCOS +/ +&NAMCTAN +/ +&NAMCUMF +/ +&NAMCUMFS +/ +&NAMCT1 +/ +&NAMCVA +/ +&NAMDDH +/ +&NAMDFHD +/ +&NAMDFI +/ +&NAMDIF +/ +&NAMDIM +/ +&NAMDIMO +/ +&NAMDMSP +/ +&NAMDPHY +/ +&NAMDYN +/ +&NAMDYNA +/ +&NAMDYNA_STATIC +/ +&NAMDYNCORE +/ +&NAMEMIS_CONF +/ +&NAMENKF +/ +&NAMFA +/ +&NAMFFT +/ +&NAMFPC +/ +&NAMFPD +/ +&NAMFPDY2 +/ +&NAMFPDYH +/ +&NAMFPDYP +/ +&NAMFPDYS +/ +&NAMFPDYT +/ +&NAMFPDYV +/ +&NAMFPEZO +/ +&NAMFPF +/ +&NAMFPG +/ +&NAMFPIOS +/ +&NAMFPPHY +/ +&NAMFPSC2 +/ +&NAMFPSC2_DEP +/ +&NAMFY2 +/ +&NAMGEM +/ +&NAMGFL +/ +&NAMGMS +/ +&NAMGOES +/ +&NAMGOM +/ +&NAMGRIB +/ +&NAMGWD +/ +&NAMGWWMS +/ +&NAMHLOPT +/ +&NAMINI +/ +&NAMIOMI +/ +&NAMIOS +/ +&NAMJBCODES +/ +&NAMJFH +/ +&NAMJG +/ +&NAMJO +/ +&NAMKAP +/ +&NAMLCZ +/ +&NAMLEG +/ +&NAMLFI +/ +&NAMMCC +/ +&NAMMCUF +/ +&NAMMETEOSAT +/ +&NAMMTS +/ +&NAMMTSAT +/ +&NAMMTT +/ +&NAMMUL +/ +&NAMNMI +/ +&NAMNASA +/ +&NAMNN +/ +&NAMNPROF +/ +&NAMNUD +/ +&NAMOBS +/ +&NAMONEDVAR +/ +&NAMOPH +/ +&NAMOPTCMEM +/ +&NAMPAR0 +/ +&NAMPARAR +/ +&NAMPAR1 +/ +&NAMPHY +/ +&NAMPHY0 +/ +&NAMPHY1 +/ +&NAMPHY2 +/ +&NAMPHY3 +/ +&NAMPHYDS +/ +&NAMPPC +/ +&NAMPONG +/ +&NAMRAD15 +/ +&NAMRADCMEM +/ +&NAMRCOEF +/ +&NAMRES +/ +&NAMRINC +/ +&NAMRIP +/ +&NAMSATS +/ +&NAMSCC +/ +&NAMSCEN +/ +&NAMSCM +/ +&NAMSENS +/ +&NAMSIMPHL +/ +&NAMSKF +/ +&NAMSPSDT +/ +&NAMSPP +/ +&NAMSSMI +/ +&NAMSTA +/ +&NAMSTOPH +/ +&NAMTCWV +/ +&NAMTESTVAR +/ +&NAMTOPH +/ +&NAMTOVS +/ +&NAMTRAJP +/ +&NAMTRANS +/ +&NAMTRM +/ +&NAMVAR +/ +&NAMVARBC +/ +&NAMVARBC_AIREP +/ +&NAMVARBC_ALLSKY +/ +&NAMVARBC_GBRAD +/ +&NAMVARBC_RAD +/ +&NAMVARBC_SFCOBS +/ +&NAMVARBC_TCWV +/ +&NAMVARBC_TO3 +/ +&NAMVAREPS +/ +&NAMVDOZ +/ +&NAMVFP +/ +&NAMVRTL +/ +&NAMVV0 +/ +&NAMVV1 +/ +&NAMVV2 +/ +&NAMVWRK +/ +&NAMWAVELETJB +/ +&NAMXFU +/ +&NAMZDI +/ +&NAPHLC +/ +&NAV1IS +/ +&NAEPHLI +/ +&NAMCVER +/ +&NAMPPVI +/ +&NAMSPNG +/ +&NAMRLX +/ +&NAMTHLIM +/ +&NAMOOPS +/ +&NAMINTFLEX +/ +&NAMIAU +/ +&NAMDIM_TRAJ +/ +&NAMVDF +/ +&NAMGWDIAG +/ +&NAMTRANS0 +/ +&NAMMETHOX +/ +&NAM_ATLAS_IFS +/ +&NAETLDIAG +/ +&NAMACV +/ +&NAM_MGRIDS_ADVECTION +/ +&NAMTRAJ +/ +&NAMSATSIM +/ +&NAMCMEM_MW +/ +&NAMPHMSE +/ +&NAMNORGWD +/ +&NAMCLRADLID +/ +&NAMDVISI +/ +&NAM_MGRIDS_ADVECTION +/ +&NAMNUDGLH +/ +&NAMPERTOBS +/ +&NAMVARBC_MODES +/ +&NAMM7CTL +/ diff --git a/ifs-test/tests/t255/common/namelists b/ifs-test/tests/t255/common/namelists new file mode 100644 index 00000000..d18f98de --- /dev/null +++ b/ifs-test/tests/t255/common/namelists @@ -0,0 +1,121 @@ +# Namelists that can be shared by all tests. +# Note that some tests may not use all namelists present here; +# e.g. tests adj, sv and tl_taylor do not read namelist NAMAFN. + +# Settings that may be overwritten in individual tests: +# NAMDIM +NPROMA=${NPROMA:-"-24"} + +# NAMPAR0 +LDETAILED_STATS=${LDETAILED_STATS:-".TRUE."} +MBX_SIZE=${MBX_SIZE:-"1000000"} + +# NAMPAR1 +# Additional options as needed: +NAMPAR1_EXTRA=${NAMPAR1_EXTRA:-""} + +# NAMCT0 +LFDBOP=${LFDBOP:-".FALSE."} +NFRHIS=${NFRHIS:-"99"} +NFRPOS=${NFRPOS:-"99"} +NFPOS=${NFPOS:-"2"} +NFRDHP=${NFRDHP:-"1"} +NFRDHFD=${NFRDHFD:-"1"} +NUNDEFLD=${NUNDEFLD:-"-99999999"} +# Additional options as needed: +NAMCT0_EXTRA=${NAMCT0_EXTRA:-""} + +# NAMARG +NCONF=${NCONF:-"1"} +CNMEXP=${CNMEXP:-"'epc8'"} + +# NAMRIP +CSTOP=${CSTOP:-"'t6'"} +TSTEP=${TSTEP:-"3600.000000"} + +# NAEPHY +LEPHYS=${LEPHYS:-".TRUE."} +LSLPHY=${LSLPHY:-".TRUE."} +LERADI=${LERADI:-".TRUE."} +LELAIV=${LELAIV:-".FALSE."} +LEO3CH=${LEO3CH:-".FALSE."} +# Additional options as needed: +NAEPHY_EXTRA=${NAEPHY_EXTRA:-""} + +# NAMDPHY +NVEXTR=${NVEXTR:-"0"} +NCEXTR=${NCEXTR:-"0"} +NAMGEM_EXTRA=${NAMGEM_EXTRA:-""} + +# Create namelist file: +cat > fort.4 << EOF +&NAMDIM +NPROMA=$NPROMA, +/ +&NAMPAR0 +LSTATS=.TRUE., +LDETAILED_STATS=$LDETAILED_STATS, +LSYNCSTATS=.FALSE., +MP_TYPE=2, +MBX_SIZE=$MBX_SIZE, +NPROC=$NPROC, +NOUTPUT=1, +/ +&NAMPAR1 +LSPLIT=.TRUE., +NFLDIN=0, +NSTRIN=1, +NSTROUT=0, +NOUTTYPE=1, +$NAMPAR1_EXTRA +/ +&NAMCT0 +NFRSDI=1, +N3DINI=0, +LREFOUT=.FALSE., +LFDBOP=$LFDBOP, +NFRHIS=$NFRHIS, +NFRPOS=$NFRPOS, +NFPOS=$NFPOS, +NFRDHP=$NFRDHP, +NFRDHFD=$NFRDHFD, +NUNDEFLD=$NUNDEFLD, +$NAMCT0_EXTRA +/ +&NAMARG +LECMWF=.TRUE., +NCONF=$NCONF, +CNMEXP=$CNMEXP, +/ +&NAMRIP +CSTOP=$CSTOP, +TSTEP=$TSTEP, +/ +&NAEPHY +NALBEDOSCHEME=1, +LEPHYS=$LEPHYS, +LSLPHY=$LSLPHY, +LERADI=$LERADI, +LELAIV=$LELAIV, +LEO3CH=$LEO3CH, +LESNML=.true., +NSNMLWS=2, +$NAEPHY_EXTRA +/ +&NAMGEM +NHTYP=0, +$NAMGEM_EXTRA +/ +&NAMAFN +TFP_FUA(1)%LLGP=.FALSE., +/ +&NAMDPHY +NVEXTR=$NVEXTR, +NCEXTR=$NCEXTR, +NCSNEC=5, +/ +&NAMGRIB +NCYCLE=147, +$NAMGRIB_EXTRA +/ +EOF diff --git a/ifs-test/tests/t255/ifsdata/C11CLIM b/ifs-test/tests/t255/ifsdata/C11CLIM new file mode 120000 index 00000000..f740c646 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/C11CLIM @@ -0,0 +1 @@ +../../t21/ifsdata/C11CLIM \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/C12CLIM b/ifs-test/tests/t255/ifsdata/C12CLIM new file mode 120000 index 00000000..17d84fad --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/C12CLIM @@ -0,0 +1 @@ +../../t21/ifsdata/C12CLIM \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/C22CLIM b/ifs-test/tests/t255/ifsdata/C22CLIM new file mode 120000 index 00000000..61ca5eb9 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/C22CLIM @@ -0,0 +1 @@ +../../t21/ifsdata/C22CLIM \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/CCL4CLIM b/ifs-test/tests/t255/ifsdata/CCL4CLIM new file mode 120000 index 00000000..ab4102e9 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/CCL4CLIM @@ -0,0 +1 @@ +../../t21/ifsdata/CCL4CLIM \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/CH4CLIM b/ifs-test/tests/t255/ifsdata/CH4CLIM new file mode 120000 index 00000000..406827a4 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/CH4CLIM @@ -0,0 +1 @@ +../../t21/ifsdata/CH4CLIM \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/CO2CLIM b/ifs-test/tests/t255/ifsdata/CO2CLIM new file mode 120000 index 00000000..460ea313 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/CO2CLIM @@ -0,0 +1 @@ +../../t21/ifsdata/CO2CLIM \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/ECOZC b/ifs-test/tests/t255/ifsdata/ECOZC new file mode 120000 index 00000000..95c80910 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/ECOZC @@ -0,0 +1 @@ +../../t21/ifsdata/ECOZC \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/GCH4CLIM b/ifs-test/tests/t255/ifsdata/GCH4CLIM new file mode 120000 index 00000000..05515b27 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/GCH4CLIM @@ -0,0 +1 @@ +../../t21/ifsdata/GCH4CLIM \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/GCO2CLIM b/ifs-test/tests/t255/ifsdata/GCO2CLIM new file mode 120000 index 00000000..7ac2e3b5 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/GCO2CLIM @@ -0,0 +1 @@ +../../t21/ifsdata/GCO2CLIM \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/GOZOCLIM b/ifs-test/tests/t255/ifsdata/GOZOCLIM new file mode 120000 index 00000000..dc421863 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/GOZOCLIM @@ -0,0 +1 @@ +../../t21/ifsdata/GOZOCLIM \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/MCH4CLIM b/ifs-test/tests/t255/ifsdata/MCH4CLIM new file mode 120000 index 00000000..2e1709ba --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/MCH4CLIM @@ -0,0 +1 @@ +../../t21/ifsdata/MCH4CLIM \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/MCICA b/ifs-test/tests/t255/ifsdata/MCICA new file mode 120000 index 00000000..a2c8c3fc --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/MCICA @@ -0,0 +1 @@ +../../t21/ifsdata/MCICA \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/MCO2CLIM b/ifs-test/tests/t255/ifsdata/MCO2CLIM new file mode 120000 index 00000000..92f7b548 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/MCO2CLIM @@ -0,0 +1 @@ +../../t21/ifsdata/MCO2CLIM \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/MOZOCLIM b/ifs-test/tests/t255/ifsdata/MOZOCLIM new file mode 120000 index 00000000..255761c6 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/MOZOCLIM @@ -0,0 +1 @@ +../../t21/ifsdata/MOZOCLIM \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/N2OCLIM b/ifs-test/tests/t255/ifsdata/N2OCLIM new file mode 120000 index 00000000..02de0c06 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/N2OCLIM @@ -0,0 +1 @@ +../../t21/ifsdata/N2OCLIM \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/NO2CLIM b/ifs-test/tests/t255/ifsdata/NO2CLIM new file mode 120000 index 00000000..3ac8455b --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/NO2CLIM @@ -0,0 +1 @@ +../../t21/ifsdata/NO2CLIM \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/OZOCLIM b/ifs-test/tests/t255/ifsdata/OZOCLIM new file mode 120000 index 00000000..f5669419 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/OZOCLIM @@ -0,0 +1 @@ +../../t21/ifsdata/OZOCLIM \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/RADRRTM b/ifs-test/tests/t255/ifsdata/RADRRTM new file mode 120000 index 00000000..4c41eabb --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/RADRRTM @@ -0,0 +1 @@ +../../t21/ifsdata/RADRRTM \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/RADSRTM b/ifs-test/tests/t255/ifsdata/RADSRTM new file mode 120000 index 00000000..6da435c6 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/RADSRTM @@ -0,0 +1 @@ +../../t21/ifsdata/RADSRTM \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/SO4_A1B2000 b/ifs-test/tests/t255/ifsdata/SO4_A1B2000 new file mode 120000 index 00000000..041ab211 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/SO4_A1B2000 @@ -0,0 +1 @@ +../../t21/ifsdata/SO4_A1B2000 \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/SO4_A1B2010 b/ifs-test/tests/t255/ifsdata/SO4_A1B2010 new file mode 120000 index 00000000..d3c95ce3 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/SO4_A1B2010 @@ -0,0 +1 @@ +../../t21/ifsdata/SO4_A1B2010 \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/SO4_A1B2020 b/ifs-test/tests/t255/ifsdata/SO4_A1B2020 new file mode 120000 index 00000000..65c1a7e4 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/SO4_A1B2020 @@ -0,0 +1 @@ +../../t21/ifsdata/SO4_A1B2020 \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/SO4_A1B2030 b/ifs-test/tests/t255/ifsdata/SO4_A1B2030 new file mode 120000 index 00000000..4a8032e3 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/SO4_A1B2030 @@ -0,0 +1 @@ +../../t21/ifsdata/SO4_A1B2030 \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/SO4_A1B2040 b/ifs-test/tests/t255/ifsdata/SO4_A1B2040 new file mode 120000 index 00000000..15109f3c --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/SO4_A1B2040 @@ -0,0 +1 @@ +../../t21/ifsdata/SO4_A1B2040 \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/SO4_A1B2050 b/ifs-test/tests/t255/ifsdata/SO4_A1B2050 new file mode 120000 index 00000000..9c300ce1 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/SO4_A1B2050 @@ -0,0 +1 @@ +../../t21/ifsdata/SO4_A1B2050 \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/SO4_A1B2060 b/ifs-test/tests/t255/ifsdata/SO4_A1B2060 new file mode 120000 index 00000000..cd03cdab --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/SO4_A1B2060 @@ -0,0 +1 @@ +../../t21/ifsdata/SO4_A1B2060 \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/SO4_A1B2070 b/ifs-test/tests/t255/ifsdata/SO4_A1B2070 new file mode 120000 index 00000000..0bb9e6c4 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/SO4_A1B2070 @@ -0,0 +1 @@ +../../t21/ifsdata/SO4_A1B2070 \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/SO4_A1B2080 b/ifs-test/tests/t255/ifsdata/SO4_A1B2080 new file mode 120000 index 00000000..57435d7d --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/SO4_A1B2080 @@ -0,0 +1 @@ +../../t21/ifsdata/SO4_A1B2080 \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/SO4_A1B2090 b/ifs-test/tests/t255/ifsdata/SO4_A1B2090 new file mode 120000 index 00000000..14426887 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/SO4_A1B2090 @@ -0,0 +1 @@ +../../t21/ifsdata/SO4_A1B2090 \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/SO4_A1B2100 b/ifs-test/tests/t255/ifsdata/SO4_A1B2100 new file mode 120000 index 00000000..6df63338 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/SO4_A1B2100 @@ -0,0 +1 @@ +../../t21/ifsdata/SO4_A1B2100 \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/SO4_OBS1920 b/ifs-test/tests/t255/ifsdata/SO4_OBS1920 new file mode 120000 index 00000000..bb20b1ce --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/SO4_OBS1920 @@ -0,0 +1 @@ +../../t21/ifsdata/SO4_OBS1920 \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/SO4_OBS1930 b/ifs-test/tests/t255/ifsdata/SO4_OBS1930 new file mode 120000 index 00000000..6ac3f4cb --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/SO4_OBS1930 @@ -0,0 +1 @@ +../../t21/ifsdata/SO4_OBS1930 \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/SO4_OBS1940 b/ifs-test/tests/t255/ifsdata/SO4_OBS1940 new file mode 120000 index 00000000..7086e65f --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/SO4_OBS1940 @@ -0,0 +1 @@ +../../t21/ifsdata/SO4_OBS1940 \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/SO4_OBS1950 b/ifs-test/tests/t255/ifsdata/SO4_OBS1950 new file mode 120000 index 00000000..48413184 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/SO4_OBS1950 @@ -0,0 +1 @@ +../../t21/ifsdata/SO4_OBS1950 \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/SO4_OBS1960 b/ifs-test/tests/t255/ifsdata/SO4_OBS1960 new file mode 120000 index 00000000..66be33ee --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/SO4_OBS1960 @@ -0,0 +1 @@ +../../t21/ifsdata/SO4_OBS1960 \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/SO4_OBS1970 b/ifs-test/tests/t255/ifsdata/SO4_OBS1970 new file mode 120000 index 00000000..2f9d2f32 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/SO4_OBS1970 @@ -0,0 +1 @@ +../../t21/ifsdata/SO4_OBS1970 \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/SO4_OBS1980 b/ifs-test/tests/t255/ifsdata/SO4_OBS1980 new file mode 120000 index 00000000..9eca8471 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/SO4_OBS1980 @@ -0,0 +1 @@ +../../t21/ifsdata/SO4_OBS1980 \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/SO4_OBS1990 b/ifs-test/tests/t255/ifsdata/SO4_OBS1990 new file mode 120000 index 00000000..e17e2801 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/SO4_OBS1990 @@ -0,0 +1 @@ +../../t21/ifsdata/SO4_OBS1990 \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/aerosol_cams_climatology_43R3a.nc b/ifs-test/tests/t255/ifsdata/aerosol_cams_climatology_43R3a.nc new file mode 120000 index 00000000..57324fee --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/aerosol_cams_climatology_43R3a.nc @@ -0,0 +1 @@ +../../t21/ifsdata/aerosol_cams_climatology_43R3a.nc \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_43R3.nc b/ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_43R3.nc new file mode 120000 index 00000000..f749f58c --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_43R3.nc @@ -0,0 +1 @@ +../../t21/ifsdata/aerosol_ifs_rrtm_43R3.nc \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_45R2.nc b/ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_45R2.nc new file mode 120000 index 00000000..4c4f8712 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_45R2.nc @@ -0,0 +1 @@ +../../t21/ifsdata/aerosol_ifs_rrtm_45R2.nc \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_46R1.nc b/ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_46R1.nc new file mode 120000 index 00000000..067beaec --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_46R1.nc @@ -0,0 +1 @@ +../../t21/ifsdata/aerosol_ifs_rrtm_46R1.nc \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_46R1_with_NI_AM.nc b/ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_46R1_with_NI_AM.nc new file mode 120000 index 00000000..0b101029 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_46R1_with_NI_AM.nc @@ -0,0 +1 @@ +../../t21/ifsdata/aerosol_ifs_rrtm_46R1_with_NI_AM.nc \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_48R1.nc b/ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_48R1.nc new file mode 120000 index 00000000..64ac0d9e --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_48R1.nc @@ -0,0 +1 @@ +../../t21/ifsdata/aerosol_ifs_rrtm_48R1.nc \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_48R1_v2.nc b/ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_48R1_v2.nc new file mode 120000 index 00000000..c3ea60cb --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_48R1_v2.nc @@ -0,0 +1 @@ +../../t21/ifsdata/aerosol_ifs_rrtm_48R1_v2.nc \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_tegen.nc b/ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_tegen.nc new file mode 120000 index 00000000..3a1cbee6 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_tegen.nc @@ -0,0 +1 @@ +../../t21/ifsdata/aerosol_ifs_rrtm_tegen.nc \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/fu_ice_scattering_rrtm.nc b/ifs-test/tests/t255/ifsdata/fu_ice_scattering_rrtm.nc new file mode 120000 index 00000000..05b351c3 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/fu_ice_scattering_rrtm.nc @@ -0,0 +1 @@ +../../t21/ifsdata/fu_ice_scattering_rrtm.nc \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/greenhouse_gas_climatology_46r1.nc b/ifs-test/tests/t255/ifsdata/greenhouse_gas_climatology_46r1.nc new file mode 120000 index 00000000..a51a8ba6 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/greenhouse_gas_climatology_46r1.nc @@ -0,0 +1 @@ +../../t21/ifsdata/greenhouse_gas_climatology_46r1.nc \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/greenhouse_gas_climatology_48r1.nc b/ifs-test/tests/t255/ifsdata/greenhouse_gas_climatology_48r1.nc new file mode 120000 index 00000000..6e150f99 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/greenhouse_gas_climatology_48r1.nc @@ -0,0 +1 @@ +../../t21/ifsdata/greenhouse_gas_climatology_48r1.nc \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/greenhouse_gas_timeseries_CMIP6_SSP370_CFC11equiv_47r1.nc b/ifs-test/tests/t255/ifsdata/greenhouse_gas_timeseries_CMIP6_SSP370_CFC11equiv_47r1.nc new file mode 120000 index 00000000..de9db8a9 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/greenhouse_gas_timeseries_CMIP6_SSP370_CFC11equiv_47r1.nc @@ -0,0 +1 @@ +../../t21/ifsdata/greenhouse_gas_timeseries_CMIP6_SSP370_CFC11equiv_47r1.nc \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/mcica_gamma.nc b/ifs-test/tests/t255/ifsdata/mcica_gamma.nc new file mode 120000 index 00000000..6867db30 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/mcica_gamma.nc @@ -0,0 +1 @@ +../../t21/ifsdata/mcica_gamma.nc \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/rtable_2021 b/ifs-test/tests/t255/ifsdata/rtable_2021 new file mode 120000 index 00000000..824e2a18 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/rtable_2021 @@ -0,0 +1 @@ +../../t21/ifsdata/rtable_2021 \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/rtables b/ifs-test/tests/t255/ifsdata/rtables new file mode 120000 index 00000000..70dc7181 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/rtables @@ -0,0 +1 @@ +/perm/nld5163/openifs/oifs_data/48r1/rtables \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/socrates_droplet_scattering_rrtm.nc b/ifs-test/tests/t255/ifsdata/socrates_droplet_scattering_rrtm.nc new file mode 120000 index 00000000..821344c4 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/socrates_droplet_scattering_rrtm.nc @@ -0,0 +1 @@ +../../t21/ifsdata/socrates_droplet_scattering_rrtm.nc \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/total_solar_irradiance_CMIP6_47r1.nc b/ifs-test/tests/t255/ifsdata/total_solar_irradiance_CMIP6_47r1.nc new file mode 120000 index 00000000..d3a39f3b --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/total_solar_irradiance_CMIP6_47r1.nc @@ -0,0 +1 @@ +../../t21/ifsdata/total_solar_irradiance_CMIP6_47r1.nc \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/vtable_L19 b/ifs-test/tests/t255/ifsdata/vtable_L19 new file mode 120000 index 00000000..24f440bf --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/vtable_L19 @@ -0,0 +1 @@ +../../t21/ifsdata/vtable_L19 \ No newline at end of file diff --git a/ifs-test/tests/t255/inidata/ICMCLham7INIT b/ifs-test/tests/t255/inidata/ICMCLham7INIT new file mode 120000 index 00000000..3f2b1f76 --- /dev/null +++ b/ifs-test/tests/t255/inidata/ICMCLham7INIT @@ -0,0 +1 @@ +/ec/res4/hpcperm/nld5163/openifs/oifs_refs/ham7/2023070100/ICMCLham7INIT \ No newline at end of file diff --git a/ifs-test/tests/t255/inidata/ICMGGham7INIT b/ifs-test/tests/t255/inidata/ICMGGham7INIT new file mode 120000 index 00000000..e0977be6 --- /dev/null +++ b/ifs-test/tests/t255/inidata/ICMGGham7INIT @@ -0,0 +1 @@ +/ec/res4/hpcperm/nld5163/openifs/oifs_refs/ham7/2023070100/ICMGGham7INIT \ No newline at end of file diff --git a/ifs-test/tests/t255/inidata/ICMGGham7INIUA b/ifs-test/tests/t255/inidata/ICMGGham7INIUA new file mode 120000 index 00000000..76090177 --- /dev/null +++ b/ifs-test/tests/t255/inidata/ICMGGham7INIUA @@ -0,0 +1 @@ +/ec/res4/hpcperm/nld5163/openifs/oifs_refs/ham7/2023070100/ICMGGham7INIUA \ No newline at end of file diff --git a/ifs-test/tests/t255/inidata/ICMSHham7INIT b/ifs-test/tests/t255/inidata/ICMSHham7INIT new file mode 120000 index 00000000..06ec23ff --- /dev/null +++ b/ifs-test/tests/t255/inidata/ICMSHham7INIT @@ -0,0 +1 @@ +/ec/res4/hpcperm/nld5163/openifs/oifs_refs/ham7/2023070100/ICMSHham7INIT \ No newline at end of file diff --git a/ifs-test/tests/t255/test_compo_fc_m7/README.md b/ifs-test/tests/t255/test_compo_fc_m7/README.md new file mode 100644 index 00000000..f590620a --- /dev/null +++ b/ifs-test/tests/t255/test_compo_fc_m7/README.md @@ -0,0 +1,6 @@ +title: test_compo_fc + +# Description + +Forecast test including prognostic composition (aerosols+chemistry) as +used by CAMS. diff --git a/ifs-test/tests/t255/test_compo_fc_m7/params b/ifs-test/tests/t255/test_compo_fc_m7/params new file mode 100644 index 00000000..1545ce42 --- /dev/null +++ b/ifs-test/tests/t255/test_compo_fc_m7/params @@ -0,0 +1,2 @@ +NPROC=2 +NTHREAD=1 diff --git a/ifs-test/tests/t255/test_compo_fc_m7/postprocessing b/ifs-test/tests/t255/test_compo_fc_m7/postprocessing new file mode 100644 index 00000000..40f80871 --- /dev/null +++ b/ifs-test/tests/t255/test_compo_fc_m7/postprocessing @@ -0,0 +1,4 @@ +echo "No sanity checks implemented" + +./ifs-check-tracers +./ifs-check-bitid diff --git a/ifs-test/tests/t255/test_compo_fc_m7/setup b/ifs-test/tests/t255/test_compo_fc_m7/setup new file mode 100644 index 00000000..ac31538a --- /dev/null +++ b/ifs-test/tests/t255/test_compo_fc_m7/setup @@ -0,0 +1,218 @@ +################################################################################ +# Setup file for m7 tests in openifs/ac +# +# Created Feb-2024 Ramiro Checa-Garcia (KNMI) +# +# Updates: +# 01-03-2024 Ramiro Checa-Garcia (KNMI) +# + +# Source common environment variables +. ../common/env_vars + +# Pre-empt some common namelist settings. +# NAMARG: +CNMEXP="'ham7'" + +# NAEPHY: +LEO3CH=".TRUE." +NAEPHY_EXTRA="LO3CH_HLO=.FALSE.," + +# NAMDPHY: +NVEXTR="7" +NCEXTR="137" + +# NAMRIP +CSTOP=${CSTOP:-"'t2'"} # CSTOP: define num. timesteps +TSTEP=${TSTEP:-"600.000000"} # TSTEP: define time-step in seconds (??) + +NPROC=8 + +# NAMCT0: +NFRPOS=3 +# NAMCT0_EXTRA="NSPPR=1," # uncomment for per-level norms + +# Include common namelists +. ../common/namelists + +# Note: In this setup we include some details by blocks to have a +# more structured and easier to read setup file. For the final +# namelist please check fort.4 after run the experiment. + +cat >> fort.4 << EOF +&NAMGFL +!NGHG=2, +!YLRCH4_NL%CNAME='kCH4', +!YLRCH4_NL%IGRBCODE=210071, +!YLRCH4_NL%LGP=.TRUE.,YLRCH4_NL%LTRAJIO=.FALSE., +!YGHG_NL(1)%CNAME='CO2_GHG', +!YGHG_NL(1)%IGRBCODE=210061, +!YGHG_NL(1)%LADV5=true, +!YGHG_NL(1)%LASSIM=true, +!YGHG_NL(1)%LMASSFIX=true, +!YGHG_NL(1)%LNEGFIX=.FALSE., +!YGHG_NL(1)%LQM=false, +!YGHG_NL(1)%LQM3D=true, +!YGHG_NL(1)%BETAMFBC=2, +!YGHG_NL(2)%CNAME='CH4_GHG', +!YGHG_NL(2)%IGRBCODE=210062, +!YGHG_NL(2)%LADV5=true, +!YGHG_NL(2)%LASSIM=true, +!YGHG_NL(2)%LMASSFIX=true, +!YGHG_NL(2)%LNEGFIX=.FALSE., +!YGHG_NL(2)%LQM=false, +!YGHG_NL(2)%LQM3D=true, +!YGHG_NL(2)%BETAMFBC=2, +EOF + +# Include NAMGLF for aerosols (m7) +. ../common/namelist_m7_aero + +cat >> fort.4 << EOF +LAERAOT=false, +LAERLISI=false, +NAEROUT=0, +!YAEROUT_NL(1)%CNAME='AEROUT-7', +!YAEROUT_NL(1)%IGRBCODE=210022, +NUVP=1, +YUVP_NL(1)%CNAME='UVP2DRAD', +YUVP_NL(1)%IGRBCODE=210055, +EOF + +# === Include NAMGLF for NAERO_WVL_DIAG +# Please comment/uncomment the appropiate line +# +#. ../common/namelist_aer_aerowvldiag # aerwvl used in test_compo_fc +. ../common/namelist_m7_aerowvldiag # aerwvl used in openifs/ac/m7 + + +# === Include chem NAMGLF and YEXT_NL (but only to describe species/outputs) +# Please comment/uncomment the appropiate line +# +#. ../common/namelist_aer_chem # original test_compo_fc settings +. ../common/namelist_m7_chem # chem used in openifs/ac + + + +cat >> fort.4 << EOF + LAERCHEM=true + YQ_NL%LGP=true, + YQ_NL%LSP=false, + YL_NL%LGP=true, + YI_NL%LGP=true, + YA_NL%LGP=true, + YO3_NL%LGP=true, + YQ_NL%LGPINGP=true, + !YR_NL%NREQIN=-1, + !YS_NL%NREQIN=-1, +/ +&NAERAD + CRTABLEDIR='./ifsdata/rtables/', + LECOMPGRID=false, + RMUZUV=0.01, + NUVTIM=72, + NRADUV=1, + NUV=24, + LUVPROC=false, ! CHECK + LUVAERP=true, + KMODTS=2, + NRPROMA=0, + LEPO3RA=true, + LO3_CHEM_UV=true, + NGHGRAD=20, + NAERMACC=1, + !LAER3D=.false., ! LAER3D: which aerosols climatology 2D vs 3D is used +/ +&NAMFPC + CFPFMT="MODEL", + NFP3DFS=2, + NFP3DFP=2, + MFP3DFS(:)=210203,212255 + MFP3DFP(:)=210011,217003 + NFP2DF=1, + MFP2DF(:)=152, + NFPPHY=8, + MFPPHY(:)=210072,210073,210074,210208,210052,214002,210207,215089, + NRFP3S(:)=-99, + RFP3P=100000.,85000.,70000.,50000., +/ +&NAEAER +EOF + +# === Include NAEAER description (YAERO_DESC) => possible not for m7 +# Please comment/uncomment the appropiate line +. ../common/namelist_aer_yaerodesc # original test_compo_fc description + +cat >> fort.4 << EOF + LAERVOL=false, + NDRYDEPVEL_DYN=2, + LAERDUSTSOURCE=true, + LAERDUSTSIZEVAR=true, + LAERDUST_NEWBIN=false, + RAERDUST_REBOUND=0.1, + LAERNGAT=true, + NAERSCAV=3, + LAERGTOP=true, + LAERSEDIM=true, + LAERSEDIMSS=true, + LAERDRYDP=true, + LAERSURF=true, + NSSALT=4, + NDDUST=2, + NSO4SCHEME=1, + LSEASALT_RH80=true, + LAERHYGRO=true, + LAERRRTM=false, +/ +&NAMCOMPO + LCHEM_DIA=true, + LCHEM_DDFLX=true, + LCOMPO_DDFLX_DIR=true, + LCHEM_TROPO=true, + LCOMPO_DCDD=true, + LAERNITRATE=true, + LAEREQSAM4CLIM=false, + LAERSOA=false, + LAERSOA_COUPLED=false, + KGHG_CHEMTEND_CH4=0, + LAERNUCL=true, + AERO_SCHEME="hamm7", +/ +&NAMCHEM + CHEM_SCHEME="tm5", + LCHEM_DIAC=false, + LCHEM_LIGHT=true, + KCHEM_DRYDEP=2, + LCHEM_0NOX=false, + KCHEM_NOXADV=0, + LCHEM_ANAO3=false, + KCHEM_SOLVE=2, + LCHEM_REVCHEM=false, + LCHEM_BASCOE_JON=false, + LCHEM_BASCOE_HETCHEM=true, + LCHEM_EXTENDJNO2=true, + LCHEM_JOUT=false, + LCHEM_AEROI=false, + LCHEM_O3RAD=true, + LCHEM_CSHAPE=.false., + LCHEM_WDFR=.true., +/ + +&NAMMCC + LMCCEC=true, + LMCCIEC=false, + LMCC_COMPO=false, +/ +EOF + +# === Include compo emissions namelist (moved to end of file) +# Please comment/ uncomment the appropiate line +# +#. ../common/namelist_aer_compoemis # original test_compo_fc emissions + +. ../common/namelist_m7_compoemis # emissions used in openifs/ac + +cat >> fort.4 << EOF +&NAMM7CTL +/ +EOF diff --git a/oifs-config.nld5163.sh b/oifs-config.nld5163.sh new file mode 100644 index 00000000..1e6f28bc --- /dev/null +++ b/oifs-config.nld5163.sh @@ -0,0 +1,97 @@ +# +# +# oifs-config.edit_me.sh +# +# +# This script sets the environment for OpenIFS 48r1 +# +# +# Read this script using the command: +# +# source ./oifs-config.edit_me.sh +# +# +#--- set machine specific settings ----------------------------- + +export OIFS_HOST="ecmwf" +export OIFS_PLATFORM="hpc2020" + + +#--- set principal OIFS variables ------------------------------ +# +# CUSTOMIZED FOR USER NLD5163 +# +# CODE ----> stored in $PERM/openifs/oifs_code/branch_name/openifs-48r1 +# DATA ----> stored in $PERM/openifs/oifs_data/CYCLE/ +# EXPS ----> stored in $PERM/openifs/oifs_exps/CYCLE/ +# +# This file is therefore adapted to this particular workflow +# +# +# +# + +branch_path="$(pwd)" # We run this script in its directoryr +IFS=$IFS"/" # We will split path in char "/". IFS variable is bash stuff. +array_path=() # Initialize array to empty +for i in $branch_path; do # We fill array with elements + array_path+=($i) +done + +branch_name=${array_path[4]} # In my current setting branch_name is in position 3 (from 0) +echo +echo "Selecting the branch as: "$branch_name +export OIFS_CYCLE=48r1 + +#---Base code assumes openifs-48r1 and openifs-expt are installed +#---in $HOME. Either these can be changed by the user------------ + +export OIFS_HOME="${PERM}/openifs/oifs_code/"$branch_name"/openifs-48r1" + +#---It is recommended that the openifs-expt and oifs_data dir +#---exist in a location designed for permanent storage----------- +export OIFS_EXPT="${PERM}/openifs/oifs_exps"/${OIFS_CYCLE} +export OIFS_DATA_DIR="${HPCPERM}/openifs/oifs_data/"${OIFS_CYCLE} + +#---Set the path for the arch directory. Depending on system,i.e., +#---all libs are installed on the sytem, this is not required, +#---so set to an empty string OIFS_ARCH="" +export OIFS_ARCH="./arch/ecmwf/hpc2020" + +#---Path to the executable for 3d global model. This is the +#---default path for the exe, produced by openifs-test.sh. +#---DP means double precision. To run single precision change +#---DP to SP +export OIFS_EXEC="${OIFS_HOME}/build/bin/ifsMASTER.DP" + +#---Default assumed paths, only change if you know what you are doing +export OIFS_TEST="${OIFS_HOME}/scripts/build_test" +export OIFS_RUN_SCRIPT="${OIFS_HOME}/scripts/exp_3d" +export OIFS_LOGFILE="${OIFS_HOME}/oifs_test_log.txt" + +alias oenv="env -0 | sort -z | tr '\0' '\n' | grep -a OIFS_" + +echo -e "\nOpenIFS environment variables are:" +echo "------------------------------------------------------" +env -0 | sort -z | tr '\0' '\n' | grep -a OIFS_ +echo + +#---Path to the executable for the SCM. This is the +#---default path for the exe, produced by openifs-test.sh. +#---DP means double precision. To run single precision change +#---DP to SP +export SCM_EXEC="${OIFS_HOME}/build/bin/MASTER_scm.DP" + +#---Default assumed paths, only change if you know what you are doing +export SCM_TEST="${OIFS_HOME}/scripts/scm" +export SCM_RUNDIR="${OIFS_EXPT}/scm_openifs/48r1/scm-projects/ref48r1" +export SCM_PROJDIR="${OIFS_EXPT}/scm_openifs/48r1/scm-projects" +export SCM_VERSIONDIR="${OIFS_EXPT}/scm_openifs/48r1" +export SCM_LOGFILE="${SCM_RUNDIR}/scm_run_log.txt" + +alias scm_env="env -0 | sort -z | tr '\0' '\n' | grep -a SCM_" + +echo -e "\nSCM environment variables are:" +echo "------------------------------------------------------" +env -0 | sort -z | tr '\0' '\n' | grep -a SCM_ +echo diff --git a/scripts/build_test/openifs-test.sh b/scripts/build_test/openifs-test.sh index 6356ed4d..b5b695d5 100755 --- a/scripts/build_test/openifs-test.sh +++ b/scripts/build_test/openifs-test.sh @@ -239,7 +239,7 @@ fi if [[ "$PLATFORM" == "hpc2020" ]] ; then IGT_BUILD_LAUNCHER="${IGT_BUILD_LAUNCHER-srun -c ${NUM_THREADS} --mem=60GB --time=60}" - IGT_TEST_LAUNCHER="${IGT_TEST_LAUNCHER-salloc -n 8 --mem=20GB --time=120}" + IGT_TEST_LAUNCHER="${IGT_TEST_LAUNCHER-salloc -n 16 --mem=120GB --time=340}" else IGT_BUILD_LAUNCHER="${IGT_BUILD_LAUNCHER:-}" IGT_TEST_LAUNCHER="${IGT_TEST_LAUNCHER:-}" From 037242566dee68365f4ca048db48aeb49ffa9e45 Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Thu, 7 Mar 2024 13:47:26 +0100 Subject: [PATCH 016/129] [tests] Add AER namelists --- ifs-test/tests/t21/common/aer/aer_chem.nml | 675 ++++++++++++++++++ .../tests/t21/common/aer/aer_compoemis.nml | 51 ++ ifs-test/tests/t21/common/aer/m7_aero_old.nml | 338 +++++++++ .../t21/common/aer/m7_aerowvldiag_old.nml | 46 ++ .../tests/t255/common/aer/aer_aerowvldiag.nml | 46 ++ ifs-test/tests/t255/common/aer/aer_chem.nml | 675 ++++++++++++++++++ .../tests/t255/common/aer/aer_compoemis.nml | 51 ++ .../tests/t255/common/aer/aer_yaerodesc.nml | 163 +++++ 8 files changed, 2045 insertions(+) create mode 100644 ifs-test/tests/t21/common/aer/aer_chem.nml create mode 100644 ifs-test/tests/t21/common/aer/aer_compoemis.nml create mode 100644 ifs-test/tests/t21/common/aer/m7_aero_old.nml create mode 100644 ifs-test/tests/t21/common/aer/m7_aerowvldiag_old.nml create mode 100644 ifs-test/tests/t255/common/aer/aer_aerowvldiag.nml create mode 100644 ifs-test/tests/t255/common/aer/aer_chem.nml create mode 100644 ifs-test/tests/t255/common/aer/aer_compoemis.nml create mode 100644 ifs-test/tests/t255/common/aer/aer_yaerodesc.nml diff --git a/ifs-test/tests/t21/common/aer/aer_chem.nml b/ifs-test/tests/t21/common/aer/aer_chem.nml new file mode 100644 index 00000000..6c508241 --- /dev/null +++ b/ifs-test/tests/t21/common/aer/aer_chem.nml @@ -0,0 +1,675 @@ +cat >> fort.4 << EOF +NGHG=2, +YLRCH4_NL%CNAME='kCH4', +YLRCH4_NL%IGRBCODE=210071, +YLRCH4_NL%LGP=.TRUE.,YLRCH4_NL%LTRAJIO=.FALSE., +YGHG_NL(1)%CNAME='CO2_GHG', +YGHG_NL(1)%IGRBCODE=210061, +YGHG_NL(1)%LADV5=true, +YGHG_NL(1)%LASSIM=true, +YGHG_NL(1)%LMASSFIX=true, +YGHG_NL(1)%LNEGFIX=.FALSE., +YGHG_NL(1)%LQM=false, +YGHG_NL(1)%LQM3D=true, +YGHG_NL(1)%BETAMFBC=2, +YGHG_NL(2)%CNAME='CH4_GHG', +YGHG_NL(2)%IGRBCODE=210062, +YGHG_NL(2)%LADV5=true, +YGHG_NL(2)%LASSIM=true, +YGHG_NL(2)%LMASSFIX=true, +YGHG_NL(2)%LNEGFIX=.FALSE., +YGHG_NL(2)%LQM=false, +YGHG_NL(2)%LQM3D=true, +YGHG_NL(2)%BETAMFBC=2, +NCHEM=57, +YCHEM_NL(1)%CNAME='O3', +YCHEM_NL(1)%NREQIN=1, +YCHEM_NL(1)%RMOLMASS=48.0, +YCHEM_NL(1)%IGRBCODE=210203, +YCHEM_NL(1)%LNEGFIX=.TRUE., +YCHEM_NL(1)%IGRIBTC=210206, +YCHEM_NL(1)%IGRIBDV=221001, +YCHEM_NL(1)%HENRYA=1.0e-2, +YCHEM_NL(1)%HENRYB=2800.0, +YCHEM_NL(1)%LMASSFIX=.TRUE., +YCHEM_NL(1)%BETAMFBC=-999.9, +YCHEM_NL(1)%LASSIM=.TRUE., +YCHEM_NL(1)%LADV5=.TRUE., +YCHEM_NL(2)%CNAME='NOx', +YCHEM_NL(2)%NREQIN=1, +YCHEM_NL(2)%RMOLMASS=14.0, +YCHEM_NL(2)%IGRBCODE=210129, +YCHEM_NL(2)%LNEGFIX=.TRUE., +YCHEM_NL(2)%IGRIBTC=210130, +YCHEM_NL(2)%LMASSFIX=.TRUE., +YCHEM_NL(2)%BETAMFBC=-999.9, +YCHEM_NL(2)%LASSIM=.FALSE., +YCHEM_NL(3)%CNAME='H2O2', +YCHEM_NL(3)%NREQIN=1, +YCHEM_NL(3)%RMOLMASS=34.0, +YCHEM_NL(3)%IGRBCODE=217003, +YCHEM_NL(3)%LNEGFIX=.TRUE., +YCHEM_NL(3)%IGRIBTC=218003, +YCHEM_NL(3)%IGRIBDV=221003, +YCHEM_NL(3)%HENRYA=8.3e4, +YCHEM_NL(3)%HENRYB=7600.0, +YCHEM_NL(3)%LMASSFIX=.TRUE., +YCHEM_NL(3)%BETAMFBC=-999.9, +YCHEM_NL(3)%LASSIM=.FALSE., +YCHEM_NL(4)%CNAME='CH4', +YCHEM_NL(4)%NREQIN=1, +YCHEM_NL(4)%RMOLMASS=16.0, +YCHEM_NL(4)%IGRBCODE=217004, +YCHEM_NL(4)%LNEGFIX=.TRUE., +YCHEM_NL(4)%IGRIBTC=218004, +YCHEM_NL(4)%LMASSFIX=.TRUE., +YCHEM_NL(4)%BETAMFBC=-999.9, +YCHEM_NL(4)%LASSIM=.FALSE., +YCHEM_NL(5)%CNAME='CO', +YCHEM_NL(5)%NREQIN=1, +YCHEM_NL(5)%RMOLMASS=28.0, +YCHEM_NL(5)%IGRBCODE=210123, +YCHEM_NL(5)%LNEGFIX=.TRUE., +YCHEM_NL(5)%IGRIBTC=210127, +YCHEM_NL(5)%IGRIBDV=221005, +YCHEM_NL(5)%HENRYA=9.7e-4, +YCHEM_NL(5)%HENRYB=1300.0, +YCHEM_NL(5)%LMASSFIX=.TRUE., +YCHEM_NL(5)%BETAMFBC=-999.9, +YCHEM_NL(5)%LASSIM=.TRUE., +YCHEM_NL(5)%LADV5=.TRUE., +YCHEM_NL(6)%CNAME='HNO3', +YCHEM_NL(6)%NREQIN=1, +YCHEM_NL(6)%RMOLMASS=63.0, +YCHEM_NL(6)%IGRBCODE=217006, +YCHEM_NL(6)%LNEGFIX=.TRUE., +YCHEM_NL(6)%IGRIBTC=218006, +YCHEM_NL(6)%IGRIBDV=221006, +YCHEM_NL(6)%HENRYA=3.2e11, +YCHEM_NL(6)%HENRYB=8700.0, +YCHEM_NL(6)%LMASSFIX=.TRUE., +YCHEM_NL(6)%BETAMFBC=-999.9, +YCHEM_NL(6)%LASSIM=.FALSE., +YCHEM_NL(7)%CNAME='CH3OOH', +YCHEM_NL(7)%NREQIN=1, +YCHEM_NL(7)%RMOLMASS=48.0, +YCHEM_NL(7)%IGRBCODE=217007, +YCHEM_NL(7)%LNEGFIX=.TRUE., +YCHEM_NL(7)%IGRIBTC=218007, +YCHEM_NL(7)%IGRIBDV=221007, +YCHEM_NL(7)%HENRYA=2.9e2, +YCHEM_NL(7)%HENRYB=5200.0, +YCHEM_NL(7)%LMASSFIX=.TRUE., +YCHEM_NL(7)%BETAMFBC=-999.9, +YCHEM_NL(7)%LASSIM=.FALSE., +YCHEM_NL(8)%CNAME='CH2O', +YCHEM_NL(8)%NREQIN=1, +YCHEM_NL(8)%RMOLMASS=30.0, +YCHEM_NL(8)%IGRBCODE=210124, +YCHEM_NL(8)%LNEGFIX=.TRUE., +YCHEM_NL(8)%IGRIBTC=210128, +YCHEM_NL(8)%IGRIBDV=221008, +YCHEM_NL(8)%HENRYA=3.2e3, +YCHEM_NL(8)%HENRYB=6800.0, +YCHEM_NL(8)%LMASSFIX=.TRUE., +YCHEM_NL(8)%BETAMFBC=-999.9, +YCHEM_NL(8)%LASSIM=.TRUE., +YCHEM_NL(8)%LADV5=.TRUE., +YCHEM_NL(9)%CNAME='PAR', +YCHEM_NL(9)%NREQIN=1, +YCHEM_NL(9)%RMOLMASS=12.0, +YCHEM_NL(9)%IGRBCODE=217009, +YCHEM_NL(9)%LNEGFIX=.TRUE., +YCHEM_NL(9)%IGRIBTC=218009, +YCHEM_NL(9)%LMASSFIX=.TRUE., +YCHEM_NL(9)%BETAMFBC=-999.9, +YCHEM_NL(9)%LASSIM=.FALSE., +YCHEM_NL(10)%CNAME='C2H4', +YCHEM_NL(10)%NREQIN=1, +YCHEM_NL(10)%RMOLMASS=28.0, +YCHEM_NL(10)%IGRBCODE=217010, +YCHEM_NL(10)%LNEGFIX=.TRUE., +YCHEM_NL(10)%IGRIBTC=218010, +YCHEM_NL(10)%LMASSFIX=.TRUE., +YCHEM_NL(10)%BETAMFBC=-999.9, +YCHEM_NL(10)%LASSIM=.FALSE., +YCHEM_NL(11)%CNAME='OLE', +YCHEM_NL(11)%NREQIN=1, +YCHEM_NL(11)%RMOLMASS=24.0, +YCHEM_NL(11)%IGRBCODE=217011, +YCHEM_NL(11)%LNEGFIX=.TRUE., +YCHEM_NL(11)%IGRIBTC=218011, +YCHEM_NL(11)%LMASSFIX=.TRUE., +YCHEM_NL(11)%BETAMFBC=-999.9, +YCHEM_NL(11)%LASSIM=.FALSE., +YCHEM_NL(12)%CNAME='ALD2', +YCHEM_NL(12)%NREQIN=1, +YCHEM_NL(12)%RMOLMASS=24.0, +YCHEM_NL(12)%IGRBCODE=217012, +YCHEM_NL(12)%LNEGFIX=.TRUE., +YCHEM_NL(12)%IGRIBTC=218012, +YCHEM_NL(12)%IGRIBDV=221012, +YCHEM_NL(12)%HENRYA=17.0, +YCHEM_NL(12)%HENRYB=5000.0, +YCHEM_NL(12)%LMASSFIX=.TRUE., +YCHEM_NL(12)%BETAMFBC=-999.9, +YCHEM_NL(12)%LASSIM=.FALSE., +YCHEM_NL(13)%CNAME='PAN', +YCHEM_NL(13)%NREQIN=1, +YCHEM_NL(13)%RMOLMASS=121.0, +YCHEM_NL(13)%IGRBCODE=217013, +YCHEM_NL(13)%LNEGFIX=.TRUE., +YCHEM_NL(13)%IGRIBTC=218013, +YCHEM_NL(13)%IGRIBDV=221013, +YCHEM_NL(13)%HENRYA=2.9e+0, +YCHEM_NL(13)%HENRYB=5700.0, +YCHEM_NL(13)%LMASSFIX=.TRUE., +YCHEM_NL(13)%BETAMFBC=-999.9, +YCHEM_NL(13)%LASSIM=.FALSE., +YCHEM_NL(14)%CNAME='ROOH', +YCHEM_NL(14)%NREQIN=1, +YCHEM_NL(14)%RMOLMASS=47.0, +YCHEM_NL(14)%IGRBCODE=217014, +YCHEM_NL(14)%LNEGFIX=.TRUE., +YCHEM_NL(14)%IGRIBTC=218014, +YCHEM_NL(14)%IGRIBDV=221014, +YCHEM_NL(14)%HENRYA=340.0, +YCHEM_NL(14)%HENRYB=6000.0, +YCHEM_NL(14)%LMASSFIX=.TRUE., +YCHEM_NL(14)%BETAMFBC=-999.9, +YCHEM_NL(14)%LASSIM=.FALSE., +YCHEM_NL(15)%CNAME='ONIT', +YCHEM_NL(15)%NREQIN=1, +YCHEM_NL(15)%RMOLMASS=77.0, +YCHEM_NL(15)%IGRBCODE=217015, +YCHEM_NL(15)%LNEGFIX=.TRUE., +YCHEM_NL(15)%IGRIBTC=218015, +YCHEM_NL(15)%IGRIBDV=221015, +YCHEM_NL(15)%HENRYA=1.0e3, +YCHEM_NL(15)%HENRYB=6485, +YCHEM_NL(15)%LMASSFIX=.TRUE., +YCHEM_NL(15)%BETAMFBC=-999.9, +YCHEM_NL(15)%LASSIM=.FALSE., +YCHEM_NL(16)%CNAME='C5H8', +YCHEM_NL(16)%NREQIN=1, +YCHEM_NL(16)%RMOLMASS=68.1, +YCHEM_NL(16)%IGRBCODE=217016, +YCHEM_NL(16)%LNEGFIX=.TRUE., +YCHEM_NL(16)%IGRIBTC=218016, +YCHEM_NL(16)%IGRIBDV=221016, +YCHEM_NL(16)%HENRYA=1.3e-2, +YCHEM_NL(16)%HENRYB=0.0, +YCHEM_NL(16)%LMASSFIX=.TRUE., +YCHEM_NL(16)%BETAMFBC=-999.9, +YCHEM_NL(16)%LASSIM=.FALSE., +YCHEM_NL(17)%CNAME='SO2', +YCHEM_NL(17)%NREQIN=1, +YCHEM_NL(17)%RMOLMASS=64.1, +YCHEM_NL(17)%IGRBCODE=210122, +YCHEM_NL(17)%LNEGFIX=.TRUE., +YCHEM_NL(17)%IGRIBTC=210126, +YCHEM_NL(17)%IGRIBDV=221017, +YCHEM_NL(17)%HENRYA=1.0e5, +YCHEM_NL(17)%HENRYB=3000.0, +YCHEM_NL(17)%LMASSFIX=.TRUE., +YCHEM_NL(17)%BETAMFBC=-999.9, +YCHEM_NL(17)%LASSIM=.TRUE., +YCHEM_NL(17)%LADV5=.TRUE., +YCHEM_NL(18)%CNAME='DMS', +YCHEM_NL(18)%NREQIN=1, +YCHEM_NL(18)%RMOLMASS=62.1, +YCHEM_NL(18)%IGRBCODE=217018, +YCHEM_NL(18)%LNEGFIX=.TRUE., +YCHEM_NL(18)%IGRIBTC=218018, +YCHEM_NL(18)%LMASSFIX=.TRUE., +YCHEM_NL(18)%BETAMFBC=-999.9, +YCHEM_NL(18)%LASSIM=.FALSE., +YCHEM_NL(19)%CNAME='NH3', +YCHEM_NL(19)%NREQIN=1, +YCHEM_NL(19)%RMOLMASS=17.0, +YCHEM_NL(19)%IGRBCODE=217019, +YCHEM_NL(19)%LNEGFIX=.TRUE., +YCHEM_NL(19)%IGRIBTC=218019, +YCHEM_NL(19)%IGRIBDV=221019, +YCHEM_NL(19)%HENRYA=59.0, +YCHEM_NL(19)%HENRYB=4200.0, +YCHEM_NL(19)%LMASSFIX=.TRUE., +YCHEM_NL(19)%BETAMFBC=-999.9, +YCHEM_NL(19)%LASSIM=.FALSE., +YCHEM_NL(20)%CNAME='SO4', +YCHEM_NL(20)%NREQIN=-1, +YCHEM_NL(20)%RMOLMASS=96.1, +YCHEM_NL(20)%IGRBCODE=217020, +YCHEM_NL(20)%LNEGFIX=.FALSE., +YCHEM_NL(20)%IGRIBTC=218020, +YCHEM_NL(20)%LMASSFIX=.TRUE., +YCHEM_NL(20)%BETAMFBC=-999.9, +YCHEM_NL(20)%LASSIM=.FALSE., +YCHEM_NL(21)%CNAME='NH4', +YCHEM_NL(21)%NREQIN=1, +YCHEM_NL(21)%RMOLMASS=18.0, +YCHEM_NL(21)%IGRBCODE=217021, +YCHEM_NL(21)%LNEGFIX=.TRUE., +YCHEM_NL(21)%IGRIBTC=218021, +YCHEM_NL(21)%IGRIBDV=221021, +YCHEM_NL(21)%HENRYA=3.2e11, +YCHEM_NL(21)%HENRYB=8700.0, +YCHEM_NL(21)%LMASSFIX=.TRUE., +YCHEM_NL(21)%BETAMFBC=-999.9, +YCHEM_NL(21)%LASSIM=.FALSE., +YCHEM_NL(22)%CNAME='MSA', +YCHEM_NL(22)%NREQIN=1, +YCHEM_NL(22)%RMOLMASS=96.1, +YCHEM_NL(22)%IGRBCODE=217022, +YCHEM_NL(22)%LNEGFIX=.TRUE., +YCHEM_NL(22)%IGRIBTC=218022, +YCHEM_NL(22)%HENRYA=3.2e11, +YCHEM_NL(22)%HENRYB=8700.0, +YCHEM_NL(22)%LMASSFIX=.TRUE., +YCHEM_NL(22)%BETAMFBC=-999.9, +YCHEM_NL(22)%LASSIM=.FALSE., +YCHEM_NL(23)%CNAME='CH3COCHO', +YCHEM_NL(23)%NREQIN=1, +YCHEM_NL(23)%RMOLMASS=72.1, +YCHEM_NL(23)%IGRBCODE=217023, +YCHEM_NL(23)%LNEGFIX=.TRUE., +YCHEM_NL(23)%IGRIBTC=218023, +YCHEM_NL(23)%IGRIBDV=221023, +YCHEM_NL(23)%HENRYA=3.4e4, +YCHEM_NL(23)%HENRYB=7500.0, +YCHEM_NL(23)%LMASSFIX=.TRUE., +YCHEM_NL(23)%BETAMFBC=-999.9, +YCHEM_NL(23)%LASSIM=.FALSE., +YCHEM_NL(24)%CNAME='O3S', +YCHEM_NL(24)%NREQIN=1, +YCHEM_NL(24)%RMOLMASS=48.0, +YCHEM_NL(24)%IGRBCODE=217024, +YCHEM_NL(24)%LNEGFIX=.TRUE., +YCHEM_NL(24)%IGRIBTC=218024, +YCHEM_NL(24)%IGRIBDV=221024, +YCHEM_NL(24)%HENRYA=1.0e-2, +YCHEM_NL(24)%HENRYB=2800.0, +YCHEM_NL(24)%LMASSFIX=.TRUE., +YCHEM_NL(24)%BETAMFBC=-999.9, +YCHEM_NL(24)%LASSIM=.FALSE., +YCHEM_NL(25)%CNAME='Rn', +YCHEM_NL(25)%NREQIN=1, +YCHEM_NL(25)%RMOLMASS=222.0, +YCHEM_NL(25)%IGRBCODE=210181, +YCHEM_NL(25)%LNEGFIX=.TRUE., +YCHEM_NL(25)%IGRIBTC=210183, +YCHEM_NL(25)%LMASSFIX=.TRUE., +YCHEM_NL(25)%BETAMFBC=-999.9, +YCHEM_NL(25)%LASSIM=.FALSE., +YCHEM_NL(26)%CNAME='Pb', +YCHEM_NL(26)%NREQIN=1, +YCHEM_NL(26)%RMOLMASS=210.0, +YCHEM_NL(26)%IGRBCODE=217026, +YCHEM_NL(26)%LNEGFIX=.TRUE., +YCHEM_NL(26)%IGRIBTC=218026, +YCHEM_NL(26)%HENRYA=3.2e11, +YCHEM_NL(26)%HENRYB=8700.0, +YCHEM_NL(26)%LMASSFIX=.TRUE., +YCHEM_NL(26)%BETAMFBC=-999.9, +YCHEM_NL(26)%LASSIM=.FALSE., +YCHEM_NL(27)%CNAME='NO', +YCHEM_NL(27)%NREQIN=1, +YCHEM_NL(27)%RMOLMASS=30.0, +YCHEM_NL(27)%IGRBCODE=217027, +YCHEM_NL(27)%LNEGFIX=.TRUE., +YCHEM_NL(27)%IGRIBTC=218027, +YCHEM_NL(27)%IGRIBDV=221027, +YCHEM_NL(27)%HENRYA=1.9e-3, +YCHEM_NL(27)%HENRYB=1600.0, +YCHEM_NL(27)%LMASSFIX=.TRUE., +YCHEM_NL(27)%BETAMFBC=-999.9, +YCHEM_NL(27)%LMASSFIX=.FALSE., +YCHEM_NL(27)%LADV=.TRUE., +YCHEM_NL(27)%LASSIM=.FALSE., +YCHEM_NL(28)%CNAME='HO2', +YCHEM_NL(28)%NREQIN=1, +YCHEM_NL(28)%RMOLMASS=33.0, +YCHEM_NL(28)%IGRBCODE=217028, +YCHEM_NL(28)%LNEGFIX=.TRUE., +YCHEM_NL(28)%IGRIBTC=218028, +YCHEM_NL(28)%IGRIBDV=221028, +YCHEM_NL(28)%HENRYA=6.8e2, +YCHEM_NL(28)%HENRYB=0.0, +YCHEM_NL(28)%LMASSFIX=.FALSE., +YCHEM_NL(28)%LADV=.FALSE., +YCHEM_NL(28)%LASSIM=.FALSE., +YCHEM_NL(29)%CNAME='CH3O2', +YCHEM_NL(29)%NREQIN=1, +YCHEM_NL(29)%RMOLMASS=47.0 +YCHEM_NL(29)%IGRBCODE=217029, +YCHEM_NL(29)%LNEGFIX=.TRUE., +YCHEM_NL(29)%IGRIBTC=218029, +YCHEM_NL(29)%IGRIBDV=221029, +YCHEM_NL(29)%HENRYA=1.5e1, +YCHEM_NL(29)%HENRYB=3700.0, +YCHEM_NL(29)%LMASSFIX=.FALSE., +YCHEM_NL(29)%LADV=.FALSE., +YCHEM_NL(29)%LASSIM=.FALSE., +YCHEM_NL(30)%CNAME='OH', +YCHEM_NL(30)%NREQIN=1, +YCHEM_NL(30)%RMOLMASS=17.0, +YCHEM_NL(30)%IGRBCODE=217030, +YCHEM_NL(30)%LNEGFIX=.TRUE., +YCHEM_NL(30)%IGRIBTC=218030, +YCHEM_NL(30)%LMASSFIX=.FALSE., +YCHEM_NL(30)%LADV=.FALSE., +YCHEM_NL(30)%LASSIM=.FALSE., +YCHEM_NL(31)%CNAME='NO2', +YCHEM_NL(31)%NREQIN=1, +YCHEM_NL(31)%RMOLMASS=46.0, +YCHEM_NL(31)%IGRBCODE=210121, +YCHEM_NL(31)%LNEGFIX=.TRUE., +YCHEM_NL(31)%IGRIBTC=210125, +YCHEM_NL(31)%IGRIBDV=221031, +YCHEM_NL(31)%HENRYA=1.2e-2, +YCHEM_NL(31)%HENRYB=2400.0, +YCHEM_NL(31)%LMASSFIX=.TRUE., +YCHEM_NL(31)%BETAMFBC=-999.9, +YCHEM_NL(31)%LMASSFIX=.FALSE., +YCHEM_NL(31)%LADV=.TRUE., +YCHEM_NL(31)%LASSIM=.TRUE., +YCHEM_NL(31)%LADV5=.TRUE., +YCHEM_NL(32)%CNAME='NO3', +YCHEM_NL(32)%NREQIN=1, +YCHEM_NL(32)%RMOLMASS=62.0, +YCHEM_NL(32)%IGRBCODE=217032, +YCHEM_NL(32)%LNEGFIX=.TRUE., +YCHEM_NL(32)%IGRIBTC=218032, +YCHEM_NL(32)%IGRIBDV=221032, +YCHEM_NL(32)%HENRYA=3.8e-2, +YCHEM_NL(32)%HENRYB=0., +YCHEM_NL(32)%LMASSFIX=.TRUE., +YCHEM_NL(32)%BETAMFBC=-999.9, +YCHEM_NL(32)%LMASSFIX=.FALSE., +YCHEM_NL(32)%LADV=.TRUE., +YCHEM_NL(32)%LASSIM=.FALSE., +YCHEM_NL(33)%CNAME='N2O5', +YCHEM_NL(33)%NREQIN=1, +YCHEM_NL(33)%RMOLMASS=108.0, +YCHEM_NL(33)%IGRBCODE=217033, +YCHEM_NL(33)%LNEGFIX=.TRUE., +YCHEM_NL(33)%IGRIBTC=218033, +YCHEM_NL(33)%IGRIBDV=221033, +YCHEM_NL(33)%HENRYA=2.1e+1, +YCHEM_NL(33)%HENRYB=3400.0, +YCHEM_NL(33)%LMASSFIX=.TRUE., +YCHEM_NL(33)%BETAMFBC=-999.9, +YCHEM_NL(33)%LASSIM=.FALSE., +YCHEM_NL(34)%CNAME='HO2NO2', +YCHEM_NL(34)%NREQIN=1, +YCHEM_NL(34)%RMOLMASS=79.0, +YCHEM_NL(34)%IGRBCODE=217034, +YCHEM_NL(34)%LNEGFIX=.TRUE., +YCHEM_NL(34)%IGRIBTC=218034, +YCHEM_NL(34)%IGRIBDV=221034, +YCHEM_NL(34)%HENRYA=1.2e+4, +YCHEM_NL(34)%HENRYB=6900.0, +YCHEM_NL(34)%LMASSFIX=.TRUE., +YCHEM_NL(34)%BETAMFBC=-999.9, +YCHEM_NL(34)%LASSIM=.FALSE., +YCHEM_NL(35)%CNAME='C2O3', +YCHEM_NL(35)%NREQIN=1, +YCHEM_NL(35)%RMOLMASS=75.0, +YCHEM_NL(35)%IGRBCODE=217035, +YCHEM_NL(35)%LNEGFIX=.TRUE., +YCHEM_NL(35)%IGRIBTC=218035, +YCHEM_NL(35)%LMASSFIX=.FALSE., +YCHEM_NL(35)%LADV=.FALSE., +YCHEM_NL(35)%LASSIM=.FALSE., +YCHEM_NL(36)%CNAME='ROR', +YCHEM_NL(36)%NREQIN=1, +YCHEM_NL(36)%RMOLMASS=28.0, +YCHEM_NL(36)%IGRBCODE=217036, +YCHEM_NL(36)%LNEGFIX=.TRUE., +YCHEM_NL(36)%IGRIBTC=218036, +YCHEM_NL(36)%LMASSFIX=.FALSE., +YCHEM_NL(36)%LADV=.FALSE., +YCHEM_NL(36)%LASSIM=.FALSE., +YCHEM_NL(37)%CNAME='RXPAR', +YCHEM_NL(37)%NREQIN=1, +YCHEM_NL(37)%RMOLMASS=12.0, +YCHEM_NL(37)%IGRBCODE=217037, +YCHEM_NL(37)%LNEGFIX=.TRUE., +YCHEM_NL(37)%IGRIBTC=218037, +YCHEM_NL(37)%LMASSFIX=.FALSE., +YCHEM_NL(37)%LADV=.FALSE., +YCHEM_NL(37)%LASSIM=.FALSE., +YCHEM_NL(38)%CNAME='XO2', +YCHEM_NL(38)%NREQIN=1, +YCHEM_NL(38)%RMOLMASS=44.0, +YCHEM_NL(38)%IGRBCODE=217038, +YCHEM_NL(38)%LNEGFIX=.TRUE., +YCHEM_NL(38)%IGRIBTC=218038, +YCHEM_NL(38)%LMASSFIX=.FALSE., +YCHEM_NL(38)%LADV=.FALSE., +YCHEM_NL(38)%LASSIM=.FALSE., +YCHEM_NL(39)%CNAME='XO2N', +YCHEM_NL(39)%NREQIN=1, +YCHEM_NL(39)%RMOLMASS=44.0, +YCHEM_NL(39)%IGRBCODE=217039, +YCHEM_NL(39)%LNEGFIX=.TRUE., +YCHEM_NL(39)%IGRIBTC=218039, +YCHEM_NL(39)%LMASSFIX=.FALSE., +YCHEM_NL(39)%LADV=.FALSE., +YCHEM_NL(39)%LASSIM=.FALSE., +YCHEM_NL(40)%CNAME='NH2', +YCHEM_NL(40)%NREQIN=1, +YCHEM_NL(40)%RMOLMASS=16.0, +YCHEM_NL(40)%IGRBCODE=217040, +YCHEM_NL(40)%LNEGFIX=.TRUE., +YCHEM_NL(40)%IGRIBTC=218040, +YCHEM_NL(40)%LMASSFIX=.FALSE., +YCHEM_NL(40)%LADV=.FALSE., +YCHEM_NL(40)%LASSIM=.FALSE., +YCHEM_NL(41)%CNAME='PSC', +YCHEM_NL(41)%NREQIN=0, +YCHEM_NL(41)%RMOLMASS=1.0, +YCHEM_NL(41)%IGRBCODE=217041, +YCHEM_NL(41)%LNEGFIX=.TRUE., +YCHEM_NL(41)%IGRIBTC=218041, +YCHEM_NL(41)%LMASSFIX=.TRUE., +YCHEM_NL(41)%BETAMFBC=-999.9, +YCHEM_NL(41)%LMASSFIX=.FALSE., +YCHEM_NL(41)%REFVALI=0.0, +YCHEM_NL(41)%NREQIN=-1, +YCHEM_NL(41)%LADV=.FALSE., +YCHEM_NL(41)%LASSIM=.FALSE., +YCHEM_NL(42)%CNAME='CH3OH', +YCHEM_NL(42)%NREQIN=1, +YCHEM_NL(42)%RMOLMASS=31.01, +YCHEM_NL(42)%IGRBCODE=217042, +YCHEM_NL(42)%LNEGFIX=.TRUE., +YCHEM_NL(42)%IGRIBTC=218042, +YCHEM_NL(42)%IGRIBDV=221042, +YCHEM_NL(42)%HENRYA=200.0, +YCHEM_NL(42)%HENRYB=5600.0, +YCHEM_NL(42)%LMASSFIX=.TRUE., +YCHEM_NL(42)%BETAMFBC=-999.9, +YCHEM_NL(42)%LASSIM=.FALSE., +YCHEM_NL(43)%CNAME='HCOOH', +YCHEM_NL(43)%NREQIN=1, +YCHEM_NL(43)%RMOLMASS=46.01, +YCHEM_NL(43)%IGRBCODE=217043, +YCHEM_NL(43)%LNEGFIX=.TRUE., +YCHEM_NL(43)%IGRIBTC=218043, +YCHEM_NL(43)%IGRIBDV=221043, +YCHEM_NL(43)%HENRYA=8.8e3, +YCHEM_NL(43)%HENRYB=6100.0, +YCHEM_NL(43)%LMASSFIX=.TRUE., +YCHEM_NL(43)%BETAMFBC=-999.9, +YCHEM_NL(43)%LASSIM=.FALSE., +YCHEM_NL(44)%CNAME='MCOOH', +YCHEM_NL(44)%NREQIN=1, +YCHEM_NL(44)%RMOLMASS=62.02, +YCHEM_NL(44)%IGRBCODE=217044, +YCHEM_NL(44)%LNEGFIX=.TRUE., +YCHEM_NL(44)%IGRIBTC=218044, +YCHEM_NL(44)%IGRIBDV=221044, +YCHEM_NL(44)%HENRYA=4.1e3, +YCHEM_NL(44)%HENRYB=6300.0, +YCHEM_NL(44)%LMASSFIX=.TRUE., +YCHEM_NL(44)%BETAMFBC=-999.9, +YCHEM_NL(44)%LASSIM=.FALSE., +YCHEM_NL(45)%CNAME='C2H6', +YCHEM_NL(45)%NREQIN=1, +YCHEM_NL(45)%RMOLMASS=30.02, +YCHEM_NL(45)%IGRBCODE=217045, +YCHEM_NL(45)%LNEGFIX=.TRUE., +YCHEM_NL(45)%IGRIBTC=218045, +YCHEM_NL(45)%IGRIBDV=221045, +YCHEM_NL(45)%HENRYA=1.9e-3, +YCHEM_NL(45)%HENRYB=2400.0, +YCHEM_NL(45)%LMASSFIX=.TRUE., +YCHEM_NL(45)%BETAMFBC=-999.9, +YCHEM_NL(45)%LASSIM=.FALSE., +YCHEM_NL(46)%CNAME='C2H5OH', +YCHEM_NL(46)%NREQIN=1, +YCHEM_NL(46)%RMOLMASS=46.02, +YCHEM_NL(46)%IGRBCODE=217046, +YCHEM_NL(46)%LNEGFIX=.TRUE., +YCHEM_NL(46)%IGRIBTC=218046, +YCHEM_NL(46)%IGRIBDV=221046, +YCHEM_NL(46)%HENRYA=190.0, +YCHEM_NL(46)%HENRYB=6400.0, +YCHEM_NL(46)%LMASSFIX=.TRUE., +YCHEM_NL(46)%BETAMFBC=-999.9, +YCHEM_NL(46)%LASSIM=.FALSE., +YCHEM_NL(47)%CNAME='C3H8', +YCHEM_NL(47)%NREQIN=1, +YCHEM_NL(47)%RMOLMASS=44.03, +YCHEM_NL(47)%IGRBCODE=217047, +YCHEM_NL(47)%LNEGFIX=.TRUE., +YCHEM_NL(47)%IGRIBTC=218047, +YCHEM_NL(47)%LMASSFIX=.TRUE., +YCHEM_NL(47)%BETAMFBC=-999.9, +YCHEM_NL(47)%LASSIM=.FALSE., +YCHEM_NL(48)%CNAME='C3H6', +YCHEM_NL(48)%NREQIN=1, +YCHEM_NL(48)%RMOLMASS=42.03, +YCHEM_NL(48)%IGRBCODE=217048, +YCHEM_NL(48)%LNEGFIX=.TRUE., +YCHEM_NL(48)%IGRIBTC=218048, +YCHEM_NL(48)%LMASSFIX=.TRUE., +YCHEM_NL(48)%BETAMFBC=-999.9, +YCHEM_NL(48)%LASSIM=.FALSE., +YCHEM_NL(49)%CNAME='C10H16', +YCHEM_NL(49)%NREQIN=1, +YCHEM_NL(49)%RMOLMASS=136.0, +YCHEM_NL(49)%IGRBCODE=217049, +YCHEM_NL(49)%LNEGFIX=.TRUE., +YCHEM_NL(49)%IGRIBTC=218049, +YCHEM_NL(49)%LMASSFIX=.TRUE., +YCHEM_NL(49)%BETAMFBC=-999.9, +YCHEM_NL(49)%LASSIM=.FALSE., +YCHEM_NL(50)%CNAME='ISPD', +YCHEM_NL(50)%NREQIN=1, +YCHEM_NL(50)%RMOLMASS=70.0, +YCHEM_NL(50)%IGRBCODE=217050, +YCHEM_NL(50)%LNEGFIX=.TRUE., +YCHEM_NL(50)%IGRIBTC=218050, +YCHEM_NL(50)%IGRIBDV=221050, +YCHEM_NL(50)%HENRYA=4.3, +YCHEM_NL(50)%HENRYB=5300.0, +YCHEM_NL(50)%LMASSFIX=.TRUE., +YCHEM_NL(50)%BETAMFBC=-999.9, +YCHEM_NL(50)%LASSIM=.FALSE., +YCHEM_NL(51)%CNAME='NO3_A', +YCHEM_NL(51)%NREQIN=1, +YCHEM_NL(51)%RMOLMASS=62.0, +YCHEM_NL(51)%IGRBCODE=217051, +YCHEM_NL(51)%LNEGFIX=.TRUE., +YCHEM_NL(51)%IGRIBTC=218051, +YCHEM_NL(51)%IGRIBDV=221051, +YCHEM_NL(51)%HENRYA=3.2e11, +YCHEM_NL(51)%HENRYB=8700.0, +YCHEM_NL(51)%LMASSFIX=.TRUE., +YCHEM_NL(51)%BETAMFBC=-999.9, +YCHEM_NL(51)%LASSIM=.FALSE., +YCHEM_NL(52)%CNAME='CH3COCH3', +YCHEM_NL(52)%NREQIN=0, +YCHEM_NL(52)%RMOLMASS=58.0, +YCHEM_NL(52)%IGRBCODE=217052, +YCHEM_NL(52)%LNEGFIX=.TRUE., +YCHEM_NL(52)%IGRIBTC=218052, +YCHEM_NL(52)%IGRIBDV=221052, +YCHEM_NL(52)%HENRYA=27.0, +YCHEM_NL(52)%HENRYB=5500.0, +YCHEM_NL(52)%LMASSFIX=.TRUE., +YCHEM_NL(52)%BETAMFBC=-999.9, +YCHEM_NL(52)%LASSIM=.FALSE., +YCHEM_NL(53)%CNAME='ACO2', +YCHEM_NL(53)%NREQIN=0, +YCHEM_NL(53)%RMOLMASS=58.0, +YCHEM_NL(53)%IGRBCODE=217053, +YCHEM_NL(53)%LNEGFIX=.TRUE., +YCHEM_NL(53)%IGRIBTC=218053, +YCHEM_NL(53)%LMASSFIX=.FALSE., +YCHEM_NL(53)%LADV=.FALSE., +YCHEM_NL(53)%LASSIM=.FALSE., +YCHEM_NL(54)%CNAME='IC3H7O2', +YCHEM_NL(54)%NREQIN=0, +YCHEM_NL(54)%RMOLMASS=75.0, +YCHEM_NL(54)%IGRBCODE=217054, +YCHEM_NL(54)%LNEGFIX=.TRUE., +YCHEM_NL(54)%IGRIBTC=218054, +YCHEM_NL(54)%LMASSFIX=.FALSE., +YCHEM_NL(54)%LADV=.FALSE., +YCHEM_NL(54)%LASSIM=.FALSE., +YCHEM_NL(55)%CNAME='HYPROPO2', +YCHEM_NL(55)%NREQIN=0, +YCHEM_NL(55)%RMOLMASS=91.0, +YCHEM_NL(55)%IGRBCODE=217055, +YCHEM_NL(55)%LNEGFIX=.TRUE., +YCHEM_NL(55)%IGRIBTC=218055, +YCHEM_NL(55)%LMASSFIX=.FALSE., +YCHEM_NL(55)%LADV=.FALSE., +YCHEM_NL(55)%LASSIM=.FALSE., +YCHEM_NL(56)%CNAME='SO3', +YCHEM_NL(56)%NREQIN=0, +YCHEM_NL(56)%RMOLMASS=80.0, +YCHEM_NL(56)%IGRBCODE=217189, +YCHEM_NL(56)%LNEGFIX=.TRUE., +YCHEM_NL(56)%IGRIBTC=218189, +YCHEM_NL(56)%LMASSFIX=.TRUE., +YCHEM_NL(56)%BETAMFBC=-999.9, +YCHEM_NL(56)%LASSIM=.FALSE., +YCHEM_NL(57)%CNAME='NOXA', +YCHEM_NL(57)%NREQIN=0, +YCHEM_NL(57)%RMOLMASS=46.0, +YCHEM_NL(57)%IGRBCODE=217056, +YCHEM_NL(57)%LNEGFIX=.TRUE., +YCHEM_NL(57)%IGRIBTC=218056, +YCHEM_NL(57)%LMASSFIX=.TRUE., +YCHEM_NL(57)%BETAMFBC=-999.9, +YCHEM_NL(57)%LASSIM=.FALSE., +NGFL_EXT=4, +YEXT_NL(1)%CNAME='EMILI', +YEXT_NL(1)%NREQIN=0, +YEXT_NL(1)%IGRBCODE=212254, +YEXT_NL(1)%LADV=.FALSE., +YEXT_NL(1)%LGP=.TRUE., +YEXT_NL(1)%LGPINGP=.TRUE., +YEXT_NL(2)%CNAME='DDVEL', +YEXT_NL(2)%NREQIN=0, +YEXT_NL(2)%IGRBCODE=212250, +YEXT_NL(2)%LADV=.FALSE., +YEXT_NL(2)%LGP=.TRUE., +YEXT_NL(2)%LGPINGP=.TRUE., +YEXT_NL(3)%CNAME='DDFLXA', +YEXT_NL(3)%NREQIN=0, +YEXT_NL(3)%IGRBCODE=212251, +YEXT_NL(3)%LADV=.FALSE., +YEXT_NL(3)%LGP=.TRUE., +YEXT_NL(3)%LGPINGP=.TRUE., +YEXT_NL(4)%CNAME='WDFLXA', +YEXT_NL(4)%NREQIN=0, +YEXT_NL(4)%IGRBCODE=212252, +YEXT_NL(4)%LADV=.FALSE., +YEXT_NL(4)%LGP=.TRUE., +YEXT_NL(4)%LGPINGP=.TRUE., +EOF diff --git a/ifs-test/tests/t21/common/aer/aer_compoemis.nml b/ifs-test/tests/t21/common/aer/aer_compoemis.nml new file mode 100644 index 00000000..d3778767 --- /dev/null +++ b/ifs-test/tests/t21/common/aer/aer_compoemis.nml @@ -0,0 +1,51 @@ +cat >> fort.4 << EOF + +&NAMCOMPO_EMIS THIS%SPECIES='ALD2', THIS%SECTOR='All', THIS%PARAMID=219012, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.25, THIS%LEGACY_CHEM_OVERRIDE=3 / +&NAMCOMPO_EMIS THIS%SPECIES='Black-carbon_A', THIS%SECTOR='Biogenic/biofuel', THIS%PARAMID=210031, THIS%SCALING=0.2, THIS%DIURNAL_CYCLE_TYPE='AnthroCO' / +&NAMCOMPO_EMIS THIS%SPECIES='Black-carbon_A', THIS%SECTOR='Biomass-burning', THIS%PARAMID=210040, THIS%SCALING=0.2, THIS%DIURNAL_CYCLE_TYPE='GFAS', THIS%DIURNAL_PEAK_HOUR=13.5, THIS%DIURNAL_BASELINE=0.2, THIS%VERTICAL_PROFILE_TYPE='GFAS', THIS%VERTICAL_PARAMID=210119 / +&NAMCOMPO_EMIS THIS%SPECIES='Black-carbon_A', THIS%SECTOR='Fossil-fuel', THIS%PARAMID=210032, THIS%SCALING=0.2 / +&NAMCOMPO_EMIS THIS%SPECIES='Black-carbon_B', THIS%SECTOR='Biogenic/biofuel', THIS%PARAMID=210031, THIS%SCALING=0.8, THIS%DIURNAL_CYCLE_TYPE='AnthroCO' / +&NAMCOMPO_EMIS THIS%SPECIES='Black-carbon_B', THIS%SECTOR='Biomass-burning', THIS%PARAMID=210040, THIS%SCALING=0.8, THIS%DIURNAL_CYCLE_TYPE='GFAS', THIS%DIURNAL_PEAK_HOUR=13.5, THIS%DIURNAL_BASELINE=0.2, THIS%VERTICAL_PROFILE_TYPE='GFAS', THIS%VERTICAL_PARAMID=210119 / +&NAMCOMPO_EMIS THIS%SPECIES='Black-carbon_B', THIS%SECTOR='Fossil-fuel', THIS%PARAMID=210032, THIS%SCALING=0.8 / +&NAMCOMPO_EMIS THIS%SPECIES='C10H16', THIS%SECTOR='All', THIS%PARAMID=219049, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.65, THIS%LEGACY_CHEM_OVERRIDE=1 / +&NAMCOMPO_EMIS THIS%SPECIES='C2H4', THIS%SECTOR='All', THIS%PARAMID=219010, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.25, THIS%LEGACY_CHEM_OVERRIDE=1 / +&NAMCOMPO_EMIS THIS%SPECIES='C2H5OH', THIS%SECTOR='All', THIS%PARAMID=219046, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.25, THIS%LEGACY_CHEM_OVERRIDE=1 / +&NAMCOMPO_EMIS THIS%SPECIES='C2H6', THIS%SECTOR='All', THIS%PARAMID=219045, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.65, THIS%LEGACY_CHEM_OVERRIDE=3 / +&NAMCOMPO_EMIS THIS%SPECIES='C3H6', THIS%SECTOR='All', THIS%PARAMID=219048, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.65, THIS%LEGACY_CHEM_OVERRIDE=3 / +&NAMCOMPO_EMIS THIS%SPECIES='C3H8', THIS%SECTOR='All', THIS%PARAMID=219047, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.65, THIS%LEGACY_CHEM_OVERRIDE=3 / +&NAMCOMPO_EMIS THIS%SPECIES='C5H8', THIS%SECTOR='All', THIS%PARAMID=219016, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.0, THIS%LEGACY_CHEM_OVERRIDE=1 / +&NAMCOMPO_EMIS THIS%SPECIES='CH2O', THIS%SECTOR='All', THIS%PARAMID=219008, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.25, THIS%LEGACY_CHEM_OVERRIDE=3 / +&NAMCOMPO_EMIS THIS%SPECIES='CH3COCH3', THIS%SECTOR='All', THIS%PARAMID=219052, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.65, THIS%LEGACY_CHEM_OVERRIDE=1 / +&NAMCOMPO_EMIS THIS%SPECIES='CH3COCHO', THIS%SECTOR='All', THIS%PARAMID=219023, THIS%LEGACY_CHEM_OVERRIDE=1 / +&NAMCOMPO_EMIS THIS%SPECIES='CH3OH', THIS%SECTOR='All', THIS%PARAMID=219042, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.25, THIS%LEGACY_CHEM_OVERRIDE=3 / +&NAMCOMPO_EMIS THIS%SPECIES='CH4_GHG', THIS%SECTOR='AllButBiomassBur', THIS%PARAMID=210070, THIS%SCALING=-1.0 / +&NAMCOMPO_EMIS THIS%SPECIES='CH4_GHG', THIS%SECTOR='Biomass-burning', THIS%PARAMID=210082, THIS%DIURNAL_CYCLE_TYPE='GFAS', THIS%DIURNAL_PEAK_HOUR=13.5, THIS%DIURNAL_BASELINE=0.2 / +&NAMCOMPO_EMIS THIS%SPECIES='CO', THIS%SECTOR='All', THIS%PARAMID=219005, THIS%DIURNAL_CYCLE_TYPE='AnthroCO', THIS%LEGACY_CHEM_OVERRIDE=11 / +&NAMCOMPO_EMIS THIS%SPECIES='CO2_GHG', THIS%SECTOR='Anthropogenic', THIS%PARAMID=210069, THIS%SCALING=-1.0 / +&NAMCOMPO_EMIS THIS%SPECIES='CO2_GHG', THIS%SECTOR='Aviation', THIS%PARAMID=212253, THIS%VERTICAL_PROFILE_TYPE='3D' / +&NAMCOMPO_EMIS THIS%SPECIES='CO2_GHG', THIS%SECTOR='Biomass-burning', THIS%PARAMID=210080, THIS%DIURNAL_CYCLE_TYPE='GFAS', THIS%DIURNAL_PEAK_HOUR=13.5, THIS%DIURNAL_BASELINE=0.2 / +&NAMCOMPO_EMIS THIS%SPECIES='CO2_GHG', THIS%SECTOR='Ocean', THIS%PARAMID=210067, THIS%SCALING=-1.0 / +&NAMCOMPO_EMIS THIS%SPECIES='DMS', THIS%SECTOR='All', THIS%PARAMID=219018, THIS%LEGACY_CHEM_OVERRIDE=3 / +&NAMCOMPO_EMIS THIS%SPECIES='HCOOH', THIS%SECTOR='All', THIS%PARAMID=219043, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.25, THIS%LEGACY_CHEM_OVERRIDE=1 / +&NAMCOMPO_EMIS THIS%SPECIES='ISPD', THIS%SECTOR='All', THIS%PARAMID=219050, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.65, THIS%LEGACY_CHEM_OVERRIDE=1 / +&NAMCOMPO_EMIS THIS%SPECIES='MCOOH', THIS%SECTOR='All', THIS%PARAMID=219044, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.25, THIS%LEGACY_CHEM_OVERRIDE=1 / +&NAMCOMPO_EMIS THIS%SPECIES='NH3', THIS%SECTOR='All', THIS%PARAMID=219019, THIS%DIURNAL_CYCLE_TYPE='CAMS_GLOB_AGS', THIS%LEGACY_CHEM_OVERRIDE=3 / +&NAMCOMPO_EMIS THIS%SPECIES='NO', THIS%SECTOR='AllButAviation', THIS%PARAMID=219027, THIS%DIURNAL_CYCLE_TYPE='AnthroNOx', THIS%LEGACY_CHEM_OVERRIDE=11 / +&NAMCOMPO_EMIS THIS%SPECIES='NO2', THIS%SECTOR='Aviation', THIS%PARAMID=212255, THIS%SCALING=1.5333333333333333333, THIS%VERTICAL_PROFILE_TYPE='3D' / +&NAMCOMPO_EMIS THIS%SPECIES='OLE', THIS%SECTOR='All', THIS%PARAMID=219011, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.65, THIS%LEGACY_CHEM_OVERRIDE=3 / +&NAMCOMPO_EMIS THIS%SPECIES='Organic-matter_A', THIS%SECTOR='AnthroSecondary', THIS%PARAMID=216007, THIS%SCALING=0.5, THIS%DIURNAL_CYCLE_TYPE='GFAS', THIS%DIURNAL_PEAK_HOUR=12.0, THIS%DIURNAL_BASELINE=0.2 / +&NAMCOMPO_EMIS THIS%SPECIES='Organic-matter_A', THIS%SECTOR='Biogenic/biofuel', THIS%PARAMID=210033, THIS%SCALING=0.5, THIS%DIURNAL_CYCLE_TYPE='AnthroCO' / +&NAMCOMPO_EMIS THIS%SPECIES='Organic-matter_A', THIS%SECTOR='BiogenicSecondary', THIS%PARAMID=210039, THIS%SCALING=0.5 / +&NAMCOMPO_EMIS THIS%SPECIES='Organic-matter_A', THIS%SECTOR='Biomass-burning', THIS%PARAMID=210041, THIS%SCALING=0.5, THIS%DIURNAL_CYCLE_TYPE='GFAS', THIS%DIURNAL_PEAK_HOUR=13.5, THIS%DIURNAL_BASELINE=0.2, THIS%VERTICAL_PROFILE_TYPE='GFAS', THIS%VERTICAL_PARAMID=210119, THIS%LEGACY_CHEM_OVERRIDE=16 / +&NAMCOMPO_EMIS THIS%SPECIES='Organic-matter_A', THIS%SECTOR='Fossil-fuel', THIS%PARAMID=210034, THIS%SCALING=0.5 / +&NAMCOMPO_EMIS THIS%SPECIES='Organic-matter_B', THIS%SECTOR='AnthroSecondary', THIS%PARAMID=216007, THIS%SCALING=0.5, THIS%DIURNAL_CYCLE_TYPE='GFAS', THIS%DIURNAL_PEAK_HOUR=12.0, THIS%DIURNAL_BASELINE=0.2 / +&NAMCOMPO_EMIS THIS%SPECIES='Organic-matter_B', THIS%SECTOR='Biogenic/biofuel', THIS%PARAMID=210033, THIS%SCALING=0.5, THIS%DIURNAL_CYCLE_TYPE='AnthroCO' / +&NAMCOMPO_EMIS THIS%SPECIES='Organic-matter_B', THIS%SECTOR='BiogenicSecondary', THIS%PARAMID=210039, THIS%SCALING=0.5 / +&NAMCOMPO_EMIS THIS%SPECIES='Organic-matter_B', THIS%SECTOR='Biomass-burning', THIS%PARAMID=210041, THIS%SCALING=0.5, THIS%DIURNAL_CYCLE_TYPE='GFAS', THIS%DIURNAL_PEAK_HOUR=13.5, THIS%DIURNAL_BASELINE=0.2, THIS%VERTICAL_PROFILE_TYPE='GFAS', THIS%VERTICAL_PARAMID=210119 / +&NAMCOMPO_EMIS THIS%SPECIES='Organic-matter_B', THIS%SECTOR='Fossil-fuel', THIS%PARAMID=210034, THIS%SCALING=0.5 / +&NAMCOMPO_EMIS THIS%SPECIES='PAR', THIS%SECTOR='All', THIS%PARAMID=219009, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.65, THIS%LEGACY_CHEM_OVERRIDE=3 / +&NAMCOMPO_EMIS THIS%SPECIES='Rn', THIS%SECTOR='All', THIS%PARAMID=219025, THIS%LEGACY_CHEM_OVERRIDE=1 / +&NAMCOMPO_EMIS THIS%SPECIES='SO2', THIS%SECTOR='All', THIS%PARAMID=219017, THIS%DIURNAL_CYCLE_TYPE='CAMS_GLOB_ENE', THIS%VERTICAL_PROFILE_TYPE="AltitudeMap", THIS%VERTICAL_PARAMID=216045, THIS%VERTICAL_BASE_LEVEL=-1, THIS%VERTICAL_TOP_LEVEL=-4, THIS%VERTICAL_THRESHOLD=200, THIS%LEGACY_CHEM_OVERRIDE=11 / +&NAMCOMPO_EMIS / + +EOF diff --git a/ifs-test/tests/t21/common/aer/m7_aero_old.nml b/ifs-test/tests/t21/common/aer/m7_aero_old.nml new file mode 100644 index 00000000..d5afe234 --- /dev/null +++ b/ifs-test/tests/t21/common/aer/m7_aero_old.nml @@ -0,0 +1,338 @@ +cat >> fort.4 << EOF +NAERO=37, +NACTAERO=37, +YAERO_NL(1)%CNAME='SO4', +YAERO_NL(1)%IGRBCODE=210011, +YAERO_NL(1)%LMASSFIX=.true., +!YAERO_NL(1)%LCOMAD=.true., +YAERO_NL(1)%LQM=.false., +YAERO_NL(1)%LQM3D=.true., +YAERO_NL(1)%BETAMFBC=-999, +YAERO_NL(1)%LADV=.true., +YAERO_NL(1)%NREQIN=0, +YAERO_NL(2)%CNAME='NH4', +YAERO_NL(2)%IGRBCODE=212035, +YAERO_NL(2)%LMASSFIX=.true., +!YAERO_NL(2)%LCOMAD=.true., +YAERO_NL(2)%LQM=.false., +YAERO_NL(2)%LQM3D=.true., +YAERO_NL(2)%BETAMFBC=-999, +YAERO_NL(2)%LADV=.true., +YAERO_NL(2)%NREQIN=0, +YAERO_NL(3)%CNAME='NO3_A', +YAERO_NL(3)%IGRBCODE=212036, +YAERO_NL(3)%LMASSFIX=.true., +!YAERO_NL(3)%LCOMAD=.true., +YAERO_NL(3)%LQM=.false., +YAERO_NL(3)%LQM3D=.true., +YAERO_NL(3)%BETAMFBC=-999, +YAERO_NL(3)%LADV=.true., +YAERO_NL(3)%NREQIN=0, +YAERO_NL(4)%CNAME='ACS_N', +YAERO_NL(4)%IGRBCODE=212001, +YAERO_NL(4)%LMASSFIX=.true., +!YAERO_NL(4)%LCOMAD=.true., +YAERO_NL(4)%LQM=.false., +YAERO_NL(4)%LQM3D=.true., +YAERO_NL(4)%BETAMFBC=-999, +YAERO_NL(4)%LADV=.true., +YAERO_NL(4)%NREQIN=0, +YAERO_NL(5)%CNAME='SO4ACS', +YAERO_NL(5)%IGRBCODE=212002, +YAERO_NL(5)%LMASSFIX=.true., +!YAERO_NL(5)%LCOMAD=.true., +YAERO_NL(5)%LQM=.false., +YAERO_NL(5)%LQM3D=.true., +YAERO_NL(5)%BETAMFBC=-999, +YAERO_NL(5)%LADV=.true., +YAERO_NL(5)%NREQIN=0, +YAERO_NL(6)%CNAME='BCACS', +YAERO_NL(6)%IGRBCODE=212003, +YAERO_NL(6)%LMASSFIX=.true., +!YAERO_NL(6)%LCOMAD=.true., +YAERO_NL(6)%LQM=.false., +YAERO_NL(6)%LQM3D=.true., +YAERO_NL(6)%BETAMFBC=-999, +YAERO_NL(6)%LADV=.true., +YAERO_NL(6)%NREQIN=0, +YAERO_NL(7)%CNAME='POMACS', +YAERO_NL(7)%IGRBCODE=212004, +YAERO_NL(7)%LMASSFIX=.true., +!YAERO_NL(7)%LCOMAD=.true., +YAERO_NL(7)%LQM=.false., +YAERO_NL(7)%LQM3D=.true., +YAERO_NL(7)%BETAMFBC=-999, +YAERO_NL(7)%LADV=.true., +YAERO_NL(7)%NREQIN=0, +YAERO_NL(8)%CNAME='SSACS', +YAERO_NL(8)%IGRBCODE=212005, +YAERO_NL(8)%LMASSFIX=.true., +!YAERO_NL(8)%LCOMAD=.true., +YAERO_NL(8)%LQM=.false., +YAERO_NL(8)%LQM3D=.true., +YAERO_NL(8)%BETAMFBC=-999, +YAERO_NL(8)%LADV=.true., +YAERO_NL(8)%NREQIN=0, +YAERO_NL(9)%CNAME='DUACS', +YAERO_NL(9)%IGRBCODE=212006, +YAERO_NL(9)%LMASSFIX=.true., +!YAERO_NL(9)%LCOMAD=.true., +YAERO_NL(9)%LQM=.false., +YAERO_NL(9)%LQM3D=.true., +YAERO_NL(9)%BETAMFBC=-999, +YAERO_NL(9)%LADV=.true., +YAERO_NL(9)%NREQIN=0, +YAERO_NL(10)%CNAME='SOANUS', +YAERO_NL(10)%IGRBCODE=212007, +YAERO_NL(10)%LMASSFIX=.true., +!YAERO_NL(10)%LCOMAD=.true., +YAERO_NL(10)%LQM=.false., +YAERO_NL(10)%LQM3D=.true., +YAERO_NL(10)%BETAMFBC=-999, +YAERO_NL(10)%LADV=.true., +YAERO_NL(10)%NREQIN=0, +YAERO_NL(11)%CNAME='SOAAIS', +YAERO_NL(11)%IGRBCODE=212008, +YAERO_NL(11)%LMASSFIX=.true., +!YAERO_NL(11)%LCOMAD=.true., +YAERO_NL(11)%LQM=.false., +YAERO_NL(11)%LQM3D=.true., +YAERO_NL(11)%BETAMFBC=-999, +YAERO_NL(11)%LADV=.true., +YAERO_NL(11)%NREQIN=0, +YAERO_NL(12)%CNAME='SOAACS', +YAERO_NL(12)%IGRBCODE=212009, +YAERO_NL(12)%LMASSFIX=.true., +!YAERO_NL(12)%LCOMAD=.true., +YAERO_NL(12)%LQM=.false., +YAERO_NL(12)%LQM3D=.true., +YAERO_NL(12)%BETAMFBC=-999, +YAERO_NL(12)%LADV=.true., +YAERO_NL(12)%NREQIN=0, +YAERO_NL(13)%CNAME='SOACOS', +YAERO_NL(13)%IGRBCODE=212010, +YAERO_NL(13)%LMASSFIX=.true., +!YAERO_NL(13)%LCOMAD=.true., +YAERO_NL(13)%LQM=.false., +YAERO_NL(13)%LQM3D=.true., +YAERO_NL(13)%BETAMFBC=-999, +YAERO_NL(13)%LADV=.true., +YAERO_NL(13)%NREQIN=0, +YAERO_NL(14)%CNAME='SOAAII', +YAERO_NL(14)%IGRBCODE=212011, +YAERO_NL(14)%LMASSFIX=.true., +!YAERO_NL(14)%LCOMAD=.true., +YAERO_NL(14)%LQM=.false., +YAERO_NL(14)%LQM3D=.true., +YAERO_NL(14)%BETAMFBC=-999, +YAERO_NL(14)%LADV=.true., +YAERO_NL(14)%NREQIN=0, +YAERO_NL(15)%CNAME='H2OPART', +YAERO_NL(15)%IGRBCODE=212012, +YAERO_NL(15)%LMASSFIX=.true., +!YAERO_NL(15)%LCOMAD=.true., +YAERO_NL(15)%LQM=.false., +YAERO_NL(15)%LQM3D=.true., +YAERO_NL(15)%BETAMFBC=-999, +YAERO_NL(15)%LADV=.true., +YAERO_NL(15)%NREQIN=0, +YAERO_NL(16)%CNAME='AII_N', +YAERO_NL(16)%IGRBCODE=212013, +YAERO_NL(16)%LMASSFIX=.true., +!YAERO_NL(16)%LCOMAD=.true., +YAERO_NL(16)%LQM=.false., +YAERO_NL(16)%LQM3D=.true., +YAERO_NL(16)%BETAMFBC=-999, +YAERO_NL(16)%LADV=.true., +YAERO_NL(16)%NREQIN=0, +YAERO_NL(17)%CNAME='BCAII', +YAERO_NL(17)%IGRBCODE=212014, +YAERO_NL(17)%LMASSFIX=.true., +!YAERO_NL(17)%LCOMAD=.true., +YAERO_NL(17)%LQM=.false., +YAERO_NL(17)%LQM3D=.true., +YAERO_NL(17)%BETAMFBC=-999, +YAERO_NL(17)%LADV=.true., +YAERO_NL(17)%NREQIN=0, +YAERO_NL(18)%CNAME='POMAII', +YAERO_NL(18)%IGRBCODE=212015, +YAERO_NL(18)%LMASSFIX=.true., +!YAERO_NL(18)%LCOMAD=.true., +YAERO_NL(18)%LQM=.false., +YAERO_NL(18)%LQM3D=.true., +YAERO_NL(18)%BETAMFBC=-999, +YAERO_NL(18)%LADV=.true., +YAERO_NL(18)%NREQIN=0, +YAERO_NL(19)%CNAME='ACI_N', +YAERO_NL(19)%IGRBCODE=212016, +YAERO_NL(19)%LMASSFIX=.true., +!YAERO_NL(19)%LCOMAD=.true., +YAERO_NL(19)%LQM=.false., +YAERO_NL(19)%LQM3D=.true., +YAERO_NL(19)%BETAMFBC=-999, +YAERO_NL(19)%LADV=.true., +YAERO_NL(19)%NREQIN=0, +YAERO_NL(20)%CNAME='DUACI', +YAERO_NL(20)%IGRBCODE=212017, +YAERO_NL(20)%LMASSFIX=.true., +!YAERO_NL(20)%LCOMAD=.true., +YAERO_NL(20)%LQM=.false., +YAERO_NL(20)%LQM3D=.true., +YAERO_NL(20)%BETAMFBC=-999, +YAERO_NL(20)%LADV=.true., +YAERO_NL(20)%NREQIN=0, +YAERO_NL(21)%CNAME='AIS_N', +YAERO_NL(21)%IGRBCODE=212018, +YAERO_NL(21)%LMASSFIX=.true., +!YAERO_NL(21)%LCOMAD=.true., +YAERO_NL(21)%LQM=.false., +YAERO_NL(21)%LQM3D=.true., +YAERO_NL(21)%BETAMFBC=-999, +YAERO_NL(21)%LADV=.true., +YAERO_NL(21)%NREQIN=0, +YAERO_NL(22)%CNAME='SO4AIS', +YAERO_NL(22)%IGRBCODE=212019, +YAERO_NL(22)%LMASSFIX=.true., +!YAERO_NL(22)%LCOMAD=.true., +YAERO_NL(22)%LQM=.false., +YAERO_NL(22)%LQM3D=.true., +YAERO_NL(22)%BETAMFBC=-999, +YAERO_NL(22)%LADV=.true., +YAERO_NL(22)%NREQIN=0, +YAERO_NL(23)%CNAME='BCAIS', +YAERO_NL(23)%IGRBCODE=212020, +YAERO_NL(23)%LMASSFIX=.true., +!YAERO_NL(23)%LCOMAD=.true., +YAERO_NL(23)%LQM=.false., +YAERO_NL(23)%LQM3D=.true., +YAERO_NL(23)%BETAMFBC=-999, +YAERO_NL(23)%LADV=.true., +YAERO_NL(23)%NREQIN=0, +YAERO_NL(24)%CNAME='POMAIS', +YAERO_NL(24)%IGRBCODE=212021, +YAERO_NL(24)%LMASSFIX=.true., +!YAERO_NL(24)%LCOMAD=.true., +YAERO_NL(24)%LQM=.false., +YAERO_NL(24)%LQM3D=.true., +YAERO_NL(24)%BETAMFBC=-999, +YAERO_NL(24)%LADV=.true., +YAERO_NL(24)%NREQIN=0, +YAERO_NL(25)%CNAME='COI_N', +YAERO_NL(25)%IGRBCODE=212022, +YAERO_NL(25)%LMASSFIX=.true., +!YAERO_NL(25)%LCOMAD=.true., +YAERO_NL(25)%LQM=.false., +YAERO_NL(25)%LQM3D=.true., +YAERO_NL(25)%BETAMFBC=-999, +YAERO_NL(25)%LADV=.true., +YAERO_NL(25)%NREQIN=0, +YAERO_NL(26)%CNAME='DUCOI', +YAERO_NL(26)%IGRBCODE=212023, +YAERO_NL(26)%LMASSFIX=.true., +!YAERO_NL(26)%LCOMAD=.true., +YAERO_NL(26)%LQM=.false., +YAERO_NL(26)%LQM3D=.true., +YAERO_NL(26)%BETAMFBC=-999, +YAERO_NL(26)%LADV=.true., +YAERO_NL(26)%NREQIN=0, +YAERO_NL(27)%CNAME='COS_N', +YAERO_NL(27)%IGRBCODE=212024, +YAERO_NL(27)%LMASSFIX=.true., +!YAERO_NL(27)%LCOMAD=.true., +YAERO_NL(27)%LQM=.false., +YAERO_NL(27)%LQM3D=.true., +YAERO_NL(27)%BETAMFBC=-999, +YAERO_NL(27)%LADV=.true., +YAERO_NL(27)%NREQIN=0, +YAERO_NL(28)%CNAME='SO4COS', +YAERO_NL(28)%IGRBCODE=212025, +YAERO_NL(28)%LMASSFIX=.true., +!YAERO_NL(28)%LCOMAD=.true., +YAERO_NL(28)%LQM=.false., +YAERO_NL(28)%LQM3D=.true., +YAERO_NL(28)%BETAMFBC=-999, +YAERO_NL(28)%LADV=.true., +YAERO_NL(28)%NREQIN=0, +YAERO_NL(29)%CNAME='BCCOS', +YAERO_NL(29)%IGRBCODE=212026, +YAERO_NL(29)%LMASSFIX=.true., +!YAERO_NL(29)%LCOMAD=.true., +YAERO_NL(29)%LQM=.false., +YAERO_NL(29)%LQM3D=.true., +YAERO_NL(29)%BETAMFBC=-999, +YAERO_NL(29)%LADV=.true., +YAERO_NL(29)%NREQIN=0, +YAERO_NL(30)%CNAME='POMCOS', +YAERO_NL(30)%IGRBCODE=212027, +YAERO_NL(30)%LMASSFIX=.true., +!YAERO_NL(30)%LCOMAD=.true., +YAERO_NL(30)%LQM=.false., +YAERO_NL(30)%LQM3D=.true., +YAERO_NL(30)%BETAMFBC=-999, +YAERO_NL(30)%LADV=.true., +YAERO_NL(30)%NREQIN=0, +YAERO_NL(31)%CNAME='SSCOS', +YAERO_NL(31)%IGRBCODE=212028, +YAERO_NL(31)%LMASSFIX=.true., +!YAERO_NL(31)%LCOMAD=.true., +YAERO_NL(31)%LQM=.false., +YAERO_NL(31)%LQM3D=.true., +YAERO_NL(31)%BETAMFBC=-999, +YAERO_NL(31)%LADV=.true., +YAERO_NL(31)%NREQIN=0, +YAERO_NL(32)%CNAME='DUCOS', +YAERO_NL(32)%IGRBCODE=212029, +YAERO_NL(32)%LMASSFIX=.true., +!YAERO_NL(32)%LCOMAD=.true., +YAERO_NL(32)%LQM=.false., +YAERO_NL(32)%LQM3D=.true., +YAERO_NL(32)%BETAMFBC=-999, +YAERO_NL(32)%LADV=.true., +YAERO_NL(32)%NREQIN=0, +YAERO_NL(33)%CNAME='NUS_N', +YAERO_NL(33)%IGRBCODE=212030, +YAERO_NL(33)%LMASSFIX=.true., +!YAERO_NL(33)%LCOMAD=.true., +YAERO_NL(33)%LQM=.false., +YAERO_NL(33)%LQM3D=.true., +YAERO_NL(33)%BETAMFBC=-999, +YAERO_NL(33)%LADV=.true., +YAERO_NL(33)%NREQIN=0, +YAERO_NL(34)%CNAME='SO4NUS', +YAERO_NL(34)%IGRBCODE=212031, +YAERO_NL(34)%LMASSFIX=.true., +!YAERO_NL(34)%LCOMAD=.true., +YAERO_NL(34)%LQM=.false., +YAERO_NL(34)%LQM3D=.true., +YAERO_NL(34)%BETAMFBC=-999, +YAERO_NL(34)%LADV=.true., +YAERO_NL(34)%NREQIN=0, +YAERO_NL(35)%CNAME='ELVOC', +YAERO_NL(35)%IGRBCODE=212032, +YAERO_NL(35)%LMASSFIX=.true., +!YAERO_NL(35)%LCOMAD=.true., +YAERO_NL(35)%LQM=.false., +YAERO_NL(35)%LQM3D=.true., +YAERO_NL(35)%BETAMFBC=-999, +YAERO_NL(35)%LADV=.true., +YAERO_NL(35)%NREQIN=0, +YAERO_NL(36)%CNAME='ISVOC', +YAERO_NL(36)%IGRBCODE=212033, +YAERO_NL(36)%LMASSFIX=.true., +!YAERO_NL(36)%LCOMAD=.true., +YAERO_NL(36)%LQM=.false., +YAERO_NL(36)%LQM3D=.true., +YAERO_NL(36)%BETAMFBC=-999, +YAERO_NL(36)%LADV=.true., +YAERO_NL(36)%NREQIN=0, +YAERO_NL(37)%CNAME='MSA', +YAERO_NL(37)%IGRBCODE=212034, +YAERO_NL(37)%LMASSFIX=.true., +!YAERO_NL(37)%LCOMAD=.true., +YAERO_NL(37)%LQM=.false., +YAERO_NL(37)%LQM3D=.true., +YAERO_NL(37)%BETAMFBC=-999, +YAERO_NL(37)%LADV=.true., +YAERO_NL(37)%NREQIN=0, +EOF + diff --git a/ifs-test/tests/t21/common/aer/m7_aerowvldiag_old.nml b/ifs-test/tests/t21/common/aer/m7_aerowvldiag_old.nml new file mode 100644 index 00000000..3cddf1e5 --- /dev/null +++ b/ifs-test/tests/t21/common/aer/m7_aerowvldiag_old.nml @@ -0,0 +1,46 @@ +cat >> fort.4 << EOF +NAERO_WVL_DIAG=20, +NAERO_WVL_DIAG_TYPES=5, +YAERO_WVL_DIAG_NL(1)%IWVL=550, +YAERO_WVL_DIAG_NL(1)%IGRIBDIAG=210207,215104,215122,215140,215158, +YAERO_WVL_DIAG_NL(2)%IWVL=340, +YAERO_WVL_DIAG_NL(2)%IGRIBDIAG=210217,215096,215114,215132,215150, +YAERO_WVL_DIAG_NL(3)%IWVL=355, +YAERO_WVL_DIAG_NL(3)%IGRIBDIAG=210218,215097,215115,215133,215151, +YAERO_WVL_DIAG_NL(4)%IWVL=380, +YAERO_WVL_DIAG_NL(4)%IGRIBDIAG=210219,215098,215116,215134,215152, +YAERO_WVL_DIAG_NL(5)%IWVL=400, +YAERO_WVL_DIAG_NL(5)%IGRIBDIAG=210220,215099,215117,215135,215153, +YAERO_WVL_DIAG_NL(6)%IWVL=440, +YAERO_WVL_DIAG_NL(6)%IGRIBDIAG=210221,215100,215118,215136,215154, +YAERO_WVL_DIAG_NL(7)%IWVL=469, +YAERO_WVL_DIAG_NL(7)%IGRIBDIAG=210213,215101,215119,215137,215155, +YAERO_WVL_DIAG_NL(8)%IWVL=500, +YAERO_WVL_DIAG_NL(8)%IGRIBDIAG=210222,215102,215120,215138,215156, +YAERO_WVL_DIAG_NL(9)%IWVL=532, +YAERO_WVL_DIAG_NL(9)%IGRIBDIAG=210223,215103,215121,215139,215157, +YAERO_WVL_DIAG_NL(10)%IWVL=645, +YAERO_WVL_DIAG_NL(10)%IGRIBDIAG=210224,215105,215123,215141,215159, +YAERO_WVL_DIAG_NL(11)%IWVL=670, +YAERO_WVL_DIAG_NL(11)%IGRIBDIAG=210214,215106,215124,215142,215160, +YAERO_WVL_DIAG_NL(12)%IWVL=800, +YAERO_WVL_DIAG_NL(12)%IGRIBDIAG=210225,215107,215125,215143,215161, +YAERO_WVL_DIAG_NL(13)%IWVL=858, +YAERO_WVL_DIAG_NL(13)%IGRIBDIAG=210226,215108,215126,215144,215162, +YAERO_WVL_DIAG_NL(14)%IWVL=865, +YAERO_WVL_DIAG_NL(14)%IGRIBDIAG=210215,215109,215127,215145,215163, +YAERO_WVL_DIAG_NL(15)%IWVL=1020, +YAERO_WVL_DIAG_NL(15)%IGRIBDIAG=210227,215110,215128,215146,215164, +YAERO_WVL_DIAG_NL(16)%IWVL=1064, +YAERO_WVL_DIAG_NL(16)%IGRIBDIAG=210228,215111,215129,215147,215165, +YAERO_WVL_DIAG_NL(17)%IWVL=1240, +YAERO_WVL_DIAG_NL(17)%IGRIBDIAG=210216,215112,215130,215148,215166, +YAERO_WVL_DIAG_NL(18)%IWVL=1640, +YAERO_WVL_DIAG_NL(18)%IGRIBDIAG=210229,215113,215131,215149,215167, +YAERO_WVL_DIAG_NL(19)%IWVL=2130, +YAERO_WVL_DIAG_NL(19)%IGRIBDIAG=210230,215176,215177,215178,215179, +YAERO_WVL_DIAG_NL(20)%IWVL=10000, +YAERO_WVL_DIAG_NL(20)%IGRIBDIAG=216008,216009,216010,216011,216012, +EOF + + diff --git a/ifs-test/tests/t255/common/aer/aer_aerowvldiag.nml b/ifs-test/tests/t255/common/aer/aer_aerowvldiag.nml new file mode 100644 index 00000000..3cddf1e5 --- /dev/null +++ b/ifs-test/tests/t255/common/aer/aer_aerowvldiag.nml @@ -0,0 +1,46 @@ +cat >> fort.4 << EOF +NAERO_WVL_DIAG=20, +NAERO_WVL_DIAG_TYPES=5, +YAERO_WVL_DIAG_NL(1)%IWVL=550, +YAERO_WVL_DIAG_NL(1)%IGRIBDIAG=210207,215104,215122,215140,215158, +YAERO_WVL_DIAG_NL(2)%IWVL=340, +YAERO_WVL_DIAG_NL(2)%IGRIBDIAG=210217,215096,215114,215132,215150, +YAERO_WVL_DIAG_NL(3)%IWVL=355, +YAERO_WVL_DIAG_NL(3)%IGRIBDIAG=210218,215097,215115,215133,215151, +YAERO_WVL_DIAG_NL(4)%IWVL=380, +YAERO_WVL_DIAG_NL(4)%IGRIBDIAG=210219,215098,215116,215134,215152, +YAERO_WVL_DIAG_NL(5)%IWVL=400, +YAERO_WVL_DIAG_NL(5)%IGRIBDIAG=210220,215099,215117,215135,215153, +YAERO_WVL_DIAG_NL(6)%IWVL=440, +YAERO_WVL_DIAG_NL(6)%IGRIBDIAG=210221,215100,215118,215136,215154, +YAERO_WVL_DIAG_NL(7)%IWVL=469, +YAERO_WVL_DIAG_NL(7)%IGRIBDIAG=210213,215101,215119,215137,215155, +YAERO_WVL_DIAG_NL(8)%IWVL=500, +YAERO_WVL_DIAG_NL(8)%IGRIBDIAG=210222,215102,215120,215138,215156, +YAERO_WVL_DIAG_NL(9)%IWVL=532, +YAERO_WVL_DIAG_NL(9)%IGRIBDIAG=210223,215103,215121,215139,215157, +YAERO_WVL_DIAG_NL(10)%IWVL=645, +YAERO_WVL_DIAG_NL(10)%IGRIBDIAG=210224,215105,215123,215141,215159, +YAERO_WVL_DIAG_NL(11)%IWVL=670, +YAERO_WVL_DIAG_NL(11)%IGRIBDIAG=210214,215106,215124,215142,215160, +YAERO_WVL_DIAG_NL(12)%IWVL=800, +YAERO_WVL_DIAG_NL(12)%IGRIBDIAG=210225,215107,215125,215143,215161, +YAERO_WVL_DIAG_NL(13)%IWVL=858, +YAERO_WVL_DIAG_NL(13)%IGRIBDIAG=210226,215108,215126,215144,215162, +YAERO_WVL_DIAG_NL(14)%IWVL=865, +YAERO_WVL_DIAG_NL(14)%IGRIBDIAG=210215,215109,215127,215145,215163, +YAERO_WVL_DIAG_NL(15)%IWVL=1020, +YAERO_WVL_DIAG_NL(15)%IGRIBDIAG=210227,215110,215128,215146,215164, +YAERO_WVL_DIAG_NL(16)%IWVL=1064, +YAERO_WVL_DIAG_NL(16)%IGRIBDIAG=210228,215111,215129,215147,215165, +YAERO_WVL_DIAG_NL(17)%IWVL=1240, +YAERO_WVL_DIAG_NL(17)%IGRIBDIAG=210216,215112,215130,215148,215166, +YAERO_WVL_DIAG_NL(18)%IWVL=1640, +YAERO_WVL_DIAG_NL(18)%IGRIBDIAG=210229,215113,215131,215149,215167, +YAERO_WVL_DIAG_NL(19)%IWVL=2130, +YAERO_WVL_DIAG_NL(19)%IGRIBDIAG=210230,215176,215177,215178,215179, +YAERO_WVL_DIAG_NL(20)%IWVL=10000, +YAERO_WVL_DIAG_NL(20)%IGRIBDIAG=216008,216009,216010,216011,216012, +EOF + + diff --git a/ifs-test/tests/t255/common/aer/aer_chem.nml b/ifs-test/tests/t255/common/aer/aer_chem.nml new file mode 100644 index 00000000..6c508241 --- /dev/null +++ b/ifs-test/tests/t255/common/aer/aer_chem.nml @@ -0,0 +1,675 @@ +cat >> fort.4 << EOF +NGHG=2, +YLRCH4_NL%CNAME='kCH4', +YLRCH4_NL%IGRBCODE=210071, +YLRCH4_NL%LGP=.TRUE.,YLRCH4_NL%LTRAJIO=.FALSE., +YGHG_NL(1)%CNAME='CO2_GHG', +YGHG_NL(1)%IGRBCODE=210061, +YGHG_NL(1)%LADV5=true, +YGHG_NL(1)%LASSIM=true, +YGHG_NL(1)%LMASSFIX=true, +YGHG_NL(1)%LNEGFIX=.FALSE., +YGHG_NL(1)%LQM=false, +YGHG_NL(1)%LQM3D=true, +YGHG_NL(1)%BETAMFBC=2, +YGHG_NL(2)%CNAME='CH4_GHG', +YGHG_NL(2)%IGRBCODE=210062, +YGHG_NL(2)%LADV5=true, +YGHG_NL(2)%LASSIM=true, +YGHG_NL(2)%LMASSFIX=true, +YGHG_NL(2)%LNEGFIX=.FALSE., +YGHG_NL(2)%LQM=false, +YGHG_NL(2)%LQM3D=true, +YGHG_NL(2)%BETAMFBC=2, +NCHEM=57, +YCHEM_NL(1)%CNAME='O3', +YCHEM_NL(1)%NREQIN=1, +YCHEM_NL(1)%RMOLMASS=48.0, +YCHEM_NL(1)%IGRBCODE=210203, +YCHEM_NL(1)%LNEGFIX=.TRUE., +YCHEM_NL(1)%IGRIBTC=210206, +YCHEM_NL(1)%IGRIBDV=221001, +YCHEM_NL(1)%HENRYA=1.0e-2, +YCHEM_NL(1)%HENRYB=2800.0, +YCHEM_NL(1)%LMASSFIX=.TRUE., +YCHEM_NL(1)%BETAMFBC=-999.9, +YCHEM_NL(1)%LASSIM=.TRUE., +YCHEM_NL(1)%LADV5=.TRUE., +YCHEM_NL(2)%CNAME='NOx', +YCHEM_NL(2)%NREQIN=1, +YCHEM_NL(2)%RMOLMASS=14.0, +YCHEM_NL(2)%IGRBCODE=210129, +YCHEM_NL(2)%LNEGFIX=.TRUE., +YCHEM_NL(2)%IGRIBTC=210130, +YCHEM_NL(2)%LMASSFIX=.TRUE., +YCHEM_NL(2)%BETAMFBC=-999.9, +YCHEM_NL(2)%LASSIM=.FALSE., +YCHEM_NL(3)%CNAME='H2O2', +YCHEM_NL(3)%NREQIN=1, +YCHEM_NL(3)%RMOLMASS=34.0, +YCHEM_NL(3)%IGRBCODE=217003, +YCHEM_NL(3)%LNEGFIX=.TRUE., +YCHEM_NL(3)%IGRIBTC=218003, +YCHEM_NL(3)%IGRIBDV=221003, +YCHEM_NL(3)%HENRYA=8.3e4, +YCHEM_NL(3)%HENRYB=7600.0, +YCHEM_NL(3)%LMASSFIX=.TRUE., +YCHEM_NL(3)%BETAMFBC=-999.9, +YCHEM_NL(3)%LASSIM=.FALSE., +YCHEM_NL(4)%CNAME='CH4', +YCHEM_NL(4)%NREQIN=1, +YCHEM_NL(4)%RMOLMASS=16.0, +YCHEM_NL(4)%IGRBCODE=217004, +YCHEM_NL(4)%LNEGFIX=.TRUE., +YCHEM_NL(4)%IGRIBTC=218004, +YCHEM_NL(4)%LMASSFIX=.TRUE., +YCHEM_NL(4)%BETAMFBC=-999.9, +YCHEM_NL(4)%LASSIM=.FALSE., +YCHEM_NL(5)%CNAME='CO', +YCHEM_NL(5)%NREQIN=1, +YCHEM_NL(5)%RMOLMASS=28.0, +YCHEM_NL(5)%IGRBCODE=210123, +YCHEM_NL(5)%LNEGFIX=.TRUE., +YCHEM_NL(5)%IGRIBTC=210127, +YCHEM_NL(5)%IGRIBDV=221005, +YCHEM_NL(5)%HENRYA=9.7e-4, +YCHEM_NL(5)%HENRYB=1300.0, +YCHEM_NL(5)%LMASSFIX=.TRUE., +YCHEM_NL(5)%BETAMFBC=-999.9, +YCHEM_NL(5)%LASSIM=.TRUE., +YCHEM_NL(5)%LADV5=.TRUE., +YCHEM_NL(6)%CNAME='HNO3', +YCHEM_NL(6)%NREQIN=1, +YCHEM_NL(6)%RMOLMASS=63.0, +YCHEM_NL(6)%IGRBCODE=217006, +YCHEM_NL(6)%LNEGFIX=.TRUE., +YCHEM_NL(6)%IGRIBTC=218006, +YCHEM_NL(6)%IGRIBDV=221006, +YCHEM_NL(6)%HENRYA=3.2e11, +YCHEM_NL(6)%HENRYB=8700.0, +YCHEM_NL(6)%LMASSFIX=.TRUE., +YCHEM_NL(6)%BETAMFBC=-999.9, +YCHEM_NL(6)%LASSIM=.FALSE., +YCHEM_NL(7)%CNAME='CH3OOH', +YCHEM_NL(7)%NREQIN=1, +YCHEM_NL(7)%RMOLMASS=48.0, +YCHEM_NL(7)%IGRBCODE=217007, +YCHEM_NL(7)%LNEGFIX=.TRUE., +YCHEM_NL(7)%IGRIBTC=218007, +YCHEM_NL(7)%IGRIBDV=221007, +YCHEM_NL(7)%HENRYA=2.9e2, +YCHEM_NL(7)%HENRYB=5200.0, +YCHEM_NL(7)%LMASSFIX=.TRUE., +YCHEM_NL(7)%BETAMFBC=-999.9, +YCHEM_NL(7)%LASSIM=.FALSE., +YCHEM_NL(8)%CNAME='CH2O', +YCHEM_NL(8)%NREQIN=1, +YCHEM_NL(8)%RMOLMASS=30.0, +YCHEM_NL(8)%IGRBCODE=210124, +YCHEM_NL(8)%LNEGFIX=.TRUE., +YCHEM_NL(8)%IGRIBTC=210128, +YCHEM_NL(8)%IGRIBDV=221008, +YCHEM_NL(8)%HENRYA=3.2e3, +YCHEM_NL(8)%HENRYB=6800.0, +YCHEM_NL(8)%LMASSFIX=.TRUE., +YCHEM_NL(8)%BETAMFBC=-999.9, +YCHEM_NL(8)%LASSIM=.TRUE., +YCHEM_NL(8)%LADV5=.TRUE., +YCHEM_NL(9)%CNAME='PAR', +YCHEM_NL(9)%NREQIN=1, +YCHEM_NL(9)%RMOLMASS=12.0, +YCHEM_NL(9)%IGRBCODE=217009, +YCHEM_NL(9)%LNEGFIX=.TRUE., +YCHEM_NL(9)%IGRIBTC=218009, +YCHEM_NL(9)%LMASSFIX=.TRUE., +YCHEM_NL(9)%BETAMFBC=-999.9, +YCHEM_NL(9)%LASSIM=.FALSE., +YCHEM_NL(10)%CNAME='C2H4', +YCHEM_NL(10)%NREQIN=1, +YCHEM_NL(10)%RMOLMASS=28.0, +YCHEM_NL(10)%IGRBCODE=217010, +YCHEM_NL(10)%LNEGFIX=.TRUE., +YCHEM_NL(10)%IGRIBTC=218010, +YCHEM_NL(10)%LMASSFIX=.TRUE., +YCHEM_NL(10)%BETAMFBC=-999.9, +YCHEM_NL(10)%LASSIM=.FALSE., +YCHEM_NL(11)%CNAME='OLE', +YCHEM_NL(11)%NREQIN=1, +YCHEM_NL(11)%RMOLMASS=24.0, +YCHEM_NL(11)%IGRBCODE=217011, +YCHEM_NL(11)%LNEGFIX=.TRUE., +YCHEM_NL(11)%IGRIBTC=218011, +YCHEM_NL(11)%LMASSFIX=.TRUE., +YCHEM_NL(11)%BETAMFBC=-999.9, +YCHEM_NL(11)%LASSIM=.FALSE., +YCHEM_NL(12)%CNAME='ALD2', +YCHEM_NL(12)%NREQIN=1, +YCHEM_NL(12)%RMOLMASS=24.0, +YCHEM_NL(12)%IGRBCODE=217012, +YCHEM_NL(12)%LNEGFIX=.TRUE., +YCHEM_NL(12)%IGRIBTC=218012, +YCHEM_NL(12)%IGRIBDV=221012, +YCHEM_NL(12)%HENRYA=17.0, +YCHEM_NL(12)%HENRYB=5000.0, +YCHEM_NL(12)%LMASSFIX=.TRUE., +YCHEM_NL(12)%BETAMFBC=-999.9, +YCHEM_NL(12)%LASSIM=.FALSE., +YCHEM_NL(13)%CNAME='PAN', +YCHEM_NL(13)%NREQIN=1, +YCHEM_NL(13)%RMOLMASS=121.0, +YCHEM_NL(13)%IGRBCODE=217013, +YCHEM_NL(13)%LNEGFIX=.TRUE., +YCHEM_NL(13)%IGRIBTC=218013, +YCHEM_NL(13)%IGRIBDV=221013, +YCHEM_NL(13)%HENRYA=2.9e+0, +YCHEM_NL(13)%HENRYB=5700.0, +YCHEM_NL(13)%LMASSFIX=.TRUE., +YCHEM_NL(13)%BETAMFBC=-999.9, +YCHEM_NL(13)%LASSIM=.FALSE., +YCHEM_NL(14)%CNAME='ROOH', +YCHEM_NL(14)%NREQIN=1, +YCHEM_NL(14)%RMOLMASS=47.0, +YCHEM_NL(14)%IGRBCODE=217014, +YCHEM_NL(14)%LNEGFIX=.TRUE., +YCHEM_NL(14)%IGRIBTC=218014, +YCHEM_NL(14)%IGRIBDV=221014, +YCHEM_NL(14)%HENRYA=340.0, +YCHEM_NL(14)%HENRYB=6000.0, +YCHEM_NL(14)%LMASSFIX=.TRUE., +YCHEM_NL(14)%BETAMFBC=-999.9, +YCHEM_NL(14)%LASSIM=.FALSE., +YCHEM_NL(15)%CNAME='ONIT', +YCHEM_NL(15)%NREQIN=1, +YCHEM_NL(15)%RMOLMASS=77.0, +YCHEM_NL(15)%IGRBCODE=217015, +YCHEM_NL(15)%LNEGFIX=.TRUE., +YCHEM_NL(15)%IGRIBTC=218015, +YCHEM_NL(15)%IGRIBDV=221015, +YCHEM_NL(15)%HENRYA=1.0e3, +YCHEM_NL(15)%HENRYB=6485, +YCHEM_NL(15)%LMASSFIX=.TRUE., +YCHEM_NL(15)%BETAMFBC=-999.9, +YCHEM_NL(15)%LASSIM=.FALSE., +YCHEM_NL(16)%CNAME='C5H8', +YCHEM_NL(16)%NREQIN=1, +YCHEM_NL(16)%RMOLMASS=68.1, +YCHEM_NL(16)%IGRBCODE=217016, +YCHEM_NL(16)%LNEGFIX=.TRUE., +YCHEM_NL(16)%IGRIBTC=218016, +YCHEM_NL(16)%IGRIBDV=221016, +YCHEM_NL(16)%HENRYA=1.3e-2, +YCHEM_NL(16)%HENRYB=0.0, +YCHEM_NL(16)%LMASSFIX=.TRUE., +YCHEM_NL(16)%BETAMFBC=-999.9, +YCHEM_NL(16)%LASSIM=.FALSE., +YCHEM_NL(17)%CNAME='SO2', +YCHEM_NL(17)%NREQIN=1, +YCHEM_NL(17)%RMOLMASS=64.1, +YCHEM_NL(17)%IGRBCODE=210122, +YCHEM_NL(17)%LNEGFIX=.TRUE., +YCHEM_NL(17)%IGRIBTC=210126, +YCHEM_NL(17)%IGRIBDV=221017, +YCHEM_NL(17)%HENRYA=1.0e5, +YCHEM_NL(17)%HENRYB=3000.0, +YCHEM_NL(17)%LMASSFIX=.TRUE., +YCHEM_NL(17)%BETAMFBC=-999.9, +YCHEM_NL(17)%LASSIM=.TRUE., +YCHEM_NL(17)%LADV5=.TRUE., +YCHEM_NL(18)%CNAME='DMS', +YCHEM_NL(18)%NREQIN=1, +YCHEM_NL(18)%RMOLMASS=62.1, +YCHEM_NL(18)%IGRBCODE=217018, +YCHEM_NL(18)%LNEGFIX=.TRUE., +YCHEM_NL(18)%IGRIBTC=218018, +YCHEM_NL(18)%LMASSFIX=.TRUE., +YCHEM_NL(18)%BETAMFBC=-999.9, +YCHEM_NL(18)%LASSIM=.FALSE., +YCHEM_NL(19)%CNAME='NH3', +YCHEM_NL(19)%NREQIN=1, +YCHEM_NL(19)%RMOLMASS=17.0, +YCHEM_NL(19)%IGRBCODE=217019, +YCHEM_NL(19)%LNEGFIX=.TRUE., +YCHEM_NL(19)%IGRIBTC=218019, +YCHEM_NL(19)%IGRIBDV=221019, +YCHEM_NL(19)%HENRYA=59.0, +YCHEM_NL(19)%HENRYB=4200.0, +YCHEM_NL(19)%LMASSFIX=.TRUE., +YCHEM_NL(19)%BETAMFBC=-999.9, +YCHEM_NL(19)%LASSIM=.FALSE., +YCHEM_NL(20)%CNAME='SO4', +YCHEM_NL(20)%NREQIN=-1, +YCHEM_NL(20)%RMOLMASS=96.1, +YCHEM_NL(20)%IGRBCODE=217020, +YCHEM_NL(20)%LNEGFIX=.FALSE., +YCHEM_NL(20)%IGRIBTC=218020, +YCHEM_NL(20)%LMASSFIX=.TRUE., +YCHEM_NL(20)%BETAMFBC=-999.9, +YCHEM_NL(20)%LASSIM=.FALSE., +YCHEM_NL(21)%CNAME='NH4', +YCHEM_NL(21)%NREQIN=1, +YCHEM_NL(21)%RMOLMASS=18.0, +YCHEM_NL(21)%IGRBCODE=217021, +YCHEM_NL(21)%LNEGFIX=.TRUE., +YCHEM_NL(21)%IGRIBTC=218021, +YCHEM_NL(21)%IGRIBDV=221021, +YCHEM_NL(21)%HENRYA=3.2e11, +YCHEM_NL(21)%HENRYB=8700.0, +YCHEM_NL(21)%LMASSFIX=.TRUE., +YCHEM_NL(21)%BETAMFBC=-999.9, +YCHEM_NL(21)%LASSIM=.FALSE., +YCHEM_NL(22)%CNAME='MSA', +YCHEM_NL(22)%NREQIN=1, +YCHEM_NL(22)%RMOLMASS=96.1, +YCHEM_NL(22)%IGRBCODE=217022, +YCHEM_NL(22)%LNEGFIX=.TRUE., +YCHEM_NL(22)%IGRIBTC=218022, +YCHEM_NL(22)%HENRYA=3.2e11, +YCHEM_NL(22)%HENRYB=8700.0, +YCHEM_NL(22)%LMASSFIX=.TRUE., +YCHEM_NL(22)%BETAMFBC=-999.9, +YCHEM_NL(22)%LASSIM=.FALSE., +YCHEM_NL(23)%CNAME='CH3COCHO', +YCHEM_NL(23)%NREQIN=1, +YCHEM_NL(23)%RMOLMASS=72.1, +YCHEM_NL(23)%IGRBCODE=217023, +YCHEM_NL(23)%LNEGFIX=.TRUE., +YCHEM_NL(23)%IGRIBTC=218023, +YCHEM_NL(23)%IGRIBDV=221023, +YCHEM_NL(23)%HENRYA=3.4e4, +YCHEM_NL(23)%HENRYB=7500.0, +YCHEM_NL(23)%LMASSFIX=.TRUE., +YCHEM_NL(23)%BETAMFBC=-999.9, +YCHEM_NL(23)%LASSIM=.FALSE., +YCHEM_NL(24)%CNAME='O3S', +YCHEM_NL(24)%NREQIN=1, +YCHEM_NL(24)%RMOLMASS=48.0, +YCHEM_NL(24)%IGRBCODE=217024, +YCHEM_NL(24)%LNEGFIX=.TRUE., +YCHEM_NL(24)%IGRIBTC=218024, +YCHEM_NL(24)%IGRIBDV=221024, +YCHEM_NL(24)%HENRYA=1.0e-2, +YCHEM_NL(24)%HENRYB=2800.0, +YCHEM_NL(24)%LMASSFIX=.TRUE., +YCHEM_NL(24)%BETAMFBC=-999.9, +YCHEM_NL(24)%LASSIM=.FALSE., +YCHEM_NL(25)%CNAME='Rn', +YCHEM_NL(25)%NREQIN=1, +YCHEM_NL(25)%RMOLMASS=222.0, +YCHEM_NL(25)%IGRBCODE=210181, +YCHEM_NL(25)%LNEGFIX=.TRUE., +YCHEM_NL(25)%IGRIBTC=210183, +YCHEM_NL(25)%LMASSFIX=.TRUE., +YCHEM_NL(25)%BETAMFBC=-999.9, +YCHEM_NL(25)%LASSIM=.FALSE., +YCHEM_NL(26)%CNAME='Pb', +YCHEM_NL(26)%NREQIN=1, +YCHEM_NL(26)%RMOLMASS=210.0, +YCHEM_NL(26)%IGRBCODE=217026, +YCHEM_NL(26)%LNEGFIX=.TRUE., +YCHEM_NL(26)%IGRIBTC=218026, +YCHEM_NL(26)%HENRYA=3.2e11, +YCHEM_NL(26)%HENRYB=8700.0, +YCHEM_NL(26)%LMASSFIX=.TRUE., +YCHEM_NL(26)%BETAMFBC=-999.9, +YCHEM_NL(26)%LASSIM=.FALSE., +YCHEM_NL(27)%CNAME='NO', +YCHEM_NL(27)%NREQIN=1, +YCHEM_NL(27)%RMOLMASS=30.0, +YCHEM_NL(27)%IGRBCODE=217027, +YCHEM_NL(27)%LNEGFIX=.TRUE., +YCHEM_NL(27)%IGRIBTC=218027, +YCHEM_NL(27)%IGRIBDV=221027, +YCHEM_NL(27)%HENRYA=1.9e-3, +YCHEM_NL(27)%HENRYB=1600.0, +YCHEM_NL(27)%LMASSFIX=.TRUE., +YCHEM_NL(27)%BETAMFBC=-999.9, +YCHEM_NL(27)%LMASSFIX=.FALSE., +YCHEM_NL(27)%LADV=.TRUE., +YCHEM_NL(27)%LASSIM=.FALSE., +YCHEM_NL(28)%CNAME='HO2', +YCHEM_NL(28)%NREQIN=1, +YCHEM_NL(28)%RMOLMASS=33.0, +YCHEM_NL(28)%IGRBCODE=217028, +YCHEM_NL(28)%LNEGFIX=.TRUE., +YCHEM_NL(28)%IGRIBTC=218028, +YCHEM_NL(28)%IGRIBDV=221028, +YCHEM_NL(28)%HENRYA=6.8e2, +YCHEM_NL(28)%HENRYB=0.0, +YCHEM_NL(28)%LMASSFIX=.FALSE., +YCHEM_NL(28)%LADV=.FALSE., +YCHEM_NL(28)%LASSIM=.FALSE., +YCHEM_NL(29)%CNAME='CH3O2', +YCHEM_NL(29)%NREQIN=1, +YCHEM_NL(29)%RMOLMASS=47.0 +YCHEM_NL(29)%IGRBCODE=217029, +YCHEM_NL(29)%LNEGFIX=.TRUE., +YCHEM_NL(29)%IGRIBTC=218029, +YCHEM_NL(29)%IGRIBDV=221029, +YCHEM_NL(29)%HENRYA=1.5e1, +YCHEM_NL(29)%HENRYB=3700.0, +YCHEM_NL(29)%LMASSFIX=.FALSE., +YCHEM_NL(29)%LADV=.FALSE., +YCHEM_NL(29)%LASSIM=.FALSE., +YCHEM_NL(30)%CNAME='OH', +YCHEM_NL(30)%NREQIN=1, +YCHEM_NL(30)%RMOLMASS=17.0, +YCHEM_NL(30)%IGRBCODE=217030, +YCHEM_NL(30)%LNEGFIX=.TRUE., +YCHEM_NL(30)%IGRIBTC=218030, +YCHEM_NL(30)%LMASSFIX=.FALSE., +YCHEM_NL(30)%LADV=.FALSE., +YCHEM_NL(30)%LASSIM=.FALSE., +YCHEM_NL(31)%CNAME='NO2', +YCHEM_NL(31)%NREQIN=1, +YCHEM_NL(31)%RMOLMASS=46.0, +YCHEM_NL(31)%IGRBCODE=210121, +YCHEM_NL(31)%LNEGFIX=.TRUE., +YCHEM_NL(31)%IGRIBTC=210125, +YCHEM_NL(31)%IGRIBDV=221031, +YCHEM_NL(31)%HENRYA=1.2e-2, +YCHEM_NL(31)%HENRYB=2400.0, +YCHEM_NL(31)%LMASSFIX=.TRUE., +YCHEM_NL(31)%BETAMFBC=-999.9, +YCHEM_NL(31)%LMASSFIX=.FALSE., +YCHEM_NL(31)%LADV=.TRUE., +YCHEM_NL(31)%LASSIM=.TRUE., +YCHEM_NL(31)%LADV5=.TRUE., +YCHEM_NL(32)%CNAME='NO3', +YCHEM_NL(32)%NREQIN=1, +YCHEM_NL(32)%RMOLMASS=62.0, +YCHEM_NL(32)%IGRBCODE=217032, +YCHEM_NL(32)%LNEGFIX=.TRUE., +YCHEM_NL(32)%IGRIBTC=218032, +YCHEM_NL(32)%IGRIBDV=221032, +YCHEM_NL(32)%HENRYA=3.8e-2, +YCHEM_NL(32)%HENRYB=0., +YCHEM_NL(32)%LMASSFIX=.TRUE., +YCHEM_NL(32)%BETAMFBC=-999.9, +YCHEM_NL(32)%LMASSFIX=.FALSE., +YCHEM_NL(32)%LADV=.TRUE., +YCHEM_NL(32)%LASSIM=.FALSE., +YCHEM_NL(33)%CNAME='N2O5', +YCHEM_NL(33)%NREQIN=1, +YCHEM_NL(33)%RMOLMASS=108.0, +YCHEM_NL(33)%IGRBCODE=217033, +YCHEM_NL(33)%LNEGFIX=.TRUE., +YCHEM_NL(33)%IGRIBTC=218033, +YCHEM_NL(33)%IGRIBDV=221033, +YCHEM_NL(33)%HENRYA=2.1e+1, +YCHEM_NL(33)%HENRYB=3400.0, +YCHEM_NL(33)%LMASSFIX=.TRUE., +YCHEM_NL(33)%BETAMFBC=-999.9, +YCHEM_NL(33)%LASSIM=.FALSE., +YCHEM_NL(34)%CNAME='HO2NO2', +YCHEM_NL(34)%NREQIN=1, +YCHEM_NL(34)%RMOLMASS=79.0, +YCHEM_NL(34)%IGRBCODE=217034, +YCHEM_NL(34)%LNEGFIX=.TRUE., +YCHEM_NL(34)%IGRIBTC=218034, +YCHEM_NL(34)%IGRIBDV=221034, +YCHEM_NL(34)%HENRYA=1.2e+4, +YCHEM_NL(34)%HENRYB=6900.0, +YCHEM_NL(34)%LMASSFIX=.TRUE., +YCHEM_NL(34)%BETAMFBC=-999.9, +YCHEM_NL(34)%LASSIM=.FALSE., +YCHEM_NL(35)%CNAME='C2O3', +YCHEM_NL(35)%NREQIN=1, +YCHEM_NL(35)%RMOLMASS=75.0, +YCHEM_NL(35)%IGRBCODE=217035, +YCHEM_NL(35)%LNEGFIX=.TRUE., +YCHEM_NL(35)%IGRIBTC=218035, +YCHEM_NL(35)%LMASSFIX=.FALSE., +YCHEM_NL(35)%LADV=.FALSE., +YCHEM_NL(35)%LASSIM=.FALSE., +YCHEM_NL(36)%CNAME='ROR', +YCHEM_NL(36)%NREQIN=1, +YCHEM_NL(36)%RMOLMASS=28.0, +YCHEM_NL(36)%IGRBCODE=217036, +YCHEM_NL(36)%LNEGFIX=.TRUE., +YCHEM_NL(36)%IGRIBTC=218036, +YCHEM_NL(36)%LMASSFIX=.FALSE., +YCHEM_NL(36)%LADV=.FALSE., +YCHEM_NL(36)%LASSIM=.FALSE., +YCHEM_NL(37)%CNAME='RXPAR', +YCHEM_NL(37)%NREQIN=1, +YCHEM_NL(37)%RMOLMASS=12.0, +YCHEM_NL(37)%IGRBCODE=217037, +YCHEM_NL(37)%LNEGFIX=.TRUE., +YCHEM_NL(37)%IGRIBTC=218037, +YCHEM_NL(37)%LMASSFIX=.FALSE., +YCHEM_NL(37)%LADV=.FALSE., +YCHEM_NL(37)%LASSIM=.FALSE., +YCHEM_NL(38)%CNAME='XO2', +YCHEM_NL(38)%NREQIN=1, +YCHEM_NL(38)%RMOLMASS=44.0, +YCHEM_NL(38)%IGRBCODE=217038, +YCHEM_NL(38)%LNEGFIX=.TRUE., +YCHEM_NL(38)%IGRIBTC=218038, +YCHEM_NL(38)%LMASSFIX=.FALSE., +YCHEM_NL(38)%LADV=.FALSE., +YCHEM_NL(38)%LASSIM=.FALSE., +YCHEM_NL(39)%CNAME='XO2N', +YCHEM_NL(39)%NREQIN=1, +YCHEM_NL(39)%RMOLMASS=44.0, +YCHEM_NL(39)%IGRBCODE=217039, +YCHEM_NL(39)%LNEGFIX=.TRUE., +YCHEM_NL(39)%IGRIBTC=218039, +YCHEM_NL(39)%LMASSFIX=.FALSE., +YCHEM_NL(39)%LADV=.FALSE., +YCHEM_NL(39)%LASSIM=.FALSE., +YCHEM_NL(40)%CNAME='NH2', +YCHEM_NL(40)%NREQIN=1, +YCHEM_NL(40)%RMOLMASS=16.0, +YCHEM_NL(40)%IGRBCODE=217040, +YCHEM_NL(40)%LNEGFIX=.TRUE., +YCHEM_NL(40)%IGRIBTC=218040, +YCHEM_NL(40)%LMASSFIX=.FALSE., +YCHEM_NL(40)%LADV=.FALSE., +YCHEM_NL(40)%LASSIM=.FALSE., +YCHEM_NL(41)%CNAME='PSC', +YCHEM_NL(41)%NREQIN=0, +YCHEM_NL(41)%RMOLMASS=1.0, +YCHEM_NL(41)%IGRBCODE=217041, +YCHEM_NL(41)%LNEGFIX=.TRUE., +YCHEM_NL(41)%IGRIBTC=218041, +YCHEM_NL(41)%LMASSFIX=.TRUE., +YCHEM_NL(41)%BETAMFBC=-999.9, +YCHEM_NL(41)%LMASSFIX=.FALSE., +YCHEM_NL(41)%REFVALI=0.0, +YCHEM_NL(41)%NREQIN=-1, +YCHEM_NL(41)%LADV=.FALSE., +YCHEM_NL(41)%LASSIM=.FALSE., +YCHEM_NL(42)%CNAME='CH3OH', +YCHEM_NL(42)%NREQIN=1, +YCHEM_NL(42)%RMOLMASS=31.01, +YCHEM_NL(42)%IGRBCODE=217042, +YCHEM_NL(42)%LNEGFIX=.TRUE., +YCHEM_NL(42)%IGRIBTC=218042, +YCHEM_NL(42)%IGRIBDV=221042, +YCHEM_NL(42)%HENRYA=200.0, +YCHEM_NL(42)%HENRYB=5600.0, +YCHEM_NL(42)%LMASSFIX=.TRUE., +YCHEM_NL(42)%BETAMFBC=-999.9, +YCHEM_NL(42)%LASSIM=.FALSE., +YCHEM_NL(43)%CNAME='HCOOH', +YCHEM_NL(43)%NREQIN=1, +YCHEM_NL(43)%RMOLMASS=46.01, +YCHEM_NL(43)%IGRBCODE=217043, +YCHEM_NL(43)%LNEGFIX=.TRUE., +YCHEM_NL(43)%IGRIBTC=218043, +YCHEM_NL(43)%IGRIBDV=221043, +YCHEM_NL(43)%HENRYA=8.8e3, +YCHEM_NL(43)%HENRYB=6100.0, +YCHEM_NL(43)%LMASSFIX=.TRUE., +YCHEM_NL(43)%BETAMFBC=-999.9, +YCHEM_NL(43)%LASSIM=.FALSE., +YCHEM_NL(44)%CNAME='MCOOH', +YCHEM_NL(44)%NREQIN=1, +YCHEM_NL(44)%RMOLMASS=62.02, +YCHEM_NL(44)%IGRBCODE=217044, +YCHEM_NL(44)%LNEGFIX=.TRUE., +YCHEM_NL(44)%IGRIBTC=218044, +YCHEM_NL(44)%IGRIBDV=221044, +YCHEM_NL(44)%HENRYA=4.1e3, +YCHEM_NL(44)%HENRYB=6300.0, +YCHEM_NL(44)%LMASSFIX=.TRUE., +YCHEM_NL(44)%BETAMFBC=-999.9, +YCHEM_NL(44)%LASSIM=.FALSE., +YCHEM_NL(45)%CNAME='C2H6', +YCHEM_NL(45)%NREQIN=1, +YCHEM_NL(45)%RMOLMASS=30.02, +YCHEM_NL(45)%IGRBCODE=217045, +YCHEM_NL(45)%LNEGFIX=.TRUE., +YCHEM_NL(45)%IGRIBTC=218045, +YCHEM_NL(45)%IGRIBDV=221045, +YCHEM_NL(45)%HENRYA=1.9e-3, +YCHEM_NL(45)%HENRYB=2400.0, +YCHEM_NL(45)%LMASSFIX=.TRUE., +YCHEM_NL(45)%BETAMFBC=-999.9, +YCHEM_NL(45)%LASSIM=.FALSE., +YCHEM_NL(46)%CNAME='C2H5OH', +YCHEM_NL(46)%NREQIN=1, +YCHEM_NL(46)%RMOLMASS=46.02, +YCHEM_NL(46)%IGRBCODE=217046, +YCHEM_NL(46)%LNEGFIX=.TRUE., +YCHEM_NL(46)%IGRIBTC=218046, +YCHEM_NL(46)%IGRIBDV=221046, +YCHEM_NL(46)%HENRYA=190.0, +YCHEM_NL(46)%HENRYB=6400.0, +YCHEM_NL(46)%LMASSFIX=.TRUE., +YCHEM_NL(46)%BETAMFBC=-999.9, +YCHEM_NL(46)%LASSIM=.FALSE., +YCHEM_NL(47)%CNAME='C3H8', +YCHEM_NL(47)%NREQIN=1, +YCHEM_NL(47)%RMOLMASS=44.03, +YCHEM_NL(47)%IGRBCODE=217047, +YCHEM_NL(47)%LNEGFIX=.TRUE., +YCHEM_NL(47)%IGRIBTC=218047, +YCHEM_NL(47)%LMASSFIX=.TRUE., +YCHEM_NL(47)%BETAMFBC=-999.9, +YCHEM_NL(47)%LASSIM=.FALSE., +YCHEM_NL(48)%CNAME='C3H6', +YCHEM_NL(48)%NREQIN=1, +YCHEM_NL(48)%RMOLMASS=42.03, +YCHEM_NL(48)%IGRBCODE=217048, +YCHEM_NL(48)%LNEGFIX=.TRUE., +YCHEM_NL(48)%IGRIBTC=218048, +YCHEM_NL(48)%LMASSFIX=.TRUE., +YCHEM_NL(48)%BETAMFBC=-999.9, +YCHEM_NL(48)%LASSIM=.FALSE., +YCHEM_NL(49)%CNAME='C10H16', +YCHEM_NL(49)%NREQIN=1, +YCHEM_NL(49)%RMOLMASS=136.0, +YCHEM_NL(49)%IGRBCODE=217049, +YCHEM_NL(49)%LNEGFIX=.TRUE., +YCHEM_NL(49)%IGRIBTC=218049, +YCHEM_NL(49)%LMASSFIX=.TRUE., +YCHEM_NL(49)%BETAMFBC=-999.9, +YCHEM_NL(49)%LASSIM=.FALSE., +YCHEM_NL(50)%CNAME='ISPD', +YCHEM_NL(50)%NREQIN=1, +YCHEM_NL(50)%RMOLMASS=70.0, +YCHEM_NL(50)%IGRBCODE=217050, +YCHEM_NL(50)%LNEGFIX=.TRUE., +YCHEM_NL(50)%IGRIBTC=218050, +YCHEM_NL(50)%IGRIBDV=221050, +YCHEM_NL(50)%HENRYA=4.3, +YCHEM_NL(50)%HENRYB=5300.0, +YCHEM_NL(50)%LMASSFIX=.TRUE., +YCHEM_NL(50)%BETAMFBC=-999.9, +YCHEM_NL(50)%LASSIM=.FALSE., +YCHEM_NL(51)%CNAME='NO3_A', +YCHEM_NL(51)%NREQIN=1, +YCHEM_NL(51)%RMOLMASS=62.0, +YCHEM_NL(51)%IGRBCODE=217051, +YCHEM_NL(51)%LNEGFIX=.TRUE., +YCHEM_NL(51)%IGRIBTC=218051, +YCHEM_NL(51)%IGRIBDV=221051, +YCHEM_NL(51)%HENRYA=3.2e11, +YCHEM_NL(51)%HENRYB=8700.0, +YCHEM_NL(51)%LMASSFIX=.TRUE., +YCHEM_NL(51)%BETAMFBC=-999.9, +YCHEM_NL(51)%LASSIM=.FALSE., +YCHEM_NL(52)%CNAME='CH3COCH3', +YCHEM_NL(52)%NREQIN=0, +YCHEM_NL(52)%RMOLMASS=58.0, +YCHEM_NL(52)%IGRBCODE=217052, +YCHEM_NL(52)%LNEGFIX=.TRUE., +YCHEM_NL(52)%IGRIBTC=218052, +YCHEM_NL(52)%IGRIBDV=221052, +YCHEM_NL(52)%HENRYA=27.0, +YCHEM_NL(52)%HENRYB=5500.0, +YCHEM_NL(52)%LMASSFIX=.TRUE., +YCHEM_NL(52)%BETAMFBC=-999.9, +YCHEM_NL(52)%LASSIM=.FALSE., +YCHEM_NL(53)%CNAME='ACO2', +YCHEM_NL(53)%NREQIN=0, +YCHEM_NL(53)%RMOLMASS=58.0, +YCHEM_NL(53)%IGRBCODE=217053, +YCHEM_NL(53)%LNEGFIX=.TRUE., +YCHEM_NL(53)%IGRIBTC=218053, +YCHEM_NL(53)%LMASSFIX=.FALSE., +YCHEM_NL(53)%LADV=.FALSE., +YCHEM_NL(53)%LASSIM=.FALSE., +YCHEM_NL(54)%CNAME='IC3H7O2', +YCHEM_NL(54)%NREQIN=0, +YCHEM_NL(54)%RMOLMASS=75.0, +YCHEM_NL(54)%IGRBCODE=217054, +YCHEM_NL(54)%LNEGFIX=.TRUE., +YCHEM_NL(54)%IGRIBTC=218054, +YCHEM_NL(54)%LMASSFIX=.FALSE., +YCHEM_NL(54)%LADV=.FALSE., +YCHEM_NL(54)%LASSIM=.FALSE., +YCHEM_NL(55)%CNAME='HYPROPO2', +YCHEM_NL(55)%NREQIN=0, +YCHEM_NL(55)%RMOLMASS=91.0, +YCHEM_NL(55)%IGRBCODE=217055, +YCHEM_NL(55)%LNEGFIX=.TRUE., +YCHEM_NL(55)%IGRIBTC=218055, +YCHEM_NL(55)%LMASSFIX=.FALSE., +YCHEM_NL(55)%LADV=.FALSE., +YCHEM_NL(55)%LASSIM=.FALSE., +YCHEM_NL(56)%CNAME='SO3', +YCHEM_NL(56)%NREQIN=0, +YCHEM_NL(56)%RMOLMASS=80.0, +YCHEM_NL(56)%IGRBCODE=217189, +YCHEM_NL(56)%LNEGFIX=.TRUE., +YCHEM_NL(56)%IGRIBTC=218189, +YCHEM_NL(56)%LMASSFIX=.TRUE., +YCHEM_NL(56)%BETAMFBC=-999.9, +YCHEM_NL(56)%LASSIM=.FALSE., +YCHEM_NL(57)%CNAME='NOXA', +YCHEM_NL(57)%NREQIN=0, +YCHEM_NL(57)%RMOLMASS=46.0, +YCHEM_NL(57)%IGRBCODE=217056, +YCHEM_NL(57)%LNEGFIX=.TRUE., +YCHEM_NL(57)%IGRIBTC=218056, +YCHEM_NL(57)%LMASSFIX=.TRUE., +YCHEM_NL(57)%BETAMFBC=-999.9, +YCHEM_NL(57)%LASSIM=.FALSE., +NGFL_EXT=4, +YEXT_NL(1)%CNAME='EMILI', +YEXT_NL(1)%NREQIN=0, +YEXT_NL(1)%IGRBCODE=212254, +YEXT_NL(1)%LADV=.FALSE., +YEXT_NL(1)%LGP=.TRUE., +YEXT_NL(1)%LGPINGP=.TRUE., +YEXT_NL(2)%CNAME='DDVEL', +YEXT_NL(2)%NREQIN=0, +YEXT_NL(2)%IGRBCODE=212250, +YEXT_NL(2)%LADV=.FALSE., +YEXT_NL(2)%LGP=.TRUE., +YEXT_NL(2)%LGPINGP=.TRUE., +YEXT_NL(3)%CNAME='DDFLXA', +YEXT_NL(3)%NREQIN=0, +YEXT_NL(3)%IGRBCODE=212251, +YEXT_NL(3)%LADV=.FALSE., +YEXT_NL(3)%LGP=.TRUE., +YEXT_NL(3)%LGPINGP=.TRUE., +YEXT_NL(4)%CNAME='WDFLXA', +YEXT_NL(4)%NREQIN=0, +YEXT_NL(4)%IGRBCODE=212252, +YEXT_NL(4)%LADV=.FALSE., +YEXT_NL(4)%LGP=.TRUE., +YEXT_NL(4)%LGPINGP=.TRUE., +EOF diff --git a/ifs-test/tests/t255/common/aer/aer_compoemis.nml b/ifs-test/tests/t255/common/aer/aer_compoemis.nml new file mode 100644 index 00000000..d3778767 --- /dev/null +++ b/ifs-test/tests/t255/common/aer/aer_compoemis.nml @@ -0,0 +1,51 @@ +cat >> fort.4 << EOF + +&NAMCOMPO_EMIS THIS%SPECIES='ALD2', THIS%SECTOR='All', THIS%PARAMID=219012, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.25, THIS%LEGACY_CHEM_OVERRIDE=3 / +&NAMCOMPO_EMIS THIS%SPECIES='Black-carbon_A', THIS%SECTOR='Biogenic/biofuel', THIS%PARAMID=210031, THIS%SCALING=0.2, THIS%DIURNAL_CYCLE_TYPE='AnthroCO' / +&NAMCOMPO_EMIS THIS%SPECIES='Black-carbon_A', THIS%SECTOR='Biomass-burning', THIS%PARAMID=210040, THIS%SCALING=0.2, THIS%DIURNAL_CYCLE_TYPE='GFAS', THIS%DIURNAL_PEAK_HOUR=13.5, THIS%DIURNAL_BASELINE=0.2, THIS%VERTICAL_PROFILE_TYPE='GFAS', THIS%VERTICAL_PARAMID=210119 / +&NAMCOMPO_EMIS THIS%SPECIES='Black-carbon_A', THIS%SECTOR='Fossil-fuel', THIS%PARAMID=210032, THIS%SCALING=0.2 / +&NAMCOMPO_EMIS THIS%SPECIES='Black-carbon_B', THIS%SECTOR='Biogenic/biofuel', THIS%PARAMID=210031, THIS%SCALING=0.8, THIS%DIURNAL_CYCLE_TYPE='AnthroCO' / +&NAMCOMPO_EMIS THIS%SPECIES='Black-carbon_B', THIS%SECTOR='Biomass-burning', THIS%PARAMID=210040, THIS%SCALING=0.8, THIS%DIURNAL_CYCLE_TYPE='GFAS', THIS%DIURNAL_PEAK_HOUR=13.5, THIS%DIURNAL_BASELINE=0.2, THIS%VERTICAL_PROFILE_TYPE='GFAS', THIS%VERTICAL_PARAMID=210119 / +&NAMCOMPO_EMIS THIS%SPECIES='Black-carbon_B', THIS%SECTOR='Fossil-fuel', THIS%PARAMID=210032, THIS%SCALING=0.8 / +&NAMCOMPO_EMIS THIS%SPECIES='C10H16', THIS%SECTOR='All', THIS%PARAMID=219049, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.65, THIS%LEGACY_CHEM_OVERRIDE=1 / +&NAMCOMPO_EMIS THIS%SPECIES='C2H4', THIS%SECTOR='All', THIS%PARAMID=219010, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.25, THIS%LEGACY_CHEM_OVERRIDE=1 / +&NAMCOMPO_EMIS THIS%SPECIES='C2H5OH', THIS%SECTOR='All', THIS%PARAMID=219046, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.25, THIS%LEGACY_CHEM_OVERRIDE=1 / +&NAMCOMPO_EMIS THIS%SPECIES='C2H6', THIS%SECTOR='All', THIS%PARAMID=219045, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.65, THIS%LEGACY_CHEM_OVERRIDE=3 / +&NAMCOMPO_EMIS THIS%SPECIES='C3H6', THIS%SECTOR='All', THIS%PARAMID=219048, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.65, THIS%LEGACY_CHEM_OVERRIDE=3 / +&NAMCOMPO_EMIS THIS%SPECIES='C3H8', THIS%SECTOR='All', THIS%PARAMID=219047, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.65, THIS%LEGACY_CHEM_OVERRIDE=3 / +&NAMCOMPO_EMIS THIS%SPECIES='C5H8', THIS%SECTOR='All', THIS%PARAMID=219016, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.0, THIS%LEGACY_CHEM_OVERRIDE=1 / +&NAMCOMPO_EMIS THIS%SPECIES='CH2O', THIS%SECTOR='All', THIS%PARAMID=219008, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.25, THIS%LEGACY_CHEM_OVERRIDE=3 / +&NAMCOMPO_EMIS THIS%SPECIES='CH3COCH3', THIS%SECTOR='All', THIS%PARAMID=219052, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.65, THIS%LEGACY_CHEM_OVERRIDE=1 / +&NAMCOMPO_EMIS THIS%SPECIES='CH3COCHO', THIS%SECTOR='All', THIS%PARAMID=219023, THIS%LEGACY_CHEM_OVERRIDE=1 / +&NAMCOMPO_EMIS THIS%SPECIES='CH3OH', THIS%SECTOR='All', THIS%PARAMID=219042, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.25, THIS%LEGACY_CHEM_OVERRIDE=3 / +&NAMCOMPO_EMIS THIS%SPECIES='CH4_GHG', THIS%SECTOR='AllButBiomassBur', THIS%PARAMID=210070, THIS%SCALING=-1.0 / +&NAMCOMPO_EMIS THIS%SPECIES='CH4_GHG', THIS%SECTOR='Biomass-burning', THIS%PARAMID=210082, THIS%DIURNAL_CYCLE_TYPE='GFAS', THIS%DIURNAL_PEAK_HOUR=13.5, THIS%DIURNAL_BASELINE=0.2 / +&NAMCOMPO_EMIS THIS%SPECIES='CO', THIS%SECTOR='All', THIS%PARAMID=219005, THIS%DIURNAL_CYCLE_TYPE='AnthroCO', THIS%LEGACY_CHEM_OVERRIDE=11 / +&NAMCOMPO_EMIS THIS%SPECIES='CO2_GHG', THIS%SECTOR='Anthropogenic', THIS%PARAMID=210069, THIS%SCALING=-1.0 / +&NAMCOMPO_EMIS THIS%SPECIES='CO2_GHG', THIS%SECTOR='Aviation', THIS%PARAMID=212253, THIS%VERTICAL_PROFILE_TYPE='3D' / +&NAMCOMPO_EMIS THIS%SPECIES='CO2_GHG', THIS%SECTOR='Biomass-burning', THIS%PARAMID=210080, THIS%DIURNAL_CYCLE_TYPE='GFAS', THIS%DIURNAL_PEAK_HOUR=13.5, THIS%DIURNAL_BASELINE=0.2 / +&NAMCOMPO_EMIS THIS%SPECIES='CO2_GHG', THIS%SECTOR='Ocean', THIS%PARAMID=210067, THIS%SCALING=-1.0 / +&NAMCOMPO_EMIS THIS%SPECIES='DMS', THIS%SECTOR='All', THIS%PARAMID=219018, THIS%LEGACY_CHEM_OVERRIDE=3 / +&NAMCOMPO_EMIS THIS%SPECIES='HCOOH', THIS%SECTOR='All', THIS%PARAMID=219043, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.25, THIS%LEGACY_CHEM_OVERRIDE=1 / +&NAMCOMPO_EMIS THIS%SPECIES='ISPD', THIS%SECTOR='All', THIS%PARAMID=219050, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.65, THIS%LEGACY_CHEM_OVERRIDE=1 / +&NAMCOMPO_EMIS THIS%SPECIES='MCOOH', THIS%SECTOR='All', THIS%PARAMID=219044, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.25, THIS%LEGACY_CHEM_OVERRIDE=1 / +&NAMCOMPO_EMIS THIS%SPECIES='NH3', THIS%SECTOR='All', THIS%PARAMID=219019, THIS%DIURNAL_CYCLE_TYPE='CAMS_GLOB_AGS', THIS%LEGACY_CHEM_OVERRIDE=3 / +&NAMCOMPO_EMIS THIS%SPECIES='NO', THIS%SECTOR='AllButAviation', THIS%PARAMID=219027, THIS%DIURNAL_CYCLE_TYPE='AnthroNOx', THIS%LEGACY_CHEM_OVERRIDE=11 / +&NAMCOMPO_EMIS THIS%SPECIES='NO2', THIS%SECTOR='Aviation', THIS%PARAMID=212255, THIS%SCALING=1.5333333333333333333, THIS%VERTICAL_PROFILE_TYPE='3D' / +&NAMCOMPO_EMIS THIS%SPECIES='OLE', THIS%SECTOR='All', THIS%PARAMID=219011, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.65, THIS%LEGACY_CHEM_OVERRIDE=3 / +&NAMCOMPO_EMIS THIS%SPECIES='Organic-matter_A', THIS%SECTOR='AnthroSecondary', THIS%PARAMID=216007, THIS%SCALING=0.5, THIS%DIURNAL_CYCLE_TYPE='GFAS', THIS%DIURNAL_PEAK_HOUR=12.0, THIS%DIURNAL_BASELINE=0.2 / +&NAMCOMPO_EMIS THIS%SPECIES='Organic-matter_A', THIS%SECTOR='Biogenic/biofuel', THIS%PARAMID=210033, THIS%SCALING=0.5, THIS%DIURNAL_CYCLE_TYPE='AnthroCO' / +&NAMCOMPO_EMIS THIS%SPECIES='Organic-matter_A', THIS%SECTOR='BiogenicSecondary', THIS%PARAMID=210039, THIS%SCALING=0.5 / +&NAMCOMPO_EMIS THIS%SPECIES='Organic-matter_A', THIS%SECTOR='Biomass-burning', THIS%PARAMID=210041, THIS%SCALING=0.5, THIS%DIURNAL_CYCLE_TYPE='GFAS', THIS%DIURNAL_PEAK_HOUR=13.5, THIS%DIURNAL_BASELINE=0.2, THIS%VERTICAL_PROFILE_TYPE='GFAS', THIS%VERTICAL_PARAMID=210119, THIS%LEGACY_CHEM_OVERRIDE=16 / +&NAMCOMPO_EMIS THIS%SPECIES='Organic-matter_A', THIS%SECTOR='Fossil-fuel', THIS%PARAMID=210034, THIS%SCALING=0.5 / +&NAMCOMPO_EMIS THIS%SPECIES='Organic-matter_B', THIS%SECTOR='AnthroSecondary', THIS%PARAMID=216007, THIS%SCALING=0.5, THIS%DIURNAL_CYCLE_TYPE='GFAS', THIS%DIURNAL_PEAK_HOUR=12.0, THIS%DIURNAL_BASELINE=0.2 / +&NAMCOMPO_EMIS THIS%SPECIES='Organic-matter_B', THIS%SECTOR='Biogenic/biofuel', THIS%PARAMID=210033, THIS%SCALING=0.5, THIS%DIURNAL_CYCLE_TYPE='AnthroCO' / +&NAMCOMPO_EMIS THIS%SPECIES='Organic-matter_B', THIS%SECTOR='BiogenicSecondary', THIS%PARAMID=210039, THIS%SCALING=0.5 / +&NAMCOMPO_EMIS THIS%SPECIES='Organic-matter_B', THIS%SECTOR='Biomass-burning', THIS%PARAMID=210041, THIS%SCALING=0.5, THIS%DIURNAL_CYCLE_TYPE='GFAS', THIS%DIURNAL_PEAK_HOUR=13.5, THIS%DIURNAL_BASELINE=0.2, THIS%VERTICAL_PROFILE_TYPE='GFAS', THIS%VERTICAL_PARAMID=210119 / +&NAMCOMPO_EMIS THIS%SPECIES='Organic-matter_B', THIS%SECTOR='Fossil-fuel', THIS%PARAMID=210034, THIS%SCALING=0.5 / +&NAMCOMPO_EMIS THIS%SPECIES='PAR', THIS%SECTOR='All', THIS%PARAMID=219009, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.65, THIS%LEGACY_CHEM_OVERRIDE=3 / +&NAMCOMPO_EMIS THIS%SPECIES='Rn', THIS%SECTOR='All', THIS%PARAMID=219025, THIS%LEGACY_CHEM_OVERRIDE=1 / +&NAMCOMPO_EMIS THIS%SPECIES='SO2', THIS%SECTOR='All', THIS%PARAMID=219017, THIS%DIURNAL_CYCLE_TYPE='CAMS_GLOB_ENE', THIS%VERTICAL_PROFILE_TYPE="AltitudeMap", THIS%VERTICAL_PARAMID=216045, THIS%VERTICAL_BASE_LEVEL=-1, THIS%VERTICAL_TOP_LEVEL=-4, THIS%VERTICAL_THRESHOLD=200, THIS%LEGACY_CHEM_OVERRIDE=11 / +&NAMCOMPO_EMIS / + +EOF diff --git a/ifs-test/tests/t255/common/aer/aer_yaerodesc.nml b/ifs-test/tests/t255/common/aer/aer_yaerodesc.nml new file mode 100644 index 00000000..f14cf4ce --- /dev/null +++ b/ifs-test/tests/t255/common/aer/aer_yaerodesc.nml @@ -0,0 +1,163 @@ +cat >> fort.4 << EOF +NTYPAER=3,3,2,2,1,2,1,2,0,0, +YAERO_DESC(1)%IGRIBDIAG=215001,215004,215007,215010,215013,215016,215022,215019, +YAERO_DESC(1)%RDDEPVSEA=1.1000E-02, +YAERO_DESC(1)%RDDEPVLIC=1.1000E-02, +YAERO_DESC(1)%RSEDIMV=2.4000E-05, +YAERO_DESC(1)%RSCAVIN=0.9, +YAERO_DESC(1)%RSCAVBCR=0.001, +YAERO_DESC(1)%RSCAVBCS=0.005, +YAERO_DESC(1)%COPTCLASS='SeaSaltSmall', +YAERO_DESC(1)%CHYGCLASS='SeaSalt', +YAERO_DESC(1)%IAEROCV=1, +YAERO_DESC(2)%IGRIBDIAG=215002,215005,215008,215011,215014,215017,215023,215020, +YAERO_DESC(2)%RDDEPVSEA=1.1500E-02, +YAERO_DESC(2)%RDDEPVLIC=1.2000E-02, +YAERO_DESC(2)%RSEDIMV=1.9500E-03, +YAERO_DESC(2)%RSCAVIN=0.9, +YAERO_DESC(2)%RSCAVBCR=0.001, +YAERO_DESC(2)%RSCAVBCS=0.005, +YAERO_DESC(2)%COPTCLASS='SeaSaltMedium', +YAERO_DESC(2)%CHYGCLASS='SeaSalt', +YAERO_DESC(2)%IAEROCV=2, +YAERO_DESC(3)%IGRIBDIAG=215003,215006,215009,215012,215015,215018,215024,215021, +YAERO_DESC(3)%RDDEPVSEA=1.2000E-02, +YAERO_DESC(3)%RDDEPVLIC=1.5000E-02, +YAERO_DESC(3)%RSEDIMV=1.8000E-02, +YAERO_DESC(3)%RSCAVIN=0.9, +YAERO_DESC(3)%RSCAVBCR=0.1, +YAERO_DESC(3)%RSCAVBCS=0.005, +YAERO_DESC(3)%COPTCLASS='SeaSaltLarge', +YAERO_DESC(3)%CHYGCLASS='SeaSalt', +YAERO_DESC(3)%IAEROCV=2, +YAERO_DESC(4)%IGRIBDIAG=215025,215028,215031,215034,215037,215040,215046,215043, +YAERO_DESC(4)%RDDEPVSEA=2.0000E-04, +YAERO_DESC(4)%RDDEPVLIC=2.0000E-04, +YAERO_DESC(4)%RSEDIMV=6.9040E-05, +YAERO_DESC(4)%RSCAVIN=0.7, +YAERO_DESC(4)%RSCAVBCR=0.001, +YAERO_DESC(4)%RSCAVBCS=0.005, +YAERO_DESC(4)%COPTCLASS='DustSmall', +YAERO_DESC(4)%CHYGCLASS='Dust', +YAERO_DESC(4)%IAEROCV=1, +YAERO_DESC(5)%IGRIBDIAG=215026,215029,215032,215035,215038,215041,215047,215044, +YAERO_DESC(5)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(5)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(5)%RSEDIMV=1.9820E-04, +YAERO_DESC(5)%RSCAVIN=0.7, +YAERO_DESC(5)%RSCAVBCR=0.001, +YAERO_DESC(5)%RSCAVBCS=0.005, +YAERO_DESC(5)%COPTCLASS='DustMedium', +YAERO_DESC(5)%CHYGCLASS='Dust', +YAERO_DESC(5)%IAEROCV=2, +YAERO_DESC(6)%IGRIBDIAG=215027,215030,215033,215036,215039,215042,215048,215045, +YAERO_DESC(6)%RDDEPVSEA=1.2000E-02, +YAERO_DESC(6)%RDDEPVLIC=1.2000E-02, +YAERO_DESC(6)%RSEDIMV=1.9620E-03, +YAERO_DESC(6)%RSCAVIN=0.7, +YAERO_DESC(6)%RSCAVBCR=0.1, +YAERO_DESC(6)%RSCAVBCS=0.005, +YAERO_DESC(6)%COPTCLASS='DustLarge', +YAERO_DESC(6)%CHYGCLASS='Dust', +YAERO_DESC(6)%IAEROCV=2, +YAERO_DESC(7)%IGRIBDIAG=215050,215052,215054,215056,215058,215060,215064,215062, +YAERO_DESC(7)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(7)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(7)%RSEDIMV=2.0000E-04, +YAERO_DESC(7)%RSCAVIN=0.7, +YAERO_DESC(7)%RSCAVBCR=0.0001, +YAERO_DESC(7)%RSCAVBCS=0.005, +YAERO_DESC(7)%COPTCLASS='OrganicMatter', +YAERO_DESC(7)%CHYGCLASS='OrganicMatter', +YAERO_DESC(7)%IAEROCV=1, +YAERO_DESC(8)%IGRIBDIAG=215049,215051,215053,215055,215057,215059,215063,215061, +YAERO_DESC(8)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(8)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(8)%RSEDIMV=2.0000E-04, +YAERO_DESC(8)%RSCAVIN=0, +YAERO_DESC(8)%RSCAVBCR=0.0001, +YAERO_DESC(8)%RSCAVBCS=0.005, +YAERO_DESC(8)%COPTCLASS='OrganicMatter', +YAERO_DESC(8)%CHYGCLASS='Hydrophobic', +YAERO_DESC(8)%IAEROCV=1, +YAERO_DESC(9)%IGRIBDIAG=215066,215068,215070,215072,215074,215076,215080,215078, +YAERO_DESC(9)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(9)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(9)%RSEDIMV=2.0000E-04, +YAERO_DESC(9)%RSCAVIN=0.7, +YAERO_DESC(9)%RSCAVBCR=0.0001, +YAERO_DESC(9)%RSCAVBCS=0.005, +YAERO_DESC(9)%COPTCLASS='BlackCarbon', +YAERO_DESC(9)%CHYGCLASS='BlackCarbon', +YAERO_DESC(9)%IAEROCV=1, +YAERO_DESC(10)%IGRIBDIAG=215065,215067,215069,215071,215073,215075,215079,215077, +YAERO_DESC(10)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(10)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(10)%RSEDIMV=2.0000E-04, +YAERO_DESC(10)%RSCAVIN=0, +YAERO_DESC(10)%RSCAVBCR=0.0001, +YAERO_DESC(10)%RSCAVBCS=0.005, +YAERO_DESC(10)%COPTCLASS='BlackCarbon', +YAERO_DESC(10)%CHYGCLASS='Hydrophobic', +YAERO_DESC(10)%IAEROCV=1, +YAERO_DESC(11)%IGRIBDIAG=215081,215082,215083,215084,215085,215086,215088,215087, +YAERO_DESC(11)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(11)%RDDEPVLIC=2.5000E-03, +YAERO_DESC(11)%RSEDIMV=2.0000E-04, +YAERO_DESC(11)%RSCAVIN=0.7, +YAERO_DESC(11)%RSCAVBCR=0.0001, +YAERO_DESC(11)%RSCAVBCS=0.005, +YAERO_DESC(11)%COPTCLASS='Sulphate', +YAERO_DESC(11)%CHYGCLASS='Sulphate', +YAERO_DESC(11)%IAEROCV=1, +YAERO_DESC(12)%IGRIBDIAG=215189,215191,215193,215195,215197,215199,215203,215201, +YAERO_DESC(12)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(12)%RDDEPVLIC=1.5000E-03, +YAERO_DESC(12)%RSEDIMV=2.0000E-04, +YAERO_DESC(12)%RSCAVIN=0.8, +YAERO_DESC(12)%RSCAVBCR=0.0001, +YAERO_DESC(12)%RSCAVBCS=0.005, +YAERO_DESC(12)%COPTCLASS='NitrateFine', +YAERO_DESC(12)%CHYGCLASS='Nitrate', +YAERO_DESC(12)%IAEROCV=1, +YAERO_DESC(13)%IGRIBDIAG=215190,215192,215194,215196,215198,215200,215204,215202, +YAERO_DESC(13)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(13)%RDDEPVLIC=1.5000E-03, +YAERO_DESC(13)%RSEDIMV=1.3352E-03, +YAERO_DESC(13)%RSCAVIN=0.8, +YAERO_DESC(13)%RSCAVBCR=0.1, +YAERO_DESC(13)%RSCAVBCS=0.005, +YAERO_DESC(13)%COPTCLASS='NitrateCoarse', +YAERO_DESC(13)%CHYGCLASS='Nitrate', +YAERO_DESC(13)%IAEROCV=2, +YAERO_DESC(14)%IGRIBDIAG=215205,215206,215207,215208,215209,215210,216042,215211, +YAERO_DESC(14)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(14)%RDDEPVLIC=1.5000E-03, +YAERO_DESC(14)%RSEDIMV=2.0000E-04, +YAERO_DESC(14)%RSCAVIN=0.9, +YAERO_DESC(14)%RSCAVBCR=0.0001, +YAERO_DESC(14)%RSCAVBCS=0.005, +YAERO_DESC(14)%COPTCLASS='Ammonium', +YAERO_DESC(14)%CHYGCLASS='Ammonium', +YAERO_DESC(14)%IAEROCV=1, +YAERO_DESC(15)%IGRIBDIAG=215212,215213,215214,215215,215216,215217,216098,215218, +YAERO_DESC(15)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(15)%RDDEPVLIC=2.5000E-03, +YAERO_DESC(15)%RSEDIMV=2.4000E-04, +YAERO_DESC(15)%RSCAVIN=0.7, +YAERO_DESC(15)%RSCAVBCR=0.0001, +YAERO_DESC(15)%RSCAVBCS=0.005, +YAERO_DESC(15)%COPTCLASS='SecOrgBio', +YAERO_DESC(15)%CHYGCLASS='SecOrgBio', +YAERO_DESC(15)%IAEROCV=1, +YAERO_DESC(16)%IGRIBDIAG=215219,215220,215221,215222,215223,215224,216099,215225, +YAERO_DESC(16)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(16)%RDDEPVLIC=2.5000E-03, +YAERO_DESC(16)%RSEDIMV=2.4000E-04, +YAERO_DESC(16)%RSCAVIN=0.7, +YAERO_DESC(16)%RSCAVBCR=0.0001, +YAERO_DESC(16)%RSCAVBCS=0.005, +YAERO_DESC(16)%COPTCLASS='SecOrgAnth', +YAERO_DESC(16)%CHYGCLASS='SecOrgAnth', +YAERO_DESC(16)%IAEROCV=1, +EOF From d4bd083597b5a47b3a0adcf803713d87e321aa42 Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Wed, 10 Apr 2024 09:40:00 +0000 Subject: [PATCH 017/129] Pull request #2: Synch with Lianghai version - Identical AER output as release version - t255_test_compo_fc_m7 OIFS-513 setting LAER3D false to inhibit reading of 3d climatology OIFS-514 update the m7_aero.nml with current tracer names Squashed commit of the following: commit e924b4e38c8704213c040a0bb9fe6a751c8d1ee8 Merge: e7f2b64 600ba20 Author: Tommi Bergman Date: Tue Apr 9 08:01:34 2024 +0000 Merge branch 'add-m7-lh' of https://git.ecmwf.int/scm/~nm6/openifs-48r1 into add-m7-lh commit e7f2b64bae06ac9e3cd25b729f8bee0f568d6bfe Author: Tommi Bergman Date: Tue Apr 9 07:55:05 2024 +0000 OIFS-513 setting LAER3D false to inhibit reading of 3d climatology in t255_test_compo_fc_m7 commit 600ba20be555e74f42bb04bab8ba4f50db936d2e Merge: 0bb7fce 72f9be4 Author: Lianghai Wu Date: Tue Apr 9 07:04:57 2024 +0000 pull before merge commit 0bb7fce6e4e7316edbc3e98f05dfe1d247dd75a1 Author: Lianghai Wu Date: Tue Apr 9 07:02:33 2024 +0000 identical AER output as release version by restore ZAERFLX commit 72f9be4374f7d93fd56e0ca5dc4e56f2743bcde4 Author: Tommi Bergman Date: Mon Apr 8 11:29:36 2024 +0000 OIFS-514 update the m7_aero.nml with current tracer names. commit 5e4321fe6c49d9ac1239626739eeba8a178f1108 Author: Lianghai Wu Date: Fri Apr 5 13:55:43 2024 +0000 remove ZALBD(not used) and update inout features of YDMODEL commit a5c2116c922b3caa0e831ff2aacd065956f4936d Author: Lianghai Wu Date: Thu Apr 4 14:29:04 2024 +0000 merge with fixgnu for aerosol radiation commit 296279c455a446208b222555b82b6f4db57dc385 Author: Lianghai Wu Date: Thu Apr 4 09:15:42 2024 +0000 backup before merge fixgnu files commit b89cb24ce380e7e44076b9ea2d51afd3f20ba73e Author: Lianghai Wu Date: Thu Apr 4 07:46:02 2024 +0000 remove aerosol_ham and use aerosol for M7 optical properties commit 5fbb448210f6e11c60933172c622a3945832013d Author: Lianghai Wu Date: Wed Apr 3 11:16:07 2024 +0000 remove not needed tracers in aerini_layer commit d5bc7a5ec57df3d1556fb9e56b2fea552a44a4ae Author: Lianghai Wu Date: Wed Mar 27 14:39:03 2024 +0000 recover commented lines in aerini_layer commit a36b1d6be2bc15dfbe4b1d9c6b21ea375469ceaa Author: Lianghai Wu Date: Wed Mar 27 14:08:59 2024 +0000 inconsistent aer aerosol scheme simulation commit 36050b346c434c443473f60722752d0d0c76a2a0 Author: Lianghai Wu Date: Tue Mar 26 19:39:25 2024 +0000 add if statement for deallocate commit c61bbce6cd372ea310eab25c96eec03259448d1d Merge: 54d21aa b41f567 Author: Lianghai Wu Date: Thu Mar 7 14:11:09 2024 +0000 Merge remote-tracking branch 'pls/knmi-m7' into add-m7-lh commit 54d21aa4e529ef8fc692cc9eddb9e06dbf65928a Author: Lianghai Wu Date: Thu Mar 7 14:09:59 2024 +0000 conflicts commit b8d90421515197e8c0c615af58aba1323a771d1f Author: Lianghai Wu Date: Tue Mar 5 10:25:03 2024 +0000 running gnu version commit 31f5d573082435f18f276d9999eb4f7579210e5b Author: Philippe Le Sager Date: Wed Mar 6 15:25:58 2024 +0100 optimize array deallocation commit 3b603d9680057ec68e4576c55c0df6235b74a134 Author: Philippe Le Sager Date: Wed Mar 6 15:23:51 2024 +0100 first running version commit 20bea69ec002c897efa3933550e0406f2a791bed Author: Lianghai Wu Date: Fri Feb 9 09:45:17 2024 +0000 fix bugs in m7 and chem_tm5 when using zero emissions commit 4e1db52d9cf0f436924ca7860143f1700366f1fb Author: Philippe Le Sager Date: Wed Mar 6 15:11:51 2024 +0100 passing radting run but still many issues ... and 1 more commit --- .../intel/2021.4.0/hpcx-openmpi/2.9.0/env.sh | 1 + ifs-source/arpifs/chem/chem_tm5.F90 | 8 +- ifs-source/arpifs/chem/tm5_rbud.F90 | 1 - ifs-source/arpifs/control/cnt4.F90 | 1 + ifs-source/arpifs/module/parfpos.F90 | 1 + ifs-source/arpifs/module/yom_ygfl.F90 | 1 + ifs-source/arpifs/module/yomafn.F90 | 54 +++- ifs-source/arpifs/module/yomcompo.F90 | 1 + ifs-source/arpifs/module/yomphyder.F90 | 1 + ifs-source/arpifs/namelist/namcompo.nam.h | 2 +- ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 | 63 ++--- ifs-source/arpifs/phys_ec/aer_so2so4_v2.F90 | 2 +- ifs-source/arpifs/phys_ec/aer_src.F90 | 26 +- ifs-source/arpifs/phys_ec/aerini_layer.F90 | 89 +++---- ifs-source/arpifs/phys_ec/aero_init.F90 | 28 ++- ifs-source/arpifs/phys_ec/callpar.F90 | 2 +- ifs-source/arpifs/phys_ec/cloud_layer.F90 | 7 +- ifs-source/arpifs/phys_ec/ec_phys.F90 | 1 - ifs-source/arpifs/phys_ec/ec_phys_drv.F90 | 1 - ifs-source/arpifs/phys_ec/gems_init.F90 | 2 +- ifs-source/arpifs/phys_ec/hamm7_init.F90 | 9 + ifs-source/arpifs/phys_ec/hamm7_interface.F90 | 178 +++++++++----- .../arpifs/phys_ec/local_arrays_fin.F90 | 17 +- .../arpifs/phys_ec/local_arrays_ini.F90 | 7 +- ifs-source/arpifs/phys_ec/mo_ham_m7.F90 | 25 +- .../arpifs/phys_ec/mo_hammoz_wetdep.F90 | 72 ++++-- ifs-source/arpifs/phys_ec/su_aerw.F90 | 1 - ifs-source/arpifs/phys_ec/tm5m7_drydep.F90 | 4 +- ifs-source/arpifs/phys_ec/tm5m7_init.F90 | 18 +- .../phys_ec/tm5m7_optics_calculate_aop.F90 | 11 +- .../arpifs/phys_ec/tm5m7_optics_init.F90 | 4 +- ifs-source/arpifs/phys_ec/tm5m7_phy2.F90 | 46 ++-- ifs-source/arpifs/phys_ec/tm5m7_sediment.F90 | 4 +- ifs-source/arpifs/phys_ec/tm5m7_src.F90 | 45 ++-- ifs-source/arpifs/phys_ec/tm5m7_src_dust.F90 | 76 +++--- .../arpifs/phys_ec/tm5m7_src_dust_init.F90 | 11 +- ifs-source/arpifs/phys_ec/tm5m7_src_ss.F90 | 14 +- .../arpifs/phys_radi/ice_effective_radius.F90 | 2 +- ifs-source/arpifs/phys_radi/raddrv.F90 | 26 +- .../arpifs/phys_radi/radiation_scheme.F90 | 114 +++++---- ifs-source/arpifs/phys_radi/radintg.F90 | 138 ++++++----- ifs-source/arpifs/phys_radi/suecrad.F90 | 12 +- ifs-source/arpifs/setup/su_surf_flds.F90 | 15 +- ifs-source/arpifs/setup/sudefo_gflattr.F90 | 231 +++++++++++++++++- ifs-source/arpifs/setup/sugfl1.F90 | 8 +- ifs-source/arpifs/setup/sugfl2.F90 | 22 +- ifs-source/arpifs/setup/sugfl3.F90 | 28 ++- .../module/radiation_aerosol_optics.F90 | 36 +-- .../radiation/module/radiation_ifs_rrtm.F90 | 1 - .../radiation/module/radiation_interface.F90 | 57 ++--- ifs-test/tests/t21/test_compo_fc/params | 2 +- ifs-test/tests/t255/common/m7/m7_aero.nml | 135 +++++----- ifs-test/tests/t255/test_compo_fc_m7/setup | 2 +- 53 files changed, 1068 insertions(+), 595 deletions(-) diff --git a/arch/ecmwf/hpc2020/intel/2021.4.0/hpcx-openmpi/2.9.0/env.sh b/arch/ecmwf/hpc2020/intel/2021.4.0/hpcx-openmpi/2.9.0/env.sh index 63177301..2aa757fb 100755 --- a/arch/ecmwf/hpc2020/intel/2021.4.0/hpcx-openmpi/2.9.0/env.sh +++ b/arch/ecmwf/hpc2020/intel/2021.4.0/hpcx-openmpi/2.9.0/env.sh @@ -30,6 +30,7 @@ module_purge() { # Load modules module_load prgenv/intel module_load intel/2021.4.0 +#module_load intel/2023.2.0 module_load hpcx-openmpi/2.9.0 module_load intel-mkl/19.0.5 diff --git a/ifs-source/arpifs/chem/chem_tm5.F90 b/ifs-source/arpifs/chem/chem_tm5.F90 index 24b94280..58c1571c 100644 --- a/ifs-source/arpifs/chem/chem_tm5.F90 +++ b/ifs-source/arpifs/chem/chem_tm5.F90 @@ -495,7 +495,7 @@ SUBROUTINE CHEM_TM5& ! ITAU_MACC = 2_JPIM ! Use simple (but wrong) climatology for aerosol optical depth if no prognostic MACC aerosol is used IF ( LCHEM_AEROI ) THEN - IF (TRIM(AERO_SCHEME)=="aer" )THEN + IF (TRIM(AERO_SCHEME)=="aer" .OR. TRIM(AERO_SCHEME)=="hamm7")THEN ! * from MACC fields CALL TM5_MACC_AEROSOL(KIDIA,KFDIA,KLON,KLEV, KAERO, & & PRS1 , PAEROP , ZRHCL , & @@ -1096,9 +1096,13 @@ SUBROUTINE CHEM_TM5& ! Also the stratospheric nudging is included. This tendency output from this chem_tm5 module ! should be considered with great care, i.e. it is not well-defined. ! Change units from kg/kg/sec to sec-1. Loss term is positive. + !write(*,*) "PTENC1",PTENC1(:,:,ICH4) + !write(*,*) "PCEN(JL,JLEV,ICH4)",PCEN(:,:,ICH4) DO JLEV=1,KLEV DO JL=KIDIA,KFDIA - PCHEM2GHG(JL,JLEV,1) = - PTENC1(JL,JLEV,ICH4) / PCEN(JL,JLEV,ICH4) + IF(PCEN(JL,JLEV,ICH4)> 0._JPRB ) THEN + PCHEM2GHG(JL,JLEV,1) = - PTENC1(JL,JLEV,ICH4) / PCEN(JL,JLEV,ICH4) + ENDIF ENDDO ENDDO ! ENDIF diff --git a/ifs-source/arpifs/chem/tm5_rbud.F90 b/ifs-source/arpifs/chem/tm5_rbud.F90 index 2e56b162..4ec15de9 100644 --- a/ifs-source/arpifs/chem/tm5_rbud.F90 +++ b/ifs-source/arpifs/chem/tm5_rbud.F90 @@ -133,7 +133,6 @@ SUBROUTINE TM5_RBUD(YGFL,KIDIA, KFDIA, KLON, KLEV, KL, KOH, KNSTEP, PAIRD, PCR2, ENDIF ENDDO ENDDO - ! ! fill the BUD2D array with reaction budgets for O3 prod / loss ! (terms that are not yet provided above), or other interesting diff --git a/ifs-source/arpifs/control/cnt4.F90 b/ifs-source/arpifs/control/cnt4.F90 index 849322ac..ae748880 100644 --- a/ifs-source/arpifs/control/cnt4.F90 +++ b/ifs-source/arpifs/control/cnt4.F90 @@ -510,6 +510,7 @@ SUBROUTINE CNT4(YDGEOMETRY,YDFIELDS,YDMTRAJ,YDMODEL,YDJOT,YDVARBC,YDTCV,YDGOM5,Y ! Initialize aerosol indices (tm5m7 - if active) ! moving the CASE-clause that tests AERO_SCHEME from ! ./src/ifs/phys_ec/tm5m7_init.F90 here + IF (NAERO > 0 .AND. NCONF /= 131 ) THEN SELECT CASE (TRIM(AERO_SCHEME)) diff --git a/ifs-source/arpifs/module/parfpos.F90 b/ifs-source/arpifs/module/parfpos.F90 index 5375070c..43ce810e 100644 --- a/ifs-source/arpifs/module/parfpos.F90 +++ b/ifs-source/arpifs/module/parfpos.F90 @@ -88,6 +88,7 @@ MODULE PARFPOS INTEGER(KIND=JPIM), PARAMETER :: JPOSSCVA=6 INTEGER(KIND=JPIM), PARAMETER :: JPOSGHG=3 INTEGER(KIND=JPIM), PARAMETER :: JPOSGHGFLX=6 +INTEGER(KIND=JPIM), PARAMETER :: JPOSTRAC=10 INTEGER(KIND=JPIM), PARAMETER :: JPOSCHEM=150 INTEGER(KIND=JPIM), PARAMETER :: JPOSCHEMFLX=50 INTEGER(KIND=JPIM), PARAMETER :: JPOSAERO=50 diff --git a/ifs-source/arpifs/module/yom_ygfl.F90 b/ifs-source/arpifs/module/yom_ygfl.F90 index a7329fea..27462358 100644 --- a/ifs-source/arpifs/module/yom_ygfl.F90 +++ b/ifs-source/arpifs/module/yom_ygfl.F90 @@ -269,6 +269,7 @@ MODULE YOM_YGFL INTEGER(KIND=JPIM) :: NCHEM_FLXO INTEGER(KIND=JPIM) :: NCHEM_WDFLX INTEGER(KIND=JPIM) :: NCHEM_DDFLX +INTEGER(KIND=JPIM) :: NCHEM_FLX! ???? from 43r3 INTEGER(KIND=JPIM) :: NCHEM_DV INTEGER(KIND=JPIM) :: NCHEM_TC INTEGER(KIND=JPIM) :: NCHEM_SCV diff --git a/ifs-source/arpifs/module/yomafn.F90 b/ifs-source/arpifs/module/yomafn.F90 index 02038d64..fcafde17 100644 --- a/ifs-source/arpifs/module/yomafn.F90 +++ b/ifs-source/arpifs/module/yomafn.F90 @@ -13,7 +13,7 @@ MODULE YOMAFN USE PARKIND1, ONLY : JPIM USE PARFPOS, ONLY : JPOSDYN, JPOSSCVA, JPOSPHY, JPOSVX2, JPOSFSU, & - & JPOSAERO, JPOSGHG, JPOSCHEM, JPOSERA40, JPOSNOGW, JPOSCHEMFLX, & + & JPOSAERO, JPOSTRAC, JPOSGHG, JPOSCHEM, JPOSERA40, JPOSNOGW, JPOSCHEMFLX, & & JPOSAEROUT, JPOSAEROCLIM, JPOSUVP, JPOSSFX, JPOSEZDIAG, JPOSAERODIAG, & & JPOSAERAOT, JPOSAERLISI, JPOSAERO_WVL_DIAG, JPOSAERO_WVL_DIAG_TYPES, & & JPOSEDRP, JPOSEMIS2D, JPOSEMIS2DAUX, JPOSEMIS3D @@ -487,6 +487,58 @@ MODULE YOMAFN TYPE(FPDSPHY) :: EMIS2D(JPOSEMIS2D) ! 2D emission fluxes for composition TYPE(FPDSPHY) :: EMIS2DAUX(JPOSEMIS2DAUX) ! 2D emission auxiliary fields for composition +TYPE(FPDSPHY) :: SOILTYPE +!TYPE(FPDSPHY) :: BCBF +!TYPE(FPDSPHY) :: BCFF +!TYPE(FPDSPHY) :: BCGF +!TYPE(FPDSPHY) :: OMFF +!TYPE(FPDSPHY) :: OMBF +!TYPE(FPDSPHY) :: OMGF +!TYPE(FPDSPHY) :: SO2L +!TYPE(FPDSPHY) :: SO2H +!TYPE(FPDSPHY) :: SOGF +!TYPE(FPDSPHY) :: VOLC +!TYPE(FPDSPHY) :: VOLE +!TYPE(FPDSPHY) :: SOA +!TYPE(FPDSPHY) :: TRACFLX +!TYPE(FPDSPHY) :: CO2NBF +!TYPE(FPDSPHY) :: CO2OF +!TYPE(FPDSPHY) :: CO2APF +!TYPE(FPDSPHY) :: CO2FIRE +!TYPE(FPDSPHY) :: CH4AG +!TYPE(FPDSPHY) :: CH4F + + +TYPE(FPDSPHY) :: CO2NBF !CO2 surface flux - biosphere +TYPE(FPDSPHY) :: CO2OF !CO2 surface flux - ocean +TYPE(FPDSPHY) :: CO2APF !CO2 surface flux - anthropogenic emission +TYPE(FPDSPHY) :: CO2FIRE !CO2 surface flux - fire emissions +TYPE(FPDSPHY) :: CH4AG !CH4 surface fluxes - all sources aggregated except fire emissions +TYPE(FPDSPHY) :: CH4F !CH4 surface fluxes - fire emissions + + +TYPE(FPDSPHY) :: BCBF ! Black carbon biogenic flux (ECMWF) +TYPE(FPDSPHY) :: INJF ! Biomass burning emissions injection height (ECMWF) +TYPE(FPDSPHY) :: BCFF ! Black carbon fossil fuel flux (ECMWF) +TYPE(FPDSPHY) :: OMBF ! Organic matter biogenic flux (ECMWF) +TYPE(FPDSPHY) :: OMFF ! Organic matter fossil fuel flux (ECMWF) +TYPE(FPDSPHY) :: SO2L ! Sulphate low-level flux (ECMWF) +TYPE(FPDSPHY) :: SO2H ! Sulphate high-level flux (ECMWF) +TYPE(FPDSPHY) :: VOLC ! Volcanic continuous flux (ECMWF) +TYPE(FPDSPHY) :: VOLE ! Volcanic explosive flux (ECMWF) +TYPE(FPDSPHY) :: SOA ! Secondary organic components flux (ECMWF) +TYPE(FPDSPHY) :: SOACO ! SOA from CO (ECMWF) +TYPE(FPDSPHY) :: BCGF ! Black carbon GFED flux (ECMWF) +TYPE(FPDSPHY) :: ODTO ! Optical depth total aerosols (ECMWF) +TYPE(FPDSPHY) :: ODTO469 ! Optical depth total aerosols @ 469 nm (ECMWF) +TYPE(FPDSPHY) :: ODTO670 ! Optical depth total aerosols @ 670 nm (ECMWF) +TYPE(FPDSPHY) :: ODTO865 ! Optical depth total aerosols @ 865 nm (ECMWF) +TYPE(FPDSPHY) :: ODTO1240 ! Optical depth total aerosols @ 1240 nm (ECMWF) +TYPE(FPDSPHY) :: TRACFLX(JPOSTRAC) ! surface flux flexible tracers (ECMWF) +TYPE(FPDSPHY) :: OMGF ! Organic matter GFED flux (ECMWF) +TYPE(FPDSPHY) :: SOGF ! Sulphate GFED flux (ECMWF) + + TYPE(FPDSPHY) :: SO2DD ! SO2 dry deposition velocity (ECMWF) TYPE(FPDSPHY) :: VIWVE ! Vertical integral of eastward water vapour flux (ECMWF) TYPE(FPDSPHY) :: VIWVN ! Vertical integral of northward water vapour flux (ECMWF) diff --git a/ifs-source/arpifs/module/yomcompo.F90 b/ifs-source/arpifs/module/yomcompo.F90 index 1de46865..91e7ac50 100644 --- a/ifs-source/arpifs/module/yomcompo.F90 +++ b/ifs-source/arpifs/module/yomcompo.F90 @@ -106,6 +106,7 @@ MODULE YOMCOMPO LOGICAL :: LAERNUCL ! Aersols scheme (aer/glomap) CHARACTER(LEN=10) :: AERO_SCHEME + LOGICAL :: LINJ ! 2D emissions INTEGER(KIND=JPIM) :: NEMIS2D_DESC TYPE(TCOMPO_EMIS), DIMENSION(:), ALLOCATABLE :: YEMIS2D_DESC diff --git a/ifs-source/arpifs/module/yomphyder.F90 b/ifs-source/arpifs/module/yomphyder.F90 index 19c886d9..78eec4dc 100644 --- a/ifs-source/arpifs/module/yomphyder.F90 +++ b/ifs-source/arpifs/module/yomphyder.F90 @@ -43,6 +43,7 @@ MODULE YOMPHYDER REAL(KIND=JPRB), DIMENSION(:,:,:,:), POINTER, CONTIGUOUS :: ZAERLISI REAL(KIND=JPRB), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZAERAOT, ZTAUAER, ZCAERO, ZAEROP REAL(KIND=JPRB), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZAERAOTLEV,ZAERAAOTLEV, ZAERASYLEV + REAL(KIND=JPRB), DIMENSION(:,:,:) , POINTER, CONTIGUOUS :: ZAERFLX_M7 REAL(KIND=JPRB), DIMENSION(:,:) , POINTER, CONTIGUOUS :: ZAERSRC, ZAERDDP, ZAERSDM, ZAERFLX, ZAERLIF REAL(KIND=JPRB), DIMENSION(:) , POINTER, CONTIGUOUS :: ZAZ0M, ZAZ0H !--aerosol optical properties at 14 SW wavelengths (TM5M7) diff --git a/ifs-source/arpifs/namelist/namcompo.nam.h b/ifs-source/arpifs/namelist/namcompo.nam.h index 6b9c5622..fd385a96 100644 --- a/ifs-source/arpifs/namelist/namcompo.nam.h +++ b/ifs-source/arpifs/namelist/namcompo.nam.h @@ -11,5 +11,5 @@ NAMELIST / NAMCOMPO / AERO_SCHEME, LCHEM_DIA, RCHEM_DIA_PERIOD, LCHEM_DDFLX,& & LCOMPO_DDFLX_DIR,LCOMPO_DCDD, & -& LCHEM_TROPO,LAERNITRATE,LAERSOA,LAERRESUSPENSION, LAERNUCL, LAERSOA_COUPLED, & +& LCHEM_TROPO,LAERNITRATE,LAERSOA, LINJ, LAEROSFC,LAERRESUSPENSION, LAERNUCL, LAERSOA_COUPLED, & & LAEREQSAM4CLIM, KGHG_CHEMTEND_CH4 diff --git a/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 b/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 index 7b496aee..69d74ae9 100644 --- a/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 +++ b/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 @@ -184,7 +184,7 @@ SUBROUTINE AER_PHY3_LAYER(YDSURF, & ELSE ZO3(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV) = STATE%O3(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV) ENDIF -write(*,*)"AERO_SCHEME",TRIM(AERO_SCHEME) +!write(*,*)"AERO_SCHEME",TRIM(AERO_SCHEME) SELECT CASE (TRIM(AERO_SCHEME)) CASE ("glomap") @@ -208,35 +208,38 @@ SUBROUTINE AER_PHY3_LAYER(YDSURF, & ENDDO ENDDO -!VH CALL HAMM7_INTERFACE & -!VH &( YDMODEL, & -!VH & KDIM%KIDIA , KDIM%KFDIA , KDIM%KLON , KDIM%KTDIA , KDIM%KLEV , KDIM%KTILES , & -!VH & KDIM%KFLDX , KDIM%KLEVX, & -!VH & GEMSL%ITRAC , GEMSL%IAERO , GEMSL%ICHEM, KDIM%KSTGLO, PAUX%PGEOMH,& -!VH & PAUX%PRS1 , PAUX%PRSF1 , GEMSL%ZAEROP, GEMSL%ZCAERO, GEMSL%ZCEN , PAUX%PAPHIF, & -!VH & FLUX%PFPLCL , FLUX%PFPLCN , FLUX%PFPLSL , FLUX%PFPLSN , PAUX%PGELAT, PAUX%PGELAM, & -!VH & STATE%A , STATE%CLD(:,:,NCLDQI), STATE%CLD(:,:,NCLDQL), STATE%CLD(:,:,NCLDQR), & -!VH & STATE%CLD(:,:,NCLDQS), PDIAG%PCOVPTOT, PDIAG%ZLU , & -!VH & ZO3 , STATE%Q , STATE%T , ZTH , GEMSL%ZTENC , GEMSL%ZCFLX , & -!VH & GEMSL%ZAERDDP, GEMSL%ZAERSDM, GEMSL%ZAERSRC, GEMSL%ZAERWS , GEMSL%ZAERGUST , GEMSL%ZAERUST, GEMSL%ZAERMAP, & -!VH & GEMSL%ZCLAERS, GEMSL%ZPRAERS, PCHEM2AER, & -!VH & SURFL%ZALBD , SURFL%ZFRTI , PSURF%PSD_VF(:,YSD_VF%YLSM%MP) , & -!VH & ZSNM , AUXL%ZWND , PSURF%PSP_SB(:,1,YSP_SB%YQ%MP9) , & -!VH & GEMSL%ZAERFLX, GEMSL%ZAERLIF, & -!VH & FLUX%PAERODDF, TSPHY , PGFL , & -!VH!VH total optical depth output... -!VH & PSURF%PSD_VD(:,YSD_VD%YODTOACC%MP), & -!VH & ZAERO_WVL_DIAG, & -!VH !& PSURF%PSD_VD(:,YSD_VD%YODTO469%MP), PSURF%PSD_VD(:,YSD_VD%YODTO670%MP), & -!VH !& PSURF%PSD_VD(:,YSD_VD%YODTO865%MP), PSURF%PSD_VD(:,YSD_VD%YODTO1240%MP), & -!VH & GEMSL%ZAEROTAU, GEMSL%ZAEROSSA,GEMSL%ZAEROASY, GEMSL%ZAEROTAULW,& -!VH!VH Variables ZTAUS_AER etc ideally convoluted with GEMSL%ZAERTAULT, or similar. -!VH & ZTAUS_AER , ZTAUA_AER, ZPMAER, & -!VH!VH -!VH & PSURF%PSD_XA, PAUX%PVERVEL, AUXL%ZCCNL, AUXL%ZCCNO, PSURF%PAHFSTI, PSURF%PSD_VF(:,YSD_VF%YCI%MP), GEMSL%ZAZ0M, FLUX%PFTLHEV, & -!VH & STATE%U, STATE%V, PSURF%PCVL, PSURF%PCVH,PSURF%PSD_VF(:,YSD_VF%YSO2DD%MP), PAUX%PGEMU)!,ZTSO2,ZTSO4,ZTSO4_AQ,ZFSO2,ZFSO4 ,ZFSO4_AQ& -!VH !&) !eehol: u-wind,v-wind,low veg. cover, high veg. cover, sine of latitude - + ZTAUS_AER = 0._JPRB + ZTAUA_AER = 0._JPRB + ZPMAER = 0._JPRB + CALL HAMM7_INTERFACE & + &( YDMODEL, & + & KDIM%KIDIA , KDIM%KFDIA , KDIM%KLON , KDIM%KTDIA , KDIM%KLEV , KDIM%KTILES , & + & KDIM%KFLDX , KDIM%KLEVX, & + & GEMSL%ITRAC , GEMSL%IAERO , GEMSL%ICHEM, KDIM%KSTGLO, PAUX%PGEOMH,& + & PAUX%PRS1 , PAUX%PRSF1 , GEMSL%ZAEROP, GEMSL%ZCAERO, GEMSL%ZCEN , PAUX%PAPHIF, & + & FLUX%PFPLCL , FLUX%PFPLCN , FLUX%PFPLSL , FLUX%PFPLSN , PAUX%PGELAT, PAUX%PGELAM, & + & STATE%A , STATE%CLD(:,:,NCLDQI), STATE%CLD(:,:,NCLDQL), STATE%CLD(:,:,NCLDQR), & + & STATE%CLD(:,:,NCLDQS), PDIAG%PCOVPTOT, PDIAG%ZLU , & + & ZO3 , STATE%Q , STATE%T , ZTH , GEMSL%ZTENC , GEMSL%ZCFLX , & + & GEMSL%ZAERDDP, GEMSL%ZAERSDM, GEMSL%ZAERSRC, GEMSL%ZAERWS , GEMSL%ZAERGUST , GEMSL%ZAERUST, GEMSL%ZAERMAP, & + & GEMSL%ZCLAERS, GEMSL%ZPRAERS, PCHEM2AER, & + !& SURFL%ZALBD , & + & SURFL%ZFRTI , PSURF%PSD_VF(:,YSD_VF%YLSM%MP) , & + & ZSNM , AUXL%ZWND , PSURF%PSP_SB(:,1,YSP_SB%YQ%MP9) , & + & GEMSL%ZAERFLX_M7, GEMSL%ZAERLIF, & + & FLUX%PAERODDF, TSPHY , PGFL , & +!VH total optical depth output... + & PSURF%PSD_VD(:,YSD_VD%YODTOACC%MP), & + & ZAERO_WVL_DIAG, & + !& PSURF%PSD_VD(:,YSD_VD%YODTO469%MP), PSURF%PSD_VD(:,YSD_VD%YODTO670%MP), & + !& PSURF%PSD_VD(:,YSD_VD%YODTO865%MP), PSURF%PSD_VD(:,YSD_VD%YODTO1240%MP), & + & GEMSL%ZAEROTAU, GEMSL%ZAEROSSA,GEMSL%ZAEROASY, GEMSL%ZAEROTAULW,& +!VH Variables ZTAUS_AER etc ideally convoluted with GEMSL%ZAERTAULT, or similar. + & ZTAUS_AER , ZTAUA_AER, ZPMAER, & +!VH + & PSURF%PSD_XA, PAUX%PVERVEL, AUXL%ZCCNL, AUXL%ZCCNO, PSURF%PAHFSTI, PSURF%PSD_VF(:,YSD_VF%YCI%MP), GEMSL%ZAZ0M, FLUX%PFTLHEV, & + & STATE%U, STATE%V, PSURF%PCVL, PSURF%PCVH,PSURF%PSD_VF(:,YSD_VF%YSO2DD%MP), PAUX%PGEMU)!,ZTSO2,ZTSO4,ZTSO4_AQ,ZFSO2,ZFSO4 ,ZFSO4_AQ& + !&) !eehol: u-wind,v-wind,low veg. cover, high veg. cover, sine of latitude DO JAER=1,14 DO JK=1,KDIM%KLEV diff --git a/ifs-source/arpifs/phys_ec/aer_so2so4_v2.F90 b/ifs-source/arpifs/phys_ec/aer_so2so4_v2.F90 index eddb9e73..309723dd 100644 --- a/ifs-source/arpifs/phys_ec/aer_so2so4_v2.F90 +++ b/ifs-source/arpifs/phys_ec/aer_so2so4_v2.F90 @@ -58,7 +58,7 @@ SUBROUTINE AER_SO2SO4_V2 & !* 0.1 ARGUMENTS ! --------- -TYPE(TRIP) ,INTENT(INOUT) :: YDRIP +TYPE(TRIP) ,INTENT(IN) :: YDRIP INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA INTEGER(KIND=JPIM),INTENT(IN) :: KFDIA INTEGER(KIND=JPIM),INTENT(IN) :: KLON diff --git a/ifs-source/arpifs/phys_ec/aer_src.F90 b/ifs-source/arpifs/phys_ec/aer_src.F90 index 790e5d4d..0129b523 100644 --- a/ifs-source/arpifs/phys_ec/aer_src.F90 +++ b/ifs-source/arpifs/phys_ec/aer_src.F90 @@ -406,6 +406,19 @@ SUBROUTINE AER_SRC & ZUSTAR(:)=0.0_JPRB ZUSTART(:,:)=0.0_JPRB +! For IF .AND. tests in GNU +!ZBNDA = -9999._JPRB +!ZBNDB = -9999._JPRB +!ZBNDC = -9999._JPRB +!ZBNDD = -9999._JPRB +!ZBNDF = -9999._JPRB +!ZBNDG = -9999._JPRB +!ZBNDH = -9999._JPRB +!ZBNDI = -9999._JPRB +!ZBNDJ = -9999._JPRB +!ZBNDK = -9999._JPRB +!ZBNDL = -9999._JPRB +!ZBNDM = -9999._JPRB !----------------------------------------------------------------------- !* 0.1 TIME AND DATE OF THE MODEL @@ -504,9 +517,12 @@ SUBROUTINE AER_SRC & ELSEIF (ZLON >= 285._JPRB .AND. ZLON < 310._JPRB) THEN ZBNDE= 44._JPRB+(ZLON-285._JPRB)*3._JPRB/25._JPRB ENDIF - -!-- limits Britain - ZLONGB=-9999._JPRB +! ZUSTAR = -9999._JPRB +! ZUSTART = -9999._JPRB + ZLONGB= -9999._JPRB !-- limits Britain +! ZBNDJ = -9999._JPRB +! ZBNDM = -9999._JPRB +! ZBNDL = -9999._JPRB IF (ZLON > 354._JPRB .AND. ZLON < 360._JPRB) THEN ZLONGB=ZLON ELSEIF (ZLON >= 0._JPRB .AND. ZLON < 3._JPRB) THEN @@ -528,7 +544,6 @@ SUBROUTINE AER_SRC & ELSEIF (ZLAT <= -7._JPRB .AND. ZLAT > -11._JPRB) THEN ZBNDI= 286._JPRB+(-7._JPRB-ZLAT)*4._JPRB/4._JPRB ENDIF - IF (ZLAT <= -11._JPRB .AND. ZLAT > -18._JPRB) THEN ZBNDJ= 294._JPRB+(-11._JPRB-ZLAT)*8._JPRB/7._JPRB ELSEIF (ZLAT <= -18._JPRB .AND. ZLAT > -27._JPRB) THEN @@ -1029,7 +1044,6 @@ SUBROUTINE AER_SRC & ZDP_ARRAY(1)=0.0001_JPRB ! in cm DO JS=2,INSOIL ZDP_ARRAY(JS) = ZDP_ARRAY(JS-1)*exp(ZDELDP) - !write (*,*) "ZDELDP",JS,ZDP_ARRAY(JS),((EXP(ZDELDP))**(JS-1))*(EXP(ZDELDP)-1)*ZDP_ARRAY(1) ENDDO ! Determination of ZSREL=dSrel in MB95 @@ -1662,7 +1676,7 @@ SUBROUTINE AER_SRC & !- updating volcanic SO2 tendency (should be in variable 15) PTENC(JL,JK,KAERO(INBAER+3))=PTENC(JL,JK,KAERO(INBAER+3))+& & ZVOLESO2(JL)/PRHO(JL,JK) ! kg kg-1 s-1 - write (*,*) "AERVOLC",JL,JK,ZVOLESO2(JL)/PRHO(JL,JK),PRHO(JL,JK),ZVOLUME,ZAREA,ZLATSQ,ZLONSQ,ZDEEPLUME + !write (*,*) "AERVOLC",JL,JK,ZVOLESO2(JL)/PRHO(JL,JK),PRHO(JL,JK),ZVOLUME,ZAREA,ZLATSQ,ZLONSQ,ZDEEPLUME ENDDO diff --git a/ifs-source/arpifs/phys_ec/aerini_layer.F90 b/ifs-source/arpifs/phys_ec/aerini_layer.F90 index f9da7576..ce6ce911 100644 --- a/ifs-source/arpifs/phys_ec/aerini_layer.F90 +++ b/ifs-source/arpifs/phys_ec/aerini_layer.F90 @@ -80,11 +80,12 @@ SUBROUTINE AERINI_LAYER(YDGEOMETRY,YDSURF,& IMPLICIT NONE TYPE(GEOMETRY) ,INTENT(IN) :: YDGEOMETRY -TYPE(TSURF) ,INTENT(INOUT) :: YDSURF +TYPE(TSURF) ,INTENT(IN) :: YDSURF TYPE(MODEL) ,INTENT(INOUT) :: YDMODEL TYPE (DIMENSION_TYPE) ,INTENT (IN) :: KDIM TYPE (AUX_TYPE) ,INTENT (IN) :: PAUX TYPE (STATE_TYPE) ,INTENT (IN) :: STATE +!TYPE (STATE_TYPE) ,INTENT (IN) :: TENDENCY_CML TYPE(VARIABLE_3D) ,INTENT (IN) :: R, S TYPE (SURF_AND_MORE_TYPE) ,INTENT(INOUT) :: PSURF TYPE (SURF_AND_MORE_LOCAL_TYPE),INTENT(INOUT) :: SURFL @@ -168,26 +169,26 @@ SUBROUTINE AERINI_LAYER(YDGEOMETRY,YDSURF,& ZSNM = SUM(PSURF%PSP_SG(:,:,YSP_SG%YF%MP9),DIM=2) ! pre-compute total snow mass -!VH IF(.not. LAERCHEM .and. LAEROSFC)THEN -!VH !IF(LAEROSFC) -!VH call simple_sulfur_src(YDGEOMETRY, YDMODEL, KDIM%KIDIA, KDIM%KFDIA, KDIM%KLON , KDIM%KTDIA, KDIM%KLEV,& -!VH & KDIM%KSTGLO, GEMSL%ITRAC, GEMSL%IAERO, & -!VH & PAUX%PAPHI, & -!VH & PSURF%PSD_VF(:,YSD_VF%YSO2L%MP), PSURF%PSD_VF(:,YSD_VF%YSO2H%MP), & -!VH & PSURF%PSD_VF(:,YSD_VF%YSOGF%MP),& -!VH & PSURF%PSD_VF(:,YSD_VF%YSOA%MP) ,& -!VH & PSURF%PSD_VF(:,YSD_VF%YSOACO%MP),PSURF%PSD_VF(:,YSD_VF%YVOLC%MP), PSURF%PSD_VF(:,YSD_VF%YVOLE%MP),PSURF%PSD_VF(:,YSD_VF%YDMSO%MP),& -!VH & PSURF%PSD_VF(:,YSD_VF%YCI%MP) , PSURF%PSD_VF(:,YSD_VF%YINJF%MP) , PSURF%PSD_VD(:,YSD_VD%YBLH%MP) ,& -!VH & PAUX%PRS1, PAUX%PRSF1,PAUX%PGELAM, PAUX%PGELAT,& -!VH & PSURF%PSD_VF(:,YSD_VF%YLSM%MP) , PSURF%PSP_RR(:,YSP_RR%YT%MP9) , TSPHY,& -!VH & GEMSL%ZAERWS,& -!VH & GEMSL%ZDMSO, GEMSL%ZLDAY, GEMSL%ZLISS, GEMSL%ZSO2, GEMSL%ZTDMS,& -!VH & GEMSL%ZODMS, PSO4SRC,PSO2SRC) -!VH ELSE + IF(.not. LAERCHEM .and. LAEROSFC)THEN + !IF(LAEROSFC) + !call simple_sulfur_src(YDGEOMETRY, YDMODEL, KDIM%KIDIA, KDIM%KFDIA, KDIM%KLON , KDIM%KTDIA, KDIM%KLEV,& + ! & KDIM%KSTGLO, GEMSL%ITRAC, GEMSL%IAERO, & + ! & PAUX%PAPHI, & + ! & PSURF%PSD_VF(:,YSD_VF%YSO2L%MP), PSURF%PSD_VF(:,YSD_VF%YSO2H%MP), & + ! & PSURF%PSD_VF(:,YSD_VF%YSOGF%MP),& + ! & PSURF%PSD_VF(:,YSD_VF%YSOA%MP) ,& + ! & PSURF%PSD_VF(:,YSD_VF%YSOACO%MP),PSURF%PSD_VF(:,YSD_VF%YVOLC%MP), PSURF%PSD_VF(:,YSD_VF%YVOLE%MP),PSURF%PSD_VF(:,YSD_VF%YDMSO%MP),& + ! & PSURF%PSD_VF(:,YSD_VF%YCI%MP) , PSURF%PSD_VF(:,YSD_VF%YINJF%MP) , PSURF%PSD_VD(:,YSD_VD%YBLH%MP) ,& + ! & PAUX%PRS1, PAUX%PRSF1,PAUX%PGELAM, PAUX%PGELAT,& + ! & PSURF%PSD_VF(:,YSD_VF%YLSM%MP) , PSURF%PSP_RR(:,YSP_RR%YT%MP9) , TSPHY,& + ! & GEMSL%ZAERWS,& + ! & GEMSL%ZDMSO, GEMSL%ZLDAY, GEMSL%ZLISS, GEMSL%ZSO2, GEMSL%ZTDMS,& + ! & GEMSL%ZODMS, PSO4SRC,PSO2SRC) + ELSE ! Set to zero PSO4SRC(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV)=0.0_JPRB PSO2SRC(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV)=0.0_JPRB -!VH END IF + END IF SELECT CASE (TRIM(AERO_SCHEME)) @@ -198,31 +199,33 @@ SUBROUTINE AERINI_LAYER(YDGEOMETRY,YDSURF,& ! all other processes are still handled by the TM5-M7 code CASE ("tm5m7", "hamm7") -!VH CALL TM5M7_PHY2 & -!VH &( YDGEOMETRY, YDMODEL, KDIM%KIDIA, KDIM%KFDIA, KDIM%KLON , KDIM%KTDIA, KDIM%KLEV, KDIM%KFLDX , KDIM%KLEVX,& -!VH & KDIM%KTILES, KDIM%KSTGLO, GEMSL%ITRAC, GEMSL%IAERO, NSW,& -!VH & PAUX%PRS1 , PAUX%PRSF1, PAUX%PAPHI, STATE%T , PAUX%PVERVEL, GEMSL%ZCEN , PAUX%PGEOMH,& -!VH & PSURF%PSD_VD(:,YSD_VD%YALB%MP), SURFL%ZALBD, PSURF%PSD_VF(:,YSD_VF%YALUVD%MP),& -!VH & PSURF%PSD_VF(:,YSD_VF%YAERDEP%MP),PSURF%PSD_VF(:,YSD_VF%YAERLTS%MP),PSURF%PSD_VF(:,YSD_VF%YAERSCC%MP),& -!VH & GEMSL%ZAERWS, GEMSL%ZAERGUST, GEMSL%ZAERUST,& -!VH & PSURF%PSD_VF(:,YSD_VF%YSO2DD%MP),& -!VH & PSURF%PSD_VF(:,YSD_VF%YSOGF%MP),& -!VH & PSURF%PSD_VF(:,YSD_VF%YSOILTYPE%MP), & -!VH !TB added lake cover: YCLK, !!!PSP_SG 2 dims becomes now 3 dims -!VH & PSURF%PSD_VF(:,YSD_VF%YCI%MP), PSURF%PSD_VF(:,YSD_VF%YCLK%MP) , PSURF%PSD_VF(:,YSD_VF%YINJF%MP) , PSURF%PSD_VD(:,YSD_VD%YBLH%MP) ,& -!VH & SURFL%ZFRTI, PSURF%PSD_VF(:,YSD_VF%YLSM%MP) , PSURF%PSD_VF(:,YSD_VF%YSST%MP), STATE%Q, & -!VH & PSURF%PSP_SG(:,1,YSP_SG%YF%MP9) , PSURF%PSP_RR(:,YSP_RR%YT%MP9) , PAUX%PGELAM, PAUX%PGELAT, PAUX%PGEMU, SURFL%ZHSDFOR,& -!VH & STATE%U(:,KDIM%KLEV) , STATE%V(:,KDIM%KLEV) , PSURF%PSP_SB(:,1,YSP_SB%YQ%MP9), TSPHY, GEMSL%ZAZ0M,& -!VH & GEMSL%ICHEM,& -!VH !VH - Introduce Land use info... -!VH & PSURF%PCVL, PSURF%PCVH,PSURF%ITVL,PSURF%ITVH, & -!VH & PSURF%PAHFSTI, &!!!FLUX%PFTLHEV, & -!VH !VH - end -!VH & GEMSL%ZCFLX, GEMSL%ZTENC,& -!VH & GEMSL%ZLDAY, GEMSL%ZLISS, GEMSL%ZSO2, GEMSL%ZTDMS,& -!VH & GEMSL%ZAERDDP, GEMSL%ZAERSDM, GEMSL%ZAERSRC, GEMSL%ZAERMAP, GEMSL%ZAERFLX, GEMSL%ZAERLIF,& -!VH & GEMSL%ZODMS, PSURF%PSD_XA, & -!VH &PSO4SRC,PSO2SRC) + CALL TM5M7_PHY2 & + &( YDGEOMETRY, YDMODEL, KDIM%KIDIA, KDIM%KFDIA, KDIM%KLON , KDIM%KTDIA, KDIM%KLEV, KDIM%KFLDX , KDIM%KLEVX,& + & KDIM%KTILES, KDIM%KSTGLO, GEMSL%ITRAC, GEMSL%IAERO, NSW,& + & PAUX%PRS1 , PAUX%PRSF1, PAUX%PAPHI, STATE%T , PAUX%PVERVEL, GEMSL%ZCEN , PAUX%PGEOMH,& + & PSURF%PSD_VD(:,YSD_VD%YALB%MP), SURFL%ZALBD, PSURF%PSD_VF(:,YSD_VF%YALUVD%MP),& + & PSURF%PSD_VF(:,YSD_VF%YAERDEP%MP),PSURF%PSD_VF(:,YSD_VF%YAERLTS%MP),PSURF%PSD_VF(:,YSD_VF%YAERSCC%MP),& + & GEMSL%ZAERWS, GEMSL%ZAERGUST, GEMSL%ZAERUST,& + & PSURF%PSD_VF(:,YSD_VF%YSO2DD%MP),& + !& PSURF%PSD_VF(:,YSD_VF%YSOGF%MP),& + & PSURF%PSD_VF(:,YSD_VF%YSOILTYPE%MP), & + !TB added lake cover: YCLK, !!!PSP_SG 2 dims becomes now 3 dims + & PSURF%PSD_VF(:,YSD_VF%YCI%MP), PSURF%PSD_VF(:,YSD_VF%YCLK%MP) , & +! & PSURF%PSD_VF(:,YSD_VF%YINJF%MP) , & + & PSURF%PSD_VD(:,YSD_VD%YBLH%MP) ,& + & SURFL%ZFRTI, PSURF%PSD_VF(:,YSD_VF%YLSM%MP) , PSURF%PSD_VF(:,YSD_VF%YSST%MP), STATE%Q, & + & PSURF%PSP_SG(:,1,YSP_SG%YF%MP9) , PSURF%PSP_RR(:,YSP_RR%YT%MP9) , PAUX%PGELAM, PAUX%PGELAT, PAUX%PGEMU, SURFL%ZHSDFOR,& + & STATE%U(:,KDIM%KLEV) , STATE%V(:,KDIM%KLEV) , PSURF%PSP_SB(:,1,YSP_SB%YQ%MP9), TSPHY, GEMSL%ZAZ0M,& + & GEMSL%ICHEM,& + !VH - Introduce Land use info... + & PSURF%PCVL, PSURF%PCVH,PSURF%ITVL,PSURF%ITVH, & + & PSURF%PAHFSTI, &!!!FLUX%PFTLHEV, & + !VH - end + & GEMSL%ZCFLX, GEMSL%ZTENC,& + & GEMSL%ZLDAY, GEMSL%ZLISS, GEMSL%ZSO2, GEMSL%ZTDMS,& + & GEMSL%ZAERDDP, GEMSL%ZAERSDM, GEMSL%ZAERSRC, GEMSL%ZAERMAP, GEMSL%ZAERFLX, GEMSL%ZAERLIF,& + & GEMSL%ZODMS, PSURF%PSD_XA, & + & PSO4SRC,PSO2SRC) CASE ("aer") diff --git a/ifs-source/arpifs/phys_ec/aero_init.F90 b/ifs-source/arpifs/phys_ec/aero_init.F90 index 84a29ca6..8aaab161 100644 --- a/ifs-source/arpifs/phys_ec/aero_init.F90 +++ b/ifs-source/arpifs/phys_ec/aero_init.F90 @@ -58,6 +58,10 @@ SUBROUTINE AERO_INIT(YGFL,YDCOMPO,YDEAERATM,KDIM,GEMSL) ALLOCATE( GEMSL%ZAERSRC(KDIM%KLON,NACTAERO) ) ALLOCATE( GEMSL%ZAERDDP(KDIM%KLON,NACTAERO) ) ALLOCATE( GEMSL%ZAERSDM(KDIM%KLON,NACTAERO) ) + +ALLOCATE( GEMSL%ZAERMAP(KDIM%KLON,5) ) +ALLOCATE( GEMSL%ZAERFLX_M7(KDIM%KLON,12,9) ) +!ALLOCATE( GEMSL%ZAERLIF(KDIM%KLON,9) ) GEMSL%ZAERSRC(:,:)=0._JPRB GEMSL%ZAERDDP(:,:)=0._JPRB GEMSL%ZAERSDM(:,:)=0._JPRB @@ -77,6 +81,7 @@ SUBROUTINE AERO_INIT(YGFL,YDCOMPO,YDEAERATM,KDIM,GEMSL) ALLOCATE( GEMSL%ZAERAAOTLEV(KDIM%KLON,KDIM%KLEV,6) ) ALLOCATE( GEMSL%ZAERASYLEV(KDIM%KLON,KDIM%KLEV,6) ) ALLOCATE( GEMSL%ZAERLISI(KDIM%KLON,KDIM%KLEV,NPAERLISI_WVL,NPAERLISI_VAR) ) +GEMSL%ZAERFLX_M7(:,:,:)=0._JPRB GEMSL%ZAERFLX(:,:)=0._JPRB GEMSL%ZAERLIF(:,:)=0._JPRB GEMSL%ZTAUAER(:,:,:)=0._JPRB @@ -88,14 +93,21 @@ SUBROUTINE AERO_INIT(YGFL,YDCOMPO,YDEAERATM,KDIM,GEMSL) !M7 aerosols -ALLOCATE( GEMSL%ZAEROTAU(KDIM%KLON,KDIM%KLEV,14) ) -ALLOCATE( GEMSL%ZAEROSSA(KDIM%KLON,KDIM%KLEV,14) ) -ALLOCATE( GEMSL%ZAEROASY(KDIM%KLON,KDIM%KLEV,14) ) -ALLOCATE( GEMSL%ZAEROTAULW(KDIM%KLON,KDIM%KLEV,16) ) -GEMSL%ZAEROTAU(:,:,:)=0._JPRB -GEMSL%ZAEROSSA(:,:,:)=0._JPRB -GEMSL%ZAEROASY(:,:,:)=0._JPRB -GEMSL%ZAEROTAULW(:,:,:)=0._JPRB +IF (TRIM(YDCOMPO%AERO_SCHEME)=='hamm7') THEN + ALLOCATE( GEMSL%ZAEROTAU(KDIM%KLON,KDIM%KLEV,14) ) + ALLOCATE( GEMSL%ZAEROSSA(KDIM%KLON,KDIM%KLEV,14) ) + ALLOCATE( GEMSL%ZAEROASY(KDIM%KLON,KDIM%KLEV,14) ) + ALLOCATE( GEMSL%ZAEROTAULW(KDIM%KLON,KDIM%KLEV,16) ) + GEMSL%ZAEROTAU(:,:,:)=0._JPRB + GEMSL%ZAEROSSA(:,:,:)=0._JPRB + GEMSL%ZAEROASY(:,:,:)=0._JPRB + GEMSL%ZAEROTAULW(:,:,:)=0._JPRB +ELSE + ALLOCATE( GEMSL%ZAEROTAU(1,1,1) ) + ALLOCATE( GEMSL%ZAEROSSA(1,1,1) ) + ALLOCATE( GEMSL%ZAEROASY(1,1,1) ) + ALLOCATE( GEMSL%ZAEROTAULW(1,1,1) ) +ENDIF diff --git a/ifs-source/arpifs/phys_ec/callpar.F90 b/ifs-source/arpifs/phys_ec/callpar.F90 index bc4d4372..c5735840 100644 --- a/ifs-source/arpifs/phys_ec/callpar.F90 +++ b/ifs-source/arpifs/phys_ec/callpar.F90 @@ -1904,7 +1904,7 @@ SUBROUTINE CALLPAR(YDGEOMETRY,YDVARS,YDSURF,YDMODEL,KDIM,& ! --------------------------------- ! Releasing the allocated space for local structures IF ( (NCHEM > 0 .OR. NGEMS > 0 .OR. NACTAERO > 0) .AND. LL_HRES ) THEN - DEALLOCATE(ZCHEM2AER) + IF (ALLOCATED(ZCHEM2AER)) DEALLOCATE(ZCHEM2AER) ENDIF CALL LOCAL_ARRAYS_FIN(LLKEYS,AUXL,SURFL,PERTL,GEMSL) diff --git a/ifs-source/arpifs/phys_ec/cloud_layer.F90 b/ifs-source/arpifs/phys_ec/cloud_layer.F90 index 93a1d472..b3fa5045 100644 --- a/ifs-source/arpifs/phys_ec/cloud_layer.F90 +++ b/ifs-source/arpifs/phys_ec/cloud_layer.F90 @@ -123,6 +123,7 @@ SUBROUTINE CLOUD_LAYER( & TYPE (AUX_DIAG_TYPE) , INTENT(INOUT) :: PDIAG TYPE (VARIABLE_3D) , INTENT(INOUT) :: FSD TYPE (STATE_TYPE) , INTENT(INOUT) :: TENDENCY_LOC + !----------------------------------------------------------------------- INTEGER(KIND=JPIM) :: JRF, JL, JK REAL(KIND=JPRB) :: ZGP2DSPP(KDIM%KLON, YDSPP_CONFIG%SM%NRFTOTAL) !SPP pattern @@ -131,6 +132,7 @@ SUBROUTINE CLOUD_LAYER( & REAL(KIND=JPHOOK) :: ZHOOK_HANDLE + !----------------------------------------------------------------------- #include "cloudsc.intfb.h" @@ -139,7 +141,8 @@ SUBROUTINE CLOUD_LAYER( & IF (LHOOK) CALL DR_HOOK('CLOUD_LAYER',0,ZHOOK_HANDLE) ASSOCIATE(TSPHY=>YDPHY2%TSPHY, & - & YSD_VF=>YDSURF%YSD_VF, YSD_VD=>YDSURF%YSD_VD) + & YSD_VF=>YDSURF%YSD_VF, YSD_VD=>YDSURF%YSD_VD ) + ! ------------------------------------------------------------------------------ ! @@ -151,6 +154,8 @@ SUBROUTINE CLOUD_LAYER( & ZGP2DSPP(JL,JRF)=PPERT%PGP2DSPP(JL,1,JRF) ENDDO ENDDO +!-->eehol: add CDNC from PGFL field + ZFSD(:,:)=0.0_JPRB diff --git a/ifs-source/arpifs/phys_ec/ec_phys.F90 b/ifs-source/arpifs/phys_ec/ec_phys.F90 index 31d618f4..6630e776 100644 --- a/ifs-source/arpifs/phys_ec/ec_phys.F90 +++ b/ifs-source/arpifs/phys_ec/ec_phys.F90 @@ -586,7 +586,6 @@ SUBROUTINE EC_PHYS(YDGEOMETRY,YDVARS,YDGMV,YDSURF,YDMODEL,CDCONF,DIMS,& ! ------------------------------------------------------------------------------------- !* 4.2 CALL ECMWF PHYSICS - CALL CALLPAR(YDGEOMETRY,YDVARS,YDSURF,YDMODEL,DIMS,& & PAUX, PRAD, FLUX, ZDIAG, PSURF, & & PCGPP, PCREC, ZAG, ZRECO,& diff --git a/ifs-source/arpifs/phys_ec/ec_phys_drv.F90 b/ifs-source/arpifs/phys_ec/ec_phys_drv.F90 index ba3951ae..082870c8 100644 --- a/ifs-source/arpifs/phys_ec/ec_phys_drv.F90 +++ b/ifs-source/arpifs/phys_ec/ec_phys_drv.F90 @@ -619,7 +619,6 @@ SUBROUTINE EC_PHYS_DRV(YDGEOMETRY,YDFIELDS,YDVARS,YDGMV,YDSURF,YDMODEL,CDCONF,& ENDDO !$OMP END DO !$OMP END PARALLEL - CALL STATE_T0%FINAL() CALL TENDENCY_DYN%FINAL() CALL TENDENCY_CML%FINAL() diff --git a/ifs-source/arpifs/phys_ec/gems_init.F90 b/ifs-source/arpifs/phys_ec/gems_init.F90 index 5dc25ddb..f92710c9 100644 --- a/ifs-source/arpifs/phys_ec/gems_init.F90 +++ b/ifs-source/arpifs/phys_ec/gems_init.F90 @@ -120,7 +120,7 @@ SUBROUTINE GEMS_INIT(YDSURF, YDML_CHEM,YDEPHY,YGFL,YDPHY2, YDRIP, KIDIA, KFDIA, KTRAC=KTRAC+1 KCHEM(JEXT)=KTRAC ENDDO - +!WRITE(*,*) "KAERO",KAERO ALLOCATE( PCEN(KLON,KLEV,KTRAC) ) ALLOCATE( PTENC(KLON,KLEV,KTRAC) ) ALLOCATE( PTENC_SKF(KLON,KLEV,KTRAC) ) diff --git a/ifs-source/arpifs/phys_ec/hamm7_init.F90 b/ifs-source/arpifs/phys_ec/hamm7_init.F90 index 441a11cf..1fb6ce2f 100644 --- a/ifs-source/arpifs/phys_ec/hamm7_init.F90 +++ b/ifs-source/arpifs/phys_ec/hamm7_init.F90 @@ -204,6 +204,8 @@ SUBROUTINE hamm7_init(YGFL, YRRIP) ! in the files. ! aerosol tracers + +!write(*,*) "MYPROC ", MYPROC LABEL_IFS_AERO: DO j_yaero = 1,NAERO ! looping over the number tracers in HAM @@ -213,6 +215,8 @@ SUBROUTINE hamm7_init(YGFL, YRRIP) ! x: N,K,A,C = nucleation, Aitken, accumulation, and coarse, respectively, while ! y: S,I = soluble, insoluble, respectively. ! In the IFS-csv table, these combinations are prefixed with '_N' + !write(*,*) "CNAME ", TRIM(YAERO(j_yaero)%CNAME) + !write(*,*) "sizeclass ",TRIM(sizeclass(j_class)%shortname)//'_N' IF (TRIM(YAERO(j_yaero)%CNAME) == TRIM(sizeclass(j_class)%shortname)//'_N') THEN ! In case of a match, we set the tracer index in the HAM meta data to the @@ -247,6 +251,11 @@ SUBROUTINE hamm7_init(YGFL, YRRIP) ! included as well, depending on the HAM setup. j_class = aerocomp(j_mass)%iclass ! index to size class j_spec = aerocomp(j_mass)%spid ! index to species + !write(*,*) "CNAME ", TRIM(YAERO(j_yaero)%CNAME) + !write(*,*) "shortname ",(TRIM(speclist(j_spec)%shortname)//'_'//TRIM(sizeclass(j_class)%shortname)) + !write(*,*) "sizeclass=POM_ ", 'POM_'//TRIM(sizeclass(j_class)%shortname) + + ! write(*,*) "sizeclass ==OC ", TRIM(speclist(j_spec)%shortname) IF (TRIM(YAERO(j_yaero)%CNAME) == (TRIM(speclist(j_spec)%shortname)//'_'//TRIM(sizeclass(j_class)%shortname))) THEN diff --git a/ifs-source/arpifs/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/phys_ec/hamm7_interface.F90 index 62dc9df7..d2248041 100755 --- a/ifs-source/arpifs/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/phys_ec/hamm7_interface.F90 @@ -6,7 +6,7 @@ SUBROUTINE HAMM7_INTERFACE & & PAP , PIP , PLP , PRP , PSP , PCOVPTOT, PLU , PO3P ,PQP , PTP , PTHP , PTENC , PCFLX , & & PAERDDP, PAERSDM, PAERSRC, PAERWS , PAERGUST , PAERUST, PAERMAP, & & PCLAERS, PPRAERS, PCHEM2AER, & - & PALBD , PFRTI , PLSM , PSNS , PWND , PWS1 , PAERFLX, PAERLIF, & + & PFRTI , PLSM , PSNS , PWND , PWS1 , PAERFLX, PAERLIF, & & PAERODDF,PTSPHY , PGFL , & & PODTO , PAERO_WVL_DIAG, & & PAER_TAU, PAER_SSA,PAER_ASYM,PAER_TAU_LW,& @@ -180,7 +180,7 @@ SUBROUTINE HAMM7_INTERFACE & !----------------------------------------------------------------------- IMPLICIT NONE -TYPE(MODEL) ,INTENT(INOUT):: YDMODEL +TYPE(MODEL) ,INTENT(IN):: YDMODEL INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA, KFDIA, KLON INTEGER(KIND=JPIM),INTENT(IN) :: KTDIA, KLEV, KFLDX, KLEVX INTEGER(KIND=JPIM),INTENT(IN) :: KTILES @@ -198,7 +198,8 @@ SUBROUTINE HAMM7_INTERFACE & REAL(KIND=JPRB),INTENT(IN) :: PO3P(KLON,KLEV), PQP(KLON,KLEV), PTP(KLON,KLEV), PTHP(KLON,0:KLEV) REAL(KIND=JPRB),INTENT(IN) :: PFPLCL(KLON,0:KLEV),PFPLCN(KLON,0:KLEV),PFPLSL(KLON,0:KLEV),PFPLSN(KLON,0:KLEV) REAL(KIND=JPRB),INTENT(IN) :: PGELAT(KLON) , PGELAM(KLON) -REAL(KIND=JPRB),INTENT(IN) :: PALBD(KLON,YDMODEL%YRML_PHY_RAD%YRERAD%NTSW), PFRTI(KLON,KTILES) +!REAL(KIND=JPRB),INTENT(IN) :: PALBD(KLON,YDMODEL%YRML_PHY_RAD%YRERAD%NTSW), PFRTI(KLON,KTILES) +REAL(KIND=JPRB),INTENT(IN) :: PFRTI(KLON,KTILES) REAL(KIND=JPRB),INTENT(IN) :: PAERWS(KLON), PAERGUST(KLON), PAERUST(KLON), PAERMAP(KLON,5) REAL(KIND=JPRB),INTENT(IN) :: PAERSRC(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO) REAL(KIND=JPRB),INTENT(IN) :: PCHEM2AER(KLON,KLEV,6) @@ -265,17 +266,17 @@ SUBROUTINE HAMM7_INTERFACE & REAL(KIND=JPRB) :: ZTBCPHI(KLON,KLEV),ZTBCPHO(KLON,KLEV),ZTOMPHI(KLON,KLEV), ZTOMPHO(KLON,KLEV) REAL(KIND=JPRB) :: ZITBCPHO(KLON,KLEV),ZITOMPHO(KLON,KLEV),ZITSO2(KLON,KLEV) REAL(KIND=JPRB) :: ZFSO2(KLON) , ZFSO4(KLON), ZFSO4_AQ(KLON) -REAL(KIND=JPRB) :: ZTSO2(KLON, KLEV) , ZTSO4(KLON, KLEV), ZTSO4_AQ(KLON, KLEV) +REAL(KIND=JPRB) :: ZTSO2(KLON, KLEV) , ZTSO4(KLON, KLEV,1), ZTSO4_AQ(KLON, KLEV) REAL(KIND=JPRB) :: ZAIRDM(KLON) REAL(KIND=JPRB) :: ZQSAT(KLON,KLEV), ZRHCL(KLON,KLEV), ZRHO(KLON,KLEV) REAL(KIND=JPRB) :: ZTAER(KLON,KLEV), ZTAERI(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO) REAL(KIND=JPRB) :: ZTAERO(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO), ZTENV(KLON) REAL(KIND=JPRB) :: ZAERWET(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO) -REAL(KIND=JPRB) :: ZRH(KLON,KLEV),ZTENC0(KLON,KLEV)!,ZTSO4(KLON,KLEV) +REAL(KIND=JPRB) :: ZRH(KLON,KLEV),ZTENC0(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NCHEM)!,ZTSO4(KLON,KLEV) -REAL(KIND=JPRB) :: ZAERNL(KLON,KLEV,NMOD) -REAL(KIND=JPRB) :: ZAERML(KLON,KLEV,NAERMOD) +!REAL(KIND=JPRB) :: ZAERNL(KLON,KLEV,NMOD) +!REAL(KIND=JPRB) :: ZAERML(KLON,KLEV,NAERMOD) INTEGER(KIND=JPIM) :: JMOD,JAERCLASS,IFLAG REAL(KIND=JPRB) :: ZM6RP(KLON,KLEV,NMOD) REAL(KIND=JPRB) :: ZM6DRY(KLON,KLEV,NSOL) @@ -304,7 +305,8 @@ SUBROUTINE HAMM7_INTERFACE & TYPE(MODAL_DATA), DIMENSION(NSOL), TARGET :: H2O_MODE TYPE(MODAL_DATA), DIMENSION(NMOD), TARGET :: DENS_MODE -REAL(KIND=JPRB), ALLOCATABLE :: ZAERSRC(:,:), ZAERNGT(:,:) , ZAERSCC(:,:) +!REAL(KIND=JPRB), ALLOCATABLE :: ZAERSRC(:,:), ZAERNGT(:,:) , ZAERSCC(:,:) +REAL(KIND=JPRB), ALLOCATABLE :: ZAERNGT(:,:) REAL(KIND=JPRB) :: ZCLWAT, ZDEGRAD, ZEPSCOV, ZEPSWAT, ZRWSAT, ZRWPWP REAL(KIND=JPRB) :: Z1CLD , ZDENSVIS,ZGDT , ZQIWP , ZQLWP(KLON,KLEV) , ZQRWP , ZQSWP @@ -316,8 +318,8 @@ SUBROUTINE HAMM7_INTERFACE & LOGICAL :: LLIQCLD(KLON,KLEV) ! logical for liquid cloud LOGICAL :: LICECLD(KLON,KLEV) ! logical for ice cloud INTEGER(KIND=JPIM) ::KTOP -REAL(KIND=JPRB) :: ZEPSEC=1e-14 -REAL(KIND=JPRB) :: ZAEROUT1(KLON,KLEV),ZAEROUT2(KLON,KLEV),ZAEROUT3(KLON,KLEV),ZAEROUT4(KLON,KLEV),ZAEROUT5(KLON,KLEV) +REAL(KIND=JPRB),PARAMETER :: ZEPSEC=1e-14 +!REAL(KIND=JPRB) :: ZAEROUT1(KLON,KLEV),ZAEROUT2(KLON,KLEV),ZAEROUT3(KLON,KLEV),ZAEROUT4(KLON,KLEV),ZAEROUT5(KLON,KLEV) REAL(KIND=JPRB),PARAMETER :: INFINITY=HUGE(1._JPRB) @@ -451,10 +453,11 @@ SUBROUTINE HAMM7_INTERFACE & & YREAERLID=>YDMODEL%YRML_PHY_AER%YREAERLID, YREAERSNK=>YDMODEL%YRML_PHY_AER%YREAERSNK, YRERAD=>YDMODEL%YRML_PHY_RAD%YRERAD,& & YDRIP=>YDMODEL%YRML_GCONF%YRRIP,YDCHEM=>YDMODEL%YRML_CHEM%YRCHEM, YRCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO, YREPHY=>YDMODEL%YRML_PHY_EC%YREPHY, & & YRECLDP=>YDMODEL%YRML_PHY_EC%YRECLDP, & - & YDSPP_CONFIG=>YDMODEL%YRML_GCONF%YRSPP_CONFIG, & - & NACTAERO=>YDMODEL%YRML_GCONF%YGFL%NACTAERO, NAERO=>YDMODEL%YRML_GCONF%YGFL%NAERO, NGHG=>YDMODEL%YRML_GCONF%YGFL%NGHG, NCHEM=>YDMODEL%YRML_GCONF%YGFL%NCHEM, ZTRAC=>YDMODEL%YRML_GCONF%YGFL%NTRAC, NSO4SCHEME => YDMODEL%YRML_PHY_AER%YREAERSRC%NSO4SCHEME, & - & NDIM=>YDMODEL%YRML_GCONF%YGFL%NDIM, YAEROUT=>YDMODEL%YRML_GCONF%YGFL%YAEROUT, YR=>YDMODEL%YRML_GCONF%YGFL%YR, YS=>YDMODEL%YRML_GCONF%YGFL%YS, & - & LCHEM_DIA=>YDMODEL%YRML_CHEM%YRCOMPO%LCHEM_DIA, YCHEM=>YDMODEL%YRML_GCONF%YGFL%YCHEM, YAERO=>YDMODEL%YRML_GCONF%YGFL%YAERO, YGHG=>YDMODEL%YRML_GCONF%YGFL%YGHG, YTRAC=>YDMODEL%YRML_GCONF%YGFL%YTRAC, & + & YDSPP_CONFIG=>YDMODEL%YRML_GCONF%YRSPP_CONFIG) + + ASSOCIATE(NACTAERO=>YGFL%NACTAERO, NAERO=>YGFL%NAERO, NGHG=>YGFL%NGHG, NCHEM=>YGFL%NCHEM, ZTRAC=>YGFL%NTRAC, NSO4SCHEME => YREAERSRC%NSO4SCHEME, & + & NDIM=>YGFL%NDIM, YAEROUT=>YGFL%YAEROUT, YR=>YGFL%YR, YS=>YGFL%YS, & + & LCHEM_DIA=>YRCOMPO%LCHEM_DIA, YCHEM=>YGFL%YCHEM, YAERO=>YGFL%YAERO, YGHG=>YGFL%YGHG, YTRAC=>YGFL%YTRAC, & & YDAERM7=>YDMODEL%YRML_PHY_AER%YREAEROPT, &! use this to transfer AOD, SSA and ASY to rad scheme & LAERDRYDP=>YDMODEL%YRML_PHY_RAD%YREAERATM%LAERDRYDP, LAERSEDIM=>YDMODEL%YRML_PHY_RAD%YREAERATM%LAERSEDIM, LAERSURF=>YDMODEL%YRML_PHY_RAD%YREAERATM%LAERSURF, & !add logicals for dry dep and sedi & YCDNC=>YDMODEL%YRML_GCONF%YGFL%YCDNC, YICNC=>YDMODEL%YRML_GCONF%YGFL%YICNC, YRE_LIQ=>YDMODEL%YRML_GCONF%YGFL%YRE_LIQ, YRE_ICE=>YDMODEL%YRML_GCONF%YGFL%YRE_ICE, & !included CDNC, ICNC, liq and ice eff rad @@ -483,6 +486,34 @@ SUBROUTINE HAMM7_INTERFACE & !* 0. PROGNOSTIC AEROSOLS - FINAL COMPUTATIONS ! ---------------------------------------- +!write(*,*) "PGEOH", minval(PGEOH) +!write(*,*) "PRS1", minval(PRS1) , minval(PRSF1) , minval(PAEROP) +!write(*,*) "PCAERO ", minval(PCAERO) , minval(PCEN) , minval(PAPHIF) +!write(*,*) "PFPLSN ", minval(PFPLSN) , minval(PGELAT), minval(PGELAM) +!write(*,*) "PFPLCL ", minval(PFPLCL) , minval(PFPLCN) , minval(PFPLSL) +!write(*,*) "PRP ", minval(PRP) , minval(PSP) +!write(*,*) "PAP", minval(PAP) , minval(PIP) , minval(PLP) +!write(*,*) "1", minval(PCOVPTOT), minval(PLU) , minval(PO3P) ,minval(PQP) , minval(PTP) +!write(*,*) "2", minval(PTHP) , minval(PTENC) ,minval( PCFLX) +!write(*,*) "3", minval(PAERDDP), minval(PAERSDM), minval(PAERSRC), minval(PAERWS) +!write(*,*) "4", minval(PAERGUST), minval(PAERUST), minval(PAERMAP) +!write(*,*) "5", minval(PCLAERS), minval(PPRAERS), minval(PCHEM2AER) +!write(*,*) "6.2", minval(PFRTI) +!write(*,*) "6.3", minval(PLSM) +!write(*,*) "6.4", minval(PSNS) +!write(*,*) "7", minval(PWND) , minval(PWS1) , minval(PAERFLX), minval(PAERLIF) +!!write(*,*) "8", minval(PAERODDF),PTSPHY +!!write(*,*) "9", minval(PODTO) , minval(PAERO_WVL_DIAG) +!write(*,*) "10", minval(PAER_TAU), minval(PAER_SSA),minval(PAER_ASYM),minval(PAER_TAU_LW) +!!write(*,*) "11", minval(PTAUS_AER),minval(PTAUA_AER),minval(PPMAER) +!write(*,*) "12", minval(PEXTRA), minval(PVERVEL), minval(PCCNL), minval(PCCNO) +!write(*,*) "13", minval(PAHFSTI), minval(PCI), minval(PZ0M), minval(PAHFLEV) +!write(*,*) "14", minval(PUP), minval(PVP), minval(PCVL), minval(PCVH), minval(PGEMU)! +!write(*,*) "15", minval(PSO2DD) + + + +ZAHFSM =0._JPRB ZEPSCOV=1.E-03_JPRB ZEPSWAT=1.E-18_JPRB ZDEGRAD=180._JPRB/RPI @@ -492,19 +523,19 @@ SUBROUTINE HAMM7_INTERFACE & !* 0.1 SWITCHING ON POSSIBLE DEBUG PRINTS AND ALLOCATING MEMORY ! -------------------------------------------------------- -ALLOCATE( ZAERSRC(KLON,NACTAERO) ) +!ALLOCATE( ZAERSRC(KLON,NACTAERO) ) ALLOCATE( ZAERNGT(KLON,NACTAERO) ) -ALLOCATE( ZAERSCC(KLON,NACTAERO) ) +!ALLOCATE( ZAERSCC(KLON,NACTAERO) ) -ZAERSRC(KIDIA:KFDIA,1:NACTAERO) =0._JPRB +!ZAERSRC(KIDIA:KFDIA,1:NACTAERO) =0._JPRB ZAERNGT(KIDIA:KFDIA,1:NACTAERO) =0._JPRB -ZAERSCC(KIDIA:KFDIA,1:NACTAERO) =0._JPRB +!ZAERSCC(KIDIA:KFDIA,1:NACTAERO) =0._JPRB -ZAEROUT1(:,:) =0._JPRB -ZAEROUT2(:,:) =0._JPRB -ZAEROUT3(:,:) =0._JPRB -ZAEROUT4(:,:) =0._JPRB -ZAEROUT5(:,:) =0._JPRB +!ZAEROUT1(:,:) =0._JPRB +!ZAEROUT2(:,:) =0._JPRB +!ZAEROUT3(:,:) =0._JPRB +!ZAEROUT4(:,:) =0._JPRB +!ZAEROUT5(:,:) =0._JPRB ZOUT(:,:) =0._JPRB ZOUT2(:,:) =0._JPRB @@ -549,7 +580,7 @@ SUBROUTINE HAMM7_INTERFACE & ZTAERO(:,:,:)=0._JPRB -ZAERSRC(KIDIA:KFDIA,1:NACTAERO)=PAERSRC(KIDIA:KFDIA,1:NACTAERO) +!ZAERSRC(KIDIA:KFDIA,1:NACTAERO)=PAERSRC(KIDIA:KFDIA,1:NACTAERO) ! computation of tropopause level CALL TROPLEV(KLON,KIDIA,KFDIA,KLEV,.FALSE.,PTP,PQP,PRSF1,IKLEVTROP) @@ -625,12 +656,12 @@ SUBROUTINE HAMM7_INTERFACE & ZM6DRY(KIDIA:KFDIA,:,:)=0.0_JPRB ZRHOP(KIDIA:KFDIA,:,:)=0.0_JPRB ZWW(KIDIA:KFDIA,:,:)=0.0_JPRB -ZAERML(KIDIA:KFDIA,:,:)=0.0_JPRB -ZAERNL(KIDIA:KFDIA,:,:)=0.0_JPRB +!ZAERML(KIDIA:KFDIA,:,:)=0.0_JPRB +!ZAERNL(KIDIA:KFDIA,:,:)=0.0_JPRB IF (LCHEM_DIA) THEN ZTAERO0(KIDIA:KFDIA,1:KLEV,1:NACTAERO) = ZTAEROK(KIDIA:KFDIA,1:KLEV,1:NACTAERO) - ZTENC0(KIDIA:KFDIA,1:KLEV) = 0._JPRB + ZTENC0(KIDIA:KFDIA,1:KLEV, :) = 0._JPRB ENDIF @@ -662,7 +693,7 @@ SUBROUTINE HAMM7_INTERFACE & DO JL=KIDIA,KFDIA !!!ZDP(JL,JK)= PAUX%PRS1(JL,JK) - PAUX%PRS1(JL,JK-1) ZTSO2(JL,JK)=PTENC(JL,JK,ISSO2) - ZTSO4(JL,JK)=PTENC(JL,JK,ISSO4) + ZTSO4(JL,JK, 1)=PTENC(JL,JK,ISSO4) ZTSO4_AQ(JL,JK)=0.0_JPRB ZSO2(JL,JK)=PAEROP(JL,JK,ISSO2) ZITSO2(JL,JK)=PTENC(JL,JK,ISSO2) @@ -685,7 +716,7 @@ SUBROUTINE HAMM7_INTERFACE & & PTSPHY, PTP , PRSF1 , PAP , PLP , PGELAT, PGELAM, & & ZSO2 , ZITSO2, PGFL(:,:,YGFL%YAEROCLIM(1)%MP), & & PGFL(:,:,YGFL%YAEROCLIM(2)%MP), PGFL(:,:,YGFL%YAEROCLIM(3)%MP) ,& - & ZTSO2 , ZTSO4, ZTSO4_AQ, ZFSO2, ZFSO4, ZFSO4_AQ, ZDP) + & ZTSO2 , ZTSO4(:,:,1), ZTSO4_AQ, ZFSO2, ZFSO4, ZFSO4_AQ, ZDP) DO JK=1,KLEV @@ -693,7 +724,7 @@ SUBROUTINE HAMM7_INTERFACE & ! ZTSO2 PTENC(JL,JK,ISSO2)=PTENC(JL,JK,ISSO2)+ZTSO2(JL,JK) ! ZTSO4 - PTENC(JL,JK,ISSO4)=PTENC(JL,JK,ISSO4)+ZTSO4(JL,JK) + PTENC(JL,JK,ISSO4)=PTENC(JL,JK,ISSO4)+ZTSO4(JL,JK,1) ! SO4 formed in clouds is applied to Accumulati !write(7700,*)ISSO4_ACS,shape(GEMSL%ZTENC(JL,JK,:)) PTENC(JL,JK,ISSO4_ACS)=PTENC(JL,JK,ISSO4_ACS)+ZTSO4_AQ(JL,JK) @@ -764,10 +795,17 @@ SUBROUTINE HAMM7_INTERFACE & ZXTM1(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB ZXTTE(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB ZXTTEM1(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB + +!write(*,*) "PTENC",PTENC(1,1,:) +!write(*,*) "KAERO",KAERO +!write(*,*) "ind_oifs_ham%ind_class_OIFS",ind_oifs_ham%ind_class_OIFS !number DO JCLASS=1,nclass DO JK=1,KLEV DO JL=KIDIA,KFDIA + !write(*,*) "JCLASS",JCLASS + !write(*,*) "ntrac",ntrac + !write(*,*) "ind_oifs_ham%ind_class_HAM(JCLASS)",ind_oifs_ham%ind_class_HAM(JCLASS) ZXTM1(JL,JK,ind_oifs_ham%ind_class_HAM(JCLASS)) = ZCEN(JL,JK,KAERO(ind_oifs_ham%ind_class_OIFS(JCLASS))) ZXTTE(JL,JK,ind_oifs_ham%ind_class_HAM(JCLASS)) = PTENC(JL,JK,KAERO(ind_oifs_ham%ind_class_OIFS(JCLASS))) END DO @@ -989,7 +1027,8 @@ SUBROUTINE HAMM7_INTERFACE & !<-- Store CDNC (number of activated particles) and ICNC as a number mixing ratio to tracer values and to PGFL fields ZXTM1(KIDIA:KFDIA,1:KLEV,idt_cdnc) = ZCDNCACT(KIDIA:KFDIA,1:KLEV)/ZRHO(KIDIA:KFDIA,1:KLEV) ! [#/kg] ZXTM1(KIDIA:KFDIA,1:KLEV,idt_icnc) = (1.0E6_JPRB)*ZICNC(KIDIA:KFDIA,1:KLEV)/ZRHO(KIDIA:KFDIA,1:KLEV) !ice crystal number conc = #/cm3 --> number mix rat [#/kg] - + !write(*,*) "YCDNC%MP9_PH",YCDNC%MP9_PH + !write(*,*) "YICNC%MP9_PH",YICNC%MP9_PH PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH) = (1.0E-6_JPRB)*ZCDNCACT(KIDIA:KFDIA,1:KLEV) ! add CDNC to PGFL field (convert from #/m3 to #/cm3) PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH) = ZICNC(KIDIA:KFDIA,1:KLEV) ! add ICNC to PGFL field (does not need convert) !--> End store CDNC and ICNC @@ -1341,7 +1380,7 @@ SUBROUTINE HAMM7_INTERFACE & IF (LCHEM_DIA) THEN CALL CHEM_INEXT( KIDIA , KFDIA , KLON , KLEV , 1, 1, & - & ZDP, PTSPHY, ZTSO4,ZTENC0,PEXTRA(:,ISO4_C,IEXTR_CH)) + & ZDP, PTSPHY, ZTSO4, ZTENC0,PEXTRA(:,ISO4_C,IEXTR_CH)) END IF @@ -1486,9 +1525,12 @@ SUBROUTINE HAMM7_INTERFACE & ENDDO ENDDO ENDDO + + ZAEROK = ZAEROK+ZTAERO*time_step_len + CALL TM5M7_OPTICS_AOP_GET(YGFL, YREAERSRC, KIDIA,KFDIA, KLON, KLEV,NACTAERO, & & NASWBAND, ASWBAND, 1, .false., & - & ZRHO, ZAEROK+(ZTAERO*time_step_len),RW_MODE,RWD_MODE,H2O_MODE,& + & ZRHO, ZAEROK,RW_MODE,RWD_MODE,H2O_MODE,& & ZAER_TAU, ZAER_SSA, ZAER_ASYM) PAOD(KIDIA:KFDIA,:)=0._JPRB @@ -1599,12 +1641,22 @@ SUBROUTINE HAMM7_INTERFACE & PSSA(JL,IW)=PAER_SSA(JL,JK,IW)*PAER_TAU(JL,JK,IW)+PSSA(JL,IW) PASY(JL,IW)=PAER_ASYM(JL,JK,IW)*PAER_TAU(JL,JK,IW)+PASY(JL,IW) end do - PSSA(JL,:) =PSSA(JL,:)/PAOD(JL,IW)! AOD average - PASY(JL,:) =PASY(JL,:)/PAOD(JL,IW)! AOD average + !IF(PAOD(JL,IW)>0._JPRB) THEN + ! PSSA(JL,:) =PSSA(JL,:)/PAOD(JL,IW)! AOD average + ! PASY(JL,:) =PASY(JL,:)/PAOD(JL,IW)! AOD average + !ENDIF end do end do + do JL = KIDIA,KFDIA + do IW=1,NASWBAND + IF(PAOD(JL,IW)>0._JPRB) THEN + PSSA(JL,IW) =PSSA(JL,IW)/PAOD(JL,IW)! AOD average + PASY(JL,IW) =PASY(JL,IW)/PAOD(JL,IW)! AOD average + ENDIF + end do +end do !------------------------------------------------------------------------------ !* 6.0 Fill selective aerosol OD fields in structure as available in IFS-AER @@ -1646,12 +1698,12 @@ SUBROUTINE HAMM7_INTERFACE & ! ------------------------------ !-- total instantaneous optical depth - DO JB=1,NBANDS_TROP - DO JL=KIDIA,KFDIA - ZAEROUT1(JL,JB)= PTAUS_AER(JL,KLEV,JB,1) - ZAEROUT1(JL,NBANDS_TROP+JB)= PTAUA_AER(JL,KLEV,JB,1) - ENDDO - ENDDO +! DO JB=1,NBANDS_TROP +! DO JL=KIDIA,KFDIA +! ZAEROUT1(JL,JB)= PTAUS_AER(JL,KLEV,JB,1) +! ZAEROUT1(JL,NBANDS_TROP+JB)= PTAUA_AER(JL,KLEV,JB,1) +! ENDDO +! ENDDO !-- @@ -1659,13 +1711,13 @@ SUBROUTINE HAMM7_INTERFACE & ! ------------------------------ !-- the total extinction coefficient at wavelengths ?? nm is archived in GFL%AEROUT - DO JK=1,KLEV - DO JL=KIDIA,KFDIA - ZAEROUT2(JL,JK)=PTAUS_AER(JL,JK, 1,1) - ZAEROUT3(JL,JK)=PTAUA_AER(JL,JK, 1,1) - ZAEROUT4(JL,JK)=Ppmaer(JL,JK,1,1) - ENDDO - ENDDO +! DO JK=1,KLEV +! DO JL=KIDIA,KFDIA +! ZAEROUT2(JL,JK)=PTAUS_AER(JL,JK, 1,1) +! ZAEROUT3(JL,JK)=PTAUA_AER(JL,JK, 1,1) +! ZAEROUT4(JL,JK)=Ppmaer(JL,JK,1,1) +! ENDDO +! ENDDO @@ -1700,7 +1752,7 @@ SUBROUTINE HAMM7_INTERFACE & PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(4)%MP)=SEDOUT_2D(KIDIA:KFDIA,KAERO(JN)) end do do JN=1,NACTAERO!KTRAC - PGFL(KIDIA:KFDIA,JN,YAEROUT(5)%MP)=ZAERSRC(KIDIA:KFDIA,KAERO(JN)) + PGFL(KIDIA:KFDIA,JN,YAEROUT(5)%MP)=PAERSRC(KIDIA:KFDIA,KAERO(JN)) end do PGFL(KIDIA:KFDIA,1,YAEROUT(6)%MP)=PAERFLX(KIDIA:KFDIA,3,9) PGFL(KIDIA:KFDIA,:,YAEROUT(7)%MP)=0.0_JPRB @@ -1764,7 +1816,7 @@ SUBROUTINE HAMM7_INTERFACE & PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(26)%MP)=ZSEDIFLUX(KIDIA:KFDIA,1:KLEV,25) do JN=1,NACTAERO - PGFL(KIDIA:KFDIA,JN,YAEROUT(28)%MP)=ZAERSRC(KIDIA:KFDIA,KAERO(JN)) + PGFL(KIDIA:KFDIA,JN,YAEROUT(28)%MP)=PAERSRC(KIDIA:KFDIA,KAERO(JN)) end do if (LAERCHEM)THEN DO JGAS=1,subm_ngasspec @@ -1785,7 +1837,7 @@ SUBROUTINE HAMM7_INTERFACE & PGFL(KIDIA:KFDIA,KLEV,YAEROUT(40)%MP)=ZFSO2(KIDIA:KFDIA) ! tendency SS CS ham after update surface PGFL(KIDIA:KFDIA,KLEV,YAEROUT(41)%MP)=ZFSO4(KIDIA:KFDIA) ! tendency SS CS ham after update surfac PGFL(KIDIA:KFDIA,KLEV,YAEROUT(42)%MP)=ZFSO4_AQ(KIDIA:KFDIA) ! tendency SS CS ham after update surface - PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(43)%MP)=ZTSO4(KIDIA:KFDIA,1:KLEV) ! tendency SS CS ham after update surface + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(43)%MP)=ZTSO4(KIDIA:KFDIA,1:KLEV,1) ! tendency SS CS ham after update surface PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(44)%MP)=ZTSO4_AQ(KIDIA:KFDIA,1:KLEV) ! tendency SS CS ham after update surface PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(45)%MP)=ZTSO2(KIDIA:KFDIA,1:KLEV) ! tendency SS CS ham after update surface END if @@ -1796,24 +1848,25 @@ SUBROUTINE HAMM7_INTERFACE & !------------------------------------------------------------------------------ !* 9. RELEASE LOCAL MEMORY ! -------------------- -DEALLOCATE( ZAERSRC ) -DEALLOCATE( ZAERNGT ) -DEALLOCATE( ZAERSCC ) +!DEALLOCATE( ZAERSRC ) + if (allocated(ZAERNGT ) ) DEALLOCATE( ZAERNGT ) +!DEALLOCATE( ZAERSCC ) -DEALLOCATE( ZWPDF ) -DEALLOCATE( ZW ) -if (allocated(ZRC) ) DEALLOCATE( ZRC ) -if (allocated(ZSMAX)) DEALLOCATE( ZSMAX ) + if (allocated(ZWPDF ) )DEALLOCATE( ZWPDF ) + if (allocated(ZW ) )DEALLOCATE( ZW ) + if (allocated(ZRC) ) DEALLOCATE( ZRC ) + if (allocated(ZSMAX)) DEALLOCATE( ZSMAX ) DO IMODE=1,NMOD - DEALLOCATE(RW_MODE(IMODE)%d2) - DEALLOCATE(DENS_MODE(IMODE)%d2) + if (associated(RW_MODE(IMODE)%d2)) DEALLOCATE(RW_MODE(IMODE)%d2) + if (associated(DENS_MODE(IMODE)%d2)) DEALLOCATE(DENS_MODE(IMODE)%d2) ENDDO + DO IMODE=1,NMOD IF (sizeclass(IMODE)%lsoluble) THEN - DEALLOCATE(RWD_MODE(IMODE)%d2) - DEALLOCATE(H2O_MODE(IMODE)%d2) + if (associated(RWD_MODE(IMODE)%d2)) DEALLOCATE(RWD_MODE(IMODE)%d2) + if (associated(H2O_MODE(IMODE)%d2)) DEALLOCATE(H2O_MODE(IMODE)%d2) END IF ENDDO @@ -1822,6 +1875,7 @@ SUBROUTINE HAMM7_INTERFACE & !if (allocated(w_large)) DEALLOCATE( w_large ) !if (allocated(w_turb)) DEALLOCATE( w_turb ) +END ASSOCIATE END ASSOCIATE IF (LHOOK) CALL DR_HOOK('TM5M7',1,ZHOOK_HANDLE) diff --git a/ifs-source/arpifs/phys_ec/local_arrays_fin.F90 b/ifs-source/arpifs/phys_ec/local_arrays_fin.F90 index 92806dde..17fc3505 100644 --- a/ifs-source/arpifs/phys_ec/local_arrays_fin.F90 +++ b/ifs-source/arpifs/phys_ec/local_arrays_fin.F90 @@ -64,7 +64,6 @@ SUBROUTINE LOCAL_ARRAYS_FIN(LLKEYS,AUXL,SURFL,PERTL,GEMSL) !----------------------------------------------------------------------- REAL(KIND=JPHOOK) :: ZHOOK_HANDLE - !----------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('LOCAL_ARRAYS_FIN',0,ZHOOK_HANDLE) @@ -76,8 +75,13 @@ SUBROUTINE LOCAL_ARRAYS_FIN(LLKEYS,AUXL,SURFL,PERTL,GEMSL) IF (ASSOCIATED(SURFL%ZEMIW)) NULLIFY(SURFL%ZEMIW) ! --- -DEALLOCATE(GEMSL%ITRAC) -DEALLOCATE(GEMSL%ZCEN,GEMSL%ZTENC,GEMSL%ZTENC_SKF,GEMSL%ZCFLX,GEMSL%ZSCAV) +IF (ASSOCIATED(GEMSL%ITRAC)) DEALLOCATE(GEMSL%ITRAC) +IF (ASSOCIATED(GEMSL%ZCEN)) DEALLOCATE(GEMSL%ZCEN) +IF (ASSOCIATED(GEMSL%ZTENC)) DEALLOCATE(GEMSL%ZTENC) +IF (ASSOCIATED(GEMSL%ZTENC_SKF)) DEALLOCATE(GEMSL%ZTENC_SKF) +IF (ASSOCIATED(GEMSL%ZCFLX)) DEALLOCATE(GEMSL%ZCFLX) +IF (ASSOCIATED(GEMSL%ZSCAV)) DEALLOCATE(GEMSL%ZSCAV) +!DEALLOCATE(GEMSL%ZCEN,GEMSL%ZTENC,GEMSL%ZTENC_SKF,GEMSL%ZCFLX,GEMSL%ZSCAV) IF (ASSOCIATED(GEMSL%IAERO)) DEALLOCATE(GEMSL%IAERO) IF (ASSOCIATED(GEMSL%ICHEM)) DEALLOCATE(GEMSL%ICHEM) IF (ASSOCIATED(GEMSL%ZAZ0M)) DEALLOCATE(GEMSL%ZAZ0M) @@ -104,10 +108,12 @@ SUBROUTINE LOCAL_ARRAYS_FIN(LLKEYS,AUXL,SURFL,PERTL,GEMSL) IF (ASSOCIATED(GEMSL%ZCAERO)) DEALLOCATE(GEMSL%ZCAERO) IF (ASSOCIATED(GEMSL%ZAEROP)) DEALLOCATE(GEMSL%ZAEROP) - -IF (ASSOCIATED(GEMSL%ZAERSRC)) DEALLOCATE(GEMSL%ZAERSRC) IF (ASSOCIATED(GEMSL%ZAERDDP)) DEALLOCATE(GEMSL%ZAERDDP) IF (ASSOCIATED(GEMSL%ZAERSDM)) DEALLOCATE(GEMSL%ZAERSDM) +IF (ASSOCIATED(GEMSL%ZAERSRC)) DEALLOCATE(GEMSL%ZAERSRC) +!IF (ASSOCIATED(GEMSL%ZAERDDP)) GEMSL%ZAERDDP =>NULL() +!IF (ASSOCIATED(GEMSL%ZAERSDM)) GEMSL%ZAERSDM =>NULL() +!IF (ASSOCIATED(GEMSL%ZAERSRC)) GEMSL%ZAERSRC =>NULL() IF (ASSOCIATED(GEMSL%ZAERFLX)) DEALLOCATE(GEMSL%ZAERFLX) IF (ASSOCIATED(GEMSL%ZAERLIF)) DEALLOCATE(GEMSL%ZAERLIF) @@ -131,7 +137,6 @@ SUBROUTINE LOCAL_ARRAYS_FIN(LLKEYS,AUXL,SURFL,PERTL,GEMSL) ! M7 fields -! REAL(KIND=JPRB), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZAEROTAU, ZAEROSSA,ZAEROASY,ZAEROTAULW IF (ASSOCIATED(GEMSL%ZAEROTAU)) DEALLOCATE(GEMSL%ZAEROTAU) IF (ASSOCIATED(GEMSL%ZAEROSSA)) DEALLOCATE(GEMSL%ZAEROSSA) IF (ASSOCIATED(GEMSL%ZAEROASY)) DEALLOCATE(GEMSL%ZAEROASY) diff --git a/ifs-source/arpifs/phys_ec/local_arrays_ini.F90 b/ifs-source/arpifs/phys_ec/local_arrays_ini.F90 index ee03e7c7..da75661b 100644 --- a/ifs-source/arpifs/phys_ec/local_arrays_ini.F90 +++ b/ifs-source/arpifs/phys_ec/local_arrays_ini.F90 @@ -126,9 +126,13 @@ SUBROUTINE LOCAL_ARRAYS_INI(YDGEOMETRY,YDSURF,YDMODEL,KDIM, LLKEYS, PAUX, AUXL, ! ----------------------------------------- !* AUXL ! ----------------------------------------- - ! Initialization DO JL=KDIM%KIDIA,KDIM%KFDIA + !write(*,*) "JL", JL + !write(*,*) "PRAD%PEMTC(JL,1)",PRAD%PEMTC(JL,1) + !write(*,*) "PRAD%PEMTC(JL,KDIM%KLEV+1)",PRAD%PEMTC(JL,KDIM%KLEV+1) + !write(*,*) "AUXL%ZCEMTR(JL,0)",AUXL%ZCEMTR(JL,0) + !write(*,*) "AUXL%ZCEMTR(JL,1)",AUXL%ZCEMTR(JL,1) AUXL%ZSUDU (JL) =PRAD%PSRSWDCS(JL) AUXL%ZCEMTR(JL,0)=PRAD%PEMTC(JL,1) AUXL%ZCEMTR(JL,1)=PRAD%PEMTC(JL,KDIM%KLEV+1) @@ -294,6 +298,7 @@ SUBROUTINE LOCAL_ARRAYS_INI(YDGEOMETRY,YDSURF,YDMODEL,KDIM, LLKEYS, PAUX, AUXL, ALLOCATE(GEMSL%ZAERDDP(1,1)) ALLOCATE(GEMSL%ZAERSDM(1,1)) + ALLOCATE(GEMSL%ZAERFLX_M7(1,1,1)) ALLOCATE(GEMSL%ZAERFLX(1,1)) ALLOCATE(GEMSL%ZAERLIF(1,1)) ALLOCATE(GEMSL%ZTAUAER(1,1,1)) diff --git a/ifs-source/arpifs/phys_ec/mo_ham_m7.F90 b/ifs-source/arpifs/phys_ec/mo_ham_m7.F90 index b886ddbc..d550fbf6 100644 --- a/ifs-source/arpifs/phys_ec/mo_ham_m7.F90 +++ b/ifs-source/arpifs/phys_ec/mo_ham_m7.F90 @@ -871,15 +871,22 @@ SUBROUTINE m7_averageproperties(kproma, kbdim, klev, krow, paernl, paerml, pttn, !>>SF #458 (replacing WHERE statements) zaltern_val = MERGE(critn, 0._dp, (jn == iso4ns)) + !write(*,*) "paernl", paernl + !write(*,*) "cmin_aernl",cmin_aernl + !write(*,*) "cmin_aerml", cmin_aerml ll1(1:kproma,:) = (paernl(1:kproma,:,jclass) > cmin_aernl) & .AND. (paerml(1:kproma,:,jn) > cmin_aerml) ztmp1(1:kproma,:) = MERGE(paernl(1:kproma,:,jclass), 1._dp, ll1(1:kproma,:)) !SF 1. is a dummy val. - - pttn(1:kproma,:,jn) = MERGE( & - zunitfac*paerml(1:kproma,:,jn)/ztmp1(1:kproma,:), & - zaltern_val, & - ll1(1:kproma,:)) + !write(*,*) "zunitfac", zunitfac + !write(*,*) "paerml", paerml + !write(*,*) "divide", zunitfac*paerml(1:kproma,:,jn)/ztmp1(1:kproma,:) + !write(*,*) "zaltern_val", zaltern_val + !write(*,*) "ll1", ll1 + ztmp1(1:kproma,:) = zunitfac*paerml(1:kproma,:,jn)/ztmp1(1:kproma,:) + !write(*,*) "ztmp1", ztmp1(1:kproma,:) + !pttn(1:kproma,:,jn) = MERGE(zunitfac*paerml(1:kproma,:,jn)/ztmp1(1:kproma,:), zaltern_val, ll1(1:kproma,:)) + pttn(1:kproma,:,jn) = MERGE(ztmp1(1:kproma,:), zaltern_val, ll1(1:kproma,:)) !< zmin) - paclc(1:kproma,:) = MERGE(paclc(1:kproma,:) , 0._dp, lo_2d(1:kproma,:)) - pice(1:kproma,:) = MERGE(pmiwc(1:kproma,:)/zilwc(1:kproma,:), 0._dp, lo_2d(1:kproma,:)) + paclc(1:kproma,:) = MERGE(paclc(1:kproma,:) , 0._dp, lo_2d(1:kproma,:)) + + ztmp1(1:kproma,:) = 0._dp + + IF (MINVAL(ABS(zilwc(1:kproma,:)))>0._dp) THEN + ztmp1(1:kproma,:) = pmiwc(1:kproma,:)/zilwc(1:kproma,:) + ENDIF + !pice(1:kproma,:) = MERGE(pmiwc(1:kproma,:)/zilwc(1:kproma,:), 0._dp, lo_2d(1:kproma,:)) + pice(1:kproma,:) = MERGE(ztmp1(1:kproma,:), 0._dp, lo_2d(1:kproma,:)) !--- 1.2) Calculate autoconversion rate: lo_2d(1:kproma,:) = (pmiwc(1:kproma,:) > zmin) - peffice(1:kproma,:) = MERGE(pmrateps(1:kproma,:)/pmiwc(1:kproma,:), 0._dp, lo_2d(1:kproma,:)) + ztmp1(1:kproma,:) = 0._dp + IF (MINVAL(ABS(pmiwc(1:kproma,:)))>0._dp) THEN + ztmp1(1:kproma,:) = pmrateps(1:kproma,:)/pmiwc(1:kproma,:) + ENDIF + + !peffice(1:kproma,:) = MERGE(pmrateps(1:kproma,:)/pmiwc(1:kproma,:), 0._dp, lo_2d(1:kproma,:)) + peffice(1:kproma,:) = MERGE(ztmp1(1:kproma,:), 0._dp, lo_2d(1:kproma,:)) + peffice(1:kproma,:) = MAX(0._dp,MIN(1._dp,peffice(1:kproma,:))) lo_2d(1:kproma,:) = (pmlwc(1:kproma,:) > zmin) - peffwat(1:kproma,:) = MERGE( (pmratepr(1:kproma,:)+pmsnowacl(1:kproma,:))/pmlwc(1:kproma,:) , & - 0._dp, lo_2d(1:kproma,:)) + ztmp1(1:kproma,:) = 0._dp + IF (MINVAL(ABS(pmlwc(1:kproma,:)))>0._dp) THEN + ztmp1(1:kproma,:) = (pmratepr(1:kproma,:)+pmsnowacl(1:kproma,:))/pmlwc(1:kproma,:) + ENDIF + + !peffwat(1:kproma,:) = MERGE( (pmratepr(1:kproma,:)+pmsnowacl(1:kproma,:))/pmlwc(1:kproma,:) , 0._dp, lo_2d(1:kproma,:)) + peffwat(1:kproma,:) = MERGE(ztmp1(1:kproma,:) , 0._dp, lo_2d(1:kproma,:)) + + peffwat(1:kproma,:) = MAX(0._dp,MIN(1._dp,peffwat(1:kproma,:))) !--- 1.3) Calculate the effective grid-box fraction @@ -477,8 +498,13 @@ SUBROUTINE prep_wetdep_hydro(kproma, kbdim, klev, ktop, krow, lstrat, & lo_2d(1:kproma,:) = (zfprec(1:kproma,:) > zmin) - prevap(1:kproma,:) = MERGE((pfevapr(1:kproma,:)+pfsubls(1:kproma,:))/zfprec(1:kproma,:), & - 0._dp, lo_2d(1:kproma,:)) + ztmp1(1:kproma,:) = 0._dp + IF (MINVAL(ABS(zfprec(1:kproma,:)))>0._dp) THEN + ztmp1(1:kproma,:) = (pfevapr(1:kproma,:)+pfsubls(1:kproma,:))/zfprec(1:kproma,:) + ENDIF + + !prevap(1:kproma,:) = MERGE((pfevapr(1:kproma,:)+pfsubls(1:kproma,:))/zfprec(1:kproma,:), 0._dp, lo_2d(1:kproma,:)) + prevap(1:kproma,:) = MERGE(ztmp1(1:kproma,:), 0._dp, lo_2d(1:kproma,:)) prevap(1:kproma,:) = MAX(0._dp,MIN(1._dp,prevap(1:kproma,:))) @@ -735,10 +761,11 @@ SUBROUTINE gas_wetdep(kproma, kbdim, klev, ktop, & !--- Change in in-cloud (strat) or updraft (conv) tracer concentration: !>>SF #458 (replacing where statements) - zdxtwat(1:kproma,:) = MERGE( & - zxtwat(1:kproma,:)*plfrac(1:kproma,:)*peffwat(1:kproma,:), & - 0._dp, & - ll_cloud_cov(1:kproma,:)) + + ztmp1(1:kproma,:) = zxtwat(1:kproma,:)*plfrac(1:kproma,:)*peffwat(1:kproma,:) + + !zdxtwat(1:kproma,:) = MERGE( zxtwat(1:kproma,:)*plfrac(1:kproma,:)*peffwat(1:kproma,:), 0._dp, ll_cloud_cov(1:kproma,:)) + zdxtwat(1:kproma,:) = MERGE( ztmp1(1:kproma,:), 0._dp, ll_cloud_cov(1:kproma,:)) !<>SF #458 (replacing where statements) - zdxtice(1:kproma,:) = MERGE( & - zxtice(1:kproma,:)*plfrac(1:kproma,:)*peffice(1:kproma,:), & - 0._dp, & - ll_cloud_cov(1:kproma,:)) + ztmp1(1:kproma,:) = zxtice(1:kproma,:)*plfrac(1:kproma,:)*peffice(1:kproma,:) + !zdxtice(1:kproma,:) = MERGE( zxtice(1:kproma,:)*plfrac(1:kproma,:)*peffice(1:kproma,:), 0._dp, ll_cloud_cov(1:kproma,:)) + zdxtice(1:kproma,:) = MERGE( ztmp1(1:kproma,:), 0._dp, ll_cloud_cov(1:kproma,:)) !<>SF #458 (replacing where statements) ll1(1:kproma,:) = .NOT. ll_cloud_cov(1:kproma,:) .AND. ll_prcp(1:kproma,:) - zcoeffr (1:kproma,:) = MERGE( & - -ztmst*zscavcoefbcr(1:kproma,:), & - 0._dp, & - ll1(1:kproma,:) ) + ztmp1(1:kproma,:) = -ztmst*zscavcoefbcr(1:kproma,:) + !zcoeffr (1:kproma,:) = MERGE( -ztmst*zscavcoefbcr(1:kproma,:), 0._dp, ll1(1:kproma,:) ) + zcoeffr (1:kproma,:) = MERGE( ztmp1(1:kproma,:), 0._dp, ll1(1:kproma,:) ) - zcoeffs (1:kproma,:) = MERGE( & - -ztmst*zscavcoefbcs(1:kproma,:), & - 0._dp, & - ll1(1:kproma,:) ) + ztmp1(1:kproma,:) = -ztmst*zscavcoefbcs(1:kproma,:) + !zcoeffs (1:kproma,:) = MERGE( -ztmst*zscavcoefbcs(1:kproma,:), 0._dp, ll1(1:kproma,:) ) + zcoeffs (1:kproma,:) = MERGE( ztmp1(1:kproma,:), 0._dp, ll1(1:kproma,:) ) ztmp1(1:kproma,:) = MERGE(pclc(1:kproma,:), 1._dp, ll1(1:kproma,:)) !SF 1._dp is a dummy value !>>SFtemporary (in waiting to define two separate rain and snow coeffs): diff --git a/ifs-source/arpifs/phys_ec/su_aerw.F90 b/ifs-source/arpifs/phys_ec/su_aerw.F90 index 58d09a03..1543137e 100644 --- a/ifs-source/arpifs/phys_ec/su_aerw.F90 +++ b/ifs-source/arpifs/phys_ec/su_aerw.F90 @@ -528,7 +528,6 @@ SUBROUTINE SU_AERW(YDMODEL) RAERVOLE(:,:)=0._JPRB RVOLERUZ(:)= 1._JPRB - LAERINIT =.FALSE. !-- default value are for use of "plain" or "gusty" 10-m wind as predictor for SS and DU NAERWND = 2 diff --git a/ifs-source/arpifs/phys_ec/tm5m7_drydep.F90 b/ifs-source/arpifs/phys_ec/tm5m7_drydep.F90 index 84735237..6d3054b8 100644 --- a/ifs-source/arpifs/phys_ec/tm5m7_drydep.F90 +++ b/ifs-source/arpifs/phys_ec/tm5m7_drydep.F90 @@ -625,8 +625,8 @@ SUBROUTINE TM5M7_DRYDEP & DO IMODE=1,NMOD - DEALLOCATE(vn_deposition(IMODE)%surf) - DEALLOCATE(vm_deposition(IMODE)%surf) + IF(ASSOCIATED(vn_deposition(IMODE)%surf)) DEALLOCATE(vn_deposition(IMODE)%surf) + IF(ASSOCIATED(vm_deposition(IMODE)%surf)) DEALLOCATE(vm_deposition(IMODE)%surf) ENDDO diff --git a/ifs-source/arpifs/phys_ec/tm5m7_init.F90 b/ifs-source/arpifs/phys_ec/tm5m7_init.F90 index 6afbcce0..cb86e945 100755 --- a/ifs-source/arpifs/phys_ec/tm5m7_init.F90 +++ b/ifs-source/arpifs/phys_ec/tm5m7_init.F90 @@ -163,14 +163,14 @@ SUBROUTINE TM5M7_INIT(YDGEOMETRY, YRCOMPO, YGFL, YDERAD) !IF(.not.LAERCHEM)THEN ! Initialize optics: ! Make sure that 'WAVE' is already initialized (in tm5_init.F90) - IF (.NOT. LL_TM5_PHOTO_INI) THEN - if (.NOT. LAERCHEM)THEN - call PHOTOLYSIS_INI - ELSE - CALL ABOR1('tm5-based photolysis not yet initialized!!') - END if + !IF (.NOT. LL_TM5_PHOTO_INI) THEN + ! if (.NOT. LAERCHEM)THEN + ! call PHOTOLYSIS_INI + ! ELSE + ! CALL ABOR1('tm5-based photolysis not yet initialized!!') + ! END if - ENDIF + !ENDIF !END IF ! define wavelengths for optics calculations nwdep = nbands_trop + count(lmid.ne.lmid_gridA) @@ -201,12 +201,14 @@ SUBROUTINE TM5M7_INIT(YDGEOMETRY, YRCOMPO, YGFL, YDERAD) CALL TM5M7_OPTICS_INIT(NWDEP,WDEP) - deallocate(photo_wavelengths) + if (allocated(photo_wavelengths)) deallocate(photo_wavelengths) + if (allocated(wdep)) deallocate(wdep) ! nwdep=14 ! !! A.Laakso: Taken from ecearth_optics (TM5-ECEARTH3) ! HAM aerosol optics are using these too NASWBAND=YDERAD%NTSW + if (allocated(ASWBAND)) deallocate(ASWBAND) allocate(ASWBAND(YDERAD%NTSW)) ASWBAND( 13)%wl = 0.257_JPRB ASWBAND( 12)%wl = 0.313_JPRB diff --git a/ifs-source/arpifs/phys_ec/tm5m7_optics_calculate_aop.F90 b/ifs-source/arpifs/phys_ec/tm5m7_optics_calculate_aop.F90 index 226ebc37..86823be4 100644 --- a/ifs-source/arpifs/phys_ec/tm5m7_optics_calculate_aop.F90 +++ b/ifs-source/arpifs/phys_ec/tm5m7_optics_calculate_aop.F90 @@ -386,7 +386,7 @@ SUBROUTINE TM5M7_OPTICS_CALCULATE_AOP(KIDIA,KFDIA,KLON,KLEV, nwl,NCONTR, wdep, e endif if( wdep(i)%split .or. wdep(i)%insitu ) then - deallocate( lnsigma ) + if (allocated(lnsigma)) deallocate( lnsigma ) endif !======================================================================= @@ -394,9 +394,12 @@ SUBROUTINE TM5M7_OPTICS_CALCULATE_AOP(KIDIA,KFDIA,KLON,KLEV, nwl,NCONTR, wdep, e - Nullify(Cext_table) - Nullify(a_table) - Nullify(g_table) + !Nullify(Cext_table) + !Nullify(a_table) + !Nullify(g_table) + if (associated(Cext_table)) deallocate(Cext_table) + if (associated(a_table)) deallocate(a_table) + if (associated(g_table)) deallocate(g_table) !do imode = 1,7 diff --git a/ifs-source/arpifs/phys_ec/tm5m7_optics_init.F90 b/ifs-source/arpifs/phys_ec/tm5m7_optics_init.F90 index 0bf4b157..4dbaf5ff 100644 --- a/ifs-source/arpifs/phys_ec/tm5m7_optics_init.F90 +++ b/ifs-source/arpifs/phys_ec/tm5m7_optics_init.F90 @@ -156,7 +156,9 @@ SUBROUTINE TM5M7_OPTICS_INIT(NWAV,WDEP) enddo - deallocate( opac, echamham, segelstein ) + if (allocated(opac)) deallocate( opac) + if (allocated(echamham)) deallocate(echamham ) + if (allocated(segelstein )) deallocate( segelstein ) !-- diff --git a/ifs-source/arpifs/phys_ec/tm5m7_phy2.F90 b/ifs-source/arpifs/phys_ec/tm5m7_phy2.F90 index 39fb3ee9..a36afbb3 100644 --- a/ifs-source/arpifs/phys_ec/tm5m7_phy2.F90 +++ b/ifs-source/arpifs/phys_ec/tm5m7_phy2.F90 @@ -1,11 +1,13 @@ SUBROUTINE TM5M7_PHY2 & - &( YDGEOMETRY, YDMODEL, KIDIA, KFDIA, KLON , KTDIA , KLEV , KFLDX, KLEVX, KTILES, KSTGLO, & + &( YDGEOMETRY, YDMODEL, KIDIA, KFDIA, KLON , KTDIA , KLEV , KFLDX, KLEVX, KTILES, KSTGLO, & & KTRAC, KAERO, KSW, & & PRS1 , PRSF1, PAPHI, PTP , PVERVEL, PCEN , PGEOH, & & PALB , PALBD, PALUVD,& & PAERDEP,PAERLTS,PAERSCC , PAERWS,PAERGUST, PAERUST,& & PSO2DD, PSOIL_TYPE, & - & PCI ,PCLAKE, PINJF, PBLH, PFRTI, PLSM , PSST, PQP , PSNS , & + & PCI ,PCLAKE, & +! & PINJF, & + & PBLH, PFRTI, PLSM , PSST, PQP , PSNS , & & PTL ,PGELAM,PGELAT,PGEMU , PHSDFOR, & & PUP , PVP , PWSA1, PTSPHY, PZ0M, KCHEM, & & PCVL, PCVH, KTVL, KTVH, & @@ -106,6 +108,7 @@ SUBROUTINE TM5M7_PHY2 & USE PARKIND1 , ONLY : JPIM, JPRB USE TM5M7_DATA, ONLY : MODAL_DATA,NMOD, NRDEP USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK +!USE YOMPHYDER, ONLY : STATE_TYPE !USE YOEAERSRC, ONLY : YREAERSRC !USE YOEAERATM, ONLY : YREAERATM !USE YOM_YGFL , ONLY : YGFL @@ -124,6 +127,7 @@ SUBROUTINE TM5M7_PHY2 & TYPE(GEOMETRY) ,INTENT(IN) :: YDGEOMETRY TYPE(MODEL) ,INTENT(INOUT) :: YDMODEL +!TYPE (STATE_TYPE) ,INTENT (IN) :: TENDENCY_CML INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA, KFDIA, KLON, KFLDX, KLEVX INTEGER(KIND=JPIM),INTENT(IN) :: KTDIA, KLEV ,KSTGLO INTEGER(KIND=JPIM),INTENT(IN) :: KSW @@ -144,7 +148,8 @@ SUBROUTINE TM5M7_PHY2 & REAL(KIND=JPRB),INTENT(IN) :: PSO2DD(KLON) REAL(KIND=JPRB),INTENT(IN) :: PSOIL_TYPE(KLON) REAL(KIND=JPRB),INTENT(IN) :: PCI(KLON) , PCLAKE(KLON) ,PSST(KLON), PFRTI(KLON,KTILES), PLSM(KLON), PSNS(KLON) -REAL(KIND=JPRB),INTENT(IN) :: PINJF(KLON) +!REAL(KIND=JPRB),INTENT(IN) :: PINJF(KLON) +REAL(KIND=JPRB) :: ZINJF(KLON) REAL(KIND=JPRB),INTENT(IN) :: PBLH(KLON) REAL(KIND=JPRB),INTENT(IN) :: PGELAM(KLON), PGELAT(KLON), PGEMU(KLON), PHSDFOR(KLON) REAL(KIND=JPRB),INTENT(IN) :: PTL(KLON) , PQP(KLON,KLEV), PUP(KLON) , PVP(KLON) , PWSA1(KLON) @@ -159,7 +164,7 @@ SUBROUTINE TM5M7_PHY2 & REAL(KIND=JPRB),INTENT(INOUT) :: PTENC(KLON,KLEV,KTRAC) REAL(KIND=JPRB),INTENT(OUT) :: PCFLX(KLON,KTRAC) -REAL(KIND=JPRB),INTENT(OUT) :: PAERDDP(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO), PAERSDM(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO), PAERSRC(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO) +REAL(KIND=JPRB),INTENT(INOUT) :: PAERDDP(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO), PAERSDM(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO), PAERSRC(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO) REAL(KIND=JPRB),INTENT(OUT) :: PAERMAP(KLON,5) REAL(KIND=JPRB),INTENT(OUT) :: PAERFLX(KLON,12,9), PAERLIF(KLON,9) REAL(KIND=JPRB),INTENT(OUT) :: PLDAY(KLON), PLISS(KLON), PSO2(KLON), PTDMS(KLON) @@ -189,8 +194,8 @@ SUBROUTINE TM5M7_PHY2 & !Output diagnostics REAL(KIND=JPRB) :: ZVDA (KLON,KLEV) -TYPE(MODAL_DATA),DIMENSION(NMOD), TARGET :: RW_MODE -TYPE(MODAL_DATA),DIMENSION(NMOD), TARGET :: DENS_MODE +!TYPE(MODAL_DATA),DIMENSION(NMOD), TARGET :: RW_MODE +!TYPE(MODAL_DATA),DIMENSION(NMOD), TARGET :: DENS_MODE REAL(KIND=JPHOOK) :: ZHOOK_HANDLE @@ -209,28 +214,21 @@ SUBROUTINE TM5M7_PHY2 & -ASSOCIATE(YDDIM=>YDGEOMETRY%YRDIM,YDDIMV=>YDGEOMETRY%YRDIMV,YDGEM=>YDGEOMETRY%YRGEM,YDMP=>YDGEOMETRY%YRMP, & - & YGFL=>YDMODEL%YRML_GCONF%YGFL, & +ASSOCIATE(YGFL=>YDMODEL%YRML_GCONF%YGFL, & & YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO, & - & YDEAERSRC=>YDMODEL%YRML_PHY_AER%YREAERSRC, & - & YDEAERSNK=>YDMODEL%YRML_PHY_AER%YREAERSNK, & & YDEAERATM=>YDMODEL%YRML_PHY_RAD%YREAERATM, & & YDCHEM=>YDMODEL%YRML_CHEM%YRCHEM, & & YDRIP=>YDMODEL%YRML_GCONF%YRRIP) ASSOCIATE(NACTAERO=>YGFL%NACTAERO, NAERO=>YGFL%NAERO, & - & LAERDRYDP=>YDEAERATM%LAERDRYDP, LAERSEDIM=>YDEAERATM%LAERSEDIM, & - & LAERSURF=>YDEAERATM%LAERSURF, LAERVOL=>YDEAERATM%LAERVOL, & - & NDRYDEP=>YDEAERSNK%NDRYDEP, & - & LCHEM_JOUT=>YDCHEM%LCHEM_JOUT, & - & AERO_SCHEME=>YDCOMPO%AERO_SCHEME, & - & NSTART=>YDRIP%NSTART, LCHEM_DIA=>YDCOMPO%LCHEM_DIA, NCHEM=>YGFL%NCHEM , YAERO=>YGFL%YAERO) + & LAERSURF=>YDEAERATM%LAERSURF, & + & NSTART=>YDRIP%NSTART, LCHEM_DIA=>YDCOMPO%LCHEM_DIA, NCHEM=>YGFL%NCHEM ) ! ------------------------------------------------------------------ !* 1. PROGNOSTIC AEROSOLS - INITIAL COMPUTATIONS ! ------------------------------------------ ZAEROP(:,:,:) = 0.0_JPRB - +ZINJF = 0.0_JPRB LLPRINT=.FALSE. ZAEROP(KIDIA:KFDIA,1:KLEV,1:NACTAERO) = PCEN(KIDIA:KFDIA,1:KLEV,KAERO(1):KAERO(NACTAERO)) @@ -312,12 +310,22 @@ SUBROUTINE TM5M7_PHY2 & ! write(8000+MYPROC,*)jtile,jl,PFRTI(JL,JTILE),PAHFSTI(JL,JTILE),PFRTI(JL,JTILE)*PAHFSTI(JL,JTILE) !write(3334,*)jtile,jl,PFRTI(JL,JTILE),PAHFSTI(JL,JTILE) !end DO + !write(*,*)'line1',KIDIA , KFDIA , KLON , KTDIA, KLEV , KTILES, NSTART, NSTEP , KSTGLO + !write(*,*)'line2',KSW , KTRAC , KAERO + !write(*,*)'line3',PALB , PALBD , PAPHI + !write(*,*)'line4',PAERDEP,PAERLTS, PAERSCC, PAERGUST, ZALT + !write(*,*)'line5',PBCBF , PBCFF , PBCGF, POMBF, POMFF, POMGF + !write(*,*)'line6',PRS1 , PRSF1 , PCI , PCLAKE, PINJF, PBLH, ZDP, PGELAM, PGELAT, PGEMU, PFRTI, PHSDFOR + !write(*,*)'line7',PLSM , PSST , PQP , ZRHO , PSNS , PTP , PTL , PTSPHY, PZ0M, KCHEM + !write(*,*)'line8',ZWND , PWSA1 , PSOIL_TYPE + !write(*,*)'line9',PCVL , PCVH, KTVL, KTVH + !write(*,*)'line10',PLDAY , PAERFLX, PCFLX, PCEN , PTENC, ZEMIDIAG, PSO2SRC,PSO4SRC,PSOA,PSOACO CALL TM5M7_SRC & - &( YDGEOMETRY, YDMODEL, KIDIA , KFDIA , KLON , KTDIA, KLEV , KTILES, NSTART, NSTEP , KSTGLO, & + &( YDGEOMETRY, YDMODEL, KIDIA , KFDIA , KLON , KTDIA, KLEV , KTILES, NSTART, NSTEP , KSTGLO, & & KSW , KTRAC , KAERO, & & PALB , PALBD , PAPHI , & & PAERDEP,PAERLTS, PAERSCC, PAERGUST, ZALT, & - & PRS1 , PRSF1 , PCI , PCLAKE, PINJF, PBLH, ZDP, PGELAM, PGELAT, PGEMU, PFRTI, PHSDFOR, & + & PRS1 , PRSF1 , PCI , PCLAKE, ZINJF, PBLH, ZDP, PGELAM, PGELAT, PGEMU, PFRTI, PHSDFOR, & & PLSM , PSST , PQP , ZRHO , PSNS , PTP , PTL , PTSPHY, PZ0M, KCHEM, & & ZWND , PWSA1 , PSOIL_TYPE, & & PCVL , PCVH, KTVL, KTVH, & diff --git a/ifs-source/arpifs/phys_ec/tm5m7_sediment.F90 b/ifs-source/arpifs/phys_ec/tm5m7_sediment.F90 index ecae19e7..45f07235 100644 --- a/ifs-source/arpifs/phys_ec/tm5m7_sediment.F90 +++ b/ifs-source/arpifs/phys_ec/tm5m7_sediment.F90 @@ -298,8 +298,8 @@ SUBROUTINE TM5M7_SEDIMENT & DO IMODE=1,NMOD - DEALLOCATE(VN_SEDIMENTATION(IMODE)%d2) - DEALLOCATE(VM_SEDIMENTATION(IMODE)%d2) + IF(ASSOCIATED(VN_SEDIMENTATION(IMODE)%d2)) DEALLOCATE(VN_SEDIMENTATION(IMODE)%d2) + IF(ASSOCIATED(VM_SEDIMENTATION(IMODE)%d2)) DEALLOCATE(VM_SEDIMENTATION(IMODE)%d2) ENDDO diff --git a/ifs-source/arpifs/phys_ec/tm5m7_src.F90 b/ifs-source/arpifs/phys_ec/tm5m7_src.F90 index cbc01ac7..dbcdce25 100644 --- a/ifs-source/arpifs/phys_ec/tm5m7_src.F90 +++ b/ifs-source/arpifs/phys_ec/tm5m7_src.F90 @@ -1,5 +1,5 @@ SUBROUTINE TM5M7_SRC & - &( YDGEOMETRY, YDMODEL, KIDIA, KFDIA, KLON , KTDIA, KLEV, KTILES, KSTART, KSTEP ,KSTGLO,& + &( YDGEOMETRY, YDMODEL, KIDIA, KFDIA, KLON , KTDIA, KLEV, KTILES, KSTART, KSTEP ,KSTGLO,& & KSW , KTRAC, KAERO,& & PALB , PALBD, PAPHI ,& & PAERDEP, PAERLTS, PAERSCC, PAERGUST, PALTH ,& @@ -32,6 +32,7 @@ SUBROUTINE TM5M7_SRC & USE PARKIND1 ,ONLY : JPIM, JPRB, JPRD USE YOMHOOK ,ONLY : LHOOK, DR_HOOK, JPHOOK USE YOMLUN ,ONLY : NULOUT, NULERR +!USE YOMPHYDER, ONLY : STATE_TYPE !USE YOM_YGFL ,ONLY : YGFL USE YOMCST ,ONLY : RA, RPI, RDAY, RG USE YOMRIP0 ,ONLY : NINDAT, NSSSSS @@ -67,6 +68,7 @@ SUBROUTINE TM5M7_SRC & TYPE(GEOMETRY) ,INTENT(IN) :: YDGEOMETRY TYPE(MODEL) ,INTENT(INOUT) :: YDMODEL +!TYPE (STATE_TYPE) ,INTENT (IN) :: TENDENCY_CML INTEGER(KIND=JPIM),INTENT(IN) :: KLON, KIDIA, KFDIA INTEGER(KIND=JPIM),INTENT(IN) :: KLEV, KTDIA, KSTGLO INTEGER(KIND=JPIM),INTENT(IN) :: KTILES @@ -164,7 +166,7 @@ SUBROUTINE TM5M7_SRC & & mass2numb_bb_sol, mass2numb_bb_insol, mass2numb_nonbf_sol, mass2numb_nonbf_insol, & & oc2pom -REAL(KIND=JPRB) :: ZSOA(KLON) +!REAL(KIND=JPRB) :: ZSOA(KLON) REAL(KIND=JPRB) :: FRAC_BF(KLON), EMIT(KLON,KLEV) @@ -199,14 +201,12 @@ SUBROUTINE TM5M7_SRC & !----------------------------------------------------------------------- -ASSOCIATE(YDVAB=>YDGEOMETRY%YRVAB,YDVETA=>YDGEOMETRY%YRVETA,YDVFE=>YDGEOMETRY%YRVFE,& - & YDCSGLEG=>YDGEOMETRY%YRCSGLEG,& +ASSOCIATE(YDCSGLEG=>YDGEOMETRY%YRCSGLEG,& & YDEPHY=>YDMODEL%YRML_PHY_EC%YREPHY, & & YDEAERMAP=>YDMODEL%YRML_PHY_AER%YREAERMAP, & & YGFL=>YDMODEL%YRML_GCONF%YGFL, & & YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO, & & YDEAERSRC=>YDMODEL%YRML_PHY_AER%YREAERSRC, & - & YDEAERATM=>YDMODEL%YRML_PHY_RAD%YREAERATM, & & YDRIP=>YDMODEL%YRML_GCONF%YRRIP) @@ -220,9 +220,10 @@ SUBROUTINE TM5M7_SRC & & RCODECA=>YDEAERSRC%RCODECA, RCOVSRA=>YDEAERSRC%RCOVSRA, & & NLOENG=>YDGEOMETRY%YRGEM%NLOENG, & & NGLOBALAT=>YDGEOMETRY%YRMP%NGLOBALAT, & - & YSURF=>YDEPHY%YSURF,LVDFTRAC=>YDEPHY%LVDFTRAC, & - & NCHEM=>YGFL%NCHEM, YCHEM=>YGFL%YCHEM, LAERSOA_CHEM=>YDEAERATM%LAERSOA_CHEM, & + & YSURF=>YDEPHY%YSURF, & & LAERCHEM=>YGFL%LAERCHEM) +!VH maybe 43r3, only?? +!& LAERODIU=>YDCOMPO%LAERODIU, YAERO=>YGFL%YAERO, LFIRE=>YDCOMPO%LFIRE, LINJ=>YDCOMPO%LINJ, & ! N.B.: In ECMWF model conventions, flux going upward from the surface ! are negative @@ -232,17 +233,15 @@ SUBROUTINE TM5M7_SRC & !* 0.1 TIME AND DATE OF THE MODEL ! -------------------------- - IY0=NCCAA(NINDAT) IM0=NMM(NINDAT) ID0=NDD(NINDAT) INC=(NSSSSS + NINT(RSTATI)/NINT(RDAY)) CALL UPDCAL (ID0, IM0, IY0, INC, IDD, IMM, IYY, IMON, -1) IMDATE=IYY*10000+IMM*100+IDD - +ZRAD2DEG = 180._JPRB/RPI !* 0.2 A LENGTH OF DAY INDEX ! --------------------- - DO JL=KIDIA,KFDIA IGLGLO=NGLOBALAT(KSTGLO+JL-1) ZGEMU(JL)=YDCSGLEG%RMU(IGLGLO) ! sine of latitude @@ -331,6 +330,13 @@ SUBROUTINE TM5M7_SRC & ZTAEROK(KIDIA:KFDIA, 1:KLEV, 1:NACTAERO) = PTENC(KIDIA:KFDIA, 1:KLEV, KAERO(1):KAERO(NACTAERO)) PEMIDIAG(KIDIA:KFDIA, 1:NACTAERO)= 0.0_JPRB +ZOMBF = 0.0_JPRB +ZOMFF = 0.0_JPRB +ZOMGF = 0.0_JPRB +ZBCFF = 0.0_JPRB +ZBCBF = 0.0_JPRB +ZBCGF = 0.0_JPRB + !----------------------------------------------------------------------- !* 0.6 SURFACE WIND VARIABLE RELEVANT FOR SS AND DU EMISSIONS @@ -371,7 +377,7 @@ SUBROUTINE TM5M7_SRC & ZHSS=8434._JPRB/1000._JPRB - CALL TM5M7_SRC_SS(YDEAERSRC, KIDIA, KFDIA, KLON, KLEV, & + CALL TM5M7_SRC_SS(KIDIA, KFDIA, KLON, KLEV, & & PCI, PCLAKE, PLSM, PSST, ZWNDSS, & & emis_mass, emis_number ) @@ -387,12 +393,12 @@ SUBROUTINE TM5M7_SRC & PAERFLX(KIDIA:KFDIA,1:12,1:9)=0._JPRB ZAERMAP(KIDIA:KFDIA,1:5)=0._JPRB -CALL TM5M7_SRC_DUST(YDMODEL, KIDIA, KFDIA, KLON, KLEV, KTILES, KSW,& +CALL TM5M7_SRC_DUST(YDEPHY, YDEAERMAP, YDEAERSRC, KIDIA, KFDIA, KLON, KLEV, KTILES, KSW,& & PLSM, ZWNDDU, PSNS, PZ0M, & & PAP(:,KLEV), PTL, PSOIL_TYPE, & & PFRTI, PCVL, PCVH, KTVL, KTVH, & - & emis_mass, emis_number ,PAERFLX,ZGLON,ZGLAT& - ,ZRWPWP,ZRWSAT,ZAERMAP,PALB,PALBD,PWS1,PHSDFOR) + & emis_mass, emis_number ,PAERFLX,ZGLON,ZGLAT, & + & ZRWPWP,ZRWSAT,ZAERMAP,PALB,PALBD,PWS1,PHSDFOR) !write(2345,*) 'test',ptsphy, emis_mass(mode_aci)%d3(KIDIA:KFDIA,91,1),emis_number(mode_aci)%d3(KIDIA:KFDIA,91,1),PAERFLX(:,1,:) !write(2346,*) 'test',ptsphy, emis_mass(mode_aii)%d3(KIDIA:KFDIA,91,1),emis_number(mode_aii)%d3(KIDIA:KFDIA,91,1),PAERFLX(:,1,:) !DO JK=1,KLEV @@ -430,7 +436,7 @@ SUBROUTINE TM5M7_SRC & numbscale_exp = EXP(1.5*(LOG(sigma_lognormal(mode_acs)))**2) mass2numb_fact = 3./(4.*RPI*(numbscale_exp**3)*pom_density) mass2numb_bf_sol = mass2numb_fact/(rad_emi_bf_sol**3) - mass2numb_bb_sol = mass2numb_fact/(rad_emi_bb_sol**3) + !mass2numb_bb_sol = mass2numb_fact/(rad_emi_bb_sol**3) mass2numb_nonbf_sol = mass2numb_ff_sol mass2numb_nonbf_insol = mass2numb_ff_insol @@ -617,7 +623,7 @@ SUBROUTINE TM5M7_SRC & numbscale_exp = EXP(1.5*(LOG(sigma_lognormal(mode_acs)))**2) mass2numb_fact = 3./(4.*RPI*(numbscale_exp**3)*carbon_density) mass2numb_bf_sol = mass2numb_fact/(rad_emi_bf_sol**3) - mass2numb_bb_sol = mass2numb_fact/(rad_emi_bb_sol**3) + !mass2numb_bb_sol = mass2numb_fact/(rad_emi_bb_sol**3) mass2numb_nonbf_sol = mass2numb_ff_sol mass2numb_nonbf_insol = mass2numb_ff_insol @@ -782,6 +788,9 @@ SUBROUTINE TM5M7_SRC & emit(KIDIA:KFDIA,:) = emis_mass(IMODE)%d3(KIDIA:KFDIA,:,inmode) endif ! Change units from kg/m2/sec to kg/kg/sec and update tendency.. + !write(*,*) "JN",JN + !write(*,*) "KAERO(JN)",KAERO(JN) + !write(*,*) "NACTAERO",NACTAERO DO JL=KIDIA,KFDIA ! Should limit to troposphere?! (for now sfc only) !JK=91 @@ -844,8 +853,8 @@ SUBROUTINE TM5M7_SRC & DO IMODE=1,NMOD - DEALLOCATE(EMIS_NUMBER(IMODE)%d3) - DEALLOCATE(EMIS_MASS(IMODE)%d3) + IF(associated(EMIS_NUMBER(IMODE)%d3)) DEALLOCATE(EMIS_NUMBER(IMODE)%d3) + IF(associated(EMIS_MASS(IMODE)%d3)) DEALLOCATE(EMIS_MASS(IMODE)%d3) ENDDO END ASSOCIATE diff --git a/ifs-source/arpifs/phys_ec/tm5m7_src_dust.F90 b/ifs-source/arpifs/phys_ec/tm5m7_src_dust.F90 index b87ec1b0..ae158647 100644 --- a/ifs-source/arpifs/phys_ec/tm5m7_src_dust.F90 +++ b/ifs-source/arpifs/phys_ec/tm5m7_src_dust.F90 @@ -1,13 +1,11 @@ SUBROUTINE TM5M7_SRC_DUST & - &( YDMODEL, KIDIA, KFDIA, KLON, KLEV, KTILES, KSW,& + &( YDEPHY, YDEAERMAP, YDEAERSRC, KIDIA, KFDIA, KLON, KLEV, KTILES, KSW,& & PLSM , PWIND, PSNS, PZ0M, & -! Required as input fields... - & SP, PTL, & + & SP, PTL, & & Psoil_type, & & PFRTI, PCVL, PCVH, KTVL, KTVH, & -! - & emis_mass, emis_number ,PAERFLX,PGLON,& - PGLAT,PRWPWP,PRWSAT,PAERMAP,PALB,PALBD,PWS1,PHSDFOR) + & emis_mass, emis_number ,PAERFLX,PGLON, PGLAT, & + & PRWPWP,PRWSAT,PAERMAP,PALB,PALBD,PWS1,PHSDFOR) !*** * TM5M7_SRC_DUST* - SOURCE TERMS FOR DUST AEROSOLS ! @@ -57,6 +55,7 @@ SUBROUTINE TM5M7_SRC_DUST & USE YOMHOOK ,ONLY : LHOOK, DR_HOOK, JPHOOK USE YOMCST, ONLY : RPI +!USE YOMPHYDER, ONLY : STATE_TYPE USE TM5M7_DATA, ONLY: NMOD, MODE_ACI, MODE_COI, sigma, sigma_lognormal, ddust,iacci,icoai USE TM5M7_EMIS_DATA, ONLY : MODAL_EMISSIONS, & & nclass, nmode,nbin, nats,solspe, nsoilph, nfpar, NTRACED, & @@ -77,7 +76,9 @@ SUBROUTINE TM5M7_SRC_DUST & !USE YOMRIP ,ONLY : YRRIP !USE YOEPHY ,ONLY : YREPHY !USE YOMCT3 , ONLY : NSTEP - +USE YOEPHY , ONLY : TEPHY +USE YOEAERMAP, ONLY : TEAERMAP +USE YOEAERSRC, ONLY : TEAERSRC IMPLICIT NONE !----------------------------------------------------------------------- @@ -85,7 +86,12 @@ SUBROUTINE TM5M7_SRC_DUST & !* 0.1 ARGUMENTS ! --------- -TYPE(MODEL) ,INTENT(INOUT) :: YDMODEL +!TYPE(MODEL) ,INTENT(INOUT) :: YDMODEL +TYPE(TEPHY) ,INTENT(IN) :: YDEPHY +TYPE(TEAERMAP),INTENT(INOUT) :: YDEAERMAP +TYPE(TEAERSRC),INTENT(IN) :: YDEAERSRC + +!TYPE (STATE_TYPE) ,INTENT (IN) :: TENDENCY_CML INTEGER(KIND=JPIM),INTENT(IN) :: KLON INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA INTEGER(KIND=JPIM),INTENT(IN) :: KFDIA @@ -120,7 +126,7 @@ SUBROUTINE TM5M7_SRC_DUST & !* 0.5 LOCAL VARIABLES ! --------------- -INTEGER(KIND=JPIM) :: JL, IVEG, I_S1,I_S11, ID,JK,JAER, INBAER +INTEGER(KIND=JPIM) :: JL, IVEG, I_S1,I_S11, IFF, ID,JK,JAER, INBAER INTEGER(KIND=JPIM) :: IDUST,KK,KKK,KFIRST,KKMIN,NN REAL(KIND=JPRB) :: NORM, XSEA, AREA_FRAC, TT, T_SCALE, DENS, RG1, RG2 ,FDP1,FDP2 REAL(KIND=JPRB) :: VEGET,LAI_MAX,LAI_AVG, LAI_CUR,z0s,dpd,uthp,flux_diam,cultfac1 @@ -142,7 +148,7 @@ SUBROUTINE TM5M7_SRC_DUST & REAL(KIND=JPRB) :: TV_DAT(20) ! Local grid box fractions (0-1) for each of presumeably 20 IFS vegetation types !!! AER -REAL(KIND=JPRB) :: ZGLAT(KLON), ZGLON(KLON),ZLAT,ZLON,ZLONE,ZLONW,ZINCLAT,IFF,ITYPDU +REAL(KIND=JPRB) :: ZGLAT(KLON), ZGLON(KLON),ZLAT,ZLON,ZLONE,ZLONW,ZINCLAT,ITYPDU REAL(KIND=JPRB) :: ZHDD, ZHSS REAL(KIND=JPRB) :: ZDETAH(KLON,KLEV), ZETA(KLON,KLEV) , ZETAH(KLON,0:KLEV) !REAL(KIND=JPRB) :: ZQSAT(KLON,KLEV) , ZRHCL(KLON,KLEV), ZTH(KLON,0:KLEV) @@ -158,11 +164,14 @@ SUBROUTINE TM5M7_SRC_DUST & REAL(KIND=JPRB) :: ZBNDA, ZBNDB, ZBNDC, ZBNDD, ZBNDE, ZBNDF, ZBNDG, ZBNDH, ZBNDI REAL(KIND=JPRB) :: ZBNDJ, ZBNDK, ZBNDL, ZBNDM REAL(KIND=JPRB) :: ZREFRAD, ZREFSPD, ZRADREF,ZLONGB +REAL(KIND=JPRB) :: ZAERDUB LOGICAL :: LLDUST(KLON,12), LLPDUSTS(KLON) !REAL(KIND=JPRB) :: ZFLX_SDUST(KLON,9,12) -REAL(KIND=JPRB), POINTER :: RDDUAER(:), RDUSRCP(:) -REAL(KIND=JPRB), POINTER :: RDDUSRC(:)!!! dimensions changed from (0:50,9) to (9) -INTEGER(KIND=JPIM)::KBINDD +!REAL(KIND=JPRB), POINTER :: RDDUAER(:), RDUSRCP(:) +!REAL(KIND=JPRB), POINTER :: RDDUSRC(:)!!! dimensions changed from (0:50,9) to (9) +REAL(KIND=JPRB) :: RDDUSRC(9) +!INTEGER(KIND=JPIM)::KBINDD +INTEGER(KIND=JPIM), PARAMETER :: KBINDD=3 REAL(KIND=JPHOOK) :: ZHOOK_HANDLE !----------------------------------------------------------------------- @@ -171,24 +180,14 @@ SUBROUTINE TM5M7_SRC_DUST & - ASSOCIATE( YDEPHY=>YDMODEL%YRML_PHY_EC%YREPHY, & - & YDEAERMAP=>YDMODEL%YRML_PHY_AER%YREAERMAP, & - & YGFL=>YDMODEL%YRML_GCONF%YGFL, & - & YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO, & - & YDEAERSRC=>YDMODEL%YRML_PHY_AER%YREAERSRC, & - & YDEAERSNK=>YDMODEL%YRML_PHY_AER%YREAERSNK, & - & YDEAERATM=>YDMODEL%YRML_PHY_RAD%YREAERATM, & - & YDRIP=>YDMODEL%YRML_GCONF%YRRIP) + ! ASSOCIATE( YDEPHY=>YDMODEL%YRML_PHY_EC%YREPHY, & + ! & YDEAERMAP=>YDMODEL%YRML_PHY_AER%YREAERMAP, & + ! & YDEAERSRC=>YDMODEL%YRML_PHY_AER%YREAERSRC) -ASSOCIATE( RSSFLX=>YDEAERSRC%RSSFLX, NDUSRCP=>YDEAERMAP%NDUSRCP, RDDUAER=>YDEAERMAP%RDDUAER, & +ASSOCIATE( NDUSRCP=>YDEAERMAP%NDUSRCP, RDDUAER=>YDEAERMAP%RDDUAER, & & RDUSRCP=>YDEAERMAP%RDUSRCP, & - & RRHO_DD=>YDEAERSNK%RRHO_DD, & - & NAERWND=>YDEAERSRC%NAERWND, & - & NDDUST=>YDEAERSRC%NDDUST, NDMSO=>YDEAERSRC%NDMSO, NSSALT=>YDEAERSRC%NSSALT, & - & NTYPAER=>YDEAERATM%NTYPAER, RAERDUB=>YDEAERSRC%RAERDUB, & - & RCODECA=>YDEAERSRC%RCODECA, RCOVSRA=>YDEAERSRC%RCOVSRA, & - & RDDUSRC=>YDEAERSRC%RDDUSRC, RDMSMIN=>YDEAERSRC%RDMSMIN, & + & NDDUST=>YDEAERSRC%NDDUST, & & NALBEDOSCHEME=>YDEPHY%NALBEDOSCHEME) ! LE4ALB to NALBEDOSCHEME ! & RFCTSS=>YDEAERSRC%RFCTSS, ROMPHIL=>YDEAERSRC%ROMPHIL, & ! & ROMPHOB=>YDEAERSRC%ROMPHOB, RSIDECA=>YDEAERSRC%RSIDECA, & @@ -224,6 +223,7 @@ SUBROUTINE TM5M7_SRC_DUST & !19) H ! Interrupted Forest !20) L ! Water and Land Mixtures +ZFLX_SDUST(KIDIA:KFDIA,1:9,1:12)=0._JPRB if (NDDUST==4)then ! Make local copy: SOIL_TYPE(KIDIA:KFDIA)=PSOIL_TYPE(KIDIA:KFDIA) @@ -478,7 +478,7 @@ SUBROUTINE TM5M7_SRC_DUST & ELSE !>>> TvN ! Use minimum value for roughness length. - ! VH convert PZ0M from [m] to [cm] + ! VH convert PZ0M from [m] to [cm] !z0(JL) = z0_min !max(z0_min,PZ0M(JL)*100._JPRB ) z0(JL) = max(z0_min,PZ0M(JL)*100._JPRB ) !write(3000,*)z0(JL),z0_min @@ -830,7 +830,7 @@ SUBROUTINE TM5M7_SRC_DUST & !ZGRDLAT2=ZGRDLAT*0.55_JPRB !ZDDUAER(:) = 1.00_JPRB -KBINDD=3 +!KBINDD=3 RDDUAER(:) = 0.0_JPRB RDDUSRC(:)= 0.0_JPRB @@ -1292,7 +1292,7 @@ SUBROUTINE TM5M7_SRC_DUST & INBAER=0 -RAERDUB=1.E-11_JPRB +ZAERDUB=1.E-11_JPRB !- ECMWF dust emission fluxes come in either 3- or 10-size bins ! 0.03 - 0.55 - 0.9 - 20. @@ -1340,7 +1340,7 @@ SUBROUTINE TM5M7_SRC_DUST & LLPDUSTS(JL)=.TRUE. - PAERMAP(JL,5)=RAERDUB * ZDUEMPOT(JL,1) ! for diagnostics only + PAERMAP(JL,5)=ZAERDUB * ZDUEMPOT(JL,1) ! for diagnostics only ENDIF ENDIF ENDDO @@ -1364,7 +1364,7 @@ SUBROUTINE TM5M7_SRC_DUST & !-- ECMWF formulation IF (LLPDUSTS(JL)) THEN - ZDEP2(JL)= RAERDUB * ZDUEMPOT(JL,JAER) + ZDEP2(JL)= ZAERDUB * ZDUEMPOT(JL,JAER) ZSCC2(JL)= 20._JPRB !-- Present formulation in MACC (June'11, still kept June'13) @@ -1404,11 +1404,11 @@ SUBROUTINE TM5M7_SRC_DUST & !-- PCFLX in kg m-2 s-1 DO JAER=1,KBINDD - INBAER=INBAER+1 + !INBAER=INBAER+1 DO JL=KIDIA,KFDIA - IF (LLDUST(JL,NDDUST) .AND. ZFLX_SDUST(JL,JAER,NDDUST) > 0._JPRB) THEN - ZFLX_SDUST(JL,JAER,NDDUST)=ZFLX_SDUST(JL,JAER,NDDUST) - ENDIF + !!!$IF (LLDUST(JL,NDDUST) .AND. ZFLX_SDUST(JL,JAER,NDDUST) > 0._JPRB) THEN + !!!$ ZFLX_SDUST(JL,JAER,NDDUST)=ZFLX_SDUST(JL,JAER,NDDUST) + !!!$ENDIF !PCFLX(JL,KAERO(INBAER))=-ZFLX_SDUST(JL,JAER,NDDUST) * 1.E+00_JPRB if (JAER<2) then !---- @@ -1441,7 +1441,7 @@ SUBROUTINE TM5M7_SRC_DUST & !!$ ENDDO -END ASSOCIATE +!END ASSOCIATE END ASSOCIATE IF (LHOOK) CALL DR_HOOK('TM5M7_SRC_DUST',1,ZHOOK_HANDLE) END SUBROUTINE TM5M7_SRC_DUST diff --git a/ifs-source/arpifs/phys_ec/tm5m7_src_dust_init.F90 b/ifs-source/arpifs/phys_ec/tm5m7_src_dust_init.F90 index 8d61717c..164b4be5 100644 --- a/ifs-source/arpifs/phys_ec/tm5m7_src_dust_init.F90 +++ b/ifs-source/arpifs/phys_ec/tm5m7_src_dust_init.F90 @@ -68,7 +68,8 @@ SUBROUTINE TM5M7_SRC_DUST_INIT REAL(KIND=JPRB) :: BB, CCC, DDD, EE, FF, DP, XK, STOTAL,STOTALV REAL(KIND=JPRB) :: SU, SUV, SU_LOC, SU_LOCV, XL, XM, XN, XNV -REAL, DIMENSION(:), ALLOCATABLE :: su_class, su_classv, utest +!REAL, DIMENSION(:), ALLOCATABLE :: su_class, su_classv, utest +REAL(KIND=JPRB) :: su_class(nclass), su_classv(nclass), utest(nats) REAL(KIND=JPHOOK) :: ZHOOK_HANDLE !----------------------------------------------------------------------- @@ -79,9 +80,9 @@ SUBROUTINE TM5M7_SRC_DUST_INIT ! only needed within "initial" -ALLOCATE( su_class ( nclass ) ) -ALLOCATE( su_classv( nclass ) ) -ALLOCATE( utest ( nats ) ) +!ALLOCATE( su_class ( nclass ) ) +!ALLOCATE( su_classv( nclass ) ) +!ALLOCATE( utest ( nats ) ) ! --------------------------------------------- @@ -200,7 +201,7 @@ SUBROUTINE TM5M7_SRC_DUST_INIT END DO !ns (soil type) -DEALLOCATE( su_class, su_classV, utest ) +!DEALLOCATE( su_class, su_classV, utest ) IF (LHOOK) CALL DR_HOOK('TM5M7_SRC_DUST_INIT',1,ZHOOK_HANDLE) diff --git a/ifs-source/arpifs/phys_ec/tm5m7_src_ss.F90 b/ifs-source/arpifs/phys_ec/tm5m7_src_ss.F90 index cb3ff0a9..0ef64d02 100644 --- a/ifs-source/arpifs/phys_ec/tm5m7_src_ss.F90 +++ b/ifs-source/arpifs/phys_ec/tm5m7_src_ss.F90 @@ -1,5 +1,5 @@ SUBROUTINE TM5M7_SRC_SS & - &( YDEAERSRC, KIDIA, KFDIA, KLON, KLEV, & + &( KIDIA, KFDIA, KLON, KLEV, & & PCI , PCLAKE, PLSM , PSST, PWIND, & & emis_mass, emis_number & &) @@ -49,8 +49,9 @@ SUBROUTINE TM5M7_SRC_SS & USE PARKIND1 ,ONLY : JPIM ,JPRB USE YOMHOOK ,ONLY : LHOOK, DR_HOOK, JPHOOK -USE YOEAERSRC ,ONLY : TEAERSRC!YREAERSRC +!USE YOEAERSRC ,ONLY : TEAERSRC!YREAERSRC !USE YOEAERSNK, ONLY : YREAERSNK +!USE YOMPHYDER, ONLY : STATE_TYPE USE YOMCST, ONLY : RPI USE TM5M7_DATA, ONLY: NMOD, MODE_ACS, MODE_COS, sigma_lognormal, SS_DENSITY USE TM5M7_EMIS_DATA, ONLY : MODAL_EMISSIONS, radius_ssa, radius_ssc @@ -61,7 +62,8 @@ SUBROUTINE TM5M7_SRC_SS & !* 0.1 ARGUMENTS ! --------- -TYPE(TEAERSRC) ,INTENT(IN) :: YDEAERSRC +!TYPE(TEAERSRC) ,INTENT(IN) :: YDEAERSRC +!TYPE (STATE_TYPE) ,INTENT (IN) :: TENDENCY_CML INTEGER(KIND=JPIM),INTENT(IN) :: KLON INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA INTEGER(KIND=JPIM),INTENT(IN) :: KFDIA @@ -88,7 +90,7 @@ SUBROUTINE TM5M7_SRC_SS & !----------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('TM5M7_SRC_SS',0,ZHOOK_HANDLE) -ASSOCIATE(RSSFLX=>YDEAERSRC%RSSFLX) +!ASSOCIATE(RSSFLX=>YDEAERSRC%RSSFLX) !>>> TvN @@ -288,7 +290,7 @@ SUBROUTINE TM5M7_SRC_SS & ! vertically distribute according to sector ! CALL emission_vdist_by_sector( splittype, 'SS', region, emis_temp(region), emis3d, status ) - emis_mass (mode_acs)%d3(KIDIA:KFDIA,KLEV,4) = mass(KIDIA:KFDIA) !kg/m2/sec + emis_mass(mode_acs)%d3(KIDIA:KFDIA,KLEV,4) = mass(KIDIA:KFDIA) !kg/m2/sec !=================== @@ -367,7 +369,7 @@ SUBROUTINE TM5M7_SRC_SS & -END ASSOCIATE +!END ASSOCIATE IF (LHOOK) CALL DR_HOOK('TM5M7_SRC_SS',1,ZHOOK_HANDLE) END SUBROUTINE TM5M7_SRC_SS diff --git a/ifs-source/arpifs/phys_radi/ice_effective_radius.F90 b/ifs-source/arpifs/phys_radi/ice_effective_radius.F90 index a9e5cb55..d4aee888 100644 --- a/ifs-source/arpifs/phys_radi/ice_effective_radius.F90 +++ b/ifs-source/arpifs/phys_radi/ice_effective_radius.F90 @@ -43,7 +43,7 @@ SUBROUTINE ICE_EFFECTIVE_RADIUS & ! INPUT ARGUMENTS ! *** Array dimensions and ranges -TYPE(TERAD) ,INTENT(INOUT):: YDERAD +TYPE(TERAD) ,INTENT(IN) :: YDERAD TYPE(TSPP_CONFIG) ,INTENT(IN) :: YDSPP_CONFIG INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA ! Start column to process INTEGER(KIND=JPIM),INTENT(IN) :: KFDIA ! End column to process diff --git a/ifs-source/arpifs/phys_radi/raddrv.F90 b/ifs-source/arpifs/phys_radi/raddrv.F90 index e884238a..59ada695 100644 --- a/ifs-source/arpifs/phys_radi/raddrv.F90 +++ b/ifs-source/arpifs/phys_radi/raddrv.F90 @@ -658,14 +658,16 @@ SUBROUTINE RADDRV(YDGEOMETRY,YDFIELDS,YDMODEL,KGPTOT,KFLDS,KBLOCKS,PGPIN) IF (NACTAERO > 0) THEN - DO JAER=1,NAERO - DO JK=1,NFLEVG -!DIR$ IVDEP - DO JL=IST,IEND - ZAEROT(JSTGLO+JL-1,JK,JAER)=GFL(JL,JK,YAERO(JAER)%MP9_PH,IBL) - ENDDO - ENDDO - ENDDO + IF (TRIM(AERO_SCHEME) == "aer" ) THEN + DO JAER=1,NAERO + DO JK=1,NFLEVG + !DIR$ IVDEP + DO JL=IST,IEND + ZAEROT(JSTGLO+JL-1,JK,JAER)=GFL(JL,JK,YAERO(JAER)%MP9_PH,IBL) + ENDDO + ENDDO + ENDDO + ENDIF!nstep DO JAER=1,14 DO JK=1,NFLEVG @@ -684,8 +686,8 @@ SUBROUTINE RADDRV(YDGEOMETRY,YDFIELDS,YDMODEL,KGPTOT,KFLDS,KBLOCKS,PGPIN) ENDDO ENDDO - IF (NSTEP /= YDRIP%NSTART) THEN - IF (TRIM(AERO_SCHEME) == "tm5m7" .or. TRIM(AERO_SCHEME) == "hamm7" ) THEN + IF (TRIM(AERO_SCHEME) == "tm5m7" .or. TRIM(AERO_SCHEME) == "hamm7" ) THEN + IF (NSTEP /= YDRIP%NSTART) THEN DO JAER=1,14 DO JK=1,NFLEVG DO JL=IST,IEND @@ -702,8 +704,8 @@ SUBROUTINE RADDRV(YDGEOMETRY,YDFIELDS,YDMODEL,KGPTOT,KFLDS,KBLOCKS,PGPIN) ENDDO ENDDO ENDDO - ENDIF! aero_scheme - ENDIF!nstep + ENDIF!nstep + ENDIF!aero_scheme ENDIF! NACTAERO diff --git a/ifs-source/arpifs/phys_radi/radiation_scheme.F90 b/ifs-source/arpifs/phys_radi/radiation_scheme.F90 index 0647b94f..2729fd5f 100644 --- a/ifs-source/arpifs/phys_radi/radiation_scheme.F90 +++ b/ifs-source/arpifs/phys_radi/radiation_scheme.F90 @@ -215,7 +215,7 @@ SUBROUTINE RADIATION_SCHEME & TYPE(THERMODYNAMICS_TYPE) :: THERMODYNAMICS TYPE(GAS_TYPE) :: GAS TYPE(CLOUD_TYPE) :: YLCLOUD -TYPE(AEROSOL_TYPE) :: AEROSOL, AEROSOl_HAM +TYPE(AEROSOL_TYPE) :: AEROSOL TYPE(FLUX_TYPE) :: FLUX ! Mass mixing ratio of ozone (kg/kg) @@ -285,7 +285,8 @@ SUBROUTINE RADIATION_SCHEME & ASSOCIATE(YDRADIATION=>YDMODEL%YRML_PHY_RAD%YRADIATION, & & YRERAD=>YDMODEL%YRML_PHY_RAD%YRERAD, & - & YDSPP_CONFIG=>YDMODEL%YRML_GCONF%YRSPP_CONFIG) + & YDSPP_CONFIG=>YDMODEL%YRML_GCONF%YRSPP_CONFIG, & + & YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO) ASSOCIATE(NCLOUDACT=>YRERAD%NCLOUDACT, RAD_CONFIG=>YDRADIATION%RAD_CONFIG, & & NWEIGHT_UV=>YDRADIATION%NWEIGHT_UV, & & IBAND_UV =>YDRADIATION%IBAND_UV(:), & @@ -294,24 +295,29 @@ SUBROUTINE RADIATION_SCHEME & & IBAND_PAR =>YDRADIATION%IBAND_PAR(:), & & WEIGHT_PAR=>YDRADIATION%WEIGHT_PAR(:), & & TROP_BG_AER_MASS_EXT=>YDRADIATION%TROP_BG_AER_MASS_EXT, & - & STRAT_BG_AER_MASS_EXT=>YDRADIATION%STRAT_BG_AER_MASS_EXT) + & STRAT_BG_AER_MASS_EXT=>YDRADIATION%STRAT_BG_AER_MASS_EXT, & + & AERO_SCHEME=>YDCOMPO%AERO_SCHEME) + ! Allocate memory in radiation objects CALL SINGLE_LEVEL%ALLOCATE(KLON, YRERAD%NSW, YRERAD%NLWEMISS, & & USE_SW_ALBEDO_DIRECT=.TRUE.) CALL THERMODYNAMICS%ALLOCATE(KLON, KLEV, USE_H2O_SAT=.TRUE.) CALL GAS%ALLOCATE(KLON, KLEV) CALL YLCLOUD%ALLOCATE(KLON, KLEV) + IF (YDMODEL%YRML_PHY_RAD%YREAERATM%LAERCCN & & .OR. YDMODEL%YRML_PHY_RAD%YREAERATM%LAERRRTM & & .OR. YRERAD%NAERMACC == 1) THEN - CALL AEROSOL%ALLOCATE(KLON, 1, KLEV, KAEROSOL) ! MACC aerosols + IF ( TRIM(AERO_SCHEME) == "hamm7" ) THEN + CALL AEROSOL%ALLOCATE_DIRECT(RAD_CONFIG, KLON, 1, KLEV) ! HAM aerosols + ELSE + CALL AEROSOL%ALLOCATE(KLON, 1, KLEV, KAEROSOL) ! MACC aerosols (Number of columns,istartlev, iendlev, number of SW+LW bands) + ENDIF ELSE CALL AEROSOL%ALLOCATE(KLON, 1, KLEV, 6) ! Tegen climatology ENDIF CALL FLUX%ALLOCATE(RAD_CONFIG, 1, KLON, KLEV) - CALL AEROSOL_HAM%ALLOCATE(KLON, 1, KLEV, YRERAD%NTSW) ! HAM aerosols - !(Number of columns,istartlev, iendlev, number of SW+LW bands) ! Set thermodynamic profiles: simply copy over the half-level ! pressure and temperature @@ -355,7 +361,7 @@ SUBROUTINE RADIATION_SCHEME & ! the thermodynamics structure !CALL thermodynamics%calc_saturation_wrt_liquid(KIDIA, KFDIA) -! Set single-level fileds +! Set single-level fields SINGLE_LEVEL%SOLAR_IRRADIANCE = PSOLAR_IRRADIANCE SINGLE_LEVEL%COS_SZA(KIDIA:KFDIA) = PMU0(KIDIA:KFDIA) SINGLE_LEVEL%SKIN_TEMPERATURE(KIDIA:KFDIA) = PTEMPERATURE_SKIN(KIDIA:KFDIA) @@ -533,34 +539,36 @@ SUBROUTINE RADIATION_SCHEME & & .OR. YDMODEL%YRML_PHY_RAD%YREAERATM%LAERRRTM & & .OR. YRERAD%NAERMACC == 1) THEN - - ! MACC aerosol from climatology or prognostic aerosol variables - - ! this is already in mass mixing ratio units with the required array - ! orientation so we can copy it over directly - ! AB need to cap the minimum mass mixing ratio/AOD to avoid instability - ! in case of negative values in input - DO JAER = 1,KAEROSOL - DO JLEV = 1,KLEV - DO JLON = KIDIA,KFDIA - AEROSOL%MIXING_RATIO(JLON,JLEV,JAER) = MAX(PAEROSOL(JLON,JLEV,JAER),0.0_JPRB) + IF ( .NOT. TRIM(AERO_SCHEME) == "hamm7" ) THEN ! Could also test on AEROSOL%is_direct for a more general + + ! MACC aerosol from climatology or prognostic aerosol variables - + ! this is already in mass mixing ratio units with the required array + ! orientation so we can copy it over directly + ! AB need to cap the minimum mass mixing ratio/AOD to avoid instability + ! in case of negative values in input + DO JAER = 1,KAEROSOL + DO JLEV = 1,KLEV + DO JLON = KIDIA,KFDIA + AEROSOL%MIXING_RATIO(JLON,JLEV,JAER) = MAX(PAEROSOL(JLON,JLEV,JAER),0.0_JPRB) + ENDDO ENDDO ENDDO - ENDDO - IF (YRERAD%NAERMACC == 1) THEN - ! Add the tropospheric and stratospheric backgrounds contained in the - ! old Tegen arrays - this is very ugly! - IF (TROP_BG_AER_MASS_EXT > 0.0_JPRB) THEN - AEROSOL%MIXING_RATIO(KIDIA:KFDIA,:,ITYPE_TROP_BG_AER)& - & = AEROSOL%MIXING_RATIO(KIDIA:KFDIA,:,ITYPE_TROP_BG_AER)& - & + PAEROSOL_OLD(KIDIA:KFDIA,1,:)& - & / (ZLAYER_MASS * TROP_BG_AER_MASS_EXT) - ENDIF - IF (STRAT_BG_AER_MASS_EXT > 0.0_JPRB) THEN - AEROSOL%MIXING_RATIO(KIDIA:KFDIA,:,ITYPE_STRAT_BG_AER)& - & = AEROSOL%MIXING_RATIO(KIDIA:KFDIA,:,ITYPE_STRAT_BG_AER)& - & + PAEROSOL_OLD(KIDIA:KFDIA,6,:)& - & / (ZLAYER_MASS * STRAT_BG_AER_MASS_EXT) + IF (YRERAD%NAERMACC == 1) THEN + ! Add the tropospheric and stratospheric backgrounds contained in the + ! old Tegen arrays - this is very ugly! + IF (TROP_BG_AER_MASS_EXT > 0.0_JPRB) THEN + AEROSOL%MIXING_RATIO(KIDIA:KFDIA,:,ITYPE_TROP_BG_AER)& + & = AEROSOL%MIXING_RATIO(KIDIA:KFDIA,:,ITYPE_TROP_BG_AER)& + & + PAEROSOL_OLD(KIDIA:KFDIA,1,:)& + & / (ZLAYER_MASS * TROP_BG_AER_MASS_EXT) + ENDIF + IF (STRAT_BG_AER_MASS_EXT > 0.0_JPRB) THEN + AEROSOL%MIXING_RATIO(KIDIA:KFDIA,:,ITYPE_STRAT_BG_AER)& + & = AEROSOL%MIXING_RATIO(KIDIA:KFDIA,:,ITYPE_STRAT_BG_AER)& + & + PAEROSOL_OLD(KIDIA:KFDIA,6,:)& + & / (ZLAYER_MASS * STRAT_BG_AER_MASS_EXT) + ENDIF ENDIF ENDIF ELSE @@ -583,25 +591,30 @@ SUBROUTINE RADIATION_SCHEME & ENDDO ENDIF -!real(jprb), allocatable, dimension(:,:,:) :: & -! & od_sw, ssa_sw, g_sw, & ! Shortwave optical properties - - -AEROSOL_HAM%od_sw(KIDIA:KFDIA,:,:) = 0.0_JPRB -AEROSOL_HAM%ssa_sw(KIDIA:KFDIA,:,:) = 0.0_JPRB -AEROSOL_HAM%g_sw(KIDIA:KFDIA,:,:) = 0.0_JPRB -!Alaakso: Optical properties of HAM aerosols - Should be 0 if not used -IF (YRERAD%NAEROOPT>0) THEN -!already weighted (see aer_phy3_layer) SW - AEROSOL_HAM%od_sw(KIDIA:KFDIA,:,1:YRERAD%NTSW) =PAEROM7_TAU(KIDIA:KFDIA,:,1:YRERAD%NTSW) - AEROSOL_HAM%ssa_sw(KIDIA:KFDIA,:,1:YRERAD%NTSW) =PAEROM7_SSA(KIDIA:KFDIA,:,1:YRERAD%NTSW) - AEROSOL_HAM%g_sw(KIDIA:KFDIA,:,1:YRERAD%NTSW) =PAEROM7_ASYM(KIDIA:KFDIA,:,1:YRERAD%NTSW) -!!LW, need to make sure that PAEROM7_TAULW = 0, when NAEROOPT=1 (TM5 optics, no LW opt) -!aerosol_opt%aod(KIDIA:KFDIA,:,YRERAD%NTSW+1:YRERAD%NTSW+STRATO_CMIP6_NTB)=PAEROM7_TAULW(KIDIA:KFDIA,:,1:STRATO_CMIP6_NTB) -!aerosol_opt%ssa(KIDIA:KFDIA,:,YRERAD%NTSW+1:YRERAD%NTSW+STRATO_CMIP6_NTB)=0.0_JPRB !only absorbtion for LW -!aerosol_opt%asym(KIDIA:KFDIA,:,YRERAD%NTSW+1:YRERAD%NTSW+STRATO_CMIP6_NTB)=0.0_JPRB + +! Optical properties of HAM aerosols - Should be 0 if not used +IF (RAD_CONFIG%DO_SW) THEN + IF (ALLOCATED(AEROSOL%od_sw) ) AEROSOL%od_sw(KIDIA:KFDIA,:,:) = 0.0_JPRB + IF (ALLOCATED(AEROSOL%ssa_sw)) AEROSOL%ssa_sw(KIDIA:KFDIA,:,:) = 0.0_JPRB + IF (ALLOCATED(AEROSOL%g_sw) ) AEROSOL%g_sw(KIDIA:KFDIA,:,:) = 0.0_JPRB ENDIF +IF (( TRIM(AERO_SCHEME) == "hamm7") .AND. YDMODEL%YRML_PHY_RAD%YREAERATM%LAERRRTM) THEN + IF (YRERAD%NAEROOPT>0) THEN + IF (RAD_CONFIG%DO_SW) THEN + !already weighted (see aer_phy3_layer) SW + AEROSOL%od_sw(KIDIA:KFDIA,:,1:YRERAD%NTSW) = PAEROM7_TAU(KIDIA:KFDIA,:,1:YRERAD%NTSW) + AEROSOL%ssa_sw(KIDIA:KFDIA,:,1:YRERAD%NTSW) = PAEROM7_SSA(KIDIA:KFDIA,:,1:YRERAD%NTSW) + AEROSOL%g_sw(KIDIA:KFDIA,:,1:YRERAD%NTSW) = PAEROM7_ASYM(KIDIA:KFDIA,:,1:YRERAD%NTSW) + ENDIF + ! IF (RAD_CONFIG%DO_LW) THEN + !!LW, need to make sure that PAEROM7_TAULW = 0, when NAEROOPT=1 (TM5 optics, no LW opt) + !aerosol_opt%aod(KIDIA:KFDIA,:,YRERAD%NTSW+1:YRERAD%NTSW+STRATO_CMIP6_NTB)=PAEROM7_TAULW(KIDIA:KFDIA,:,1:STRATO_CMIP6_NTB) + !aerosol_opt%ssa(KIDIA:KFDIA,:,YRERAD%NTSW+1:YRERAD%NTSW+STRATO_CMIP6_NTB)=0.0_JPRB !only absorbtion for LW + !aerosol_opt%asym(KIDIA:KFDIA,:,YRERAD%NTSW+1:YRERAD%NTSW+STRATO_CMIP6_NTB)=0.0_JPRB + ! ENDIF + ENDIF +ENDIF ! Convert ozone Pa*kg/kg to kg/kg @@ -630,7 +643,7 @@ SUBROUTINE RADIATION_SCHEME & ! Call radiation scheme CALL RADIATION(KLON, KLEV, KIDIA, KFDIA, RAD_CONFIG,& - & SINGLE_LEVEL, THERMODYNAMICS, GAS, YLCLOUD, AEROSOL, AEROSOL_HAM, FLUX) + & SINGLE_LEVEL, THERMODYNAMICS, GAS, YLCLOUD, AEROSOL, FLUX) ! Check fluxes are within physical bounds IF (YRERAD%NDUMPBADINPUTS /= 0 & @@ -761,7 +774,6 @@ SUBROUTINE RADIATION_SCHEME & CALL GAS%DEALLOCATE CALL YLCLOUD%DEALLOCATE CALL AEROSOL%DEALLOCATE -CALL AEROSOL_HAM%DEALLOCATE CALL FLUX%DEALLOCATE END ASSOCIATE diff --git a/ifs-source/arpifs/phys_radi/radintg.F90 b/ifs-source/arpifs/phys_radi/radintg.F90 index 836d787f..9f1e0158 100644 --- a/ifs-source/arpifs/phys_radi/radintg.F90 +++ b/ifs-source/arpifs/phys_radi/radintg.F90 @@ -485,6 +485,7 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& & YSURF=>YDEPHY%YSURF, & & LAERNITRATE=>YDCOMPO%LAERNITRATE, & & LAERSOA=>YDCOMPO%LAERSOA, & + & AERO_SCHEME=>YDCOMPO%AERO_SCHEME, & & LAERVOL=>YDEAERATM%LAERVOL, & & LAPPROXLWUPDATE=>YDERAD%LAPPROXLWUPDATE, & & LAPPROXSWUPDATE=>YDERAD%LAPPROXSWUPDATE, LDIAGFORCING=>YDERAD%LDIAGFORCING, & @@ -654,10 +655,11 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& IHTI =INDRAD(INEXT,KLEV+1,.TRUE.) IAERO =INDRAD(INEXT,IRADAER*KLEV,.NOT.LRAYFM .AND. LLACTAERO .AND. NAERMACC == 0) -IHAMAEROAOD =INDRAD(INEXT,NTSW*KLEV,.TRUE.) -IHAMAEROSSA =INDRAD(INEXT,NTSW*KLEV,.TRUE.) -IHAMAEROASYM =INDRAD(INEXT,NTSW*KLEV,.TRUE.) -!IHAMAEROAODLW =INDRAD(STRATO_CMIP6_NTB*KLEV,.TRUE.) +IF (TRIM(AERO_SCHEME) == "hamm7" ) THEN + IHAMAEROAOD =INDRAD(INEXT,NTSW*KLEV,.TRUE.) + IHAMAEROSSA =INDRAD(INEXT,NTSW*KLEV,.TRUE.) + IHAMAEROASYM =INDRAD(INEXT,NTSW*KLEV,.TRUE.) +ENDIF @@ -672,8 +674,10 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& !IC22 =INDRAD(INEXT,KLEV,.TRUE.) !ICL4 =INDRAD(INEXT,KLEV,.TRUE.) -IRE_LIQ = INDRAD(INEXT,KLEV, NCLOUDACT > 0) -IRE_ICE = INDRAD(INEXT,KLEV, NCLOUDACT > 0) +IF (TRIM(AERO_SCHEME) == "hamm7" ) THEN + IRE_LIQ = INDRAD(INEXT,KLEV, NCLOUDACT > 0) + IRE_ICE = INDRAD(INEXT,KLEV, NCLOUDACT > 0) +ENDIF IINEND =INEXT-1 ! end of input variables @@ -967,73 +971,79 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& ! ENDDO ! ENDIF !-- debug + IF (TRIM(AERO_SCHEME) == "hamm7" ) THEN - DO JAERO=1,IRADAER2 - IAE=(JAERO-1)*KLEV - ZRGP(1:IL,IAERO+IAE:IAERO+IAE+KLEV-1,IB) =MAX(REPSCAER, PAERO(IBEG:IEND,1:KLEV,JAERO)) - IF (JAERO <= NTYPAER(1)) THEN - ZRGP(1:IL,IAERO+IAE:IAERO+IAE+KLEV-1,IB) = ZRGP(1:IL,IAERO+IAE:IAERO+IAE+KLEV-1,IB) * RSS_RH80_MASSFAC - ENDIF - ENDDO - - IF (.NOT. LAERCHEM .AND. (LAERSOA .OR. LAERNITRATE .OR. LAERVOL)) THEN - DO JAERO=IRADAER2+1,IRADAER2+ISUPP + !A.Laakso + IF (NSTEP == YDRIP%NSTART) THEN + DO JAERO=1,YDERAD%NTSW IAE=(JAERO-1)*KLEV - ZRGP(1:IL,IAERO+IAE:IAERO+IAE+KLEV-1,IB) =MAX(REPSCAER, PAERO(IBEG:IEND,1:KLEV,JAERO)) - ENDDO - ENDIF + ZRGP(1:IL,IHAMAEROAOD+IAE:IHAMAEROAOD+IAE+KLEV-1,IB) =REPSCAER + ZRGP(1:IL,IHAMAEROSSA+IAE:IHAMAEROSSA+IAE+KLEV-1,IB) =0._JPRB + ZRGP(1:IL,IHAMAEROASYM+IAE:IHAMAEROASYM+IAE+KLEV-1,IB) =0._JPRB + END DO - ! SR 05 2018 if LAERCHEM, shift one variable - IF (LAERCHEM .AND. (LAERSOA .OR. LAERNITRATE .OR. LAERVOL)) THEN - DO JAERO=IRADAER2+1,IRADAER2+ISUPP - IAE=(JAERO-1)*KLEV - ZRGP(1:IL,IAERO+IAE:IAERO+IAE+KLEV-1,IB) =MAX(REPSCAER, PAERO(IBEG:IEND,1:KLEV,JAERO-1)) - ENDDO - ENDIF + !DO JAERO=1,STRATO_CMIP6_NTB + !IAE=(JAERO-1)*KLEV + !ZRGP(1:IL,IHAMAEROAODLW+IAE:IHAMAEROAODLW+IAE+KLEV-1,IB) =0._JPRB + !END DO - ! SR 06 2020 LAERCHEM and no nitrate/SOA - IF (LAERCHEM .AND. .NOT. (LAERSOA .OR. LAERNITRATE .OR. LAERVOL)) THEN - JAERO=IRADAER2+1 - IAE=(JAERO-1)*KLEV - ZRGP(1:IL,IAERO+IAE:IAERO+IAE+KLEV-1,IB) =REPSCAER - ENDIF + ELSE - ! M7 aerosol - !A.Laakso - IF (NSTEP == YDRIP%NSTART) THEN - DO JAERO=1,YDERAD%NTSW - IAE=(JAERO-1)*KLEV - ZRGP(1:IL,IHAMAEROAOD+IAE:IHAMAEROAOD+IAE+KLEV-1,IB) =REPSCAER - ZRGP(1:IL,IHAMAEROSSA+IAE:IHAMAEROSSA+IAE+KLEV-1,IB) =0._JPRB - ZRGP(1:IL,IHAMAEROASYM+IAE:IHAMAEROASYM+IAE+KLEV-1,IB) =0._JPRB - END DO - - !DO JAERO=1,STRATO_CMIP6_NTB - !IAE=(JAERO-1)*KLEV - !ZRGP(1:IL,IHAMAEROAODLW+IAE:IHAMAEROAODLW+IAE+KLEV-1,IB) =0._JPRB - !END DO + DO JAERO=1,YDMODEL%YRML_PHY_RAD%YRERAD%NTSW + IAE=(JAERO-1)*KLEV + ZRGP(1:IL,IHAMAEROAOD+IAE:IHAMAEROAOD+IAE+KLEV-1,IB) =MAX(REPSCAER, PAEROTAU(IBEG:IEND,1:KLEV,JAERO)) + ENDDO - ELSE + DO JAERO=1,YDMODEL%YRML_PHY_RAD%YRERAD%NTSW + IAE=(JAERO-1)*KLEV + ZRGP(1:IL,IHAMAEROSSA+IAE:IHAMAEROSSA+IAE+KLEV-1,IB) =MAX(0._JPRB,PAEROSSA(IBEG:IEND,1:KLEV,JAERO)) + ENDDO - DO JAERO=1,YDMODEL%YRML_PHY_RAD%YRERAD%NTSW - IAE=(JAERO-1)*KLEV - ZRGP(1:IL,IHAMAEROAOD+IAE:IHAMAEROAOD+IAE+KLEV-1,IB) =MAX(REPSCAER, PAEROTAU(IBEG:IEND,1:KLEV,JAERO)) - ENDDO + DO JAERO=1,YDMODEL%YRML_PHY_RAD%YRERAD%NTSW + IAE=(JAERO-1)*KLEV + ZRGP(1:IL,IHAMAEROASYM+IAE:IHAMAEROASYM+IAE+KLEV-1,IB) =MAX(0._JPRB, PAEROASYM(IBEG:IEND,1:KLEV,JAERO)) + ENDDO - DO JAERO=1,YDMODEL%YRML_PHY_RAD%YRERAD%NTSW - IAE=(JAERO-1)*KLEV - ZRGP(1:IL,IHAMAEROSSA+IAE:IHAMAEROSSA+IAE+KLEV-1,IB) =MAX(0._JPRB,PAEROSSA(IBEG:IEND,1:KLEV,JAERO)) - ENDDO + !DO JAERO=1,STRATO_CMIP6_NTB + !IAE=(JAERO-1)*KLEV + !ZRGP(1:IL,IHAMAEROAODLW+IAE:IHAMAEROAODLW+IAE+KLEV-1,IB) =MAX(0._JPRB, PAEROTAULW(IBEG:IEND,1:KLEV,JAERO)) + !ENDDO - DO JAERO=1,YDMODEL%YRML_PHY_RAD%YRERAD%NTSW - IAE=(JAERO-1)*KLEV - ZRGP(1:IL,IHAMAEROASYM+IAE:IHAMAEROASYM+IAE+KLEV-1,IB) =MAX(0._JPRB, PAEROASYM(IBEG:IEND,1:KLEV,JAERO)) - ENDDO + ENDIF + + + ELSE + + DO JAERO=1,IRADAER2 + IAE=(JAERO-1)*KLEV + ZRGP(1:IL,IAERO+IAE:IAERO+IAE+KLEV-1,IB) =MAX(REPSCAER, PAERO(IBEG:IEND,1:KLEV,JAERO)) + IF (JAERO <= NTYPAER(1)) THEN + ZRGP(1:IL,IAERO+IAE:IAERO+IAE+KLEV-1,IB) = ZRGP(1:IL,IAERO+IAE:IAERO+IAE+KLEV-1,IB) * RSS_RH80_MASSFAC + ENDIF + ENDDO + + IF (.NOT. LAERCHEM .AND. (LAERSOA .OR. LAERNITRATE .OR. LAERVOL)) THEN + DO JAERO=IRADAER2+1,IRADAER2+ISUPP + IAE=(JAERO-1)*KLEV + ZRGP(1:IL,IAERO+IAE:IAERO+IAE+KLEV-1,IB) =MAX(REPSCAER, PAERO(IBEG:IEND,1:KLEV,JAERO)) + ENDDO + ENDIF + + ! SR 05 2018 if LAERCHEM, shift one variable + IF (LAERCHEM .AND. (LAERSOA .OR. LAERNITRATE .OR. LAERVOL)) THEN + DO JAERO=IRADAER2+1,IRADAER2+ISUPP + IAE=(JAERO-1)*KLEV + ZRGP(1:IL,IAERO+IAE:IAERO+IAE+KLEV-1,IB) =MAX(REPSCAER, PAERO(IBEG:IEND,1:KLEV,JAERO-1)) + ENDDO + ENDIF + + ! SR 06 2020 LAERCHEM and no nitrate/SOA + IF (LAERCHEM .AND. .NOT. (LAERSOA .OR. LAERNITRATE .OR. LAERVOL)) THEN + JAERO=IRADAER2+1 + IAE=(JAERO-1)*KLEV + ZRGP(1:IL,IAERO+IAE:IAERO+IAE+KLEV-1,IB) =REPSCAER + ENDIF - !DO JAERO=1,STRATO_CMIP6_NTB - !IAE=(JAERO-1)*KLEV - !ZRGP(1:IL,IHAMAEROAODLW+IAE:IHAMAEROAODLW+IAE+KLEV-1,IB) =MAX(0._JPRB, PAEROTAULW(IBEG:IEND,1:KLEV,JAERO)) - !ENDDO ENDIF ENDIF @@ -1053,6 +1063,7 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& ENDIF +IF (TRIM(AERO_SCHEME) == "hamm7" ) THEN IF (NCLOUDACT > 0) THEN IF (NSTEP == YDRIP%NSTART) THEN ZRGP(1:IL,IRE_LIQ:IRE_LIQ+KLEV-1,IB) = 2.E-6_JPRB @@ -1062,6 +1073,7 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& ZRGP(1:IL,IRE_ICE:IRE_ICE+KLEV-1,IB) = PRE_ICE(IBEG:IEND,1:KLEV) END IF END IF +END IF ZRGP(1:IL,IHPR:IHPR+KLEV ,IB) =ZCAPH (1:IL,1:KLEV+1) diff --git a/ifs-source/arpifs/phys_radi/suecrad.F90 b/ifs-source/arpifs/phys_radi/suecrad.F90 index f9227e72..6ace54c0 100644 --- a/ifs-source/arpifs/phys_radi/suecrad.F90 +++ b/ifs-source/arpifs/phys_radi/suecrad.F90 @@ -773,7 +773,7 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) ELSE NAERMACC=0 ENDIF -LAER3D=.FALSE. !T=3d CAMS aerosol climatology +LAER3D=.TRUE. !T=3d CAMS aerosol climatology NMCLAT=1 @@ -2114,11 +2114,11 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) !* 6. INITIALIZE AEROSOL OPTICAL PARAMETERS AND DISTRIBUTION ! ------------------------------------------------------ !*** M7 -write(*,*) "NPROMA",NPROMA -write(*,*) "NFLEVG",NFLEVG -write(*,*) "NTSW",NTSW -write(*,*) "NGPBLKS",NGPBLKS -write(*,*) "AERO_SCHEME",TRIM(AERO_SCHEME) +!write(*,*) "NPROMA",NPROMA +!write(*,*) "NFLEVG",NFLEVG +!write(*,*) "NTSW",NTSW +!write(*,*) "NGPBLKS",NGPBLKS +!write(*,*) "AERO_SCHEME",TRIM(AERO_SCHEME) IF (NACTAERO > 0) THEN IF (TRIM(AERO_SCHEME) == "tm5m7" .or. TRIM(AERO_SCHEME) == "hamm7" ) THEN diff --git a/ifs-source/arpifs/setup/su_surf_flds.F90 b/ifs-source/arpifs/setup/su_surf_flds.F90 index 27dcf30a..736ce4ef 100644 --- a/ifs-source/arpifs/setup/su_surf_flds.F90 +++ b/ifs-source/arpifs/setup/su_surf_flds.F90 @@ -194,7 +194,7 @@ SUBROUTINE SU_SURF_FLDS(YDDIMV,YDSURF,YDMODEL,LDVERBOSE) & NGRBALUVI,NGRBALUVV,NGRBALUVG,& & NGRBALNII,NGRBALNIV,NGRBALNIG,& & NGRBAERDEP,NGRBAERLTS,NGRBAERSCC,NGRBAERDSF, NGRBAERDSZ, & - & NGRBAERLS13, NGRBSOILTYPE, & + & NGRBAERLS13, NGRBSOILTYPE, NGRBINJFIRE, & & NGRBAERLS01,NGRBAERLS02,NGRBAERLS10,NGRBAERLS03,NGRBAERLS04,NGRBAERLS11,& & NGRBAERLS05,NGRBAERLS06,NGRBAERLS12,NGRBAERLS07,NGRBAERLS08,NGRBAERLS09,& & NGRBAEODSS ,NGRBAEODDU ,NGRBAEODOM ,NGRBAEODBC ,NGRBAEODSU ,& @@ -317,12 +317,13 @@ SUBROUTINE SU_SURF_FLDS(YDDIMV,YDSURF,YDMODEL,LDVERBOSE) & NCOM=>YDDPHY%NCOM, NVEXTRRAD=>YDDPHY%NVEXTRRAD, NCXP=>YDDPHY%NCXP, & & NVECOUT=>YDDPHY%NVECOUT, NSURFEXCTLMAX=>YDMSE%NSURFEXCTLMAX, & & LMSE=>YDARPHY%LMSE, NFPCLI=>YLNAMFPSCI%NFPCLI,NFPSWI=>YLNAMFPSCI%NFPSWI, & - & YGHG=>YGFL%YGHG, & + & YGHG=>YGFL%YGHG, NGEMS=>YGFL%NGEMS, NCHEM_FLX=> YGFL%NCHEM_FLX, & & YCHEM=>YGFL%YCHEM, NGHG=>YGFL%NGHG, & & NCHEM_TC=>YGFL%NCHEM_TC, NCHEM_DV=>YGFL%NCHEM_DV, & & NCHEM_FLXO=>YGFL%NCHEM_FLXO, NCHEM=>YGFL%NCHEM, & & NCHEM_WDFLX=>YGFL%NCHEM_WDFLX, NCHEM_DDFLX=>YGFL%NCHEM_DDFLX, & & NEMIS2D=>YGFL%NEMIS2D, NEMIS2D_DESC=>YDCOMPO%NEMIS2D_DESC, YEMIS2D_DESC=>YDCOMPO%YEMIS2D_DESC, & + & LAEROSFC=>YDCOMPO%LAEROSFC, LINJ=> YDCOMPO%LINJ, & & NEMIS2DAUX=>YGFL%NEMIS2DAUX, YEMIS2DAUX_DESC=>YDCOMPO%YEMIS2DAUX_DESC, & & NACTAERO=>YGFL%NACTAERO, YAERO=>YGFL%YAERO, YAERO_DESC=>YDEAERATM%YAERO_DESC, & & NGP5_OOPS=>YDSURF%NGP5_OOPS, NTRAJ_CST_OOPS=>YDSURF%NTRAJ_CST_OOPS, & @@ -1312,9 +1313,18 @@ SUBROUTINE SU_SURF_FLDS(YDDIMV,YDSURF,YDMODEL,LDVERBOSE) ENDIF +! IF (NGEMS > 0 .OR. NCHEM_FLX > 0) THEN +! IREQIN=-1 +! IF (LINJ) IREQIN=1 +! IREQIN=0 +! !YSD_VF%YINJF => YSD_VF%YVF(YSD_VFD%IPTR) +! !CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YINJF ,& +! !& KGRIB=NGRBINJFIRE ,CDNAME='BIOMASS BURN. EMIS HEIGHT. ',KTRAJ=2,KREQIN=IREQIN) +! ENDIF !TM5/M7 ancillary data + IF (TRIM(AERO_SCHEME) == "tm5m7" .or. TRIM(AERO_SCHEME) == "hamm7" ) THEN YSD_VF%YSOILTYPE => YSD_VF%YVF(YSD_VFD%IPTR) !VH 14 Feb. 2024: for time being de-activate request for field 210055. But this has to be re-activated rather sooner than latesr, likely. !IF (TRIM(AERO_SCHEME) == "tm5m7" .or. TRIM(AERO_SCHEME) == "hamm7" ) THEN @@ -1324,6 +1334,7 @@ SUBROUTINE SU_SURF_FLDS(YDDIMV,YDSURF,YDMODEL,LDVERBOSE) !END IF CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YSOILTYPE, & & KGRIB=NGRBSOILTYPE, CDNAME='TM5M7 soil type',KTRAJ=2,KREQIN=IREQIN) + END IF diff --git a/ifs-source/arpifs/setup/sudefo_gflattr.F90 b/ifs-source/arpifs/setup/sudefo_gflattr.F90 index b95cb186..952d9c03 100644 --- a/ifs-source/arpifs/setup/sudefo_gflattr.F90 +++ b/ifs-source/arpifs/setup/sudefo_gflattr.F90 @@ -130,6 +130,7 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) & YAEROCLIM_NL=>YGFL%YAEROCLIM_NL, & & YQ_NL=>YGFL%YQ_NL, NGFL_EXT=>YGFL%NGFL_EXT, YEFB1_NL=>YGFL%YEFB1_NL, & & YLRCH4_NL=>YGFL%YLRCH4_NL, YEZDIAG_NL=>YGFL%YEZDIAG_NL, YG_NL=>YGFL%YG_NL, & + & YCDNC_NL=>YGFL%YCDNC_NL, YICNC_NL=>YGFL%YICNC_NL, YRE_LIQ_NL=>YGFL%YRE_LIQ_NL, YRE_ICE_NL=>YGFL%YRE_ICE_NL, & !eehol: added cloud properties & YERA40_NL=>YGFL%YERA40_NL, YTTE_NL=>YGFL%YTTE_NL, NSLDIA=>YGFL%NSLDIA, & & YNOGW_NL=>YGFL%YNOGW_NL, YCOMP=>YGFL%YCOMP, YIRAD_NL=>YGFL%YIRAD_NL, & & YUNEBH_NL=>YGFL%YUNEBH_NL, YDAL_NL=>YGFL%YDAL_NL, YRKTQV_NL=>YGFL%YRKTQV_NL, & @@ -299,6 +300,14 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YPHYCTY_NL%LGP=.FALSE. ENDIF +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%LGP =.TRUE. +YICNC_NL%LGP =.TRUE. +YRE_LIQ_NL%LGP =.TRUE. +YRE_ICE_NL%LGP =.TRUE. +!END IF + ! * Default for attribute LSP ! (some of them will be readjusted after some namelists reading). IF (LECMWF) THEN @@ -431,6 +440,13 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YRSPEC_NL%LSP=.FALSE. YPHYCTY_NL%LSP=.FALSE. ENDIF +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%LSP=.FALSE. +YICNC_NL%LSP=.FALSE. +YRE_LIQ_NL%LSP=.FALSE. +YRE_ICE_NL%LSP=.FALSE. +!END IF ! * Default for attribute NREQIN IF (ANY(SPREAD(ICONF,1,4) == (/1,302,601,801/))) THEN @@ -613,6 +629,13 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YRSPEC_NL%NREQIN=0 YPHYCTY_NL%NREQIN=0 ENDIF +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%NREQIN=0 +YICNC_NL%NREQIN=0 +YRE_LIQ_NL%NREQIN=-1 +YRE_ICE_NL%NREQIN=-1 +!END IF ! * Default for attribute REFVALI ! REFVALI is useful only when NREQIN=-1, @@ -797,6 +820,12 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YPHYCTY_NL%REFVALI= ZREFVALI_USELESS YFSD_NL%REFVALI= ZREFVALI_USELESS ENDIF +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%REFVALI = ZREFVALI_USELESS +YICNC_NL%REFVALI = ZREFVALI_USELESS +YRE_LIQ_NL%REFVALI = 4.0_JPRB +YRE_ICE_NL%REFVALI = 20.0_JPRB ! * Default for attribute LREQOUT ! ky: I don't know exactly what to do for conf other than 1,601,801. @@ -934,6 +963,15 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YPHYCTY_NL%LREQOUT= .FALSE. ENDIF + +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%LREQOUT = .FALSE. +YICNC_NL%LREQOUT = .FALSE. +YRE_LIQ_NL%LREQOUT = .FALSE. +YRE_ICE_NL%LREQOUT = .FALSE. +!END IF + ! * Default for attribute LGPINGP IF (LECMWF) THEN LLEC_GPINGP=ANY(SPREAD(ICONF,1,4) == (/1,302,601,801/)) .OR. & @@ -1067,7 +1105,14 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YPHYCTY_NL%LGPINGP= .FALSE. ENDIF ENDIF -YRSPEC_NL%LGPINGP= .TRUE. +YRSPEC_NL%LGPINGP = .TRUE. +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%LGPINGP = .FALSE. +YICNC_NL%LGPINGP = .FALSE. +YRE_LIQ_NL%LGPINGP = .FALSE. +YRE_ICE_NL%LGPINGP = .FALSE. +!END IF ! * Default for attribute LTRAJIO IF (LECMWF) THEN @@ -1184,6 +1229,14 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YPHYCTY_NL%LTRAJIO= .FALSE. ENDIF +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%LTRAJIO = .FALSE. +YICNC_NL%LTRAJIO = .FALSE. +YRE_LIQ_NL%LTRAJIO = .FALSE. +YRE_ICE_NL%LTRAJIO = .FALSE. +!END IF + ! * Default for attribute LDIAG YQ_NL%LDIAG = .FALSE. YL_NL%LDIAG = .FALSE. @@ -1228,6 +1281,15 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YRSPEC_NL%LDIAG= .FALSE. YPHYCTY_NL%LDIAG= .FALSE. + +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%LDIAG = .FALSE. +YICNC_NL%LDIAG = .FALSE. +YRE_LIQ_NL%LDIAG = .FALSE. +YRE_ICE_NL%LDIAG = .FALSE. +!END IF + ! * Default for attribute LADV IF (LECMWF) THEN IF (YDDYNA%LSLAG) THEN @@ -1560,6 +1622,13 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) ! True means TL/AD SL advection of GFL fields uses ! trajectory wind only, making 4D-VAR univariate ! apart from the observation operators +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%LADV = .FALSE. +YICNC_NL%LADV = .FALSE. +YRE_LIQ_NL%LADV = .FALSE. +YRE_ICE_NL%LADV = .FALSE. +!END IF IF (LECMWF) THEN IF (YDDYNA%LSLAG) THEN @@ -1622,6 +1691,14 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YRSPEC_NL%LPT= .FALSE. YPHYCTY_NL%LPT= .FALSE. +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%LPT = .FALSE. +YICNC_NL%LPT = .FALSE. +YRE_LIQ_NL%LPT = .FALSE. +YRE_ICE_NL%LPT = .FALSE. +!END IF + ! * Default for attribute LPC YQ_NL%LPC = .TRUE. YL_NL%LPC = .TRUE. @@ -1665,6 +1742,13 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YRKTQC_NL%LPC= .FALSE. YRSPEC_NL%LPC= .FALSE. YPHYCTY_NL%LPC= .FALSE. +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%LPC = .FALSE. +YICNC_NL%LPC = .FALSE. +YRE_LIQ_NL%LPC = .FALSE. +YRE_ICE_NL%LPC = .FALSE. +!END IF ! * Default for attribute CNAME ! This value is automatically computed in SUGFL2. @@ -1791,6 +1875,15 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YPHYCTY_NL%NCOUPLING= 0 ENDIF + +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%NCOUPLING = 0 +YICNC_NL%NCOUPLING = 0 +YRE_LIQ_NL%NCOUPLING = 0 +YRE_ICE_NL%NCOUPLING = 0 +!END IF + ! * Default for attribute REFVALC ! REFVALC is useful only when NCOUPLING=-1, ! but to avoid unitialised values, REFVALC is set to -999 in the other cases. @@ -1883,6 +1976,14 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YPHYCTY_NL%REFVALC= ZREFVALC_USELESS ENDIF +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%REFVALC= ZREFVALC_USELESS +YICNC_NL%REFVALC= ZREFVALC_USELESS +YRE_LIQ_NL%REFVALC= ZREFVALC_USELESS +YRE_ICE_NL%REFVALC= ZREFVALC_USELESS +!END IF + ! * Default for attribute LTDIABLIN YQ_NL%LTDIABLIN=.FALSE. YL_NL%LTDIABLIN=.FALSE. @@ -1927,6 +2028,14 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YRSPEC_NL%LTDIABLIN=.FALSE. YPHYCTY_NL%LTDIABLIN=.FALSE. +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%LTDIABLIN= .FALSE. +YICNC_NL%LTDIABLIN= .FALSE. +YRE_LIQ_NL%LTDIABLIN= .FALSE. +YRE_ICE_NL%LTDIABLIN= .FALSE. +!END IF + ! * Default for attribute LHORTURB YQ_NL%LHORTURB=.FALSE. YL_NL%LHORTURB=.FALSE. @@ -1971,6 +2080,16 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YRSPEC_NL%LHORTURB=.FALSE. YPHYCTY_NL%LHORTURB=.FALSE. + +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%LHORTURB= .FALSE. +YICNC_NL%LHORTURB= .FALSE. +YRE_LIQ_NL%LHORTURB= .FALSE. +YRE_ICE_NL%LHORTURB= .FALSE. +!END IF + + ! * Default for attribute LSLHD YQ_NL%LSLHD=.FALSE. YL_NL%LSLHD=.FALSE. @@ -2015,6 +2134,16 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YRSPEC_NL%LSLHD=.FALSE. YPHYCTY_NL%LSLHD=.FALSE. + +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%LSLHD = .FALSE. +YICNC_NL%LSLHD = .FALSE. +YRE_LIQ_NL%LSLHD = .FALSE. +YRE_ICE_NL%LSLHD = .FALSE. +!END IF + + ! * Default for attribute LCOMAD YQ_NL%LCOMAD=.FALSE. YL_NL%LCOMAD=.FALSE. @@ -2058,6 +2187,14 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YRSPEC_NL%LCOMAD=.FALSE. YPHYCTY_NL%LCOMAD=.FALSE. +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%LCOMAD= .FALSE. +YICNC_NL%LCOMAD= .FALSE. +YRE_LIQ_NL%LCOMAD= .FALSE. +YRE_ICE_NL%LCOMAD= .FALSE. +!END IF + ! * Default for attribute LVSPLIP YQ_NL%LVSPLIP=.FALSE. YL_NL%LVSPLIP=.FALSE. @@ -2102,6 +2239,14 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YRSPEC_NL%LVSPLIP=.FALSE. YPHYCTY_NL%LVSPLIP=.FALSE. +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%LVSPLIP = .FALSE. +YICNC_NL%LVSPLIP = .FALSE. +YRE_LIQ_NL%LVSPLIP = .FALSE. +YRE_ICE_NL%LVSPLIP = .FALSE. +!END IF + ! * Default for attribute LQM IF (LECMWF) THEN ! ky: this must be checked by ECMWF @@ -2239,6 +2384,16 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YPHYCTY_NL%LQM=.FALSE. ENDIF + +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%LQM = .FALSE. +YICNC_NL%LQM = .FALSE. +YRE_LIQ_NL%LQM = .FALSE. +YRE_ICE_NL%LQM = .FALSE. +!END IF + + ! * Default for attribute LQMH YQ_NL%LQMH=.FALSE. YL_NL%LQMH=.FALSE. @@ -2283,6 +2438,16 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YRSPEC_NL%LQMH=.FALSE. YPHYCTY_NL%LQMH=.FALSE. + +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%LQMH = .FALSE. +YICNC_NL%LQMH = .FALSE. +YRE_LIQ_NL%LQMH = .FALSE. +YRE_ICE_NL%LQMH = .FALSE. +!END IF + + ! * Default for attribute LQM3D IF (LECMWF) THEN YQ_NL%LQM3D=.FALSE. @@ -2337,6 +2502,14 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YRSPEC_NL%LQM3D=.FALSE. YPHYCTY_NL%LQM3D=.FALSE. +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%LQM3D = .FALSE. +YICNC_NL%LQM3D = .FALSE. +YRE_LIQ_NL%LQM3D = .FALSE. +YRE_ICE_NL%LQM3D = .FALSE. +!END IF + ! * Default for attribute LQML3D YQ_NL%LQML3D=.FALSE. YL_NL%LQML3D=.FALSE. @@ -2381,6 +2554,14 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YRSPEC_NL%LQML3D=.FALSE. YPHYCTY_NL%LQML3D=.FALSE. +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%LQML3D = .FALSE. +YICNC_NL%LQML3D = .FALSE. +YRE_LIQ_NL%LQML3D = .FALSE. +YRE_ICE_NL%LQML3D = .FALSE. +!END IF + ! * Default for attribute LHV YQ_NL%LHV=.FALSE. YL_NL%LHV=.FALSE. @@ -2425,6 +2606,15 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YRSPEC_NL%LHV=.FALSE. YPHYCTY_NL%LHV=.FALSE. +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%LHV = .FALSE. +YICNC_NL%LHV = .FALSE. +YRE_LIQ_NL%LHV = .FALSE. +YRE_ICE_NL%LHV = .FALSE. +!END IF + + ! * Default for attribute LINTLIN YQ_NL%LINTLIN=.FALSE. YL_NL%LINTLIN=.FALSE. @@ -2469,6 +2659,13 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YRSPEC_NL%LINTLIN=.FALSE. YPHYCTY_NL%LINTLIN=.FALSE. +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%LINTLIN = .FALSE. +YICNC_NL%LINTLIN = .FALSE. +YRE_LIQ_NL%LINTLIN = .FALSE. +YRE_ICE_NL%LINTLIN = .FALSE. +!END IF ! * Default for attribute LVWENO IF (LECMWF) THEN @@ -2617,6 +2814,14 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YRSPEC_NL%LMASSFIX=.FALSE. YPHYCTY_NL%LMASSFIX=.FALSE. +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%LMASSFIX = .FALSE. +YICNC_NL%LMASSFIX = .FALSE. +YRE_LIQ_NL%LMASSFIX = .FALSE. +YRE_ICE_NL%LMASSFIX = .FALSE. +!END IF + ! * Default for attribute LNEGFIX (mass fixer attribute) YQ_NL%LNEGFIX=.FALSE. YL_NL%LNEGFIX=.FALSE. @@ -2661,6 +2866,14 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YRSPEC_NL%LNEGFIX=.FALSE. YPHYCTY_NL%LNEGFIX=.FALSE. +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%LNEGFIX = .FALSE. +YICNC_NL%LNEGFIX = .FALSE. +YRE_LIQ_NL%LNEGFIX = .FALSE. +YRE_ICE_NL%LNEGFIX = .FALSE. +!END IF + ! * Default for attribute BETAMFBC YQ_NL%BETAMFBC=1.0_JPRB YL_NL%BETAMFBC=1.0_JPRB @@ -2705,6 +2918,14 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YRSPEC_NL%BETAMFBC=1.0_JPRB YPHYCTY_NL%BETAMFBC=1.0_JPRB +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%BETAMFBC = 1.0_JPRB +YICNC_NL%BETAMFBC = 1.0_JPRB +YRE_LIQ_NL%BETAMFBC = 1.0_JPRB +YRE_ICE_NL%BETAMFBC = 1.0_JPRB +!END IF + ! * Default for attribute LQMGRID YQ_NL%LMGRID=.FALSE. YL_NL%LMGRID=.FALSE. @@ -2809,6 +3030,14 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YRSPEC_NL%LPHY=.FALSE. YPHYCTY_NL%LPHY=.FALSE. +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%LPHY = .FALSE. +YICNC_NL%LPHY = .FALSE. +YRE_LIQ_NL%LPHY = .FALSE. +YRE_ICE_NL%LPHY = .FALSE. +!END IF + ! ------------------------------------------------------------------ ! 1b Set implicit default values for GFL attributes diff --git a/ifs-source/arpifs/setup/sugfl1.F90 b/ifs-source/arpifs/setup/sugfl1.F90 index 2411242c..b8735a08 100644 --- a/ifs-source/arpifs/setup/sugfl1.F90 +++ b/ifs-source/arpifs/setup/sugfl1.F90 @@ -108,8 +108,9 @@ SUBROUTINE SUGFL1(YDMODEL,KGFLCONF) & LCHEM_WEAK_CH4_RELAXATION, & & LCHEM_CONVSCAV, LCHEM_CSHAPE, LCHEM_AEROI, LCHEM_LCOMESO, LCHEM_LCOCSTCLIM, LCHEM_LCOLIMIT, & & LCOMPO_DCDD, & - & LAERNITRATE, LAEREQSAM4CLIM, LAERSOA, LAERSOA_COUPLED, LCHEM_REVCHEM, LAERRESUSPENSION, LAERNUCL, & + & LAERNITRATE, LAEREQSAM4CLIM, LAERSOA, LINJ, LAEROSFC, LAERSOA_COUPLED, LCHEM_REVCHEM, LAERRESUSPENSION, LAERNUCL, & & LCHEM_ARPCLIM +!LH & LAERNITRATE, LAEREQSAM4CLIM, LAERSOA, LINJ, LAERSOA_COUPLED, LCHEM_REVCHEM, LAERRESUSPENSION, LAERNUCL, & REAL(KIND=JPRB), POINTER :: RCHEM_DIA_PERIOD @@ -222,6 +223,8 @@ SUBROUTINE SUGFL1(YDMODEL,KGFLCONF) LAEREQSAM4CLIM => YDCOMPO%LAEREQSAM4CLIM LAERRESUSPENSION => YDCOMPO%LAERRESUSPENSION LAERSOA => YDCOMPO%LAERSOA +LINJ => YDCOMPO%LINJ +LAEROSFC => YDCOMPO%LAEROSFC LAERSOA_COUPLED => YDCOMPO%LAERSOA_COUPLED LAERNUCL => YDCOMPO%LAERNUCL RCHEM_DIA_PERIOD => YDCOMPO%RCHEM_DIA_PERIOD @@ -663,6 +666,7 @@ SUBROUTINE SUGFL1(YDMODEL,KGFLCONF) LAEREQSAM4CLIM=.FALSE. LAERRESUSPENSION=.FALSE. LAERSOA=.FALSE. +!LH LINJ=.FALSE. LAERSOA_COUPLED=.FALSE. LAERNUCL=.TRUE. KGHG_CHEMTEND_CH4=0_JPIM @@ -689,7 +693,7 @@ SUBROUTINE SUGFL1(YDMODEL,KGFLCONF) AERO_SCHEME_OP_OBS = AERO_SCHEME - WRITE(NULOUT,'(11(A,L2),A,I2)')& + WRITE(NULOUT,'(12(A,L2),A,I2)')& & ' LCHEM_DIA=',LCHEM_DIA,& & ' LCHEM_DDFLX=',LCHEM_DDFLX,& & ' LCOMPO_DDFLX_DIR=',LCOMPO_DDFLX_DIR,& diff --git a/ifs-source/arpifs/setup/sugfl2.F90 b/ifs-source/arpifs/setup/sugfl2.F90 index 16dd6df6..84b50b88 100644 --- a/ifs-source/arpifs/setup/sugfl2.F90 +++ b/ifs-source/arpifs/setup/sugfl2.F90 @@ -145,7 +145,7 @@ SUBROUTINE SUGFL2(YDEPHY,YDML_GCONF,YDCOMPO) & NFSD=>YGFL%NFSD, YFSD=>YGFL%YFSD, YFSD_NL=>YGFL%YFSD_NL, & & NEDRP=>YGFL%NEDRP, YEDRP=>YGFL%YEDRP, YEDRP_NL=>YGFL%YEDRP_NL, & & YLIMA_NL=>YDML_GCONF%YGFL%YLIMA_NL, NLIMA=>YDML_GCONF%YGFL%NLIMA, & - & NEMIS3D_DESC=>YDCOMPO%NEMIS3D_DESC, YEMIS3D_DESC=>YDCOMPO%YEMIS3D_DESC) + & NEMIS3D_DESC=>YDCOMPO%NEMIS3D_DESC, YEMIS3D_DESC=>YDCOMPO%YEMIS3D_DESC, AERO_SCHEME=>YDCOMPO%AERO_SCHEME) !------------------------------------------------------------------------- ! 1.1 Initial settings. @@ -259,14 +259,16 @@ SUBROUTINE SUGFL2(YDEPHY,YDML_GCONF,YDCOMPO) INCR=INCR+1 !--> eehol: added cdnc,icnc,liq and ice eff rad - YGFL%YCDNC => YGFL%YCOMP(JPGFL-INCR) - INCR = INCR+1 - YGFL%YICNC => YGFL%YCOMP(JPGFL-INCR) - INCR = INCR+1 - YGFL%YRE_LIQ => YGFL%YCOMP(JPGFL-INCR) - INCR = INCR+1 - YGFL%YRE_ICE => YGFL%YCOMP(JPGFL-INCR) - INCR = INCR+1 + IF(TRIM(AERO_SCHEME)=="hamm7") THEN + YGFL%YCDNC => YGFL%YCOMP(JPGFL-INCR) + INCR = INCR+1 + YGFL%YICNC => YGFL%YCOMP(JPGFL-INCR) + INCR = INCR+1 + YGFL%YRE_LIQ => YGFL%YCOMP(JPGFL-INCR) + INCR = INCR+1 + YGFL%YRE_ICE => YGFL%YCOMP(JPGFL-INCR) + INCR = INCR+1 + ENDIF !<-- eehol @@ -776,6 +778,7 @@ SUBROUTINE SUGFL2(YDEPHY,YDML_GCONF,YDCOMPO) !eehol: define cloud properties + IF(TRIM(AERO_SCHEME)=="hamm7") THEN IF (YCDNC_NL%LGP) THEN IGFLPTR=NUMFLDS+1 YGFL%YCDNC=>YGFL%YCOMP(IGFLPTR) @@ -820,6 +823,7 @@ SUBROUTINE SUGFL2(YDEPHY,YDML_GCONF,YDCOMPO) & LDERS=.FALSE.,LD5=.FALSE.,LDT1=.FALSE.,LDDIFF=.FALSE.,LDCONV=.FALSE., & & LDMASSFIX=.FALSE.) END IF + END IF !eehol diff --git a/ifs-source/arpifs/setup/sugfl3.F90 b/ifs-source/arpifs/setup/sugfl3.F90 index bf4fbd90..6d89676d 100644 --- a/ifs-source/arpifs/setup/sugfl3.F90 +++ b/ifs-source/arpifs/setup/sugfl3.F90 @@ -98,7 +98,7 @@ SUBROUTINE SUGFL3(YDDIMV,YDMODEL) ! ------------------------------------------------------------------ IF (LHOOK) CALL DR_HOOK('SUGFL3',0,ZHOOK_HANDLE) ASSOCIATE(YDDYN=>YDMODEL%YRML_DYN%YRDYN,YGFL=>YDMODEL%YRML_GCONF%YGFL,YDEPHY=>YDMODEL%YRML_PHY_EC%YREPHY, & - & YDPHY=>YDMODEL%YRML_PHY_MF%YRPHY,YDSIMPHL=>YDMODEL%YRML_PHY_MF%YRSIMPHL,YDDYNA=>YDMODEL%YRML_DYN%YRDYNA) + & YDPHY=>YDMODEL%YRML_PHY_MF%YRPHY,YDSIMPHL=>YDMODEL%YRML_PHY_MF%YRSIMPHL,YDDYNA=>YDMODEL%YRML_DYN%YRDYNA,YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO) ASSOCIATE(LSPLTHOIGFL=>YDDYN%LSPLTHOIGFL,LPC_FULL=>YDDYNA%LPC_FULL,LPC_CHEAP=>YDDYNA%LPC_CHEAP, & & YAERO=>YGFL%YAERO, YSRC=>YGFL%YSRC, YCVGQ=>YGFL%YCVGQ, & & YMXL_NL=>YGFL%YMXL_NL, NUVP=>YGFL%NUVP, YCPF=>YGFL%YCPF, & @@ -157,7 +157,7 @@ SUBROUTINE SUGFL3(YDDIMV,YDMODEL) & LEPHYS=>YDEPHY%LEPHYS, YLIMA=>YGFL%YLIMA, YLIMA_NL=>YGFL%YLIMA_NL, NLIMA=>YGFL%NLIMA, & & NFSD=>YGFL%NFSD, YFSD=>YGFL%YFSD,YFSD_NL=>YGFL%YFSD_NL, & & NEDRP=>YGFL%NEDRP, YEDRP=>YGFL%YEDRP,YEDRP_NL=>YGFL%YEDRP_NL, & - & LAERAOT=>YGFL%LAERAOT,LAERLISI=>YGFL%LAERLISI,YPHYCTY=>YGFL%YPHYCTY,YPHYCTY_NL=>YGFL%YPHYCTY_NL) + & LAERAOT=>YGFL%LAERAOT,LAERLISI=>YGFL%LAERLISI,YPHYCTY=>YGFL%YPHYCTY,YPHYCTY_NL=>YGFL%YPHYCTY_NL,AERO_SCHEME=>YDCOMPO%AERO_SCHEME) ! ------------------------------------------------------------------ !* 1. SET GFL ATTRIBUTES @@ -945,17 +945,19 @@ SUBROUTINE SUGFL3(YDDIMV,YDMODEL) ENDDO !eehol: cloud prop ! Aerosol-cloud interaction fields, EC-EARTH -IF (YCDNC%LACTIVE) THEN - CALL SET_GFL_ATTR(YDDIMV, YGFL, YCDNC, LDADV=.FALSE., LDT9=.FALSE., LDPHY=.FALSE.) -END IF -IF (YICNC%LACTIVE) THEN - CALL SET_GFL_ATTR(YDDIMV, YGFL, YICNC, LDADV=.FALSE., LDT9=.FALSE., LDPHY=.FALSE.) -END IF -IF (YRE_LIQ%LACTIVE) THEN - CALL SET_GFL_ATTR(YDDIMV, YGFL, YRE_LIQ, LDADV=.FALSE., LDT9=.FALSE., LDPHY=.FALSE.) -END IF -IF (YRE_ICE%LACTIVE) THEN - CALL SET_GFL_ATTR(YDDIMV, YGFL, YRE_ICE, LDADV=.FALSE., LDT9=.FALSE., LDPHY=.FALSE.) +IF (TRIM(AERO_SCHEME)=="hamm7" )THEN + IF (YCDNC%LACTIVE) THEN + CALL SET_GFL_ATTR(YDDIMV, YGFL, YCDNC, LDADV=.FALSE., LDT9=.FALSE., LDPHY=.FALSE.) + END IF + IF (YICNC%LACTIVE) THEN + CALL SET_GFL_ATTR(YDDIMV, YGFL, YICNC, LDADV=.FALSE., LDT9=.FALSE., LDPHY=.FALSE.) + END IF + IF (YRE_LIQ%LACTIVE) THEN + CALL SET_GFL_ATTR(YDDIMV, YGFL, YRE_LIQ, LDADV=.FALSE., LDT9=.FALSE., LDPHY=.FALSE.) + END IF + IF (YRE_ICE%LACTIVE) THEN + CALL SET_GFL_ATTR(YDDIMV, YGFL, YRE_ICE, LDADV=.FALSE., LDT9=.FALSE., LDPHY=.FALSE.) + END IF END IF ! * NAEROCLIM fields: aerosol 3D input fields used for ECMWF applications diff --git a/ifs-source/radiation/module/radiation_aerosol_optics.F90 b/ifs-source/radiation/module/radiation_aerosol_optics.F90 index 5436d826..9a8bd752 100644 --- a/ifs-source/radiation/module/radiation_aerosol_optics.F90 +++ b/ifs-source/radiation/module/radiation_aerosol_optics.F90 @@ -518,11 +518,13 @@ subroutine add_aerosol_optics_direct(nlev,istartcol,iendcol, & end subroutine add_aerosol_optics_direct - !A.Laakso (FMI): - !Adds aod, ssa, asym of aerosols to corresponding variables in radiation module - !Note1: Weighting of SSA, ASYM (added not background) is done before calling this subroutine - !Note2: For LW only AOD is added - subroutine add_aerosol_aod_ssa_asym(ncol,nlev,istartcol,iendcol, config,aerosol_ham, & + ! If they are provided, adds AOD, SSA, ASYM of aerosols to corresponding variables in + ! radiation module. + ! Note: + ! - Weighting of SSA, ASYM (added not background) is done before calling this subroutine + ! - For LW only AOD is added + ! Original code: A.Laakso (FMI) + subroutine add_aerosol_aod_ssa_asym(ncol, nlev, istartcol, iendcol, config, aerosol, & & od_lw, ssa_lw, g_lw, od_sw, ssa_sw, g_sw) use parkind1, only : jprb use radiation_io, only : nulout, nulerr, radiation_abort @@ -533,7 +535,7 @@ subroutine add_aerosol_aod_ssa_asym(ncol,nlev,istartcol,iendcol, config,aerosol_ integer, intent(in) :: nlev ! number of model levels integer, intent(in) :: istartcol, iendcol ! range of columns to process type(config_type), intent(in), target :: config - type(aerosol_type), intent(in) :: aerosol_ham + type(aerosol_type), intent(in) :: aerosol real(jprb), dimension(config%n_g_lw,nlev,istartcol:iendcol), & & intent(inout) :: od_lw real(jprb), dimension(config%n_g_lw_if_scattering,nlev,istartcol:iendcol), & @@ -549,32 +551,33 @@ subroutine add_aerosol_aod_ssa_asym(ncol,nlev,istartcol,iendcol, config,aerosol_ ! Range of levels over which aerosols are present integer :: istartlev, iendlev + if (.not. aerosol%is_direct) return if (lhook) call dr_hook('radiation_aerosol_optics:add_aerosol_aod_ssa_asym',0,hook_handle) - istartlev = lbound(aerosol_ham%od_sw,2) - iendlev = ubound(aerosol_ham%od_sw,2) - ! Loop over position + istartlev = lbound(aerosol%od_sw,2) + iendlev = ubound(aerosol%od_sw,2) + ! Loop over position do jlev = istartlev,iendlev do jcol = istartcol,iendcol do jg = 1,config%n_g_lw od_lw(jg,jlev,jcol) = od_lw(jg,jlev,jcol)& - + aerosol_ham%od_sw(jcol,jlev,config%n_bands_sw+config%i_band_from_reordered_g_lw(jg)) + + aerosol%od_sw(jcol,jlev,config%n_bands_sw+config%i_band_from_reordered_g_lw(jg)) end do - ! Weighting - only for existing aerosols + ! Weighting - only for existing aerosols do jg = 1,config%n_g_sw iband=config%i_band_from_reordered_g_sw(jg) - IF (aerosol_ham%od_sw(jcol,jlev,iband) > 0.0_jprb) THEN + IF (aerosol%od_sw(jcol,jlev,iband) > 0.0_jprb) THEN g_sw(jg,jlev,jcol) = g_sw(jg,jlev,jcol)*ssa_sw(jg,jlev,jcol)*od_sw(jg,jlev,jcol) & - +aerosol_ham%g_sw(jcol,jlev,iband) + +aerosol%g_sw(jcol,jlev,iband) ssa_sw(jg,jlev,jcol) = ssa_sw(jg,jlev,jcol)*od_sw(jg,jlev,jcol) & - +aerosol_ham%ssa_sw(jcol,jlev,iband) + +aerosol%ssa_sw(jcol,jlev,iband) od_sw(jg,jlev,jcol) = od_sw(jg,jlev,jcol) & - +aerosol_ham%od_sw(jcol,jlev,iband) + +aerosol%od_sw(jcol,jlev,iband) IF (ssa_sw(jg,jlev,jcol) /= 0.0_jprb) THEN g_sw(jg,jlev,jcol)=g_sw(jg,jlev,jcol)/ssa_sw(jg,jlev,jcol) @@ -587,12 +590,9 @@ subroutine add_aerosol_aod_ssa_asym(ncol,nlev,istartcol,iendcol, config,aerosol_ end do ! Loop over column end do ! Loop over level - - if (lhook) call dr_hook('radiation_aerosol_optics:add_aerosol_aod_ssa_asym',1,hook_handle) end subroutine - !--------------------------------------------------------------------- ! Sometimes it is useful to specify aerosol in terms of its optical ! depth at a particular wavelength. This function returns the dry diff --git a/ifs-source/radiation/module/radiation_ifs_rrtm.F90 b/ifs-source/radiation/module/radiation_ifs_rrtm.F90 index fd4f7570..4a352d86 100644 --- a/ifs-source/radiation/module/radiation_ifs_rrtm.F90 +++ b/ifs-source/radiation/module/radiation_ifs_rrtm.F90 @@ -364,7 +364,6 @@ subroutine gas_optics(ncol,nlev,istartcol,iendcol, & ! Check we have gas mixing ratios in the right units call gas%assert_units(IMassMixingRatio) - CALL RRTM_PREPARE_GASES & & ( istartcol, iendcol, ncol, nlev, & & thermodynamics%pressure_hl(:,istartlev:iendlev+1), & diff --git a/ifs-source/radiation/module/radiation_interface.F90 b/ifs-source/radiation/module/radiation_interface.F90 index 08bbe519..676d4390 100644 --- a/ifs-source/radiation/module/radiation_interface.F90 +++ b/ifs-source/radiation/module/radiation_interface.F90 @@ -194,7 +194,7 @@ end subroutine set_gas_units ! to reverse the order for the computation and then reverse the ! order of the output fluxes to match the inputs. subroutine radiation(ncol, nlev, istartcol, iendcol, config, & - & single_level, thermodynamics, gas, cloud, aerosol, aerosol_ham, flux) + & single_level, thermodynamics, gas, cloud, aerosol, flux) use parkind1, only : jprb use yomhook, only : lhook, dr_hook, jphook @@ -244,7 +244,7 @@ subroutine radiation(ncol, nlev, istartcol, iendcol, config, & type(thermodynamics_type),intent(in) :: thermodynamics type(gas_type), intent(in) :: gas type(cloud_type), intent(inout):: cloud - type(aerosol_type), intent(in) :: aerosol, aerosol_ham + type(aerosol_type), intent(in) :: aerosol ! Output type(flux_type), intent(inout):: flux @@ -311,7 +311,7 @@ subroutine radiation(ncol, nlev, istartcol, iendcol, config, & ! call the radiation scheme and then reverses the returned ! fluxes call radiation_reverse(ncol, nlev, istartcol, iendcol, config, & - & single_level, thermodynamics, gas, cloud, aerosol, aerosol_ham, flux) + & single_level, thermodynamics, gas, cloud, aerosol, flux) else ! Input arrays arranged in order of increasing pressure / @@ -387,11 +387,10 @@ subroutine radiation(ncol, nlev, istartcol, iendcol, config, & & config, thermodynamics, gas, aerosol, & & od_lw, ssa_lw, g_lw, od_sw, ssa_sw, g_sw) - !optical properties from aerosol model - !fields are 0 if not used (or should be) - call add_aerosol_aod_ssa_asym(ncol,nlev,istartcol,iendcol, & - & config, aerosol_ham, & - & od_lw, ssa_lw, g_lw, od_sw, ssa_sw, g_sw) + ! optical properties from aerosol model if provided + !call add_aerosol_aod_ssa_asym(ncol,nlev,istartcol,iendcol, & + ! & config, aerosol, & + ! & od_lw, ssa_lw, g_lw, od_sw, ssa_sw, g_sw) end if else @@ -518,7 +517,7 @@ end subroutine radiation ! subroutine calls, and is called by "radiation", it must be in this ! module to avoid circular dependencies. subroutine radiation_reverse(ncol, nlev, istartcol, iendcol, config, & - & single_level, thermodynamics, gas, cloud, aerosol, aerosol_ham, flux) + & single_level, thermodynamics, gas, cloud, aerosol, flux) use parkind1, only : jprb @@ -540,7 +539,7 @@ subroutine radiation_reverse(ncol, nlev, istartcol, iendcol, config, & type(thermodynamics_type),intent(in) :: thermodynamics type(gas_type), intent(in) :: gas type(cloud_type), intent(in) :: cloud - type(aerosol_type), intent(in) :: aerosol, aerosol_ham + type(aerosol_type), intent(in) :: aerosol ! Output type(flux_type), intent(inout):: flux @@ -548,7 +547,7 @@ subroutine radiation_reverse(ncol, nlev, istartcol, iendcol, config, & type(thermodynamics_type) :: thermodynamics_rev type(gas_type) :: gas_rev type(cloud_type) :: cloud_rev - type(aerosol_type) :: aerosol_rev, aerosol_ham_rev + type(aerosol_type) :: aerosol_rev type(flux_type) :: flux_rev ! Start and end levels for aerosol data @@ -568,11 +567,10 @@ subroutine radiation_reverse(ncol, nlev, istartcol, iendcol, config, & call aerosol_rev%allocate(ncol, istartlev, iendlev, & & config%n_aerosol_types) end if - if (allocated(aerosol_ham%od_sw)) then - istartlev = nlev + 1 - aerosol_ham%iendlev - iendlev = nlev + 1 - aerosol_ham%istartlev - call aerosol_ham_rev%allocate(ncol, istartlev, iendlev, & - & config%n_g_sw+config%n_g_lw) + if (aerosol%is_direct) then + istartlev = nlev + 1 - aerosol%iendlev + iendlev = nlev + 1 - aerosol%istartlev + call aerosol_rev%allocate_direct(config, ncol, istartlev, iendlev) end if ! Fill reversed thermodynamic arrays @@ -617,24 +615,24 @@ subroutine radiation_reverse(ncol, nlev, istartcol, iendcol, config, & & = aerosol%mixing_ratio(:,aerosol%iendlev:aerosol%istartlev:-1,:) end if - if (allocated(aerosol_ham%od_sw)) then - aerosol_ham_rev%od_sw(:,istartlev:iendlev,:) & - & = aerosol_ham%od_sw(:,aerosol_ham%iendlev:aerosol_ham%istartlev:-1,:) + if (allocated(aerosol%od_sw)) then + aerosol_rev%od_sw(:,istartlev:iendlev,:) & + & = aerosol%od_sw(:,aerosol%iendlev:aerosol%istartlev:-1,:) end if - if (allocated(aerosol_ham%ssa_sw)) then - aerosol_ham_rev%ssa_sw(:,istartlev:iendlev,:) & - & = aerosol_ham%ssa_sw(:,aerosol_ham%iendlev:aerosol_ham%istartlev:-1,:) + if (allocated(aerosol%ssa_sw)) then + aerosol_rev%ssa_sw(:,istartlev:iendlev,:) & + & = aerosol%ssa_sw(:,aerosol%iendlev:aerosol%istartlev:-1,:) end if - if (allocated(aerosol_ham%g_sw)) then - aerosol_ham_rev%g_sw(:,istartlev:iendlev,:) & - & = aerosol_ham%g_sw(:,aerosol_ham%iendlev:aerosol_ham%istartlev:-1,:) + if (allocated(aerosol%g_sw)) then + aerosol_rev%g_sw(:,istartlev:iendlev,:) & + & = aerosol%g_sw(:,aerosol%iendlev:aerosol%istartlev:-1,:) end if ! Run radiation scheme on reversed profiles call radiation(ncol, nlev,istartcol,iendcol, & & config, single_level, thermodynamics_rev, gas_rev, & - & cloud_rev, aerosol_rev, aerosol_ham, flux_rev) + & cloud_rev, aerosol_rev, flux_rev) ! Reorder fluxes if (allocated(flux%lw_up)) then @@ -675,13 +673,8 @@ subroutine radiation_reverse(ncol, nlev, istartcol, iendcol, config, & call gas_rev%deallocate call cloud_rev%deallocate call flux_rev%deallocate - if (allocated(aerosol%mixing_ratio)) then - call aerosol_rev%deallocate - end if + call aerosol_rev%deallocate - if (allocated(aerosol_ham%od_sw)) then - call aerosol_ham_rev%deallocate - end if end subroutine radiation_reverse end module radiation_interface diff --git a/ifs-test/tests/t21/test_compo_fc/params b/ifs-test/tests/t21/test_compo_fc/params index bdd713db..1545ce42 100644 --- a/ifs-test/tests/t21/test_compo_fc/params +++ b/ifs-test/tests/t21/test_compo_fc/params @@ -1,2 +1,2 @@ NPROC=2 -NTHREAD=2 +NTHREAD=1 diff --git a/ifs-test/tests/t255/common/m7/m7_aero.nml b/ifs-test/tests/t255/common/m7/m7_aero.nml index d5afe234..a4302fd1 100644 --- a/ifs-test/tests/t255/common/m7/m7_aero.nml +++ b/ifs-test/tests/t255/common/m7/m7_aero.nml @@ -1,10 +1,9 @@ -cat >> fort.4 << EOF -NAERO=37, -NACTAERO=37, +cat >> fort.4 <> fort.4 << EOF LO3_CHEM_UV=true, NGHGRAD=20, NAERMACC=1, - !LAER3D=.false., ! LAER3D: which aerosols climatology 2D vs 3D is used + LAER3D=.false., ! LAER3D: which aerosols climatology 2D vs 3D is used / &NAMFPC CFPFMT="MODEL", From eccecf60191bad6d3b9d9b376916490e7b762563 Mon Sep 17 00:00:00 2001 From: Lianghai Wu Date: Tue, 30 Apr 2024 07:14:34 +0000 Subject: [PATCH 018/129] Pull request #3: M7 going through with Intel Merge in ~NM6/openifs-48r1 from feature/knmi/OIFS-516-non-zero-m7-tracers to knmi-m7 Squashed commit of the following: commit 86ccecd94d15ba8bc312848b1525b8d0d3bb9726 Author: Philippe Le Sager Date: Tue Apr 30 09:09:49 2024 +0200 Tidy up the code commit 869fc0d9d056e9dd2a3aa32904042d8ae44e25dc Author: Lianghai Wu Date: Wed Apr 24 20:43:52 2024 +0000 OIFS-523 fix code crush in deallocation by fixing inconsistent array commit 8f2aab21a42bcdbedbabb17e5ede9fe849dfaa74 Author: Lianghai Wu Date: Wed Apr 24 18:50:08 2024 +0000 deallocate array commit c44fd0377b177bcfc43545b78b045b7ecc726bde Author: Lianghai Wu Date: Wed Apr 24 08:40:39 2024 +0000 Revert "OIFS-521 update M7 tracer names" This reverts commit 268b5bb1481cc1975dd831a88455be0601d37b28. commit 268b5bb1481cc1975dd831a88455be0601d37b28 Author: Lianghai Wu Date: Fri Apr 19 10:46:00 2024 +0000 OIFS-521 update M7 tracer names commit a425daf4fa20c5e4ca20c5cc11567af1a30e6a6b Author: Lianghai Wu Date: Tue Apr 16 09:00:24 2024 +0000 OIFS-516 fix crush in radiation_scheme --- ifs-source/arpifs/phys_ec/aerini_layer.F90 | 2 +- .../arpifs/phys_ec/local_arrays_fin.F90 | 1 + ifs-source/arpifs/phys_ec/su_aerw.F90 | 5 + ifs-source/arpifs/phys_radi/raddrv.F90 | 10 +- .../arpifs/phys_radi/radiation_scheme.F90 | 49 ++++--- ifs-source/arpifs/phys_radi/radintg.F90 | 131 +++++++++--------- ifs-source/arpifs/phys_radi/suecrad.F90 | 3 + ifs-test/tests/t255/test_compo_fc_m7/setup | 4 +- 8 files changed, 109 insertions(+), 96 deletions(-) diff --git a/ifs-source/arpifs/phys_ec/aerini_layer.F90 b/ifs-source/arpifs/phys_ec/aerini_layer.F90 index ce6ce911..579fa329 100644 --- a/ifs-source/arpifs/phys_ec/aerini_layer.F90 +++ b/ifs-source/arpifs/phys_ec/aerini_layer.F90 @@ -223,7 +223,7 @@ SUBROUTINE AERINI_LAYER(YDGEOMETRY,YDSURF,& !VH - end & GEMSL%ZCFLX, GEMSL%ZTENC,& & GEMSL%ZLDAY, GEMSL%ZLISS, GEMSL%ZSO2, GEMSL%ZTDMS,& - & GEMSL%ZAERDDP, GEMSL%ZAERSDM, GEMSL%ZAERSRC, GEMSL%ZAERMAP, GEMSL%ZAERFLX, GEMSL%ZAERLIF,& + & GEMSL%ZAERDDP, GEMSL%ZAERSDM, GEMSL%ZAERSRC, GEMSL%ZAERMAP, GEMSL%ZAERFLX_M7, GEMSL%ZAERLIF,& & GEMSL%ZODMS, PSURF%PSD_XA, & & PSO4SRC,PSO2SRC) diff --git a/ifs-source/arpifs/phys_ec/local_arrays_fin.F90 b/ifs-source/arpifs/phys_ec/local_arrays_fin.F90 index 17fc3505..fb77cc2d 100644 --- a/ifs-source/arpifs/phys_ec/local_arrays_fin.F90 +++ b/ifs-source/arpifs/phys_ec/local_arrays_fin.F90 @@ -115,6 +115,7 @@ SUBROUTINE LOCAL_ARRAYS_FIN(LLKEYS,AUXL,SURFL,PERTL,GEMSL) !IF (ASSOCIATED(GEMSL%ZAERSDM)) GEMSL%ZAERSDM =>NULL() !IF (ASSOCIATED(GEMSL%ZAERSRC)) GEMSL%ZAERSRC =>NULL() +IF (ASSOCIATED(GEMSL%ZAERFLX_M7)) DEALLOCATE(GEMSL%ZAERFLX_M7) IF (ASSOCIATED(GEMSL%ZAERFLX)) DEALLOCATE(GEMSL%ZAERFLX) IF (ASSOCIATED(GEMSL%ZAERLIF)) DEALLOCATE(GEMSL%ZAERLIF) IF (ASSOCIATED(GEMSL%ZTAUAER)) DEALLOCATE(GEMSL%ZTAUAER) diff --git a/ifs-source/arpifs/phys_ec/su_aerw.F90 b/ifs-source/arpifs/phys_ec/su_aerw.F90 index 1543137e..bd217cf4 100644 --- a/ifs-source/arpifs/phys_ec/su_aerw.F90 +++ b/ifs-source/arpifs/phys_ec/su_aerw.F90 @@ -387,6 +387,9 @@ SUBROUTINE SU_AERW(YDMODEL) ! use HAM-M7-specific switches in the micro-physics routines. CASE ("tm5m7", "hamm7") + LEPAERO =.FALSE. + LAERRAD =.FALSE. + LAERCLIMG=.FALSE. LAERCLIMZ=.FALSE. LAERCLIST=.FALSE. @@ -410,6 +413,8 @@ SUBROUTINE SU_AERW(YDMODEL) LAERNITRATE = .FALSE. LDRYDEPVEL_DYN=.FALSE. + REPSCAER=1.E-20_JPRB ! minimum value for AOD + !-- minimum oceanic production of DMS RDMSMIN = 5.E-11_JPRB NDMSO = 2 diff --git a/ifs-source/arpifs/phys_radi/raddrv.F90 b/ifs-source/arpifs/phys_radi/raddrv.F90 index 59ada695..860e6bc6 100644 --- a/ifs-source/arpifs/phys_radi/raddrv.F90 +++ b/ifs-source/arpifs/phys_radi/raddrv.F90 @@ -686,8 +686,8 @@ SUBROUTINE RADDRV(YDGEOMETRY,YDFIELDS,YDMODEL,KGPTOT,KFLDS,KBLOCKS,PGPIN) ENDDO ENDDO - IF (TRIM(AERO_SCHEME) == "tm5m7" .or. TRIM(AERO_SCHEME) == "hamm7" ) THEN - IF (NSTEP /= YDRIP%NSTART) THEN + IF (TRIM(AERO_SCHEME) == "hamm7" ) THEN + !IF (NSTEP /= YDRIP%NSTART) THEN DO JAER=1,14 DO JK=1,NFLEVG DO JL=IST,IEND @@ -704,10 +704,10 @@ SUBROUTINE RADDRV(YDGEOMETRY,YDFIELDS,YDMODEL,KGPTOT,KFLDS,KBLOCKS,PGPIN) ENDDO ENDDO ENDDO - ENDIF!nstep - ENDIF!aero_scheme + !ENDIF!nstep + ENDIF !aero_scheme - ENDIF! NACTAERO + ENDIF! NACTAERO IF (NCLOUDACT > 0) THEN DO JK=1,NFLEVG diff --git a/ifs-source/arpifs/phys_radi/radiation_scheme.F90 b/ifs-source/arpifs/phys_radi/radiation_scheme.F90 index 2729fd5f..c0bdb3bd 100644 --- a/ifs-source/arpifs/phys_radi/radiation_scheme.F90 +++ b/ifs-source/arpifs/phys_radi/radiation_scheme.F90 @@ -286,6 +286,7 @@ SUBROUTINE RADIATION_SCHEME & ASSOCIATE(YDRADIATION=>YDMODEL%YRML_PHY_RAD%YRADIATION, & & YRERAD=>YDMODEL%YRML_PHY_RAD%YRERAD, & & YDSPP_CONFIG=>YDMODEL%YRML_GCONF%YRSPP_CONFIG, & + & YDEAERATM=>YDMODEL%YRML_PHY_RAD%YREAERATM, & & YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO) ASSOCIATE(NCLOUDACT=>YRERAD%NCLOUDACT, RAD_CONFIG=>YDRADIATION%RAD_CONFIG, & & NWEIGHT_UV=>YDRADIATION%NWEIGHT_UV, & @@ -296,6 +297,7 @@ SUBROUTINE RADIATION_SCHEME & & WEIGHT_PAR=>YDRADIATION%WEIGHT_PAR(:), & & TROP_BG_AER_MASS_EXT=>YDRADIATION%TROP_BG_AER_MASS_EXT, & & STRAT_BG_AER_MASS_EXT=>YDRADIATION%STRAT_BG_AER_MASS_EXT, & + & REPSCAER=>YDEAERATM%REPSCAER, & & AERO_SCHEME=>YDCOMPO%AERO_SCHEME) ! Allocate memory in radiation objects @@ -304,7 +306,9 @@ SUBROUTINE RADIATION_SCHEME & CALL THERMODYNAMICS%ALLOCATE(KLON, KLEV, USE_H2O_SAT=.TRUE.) CALL GAS%ALLOCATE(KLON, KLEV) CALL YLCLOUD%ALLOCATE(KLON, KLEV) - +!write(*,*) "YDMODEL%YRML_PHY_RAD%YREAERATM%LAERCCN",YDMODEL%YRML_PHY_RAD%YREAERATM%LAERCCN +!write(*,*) "YDMODEL%YRML_PHY_RAD%YREAERATM%LAERRRTM",YDMODEL%YRML_PHY_RAD%YREAERATM%LAERRRTM +!write(*,*) "YRERAD%NAERMACC",YRERAD%NAERMACC IF (YDMODEL%YRML_PHY_RAD%YREAERATM%LAERCCN & & .OR. YDMODEL%YRML_PHY_RAD%YREAERATM%LAERRRTM & & .OR. YRERAD%NAERMACC == 1) THEN @@ -539,7 +543,7 @@ SUBROUTINE RADIATION_SCHEME & & .OR. YDMODEL%YRML_PHY_RAD%YREAERATM%LAERRRTM & & .OR. YRERAD%NAERMACC == 1) THEN - IF ( .NOT. TRIM(AERO_SCHEME) == "hamm7" ) THEN ! Could also test on AEROSOL%is_direct for a more general + IF ( .NOT. AEROSOL%is_direct) THEN ! MACC aerosol from climatology or prognostic aerosol variables - ! this is already in mass mixing ratio units with the required array @@ -592,27 +596,34 @@ SUBROUTINE RADIATION_SCHEME & ENDIF -! Optical properties of HAM aerosols - Should be 0 if not used -IF (RAD_CONFIG%DO_SW) THEN - IF (ALLOCATED(AEROSOL%od_sw) ) AEROSOL%od_sw(KIDIA:KFDIA,:,:) = 0.0_JPRB - IF (ALLOCATED(AEROSOL%ssa_sw)) AEROSOL%ssa_sw(KIDIA:KFDIA,:,:) = 0.0_JPRB - IF (ALLOCATED(AEROSOL%g_sw) ) AEROSOL%g_sw(KIDIA:KFDIA,:,:) = 0.0_JPRB -ENDIF +! Optical properties of HAM aerosols +IF ( AEROSOL%IS_DIRECT) THEN + ! reset + IF (RAD_CONFIG%DO_SW) THEN + AEROSOL%OD_SW(1:YRERAD%NTSW,:,KIDIA:KFDIA) = 0.0_JPRB + AEROSOL%SSA_SW(1:YRERAD%NTSW,:,KIDIA:KFDIA) = 0.0_JPRB + AEROSOL%G_SW(1:YRERAD%NTSW,:,KIDIA:KFDIA) = 0.0_JPRB + ENDIF + IF (RAD_CONFIG%DO_LW) THEN + AEROSOL%OD_LW(1:YRERAD%NTSW,:,KIDIA:KFDIA) = 0.0_JPRB + ENDIF -IF (( TRIM(AERO_SCHEME) == "hamm7") .AND. YDMODEL%YRML_PHY_RAD%YREAERATM%LAERRRTM) THEN + ! fill with M7 values IF (YRERAD%NAEROOPT>0) THEN IF (RAD_CONFIG%DO_SW) THEN - !already weighted (see aer_phy3_layer) SW - AEROSOL%od_sw(KIDIA:KFDIA,:,1:YRERAD%NTSW) = PAEROM7_TAU(KIDIA:KFDIA,:,1:YRERAD%NTSW) - AEROSOL%ssa_sw(KIDIA:KFDIA,:,1:YRERAD%NTSW) = PAEROM7_SSA(KIDIA:KFDIA,:,1:YRERAD%NTSW) - AEROSOL%g_sw(KIDIA:KFDIA,:,1:YRERAD%NTSW) = PAEROM7_ASYM(KIDIA:KFDIA,:,1:YRERAD%NTSW) + DO JAER = 1,YRERAD%NTSW + DO JLEV = 1,KLEV + DO JLON = KIDIA,KFDIA + AEROSOL%OD_SW(JAER,JLEV,JLON) = PAEROM7_TAU(JLON,JLEV,JAER) + AEROSOL%SSA_SW(JAER,JLEV,JLON) = PAEROM7_SSA(JLON,JLEV,JAER) + AEROSOL%G_SW(JAER,JLEV,JLON) = PAEROM7_ASYM(JLON,JLEV,JAER) + ENDDO + ENDDO + ENDDO + ENDIF + IF (RAD_CONFIG%DO_LW) THEN + AEROSOL%OD_LW = REPSCAER ! TODO for debugging, need update ENDIF - ! IF (RAD_CONFIG%DO_LW) THEN - !!LW, need to make sure that PAEROM7_TAULW = 0, when NAEROOPT=1 (TM5 optics, no LW opt) - !aerosol_opt%aod(KIDIA:KFDIA,:,YRERAD%NTSW+1:YRERAD%NTSW+STRATO_CMIP6_NTB)=PAEROM7_TAULW(KIDIA:KFDIA,:,1:STRATO_CMIP6_NTB) - !aerosol_opt%ssa(KIDIA:KFDIA,:,YRERAD%NTSW+1:YRERAD%NTSW+STRATO_CMIP6_NTB)=0.0_JPRB !only absorbtion for LW - !aerosol_opt%asym(KIDIA:KFDIA,:,YRERAD%NTSW+1:YRERAD%NTSW+STRATO_CMIP6_NTB)=0.0_JPRB - ! ENDIF ENDIF ENDIF diff --git a/ifs-source/arpifs/phys_radi/radintg.F90 b/ifs-source/arpifs/phys_radi/radintg.F90 index 9f1e0158..616068dc 100644 --- a/ifs-source/arpifs/phys_radi/radintg.F90 +++ b/ifs-source/arpifs/phys_radi/radintg.F90 @@ -487,6 +487,7 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& & LAERSOA=>YDCOMPO%LAERSOA, & & AERO_SCHEME=>YDCOMPO%AERO_SCHEME, & & LAERVOL=>YDEAERATM%LAERVOL, & + & LAERRRTM=>YDEAERATM%LAERRRTM, & & LAPPROXLWUPDATE=>YDERAD%LAPPROXLWUPDATE, & & LAPPROXSWUPDATE=>YDERAD%LAPPROXSWUPDATE, LDIAGFORCING=>YDERAD%LDIAGFORCING, & & LEPO3RA=>YDERAD%LEPO3RA, LHVOLCA=>YDERAD%LHVOLCA, NCLOUDACT=>YDERAD%NCLOUDACT, & @@ -654,13 +655,13 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& IAPRS =INDRAD(INEXT,KLEV+1,.TRUE.) IHTI =INDRAD(INEXT,KLEV+1,.TRUE.) IAERO =INDRAD(INEXT,IRADAER*KLEV,.NOT.LRAYFM .AND. LLACTAERO .AND. NAERMACC == 0) - -IF (TRIM(AERO_SCHEME) == "hamm7" ) THEN - IHAMAEROAOD =INDRAD(INEXT,NTSW*KLEV,.TRUE.) - IHAMAEROSSA =INDRAD(INEXT,NTSW*KLEV,.TRUE.) - IHAMAEROASYM =INDRAD(INEXT,NTSW*KLEV,.TRUE.) -ENDIF - +IHAMAEROAOD =INDRAD(INEXT,KLEV*NTSW,(TRIM(AERO_SCHEME) == "hamm7" .AND. LAERRRTM)) +IHAMAEROSSA =INDRAD(INEXT,KLEV*NTSW,(TRIM(AERO_SCHEME) == "hamm7" .AND. LAERRRTM)) +IHAMAEROASYM =INDRAD(INEXT,KLEV*NTSW,(TRIM(AERO_SCHEME) == "hamm7" .AND. LAERRRTM)) +!write(*,*) "IAERO ",IAERO +!write(*,*) "IHAMAEROAOD ",IHAMAEROAOD +!write(*,*) "IHAMAEROSSA ",IHAMAEROSSA +!write(*,*) "IHAMAEROASYM ",IHAMAEROASYM IPERT =INDRAD(INEXT,YDSPP_CONFIG%SM%NRFTOTAL_RADGRID, LLSPPRAD ) @@ -674,10 +675,10 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& !IC22 =INDRAD(INEXT,KLEV,.TRUE.) !ICL4 =INDRAD(INEXT,KLEV,.TRUE.) -IF (TRIM(AERO_SCHEME) == "hamm7" ) THEN - IRE_LIQ = INDRAD(INEXT,KLEV, NCLOUDACT > 0) - IRE_ICE = INDRAD(INEXT,KLEV, NCLOUDACT > 0) -ENDIF +!IF (TRIM(AERO_SCHEME) == "hamm7" .AND. NCLOUDACT > 0) THEN + IRE_LIQ = INDRAD(INEXT,KLEV,(TRIM(AERO_SCHEME) == "hamm7" .AND. NCLOUDACT > 0)) + IRE_ICE = INDRAD(INEXT,KLEV,(TRIM(AERO_SCHEME) == "hamm7" .AND. NCLOUDACT > 0)) +!ENDIF IINEND =INEXT-1 ! end of input variables @@ -789,6 +790,9 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& WRITE(NULOUT,'("RADINTG: IGI =",I0)')IGI WRITE(NULOUT,'("RADINTG: IAER =",I0)')IAER WRITE(NULOUT,'("RADINTG: IAERO =",I0)')IAERO + WRITE(NULOUT,'("RADINTG: IHAMAEROAOD =",I0)')IHAMAEROAOD + WRITE(NULOUT,'("RADINTG: IHAMAEROSSA =",I0)')IHAMAEROSSA + WRITE(NULOUT,'("RADINTG: IHAMAEROASYM =",I0)')IHAMAEROASYM WRITE(NULOUT,'("RADINTG: IPERT =",I0)')IPERT WRITE(NULOUT,'("RADINTG: ICO2 =",I0)')ICO2 WRITE(NULOUT,'("RADINTG: ICH4 =",I0)')ICH4 @@ -807,11 +811,11 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& IFLDSOUT= IOUTEND-IOUTBEG +1 IFLDSTOT= INEXT - 1 -!IF( .TRUE. )THEN +IF ( LLDEBUG ) THEN WRITE(NULOUT,'("RADINTG: IFLDSIN =",I12)')IFLDSIN WRITE(NULOUT,'("RADINTG: IFLDSOUT =",I12)')IFLDSOUT WRITE(NULOUT,'("RADINTG: IFLDSTOT =",I12)')IFLDSTOT -!ENDIF +ENDIF IF( NRADRES /= NSMAX )THEN ALLOCATE(ZRGP(NRPROMA,IFLDSIN,IGPBLKS)) @@ -960,8 +964,9 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& ENDIF LLPRINT=.FALSE. + !-- configuration with prognostic aerosols in radiation - IF( .NOT.LRAYFM .AND. NACTAERO > 0 .AND. NAERMACC == 0) THEN + AERORAD: IF( .NOT.LRAYFM .AND. NACTAERO > 0 .AND. NAERMACC == 0) THEN !-- debug ! IF (NSTEP == YDRIP%NSTART) THEN @@ -971,49 +976,46 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& ! ENDDO ! ENDIF !-- debug - IF (TRIM(AERO_SCHEME) == "hamm7" ) THEN - - !A.Laakso - IF (NSTEP == YDRIP%NSTART) THEN - DO JAERO=1,YDERAD%NTSW - IAE=(JAERO-1)*KLEV - ZRGP(1:IL,IHAMAEROAOD+IAE:IHAMAEROAOD+IAE+KLEV-1,IB) =REPSCAER - ZRGP(1:IL,IHAMAEROSSA+IAE:IHAMAEROSSA+IAE+KLEV-1,IB) =0._JPRB - ZRGP(1:IL,IHAMAEROASYM+IAE:IHAMAEROASYM+IAE+KLEV-1,IB) =0._JPRB - END DO - !DO JAERO=1,STRATO_CMIP6_NTB - !IAE=(JAERO-1)*KLEV - !ZRGP(1:IL,IHAMAEROAODLW+IAE:IHAMAEROAODLW+IAE+KLEV-1,IB) =0._JPRB - !END DO + IF (TRIM(AERO_SCHEME) == "hamm7" ) THEN - ELSE + !IF (NSTEP == YDRIP%NSTART) THEN + ! DO JAERO=1,YDERAD%NTSW + ! IAE=(JAERO-1)*KLEV + ! ZRGP(1:IL,IHAMAEROAOD+IAE:IHAMAEROAOD+IAE+KLEV-1,IB) =REPSCAER + ! ZRGP(1:IL,IHAMAEROSSA+IAE:IHAMAEROSSA+IAE+KLEV-1,IB) =0._JPRB + ! ZRGP(1:IL,IHAMAEROASYM+IAE:IHAMAEROASYM+IAE+KLEV-1,IB) =0._JPRB + ! END DO - DO JAERO=1,YDMODEL%YRML_PHY_RAD%YRERAD%NTSW - IAE=(JAERO-1)*KLEV - ZRGP(1:IL,IHAMAEROAOD+IAE:IHAMAEROAOD+IAE+KLEV-1,IB) =MAX(REPSCAER, PAEROTAU(IBEG:IEND,1:KLEV,JAERO)) - ENDDO - - DO JAERO=1,YDMODEL%YRML_PHY_RAD%YRERAD%NTSW - IAE=(JAERO-1)*KLEV - ZRGP(1:IL,IHAMAEROSSA+IAE:IHAMAEROSSA+IAE+KLEV-1,IB) =MAX(0._JPRB,PAEROSSA(IBEG:IEND,1:KLEV,JAERO)) - ENDDO + ! !DO JAERO=1,STRATO_CMIP6_NTB + ! !IAE=(JAERO-1)*KLEV + ! !ZRGP(1:IL,IHAMAEROAODLW+IAE:IHAMAEROAODLW+IAE+KLEV-1,IB) =0._JPRB + ! !END DO - DO JAERO=1,YDMODEL%YRML_PHY_RAD%YRERAD%NTSW - IAE=(JAERO-1)*KLEV - ZRGP(1:IL,IHAMAEROASYM+IAE:IHAMAEROASYM+IAE+KLEV-1,IB) =MAX(0._JPRB, PAEROASYM(IBEG:IEND,1:KLEV,JAERO)) - ENDDO + !ELSE + DO JAERO=1,YDMODEL%YRML_PHY_RAD%YRERAD%NTSW + IAE=(JAERO-1)*KLEV + ZRGP(1:IL,IHAMAEROAOD+IAE:IHAMAEROAOD+IAE+KLEV-1,IB) =MAX(REPSCAER, PAEROTAU(IBEG:IEND,1:KLEV,JAERO)) + !REPSCAER is needed to avoid corruption in radiation_scheme + ENDDO - !DO JAERO=1,STRATO_CMIP6_NTB - !IAE=(JAERO-1)*KLEV - !ZRGP(1:IL,IHAMAEROAODLW+IAE:IHAMAEROAODLW+IAE+KLEV-1,IB) =MAX(0._JPRB, PAEROTAULW(IBEG:IEND,1:KLEV,JAERO)) - !ENDDO + DO JAERO=1,YDMODEL%YRML_PHY_RAD%YRERAD%NTSW + IAE=(JAERO-1)*KLEV + ZRGP(1:IL,IHAMAEROSSA+IAE:IHAMAEROSSA+IAE+KLEV-1,IB) =MAX(0._JPRB,PAEROSSA(IBEG:IEND,1:KLEV,JAERO)) + ENDDO - ENDIF + DO JAERO=1,YDMODEL%YRML_PHY_RAD%YRERAD%NTSW + IAE=(JAERO-1)*KLEV + ZRGP(1:IL,IHAMAEROASYM+IAE:IHAMAEROASYM+IAE+KLEV-1,IB) =MAX(0._JPRB, PAEROASYM(IBEG:IEND,1:KLEV,JAERO)) + ENDDO + !DO JAERO=1,STRATO_CMIP6_NTB + !IAE=(JAERO-1)*KLEV + !ZRGP(1:IL,IHAMAEROAODLW+IAE:IHAMAEROAODLW+IAE+KLEV-1,IB) =MAX(0._JPRB, PAEROTAULW(IBEG:IEND,1:KLEV,JAERO)) + !ENDDO + !ENDIF ELSE - DO JAERO=1,IRADAER2 IAE=(JAERO-1)*KLEV ZRGP(1:IL,IAERO+IAE:IAERO+IAE+KLEV-1,IB) =MAX(REPSCAER, PAERO(IBEG:IEND,1:KLEV,JAERO)) @@ -1044,14 +1046,8 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& ZRGP(1:IL,IAERO+IAE:IAERO+IAE+KLEV-1,IB) =REPSCAER ENDIF - - ENDIF - ENDIF - - - - - + ENDIF + ENDIF AERORAD !SPP: compute and store SPP random patterns on radiation grid @@ -1062,19 +1058,17 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& ENDDO ENDIF - -IF (TRIM(AERO_SCHEME) == "hamm7" ) THEN - IF (NCLOUDACT > 0) THEN - IF (NSTEP == YDRIP%NSTART) THEN + IF (TRIM(AERO_SCHEME) == "hamm7" ) THEN + IF (NCLOUDACT > 0) THEN + IF (NSTEP == YDRIP%NSTART) THEN ZRGP(1:IL,IRE_LIQ:IRE_LIQ+KLEV-1,IB) = 2.E-6_JPRB ZRGP(1:IL,IRE_ICE:IRE_ICE+KLEV-1,IB) = 30.E-6_JPRB - ELSE + ELSE ZRGP(1:IL,IRE_LIQ:IRE_LIQ+KLEV-1,IB) = PRE_LIQ(IBEG:IEND,1:KLEV) ZRGP(1:IL,IRE_ICE:IRE_ICE+KLEV-1,IB) = PRE_ICE(IBEG:IEND,1:KLEV) - END IF + END IF + END IF END IF -END IF - ZRGP(1:IL,IHPR:IHPR+KLEV ,IB) =ZCAPH (1:IL,1:KLEV+1) ZRGP(1:IL,IAPRS:IAPRS+KLEV ,IB) =PAPRS (IBEG:IEND,1:KLEV+1) @@ -1610,7 +1604,7 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& CALL GSTATS(1210,0) !$OMP PARALLEL DO SCHEDULE(DYNAMIC,1)& -!$OMP&PRIVATE(JRL,IBEG,IEND,IL,IB) +!$OMP& PRIVATE(JRL,IBEG,IEND,IL,IB) DO JRL=1,RADGRID%NGPTOT,NRPROMA IBEG=JRL @@ -1678,7 +1672,6 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& ENDIF ELSE - ! Use the modular radiation scheme "ecRad" CALL RADIATION_SCHEME & & (YDMODEL, 1, IL, NRPROMA, KLEV, IRADAER, & @@ -1705,9 +1698,9 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& & ZRGP(1,IEMIT,IB) ,ZRGP(1,ILwDerivative,IB), & & ZRGP(1,ISwDiffuseBand,IB), ZRGP(1,ISwDirectBand,IB),& ! OPTIONAL ARGUMENTS - & ZRGP(1,IHAMAEROAOD,IB), ZRGP(1,IHAMAEROSSA,IB), ZRGP(1,IHAMAEROASYM,IB), & ! added for M7 aerosol - & ZRGP(1,IRE_LIQ,IB), ZRGP(1,IRE_ICE,IB),& - & PPERT=ZRGP(1,IPERT,IB), PFSD=ZRGP(1,IFSD,IB) ) + & PAEROM7_TAU=ZRGP(1,IHAMAEROAOD,IB), PAEROM7_SSA=ZRGP(1,IHAMAEROSSA,IB), PAEROM7_ASYM=ZRGP(1,IHAMAEROASYM,IB), & + & PRE_LIQ=ZRGP(1,IRE_LIQ,IB), PRE_ICE=ZRGP(1,IRE_ICE,IB),& + & PPERT=ZRGP(1,IPERT,IB), PFSD=ZRGP(1,IFSD,IB) ) ENDIF ENDDO diff --git a/ifs-source/arpifs/phys_radi/suecrad.F90 b/ifs-source/arpifs/phys_radi/suecrad.F90 index 6ace54c0..d8013e4a 100644 --- a/ifs-source/arpifs/phys_radi/suecrad.F90 +++ b/ifs-source/arpifs/phys_radi/suecrad.F90 @@ -770,6 +770,9 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) !- monthly climatology of aerosols (SS, DU, OM, BC, SO4) from CAMS reanalyses (former MACC) IF (LEPHYS.AND..NOT.LARPEGEF) THEN ! LARPEGEF for the files conversions IFS->Arpege. REK NAERMACC=1 ! =0 inactive + FIXME: IF ( TRIM(AERO_SCHEME) == "hamm7" ) THEN + NAERMACC=0 + ENDIF FIXME ELSE NAERMACC=0 ENDIF diff --git a/ifs-test/tests/t255/test_compo_fc_m7/setup b/ifs-test/tests/t255/test_compo_fc_m7/setup index a731de95..7c24fb60 100644 --- a/ifs-test/tests/t255/test_compo_fc_m7/setup +++ b/ifs-test/tests/t255/test_compo_fc_m7/setup @@ -162,10 +162,10 @@ cat >> fort.4 << EOF NSO4SCHEME=1, LSEASALT_RH80=true, LAERHYGRO=true, - LAERRRTM=false, + LAERRRTM=true, / &NAMCOMPO - LCHEM_DIA=true, + LCHEM_DIA=false, LCHEM_DDFLX=true, LCOMPO_DDFLX_DIR=true, LCHEM_TROPO=true, From 6298969c2206ab630ac0715742ebfd15ef807ac7 Mon Sep 17 00:00:00 2001 From: Ramiro Checa Garcia Date: Wed, 1 May 2024 13:05:38 +0000 Subject: [PATCH 019/129] Pull request #4: Solved ifs-test for m7 using Lianghai Wu changes in code. Merge in ~NM6/openifs-48r1 from ~NLD5163/openifs-48r1:rchg/knmi-m7-fix-ifstest to knmi-m7 Squashed commit of the following: commit a35d2a8e99fb8832f329a862ff87ead72a23b751 Author: Ramiro Checa-Garcia Date: Wed May 1 12:48:25 2024 +0000 Solved ifs-test for m7 using Lianghai Wu changes in code. Main difference is only ifs-test/tests/t255/common/m7/m7_aero.nml. Other changes are most cosmetic or to try to remove unused variables in several subroutines --- ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 | 1 + ifs-source/arpifs/phys_ec/hamm7_interface.F90 | 651 ++++++++++-------- .../arpifs/phys_radi/radiation_scheme.F90 | 4 +- ifs-source/arpifs/phys_radi/suecrad.F90 | 2 +- ifs-source/arpifs/setup/su_surf_flds.F90 | 8 +- ifs-test/tests/t255/common/m7/m7_aero.nml | 94 +++ .../tests/t255/common/m7/m7_aerowvldiag.nml | 1 - ifs-test/tests/t255/test_compo_fc_m7/setup | 3 - oifs-config.nld5163.sh | 7 +- 9 files changed, 464 insertions(+), 307 deletions(-) diff --git a/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 b/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 index 69d74ae9..8efc1334 100644 --- a/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 +++ b/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 @@ -211,6 +211,7 @@ SUBROUTINE AER_PHY3_LAYER(YDSURF, & ZTAUS_AER = 0._JPRB ZTAUA_AER = 0._JPRB ZPMAER = 0._JPRB + CALL HAMM7_INTERFACE & &( YDMODEL, & & KDIM%KIDIA , KDIM%KFDIA , KDIM%KLON , KDIM%KTDIA , KDIM%KLEV , KDIM%KTILES , & diff --git a/ifs-source/arpifs/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/phys_ec/hamm7_interface.F90 index d2248041..26f625ff 100755 --- a/ifs-source/arpifs/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/phys_ec/hamm7_interface.F90 @@ -1,52 +1,69 @@ -SUBROUTINE HAMM7_INTERFACE & - &( YDMODEL, KIDIA , KFDIA , KLON , KTDIA , KLEV , KTILES , & - & KFLDX, KLEVX, KTRAC , KAERO , KCHEM, KSTGLO, PGEOH, & - & PRS1 , PRSF1 , PAEROP , PCAERO , PCEN , PAPHIF , & - & PFPLCL , PFPLCN , PFPLSL , PFPLSN , PGELAT, PGELAM, & - & PAP , PIP , PLP , PRP , PSP , PCOVPTOT, PLU , PO3P ,PQP , PTP , PTHP , PTENC , PCFLX , & - & PAERDDP, PAERSDM, PAERSRC, PAERWS , PAERGUST , PAERUST, PAERMAP, & - & PCLAERS, PPRAERS, PCHEM2AER, & - & PFRTI , PLSM , PSNS , PWND , PWS1 , PAERFLX, PAERLIF, & - & PAERODDF,PTSPHY , PGFL , & - & PODTO , PAERO_WVL_DIAG, & - & PAER_TAU, PAER_SSA,PAER_ASYM,PAER_TAU_LW,& - & PTAUS_AER,PTAUA_AER,PPMAER, & - & PEXTRA, PVERVEL, PCCNL, PCCNO, PAHFSTI, PCI, PZ0M, PAHFLEV, & !eehol: added here vertical velocity, CCN over land, CCN over ocean - & PUP, PVP, PCVL, PCVH, PSO2DD, PGEMU)!, PTSO2, PTSO4, PTSO4_AQ, PFSO2,PFSO4,PFSO4_AQ& +SUBROUTINE HAMM7_INTERFACE( & + & YDMODEL, KIDIA, KFDIA, KLON, KTDIA, KLEV, KTILES, & + & KFLDX, KLEVX, KTRAC, KAERO, KCHEM, KSTGLO, PGEOH, & + & PRS1, PRSF1, PAEROP, PCAERO, PCEN, PAPHIF, & + & PFPLCL, PFPLCN, PFPLSL, PFPLSN, PGELAT, PGELAM, & + & PAP, PIP, PLP, PRP, PSP, PCOVPTOT, & + & PLU, PO3P, PQP, PTP, PTHP, PTENC, PCFLX, & + & PAERDDP, PAERSDM, PAERSRC, PAERWS, PAERGUST, PAERUST, PAERMAP, & + & PCLAERS, PPRAERS, PCHEM2AER, & + & PFRTI, PLSM, PSNS, PWND, PWS1, PAERFLX, PAERLIF, & + & PAERODDF, PTSPHY, PGFL, & + & PODTO, PAERO_WVL_DIAG, & + & PAER_TAU, PAER_SSA, PAER_ASYM, PAER_TAU_LW, & + & PTAUS_AER, PTAUA_AER, PPMAER, & + & PEXTRA, PVERVEL, PCCNL, PCCNO, PAHFSTI, PCI, PZ0M, & + !eehol: added here vertical velocity, CCN over land, CCN over ocean + & PAHFLEV, PUP, PVP, PCVL, PCVH, PSO2DD, PGEMU) + !, PTSO2, PTSO4, PTSO4_AQ, PFSO2,PFSO4,PFSO4_AQ& ! u-wind, v-wind, low veg. cover, high veg. cover, sine of latitude -!**** *TM5M7* - ROUTINE DEALING WITH THE TM5M7 AEROSOL COMPUTATIONS: -! SCAVENGING, MASS DIAGNOSTICS, AEROSOL-PERTURBED RADIANCES +! ╭────────────────────────────────────────────────────────────────────────────╮ +! │ (updated 30-APR-2024) │ +! │ Purpose : │ +! │ ------- │ +! │ *hamm7_interface* - │ +! │ │ +! │ │ +! │ Interface : │ +! │ --------- │ +! │ *HAMM7_INTERFACE* is called from AER_PHY3_LAYER │ +! │ │ +! │ │ +! │ Input : │ +! │ ----- │ +! │ │ +! │ │ +! │ Output : │ +! │ ------ │ +! │ │ +! │ │ +! │ Externals : │ +! │ --------- │ +! │ │ +! │ Method : │ +! │ ------ │ +! │ Follows the method of Marticorena-Bergametti 1995 for the variables │ +! │ UTH, Srel, srelV │ +! │ │ +! │ Reference : │ +! │ --------- │ +! │ Marticorena, Bergametti. JGR: Atmospheres, 1995. │ +! │ │ +! │ Author : │ +! │ ------- │ +! │ Orginal version: │ +! │ Vicent Huijen (KNMI), Tommi Bergman (FMI), Thomas Kuehn (FMI/UEF) │ +! │ │ +! │ Modifications : │ +! │ ------------- │ +! │ May. 2020 - V. Huijnen : Modifications for TM5M7 │ +! │ Sep. 2020 - T. Bergman : TM5M7 work │ +! │ Apr. 2024 - Lianghai Wu : revision for CY48r1 │ +! │ May. 2020 - R. Checa-Garcia: revision for CY48r1 and refactory │ +! │ │ +! ╰────────────────────────────────────────────────────────────────────────────╯ -! Vincent Huijnen , KNMI -! Tommi Bergman, FMI -! Thomas Kuehn (FMI/UEF), November 2020 - -!** INTERFACE. -! ---------- -! *TM5M7* IS CALLED FROM *AER_PHY3_LAYER*. - -! INPUTS: -! ------- -! PCHEM2AER (KLON,KLEV,xx) : chemistry tendency of selected processes because of specific reactions (kg/kg s-1) -! OUTPUTS: -! -------- - -! EXTERNALS. -! ---------- -! *TM5M7_SCAV* , ... - -! MODIFICATIONS. -! ------------- -! -! V. Huijnen 20200501 Modification for TM5M7 -! T Bergman 20200925 TM5M7 work - -! SWITCHES. -! -------- - -! MODEL PARAMETERS -! ---- ! PARAMETER DESCRIPTION UNITS ! --------- ----------- ----- ! INPUT PARAMETERS (INTEGER): @@ -125,80 +142,75 @@ SUBROUTINE HAMM7_INTERFACE & !----------------------------------------------------------------------- -USE PARKIND1 , ONLY : JPIM, JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK -!USE YOEAERSRC, ONLY : YREAERSRC -!USE YOEAERATM, ONLY : YREAERATM -!USE YOEAERLID, ONLY : YREAERLID -!USE YOEAERSNK ,ONLY : YREAERSNK -!USE YOM_YGFL , ONLY : YGFL -!USE YOERAD , ONLY : YRERAD -!USE YOEPHY , ONLY : YREPHY -USE TYPE_MODEL, ONLY : MODEL -USE YOMCST , ONLY : RD, RG, RPI, RMSO2, RMSO4, RMD, RNAVO -!USE YOMPRAD , ONLY : RADGRID ! sine of latitude from RADGRID to effective radius calculations -!USE YOECLDP , ONLY : YRECLDP ! for default ICNC and effective radius -USE YOMCT0 , ONLY : LIFSMIN, LIFSTRAJ -!USE YOMRIP , ONLY : YRRIP -USE YOESRTCOP, ONLY : RSASWA, RSASWB, RSFUA0, RSFUA1 -USE YOMCT3 , ONLY : NSTEP - -!! USE YOMLUN , ONLY : NULOUT -USE TM5M7_DATA, ONLY: mode_tracers,mode_tracers_by_mods,mode_start,mode_end_so4,naermod,nmod,nsol,iisvoc,ielvoc,iacs_n,iso4,MODAL_DATA, MODE_TRACERS, MODE_TRACERS_BY_MODS, & - MODE_START, MODE_END_SO4, NAERMOD, NMOD, NSOL, IISVOC, IELVOC, IACS_N, ISO4, ISO4ACS,ISO4COS -!USE YOMCHEM , ONLY : YRCHEM,IEXTR_WD, IEXTR_CH, IEXTR_NG, IEXTR_DD, IEXTR_CHTR -USE YOMCHEM , ONLY : IEXTR_WD, IEXTR_CH, IEXTR_NG, IEXTR_DD, IEXTR_CHTR - -USE YOE_AERODIAG , ONLY : JPAERO_WVL_AOD, JPAERO_WVL_AODABS, JPAERO_WVL_AODFM, & - & JPAERO_WVL_SSA, JPAERO_WVL_ASSIMETRY - -!USE YOMCOMPO , ONLY : YRCOMPO +USE PARKIND1, ONLY: JPIM, JPRB +USE YOMHOOK, ONLY: LHOOK, DR_HOOK, JPHOOK +USE TYPE_MODEL, ONLY: MODEL +USE YOMCST, ONLY: RD, RG, RPI +USE YOMCT0, ONLY: LIFSMIN, LIFSTRAJ +USE YOMCT3, ONLY: NSTEP +USE TM5M7_DATA, ONLY: mode_tracers, mode_tracers_by_mods, mode_start, & + & mode_end_so4, naermod, nmod,nsol, iisvoc,ielvoc, & + & iacs_n,iso4, MODAL_DATA, MODE_TRACERS, MODE_START, & + & MODE_TRACERS_BY_MODS, MODE_END_SO4, NAERMOD, NMOD, NSOL,& + & IISVOC, IELVOC, IACS_N, ISO4, ISO4ACS,ISO4COS +USE YOMCHEM, ONLY: IEXTR_WD, IEXTR_CH, IEXTR_NG, IEXTR_DD, IEXTR_CHTR + +USE YOE_AERODIAG, ONLY: JPAERO_WVL_AOD, JPAERO_WVL_AODABS, JPAERO_WVL_AODFM, & + & JPAERO_WVL_SSA, JPAERO_WVL_ASSIMETRY +USE YOMLUN, ONLY: NULOUT + +! [RCHG -> var non used ] USE YOMCST, ONLY: RMSO2, RMSO4, RMD, RNAVO +! [RCHG -> var non used ] USE YOESRTCOP, ONLY: RSASWA, RSASWB, RSFUA0, RSFUA1 +! [RCHG -> var non used ] USE YOMCOMPO , ONLY : YRCOMPO + ! implementation of HAM-M7 -USE MO_HAM, ONLY: nclass, naerocomp, sizeclass, nccndiag, subm_ngasspec -USE OIFS_TO_HAM, ONLY: ind_oifs_ham -USE MO_HAM_SUBM, ONLY: HAM_SUBM_INTERFACE !eehol: replaced HAM-M7 call with submodel interface -USE MO_ACTIV, ONLY: activ_updraft,nw,idt_cdnc,idt_icnc !eehol: HAM-M7 activation updraft calculation, effective radii -USE MO_HAM_ACTIV, ONLY: ham_activ_abdulrazzak_ghan, ham_activ_koehler_ab !eehol: HAM-M7 activation -USE MO_PARAM_SWITCHES, ONLY: ncd_activ !eehol: for activation -USE MO_TRACDEF, ONLY: ntrac, trlist !eehol: number of tracer for mass/number mixing ratio conversion, trlist for wet deposition flags -USE MO_TRACER_PROCESSES, ONLY: xt_borrow !eehol: conserving the negative tracer values from tendency -USE MO_SUBMODEL, ONLY: lwetdep,lsedimentation !eehol: logical for wetdeposition, sedimentation -USE MO_SPECIES, ONLY: speclist !SO2 wetdep for simple sulfur scheme -USE mo_ham_species, ONLY: id_so2 !SO2 wetdep for simple sulfur scheme - -USE MO_TIME_CONTROL, ONLY: time_step_len ! time step length for tendency -USE MO_HAMMOZ_WETDEP, ONLY: wetdep_interface ! wet deposition interface call -USE MO_HAM_WETDEP, ONLY: ham_conv_lfraq_so2 +USE MO_HAM, ONLY: nclass, naerocomp, sizeclass, nccndiag, subm_ngasspec +USE OIFS_TO_HAM, ONLY: ind_oifs_ham +USE MO_HAM_SUBM, ONLY: HAM_SUBM_INTERFACE !eehol: replaced HAM-M7 call with submodel interface +USE MO_ACTIV, ONLY: activ_updraft,nw,idt_cdnc,idt_icnc !eehol: HAM-M7 activation updraft calculation, effective radii +USE MO_HAM_ACTIV, ONLY: ham_activ_abdulrazzak_ghan, ham_activ_koehler_ab !eehol: HAM-M7 activation +USE MO_PARAM_SWITCHES, ONLY: ncd_activ !eehol: for activation +USE MO_TRACDEF, ONLY: ntrac, trlist + !eehol: number of tracer for mass/number mixing ratio conversion, trlist for wet deposition flags +USE MO_TRACER_PROCESSES, ONLY: xt_borrow !eehol: conserving the negative tracer values from tendency +USE MO_SUBMODEL, ONLY: lwetdep,lsedimentation !eehol: logical for wetdeposition, sedimentation +USE MO_TIME_CONTROL, ONLY: time_step_len ! time step length for tendency +USE MO_HAMMOZ_WETDEP, ONLY: wetdep_interface ! wet deposition interface call +USE MO_HAM_WETDEP, ONLY: ham_conv_lfraq_so2 USE MO_HAMMOZ_SEDIMENTATION, ONLY: sedi_interface ! sedimentation interface call -USE MO_HAMMOZ_DRYDEP, ONLY: drydep_interface ! dry deposition interface call -USE MO_HAM_RAD,ONLY: ham_rad,ham_rad_cache_cleanup,ham_rad_cache -USE YOMMP0 , ONLY : MYPROC, NPROC -USE TM5M7_OPTICS_DATA, ONLY : NWDEP, WDEP,NASWBAND,ASWBAND!,AER_TAU, AER_SSA,AER_ASYM, & -!& AER_TAU_LW -USE TM5_PHOTOLYSIS, ONLY : NBANDS_TROP, WAV_GRID, WAV_GRIDA -USE TM5M7_EMIS_DATA, ONLY : VKARMAN ! von karman constant for dry deposition +USE MO_HAMMOZ_DRYDEP, ONLY: drydep_interface ! dry deposition interface call +USE MO_HAM_RAD, ONLY: ham_rad,ham_rad_cache_cleanup,ham_rad_cache + +! [RCHG -> non used] USE MO_SPECIES, ONLY: speclist !SO2 wetdep for simple sulfur scheme +! [RCHG -> non used] USE mo_ham_species, ONLY: id_so2 !SO2 wetdep for simple sulfur scheme +! [RCHG -> non used] USE YOMMP0, ONLY : MYPROC, NPROC + +USE TM5M7_OPTICS_DATA, ONLY : NWDEP, NASWBAND,ASWBAND !,WDEP, AER_TAU, AER_SSA,AER_ASYM,AER_TAU_LW +USE TM5_PHOTOLYSIS, ONLY : NBANDS_TROP, WAV_GRID, WAV_GRIDA +USE TM5M7_EMIS_DATA, ONLY : VKARMAN ! von karman constant for dry deposition !----------------------------------------------------------------------- IMPLICIT NONE -TYPE(MODEL) ,INTENT(IN):: YDMODEL -INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA, KFDIA, KLON -INTEGER(KIND=JPIM),INTENT(IN) :: KTDIA, KLEV, KFLDX, KLEVX -INTEGER(KIND=JPIM),INTENT(IN) :: KTILES -INTEGER(KIND=JPIM),INTENT(IN) :: KTRAC -INTEGER(KIND=JPIM),INTENT(IN) :: KAERO(YDMODEL%YRML_GCONF%YGFL%NAERO) -INTEGER(KIND=JPIM),INTENT(IN) :: KCHEM(YDMODEL%YRML_GCONF%YGFL%NCHEM) -INTEGER(KIND=JPIM),INTENT(IN) :: KSTGLO + +TYPE(MODEL), INTENT(IN) :: YDMODEL +INTEGER(KIND=JPIM), INTENT(IN) :: KIDIA, KFDIA, KLON +INTEGER(KIND=JPIM), INTENT(IN) :: KTDIA, KLEV, KFLDX, KLEVX +INTEGER(KIND=JPIM), INTENT(IN) :: KTILES +INTEGER(KIND=JPIM), INTENT(IN) :: KTRAC +INTEGER(KIND=JPIM), INTENT(IN) :: KAERO(YDMODEL%YRML_GCONF%YGFL%NAERO) +INTEGER(KIND=JPIM), INTENT(IN) :: KCHEM(YDMODEL%YRML_GCONF%YGFL%NCHEM) +INTEGER(KIND=JPIM), INTENT(IN) :: KSTGLO REAL(KIND=JPRB),INTENT(IN) :: PGEOH(KLON,0:KLEV) REAL(KIND=JPRB),INTENT(IN) :: PRSF1(KLON,KLEV), PRS1(KLON,0:KLEV), PAPHIF(KLON,KLEV) -REAL(KIND=JPRB),INTENT(IN) :: PAP(KLON,KLEV) , PIP(KLON,KLEV) , PLP(KLON,KLEV) , PLU(KLON,KLEV) -REAL(KIND=JPRB),INTENT(IN) :: PRP(KLON,KLEV) , PSP(KLON,KLEV), PCOVPTOT(KLON,KLEV) -REAL(KIND=JPRB),INTENT(IN) :: PAEROP(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO), PCAERO(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO) +REAL(KIND=JPRB),INTENT(IN) :: PAP(KLON,KLEV), PIP(KLON,KLEV), PLP(KLON,KLEV), PLU(KLON,KLEV) +REAL(KIND=JPRB),INTENT(IN) :: PRP(KLON,KLEV), PSP(KLON,KLEV), PCOVPTOT(KLON,KLEV) +REAL(KIND=JPRB),INTENT(IN) :: PAEROP(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO) +REAL(KIND=JPRB),INTENT(IN) :: PCAERO(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO) REAL(KIND=JPRB),INTENT(IN) :: PCEN(KLON,KLEV,KTRAC), PCFLX(KLON,KTRAC) REAL(KIND=JPRB),INTENT(IN) :: PO3P(KLON,KLEV), PQP(KLON,KLEV), PTP(KLON,KLEV), PTHP(KLON,0:KLEV) REAL(KIND=JPRB),INTENT(IN) :: PFPLCL(KLON,0:KLEV),PFPLCN(KLON,0:KLEV),PFPLSL(KLON,0:KLEV),PFPLSN(KLON,0:KLEV) REAL(KIND=JPRB),INTENT(IN) :: PGELAT(KLON) , PGELAM(KLON) -!REAL(KIND=JPRB),INTENT(IN) :: PALBD(KLON,YDMODEL%YRML_PHY_RAD%YRERAD%NTSW), PFRTI(KLON,KTILES) REAL(KIND=JPRB),INTENT(IN) :: PFRTI(KLON,KTILES) REAL(KIND=JPRB),INTENT(IN) :: PAERWS(KLON), PAERGUST(KLON), PAERUST(KLON), PAERMAP(KLON,5) REAL(KIND=JPRB),INTENT(IN) :: PAERSRC(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO) @@ -206,9 +218,9 @@ SUBROUTINE HAMM7_INTERFACE & REAL(KIND=JPRB),INTENT(IN) :: PAERFLX(KLON,12,9), PAERLIF(KLON,9), PCLAERS(KLON) REAL(KIND=JPRB),INTENT(IN) :: PLSM(KLON) , PSNS(KLON) , PWND(KLON) , PWS1(KLON) REAL(KIND=JPRB),INTENT(IN) :: PTSPHY -REAL(KIND=JPRB),INTENT(IN) :: PVERVEL(KLON,KLEV) ! added vertical velocity as an input to TM5M7 as this is needed in HAM-M7 activation -REAL(KIND=JPRB),INTENT(IN) :: PCCNL(KLON) ! added CCN over land as an input to TM5M7 as this is needed in liquid effective radius calculation -REAL(KIND=JPRB),INTENT(IN) :: PCCNO(KLON) ! added CCN over ocean as an input to TM5M7 as this is needed in liquid effective radius calculation +REAL(KIND=JPRB),INTENT(IN) :: PVERVEL(KLON,KLEV) ! added vertical velocity as an input to TM5M7 (needed in HAM-M7 activation) +REAL(KIND=JPRB),INTENT(IN) :: PCCNL(KLON) ! added CCN over land as an input to TM5M7 (needed in liquid effective radius calc.) +REAL(KIND=JPRB),INTENT(IN) :: PCCNO(KLON) ! added CCN over ocean as an input to TM5M7 (needed in liquid effective radius calc.) REAL(KIND=JPRB),INTENT(IN) :: PAHFSTI(KLON,KTILES) ! added surface sensible heat flux for dry deposition REAL(KIND=JPRB),INTENT(IN) :: PCI(KLON) ! added fraction of sea-ice for dry deposition REAL(KIND=JPRB),INTENT(IN) :: PZ0M(KLON) ! added roughness length for momentum for dry deposition @@ -220,12 +232,15 @@ SUBROUTINE HAMM7_INTERFACE & REAL(KIND=JPRB),INTENT(IN) :: PGEMU(KLON) ! sine of latitude REAL(KIND=JPRB),INTENT(INOUT) :: PTENC(KLON,KLEV,KTRAC) -REAL(KIND=JPRB),INTENT(INOUT) :: PAERDDP(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO), PAERSDM(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO) +REAL(KIND=JPRB),INTENT(INOUT) :: PAERDDP(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO) +REAL(KIND=JPRB),INTENT(INOUT) :: PAERSDM(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO) ! Total optical depth at various wavelenghts. ! NOTE!! These wavelength definitions are not necessarily consistent ! with what is used in IFS-AER REAL(KIND=JPRB),INTENT(OUT) :: PODTO(KLON) + !REAL(KIND=JPRB),INTENT(OUT) :: PODTO469(KLON), PODTO670(KLON), PODTO865(KLON), PODTO1240(KLON) +!REAL(KIND=JPRB),INTENT(IN) :: PALBD(KLON,YDMODEL%YRML_PHY_RAD%YRERAD%NTSW), PFRTI(KLON,KTILES) REAL(KIND=JPRB),INTENT(OUT) :: PAERO_WVL_DIAG(KLON,YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG,YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG_TYPES) REAL(KIND=JPRB),INTENT(OUT) :: PAERODDF(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO,8) @@ -247,37 +262,26 @@ SUBROUTINE HAMM7_INTERFACE & !* 0.5 LOCAL VARIABLES ! --------------- -INTEGER(KIND=JPIM) :: JAER, JK, JL, JMMD, JSCAV, JSW, JWAVL, JT, JB, JN, JSPEC, ITRC, JEXT, IKLEVTROP(KLON), IW -INTEGER(KIND=JPIM) :: JCLASS, JTILE, j_yaero, JMASS, JGAS, JCLOUD ! local loop indice for activation and dry deposition and tracer indexing +INTEGER(KIND=JPIM) :: JAER, JK, JL, JWAVL, JT, JB, JN, JEXT, ITRC, IKLEVTROP(KLON), IW +INTEGER(KIND=JPIM) :: JCLASS, JTILE, JMASS, JGAS, JCLOUD ! local loop indice for activation and dry deposition and tracer indexing INTEGER(KIND=JPIM) :: ISSO2, ISSO4, ISSO4_ACS -INTEGER(KIND=JPIM) :: IAER, IEX3D, IEX3DP -INTEGER(KIND=JPIM) :: IEXTR2,ISHIFT1, IKPAER, IKP, ISTO, IWHERE -INTEGER(KIND=JPIM) :: IMODE ,NSO4SCHEME -REAL(KIND=JPRB) :: ZLON,ZLAT +INTEGER(KIND=JPIM) :: IMODE +INTEGER(KIND=JPIM) :: IFLAG -REAL(KIND=JPRB) :: ZAEROK(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO), ZTAEROK(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO), ZTAERO0(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO) +REAL(KIND=JPRB) :: ZAEROK(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO) +REAL(KIND=JPRB) :: ZTAEROK(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO) +REAL(KIND=JPRB) :: ZTAERO0(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO) REAL(KIND=JPRB) :: ZFAERO(KLON,ntrac)!YGFL%NACTAERO) - -REAL(KIND=JPRB) :: ZAER(KLON,KLEV), ZAERNEG(KLON,KLEV), ZBETAB(KLON,KLEV), ZBETAI(KLON,KLEV) -REAL(KIND=JPRB) :: ZAP(KLON,KLEV), ZCLDWAT(KLON,KLEV), ZDUM(KLON,KLEV) +REAL(KIND=JPRB) :: ZAER(KLON,KLEV), ZAERNEG(KLON,KLEV) +REAL(KIND=JPRB) :: ZAP(KLON,KLEV) REAL(KIND=JPRB) :: ZSO2(KLON,KLEV), ZDP(KLON,KLEV), ZDZ(KLON,KLEV) - -REAL(KIND=JPRB) :: ZBCPHI(KLON,KLEV), ZBCPHO(KLON,KLEV), ZOMPHI(KLON,KLEV) , ZOMPHO(KLON,KLEV) -REAL(KIND=JPRB) :: ZTBCPHI(KLON,KLEV),ZTBCPHO(KLON,KLEV),ZTOMPHI(KLON,KLEV), ZTOMPHO(KLON,KLEV) -REAL(KIND=JPRB) :: ZITBCPHO(KLON,KLEV),ZITOMPHO(KLON,KLEV),ZITSO2(KLON,KLEV) +REAL(KIND=JPRB) :: ZITSO2(KLON,KLEV) REAL(KIND=JPRB) :: ZFSO2(KLON) , ZFSO4(KLON), ZFSO4_AQ(KLON) REAL(KIND=JPRB) :: ZTSO2(KLON, KLEV) , ZTSO4(KLON, KLEV,1), ZTSO4_AQ(KLON, KLEV) -REAL(KIND=JPRB) :: ZAIRDM(KLON) - -REAL(KIND=JPRB) :: ZQSAT(KLON,KLEV), ZRHCL(KLON,KLEV), ZRHO(KLON,KLEV) -REAL(KIND=JPRB) :: ZTAER(KLON,KLEV), ZTAERI(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO) -REAL(KIND=JPRB) :: ZTAERO(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO), ZTENV(KLON) -REAL(KIND=JPRB) :: ZAERWET(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO) +REAL(KIND=JPRB) :: ZQSAT(KLON,KLEV), ZRHO(KLON,KLEV) +REAL(KIND=JPRB) :: ZTAER(KLON,KLEV) +REAL(KIND=JPRB) :: ZTAERO(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO) REAL(KIND=JPRB) :: ZRH(KLON,KLEV),ZTENC0(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NCHEM)!,ZTSO4(KLON,KLEV) - -!REAL(KIND=JPRB) :: ZAERNL(KLON,KLEV,NMOD) -!REAL(KIND=JPRB) :: ZAERML(KLON,KLEV,NAERMOD) -INTEGER(KIND=JPIM) :: JMOD,JAERCLASS,IFLAG REAL(KIND=JPRB) :: ZM6RP(KLON,KLEV,NMOD) REAL(KIND=JPRB) :: ZM6DRY(KLON,KLEV,NSOL) REAL(KIND=JPRB) :: ZWW(KLON,KLEV,NMOD) @@ -286,47 +290,71 @@ SUBROUTINE HAMM7_INTERFACE & REAL(KIND=JPRB) :: ZELVOC(KLON,KLEV) REAL(KIND=JPRB) :: ZSO4G(KLON,KLEV) REAL(KIND=JPRB) :: ZCEN(KLON,KLEV,KTRAC) ! local tracer number and mixing ratios and gas concentrations for not tendency updated values -REAL(KIND=JPRB), DIMENSION(:,:,:), ALLOCATABLE :: ZTAUS_AER, ZTAUA_AER, ZPMAER ! extinctions - REAL(KIND=JPRB) :: PODTO469(KLON), PODTO670(KLON), PODTO865(KLON), PODTO1240(KLON) -!REAL(KIND=JPRB) :: PAER_TAU(KLON,KLEV,14), PAER_SSA(KLON,KLEV,14),PAER_ASYM(KLON,KLEV,14) - REAL(KIND=JPRB) :: ZAER_TAU(KLON,KLEV,14,1), ZAER_SSA(KLON,KLEV,14),ZAER_ASYM(KLON,KLEV,14),ZAER_TAU_LW(KLON,KLEV,16) ! Optics output fields (to be used and allocated by methods using the optics) +REAL(KIND=JPRB), DIMENSION(:,:,:), ALLOCATABLE :: ZTAUS_AER, ZTAUA_AER, ZPMAER ! extinctions REAL(KIND=JPRB), DIMENSION(:,:,:,:), ALLOCATABLE :: ZAOP_OUT_EXT ! extinctions REAL(KIND=JPRB), DIMENSION(:,:,:), ALLOCATABLE :: ZAOP_OUT_A ! single scattering albedo REAL(KIND=JPRB), DIMENSION(:,:,:), ALLOCATABLE :: ZAOP_OUT_G ! assymetry factor - !Defined here, but should be passed in Call really: TYPE(MODAL_DATA), DIMENSION(NMOD), TARGET :: RW_MODE TYPE(MODAL_DATA), DIMENSION(NSOL), TARGET :: RWD_MODE TYPE(MODAL_DATA), DIMENSION(NSOL), TARGET :: H2O_MODE TYPE(MODAL_DATA), DIMENSION(NMOD), TARGET :: DENS_MODE -!REAL(KIND=JPRB), ALLOCATABLE :: ZAERSRC(:,:), ZAERNGT(:,:) , ZAERSCC(:,:) REAL(KIND=JPRB), ALLOCATABLE :: ZAERNGT(:,:) -REAL(KIND=JPRB) :: ZCLWAT, ZDEGRAD, ZEPSCOV, ZEPSWAT, ZRWSAT, ZRWPWP -REAL(KIND=JPRB) :: Z1CLD , ZDENSVIS,ZGDT , ZQIWP , ZQLWP(KLON,KLEV) , ZQRWP , ZQSWP -REAL(KIND=JPRB) :: ZDESIC, ZRELRA , ZLIQRAI, ZSNOICE, ZCFLIRA, ZCFSNIC, ZVISCON, ZVISRAY -REAL(KIND=JPRB) :: ZNS , ZRANGE , ZSIGAIR, ZVISICL, ZVISIPR, ZVISCAE, ZVISPAE +REAL(KIND=JPRB) :: ZDEGRAD, ZEPSCOV, ZEPSWAT, ZRWSAT, ZRWPWP +REAL(KIND=JPRB) :: ZQLWP(KLON,KLEV) +REAL(KIND=JPRB) :: ZTMPA -REAL(KIND=JPRB) :: ZTMPA,ZRHOP1(KLON,KLEV)!,zdummy,zdum2d(KLON,KLEV),zdum3d(KLON,KLEV,nmod),zlfrac_so2(KLON,KLEV),ZFLXR,ZFLXS,ZFLXRB,ZFLXSB -REAL(KIND=JPRB) :: pmrateps(KLON,KLEV),pmrater(KLON,KLEV),pfevapr(KLON,KLEV),pfsubls(KLON,KLEV),pmsnowacl(KLON,KLEV)!,ZDPG(KLON,KLEV),zxtp1c(KLON,KLEV,KTRAC),zxtp10(KLON,KLEV,KTRAC) LOGICAL :: LLIQCLD(KLON,KLEV) ! logical for liquid cloud LOGICAL :: LICECLD(KLON,KLEV) ! logical for ice cloud -INTEGER(KIND=JPIM) ::KTOP -REAL(KIND=JPRB),PARAMETER :: ZEPSEC=1e-14 -!REAL(KIND=JPRB) :: ZAEROUT1(KLON,KLEV),ZAEROUT2(KLON,KLEV),ZAEROUT3(KLON,KLEV),ZAEROUT4(KLON,KLEV),ZAEROUT5(KLON,KLEV) + +REAL(KIND=JPRB), PARAMETER :: ZEPSEC=1e-14 + +! [RCHG -> var non used ] INTEGER(KIND=JPIM) :: j_yaerom, JMMD, JSCAV, JSW, JSPEC +! [RCHG -> var. non used ] INTEGER(KIND=JPIM) :: IAER, IEX3D, IEX3DP +! [RCHG -> vas. non used ] INTEGER(KIND=JPIM) :: IEXTR2,ISHIFT1, IKPAER, IKP, ISTO, IWHERE +! [RCHG -> var. non used ] INTEGER(KIND=JPIM) :: NSO4SCHEME +! [RCHG -> non used ] REAL(KIND=JPRB) :: ZLAT, ZLON +! [RCHG -> non used ] REAL(KIND=JPRB) :: BETAB(KLON,KLEV), ZBETAI(KLON,KLEV) +! [RCHG -> non used ] REAL(KIND=JPRB) :: ZCLDWAT(KLON,KLEV), ZDUM(KLON,KLEV) +! [RCHG -> non used ] REAL(KIND=JPRB) :: ZBCPHI(KLON,KLEV), ZBCPHO(KLON,KLEV) +! [RCHG -> non used ] REAL(KIND=JPRB) :: ZOMPHI(KLON,KLEV) , ZOMPHO(KLON,KLEV) +! [RCHG -> non used ] REAL(KIND=JPRB) :: ZTBCPHI(KLON,KLEV),ZTBCPHO(KLON,KLEV) +! [RCHG -> non used ] REAL(KIND=JPRB) :: ZTOMPHI(KLON,KLEV), ZTOMPHO(KLON,KLEV) +! [RCHG -> non used ] REAL(KIND=JPRB) :: ZITBCPHO(KLON,KLEV),ZITOMPHO(KLON,KLEV) +! [RCHG -> non used ] REAL(KIND=JPRB) :: ZAIRDM(KLON), ZRHCL(KLON,KLEV) +! [RCHG -> non used ] REAL(KIND=JPRB) :: ZTAERI(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO) +! [RCHG -> non used ] REAL(KIND=JPRB) :: ZAERWET(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO) +! REAL(KIND=JPRB) :: ZAERNL(KLON,KLEV,NMOD) +! REAL(KIND=JPRB) :: ZAERML(KLON,KLEV,NAERMOD) +! [RCHG -> var non used ] INTEGER(KIND=JPIM) :: JMOD +! [RCHG -> var non used ] INTEGER(KIND=JPIM) :: JAERCLASS +! [RCHG -> non used ] REAL(KIND=JPRB) :: ZTENV(KLON) +! [RCHG -> non used ] REAL(KIND=JPRB) :: ZGDT +! [RCHG -> non used ] REAL(KIND=JPRB) :: ZVISICL, ZVISIPR, ZVISCAE, ZVISPAE +!REAL(KIND=JPRB) :: PAER_TAU(KLON,KLEV,14), PAER_SSA(KLON,KLEV,14),PAER_ASYM(KLON,KLEV,14) +!REAL(KIND=JPRB), ALLOCATABLE :: ZAERSRC(:,:), ZAERNGT(:,:) , ZAERSCC(:,:) +! [RCHG -> non used ] REAL(KIND=JPRB) :: ZQRWP, ZQSWP, ZQIWP, ZRANGE, ZRELRA, ZSIGAIR, ZSNOICE +! [RCHG -> non used ] REAL(KIND=JPRB) :: Z1CLD, ZCFLIRA, ZCFSNIC, ZDENSVIS, ZDESIC, ZCLWAT, ZLIQRAI, ZNS +! [RCHG -> non used ] REAL(KIND=JPRB) :: ZVISCON, ZVISRAY +! [RCHG -> non used ] REAL(KIND=JPRB) :: pmrateps(KLON,KLEV),pmrater(KLON,KLEV),pfevapr(KLON,KLEV) +! [RCHG -> non used ] REAL(KIND=JPRB) :: pfsubls(KLON,KLEV),pmsnowacl(KLON,KLEV) +! [RCHG -> non used ] REAL(KIND=JPRB) :: ZDPG(KLON,KLEV),zxtp1c(KLON,KLEV,KTRAC),zxtp10(KLON,KLEV,KTRAC) +! [RCHG -> non used ] INTEGER(KIND=JPIM) ::KTOP +! [RCHG -> non used ] REAL(KIND=JPRB) :: ZRHOP1(KLON,KLEV)!,zdummy,zdum2d(KLON,KLEV),zdum3d(KLON,KLEV,nmod) +! [RCHG -> non used ] REAL(KIND=JPRB) :: zlfrac_so2(KLON,KLEV),ZFLXR,ZFLXS,ZFLXRB,ZFLXSB +! [RCHG -> non used ] REAL(KIND=JPRB) :: ZAEROUT1(KLON,KLEV),ZAEROUT2(KLON,KLEV),ZAEROUT3(KLON,KLEV),ZAEROUT4(KLON,KLEV),ZAEROUT5(KLON,KLEV) REAL(KIND=JPRB),PARAMETER :: INFINITY=HUGE(1._JPRB) REAL(KIND=JPHOOK) :: ZHOOK_HANDLE -INTEGER(kind=JPIM) :: jj ! loop index - ! variables for the M7 call REAL(KIND=JPRB) :: ZGRVOL(KLON,KLEV) !grid box volume for diagnostics REAL(KIND=JPRB) :: ZPBL(KLON) !planetary boundary layer top level (in vdfmain.F90 ITOP=1) @@ -372,7 +400,6 @@ SUBROUTINE HAMM7_INTERFACE & REAL(KIND=JPRB) :: ZICNC(KLON,KLEV) ! ice crystal number concentration [#/cm3] ! added here variables for dry deposition and sedimentation REAL(KIND=JPRB) :: ZTENCIH(KLON,KLEV,ntrac) !for HAM tendencies -REAL(KIND=JPRB) :: ZTENCI(KLON,KLEV,KTRAC) !for OIFS tendencies REAL(KIND=JPRB) :: ZAHFSM(KLON) REAL(KIND=JPRB) :: ZWND(KLON) ! variables not needed for HAM aerosol dry deposition (if gas deposition and different surfaces are taken into account these need to be revised!) @@ -387,10 +414,10 @@ SUBROUTINE HAMM7_INTERFACE & REAL(KIND=JPRB) :: ZCDNL(KLON), ZCDNW(KLON) !ustar (in not used variable), aerodynamic resis. on surface (in not used variable) REAL(KIND=JPRB) :: ZXTMD1(KLON,KLEV,ntrac) !tracer mixing ratios for HAM drydep (updated with tend) ! output diagnostics -REAL(KIND=JPRB) :: ZOUT(KLON,ntrac),ZOUT2(KLON,14),zout3(KLON,KLEV,2*(naerocomp+nclass)) -REAL(KIND=JPRB) :: ZOUT4(KLON,KLEV),ZOUT5(KLON,klev),ZOUT6(KLON,klev),ZOUT7(KLON,klev),ZOUT8(KLON,klev),ZOUT9(KLON,klev) -REAL(KIND=JPRB) :: ZZOUT1(KLON,KLEV),ZZOUT2(KLON,klev),ZZOUT3(KLON,KLEV),ZZOUT4(KLON,KLEV),ZZOUT5(KLON,klev),ZZOUT6(KLON,KLEV) -REAL(KIND=JPRB) :: ZZOUT7(KLON,KLEV),ZZOUT8(KLON,klev),ZZOUT9(KLON,KLEV),ZZOUT10(KLON,KLEV),ZZOUT11(KLON,klev),ZZOUT12(KLON,KLEV) + REAL(KIND=JPRB) :: ZOUT(KLON,ntrac),ZOUT2(KLON,14),zout3(KLON,KLEV,2*(naerocomp+nclass)) +!REAL(KIND=JPRB) :: ZOUT4(KLON,KLEV),ZOUT5(KLON,klev),ZOUT6(KLON,klev),ZOUT7(KLON,klev),ZOUT8(KLON,klev),ZOUT9(KLON,klev) +!REAL(KIND=JPRB) :: ZZOUT1(KLON,KLEV),ZZOUT2(KLON,klev),ZZOUT3(KLON,KLEV),ZZOUT4(KLON,KLEV),ZZOUT5(KLON,klev),ZZOUT6(KLON,KLEV) +!REAL(KIND=JPRB) :: ZZOUT7(KLON,KLEV),ZZOUT8(KLON,klev),ZZOUT9(KLON,KLEV),ZZOUT10(KLON,KLEV),ZZOUT11(KLON,klev),ZZOUT12(KLON,KLEV) REAL(KIND=JPRB) :: sedout(KLON,KLEV,ktrac) REAL(KIND=JPRB) :: ddepout(KLON,KLEV,KTRAC) @@ -409,27 +436,24 @@ SUBROUTINE HAMM7_INTERFACE & REAL(KIND=JPRB) :: ZDDEPFLUX(KLON,ntrac) REAL(KIND=JPRB) :: ZDDEPFLUX_SO2(KLON) REAL(KIND=JPRB) :: ZVDEP(KLON,ntrac) !ddep velocity for diagnostics from ham -INTEGER(kind=JPIM)::ZISO4 ! temporary tracer index of gas-phase SO4 (retrieved from chemistry module) INTEGER(kind=JPIM), parameter::ZKROW=1 ! KROW only used in ECHAM but needed inside HAM-codes so set as 1. INTEGER(kind=JPIM):: IBLK - REAL(KIND=JPRB) :: reffi(KLON,KLEV,ZKROW), reffl(KLON,KLEV,ZKROW) - -INTEGER(kind=JPIM)::ISO4_C, ISSO4_C ! temporary tracer index of gas-phase SO4 (retrieved from chemistry module) -REAL(KIND=JPRB)::zhenry_so2(2),zheneff(KLON,klev),ze2(KLON,KLEV),zqtp1(KLON,KLEV),zza(KLON,klev),ze3(KLON,klev) - INTEGER(kind=JPIM)::LWBANDS !laakso: number of LW bands -INTEGER(KIND=JPIM) :: IWHAT, INWAVL, ITWAVL(20) +INTEGER(KIND=JPIM) :: INWAVL, ITWAVL(20) REAL(KIND=JPRB) ::PRS1D(KLON,KLEV) -!TEST -REAL(KIND=JPRB) :: TEST1(KLON,KLEV) -REAL(KIND=JPRB) :: TEST2(KLON,KLEV) -REAL(KIND=JPRB) :: TEST3(KLON,KLEV) -REAL(KIND=JPRB) :: TEST4(KLON,KLEV) -REAL(KIND=JPRB) :: TEST5(KLON,KLEV) -REAL(KIND=JPRB) :: TEST6(KLON,KLEV) -REAL(KIND=JPRB) :: TEST7(KLON,KLEV) -REAL(KIND=JPRB) :: TEST8(KLON,KLEV) +INTEGER(kind=JPIM)::ISO4_C, ISSO4_C ! temporary tracer index of gas-phase SO4 (retrieved from chemistry module) + +! [RCHG -> non used ] REAL(KIND=JPRB) :: ZTENCI(KLON,KLEV,KTRAC) !for OIFS tendencies +! [RCHG -> non used ] INTEGER(kind=JPIM)::ZISO4 ! temporary tracer index of gas-phase SO4 (retrieved from chemistry module) +! [RCHG -> non used ] REAL(KIND=JPRB):: zza(KLON,klev) +! [RCHG -> non used ] REAL(KIND=JPRB)::zhenry_so2(2),zheneff(KLON,klev),ze3(KLON,klev), zqtp1(KLON,KLEV) +! [RCHG -> non used ] INTEGER(KIND=JPIM) :: IWHAT +! [RCHG -> non used] REAL(KIND=JPRB) :: TEST1(KLON,KLEV), TEST2(KLON,KLEV) +! [RCHG -> non used] REAL(KIND=JPRB) :: TEST3(KLON,KLEV), TEST4(KLON,KLEV) +! [RCHG -> non used] REAL(KIND=JPRB) :: TEST5(KLON,KLEV), TEST6(KLON,KLEV) +! [RCHG -> non used] REAL(KIND=JPRB) :: TEST7(KLON,KLEV), TEST8(KLON,KLEV) + REAL(KIND=JPRB) :: PAOD(KLON,NASWBAND), PSSA(KLON,NASWBAND), PABS(KLON,NASWBAND), PASY(KLON,NASWBAND),PFAOD(KLON,NASWBAND) @@ -442,45 +466,81 @@ SUBROUTINE HAMM7_INTERFACE & #include "tm5m7_optics_aop_get.intfb.h" #include "troplev.intfb.h" #include "chem_inext.intfb.h" -!#include "m7.intfb.h" #include "m7_simple_sulfur_drydep.intfb.h" -! include calculations for ice effective radius #include "ice_effective_radius.intfb.h" +!#include "m7.intfb.h" +! include calculations for ice effective radius !----------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('TM5M7',0,ZHOOK_HANDLE) -ASSOCIATE(YGFL=>YDMODEL%YRML_GCONF%YGFL, YREAERSRC=>YDMODEL%YRML_PHY_AER%YREAERSRC,YREAERATM=>YDMODEL%YRML_PHY_RAD%YREAERATM, & - & YREAERLID=>YDMODEL%YRML_PHY_AER%YREAERLID, YREAERSNK=>YDMODEL%YRML_PHY_AER%YREAERSNK, YRERAD=>YDMODEL%YRML_PHY_RAD%YRERAD,& - & YDRIP=>YDMODEL%YRML_GCONF%YRRIP,YDCHEM=>YDMODEL%YRML_CHEM%YRCHEM, YRCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO, YREPHY=>YDMODEL%YRML_PHY_EC%YREPHY, & - & YRECLDP=>YDMODEL%YRML_PHY_EC%YRECLDP, & - & YDSPP_CONFIG=>YDMODEL%YRML_GCONF%YRSPP_CONFIG) - - ASSOCIATE(NACTAERO=>YGFL%NACTAERO, NAERO=>YGFL%NAERO, NGHG=>YGFL%NGHG, NCHEM=>YGFL%NCHEM, ZTRAC=>YGFL%NTRAC, NSO4SCHEME => YREAERSRC%NSO4SCHEME, & - & NDIM=>YGFL%NDIM, YAEROUT=>YGFL%YAEROUT, YR=>YGFL%YR, YS=>YGFL%YS, & - & LCHEM_DIA=>YRCOMPO%LCHEM_DIA, YCHEM=>YGFL%YCHEM, YAERO=>YGFL%YAERO, YGHG=>YGFL%YGHG, YTRAC=>YGFL%YTRAC, & - & YDAERM7=>YDMODEL%YRML_PHY_AER%YREAEROPT, &! use this to transfer AOD, SSA and ASY to rad scheme - & LAERDRYDP=>YDMODEL%YRML_PHY_RAD%YREAERATM%LAERDRYDP, LAERSEDIM=>YDMODEL%YRML_PHY_RAD%YREAERATM%LAERSEDIM, LAERSURF=>YDMODEL%YRML_PHY_RAD%YREAERATM%LAERSURF, & !add logicals for dry dep and sedi - & YCDNC=>YDMODEL%YRML_GCONF%YGFL%YCDNC, YICNC=>YDMODEL%YRML_GCONF%YGFL%YICNC, YRE_LIQ=>YDMODEL%YRML_GCONF%YGFL%YRE_LIQ, YRE_ICE=>YDMODEL%YRML_GCONF%YGFL%YRE_ICE, & !included CDNC, ICNC, liq and ice eff rad - & LAER6SDIA=>YDMODEL%YRML_PHY_RAD%YREAERATM%LAER6SDIA, LAERCLIMG=>YDMODEL%YRML_PHY_RAD%YREAERATM%LAERCLIMG, & - & LAERCLIMZ=>YDMODEL%YRML_PHY_RAD%YREAERATM%LAERCLIMZ, LAERGTOP=>YDMODEL%YRML_PHY_RAD%YREAERATM%LAERGTOP, & - & LAERHYGRO=>YDMODEL%YRML_PHY_RAD%YREAERATM%LAERHYGRO, LAERLISI=>YDMODEL%YRML_PHY_RAD%YREAERATM%LAERLISI, & - & LAERNGAT=>YDMODEL%YRML_PHY_RAD%YREAERATM%LAERNGAT, LAERSCAV=>YDMODEL%YRML_PHY_RAD%YREAERATM%LAERSCAV, & - & LAERNITRATE => YDMODEL%YRML_CHEM%YRCOMPO%LAERNITRATE, & - & LAERSCAV_CHEM=>YDMODEL%YRML_PHY_RAD%YREAERATM%LAERSCAV_CHEM, LAERVOL=>YDMODEL%YRML_PHY_RAD%YREAERATM%LAERVOL, & - & LAERCHEM=>YDMODEL%YRML_GCONF%YGFL%LAERCHEM, & +ASSOCIATE( & + & YGFL => YDMODEL%YRML_GCONF%YGFL, & + & YDPHYRAD => YDMODEL%YRML_PHY_RAD, & + & YDPHYAER => YDMODEL%YRML_PHY_AER, & + & YREAERSRC => YDMODEL%YRML_PHY_AER%YREAERSRC, & + & YREAERATM => YDMODEL%YRML_PHY_RAD%YREAERATM, & + & YREAERLID => YDMODEL%YRML_PHY_AER%YREAERLID, & + & YREAERSNK => YDMODEL%YRML_PHY_AER%YREAERSNK, & + & YRERAD => YDMODEL%YRML_PHY_RAD%YRERAD, & + & YDRIP => YDMODEL%YRML_GCONF%YRRIP, & + & YDCHEM => YDMODEL%YRML_CHEM%YRCHEM, & + & YRCOMPO => YDMODEL%YRML_CHEM%YRCOMPO, & + & YREPHY => YDMODEL%YRML_PHY_EC%YREPHY, & + & YRECLDP => YDMODEL%YRML_PHY_EC%YRECLDP, & + & YDSPP_CONFIG => YDMODEL%YRML_GCONF%YRSPP_CONFIG) + + ASSOCIATE( & + ! --- YGFL ------------------------------------------------ + & NACTAERO => YGFL%NACTAERO, NAERO => YGFL%NAERO, & + & NGHG => YGFL%NGHG, NCHEM => YGFL%NCHEM, & + & ZTRAC => YGFL%NTRAC, NDIM => YGFL%NDIM, & + & YAEROUT => YGFL%YAEROUT, YR => YGFL%YR, & + & YS => YGFL%YS, YCHEM => YGFL%YCHEM, & + & YAERO => YGFL%YAERO, YGHG => YGFL%YGHG, & + & YTRAC => YGFL%YTRAC, YAEROCLIM => YGFL%YAEROCLIM, & + & YCDNC => YGFL%YCDNC, YICNC => YGFL%YICNC, & + & YRE_LIQ => YGFL%YRE_LIQ, YRE_ICE => YGFL%YRE_ICE, & + !included CDNC, ICNC, liq and ice eff rad + & NAERO_WVL_DIAG => YGFL%NAERO_WVL_DIAG, & + & LAERCHEM => YGFL%LAERCHEM, & + ! --- YRCOMPO --------------------------------------------- + & LCHEM_DIA => YRCOMPO%LCHEM_DIA, & + & AERO_SCHEME => YRCOMPO%AERO_SCHEME, & !CHEM_SCHEME=>YDCHEM%CHEM_SCHEME,& + & LAERNITRATE => YRCOMPO%LAERNITRATE, & + & NSO4SCHEME => YREAERSRC%NSO4SCHEME, & + ! --- YREAERATM ------------------------------------------- + & LAERDRYDP => YREAERATM%LAERDRYDP, & + & LAERSEDIM => YREAERATM%LAERSEDIM, & + & LAERSURF => YREAERATM%LAERSURF, & !add logicals for dry dep and sedi + & LAER6SDIA => YREAERATM%LAER6SDIA, & + & LAERCLIMG => YREAERATM%LAERCLIMG, & + & LAERCLIMZ => YREAERATM%LAERCLIMZ, & + & LAERGTOP => YREAERATM%LAERGTOP, & + & LAERHYGRO => YREAERATM%LAERHYGRO, & + & LAERLISI => YREAERATM%LAERLISI, & + & LAERNGAT => YREAERATM%LAERNGAT, & + & LAERSCAV => YREAERATM%LAERSCAV, & + & LAERSCAV_CHEM => YREAERATM%LAERSCAV_CHEM, & + & LAERVOL => YREAERATM%LAERVOL, & + & NXT3DAER => YREAERATM%NXT3DAER, & + ! --- YRERAD ---------------------------------------------- + & LAERVISI => YRERAD%LAERVISI, & + & NTSW => YRERAD%NTSW, & + & RNS => YRERAD%RNS, & + & RSIGAIR => YRERAD%RSIGAIR, & !!! YAERCLIM is now become YAEROCLIM + & NRADFR => YRERAD%NRADFR, & !FREQUENCY OF FULL RADIATION COMPUTATIONS + & NAEROOPT => YRERAD%NAEROOPT, & + ! --- OTHERS ---------------------------------------------- + & YDAERM7 => YDPHYAER%YREAEROPT, & ! use this to transfer AOD, SSA and ASY to rad scheme + & NWLID => YREAERLID%NWLID, & + & YSURF => YREPHY%YSURF, & + & RRHTAB => YREAERSNK%RRHTAB, & + & RNICE => YRECLDP%RNICE, & !default for ICNC + & RCLDMAX => YRECLDP%RCLDMAX, & !max cloud value + & NSTART => YDRIP%NSTART ) + ! & NINDSCAV=>YREAERATM%NINDSCAV, NTSCAV=>YREAERATM%NTSCAV, & - & NXT3DAER=>YDMODEL%YRML_PHY_RAD%YREAERATM%NXT3DAER, & - & NWLID=>YDMODEL%YRML_PHY_AER%YREAERLID%NWLID, & ! & NDDUST=>YREAERSRC%NDDUST, NTYPAER=>YREAERSRC%NTYPAER, & - & YSURF=>YDMODEL%YRML_PHY_EC%YREPHY%YSURF, & - & RRHTAB=>YDMODEL%YRML_PHY_AER%YREAERSNK%RRHTAB, & - & RNICE=>YDMODEL%YRML_PHY_EC%YRECLDP%RNICE, & !default for ICNC - & RCLDMAX=>YDMODEL%YRML_PHY_EC%YRECLDP%RCLDMAX, & !max cloud value - & LAERVISI=>YDMODEL%YRML_PHY_RAD%YRERAD%LAERVISI, NTSW=>YDMODEL%YRML_PHY_RAD%YRERAD%NTSW, RNS=>YDMODEL%YRML_PHY_RAD%YRERAD%RNS, & - & RSIGAIR=>YDMODEL%YRML_PHY_RAD%YRERAD%RSIGAIR,YAEROCLIM=>YDMODEL%YRML_GCONF%YGFL%YAEROCLIM, & !!! YAERCLIM is now become YAEROCLIM - & NSTART=>YDMODEL%YRML_GCONF%YRRIP%NSTART,AERO_SCHEME=>YDMODEL%YRML_CHEM%YRCOMPO%AERO_SCHEME,& !CHEM_SCHEME=>YDCHEM%CHEM_SCHEME,& - & NAERO_WVL_DIAG=>YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG, & - & NRADFR=>YDMODEL%YRML_PHY_RAD%YRERAD%NRADFR,NAEROOPT=>YDMODEL%YRML_PHY_RAD%YRERAD%NAEROOPT) !FREQUENCY OF FULL RADIATION COMPUTATIONS ! ------------------------------------------------------------------ !* 0. PROGNOSTIC AEROSOLS - FINAL COMPUTATIONS @@ -512,116 +572,114 @@ SUBROUTINE HAMM7_INTERFACE & !write(*,*) "15", minval(PSO2DD) +ZAHFSM = 0._JPRB +ZEPSCOV = 1.E-03_JPRB +ZEPSWAT = 1.E-18_JPRB +ZDEGRAD = 180._JPRB/RPI -ZAHFSM =0._JPRB -ZEPSCOV=1.E-03_JPRB -ZEPSWAT=1.E-18_JPRB -ZDEGRAD=180._JPRB/RPI CALL SURF_INQ(YSURF,PRWSAT=ZRWSAT) CALL SURF_INQ(YSURF,PRWPWP=ZRWPWP) !* 0.1 SWITCHING ON POSSIBLE DEBUG PRINTS AND ALLOCATING MEMORY ! -------------------------------------------------------- -!ALLOCATE( ZAERSRC(KLON,NACTAERO) ) ALLOCATE( ZAERNGT(KLON,NACTAERO) ) -!ALLOCATE( ZAERSCC(KLON,NACTAERO) ) +ZAERNGT(KIDIA:KFDIA,1:NACTAERO) = 0._JPRB +!ALLOCATE( ZAERSCC(KLON,NACTAERO) ) +!ALLOCATE( ZAERSRC(KLON,NACTAERO) ) !ZAERSRC(KIDIA:KFDIA,1:NACTAERO) =0._JPRB -ZAERNGT(KIDIA:KFDIA,1:NACTAERO) =0._JPRB !ZAERSCC(KIDIA:KFDIA,1:NACTAERO) =0._JPRB - !ZAEROUT1(:,:) =0._JPRB !ZAEROUT2(:,:) =0._JPRB !ZAEROUT3(:,:) =0._JPRB !ZAEROUT4(:,:) =0._JPRB !ZAEROUT5(:,:) =0._JPRB - -ZOUT(:,:) =0._JPRB -ZOUT2(:,:) =0._JPRB -ZOUT3(:,:,:) =0._JPRB -ZOUT4(:,:) =0._JPRB -ZOUT5(:,:) =0._JPRB -ZOUT6(:,:) =0._JPRB -ZOUT7(:,:) =0._JPRB -ZOUT8(:,:) =0._JPRB -ZOUT9(:,:) =0._JPRB - -ZZOUT1(:,:) =0._JPRB -ZZOUT2(:,:) =0._JPRB -ZZOUT3(:,:) =0._JPRB -ZZOUT4(:,:) =0._JPRB -ZZOUT5(:,:) =0._JPRB -ZZOUT6(:,:) =0._JPRB -ZZOUT7(:,:) =0._JPRB -ZZOUT8(:,:) =0._JPRB -ZZOUT9(:,:) =0._JPRB -ZZOUT10(:,:) =0._JPRB -ZZOUT11(:,:) =0._JPRB -ZZOUT12(:,:) =0._JPRB - -M7TEND_IN(:,:,:)=0._JPRB -M7TEND_OUT(:,:,:)=0._JPRB -SEDOUT(:,:,:)=0._JPRB -DDEPOUT(:,:,:)=0._JPRB -WDEPOUT(:,:,:)=0._JPRB -ZSEDIFLUX(:,:,:)=0._JPRB -ZDDEPFLUX(:,:)=0._JPRB -ZDDEPFLUX_SO2(:)=0._JPRB -ZVDA(:,:)=0._JPRB -SEDOUT_2D(:,:)=0._JPRB -DDEPOUT_2D(:,:)=0._JPRB -WDEPOUT_2D(:,:)=0._JPRB - -zaveragep(:,:,:)= 0.0_JPRB -zm7kappa(:,:,:)= 0.0_JPRB -zh2so4cs(:,:,:)= 0.0_JPRB -zm7prodcond(:,:,:)= 0.0_JPRB - -ZTAERO(:,:,:)=0._JPRB + ZOUT(:,:) = 0._JPRB + ZOUT2(:,:) = 0._JPRB + ZOUT3(:,:,:) = 0._JPRB +!ZOUT4(:,:) = 0._JPRB +!ZOUT5(:,:) = 0._JPRB +!ZOUT6(:,:) = 0._JPRB +!ZOUT7(:,:) = 0._JPRB +!ZOUT8(:,:) = 0._JPRB +!ZOUT9(:,:) = 0._JPRB +!ZZOUT1(:,:) = 0._JPRB +!ZZOUT2(:,:) = 0._JPRB +!ZZOUT3(:,:) = 0._JPRB +!ZZOUT4(:,:) = 0._JPRB +!ZZOUT5(:,:) = 0._JPRB +!ZZOUT6(:,:) = 0._JPRB +!ZZOUT7(:,:) = 0._JPRB +!ZZOUT8(:,:) = 0._JPRB +!ZZOUT9(:,:) = 0._JPRB +!ZZOUT10(:,:) = 0._JPRB +!ZZOUT11(:,:) = 0._JPRB +!ZZOUT12(:,:) = 0._JPRB + +M7TEND_IN(:,:,:) = 0._JPRB +M7TEND_OUT(:,:,:) = 0._JPRB +SEDOUT(:,:,:) = 0._JPRB +DDEPOUT(:,:,:) = 0._JPRB +WDEPOUT(:,:,:) = 0._JPRB +ZSEDIFLUX(:,:,:) = 0._JPRB +ZDDEPFLUX(:,:) = 0._JPRB +ZDDEPFLUX_SO2(:) = 0._JPRB +ZVDA(:,:) = 0._JPRB +SEDOUT_2D(:,:) = 0._JPRB +DDEPOUT_2D(:,:) = 0._JPRB +WDEPOUT_2D(:,:) = 0._JPRB + +zaveragep(:,:,:) = 0.0_JPRB +zm7kappa(:,:,:) = 0.0_JPRB +zh2so4cs(:,:,:) = 0.0_JPRB +zm7prodcond(:,:,:) = 0.0_JPRB + +ZTAERO(:,:,:) = 0._JPRB !ZAERSRC(KIDIA:KFDIA,1:NACTAERO)=PAERSRC(KIDIA:KFDIA,1:NACTAERO) ! computation of tropopause level CALL TROPLEV(KLON,KIDIA,KFDIA,KLEV,.FALSE.,PTP,PQP,PRSF1,IKLEVTROP) -! Initializing tracer number and mixing ratios and gas concentrations to not be tendency updated values -ZCEN(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB -ITRC=0 -DO JEXT=1,NGHG - ITRC=ITRC+1 - DO JK=1,KLEV - DO JL=KIDIA,KFDIA - ZCEN(JL,JK,ITRC) = PGFL(JL,JK,YGHG(JEXT)%MP9_PH) - ENDDO - ENDDO -ENDDO -DO JEXT=1,ZTRAC - ITRC=ITRC+1 - DO JK=1,KLEV - DO JL=KIDIA,KFDIA - ZCEN(JL,JK,ITRC) = PGFL(JL,JK,YTRAC(JEXT)%MP9_PH) + + ! Initializing tracer number and mixing ratios and gas concentrations to not be tendency updated values + ZCEN(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB + ITRC=0 + DO JEXT=1,NGHG + ITRC=ITRC+1 + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZCEN(JL,JK,ITRC) = PGFL(JL,JK,YGHG(JEXT)%MP9_PH) + ENDDO + ENDDO ENDDO - ENDDO -ENDDO -DO JEXT=1,NAERO - ITRC=ITRC+1 - DO JK=1,KLEV - DO JL=KIDIA,KFDIA - ZCEN(JL,JK,ITRC) = PGFL(JL,JK,YAERO(JEXT)%MP9_PH) + DO JEXT=1,ZTRAC + ITRC=ITRC+1 + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZCEN(JL,JK,ITRC) = PGFL(JL,JK,YTRAC(JEXT)%MP9_PH) + ENDDO + ENDDO ENDDO - ENDDO -ENDDO -if(LAERCHEM) then - DO JEXT=1,NCHEM + DO JEXT=1,NAERO ITRC=ITRC+1 DO JK=1,KLEV - DO JL=KIDIA,KFDIA - ZCEN(JL,JK,ITRC) = PGFL(JL,JK,YCHEM(JEXT)%MP9_PH) - ENDDO + DO JL=KIDIA,KFDIA + ZCEN(JL,JK,ITRC) = PGFL(JL,JK,YAERO(JEXT)%MP9_PH) + ENDDO ENDDO - ENDDO -end if + ENDDO + if(LAERCHEM) then + DO JEXT=1,NCHEM + ITRC=ITRC+1 + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZCEN(JL,JK,ITRC) = PGFL(JL,JK,YCHEM(JEXT)%MP9_PH) + ENDDO + ENDDO + ENDDO + end if DO JAER=1,NACTAERO DO JK=1,KLEV @@ -652,10 +710,10 @@ SUBROUTINE HAMM7_INTERFACE & ENDDO ENDDO -ZM6RP(KIDIA:KFDIA,:,:)=0.0_JPRB -ZM6DRY(KIDIA:KFDIA,:,:)=0.0_JPRB -ZRHOP(KIDIA:KFDIA,:,:)=0.0_JPRB -ZWW(KIDIA:KFDIA,:,:)=0.0_JPRB +ZM6RP(KIDIA:KFDIA,:,:) = 0.0_JPRB +ZM6DRY(KIDIA:KFDIA,:,:) = 0.0_JPRB +ZRHOP(KIDIA:KFDIA,:,:) = 0.0_JPRB +ZWW(KIDIA:KFDIA,:,:) = 0.0_JPRB !ZAERML(KIDIA:KFDIA,:,:)=0.0_JPRB !ZAERNL(KIDIA:KFDIA,:,:)=0.0_JPRB @@ -666,6 +724,7 @@ SUBROUTINE HAMM7_INTERFACE & +WRITE(NULOUT,*) '[HAMM7_INTERFACE]' !* 0.2 Preliminary computation !* GAS-TO-PARTICLE CONVERSION (SO2 -> SO4) @@ -742,6 +801,7 @@ SUBROUTINE HAMM7_INTERFACE & +WRITE(NULOUT,*) '[HAMM7_INTERFACE]' !* 1.1 COMPUTE RELATIVE HUMIDITY WITHOUT VERTICAL SMOOTING ! --------------------------------------------------- @@ -1723,12 +1783,14 @@ SUBROUTINE HAMM7_INTERFACE & IF(.NOT.LIFSMIN .AND. .NOT.LIFSTRAJ) THEN ! input for HAM-M7 - PGFL(KIDIA:KFDIA,1,YAEROUT(1)%MP)=PAOD(KIDIA:KFDIA,10)!PAER_TAU(KIDIA:KFDIA,1:KLEV,10) !533nm + + PGFL(KIDIA:KFDIA,1,YAEROUT(1)%MP)=PAOD(KIDIA:KFDIA,10) !PAER_TAU(KIDIA:KFDIA,1:KLEV,10) !533nm do JK=1,KLEV PGFL(KIDIA:KFDIA,2,YAEROUT(1)%MP)= PGFL(KIDIA:KFDIA,2,YAEROUT(1)%MP)+PAER_SSA(KIDIA:KFDIA,JK,10)!PAER_TAU(KIDIA:KFDIA,1:KLEV,10) !533nm PGFL(KIDIA:KFDIA,3,YAEROUT(1)%MP)= PGFL(KIDIA:KFDIA,3,YAEROUT(1)%MP)+PAER_ASYM(KIDIA:KFDIA,JK,10)!PAER_TAU(KIDIA:KFDIA,1:KLEV,10) !533nm end do + PGFL(KIDIA:KFDIA,1:14,YAEROUT(12)%MP)=PAOD(KIDIA:KFDIA,1:14) do JN=1,naerocomp!ntrac!NACTAERO @@ -1875,6 +1937,7 @@ SUBROUTINE HAMM7_INTERFACE & !if (allocated(w_large)) DEALLOCATE( w_large ) !if (allocated(w_turb)) DEALLOCATE( w_turb ) + END ASSOCIATE END ASSOCIATE diff --git a/ifs-source/arpifs/phys_radi/radiation_scheme.F90 b/ifs-source/arpifs/phys_radi/radiation_scheme.F90 index c0bdb3bd..14172a4a 100644 --- a/ifs-source/arpifs/phys_radi/radiation_scheme.F90 +++ b/ifs-source/arpifs/phys_radi/radiation_scheme.F90 @@ -313,7 +313,7 @@ SUBROUTINE RADIATION_SCHEME & & .OR. YDMODEL%YRML_PHY_RAD%YREAERATM%LAERRRTM & & .OR. YRERAD%NAERMACC == 1) THEN IF ( TRIM(AERO_SCHEME) == "hamm7" ) THEN - CALL AEROSOL%ALLOCATE_DIRECT(RAD_CONFIG, KLON, 1, KLEV) ! HAM aerosols + CALL AEROSOL%ALLOCATE_DIRECT(RAD_CONFIG, KLON, 1, KLEV) ELSE CALL AEROSOL%ALLOCATE(KLON, 1, KLEV, KAEROSOL) ! MACC aerosols (Number of columns,istartlev, iendlev, number of SW+LW bands) ENDIF @@ -608,7 +608,7 @@ SUBROUTINE RADIATION_SCHEME & AEROSOL%OD_LW(1:YRERAD%NTSW,:,KIDIA:KFDIA) = 0.0_JPRB ENDIF - ! fill with M7 values + ! fill with M7 values -> IF (YRERAD%NAEROOPT>0) THEN IF (RAD_CONFIG%DO_SW) THEN DO JAER = 1,YRERAD%NTSW diff --git a/ifs-source/arpifs/phys_radi/suecrad.F90 b/ifs-source/arpifs/phys_radi/suecrad.F90 index d8013e4a..36490eaa 100644 --- a/ifs-source/arpifs/phys_radi/suecrad.F90 +++ b/ifs-source/arpifs/phys_radi/suecrad.F90 @@ -521,7 +521,7 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) ! -------------------------- NCLOUDACT= 0 NAEROOPT = 2 !Default (will be)=2, HAM optics (faster and calculated for LW too) - +!NAEROOPT = 0 LERAD1H=.FALSE. NLNGR1H=12 diff --git a/ifs-source/arpifs/setup/su_surf_flds.F90 b/ifs-source/arpifs/setup/su_surf_flds.F90 index 736ce4ef..bd8e4e07 100644 --- a/ifs-source/arpifs/setup/su_surf_flds.F90 +++ b/ifs-source/arpifs/setup/su_surf_flds.F90 @@ -1193,10 +1193,10 @@ SUBROUTINE SU_SURF_FLDS(YDDIMV,YDSURF,YDMODEL,LDVERBOSE) & KGRIB=NGRBSLT ,CDNAME='SOIL TYPE ',KTRAJ=2,KREQIN=1) YSD_VF%YCLK => YSD_VF%YVF(YSD_VFD%IPTR) CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YCLK ,& - & KGRIB=NGRBCL ,CDNAME='LAKE COVER ',KTRAJ=2,KREQIN=IREQINLAKE) + & KGRIB=NGRBCL , CDNAME='LAKE COVER ',KTRAJ=2,KREQIN=IREQINLAKE) YSD_VF%YDL => YSD_VF%YVF(YSD_VFD%IPTR) CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YDL ,& - & KGRIB=NGRBDL ,CDNAME='LAKE DEPTH ',KTRAJ=2,KREQIN=IREQINLAKE) + & KGRIB=NGRBDL , CDNAME='LAKE DEPTH ',KTRAJ=2,KREQIN=IREQINLAKE) YSD_VF%YCI => YSD_VF%YVF(YSD_VFD%IPTR) CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YCI ,& & KGRIB=NGRBCI ,CDNAME='SEA ICE COVER ',KTRAJ=ISURFTRAJ,KREQIN=1) @@ -1243,7 +1243,7 @@ SUBROUTINE SU_SURF_FLDS(YDDIMV,YDSURF,YDMODEL,LDVERBOSE) ! Near-IR diffuse albedo YSD_VF%YALNID => YSD_VF%YVF(YSD_VFD%IPTR) CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YALNID,& - & KGRIB=NGRBALNID,CDNAME='M_ALB.N-IR DIFFU',KTRAJ=2,KREQIN=IREQIN_MODIS4) + & KGRIB=NGRBALNID, CDNAME='M_ALB.N-IR DIFFU',KTRAJ=2,KREQIN=IREQIN_MODIS4) ! Six-component MODIS land albedo scheme ! UV/Vis albedo: isotropic component @@ -1333,7 +1333,7 @@ SUBROUTINE SU_SURF_FLDS(YDDIMV,YDSURF,YDMODEL,LDVERBOSE) IREQIN=-1 !END IF CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YSOILTYPE, & - & KGRIB=NGRBSOILTYPE, CDNAME='TM5M7 soil type',KTRAJ=2,KREQIN=IREQIN) + & KGRIB=NGRBSOILTYPE, CDNAME='TM5M7 soil type ',KTRAJ=2,KREQIN=IREQIN) END IF diff --git a/ifs-test/tests/t255/common/m7/m7_aero.nml b/ifs-test/tests/t255/common/m7/m7_aero.nml index a4302fd1..48ede344 100644 --- a/ifs-test/tests/t255/common/m7/m7_aero.nml +++ b/ifs-test/tests/t255/common/m7/m7_aero.nml @@ -314,4 +314,98 @@ YAERO_NL(39)%NREQIN=0, YAERO_NL(40)%CNAME='Total_aerosol', YAERO_NL(40)%IGRBCODE=210048, YAERO_NL(40)%LADV5=true, + +NAEROUT=45, +YAEROUT_NL(1)%CNAME='AEROUT-1', +YAEROUT_NL(1)%IGRBCODE=219001, +YAEROUT_NL(2)%CNAME='AEROUT-2', +YAEROUT_NL(2)%IGRBCODE=219002, +YAEROUT_NL(3)%CNAME='AEROUT-3', +YAEROUT_NL(3)%IGRBCODE=219003, +YAEROUT_NL(4)%CNAME='AEROUT-4', +YAEROUT_NL(4)%IGRBCODE=219004, +YAEROUT_NL(5)%CNAME='AEROUT-5', +YAEROUT_NL(5)%IGRBCODE=219005, +YAEROUT_NL(6)%CNAME='AEROUT-6', +YAEROUT_NL(6)%IGRBCODE=219006, +YAEROUT_NL(7)%CNAME='AEROUT-7', +YAEROUT_NL(7)%IGRBCODE=219007, +YAEROUT_NL(8)%CNAME='AEROUT-8', +YAEROUT_NL(8)%IGRBCODE=219008, +YAEROUT_NL(9)%CNAME='AEROUT-9', +YAEROUT_NL(9)%IGRBCODE=219009, +YAEROUT_NL(10)%CNAME='AEROUT-10', +YAEROUT_NL(10)%IGRBCODE=219010, +YAEROUT_NL(11)%CNAME='AEROUT-11', +YAEROUT_NL(11)%IGRBCODE=219011, +YAEROUT_NL(12)%CNAME='AEROUT-12', +YAEROUT_NL(12)%IGRBCODE=219012, +YAEROUT_NL(13)%CNAME='AEROUT-13', +YAEROUT_NL(13)%IGRBCODE=219013, +YAEROUT_NL(14)%CNAME='AEROUT-14', +YAEROUT_NL(14)%IGRBCODE=219014, +YAEROUT_NL(15)%CNAME='AEROUT-15', +YAEROUT_NL(15)%IGRBCODE=219015, +YAEROUT_NL(16)%CNAME='AEROUT-16', +YAEROUT_NL(16)%IGRBCODE=219016, +YAEROUT_NL(17)%CNAME='AEROUT-17', +YAEROUT_NL(17)%IGRBCODE=219017, +YAEROUT_NL(18)%CNAME='AEROUT-18', +YAEROUT_NL(18)%IGRBCODE=219018, +YAEROUT_NL(19)%CNAME='AEROUT-19', +YAEROUT_NL(19)%IGRBCODE=219019, +YAEROUT_NL(20)%CNAME='AEROUT-20', +YAEROUT_NL(20)%IGRBCODE=219020, +YAEROUT_NL(21)%CNAME='AEROUT-21', +YAEROUT_NL(21)%IGRBCODE=219021, +YAEROUT_NL(22)%CNAME='AEROUT-22', +YAEROUT_NL(22)%IGRBCODE=219022, +YAEROUT_NL(23)%CNAME='AEROUT-23', +YAEROUT_NL(23)%IGRBCODE=219023, +YAEROUT_NL(24)%CNAME='AEROUT-24', +YAEROUT_NL(24)%IGRBCODE=219024, +YAEROUT_NL(25)%CNAME='AEROUT-25', +YAEROUT_NL(25)%IGRBCODE=219025, +YAEROUT_NL(26)%CNAME='AEROUT-26', +YAEROUT_NL(26)%IGRBCODE=219026, +YAEROUT_NL(27)%CNAME='AEROUT-27', +YAEROUT_NL(27)%IGRBCODE=219027, +YAEROUT_NL(28)%CNAME='AEROUT-28', +YAEROUT_NL(28)%IGRBCODE=219028, +YAEROUT_NL(29)%CNAME='AEROUT-29', +YAEROUT_NL(29)%IGRBCODE=219029, +YAEROUT_NL(30)%CNAME='AEROUT-30', +YAEROUT_NL(30)%IGRBCODE=219030, +YAEROUT_NL(31)%CNAME='AEROUT-31', +YAEROUT_NL(31)%IGRBCODE=219031, +YAEROUT_NL(32)%CNAME='AEROUT-32', +YAEROUT_NL(32)%IGRBCODE=219032, +YAEROUT_NL(33)%CNAME='AEROUT-33', +YAEROUT_NL(33)%IGRBCODE=219033, +YAEROUT_NL(34)%CNAME='AEROUT-34', +YAEROUT_NL(34)%IGRBCODE=219034, +YAEROUT_NL(35)%CNAME='AEROUT-35', +YAEROUT_NL(35)%IGRBCODE=219035, +YAEROUT_NL(36)%CNAME='AEROUT-36', +YAEROUT_NL(36)%IGRBCODE=219036, +YAEROUT_NL(37)%CNAME='AEROUT-37', +YAEROUT_NL(37)%IGRBCODE=219037, +YAEROUT_NL(38)%CNAME='AEROUT-38', +YAEROUT_NL(38)%IGRBCODE=219038, +YAEROUT_NL(39)%CNAME='AEROUT-39', +YAEROUT_NL(39)%IGRBCODE=219039, +YAEROUT_NL(40)%CNAME='AEROUT-40', +YAEROUT_NL(40)%IGRBCODE=219040, +YAEROUT_NL(41)%CNAME='AEROUT-41', +YAEROUT_NL(41)%IGRBCODE=219041, +YAEROUT_NL(42)%CNAME='AEROUT-42', +YAEROUT_NL(42)%IGRBCODE=219042, +YAEROUT_NL(43)%CNAME='AEROUT-43', +YAEROUT_NL(43)%IGRBCODE=219043, +YAEROUT_NL(44)%CNAME='AEROUT-44', +YAEROUT_NL(44)%IGRBCODE=219044, +YAEROUT_NL(45)%CNAME='AEROUT-45', +YAEROUT_NL(45)%IGRBCODE=219045, + + EOF diff --git a/ifs-test/tests/t255/common/m7/m7_aerowvldiag.nml b/ifs-test/tests/t255/common/m7/m7_aerowvldiag.nml index 86a28150..55609229 100644 --- a/ifs-test/tests/t255/common/m7/m7_aerowvldiag.nml +++ b/ifs-test/tests/t255/common/m7/m7_aerowvldiag.nml @@ -1,5 +1,4 @@ cat >> fort.4 << EOF -NAEROUT=0, NAERO_WVL_DIAG=6, NAERO_WVL_DIAG_TYPES=5, YAERO_WVL_DIAG_NL(1)%IWVL=550, diff --git a/ifs-test/tests/t255/test_compo_fc_m7/setup b/ifs-test/tests/t255/test_compo_fc_m7/setup index 7c24fb60..1361f082 100644 --- a/ifs-test/tests/t255/test_compo_fc_m7/setup +++ b/ifs-test/tests/t255/test_compo_fc_m7/setup @@ -71,9 +71,6 @@ EOF cat >> fort.4 << EOF LAERAOT=false, LAERLISI=false, -NAEROUT=0, -!YAEROUT_NL(1)%CNAME='AEROUT-7', -!YAEROUT_NL(1)%IGRBCODE=210022, NUVP=1, YUVP_NL(1)%CNAME='UVP2DRAD', YUVP_NL(1)%IGRBCODE=210055, diff --git a/oifs-config.nld5163.sh b/oifs-config.nld5163.sh index 1e6f28bc..fff5c6e3 100644 --- a/oifs-config.nld5163.sh +++ b/oifs-config.nld5163.sh @@ -32,11 +32,13 @@ export OIFS_PLATFORM="hpc2020" # branch_path="$(pwd)" # We run this script in its directoryr +old=$IFS IFS=$IFS"/" # We will split path in char "/". IFS variable is bash stuff. array_path=() # Initialize array to empty for i in $branch_path; do # We fill array with elements array_path+=($i) done +IFS=$old branch_name=${array_path[4]} # In my current setting branch_name is in position 3 (from 0) echo @@ -46,7 +48,7 @@ export OIFS_CYCLE=48r1 #---Base code assumes openifs-48r1 and openifs-expt are installed #---in $HOME. Either these can be changed by the user------------ -export OIFS_HOME="${PERM}/openifs/oifs_code/"$branch_name"/openifs-48r1" +export OIFS_HOME="${PERM}/openifs/oifs_code/"$branch_name"/openifs-48r1_fix_ifstests" #---It is recommended that the openifs-expt and oifs_data dir #---exist in a location designed for permanent storage----------- @@ -56,7 +58,8 @@ export OIFS_DATA_DIR="${HPCPERM}/openifs/oifs_data/"${OIFS_CYCLE} #---Set the path for the arch directory. Depending on system,i.e., #---all libs are installed on the sytem, this is not required, #---so set to an empty string OIFS_ARCH="" -export OIFS_ARCH="./arch/ecmwf/hpc2020" +#export OIFS_ARCH="./arch/ecmwf/hpc2020/gnu/" +export OIFS_ARCH="./arch/ecmwf/hpc2020/" #---Path to the executable for 3d global model. This is the #---default path for the exe, produced by openifs-test.sh. From 5a7678ccbebf47b84be2fd5b50e1765a78dd7ec5 Mon Sep 17 00:00:00 2001 From: Lianghai Wu Date: Thu, 30 May 2024 08:26:12 +0000 Subject: [PATCH 020/129] OIFS-531 M7 code memory leak fixed --- ifs-source/arpifs/module/par_gfl.F90 | 2 +- ifs-source/arpifs/phys_ec/aer_negat.F90 | 7 +- ifs-source/arpifs/phys_ec/hamm7_interface.F90 | 95 +++++++++---------- .../phys_ec/m7_simple_sulfur_drydep.F90 | 3 +- ifs-source/arpifs/phys_ec/mo_ham_subm.F90 | 8 +- ifs-source/arpifs/phys_radi/suecrad.F90 | 2 +- 6 files changed, 57 insertions(+), 60 deletions(-) diff --git a/ifs-source/arpifs/module/par_gfl.F90 b/ifs-source/arpifs/module/par_gfl.F90 index 8e958d47..08614adf 100644 --- a/ifs-source/arpifs/module/par_gfl.F90 +++ b/ifs-source/arpifs/module/par_gfl.F90 @@ -47,7 +47,7 @@ MODULE PAR_GFL INTEGER(KIND=JPIM), PARAMETER :: JPEZDIAG=50 INTEGER(KIND=JPIM), PARAMETER :: JPCH4S=1 INTEGER(KIND=JPIM), PARAMETER :: JPNOGW=2 -INTEGER(KIND=JPIM), PARAMETER :: JPAEROUT=50 +INTEGER(KIND=JPIM), PARAMETER :: JPAEROUT=45 INTEGER(KIND=JPIM), PARAMETER :: JPAEROCLIM=3 INTEGER(KIND=JPIM), PARAMETER :: JPUVP=2 INTEGER(KIND=JPIM), PARAMETER :: JPPHYS=9 diff --git a/ifs-source/arpifs/phys_ec/aer_negat.F90 b/ifs-source/arpifs/phys_ec/aer_negat.F90 index 09fbd263..e611fe3b 100644 --- a/ifs-source/arpifs/phys_ec/aer_negat.F90 +++ b/ifs-source/arpifs/phys_ec/aer_negat.F90 @@ -66,7 +66,8 @@ SUBROUTINE AER_NEGAT & REAL(KIND=JPRB) ,INTENT(INOUT) :: PTAERO(KLON,KLEV) REAL(KIND=JPRB) ,INTENT(IN) :: PAPHP1(KLON,KLEV+1) -REAL(KIND=JPRB) ,INTENT(OUT) :: PFAERNG(KLON,KLEV+1) +!REAL(KIND=JPRB) ,INTENT(OUT) :: PFAERNG(KLON,KLEV+1) +REAL(KIND=JPRB) ,INTENT(OUT) :: PFAERNG(KLON,KLEV) !* flux outputs @@ -79,7 +80,6 @@ SUBROUTINE AER_NEGAT & REAL(KIND=JPRB) :: ZCONS1, ZDAER, ZGDPH, ZTMST REAL(KIND=JPHOOK) :: ZHOOK_HANDLE - !------------------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('AER_NEGAT',0,ZHOOK_HANDLE) ASSOCIATE(REPSCAER=>YREAERATM%REPSCAER) @@ -139,7 +139,8 @@ SUBROUTINE AER_NEGAT & DO JL=KIDIA,KFDIA PFAERNG(JL,1)=0.0_JPRB ENDDO -DO JK=1,KLEV +!DO JK=1,KLEV +DO JK=1,KLEV-1 DO JL=KIDIA,KFDIA ZGDPH = -RG /(PAPHP1(JL,JK+1)-PAPHP1(JL,JK)) PFAERNG(JL,JK+1)=(PTAERO(JL,JK)-ZAEROLD(JL,JK))/ZGDPH + PFAERNG(JL,JK) diff --git a/ifs-source/arpifs/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/phys_ec/hamm7_interface.F90 index 26f625ff..1ca806f3 100755 --- a/ifs-source/arpifs/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/phys_ec/hamm7_interface.F90 @@ -148,9 +148,7 @@ SUBROUTINE HAMM7_INTERFACE( & USE YOMCST, ONLY: RD, RG, RPI USE YOMCT0, ONLY: LIFSMIN, LIFSTRAJ USE YOMCT3, ONLY: NSTEP -USE TM5M7_DATA, ONLY: mode_tracers, mode_tracers_by_mods, mode_start, & - & mode_end_so4, naermod, nmod,nsol, iisvoc,ielvoc, & - & iacs_n,iso4, MODAL_DATA, MODE_TRACERS, MODE_START, & +USE TM5M7_DATA, ONLY: MODAL_DATA, MODE_TRACERS, MODE_START, & & MODE_TRACERS_BY_MODS, MODE_END_SO4, NAERMOD, NMOD, NSOL,& & IISVOC, IELVOC, IACS_N, ISO4, ISO4ACS,ISO4COS USE YOMCHEM, ONLY: IEXTR_WD, IEXTR_CH, IEXTR_NG, IEXTR_DD, IEXTR_CHTR @@ -282,7 +280,8 @@ SUBROUTINE HAMM7_INTERFACE( & REAL(KIND=JPRB) :: ZTAER(KLON,KLEV) REAL(KIND=JPRB) :: ZTAERO(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO) REAL(KIND=JPRB) :: ZRH(KLON,KLEV),ZTENC0(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NCHEM)!,ZTSO4(KLON,KLEV) -REAL(KIND=JPRB) :: ZM6RP(KLON,KLEV,NMOD) +!REAL(KIND=JPRB) :: ZM6RP(KLON,KLEV,NMOD) +REAL(KIND=JPRB) :: ZM6RP(KLON,KLEV,NMOD)! NMOD=7 REAL(KIND=JPRB) :: ZM6DRY(KLON,KLEV,NSOL) REAL(KIND=JPRB) :: ZWW(KLON,KLEV,NMOD) REAL(KIND=JPRB) :: ZRHOP(KLON,KLEV,NMOD) @@ -358,6 +357,7 @@ SUBROUTINE HAMM7_INTERFACE( & ! variables for the M7 call REAL(KIND=JPRB) :: ZGRVOL(KLON,KLEV) !grid box volume for diagnostics REAL(KIND=JPRB) :: ZPBL(KLON) !planetary boundary layer top level (in vdfmain.F90 ITOP=1) +REAL(KIND=JPRB) :: ZXTM0(KLON,KLEV,ntrac) !tracer mixing ratios for HAM REAL(KIND=JPRB) :: ZXTM1(KLON,KLEV,ntrac) !tracer mixing ratios for HAM REAL(KIND=JPRB) :: ZXTTE(KLON,KLEV,ntrac) !tracer tendency for HAM REAL(KIND=JPRB) :: ZXTTEM1(KLON,KLEV,ntrac) !tracer tendency for HAM @@ -419,7 +419,7 @@ SUBROUTINE HAMM7_INTERFACE( & !REAL(KIND=JPRB) :: ZZOUT1(KLON,KLEV),ZZOUT2(KLON,klev),ZZOUT3(KLON,KLEV),ZZOUT4(KLON,KLEV),ZZOUT5(KLON,klev),ZZOUT6(KLON,KLEV) !REAL(KIND=JPRB) :: ZZOUT7(KLON,KLEV),ZZOUT8(KLON,klev),ZZOUT9(KLON,KLEV),ZZOUT10(KLON,KLEV),ZZOUT11(KLON,klev),ZZOUT12(KLON,KLEV) -REAL(KIND=JPRB) :: sedout(KLON,KLEV,ktrac) +REAL(KIND=JPRB) :: sedout(KLON,KLEV,ntrac) REAL(KIND=JPRB) :: ddepout(KLON,KLEV,KTRAC) REAL(KIND=JPRB) :: Wdepout(KLON,KLEV,ktrac) REAL(KIND=JPRB) :: sedout_2D(KLON,ktrac) @@ -584,7 +584,7 @@ SUBROUTINE HAMM7_INTERFACE( & ! -------------------------------------------------------- ALLOCATE( ZAERNGT(KLON,NACTAERO) ) -ZAERNGT(KIDIA:KFDIA,1:NACTAERO) = 0._JPRB +ZAERNGT(:,:) = 0._JPRB !ALLOCATE( ZAERSCC(KLON,NACTAERO) ) !ALLOCATE( ZAERSRC(KLON,NACTAERO) ) @@ -598,6 +598,10 @@ SUBROUTINE HAMM7_INTERFACE( & ZOUT(:,:) = 0._JPRB ZOUT2(:,:) = 0._JPRB ZOUT3(:,:,:) = 0._JPRB +!!! initialize those arrays are importnat for PGFL under GNU, Lianghai Wu + ZVDEP(:,:) = 0._JPRB ! ddep velocity as zero + ZXTEMS(:,:) = 0._JPRB ! surface emissions as zero for input + ZXTMD1(:,:,:) = 0._JPRB !ZOUT4(:,:) = 0._JPRB !ZOUT5(:,:) = 0._JPRB !ZOUT6(:,:) = 0._JPRB @@ -637,6 +641,8 @@ SUBROUTINE HAMM7_INTERFACE( & ZTAERO(:,:,:) = 0._JPRB +ZCEN(:,:,:) = 0._JPRB + !ZAERSRC(KIDIA:KFDIA,1:NACTAERO)=PAERSRC(KIDIA:KFDIA,1:NACTAERO) ! computation of tropopause level @@ -644,7 +650,6 @@ SUBROUTINE HAMM7_INTERFACE( & ! Initializing tracer number and mixing ratios and gas concentrations to not be tendency updated values - ZCEN(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB ITRC=0 DO JEXT=1,NGHG ITRC=ITRC+1 @@ -654,6 +659,7 @@ SUBROUTINE HAMM7_INTERFACE( & ENDDO ENDDO ENDDO + DO JEXT=1,ZTRAC ITRC=ITRC+1 DO JK=1,KLEV @@ -662,6 +668,8 @@ SUBROUTINE HAMM7_INTERFACE( & ENDDO ENDDO ENDDO + + DO JEXT=1,NAERO ITRC=ITRC+1 DO JK=1,KLEV @@ -670,6 +678,7 @@ SUBROUTINE HAMM7_INTERFACE( & ENDDO ENDDO ENDDO + if(LAERCHEM) then DO JEXT=1,NCHEM ITRC=ITRC+1 @@ -681,11 +690,12 @@ SUBROUTINE HAMM7_INTERFACE( & ENDDO end if + DO JAER=1,NACTAERO DO JK=1,KLEV DO JL=KIDIA,KFDIA ! check on max-values here to prevent excessive values in OPTICS_AOP_GET.. probably to be removed again!! - ZAEROK(JL,JK,JAER) =MIN(ZCEN (JL,JK,KAERO(JAER)), 1e10) + ZAEROK(JL,JK,JAER) =MIN(ZCEN(JL,JK,KAERO(JAER)), 1e10) ZTAEROK(JL,JK,JAER)=PTENC(JL,JK,KAERO(JAER)) ENDDO ENDDO @@ -848,24 +858,18 @@ SUBROUTINE HAMM7_INTERFACE( & end if !calculate ICNC -ZICNC(KIDIA:KFDIA,1:KLEV) = 0._JPRB -ZICNC(KIDIA:KFDIA,1:KLEV) = RNICE +ZICNC(:,:) = 0._JPRB +ZICNC(:,:) = RNICE !Put tracer mixing ratios and tendencies to from OIFS to HAM !initialize to zero -ZXTM1(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB -ZXTTE(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB -ZXTTEM1(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB +ZXTM1(:,:,:) = 0._JPRB +ZXTTE(:,:,:) = 0._JPRB +ZXTTEM1(:,:,:) = 0._JPRB -!write(*,*) "PTENC",PTENC(1,1,:) -!write(*,*) "KAERO",KAERO -!write(*,*) "ind_oifs_ham%ind_class_OIFS",ind_oifs_ham%ind_class_OIFS !number DO JCLASS=1,nclass DO JK=1,KLEV DO JL=KIDIA,KFDIA - !write(*,*) "JCLASS",JCLASS - !write(*,*) "ntrac",ntrac - !write(*,*) "ind_oifs_ham%ind_class_HAM(JCLASS)",ind_oifs_ham%ind_class_HAM(JCLASS) ZXTM1(JL,JK,ind_oifs_ham%ind_class_HAM(JCLASS)) = ZCEN(JL,JK,KAERO(ind_oifs_ham%ind_class_OIFS(JCLASS))) ZXTTE(JL,JK,ind_oifs_ham%ind_class_HAM(JCLASS)) = PTENC(JL,JK,KAERO(ind_oifs_ham%ind_class_OIFS(JCLASS))) END DO @@ -1055,7 +1059,7 @@ SUBROUTINE HAMM7_INTERFACE( & ZXTM1, PTP, ZA, ZB) END IF - DO JCLASS = 1,nclass + DO JCLASS = 1,nclass! nclass=7 IF (sizeclass(jclass)%lsoluble) THEN !ZRDRY(KIDIA:KFDIA,1:KLEV,JCLASS) = rdry_m7(KIDIA:KFDIA,1:KLEV,JCLASS) !eehol: for soluble modes rdry from rdry_m7 @@ -1087,8 +1091,6 @@ SUBROUTINE HAMM7_INTERFACE( & !<-- Store CDNC (number of activated particles) and ICNC as a number mixing ratio to tracer values and to PGFL fields ZXTM1(KIDIA:KFDIA,1:KLEV,idt_cdnc) = ZCDNCACT(KIDIA:KFDIA,1:KLEV)/ZRHO(KIDIA:KFDIA,1:KLEV) ! [#/kg] ZXTM1(KIDIA:KFDIA,1:KLEV,idt_icnc) = (1.0E6_JPRB)*ZICNC(KIDIA:KFDIA,1:KLEV)/ZRHO(KIDIA:KFDIA,1:KLEV) !ice crystal number conc = #/cm3 --> number mix rat [#/kg] - !write(*,*) "YCDNC%MP9_PH",YCDNC%MP9_PH - !write(*,*) "YICNC%MP9_PH",YICNC%MP9_PH PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH) = (1.0E-6_JPRB)*ZCDNCACT(KIDIA:KFDIA,1:KLEV) ! add CDNC to PGFL field (convert from #/m3 to #/cm3) PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH) = ZICNC(KIDIA:KFDIA,1:KLEV) ! add ICNC to PGFL field (does not need convert) !--> End store CDNC and ICNC @@ -1182,14 +1184,14 @@ SUBROUTINE HAMM7_INTERFACE( & END DO ZMSNOWACL(KIDIA:KFDIA,1:KLEV) = ZMRATEPS(KIDIA:KFDIA,1:KLEV) !? - ZDUMMY(KIDIA:KFDIA,:) = 0._JPRB ! initialize dummy variables for conv. case only - ZDUM2D(KIDIA:KFDIA,1:KLEV) = 0._JPRB ! initialize dummy variables for conv. case only - ZDUM3D(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB ! initialize dummy variables for conv. case only - ZLFRAC_SO2(KIDIA:KFDIA,1:KLEV) = 0._JPRB ! zlfrac_so2 only needed in gas scavenging and this is off for now (put this zero) + ZDUMMY(:,:) = 0._JPRB ! initialize dummy variables for conv. case only + ZDUM2D(:,:) = 0._JPRB ! initialize dummy variables for conv. case only + ZDUM3D(:,:,:) = 0._JPRB ! initialize dummy variables for conv. case only + ZLFRAC_SO2(:,:) = 0._JPRB ! zlfrac_so2 only needed in gas scavenging and this is off for now (put this zero) ZLP(KIDIA:KFDIA,1:KLEV) = PLP(KIDIA:KFDIA,1:KLEV) ! temporary variable for cloud water content (modified in wetdep) ZIP(KIDIA:KFDIA,1:KLEV) = PIP(KIDIA:KFDIA,1:KLEV) ! temporary variable for cloud ice water content (modified in wetdep) - ZTENCIH(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB + ZTENCIH(:,:,:) = 0._JPRB ZTENCIH(KIDIA:KFDIA,1:KLEV,1:ntrac)=ZXTTE(KIDIA:KFDIA,1:KLEV,1:ntrac) IF (.NOT.LAERCHEM)THEN call ham_conv_lfraq_so2(KFDIA,KLON,KLEV,PTP,zxtm1,zrho,ZLP,zlfrac_so2) @@ -1256,7 +1258,7 @@ SUBROUTINE HAMM7_INTERFACE( & IF ( lsedimentation .AND. ANY(trlist%ti(:)%nsedi > 0) ) THEN - ZTENCIH(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB + ZTENCIH(:,:,:) = 0._JPRB ZTENCIH(KIDIA:KFDIA,1:KLEV,1:ntrac)=ZXTTE(KIDIA:KFDIA,1:KLEV,1:ntrac) CALL sedi_interface(KLON, KFDIA, KLEV, ZKROW, & @@ -1346,12 +1348,12 @@ SUBROUTINE HAMM7_INTERFACE( & END DO !--> init values - ZTENCIH(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB + ZTENCIH(:,:,:) = 0._JPRB ZTENCIH(KIDIA:KFDIA,1:KLEV,:) = ZXTTE(KIDIA:KFDIA,1:KLEV,:) ! init tendency before drydep - ZXTEMS(KIDIA:KFDIA,:) = 0._JPRB ! surface emissions as zero for input - ZXTMD1(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB + ZXTEMS(:,:) = 0._JPRB ! surface emissions as zero for input + ZXTMD1(:,:,:) = 0._JPRB ZXTMD1(KIDIA:KFDIA,1:KLEV,:) = ZXTM1(KIDIA:KFDIA,1:KLEV,:) + (ZTENCIH(KIDIA:KFDIA,1:KLEV,:) * time_step_len) ! update mixrat with tendency - ZVDEP(KIDIA:KFDIA,:) = 0._JPRB ! ddep velocity as zero + ZVDEP(:,:) = 0._JPRB ! ddep velocity as zero CALL drydep_interface(KLON, KFDIA, KLEV, ZKROW, & ZQP(:,KLEV), ZQSAT(:,KLEV), PTP(:,KLEV), ZCFML, ZCFMW, ZCFMI, & @@ -1365,7 +1367,6 @@ SUBROUTINE HAMM7_INTERFACE( & ZSRFL, PUP(:,KLEV), PVP(:,KLEV), & !eehol: 10m u and v wind from lowest level.. needs to be revised in future!! ZXTEMS, ZXTMD1, ZRHO(:,KLEV), PRS1, ZFOREST, ZTSI, & !eehol: air dens lowest, air press at int. ZAZ0L, ZAZ0W, ZAZ0I, ZCDNL, ZCDNW, ZCDNI, ZDDEPFLUX, ZVDEP) !eehol: ZCDNL and ZCDNW used for ustar and aerodyn. resist. - IF (.not. LAERCHEM)THEN CALL m7_simple_sulfur_drydep(YDMODEL, KIDIA,KFDIA, KLON, KLEV, & @@ -1562,11 +1563,10 @@ SUBROUTINE HAMM7_INTERFACE( & IF(MOD(NSTEP+1,NRADFR) == 0) THEN CALL GSTATS(2506,0) -ZAER_TAU(KIDIA:KFDIA,:,:,:)=0.0_JPRB -ZAER_SSA(KIDIA:KFDIA,:,:)=0.0_JPRB -ZAER_ASYM(KIDIA:KFDIA,:,:)=0.0_JPRB -ZAER_TAU_LW(KIDIA:KFDIA,:,:)=0.0_JPRB - +ZAER_TAU(:,:,:,:)=0.0_JPRB +ZAER_SSA(:,:,:)=0.0_JPRB +ZAER_ASYM(:,:,:)=0.0_JPRB +ZAER_TAU_LW(:,:,:)=0.0_JPRB SELECT CASE (NAEROOPT) @@ -1644,12 +1644,9 @@ SUBROUTINE HAMM7_INTERFACE( & LWBANDS=16 PRS1D(KIDIA:KFDIA,:) = PRS1(KIDIA:KFDIA,1:KLEV)-PRS1(KIDIA:KFDIA,0:KLEV-1) !CALL ham_rad_cache(KLON,KLEV) - CALL ham_rad(KFDIA,KLON, KLEV, ZKROW, LWBANDS, NASWBAND, & - ZXTM1+ZXTTE*time_step_len, PRS1D, & -!<<<<<<< HEAD - ZAER_TAU(:,:,:,1), ZAER_SSA, ZAER_ASYM, ZAER_TAU_LW,ZM6RP) + ZXTM0 = ZXTM1+ZXTTE*time_step_len + CALL ham_rad(KFDIA,KLON, KLEV, ZKROW, LWBANDS, NASWBAND, ZXTM0, PRS1D,ZAER_TAU(:,:,:,1), ZAER_SSA, ZAER_ASYM, ZAER_TAU_LW,ZM6RP) !CALL ham_rad_cache_cleanup - !PAOD(KIDIA:KFDIA,:)=0._JPRB do JK = 1, KLEV do JL = KIDIA,KFDIA do IW=1,NASWBAND @@ -1663,7 +1660,6 @@ SUBROUTINE HAMM7_INTERFACE( & end do enddo enddo - !write(*,*)"max PAER_TAU", maxval(PAER_TAU) !======= ! ZAER_TAU(:,:,:,1), ZAER_SSA, ZAER_ASYM, ZAER_TAU_LW,rwet_m7) ! CALL HAM_RAD_CACHE_CLEANUP @@ -1689,11 +1685,11 @@ SUBROUTINE HAMM7_INTERFACE( & CALL GSTATS(2506,1) ENDIF ! (MOD(NSTEP+1,NRADFR) == 0) -PAOD(KIDIA:KFDIA,:) =0._JPRB -PABS(KIDIA:KFDIA,:) =0._JPRB -PFAOD(KIDIA:KFDIA,:)=0._JPRB -PSSA(KIDIA:KFDIA,:) =0._JPRB -PASY(KIDIA:KFDIA,:) =0._JPRB +PAOD(:,:) =0._JPRB +PABS(:,:) =0._JPRB +PFAOD(:,:)=0._JPRB +PSSA(:,:) =0._JPRB +PASY(:,:) =0._JPRB do JK = 1, KLEV do JL = KIDIA,KFDIA do IW=1,NASWBAND @@ -1906,7 +1902,6 @@ SUBROUTINE HAMM7_INTERFACE( & ENDIF - !------------------------------------------------------------------------------ !* 9. RELEASE LOCAL MEMORY ! -------------------- diff --git a/ifs-source/arpifs/phys_ec/m7_simple_sulfur_drydep.F90 b/ifs-source/arpifs/phys_ec/m7_simple_sulfur_drydep.F90 index c05221b2..89c063e3 100644 --- a/ifs-source/arpifs/phys_ec/m7_simple_sulfur_drydep.F90 +++ b/ifs-source/arpifs/phys_ec/m7_simple_sulfur_drydep.F90 @@ -88,7 +88,8 @@ SUBROUTINE m7_simple_sulfur_DRYDEP & !INTEGER(KIND=JPIM),INTENT(IN) :: KSTEP !REAL(KIND=JPRB) ,INTENT(IN) :: PLSM(KLON), PCI(KLON) -REAL(KIND=JPRB) ,INTENT(IN) :: PAERO(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO), PTAERI(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO) +!REAL(KIND=JPRB) ,INTENT(IN) :: PAERO(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO), PTAERI(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO) +REAL(KIND=JPRB) ,INTENT(IN) :: PAERO(KLON,KLEV,ntrac), PTAERI(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO) !REAL(KIND=JPRB) ,INTENT(IN) :: PAPH(KLON,0:KLEV) !REAL(KIND=JPRB) ,INTENT(IN) :: PAP(KLON,KLEV) REAL(KIND=JPRB) ,INTENT(IN) :: PDP(KLON,KLEV), PGEOH(KLON,0:KLEV), PRHO(KLON,KLEV) diff --git a/ifs-source/arpifs/phys_ec/mo_ham_subm.F90 b/ifs-source/arpifs/phys_ec/mo_ham_subm.F90 index 3ad98a40..bae6bb36 100755 --- a/ifs-source/arpifs/phys_ec/mo_ham_subm.F90 +++ b/ifs-source/arpifs/phys_ec/mo_ham_subm.F90 @@ -614,13 +614,13 @@ SUBROUTINE ham_subm_interface(kproma, kbdim, klev, krow, ktrac, & !--- 6) Convert microphysical model output quantities to SI units and store in streams: -------------- !--- Ambient Count Median Radius from [cm] to [m]: - pm6rp(1:kproma,:,:) = zm6rp/100._dp + pm6rp(1:kproma,:,:) = zm6rp(1:kproma,:,:)/100._dp !--- Dry Count Median Radius from [cm] to [m]: - pm6dry(1:kproma,:,:) = zm6dry/100._dp + pm6dry(1:kproma,:,:) = zm6dry(1:kproma,:,:)/100._dp !--- Mean mode density from [g/cm3] to [kg/m3]: - prhop(1:kproma,:,:) = zrhop*1000._dp !eehol: g/cm3 to kg/m3 + prhop(1:kproma,:,:) = zrhop(1:kproma,:,:)*1000._dp !eehol: g/cm3 to kg/m3 !--- Store diagnostic aerosol properties - pww(1:kproma,:,:) = zww + pww(1:kproma,:,:) = zww(1:kproma,:,:) #ifdef HAMMOZ DO jclass = 1, nclass diff --git a/ifs-source/arpifs/phys_radi/suecrad.F90 b/ifs-source/arpifs/phys_radi/suecrad.F90 index 36490eaa..f27ad0ef 100644 --- a/ifs-source/arpifs/phys_radi/suecrad.F90 +++ b/ifs-source/arpifs/phys_radi/suecrad.F90 @@ -2128,7 +2128,7 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) ALLOCATE(YDAERM7%M7AOD(NPROMA, NFLEVG,NTSW,NGPBLKS)) ALLOCATE(YDAERM7%M7SSA(NPROMA, NFLEVG,NTSW,NGPBLKS)) ALLOCATE(YDAERM7%M7ASYM(NPROMA,NFLEVG,NTSW,NGPBLKS)) - ALLOCATE(YDAERM7%M7AODLW(NPROMA, NFLEVG,NTSW,NGPBLKS)) + ALLOCATE(YDAERM7%M7AODLW(NPROMA, NFLEVG,NTSW+2,NGPBLKS)) YDAERM7%M7AOD(:,:,:,:) =0.0_JPRB YDAERM7%M7SSA(:,:,:,:) =0.0_JPRB YDAERM7%M7ASYM(:,:,:,:) =0.0_JPRB From d464f0464a55f538f2e3f2124790590afd0e6600 Mon Sep 17 00:00:00 2001 From: Ramiro Checa Garcia Date: Fri, 28 Jun 2024 13:50:27 +0200 Subject: [PATCH 021/129] Pull request #5: Resolve segmentation fault for M7 with LAERRRTM=F Merge in bugfix/knmi-m7-OIFS-530 to knmi-m7 This commit also - Adds the OIFS_DEBUGGER environment variable that can be used by oifs-run script to launch the debugger - Cleans up, tidied up and adds comments to several radiation/aerosols routines - Adds .gitignore - Adds compilation warning of non-used variables for GNU compiler --- .gitignore | 3 +- ifs-source/arpifs/module/parfpos.F90 | 1 + ifs-source/arpifs/module/yoerad.F90 | 14 +- ifs-source/arpifs/module/yom_ygfl.F90 | 94 +- ifs-source/arpifs/module/yomafn.F90 | 20 +- ifs-source/arpifs/module/yomcompo.F90 | 94 +- ifs-source/arpifs/module/yomphyder.F90 | 10 +- ifs-source/arpifs/namelist/naerad.nam.h | 2 +- ifs-source/arpifs/phys_ec/OIFS_to_HAM.F90 | 69 +- ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 | 210 +- ifs-source/arpifs/phys_ec/aerini_layer.F90 | 185 +- ifs-source/arpifs/phys_ec/callpar.F90 | 3 +- ifs-source/arpifs/phys_ec/hamm7_init.F90 | 168 +- ifs-source/arpifs/phys_ec/hamm7_interface.F90 | 1750 ++++++++--------- .../arpifs/phys_radi/radiation_scheme.F90 | 191 +- ifs-source/arpifs/phys_radi/radintg.F90 | 91 +- ifs-source/arpifs/phys_radi/suecrad.F90 | 18 +- ifs-source/cmake/compile_flags.cmake | 2 +- .../radiation/module/radiation_aerosol.F90 | 2 +- oifs-config.edit_me.sh | 5 +- oifs-config.nld5163.sh | 2 + 21 files changed, 1486 insertions(+), 1448 deletions(-) diff --git a/.gitignore b/.gitignore index 87941747..eebdcc21 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ /build/ /install/ /*.log +/slurm-????????.out # ecbundle (cloned at build time by openifs-bundle) /ecbundle/ @@ -21,4 +22,4 @@ __pycache__/ .DS_Store # User-specific Docker config -scripts/docker/config/my_config.yml \ No newline at end of file +scripts/docker/config/my_config.yml diff --git a/ifs-source/arpifs/module/parfpos.F90 b/ifs-source/arpifs/module/parfpos.F90 index 43ce810e..f0217889 100644 --- a/ifs-source/arpifs/module/parfpos.F90 +++ b/ifs-source/arpifs/module/parfpos.F90 @@ -46,6 +46,7 @@ MODULE PARFPOS ! JPOS3DF : Maximum number of 3D dynamic fields ! JPOS2DF : Maximum number of 2D dynamic fields ! JPOSDYN : Maximum number of dynamic fields +! JPOSTRAC: [FIXME: missing definition] ! JPOSGHGFLX : Maximum number of post-processable greenhouse gases ! JPOSGHG : Maximum number of post-processable greenhouse gases ! JPOSAERO: Maximum number of post-processable aerosols diff --git a/ifs-source/arpifs/module/yoerad.F90 b/ifs-source/arpifs/module/yoerad.F90 index e695092d..d40786ad 100644 --- a/ifs-source/arpifs/module/yoerad.F90 +++ b/ifs-source/arpifs/module/yoerad.F90 @@ -143,7 +143,7 @@ MODULE YOERAD TYPE(TSPECTRALPLANCK) :: YSPECTPLANCK INTEGER :: NCLOUDACT -INTEGER :: NAEROOPT +INTEGER :: NAEROOPT !---------------------------------------------------------------------------- CONTAINS @@ -420,7 +420,15 @@ MODULE YOERAD ! LDUSEASON : LOGICAL enables a monthly-varying scale height for the ! dust aerosol climatology ! LAER3D : LOGICAL : to enable aerosol climatology in 3D - +! +! ----[ AERO_SCHEME HAMM7 ]--------------------------------------------------- +! NAEROOPT : INTEGER : M7 aerosols optical properties calculation method +! 0: not calculated +! 1: TM5 code for SW, not calculated for LW +! 2: HAM code for both SW and LW +! NCLOUDACT : INTEGER : Computation of effective radii (liq & ice) +! 0: IFS default parametrization +! > 0: use Abdul-Razzak & Ghan activation scheme from HAMM7 CONTAINS @@ -484,6 +492,8 @@ SUBROUTINE PRINT_CONFIGURATION(SELF, KDEPTH, KOUTNO) WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'NREDGLW = ', SELF%NREDGLW WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'NREDGSW = ', SELF%NREDGSW WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'NAERMACC = ', SELF%NAERMACC +WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'NAEROOPT (M7) = ', SELF%NAEROOPT +WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'NCLOUDACT (M7) = ', SELF%NCLOUDACT WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'NMCLAT = ', SELF%NMCLAT WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'NMCLON = ', SELF%NMCLON WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'NMCLEV = ', SELF%NMCLEV diff --git a/ifs-source/arpifs/module/yom_ygfl.F90 b/ifs-source/arpifs/module/yom_ygfl.F90 index 27462358..ab501405 100644 --- a/ifs-source/arpifs/module/yom_ygfl.F90 +++ b/ifs-source/arpifs/module/yom_ygfl.F90 @@ -11,18 +11,34 @@ MODULE YOM_YGFL -USE PARKIND1 , ONLY : JPIM, JPRB +USE PARKIND1 , ONLY : JPIM, JPRB USE YOE_AERODIAG, ONLY : NPAERAOT, NPAERLISI_VAR, NPAERLISI_WVL, NPAERLISI, & - & TYPE_AERO_WVL_DIAG, NPAERO_WVL_DIAG + & TYPE_AERO_WVL_DIAG, NPAERO_WVL_DIAG USE PAR_GFL IMPLICIT NONE SAVE -!------------------------------------------------------------------------- -! Contains the descriptors of GFL arrays -!------------------------------------------------------------------------- +! ╒════════════════════════════════════════════════════════════════════════════╕ +! │ MODULE YOM_YGLF (updated 15-MAY-2024) │ +! │ │ +! │ *Contains the descriptors of GFL arrays* (derived types) │ +! │ │ +! │ TYPES: │ +! │ - TYPE_GFL_COMP -> individual field descriptor │ +! │ - TYPE_GFL_NAML -> individual field descriptor for namelist input │ +! │ - TYPE_GFLD -> derived types for describing the GFL structure. │ +! │ │ +! │ │ +! │ Author : ECMWF(?) │ +! │ ------- │ +! │ │ +! │ Modifications : (included before each type) │ +! │ ------------- │ +! │ 15-May-2024 - R.Checa-Garcia - Added info/comments │ +! │ │ +! ╘════════════════════════════════════════════════════════════════════════════╛ TYPE TYPE_GFL_COMP ! Individual field descriptor @@ -181,28 +197,38 @@ MODULE YOM_YGFL END TYPE TYPE_GFL_NAML -!------------------------------------------------------------------------- -! Derived types for describing the GFL structure. -!------------------------------------------------------------------------- -! Modifications: -! 03/07/09 C. Fischer - add Arome/Aladin attributes -! 03/10/01 C. Moussy - add Arome/Aladin attributes coupling -! 03/10/31 M. Tudor - add physics tendencies for predictor-corrector -! 05/10/10 J. Haseler - switch for I/O to trajectory structure -! 2004-Nov F. Vana - update of CSLINT attribute -! 20-Feb-2005 Vivoda - 3TL Eul PC scheme (GFLPC) -! 07/06/27 E. Holm - TL/AD advection without wind increments LADV5 -! 12/04/08 J. Flemming - GFL attribute extention for GEMS -! 22-Feb-11 F. Vana - LTDIABLIN and LHORTURB -! spring 2011 ECMWF - LINTLIN -! Nov. 2013 - LCOMAD -! 2013-11, D. Degrauwe - INTFLEX attributes -! 06-Feb-2015 F. Vana & M. Kharoutdinov - super-parametrization fields. -! 02-Feb-2017 S.-J. Lock - LSPPTGFL, switch for SPPT perturbations to chemistry/aerosol tendencies -! 2017-11-11 M Ahlgrimm - add cloud heterogeneity FSD -! 14-Feb-2019 P Bechtold- add turbulence diagnostics EDR Parameter -! 20-Feb-2019 F. Vana - WENO quintic interpolation -! 11-Sep-2020 F. Vana - SLAVEPP in TL/AD +! ╭────────────────────────────────────────────────────────────────────────────╮ +! │ (updated 15-May-2024) │ +! │ │ +! │ TYPE : TYPE_GFLD │ +! │ │ +! │ Derived types for describing the GFL structure. │ +! │ │ +! │ Modifications : │ +! │ --------------- │ +! │ 03/07/09 C. Fischer - add Arome/Aladin attributes │ +! │ 03/10/01 C. Moussy - add Arome/Aladin attributes coupling │ +! │ 03/10/31 M. Tudor - add physics tendencies for predictor-corrector│ +! │ 05/10/10 J. Haseler - switch for I/O to trajectory structure │ +! │ 2004-Nov F. Vana - update of CSLINT attribute │ +! │ 20-Feb-2005 Vivoda - 3TL Eul PC scheme (GFLPC) │ +! │ 07/06/27 E. Holm - TL/AD advection without wind increments LADV5 │ +! │ 12/04/08 J. Flemming - GFL attribute extention for GEMS │ +! │ 22-Feb-11 F. Vana - LTDIABLIN and LHORTURB │ +! │ spring 2011 ECMWF - LINTLIN │ +! │ Nov. 2013 - LCOMAD │ +! │ 2013-11, D. Degrauwe - INTFLEX attributes │ +! │ 06-Feb-2015 F. Vana - super-parametrization fields. │ +! │ & M. Kharoutdinov │ +! │ 02-Feb-2017 S.-J. Lock - LSPPTGFL, switch for SPPT perturbations to │ +! │ chemistry/aerosol tendencies │ +! │ 2017-11-11 M Ahlgrimm - add cloud heterogeneity FSD │ +! │ 14-Feb-2019 P Bechtold - add turbulence diagnostics EDR Parameter │ +! │ 20-Feb-2019 F. Vana - WENO quintic interpolation │ +! │ 11-Sep-2020 F. Vana - SLAVEPP in TL/AD │ +! │ 01-Apr-2024 Wu Lianghai - NTRAC and NCHEM_FLX (for hamm7 ?) │ +! │ │ +! ╰────────────────────────────────────────────────────────────────────────────╯ TYPE TYPE_GFLD @@ -236,7 +262,7 @@ MODULE YOM_YGFL INTEGER(KIND=JPIM) :: NGFL_FORC INTEGER(KIND=JPIM) :: NGFL_EZDIAG INTEGER(KIND=JPIM) :: NGHG -INTEGER(KIND=JPIM) :: NTRAC !!! added due to M7 +INTEGER(KIND=JPIM) :: NTRAC ! Added for M7 INTEGER(KIND=JPIM) :: NGHG_ASSIM INTEGER(KIND=JPIM) :: NAERO INTEGER(KIND=JPIM) :: NACTAERO @@ -263,20 +289,20 @@ MODULE YOM_YGFL LOGICAL :: LUVPOUT = .FALSE. LOGICAL :: LSPPTGFL = .FALSE. ! Activates SPPT perturbations to CHEM tendencies (C-IFS ensemble) -INTEGER(KIND=JPIM) :: NGEMS ! The total number of "GEMS" fields. +INTEGER(KIND=JPIM) :: NGEMS ! The total number of "GEMS" fields. INTEGER(KIND=JPIM) :: NCHEM INTEGER(KIND=JPIM) :: NCHEM_ASSIM INTEGER(KIND=JPIM) :: NCHEM_FLXO INTEGER(KIND=JPIM) :: NCHEM_WDFLX INTEGER(KIND=JPIM) :: NCHEM_DDFLX -INTEGER(KIND=JPIM) :: NCHEM_FLX! ???? from 43r3 +INTEGER(KIND=JPIM) :: NCHEM_FLX ! [FIXME we need to define here what this is (not used? from 43r3??] INTEGER(KIND=JPIM) :: NCHEM_DV INTEGER(KIND=JPIM) :: NCHEM_TC INTEGER(KIND=JPIM) :: NCHEM_SCV -INTEGER(KIND=JPIM) :: NEMIS2D ! Number of 2D emission fields for composition -INTEGER(KIND=JPIM) :: NEMIS2DAUX ! Number of 2D emission auxiliary fields for composition -INTEGER(KIND=JPIM) :: NEMIS3D ! Number of 3D emission fields for composition -INTEGER(KIND=JPIM) :: NLIMA ! Total number of LIMA fields +INTEGER(KIND=JPIM) :: NEMIS2D ! Number of 2D emission fields for composition +INTEGER(KIND=JPIM) :: NEMIS2DAUX ! Number of 2D emission auxiliary fields for composition +INTEGER(KIND=JPIM) :: NEMIS3D ! Number of 3D emission fields for composition +INTEGER(KIND=JPIM) :: NLIMA ! Total number of LIMA fields INTEGER(KIND=JPIM) :: NAERO_WVL_DIAG INTEGER(KIND=JPIM) :: NAERO_WVL_DIAG_TYPES diff --git a/ifs-source/arpifs/module/yomafn.F90 b/ifs-source/arpifs/module/yomafn.F90 index fcafde17..064a5a68 100644 --- a/ifs-source/arpifs/module/yomafn.F90 +++ b/ifs-source/arpifs/module/yomafn.F90 @@ -20,13 +20,19 @@ MODULE YOMAFN USE FULLPOS_MIX, ONLY : FULLPOS_TYPE USE TYPE_FPDSPHYS, ONLY : FPDSPHY -!==================================================================================== -! Identifiers, used for example in FULL-POS. | -! Fields are divided into 5 classes: DYN3D, DYN2D, PHYSOL, CFU, XFU | -! Some redundancies may occur. | -! Identifiers are TFP_[rootfield] for DYN3D and DYN2D | -! Identifiers are GFP_[rootfield] for PHYSOL, CFU, XFU | -!==================================================================================== +! ╒════════════════════════════════════════════════════════════════════════════╕ +! │ MODULE YOMAFN (updated 16-MAY-2024) │ +! │ │ +! │ Identifiers, used for example in FULL-POS. │ +! │ Fields are divided into 5 classes: DYN3D, DYN2D, PHYSOL, CFU, XFU │ +! │ Some redundancies may occur. │ +! │ Identifiers are TFP_[rootfield] for DYN3D and DYN2D │ +! │ Identifiers are GFP_[rootfield] for PHYSOL, CFU, XFU │ +! │ │ +! │ Author : ECMWF(?) │ +! │ ------- │ +! │ │ +! ╰────────────────────────────────────────────────────────────────────────────╯ IMPLICIT NONE diff --git a/ifs-source/arpifs/module/yomcompo.F90 b/ifs-source/arpifs/module/yomcompo.F90 index 91e7ac50..6dc98350 100644 --- a/ifs-source/arpifs/module/yomcompo.F90 +++ b/ifs-source/arpifs/module/yomcompo.F90 @@ -32,9 +32,28 @@ MODULE YOMCOMPO IMPLICIT NONE SAVE -INTEGER(KIND=JPIM), PARAMETER :: NPEMIS2D = 500 ! sync with JPOSEMIS2D in parfpos.F90 +! ╒════════════════════════════════════════════════════════════════════════════╕ +! │ MODULE YOMCOMPO (updated 15-MAY-2024) │ +! │ │ +! │ *Types for compo & emissions. Function to read emissions namelist groups* │ +! │ │ +! │ TYPES: │ +! │ - TCOMPO_EMIS -> a single emission specific. matches NAMCOMPO_EMIS │ +! │ - TCOMPO_EMIS_AUX -> a single emission auxiliary fields specific. │ +! │ - TCOMPO -> │ +! │ │ +! │ Author : ECMWF(?) │ +! │ ------- │ +! │ │ +! │ Modifications : (included before each type) │ +! │ ------------- │ +! │ 15-May-2024 - R.Checa-Garcia - Added info/comments │ +! │ │ +! ╘════════════════════════════════════════════════════════════════════════════╛ + +INTEGER(KIND=JPIM), PARAMETER :: NPEMIS2D = 500 ! sync with JPOSEMIS2D in parfpos.F90 INTEGER(KIND=JPIM), PARAMETER :: NPEMIS2DAUX = 10 ! sync with JPOSEMIS2DAUX in parfpos.F90 -INTEGER(KIND=JPIM), PARAMETER :: NPEMIS3D = 10 ! sync with JPOSEMIS3D in parfpos.F90 +INTEGER(KIND=JPIM), PARAMETER :: NPEMIS3D = 10 ! sync with JPOSEMIS3D in parfpos.F90 ! Type for a single emission specification ! Matches NAMCOMPO_EMIS namelist @@ -75,47 +94,38 @@ MODULE YOMCOMPO CHARACTER(LEN=16) :: CNAME = '' END TYPE TCOMPO_EMIS_AUX + +! Type for a .... TYPE :: TCOMPO -! mass diagnostics switch for global budget - LOGICAL :: LCHEM_DIA -! period (in hours) on which to output budget - REAL(KIND=JPRB) :: RCHEM_DIA_PERIOD -! output of photolysis rates in extra ) - LOGICAL :: LCHEM_DDFLX -! if depostion as part of diffusion flux, do not add before , direct input to tracer diffusion - LOGICAL :: LCOMPO_DDFLX_DIR -! variable tropopause (humidity) - LOGICAL :: LCHEM_TROPO -! Use EQSAM4CLIM - LOGICAL :: LAEREQSAM4CLIM -! aerosol surface fluxes - LOGICAL :: LAEROSFC -! Climatological diurnal Cycle (cosine) for climatological dry deposition velocities (AER + CHEM) - LOGICAL :: LCOMPO_DCDD -! Use nitrate aerosol scheme - LOGICAL :: LAERNITRATE -! Use aer resuspension - LOGICAL :: LAERRESUSPENSION -! Use distinct SOA species in aerosol scheme - LOGICAL :: LAERSOA -! SOA coupled with chemistry - LOGICAL :: LAERSOA_COUPLED -! Output CH4 loss tendency from chemistry, and optionally apply online - INTEGER(KIND=JPIM) :: KGHG_CHEMTEND_CH4 -! Use nucleation in IFS-GLOMAP - LOGICAL :: LAERNUCL -! Aersols scheme (aer/glomap) - CHARACTER(LEN=10) :: AERO_SCHEME - LOGICAL :: LINJ -! 2D emissions - INTEGER(KIND=JPIM) :: NEMIS2D_DESC - TYPE(TCOMPO_EMIS), DIMENSION(:), ALLOCATABLE :: YEMIS2D_DESC -! 3D emissions - INTEGER(KIND=JPIM) :: NEMIS3D_DESC - TYPE(TCOMPO_EMIS), DIMENSION(:), ALLOCATABLE :: YEMIS3D_DESC -! 2D emission auxiliary fields (injection heights etc) - TYPE(TCOMPO_EMIS_AUX), DIMENSION(:), ALLOCATABLE :: YEMIS2DAUX_DESC -END TYPE TCOMPO + ! --- SWITCHES ------------------ + LOGICAL :: LCHEM_DIA ! mass diagnostics switch for global budget + LOGICAL :: LCHEM_DDFLX ! output of photolysis rates in extra ) + LOGICAL :: LCOMPO_DDFLX_DIR ! if depostion as part of diffusion flux, do not add before, + ! direct input to tracer diffusion + LOGICAL :: LCHEM_TROPO ! variable tropopause (humidity) + LOGICAL :: LAEREQSAM4CLIM ! Use EQSAM4CLIM + LOGICAL :: LAEROSFC ! aerosol surface fluxes + LOGICAL :: LCOMPO_DCDD ! Climatological diurnal Cycle (cosine) for + ! climatological dry deposition velocities (AER + CHEM) + LOGICAL :: LAERNITRATE ! Use nitrate aerosol scheme + LOGICAL :: LAERRESUSPENSION ! Use aer resuspension + LOGICAL :: LAERSOA ! Use distinct SOA species in aerosol scheme + LOGICAL :: LAERSOA_COUPLED ! SOA coupled with chemistry + LOGICAL :: LAERNUCL ! Use nucleation in IFS-GLOMAP + LOGICAL :: LINJ ! Account for injection height + ! + CHARACTER(LEN=10) :: AERO_SCHEME ! Aersols scheme (aer/glomap) + REAL(KIND=JPRB) :: RCHEM_DIA_PERIOD ! period (in hours) on which to output budget + INTEGER(KIND=JPIM) :: KGHG_CHEMTEND_CH4 ! Output CH4 loss tendency from chemistry, and optionally apply online + ! 2D emissions + INTEGER(KIND=JPIM) :: NEMIS2D_DESC ! 2D emissions (number) + TYPE(TCOMPO_EMIS), DIMENSION(:), ALLOCATABLE :: YEMIS2D_DESC ! 2D emissions description. + ! 3D emissions + INTEGER(KIND=JPIM) :: NEMIS3D_DESC ! 2D emissions (number) + TYPE(TCOMPO_EMIS), DIMENSION(:), ALLOCATABLE :: YEMIS3D_DESC ! 3D emissions description. + ! 2D emission auxiliary fields (injection heights etc) + TYPE(TCOMPO_EMIS_AUX), DIMENSION(:), ALLOCATABLE :: YEMIS2DAUX_DESC +END TYPE TCOMPO !!TYPE(TCOMPO), POINTER :: YRCOMPO => NULL() CHARACTER(LEN=10) :: AERO_SCHEME_OP_OBS diff --git a/ifs-source/arpifs/module/yomphyder.F90 b/ifs-source/arpifs/module/yomphyder.F90 index 78eec4dc..e7ae3035 100644 --- a/ifs-source/arpifs/module/yomphyder.F90 +++ b/ifs-source/arpifs/module/yomphyder.F90 @@ -41,11 +41,11 @@ MODULE YOMPHYDER REAL(KIND=JPRB), DIMENSION(:) , POINTER, CONTIGUOUS :: ZSCAV ! - aerosols transport arrays REAL(KIND=JPRB), DIMENSION(:,:,:,:), POINTER, CONTIGUOUS :: ZAERLISI - REAL(KIND=JPRB), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZAERAOT, ZTAUAER, ZCAERO, ZAEROP - REAL(KIND=JPRB), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZAERAOTLEV,ZAERAAOTLEV, ZAERASYLEV - REAL(KIND=JPRB), DIMENSION(:,:,:) , POINTER, CONTIGUOUS :: ZAERFLX_M7 - REAL(KIND=JPRB), DIMENSION(:,:) , POINTER, CONTIGUOUS :: ZAERSRC, ZAERDDP, ZAERSDM, ZAERFLX, ZAERLIF - REAL(KIND=JPRB), DIMENSION(:) , POINTER, CONTIGUOUS :: ZAZ0M, ZAZ0H + REAL(KIND=JPRB), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZAERAOT, ZTAUAER, ZCAERO, ZAEROP + REAL(KIND=JPRB), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZAERAOTLEV,ZAERAAOTLEV, ZAERASYLEV + REAL(KIND=JPRB), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZAERFLX_M7 + REAL(KIND=JPRB), DIMENSION(:,:) , POINTER, CONTIGUOUS :: ZAERSRC, ZAERDDP, ZAERSDM, ZAERFLX, ZAERLIF + REAL(KIND=JPRB), DIMENSION(:) , POINTER, CONTIGUOUS :: ZAZ0M, ZAZ0H !--aerosol optical properties at 14 SW wavelengths (TM5M7) REAL(KIND=JPRB), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZAEROTAU, ZAEROSSA,ZAEROASY,ZAEROTAULW diff --git a/ifs-source/arpifs/namelist/naerad.nam.h b/ifs-source/arpifs/namelist/naerad.nam.h index 33d4b00c..537414ce 100644 --- a/ifs-source/arpifs/namelist/naerad.nam.h +++ b/ifs-source/arpifs/namelist/naerad.nam.h @@ -15,7 +15,7 @@ NAMELIST/NAERAD/& &, LCCNL , LCCNO , LRAYL , LRRTM , LSRTM & &, LHVOLCA, LNEWAER, LDIFFC , LNOTROAER & &, LETRACGMS,LAERCLIM,LAERVISI,LAERADJDU,LAERADCLI & - &, LPERPET, LAER3D & +&, LPERPET, LAER3D & &, NICEOPT, NLIQOPT, NSWICEOPT, NLWICEOPT, NSWLIQOPT, NLWLIQOPT & &, NMCICA , NRADIP , NRADLP & &, NREDGLW, NREDGSW & diff --git a/ifs-source/arpifs/phys_ec/OIFS_to_HAM.F90 b/ifs-source/arpifs/phys_ec/OIFS_to_HAM.F90 index bcfaee8a..de0ef68b 100644 --- a/ifs-source/arpifs/phys_ec/OIFS_to_HAM.F90 +++ b/ifs-source/arpifs/phys_ec/OIFS_to_HAM.F90 @@ -1,52 +1,53 @@ -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!> -!! \filename -!! OIFS_to_HAM.f90 -!! -!! \brief -!! Contains all the variables for needed to make HAM compatible with OIFS. -!! -!! \author Eemeli Holopainen (FMI) -!! -!! \responsible_coder -!! Eemeli Holopainen, eemeli.holopainen@fmi.fi -!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - MODULE OIFS_to_HAM - USE mo_ham, ONLY: nclass, naerocomp, subm_ngasspec + USE mo_ham, ONLY: nclass, naerocomp, subm_ngasspec IMPLICIT NONE PUBLIC :: init_ind_oifs_ham - !-->eehol: allocatable integer list for HAM and OIFS +! ╒════════════════════════════════════════════════════════════════════════════╕ +! │ MODULE OFS_to_HAM (updated 22-MAY-2024) │ +! │ │ +! │ Contains all the variables for needed to make HAM compatible with OIFS. │ +! │ │ +! │ TYPES: │ +! │ - TYPE_GFL_COMP -> ind_oifs_ham_type │ +! │ │ +! │ │ +! │ Author : Eemeli Holopainen (FMI) eemeli.holopainen@fmi.fi │ +! │ ------- │ +! │ │ +! │ Modifications : │ +! │ ------------- │ +! │ │ +! ╘════════════════════════════════════════════════════════════════════════════╛ + + ! Index list for HAM and OIFS tracers type ind_oifs_ham_type - INTEGER, PUBLIC, ALLOCATABLE :: ind_class_OIFS(:) !eehol: index list for sizeclass OIFS tracers - INTEGER, PUBLIC, ALLOCATABLE :: ind_mass_OIFS(:) !eehol: index list for mass OIFS tracers - INTEGER, PUBLIC, ALLOCATABLE :: ind_gas_OIFS(:) !eehol: index list for gas OIFS tracers - INTEGER, PUBLIC, ALLOCATABLE :: ind_cloud_OIFS(:) !eehol: index list for cloud OIFS tracers - INTEGER, PUBLIC, ALLOCATABLE :: ind_class_HAM(:) !eehol: index list for sizeclass HAM tracers - INTEGER, PUBLIC, ALLOCATABLE :: ind_mass_HAM(:) !eehol: index list for mass HAM tracers - INTEGER, PUBLIC, ALLOCATABLE :: ind_gas_HAM(:) !eehol: index list for gas HAM tracers - INTEGER, PUBLIC, ALLOCATABLE :: ind_cloud_HAM(:) !eehol: index list for cloud HAM tracers + INTEGER, PUBLIC, ALLOCATABLE :: ind_class_OIFS(:) ! indices of sizeclass OIFS tracers + INTEGER, PUBLIC, ALLOCATABLE :: ind_mass_OIFS(:) ! indices of mass OIFS tracers + INTEGER, PUBLIC, ALLOCATABLE :: ind_gas_OIFS(:) ! indices of gas OIFS tracers + INTEGER, PUBLIC, ALLOCATABLE :: ind_cloud_OIFS(:) ! indices of cloud OIFS tracers + INTEGER, PUBLIC, ALLOCATABLE :: ind_class_HAM(:) ! indices of sizeclass HAM tracers + INTEGER, PUBLIC, ALLOCATABLE :: ind_mass_HAM(:) ! indices of mass HAM tracers + INTEGER, PUBLIC, ALLOCATABLE :: ind_gas_HAM(:) ! indices of gas HAM tracers + INTEGER, PUBLIC, ALLOCATABLE :: ind_cloud_HAM(:) ! indices of cloud HAM tracers end type ind_oifs_ham_type - !<--eehol TYPE(ind_oifs_ham_type) :: ind_oifs_ham !!$OMP THREADPRIVATE(ind_oifs_ham) CONTAINS - SUBROUTINE init_ind_oifs_ham(knclass,knaerocomp,ksubm_ngasspec,kcloudind) + SUBROUTINE init_ind_oifs_ham(knclass, knaerocomp, ksubm_ngasspec, kcloudind) ! *ind_oif_ham* allocates and initializes the index list for OIFS tracers and HAM tracers ! Authors: ! ------- ! Eemeli Holopainen, FMI 4/2022 - INTEGER, INTENT(IN) :: knclass,knaerocomp,ksubm_ngasspec,kcloudind + INTEGER, INTENT(IN) :: knclass, knaerocomp, ksubm_ngasspec, kcloudind IF (ALLOCATED(ind_oifs_ham%ind_class_OIFS)) DEALLOCATE(ind_oifs_ham%ind_class_OIFS) IF (ALLOCATED(ind_oifs_ham%ind_class_HAM)) DEALLOCATE(ind_oifs_ham%ind_class_HAM) @@ -67,13 +68,13 @@ SUBROUTINE init_ind_oifs_ham(knclass,knaerocomp,ksubm_ngasspec,kcloudind) ALLOCATE(ind_oifs_ham%ind_cloud_HAM(kcloudind)) ind_oifs_ham%ind_class_OIFS(:) = 0 - ind_oifs_ham%ind_mass_OIFS(:) = 0 - ind_oifs_ham%ind_gas_OIFS(:) = 0 + ind_oifs_ham%ind_mass_OIFS(:) = 0 + ind_oifs_ham%ind_gas_OIFS(:) = 0 ind_oifs_ham%ind_cloud_OIFS(:) = 0 - ind_oifs_ham%ind_class_HAM(:) = 0 - ind_oifs_ham%ind_mass_HAM(:) = 0 - ind_oifs_ham%ind_gas_HAM(:) = 0 - ind_oifs_ham%ind_cloud_HAM(:) = 0 + ind_oifs_ham%ind_class_HAM(:) = 0 + ind_oifs_ham%ind_mass_HAM(:) = 0 + ind_oifs_ham%ind_gas_HAM(:) = 0 + ind_oifs_ham%ind_cloud_HAM(:) = 0 END SUBROUTINE init_ind_oifs_ham diff --git a/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 b/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 index 8efc1334..d41731da 100644 --- a/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 +++ b/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 @@ -63,19 +63,22 @@ SUBROUTINE AER_PHY3_LAYER(YDSURF, & !----------------------------------------------------------------------- -USE TYPE_MODEL , ONLY : MODEL -USE SURFACE_FIELDS_MIX , ONLY : TSURF -USE PARKIND1 ,ONLY : JPIM, JPRB -USE YOMHOOK ,ONLY : LHOOK, DR_HOOK, JPHOOK -USE YOMCST ,ONLY : RA, RPI - -USE YOMPHYDER ,ONLY : DIMENSION_TYPE, STATE_TYPE, AUX_TYPE, & - & AUX_DIAG_LOCAL_TYPE, SURF_AND_MORE_TYPE, FLUX_TYPE, & - & GEMS_LOCAL_TYPE, SURF_AND_MORE_LOCAL_TYPE, AUX_RAD_TYPE, AUX_DIAG_TYPE -USE YOECLDP , ONLY : NCLDQL, NCLDQI, NCLDQR, NCLDQS -USE TM5_PHOTOLYSIS, ONLY : NBANDS_TROP -USE YOE_AERODIAG, ONLY : NPAERAOT, NPAERLISI_VAR, NPAERLISI_WVL, JPAERO_WVL_AOD -USE TM5_CHEM_MODULE , ONLY : NCHEM2AER + +USE TYPE_MODEL, ONLY : MODEL +USE SURFACE_FIELDS_MIX, ONLY : TSURF +USE PARKIND1, ONLY : JPIM, JPRB +USE YOMHOOK, ONLY : LHOOK, DR_HOOK, JPHOOK +USE YOMLUN, ONLY : NULOUT +USE YOMCST, ONLY : RA, RPI + +USE YOMPHYDER, ONLY : DIMENSION_TYPE, STATE_TYPE, AUX_DIAG_LOCAL_TYPE,& + & AUX_TYPE, SURF_AND_MORE_TYPE, FLUX_TYPE, & + & GEMS_LOCAL_TYPE, SURF_AND_MORE_LOCAL_TYPE, & + & AUX_RAD_TYPE, AUX_DIAG_TYPE +USE YOECLDP, ONLY : NCLDQL, NCLDQI, NCLDQR, NCLDQS +USE TM5_PHOTOLYSIS, ONLY : NBANDS_TROP +USE YOE_AERODIAG, ONLY : NPAERAOT, NPAERLISI_VAR, NPAERLISI_WVL, JPAERO_WVL_AOD +USE TM5_CHEM_MODULE, ONLY : NCHEM2AER !----------------------------------------------------------------------- @@ -185,116 +188,125 @@ SUBROUTINE AER_PHY3_LAYER(YDSURF, & ZO3(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV) = STATE%O3(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV) ENDIF !write(*,*)"AERO_SCHEME",TRIM(AERO_SCHEME) + SELECT CASE (TRIM(AERO_SCHEME)) CASE ("glomap") CALL ABOR1("OIFS - glomap should never be called from OIFS, EXIT") CASE ("tm5m7", "hamm7") - !Optical properties calculated only for radiation timesteps. - !Using previous optical properties if not calculated - ! introduce simple routine to ensure values are non-zero: - + ! Optical properties calculated only for radiation timesteps. + ! Using previous optical properties if not calculated + ! introduce simple routine to ensure values are non-zero: - IBLK=(KDIM%KSTGLO-1)/KDIM%KLON + 1 + IBLK=(KDIM%KSTGLO-1)/KDIM%KLON + 1 - DO JAER=1,14 + ! FIXME Better than 1:14 is to define a variable with value 14 with a + ! meaningful name (RCHG) + DO JAER=1,14 DO JK=1,KDIM%KLEV - DO JL=KDIM%KIDIA,KDIM%KFDIA - - GEMSL%ZAEROTAU(JL,JK,JAER)=YDAERM7%M7AOD(JL,JK,JAER,IBLK) - GEMSL%ZAEROSSA(JL,JK,JAER)=YDAERM7%M7SSA(JL,JK,JAER,IBLK) - GEMSL%ZAEROASY(JL,JK,JAER)=YDAERM7%M7ASYM(JL,JK,JAER,IBLK) - ENDDO + DO JL=KDIM%KIDIA,KDIM%KFDIA + GEMSL%ZAEROTAU(JL,JK,JAER) = YDAERM7%M7AOD( JL,JK,JAER,IBLK) + GEMSL%ZAEROSSA(JL,JK,JAER) = YDAERM7%M7SSA( JL,JK,JAER,IBLK) + GEMSL%ZAEROASY(JL,JK,JAER) = YDAERM7%M7ASYM(JL,JK,JAER,IBLK) + ENDDO ENDDO - ENDDO - - ZTAUS_AER = 0._JPRB - ZTAUA_AER = 0._JPRB - ZPMAER = 0._JPRB - - CALL HAMM7_INTERFACE & - &( YDMODEL, & - & KDIM%KIDIA , KDIM%KFDIA , KDIM%KLON , KDIM%KTDIA , KDIM%KLEV , KDIM%KTILES , & - & KDIM%KFLDX , KDIM%KLEVX, & - & GEMSL%ITRAC , GEMSL%IAERO , GEMSL%ICHEM, KDIM%KSTGLO, PAUX%PGEOMH,& - & PAUX%PRS1 , PAUX%PRSF1 , GEMSL%ZAEROP, GEMSL%ZCAERO, GEMSL%ZCEN , PAUX%PAPHIF, & - & FLUX%PFPLCL , FLUX%PFPLCN , FLUX%PFPLSL , FLUX%PFPLSN , PAUX%PGELAT, PAUX%PGELAM, & - & STATE%A , STATE%CLD(:,:,NCLDQI), STATE%CLD(:,:,NCLDQL), STATE%CLD(:,:,NCLDQR), & - & STATE%CLD(:,:,NCLDQS), PDIAG%PCOVPTOT, PDIAG%ZLU , & - & ZO3 , STATE%Q , STATE%T , ZTH , GEMSL%ZTENC , GEMSL%ZCFLX , & - & GEMSL%ZAERDDP, GEMSL%ZAERSDM, GEMSL%ZAERSRC, GEMSL%ZAERWS , GEMSL%ZAERGUST , GEMSL%ZAERUST, GEMSL%ZAERMAP, & - & GEMSL%ZCLAERS, GEMSL%ZPRAERS, PCHEM2AER, & - !& SURFL%ZALBD , & - & SURFL%ZFRTI , PSURF%PSD_VF(:,YSD_VF%YLSM%MP) , & - & ZSNM , AUXL%ZWND , PSURF%PSP_SB(:,1,YSP_SB%YQ%MP9) , & - & GEMSL%ZAERFLX_M7, GEMSL%ZAERLIF, & - & FLUX%PAERODDF, TSPHY , PGFL , & -!VH total optical depth output... - & PSURF%PSD_VD(:,YSD_VD%YODTOACC%MP), & - & ZAERO_WVL_DIAG, & - !& PSURF%PSD_VD(:,YSD_VD%YODTO469%MP), PSURF%PSD_VD(:,YSD_VD%YODTO670%MP), & - !& PSURF%PSD_VD(:,YSD_VD%YODTO865%MP), PSURF%PSD_VD(:,YSD_VD%YODTO1240%MP), & - & GEMSL%ZAEROTAU, GEMSL%ZAEROSSA,GEMSL%ZAEROASY, GEMSL%ZAEROTAULW,& -!VH Variables ZTAUS_AER etc ideally convoluted with GEMSL%ZAERTAULT, or similar. - & ZTAUS_AER , ZTAUA_AER, ZPMAER, & -!VH - & PSURF%PSD_XA, PAUX%PVERVEL, AUXL%ZCCNL, AUXL%ZCCNO, PSURF%PAHFSTI, PSURF%PSD_VF(:,YSD_VF%YCI%MP), GEMSL%ZAZ0M, FLUX%PFTLHEV, & - & STATE%U, STATE%V, PSURF%PCVL, PSURF%PCVH,PSURF%PSD_VF(:,YSD_VF%YSO2DD%MP), PAUX%PGEMU)!,ZTSO2,ZTSO4,ZTSO4_AQ,ZFSO2,ZFSO4 ,ZFSO4_AQ& - !&) !eehol: u-wind,v-wind,low veg. cover, high veg. cover, sine of latitude - - DO JAER=1,14 + ENDDO + + ZTAUS_AER = 0._JPRB + ZTAUA_AER = 0._JPRB + ZPMAER = 0._JPRB + + ! RCHG: Is HAMM7_INTERFACE the equivalent of AER_PHY3 or it has other + ! functionalities? For a practical point of view, we can have + ! HAMM7_PHY3 to we can associate equivalent functionalities between + ! both SCHEMES. => note that this is only reasonable if + ! (a) we agree with split of subroutines in AER scheme + ! (b) the hamm7 scheme is reasonable equivalent in procedures with aer. + ! The comment about is a general suggestion. + CALL HAMM7_INTERFACE (& + & YDMODEL, & + & KDIM%KIDIA, KDIM%KFDIA, KDIM%KLON, KDIM%KTDIA, KDIM%KLEV, KDIM%KTILES, & + & KDIM%KFLDX, KDIM%KLEVX, & + & GEMSL%ITRAC , GEMSL%IAERO , GEMSL%ICHEM, KDIM%KSTGLO, PAUX%PGEOMH, & + & PAUX%PRS1 , PAUX%PRSF1 , GEMSL%ZAEROP, GEMSL%ZCAERO, GEMSL%ZCEN , PAUX%PAPHIF, & + & FLUX%PFPLCL , FLUX%PFPLCN , FLUX%PFPLSL , FLUX%PFPLSN , PAUX%PGELAT, PAUX%PGELAM, & + & STATE%A , & + & STATE%CLD(:,:,NCLDQI), STATE%CLD(:,:,NCLDQL), STATE%CLD(:,:,NCLDQR), & + & STATE%CLD(:,:,NCLDQS), PDIAG%PCOVPTOT, PDIAG%ZLU , & + & ZO3, STATE%Q, STATE%T, ZTH , GEMSL%ZTENC , GEMSL%ZCFLX , & + & GEMSL%ZAERDDP, GEMSL%ZAERSDM, GEMSL%ZAERSRC, GEMSL%ZAERWS , GEMSL%ZAERGUST , GEMSL%ZAERUST, GEMSL%ZAERMAP, & + & GEMSL%ZCLAERS, GEMSL%ZPRAERS, PCHEM2AER, & + !& SURFL%ZALBD , & + & SURFL%ZFRTI , PSURF%PSD_VF(:,YSD_VF%YLSM%MP) , & + & ZSNM , AUXL%ZWND , PSURF%PSP_SB(:,1,YSP_SB%YQ%MP9) , & + & GEMSL%ZAERFLX_M7, GEMSL%ZAERLIF, & + & FLUX%PAERODDF, TSPHY , PGFL , & + !VH total optical depth output... + & PSURF%PSD_VD(:,YSD_VD%YODTOACC%MP), & + & ZAERO_WVL_DIAG, & + !& PSURF%PSD_VD(:,YSD_VD%YODTO469%MP), PSURF%PSD_VD(:,YSD_VD%YODTO670%MP), & + !& PSURF%PSD_VD(:,YSD_VD%YODTO865%MP), PSURF%PSD_VD(:,YSD_VD%YODTO1240%MP), & + & GEMSL%ZAEROTAU, GEMSL%ZAEROSSA,GEMSL%ZAEROASY, GEMSL%ZAEROTAULW, & + !VH Variables ZTAUS_AER etc ideally convoluted with GEMSL%ZAERTAULT, or similar. + & ZTAUS_AER , ZTAUA_AER, ZPMAER, & + !VH + & PSURF%PSD_XA, PAUX%PVERVEL, AUXL%ZCCNL, AUXL%ZCCNO, PSURF%PAHFSTI, PSURF%PSD_VF(:,YSD_VF%YCI%MP), GEMSL%ZAZ0M, FLUX%PFTLHEV, & + & STATE%U, STATE%V, PSURF%PCVL, PSURF%PCVH,PSURF%PSD_VF(:,YSD_VF%YSO2DD%MP), PAUX%PGEMU) !,ZTSO2,ZTSO4,ZTSO4_AQ,ZFSO2,ZFSO4 ,ZFSO4_AQ& + !&) ! u-wind,v-wind,low veg. cover, high veg. cover, sine of latitude + + + ! FIXME Better than 1:14 is to define a variable with value 14 with a meaningful name (RCHG) + ! Note that %M7AODLW has 16 wavelenghts (see phys_radi/suecrad.F90, PLS) + DO JAER=1,14 DO JK=1,KDIM%KLEV DO JL=KDIM%KIDIA,KDIM%KFDIA - YDAERM7%M7AOD(JL,JK,JAER,IBLK) = GEMSL%ZAEROTAU(JL,JK,JAER) - YDAERM7%M7SSA(JL,JK,JAER,IBLK) = GEMSL%ZAEROSSA(JL,JK,JAER)!*GEMSL%ZAEROTAU(JL,JK,JAER) - YDAERM7%M7ASYM(JL,JK,JAER,IBLK) = GEMSL%ZAEROASY(JL,JK,JAER)!*GEMSL%ZAEROSSA(JL,JK,JAER)*GEMSL%ZAEROTAU(JL,JK,JAER) + YDAERM7%M7SSA(JL,JK,JAER,IBLK) = GEMSL%ZAEROSSA(JL,JK,JAER) !*GEMSL%ZAEROTAU(JL,JK,JAER) + YDAERM7%M7ASYM(JL,JK,JAER,IBLK) = GEMSL%ZAEROASY(JL,JK,JAER) !*GEMSL%ZAEROSSA(JL,JK,JAER)*GEMSL%ZAEROTAU(JL,JK,JAER) YDAERM7%M7AODLW(JL,JK,JAER,IBLK) = GEMSL%ZAEROTAULW(JL,JK,JAER) !weighed values calculated in raddvr. ENDDO ENDDO ENDDO - - - CASE ("aer") + CASE ("aer") !* 1. UNROLL THE DERIVED STRUCTURES AND CALL AER_PHY3 - CALL AER_PHY3 & - &( YDMODEL, & - & KDIM%KIDIA , KDIM%KFDIA , KDIM%KLON , KDIM%KTDIA , KDIM%KLEV , KDIM%KTILES , & - & KDIM%KFLDX , KDIM%KLEVX, & - & GEMSL%ITRAC , GEMSL%IAERO , GEMSL%ICHEM, & - & PAUX%PRS1 , PAUX%PRSF1 , GEMSL%ZAEROP, GEMSL%ZCAERO, GEMSL%ZCEN , PAUX%PAPHIF, & - & FLUX%PFPLCL , FLUX%PFPLCN , FLUX%PFPLSL , FLUX%PFPLSN , PAUX%PGELAT, PAUX%PGELAM, & - & STATE%A , STATE%CLD(:,:,NCLDQI), STATE%CLD(:,:,NCLDQL), STATE%CLD(:,:,NCLDQR), & - & STATE%CLD(:,:,NCLDQS), PDIAG%PCOVPTOT, PDIAG%ZLU ,& - & FLUX%PFCCQL,FLUX%PFCCQN,FLUX%PFCSQL,FLUX%PFCSQN,& - & ZO3 , STATE%Q , STATE%T , ZTH , GEMSL%ZTENC , GEMSL%ZCFLX , & - & GEMSL%ZAERDDP, GEMSL%ZAERSDM, GEMSL%ZAERSRC, GEMSL%ZAERWS , GEMSL%ZAERGUST , GEMSL%ZAERUST, GEMSL%ZAERMAP, & - & GEMSL%ZCLAERS, GEMSL%ZPRAERS, PCHEM2AER, & - & SURFL%ZALBD , GEMSL%ZTAUAER, SURFL%ZFRTI , PSURF%PSD_VF(:,YSD_VF%YLSM%MP) , & - & ZSNM , AUXL%ZWND , PSURF%PSP_SB(:,1,YSP_SB%YQ%MP9) , & - & GEMSL%ZAERFLX, GEMSL%ZAERLIF, & - & FLUX%PAERODDF, PSURF%PSD_VF(:,YSD_VF%YFCA1%MP),PSURF%PSD_VF(:,YSD_VF%YFCA2%MP),& - & TSPHY , PGFL , & - & PSURF%PSD_VD(:,YSD_VD%YODSS%MP), PSURF%PSD_VD(:,YSD_VD%YODDU%MP),& - & PSURF%PSD_VD(:,YSD_VD%YODOM%MP), PSURF%PSD_VD(:,YSD_VD%YODBC%MP), PSURF%PSD_VD(:,YSD_VD%YODSU%MP),& - & PSURF%PSD_VD(:,YSD_VD%YODNI%MP),PSURF%PSD_VD(:,YSD_VD%YODAM%MP), PSURF%PSD_VD(:,YSD_VD%YODSOA%MP),& - & PSURF%PSD_VD(:,YSD_VD%YODVFA%MP),PSURF%PSD_VD(:,YSD_VD%YODVSU%MP),PSURF%PSD_VD(:,YSD_VD%YODTOACC%MP),& - & PSURF%PSD_VD(:,YSD_VD%YAEPM1%MP),PSURF%PSD_VD(:,YSD_VD%YAEPM25%MP),PSURF%PSD_VD(:,YSD_VD%YAEPM10%MP),& - & GEMSL%ZAERAOT, GEMSL%ZAERLISI, PSURF%PSD_XA, & - & ZAERO_WVL_DIAG & - &) - - - CASE DEFAULT - - CALL ABOR1(" NO AEROSOL SCHEME "//TRIM(AERO_SCHEME) ) + CALL AER_PHY3( & + & YDMODEL, & + & KDIM%KIDIA , KDIM%KFDIA , KDIM%KLON , KDIM%KTDIA , KDIM%KLEV , KDIM%KTILES , & + & KDIM%KFLDX , KDIM%KLEVX, & + & GEMSL%ITRAC , GEMSL%IAERO , GEMSL%ICHEM, & + & PAUX%PRS1 , PAUX%PRSF1 , GEMSL%ZAEROP, GEMSL%ZCAERO, GEMSL%ZCEN , PAUX%PAPHIF, & + & FLUX%PFPLCL , FLUX%PFPLCN , FLUX%PFPLSL , FLUX%PFPLSN , PAUX%PGELAT, PAUX%PGELAM, & + & STATE%A , STATE%CLD(:,:,NCLDQI), STATE%CLD(:,:,NCLDQL), STATE%CLD(:,:,NCLDQR), & + & STATE%CLD(:,:,NCLDQS), PDIAG%PCOVPTOT, PDIAG%ZLU, & + & FLUX%PFCCQL,FLUX%PFCCQN,FLUX%PFCSQL,FLUX%PFCSQN, & + & ZO3 , STATE%Q , STATE%T , ZTH , GEMSL%ZTENC , GEMSL%ZCFLX , & + & GEMSL%ZAERDDP, GEMSL%ZAERSDM, GEMSL%ZAERSRC, GEMSL%ZAERWS , GEMSL%ZAERGUST , GEMSL%ZAERUST, GEMSL%ZAERMAP, & + & GEMSL%ZCLAERS, GEMSL%ZPRAERS, PCHEM2AER, & + & SURFL%ZALBD , GEMSL%ZTAUAER, SURFL%ZFRTI , PSURF%PSD_VF(:,YSD_VF%YLSM%MP) , & + & ZSNM , AUXL%ZWND , PSURF%PSP_SB(:,1,YSP_SB%YQ%MP9) , & + & GEMSL%ZAERFLX, GEMSL%ZAERLIF, & + & FLUX%PAERODDF, PSURF%PSD_VF(:,YSD_VF%YFCA1%MP),PSURF%PSD_VF(:,YSD_VF%YFCA2%MP),& + & TSPHY , PGFL , & + & PSURF%PSD_VD(:,YSD_VD%YODSS%MP), PSURF%PSD_VD(:,YSD_VD%YODDU%MP), & + & PSURF%PSD_VD(:,YSD_VD%YODOM%MP), PSURF%PSD_VD(:,YSD_VD%YODBC%MP), PSURF%PSD_VD(:,YSD_VD%YODSU%MP), & + & PSURF%PSD_VD(:,YSD_VD%YODNI%MP), PSURF%PSD_VD(:,YSD_VD%YODAM%MP), PSURF%PSD_VD(:,YSD_VD%YODSOA%MP), & + & PSURF%PSD_VD(:,YSD_VD%YODVFA%MP),PSURF%PSD_VD(:,YSD_VD%YODVSU%MP), PSURF%PSD_VD(:,YSD_VD%YODTOACC%MP),& + & PSURF%PSD_VD(:,YSD_VD%YAEPM1%MP),PSURF%PSD_VD(:,YSD_VD%YAEPM25%MP),PSURF%PSD_VD(:,YSD_VD%YAEPM10%MP), & + & GEMSL%ZAERAOT, GEMSL%ZAERLISI, PSURF%PSD_XA, & + & ZAERO_WVL_DIAG ) + + CASE DEFAULT + + CALL ABOR1(" NO AEROSOL SCHEME "//TRIM(AERO_SCHEME) ) END SELECT +! RCHG: This can be improved to using a variable with a sensible name instead 6. +! (not about M7) DO JAER=1,6 DO JK=1,KDIM%KLEV DO JL=KDIM%KIDIA,KDIM%KFDIA diff --git a/ifs-source/arpifs/phys_ec/aerini_layer.F90 b/ifs-source/arpifs/phys_ec/aerini_layer.F90 index 579fa329..93c1b43c 100644 --- a/ifs-source/arpifs/phys_ec/aerini_layer.F90 +++ b/ifs-source/arpifs/phys_ec/aerini_layer.F90 @@ -80,12 +80,12 @@ SUBROUTINE AERINI_LAYER(YDGEOMETRY,YDSURF,& IMPLICIT NONE TYPE(GEOMETRY) ,INTENT(IN) :: YDGEOMETRY -TYPE(TSURF) ,INTENT(IN) :: YDSURF +TYPE(TSURF) ,INTENT(IN) :: YDSURF TYPE(MODEL) ,INTENT(INOUT) :: YDMODEL TYPE (DIMENSION_TYPE) ,INTENT (IN) :: KDIM TYPE (AUX_TYPE) ,INTENT (IN) :: PAUX TYPE (STATE_TYPE) ,INTENT (IN) :: STATE -!TYPE (STATE_TYPE) ,INTENT (IN) :: TENDENCY_CML +!TYPE (STATE_TYPE) ,INTENT (IN) :: TENDENCY_CML TYPE(VARIABLE_3D) ,INTENT (IN) :: R, S TYPE (SURF_AND_MORE_TYPE) ,INTENT(INOUT) :: PSURF TYPE (SURF_AND_MORE_LOCAL_TYPE),INTENT(INOUT) :: SURFL @@ -129,21 +129,31 @@ SUBROUTINE AERINI_LAYER(YDGEOMETRY,YDSURF,& ! ------------------------------------------------------------------ IF (LHOOK) CALL DR_HOOK('AERINI_LAYER',0,ZHOOK_HANDLE) -ASSOCIATE(YDDIM=>YDGEOMETRY%YRDIM,YDDIMV=>YDGEOMETRY%YRDIMV,YDGEM=>YDGEOMETRY%YRGEM, & - & YDMP=>YDGEOMETRY%YRMP, YGFL=>YDMODEL%YRML_GCONF%YGFL,YDPHY2=>YDMODEL%YRML_PHY_MF%YRPHY2, & - & YDERAD=>YDMODEL%YRML_PHY_RAD%YRERAD, YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO, & - & YDEAERATM=>YDMODEL%YRML_PHY_RAD%YREAERATM, & - & YDRIP=>YDMODEL%YRML_GCONF%YRRIP) -ASSOCIATE(NACTAERO=>YGFL%NACTAERO, & - & LECSRAD=>YDERAD%LECSRAD, NCSRADF=>YDERAD%NCSRADF, NSW=>YDERAD%NSW, & - & NSTART=>YDRIP%NSTART, & - & LAERNITRATE => YDCOMPO%LAERNITRATE, & - & YCHEM=>YGFL%YCHEM, & - & LAERCHEM=>YGFL%LAERCHEM, & - & LAEROSFC=>YDCOMPO%LAEROSFC, & - & AERO_SCHEME=>YDCOMPO%AERO_SCHEME, & - & YSD_VD=>YDSURF%YSD_VD, YSD_VF=>YDSURF%YSD_VF, YSP_RR=>YDSURF%YSP_RR, & - & YSP_SB=>YDSURF%YSP_SB, YSP_SG=>YDSURF%YSP_SG, TSPHY=>YDPHY2%TSPHY) +ASSOCIATE(& + ! --- YDGEOMETRY ------------------------------------------------------------- + & YDDIM=>YDGEOMETRY%YRDIM, YDDIMV=>YDGEOMETRY%YRDIMV, & + & YDGEM=>YDGEOMETRY%YRGEM, YDMP=>YDGEOMETRY%YRMP, & + ! --- YDMODEL ---------------------------------------------------------------- + & YGFL =>YDMODEL%YRML_GCONF%YGFL, YDPHY2 =>YDMODEL%YRML_PHY_MF%YRPHY2, & + & YDERAD=>YDMODEL%YRML_PHY_RAD%YRERAD, YDCOMPO =>YDMODEL%YRML_CHEM%YRCOMPO, & + & YDEAERATM=>YDMODEL%YRML_PHY_RAD%YREAERATM, YDRIP=>YDMODEL%YRML_GCONF%YRRIP) + +ASSOCIATE(& + ! --- YDERAD ----------------------------------------------------------------- + & LECSRAD => YDERAD%LECSRAD, NCSRADF=>YDERAD%NCSRADF, NSW=>YDERAD%NSW, & + ! --- YGFL ------------------------------------------------------------------- + & NACTAERO => YGFL%NACTAERO, & + & YCHEM => YGFL%YCHEM, & + & LAERCHEM => YGFL%LAERCHEM, & + ! --- YDCOMPO ---------------------------------------------------------------- + & LAERNITRATE => YDCOMPO%LAERNITRATE, & + & LAEROSFC => YDCOMPO%LAEROSFC, & + & AERO_SCHEME => YDCOMPO%AERO_SCHEME, & + ! --- YDSURF ----------------------------------------------------------------- + & YSD_VD => YDSURF%YSD_VD, YSD_VF=>YDSURF%YSD_VF, YSP_RR=>YDSURF%YSP_RR,& + & YSP_SB => YDSURF%YSP_SB, YSP_SG=>YDSURF%YSP_SG, & + ! --- OTHERS ----------------------------------------------------------------- + & NSTART => YDRIP%NSTART, TSPHY=>YDPHY2%TSPHY) ! ------------------------------------------------------------------ IXCHEM(:) = IXNOTUSED @@ -159,11 +169,11 @@ SUBROUTINE AERINI_LAYER(YDGEOMETRY,YDSURF,& !* 1. UNROLL THE DERIVED STRUCTURES AND CALL AER_WIND AND AER_PHY2 -CALL AER_WIND& - &( KDIM%KIDIA,KDIM%KFDIA,KDIM%KLON,KDIM%KTILES,& - &STATE%U(:,KDIM%KLEV),STATE%V(:,KDIM%KLEV),STATE%T(:,KDIM%KLEV),STATE%Q(:,KDIM%KLEV),& - &PAUX%PAPRS(:,KDIM%KLEV),PAUX%PGEOM1(:,KDIM%KLEV),& - &PSURF%PUSTRTI,PSURF%PVSTRTI,PSURF%PAHFSTI,PSURF%PEVAPTI,SURFL%ZFRTI,GEMSL%ZAZ0M,& +CALL AER_WIND( & + & KDIM%KIDIA, KDIM%KFDIA, KDIM%KLON, KDIM%KTILES,& + & STATE%U(:,KDIM%KLEV),STATE%V(:,KDIM%KLEV),STATE%T(:,KDIM%KLEV),STATE%Q(:,KDIM%KLEV),& + & PAUX%PAPRS(:,KDIM%KLEV),PAUX%PGEOM1(:,KDIM%KLEV),& + & PSURF%PUSTRTI,PSURF%PVSTRTI,PSURF%PAHFSTI,PSURF%PEVAPTI,SURFL%ZFRTI,GEMSL%ZAZ0M,& & GEMSL%ZAERWS, GEMSL%ZAERGUST, GEMSL%ZAERUST ) ZSNM = SUM(PSURF%PSP_SG(:,:,YSP_SG%YF%MP9),DIM=2) ! pre-compute total snow mass @@ -195,85 +205,84 @@ SUBROUTINE AERINI_LAYER(YDGEOMETRY,YDSURF,& CASE ("glomap") CALL ABOR1("OIFS - glomap should never be called from OIFS, EXIT") - ! HAM-M7 only implements the micro-physics part + ! HAM-M7 only implements the micro-physics part ! all other processes are still handled by the TM5-M7 code CASE ("tm5m7", "hamm7") - CALL TM5M7_PHY2 & - &( YDGEOMETRY, YDMODEL, KDIM%KIDIA, KDIM%KFDIA, KDIM%KLON , KDIM%KTDIA, KDIM%KLEV, KDIM%KFLDX , KDIM%KLEVX,& - & KDIM%KTILES, KDIM%KSTGLO, GEMSL%ITRAC, GEMSL%IAERO, NSW,& - & PAUX%PRS1 , PAUX%PRSF1, PAUX%PAPHI, STATE%T , PAUX%PVERVEL, GEMSL%ZCEN , PAUX%PGEOMH,& - & PSURF%PSD_VD(:,YSD_VD%YALB%MP), SURFL%ZALBD, PSURF%PSD_VF(:,YSD_VF%YALUVD%MP),& - & PSURF%PSD_VF(:,YSD_VF%YAERDEP%MP),PSURF%PSD_VF(:,YSD_VF%YAERLTS%MP),PSURF%PSD_VF(:,YSD_VF%YAERSCC%MP),& - & GEMSL%ZAERWS, GEMSL%ZAERGUST, GEMSL%ZAERUST,& - & PSURF%PSD_VF(:,YSD_VF%YSO2DD%MP),& + CALL TM5M7_PHY2( & + & YDGEOMETRY, YDMODEL, KDIM%KIDIA, KDIM%KFDIA, KDIM%KLON , KDIM%KTDIA, KDIM%KLEV, KDIM%KFLDX , KDIM%KLEVX,& + & KDIM%KTILES, KDIM%KSTGLO, GEMSL%ITRAC, GEMSL%IAERO, NSW,& + & PAUX%PRS1 , PAUX%PRSF1, PAUX%PAPHI, STATE%T , PAUX%PVERVEL, GEMSL%ZCEN , PAUX%PGEOMH,& + & PSURF%PSD_VD(:,YSD_VD%YALB%MP), SURFL%ZALBD, PSURF%PSD_VF(:,YSD_VF%YALUVD%MP),& + & PSURF%PSD_VF(:,YSD_VF%YAERDEP%MP),PSURF%PSD_VF(:,YSD_VF%YAERLTS%MP),PSURF%PSD_VF(:,YSD_VF%YAERSCC%MP),& + & GEMSL%ZAERWS, GEMSL%ZAERGUST, GEMSL%ZAERUST,& + & PSURF%PSD_VF(:,YSD_VF%YSO2DD%MP),& !& PSURF%PSD_VF(:,YSD_VF%YSOGF%MP),& - & PSURF%PSD_VF(:,YSD_VF%YSOILTYPE%MP), & + & PSURF%PSD_VF(:,YSD_VF%YSOILTYPE%MP), & !TB added lake cover: YCLK, !!!PSP_SG 2 dims becomes now 3 dims - & PSURF%PSD_VF(:,YSD_VF%YCI%MP), PSURF%PSD_VF(:,YSD_VF%YCLK%MP) , & + & PSURF%PSD_VF(:,YSD_VF%YCI%MP), PSURF%PSD_VF(:,YSD_VF%YCLK%MP) , & ! & PSURF%PSD_VF(:,YSD_VF%YINJF%MP) , & - & PSURF%PSD_VD(:,YSD_VD%YBLH%MP) ,& - & SURFL%ZFRTI, PSURF%PSD_VF(:,YSD_VF%YLSM%MP) , PSURF%PSD_VF(:,YSD_VF%YSST%MP), STATE%Q, & - & PSURF%PSP_SG(:,1,YSP_SG%YF%MP9) , PSURF%PSP_RR(:,YSP_RR%YT%MP9) , PAUX%PGELAM, PAUX%PGELAT, PAUX%PGEMU, SURFL%ZHSDFOR,& - & STATE%U(:,KDIM%KLEV) , STATE%V(:,KDIM%KLEV) , PSURF%PSP_SB(:,1,YSP_SB%YQ%MP9), TSPHY, GEMSL%ZAZ0M,& - & GEMSL%ICHEM,& + & PSURF%PSD_VD(:,YSD_VD%YBLH%MP) ,& + & SURFL%ZFRTI, PSURF%PSD_VF(:,YSD_VF%YLSM%MP) , PSURF%PSD_VF(:,YSD_VF%YSST%MP), STATE%Q, & + & PSURF%PSP_SG(:,1,YSP_SG%YF%MP9) , PSURF%PSP_RR(:,YSP_RR%YT%MP9) , PAUX%PGELAM, PAUX%PGELAT, PAUX%PGEMU, SURFL%ZHSDFOR,& + & STATE%U(:,KDIM%KLEV) , STATE%V(:,KDIM%KLEV) , PSURF%PSP_SB(:,1,YSP_SB%YQ%MP9), TSPHY, GEMSL%ZAZ0M,& + & GEMSL%ICHEM,& !VH - Introduce Land use info... - & PSURF%PCVL, PSURF%PCVH,PSURF%ITVL,PSURF%ITVH, & - & PSURF%PAHFSTI, &!!!FLUX%PFTLHEV, & + & PSURF%PCVL, PSURF%PCVH,PSURF%ITVL,PSURF%ITVH, & + & PSURF%PAHFSTI, &!!!FLUX%PFTLHEV, & !VH - end - & GEMSL%ZCFLX, GEMSL%ZTENC,& - & GEMSL%ZLDAY, GEMSL%ZLISS, GEMSL%ZSO2, GEMSL%ZTDMS,& - & GEMSL%ZAERDDP, GEMSL%ZAERSDM, GEMSL%ZAERSRC, GEMSL%ZAERMAP, GEMSL%ZAERFLX_M7, GEMSL%ZAERLIF,& - & GEMSL%ZODMS, PSURF%PSD_XA, & - & PSO4SRC,PSO2SRC) + & GEMSL%ZCFLX, GEMSL%ZTENC,& + & GEMSL%ZLDAY, GEMSL%ZLISS, GEMSL%ZSO2, GEMSL%ZTDMS,& + & GEMSL%ZAERDDP, GEMSL%ZAERSDM, GEMSL%ZAERSRC, GEMSL%ZAERMAP, GEMSL%ZAERFLX_M7, GEMSL%ZAERLIF,& + & GEMSL%ZODMS, PSURF%PSD_XA, & + & PSO4SRC,PSO2SRC) CASE ("aer") - CALL AER_PHY2 & - &( YDGEOMETRY, YDMODEL, KDIM%KIDIA, KDIM%KFDIA, KDIM%KLON , KDIM%KTDIA, KDIM%KLEV, KDIM%KFLDX , KDIM%KLEVX,& - & KDIM%KTILES, KDIM%KSTGLO, GEMSL%ITRAC, GEMSL%IAERO, NSW,& - & PAUX%PRS1 , PAUX%PRSF1, PAUX%PAPHI, STATE%T , PAUX%PVERVEL, GEMSL%ZCEN , PAUX%PGEOMH,& - & PSURF%PSD_VD(:,YSD_VD%YALB%MP), SURFL%ZALBD, PSURF%PSD_VF(:,YSD_VF%YALUVD%MP),& - & PSURF%PSD_VF(:,YSD_VF%YAERDEP%MP),PSURF%PSD_VF(:,YSD_VF%YAERLTS%MP),PSURF%PSD_VF(:,YSD_VF%YAERSCC%MP),& - & GEMSL%ZAERWS, GEMSL%ZAERGUST, GEMSL%ZAERUST,& - & PSURF%PSD_VF(:,YSD_VF%YURBF%MP), R%P(:,KDIM%KLEV), S%P(:,KDIM%KLEV), & - & PSURF%PSD_VF(:,YSD_VF%YSO2DD%MP),& - & PSURF%PSD_VF(:,YSD_VF%YDSF%MP), & - & PSURF%PSD_VF(:,YSD_VF%YDSZ%MP), & - & PSURF%PSD_VF(:,YSD_VF%YDMSO%MP),& - & PSURF%PSD_VF(:,YSD_VF%YCI%MP),& - & SURFL%ZFRTI, PSURF%PSD_VF(:,YSD_VF%YLSM%MP), PSURF%PSD_VF(:,YSD_VF%YCLK%MP), STATE%Q ,PSURF%PSD_VF(:,YSD_VF%YSST%MP), & - & ZSNM , PSURF%PSP_RR(:,YSP_RR%YT%MP9) , PAUX%PGELAM, PAUX%PGELAT, PAUX%PGEMU, SURFL%ZHSDFOR,& - & STATE%U(:,KDIM%KLEV) , STATE%V(:,KDIM%KLEV) , PSURF%PSP_SB(:,1,YSP_SB%YQ%MP9) , TSPHY, GEMSL%ZAZ0M,& - & GEMSL%ICHEM,& - & PSURF%ITVL, PSURF%ITVH, PSURF%PCVL, PSURF%PCVH, PSURF%PLAIL, PSURF%PLAIH ,& - & GEMSL%ZCFLX, GEMSL%ZTENC,GEMSL%ZDDVLC,& - & GEMSL%ZDMSO, GEMSL%ZLDAY, GEMSL%ZLISS, GEMSL%ZSO2, GEMSL%ZTDMS,& - & GEMSL%ZAERDDP, GEMSL%ZAERSDM, GEMSL%ZAERSRC, GEMSL%ZAERMAP, GEMSL%ZAERFLX, GEMSL%ZAERLIF,& - & GEMSL%ZDMSI, GEMSL%ZODMS, PSURF%PSD_XA & - &) + CALL AER_PHY2( & + & YDGEOMETRY, YDMODEL, KDIM%KIDIA, KDIM%KFDIA, KDIM%KLON , KDIM%KTDIA, KDIM%KLEV, KDIM%KFLDX , KDIM%KLEVX,& + & KDIM%KTILES, KDIM%KSTGLO, GEMSL%ITRAC, GEMSL%IAERO, NSW, & + & PAUX%PRS1 , PAUX%PRSF1, PAUX%PAPHI, STATE%T , PAUX%PVERVEL, GEMSL%ZCEN , PAUX%PGEOMH,& + & PSURF%PSD_VD(:,YSD_VD%YALB%MP), SURFL%ZALBD, PSURF%PSD_VF(:,YSD_VF%YALUVD%MP),& + & PSURF%PSD_VF(:,YSD_VF%YAERDEP%MP),PSURF%PSD_VF(:,YSD_VF%YAERLTS%MP),PSURF%PSD_VF(:,YSD_VF%YAERSCC%MP),& + & GEMSL%ZAERWS, GEMSL%ZAERGUST, GEMSL%ZAERUST,& + & PSURF%PSD_VF(:,YSD_VF%YURBF%MP), R%P(:,KDIM%KLEV), S%P(:,KDIM%KLEV), & + & PSURF%PSD_VF(:,YSD_VF%YSO2DD%MP),& + & PSURF%PSD_VF(:,YSD_VF%YDSF%MP), & + & PSURF%PSD_VF(:,YSD_VF%YDSZ%MP), & + & PSURF%PSD_VF(:,YSD_VF%YDMSO%MP),& + & PSURF%PSD_VF(:,YSD_VF%YCI%MP),& + & SURFL%ZFRTI, PSURF%PSD_VF(:,YSD_VF%YLSM%MP), PSURF%PSD_VF(:,YSD_VF%YCLK%MP), STATE%Q ,PSURF%PSD_VF(:,YSD_VF%YSST%MP), & + & ZSNM , PSURF%PSP_RR(:,YSP_RR%YT%MP9) , PAUX%PGELAM, PAUX%PGELAT, PAUX%PGEMU, SURFL%ZHSDFOR,& + & STATE%U(:,KDIM%KLEV) , STATE%V(:,KDIM%KLEV) , PSURF%PSP_SB(:,1,YSP_SB%YQ%MP9) , TSPHY, GEMSL%ZAZ0M,& + & GEMSL%ICHEM,& + & PSURF%ITVL, PSURF%ITVH, PSURF%PCVL, PSURF%PCVH, PSURF%PLAIL, PSURF%PLAIH ,& + & GEMSL%ZCFLX, GEMSL%ZTENC,GEMSL%ZDDVLC,& + & GEMSL%ZDMSO, GEMSL%ZLDAY, GEMSL%ZLISS, GEMSL%ZSO2, GEMSL%ZTDMS,& + & GEMSL%ZAERDDP, GEMSL%ZAERSDM, GEMSL%ZAERSRC, GEMSL%ZAERMAP, GEMSL%ZAERFLX, GEMSL%ZAERLIF,& + & GEMSL%ZDMSI, GEMSL%ZODMS, PSURF%PSD_XA ) IF (LECSRAD .AND. NCSRADF == 1 .AND. NACTAERO >= 12) THEN - DO JL=KDIM%KIDIA,KDIM%KFDIA - PSURF%PSD_XA(JL,15,14)=SURFL%ZHSDFOR(JL) ! stand.dev. form orography - PSURF%PSD_XA(JL,16,14)=SURFL%ZFRTI(JL,4) ! tile fraction - PSURF%PSD_XA(JL,17,14)=SURFL%ZFRTI(JL,8) ! tile fraction - PSURF%PSD_XA(JL,18,14)=0._JPRB - PSURF%PSD_XA(JL,19,14)=PSURF%PSD_VD(JL,YSD_VD%YALB%MP) ! background albedo - PSURF%PSD_XA(JL,20,14)=PSURF%PSD_VF(JL,YSD_VF%YALUVD%MP) ! diffuse UVis albedo - PSURF%PSD_XA(JL,21,14)=SURFL%ZALBD(JL,1) ! diffuse albedo 1st interval - PSURF%PSD_XA(JL,22,14)=SUM(PSURF%PSP_SG(JL,1:KDIM%KLEVSN,YSP_SG%YF%MP9),DIM=1) ! snow SNS -! - DMS-related - PSURF%PSD_XA(JL,23,14)=GEMSL%ZDMSO(JL) - PSURF%PSD_XA(JL,24,14)=GEMSL%ZLDAY(JL) - PSURF%PSD_XA(JL,25,14)=GEMSL%ZSO2(JL) - PSURF%PSD_XA(JL,26,14)=GEMSL%ZAERWS(JL) - PSURF%PSD_XA(JL,27,14)=GEMSL%ZLISS(JL) - PSURF%PSD_XA(JL,28,14)=GEMSL%ZTDMS(JL) - PSURF%PSD_XA(JL,29,14)=GEMSL%ZODMS(JL) - PSURF%PSD_XA(JL,30,14)=GEMSL%ZDMSI(JL) - ENDDO - ENDIF + DO JL=KDIM%KIDIA,KDIM%KFDIA + PSURF%PSD_XA(JL,15,14)=SURFL%ZHSDFOR(JL) ! stand.dev. form orography + PSURF%PSD_XA(JL,16,14)=SURFL%ZFRTI(JL,4) ! tile fraction + PSURF%PSD_XA(JL,17,14)=SURFL%ZFRTI(JL,8) ! tile fraction + PSURF%PSD_XA(JL,18,14)=0._JPRB + PSURF%PSD_XA(JL,19,14)=PSURF%PSD_VD(JL,YSD_VD%YALB%MP) ! background albedo + PSURF%PSD_XA(JL,20,14)=PSURF%PSD_VF(JL,YSD_VF%YALUVD%MP) ! diffuse UVis albedo + PSURF%PSD_XA(JL,21,14)=SURFL%ZALBD(JL,1) ! diffuse albedo 1st interval + PSURF%PSD_XA(JL,22,14)=SUM(PSURF%PSP_SG(JL,1:KDIM%KLEVSN,YSP_SG%YF%MP9),DIM=1) ! snow SNS + ! - DMS-related + PSURF%PSD_XA(JL,23,14)=GEMSL%ZDMSO(JL) + PSURF%PSD_XA(JL,24,14)=GEMSL%ZLDAY(JL) + PSURF%PSD_XA(JL,25,14)=GEMSL%ZSO2(JL) + PSURF%PSD_XA(JL,26,14)=GEMSL%ZAERWS(JL) + PSURF%PSD_XA(JL,27,14)=GEMSL%ZLISS(JL) + PSURF%PSD_XA(JL,28,14)=GEMSL%ZTDMS(JL) + PSURF%PSD_XA(JL,29,14)=GEMSL%ZODMS(JL) + PSURF%PSD_XA(JL,30,14)=GEMSL%ZDMSI(JL) + ENDDO + ENDIF CASE DEFAULT diff --git a/ifs-source/arpifs/phys_ec/callpar.F90 b/ifs-source/arpifs/phys_ec/callpar.F90 index c5735840..c652de0b 100644 --- a/ifs-source/arpifs/phys_ec/callpar.F90 +++ b/ifs-source/arpifs/phys_ec/callpar.F90 @@ -260,8 +260,9 @@ SUBROUTINE CALLPAR(YDGEOMETRY,YDVARS,YDSURF,YDMODEL,KDIM,& & DDH_SURF_TYPE, GEMS_LOCAL_TYPE,PERTURB_LOCAL_TYPE,SURF_AND_MORE_LOCAL_TYPE,AUX_DIAG_LOCAL_TYPE,& & KEYS_LOCAL_TYPE USE COUPLING -USE YOE_PHYS_MWAVE , ONLY : N_PHYS_MWAVE +USE YOE_PHYS_MWAVE , ONLY : N_PHYS_MWAVE USE TM5_CHEM_MODULE , ONLY : NCHEM2AER +USE YOMLUN, ONLY : NULOUT ! ------------------------------------------------------------------ IMPLICIT NONE diff --git a/ifs-source/arpifs/phys_ec/hamm7_init.F90 b/ifs-source/arpifs/phys_ec/hamm7_init.F90 index 1fb6ce2f..f2ddd3ac 100644 --- a/ifs-source/arpifs/phys_ec/hamm7_init.F90 +++ b/ifs-source/arpifs/phys_ec/hamm7_init.F90 @@ -1,67 +1,79 @@ SUBROUTINE hamm7_init(YGFL, YRRIP) -!** DESCRIPTION -! ---------- -! -! init routine HAM-M7 aerosol in OpenIFS -! -! -! -!** INTERFACE. -! ---------- -! *hamm7_init* is called from *CNT4*. -! REMARK: the code assumes that TM5M7_INIT has already been called! - -! Externals. -! --------- - -! -! AUTHOR. -! ------- -! Thomas Kühn (thk), FMI - -! MODIFICATIONS. -! -------------- -! ORIGINAL : 2020-11-11 +! ╭────────────────────────────────────────────────────────────────────────────╮ +! │ (updated 14-MAY-2024) │ +! │ Purpose : │ +! │ ------- │ +! │ init routine HAM-M7 aerosol in OpenIFS │ +! │ │ +! │ │ +! │ Interface : │ +! │ --------- │ +! │ *hamm7_init* is called from *CNT4*. │ +! │ REMARK: the code assumes that TM5M7_INIT has already been called! │ +! │ │ +! │ │ +! │ Input : │ +! │ ----- │ +! │ │ +! │ │ +! │ Output : │ +! │ ------ │ +! │ │ +! │ │ +! │ Externals : │ +! │ --------- │ +! │ │ +! │ Method : │ +! │ ------ │ +! │ │ +! │ Reference : │ +! │ --------- │ +! │ │ +! │ Author : │ +! │ ------- │ +! │ Orginal version: │ +! │ 2020-11-11 - Thomas Kuehn (FMI/UEF) │ +! │ │ +! │ Modifications : │ +! │ ------------- │ +! │ ? - Eemeli Holopainen (FMI) : ? │ +! │ May. 2024 - R. Checa-Garcia (KNMI) : revision for CY48r1 │ +! │ │ +! ╰────────────────────────────────────────────────────────────────────────────╯ !---------------------------------------------------------------------- !* 0.0 USE STATEMENTS ! --------------- -USE PARKIND1 , ONLY : & - JPRB +! IFS/OPENIFS modules --------------------------------------------------------- +USE PARKIND1, ONLY : JPRB +USE YOMHOOK, ONLY : LHOOK, DR_HOOK, JPHOOK +USE YOMRIP, ONLY : TRIP +USE YOM_YGFL, ONLY : TYPE_GFLD ! Gives type for YGFL !!!!TEMPORARY -Use YOMMP0,only: & - MYPROC +Use YOMMP0, ONLY : MYPROC !!!!TEMPORARY -USE YOMHOOK , ONLY : & - LHOOK, DR_HOOK, JPHOOK - -!USE YOM_YGFL , ONLY : & -! YGFL -USE YOMRIP, ONLY: TRIP -USE YOM_YGFL , ONLY : TYPE_GFLD!YGFL +! --- M7 modules -------------------------------------------------------------- ! --> thk: bug fix -USE MO_TIME_CONTROL, ONLY: & - init_mo_time_control +USE MO_TIME_CONTROL, ONLY: init_mo_time_control ! <-- thk -USE MO_SPECIES, ONLY: & - speclist ! tracer species in HAM +USE MO_SPECIES, ONLY: speclist ! tracer species in HAM -USE MO_HAM, ONLY: & - sizeclass, & ! aerosol classes in HAM - nclass, & ! number of aerosol classes in HAM - aerocomp, & ! aerosol compounds by size class in HAM - naerocomp, & ! amount of aerosol mass tracers in HAM - subm_gasspec, & ! gas phase species in HAM - subm_ngasspec ! number of gas phase species in HAM +USE MO_HAM, ONLY: & + sizeclass, & ! aerosol classes in HAM + nclass, & ! number of aerosol classes in HAM + aerocomp, & ! aerosol compounds by size class in HAM + naerocomp, & ! amount of aerosol mass tracers in HAM + subm_gasspec, & ! gas phase species in HAM + subm_ngasspec ! number of gas phase species in HAM -USE OIFS_to_HAM, ONLY: init_ind_oifs_ham, & ! init index list for OIFS and HAM - ind_oifs_ham! index list type +USE OIFS_to_HAM, ONLY: init_ind_oifs_ham, & ! init index list for OIFS and HAM + & ind_oifs_ham ! index list type !ind_class_OIFS, & ! index list for aerosol sizeclasses from OIFS !ind_class_HAM, & ! index list for aerosol sizeclasses from HAM !ind_mass_OIFS, & ! index list for aerosol masses from OIFS @@ -71,13 +83,11 @@ SUBROUTINE hamm7_init(YGFL, YRRIP) !ind_cloud_OIFS, & ! index list for cloud variables from OIFS !ind_cloud_HAM ! index list for cloud variables from HAM -USE MO_TRACDEF, ONLY: & - GAS, AEROSOL, & ! species type identifiers - GAS_OR_AEROSOL, ntrac, trlist +USE MO_TRACDEF, ONLY: GAS, AEROSOL, & ! species type identifiers + & GAS_OR_AEROSOL, ntrac, trlist -USE MO_HAM_M7_TRAC, ONLY: & - idt_cdnc_ham, & !index for HAM CDNC - idt_icnc_ham !index for HAM ICNC +USE MO_HAM_M7_TRAC, ONLY: idt_cdnc_ham, & !index for HAM CDNC + & idt_icnc_ham !index for HAM ICNC USE MO_HAM_INIT, ONLY: & start_ham, & @@ -87,8 +97,7 @@ SUBROUTINE hamm7_init(YGFL, YRRIP) USE MO_ADVECTION, ONLY: & !eehol: added for advection initialization iadvec, tpcore -USE MO_SUBMODEL, & - ONLY: & !eehol: added mo_submodel routines +USE MO_SUBMODEL, ONLY: & !eehol: added mo_submodel routines setsubmodel, lham, id_ham, starttracdef, endtracdef USE MO_SPECIES, & @@ -106,21 +115,20 @@ SUBROUTINE hamm7_init(YGFL, YRRIP) IMPLICIT NONE -TYPE(TYPE_GFLD) ,INTENT(IN) :: YGFL -TYPE(TRIP) ,INTENT(IN) :: YRRIP +TYPE(TYPE_GFLD), INTENT(IN) :: YGFL +TYPE(TRIP), INTENT(IN) :: YRRIP !---------------------------------------------------------------------- !* 0.5 LOCAL VARIABLES ! --------------- -INTEGER :: & ! looping indices - j_yaero, j_ychem, & ! IFS - j_class, j_mass, j_spec, j_gas, j_cloud, & ! HAM - kt, znclass, znaerocomp, zsubm_ngasspec, zcloudind ! eehol: indices for OIFS to HAM +INTEGER :: & ! looping indices + & j_yaero, j_ychem, & ! IFS + & j_class, j_mass, j_spec, j_gas, j_cloud, & ! HAM + & kt, znclass, znaerocomp, zsubm_ngasspec, zcloudind ! eehol: indices for OIFS to HAM -REAL(KIND=JPHOOK) :: & - ZHOOK_HANDLE ! return status +CHARACTER(len=64) :: int_str, int_str_ham ! eehol: integer as string -CHARACTER(len=64) :: int_str, int_str_ham !eehol: integer as string +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE ! return status !---------------------------------------------------------------------- !* 1.0 EXECUTABLE CODE @@ -148,6 +156,8 @@ SUBROUTINE hamm7_init(YGFL, YRRIP) CALL start_ham !eehol: define tracer numbers, idt, etc. with ham_define_tracer +! RCHG: For the implementation in IFS code it would be worth to consider to +! rename starttracdef and similar subroutines to m7_starttracdef IF (lham) THEN CALL starttracdef(id_ham) CALL ham_define_tracer @@ -179,9 +189,12 @@ SUBROUTINE hamm7_init(YGFL, YRRIP) znclass = nclass znaerocomp = naerocomp zsubm_ngasspec = subm_ngasspec -zcloudind = 2 !eehol CDNC and ICNC -CALL init_ind_oifs_ham(znclass,znaerocomp,zsubm_ngasspec,zcloudind) +! RCHG -> for consistency I would define zcloudind in the MO_HAM like the similar +! definitions rather than here. +zcloudind = 2 !eehol CDNC and ICNC + +CALL init_ind_oifs_ham(znclass, znaerocomp, zsubm_ngasspec, zcloudind) ! RCHG -> allocates and initialize to zero. !-->eehol ! assigning tracer indices as found in YGFL to the @@ -203,9 +216,12 @@ SUBROUTINE hamm7_init(YGFL, YRRIP) ! AC-experiments/ctrl/Table/bins_hamm7ver1.csv and compare the names you get ! in the files. -! aerosol tracers -!write(*,*) "MYPROC ", MYPROC +! RCHG -> this nested loop aims to indentify corresponding indices of OPENIFS vs HAM +! data structures. If the several files stored "fort.N" are just for testing +! purposes we may add a LLDEBUG flag to activate/deactive the savings. FIXME. + +! aerosol tracers LABEL_IFS_AERO: DO j_yaero = 1,NAERO ! looping over the number tracers in HAM @@ -214,9 +230,8 @@ SUBROUTINE hamm7_init(YGFL, YRRIP) ! sizeclass names in HAM-M7 are two-letter (xy) combinations: ! x: N,K,A,C = nucleation, Aitken, accumulation, and coarse, respectively, while ! y: S,I = soluble, insoluble, respectively. - ! In the IFS-csv table, these combinations are prefixed with '_N' - !write(*,*) "CNAME ", TRIM(YAERO(j_yaero)%CNAME) - !write(*,*) "sizeclass ",TRIM(sizeclass(j_class)%shortname)//'_N' + ! In the IFS-csv table, these combinations are suffixed with '_N' + IF (TRIM(YAERO(j_yaero)%CNAME) == TRIM(sizeclass(j_class)%shortname)//'_N') THEN ! In case of a match, we set the tracer index in the HAM meta data to the @@ -249,13 +264,9 @@ SUBROUTINE hamm7_init(YGFL, YRRIP) ! standard names are OC, BC, SO4, DU, and SS for organic carbon, black carbon ! sulfate, mineral dust and seasalt, respectively. Other species may be ! included as well, depending on the HAM setup. + j_class = aerocomp(j_mass)%iclass ! index to size class j_spec = aerocomp(j_mass)%spid ! index to species - !write(*,*) "CNAME ", TRIM(YAERO(j_yaero)%CNAME) - !write(*,*) "shortname ",(TRIM(speclist(j_spec)%shortname)//'_'//TRIM(sizeclass(j_class)%shortname)) - !write(*,*) "sizeclass=POM_ ", 'POM_'//TRIM(sizeclass(j_class)%shortname) - - ! write(*,*) "sizeclass ==OC ", TRIM(speclist(j_spec)%shortname) IF (TRIM(YAERO(j_yaero)%CNAME) == (TRIM(speclist(j_spec)%shortname)//'_'//TRIM(sizeclass(j_class)%shortname))) THEN @@ -279,6 +290,7 @@ SUBROUTINE hamm7_init(YGFL, YRRIP) ! once the tracer is identified we can check the next one CYCLE LABEL_IFS_AERO + ELSE IF ( (TRIM(YAERO(j_yaero)%CNAME) == 'POM_'//TRIM(sizeclass(j_class)%shortname)) .AND. (TRIM(speclist(j_spec)%shortname) == 'OC') ) THEN ! In case of a match, we set the tracer index in the HAM meta data to the @@ -370,7 +382,9 @@ SUBROUTINE hamm7_init(YGFL, YRRIP) WRITE(7000+MYPROC,'(a)') 'j_ychem ='//TRIM(int_str) WRITE(7000+MYPROC,'(a)') 'HAM gas: '//TRIM(trlist%ti(speclist(j_spec)%idt)%fullname) WRITE(7000+MYPROC,'(a)') 'gas idt_no ='//TRIM(int_str_ham) - WRITE(7000+MYPROC,'(a)') 'wetdep',trlist%ti(kt) + ! RCHG -> line below printed non string characters. Probably issue with dimensions + ! strings, so commented. FIXME + !WRITE(7000+MYPROC,'(a)') 'wetdep',trlist%ti(kt) END IF ! once the tracer is identified we can check the next one diff --git a/ifs-source/arpifs/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/phys_ec/hamm7_interface.F90 index 1ca806f3..d2906630 100755 --- a/ifs-source/arpifs/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/phys_ec/hamm7_interface.F90 @@ -43,12 +43,9 @@ SUBROUTINE HAMM7_INTERFACE( & ! │ │ ! │ Method : │ ! │ ------ │ -! │ Follows the method of Marticorena-Bergametti 1995 for the variables │ -! │ UTH, Srel, srelV │ ! │ │ ! │ Reference : │ ! │ --------- │ -! │ Marticorena, Bergametti. JGR: Atmospheres, 1995. │ ! │ │ ! │ Author : │ ! │ ------- │ @@ -60,10 +57,25 @@ SUBROUTINE HAMM7_INTERFACE( & ! │ May. 2020 - V. Huijnen : Modifications for TM5M7 │ ! │ Sep. 2020 - T. Bergman : TM5M7 work │ ! │ Apr. 2024 - Lianghai Wu : revision for CY48r1 │ -! │ May. 2020 - R. Checa-Garcia: revision for CY48r1 and refactory │ +! │ May. 2020 - R. Checa-Garcia: revision for CY48r1, fix, refactory │ ! │ │ ! ╰────────────────────────────────────────────────────────────────────────────╯ +! RCHG: (TODO) +! This subroutine assumes YAEROUT() has a number of elements, we may have +! to introduce something that test that the number is consistent with what +! is needed. Also the namelist with YAEROUT specification may need to be +! consistent with how we fill things here (not sure about it). +! +! RCHG: (TODO) +! For this subroutine the description of the steps is not very uniform +! For so long subroutines we may need a table of contents to any reader +! can understand what is doing or better per section headers or split +! with CONTAINS into different parts. The advantage of the last approach +! is to indentify and isolate what are the input/outputs of each step. +! The problem are the associate environments. + + ! PARAMETER DESCRIPTION UNITS ! --------- ----------- ----- ! INPUT PARAMETERS (INTEGER): @@ -165,7 +177,7 @@ SUBROUTINE HAMM7_INTERFACE( & USE MO_HAM, ONLY: nclass, naerocomp, sizeclass, nccndiag, subm_ngasspec USE OIFS_TO_HAM, ONLY: ind_oifs_ham USE MO_HAM_SUBM, ONLY: HAM_SUBM_INTERFACE !eehol: replaced HAM-M7 call with submodel interface -USE MO_ACTIV, ONLY: activ_updraft,nw,idt_cdnc,idt_icnc !eehol: HAM-M7 activation updraft calculation, effective radii +USE MO_ACTIV, ONLY: activ_updraft,nw, idt_cdnc, idt_icnc !eehol: HAM-M7 activation updraft calculation, effective radii USE MO_HAM_ACTIV, ONLY: ham_activ_abdulrazzak_ghan, ham_activ_koehler_ab !eehol: HAM-M7 activation USE MO_PARAM_SWITCHES, ONLY: ncd_activ !eehol: for activation USE MO_TRACDEF, ONLY: ntrac, trlist @@ -183,7 +195,7 @@ SUBROUTINE HAMM7_INTERFACE( & ! [RCHG -> non used] USE mo_ham_species, ONLY: id_so2 !SO2 wetdep for simple sulfur scheme ! [RCHG -> non used] USE YOMMP0, ONLY : MYPROC, NPROC -USE TM5M7_OPTICS_DATA, ONLY : NWDEP, NASWBAND,ASWBAND !,WDEP, AER_TAU, AER_SSA,AER_ASYM,AER_TAU_LW +USE TM5M7_OPTICS_DATA, ONLY : NWDEP, NASWBAND, ASWBAND !,WDEP, AER_TAU, AER_SSA,AER_ASYM,AER_TAU_LW USE TM5_PHOTOLYSIS, ONLY : NBANDS_TROP, WAV_GRID, WAV_GRIDA USE TM5M7_EMIS_DATA, ONLY : VKARMAN ! von karman constant for dry deposition !----------------------------------------------------------------------- @@ -260,7 +272,9 @@ SUBROUTINE HAMM7_INTERFACE( & !* 0.5 LOCAL VARIABLES ! --------------- -INTEGER(KIND=JPIM) :: JAER, JK, JL, JWAVL, JT, JB, JN, JEXT, ITRC, IKLEVTROP(KLON), IW +INTEGER(KIND=JPIM) :: JAER, JK, JL, JWAVL, JT, JB, JN +INTEGER(KIND=JPIM) :: JEXT, ITRC, IKLEVTROP(KLON), IW +INTEGER(KIND=JPIM) :: JO, JH, JY ! inside loop index for OIFS contex, HAM context and YAEROUT INTEGER(KIND=JPIM) :: JCLASS, JTILE, JMASS, JGAS, JCLOUD ! local loop indice for activation and dry deposition and tracer indexing INTEGER(KIND=JPIM) :: ISSO2, ISSO4, ISSO4_ACS INTEGER(KIND=JPIM) :: IMODE @@ -427,22 +441,22 @@ SUBROUTINE HAMM7_INTERFACE( & REAL(KIND=JPRB) :: Wdepout_2D(KLON,ktrac) REAL(KIND=JPRB) :: M7TEND_OUT(KLON,KLEV,KTRAC) REAL(KIND=JPRB) :: M7TEND_IN(KLON,KLEV,KTRAC) -REAL(KIND=JPRB):: zaveragep(KLON,klev,(nclass+naerocomp)) -REAL(KIND=JPRB):: zm7kappa(KLON,klev,(nclass+naerocomp)) -REAL(KIND=JPRB):: zh2so4cs(KLON,klev,(nclass+naerocomp)) -REAL(KIND=JPRB):: zm7prodcond(KLON,klev,(nclass+naerocomp)) +REAL(KIND=JPRB) :: zaveragep(KLON,klev,(nclass+naerocomp)) +REAL(KIND=JPRB) :: zm7kappa(KLON,klev,(nclass+naerocomp)) +REAL(KIND=JPRB) :: zh2so4cs(KLON,klev,(nclass+naerocomp)) +REAL(KIND=JPRB) :: zm7prodcond(KLON,klev,(nclass+naerocomp)) REAL(KIND=JPRB) :: ZVDA(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO) REAL(KIND=JPRB) :: ZSEDIFLUX(KLON,KLEV,ntrac) REAL(KIND=JPRB) :: ZDDEPFLUX(KLON,ntrac) REAL(KIND=JPRB) :: ZDDEPFLUX_SO2(KLON) REAL(KIND=JPRB) :: ZVDEP(KLON,ntrac) !ddep velocity for diagnostics from ham INTEGER(kind=JPIM), parameter::ZKROW=1 ! KROW only used in ECHAM but needed inside HAM-codes so set as 1. -INTEGER(kind=JPIM):: IBLK -REAL(KIND=JPRB) :: reffi(KLON,KLEV,ZKROW), reffl(KLON,KLEV,ZKROW) -INTEGER(kind=JPIM)::LWBANDS !laakso: number of LW bands +INTEGER(kind=JPIM) :: IBLK +REAL(KIND=JPRB) :: reffi(KLON,KLEV,ZKROW), reffl(KLON,KLEV,ZKROW) +INTEGER(kind=JPIM) :: LWBANDS !laakso: number of LW bands INTEGER(KIND=JPIM) :: INWAVL, ITWAVL(20) -REAL(KIND=JPRB) ::PRS1D(KLON,KLEV) -INTEGER(kind=JPIM)::ISO4_C, ISSO4_C ! temporary tracer index of gas-phase SO4 (retrieved from chemistry module) +REAL(KIND=JPRB) :: PRS1D(KLON,KLEV) +INTEGER(kind=JPIM) :: ISO4_C, ISSO4_C ! temporary tracer index of gas-phase SO4 (retrieved from chemistry module) ! [RCHG -> non used ] REAL(KIND=JPRB) :: ZTENCI(KLON,KLEV,KTRAC) !for OIFS tendencies ! [RCHG -> non used ] INTEGER(kind=JPIM)::ZISO4 ! temporary tracer index of gas-phase SO4 (retrieved from chemistry module) @@ -472,7 +486,7 @@ SUBROUTINE HAMM7_INTERFACE( & ! include calculations for ice effective radius !----------------------------------------------------------------------- -IF (LHOOK) CALL DR_HOOK('TM5M7',0,ZHOOK_HANDLE) +IF (LHOOK) CALL DR_HOOK('HAMM7_INTERFACE',0,ZHOOK_HANDLE) ASSOCIATE( & & YGFL => YDMODEL%YRML_GCONF%YGFL, & & YDPHYRAD => YDMODEL%YRML_PHY_RAD, & @@ -523,6 +537,7 @@ SUBROUTINE HAMM7_INTERFACE( & & LAERSCAV_CHEM => YREAERATM%LAERSCAV_CHEM, & & LAERVOL => YREAERATM%LAERVOL, & & NXT3DAER => YREAERATM%NXT3DAER, & + & LAERRRTM => YREAERATM%LAERRRTM, & ! --- YRERAD ---------------------------------------------- & LAERVISI => YRERAD%LAERVISI, & & NTSW => YRERAD%NTSW, & @@ -648,59 +663,56 @@ SUBROUTINE HAMM7_INTERFACE( & ! computation of tropopause level CALL TROPLEV(KLON,KIDIA,KFDIA,KLEV,.FALSE.,PTP,PQP,PRSF1,IKLEVTROP) - - ! Initializing tracer number and mixing ratios and gas concentrations to not be tendency updated values - ITRC=0 - DO JEXT=1,NGHG - ITRC=ITRC+1 - DO JK=1,KLEV - DO JL=KIDIA,KFDIA - ZCEN(JL,JK,ITRC) = PGFL(JL,JK,YGHG(JEXT)%MP9_PH) - ENDDO - ENDDO - ENDDO - - DO JEXT=1,ZTRAC - ITRC=ITRC+1 - DO JK=1,KLEV - DO JL=KIDIA,KFDIA - ZCEN(JL,JK,ITRC) = PGFL(JL,JK,YTRAC(JEXT)%MP9_PH) - ENDDO - ENDDO +! Initializing tracer number and mixing ratios and gas concentrations to not be tendency updated values +ITRC=0 +DO JEXT=1,NGHG + ITRC=ITRC+1 + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZCEN(JL,JK,ITRC) = PGFL(JL,JK,YGHG(JEXT)%MP9_PH) ENDDO + ENDDO +ENDDO - - DO JEXT=1,NAERO - ITRC=ITRC+1 - DO JK=1,KLEV - DO JL=KIDIA,KFDIA - ZCEN(JL,JK,ITRC) = PGFL(JL,JK,YAERO(JEXT)%MP9_PH) - ENDDO - ENDDO +DO JEXT=1,ZTRAC + ITRC=ITRC+1 + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZCEN(JL,JK,ITRC) = PGFL(JL,JK,YTRAC(JEXT)%MP9_PH) ENDDO + ENDDO +ENDDO - if(LAERCHEM) then - DO JEXT=1,NCHEM - ITRC=ITRC+1 - DO JK=1,KLEV - DO JL=KIDIA,KFDIA - ZCEN(JL,JK,ITRC) = PGFL(JL,JK,YCHEM(JEXT)%MP9_PH) - ENDDO - ENDDO - ENDDO - end if - - -DO JAER=1,NACTAERO +DO JEXT=1,NAERO + ITRC=ITRC+1 DO JK=1,KLEV DO JL=KIDIA,KFDIA - ! check on max-values here to prevent excessive values in OPTICS_AOP_GET.. probably to be removed again!! - ZAEROK(JL,JK,JAER) =MIN(ZCEN(JL,JK,KAERO(JAER)), 1e10) - ZTAEROK(JL,JK,JAER)=PTENC(JL,JK,KAERO(JAER)) + ZCEN(JL,JK,ITRC) = PGFL(JL,JK,YAERO(JEXT)%MP9_PH) ENDDO ENDDO ENDDO +IF(LAERCHEM) then + DO JEXT=1,NCHEM + ITRC=ITRC+1 + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZCEN(JL,JK,ITRC) = PGFL(JL,JK,YCHEM(JEXT)%MP9_PH) + ENDDO + ENDDO + ENDDO +ENDIF + +!DO JAER=1,NACTAERO +! DO JK=1,KLEV +! DO JL=KIDIA,KFDIA +! ! check on max-values here to prevent excessive values in OPTICS_AOP_GET.. probably to be removed again!! +! ZAEROK(JL,JK,JAER) =MIN(ZCEN (JL,JK,KAERO(JAER)), 1e10) +! ZTAEROK(JL,JK,JAER)=PTENC(JL,JK,KAERO(JAER)) +! ENDDO +! ENDDO +!ENDDO + ! Initialize output aerosol tendencies DO JAER=1,NACTAERO DO JK=1,KLEV @@ -713,10 +725,10 @@ SUBROUTINE HAMM7_INTERFACE( & DO JK=1,KLEV DO JL=KIDIA,KFDIA - ZRHO(JL,JK)=PRSF1(JL,JK)/(RD*PTP(JL,JK)) - ZDP(JL,JK)= PRS1(JL,JK) - PRS1(JL,JK-1) - ZDPG(JL,JK)= (PRS1(JL,JK) - PRS1(JL,JK-1))/RG ! calculate dp/g - ZDZ(JL,JK)= ZDP(JL,JK) / (ZRHO(JL,JK)*RG) + ZRHO(JL,JK) = PRSF1(JL,JK)/(RD*PTP(JL,JK)) + ZDP(JL,JK) = PRS1(JL,JK) - PRS1(JL,JK-1) + ZDPG(JL,JK) = (PRS1(JL,JK) - PRS1(JL,JK-1))/RG ! calculate dp/g + ZDZ(JL,JK) = ZDP(JL,JK) / (ZRHO(JL,JK)*RG) ENDDO ENDDO @@ -728,91 +740,85 @@ SUBROUTINE HAMM7_INTERFACE( & !ZAERNL(KIDIA:KFDIA,:,:)=0.0_JPRB IF (LCHEM_DIA) THEN - ZTAERO0(KIDIA:KFDIA,1:KLEV,1:NACTAERO) = ZTAEROK(KIDIA:KFDIA,1:KLEV,1:NACTAERO) - ZTENC0(KIDIA:KFDIA,1:KLEV, :) = 0._JPRB + ZTAERO0(KIDIA:KFDIA,1:KLEV,1:NACTAERO) = ZTAEROK(KIDIA:KFDIA,1:KLEV,1:NACTAERO) + ZTENC0(KIDIA:KFDIA,1:KLEV, :) = 0._JPRB ENDIF - -WRITE(NULOUT,*) '[HAMM7_INTERFACE]' - !* 0.2 Preliminary computation !* GAS-TO-PARTICLE CONVERSION (SO2 -> SO4) !* (SO2 -> SO4) IF(.NOT. LAERCHEM) THEN - do JGAS=1,2 - IF (TRIM(YAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))%CNAME)=='SO2') THEN - ISSO2=ind_oifs_ham%ind_gas_OIFS(JGAS) - ELSE IF (TRIM(YAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))%CNAME)=='SO4_gas')THEN - ISSO4=ind_oifs_ham%ind_gas_OIFS(JGAS) - ELSE - CALL ABOR1('ABORT: IN AER_PHY3_layer, SO2 not defined. Wrong table in use') - END IF - end do + DO JGAS=1,2 + IF (TRIM(YAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))%CNAME)=='SO2') THEN + ISSO2=ind_oifs_ham%ind_gas_OIFS(JGAS) + ELSE IF (TRIM(YAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))%CNAME)=='SO4_gas')THEN + ISSO4=ind_oifs_ham%ind_gas_OIFS(JGAS) + ELSE + CALL ABOR1('ABORT: IN AER_PHY3_layer, SO2 not defined. Wrong table in use') + END IF + END DO + DO JAER=1,NACTAERO - IF (TRIM(YAERO(JAER)%CNAME)=='SO4_AS') THEN - ISSO4_ACS=JAER - EXIT - END IF + IF (TRIM(YAERO(JAER)%CNAME)=='SO4_AS') THEN + ISSO4_ACS=JAER + EXIT + END IF END DO - DO JK=1,KLEV - DO JL=KIDIA,KFDIA - !!!ZDP(JL,JK)= PAUX%PRS1(JL,JK) - PAUX%PRS1(JL,JK-1) - ZTSO2(JL,JK)=PTENC(JL,JK,ISSO2) - ZTSO4(JL,JK, 1)=PTENC(JL,JK,ISSO4) - ZTSO4_AQ(JL,JK)=0.0_JPRB - ZSO2(JL,JK)=PAEROP(JL,JK,ISSO2) - ZITSO2(JL,JK)=PTENC(JL,JK,ISSO2) - END DO - END DO - - !CALL AER_SO2SO4_V2 ( & - ! KIDIA, KFDIA, KLON, KLEV, & -! ! TSPHY, STATE%T, PAUX%PRSF1 , PRAD%PNEB, PRAD%PQLI, PAUX%PGELAM,& - ! ! take the liquidwater and cloud fraction from state variables i - ! ! instead of radiation data structures, in 43r3 PRAD% are zero - ! ! between radiation time steps - ! TSPHY, STATE%T, PAUX%PRSF1 , STATE%A, STATE%CLD(:,:,NCLDQL), PAUX%PGELAM,& - ! ZSO2, ZITSO2, PGFL(:,:,YAERCLIM(1)%MP),& - ! PGFL(:,:,YAERCLIM(2)%MP), PGFL(:,:,YAERCLIM(3)%MP) ,& - ! ZTSO2 , ZTSO4, ZTSO4_AQ, ZFSO2, ZFSO4, ZFSO4_AQ, ZDP ) - - CALL AER_SO2SO4_V2 ( YDRIP, & - & KIDIA , KFDIA , KLON , KLEV , & - & PTSPHY, PTP , PRSF1 , PAP , PLP , PGELAT, PGELAM, & - & ZSO2 , ZITSO2, PGFL(:,:,YGFL%YAEROCLIM(1)%MP), & - & PGFL(:,:,YGFL%YAEROCLIM(2)%MP), PGFL(:,:,YGFL%YAEROCLIM(3)%MP) ,& - & ZTSO2 , ZTSO4(:,:,1), ZTSO4_AQ, ZFSO2, ZFSO4, ZFSO4_AQ, ZDP) + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + !!!ZDP(JL,JK)= PAUX%PRS1(JL,JK) - PAUX%PRS1(JL,JK-1) + ZTSO2(JL,JK) = PTENC(JL,JK,ISSO2) + ZTSO4(JL,JK, 1) = PTENC(JL,JK,ISSO4) + ZTSO4_AQ(JL,JK) = 0.0_JPRB + ZSO2(JL,JK) = PAEROP(JL,JK,ISSO2) + ZITSO2(JL,JK) = PTENC(JL,JK,ISSO2) + END DO + END DO + !CALL AER_SO2SO4_V2 ( & + ! KIDIA, KFDIA, KLON, KLEV, & + ! ! TSPHY, STATE%T, PAUX%PRSF1 , PRAD%PNEB, PRAD%PQLI, PAUX%PGELAM,& + ! ! take the liquidwater and cloud fraction from state variables i + ! ! instead of radiation data structures, in 43r3 PRAD% are zero + ! ! between radiation time steps + ! TSPHY, STATE%T, PAUX%PRSF1 , STATE%A, STATE%CLD(:,:,NCLDQL), PAUX%PGELAM,& + ! ZSO2, ZITSO2, PGFL(:,:,YAERCLIM(1)%MP),& + ! PGFL(:,:,YAERCLIM(2)%MP), PGFL(:,:,YAERCLIM(3)%MP) ,& + ! ZTSO2 , ZTSO4, ZTSO4_AQ, ZFSO2, ZFSO4, ZFSO4_AQ, ZDP ) + + CALL AER_SO2SO4_V2( YDRIP, & + & KIDIA , KFDIA , KLON , KLEV , & + & PTSPHY, PTP , PRSF1 , PAP , PLP , PGELAT, PGELAM, & + & ZSO2 , ZITSO2, & + & PGFL(:,:, YGFL%YAEROCLIM(1)%MP), & + & PGFL(:,:,YGFL%YAEROCLIM(2)%MP), & + & PGFL(:,:,YGFL%YAEROCLIM(3)%MP) , & + & ZTSO2 , ZTSO4(:,:,1), ZTSO4_AQ, ZFSO2, ZFSO4, ZFSO4_AQ, ZDP) - DO JK=1,KLEV - DO JL=KIDIA,KFDIA - ! ZTSO2 - PTENC(JL,JK,ISSO2)=PTENC(JL,JK,ISSO2)+ZTSO2(JL,JK) - ! ZTSO4 - PTENC(JL,JK,ISSO4)=PTENC(JL,JK,ISSO4)+ZTSO4(JL,JK,1) - ! SO4 formed in clouds is applied to Accumulati - !write(7700,*)ISSO4_ACS,shape(GEMSL%ZTENC(JL,JK,:)) - PTENC(JL,JK,ISSO4_ACS)=PTENC(JL,JK,ISSO4_ACS)+ZTSO4_AQ(JL,JK) - !This is done insed aer_phy3.F90: - ! ELSE IF(AERO_SCHEME == "aer") THEN - ! GEMSL%ZTENC(JL,JK,ISSO4)=GEMSL%ZTENC(JL,JK,ISSO4)+ZTSO4(JL,JK) - - END DO - END DO + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ! ZTSO2 + PTENC(JL,JK,ISSO2)=PTENC(JL,JK,ISSO2)+ZTSO2(JL,JK) + ! ZTSO4 + PTENC(JL,JK,ISSO4)=PTENC(JL,JK,ISSO4)+ZTSO4(JL,JK,1) + ! SO4 formed in clouds is applied to Accumulati + !write(7700,*)ISSO4_ACS,shape(GEMSL%ZTENC(JL,JK,:)) + PTENC(JL,JK,ISSO4_ACS)=PTENC(JL,JK,ISSO4_ACS)+ZTSO4_AQ(JL,JK) + !This is done insed aer_phy3.F90: + ! ELSE IF(AERO_SCHEME == "aer") THEN + ! GEMSL%ZTENC(JL,JK,ISSO4)=GEMSL%ZTENC(JL,JK,ISSO4)+ZTSO4(JL,JK) + + END DO + END DO ENDIF !end of * (SO2 -> SO4) - - - -WRITE(NULOUT,*) '[HAMM7_INTERFACE]' - !* 1.1 COMPUTE RELATIVE HUMIDITY WITHOUT VERTICAL SMOOTING ! --------------------------------------------------- ! Q at saturation for RH calculation @@ -841,21 +847,19 @@ SUBROUTINE HAMM7_INTERFACE( & ENDDO ZSO4G(KIDIA:KFDIA,1:KLEV)=ZCEN(KIDIA:KFDIA,1:KLEV,ISSO4_C) ELSE - ZSO4G(KIDIA:KFDIA,1:KLEV)=0._JPRB + ZSO4G(KIDIA:KFDIA,1:KLEV)=0._JPRB ENDIF -! change kg kg-1 to molec cm-3 - -if (LAERCHEM) then +! Convert from kg kg-1 to molec cm-3 +IF (LAERCHEM) THEN ZELVOC(KIDIA:KFDIA,1:KLEV)=ZCEN(KIDIA:KFDIA,1:KLEV,KAERO(ielvoc)) ZSVOC(KIDIA:KFDIA,1:KLEV)=ZCEN(KIDIA:KFDIA,1:KLEV,KAERO(iisvoc)) - -else +ELSE ZELVOC(KIDIA:KFDIA,1:KLEV)=0.0_JPRB ZSVOC(KIDIA:KFDIA,1:KLEV)=0.0_JPRB -end if +END IF !calculate ICNC ZICNC(:,:) = 0._JPRB @@ -868,100 +872,103 @@ SUBROUTINE HAMM7_INTERFACE( & !number DO JCLASS=1,nclass - DO JK=1,KLEV - DO JL=KIDIA,KFDIA - ZXTM1(JL,JK,ind_oifs_ham%ind_class_HAM(JCLASS)) = ZCEN(JL,JK,KAERO(ind_oifs_ham%ind_class_OIFS(JCLASS))) - ZXTTE(JL,JK,ind_oifs_ham%ind_class_HAM(JCLASS)) = PTENC(JL,JK,KAERO(ind_oifs_ham%ind_class_OIFS(JCLASS))) - END DO - END DO + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZXTM1(JL,JK,ind_oifs_ham%ind_class_HAM(JCLASS)) = ZCEN(JL,JK,KAERO(ind_oifs_ham%ind_class_OIFS(JCLASS))) + ZXTTE(JL,JK,ind_oifs_ham%ind_class_HAM(JCLASS)) = PTENC(JL,JK,KAERO(ind_oifs_ham%ind_class_OIFS(JCLASS))) + END DO + END DO END DO !mass DO JMASS=1,naerocomp - DO JK=1,KLEV - DO JL=KIDIA,KFDIA - ZXTM1(JL,JK,ind_oifs_ham%ind_mass_HAM(JMASS)) = ZCEN(JL,JK,KAERO(ind_oifs_ham%ind_mass_OIFS(JMASS))) - - ZXTTE(JL,JK,ind_oifs_ham%ind_mass_HAM(JMASS)) = PTENC(JL,JK,KAERO(ind_oifs_ham%ind_mass_OIFS(JMASS))) - ! in case of simple sulfur scheme add SO4_AQ part into SO4_ACS - ! both original tendency and m7tendency - - END DO - END DO + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZXTM1(JL,JK,ind_oifs_ham%ind_mass_HAM(JMASS)) = ZCEN(JL,JK,KAERO(ind_oifs_ham%ind_mass_OIFS(JMASS))) + ZXTTE(JL,JK,ind_oifs_ham%ind_mass_HAM(JMASS)) = PTENC(JL,JK,KAERO(ind_oifs_ham%ind_mass_OIFS(JMASS))) + ! in case of simple sulfur scheme add SO4_AQ part into SO4_ACS + ! both original tendency and m7tendency + + END DO + END DO END DO !gas DO JGAS=1,subm_ngasspec - DO JK=1,KLEV - DO JL=KIDIA,KFDIA - if (LAERCHEM) then -!<<<<<<< HEAD - ZXTM1(JL,JK,ind_oifs_ham%ind_gas_HAM(JGAS)) = ZCEN(JL,JK,KCHEM(ind_oifs_ham%ind_gas_OIFS(JGAS))) - ZXTTE(JL,JK,ind_oifs_ham%ind_gas_HAM(JGAS)) = PTENC(JL,JK,KCHEM(ind_oifs_ham%ind_gas_OIFS(JGAS))) -!======= - !ZXTM1(JL,JK,ind_gas_HAM(JGAS)) = ZCEN(JL,JK,KCHEM(ind_gas_OIFS(JGAS))) - !ZXTTE(JL,JK,ind_gas_HAM(JGAS)) = PTENC(JL,JK,KCHEM(ind_gas_OIFS(JGAS))) - !ADD SO4 from wet chemistry to tendencies - if (ind_oifs_ham%ind_gas_OIFS(JGAS) == ISO4ACS )THEN - ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_gas_OIFS(JGAS))=ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_gas_OIFS(JGAS))+PCHEM2AER(KIDIA:KFDIA,1:KLEV,2) - elseif( ind_oifs_ham%ind_gas_OIFS(JGAS) == ISO4COS)then - ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_gas_OIFS(JGAS))=ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_gas_OIFS(JGAS))+PCHEM2AER(KIDIA:KFDIA,1:KLEV,3) - end if -!>>>>>>> origin/feature/fmi-hamm7-bugfixes - ELSE !simple sulfur scheme - IF(TRIM(YAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))%CNAME)=='SO2')THEN - ZXTM1(JL,JK,ind_oifs_ham%ind_gas_HAM(JGAS)) = ZCEN(JL,JK,KAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))) - ! - ZXTTE(JL,JK,ind_oifs_ham%ind_gas_HAM(JGAS)) = PTENC(JL,JK,KAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))) - ZXTTEM1(JL,JK,ind_oifs_ham%ind_gas_HAM(JGAS)) = PTENC(JL,JK,KAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))) - - ELSE IF (TRIM(YAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))%CNAME)=='SO4_gas')THEN - ZXTM1(JL,JK,ind_oifs_ham%ind_gas_HAM(JGAS)) = ZCEN(JL,JK,KAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))) - ZXTTE(JL,JK,ind_oifs_ham%ind_gas_HAM(JGAS)) = PTENC(JL,JK,KAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))) - ZXTTEM1(JL,JK,ind_oifs_ham%ind_gas_HAM(JGAS)) = PTENC(JL,JK,KAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))) - END IF + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + IF (LAERCHEM) THEN + ZXTM1(JL,JK,ind_oifs_ham%ind_gas_HAM(JGAS)) = ZCEN(JL,JK,KCHEM(ind_oifs_ham%ind_gas_OIFS(JGAS))) + ZXTTE(JL,JK,ind_oifs_ham%ind_gas_HAM(JGAS)) = PTENC(JL,JK,KCHEM(ind_oifs_ham%ind_gas_OIFS(JGAS))) + !ADD SO4 from wet chemistry to tendencies + IF (ind_oifs_ham%ind_gas_OIFS(JGAS) == ISO4ACS )THEN + ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_gas_OIFS(JGAS))=ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_gas_OIFS(JGAS))+PCHEM2AER(KIDIA:KFDIA,1:KLEV,2) + ELSEIF( ind_oifs_ham%ind_gas_OIFS(JGAS) == ISO4COS)THEN + ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_gas_OIFS(JGAS))=ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_gas_OIFS(JGAS))+PCHEM2AER(KIDIA:KFDIA,1:KLEV,3) + END IF + ELSE !simple sulfur scheme + IF(TRIM(YAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))%CNAME)=='SO2')THEN + ZXTM1(JL,JK,ind_oifs_ham%ind_gas_HAM(JGAS)) = ZCEN(JL,JK,KAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))) + ZXTTE(JL,JK,ind_oifs_ham%ind_gas_HAM(JGAS)) = PTENC(JL,JK,KAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))) + ZXTTEM1(JL,JK,ind_oifs_ham%ind_gas_HAM(JGAS)) = PTENC(JL,JK,KAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))) + + ELSE IF (TRIM(YAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))%CNAME)=='SO4_gas')THEN + ZXTM1(JL,JK,ind_oifs_ham%ind_gas_HAM(JGAS)) = ZCEN(JL,JK,KAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))) + ZXTTE(JL,JK,ind_oifs_ham%ind_gas_HAM(JGAS)) = PTENC(JL,JK,KAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))) + ZXTTEM1(JL,JK,ind_oifs_ham%ind_gas_HAM(JGAS)) = PTENC(JL,JK,KAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))) + END IF - END if - END DO - END DO + END IF + END DO + END DO END DO + + +! RCHG -> This will produce segmentation fault if CDNC are not in the namelist +! we need to test these things and do a CALL ABORT1() +! for these cases. For this we need to find the best flags or combinations +! of flags. FIXME + !cloud DO JCLOUD=1,2 !CDNC and ICNC - DO JK=1,KLEV - DO JL=KIDIA,KFDIA - ZXTM1(JL,JK,ind_oifs_ham%ind_cloud_HAM(JCLOUD)) = ZCEN(JL,JK,KAERO(ind_oifs_ham%ind_cloud_OIFS(JCLOUD))) - ZXTTE(JL,JK,ind_oifs_ham%ind_cloud_HAM(JCLOUD)) = PTENC(JL,JK,KAERO(ind_oifs_ham%ind_cloud_OIFS(JCLOUD))) - END DO - END DO + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZXTM1(JL,JK,ind_oifs_ham%ind_cloud_HAM(JCLOUD)) = ZCEN(JL,JK,KAERO(ind_oifs_ham%ind_cloud_OIFS(JCLOUD))) + ZXTTE(JL,JK,ind_oifs_ham%ind_cloud_HAM(JCLOUD)) = PTENC(JL,JK,KAERO(ind_oifs_ham%ind_cloud_OIFS(JCLOUD))) + END DO + END DO END DO + ! implementation of HAM-M7 ZWND(:) = 0._JPRB DO JL=KIDIA,KFDIA - ZWND(JL)=MAX(1.0E-10_JPRB,PAERWS(JL)) ! make threshold for wind speed - ! Compute average fluxes over tiles - DO JTILE=1,KTILES - ZAHFSM(JL)=ZAHFSM(JL)+PFRTI(JL,JTILE)*PAHFSTI(JL,JTILE) - ENDDO + ZWND(JL)=MAX(1.0E-10_JPRB,PAERWS(JL)) ! make threshold for wind speed + ! Compute average fluxes over tiles + DO JTILE=1,KTILES + ZAHFSM(JL)=ZAHFSM(JL)+PFRTI(JL,JTILE)*PAHFSTI(JL,JTILE) + ENDDO ENDDO -! --> calling the correct microphysics scheme depending on setup - + +! --> calling the correct microphysics scheme + SELECT CASE (TRIM(AERO_SCHEME)) CASE ("tm5m7") - - !alaak: commented out because model crashes - !kg(air)-1 to cm-3 - !!$ - !do JK =1,KLEV - ! do JL =KIDIA,KFDIA - ! ZAIRDM(JL) = (7.24291E16_JPRB*PRSF1(JL,JK)/PTP(JL,JK)) * RMD - ! !end do - ! DO JMOD=1,NMOD - ! ZAERNL(JL,JK,JMOD)=MAX(PAEROP(JL,JK,MODE_START(JMOD))/ZAIRDM(JL),0.0_JPRB) - ! END DO - ! - ! end do - !end do - + ! ** OBSOLETE ** (PLS) + + !alaak: commented out because model crashes + !kg(air)-1 to cm-3 +!!$ + !do JK =1,KLEV + ! do JL =KIDIA,KFDIA + ! ZAIRDM(JL) = (7.24291E16_JPRB*PRSF1(JL,JK)/PTP(JL,JK)) * RMD + ! !end do + ! DO JMOD=1,NMOD + ! ZAERNL(JL,JK,JMOD)=MAX(PAEROP(JL,JK,MODE_START(JMOD))/ZAIRDM(JL),0.0_JPRB) + ! END DO + ! + ! end do + !end do + !!$ DO JMOD=1,NMOD !!$ DO JAERCLASS=1,NAERMOD !!$ IF (MODE_TRACERS_BY_MODS(JAERCLASS,JMOD)>0) THEN @@ -978,226 +985,214 @@ SUBROUTINE HAMM7_INTERFACE( & !!$ PTSPHY) CASE("hamm7") - - ! Initializations for submodel interface - ZGRVOL(KIDIA:KFDIA,1:KLEV) = 1.79e12_JPRB ! ZGRVOL is only used for diagnostics (only when HAMMOZ is on) - ZPBL = 1 ! boundary layer top = 1 (ITOP=1) - ! Allocate variables for aerosol processes - ALLOCATE(ZW(KLON,KLEV,nw)) - ALLOCATE(ZWPDF(KLON,KLEV,nw)) - !IF (.NOT. ALLOCATED(w_large)) ALLOCATE(w_large(KLON,KLEV,ZKROW)) - !IF (.NOT. ALLOCATED(w_turb)) ALLOCATE(w_turb(KLON,KLEV,ZKROW)) - ALLOCATE(ZRC(KLON,KLEV,nclass,nw)) - ALLOCATE(ZSMAX(KLON,KLEV,nw)) - !IF (.NOT. ALLOCATED(reffi)) ALLOCATE(reffi(KLON,KLEV,ZKROW)) - !IF (.NOT. ALLOCATED(reffl)) ALLOCATE(reffl(KLON,KLEV,ZKROW)) - DO IMODE=1,NMOD - ALLOCATE(RW_MODE (IMODE)%d2(KLON,KLEV)) - ALLOCATE(DENS_MODE(IMODE)%d2(KLON,KLEV)) - ENDDO - DO IMODE=1,NMOD - IF (sizeclass(IMODE)%lsoluble) THEN - ALLOCATE(RWD_MODE(IMODE)%d2(KLON,KLEV)) - ALLOCATE(H2O_MODE(IMODE)%d2(KLON,KLEV)) - END IF - ENDDO - ! End allocate variables for aerosol processes - - - !----------------------------------------------------------------- - ! Submodel interface call (HAM aerosol microphysics) - - ! changes to particles: - ! Update SO4ACS and SO4OCS tendencies to include the contribution from wet chemistry - IF (LAERCHEM) THEN - ZTAEROK(KIDIA:KFDIA,1:KLEV,ISO4ACS)=ZTAEROK(KIDIA:KFDIA,1:KLEV,ISO4ACS)+PCHEM2AER(KIDIA:KFDIA,1:KLEV,2) - ZTAEROK(KIDIA:KFDIA,1:KLEV,ISO4COS)=ZTAEROK(KIDIA:KFDIA,1:KLEV,ISO4COS)+PCHEM2AER(KIDIA:KFDIA,1:KLEV,3) - END IF - CALL GSTATS(2501,0) - - CALL HAM_SUBM_INTERFACE(KFDIA, KLON, KLEV, ZKROW, & !dimension indices - ntrac, PRSF1, PRS1, & !number of tracers, pressure full levels, pressure half levels - PTP, ZQP, ZQSAT, & !temperature, specific humidity, saturation spec. hum. - ZXTM1, ZXTTE, & !tracer mass/number mr, tracer tendencies - ZM6RP, ZM6DRY, ZRHOP, ZWW, & !mean mode actual radius [m], dry radius for soluble modes [m], mean mode particle density [kg m-3], aerosol water content for each mode [kg(water)-3(air)] - ZAP, ZGRVOL, & !cloud fraction, grid box volume (only for diagnostics) - ZPBL, zout3) !boundary layer top level, outputs - -!!!REAL(KIND=JPRB) :: zm6rp(kbdim,klev,nclass), & ! mean mode actual radius (wet for soluble and dry for insoluble modes) [cm] -!!! zm6dry(kbdim,klev,nsol), & ! dry radius for soluble modes [cm] -!!! zrhop(kbdim,klev,nclass), & ! mean mode particle density [g cm-3] -!!! zww(kbdim,klev,nclass) & ! aerosol water content for each mode [kg(water) m-3(air)] - CALL GSTATS(2501,1) - - ! updating wet and dry radii, aerosol density and water content - DO IMODE=1,NMOD - RW_MODE(IMODE)%d2(KIDIA:KFDIA,1:KLEV)=ZM6RP(KIDIA:KFDIA,1:KLEV,IMODE) ! m ( , KLEV, NMOD) - DENS_MODE(IMODE)%d2(KIDIA:KFDIA,1:KLEV)=ZRHOP(KIDIA:KFDIA,1:KLEV,IMODE) ! kg/m3 - ENDDO - DO IMODE=1,NMOD - IF (sizeclass(IMODE)%lsoluble) THEN - RWD_MODE(IMODE)%d2(KIDIA:KFDIA,1:KLEV) = ZM6DRY(KIDIA:KFDIA,1:KLEV,IMODE) ! m - H2O_MODE(IMODE)%d2(KIDIA:KFDIA,1:KLEV) = ZWW(KIDIA:KFDIA,1:KLEV,IMODE) ! ? - END IF - ENDDO - !----------------------------------------------------------------- - - !----------------------------------------------------------------- - CALL GSTATS(2502,0) - - !---calculate updraft velocity - ZTKEM1(KIDIA:KFDIA,1:KLEV) = 0._JPRB ! turbulent kinetic energy as zero for now as it is not used (YET!) - ZWCAPE(KIDIA:KFDIA) = 0._JPRB ! CAPE as zero as it is not used + ! Initializations for submodel interface + ZGRVOL(KIDIA:KFDIA,1:KLEV) = 1.79e12_JPRB ! ZGRVOL is only used for diagnostics (only when HAMMOZ is on) + ZPBL = 1 ! boundary layer top = 1 (ITOP=1) + ! Allocate variables for aerosol processes + ALLOCATE(ZW(KLON,KLEV,nw)) + ALLOCATE(ZWPDF(KLON,KLEV,nw)) + !IF (.NOT. ALLOCATED(w_large)) ALLOCATE(w_large(KLON,KLEV,ZKROW)) + !IF (.NOT. ALLOCATED(w_turb)) ALLOCATE(w_turb(KLON,KLEV,ZKROW)) + ALLOCATE(ZRC(KLON,KLEV,nclass,nw)) + ALLOCATE(ZSMAX(KLON,KLEV,nw)) + !IF (.NOT. ALLOCATED(reffi)) ALLOCATE(reffi(KLON,KLEV,ZKROW)) + !IF (.NOT. ALLOCATED(reffl)) ALLOCATE(reffl(KLON,KLEV,ZKROW)) + DO IMODE=1,NMOD + ALLOCATE(RW_MODE (IMODE)%d2(KLON,KLEV)) + ALLOCATE(DENS_MODE(IMODE)%d2(KLON,KLEV)) + IF (sizeclass(IMODE)%lsoluble) THEN + ALLOCATE(RWD_MODE(IMODE)%d2(KLON,KLEV)) + ALLOCATE(H2O_MODE(IMODE)%d2(KLON,KLEV)) + END IF + ENDDO + ! End allocate variables for aerosol processes + + !----------------------------------------------------------------- + ! Submodel interface call (HAM aerosol microphysics) + + ! changes to particles: + ! Update SO4ACS and SO4OCS tendencies to include the contribution from wet chemistry + IF (LAERCHEM) THEN + ZTAEROK(KIDIA:KFDIA,1:KLEV,ISO4ACS)=ZTAEROK(KIDIA:KFDIA,1:KLEV,ISO4ACS)+PCHEM2AER(KIDIA:KFDIA,1:KLEV,2) + ZTAEROK(KIDIA:KFDIA,1:KLEV,ISO4COS)=ZTAEROK(KIDIA:KFDIA,1:KLEV,ISO4COS)+PCHEM2AER(KIDIA:KFDIA,1:KLEV,3) + END IF + + CALL GSTATS(2501,0) + + CALL HAM_SUBM_INTERFACE(& + & KFDIA, KLON, KLEV, ZKROW, & !dimension indices + & ntrac, PRSF1, PRS1, & !number of tracers, pressure full levels, pressure half levels + & PTP, ZQP, ZQSAT, & !temperature, specific humidity, saturation spec. hum. + & ZXTM1, ZXTTE, & !tracer mass/number mr, tracer tendencies + & ZM6RP, ZM6DRY, & !mean mode actual radius [m], dry radius for soluble modes [m] + & ZRHOP, ZWW, & !mean mode particle density [kg m-3], aerosol water content for each mode [kg(water)-3(air)] + & ZAP, ZGRVOL, & !cloud fraction, grid box volume (only for diagnostics) + & ZPBL, zout3) !boundary layer top level, outputs + + CALL GSTATS(2501,1) - CALL activ_updraft(KFDIA, KLON, KLEV, ZKROW, & ! krow = 1 - ZTKEM1, ZWCAPE, PVERVEL, ZRHO, & ! turbulent kinetic energy, CAPE contr. to conv. vert. veloc. [m s-1], large scale vert. veloc. - ZW, ZWPDF) + ! updating wet and dry radii, aerosol density and water content + DO IMODE=1,NMOD + RW_MODE(IMODE)%d2(KIDIA:KFDIA,1:KLEV)=ZM6RP(KIDIA:KFDIA,1:KLEV,IMODE) ! m ( , KLEV, NMOD) + DENS_MODE(IMODE)%d2(KIDIA:KFDIA,1:KLEV)=ZRHOP(KIDIA:KFDIA,1:KLEV,IMODE) ! kg/m3 + ENDDO + DO IMODE=1,NMOD + IF (sizeclass(IMODE)%lsoluble) THEN + RWD_MODE(IMODE)%d2(KIDIA:KFDIA,1:KLEV) = ZM6DRY(KIDIA:KFDIA,1:KLEV,IMODE) ! m + H2O_MODE(IMODE)%d2(KIDIA:KFDIA,1:KLEV) = ZWW(KIDIA:KFDIA,1:KLEV,IMODE) ! ? + END IF + ENDDO + !----------------------------------------------------------------- - IF (ncd_activ == 2 .OR. nccndiag > 0) THEN - CALL ham_activ_koehler_ab(KFDIA, KLON, KLEV, ZKROW, KTDIA, & ! krow=1 ktdia=1 - ZXTM1, PTP, ZA, ZB) - END IF + CALL GSTATS(2502,0) - DO JCLASS = 1,nclass! nclass=7 - IF (sizeclass(jclass)%lsoluble) THEN + !---calculate updraft velocity + ZTKEM1(KIDIA:KFDIA,1:KLEV) = 0._JPRB ! turbulent kinetic energy as zero for now as it is not used (YET!) + ZWCAPE(KIDIA:KFDIA) = 0._JPRB ! CAPE as zero as it is not used - !ZRDRY(KIDIA:KFDIA,1:KLEV,JCLASS) = rdry_m7(KIDIA:KFDIA,1:KLEV,JCLASS) !eehol: for soluble modes rdry from rdry_m7 - ZRDRY(KIDIA:KFDIA,1:KLEV,JCLASS) = ZM6DRY(KIDIA:KFDIA,1:KLEV,JCLASS) !eehol: for soluble modes rdry from rdry_m7 - ELSE - !ZRDRY(KIDIA:KFDIA,1:KLEV,JCLASS) = rwet_m7(KIDIA:KFDIA,1:KLEV,JCLASS) !eehol: for insoluble modes rdry from rwet_m7 - ZRDRY(KIDIA:KFDIA,1:KLEV,JCLASS) = ZM6RP(KIDIA:KFDIA,1:KLEV,JCLASS) !eehol: for insoluble modes rdry from rwet_m7 - END IF - END DO + CALL activ_updraft(KFDIA, KLON, KLEV, ZKROW, & ! krow = 1 + ZTKEM1, ZWCAPE, PVERVEL, ZRHO, & ! turbulent kinetic energy, CAPE contr. to conv. vert. veloc. [m s-1], large scale vert. veloc. + ZW, ZWPDF) - !calculate saturation water vapor pressure from saturation specific humidity - DO JK=1,KLEV - DO JL=KIDIA,KFDIA - ZESW(JL,JK)=(ZQSAT(JL,JK)*PRSF1(JL,JK))/(0.62198_JPRB) - ENDDO - ENDDO + IF (ncd_activ == 2 .OR. nccndiag > 0) THEN + CALL ham_activ_koehler_ab(KFDIA, KLON, KLEV, ZKROW, KTDIA, & ! krow=1 ktdia=1 + ZXTM1, PTP, ZA, ZB) + END IF - CALL ham_activ_abdulrazzak_ghan(KFDIA, KLON, KLEV, ZKROW, KTDIA, & ! in original 1 = ktdia... for diagnostics so krow=1 and ktdia=1 - ZCDNCACT, ZESW, ZRHO, & ! number of activated particles, saturation vapor pressure, air density - ZXTM1, PTP, PRSF1, ZQP, & ! tracer mix rat, temperature, air pressure, spec. humid. - ZW, ZWPDF, ZA, ZB, ZRDRY, & ! mean udr veloc, pdf of udr. veloc, Koehler A, Koehler B, dry radius - ZNACT, ZFRACN, ZSC, ZRC, ZSMAX) ! num. act. part., frac ", crit. ssat., crit. radius, max ssat - CALL GSTATS(2502,1) + DO JCLASS = 1,nclass! nclass=7 + IF (sizeclass(jclass)%lsoluble) THEN + ZRDRY(KIDIA:KFDIA,1:KLEV,JCLASS) = ZM6DRY(KIDIA:KFDIA,1:KLEV,JCLASS) !soluble modes rdry from rdry_m7 + ELSE + ZRDRY(KIDIA:KFDIA,1:KLEV,JCLASS) = ZM6RP(KIDIA:KFDIA,1:KLEV,JCLASS) !insoluble modes rdry from rwet_m7 + END IF + END DO - !<-- End activation for HAM-M7 - !----------------------------------------------------------------- + !calculate saturation water vapor pressure from saturation specific humidity + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZESW(JL,JK)=(ZQSAT(JL,JK)*PRSF1(JL,JK))/(0.62198_JPRB) + ENDDO + ENDDO + CALL HAM_ACTIV_ABDULRAZZAK_GHAN( KFDIA, KLON, KLEV, ZKROW, KTDIA, & ! in original 1 = ktdia... for diagnostics so krow=1 and ktdia=1 + & ZCDNCACT, ZESW, ZRHO, & ! number of activated particles, saturation vapor pressure, air density + & ZXTM1, PTP, PRSF1, ZQP, & ! tracer mix rat, temperature, air pressure, spec. humid. + & ZW, ZWPDF, ZA, ZB, ZRDRY, & ! mean udr veloc, pdf of udr. veloc, Koehler A, Koehler B, dry radius + & ZNACT, ZFRACN, ZSC, ZRC, ZSMAX) ! num. act. part., frac ", crit. ssat., crit. radius, max ssat + CALL GSTATS(2502,1) + + !<-- End activation for HAM-M7 + !----------------------------------------------------------------- + + + !<-- Store CDNC (number of activated particles) and ICNC as a number mixing ratio to tracer values and to PGFL fields + ZXTM1(KIDIA:KFDIA,1:KLEV,idt_cdnc) = ZCDNCACT(KIDIA:KFDIA,1:KLEV)/ZRHO(KIDIA:KFDIA,1:KLEV) ! [#/kg] + ZXTM1(KIDIA:KFDIA,1:KLEV,idt_icnc) = (1.0E6_JPRB)*ZICNC(KIDIA:KFDIA,1:KLEV)/ZRHO(KIDIA:KFDIA,1:KLEV) !ice crystal number conc = #/cm3 --> number mix rat [#/kg] + PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH) = (1.0E-6_JPRB)*ZCDNCACT(KIDIA:KFDIA,1:KLEV) ! add CDNC to PGFL field (convert from #/m3 to #/cm3) + PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH) = ZICNC(KIDIA:KFDIA,1:KLEV) ! add ICNC to PGFL field (does not need convert) + !--> End store CDNC and ICNC - !<-- Store CDNC (number of activated particles) and ICNC as a number mixing ratio to tracer values and to PGFL fields - ZXTM1(KIDIA:KFDIA,1:KLEV,idt_cdnc) = ZCDNCACT(KIDIA:KFDIA,1:KLEV)/ZRHO(KIDIA:KFDIA,1:KLEV) ! [#/kg] - ZXTM1(KIDIA:KFDIA,1:KLEV,idt_icnc) = (1.0E6_JPRB)*ZICNC(KIDIA:KFDIA,1:KLEV)/ZRHO(KIDIA:KFDIA,1:KLEV) !ice crystal number conc = #/cm3 --> number mix rat [#/kg] - PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH) = (1.0E-6_JPRB)*ZCDNCACT(KIDIA:KFDIA,1:KLEV) ! add CDNC to PGFL field (convert from #/m3 to #/cm3) - PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH) = ZICNC(KIDIA:KFDIA,1:KLEV) ! add ICNC to PGFL field (does not need convert) - !--> End store CDNC and ICNC + !----------------------------------------------------------------- + !--> Calculation for effective radii and put to PGFL fields - !----------------------------------------------------------------- - !--> Calculation for effective radii and put to PGFL fields + ! put default values for effective radii + reffl(KIDIA:KFDIA,1:KLEV,ZKROW) = 4._JPRB ! comes from liquid effective radius routine (PP_MIN_RE_UM) + reffi(KIDIA:KFDIA,1:KLEV,ZKROW) = 80._JPRB*0.64952_JPRB ! comes from ice effective radius routine (ZDEFAULT_RE_UM) - ! put default values for effective radii - reffl(KIDIA:KFDIA,1:KLEV,ZKROW) = 4._JPRB ! comes from liquid effective radius routine (PP_MIN_RE_UM) - reffi(KIDIA:KFDIA,1:KLEV,ZKROW) = 80._JPRB*0.64952_JPRB ! comes from ice effective radius routine (ZDEFAULT_RE_UM) - - ! liquid effective radius - DO JK=1,KLEV - DO JL=KIDIA,KFDIA - ZTMPA = 1.0_JPRB/MAX(ZAP(JL,JK),ZEPSEC) - LLIQCLD(JL,JK) = ( PLP(JL,JK)*ZTMPA ) > ZEPSEC ! logical for liquid cloud - LICECLD(JL,JK) = ( PIP(JL,JK)*ZTMPA ) > ZEPSEC ! logical for ice cloud - ZQLWP(JL,JK) = PLP(JL,JK)/MAX(ZAP(JL,JK),1.E-10_JPRB) ! calculate lwp - ZQLWP(JL,JK) = MIN(MAX(ZQLWP(JL,JK),0.0_JPRB),RCLDMAX) ! treshold lwp - ! effective radius calculated similarly as in radlswr.F90 - ! 2.387e-10 is 3/(4*pi*rho_liq*10^6) [10^6 for N in right units] - ZRE_LIQ(JL,JK) = 1.E+06_JPRB*(2.387e-10_JPRB*ZRHO(JL,JK)*ZQLWP(JL,JK)/(MAX(PGFL(JL,JK,YCDNC%MP9_PH),10._JPRB)))**0.333_JPRB ! calculate effective radius in um (use minimum value for CDNC if CDNC is small) - END DO - END DO - - reffl(KIDIA:KFDIA,1:KLEV,ZKROW) = MERGE(ZRE_LIQ(KIDIA:KFDIA,1:KLEV),4._JPRB,LLIQCLD(KIDIA:KFDIA,1:KLEV)) ! add liq. eff. rad. to HAM variables (only if there is liquid cloud else minimum value) - CALL ICE_EFFECTIVE_RADIUS(YRERAD, YDSPP_CONFIG, KIDIA, KFDIA, KLON, KLEV, & - & PRSF1, PTP, ZAP, PIP, PSP, PGEMU, & ! pressure, temp, cloud fr., IWC, SWC, sine of latitude - & reffi(1:KLON,1:KLEV,ZKROW)) ! ice effective radius (updated to mo_activ variable 'reffi' which used in mo_ham_wetdep) - - reffi(KIDIA:KFDIA,1:KLEV,ZKROW) = MERGE(reffi(KIDIA:KFDIA,1:KLEV,ZKROW),20._JPRB,LICECLD(KIDIA:KFDIA,1:KLEV)) ! only if there is ice cloud else minimum value - - ! add effective radii to PGFL fields - PGFL(KIDIA:KFDIA,1:KLEV,YRE_LIQ%MP9_PH) = 1.0E-06_JPRB * reffl(KIDIA:KFDIA,1:KLEV,ZKROW) ! convert um to meters and save to PGFL fields - PGFL(KIDIA:KFDIA,1:KLEV,YRE_ICE%MP9_PH) = 1.0E-06_JPRB * reffi(KIDIA:KFDIA,1:KLEV,ZKROW) ! convert um to meters and save to PGFL fields - - !<-- End calculation for effective radii - !----------------------------------------------------------------- - - - !--- Mass conserving correction of negative tracer values: - CALL xt_borrow(KFDIA, KLON, KLEV, KLEV+1, ntrac, & - PRSF1, PRS1, & - ZXTM1, ZXTTE) - - - !----------------------------------------------------------------- - !--> Wet deposition for HAM-M7 - CALL GSTATS(2503,0) - - IF ( LAERSCAV ) THEN - - !--> initialize mixing ratios for wet deposition - !-- initialise in-cloud and interstitial mixing ratios - ! set both equal to tracer mixing ratio as starting point - ! ham_wet_chemistry will re-compute these values if lham=true - DO JT = 1,ntrac - - ZXTP1(KIDIA:KFDIA,1:KLEV,JT) = ZXTM1(KIDIA:KFDIA,1:KLEV,JT) + ZXTTE(KIDIA:KFDIA,1:KLEV,JT) * time_step_len - ZXTP1C(KIDIA:KFDIA,1:KLEV,JT) = ZXTP1(KIDIA:KFDIA,1:KLEV,JT) - ZXTP10(KIDIA:KFDIA,1:KLEV,JT) = ZXTP1(KIDIA:KFDIA,1:KLEV,JT) + ! liquid effective radius + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZTMPA = 1.0_JPRB/MAX(ZAP(JL,JK),ZEPSEC) + LLIQCLD(JL,JK) = ( PLP(JL,JK)*ZTMPA ) > ZEPSEC ! logical for liquid cloud + LICECLD(JL,JK) = ( PIP(JL,JK)*ZTMPA ) > ZEPSEC ! logical for ice cloud + ZQLWP(JL,JK) = PLP(JL,JK)/MAX(ZAP(JL,JK),1.E-10_JPRB) ! calculate lwp + ZQLWP(JL,JK) = MIN(MAX(ZQLWP(JL,JK),0.0_JPRB),RCLDMAX) ! treshold lwp + ! effective radius calculated similarly as in radlswr.F90 + ! 2.387e-10 is 3/(4*pi*rho_liq*10^6) [10^6 for N in right units] + ZRE_LIQ(JL,JK) = 1.E+06_JPRB*(2.387e-10_JPRB*ZRHO(JL,JK)*ZQLWP(JL,JK)/(MAX(PGFL(JL,JK,YCDNC%MP9_PH),10._JPRB)))**0.333_JPRB ! calculate effective radius in um (use minimum value for CDNC if CDNC is small) + END DO + END DO + + ! Add liq. eff. rad. to HAM variables (only if there is liquid cloud else minimum value) + REFFL(KIDIA:KFDIA,1:KLEV,ZKROW) = MERGE(ZRE_LIQ(KIDIA:KFDIA,1:KLEV),4._JPRB,LLIQCLD(KIDIA:KFDIA,1:KLEV)) + CALL ICE_EFFECTIVE_RADIUS(YRERAD, YDSPP_CONFIG, KIDIA, KFDIA, KLON, KLEV, & + & PRSF1, PTP, ZAP, PIP, PSP, PGEMU, & ! pressure, temp, cloud fr., IWC, SWC, sine of latitude + & reffi(1:KLON,1:KLEV,ZKROW)) ! ice effective radius (updated to mo_activ variable 'reffi' which used in mo_ham_wetdep) + + ! only if there is ice cloud else minimum value + REFFI(KIDIA:KFDIA,1:KLEV,ZKROW) = MERGE(REFFI(KIDIA:KFDIA,1:KLEV,ZKROW), 20._JPRB, LICECLD(KIDIA:KFDIA,1:KLEV)) + + ! add effective radii to PGFL fields + PGFL(KIDIA:KFDIA,1:KLEV,YRE_LIQ%MP9_PH) = 1.0E-06_JPRB * reffl(KIDIA:KFDIA,1:KLEV,ZKROW) ! convert um to meters and save to PGFL fields + PGFL(KIDIA:KFDIA,1:KLEV,YRE_ICE%MP9_PH) = 1.0E-06_JPRB * reffi(KIDIA:KFDIA,1:KLEV,ZKROW) ! convert um to meters and save to PGFL fields + + !<-- End calculation for effective radii + !----------------------------------------------------------------- + + !--- Mass conserving correction of negative tracer values: + CALL xt_borrow(KFDIA, KLON, KLEV, KLEV+1, ntrac, & + PRSF1, PRS1, & + ZXTM1, ZXTTE) + + !--> Wet deposition for HAM-M7 + CALL GSTATS(2503,0) + + IF ( LAERSCAV ) THEN + + !--> initialize mixing ratios for wet deposition + !-- initialise in-cloud and interstitial mixing ratios + ! set both equal to tracer mixing ratio as starting point + ! ham_wet_chemistry will re-compute these values if lham=true + DO JT = 1,NTRAC + ZXTP1(KIDIA:KFDIA,1:KLEV,JT) = ZXTM1(KIDIA:KFDIA,1:KLEV,JT) + ZXTTE(KIDIA:KFDIA,1:KLEV,JT) * time_step_len + ZXTP1C(KIDIA:KFDIA,1:KLEV,JT) = ZXTP1(KIDIA:KFDIA,1:KLEV,JT) + ZXTP10(KIDIA:KFDIA,1:KLEV,JT) = ZXTP1(KIDIA:KFDIA,1:KLEV,JT) + END DO + !<-- call wetdep interface for wet deposition + !-- interface to wet deposition routine (also from cuflx_subm) + IF ( lwetdep .AND. ANY(trlist%ti(:)%nwetdep > 0) ) THEN + + ! for calculating the rain and snow evaporation/formation variables used in wet deposition + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZFLXR=PFPLCL(JL,JK-1) + ZFLXS=PFPLCN(JL,JK-1) + ZFLXRB=PFPLCL(JL,JK) + ZFLXSB=PFPLCN(JL,JK) + IF (PCOVPTOT(JL,JK) > 1e-40_JPRB) THEN + ZMRATEPR(JL,JK) = ( ZFLXRB-ZFLXR ) / PCOVPTOT(JL,JK) + ZMRATEPS(JL,JK) = ( ZFLXSB-ZFLXS ) / PCOVPTOT(JL,JK) + !same formula negatives/positives for evap or formation + ZFEVAPR(JL,JK) = ( ZFLXRB-ZFLXR ) / PCOVPTOT(JL,JK) + ZFSUBLS(JL,JK) = ( ZFLXSB-ZFLXS ) / PCOVPTOT(JL,JK) + ELSE + ZMRATEPR(JL,JK) = 0.0_JPRB + ZMRATEPS(JL,JK) = 0.0_JPRB + !same formula negatives/positives for evap or formation + ZFEVAPR(JL,JK) = 0.0_JPRB + ZFSUBLS(JL,JK) = 0.0_JPRB + END IF + END DO END DO + ZMSNOWACL(KIDIA:KFDIA,1:KLEV) = ZMRATEPS(KIDIA:KFDIA,1:KLEV) !? + + ZDUMMY(:,:) = 0._JPRB ! initialize dummy variables for conv. case only + ZDUM2D(:,:) = 0._JPRB ! initialize dummy variables for conv. case only + ZDUM3D(:,:,:) = 0._JPRB ! initialize dummy variables for conv. case only + ZLFRAC_SO2(:,:) = 0._JPRB ! zlfrac_so2 only needed in gas scavenging and this is off for now (put this zero) + + ZLP(KIDIA:KFDIA,1:KLEV) = PLP(KIDIA:KFDIA,1:KLEV) ! temporary variable for cloud water content (modified in wetdep) + ZIP(KIDIA:KFDIA,1:KLEV) = PIP(KIDIA:KFDIA,1:KLEV) ! temporary variable for cloud ice water content (modified in wetdep) + ZTENCIH(:,:,:) = 0._JPRB + ZTENCIH(KIDIA:KFDIA,1:KLEV,1:NTRAC)=ZXTTE(KIDIA:KFDIA,1:KLEV,1:NTRAC) + IF (.NOT.LAERCHEM)THEN + CALL HAM_CONV_LFRAQ_SO2(KFDIA,KLON,KLEV,PTP,zxtm1,zrho,ZLP,zlfrac_so2) + END IF - !<-- call wetdep interface for wet deposition - !-- interface to wet deposition routine (also from cuflx_subm) - IF ( lwetdep .AND. ANY(trlist%ti(:)%nwetdep > 0) ) THEN - - ! for calculating the rain and snow evaporation/formation variables used in wet deposition - DO JK=1,KLEV - DO JL=KIDIA,KFDIA - ZFLXR=PFPLCL(JL,JK-1) - ZFLXS=PFPLCN(JL,JK-1) - ZFLXRB=PFPLCL(JL,JK) - ZFLXSB=PFPLCN(JL,JK) - IF (PCOVPTOT(JL,JK) > 1e-40_JPRB) THEN - ZMRATEPR(JL,JK) = ( ZFLXRB-ZFLXR ) / PCOVPTOT(JL,JK) - ZMRATEPS(JL,JK) = ( ZFLXSB-ZFLXS ) / PCOVPTOT(JL,JK) - !same formula negatives/positives for evap or formation - ZFEVAPR(JL,JK) = ( ZFLXRB-ZFLXR ) / PCOVPTOT(JL,JK) - ZFSUBLS(JL,JK) = ( ZFLXSB-ZFLXS ) / PCOVPTOT(JL,JK) - ELSE - ZMRATEPR(JL,JK) = 0.0_JPRB - ZMRATEPS(JL,JK) = 0.0_JPRB - !same formula negatives/positives for evap or formation - ZFEVAPR(JL,JK) = 0.0_JPRB - ZFSUBLS(JL,JK) = 0.0_JPRB - END IF - END DO - END DO - ZMSNOWACL(KIDIA:KFDIA,1:KLEV) = ZMRATEPS(KIDIA:KFDIA,1:KLEV) !? - - ZDUMMY(:,:) = 0._JPRB ! initialize dummy variables for conv. case only - ZDUM2D(:,:) = 0._JPRB ! initialize dummy variables for conv. case only - ZDUM3D(:,:,:) = 0._JPRB ! initialize dummy variables for conv. case only - ZLFRAC_SO2(:,:) = 0._JPRB ! zlfrac_so2 only needed in gas scavenging and this is off for now (put this zero) - - ZLP(KIDIA:KFDIA,1:KLEV) = PLP(KIDIA:KFDIA,1:KLEV) ! temporary variable for cloud water content (modified in wetdep) - ZIP(KIDIA:KFDIA,1:KLEV) = PIP(KIDIA:KFDIA,1:KLEV) ! temporary variable for cloud ice water content (modified in wetdep) - ZTENCIH(:,:,:) = 0._JPRB - ZTENCIH(KIDIA:KFDIA,1:KLEV,1:ntrac)=ZXTTE(KIDIA:KFDIA,1:KLEV,1:ntrac) - IF (.NOT.LAERCHEM)THEN - call ham_conv_lfraq_so2(KFDIA,KLON,KLEV,PTP,zxtm1,zrho,ZLP,zlfrac_so2) - END IF -!<<<<<<< HEAD:src/ifs/phys_ec/tm5m7.F90 - CALL wetdep_interface(KFDIA, KLON, KLEV, 1, ZKROW, LSTRAT, & !eehol: ktop = 1 (top level index), lstrat = TRUE for strat. case + CALL WETDEP_INTERFACE(KFDIA, KLON, KLEV, 1, ZKROW, LSTRAT, & !eehol: ktop = 1 (top level index), lstrat = TRUE for strat. case ZDPG, ZMRATEPR, ZMRATEPS, ZMSNOWACL, & !eehol: dp/g, evap. of rain, subl. of snow, accr. rate of snow with cl. drop in-cl. ZLP, ZIP, & !eehol: cloud water content, cloud ice water content ZM6RP, ZM6DRY, & ! m7 aerosol: to replace rwet_m7, dry radius for soluble modes [cm] @@ -1207,242 +1202,221 @@ SUBROUTINE HAMM7_INTERFACE( & PFPLSL, PFPLSN, ZFEVAPR, ZFSUBLS, & !eehol: rain flux, snow flux, ZDUM2D, ZDUM3D, & !eehol: as zero as these are not needed in strat. case ZAP, PCOVPTOT, ZRHO, ZDUMMY) !eehol: cloud frac., precip. frac., air dens. -! do JK=1,kLEV -! wdepout_2D(KIDIA:KFDIA,:)=wdepout_2D(KIDIA:KFDIA,:)+(ZTENCIH(KIDIA:KFDIA, JK,:)-ZXTTE(KIDIA:KFDIA, JK,:))!/RG*ZDP(KIDIA:KFDIA,JK) -! END do -!======= - -! CALL wetdep_interface(KFDIA, KLON, KLEV, 1, ZKROW, LSTRAT, & ! ktop = 1 (top level index), lstrat = TRUE for strat. case -! ZDPG, ZMRATEPR, ZMRATEPS, ZMSNOWACL, & ! dp/g, evap. of rain, subl. of snow, accr. rate of snow with cl. drop in-cl. -! ZLP, ZIP, & ! cloud water content, cloud ice water content -! PTP, ZXTM1, ZLFRAC_SO2, ZXTTE, ZXTP10, ZXTP1C, & ! temperature, zlfrac_so2 only needed in gas scavenging (0 for now) -! PFPLSL, PFPLSN, ZFEVAPR, ZFSUBLS, & ! rain flux, snow flux, -! ZDUM2D, ZDUM3D, & ! as zero as these are not needed in strat. case -! ZAP, PCOVPTOT, ZRHO, ZDUMMY) ! cloud frac., precip. frac., air dens. - - DO JMASS=1,naerocomp - - wdepout_2D(KIDIA:KFDIA,KAERO(ind_oifs_ham%ind_mass_OIFS(JMASS)))=wdepout_2D(KIDIA:KFDIA,KAERO(ind_oifs_ham%ind_mass_OIFS(JMASS)))+ZDUMMY(KIDIA:KFDIA,ind_oifs_ham%ind_mass_ham(JMASS)) - END DO - - DO JCLASS=1,nclass - - wdepout_2D(KIDIA:KFDIA,KAERO(ind_oifs_ham%ind_class_OIFS(JCLASS)))=wdepout_2D(KIDIA:KFDIA,KAERO(ind_oifs_ham%ind_class_OIFS(JCLASS)))+ZDUMMY(KIDIA:KFDIA, ind_oifs_ham%ind_class_ham(JCLASS)) - - END DO - -!>>>>>>> origin/feature/knmi-chem:src/ifs/phys_ec/hamm7_interface.F90 - END IF - END IF - CALL GSTATS(2503,1) - - !<-- End wet deposition for HAM-M7 - !----------------------------------------------------------------- + DO JMASS=1,NAEROCOMP + JY=KAERO(ind_oifs_ham%ind_mass_OIFS(JMASS)) + WDEPOUT_2D(KIDIA:KFDIA, JY) = WDEPOUT_2D(KIDIA:KFDIA,JY) + ZDUMMY(KIDIA:KFDIA,ind_oifs_ham%ind_mass_ham(JMASS)) + END DO - !--- Mass conserving correction of negative tracer values: - CALL xt_borrow(KFDIA, KLON, KLEV, KLEV+1, ntrac, & - PRSF1, PRS1, & - ZXTM1, ZXTTE) - - - !----------------------------------------------------------------- - !--> Sedimentation for HAM-M7 - CALL GSTATS(2504,0) - - !!!rwet_m7(1:kproma,:,:) = pm6rp(1:kproma,:,:)/100._dp - !!!rdry_m7(1:kproma,:,:) = pm6dry(1:kproma,:,:)/100._dp - !!!densaer_m7(1:kproma,:,:) = prhop(1:kproma,:,:)*1000._dp !eehol: g/cm3 to kg/m3 - !!!aerwat_m7(1:kproma,:,:) = pww(1:kproma,:,:) - IF (LAERSEDIM) THEN + DO JCLASS=1,NCLASS + JY=KAERO(ind_oifs_ham%ind_class_OIFS(JCLASS)) + WDEPOUT_2D(KIDIA:KFDIA,JY) = WDEPOUT_2D(KIDIA:KFDIA,JY) + ZDUMMY(KIDIA:KFDIA, ind_oifs_ham%ind_class_ham(JCLASS)) + END DO - IF ( lsedimentation .AND. ANY(trlist%ti(:)%nsedi > 0) ) THEN + END IF + END IF + CALL GSTATS(2503,1) + + !<-- End wet deposition for HAM-M7 + !----------------------------------------------------------------- + + !--- Mass conserving correction of negative tracer values: + CALL XT_BORROW(KFDIA, KLON, KLEV, KLEV+1, ntrac, & + PRSF1, PRS1, & + ZXTM1, ZXTTE) + + !----------------------------------------------------------------- + !--> Sedimentation for HAM-M7 + CALL GSTATS(2504,0) + + IF (LAERSEDIM) THEN + IF ( lsedimentation .AND. ANY(trlist%ti(:)%nsedi > 0) ) THEN + + ZTENCIH(:,:,:) = 0._JPRB + ZTENCIH(KIDIA:KFDIA,1:KLEV,1:ntrac)=ZXTTE(KIDIA:KFDIA,1:KLEV,1:ntrac) + + CALL SEDI_INTERFACE(KLON, KFDIA, KLEV, ZKROW, & + PTP, ZQP, PRSF1, PRS1, & !eehol: temperature, specific humidity, pressure at full level, pressure at half level + ZM6RP, ZRHOP, & !mean mode actual radius [m], mean mode particle density [kg m-3] + ZXTM1, ZXTTE, ZSEDIFLUX) !eehol: tracer mixing ratios and tendency (sediflux for diagnostics) + + SEDOUT(KIDIA:KFDIA, 1:KLEV,:)=(ZTENCIH(KIDIA:KFDIA, 1:KLEV,:)-ZXTTE(KIDIA:KFDIA, 1:KLEV,:)) + DO JK=1,KLEV + DO JCLASS=1,NCLASS + SEDOUT_2D(KIDIA:KFDIA,KAERO(ind_oifs_ham%ind_class_OIFS(JCLASS)))=SEDOUT_2D(KIDIA:KFDIA,KAERO(ind_oifs_ham%ind_class_OIFS(JCLASS))) + ZSEDIFLUX(KIDIA:KFDIA, JK,ind_oifs_ham%ind_class_HAM(JCLASS)) + END DO + DO JMASS=1,NAEROCOMP + SEDOUT_2D(KIDIA:KFDIA,KAERO(ind_oifs_ham%ind_mass_OIFS(JMASS)))=SEDOUT_2D(KIDIA:KFDIA,KAERO(ind_oifs_ham%ind_mass_OIFS(JMASS))) + ZSEDIFLUX(KIDIA:KFDIA,JK,ind_oifs_ham%ind_mass_HAM(JMASS)) + END DO + END DO + END IF + ENDIF + CALL GSTATS(2504,1) - ZTENCIH(:,:,:) = 0._JPRB - ZTENCIH(KIDIA:KFDIA,1:KLEV,1:ntrac)=ZXTTE(KIDIA:KFDIA,1:KLEV,1:ntrac) - - CALL sedi_interface(KLON, KFDIA, KLEV, ZKROW, & - PTP, ZQP, PRSF1, PRS1, & !eehol: temperature, specific humidity, pressure at full level, pressure at half level - ZM6RP, ZRHOP, & !mean mode actual radius [m], mean mode particle density [kg m-3] - ZXTM1, ZXTTE, ZSEDIFLUX) !eehol: tracer mixing ratios and tendency (sediflux for diagnostics) + !<-- End sedimentation for HAM-M7 + !----------------------------------------------------------------- + + !--- Mass conserving correction of negative tracer values: + CALL xt_borrow(KFDIA, KLON, KLEV, KLEV+1, ntrac, & + PRSF1, PRS1, & + ZXTM1, ZXTTE) + + !----------------------------------------------------------------- + !--> Dry deposition for HAM-M7 + IF (.NOT.LAERSURF) THEN + PAERDDP(:,:) =0._JPRB + ELSEIF (LAERSURF) THEN + + !* DRY DEPOSITION INCLUDED AS MODIFICATION TO SURFACE FLUXES + ! --------------------------------------------------------- + CALL GSTATS(2505,0) + + IF (LAERDRYDP) THEN + + !--> variables not needed for aerosol dry deposition + ZCFML(:) = 0._JPRB + ZCFMW(:) = 0._JPRB + ZCFMI(:) = 0._JPRB + ZCFNCL(:) = 0._JPRB + ZCFNCW(:) = 0._JPRB + ZCFNCI(:) = 0._JPRB + ZEPDU2 = 0._JPRB + ZKAP = 0._JPRB + ZGEOM1(:,:) = 0._JPRB + ZRIL(:) = 0._JPRB + ZRIW(:) = 0._JPRB + ZRII(:) = 0._JPRB + ZTVIR1(:,:) = 0._JPRB + ZTVL(:) = 0._JPRB + ZTVW(:) = 0._JPRB + ZTVI(:) = 0._JPRB + ZAZ0(:) = 0._JPRB + ZFRL(:) = 0._JPRB + ZSRFL(:) = 0._JPRB + ZFOREST(:) = 0._JPRB + ZTSI(:) = 0._JPRB + ZAZ0L(:) = 0._JPRB + ZAZ0I(:) = 0._JPRB + ZCDNI(:) = 0._JPRB + + !--> variables calculated for dry deposition + DO JL = KIDIA,KFDIA + IF ( PLSM(JL) < 0.99_JPRB ) THEN + ZLOLAND(JL) = .FALSE. + ZAZ0W(JL) = PZ0M(JL) + ELSE + ZLOLAND(JL) = .TRUE. + ZAZ0W(JL) = 0._JPRB + END IF + ZAZ0W(JL) = MAX(1.0E-5_JPRB,ZAZ0W(JL)) ! treshold roughness length to min value + ZFRW(JL) = MAX(0.,1.-PLSM(JL)-PCI(JL)) ! water fraction = 1 - land mask - sea ice fraction + ZCVS(JL) = PFRTI(JL,5)+PFRTI(JL,7) ! snow cover fraction = Snow on low-veg + snow on bare-soil + snow under high-veg + ZCVW(JL) = PFRTI(JL,3) ! wet skin fraction + ZVGRAT(JL) = PCVL(JL)+PCVH(JL) ! vegetation ratio = low veg. cover + high veg. cover + ZCDNL(JL) = PAERUST(JL) ! adding ustar to not used variable + ZCDNW(JL) = LOG(ZDZ(JL,KLEV)/PZ0M(JL))/(VKARMAN*PAERUST(JL)) ! calculate aerodyn. resistance on surface to not used variable + END DO + + !--> init values + ZTENCIH(:,:,:) = 0._JPRB + ZTENCIH(KIDIA:KFDIA,1:KLEV,:) = ZXTTE(KIDIA:KFDIA,1:KLEV,:) ! init tendency before drydep + ZXTEMS(KIDIA:KFDIA,:) = 0._JPRB ! surface emissions as zero for input + ZXTMD1(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB + ZXTMD1(KIDIA:KFDIA,1:KLEV,:) = ZXTM1(KIDIA:KFDIA,1:KLEV,:) + (ZTENCIH(KIDIA:KFDIA,1:KLEV,:) * time_step_len) ! update mixrat with tendency + ZVDEP(KIDIA:KFDIA,:) = 0._JPRB ! ddep velocity as zero + + ! RCHG: Recommendation, those subroutines specific of m7 should have + ! m7 in the name not sure if this is specific or general/common + ! but adapted to m7. Like m7_simple_sulfur_drydep below. + CALL DRYDEP_INTERFACE(KLON, KFDIA, KLEV, ZKROW, & + & ZQP(:,KLEV), ZQSAT(:,KLEV), PTP(:,KLEV), ZCFML, ZCFMW, ZCFMI, & + & ZCFNCL, ZCFNCW, ZCFNCI, & + & ZEPDU2, ZKAP, PUP, PVP, ZGEOM1, ZRIL, ZRIW, & + & ZRII, & + & ZTVIR1, ZTVL, ZTVW, ZTVI, ZAZ0, & + & PTP(:,KLEV), ZLOLAND, & + & ZM6RP, ZRHOP, & ! M7 + & ZFRL, ZFRW, PCI, ZCVS, ZCVW, ZVGRAT, & + & ZSRFL, PUP(:,KLEV), PVP(:,KLEV), & !eehol: FIXME 10m u and v wind from lowest level.. needs to be revised in future!! + & ZXTEMS, ZXTMD1, ZRHO(:,KLEV), PRS1, ZFOREST, ZTSI, & !air dens lowest, air press at int. + & ZAZ0L, ZAZ0W, ZAZ0I, ZCDNL, ZCDNW, ZCDNI, ZDDEPFLUX, ZVDEP) !ZCDNL and ZCDNW used for ustar and aerodyn. resist. - SEDOUT(KIDIA:KFDIA, 1:KLEV,:)=(ZTENCIH(KIDIA:KFDIA, 1:KLEV,:)-ZXTTE(KIDIA:KFDIA, 1:KLEV,:)) - DO JK=1,KLEV - do JCLASS=1,nclass - SEDOUT_2D(KIDIA:KFDIA,KAERO(ind_oifs_ham%ind_class_OIFS(JCLASS)))=SEDOUT_2D(KIDIA:KFDIA,KAERO(ind_oifs_ham%ind_class_OIFS(JCLASS))) + ZSEDIFLUX(KIDIA:KFDIA, JK,ind_oifs_ham%ind_class_HAM(JCLASS)) - end do - do JMASS=1,naerocomp - SEDOUT_2D(KIDIA:KFDIA,KAERO(ind_oifs_ham%ind_mass_OIFS(JMASS)))=SEDOUT_2D(KIDIA:KFDIA,KAERO(ind_oifs_ham%ind_mass_OIFS(JMASS))) + ZSEDIFLUX(KIDIA:KFDIA,JK,ind_oifs_ham%ind_mass_HAM(JMASS)) - end do - end DO + IF (.NOT. LAERCHEM) THEN + CALL M7_SIMPLE_SULFUR_DRYDEP(YDMODEL, KIDIA,KFDIA, KLON, KLEV, & + Zxtm1, PCFLX(:,KAERO(1):KAERO(NACTAERO)), & + ZDP, PGEOH, ZRHO, ZXTTE, PTSPHY,& + PSO2DD, PGELAM, & + ZFAERO, Zxtp1, ZDDEPFLUX_SO2) + ZDDEPFLUX(KIDIA:KFDIA,2)=ZDDEPFLUX_SO2(KIDIA:KFDIA) END IF - - ENDIF - CALL GSTATS(2504,1) - - !<-- End sedimentation for HAM-M7 - !----------------------------------------------------------------- - - - !--- Mass conserving correction of negative tracer values: - CALL xt_borrow(KFDIA, KLON, KLEV, KLEV+1, ntrac, & - PRSF1, PRS1, & - ZXTM1, ZXTTE) - - - - !----------------------------------------------------------------- - !--> Dry deposition for HAM-M7 - IF (.NOT.LAERSURF) THEN - PAERDDP(:,:) =0._JPRB - ELSEIF (LAERSURF) THEN - - !* DRY DEPOSITION INCLUDED AS MODIFICATION TO SURFACE FLUXES - ! --------------------------------------------------------- - CALL GSTATS(2505,0) - - IF (LAERDRYDP) THEN - - !--> variables not needed for aerosol dry deposition - ZCFML(:) = 0._JPRB - ZCFMW(:) = 0._JPRB - ZCFMI(:) = 0._JPRB - ZCFNCL(:) = 0._JPRB - ZCFNCW(:) = 0._JPRB - ZCFNCI(:) = 0._JPRB - ZEPDU2 = 0._JPRB - ZKAP = 0._JPRB - ZGEOM1(:,:) = 0._JPRB - ZRIL(:) = 0._JPRB - ZRIW(:) = 0._JPRB - ZRII(:) = 0._JPRB - ZTVIR1(:,:) = 0._JPRB - ZTVL(:) = 0._JPRB - ZTVW(:) = 0._JPRB - ZTVI(:) = 0._JPRB - ZAZ0(:) = 0._JPRB - ZFRL(:) = 0._JPRB - ZSRFL(:) = 0._JPRB - ZFOREST(:) = 0._JPRB - ZTSI(:) = 0._JPRB - ZAZ0L(:) = 0._JPRB - ZAZ0I(:) = 0._JPRB - ZCDNI(:) = 0._JPRB - - !--> variables calculated for dry deposition - DO JL = KIDIA,KFDIA - IF ( PLSM(JL) < 0.99_JPRB ) THEN - ZLOLAND(JL) = .FALSE. - ZAZ0W(JL) = PZ0M(JL) - ELSE - ZLOLAND(JL) = .TRUE. - ZAZ0W(JL) = 0._JPRB - END IF - ZAZ0W(JL) = MAX(1.0E-5_JPRB,ZAZ0W(JL)) ! treshold roughness length to min value - ZFRW(JL) = MAX(0.,1.-PLSM(JL)-PCI(JL)) ! water fraction = 1 - land mask - sea ice fraction - ZCVS(JL) = PFRTI(JL,5)+PFRTI(JL,7) ! snow cover fraction = Snow on low-veg + snow on bare-soil + snow under high-veg - ZCVW(JL) = PFRTI(JL,3) ! wet skin fraction - ZVGRAT(JL) = PCVL(JL)+PCVH(JL) ! vegetation ratio = low veg. cover + high veg. cover - ZCDNL(JL) = PAERUST(JL) ! adding ustar to not used variable - ZCDNW(JL)=LOG(ZDZ(JL,KLEV)/PZ0M(JL))/(VKARMAN*PAERUST(JL)) ! calculate aerodyn. resistance on surface to not used variable - END DO - - !--> init values - ZTENCIH(:,:,:) = 0._JPRB - ZTENCIH(KIDIA:KFDIA,1:KLEV,:) = ZXTTE(KIDIA:KFDIA,1:KLEV,:) ! init tendency before drydep - ZXTEMS(:,:) = 0._JPRB ! surface emissions as zero for input - ZXTMD1(:,:,:) = 0._JPRB - ZXTMD1(KIDIA:KFDIA,1:KLEV,:) = ZXTM1(KIDIA:KFDIA,1:KLEV,:) + (ZTENCIH(KIDIA:KFDIA,1:KLEV,:) * time_step_len) ! update mixrat with tendency - ZVDEP(:,:) = 0._JPRB ! ddep velocity as zero - - CALL drydep_interface(KLON, KFDIA, KLEV, ZKROW, & - ZQP(:,KLEV), ZQSAT(:,KLEV), PTP(:,KLEV), ZCFML, ZCFMW, ZCFMI, & - ZCFNCL, ZCFNCW, ZCFNCI, & - ZEPDU2, ZKAP, PUP, PVP, ZGEOM1, ZRIL, ZRIW, & - ZRII, & - ZTVIR1, ZTVL, ZTVW, ZTVI, ZAZ0, & - PTP(:,KLEV), ZLOLAND, & - ZM6RP, ZRHOP, & ! M7 - ZFRL, ZFRW, PCI, ZCVS, ZCVW, ZVGRAT, & - ZSRFL, PUP(:,KLEV), PVP(:,KLEV), & !eehol: 10m u and v wind from lowest level.. needs to be revised in future!! - ZXTEMS, ZXTMD1, ZRHO(:,KLEV), PRS1, ZFOREST, ZTSI, & !eehol: air dens lowest, air press at int. - ZAZ0L, ZAZ0W, ZAZ0I, ZCDNL, ZCDNW, ZCDNI, ZDDEPFLUX, ZVDEP) !eehol: ZCDNL and ZCDNW used for ustar and aerodyn. resist. - - IF (.not. LAERCHEM)THEN - CALL m7_simple_sulfur_drydep(YDMODEL, KIDIA,KFDIA, KLON, KLEV, & - Zxtm1, PCFLX(:,KAERO(1):KAERO(NACTAERO)), & - ZDP, PGEOH, ZRHO, ZXTTE, PTSPHY,& - PSO2DD, PGELAM, & - ZFAERO, Zxtp1, ZDDEPFLUX_SO2) - ZDDEPFLUX(KIDIA:KFDIA,2)=ZDDEPFLUX_SO2(KIDIA:KFDIA) - END IF - - !--> modify tendency at surface according to changes in surface emissions - DO JT = 1,ntrac - DO JL = KIDIA,KFDIA - ZXTTE(JL,KLEV,JT) = ZTENCIH(JL,KLEV,JT) + ((ZXTEMS(JL,JT)*RG)/(ZDP(JL,KLEV))) - END DO - END DO - - ENDIF ! LAERDRYDP - END IF - CALL GSTATS(2505,1) - - !<-- End dry deposition for HAM-M7 - !----------------------------------------------------------------- - - - !--- Mass conserving correction of negative tracer values: - CALL xt_borrow(KFDIA, KLON, KLEV, KLEV+1, ntrac, & - PRSF1, PRS1, & - ZXTM1, ZXTTE) - - - !----------------------------------------------------------------- - !--> Add HAM modified tendency back to PTENC (OIFS values) - - !number - DO JCLASS=1,nclass - PTENC(KIDIA:KFDIA,1:KLEV,KAERO(ind_oifs_ham%ind_class_OIFS(JCLASS))) = ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_class_HAM(JCLASS)) - END DO - !mass - DO JMASS=1,naerocomp - PTENC(KIDIA:KFDIA,1:KLEV,KAERO(ind_oifs_ham%ind_mass_OIFS(JMASS))) = ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_mass_HAM(JMASS)) - END DO - !gas - IF(LAERCHEM) THEN - - DO JGAS=1,subm_ngasspec - PTENC(KIDIA:KFDIA,1:KLEV,KCHEM(ind_oifs_ham%ind_gas_OIFS(JGAS))) = ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_gas_HAM(JGAS)) - END DO - ELSE - DO JGAS=1,subm_ngasspec - PTENC(KIDIA:KFDIA,1:KLEV,KAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))) = ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_gas_HAM(JGAS)) + + !--> modify tendency at surface according to changes in surface emissions + DO JT = 1,NTRAC + DO JL = KIDIA,KFDIA + ZXTTE(JL,KLEV,JT) = ZTENCIH(JL,KLEV,JT) + ((ZXTEMS(JL,JT)*RG)/(ZDP(JL,KLEV))) + END DO END DO - END IF - !cloud variables - DO JCLOUD=1,2 !CDNC and ICNC - PTENC(KIDIA:KFDIA,1:KLEV,KAERO(ind_oifs_ham%ind_cloud_OIFS(JCLOUD))) = ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_cloud_HAM(JCLOUD)) - END DO - - !<-- End adding HAM modified tendency back to PTENC - !----------------------------------------------------------------- - - + ENDIF ! LAERDRYDP + END IF + CALL GSTATS(2505,1) + + !<-- End dry deposition for HAM-M7 + !----------------------------------------------------------------- + + !--- Mass conserving correction of negative tracer values: + CALL xt_borrow(KFDIA, KLON, KLEV, KLEV+1, ntrac, & + PRSF1, PRS1, & + ZXTM1, ZXTTE) + + !----------------------------------------------------------------- + !--> Add HAM modified tendency back to PTENC (OIFS values) + + !number + DO JCLASS=1,NCLASS + PTENC(KIDIA:KFDIA,1:KLEV,KAERO(ind_oifs_ham%ind_class_OIFS(JCLASS))) = ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_class_HAM(JCLASS)) + END DO + !mass + DO JMASS=1,NAEROCOMP + PTENC(KIDIA:KFDIA,1:KLEV,KAERO(ind_oifs_ham%ind_mass_OIFS(JMASS))) = ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_mass_HAM(JMASS)) + END DO + !gas + IF(LAERCHEM) THEN + DO JGAS=1,SUBM_NGASSPEC + PTENC(KIDIA:KFDIA,1:KLEV,KCHEM(ind_oifs_ham%ind_gas_OIFS(JGAS))) = ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_gas_HAM(JGAS)) + END DO + ELSE + DO JGAS=1,SUBM_NGASSPEC + PTENC(KIDIA:KFDIA,1:KLEV,KAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))) = ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_gas_HAM(JGAS)) + END DO + END IF + + ! RCHG -> not sure best way to solve here. I commented to avoid segmentation fault + ! but it may be avoided with other more specific flag. Anyway something was + ! needed to avoid core-dump. + ! The problem with these arrays in loop below is that the indices: + ! ind_oifs_ham%ind_cloud_HAM(JCLOUD)) + ! KAERO(ind_oifs_ham%ind_cloud_OIFS(JCLOUD))) + ! are not propoperly set up by hamm7_init.F90 + ! -- this need to be solved probably in hamm7_init.F90 which detect the + ! problems with these tracers about CCN. + !cloud variables + DO JCLOUD=1,2 !CDNC and ICNC + PTENC(KIDIA:KFDIA,1:KLEV,KAERO(ind_oifs_ham%ind_cloud_OIFS(JCLOUD))) = ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_cloud_HAM(JCLOUD)) + END DO + !<-- End adding HAM modified tendency back to PTENC + !----------------------------------------------------------------- + CASE DEFAULT - ! this case should never occur, as it is handled in the calling subroutine - CALL ABOR1(" AEROSOL SCHEME "//TRIM(AERO_SCHEME)//" IS NOT HANDLED IN TM5M7" ) - + ! this case should never occur, as it is handled in the calling subroutine + CALL ABOR1(" AEROSOL SCHEME "//TRIM(AERO_SCHEME)//" IS NOT HANDLED IN HAMM7" ) END SELECT ! write flux to extra fields for diagnostic of aerosol 'chemical' conversion IF (LCHEM_DIA) THEN - - CALL CHEM_INEXT( KIDIA , KFDIA , KLON , KLEV , 1, 1, & + CALL CHEM_INEXT( KIDIA , KFDIA , KLON , KLEV , 1, 1, & & ZDP, PTSPHY, ZTSO4, ZTENC0,PEXTRA(:,ISO4_C,IEXTR_CH)) - END IF @@ -1452,8 +1426,8 @@ SUBROUTINE HAMM7_INTERFACE( & IF (LAERNGAT) THEN IF (LCHEM_DIA) THEN - ZTAERO0(KIDIA:KFDIA,1:KLEV,1:NACTAERO) = ZTAEROK(KIDIA:KFDIA,1:KLEV,1:NACTAERO) - ENDIF + ZTAERO0(KIDIA:KFDIA,1:KLEV,1:NACTAERO) = ZTAEROK(KIDIA:KFDIA,1:KLEV,1:NACTAERO) + ENDIF DO JAER=1,NACTAERO @@ -1465,10 +1439,10 @@ SUBROUTINE HAMM7_INTERFACE( & ENDDO CALL AER_NEGAT & - & ( YREAERATM, KIDIA , KFDIA, KLON , KLEV, & - & PTSPHY , & - & ZAER , ZTAER, PRS1, & - & ZAERNEG ) + & ( YREAERATM, KIDIA , KFDIA, KLON , KLEV, & + & PTSPHY , & + & ZAER , ZTAER, PRS1, & + & ZAERNEG ) DO JK=1,KLEV DO JL=KIDIA,KFDIA @@ -1481,11 +1455,11 @@ SUBROUTINE HAMM7_INTERFACE( & ENDDO -! collect neg fix tendencies -IF (LCHEM_DIA) THEN - CALL CHEM_INEXT( KIDIA , KFDIA , KLON , KLEV , NACTAERO, NACTAERO , & - & ZDP, PTSPHY, ZTAERO ,ZTAERO0, PEXTRA(:,NCHEM+1:NCHEM+NACTAERO,IEXTR_NG)) -ENDIF + ! collect neg fix tendencies + IF (LCHEM_DIA) THEN + CALL CHEM_INEXT( KIDIA , KFDIA , KLON , KLEV , NACTAERO, NACTAERO , & + & ZDP, PTSPHY, ZTAERO ,ZTAERO0, PEXTRA(:,NCHEM+1:NCHEM+NACTAERO,IEXTR_NG)) + ENDIF ! do not fix the tendencies for now, number concentration fixes will break the @@ -1542,25 +1516,21 @@ SUBROUTINE HAMM7_INTERFACE( & ITWAVL(19)=19 ! 2130 nm ITWAVL(20)=20 ! 10 microns - - IBLK=(KSTGLO-1)/KLON + 1 - DO JK=1,KLEV - DO JL=KIDIA,KFDIA - DO JAER=1,14 + DO JL=KIDIA,KFDIA + DO JAER=1,14 PAER_TAU(JL,JK,JAER) = YDAERM7%M7AOD(JL,JK,JAER,IBLK) PAER_SSA(JL,JK,JAER) = YDAERM7%M7SSA(JL,JK,JAER,IBLK) PAER_ASYM(JL,JK,JAER ) = YDAERM7%M7ASYM(JL,JK,JAER,IBLK) - ENDDO - DO JAER=1,16 + ENDDO + DO JAER=1,16 PAER_TAU_LW(JL,JK,JAER)= YDAERM7%M7AODLW(JL,JK,JAER,IBLK) - ENDDO - ENDDO + ENDDO + ENDDO ENDDO - IF(MOD(NSTEP+1,NRADFR) == 0) THEN CALL GSTATS(2506,0) ZAER_TAU(:,:,:,:)=0.0_JPRB @@ -1589,97 +1559,78 @@ SUBROUTINE HAMM7_INTERFACE( & ZAEROK = ZAEROK+ZTAERO*time_step_len CALL TM5M7_OPTICS_AOP_GET(YGFL, YREAERSRC, KIDIA,KFDIA, KLON, KLEV,NACTAERO, & - & NASWBAND, ASWBAND, 1, .false., & - & ZRHO, ZAEROK,RW_MODE,RWD_MODE,H2O_MODE,& - & ZAER_TAU, ZAER_SSA, ZAER_ASYM) + & NASWBAND, ASWBAND, 1, .false., & + & ZRHO, ZAEROK,RW_MODE,RWD_MODE,H2O_MODE,& + & ZAER_TAU, ZAER_SSA, ZAER_ASYM) PAOD(KIDIA:KFDIA,:)=0._JPRB - do JK = 1, KLEV - do JL = KIDIA,KFDIA - do IW=1,NASWBAND - PAER_TAU(JL,JK,IW)=ZAER_TAU(JL,JK,IW,1)*(PGEOH(JL,JK-1) - PGEOH(JL,JK)) - PAER_SSA(JL,JK,IW)=ZAER_SSA(JL,JK,IW) - PAER_ASYM(JL,JK,IW)=ZAER_ASYM(JL,JK,IW) - !PAOD(JL,IW)=ZAER_TAU(JL,JK,IW,1)*(PGEOH(JL,JK-1) - PGEOH(JL,JK))+PAOD(JL,IW) - enddo - do IW=1,16 - PAER_TAU_LW(JL,JK,IW)=0.0_JPRB - end do - enddo - enddo - - - - - !I am not sure if the rest is needed + DO JK = 1, KLEV + DO JL = KIDIA,KFDIA + DO IW=1,NASWBAND + PAER_TAU(JL,JK,IW)=ZAER_TAU(JL,JK,IW,1)*(PGEOH(JL,JK-1) - PGEOH(JL,JK)) + PAER_SSA(JL,JK,IW)=ZAER_SSA(JL,JK,IW) + PAER_ASYM(JL,JK,IW)=ZAER_ASYM(JL,JK,IW) + !PAOD(JL,IW)=ZAER_TAU(JL,JK,IW,1)*(PGEOH(JL,JK-1) - PGEOH(JL,JK))+PAOD(JL,IW) + ENDDO + DO IW=1,16 + PAER_TAU_LW(JL,JK,IW)=0.0_JPRB + END DO + ENDDO + ENDDO - allocate( Zaop_out_ext( KLON, KLEV, nwdep, 1)) ; Zaop_out_ext = 0.0_JPRB - allocate( Zaop_out_a ( KLON, KLEV, nwdep) ) ; Zaop_out_a = 0.0_JPRB - allocate( Zaop_out_g ( KLON, KLEV, nwdep) ) ; zaop_out_g = 0.0_JPRB + ! "I am not sure if the rest is needed" [who is I? FIXME] + + ALLOCATE( ZAOP_OUT_EXT( KLON, KLEV, NWDEP, 1)) ; ZAOP_OUT_EXT = 0.0_JPRB + ALLOCATE( ZAOP_OUT_A ( KLON, KLEV, NWDEP) ) ; ZAOP_OUT_A = 0.0_JPRB + ALLOCATE( ZAOP_OUT_G ( KLON, KLEV, NWDEP) ) ; ZAOP_OUT_G = 0.0_JPRB - allocate(Ztaus_aer (KLON, KLEV,nwdep)); Ztaus_aer = 0.0 - allocate(Ztaua_aer (KLON, KLEV,nwdep)); Ztaua_aer = 0.0 - allocate(Zpmaer (KLON, KLEV,nwdep)); Zpmaer = 0.0 + ALLOCATE(ZTAUS_AER (KLON, KLEV,NWDEP)); ZTAUS_AER = 0.0 + ALLOCATE(ZTAUA_AER (KLON, KLEV,NWDEP)); ZTAUA_AER = 0.0 + ALLOCATE(ZPMAER (KLON, KLEV,NWDEP)); ZPMAER = 0.0 - do JB=1, nbands_trop - Ptaus_aer(:,:,JB,1) = Ztaus_aer(:,:,wav_grid(JB)) - Ptaua_aer(:,:,JB,1) = Ztaua_aer(:,:,wav_grid(JB)) - Ppmaer (:,:,JB,1) = Zpmaer (:,:,wav_grid(JB)) + DO JB=1, NBANDS_TROP + PTAUS_AER(:,:,JB,1) = ZTAUS_AER(:,:,WAV_GRID(JB)) + PTAUA_AER(:,:,JB,1) = ZTAUA_AER(:,:,WAV_GRID(JB)) + PPMAER (:,:,JB,1) = ZPMAER (:,:,WAV_GRID(JB)) - Ptaus_aer(:,:,JB,2) = Ztaus_aer(:,:,wav_gridA(JB)) - Ptaua_aer(:,:,JB,2) = Ztaua_aer(:,:,wav_gridA(JB)) - Ppmaer (:,:,JB,2) = Zpmaer (:,:,wav_gridA(JB)) - enddo - deallocate(Ztaus_aer) - deallocate(Ztaua_aer) - deallocate(Zpmaer) + PTAUS_AER(:,:,JB,2) = ZTAUS_AER(:,:,WAV_GRIDA(JB)) + PTAUA_AER(:,:,JB,2) = ZTAUA_AER(:,:,WAV_GRIDA(JB)) + PPMAER (:,:,JB,2) = ZPMAER (:,:,WAV_GRIDA(JB)) + ENDDO + DEALLOCATE(ZTAUS_AER) + DEALLOCATE(ZTAUA_AER) + DEALLOCATE(ZPMAER) - Deallocate(Zaop_out_ext) - Deallocate(Zaop_out_a ) - Deallocate(Zaop_out_g ) + DEALLOCATE(ZAOP_OUT_EXT) + DEALLOCATE(ZAOP_OUT_A ) + DEALLOCATE(ZAOP_OUT_G ) -CASE (2) + CASE (2) ! Use HAM codes to calculate optical properties LWBANDS=16 PRS1D(KIDIA:KFDIA,:) = PRS1(KIDIA:KFDIA,1:KLEV)-PRS1(KIDIA:KFDIA,0:KLEV-1) !CALL ham_rad_cache(KLON,KLEV) ZXTM0 = ZXTM1+ZXTTE*time_step_len - CALL ham_rad(KFDIA,KLON, KLEV, ZKROW, LWBANDS, NASWBAND, ZXTM0, PRS1D,ZAER_TAU(:,:,:,1), ZAER_SSA, ZAER_ASYM, ZAER_TAU_LW,ZM6RP) + CALL HAM_RAD(KFDIA, KLON, KLEV, ZKROW, LWBANDS, NASWBAND, ZXTM0, PRS1D, & + & ZAER_TAU(:,:,:,1), ZAER_SSA, ZAER_ASYM, ZAER_TAU_LW, ZM6RP) !CALL ham_rad_cache_cleanup - do JK = 1, KLEV - do JL = KIDIA,KFDIA - do IW=1,NASWBAND - PAER_TAU(JL,JK,IW)=ZAER_TAU(JL,JK,IW,1)!*(PGEOH(JL,JK-1) - PGEOH(JL,JK)) - PAER_SSA(JL,JK,IW)=ZAER_SSA(JL,JK,IW) - PAER_ASYM(JL,JK,IW)=ZAER_ASYM(JL,JK,IW) - !PAOD(JL,IW)=ZAER_TAU(JL,JK,IW,1)+PAOD(JL,IW) - enddo - do IW=1,16 - PAER_TAU_LW(JL,JK,IW)=ZAER_TAU_LW(JL,JK,IW) - end do - enddo - enddo -!======= -! ZAER_TAU(:,:,:,1), ZAER_SSA, ZAER_ASYM, ZAER_TAU_LW,rwet_m7) -! CALL HAM_RAD_CACHE_CLEANUP -! -! do JK = 1, KLEV -! do JL = KIDIA,KFDIA -! do IW=1,NASWBAND -! PAER_TAU(JL,JK,IW)=ZAER_TAU(JL,JK,IW,1)!*(PGEOH(JL,JK-1) - PGEOH(JL,JK)) -! PAER_SSA(JL,JK,IW)=ZAER_SSA(JL,JK,IW) -! PAER_ASYM(JL,JK,IW)=ZAER_ASYM(JL,JK,IW) -! enddo -! do IW=1,16 -! PAER_TAU_LW(JL,JK,IW)=ZAER_TAU_LW(JL,JK,IW) -! end do -! -! -! enddo -!>>>>>>> origin/feature/fmi-hamm7-bugfixes -END SELECT + DO JK = 1, KLEV + DO JL = KIDIA,KFDIA + DO IW=1,NASWBAND + PAER_TAU(JL,JK,IW)=ZAER_TAU(JL,JK,IW,1)!*(PGEOH(JL,JK-1) - PGEOH(JL,JK)) + PAER_SSA(JL,JK,IW)=ZAER_SSA(JL,JK,IW) + PAER_ASYM(JL,JK,IW)=ZAER_ASYM(JL,JK,IW) + !PAOD(JL,IW)=ZAER_TAU(JL,JK,IW,1)+PAOD(JL,IW) + ENDDO + DO IW=1,16 + PAER_TAU_LW(JL,JK,IW)=ZAER_TAU_LW(JL,JK,IW) + END DO + ENDDO + ENDDO + + END SELECT CALL GSTATS(2506,1) @@ -1690,29 +1641,29 @@ SUBROUTINE HAMM7_INTERFACE( & PFAOD(:,:)=0._JPRB PSSA(:,:) =0._JPRB PASY(:,:) =0._JPRB -do JK = 1, KLEV - do JL = KIDIA,KFDIA - do IW=1,NASWBAND - PAOD(JL,IW)=PAER_TAU(JL,JK,IW)+PAOD(JL,IW) - PSSA(JL,IW)=PAER_SSA(JL,JK,IW)*PAER_TAU(JL,JK,IW)+PSSA(JL,IW) - PASY(JL,IW)=PAER_ASYM(JL,JK,IW)*PAER_TAU(JL,JK,IW)+PASY(JL,IW) - end do - !IF(PAOD(JL,IW)>0._JPRB) THEN - ! PSSA(JL,:) =PSSA(JL,:)/PAOD(JL,IW)! AOD average - ! PASY(JL,:) =PASY(JL,:)/PAOD(JL,IW)! AOD average - !ENDIF - end do -end do - - - do JL = KIDIA,KFDIA - do IW=1,NASWBAND - IF(PAOD(JL,IW)>0._JPRB) THEN - PSSA(JL,IW) =PSSA(JL,IW)/PAOD(JL,IW)! AOD average - PASY(JL,IW) =PASY(JL,IW)/PAOD(JL,IW)! AOD average - ENDIF - end do -end do +DO JK = 1, KLEV + DO JL = KIDIA,KFDIA + DO IW=1,NASWBAND + PAOD(JL,IW)=PAER_TAU(JL,JK,IW)+PAOD(JL,IW) + PSSA(JL,IW)=PAER_SSA(JL,JK,IW)*PAER_TAU(JL,JK,IW)+PSSA(JL,IW) + PASY(JL,IW)=PAER_ASYM(JL,JK,IW)*PAER_TAU(JL,JK,IW)+PASY(JL,IW) + END DO + !IF(PAOD(JL,IW)>0._JPRB) THEN + ! PSSA(JL,:) =PSSA(JL,:)/PAOD(JL,IW)! AOD AVERAGE + ! PASY(JL,:) =PASY(JL,:)/PAOD(JL,IW)! AOD AVERAGE + !ENDIF + END DO +END DO + +DO JL = KIDIA,KFDIA + DO IW=1,NASWBAND + IF(PAOD(JL,IW)>0._JPRB) THEN + PSSA(JL,IW) =PSSA(JL,IW)/PAOD(JL,IW)! AOD AVERAGE + PASY(JL,IW) =PASY(JL,IW)/PAOD(JL,IW)! AOD AVERAGE + ENDIF + END DO +END DO + !------------------------------------------------------------------------------ !* 6.0 Fill selective aerosol OD fields in structure as available in IFS-AER @@ -1736,20 +1687,17 @@ SUBROUTINE HAMM7_INTERFACE( & ENDDO ENDDO - - !* -!* VH - Requires full checking by expert if this makes sense -!* - DO JL=KIDIA,KFDIA - PODTO(JL) =PTAUS_AER(JL,KLEV,1,1) - PODTO469(JL) =PTAUS_AER(JL,KLEV,2,1) - PODTO670(JL) =PTAUS_AER(JL,KLEV,3,1) - PODTO865(JL) =PTAUS_AER(JL,KLEV,4,1) - PODTO1240(JL)=PTAUS_AER(JL,KLEV,5,1) - ENDDO +!* VH - Requires full checking by expert if this makes sense - FIXME +!* +DO JL=KIDIA,KFDIA + PODTO(JL) =PTAUS_AER(JL,KLEV,1,1) + PODTO469(JL) =PTAUS_AER(JL,KLEV,2,1) + PODTO670(JL) =PTAUS_AER(JL,KLEV,3,1) + PODTO865(JL) =PTAUS_AER(JL,KLEV,4,1) + PODTO1240(JL)=PTAUS_AER(JL,KLEV,5,1) +ENDDO - !* 6.1 STORE IN AEROUT-1 ! ------------------------------ @@ -1775,168 +1723,154 @@ SUBROUTINE HAMM7_INTERFACE( & ! ENDDO ! ENDDO +IF(.NOT.LIFSMIN .AND. .NOT.LIFSTRAJ) THEN + ! input for HAM-M7 + PGFL(KIDIA:KFDIA,1,YAEROUT(1)%MP)=PAOD(KIDIA:KFDIA,10) !PAER_TAU(KIDIA:KFDIA,1:KLEV,10) !533nm + DO JK=1,KLEV + PGFL(KIDIA:KFDIA,2,YAEROUT(1)%MP)= PGFL(KIDIA:KFDIA,2,YAEROUT(1)%MP) + PAER_SSA(KIDIA:KFDIA,JK,10) !PAER_TAU(KIDIA:KFDIA,1:KLEV,10) !533nm + PGFL(KIDIA:KFDIA,3,YAEROUT(1)%MP)= PGFL(KIDIA:KFDIA,3,YAEROUT(1)%MP) + PAER_ASYM(KIDIA:KFDIA,JK,10) !PAER_TAU(KIDIA:KFDIA,1:KLEV,10) !533nm + END DO + ! RCHG: It seems that here 1:14 refers to 14 species. PLS: AOD of 14 short wavelengths stored in YAEROUT(12)%MP of first 14 tracers (juggling!!) + PGFL(KIDIA:KFDIA,1:14,YAEROUT(12)%MP)=PAOD(KIDIA:KFDIA,1:14) - IF(.NOT.LIFSMIN .AND. .NOT.LIFSTRAJ) THEN - ! input for HAM-M7 + DO JN=1,NAEROCOMP !ntrac!NACTAERO + PGFL(KIDIA:KFDIA,ind_oifs_ham%ind_mass_OIFS(JN),YAEROUT(2)%MP)=ZDDEPFLUX(KIDIA:KFDIA,ind_oifs_ham%IND_mass_HAM(JN)) + END DO + DO JN=1,NCLASS + PGFL(KIDIA:KFDIA,ind_oifs_ham%ind_class_OIFS(JN),YAEROUT(2)%MP)=ZDDEPFLUX(KIDIA:KFDIA,ind_oifs_ham%IND_class_HAM(JN)) + END DO + !do JN=1,NACTAERO !ktrac + ! if (NSTEP==10)then + ! do JL=KIDIA,KFDIA + ! write(3345,*)JN,WDEPOUT_2D(JL,KAERO(JN)) + ! end do + ! end if + !end do + + DO JN=1,NACTAERO !ktrac + PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(3)%MP)=WDEPOUT_2D(KIDIA:KFDIA,KAERO(JN)) + PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(4)%MP)=SEDOUT_2D(KIDIA:KFDIA,KAERO(JN)) + ! PGFL(KIDIA:KFDIA,JN,YAEROUT(5)%MP)=PAERSRC(KIDIA:KFDIA,KAERO(JN)) + END DO - PGFL(KIDIA:KFDIA,1,YAEROUT(1)%MP)=PAOD(KIDIA:KFDIA,10) !PAER_TAU(KIDIA:KFDIA,1:KLEV,10) !533nm - do JK=1,KLEV - - PGFL(KIDIA:KFDIA,2,YAEROUT(1)%MP)= PGFL(KIDIA:KFDIA,2,YAEROUT(1)%MP)+PAER_SSA(KIDIA:KFDIA,JK,10)!PAER_TAU(KIDIA:KFDIA,1:KLEV,10) !533nm - PGFL(KIDIA:KFDIA,3,YAEROUT(1)%MP)= PGFL(KIDIA:KFDIA,3,YAEROUT(1)%MP)+PAER_ASYM(KIDIA:KFDIA,JK,10)!PAER_TAU(KIDIA:KFDIA,1:KLEV,10) !533nm - end do - - PGFL(KIDIA:KFDIA,1:14,YAEROUT(12)%MP)=PAOD(KIDIA:KFDIA,1:14) - - do JN=1,naerocomp!ntrac!NACTAERO - PGFL(KIDIA:KFDIA,ind_oifs_ham%ind_mass_OIFS(JN),YAEROUT(2)%MP)=ZDDEPFLUX(KIDIA:KFDIA,ind_oifs_ham%IND_mass_HAM(JN)) - end do - do JN=1,nclass - PGFL(KIDIA:KFDIA,ind_oifs_ham%ind_class_OIFS(JN),YAEROUT(2)%MP)=ZDDEPFLUX(KIDIA:KFDIA,ind_oifs_ham%IND_class_HAM(JN)) - end do - do JN=1,NACTAERO!ktrac - - if ( NSTEP==10)then - do JL=KIDIA,KFDIA - write(3345,*)JN,WDEPOUT_2D(JL,KAERO(JN)) - end do - end if - - PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(3)%MP)=WDEPOUT_2D(KIDIA:KFDIA,KAERO(JN)) - - end do - do JN=1,NACTAERO!ktrac - PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(4)%MP)=SEDOUT_2D(KIDIA:KFDIA,KAERO(JN)) - end do - do JN=1,NACTAERO!KTRAC - PGFL(KIDIA:KFDIA,JN,YAEROUT(5)%MP)=PAERSRC(KIDIA:KFDIA,KAERO(JN)) - end do - PGFL(KIDIA:KFDIA,1,YAEROUT(6)%MP)=PAERFLX(KIDIA:KFDIA,3,9) - PGFL(KIDIA:KFDIA,:,YAEROUT(7)%MP)=0.0_JPRB - ! 1=TOtal SO4 not in use - ! 2 Ammonium not in use - ! 3 Nitrate not in use - do JK=1,KLEV - ! save load for each N/M as one level - ! kg/kg -> kg/m2 N/kg-> N/m2 - - do JN=1,naerocomp!ntrac!NACTAERO - PGFL(KIDIA:KFDIA,ind_oifs_ham%ind_mass_OIFS(JN),YAEROUT(7)%MP)=PGFL(KIDIA:KFDIA,ind_oifs_ham%ind_mass_OIFS(JN),YAEROUT(7)%MP) + (ZXTM1(KIDIA:KFDIA,JK,ind_oifs_ham%IND_mass_HAM(JN))+(ZXTTE(KIDIA:KFDIA,JK,ind_oifs_ham%IND_mass_HAM(JN))*time_step_len)) * ZDPG(KIDIA:KFDIA,JK) - end do - do JN=1,nclass - PGFL(KIDIA:KFDIA,ind_oifs_ham%ind_class_OIFS(JN),YAEROUT(7)%MP)=PGFL(KIDIA:KFDIA,ind_oifs_ham%ind_class_OIFS(JN),YAEROUT(7)%MP)+ (ZXTM1(KIDIA:KFDIA,JK,ind_oifs_ham%IND_class_HAM(JN))+(ZXTTE(KIDIA:KFDIA,JK,ind_oifs_ham%IND_class_HAM(JN))*time_step_len)) * ZDPG(KIDIA:KFDIA,JK) - - - - end do - - end do - - IF (.NOT. LAERCHEM)THEN - PGFL(KIDIA:KFDIA,1,YAEROUT(8)%MP)=ZDDEPFLUX_SO2(KIDIA:KFDIA) ! aergn7 SO4 gas - PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(9)%MP)=PGFL(KIDIA:KFDIA,1:KLEV,YAEROCLIM(1)%MP) - PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(10)%MP)=PGFL(KIDIA:KFDIA,1:KLEV,YAEROCLIM(2)%MP) - PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(11)%MP)=PGFL(KIDIA:KFDIA,1:KLEV,YAEROCLIM(3)%MP) - END IF - PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(12)%MP)=PGFL(KIDIA:KFDIA,1:KLEV,YRE_LIQ%MP9_PH) - PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(13)%MP)=PGFL(KIDIA:KFDIA,1:KLEV,YRE_ICE%MP9_PH) - PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(14)%MP)=PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH) - PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(15)%MP)=PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH) - PGFL(KIDIA:KFDIA,KLEV,YAEROUT(16)%MP)=ZDUMMY(KIDIA:KFDIA,17) !SS CS wdepflux - PGFL(KIDIA:KFDIA,KLEV-1,YAEROUT(16)%MP)=ZDUMMY(KIDIA:KFDIA,7) !SO4 CS wdepflux - PGFL(KIDIA:KFDIA,KLEV-2,YAEROUT(16)%MP)=ZDUMMY(KIDIA:KFDIA,25) !NUM CS wdepflux - - PGFL(KIDIA:KFDIA,KLEV,YAEROUT(17)%MP)=ZDDEPFLUX(KIDIA:KFDIA,25) ! drydep flux NUM CS ham - PGFL(KIDIA:KFDIA,KLEV-1,YAEROUT(17)%MP)=ZDDEPFLUX(KIDIA:KFDIA,17) ! drydep flux SS CS ham - PGFL(KIDIA:KFDIA,KLEV-2,YAEROUT(17)%MP)=ZDDEPFLUX(KIDIA:KFDIA,7) ! drydep flux SO4 CS ham - PGFL(KIDIA:KFDIA,KLEV,YAEROUT(18)%MP)=ZVDEP(KIDIA:KFDIA,25) ! ddepveloc NUM CS ham - PGFL(KIDIA:KFDIA,KLEV-1,YAEROUT(18)%MP)=ZVDEP(KIDIA:KFDIA,17) ! ddepveloc SS CS ham - PGFL(KIDIA:KFDIA,KLEV-2,YAEROUT(18)%MP)=ZVDEP(KIDIA:KFDIA,7) ! ddepveloc SO4 CS ham - PGFL(KIDIA:KFDIA,KLEV,YAEROUT(19)%MP)=ZXTTE(KIDIA:KFDIA,KLEV,3) ! tendency SS CS ham after update surface - PGFL(KIDIA:KFDIA,KLEV-1,YAEROUT(20)%MP)=ZTENCIH(KIDIA:KFDIA,KLEV,17) ! tendency SS CS ham before update surface - PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(21)%MP)=ZXTMD1(KIDIA:KFDIA,1:KLEV,17) ! mix rat SS CS ham before update - - do JN=1,NACTAERO - PGFL(KIDIA:KFDIA,JN,YAEROUT(22)%MP)=DDEPOUT(KIDIA:KFDIA,KLEV,KAERO(JN)) - end do - do JN=1,ntrac - PGFL(KIDIA:KFDIA,JN,YAEROUT(23)%MP)=WDEPOUT(KIDIA:KFDIA,KLEV,JN) - end do - do JN=1,ntrac - PGFL(KIDIA:KFDIA,JN,YAEROUT(24)%MP)=SEDOUT(KIDIA:KFDIA,KLEV,JN) - PGFL(KIDIA:KFDIA,JN,YAEROUT(39)%MP)=ZXTEMS(KIDIA:KFDIA,JN) - end do - do JN=1,subm_ngasspec - PGFL(KIDIA:KFDIA,JN,YAEROUT(25)%MP)=zxtm1(KIDIA:KFDIA,KLEV,ind_oifs_ham%ind_gas_HAM(JN)) - end do - - PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(26)%MP)=ZSEDIFLUX(KIDIA:KFDIA,1:KLEV,25) - - do JN=1,NACTAERO - PGFL(KIDIA:KFDIA,JN,YAEROUT(28)%MP)=PAERSRC(KIDIA:KFDIA,KAERO(JN)) - end do - if (LAERCHEM)THEN - DO JGAS=1,subm_ngasspec - !ZXTM1(JL,JK,ind_gas_HAM(JGAS)) = MAX(0._JPRB,ZCEN(JL,JK,KCHEM(ind_gas_OIFS(JGAS)))) !eehol: remove negative values - !PGFL(KIDIA:KFDIA,JN,YAEROUT(28+JGAS)%MP)=ZCEN(JL,JK,KCHEM(ind_gas_OIFS(JGAS))) - PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(28+JGAS)%MP)= PTENC(KIDIA:KFDIA,1:KLEV,KCHEM(ind_oifs_ham%ind_gas_OIFS(JGAS))) - END DO - ELSE - DO JGAS=1,subm_ngasspec - PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(28+JGAS)%MP)= PTENC(KIDIA:KFDIA,1:KLEV,KAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))) - END DO - - END if - DO IMODE=1,NMOD - PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(30+IMODE)%MP)=RW_MODE(IMODE)%d2(KIDIA:KFDIA,1:KLEV) ! m - ENDDO - if (.not.LAERCHEM)THEN - PGFL(KIDIA:KFDIA,KLEV,YAEROUT(40)%MP)=ZFSO2(KIDIA:KFDIA) ! tendency SS CS ham after update surface - PGFL(KIDIA:KFDIA,KLEV,YAEROUT(41)%MP)=ZFSO4(KIDIA:KFDIA) ! tendency SS CS ham after update surfac - PGFL(KIDIA:KFDIA,KLEV,YAEROUT(42)%MP)=ZFSO4_AQ(KIDIA:KFDIA) ! tendency SS CS ham after update surface - PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(43)%MP)=ZTSO4(KIDIA:KFDIA,1:KLEV,1) ! tendency SS CS ham after update surface - PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(44)%MP)=ZTSO4_AQ(KIDIA:KFDIA,1:KLEV) ! tendency SS CS ham after update surface - PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(45)%MP)=ZTSO2(KIDIA:KFDIA,1:KLEV) ! tendency SS CS ham after update surface - END if + PGFL(KIDIA:KFDIA,1,YAEROUT(6)%MP)=PAERFLX(KIDIA:KFDIA,3,9) + PGFL(KIDIA:KFDIA,:,YAEROUT(7)%MP)=0.0_JPRB + ! 1=TOtal SO4 not in use + ! 2 Ammonium not in use + ! 3 Nitrate not in use + DO JK=1,KLEV + ! save load for each N/M as one level + ! kg/kg -> kg/m2 N/kg-> N/m2 + DO JN=1,NAEROCOMP !ntrac!NACTAERO + JO=ind_oifs_ham%ind_mass_OIFS(JN) ! JO -> index context OIFS + JH=ind_oifs_ham%IND_mass_HAM(JN) ! JH -> index context HAM + JY=YAEROUT(7)%MP + PGFL(KIDIA:KFDIA,JO,JY) = PGFL(KIDIA:KFDIA, JO, JY) + (ZXTM1(KIDIA:KFDIA,JK,JH)+(ZXTTE(KIDIA:KFDIA,JK,JH)*time_step_len)) * ZDPG(KIDIA:KFDIA,JK) + END DO + DO JN=1,NCLASS + JO=ind_oifs_ham%ind_mass_OIFS(JN) ! JO -> index context OIFS + JH=ind_oifs_ham%IND_mass_HAM(JN) ! JH -> index context HAM + JY=YAEROUT(7)%MP + PGFL(KIDIA:KFDIA,JO,JY) = PGFL(KIDIA:KFDIA, JO, JY) + (ZXTM1(KIDIA:KFDIA,JK,JH)+(ZXTTE(KIDIA:KFDIA,JK,JH)*time_step_len)) * ZDPG(KIDIA:KFDIA,JK) + END DO + END DO + IF (.NOT. LAERCHEM) THEN + PGFL(KIDIA:KFDIA,1,YAEROUT(8)%MP) = ZDDEPFLUX_SO2(KIDIA:KFDIA) ! aergn7 SO4 gas + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(9)%MP) = PGFL(KIDIA:KFDIA,1:KLEV,YAEROCLIM(1)%MP) + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(10)%MP) = PGFL(KIDIA:KFDIA,1:KLEV,YAEROCLIM(2)%MP) + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(11)%MP) = PGFL(KIDIA:KFDIA,1:KLEV,YAEROCLIM(3)%MP) + END IF + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(12)%MP) = PGFL(KIDIA:KFDIA,1:KLEV,YRE_LIQ%MP9_PH) + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(13)%MP) = PGFL(KIDIA:KFDIA,1:KLEV,YRE_ICE%MP9_PH) + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(14)%MP) = PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH) + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(15)%MP) = PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH) + PGFL(KIDIA:KFDIA,KLEV,YAEROUT(16)%MP) = ZDUMMY(KIDIA:KFDIA,17) ! SS CS wdepflux + PGFL(KIDIA:KFDIA,KLEV-1,YAEROUT(16)%MP) = ZDUMMY(KIDIA:KFDIA,7) ! SO4 CS wdepflux + PGFL(KIDIA:KFDIA,KLEV-2,YAEROUT(16)%MP) = ZDUMMY(KIDIA:KFDIA,25) ! NUM CS wdepflux + + PGFL(KIDIA:KFDIA,KLEV,YAEROUT(17)%MP) = ZDDEPFLUX(KIDIA:KFDIA,25) ! drydep flux NUM CS ham + PGFL(KIDIA:KFDIA,KLEV-1,YAEROUT(17)%MP) = ZDDEPFLUX(KIDIA:KFDIA,17) ! drydep flux SS CS ham + PGFL(KIDIA:KFDIA,KLEV-2,YAEROUT(17)%MP) = ZDDEPFLUX(KIDIA:KFDIA,7) ! drydep flux SO4 CS ham + PGFL(KIDIA:KFDIA,KLEV,YAEROUT(18)%MP) = ZVDEP(KIDIA:KFDIA,25) ! ddepveloc NUM CS ham + PGFL(KIDIA:KFDIA,KLEV-1,YAEROUT(18)%MP) = ZVDEP(KIDIA:KFDIA,17) ! ddepveloc SS CS ham + PGFL(KIDIA:KFDIA,KLEV-2,YAEROUT(18)%MP) = ZVDEP(KIDIA:KFDIA,7) ! ddepveloc SO4 CS ham + PGFL(KIDIA:KFDIA,KLEV,YAEROUT(19)%MP) = ZXTTE(KIDIA:KFDIA,KLEV,3) ! tendency SS CS ham after update surface + PGFL(KIDIA:KFDIA,KLEV-1,YAEROUT(20)%MP) = ZTENCIH(KIDIA:KFDIA,KLEV,17) ! tendency SS CS ham before update surface + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(21)%MP) = ZXTMD1(KIDIA:KFDIA,1:KLEV,17) ! mix rat SS CS ham before update + + + ! It is not clear when NACTERO and when NTRAC + DO JN=1,NACTAERO + PGFL(KIDIA:KFDIA,JN,YAEROUT(22)%MP)=DDEPOUT(KIDIA:KFDIA,KLEV,KAERO(JN)) + PGFL(KIDIA:KFDIA,JN,YAEROUT(28)%MP)=PAERSRC(KIDIA:KFDIA,KAERO(JN)) + END DO + DO JN=1,NTRAC + PGFL(KIDIA:KFDIA,JN,YAEROUT(23)%MP)=WDEPOUT(KIDIA:KFDIA,KLEV,JN) + PGFL(KIDIA:KFDIA,JN,YAEROUT(24)%MP)=SEDOUT(KIDIA:KFDIA,KLEV,JN) + PGFL(KIDIA:KFDIA,JN,YAEROUT(39)%MP)=ZXTEMS(KIDIA:KFDIA,JN) + END DO + DO JN=1,SUBM_NGASSPEC + PGFL(KIDIA:KFDIA,JN,YAEROUT(25)%MP)=zxtm1(KIDIA:KFDIA,KLEV,ind_oifs_ham%ind_gas_HAM(JN)) + END DO + + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(26)%MP)=ZSEDIFLUX(KIDIA:KFDIA,1:KLEV,25) + + IF (LAERCHEM)THEN + DO JGAS=1,SUBM_NGASSPEC + !ZXTM1(JL,JK,ind_gas_HAM(JGAS)) = MAX(0._JPRB,ZCEN(JL,JK,KCHEM(ind_gas_OIFS(JGAS)))) !eehol: remove negative values + !PGFL(KIDIA:KFDIA,JN,YAEROUT(28+JGAS)%MP)=ZCEN(JL,JK,KCHEM(ind_gas_OIFS(JGAS))) + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(28+JGAS)%MP)= PTENC(KIDIA:KFDIA,1:KLEV,KCHEM(ind_oifs_ham%ind_gas_OIFS(JGAS))) + END DO + !ELSE + ! DO JGAS=1,subm_ngasspec + ! PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(28+JGAS)%MP)= PTENC(KIDIA:KFDIA,1:KLEV,KAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))) + ! ENDDO ENDIF + DO IMODE=1,NMOD + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(30+IMODE)%MP)=RW_MODE(IMODE)%d2(KIDIA:KFDIA,1:KLEV) ! m + ENDDO + + IF (.NOT.LAERCHEM) THEN + PGFL(KIDIA:KFDIA,KLEV,YAEROUT(40)%MP) = ZFSO2(KIDIA:KFDIA) ! tendency SS CS ham after update surface + PGFL(KIDIA:KFDIA,KLEV,YAEROUT(41)%MP) = ZFSO4(KIDIA:KFDIA) ! tendency SS CS ham after update surfac + PGFL(KIDIA:KFDIA,KLEV,YAEROUT(42)%MP) = ZFSO4_AQ(KIDIA:KFDIA) ! tendency SS CS ham after update surface + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(43)%MP) = ZTSO4(KIDIA:KFDIA,1:KLEV,1) ! tendency SS CS ham after update surface + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(44)%MP) = ZTSO4_AQ(KIDIA:KFDIA,1:KLEV) ! tendency SS CS ham after update surface + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(45)%MP) = ZTSO2(KIDIA:KFDIA,1:KLEV) ! tendency SS CS ham after update surface + END IF + +ENDIF + !------------------------------------------------------------------------------ !* 9. RELEASE LOCAL MEMORY ! -------------------- !DEALLOCATE( ZAERSRC ) - if (allocated(ZAERNGT ) ) DEALLOCATE( ZAERNGT ) +IF (ALLOCATED(ZAERNGT ) ) DEALLOCATE( ZAERNGT ) !DEALLOCATE( ZAERSCC ) - if (allocated(ZWPDF ) )DEALLOCATE( ZWPDF ) - if (allocated(ZW ) )DEALLOCATE( ZW ) - if (allocated(ZRC) ) DEALLOCATE( ZRC ) - if (allocated(ZSMAX)) DEALLOCATE( ZSMAX ) - +IF (ALLOCATED(ZWPDF ) ) DEALLOCATE( ZWPDF ) +IF (ALLOCATED(ZW ) ) DEALLOCATE( ZW ) +IF (ALLOCATED(ZRC) ) DEALLOCATE( ZRC ) +IF (ALLOCATED(ZSMAX)) DEALLOCATE( ZSMAX ) DO IMODE=1,NMOD - if (associated(RW_MODE(IMODE)%d2)) DEALLOCATE(RW_MODE(IMODE)%d2) - if (associated(DENS_MODE(IMODE)%d2)) DEALLOCATE(DENS_MODE(IMODE)%d2) + IF (ASSOCIATED(RW_MODE(IMODE)%D2)) DEALLOCATE(RW_MODE(IMODE)%D2) + IF (ASSOCIATED(DENS_MODE(IMODE)%D2)) DEALLOCATE(DENS_MODE(IMODE)%D2) ENDDO DO IMODE=1,NMOD - IF (sizeclass(IMODE)%lsoluble) THEN - if (associated(RWD_MODE(IMODE)%d2)) DEALLOCATE(RWD_MODE(IMODE)%d2) - if (associated(H2O_MODE(IMODE)%d2)) DEALLOCATE(H2O_MODE(IMODE)%d2) + IF (SIZECLASS(IMODE)%LSOLUBLE) THEN + IF (ASSOCIATED(RWD_MODE(IMODE)%D2)) DEALLOCATE(RWD_MODE(IMODE)%D2) + IF (ASSOCIATED(H2O_MODE(IMODE)%D2)) DEALLOCATE(H2O_MODE(IMODE)%D2) END IF ENDDO -!if (allocated(reffi)) DEALLOCATE( reffi ) -!if (allocated(reffl)) DEALLOCATE( reffl ) -!if (allocated(w_large)) DEALLOCATE( w_large ) -!if (allocated(w_turb)) DEALLOCATE( w_turb ) - - END ASSOCIATE END ASSOCIATE -IF (LHOOK) CALL DR_HOOK('TM5M7',1,ZHOOK_HANDLE) +IF (LHOOK) CALL DR_HOOK('HAMM7_INTERFACE',1,ZHOOK_HANDLE) END SUBROUTINE HAMM7_INTERFACE - diff --git a/ifs-source/arpifs/phys_radi/radiation_scheme.F90 b/ifs-source/arpifs/phys_radi/radiation_scheme.F90 index 14172a4a..c9fff673 100644 --- a/ifs-source/arpifs/phys_radi/radiation_scheme.F90 +++ b/ifs-source/arpifs/phys_radi/radiation_scheme.F90 @@ -6,26 +6,26 @@ ! granted to it by virtue of its status as an intergovernmental organisation ! nor does it submit to any jurisdiction SUBROUTINE RADIATION_SCHEME & - & (YDMODEL,KIDIA, KFDIA, KLON, KLEV, KAEROSOL, & - & PSOLAR_IRRADIANCE, & - & PMU0, PTEMPERATURE_SKIN, PALBEDO_DIF, PALBEDO_DIR, & - & PSPECTRALEMISS, & - & PCCN_LAND, PCCN_SEA, & - & PGELAM, PGEMU, PLAND_SEA_MASK, & - & PPRESSURE, PTEMPERATURE, & - & PPRESSURE_H, PTEMPERATURE_H, & - & PQ, PCO2, PCH4, PN2O, PNO2, PCFC11, PCFC12, PHCFC22, PCCL4, PO3_DP, & - & PCLOUD_FRAC, PQ_LIQUID, PQ_ICE, PQ_RAIN, PQ_SNOW, & - & PAEROSOL_OLD, PAEROSOL, & - & PFLUX_SW, PFLUX_LW, PFLUX_SW_CLEAR, PFLUX_LW_CLEAR, & - & PFLUX_SW_DN, PFLUX_LW_DN, PFLUX_SW_DN_CLEAR, PFLUX_LW_DN_CLEAR, & - & PFLUX_DIR, PFLUX_DIR_CLEAR, PFLUX_DIR_INTO_SUN, & - & PFLUX_UV, PFLUX_PAR, PFLUX_PAR_CLEAR, & - & PFLUX_SW_DN_TOA, PEMIS_OUT, PLWDERIVATIVE, & - & PSWDIFFUSEBAND, PSWDIRECTBAND, & - & PAEROM7_TAU, PAEROM7_SSA, PAEROM7_ASYM, & ! add for M7 aerosol - & PRE_LIQ, PRE_ICE, & - & PPERT, PFSD) + & (YDMODEL,KIDIA, KFDIA, KLON, KLEV, KAEROSOL, & + & PSOLAR_IRRADIANCE, & + & PMU0, PTEMPERATURE_SKIN, PALBEDO_DIF, PALBEDO_DIR, & + & PSPECTRALEMISS, & + & PCCN_LAND, PCCN_SEA, & + & PGELAM, PGEMU, PLAND_SEA_MASK, & + & PPRESSURE, PTEMPERATURE, & + & PPRESSURE_H, PTEMPERATURE_H, & + & PQ, PCO2, PCH4, PN2O, PNO2, PCFC11, PCFC12, PHCFC22, PCCL4, PO3_DP, & + & PCLOUD_FRAC, PQ_LIQUID, PQ_ICE, PQ_RAIN, PQ_SNOW, & + & PAEROSOL_OLD, PAEROSOL, & + & PFLUX_SW, PFLUX_LW, PFLUX_SW_CLEAR, PFLUX_LW_CLEAR, & + & PFLUX_SW_DN, PFLUX_LW_DN, PFLUX_SW_DN_CLEAR, PFLUX_LW_DN_CLEAR, & + & PFLUX_DIR, PFLUX_DIR_CLEAR, PFLUX_DIR_INTO_SUN, & + & PFLUX_UV, PFLUX_PAR, PFLUX_PAR_CLEAR, & + & PFLUX_SW_DN_TOA, PEMIS_OUT, PLWDERIVATIVE, & + & PSWDIFFUSEBAND, PSWDIRECTBAND, & + & PAEROM7_TAU, PAEROM7_SSA, PAEROM7_ASYM, & ! added for M7 aerosol + & PRE_LIQ, PRE_ICE, & + & PPERT, PFSD) ! RADIATION_SCHEME - Interface to modular radiation scheme ! @@ -83,9 +83,10 @@ SUBROUTINE RADIATION_SCHEME & USE RADIATION_CONFIG, ONLY : ISOLVERSPARTACUS USE RADIATION_SINGLE_LEVEL, ONLY : SINGLE_LEVEL_TYPE USE RADIATION_THERMODYNAMICS, ONLY : THERMODYNAMICS_TYPE -USE RADIATION_GAS, ONLY : GAS_TYPE,& - & IMASSMIXINGRATIO, IVOLUMEMIXINGRATIO,& - & IH2O, ICO2, ICH4, IN2O, ICFC11, ICFC12, IHCFC22, ICCL4, IO3, IO2 +USE RADIATION_GAS, ONLY : GAS_TYPE, & + & IMASSMIXINGRATIO, IVOLUMEMIXINGRATIO, & + & IH2O, ICO2, ICH4, IN2O, ICFC11, ICFC12, & + & IHCFC22, ICCL4, IO3, IO2 USE RADIATION_CLOUD, ONLY : CLOUD_TYPE USE RADIATION_AEROSOL, ONLY : AEROSOL_TYPE USE RADIATION_FLUX, ONLY : FLUX_TYPE @@ -283,22 +284,23 @@ SUBROUTINE RADIATION_SCHEME & IF (LHOOK) CALL DR_HOOK('RADIATION_SCHEME',0,ZHOOK_HANDLE) -ASSOCIATE(YDRADIATION=>YDMODEL%YRML_PHY_RAD%YRADIATION, & - & YRERAD=>YDMODEL%YRML_PHY_RAD%YRERAD, & - & YDSPP_CONFIG=>YDMODEL%YRML_GCONF%YRSPP_CONFIG, & - & YDEAERATM=>YDMODEL%YRML_PHY_RAD%YREAERATM, & - & YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO) -ASSOCIATE(NCLOUDACT=>YRERAD%NCLOUDACT, RAD_CONFIG=>YDRADIATION%RAD_CONFIG, & - & NWEIGHT_UV=>YDRADIATION%NWEIGHT_UV, & - & IBAND_UV =>YDRADIATION%IBAND_UV(:), & - & WEIGHT_UV =>YDRADIATION%WEIGHT_UV(:), & - & NWEIGHT_PAR=>YDRADIATION%NWEIGHT_PAR, & - & IBAND_PAR =>YDRADIATION%IBAND_PAR(:), & - & WEIGHT_PAR=>YDRADIATION%WEIGHT_PAR(:), & - & TROP_BG_AER_MASS_EXT=>YDRADIATION%TROP_BG_AER_MASS_EXT, & - & STRAT_BG_AER_MASS_EXT=>YDRADIATION%STRAT_BG_AER_MASS_EXT, & - & REPSCAER=>YDEAERATM%REPSCAER, & - & AERO_SCHEME=>YDCOMPO%AERO_SCHEME) +ASSOCIATE(YDRADIATION => YDMODEL%YRML_PHY_RAD%YRADIATION, & + & YRERAD => YDMODEL%YRML_PHY_RAD%YRERAD, & + & YDSPP_CONFIG => YDMODEL%YRML_GCONF%YRSPP_CONFIG, & + & YDEAERATM => YDMODEL%YRML_PHY_RAD%YREAERATM, & + & YDCOMPO => YDMODEL%YRML_CHEM%YRCOMPO) +ASSOCIATE(NCLOUDACT => YRERAD%NCLOUDACT, & + & RAD_CONFIG => YDRADIATION%RAD_CONFIG, & + & NWEIGHT_UV => YDRADIATION%NWEIGHT_UV, & + & IBAND_UV => YDRADIATION%IBAND_UV(:), & + & WEIGHT_UV => YDRADIATION%WEIGHT_UV(:), & + & NWEIGHT_PAR => YDRADIATION%NWEIGHT_PAR, & + & IBAND_PAR => YDRADIATION%IBAND_PAR(:), & + & WEIGHT_PAR => YDRADIATION%WEIGHT_PAR(:), & + & TROP_BG_AER_MASS_EXT => YDRADIATION%TROP_BG_AER_MASS_EXT, & + & STRAT_BG_AER_MASS_EXT => YDRADIATION%STRAT_BG_AER_MASS_EXT, & + & REPSCAER => YDEAERATM%REPSCAER, & + & AERO_SCHEME => YDCOMPO%AERO_SCHEME) ! Allocate memory in radiation objects CALL SINGLE_LEVEL%ALLOCATE(KLON, YRERAD%NSW, YRERAD%NLWEMISS, & @@ -306,16 +308,19 @@ SUBROUTINE RADIATION_SCHEME & CALL THERMODYNAMICS%ALLOCATE(KLON, KLEV, USE_H2O_SAT=.TRUE.) CALL GAS%ALLOCATE(KLON, KLEV) CALL YLCLOUD%ALLOCATE(KLON, KLEV) -!write(*,*) "YDMODEL%YRML_PHY_RAD%YREAERATM%LAERCCN",YDMODEL%YRML_PHY_RAD%YREAERATM%LAERCCN -!write(*,*) "YDMODEL%YRML_PHY_RAD%YREAERATM%LAERRRTM",YDMODEL%YRML_PHY_RAD%YREAERATM%LAERRRTM -!write(*,*) "YRERAD%NAERMACC",YRERAD%NAERMACC -IF (YDMODEL%YRML_PHY_RAD%YREAERATM%LAERCCN & - & .OR. YDMODEL%YRML_PHY_RAD%YREAERATM%LAERRRTM & - & .OR. YRERAD%NAERMACC == 1) THEN - IF ( TRIM(AERO_SCHEME) == "hamm7" ) THEN + +! LAERCCN -> .T. if we use prognostic aerosols to define the Re of liq.wat.clds +! LAERRRTM -> .T. if RRTM uses information from prognostic aerosols +! NAERMACC -> 0 => Tegen climatology || 1 => MACC based climatology +IF (YDEAERATM%LAERCCN .OR. YDEAERATM%LAERRRTM .OR. YRERAD%NAERMACC == 1) THEN + ! For "aer" and MACC clim. -> allocates arrays mixing-ratio -> used to calc. opt. prop. + ! For "hamm7" -> allocates directly arrays of optical properties if used by RRTM + ! else we fallback on MACC clim. + IF ( TRIM(AERO_SCHEME) == "hamm7" .AND. YDEAERATM%LAERRRTM ) THEN CALL AEROSOL%ALLOCATE_DIRECT(RAD_CONFIG, KLON, 1, KLEV) ELSE - CALL AEROSOL%ALLOCATE(KLON, 1, KLEV, KAEROSOL) ! MACC aerosols (Number of columns,istartlev, iendlev, number of SW+LW bands) + CALL AEROSOL%ALLOCATE(KLON, 1, KLEV, KAEROSOL) + ! MACC aerosols (Number of columns, istartlev, iendlev, number of SW+LW bands) ENDIF ELSE CALL AEROSOL%ALLOCATE(KLON, 1, KLEV, 6) ! Tegen climatology @@ -428,16 +433,11 @@ SUBROUTINE RADIATION_SCHEME & YLCLOUD%Q_ICE(KIDIA:KFDIA,:) = PQ_ICE(KIDIA:KFDIA,:) + PQ_SNOW(KIDIA:KFDIA,:) YLCLOUD%FRACTION(KIDIA:KFDIA,:) = PCLOUD_FRAC(KIDIA:KFDIA,:) - - - - +! Get/Compute effective radii and convert to metres IF(NCLOUDACT > 0) THEN ZRE_LIQUID_UM(KIDIA:KFDIA,:) = MAX(2.0E-06_JPRB, PRE_LIQ(KIDIA:KFDIA,:)) * 1.E6_JPRB ZRE_ICE_UM(KIDIA:KFDIA,:) = PRE_ICE(KIDIA:KFDIA,:) * 1.E6_JPRB ELSE -! Compute effective radii and convert to metres - CALL LIQUID_EFFECTIVE_RADIUS(YDMODEL%YRML_PHY_RAD%YRERAD, & & YDMODEL%YRML_PHY_EC%YRECLDP,YDSPP_CONFIG,YDMODEL%YRML_GCONF%YGFL, & & KIDIA, KFDIA, KLON, KLEV, & @@ -493,9 +493,9 @@ SUBROUTINE RADIATION_SCHEME & ! Compute cloud overlap parameter from decorrelation length RAD_CONFIG%CLOUD_INHOM_DECORR_SCALING = ZDECORR_LEN_RATIO DO JLON = KIDIA,KFDIA - CALL YLCLOUD%SET_OVERLAP_PARAM(THERMODYNAMICS,& - & ZDECORR_LEN_KM(JLON)*1000.0_JPRB,& - & ISTARTCOL=JLON, IENDCOL=JLON) + CALL YLCLOUD%SET_OVERLAP_PARAM( THERMODYNAMICS, & + & ZDECORR_LEN_KM(JLON)*1000.0_JPRB, & + & ISTARTCOL=JLON, IENDCOL=JLON) ENDDO ! Cloud water content fractional standard deviation is configurable @@ -538,20 +538,17 @@ SUBROUTINE RADIATION_SCHEME & ! kg m-2, needed to scale some of the aerosol inputs CALL THERMODYNAMICS%GET_LAYER_MASS(KIDIA,KFDIA,ZLAYER_MASS) -! Copy over aerosol mass mixing ratio -IF (YDMODEL%YRML_PHY_RAD%YREAERATM%LAERCCN & - & .OR. YDMODEL%YRML_PHY_RAD%YREAERATM%LAERRRTM & - & .OR. YRERAD%NAERMACC == 1) THEN +! Copy over aerosol mass mixing ratio or optical properties +IF ( YDEAERATM%LAERCCN .OR. YDEAERATM%LAERRRTM .OR. YRERAD%NAERMACC == 1) then IF ( .NOT. AEROSOL%is_direct) THEN - - ! MACC aerosol from climatology or prognostic aerosol variables - + ! MACC aerosol from climatology or prognostic AER aerosol variables - ! this is already in mass mixing ratio units with the required array ! orientation so we can copy it over directly ! AB need to cap the minimum mass mixing ratio/AOD to avoid instability ! in case of negative values in input - DO JAER = 1,KAEROSOL - DO JLEV = 1,KLEV + DO JAER = 1,KAEROSOL + DO JLEV = 1,KLEV DO JLON = KIDIA,KFDIA AEROSOL%MIXING_RATIO(JLON,JLEV,JAER) = MAX(PAEROSOL(JLON,JLEV,JAER),0.0_JPRB) ENDDO @@ -574,7 +571,38 @@ SUBROUTINE RADIATION_SCHEME & & / (ZLAYER_MASS * STRAT_BG_AER_MASS_EXT) ENDIF ENDIF - ENDIF + ELSE ! AEROSOL%IS_DIRECT=TRUE, which occurs only if "hamm7" .and. LAERRRTM=T + + ! Copy optical properties of HAMM7 aerosols + + ! reset + IF (RAD_CONFIG%DO_SW) THEN + AEROSOL%OD_SW(1:YRERAD%NTSW,:,KIDIA:KFDIA) = 0.0_JPRB + AEROSOL%SSA_SW(1:YRERAD%NTSW,:,KIDIA:KFDIA) = 0.0_JPRB + AEROSOL%G_SW(1:YRERAD%NTSW,:,KIDIA:KFDIA) = 0.0_JPRB + ENDIF + IF (RAD_CONFIG%DO_LW) THEN + AEROSOL%OD_LW(1:YRERAD%NTSW,:,KIDIA:KFDIA) = 0.0_JPRB + ENDIF + + ! fill with M7 values + IF (YRERAD%NAEROOPT > 0) THEN + IF (RAD_CONFIG%DO_SW) THEN + DO JAER = 1,YRERAD%NTSW + DO JLEV = 1,KLEV + DO JLON = KIDIA,KFDIA + AEROSOL%OD_SW(JAER,JLEV,JLON) = PAEROM7_TAU(JLON,JLEV,JAER) + AEROSOL%SSA_SW(JAER,JLEV,JLON) = PAEROM7_SSA(JLON,JLEV,JAER) + AEROSOL%G_SW(JAER,JLEV,JLON) = PAEROM7_ASYM(JLON,JLEV,JAER) + ENDDO + ENDDO + ENDDO + ENDIF + IF (RAD_CONFIG%DO_LW) THEN + AEROSOL%OD_LW = REPSCAER ! Min value. FIXME TODO need update + ENDIF + ENDIF + ENDIF ELSE ! Tegen aerosol climatology - the array PAEROSOL_OLD contains the @@ -594,38 +622,7 @@ SUBROUTINE RADIATION_SCHEME & ENDDO ENDDO -ENDIF - -! Optical properties of HAM aerosols -IF ( AEROSOL%IS_DIRECT) THEN - ! reset - IF (RAD_CONFIG%DO_SW) THEN - AEROSOL%OD_SW(1:YRERAD%NTSW,:,KIDIA:KFDIA) = 0.0_JPRB - AEROSOL%SSA_SW(1:YRERAD%NTSW,:,KIDIA:KFDIA) = 0.0_JPRB - AEROSOL%G_SW(1:YRERAD%NTSW,:,KIDIA:KFDIA) = 0.0_JPRB - ENDIF - IF (RAD_CONFIG%DO_LW) THEN - AEROSOL%OD_LW(1:YRERAD%NTSW,:,KIDIA:KFDIA) = 0.0_JPRB - ENDIF - - ! fill with M7 values -> - IF (YRERAD%NAEROOPT>0) THEN - IF (RAD_CONFIG%DO_SW) THEN - DO JAER = 1,YRERAD%NTSW - DO JLEV = 1,KLEV - DO JLON = KIDIA,KFDIA - AEROSOL%OD_SW(JAER,JLEV,JLON) = PAEROM7_TAU(JLON,JLEV,JAER) - AEROSOL%SSA_SW(JAER,JLEV,JLON) = PAEROM7_SSA(JLON,JLEV,JAER) - AEROSOL%G_SW(JAER,JLEV,JLON) = PAEROM7_ASYM(JLON,JLEV,JAER) - ENDDO - ENDDO - ENDDO - ENDIF - IF (RAD_CONFIG%DO_LW) THEN - AEROSOL%OD_LW = REPSCAER ! TODO for debugging, need update - ENDIF - ENDIF -ENDIF +ENDIF ! Convert ozone Pa*kg/kg to kg/kg diff --git a/ifs-source/arpifs/phys_radi/radintg.F90 b/ifs-source/arpifs/phys_radi/radintg.F90 index 616068dc..0f8ee4d3 100644 --- a/ifs-source/arpifs/phys_radi/radintg.F90 +++ b/ifs-source/arpifs/phys_radi/radintg.F90 @@ -10,23 +10,22 @@ #ifdef RS6K @PROCESS NOCHECK #endif -SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& - & PALBD , PALBP , PCCNL , PCCNO,& - & PAPRS , PAPRSF, PCCO2 , PCLFR,& - & PQO3 , PAER , PAERMACCS,PAERMACCL,PAERMACCSJ,PAERMACCLJ,& - & PAERTGS,PAERTGL, PAERO , PGHG,& - & PAEROTAU,PAEROSSA, PAEROASYM, PAEROTAULW,& - & PDP , PSPECTRALEMISS,& - & PMU0 , PQ,& - & PQS , PQIWP , PQSWP , PQLWP , PFSDP , PQRAIN, PRAINT, PSLM , PT,& - & PECPO3, PTS,& - & PEMTD , PEMTU , PTRSO , PTRSC , PEMTC , PNTOP , PNBAS,& - & PPERTT,& - & PEMIT , PTH , PFRTED, PTRSOD, PTRSODC, PEMTDC,& - & PSUDU , PUVDF , PPARF , PPARCF, PTINCF,& - & PFDIR , PCDIR , PLWDERIVATIVE, & - & PRE_LIQ, PRE_ICE ) - +SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE, & + & PALBD , PALBP , PCCNL , PCCNO, & + & PAPRS , PAPRSF, PCCO2 , PCLFR, & + & PQO3 , PAER , PAERMACCS, PAERMACCL, PAERMACCSJ, PAERMACCLJ, & + & PAERTGS,PAERTGL, PAERO , PGHG, & + & PAEROTAU,PAEROSSA, PAEROASYM, PAEROTAULW, & + & PDP , PSPECTRALEMISS, & + & PMU0 , PQ, & + & PQS , PQIWP , PQSWP , PQLWP , PFSDP , PQRAIN, PRAINT, PSLM, PT, & + & PECPO3, PTS, & + & PEMTD , PEMTU , PTRSO , PTRSC , PEMTC , PNTOP , PNBAS, & + & PPERTT, & + & PEMIT , PTH , PFRTED, PTRSOD, PTRSODC, PEMTDC, & + & PSUDU , PUVDF , PPARF , PPARCF, PTINCF, & + & PFDIR , PCDIR , PLWDERIVATIVE, & + & PRE_LIQ, PRE_ICE ) !**** *RADINTG* - RADIATION INTERFACE TO ACTUAL RADIATION SCHEME @@ -349,11 +348,13 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& INTEGER(KIND=JPIM) :: IL0S(YDMODEL%YRML_PHY_RAD%YRERAD%NRPROMA,1,0:3) INTEGER(KIND=JPIM) :: IL0ULI(YDMODEL%YRML_PHY_RAD%YRERAD%NRPROMA,2,2), IL0UDI(YDMODEL%YRML_PHY_RAD%YRERAD%NRPROMA,0:3,0:3) -INTEGER(KIND=JPIM) :: I,IBEG,IEND,IB,IL,I1,I2,IM,IMD,IRD,ICNT,& - & J,JAERO,JARP,JIR,JB,JK,JL,JM,JN,JLEV,JRL,JSW,JLW,JSTGLO,JFLD,JGL,& - & INEXT,IINBEG,IINEND,IOUTBEG,IOUTEND,IFLD,IARP,& - & IFLDSIN,IFLDSOUT,IFLDSTOT,IGPBLKS,IGPBLKS_RAD,IGI,IGIX,& - & IWIS,IFLDN,IFLDX,IGLGLO , ISUPP +INTEGER(KIND=JPIM) :: I, IBEG, IEND, IB, IL, I1, I2, IM, IMD, IRD, & + & J, JARP, JIR, JB, JK, JL, JM, JN, JLEV, JRL, & + & JSW, JLW, JSTGLO, JFLD, JGL, JAERO, & + & INEXT, IINBEG, IINEND, IOUTBEG, IOUTEND, IFLD, ICNT, & + & IARP, IFLDSIN, IFLDSOUT, IFLDSTOT, IGPBLKS, IGPBLKS_RAD, & + & IGI, IGIX, IWIS, IFLDN, IFLDX, IGLGLO, & + & ISUPP INTEGER(KIND=JPIM) :: IFIXRADFLD(2) @@ -361,15 +362,17 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& !INTEGER(KIND=JPIM) :: JAER !-- debug -INTEGER(KIND=JPIM) :: IMU0,IAMU0,IEMISS,ITS,ISLM,IBAS,ITOP,& - & IFRSOD,IFRTED,IFRSODC,IFRTEDC,IEMIT,& - & ISUDU,IUVDF,IPARF,IPARCF,ITINCF,IFDIR,IFDIF,ICDIR,& - & ILWDERIVATIVE,ISWDIRECTBAND,ISWDIFFUSEBAND,& - & IALD,IALP,ITI,IPR,IQS,IWV,ICLC,ILWA,IIWA,ISWA,IRWA,& - & IRRA,IDP,IOZ,IHTI,IHPR,IFRSO,ISWFC,IFRTH,ILWFC,IAE,IAER,IAERO,IPERT,& - & IAPRS,IGELAM,IGEMU,ICLON,ISLON,IECPO3,ICCNL,ICCNO,& - & ICO2,ICH4,IN2O,INO2,IC11,IC12,IC22,ICL4,IFSD,& - & IHAMAEROAOD,IHAMAEROSSA,IHAMAEROASYM!,IHAMAEROAODLW +INTEGER(KIND=JPIM) :: IMU0, IAMU0, IEMISS, ITS, ISLM, IBAS, ITOP, & + & IFRSOD, IFRTED, IFRSODC, IFRTEDC, IEMIT, ISUDU, IUVDF, & + & IPARF, IPARCF, ITINCF, IFDIR, IFDIF, ICDIR, IALD, & + & IALP, ITI, IPR, IQS, IWV, ICLC, ILWA, & + & IIWA, ISWA, IRWA, IRRA, IDP, IOZ, IHTI, & + & IHPR, IFRSO, ISWFC, IFRTH, ILWFC, IAE, IAER, & + & IAERO, IPERT, IAPRS, IGELAM, IGEMU, ICLON, ISLON, & + & IECPO3, ICCNL, ICCNO, ICO2, ICH4, IN2O, INO2, & + & IC11, IC12, IC22, ICL4, IFSD, & + & ILWDERIVATIVE, ISWDIRECTBAND, ISWDIFFUSEBAND, & + & IHAMAEROAOD, IHAMAEROSSA, IHAMAEROASYM !,IHAMAEROAODLW INTEGER(KIND=JPIM) :: IRE_LIQ, IRE_ICE @@ -379,9 +382,6 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& LOGICAL, parameter :: LLDEBUG = .false. LOGICAL, parameter :: LLDEBUGRW = .false. LOGICAL :: LLINC, LLDOLAST, LLERROR, LLREAD, LLPRINT, LLACTAERO -! BEN - introduce flag to activate aerosols in the radiation code -LOGICAL :: LLAERORAD - LOGICAL :: LLSPPRAD ! local switch for SPP scheme INTEGER(KIND=JPIM) :: IRADAER, IRADAER2 @@ -457,9 +457,11 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& ! ------------------------------------------------------------------ IF (LHOOK) CALL DR_HOOK('RADINTG',0,ZHOOK_HANDLE) -ASSOCIATE(YDDIM=>YDGEOMETRY%YRDIM,YDDIMV=>YDGEOMETRY%YRDIMV,YDGEM=>YDGEOMETRY%YRGEM, YDMP=>YDGEOMETRY%YRMP, & - & YDGSGEOM_NB=>YDGEOMETRY%YRGSGEOM_NB, YDHSLMER=>YDMODEL%YRML_DYN%YRSLINT%YRHSLMER, YDLAP=>YDGEOMETRY%YRLAP, & - & YDCSGLEG=>YDGEOMETRY%YRCSGLEG, YDVAB=>YDGEOMETRY%YRVAB, YDVETA=>YDGEOMETRY%YRVETA, & +ASSOCIATE(& + & YDDIM=>YDGEOMETRY%YRDIM,YDDIMV=>YDGEOMETRY%YRDIMV, & + & YDGEM=>YDGEOMETRY%YRGEM, YDMP=>YDGEOMETRY%YRMP, & + & YDGSGEOM_NB=>YDGEOMETRY%YRGSGEOM_NB, YDHSLMER=>YDMODEL%YRML_DYN%YRSLINT%YRHSLMER, YDLAP=>YDGEOMETRY%YRLAP, & + & YDCSGLEG=>YDGEOMETRY%YRCSGLEG, YDVAB=>YDGEOMETRY%YRVAB, YDVETA=>YDGEOMETRY%YRVETA, & & YDVFE=>YDGEOMETRY%YRVFE, YDSTA=>YDGEOMETRY%YRSTA, & & YDCSGEOM=>YDGEOMETRY%YRCSGEOM, & & YDCSGEOM_NB=>YDGEOMETRY%YRCSGEOM_NB, YDSPGEOM=>YDGEOMETRY%YSPGEOM, YDPHY=>YDMODEL%YRML_PHY_MF%YRPHY, & @@ -473,7 +475,8 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& & RADGRID=>YDMODEL%YRML_PHY_RAD%RADGRID, YDRI=>YDMODEL%YRML_PHY_RAD%YRRI, YDRO=>YDMODEL%YRML_PHY_RAD%YRRO, & & YDSPP_CONFIG=>YDMODEL%YRML_GCONF%YRSPP_CONFIG) -ASSOCIATE(NACTAERO=>YGFL%NACTAERO, NAERO=>YGFL%NAERO, YO3=>YGFL%YO3, & +ASSOCIATE(& + & NACTAERO=>YGFL%NACTAERO, NAERO=>YGFL%NAERO, YO3=>YGFL%YO3, & & NDGLG=>YDDIM%NDGLG, NRESOL=>YDDIM%NRESOL, NSMAX=>YDDIM%NSMAX, & & NSPEC2=>YDDIM%NSPEC2, NUMP=>YDDIM%NUMP, & & REPSCAER=>YDEAERATM%REPSCAER, & @@ -512,7 +515,6 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& !* 1. PREPARATORY WORK ! ---------------- -WRITE(NULOUT,'(a)') 'Calling radiation scheme (RADINTG)' ZEPSILON=1000._JPRB*TINY(ZEPSILON) @@ -588,8 +590,6 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& ELSE IRADAER=12 !dummy in this case, not used. ENDIF -!BEN -LLAERORAD=.FALSE. !* 1.01 PARAMETERS EXTRACTED FROM COMDECKS (NON-TRANSPORTABLE) ! ------------------------------------------------------ @@ -822,6 +822,7 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& ELSE ALLOCATE(ZRGP(NRPROMA,IFLDSTOT,IGPBLKS)) ENDIF + ZRGP=0.0_JPRB ALLOCATE(ZDGEMU(NRPROMA,IGPBLKS)) ZDGEMU=0.0_JPRB @@ -995,18 +996,18 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& !ELSE DO JAERO=1,YDMODEL%YRML_PHY_RAD%YRERAD%NTSW IAE=(JAERO-1)*KLEV - ZRGP(1:IL,IHAMAEROAOD+IAE:IHAMAEROAOD+IAE+KLEV-1,IB) =MAX(REPSCAER, PAEROTAU(IBEG:IEND,1:KLEV,JAERO)) + ZRGP(1:IL,IHAMAEROAOD+IAE:IHAMAEROAOD+IAE+KLEV-1,IB) = MAX(REPSCAER, PAEROTAU(IBEG:IEND,1:KLEV,JAERO)) !REPSCAER is needed to avoid corruption in radiation_scheme ENDDO DO JAERO=1,YDMODEL%YRML_PHY_RAD%YRERAD%NTSW IAE=(JAERO-1)*KLEV - ZRGP(1:IL,IHAMAEROSSA+IAE:IHAMAEROSSA+IAE+KLEV-1,IB) =MAX(0._JPRB,PAEROSSA(IBEG:IEND,1:KLEV,JAERO)) + ZRGP(1:IL,IHAMAEROSSA+IAE:IHAMAEROSSA+IAE+KLEV-1,IB) = MAX(0._JPRB,PAEROSSA(IBEG:IEND,1:KLEV,JAERO)) ENDDO DO JAERO=1,YDMODEL%YRML_PHY_RAD%YRERAD%NTSW IAE=(JAERO-1)*KLEV - ZRGP(1:IL,IHAMAEROASYM+IAE:IHAMAEROASYM+IAE+KLEV-1,IB) =MAX(0._JPRB, PAEROASYM(IBEG:IEND,1:KLEV,JAERO)) + ZRGP(1:IL,IHAMAEROASYM+IAE:IHAMAEROASYM+IAE+KLEV-1,IB) = MAX(0._JPRB, PAEROASYM(IBEG:IEND,1:KLEV,JAERO)) ENDDO !DO JAERO=1,STRATO_CMIP6_NTB @@ -1994,6 +1995,8 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& ! OUTPUT LOOP +WRITE(NULOUT,'("RADINTG: AFTER OUTPUTS INTERPOLATION!")') + CALL GSTATS(1213,0) !$OMP PARALLEL DO SCHEDULE(STATIC) & !$OMP& PRIVATE(JSTGLO,JK,IBEG,IEND,IL,IB,JSW,& diff --git a/ifs-source/arpifs/phys_radi/suecrad.F90 b/ifs-source/arpifs/phys_radi/suecrad.F90 index f27ad0ef..e621030c 100644 --- a/ifs-source/arpifs/phys_radi/suecrad.F90 +++ b/ifs-source/arpifs/phys_radi/suecrad.F90 @@ -269,7 +269,7 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) & LAER3D, LINTERPINCLOUDMEAN INTEGER(KIND=JPIM), POINTER :: NICEOPT, NLIQOPT, NSWICEOPT, NLWICEOPT, NSWLIQOPT,& - & NLWLIQOPT, NMCICA, NRADIP, NRADLP, NCLOUDACT,NAEROOPT, & + & NLWLIQOPT, NMCICA, NRADIP, NRADLP, NCLOUDACT, NAEROOPT, & & NREDGLW, NREDGSW, NAER, NMODE, NOZOCL, NINHOM, NLAYINH, NOVLP, NSW,& & NRADFR, NLNGR1H, NRADELG, NRADPFR, NRADPLA, NRPROMA, NRADINT, NRADRES,& & NGHGRAD, NDECOLAT, NMINICE, NVOLCVERT, NPERTAER, NPERTOZ, NHINCSOL, NSCEN,& @@ -349,8 +349,8 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) & LRAY=>YDPHY%LRAY, LRAYFM=>YDPHY%LRAYFM,LRAYFM15=>YDPHY%LRAYFM15,& & LPHYLIN=>YDMODEL%YRML_PHY_SLIN%YREPHLI%LPHYLIN, & & LHLRADUPD=>YDPHY%LHLRADUPD, RADGR=>YDPARAR%RADGR, RADSN=>YDPARAR%RADSN) -! Associate pointers for variables in namelist NAERAD +! Associate pointers for variables in namelist NAERAD NCLOUDACT => YDERAD%NCLOUDACT NAEROOPT => YDERAD%NAEROOPT @@ -463,6 +463,7 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) RCLOUD_SEPARATION_SCALE_TOA => YDERAD%RCLOUD_SEPARATION_SCALE_TOA RCLOUD_SEPARATION_SCALE_SURF => YDERAD%RCLOUD_SEPARATION_SCALE_SURF LFU_LW_ICE_OPTICS_BUG => YDERAD%LFU_LW_ICE_OPTICS_BUG + NSOLARSPECTRUM => YDERAD%NSOLARSPECTRUM NSWWVCONTINUUM => YDERAD%NSWWVCONTINUUM NDUMPBADINPUTS => YDERAD%NDUMPBADINPUTS @@ -519,9 +520,16 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) IDUM=0 !* 2.1 PRESET INDICES IN *YOERAD* ! -------------------------- -NCLOUDACT= 0 -NAEROOPT = 2 !Default (will be)=2, HAM optics (faster and calculated for LW too) -!NAEROOPT = 0 + +! Cloud activation scheme +NCLOUDACT= 0 ! 0: effective radius from IFS code + ! >0: use Abdul-Razzak & Ghan activation scheme from HAMM7 + +! Computation of M7 aerosols optical properties +NAEROOPT = 2 ! 2: HAM optics (faster and calculated for LW too) + ! 1: TM5 optics (slower and only for SW) + ! 0: No optical properties calculated + LERAD1H=.FALSE. NLNGR1H=12 diff --git a/ifs-source/cmake/compile_flags.cmake b/ifs-source/cmake/compile_flags.cmake index 7d1a914b..8423e5ef 100644 --- a/ifs-source/cmake/compile_flags.cmake +++ b/ifs-source/cmake/compile_flags.cmake @@ -312,7 +312,7 @@ elseif(CMAKE_Fortran_COMPILER_ID MATCHES "GNU") endif() string(CONCAT IFS_Fortran_FLAGS "${IFS_Fortran_FLAGS} ${IFS_GNU64_FLAG} " - "-fconvert=big-endian -fPIC -fopenmp " + "-fconvert=big-endian -fPIC -fopenmp -Wunused " "-fno-range-check -ffree-line-length-none -fbacktrace -fno-second-underscore " "-ffpe-trap=invalid,zero,overflow -fconvert=swap") diff --git a/ifs-source/radiation/module/radiation_aerosol.F90 b/ifs-source/radiation/module/radiation_aerosol.F90 index 71feef94..226c94ac 100644 --- a/ifs-source/radiation/module/radiation_aerosol.F90 +++ b/ifs-source/radiation/module/radiation_aerosol.F90 @@ -79,7 +79,7 @@ end subroutine allocate_aerosol_arrays subroutine allocate_aerosol_arrays_direct(this, config, & & ncol, istartlev, iendlev) - use yomhook, only : lhook, dr_hook, jphook + use yomhook, only : lhook, dr_hook, jphook use radiation_config, only : config_type class(aerosol_type), intent(inout) :: this diff --git a/oifs-config.edit_me.sh b/oifs-config.edit_me.sh index 34493d30..7fb83ac6 100644 --- a/oifs-config.edit_me.sh +++ b/oifs-config.edit_me.sh @@ -24,7 +24,10 @@ export OIFS_HOST="local" export OIFS_PLATFORM="local" -#--- set principal OIFS variables ------------------------------ +#--- if OIFS_DEBUGGER is set, oifs-run can use it to activate debugger --------- +export OIFS_DEBUGGER="DDT" + +#--- set principal OIFS variables ---------------------------------------------- export OIFS_CYCLE=48r1 export OIFS_CLIMATE="climate.v020" diff --git a/oifs-config.nld5163.sh b/oifs-config.nld5163.sh index fff5c6e3..62643ac7 100644 --- a/oifs-config.nld5163.sh +++ b/oifs-config.nld5163.sh @@ -16,6 +16,8 @@ export OIFS_HOST="ecmwf" export OIFS_PLATFORM="hpc2020" +#--- if OIFS_DEBUGGER is set, oifs-run can use it to activate debugger --------- +export OIFS_DEBUGGER="DDT" #--- set principal OIFS variables ------------------------------ # From 68774057856dfbc6dc5e9b72f04b4707985df044 Mon Sep 17 00:00:00 2001 From: Ramiro Checa Garcia Date: Mon, 8 Jul 2024 15:50:02 +0000 Subject: [PATCH 022/129] Pull request #10: Add conversion of mass-flux to number particle emissions Merge in ~NM6/openifs-48r1 from ~NLD5163/openifs-48r1:knmi-m7-temporal to knmi-m7 Squashed commit of the following: commit cf243f61d3d2f5c03e18e79372cacb41d542fddc Author: Philippe Le Sager Date: Mon Jul 8 17:38:28 2024 +0200 Fix an FPE I got with GNU with explicit array index range commit 6b9ca403bdb061feed4932a7ea215777733b8fc1 Author: Ramiro Checa-Garcia Date: Mon Jul 8 09:17:14 2024 +0000 Adding arpifs/radiation changes derived from emission improvements for m7 --- ifs-source/arpifs/chem/chem_tm5.F90 | 2 - ifs-source/arpifs/chem/tm5_rbud.F90 | 1 + ifs-source/arpifs/climate/updclie_compo.F90 | 8 +- ifs-source/arpifs/control/cnt4.F90 | 1 - ifs-source/arpifs/module/par_gfl.F90 | 2 +- ifs-source/arpifs/module/tm5m7_data.F90 | 108 ++-- ifs-source/arpifs/module/yoeaersrc.F90 | 2 +- ifs-source/arpifs/module/yom_ygfl.F90 | 5 +- ifs-source/arpifs/module/yomafn.F90 | 52 +- ifs-source/arpifs/module/yomcompo.F90 | 18 +- ifs-source/arpifs/module/yommcc.F90 | 2 +- ifs-source/arpifs/phys_ec/OIFS_to_HAM.F90 | 1 + ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 | 2 - ifs-source/arpifs/phys_ec/aer_src.F90 | 182 +++--- ifs-source/arpifs/phys_ec/aerini_layer.F90 | 7 +- ifs-source/arpifs/phys_ec/aero_init.F90 | 1 + ifs-source/arpifs/phys_ec/callpar.F90 | 5 +- ifs-source/arpifs/phys_ec/cloud_layer.F90 | 5 +- .../arpifs/phys_ec/compo_apply_emissions.F90 | 304 ++++++++-- ifs-source/arpifs/phys_ec/gems_init.F90 | 2 +- ifs-source/arpifs/phys_ec/hamm7_interface.F90 | 56 +- .../arpifs/phys_ec/local_arrays_fin.F90 | 1 + .../arpifs/phys_ec/local_arrays_ini.F90 | 5 - ifs-source/arpifs/phys_ec/m7.F90 | 52 +- ifs-source/arpifs/phys_ec/mo_ham_m7.F90 | 13 - .../arpifs/phys_ec/mo_hammoz_wetdep.F90 | 15 - ifs-source/arpifs/phys_ec/su_aerw.F90 | 1 + .../arpifs/phys_ec/tm5m7_optics_init.F90 | 6 +- ifs-source/arpifs/phys_ec/tm5m7_phy2.F90 | 16 - ifs-source/arpifs/phys_ec/tm5m7_src.F90 | 567 ++++++++++-------- ifs-source/arpifs/phys_ec/tm5m7_src_dust.F90 | 345 +++++------ .../arpifs/phys_ec/tm5m7_src_dust_init.F90 | 288 +++++---- ifs-source/arpifs/phys_ec/tm5m7_src_ss.F90 | 28 +- .../arpifs/phys_radi/radiation_scheme.F90 | 56 +- ifs-source/arpifs/phys_radi/radintg.F90 | 3 +- ifs-source/arpifs/phys_radi/suecrad.F90 | 30 +- ifs-source/arpifs/setup/su_surf_flds.F90 | 23 +- ifs-source/arpifs/setup/sudefo_gflattr.F90 | 69 +-- ifs-source/arpifs/setup/sugfl2.F90 | 26 +- ifs-source/arpifs/setup/sumcclag.F90 | 56 +- .../radiation/module/radiation_ifs_rrtm.F90 | 1 + 41 files changed, 1300 insertions(+), 1067 deletions(-) diff --git a/ifs-source/arpifs/chem/chem_tm5.F90 b/ifs-source/arpifs/chem/chem_tm5.F90 index 58c1571c..4c433bdb 100644 --- a/ifs-source/arpifs/chem/chem_tm5.F90 +++ b/ifs-source/arpifs/chem/chem_tm5.F90 @@ -1096,8 +1096,6 @@ SUBROUTINE CHEM_TM5& ! Also the stratospheric nudging is included. This tendency output from this chem_tm5 module ! should be considered with great care, i.e. it is not well-defined. ! Change units from kg/kg/sec to sec-1. Loss term is positive. - !write(*,*) "PTENC1",PTENC1(:,:,ICH4) - !write(*,*) "PCEN(JL,JLEV,ICH4)",PCEN(:,:,ICH4) DO JLEV=1,KLEV DO JL=KIDIA,KFDIA IF(PCEN(JL,JLEV,ICH4)> 0._JPRB ) THEN diff --git a/ifs-source/arpifs/chem/tm5_rbud.F90 b/ifs-source/arpifs/chem/tm5_rbud.F90 index 4ec15de9..2e56b162 100644 --- a/ifs-source/arpifs/chem/tm5_rbud.F90 +++ b/ifs-source/arpifs/chem/tm5_rbud.F90 @@ -133,6 +133,7 @@ SUBROUTINE TM5_RBUD(YGFL,KIDIA, KFDIA, KLON, KLEV, KL, KOH, KNSTEP, PAIRD, PCR2, ENDIF ENDDO ENDDO + ! ! fill the BUD2D array with reaction budgets for O3 prod / loss ! (terms that are not yet provided above), or other interesting diff --git a/ifs-source/arpifs/climate/updclie_compo.F90 b/ifs-source/arpifs/climate/updclie_compo.F90 index 5ab5dea7..bf044e29 100644 --- a/ifs-source/arpifs/climate/updclie_compo.F90 +++ b/ifs-source/arpifs/climate/updclie_compo.F90 @@ -377,7 +377,7 @@ SUBROUTINE UPDCLIE_COMPO(YDGEOMETRY,YDDYNA,YDSURF,YDCOMPO,YDMCC,YDERAD,YDML_GCON & 'UPDCLIE_COMPO: JULIAN DAYS ',IJUL1,IJUL2,' FOR FIELD '& & ,NCLIGC_COMPO(JCL) WRITE(NULERR,'(A,I2)')'UPDCLIE_COMPO: DIFFERENCE EXPECTED ',IDIF - CALL ABOR1(' UPDCLIE_COMPO : IRREGULARLY SPACED FIELDS') + CALL ABOR1(' UPDCLIE_COMPO (1) : IRREGULARLY SPACED FIELDS') ENDIF ENDDO ENDIF @@ -397,7 +397,7 @@ SUBROUTINE UPDCLIE_COMPO(YDGEOMETRY,YDDYNA,YDSURF,YDCOMPO,YDMCC,YDERAD,YDML_GCON & 'UPDCLIE_COMPO: JULIAN DAYS ',IJUL1,IJUL2,' FOR FIELD '& & ,NCLIGC_COMPO(JCL) WRITE(NULERR,'(A,I2)')'UPDCLIE_COMPO: DIFFERENCE EXPECTED ',IDIF - CALL ABOR1(' UPDCLIE_COMPO : IRREGULARLY SPACED FIELDS') + CALL ABOR1(' UPDCLIE_COMPO (2) : IRREGULARLY SPACED FIELDS') ENDIF ENDDO ENDDO @@ -429,7 +429,7 @@ SUBROUTINE UPDCLIE_COMPO(YDGEOMETRY,YDDYNA,YDSURF,YDCOMPO,YDMCC,YDERAD,YDML_GCON CALL GRIB_NEW_FROM_FILE(IUNITCOMPO,IGRIB,IRET) IF(IRET /= GRIB_SUCCESS) THEN WRITE(NULERR,'(A,I2)')'UPDCLIE_COMPO: PROBLEM IN GRIB_NEW_FROM_FILE, IRET=',IRET - CALL ABOR1('UPDCLIE_COMPO: PROBLEM IN GRIB_NEW_FROM_FILE') + CALL ABOR1('UPDCLIE_COMPO (3): PROBLEM IN GRIB_NEW_FROM_FILE') ENDIF CALL GRIB_GET(IGRIB,'dataDate',IYYMD) IF (IYYMD == IADD) THEN @@ -511,7 +511,7 @@ SUBROUTINE UPDCLIE_COMPO(YDGEOMETRY,YDDYNA,YDSURF,YDCOMPO,YDMCC,YDERAD,YDML_GCON CALL GRIB_NEW_FROM_FILE(IUNITCOMPO,IGRIB,IRET) IF(IRET /= GRIB_SUCCESS ) THEN WRITE(NULERR,'(A,I2)')'UPDCLIE_COMPO: PROBLEM IN GRIB_NEW_FROM_FILE, IRET=',IRET - CALL ABOR1('UPDCLIE_COMPO: PROBLEM IN GRIB_NEW_FROM_INDEX') + CALL ABOR1('UPDCLIE_COMPO (4): PROBLEM IN GRIB_NEW_FROM_INDEX') ENDIF ENDIF CALL GRIB_SET(IGRIB,'missingValue',19591204.0_JPRB) diff --git a/ifs-source/arpifs/control/cnt4.F90 b/ifs-source/arpifs/control/cnt4.F90 index ae748880..849322ac 100644 --- a/ifs-source/arpifs/control/cnt4.F90 +++ b/ifs-source/arpifs/control/cnt4.F90 @@ -510,7 +510,6 @@ SUBROUTINE CNT4(YDGEOMETRY,YDFIELDS,YDMTRAJ,YDMODEL,YDJOT,YDVARBC,YDTCV,YDGOM5,Y ! Initialize aerosol indices (tm5m7 - if active) ! moving the CASE-clause that tests AERO_SCHEME from ! ./src/ifs/phys_ec/tm5m7_init.F90 here - IF (NAERO > 0 .AND. NCONF /= 131 ) THEN SELECT CASE (TRIM(AERO_SCHEME)) diff --git a/ifs-source/arpifs/module/par_gfl.F90 b/ifs-source/arpifs/module/par_gfl.F90 index 08614adf..8e958d47 100644 --- a/ifs-source/arpifs/module/par_gfl.F90 +++ b/ifs-source/arpifs/module/par_gfl.F90 @@ -47,7 +47,7 @@ MODULE PAR_GFL INTEGER(KIND=JPIM), PARAMETER :: JPEZDIAG=50 INTEGER(KIND=JPIM), PARAMETER :: JPCH4S=1 INTEGER(KIND=JPIM), PARAMETER :: JPNOGW=2 -INTEGER(KIND=JPIM), PARAMETER :: JPAEROUT=45 +INTEGER(KIND=JPIM), PARAMETER :: JPAEROUT=50 INTEGER(KIND=JPIM), PARAMETER :: JPAEROCLIM=3 INTEGER(KIND=JPIM), PARAMETER :: JPUVP=2 INTEGER(KIND=JPIM), PARAMETER :: JPPHYS=9 diff --git a/ifs-source/arpifs/module/tm5m7_data.F90 b/ifs-source/arpifs/module/tm5m7_data.F90 index 3cb5e266..f4185e91 100644 --- a/ifs-source/arpifs/module/tm5m7_data.F90 +++ b/ifs-source/arpifs/module/tm5m7_data.F90 @@ -1,12 +1,24 @@ MODULE TM5M7_DATA -USE PARKIND1 ,ONLY : JPIM ,JPRB + ! *TM5M7_DATA* Contains parameters, switches and initialization + ! routines for the tm5m7 aerosol scheme. + ! + ! Authors: + ! -------- + ! E. Vignati (JRC/IES) 2005 + ! P. Stier (MPI) 2001/2002 + ! E. Vignati and J. Wilson (JRC / EI) 2000 + ! V. Huijnen (KNMI): copied from TM5 to IFS code 2020 + + + + +USE PARKIND1, ONLY : JPIM, JPRB IMPLICIT NONE SAVE - ! Location of lookup table data. Default location is at the directory of the executable !CHARACTER(LEN=256) :: TM5M7_DATADIR='/perm/ms/nl/nk9/oifs43r3/data/cifs_input/tm5m7/optics/' CHARACTER(LEN=256) :: TM5M7_DATADIR='./' @@ -16,42 +28,31 @@ MODULE TM5M7_DATA REAL(KIND=JPRB), DIMENSION(:) , POINTER :: surf ! KLON END TYPE MODAL_DATA - ! *TM5M7_DATA* Contains parameters, switches and initialization - ! routines for the tm5m7 aerosol scheme. - ! - ! Authors: - ! -------- - ! E. Vignati (JRC/IES) 2005 - ! P. Stier (MPI) 2001/2002 - ! E. Vignati and J. Wilson (JRC / EI) 2000 - ! V. Huijnen (KNMI): copied from TM5 to IFS code 2020 - !--- 1) Define and pre-set switches for the processes of M7: ----------------------- !--- Physical: - LOGICAL :: lsnucl = .TRUE., & ! nucleation - lscoag = .TRUE., & ! coagulation - lscond = .TRUE. ! condensation of H2SO4 - + LOGICAL :: lsnucl = .TRUE., & ! nucleation + & lscoag = .TRUE., & ! coagulation + & lscond = .TRUE. ! condensation of H2SO4 + INTEGER(KIND=JPIM) :: nnucl = 1 ! Choice of the nucleation scheme: - ! ! nnucl = 1 Vehkamaeki (2002) ! = 2 Kulmala (1998) -NOT RECOMMENDED- - !--- Technical: LOGICAL :: lmass_diag = .FALSE. ! mass balance check in m7_interface !--- 2) Numbers of compounds and modes of m7: -------------------------------------- - INTEGER(KIND=JPIM), PARAMETER :: naermod=23, & !number of all compounds - nmod=7, & !number of modes - nss=2, & !number of sea salt compounds - nsol=4, & !number of soluble compounds - ngas=3, & !number of gaseous compounds - nsulf=4,& !number of sulfate compounds - ncomp=5 !number of compounds + INTEGER(KIND=JPIM), PARAMETER :: naermod=23, & !number of all compounds + & nmod=7, & !number of modes + & nss=2, & !number of sea salt compounds + & nsol=4, & !number of soluble compounds + & ngas=3, & !number of gaseous compounds + & nsulf=4, & !number of sulfate compounds + & ncomp=5 !number of compounds + !--- 3) List of indexes corresponding to the compound masses and mode numbers:------ !--- 3.1) Mass index (in array aerml and ttn): @@ -80,16 +81,16 @@ MODULE TM5M7_DATA ! s = soluble mode ! i = insoluble mode ! COMPOUND: - INTEGER(KIND=JPIM), PARAMETER :: & + INTEGER(KIND=JPIM), PARAMETER :: & & iso4ns=1, iso4ks=2, iso4as=3, iso4cs=4, & !- Sulfate & ibcks =5, ibcas =6, ibccs =7, ibcki =8, & !- Black Carbon & iocks =9, iocas=10, ioccs=11, iocki=12, & !- Organic Carbon & issas=13, isscs=14, & !- Sea Salt & iduas=15, iducs=16, iduai=17, iduci=18,& !- Dust & isoans=19,isoaks=20,isoaas=21,isoacs=22,isoaki=23 !- SOA - ! MODE: | | | | | - ! nucl. | aitk. | acc. | coar. | aitk. | acc. | coar. | - ! soluble | soluble | soluble | soluble | insol. | insol. | insol. | + ! MODE: | | | | | + ! nucl . | aitk. | acc. | coar. | aitk. | acc. | coar. | + ! solub le | soluble | soluble | soluble | insol. | insol. | insol. | !--- 3.2) Number index (in array aernl): @@ -202,7 +203,7 @@ MODULE TM5M7_DATA ! (Aerosol Sci. Technol., 2005). ! !dbc = 2., & ! Density bc [g cm-3] - & dbc = 1.8, & ! Density bc [g cm-3] + & dbc = 1.8, & ! Density bc [g cm-3] ! The density of OA is highly variable, ! but in any case substantially lower than 2 g/cm3. ! We adopt an average value of 1.3 g/cm3, @@ -230,7 +231,7 @@ MODULE TM5M7_DATA ! derive a value of 1.39 +- 0.13 for OA from biomass burning. ! !doc = 2., & ! Density oc [g cm-3] - & doc = 1.3, & ! Density POM [g cm-3] + & doc = 1.3, & ! Density POM [g cm-3] !<<< TvN & dnacl = 2.165, & ! Density NaCl [g cm-3] & dna2so4 = 2.68, & ! Density Na2SO4 [g cm-3] @@ -266,8 +267,7 @@ MODULE TM5M7_DATA !--- 10) Computational constants: ------------------------------------------------ - REAL(KIND=JPRB), PARAMETER :: sqrt2=1.4142136, & - pi=3.141592654 + REAL(KIND=JPRB), PARAMETER :: sqrt2=1.4142136, pi=3.141592654 !--- 11) Data used for the calculation of the aerosol properties ----------------- ! under ambient conditions: @@ -318,6 +318,8 @@ MODULE TM5M7_DATA ! ! component indices and families, to identify tracer ! + ! RCHG -> Should be each of these identifers numbers equal to + ! the "i" of YAERO_NL(i) in the namelist? INTEGER(KIND=JPIM), PARAMETER :: ISO4 = 1 INTEGER(KIND=JPIM), PARAMETER :: INH4 = 2 ! Note: these are tracer fields in the scope of aerosol module. INTEGER(KIND=JPIM), PARAMETER :: INO3_A = 3 ! Check how to treat when running with chemistry. @@ -438,7 +440,7 @@ MODULE TM5M7_DATA INTEGER(KIND=JPIM), PARAMETER :: mode_end_soa (nmod) = (/ isoanus, isoaais, isoaacs, isoacos, isoaaii, 0, 0 /) INTEGER(KIND=JPIM), PARAMETER :: mode_nm (nmod) = (/ 2, 4, 6, 6, 3, 1, 1 /) ! # tracers in mode INTEGER(KIND=JPIM), PARAMETER :: mode_nm_sed (nmod) = (/ 2, 4, 9, 6, 3, 1, 1 /) ! # tracers in mode - INTEGER(KIND=JPIM), PARAMETER :: mode_end (nmod) = mode_start + mode_nm ! last tracer in mode + INTEGER(KIND=JPIM), PARAMETER :: mode_end (nmod) = mode_start + mode_nm ! last tracer in mode INTEGER(KIND=JPIM), PARAMETER :: mode_tracers(0:6,nmod) = & & RESHAPE( (/ inus_n, iso4nus, isoanus, 0, 0, 0, 0, & & iais_n, iso4ais, ibcais, ipomais,isoaais, 0, 0, & @@ -455,14 +457,14 @@ MODULE TM5M7_DATA & iaii_n, 0 , ibcaii, ipomaii, isoaaii, 0 , 0 , & & iaci_n, 0 , 0 , 0 , 0 , 0 , iduaci , & & icoi_n, 0 , 0 , 0 , 0 , 0 , iducoi /), (/ 7, nmod/) ) - INTEGER(KIND=JPIM), PARAMETER :: mode_tracers_sed(0:9,nmod) = & - & RESHAPE( (/ inus_n, iso4nus, isoanus, 0, 0, 0, 0, 0,0,0,& - & iais_n, iso4ais, ibcais, ipomais,isoaais, 0, 0, 0,0,0,& - & iacs_n, iso4acs, ibcacs, ipomacs, issacs, iduacs, isoaacs, inh4,ino3_a,imsa,& - & icos_n, iso4cos, ibccos, ipomcos, isscos, iducos, isoacos, 0,0,0,& - & iaii_n, ibcaii, ipomaii,isoaaii, 0, 0, 0, 0,0,0,& - & iaci_n, iduaci, 0, 0, 0, 0, 0, 0,0,0,& - & icoi_n, iducoi, 0, 0, 0, 0, 0 ,0,0,0/), (/ 10, nmod/) ) + INTEGER(KIND=JPIM), PARAMETER :: mode_tracers_sed(0:9,nmod) = RESHAPE( (/& + & inus_n, iso4nus, isoanus, 0, 0, 0, 0, 0, 0, 0, & + & iais_n, iso4ais, ibcais, ipomais, isoaais, 0, 0, 0, 0, 0, & + & iacs_n, iso4acs, ibcacs, ipomacs, issacs, iduacs, isoaacs, inh4, ino3_a, imsa, & + & icos_n, iso4cos, ibccos, ipomcos, isscos, iducos, isoacos, 0, 0, 0, & + & iaii_n, ibcaii, ipomaii, isoaaii, 0, 0, 0, 0, 0, 0, & + & iaci_n, iduaci, 0, 0, 0, 0, 0, 0, 0, 0, & + & icoi_n, iducoi, 0, 0, 0, 0, 0, 0, 0, 0/), (/ 10, nmod/) ) @@ -475,7 +477,7 @@ MODULE TM5M7_DATA 0.5 , 0.7 , 0.8 , 0.9, 1.0, & 1.2 , 1.5 , 2.0 , 3.0, 4.0, & 5.0 , 6.0 , 8.0 , 10.0, 15.0, & - 20.0 , 50.0 , 100.0 /) + 20.0 , 50.0 , 100.0 /) @@ -517,17 +519,13 @@ MODULE TM5M7_DATA ! their scavenging efficiency has been changed to the value for that mode. ! For consistency, the same value is used for Pb210. integer, dimension(nscav),parameter :: & - nscav_type = (/ & - 5, 6, 7, 8, 9, 10, 11, & ! particle number - 5, 6, 7, 8, & ! sulphate mass - 6, 7, 8, 9, & ! BC mass - 6, 7, 8, 9, & ! POM mass - 7, 8, & ! SS mass - 7, 8, 10, 11, & ! DUST mass - 5, 6, 7, 8, 9 /) ! SOA mass - - - - + nscav_type = (/ & + 5, 6, 7, 8, 9, 10, 11, & ! particle number + 5, 6, 7, 8, & ! sulphate mass + 6, 7, 8, 9, & ! BC mass + 6, 7, 8, 9, & ! POM mass + 7, 8, & ! SS mass + 7, 8, 10, 11, & ! DUST mass + 5, 6, 7, 8, 9 /) ! SOA mass END MODULE TM5M7_DATA diff --git a/ifs-source/arpifs/module/yoeaersrc.F90 b/ifs-source/arpifs/module/yoeaersrc.F90 index 6db0c76c..3e503a44 100644 --- a/ifs-source/arpifs/module/yoeaersrc.F90 +++ b/ifs-source/arpifs/module/yoeaersrc.F90 @@ -71,7 +71,7 @@ SUBROUTINE PRINT_CONFIGURATION(SELF, KDEPTH, KOUTNO) IDEPTHLOC = KDEPTH+2 -WRITE(KOUTNO,*) REPEAT(' ',KDEPTH ) // 'model%yrml_phy_aer%yreaersrc : ' +WRITE(KOUTNO,*) REPEAT(' ',KDEPTH ) // 'MODEL%YRML_PHY_AER%YREAERSRC : ' WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'NDDUST = ', SELF%NDDUST WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'NSSALT = ', SELF%NSSALT WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'NAERWND = ', SELF%NAERWND diff --git a/ifs-source/arpifs/module/yom_ygfl.F90 b/ifs-source/arpifs/module/yom_ygfl.F90 index ab501405..dd6f6bff 100644 --- a/ifs-source/arpifs/module/yom_ygfl.F90 +++ b/ifs-source/arpifs/module/yom_ygfl.F90 @@ -36,7 +36,6 @@ MODULE YOM_YGFL ! │ │ ! │ Modifications : (included before each type) │ ! │ ------------- │ -! │ 15-May-2024 - R.Checa-Garcia - Added info/comments │ ! │ │ ! ╘════════════════════════════════════════════════════════════════════════════╛ @@ -198,9 +197,7 @@ MODULE YOM_YGFL END TYPE TYPE_GFL_NAML ! ╭────────────────────────────────────────────────────────────────────────────╮ -! │ (updated 15-May-2024) │ -! │ │ -! │ TYPE : TYPE_GFLD │ +! │ TYPE : TYPE_GFLD (updated 15-May-2024) │ ! │ │ ! │ Derived types for describing the GFL structure. │ ! │ │ diff --git a/ifs-source/arpifs/module/yomafn.F90 b/ifs-source/arpifs/module/yomafn.F90 index 064a5a68..02034384 100644 --- a/ifs-source/arpifs/module/yomafn.F90 +++ b/ifs-source/arpifs/module/yomafn.F90 @@ -514,36 +514,38 @@ MODULE YOMAFN !TYPE(FPDSPHY) :: CH4AG !TYPE(FPDSPHY) :: CH4F - -TYPE(FPDSPHY) :: CO2NBF !CO2 surface flux - biosphere -TYPE(FPDSPHY) :: CO2OF !CO2 surface flux - ocean -TYPE(FPDSPHY) :: CO2APF !CO2 surface flux - anthropogenic emission -TYPE(FPDSPHY) :: CO2FIRE !CO2 surface flux - fire emissions -TYPE(FPDSPHY) :: CH4AG !CH4 surface fluxes - all sources aggregated except fire emissions -TYPE(FPDSPHY) :: CH4F !CH4 surface fluxes - fire emissions - - -TYPE(FPDSPHY) :: BCBF ! Black carbon biogenic flux (ECMWF) -TYPE(FPDSPHY) :: INJF ! Biomass burning emissions injection height (ECMWF) -TYPE(FPDSPHY) :: BCFF ! Black carbon fossil fuel flux (ECMWF) -TYPE(FPDSPHY) :: OMBF ! Organic matter biogenic flux (ECMWF) -TYPE(FPDSPHY) :: OMFF ! Organic matter fossil fuel flux (ECMWF) -TYPE(FPDSPHY) :: SO2L ! Sulphate low-level flux (ECMWF) -TYPE(FPDSPHY) :: SO2H ! Sulphate high-level flux (ECMWF) -TYPE(FPDSPHY) :: VOLC ! Volcanic continuous flux (ECMWF) -TYPE(FPDSPHY) :: VOLE ! Volcanic explosive flux (ECMWF) -TYPE(FPDSPHY) :: SOA ! Secondary organic components flux (ECMWF) -TYPE(FPDSPHY) :: SOACO ! SOA from CO (ECMWF) -TYPE(FPDSPHY) :: BCGF ! Black carbon GFED flux (ECMWF) -TYPE(FPDSPHY) :: ODTO ! Optical depth total aerosols (ECMWF) +! RCHG -> Added but unclear if this is a CY48R1 feature not included before. +! TRACFLX(JPOSTRAC) as surface flux flexible tracers (ECMWF) seems to be new +! using the JPOSTRAC index. + + +TYPE(FPDSPHY) :: CO2NBF ! CO2 surface flux - biosphere +TYPE(FPDSPHY) :: CO2OF ! CO2 surface flux - ocean +TYPE(FPDSPHY) :: CO2APF ! CO2 surface flux - anthropogenic emission +TYPE(FPDSPHY) :: CO2FIRE ! CO2 surface flux - fire emissions +TYPE(FPDSPHY) :: CH4AG ! CH4 surface fluxes - all sources aggregated except fire emissions +TYPE(FPDSPHY) :: CH4F ! CH4 surface fluxes - fire emissions + +TYPE(FPDSPHY) :: BCBF ! Black carbon biogenic flux (ECMWF) +TYPE(FPDSPHY) :: INJF ! Biomass burning emissions injection height (ECMWF) +TYPE(FPDSPHY) :: BCFF ! Black carbon fossil fuel flux (ECMWF) +TYPE(FPDSPHY) :: OMBF ! Organic matter biogenic flux (ECMWF) +TYPE(FPDSPHY) :: OMFF ! Organic matter fossil fuel flux (ECMWF) +TYPE(FPDSPHY) :: SO2L ! Sulphate low-level flux (ECMWF) +TYPE(FPDSPHY) :: SO2H ! Sulphate high-level flux (ECMWF) +TYPE(FPDSPHY) :: VOLC ! Volcanic continuous flux (ECMWF) +TYPE(FPDSPHY) :: VOLE ! Volcanic explosive flux (ECMWF) +TYPE(FPDSPHY) :: SOA ! Secondary organic components flux (ECMWF) +TYPE(FPDSPHY) :: SOACO ! SOA from CO (ECMWF) +TYPE(FPDSPHY) :: BCGF ! Black carbon GFED flux (ECMWF) +TYPE(FPDSPHY) :: ODTO ! Optical depth total aerosols (ECMWF) TYPE(FPDSPHY) :: ODTO469 ! Optical depth total aerosols @ 469 nm (ECMWF) TYPE(FPDSPHY) :: ODTO670 ! Optical depth total aerosols @ 670 nm (ECMWF) TYPE(FPDSPHY) :: ODTO865 ! Optical depth total aerosols @ 865 nm (ECMWF) TYPE(FPDSPHY) :: ODTO1240 ! Optical depth total aerosols @ 1240 nm (ECMWF) +TYPE(FPDSPHY) :: OMGF ! Organic matter GFED flux (ECMWF) +TYPE(FPDSPHY) :: SOGF ! Sulphate GFED flux (ECMWF) TYPE(FPDSPHY) :: TRACFLX(JPOSTRAC) ! surface flux flexible tracers (ECMWF) -TYPE(FPDSPHY) :: OMGF ! Organic matter GFED flux (ECMWF) -TYPE(FPDSPHY) :: SOGF ! Sulphate GFED flux (ECMWF) - TYPE(FPDSPHY) :: SO2DD ! SO2 dry deposition velocity (ECMWF) TYPE(FPDSPHY) :: VIWVE ! Vertical integral of eastward water vapour flux (ECMWF) diff --git a/ifs-source/arpifs/module/yomcompo.F90 b/ifs-source/arpifs/module/yomcompo.F90 index 6dc98350..e5580919 100644 --- a/ifs-source/arpifs/module/yomcompo.F90 +++ b/ifs-source/arpifs/module/yomcompo.F90 @@ -42,12 +42,13 @@ MODULE YOMCOMPO ! │ - TCOMPO_EMIS_AUX -> a single emission auxiliary fields specific. │ ! │ - TCOMPO -> │ ! │ │ -! │ Author : ECMWF(?) │ +! │ Author : 2016-09-20 J. Flemming │ ! │ ------- │ ! │ │ -! │ Modifications : (included before each type) │ +! │ Modifications : │ ! │ ------------- │ -! │ 15-May-2024 - R.Checa-Garcia - Added info/comments │ +! │ May-2024 R.Checa-Garcia (KNMI) added to TCOMPO_EMIS the PSD at emission │ +! │ │ ! │ │ ! ╘════════════════════════════════════════════════════════════════════════════╛ @@ -85,6 +86,15 @@ MODULE YOMCOMPO ! 16=use-for-fire-inj; 32=use-for-volc-alti LOGICAL :: NON_SIMPLE_TRACER = .FALSE. ! Set if this is a non-simple-tracer species ! (e.g. a GLOMAP component represented by multiple tracers) + ! PROPERTIES of PSD at EMISSION: RADIUS, SIGMA and MASS-DENSITY tracer + ! used to convert mass-flux into number-particles-flux + ! for M7 backwards consistency PSD_SIGMA, PSD_RADIUS and MASS_DENSITY + ! should those defined for each mode. + REAL(KIND=JPRB) :: PSD_SIGMA = 2.0_JPRB + REAL(KIND=JPRB) :: PSD_RADIUS = 1.0_JPRB + REAL(KIND=JPRB) :: MASS_DENSITY = 1000.0_JPRB + CHARACTER(LEN=16) :: PSD_N0_TRACER = 'NONE' + END TYPE TCOMPO_EMIS ! Type for a single emission auxiliary fields specification @@ -95,7 +105,7 @@ MODULE YOMCOMPO END TYPE TCOMPO_EMIS_AUX -! Type for a .... +! Type for .... TYPE :: TCOMPO ! --- SWITCHES ------------------ LOGICAL :: LCHEM_DIA ! mass diagnostics switch for global budget diff --git a/ifs-source/arpifs/module/yommcc.F90 b/ifs-source/arpifs/module/yommcc.F90 index 3b095e88..7586a910 100644 --- a/ifs-source/arpifs/module/yommcc.F90 +++ b/ifs-source/arpifs/module/yommcc.F90 @@ -307,7 +307,7 @@ SUBROUTINE PRINT_CONFIGURATION(SELF, KDEPTH, KOUTNO) WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'NCLIMR = ', SELF%NCLIMR WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'NCLIGC sum = ', SUM(SELF%NCLIGC) WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'NCLIGC_COMPO sum = ', SUM(SELF%NCLIGC_COMPO) -WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'NCLIGC_COMPO sum = ', SUM(SELF%NYSDMP_COMPO) +WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'NYDSMP_COMPO sum = ', SUM(SELF%NYSDMP_COMPO) WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'NCLIMR_COMPO = ', SELF%NCLIMR_COMPO WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'NCLIAER sum = ', SUM(SELF%NCLIAER) WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'NDIFC = ', SELF%NDIFC diff --git a/ifs-source/arpifs/phys_ec/OIFS_to_HAM.F90 b/ifs-source/arpifs/phys_ec/OIFS_to_HAM.F90 index de0ef68b..fed3d100 100644 --- a/ifs-source/arpifs/phys_ec/OIFS_to_HAM.F90 +++ b/ifs-source/arpifs/phys_ec/OIFS_to_HAM.F90 @@ -34,6 +34,7 @@ MODULE OIFS_to_HAM INTEGER, PUBLIC, ALLOCATABLE :: ind_gas_HAM(:) ! indices of gas HAM tracers INTEGER, PUBLIC, ALLOCATABLE :: ind_cloud_HAM(:) ! indices of cloud HAM tracers end type ind_oifs_ham_type + !<--eehol TYPE(ind_oifs_ham_type) :: ind_oifs_ham !!$OMP THREADPRIVATE(ind_oifs_ham) diff --git a/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 b/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 index d41731da..c94c8a1b 100644 --- a/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 +++ b/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 @@ -63,7 +63,6 @@ SUBROUTINE AER_PHY3_LAYER(YDSURF, & !----------------------------------------------------------------------- - USE TYPE_MODEL, ONLY : MODEL USE SURFACE_FIELDS_MIX, ONLY : TSURF USE PARKIND1, ONLY : JPIM, JPRB @@ -187,7 +186,6 @@ SUBROUTINE AER_PHY3_LAYER(YDSURF, & ELSE ZO3(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV) = STATE%O3(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV) ENDIF -!write(*,*)"AERO_SCHEME",TRIM(AERO_SCHEME) SELECT CASE (TRIM(AERO_SCHEME)) diff --git a/ifs-source/arpifs/phys_ec/aer_src.F90 b/ifs-source/arpifs/phys_ec/aer_src.F90 index 0129b523..6885631c 100644 --- a/ifs-source/arpifs/phys_ec/aer_src.F90 +++ b/ifs-source/arpifs/phys_ec/aer_src.F90 @@ -169,17 +169,17 @@ SUBROUTINE AER_SRC & INTEGER(KIND=JPIM) , PARAMETER :: INSOIL = 85 INTEGER(KIND=JPIM) , PARAMETER :: INSOILMODE = 3 INTEGER(KIND=JPIM) , PARAMETER :: INBIN = 3 -REAL(KIND=JPRB),PARAMETER :: ZZ0SBIS=3.E-05_JPRB ! en m +REAL(KIND=JPRB),PARAMETER :: ZZ0SBIS=3.E-05_JPRB ! in m REAL(KIND=JPRB), PARAMETER :: ZCSTD = 3.4_JPRB REAL(KIND=JPRB), PARAMETER :: ZRVONKAR = 0.4_JPRB REAL(KIND=JPRB), PARAMETER :: ZSIGMAS = 3.0_JPRB ! Normalization constant REAL(KIND=JPRB), PARAMETER :: ZRCV=12.62_JPRB REAL(KIND=JPRB), PARAMETER :: ZLAMBDA=12.0_JPRB -REAL(KIND=JPRB) , DIMENSION(INBIN,2) :: ZTRSIZE -REAL(KIND=JPRB) , DIMENSION(3,12) :: ZMMD , ZPCENT , ZSIGMA -REAL(KIND=JPRB) , DIMENSION(3,12) :: ZMMD2 , ZPCENT2 , ZSIGMA2 -REAL(KIND=JPRB), DIMENSION(2,ISIZE) :: ZAEROSIZE +REAL(KIND=JPRB), DIMENSION(3,12) :: ZMMD , ZPCENT , ZSIGMA +REAL(KIND=JPRB), DIMENSION(3,12) :: ZMMD2 , ZPCENT2 , ZSIGMA2 +REAL(KIND=JPRB), DIMENSION(INBIN,2) :: ZTRSIZE +REAL(KIND=JPRB), DIMENSION(2,ISIZE) :: ZAEROSIZE !---------------- Other dust variables REAL(KIND=JPRB) :: ZSTOTAL , ZXK , ZXL , ZXM , ZXN, ZRWI, ZTOTV @@ -196,7 +196,7 @@ SUBROUTINE AER_SRC & REAL(KIND=JPRB), DIMENSION(INATS,KLON) :: ZFSOIL, ZFTEX -INTRINSIC ERF +INTRINSIC ERF ! RCHG -> Is this used? !! REAL(KIND=JPRB) :: ZDMSSRC(KLON) @@ -307,65 +307,88 @@ SUBROUTINE AER_SRC & & 0.50_JPRB , 0.00_JPRB , 0.50_JPRB/ !----------------------------------------------------------------------- -ASSOCIATE(YDVAB=>YDGEOMETRY%YRVAB,YDVETA=>YDGEOMETRY%YRVETA,YDVFE=>YDGEOMETRY%YRVFE,YDSTA=>YDGEOMETRY%YRSTA, & - & YDLAP=>YDGEOMETRY%YRLAP,YDCSGLEG=>YDGEOMETRY%YRCSGLEG, & - & YDCSGEOM=>YDGEOMETRY%YRCSGEOM,YDCSGEOM_NB=>YDGEOMETRY%YRCSGEOM_NB, & - & YDGSGEOM=>YDGEOMETRY%YRGSGEOM, & - & YDGSGEOM_NB=>YDGEOMETRY%YRGSGEOM_NB, & - & YDSPGEOM=>YDGEOMETRY%YSPGEOM, YDEAERMAP=>YDMODEL%YRML_PHY_AER%YREAERMAP,YDEAERVOL=>YDMODEL%YRML_PHY_AER%YREAERVOL, & - & YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO, & - & YDEAERSNK=>YDMODEL%YRML_PHY_AER%YREAERSNK, & - & YDRIP=>YDMODEL%YRML_GCONF%YRRIP,YDEAERSRC=>YDMODEL%YRML_PHY_AER%YREAERSRC,YGFL=>YDMODEL%YRML_GCONF%YGFL, & - & YDEPHY=>YDMODEL%YRML_PHY_EC%YREPHY,YDEAERATM=>YDMODEL%YRML_PHY_RAD%YREAERATM) - -ASSOCIATE(NACTAERO=>YGFL%NACTAERO, NAERO=>YGFL%NAERO, YAERO=>YGFL%YAERO, & - & NDGLG=>YDGEOMETRY%YRDIM%NDGLG, & - & LAERCLIST=>YDEAERATM%LAERCLIST, LAERELVS=>YDEAERATM%LAERELVS, & - & LAERVOL=>YDEAERATM%LAERVOL, & - & NDUSRCP=>YDEAERMAP%NDUSRCP, RDDUAER=>YDEAERMAP%RDDUAER, & - & RDUSRCP=>YDEAERMAP%RDUSRCP, & - & RRHO_DD=>YDEAERSNK%RRHO_DD, & - & LOCNDMS=>YDEAERSRC%LOCNDMS, NAERWND=>YDEAERSRC%NAERWND, & - & LAERNITRATE=>YDCOMPO%LAERNITRATE, & - & LAERSOA=>YDCOMPO%LAERSOA, & - & LAERSOA_COUPLED=>YDCOMPO%LAERSOA_COUPLED, & - & NDDUST=>YDEAERSRC%NDDUST, NDMSO=>YDEAERSRC%NDMSO, NSSALT=>YDEAERSRC%NSSALT, & - & NTYPAER=>YDEAERATM%NTYPAER, RAERDUB=>YDEAERSRC%RAERDUB, & - & RCODECA=>YDEAERSRC%RCODECA, RCOVSRA=>YDEAERSRC%RCOVSRA, & - & RDDUSRC=>YDEAERSRC%RDDUSRC, RDMSMIN=>YDEAERSRC%RDMSMIN, & - & RFCTSS=>YDEAERSRC%RFCTSS, RSIDECA=>YDEAERSRC%RSIDECA, & - & RSIVSRA=>YDEAERSRC%RSIVSRA, & - & NAERVOLC=>YDEAERVOL%NAERVOLC, NAERVOLE=>YDEAERVOL%NAERVOLE, & - & NVOLDATS=>YDEAERVOL%NVOLDATS, NVOLERUP=>YDEAERVOL%NVOLERUP, & - & NVOLDATE=>YDEAERVOL%NVOLDATE, & - & RAERVOLC=>YDEAERVOL%RAERVOLC, RAERVOLE=>YDEAERVOL%RAERVOLE, & - & NALBEDOSCHEME=>YDEPHY%NALBEDOSCHEME, LVDFTRAC=>YDEPHY%LVDFTRAC, YSURF=>YDEPHY%YSURF, & - & NLOENG=>YDGEOMETRY%YRGEM%NLOENG, & - & NGLOBALAT=>YDGEOMETRY%YRMP%NGLOBALAT, & - & NSTASS=>YDRIP%NSTASS, RHGMT=>YDRIP%RHGMT, RSTATI=>YDRIP%RSTATI,& - & NDRYDEPVEL_DYN=> YDEAERSNK%NDRYDEPVEL_DYN, & - & NCHEM=>YGFL%NCHEM, YCHEM=>YGFL%YCHEM, & - & LAERDUST_NEWBIN=>YDEAERATM%LAERDUST_NEWBIN, & - & LAERDUSTSIZEVAR=>YDEAERATM%LAERDUSTSIZEVAR, & - & LAERDUSTSOURCE=>YDEAERATM%LAERDUSTSOURCE, & - & LAERSOA_CHEM=>YDEAERATM%LAERSOA_CHEM, & - & LAERCHEM=>YGFL%LAERCHEM) +ASSOCIATE(& + ! --- YDGEOMETRY -------------------------------------- + & YDVAB => YDGEOMETRY%YRVAB, YDVETA => YDGEOMETRY%YRVETA, & + & YDVFE => YDGEOMETRY%YRVFE, YDSTA => YDGEOMETRY%YRSTA, & + & YDLAP => YDGEOMETRY%YRLAP, YDCSGLEG => YDGEOMETRY%YRCSGLEG, & + & YDCSGEOM => YDGEOMETRY%YRCSGEOM, YDCSGEOM_NB => YDGEOMETRY%YRCSGEOM_NB, & + & YDGSGEOM => YDGEOMETRY%YRGSGEOM, YDGSGEOM_NB => YDGEOMETRY%YRGSGEOM_NB, & + & YDSPGEOM => YDGEOMETRY%YSPGEOM, NDGLG => YDGEOMETRY%YRDIM%NDGLG, & + & NGLOBALAT => YDGEOMETRY%YRMP%NGLOBALAT, NLOENG => YDGEOMETRY%YRGEM%NLOENG, & + ! --- YDMODEL ------------------------------------------ + & YDEAERMAP=>YDMODEL%YRML_PHY_AER%YREAERMAP, & + & YDEAERVOL=>YDMODEL%YRML_PHY_AER%YREAERVOL, & + & YDEAERSNK=>YDMODEL%YRML_PHY_AER%YREAERSNK, & + & YDEAERSRC=>YDMODEL%YRML_PHY_AER%YREAERSRC, & + & YDRIP =>YDMODEL%YRML_GCONF%YRRIP, & + & YDCOMPO =>YDMODEL%YRML_CHEM%YRCOMPO, & + & YGFL =>YDMODEL%YRML_GCONF%YGFL, & + & YDEPHY =>YDMODEL%YRML_PHY_EC%YREPHY, & + & YDEAERATM=>YDMODEL%YRML_PHY_RAD%YREAERATM) + +ASSOCIATE(& + ! --- YGFL ---------------------------------------------- + & NACTAERO=>YGFL%NACTAERO, NAERO=>YGFL%NAERO, YAERO=>YGFL%YAERO, & + ! --- YDEAERATM ----------------------------------------- + & LAERCLIST => YDEAERATM%LAERCLIST, & + & LAERELVS => YDEAERATM%LAERELVS, & + & LAERVOL => YDEAERATM%LAERVOL, & + & LAERDUST_NEWBIN => YDEAERATM%LAERDUST_NEWBIN, & + & LAERDUSTSIZEVAR => YDEAERATM%LAERDUSTSIZEVAR, & + & LAERDUSTSOURCE => YDEAERATM%LAERDUSTSOURCE, & + & LAERSOA_CHEM => YDEAERATM%LAERSOA_CHEM, & + ! --- YDEAERMAP ----------------------------------------- + & NDUSRCP=>YDEAERMAP%NDUSRCP, RDDUAER=>YDEAERMAP%RDDUAER, & + & RDUSRCP=>YDEAERMAP%RDUSRCP, & + ! --- YDEAERSNK ----------------------------------------- + & RRHO_DD =>YDEAERSNK%RRHO_DD, & + & NDRYDEPVEL_DYN=>YDEAERSNK%NDRYDEPVEL_DYN, & + ! --- YDEAERSRC ----------------------------------------- + & LOCNDMS => YDEAERSRC%LOCNDMS, NAERWND => YDEAERSRC%NAERWND, & + & NDDUST => YDEAERSRC%NDDUST, NDMSO => YDEAERSRC%NDMSO, & + & NSSALT => YDEAERSRC%NSSALT, RAERDUB => YDEAERSRC%RAERDUB, & + & RCODECA => YDEAERSRC%RCODECA, RCOVSRA => YDEAERSRC%RCOVSRA, & + & RDDUSRC => YDEAERSRC%RDDUSRC, RDMSMIN => YDEAERSRC%RDMSMIN, & + & RFCTSS => YDEAERSRC%RFCTSS, RSIDECA => YDEAERSRC%RSIDECA, & + & RSIVSRA => YDEAERSRC%RSIVSRA, & + ! --- YDEAERATM ----------------------------------------- + & NTYPAER=>YDEAERATM%NTYPAER, & + ! --- YDCOMPO -------------------------------------------- + & LAERNITRATE => YDCOMPO%LAERNITRATE, & + & LAERSOA => YDCOMPO%LAERSOA, & + & LAERSOA_COUPLED => YDCOMPO%LAERSOA_COUPLED, & + ! --- YDEAERVOL ------------------------------------------ + & NAERVOLC=>YDEAERVOL%NAERVOLC, NAERVOLE=>YDEAERVOL%NAERVOLE, & + & NVOLDATS=>YDEAERVOL%NVOLDATS, NVOLERUP=>YDEAERVOL%NVOLERUP, & + & NVOLDATE=>YDEAERVOL%NVOLDATE, & + & RAERVOLC=>YDEAERVOL%RAERVOLC, RAERVOLE=>YDEAERVOL%RAERVOLE, & + ! --- YDEPHY --------------------------------------------- + & NALBEDOSCHEME => YDEPHY%NALBEDOSCHEME, & + & LVDFTRAC => YDEPHY%LVDFTRAC, & + & YSURF => YDEPHY%YSURF, & + ! --- YDRIP ----------------------------------------------- + & NSTASS=>YDRIP%NSTASS, RHGMT=>YDRIP%RHGMT, RSTATI=>YDRIP%RSTATI, & + ! --- YGFL ----------------------------------------------- + & NCHEM => YGFL%NCHEM, & + & YCHEM => YGFL%YCHEM, & + & LAERCHEM => YGFL%LAERCHEM) IF (LAERDUST_NEWBIN) THEN - ZTRSIZE(:,1)=(/0.01_JPRB , 1.0_JPRB , 2.5_JPRB/) - ZTRSIZE(:,2)=(/1.0_JPRB , 2.5_JPRB ,20.0_JPRB /) - ZAEROSIZE(1,:)=(/1.0E-08_JPRB , 2.0E-08_JPRB , 4.0E-08_JPRB , & - & 8.0E-08_JPRB , 1.6E-07_JPRB ,3.2E-07_JPRB , & - & 6.4E-07_JPRB , 1.28E-06_JPRB , & - & 2.56E-06_JPRB , 5.12E-06_JPRB , 10.24E-06_JPRB /) - ZAEROSIZE(2,:)=(/2.0E-08_JPRB , 4.0E-08_JPRB , & - & 8.0E-08_JPRB , 1.6E-07_JPRB ,3.2E-07_JPRB , & - & 6.4E-07_JPRB , 1.28E-06_JPRB , & - & 2.56E-06_JPRB , 5.12E-06_JPRB ,10.24E-06_JPRB , & - & 20.48E-06_JPRB/) + ZTRSIZE(:,1)=(/0.01_JPRB , 1.0_JPRB , 2.5_JPRB /) + ZTRSIZE(:,2)=(/1.0_JPRB , 2.5_JPRB , 20.0_JPRB /) + ZAEROSIZE(1,:)=(/1.0E-08_JPRB , 2.0E-08_JPRB , 4.0E-08_JPRB , & + & 8.0E-08_JPRB , 1.6E-07_JPRB , 3.2E-07_JPRB , & + & 6.4E-07_JPRB , 1.28E-06_JPRB , & + & 2.56E-06_JPRB , 5.12E-06_JPRB , 10.24E-06_JPRB /) + ZAEROSIZE(2,:)=(/2.0E-08_JPRB , 4.0E-08_JPRB , & + & 8.0E-08_JPRB , 1.6E-07_JPRB , 3.2E-07_JPRB , & + & 6.4E-07_JPRB , 1.28E-06_JPRB , & + & 2.56E-06_JPRB , 5.12E-06_JPRB , 10.24E-06_JPRB, & + & 20.48E-06_JPRB/) ELSE ZTRSIZE(:,1)=(/0.03_JPRB , 0.55_JPRB , 0.9_JPRB/) ZTRSIZE(:,2)=(/0.55_JPRB , 0.9_JPRB,20.0_JPRB /) @@ -406,19 +429,6 @@ SUBROUTINE AER_SRC & ZUSTAR(:)=0.0_JPRB ZUSTART(:,:)=0.0_JPRB -! For IF .AND. tests in GNU -!ZBNDA = -9999._JPRB -!ZBNDB = -9999._JPRB -!ZBNDC = -9999._JPRB -!ZBNDD = -9999._JPRB -!ZBNDF = -9999._JPRB -!ZBNDG = -9999._JPRB -!ZBNDH = -9999._JPRB -!ZBNDI = -9999._JPRB -!ZBNDJ = -9999._JPRB -!ZBNDK = -9999._JPRB -!ZBNDL = -9999._JPRB -!ZBNDM = -9999._JPRB !----------------------------------------------------------------------- !* 0.1 TIME AND DATE OF THE MODEL @@ -498,6 +508,9 @@ SUBROUTINE AER_SRC & !* 0.6 EMPIRICAL EFFICIENCY FACTORS FOR SOURCES ! ---------------------------------------- +! RCHG -> translate this block to a subroutine external +! -> (that be shared with M7) + PAERMAP(KIDIA:KFDIA,:) = 0._JPRB IF (NTYPAER(2) > 0) THEN DO JL=KIDIA,KFDIA @@ -517,12 +530,9 @@ SUBROUTINE AER_SRC & ELSEIF (ZLON >= 285._JPRB .AND. ZLON < 310._JPRB) THEN ZBNDE= 44._JPRB+(ZLON-285._JPRB)*3._JPRB/25._JPRB ENDIF -! ZUSTAR = -9999._JPRB -! ZUSTART = -9999._JPRB - ZLONGB= -9999._JPRB !-- limits Britain -! ZBNDJ = -9999._JPRB -! ZBNDM = -9999._JPRB -! ZBNDL = -9999._JPRB + +!-- limits Britain + ZLONGB=-9999._JPRB IF (ZLON > 354._JPRB .AND. ZLON < 360._JPRB) THEN ZLONGB=ZLON ELSEIF (ZLON >= 0._JPRB .AND. ZLON < 3._JPRB) THEN @@ -544,6 +554,7 @@ SUBROUTINE AER_SRC & ELSEIF (ZLAT <= -7._JPRB .AND. ZLAT > -11._JPRB) THEN ZBNDI= 286._JPRB+(-7._JPRB-ZLAT)*4._JPRB/4._JPRB ENDIF + IF (ZLAT <= -11._JPRB .AND. ZLAT > -18._JPRB) THEN ZBNDJ= 294._JPRB+(-11._JPRB-ZLAT)*8._JPRB/7._JPRB ELSEIF (ZLAT <= -18._JPRB .AND. ZLAT > -27._JPRB) THEN @@ -972,6 +983,8 @@ SUBROUTINE AER_SRC & IF (NTYPAER(2) /= 0) THEN !----------------------------------------------- + ! RCHG -> this will be eventially a very nested if so a more structured approach + ! can meke more maintanable the code. IF (NDDUST == 2 .OR. NDDUST == 4 ) THEN ! case P. Nabat formulation @@ -992,6 +1005,9 @@ SUBROUTINE AER_SRC & ! SANDY LOAM : SAND >= 0.52 CLAY < 0.20 | SAND >= (0.5 - CLAY) CLAY < 0.07 ! LOAM : CLAY >= 0.20 CLAY < 0.28 SILT >= 0.28 SILT < 0.5 | SAND >= (0.5 - CLAY) ! CLAY < 0.20 + + ! RCHG -> processing soil texture silt, clay, sand + ! -> CALL SOIL_TEXTURE_DESERT(KIDIA, KFDIA, PAERLTS, PAERSCC, ZFTEX) ! out ZFTEX ZFTEX(:,:)=0.0 DO JL=KIDIA,KFDIA @@ -1046,6 +1062,10 @@ SUBROUTINE AER_SRC & ZDP_ARRAY(JS) = ZDP_ARRAY(JS-1)*exp(ZDELDP) ENDDO + ! RCHG -> formally speaking this is done in both, M7 and here in different methods, so maybe + ! -> it is good to unify? The difference here is the soil texture arrays format + + ! ! Determination of ZSREL=dSrel in MB95 ! equations 29-30-31 in MB95 ! ZSS=dS(Dp) @@ -1447,6 +1467,8 @@ SUBROUTINE AER_SRC & !* 3.0 ORGANIC MATTER (ORGANIC CARBON, POM, SECONDARY ORGANIC MATTER) ! -------------------------------------------------------------- +! Here we are adding bins to have a track of the nspecies this technically not needed here +! but a data structure that ensampsulates that. IF (NTYPAER(3) /= 0) THEN INBAER=INBAER+2 ENDIF @@ -1669,8 +1691,6 @@ SUBROUTINE AER_SRC & ZVOLESO2(JL)=RAERVOLE(JVOLE,4)*RAERVOLE(JVOLE,8)/ZVOLUME DO JK=ITOPPL,IBASPL - - PTENC(JL,JK,KAERO(INBAER+1))=PTENC(JL,JK,KAERO(INBAER+1))+& & ZVOLEASH(JL)/PRHO(JL,JK) ! kg kg-1 s-1 !- updating volcanic SO2 tendency (should be in variable 15) diff --git a/ifs-source/arpifs/phys_ec/aerini_layer.F90 b/ifs-source/arpifs/phys_ec/aerini_layer.F90 index 93c1b43c..0b630f87 100644 --- a/ifs-source/arpifs/phys_ec/aerini_layer.F90 +++ b/ifs-source/arpifs/phys_ec/aerini_layer.F90 @@ -85,7 +85,6 @@ SUBROUTINE AERINI_LAYER(YDGEOMETRY,YDSURF,& TYPE (DIMENSION_TYPE) ,INTENT (IN) :: KDIM TYPE (AUX_TYPE) ,INTENT (IN) :: PAUX TYPE (STATE_TYPE) ,INTENT (IN) :: STATE -!TYPE (STATE_TYPE) ,INTENT (IN) :: TENDENCY_CML TYPE(VARIABLE_3D) ,INTENT (IN) :: R, S TYPE (SURF_AND_MORE_TYPE) ,INTENT(INOUT) :: PSURF TYPE (SURF_AND_MORE_LOCAL_TYPE),INTENT(INOUT) :: SURFL @@ -179,7 +178,7 @@ SUBROUTINE AERINI_LAYER(YDGEOMETRY,YDSURF,& ZSNM = SUM(PSURF%PSP_SG(:,:,YSP_SG%YF%MP9),DIM=2) ! pre-compute total snow mass - IF(.not. LAERCHEM .and. LAEROSFC)THEN +IF(.not. LAERCHEM .and. LAEROSFC)THEN !IF(LAEROSFC) !call simple_sulfur_src(YDGEOMETRY, YDMODEL, KDIM%KIDIA, KDIM%KFDIA, KDIM%KLON , KDIM%KTDIA, KDIM%KLEV,& ! & KDIM%KSTGLO, GEMSL%ITRAC, GEMSL%IAERO, & @@ -194,11 +193,11 @@ SUBROUTINE AERINI_LAYER(YDGEOMETRY,YDSURF,& ! & GEMSL%ZAERWS,& ! & GEMSL%ZDMSO, GEMSL%ZLDAY, GEMSL%ZLISS, GEMSL%ZSO2, GEMSL%ZTDMS,& ! & GEMSL%ZODMS, PSO4SRC,PSO2SRC) - ELSE +ELSE ! Set to zero PSO4SRC(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV)=0.0_JPRB PSO2SRC(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV)=0.0_JPRB - END IF +END IF SELECT CASE (TRIM(AERO_SCHEME)) diff --git a/ifs-source/arpifs/phys_ec/aero_init.F90 b/ifs-source/arpifs/phys_ec/aero_init.F90 index 8aaab161..f3989403 100644 --- a/ifs-source/arpifs/phys_ec/aero_init.F90 +++ b/ifs-source/arpifs/phys_ec/aero_init.F90 @@ -59,6 +59,7 @@ SUBROUTINE AERO_INIT(YGFL,YDCOMPO,YDEAERATM,KDIM,GEMSL) ALLOCATE( GEMSL%ZAERDDP(KDIM%KLON,NACTAERO) ) ALLOCATE( GEMSL%ZAERSDM(KDIM%KLON,NACTAERO) ) +! RCHG -> as commented in other subroutines explain what is 5, 12 and 9 ALLOCATE( GEMSL%ZAERMAP(KDIM%KLON,5) ) ALLOCATE( GEMSL%ZAERFLX_M7(KDIM%KLON,12,9) ) !ALLOCATE( GEMSL%ZAERLIF(KDIM%KLON,9) ) diff --git a/ifs-source/arpifs/phys_ec/callpar.F90 b/ifs-source/arpifs/phys_ec/callpar.F90 index c652de0b..742dc554 100644 --- a/ifs-source/arpifs/phys_ec/callpar.F90 +++ b/ifs-source/arpifs/phys_ec/callpar.F90 @@ -715,7 +715,10 @@ SUBROUTINE CALLPAR(YDGEOMETRY,YDVARS,YDSURF,YDMODEL,KDIM,& CALL SURFRAD_LAYER(YDSURF,YDMCC,YDERAD,YDEPHY,YDRIP,KDIM,PAUX,STATE_TMP,LLKEYS,AUXL,PSURF,SURFL) !* 1.9 PROGNOSTIC AEROSOLS - INITIAL COMPUTATIONS - CALL AERINI_LAYER(YDGEOMETRY,YDSURF,YDMODEL,KDIM,PAUX,STATE_TMP,YDVARS%R, YDVARS%S, PSURF,SURFL,GEMSL) + ! (currently via YDMODEL%YRML_CHEM%YRCOMPO%AERO_SCHEME + ! several aerosols schemes can be called) + CALL AERINI_LAYER( YDGEOMETRY, YDSURF, YDMODEL, KDIM, PAUX, STATE_TMP, & + & YDVARS%R, YDVARS%S, PSURF, SURFL, GEMSL) ELSE GEMSL%ZCFLX(KDIM%KIDIA:KDIM%KFDIA, GEMSL%IAERO(1):GEMSL%IAERO(NACTAERO))=0._JPRB GEMSL%ZTENC(KDIM%KIDIA:KDIM%KFDIA, 1:KDIM%KLEV, GEMSL%IAERO(1):GEMSL%IAERO(NACTAERO))=0._JPRB diff --git a/ifs-source/arpifs/phys_ec/cloud_layer.F90 b/ifs-source/arpifs/phys_ec/cloud_layer.F90 index b3fa5045..52e9e3a9 100644 --- a/ifs-source/arpifs/phys_ec/cloud_layer.F90 +++ b/ifs-source/arpifs/phys_ec/cloud_layer.F90 @@ -123,7 +123,6 @@ SUBROUTINE CLOUD_LAYER( & TYPE (AUX_DIAG_TYPE) , INTENT(INOUT) :: PDIAG TYPE (VARIABLE_3D) , INTENT(INOUT) :: FSD TYPE (STATE_TYPE) , INTENT(INOUT) :: TENDENCY_LOC - !----------------------------------------------------------------------- INTEGER(KIND=JPIM) :: JRF, JL, JK REAL(KIND=JPRB) :: ZGP2DSPP(KDIM%KLON, YDSPP_CONFIG%SM%NRFTOTAL) !SPP pattern @@ -132,7 +131,6 @@ SUBROUTINE CLOUD_LAYER( & REAL(KIND=JPHOOK) :: ZHOOK_HANDLE - !----------------------------------------------------------------------- #include "cloudsc.intfb.h" @@ -140,7 +138,8 @@ SUBROUTINE CLOUD_LAYER( & ! ------------------------------------------------------------------ IF (LHOOK) CALL DR_HOOK('CLOUD_LAYER',0,ZHOOK_HANDLE) -ASSOCIATE(TSPHY=>YDPHY2%TSPHY, & +ASSOCIATE(& + & TSPHY =>YDPHY2%TSPHY, & & YSD_VF=>YDSURF%YSD_VF, YSD_VD=>YDSURF%YSD_VD ) diff --git a/ifs-source/arpifs/phys_ec/compo_apply_emissions.F90 b/ifs-source/arpifs/phys_ec/compo_apply_emissions.F90 index a20d1f1a..970cf30c 100644 --- a/ifs-source/arpifs/phys_ec/compo_apply_emissions.F90 +++ b/ifs-source/arpifs/phys_ec/compo_apply_emissions.F90 @@ -16,25 +16,52 @@ SUBROUTINE COMPO_APPLY_EMISSIONS(YDMODEL, & & PAPHIF, PBLH, & & PLSM) -!----------------------------------------------------------------------------- -! COMPO_APPLY_EMISSIONS -! -! This routine iterates over the emission fields for the composition species -! (aerosols, chemistry, GHG) and applies them either to the surface flux or -! tendency arrays as appropriate. -! -! AUTHOR: Zak Kipling -!----------------------------------------------------------------------------- +! ╭────────────────────────────────────────────────────────────────────────────╮ +! │ updated 3-Jun-2024 │ +! │ Purpose : │ +! │ ------- │ +! │ This routine iterates over the emission fields for the composition species │ +! │ (aerosols, chemistry, GHG) and applies them either to the surface flux or │ +! │ tendency arrays as appropriate. │ +! │ │ +! │ Input : │ +! │ ----- │ +! │ │ +! │ │ +! │ Output : │ +! │ ------ │ +! │ │ +! │ │ +! │ Externals : │ +! │ --------- │ +! │ │ +! │ Method : │ +! │ ------ │ +! │ │ +! │ Reference : │ +! │ --------- │ +! │ │ +! │ Author : │ +! │ ------- │ +! │ Zak Kipling (ECMWF) │ +! │ │ +! │ Modifications : │ +! │ ------------- │ +! │ May. 2024 - R. Checa-Garcia. Added aerosols-number particle emissions │ +! │ │ +! │ │ +! ╰────────────────────────────────────────────────────────────────────────────╯ USE TYPE_MODEL,ONLY : MODEL USE PARKIND1 , ONLY : JPIM, JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK -USE YOMCST , ONLY : RG +USE YOMCST , ONLY : RG, RPI USE YOMCHEM , ONLY : IEXTR_EM USE YOMCOMPO , ONLY : TCOMPO_EMIS USE YOM_YGFL , ONLY : TYPE_GFL_COMP + IMPLICIT NONE ! Standard model objects @@ -48,17 +75,17 @@ SUBROUTINE COMPO_APPLY_EMISSIONS(YDMODEL, & REAL(KIND=JPRB), INTENT(IN) :: PDELP(KLON,KLEV) ! Tracer state, flux and tendency arrays -REAL(KIND=JPRB), INTENT(IN) :: PCEN(KLON,KLEV,KTRAC) +REAL(KIND=JPRB), INTENT(IN) :: PCEN(KLON,KLEV,KTRAC) REAL(KIND=JPRB), INTENT(INOUT) :: PTENC(KLON,KLEV,KTRAC) REAL(KIND=JPRB), INTENT(INOUT) :: PCFLX(KLON,KTRAC) ! Emission field inputs -REAL(KIND=JPRB), INTENT(IN) :: PEMIS2D(KLON, YDMODEL%YRML_GCONF%YGFL%NEMIS2D) -REAL(KIND=JPRB), INTENT(IN) :: PEMIS3D(KLON, KLEV, YDMODEL%YRML_GCONF%YGFL%NEMIS3D) +REAL(KIND=JPRB), INTENT(IN) :: PEMIS2D(KLON, YDMODEL%YRML_GCONF%YGFL%NEMIS2D) +REAL(KIND=JPRB), INTENT(IN) :: PEMIS3D(KLON, KLEV, YDMODEL%YRML_GCONF%YGFL%NEMIS3D) REAL(KIND=JPRB), INTENT(IN), TARGET :: PEMIS2DAUX(KLON, YDMODEL%YRML_GCONF%YGFL%NEMIS2DAUX) ! Optional diagnostic output arrays -REAL(KIND=JPRB),INTENT(INOUT) :: PEXTRA(:,:,:) +REAL(KIND=JPRB), INTENT(INOUT) :: PEXTRA(:,:,:) ! Tracer index arrays INTEGER(KIND=JPIM), INTENT(IN) :: KCHEM(YDMODEL%YRML_GCONF%YGFL%NCHEM) @@ -75,11 +102,12 @@ SUBROUTINE COMPO_APPLY_EMISSIONS(YDMODEL, & INTEGER(KIND=JPIM) :: IFOUND REAL(KIND=JPHOOK) :: ZHOOK_HANDLE -REAL(KIND=JPRB) :: ZSFCFR_LAND, ZSFCFR_SEA, ZTANDEC -REAL(KIND=JPRB), POINTER :: ZINJF(:), ZVOLCALTI(:), ZPARAM(:) -REAL(KIND=JPRB) :: ZPROFILE(KLON, KLEV+1), ZPROFILE_LAND(KLON, KLEV+1), ZPROFILE_SEA(KLON, KLEV+1) -REAL(KIND=JPRB) :: ZFLUX(KLON) -REAL(KIND=JPRB) , DIMENSION (KLON) :: ZDIURN, ZDIURNTMP +REAL(KIND=JPRB) :: ZSFCFR_LAND, ZSFCFR_SEA, ZTANDEC +REAL(KIND=JPRB) :: ZPROFILE(KLON, KLEV+1) +REAL(KIND=JPRB) :: ZPROFILE_LAND(KLON, KLEV+1), ZPROFILE_SEA(KLON, KLEV+1) +REAL(KIND=JPRB) :: ZFLUX(KLON) +REAL(KIND=JPRB), POINTER :: ZINJF(:), ZVOLCALTI(:), ZPARAM(:) +REAL(KIND=JPRB), DIMENSION (KLON) :: ZDIURN, ZDIURNTMP LOGICAL :: LLFIREPRESENT(KLON), LLHAVEFIREPRESENT @@ -91,16 +119,20 @@ SUBROUTINE COMPO_APPLY_EMISSIONS(YDMODEL, & !----------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('COMPO_APPLY_EMISSIONS',0,ZHOOK_HANDLE) -ASSOCIATE(YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO, & - & YDRIP=>YDMODEL%YRML_GCONF%YRRIP, & - & YDPHY2=>YDMODEL%YRML_PHY_MF%YRPHY2,YGFL=>YDMODEL%YRML_GCONF%YGFL,YDERIP=>YDMODEL%YRML_PHY_RAD%YRERIP) -ASSOCIATE(NAERO=>YGFL%NAERO, NACTAERO=>YGFL%NACTAERO, NGHG=>YGFL%NGHG, NCHEM=>YGFL%NCHEM, & - & YCHEM=>YGFL%YCHEM, YAERO=>YGFL%YAERO, YGHG=>YGFL%YGHG, & - & NEMIS2D_DESC=>YDCOMPO%NEMIS2D_DESC, YEMIS2D_DESC=>YDCOMPO%YEMIS2D_DESC, & - & NEMIS3D_DESC=>YDCOMPO%NEMIS3D_DESC, YEMIS3D_DESC=>YDCOMPO%YEMIS3D_DESC, & - & LCHEM_DIA=>YDCOMPO%LCHEM_DIA, & - & RSIDECM=>YDERIP%RSIDECM,RCODECM=>YDERIP%RCODECM, & - & TSPHY=>YDPHY2%TSPHY) +ASSOCIATE( & + & YDCOMPO => YDMODEL%YRML_CHEM%YRCOMPO, YDRIP => YDMODEL%YRML_GCONF%YRRIP, & + & YDPHY2 => YDMODEL%YRML_PHY_MF%YRPHY2, YGFL => YDMODEL%YRML_GCONF%YGFL, & + & YDERIP => YDMODEL%YRML_PHY_RAD%YRERIP ) +ASSOCIATE( & + ! --- [ YGL ] ----------------------------------------------------------------- + & NAERO => YGFL%NAERO, NACTAERO => YGFL%NACTAERO, NGHG => YGFL%NGHG, & + & NCHEM => YGFL%NCHEM, YCHEM => YGFL%YCHEM, YAERO => YGFL%YAERO, & + & YGHG => YGFL%YGHG, & + ! --- [ YDCOMPO, YDPHY, YDERIP ] ---------------------------------------------- + & NEMIS2D_DESC => YDCOMPO%NEMIS2D_DESC, YEMIS2D_DESC => YDCOMPO%YEMIS2D_DESC, & + & NEMIS3D_DESC => YDCOMPO%NEMIS3D_DESC, YEMIS3D_DESC => YDCOMPO%YEMIS3D_DESC, & + & LCHEM_DIA => YDCOMPO%LCHEM_DIA, TSPHY => YDPHY2%TSPHY, & + & RSIDECM => YDERIP%RSIDECM, RCODECM => YDERIP%RCODECM ) LLHAVEFIREPRESENT = .FALSE. NULLIFY(ZINJF) @@ -130,6 +162,19 @@ SUBROUTINE COMPO_APPLY_EMISSIONS(YDMODEL, & ZTANDEC = RSIDECM / MAX(RCODECM, 1.0E-12_JPRB) ! New-style flexible 2D emissions processing for chemistry species + +!------------------------------------------------------------------------------- +! RCHG: the subroutines inside contains inherite the variables definitions. +! In particular PEMIS2D, PEMIS3D, PEMIS2DAUX are read INTENT(IN) in main subr. +! and therefore avaliable in subroutines after CONTAINS. I understand that +! definitions are not going upwards from contained subroutine to main one. +! PEMIS2D, PEMIS3D and PEMIS2DAUX has the emitted fields from grib-files already +! read. Here we try to "inject" into the tracers +! (techically assumening NON_SIMPLE_TRACER=TRUE we should either call other new +! APPLY_2D_EMISSION or modified versions. In anycase the work to be done is in +! APPLY_2D_EMISSION +!------------------------------------------------------------------------------- + DO JEMIS=1,NEMIS2D_DESC IF (.NOT. YEMIS2D_DESC(JEMIS)%NON_SIMPLE_TRACER) THEN IFOUND = 0 @@ -148,6 +193,7 @@ SUBROUTINE COMPO_APPLY_EMISSIONS(YDMODEL, & ELSEIF (IFOUND > 1) THEN CALL ABOR1('COMPO_APPLY_EMISSIONS: (2D) Multiple tracers found for species '//TRIM(YEMIS2D_DESC(JEMIS)%SPECIES)) ENDIF + ENDIF ENDDO @@ -181,8 +227,25 @@ SUBROUTINE COMPO_APPLY_EMISSIONS(YDMODEL, & CONTAINS - SUBROUTINE APPLY_2D_EMISSION(KSPECIES, YDSPECIES, YDEMIS_DESC, LDDIAGFLUX, LDDIAGTEND, KDIAGSHIFT, KFOUND, KINDEX) - + SUBROUTINE APPLY_2D_EMISSION( KSPECIES, YDSPECIES, YDEMIS_DESC, LDDIAGFLUX,& + & LDDIAGTEND, KDIAGSHIFT, KFOUND, KINDEX) + !╭─────────────────────────────────────────────────────────────────────────────╮ + !│ (updated May-2024) │ + !│ Purpose : │ + !│ ------- │ + !│ Apply 2D emissions to sfc flux and tendencies │ + !│ │ + !│ Author : │ + !│ ------- │ + !│ Zak Kipling (ECMWF) │ + !│ │ + !│ Modifications : │ + !│ ------------- │ + !│ May. 2024 - R. Checa-Garcia (KNMI) Added option for number particle emis │ + !│ │ + !│ │ + !╰─────────────────────────────────────────────────────────────────────────────╯ + IMPLICIT NONE INTEGER(KIND=JPIM), INTENT(IN) :: KSPECIES ! = NCHEM, NAERO or NGHG @@ -197,16 +260,20 @@ SUBROUTINE APPLY_2D_EMISSION(KSPECIES, YDSPECIES, YDEMIS_DESC, LDDIAGFLUX, LDDIA INTEGER(KIND=JPIM) :: ITRAC ! index of current tracer in all-tracers arrays (looked up via KINDEX) INTEGER(KIND=JPIM) :: IDIAGSLOT ! index of current tracer in PEXTRA diagnostics (after adding KDIAGSHIFT) - REAL(KIND=JPRB) :: ZSFCFLUX(KLON) ! actual surface flux after elevated emissions applied + REAL(KIND=JPRB) :: ZSFCFLUX(KLON) ! actual surface flux after elevated emissions applied - REAL(KIND=JPHOOK) :: ZHOOK_HANDLE + ! ADDITIONAL ARRAYS/VARIABLES FOR NUM_PARTICLES FLUX + REAL(KIND=JPRB) :: ZFLUX_NUM(KLON), ZSFCFLUX_NUM(KLON) + INTEGER(KIND=JPIM) :: ITRAC_NUM + + REAL(KIND=JPHOOK) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('COMPO_APPLY_EMISSIONS:APPLY_2D_EMISSION',0,ZHOOK_HANDLE) - ASSOCIATE(YDRIP=>YDMODEL%YRML_GCONF%YRRIP, & - & YDPHY2=>YDMODEL%YRML_PHY_MF%YRPHY2) - ASSOCIATE(TSPHY=>YDPHY2%TSPHY) - DO JSPECIES=1,KSPECIES - IF (YDSPECIES(JSPECIES)%CNAME == YDEMIS_DESC%SPECIES) THEN + + ASSOCIATE( YDRIP=>YDMODEL%YRML_GCONF%YRRIP, YDPHY2=>YDMODEL%YRML_PHY_MF%YRPHY2) + ASSOCIATE( TSPHY=>YDPHY2%TSPHY ) + DO JSPECIES=1,KSPECIES + IF (YDSPECIES(JSPECIES)%CNAME == YDEMIS_DESC%SPECIES) THEN ! YDEMIS_DESC% is the namelist for emission IF (PRESENT(KINDEX)) THEN ITRAC = KINDEX(JSPECIES) ELSE @@ -215,11 +282,12 @@ SUBROUTINE APPLY_2D_EMISSION(KSPECIES, YDSPECIES, YDEMIS_DESC, LDDIAGFLUX, LDDIA IDIAGSLOT = KDIAGSHIFT + JSPECIES - CALL COMPO_DIURNAL(YDRIP, KIDIA, KFDIA, KLON, YDEMIS_DESC%DIURNAL_CYCLE_TYPE, & - & PGELAM, PGELAT, ZDIURN, & - & PAMPLITUDE=YDEMIS_DESC%DIURNAL_AMPLITUDE, & - & PHOURPEAK=YDEMIS_DESC%DIURNAL_PEAK_HOUR, & - & PBASELINE=YDEMIS_DESC%DIURNAL_BASELINE, & + CALL COMPO_DIURNAL(YDRIP, KIDIA, KFDIA, KLON, & + & YDEMIS_DESC%DIURNAL_CYCLE_TYPE, PGELAM, PGELAT, & + & ZDIURN, & ! [THIS IS THE OUTPUT] -> diurnal scale + & PAMPLITUDE=YDEMIS_DESC%DIURNAL_AMPLITUDE, & ! optional parameter default 0.0 + & PHOURPEAK=YDEMIS_DESC%DIURNAL_PEAK_HOUR, & ! optional parameter default 12.0 + & PBASELINE=YDEMIS_DESC%DIURNAL_BASELINE, & ! optional parameter default 0.0 & PTANDEC=ZTANDEC) ! Legacy support: override diurnal cycle where fire present @@ -231,10 +299,15 @@ SUBROUTINE APPLY_2D_EMISSION(KSPECIES, YDSPECIES, YDEMIS_DESC, LDDIAGFLUX, LDDIA & PHOURPEAK=13.5_JPRB, PBASELINE=0.2_JPRB ) WHERE(LLFIREPRESENT(KIDIA:KFDIA)) ZDIURN(KIDIA:KFDIA) = ZDIURNTMP(KIDIA:KFDIA) ENDIF - + ! This is the surface / total column flux after scaling and diurnal cycle application ZFLUX(KIDIA:KFDIA) = - PEMIS2D(KIDIA:KFDIA,YDEMIS_DESC%PARAM_INDEX) * ZDIURN(KIDIA:KFDIA) * YDEMIS_DESC%SCALING - + + + ! HERE we have the ZFLUX and where is there we need to call a new function that digest the input of PSD_* + ! and change the ZFLUX of the tracer with number of particles + ! probably this is the only ammount to be changed. + IF ( YDEMIS_DESC%VERTICAL_PROFILE_TYPE == 'HeightMap' .OR. & & YDEMIS_DESC%VERTICAL_PROFILE_TYPE == 'AltitudeMap' .OR. & & YDEMIS_DESC%VERTICAL_PROFILE_TYPE == 'GFAS' ) THEN @@ -246,15 +319,16 @@ SUBROUTINE APPLY_2D_EMISSION(KSPECIES, YDSPECIES, YDEMIS_DESC, LDDIAGFLUX, LDDIA NULLIFY(ZPARAM) IF (YDEMIS_DESC%VERTICAL_PARAM_INDEX > 0) ZPARAM => PEMIS2DAUX(:,YDEMIS_DESC%VERTICAL_PARAM_INDEX) - CALL COMPO_INJECTION_PROFILE(KIDIA, KFDIA, KLON, KLEV, YDEMIS_DESC%VERTICAL_PROFILE_TYPE, & - & ZPROFILE, & - & PSFCFRAC=YDEMIS_DESC%VERTICAL_SURFACE_FRACTION, & - & PBASEHEIGHT=YDEMIS_DESC%VERTICAL_BASE_HEIGHT, & - & PTOPHEIGHT=YDEMIS_DESC%VERTICAL_TOP_HEIGHT, & - & PTHRESHOLD=YDEMIS_DESC%VERTICAL_THRESHOLD, & - & KBASELEV=YDEMIS_DESC%VERTICAL_BASE_LEVEL, & - & KTOPLEV=YDEMIS_DESC%VERTICAL_TOP_LEVEL, & - & PPARAM=ZPARAM, & + CALL COMPO_INJECTION_PROFILE(KIDIA, KFDIA, KLON, KLEV, & + & YDEMIS_DESC%VERTICAL_PROFILE_TYPE, & + & ZPROFILE, & + & PSFCFRAC=YDEMIS_DESC%VERTICAL_SURFACE_FRACTION, & + & PBASEHEIGHT=YDEMIS_DESC%VERTICAL_BASE_HEIGHT, & + & PTOPHEIGHT=YDEMIS_DESC%VERTICAL_TOP_HEIGHT, & + & PTHRESHOLD=YDEMIS_DESC%VERTICAL_THRESHOLD, & + & KBASELEV=YDEMIS_DESC%VERTICAL_BASE_LEVEL, & + & KTOPLEV=YDEMIS_DESC%VERTICAL_TOP_LEVEL, & + & PPARAM=ZPARAM, & & PBLH=PBLH, PAPHIF=PAPHIF, PDELP=PDELP) ! Legacy support: override injection heights for fires, volcanoes and stacks @@ -332,6 +406,7 @@ SUBROUTINE APPLY_2D_EMISSION(KSPECIES, YDSPECIES, YDEMIS_DESC, LDDIAGFLUX, LDDIA ENDIF ENDIF + ! Note: ZPROFILE is always positive, for 1:KLEV and for KLEV+1; ! ZFLUX is negative for an emission as per usual IFS convention DO JK=1,KLEV @@ -355,11 +430,27 @@ SUBROUTINE APPLY_2D_EMISSION(KSPECIES, YDSPECIES, YDEMIS_DESC, LDDIAGFLUX, LDDIA ! where GHG comes first!) PEXTRA(KIDIA:KFDIA,IDIAGSLOT,IEXTR_EM) = PEXTRA(KIDIA:KFDIA,IDIAGSLOT,IEXTR_EM) - ZSFCFLUX(KIDIA:KFDIA) * TSPHY ENDIF - + + ! RCHG -> If emission descripction indicate PSD_N0_TRACER then we have to add + ! emission number to the specific mode. This is done in GET_2D_EMISSION_M7_NUMPAR + ! which has two outputs: ZFLUX for NUMPAR and the index of tracer for NUMPAR + ! In the case of EMISSION_M7_NUMPAR it is important to remember than + ! several species can contribute to PCFLX and PTENC of emission numbers as there is + ! one tracer of total number of particles per mode but several mass species per mode. + + IF (YDEMIS_DESC%PSD_N0_TRACER /= 'NONE') THEN + CALL GET_2D_EMISSION_M7_NUMPAR( JSPECIES, KSPECIES, YDSPECIES, YDEMIS_DESC, ZPROFILE, KINDEX, & + & ZFLUX, ZFLUX_NUM, ZSFCFLUX_NUM, ITRAC_NUM) + DO JK=1,KLEV + PTENC(KIDIA:KFDIA,JK,ITRAC_NUM) = PTENC(KIDIA:KFDIA,JK,ITRAC_NUM) - ZPROFILE(KIDIA:KFDIA,JK) * ZFLUX_NUM(KIDIA:KFDIA) + ENDDO + PCFLX(KIDIA:KFDIA,ITRAC_NUM) = PCFLX(KIDIA:KFDIA,ITRAC_NUM) + ZSFCFLUX_NUM(KIDIA:KFDIA) + ENDIF + KFOUND = KFOUND + 1 ENDIF ENDDO - END ASSOCIATE + END ASSOCIATE END ASSOCIATE IF (LHOOK) CALL DR_HOOK('COMPO_APPLY_EMISSIONS:APPLY_2D_EMISSION',1,ZHOOK_HANDLE) END SUBROUTINE APPLY_2D_EMISSION @@ -441,4 +532,105 @@ SUBROUTINE APPLY_3D_EMISSION(KSPECIES, YDSPECIES, YDEMIS_DESC, LDDIAGTEND, KFOUN IF (LHOOK) CALL DR_HOOK('COMPO_APPLY_EMISSIONS:APPLY_3D_EMISSION',1,ZHOOK_HANDLE) END SUBROUTINE APPLY_3D_EMISSION + + SUBROUTINE GET_2D_EMISSION_M7_NUMPAR( JSPECIES, KSPECIES, YDSPECIES, YDEMIS_DESC, & + & ZPROFILE, KINDEX, & + & ZFLUX, ZFLUX_NUM, ZSFCFLUX_NUM, ITRAC_NUM) + + !╭─────────────────────────────────────────────────────────────────────────────╮ + !│ (updated May-2024) │ + !│ Purpose : │ + !│ ------- │ + !│ SUBROUTINE TO CALLED WHEN NON_SIMPLE_TRACER and M7 inside APPLY_2D_EMISSION │ + !│ for those modes where changes in NUMBER PARTICLES are needed │ + !│ The output of this function should be ZFLUX for number of particles and this│ + !│ Note that this is not used for CHEM species only AERO │ + !│ │ + !│ Author : │ + !│ ------- │ + !│ R.Checa-Garca (KNMI) │ + !│ │ + !│ Modifications : │ + !│ ------------- │ + !│ │ + !│ │ + !╰─────────────────────────────────────────────────────────────────────────────╯ + + USE TM5M7_DATA, ONLY : sigma_lognormal, pom_density, carbon_density + + IMPLICIT NONE + + INTEGER(KIND=JPIM) , INTENT(IN) :: KSPECIES ! = + INTEGER(KIND=JPIM) , INTENT(IN) :: JSPECIES ! = INDEX OF AEROSOL SPECIE with MASS-EMISSIONS + TYPE(TYPE_GFL_COMP), INTENT(IN) :: YDSPECIES(KSPECIES) ! = YCHEM, YAERO or YGHG + TYPE(TCOMPO_EMIS) , INTENT(IN) :: YDEMIS_DESC ! descriptor for this emission + REAL(KIND=JPRB) , INTENT(IN) :: ZFLUX(KLON) + REAL(KIND=JPRB) , INTENT(IN) :: ZPROFILE(KLON,KLEV+1) ! + INTEGER(KIND=JPIM) , INTENT(OUT) :: ITRAC_NUM ! = INDEX OF AEROSOL NUM PARTICLE TRACER + REAL(KIND=JPRB) , INTENT(OUT) :: ZFLUX_NUM(KLON) ! + REAL(KIND=JPRB) , INTENT(OUT) :: ZSFCFLUX_NUM(KLON) ! + INTEGER(KIND=JPIM) , INTENT(IN), OPTIONAL :: KINDEX(KSPECIES) ! = KCHEM, KAERO or nothing for GHG + REAL(KIND=JPHOOK) :: ZHOOK_HANDLE + + ! LOCAL VARIABLES + REAL(KIND=JPRB) :: NUM_SCALE, MASS_TO_NUM_PSD, MASS_TO_NUM_EMI + INTEGER(KIND=JPIM) :: ISPECIES + + IF (LHOOK) CALL DR_HOOK('COMPO_APPLY_EMISSIONS:GET_2D_EMISSION_M7_NUMPAR',0,ZHOOK_HANDLE) + ! From YDEMIS_DESC%SPECIES and YDSPECIES%CNAME we need to get the mode-index for sigma + ! (below rad_emi_ are probably the radius of emissions) + ITRAC_NUM=-1 + DO ISPECIES=1,KSPECIES + IF (YDSPECIES(ISPECIES)%CNAME == YDEMIS_DESC%PSD_N0_TRACER) THEN ! YDEMIS_DESC% is the namelist for emission + IF (PRESENT(KINDEX)) THEN + ITRAC_NUM = KINDEX(ISPECIES) + ELSE + ITRAC_NUM = ISPECIES + ENDIF + ENDIF + ENDDO + IF (ITRAC_NUM==-1) THEN + CALL ABOR1 ('COMPO_APPLY_EMISSIONS:GET_2D_EMISSION_M7_NUMPAR:ISSUE_NUM_N0_TRACER ' // TRIM(YDEMIS_DESC%PSD_N0_TRACER) // 'NOT FOUND') + ENDIF + ! ---------------------------------------------------------------------------------------------- + ! RCHG -> here the implementation is general and the emission specification file and therefore + ! the emission namelist YDEMIS_DESC has the parameters of the PSD to translated the + ! mass-flux into the number-flux. + ! Note that for the mass-density and M7 this can be taken from the definition + ! of the density of each specie. In no M7-scheme we need YDEMIS_DESC%DENSITY. + ! + ! YDEMIS_DESC%PSD_SIGMA -> assumes a lognormal distribution + ! YDEMIS_DESC%PSD_RADIUS -> assumes a lognormal distribution + ! YDEMIS_DESC%DENSITY -> mass-density of particle at emission + ! + ! Currently, it is needed at the namelist but the implementation for M7 can be: + ! ---------------------------------------------------------------------------------------------- + ! IF (AERO_SCHEME="hamm7") THEN + ! DO IMODE=1,NMOD + ! DO INMODE=0,MODE_NM_SED(IMODE) + ! JN=MODE_TRACERS_SED(INMODE_IMODE) + ! IF KAERO(JN)=ITRAC_NUM + ! density = ... + ! ENDIF + ! ENDDO + ! ENDDO + ! ENDIF + ! + ! Other option is to have an data-array with the values. It should be at module/tm5m7_data.F90 + ! but we load here. This data-array should relates ITRAC_NUM to density (if possible). In other + ! words: DENSITY(1:NACTAERO) with DENSITY = DENSITY(KAERO(ITRAC_NUM)) + ! + !----------------------------------------------------------------------------------------------- + NUM_SCALE = EXP(1.5*(LOG(YDEMIS_DESC%PSD_SIGMA))**2) + MASS_TO_NUM_PSD = 3./(4.*RPI*(NUM_SCALE**3)*YDEMIS_DESC%MASS_DENSITY) ! RPI -> real pi inherited from main sub. + MASS_TO_NUM_EMI = MASS_TO_NUM_PSD/(YDEMIS_DESC%PSD_RADIUS**3) + + ! FLUX OUTPUTS + + ZFLUX_NUM(KIDIA:KFDIA) = ZFLUX(KIDIA:KFDIA)*MASS_TO_NUM_EMI + ZSFCFLUX_NUM(KIDIA:KFDIA) = ZPROFILE(KIDIA:KFDIA,KLEV+1) * ZFLUX_NUM(KIDIA:KFDIA) + + IF (LHOOK) CALL DR_HOOK('COMPO_APPLY_EMISSIONS:GET_2D_EMISSION_M7_NUMPAR',1,ZHOOK_HANDLE) + END SUBROUTINE GET_2D_EMISSION_M7_NUMPAR + END SUBROUTINE COMPO_APPLY_EMISSIONS diff --git a/ifs-source/arpifs/phys_ec/gems_init.F90 b/ifs-source/arpifs/phys_ec/gems_init.F90 index f92710c9..5dc25ddb 100644 --- a/ifs-source/arpifs/phys_ec/gems_init.F90 +++ b/ifs-source/arpifs/phys_ec/gems_init.F90 @@ -120,7 +120,7 @@ SUBROUTINE GEMS_INIT(YDSURF, YDML_CHEM,YDEPHY,YGFL,YDPHY2, YDRIP, KIDIA, KFDIA, KTRAC=KTRAC+1 KCHEM(JEXT)=KTRAC ENDDO -!WRITE(*,*) "KAERO",KAERO + ALLOCATE( PCEN(KLON,KLEV,KTRAC) ) ALLOCATE( PTENC(KLON,KLEV,KTRAC) ) ALLOCATE( PTENC_SKF(KLON,KLEV,KTRAC) ) diff --git a/ifs-source/arpifs/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/phys_ec/hamm7_interface.F90 index d2906630..7b2b0afb 100755 --- a/ifs-source/arpifs/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/phys_ec/hamm7_interface.F90 @@ -57,7 +57,7 @@ SUBROUTINE HAMM7_INTERFACE( & ! │ May. 2020 - V. Huijnen : Modifications for TM5M7 │ ! │ Sep. 2020 - T. Bergman : TM5M7 work │ ! │ Apr. 2024 - Lianghai Wu : revision for CY48r1 │ -! │ May. 2020 - R. Checa-Garcia: revision for CY48r1, fix, refactory │ +! │ May. 2024 - R. Checa-Garcia: revision for CY48r1 and refactory │ ! │ │ ! ╰────────────────────────────────────────────────────────────────────────────╯ @@ -433,7 +433,7 @@ SUBROUTINE HAMM7_INTERFACE( & !REAL(KIND=JPRB) :: ZZOUT1(KLON,KLEV),ZZOUT2(KLON,klev),ZZOUT3(KLON,KLEV),ZZOUT4(KLON,KLEV),ZZOUT5(KLON,klev),ZZOUT6(KLON,KLEV) !REAL(KIND=JPRB) :: ZZOUT7(KLON,KLEV),ZZOUT8(KLON,klev),ZZOUT9(KLON,KLEV),ZZOUT10(KLON,KLEV),ZZOUT11(KLON,klev),ZZOUT12(KLON,KLEV) -REAL(KIND=JPRB) :: sedout(KLON,KLEV,ntrac) +REAL(KIND=JPRB) :: sedout(KLON,KLEV,ktrac) ! changed ntrack to ktrac (RCHG) REAL(KIND=JPRB) :: ddepout(KLON,KLEV,KTRAC) REAL(KIND=JPRB) :: Wdepout(KLON,KLEV,ktrac) REAL(KIND=JPRB) :: sedout_2D(KLON,ktrac) @@ -599,7 +599,9 @@ SUBROUTINE HAMM7_INTERFACE( & ! -------------------------------------------------------- ALLOCATE( ZAERNGT(KLON,NACTAERO) ) -ZAERNGT(:,:) = 0._JPRB + +! RCHG -> there is a recurrent error: initialize without KIDIA:KFDIA +ZAERNGT(KIDIA:KFDIA,1:NACTAERO) = 0._JPRB !ALLOCATE( ZAERSCC(KLON,NACTAERO) ) !ALLOCATE( ZAERSRC(KLON,NACTAERO) ) @@ -610,6 +612,13 @@ SUBROUTINE HAMM7_INTERFACE( & !ZAEROUT3(:,:) =0._JPRB !ZAEROUT4(:,:) =0._JPRB !ZAEROUT5(:,:) =0._JPRB + +! +! RCHG -> FIXME be careful. This subroutine has KIDIA, KFDIA in the +! arguments so probably it is designed for parallel grid. +! this initialization may overwrite zeros the proper way might +! be ARRAY(KIDIA:KFDIA,:,:) = 0._JPRB +! ZOUT(:,:) = 0._JPRB ZOUT2(:,:) = 0._JPRB ZOUT3(:,:,:) = 0._JPRB @@ -664,6 +673,7 @@ SUBROUTINE HAMM7_INTERFACE( & CALL TROPLEV(KLON,KIDIA,KFDIA,KLEV,.FALSE.,PTP,PQP,PRSF1,IKLEVTROP) ! Initializing tracer number and mixing ratios and gas concentrations to not be tendency updated values +ZCEN(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB ITRC=0 DO JEXT=1,NGHG ITRC=ITRC+1 @@ -678,7 +688,7 @@ SUBROUTINE HAMM7_INTERFACE( & ITRC=ITRC+1 DO JK=1,KLEV DO JL=KIDIA,KFDIA - ZCEN(JL,JK,ITRC) = PGFL(JL,JK,YTRAC(JEXT)%MP9_PH) + ZCEN(JL,JK,ITRC) = PGFL(JL,JK,YTRAC(JEXT)%MP9_PH) ENDDO ENDDO ENDDO @@ -861,14 +871,15 @@ SUBROUTINE HAMM7_INTERFACE( & ZSVOC(KIDIA:KFDIA,1:KLEV)=0.0_JPRB END IF +! RCHG => before it has ZICNC(:,:)=0._JPRB which is a semantic error. !calculate ICNC -ZICNC(:,:) = 0._JPRB -ZICNC(:,:) = RNICE +ZICNC(KIDIA:KFDIA,1:KLEV) = 0._JPRB +ZICNC(KIDIA:KFDIA,1:KLEV) = RNICE !Put tracer mixing ratios and tendencies to from OIFS to HAM !initialize to zero -ZXTM1(:,:,:) = 0._JPRB -ZXTTE(:,:,:) = 0._JPRB -ZXTTEM1(:,:,:) = 0._JPRB +ZXTM1(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB +ZXTTE(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB +ZXTTEM1(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB !number DO JCLASS=1,nclass @@ -927,6 +938,7 @@ SUBROUTINE HAMM7_INTERFACE( & ! for these cases. For this we need to find the best flags or combinations ! of flags. FIXME +! IF (LAERRRTM) THEN !cloud DO JCLOUD=1,2 !CDNC and ICNC DO JK=1,KLEV @@ -936,7 +948,7 @@ SUBROUTINE HAMM7_INTERFACE( & END DO END DO END DO - +!ENDIF ! implementation of HAM-M7 ZWND(:) = 0._JPRB @@ -952,7 +964,6 @@ SUBROUTINE HAMM7_INTERFACE( & SELECT CASE (TRIM(AERO_SCHEME)) CASE ("tm5m7") - ! ** OBSOLETE ** (PLS) !alaak: commented out because model crashes @@ -985,7 +996,6 @@ SUBROUTINE HAMM7_INTERFACE( & !!$ PTSPHY) CASE("hamm7") - ! Initializations for submodel interface ZGRVOL(KIDIA:KFDIA,1:KLEV) = 1.79e12_JPRB ! ZGRVOL is only used for diagnostics (only when HAMMOZ is on) ZPBL = 1 ! boundary layer top = 1 (ITOP=1) @@ -1533,10 +1543,10 @@ SUBROUTINE HAMM7_INTERFACE( & IF(MOD(NSTEP+1,NRADFR) == 0) THEN CALL GSTATS(2506,0) -ZAER_TAU(:,:,:,:)=0.0_JPRB -ZAER_SSA(:,:,:)=0.0_JPRB -ZAER_ASYM(:,:,:)=0.0_JPRB -ZAER_TAU_LW(:,:,:)=0.0_JPRB +ZAER_TAU(KIDIA:KFDIA,:,:,:) = 0.0_JPRB +ZAER_SSA(KIDIA:KFDIA,:,:) = 0.0_JPRB +ZAER_ASYM(KIDIA:KFDIA,:,:) = 0.0_JPRB +ZAER_TAU_LW(KIDIA:KFDIA,:,:) = 0.0_JPRB SELECT CASE (NAEROOPT) @@ -1558,10 +1568,10 @@ SUBROUTINE HAMM7_INTERFACE( & ZAEROK = ZAEROK+ZTAERO*time_step_len - CALL TM5M7_OPTICS_AOP_GET(YGFL, YREAERSRC, KIDIA,KFDIA, KLON, KLEV,NACTAERO, & - & NASWBAND, ASWBAND, 1, .false., & - & ZRHO, ZAEROK,RW_MODE,RWD_MODE,H2O_MODE,& - & ZAER_TAU, ZAER_SSA, ZAER_ASYM) + CALL TM5M7_OPTICS_AOP_GET( YGFL, YREAERSRC, KIDIA,KFDIA, KLON, KLEV,NACTAERO, & + & NASWBAND, ASWBAND, 1, .false., & + & ZRHO, ZAEROK,RW_MODE,RWD_MODE,H2O_MODE,& + & ZAER_TAU, ZAER_SSA, ZAER_ASYM) PAOD(KIDIA:KFDIA,:)=0._JPRB DO JK = 1, KLEV @@ -1611,7 +1621,7 @@ SUBROUTINE HAMM7_INTERFACE( & LWBANDS=16 PRS1D(KIDIA:KFDIA,:) = PRS1(KIDIA:KFDIA,1:KLEV)-PRS1(KIDIA:KFDIA,0:KLEV-1) !CALL ham_rad_cache(KLON,KLEV) - ZXTM0 = ZXTM1+ZXTTE*time_step_len + ZXTM0(KIDIA:KFDIA,1:KLEV,:) = ZXTM1(KIDIA:KFDIA,1:KLEV,:) + ZXTTE(KIDIA:KFDIA,1:KLEV,:)*time_step_len CALL HAM_RAD(KFDIA, KLON, KLEV, ZKROW, LWBANDS, NASWBAND, ZXTM0, PRS1D, & & ZAER_TAU(:,:,:,1), ZAER_SSA, ZAER_ASYM, ZAER_TAU_LW, ZM6RP) !CALL ham_rad_cache_cleanup @@ -1723,6 +1733,8 @@ SUBROUTINE HAMM7_INTERFACE( & ! ENDDO ! ENDDO + +! RCHG -> TODO explain here LIFSMIN and LIFSTRAJ --- IF(.NOT.LIFSMIN .AND. .NOT.LIFSTRAJ) THEN ! input for HAM-M7 PGFL(KIDIA:KFDIA,1,YAEROUT(1)%MP)=PAOD(KIDIA:KFDIA,10) !PAER_TAU(KIDIA:KFDIA,1:KLEV,10) !533nm @@ -1804,7 +1816,7 @@ SUBROUTINE HAMM7_INTERFACE( & ! It is not clear when NACTERO and when NTRAC DO JN=1,NACTAERO PGFL(KIDIA:KFDIA,JN,YAEROUT(22)%MP)=DDEPOUT(KIDIA:KFDIA,KLEV,KAERO(JN)) - PGFL(KIDIA:KFDIA,JN,YAEROUT(28)%MP)=PAERSRC(KIDIA:KFDIA,KAERO(JN)) + PGFL(KIDIA:KFDIA, JN, YAEROUT(28)%MP) = PAERSRC(KIDIA:KFDIA,KAERO(JN)) ! Emissions per specie END DO DO JN=1,NTRAC PGFL(KIDIA:KFDIA,JN,YAEROUT(23)%MP)=WDEPOUT(KIDIA:KFDIA,KLEV,JN) diff --git a/ifs-source/arpifs/phys_ec/local_arrays_fin.F90 b/ifs-source/arpifs/phys_ec/local_arrays_fin.F90 index fb77cc2d..efeced83 100644 --- a/ifs-source/arpifs/phys_ec/local_arrays_fin.F90 +++ b/ifs-source/arpifs/phys_ec/local_arrays_fin.F90 @@ -64,6 +64,7 @@ SUBROUTINE LOCAL_ARRAYS_FIN(LLKEYS,AUXL,SURFL,PERTL,GEMSL) !----------------------------------------------------------------------- REAL(KIND=JPHOOK) :: ZHOOK_HANDLE + !----------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('LOCAL_ARRAYS_FIN',0,ZHOOK_HANDLE) diff --git a/ifs-source/arpifs/phys_ec/local_arrays_ini.F90 b/ifs-source/arpifs/phys_ec/local_arrays_ini.F90 index da75661b..99362727 100644 --- a/ifs-source/arpifs/phys_ec/local_arrays_ini.F90 +++ b/ifs-source/arpifs/phys_ec/local_arrays_ini.F90 @@ -128,11 +128,6 @@ SUBROUTINE LOCAL_ARRAYS_INI(YDGEOMETRY,YDSURF,YDMODEL,KDIM, LLKEYS, PAUX, AUXL, ! ----------------------------------------- ! Initialization DO JL=KDIM%KIDIA,KDIM%KFDIA - !write(*,*) "JL", JL - !write(*,*) "PRAD%PEMTC(JL,1)",PRAD%PEMTC(JL,1) - !write(*,*) "PRAD%PEMTC(JL,KDIM%KLEV+1)",PRAD%PEMTC(JL,KDIM%KLEV+1) - !write(*,*) "AUXL%ZCEMTR(JL,0)",AUXL%ZCEMTR(JL,0) - !write(*,*) "AUXL%ZCEMTR(JL,1)",AUXL%ZCEMTR(JL,1) AUXL%ZSUDU (JL) =PRAD%PSRSWDCS(JL) AUXL%ZCEMTR(JL,0)=PRAD%PEMTC(JL,1) AUXL%ZCEMTR(JL,1)=PRAD%PEMTC(JL,KDIM%KLEV+1) diff --git a/ifs-source/arpifs/phys_ec/m7.F90 b/ifs-source/arpifs/phys_ec/m7.F90 index 0407e3df..ae6016c3 100755 --- a/ifs-source/arpifs/phys_ec/m7.F90 +++ b/ifs-source/arpifs/phys_ec/m7.F90 @@ -1,8 +1,8 @@ -SUBROUTINE m7(KIDIA, KFDIA, KLON, KLEV, & ! TM5 indices - papp1, prelhum, ptp1, & ! " thermodynamics - pso4g, pelvoc, psvoc, paerml, paernl, & ! M7 tracers - prhop, pww, pm6rp, pm6dry, & ! " aerosol properties - ptime ) ! TM5 time step +SUBROUTINE m7(KIDIA, KFDIA, KLON, KLEV, & ! TM5 indices + papp1, prelhum, ptp1, & ! " thermodynamics + pso4g, pelvoc, psvoc, paerml, paernl, & ! M7 tracers + prhop, pww, pm6rp, pm6dry, & ! " aerosol properties + ptime ) ! TM5 time step ! ! ****m7* Aerosol model for the system so4,bc,oc,soa,ss,dust in 7 modes. ! @@ -48,8 +48,8 @@ SUBROUTINE m7(KIDIA, KFDIA, KLON, KLEV, & ! TM5 indices ! !USE mo_aero_m7, ONLY: lsnucl, lscoag, lscond, & - USE TM5M7_DATA, ONLY: nmod, nss, nsol, naermod -USE PARKIND1 , ONLY : JPIM, JPRB + USE TM5M7_DATA, ONLY : nmod, nss, nsol, naermod + USE PARKIND1, ONLY : JPIM, JPRB ! use tracer_data, only : tracer_print ! use GO, only : gol, goErr, goPr, goBug ! use mo_aero, only : nsoa !RM @@ -85,21 +85,15 @@ SUBROUTINE m7(KIDIA, KFDIA, KLON, KLEV, & ! TM5 indices INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA, KFDIA, KLON, KLEV REAL(KIND=JPRB),INTENT(IN) :: ptime - - REAL(KIND=JPRB),INTENT(IN) :: prelhum(KLON,KLEV), papp1(KLON,KLEV), & - ptp1(KLON,KLEV) - REAL(KIND=JPRB),INTENT(INOUT) :: pso4g(KLON,KLEV), pelvoc(KLON,KLEV), psvoc(KLON,KLEV) !RM - - REAL(KIND=JPRB),INTENT(INOUT) :: paerml(KLON,KLEV,naermod), paernl(KLON,KLEV,nmod), & - pm6rp(KLON,KLEV,nmod), pm6dry(KLON,KLEV,nsol), & - prhop(KLON,KLEV,nmod), pww(KLON,KLEV,nmod) + REAL(KIND=JPRB),INTENT(IN) :: prelhum(KLON,KLEV), papp1(KLON,KLEV), ptp1(KLON,KLEV) + REAL(KIND=JPRB),INTENT(INOUT) :: pso4g(KLON,KLEV), pelvoc(KLON,KLEV), psvoc(KLON,KLEV) !RM + REAL(KIND=JPRB),INTENT(INOUT) :: paerml(KLON,KLEV,naermod), paernl(KLON,KLEV,nmod), & + & pm6rp(KLON,KLEV,nmod), pm6dry(KLON,KLEV,nsol), & + & prhop(KLON,KLEV,nmod), pww(KLON,KLEV,nmod) ! Local variables: - - REAL(KIND=JPRB) :: zso4_5(KLON,KLEV), zso4_6(KLON,KLEV), & - zso4_7(KLON,KLEV) - + REAL(KIND=JPRB) :: zso4_5(KLON,KLEV), zso4_6(KLON,KLEV), zso4_7(KLON,KLEV) REAL(KIND=JPRB) :: zhplus(KLON,KLEV,nss) REAL(KIND=JPRB) :: zttn(KLON,KLEV,naermod) @@ -107,17 +101,15 @@ SUBROUTINE m7(KIDIA, KFDIA, KLON, KLEV, & ! TM5 indices ! !--- 0) Initialisations: ------------------------------------------------- ! - zhplus(:,:,:) = 0. - pm6dry(:,:,:) = 0. - pm6rp(:,:,:) = 0. - zttn(:,:,:) = 0. - prhop(:,:,:) = 0. - pww(:,:,:) = 0. - zso4_5(:,:) = 0. - zso4_6(:,:) = 0. - zso4_7(:,:) = 0. - - + zhplus(:,:,:) = 0._JPRB + pm6dry(:,:,:) = 0._JPRB + pm6rp(:,:,:) = 0._JPRB + zttn(:,:,:) = 0._JPRB + prhop(:,:,:) = 0._JPRB + pww(:,:,:) = 0._JPRB + zso4_5(:,:) = 0._JPRB + zso4_6(:,:) = 0._JPRB + zso4_7(:,:) = 0._JPRB !!$ ! !!$ !--- 1) Calculation of particle properties under ambient conditions: ----- diff --git a/ifs-source/arpifs/phys_ec/mo_ham_m7.F90 b/ifs-source/arpifs/phys_ec/mo_ham_m7.F90 index d550fbf6..ad05cd42 100644 --- a/ifs-source/arpifs/phys_ec/mo_ham_m7.F90 +++ b/ifs-source/arpifs/phys_ec/mo_ham_m7.F90 @@ -870,22 +870,11 @@ SUBROUTINE m7_averageproperties(kproma, kbdim, klev, krow, paernl, paerml, pttn, !>>SF #458 (replacing WHERE statements) zaltern_val = MERGE(critn, 0._dp, (jn == iso4ns)) - - !write(*,*) "paernl", paernl - !write(*,*) "cmin_aernl",cmin_aernl - !write(*,*) "cmin_aerml", cmin_aerml ll1(1:kproma,:) = (paernl(1:kproma,:,jclass) > cmin_aernl) & .AND. (paerml(1:kproma,:,jn) > cmin_aerml) ztmp1(1:kproma,:) = MERGE(paernl(1:kproma,:,jclass), 1._dp, ll1(1:kproma,:)) !SF 1. is a dummy val. - !write(*,*) "zunitfac", zunitfac - !write(*,*) "paerml", paerml - !write(*,*) "divide", zunitfac*paerml(1:kproma,:,jn)/ztmp1(1:kproma,:) - !write(*,*) "zaltern_val", zaltern_val - !write(*,*) "ll1", ll1 ztmp1(1:kproma,:) = zunitfac*paerml(1:kproma,:,jn)/ztmp1(1:kproma,:) - !write(*,*) "ztmp1", ztmp1(1:kproma,:) - !pttn(1:kproma,:,jn) = MERGE(zunitfac*paerml(1:kproma,:,jn)/ztmp1(1:kproma,:), zaltern_val, ll1(1:kproma,:)) pttn(1:kproma,:,jn) = MERGE(ztmp1(1:kproma,:), zaltern_val, ll1(1:kproma,:)) !< zmin) paclc(1:kproma,:) = MERGE(paclc(1:kproma,:) , 0._dp, lo_2d(1:kproma,:)) - ztmp1(1:kproma,:) = 0._dp - IF (MINVAL(ABS(zilwc(1:kproma,:)))>0._dp) THEN ztmp1(1:kproma,:) = pmiwc(1:kproma,:)/zilwc(1:kproma,:) ENDIF - !pice(1:kproma,:) = MERGE(pmiwc(1:kproma,:)/zilwc(1:kproma,:), 0._dp, lo_2d(1:kproma,:)) pice(1:kproma,:) = MERGE(ztmp1(1:kproma,:), 0._dp, lo_2d(1:kproma,:)) !--- 1.2) Calculate autoconversion rate: @@ -456,8 +453,6 @@ SUBROUTINE prep_wetdep_hydro(kproma, kbdim, klev, ktop, krow, lstrat, & IF (MINVAL(ABS(pmlwc(1:kproma,:)))>0._dp) THEN ztmp1(1:kproma,:) = (pmratepr(1:kproma,:)+pmsnowacl(1:kproma,:))/pmlwc(1:kproma,:) ENDIF - - !peffwat(1:kproma,:) = MERGE( (pmratepr(1:kproma,:)+pmsnowacl(1:kproma,:))/pmlwc(1:kproma,:) , 0._dp, lo_2d(1:kproma,:)) peffwat(1:kproma,:) = MERGE(ztmp1(1:kproma,:) , 0._dp, lo_2d(1:kproma,:)) @@ -502,8 +497,6 @@ SUBROUTINE prep_wetdep_hydro(kproma, kbdim, klev, ktop, krow, lstrat, & IF (MINVAL(ABS(zfprec(1:kproma,:)))>0._dp) THEN ztmp1(1:kproma,:) = (pfevapr(1:kproma,:)+pfsubls(1:kproma,:))/zfprec(1:kproma,:) ENDIF - - !prevap(1:kproma,:) = MERGE((pfevapr(1:kproma,:)+pfsubls(1:kproma,:))/zfprec(1:kproma,:), 0._dp, lo_2d(1:kproma,:)) prevap(1:kproma,:) = MERGE(ztmp1(1:kproma,:), 0._dp, lo_2d(1:kproma,:)) prevap(1:kproma,:) = MAX(0._dp,MIN(1._dp,prevap(1:kproma,:))) @@ -761,10 +754,7 @@ SUBROUTINE gas_wetdep(kproma, kbdim, klev, ktop, & !--- Change in in-cloud (strat) or updraft (conv) tracer concentration: !>>SF #458 (replacing where statements) - ztmp1(1:kproma,:) = zxtwat(1:kproma,:)*plfrac(1:kproma,:)*peffwat(1:kproma,:) - - !zdxtwat(1:kproma,:) = MERGE( zxtwat(1:kproma,:)*plfrac(1:kproma,:)*peffwat(1:kproma,:), 0._dp, ll_cloud_cov(1:kproma,:)) zdxtwat(1:kproma,:) = MERGE( ztmp1(1:kproma,:), 0._dp, ll_cloud_cov(1:kproma,:)) !<>SF #458 (replacing where statements) ztmp1(1:kproma,:) = zxtice(1:kproma,:)*plfrac(1:kproma,:)*peffice(1:kproma,:) - !zdxtice(1:kproma,:) = MERGE( zxtice(1:kproma,:)*plfrac(1:kproma,:)*peffice(1:kproma,:), 0._dp, ll_cloud_cov(1:kproma,:)) zdxtice(1:kproma,:) = MERGE( ztmp1(1:kproma,:), 0._dp, ll_cloud_cov(1:kproma,:)) !<>SF #458 (replacing where statements) ll1(1:kproma,:) = .NOT. ll_cloud_cov(1:kproma,:) .AND. ll_prcp(1:kproma,:) - ztmp1(1:kproma,:) = -ztmst*zscavcoefbcr(1:kproma,:) - !zcoeffr (1:kproma,:) = MERGE( -ztmst*zscavcoefbcr(1:kproma,:), 0._dp, ll1(1:kproma,:) ) zcoeffr (1:kproma,:) = MERGE( ztmp1(1:kproma,:), 0._dp, ll1(1:kproma,:) ) - ztmp1(1:kproma,:) = -ztmst*zscavcoefbcs(1:kproma,:) - !zcoeffs (1:kproma,:) = MERGE( -ztmst*zscavcoefbcs(1:kproma,:), 0._dp, ll1(1:kproma,:) ) zcoeffs (1:kproma,:) = MERGE( ztmp1(1:kproma,:), 0._dp, ll1(1:kproma,:) ) ztmp1(1:kproma,:) = MERGE(pclc(1:kproma,:), 1._dp, ll1(1:kproma,:)) !SF 1._dp is a dummy value diff --git a/ifs-source/arpifs/phys_ec/su_aerw.F90 b/ifs-source/arpifs/phys_ec/su_aerw.F90 index bd217cf4..4a600f51 100644 --- a/ifs-source/arpifs/phys_ec/su_aerw.F90 +++ b/ifs-source/arpifs/phys_ec/su_aerw.F90 @@ -533,6 +533,7 @@ SUBROUTINE SU_AERW(YDMODEL) RAERVOLE(:,:)=0._JPRB RVOLERUZ(:)= 1._JPRB + ! LAERINIT =.FALSE. -> RCHG FIXME (is this needed) !-- default value are for use of "plain" or "gusty" 10-m wind as predictor for SS and DU NAERWND = 2 diff --git a/ifs-source/arpifs/phys_ec/tm5m7_optics_init.F90 b/ifs-source/arpifs/phys_ec/tm5m7_optics_init.F90 index 4dbaf5ff..dd365a46 100644 --- a/ifs-source/arpifs/phys_ec/tm5m7_optics_init.F90 +++ b/ifs-source/arpifs/phys_ec/tm5m7_optics_init.F90 @@ -156,9 +156,9 @@ SUBROUTINE TM5M7_OPTICS_INIT(NWAV,WDEP) enddo - if (allocated(opac)) deallocate( opac) - if (allocated(echamham)) deallocate(echamham ) - if (allocated(segelstein )) deallocate( segelstein ) + if (allocated(opac)) deallocate( opac) + if (allocated(echamham)) deallocate( echamham ) + if (allocated(segelstein )) deallocate( segelstein ) !-- diff --git a/ifs-source/arpifs/phys_ec/tm5m7_phy2.F90 b/ifs-source/arpifs/phys_ec/tm5m7_phy2.F90 index a36afbb3..9d8d42fd 100644 --- a/ifs-source/arpifs/phys_ec/tm5m7_phy2.F90 +++ b/ifs-source/arpifs/phys_ec/tm5m7_phy2.F90 @@ -108,12 +108,7 @@ SUBROUTINE TM5M7_PHY2 & USE PARKIND1 , ONLY : JPIM, JPRB USE TM5M7_DATA, ONLY : MODAL_DATA,NMOD, NRDEP USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK -!USE YOMPHYDER, ONLY : STATE_TYPE -!USE YOEAERSRC, ONLY : YREAERSRC -!USE YOEAERATM, ONLY : YREAERATM -!USE YOM_YGFL , ONLY : YGFL USE YOMCST , ONLY : RD, RG -!USE YOMRIP , ONLY : YRRIP USE YOMCT3 , ONLY : NSTEP USE YOMLUN , ONLY : NULOUT USE YOMCHEM , ONLY : IEXTR_EM, IEXTR_DD!,YRCHEM @@ -127,7 +122,6 @@ SUBROUTINE TM5M7_PHY2 & TYPE(GEOMETRY) ,INTENT(IN) :: YDGEOMETRY TYPE(MODEL) ,INTENT(INOUT) :: YDMODEL -!TYPE (STATE_TYPE) ,INTENT (IN) :: TENDENCY_CML INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA, KFDIA, KLON, KFLDX, KLEVX INTEGER(KIND=JPIM),INTENT(IN) :: KTDIA, KLEV ,KSTGLO INTEGER(KIND=JPIM),INTENT(IN) :: KSW @@ -310,16 +304,6 @@ SUBROUTINE TM5M7_PHY2 & ! write(8000+MYPROC,*)jtile,jl,PFRTI(JL,JTILE),PAHFSTI(JL,JTILE),PFRTI(JL,JTILE)*PAHFSTI(JL,JTILE) !write(3334,*)jtile,jl,PFRTI(JL,JTILE),PAHFSTI(JL,JTILE) !end DO - !write(*,*)'line1',KIDIA , KFDIA , KLON , KTDIA, KLEV , KTILES, NSTART, NSTEP , KSTGLO - !write(*,*)'line2',KSW , KTRAC , KAERO - !write(*,*)'line3',PALB , PALBD , PAPHI - !write(*,*)'line4',PAERDEP,PAERLTS, PAERSCC, PAERGUST, ZALT - !write(*,*)'line5',PBCBF , PBCFF , PBCGF, POMBF, POMFF, POMGF - !write(*,*)'line6',PRS1 , PRSF1 , PCI , PCLAKE, PINJF, PBLH, ZDP, PGELAM, PGELAT, PGEMU, PFRTI, PHSDFOR - !write(*,*)'line7',PLSM , PSST , PQP , ZRHO , PSNS , PTP , PTL , PTSPHY, PZ0M, KCHEM - !write(*,*)'line8',ZWND , PWSA1 , PSOIL_TYPE - !write(*,*)'line9',PCVL , PCVH, KTVL, KTVH - !write(*,*)'line10',PLDAY , PAERFLX, PCFLX, PCEN , PTENC, ZEMIDIAG, PSO2SRC,PSO4SRC,PSOA,PSOACO CALL TM5M7_SRC & &( YDGEOMETRY, YDMODEL, KIDIA , KFDIA , KLON , KTDIA, KLEV , KTILES, NSTART, NSTEP , KSTGLO, & & KSW , KTRAC , KAERO, & diff --git a/ifs-source/arpifs/phys_ec/tm5m7_src.F90 b/ifs-source/arpifs/phys_ec/tm5m7_src.F90 index dbcdce25..e9f09afc 100644 --- a/ifs-source/arpifs/phys_ec/tm5m7_src.F90 +++ b/ifs-source/arpifs/phys_ec/tm5m7_src.F90 @@ -1,123 +1,139 @@ -SUBROUTINE TM5M7_SRC & - &( YDGEOMETRY, YDMODEL, KIDIA, KFDIA, KLON , KTDIA, KLEV, KTILES, KSTART, KSTEP ,KSTGLO,& - & KSW , KTRAC, KAERO,& - & PALB , PALBD, PAPHI ,& - & PAERDEP, PAERLTS, PAERSCC, PAERGUST, PALTH ,& - & PAPH , PAP , PCI , PCLAKE, PINJF, PBLH, PDELP, PGELAM, PGELAT, PGEMU , PFRTI , PHSDFOR,& - & PLSM , PSST , PQ , PRHO , PSNS , PT , PTL , PTSPHY, PZ0M, KCHEM,& - & PWIND, PWS1 ,PSOIL_TYPE, & - & PCVL, PCVH, KTVL, KTVH, & - & PLDAY, PAERFLX, PCFLX , PCEN , PTENC, PEMIDIAG, PSO2SRC,PSO4SRC) - -!*** * TM5M7_SRC* - SOURCE TERMS FOR TM5M7 AEROSOL SCHEME - -!** INTERFACE. -! ---------- -! *TM5M7_SRC* IS CALLED FROM *TM5M7_PHY2* - - -! AUTHOR. -! ------- -! Vincent Huijnen *KNMI* -! ORIGINAL : 2020-08-25 - -! MODIFICATIONS. -! -------------- -! -! -!----------------------------------------------------------------------- - -USE GEOMETRY_MOD , ONLY : GEOMETRY -USE TYPE_MODEL , ONLY : MODEL -USE PARKIND1 ,ONLY : JPIM, JPRB, JPRD -USE YOMHOOK ,ONLY : LHOOK, DR_HOOK, JPHOOK -USE YOMLUN ,ONLY : NULOUT, NULERR -!USE YOMPHYDER, ONLY : STATE_TYPE -!USE YOM_YGFL ,ONLY : YGFL -USE YOMCST ,ONLY : RA, RPI, RDAY, RG -USE YOMRIP0 ,ONLY : NINDAT, NSSSSS -!USE YOMRIP ,ONLY : YRRIP -!USE YOEPHY ,ONLY : YREPHY -!USE YOEAERATM ,ONLY : YREAERATM -!USE YOEAERMAP ,ONLY : YREAERMAP -!USE YOEAERSRC ,ONLY : YREAERSRC -!USE YOEAERVOL ,ONLY : YREAERVOL -!USE YOEAERSNK, ONLY : YREAERSNK -!USE YOMCOMPO, ONLY : YRCOMPO -USE TM5M7_DATA, ONLY : NMOD, MODE_NM, MODE_NM_SED, MODE_TRACERS_SED, & - & xmc, sigma_lognormal, pom_density, carbon_density, & - & mode_aii, mode_ais, mode_acs, mode_aci,iduai,iaii_n,& - & INO3_A, INH4,IMSA +SUBROUTINE TM5M7_SRC( & + & YDGEOMETRY, YDMODEL, KIDIA, KFDIA, KLON , KTDIA, KLEV, KTILES, KSTART, KSTEP ,KSTGLO, & + & KSW , KTRAC, KAERO, & + & PALB , PALBD, PAPHI , & + & PAERDEP, PAERLTS, PAERSCC, PAERGUST, PALTH , & + & PAPH , PAP , PCI , PCLAKE, PINJF, PBLH, PDELP, PGELAM, PGELAT, PGEMU, PFRTI, PHSDFOR, & + & PLSM , PSST , PQ , PRHO , PSNS , PT , PTL , PTSPHY, PZ0M, KCHEM, & + & PWIND, PWS1 ,PSOIL_TYPE, & + & PCVL, PCVH, KTVL, KTVH, & + & PLDAY, PAERFLX, PCFLX , PCEN , PTENC, PEMIDIAG, PSO2SRC,PSO4SRC ) + +! ╭────────────────────────────────────────────────────────────────────────────╮ +! │ (updated 03-Jun-2024) │ +! │ Purpose : │ +! │ ------- │ +! │ *tm5m7_src* - │ +! │ │ +! │ │ +! │ Interface : │ +! │ --------- │ +! │ *TM5M7_SRC* IS CALLED FROM *TM5M7_PHY2" │ +! │ │ +! │ │ +! │ Input : │ +! │ ----- │ +! │ │ +! │ │ +! │ Output : │ +! │ ------ │ +! │ │ +! │ │ +! │ Externals : │ +! │ --------- │ +! │ │ +! │ Method : │ +! │ ------ │ +! │ │ +! │ Reference : │ +! │ --------- │ +! │ │ +! │ Author : │ +! │ ------- │ +! │ Orginal version: │ +! │ Vicent Huijen (KNMI) - 2020-08-25 │ +! │ │ +! │ Modifications : │ +! │ ------------- │ +! │ May. 2024 - R. Checa-Garcia: revision for CY48r1 and refactory │ +! │ │ +! ╰────────────────────────────────────────────────────────────────────────────╯ + + + +! IFS model -------------------------------------------------------------------- + +USE GEOMETRY_MOD, ONLY : GEOMETRY +USE TYPE_MODEL, ONLY : MODEL +USE PARKIND1, ONLY : JPIM, JPRB, JPRD +USE YOMHOOK, ONLY : LHOOK, DR_HOOK, JPHOOK +USE YOMLUN, ONLY : NULOUT, NULERR +USE YOMCST, ONLY : RA, RPI, RDAY, RG +USE YOMRIP0, ONLY : NINDAT, NSSSSS + +! M7 modules ------------------------------------------------------------------- + +USE TM5M7_DATA , ONLY : NMOD, MODE_NM, MODE_NM_SED, MODE_TRACERS_SED, & + & xmc, sigma_lognormal, pom_density, carbon_density, & + & mode_aii, mode_ais, mode_acs, mode_aci,iduai,iaii_n, & + & INO3_A, INH4,IMSA, issacs, isscos, iduaci, iducoi, & + & iaci_n, iacs_n, icoi_n, icos_n, mode_cos, mode_coi USE TM5M7_EMIS_DATA, ONLY : MODAL_EMISSIONS, & - & rad_emi_ff_insol, rad_emi_ene_insol,rad_emi_ind_insol, & - & rad_emi_tra_insol, rad_emi_shp_insol,rad_emi_air_insol, & - & rad_emi_bf_insol, rad_emi_bb_insol,& - & rad_emi_ff_sol, rad_emi_ene_sol,rad_emi_ind_sol, & - & rad_emi_tra_sol, rad_emi_shp_sol,rad_emi_air_sol, & - & rad_emi_bf_sol, rad_emi_bb_sol, & - & frac_pom_sol_bf, frac_pom_sol_bb, frac_pom_sol_ff, & - & frac_bc_sol_bf, frac_bc_sol_bb, frac_bc_sol_ff - USE OIFS_TO_HAM, ONLY: ind_oifs_ham!% ind_gas_OIFS + & rad_emi_ff_insol, rad_emi_ene_insol,rad_emi_ind_insol, & + & rad_emi_tra_insol, rad_emi_shp_insol,rad_emi_air_insol, & + & rad_emi_bf_insol, rad_emi_bb_insol, & + & rad_emi_ff_sol, rad_emi_ene_sol,rad_emi_ind_sol, & + & rad_emi_tra_sol, rad_emi_shp_sol,rad_emi_air_sol, & + & rad_emi_bf_sol, rad_emi_bb_sol, & + & frac_pom_sol_bf, frac_pom_sol_bb, frac_pom_sol_ff, & + & frac_bc_sol_bf, frac_bc_sol_bb, frac_bc_sol_ff +USE OIFS_TO_HAM, ONLY: ind_oifs_ham !% ind_gas_OIFS IMPLICIT NONE !----------------------------------------------------------------------- - -!* 0.1 ARGUMENTS -! --------- - -TYPE(GEOMETRY) ,INTENT(IN) :: YDGEOMETRY -TYPE(MODEL) ,INTENT(INOUT) :: YDMODEL -!TYPE (STATE_TYPE) ,INTENT (IN) :: TENDENCY_CML -INTEGER(KIND=JPIM),INTENT(IN) :: KLON, KIDIA, KFDIA -INTEGER(KIND=JPIM),INTENT(IN) :: KLEV, KTDIA, KSTGLO -INTEGER(KIND=JPIM),INTENT(IN) :: KTILES -INTEGER(KIND=JPIM),INTENT(IN) :: KSTEP, KSTART -INTEGER(KIND=JPIM),INTENT(IN) :: KSW -INTEGER(KIND=JPIM),INTENT(IN) :: KTRAC -INTEGER(KIND=JPIM),INTENT(IN) :: KAERO(YDMODEL%YRML_GCONF%YGFL%NAERO) - -REAL(KIND=JPRB) ,INTENT(IN) :: PALB(KLON), PALBD(KLON,KSW) -REAL(KIND=JPRB) ,INTENT(IN) :: PAPHI(KLON,0:KLEV), PALTH(KLON,0:KLEV) -REAL(KIND=JPRB) ,INTENT(IN) :: PAERDEP(KLON), PAERLTS(KLON), PAERSCC(KLON) -!Vincent Huijnen This piece of code should be removed and picked up elsewhere!! For now define local variables -!REAL(KIND=JPRB) ,INTENT(IN) :: ZBCBF(KLON), ZBCFF(KLON), ZBCGF(KLON), POMBF(KLON), POMFF(KLON), POMGF(KLON) -REAL(KIND=JPRB) :: ZBCBF(KLON), ZBCFF(KLON), ZBCGF(KLON), ZOMBF(KLON), ZOMFF(KLON), ZOMGF(KLON) -!End VH -REAL(KIND=JPRB), INTENT(IN) :: PAERGUST(KLON), PHSDFOR(KLON) -REAL(KIND=JPRB) ,INTENT(IN) :: PAP(KLON,KLEV), PAPH(KLON,0:KLEV) -REAL(KIND=JPRB) ,INTENT(IN) :: PGELAM(KLON), PGELAT(KLON), PGEMU(KLON) -REAL(KIND=JPRB) ,INTENT(IN) :: PFRTI(KLON,KTILES) -REAL(KIND=JPRB) ,INTENT(IN) :: PCI(KLON), PCLAKE(KLON), PLSM(KLON), PSST(KLON) -REAL(KIND=JPRB) ,INTENT(IN) :: PINJF(KLON) -REAL(KIND=JPRB) ,INTENT(IN) :: PBLH(KLON) -REAL(KIND=JPRB) ,INTENT(IN) :: PDELP(KLON,KLEV) -REAL(KIND=JPRB) ,INTENT(IN) :: PQ(KLON,KLEV), PRHO(KLON,KLEV), PSNS(KLON) -REAL(KIND=JPRB) ,INTENT(IN) :: PT(KLON,KLEV) -REAL(KIND=JPRB) ,INTENT(IN) :: PTL(KLON) -REAL(KIND=JPRB) ,INTENT(IN) :: PWIND(KLON) -REAL(KIND=JPRB) ,INTENT(IN) :: PWS1(KLON) -REAL(KIND=JPRB) ,INTENT(IN) :: PSOIL_TYPE(KLON) -REAL(KIND=JPRB) ,INTENT(IN) :: PTSPHY -REAL(KIND=JPRB) ,INTENT(IN) :: PZ0M(KLON) -INTEGER(KIND=JPIM),INTENT(IN) :: KCHEM(YDMODEL%YRML_GCONF%YGFL%NCHEM) - -REAL(KIND=JPRB) ,INTENT(INOUT) :: PAERFLX(KLON,12,9) -REAL(KIND=JPRB) ,INTENT(INOUT) :: PCFLX(KLON,KTRAC) - -REAL(KIND=JPRB) , INTENT(IN) :: PCVL(KLON), PCVH(KLON) ! Low/High vegetation cover +!* 0.1 ARGUMENTS +! --------- + +TYPE(GEOMETRY), INTENT(IN) :: YDGEOMETRY +TYPE(MODEL), INTENT(INOUT) :: YDMODEL +INTEGER(KIND=JPIM), INTENT(IN) :: KLON, KIDIA, KFDIA +INTEGER(KIND=JPIM), INTENT(IN) :: KLEV, KTDIA, KSTGLO +INTEGER(KIND=JPIM), INTENT(IN) :: KTILES +INTEGER(KIND=JPIM), INTENT(IN) :: KSTEP, KSTART +INTEGER(KIND=JPIM), INTENT(IN) :: KSW +INTEGER(KIND=JPIM), INTENT(IN) :: KTRAC +INTEGER(KIND=JPIM), INTENT(IN) :: KAERO(YDMODEL%YRML_GCONF%YGFL%NAERO) + +REAL(KIND=JPRB), INTENT(IN) :: PALB(KLON), PALBD(KLON,KSW) +REAL(KIND=JPRB), INTENT(IN) :: PAPHI(KLON,0:KLEV), PALTH(KLON,0:KLEV) +REAL(KIND=JPRB), INTENT(IN) :: PAERDEP(KLON), PAERLTS(KLON), PAERSCC(KLON) +REAL(KIND=JPRB), INTENT(IN) :: PAERGUST(KLON), PHSDFOR(KLON) +REAL(KIND=JPRB), INTENT(IN) :: PAP(KLON,KLEV), PAPH(KLON,0:KLEV) +REAL(KIND=JPRB), INTENT(IN) :: PGELAM(KLON), PGELAT(KLON), PGEMU(KLON) +REAL(KIND=JPRB), INTENT(IN) :: PFRTI(KLON,KTILES) +REAL(KIND=JPRB), INTENT(IN) :: PCI(KLON), PCLAKE(KLON), PLSM(KLON), PSST(KLON) +REAL(KIND=JPRB), INTENT(IN) :: PINJF(KLON) +REAL(KIND=JPRB), INTENT(IN) :: PBLH(KLON) +REAL(KIND=JPRB), INTENT(IN) :: PDELP(KLON,KLEV) +REAL(KIND=JPRB), INTENT(IN) :: PQ(KLON,KLEV), PRHO(KLON,KLEV), PSNS(KLON) +REAL(KIND=JPRB), INTENT(IN) :: PT(KLON,KLEV) +REAL(KIND=JPRB), INTENT(IN) :: PTL(KLON) +REAL(KIND=JPRB), INTENT(IN) :: PWIND(KLON) +REAL(KIND=JPRB), INTENT(IN) :: PWS1(KLON) +REAL(KIND=JPRB), INTENT(IN) :: PSOIL_TYPE(KLON) +REAL(KIND=JPRB), INTENT(IN) :: PTSPHY +REAL(KIND=JPRB), INTENT(IN) :: PZ0M(KLON) +INTEGER(KIND=JPIM), INTENT(IN) :: KCHEM(YDMODEL%YRML_GCONF%YGFL%NCHEM) + +! RCHG -> try to understand what is 12 and 9 here. +REAL(KIND=JPRB), INTENT(INOUT) :: PAERFLX(KLON,12,9) +REAL(KIND=JPRB), INTENT(INOUT) :: PCFLX(KLON,KTRAC) + +REAL(KIND=JPRB), INTENT(IN) :: PCVL(KLON), PCVH(KLON) ! Low/High vegetation cover INTEGER(KIND=JPIM), INTENT(IN) :: KTVL(KLON), KTVH(KLON) ! Low/High vegetation type -REAL(KIND=JPRB) ,INTENT(INOUT) :: PCEN(KLON,KLEV,KTRAC) -REAL(KIND=JPRB) ,INTENT(INOUT) :: PTENC(KLON,KLEV,KTRAC) -REAL(KIND=JPRB) ,INTENT(INOUT) :: PLDAY(KLON) -REAL(KIND=JPRB) ,INTENT(INOUT) :: PEMIDIAG(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO) -REAL(KIND=JPRB),INTENT(INOUT) :: PSO4SRC(KLON,KLEV),PSO2SRC(KLON,KLEV) +REAL(KIND=JPRB), INTENT(INOUT) :: PCEN(KLON,KLEV,KTRAC) +REAL(KIND=JPRB), INTENT(INOUT) :: PTENC(KLON,KLEV,KTRAC) +REAL(KIND=JPRB), INTENT(INOUT) :: PLDAY(KLON) +REAL(KIND=JPRB), INTENT(INOUT) :: PEMIDIAG(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO) +REAL(KIND=JPRB), INTENT(INOUT) :: PSO4SRC(KLON,KLEV),PSO2SRC(KLON,KLEV) +!* 0.5 LOCAL VARIABLES +! --------------- -!* 0.5 LOCAL VARIABLES -! --------------- - +REAL(KIND=JPRB) :: ZBCBF(KLON), ZBCFF(KLON), ZBCGF(KLON) ! BC related +REAL(KIND=JPRB) :: ZOMBF(KLON), ZOMFF(KLON), ZOMGF(KLON) ! OM related INTEGER(KIND=JPIM) :: JAER, JK, JL, IMODE, INMODE, JN, II, JGAS INTEGER(KIND=JPIM) :: IGLGLO, IHTST @@ -127,9 +143,10 @@ SUBROUTINE TM5M7_SRC & TYPE(MODAL_EMISSIONS), DIMENSION(NMOD), TARGET :: EMIS_MASS TYPE(MODAL_EMISSIONS), DIMENSION(NMOD), TARGET :: EMIS_NUMBER - -REAL(KIND=JPRB) :: ZFAERO(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO) , ZAEROCLIS(KLON,KLEV,2) -REAL(KIND=JPRB) :: ZAEROK(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO), ZTAEROK(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO) +REAL(KIND=JPRB) :: ZAEROCLIS(KLON,KLEV,2) +REAL(KIND=JPRB) :: ZFAERO(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO) +REAL(KIND=JPRB) :: ZAEROK(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO) +REAL(KIND=JPRB) :: ZTAEROK(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO) REAL(KIND=JPRB) :: ZGLAT(KLON), ZGLON(KLON) REAL(KIND=JPRB) :: ZHDD, ZHSS @@ -158,15 +175,18 @@ SUBROUTINE TM5M7_SRC & REAL(KIND=JPRB) :: ZGEMU(KLON), ZLATK(KLON) -REAL(KIND=JPRB) :: numbscale_exp, mass2numb_fact, & - & mass2numb_ff_sol, mass2numb_ff_insol, mass2numb_ene_sol, mass2numb_ene_insol, & - & mass2numb_ind_sol, mass2numb_ind_insol, mass2numb_tra_sol, mass2numb_tra_insol, & - & mass2numb_shp_sol, mass2numb_shp_insol, & - & mass2numb_air_sol, mass2numb_air_insol, mass2numb_bf_sol, mass2numb_bf_insol, & - & mass2numb_bb_sol, mass2numb_bb_insol, mass2numb_nonbf_sol, mass2numb_nonbf_insol, & - & oc2pom - -!REAL(KIND=JPRB) :: ZSOA(KLON) +REAL(KIND=JPRB) :: numbscale_exp, mass2numb_fact, & + & mass2numb_ff_sol, mass2numb_ff_insol, & + & mass2numb_ene_sol, mass2numb_ene_insol, & + & mass2numb_ind_sol, mass2numb_ind_insol, & + & mass2numb_tra_sol, mass2numb_tra_insol, & + & mass2numb_shp_sol, mass2numb_shp_insol, & + & mass2numb_air_sol, mass2numb_air_insol, & + & mass2numb_bf_sol, mass2numb_bf_insol, & + & mass2numb_bb_sol, mass2numb_bb_insol, & + & mass2numb_nonbf_sol, mass2numb_nonbf_insol, & + & oc2pom +REAL(KIND=JPRB) :: ZSOA(KLON) REAL(KIND=JPRB) :: FRAC_BF(KLON), EMIT(KLON,KLEV) @@ -175,6 +195,7 @@ SUBROUTINE TM5M7_SRC & INTEGER(KIND=JPIM) :: ILINJ1, ILINJ2, IX(1) REAL(KIND=JPRB) :: ZDELP +!RCHG -> try to understand what is 5 here REAL(KIND=JPRB) :: ZAERMAP(KLON,5) #ifdef __PGI REAL(KIND=JPRB) :: ERF @@ -199,29 +220,26 @@ SUBROUTINE TM5M7_SRC & IF (LHOOK) CALL DR_HOOK('TM5M7_SRC',0,ZHOOK_HANDLE) - !----------------------------------------------------------------------- -ASSOCIATE(YDCSGLEG=>YDGEOMETRY%YRCSGLEG,& - & YDEPHY=>YDMODEL%YRML_PHY_EC%YREPHY, & - & YDEAERMAP=>YDMODEL%YRML_PHY_AER%YREAERMAP, & - & YGFL=>YDMODEL%YRML_GCONF%YGFL, & - & YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO, & - & YDEAERSRC=>YDMODEL%YRML_PHY_AER%YREAERSRC, & - & YDRIP=>YDMODEL%YRML_GCONF%YRRIP) - - - -ASSOCIATE(YAERO=>YGFL%YAERO, & - & NACTAERO=>YGFL%NACTAERO, NAERO=>YGFL%NAERO, & - & NDGLG=>YDGEOMETRY%YRDIM%NDGLG, RHGMT=>YDRIP%RHGMT, & - & RSTATI => YDRIP%RSTATI, RSIDECA=>YDEAERSRC%RSIDECA, & - & NAERWND=>YDEAERSRC%NAERWND, & - & RSIVSRA=>YDEAERSRC%RSIVSRA, & - & RCODECA=>YDEAERSRC%RCODECA, RCOVSRA=>YDEAERSRC%RCOVSRA, & - & NLOENG=>YDGEOMETRY%YRGEM%NLOENG, & - & NGLOBALAT=>YDGEOMETRY%YRMP%NGLOBALAT, & - & YSURF=>YDEPHY%YSURF, & - & LAERCHEM=>YGFL%LAERCHEM) +ASSOCIATE(& + & YDCSGLEG => YDGEOMETRY%YRCSGLEG, & + & YDEPHY => YDMODEL%YRML_PHY_EC%YREPHY, & + & YDEAERMAP => YDMODEL%YRML_PHY_AER%YREAERMAP, & + & YGFL => YDMODEL%YRML_GCONF%YGFL, & + & YDCOMPO => YDMODEL%YRML_CHEM%YRCOMPO, & + & YDEAERSRC => YDMODEL%YRML_PHY_AER%YREAERSRC, & + & YDRIP => YDMODEL%YRML_GCONF%YRRIP) + +ASSOCIATE(& + & YAERO => YGFL%YAERO, NACTAERO => YGFL%NACTAERO, & + & NAERO => YGFL%NAERO, NDGLG => YDGEOMETRY%YRDIM%NDGLG, & + & RHGMT => YDRIP%RHGMT, RSTATI => YDRIP%RSTATI, & + & RSIDECA => YDEAERSRC%RSIDECA, NAERWND => YDEAERSRC%NAERWND, & + & RSIVSRA => YDEAERSRC%RSIVSRA, RCODECA => YDEAERSRC%RCODECA, & + & RCOVSRA => YDEAERSRC%RCOVSRA, & + & NLOENG => YDGEOMETRY%YRGEM%NLOENG, NGLOBALAT => YDGEOMETRY%YRMP%NGLOBALAT,& + & YSURF => YDEPHY%YSURF, LAERCHEM => YGFL%LAERCHEM) + !VH maybe 43r3, only?? !& LAERODIU=>YDCOMPO%LAERODIU, YAERO=>YGFL%YAERO, LFIRE=>YDCOMPO%LFIRE, LINJ=>YDCOMPO%LINJ, & @@ -237,9 +255,10 @@ SUBROUTINE TM5M7_SRC & IM0=NMM(NINDAT) ID0=NDD(NINDAT) INC=(NSSSSS + NINT(RSTATI)/NINT(RDAY)) -CALL UPDCAL (ID0, IM0, IY0, INC, IDD, IMM, IYY, IMON, -1) +CALL UPDCAL(ID0, IM0, IY0, INC, IDD, IMM, IYY, IMON, -1) IMDATE=IYY*10000+IMM*100+IDD ZRAD2DEG = 180._JPRB/RPI +! !* 0.2 A LENGTH OF DAY INDEX ! --------------------- DO JL=KIDIA,KFDIA @@ -252,7 +271,7 @@ SUBROUTINE TM5M7_SRC & PLDAY(JL)=MAX( RSIDECA*ZGEMU(JL)& & -RCODECA*RCOVSRA*SQRT(1.0_JPRB-ZGEMU(JL)**2)* ZCOS0& & +RCODECA*RSIVSRA*SQRT(1.0_JPRB-ZGEMU(JL)**2)* ZSIN0& - & ,0.0_JPRB) + & ,0.0_JPRB) ! PLDAY should be positive ENDDO !----------------------------------------------------------------------- @@ -280,7 +299,7 @@ SUBROUTINE TM5M7_SRC & ZDEGRAD= 180._JPRB/RPI ZDLAT = 180._JPRB / NDGLG ! distance in degrees between latitude lines -ZGRDLAT= RPI / NDGLG ! distance in radians between latitude lines +ZGRDLAT= RPI / NDGLG ! distance in radians between latitude lines ZGRDLAT2=ZGRDLAT*0.55_JPRB DO JL=KIDIA,KFDIA @@ -305,7 +324,6 @@ SUBROUTINE TM5M7_SRC & !----------------------------------------------------------------------- - !* 0.5 Array initializations ! ---------------------- @@ -328,14 +346,15 @@ SUBROUTINE TM5M7_SRC & ZFAERO (KIDIA:KFDIA, 1:NACTAERO) = 0.0_JPRB ZAEROK (KIDIA:KFDIA, 1:KLEV, 1:NACTAERO) = PCEN (KIDIA:KFDIA, 1:KLEV, KAERO(1):KAERO(NACTAERO)) ZTAEROK(KIDIA:KFDIA, 1:KLEV, 1:NACTAERO) = PTENC(KIDIA:KFDIA, 1:KLEV, KAERO(1):KAERO(NACTAERO)) +PEMIDIAG(KIDIA:KFDIA, 1:NACTAERO) = 0.0_JPRB -PEMIDIAG(KIDIA:KFDIA, 1:NACTAERO)= 0.0_JPRB -ZOMBF = 0.0_JPRB -ZOMFF = 0.0_JPRB -ZOMGF = 0.0_JPRB -ZBCFF = 0.0_JPRB -ZBCBF = 0.0_JPRB -ZBCGF = 0.0_JPRB +! RCHG: FIXME -> there were are recurrent sematic error ARRAY(:) = 0.0_JPRB is dangerous. +ZOMBF(KIDIA:KFDIA) = 0.0_JPRB +ZOMFF(KIDIA:KFDIA) = 0.0_JPRB +ZOMGF(KIDIA:KFDIA) = 0.0_JPRB +ZBCFF(KIDIA:KFDIA) = 0.0_JPRB +ZBCBF(KIDIA:KFDIA) = 0.0_JPRB +ZBCGF(KIDIA:KFDIA) = 0.0_JPRB !----------------------------------------------------------------------- @@ -368,49 +387,146 @@ SUBROUTINE TM5M7_SRC & ENDIF !----------------------------------------------------------------------- +!* 1.0 SEA SALT +! -------- + +!- INFO: Simplistic lifting from surface based on 10-m wind and land-sea mask +! (currently not used!) +! ZHSS=8434._JPRB/1000._JPRB -!* 1.0 SEA SALT -! -------- +! RCHG: PCI, PCLAKE, PLSM, PSST +CALL TM5M7_SRC_SS( KIDIA, KFDIA, KLON, KLEV, & + & PCI, PCLAKE, PLSM, PSST, ZWNDSS, & + & emis_mass, emis_number ) -!- Simplistic lifting from surface based on 10-m wind and land-sea mask -! (currently not used!) -ZHSS=8434._JPRB/1000._JPRB - CALL TM5M7_SRC_SS(KIDIA, KFDIA, KLON, KLEV, & - & PCI, PCLAKE, PLSM, PSST, ZWNDSS, & - & emis_mass, emis_number ) +!----------------------------------------------------------------------- +!* 2.0 DESERT DUST +! ----------- +!INFO: Simplistic lifting from surface based on 10-m wind and surface albedo +! ZHDD=MAX(1.0_JPRB,8434._JPRB/1000._JPRB) -> RCHG non-used and non-sense +! RCHG: define what is 1:12, 1:9 and 1:5 with a meaninful name +! +PAERFLX(KIDIA:KFDIA,1:12,1:9)=0._JPRB +ZAERMAP(KIDIA:KFDIA,1:5)=0._JPRB +CALL TM5M7_SRC_DUST( YDEPHY, YDEAERMAP, YDEAERSRC, KIDIA, KFDIA, KLON, KLEV, KTILES, KSW,& + & PLSM, ZWNDDU, PSNS, PZ0M, & + & PAP(:,KLEV), PTL, PSOIL_TYPE, & + & PFRTI, PCVL, PCVH, KTVL, KTVH, & + & emis_mass, emis_number, PAERFLX, ZGLON, ZGLAT, & + & ZRWPWP, ZRWSAT, ZAERMAP, PALB, PALBD, PWS1, PHSDFOR) !----------------------------------------------------------------------- +!* 3.0 PARTICULATE ORGANIC MATTER +! --------------------------------------------------------- +! CALL POM_SRC_43R3() +! +!----------------------------------------------------------------------- +!* 4.0 BLACK CARBON +! ------------ +! CALL BC_SRC_43R3() +! +!---------------------------------------------------------------------- +!* 5.0 Convert emissions into tendencies: loop over tracers in mode +! ------------ +! CALL ADD_TOFLUX() ! -> only used for CY43R3 +! +! +! RCHG -> in the case of CY48R1 the emissions non-interactive (all except SS and DUST) +! are directly added as PCFLX and PTENC per tracer (remember there are 37 tracers) +! Now we meed to add SS and DUST into the correct tracer identifier. +! +! After PCFLUX and PTENC we also fix PEMIDIAG. Note that PEMIDIAG is only +! used to transfer to PAERSRC array which is transfered to PGFL object to +! store emissions. Probably we can directly store in PAERSRC array, but +! I keep current implementation. -!* 2.0 DESERT DUST -! ----------- +DO JL=KIDIA,KFDIA + PCFLX(JL,KAERO(iacs_n)) = PCFLX(JL,KAERO(iacs_n)) + emis_number(mode_acs)%d3(JL,KLEV,4) + PCFLX(JL,KAERO(icos_n)) = PCFLX(JL,KAERO(icos_n)) + emis_number(mode_cos)%d3(JL,KLEV,4) + PCFLX(JL,KAERO(issacs)) = PCFLX(JL,KAERO(issacs)) + emis_mass(mode_acs)%d3(JL,KLEV,4) + PCFLX(JL,KAERO(isscos)) = PCFLX(JL,KAERO(isscos)) + emis_mass(mode_cos)%d3(JL,KLEV,4) + + PCFLX(JL,KAERO(iaci_n)) = PCFLX(JL,KAERO(iaci_n)) + emis_number(mode_aci)%d3(JL,KLEV,1) + PCFLX(JL,KAERO(icoi_n)) = PCFLX(JL,KAERO(icoi_n)) + emis_number(mode_coi)%d3(JL,KLEV,1) + PCFLX(JL,KAERO(iduaci)) = PCFLX(JL,KAERO(iduaci)) + emis_mass(mode_aci)%d3(JL,KLEV,1) + PCFLX(JL,KAERO(iducoi)) = PCFLX(JL,KAERO(iducoi)) + emis_mass(mode_coi)%d3(JL,KLEV,1) + + PTENC(JL,KLEV, KAERO(iacs_n)) = PTENC(JL,KLEV, KAERO(iacs_n)) + emis_number(mode_acs)%d3(JL,KLEV,4) * RG / PDELP(JL,KLEV) + PTENC(JL,KLEV, KAERO(icos_n)) = PTENC(JL,KLEV, KAERO(icos_n)) + emis_number(mode_cos)%d3(JL,KLEV,4) * RG / PDELP(JL,KLEV) + PTENC(JL,KLEV, KAERO(issacs)) = PTENC(JL,KLEV, KAERO(issacs)) + emis_mass(mode_acs)%d3(JL,KLEV,4) * RG / PDELP(JL,KLEV) + PTENC(JL,KLEV, KAERO(isscos)) = PTENC(JL,KLEV, KAERO(isscos)) + emis_mass(mode_cos)%d3(JL,KLEV,4) * RG / PDELP(JL,KLEV) + + PTENC(JL,KLEV, KAERO(iaci_n)) = PTENC(JL,KLEV, KAERO(iaci_n)) + emis_number(mode_aci)%d3(JL,KLEV,1) * RG / PDELP(JL,KLEV) + PTENC(JL,KLEV, KAERO(icoi_n)) = PTENC(JL,KLEV, KAERO(icoi_n)) + emis_number(mode_coi)%d3(JL,KLEV,1) * RG / PDELP(JL,KLEV) + PTENC(JL,KLEV, KAERO(iduaci)) = PTENC(JL,KLEV, KAERO(iduaci)) + emis_mass(mode_aci)%d3(JL,KLEV,1) * RG / PDELP(JL,KLEV) + PTENC(JL,KLEV, KAERO(iducoi)) = PTENC(JL,KLEV, KAERO(iducoi)) + emis_mass(mode_coi)%d3(JL,KLEV,1) * RG / PDELP(JL,KLEV) + +ENDDO + +DO IMODE=1,NMOD ! loop in each mode + DO INMODE=0,MODE_NM_SED(IMODE) ! loop in aerosols species per mode + JN = MODE_TRACERS_SED(INMODE,IMODE) ! retrieve indentifier of each specie + PEMIDIAG(JL,KAERO(JN))=PCFLX(JL,KAERO(JN)) ! assign PCFLX to emissions (we still not added dep. to PCFLX) + ENDDO +ENDDO + + +! RCHG -> This is outside the previous loop so it is important to initialize PEMIDIAG(:,:) = 0. +! at begining of this subroutine. Note that here we are not filling PCFLX +! Is this ok? +! +IF (.not. LAERCHEM) THEN + DO JL=KIDIA,KFDIA + DO JK=1,KLEV + DO JGAS=1,2 + IF (TRIM(YAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))%CNAME)=='SO2') THEN + ISSO2=ind_oifs_ham%ind_gas_OIFS(JGAS) + PTENC(JL,JK,KAERO(ISSO2))=PTENC(JL,JK,KAERO(ISSO2))+ PSO2SRC(JL,JK) + !PCFLX(JL,KAERO(ISSO2))=PCFLX(JL,KAERO(ISSO2)) + PSO2SRC(JL,JK) + PEMIDIAG(JL,KAERO(ISSO2))=PEMIDIAG(JL,KAERO(ISSO2))+ PSO2SRC(JL,JK) + ELSE IF (TRIM(YAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))%CNAME)=='SO4_gas') THEN + ISSO4=ind_oifs_ham%ind_gas_OIFS(JGAS) + PTENC(JL,JK,KAERO(ISSO4))=PTENC(JL,JK,KAERO(ISSO4))+ PSO4SRC(JL,JK) + !PCFLX(JL,KAERO(ISSO4))=PCFLX(JL,KAERO(ISSO4)) + PSO4SRC(JL,JK) + PEMIDIAG(JL,KAERO(ISSO4))=PEMIDIAG(JL,KAERO(ISSO4)) + PSO4SRC(JL,JK) + END IF + END DO + END DO + + +! For add SOA from CO into ISVOC tracer +!!$ DO JGAS=1,NACTAERO +!!$ IF (TRIM(YAERO(JGAS)%CNAME)=='ISVOC') THEN +!!$ +!!$ PTENC(JL,JK,KAERO(JGAS))=PTENC(JL,JK,KAERO(JGAS))+ PSOACO(JL) +!!$ PEMIDIAG(JL,KAERO(JGAS))=PEMIDIAG(JL,KAERO(JGAS)) + PSOACO(JL) +!!$ END IF +!!$ END DO + + END DO + END IF -!- Simplistic lifting from surface based on 10-m wind and surface albedo -ZHDD=MAX(1.0_JPRB,8434._JPRB/1000._JPRB) -PAERFLX(KIDIA:KFDIA,1:12,1:9)=0._JPRB -ZAERMAP(KIDIA:KFDIA,1:5)=0._JPRB -CALL TM5M7_SRC_DUST(YDEPHY, YDEAERMAP, YDEAERSRC, KIDIA, KFDIA, KLON, KLEV, KTILES, KSW,& - & PLSM, ZWNDDU, PSNS, PZ0M, & - & PAP(:,KLEV), PTL, PSOIL_TYPE, & - & PFRTI, PCVL, PCVH, KTVL, KTVH, & - & emis_mass, emis_number ,PAERFLX,ZGLON,ZGLAT, & - & ZRWPWP,ZRWSAT,ZAERMAP,PALB,PALBD,PWS1,PHSDFOR) -!write(2345,*) 'test',ptsphy, emis_mass(mode_aci)%d3(KIDIA:KFDIA,91,1),emis_number(mode_aci)%d3(KIDIA:KFDIA,91,1),PAERFLX(:,1,:) -!write(2346,*) 'test',ptsphy, emis_mass(mode_aii)%d3(KIDIA:KFDIA,91,1),emis_number(mode_aii)%d3(KIDIA:KFDIA,91,1),PAERFLX(:,1,:) -!DO JK=1,KLEV -! DO JL=KIDIA,KFDIA -! ZAEROUT5(JL,JK)=emis_mass(mode_aci)%d3(Jl,JK,1) -! END DO -!END DO !----------------------------------------------------------------------- +!* 6.0 De-allocate arrays +! ------------ -!* 3.0 PARTICULATE ORGANIC MATTER -! -------------------------------------------------------------- +DO IMODE=1,NMOD + IF(associated(EMIS_NUMBER(IMODE)%d3)) DEALLOCATE(EMIS_NUMBER(IMODE)%d3) + IF(associated(EMIS_MASS(IMODE)%d3)) DEALLOCATE(EMIS_MASS(IMODE)%d3) +ENDDO +END ASSOCIATE +END ASSOCIATE + +IF (LHOOK) CALL DR_HOOK('TM5M7_SRC',1,ZHOOK_HANDLE) + +CONTAINS +SUBROUTINE POM_SRC_43R3() ! mass to number conversion factors for the relevant modes numbscale_exp = EXP(1.5*(LOG(sigma_lognormal(mode_aii)))**2) @@ -443,8 +559,7 @@ SUBROUTINE TM5M7_SRC & frac_bf(KIDIA:KFDIA)=1.0_JPRB ! calculate mass fraction related to solid biofuel where ( ZOMFF(KIDIA:KFDIA) > 1E-30_JPRB ) - frac_bf(KIDIA:KFDIA) = ZOMBF(KIDIA:KFDIA) / & - ZOMFF(KIDIA:KFDIA) + frac_bf(KIDIA:KFDIA) = ZOMBF(KIDIA:KFDIA) / ZOMFF(KIDIA:KFDIA) elsewhere frac_bf(KIDIA:KFDIA) = 0.0_JPRB endwhere @@ -454,7 +569,6 @@ SUBROUTINE TM5M7_SRC & frac_bf(KIDIA:KFDIA) = 1.0_JPRB endwhere - ! add to emis target arrays. ! For now treat all sectors identical, and put all emissions in lowest model layer (KLEV) @@ -591,13 +705,10 @@ SUBROUTINE TM5M7_SRC & !VH ENDIF ! LINJ !VH ENDIF ! LFIRE - -!----------------------------------------------------------------------- - -!* 4.0 BLACK CARBON -! ------------ +END SUBROUTINE +SUBROUTINE BC_SRC_43R3() ! mass to number conversion factors for the relevant modes numbscale_exp = EXP(1.5*(LOG(sigma_lognormal(mode_aii)))**2) @@ -766,25 +877,20 @@ SUBROUTINE TM5M7_SRC & !VH ENDIF ! LINJ !VH ENDIF ! LFIRE +END SUBROUTINE - - -!----------------------------------------------------------------------- - -!* 5.0 Convert emissions into tendencies: loop over tracers in mode -! ------------ - - DO IMODE=1,NMOD - DO INMODE=0,MODE_NM_SED(IMODE) - JN = MODE_TRACERS_SED(INMODE,IMODE) +SUBROUTINE ADD_TOFLUX() + DO IMODE=1,NMOD ! loop in each mode + DO INMODE=0,MODE_NM_SED(IMODE) ! loop in aerosols species per mode + JN = MODE_TRACERS_SED(INMODE,IMODE) ! retrieve indentifier of each specie if (JN==ino3_a.or.JN==inh4.or.JN==imsa) then emit(KIDIA:KFDIA,:) = 0.0 - else if(inmode == 0) then + else if(inmode == 0) then ! 1st specie of mode is number part. in mode emit(KIDIA:KFDIA,:) = 0.0 - do ii=1,mode_nm(IMODE) ! add up all number emissions in the mode 'imode'... + do ii=1,mode_nm(IMODE) ! add up all number emissions in the mode 'imode'... emit(KIDIA:KFDIA,:) = emit(KIDIA:KFDIA,:) + emis_number(IMODE)%d3(KIDIA:KFDIA,:,ii) enddo - else ! this is a 'mass' emission with index nmode + else ! this is a 'mass' emission with index nmode emit(KIDIA:KFDIA,:) = emis_mass(IMODE)%d3(KIDIA:KFDIA,:,inmode) endif ! Change units from kg/m2/sec to kg/kg/sec and update tendency.. @@ -811,54 +917,7 @@ SUBROUTINE TM5M7_SRC & ENDDO ENDDO ENDDO -! write(9292,*)PSO2SRC(JL,JK),PSO4SRC(JL,JK) - IF (.not. LAERCHEM) THEN - DO JL=KIDIA,KFDIA - DO JK=1,KLEV - DO JGAS=1,2 - IF (TRIM(YAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))%CNAME)=='SO2') THEN - ISSO2=ind_oifs_ham%ind_gas_OIFS(JGAS) - !write(9292,*)ISSO2,PSO2SRC(JL,JK) - PTENC(JL,JK,KAERO(ISSO2))=PTENC(JL,JK,KAERO(ISSO2))+ PSO2SRC(JL,JK) - !PCFLX(JL,KAERO(ISSO2))=PCFLX(JL,KAERO(ISSO2)) + PSO2SRC(JL,JK) - PEMIDIAG(JL,KAERO(ISSO2))=PEMIDIAG(JL,KAERO(ISSO2))+ PSO2SRC(JL,JK) - ELSE IF (TRIM(YAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))%CNAME)=='SO4_gas') THEN - ISSO4=ind_oifs_ham%ind_gas_OIFS(JGAS) - !write(9292,*)ISSO4, PSO4SRC(JL,JK) - PTENC(JL,JK,KAERO(ISSO4))=PTENC(JL,JK,KAERO(ISSO4))+ PSO4SRC(JL,JK) - !PCFLX(JL,KAERO(ISSO4))=PCFLX(JL,KAERO(ISSO4)) + PSO4SRC(JL,JK) - PEMIDIAG(JL,KAERO(ISSO4))=PEMIDIAG(JL,KAERO(ISSO4)) + PSO4SRC(JL,JK) - END IF - END DO - END DO + END SUBROUTINE - - ! For add SOA from CO into ISVOC tracer -!!$ DO JGAS=1,NACTAERO -!!$ IF (TRIM(YAERO(JGAS)%CNAME)=='ISVOC') THEN -!!$ -!!$ PTENC(JL,JK,KAERO(JGAS))=PTENC(JL,JK,KAERO(JGAS))+ PSOACO(JL) -!!$ PEMIDIAG(JL,KAERO(JGAS))=PEMIDIAG(JL,KAERO(JGAS)) + PSOACO(JL) -!!$ END IF -!!$ END DO - - END DO - END IF -! PGFL(KIDIA:KFDIA,:,YAEROUT(5)%MP)=ZAEROUT5(KIDIA:KFDIA,:) - -!----------------------------------------------------------------------- - -!* 6.0 De-allocate arrays -! ------------ - - -DO IMODE=1,NMOD - IF(associated(EMIS_NUMBER(IMODE)%d3)) DEALLOCATE(EMIS_NUMBER(IMODE)%d3) - IF(associated(EMIS_MASS(IMODE)%d3)) DEALLOCATE(EMIS_MASS(IMODE)%d3) -ENDDO - -END ASSOCIATE -END ASSOCIATE -IF (LHOOK) CALL DR_HOOK('TM5M7_SRC',1,ZHOOK_HANDLE) END SUBROUTINE TM5M7_SRC diff --git a/ifs-source/arpifs/phys_ec/tm5m7_src_dust.F90 b/ifs-source/arpifs/phys_ec/tm5m7_src_dust.F90 index ae158647..a58f9ca0 100644 --- a/ifs-source/arpifs/phys_ec/tm5m7_src_dust.F90 +++ b/ifs-source/arpifs/phys_ec/tm5m7_src_dust.F90 @@ -1,204 +1,182 @@ -SUBROUTINE TM5M7_SRC_DUST & - &( YDEPHY, YDEAERMAP, YDEAERSRC, KIDIA, KFDIA, KLON, KLEV, KTILES, KSW,& - & PLSM , PWIND, PSNS, PZ0M, & - & SP, PTL, & - & Psoil_type, & - & PFRTI, PCVL, PCVH, KTVL, KTVH, & - & emis_mass, emis_number ,PAERFLX,PGLON, PGLAT, & - & PRWPWP,PRWSAT,PAERMAP,PALB,PALBD,PWS1,PHSDFOR) - -!*** * TM5M7_SRC_DUST* - SOURCE TERMS FOR DUST AEROSOLS -! -! Online dust emissions based on Tegen/Vignati/Strunk -! --------------------------------------------------- -! -! Please read the section above for background information about the underlying -! approach. An improved and modified online implementation has been accomplished -! from which. It can be activated by setting -! -! input.emis.dust : ONLINE -! -! in the rc-file. An additional netcdf file is needed for some input parameters. -! The path to which needs to be defined in the key -! -! input.emis.dust.dir : /ms_perm/TM/TM5/emissions/other/Dust_online/onlinedust.nc -! -! For every time step there will be particles emitted, scaled to monthly -! amounts (both mass and numbers) in order to keep compliance with assumptions -! about the aerosol emissions in sedimentation.F90. -! -! -!** INTERFACE. -! ---------- -! *TM5M7_SRC_DUST* IS CALLED FROM *TM5M7_SRC*. - -! AUTHOR. -! ------- -! -! T. van Noije et al. (?) -! -! SOURCE. -! ------- -! -! MODIFICATIONS. -! -------------- -! -! Nov 2011 - Achim Strunk - v0 -! -! xxxx - ?? -! -! Sep 2020 - V. Huijnen: first (partial) introduction into OpenIFS -!----------------------------------------------------------------------- +SUBROUTINE TM5M7_SRC_DUST( YDEPHY, YDEAERMAP, YDEAERSRC, & + & KIDIA, KFDIA, KLON, KLEV, KTILES, KSW, & + & PLSM , PWIND, PSNS, PZ0M, & + & SP, PTL, PSOIL_TYPE, & + & PFRTI, PCVL, PCVH, KTVL, KTVH, & + & EMIS_MASS, EMIS_NUMBER ,PAERFLX,PGLON, PGLAT, & + & PRWPWP,PRWSAT,PAERMAP,PALB,PALBD,PWS1,PHSDFOR) + +! RCHG -> Here a dependence is KLEV => it is that ok? + +! ╭────────────────────────────────────────────────────────────────────────────╮ +! │ (updated 04-Jun-2024) │ +! │ Purpose : │ +! │ ------- │ +! │ *tm5m7_src_dust* - SOURCE TERMS FOR MINERAL DUST AEROSOLS │ +! │ │ +! │ │ +! │ Interface : │ +! │ --------- │ +! │ *tm5m7_src_dust* is called from tm5m7_src │ +! │ │ +! │ │ +! │ Input : │ +! │ ----- │ +! │ │ +! │ │ +! │ Output : │ +! │ ------ │ +! │ │ +! │ │ +! │ Externals : │ +! │ --------- │ +! │ │ +! │ Method : │ +! │ ------ │ +! │ Online dust emissions based on Tegen/Vignati/Strunk │ +! │ │ +! │ Please read the section above for background information about the │ +! │ underlying approach. An improved and modified online implementation has │ +! │ been accomplished from which. It can be activated by setting │ +! │ │ +! │ input.emis.dust : ONLINE │ +! │ │ +! │ in the rc-file. An additional netcdf file is needed for some input │ +! │ parameters. The path to which needs to be defined in the key │ +! │ │ +! │ input.emis.dust.dir : │ +! │ /ms_perm/TM/TM5/emissions/other/Dust_online/onlinedust.nc │ +! │ │ +! │ For every time step there will be particles emitted, scaled to monthly │ +! │ amounts (both mass and numbers) in order to keep compliance with │ +! │ assumption sabout the aerosol emissions in sedimentation.F90. │ +! │ │ +! │ Reference : │ +! │ --------- │ +! │ │ +! │ Author : │ +! │ ------- │ +! │ Orginal version: T. van Noije et al. (KNMI) │ +! │ Nov 2011 - Achim Strunk - v0 │ +! │ Vincent Huijen (KNMI) adapted to OpenIFS │ +! │ │ +! │ Modifications : │ +! │ ------------- │ +! │ Jun. 2024 - R. Checa-Garcia: revision for CY48r1 and refactory │ +! │ │ +! ╰────────────────────────────────────────────────────────────────────────────╯ + + +! --- IFS/OpenIFS modules ------------------------------------------------------ + USE TYPE_MODEL,ONLY : MODEL USE YOMLUN, ONLY : NULOUT USE PARKIND1 ,ONLY : JPIM ,JPRB USE YOMHOOK ,ONLY : LHOOK, DR_HOOK, JPHOOK USE YOMCST, ONLY : RPI -!USE YOMPHYDER, ONLY : STATE_TYPE -USE TM5M7_DATA, ONLY: NMOD, MODE_ACI, MODE_COI, sigma, sigma_lognormal, ddust,iacci,icoai -USE TM5M7_EMIS_DATA, ONLY : MODAL_EMISSIONS, & - & nclass, nmode,nbin, nats,solspe, nsoilph, nfpar, NTRACED, & - & umin, z0_min, lai_lim,lai_lim2, ROA, & - & U1FAC,cd, min_ai,max_ai,min_ci,max_ci,& - & vkarman,zz,airfac, DMIN,DMAX,DSTEP, & - & UTH,SREL,SRELV,SU_SRELV, & - & ratio_coa,ratio_acc,denom_acc_inv,denom_coa_inv, & - & mf_coa_r12_inv,mf_acc_r12_inv, & - & mmr_ai,mmr_ci -!AER -!USE GEOMETRY_MOD , ONLY : GEOMETRY -!USE YOEAERATM ,ONLY : YREAERATM -!USE YOEAERMAP ,ONLY : YREAERMAP -!USE YOEAERSRC ,ONLY : YREAERSRC -!USE YOEAERVOL ,ONLY : YREAERVOL -!USE YOEAERSNK, ONLY : YREAERSNK -!USE YOMRIP ,ONLY : YRRIP -!USE YOEPHY ,ONLY : YREPHY -!USE YOMCT3 , ONLY : NSTEP + +! -- M7 modules ---------------------------------------------------------------- +USE TM5M7_DATA, ONLY: NMOD, MODE_ACI, MODE_COI, sigma, sigma_lognormal, & + & ddust,iacci,icoai +USE TM5M7_EMIS_DATA, ONLY: MODAL_EMISSIONS, NTRACED, & + & nclass, nmode,nbin, nats,solspe, nsoilph, nfpar, & + & umin, z0_min, lai_lim, lai_lim2, ROA, & + & U1FAC, cd, min_ai, max_ai, min_ci, max_ci, & + & vkarman, zz, airfac, DMIN, DMAX, DSTEP, & + & UTH, SREL, SRELV, SU_SRELV, & + & ratio_coa, ratio_acc, denom_acc_inv, denom_coa_inv, & + & mf_coa_r12_inv, mf_acc_r12_inv, & + & mmr_ai, mmr_ci + USE YOEPHY , ONLY : TEPHY USE YOEAERMAP, ONLY : TEAERMAP USE YOEAERSRC, ONLY : TEAERSRC -IMPLICIT NONE -!----------------------------------------------------------------------- -!* 0.1 ARGUMENTS -! --------- - -!TYPE(MODEL) ,INTENT(INOUT) :: YDMODEL -TYPE(TEPHY) ,INTENT(IN) :: YDEPHY -TYPE(TEAERMAP),INTENT(INOUT) :: YDEAERMAP -TYPE(TEAERSRC),INTENT(IN) :: YDEAERSRC - -!TYPE (STATE_TYPE) ,INTENT (IN) :: TENDENCY_CML -INTEGER(KIND=JPIM),INTENT(IN) :: KLON -INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA -INTEGER(KIND=JPIM),INTENT(IN) :: KFDIA -INTEGER(KIND=JPIM),INTENT(IN) :: KLEV -INTEGER(KIND=JPIM),INTENT(IN) :: KTILES - - -REAL(KIND=JPRB) ,INTENT(IN) :: PLSM(KLON) -REAL(KIND=JPRB) ,INTENT(IN) :: PWIND(KLON) ! 10m wind speed, see tm5m7_src.F90 -REAL(KIND=JPRB) ,INTENT(IN) :: PSNS(KLON) ! Snow depth -REAL(KIND=JPRB) ,INTENT(IN) :: PZ0M(KLON) ! Roughness length [m] -REAL(KIND=JPRB) ,INTENT(IN) :: SP(KLON) ! Surface pressure -REAL(KIND=JPRB) ,INTENT(IN) :: PTL(KLON) ! surface temperature -REAL(KIND=JPRB) ,INTENT(IN) :: PSOIL_TYPE(KLON) -! REAL(KIND=JPRB) ,INTENT(IN) :: POT_SOURCE(KLON),CULT(KLON) -! REAL(KIND=JPRB) ,INTENT(IN) :: SOILPH(KLON,NSOILPH) -! REALD(KIND=JPRB) ,INTENT(IN) :: FPAR(KLON,NFPAR) -REAL(KIND=JPRB) ,INTENT(IN) :: PFRTI(KLON,KTILES) ! Tile fraction (0-1) +!----------------------------------------------------------------------- +!* 0.1 ARGUMENTS +! --------- + +TYPE(TEPHY), INTENT(IN) :: YDEPHY +TYPE(TEAERMAP), INTENT(INOUT) :: YDEAERMAP +TYPE(TEAERSRC), INTENT(IN) :: YDEAERSRC + +INTEGER(KIND=JPIM), INTENT(IN) :: KIDIA +INTEGER(KIND=JPIM), INTENT(IN) :: KFDIA +INTEGER(KIND=JPIM), INTENT(IN) :: KLON +INTEGER(KIND=JPIM), INTENT(IN) :: KLEV +INTEGER(KIND=JPIM), INTENT(IN) :: KTILES +INTEGER(KIND=JPIM), INTENT(IN) :: KSW + +REAL(KIND=JPRB), INTENT(IN) :: PLSM(KLON) +REAL(KIND=JPRB), INTENT(IN) :: PWIND(KLON) ! 10m wind speed, see tm5m7_src.F90 +REAL(KIND=JPRB), INTENT(IN) :: PSNS(KLON) ! Snow depth +REAL(KIND=JPRB), INTENT(IN) :: PZ0M(KLON) ! Roughness length [m] +REAL(KIND=JPRB), INTENT(IN) :: SP(KLON) ! Surface pressure +REAL(KIND=JPRB), INTENT(IN) :: PTL(KLON) ! surface temperature +REAL(KIND=JPRB), INTENT(IN) :: PSOIL_TYPE(KLON) +REAL(KIND=JPRB), INTENT(IN) :: PFRTI(KLON,KTILES) ! Tile fraction (0-1) ! 1 : Water 5 : Snow on low-veg + bare-soil ! 2 : Ice 6 : Dry snow-free high veg ! 3 : Wet skin 7 : snow under high-veg ! 4 : Dry snow-free low-veg 8 : bare soil -REAL(KIND=JPRB) , INTENT(IN) :: PCVL(KLON), PCVH(KLON) ! Low/High vegetation cover -INTEGER(KIND=JPIM), INTENT(IN) :: KTVL(KLON), KTVH(KLON) ! Low/High vegetation type -REAL(KIND=JPRB) ,INTENT(INOUT) :: PAERFLX(KLON,12,9) - -TYPE(MODAL_EMISSIONS),INTENT(INOUT) :: emis_mass(NMOD) -TYPE(MODAL_EMISSIONS),INTENT(INOUT) :: emis_number(NMOD) -INTEGER(KIND=JPIM),INTENT(IN) :: KSW -REAL(KIND=JPRB) ,INTENT(INOUT) :: PRWPWP,PRWSAT,PAERMAP(KLON,5) -REAL(KIND=JPRB) ,INTENT(IN) :: PALB(KLON),PWS1(KLON),PHSDFOR(KLON),PGLON(KLON),PGLAT(KLON), PALBD(KLON,KSW) -!* 0.5 LOCAL VARIABLES -! --------------- - -INTEGER(KIND=JPIM) :: JL, IVEG, I_S1,I_S11, IFF, ID,JK,JAER, INBAER -INTEGER(KIND=JPIM) :: IDUST,KK,KKK,KFIRST,KKMIN,NN -REAL(KIND=JPRB) :: NORM, XSEA, AREA_FRAC, TT, T_SCALE, DENS, RG1, RG2 ,FDP1,FDP2 -REAL(KIND=JPRB) :: VEGET,LAI_MAX,LAI_AVG, LAI_CUR,z0s,dpd,uthp,flux_diam,cultfac1 -REAL(KIND=JPRB) :: AAA,BB, CCC, AEFF,FF, XEFF, feff, DBSTART, USTAR, rho_air -REAL(KIND=JPRB) :: DLAST,DP -REAL(KIND=JPRB) :: AIRDENS_RATIO,AIRDENS_RATIO2 -REAL(KIND=JPRB) :: FLUX_R1,FLUX_R2 -REAL(KIND=JPRB) :: EMIS_FAC(KLON) -REAL(KIND=JPRB) :: NUMBER(KLON), MASS(KLON) +REAL(KIND=JPRB), INTENT(IN) :: PCVL(KLON), PCVH(KLON) ! Low/High vegetation cover +INTEGER(KIND=JPIM), INTENT(IN) :: KTVL(KLON), KTVH(KLON) ! Low/High vegetation type +! M7 +TYPE(MODAL_EMISSIONS), INTENT(INOUT) :: emis_mass(NMOD) +TYPE(MODAL_EMISSIONS), INTENT(INOUT) :: emis_number(NMOD) +REAL(KIND=JPRB), INTENT(INOUT) :: PAERFLX(KLON,12,9) +REAL(KIND=JPRB), INTENT(IN) :: PGLON(KLON),PGLAT(KLON) +REAL(KIND=JPRB), INTENT(INOUT) :: PRWPWP, PRWSAT, PAERMAP(KLON,5) +REAL(KIND=JPRB), INTENT(IN) :: PALB(KLON), PALBD(KLON,KSW) +REAL(KIND=JPRB), INTENT(IN) :: PWS1(KLON),PHSDFOR(KLON) + +!* 0.5 LOCAL VARIABLES +! --------------- + +!INTEGER(KIND=JPIM), PARAMETER :: KBINDD=3 +INTEGER(KIND=JPIM) :: JL, I_S1,I_S11, ID, JAER, INBAER +!INTEGER(KIND=JPIM) :: IDUST,KK,KKK,KFIRST,KKMIN,NN +!REAL(KIND=JPRB) :: FDP1,FDP2 +!REAL(KIND=JPRB) :: VEGET, z0s, dpd, uthp, flux_diam, cultfac1 +!REAL(KIND=JPRB) :: AAA,BB, CCC, AEFF,FF, XEFF, feff, DBSTART, USTAR, rho_air +!REAL(KIND=JPRB) :: DLAST,DP +!REAL(KIND=JPRB) :: AIRDENS_RATIO,AIRDENS_RATIO2 +!REAL(KIND=JPRB) :: FLUX_R1,FLUX_R2 REAL(KIND=JPRB) :: SNOWCOVER(KLON), DESERT(KLON) REAL(KIND=JPRB) :: LAI_EFF(KLON),UMIN2(KLON), ALPHA(KLON), C_EFF(KLON) -REAL(KIND=JPRB) :: Z0(KLON) ! Local copy of roughness length +REAL(KIND=JPRB) :: Z0(KLON) ! Local copy of roughness length REAL(KIND=JPRB) :: SOIL_TYPE(KLON) ! Local copy of soil type REAL(KIND=JPRB) :: FLUX_AI(KLON), FLUX_CI(KLON),FNUM_AI(KLON),FNUM_CI(KLON) REAL(KIND=JPRB) :: FLUXTOT(NTRACED),FDUST(NTRACED) REAL(KIND=JPRB) :: FLUXTYP(NCLASS) -REAL(KIND=JPRB) :: ZDEPTILE -REAL(KIND=JPRB) :: TV_DAT(20) ! Local grid box fractions (0-1) for each of presumeably 20 IFS vegetation types - -!!! AER -REAL(KIND=JPRB) :: ZGLAT(KLON), ZGLON(KLON),ZLAT,ZLON,ZLONE,ZLONW,ZINCLAT,ITYPDU -REAL(KIND=JPRB) :: ZHDD, ZHSS -REAL(KIND=JPRB) :: ZDETAH(KLON,KLEV), ZETA(KLON,KLEV) , ZETAH(KLON,0:KLEV) -!REAL(KIND=JPRB) :: ZQSAT(KLON,KLEV) , ZRHCL(KLON,KLEV), ZTH(KLON,0:KLEV) -!-- various alternate sources can be tested -REAL(KIND=JPRB) :: ZFLX_SDUST(KLON,9,12), ZFLX_SSALT(KLON,9,3) -!REAL(KIND=JPRB) :: ZLOCALTIM , ZDIURN(KLON) -REAL(KIND=JPRB) :: ZSCC2(KLON) , ZDEP2(KLON) , ZLTS2(KLON), ZLTSMIN(KLON), ZLTSMAX(KLON) -REAL(KIND=JPRB) :: ZWNDDU(KLON), ZWNDSS(KLON), ZWND3(KLON) -REAL(KIND=JPRB) :: ZDUEMPOT(KLON,3) -REAL(KIND=JPRB) :: ZDEGRAD , ZFSWET , ZSWETN, ZSWETN2 -REAL(KIND=JPRB) :: ZRWPWP , ZRWSAT , ZSO2MSS -REAL(KIND=JPRB) :: ZEPSISS, ZEPSIDD, ZEPSIRA, ZEPSSNO, ZEPSARE -REAL(KIND=JPRB) :: ZBNDA, ZBNDB, ZBNDC, ZBNDD, ZBNDE, ZBNDF, ZBNDG, ZBNDH, ZBNDI -REAL(KIND=JPRB) :: ZBNDJ, ZBNDK, ZBNDL, ZBNDM -REAL(KIND=JPRB) :: ZREFRAD, ZREFSPD, ZRADREF,ZLONGB +!REAL(KIND=JPRB) :: ZDEPTILE +REAL(KIND=JPRB) :: TV_DAT(20) ! Local grid box fractions (0-1) for each of + ! presumeably 20 IFS vegetation types +! RCHG -> Here it i simportant to explain what are 9 , 12 +! => PROBABLY related to PAERFLUX dimensions +REAL(KIND=JPRB) :: ZFLX_SDUST(KLON,9,12) +REAL(KIND=JPRB) :: ZSCC2(KLON), ZDEP2(KLON) +REAL(KIND=JPRB) :: ZLTS2(KLON), ZLTSMIN(KLON), ZLTSMAX(KLON) +REAL(KIND=JPRB) :: ZWND3(KLON) +REAL(KIND=JPRB) :: ZDUEMPOT(KLON,3) +REAL(KIND=JPRB) :: ZDEGRAD, ZFSWET, ZSWETN +REAL(KIND=JPRB) :: ZRWPWP, ZRWSAT +REAL(KIND=JPRB) :: ZEPSSNO, ZEPSARE +REAL(KIND=JPRB) :: ZREFSPD, ZRADREF, ZREFRAD REAL(KIND=JPRB) :: ZAERDUB -LOGICAL :: LLDUST(KLON,12), LLPDUSTS(KLON) -!REAL(KIND=JPRB) :: ZFLX_SDUST(KLON,9,12) -!REAL(KIND=JPRB), POINTER :: RDDUAER(:), RDUSRCP(:) -!REAL(KIND=JPRB), POINTER :: RDDUSRC(:)!!! dimensions changed from (0:50,9) to (9) REAL(KIND=JPRB) :: RDDUSRC(9) -!INTEGER(KIND=JPIM)::KBINDD -INTEGER(KIND=JPIM), PARAMETER :: KBINDD=3 +LOGICAL :: LLDUST(KLON,12), LLPDUSTS(KLON) +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE -REAL(KIND=JPHOOK) :: ZHOOK_HANDLE -!----------------------------------------------------------------------- +!------------------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('TM5M7_SRC_DUST',0,ZHOOK_HANDLE) - - - - ! ASSOCIATE( YDEPHY=>YDMODEL%YRML_PHY_EC%YREPHY, & - ! & YDEAERMAP=>YDMODEL%YRML_PHY_AER%YREAERMAP, & - ! & YDEAERSRC=>YDMODEL%YRML_PHY_AER%YREAERSRC) - - -ASSOCIATE( NDUSRCP=>YDEAERMAP%NDUSRCP, RDDUAER=>YDEAERMAP%RDDUAER, & - & RDUSRCP=>YDEAERMAP%RDUSRCP, & - & NDDUST=>YDEAERSRC%NDDUST, & - & NALBEDOSCHEME=>YDEPHY%NALBEDOSCHEME) ! LE4ALB to NALBEDOSCHEME -! & RFCTSS=>YDEAERSRC%RFCTSS, ROMPHIL=>YDEAERSRC%ROMPHIL, & -! & ROMPHOB=>YDEAERSRC%ROMPHOB, RSIDECA=>YDEAERSRC%RSIDECA, & -! & RSIVSRA=>YDEAERSRC%RSIVSRA, & - !& LE4ALB=>YDEPHY%LE4ALB, LVDFTRAC=>YDEPHY%LVDFTRAC, YSURF=>YDEPHY%YSURF)!, & - !& NLOENG=>YDGEOMETRY%YRGEM%NLOENG, & - !& NGLOBALAT=>YDGEOMETRY%YRMP%NGLOBALAT, & - !& NSTASS=>YRRIP%NSTASS, RHGMT=>YRRIP%RHGMT, RSTATI=>YRRIP%RSTATI,& - !& NCHEM=>YGFL%NCHEM, YCHEM=>YGFL%YCHEM, LAERSOA_CHEM=>YREAERATM%LAERSOA_CHEM, & - !& LAERCHEM=>YGFL%LAERCHEM) - +ASSOCIATE( NDUSRCP => YDEAERMAP%NDUSRCP, RDDUAER => YDEAERMAP%RDDUAER, & + & RDUSRCP => YDEAERMAP%RDUSRCP, NDDUST => YDEAERSRC%NDDUST, & + & NALBEDOSCHEME => YDEPHY%NALBEDOSCHEME) ! LE4ALB to NALBEDOSCHEME ! ifs vegetation ! @@ -478,7 +456,7 @@ SUBROUTINE TM5M7_SRC_DUST & ELSE !>>> TvN ! Use minimum value for roughness length. - ! VH convert PZ0M from [m] to [cm] + ! VH convert PZ0M from [m] to [cm] !z0(JL) = z0_min !max(z0_min,PZ0M(JL)*100._JPRB ) z0(JL) = max(z0_min,PZ0M(JL)*100._JPRB ) !write(3000,*)z0(JL),z0_min @@ -830,7 +808,7 @@ SUBROUTINE TM5M7_SRC_DUST & !ZGRDLAT2=ZGRDLAT*0.55_JPRB !ZDDUAER(:) = 1.00_JPRB -!KBINDD=3 +KBINDD=3 RDDUAER(:) = 0.0_JPRB RDDUSRC(:)= 0.0_JPRB @@ -1292,7 +1270,7 @@ SUBROUTINE TM5M7_SRC_DUST & INBAER=0 -ZAERDUB=1.E-11_JPRB +RAERDUB=1.E-11_JPRB !- ECMWF dust emission fluxes come in either 3- or 10-size bins ! 0.03 - 0.55 - 0.9 - 20. @@ -1340,7 +1318,7 @@ SUBROUTINE TM5M7_SRC_DUST & LLPDUSTS(JL)=.TRUE. - PAERMAP(JL,5)=ZAERDUB * ZDUEMPOT(JL,1) ! for diagnostics only + PAERMAP(JL,5)=RAERDUB * ZDUEMPOT(JL,1) ! for diagnostics only ENDIF ENDIF ENDDO @@ -1364,7 +1342,7 @@ SUBROUTINE TM5M7_SRC_DUST & !-- ECMWF formulation IF (LLPDUSTS(JL)) THEN - ZDEP2(JL)= ZAERDUB * ZDUEMPOT(JL,JAER) + ZDEP2(JL)= RAERDUB * ZDUEMPOT(JL,JAER) ZSCC2(JL)= 20._JPRB !-- Present formulation in MACC (June'11, still kept June'13) @@ -1404,11 +1382,11 @@ SUBROUTINE TM5M7_SRC_DUST & !-- PCFLX in kg m-2 s-1 DO JAER=1,KBINDD - !INBAER=INBAER+1 + INBAER=INBAER+1 DO JL=KIDIA,KFDIA - !!!$IF (LLDUST(JL,NDDUST) .AND. ZFLX_SDUST(JL,JAER,NDDUST) > 0._JPRB) THEN - !!!$ ZFLX_SDUST(JL,JAER,NDDUST)=ZFLX_SDUST(JL,JAER,NDDUST) - !!!$ENDIF + IF (LLDUST(JL,NDDUST) .AND. ZFLX_SDUST(JL,JAER,NDDUST) > 0._JPRB) THEN + ZFLX_SDUST(JL,JAER,NDDUST)=ZFLX_SDUST(JL,JAER,NDDUST) + ENDIF !PCFLX(JL,KAERO(INBAER))=-ZFLX_SDUST(JL,JAER,NDDUST) * 1.E+00_JPRB if (JAER<2) then !---- @@ -1441,7 +1419,6 @@ SUBROUTINE TM5M7_SRC_DUST & !!$ ENDDO -!END ASSOCIATE END ASSOCIATE IF (LHOOK) CALL DR_HOOK('TM5M7_SRC_DUST',1,ZHOOK_HANDLE) END SUBROUTINE TM5M7_SRC_DUST diff --git a/ifs-source/arpifs/phys_ec/tm5m7_src_dust_init.F90 b/ifs-source/arpifs/phys_ec/tm5m7_src_dust_init.F90 index 164b4be5..513d1c21 100644 --- a/ifs-source/arpifs/phys_ec/tm5m7_src_dust_init.F90 +++ b/ifs-source/arpifs/phys_ec/tm5m7_src_dust_init.F90 @@ -1,116 +1,135 @@ SUBROUTINE TM5M7_SRC_DUST_INIT -!*** * TM5M7_SRC_DUST_INIT* - SOURCE TERMS FOR DUST AEROSOLS +! ╭────────────────────────────────────────────────────────────────────────────╮ +! │ (updated 23-Jun-2024) │ +! │ Purpose : │ +! │ ------- │ +! │ *tm5m7_src_dust_init* - │ +! │ │ +! │ │ +! │ Interface : │ +! │ --------- │ +! │ *TM5M7_SRC_DUST_INIT* IS CALLED FROM *TM5M7_INIT" │ +! │ │ +! │ Input : │ +! │ ----- │ +! │ │ +! │ Output : │ +! │ ------ │ +! │ │ +! │ Externals : │ +! │ --------- │ +! │ │ +! │ Method : Online dust emissions based on Tegen/Vignati/Strunk │ +! │ ------ │ +! │ │ +! │ Please read the section above for background information about the │ +! │ underlying approach. An improved and modified online implementation │ +! │ has been accomplished from which. It can be activated by setting │ +! │ │ +! │ input.emis.dust : ONLINE │ +! │ │ +! │ in the rc-file. An additional netcdf file is needed for some input │ +! │ parameters. The path to which needs to be defined in the key │ +! │ │ +! │ input.emis.dust.dir : │ +! │ /ms_perm/TM/TM5/emissions/other/Dust_online/onlinedust.nc │ +! │ │ +! │ For every time step there will be particles emitted, scaled to monthly │ +! │ amounts (both mass and numbers) in order to keep compliance with │ +! │ assumptions about the aerosol emissions in sedimentation.F90. │ +! │ │ +! │ Reference : │ +! │ --------- │ +! │ │ +! │ Author : │ +! │ ------- │ +! │ T. van Noije et al. (?) │ +! │ │ +! │ Modifications : │ +! │ ------------- │ +! │ Nov 2011 - Achim Strunk - v0 │ +! │ Sep 2020 - V. Huijnen: first (partial) introduction into OpenIFS │ +! │ May. 2024 - R. Checa-Garcia: revision for CY48r1 and refactory │ +! │ │ +! ╰────────────────────────────────────────────────────────────────────────────╯ ! -! Online dust emissions based on Tegen/Vignati/Strunk -! --------------------------------------------------- -! -! Please read the section above for background information about the underlying -! approach. An improved and modified online implementation has been accomplished -! from which. It can be activated by setting -! -! input.emis.dust : ONLINE -! -! in the rc-file. An additional netcdf file is needed for some input parameters. -! The path to which needs to be defined in the key -! -! input.emis.dust.dir : /ms_perm/TM/TM5/emissions/other/Dust_online/onlinedust.nc -! -! For every time step there will be particles emitted, scaled to monthly -! amounts (both mass and numbers) in order to keep compliance with assumptions -! about the aerosol emissions in sedimentation.F90. -! -! -!** INTERFACE. -! ---------- -! *TM5M7_SRC_DUST_INIT* IS CALLED FROM *TM5M7_INIT*. - -! AUTHOR. -! ------- -! -! T. van Noije et al. (?) -! -! SOURCE. -! ------- -! -! MODIFICATIONS. -! -------------- -! -! Nov 2011 - Achim Strunk - v0 -! -! xxxx - ?? -! -! Sep 2020 - V. Huijnen: first (partial) introduction into OpenIFS -!----------------------------------------------------------------------- - -USE PARKIND1 ,ONLY : JPIM ,JPRB -USE YOMHOOK ,ONLY : LHOOK, DR_HOOK, JPHOOK - -USE YOMCST, ONLY : RPI, RG -USE TM5M7_DATA, ONLY : DDUST -USE TM5M7_EMIS_DATA, ONLY : nmode, nats,nclass, solspe, UTH, SREL, SRELV, SU_SRELV, & - & DMIN, DMAX,DSTEP, A_RNOLDS,B_RNOLDS,X_RNOLDS, ROA, D_THRSLD - +USE PARKIND1, ONLY : JPIM , JPRB +USE YOMHOOK, ONLY : LHOOK, DR_HOOK, JPHOOK +USE YOMCST, ONLY : RPI, RG + +USE TM5M7_DATA, ONLY : DDUST +USE TM5M7_EMIS_DATA, ONLY : nmode, nats, nclass, solspe, & + & UTH, SREL, SRELV, SU_SRELV, & + & DMIN, DMAX, DSTEP, A_RNOLDS, & + & B_RNOLDS, X_RNOLDS, ROA, D_THRSLD IMPLICIT NONE !----------------------------------------------------------------------- - -!* 0.1 ARGUMENTS +!* 0.1 ARGUMENTS (None -> shared via TM5M7_DATA and TM5M7_EMIS_DATA) ! --------- - -! ... None ... - - +! !* 0.2 LOCAL VARIABLES ! --------------- INTEGER(KIND=JPIM) :: NN, ND, NS, KK, NM, NSI, NP REAL(KIND=JPRB) :: BB, CCC, DDD, EE, FF, DP, XK, STOTAL,STOTALV REAL(KIND=JPRB) :: SU, SUV, SU_LOC, SU_LOCV, XL, XM, XN, XNV - -!REAL, DIMENSION(:), ALLOCATABLE :: su_class, su_classv, utest -REAL(KIND=JPRB) :: su_class(nclass), su_classv(nclass), utest(nats) - -REAL(KIND=JPHOOK) :: ZHOOK_HANDLE +REAL(KIND=JPRB) :: su_class(nclass), su_classv(nclass), utest(nats) +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE !----------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('TM5M7_SRC_DUST_INIT',0,ZHOOK_HANDLE) - -! global fields, which have to be available throughout the whole - - -! only needed within "initial" -!ALLOCATE( su_class ( nclass ) ) -!ALLOCATE( su_classv( nclass ) ) -!ALLOCATE( utest ( nats ) ) - - ! --------------------------------------------- ! read input file ... CHECK HOW TO HANDLE THIS ... ! --------------------------------------------- - - !--------------------------------------------------------------------------------------- ! initializations !--------------------------------------------------------------------------------------- -uth = 0. -srel = 0. ! fraction of the grid area correspondent to each soil population -srelV = 0. ! fraction of volume -su_srelV = 0. -utest = 0. +uth = 0._JPRB ! Threshold friction velocity +srel = 0._JPRB ! fraction of the grid area correspondent to each soil population +srelV = 0._JPRB ! fraction of volume +su_srelV = 0._JPRB +utest = 0._JPRB !--------------------------------------------------------------------------------------- -! Uth calculation -! Threshold friction velocity dependent on the particle diameter +! (1) Uth calculation +! Threshold friction velocity dependent on the particle diameter (over a smooth surface) ! following Eqs. (3-5) in MB95. +! +! RCHG -> Althought MB consider 0.03 < Re <= 10 values smaller than 0.03 are impossible. +! +! code below can crash if Dmax is not consistent with NCLASS, it is possible that the best +! if NCLASS is large enough this is not a problem but then Uth will have undefined values +! probably the best way is a loop in NN +! +! dp = Dmin +! DO nn=1,NCLASS +! +! BB = a_rnolds * (dp ** x_rnolds) + b_rnolds +! XK = SQRT(ddust * RG *100. * dp / roa) ! grav should be in cm s-2 +! CCC = SQRT(1. + d_thrsld /(dp ** 2.5)) +! IF( BB < 10. ) THEN +! DDD = SQRT(1.928 * (BB ** 0.092) - 1.) +! Uth(nn) = 0.129 * XK * CCC / DDD +! ELSE +! EE = -0.0617 * (BB - 10.) +! FF = 1. -0.0858 * EXP(EE) +! Uth(nn) = 0.12 * XK * CCC * FF +! END IF +! dp = dp * EXP(Dstep) +! IF (dp > Dmax+1e.-05) CALL ABOR1("[TM5M7_SRC_DUST_INIT] NCLASS inconsistent with [Dmin,Dmax]") +! ENDDO +! +! !--------------------------------------------------------------------------------------- nn = 0 dp = Dmin DO WHILE( dp <= Dmax + 1E-05 ) nn = nn + 1 BB = a_rnolds * (dp ** x_rnolds) + b_rnolds - XK = SQRT(ddust * RG *100. * dp / roa) ! grav should be in cm s-2 + XK = SQRT(ddust * RG *100. * dp / roa) ! grav should be in cm s-2 CCC = SQRT(1. + d_thrsld /(dp ** 2.5)) IF( BB < 10. ) THEN DDD = SQRT(1.928 * (BB ** 0.092) - 1.) @@ -118,16 +137,23 @@ SUBROUTINE TM5M7_SRC_DUST_INIT ELSE EE = -0.0617 * (BB - 10.) FF = 1. -0.0858 * EXP(EE) - Uth(nn) = 0.12 * XK * CCC * FF + Uth(nn) = 0.12 * XK * CCC * FF END IF dp = dp * EXP(Dstep) END DO !--------------------------------------------------------------------------------------- -! surface calculation - calculation of the soil size distribution +! (2) surface calculation - calculation of the soil size distribution ! Through all soil particle diameter the calculation of the relative contribution -! in surface and volume of the soil population independently of the grid +! in surface and volume of the soil population independently of the grid +! RCHG -> probably here the soil mass size distribution is expressed as a sum of ln modes +! which is included in the solspe array where the number of modes is Nmode=4 +! (eq. 29 of MB95) +! solspe for each nats (soil type) has 4 modes and each mode j has +! MMDj (mass median diameter) +! sj (standard deviation) +! rj (relative contribution) !--------------------------------------------------------------------------------------- DO ns = 1, nats ! soil types @@ -138,72 +164,68 @@ SUBROUTINE TM5M7_SRC_DUST_INIT kk = 0 dp = Dmin - DO WHILE( dp <= Dmax + 1.0E-5 ) + DO WHILE( dp <= Dmax + 1.0E-5 ) kk = kk + 1 su = 0. suV = 0. - DO nm = 1, Nmode ! particle size populations in soils - nd = ((nm - 1) *3 ) + 1 ! index to mass median diameter - nsi = nd + 1 ! index to standard deviation - np = nd + 2 ! index to relative contribution - ! - ! based on soil type and contribution of population of the soil type the soil size - ! distribution population is calculated - ! - - !>>> TvN - ! Bug in the original code: nd should be np - ! Since solspe(ns,nd) is never zero - ! and the final result is proportional to solspe(ns,np), - ! the bug has no impact on the results. - !IF (solspe(ns,nd).EQ.0.) THEN - IF (solspe(ns,np).EQ.0. .or. solspe(ns,nsi).EQ.0..or. solspe(ns,nd).EQ.0.) THEN - !<<< TvN - su_loc = 0. - su_locV=0. - ELSE - xk = solspe(ns,np)/(SQRT(2.* RPI)*LOG(solspe(ns,nsi))) - xl = ( (LOG(dp) - LOG( solspe(ns,nd ) ))**2 ) / & - (2.*(LOG( solspe(ns,nsi) ))**2 ) - xm = xk * EXP(-xl) ! value of the lognormal mass size distribution - ! dM/dln(dp) in Eq. (29) in MB95 - ! (Aerosol Sci. Technol., 1994) - xn = ddust*(2./3.)*(dp/2.) ! surface - ! cf. the denominator in Eq. (30) in MB95 - ! The factor 2 difference is irrelevant, - ! since only relative contributions are used. - xnV = 1. !volume - su_loc = (xm*Dstep/xn) ! Eq. (30) in MB95 - su_locV = (xm*Dstep/xnV) - END IF ! - su = su + su_loc - suV = suV + su_locV + DO nm = 1, Nmode ! particle size populations in soils + nd = ((nm - 1) *3 ) + 1 ! index to mass median diameter + nsi = nd + 1 ! index to standard deviation + np = nd + 2 ! index to relative contribution + ! + ! based on soil type and contribution of population of the soil type + ! the soil size distribution population is calculated + ! + !>>> TvN + ! Bug in the original code: nd should be np + ! Since solspe(ns,nd) is never zero + ! and the final result is proportional to solspe(ns,np), + ! the bug has no impact on the results. + ! IF (solspe(ns,nd).EQ.0.) THEN + IF (solspe(ns,np).EQ.0. .or. solspe(ns,nsi).EQ.0. .or. solspe(ns,nd).EQ.0.) THEN + !<<< TvN + su_loc = 0. + su_locV=0. + ELSE + xk = solspe(ns,np)/(SQRT(2.* RPI)*LOG(solspe(ns,nsi))) + xl = ( (LOG(dp) - LOG( solspe(ns,nd ) ))**2 ) / & + & (2.*(LOG( solspe(ns,nsi) ))**2 ) + xm = xk * EXP(-xl) ! value of the lognormal mass size distribution + ! dM/dln(dp) in Eq. (29) in MB95 + ! (Aerosol Sci. Technol., 1994) + xn = ddust*(2./3.)*(dp/2.) ! surface + ! cf. the denominator in Eq. (30) in MB95 + ! The factor 2 difference is irrelevant, + ! since only relative contributions are used. + xnV = 1. !volume + su_loc = (xm*Dstep/xn) ! Eq. (30) in MB95 + su_locV = (xm*Dstep/xnV) + END IF ! + su = su + su_loc ! + suV = suV + su_locV END DO !Nmode su_class(kk) = su su_classV(kk) = suV - Stotal = Stotal + su - StotalV = StotalV + suV - dp = dp * EXP(Dstep) + Stotal = Stotal + su ! Eq. (31) in MB95 + StotalV = StotalV + suV + dp = dp * EXP(Dstep) END DO !dp DO nn = 1,Nclass IF (Stotal.EQ.0.)THEN - srel (ns,nn) = 0. - srelV(ns,nn) = 0. + srel (ns,nn) = 0. + srelV(ns,nn) = 0. ELSE - srel (ns,nn) = su_class(nn)/Stotal - srelV (ns,nn) = su_classV(nn)/StotalV - utest (ns ) = utest(ns)+srelV(ns,nn) - su_srelV(ns,nn) = utest(ns) + srel (ns,nn) = su_class(nn)/Stotal + srelV (ns,nn) = su_classV(nn)/StotalV + utest (ns ) = utest(ns)+srelV(ns,nn) + su_srelV(ns,nn) = utest(ns) END IF END DO !j=1,nclass END DO !ns (soil type) -!DEALLOCATE( su_class, su_classV, utest ) - - IF (LHOOK) CALL DR_HOOK('TM5M7_SRC_DUST_INIT',1,ZHOOK_HANDLE) END SUBROUTINE TM5M7_SRC_DUST_INIT diff --git a/ifs-source/arpifs/phys_ec/tm5m7_src_ss.F90 b/ifs-source/arpifs/phys_ec/tm5m7_src_ss.F90 index 0ef64d02..99be3205 100644 --- a/ifs-source/arpifs/phys_ec/tm5m7_src_ss.F90 +++ b/ifs-source/arpifs/phys_ec/tm5m7_src_ss.F90 @@ -49,9 +49,6 @@ SUBROUTINE TM5M7_SRC_SS & USE PARKIND1 ,ONLY : JPIM ,JPRB USE YOMHOOK ,ONLY : LHOOK, DR_HOOK, JPHOOK -!USE YOEAERSRC ,ONLY : TEAERSRC!YREAERSRC -!USE YOEAERSNK, ONLY : YREAERSNK -!USE YOMPHYDER, ONLY : STATE_TYPE USE YOMCST, ONLY : RPI USE TM5M7_DATA, ONLY: NMOD, MODE_ACS, MODE_COS, sigma_lognormal, SS_DENSITY USE TM5M7_EMIS_DATA, ONLY : MODAL_EMISSIONS, radius_ssa, radius_ssc @@ -62,19 +59,14 @@ SUBROUTINE TM5M7_SRC_SS & !* 0.1 ARGUMENTS ! --------- -!TYPE(TEAERSRC) ,INTENT(IN) :: YDEAERSRC -!TYPE (STATE_TYPE) ,INTENT (IN) :: TENDENCY_CML -INTEGER(KIND=JPIM),INTENT(IN) :: KLON -INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA -INTEGER(KIND=JPIM),INTENT(IN) :: KFDIA -INTEGER(KIND=JPIM),INTENT(IN) :: KLEV - - -REAL(KIND=JPRB) ,INTENT(IN) :: PCI(KLON), PCLAKE(KLON), PLSM(KLON), PSST(KLON) -REAL(KIND=JPRB) ,INTENT(IN) :: PWIND(KLON) ! 10m wind speed, see tm5m7_src.F90 - -TYPE(MODAL_EMISSIONS),INTENT(INOUT) :: emis_mass(NMOD) -TYPE(MODAL_EMISSIONS),INTENT(INOUT) :: emis_number(NMOD) +INTEGER(KIND=JPIM), INTENT(IN) :: KLON +INTEGER(KIND=JPIM), INTENT(IN) :: KIDIA +INTEGER(KIND=JPIM), INTENT(IN) :: KFDIA +INTEGER(KIND=JPIM), INTENT(IN) :: KLEV +REAL(KIND=JPRB), INTENT(IN) :: PCI(KLON), PCLAKE(KLON), PLSM(KLON), PSST(KLON) +REAL(KIND=JPRB), INTENT(IN) :: PWIND(KLON) ! 10m wind speed, see tm5m7_src.F90 +TYPE(MODAL_EMISSIONS), INTENT(INOUT) :: emis_mass(NMOD) +TYPE(MODAL_EMISSIONS), INTENT(INOUT) :: emis_number(NMOD) !* 0.5 LOCAL VARIABLES @@ -368,8 +360,10 @@ SUBROUTINE TM5M7_SRC_SS & emis_mass(mode_cos)%d3(KIDIA:KFDIA,KLEV,4) = mass(KIDIA:KFDIA) !kg/m2/sec + ! RCHG -> In AER scheme there is a flag named LVDFTRAC that might be related with not vertical diffusion. In that case, + ! the tendencies seems to be re-scaled in vertical layers "manually". The flux themselves are not changed. + -!END ASSOCIATE IF (LHOOK) CALL DR_HOOK('TM5M7_SRC_SS',1,ZHOOK_HANDLE) END SUBROUTINE TM5M7_SRC_SS diff --git a/ifs-source/arpifs/phys_radi/radiation_scheme.F90 b/ifs-source/arpifs/phys_radi/radiation_scheme.F90 index c9fff673..ec3a1f45 100644 --- a/ifs-source/arpifs/phys_radi/radiation_scheme.F90 +++ b/ifs-source/arpifs/phys_radi/radiation_scheme.F90 @@ -74,7 +74,7 @@ SUBROUTINE RADIATION_SCHEME & USE YOMRIP0 , ONLY : NINDAT USE YOMCT3 , ONLY : NSTEP USE YOMCST , ONLY : RPI, RSIGMA ! Stefan-Boltzmann constant -USE YOMLUN , ONLY : NULERR +USE YOMLUN , ONLY : NULERR, NULOUT USE SPP_GEN_MOD , ONLY : SPP_PERT USE MPL_MYRANK_MOD , ONLY : MPL_MYRANK USE RADIATION_SETUP, ONLY : ITYPE_TROP_BG_AER, ITYPE_STRAT_BG_AER @@ -438,6 +438,8 @@ SUBROUTINE RADIATION_SCHEME & ZRE_LIQUID_UM(KIDIA:KFDIA,:) = MAX(2.0E-06_JPRB, PRE_LIQ(KIDIA:KFDIA,:)) * 1.E6_JPRB ZRE_ICE_UM(KIDIA:KFDIA,:) = PRE_ICE(KIDIA:KFDIA,:) * 1.E6_JPRB ELSE +! Compute effective radii and convert to metres + CALL LIQUID_EFFECTIVE_RADIUS(YDMODEL%YRML_PHY_RAD%YRERAD, & & YDMODEL%YRML_PHY_EC%YRECLDP,YDSPP_CONFIG,YDMODEL%YRML_GCONF%YGFL, & & KIDIA, KFDIA, KLON, KLEV, & @@ -575,33 +577,37 @@ SUBROUTINE RADIATION_SCHEME & ! Copy optical properties of HAMM7 aerosols - ! reset - IF (RAD_CONFIG%DO_SW) THEN - AEROSOL%OD_SW(1:YRERAD%NTSW,:,KIDIA:KFDIA) = 0.0_JPRB - AEROSOL%SSA_SW(1:YRERAD%NTSW,:,KIDIA:KFDIA) = 0.0_JPRB - AEROSOL%G_SW(1:YRERAD%NTSW,:,KIDIA:KFDIA) = 0.0_JPRB - ENDIF - IF (RAD_CONFIG%DO_LW) THEN - AEROSOL%OD_LW(1:YRERAD%NTSW,:,KIDIA:KFDIA) = 0.0_JPRB - ENDIF + ! Optical properties of HAMM7 aerosols + !IF ( TRIM(AERO_SCHEME) =="hamm7" ) THEN - ! fill with M7 values - IF (YRERAD%NAEROOPT > 0) THEN + ! reset IF (RAD_CONFIG%DO_SW) THEN - DO JAER = 1,YRERAD%NTSW - DO JLEV = 1,KLEV - DO JLON = KIDIA,KFDIA - AEROSOL%OD_SW(JAER,JLEV,JLON) = PAEROM7_TAU(JLON,JLEV,JAER) - AEROSOL%SSA_SW(JAER,JLEV,JLON) = PAEROM7_SSA(JLON,JLEV,JAER) - AEROSOL%G_SW(JAER,JLEV,JLON) = PAEROM7_ASYM(JLON,JLEV,JAER) - ENDDO - ENDDO - ENDDO + AEROSOL%OD_SW(1:YRERAD%NTSW,:,KIDIA:KFDIA) = 0.0_JPRB + AEROSOL%SSA_SW(1:YRERAD%NTSW,:,KIDIA:KFDIA) = 0.0_JPRB + AEROSOL%G_SW(1:YRERAD%NTSW,:,KIDIA:KFDIA) = 0.0_JPRB ENDIF IF (RAD_CONFIG%DO_LW) THEN - AEROSOL%OD_LW = REPSCAER ! Min value. FIXME TODO need update + AEROSOL%OD_LW(1:YRERAD%NTSW,:,KIDIA:KFDIA) = 0.0_JPRB ENDIF - ENDIF + + ! fill with M7 values -> + IF (YRERAD%NAEROOPT>0) THEN + IF (RAD_CONFIG%DO_SW) THEN + DO JAER = 1,YRERAD%NTSW + DO JLEV = 1,KLEV + DO JLON = KIDIA,KFDIA + AEROSOL%OD_SW(JAER,JLEV,JLON) = PAEROM7_TAU(JLON,JLEV,JAER) + AEROSOL%SSA_SW(JAER,JLEV,JLON) = PAEROM7_SSA(JLON,JLEV,JAER) + AEROSOL%G_SW(JAER,JLEV,JLON) = PAEROM7_ASYM(JLON,JLEV,JAER) + ENDDO + ENDDO + ENDDO + ENDIF + IF (RAD_CONFIG%DO_LW) THEN + AEROSOL%OD_LW = REPSCAER ! Min value. FIXME TODO need update + ENDIF + ENDIF + !ENDIF ENDIF ELSE @@ -650,8 +656,8 @@ SUBROUTINE RADIATION_SCHEME & CALL SET_GAS_UNITS(RAD_CONFIG, GAS) ! Call radiation scheme -CALL RADIATION(KLON, KLEV, KIDIA, KFDIA, RAD_CONFIG,& - & SINGLE_LEVEL, THERMODYNAMICS, GAS, YLCLOUD, AEROSOL, FLUX) +CALL RADIATION( KLON, KLEV, KIDIA, KFDIA, RAD_CONFIG, & + & SINGLE_LEVEL, THERMODYNAMICS, GAS, YLCLOUD, AEROSOL, FLUX) ! Check fluxes are within physical bounds IF (YRERAD%NDUMPBADINPUTS /= 0 & diff --git a/ifs-source/arpifs/phys_radi/radintg.F90 b/ifs-source/arpifs/phys_radi/radintg.F90 index 0f8ee4d3..040514e3 100644 --- a/ifs-source/arpifs/phys_radi/radintg.F90 +++ b/ifs-source/arpifs/phys_radi/radintg.F90 @@ -457,6 +457,7 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE, & ! ------------------------------------------------------------------ IF (LHOOK) CALL DR_HOOK('RADINTG',0,ZHOOK_HANDLE) + ASSOCIATE(& & YDDIM=>YDGEOMETRY%YRDIM,YDDIMV=>YDGEOMETRY%YRDIMV, & & YDGEM=>YDGEOMETRY%YRGEM, YDMP=>YDGEOMETRY%YRMP, & @@ -1995,8 +1996,6 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE, & ! OUTPUT LOOP -WRITE(NULOUT,'("RADINTG: AFTER OUTPUTS INTERPOLATION!")') - CALL GSTATS(1213,0) !$OMP PARALLEL DO SCHEDULE(STATIC) & !$OMP& PRIVATE(JSTGLO,JK,IBEG,IEND,IL,IB,JSW,& diff --git a/ifs-source/arpifs/phys_radi/suecrad.F90 b/ifs-source/arpifs/phys_radi/suecrad.F90 index e621030c..8e04e0e3 100644 --- a/ifs-source/arpifs/phys_radi/suecrad.F90 +++ b/ifs-source/arpifs/phys_radi/suecrad.F90 @@ -2113,7 +2113,6 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) ENDIF WRITE(UNIT=KULOUT,FMT='('' INBLW,NTSW,NSW SET EQUAL TO:'',3I3)') INBLW,NTSW,NSW - !-- routine specific to the UV processor IF (LUVPROC) THEN NUVTIM = NUVTIM * INT(RDAY) @@ -2124,23 +2123,20 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) !* 6. INITIALIZE AEROSOL OPTICAL PARAMETERS AND DISTRIBUTION ! ------------------------------------------------------ -!*** M7 -!write(*,*) "NPROMA",NPROMA -!write(*,*) "NFLEVG",NFLEVG -!write(*,*) "NTSW",NTSW -!write(*,*) "NGPBLKS",NGPBLKS -!write(*,*) "AERO_SCHEME",TRIM(AERO_SCHEME) - +! - 6.0. PARAMETERS FOR M7 AEROSOL +! IF (NACTAERO > 0) THEN - IF (TRIM(AERO_SCHEME) == "tm5m7" .or. TRIM(AERO_SCHEME) == "hamm7" ) THEN - ALLOCATE(YDAERM7%M7AOD(NPROMA, NFLEVG,NTSW,NGPBLKS)) - ALLOCATE(YDAERM7%M7SSA(NPROMA, NFLEVG,NTSW,NGPBLKS)) - ALLOCATE(YDAERM7%M7ASYM(NPROMA,NFLEVG,NTSW,NGPBLKS)) - ALLOCATE(YDAERM7%M7AODLW(NPROMA, NFLEVG,NTSW+2,NGPBLKS)) - YDAERM7%M7AOD(:,:,:,:) =0.0_JPRB - YDAERM7%M7SSA(:,:,:,:) =0.0_JPRB - YDAERM7%M7ASYM(:,:,:,:) =0.0_JPRB - YDAERM7%M7AODLW(:,:,:,:) =0.0_JPRB + IF (TRIM(AERO_SCHEME) == "tm5m7" .or. TRIM(AERO_SCHEME) == "hamm7" ) THEN + + ALLOCATE(YDAERM7%M7AOD( NPROMA, NFLEVG, NTSW, NGPBLKS)) + ALLOCATE(YDAERM7%M7SSA( NPROMA, NFLEVG, NTSW, NGPBLKS)) + ALLOCATE(YDAERM7%M7ASYM( NPROMA, NFLEVG, NTSW, NGPBLKS)) + ALLOCATE(YDAERM7%M7AODLW(NPROMA, NFLEVG, NTSW+2,NGPBLKS)) + ! RCHG -> be careful with this initializations in the case of parallel programming. + YDAERM7%M7AOD(:,:,:,:) = 0.0_JPRB + YDAERM7%M7SSA(:,:,:,:) = 0.0_JPRB + YDAERM7%M7ASYM(:,:,:,:) = 0.0_JPRB + YDAERM7%M7AODLW(:,:,:,:) = 0.0_JPRB ENDIF ENDIF ! - 6.1. PARAMETERS FOR THE STANDARD TEGEN AEROSOL CLIMATOLOGY diff --git a/ifs-source/arpifs/setup/su_surf_flds.F90 b/ifs-source/arpifs/setup/su_surf_flds.F90 index bd8e4e07..8cc22c7b 100644 --- a/ifs-source/arpifs/setup/su_surf_flds.F90 +++ b/ifs-source/arpifs/setup/su_surf_flds.F90 @@ -1120,16 +1120,16 @@ SUBROUTINE SU_SURF_FLDS(YDDIMV,YDSURF,YDMODEL,LDVERBOSE) ENDIF YSD_VF%YCHEMFLXO => YSD_VF%YVF(JPMAXSFLDS:JPMAXSFLDS) -YSD_VF%YCHEMDDFLX => YSD_VF%YVF(JPMAXSFLDS:JPMAXSFLDS) -YSD_VF%YCHEMWDFLX => YSD_VF%YVF(JPMAXSFLDS:JPMAXSFLDS) -YSD_VF%YCHEMDV => YSD_VF%YVF(JPMAXSFLDS:JPMAXSFLDS) -YSD_VF%YEMIS2D => YSD_VF%YVF(JPMAXSFLDS:JPMAXSFLDS) -YSD_VF%YEMIS2DAUX => YSD_VF%YVF(JPMAXSFLDS:JPMAXSFLDS) -YSD_VF%YCGPP => YSD_VF%YVF(JPMAXSFLDS) -YSD_VF%YCREC => YSD_VF%YVF(JPMAXSFLDS) -YSD_VF%YFP1 => YSD_VF%YVF(JPMAXSFLDS) -YSD_VF%YNUDM => YSD_VF%YVF(JPMAXSFLDS) -YSD_VF%YSSS => YSD_VF%YVF(JPMAXSFLDS) +YSD_VF%YCHEMDDFLX => YSD_VF%YVF(JPMAXSFLDS:JPMAXSFLDS) +YSD_VF%YCHEMWDFLX => YSD_VF%YVF(JPMAXSFLDS:JPMAXSFLDS) +YSD_VF%YCHEMDV => YSD_VF%YVF(JPMAXSFLDS:JPMAXSFLDS) +YSD_VF%YEMIS2D => YSD_VF%YVF(JPMAXSFLDS:JPMAXSFLDS) +YSD_VF%YEMIS2DAUX => YSD_VF%YVF(JPMAXSFLDS:JPMAXSFLDS) +YSD_VF%YCGPP => YSD_VF%YVF(JPMAXSFLDS) +YSD_VF%YCREC => YSD_VF%YVF(JPMAXSFLDS) +YSD_VF%YFP1 => YSD_VF%YVF(JPMAXSFLDS) +YSD_VF%YNUDM => YSD_VF%YVF(JPMAXSFLDS) +YSD_VF%YSSS => YSD_VF%YVF(JPMAXSFLDS) ! - set-up attributes for active fields: IF(LECMWF) THEN @@ -1299,7 +1299,6 @@ SUBROUTINE SU_SURF_FLDS(YDDIMV,YDSURF,YDMODEL,LDVERBOSE) CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YDSF,& & KGRIB=NGRBAERDSF,CDNAME='Dust source fctn',KTRAJ=2,KREQIN=IREQIN) - IF (LAERDUSTSIZEVAR) THEN IREQIN=1 ELSE @@ -1333,6 +1332,8 @@ SUBROUTINE SU_SURF_FLDS(YDDIMV,YDSURF,YDMODEL,LDVERBOSE) IREQIN=-1 !END IF CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YSOILTYPE, & + + ! RCHG -> Here I can't remember if the needed string length for CDNAME is 15 or 16. Be careful about last space. & KGRIB=NGRBSOILTYPE, CDNAME='TM5M7 soil type ',KTRAJ=2,KREQIN=IREQIN) END IF diff --git a/ifs-source/arpifs/setup/sudefo_gflattr.F90 b/ifs-source/arpifs/setup/sudefo_gflattr.F90 index 952d9c03..2df20956 100644 --- a/ifs-source/arpifs/setup/sudefo_gflattr.F90 +++ b/ifs-source/arpifs/setup/sudefo_gflattr.F90 @@ -3645,43 +3645,44 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) !YAERLISI_NL(JPAERLISI_1064,JPAERLISI_EXTD)%CNAME='DustExt1064' ! * Defaults for aerosol output fields -DO JGFL=1,JPAEROUT - YAEROUT_NL(JGFL)%LGP = .TRUE. - YAEROUT_NL(JGFL)%LSP = .FALSE. - YAEROUT_NL(JGFL)%NREQIN = 0 - YAEROUT_NL(JGFL)%LREQOUT= .TRUE. - YAEROUT_NL(JGFL)%LGPINGP= .TRUE. - YAEROUT_NL(JGFL)%LTRAJIO= .FALSE. - YAEROUT_NL(JGFL)%LDIAG = .FALSE. - YAEROUT_NL(JGFL)%LADV = .FALSE. - YAEROUT_NL(JGFL)%LCDERS = .FALSE. - YAEROUT_NL(JGFL)%LT9 = .FALSE. - YAEROUT_NL(JGFL)%LT1 = .FALSE. - YAEROUT_NL(JGFL)%LT5 = .FALSE. - YAEROUT_NL(JGFL)%LPT = .FALSE. - YAEROUT_NL(JGFL)%LPC = .FALSE. - YAEROUT_NL(JGFL)%CNAME = 'XXXXXXXXXXXXXXX' - YAEROUT_NL(JGFL)%NCOUPLING= 0 - YAEROUT_NL(JGFL)%LTDIABLIN=.FALSE. - YAEROUT_NL(JGFL)%LHORTURB =.FALSE. - YAEROUT_NL(JGFL)%LSLHD =.FALSE. - YAEROUT_NL(JGFL)%LCOMAD =.FALSE. - YAEROUT_NL(JGFL)%LVSPLIP =.FALSE. - YAEROUT_NL(JGFL)%LQM =.FALSE. - YAEROUT_NL(JGFL)%LQM3D =.FALSE. - YAEROUT_NL(JGFL)%LQML3D =.FALSE. - YAEROUT_NL(JGFL)%LQMH =.FALSE. - YAEROUT_NL(JGFL)%LHV =.FALSE. - YAEROUT_NL(JGFL)%LINTLIN =.FALSE. - YAEROUT_NL(JGFL)%LVWENO =.FALSE. +DO JGFL=1,JPAEROUT !RCHG -> It's a parameter with value 50 + YAEROUT_NL(JGFL)%LGP = .TRUE. + YAEROUT_NL(JGFL)%LSP = .FALSE. + YAEROUT_NL(JGFL)%NREQIN = 0 + YAEROUT_NL(JGFL)%LREQOUT = .TRUE. + YAEROUT_NL(JGFL)%LGPINGP = .TRUE. + YAEROUT_NL(JGFL)%LTRAJIO = .FALSE. + YAEROUT_NL(JGFL)%LDIAG = .FALSE. + YAEROUT_NL(JGFL)%LADV = .FALSE. + YAEROUT_NL(JGFL)%LCDERS = .FALSE. + YAEROUT_NL(JGFL)%LT9 = .FALSE. + YAEROUT_NL(JGFL)%LT1 = .FALSE. + YAEROUT_NL(JGFL)%LT5 = .FALSE. + YAEROUT_NL(JGFL)%LPT = .FALSE. + YAEROUT_NL(JGFL)%LPC = .FALSE. + YAEROUT_NL(JGFL)%CNAME = 'XXXXXXXXXXXXXXX' + YAEROUT_NL(JGFL)%NCOUPLING = 0 + YAEROUT_NL(JGFL)%LTDIABLIN = .FALSE. + YAEROUT_NL(JGFL)%LHORTURB = .FALSE. + YAEROUT_NL(JGFL)%LSLHD = .FALSE. + YAEROUT_NL(JGFL)%LCOMAD = .FALSE. + YAEROUT_NL(JGFL)%LVSPLIP = .FALSE. + YAEROUT_NL(JGFL)%LQM = .FALSE. + YAEROUT_NL(JGFL)%LQM3D = .FALSE. + YAEROUT_NL(JGFL)%LQML3D = .FALSE. + YAEROUT_NL(JGFL)%LQMH = .FALSE. + YAEROUT_NL(JGFL)%LHV = .FALSE. + YAEROUT_NL(JGFL)%LINTLIN = .FALSE. + YAEROUT_NL(JGFL)%LVWENO = .FALSE. YAEROUT_NL(JGFL)%WENO_ALPHA = 0.0_JPRB - YAEROUT_NL(JGFL)%LPHY =.FALSE. - YAEROUT_NL(JGFL)%LMASSFIX =.FALSE. - YAEROUT_NL(JGFL)%LNEGFIX =.FALSE. - YAEROUT_NL(JGFL)%LMGRID =.FALSE. - YAEROUT_NL(JGFL)%BETAMFBC = 1.0_JPRB + YAEROUT_NL(JGFL)%LPHY = .FALSE. + YAEROUT_NL(JGFL)%LMASSFIX = .FALSE. + YAEROUT_NL(JGFL)%LNEGFIX = .FALSE. + YAEROUT_NL(JGFL)%LMGRID = .FALSE. + YAEROUT_NL(JGFL)%BETAMFBC = 1.0_JPRB ENDDO +! RCHG -> Is this general or added by M7? YAEROUT_NL(1)%IGRBCODE=210022 YAEROUT_NL(2)%IGRBCODE=210025 diff --git a/ifs-source/arpifs/setup/sugfl2.F90 b/ifs-source/arpifs/setup/sugfl2.F90 index 84b50b88..3ab8ea88 100644 --- a/ifs-source/arpifs/setup/sugfl2.F90 +++ b/ifs-source/arpifs/setup/sugfl2.F90 @@ -782,24 +782,22 @@ SUBROUTINE SUGFL2(YDEPHY,YDML_GCONF,YDCOMPO) IF (YCDNC_NL%LGP) THEN IGFLPTR=NUMFLDS+1 YGFL%YCDNC=>YGFL%YCOMP(IGFLPTR) - CALL DEFINE_GFL_COMP(YGFL,YDCOMP=YGFL%YCDNC,CDNAME=YCDNC_NL%CNAME,& - & KGRIB=YCDNC_NL%IGRBCODE,LDGP=.TRUE., & - & KREQIN=YCDNC_NL%NREQIN,& - & PREFVALI=YCDNC_NL%REFVALI,LDREQOUT=YCDNC_NL%LREQOUT,& -! & LDERS=.FALSE.,LD5=.FALSE.,LDT1=LLT1,LDDIFF=.FALSE.,LDCONV=.FALSE., & - & LDERS=.FALSE.,LD5=.FALSE.,LDT1=.FALSE.,LDDIFF=.FALSE.,LDCONV=.FALSE., & - & LDMASSFIX=.FALSE.) + CALL DEFINE_GFL_COMP(YGFL, YDCOMP=YGFL%YCDNC, CDNAME=YCDNC_NL%CNAME, & + & KGRIB=YCDNC_NL%IGRBCODE, LDGP=.TRUE., & + & KREQIN=YCDNC_NL%NREQIN, & + & PREFVALI=YCDNC_NL%REFVALI,LDREQOUT=YCDNC_NL%LREQOUT, & + & LDERS=.FALSE.,LD5=.FALSE.,LDT1=.FALSE.,LDDIFF=.FALSE.,& + & LDCONV=.FALSE., LDMASSFIX=.FALSE.) END IF IF (YICNC_NL%LGP) THEN IGFLPTR=NUMFLDS+1 YGFL%YICNC=>YGFL%YCOMP(IGFLPTR) - CALL DEFINE_GFL_COMP(YGFL,YDCOMP=YGFL%YICNC,CDNAME=YICNC_NL%CNAME,& - & KGRIB=YICNC_NL%IGRBCODE,LDGP=.TRUE., & - & KREQIN=YICNC_NL%NREQIN,& - & PREFVALI=YICNC_NL%REFVALI,LDREQOUT=YICNC_NL%LREQOUT,& -! & LDERS=.FALSE.,LD5=.FALSE.,LDT1=LLT1,LDDIFF=.FALSE.,LDCONV=.FALSE., & - & LDERS=.FALSE.,LD5=.FALSE.,LDT1=.FALSE.,LDDIFF=.FALSE.,LDCONV=.FALSE., & - & LDMASSFIX=.FALSE.) + CALL DEFINE_GFL_COMP(YGFL, YDCOMP=YGFL%YICNC, CDNAME=YICNC_NL%CNAME, & + & KGRIB=YICNC_NL%IGRBCODE, LDGP=.TRUE., & + & KREQIN=YICNC_NL%NREQIN, & + & PREFVALI=YICNC_NL%REFVALI, LDREQOUT=YICNC_NL%LREQOUT, & + & LDERS=.FALSE.,LD5=.FALSE.,LDT1=.FALSE.,LDDIFF=.FALSE.,& + & LDCONV=.FALSE., LDMASSFIX=.FALSE.) END IF IF (YRE_LIQ_NL%LGP) THEN IGFLPTR=NUMFLDS+1 diff --git a/ifs-source/arpifs/setup/sumcclag.F90 b/ifs-source/arpifs/setup/sumcclag.F90 index 74a24cb1..e6c414ed 100644 --- a/ifs-source/arpifs/setup/sumcclag.F90 +++ b/ifs-source/arpifs/setup/sumcclag.F90 @@ -103,32 +103,35 @@ SUBROUTINE SUMCCLAG(YDGEM,YDML_GCONF,YDML_AOC,YDCOMPO,YDCHEM,YDEAERSRC,YDEPHY,KU #include "su_coup_com.intfb.h" IF (LHOOK) CALL DR_HOOK('SUMCCLAG',0,ZHOOK_HANDLE) -ASSOCIATE(NACTAERO=>YDML_GCONF%YGFL%NACTAERO, NCHEM=>YDML_GCONF%YGFL%NCHEM, YCHEM=>YDML_GCONF%YGFL%YCHEM, & - & NGHG=>YDML_GCONF%YGFL%NGHG, LAERCHEM=>YDML_GCONF%YGFL%LAERCHEM, & - & NEMIS2D_DESC=>YDCOMPO%NEMIS2D_DESC, YEMIS2D_DESC=>YDCOMPO%YEMIS2D_DESC, & - & NEMIS2D=>YDML_GCONF%YGFL%NEMIS2D, & - & NEMIS2DAUX=>YDML_GCONF%YGFL%NEMIS2DAUX, YEMIS2DAUX_DESC=>YDCOMPO%YEMIS2DAUX_DESC, & - & AERO_SCHEME=>YDCOMPO%AERO_SCHEME, & - & NDMSO=>YDEAERSRC%NDMSO, LOCNDMS=>YDEAERSRC%LOCNDMS, & - & NALBEDOSCHEME=>YDEPHY%NALBEDOSCHEME, LECURR=>YDEPHY%LECURR, & - & NGPTOT=>YDGEM%NGPTOT, & - & LMCC03=>YDML_AOC%YRMCC%LMCC03, & - & LMCC04=>YDML_AOC%YRMCC%LMCC04, LMCC05=>YDML_AOC%YRMCC%LMCC05, LMCCEC=>YDML_AOC%YRMCC%LMCCEC, & - & LMCCIEC=>YDML_AOC%YRMCC%LMCCIEC, LMCCIEC_COMPO=>YDML_AOC%YRMCC%LMCCIEC_COMPO, & - & LMCC_COMPO=>YDML_AOC%YRMCC%LMCC_COMPO, LNEMO1WAY=>YDML_AOC%YRMCC%LNEMO1WAY, & - & LNEMOCOUP=>YDML_AOC%YRMCC%LNEMOCOUP, LNEMOLIMGET=>YDML_AOC%YRMCC%LNEMOLIMGET, & - & LNEMOLIMPUT=>YDML_AOC%YRMCC%LNEMOLIMPUT, NCLIGC=>YDML_AOC%YRMCC%NCLIGC, & - & NCLIGC_COMPO=>YDML_AOC%YRMCC%NCLIGC_COMPO,NYSDMP_COMPO=>YDML_AOC%YRMCC%NYSDMP_COMPO, NCLIMR=>YDML_AOC%YRMCC%NCLIMR, & - & NCLIMR_COMPO=>YDML_AOC%YRMCC%NCLIMR_COMPO, NCLIMTOT=>YDML_AOC%YRMCC%NCLIMTOT, & - & NDIFC=>YDML_AOC%YRMCC%NDIFC, NDIFC_COMPO=>YDML_AOC%YRMCC%NDIFC_COMPO, NFRCPL=>YDML_AOC%YRMCC%NFRCPL, & - & NJDCR=>YDML_AOC%YRMCC%NJDCR, NJDCR1=>YDML_AOC%YRMCC%NJDCR1, NJDCR1_COMPO=>YDML_AOC%YRMCC%NJDCR1_COMPO, & - & NJDCR_COMPO=>YDML_AOC%YRMCC%NJDCR_COMPO, NOACOMM=>YDML_AOC%YRMCC%NOACOMM, NP1=>YDML_AOC%YRMCC%NP1, & - & NP2=>YDML_AOC%YRMCC%NP2, NPCOMPO_1=>YDML_AOC%YRMCC%NPCOMPO_1, NPCOMPO_2=>YDML_AOC%YRMCC%NPCOMPO_2, & - & NSTOP=>YDML_GCONF%YRRIP%NSTOP, TSTEP=>YDML_GCONF%YRRIP%TSTEP,& - & NPCO2_1=>YDML_AOC%YRMCC%NPCO2_1, NPCO2_2=>YDML_AOC%YRMCC%NPCO2_2, LEOCLAKE=>YDEPHY%LEOCLAKE, & - & LEOBC=>YDEPHY%LEOBC, LEOBCICE=>YDEPHY%LEOBCICE, & - & KCHEM_DRYDEP=>YDCHEM%KCHEM_DRYDEP, & - & LNEEONLINE=>YDEPHY%LNEEONLINE, YDCOM=>YDML_AOC%YRCOM, YDMCC=>YDML_AOC%YRMCC) +ASSOCIATE(& + & NACTAERO => YDML_GCONF%YGFL%NACTAERO, NCHEM => YDML_GCONF%YGFL%NCHEM, & + & YCHEM => YDML_GCONF%YGFL%YCHEM, NGHG => YDML_GCONF%YGFL%NGHG, & + & LAERCHEM => YDML_GCONF%YGFL%LAERCHEM, NEMIS2D_DESC => YDCOMPO%NEMIS2D_DESC, & + & YEMIS2D_DESC => YDCOMPO%YEMIS2D_DESC, NEMIS2D => YDML_GCONF%YGFL%NEMIS2D, & + & NEMIS2DAUX => YDML_GCONF%YGFL%NEMIS2DAUX, YEMIS2DAUX_DESC => YDCOMPO%YEMIS2DAUX_DESC, & + & AERO_SCHEME => YDCOMPO%AERO_SCHEME, NDMSO => YDEAERSRC%NDMSO, & + & LOCNDMS => YDEAERSRC%LOCNDMS, NALBEDOSCHEME => YDEPHY%NALBEDOSCHEME, & + & LECURR => YDEPHY%LECURR, NGPTOT => YDGEM%NGPTOT, & + & LMCC03 => YDML_AOC%YRMCC%LMCC03, LMCC04 => YDML_AOC%YRMCC%LMCC04, & + & LMCC05 => YDML_AOC%YRMCC%LMCC05, LMCCEC => YDML_AOC%YRMCC%LMCCEC, & + & LMCCIEC => YDML_AOC%YRMCC%LMCCIEC, LMCCIEC_COMPO => YDML_AOC%YRMCC%LMCCIEC_COMPO, & + & LMCC_COMPO => YDML_AOC%YRMCC%LMCC_COMPO, LNEMO1WAY => YDML_AOC%YRMCC%LNEMO1WAY, & + & LNEMOCOUP => YDML_AOC%YRMCC%LNEMOCOUP, LNEMOLIMGET => YDML_AOC%YRMCC%LNEMOLIMGET, & + & LNEMOLIMPUT => YDML_AOC%YRMCC%LNEMOLIMPUT, NCLIGC => YDML_AOC%YRMCC%NCLIGC, & + & NCLIGC_COMPO => YDML_AOC%YRMCC%NCLIGC_COMPO, NYSDMP_COMPO => YDML_AOC%YRMCC%NYSDMP_COMPO, & + & NCLIMR => YDML_AOC%YRMCC%NCLIMR, NCLIMR_COMPO => YDML_AOC%YRMCC%NCLIMR_COMPO, & + & NCLIMTOT => YDML_AOC%YRMCC%NCLIMTOT, NDIFC => YDML_AOC%YRMCC%NDIFC, & + & NDIFC_COMPO => YDML_AOC%YRMCC%NDIFC_COMPO, NFRCPL => YDML_AOC%YRMCC%NFRCPL, & + & NJDCR => YDML_AOC%YRMCC%NJDCR, NJDCR1 => YDML_AOC%YRMCC%NJDCR1, & + & NJDCR1_COMPO => YDML_AOC%YRMCC%NJDCR1_COMPO, NJDCR_COMPO => YDML_AOC%YRMCC%NJDCR_COMPO, & + & NOACOMM => YDML_AOC%YRMCC%NOACOMM, NP1 => YDML_AOC%YRMCC%NP1, & + & NP2 => YDML_AOC%YRMCC%NP2, NPCOMPO_1 => YDML_AOC%YRMCC%NPCOMPO_1, & + & NPCOMPO_2 => YDML_AOC%YRMCC%NPCOMPO_2, NSTOP => YDML_GCONF%YRRIP%NSTOP, & + & TSTEP => YDML_GCONF%YRRIP%TSTEP, NPCO2_1 => YDML_AOC%YRMCC%NPCO2_1, & + & NPCO2_2 => YDML_AOC%YRMCC%NPCO2_2, LEOCLAKE => YDEPHY%LEOCLAKE, & + & LEOBC => YDEPHY%LEOBC, LEOBCICE => YDEPHY%LEOBCICE, & + & KCHEM_DRYDEP => YDCHEM%KCHEM_DRYDEP, LNEEONLINE => YDEPHY%LNEEONLINE, & + & YDCOM => YDML_AOC%YRCOM, YDMCC => YDML_AOC%YRMCC) ! ---------------------------------------------------------------- !* 1. CALCULATIONS. @@ -380,6 +383,7 @@ SUBROUTINE SUMCCLAG(YDGEM,YDML_GCONF,YDML_AOC,YDCOMPO,YDCHEM,YDEAERSRC,YDEPHY,KU NCLIMR_COMPO=0 IC=0 + ! Species in NCLIMR_COMPO are added in an specific order, the order of YDSURF derived type. DO IT=1,NEMIS2D IF ( ANY( YEMIS2D_DESC(1:NEMIS2D_DESC)%PARAM_INDEX==IT .AND. & & YEMIS2D_DESC(1:NEMIS2D_DESC)%TEMPORALITY /= "Constant" ) ) THEN diff --git a/ifs-source/radiation/module/radiation_ifs_rrtm.F90 b/ifs-source/radiation/module/radiation_ifs_rrtm.F90 index 4a352d86..fd4f7570 100644 --- a/ifs-source/radiation/module/radiation_ifs_rrtm.F90 +++ b/ifs-source/radiation/module/radiation_ifs_rrtm.F90 @@ -364,6 +364,7 @@ subroutine gas_optics(ncol,nlev,istartcol,iendcol, & ! Check we have gas mixing ratios in the right units call gas%assert_units(IMassMixingRatio) + CALL RRTM_PREPARE_GASES & & ( istartcol, iendcol, ncol, nlev, & & thermodynamics%pressure_hl(:,istartlev:iendlev+1), & From e73aa976b04a90447baad29b8ade520b56153fc6 Mon Sep 17 00:00:00 2001 From: Ramiro Checa Garcia Date: Thu, 18 Jul 2024 12:06:03 +0000 Subject: [PATCH 023/129] Pull request #11: Move M7 code into its own dir OIFS-524 Merge in ~NM6/openifs-48r1 from ~NLD5163/openifs-48r1:rchg/knmi-m7-dev to knmi-m7 Squashed commit of the following: commit 0b78a0e63cfae21bccf4075878de4d3bf62f01e3 Author: Ramiro Checa-Garcia Date: Thu Jul 18 07:49:20 2024 +0000 Just second step of removing files for the staged area commit 05e3a8f96d83b6f652d8e53802eaf7abfb855fee Author: Ramiro Checa-Garcia Date: Thu Jul 18 07:42:19 2024 +0000 Moved m7 related source files into dir. m7 When possible the hierachical structure is preserved so subdirectories phys_ec, module, chem were created. Note 1: mo_ham_m7.F90 and mo_ham_m7_nucl.F90 has been moved to modules but another natural direc. is phys_ec as they have subroutines for physical modelling. Note 2: There is a file that describe namelist for clt that is left in the path arpifs/namelist/ Note 3: The file ifs-source/arpifs/m7/module/yomm7ctl.F90 probably could be left in ifs-source/arpfis/module as it is related to the namelist for m7clt. We moved because it can be easier to have there during the development process. commit 19f68d213594f447bb8846edf882c964bc4f452b Author: Ramiro Checa-Garcia Date: Wed Jul 10 14:34:46 2024 +0000 added chantes in cmake to ensure arpifs/m7 is included in the pre-processing commit cf8e4d76f31ddaa02625de42cb7c3ac3161ed3c3 Author: Ramiro Checa-Garcia Date: Wed Jul 10 13:40:50 2024 +0000 Ensure that files moved files are also removed from stash area (git add -u) commit 049c37bebff736785ec9348188d11d60ccd529e1 Author: Ramiro Checa-Garcia Date: Wed Jul 10 13:38:40 2024 +0000 Set of subroutines and modules needed for CNT4.F90 initialization as a complete set moved to m7 (and modules to m7/module) --- ifs-source/arpifs/control/cnt4.F90 | 8 -- .../arpifs/{ => m7}/chem/tm5_wetchem_m7.F90 | 0 .../arpifs/{phys_ec => m7}/hamm7_init.F90 | 0 ifs-source/arpifs/{ => m7}/module/m7_data.F90 | 0 .../{phys_ec => m7/module}/mo_activ.F90 | 0 .../{phys_ec => m7/module}/mo_advection.F90 | 0 .../{phys_ec => m7/module}/mo_control.F90 | 0 .../{phys_ec => m7/module}/mo_exception.F90 | 0 .../{phys_ec => m7/module}/mo_filename.F90 | 0 .../arpifs/{phys_ec => m7/module}/mo_ham.F90 | 0 .../{phys_ec => m7/module}/mo_ham_init.F90 | 0 .../{phys_ec => m7/module}/mo_ham_kappa.F90 | 0 .../{phys_ec => m7/module}/mo_ham_m7.F90 | 6 +- .../{phys_ec => m7/module}/mo_ham_m7_nucl.F90 | 0 .../{phys_ec => m7/module}/mo_ham_m7_trac.F90 | 0 .../{phys_ec => m7/module}/mo_ham_m7ctl.F90 | 0 .../{phys_ec => m7/module}/mo_ham_rad.F90 | 0 .../module}/mo_ham_sedimentation.F90 | 0 .../{phys_ec => m7/module}/mo_ham_soa.F90 | 1 + .../module}/mo_ham_subm_species.F90 | 0 .../module}/mo_ham_wetdep_data.F90 | 0 .../{phys_ec => m7/module}/mo_io_units.F90 | 0 .../arpifs/{phys_ec => m7/module}/mo_kind.F90 | 0 .../module}/mo_math_constants.F90 | 0 .../{phys_ec => m7/module}/mo_namelist.F90 | 0 .../{phys_ec => m7/module}/mo_netcdf.F90 | 0 .../module}/mo_param_switches.F90 | 0 .../module}/mo_physical_constants.F90 | 0 .../module}/mo_radiation_parameters.F90 | 0 .../module}/mo_read_netcdf77.F90 | 0 .../{phys_ec => m7/module}/mo_species.F90 | 0 .../{phys_ec => m7/module}/mo_submodel.F90 | 0 .../module}/mo_time_control.F90 | 0 .../{phys_ec => m7/module}/mo_tracdef.F90 | 0 .../{phys_ec => m7/module}/mo_tracer.F90 | 0 .../{phys_ec => m7/module}/mo_util_string.F90 | 0 .../module/oifs_to_ham.F90} | 0 .../arpifs/{ => m7}/module/tm5m7_data.F90 | 0 .../{ => m7}/module/tm5m7_emis_data.F90 | 0 .../{ => m7}/module/tm5m7_optics_data.F90 | 0 .../arpifs/{ => m7}/module/yomm7ctl.F90 | 4 + .../{ => m7}/phys_ec/hamm7_interface.F90 | 6 +- ifs-source/arpifs/{ => m7}/phys_ec/m7.F90 | 2 + .../phys_ec/m7_simple_sulfur_drydep.F90 | 0 .../arpifs/{ => m7}/phys_ec/tm5m7_drydep.F90 | 0 .../{ => m7}/phys_ec/tm5m7_get_refr_idx.F90 | 0 .../{ => m7}/phys_ec/tm5m7_optics_aop_get.F90 | 0 .../phys_ec/tm5m7_optics_calculate_aop.F90 | 0 .../{ => m7}/phys_ec/tm5m7_optics_get.F90 | 0 .../{ => m7}/phys_ec/tm5m7_optics_init.F90 | 0 .../arpifs/{ => m7}/phys_ec/tm5m7_phy2.F90 | 0 .../{ => m7}/phys_ec/tm5m7_sediment.F90 | 0 .../arpifs/{ => m7}/phys_ec/tm5m7_src.F90 | 0 .../{ => m7}/phys_ec/tm5m7_src_dust.F90 | 0 .../{ => m7}/phys_ec/tm5m7_src_dust_init.F90 | 0 .../arpifs/{ => m7}/phys_ec/tm5m7_src_ss.F90 | 0 .../arpifs/{phys_ec => m7}/tm5m7_init.F90 | 55 ++++++----- ifs-source/arpifs/module/parfpos.F90 | 4 + ifs-source/arpifs/module/yoeaerop.F90 | 1 + ifs-source/arpifs/setup/sudefo_gflattr.F90 | 91 ++++++++++--------- ifs-source/cmake/intfb.cmake | 1 + oifs-config.nld5163.sh | 2 +- 62 files changed, 98 insertions(+), 83 deletions(-) rename ifs-source/arpifs/{ => m7}/chem/tm5_wetchem_m7.F90 (100%) rename ifs-source/arpifs/{phys_ec => m7}/hamm7_init.F90 (100%) rename ifs-source/arpifs/{ => m7}/module/m7_data.F90 (100%) rename ifs-source/arpifs/{phys_ec => m7/module}/mo_activ.F90 (100%) rename ifs-source/arpifs/{phys_ec => m7/module}/mo_advection.F90 (100%) rename ifs-source/arpifs/{phys_ec => m7/module}/mo_control.F90 (100%) rename ifs-source/arpifs/{phys_ec => m7/module}/mo_exception.F90 (100%) rename ifs-source/arpifs/{phys_ec => m7/module}/mo_filename.F90 (100%) rename ifs-source/arpifs/{phys_ec => m7/module}/mo_ham.F90 (100%) rename ifs-source/arpifs/{phys_ec => m7/module}/mo_ham_init.F90 (100%) rename ifs-source/arpifs/{phys_ec => m7/module}/mo_ham_kappa.F90 (100%) rename ifs-source/arpifs/{phys_ec => m7/module}/mo_ham_m7.F90 (99%) rename ifs-source/arpifs/{phys_ec => m7/module}/mo_ham_m7_nucl.F90 (100%) rename ifs-source/arpifs/{phys_ec => m7/module}/mo_ham_m7_trac.F90 (100%) rename ifs-source/arpifs/{phys_ec => m7/module}/mo_ham_m7ctl.F90 (100%) rename ifs-source/arpifs/{phys_ec => m7/module}/mo_ham_rad.F90 (100%) rename ifs-source/arpifs/{phys_ec => m7/module}/mo_ham_sedimentation.F90 (100%) rename ifs-source/arpifs/{phys_ec => m7/module}/mo_ham_soa.F90 (99%) rename ifs-source/arpifs/{phys_ec => m7/module}/mo_ham_subm_species.F90 (100%) rename ifs-source/arpifs/{phys_ec => m7/module}/mo_ham_wetdep_data.F90 (100%) rename ifs-source/arpifs/{phys_ec => m7/module}/mo_io_units.F90 (100%) rename ifs-source/arpifs/{phys_ec => m7/module}/mo_kind.F90 (100%) rename ifs-source/arpifs/{phys_ec => m7/module}/mo_math_constants.F90 (100%) rename ifs-source/arpifs/{phys_ec => m7/module}/mo_namelist.F90 (100%) rename ifs-source/arpifs/{phys_ec => m7/module}/mo_netcdf.F90 (100%) rename ifs-source/arpifs/{phys_ec => m7/module}/mo_param_switches.F90 (100%) rename ifs-source/arpifs/{phys_ec => m7/module}/mo_physical_constants.F90 (100%) rename ifs-source/arpifs/{phys_ec => m7/module}/mo_radiation_parameters.F90 (100%) rename ifs-source/arpifs/{phys_ec => m7/module}/mo_read_netcdf77.F90 (100%) rename ifs-source/arpifs/{phys_ec => m7/module}/mo_species.F90 (100%) rename ifs-source/arpifs/{phys_ec => m7/module}/mo_submodel.F90 (100%) rename ifs-source/arpifs/{phys_ec => m7/module}/mo_time_control.F90 (100%) rename ifs-source/arpifs/{phys_ec => m7/module}/mo_tracdef.F90 (100%) rename ifs-source/arpifs/{phys_ec => m7/module}/mo_tracer.F90 (100%) rename ifs-source/arpifs/{phys_ec => m7/module}/mo_util_string.F90 (100%) rename ifs-source/arpifs/{phys_ec/OIFS_to_HAM.F90 => m7/module/oifs_to_ham.F90} (100%) rename ifs-source/arpifs/{ => m7}/module/tm5m7_data.F90 (100%) rename ifs-source/arpifs/{ => m7}/module/tm5m7_emis_data.F90 (100%) rename ifs-source/arpifs/{ => m7}/module/tm5m7_optics_data.F90 (100%) rename ifs-source/arpifs/{ => m7}/module/yomm7ctl.F90 (86%) rename ifs-source/arpifs/{ => m7}/phys_ec/hamm7_interface.F90 (99%) rename ifs-source/arpifs/{ => m7}/phys_ec/m7.F90 (98%) rename ifs-source/arpifs/{ => m7}/phys_ec/m7_simple_sulfur_drydep.F90 (100%) rename ifs-source/arpifs/{ => m7}/phys_ec/tm5m7_drydep.F90 (100%) rename ifs-source/arpifs/{ => m7}/phys_ec/tm5m7_get_refr_idx.F90 (100%) rename ifs-source/arpifs/{ => m7}/phys_ec/tm5m7_optics_aop_get.F90 (100%) rename ifs-source/arpifs/{ => m7}/phys_ec/tm5m7_optics_calculate_aop.F90 (100%) rename ifs-source/arpifs/{ => m7}/phys_ec/tm5m7_optics_get.F90 (100%) rename ifs-source/arpifs/{ => m7}/phys_ec/tm5m7_optics_init.F90 (100%) rename ifs-source/arpifs/{ => m7}/phys_ec/tm5m7_phy2.F90 (100%) rename ifs-source/arpifs/{ => m7}/phys_ec/tm5m7_sediment.F90 (100%) rename ifs-source/arpifs/{ => m7}/phys_ec/tm5m7_src.F90 (100%) rename ifs-source/arpifs/{ => m7}/phys_ec/tm5m7_src_dust.F90 (100%) rename ifs-source/arpifs/{ => m7}/phys_ec/tm5m7_src_dust_init.F90 (100%) rename ifs-source/arpifs/{ => m7}/phys_ec/tm5m7_src_ss.F90 (100%) rename ifs-source/arpifs/{phys_ec => m7}/tm5m7_init.F90 (84%) diff --git a/ifs-source/arpifs/control/cnt4.F90 b/ifs-source/arpifs/control/cnt4.F90 index 849322ac..f6fbbb9e 100644 --- a/ifs-source/arpifs/control/cnt4.F90 +++ b/ifs-source/arpifs/control/cnt4.F90 @@ -254,11 +254,6 @@ SUBROUTINE CNT4(YDGEOMETRY,YDFIELDS,YDMTRAJ,YDMODEL,YDJOT,YDVARBC,YDTCV,YDGOM5,Y #include "abor1.intfb.h" #include "save_merr_tend.intfb.h" - - - - - #include "cormass2.intfb.h" #include "cormass3b.intfb.h" #include "cormassdry.intfb.h" @@ -298,9 +293,6 @@ SUBROUTINE CNT4(YDGEOMETRY,YDFIELDS,YDMTRAJ,YDMODEL,YDJOT,YDVARBC,YDTCV,YDGOM5,Y #include "tm5m7_init.intfb.h"!m7 #include "hamm7_init.intfb.h"!m7 - - - #include "chem_massdia.intfb.h" #include "couplnemo.intfb.h" #include "updnemoocean.intfb.h" diff --git a/ifs-source/arpifs/chem/tm5_wetchem_m7.F90 b/ifs-source/arpifs/m7/chem/tm5_wetchem_m7.F90 similarity index 100% rename from ifs-source/arpifs/chem/tm5_wetchem_m7.F90 rename to ifs-source/arpifs/m7/chem/tm5_wetchem_m7.F90 diff --git a/ifs-source/arpifs/phys_ec/hamm7_init.F90 b/ifs-source/arpifs/m7/hamm7_init.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/hamm7_init.F90 rename to ifs-source/arpifs/m7/hamm7_init.F90 diff --git a/ifs-source/arpifs/module/m7_data.F90 b/ifs-source/arpifs/m7/module/m7_data.F90 similarity index 100% rename from ifs-source/arpifs/module/m7_data.F90 rename to ifs-source/arpifs/m7/module/m7_data.F90 diff --git a/ifs-source/arpifs/phys_ec/mo_activ.F90 b/ifs-source/arpifs/m7/module/mo_activ.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/mo_activ.F90 rename to ifs-source/arpifs/m7/module/mo_activ.F90 diff --git a/ifs-source/arpifs/phys_ec/mo_advection.F90 b/ifs-source/arpifs/m7/module/mo_advection.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/mo_advection.F90 rename to ifs-source/arpifs/m7/module/mo_advection.F90 diff --git a/ifs-source/arpifs/phys_ec/mo_control.F90 b/ifs-source/arpifs/m7/module/mo_control.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/mo_control.F90 rename to ifs-source/arpifs/m7/module/mo_control.F90 diff --git a/ifs-source/arpifs/phys_ec/mo_exception.F90 b/ifs-source/arpifs/m7/module/mo_exception.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/mo_exception.F90 rename to ifs-source/arpifs/m7/module/mo_exception.F90 diff --git a/ifs-source/arpifs/phys_ec/mo_filename.F90 b/ifs-source/arpifs/m7/module/mo_filename.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/mo_filename.F90 rename to ifs-source/arpifs/m7/module/mo_filename.F90 diff --git a/ifs-source/arpifs/phys_ec/mo_ham.F90 b/ifs-source/arpifs/m7/module/mo_ham.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/mo_ham.F90 rename to ifs-source/arpifs/m7/module/mo_ham.F90 diff --git a/ifs-source/arpifs/phys_ec/mo_ham_init.F90 b/ifs-source/arpifs/m7/module/mo_ham_init.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/mo_ham_init.F90 rename to ifs-source/arpifs/m7/module/mo_ham_init.F90 diff --git a/ifs-source/arpifs/phys_ec/mo_ham_kappa.F90 b/ifs-source/arpifs/m7/module/mo_ham_kappa.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/mo_ham_kappa.F90 rename to ifs-source/arpifs/m7/module/mo_ham_kappa.F90 diff --git a/ifs-source/arpifs/phys_ec/mo_ham_m7.F90 b/ifs-source/arpifs/m7/module/mo_ham_m7.F90 similarity index 99% rename from ifs-source/arpifs/phys_ec/mo_ham_m7.F90 rename to ifs-source/arpifs/m7/module/mo_ham_m7.F90 index ad05cd42..14e768df 100644 --- a/ifs-source/arpifs/phys_ec/mo_ham_m7.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_m7.F90 @@ -449,7 +449,7 @@ SUBROUTINE m7(kproma, kbdim, klev, krow, & REAL(dp):: paerml(kbdim,klev,naerocomp), & ! aerosol mass for individual compounds [molec. cm-3 for sulfate and ug m-3 for bc, oc, ss, and dust] paernl(kbdim,klev,nclass), & ! aerosol number for each mode [cm-3] pm6rp(kbdim,klev,nclass), & ! mean mode actual radius (wet for soluble and dry for insoluble modes) [cm] - pm6dry(kbdim,klev,nsol), & ! dry radius for soluble modes [cm] + pm6dry(kbdim,klev,nsol), & ! dry radius for soluble modes [cm] prhop(kbdim,klev,nclass), & ! mean mode particle density [g cm-3] pww(kbdim,klev,nclass) ! aerosol water content for each mode [kg(water) m-3(air)] @@ -466,9 +466,9 @@ SUBROUTINE m7(kproma, kbdim, klev, krow, & REAL(dp):: zso4_6(kbdim,klev) ! mode x [molec. cm-3] (calculated in m7_prod_cond, REAL(dp):: zso4_7(kbdim,klev) ! used in m7_concoag) - REAL(dp):: zttn(kbdim,klev,naerocomp) ! average mass for single compound in each mode [in molec. for sulfate and in ug for bc, oc, ss, and dust] + REAL(dp):: zttn(kbdim,klev,naerocomp) ! average mass for single compound in each mode [in molec. for sulfate and in ug for bc, oc, ss, and dust] REAL(dp):: zcs(kbdim,klev) ! H2SO4 condensation sink of the aerosol population [s-1] - REAL(dp):: zcsi(kbdim,klev,nclass) ! H2SO4 condensation sink of the individual aerosol modes [s-1] + REAL(dp):: zcsi(kbdim,klev,nclass) ! H2SO4 condensation sink of the individual aerosol modes [s-1] REAL(dp):: zanew(kbdim,klev) ! Number of nucleated particles [cm-3] over one timstep REAL(dp):: za4delt(kbdim,klev,naerocomp) ! Change in H2SO4 contents [cm-3] of the aerosol modes over one timstep REAL(dp):: zout3(kbdim,klev,2*(naerocomp+nclass)) diff --git a/ifs-source/arpifs/phys_ec/mo_ham_m7_nucl.F90 b/ifs-source/arpifs/m7/module/mo_ham_m7_nucl.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/mo_ham_m7_nucl.F90 rename to ifs-source/arpifs/m7/module/mo_ham_m7_nucl.F90 diff --git a/ifs-source/arpifs/phys_ec/mo_ham_m7_trac.F90 b/ifs-source/arpifs/m7/module/mo_ham_m7_trac.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/mo_ham_m7_trac.F90 rename to ifs-source/arpifs/m7/module/mo_ham_m7_trac.F90 diff --git a/ifs-source/arpifs/phys_ec/mo_ham_m7ctl.F90 b/ifs-source/arpifs/m7/module/mo_ham_m7ctl.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/mo_ham_m7ctl.F90 rename to ifs-source/arpifs/m7/module/mo_ham_m7ctl.F90 diff --git a/ifs-source/arpifs/phys_ec/mo_ham_rad.F90 b/ifs-source/arpifs/m7/module/mo_ham_rad.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/mo_ham_rad.F90 rename to ifs-source/arpifs/m7/module/mo_ham_rad.F90 diff --git a/ifs-source/arpifs/phys_ec/mo_ham_sedimentation.F90 b/ifs-source/arpifs/m7/module/mo_ham_sedimentation.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/mo_ham_sedimentation.F90 rename to ifs-source/arpifs/m7/module/mo_ham_sedimentation.F90 diff --git a/ifs-source/arpifs/phys_ec/mo_ham_soa.F90 b/ifs-source/arpifs/m7/module/mo_ham_soa.F90 similarity index 99% rename from ifs-source/arpifs/phys_ec/mo_ham_soa.F90 rename to ifs-source/arpifs/m7/module/mo_ham_soa.F90 index 1bd4ae25..981ade4a 100644 --- a/ifs-source/arpifs/phys_ec/mo_ham_soa.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_soa.F90 @@ -656,6 +656,7 @@ SUBROUTINE construct_soa_streams ! Declan O'Donnell, MPI-M, 2007 !---inherited types, functions and data --- + USE mo_memory_base, ONLY: new_stream, default_stream_setting, add_stream_element, add_stream_reference USE mo_linked_list, ONLY: t_stream, SURFACE USE mo_filename, ONLY: trac_filetype diff --git a/ifs-source/arpifs/phys_ec/mo_ham_subm_species.F90 b/ifs-source/arpifs/m7/module/mo_ham_subm_species.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/mo_ham_subm_species.F90 rename to ifs-source/arpifs/m7/module/mo_ham_subm_species.F90 diff --git a/ifs-source/arpifs/phys_ec/mo_ham_wetdep_data.F90 b/ifs-source/arpifs/m7/module/mo_ham_wetdep_data.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/mo_ham_wetdep_data.F90 rename to ifs-source/arpifs/m7/module/mo_ham_wetdep_data.F90 diff --git a/ifs-source/arpifs/phys_ec/mo_io_units.F90 b/ifs-source/arpifs/m7/module/mo_io_units.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/mo_io_units.F90 rename to ifs-source/arpifs/m7/module/mo_io_units.F90 diff --git a/ifs-source/arpifs/phys_ec/mo_kind.F90 b/ifs-source/arpifs/m7/module/mo_kind.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/mo_kind.F90 rename to ifs-source/arpifs/m7/module/mo_kind.F90 diff --git a/ifs-source/arpifs/phys_ec/mo_math_constants.F90 b/ifs-source/arpifs/m7/module/mo_math_constants.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/mo_math_constants.F90 rename to ifs-source/arpifs/m7/module/mo_math_constants.F90 diff --git a/ifs-source/arpifs/phys_ec/mo_namelist.F90 b/ifs-source/arpifs/m7/module/mo_namelist.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/mo_namelist.F90 rename to ifs-source/arpifs/m7/module/mo_namelist.F90 diff --git a/ifs-source/arpifs/phys_ec/mo_netcdf.F90 b/ifs-source/arpifs/m7/module/mo_netcdf.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/mo_netcdf.F90 rename to ifs-source/arpifs/m7/module/mo_netcdf.F90 diff --git a/ifs-source/arpifs/phys_ec/mo_param_switches.F90 b/ifs-source/arpifs/m7/module/mo_param_switches.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/mo_param_switches.F90 rename to ifs-source/arpifs/m7/module/mo_param_switches.F90 diff --git a/ifs-source/arpifs/phys_ec/mo_physical_constants.F90 b/ifs-source/arpifs/m7/module/mo_physical_constants.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/mo_physical_constants.F90 rename to ifs-source/arpifs/m7/module/mo_physical_constants.F90 diff --git a/ifs-source/arpifs/phys_ec/mo_radiation_parameters.F90 b/ifs-source/arpifs/m7/module/mo_radiation_parameters.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/mo_radiation_parameters.F90 rename to ifs-source/arpifs/m7/module/mo_radiation_parameters.F90 diff --git a/ifs-source/arpifs/phys_ec/mo_read_netcdf77.F90 b/ifs-source/arpifs/m7/module/mo_read_netcdf77.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/mo_read_netcdf77.F90 rename to ifs-source/arpifs/m7/module/mo_read_netcdf77.F90 diff --git a/ifs-source/arpifs/phys_ec/mo_species.F90 b/ifs-source/arpifs/m7/module/mo_species.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/mo_species.F90 rename to ifs-source/arpifs/m7/module/mo_species.F90 diff --git a/ifs-source/arpifs/phys_ec/mo_submodel.F90 b/ifs-source/arpifs/m7/module/mo_submodel.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/mo_submodel.F90 rename to ifs-source/arpifs/m7/module/mo_submodel.F90 diff --git a/ifs-source/arpifs/phys_ec/mo_time_control.F90 b/ifs-source/arpifs/m7/module/mo_time_control.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/mo_time_control.F90 rename to ifs-source/arpifs/m7/module/mo_time_control.F90 diff --git a/ifs-source/arpifs/phys_ec/mo_tracdef.F90 b/ifs-source/arpifs/m7/module/mo_tracdef.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/mo_tracdef.F90 rename to ifs-source/arpifs/m7/module/mo_tracdef.F90 diff --git a/ifs-source/arpifs/phys_ec/mo_tracer.F90 b/ifs-source/arpifs/m7/module/mo_tracer.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/mo_tracer.F90 rename to ifs-source/arpifs/m7/module/mo_tracer.F90 diff --git a/ifs-source/arpifs/phys_ec/mo_util_string.F90 b/ifs-source/arpifs/m7/module/mo_util_string.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/mo_util_string.F90 rename to ifs-source/arpifs/m7/module/mo_util_string.F90 diff --git a/ifs-source/arpifs/phys_ec/OIFS_to_HAM.F90 b/ifs-source/arpifs/m7/module/oifs_to_ham.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/OIFS_to_HAM.F90 rename to ifs-source/arpifs/m7/module/oifs_to_ham.F90 diff --git a/ifs-source/arpifs/module/tm5m7_data.F90 b/ifs-source/arpifs/m7/module/tm5m7_data.F90 similarity index 100% rename from ifs-source/arpifs/module/tm5m7_data.F90 rename to ifs-source/arpifs/m7/module/tm5m7_data.F90 diff --git a/ifs-source/arpifs/module/tm5m7_emis_data.F90 b/ifs-source/arpifs/m7/module/tm5m7_emis_data.F90 similarity index 100% rename from ifs-source/arpifs/module/tm5m7_emis_data.F90 rename to ifs-source/arpifs/m7/module/tm5m7_emis_data.F90 diff --git a/ifs-source/arpifs/module/tm5m7_optics_data.F90 b/ifs-source/arpifs/m7/module/tm5m7_optics_data.F90 similarity index 100% rename from ifs-source/arpifs/module/tm5m7_optics_data.F90 rename to ifs-source/arpifs/m7/module/tm5m7_optics_data.F90 diff --git a/ifs-source/arpifs/module/yomm7ctl.F90 b/ifs-source/arpifs/m7/module/yomm7ctl.F90 similarity index 86% rename from ifs-source/arpifs/module/yomm7ctl.F90 rename to ifs-source/arpifs/m7/module/yomm7ctl.F90 index 87d2b6eb..2393c187 100644 --- a/ifs-source/arpifs/module/yomm7ctl.F90 +++ b/ifs-source/arpifs/m7/module/yomm7ctl.F90 @@ -14,6 +14,10 @@ ! ------- ! 2020-11-17 Tero Mielonen (TeMi) + +! RCHG -> A natural place for this module is arpifs/module +! we moved to arpifs/m7/modules for the developing +! process (easier track of files for m7) MODULE YOMM7CTL USE PARKIND1 ,ONLY : JPIM diff --git a/ifs-source/arpifs/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 similarity index 99% rename from ifs-source/arpifs/phys_ec/hamm7_interface.F90 rename to ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index 7b2b0afb..aedef47c 100755 --- a/ifs-source/arpifs/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -754,7 +754,7 @@ SUBROUTINE HAMM7_INTERFACE( & ZTENC0(KIDIA:KFDIA,1:KLEV, :) = 0._JPRB ENDIF - +! RCHG -> I would move this block to a subroutine (here after a "contains") !* 0.2 Preliminary computation !* GAS-TO-PARTICLE CONVERSION (SO2 -> SO4) !* (SO2 -> SO4) @@ -829,6 +829,8 @@ SUBROUTINE HAMM7_INTERFACE( & !end of * (SO2 -> SO4) +!RCHG -> I would move this to a second subroutine (again after "CONTAINS") +! !* 1.1 COMPUTE RELATIVE HUMIDITY WITHOUT VERTICAL SMOOTING ! --------------------------------------------------- ! Q at saturation for RH calculation @@ -1146,6 +1148,8 @@ SUBROUTINE HAMM7_INTERFACE( & PRSF1, PRS1, & ZXTM1, ZXTTE) + ! RCHG -> This is wetdep interface it can be a subroutine afer "CONTAINS" + ! !--> Wet deposition for HAM-M7 CALL GSTATS(2503,0) diff --git a/ifs-source/arpifs/phys_ec/m7.F90 b/ifs-source/arpifs/m7/phys_ec/m7.F90 similarity index 98% rename from ifs-source/arpifs/phys_ec/m7.F90 rename to ifs-source/arpifs/m7/phys_ec/m7.F90 index ae6016c3..2612f30e 100755 --- a/ifs-source/arpifs/phys_ec/m7.F90 +++ b/ifs-source/arpifs/m7/phys_ec/m7.F90 @@ -101,6 +101,8 @@ SUBROUTINE m7(KIDIA, KFDIA, KLON, KLEV, & ! TM5 indices ! !--- 0) Initialisations: ------------------------------------------------- ! + ! RCHG -> this subroutine depends on KIDIA and KFDIA so this Initialisations + ! are confusing/dangerous. zhplus(:,:,:) = 0._JPRB pm6dry(:,:,:) = 0._JPRB pm6rp(:,:,:) = 0._JPRB diff --git a/ifs-source/arpifs/phys_ec/m7_simple_sulfur_drydep.F90 b/ifs-source/arpifs/m7/phys_ec/m7_simple_sulfur_drydep.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/m7_simple_sulfur_drydep.F90 rename to ifs-source/arpifs/m7/phys_ec/m7_simple_sulfur_drydep.F90 diff --git a/ifs-source/arpifs/phys_ec/tm5m7_drydep.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_drydep.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/tm5m7_drydep.F90 rename to ifs-source/arpifs/m7/phys_ec/tm5m7_drydep.F90 diff --git a/ifs-source/arpifs/phys_ec/tm5m7_get_refr_idx.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_get_refr_idx.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/tm5m7_get_refr_idx.F90 rename to ifs-source/arpifs/m7/phys_ec/tm5m7_get_refr_idx.F90 diff --git a/ifs-source/arpifs/phys_ec/tm5m7_optics_aop_get.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_optics_aop_get.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/tm5m7_optics_aop_get.F90 rename to ifs-source/arpifs/m7/phys_ec/tm5m7_optics_aop_get.F90 diff --git a/ifs-source/arpifs/phys_ec/tm5m7_optics_calculate_aop.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_optics_calculate_aop.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/tm5m7_optics_calculate_aop.F90 rename to ifs-source/arpifs/m7/phys_ec/tm5m7_optics_calculate_aop.F90 diff --git a/ifs-source/arpifs/phys_ec/tm5m7_optics_get.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_optics_get.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/tm5m7_optics_get.F90 rename to ifs-source/arpifs/m7/phys_ec/tm5m7_optics_get.F90 diff --git a/ifs-source/arpifs/phys_ec/tm5m7_optics_init.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_optics_init.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/tm5m7_optics_init.F90 rename to ifs-source/arpifs/m7/phys_ec/tm5m7_optics_init.F90 diff --git a/ifs-source/arpifs/phys_ec/tm5m7_phy2.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_phy2.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/tm5m7_phy2.F90 rename to ifs-source/arpifs/m7/phys_ec/tm5m7_phy2.F90 diff --git a/ifs-source/arpifs/phys_ec/tm5m7_sediment.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_sediment.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/tm5m7_sediment.F90 rename to ifs-source/arpifs/m7/phys_ec/tm5m7_sediment.F90 diff --git a/ifs-source/arpifs/phys_ec/tm5m7_src.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/tm5m7_src.F90 rename to ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 diff --git a/ifs-source/arpifs/phys_ec/tm5m7_src_dust.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_src_dust.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/tm5m7_src_dust.F90 rename to ifs-source/arpifs/m7/phys_ec/tm5m7_src_dust.F90 diff --git a/ifs-source/arpifs/phys_ec/tm5m7_src_dust_init.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_src_dust_init.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/tm5m7_src_dust_init.F90 rename to ifs-source/arpifs/m7/phys_ec/tm5m7_src_dust_init.F90 diff --git a/ifs-source/arpifs/phys_ec/tm5m7_src_ss.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_src_ss.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/tm5m7_src_ss.F90 rename to ifs-source/arpifs/m7/phys_ec/tm5m7_src_ss.F90 diff --git a/ifs-source/arpifs/phys_ec/tm5m7_init.F90 b/ifs-source/arpifs/m7/tm5m7_init.F90 similarity index 84% rename from ifs-source/arpifs/phys_ec/tm5m7_init.F90 rename to ifs-source/arpifs/m7/tm5m7_init.F90 index cb86e945..3b7aff1d 100755 --- a/ifs-source/arpifs/phys_ec/tm5m7_init.F90 +++ b/ifs-source/arpifs/m7/tm5m7_init.F90 @@ -26,24 +26,23 @@ SUBROUTINE TM5M7_INIT(YDGEOMETRY, YRCOMPO, YGFL, YDERAD) -USE GEOMETRY_MOD , ONLY : GEOMETRY -USE PARKIND1 , ONLY : JPRB, JPIM -USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK -USE YOMLUN , ONLY : NULOUT +USE GEOMETRY_MOD, ONLY : GEOMETRY +USE PARKIND1, ONLY : JPRB, JPIM +USE YOMHOOK, ONLY : LHOOK, DR_HOOK, JPHOOK +USE YOMLUN, ONLY : NULOUT !USE YOMCOMPO , ONLY : YRCOMPO -USE YOMCOMPO , ONLY : TCOMPO -USE YOM_YGFL , ONLY : TYPE_GFLD!YGFL +USE YOMCOMPO, ONLY : TCOMPO +USE YOM_YGFL, ONLY : TYPE_GFLD!YGFL USE TM5_PHOTOLYSIS, ONLY : PHOTOLYSIS_INI, NBANDS_TROP,LMID,LMID_GRIDA,WAVE,WAV_GRID,WAV_GRIDA,LL_TM5_PHOTO_INI -USE TM5M7_DATA, ONLY : & - & ISO4 , INH4 , INO3_A , IACS_N , ISO4ACS , IBCACS , IPOMACS , ISSACS , IDUACS , & - & ISOANUS , ISOAAIS , ISOAACS , ISOACOS , ISOAAII , IH2OPART ,IAII_N , IBCAII , & - & IPOMAII , IACI_N , IDUACI , IAIS_N , ISO4AIS , IBCAIS , IPOMAIS , ICOI_N , & - & IDUCOI , ICOS_N , ISO4COS , IBCCOS , IPOMCOS , ISSCOS , IDUCOS , INUS_N , & - & ISO4NUS , IELVOC , IISVOC , IMSA, & -! Needed for the emissions declaration.. - & sigma_lognormal, & - & xmc, sigma_lognormal, pom_density, & - & mode_aii, mode_ais, mode_acs +USE TM5M7_DATA, ONLY : ISO4 , INH4 , INO3_A , IACS_N , ISO4ACS , IBCACS , IPOMACS , ISSACS , IDUACS , & + & ISOANUS , ISOAAIS , ISOAACS , ISOACOS , ISOAAII , IH2OPART ,IAII_N , IBCAII , & + & IPOMAII , IACI_N , IDUACI , IAIS_N , ISO4AIS , IBCAIS , IPOMAIS , ICOI_N , & + & IDUCOI , ICOS_N , ISO4COS , IBCCOS , IPOMCOS , ISSCOS , IDUCOS , INUS_N , & + & ISO4NUS , IELVOC , IISVOC , IMSA, & + ! Needed for the emissions declaration.. + & sigma_lognormal, & + & xmc, sigma_lognormal, pom_density, & + & mode_aii, mode_ais, mode_acs USE TM5M7_OPTICS_DATA, ONLY :WAVELENDEP,NWDEP,WDEP, & & ASWBAND, NASWBAND,ALWWN1,ALWWN2 USE YOERAD , ONLY : TERAD!YRERAD @@ -74,12 +73,12 @@ SUBROUTINE TM5M7_INIT(YDGEOMETRY, YRCOMPO, YGFL, YDERAD) IF (LHOOK) CALL DR_HOOK('TM5M7_INIT',0,ZHOOK_HANDLE) -ASSOCIATE(NACTAERO=>YGFL%NACTAERO, YAERO=>YGFL%YAERO, & - & NAERO=>YGFL%NAERO, & - & AERO_SCHEME=>YRCOMPO%AERO_SCHEME,LAERCHEM=>YGFL%LAERCHEM) +ASSOCIATE(& + & NACTAERO => YGFL%NACTAERO, YAERO => YGFL%YAERO, & + & NAERO => YGFL%NAERO, LAERCHEM => YGFL%LAERCHEM, & + & AERO_SCHEME => YRCOMPO%AERO_SCHEME ) - !* Init aerosol scheme ! --------------- @@ -210,19 +209,19 @@ SUBROUTINE TM5M7_INIT(YDGEOMETRY, YRCOMPO, YGFL, YDERAD) NASWBAND=YDERAD%NTSW if (allocated(ASWBAND)) deallocate(ASWBAND) allocate(ASWBAND(YDERAD%NTSW)) - ASWBAND( 13)%wl = 0.257_JPRB - ASWBAND( 12)%wl = 0.313_JPRB - ASWBAND( 11)%wl = 0.398_JPRB - ASWBAND( 10)%wl = 0.530_JPRB + ASWBAND(13)%wl = 0.257_JPRB + ASWBAND(12)%wl = 0.313_JPRB + ASWBAND(11)%wl = 0.398_JPRB + ASWBAND(10)%wl = 0.530_JPRB ASWBAND( 9)%wl = 0.697_JPRB ASWBAND( 8)%wl = 0.973_JPRB ASWBAND( 7)%wl = 1.269_JPRB ASWBAND( 6)%wl = 1.447_JPRB ASWBAND( 5)%wl = 1.767_JPRB - ASWBAND(4)%wl = 2.040_JPRB - ASWBAND(3)%wl = 2.308_JPRB - ASWBAND(2)%wl = 2.752_JPRB - ASWBAND(1)%wl = 3.407_JPRB + ASWBAND( 4)%wl = 2.040_JPRB + ASWBAND( 3)%wl = 2.308_JPRB + ASWBAND( 2)%wl = 2.752_JPRB + ASWBAND( 1)%wl = 3.407_JPRB ASWBAND(14)%wl = 5.254_JPRB ! ASWBAND( 1)%wl = 0.257 diff --git a/ifs-source/arpifs/module/parfpos.F90 b/ifs-source/arpifs/module/parfpos.F90 index f0217889..9b954a0a 100644 --- a/ifs-source/arpifs/module/parfpos.F90 +++ b/ifs-source/arpifs/module/parfpos.F90 @@ -124,6 +124,10 @@ MODULE PARFPOS ! + 1 totpreciprate + 20 for snowML (4*5 snowML GA) INTEGER(KIND=JPIM), PARAMETER :: JPOSFSU=28 INTEGER(KIND=JPIM), PARAMETER :: JPOSSFX=1000 + +! RCHG -> Not sure about this way of of programming where numbers are +! added without definition of what the are. This limit the generalization +! of the code, the ability to tests and the readability. INTEGER(KIND=JPIM), PARAMETER :: & & JPOSSGP=180+JPOSVX2+JPOSFSU+JPOSGHGFLX+JPOSCHEM+3*JPOSCHEMFLX+(JPOSAERO*JPOSAERODIAG)+ & & (JPOSAERO_WVL_DIAG*JPOSAERO_WVL_DIAG_TYPES)+JPOSEMIS2D+JPOSEMIS2DAUX+ & diff --git a/ifs-source/arpifs/module/yoeaerop.F90 b/ifs-source/arpifs/module/yoeaerop.F90 index b31e2b14..b5c06895 100644 --- a/ifs-source/arpifs/module/yoeaerop.F90 +++ b/ifs-source/arpifs/module/yoeaerop.F90 @@ -56,6 +56,7 @@ MODULE YOEAEROP REAL(KIND=JPRB), ALLOCATABLE, PUBLIC :: M7SSA(:,:,:,:) REAL(KIND=JPRB), ALLOCATABLE, PUBLIC :: M7ASYM(:,:,:,:) REAL(KIND=JPRB), ALLOCATABLE, PUBLIC :: M7AODLW(:,:,:,:) + END TYPE TEAERM7 ! ------------------------------------------------------------------ ! 9 refers to up to 9 bins (3 operationally for SS and DD) diff --git a/ifs-source/arpifs/setup/sudefo_gflattr.F90 b/ifs-source/arpifs/setup/sudefo_gflattr.F90 index 2df20956..e3ddf69d 100644 --- a/ifs-source/arpifs/setup/sudefo_gflattr.F90 +++ b/ifs-source/arpifs/setup/sudefo_gflattr.F90 @@ -112,8 +112,15 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) ! ------------------------------------------------------------------ IF (LHOOK) CALL DR_HOOK('SUDEFO_GFLATTR',0,ZHOOK_HANDLE) -ASSOCIATE(YDPHY=>YDMODEL%YRML_PHY_MF%YRPHY,YGFL=>YDMODEL%YRML_GCONF%YGFL,YDEPHY=>YDMODEL%YRML_PHY_EC%YREPHY, & - & YDARPHY=>YDMODEL%YRML_PHY_MF%YRARPHY,YDPHNC=>YDMODEL%YRML_PHY_SLIN%YRPHNC,YDDYNA=>YDMODEL%YRML_DYN%YRDYNA) + +ASSOCIATE(& + & YDPHY => YDMODEL%YRML_PHY_MF%YRPHY, & + & YGFL => YDMODEL%YRML_GCONF%YGFL, & + & YDEPHY => YDMODEL%YRML_PHY_EC%YREPHY, & + & YDARPHY => YDMODEL%YRML_PHY_MF%YRARPHY, & + & YDPHNC => YDMODEL%YRML_PHY_SLIN%YRPHNC, & + & YDDYNA => YDMODEL%YRML_DYN%YRDYNA) + ASSOCIATE(LRDUST=>YDARPHY%LRDUST, LRDEPOS=>YDARPHY%LRDEPOS, & & LUSECHEM=>YDARPHY%LUSECHEM, LMDUST=>YDARPHY%LMDUST, LRCO2=>YDARPHY%LRCO2, & & LORILAM=>YDARPHY%LORILAM, LMPA=>YDARPHY%LMPA, & @@ -3224,61 +3231,61 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) ! * Defaults for aerosols attributes DO JGFL=1,JPAERO IF (LECMWF) THEN - YAERO_NL(JGFL)%LGP = .TRUE. + YAERO_NL(JGFL)%LGP = .TRUE. ELSE - YAERO_NL(JGFL)%LGP = .FALSE. + YAERO_NL(JGFL)%LGP = .FALSE. ENDIF - YAERO_NL(JGFL)%LSP = .FALSE. - YAERO_NL(JGFL)%NREQIN = 1 - YAERO_NL(JGFL)%LREQOUT= .TRUE. + YAERO_NL(JGFL)%LSP = .FALSE. + YAERO_NL(JGFL)%NREQIN = 1 + YAERO_NL(JGFL)%LREQOUT = .TRUE. IF (LECMWF) THEN - YAERO_NL(JGFL)%LGPINGP= LLEC_GPINGP + YAERO_NL(JGFL)%LGPINGP = LLEC_GPINGP ELSE - YAERO_NL(JGFL)%LGPINGP= .TRUE. + YAERO_NL(JGFL)%LGPINGP = .TRUE. ENDIF IF (LECMWF .AND. LTRAJHR) THEN - YAERO_NL(JGFL)%LTRAJIO= .TRUE. + YAERO_NL(JGFL)%LTRAJIO = .TRUE. ELSE - YAERO_NL(JGFL)%LTRAJIO= .FALSE. + YAERO_NL(JGFL)%LTRAJIO = .FALSE. ENDIF - YAERO_NL(JGFL)%LDIAG= .FALSE. + YAERO_NL(JGFL)%LDIAG = .FALSE. IF (LECMWF.OR.(LENCLD2 .AND. .NOT.LEPCLD)) THEN - YAERO_NL(JGFL)%LADV=YDDYNA%LSLAG + YAERO_NL(JGFL)%LADV = YDDYNA%LSLAG ELSE - YAERO_NL(JGFL)%LADV=.FALSE. + YAERO_NL(JGFL)%LADV = .FALSE. ENDIF - YAERO_NL(JGFL)%LADV5=.FALSE. - YAERO_NL(JGFL)%LCDERS = .FALSE. - YAERO_NL(JGFL)%LT9 = .FALSE. - YAERO_NL(JGFL)%LT1 = .FALSE. - YAERO_NL(JGFL)%LT5 = .FALSE. - YAERO_NL(JGFL)%LPT = .FALSE. - YAERO_NL(JGFL)%LPC = .FALSE. - YAERO_NL(JGFL)%CNAME = 'XXXXXXXXXXXXXXX' - YAERO_NL(JGFL)%IGRBCODE = 999 - YAERO_NL(JGFL)%NCOUPLING= 0 - YAERO_NL(JGFL)%LTDIABLIN=.FALSE. - YAERO_NL(JGFL)%LHORTURB =.FALSE. - YAERO_NL(JGFL)%LSLHD =.FALSE. - YAERO_NL(JGFL)%LCOMAD =.FALSE. - YAERO_NL(JGFL)%LVSPLIP =.FALSE. + YAERO_NL(JGFL)%LADV5 = .FALSE. + YAERO_NL(JGFL)%LCDERS = .FALSE. + YAERO_NL(JGFL)%LT9 = .FALSE. + YAERO_NL(JGFL)%LT1 = .FALSE. + YAERO_NL(JGFL)%LT5 = .FALSE. + YAERO_NL(JGFL)%LPT = .FALSE. + YAERO_NL(JGFL)%LPC = .FALSE. + YAERO_NL(JGFL)%CNAME = 'XXXXXXXXXXXXXXX' + YAERO_NL(JGFL)%IGRBCODE = 999 + YAERO_NL(JGFL)%NCOUPLING = 0 + YAERO_NL(JGFL)%LTDIABLIN = .FALSE. + YAERO_NL(JGFL)%LHORTURB = .FALSE. + YAERO_NL(JGFL)%LSLHD = .FALSE. + YAERO_NL(JGFL)%LCOMAD = .FALSE. + YAERO_NL(JGFL)%LVSPLIP = .FALSE. IF (LECMWF) THEN - YAERO_NL(JGFL)%LQM =.TRUE. + YAERO_NL(JGFL)%LQM = .TRUE. ELSE - YAERO_NL(JGFL)%LQM =.FALSE. + YAERO_NL(JGFL)%LQM = .FALSE. ENDIF - YAERO_NL(JGFL)%LQM3D =.FALSE. - YAERO_NL(JGFL)%LQML3D =.FALSE. - YAERO_NL(JGFL)%LQMH =.FALSE. - YAERO_NL(JGFL)%LHV =.FALSE. - YAERO_NL(JGFL)%LINTLIN =.FALSE. - YAERO_NL(JGFL)%LVWENO =.FALSE. + YAERO_NL(JGFL)%LQM3D = .FALSE. + YAERO_NL(JGFL)%LQML3D = .FALSE. + YAERO_NL(JGFL)%LQMH = .FALSE. + YAERO_NL(JGFL)%LHV = .FALSE. + YAERO_NL(JGFL)%LINTLIN = .FALSE. + YAERO_NL(JGFL)%LVWENO = .FALSE. YAERO_NL(JGFL)%WENO_ALPHA = 0.0_JPRB - YAERO_NL(JGFL)%LPHY =.FALSE. - YAERO_NL(JGFL)%LMASSFIX =.FALSE. - YAERO_NL(JGFL)%LNEGFIX =.FALSE. - YAERO_NL(JGFL)%LMGRID =.FALSE. - YAERO_NL(JGFL)%BETAMFBC = 1.0_JPRB + YAERO_NL(JGFL)%LPHY = .FALSE. + YAERO_NL(JGFL)%LMASSFIX = .FALSE. + YAERO_NL(JGFL)%LNEGFIX = .FALSE. + YAERO_NL(JGFL)%LMGRID = .FALSE. + YAERO_NL(JGFL)%BETAMFBC = 1.0_JPRB ENDDO ! * Defaults for methane related GFL attributes: LRCH4 diff --git a/ifs-source/cmake/intfb.cmake b/ifs-source/cmake/intfb.cmake index 11d570c3..04936225 100644 --- a/ifs-source/cmake/intfb.cmake +++ b/ifs-source/cmake/intfb.cmake @@ -31,6 +31,7 @@ if( NOT TARGET arpifs_intfb ) arpifs/glomap_mode arpifs/interpol arpifs/kalman + arpifs/m7 arpifs/mwave arpifs/nemo arpifs/obs_error diff --git a/oifs-config.nld5163.sh b/oifs-config.nld5163.sh index 62643ac7..fd72ec0b 100644 --- a/oifs-config.nld5163.sh +++ b/oifs-config.nld5163.sh @@ -50,7 +50,7 @@ export OIFS_CYCLE=48r1 #---Base code assumes openifs-48r1 and openifs-expt are installed #---in $HOME. Either these can be changed by the user------------ -export OIFS_HOME="${PERM}/openifs/oifs_code/"$branch_name"/openifs-48r1_fix_ifstests" +export OIFS_HOME="${PERM}/openifs/oifs_code/"$branch_name"/openifs-48r1" #---It is recommended that the openifs-expt and oifs_data dir #---exist in a location designed for permanent storage----------- From 4e0bb9f3c4cd00aed87f128b0dc34aac26b0fde5 Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Fri, 19 Jul 2024 13:51:57 +0000 Subject: [PATCH 024/129] Pull request #8: Fix T255-M7 test under GNU (OIFS-512) Squashed commit of the following: commit d63693731f99beca83adb2ce383c1bede35f3ad6 Author: Philippe Le Sager Date: Thu Jul 18 10:21:05 2024 +0200 [M7 test] Do not load MACC aerosols climatology commit 616ede2d316cc1e4f4ff15ba2d858ce786aca5a2 Author: Philippe Le Sager Date: Mon Jul 15 16:01:26 2024 +0200 [M7 test] Use TM5 routines to compute optical properties & run 1 day commit e2910c463b8f5a116a2a0ab87c4e2cd7b2297d6c Author: Philippe Le Sager Date: Thu Jul 11 18:05:30 2024 +0200 Revert default NAERMACC and remove unnecessary allocations The default NAERMACC for M7 was set to 0 in PR3. Not only this is not needed, but (at least with GNU) it must be set to 1. Note that namelist value takes precedence in any case. commit 8a13a79acb88902bdead12f0e74a0234fdcaca8d Author: Philippe Le Sager Date: Thu Jul 11 17:46:02 2024 +0200 Prevent crashes in case of NAEROOPT=1 with GNU Some of the fixes are very likely to have effects with NAEROOPT=2 (the default) and/or with Intel compiler commit 60c9758e17e643563c7cb745769e9c45680ae242 Author: Philippe Le Sager Date: Thu Jul 11 17:30:21 2024 +0200 Log M7 aerosol optics/cloud parameters commit 56eddd3ab5856b6e56d0bc6af767725c62251d17 Author: Philippe Le Sager Date: Thu Jul 4 10:44:00 2024 +0200 Add emissions to T255/M7 ifs-test commit a3cd13c4bb062a5cd4a4caa50f216967c1ea740b Author: Philippe Le Sager Date: Wed Jul 3 15:15:48 2024 +0200 Allocate 2 full nodes for ifs-test on hpc2020@ECMWF Use all these resources for T255/M7 test for a reasonable runtime commit e7df04a5ea221b6f4723c37f401c980903a10279 Author: Philippe Le Sager Date: Wed Jul 3 09:08:24 2024 +0200 Initialize M7 tracers from IC in T255/M7 ifs-test commit 553ef889d9047c2dac8d3455130fc21339ac9dd7 Author: Philippe Le Sager Date: Wed Jul 3 09:07:12 2024 +0200 Switch off drydep in t255/m7 ifs-test commit 25ee3c630a756f30d7c8d5495a8b2f9e011ccc9b Author: Philippe Le Sager Date: Wed Jul 3 09:02:08 2024 +0200 Add IC with readable M7 tracers for t255/M7 ifs-test --- .../arpifs/m7/phys_ec/hamm7_interface.F90 | 89 ++++++++++--------- .../m7/phys_ec/tm5m7_optics_calculate_aop.F90 | 16 +--- ifs-source/arpifs/phys_radi/suecrad.F90 | 11 ++- ifs-test/tests/t255/CMakeLists.txt | 3 + ifs-test/tests/t255/common/m7/m7_aero.nml | 74 +++++++-------- .../tests/t255/common/m7/m7_compoemis.nml | 22 ++++- ifs-test/tests/t255/inidata/ICMCLham7INIT | 2 +- .../tests/t255/inidata/ICMCLham7INIT_COMPO | 1 + ifs-test/tests/t255/inidata/ICMGGham7INIT | 2 +- ifs-test/tests/t255/inidata/ICMGGham7INIUA | 2 +- ifs-test/tests/t255/inidata/ICMSHham7INIT | 2 +- ifs-test/tests/t255/inidata/PLS_ICMCLham7INIT | 1 + .../t255/inidata/PLS_ICMCLham7INIT_COMPO | 1 + ifs-test/tests/t255/inidata/PLS_ICMGGham7INIT | 1 + .../tests/t255/inidata/PLS_ICMGGham7INIUA | 1 + ifs-test/tests/t255/inidata/PLS_ICMSHham7INIT | 1 + ifs-test/tests/t255/test_compo_fc_m7/params | 4 +- ifs-test/tests/t255/test_compo_fc_m7/setup | 24 ++--- scripts/build_test/openifs-test.sh | 2 +- 19 files changed, 142 insertions(+), 117 deletions(-) create mode 120000 ifs-test/tests/t255/inidata/ICMCLham7INIT_COMPO create mode 120000 ifs-test/tests/t255/inidata/PLS_ICMCLham7INIT create mode 120000 ifs-test/tests/t255/inidata/PLS_ICMCLham7INIT_COMPO create mode 120000 ifs-test/tests/t255/inidata/PLS_ICMGGham7INIT create mode 120000 ifs-test/tests/t255/inidata/PLS_ICMGGham7INIUA create mode 120000 ifs-test/tests/t255/inidata/PLS_ICMSHham7INIT diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index aedef47c..2754f3d8 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -622,8 +622,8 @@ SUBROUTINE HAMM7_INTERFACE( & ZOUT(:,:) = 0._JPRB ZOUT2(:,:) = 0._JPRB ZOUT3(:,:,:) = 0._JPRB -!!! initialize those arrays are importnat for PGFL under GNU, Lianghai Wu - ZVDEP(:,:) = 0._JPRB ! ddep velocity as zero + ! Need to initialize those 3 arrays early in case LAERDRYDP=F (GNU, Lianghai Wu) + ZVDEP(KIDIA:KFDIA,:) = 0._JPRB ! ddep velocity as zero ZXTEMS(:,:) = 0._JPRB ! surface emissions as zero for input ZXTMD1(:,:,:) = 0._JPRB !ZOUT4(:,:) = 0._JPRB @@ -645,27 +645,27 @@ SUBROUTINE HAMM7_INTERFACE( & !ZZOUT11(:,:) = 0._JPRB !ZZOUT12(:,:) = 0._JPRB -M7TEND_IN(:,:,:) = 0._JPRB -M7TEND_OUT(:,:,:) = 0._JPRB -SEDOUT(:,:,:) = 0._JPRB -DDEPOUT(:,:,:) = 0._JPRB -WDEPOUT(:,:,:) = 0._JPRB -ZSEDIFLUX(:,:,:) = 0._JPRB -ZDDEPFLUX(:,:) = 0._JPRB -ZDDEPFLUX_SO2(:) = 0._JPRB -ZVDA(:,:) = 0._JPRB -SEDOUT_2D(:,:) = 0._JPRB -DDEPOUT_2D(:,:) = 0._JPRB -WDEPOUT_2D(:,:) = 0._JPRB +M7TEND_IN(KIDIA:KFDIA,:,:) = 0._JPRB ! unused 2024-07-11 +M7TEND_OUT(KIDIA:KFDIA,:,:) = 0._JPRB ! unused 2024-07-11 +SEDOUT(KIDIA:KFDIA,:,:) = 0._JPRB +DDEPOUT(KIDIA:KFDIA,:,:) = 0._JPRB +WDEPOUT(KIDIA:KFDIA,:,:) = 0._JPRB +ZSEDIFLUX(KIDIA:KFDIA,:,:) = 0._JPRB +ZDDEPFLUX(KIDIA:KFDIA,:) = 0._JPRB +ZDDEPFLUX_SO2(KIDIA:KFDIA) = 0._JPRB +ZVDA(KIDIA:KFDIA,:) = 0._JPRB ! unused 2024-07-11 +SEDOUT_2D(KIDIA:KFDIA,:) = 0._JPRB +DDEPOUT_2D(KIDIA:KFDIA,:) = 0._JPRB ! unused 2024-07-11 +WDEPOUT_2D(KIDIA:KFDIA,:) = 0._JPRB -zaveragep(:,:,:) = 0.0_JPRB -zm7kappa(:,:,:) = 0.0_JPRB -zh2so4cs(:,:,:) = 0.0_JPRB -zm7prodcond(:,:,:) = 0.0_JPRB +ZAVERAGEP(KIDIA:KFDIA,:,:) = 0.0_JPRB ! unused 2024-07-11 +ZM7KAPPA(KIDIA:KFDIA,:,:) = 0.0_JPRB ! unused 2024-07-11 +ZH2SO4CS(KIDIA:KFDIA,:,:) = 0.0_JPRB ! unused 2024-07-11 +ZM7PRODCOND(KIDIA:KFDIA,:,:) = 0.0_JPRB ! unused 2024-07-11 -ZTAERO(:,:,:) = 0._JPRB +ZTAERO(KIDIA:KFDIA,:,:) = 0._JPRB -ZCEN(:,:,:) = 0._JPRB +ZCEN(KIDIA:KFDIA,:,:) = 0._JPRB !ZAERSRC(KIDIA:KFDIA,1:NACTAERO)=PAERSRC(KIDIA:KFDIA,1:NACTAERO) @@ -1561,7 +1561,7 @@ SUBROUTINE HAMM7_INTERFACE( & CASE (1) ! Use TM5 codes to calculate optical properties (optical properties for LW = 0) !--> Add HAM updated tendency to ZTAERO and use that in optics - ZTAERO(:,:,:) = 0._JPRB + ZTAERO(KIDIA:KFDIA,:,:) = 0._JPRB DO JAER=1,NACTAERO DO JK=1,KLEV DO JL=KIDIA,KFDIA @@ -1570,7 +1570,7 @@ SUBROUTINE HAMM7_INTERFACE( & ENDDO ENDDO - ZAEROK = ZAEROK+ZTAERO*time_step_len + ZAEROK(KIDIA:KFDIA,:,:) = ZAEROK(KIDIA:KFDIA,:,:) + ZTAERO(KIDIA:KFDIA,:,:)*TIME_STEP_LEN CALL TM5M7_OPTICS_AOP_GET( YGFL, YREAERSRC, KIDIA,KFDIA, KLON, KLEV,NACTAERO, & & NASWBAND, ASWBAND, 1, .false., & @@ -1592,33 +1592,34 @@ SUBROUTINE HAMM7_INTERFACE( & ENDDO ENDDO - ! "I am not sure if the rest is needed" [who is I? FIXME] + ! "I am not sure if the rest is needed" [who is 'I'? FIXME] + ! [PLS, 2024-07-11] This is only assigning 0 to output variables. - ALLOCATE( ZAOP_OUT_EXT( KLON, KLEV, NWDEP, 1)) ; ZAOP_OUT_EXT = 0.0_JPRB - ALLOCATE( ZAOP_OUT_A ( KLON, KLEV, NWDEP) ) ; ZAOP_OUT_A = 0.0_JPRB - ALLOCATE( ZAOP_OUT_G ( KLON, KLEV, NWDEP) ) ; ZAOP_OUT_G = 0.0_JPRB - - - ALLOCATE(ZTAUS_AER (KLON, KLEV,NWDEP)); ZTAUS_AER = 0.0 - ALLOCATE(ZTAUA_AER (KLON, KLEV,NWDEP)); ZTAUA_AER = 0.0 - ALLOCATE(ZPMAER (KLON, KLEV,NWDEP)); ZPMAER = 0.0 + !PLS-NOT-USED ALLOCATE( ZAOP_OUT_EXT( KLON, KLEV, NWDEP, 1)) ; ZAOP_OUT_EXT = 0.0_JPRB + !PLS-NOT-USED ALLOCATE( ZAOP_OUT_A ( KLON, KLEV, NWDEP) ) ; ZAOP_OUT_A = 0.0_JPRB + !PLS-NOT-USED ALLOCATE( ZAOP_OUT_G ( KLON, KLEV, NWDEP) ) ; ZAOP_OUT_G = 0.0_JPRB + !PLS-NOT-USED + !PLS-NOT-USED ALLOCATE(ZTAUS_AER (KLON, KLEV,NWDEP)); ZTAUS_AER = 0.0 + !PLS-NOT-USED ALLOCATE(ZTAUA_AER (KLON, KLEV,NWDEP)); ZTAUA_AER = 0.0 + !PLS-NOT-USED ALLOCATE(ZPMAER (KLON, KLEV,NWDEP)); ZPMAER = 0.0 DO JB=1, NBANDS_TROP - PTAUS_AER(:,:,JB,1) = ZTAUS_AER(:,:,WAV_GRID(JB)) - PTAUA_AER(:,:,JB,1) = ZTAUA_AER(:,:,WAV_GRID(JB)) - PPMAER (:,:,JB,1) = ZPMAER (:,:,WAV_GRID(JB)) + PTAUS_AER(KIDIA:KFDIA,:,JB,1) = 0.0_JPRB !ZTAUS_AER(:,:,WAV_GRID(JB)) + PTAUA_AER(KIDIA:KFDIA,:,JB,1) = 0.0_JPRB !ZTAUA_AER(:,:,WAV_GRID(JB)) + PPMAER (KIDIA:KFDIA,:,JB,1) = 0.0_JPRB !ZPMAER (:,:,WAV_GRID(JB)) - PTAUS_AER(:,:,JB,2) = ZTAUS_AER(:,:,WAV_GRIDA(JB)) - PTAUA_AER(:,:,JB,2) = ZTAUA_AER(:,:,WAV_GRIDA(JB)) - PPMAER (:,:,JB,2) = ZPMAER (:,:,WAV_GRIDA(JB)) + PTAUS_AER(KIDIA:KFDIA,:,JB,2) = 0.0_JPRB !ZTAUS_AER(:,:,WAV_GRIDA(JB)) + PTAUA_AER(KIDIA:KFDIA,:,JB,2) = 0.0_JPRB !ZTAUA_AER(:,:,WAV_GRIDA(JB)) + PPMAER (KIDIA:KFDIA,:,JB,2) = 0.0_JPRB !ZPMAER (:,:,WAV_GRIDA(JB)) ENDDO - DEALLOCATE(ZTAUS_AER) - DEALLOCATE(ZTAUA_AER) - DEALLOCATE(ZPMAER) - - DEALLOCATE(ZAOP_OUT_EXT) - DEALLOCATE(ZAOP_OUT_A ) - DEALLOCATE(ZAOP_OUT_G ) + + !PLS-NOT-USED DEALLOCATE(ZTAUS_AER) + !PLS-NOT-USED DEALLOCATE(ZTAUA_AER) + !PLS-NOT-USED DEALLOCATE(ZPMAER) + !PLS-NOT-USED + !PLS-NOT-USED DEALLOCATE(ZAOP_OUT_EXT) + !PLS-NOT-USED DEALLOCATE(ZAOP_OUT_A ) + !PLS-NOT-USED DEALLOCATE(ZAOP_OUT_G ) CASE (2) ! Use HAM codes to calculate optical properties diff --git a/ifs-source/arpifs/m7/phys_ec/tm5m7_optics_calculate_aop.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_optics_calculate_aop.F90 index 86823be4..3a0fceee 100644 --- a/ifs-source/arpifs/m7/phys_ec/tm5m7_optics_calculate_aop.F90 +++ b/ifs-source/arpifs/m7/phys_ec/tm5m7_optics_calculate_aop.F90 @@ -392,15 +392,9 @@ SUBROUTINE TM5M7_OPTICS_CALCULATE_AOP(KIDIA,KFDIA,KLON,KLEV, nwl,NCONTR, wdep, e !======================================================================= enddo ! loop over wavelengths - - - !Nullify(Cext_table) - !Nullify(a_table) - !Nullify(g_table) - if (associated(Cext_table)) deallocate(Cext_table) - if (associated(a_table)) deallocate(a_table) - if (associated(g_table)) deallocate(g_table) - + IF (ASSOCIATED(CEXT_TABLE)) NULLIFY(CEXT_TABLE) + IF (ASSOCIATED(A_TABLE)) NULLIFY(A_TABLE) + IF (ASSOCIATED(G_TABLE)) NULLIFY(G_TABLE) !do imode = 1,7 ! print *, 'Radius,mode :', imode, sum(aop_in(KIDIA:KFDIA,1:KLEV)%rg(imode))/((KFDIA-KIDIA+1)*KLEV) @@ -413,7 +407,5 @@ SUBROUTINE TM5M7_OPTICS_CALCULATE_AOP(KIDIA,KFDIA,KLON,KLEV, nwl,NCONTR, wdep, e ! print *, 'AOD per grid box:', wdep(i)%wl, sum(PAOP_OUT_EXT(KIDIA:KFDIA,1:KLEV,i,1))/((KFDIA-KIDIA+1)*KLEV) !enddo - - -IF(LHOOK) CALL DR_HOOK('TM5M7_OPTICS_CALCULATE_AOP',1,ZHOOK_HANDLE) + IF(LHOOK) CALL DR_HOOK('TM5M7_OPTICS_CALCULATE_AOP',1,ZHOOK_HANDLE) END SUBROUTINE TM5M7_OPTICS_CALCULATE_AOP diff --git a/ifs-source/arpifs/phys_radi/suecrad.F90 b/ifs-source/arpifs/phys_radi/suecrad.F90 index 8e04e0e3..46a1777b 100644 --- a/ifs-source/arpifs/phys_radi/suecrad.F90 +++ b/ifs-source/arpifs/phys_radi/suecrad.F90 @@ -778,9 +778,6 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) !- monthly climatology of aerosols (SS, DU, OM, BC, SO4) from CAMS reanalyses (former MACC) IF (LEPHYS.AND..NOT.LARPEGEF) THEN ! LARPEGEF for the files conversions IFS->Arpege. REK NAERMACC=1 ! =0 inactive - FIXME: IF ( TRIM(AERO_SCHEME) == "hamm7" ) THEN - NAERMACC=0 - ENDIF FIXME ELSE NAERMACC=0 ENDIF @@ -2556,6 +2553,14 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) IF (ALLOCATED(YDESWRT%RSUN2))& & WRITE(UNIT=KULOUT,FMT='('' RSUN2 FROM YOESW = '',6F10.5)')(YDESWRT%RSUN2(I),I=1,NSW) +! ! Only print M7 options if used +! IF ( TRIM(AERO_SCHEME) == "hamm7" ) THEN + WRITE(UNIT=KULOUT,FMT='('' NCLOUDACT (M7) = '',I1)') NCLOUDACT + WRITE(UNIT=KULOUT,FMT='('' NAEROOPT (M7) = '',I1)') NAEROOPT +! ELSE +! WRITE(UNIT=KULOUT,FMT='(A)') 'NCLOUDACT/NAEROOPT not used' +! ENDIF + ENDIF ! Load total solar irradiance diff --git a/ifs-test/tests/t255/CMakeLists.txt b/ifs-test/tests/t255/CMakeLists.txt index 90381e77..540b0987 100644 --- a/ifs-test/tests/t255/CMakeLists.txt +++ b/ifs-test/tests/t255/CMakeLists.txt @@ -60,6 +60,9 @@ function( add_ifs_test TARGET ) execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink ${CMAKE_CURRENT_SOURCE_DIR}/inidata/ICMCLham7INIT ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/ICMCLham7INIT ) + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${CMAKE_CURRENT_SOURCE_DIR}/inidata/ICMCLham7INIT_COMPO ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/ICMCLham7INIT_COMPO ) + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink ${CMAKE_CURRENT_SOURCE_DIR}/../compo_data/m7/lookup_table.nc ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/lookup_table.nc) diff --git a/ifs-test/tests/t255/common/m7/m7_aero.nml b/ifs-test/tests/t255/common/m7/m7_aero.nml index 48ede344..03f2aec9 100644 --- a/ifs-test/tests/t255/common/m7/m7_aero.nml +++ b/ifs-test/tests/t255/common/m7/m7_aero.nml @@ -8,7 +8,7 @@ YAERO_NL(1)%LQM=.false., YAERO_NL(1)%LQM3D=.true., YAERO_NL(1)%BETAMFBC=-999, YAERO_NL(1)%LADV=.true., -YAERO_NL(1)%NREQIN=0, +YAERO_NL(1)%NREQIN=1, YAERO_NL(2)%CNAME='NH4', YAERO_NL(2)%IGRBCODE=212035, YAERO_NL(2)%LMASSFIX=.true., @@ -16,7 +16,7 @@ YAERO_NL(2)%LQM=.false., YAERO_NL(2)%LQM3D=.true., YAERO_NL(2)%BETAMFBC=-999, YAERO_NL(2)%LADV=.true., -YAERO_NL(2)%NREQIN=0, +YAERO_NL(2)%NREQIN=1, YAERO_NL(3)%CNAME='NO3_A', YAERO_NL(3)%IGRBCODE=212036, YAERO_NL(3)%LMASSFIX=.true., @@ -24,7 +24,7 @@ YAERO_NL(3)%LQM=.false., YAERO_NL(3)%LQM3D=.true., YAERO_NL(3)%BETAMFBC=-999, YAERO_NL(3)%LADV=.true., -YAERO_NL(3)%NREQIN=0, +YAERO_NL(3)%NREQIN=1, YAERO_NL(4)%CNAME='AS_N', YAERO_NL(4)%IGRBCODE=212001, YAERO_NL(4)%LMASSFIX=.true., @@ -32,7 +32,7 @@ YAERO_NL(4)%LQM=.false., YAERO_NL(4)%LQM3D=.true., YAERO_NL(4)%BETAMFBC=-999, YAERO_NL(4)%LADV=.true., -YAERO_NL(4)%NREQIN=0, +YAERO_NL(4)%NREQIN=1, YAERO_NL(5)%CNAME='SO4_AS', YAERO_NL(5)%IGRBCODE=212002, YAERO_NL(5)%LMASSFIX=.true., @@ -40,7 +40,7 @@ YAERO_NL(5)%LQM=.false., YAERO_NL(5)%LQM3D=.true., YAERO_NL(5)%BETAMFBC=-999, YAERO_NL(5)%LADV=.true., -YAERO_NL(5)%NREQIN=0, +YAERO_NL(5)%NREQIN=1, YAERO_NL(6)%CNAME='BC_AS', YAERO_NL(6)%IGRBCODE=212003, YAERO_NL(6)%LMASSFIX=.true., @@ -48,7 +48,7 @@ YAERO_NL(6)%LQM=.false., YAERO_NL(6)%LQM3D=.true., YAERO_NL(6)%BETAMFBC=-999, YAERO_NL(6)%LADV=.true., -YAERO_NL(6)%NREQIN=0, +YAERO_NL(6)%NREQIN=1, YAERO_NL(7)%CNAME='POM_AS', YAERO_NL(7)%IGRBCODE=212004, YAERO_NL(7)%LMASSFIX=.true., @@ -56,13 +56,13 @@ YAERO_NL(7)%LQM=.false., YAERO_NL(7)%LQM3D=.true., YAERO_NL(7)%BETAMFBC=-999, YAERO_NL(7)%LADV=.true., -YAERO_NL(7)%NREQIN=0, +YAERO_NL(7)%NREQIN=1, YAERO_NL(8)%CNAME='SS_AS', YAERO_NL(8)%IGRBCODE=212005, YAERO_NL(8)%BETAMFBC=-999, YAERO_NL(8)%LMASSFIX=.true., YAERO_NL(8)%LADV=.true., -YAERO_NL(8)%NREQIN=0, +YAERO_NL(8)%NREQIN=1, YAERO_NL(9)%CNAME='DU_AS', YAERO_NL(9)%IGRBCODE=212006, YAERO_NL(9)%LMASSFIX=.true., @@ -70,7 +70,7 @@ YAERO_NL(9)%LQM=.false., YAERO_NL(9)%LQM3D=.true., YAERO_NL(9)%BETAMFBC=-999, YAERO_NL(9)%LADV=.true., -YAERO_NL(9)%NREQIN=0, +YAERO_NL(9)%NREQIN=1, YAERO_NL(10)%CNAME='SOA_NS', YAERO_NL(10)%IGRBCODE=212007, YAERO_NL(10)%LMASSFIX=.true., @@ -78,7 +78,7 @@ YAERO_NL(10)%LQM=.false., YAERO_NL(10)%LQM3D=.true., YAERO_NL(10)%BETAMFBC=-999, YAERO_NL(10)%LADV=.true., -YAERO_NL(10)%NREQIN=0, +YAERO_NL(10)%NREQIN=1, YAERO_NL(11)%CNAME='SOA_KS', YAERO_NL(11)%IGRBCODE=212008, YAERO_NL(11)%LMASSFIX=.true., @@ -86,7 +86,7 @@ YAERO_NL(11)%LQM=.false., YAERO_NL(11)%LQM3D=.true., YAERO_NL(11)%BETAMFBC=-999, YAERO_NL(11)%LADV=.true., -YAERO_NL(11)%NREQIN=0, +YAERO_NL(11)%NREQIN=1, YAERO_NL(12)%CNAME='SOA_AS', YAERO_NL(12)%IGRBCODE=212009, YAERO_NL(12)%LMASSFIX=.true., @@ -94,7 +94,7 @@ YAERO_NL(12)%LQM=.false., YAERO_NL(12)%LQM3D=.true., YAERO_NL(12)%BETAMFBC=-999, YAERO_NL(12)%LADV=.true., -YAERO_NL(12)%NREQIN=0, +YAERO_NL(12)%NREQIN=1, YAERO_NL(13)%CNAME='SOA_CS', YAERO_NL(13)%IGRBCODE=212010, YAERO_NL(13)%LMASSFIX=.true., @@ -102,7 +102,7 @@ YAERO_NL(13)%LQM=.false., YAERO_NL(13)%LQM3D=.true., YAERO_NL(13)%BETAMFBC=-999, YAERO_NL(13)%LADV=.true., -YAERO_NL(13)%NREQIN=0, +YAERO_NL(13)%NREQIN=1, YAERO_NL(14)%CNAME='SOA_KI', YAERO_NL(14)%IGRBCODE=212011, YAERO_NL(14)%LMASSFIX=.true., @@ -110,7 +110,7 @@ YAERO_NL(14)%LQM=.false., YAERO_NL(14)%LQM3D=.true., YAERO_NL(14)%BETAMFBC=-999, YAERO_NL(14)%LADV=.true., -YAERO_NL(14)%NREQIN=0, +YAERO_NL(14)%NREQIN=1, YAERO_NL(15)%CNAME='H2OPART', YAERO_NL(15)%IGRBCODE=212012, YAERO_NL(15)%LMASSFIX=.true., @@ -118,7 +118,7 @@ YAERO_NL(15)%LQM=.false., YAERO_NL(15)%LQM3D=.true., YAERO_NL(15)%BETAMFBC=-999, YAERO_NL(15)%LADV=.true., -YAERO_NL(15)%NREQIN=0, +YAERO_NL(15)%NREQIN=1, YAERO_NL(16)%CNAME='KI_N', YAERO_NL(16)%IGRBCODE=212013, YAERO_NL(16)%LMASSFIX=.true., @@ -126,7 +126,7 @@ YAERO_NL(16)%LQM=.false., YAERO_NL(16)%LQM3D=.true., YAERO_NL(16)%BETAMFBC=-999, YAERO_NL(16)%LADV=.true., -YAERO_NL(16)%NREQIN=0, +YAERO_NL(16)%NREQIN=1, YAERO_NL(17)%CNAME='BC_KI', YAERO_NL(17)%IGRBCODE=212014, YAERO_NL(17)%LMASSFIX=.true., @@ -134,7 +134,7 @@ YAERO_NL(17)%LQM=.false., YAERO_NL(17)%LQM3D=.true., YAERO_NL(17)%BETAMFBC=-999, YAERO_NL(17)%LADV=.true., -YAERO_NL(17)%NREQIN=0, +YAERO_NL(17)%NREQIN=1, YAERO_NL(18)%CNAME='POM_KI', YAERO_NL(18)%IGRBCODE=212015, YAERO_NL(18)%LMASSFIX=.true., @@ -150,7 +150,7 @@ YAERO_NL(19)%LQM=.false., YAERO_NL(19)%LQM3D=.true., YAERO_NL(19)%BETAMFBC=-999, YAERO_NL(19)%LADV=.true., -YAERO_NL(19)%NREQIN=0, +YAERO_NL(19)%NREQIN=1, YAERO_NL(20)%CNAME='DU_AI', YAERO_NL(20)%IGRBCODE=212017, YAERO_NL(20)%LQM=.false., @@ -158,7 +158,7 @@ YAERO_NL(20)%LQM3D=.true., YAERO_NL(20)%LMASSFIX=.true., YAERO_NL(20)%BETAMFBC=-999, YAERO_NL(20)%LADV=.true., -YAERO_NL(20)%NREQIN=0, +YAERO_NL(20)%NREQIN=1, YAERO_NL(21)%CNAME='KS_N', YAERO_NL(21)%IGRBCODE=212018, YAERO_NL(21)%LQM=.false., @@ -166,7 +166,7 @@ YAERO_NL(21)%BETAMFBC=-999, YAERO_NL(21)%LQM3D=.true., YAERO_NL(21)%LMASSFIX=.true., YAERO_NL(21)%LADV=.true., -YAERO_NL(21)%NREQIN=0, +YAERO_NL(21)%NREQIN=1, YAERO_NL(22)%CNAME='SO4_KS', YAERO_NL(22)%IGRBCODE=212019, YAERO_NL(22)%LMASSFIX=.true., @@ -174,7 +174,7 @@ YAERO_NL(22)%LQM=.false., YAERO_NL(22)%LQM3D=.true., YAERO_NL(22)%BETAMFBC=-999, YAERO_NL(22)%LADV=.true., -YAERO_NL(22)%NREQIN=0, +YAERO_NL(22)%NREQIN=1, YAERO_NL(23)%CNAME='BC_KS', YAERO_NL(23)%IGRBCODE=212020, YAERO_NL(23)%LMASSFIX=.true., @@ -182,7 +182,7 @@ YAERO_NL(23)%LQM=.false., YAERO_NL(23)%LQM3D=.true., YAERO_NL(23)%BETAMFBC=-999, YAERO_NL(23)%LADV=.true., -YAERO_NL(23)%NREQIN=0, +YAERO_NL(23)%NREQIN=1, YAERO_NL(24)%CNAME='POM_KS', YAERO_NL(24)%IGRBCODE=212021, YAERO_NL(24)%LQM=.false., @@ -190,7 +190,7 @@ YAERO_NL(24)%LQM3D=.true., YAERO_NL(24)%LMASSFIX=.true., YAERO_NL(24)%BETAMFBC=-999, YAERO_NL(24)%LADV=.true., -YAERO_NL(24)%NREQIN=0, +YAERO_NL(24)%NREQIN=1, YAERO_NL(25)%CNAME='CI_N', YAERO_NL(25)%IGRBCODE=212022, YAERO_NL(25)%LMASSFIX=.true., @@ -198,7 +198,7 @@ YAERO_NL(25)%LQM=.false., YAERO_NL(25)%LQM3D=.true., YAERO_NL(25)%BETAMFBC=-999, YAERO_NL(25)%LADV=.true., -YAERO_NL(25)%NREQIN=0, +YAERO_NL(25)%NREQIN=1, YAERO_NL(26)%CNAME='DU_CI', YAERO_NL(26)%IGRBCODE=212023, YAERO_NL(26)%LMASSFIX=.true., @@ -206,7 +206,7 @@ YAERO_NL(26)%LQM=.false., YAERO_NL(26)%LQM3D=.true., YAERO_NL(26)%BETAMFBC=-999, YAERO_NL(26)%LADV=.true., -YAERO_NL(26)%NREQIN=0, +YAERO_NL(26)%NREQIN=1, YAERO_NL(27)%CNAME='CS_N', YAERO_NL(27)%IGRBCODE=212024, YAERO_NL(27)%LMASSFIX=.true., @@ -214,7 +214,7 @@ YAERO_NL(27)%LQM=.false., YAERO_NL(27)%LQM3D=.true., YAERO_NL(27)%BETAMFBC=-999, YAERO_NL(27)%LADV=.true., -YAERO_NL(27)%NREQIN=0, +YAERO_NL(27)%NREQIN=1, YAERO_NL(28)%CNAME='SO4_CS', YAERO_NL(28)%IGRBCODE=212025, YAERO_NL(28)%LMASSFIX=.true., @@ -222,7 +222,7 @@ YAERO_NL(28)%LQM=.false., YAERO_NL(28)%LQM3D=.true., YAERO_NL(28)%BETAMFBC=-999, YAERO_NL(28)%LADV=.true., -YAERO_NL(28)%NREQIN=0, +YAERO_NL(28)%NREQIN=1, YAERO_NL(29)%CNAME='BC_CS', YAERO_NL(29)%IGRBCODE=212026, YAERO_NL(29)%LMASSFIX=.true., @@ -230,7 +230,7 @@ YAERO_NL(29)%LQM=.false., YAERO_NL(29)%LQM3D=.true., YAERO_NL(29)%BETAMFBC=-999, YAERO_NL(29)%LADV=.true., -YAERO_NL(29)%NREQIN=0, +YAERO_NL(29)%NREQIN=1, YAERO_NL(30)%CNAME='POM_CS', YAERO_NL(30)%IGRBCODE=212027, YAERO_NL(30)%LMASSFIX=.true., @@ -238,7 +238,7 @@ YAERO_NL(30)%LQM=.false., YAERO_NL(30)%LQM3D=.true., YAERO_NL(30)%BETAMFBC=-999, YAERO_NL(30)%LADV=.true., -YAERO_NL(30)%NREQIN=0, +YAERO_NL(30)%NREQIN=1, YAERO_NL(31)%CNAME='SS_CS', YAERO_NL(31)%IGRBCODE=212028, YAERO_NL(31)%LMASSFIX=.true., @@ -246,7 +246,7 @@ YAERO_NL(31)%LQM=.false., YAERO_NL(31)%LQM3D=.true., YAERO_NL(31)%BETAMFBC=-999, YAERO_NL(31)%LADV=.true., -YAERO_NL(31)%NREQIN=0, +YAERO_NL(31)%NREQIN=1, YAERO_NL(32)%CNAME='DU_CS', YAERO_NL(32)%IGRBCODE=212029, YAERO_NL(32)%LMASSFIX=.true., @@ -254,7 +254,7 @@ YAERO_NL(32)%LQM=.false., YAERO_NL(32)%LQM3D=.true., YAERO_NL(32)%BETAMFBC=-999, YAERO_NL(32)%LADV=.true., -YAERO_NL(32)%NREQIN=0, +YAERO_NL(32)%NREQIN=1, YAERO_NL(33)%CNAME='NS_N', YAERO_NL(33)%IGRBCODE=212030, YAERO_NL(33)%LMASSFIX=.true., @@ -262,7 +262,7 @@ YAERO_NL(33)%LQM=.false., YAERO_NL(33)%LQM3D=.true., YAERO_NL(33)%BETAMFBC=-999, YAERO_NL(33)%LADV=.true., -YAERO_NL(33)%NREQIN=0, +YAERO_NL(33)%NREQIN=1, YAERO_NL(34)%CNAME='SO4_NS', YAERO_NL(34)%IGRBCODE=212031, YAERO_NL(34)%LMASSFIX=.true., @@ -270,7 +270,7 @@ YAERO_NL(34)%LQM=.false., YAERO_NL(34)%LQM3D=.true., YAERO_NL(34)%BETAMFBC=-999, YAERO_NL(34)%LADV=.true., -YAERO_NL(34)%NREQIN=0, +YAERO_NL(34)%NREQIN=1, YAERO_NL(35)%CNAME='ELVOC', YAERO_NL(35)%IGRBCODE=212032, YAERO_NL(35)%LMASSFIX=.true., @@ -278,7 +278,7 @@ YAERO_NL(35)%LQM=.false., YAERO_NL(35)%LQM3D=.true., YAERO_NL(35)%BETAMFBC=-999, YAERO_NL(35)%LADV=.true., -YAERO_NL(35)%NREQIN=0, +YAERO_NL(35)%NREQIN=1, YAERO_NL(36)%CNAME='ISVOC', YAERO_NL(36)%IGRBCODE=212033, YAERO_NL(36)%LMASSFIX=.true., @@ -286,7 +286,7 @@ YAERO_NL(36)%LQM=.false., YAERO_NL(36)%LQM3D=.true., YAERO_NL(36)%BETAMFBC=-999, YAERO_NL(36)%LADV=.true., -YAERO_NL(36)%NREQIN=0, +YAERO_NL(36)%NREQIN=1, YAERO_NL(37)%CNAME='MSA', YAERO_NL(37)%IGRBCODE=212034, YAERO_NL(37)%LMASSFIX=.true., @@ -294,7 +294,7 @@ YAERO_NL(37)%LQM=.false., YAERO_NL(37)%LQM3D=.true., YAERO_NL(37)%BETAMFBC=-999, YAERO_NL(37)%LADV=.true., -YAERO_NL(37)%NREQIN=0, +YAERO_NL(37)%NREQIN=1, YAERO_NL(38)%CNAME='CDNC', YAERO_NL(38)%IGRBCODE=212037, YAERO_NL(38)%LMASSFIX=.TRUE., @@ -310,7 +310,7 @@ YAERO_NL(39)%LQM=.false., YAERO_NL(39)%LQM3D=.true., YAERO_NL(39)%BETAMFBC=-999, YAERO_NL(39)%LADV=.true., -YAERO_NL(39)%NREQIN=0, +YAERO_NL(39)%NREQIN=1, YAERO_NL(40)%CNAME='Total_aerosol', YAERO_NL(40)%IGRBCODE=210048, YAERO_NL(40)%LADV5=true, diff --git a/ifs-test/tests/t255/common/m7/m7_compoemis.nml b/ifs-test/tests/t255/common/m7/m7_compoemis.nml index e904f9d2..8e486467 100644 --- a/ifs-test/tests/t255/common/m7/m7_compoemis.nml +++ b/ifs-test/tests/t255/common/m7/m7_compoemis.nml @@ -11,6 +11,16 @@ cat >> fort.4 << EOF &NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="swd" THIS%PARAMID=212008 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / &NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="tnr" THIS%PARAMID=212009 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / &NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="tro" THIS%PARAMID=212010 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="BC_KI" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210091 / +&NAMCOMPO_EMIS THIS%SPECIES="BC_KI" THIS%SECTOR="ene" THIS%PARAMID=212221 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="BC_KI" THIS%SECTOR="fef" THIS%PARAMID=212222 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="BC_KI" THIS%SECTOR="ind" THIS%PARAMID=212223 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="BC_KI" THIS%SECTOR="ref" THIS%PARAMID=212229 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="BC_KI" THIS%SECTOR="res" THIS%PARAMID=212224 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="BC_KI" THIS%SECTOR="shp" THIS%PARAMID=212225 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="BC_KI" THIS%SECTOR="swd" THIS%PARAMID=212226 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="BC_KI" THIS%SECTOR="tnr" THIS%PARAMID=212227 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="BC_KI" THIS%SECTOR="tro" THIS%PARAMID=212228 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / &NAMCOMPO_EMIS THIS%SPECIES="C10H16" THIS%SECTOR="emiss_bio" THIS%PARAMID=212011 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.65 / &NAMCOMPO_EMIS THIS%SPECIES="C10H16" THIS%SECTOR="ene" THIS%PARAMID=212012 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / &NAMCOMPO_EMIS THIS%SPECIES="C10H16" THIS%SECTOR="fef" THIS%PARAMID=212013 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / @@ -229,7 +239,16 @@ cat >> fort.4 << EOF &NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="swd" THIS%PARAMID=212207 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / &NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="tnr" THIS%PARAMID=212208 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / &NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="tro" THIS%PARAMID=212209 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / -&NAMCOMPO_EMIS THIS%SPECIES="Rn" THIS%SECTOR="emiss_nat" THIS%PARAMID=212210 / +&NAMCOMPO_EMIS THIS%SPECIES="POM_KI" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210090 / +&NAMCOMPO_EMIS THIS%SPECIES="POM_KI" THIS%SECTOR="ene" THIS%PARAMID=212231 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="POM_KI" THIS%SECTOR="fef" THIS%PARAMID=212232 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="POM_KI" THIS%SECTOR="ind" THIS%PARAMID=212233 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="POM_KI" THIS%SECTOR="ref" THIS%PARAMID=212239 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="POM_KI" THIS%SECTOR="res" THIS%PARAMID=212234 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="POM_KI" THIS%SECTOR="shp" THIS%PARAMID=212235 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="POM_KI" THIS%SECTOR="swd" THIS%PARAMID=212236 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="POM_KI" THIS%SECTOR="tnr" THIS%PARAMID=212237 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="POM_KI" THIS%SECTOR="tro" THIS%PARAMID=212238 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / &NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210102 / &NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="emiss_nat" THIS%PARAMID=212211 THIS%VERTICAL_PROFILE_TYPE="AltitudeMap" THIS%VERTICAL_PARAMID=216045 THIS%VERTICAL_BASE_LEVEL=-1 THIS%VERTICAL_TOP_LEVEL=-4 THIS%VERTICAL_THRESHOLD=200 / &NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="ene" THIS%PARAMID=212212 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / @@ -238,7 +257,6 @@ cat >> fort.4 << EOF &NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="ref" THIS%PARAMID=212220 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / &NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="res" THIS%PARAMID=212215 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / &NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="shp" THIS%PARAMID=212216 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="swd" THIS%PARAMID=212217 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / &NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="tnr" THIS%PARAMID=212218 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / &NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="tro" THIS%PARAMID=212219 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / &NAMCOMPO_EMIS THIS%SPECIES="SOG2B" THIS%SECTOR="agl" THIS%PARAMID=216221 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" / diff --git a/ifs-test/tests/t255/inidata/ICMCLham7INIT b/ifs-test/tests/t255/inidata/ICMCLham7INIT index 3f2b1f76..02c4da95 120000 --- a/ifs-test/tests/t255/inidata/ICMCLham7INIT +++ b/ifs-test/tests/t255/inidata/ICMCLham7INIT @@ -1 +1 @@ -/ec/res4/hpcperm/nld5163/openifs/oifs_refs/ham7/2023070100/ICMCLham7INIT \ No newline at end of file +PLS_ICMCLham7INIT \ No newline at end of file diff --git a/ifs-test/tests/t255/inidata/ICMCLham7INIT_COMPO b/ifs-test/tests/t255/inidata/ICMCLham7INIT_COMPO new file mode 120000 index 00000000..243008f1 --- /dev/null +++ b/ifs-test/tests/t255/inidata/ICMCLham7INIT_COMPO @@ -0,0 +1 @@ +PLS_ICMCLham7INIT_COMPO \ No newline at end of file diff --git a/ifs-test/tests/t255/inidata/ICMGGham7INIT b/ifs-test/tests/t255/inidata/ICMGGham7INIT index e0977be6..e4324968 120000 --- a/ifs-test/tests/t255/inidata/ICMGGham7INIT +++ b/ifs-test/tests/t255/inidata/ICMGGham7INIT @@ -1 +1 @@ -/ec/res4/hpcperm/nld5163/openifs/oifs_refs/ham7/2023070100/ICMGGham7INIT \ No newline at end of file +PLS_ICMGGham7INIT \ No newline at end of file diff --git a/ifs-test/tests/t255/inidata/ICMGGham7INIUA b/ifs-test/tests/t255/inidata/ICMGGham7INIUA index 76090177..9b80ed00 120000 --- a/ifs-test/tests/t255/inidata/ICMGGham7INIUA +++ b/ifs-test/tests/t255/inidata/ICMGGham7INIUA @@ -1 +1 @@ -/ec/res4/hpcperm/nld5163/openifs/oifs_refs/ham7/2023070100/ICMGGham7INIUA \ No newline at end of file +PLS_ICMGGham7INIUA \ No newline at end of file diff --git a/ifs-test/tests/t255/inidata/ICMSHham7INIT b/ifs-test/tests/t255/inidata/ICMSHham7INIT index 06ec23ff..f4dfa8f6 120000 --- a/ifs-test/tests/t255/inidata/ICMSHham7INIT +++ b/ifs-test/tests/t255/inidata/ICMSHham7INIT @@ -1 +1 @@ -/ec/res4/hpcperm/nld5163/openifs/oifs_refs/ham7/2023070100/ICMSHham7INIT \ No newline at end of file +PLS_ICMSHham7INIT \ No newline at end of file diff --git a/ifs-test/tests/t255/inidata/PLS_ICMCLham7INIT b/ifs-test/tests/t255/inidata/PLS_ICMCLham7INIT new file mode 120000 index 00000000..87b49ff4 --- /dev/null +++ b/ifs-test/tests/t255/inidata/PLS_ICMCLham7INIT @@ -0,0 +1 @@ +/hpcperm/nm6/oifs48r1-data/datahub/ham7/2023070100/ICMCLham7INIT \ No newline at end of file diff --git a/ifs-test/tests/t255/inidata/PLS_ICMCLham7INIT_COMPO b/ifs-test/tests/t255/inidata/PLS_ICMCLham7INIT_COMPO new file mode 120000 index 00000000..4af0964c --- /dev/null +++ b/ifs-test/tests/t255/inidata/PLS_ICMCLham7INIT_COMPO @@ -0,0 +1 @@ +/hpcperm/nm6/oifs48r1-data/datahub/ham7/2023070100/emissions/ICMCL-INIT-COMPO-2023070100-2023070300 \ No newline at end of file diff --git a/ifs-test/tests/t255/inidata/PLS_ICMGGham7INIT b/ifs-test/tests/t255/inidata/PLS_ICMGGham7INIT new file mode 120000 index 00000000..213710c8 --- /dev/null +++ b/ifs-test/tests/t255/inidata/PLS_ICMGGham7INIT @@ -0,0 +1 @@ +/hpcperm/nm6/oifs48r1-data/datahub/ham7/2023070100/ICMGGham7INIT \ No newline at end of file diff --git a/ifs-test/tests/t255/inidata/PLS_ICMGGham7INIUA b/ifs-test/tests/t255/inidata/PLS_ICMGGham7INIUA new file mode 120000 index 00000000..2c9f8be5 --- /dev/null +++ b/ifs-test/tests/t255/inidata/PLS_ICMGGham7INIUA @@ -0,0 +1 @@ +/hpcperm/nm6/oifs48r1-data/datahub/ham7/2023070100/ICMGGham7INIUA \ No newline at end of file diff --git a/ifs-test/tests/t255/inidata/PLS_ICMSHham7INIT b/ifs-test/tests/t255/inidata/PLS_ICMSHham7INIT new file mode 120000 index 00000000..bae56e9e --- /dev/null +++ b/ifs-test/tests/t255/inidata/PLS_ICMSHham7INIT @@ -0,0 +1 @@ +/hpcperm/nm6/oifs48r1-data/datahub/ham7/2023070100/ICMSHham7INIT \ No newline at end of file diff --git a/ifs-test/tests/t255/test_compo_fc_m7/params b/ifs-test/tests/t255/test_compo_fc_m7/params index 1545ce42..f637b61b 100644 --- a/ifs-test/tests/t255/test_compo_fc_m7/params +++ b/ifs-test/tests/t255/test_compo_fc_m7/params @@ -1,2 +1,2 @@ -NPROC=2 -NTHREAD=1 +NPROC=64 +NTHREAD=4 diff --git a/ifs-test/tests/t255/test_compo_fc_m7/setup b/ifs-test/tests/t255/test_compo_fc_m7/setup index 1361f082..c372d979 100644 --- a/ifs-test/tests/t255/test_compo_fc_m7/setup +++ b/ifs-test/tests/t255/test_compo_fc_m7/setup @@ -23,10 +23,8 @@ NVEXTR="7" NCEXTR="137" # NAMRIP -CSTOP=${CSTOP:-"'t2'"} # CSTOP: define num. timesteps -TSTEP=${TSTEP:-"600.000000"} # TSTEP: define time-step in seconds (??) - -NPROC=8 +CSTOP=${CSTOP:-"'t6'"} # CSTOP: define num. timesteps +TSTEP=${TSTEP:-"600.000000"} # TSTEP: define time-step in seconds # NAMCT0: NFRPOS=3 @@ -37,7 +35,7 @@ NFRPOS=3 # Note: In this setup we include some details by blocks to have a # more structured and easier to read setup file. For the final -# namelist please check fort.4 after run the experiment. +# namelist please check the generated fort.4 after running the experiment. cat >> fort.4 << EOF &NAMGFL @@ -117,8 +115,10 @@ cat >> fort.4 << EOF LEPO3RA=true, LO3_CHEM_UV=true, NGHGRAD=20, - NAERMACC=1, + NAERMACC=0, LAER3D=.false., ! LAER3D: which aerosols climatology 2D vs 3D is used + NAEROOPT=1, ! Default (2) not working as of 2024-07-11 + NCLOUDACT=0, ! / &NAMFPC CFPFMT="MODEL", @@ -152,7 +152,7 @@ cat >> fort.4 << EOF LAERGTOP=true, LAERSEDIM=true, LAERSEDIMSS=true, - LAERDRYDP=true, + LAERDRYDP=false, LAERSURF=true, NSSALT=4, NDDUST=2, @@ -184,10 +184,10 @@ cat >> fort.4 << EOF KCHEM_NOXADV=0, LCHEM_ANAO3=false, KCHEM_SOLVE=2, - LCHEM_REVCHEM=false, - LCHEM_BASCOE_JON=false, - LCHEM_BASCOE_HETCHEM=true, - LCHEM_EXTENDJNO2=true, + LCHEM_REVCHEM=false, + LCHEM_BASCOE_JON=false, + LCHEM_BASCOE_HETCHEM=true, + LCHEM_EXTENDJNO2=true, LCHEM_JOUT=false, LCHEM_AEROI=false, LCHEM_O3RAD=true, @@ -198,7 +198,7 @@ cat >> fort.4 << EOF &NAMMCC LMCCEC=true, LMCCIEC=false, - LMCC_COMPO=false, + LMCC_COMPO=true, / EOF diff --git a/scripts/build_test/openifs-test.sh b/scripts/build_test/openifs-test.sh index b5b695d5..5d9eb90b 100755 --- a/scripts/build_test/openifs-test.sh +++ b/scripts/build_test/openifs-test.sh @@ -239,7 +239,7 @@ fi if [[ "$PLATFORM" == "hpc2020" ]] ; then IGT_BUILD_LAUNCHER="${IGT_BUILD_LAUNCHER-srun -c ${NUM_THREADS} --mem=60GB --time=60}" - IGT_TEST_LAUNCHER="${IGT_TEST_LAUNCHER-salloc -n 16 --mem=120GB --time=340}" + IGT_TEST_LAUNCHER="${IGT_TEST_LAUNCHER-salloc -N 2 --qos=np}" else IGT_BUILD_LAUNCHER="${IGT_BUILD_LAUNCHER:-}" IGT_TEST_LAUNCHER="${IGT_TEST_LAUNCHER:-}" From 60aeca51ac4df6cec49cf3264208cda2422b581c Mon Sep 17 00:00:00 2001 From: Ramiro Checa-Garcia Date: Tue, 23 Jul 2024 14:52:48 +0000 Subject: [PATCH 025/129] Moved m7 modules to m7/module/ and m7 non-used modules to m7_nonused --- ifs-source/arpifs/{phys_ec => m7/module}/mo_conv.F90 | 0 ifs-source/arpifs/{phys_ec => m7/module}/mo_ham_activ.F90 | 0 ifs-source/arpifs/{phys_ec => m7/module}/mo_ham_drydep.F90 | 0 ifs-source/arpifs/{phys_ec => m7/module}/mo_ham_rad_data.F90 | 0 ifs-source/arpifs/{phys_ec => m7/module}/mo_ham_species.F90 | 0 ifs-source/arpifs/{phys_ec => m7/module}/mo_ham_subm.F90 | 0 ifs-source/arpifs/{phys_ec => m7/module}/mo_ham_tools.F90 | 0 ifs-source/arpifs/{phys_ec => m7/module}/mo_ham_wetdep.F90 | 0 ifs-source/arpifs/{phys_ec => m7/module}/mo_hammoz_drydep.F90 | 0 .../arpifs/{phys_ec => m7/module}/mo_hammoz_sedimentation.F90 | 0 ifs-source/arpifs/{phys_ec => m7/module}/mo_hammoz_wetdep.F90 | 0 ifs-source/arpifs/{phys_ec => m7/module}/mo_tracer_processes.F90 | 0 ifs-source/arpifs/{phys_ec => m7_nonused}/mo_constants.F90 | 0 .../arpifs/{phys_ec => m7_nonused}/mo_convert_concentrations.F90 | 0 14 files changed, 0 insertions(+), 0 deletions(-) rename ifs-source/arpifs/{phys_ec => m7/module}/mo_conv.F90 (100%) rename ifs-source/arpifs/{phys_ec => m7/module}/mo_ham_activ.F90 (100%) rename ifs-source/arpifs/{phys_ec => m7/module}/mo_ham_drydep.F90 (100%) rename ifs-source/arpifs/{phys_ec => m7/module}/mo_ham_rad_data.F90 (100%) rename ifs-source/arpifs/{phys_ec => m7/module}/mo_ham_species.F90 (100%) rename ifs-source/arpifs/{phys_ec => m7/module}/mo_ham_subm.F90 (100%) rename ifs-source/arpifs/{phys_ec => m7/module}/mo_ham_tools.F90 (100%) rename ifs-source/arpifs/{phys_ec => m7/module}/mo_ham_wetdep.F90 (100%) rename ifs-source/arpifs/{phys_ec => m7/module}/mo_hammoz_drydep.F90 (100%) rename ifs-source/arpifs/{phys_ec => m7/module}/mo_hammoz_sedimentation.F90 (100%) rename ifs-source/arpifs/{phys_ec => m7/module}/mo_hammoz_wetdep.F90 (100%) rename ifs-source/arpifs/{phys_ec => m7/module}/mo_tracer_processes.F90 (100%) rename ifs-source/arpifs/{phys_ec => m7_nonused}/mo_constants.F90 (100%) rename ifs-source/arpifs/{phys_ec => m7_nonused}/mo_convert_concentrations.F90 (100%) diff --git a/ifs-source/arpifs/phys_ec/mo_conv.F90 b/ifs-source/arpifs/m7/module/mo_conv.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/mo_conv.F90 rename to ifs-source/arpifs/m7/module/mo_conv.F90 diff --git a/ifs-source/arpifs/phys_ec/mo_ham_activ.F90 b/ifs-source/arpifs/m7/module/mo_ham_activ.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/mo_ham_activ.F90 rename to ifs-source/arpifs/m7/module/mo_ham_activ.F90 diff --git a/ifs-source/arpifs/phys_ec/mo_ham_drydep.F90 b/ifs-source/arpifs/m7/module/mo_ham_drydep.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/mo_ham_drydep.F90 rename to ifs-source/arpifs/m7/module/mo_ham_drydep.F90 diff --git a/ifs-source/arpifs/phys_ec/mo_ham_rad_data.F90 b/ifs-source/arpifs/m7/module/mo_ham_rad_data.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/mo_ham_rad_data.F90 rename to ifs-source/arpifs/m7/module/mo_ham_rad_data.F90 diff --git a/ifs-source/arpifs/phys_ec/mo_ham_species.F90 b/ifs-source/arpifs/m7/module/mo_ham_species.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/mo_ham_species.F90 rename to ifs-source/arpifs/m7/module/mo_ham_species.F90 diff --git a/ifs-source/arpifs/phys_ec/mo_ham_subm.F90 b/ifs-source/arpifs/m7/module/mo_ham_subm.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/mo_ham_subm.F90 rename to ifs-source/arpifs/m7/module/mo_ham_subm.F90 diff --git a/ifs-source/arpifs/phys_ec/mo_ham_tools.F90 b/ifs-source/arpifs/m7/module/mo_ham_tools.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/mo_ham_tools.F90 rename to ifs-source/arpifs/m7/module/mo_ham_tools.F90 diff --git a/ifs-source/arpifs/phys_ec/mo_ham_wetdep.F90 b/ifs-source/arpifs/m7/module/mo_ham_wetdep.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/mo_ham_wetdep.F90 rename to ifs-source/arpifs/m7/module/mo_ham_wetdep.F90 diff --git a/ifs-source/arpifs/phys_ec/mo_hammoz_drydep.F90 b/ifs-source/arpifs/m7/module/mo_hammoz_drydep.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/mo_hammoz_drydep.F90 rename to ifs-source/arpifs/m7/module/mo_hammoz_drydep.F90 diff --git a/ifs-source/arpifs/phys_ec/mo_hammoz_sedimentation.F90 b/ifs-source/arpifs/m7/module/mo_hammoz_sedimentation.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/mo_hammoz_sedimentation.F90 rename to ifs-source/arpifs/m7/module/mo_hammoz_sedimentation.F90 diff --git a/ifs-source/arpifs/phys_ec/mo_hammoz_wetdep.F90 b/ifs-source/arpifs/m7/module/mo_hammoz_wetdep.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/mo_hammoz_wetdep.F90 rename to ifs-source/arpifs/m7/module/mo_hammoz_wetdep.F90 diff --git a/ifs-source/arpifs/phys_ec/mo_tracer_processes.F90 b/ifs-source/arpifs/m7/module/mo_tracer_processes.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/mo_tracer_processes.F90 rename to ifs-source/arpifs/m7/module/mo_tracer_processes.F90 diff --git a/ifs-source/arpifs/phys_ec/mo_constants.F90 b/ifs-source/arpifs/m7_nonused/mo_constants.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/mo_constants.F90 rename to ifs-source/arpifs/m7_nonused/mo_constants.F90 diff --git a/ifs-source/arpifs/phys_ec/mo_convert_concentrations.F90 b/ifs-source/arpifs/m7_nonused/mo_convert_concentrations.F90 similarity index 100% rename from ifs-source/arpifs/phys_ec/mo_convert_concentrations.F90 rename to ifs-source/arpifs/m7_nonused/mo_convert_concentrations.F90 From 7c506afb07d3f45c4e749d0bdd548a0601671e7f Mon Sep 17 00:00:00 2001 From: Lianghai Wu Date: Fri, 2 Aug 2024 19:08:13 +0000 Subject: [PATCH 026/129] OIFS-546 fix aerosol optical properties bugs --- ifs-source/arpifs/m7/module/mo_ham_m7.F90 | 13 ++++++------ ifs-source/arpifs/m7/module/mo_ham_rad.F90 | 4 ++-- .../arpifs/m7/phys_ec/tm5m7_src_dust.F90 | 21 ++++++++++--------- ifs-source/arpifs/setup/su_surf_flds.F90 | 2 +- 4 files changed, 21 insertions(+), 19 deletions(-) diff --git a/ifs-source/arpifs/m7/module/mo_ham_m7.F90 b/ifs-source/arpifs/m7/module/mo_ham_m7.F90 index 14e768df..186782de 100644 --- a/ifs-source/arpifs/m7/module/mo_ham_m7.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_m7.F90 @@ -838,6 +838,7 @@ SUBROUTINE m7_averageproperties(kproma, kbdim, klev, krow, paernl, paerml, pttn, REAL(dp) :: zinsmas(kbdim,klev,nclass) ! mean mass for single particle per mode REAL(dp) :: ztmp1(kbdim,klev) !SF #458 temporary variable + REAL(dp) :: ztmp2(kbdim,klev) !SF #458 temporary variable LOGICAL :: ll1(kbdim,klev) !SF #458 temporary logical array @@ -874,8 +875,8 @@ SUBROUTINE m7_averageproperties(kproma, kbdim, klev, krow, paernl, paerml, pttn, .AND. (paerml(1:kproma,:,jn) > cmin_aerml) ztmp1(1:kproma,:) = MERGE(paernl(1:kproma,:,jclass), 1._dp, ll1(1:kproma,:)) !SF 1. is a dummy val. - ztmp1(1:kproma,:) = zunitfac*paerml(1:kproma,:,jn)/ztmp1(1:kproma,:) - pttn(1:kproma,:,jn) = MERGE(ztmp1(1:kproma,:), zaltern_val, ll1(1:kproma,:)) + ztmp2(1:kproma,:) = zunitfac*paerml(1:kproma,:,jn)/ztmp1(1:kproma,:) + pttn(1:kproma,:,jn) = MERGE(ztmp2(1:kproma,:), zaltern_val, ll1(1:kproma,:)) !< Here it i simportant to explain what are 9 , 12 @@ -204,6 +204,7 @@ SUBROUTINE TM5M7_SRC_DUST( YDEPHY, YDEAERMAP, YDEAERSRC, & ZFLX_SDUST(KIDIA:KFDIA,1:9,1:12)=0._JPRB if (NDDUST==4)then ! Make local copy: +uthp = 0._JPRB SOIL_TYPE(KIDIA:KFDIA)=PSOIL_TYPE(KIDIA:KFDIA) ! init xeff=10.0_JPRB @@ -808,7 +809,7 @@ SUBROUTINE TM5M7_SRC_DUST( YDEPHY, YDEAERMAP, YDEAERSRC, & !ZGRDLAT2=ZGRDLAT*0.55_JPRB !ZDDUAER(:) = 1.00_JPRB -KBINDD=3 +!KBINDD=3 RDDUAER(:) = 0.0_JPRB RDDUSRC(:)= 0.0_JPRB diff --git a/ifs-source/arpifs/setup/su_surf_flds.F90 b/ifs-source/arpifs/setup/su_surf_flds.F90 index 8cc22c7b..ac49c894 100644 --- a/ifs-source/arpifs/setup/su_surf_flds.F90 +++ b/ifs-source/arpifs/setup/su_surf_flds.F90 @@ -1329,7 +1329,7 @@ SUBROUTINE SU_SURF_FLDS(YDDIMV,YDSURF,YDMODEL,LDVERBOSE) !IF (TRIM(AERO_SCHEME) == "tm5m7" .or. TRIM(AERO_SCHEME) == "hamm7" ) THEN ! IREQIN=1 !ELSE - IREQIN=-1 + IREQIN=1 !END IF CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YSOILTYPE, & From c20e54409057fdd55126e7d9cd331c7d6b6d185a Mon Sep 17 00:00:00 2001 From: Lianghai Wu Date: Fri, 16 Aug 2024 07:17:13 +0000 Subject: [PATCH 027/129] use runtime path for M7 mie tables --- ifs-source/arpifs/m7/module/mo_ham_rad.F90 | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ifs-source/arpifs/m7/module/mo_ham_rad.F90 b/ifs-source/arpifs/m7/module/mo_ham_rad.F90 index 55640634..56ecfeb2 100755 --- a/ifs-source/arpifs/m7/module/mo_ham_rad.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_rad.F90 @@ -1074,7 +1074,6 @@ SUBROUTINE ham_rad(kproma, kbdim, klev, krow, kpband, kb_sw, & END SELECT IF (itable == 1) THEN - CALL ham_rad_fitplus(kproma, kbdim, klev, & zxx, znr2d, zni2d, & itable, lut1_sigma, zsigma2d, & @@ -1444,7 +1443,6 @@ SUBROUTINE ham_rad_fitplus(kproma, kbdim, klev, & IF ((pxx(jl,jk)>=x0_min(ktable)) .AND. (pxx(jl,jk)<=x0_max(ktable)) .AND. & (pnr(jl,jk)>=nr_min(ktable)) .AND. (pnr(jl,jk)<=nr_max(ktable)) .AND. & (pni(jl,jk)>=ni_min(ktable)) .AND. (pni(jl,jk)<=ni_max(ktable)) ) THEN - Ndis=NINT( (LOG(pxx(jl,jk))-log_x0_min(ktable)) / & (log_x0_max(ktable) - log_x0_min(ktable))*REAL(Ndismax(ktable),dp) ) Ndis=MIN(Ndismax(ktable)-1,MAX(0,Ndis)) @@ -1506,6 +1504,7 @@ SUBROUTINE ham_rad_initialize(nclass) ! commented by Lwu USE YOMMP0 ,ONLY : MYPROC USE MPL_MODULE ,ONLY : MPL_BROADCAST + USE TM5M7_DATA, ONLY : TM5M7_DATADIR USE TM5M7_OPTICS_DATA, ONLY : NASWBAND,ASWBAND,wavenum1=>ALWWN1, wavenum2=>ALWWN2 #endif USE mo_read_netcdf77, ONLY: read_var_nf77_3d @@ -1592,7 +1591,8 @@ SUBROUTINE ham_rad_initialize(nclass) cfile='lut_optical_properties.nc' #else IF (MYPROC==RPRC) THEN !alaakso MUUTA TAMA - cfile='/ec/res4/hpcperm/nklw/oifs48r1-data/lut_m7/lut_optical_properties_M7.nc' + !cfile='/ec/res4/hpcperm/nklw/oifs48r1-data/lut_m7/lut_optical_properties_M7.nc' + cfile=TRIM(TM5M7_DATADIR)//'lut_optical_properties_M7.nc' #endif @@ -1651,11 +1651,11 @@ SUBROUTINE ham_rad_initialize(nclass) cfile='lut_optical_properties_lw.nc' #else IF (MYPROC==RPRC) THEN !alaakso MUUTA TAMA - cfile='/ec/res4/hpcperm/nklw/oifs48r1-data/lut_m7/lut_optical_properties_M7_lw.nc' + !cfile='/ec/res4/hpcperm/nklw/oifs48r1-data/lut_m7/lut_optical_properties_M7_lw.nc' + cfile=TRIM(TM5M7_DATADIR)//'lut_optical_properties_lw_M7.nc' #endif CALL message('ham_rad_initialize', 'Reading lookup table from '//TRIM(ADJUSTL(cfile)), level=em_info) INQUIRE (file=cfile,exist=lex) - IF (lex) THEN CALL read_var_nf77_3d (cfile, "nr", "ni", "dis", & "sigma_1_lw", lut3_sigma, ierr ) From 8a2a4315e62089fa90a0f8230d1274063a841158 Mon Sep 17 00:00:00 2001 From: Lianghai Wu Date: Thu, 22 Aug 2024 07:45:53 +0000 Subject: [PATCH 028/129] Pull request #15: Fix aerosol properties computed by HAMM7 (OIFS-546) Merge in ~NM6/openifs-48r1 from OIFS-546-updates to knmi-m7 Squashed commit of the following: commit f2c67343a0e8d3f6c9d3f11be6fa33fb3682a6e2 Author: Philippe Le Sager Date: Thu Aug 22 08:59:35 2024 +0200 Trap missing M7 lookup table files; account for them in T255-M7 test Also switch back to default HAM optical code for T255-M7 ifstest, since it is now working after reading the lookup tables. Some cleanup (mainly remove hardcoded paths) commit 5d5c68a35564be432783db34ca2a258b7fee54a3 Author: Lianghai Wu Date: Fri Aug 16 07:17:13 2024 +0000 use runtime path for M7 mie tables commit 09ef1a2183e4edf604d9c5ae32c051b75f662056 Author: Lianghai Wu Date: Fri Aug 2 19:08:13 2024 +0000 OIFS-546 fix aerosol optical properties bugs --- ifs-source/arpifs/m7/module/mo_exception.F90 | 9 ++++++++- ifs-source/arpifs/m7/module/mo_ham_rad.F90 | 9 ++------- ifs-source/arpifs/m7/module/tm5m7_data.F90 | 7 +++---- .../arpifs/m7/phys_ec/tm5m7_optics_init.F90 | 3 --- ifs-source/arpifs/setup/su_surf_flds.F90 | 19 +++---------------- ifs-test/tests/compo_data/m7 | 2 +- ifs-test/tests/t255/CMakeLists.txt | 6 ++++++ ifs-test/tests/t255/test_compo_fc_m7/setup | 4 ++-- 8 files changed, 25 insertions(+), 34 deletions(-) diff --git a/ifs-source/arpifs/m7/module/mo_exception.F90 b/ifs-source/arpifs/m7/module/mo_exception.F90 index fd0e4da9..c7946f46 100644 --- a/ifs-source/arpifs/m7/module/mo_exception.F90 +++ b/ifs-source/arpifs/m7/module/mo_exception.F90 @@ -40,6 +40,10 @@ MODULE mo_exception INTEGER :: number_of_warnings = 0 INTEGER :: number_of_errors = 0 +#ifndef HAMMOZ +#include "abor1.intfb.h" +#endif + CONTAINS SUBROUTINE debug_messages_on @@ -150,7 +154,10 @@ SUBROUTINE finish (name, text, exit_no) #endif #ifndef HAMMOZ - STOP 'mo_exception: finish ..' + ! Ideally we should check if we are in OpenIFS. Now assume it is the case: + CALL ABOR1(" HAMM7 AEROSOL SCHEME " ) + + ! STOP 'mo_exception: finish ..' #endif END SUBROUTINE finish diff --git a/ifs-source/arpifs/m7/module/mo_ham_rad.F90 b/ifs-source/arpifs/m7/module/mo_ham_rad.F90 index 56ecfeb2..4b8a758d 100755 --- a/ifs-source/arpifs/m7/module/mo_ham_rad.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_rad.F90 @@ -1591,11 +1591,9 @@ SUBROUTINE ham_rad_initialize(nclass) cfile='lut_optical_properties.nc' #else IF (MYPROC==RPRC) THEN !alaakso MUUTA TAMA - !cfile='/ec/res4/hpcperm/nklw/oifs48r1-data/lut_m7/lut_optical_properties_M7.nc' cfile=TRIM(TM5M7_DATADIR)//'lut_optical_properties_M7.nc' #endif - CALL message('ham_rad_initialize', 'Reading lookup table from '//TRIM(ADJUSTL(cfile)), level=em_info) INQUIRE (file=cfile,exist=lex) @@ -1618,9 +1616,8 @@ SUBROUTINE ham_rad_initialize(nclass) "pp180_2", lut2_pp180, ierr ) ELSE - CALL message('ham_rad_initialize','file '//TRIM(ADJUSTL(cfile))//' not available', level=em_error) - + CALL finish('ham_rad_initialize','file '//TRIM(ADJUSTL(cfile))//' missing!',1) END IF END IF @@ -1651,7 +1648,6 @@ SUBROUTINE ham_rad_initialize(nclass) cfile='lut_optical_properties_lw.nc' #else IF (MYPROC==RPRC) THEN !alaakso MUUTA TAMA - !cfile='/ec/res4/hpcperm/nklw/oifs48r1-data/lut_m7/lut_optical_properties_M7_lw.nc' cfile=TRIM(TM5M7_DATADIR)//'lut_optical_properties_lw_M7.nc' #endif CALL message('ham_rad_initialize', 'Reading lookup table from '//TRIM(ADJUSTL(cfile)), level=em_info) @@ -1662,9 +1658,8 @@ SUBROUTINE ham_rad_initialize(nclass) CALL read_var_nf77_3d (cfile, "nr", "ni", "dis", & "sigma_2_lw", lut4_sigma, ierr ) ELSE - CALL message('ham_rad_initialize','file '//TRIM(ADJUSTL(cfile))//' not available', level=em_error) - + CALL finish('ham_rad_initialize','file '//TRIM(ADJUSTL(cfile))//' missing!',1) END IF END IF diff --git a/ifs-source/arpifs/m7/module/tm5m7_data.F90 b/ifs-source/arpifs/m7/module/tm5m7_data.F90 index f4185e91..e2bc7054 100644 --- a/ifs-source/arpifs/m7/module/tm5m7_data.F90 +++ b/ifs-source/arpifs/m7/module/tm5m7_data.F90 @@ -18,11 +18,10 @@ MODULE TM5M7_DATA IMPLICIT NONE SAVE - -! Location of lookup table data. Default location is at the directory of the executable -!CHARACTER(LEN=256) :: TM5M7_DATADIR='/perm/ms/nl/nk9/oifs43r3/data/cifs_input/tm5m7/optics/' + +! Location of lookup tables and refractive indices = directory of the executable CHARACTER(LEN=256) :: TM5M7_DATADIR='./' - + TYPE MODAL_DATA REAL(KIND=JPRB), DIMENSION(:,:), POINTER :: d2 ! KLON, KLEV REAL(KIND=JPRB), DIMENSION(:) , POINTER :: surf ! KLON diff --git a/ifs-source/arpifs/m7/phys_ec/tm5m7_optics_init.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_optics_init.F90 index dd365a46..38fc0849 100644 --- a/ifs-source/arpifs/m7/phys_ec/tm5m7_optics_init.F90 +++ b/ifs-source/arpifs/m7/phys_ec/tm5m7_optics_init.F90 @@ -116,10 +116,8 @@ SUBROUTINE TM5M7_OPTICS_INIT(NWAV,WDEP) ! identify filenames from input lookuptable = "lookup_table.nc" - !CL_FILE_NAME="/perm/ms/nl/nm6/TM5_INPUT/photolysis/lookup_table.nc" CL_FILE_NAME = TRIM(TM5M7_DATADIR)//lookuptable - CALL LOAD_TM5M7_OPTICS_DATA_1D(CL_FILE_NAME, 'mr', n_rir,n1r) CALL LOAD_TM5M7_OPTICS_DATA_1D(CL_FILE_NAME, 'mi', n_rii,kval) CALL LOAD_TM5M7_OPTICS_DATA_1D(CL_FILE_NAME, 'x' , n_x ,xs) @@ -133,7 +131,6 @@ SUBROUTINE TM5M7_OPTICS_INIT(NWAV,WDEP) CALL LOAD_TM5M7_OPTICS_DATA_3D(CL_FILE_NAME, 'g_159', n_x,n_rir,n_rii,g_159) CALL LOAD_TM5M7_OPTICS_DATA_3D(CL_FILE_NAME, 'g_200', n_x,n_rir,n_rii,g_200) - refractive_indices = "refractive_indices_hdfstyle.nc" CL_FILE_NAME = TRIM(TM5M7_DATADIR)//refractive_indices diff --git a/ifs-source/arpifs/setup/su_surf_flds.F90 b/ifs-source/arpifs/setup/su_surf_flds.F90 index ac49c894..0d6ed30e 100644 --- a/ifs-source/arpifs/setup/su_surf_flds.F90 +++ b/ifs-source/arpifs/setup/su_surf_flds.F90 @@ -1324,22 +1324,12 @@ SUBROUTINE SU_SURF_FLDS(YDDIMV,YDSURF,YDMODEL,LDVERBOSE) !TM5/M7 ancillary data IF (TRIM(AERO_SCHEME) == "tm5m7" .or. TRIM(AERO_SCHEME) == "hamm7" ) THEN - YSD_VF%YSOILTYPE => YSD_VF%YVF(YSD_VFD%IPTR) - !VH 14 Feb. 2024: for time being de-activate request for field 210055. But this has to be re-activated rather sooner than latesr, likely. - !IF (TRIM(AERO_SCHEME) == "tm5m7" .or. TRIM(AERO_SCHEME) == "hamm7" ) THEN - ! IREQIN=1 - !ELSE + YSD_VF%YSOILTYPE => YSD_VF%YVF(YSD_VFD%IPTR) IREQIN=1 - !END IF - CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YSOILTYPE, & - - ! RCHG -> Here I can't remember if the needed string length for CDNAME is 15 or 16. Be careful about last space. - & KGRIB=NGRBSOILTYPE, CDNAME='TM5M7 soil type ',KTRAJ=2,KREQIN=IREQIN) + CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YSOILTYPE, & + & KGRIB=NGRBSOILTYPE, CDNAME='TM5M7 soil type ',KTRAJ=2,KREQIN=IREQIN) END IF - - - IF (NACTAERO > 0) THEN ! ZKFIXME: revert to LAEROSFC once emission refactoring complete IF (LAERCHEM) THEN IREQIN=-1 @@ -1357,9 +1347,6 @@ SUBROUTINE SU_SURF_FLDS(YDDIMV,YDSURF,YDMODEL,LDVERBOSE) & KGRIB=NGRBAERSO2DD,CDNAME='SO2 dry dep vel.',KTRAJ=2,KREQIN=IREQIN) ENDIF - - - IF (NACTAERO > 0) THEN ! GLOMAP somehow still uses its own DMS input and SO2 precursor even with LAERCHEM... IF (LAERCHEM .OR. NDMSO==0 .OR. .NOT. LOCNDMS) THEN diff --git a/ifs-test/tests/compo_data/m7 b/ifs-test/tests/compo_data/m7 index da2a9f6f..0b7e980a 120000 --- a/ifs-test/tests/compo_data/m7 +++ b/ifs-test/tests/compo_data/m7 @@ -1 +1 @@ -/ec/res4/hpcperm/nld5163/openifs/oifs_data/48r1/ifsdata_m7 \ No newline at end of file +/hpcperm/nm6/oifs48r1-data/non-distributed/chemistry/ECHAM-HAMMOZ \ No newline at end of file diff --git a/ifs-test/tests/t255/CMakeLists.txt b/ifs-test/tests/t255/CMakeLists.txt index 540b0987..9b7404a0 100644 --- a/ifs-test/tests/t255/CMakeLists.txt +++ b/ifs-test/tests/t255/CMakeLists.txt @@ -63,6 +63,12 @@ function( add_ifs_test TARGET ) execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink ${CMAKE_CURRENT_SOURCE_DIR}/inidata/ICMCLham7INIT_COMPO ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/ICMCLham7INIT_COMPO ) + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${CMAKE_CURRENT_SOURCE_DIR}/../compo_data/m7/lut_optical_properties_lw_M7.nc ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/lut_optical_properties_lw_M7.nc) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${CMAKE_CURRENT_SOURCE_DIR}/../compo_data/m7/lut_optical_properties_M7.nc ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/lut_optical_properties_M7.nc) + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink ${CMAKE_CURRENT_SOURCE_DIR}/../compo_data/m7/lookup_table.nc ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/lookup_table.nc) diff --git a/ifs-test/tests/t255/test_compo_fc_m7/setup b/ifs-test/tests/t255/test_compo_fc_m7/setup index c372d979..92edc150 100644 --- a/ifs-test/tests/t255/test_compo_fc_m7/setup +++ b/ifs-test/tests/t255/test_compo_fc_m7/setup @@ -117,8 +117,8 @@ cat >> fort.4 << EOF NGHGRAD=20, NAERMACC=0, LAER3D=.false., ! LAER3D: which aerosols climatology 2D vs 3D is used - NAEROOPT=1, ! Default (2) not working as of 2024-07-11 - NCLOUDACT=0, ! + NAEROOPT=2, + NCLOUDACT=0, / &NAMFPC CFPFMT="MODEL", From e3f4fa5bbf45750425bb9b1836be7d95785a809d Mon Sep 17 00:00:00 2001 From: Lianghai Wu Date: Fri, 20 Sep 2024 07:54:13 +0000 Subject: [PATCH 029/129] Pull request #13: Import 43r3 updates from 2024 first semester OIFS-544 Merge in ~NM6/openifs-48r1 from OIFS-544-import-43r3-m7-updates-into-48r1 to knmi-m7 Squashed commit of the following: commit bcd3f85ab7e026790b5d500e9c4804d69bffc57e Author: Philippe Le Sager Date: Fri Sep 20 09:24:19 2024 +0200 Bring last changes for liquid SO4 fixes from 43r3 (OIFS-504) commit 19da085f46d9756f93da544816a38e4795c19a84 Author: Philippe Le Sager Date: Fri Sep 20 09:05:59 2024 +0200 Force ice/water number densities to at least 1/cm3 commit 8b56a9fba429604a88899b5b034b4d227b60f894 Author: Philippe Le Sager Date: Thu Sep 19 14:55:43 2024 +0200 Add emissions of number of particles to ifs-test/T255-M7 commit fd92680f51a8104d1ed1622012750c6fdb892409 Author: Philippe Le Sager Date: Wed Sep 18 15:12:22 2024 +0200 Initialize tracer tendencies sent from chemistry to aerosols scheme commit 92a18cb0beabb8db57a2fe59f69b25b5763646e6 Author: Philippe Le Sager Date: Mon Sep 16 14:55:30 2024 +0200 Update namelist for T255/M7 test commit b7b5f97c61286a247158e3ad9d5aa90bf2bf8b39 Author: Philippe Le Sager Date: Mon Sep 16 12:59:44 2024 +0200 Switch off OpenMP in T255/M7 test commit 8d660357c3c4636fc8b88f073a6987a4c0056dcd Author: Philippe Le Sager Date: Thu Sep 12 17:21:49 2024 +0200 Fix link for t255 test, and very minor cleanup commit c6911d363dfd9790fd016a4948d4080b8e4704c6 Author: Philippe Le Sager Date: Thu Sep 12 14:45:27 2024 +0200 Prevent FPE due to uninitialized data with GNU commit 1a2cf0a3c3807d7a23a101016e987986e6f8ecc6 Author: Philippe Le Sager Date: Mon Sep 9 19:14:13 2024 +0200 Switch from tm5_wetchem to tm5_wetchem_m7 in case of M7 commit 658f3c947d403a1df4d1a72ce7e14e437159eabd Author: Philippe Le Sager Date: Mon Sep 9 19:05:07 2024 +0200 Fix SO4 tendency (partial) commit e08c3159f4b5c355231f8aed06d559df2f0d22d5 Author: Philippe Le Sager Date: Mon Sep 9 18:59:44 2024 +0200 Correct initial concentration of SO4 in case of M7 in chemistry commit 5456159041639ceefec9e34d0856d41804dd0a08 Author: Lianghai Wu Date: Tue Jun 25 11:48:59 2024 +0000 OIFS-544 merge 43r3 updates into 48r1 - Add implicit solver for sedimentation - Account for two case (convective and stratiform) for wet dep --- ifs-source/arpifs/chem/chem_main.F90 | 33 +- ifs-source/arpifs/chem/chem_tm5.F90 | 60 ++- ifs-source/arpifs/m7/chem/tm5_wetchem_m7.F90 | 48 +-- .../arpifs/m7/module/mo_ham_sedimentation.F90 | 86 +++- ifs-source/arpifs/m7/module/mo_ham_subm.F90 | 4 +- ifs-source/arpifs/m7/module/mo_ham_wetdep.F90 | 88 ++-- .../m7/module/mo_hammoz_sedimentation.F90 | 12 +- .../arpifs/m7/module/mo_hammoz_wetdep.F90 | 12 +- .../arpifs/m7/module/mo_tracer_processes.F90 | 16 +- .../arpifs/m7/phys_ec/hamm7_interface.F90 | 402 ++++++++++-------- .../arpifs/m7/phys_ec/tm5m7_src_dust.F90 | 31 +- ifs-source/arpifs/m7/phys_ec/tm5m7_src_ss.F90 | 2 +- ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 | 3 +- ifs-source/arpifs/phys_radi/suecrad.F90 | 2 +- ifs-test/tests/t255/CMakeLists.txt | 2 +- .../tests/t255/common/m7/m7_compoemis.nml | 4 +- .../t255/inidata/PLS_ICMCLham7INIT_COMPO | 2 +- ifs-test/tests/t255/test_compo_fc_m7/params | 4 +- ifs-test/tests/t255/test_compo_fc_m7/setup | 41 +- 19 files changed, 468 insertions(+), 384 deletions(-) diff --git a/ifs-source/arpifs/chem/chem_main.F90 b/ifs-source/arpifs/chem/chem_main.F90 index fdcafa00..d539aa00 100644 --- a/ifs-source/arpifs/chem/chem_main.F90 +++ b/ifs-source/arpifs/chem/chem_main.F90 @@ -82,7 +82,7 @@ SUBROUTINE CHEM_MAIN & ! OUTPUTS: ! ------- ! PTENC (KLON,KLEV,KTRAC) : TENDENCY OF CONCENTRATION OF TRACERS including chemistry(kg/kg s-1) -! PCHEM2AER (KLON,KLEV,4) : TENDENCY OF Selected TRACERS because specific reactions (kg/kg s-1) +! PCHEM2AER (KLON,KLEV,NCHEM2AER) : TENDENCY OF Selected TRACERS because specific reactions (kg/kg s-1) ! PCHEM2GHG (KLON,KLEV,NCHEM2GHG) : TENDENCY OF Selected TRACERS because specific reactions. ! 1. Field 1 containing CH4 loss rate ( s-1) ! 2. tropospheric CO2 production tendency due to CO oxidation [kg CO2/kg/s] @@ -255,6 +255,7 @@ SUBROUTINE CHEM_MAIN & REAL(KIND=JPRB) :: ZCOTRA(KLON,KLEV,3) ! 3 traceurs contrails, parametrisation à implementer REAL(KIND=JPRB) :: ZEMIS(KLON,KLEV,3) ! 3 especes emises par l'aviation, parametrisation à implementer REAL(KIND=JPRB) :: ZAREAD_NAT(KLON,KLEV),ZAREAD_ICE(KLON,KLEV),ZAREAD_SUL(KLON,KLEV) +REAL(KIND=JPRB) :: PSO4_LPROD(KLON) LOGICAL :: LLCHECK_METEO, LLTENDUPDT !------------------------------------------------------------------------ !------------------------------------------------------------------------ @@ -293,7 +294,7 @@ SUBROUTINE CHEM_MAIN & & LCHEM_TROPO=>YDCOMPO%LCHEM_TROPO, RCH4CONST=>YDCHEM%RCH4CONST, & & LCHEM_ARPCLIM=>YDCHEM%LCHEM_ARPCLIM, & & LAERCHEM=>YGFL%LAERCHEM, LAERNITRATE => YDCOMPO%LAERNITRATE, KCHEM_WETDEP =>YDCHEM%KCHEM_WETDEP, & - & LAERSOA=>YDCOMPO%LAERSOA,LAERSOA_COUPLED=>YDCOMPO%LAERSOA_COUPLED ) + & LAERSOA=>YDCOMPO%LAERSOA,LAERSOA_COUPLED=>YDCOMPO%LAERSOA_COUPLED,AERO_SCHEME=>YDCOMPO%AERO_SCHEME ) ! LLTENDUPDT=.TRUE. @@ -390,9 +391,9 @@ SUBROUTINE CHEM_MAIN & ENDIF ENDDO -!Initialize PCHEM2GHG to zero +!Initialize PCHEM2GHG/PCHEM2AER to zero PCHEM2GHG(KIDIA:KFDIA,1:KLEV,1:NCHEM2GHG)=0.0_JPRB - +PCHEM2AER(KIDIA:KFDIA,1:KLEV,1:NCHEM2AER)=0.0_JPRB ! copy meto input in local arrays ZALB(KIDIA:KFDIA) = PALB(KIDIA:KFDIA) @@ -612,22 +613,30 @@ SUBROUTINE CHEM_MAIN & CASE ("tm5") CALL CHEM_TM5(YDVAB,YDDIMV,YDMODEL,NSTEP, KIDIA , KFDIA , KLON, KLEV , KVCLIS, NACTAERO ,& - & PTSTEP ,ZDELP, PRS1, PRSF1, PGEOH, ZQP, PTP,& - & ZLP, ZIP, ZAP, ZPTROP, ZALB, PWND, PLSM, ZCSZA, PGELAT, PGELAM,& - & PGEMU, PKOZO, IKLEVTROP, PDV, ZCON, ZTENC1, ZBUDR, ZBUDJ, ZBUDX, ZOUT,& - & PAEROC,PWETDIAM, PWETVOL,PND, PAERAOT, PAERAAOT, PAERASY, ZSOGTOSOA, & - & PCHEM2GHG) + & PTSTEP ,ZDELP, PRS1, PRSF1, PGEOH, ZQP, PTP,& + & ZLP, ZIP, ZAP, ZPTROP, ZALB, PWND, PLSM, ZCSZA, PGELAT, PGELAM,& + & PGEMU, PKOZO, IKLEVTROP, PDV, ZCON, ZTENC1, ZBUDR, ZBUDJ, ZBUDX, ZOUT,& + & PAEROC,PWETDIAM, PWETVOL,PND, PAERAOT, PAERAAOT, PAERASY, ZSOGTOSOA, & + & PCHEM2GHG, PSO4_LPROD) CALL CHEM_DECAY(YGFL,KIDIA,KFDIA,KLON,KLEV,PTSTEP, PRSF1, PGELAT, ZCON,ZTENC1) ! output for aerosol scheme IF (NACTAERO > 0 .AND. LAERCHEM) THEN - PCHEM2AER(KIDIA:KFDIA,1:KLEV,1) = ZTENC1(KIDIA:KFDIA,1:KLEV,ISO4_TM5) -ZTENC0(KIDIA:KFDIA,1:KLEV,ISO4_TM5) - PCHEM2AER(KIDIA:KFDIA,1:KLEV,2) = -1.0_JPRB*ZBUDR(KIDIA:KFDIA,1:KLEV,ISO2_TM5) - PCHEM2AER(KIDIA:KFDIA,1:KLEV,3) = ZTENC1(KIDIA:KFDIA,1:KLEV,ISO2_TM5) - ZTENC0(KIDIA:KFDIA,1:KLEV,ISO2_TM5) + PCHEM2AER(KIDIA:KFDIA,1:KLEV,1) = ZTENC1(KIDIA:KFDIA,1:KLEV,ISO4_TM5) -ZTENC0(KIDIA:KFDIA,1:KLEV,ISO4_TM5) ZTENC1(KIDIA:KFDIA,1:KLEV,ISO4_TM5) = ZTENC0(KIDIA:KFDIA,1:KLEV,ISO4_TM5) + + SELECT CASE (TRIM(AERO_SCHEME)) + CASE ("aer") + PCHEM2AER(KIDIA:KFDIA,1:KLEV,2) = -1.0_JPRB*ZBUDR(KIDIA:KFDIA,1:KLEV,ISO2_TM5) + PCHEM2AER(KIDIA:KFDIA,1:KLEV,3) = ZTENC1(KIDIA:KFDIA,1:KLEV,ISO2_TM5) - ZTENC0(KIDIA:KFDIA,1:KLEV,ISO2_TM5) + + CASE ("hamm7") + PCHEM2AER(KIDIA:KFDIA,JK,2) = PSO4_LPROD(KIDIA:KFDIA) + END SELECT ENDIF + IF (NACTAERO > 0 .AND. LAERNITRATE) THEN PCHEM2AER(KIDIA:KFDIA,1:KLEV,4) = ZTENC1(KIDIA:KFDIA,1:KLEV,INH4_TM5) - ZTENC0(KIDIA:KFDIA,1:KLEV,INH4_TM5) ZTENC1(KIDIA:KFDIA,1:KLEV,INH4_TM5) = ZTENC0(KIDIA:KFDIA,1:KLEV,INH4_TM5) diff --git a/ifs-source/arpifs/chem/chem_tm5.F90 b/ifs-source/arpifs/chem/chem_tm5.F90 index 4c433bdb..92d6cc3b 100644 --- a/ifs-source/arpifs/chem/chem_tm5.F90 +++ b/ifs-source/arpifs/chem/chem_tm5.F90 @@ -12,7 +12,7 @@ SUBROUTINE CHEM_TM5& & PLP, PIP, PAP, PPTROPO, PALB, PWND, PLSM, PCSZA, PGELAT,& & PGELAM, PGEMU, PKOZO, KLEVTROP, PDV, PCEN , PTENC1, PBUDR, PBUDJ, PBUDX, POUT,& & PAEROP,PWETDIAM, PWETVOL,PND,PAERAOT, PAERAAOT, PAERASY,PSOGTOSOA, & - & PCHEM2GHG) + & PCHEM2GHG, PSO4_LPROD) !** DESCRIPTION @@ -133,6 +133,7 @@ SUBROUTINE CHEM_TM5& USE TM5_PHOTOLYSIS , ONLY : NPHOTO,NBANDS_TROP,NGRID, JNO2 USE YOMCST , ONLY : RD, RMD, RG , RPI, RMCO2 USE YOMRIP0 , ONLY : NINDAT +USE TM5M7_DATA, ONLY: IACS_N, ICOS_N, ISO4COS, ISO4ACS, ISO4NUS, ISO4AIS ! TM5 chemistry ... USE TM5_KPP_Parameters, ONLY : NREACT, NVAR @@ -189,6 +190,7 @@ SUBROUTINE CHEM_TM5& REAL(KIND=JPRB) ,INTENT(IN) :: PAERASY(KLON,KLEV,6) REAL(KIND=JPRB) ,INTENT(OUT):: PSOGTOSOA(KLON,KLEV,2) REAL(KIND=JPRB) ,INTENT(OUT):: PCHEM2GHG(KLON,KLEV,NCHEM2GHG) +REAL(KIND=JPRB) ,INTENT(OUT):: PSO4_LPROD(KLON) !----------------------------------------------------------------------- @@ -272,10 +274,14 @@ SUBROUTINE CHEM_TM5& INTEGER(KIND=JPIM), DIMENSION(3) :: JAER_TRACER INTEGER(KIND=JPIM), DIMENSION(2) :: JRATE_TRACER +!HAMM7-related +REAL(KIND=JPRB), DIMENSION(KLON) :: ZFACTOR_NUMCM3 +REAL(KIND=JPRB), DIMENSION(KLON,KAERO) :: ZAEROI,ZAEROP REAL(KIND=JPRB) :: ZTAU_NUDGE REAL(KIND=JPRB) :: ZRGI, ZDELP, ZT0NO, ZT0NO2, ZCONC_HO2 LOGICAL :: LLCOD_TM5 + ! Switch for selection of aerosol parameterization for photolysis INTEGER(KIND=JPIM), PARAMETER :: ITAU_MACC=0 ! Switch for selection of HNO3 BC parameterization. 1=updated @@ -316,6 +322,7 @@ SUBROUTINE CHEM_TM5& #include "tm5_stratbc_ch4.intfb.h" #include "tm5_sundis.intfb.h" #include "tm5_wetchem.intfb.h" +#include "tm5_wetchem_m7.intfb.h" #include "cod_op_tm5.intfb.h" #include "o3chem.intfb.h" ! KPP code - TROP - Code already included in chem_tm5bascoe.F90... @@ -495,7 +502,7 @@ SUBROUTINE CHEM_TM5& ! ITAU_MACC = 2_JPIM ! Use simple (but wrong) climatology for aerosol optical depth if no prognostic MACC aerosol is used IF ( LCHEM_AEROI ) THEN - IF (TRIM(AERO_SCHEME)=="aer" .OR. TRIM(AERO_SCHEME)=="hamm7")THEN + IF (TRIM(AERO_SCHEME)=="aer" .OR. TRIM(AERO_SCHEME)=="hamm7")THEN !FIXME: no M7 and LCHEM_AEROI? ! * from MACC fields CALL TM5_MACC_AEROSOL(KIDIA,KFDIA,KLON,KLEV, KAERO, & & PRS1 , PAEROP , ZRHCL , & @@ -615,9 +622,20 @@ SUBROUTINE CHEM_TM5& ENDDO IF (LAERCHEM) THEN + + SELECT CASE (TRIM(AERO_SCHEME)) + + CASE ("aer") !* use aerosol scheme SO4 for WETCHEM and EQSAM - ISSO4 = SUM(NTYPAER(1:4)) + 1 - ZCVM0(JL,ISO4) = MAX(PAEROP(JL,JK,ISSO4) / YCHEM(ISO4)%RMOLMASS *ZAIRDM(JL), 0._JPRB) + ISSO4 = SUM(NTYPAER(1:4)) + 1 + ZCVM0(JL,ISO4) = MAX(PAEROP(JL,JK,ISSO4) / YCHEM(ISO4)%RMOLMASS *ZAIRDM(JL), 0._JPRB) + + CASE ("hamm7") +!* identify corresponding tracer in M7 aero scheme + ZCVM0(JL,ISO4) = MAX((PAEROP(JL,JK,ISO4NUS)+ PAEROP(JL,JK,ISO4AIS) +PAEROP(JL,JK,ISO4ACS) +PAEROP(JL,JK,ISO4COS)) / YCHEM(ISO4)%RMOLMASS *ZAIRDM(JL) ,0._JPRB) + + END SELECT + ENDIF IF (LAERNITRATE) THEN @@ -675,7 +693,7 @@ SUBROUTINE CHEM_TM5& ZDT_EBI=PTSTEP/ITEREBI DO IB=1_JPIM,ITEREBI - + !PLS-2024-09-09 THE EBI IS INCOMPLETE (missing M7 case and more) !3.1 wet sulphur/ammonia chemistry CALL TM5_WETCHEM(YGFL,KIDIA,KFDIA,KLON,ZDT_EBI,PTP(:,JK),PAP(:,JK),PRSF1(:,JK),PLP(:,JK),ZCVM1,ZHPLUS,ZCVM) @@ -717,7 +735,37 @@ SUBROUTINE CHEM_TM5& ITEREBI = 1_JPIM ! select KPP... !3.1 wet sulphur/ammonia chemistry - CALL TM5_WETCHEM(YGFL, KIDIA, KFDIA, KLON,PTSTEP,PTP(:,JK),PAP(:,JK),PRSF1(:,JK),PLP(:,JK),ZCVM1,ZHPLUS,ZCVM) + + IF (LAERCHEM .AND. TRIM(AERO_SCHEME) == "hamm7") THEN + + ! conversion factor for aerosol number [#/kg] to [# /cm3].. + ZFACTOR_NUMCM3(KIDIA:KFDIA) = 1E-6_JPRB*ZCVM(KIDIA:KFDIA,IAIR) + + DO JT=1,KAERO + !* For now only initialize fields that are required in wetchem + IF (ANY( (/ ISO4COS,ISO4ACS,ISO4NUS,ISO4AIS /) == JT) ) THEN + ZAEROI(KIDIA:KFDIA,JT) = MAX(PAEROP(KIDIA:KFDIA,JK,JT) / 96. *ZAIRDM(KIDIA:KFDIA) ,0._JPRB) + !* initialize final (ZAEROP) concentrations + ZAEROP(KIDIA:KFDIA,JT) = ZAEROI(KIDIA:KFDIA,JT) + ELSEIF (ANY( (/IACS_N,ICOS_N/) == JT ) ) THEN + ZAEROI(KIDIA:KFDIA,JT) = MAX(PAEROP(KIDIA:KFDIA,JK,JT) * ZFACTOR_NUMCM3(KIDIA:KFDIA) , 0._JPRB) + !* initialize final (ZAEROP) concentrations + ZAEROP(KIDIA:KFDIA,JT) = ZAEROI(KIDIA:KFDIA,JT) + ! ELSE + ! ZAEROI(KIDIA:KFDIA,JT) = 0._JPRB + ENDIF + ENDDO + + CALL TM5_WETCHEM_M7(KIDIA, KFDIA, KLON, KAERO, PTSTEP, PTP(1:KLON,JK), & + & PAP(1:KLON,JK),PRSF1(1:KLON,JK),PLP(1:KLON,JK),ZCVM1,ZHPLUS,ZCVM, & + & ZAEROP, PSO4_LPROD) + + PSO4_LPROD(KIDIA:KFDIA) = PSO4_LPROD(KIDIA:KFDIA)*96._JPRB /(ZAIRDM(KIDIA:KFDIA) * PTSTEP) + + ELSE + ! All cases except M7 scheme + CALL TM5_WETCHEM(YGFL, KIDIA, KFDIA, KLON,PTSTEP,PTP(:,JK),PAP(:,JK),PRSF1(:,JK),PLP(:,JK),ZCVM1,ZHPLUS,ZCVM) + ENDIF !3.2 Call selected kpp solver DO JL=KIDIA,KFDIA diff --git a/ifs-source/arpifs/m7/chem/tm5_wetchem_m7.F90 b/ifs-source/arpifs/m7/chem/tm5_wetchem_m7.F90 index ef85620e..3b9afc19 100644 --- a/ifs-source/arpifs/m7/chem/tm5_wetchem_m7.F90 +++ b/ifs-source/arpifs/m7/chem/tm5_wetchem_m7.F90 @@ -1,5 +1,5 @@ SUBROUTINE TM5_WETCHEM_M7(KIDIA, KFDIA, KLON,KAERO,PDT,PTEMP,PAP,PRS,PLP,PY0,PHPLUS,PY, & - & PAEROP ) + & PAEROP, PSO4_LPROD ) !********************************************************************** ! !TM5_WETCHEM_M7 - aqueous phase chemistry of sulfur (and other) @@ -53,7 +53,7 @@ SUBROUTINE TM5_WETCHEM_M7(KIDIA, KFDIA, KLON,KAERO,PDT,PTEMP,PAP,PRS,PLP,PY0,PHP REAL(KIND=JPRB), INTENT(OUT) :: PHPLUS(KLON) ! concentration H+ REAL(KIND=JPRB), INTENT(INOUT) :: PY(KLON,YGFL%NCHEM+3) REAL(KIND=JPRB), INTENT(INOUT) :: PAEROP(KLON,KAERO) - +REAL(KIND=JPRB), INTENT(OUT) :: PSO4_LPROD(KLON) ! * LOCAL REAL(KIND=JPHOOK) :: ZHOOK_HANDLE @@ -91,7 +91,7 @@ SUBROUTINE TM5_WETCHEM_M7(KIDIA, KFDIA, KLON,KAERO,PDT,PTEMP,PAP,PRS,PLP,PY0,PHP !----------------------------- ! wet phase reactions !----------------------------- - +PSO4_LPROD(KIDIA:KFDIA)=0.0_JPRB DO JL=KIDIA,KFDIA LLCLOUDY(JL)=.FALSE. @@ -218,20 +218,11 @@ SUBROUTINE TM5_WETCHEM_M7(KIDIA, KFDIA, KLON,KAERO,PDT,PTEMP,PAP,PRS,PLP,PY0,PHP ZDSO2=PY0(JL,ISO2)*ZXCOV*(EXP(-ZX1)-1._JPRB) !only applied to ZXCOV part of cloud ZDSO2=MAX(-PY0(JL,IO3)*ZXCOV,ZDSO2)! limit to o3 availability - - ZFT = PAEROP(JL,IACS_N)+PAEROP(JL,ICOS_N) - IF (ZFT > TINY(ZFT)) THEN - PAEROP(JL,ISO4ACS)=PAEROP(JL,ISO4ACS)-ZDSO2*(PAEROP(JL,IACS_N)/ZFT) - PAEROP(JL,ISO4COS)=PAEROP(JL,ISO4COS)-ZDSO2*(PAEROP(JL,ICOS_N)/ZFT) - PY(JL,ISO2)=PY0(JL,ISO2)+ZDSO2 - PY(JL,IO3) =PY0(JL,IO3) +ZDSO2 - ELSE - ! PAEROP(JL,ISO4ACS)=PAEROP(JL,ISO4ACS) - ! PAEROP(JL,ISO4COS)=PAEROP(JL,ISO4COS) - PY(JL,ISO2)=PY0(JL,ISO2) - PY(JL,IO3) =PY0(JL,IO3) - ENDIF - + + PSO4_LPROD(JL)=-ZDSO2 + PY(JL,ISO2) = PY(JL,ISO2)+ZDSO2 ! dso2 is loss of SO2 and H2O2 + PY(JL,IO3) = PY0(JL,IO3)+ZDSO2 + ! ! oxidation of S(IV) by H2O2 ! @@ -249,27 +240,20 @@ SUBROUTINE TM5_WETCHEM_M7(KIDIA, KFDIA, KLON,KAERO,PDT,PTEMP,PAP,PRS,PLP,PY0,PHP ZSO2X=(ZX1-ZX2*ZX3)/(1.-ZX3) ZDSO2=(ZSO2X-PY(JL,ISO2))*ZXCOV ZDSO2=MAX(ZDSO2,-PY0(JL,IH2O2)*ZXCOV) - - - ZFT=PAEROP(JL,IACS_N)+PAEROP(JL,ICOS_N) - IF (ZFT > TINY(ZFT)) THEN - PAEROP(JL,ISO4ACS)=PAEROP(JL,ISO4ACS)-ZDSO2*(PAEROP(JL,IACS_N)/ZFT) - PAEROP(JL,ISO4COS)=PAEROP(JL,ISO4COS)-ZDSO2*(PAEROP(JL,ICOS_N)/ZFT) - PY(JL,ISO2) = PY(JL,ISO2)+ZDSO2 ! dso2 is loss of SO2 and H2O2 - PY(JL,IH2O2) = PY0(JL,IH2O2)+ZDSO2 - ELSE - PY(JL,IH2O2)=PY0(JL,IH2O2) - ENDIF + PSO4_LPROD(JL)=-ZDSO2 + PY(JL,ISO2) = PY(JL,ISO2)+ZDSO2 ! dso2 is loss of SO2 and H2O2 + PY(JL,IH2O2) = PY0(JL,IH2O2)+ZDSO2 ENDIF - + ! Finally also update PY0 concentrations PY0(JL,ISO2)=PY(JL,ISO2) PY0(JL,IO3) =PY(JL,IO3) PY0(JL,IH2O2)=PY(JL,IH2O2) - - + else + !write(3399,*)'no clouds',JL,llcloudy(JL),zdso2 + ENDIF !cloudy -ENDDO +ENDDO IF (LHOOK) CALL DR_HOOK('TM5_WETCHEM_M7',1,ZHOOK_HANDLE ) diff --git a/ifs-source/arpifs/m7/module/mo_ham_sedimentation.F90 b/ifs-source/arpifs/m7/module/mo_ham_sedimentation.F90 index efa076da..1253f30d 100644 --- a/ifs-source/arpifs/m7/module/mo_ham_sedimentation.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_sedimentation.F90 @@ -117,7 +117,7 @@ SUBROUTINE ham_sedimentation(kproma, kbdim, klev, krow, & prwetm7, pdensaerm7, & pdpg, pdz, & pxtp1, pxtte, & - pvsedi, psediflux) + pvsedi, psediflux, psedifluxsurf) !USE mo_ham_m7, ONLY: rwet_m7, densaer_m7 USE mo_time_control, ONLY: time_step_len @@ -139,11 +139,12 @@ SUBROUTINE ham_sedimentation(kproma, kbdim, klev, krow, & REAL(dp), INTENT(in) :: prwetm7(kbdim,klev,nclass), pdensaerm7(kbdim,klev,nclass) REAL(dp), INTENT(inout):: pxtte(kbdim, klev) ! tracer(kt) tendency REAL(dp), INTENT(out) :: pvsedi(kbdim, klev), & ! sedimentation velocity - psediflux(kbdim, klev) ! sedimentation flux + psediflux(kbdim, klev), & ! sedimentation flux + psedifluxsurf(kbdim) ! sedimentation flux at surf !--- local variables - INTEGER :: imod + INTEGER :: imod, jk, jl LOGICAL :: ll1(kbdim,klev) !SF #458 dummy logical @@ -154,10 +155,21 @@ SUBROUTINE ham_sedimentation(kproma, kbdim, klev, krow, & REAL(dp) :: ztmp1(kbdim,klev), ztmp2(kbdim,klev) !SF #458 dummy temporary variables + !-->eehol: add variables for implicit sedimentation solver + REAL(dp) :: zsedflx(kbdim), & ! sediflux per layer xx m-2 + zaeronwm1(kbdim), & ! next time step mixing ratio needed for next layer + zsolaers, & ! source term from above layer + zsolaerb, & ! sink to next layer + zgdp, & ! 1 per layer thickness (pressure) + zdtgdp, & ! time step len times 1 per layer thickness (pressure) + zaeronw ! implicit solver variable + !<--eehol + !--- code !--- initialize output - pvsedi(:,:) = 0._dp - psediflux(:,:) = 0._dp + pvsedi(:,:) = 0._dp + psediflux(:,:) = 0._dp + psedifluxsurf(:) = 0._dp !--- lookup mode of the tracer and get wet radius and density imod=trlist%ti(kt)%mode @@ -245,29 +257,65 @@ SUBROUTINE ham_sedimentation(kproma, kbdim, klev, krow, & pvsedi(1:kproma,:) = MERGE(ztmp2(1:kproma,:), 0._dp, ll1(1:kproma,:)) - !--- Loss in terms of mixing ratio tendency: - ztmp1(1:kproma,:) = MAX(0._dp, pxtp1(1:kproma,:)*pvsedi(1:kproma,:)/pdz(1:kproma,:) ) - !--- Limit tendency to pxtp1/dt to avoid negative tracer concentrations - ztmp1(1:kproma,:) = MIN(ztmp1(1:kproma,:), pxtp1(1:kproma,:)/time_step_len) + !!--- Loss in terms of mixing ratio tendency: + !ztmp1(1:kproma,:) = MAX(0._dp, pxtp1(1:kproma,:)*pvsedi(1:kproma,:)/pdz(1:kproma,:) ) + !!--- Limit tendency to pxtp1/dt to avoid negative tracer concentrations + !ztmp1(1:kproma,:) = MIN(ztmp1(1:kproma,:), pxtp1(1:kproma,:)/time_step_len) - zsedtend(1:kproma,:) = MERGE(ztmp1(1:kproma,:), 0._dp, ll1(1:kproma,:)) - - !--- Apply loss throughout the column of mixing ratio tendencies: - ! note: pxtte in this routine is already indexed for one tracer - ! (normally this would be pxtte(1:kproma, :, kt) ) + !zsedtend(1:kproma,:) = MERGE(ztmp1(1:kproma,:), 0._dp, ll1(1:kproma,:)) + ! + !!--- Apply loss throughout the column of mixing ratio tendencies: + !! note: pxtte in this routine is already indexed for one tracer + !! (normally this would be pxtte(1:kproma, :, kt) ) - pxtte(1:kproma,:)= pxtte(1:kproma,:)-zsedtend(1:kproma,:) + !pxtte(1:kproma,:)= pxtte(1:kproma,:)-zsedtend(1:kproma,:) !--- Transfer loss from mixing ratio tendency [kg/kg] ! to sedimentation flux [kg m-2 s-1]: - psediflux(1:kproma,:) = zsedtend(1:kproma,:) * pdpg(1:kproma,:) -!<eehol: adding implicit solver for sedimentation + !init variables carried out from one layer to the next + zsedflx(1:kproma) = 0.0_dp + zaeronwm1(1:kproma) = 0.0_dp + DO jk=1,klev + DO jl=1,kproma + zsolaers = 0.0_dp + zsolaerb = 0.0_dp + zgdp = 1/(pdpg(jl,jk)) + zdtgdp = time_step_len*zgdp + + !source from above + IF (jk > 1) THEN + zsedflx(jl) = zsedflx(jl)*zaeronwm1(jl) + zsolaers = zsolaers+zsedflx(jl)*zdtgdp + END IF + + !sink to next layer + zsedflx(jl) = pvsedi(jl,jk)*prho(jl,jk) + zsolaerb = zsolaerb+zdtgdp*zsedflx(jl) + + !implicit solver + zaeronw = (pxtp1(jl,jk)+zsolaers)/(1.0_dp+zsolaerb) + + !new time-step aero variable needed for next layer + zaeronwm1(jl) = zaeronw + + !tendency in unit of xx kg-1 s-1 + pxtte(jl,jk) = pxtte(jl,jk)+((zaeronw-pxtp1(jl,jk))/time_step_len) + + END DO + END DO + +! psediflux(1:kproma,:) = zsedtend(1:kproma,:) * pdpg(1:kproma,:) +!< FMI suggests this unit should be [m] + prhop(kbdim,klev,nclass), & ! mean mode particle density [g cm-3] -> FMI suggests this unit should be [kg m-3] pww(kbdim,klev,nclass) ! aerosol water content for each mode [kg(water) m-3(air)] diff --git a/ifs-source/arpifs/m7/module/mo_ham_wetdep.F90 b/ifs-source/arpifs/m7/module/mo_ham_wetdep.F90 index 426f7c1b..e77986f1 100755 --- a/ifs-source/arpifs/m7/module/mo_ham_wetdep.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_wetdep.F90 @@ -132,8 +132,8 @@ SUBROUTINE ham_wetdep(kproma, kbdim, klev, krow, ktop, kt, pmfuxt, prhop1, pdpg, & pm6rp, pm6dry, & reffi, reffl, & - pnact, pfracn, & - pice, & + pnact, pfracn, & + pice, & peffice, peffwat, pclc, prevap, & pdepint, pdepintbc, pdepintbcr, pdepintbcs, & pdepintic, pdepintic_nucw, pdepintic_nucm, & @@ -142,7 +142,6 @@ SUBROUTINE ham_wetdep(kproma, kbdim, klev, krow, ktop, kt, ! master routine for ham scavenging calculations ! HK --> USE mo_ham_streams, ONLY: rwet - !USE mo_ham_m7, ONLY: rwet_m7 #ifdef SALSA USE mo_ham_salsa, ONLY: rwet_salsa #endif @@ -180,7 +179,7 @@ SUBROUTINE ham_wetdep(kproma, kbdim, klev, krow, ktop, kt, REAL(dp), INTENT(in) :: pm6rp(kbdim,klev,nclass), pm6dry(kbdim,klev,nclass) ! m7: rwet_m7 REAL(dp), INTENT(in) :: reffi(kbdim,klev,1), reffl(kbdim,klev,1) - REAL(dp), INTENT(in) :: pnact(kbdim,klev,nclass) !number of activated particles per mode [m-3] + REAL(dp), INTENT(in) :: pnact(kbdim,klev) !number of activated particles [m-3] REAL(dp), INTENT(in) :: pfracn(kbdim,klev,nclass) !fraction of activated particles per mode REAL(dp), INTENT(inout) :: pxtte(kbdim,klev,ntrac), & ! tracer tendency @@ -344,7 +343,7 @@ SUBROUTINE ham_wetdep(kproma, kbdim, klev, krow, ktop, kt, prhop1, pxtp1c, pxtp1c_sav, paclc, peffwat, & pm6rp, pm6dry, & reffi, reffl, & - pnact, pfracn, & + pnact, pfracn, & zdxtwat_nuc, zdxtwat_imp, zdxtwat, zxtwat) ENDIF !water scavenging on @@ -357,7 +356,7 @@ SUBROUTINE ham_wetdep(kproma, kbdim, klev, krow, ktop, kt, prhop1, pxtp1c, pxtp1c_sav, paclc, peffice, & pm6rp, pm6dry, & reffi, reffl, & - pnact, pfracn, & + pnact, pfracn, & zdxtice_nuc, zdxtice_imp, zdxtice, zxtice) ENDIF !ice scavenging on @@ -455,8 +454,10 @@ SUBROUTINE ham_wetdep(kproma, kbdim, klev, krow, ktop, kt, !--- Calculate fraction of below cloud scavenged tracer: ll1(1:kproma,:) = (paclc(1:kproma,:) < zmin) - ztmp1(1:kproma,:) = -ztmst*MAX(sfrain(1:kproma,:,itrac_phase,imod),0._dp) - ztmp2(1:kproma,:) = -ztmst*MAX(sfsnow(1:kproma,:,itrac_phase,imod),0._dp) + !ztmp1(1:kproma,:) = -ztmst*MAX(sfrain(1:kproma,:,itrac_phase,imod),0._dp) + !ztmp2(1:kproma,:) = -ztmst*MAX(sfsnow(1:kproma,:,itrac_phase,imod),0._dp) + ztmp1(1:kproma,:) = -ztmst*MIN(MAX((1._dp)*sfrain(1:kproma,:,itrac_phase,imod),0._dp),1._dp) !eehol: test + ztmp2(1:kproma,:) = -ztmst*MIN(MAX((1._dp)*sfsnow(1:kproma,:,itrac_phase,imod),0._dp),1._dp) !eehol: test !SFnote: in the above two expressions, the MAX function is here only to rule out the cases where sfrain and/or ! sfsnow is/are equal to UNDEF, ie in cases where scavenging by rain and/or snow is not relevant. ! Initializing sfrain and sfsnow to 0 at the beginning would defeat the concept of having an UNDEF value, @@ -542,7 +543,7 @@ SUBROUTINE ic_scav(kproma, kbdim, klev, krow, ktop, kt, & !in prhop1, pxtp1c, pxtp1c_sav, paclc, peff, & !in pm6rp, pm6dry, & !in reffi, reffl, & !in - pnact, pfracn, & + pnact, pfracn, & !in pdxt_nuc, pdxt_imp, pdxt, pxt) !out ! In-cloud scavenging master routine @@ -566,8 +567,8 @@ SUBROUTINE ic_scav(kproma, kbdim, klev, krow, ktop, kt, & !in REAL(dp), INTENT(in) :: pm6rp(kbdim,klev,nclass), pm6dry(kbdim,klev,nclass) ! m7: REAL(dp), INTENT(in) :: reffi(kbdim,klev,1), reffl(kbdim,klev,1) - REAL(dp), INTENT(in) :: pnact(kbdim,klev,nclass) !number of activated particles per mode [m-3] - REAL(dp), INTENT(in) :: pfracn(kbdim,klev,nclass) !fraction of activated particles per mode + REAL(dp), INTENT(in) :: pnact(kbdim,klev) !number of activated particles [m-3] + REAL(dp), INTENT(in) :: pfracn(kbdim,klev,nclass) !fraction of activated particles per mode REAL(dp), INTENT(out) :: pdxt_nuc(kbdim,klev) ! change in tracer mass assoc. with nucleation scav ! (for relevant phase) @@ -619,7 +620,7 @@ SUBROUTINE get_icscavfrac(kproma, kbdim, klev, krow, ktop, kt, kmod, & ! in prhop1, pxtp1c, pxtp1c_sav, & ! in pm6rp, pm6dry, & ! in reffi, reffl, & ! in - pnact, pfracn, & + pnact, pfracn, & ! in pfrac, pfrac_nuc, pfrac_imp) ! out ! Utility routine to compute the in-cloud scavenging fractions @@ -628,8 +629,6 @@ SUBROUTINE get_icscavfrac(kproma, kbdim, klev, krow, ktop, kt, kmod, & ! in csr_conv USE mo_ham, ONLY: nham_subm, HAM_BULK, HAM_M7, HAM_SALSA - !--> eehol - !--> USE mo_ham_streams, ONLY: frac, rwet USE mo_math_constants, ONLY: pi !--> HK @@ -637,10 +636,8 @@ SUBROUTINE get_icscavfrac(kproma, kbdim, klev, krow, ktop, kt, kmod, & ! in USE mo_ham_salsa_cloud, ONLY: pfrac_salsa USE mo_ham_salsa, ONLY: rwet_salsa #endif - !USE mo_ham_activ, ONLY: pfrac_m7 !<-- HK IMPLICIT NONE - !<-- eehol INTEGER, INTENT(in) :: kproma, kbdim, klev, krow, ktop, kt, kmod INTEGER, INTENT(in) :: kwat_phase ! kwat_phase=1 --> water; kwat_phase=2 --> ice @@ -660,8 +657,8 @@ SUBROUTINE get_icscavfrac(kproma, kbdim, klev, krow, ktop, kt, kmod, & ! in REAL(dp), INTENT(in) :: pm6rp(kbdim,klev,nclass), pm6dry(kbdim,klev,nclass) ! m7: REAL(dp), INTENT(in) :: reffi(kbdim,klev,1), reffl(kbdim,klev,1) - REAL(dp), INTENT(in) :: pnact(kbdim,klev,nclass) !number of activated particles per mode [m-3] - REAL(dp), INTENT(in) :: pfracn(kbdim,klev,nclass) !fraction of activated particles per mode + REAL(dp), INTENT(in) :: pnact(kbdim,klev) !number of activated particles [m-3] + REAL(dp), INTENT(in) :: pfracn(kbdim,klev,nclass) !fraction of activated particles per mode REAL(dp), INTENT(out) :: pfrac(kbdim,klev), & ! total scavenging fraction pfrac_nuc(kbdim,klev), & ! nucleation scavenging fraction @@ -726,7 +723,7 @@ SUBROUTINE get_icscavfrac(kproma, kbdim, klev, krow, ktop, kt, kmod, & ! in CALL ic_scav_nuc(kproma, kbdim, klev, krow, kwat_phase, & ktrac_phase, kmod, & pm6rp, pm6dry, & !in - pnact, pfracn, & + pnact, pfracn, & prhop1, pxtp1c_sav) ENDIF !sfnuc(1,1,kwat_phase,ktrac_phase,kmod) == UNDEF @@ -807,9 +804,12 @@ SUBROUTINE get_icscavfrac(kproma, kbdim, klev, krow, ktop, kt, kmod, & ! in pfrac(1:kproma,:) = pfrac_nuc(1:kproma,:) + pfrac_imp(1:kproma,:) !--- Confine the fraction between 0% and 100% : - pfrac(1:kproma,:) = MAX(0._dp, MIN(1._dp, pfrac(1:kproma,:))) - pfrac_nuc(1:kproma,:) = MAX(0._dp, MIN(1._dp, pfrac_nuc(1:kproma,:))) - pfrac_imp(1:kproma,:) = MAX(0._dp, MIN(1._dp, pfrac_imp(1:kproma,:))) + !pfrac(1:kproma,:) = MAX(0._dp, MIN(1._dp, pfrac(1:kproma,:))) + !pfrac_nuc(1:kproma,:) = MAX(0._dp, MIN(1._dp, pfrac_nuc(1:kproma,:))) + !pfrac_imp(1:kproma,:) = MAX(0._dp, MIN(1._dp, pfrac_imp(1:kproma,:))) + pfrac(1:kproma,:) = MAX(0._dp, MIN(1._dp, (1._dp)*pfrac(1:kproma,:))) !eehol: test + pfrac_nuc(1:kproma,:) = MAX(0._dp, MIN(1._dp, (1._dp)*pfrac_nuc(1:kproma,:))) !eehol: test + pfrac_imp(1:kproma,:) = MAX(0._dp, MIN(1._dp, (1._dp)*pfrac_imp(1:kproma,:))) !eehol: test END SUBROUTINE get_icscavfrac @@ -845,8 +845,8 @@ SUBROUTINE ic_scav_nuc(kproma, kbdim, klev, krow, kwat_phase, & REAL(dp), INTENT(in) :: pxtp1c_sav(kbdim,klev,ntrac) ! in-cloud tracer concentration as untouched by wetdep REAL(dp), INTENT(in) :: prhop1(kbdim,klev) ! air density (t-dt) REAL(dp), INTENT(in) :: pm6rp(kbdim,klev,nclass), pm6dry(kbdim,klev,nclass) ! m7: - REAL(dp), INTENT(in) :: pnact(kbdim,klev,nclass) !number of activated particles per mode [m-3] - REAL(dp), INTENT(in) :: pfracn(kbdim,klev,nclass) !fraction of activated particles per mode + REAL(dp), INTENT(in) :: pnact(kbdim,klev) ! number of activated particles [m-3] + REAL(dp), INTENT(in) :: pfracn(kbdim,klev,nclass) ! fraction of activated particles per mode ! Local variables REAL(dp) :: zxie(kbdim,klev), & ! factor for inverse error function calculation @@ -873,10 +873,8 @@ SUBROUTINE ic_scav_nuc(kproma, kbdim, klev, krow, kwat_phase, & ENDIF IF (ncd_activ == 2) THEN - !zrad_p(:,:) = rdry_m7(:,:,kmod) ! ARG activation is based on dry radius zrad_p(:,:) = pm6dry(:,:,kmod) ! ARG activation is based on dry radius ELSE - !zrad_p(:,:) = rwet_m7(:,:,kmod) ! Lin & Leaitch activation is based on wet radius zrad_p(:,:) = pm6rp(:,:,kmod) ! Lin & Leaitch activation is based on wet radius END IF @@ -892,16 +890,12 @@ SUBROUTINE ic_scav_nuc(kproma, kbdim, klev, krow, kwat_phase, & SELECT CASE(kwat_phase) CASE(1) !liq water - !ll1(1:kproma,:) = (zxtp1c(1:kproma,:,idt_cdnc) > zeps_mass) .AND. & - ! (pna_m7(1:kproma,:,kmod) > zeps) ll1(1:kproma,:) = (zxtp1c(1:kproma,:,idt_cdnc) > zeps_mass) .AND. & - (pnact(1:kproma,:,kmod) > zeps) + (pnact(1:kproma,:) > zeps) !--> HK: modified to use variables instead of streams - !ztmp1(1:kproma,:) = zxtp1c(1:kproma,:,idt_cdnc) * prhop1(1:kproma,:) & - ! * pfrac_m7(1:kproma,:,kmod) / MAX(pna_m7(1:kproma,:,kmod),zeps) ztmp1(1:kproma,:) = zxtp1c(1:kproma,:,idt_cdnc) * prhop1(1:kproma,:) & - * pfracn(1:kproma,:,kmod) / MAX(pnact(1:kproma,:,kmod),zeps) + * pfracn(1:kproma,:,kmod) / MAX(pnact(1:kproma,:),zeps) !<-- HK CASE(2) !ice @@ -960,7 +954,7 @@ SUBROUTINE ic_scav_imp(kproma, kbdim, klev, krow, ktop, kwat_phase, & scavdropm, scavdropn, & scaviceplate - USE mo_activ, ONLY: idt_icnc!, reffl, reffi + USE mo_activ, ONLY: idt_icnc USE mo_ham_tools, ONLY: scavcoef_bilinterp INTEGER, INTENT(in) :: kproma, kbdim, klev, krow, ktop @@ -1445,32 +1439,6 @@ SUBROUTINE prep_ham_mode_init(kproma, kbdim, klev) INTEGER, INTENT(in) :: kproma, kbdim, klev - !INTEGER, POINTER :: indexy1(kbdim,klev,2,nclass) => NULL() - !INTEGER, POINTER :: indexy2(kbdim,klev,2,nclass) => NULL() ! indices necessary for lookup table searches - ! ! shape: (kbdim,klev,numb/mass,mode) - - !REAL(dp), POINTER :: mr(kbdim,klev,2,nclass) => NULL() ! median radius (wet) - ! ! shape: (kbdim,klev, numb/mass, mode) - !REAL(dp), POINTER :: rcritrad(kbdim,klev,2,nclass) => NULL() ! critical radius [m] (ie min bound) for scav of mode - ! ! shape: (kbdim,klev, liq/ice, mode) - !REAL(dp), POINTER :: sfnuc(kbdim,klev,2,2,nclass) => NULL() ! in-cloud, nucleation scavenging fraction - ! ! shape: (kbdim,klev, liq/ice, numb/mass, mode) - !REAL(dp), POINTER :: sfimp(kbdim,klev,2,2,nclass) => NULL() ! in-cloud, impaction scavenging fraction - ! ! shape: (kbdim,klev, liq/ice, numb/mass, mode) - !REAL(dp), POINTER :: sfrain(kbdim,klev,2,nclass) => NULL() ! below-cloud, scavenging fraction by rain - ! ! shape: (kbdim,klev,numb/mass, mode) - !REAL(dp), POINTER :: sfsnow(kbdim,klev,2,nclass) => NULL() ! below-cloud, scavenging fraction by snow - ! ! (kbdim,klev,numb/mass, mode) - !indexy1(1:kproma,:,:) = UNDEF - !indexy2(1:kproma,:,:) = UNDEF - !mr(1:kproma,:,:) = UNDEF - !rcritrad(1:kproma,:,:) = UNDEF - - !sfnuc(1:kproma,:,:,:) = UNDEF - !sfimp(1:kproma,:,:,:) = UNDEF - - !sfrain(1:kproma,:,:) = UNDEF - !sfrain(1:kproma,:,:) = UNDEF CALL init_var(kproma, kbdim, klev, indexy1) CALL init_var(kproma, kbdim, klev, indexy2) CALL init_var(kproma, kbdim, klev, mr) @@ -1490,7 +1458,6 @@ SUBROUTINE init_var_r_4d(kproma, kbdim, klev, pvar) INTEGER, INTENT(in) :: kproma, kbdim, klev REAL(dp), POINTER :: pvar(:,:,:,:) - !REAL(dp), allocatable :: pvar(:,:,:,:) IF (.NOT. ASSOCIATED(pvar)) ALLOCATE(pvar(kbdim,klev,2,nclass)) pvar(1:kproma,:,:,:) = UNDEF @@ -1505,7 +1472,6 @@ SUBROUTINE init_var_r_5d(kproma, kbdim, klev, pvar) INTEGER, INTENT(in) :: kproma, kbdim, klev REAL(dp), POINTER :: pvar(:,:,:,:,:) - !REAL(dp), allocatable :: pvar(:,:,:,:,:) IF (.NOT. ASSOCIATED(pvar)) ALLOCATE(pvar(kbdim,klev,2,2,nclass)) pvar(1:kproma,:,:,:,:) = UNDEF diff --git a/ifs-source/arpifs/m7/module/mo_hammoz_sedimentation.F90 b/ifs-source/arpifs/m7/module/mo_hammoz_sedimentation.F90 index 40043ce9..5f379fdd 100644 --- a/ifs-source/arpifs/m7/module/mo_hammoz_sedimentation.F90 +++ b/ifs-source/arpifs/m7/module/mo_hammoz_sedimentation.F90 @@ -207,7 +207,7 @@ SUBROUTINE sedi_interface(kbdim, kproma, klev, krow, & pt, pq, & pap, paph, & pm6rp, prhop, & !mean mode actual radius [m], mean mode particle density [kg m-3] - pxtm1, pxtte ,psediflux ) + pxtm1, pxtte ,psediflux ,psedifluxsurf) USE mo_tracdef, ONLY: ntrac, trlist @@ -230,7 +230,8 @@ SUBROUTINE sedi_interface(kbdim, kproma, klev, krow, & REAL(dp), INTENT(in) :: pm6rp(kbdim, klev, nclass), prhop(kbdim, klev, nclass) REAL(dp), INTENT(inout) :: pxtte(kbdim,klev,ntrac), & ! tracer tendency - psediflux(kbdim,klev,ntrac) + psediflux(kbdim,klev,ntrac), & + psedifluxsurf(kbdim,ntrac) !--- local variables INTEGER :: jt, ierr REAL(dp) :: ztempc(kbdim, klev), & ! temp. above melting @@ -242,7 +243,9 @@ SUBROUTINE sedi_interface(kbdim, kproma, klev, krow, & zxtp1(kbdim, klev), & ! updated tracer(jt) zxtte(kbdim, klev), & ! tracer(jt) tendency zvsedi(kbdim, klev), & ! sedimentation velocity - zsediflux(kbdim, klev) ! sedimentation flux + zsediflux(kbdim, klev),& ! sedimentation flux + zsedifluxsurf(kbdim) ! sedimentation flux at surf + REAL(dp), POINTER :: fld2d(:,:) ! pointer for diagnostics !--- calculate tracer independent physical variables @@ -268,7 +271,7 @@ SUBROUTINE sedi_interface(kbdim, kproma, klev, krow, & pm6rp, prhop, & zdpg, zdz, & zxtp1, zxtte, & - zvsedi, zsediflux) + zvsedi, zsediflux, zsedifluxsurf) #ifdef HAMMOZ !--- store diagnostics @@ -280,6 +283,7 @@ SUBROUTINE sedi_interface(kbdim, kproma, klev, krow, & #endif psediflux(1:kproma,:,jt)=zsediflux(1:kproma,:) !TB diagnostic output + psedifluxsurf(1:kproma,jt)=zsedifluxsurf(1:kproma) !eehol: diagnostic sediflux at surf pxtte(1:kproma,:,jt)=zxtte(1:kproma,:) !csld write tendency out END DO diff --git a/ifs-source/arpifs/m7/module/mo_hammoz_wetdep.F90 b/ifs-source/arpifs/m7/module/mo_hammoz_wetdep.F90 index 3eee903e..85a54e78 100755 --- a/ifs-source/arpifs/m7/module/mo_hammoz_wetdep.F90 +++ b/ifs-source/arpifs/m7/module/mo_hammoz_wetdep.F90 @@ -927,7 +927,7 @@ SUBROUTINE wetdep_interface(kproma, kbdim, klev, ktop, krow, lstrat, & pxtte, pxtp10, pxtp1c, & pfrain, pfsnow, pfevapr, pfsubls, & pmfu, pmfuxt, & - paclc, pclc, prhou, pxtbound) + paclc, pclc, prhou, pxtbound, pxtpscavic, pxtpscavbc) USE mo_tracdef, ONLY: ln, ntrac, trlist, AEROSOLMASS, AEROSOLNUMBER, GAS USE mo_species, ONLY: speclist @@ -956,7 +956,8 @@ SUBROUTINE wetdep_interface(kproma, kbdim, klev, ktop, krow, lstrat, & ! mean mode actual radius for each mode (wet for soluble and dry for insoluble modes) [cm] REAL(dp), INTENT(in) :: pm6dry(kbdim,klev,nclass) ! in cloudy part [kg/kg] - REAL(dp), INTENT(in) :: pnact(kbdim,klev,nclass) !number of activated particles per mode [m-3] +! REAL(dp), INTENT(in) :: pnact(kbdim,klev,nclass) !number of activated particles per mode [m-3] + REAL(dp), INTENT(in) :: pnact(kbdim,klev) !number of activated particles per mode [m-3] REAL(dp), INTENT(in) :: pfracn(kbdim,klev,nclass) !fraction of activated particles per mode REAL(dp), INTENT(in) :: reffi(kbdim,klev,1), reffl(kbdim,klev,1) @@ -976,7 +977,8 @@ SUBROUTINE wetdep_interface(kproma, kbdim, klev, ktop, krow, lstrat, & REAL(dp), INTENT(inout) :: pxtp10 (kbdim,klev,ntrac) ! ambient tracer mass mixing ratio (t+dt) REAL(dp), INTENT(inout) :: pmfuxt (kbdim,klev,ntrac) ! updraft mass flux REAL(dp), INTENT(inout) :: pxtbound (kbdim,ntrac) ! conv massfix boundary condition - + REAL(dp), INTENT(inout) :: pxtpscavic (kbdim,ntrac) ! diagnostic ic scavenged mr + REAL(dp), INTENT(inout) :: pxtpscavbc (kbdim,ntrac) ! diagnostic bc scavenged mr !--- local variables INTEGER :: jt, ispec, ierr, & @@ -1141,7 +1143,9 @@ SUBROUTINE wetdep_interface(kproma, kbdim, klev, ktop, krow, lstrat, & ENDIF !end aerosol or gas scavenging !--- update the boundary condition (instantaneous wet deposition) for xt_conv_massfix - pxtbound(1:kproma,jt) = zdepint(1:kproma) + pxtbound(1:kproma,jt) = zdepint(1:kproma) + pxtpscavic(1:kproma,jt) = zdepintic(1:kproma) + pxtpscavbc(1:kproma,jt) = zdepintbc(1:kproma) #ifdef HAMMOZ !--- diagnostics diff --git a/ifs-source/arpifs/m7/module/mo_tracer_processes.F90 b/ifs-source/arpifs/m7/module/mo_tracer_processes.F90 index a41c7f7c..8443c307 100755 --- a/ifs-source/arpifs/m7/module/mo_tracer_processes.F90 +++ b/ifs-source/arpifs/m7/module/mo_tracer_processes.F90 @@ -44,15 +44,15 @@ MODULE mo_tracer_processes PUBLIC :: xt_initialize ! set initial values ! ioinitial, iorestart (### former xtini) PUBLIC :: xt_burden_init_mem ! set up burden diagnostics PUBLIC :: xt_burden ! calculate tracer burdens - PUBLIC :: xt_conv_massfix ! adjust tracer mass in convection #endif + PUBLIC :: xt_conv_massfix ! adjust tracer mass in convection PUBLIC :: xt_borrow ! another mass fixer -#ifdef HAMMOZ +!#ifdef HAMMOZ !--- module variables REAL(wp), ALLOCATABLE :: zxtte_old(:,:,:) ! for xt_convmassfix !$OMP THREADPRIVATE(zxtte_old) -#endif +!#endif CONTAINS #ifdef HAMMOZ @@ -830,15 +830,12 @@ SUBROUTINE xt_burden(kproma, kbdim, klev, klevp1, krow, & ! Local dimensions END SUBROUTINE xt_burden +#endif SUBROUTINE xt_conv_massfix (kproma, kbdim, klev, & klevp1, ktrac, krow, & papp1, paphp1, pxtte, & -#ifdef HAMMOZ loini, pxtbound) -#else - loini) -#endif ! *xt_massfix* corrects the tendencies of each column to ! conserve mass @@ -895,9 +892,7 @@ SUBROUTINE xt_conv_massfix (kproma, kbdim, klev, & paphp1(kbdim,klevp1) REAL(wp), INTENT(INOUT) :: pxtte(kbdim,klev,ktrac) !>>SF -#ifdef HAMMOZ REAL(wp), INTENT(IN) :: pxtbound(kbdim,ktrac) ! boundary condition (wet deposition) [kg m-2 s-1] -#endif !<>SF -#ifdef HAMMOZ zdxtdt(1:kproma)=zdxtdt(1:kproma)+pxtbound(1:kproma,jt) !SF restore boundary cond. calc. -#endif !< var non used ] USE YOMCST, ONLY: RMSO2, RMSO4, RMD, RNAVO ! [RCHG -> var non used ] USE YOESRTCOP, ONLY: RSASWA, RSASWB, RSFUA0, RSFUA1 -! [RCHG -> var non used ] USE YOMCOMPO , ONLY : YRCOMPO -! implementation of HAM-M7 +! HAM-M7 USE MO_HAM, ONLY: nclass, naerocomp, sizeclass, nccndiag, subm_ngasspec USE OIFS_TO_HAM, ONLY: ind_oifs_ham -USE MO_HAM_SUBM, ONLY: HAM_SUBM_INTERFACE !eehol: replaced HAM-M7 call with submodel interface -USE MO_ACTIV, ONLY: activ_updraft,nw, idt_cdnc, idt_icnc !eehol: HAM-M7 activation updraft calculation, effective radii -USE MO_HAM_ACTIV, ONLY: ham_activ_abdulrazzak_ghan, ham_activ_koehler_ab !eehol: HAM-M7 activation -USE MO_PARAM_SWITCHES, ONLY: ncd_activ !eehol: for activation -USE MO_TRACDEF, ONLY: ntrac, trlist - !eehol: number of tracer for mass/number mixing ratio conversion, trlist for wet deposition flags -USE MO_TRACER_PROCESSES, ONLY: xt_borrow !eehol: conserving the negative tracer values from tendency -USE MO_SUBMODEL, ONLY: lwetdep,lsedimentation !eehol: logical for wetdeposition, sedimentation -USE MO_TIME_CONTROL, ONLY: time_step_len ! time step length for tendency +USE MO_HAM_SUBM, ONLY: HAM_SUBM_INTERFACE ! replaced HAM-M7 call with submodel interface +USE MO_ACTIV, ONLY: activ_updraft,nw, idt_cdnc, idt_icnc ! HAM-M7 activation updraft calculation, effective radii +USE MO_HAM_ACTIV, ONLY: ham_activ_abdulrazzak_ghan, ham_activ_koehler_ab ! HAM-M7 activation +USE MO_PARAM_SWITCHES, ONLY: ncd_activ ! for activation +USE MO_TRACDEF, ONLY: ntrac, trlist ! number of tracer for mass/number mixing ratio conversion, trlist for wet deposition flags +USE MO_TRACER_PROCESSES, ONLY: xt_borrow, xt_conv_massfix ! conserving the negative tracer values from tendency, and convective case +USE MO_SUBMODEL, ONLY: lwetdep,lsedimentation ! logical for wetdeposition, sedimentation +USE MO_TIME_CONTROL, ONLY: time_step_len ! time step length for tendency USE MO_HAMMOZ_WETDEP, ONLY: wetdep_interface ! wet deposition interface call USE MO_HAM_WETDEP, ONLY: ham_conv_lfraq_so2 -USE MO_HAMMOZ_SEDIMENTATION, ONLY: sedi_interface ! sedimentation interface call +USE MO_HAMMOZ_SEDIMENTATION, ONLY: sedi_interface ! sedimentation interface call USE MO_HAMMOZ_DRYDEP, ONLY: drydep_interface ! dry deposition interface call USE MO_HAM_RAD, ONLY: ham_rad,ham_rad_cache_cleanup,ham_rad_cache @@ -240,7 +238,7 @@ SUBROUTINE HAMM7_INTERFACE( & REAL(KIND=JPRB),INTENT(IN) :: PCVL(KLON) ! added low vegetation cover REAL(KIND=JPRB),INTENT(IN) :: PCVH(KLON) ! added high vegetation cover REAL(KIND=JPRB),INTENT(IN) :: PGEMU(KLON) ! sine of latitude - +REAL(KIND=JPRB),INTENT(IN) :: PMFU(KLON,KLEV) ! Conv. mass flux up REAL(KIND=JPRB),INTENT(INOUT) :: PTENC(KLON,KLEV,KTRAC) REAL(KIND=JPRB),INTENT(INOUT) :: PAERDDP(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO) REAL(KIND=JPRB),INTENT(INOUT) :: PAERSDM(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO) @@ -358,10 +356,7 @@ SUBROUTINE HAMM7_INTERFACE( & ! [RCHG -> non used ] REAL(KIND=JPRB) :: ZVISCON, ZVISRAY ! [RCHG -> non used ] REAL(KIND=JPRB) :: pmrateps(KLON,KLEV),pmrater(KLON,KLEV),pfevapr(KLON,KLEV) ! [RCHG -> non used ] REAL(KIND=JPRB) :: pfsubls(KLON,KLEV),pmsnowacl(KLON,KLEV) -! [RCHG -> non used ] REAL(KIND=JPRB) :: ZDPG(KLON,KLEV),zxtp1c(KLON,KLEV,KTRAC),zxtp10(KLON,KLEV,KTRAC) ! [RCHG -> non used ] INTEGER(KIND=JPIM) ::KTOP -! [RCHG -> non used ] REAL(KIND=JPRB) :: ZRHOP1(KLON,KLEV)!,zdummy,zdum2d(KLON,KLEV),zdum3d(KLON,KLEV,nmod) -! [RCHG -> non used ] REAL(KIND=JPRB) :: zlfrac_so2(KLON,KLEV),ZFLXR,ZFLXS,ZFLXRB,ZFLXSB ! [RCHG -> non used ] REAL(KIND=JPRB) :: ZAEROUT1(KLON,KLEV),ZAEROUT2(KLON,KLEV),ZAEROUT3(KLON,KLEV),ZAEROUT4(KLON,KLEV),ZAEROUT5(KLON,KLEV) REAL(KIND=JPRB),PARAMETER :: INFINITY=HUGE(1._JPRB) @@ -389,19 +384,24 @@ SUBROUTINE HAMM7_INTERFACE( & REAL(KIND=JPRB) :: ZSC(KLON,KLEV,nclass) !critical supersaturation [% 0-1] REAL(KIND=JPRB) :: ZNACT(KLON,KLEV,nclass) !number of activated particles per mode [m-3] REAL(KIND=JPRB) :: ZFRACN(KLON,KLEV,nclass) !fraction of activated particles per mode -REAL(KIND=JPRB) :: ZCDNCACT(KLON,KLEV) !number of activated particles +REAL(KIND=JPRB) :: ZCDNCACT(KLON,KLEV) !number of activated particles [m-3] REAL(KIND=JPRB) :: ZRE_LIQ(KLON,KLEV)! liquid effective radius ! variables for HAM-M7 wet deposition -REAL(KIND=JPRB) :: ZXTP1(KLON,KLEV,ntrac) !updated tracer mass/number mixing ratio +REAL(KIND=JPRB) :: ZXTP1(KLON,KLEV,ntrac) !updated tracer mass/number mixing ratio REAL(KIND=JPRB) :: ZXTP1C(KLON,KLEV,ntrac) !in-cloud tracer mass/number mixing ratio REAL(KIND=JPRB) :: ZXTP10(KLON,KLEV,ntrac) !ambient tracer mass/number mixing ratio REAL(KIND=JPRB) :: ZDUMMY(KLON,ntrac) !placeholder for pxtbound which is only necessary in the conv. case (conv. massfix boundary condition) REAL(KIND=JPRB) :: ZDUM3D(KLON,KLEV,ntrac) !updraft mass flux (for conv case only) + +REAL(KIND=JPRB) :: ZWDEP_SCAV_IC(KLON,ntrac) !in-cloud scavenged mr +REAL(KIND=JPRB) :: ZWDEP_SCAV_BC(KLON,ntrac) !below cloud scavenged mr +REAL(KIND=JPRB) :: ZFUXT3D(KLON,KLEV,ntrac) !updraft mass flux (for conv case only) + REAL(KIND=JPRB) :: ZDUM2D(KLON,KLEV) !convective flux needed only for conv. case (see cuflx) REAL(KIND=JPRB) :: ZLFRAC_SO2(KLON,KLEV) !liquid tracer fraction (SO2) -ham specific- REAL(KIND=JPRB) :: ZDPG(KLON,KLEV) !dp/g REAL(KIND=JPRB) :: ZQP(KLON,KLEV) !full level humidity with treshold -LOGICAL :: LSTRAT = .TRUE. !logical switch for stratiform or convective case (TRUE for strat., FALSE for conv.) +LOGICAL :: LSTRAT !logical switch for stratiform or convective case (TRUE for strat., FALSE for conv.) REAL(KIND=JPRB) :: ZFEVAPR(KLON,KLEV) !evaporation of rain [kg/m2/s] REAL(KIND=JPRB) :: ZFSUBLS(KLON,KLEV) !sublimation of snow [kg/m2/s] REAL(KIND=JPRB) :: ZMRATEPR(KLON,KLEV) !rain formation rate in cloudy part @@ -428,35 +428,38 @@ SUBROUTINE HAMM7_INTERFACE( & REAL(KIND=JPRB) :: ZCDNL(KLON), ZCDNW(KLON) !ustar (in not used variable), aerodynamic resis. on surface (in not used variable) REAL(KIND=JPRB) :: ZXTMD1(KLON,KLEV,ntrac) !tracer mixing ratios for HAM drydep (updated with tend) ! output diagnostics - REAL(KIND=JPRB) :: ZOUT(KLON,ntrac),ZOUT2(KLON,14),zout3(KLON,KLEV,2*(naerocomp+nclass)) -!REAL(KIND=JPRB) :: ZOUT4(KLON,KLEV),ZOUT5(KLON,klev),ZOUT6(KLON,klev),ZOUT7(KLON,klev),ZOUT8(KLON,klev),ZOUT9(KLON,klev) -!REAL(KIND=JPRB) :: ZZOUT1(KLON,KLEV),ZZOUT2(KLON,klev),ZZOUT3(KLON,KLEV),ZZOUT4(KLON,KLEV),ZZOUT5(KLON,klev),ZZOUT6(KLON,KLEV) -!REAL(KIND=JPRB) :: ZZOUT7(KLON,KLEV),ZZOUT8(KLON,klev),ZZOUT9(KLON,KLEV),ZZOUT10(KLON,KLEV),ZZOUT11(KLON,klev),ZZOUT12(KLON,KLEV) +REAL(KIND=JPRB) :: ZOUT(KLON,ntrac),ZOUT2(KLON,14),zout3(KLON,KLEV,2*(naerocomp+nclass)) -REAL(KIND=JPRB) :: sedout(KLON,KLEV,ktrac) ! changed ntrack to ktrac (RCHG) -REAL(KIND=JPRB) :: ddepout(KLON,KLEV,KTRAC) -REAL(KIND=JPRB) :: Wdepout(KLON,KLEV,ktrac) -REAL(KIND=JPRB) :: sedout_2D(KLON,ktrac) -REAL(KIND=JPRB) :: ddepout_2D(KLON,KTRAC) -REAL(KIND=JPRB) :: Wdepout_2D(KLON,ktrac) +REAL(KIND=JPRB) :: SEDOUT(KLON,KLEV,KTRAC) ! changed ntrack to ktrac (RCHG) +REAL(KIND=JPRB) :: DDEPOUT(KLON,KLEV,KTRAC) +REAL(KIND=JPRB) :: WDEPOUT(KLON,KLEV,KTRAC) +REAL(KIND=JPRB) :: SEDOUT_2D(KLON,KTRAC) + +REAL(KIND=JPRB) :: DDEPOUT_2D(KLON,KTRAC) +REAL(KIND=JPRB) :: WDEPOUT_2D(KLON,KTRAC) + +REAL(KIND=JPRB) :: WDEPOUT_IC_2D(KLON,KTRAC) +REAL(KIND=JPRB) :: WDEPOUT_BC_2D(KLON,KTRAC) + REAL(KIND=JPRB) :: M7TEND_OUT(KLON,KLEV,KTRAC) REAL(KIND=JPRB) :: M7TEND_IN(KLON,KLEV,KTRAC) -REAL(KIND=JPRB) :: zaveragep(KLON,klev,(nclass+naerocomp)) -REAL(KIND=JPRB) :: zm7kappa(KLON,klev,(nclass+naerocomp)) -REAL(KIND=JPRB) :: zh2so4cs(KLON,klev,(nclass+naerocomp)) -REAL(KIND=JPRB) :: zm7prodcond(KLON,klev,(nclass+naerocomp)) +REAL(KIND=JPRB) :: ZAVERAGEP(KLON,KLEV,(NCLASS+NAEROCOMP)) +REAL(KIND=JPRB) :: ZM7KAPPA(KLON,KLEV,(NCLASS+NAEROCOMP)) +REAL(KIND=JPRB) :: ZH2SO4CS(KLON,KLEV,(NCLASS+NAEROCOMP)) +REAL(KIND=JPRB) :: ZM7PRODCOND(KLON,KLEV,(NCLASS+NAEROCOMP)) REAL(KIND=JPRB) :: ZVDA(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO) -REAL(KIND=JPRB) :: ZSEDIFLUX(KLON,KLEV,ntrac) -REAL(KIND=JPRB) :: ZDDEPFLUX(KLON,ntrac) +REAL(KIND=JPRB) :: ZSEDIFLUX(KLON,KLEV,NTRAC) +REAL(KIND=JPRB) :: ZSEDIFLUXSURF(KLON,NTRAC) +REAL(KIND=JPRB) :: ZDDEPFLUX(KLON,NTRAC) REAL(KIND=JPRB) :: ZDDEPFLUX_SO2(KLON) -REAL(KIND=JPRB) :: ZVDEP(KLON,ntrac) !ddep velocity for diagnostics from ham -INTEGER(kind=JPIM), parameter::ZKROW=1 ! KROW only used in ECHAM but needed inside HAM-codes so set as 1. -INTEGER(kind=JPIM) :: IBLK -REAL(KIND=JPRB) :: reffi(KLON,KLEV,ZKROW), reffl(KLON,KLEV,ZKROW) -INTEGER(kind=JPIM) :: LWBANDS !laakso: number of LW bands +REAL(KIND=JPRB) :: ZVDEP(KLON,NTRAC) !ddep velocity for diagnostics from ham +INTEGER(KIND=JPIM), parameter::ZKROW=1 ! KROW only used in ECHAM but needed inside HAM-codes so set as 1. +INTEGER(KIND=JPIM) :: IBLK +REAL(KIND=JPRB) :: REFFI(KLON,KLEV,ZKROW), REFFL(KLON,KLEV,ZKROW) +INTEGER(KIND=JPIM) :: LWBANDS !laakso: number of LW bands INTEGER(KIND=JPIM) :: INWAVL, ITWAVL(20) REAL(KIND=JPRB) :: PRS1D(KLON,KLEV) -INTEGER(kind=JPIM) :: ISO4_C, ISSO4_C ! temporary tracer index of gas-phase SO4 (retrieved from chemistry module) +INTEGER(KIND=JPIM) :: ISO4_C, ISSO4_C ! temporary tracer index of gas-phase SO4 (retrieved from chemistry module) ! [RCHG -> non used ] REAL(KIND=JPRB) :: ZTENCI(KLON,KLEV,KTRAC) !for OIFS tendencies ! [RCHG -> non used ] INTEGER(kind=JPIM)::ZISO4 ! temporary tracer index of gas-phase SO4 (retrieved from chemistry module) @@ -561,32 +564,6 @@ SUBROUTINE HAMM7_INTERFACE( & !* 0. PROGNOSTIC AEROSOLS - FINAL COMPUTATIONS ! ---------------------------------------- -!write(*,*) "PGEOH", minval(PGEOH) -!write(*,*) "PRS1", minval(PRS1) , minval(PRSF1) , minval(PAEROP) -!write(*,*) "PCAERO ", minval(PCAERO) , minval(PCEN) , minval(PAPHIF) -!write(*,*) "PFPLSN ", minval(PFPLSN) , minval(PGELAT), minval(PGELAM) -!write(*,*) "PFPLCL ", minval(PFPLCL) , minval(PFPLCN) , minval(PFPLSL) -!write(*,*) "PRP ", minval(PRP) , minval(PSP) -!write(*,*) "PAP", minval(PAP) , minval(PIP) , minval(PLP) -!write(*,*) "1", minval(PCOVPTOT), minval(PLU) , minval(PO3P) ,minval(PQP) , minval(PTP) -!write(*,*) "2", minval(PTHP) , minval(PTENC) ,minval( PCFLX) -!write(*,*) "3", minval(PAERDDP), minval(PAERSDM), minval(PAERSRC), minval(PAERWS) -!write(*,*) "4", minval(PAERGUST), minval(PAERUST), minval(PAERMAP) -!write(*,*) "5", minval(PCLAERS), minval(PPRAERS), minval(PCHEM2AER) -!write(*,*) "6.2", minval(PFRTI) -!write(*,*) "6.3", minval(PLSM) -!write(*,*) "6.4", minval(PSNS) -!write(*,*) "7", minval(PWND) , minval(PWS1) , minval(PAERFLX), minval(PAERLIF) -!!write(*,*) "8", minval(PAERODDF),PTSPHY -!!write(*,*) "9", minval(PODTO) , minval(PAERO_WVL_DIAG) -!write(*,*) "10", minval(PAER_TAU), minval(PAER_SSA),minval(PAER_ASYM),minval(PAER_TAU_LW) -!!write(*,*) "11", minval(PTAUS_AER),minval(PTAUA_AER),minval(PPMAER) -!write(*,*) "12", minval(PEXTRA), minval(PVERVEL), minval(PCCNL), minval(PCCNO) -!write(*,*) "13", minval(PAHFSTI), minval(PCI), minval(PZ0M), minval(PAHFLEV) -!write(*,*) "14", minval(PUP), minval(PVP), minval(PCVL), minval(PCVH), minval(PGEMU)! -!write(*,*) "15", minval(PSO2DD) - - ZAHFSM = 0._JPRB ZEPSCOV = 1.E-03_JPRB ZEPSWAT = 1.E-18_JPRB @@ -599,51 +576,25 @@ SUBROUTINE HAMM7_INTERFACE( & ! -------------------------------------------------------- ALLOCATE( ZAERNGT(KLON,NACTAERO) ) - -! RCHG -> there is a recurrent error: initialize without KIDIA:KFDIA ZAERNGT(KIDIA:KFDIA,1:NACTAERO) = 0._JPRB !ALLOCATE( ZAERSCC(KLON,NACTAERO) ) !ALLOCATE( ZAERSRC(KLON,NACTAERO) ) !ZAERSRC(KIDIA:KFDIA,1:NACTAERO) =0._JPRB !ZAERSCC(KIDIA:KFDIA,1:NACTAERO) =0._JPRB -!ZAEROUT1(:,:) =0._JPRB -!ZAEROUT2(:,:) =0._JPRB -!ZAEROUT3(:,:) =0._JPRB -!ZAEROUT4(:,:) =0._JPRB -!ZAEROUT5(:,:) =0._JPRB - -! -! RCHG -> FIXME be careful. This subroutine has KIDIA, KFDIA in the -! arguments so probably it is designed for parallel grid. -! this initialization may overwrite zeros the proper way might -! be ARRAY(KIDIA:KFDIA,:,:) = 0._JPRB -! - ZOUT(:,:) = 0._JPRB - ZOUT2(:,:) = 0._JPRB - ZOUT3(:,:,:) = 0._JPRB - ! Need to initialize those 3 arrays early in case LAERDRYDP=F (GNU, Lianghai Wu) - ZVDEP(KIDIA:KFDIA,:) = 0._JPRB ! ddep velocity as zero - ZXTEMS(:,:) = 0._JPRB ! surface emissions as zero for input - ZXTMD1(:,:,:) = 0._JPRB -!ZOUT4(:,:) = 0._JPRB -!ZOUT5(:,:) = 0._JPRB -!ZOUT6(:,:) = 0._JPRB -!ZOUT7(:,:) = 0._JPRB -!ZOUT8(:,:) = 0._JPRB -!ZOUT9(:,:) = 0._JPRB -!ZZOUT1(:,:) = 0._JPRB -!ZZOUT2(:,:) = 0._JPRB -!ZZOUT3(:,:) = 0._JPRB -!ZZOUT4(:,:) = 0._JPRB -!ZZOUT5(:,:) = 0._JPRB -!ZZOUT6(:,:) = 0._JPRB -!ZZOUT7(:,:) = 0._JPRB -!ZZOUT8(:,:) = 0._JPRB -!ZZOUT9(:,:) = 0._JPRB -!ZZOUT10(:,:) = 0._JPRB -!ZZOUT11(:,:) = 0._JPRB -!ZZOUT12(:,:) = 0._JPRB +!ZAEROUT1(KIDIA:KFDIA,:) =0._JPRB +!ZAEROUT2(KIDIA:KFDIA,:) =0._JPRB +!ZAEROUT3(KIDIA:KFDIA,:) =0._JPRB +!ZAEROUT4(KIDIA:KFDIA,:) =0._JPRB +!ZAEROUT5(KIDIA:KFDIA,:) =0._JPRB + +ZOUT(KIDIA:KFDIA,:) = 0._JPRB +ZOUT2(KIDIA:KFDIA,:) = 0._JPRB +ZOUT3(KIDIA:KFDIA,:,:) = 0._JPRB +! Need to initialize those 3 arrays early in case LAERDRYDP=F (GNU, Lianghai Wu) +ZVDEP(KIDIA:KFDIA,:) = 0._JPRB ! ddep velocity as zero +ZXTEMS(KIDIA:KFDIA,:) = 0._JPRB ! surface emissions as zero for input +ZXTMD1(KIDIA:KFDIA,:,:) = 0._JPRB M7TEND_IN(KIDIA:KFDIA,:,:) = 0._JPRB ! unused 2024-07-11 M7TEND_OUT(KIDIA:KFDIA,:,:) = 0._JPRB ! unused 2024-07-11 @@ -651,12 +602,15 @@ SUBROUTINE HAMM7_INTERFACE( & DDEPOUT(KIDIA:KFDIA,:,:) = 0._JPRB WDEPOUT(KIDIA:KFDIA,:,:) = 0._JPRB ZSEDIFLUX(KIDIA:KFDIA,:,:) = 0._JPRB +ZSEDIFLUXSURF(KIDIA:KFDIA,:) = 0._JPRB ZDDEPFLUX(KIDIA:KFDIA,:) = 0._JPRB ZDDEPFLUX_SO2(KIDIA:KFDIA) = 0._JPRB ZVDA(KIDIA:KFDIA,:) = 0._JPRB ! unused 2024-07-11 SEDOUT_2D(KIDIA:KFDIA,:) = 0._JPRB DDEPOUT_2D(KIDIA:KFDIA,:) = 0._JPRB ! unused 2024-07-11 WDEPOUT_2D(KIDIA:KFDIA,:) = 0._JPRB +WDEPOUT_IC_2D(KIDIA:KFDIA,:) = 0._JPRB +WDEPOUT_BC_2D(KIDIA:KFDIA,:) = 0._JPRB ZAVERAGEP(KIDIA:KFDIA,:,:) = 0.0_JPRB ! unused 2024-07-11 ZM7KAPPA(KIDIA:KFDIA,:,:) = 0.0_JPRB ! unused 2024-07-11 @@ -873,7 +827,6 @@ SUBROUTINE HAMM7_INTERFACE( & ZSVOC(KIDIA:KFDIA,1:KLEV)=0.0_JPRB END IF -! RCHG => before it has ZICNC(:,:)=0._JPRB which is a semantic error. !calculate ICNC ZICNC(KIDIA:KFDIA,1:KLEV) = 0._JPRB ZICNC(KIDIA:KFDIA,1:KLEV) = RNICE @@ -899,34 +852,40 @@ SUBROUTINE HAMM7_INTERFACE( & ZXTM1(JL,JK,ind_oifs_ham%ind_mass_HAM(JMASS)) = ZCEN(JL,JK,KAERO(ind_oifs_ham%ind_mass_OIFS(JMASS))) ZXTTE(JL,JK,ind_oifs_ham%ind_mass_HAM(JMASS)) = PTENC(JL,JK,KAERO(ind_oifs_ham%ind_mass_OIFS(JMASS))) ! in case of simple sulfur scheme add SO4_AQ part into SO4_ACS - ! both original tendency and m7tendency + ! both original tendency and m7tendency [FIXME: what??] + + !ADD SO4 from wet chemistry to tendencies + if(trim(YAERO(ind_oifs_ham%ind_mass_OIFS(JMASS))%CNAME)=='SO4_AS') then + ZXTTE(JL,JK,ind_oifs_ham%ind_mass_HAM(JMASS))=ZXTTE(JL,JK,ind_oifs_ham%ind_mass_HAM(JMASS))+PCHEM2AER(JL,JK,2) + end if END DO END DO END DO !gas DO JGAS=1,subm_ngasspec + JO=ind_oifs_ham%ind_gas_OIFS(JGAS) ! JO -> index context OIFS + JH=ind_oifs_ham%ind_gas_HAM(JGAS) ! JH -> index context HAM DO JK=1,KLEV DO JL=KIDIA,KFDIA IF (LAERCHEM) THEN - ZXTM1(JL,JK,ind_oifs_ham%ind_gas_HAM(JGAS)) = ZCEN(JL,JK,KCHEM(ind_oifs_ham%ind_gas_OIFS(JGAS))) - ZXTTE(JL,JK,ind_oifs_ham%ind_gas_HAM(JGAS)) = PTENC(JL,JK,KCHEM(ind_oifs_ham%ind_gas_OIFS(JGAS))) - !ADD SO4 from wet chemistry to tendencies - IF (ind_oifs_ham%ind_gas_OIFS(JGAS) == ISO4ACS )THEN - ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_gas_OIFS(JGAS))=ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_gas_OIFS(JGAS))+PCHEM2AER(KIDIA:KFDIA,1:KLEV,2) - ELSEIF( ind_oifs_ham%ind_gas_OIFS(JGAS) == ISO4COS)THEN - ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_gas_OIFS(JGAS))=ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_gas_OIFS(JGAS))+PCHEM2AER(KIDIA:KFDIA,1:KLEV,3) + ZXTM1(JL,JK,JH) = ZCEN(JL,JK,KCHEM(JO)) + IF(TRIM(YCHEM(JO)%CNAME)=='SO4')THEN ! Add SO4 from wet chemistry to tendencies + ZXTTE(JL,JK,JH) = PCHEM2AER(JL,JK,1) + ELSE + ZXTTE(JL,JK,JH) = PTENC(JL,JK,KCHEM(JO)) END IF - ELSE !simple sulfur scheme - IF(TRIM(YAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))%CNAME)=='SO2')THEN - ZXTM1(JL,JK,ind_oifs_ham%ind_gas_HAM(JGAS)) = ZCEN(JL,JK,KAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))) - ZXTTE(JL,JK,ind_oifs_ham%ind_gas_HAM(JGAS)) = PTENC(JL,JK,KAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))) - ZXTTEM1(JL,JK,ind_oifs_ham%ind_gas_HAM(JGAS)) = PTENC(JL,JK,KAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))) + ELSE + ! Simple sulfur scheme + IF(TRIM(YAERO(JO)%CNAME)=='SO2')THEN + ZXTM1(JL,JK,JH) = ZCEN(JL,JK,KAERO(JO)) + ZXTTE(JL,JK,JH) = PTENC(JL,JK,KAERO(JO)) + ZXTTEM1(JL,JK,JH) = PTENC(JL,JK,KAERO(JO)) - ELSE IF (TRIM(YAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))%CNAME)=='SO4_gas')THEN - ZXTM1(JL,JK,ind_oifs_ham%ind_gas_HAM(JGAS)) = ZCEN(JL,JK,KAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))) - ZXTTE(JL,JK,ind_oifs_ham%ind_gas_HAM(JGAS)) = PTENC(JL,JK,KAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))) - ZXTTEM1(JL,JK,ind_oifs_ham%ind_gas_HAM(JGAS)) = PTENC(JL,JK,KAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))) + ELSE IF (TRIM(YAERO(JO)%CNAME)=='SO4_gas')THEN + ZXTM1(JL,JK,JH) = ZCEN(JL,JK,KAERO(JO)) + ZXTTE(JL,JK,JH) = PTENC(JL,JK,KAERO(JO)) + ZXTTEM1(JL,JK,JH) = PTENC(JL,JK,KAERO(JO)) END IF END IF @@ -953,7 +912,7 @@ SUBROUTINE HAMM7_INTERFACE( & !ENDIF ! implementation of HAM-M7 -ZWND(:) = 0._JPRB +ZWND(KIDIA:KFDIA) = 0._JPRB DO JL=KIDIA,KFDIA ZWND(JL)=MAX(1.0E-10_JPRB,PAERWS(JL)) ! make threshold for wind speed ! Compute average fluxes over tiles @@ -1023,13 +982,6 @@ SUBROUTINE HAMM7_INTERFACE( & !----------------------------------------------------------------- ! Submodel interface call (HAM aerosol microphysics) - ! changes to particles: - ! Update SO4ACS and SO4OCS tendencies to include the contribution from wet chemistry - IF (LAERCHEM) THEN - ZTAEROK(KIDIA:KFDIA,1:KLEV,ISO4ACS)=ZTAEROK(KIDIA:KFDIA,1:KLEV,ISO4ACS)+PCHEM2AER(KIDIA:KFDIA,1:KLEV,2) - ZTAEROK(KIDIA:KFDIA,1:KLEV,ISO4COS)=ZTAEROK(KIDIA:KFDIA,1:KLEV,ISO4COS)+PCHEM2AER(KIDIA:KFDIA,1:KLEV,3) - END IF - CALL GSTATS(2501,0) CALL HAM_SUBM_INTERFACE(& @@ -1040,7 +992,7 @@ SUBROUTINE HAMM7_INTERFACE( & & ZM6RP, ZM6DRY, & !mean mode actual radius [m], dry radius for soluble modes [m] & ZRHOP, ZWW, & !mean mode particle density [kg m-3], aerosol water content for each mode [kg(water)-3(air)] & ZAP, ZGRVOL, & !cloud fraction, grid box volume (only for diagnostics) - & ZPBL, zout3) !boundary layer top level, outputs + & ZPBL, ZOUT3) !boundary layer top level, outputs CALL GSTATS(2501,1) @@ -1098,12 +1050,13 @@ SUBROUTINE HAMM7_INTERFACE( & !----------------------------------------------------------------- - !<-- Store CDNC (number of activated particles) and ICNC as a number mixing ratio to tracer values and to PGFL fields - ZXTM1(KIDIA:KFDIA,1:KLEV,idt_cdnc) = ZCDNCACT(KIDIA:KFDIA,1:KLEV)/ZRHO(KIDIA:KFDIA,1:KLEV) ! [#/kg] - ZXTM1(KIDIA:KFDIA,1:KLEV,idt_icnc) = (1.0E6_JPRB)*ZICNC(KIDIA:KFDIA,1:KLEV)/ZRHO(KIDIA:KFDIA,1:KLEV) !ice crystal number conc = #/cm3 --> number mix rat [#/kg] - PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH) = (1.0E-6_JPRB)*ZCDNCACT(KIDIA:KFDIA,1:KLEV) ! add CDNC to PGFL field (convert from #/m3 to #/cm3) - PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH) = ZICNC(KIDIA:KFDIA,1:KLEV) ! add ICNC to PGFL field (does not need convert) - !--> End store CDNC and ICNC + !<-- Store CDNC (number of activated particles) and ICNC as a number mixing ratio to tracer values and to PGFL fields + ZXTM1(KIDIA:KFDIA,1:KLEV,idt_cdnc) = (MAX(ZCDNCACT(KIDIA:KFDIA,1:KLEV),((1.0E6_JPRB)*1._JPRB)))/ZRHO(KIDIA:KFDIA,1:KLEV) ! [#/kg] and treshold CDNC to 1 cm-3 + ZXTM1(KIDIA:KFDIA,1:KLEV,idt_icnc) = (1.0E6_JPRB)*ZICNC(KIDIA:KFDIA,1:KLEV)/ZRHO(KIDIA:KFDIA,1:KLEV) !ice crystal number conc = #/cm3 --> number mix rat [#/kg] + + PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH) = MAX(((1.0E-6_JPRB)*ZCDNCACT(KIDIA:KFDIA,1:KLEV)),1._JPRB) ! add CDNC to PGFL field (convert from #/m3 to #/cm3) and treshold minimum value to 1 cm-3 + PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH) = ZICNC(KIDIA:KFDIA,1:KLEV) ! add ICNC to PGFL field (does not need convert) + !--> End store CDNC and ICNC !----------------------------------------------------------------- @@ -1144,30 +1097,27 @@ SUBROUTINE HAMM7_INTERFACE( & !----------------------------------------------------------------- !--- Mass conserving correction of negative tracer values: - CALL xt_borrow(KFDIA, KLON, KLEV, KLEV+1, ntrac, & + CALL XT_BORROW(KFDIA, KLON, KLEV, KLEV+1, NTRAC, & PRSF1, PRS1, & ZXTM1, ZXTTE) ! RCHG -> This is wetdep interface it can be a subroutine afer "CONTAINS" ! + !----------------------------------------------------------------- !--> Wet deposition for HAM-M7 CALL GSTATS(2503,0) IF ( LAERSCAV ) THEN !--> initialize mixing ratios for wet deposition - !-- initialise in-cloud and interstitial mixing ratios - ! set both equal to tracer mixing ratio as starting point - ! ham_wet_chemistry will re-compute these values if lham=true + ! Only ZXTP1, in case LWETDEP=false or no tracers subject to wet dep, since it may be used in drydep! DO JT = 1,NTRAC - ZXTP1(KIDIA:KFDIA,1:KLEV,JT) = ZXTM1(KIDIA:KFDIA,1:KLEV,JT) + ZXTTE(KIDIA:KFDIA,1:KLEV,JT) * time_step_len - ZXTP1C(KIDIA:KFDIA,1:KLEV,JT) = ZXTP1(KIDIA:KFDIA,1:KLEV,JT) - ZXTP10(KIDIA:KFDIA,1:KLEV,JT) = ZXTP1(KIDIA:KFDIA,1:KLEV,JT) + ZXTP1(KIDIA:KFDIA,1:KLEV,JT) = ZXTM1(KIDIA:KFDIA,1:KLEV,JT) + ZXTTE(KIDIA:KFDIA,1:KLEV,JT) * TIME_STEP_LEN END DO !<-- call wetdep interface for wet deposition !-- interface to wet deposition routine (also from cuflx_subm) - IF ( lwetdep .AND. ANY(trlist%ti(:)%nwetdep > 0) ) THEN + IF ( LWETDEP .AND. ANY(trlist%ti(:)%nwetdep > 0) ) THEN ! for calculating the rain and snow evaporation/formation variables used in wet deposition DO JK=1,KLEV @@ -1193,38 +1143,114 @@ SUBROUTINE HAMM7_INTERFACE( & END DO ZMSNOWACL(KIDIA:KFDIA,1:KLEV) = ZMRATEPS(KIDIA:KFDIA,1:KLEV) !? - ZDUMMY(:,:) = 0._JPRB ! initialize dummy variables for conv. case only - ZDUM2D(:,:) = 0._JPRB ! initialize dummy variables for conv. case only - ZDUM3D(:,:,:) = 0._JPRB ! initialize dummy variables for conv. case only - ZLFRAC_SO2(:,:) = 0._JPRB ! zlfrac_so2 only needed in gas scavenging and this is off for now (put this zero) + ZLFRAC_SO2(KIDIA:KFDIA,:) = 0._JPRB ! zlfrac_so2 only needed in gas scavenging and this is off for now (put this zero) ZLP(KIDIA:KFDIA,1:KLEV) = PLP(KIDIA:KFDIA,1:KLEV) ! temporary variable for cloud water content (modified in wetdep) ZIP(KIDIA:KFDIA,1:KLEV) = PIP(KIDIA:KFDIA,1:KLEV) ! temporary variable for cloud ice water content (modified in wetdep) - ZTENCIH(:,:,:) = 0._JPRB + ZTENCIH(KIDIA:KFDIA,1:KLEV,1:NTRAC)=ZXTTE(KIDIA:KFDIA,1:KLEV,1:NTRAC) + IF (.NOT.LAERCHEM)THEN - CALL HAM_CONV_LFRAQ_SO2(KFDIA,KLON,KLEV,PTP,zxtm1,zrho,ZLP,zlfrac_so2) + CALL HAM_CONV_LFRAQ_SO2(KFDIA,KLON,KLEV,PTP,ZXTM1,ZRHO,ZLP,ZLFRAC_SO2) END IF - CALL WETDEP_INTERFACE(KFDIA, KLON, KLEV, 1, ZKROW, LSTRAT, & !eehol: ktop = 1 (top level index), lstrat = TRUE for strat. case - ZDPG, ZMRATEPR, ZMRATEPS, ZMSNOWACL, & !eehol: dp/g, evap. of rain, subl. of snow, accr. rate of snow with cl. drop in-cl. - ZLP, ZIP, & !eehol: cloud water content, cloud ice water content - ZM6RP, ZM6DRY, & ! m7 aerosol: to replace rwet_m7, dry radius for soluble modes [cm] - reffi, reffl, & ! m7 aerosol - ZNACT, ZFRACN, & - PTP, ZXTM1, ZLFRAC_SO2, ZXTTE, ZXTP10, ZXTP1C, & !eehol: temperature, zlfrac_so2 only needed in gas scavenging (0 for now) - PFPLSL, PFPLSN, ZFEVAPR, ZFSUBLS, & !eehol: rain flux, snow flux, - ZDUM2D, ZDUM3D, & !eehol: as zero as these are not needed in strat. case - ZAP, PCOVPTOT, ZRHO, ZDUMMY) !eehol: cloud frac., precip. frac., air dens. + !Double call to wet deposition. One for convective case and one for stratiform case. + + ! WETDEP CONVECTIVE CASE + + !-- initialise in-cloud and interstitial mixing ratios + ! set both equal to tracer mixing ratio as starting point + ! ham_wet_chemistry will re-compute these values if lham=true + DO JT = 1,NTRAC + ZXTP1(KIDIA:KFDIA,1:KLEV,JT) = ZXTM1(KIDIA:KFDIA,1:KLEV,JT) + ZXTTE(KIDIA:KFDIA,1:KLEV,JT) * TIME_STEP_LEN + ZXTP1C(KIDIA:KFDIA,1:KLEV,JT) = ZXTP1(KIDIA:KFDIA,1:KLEV,JT) + ZXTP10(KIDIA:KFDIA,1:KLEV,JT) = ZXTP1(KIDIA:KFDIA,1:KLEV,JT) + END DO + + ZDUMMY(KIDIA:KFDIA,:) = 0._JPRB ! output: massfix boundary condition (updated in mo_hammoz_wetdep) + ZWDEP_SCAV_IC(KIDIA:KFDIA,:) = 0._JPRB ! output: diagnostic wdep in-cloud + ZWDEP_SCAV_BC(KIDIA:KFDIA,:) = 0._JPRB ! output: diagnostic wdep below cloud + ZDUM2D(KIDIA:KFDIA,1:KLEV) = 0._JPRB ! dummy "fraction of grid box covered by precip" for conv. case (zero at start as in ECHAM) + ZDUM3D(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB ! dummy "previous tracer mixing ratio" for conv. case + ZFUXT3D(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB ! initialize updr mass flux for conv. case only (updated in wetdep so put 0 at start) + + LSTRAT = .FALSE. !False for convective case + IF (.NOT. LSTRAT) THEN + CALL XT_CONV_MASSFIX(KFDIA, KLON, KLEV, KLEV+1, NTRAC, ZKROW, PRSF1, PRS1, ZXTTE, .TRUE., ZDUMMY) ! call convective mass conserving (init zxtte_old) + + CALL WETDEP_INTERFACE(KFDIA, KLON, KLEV, 1, ZKROW, LSTRAT, & ! ktop = 1 (top level index), lstrat = FALSE for conv. case + ZDPG, ZMRATEPR, ZMRATEPS, ZMSNOWACL, & ! dp/g, evap. of rain, subl. of snow, accr. rate of snow with cl. drop in-cl. + ZLP, ZIP, & ! cloud water content, cloud ice water content + ZM6RP, ZM6DRY, & ! m7 aerosol: to replace rwet_m7, dry radius for soluble modes [cm] + REFFI, REFFL, & ! effective radii + ZCDNCACT, ZFRACN, & ! number/fraction of activated particles per mode + PTP, ZDUM3D, ZLFRAC_SO2, & ! temperature, prev. mixing ratio, zlfrac_so2 only needed in gas scavenging (0 for now) + ZXTTE, ZXTP10, ZXTP1C, & ! tendencies/mixing ratios (in/out) + PFPLSL, PFPLSN, ZFEVAPR, ZFSUBLS, & ! rain flux, snow flux, + PMFU, ZFUXT3D, & ! conv flux, updraft mass flux (updated in wetdep) + ZAP, ZDUM2D, ZRHO, ZDUMMY, ZWDEP_SCAV_IC, ZWDEP_SCAV_BC) ! cloud frac., precip. frac., air dens., in/output*3 + + CALL XT_CONV_MASSFIX(KFDIA, KLON, KLEV, KLEV+1, NTRAC, ZKROW, PRSF1, PRS1, ZXTTE, .FALSE., ZDUMMY) ! call convective mass conserving + END IF + !Add convective case wet removal fluxes to diagnostics DO JMASS=1,NAEROCOMP JY=KAERO(ind_oifs_ham%ind_mass_OIFS(JMASS)) - WDEPOUT_2D(KIDIA:KFDIA, JY) = WDEPOUT_2D(KIDIA:KFDIA,JY) + ZDUMMY(KIDIA:KFDIA,ind_oifs_ham%ind_mass_ham(JMASS)) + WDEPOUT_2D (KIDIA:KFDIA,JY) = WDEPOUT_2D (KIDIA:KFDIA,JY) + ZDUMMY (KIDIA:KFDIA, ind_oifs_ham%ind_mass_ham(JMASS)) + WDEPOUT_IC_2D(KIDIA:KFDIA,JY) = WDEPOUT_IC_2D(KIDIA:KFDIA,JY) + ZWDEP_SCAV_IC(KIDIA:KFDIA, ind_oifs_ham%ind_mass_ham(JMASS)) + WDEPOUT_BC_2D(KIDIA:KFDIA,JY) = WDEPOUT_BC_2D(KIDIA:KFDIA,JY) + ZWDEP_SCAV_BC(KIDIA:KFDIA, ind_oifs_ham%ind_mass_ham(JMASS)) END DO DO JCLASS=1,NCLASS JY=KAERO(ind_oifs_ham%ind_class_OIFS(JCLASS)) - WDEPOUT_2D(KIDIA:KFDIA,JY) = WDEPOUT_2D(KIDIA:KFDIA,JY) + ZDUMMY(KIDIA:KFDIA, ind_oifs_ham%ind_class_ham(JCLASS)) + WDEPOUT_2D (KIDIA:KFDIA,JY) = WDEPOUT_2D (KIDIA:KFDIA,JY) + ZDUMMY (KIDIA:KFDIA, ind_oifs_ham%ind_class_ham(JCLASS)) + WDEPOUT_IC_2D(KIDIA:KFDIA,JY) = WDEPOUT_IC_2D(KIDIA:KFDIA,JY) + ZWDEP_SCAV_IC(KIDIA:KFDIA, ind_oifs_ham%ind_class_ham(JCLASS)) + WDEPOUT_BC_2D(KIDIA:KFDIA,JY) = WDEPOUT_BC_2D(KIDIA:KFDIA,JY) + ZWDEP_SCAV_BC(KIDIA:KFDIA, ind_oifs_ham%ind_class_ham(JCLASS)) + END DO + + ! WETDEP STRATIFORM CASE + + !-- initialise in-cloud and interstitial mixing ratios + ! set both equal to tracer mixing ratio as starting point + ! ham_wet_chemistry will re-compute these values if lham=true + DO JT = 1,NTRAC + ZXTP1(KIDIA:KFDIA,1:KLEV,JT) = ZXTM1(KIDIA:KFDIA,1:KLEV,JT) + ZXTTE(KIDIA:KFDIA,1:KLEV,JT) * TIME_STEP_LEN + ZXTP1C(KIDIA:KFDIA,1:KLEV,JT) = ZXTP1(KIDIA:KFDIA,1:KLEV,JT) + ZXTP10(KIDIA:KFDIA,1:KLEV,JT) = ZXTP1(KIDIA:KFDIA,1:KLEV,JT) + END DO + + ZDUMMY(KIDIA:KFDIA,:) = 0._JPRB ! output: massfix boundary condition (updated in mo_hammoz_wetdep) + ZWDEP_SCAV_IC(KIDIA:KFDIA,:) = 0._JPRB ! output: diagnostic wdep in-cloud + ZWDEP_SCAV_BC(KIDIA:KFDIA,:) = 0._JPRB ! output: diagnostic wdep below cloud + ZDUM2D(KIDIA:KFDIA,1:KLEV) = 0._JPRB ! dummy conv flux for strat. case + ZDUM3D(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB ! dummy updraft mass flux for strat. case + + LSTRAT = .TRUE. !True for strat case + CALL WETDEP_INTERFACE(KFDIA, KLON, KLEV, 1, ZKROW, LSTRAT, & ! ktop = 1 (top level index), lstrat = TRUE for strat. case + ZDPG, ZMRATEPR, ZMRATEPS, ZMSNOWACL, & ! dp/g, evap. of rain, subl. of snow, accr. rate of snow with cl. drop in-cl. + ZLP, ZIP, & ! cloud water content, cloud ice water content + ZM6RP, ZM6DRY, & ! m7 aerosol: to replace rwet_m7, dry radius for soluble modes [cm] + REFFI, REFFL, & ! effective radii + ZCDNCACT, ZFRACN, & ! number/fraction of activated particles per mode + PTP, ZXTM1, ZLFRAC_SO2, & ! temperature, prev. mixing ratio, zlfrac_so2 only needed in gas scavenging (0 for now) + ZXTTE, ZXTP10, ZXTP1C, & ! tendencies/mixing ratios (in/out) + PFPLSL, PFPLSN, ZFEVAPR, ZFSUBLS, & ! rain flux, snow flux, + ZDUM2D, ZDUM3D, & ! zeroes as these are not needed in strat. case + ZAP, PCOVPTOT, ZRHO, ZDUMMY, ZWDEP_SCAV_IC, ZWDEP_SCAV_BC) ! cloud frac., precip. frac., air dens., in/output*3 + + ! Add stratiform case wet removal fluxes to diagnostics + DO JMASS=1,NAEROCOMP + JY=KAERO(ind_oifs_ham%ind_mass_OIFS(JMASS)) + WDEPOUT_2D (KIDIA:KFDIA,JY) = WDEPOUT_2D (KIDIA:KFDIA,JY) + ZDUMMY (KIDIA:KFDIA, ind_oifs_ham%ind_mass_ham(JMASS)) + WDEPOUT_IC_2D(KIDIA:KFDIA,JY) = WDEPOUT_IC_2D(KIDIA:KFDIA,JY) + ZWDEP_SCAV_IC(KIDIA:KFDIA, ind_oifs_ham%ind_mass_ham(JMASS)) + WDEPOUT_BC_2D(KIDIA:KFDIA,JY) = WDEPOUT_BC_2D(KIDIA:KFDIA,JY) + ZWDEP_SCAV_BC(KIDIA:KFDIA, ind_oifs_ham%ind_mass_ham(JMASS)) + END DO + + DO JCLASS=1,NCLASS + JY=KAERO(ind_oifs_ham%ind_class_OIFS(JCLASS)) + WDEPOUT_2D (KIDIA:KFDIA,JY) = WDEPOUT_2D (KIDIA:KFDIA,JY) + ZDUMMY (KIDIA:KFDIA, ind_oifs_ham%ind_class_ham(JCLASS)) + WDEPOUT_IC_2D(KIDIA:KFDIA,JY) = WDEPOUT_IC_2D(KIDIA:KFDIA,JY) + ZWDEP_SCAV_IC(KIDIA:KFDIA, ind_oifs_ham%ind_class_ham(JCLASS)) + WDEPOUT_BC_2D(KIDIA:KFDIA,JY) = WDEPOUT_BC_2D(KIDIA:KFDIA,JY) + ZWDEP_SCAV_BC(KIDIA:KFDIA, ind_oifs_ham%ind_class_ham(JCLASS)) END DO END IF @@ -1246,13 +1272,12 @@ SUBROUTINE HAMM7_INTERFACE( & IF (LAERSEDIM) THEN IF ( lsedimentation .AND. ANY(trlist%ti(:)%nsedi > 0) ) THEN - ZTENCIH(:,:,:) = 0._JPRB ZTENCIH(KIDIA:KFDIA,1:KLEV,1:ntrac)=ZXTTE(KIDIA:KFDIA,1:KLEV,1:ntrac) CALL SEDI_INTERFACE(KLON, KFDIA, KLEV, ZKROW, & - PTP, ZQP, PRSF1, PRS1, & !eehol: temperature, specific humidity, pressure at full level, pressure at half level - ZM6RP, ZRHOP, & !mean mode actual radius [m], mean mode particle density [kg m-3] - ZXTM1, ZXTTE, ZSEDIFLUX) !eehol: tracer mixing ratios and tendency (sediflux for diagnostics) + PTP, ZQP, PRSF1, PRS1, & ! temperature, specific humidity, pressure at full level, pressure at half level + ZM6RP, ZRHOP, & ! mean mode actual radius [m], mean mode particle density [kg m-3] + ZXTM1, ZXTTE, ZSEDIFLUX, ZSEDIFLUXSURF) ! tracer mixing ratios and tendency (sediflux for diagnostics) SEDOUT(KIDIA:KFDIA, 1:KLEV,:)=(ZTENCIH(KIDIA:KFDIA, 1:KLEV,:)-ZXTTE(KIDIA:KFDIA, 1:KLEV,:)) DO JK=1,KLEV @@ -1332,11 +1357,10 @@ SUBROUTINE HAMM7_INTERFACE( & END DO !--> init values - ZTENCIH(:,:,:) = 0._JPRB ZTENCIH(KIDIA:KFDIA,1:KLEV,:) = ZXTTE(KIDIA:KFDIA,1:KLEV,:) ! init tendency before drydep ZXTEMS(KIDIA:KFDIA,:) = 0._JPRB ! surface emissions as zero for input ZXTMD1(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB - ZXTMD1(KIDIA:KFDIA,1:KLEV,:) = ZXTM1(KIDIA:KFDIA,1:KLEV,:) + (ZTENCIH(KIDIA:KFDIA,1:KLEV,:) * time_step_len) ! update mixrat with tendency + ZXTMD1(KIDIA:KFDIA,1:KLEV,:) = ZXTM1(KIDIA:KFDIA,1:KLEV,:) + (ZTENCIH(KIDIA:KFDIA,1:KLEV,:) * TIME_STEP_LEN) ! update mixrat with tendency ZVDEP(KIDIA:KFDIA,:) = 0._JPRB ! ddep velocity as zero ! RCHG: Recommendation, those subroutines specific of m7 should have @@ -1360,7 +1384,7 @@ SUBROUTINE HAMM7_INTERFACE( & Zxtm1, PCFLX(:,KAERO(1):KAERO(NACTAERO)), & ZDP, PGEOH, ZRHO, ZXTTE, PTSPHY,& PSO2DD, PGELAM, & - ZFAERO, Zxtp1, ZDDEPFLUX_SO2) + ZFAERO, ZXTP1, ZDDEPFLUX_SO2) ZDDEPFLUX(KIDIA:KFDIA,2)=ZDDEPFLUX_SO2(KIDIA:KFDIA) END IF @@ -1637,7 +1661,6 @@ SUBROUTINE HAMM7_INTERFACE( & PAER_TAU(JL,JK,IW)=ZAER_TAU(JL,JK,IW,1)!*(PGEOH(JL,JK-1) - PGEOH(JL,JK)) PAER_SSA(JL,JK,IW)=ZAER_SSA(JL,JK,IW) PAER_ASYM(JL,JK,IW)=ZAER_ASYM(JL,JK,IW) - !PAOD(JL,IW)=ZAER_TAU(JL,JK,IW,1)+PAOD(JL,IW) ENDDO DO IW=1,16 PAER_TAU_LW(JL,JK,IW)=ZAER_TAU_LW(JL,JK,IW) @@ -1647,15 +1670,15 @@ SUBROUTINE HAMM7_INTERFACE( & END SELECT - -CALL GSTATS(2506,1) + CALL GSTATS(2506,1) ENDIF ! (MOD(NSTEP+1,NRADFR) == 0) -PAOD(:,:) =0._JPRB -PABS(:,:) =0._JPRB -PFAOD(:,:)=0._JPRB -PSSA(:,:) =0._JPRB -PASY(:,:) =0._JPRB +PAOD (KIDIA:KFDIA,:)=0._JPRB +PABS (KIDIA:KFDIA,:)=0._JPRB +PFAOD(KIDIA:KFDIA,:)=0._JPRB +PSSA (KIDIA:KFDIA,:)=0._JPRB +PASY (KIDIA:KFDIA,:)=0._JPRB + DO JK = 1, KLEV DO JL = KIDIA,KFDIA DO IW=1,NASWBAND @@ -1766,8 +1789,10 @@ SUBROUTINE HAMM7_INTERFACE( & !end do DO JN=1,NACTAERO !ktrac - PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(3)%MP)=WDEPOUT_2D(KIDIA:KFDIA,KAERO(JN)) - PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(4)%MP)=SEDOUT_2D(KIDIA:KFDIA,KAERO(JN)) + PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(3)%MP) = WDEPOUT_2D (KIDIA:KFDIA,KAERO(JN)) + PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(6)%MP) = WDEPOUT_IC_2D(KIDIA:KFDIA,KAERO(JN)) + PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(18)%MP) = WDEPOUT_BC_2D(KIDIA:KFDIA,KAERO(JN)) + PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(4)%MP) = ZSEDIFLUXSURF(KIDIA:KFDIA,KAERO(JN)) ! PGFL(KIDIA:KFDIA,JN,YAEROUT(5)%MP)=PAERSRC(KIDIA:KFDIA,KAERO(JN)) END DO @@ -1783,22 +1808,27 @@ SUBROUTINE HAMM7_INTERFACE( & JO=ind_oifs_ham%ind_mass_OIFS(JN) ! JO -> index context OIFS JH=ind_oifs_ham%IND_mass_HAM(JN) ! JH -> index context HAM JY=YAEROUT(7)%MP - PGFL(KIDIA:KFDIA,JO,JY) = PGFL(KIDIA:KFDIA, JO, JY) + (ZXTM1(KIDIA:KFDIA,JK,JH)+(ZXTTE(KIDIA:KFDIA,JK,JH)*time_step_len)) * ZDPG(KIDIA:KFDIA,JK) + PGFL(KIDIA:KFDIA,JO,JY) = PGFL(KIDIA:KFDIA, JO, JY) + (ZXTM1(KIDIA:KFDIA,JK,JH)+(ZXTTE(KIDIA:KFDIA,JK,JH)*TIME_STEP_LEN)) * ZDPG(KIDIA:KFDIA,JK) END DO DO JN=1,NCLASS JO=ind_oifs_ham%ind_mass_OIFS(JN) ! JO -> index context OIFS JH=ind_oifs_ham%IND_mass_HAM(JN) ! JH -> index context HAM JY=YAEROUT(7)%MP - PGFL(KIDIA:KFDIA,JO,JY) = PGFL(KIDIA:KFDIA, JO, JY) + (ZXTM1(KIDIA:KFDIA,JK,JH)+(ZXTTE(KIDIA:KFDIA,JK,JH)*time_step_len)) * ZDPG(KIDIA:KFDIA,JK) + PGFL(KIDIA:KFDIA,JO,JY) = PGFL(KIDIA:KFDIA, JO, JY) + (ZXTM1(KIDIA:KFDIA,JK,JH)+(ZXTTE(KIDIA:KFDIA,JK,JH)*TIME_STEP_LEN)) * ZDPG(KIDIA:KFDIA,JK) END DO END DO - IF (.NOT. LAERCHEM) THEN + IF (.NOT. LAERCHEM) THEN ! FIXME : THIS IS PARTLY OVERWRITTEN RIGHT AFTER PGFL(KIDIA:KFDIA,1,YAEROUT(8)%MP) = ZDDEPFLUX_SO2(KIDIA:KFDIA) ! aergn7 SO4 gas PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(9)%MP) = PGFL(KIDIA:KFDIA,1:KLEV,YAEROCLIM(1)%MP) PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(10)%MP) = PGFL(KIDIA:KFDIA,1:KLEV,YAEROCLIM(2)%MP) PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(11)%MP) = PGFL(KIDIA:KFDIA,1:KLEV,YAEROCLIM(3)%MP) END IF + PGFL(KIDIA:KFDIA,1,YAEROUT(9)%MP) = PCCNL(KIDIA:KFDIA) + PGFL(KIDIA:KFDIA,2,YAEROUT(9)%MP) = PCCNO(KIDIA:KFDIA) + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(10)%MP) = PFPLSL(KIDIA:KFDIA,1:KLEV) + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(11)%MP) = PFPLSN(KIDIA:KFDIA,1:KLEV) + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(12)%MP) = PGFL(KIDIA:KFDIA,1:KLEV,YRE_LIQ%MP9_PH) PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(13)%MP) = PGFL(KIDIA:KFDIA,1:KLEV,YRE_ICE%MP9_PH) PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(14)%MP) = PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH) diff --git a/ifs-source/arpifs/m7/phys_ec/tm5m7_src_dust.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_src_dust.F90 index eb7bfa7e..8712e0d2 100644 --- a/ifs-source/arpifs/m7/phys_ec/tm5m7_src_dust.F90 +++ b/ifs-source/arpifs/m7/phys_ec/tm5m7_src_dust.F90 @@ -1008,13 +1008,15 @@ SUBROUTINE TM5M7_SRC_DUST( YDEPHY, YDEAERMAP, YDEAERSRC, & & .AND. (ZLON >= 296._JPRB .AND. ZLON <= 300._JPRB) ) THEN IFF=6 ENDIF - IF ( (ZLAT <= 2._JPRB .AND. ZLAT > -11._JPRB)& - & .AND. (ZLON >= ZBNDI .AND. ZLON < 330._JPRB) ) THEN - IFF=6 + IF (ZLAT <= 2._JPRB .AND. ZLAT > -11._JPRB) THEN + IF (ZLON >= ZBNDI .AND. ZLON < 330._JPRB) THEN + IFF=6 + ENDIF ENDIF - IF ( (ZLAT <= -11._JPRB .AND. ZLAT >= -34._JPRB)& - & .AND. (ZLON >= ZBNDJ .AND. ZLON < 330._JPRB) ) THEN - IFF=6 + IF (ZLAT <= -11._JPRB .AND. ZLAT >= -34._JPRB) THEN + IF (ZLON >= ZBNDJ .AND. ZLON < 330._JPRB) THEN + IFF=6 + ENDIF ENDIF !-- Western Europe @@ -1116,9 +1118,10 @@ SUBROUTINE TM5M7_SRC_DUST( YDEPHY, YDEAERMAP, YDEAERSRC, & ! ITYPDU=5 !-- Asian deserts - IF ((ZLON > 90._JPRB .AND. ZLON <= 135._JPRB)& - & .AND. (ZLAT <= 51._JPRB .AND. ZLAT > ZBNDL)) THEN + IF (ZLON > 90._JPRB .AND. ZLON <= 135._JPRB) THEN + IF (ZLAT <= 51._JPRB .AND. ZLAT > ZBNDL) THEN IFF=17 + ENDIF ENDIF !-- Saudi Arabia @@ -1152,9 +1155,10 @@ SUBROUTINE TM5M7_SRC_DUST( YDEPHY, YDEAERMAP, YDEAERSRC, & ENDIF !-- South China - IF ( (ZLON > 90._JPRB .AND. ZLON <= 135._JPRB) .AND.& - & (ZLAT <= ZBNDL .AND. ZLAT > 7._JPRB) ) THEN + IF (ZLON > 90._JPRB .AND. ZLON <= 135._JPRB) THEN + IF (ZLAT <= ZBNDL .AND. ZLAT > 7._JPRB) THEN IFF=24 + ENDIF ENDIF ITYPDU=5 IF ( IFF >= 17 .AND. IFF <= 24 ) THEN @@ -1201,9 +1205,10 @@ SUBROUTINE TM5M7_SRC_DUST( YDEPHY, YDEAERMAP, YDEAERSRC, & ENDIF ENDIF !- Argentinian pampas - IF ( (ZLON > 285._JPRB .AND. ZLON < 297._JPRB)& - & .AND. ZLAT <= ZBNDM ) THEN - IFF=33 + IF (ZLON > 285._JPRB .AND. ZLON < 297._JPRB) THEN + IF ( ZLAT <= ZBNDM ) THEN + IFF=33 + ENDIF ENDIF ITYPDU=6 IF ( IFF >= 31 .AND. IFF <= 33 ) THEN diff --git a/ifs-source/arpifs/m7/phys_ec/tm5m7_src_ss.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_src_ss.F90 index 99be3205..ddf64ee0 100644 --- a/ifs-source/arpifs/m7/phys_ec/tm5m7_src_ss.F90 +++ b/ifs-source/arpifs/m7/phys_ec/tm5m7_src_ss.F90 @@ -337,7 +337,7 @@ SUBROUTINE TM5M7_SRC_SS & !but increases more strongly at higher temperatures. !For CMIP6 a reference temperature of 15 degC is used. ! PSST in Kelvin - tt=min(30.,max(-1.0,PSST(JL)-273.15)) + tt=min(30.,max(-1.0,PSST(JL)-273.15_JPRB)) !For a reference temperature of 20 degC, use: !t_scale = 0.03159982*tt + 0.36800362 !For a reference temperature to 15 degC, use: diff --git a/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 b/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 index c94c8a1b..75d691f0 100644 --- a/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 +++ b/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 @@ -191,7 +191,7 @@ SUBROUTINE AER_PHY3_LAYER(YDSURF, & CASE ("glomap") CALL ABOR1("OIFS - glomap should never be called from OIFS, EXIT") - CASE ("tm5m7", "hamm7") + CASE ("hamm7") ! Optical properties calculated only for radiation timesteps. ! Using previous optical properties if not calculated ! introduce simple routine to ensure values are non-zero: @@ -231,6 +231,7 @@ SUBROUTINE AER_PHY3_LAYER(YDSURF, & & STATE%A , & & STATE%CLD(:,:,NCLDQI), STATE%CLD(:,:,NCLDQL), STATE%CLD(:,:,NCLDQR), & & STATE%CLD(:,:,NCLDQS), PDIAG%PCOVPTOT, PDIAG%ZLU , & + & PDIAG%PMFU, & & ZO3, STATE%Q, STATE%T, ZTH , GEMSL%ZTENC , GEMSL%ZCFLX , & & GEMSL%ZAERDDP, GEMSL%ZAERSDM, GEMSL%ZAERSRC, GEMSL%ZAERWS , GEMSL%ZAERGUST , GEMSL%ZAERUST, GEMSL%ZAERMAP, & & GEMSL%ZCLAERS, GEMSL%ZPRAERS, PCHEM2AER, & diff --git a/ifs-source/arpifs/phys_radi/suecrad.F90 b/ifs-source/arpifs/phys_radi/suecrad.F90 index 46a1777b..3c18195a 100644 --- a/ifs-source/arpifs/phys_radi/suecrad.F90 +++ b/ifs-source/arpifs/phys_radi/suecrad.F90 @@ -2123,7 +2123,7 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) ! - 6.0. PARAMETERS FOR M7 AEROSOL ! IF (NACTAERO > 0) THEN - IF (TRIM(AERO_SCHEME) == "tm5m7" .or. TRIM(AERO_SCHEME) == "hamm7" ) THEN + IF (TRIM(AERO_SCHEME) == "hamm7" ) THEN ALLOCATE(YDAERM7%M7AOD( NPROMA, NFLEVG, NTSW, NGPBLKS)) ALLOCATE(YDAERM7%M7SSA( NPROMA, NFLEVG, NTSW, NGPBLKS)) diff --git a/ifs-test/tests/t255/CMakeLists.txt b/ifs-test/tests/t255/CMakeLists.txt index 9b7404a0..b0bcd535 100644 --- a/ifs-test/tests/t255/CMakeLists.txt +++ b/ifs-test/tests/t255/CMakeLists.txt @@ -79,7 +79,7 @@ function( add_ifs_test TARGET ) ${CMAKE_CURRENT_SOURCE_DIR}/../compo_data/m7/namelist.echam ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/namelist.echam) execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink - ${CMAKE_CURRENT_SOURCE_DIR}/../compo_data/m7/parnuc.15H2SO4.nc ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/parnuc.15H2SO4.nc) + ${CMAKE_CURRENT_SOURCE_DIR}/../compo_data/m7/parnuc.15H2SO4.A0.total.nc ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/parnuc.15H2SO4.nc) execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink ${CMAKE_CURRENT_SOURCE_DIR}/../compo_data/m7/lut_kappa.nc ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/lut_kappa.nc) diff --git a/ifs-test/tests/t255/common/m7/m7_compoemis.nml b/ifs-test/tests/t255/common/m7/m7_compoemis.nml index 8e486467..c8481653 100644 --- a/ifs-test/tests/t255/common/m7/m7_compoemis.nml +++ b/ifs-test/tests/t255/common/m7/m7_compoemis.nml @@ -11,7 +11,7 @@ cat >> fort.4 << EOF &NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="swd" THIS%PARAMID=212008 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / &NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="tnr" THIS%PARAMID=212009 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / &NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="tro" THIS%PARAMID=212010 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / -&NAMCOMPO_EMIS THIS%SPECIES="BC_KI" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210091 / +&NAMCOMPO_EMIS THIS%SPECIES="BC_KI" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PSD_RADIUS=0.03e-6 THIS%PSD_SIGMA=1.59 THIS%PSD_N0_TRACER="KI_N" THIS%MASS_DENSITY=1800 THIS%PARAMID=210091 / &NAMCOMPO_EMIS THIS%SPECIES="BC_KI" THIS%SECTOR="ene" THIS%PARAMID=212221 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / &NAMCOMPO_EMIS THIS%SPECIES="BC_KI" THIS%SECTOR="fef" THIS%PARAMID=212222 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / &NAMCOMPO_EMIS THIS%SPECIES="BC_KI" THIS%SECTOR="ind" THIS%PARAMID=212223 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / @@ -239,7 +239,7 @@ cat >> fort.4 << EOF &NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="swd" THIS%PARAMID=212207 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / &NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="tnr" THIS%PARAMID=212208 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / &NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="tro" THIS%PARAMID=212209 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / -&NAMCOMPO_EMIS THIS%SPECIES="POM_KI" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210090 / +&NAMCOMPO_EMIS THIS%SPECIES="POM_KI" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PSD_RADIUS=0.03E-6 THIS%PSD_SIGMA=1.59 THIS%PSD_N0_TRACER="KI_N" THIS%MASS_DENSITY=1300 THIS%PARAMID=210090 / &NAMCOMPO_EMIS THIS%SPECIES="POM_KI" THIS%SECTOR="ene" THIS%PARAMID=212231 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / &NAMCOMPO_EMIS THIS%SPECIES="POM_KI" THIS%SECTOR="fef" THIS%PARAMID=212232 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / &NAMCOMPO_EMIS THIS%SPECIES="POM_KI" THIS%SECTOR="ind" THIS%PARAMID=212233 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / diff --git a/ifs-test/tests/t255/inidata/PLS_ICMCLham7INIT_COMPO b/ifs-test/tests/t255/inidata/PLS_ICMCLham7INIT_COMPO index 4af0964c..5f300e24 120000 --- a/ifs-test/tests/t255/inidata/PLS_ICMCLham7INIT_COMPO +++ b/ifs-test/tests/t255/inidata/PLS_ICMCLham7INIT_COMPO @@ -1 +1 @@ -/hpcperm/nm6/oifs48r1-data/datahub/ham7/2023070100/emissions/ICMCL-INIT-COMPO-2023070100-2023070300 \ No newline at end of file +/hpcperm/nm6/oifs48r1-data/datahub/ham8/2023070100/emissions/ICMCL-INIT-COMPO-2023070100-2023070300 \ No newline at end of file diff --git a/ifs-test/tests/t255/test_compo_fc_m7/params b/ifs-test/tests/t255/test_compo_fc_m7/params index f637b61b..e3e4ada6 100644 --- a/ifs-test/tests/t255/test_compo_fc_m7/params +++ b/ifs-test/tests/t255/test_compo_fc_m7/params @@ -1,2 +1,2 @@ -NPROC=64 -NTHREAD=4 +NPROC=256 +NTHREAD=1 diff --git a/ifs-test/tests/t255/test_compo_fc_m7/setup b/ifs-test/tests/t255/test_compo_fc_m7/setup index 92edc150..8f20831e 100644 --- a/ifs-test/tests/t255/test_compo_fc_m7/setup +++ b/ifs-test/tests/t255/test_compo_fc_m7/setup @@ -16,15 +16,15 @@ CNMEXP="'ham7'" # NAEPHY: LEO3CH=".TRUE." -NAEPHY_EXTRA="LO3CH_HLO=.FALSE.," +NAEPHY_EXTRA="LO3CH_HLO=.TRUE.," # NAMDPHY: NVEXTR="7" NCEXTR="137" # NAMRIP -CSTOP=${CSTOP:-"'t6'"} # CSTOP: define num. timesteps -TSTEP=${TSTEP:-"600.000000"} # TSTEP: define time-step in seconds +CSTOP=${CSTOP:-"'t48'"} # CSTOP: define num. timesteps +TSTEP=${TSTEP:-"1800.000000"} # TSTEP: define time-step in seconds # NAMCT0: NFRPOS=3 @@ -69,9 +69,6 @@ EOF cat >> fort.4 << EOF LAERAOT=false, LAERLISI=false, -NUVP=1, -YUVP_NL(1)%CNAME='UVP2DRAD', -YUVP_NL(1)%IGRBCODE=210055, EOF # === Include NAMGLF for NAERO_WVL_DIAG @@ -98,8 +95,6 @@ cat >> fort.4 << EOF YA_NL%LGP=true, YO3_NL%LGP=true, YQ_NL%LGPINGP=true, - !YR_NL%NREQIN=-1, - !YS_NL%NREQIN=-1, / &NAERAD CRTABLEDIR='./ifsdata/rtables/', @@ -108,15 +103,12 @@ cat >> fort.4 << EOF NUVTIM=72, NRADUV=1, NUV=24, - LUVPROC=false, ! CHECK + LUVPROC=false, LUVAERP=true, KMODTS=2, NRPROMA=0, - LEPO3RA=true, LO3_CHEM_UV=true, - NGHGRAD=20, NAERMACC=0, - LAER3D=.false., ! LAER3D: which aerosols climatology 2D vs 3D is used NAEROOPT=2, NCLOUDACT=0, / @@ -143,22 +135,22 @@ EOF cat >> fort.4 << EOF LAERVOL=false, NDRYDEPVEL_DYN=2, - LAERDUSTSOURCE=true, - LAERDUSTSIZEVAR=true, - LAERDUST_NEWBIN=false, - RAERDUST_REBOUND=0.1, + LAERDUSTSOURCE=true, + LAERDUSTSIZEVAR=true, + LAERDUST_NEWBIN=false, + RAERDUST_REBOUND=0.1, LAERNGAT=true, NAERSCAV=3, LAERGTOP=true, + LAERHYGRO=true, LAERSEDIM=true, - LAERSEDIMSS=true, + LAERSEDIMSS=true, LAERDRYDP=false, LAERSURF=true, - NSSALT=4, - NDDUST=2, - NSO4SCHEME=1, - LSEASALT_RH80=true, - LAERHYGRO=true, + NSSALT=1, + NDDUST=3, + NSO4SCHEME=1, + LSEASALT_RH80=true, LAERRRTM=true, / &NAMCOMPO @@ -167,7 +159,7 @@ cat >> fort.4 << EOF LCOMPO_DDFLX_DIR=true, LCHEM_TROPO=true, LCOMPO_DCDD=true, - LAERNITRATE=true, + LAERNITRATE=false, LAEREQSAM4CLIM=false, LAERSOA=false, LAERSOA_COUPLED=false, @@ -179,7 +171,8 @@ cat >> fort.4 << EOF CHEM_SCHEME="tm5", LCHEM_DIAC=false, LCHEM_LIGHT=true, - KCHEM_DRYDEP=2, + KCHEM_WETDEP=2, + KCHEM_DRYDEP=3, LCHEM_0NOX=false, KCHEM_NOXADV=0, LCHEM_ANAO3=false, From 08620a50380e671faf1acdb3aa4458ecb6a5100f Mon Sep 17 00:00:00 2001 From: Lianghai Wu Date: Fri, 20 Sep 2024 20:44:39 +0000 Subject: [PATCH 030/129] dust number unit and snow mass bug and ssa asy bug --- ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 | 4 ++-- ifs-source/arpifs/m7/phys_ec/tm5m7_src_dust.F90 | 4 ++-- ifs-source/arpifs/phys_ec/aerini_layer.F90 | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index a53d3f71..cae67e8e 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -1767,8 +1767,8 @@ SUBROUTINE HAMM7_INTERFACE( & ! input for HAM-M7 PGFL(KIDIA:KFDIA,1,YAEROUT(1)%MP)=PAOD(KIDIA:KFDIA,10) !PAER_TAU(KIDIA:KFDIA,1:KLEV,10) !533nm DO JK=1,KLEV - PGFL(KIDIA:KFDIA,2,YAEROUT(1)%MP)= PGFL(KIDIA:KFDIA,2,YAEROUT(1)%MP) + PAER_SSA(KIDIA:KFDIA,JK,10) !PAER_TAU(KIDIA:KFDIA,1:KLEV,10) !533nm - PGFL(KIDIA:KFDIA,3,YAEROUT(1)%MP)= PGFL(KIDIA:KFDIA,3,YAEROUT(1)%MP) + PAER_ASYM(KIDIA:KFDIA,JK,10) !PAER_TAU(KIDIA:KFDIA,1:KLEV,10) !533nm + PGFL(KIDIA:KFDIA,2,YAEROUT(1)%MP)= PAER_SSA(KIDIA:KFDIA,JK,10) !PAER_TAU(KIDIA:KFDIA,1:KLEV,10) !533nm + PGFL(KIDIA:KFDIA,3,YAEROUT(1)%MP)= PAER_ASYM(KIDIA:KFDIA,JK,10) !PAER_TAU(KIDIA:KFDIA,1:KLEV,10) !533nm END DO ! RCHG: It seems that here 1:14 refers to 14 species. PLS: AOD of 14 short wavelengths stored in YAEROUT(12)%MP of first 14 tracers (juggling!!) diff --git a/ifs-source/arpifs/m7/phys_ec/tm5m7_src_dust.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_src_dust.F90 index 8712e0d2..d21971cc 100644 --- a/ifs-source/arpifs/m7/phys_ec/tm5m7_src_dust.F90 +++ b/ifs-source/arpifs/m7/phys_ec/tm5m7_src_dust.F90 @@ -1398,7 +1398,7 @@ SUBROUTINE TM5M7_SRC_DUST( YDEPHY, YDEAERMAP, YDEAERSRC, & !---- ! accumulation mode ! number - emis_number(mode_aci)%d3(JL,KLEV,1) = emis_number(mode_aci)%d3(JL,KLEV,1) +ZFLX_SDUST(JL,JAER,NDDUST)* 3. / (4.*RPI*ddust*mmr_ai**3) * EXP(4.5*LOG(sigma(iacci))**2) + emis_number(mode_aci)%d3(JL,KLEV,1) = emis_number(mode_aci)%d3(JL,KLEV,1) +ZFLX_SDUST(JL,JAER,NDDUST)* 3./(4.*RPI*ddust*mmr_ai**3) * EXP(4.5*LOG(sigma(iacci))**2)*1.E+3 ! mass emis_mass(mode_aci)%d3(JL,KLEV,1) = emis_mass(mode_aci)%d3(JL,KLEV,1)+ZFLX_SDUST(JL,JAER,NDDUST)!flux_ai(KIDIA:KFDIA) else if(JAER>=2 )then @@ -1406,7 +1406,7 @@ SUBROUTINE TM5M7_SRC_DUST( YDEPHY, YDEAERMAP, YDEAERSRC, & ! ------------------------------ ! coarse mode ! number - emis_number(mode_coi)%d3(JL,KLEV,1) = emis_number(mode_coi)%d3(JL,KLEV,1) +ZFLX_SDUST(JL,JAER,NDDUST)* 3. / (4.*RPI*ddust*mmr_ci**3) * EXP(4.5*LOG(sigma(icoai))**2) + emis_number(mode_coi)%d3(JL,KLEV,1) = emis_number(mode_coi)%d3(JL,KLEV,1) +ZFLX_SDUST(JL,JAER,NDDUST)* 3./(4.*RPI*ddust*mmr_ci**3) * EXP(4.5*LOG(sigma(icoai))**2)*1.E+3 ! mass emis_mass(mode_coi)%d3(JL,KLEV,1) = emis_mass(mode_coi)%d3(JL,KLEV,1) +ZFLX_SDUST(JL,JAER,NDDUST) end if diff --git a/ifs-source/arpifs/phys_ec/aerini_layer.F90 b/ifs-source/arpifs/phys_ec/aerini_layer.F90 index 0b630f87..43dad335 100644 --- a/ifs-source/arpifs/phys_ec/aerini_layer.F90 +++ b/ifs-source/arpifs/phys_ec/aerini_layer.F90 @@ -223,7 +223,7 @@ SUBROUTINE AERINI_LAYER(YDGEOMETRY,YDSURF,& ! & PSURF%PSD_VF(:,YSD_VF%YINJF%MP) , & & PSURF%PSD_VD(:,YSD_VD%YBLH%MP) ,& & SURFL%ZFRTI, PSURF%PSD_VF(:,YSD_VF%YLSM%MP) , PSURF%PSD_VF(:,YSD_VF%YSST%MP), STATE%Q, & - & PSURF%PSP_SG(:,1,YSP_SG%YF%MP9) , PSURF%PSP_RR(:,YSP_RR%YT%MP9) , PAUX%PGELAM, PAUX%PGELAT, PAUX%PGEMU, SURFL%ZHSDFOR,& + & ZSNM, PSURF%PSP_RR(:,YSP_RR%YT%MP9) , PAUX%PGELAM, PAUX%PGELAT, PAUX%PGEMU, SURFL%ZHSDFOR,& & STATE%U(:,KDIM%KLEV) , STATE%V(:,KDIM%KLEV) , PSURF%PSP_SB(:,1,YSP_SB%YQ%MP9), TSPHY, GEMSL%ZAZ0M,& & GEMSL%ICHEM,& !VH - Introduce Land use info... From b400d3c6259fbdde6578062385907290b35c3a2a Mon Sep 17 00:00:00 2001 From: Lianghai Wu Date: Fri, 20 Sep 2024 21:05:40 +0000 Subject: [PATCH 031/129] output 12 is overwritten --- ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index cae67e8e..b7c48cf5 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -1772,7 +1772,7 @@ SUBROUTINE HAMM7_INTERFACE( & END DO ! RCHG: It seems that here 1:14 refers to 14 species. PLS: AOD of 14 short wavelengths stored in YAEROUT(12)%MP of first 14 tracers (juggling!!) - PGFL(KIDIA:KFDIA,1:14,YAEROUT(12)%MP)=PAOD(KIDIA:KFDIA,1:14) + PGFL(KIDIA:KFDIA,1:14,YAEROUT(27)%MP)=PAOD(KIDIA:KFDIA,1:14) DO JN=1,NAEROCOMP !ntrac!NACTAERO PGFL(KIDIA:KFDIA,ind_oifs_ham%ind_mass_OIFS(JN),YAEROUT(2)%MP)=ZDDEPFLUX(KIDIA:KFDIA,ind_oifs_ham%IND_mass_HAM(JN)) From 3c7005880e71928e953bee09fe6328b2885f1af9 Mon Sep 17 00:00:00 2001 From: Lianghai Wu Date: Sat, 21 Sep 2024 08:33:50 +0000 Subject: [PATCH 032/129] fix ssa asy output bug --- ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index b7c48cf5..77a50acc 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -1766,10 +1766,8 @@ SUBROUTINE HAMM7_INTERFACE( & IF(.NOT.LIFSMIN .AND. .NOT.LIFSTRAJ) THEN ! input for HAM-M7 PGFL(KIDIA:KFDIA,1,YAEROUT(1)%MP)=PAOD(KIDIA:KFDIA,10) !PAER_TAU(KIDIA:KFDIA,1:KLEV,10) !533nm - DO JK=1,KLEV - PGFL(KIDIA:KFDIA,2,YAEROUT(1)%MP)= PAER_SSA(KIDIA:KFDIA,JK,10) !PAER_TAU(KIDIA:KFDIA,1:KLEV,10) !533nm - PGFL(KIDIA:KFDIA,3,YAEROUT(1)%MP)= PAER_ASYM(KIDIA:KFDIA,JK,10) !PAER_TAU(KIDIA:KFDIA,1:KLEV,10) !533nm - END DO + PGFL(KIDIA:KFDIA,2,YAEROUT(1)%MP)=PSSA(KIDIA:KFDIA,10) !PAER_TAU(KIDIA:KFDIA,1:KLEV,10) !533nm + PGFL(KIDIA:KFDIA,3,YAEROUT(1)%MP)=PASY(KIDIA:KFDIA,10) !PAER_TAU(KIDIA:KFDIA,1:KLEV,10) !533nm ! RCHG: It seems that here 1:14 refers to 14 species. PLS: AOD of 14 short wavelengths stored in YAEROUT(12)%MP of first 14 tracers (juggling!!) PGFL(KIDIA:KFDIA,1:14,YAEROUT(27)%MP)=PAOD(KIDIA:KFDIA,1:14) @@ -1793,7 +1791,7 @@ SUBROUTINE HAMM7_INTERFACE( & PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(6)%MP) = WDEPOUT_IC_2D(KIDIA:KFDIA,KAERO(JN)) PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(18)%MP) = WDEPOUT_BC_2D(KIDIA:KFDIA,KAERO(JN)) PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(4)%MP) = ZSEDIFLUXSURF(KIDIA:KFDIA,KAERO(JN)) - ! PGFL(KIDIA:KFDIA,JN,YAEROUT(5)%MP)=PAERSRC(KIDIA:KFDIA,KAERO(JN)) + PGFL(KIDIA:KFDIA,JN,YAEROUT(5)%MP)=PAERSRC(KIDIA:KFDIA,KAERO(JN)) END DO PGFL(KIDIA:KFDIA,1,YAEROUT(6)%MP)=PAERFLX(KIDIA:KFDIA,3,9) From ab25d5edc2df2bb3baf7544d4cfc15bad61da251 Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Mon, 23 Sep 2024 07:33:25 +0000 Subject: [PATCH 033/129] Pull request #16: Hotfix chem-only, fix M7 SO4aq (OIFS-563) Merge in ~NM6/openifs-48r1 from OIFS-563-Hotfix-liquid-SO4 to knmi-m7 Squashed commit of the following: commit b6ce6f2800714ef1e91bedff829fc978f2f25194 Author: Philippe Le Sager Date: Mon Sep 23 09:23:38 2024 +0200 Update link for emissions file on hpc2020 commit 202577a8a7cb2b235bbc308bdece41c696439dac Author: Philippe Le Sager Date: Sun Sep 22 23:11:31 2024 +0200 Fix chemistry-only cases commit 794e2d29394bbd1bc46ef96d4176f8f3c6480089 Author: Philippe Le Sager Date: Sun Sep 22 20:59:54 2024 +0200 Correct aqueous SO4 from M7 wetchem --- ifs-source/arpifs/chem/chem_main.F90 | 12 +++++++----- ifs-source/arpifs/chem/chem_tm5.F90 | 9 +++++---- ifs-source/arpifs/m7/chem/tm5_wetchem_m7.F90 | 4 +--- ifs-test/tests/t255/inidata/PLS_ICMCLham7INIT_COMPO | 2 +- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/ifs-source/arpifs/chem/chem_main.F90 b/ifs-source/arpifs/chem/chem_main.F90 index d539aa00..e0f201a2 100644 --- a/ifs-source/arpifs/chem/chem_main.F90 +++ b/ifs-source/arpifs/chem/chem_main.F90 @@ -255,7 +255,7 @@ SUBROUTINE CHEM_MAIN & REAL(KIND=JPRB) :: ZCOTRA(KLON,KLEV,3) ! 3 traceurs contrails, parametrisation à implementer REAL(KIND=JPRB) :: ZEMIS(KLON,KLEV,3) ! 3 especes emises par l'aviation, parametrisation à implementer REAL(KIND=JPRB) :: ZAREAD_NAT(KLON,KLEV),ZAREAD_ICE(KLON,KLEV),ZAREAD_SUL(KLON,KLEV) -REAL(KIND=JPRB) :: PSO4_LPROD(KLON) +REAL(KIND=JPRB) :: ZSO4_LPROD(KLON,KLEV) LOGICAL :: LLCHECK_METEO, LLTENDUPDT !------------------------------------------------------------------------ !------------------------------------------------------------------------ @@ -393,7 +393,9 @@ SUBROUTINE CHEM_MAIN & !Initialize PCHEM2GHG/PCHEM2AER to zero PCHEM2GHG(KIDIA:KFDIA,1:KLEV,1:NCHEM2GHG)=0.0_JPRB -PCHEM2AER(KIDIA:KFDIA,1:KLEV,1:NCHEM2AER)=0.0_JPRB +IF (NACTAERO > 0 ) THEN + PCHEM2AER(KIDIA:KFDIA,1:KLEV,1:NCHEM2AER)=0.0_JPRB +ENDIF ! copy meto input in local arrays ZALB(KIDIA:KFDIA) = PALB(KIDIA:KFDIA) @@ -617,7 +619,7 @@ SUBROUTINE CHEM_MAIN & & ZLP, ZIP, ZAP, ZPTROP, ZALB, PWND, PLSM, ZCSZA, PGELAT, PGELAM,& & PGEMU, PKOZO, IKLEVTROP, PDV, ZCON, ZTENC1, ZBUDR, ZBUDJ, ZBUDX, ZOUT,& & PAEROC,PWETDIAM, PWETVOL,PND, PAERAOT, PAERAAOT, PAERASY, ZSOGTOSOA, & - & PCHEM2GHG, PSO4_LPROD) + & PCHEM2GHG, ZSO4_LPROD) CALL CHEM_DECAY(YGFL,KIDIA,KFDIA,KLON,KLEV,PTSTEP, PRSF1, PGELAT, ZCON,ZTENC1) @@ -633,8 +635,8 @@ SUBROUTINE CHEM_MAIN & PCHEM2AER(KIDIA:KFDIA,1:KLEV,3) = ZTENC1(KIDIA:KFDIA,1:KLEV,ISO2_TM5) - ZTENC0(KIDIA:KFDIA,1:KLEV,ISO2_TM5) CASE ("hamm7") - PCHEM2AER(KIDIA:KFDIA,JK,2) = PSO4_LPROD(KIDIA:KFDIA) - END SELECT + PCHEM2AER(KIDIA:KFDIA,1:KLEV,2) = ZSO4_LPROD(KIDIA:KFDIA,1:KLEV) + END SELECT ENDIF IF (NACTAERO > 0 .AND. LAERNITRATE) THEN diff --git a/ifs-source/arpifs/chem/chem_tm5.F90 b/ifs-source/arpifs/chem/chem_tm5.F90 index 92d6cc3b..727e1899 100644 --- a/ifs-source/arpifs/chem/chem_tm5.F90 +++ b/ifs-source/arpifs/chem/chem_tm5.F90 @@ -190,7 +190,7 @@ SUBROUTINE CHEM_TM5& REAL(KIND=JPRB) ,INTENT(IN) :: PAERASY(KLON,KLEV,6) REAL(KIND=JPRB) ,INTENT(OUT):: PSOGTOSOA(KLON,KLEV,2) REAL(KIND=JPRB) ,INTENT(OUT):: PCHEM2GHG(KLON,KLEV,NCHEM2GHG) -REAL(KIND=JPRB) ,INTENT(OUT):: PSO4_LPROD(KLON) +REAL(KIND=JPRB) ,INTENT(OUT):: PSO4_LPROD(KLON,KLEV) !----------------------------------------------------------------------- @@ -409,6 +409,7 @@ SUBROUTINE CHEM_TM5& POUT(KIDIA:KFDIA,:,:) = 0.0_JPRB PSOGTOSOA(KIDIA:KFDIA,:,:) = 0.0_JPRB +PSO4_LPROD(KIDIA:KFDIA,:) = 0.0_JPRB ! Lat / Lon DO JL=KIDIA,KFDIA @@ -757,10 +758,10 @@ SUBROUTINE CHEM_TM5& ENDDO CALL TM5_WETCHEM_M7(KIDIA, KFDIA, KLON, KAERO, PTSTEP, PTP(1:KLON,JK), & - & PAP(1:KLON,JK),PRSF1(1:KLON,JK),PLP(1:KLON,JK),ZCVM1,ZHPLUS,ZCVM, & - & ZAEROP, PSO4_LPROD) + & PAP(:,JK),PRSF1(:,JK),PLP(:,JK),ZCVM1,ZHPLUS,ZCVM, & + & ZAEROP, PSO4_LPROD(:,JK)) - PSO4_LPROD(KIDIA:KFDIA) = PSO4_LPROD(KIDIA:KFDIA)*96._JPRB /(ZAIRDM(KIDIA:KFDIA) * PTSTEP) + PSO4_LPROD(KIDIA:KFDIA,JK) = PSO4_LPROD(KIDIA:KFDIA,JK)*96._JPRB /(ZAIRDM(KIDIA:KFDIA) * PTSTEP) ELSE ! All cases except M7 scheme diff --git a/ifs-source/arpifs/m7/chem/tm5_wetchem_m7.F90 b/ifs-source/arpifs/m7/chem/tm5_wetchem_m7.F90 index 3b9afc19..bb89df8c 100644 --- a/ifs-source/arpifs/m7/chem/tm5_wetchem_m7.F90 +++ b/ifs-source/arpifs/m7/chem/tm5_wetchem_m7.F90 @@ -53,7 +53,7 @@ SUBROUTINE TM5_WETCHEM_M7(KIDIA, KFDIA, KLON,KAERO,PDT,PTEMP,PAP,PRS,PLP,PY0,PHP REAL(KIND=JPRB), INTENT(OUT) :: PHPLUS(KLON) ! concentration H+ REAL(KIND=JPRB), INTENT(INOUT) :: PY(KLON,YGFL%NCHEM+3) REAL(KIND=JPRB), INTENT(INOUT) :: PAEROP(KLON,KAERO) -REAL(KIND=JPRB), INTENT(OUT) :: PSO4_LPROD(KLON) +REAL(KIND=JPRB), INTENT(INOUT) :: PSO4_LPROD(KLON) ! * LOCAL REAL(KIND=JPHOOK) :: ZHOOK_HANDLE @@ -91,8 +91,6 @@ SUBROUTINE TM5_WETCHEM_M7(KIDIA, KFDIA, KLON,KAERO,PDT,PTEMP,PAP,PRS,PLP,PY0,PHP !----------------------------- ! wet phase reactions !----------------------------- -PSO4_LPROD(KIDIA:KFDIA)=0.0_JPRB - DO JL=KIDIA,KFDIA LLCLOUDY(JL)=.FALSE. diff --git a/ifs-test/tests/t255/inidata/PLS_ICMCLham7INIT_COMPO b/ifs-test/tests/t255/inidata/PLS_ICMCLham7INIT_COMPO index 5f300e24..4af0964c 120000 --- a/ifs-test/tests/t255/inidata/PLS_ICMCLham7INIT_COMPO +++ b/ifs-test/tests/t255/inidata/PLS_ICMCLham7INIT_COMPO @@ -1 +1 @@ -/hpcperm/nm6/oifs48r1-data/datahub/ham8/2023070100/emissions/ICMCL-INIT-COMPO-2023070100-2023070300 \ No newline at end of file +/hpcperm/nm6/oifs48r1-data/datahub/ham7/2023070100/emissions/ICMCL-INIT-COMPO-2023070100-2023070300 \ No newline at end of file From 3abfdfd9e146fc9b382a1bc44cc87bbb01238070 Mon Sep 17 00:00:00 2001 From: Lianghai Wu Date: Thu, 21 Nov 2024 10:10:55 +0000 Subject: [PATCH 034/129] OIFS-561 OIFS-554 wet deposition different scavenging fields in conv and stra cases --- ifs-source/arpifs/m7/hamm7_init.F90 | 2 +- ifs-source/arpifs/m7/module/mo_ham_m7ctl.F90 | 5 +- .../arpifs/m7/module/mo_ham_species.F90 | 4 + ifs-source/arpifs/m7/module/mo_ham_wetdep.F90 | 10 +- .../arpifs/m7/module/mo_hammoz_wetdep.F90 | 43 +- .../arpifs/m7/phys_ec/hamm7_interface.F90 | 496 ++++++++++++++---- .../m7/phys_ec/tm5m7_optics_aop_get.F90 | 14 +- ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 | 112 +++- .../arpifs/phys_ec/compo_apply_emissions.F90 | 21 +- 9 files changed, 554 insertions(+), 153 deletions(-) diff --git a/ifs-source/arpifs/m7/hamm7_init.F90 b/ifs-source/arpifs/m7/hamm7_init.F90 index f2ddd3ac..47588676 100644 --- a/ifs-source/arpifs/m7/hamm7_init.F90 +++ b/ifs-source/arpifs/m7/hamm7_init.F90 @@ -178,7 +178,7 @@ SUBROUTINE hamm7_init(YGFL, YRRIP) !eehol: activation initialization nactivpdf = 1 !eehol: using PDF to calculate updraft. Hardcoded for now.. need to check this later (add setphys to oifs?) -ncd_activ = 2 !eehol: Abdul-Razzak and Ghan activation scheme. Hardcoded for now.. need to check this later (add setphys to oifs?) +ncd_activ = 2 !eehol: Abdul-Razzak and Ghan activation scheme. Hardcoded for now.. need to check this later (add setphys to oifs?)! CALL activ_initialize !eehol: set cdnc and icnc indices for HAM diff --git a/ifs-source/arpifs/m7/module/mo_ham_m7ctl.F90 b/ifs-source/arpifs/m7/module/mo_ham_m7ctl.F90 index 5d1455b0..6cc3d48f 100644 --- a/ifs-source/arpifs/m7/module/mo_ham_m7ctl.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_m7ctl.F90 @@ -73,7 +73,7 @@ MODULE mo_ham_m7ctl PUBLIC :: bk, rerg, r_kcal PUBLIC :: so4_coating_threshold - PUBLIC :: cmr2ras, cmr2mmr, cmedr2mmedr, cmr2ram, ram2cmr + PUBLIC :: cmr2ras, cmr2mmr, cmedr2mmedr, cmr2ram, ram2cmr, cmr2smr !--- 1) Define and pre-set switches for the processes of M7: ----------------------- @@ -187,6 +187,7 @@ MODULE mo_ham_m7ctl REAL(dp) :: ram2cmr(naeroclass(HAM_M7)) ! Conversion factor: radius of average mass to count median radius + REAL(dp) :: cmr2smr(naeroclass(HAM_M7)) ! Conversion factor: count median radius to surface mean radius !--- 6) Assumed thresholds for occurence of specific quantities: ------------- @@ -432,6 +433,8 @@ SUBROUTINE m7_initialize cmr2ras(jclass) = EXP(1.0_dp*(LOG(sigma(jclass)))**2) + !--- Count Median Radius to surface Mean Radius: + cmr2mmr(jclass) = EXP(2.0_dp*(LOG(sigma(jclass)))**2) !--- 2) Calculate the natural logarithm of the standard deviation: diff --git a/ifs-source/arpifs/m7/module/mo_ham_species.F90 b/ifs-source/arpifs/m7/module/mo_ham_species.F90 index aea4f4a9..c1d706ec 100755 --- a/ifs-source/arpifs/m7/module/mo_ham_species.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_species.F90 @@ -307,6 +307,8 @@ SUBROUTINE ham_species kappa = 0.60_dp, & lburden = .TRUE., & idx = id_so4 ) + + !write(*,*)"id_so4",id_so4 !<
0._dp) THEN - ztmp1(1:kproma,:) = pmiwc(1:kproma,:)/zilwc(1:kproma,:) - ENDIF + + WHERE(ABS(zilwc(1:kproma,:))>0._dp) ztmp1(1:kproma,:) = pmiwc(1:kproma,:)/zilwc(1:kproma,:) + + !IF (MINVAL(ABS(zilwc(1:kproma,:)))>0._dp) THEN + ! ztmp1(1:kproma,:) = pmiwc(1:kproma,:)/zilwc(1:kproma,:) + !ENDIF pice(1:kproma,:) = MERGE(ztmp1(1:kproma,:), 0._dp, lo_2d(1:kproma,:)) !--- 1.2) Calculate autoconversion rate: @@ -438,9 +441,12 @@ SUBROUTINE prep_wetdep_hydro(kproma, kbdim, klev, ktop, krow, lstrat, & lo_2d(1:kproma,:) = (pmiwc(1:kproma,:) > zmin) ztmp1(1:kproma,:) = 0._dp - IF (MINVAL(ABS(pmiwc(1:kproma,:)))>0._dp) THEN - ztmp1(1:kproma,:) = pmrateps(1:kproma,:)/pmiwc(1:kproma,:) - ENDIF + + WHERE(ABS(pmiwc(1:kproma,:))>0._dp) ztmp1(1:kproma,:) = pmrateps(1:kproma,:)/pmiwc(1:kproma,:) + + !IF (MINVAL(ABS(pmiwc(1:kproma,:)))>0._dp) THEN + ! ztmp1(1:kproma,:) = pmrateps(1:kproma,:)/pmiwc(1:kproma,:) + !ENDIF !peffice(1:kproma,:) = MERGE(pmrateps(1:kproma,:)/pmiwc(1:kproma,:), 0._dp, lo_2d(1:kproma,:)) peffice(1:kproma,:) = MERGE(ztmp1(1:kproma,:), 0._dp, lo_2d(1:kproma,:)) @@ -450,11 +456,20 @@ SUBROUTINE prep_wetdep_hydro(kproma, kbdim, klev, ktop, krow, lstrat, & lo_2d(1:kproma,:) = (pmlwc(1:kproma,:) > zmin) ztmp1(1:kproma,:) = 0._dp - IF (MINVAL(ABS(pmlwc(1:kproma,:)))>0._dp) THEN - ztmp1(1:kproma,:) = (pmratepr(1:kproma,:)+pmsnowacl(1:kproma,:))/pmlwc(1:kproma,:) - ENDIF + WHERE(ABS(pmlwc(1:kproma,:))>0._dp) ztmp1(1:kproma,:) = (pmratepr(1:kproma,:)+pmsnowacl(1:kproma,:))/pmlwc(1:kproma,:) + !IF (MINVAL(ABS(pmlwc(1:kproma,:)))>0._dp) THEN + ! ztmp1(1:kproma,:) = (pmratepr(1:kproma,:)+pmsnowacl(1:kproma,:))/pmlwc(1:kproma,:) + !ENDIF + !write(*,*)"pmratepr(1:kproma,:)",pmratepr(1:kproma,klev) + !write(*,*)"pmsnowacl(1:kproma,:)",pmsnowacl(1:kproma,klev) + !write(*,*)"pmlwc(1:kproma,:)",pmlwc(1:kproma,klev) + !write(*,*)"lo_2d(1:kproma,:)",lo_2d(1:kproma,klev) + + !write(*,*)"ztmp1(1:kproma,:)",ztmp1(1:kproma,klev) peffwat(1:kproma,:) = MERGE(ztmp1(1:kproma,:) , 0._dp, lo_2d(1:kproma,:)) + !write(*,*)"peffwat(1:kproma,:)",peffwat(1:kproma,klev) + peffwat(1:kproma,:) = MAX(0._dp,MIN(1._dp,peffwat(1:kproma,:))) @@ -494,9 +509,11 @@ SUBROUTINE prep_wetdep_hydro(kproma, kbdim, klev, ktop, krow, lstrat, & lo_2d(1:kproma,:) = (zfprec(1:kproma,:) > zmin) ztmp1(1:kproma,:) = 0._dp - IF (MINVAL(ABS(zfprec(1:kproma,:)))>0._dp) THEN - ztmp1(1:kproma,:) = (pfevapr(1:kproma,:)+pfsubls(1:kproma,:))/zfprec(1:kproma,:) - ENDIF + + WHERE(ABS(zfprec(1:kproma,:))>0._dp) ztmp1(1:kproma,:) = (pfevapr(1:kproma,:)+pfsubls(1:kproma,:))/zfprec(1:kproma,:) + !IF (MINVAL(ABS(zfprec(1:kproma,:)))>0._dp) THEN + ! ztmp1(1:kproma,:) = (pfevapr(1:kproma,:)+pfsubls(1:kproma,:))/zfprec(1:kproma,:) + !ENDIF prevap(1:kproma,:) = MERGE(ztmp1(1:kproma,:), 0._dp, lo_2d(1:kproma,:)) prevap(1:kproma,:) = MAX(0._dp,MIN(1._dp,prevap(1:kproma,:))) @@ -953,7 +970,7 @@ SUBROUTINE wetdep_interface(kproma, kbdim, klev, ktop, krow, lstrat, & REAL(dp), INTENT(in) :: pmsnowacl(kbdim,klev) ! accretion rate of snow with cloud droplets REAL(dp), INTENT(in) :: pm6rp(kbdim,klev,nclass) - ! mean mode actual radius for each mode (wet for soluble and dry for insoluble modes) [cm] + ! mean mode actual radius for each mode (wet for soluble and dry for insoluble modes) REAL(dp), INTENT(in) :: pm6dry(kbdim,klev,nclass) ! in cloudy part [kg/kg] ! REAL(dp), INTENT(in) :: pnact(kbdim,klev,nclass) !number of activated particles per mode [m-3] diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index 77a50acc..144f809a 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -286,7 +286,7 @@ SUBROUTINE HAMM7_INTERFACE( & REAL(KIND=JPRB) :: ZAP(KLON,KLEV) REAL(KIND=JPRB) :: ZSO2(KLON,KLEV), ZDP(KLON,KLEV), ZDZ(KLON,KLEV) REAL(KIND=JPRB) :: ZITSO2(KLON,KLEV) -REAL(KIND=JPRB) :: ZFSO2(KLON) , ZFSO4(KLON), ZFSO4_AQ(KLON) +REAL(KIND=JPRB) :: ZFSO2(KLON) , ZFSO4(KLON), ZFSO4_AQ(KLON), Htmp(KLON) REAL(KIND=JPRB) :: ZTSO2(KLON, KLEV) , ZTSO4(KLON, KLEV,1), ZTSO4_AQ(KLON, KLEV) REAL(KIND=JPRB) :: ZQSAT(KLON,KLEV), ZRHO(KLON,KLEV) REAL(KIND=JPRB) :: ZTAER(KLON,KLEV) @@ -319,8 +319,8 @@ SUBROUTINE HAMM7_INTERFACE( & REAL(KIND=JPRB), ALLOCATABLE :: ZAERNGT(:,:) REAL(KIND=JPRB) :: ZDEGRAD, ZEPSCOV, ZEPSWAT, ZRWSAT, ZRWPWP -REAL(KIND=JPRB) :: ZQLWP(KLON,KLEV) -REAL(KIND=JPRB) :: ZTMPA +REAL(KIND=JPRB) :: ZQLWP(KLON,KLEV),ZQLWP2(KLON,KLEV) +REAL(KIND=JPRB) :: ZTMPA,ZTEMP,ZDPOG,ZQIWP,ZPODT LOGICAL :: LLIQCLD(KLON,KLEV) ! logical for liquid cloud LOGICAL :: LICECLD(KLON,KLEV) ! logical for ice cloud @@ -333,7 +333,7 @@ SUBROUTINE HAMM7_INTERFACE( & ! [RCHG -> var. non used ] INTEGER(KIND=JPIM) :: NSO4SCHEME ! [RCHG -> non used ] REAL(KIND=JPRB) :: ZLAT, ZLON ! [RCHG -> non used ] REAL(KIND=JPRB) :: BETAB(KLON,KLEV), ZBETAI(KLON,KLEV) -! [RCHG -> non used ] REAL(KIND=JPRB) :: ZCLDWAT(KLON,KLEV), ZDUM(KLON,KLEV) +! [RCHG -> non used ] REAL(KIND=JPRB) :: ZCLDWAT(KLON,KLEV), ZDUZLPpUM(KLON,KLEV) ! [RCHG -> non used ] REAL(KIND=JPRB) :: ZBCPHI(KLON,KLEV), ZBCPHO(KLON,KLEV) ! [RCHG -> non used ] REAL(KIND=JPRB) :: ZOMPHI(KLON,KLEV) , ZOMPHO(KLON,KLEV) ! [RCHG -> non used ] REAL(KIND=JPRB) :: ZTBCPHI(KLON,KLEV),ZTBCPHO(KLON,KLEV) @@ -366,6 +366,7 @@ SUBROUTINE HAMM7_INTERFACE( & ! variables for the M7 call REAL(KIND=JPRB) :: ZGRVOL(KLON,KLEV) !grid box volume for diagnostics REAL(KIND=JPRB) :: ZPBL(KLON) !planetary boundary layer top level (in vdfmain.F90 ITOP=1) +REAL(KIND=JPRB) :: Ztmp(KLON) !planetary boundary layer top level (in vdfmain.F90 ITOP=1) REAL(KIND=JPRB) :: ZXTM0(KLON,KLEV,ntrac) !tracer mixing ratios for HAM REAL(KIND=JPRB) :: ZXTM1(KLON,KLEV,ntrac) !tracer mixing ratios for HAM REAL(KIND=JPRB) :: ZXTTE(KLON,KLEV,ntrac) !tracer tendency for HAM @@ -402,18 +403,29 @@ SUBROUTINE HAMM7_INTERFACE( & REAL(KIND=JPRB) :: ZDPG(KLON,KLEV) !dp/g REAL(KIND=JPRB) :: ZQP(KLON,KLEV) !full level humidity with treshold LOGICAL :: LSTRAT !logical switch for stratiform or convective case (TRUE for strat., FALSE for conv.) -REAL(KIND=JPRB) :: ZFEVAPR(KLON,KLEV) !evaporation of rain [kg/m2/s] -REAL(KIND=JPRB) :: ZFSUBLS(KLON,KLEV) !sublimation of snow [kg/m2/s] -REAL(KIND=JPRB) :: ZMRATEPR(KLON,KLEV) !rain formation rate in cloudy part -REAL(KIND=JPRB) :: ZMRATEPS(KLON,KLEV) !ice formation rate in cloudy part +REAL(KIND=JPRB) :: ZFEVAPR_cov(KLON,KLEV) !evaporation of rain [kg/m2/s] +REAL(KIND=JPRB) :: ZFSUBLS_cov(KLON,KLEV) !sublimation of snow [kg/m2/s] + +REAL(KIND=JPRB) :: ZFEVAPR_str(KLON,KLEV) !evaporation of rain [kg/m2/s] +REAL(KIND=JPRB) :: ZFSUBLS_str(KLON,KLEV) !sublimation of snow [kg/m2/s] + +REAL(KIND=JPRB) :: ZMRATEPR_cov(KLON,KLEV) !rain formation rate in cloudy part +REAL(KIND=JPRB) :: ZMRATEPS_cov(KLON,KLEV) !ice formation rate in cloudy part + +REAL(KIND=JPRB) :: ZMRATEPR_str(KLON,KLEV) !rain formation rate in cloudy part +REAL(KIND=JPRB) :: ZMRATEPS_str(KLON,KLEV) !ice formation rate in cloudy part + REAL(KIND=JPRB) :: ZMSNOWACL(KLON,KLEV) !accretion rate of snow with cloud droplets in cloudy part REAL(KIND=JPRB) :: ZFLXR, ZFLXS, ZFLXRB, ZFLXSB !variables to calculate rain and snow evap/formation REAL(KIND=JPRB) :: ZLP(KLON,KLEV) !temporary variable for cloud water content REAL(KIND=JPRB) :: ZIP(KLON,KLEV) !temporary variable for cloud ice water content +REAL(KIND=JPRB) :: ZLPU(KLON,KLEV) !temporary variable for cloud water content +REAL(KIND=JPRB) :: ZIPDUM(KLON,KLEV) !temporary variable for cloud ice water content ! variables for ICNC calculations REAL(KIND=JPRB) :: ZICNC(KLON,KLEV) ! ice crystal number concentration [#/cm3] ! added here variables for dry deposition and sedimentation REAL(KIND=JPRB) :: ZTENCIH(KLON,KLEV,ntrac) !for HAM tendencies +REAL(KIND=JPRB) :: ZTENCTMP(KLON,KLEV,ntrac) !for HAM tendencies REAL(KIND=JPRB) :: ZAHFSM(KLON) REAL(KIND=JPRB) :: ZWND(KLON) ! variables not needed for HAM aerosol dry deposition (if gas deposition and different surfaces are taken into account these need to be revised!) @@ -436,7 +448,8 @@ SUBROUTINE HAMM7_INTERFACE( & REAL(KIND=JPRB) :: SEDOUT_2D(KLON,KTRAC) REAL(KIND=JPRB) :: DDEPOUT_2D(KLON,KTRAC) -REAL(KIND=JPRB) :: WDEPOUT_2D(KLON,KTRAC) +REAL(KIND=JPRB) :: WDEPOUT_2DC(KLON,KTRAC) +REAL(KIND=JPRB) :: WDEPOUT_2DS(KLON,KTRAC) REAL(KIND=JPRB) :: WDEPOUT_IC_2D(KLON,KTRAC) REAL(KIND=JPRB) :: WDEPOUT_BC_2D(KLON,KTRAC) @@ -608,7 +621,8 @@ SUBROUTINE HAMM7_INTERFACE( & ZVDA(KIDIA:KFDIA,:) = 0._JPRB ! unused 2024-07-11 SEDOUT_2D(KIDIA:KFDIA,:) = 0._JPRB DDEPOUT_2D(KIDIA:KFDIA,:) = 0._JPRB ! unused 2024-07-11 -WDEPOUT_2D(KIDIA:KFDIA,:) = 0._JPRB +WDEPOUT_2DC(KIDIA:KFDIA,:) = 0._JPRB +WDEPOUT_2DS(KIDIA:KFDIA,:) = 0._JPRB WDEPOUT_IC_2D(KIDIA:KFDIA,:) = 0._JPRB WDEPOUT_BC_2D(KIDIA:KFDIA,:) = 0._JPRB @@ -696,6 +710,9 @@ SUBROUTINE HAMM7_INTERFACE( & ENDDO ENDDO + DO JL=KIDIA,KFDIA + Htmp(JL)=sum(ZDZ(JL,:)) + ENDDO ZM6RP(KIDIA:KFDIA,:,:) = 0.0_JPRB ZM6DRY(KIDIA:KFDIA,:,:) = 0.0_JPRB ZRHOP(KIDIA:KFDIA,:,:) = 0.0_JPRB @@ -921,6 +938,7 @@ SUBROUTINE HAMM7_INTERFACE( & ENDDO ENDDO + ZTENCIH(KIDIA:KFDIA,1:KLEV,1:NTRAC)=ZXTTE(KIDIA:KFDIA,1:KLEV,1:NTRAC) ! --> calling the correct microphysics scheme SELECT CASE (TRIM(AERO_SCHEME)) @@ -1019,9 +1037,13 @@ SUBROUTINE HAMM7_INTERFACE( & ZTKEM1, ZWCAPE, PVERVEL, ZRHO, & ! turbulent kinetic energy, CAPE contr. to conv. vert. veloc. [m s-1], large scale vert. veloc. ZW, ZWPDF) + DO JT = 1,NTRAC + ZXTP1(KIDIA:KFDIA,1:KLEV,JT) = ZXTM1(KIDIA:KFDIA,1:KLEV,JT) + ZXTTE(KIDIA:KFDIA,1:KLEV,JT) * TIME_STEP_LEN + END DO IF (ncd_activ == 2 .OR. nccndiag > 0) THEN + !write(*,*)"ham_activ_koehler_ab" CALL ham_activ_koehler_ab(KFDIA, KLON, KLEV, ZKROW, KTDIA, & ! krow=1 ktdia=1 - ZXTM1, PTP, ZA, ZB) + ZXTP1, PTP, ZA, ZB) END IF DO JCLASS = 1,nclass! nclass=7 @@ -1039,9 +1061,9 @@ SUBROUTINE HAMM7_INTERFACE( & ENDDO ENDDO - CALL HAM_ACTIV_ABDULRAZZAK_GHAN( KFDIA, KLON, KLEV, ZKROW, KTDIA, & ! in original 1 = ktdia... for diagnostics so krow=1 and ktdia=1 + CALL ham_activ_abdulrazzak_ghan( KFDIA, KLON, KLEV, ZKROW, KTDIA, & ! in original 1 = ktdia... for diagnostics so krow=1 and ktdia=1 & ZCDNCACT, ZESW, ZRHO, & ! number of activated particles, saturation vapor pressure, air density - & ZXTM1, PTP, PRSF1, ZQP, & ! tracer mix rat, temperature, air pressure, spec. humid. + & ZXTP1, PTP, PRSF1, ZQP, & ! tracer mix rat, temperature, air pressure, spec. humid. & ZW, ZWPDF, ZA, ZB, ZRDRY, & ! mean udr veloc, pdf of udr. veloc, Koehler A, Koehler B, dry radius & ZNACT, ZFRACN, ZSC, ZRC, ZSMAX) ! num. act. part., frac ", crit. ssat., crit. radius, max ssat CALL GSTATS(2502,1) @@ -1051,41 +1073,107 @@ SUBROUTINE HAMM7_INTERFACE( & !<-- Store CDNC (number of activated particles) and ICNC as a number mixing ratio to tracer values and to PGFL fields + !write(*,*)"idt_cdnc",idt_cdnc + !write(*,*)"idt_icnc",idt_icnc ZXTM1(KIDIA:KFDIA,1:KLEV,idt_cdnc) = (MAX(ZCDNCACT(KIDIA:KFDIA,1:KLEV),((1.0E6_JPRB)*1._JPRB)))/ZRHO(KIDIA:KFDIA,1:KLEV) ! [#/kg] and treshold CDNC to 1 cm-3 ZXTM1(KIDIA:KFDIA,1:KLEV,idt_icnc) = (1.0E6_JPRB)*ZICNC(KIDIA:KFDIA,1:KLEV)/ZRHO(KIDIA:KFDIA,1:KLEV) !ice crystal number conc = #/cm3 --> number mix rat [#/kg] - - PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH) = MAX(((1.0E-6_JPRB)*ZCDNCACT(KIDIA:KFDIA,1:KLEV)),1._JPRB) ! add CDNC to PGFL field (convert from #/m3 to #/cm3) and treshold minimum value to 1 cm-3 - PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH) = ZICNC(KIDIA:KFDIA,1:KLEV) ! add ICNC to PGFL field (does not need convert) + !write(*,*) "PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH)",PGFL(KIDIA:KFDIA,KLEV,YCDNC%MP9_PH) + !write(*,*) "MAX(((1.0E-6_JPRB)*ZCDNCACT(KIDIA:KFDIA,1:KLEV)),1._JPRB)",MAX(((1.0E-6_JPRB)*ZCDNCACT(KIDIA:KFDIA,KLEV)),1._JPRB) + !write(*,*) "ZCDNCACT(KIDIA:KFDIA,1:KLEV)),1._JPRB)",ZCDNCACT(KIDIA:KFDIA,KLEV) + PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH) = PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH)+MAX((ZCDNCACT(KIDIA:KFDIA,1:KLEV)),1.0E+6_JPRB) ! add CDNC to PGFL field (convert from #/m3 to #/cm3) and treshold minimum value to 1 cm-3 + !write(*,*)"PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH)",PGFL(KIDIA:KFDIA,KLEV,YICNC%MP9_PH) + !write(*,*)"ZICNC(KIDIA:KFDIA,1:KLEV) ",ZICNC(KIDIA:KFDIA,KLEV) + PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH) = PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH)+ZICNC(KIDIA:KFDIA,1:KLEV)*1.0E6_JPRB ! add ICNC to PGFL field (does not need convert) !--> End store CDNC and ICNC + !----------------------------------------------------------------- !--> Calculation for effective radii and put to PGFL fields ! put default values for effective radii reffl(KIDIA:KFDIA,1:KLEV,ZKROW) = 4._JPRB ! comes from liquid effective radius routine (PP_MIN_RE_UM) reffi(KIDIA:KFDIA,1:KLEV,ZKROW) = 80._JPRB*0.64952_JPRB ! comes from ice effective radius routine (ZDEFAULT_RE_UM) - +! IF (PAP(JL,KLEV) > 0.001_JPRB) THEN +! Z1CLD = 1._JPRB/PAP(JL,KLEV) +! ZQIWP = MAX(0._JPRB, PIP(JL,KLEV)*Z1CLD) +! ZQLWP = MAX(0._JPRB, PLP(JL,KLEV)*Z1CLD) +! ENDIF ! liquid effective radius + + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + IF ( PAP(JL,JK) >=0.001_JPRB ) THEN + ZTEMP=1.0_JPRB/PAP(JL,JK) + !ZDPOG=ZRGI*(PPRESH(JL,JK)-PPRESH(JL,JK-1)) + ZDPOG=1.0/RG*(PRS1(JL,JK)-PRS1(JL,JK-1)) + +!-- cloud and ice water path in kg m-2 + ZQIWP =MAX(0._JPRB,ZDPOG*PIP(JL,JK)*ZTEMP) + ZQLWP(JL,JK) =MAX(0._JPRB,ZDPOG*PLP(JL,JK)*ZTEMP) + ! ZQIP=MAX(0._JPRB,1.E+03_JPRB*ZDPOG*PIWCF(JL,JK)) + ! ZQLP=MAX(0._JPRB,1.E+03_JPRB*ZDPOG*PLWCF(JL,JK)) +!-- cloud and ice water content in g m-3 + !ZPODT=ZRDI*PPRESF(JL,JK)/PTF(JL,JK) + + ZPODT=1.0/RD*PRSF1(JL,JK)/PTP(JL,JK) + !ZIWC=1.E+03_JPRB*PIWCF(JL,JK)*ZPODT*ZTEMP + !ZLWC=1.E+03_JPRB*PLWCF(JL,JK)*ZPODT*ZTEMP + !ZIP(JL,JK)=1.E+03_JPRB*PIP(JL,JK)*ZPODT*ZTEMP + !ZLP(JL,JK)=1.E+03_JPRB*PLP(JL,JK)*ZPODT*ZTEMP + ZIP(JL,JK)=PIP(JL,JK)*ZPODT*ZTEMP + ZLP(JL,JK)=PLP(JL,JK)*ZPODT*ZTEMP + + ELSE + ZQIWP = 0._JPRB + ZQLWP(JL,JK) = 0._JPRB + ZLP(JL,JK) = 0._JPRB + ZIP(JL,JK) = 0._JPRB + ENDIF + END DO + END DO + + + DO JK=1,KLEV DO JL=KIDIA,KFDIA ZTMPA = 1.0_JPRB/MAX(ZAP(JL,JK),ZEPSEC) LLIQCLD(JL,JK) = ( PLP(JL,JK)*ZTMPA ) > ZEPSEC ! logical for liquid cloud LICECLD(JL,JK) = ( PIP(JL,JK)*ZTMPA ) > ZEPSEC ! logical for ice cloud - ZQLWP(JL,JK) = PLP(JL,JK)/MAX(ZAP(JL,JK),1.E-10_JPRB) ! calculate lwp - ZQLWP(JL,JK) = MIN(MAX(ZQLWP(JL,JK),0.0_JPRB),RCLDMAX) ! treshold lwp + ZQLWP2(JL,JK) = PLP(JL,JK)/MAX(ZAP(JL,JK),1.E-10_JPRB) ! calculate lwp + ZQLWP2(JL,JK) = MIN(MAX(ZQLWP2(JL,JK),0.0_JPRB),10*RCLDMAX) ! treshold lwp, lianghai changed + !ZQLWP(JL,JK) = MIN(MAX(ZQLWP(JL,JK),0.0_JPRB),10*RCLDMAX) ! treshold lwp, lianghai changed ! effective radius calculated similarly as in radlswr.F90 ! 2.387e-10 is 3/(4*pi*rho_liq*10^6) [10^6 for N in right units] - ZRE_LIQ(JL,JK) = 1.E+06_JPRB*(2.387e-10_JPRB*ZRHO(JL,JK)*ZQLWP(JL,JK)/(MAX(PGFL(JL,JK,YCDNC%MP9_PH),10._JPRB)))**0.333_JPRB ! calculate effective radius in um (use minimum value for CDNC if CDNC is small) - END DO + ZRE_LIQ(JL,JK) = (2.387e-4_JPRB*ZRHO(JL,JK)*ZQLWP(JL,JK)/(MAX(PGFL(JL,JK,YCDNC%MP9_PH)*1.0E-6_JPRB,10._JPRB)))**0.333_JPRB ! calculate effective radius in um (use minimum value for CDNC if CDNC is small) END DO - - ! Add liq. eff. rad. to HAM variables (only if there is liquid cloud else minimum value) - REFFL(KIDIA:KFDIA,1:KLEV,ZKROW) = MERGE(ZRE_LIQ(KIDIA:KFDIA,1:KLEV),4._JPRB,LLIQCLD(KIDIA:KFDIA,1:KLEV)) + END DO + !write(*,*)"ZCDNCACT",ZCDNCACT(:,klev) + !write(*,*)"ZFRACN 1",ZFRACN(:,klev,1) + !write(*,*)"ZFRACN 2",ZFRACN(:,klev,2) + !write(*,*)"ZFRACN 3",ZFRACN(:,klev,3) + !write(*,*)"ZFRACN 4",ZFRACN(:,klev,4) + !write(*,*)"ZFRACN 5",ZFRACN(:,klev,5) + !write(*,*)"ZFRACN 6",ZFRACN(:,klev,6) + !write(*,*)"ZFRACN 7",ZFRACN(:,klev,7) + !write(*,*)"RCLDMAX",RCLDMAX + !write(*,*)"ZLP",ZLP(:,KLEV) + !write(*,*)"PLP",PLP(:,KLEV) + !write(*,*)"ZAP",ZAP(:,KLEV) + ! + !write(*,*)"ZQLWP",ZQLWP(:,KLEV) + !write(*,*)"ZQLWP2",ZQLWP2(:,KLEV) + !write(*,*)"ZRHO",ZRHO(:,KLEV) + !write(*,*)"PGFL(JL,JK,YCDNC%MP9_PH) in /cm3",PGFL(:,KLEV,YCDNC%MP9_PH)*1.0E-6_JPRB + !! Add liq. eff. rad. to HAM variables (only if there is liquid cloud else minimum value) + !write(*,*)"ZRE_LIQ m",ZRE_LIQ(KIDIA:KFDIA,KLEV) + !write(*,*)"ZRE_LIQ um",ZRE_LIQ(KIDIA:KFDIA,KLEV)*1.E+6_JPRB + REFFL(KIDIA:KFDIA,1:KLEV,ZKROW) = MERGE(ZRE_LIQ(KIDIA:KFDIA,1:KLEV)*1.E+6_JPRB,4._JPRB,LLIQCLD(KIDIA:KFDIA,1:KLEV)) CALL ICE_EFFECTIVE_RADIUS(YRERAD, YDSPP_CONFIG, KIDIA, KFDIA, KLON, KLEV, & & PRSF1, PTP, ZAP, PIP, PSP, PGEMU, & ! pressure, temp, cloud fr., IWC, SWC, sine of latitude & reffi(1:KLON,1:KLEV,ZKROW)) ! ice effective radius (updated to mo_activ variable 'reffi' which used in mo_ham_wetdep) - + !write(*,*)"reffi",reffi(:,klev,1) + !write(*,*)"reffl",reffl(:,klev,1) ! only if there is ice cloud else minimum value REFFI(KIDIA:KFDIA,1:KLEV,ZKROW) = MERGE(REFFI(KIDIA:KFDIA,1:KLEV,ZKROW), 20._JPRB, LICECLD(KIDIA:KFDIA,1:KLEV)) @@ -1127,29 +1215,71 @@ SUBROUTINE HAMM7_INTERFACE( & ZFLXRB=PFPLCL(JL,JK) ZFLXSB=PFPLCN(JL,JK) IF (PCOVPTOT(JL,JK) > 1e-40_JPRB) THEN - ZMRATEPR(JL,JK) = ( ZFLXRB-ZFLXR ) / PCOVPTOT(JL,JK) - ZMRATEPS(JL,JK) = ( ZFLXSB-ZFLXS ) / PCOVPTOT(JL,JK) + !ZMRATEPR(JL,JK) = ( ZFLXRB-ZFLXR ) / PCOVPTOT(JL,JK) + !ZMRATEPS(JL,JK) = ( ZFLXSB-ZFLXS ) / PCOVPTOT(JL,JK) + !!same formula negatives/positives for evap or formation + !ZFEVAPR(JL,JK) = ( ZFLXRB-ZFLXR ) / PCOVPTOT(JL,JK) + !ZFSUBLS(JL,JK) = ( ZFLXSB-ZFLXS ) / PCOVPTOT(JL,JK) + ZMRATEPR_cov(JL,JK) = ( ZFLXRB-ZFLXR ) / MAX(PCOVPTOT(JL,JK),1.E-10_JPRB) + ZMRATEPS_cov(JL,JK) = ( ZFLXSB-ZFLXS ) / MAX(PCOVPTOT(JL,JK),1.E-10_JPRB) !same formula negatives/positives for evap or formation - ZFEVAPR(JL,JK) = ( ZFLXRB-ZFLXR ) / PCOVPTOT(JL,JK) - ZFSUBLS(JL,JK) = ( ZFLXSB-ZFLXS ) / PCOVPTOT(JL,JK) + ZFEVAPR_cov(JL,JK) = 0.0!( ZFLXRB-ZFLXR ) / MAX(PCOVPTOT(JL,JK),1.E-10_JPRB) + ZFSUBLS_cov(JL,JK) = 0.0!( ZFLXSB-ZFLXS ) / MAX(PCOVPTOT(JL,JK),1.E-10_JPRB) ELSE - ZMRATEPR(JL,JK) = 0.0_JPRB - ZMRATEPS(JL,JK) = 0.0_JPRB + ZMRATEPR_cov(JL,JK) = 0.0_JPRB + ZMRATEPS_cov(JL,JK) = 0.0_JPRB !same formula negatives/positives for evap or formation - ZFEVAPR(JL,JK) = 0.0_JPRB - ZFSUBLS(JL,JK) = 0.0_JPRB + ZFEVAPR_cov(JL,JK) = 0.0_JPRB + ZFSUBLS_cov(JL,JK) = 0.0_JPRB END IF + + END DO END DO - ZMSNOWACL(KIDIA:KFDIA,1:KLEV) = ZMRATEPS(KIDIA:KFDIA,1:KLEV) !? + + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZFLXR=PFPLSL(JL,JK-1) + ZFLXS=PFPLSN(JL,JK-1) + ZFLXRB=PFPLSL(JL,JK) + ZFLXSB=PFPLSN(JL,JK) + IF (PCOVPTOT(JL,JK) > 1e-40_JPRB) THEN + !ZMRATEPR(JL,JK) = ( ZFLXRB-ZFLXR ) / PCOVPTOT(JL,JK) + !ZMRATEPS(JL,JK) = ( ZFLXSB-ZFLXS ) / PCOVPTOT(JL,JK) + !!same formula negatives/positives for evap or formation + !ZFEVAPR(JL,JK) = ( ZFLXRB-ZFLXR ) / PCOVPTOT(JL,JK) + !ZFSUBLS(JL,JK) = ( ZFLXSB-ZFLXS ) / PCOVPTOT(JL,JK) + ZMRATEPR_str(JL,JK) = ( ZFLXRB-ZFLXR ) / MAX(PCOVPTOT(JL,JK),1.E-10_JPRB) + ZMRATEPS_str(JL,JK) = ( ZFLXSB-ZFLXS ) / MAX(PCOVPTOT(JL,JK),1.E-10_JPRB) + !same formula negatives/positives for evap or formation + ZFEVAPR_str(JL,JK) = 0.0!( ZFLXRB-ZFLXR ) / MAX(PCOVPTOT(JL,JK),1.E-10_JPRB) + ZFSUBLS_str(JL,JK) = 0.0!( ZFLXSB-ZFLXS ) / MAX(PCOVPTOT(JL,JK),1.E-10_JPRB) + ELSE + ZMRATEPR_str(JL,JK) = 0.0_JPRB + ZMRATEPS_str(JL,JK) = 0.0_JPRB + !same formula negatives/positives for evap or formation + ZFEVAPR_str(JL,JK) = 0.0_JPRB + ZFSUBLS_str(JL,JK) = 0.0_JPRB + END IF + + + END DO + END DO + + + !write(*,*)"ZMRATEPR_str", ZMRATEPR_str(:,KLEV) + !write(*,*)"ZMRATEPS_str", ZMRATEPS_str(:,KLEV) + ZMSNOWACL(KIDIA:KFDIA,1:KLEV) = ZMRATEPS_str(KIDIA:KFDIA,1:KLEV) !? + !ZMSNOWACL(KIDIA:KFDIA,1:KLEV) = PSP(KIDIA:KFDIA,1:KLEV) !? ZLFRAC_SO2(KIDIA:KFDIA,:) = 0._JPRB ! zlfrac_so2 only needed in gas scavenging and this is off for now (put this zero) - ZLP(KIDIA:KFDIA,1:KLEV) = PLP(KIDIA:KFDIA,1:KLEV) ! temporary variable for cloud water content (modified in wetdep) - ZIP(KIDIA:KFDIA,1:KLEV) = PIP(KIDIA:KFDIA,1:KLEV) ! temporary variable for cloud ice water content (modified in wetdep) + !ZLP(KIDIA:KFDIA,1:KLEV) = PLP(KIDIA:KFDIA,1:KLEV) ! temporary variable for cloud water content (modified in wetdep) + !ZIP(KIDIA:KFDIA,1:KLEV) = PIP(KIDIA:KFDIA,1:KLEV) ! temporary variable for cloud ice water content (modified in wetdep) + ZIPDUM(KIDIA:KFDIA,1:KLEV) = 0._JPRB ! temporary variable for cloud ice water content (modified in wetdep) - ZTENCIH(KIDIA:KFDIA,1:KLEV,1:NTRAC)=ZXTTE(KIDIA:KFDIA,1:KLEV,1:NTRAC) + ZLPU(KIDIA:KFDIA,1:KLEV) = PLU(KIDIA:KFDIA,1:KLEV) ! temporary variable for cloud water content (modified in wetdep) IF (.NOT.LAERCHEM)THEN CALL HAM_CONV_LFRAQ_SO2(KFDIA,KLON,KLEV,PTP,ZXTM1,ZRHO,ZLP,ZLFRAC_SO2) END IF @@ -1177,33 +1307,60 @@ SUBROUTINE HAMM7_INTERFACE( & LSTRAT = .FALSE. !False for convective case IF (.NOT. LSTRAT) THEN CALL XT_CONV_MASSFIX(KFDIA, KLON, KLEV, KLEV+1, NTRAC, ZKROW, PRSF1, PRS1, ZXTTE, .TRUE., ZDUMMY) ! call convective mass conserving (init zxtte_old) - + !write(*,*)"1 ZXTTE ac",ZXTTE(:,klev,16) + !write(*,*)"1 ZXTTE ac 4",ZXTTE(:,klev,24) + !write(*,*)"1 ZXTTE cs",ZXTTE(:,klev,17) + !write(*,*)"1 ZXTTE cs",ZXTTE(:,klev,25) + !write(*,*)"ZM6RP 1",ZM6RP(:,klev,1) + !write(*,*)"ZM6RP 2",ZM6RP(:,klev,2) + !write(*,*)"ZM6RP 3",ZM6RP(:,klev,3) + !write(*,*)"ZM6DRY",ZM6DRY(:,klev,3) + !write(*,*)"PFPLSL", PFPLSL(:,KLEV) + !write(*,*)"PCOVPTOT",PCOVPTOT(:,KLEV) + !write(*,*)"ZAP",ZAP(:,KLEV) + !write(*,*)"PMFU",PMFU(:,KLEV) + ZTENCTMP(KIDIA:KFDIA,1:KLEV,1:NTRAC) = ZTENCIH(KIDIA:KFDIA,1:KLEV,1:NTRAC) CALL WETDEP_INTERFACE(KFDIA, KLON, KLEV, 1, ZKROW, LSTRAT, & ! ktop = 1 (top level index), lstrat = FALSE for conv. case - ZDPG, ZMRATEPR, ZMRATEPS, ZMSNOWACL, & ! dp/g, evap. of rain, subl. of snow, accr. rate of snow with cl. drop in-cl. - ZLP, ZIP, & ! cloud water content, cloud ice water content + !ZDPG, ZMRATEPR_cov, ZMRATEPS_cov, ZMSNOWACL, & ! dp/g, evap. of rain, subl. of snow, accr. rate of snow with cl. drop in-cl. + ZDPG, PRP, PSP, ZMSNOWACL, & ! dp/g, evap. of rain, subl. of snow, accr. rate of snow with cl. drop in-cl. + ZLPU, ZIP, & ! cloud water content, cloud ice water content ZM6RP, ZM6DRY, & ! m7 aerosol: to replace rwet_m7, dry radius for soluble modes [cm] REFFI, REFFL, & ! effective radii ZCDNCACT, ZFRACN, & ! number/fraction of activated particles per mode - PTP, ZDUM3D, ZLFRAC_SO2, & ! temperature, prev. mixing ratio, zlfrac_so2 only needed in gas scavenging (0 for now) - ZXTTE, ZXTP10, ZXTP1C, & ! tendencies/mixing ratios (in/out) - PFPLSL, PFPLSN, ZFEVAPR, ZFSUBLS, & ! rain flux, snow flux, + PTP, ZXTM1, ZLFRAC_SO2, & ! temperature, prev. mixing ratio, zlfrac_so2 only needed in gas scavenging (0 for now) + !ZXTTE, ZXTP10, ZXTP1C, & ! tendencies/mixing ratios (in/out) + ZTENCTMP, ZXTP10, ZXTP1C, & ! tendencies/mixing ratios (in/out) + PFPLCL, PFPLCN, ZFEVAPR_cov, ZFSUBLS_cov, & ! rain flux, snow flux, PMFU, ZFUXT3D, & ! conv flux, updraft mass flux (updated in wetdep) - ZAP, ZDUM2D, ZRHO, ZDUMMY, ZWDEP_SCAV_IC, ZWDEP_SCAV_BC) ! cloud frac., precip. frac., air dens., in/output*3 - + ZAP, ZDUM2D, ZRHO, ZDUMMY, ZWDEP_SCAV_IC, ZWDEP_SCAV_BC) ! cloud frac., precip. frac., air dens., in/output*3 + + ZXTTE(KIDIA:KFDIA,1:KLEV,1:NTRAC) = ZXTTE(KIDIA:KFDIA,1:KLEV,1:NTRAC)+ZTENCTMP(KIDIA:KFDIA,1:KLEV,1:NTRAC)-ZTENCIH(KIDIA:KFDIA,1:KLEV,1:NTRAC) + !write(*,*)"2 ZXTTE ac",ZXTTE(:,klev,16) + !write(*,*)"2 ZXTTE ac 4",ZXTTE(:,klev,24) + !write(*,*)"2 ZXTTE cs",ZXTTE(:,klev,17) + !write(*,*)"2 ZXTTE cs",ZXTTE(:,klev,25) + !write(*,*)"ZDUMMY ac",ZDUMMY(:,24) + !write(*,*)"ZDUMMY cs",ZDUMMY(:,25) + !write(*,*)"ZDUMMY ac",ZDUMMY(:,24)*RG/ZDP(:,KLEV) + !write(*,*)"ZDUMMY cs",ZDUMMY(:,25)*RG/ZDP(:,KLEV) CALL XT_CONV_MASSFIX(KFDIA, KLON, KLEV, KLEV+1, NTRAC, ZKROW, PRSF1, PRS1, ZXTTE, .FALSE., ZDUMMY) ! call convective mass conserving + !write(*,*)"3 ZXTTE ac",ZXTTE(:,klev,16) + !write(*,*)"3 ZXTTE ac",ZXTTE(:,klev,24) + !write(*,*)"3 ZXTTE cs",ZXTTE(:,klev,17) + !write(*,*)"3 ZXTTE cs",ZXTTE(:,klev,25) END IF !Add convective case wet removal fluxes to diagnostics DO JMASS=1,NAEROCOMP JY=KAERO(ind_oifs_ham%ind_mass_OIFS(JMASS)) - WDEPOUT_2D (KIDIA:KFDIA,JY) = WDEPOUT_2D (KIDIA:KFDIA,JY) + ZDUMMY (KIDIA:KFDIA, ind_oifs_ham%ind_mass_ham(JMASS)) + WDEPOUT_2DC (KIDIA:KFDIA,JY) = WDEPOUT_2DC (KIDIA:KFDIA,JY) + ZDUMMY (KIDIA:KFDIA, ind_oifs_ham%ind_mass_ham(JMASS)) WDEPOUT_IC_2D(KIDIA:KFDIA,JY) = WDEPOUT_IC_2D(KIDIA:KFDIA,JY) + ZWDEP_SCAV_IC(KIDIA:KFDIA, ind_oifs_ham%ind_mass_ham(JMASS)) WDEPOUT_BC_2D(KIDIA:KFDIA,JY) = WDEPOUT_BC_2D(KIDIA:KFDIA,JY) + ZWDEP_SCAV_BC(KIDIA:KFDIA, ind_oifs_ham%ind_mass_ham(JMASS)) END DO DO JCLASS=1,NCLASS JY=KAERO(ind_oifs_ham%ind_class_OIFS(JCLASS)) - WDEPOUT_2D (KIDIA:KFDIA,JY) = WDEPOUT_2D (KIDIA:KFDIA,JY) + ZDUMMY (KIDIA:KFDIA, ind_oifs_ham%ind_class_ham(JCLASS)) + WDEPOUT_2DC (KIDIA:KFDIA,JY) = WDEPOUT_2DC (KIDIA:KFDIA,JY) + ZDUMMY (KIDIA:KFDIA, ind_oifs_ham%ind_class_ham(JCLASS)) WDEPOUT_IC_2D(KIDIA:KFDIA,JY) = WDEPOUT_IC_2D(KIDIA:KFDIA,JY) + ZWDEP_SCAV_IC(KIDIA:KFDIA, ind_oifs_ham%ind_class_ham(JCLASS)) WDEPOUT_BC_2D(KIDIA:KFDIA,JY) = WDEPOUT_BC_2D(KIDIA:KFDIA,JY) + ZWDEP_SCAV_BC(KIDIA:KFDIA, ind_oifs_ham%ind_class_ham(JCLASS)) END DO @@ -1214,7 +1371,7 @@ SUBROUTINE HAMM7_INTERFACE( & ! set both equal to tracer mixing ratio as starting point ! ham_wet_chemistry will re-compute these values if lham=true DO JT = 1,NTRAC - ZXTP1(KIDIA:KFDIA,1:KLEV,JT) = ZXTM1(KIDIA:KFDIA,1:KLEV,JT) + ZXTTE(KIDIA:KFDIA,1:KLEV,JT) * TIME_STEP_LEN + !ZXTP1(KIDIA:KFDIA,1:KLEV,JT) = ZXTM1(KIDIA:KFDIA,1:KLEV,JT) + ZXTTE(KIDIA:KFDIA,1:KLEV,JT) * TIME_STEP_LEN ZXTP1C(KIDIA:KFDIA,1:KLEV,JT) = ZXTP1(KIDIA:KFDIA,1:KLEV,JT) ZXTP10(KIDIA:KFDIA,1:KLEV,JT) = ZXTP1(KIDIA:KFDIA,1:KLEV,JT) END DO @@ -1225,30 +1382,48 @@ SUBROUTINE HAMM7_INTERFACE( & ZDUM2D(KIDIA:KFDIA,1:KLEV) = 0._JPRB ! dummy conv flux for strat. case ZDUM3D(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB ! dummy updraft mass flux for strat. case - LSTRAT = .TRUE. !True for strat case + LSTRAT = .TRUE. !True for strat case,large scale + !write(*,*)"4 ZXTTE ac",ZXTTE(:,klev,16) + !write(*,*)"4 ZXTTE ac 4",ZXTTE(:,klev,24) + !write(*,*)"4 ZXTP1c 4",ZXTP1C(:,klev,24) + !write(*,*)"4 ZXTTE cs",ZXTTE(:,klev,17) + !write(*,*)"4 ZXTTE cs",ZXTTE(:,klev,25) + !write(*,*)"PCOVPTOT",PCOVPTOT(:,klev) + ZTENCTMP(KIDIA:KFDIA,1:KLEV,1:NTRAC) = ZTENCIH(KIDIA:KFDIA,1:KLEV,1:NTRAC) CALL WETDEP_INTERFACE(KFDIA, KLON, KLEV, 1, ZKROW, LSTRAT, & ! ktop = 1 (top level index), lstrat = TRUE for strat. case - ZDPG, ZMRATEPR, ZMRATEPS, ZMSNOWACL, & ! dp/g, evap. of rain, subl. of snow, accr. rate of snow with cl. drop in-cl. + !ZDPG, ZMRATEPR_str, ZMRATEPS_str, ZMSNOWACL, & ! dp/g, evap. of rain, subl. of snow, accr. rate of snow with cl. drop in-cl. + ZDPG, PRP, PSP, ZMSNOWACL, & ! dp/g, evap. of rain, subl. of snow, accr. rate of snow with cl. drop in-cl. ZLP, ZIP, & ! cloud water content, cloud ice water content ZM6RP, ZM6DRY, & ! m7 aerosol: to replace rwet_m7, dry radius for soluble modes [cm] REFFI, REFFL, & ! effective radii ZCDNCACT, ZFRACN, & ! number/fraction of activated particles per mode PTP, ZXTM1, ZLFRAC_SO2, & ! temperature, prev. mixing ratio, zlfrac_so2 only needed in gas scavenging (0 for now) - ZXTTE, ZXTP10, ZXTP1C, & ! tendencies/mixing ratios (in/out) - PFPLSL, PFPLSN, ZFEVAPR, ZFSUBLS, & ! rain flux, snow flux, + !ZXTTE, ZXTP10, ZXTP1C, & ! tendencies/mixing ratios (in/out) + ZTENCTMP, ZXTP10, ZXTP1C, & ! tendencies/mixing ratios (in/out) + PFPLSL, PFPLSN, ZFEVAPR_str, ZFSUBLS_str, & ! rain flux, snow flux, ZDUM2D, ZDUM3D, & ! zeroes as these are not needed in strat. case ZAP, PCOVPTOT, ZRHO, ZDUMMY, ZWDEP_SCAV_IC, ZWDEP_SCAV_BC) ! cloud frac., precip. frac., air dens., in/output*3 + ZXTTE(KIDIA:KFDIA,1:KLEV,1:NTRAC) = ZXTTE(KIDIA:KFDIA,1:KLEV,1:NTRAC)+ZTENCTMP(KIDIA:KFDIA,1:KLEV,1:NTRAC)-ZTENCIH(KIDIA:KFDIA,1:KLEV,1:NTRAC) + !write(*,*)"5 ZXTTE ac",ZXTTE(:,klev,16) + !write(*,*)"5 ZXTTE ac 4",ZXTTE(:,klev,24) + !write(*,*)"5 ZXTTE cs",ZXTTE(:,klev,17) + !write(*,*)"5 ZXTTE cs",ZXTTE(:,klev,25) + !write(*,*)"ZDUMMY ac",ZDUMMY(:,24) + !write(*,*)"ZDUMMY cs",ZDUMMY(:,25) + !write(*,*)"ZDUMMY ac",ZDUMMY(:,24)*RG/ZDP(:,KLEV) + !write(*,*)"ZDUMMY cs",ZDUMMY(:,25)*RG/ZDP(:,KLEV) ! Add stratiform case wet removal fluxes to diagnostics DO JMASS=1,NAEROCOMP JY=KAERO(ind_oifs_ham%ind_mass_OIFS(JMASS)) - WDEPOUT_2D (KIDIA:KFDIA,JY) = WDEPOUT_2D (KIDIA:KFDIA,JY) + ZDUMMY (KIDIA:KFDIA, ind_oifs_ham%ind_mass_ham(JMASS)) + WDEPOUT_2DS (KIDIA:KFDIA,JY) = WDEPOUT_2DS (KIDIA:KFDIA,JY) + ZDUMMY (KIDIA:KFDIA, ind_oifs_ham%ind_mass_ham(JMASS)) WDEPOUT_IC_2D(KIDIA:KFDIA,JY) = WDEPOUT_IC_2D(KIDIA:KFDIA,JY) + ZWDEP_SCAV_IC(KIDIA:KFDIA, ind_oifs_ham%ind_mass_ham(JMASS)) WDEPOUT_BC_2D(KIDIA:KFDIA,JY) = WDEPOUT_BC_2D(KIDIA:KFDIA,JY) + ZWDEP_SCAV_BC(KIDIA:KFDIA, ind_oifs_ham%ind_mass_ham(JMASS)) END DO DO JCLASS=1,NCLASS JY=KAERO(ind_oifs_ham%ind_class_OIFS(JCLASS)) - WDEPOUT_2D (KIDIA:KFDIA,JY) = WDEPOUT_2D (KIDIA:KFDIA,JY) + ZDUMMY (KIDIA:KFDIA, ind_oifs_ham%ind_class_ham(JCLASS)) + WDEPOUT_2DS (KIDIA:KFDIA,JY) = WDEPOUT_2DS (KIDIA:KFDIA,JY) + ZDUMMY (KIDIA:KFDIA, ind_oifs_ham%ind_class_ham(JCLASS)) WDEPOUT_IC_2D(KIDIA:KFDIA,JY) = WDEPOUT_IC_2D(KIDIA:KFDIA,JY) + ZWDEP_SCAV_IC(KIDIA:KFDIA, ind_oifs_ham%ind_class_ham(JCLASS)) WDEPOUT_BC_2D(KIDIA:KFDIA,JY) = WDEPOUT_BC_2D(KIDIA:KFDIA,JY) + ZWDEP_SCAV_BC(KIDIA:KFDIA, ind_oifs_ham%ind_class_ham(JCLASS)) END DO @@ -1265,6 +1440,10 @@ SUBROUTINE HAMM7_INTERFACE( & PRSF1, PRS1, & ZXTM1, ZXTTE) + !write(*,*)"6 ZXTTE ac",ZXTTE(:,klev,16) + !write(*,*)"6 ZXTTE ac",ZXTTE(:,klev,24) + !write(*,*)"6 ZXTTE cs",ZXTTE(:,klev,17) + !write(*,*)"6 ZXTTE cs",ZXTTE(:,klev,25) !----------------------------------------------------------------- !--> Sedimentation for HAM-M7 CALL GSTATS(2504,0) @@ -1272,12 +1451,16 @@ SUBROUTINE HAMM7_INTERFACE( & IF (LAERSEDIM) THEN IF ( lsedimentation .AND. ANY(trlist%ti(:)%nsedi > 0) ) THEN - ZTENCIH(KIDIA:KFDIA,1:KLEV,1:ntrac)=ZXTTE(KIDIA:KFDIA,1:KLEV,1:ntrac) + !ZTENCIH(KIDIA:KFDIA,1:KLEV,1:ntrac)=ZXTTE(KIDIA:KFDIA,1:KLEV,1:ntrac) + ZTENCTMP(KIDIA:KFDIA,1:KLEV,1:NTRAC) = ZTENCIH(KIDIA:KFDIA,1:KLEV,1:NTRAC) CALL SEDI_INTERFACE(KLON, KFDIA, KLEV, ZKROW, & PTP, ZQP, PRSF1, PRS1, & ! temperature, specific humidity, pressure at full level, pressure at half level ZM6RP, ZRHOP, & ! mean mode actual radius [m], mean mode particle density [kg m-3] - ZXTM1, ZXTTE, ZSEDIFLUX, ZSEDIFLUXSURF) ! tracer mixing ratios and tendency (sediflux for diagnostics) + !ZXTM1, ZXTTE, ZSEDIFLUX, ZSEDIFLUXSURF) ! tracer mixing ratios and tendency (sediflux for diagnostics) + ZXTM1, ZTENCTMP, ZSEDIFLUX, ZSEDIFLUXSURF) ! tracer mixing ratios and tendency (sediflux for diagnostics) + + ZXTTE(KIDIA:KFDIA,1:KLEV,1:NTRAC) = ZXTTE(KIDIA:KFDIA,1:KLEV,1:NTRAC)+ZTENCTMP(KIDIA:KFDIA,1:KLEV,1:NTRAC)-ZTENCIH(KIDIA:KFDIA,1:KLEV,1:NTRAC) SEDOUT(KIDIA:KFDIA, 1:KLEV,:)=(ZTENCIH(KIDIA:KFDIA, 1:KLEV,:)-ZXTTE(KIDIA:KFDIA, 1:KLEV,:)) DO JK=1,KLEV @@ -1357,7 +1540,7 @@ SUBROUTINE HAMM7_INTERFACE( & END DO !--> init values - ZTENCIH(KIDIA:KFDIA,1:KLEV,:) = ZXTTE(KIDIA:KFDIA,1:KLEV,:) ! init tendency before drydep + !ZTENCIH(KIDIA:KFDIA,1:KLEV,:) = ZXTTE(KIDIA:KFDIA,1:KLEV,:) ! init tendency before drydep ZXTEMS(KIDIA:KFDIA,:) = 0._JPRB ! surface emissions as zero for input ZXTMD1(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB ZXTMD1(KIDIA:KFDIA,1:KLEV,:) = ZXTM1(KIDIA:KFDIA,1:KLEV,:) + (ZTENCIH(KIDIA:KFDIA,1:KLEV,:) * TIME_STEP_LEN) ! update mixrat with tendency @@ -1388,7 +1571,8 @@ SUBROUTINE HAMM7_INTERFACE( & ZDDEPFLUX(KIDIA:KFDIA,2)=ZDDEPFLUX_SO2(KIDIA:KFDIA) END IF - !--> modify tendency at surface according to changes in surface emissions + !--> modify tendency at surface according to changes in surface emissions + !write(*,*)"ZXTEMS 4", ZXTEMS(:,24) DO JT = 1,NTRAC DO JL = KIDIA,KFDIA ZXTTE(JL,KLEV,JT) = ZTENCIH(JL,KLEV,JT) + ((ZXTEMS(JL,JT)*RG)/(ZDP(JL,KLEV))) @@ -1605,7 +1789,7 @@ SUBROUTINE HAMM7_INTERFACE( & DO JK = 1, KLEV DO JL = KIDIA,KFDIA DO IW=1,NASWBAND - PAER_TAU(JL,JK,IW)=ZAER_TAU(JL,JK,IW,1)*(PGEOH(JL,JK-1) - PGEOH(JL,JK)) + PAER_TAU(JL,JK,IW)=ZAER_TAU(JL,JK,IW,1)*(PGEOH(JL,JK-1) - PGEOH(JL,JK))/RG PAER_SSA(JL,JK,IW)=ZAER_SSA(JL,JK,IW) PAER_ASYM(JL,JK,IW)=ZAER_ASYM(JL,JK,IW) !PAOD(JL,IW)=ZAER_TAU(JL,JK,IW,1)*(PGEOH(JL,JK-1) - PGEOH(JL,JK))+PAOD(JL,IW) @@ -1778,6 +1962,14 @@ SUBROUTINE HAMM7_INTERFACE( & DO JN=1,NCLASS PGFL(KIDIA:KFDIA,ind_oifs_ham%ind_class_OIFS(JN),YAEROUT(2)%MP)=ZDDEPFLUX(KIDIA:KFDIA,ind_oifs_ham%IND_class_HAM(JN)) END DO + + DO JN=1,NAEROCOMP !ntrac!NACTAERO + PGFL(KIDIA:KFDIA,ind_oifs_ham%ind_mass_OIFS(JN),YAEROUT(4)%MP) = ZSEDIFLUXSURF(KIDIA:KFDIA,ind_oifs_ham%IND_mass_HAM(JN)) + END DO + DO JN=1,NCLASS + PGFL(KIDIA:KFDIA,ind_oifs_ham%ind_class_OIFS(JN),YAEROUT(4)%MP) = ZSEDIFLUXSURF(KIDIA:KFDIA,ind_oifs_ham%IND_class_HAM(JN)) + END DO + !do JN=1,NACTAERO !ktrac ! if (NSTEP==10)then ! do JL=KIDIA,KFDIA @@ -1787,60 +1979,164 @@ SUBROUTINE HAMM7_INTERFACE( & !end do DO JN=1,NACTAERO !ktrac - PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(3)%MP) = WDEPOUT_2D (KIDIA:KFDIA,KAERO(JN)) - PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(6)%MP) = WDEPOUT_IC_2D(KIDIA:KFDIA,KAERO(JN)) - PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(18)%MP) = WDEPOUT_BC_2D(KIDIA:KFDIA,KAERO(JN)) - PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(4)%MP) = ZSEDIFLUXSURF(KIDIA:KFDIA,KAERO(JN)) - PGFL(KIDIA:KFDIA,JN,YAEROUT(5)%MP)=PAERSRC(KIDIA:KFDIA,KAERO(JN)) + PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(3)%MP) = WDEPOUT_2DC(KIDIA:KFDIA,KAERO(JN)) + PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(6)%MP) = WDEPOUT_2DS(KIDIA:KFDIA,KAERO(JN)) + PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(17)%MP) = WDEPOUT_IC_2D(KIDIA:KFDIA,KAERO(JN)) + PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(18)%MP) = WDEPOUT_BC_2D(KIDIA:KFDIA,KAERO(JN)) + !PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(4)%MP) = ZSEDIFLUXSURF(KIDIA:KFDIA,KAERO(JN)) + PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(5)%MP) = PAERSRC(KIDIA:KFDIA,KAERO(JN)) END DO - PGFL(KIDIA:KFDIA,1,YAEROUT(6)%MP)=PAERFLX(KIDIA:KFDIA,3,9) - PGFL(KIDIA:KFDIA,:,YAEROUT(7)%MP)=0.0_JPRB - ! 1=TOtal SO4 not in use - ! 2 Ammonium not in use - ! 3 Nitrate not in use - DO JK=1,KLEV + DO JN=1,NACTAERO !ktrac + ZTMP=0.0 + DO JK=1,KLEV + ZTMP(KIDIA:KFDIA)=ZTMP(KIDIA:KFDIA)+PCEN(KIDIA:KFDIA,JK,KAERO(JN)) + END DO + PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(9)%MP) = ZTMP(KIDIA:KFDIA) + END DO + + + DO JN=1,NACTAERO !ktrac + ZTMP=0.0 + DO JK=1,KLEV + ZTMP(KIDIA:KFDIA)=ZTMP(KIDIA:KFDIA)+ZCEN(KIDIA:KFDIA,JK,KAERO(JN)) + END DO + PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(10)%MP) = ZTMP(KIDIA:KFDIA) + END DO + + DO JN=1,NACTAERO !ktrac + ZTMP=0.0 + DO JK=1,KLEV + ZTMP(KIDIA:KFDIA)=ZTMP(KIDIA:KFDIA)+PTENC(KIDIA:KFDIA,JK,KAERO(JN)) + END DO + PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(11)%MP) = ZTMP(KIDIA:KFDIA) + END DO + + + !pdz(1:kproma,:)=pdpg(1:kproma,:)/prho(1:kproma,:) + + DO JN=1,NAEROCOMP !ntrac!NACTAERO + JO=ind_oifs_ham%ind_mass_OIFS(JN) ! JO -> index context OIFS + JH=ind_oifs_ham%IND_mass_HAM(JN) ! JH -> index context HAM + JY=YAEROUT(7)%MP + ZTMP=0.0 + DO JK=1,KLEV + !PGFL(KIDIA:KFDIA,JO,JY) = PGFL(KIDIA:KFDIA, JO, JY) + (ZXTM1(KIDIA:KFDIA,JK,JH)+(ZXTTE(KIDIA:KFDIA,JK,JH)*TIME_STEP_LEN)) * ZDPG(KIDIA:KFDIA,JK) + ZTMP(KIDIA:KFDIA)= ZTMP(KIDIA:KFDIA) + (ZXTM1(KIDIA:KFDIA,JK,JH)+(ZXTTE(KIDIA:KFDIA,JK,JH)*TIME_STEP_LEN)) * ZDPG(KIDIA:KFDIA,JK) + END DO + PGFL(KIDIA:KFDIA,JO,JY) = ZTMP(KIDIA:KFDIA)!/Htmp(KIDIA:KFDIA) + END DO + + DO JN=1,NCLASS + JO=ind_oifs_ham%ind_class_OIFS(JN) ! JO -> index context OIFS + JH=ind_oifs_ham%IND_class_HAM(JN) ! JH -> index context HAM + JY=YAEROUT(7)%MP + ZTMP=0.0 + DO JK=1,KLEV + !PGFL(KIDIA:KFDIA,JO,JY) = PGFL(KIDIA:KFDIA, JO, JY) + (ZXTM1(KIDIA:KFDIA,JK,JH)+(ZXTTE(KIDIA:KFDIA,JK,JH)*TIME_STEP_LEN)) * ZDPG(KIDIA:KFDIA,JK) + ZTMP(KIDIA:KFDIA) = ZTMP(KIDIA:KFDIA) + (ZXTM1(KIDIA:KFDIA,JK,JH)+(ZXTTE(KIDIA:KFDIA,JK,JH)*TIME_STEP_LEN)) * ZDPG(KIDIA:KFDIA,JK) + END DO + PGFL(KIDIA:KFDIA,JO,JY) = ZTMP(KIDIA:KFDIA)!/Htmp(KIDIA:KFDIA) + END DO + ! save load for each N/M as one level ! kg/kg -> kg/m2 N/kg-> N/m2 DO JN=1,NAEROCOMP !ntrac!NACTAERO JO=ind_oifs_ham%ind_mass_OIFS(JN) ! JO -> index context OIFS JH=ind_oifs_ham%IND_mass_HAM(JN) ! JH -> index context HAM - JY=YAEROUT(7)%MP - PGFL(KIDIA:KFDIA,JO,JY) = PGFL(KIDIA:KFDIA, JO, JY) + (ZXTM1(KIDIA:KFDIA,JK,JH)+(ZXTTE(KIDIA:KFDIA,JK,JH)*TIME_STEP_LEN)) * ZDPG(KIDIA:KFDIA,JK) + JY=YAEROUT(8)%MP + ZTMP=0.0 + DO JK=1,KLEV + !PGFL(KIDIA:KFDIA,JO,JY) = PGFL(KIDIA:KFDIA,JO,JY)+ZXTTE(KIDIA:KFDIA,JK,JH) + ZTMP(KIDIA:KFDIA) = ZTMP(KIDIA:KFDIA) + ZXTTE(KIDIA:KFDIA,JK,JH) + END DO + PGFL(KIDIA:KFDIA,JO,JY) = ZTMP(KIDIA:KFDIA) END DO + DO JN=1,NCLASS + JO=ind_oifs_ham%ind_class_OIFS(JN) ! JO -> index context OIFS + JH=ind_oifs_ham%IND_class_HAM(JN) ! JH -> index context HAM + JY=YAEROUT(8)%MP + ZTMP=0.0 + DO JK=1,KLEV + !PGFL(KIDIA:KFDIA,JO,JY) = PGFL(KIDIA:KFDIA,JO,JY)+ZXTTE(KIDIA:KFDIA,JK,JH) + ZTMP(KIDIA:KFDIA) = ZTMP(KIDIA:KFDIA) + ZXTTE(KIDIA:KFDIA,JK,JH) + END DO + PGFL(KIDIA:KFDIA,JO,JY) = ZTMP(KIDIA:KFDIA) + END DO + + + DO JN=1,NAEROCOMP !ntrac!NACTAERO JO=ind_oifs_ham%ind_mass_OIFS(JN) ! JO -> index context OIFS JH=ind_oifs_ham%IND_mass_HAM(JN) ! JH -> index context HAM - JY=YAEROUT(7)%MP - PGFL(KIDIA:KFDIA,JO,JY) = PGFL(KIDIA:KFDIA, JO, JY) + (ZXTM1(KIDIA:KFDIA,JK,JH)+(ZXTTE(KIDIA:KFDIA,JK,JH)*TIME_STEP_LEN)) * ZDPG(KIDIA:KFDIA,JK) + JY=YAEROUT(12)%MP + ZTMP=0.0 + !DO JK=1,KLEV + !PGFL(KIDIA:KFDIA,JO,JY) = PGFL(KIDIA:KFDIA, JO, JY) + (ZXTM1(KIDIA:KFDIA,JK,JH)+(ZXTTE(KIDIA:KFDIA,JK,JH)*TIME_STEP_LEN)) * ZDPG(KIDIA:KFDIA,JK) + ZTMP(KIDIA:KFDIA)= ZXTM1(KIDIA:KFDIA,KLEV,JH)+(ZXTTE(KIDIA:KFDIA,KLEV,JH)*TIME_STEP_LEN)!*ZDPG(KIDIA:KFDIA,KLEV) + !END DO + PGFL(KIDIA:KFDIA,JO,JY) = ZTMP(KIDIA:KFDIA) END DO - END DO - IF (.NOT. LAERCHEM) THEN ! FIXME : THIS IS PARTLY OVERWRITTEN RIGHT AFTER - PGFL(KIDIA:KFDIA,1,YAEROUT(8)%MP) = ZDDEPFLUX_SO2(KIDIA:KFDIA) ! aergn7 SO4 gas - PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(9)%MP) = PGFL(KIDIA:KFDIA,1:KLEV,YAEROCLIM(1)%MP) - PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(10)%MP) = PGFL(KIDIA:KFDIA,1:KLEV,YAEROCLIM(2)%MP) - PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(11)%MP) = PGFL(KIDIA:KFDIA,1:KLEV,YAEROCLIM(3)%MP) - END IF - PGFL(KIDIA:KFDIA,1,YAEROUT(9)%MP) = PCCNL(KIDIA:KFDIA) - PGFL(KIDIA:KFDIA,2,YAEROUT(9)%MP) = PCCNO(KIDIA:KFDIA) - PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(10)%MP) = PFPLSL(KIDIA:KFDIA,1:KLEV) - PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(11)%MP) = PFPLSN(KIDIA:KFDIA,1:KLEV) - - PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(12)%MP) = PGFL(KIDIA:KFDIA,1:KLEV,YRE_LIQ%MP9_PH) - PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(13)%MP) = PGFL(KIDIA:KFDIA,1:KLEV,YRE_ICE%MP9_PH) - PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(14)%MP) = PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH) - PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(15)%MP) = PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH) - PGFL(KIDIA:KFDIA,KLEV,YAEROUT(16)%MP) = ZDUMMY(KIDIA:KFDIA,17) ! SS CS wdepflux - PGFL(KIDIA:KFDIA,KLEV-1,YAEROUT(16)%MP) = ZDUMMY(KIDIA:KFDIA,7) ! SO4 CS wdepflux - PGFL(KIDIA:KFDIA,KLEV-2,YAEROUT(16)%MP) = ZDUMMY(KIDIA:KFDIA,25) ! NUM CS wdepflux - - PGFL(KIDIA:KFDIA,KLEV,YAEROUT(17)%MP) = ZDDEPFLUX(KIDIA:KFDIA,25) ! drydep flux NUM CS ham - PGFL(KIDIA:KFDIA,KLEV-1,YAEROUT(17)%MP) = ZDDEPFLUX(KIDIA:KFDIA,17) ! drydep flux SS CS ham - PGFL(KIDIA:KFDIA,KLEV-2,YAEROUT(17)%MP) = ZDDEPFLUX(KIDIA:KFDIA,7) ! drydep flux SO4 CS ham - PGFL(KIDIA:KFDIA,KLEV,YAEROUT(18)%MP) = ZVDEP(KIDIA:KFDIA,25) ! ddepveloc NUM CS ham - PGFL(KIDIA:KFDIA,KLEV-1,YAEROUT(18)%MP) = ZVDEP(KIDIA:KFDIA,17) ! ddepveloc SS CS ham - PGFL(KIDIA:KFDIA,KLEV-2,YAEROUT(18)%MP) = ZVDEP(KIDIA:KFDIA,7) ! ddepveloc SO4 CS ham + DO JN=1,NCLASS + JO=ind_oifs_ham%ind_class_OIFS(JN) ! JO -> index context OIFS + JH=ind_oifs_ham%IND_class_HAM(JN) ! JH -> index context HAM + JY=YAEROUT(12)%MP + ZTMP=0.0 + !DO JK=1,KLEV + !PGFL(KIDIA:KFDIA,JO,JY) = PGFL(KIDIA:KFDIA, JO, JY) + (ZXTM1(KIDIA:KFDIA,JK,JH)+(ZXTTE(KIDIA:KFDIA,JK,JH)*TIME_STEP_LEN)) * ZDPG(KIDIA:KFDIA,JK) + ZTMP(KIDIA:KFDIA) = ZXTM1(KIDIA:KFDIA,KLEV,JH)+(ZXTTE(KIDIA:KFDIA,KLEV,JH)*TIME_STEP_LEN)!*PRHO(KIDIA:KFDIA,KLEV) + !END DO + PGFL(KIDIA:KFDIA,JO,JY) = ZTMP(KIDIA:KFDIA) + END DO + + !PGFL(KIDIA:KFDIA,1,YAEROUT(6)%MP)=PAERFLX(KIDIA:KFDIA,3,9) + !PGFL(KIDIA:KFDIA,:,YAEROUT(7)%MP)=0.0_JPRB + ! 1=TOtal SO4 not in use + ! 2 Ammonium not in use + ! 3 Nitrate not in use + !DO JK=1,KLEV + ! ! save load for each N/M as one level + ! ! kg/kg -> kg/m2 N/kg-> N/m2 + ! DO JN=1,NAEROCOMP !ntrac!NACTAERO + ! JO=ind_oifs_ham%ind_mass_OIFS(JN) ! JO -> index context OIFS + ! JH=ind_oifs_ham%IND_mass_HAM(JN) ! JH -> index context HAM + ! JY=YAEROUT(7)%MP + ! PGFL(KIDIA:KFDIA,JO,JY) = PGFL(KIDIA:KFDIA, JO, JY) + (ZXTM1(KIDIA:KFDIA,JK,JH)+(ZXTTE(KIDIA:KFDIA,JK,JH)*TIME_STEP_LEN)) * ZDPG(KIDIA:KFDIA,JK) + ! END DO + ! DO JN=1,NCLASS + ! JO=ind_oifs_ham%ind_mass_OIFS(JN) ! JO -> index context OIFS + ! JH=ind_oifs_ham%IND_mass_HAM(JN) ! JH -> index context HAM + ! JY=YAEROUT(7)%MP + ! PGFL(KIDIA:KFDIA,JO,JY) = PGFL(KIDIA:KFDIA, JO, JY) + (ZXTM1(KIDIA:KFDIA,JK,JH)+(ZXTTE(KIDIA:KFDIA,JK,JH)*TIME_STEP_LEN)) * ZDPG(KIDIA:KFDIA,JK) + ! END DO + !END DO + + !IF (.NOT. LAERCHEM) THEN ! FIXME : THIS IS PARTLY OVERWRITTEN RIGHT AFTER + ! PGFL(KIDIA:KFDIA,1,YAEROUT(8)%MP) = ZDDEPFLUX_SO2(KIDIA:KFDIA) ! aergn7 SO4 gas + ! PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(9)%MP) = PGFL(KIDIA:KFDIA,1:KLEV,YAEROCLIM(1)%MP) + ! PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(10)%MP) = PGFL(KIDIA:KFDIA,1:KLEV,YAEROCLIM(2)%MP) + ! PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(11)%MP) = PGFL(KIDIA:KFDIA,1:KLEV,YAEROCLIM(3)%MP) + !END IF + !PGFL(KIDIA:KFDIA,1,YAEROUT(9)%MP) = PCCNL(KIDIA:KFDIA) + !PGFL(KIDIA:KFDIA,2,YAEROUT(9)%MP) = PCCNO(KIDIA:KFDIA) + !PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(10)%MP) = PFPLSL(KIDIA:KFDIA,1:KLEV) + !PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(11)%MP) = PFPLSN(KIDIA:KFDIA,1:KLEV) + + !PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(12)%MP) = PGFL(KIDIA:KFDIA,1:KLEV,YRE_LIQ%MP9_PH) + !PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(13)%MP) = PGFL(KIDIA:KFDIA,1:KLEV,YRE_ICE%MP9_PH) + !PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(14)%MP) = PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH) + !PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(15)%MP) = PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH) + !PGFL(KIDIA:KFDIA,KLEV,YAEROUT(16)%MP) = ZDUMMY(KIDIA:KFDIA,17) ! SS CS wdepflux + !PGFL(KIDIA:KFDIA,KLEV-1,YAEROUT(16)%MP) = ZDUMMY(KIDIA:KFDIA,7) ! SO4 CS wdepflux + !PGFL(KIDIA:KFDIA,KLEV-2,YAEROUT(16)%MP) = ZDUMMY(KIDIA:KFDIA,25) ! NUM CS wdepflux + + !PGFL(KIDIA:KFDIA,KLEV,YAEROUT(17)%MP) = ZDDEPFLUX(KIDIA:KFDIA,25) ! drydep flux NUM CS ham + !PGFL(KIDIA:KFDIA,KLEV-1,YAEROUT(17)%MP) = ZDDEPFLUX(KIDIA:KFDIA,17) ! drydep flux SS CS ham + !PGFL(KIDIA:KFDIA,KLEV-2,YAEROUT(17)%MP) = ZDDEPFLUX(KIDIA:KFDIA,7) ! drydep flux SO4 CS ham + !PGFL(KIDIA:KFDIA,KLEV,YAEROUT(18)%MP) = ZVDEP(KIDIA:KFDIA,25) ! ddepveloc NUM CS ham + !PGFL(KIDIA:KFDIA,KLEV-1,YAEROUT(18)%MP) = ZVDEP(KIDIA:KFDIA,17) ! ddepveloc SS CS ham + !PGFL(KIDIA:KFDIA,KLEV-2,YAEROUT(18)%MP) = ZVDEP(KIDIA:KFDIA,7) ! ddepveloc SO4 CS ham PGFL(KIDIA:KFDIA,KLEV,YAEROUT(19)%MP) = ZXTTE(KIDIA:KFDIA,KLEV,3) ! tendency SS CS ham after update surface PGFL(KIDIA:KFDIA,KLEV-1,YAEROUT(20)%MP) = ZTENCIH(KIDIA:KFDIA,KLEV,17) ! tendency SS CS ham before update surface PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(21)%MP) = ZXTMD1(KIDIA:KFDIA,1:KLEV,17) ! mix rat SS CS ham before update diff --git a/ifs-source/arpifs/m7/phys_ec/tm5m7_optics_aop_get.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_optics_aop_get.F90 index ef7dbe15..6e0c3957 100644 --- a/ifs-source/arpifs/m7/phys_ec/tm5m7_optics_aop_get.F90 +++ b/ifs-source/arpifs/m7/phys_ec/tm5m7_optics_aop_get.F90 @@ -166,10 +166,10 @@ SUBROUTINE TM5M7_OPTICS_AOP_GET(YGFL, YREAERSRC, KIDIA,KFDIA,KLON, KLEV, NACTAER ! COI aop_in(KIDIA:KFDIA,1:KLEV)%du (7) = 1.E9_JPRB * PAERO(KIDIA:KFDIA,1:KLEV,iducoi ) ! Water in (hydrophillic) modes - aop_in(KIDIA:KFDIA,1:KLEV)%h2o(1) = 1.E9_JPRB * h2o_mode(1)%d2(KIDIA:KFDIA,1:KLEV) - aop_in(KIDIA:KFDIA,1:KLEV)%h2o(2) = 1.E9_JPRB * h2o_mode(2)%d2(KIDIA:KFDIA,1:KLEV) - aop_in(KIDIA:KFDIA,1:KLEV)%h2o(3) = 1.E9_JPRB * h2o_mode(3)%d2(KIDIA:KFDIA,1:KLEV) - aop_in(KIDIA:KFDIA,1:KLEV)%h2o(4) = 1.E9_JPRB * h2o_mode(4)%d2(KIDIA:KFDIA,1:KLEV) + aop_in(KIDIA:KFDIA,1:KLEV)%h2o(1) = 1.E9_JPRB * h2o_mode(1)%d2(KIDIA:KFDIA,1:KLEV)/PRHO(KIDIA:KFDIA,1:KLEV) + aop_in(KIDIA:KFDIA,1:KLEV)%h2o(2) = 1.E9_JPRB * h2o_mode(2)%d2(KIDIA:KFDIA,1:KLEV)/PRHO(KIDIA:KFDIA,1:KLEV) + aop_in(KIDIA:KFDIA,1:KLEV)%h2o(3) = 1.E9_JPRB * h2o_mode(3)%d2(KIDIA:KFDIA,1:KLEV)/PRHO(KIDIA:KFDIA,1:KLEV) + aop_in(KIDIA:KFDIA,1:KLEV)%h2o(4) = 1.E9_JPRB * h2o_mode(4)%d2(KIDIA:KFDIA,1:KLEV)/PRHO(KIDIA:KFDIA,1:KLEV) aop_in(KIDIA:KFDIA,1:KLEV)%rg (1) = 1.E6_JPRB * rw_mode (1)%d2(KIDIA:KFDIA,1:KLEV) aop_in(KIDIA:KFDIA,1:KLEV)%rg (2) = 1.E6_JPRB * rw_mode (2)%d2(KIDIA:KFDIA,1:KLEV) @@ -225,9 +225,9 @@ SUBROUTINE TM5M7_OPTICS_AOP_GET(YGFL, YREAERSRC, KIDIA,KFDIA,KLON, KLEV, NACTAER ! Initialization to zero is done in tm5m7_optics_calculate_aop - !Paop_out_ext=0.0_JPRB - !Paop_out_a=0.0_JPRB - !Paop_out_g=0.0_JPRB + Paop_out_ext=0.0_JPRB + Paop_out_a=0.0_JPRB + Paop_out_g=0.0_JPRB if (present(aop_out_add)) then call tm5m7_optics_calculate_aop(KIDIA,KFDIA, KLON,KLEV, nwav,NCONTR, wdep, ecearth_units, & & AOP_IN, & diff --git a/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 index e9f09afc..5149356b 100644 --- a/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 +++ b/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 @@ -144,6 +144,7 @@ SUBROUTINE TM5M7_SRC( & TYPE(MODAL_EMISSIONS), DIMENSION(NMOD), TARGET :: EMIS_NUMBER REAL(KIND=JPRB) :: ZAEROCLIS(KLON,KLEV,2) +REAL(KIND=JPRB) :: ZCFLX(KLON,KTRAC) REAL(KIND=JPRB) :: ZFAERO(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO) REAL(KIND=JPRB) :: ZAEROK(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO) REAL(KIND=JPRB) :: ZTAEROK(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO) @@ -213,6 +214,7 @@ SUBROUTINE TM5M7_SRC( & #include "surf_inq.h" #include "tm5m7_src_ss.intfb.h" +#include "tm5m7_src_ss_lhw.intfb.h" #include "tm5m7_src_dust.intfb.h" !#include "satur.intfb.h" !#include "aer_volce.intfb.h" @@ -248,7 +250,6 @@ SUBROUTINE TM5M7_SRC( & ! All surface fluxes PCFLUX in kg m-2 s-1 !----------------------------------------------------------------------- - !* 0.1 TIME AND DATE OF THE MODEL ! -------------------------- IY0=NCCAA(NINDAT) @@ -349,12 +350,13 @@ SUBROUTINE TM5M7_SRC( & PEMIDIAG(KIDIA:KFDIA, 1:NACTAERO) = 0.0_JPRB ! RCHG: FIXME -> there were are recurrent sematic error ARRAY(:) = 0.0_JPRB is dangerous. -ZOMBF(KIDIA:KFDIA) = 0.0_JPRB +ZOMBF(KIDIA:KFDIA) = 0.0_JPRB ZOMFF(KIDIA:KFDIA) = 0.0_JPRB ZOMGF(KIDIA:KFDIA) = 0.0_JPRB ZBCFF(KIDIA:KFDIA) = 0.0_JPRB ZBCBF(KIDIA:KFDIA) = 0.0_JPRB ZBCGF(KIDIA:KFDIA) = 0.0_JPRB +ZCFLX = 0.0_JPRB !----------------------------------------------------------------------- @@ -400,6 +402,9 @@ SUBROUTINE TM5M7_SRC( & & emis_mass, emis_number ) +!CALL TM5M7_SRC_SS_LHW( KIDIA, KFDIA, KLON, KLEV, & +! & PCI, PCLAKE, PLSM, PSST, ZWNDSS, & +! & emis_mass, emis_number ) !----------------------------------------------------------------------- !* 2.0 DESERT DUST @@ -432,7 +437,7 @@ SUBROUTINE TM5M7_SRC( & !---------------------------------------------------------------------- !* 5.0 Convert emissions into tendencies: loop over tracers in mode ! ------------ -! CALL ADD_TOFLUX() ! -> only used for CY43R3 +! CALL ADD_TOFLUX() ! -> only used for CY43R3 ! ! ! RCHG -> in the case of CY48R1 the emissions non-interactive (all except SS and DUST) @@ -444,36 +449,70 @@ SUBROUTINE TM5M7_SRC( & ! store emissions. Probably we can directly store in PAERSRC array, but ! I keep current implementation. + ! PEMIDIAG(JL,KAERO(JN))=PEMIDIAG(JL,JN)+sum(emit(JL,:)) + ! DO JK=1,KLEV + ! !PCFLX(JL,KAERO(JN))=PCFLX(JL,KAERO(JN))+emit(JL,JK) + ! PTENC(JL,JK,KAERO(JN))=PTENC(JL,JK,KAERO(JN))+emit(JL,JK) * RG /PDELP(JL,JK) + ! ENDDO DO JL=KIDIA,KFDIA - PCFLX(JL,KAERO(iacs_n)) = PCFLX(JL,KAERO(iacs_n)) + emis_number(mode_acs)%d3(JL,KLEV,4) - PCFLX(JL,KAERO(icos_n)) = PCFLX(JL,KAERO(icos_n)) + emis_number(mode_cos)%d3(JL,KLEV,4) - PCFLX(JL,KAERO(issacs)) = PCFLX(JL,KAERO(issacs)) + emis_mass(mode_acs)%d3(JL,KLEV,4) - PCFLX(JL,KAERO(isscos)) = PCFLX(JL,KAERO(isscos)) + emis_mass(mode_cos)%d3(JL,KLEV,4) - - PCFLX(JL,KAERO(iaci_n)) = PCFLX(JL,KAERO(iaci_n)) + emis_number(mode_aci)%d3(JL,KLEV,1) - PCFLX(JL,KAERO(icoi_n)) = PCFLX(JL,KAERO(icoi_n)) + emis_number(mode_coi)%d3(JL,KLEV,1) - PCFLX(JL,KAERO(iduaci)) = PCFLX(JL,KAERO(iduaci)) + emis_mass(mode_aci)%d3(JL,KLEV,1) - PCFLX(JL,KAERO(iducoi)) = PCFLX(JL,KAERO(iducoi)) + emis_mass(mode_coi)%d3(JL,KLEV,1) + PCFLX(JL,KAERO(iacs_n)) = 0.0!PCFLX(JL,KAERO(iacs_n)) !+ emis_number(mode_acs)%d3(JL,KLEV,4)*(-1._JPRB) + PCFLX(JL,KAERO(icos_n)) = 0.0!PCFLX(JL,KAERO(icos_n)) !+ emis_number(mode_cos)%d3(JL,KLEV,4)*(-1._JPRB) + PCFLX(JL,KAERO(issacs)) = 0.0!PCFLX(JL,KAERO(issacs)) !+ emis_mass(mode_acs)%d3(JL,KLEV,4)*(-1._JPRB) + PCFLX(JL,KAERO(isscos)) = 0.0!PCFLX(JL,KAERO(isscos)) !+ emis_mass(mode_cos)%d3(JL,KLEV,4)*(-1._JPRB) + PCFLX(JL,KAERO(iaci_n)) = 0.0!PCFLX(JL,KAERO(iaci_n)) !+ emis_number(mode_aci)%d3(JL,KLEV,1)*(-1._JPRB) + PCFLX(JL,KAERO(icoi_n)) = 0.0!PCFLX(JL,KAERO(icoi_n)) !+ emis_number(mode_coi)%d3(JL,KLEV,1)*(-1._JPRB) + PCFLX(JL,KAERO(iduaci)) = 0.0!PCFLX(JL,KAERO(iduaci)) !+ emis_mass(mode_aci)%d3(JL,KLEV,1)*(-1._JPRB) + PCFLX(JL,KAERO(iducoi)) = 0.0!PCFLX(JL,KAERO(iducoi)) !+ emis_mass(mode_coi)%d3(JL,KLEV,1)*(-1._JPRB) + + ZCFLX(JL,KAERO(iacs_n)) = emis_number(mode_acs)%d3(JL,KLEV,4)*(-1._JPRB) + ZCFLX(JL,KAERO(icos_n)) = emis_number(mode_cos)%d3(JL,KLEV,4)*(-1._JPRB) + ZCFLX(JL,KAERO(issacs)) = emis_mass(mode_acs)%d3(JL,KLEV,4)*(-1._JPRB) + ZCFLX(JL,KAERO(isscos)) = emis_mass(mode_cos)%d3(JL,KLEV,4)*(-1._JPRB) + ZCFLX(JL,KAERO(iaci_n)) = emis_number(mode_aci)%d3(JL,KLEV,1)*(-1._JPRB) + ZCFLX(JL,KAERO(icoi_n)) = emis_number(mode_coi)%d3(JL,KLEV,1)*(-1._JPRB) + ZCFLX(JL,KAERO(iduaci)) = emis_mass(mode_aci)%d3(JL,KLEV,1)*(-1._JPRB) + ZCFLX(JL,KAERO(iducoi)) = emis_mass(mode_coi)%d3(JL,KLEV,1)*(-1._JPRB) PTENC(JL,KLEV, KAERO(iacs_n)) = PTENC(JL,KLEV, KAERO(iacs_n)) + emis_number(mode_acs)%d3(JL,KLEV,4) * RG / PDELP(JL,KLEV) PTENC(JL,KLEV, KAERO(icos_n)) = PTENC(JL,KLEV, KAERO(icos_n)) + emis_number(mode_cos)%d3(JL,KLEV,4) * RG / PDELP(JL,KLEV) PTENC(JL,KLEV, KAERO(issacs)) = PTENC(JL,KLEV, KAERO(issacs)) + emis_mass(mode_acs)%d3(JL,KLEV,4) * RG / PDELP(JL,KLEV) - PTENC(JL,KLEV, KAERO(isscos)) = PTENC(JL,KLEV, KAERO(isscos)) + emis_mass(mode_cos)%d3(JL,KLEV,4) * RG / PDELP(JL,KLEV) - + PTENC(JL,KLEV, KAERO(isscos)) = PTENC(JL,KLEV, KAERO(isscos)) + emis_mass(mode_cos)%d3(JL,KLEV,4) * RG / PDELP(JL,KLEV) + PTENC(JL,KLEV, KAERO(iaci_n)) = PTENC(JL,KLEV, KAERO(iaci_n)) + emis_number(mode_aci)%d3(JL,KLEV,1) * RG / PDELP(JL,KLEV) PTENC(JL,KLEV, KAERO(icoi_n)) = PTENC(JL,KLEV, KAERO(icoi_n)) + emis_number(mode_coi)%d3(JL,KLEV,1) * RG / PDELP(JL,KLEV) PTENC(JL,KLEV, KAERO(iduaci)) = PTENC(JL,KLEV, KAERO(iduaci)) + emis_mass(mode_aci)%d3(JL,KLEV,1) * RG / PDELP(JL,KLEV) PTENC(JL,KLEV, KAERO(iducoi)) = PTENC(JL,KLEV, KAERO(iducoi)) + emis_mass(mode_coi)%d3(JL,KLEV,1) * RG / PDELP(JL,KLEV) ENDDO +!write(*,*)"PDELP",PDELP(:,klev)/RG +!write(*,*)"RG",RG + + !write(*,*)"aerini emission" + !write(*,*)"KAERO(iacs_n)",KAERO(iacs_n) + !write(*,*)"PTENC(JL,KLEV, KAERO(iacs_n))",PTENC(:,KLEV, KAERO(iacs_n)) + !write(*,*)"KAERO(icos_n)",KAERO(icos_n) + !write(*,*)"PTENC(JL,KLEV, KAERO(icos_n))",PTENC(:,KLEV, KAERO(icos_n)) + !write(*,*)"KAERO(issacs)",KAERO(issacs)!!!=8 + !write(*,*)"PTENC(JL,KLEV, KAERO(issacs))",PTENC(:,KLEV, KAERO(issacs)) + !write(*,*)"KAERO(isscos)",KAERO(isscos)!!!=31 + !write(*,*)"PTENC(JL,KLEV, KAERO(isscos))",PTENC(:,KLEV, KAERO(isscos)) + !write(*,*)"KAERO(iaci_n)",KAERO(iaci_n) + !write(*,*)"PTENC(JL,KLEV, KAERO(iaci_n))",PTENC(:,KLEV, KAERO(iaci_n)) + !write(*,*)"KAERO(iaci_n)",KAERO(icoi_n) + !write(*,*)"PTENC(JL,KLEV, KAERO(icoi_n))",PTENC(:,KLEV, KAERO(icoi_n)) + + DO JL=KIDIA,KFDIA + DO IMODE=1,NMOD ! loop in each mode + DO INMODE=0,MODE_NM_SED(IMODE) ! loop in aerosols species per mode + JN = MODE_TRACERS_SED(INMODE,IMODE) ! retrieve indentifier of each specie + !PEMIDIAG(JL,KAERO(JN))=PCFLX(JL,KAERO(JN)) ! assign PCFLX to emissions (we still not added dep. to PCFLX) + PEMIDIAG(JL,KAERO(JN))= PEMIDIAG(JL,KAERO(JN)) + ZCFLX(JL,KAERO(JN))*(-1._JPRB) ! assign PCFLX to emissions (we still not added dep. to PCFLX) + ENDDO + ENDDO + ENDDO -DO IMODE=1,NMOD ! loop in each mode - DO INMODE=0,MODE_NM_SED(IMODE) ! loop in aerosols species per mode - JN = MODE_TRACERS_SED(INMODE,IMODE) ! retrieve indentifier of each specie - PEMIDIAG(JL,KAERO(JN))=PCFLX(JL,KAERO(JN)) ! assign PCFLX to emissions (we still not added dep. to PCFLX) - ENDDO -ENDDO - + !write(*,*)"tm5m7_src PCFLX(KIDIA:KFDIA,16)",maxval(abs(PCFLX(KIDIA:KFDIA,16))) + !write(*,*)"PEMIDIAG(JL,KAERO(JN))",maxval(abs(PEMIDIAG(:,16))) ! RCHG -> This is outside the previous loop so it is important to initialize PEMIDIAG(:,:) = 0. ! at begining of this subroutine. Note that here we are not filling PCFLX @@ -880,6 +919,7 @@ SUBROUTINE BC_SRC_43R3() END SUBROUTINE SUBROUTINE ADD_TOFLUX() + emit(KIDIA:KFDIA,:) = 0.0 DO IMODE=1,NMOD ! loop in each mode DO INMODE=0,MODE_NM_SED(IMODE) ! loop in aerosols species per mode JN = MODE_TRACERS_SED(INMODE,IMODE) ! retrieve indentifier of each specie @@ -894,9 +934,6 @@ SUBROUTINE ADD_TOFLUX() emit(KIDIA:KFDIA,:) = emis_mass(IMODE)%d3(KIDIA:KFDIA,:,inmode) endif ! Change units from kg/m2/sec to kg/kg/sec and update tendency.. - !write(*,*) "JN",JN - !write(*,*) "KAERO(JN)",KAERO(JN) - !write(*,*) "NACTAERO",NACTAERO DO JL=KIDIA,KFDIA ! Should limit to troposphere?! (for now sfc only) !JK=91 @@ -907,16 +944,39 @@ SUBROUTINE ADD_TOFLUX() ! write(2020,*)jk,emit(jl,jk) !end if !write(2929,*)JN,KAERO(JN) - PEMIDIAG(JL,KAERO(JN))=PEMIDIAG(JL,JN)+sum(emit(JL,:)) + !PEMIDIAG(JL,KAERO(JN))=PEMIDIAG(JL,JN)+sum(emit(JL,:)) + PEMIDIAG(JL,KAERO(JN))=PEMIDIAG(JL,KAERO(JN))+sum(emit(JL,:)) DO JK=1,KLEV !PCFLX(JL,KAERO(JN))=PCFLX(JL,KAERO(JN))+emit(JL,JK) - PTENC(JL,JK,KAERO(JN))=PTENC(JL,JK,KAERO(JN))+emit(JL,JK) * RG /PDELP(JL,JK) ENDDO ENDDO + ENDDO ENDDO + +! PTENC(JL,KLEV, KAERO(iacs_n)) = PTENC(JL,KLEV, KAERO(iacs_n)) + emis_number(mode_acs)%d3(JL,KLEV,4) * RG / PDELP(JL,KLEV) +! PTENC(JL,KLEV, KAERO(icos_n)) = PTENC(JL,KLEV, KAERO(icos_n)) + emis_number(mode_cos)%d3(JL,KLEV,4) * RG / PDELP(JL,KLEV) +! PTENC(JL,KLEV, KAERO(issacs)) = PTENC(JL,KLEV, KAERO(issacs)) + emis_mass(mode_acs)%d3(JL,KLEV,4) * RG / PDELP(JL,KLEV) +! PTENC(JL,KLEV, KAERO(isscos)) = PTENC(JL,KLEV, KAERO(isscos)) + emis_mass(mode_cos)%d3(JL,KLEV,4) * RG / PDELP(JL,KLEV) +! PTENC(JL,KLEV, KAERO(iaci_n)) = PTENC(JL,KLEV, KAERO(iaci_n)) + emis_number(mode_aci)%d3(JL,KLEV,1) * RG / PDELP(JL,KLEV) +! PTENC(JL,KLEV, KAERO(icoi_n)) = PTENC(JL,KLEV, KAERO(icoi_n)) + emis_number(mode_coi)%d3(JL,KLEV,1) * RG / PDELP(JL,KLEV) +! PTENC(JL,KLEV, KAERO(iduaci)) = PTENC(JL,KLEV, KAERO(iduaci)) + emis_mass(mode_aci)%d3(JL,KLEV,1) * RG / PDELP(JL,KLEV) +! PTENC(JL,KLEV, KAERO(iducoi)) = PTENC(JL,KLEV, KAERO(iducoi)) + emis_mass(mode_coi)%d3(JL,KLEV,1) * RG / PDELP(JL,KLEV) +! write(*,*) "old" +! write(*,*)"KAERO(iacs_n)",KAERO(iacs_n) +! write(*,*)"PTENC(JL,KLEV, KAERO(iacs_n))",PTENC(:,KLEV, KAERO(iacs_n)) +! write(*,*)"PTENC(JL,KLEV-1, KAERO(iacs_n))",PTENC(:,KLEV-1, KAERO(iacs_n)) +! write(*,*)"KAERO(icos_n)",KAERO(icos_n) +! write(*,*)"PTENC(JL,KLEV, KAERO(icos_n))",PTENC(:,KLEV, KAERO(icos_n)) +! write(*,*)"PTENC(JL,KLEV-1, KAERO(icos_n))",PTENC(:,KLEV-1, KAERO(icos_n)) +! write(*,*)"KAERO(issacs)",KAERO(issacs) +! write(*,*)"PTENC(JL,KLEV, KAERO(issacs))",PTENC(:,KLEV, KAERO(issacs)) +! write(*,*)"KAERO(isscos)",KAERO(isscos) +! write(*,*)"PTENC(JL,KLEV, KAERO(isscos))",PTENC(:,KLEV, KAERO(isscos)) +! write(*,*)"KAERO(iaci_n)",KAERO(iaci_n) +! write(*,*)"PTENC(JL,KLEV, KAERO(iaci_n))",PTENC(:,KLEV, KAERO(iaci_n)) END SUBROUTINE END SUBROUTINE TM5M7_SRC diff --git a/ifs-source/arpifs/phys_ec/compo_apply_emissions.F90 b/ifs-source/arpifs/phys_ec/compo_apply_emissions.F90 index 970cf30c..379d11b1 100644 --- a/ifs-source/arpifs/phys_ec/compo_apply_emissions.F90 +++ b/ifs-source/arpifs/phys_ec/compo_apply_emissions.F90 @@ -301,8 +301,10 @@ SUBROUTINE APPLY_2D_EMISSION( KSPECIES, YDSPECIES, YDEMIS_DESC, LDDIAGFLUX,& ENDIF ! This is the surface / total column flux after scaling and diurnal cycle application + !write(*,*)"ITRAC",ITRAC + !write(*,*)"YDEMIS_DESC%PARAM_INDEX",YDEMIS_DESC%PARAM_INDEX ZFLUX(KIDIA:KFDIA) = - PEMIS2D(KIDIA:KFDIA,YDEMIS_DESC%PARAM_INDEX) * ZDIURN(KIDIA:KFDIA) * YDEMIS_DESC%SCALING - + !write(*,*)"ZFLUX",maxval(ZFLUX) ! HERE we have the ZFLUX and where is there we need to call a new function that digest the input of PSD_* ! and change the ZFLUX of the tracer with number of particles @@ -441,10 +443,19 @@ SUBROUTINE APPLY_2D_EMISSION( KSPECIES, YDSPECIES, YDEMIS_DESC, LDDIAGFLUX,& IF (YDEMIS_DESC%PSD_N0_TRACER /= 'NONE') THEN CALL GET_2D_EMISSION_M7_NUMPAR( JSPECIES, KSPECIES, YDSPECIES, YDEMIS_DESC, ZPROFILE, KINDEX, & & ZFLUX, ZFLUX_NUM, ZSFCFLUX_NUM, ITRAC_NUM) + !write(*,*)"PTENC(KIDIA:KFDIA,JK,ITRAC_NUM)",maxval(abs(PTENC(KIDIA:KFDIA,KLEV,ITRAC_NUM))) DO JK=1,KLEV PTENC(KIDIA:KFDIA,JK,ITRAC_NUM) = PTENC(KIDIA:KFDIA,JK,ITRAC_NUM) - ZPROFILE(KIDIA:KFDIA,JK) * ZFLUX_NUM(KIDIA:KFDIA) ENDDO - PCFLX(KIDIA:KFDIA,ITRAC_NUM) = PCFLX(KIDIA:KFDIA,ITRAC_NUM) + ZSFCFLUX_NUM(KIDIA:KFDIA) + !write(*,*)"ITRAC",ITRAC + !write(*,*)"ITRAC_NUM",ITRAC_NUM + !write(*,*)"ZFLUX",ZFLUX + !write(*,*)"ZFLUX_NUM",ZFLUX_NUM + !write(*,*)"YDSPECIES(JSPECIES)%CNAME",YDSPECIES(JSPECIES)%CNAME + !write(*,*)"PTENC(KIDIA:KFDIA,JK,ITRAC_NUM)",maxval(abs(PTENC(KIDIA:KFDIA,KLEV,ITRAC_NUM))) + PCFLX(KIDIA:KFDIA,ITRAC_NUM) = PCFLX(KIDIA:KFDIA,ITRAC_NUM) + ZFLUX_NUM(KIDIA:KFDIA) + !write(*,*)"PCFLX(KIDIA:KFDIA,ITRAC_NUM)",maxval(abs(PCFLX(KIDIA:KFDIA,ITRAC_NUM))) + !write(*,*)"PCFLX(KIDIA:KFDIA,16)",maxval(abs(PCFLX(KIDIA:KFDIA,16))) ENDIF KFOUND = KFOUND + 1 @@ -621,8 +632,10 @@ SUBROUTINE GET_2D_EMISSION_M7_NUMPAR( JSPECIES, KSPECIES, YDSPECIES, YDEMIS_DESC ! words: DENSITY(1:NACTAERO) with DENSITY = DENSITY(KAERO(ITRAC_NUM)) ! !----------------------------------------------------------------------------------------------- - NUM_SCALE = EXP(1.5*(LOG(YDEMIS_DESC%PSD_SIGMA))**2) - MASS_TO_NUM_PSD = 3./(4.*RPI*(NUM_SCALE**3)*YDEMIS_DESC%MASS_DENSITY) ! RPI -> real pi inherited from main sub. + !NUM_SCALE = EXP(1.5*(LOG(YDEMIS_DESC%PSD_SIGMA))**2) + !MASS_TO_NUM_PSD = 3./(4.*RPI*(NUM_SCALE**3)*YDEMIS_DESC%MASS_DENSITY) ! RPI -> real pi inherited from main sub. + NUM_SCALE = EXP(4.5*(LOG(YDEMIS_DESC%PSD_SIGMA))**2) + MASS_TO_NUM_PSD = 3./(4.*RPI*NUM_SCALE*YDEMIS_DESC%MASS_DENSITY) ! RPI -> real pi inherited from main sub. MASS_TO_NUM_EMI = MASS_TO_NUM_PSD/(YDEMIS_DESC%PSD_RADIUS**3) ! FLUX OUTPUTS From 8bbf1597098c380ea9f12e72160df6c70510e55f Mon Sep 17 00:00:00 2001 From: Lianghai Wu Date: Fri, 22 Nov 2024 08:59:25 +0000 Subject: [PATCH 035/129] fix re_evaporation fields --- .../arpifs/m7/phys_ec/hamm7_interface.F90 | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index 144f809a..15665f77 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -1214,24 +1214,24 @@ SUBROUTINE HAMM7_INTERFACE( & ZFLXS=PFPLCN(JL,JK-1) ZFLXRB=PFPLCL(JL,JK) ZFLXSB=PFPLCN(JL,JK) - IF (PCOVPTOT(JL,JK) > 1e-40_JPRB) THEN + !IF (PCOVPTOT(JL,JK) > 1e-40_JPRB) THEN !ZMRATEPR(JL,JK) = ( ZFLXRB-ZFLXR ) / PCOVPTOT(JL,JK) !ZMRATEPS(JL,JK) = ( ZFLXSB-ZFLXS ) / PCOVPTOT(JL,JK) !!same formula negatives/positives for evap or formation !ZFEVAPR(JL,JK) = ( ZFLXRB-ZFLXR ) / PCOVPTOT(JL,JK) !ZFSUBLS(JL,JK) = ( ZFLXSB-ZFLXS ) / PCOVPTOT(JL,JK) - ZMRATEPR_cov(JL,JK) = ( ZFLXRB-ZFLXR ) / MAX(PCOVPTOT(JL,JK),1.E-10_JPRB) - ZMRATEPS_cov(JL,JK) = ( ZFLXSB-ZFLXS ) / MAX(PCOVPTOT(JL,JK),1.E-10_JPRB) + ZMRATEPR_cov(JL,JK) = ZFLXRB-ZFLXR! ) / MAX(PCOVPTOT(JL,JK),1.E-10_JPRB) + ZMRATEPS_cov(JL,JK) = ZFLXSB-ZFLXS! ) / MAX(PCOVPTOT(JL,JK),1.E-10_JPRB) !same formula negatives/positives for evap or formation - ZFEVAPR_cov(JL,JK) = 0.0!( ZFLXRB-ZFLXR ) / MAX(PCOVPTOT(JL,JK),1.E-10_JPRB) - ZFSUBLS_cov(JL,JK) = 0.0!( ZFLXSB-ZFLXS ) / MAX(PCOVPTOT(JL,JK),1.E-10_JPRB) - ELSE - ZMRATEPR_cov(JL,JK) = 0.0_JPRB - ZMRATEPS_cov(JL,JK) = 0.0_JPRB - !same formula negatives/positives for evap or formation - ZFEVAPR_cov(JL,JK) = 0.0_JPRB - ZFSUBLS_cov(JL,JK) = 0.0_JPRB - END IF + ZFEVAPR_cov(JL,JK) = ZFLXRB-ZFLXR !) / MAX(PCOVPTOT(JL,JK),1.E-10_JPRB) + ZFSUBLS_cov(JL,JK) = ZFLXSB-ZFLXS !) / MAX(PCOVPTOT(JL,JK),1.E-10_JPRB) + ! ELSE + ! ZMRATEPR_cov(JL,JK) = 0.0_JPRB + ! ZMRATEPS_cov(JL,JK) = 0.0_JPRB + ! !same formula negatives/positives for evap or formation + ! ZFEVAPR_cov(JL,JK) = 0.0_JPRB + ! ZFSUBLS_cov(JL,JK) = 0.0_JPRB + ! END IF END DO @@ -1243,24 +1243,24 @@ SUBROUTINE HAMM7_INTERFACE( & ZFLXS=PFPLSN(JL,JK-1) ZFLXRB=PFPLSL(JL,JK) ZFLXSB=PFPLSN(JL,JK) - IF (PCOVPTOT(JL,JK) > 1e-40_JPRB) THEN + !IF (PCOVPTOT(JL,JK) > 1e-40_JPRB) THEN !ZMRATEPR(JL,JK) = ( ZFLXRB-ZFLXR ) / PCOVPTOT(JL,JK) !ZMRATEPS(JL,JK) = ( ZFLXSB-ZFLXS ) / PCOVPTOT(JL,JK) !!same formula negatives/positives for evap or formation !ZFEVAPR(JL,JK) = ( ZFLXRB-ZFLXR ) / PCOVPTOT(JL,JK) !ZFSUBLS(JL,JK) = ( ZFLXSB-ZFLXS ) / PCOVPTOT(JL,JK) - ZMRATEPR_str(JL,JK) = ( ZFLXRB-ZFLXR ) / MAX(PCOVPTOT(JL,JK),1.E-10_JPRB) - ZMRATEPS_str(JL,JK) = ( ZFLXSB-ZFLXS ) / MAX(PCOVPTOT(JL,JK),1.E-10_JPRB) - !same formula negatives/positives for evap or formation - ZFEVAPR_str(JL,JK) = 0.0!( ZFLXRB-ZFLXR ) / MAX(PCOVPTOT(JL,JK),1.E-10_JPRB) - ZFSUBLS_str(JL,JK) = 0.0!( ZFLXSB-ZFLXS ) / MAX(PCOVPTOT(JL,JK),1.E-10_JPRB) - ELSE - ZMRATEPR_str(JL,JK) = 0.0_JPRB - ZMRATEPS_str(JL,JK) = 0.0_JPRB + ZMRATEPR_str(JL,JK) = ZFLXRB-ZFLXR !) / MAX(PCOVPTOT(JL,JK),1.E-10_JPRB) + ZMRATEPS_str(JL,JK) = ZFLXSB-ZFLXS !) / MAX(PCOVPTOT(JL,JK),1.E-10_JPRB) !same formula negatives/positives for evap or formation - ZFEVAPR_str(JL,JK) = 0.0_JPRB - ZFSUBLS_str(JL,JK) = 0.0_JPRB - END IF + ZFEVAPR_str(JL,JK) = ZFLXRB-ZFLXR !) / MAX(PCOVPTOT(JL,JK),1.E-10_JPRB) + ZFSUBLS_str(JL,JK) = ZFLXSB-ZFLXS !) / MAX(PCOVPTOT(JL,JK),1.E-10_JPRB) + !ELSE + ! ZMRATEPR_str(JL,JK) = 0.0_JPRB + ! ZMRATEPS_str(JL,JK) = 0.0_JPRB + ! !same formula negatives/positives for evap or formation + ! ZFEVAPR_str(JL,JK) = 0.0_JPRB + ! ZFSUBLS_str(JL,JK) = 0.0_JPRB + !END IF END DO From eb5d101d570cfc12c7283095fe23e4df973b79c0 Mon Sep 17 00:00:00 2001 From: Lianghai Wu Date: Fri, 22 Nov 2024 18:44:23 +0000 Subject: [PATCH 036/129] revert tendency updates --- ifs-source/arpifs/m7/module/mo_ham_wetdep.F90 | 1 - .../arpifs/m7/phys_ec/hamm7_interface.F90 | 41 +++++++------------ 2 files changed, 15 insertions(+), 27 deletions(-) diff --git a/ifs-source/arpifs/m7/module/mo_ham_wetdep.F90 b/ifs-source/arpifs/m7/module/mo_ham_wetdep.F90 index 7782fa50..e579e33a 100755 --- a/ifs-source/arpifs/m7/module/mo_ham_wetdep.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_wetdep.F90 @@ -232,7 +232,6 @@ SUBROUTINE ham_wetdep(kproma, kbdim, klev, krow, ktop, kt, !--- 0/ Initializations: !CALL prep_ham_mode_init(kproma, kbdim, klev) - write(*,*)"kt",kt ztmst = time_step_len imod = trlist%ti(kt)%mode diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index 15665f77..ee55d596 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -448,8 +448,8 @@ SUBROUTINE HAMM7_INTERFACE( & REAL(KIND=JPRB) :: SEDOUT_2D(KLON,KTRAC) REAL(KIND=JPRB) :: DDEPOUT_2D(KLON,KTRAC) -REAL(KIND=JPRB) :: WDEPOUT_2DC(KLON,KTRAC) -REAL(KIND=JPRB) :: WDEPOUT_2DS(KLON,KTRAC) +REAL(KIND=JPRB) :: WDEPOUT_2D(KLON,KTRAC) +!REAL(KIND=JPRB) :: WDEPOUT_2DS(KLON,KTRAC) REAL(KIND=JPRB) :: WDEPOUT_IC_2D(KLON,KTRAC) REAL(KIND=JPRB) :: WDEPOUT_BC_2D(KLON,KTRAC) @@ -621,8 +621,7 @@ SUBROUTINE HAMM7_INTERFACE( & ZVDA(KIDIA:KFDIA,:) = 0._JPRB ! unused 2024-07-11 SEDOUT_2D(KIDIA:KFDIA,:) = 0._JPRB DDEPOUT_2D(KIDIA:KFDIA,:) = 0._JPRB ! unused 2024-07-11 -WDEPOUT_2DC(KIDIA:KFDIA,:) = 0._JPRB -WDEPOUT_2DS(KIDIA:KFDIA,:) = 0._JPRB +WDEPOUT_2D(KIDIA:KFDIA,:) = 0._JPRB WDEPOUT_IC_2D(KIDIA:KFDIA,:) = 0._JPRB WDEPOUT_BC_2D(KIDIA:KFDIA,:) = 0._JPRB @@ -938,7 +937,6 @@ SUBROUTINE HAMM7_INTERFACE( & ENDDO ENDDO - ZTENCIH(KIDIA:KFDIA,1:KLEV,1:NTRAC)=ZXTTE(KIDIA:KFDIA,1:KLEV,1:NTRAC) ! --> calling the correct microphysics scheme SELECT CASE (TRIM(AERO_SCHEME)) @@ -1319,7 +1317,6 @@ SUBROUTINE HAMM7_INTERFACE( & !write(*,*)"PCOVPTOT",PCOVPTOT(:,KLEV) !write(*,*)"ZAP",ZAP(:,KLEV) !write(*,*)"PMFU",PMFU(:,KLEV) - ZTENCTMP(KIDIA:KFDIA,1:KLEV,1:NTRAC) = ZTENCIH(KIDIA:KFDIA,1:KLEV,1:NTRAC) CALL WETDEP_INTERFACE(KFDIA, KLON, KLEV, 1, ZKROW, LSTRAT, & ! ktop = 1 (top level index), lstrat = FALSE for conv. case !ZDPG, ZMRATEPR_cov, ZMRATEPS_cov, ZMSNOWACL, & ! dp/g, evap. of rain, subl. of snow, accr. rate of snow with cl. drop in-cl. ZDPG, PRP, PSP, ZMSNOWACL, & ! dp/g, evap. of rain, subl. of snow, accr. rate of snow with cl. drop in-cl. @@ -1328,13 +1325,11 @@ SUBROUTINE HAMM7_INTERFACE( & REFFI, REFFL, & ! effective radii ZCDNCACT, ZFRACN, & ! number/fraction of activated particles per mode PTP, ZXTM1, ZLFRAC_SO2, & ! temperature, prev. mixing ratio, zlfrac_so2 only needed in gas scavenging (0 for now) - !ZXTTE, ZXTP10, ZXTP1C, & ! tendencies/mixing ratios (in/out) - ZTENCTMP, ZXTP10, ZXTP1C, & ! tendencies/mixing ratios (in/out) + ZXTTE, ZXTP10, ZXTP1C, & ! tendencies/mixing ratios (in/out) PFPLCL, PFPLCN, ZFEVAPR_cov, ZFSUBLS_cov, & ! rain flux, snow flux, PMFU, ZFUXT3D, & ! conv flux, updraft mass flux (updated in wetdep) ZAP, ZDUM2D, ZRHO, ZDUMMY, ZWDEP_SCAV_IC, ZWDEP_SCAV_BC) ! cloud frac., precip. frac., air dens., in/output*3 - ZXTTE(KIDIA:KFDIA,1:KLEV,1:NTRAC) = ZXTTE(KIDIA:KFDIA,1:KLEV,1:NTRAC)+ZTENCTMP(KIDIA:KFDIA,1:KLEV,1:NTRAC)-ZTENCIH(KIDIA:KFDIA,1:KLEV,1:NTRAC) !write(*,*)"2 ZXTTE ac",ZXTTE(:,klev,16) !write(*,*)"2 ZXTTE ac 4",ZXTTE(:,klev,24) !write(*,*)"2 ZXTTE cs",ZXTTE(:,klev,17) @@ -1353,14 +1348,14 @@ SUBROUTINE HAMM7_INTERFACE( & !Add convective case wet removal fluxes to diagnostics DO JMASS=1,NAEROCOMP JY=KAERO(ind_oifs_ham%ind_mass_OIFS(JMASS)) - WDEPOUT_2DC (KIDIA:KFDIA,JY) = WDEPOUT_2DC (KIDIA:KFDIA,JY) + ZDUMMY (KIDIA:KFDIA, ind_oifs_ham%ind_mass_ham(JMASS)) + WDEPOUT_2D (KIDIA:KFDIA,JY) = WDEPOUT_2D (KIDIA:KFDIA,JY) + ZDUMMY (KIDIA:KFDIA, ind_oifs_ham%ind_mass_ham(JMASS)) WDEPOUT_IC_2D(KIDIA:KFDIA,JY) = WDEPOUT_IC_2D(KIDIA:KFDIA,JY) + ZWDEP_SCAV_IC(KIDIA:KFDIA, ind_oifs_ham%ind_mass_ham(JMASS)) WDEPOUT_BC_2D(KIDIA:KFDIA,JY) = WDEPOUT_BC_2D(KIDIA:KFDIA,JY) + ZWDEP_SCAV_BC(KIDIA:KFDIA, ind_oifs_ham%ind_mass_ham(JMASS)) END DO DO JCLASS=1,NCLASS JY=KAERO(ind_oifs_ham%ind_class_OIFS(JCLASS)) - WDEPOUT_2DC (KIDIA:KFDIA,JY) = WDEPOUT_2DC (KIDIA:KFDIA,JY) + ZDUMMY (KIDIA:KFDIA, ind_oifs_ham%ind_class_ham(JCLASS)) + WDEPOUT_2D (KIDIA:KFDIA,JY) = WDEPOUT_2D (KIDIA:KFDIA,JY) + ZDUMMY (KIDIA:KFDIA, ind_oifs_ham%ind_class_ham(JCLASS)) WDEPOUT_IC_2D(KIDIA:KFDIA,JY) = WDEPOUT_IC_2D(KIDIA:KFDIA,JY) + ZWDEP_SCAV_IC(KIDIA:KFDIA, ind_oifs_ham%ind_class_ham(JCLASS)) WDEPOUT_BC_2D(KIDIA:KFDIA,JY) = WDEPOUT_BC_2D(KIDIA:KFDIA,JY) + ZWDEP_SCAV_BC(KIDIA:KFDIA, ind_oifs_ham%ind_class_ham(JCLASS)) END DO @@ -1371,7 +1366,7 @@ SUBROUTINE HAMM7_INTERFACE( & ! set both equal to tracer mixing ratio as starting point ! ham_wet_chemistry will re-compute these values if lham=true DO JT = 1,NTRAC - !ZXTP1(KIDIA:KFDIA,1:KLEV,JT) = ZXTM1(KIDIA:KFDIA,1:KLEV,JT) + ZXTTE(KIDIA:KFDIA,1:KLEV,JT) * TIME_STEP_LEN + ZXTP1(KIDIA:KFDIA,1:KLEV,JT) = ZXTM1(KIDIA:KFDIA,1:KLEV,JT) + ZXTTE(KIDIA:KFDIA,1:KLEV,JT) * TIME_STEP_LEN ZXTP1C(KIDIA:KFDIA,1:KLEV,JT) = ZXTP1(KIDIA:KFDIA,1:KLEV,JT) ZXTP10(KIDIA:KFDIA,1:KLEV,JT) = ZXTP1(KIDIA:KFDIA,1:KLEV,JT) END DO @@ -1389,7 +1384,6 @@ SUBROUTINE HAMM7_INTERFACE( & !write(*,*)"4 ZXTTE cs",ZXTTE(:,klev,17) !write(*,*)"4 ZXTTE cs",ZXTTE(:,klev,25) !write(*,*)"PCOVPTOT",PCOVPTOT(:,klev) - ZTENCTMP(KIDIA:KFDIA,1:KLEV,1:NTRAC) = ZTENCIH(KIDIA:KFDIA,1:KLEV,1:NTRAC) CALL WETDEP_INTERFACE(KFDIA, KLON, KLEV, 1, ZKROW, LSTRAT, & ! ktop = 1 (top level index), lstrat = TRUE for strat. case !ZDPG, ZMRATEPR_str, ZMRATEPS_str, ZMSNOWACL, & ! dp/g, evap. of rain, subl. of snow, accr. rate of snow with cl. drop in-cl. ZDPG, PRP, PSP, ZMSNOWACL, & ! dp/g, evap. of rain, subl. of snow, accr. rate of snow with cl. drop in-cl. @@ -1398,13 +1392,11 @@ SUBROUTINE HAMM7_INTERFACE( & REFFI, REFFL, & ! effective radii ZCDNCACT, ZFRACN, & ! number/fraction of activated particles per mode PTP, ZXTM1, ZLFRAC_SO2, & ! temperature, prev. mixing ratio, zlfrac_so2 only needed in gas scavenging (0 for now) - !ZXTTE, ZXTP10, ZXTP1C, & ! tendencies/mixing ratios (in/out) - ZTENCTMP, ZXTP10, ZXTP1C, & ! tendencies/mixing ratios (in/out) + ZXTTE, ZXTP10, ZXTP1C, & ! tendencies/mixing ratios (in/out) PFPLSL, PFPLSN, ZFEVAPR_str, ZFSUBLS_str, & ! rain flux, snow flux, ZDUM2D, ZDUM3D, & ! zeroes as these are not needed in strat. case ZAP, PCOVPTOT, ZRHO, ZDUMMY, ZWDEP_SCAV_IC, ZWDEP_SCAV_BC) ! cloud frac., precip. frac., air dens., in/output*3 - ZXTTE(KIDIA:KFDIA,1:KLEV,1:NTRAC) = ZXTTE(KIDIA:KFDIA,1:KLEV,1:NTRAC)+ZTENCTMP(KIDIA:KFDIA,1:KLEV,1:NTRAC)-ZTENCIH(KIDIA:KFDIA,1:KLEV,1:NTRAC) !write(*,*)"5 ZXTTE ac",ZXTTE(:,klev,16) !write(*,*)"5 ZXTTE ac 4",ZXTTE(:,klev,24) !write(*,*)"5 ZXTTE cs",ZXTTE(:,klev,17) @@ -1416,14 +1408,14 @@ SUBROUTINE HAMM7_INTERFACE( & ! Add stratiform case wet removal fluxes to diagnostics DO JMASS=1,NAEROCOMP JY=KAERO(ind_oifs_ham%ind_mass_OIFS(JMASS)) - WDEPOUT_2DS (KIDIA:KFDIA,JY) = WDEPOUT_2DS (KIDIA:KFDIA,JY) + ZDUMMY (KIDIA:KFDIA, ind_oifs_ham%ind_mass_ham(JMASS)) + WDEPOUT_2D (KIDIA:KFDIA,JY) = WDEPOUT_2D (KIDIA:KFDIA,JY) + ZDUMMY (KIDIA:KFDIA, ind_oifs_ham%ind_mass_ham(JMASS)) WDEPOUT_IC_2D(KIDIA:KFDIA,JY) = WDEPOUT_IC_2D(KIDIA:KFDIA,JY) + ZWDEP_SCAV_IC(KIDIA:KFDIA, ind_oifs_ham%ind_mass_ham(JMASS)) WDEPOUT_BC_2D(KIDIA:KFDIA,JY) = WDEPOUT_BC_2D(KIDIA:KFDIA,JY) + ZWDEP_SCAV_BC(KIDIA:KFDIA, ind_oifs_ham%ind_mass_ham(JMASS)) END DO DO JCLASS=1,NCLASS JY=KAERO(ind_oifs_ham%ind_class_OIFS(JCLASS)) - WDEPOUT_2DS (KIDIA:KFDIA,JY) = WDEPOUT_2DS (KIDIA:KFDIA,JY) + ZDUMMY (KIDIA:KFDIA, ind_oifs_ham%ind_class_ham(JCLASS)) + WDEPOUT_2D (KIDIA:KFDIA,JY) = WDEPOUT_2D (KIDIA:KFDIA,JY) + ZDUMMY (KIDIA:KFDIA, ind_oifs_ham%ind_class_ham(JCLASS)) WDEPOUT_IC_2D(KIDIA:KFDIA,JY) = WDEPOUT_IC_2D(KIDIA:KFDIA,JY) + ZWDEP_SCAV_IC(KIDIA:KFDIA, ind_oifs_ham%ind_class_ham(JCLASS)) WDEPOUT_BC_2D(KIDIA:KFDIA,JY) = WDEPOUT_BC_2D(KIDIA:KFDIA,JY) + ZWDEP_SCAV_BC(KIDIA:KFDIA, ind_oifs_ham%ind_class_ham(JCLASS)) END DO @@ -1451,16 +1443,13 @@ SUBROUTINE HAMM7_INTERFACE( & IF (LAERSEDIM) THEN IF ( lsedimentation .AND. ANY(trlist%ti(:)%nsedi > 0) ) THEN - !ZTENCIH(KIDIA:KFDIA,1:KLEV,1:ntrac)=ZXTTE(KIDIA:KFDIA,1:KLEV,1:ntrac) - ZTENCTMP(KIDIA:KFDIA,1:KLEV,1:NTRAC) = ZTENCIH(KIDIA:KFDIA,1:KLEV,1:NTRAC) + ZTENCIH(KIDIA:KFDIA,1:KLEV,1:ntrac)=ZXTTE(KIDIA:KFDIA,1:KLEV,1:ntrac) CALL SEDI_INTERFACE(KLON, KFDIA, KLEV, ZKROW, & PTP, ZQP, PRSF1, PRS1, & ! temperature, specific humidity, pressure at full level, pressure at half level ZM6RP, ZRHOP, & ! mean mode actual radius [m], mean mode particle density [kg m-3] - !ZXTM1, ZXTTE, ZSEDIFLUX, ZSEDIFLUXSURF) ! tracer mixing ratios and tendency (sediflux for diagnostics) - ZXTM1, ZTENCTMP, ZSEDIFLUX, ZSEDIFLUXSURF) ! tracer mixing ratios and tendency (sediflux for diagnostics) + ZXTM1, ZXTTE, ZSEDIFLUX, ZSEDIFLUXSURF) ! tracer mixing ratios and tendency (sediflux for diagnostics) - ZXTTE(KIDIA:KFDIA,1:KLEV,1:NTRAC) = ZXTTE(KIDIA:KFDIA,1:KLEV,1:NTRAC)+ZTENCTMP(KIDIA:KFDIA,1:KLEV,1:NTRAC)-ZTENCIH(KIDIA:KFDIA,1:KLEV,1:NTRAC) SEDOUT(KIDIA:KFDIA, 1:KLEV,:)=(ZTENCIH(KIDIA:KFDIA, 1:KLEV,:)-ZXTTE(KIDIA:KFDIA, 1:KLEV,:)) DO JK=1,KLEV @@ -1540,7 +1529,7 @@ SUBROUTINE HAMM7_INTERFACE( & END DO !--> init values - !ZTENCIH(KIDIA:KFDIA,1:KLEV,:) = ZXTTE(KIDIA:KFDIA,1:KLEV,:) ! init tendency before drydep + ZTENCIH(KIDIA:KFDIA,1:KLEV,:) = ZXTTE(KIDIA:KFDIA,1:KLEV,:) ! init tendency before drydep ZXTEMS(KIDIA:KFDIA,:) = 0._JPRB ! surface emissions as zero for input ZXTMD1(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB ZXTMD1(KIDIA:KFDIA,1:KLEV,:) = ZXTM1(KIDIA:KFDIA,1:KLEV,:) + (ZTENCIH(KIDIA:KFDIA,1:KLEV,:) * TIME_STEP_LEN) ! update mixrat with tendency @@ -1979,8 +1968,8 @@ SUBROUTINE HAMM7_INTERFACE( & !end do DO JN=1,NACTAERO !ktrac - PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(3)%MP) = WDEPOUT_2DC(KIDIA:KFDIA,KAERO(JN)) - PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(6)%MP) = WDEPOUT_2DS(KIDIA:KFDIA,KAERO(JN)) + PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(3)%MP) = WDEPOUT_2D(KIDIA:KFDIA,KAERO(JN)) + !PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(6)%MP) = WDEPOUT_2D(KIDIA:KFDIA,KAERO(JN)) PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(17)%MP) = WDEPOUT_IC_2D(KIDIA:KFDIA,KAERO(JN)) PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(18)%MP) = WDEPOUT_BC_2D(KIDIA:KFDIA,KAERO(JN)) !PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(4)%MP) = ZSEDIFLUXSURF(KIDIA:KFDIA,KAERO(JN)) From 62979d4f24729e7205b2f434e0e085b6ebd14ff5 Mon Sep 17 00:00:00 2001 From: Lianghai Wu Date: Wed, 8 Jan 2025 13:39:40 +0000 Subject: [PATCH 037/129] ignore unavaliable soil_type fieds --- ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 | 11 +++++++++-- ifs-source/arpifs/setup/su_surf_flds.F90 | 2 +- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index ee55d596..b9d3094e 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -485,6 +485,7 @@ SUBROUTINE HAMM7_INTERFACE( & ! [RCHG -> non used] REAL(KIND=JPRB) :: TEST7(KLON,KLEV), TEST8(KLON,KLEV) REAL(KIND=JPRB) :: PAOD(KLON,NASWBAND), PSSA(KLON,NASWBAND), PABS(KLON,NASWBAND), PASY(KLON,NASWBAND),PFAOD(KLON,NASWBAND) +REAL(KIND=JPRB) :: PAOD_LW(KLON,16) !----------------------------------------------------------------------- @@ -1078,10 +1079,10 @@ SUBROUTINE HAMM7_INTERFACE( & !write(*,*) "PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH)",PGFL(KIDIA:KFDIA,KLEV,YCDNC%MP9_PH) !write(*,*) "MAX(((1.0E-6_JPRB)*ZCDNCACT(KIDIA:KFDIA,1:KLEV)),1._JPRB)",MAX(((1.0E-6_JPRB)*ZCDNCACT(KIDIA:KFDIA,KLEV)),1._JPRB) !write(*,*) "ZCDNCACT(KIDIA:KFDIA,1:KLEV)),1._JPRB)",ZCDNCACT(KIDIA:KFDIA,KLEV) - PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH) = PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH)+MAX((ZCDNCACT(KIDIA:KFDIA,1:KLEV)),1.0E+6_JPRB) ! add CDNC to PGFL field (convert from #/m3 to #/cm3) and treshold minimum value to 1 cm-3 + PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH) = 1.0E-6_JPRB*(PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH)+MAX((ZCDNCACT(KIDIA:KFDIA,1:KLEV)),1.0E+6_JPRB)) ! add CDNC to PGFL field (convert from #/m3 to #/cm3) and treshold minimum value to 1 cm-3 !write(*,*)"PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH)",PGFL(KIDIA:KFDIA,KLEV,YICNC%MP9_PH) !write(*,*)"ZICNC(KIDIA:KFDIA,1:KLEV) ",ZICNC(KIDIA:KFDIA,KLEV) - PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH) = PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH)+ZICNC(KIDIA:KFDIA,1:KLEV)*1.0E6_JPRB ! add ICNC to PGFL field (does not need convert) + PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH) = 1.0E-6_JPRB*(PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH)+ZICNC(KIDIA:KFDIA,1:KLEV)*1.0E6_JPRB) ! add ICNC to PGFL field (does not need convert) !--> End store CDNC and ICNC @@ -1859,6 +1860,10 @@ SUBROUTINE HAMM7_INTERFACE( & PSSA(JL,IW)=PAER_SSA(JL,JK,IW)*PAER_TAU(JL,JK,IW)+PSSA(JL,IW) PASY(JL,IW)=PAER_ASYM(JL,JK,IW)*PAER_TAU(JL,JK,IW)+PASY(JL,IW) END DO + + DO IW=1,16 + PAOD_LW(JL,IW)=PAOD_LW(JL,IW)+PAER_TAU_LW(JL,JK,IW) + END DO !IF(PAOD(JL,IW)>0._JPRB) THEN ! PSSA(JL,:) =PSSA(JL,:)/PAOD(JL,IW)! AOD AVERAGE ! PASY(JL,:) =PASY(JL,:)/PAOD(JL,IW)! AOD AVERAGE @@ -1942,6 +1947,8 @@ SUBROUTINE HAMM7_INTERFACE( & PGFL(KIDIA:KFDIA,2,YAEROUT(1)%MP)=PSSA(KIDIA:KFDIA,10) !PAER_TAU(KIDIA:KFDIA,1:KLEV,10) !533nm PGFL(KIDIA:KFDIA,3,YAEROUT(1)%MP)=PASY(KIDIA:KFDIA,10) !PAER_TAU(KIDIA:KFDIA,1:KLEV,10) !533nm + PGFL(KIDIA:KFDIA,10:26,YAEROUT(1)%MP)= PAOD_LW(KIDIA:KFDIA,1:16) + ! RCHG: It seems that here 1:14 refers to 14 species. PLS: AOD of 14 short wavelengths stored in YAEROUT(12)%MP of first 14 tracers (juggling!!) PGFL(KIDIA:KFDIA,1:14,YAEROUT(27)%MP)=PAOD(KIDIA:KFDIA,1:14) diff --git a/ifs-source/arpifs/setup/su_surf_flds.F90 b/ifs-source/arpifs/setup/su_surf_flds.F90 index 0d6ed30e..fe726990 100644 --- a/ifs-source/arpifs/setup/su_surf_flds.F90 +++ b/ifs-source/arpifs/setup/su_surf_flds.F90 @@ -1325,7 +1325,7 @@ SUBROUTINE SU_SURF_FLDS(YDDIMV,YDSURF,YDMODEL,LDVERBOSE) !TM5/M7 ancillary data IF (TRIM(AERO_SCHEME) == "tm5m7" .or. TRIM(AERO_SCHEME) == "hamm7" ) THEN YSD_VF%YSOILTYPE => YSD_VF%YVF(YSD_VFD%IPTR) - IREQIN=1 + IREQIN=-1 ! This is relevant for dust emission in Tegen scheme (nddust=4), Lianghai Wu CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YSOILTYPE, & & KGRIB=NGRBSOILTYPE, CDNAME='TM5M7 soil type ',KTRAJ=2,KREQIN=IREQIN) END IF From c45516c4631fc72f210b8ccdb767beb7807a26b5 Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Tue, 21 Jan 2025 16:46:40 +0100 Subject: [PATCH 038/129] Clean up, remove debug statements --- ifs-source/arpifs/m7/hamm7_init.F90 | 2 +- .../arpifs/m7/module/mo_ham_species.F90 | 4 - ifs-source/arpifs/m7/module/mo_ham_wetdep.F90 | 9 +- .../arpifs/m7/module/mo_hammoz_wetdep.F90 | 23 +- .../arpifs/m7/phys_ec/hamm7_interface.F90 | 366 ++++-------------- ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 | 97 ++--- .../arpifs/phys_ec/compo_apply_emissions.F90 | 15 +- 7 files changed, 113 insertions(+), 403 deletions(-) diff --git a/ifs-source/arpifs/m7/hamm7_init.F90 b/ifs-source/arpifs/m7/hamm7_init.F90 index 47588676..f2ddd3ac 100644 --- a/ifs-source/arpifs/m7/hamm7_init.F90 +++ b/ifs-source/arpifs/m7/hamm7_init.F90 @@ -178,7 +178,7 @@ SUBROUTINE hamm7_init(YGFL, YRRIP) !eehol: activation initialization nactivpdf = 1 !eehol: using PDF to calculate updraft. Hardcoded for now.. need to check this later (add setphys to oifs?) -ncd_activ = 2 !eehol: Abdul-Razzak and Ghan activation scheme. Hardcoded for now.. need to check this later (add setphys to oifs?)! +ncd_activ = 2 !eehol: Abdul-Razzak and Ghan activation scheme. Hardcoded for now.. need to check this later (add setphys to oifs?) CALL activ_initialize !eehol: set cdnc and icnc indices for HAM diff --git a/ifs-source/arpifs/m7/module/mo_ham_species.F90 b/ifs-source/arpifs/m7/module/mo_ham_species.F90 index c1d706ec..aea4f4a9 100755 --- a/ifs-source/arpifs/m7/module/mo_ham_species.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_species.F90 @@ -307,8 +307,6 @@ SUBROUTINE ham_species kappa = 0.60_dp, & lburden = .TRUE., & idx = id_so4 ) - - !write(*,*)"id_so4",id_so4 !<
0._dp) ztmp1(1:kproma,:) = pmiwc(1:kproma,:)/zilwc(1:kproma,:) - !IF (MINVAL(ABS(zilwc(1:kproma,:)))>0._dp) THEN - ! ztmp1(1:kproma,:) = pmiwc(1:kproma,:)/zilwc(1:kproma,:) - !ENDIF pice(1:kproma,:) = MERGE(ztmp1(1:kproma,:), 0._dp, lo_2d(1:kproma,:)) !--- 1.2) Calculate autoconversion rate: @@ -444,10 +441,6 @@ SUBROUTINE prep_wetdep_hydro(kproma, kbdim, klev, ktop, krow, lstrat, & WHERE(ABS(pmiwc(1:kproma,:))>0._dp) ztmp1(1:kproma,:) = pmrateps(1:kproma,:)/pmiwc(1:kproma,:) - !IF (MINVAL(ABS(pmiwc(1:kproma,:)))>0._dp) THEN - ! ztmp1(1:kproma,:) = pmrateps(1:kproma,:)/pmiwc(1:kproma,:) - !ENDIF - !peffice(1:kproma,:) = MERGE(pmrateps(1:kproma,:)/pmiwc(1:kproma,:), 0._dp, lo_2d(1:kproma,:)) peffice(1:kproma,:) = MERGE(ztmp1(1:kproma,:), 0._dp, lo_2d(1:kproma,:)) @@ -457,18 +450,8 @@ SUBROUTINE prep_wetdep_hydro(kproma, kbdim, klev, ktop, krow, lstrat, & ztmp1(1:kproma,:) = 0._dp WHERE(ABS(pmlwc(1:kproma,:))>0._dp) ztmp1(1:kproma,:) = (pmratepr(1:kproma,:)+pmsnowacl(1:kproma,:))/pmlwc(1:kproma,:) - !IF (MINVAL(ABS(pmlwc(1:kproma,:)))>0._dp) THEN - ! ztmp1(1:kproma,:) = (pmratepr(1:kproma,:)+pmsnowacl(1:kproma,:))/pmlwc(1:kproma,:) - !ENDIF - !write(*,*)"pmratepr(1:kproma,:)",pmratepr(1:kproma,klev) - !write(*,*)"pmsnowacl(1:kproma,:)",pmsnowacl(1:kproma,klev) - !write(*,*)"pmlwc(1:kproma,:)",pmlwc(1:kproma,klev) - !write(*,*)"lo_2d(1:kproma,:)",lo_2d(1:kproma,klev) - - !write(*,*)"ztmp1(1:kproma,:)",ztmp1(1:kproma,klev) - peffwat(1:kproma,:) = MERGE(ztmp1(1:kproma,:) , 0._dp, lo_2d(1:kproma,:)) - !write(*,*)"peffwat(1:kproma,:)",peffwat(1:kproma,klev) + peffwat(1:kproma,:) = MERGE(ztmp1(1:kproma,:) , 0._dp, lo_2d(1:kproma,:)) peffwat(1:kproma,:) = MAX(0._dp,MIN(1._dp,peffwat(1:kproma,:))) @@ -511,9 +494,7 @@ SUBROUTINE prep_wetdep_hydro(kproma, kbdim, klev, ktop, krow, lstrat, & ztmp1(1:kproma,:) = 0._dp WHERE(ABS(zfprec(1:kproma,:))>0._dp) ztmp1(1:kproma,:) = (pfevapr(1:kproma,:)+pfsubls(1:kproma,:))/zfprec(1:kproma,:) - !IF (MINVAL(ABS(zfprec(1:kproma,:)))>0._dp) THEN - ! ztmp1(1:kproma,:) = (pfevapr(1:kproma,:)+pfsubls(1:kproma,:))/zfprec(1:kproma,:) - !ENDIF + prevap(1:kproma,:) = MERGE(ztmp1(1:kproma,:), 0._dp, lo_2d(1:kproma,:)) prevap(1:kproma,:) = MAX(0._dp,MIN(1._dp,prevap(1:kproma,:))) diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index b9d3094e..f118583f 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -286,7 +286,7 @@ SUBROUTINE HAMM7_INTERFACE( & REAL(KIND=JPRB) :: ZAP(KLON,KLEV) REAL(KIND=JPRB) :: ZSO2(KLON,KLEV), ZDP(KLON,KLEV), ZDZ(KLON,KLEV) REAL(KIND=JPRB) :: ZITSO2(KLON,KLEV) -REAL(KIND=JPRB) :: ZFSO2(KLON) , ZFSO4(KLON), ZFSO4_AQ(KLON), Htmp(KLON) +REAL(KIND=JPRB) :: ZFSO2(KLON) , ZFSO4(KLON), ZFSO4_AQ(KLON) REAL(KIND=JPRB) :: ZTSO2(KLON, KLEV) , ZTSO4(KLON, KLEV,1), ZTSO4_AQ(KLON, KLEV) REAL(KIND=JPRB) :: ZQSAT(KLON,KLEV), ZRHO(KLON,KLEV) REAL(KIND=JPRB) :: ZTAER(KLON,KLEV) @@ -319,8 +319,8 @@ SUBROUTINE HAMM7_INTERFACE( & REAL(KIND=JPRB), ALLOCATABLE :: ZAERNGT(:,:) REAL(KIND=JPRB) :: ZDEGRAD, ZEPSCOV, ZEPSWAT, ZRWSAT, ZRWPWP -REAL(KIND=JPRB) :: ZQLWP(KLON,KLEV),ZQLWP2(KLON,KLEV) -REAL(KIND=JPRB) :: ZTMPA,ZTEMP,ZDPOG,ZQIWP,ZPODT +REAL(KIND=JPRB) :: ZQLWP(KLON,KLEV) !, ZQLWP2(KLON,KLEV) +REAL(KIND=JPRB) :: ZTMPA, ZTEMP, ZDPOG, ZQIWP, ZPODT LOGICAL :: LLIQCLD(KLON,KLEV) ! logical for liquid cloud LOGICAL :: LICECLD(KLON,KLEV) ! logical for ice cloud @@ -333,7 +333,7 @@ SUBROUTINE HAMM7_INTERFACE( & ! [RCHG -> var. non used ] INTEGER(KIND=JPIM) :: NSO4SCHEME ! [RCHG -> non used ] REAL(KIND=JPRB) :: ZLAT, ZLON ! [RCHG -> non used ] REAL(KIND=JPRB) :: BETAB(KLON,KLEV), ZBETAI(KLON,KLEV) -! [RCHG -> non used ] REAL(KIND=JPRB) :: ZCLDWAT(KLON,KLEV), ZDUZLPpUM(KLON,KLEV) +! [RCHG -> non used ] REAL(KIND=JPRB) :: ZCLDWAT(KLON,KLEV), ZDUM(KLON,KLEV) ! [RCHG -> non used ] REAL(KIND=JPRB) :: ZBCPHI(KLON,KLEV), ZBCPHO(KLON,KLEV) ! [RCHG -> non used ] REAL(KIND=JPRB) :: ZOMPHI(KLON,KLEV) , ZOMPHO(KLON,KLEV) ! [RCHG -> non used ] REAL(KIND=JPRB) :: ZTBCPHI(KLON,KLEV),ZTBCPHO(KLON,KLEV) @@ -366,7 +366,7 @@ SUBROUTINE HAMM7_INTERFACE( & ! variables for the M7 call REAL(KIND=JPRB) :: ZGRVOL(KLON,KLEV) !grid box volume for diagnostics REAL(KIND=JPRB) :: ZPBL(KLON) !planetary boundary layer top level (in vdfmain.F90 ITOP=1) -REAL(KIND=JPRB) :: Ztmp(KLON) !planetary boundary layer top level (in vdfmain.F90 ITOP=1) +REAL(KIND=JPRB) :: ZTMP(KLON) !temporary array to accumulate diagnostics REAL(KIND=JPRB) :: ZXTM0(KLON,KLEV,ntrac) !tracer mixing ratios for HAM REAL(KIND=JPRB) :: ZXTM1(KLON,KLEV,ntrac) !tracer mixing ratios for HAM REAL(KIND=JPRB) :: ZXTTE(KLON,KLEV,ntrac) !tracer tendency for HAM @@ -402,18 +402,16 @@ SUBROUTINE HAMM7_INTERFACE( & REAL(KIND=JPRB) :: ZLFRAC_SO2(KLON,KLEV) !liquid tracer fraction (SO2) -ham specific- REAL(KIND=JPRB) :: ZDPG(KLON,KLEV) !dp/g REAL(KIND=JPRB) :: ZQP(KLON,KLEV) !full level humidity with treshold -LOGICAL :: LSTRAT !logical switch for stratiform or convective case (TRUE for strat., FALSE for conv.) -REAL(KIND=JPRB) :: ZFEVAPR_cov(KLON,KLEV) !evaporation of rain [kg/m2/s] -REAL(KIND=JPRB) :: ZFSUBLS_cov(KLON,KLEV) !sublimation of snow [kg/m2/s] - -REAL(KIND=JPRB) :: ZFEVAPR_str(KLON,KLEV) !evaporation of rain [kg/m2/s] -REAL(KIND=JPRB) :: ZFSUBLS_str(KLON,KLEV) !sublimation of snow [kg/m2/s] -REAL(KIND=JPRB) :: ZMRATEPR_cov(KLON,KLEV) !rain formation rate in cloudy part -REAL(KIND=JPRB) :: ZMRATEPS_cov(KLON,KLEV) !ice formation rate in cloudy part - -REAL(KIND=JPRB) :: ZMRATEPR_str(KLON,KLEV) !rain formation rate in cloudy part -REAL(KIND=JPRB) :: ZMRATEPS_str(KLON,KLEV) !ice formation rate in cloudy part +LOGICAL :: LSTRAT !logical switch for stratiform or convective case (TRUE for strat., FALSE for conv.) +REAL(KIND=JPRB) :: ZFEVAPR_cov(KLON,KLEV) !evaporation of rain, convective case [kg/m2/s] +REAL(KIND=JPRB) :: ZFSUBLS_cov(KLON,KLEV) !sublimation of snow, convective case [kg/m2/s] +REAL(KIND=JPRB) :: ZFEVAPR_str(KLON,KLEV) !evaporation of rain, stratiform case [kg/m2/s] +REAL(KIND=JPRB) :: ZFSUBLS_str(KLON,KLEV) !sublimation of snow, stratiform case [kg/m2/s] +REAL(KIND=JPRB) :: ZMRATEPR_cov(KLON,KLEV) !rain formation rate in cloudy part, convective case +REAL(KIND=JPRB) :: ZMRATEPS_cov(KLON,KLEV) ! ice formation rate in cloudy part, convective case +REAL(KIND=JPRB) :: ZMRATEPR_str(KLON,KLEV) !rain formation rate in cloudy part, stratiform case +REAL(KIND=JPRB) :: ZMRATEPS_str(KLON,KLEV) ! ice formation rate in cloudy part, stratiform case REAL(KIND=JPRB) :: ZMSNOWACL(KLON,KLEV) !accretion rate of snow with cloud droplets in cloudy part REAL(KIND=JPRB) :: ZFLXR, ZFLXS, ZFLXRB, ZFLXSB !variables to calculate rain and snow evap/formation @@ -425,7 +423,6 @@ SUBROUTINE HAMM7_INTERFACE( & REAL(KIND=JPRB) :: ZICNC(KLON,KLEV) ! ice crystal number concentration [#/cm3] ! added here variables for dry deposition and sedimentation REAL(KIND=JPRB) :: ZTENCIH(KLON,KLEV,ntrac) !for HAM tendencies -REAL(KIND=JPRB) :: ZTENCTMP(KLON,KLEV,ntrac) !for HAM tendencies REAL(KIND=JPRB) :: ZAHFSM(KLON) REAL(KIND=JPRB) :: ZWND(KLON) ! variables not needed for HAM aerosol dry deposition (if gas deposition and different surfaces are taken into account these need to be revised!) @@ -449,7 +446,6 @@ SUBROUTINE HAMM7_INTERFACE( & REAL(KIND=JPRB) :: DDEPOUT_2D(KLON,KTRAC) REAL(KIND=JPRB) :: WDEPOUT_2D(KLON,KTRAC) -!REAL(KIND=JPRB) :: WDEPOUT_2DS(KLON,KTRAC) REAL(KIND=JPRB) :: WDEPOUT_IC_2D(KLON,KTRAC) REAL(KIND=JPRB) :: WDEPOUT_BC_2D(KLON,KTRAC) @@ -710,9 +706,6 @@ SUBROUTINE HAMM7_INTERFACE( & ENDDO ENDDO - DO JL=KIDIA,KFDIA - Htmp(JL)=sum(ZDZ(JL,:)) - ENDDO ZM6RP(KIDIA:KFDIA,:,:) = 0.0_JPRB ZM6DRY(KIDIA:KFDIA,:,:) = 0.0_JPRB ZRHOP(KIDIA:KFDIA,:,:) = 0.0_JPRB @@ -1036,11 +1029,11 @@ SUBROUTINE HAMM7_INTERFACE( & ZTKEM1, ZWCAPE, PVERVEL, ZRHO, & ! turbulent kinetic energy, CAPE contr. to conv. vert. veloc. [m s-1], large scale vert. veloc. ZW, ZWPDF) - DO JT = 1,NTRAC - ZXTP1(KIDIA:KFDIA,1:KLEV,JT) = ZXTM1(KIDIA:KFDIA,1:KLEV,JT) + ZXTTE(KIDIA:KFDIA,1:KLEV,JT) * TIME_STEP_LEN - END DO + DO JT = 1,NTRAC + ZXTP1(KIDIA:KFDIA,1:KLEV,JT) = ZXTM1(KIDIA:KFDIA,1:KLEV,JT) + ZXTTE(KIDIA:KFDIA,1:KLEV,JT) * TIME_STEP_LEN + END DO + IF (ncd_activ == 2 .OR. nccndiag > 0) THEN - !write(*,*)"ham_activ_koehler_ab" CALL ham_activ_koehler_ab(KFDIA, KLON, KLEV, ZKROW, KTDIA, & ! krow=1 ktdia=1 ZXTP1, PTP, ZA, ZB) END IF @@ -1060,7 +1053,7 @@ SUBROUTINE HAMM7_INTERFACE( & ENDDO ENDDO - CALL ham_activ_abdulrazzak_ghan( KFDIA, KLON, KLEV, ZKROW, KTDIA, & ! in original 1 = ktdia... for diagnostics so krow=1 and ktdia=1 + CALL HAM_ACTIV_ABDULRAZZAK_GHAN( KFDIA, KLON, KLEV, ZKROW, KTDIA, & ! in original 1 = ktdia... for diagnostics so krow=1 and ktdia=1 & ZCDNCACT, ZESW, ZRHO, & ! number of activated particles, saturation vapor pressure, air density & ZXTP1, PTP, PRSF1, ZQP, & ! tracer mix rat, temperature, air pressure, spec. humid. & ZW, ZWPDF, ZA, ZB, ZRDRY, & ! mean udr veloc, pdf of udr. veloc, Koehler A, Koehler B, dry radius @@ -1072,57 +1065,35 @@ SUBROUTINE HAMM7_INTERFACE( & !<-- Store CDNC (number of activated particles) and ICNC as a number mixing ratio to tracer values and to PGFL fields - !write(*,*)"idt_cdnc",idt_cdnc - !write(*,*)"idt_icnc",idt_icnc ZXTM1(KIDIA:KFDIA,1:KLEV,idt_cdnc) = (MAX(ZCDNCACT(KIDIA:KFDIA,1:KLEV),((1.0E6_JPRB)*1._JPRB)))/ZRHO(KIDIA:KFDIA,1:KLEV) ! [#/kg] and treshold CDNC to 1 cm-3 ZXTM1(KIDIA:KFDIA,1:KLEV,idt_icnc) = (1.0E6_JPRB)*ZICNC(KIDIA:KFDIA,1:KLEV)/ZRHO(KIDIA:KFDIA,1:KLEV) !ice crystal number conc = #/cm3 --> number mix rat [#/kg] - !write(*,*) "PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH)",PGFL(KIDIA:KFDIA,KLEV,YCDNC%MP9_PH) - !write(*,*) "MAX(((1.0E-6_JPRB)*ZCDNCACT(KIDIA:KFDIA,1:KLEV)),1._JPRB)",MAX(((1.0E-6_JPRB)*ZCDNCACT(KIDIA:KFDIA,KLEV)),1._JPRB) - !write(*,*) "ZCDNCACT(KIDIA:KFDIA,1:KLEV)),1._JPRB)",ZCDNCACT(KIDIA:KFDIA,KLEV) PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH) = 1.0E-6_JPRB*(PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH)+MAX((ZCDNCACT(KIDIA:KFDIA,1:KLEV)),1.0E+6_JPRB)) ! add CDNC to PGFL field (convert from #/m3 to #/cm3) and treshold minimum value to 1 cm-3 - !write(*,*)"PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH)",PGFL(KIDIA:KFDIA,KLEV,YICNC%MP9_PH) - !write(*,*)"ZICNC(KIDIA:KFDIA,1:KLEV) ",ZICNC(KIDIA:KFDIA,KLEV) PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH) = 1.0E-6_JPRB*(PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH)+ZICNC(KIDIA:KFDIA,1:KLEV)*1.0E6_JPRB) ! add ICNC to PGFL field (does not need convert) !--> End store CDNC and ICNC - !----------------------------------------------------------------- !--> Calculation for effective radii and put to PGFL fields ! put default values for effective radii reffl(KIDIA:KFDIA,1:KLEV,ZKROW) = 4._JPRB ! comes from liquid effective radius routine (PP_MIN_RE_UM) reffi(KIDIA:KFDIA,1:KLEV,ZKROW) = 80._JPRB*0.64952_JPRB ! comes from ice effective radius routine (ZDEFAULT_RE_UM) -! IF (PAP(JL,KLEV) > 0.001_JPRB) THEN -! Z1CLD = 1._JPRB/PAP(JL,KLEV) -! ZQIWP = MAX(0._JPRB, PIP(JL,KLEV)*Z1CLD) -! ZQLWP = MAX(0._JPRB, PLP(JL,KLEV)*Z1CLD) -! ENDIF + ! liquid effective radius DO JK=1,KLEV DO JL=KIDIA,KFDIA IF ( PAP(JL,JK) >=0.001_JPRB ) THEN ZTEMP=1.0_JPRB/PAP(JL,JK) - !ZDPOG=ZRGI*(PPRESH(JL,JK)-PPRESH(JL,JK-1)) ZDPOG=1.0/RG*(PRS1(JL,JK)-PRS1(JL,JK-1)) !-- cloud and ice water path in kg m-2 ZQIWP =MAX(0._JPRB,ZDPOG*PIP(JL,JK)*ZTEMP) ZQLWP(JL,JK) =MAX(0._JPRB,ZDPOG*PLP(JL,JK)*ZTEMP) - ! ZQIP=MAX(0._JPRB,1.E+03_JPRB*ZDPOG*PIWCF(JL,JK)) - ! ZQLP=MAX(0._JPRB,1.E+03_JPRB*ZDPOG*PLWCF(JL,JK)) !-- cloud and ice water content in g m-3 - !ZPODT=ZRDI*PPRESF(JL,JK)/PTF(JL,JK) - ZPODT=1.0/RD*PRSF1(JL,JK)/PTP(JL,JK) - !ZIWC=1.E+03_JPRB*PIWCF(JL,JK)*ZPODT*ZTEMP - !ZLWC=1.E+03_JPRB*PLWCF(JL,JK)*ZPODT*ZTEMP - !ZIP(JL,JK)=1.E+03_JPRB*PIP(JL,JK)*ZPODT*ZTEMP - !ZLP(JL,JK)=1.E+03_JPRB*PLP(JL,JK)*ZPODT*ZTEMP - ZIP(JL,JK)=PIP(JL,JK)*ZPODT*ZTEMP + ZIP(JL,JK)=PIP(JL,JK)*ZPODT*ZTEMP ZLP(JL,JK)=PLP(JL,JK)*ZPODT*ZTEMP - ELSE ZQIWP = 0._JPRB ZQLWP(JL,JK) = 0._JPRB @@ -1132,47 +1103,25 @@ SUBROUTINE HAMM7_INTERFACE( & END DO END DO - - DO JK=1,KLEV DO JL=KIDIA,KFDIA ZTMPA = 1.0_JPRB/MAX(ZAP(JL,JK),ZEPSEC) LLIQCLD(JL,JK) = ( PLP(JL,JK)*ZTMPA ) > ZEPSEC ! logical for liquid cloud LICECLD(JL,JK) = ( PIP(JL,JK)*ZTMPA ) > ZEPSEC ! logical for ice cloud - ZQLWP2(JL,JK) = PLP(JL,JK)/MAX(ZAP(JL,JK),1.E-10_JPRB) ! calculate lwp - ZQLWP2(JL,JK) = MIN(MAX(ZQLWP2(JL,JK),0.0_JPRB),10*RCLDMAX) ! treshold lwp, lianghai changed - !ZQLWP(JL,JK) = MIN(MAX(ZQLWP(JL,JK),0.0_JPRB),10*RCLDMAX) ! treshold lwp, lianghai changed + ! ZQLWP2(JL,JK) = PLP(JL,JK)/MAX(ZAP(JL,JK),1.E-10_JPRB) ! calculate lwp + ! ZQLWP2(JL,JK) = MIN(MAX(ZQLWP2(JL,JK),0.0_JPRB),10*RCLDMAX) ! treshold lwp, lianghai changed + ! effective radius calculated similarly as in radlswr.F90 ! 2.387e-10 is 3/(4*pi*rho_liq*10^6) [10^6 for N in right units] ZRE_LIQ(JL,JK) = (2.387e-4_JPRB*ZRHO(JL,JK)*ZQLWP(JL,JK)/(MAX(PGFL(JL,JK,YCDNC%MP9_PH)*1.0E-6_JPRB,10._JPRB)))**0.333_JPRB ! calculate effective radius in um (use minimum value for CDNC if CDNC is small) END DO END DO - !write(*,*)"ZCDNCACT",ZCDNCACT(:,klev) - !write(*,*)"ZFRACN 1",ZFRACN(:,klev,1) - !write(*,*)"ZFRACN 2",ZFRACN(:,klev,2) - !write(*,*)"ZFRACN 3",ZFRACN(:,klev,3) - !write(*,*)"ZFRACN 4",ZFRACN(:,klev,4) - !write(*,*)"ZFRACN 5",ZFRACN(:,klev,5) - !write(*,*)"ZFRACN 6",ZFRACN(:,klev,6) - !write(*,*)"ZFRACN 7",ZFRACN(:,klev,7) - !write(*,*)"RCLDMAX",RCLDMAX - !write(*,*)"ZLP",ZLP(:,KLEV) - !write(*,*)"PLP",PLP(:,KLEV) - !write(*,*)"ZAP",ZAP(:,KLEV) - ! - !write(*,*)"ZQLWP",ZQLWP(:,KLEV) - !write(*,*)"ZQLWP2",ZQLWP2(:,KLEV) - !write(*,*)"ZRHO",ZRHO(:,KLEV) - !write(*,*)"PGFL(JL,JK,YCDNC%MP9_PH) in /cm3",PGFL(:,KLEV,YCDNC%MP9_PH)*1.0E-6_JPRB - !! Add liq. eff. rad. to HAM variables (only if there is liquid cloud else minimum value) - !write(*,*)"ZRE_LIQ m",ZRE_LIQ(KIDIA:KFDIA,KLEV) - !write(*,*)"ZRE_LIQ um",ZRE_LIQ(KIDIA:KFDIA,KLEV)*1.E+6_JPRB + ! Add liq. eff. rad. to HAM variables (only if there is liquid cloud else minimum value) REFFL(KIDIA:KFDIA,1:KLEV,ZKROW) = MERGE(ZRE_LIQ(KIDIA:KFDIA,1:KLEV)*1.E+6_JPRB,4._JPRB,LLIQCLD(KIDIA:KFDIA,1:KLEV)) CALL ICE_EFFECTIVE_RADIUS(YRERAD, YDSPP_CONFIG, KIDIA, KFDIA, KLON, KLEV, & & PRSF1, PTP, ZAP, PIP, PSP, PGEMU, & ! pressure, temp, cloud fr., IWC, SWC, sine of latitude & reffi(1:KLON,1:KLEV,ZKROW)) ! ice effective radius (updated to mo_activ variable 'reffi' which used in mo_ham_wetdep) - !write(*,*)"reffi",reffi(:,klev,1) - !write(*,*)"reffl",reffl(:,klev,1) + ! only if there is ice cloud else minimum value REFFI(KIDIA:KFDIA,1:KLEV,ZKROW) = MERGE(REFFI(KIDIA:KFDIA,1:KLEV,ZKROW), 20._JPRB, LICECLD(KIDIA:KFDIA,1:KLEV)) @@ -1213,68 +1162,32 @@ SUBROUTINE HAMM7_INTERFACE( & ZFLXS=PFPLCN(JL,JK-1) ZFLXRB=PFPLCL(JL,JK) ZFLXSB=PFPLCN(JL,JK) - !IF (PCOVPTOT(JL,JK) > 1e-40_JPRB) THEN - !ZMRATEPR(JL,JK) = ( ZFLXRB-ZFLXR ) / PCOVPTOT(JL,JK) - !ZMRATEPS(JL,JK) = ( ZFLXSB-ZFLXS ) / PCOVPTOT(JL,JK) - !!same formula negatives/positives for evap or formation - !ZFEVAPR(JL,JK) = ( ZFLXRB-ZFLXR ) / PCOVPTOT(JL,JK) - !ZFSUBLS(JL,JK) = ( ZFLXSB-ZFLXS ) / PCOVPTOT(JL,JK) - ZMRATEPR_cov(JL,JK) = ZFLXRB-ZFLXR! ) / MAX(PCOVPTOT(JL,JK),1.E-10_JPRB) - ZMRATEPS_cov(JL,JK) = ZFLXSB-ZFLXS! ) / MAX(PCOVPTOT(JL,JK),1.E-10_JPRB) !same formula negatives/positives for evap or formation - ZFEVAPR_cov(JL,JK) = ZFLXRB-ZFLXR !) / MAX(PCOVPTOT(JL,JK),1.E-10_JPRB) - ZFSUBLS_cov(JL,JK) = ZFLXSB-ZFLXS !) / MAX(PCOVPTOT(JL,JK),1.E-10_JPRB) - ! ELSE - ! ZMRATEPR_cov(JL,JK) = 0.0_JPRB - ! ZMRATEPS_cov(JL,JK) = 0.0_JPRB - ! !same formula negatives/positives for evap or formation - ! ZFEVAPR_cov(JL,JK) = 0.0_JPRB - ! ZFSUBLS_cov(JL,JK) = 0.0_JPRB - ! END IF - - + ZMRATEPR_cov(JL,JK) = ZFLXRB-ZFLXR + ZMRATEPS_cov(JL,JK) = ZFLXSB-ZFLXS + ZFEVAPR_cov(JL,JK) = ZFLXRB-ZFLXR + ZFSUBLS_cov(JL,JK) = ZFLXSB-ZFLXS END DO END DO - DO JK=1,KLEV + DO JK=1,KLEV DO JL=KIDIA,KFDIA ZFLXR=PFPLSL(JL,JK-1) ZFLXS=PFPLSN(JL,JK-1) ZFLXRB=PFPLSL(JL,JK) ZFLXSB=PFPLSN(JL,JK) - !IF (PCOVPTOT(JL,JK) > 1e-40_JPRB) THEN - !ZMRATEPR(JL,JK) = ( ZFLXRB-ZFLXR ) / PCOVPTOT(JL,JK) - !ZMRATEPS(JL,JK) = ( ZFLXSB-ZFLXS ) / PCOVPTOT(JL,JK) - !!same formula negatives/positives for evap or formation - !ZFEVAPR(JL,JK) = ( ZFLXRB-ZFLXR ) / PCOVPTOT(JL,JK) - !ZFSUBLS(JL,JK) = ( ZFLXSB-ZFLXS ) / PCOVPTOT(JL,JK) - ZMRATEPR_str(JL,JK) = ZFLXRB-ZFLXR !) / MAX(PCOVPTOT(JL,JK),1.E-10_JPRB) - ZMRATEPS_str(JL,JK) = ZFLXSB-ZFLXS !) / MAX(PCOVPTOT(JL,JK),1.E-10_JPRB) !same formula negatives/positives for evap or formation - ZFEVAPR_str(JL,JK) = ZFLXRB-ZFLXR !) / MAX(PCOVPTOT(JL,JK),1.E-10_JPRB) - ZFSUBLS_str(JL,JK) = ZFLXSB-ZFLXS !) / MAX(PCOVPTOT(JL,JK),1.E-10_JPRB) - !ELSE - ! ZMRATEPR_str(JL,JK) = 0.0_JPRB - ! ZMRATEPS_str(JL,JK) = 0.0_JPRB - ! !same formula negatives/positives for evap or formation - ! ZFEVAPR_str(JL,JK) = 0.0_JPRB - ! ZFSUBLS_str(JL,JK) = 0.0_JPRB - !END IF - - + ZMRATEPR_str(JL,JK) = ZFLXRB-ZFLXR + ZMRATEPS_str(JL,JK) = ZFLXSB-ZFLXS + ZFEVAPR_str(JL,JK) = ZFLXRB-ZFLXR + ZFSUBLS_str(JL,JK) = ZFLXSB-ZFLXS END DO END DO - - !write(*,*)"ZMRATEPR_str", ZMRATEPR_str(:,KLEV) - !write(*,*)"ZMRATEPS_str", ZMRATEPS_str(:,KLEV) ZMSNOWACL(KIDIA:KFDIA,1:KLEV) = ZMRATEPS_str(KIDIA:KFDIA,1:KLEV) !? - !ZMSNOWACL(KIDIA:KFDIA,1:KLEV) = PSP(KIDIA:KFDIA,1:KLEV) !? ZLFRAC_SO2(KIDIA:KFDIA,:) = 0._JPRB ! zlfrac_so2 only needed in gas scavenging and this is off for now (put this zero) - !ZLP(KIDIA:KFDIA,1:KLEV) = PLP(KIDIA:KFDIA,1:KLEV) ! temporary variable for cloud water content (modified in wetdep) - !ZIP(KIDIA:KFDIA,1:KLEV) = PIP(KIDIA:KFDIA,1:KLEV) ! temporary variable for cloud ice water content (modified in wetdep) ZIPDUM(KIDIA:KFDIA,1:KLEV) = 0._JPRB ! temporary variable for cloud ice water content (modified in wetdep) @@ -1306,44 +1219,20 @@ SUBROUTINE HAMM7_INTERFACE( & LSTRAT = .FALSE. !False for convective case IF (.NOT. LSTRAT) THEN CALL XT_CONV_MASSFIX(KFDIA, KLON, KLEV, KLEV+1, NTRAC, ZKROW, PRSF1, PRS1, ZXTTE, .TRUE., ZDUMMY) ! call convective mass conserving (init zxtte_old) - !write(*,*)"1 ZXTTE ac",ZXTTE(:,klev,16) - !write(*,*)"1 ZXTTE ac 4",ZXTTE(:,klev,24) - !write(*,*)"1 ZXTTE cs",ZXTTE(:,klev,17) - !write(*,*)"1 ZXTTE cs",ZXTTE(:,klev,25) - !write(*,*)"ZM6RP 1",ZM6RP(:,klev,1) - !write(*,*)"ZM6RP 2",ZM6RP(:,klev,2) - !write(*,*)"ZM6RP 3",ZM6RP(:,klev,3) - !write(*,*)"ZM6DRY",ZM6DRY(:,klev,3) - !write(*,*)"PFPLSL", PFPLSL(:,KLEV) - !write(*,*)"PCOVPTOT",PCOVPTOT(:,KLEV) - !write(*,*)"ZAP",ZAP(:,KLEV) - !write(*,*)"PMFU",PMFU(:,KLEV) + CALL WETDEP_INTERFACE(KFDIA, KLON, KLEV, 1, ZKROW, LSTRAT, & ! ktop = 1 (top level index), lstrat = FALSE for conv. case - !ZDPG, ZMRATEPR_cov, ZMRATEPS_cov, ZMSNOWACL, & ! dp/g, evap. of rain, subl. of snow, accr. rate of snow with cl. drop in-cl. - ZDPG, PRP, PSP, ZMSNOWACL, & ! dp/g, evap. of rain, subl. of snow, accr. rate of snow with cl. drop in-cl. - ZLPU, ZIP, & ! cloud water content, cloud ice water content + ZDPG, PRP, PSP, ZMSNOWACL, & ! dp/g, evap. of rain, subl. of snow, accr. rate of snow with cl. drop in-cl. + ZLPU, ZIP, & ! cloud water content, cloud ice water content ZM6RP, ZM6DRY, & ! m7 aerosol: to replace rwet_m7, dry radius for soluble modes [cm] REFFI, REFFL, & ! effective radii ZCDNCACT, ZFRACN, & ! number/fraction of activated particles per mode - PTP, ZXTM1, ZLFRAC_SO2, & ! temperature, prev. mixing ratio, zlfrac_so2 only needed in gas scavenging (0 for now) + PTP, ZXTM1, ZLFRAC_SO2, & ! temperature, prev. mixing ratio, zlfrac_so2 only needed in gas scavenging (0 for now) ZXTTE, ZXTP10, ZXTP1C, & ! tendencies/mixing ratios (in/out) - PFPLCL, PFPLCN, ZFEVAPR_cov, ZFSUBLS_cov, & ! rain flux, snow flux, + PFPLCL, PFPLCN, ZFEVAPR_cov, ZFSUBLS_cov, & ! rain flux, snow flux, PMFU, ZFUXT3D, & ! conv flux, updraft mass flux (updated in wetdep) - ZAP, ZDUM2D, ZRHO, ZDUMMY, ZWDEP_SCAV_IC, ZWDEP_SCAV_BC) ! cloud frac., precip. frac., air dens., in/output*3 - - !write(*,*)"2 ZXTTE ac",ZXTTE(:,klev,16) - !write(*,*)"2 ZXTTE ac 4",ZXTTE(:,klev,24) - !write(*,*)"2 ZXTTE cs",ZXTTE(:,klev,17) - !write(*,*)"2 ZXTTE cs",ZXTTE(:,klev,25) - !write(*,*)"ZDUMMY ac",ZDUMMY(:,24) - !write(*,*)"ZDUMMY cs",ZDUMMY(:,25) - !write(*,*)"ZDUMMY ac",ZDUMMY(:,24)*RG/ZDP(:,KLEV) - !write(*,*)"ZDUMMY cs",ZDUMMY(:,25)*RG/ZDP(:,KLEV) + ZAP, ZDUM2D, ZRHO, ZDUMMY, ZWDEP_SCAV_IC, ZWDEP_SCAV_BC) ! cloud frac., precip. frac., air dens., in/output*3 + CALL XT_CONV_MASSFIX(KFDIA, KLON, KLEV, KLEV+1, NTRAC, ZKROW, PRSF1, PRS1, ZXTTE, .FALSE., ZDUMMY) ! call convective mass conserving - !write(*,*)"3 ZXTTE ac",ZXTTE(:,klev,16) - !write(*,*)"3 ZXTTE ac",ZXTTE(:,klev,24) - !write(*,*)"3 ZXTTE cs",ZXTTE(:,klev,17) - !write(*,*)"3 ZXTTE cs",ZXTTE(:,klev,25) END IF !Add convective case wet removal fluxes to diagnostics @@ -1378,34 +1267,19 @@ SUBROUTINE HAMM7_INTERFACE( & ZDUM2D(KIDIA:KFDIA,1:KLEV) = 0._JPRB ! dummy conv flux for strat. case ZDUM3D(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB ! dummy updraft mass flux for strat. case - LSTRAT = .TRUE. !True for strat case,large scale - !write(*,*)"4 ZXTTE ac",ZXTTE(:,klev,16) - !write(*,*)"4 ZXTTE ac 4",ZXTTE(:,klev,24) - !write(*,*)"4 ZXTP1c 4",ZXTP1C(:,klev,24) - !write(*,*)"4 ZXTTE cs",ZXTTE(:,klev,17) - !write(*,*)"4 ZXTTE cs",ZXTTE(:,klev,25) - !write(*,*)"PCOVPTOT",PCOVPTOT(:,klev) + LSTRAT = .TRUE. !True for strat case, large scale CALL WETDEP_INTERFACE(KFDIA, KLON, KLEV, 1, ZKROW, LSTRAT, & ! ktop = 1 (top level index), lstrat = TRUE for strat. case - !ZDPG, ZMRATEPR_str, ZMRATEPS_str, ZMSNOWACL, & ! dp/g, evap. of rain, subl. of snow, accr. rate of snow with cl. drop in-cl. - ZDPG, PRP, PSP, ZMSNOWACL, & ! dp/g, evap. of rain, subl. of snow, accr. rate of snow with cl. drop in-cl. + ZDPG, PRP, PSP, ZMSNOWACL, & ! dp/g, evap. of rain, subl. of snow, accr. rate of snow with cl. drop in-cl. ZLP, ZIP, & ! cloud water content, cloud ice water content ZM6RP, ZM6DRY, & ! m7 aerosol: to replace rwet_m7, dry radius for soluble modes [cm] REFFI, REFFL, & ! effective radii ZCDNCACT, ZFRACN, & ! number/fraction of activated particles per mode PTP, ZXTM1, ZLFRAC_SO2, & ! temperature, prev. mixing ratio, zlfrac_so2 only needed in gas scavenging (0 for now) ZXTTE, ZXTP10, ZXTP1C, & ! tendencies/mixing ratios (in/out) - PFPLSL, PFPLSN, ZFEVAPR_str, ZFSUBLS_str, & ! rain flux, snow flux, + PFPLSL, PFPLSN, ZFEVAPR_str, ZFSUBLS_str, & ! rain flux, snow flux, ZDUM2D, ZDUM3D, & ! zeroes as these are not needed in strat. case ZAP, PCOVPTOT, ZRHO, ZDUMMY, ZWDEP_SCAV_IC, ZWDEP_SCAV_BC) ! cloud frac., precip. frac., air dens., in/output*3 - !write(*,*)"5 ZXTTE ac",ZXTTE(:,klev,16) - !write(*,*)"5 ZXTTE ac 4",ZXTTE(:,klev,24) - !write(*,*)"5 ZXTTE cs",ZXTTE(:,klev,17) - !write(*,*)"5 ZXTTE cs",ZXTTE(:,klev,25) - !write(*,*)"ZDUMMY ac",ZDUMMY(:,24) - !write(*,*)"ZDUMMY cs",ZDUMMY(:,25) - !write(*,*)"ZDUMMY ac",ZDUMMY(:,24)*RG/ZDP(:,KLEV) - !write(*,*)"ZDUMMY cs",ZDUMMY(:,25)*RG/ZDP(:,KLEV) ! Add stratiform case wet removal fluxes to diagnostics DO JMASS=1,NAEROCOMP JY=KAERO(ind_oifs_ham%ind_mass_OIFS(JMASS)) @@ -1433,10 +1307,6 @@ SUBROUTINE HAMM7_INTERFACE( & PRSF1, PRS1, & ZXTM1, ZXTTE) - !write(*,*)"6 ZXTTE ac",ZXTTE(:,klev,16) - !write(*,*)"6 ZXTTE ac",ZXTTE(:,klev,24) - !write(*,*)"6 ZXTTE cs",ZXTTE(:,klev,17) - !write(*,*)"6 ZXTTE cs",ZXTTE(:,klev,25) !----------------------------------------------------------------- !--> Sedimentation for HAM-M7 CALL GSTATS(2504,0) @@ -1451,7 +1321,6 @@ SUBROUTINE HAMM7_INTERFACE( & ZM6RP, ZRHOP, & ! mean mode actual radius [m], mean mode particle density [kg m-3] ZXTM1, ZXTTE, ZSEDIFLUX, ZSEDIFLUXSURF) ! tracer mixing ratios and tendency (sediflux for diagnostics) - SEDOUT(KIDIA:KFDIA, 1:KLEV,:)=(ZTENCIH(KIDIA:KFDIA, 1:KLEV,:)-ZXTTE(KIDIA:KFDIA, 1:KLEV,:)) DO JK=1,KLEV DO JCLASS=1,NCLASS @@ -1562,7 +1431,6 @@ SUBROUTINE HAMM7_INTERFACE( & END IF !--> modify tendency at surface according to changes in surface emissions - !write(*,*)"ZXTEMS 4", ZXTEMS(:,24) DO JT = 1,NTRAC DO JL = KIDIA,KFDIA ZXTTE(JL,KLEV,JT) = ZTENCIH(JL,KLEV,JT) + ((ZXTEMS(JL,JT)*RG)/(ZDP(JL,KLEV))) @@ -1976,64 +1844,56 @@ SUBROUTINE HAMM7_INTERFACE( & DO JN=1,NACTAERO !ktrac PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(3)%MP) = WDEPOUT_2D(KIDIA:KFDIA,KAERO(JN)) - !PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(6)%MP) = WDEPOUT_2D(KIDIA:KFDIA,KAERO(JN)) - PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(17)%MP) = WDEPOUT_IC_2D(KIDIA:KFDIA,KAERO(JN)) - PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(18)%MP) = WDEPOUT_BC_2D(KIDIA:KFDIA,KAERO(JN)) - !PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(4)%MP) = ZSEDIFLUXSURF(KIDIA:KFDIA,KAERO(JN)) - PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(5)%MP) = PAERSRC(KIDIA:KFDIA,KAERO(JN)) + PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(17)%MP) = WDEPOUT_IC_2D(KIDIA:KFDIA,KAERO(JN)) + PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(18)%MP) = WDEPOUT_BC_2D(KIDIA:KFDIA,KAERO(JN)) + PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(5)%MP) = PAERSRC(KIDIA:KFDIA,KAERO(JN)) END DO DO JN=1,NACTAERO !ktrac - ZTMP=0.0 - DO JK=1,KLEV - ZTMP(KIDIA:KFDIA)=ZTMP(KIDIA:KFDIA)+PCEN(KIDIA:KFDIA,JK,KAERO(JN)) - END DO + ZTMP=0.0_JPRB + DO JK=1,KLEV + ZTMP(KIDIA:KFDIA)=ZTMP(KIDIA:KFDIA)+PCEN(KIDIA:KFDIA,JK,KAERO(JN)) + END DO PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(9)%MP) = ZTMP(KIDIA:KFDIA) END DO - DO JN=1,NACTAERO !ktrac - ZTMP=0.0 - DO JK=1,KLEV - ZTMP(KIDIA:KFDIA)=ZTMP(KIDIA:KFDIA)+ZCEN(KIDIA:KFDIA,JK,KAERO(JN)) - END DO + ZTMP=0.0_JPRB + DO JK=1,KLEV + ZTMP(KIDIA:KFDIA)=ZTMP(KIDIA:KFDIA)+ZCEN(KIDIA:KFDIA,JK,KAERO(JN)) + END DO PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(10)%MP) = ZTMP(KIDIA:KFDIA) END DO DO JN=1,NACTAERO !ktrac - ZTMP=0.0 - DO JK=1,KLEV - ZTMP(KIDIA:KFDIA)=ZTMP(KIDIA:KFDIA)+PTENC(KIDIA:KFDIA,JK,KAERO(JN)) - END DO + ZTMP=0.0_JPRB + DO JK=1,KLEV + ZTMP(KIDIA:KFDIA)=ZTMP(KIDIA:KFDIA)+PTENC(KIDIA:KFDIA,JK,KAERO(JN)) + END DO PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(11)%MP) = ZTMP(KIDIA:KFDIA) END DO - - !pdz(1:kproma,:)=pdpg(1:kproma,:)/prho(1:kproma,:) - - DO JN=1,NAEROCOMP !ntrac!NACTAERO - JO=ind_oifs_ham%ind_mass_OIFS(JN) ! JO -> index context OIFS - JH=ind_oifs_ham%IND_mass_HAM(JN) ! JH -> index context HAM - JY=YAEROUT(7)%MP - ZTMP=0.0 - DO JK=1,KLEV - !PGFL(KIDIA:KFDIA,JO,JY) = PGFL(KIDIA:KFDIA, JO, JY) + (ZXTM1(KIDIA:KFDIA,JK,JH)+(ZXTTE(KIDIA:KFDIA,JK,JH)*TIME_STEP_LEN)) * ZDPG(KIDIA:KFDIA,JK) - ZTMP(KIDIA:KFDIA)= ZTMP(KIDIA:KFDIA) + (ZXTM1(KIDIA:KFDIA,JK,JH)+(ZXTTE(KIDIA:KFDIA,JK,JH)*TIME_STEP_LEN)) * ZDPG(KIDIA:KFDIA,JK) - END DO - PGFL(KIDIA:KFDIA,JO,JY) = ZTMP(KIDIA:KFDIA)!/Htmp(KIDIA:KFDIA) + DO JN=1,NAEROCOMP !ntrac!NACTAERO + JO=ind_oifs_ham%ind_mass_OIFS(JN) ! JO -> index context OIFS + JH=ind_oifs_ham%IND_mass_HAM(JN) ! JH -> index context HAM + JY=YAEROUT(7)%MP + ZTMP=0.0_JPRB + DO JK=1,KLEV + ZTMP(KIDIA:KFDIA)= ZTMP(KIDIA:KFDIA) + (ZXTM1(KIDIA:KFDIA,JK,JH)+(ZXTTE(KIDIA:KFDIA,JK,JH)*TIME_STEP_LEN)) * ZDPG(KIDIA:KFDIA,JK) END DO + PGFL(KIDIA:KFDIA,JO,JY) = ZTMP(KIDIA:KFDIA) + END DO - DO JN=1,NCLASS - JO=ind_oifs_ham%ind_class_OIFS(JN) ! JO -> index context OIFS - JH=ind_oifs_ham%IND_class_HAM(JN) ! JH -> index context HAM - JY=YAEROUT(7)%MP - ZTMP=0.0 - DO JK=1,KLEV - !PGFL(KIDIA:KFDIA,JO,JY) = PGFL(KIDIA:KFDIA, JO, JY) + (ZXTM1(KIDIA:KFDIA,JK,JH)+(ZXTTE(KIDIA:KFDIA,JK,JH)*TIME_STEP_LEN)) * ZDPG(KIDIA:KFDIA,JK) - ZTMP(KIDIA:KFDIA) = ZTMP(KIDIA:KFDIA) + (ZXTM1(KIDIA:KFDIA,JK,JH)+(ZXTTE(KIDIA:KFDIA,JK,JH)*TIME_STEP_LEN)) * ZDPG(KIDIA:KFDIA,JK) - END DO - PGFL(KIDIA:KFDIA,JO,JY) = ZTMP(KIDIA:KFDIA)!/Htmp(KIDIA:KFDIA) + DO JN=1,NCLASS + JO=ind_oifs_ham%ind_class_OIFS(JN) ! JO -> index context OIFS + JH=ind_oifs_ham%IND_class_HAM(JN) ! JH -> index context HAM + JY=YAEROUT(7)%MP + ZTMP=0.0_JPRB + DO JK=1,KLEV + ZTMP(KIDIA:KFDIA) = ZTMP(KIDIA:KFDIA) + (ZXTM1(KIDIA:KFDIA,JK,JH)+(ZXTTE(KIDIA:KFDIA,JK,JH)*TIME_STEP_LEN)) * ZDPG(KIDIA:KFDIA,JK) END DO + PGFL(KIDIA:KFDIA,JO,JY) = ZTMP(KIDIA:KFDIA) + END DO ! save load for each N/M as one level ! kg/kg -> kg/m2 N/kg-> N/m2 @@ -2041,10 +1901,9 @@ SUBROUTINE HAMM7_INTERFACE( & JO=ind_oifs_ham%ind_mass_OIFS(JN) ! JO -> index context OIFS JH=ind_oifs_ham%IND_mass_HAM(JN) ! JH -> index context HAM JY=YAEROUT(8)%MP - ZTMP=0.0 + ZTMP=0.0_JPRB DO JK=1,KLEV - !PGFL(KIDIA:KFDIA,JO,JY) = PGFL(KIDIA:KFDIA,JO,JY)+ZXTTE(KIDIA:KFDIA,JK,JH) - ZTMP(KIDIA:KFDIA) = ZTMP(KIDIA:KFDIA) + ZXTTE(KIDIA:KFDIA,JK,JH) + ZTMP(KIDIA:KFDIA) = ZTMP(KIDIA:KFDIA) + ZXTTE(KIDIA:KFDIA,JK,JH) END DO PGFL(KIDIA:KFDIA,JO,JY) = ZTMP(KIDIA:KFDIA) END DO @@ -2053,86 +1912,31 @@ SUBROUTINE HAMM7_INTERFACE( & JO=ind_oifs_ham%ind_class_OIFS(JN) ! JO -> index context OIFS JH=ind_oifs_ham%IND_class_HAM(JN) ! JH -> index context HAM JY=YAEROUT(8)%MP - ZTMP=0.0 + ZTMP=0.0_JPRB DO JK=1,KLEV - !PGFL(KIDIA:KFDIA,JO,JY) = PGFL(KIDIA:KFDIA,JO,JY)+ZXTTE(KIDIA:KFDIA,JK,JH) - ZTMP(KIDIA:KFDIA) = ZTMP(KIDIA:KFDIA) + ZXTTE(KIDIA:KFDIA,JK,JH) + ZTMP(KIDIA:KFDIA) = ZTMP(KIDIA:KFDIA) + ZXTTE(KIDIA:KFDIA,JK,JH) END DO PGFL(KIDIA:KFDIA,JO,JY) = ZTMP(KIDIA:KFDIA) END DO - DO JN=1,NAEROCOMP !ntrac!NACTAERO JO=ind_oifs_ham%ind_mass_OIFS(JN) ! JO -> index context OIFS JH=ind_oifs_ham%IND_mass_HAM(JN) ! JH -> index context HAM JY=YAEROUT(12)%MP - ZTMP=0.0 - !DO JK=1,KLEV - !PGFL(KIDIA:KFDIA,JO,JY) = PGFL(KIDIA:KFDIA, JO, JY) + (ZXTM1(KIDIA:KFDIA,JK,JH)+(ZXTTE(KIDIA:KFDIA,JK,JH)*TIME_STEP_LEN)) * ZDPG(KIDIA:KFDIA,JK) + ZTMP=0.0_JPRB ZTMP(KIDIA:KFDIA)= ZXTM1(KIDIA:KFDIA,KLEV,JH)+(ZXTTE(KIDIA:KFDIA,KLEV,JH)*TIME_STEP_LEN)!*ZDPG(KIDIA:KFDIA,KLEV) - !END DO - PGFL(KIDIA:KFDIA,JO,JY) = ZTMP(KIDIA:KFDIA) + PGFL(KIDIA:KFDIA,JO,JY) = ZTMP(KIDIA:KFDIA) END DO DO JN=1,NCLASS JO=ind_oifs_ham%ind_class_OIFS(JN) ! JO -> index context OIFS JH=ind_oifs_ham%IND_class_HAM(JN) ! JH -> index context HAM JY=YAEROUT(12)%MP - ZTMP=0.0 - !DO JK=1,KLEV - !PGFL(KIDIA:KFDIA,JO,JY) = PGFL(KIDIA:KFDIA, JO, JY) + (ZXTM1(KIDIA:KFDIA,JK,JH)+(ZXTTE(KIDIA:KFDIA,JK,JH)*TIME_STEP_LEN)) * ZDPG(KIDIA:KFDIA,JK) + ZTMP=0.0_JPRB ZTMP(KIDIA:KFDIA) = ZXTM1(KIDIA:KFDIA,KLEV,JH)+(ZXTTE(KIDIA:KFDIA,KLEV,JH)*TIME_STEP_LEN)!*PRHO(KIDIA:KFDIA,KLEV) - !END DO PGFL(KIDIA:KFDIA,JO,JY) = ZTMP(KIDIA:KFDIA) END DO - !PGFL(KIDIA:KFDIA,1,YAEROUT(6)%MP)=PAERFLX(KIDIA:KFDIA,3,9) - !PGFL(KIDIA:KFDIA,:,YAEROUT(7)%MP)=0.0_JPRB - ! 1=TOtal SO4 not in use - ! 2 Ammonium not in use - ! 3 Nitrate not in use - !DO JK=1,KLEV - ! ! save load for each N/M as one level - ! ! kg/kg -> kg/m2 N/kg-> N/m2 - ! DO JN=1,NAEROCOMP !ntrac!NACTAERO - ! JO=ind_oifs_ham%ind_mass_OIFS(JN) ! JO -> index context OIFS - ! JH=ind_oifs_ham%IND_mass_HAM(JN) ! JH -> index context HAM - ! JY=YAEROUT(7)%MP - ! PGFL(KIDIA:KFDIA,JO,JY) = PGFL(KIDIA:KFDIA, JO, JY) + (ZXTM1(KIDIA:KFDIA,JK,JH)+(ZXTTE(KIDIA:KFDIA,JK,JH)*TIME_STEP_LEN)) * ZDPG(KIDIA:KFDIA,JK) - ! END DO - ! DO JN=1,NCLASS - ! JO=ind_oifs_ham%ind_mass_OIFS(JN) ! JO -> index context OIFS - ! JH=ind_oifs_ham%IND_mass_HAM(JN) ! JH -> index context HAM - ! JY=YAEROUT(7)%MP - ! PGFL(KIDIA:KFDIA,JO,JY) = PGFL(KIDIA:KFDIA, JO, JY) + (ZXTM1(KIDIA:KFDIA,JK,JH)+(ZXTTE(KIDIA:KFDIA,JK,JH)*TIME_STEP_LEN)) * ZDPG(KIDIA:KFDIA,JK) - ! END DO - !END DO - - !IF (.NOT. LAERCHEM) THEN ! FIXME : THIS IS PARTLY OVERWRITTEN RIGHT AFTER - ! PGFL(KIDIA:KFDIA,1,YAEROUT(8)%MP) = ZDDEPFLUX_SO2(KIDIA:KFDIA) ! aergn7 SO4 gas - ! PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(9)%MP) = PGFL(KIDIA:KFDIA,1:KLEV,YAEROCLIM(1)%MP) - ! PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(10)%MP) = PGFL(KIDIA:KFDIA,1:KLEV,YAEROCLIM(2)%MP) - ! PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(11)%MP) = PGFL(KIDIA:KFDIA,1:KLEV,YAEROCLIM(3)%MP) - !END IF - !PGFL(KIDIA:KFDIA,1,YAEROUT(9)%MP) = PCCNL(KIDIA:KFDIA) - !PGFL(KIDIA:KFDIA,2,YAEROUT(9)%MP) = PCCNO(KIDIA:KFDIA) - !PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(10)%MP) = PFPLSL(KIDIA:KFDIA,1:KLEV) - !PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(11)%MP) = PFPLSN(KIDIA:KFDIA,1:KLEV) - - !PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(12)%MP) = PGFL(KIDIA:KFDIA,1:KLEV,YRE_LIQ%MP9_PH) - !PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(13)%MP) = PGFL(KIDIA:KFDIA,1:KLEV,YRE_ICE%MP9_PH) - !PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(14)%MP) = PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH) - !PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(15)%MP) = PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH) - !PGFL(KIDIA:KFDIA,KLEV,YAEROUT(16)%MP) = ZDUMMY(KIDIA:KFDIA,17) ! SS CS wdepflux - !PGFL(KIDIA:KFDIA,KLEV-1,YAEROUT(16)%MP) = ZDUMMY(KIDIA:KFDIA,7) ! SO4 CS wdepflux - !PGFL(KIDIA:KFDIA,KLEV-2,YAEROUT(16)%MP) = ZDUMMY(KIDIA:KFDIA,25) ! NUM CS wdepflux - - !PGFL(KIDIA:KFDIA,KLEV,YAEROUT(17)%MP) = ZDDEPFLUX(KIDIA:KFDIA,25) ! drydep flux NUM CS ham - !PGFL(KIDIA:KFDIA,KLEV-1,YAEROUT(17)%MP) = ZDDEPFLUX(KIDIA:KFDIA,17) ! drydep flux SS CS ham - !PGFL(KIDIA:KFDIA,KLEV-2,YAEROUT(17)%MP) = ZDDEPFLUX(KIDIA:KFDIA,7) ! drydep flux SO4 CS ham - !PGFL(KIDIA:KFDIA,KLEV,YAEROUT(18)%MP) = ZVDEP(KIDIA:KFDIA,25) ! ddepveloc NUM CS ham - !PGFL(KIDIA:KFDIA,KLEV-1,YAEROUT(18)%MP) = ZVDEP(KIDIA:KFDIA,17) ! ddepveloc SS CS ham - !PGFL(KIDIA:KFDIA,KLEV-2,YAEROUT(18)%MP) = ZVDEP(KIDIA:KFDIA,7) ! ddepveloc SO4 CS ham PGFL(KIDIA:KFDIA,KLEV,YAEROUT(19)%MP) = ZXTTE(KIDIA:KFDIA,KLEV,3) ! tendency SS CS ham after update surface PGFL(KIDIA:KFDIA,KLEV-1,YAEROUT(20)%MP) = ZTENCIH(KIDIA:KFDIA,KLEV,17) ! tendency SS CS ham before update surface PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(21)%MP) = ZXTMD1(KIDIA:KFDIA,1:KLEV,17) ! mix rat SS CS ham before update diff --git a/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 index 5149356b..d510c2c4 100644 --- a/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 +++ b/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 @@ -214,7 +214,6 @@ SUBROUTINE TM5M7_SRC( & #include "surf_inq.h" #include "tm5m7_src_ss.intfb.h" -#include "tm5m7_src_ss_lhw.intfb.h" #include "tm5m7_src_dust.intfb.h" !#include "satur.intfb.h" !#include "aer_volce.intfb.h" @@ -250,6 +249,7 @@ SUBROUTINE TM5M7_SRC( & ! All surface fluxes PCFLUX in kg m-2 s-1 !----------------------------------------------------------------------- + !* 0.1 TIME AND DATE OF THE MODEL ! -------------------------- IY0=NCCAA(NINDAT) @@ -356,7 +356,7 @@ SUBROUTINE TM5M7_SRC( & ZBCFF(KIDIA:KFDIA) = 0.0_JPRB ZBCBF(KIDIA:KFDIA) = 0.0_JPRB ZBCGF(KIDIA:KFDIA) = 0.0_JPRB -ZCFLX = 0.0_JPRB +ZCFLX(KIDIA:KFDIA,:) = 0.0_JPRB !----------------------------------------------------------------------- @@ -402,9 +402,6 @@ SUBROUTINE TM5M7_SRC( & & emis_mass, emis_number ) -!CALL TM5M7_SRC_SS_LHW( KIDIA, KFDIA, KLON, KLEV, & -! & PCI, PCLAKE, PLSM, PSST, ZWNDSS, & -! & emis_mass, emis_number ) !----------------------------------------------------------------------- !* 2.0 DESERT DUST @@ -437,7 +434,7 @@ SUBROUTINE TM5M7_SRC( & !---------------------------------------------------------------------- !* 5.0 Convert emissions into tendencies: loop over tracers in mode ! ------------ -! CALL ADD_TOFLUX() ! -> only used for CY43R3 +! CALL ADD_TOFLUX() ! -> only used for CY43R3 ! ! ! RCHG -> in the case of CY48R1 the emissions non-interactive (all except SS and DUST) @@ -449,20 +446,15 @@ SUBROUTINE TM5M7_SRC( & ! store emissions. Probably we can directly store in PAERSRC array, but ! I keep current implementation. - ! PEMIDIAG(JL,KAERO(JN))=PEMIDIAG(JL,JN)+sum(emit(JL,:)) - ! DO JK=1,KLEV - ! !PCFLX(JL,KAERO(JN))=PCFLX(JL,KAERO(JN))+emit(JL,JK) - ! PTENC(JL,JK,KAERO(JN))=PTENC(JL,JK,KAERO(JN))+emit(JL,JK) * RG /PDELP(JL,JK) - ! ENDDO DO JL=KIDIA,KFDIA - PCFLX(JL,KAERO(iacs_n)) = 0.0!PCFLX(JL,KAERO(iacs_n)) !+ emis_number(mode_acs)%d3(JL,KLEV,4)*(-1._JPRB) - PCFLX(JL,KAERO(icos_n)) = 0.0!PCFLX(JL,KAERO(icos_n)) !+ emis_number(mode_cos)%d3(JL,KLEV,4)*(-1._JPRB) - PCFLX(JL,KAERO(issacs)) = 0.0!PCFLX(JL,KAERO(issacs)) !+ emis_mass(mode_acs)%d3(JL,KLEV,4)*(-1._JPRB) - PCFLX(JL,KAERO(isscos)) = 0.0!PCFLX(JL,KAERO(isscos)) !+ emis_mass(mode_cos)%d3(JL,KLEV,4)*(-1._JPRB) - PCFLX(JL,KAERO(iaci_n)) = 0.0!PCFLX(JL,KAERO(iaci_n)) !+ emis_number(mode_aci)%d3(JL,KLEV,1)*(-1._JPRB) - PCFLX(JL,KAERO(icoi_n)) = 0.0!PCFLX(JL,KAERO(icoi_n)) !+ emis_number(mode_coi)%d3(JL,KLEV,1)*(-1._JPRB) - PCFLX(JL,KAERO(iduaci)) = 0.0!PCFLX(JL,KAERO(iduaci)) !+ emis_mass(mode_aci)%d3(JL,KLEV,1)*(-1._JPRB) - PCFLX(JL,KAERO(iducoi)) = 0.0!PCFLX(JL,KAERO(iducoi)) !+ emis_mass(mode_coi)%d3(JL,KLEV,1)*(-1._JPRB) + PCFLX(JL,KAERO(iacs_n)) = 0.0 + PCFLX(JL,KAERO(icos_n)) = 0.0 + PCFLX(JL,KAERO(issacs)) = 0.0 + PCFLX(JL,KAERO(isscos)) = 0.0 + PCFLX(JL,KAERO(iaci_n)) = 0.0 + PCFLX(JL,KAERO(icoi_n)) = 0.0 + PCFLX(JL,KAERO(iduaci)) = 0.0 + PCFLX(JL,KAERO(iducoi)) = 0.0 ZCFLX(JL,KAERO(iacs_n)) = emis_number(mode_acs)%d3(JL,KLEV,4)*(-1._JPRB) ZCFLX(JL,KAERO(icos_n)) = emis_number(mode_cos)%d3(JL,KLEV,4)*(-1._JPRB) @@ -476,43 +468,23 @@ SUBROUTINE TM5M7_SRC( & PTENC(JL,KLEV, KAERO(iacs_n)) = PTENC(JL,KLEV, KAERO(iacs_n)) + emis_number(mode_acs)%d3(JL,KLEV,4) * RG / PDELP(JL,KLEV) PTENC(JL,KLEV, KAERO(icos_n)) = PTENC(JL,KLEV, KAERO(icos_n)) + emis_number(mode_cos)%d3(JL,KLEV,4) * RG / PDELP(JL,KLEV) PTENC(JL,KLEV, KAERO(issacs)) = PTENC(JL,KLEV, KAERO(issacs)) + emis_mass(mode_acs)%d3(JL,KLEV,4) * RG / PDELP(JL,KLEV) - PTENC(JL,KLEV, KAERO(isscos)) = PTENC(JL,KLEV, KAERO(isscos)) + emis_mass(mode_cos)%d3(JL,KLEV,4) * RG / PDELP(JL,KLEV) - + PTENC(JL,KLEV, KAERO(isscos)) = PTENC(JL,KLEV, KAERO(isscos)) + emis_mass(mode_cos)%d3(JL,KLEV,4) * RG / PDELP(JL,KLEV) + PTENC(JL,KLEV, KAERO(iaci_n)) = PTENC(JL,KLEV, KAERO(iaci_n)) + emis_number(mode_aci)%d3(JL,KLEV,1) * RG / PDELP(JL,KLEV) PTENC(JL,KLEV, KAERO(icoi_n)) = PTENC(JL,KLEV, KAERO(icoi_n)) + emis_number(mode_coi)%d3(JL,KLEV,1) * RG / PDELP(JL,KLEV) PTENC(JL,KLEV, KAERO(iduaci)) = PTENC(JL,KLEV, KAERO(iduaci)) + emis_mass(mode_aci)%d3(JL,KLEV,1) * RG / PDELP(JL,KLEV) PTENC(JL,KLEV, KAERO(iducoi)) = PTENC(JL,KLEV, KAERO(iducoi)) + emis_mass(mode_coi)%d3(JL,KLEV,1) * RG / PDELP(JL,KLEV) ENDDO -!write(*,*)"PDELP",PDELP(:,klev)/RG -!write(*,*)"RG",RG - - !write(*,*)"aerini emission" - !write(*,*)"KAERO(iacs_n)",KAERO(iacs_n) - !write(*,*)"PTENC(JL,KLEV, KAERO(iacs_n))",PTENC(:,KLEV, KAERO(iacs_n)) - !write(*,*)"KAERO(icos_n)",KAERO(icos_n) - !write(*,*)"PTENC(JL,KLEV, KAERO(icos_n))",PTENC(:,KLEV, KAERO(icos_n)) - !write(*,*)"KAERO(issacs)",KAERO(issacs)!!!=8 - !write(*,*)"PTENC(JL,KLEV, KAERO(issacs))",PTENC(:,KLEV, KAERO(issacs)) - !write(*,*)"KAERO(isscos)",KAERO(isscos)!!!=31 - !write(*,*)"PTENC(JL,KLEV, KAERO(isscos))",PTENC(:,KLEV, KAERO(isscos)) - !write(*,*)"KAERO(iaci_n)",KAERO(iaci_n) - !write(*,*)"PTENC(JL,KLEV, KAERO(iaci_n))",PTENC(:,KLEV, KAERO(iaci_n)) - !write(*,*)"KAERO(iaci_n)",KAERO(icoi_n) - !write(*,*)"PTENC(JL,KLEV, KAERO(icoi_n))",PTENC(:,KLEV, KAERO(icoi_n)) - - DO JL=KIDIA,KFDIA - DO IMODE=1,NMOD ! loop in each mode - DO INMODE=0,MODE_NM_SED(IMODE) ! loop in aerosols species per mode - JN = MODE_TRACERS_SED(INMODE,IMODE) ! retrieve indentifier of each specie - !PEMIDIAG(JL,KAERO(JN))=PCFLX(JL,KAERO(JN)) ! assign PCFLX to emissions (we still not added dep. to PCFLX) - PEMIDIAG(JL,KAERO(JN))= PEMIDIAG(JL,KAERO(JN)) + ZCFLX(JL,KAERO(JN))*(-1._JPRB) ! assign PCFLX to emissions (we still not added dep. to PCFLX) - ENDDO - ENDDO - ENDDO - !write(*,*)"tm5m7_src PCFLX(KIDIA:KFDIA,16)",maxval(abs(PCFLX(KIDIA:KFDIA,16))) - !write(*,*)"PEMIDIAG(JL,KAERO(JN))",maxval(abs(PEMIDIAG(:,16))) +DO JL=KIDIA,KFDIA + DO IMODE=1,NMOD ! loop in each mode + DO INMODE=0,MODE_NM_SED(IMODE) ! loop in aerosols species per mode + JN = MODE_TRACERS_SED(INMODE,IMODE) ! retrieve indentifier of each specie + PEMIDIAG(JL,KAERO(JN))= PEMIDIAG(JL,KAERO(JN)) + ZCFLX(JL,KAERO(JN))*(-1._JPRB) ! assign ZCFLX to emissions (we still not added dep. to PCFLX) + ENDDO + ENDDO +ENDDO ! RCHG -> This is outside the previous loop so it is important to initialize PEMIDIAG(:,:) = 0. ! at begining of this subroutine. Note that here we are not filling PCFLX @@ -919,7 +891,7 @@ SUBROUTINE BC_SRC_43R3() END SUBROUTINE SUBROUTINE ADD_TOFLUX() - emit(KIDIA:KFDIA,:) = 0.0 + emit(KIDIA:KFDIA,:) = 0.0 DO IMODE=1,NMOD ! loop in each mode DO INMODE=0,MODE_NM_SED(IMODE) ! loop in aerosols species per mode JN = MODE_TRACERS_SED(INMODE,IMODE) ! retrieve indentifier of each specie @@ -944,39 +916,16 @@ SUBROUTINE ADD_TOFLUX() ! write(2020,*)jk,emit(jl,jk) !end if !write(2929,*)JN,KAERO(JN) - !PEMIDIAG(JL,KAERO(JN))=PEMIDIAG(JL,JN)+sum(emit(JL,:)) PEMIDIAG(JL,KAERO(JN))=PEMIDIAG(JL,KAERO(JN))+sum(emit(JL,:)) DO JK=1,KLEV !PCFLX(JL,KAERO(JN))=PCFLX(JL,KAERO(JN))+emit(JL,JK) + PTENC(JL,JK,KAERO(JN))=PTENC(JL,JK,KAERO(JN))+emit(JL,JK) * RG /PDELP(JL,JK) ENDDO ENDDO - ENDDO ENDDO - -! PTENC(JL,KLEV, KAERO(iacs_n)) = PTENC(JL,KLEV, KAERO(iacs_n)) + emis_number(mode_acs)%d3(JL,KLEV,4) * RG / PDELP(JL,KLEV) -! PTENC(JL,KLEV, KAERO(icos_n)) = PTENC(JL,KLEV, KAERO(icos_n)) + emis_number(mode_cos)%d3(JL,KLEV,4) * RG / PDELP(JL,KLEV) -! PTENC(JL,KLEV, KAERO(issacs)) = PTENC(JL,KLEV, KAERO(issacs)) + emis_mass(mode_acs)%d3(JL,KLEV,4) * RG / PDELP(JL,KLEV) -! PTENC(JL,KLEV, KAERO(isscos)) = PTENC(JL,KLEV, KAERO(isscos)) + emis_mass(mode_cos)%d3(JL,KLEV,4) * RG / PDELP(JL,KLEV) -! PTENC(JL,KLEV, KAERO(iaci_n)) = PTENC(JL,KLEV, KAERO(iaci_n)) + emis_number(mode_aci)%d3(JL,KLEV,1) * RG / PDELP(JL,KLEV) -! PTENC(JL,KLEV, KAERO(icoi_n)) = PTENC(JL,KLEV, KAERO(icoi_n)) + emis_number(mode_coi)%d3(JL,KLEV,1) * RG / PDELP(JL,KLEV) -! PTENC(JL,KLEV, KAERO(iduaci)) = PTENC(JL,KLEV, KAERO(iduaci)) + emis_mass(mode_aci)%d3(JL,KLEV,1) * RG / PDELP(JL,KLEV) -! PTENC(JL,KLEV, KAERO(iducoi)) = PTENC(JL,KLEV, KAERO(iducoi)) + emis_mass(mode_coi)%d3(JL,KLEV,1) * RG / PDELP(JL,KLEV) -! write(*,*) "old" -! write(*,*)"KAERO(iacs_n)",KAERO(iacs_n) -! write(*,*)"PTENC(JL,KLEV, KAERO(iacs_n))",PTENC(:,KLEV, KAERO(iacs_n)) -! write(*,*)"PTENC(JL,KLEV-1, KAERO(iacs_n))",PTENC(:,KLEV-1, KAERO(iacs_n)) -! write(*,*)"KAERO(icos_n)",KAERO(icos_n) -! write(*,*)"PTENC(JL,KLEV, KAERO(icos_n))",PTENC(:,KLEV, KAERO(icos_n)) -! write(*,*)"PTENC(JL,KLEV-1, KAERO(icos_n))",PTENC(:,KLEV-1, KAERO(icos_n)) -! write(*,*)"KAERO(issacs)",KAERO(issacs) -! write(*,*)"PTENC(JL,KLEV, KAERO(issacs))",PTENC(:,KLEV, KAERO(issacs)) -! write(*,*)"KAERO(isscos)",KAERO(isscos) -! write(*,*)"PTENC(JL,KLEV, KAERO(isscos))",PTENC(:,KLEV, KAERO(isscos)) -! write(*,*)"KAERO(iaci_n)",KAERO(iaci_n) -! write(*,*)"PTENC(JL,KLEV, KAERO(iaci_n))",PTENC(:,KLEV, KAERO(iaci_n)) END SUBROUTINE END SUBROUTINE TM5M7_SRC diff --git a/ifs-source/arpifs/phys_ec/compo_apply_emissions.F90 b/ifs-source/arpifs/phys_ec/compo_apply_emissions.F90 index 379d11b1..52bca6b1 100644 --- a/ifs-source/arpifs/phys_ec/compo_apply_emissions.F90 +++ b/ifs-source/arpifs/phys_ec/compo_apply_emissions.F90 @@ -301,10 +301,8 @@ SUBROUTINE APPLY_2D_EMISSION( KSPECIES, YDSPECIES, YDEMIS_DESC, LDDIAGFLUX,& ENDIF ! This is the surface / total column flux after scaling and diurnal cycle application - !write(*,*)"ITRAC",ITRAC - !write(*,*)"YDEMIS_DESC%PARAM_INDEX",YDEMIS_DESC%PARAM_INDEX ZFLUX(KIDIA:KFDIA) = - PEMIS2D(KIDIA:KFDIA,YDEMIS_DESC%PARAM_INDEX) * ZDIURN(KIDIA:KFDIA) * YDEMIS_DESC%SCALING - !write(*,*)"ZFLUX",maxval(ZFLUX) + ! HERE we have the ZFLUX and where is there we need to call a new function that digest the input of PSD_* ! and change the ZFLUX of the tracer with number of particles @@ -443,19 +441,10 @@ SUBROUTINE APPLY_2D_EMISSION( KSPECIES, YDSPECIES, YDEMIS_DESC, LDDIAGFLUX,& IF (YDEMIS_DESC%PSD_N0_TRACER /= 'NONE') THEN CALL GET_2D_EMISSION_M7_NUMPAR( JSPECIES, KSPECIES, YDSPECIES, YDEMIS_DESC, ZPROFILE, KINDEX, & & ZFLUX, ZFLUX_NUM, ZSFCFLUX_NUM, ITRAC_NUM) - !write(*,*)"PTENC(KIDIA:KFDIA,JK,ITRAC_NUM)",maxval(abs(PTENC(KIDIA:KFDIA,KLEV,ITRAC_NUM))) DO JK=1,KLEV PTENC(KIDIA:KFDIA,JK,ITRAC_NUM) = PTENC(KIDIA:KFDIA,JK,ITRAC_NUM) - ZPROFILE(KIDIA:KFDIA,JK) * ZFLUX_NUM(KIDIA:KFDIA) ENDDO - !write(*,*)"ITRAC",ITRAC - !write(*,*)"ITRAC_NUM",ITRAC_NUM - !write(*,*)"ZFLUX",ZFLUX - !write(*,*)"ZFLUX_NUM",ZFLUX_NUM - !write(*,*)"YDSPECIES(JSPECIES)%CNAME",YDSPECIES(JSPECIES)%CNAME - !write(*,*)"PTENC(KIDIA:KFDIA,JK,ITRAC_NUM)",maxval(abs(PTENC(KIDIA:KFDIA,KLEV,ITRAC_NUM))) PCFLX(KIDIA:KFDIA,ITRAC_NUM) = PCFLX(KIDIA:KFDIA,ITRAC_NUM) + ZFLUX_NUM(KIDIA:KFDIA) - !write(*,*)"PCFLX(KIDIA:KFDIA,ITRAC_NUM)",maxval(abs(PCFLX(KIDIA:KFDIA,ITRAC_NUM))) - !write(*,*)"PCFLX(KIDIA:KFDIA,16)",maxval(abs(PCFLX(KIDIA:KFDIA,16))) ENDIF KFOUND = KFOUND + 1 @@ -632,8 +621,6 @@ SUBROUTINE GET_2D_EMISSION_M7_NUMPAR( JSPECIES, KSPECIES, YDSPECIES, YDEMIS_DESC ! words: DENSITY(1:NACTAERO) with DENSITY = DENSITY(KAERO(ITRAC_NUM)) ! !----------------------------------------------------------------------------------------------- - !NUM_SCALE = EXP(1.5*(LOG(YDEMIS_DESC%PSD_SIGMA))**2) - !MASS_TO_NUM_PSD = 3./(4.*RPI*(NUM_SCALE**3)*YDEMIS_DESC%MASS_DENSITY) ! RPI -> real pi inherited from main sub. NUM_SCALE = EXP(4.5*(LOG(YDEMIS_DESC%PSD_SIGMA))**2) MASS_TO_NUM_PSD = 3./(4.*RPI*NUM_SCALE*YDEMIS_DESC%MASS_DENSITY) ! RPI -> real pi inherited from main sub. MASS_TO_NUM_EMI = MASS_TO_NUM_PSD/(YDEMIS_DESC%PSD_RADIUS**3) From 948659ccde456b813c8c92dec9ee0ca8be0a163d Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Wed, 22 Jan 2025 16:33:09 +0100 Subject: [PATCH 039/129] Remove unneeded and potentially dangerous initialization --- ifs-source/arpifs/m7/phys_ec/tm5m7_optics_aop_get.F90 | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/ifs-source/arpifs/m7/phys_ec/tm5m7_optics_aop_get.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_optics_aop_get.F90 index 6e0c3957..e4d4b7eb 100644 --- a/ifs-source/arpifs/m7/phys_ec/tm5m7_optics_aop_get.F90 +++ b/ifs-source/arpifs/m7/phys_ec/tm5m7_optics_aop_get.F90 @@ -223,11 +223,6 @@ SUBROUTINE TM5M7_OPTICS_AOP_GET(YGFL, YREAERSRC, KIDIA,KFDIA,KLON, KLEV, NACTAER where( aop_in(KIDIA:KFDIA,1:KLEV)%rg (7) .lt. 1.E-15_JPRB ) aop_in(KIDIA:KFDIA,1:KLEV)%rg (7) = 1.E-15_JPRB where( aop_in(KIDIA:KFDIA,1:KLEV)%rgd(7) .lt. 1.E-15_JPRB ) aop_in(KIDIA:KFDIA,1:KLEV)%rgd(7) = 1.E-15_JPRB - - ! Initialization to zero is done in tm5m7_optics_calculate_aop - Paop_out_ext=0.0_JPRB - Paop_out_a=0.0_JPRB - Paop_out_g=0.0_JPRB if (present(aop_out_add)) then call tm5m7_optics_calculate_aop(KIDIA,KFDIA, KLON,KLEV, nwav,NCONTR, wdep, ecearth_units, & & AOP_IN, & @@ -241,11 +236,6 @@ SUBROUTINE TM5M7_OPTICS_AOP_GET(YGFL, YREAERSRC, KIDIA,KFDIA,KLON, KLEV, NACTAER ! OK Deallocate( aop_in ) - - - - - IF(LHOOK) CALL DR_HOOK('TM5M7_OPTICS_AOP_GET',1,ZHOOK_HANDLE) end associate END SUBROUTINE TM5M7_OPTICS_AOP_GET From 57eab6faec4c77bde3b87c103569fd1067e3b938 Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Fri, 24 Jan 2025 20:17:20 +0000 Subject: [PATCH 040/129] Pull request #19: Update M7-based ifs-test, fixes for GNU Merge in ~NM6/openifs-48r1 from fix-ifs-m7-tests to knmi-m7 Squashed commit of the following: commit 421210fbbc89d48eb49b751ef0a2fb9ad3dc3633 Author: Philippe Le Sager Date: Fri Jan 24 21:01:49 2025 +0100 Fix bug in LCHEM_DIA; M7 tests: new default for DUST/SSALT, mute t21 commit 062743813fb8bbc8fc15d4b6a1650089a5f116a6 Author: Philippe Le Sager Date: Fri Jan 24 15:49:40 2025 +0100 Fix LW AOD and emission namelist for T255 M7 test commit cf9a3996d0a7e60f1776117d98233f01ae5da520 Author: Philippe Le Sager Date: Thu Jan 23 15:43:03 2025 +0100 Fix M7 ifs-test namelist for default branch commit ab4e9192996d6d26c76d52f3233a778873277133 Author: Philippe Le Sager Date: Thu Jan 23 13:19:00 2025 +0100 Update M7-based ifs-test Add missing files for M7-based ifs-test, although still broken at t21. Update t255 test (IC, emissions, namelist) which was broken after PR18. --- .../arpifs/m7/phys_ec/hamm7_interface.F90 | 5 +- ifs-test/tests/t21/CMakeLists.txt | 12 +- ifs-test/tests/t21/common/m7/m7_aero.nml | 162 +- ifs-test/tests/t21/ifsdata/rtablel_2095 | 98 + .../tests/t21/test_compo_fc_m7_noemi/setup | 12 +- .../tests/t21/test_compo_fc_m7_norad/setup | 6 +- ifs-test/tests/t255/common/CMakeLists.txt | 1 + .../tests/t255/common/m7/fort.4-oac-adapted | 4995 +++++++++++++++++ .../tests/t255/common/m7/m7_compoemis.nml | 2897 +++++++++- ifs-test/tests/t255/ifsdata/rtablel_2095 | 1 + ifs-test/tests/t255/ifsdata/rtables | 1 - .../t255/inidata/PLS_ICMCLham7INIT_COMPO | 2 +- ifs-test/tests/t255/inidata/PLS_ICMGGham7INIT | 2 +- ifs-test/tests/t255/test_compo_fc_m7/setup | 346 +- 14 files changed, 7982 insertions(+), 558 deletions(-) create mode 100755 ifs-test/tests/t21/ifsdata/rtablel_2095 create mode 100644 ifs-test/tests/t255/common/m7/fort.4-oac-adapted create mode 120000 ifs-test/tests/t255/ifsdata/rtablel_2095 delete mode 120000 ifs-test/tests/t255/ifsdata/rtables diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index f118583f..c8ff059b 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -1494,7 +1494,7 @@ SUBROUTINE HAMM7_INTERFACE( & END SELECT ! write flux to extra fields for diagnostic of aerosol 'chemical' conversion -IF (LCHEM_DIA) THEN +IF (.NOT. LAERCHEM .AND. LCHEM_DIA) THEN ! As of 2025-01-24, ZTSO4 is filled only if LAERCHEM=F CALL CHEM_INEXT( KIDIA , KFDIA , KLON , KLEV , 1, 1, & & ZDP, PTSPHY, ZTSO4, ZTENC0,PEXTRA(:,ISO4_C,IEXTR_CH)) END IF @@ -1720,6 +1720,7 @@ SUBROUTINE HAMM7_INTERFACE( & PFAOD(KIDIA:KFDIA,:)=0._JPRB PSSA (KIDIA:KFDIA,:)=0._JPRB PASY (KIDIA:KFDIA,:)=0._JPRB +PAOD_LW(KIDIA:KFDIA,:)=0._JPRB DO JK = 1, KLEV DO JL = KIDIA,KFDIA @@ -1815,7 +1816,7 @@ SUBROUTINE HAMM7_INTERFACE( & PGFL(KIDIA:KFDIA,2,YAEROUT(1)%MP)=PSSA(KIDIA:KFDIA,10) !PAER_TAU(KIDIA:KFDIA,1:KLEV,10) !533nm PGFL(KIDIA:KFDIA,3,YAEROUT(1)%MP)=PASY(KIDIA:KFDIA,10) !PAER_TAU(KIDIA:KFDIA,1:KLEV,10) !533nm - PGFL(KIDIA:KFDIA,10:26,YAEROUT(1)%MP)= PAOD_LW(KIDIA:KFDIA,1:16) + PGFL(KIDIA:KFDIA,10:25,YAEROUT(1)%MP)= PAOD_LW(KIDIA:KFDIA,1:16) ! RCHG: It seems that here 1:14 refers to 14 species. PLS: AOD of 14 short wavelengths stored in YAEROUT(12)%MP of first 14 tracers (juggling!!) PGFL(KIDIA:KFDIA,1:14,YAEROUT(27)%MP)=PAOD(KIDIA:KFDIA,1:14) diff --git a/ifs-test/tests/t21/CMakeLists.txt b/ifs-test/tests/t21/CMakeLists.txt index 7d207961..900c2a8c 100644 --- a/ifs-test/tests/t21/CMakeLists.txt +++ b/ifs-test/tests/t21/CMakeLists.txt @@ -180,6 +180,10 @@ function( add_ifs_test TARGET ) ${INIDATA_PATH}/ICMGGhmecINIT ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/ICMGGhmecIMIN ) endif() endif() + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${COMPO_DATA_PATH}/m7/lut_optical_properties_lw_M7.nc ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/lut_optical_properties_lw_M7.nc) + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${COMPO_DATA_PATH}/m7/lut_optical_properties_M7.nc ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/lut_optical_properties_M7.nc) execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink ${COMPO_DATA_PATH}/m7/lookup_table.nc ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/lookup_table.nc) execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink @@ -323,8 +327,8 @@ add_ifs_test( test_compo_cb05bascoe_fc ) add_ifs_test( test_compo_chemonly_RnPb_fc ) add_ifs_test( test_compo_chemonly_nwpo3_fc ) add_ifs_test( test_compo_updclie ) -add_ifs_test( test_compo_fc_m7_noemi ) -add_ifs_test( test_compo_fc_m7_norad ) +# add_ifs_test( test_compo_fc_m7_noemi ) # in development +# add_ifs_test( test_compo_fc_m7_norad ) # in development # Tests which will not succeed in OpenIFS-only builds. if( NOT ifs_HAVE_OPENIFS_ONLY ) @@ -387,8 +391,8 @@ if( ENABLE_TESTS ) set_property(TEST ifs_t21_test_compo_chemonly_nwpo3_fc APPEND PROPERTY LABELS forecast mpi threading composition nwpo3) set_property(TEST ifs_t21_test_compo_updclie APPEND PROPERTY LABELS forecast mpi threading composition climate mcc_compo) - set_property(TEST ifs_t21_test_compo_fc_m7_noemi APPEND PROPERTY LABELS forecast mpi threading composition m7) - set_property(TEST ifs_t21_test_compo_fc_m7_norad APPEND PROPERTY LABELS forecast mpi threading composition m7) + # set_property(TEST ifs_t21_test_compo_fc_m7_noemi APPEND PROPERTY LABELS forecast mpi threading composition m7) + # set_property(TEST ifs_t21_test_compo_fc_m7_norad APPEND PROPERTY LABELS forecast mpi threading composition m7) # Tests to include if this is not an OpenIFS-only build: if( NOT ifs_HAVE_OPENIFS_ONLY ) diff --git a/ifs-test/tests/t21/common/m7/m7_aero.nml b/ifs-test/tests/t21/common/m7/m7_aero.nml index d5afe234..5fd6a4f9 100644 --- a/ifs-test/tests/t21/common/m7/m7_aero.nml +++ b/ifs-test/tests/t21/common/m7/m7_aero.nml @@ -1,127 +1,130 @@ cat >> fort.4 << EOF -NAERO=37, -NACTAERO=37, +NAERO=40, +NACTAERO=39, YAERO_NL(1)%CNAME='SO4', YAERO_NL(1)%IGRBCODE=210011, YAERO_NL(1)%LMASSFIX=.true., -!YAERO_NL(1)%LCOMAD=.true., +YAERO_NL(1)%LCOMAD=.true., YAERO_NL(1)%LQM=.false., YAERO_NL(1)%LQM3D=.true., YAERO_NL(1)%BETAMFBC=-999, YAERO_NL(1)%LADV=.true., YAERO_NL(1)%NREQIN=0, + YAERO_NL(2)%CNAME='NH4', YAERO_NL(2)%IGRBCODE=212035, YAERO_NL(2)%LMASSFIX=.true., -!YAERO_NL(2)%LCOMAD=.true., +YAERO_NL(2)%LCOMAD=.true., YAERO_NL(2)%LQM=.false., YAERO_NL(2)%LQM3D=.true., YAERO_NL(2)%BETAMFBC=-999, YAERO_NL(2)%LADV=.true., YAERO_NL(2)%NREQIN=0, + YAERO_NL(3)%CNAME='NO3_A', YAERO_NL(3)%IGRBCODE=212036, YAERO_NL(3)%LMASSFIX=.true., -!YAERO_NL(3)%LCOMAD=.true., +YAERO_NL(3)%LCOMAD=.true., YAERO_NL(3)%LQM=.false., YAERO_NL(3)%LQM3D=.true., YAERO_NL(3)%BETAMFBC=-999, YAERO_NL(3)%LADV=.true., YAERO_NL(3)%NREQIN=0, -YAERO_NL(4)%CNAME='ACS_N', + +YAERO_NL(4)%CNAME='AS_N', YAERO_NL(4)%IGRBCODE=212001, YAERO_NL(4)%LMASSFIX=.true., -!YAERO_NL(4)%LCOMAD=.true., +YAERO_NL(4)%LCOMAD=.true., YAERO_NL(4)%LQM=.false., YAERO_NL(4)%LQM3D=.true., YAERO_NL(4)%BETAMFBC=-999, YAERO_NL(4)%LADV=.true., YAERO_NL(4)%NREQIN=0, -YAERO_NL(5)%CNAME='SO4ACS', +YAERO_NL(5)%CNAME='SO4_AS', YAERO_NL(5)%IGRBCODE=212002, YAERO_NL(5)%LMASSFIX=.true., -!YAERO_NL(5)%LCOMAD=.true., +YAERO_NL(5)%LCOMAD=.true., YAERO_NL(5)%LQM=.false., YAERO_NL(5)%LQM3D=.true., YAERO_NL(5)%BETAMFBC=-999, YAERO_NL(5)%LADV=.true., YAERO_NL(5)%NREQIN=0, -YAERO_NL(6)%CNAME='BCACS', +YAERO_NL(6)%CNAME='BC_AS', YAERO_NL(6)%IGRBCODE=212003, YAERO_NL(6)%LMASSFIX=.true., -!YAERO_NL(6)%LCOMAD=.true., +YAERO_NL(6)%LCOMAD=.true., YAERO_NL(6)%LQM=.false., YAERO_NL(6)%LQM3D=.true., YAERO_NL(6)%BETAMFBC=-999, YAERO_NL(6)%LADV=.true., YAERO_NL(6)%NREQIN=0, -YAERO_NL(7)%CNAME='POMACS', +YAERO_NL(7)%CNAME='POM_AS', YAERO_NL(7)%IGRBCODE=212004, YAERO_NL(7)%LMASSFIX=.true., -!YAERO_NL(7)%LCOMAD=.true., +YAERO_NL(7)%LCOMAD=.true., YAERO_NL(7)%LQM=.false., YAERO_NL(7)%LQM3D=.true., YAERO_NL(7)%BETAMFBC=-999, YAERO_NL(7)%LADV=.true., YAERO_NL(7)%NREQIN=0, -YAERO_NL(8)%CNAME='SSACS', +YAERO_NL(8)%CNAME='SS_AS', YAERO_NL(8)%IGRBCODE=212005, YAERO_NL(8)%LMASSFIX=.true., -!YAERO_NL(8)%LCOMAD=.true., +YAERO_NL(8)%LCOMAD=.true., YAERO_NL(8)%LQM=.false., YAERO_NL(8)%LQM3D=.true., YAERO_NL(8)%BETAMFBC=-999, YAERO_NL(8)%LADV=.true., YAERO_NL(8)%NREQIN=0, -YAERO_NL(9)%CNAME='DUACS', +YAERO_NL(9)%CNAME='DU_AS', YAERO_NL(9)%IGRBCODE=212006, YAERO_NL(9)%LMASSFIX=.true., -!YAERO_NL(9)%LCOMAD=.true., +YAERO_NL(9)%LCOMAD=.true., YAERO_NL(9)%LQM=.false., YAERO_NL(9)%LQM3D=.true., YAERO_NL(9)%BETAMFBC=-999, YAERO_NL(9)%LADV=.true., YAERO_NL(9)%NREQIN=0, -YAERO_NL(10)%CNAME='SOANUS', +YAERO_NL(10)%CNAME='SOA_NS', YAERO_NL(10)%IGRBCODE=212007, YAERO_NL(10)%LMASSFIX=.true., -!YAERO_NL(10)%LCOMAD=.true., +YAERO_NL(10)%LCOMAD=.true., YAERO_NL(10)%LQM=.false., YAERO_NL(10)%LQM3D=.true., YAERO_NL(10)%BETAMFBC=-999, YAERO_NL(10)%LADV=.true., YAERO_NL(10)%NREQIN=0, -YAERO_NL(11)%CNAME='SOAAIS', +YAERO_NL(11)%CNAME='SOA_KS', YAERO_NL(11)%IGRBCODE=212008, YAERO_NL(11)%LMASSFIX=.true., -!YAERO_NL(11)%LCOMAD=.true., +YAERO_NL(11)%LCOMAD=.true., YAERO_NL(11)%LQM=.false., YAERO_NL(11)%LQM3D=.true., YAERO_NL(11)%BETAMFBC=-999, YAERO_NL(11)%LADV=.true., YAERO_NL(11)%NREQIN=0, -YAERO_NL(12)%CNAME='SOAACS', +YAERO_NL(12)%CNAME='SOA_AS', YAERO_NL(12)%IGRBCODE=212009, YAERO_NL(12)%LMASSFIX=.true., -!YAERO_NL(12)%LCOMAD=.true., +YAERO_NL(12)%LCOMAD=.true., YAERO_NL(12)%LQM=.false., YAERO_NL(12)%LQM3D=.true., YAERO_NL(12)%BETAMFBC=-999, YAERO_NL(12)%LADV=.true., YAERO_NL(12)%NREQIN=0, -YAERO_NL(13)%CNAME='SOACOS', +YAERO_NL(13)%CNAME='SOA_CS', YAERO_NL(13)%IGRBCODE=212010, YAERO_NL(13)%LMASSFIX=.true., -!YAERO_NL(13)%LCOMAD=.true., +YAERO_NL(13)%LCOMAD=.true., YAERO_NL(13)%LQM=.false., YAERO_NL(13)%LQM3D=.true., YAERO_NL(13)%BETAMFBC=-999, YAERO_NL(13)%LADV=.true., YAERO_NL(13)%NREQIN=0, -YAERO_NL(14)%CNAME='SOAAII', +YAERO_NL(14)%CNAME='SOA_KI', YAERO_NL(14)%IGRBCODE=212011, YAERO_NL(14)%LMASSFIX=.true., -!YAERO_NL(14)%LCOMAD=.true., +YAERO_NL(14)%LCOMAD=.true., YAERO_NL(14)%LQM=.false., YAERO_NL(14)%LQM3D=.true., YAERO_NL(14)%BETAMFBC=-999, @@ -130,178 +133,178 @@ YAERO_NL(14)%NREQIN=0, YAERO_NL(15)%CNAME='H2OPART', YAERO_NL(15)%IGRBCODE=212012, YAERO_NL(15)%LMASSFIX=.true., -!YAERO_NL(15)%LCOMAD=.true., +YAERO_NL(15)%LCOMAD=.true., YAERO_NL(15)%LQM=.false., YAERO_NL(15)%LQM3D=.true., YAERO_NL(15)%BETAMFBC=-999, YAERO_NL(15)%LADV=.true., YAERO_NL(15)%NREQIN=0, -YAERO_NL(16)%CNAME='AII_N', +YAERO_NL(16)%CNAME='KI_N', YAERO_NL(16)%IGRBCODE=212013, YAERO_NL(16)%LMASSFIX=.true., -!YAERO_NL(16)%LCOMAD=.true., +YAERO_NL(16)%LCOMAD=.true., YAERO_NL(16)%LQM=.false., YAERO_NL(16)%LQM3D=.true., YAERO_NL(16)%BETAMFBC=-999, YAERO_NL(16)%LADV=.true., YAERO_NL(16)%NREQIN=0, -YAERO_NL(17)%CNAME='BCAII', +YAERO_NL(17)%CNAME='BC_KI', YAERO_NL(17)%IGRBCODE=212014, YAERO_NL(17)%LMASSFIX=.true., -!YAERO_NL(17)%LCOMAD=.true., +YAERO_NL(17)%LCOMAD=.true., YAERO_NL(17)%LQM=.false., YAERO_NL(17)%LQM3D=.true., YAERO_NL(17)%BETAMFBC=-999, YAERO_NL(17)%LADV=.true., YAERO_NL(17)%NREQIN=0, -YAERO_NL(18)%CNAME='POMAII', +YAERO_NL(18)%CNAME='POM_KI', YAERO_NL(18)%IGRBCODE=212015, YAERO_NL(18)%LMASSFIX=.true., -!YAERO_NL(18)%LCOMAD=.true., +YAERO_NL(18)%LCOMAD=.true., YAERO_NL(18)%LQM=.false., YAERO_NL(18)%LQM3D=.true., YAERO_NL(18)%BETAMFBC=-999, YAERO_NL(18)%LADV=.true., YAERO_NL(18)%NREQIN=0, -YAERO_NL(19)%CNAME='ACI_N', +YAERO_NL(19)%CNAME='AI_N', YAERO_NL(19)%IGRBCODE=212016, YAERO_NL(19)%LMASSFIX=.true., -!YAERO_NL(19)%LCOMAD=.true., +YAERO_NL(19)%LCOMAD=.true., YAERO_NL(19)%LQM=.false., YAERO_NL(19)%LQM3D=.true., YAERO_NL(19)%BETAMFBC=-999, YAERO_NL(19)%LADV=.true., YAERO_NL(19)%NREQIN=0, -YAERO_NL(20)%CNAME='DUACI', +YAERO_NL(20)%CNAME='DU_AI', YAERO_NL(20)%IGRBCODE=212017, YAERO_NL(20)%LMASSFIX=.true., -!YAERO_NL(20)%LCOMAD=.true., +YAERO_NL(20)%LCOMAD=.true., YAERO_NL(20)%LQM=.false., YAERO_NL(20)%LQM3D=.true., YAERO_NL(20)%BETAMFBC=-999, YAERO_NL(20)%LADV=.true., YAERO_NL(20)%NREQIN=0, -YAERO_NL(21)%CNAME='AIS_N', +YAERO_NL(21)%CNAME='KS_N', YAERO_NL(21)%IGRBCODE=212018, YAERO_NL(21)%LMASSFIX=.true., -!YAERO_NL(21)%LCOMAD=.true., +YAERO_NL(21)%LCOMAD=.true., YAERO_NL(21)%LQM=.false., YAERO_NL(21)%LQM3D=.true., YAERO_NL(21)%BETAMFBC=-999, YAERO_NL(21)%LADV=.true., YAERO_NL(21)%NREQIN=0, -YAERO_NL(22)%CNAME='SO4AIS', +YAERO_NL(22)%CNAME='SO4_KS', YAERO_NL(22)%IGRBCODE=212019, YAERO_NL(22)%LMASSFIX=.true., -!YAERO_NL(22)%LCOMAD=.true., +YAERO_NL(22)%LCOMAD=.true., YAERO_NL(22)%LQM=.false., YAERO_NL(22)%LQM3D=.true., YAERO_NL(22)%BETAMFBC=-999, YAERO_NL(22)%LADV=.true., YAERO_NL(22)%NREQIN=0, -YAERO_NL(23)%CNAME='BCAIS', +YAERO_NL(23)%CNAME='BC_KS', YAERO_NL(23)%IGRBCODE=212020, YAERO_NL(23)%LMASSFIX=.true., -!YAERO_NL(23)%LCOMAD=.true., +YAERO_NL(23)%LCOMAD=.true., YAERO_NL(23)%LQM=.false., YAERO_NL(23)%LQM3D=.true., YAERO_NL(23)%BETAMFBC=-999, YAERO_NL(23)%LADV=.true., YAERO_NL(23)%NREQIN=0, -YAERO_NL(24)%CNAME='POMAIS', +YAERO_NL(24)%CNAME='POM_KS', YAERO_NL(24)%IGRBCODE=212021, YAERO_NL(24)%LMASSFIX=.true., -!YAERO_NL(24)%LCOMAD=.true., +YAERO_NL(24)%LCOMAD=.true., YAERO_NL(24)%LQM=.false., YAERO_NL(24)%LQM3D=.true., YAERO_NL(24)%BETAMFBC=-999, YAERO_NL(24)%LADV=.true., YAERO_NL(24)%NREQIN=0, -YAERO_NL(25)%CNAME='COI_N', +YAERO_NL(25)%CNAME='CI_N', YAERO_NL(25)%IGRBCODE=212022, YAERO_NL(25)%LMASSFIX=.true., -!YAERO_NL(25)%LCOMAD=.true., +YAERO_NL(25)%LCOMAD=.true., YAERO_NL(25)%LQM=.false., YAERO_NL(25)%LQM3D=.true., YAERO_NL(25)%BETAMFBC=-999, YAERO_NL(25)%LADV=.true., YAERO_NL(25)%NREQIN=0, -YAERO_NL(26)%CNAME='DUCOI', +YAERO_NL(26)%CNAME='DU_CI', YAERO_NL(26)%IGRBCODE=212023, YAERO_NL(26)%LMASSFIX=.true., -!YAERO_NL(26)%LCOMAD=.true., +YAERO_NL(26)%LCOMAD=.true., YAERO_NL(26)%LQM=.false., YAERO_NL(26)%LQM3D=.true., YAERO_NL(26)%BETAMFBC=-999, YAERO_NL(26)%LADV=.true., YAERO_NL(26)%NREQIN=0, -YAERO_NL(27)%CNAME='COS_N', +YAERO_NL(27)%CNAME='CS_N', YAERO_NL(27)%IGRBCODE=212024, YAERO_NL(27)%LMASSFIX=.true., -!YAERO_NL(27)%LCOMAD=.true., +YAERO_NL(27)%LCOMAD=.true., YAERO_NL(27)%LQM=.false., YAERO_NL(27)%LQM3D=.true., YAERO_NL(27)%BETAMFBC=-999, YAERO_NL(27)%LADV=.true., YAERO_NL(27)%NREQIN=0, -YAERO_NL(28)%CNAME='SO4COS', +YAERO_NL(28)%CNAME='SO4_CS', YAERO_NL(28)%IGRBCODE=212025, YAERO_NL(28)%LMASSFIX=.true., -!YAERO_NL(28)%LCOMAD=.true., +YAERO_NL(28)%LCOMAD=.true., YAERO_NL(28)%LQM=.false., YAERO_NL(28)%LQM3D=.true., YAERO_NL(28)%BETAMFBC=-999, YAERO_NL(28)%LADV=.true., YAERO_NL(28)%NREQIN=0, -YAERO_NL(29)%CNAME='BCCOS', +YAERO_NL(29)%CNAME='BC_CS', YAERO_NL(29)%IGRBCODE=212026, YAERO_NL(29)%LMASSFIX=.true., -!YAERO_NL(29)%LCOMAD=.true., +YAERO_NL(29)%LCOMAD=.true., YAERO_NL(29)%LQM=.false., YAERO_NL(29)%LQM3D=.true., YAERO_NL(29)%BETAMFBC=-999, YAERO_NL(29)%LADV=.true., YAERO_NL(29)%NREQIN=0, -YAERO_NL(30)%CNAME='POMCOS', +YAERO_NL(30)%CNAME='POM_CS', YAERO_NL(30)%IGRBCODE=212027, YAERO_NL(30)%LMASSFIX=.true., -!YAERO_NL(30)%LCOMAD=.true., +YAERO_NL(30)%LCOMAD=.true., YAERO_NL(30)%LQM=.false., YAERO_NL(30)%LQM3D=.true., YAERO_NL(30)%BETAMFBC=-999, YAERO_NL(30)%LADV=.true., YAERO_NL(30)%NREQIN=0, -YAERO_NL(31)%CNAME='SSCOS', +YAERO_NL(31)%CNAME='SS_CS', YAERO_NL(31)%IGRBCODE=212028, YAERO_NL(31)%LMASSFIX=.true., -!YAERO_NL(31)%LCOMAD=.true., +YAERO_NL(31)%LCOMAD=.true., YAERO_NL(31)%LQM=.false., YAERO_NL(31)%LQM3D=.true., YAERO_NL(31)%BETAMFBC=-999, YAERO_NL(31)%LADV=.true., YAERO_NL(31)%NREQIN=0, -YAERO_NL(32)%CNAME='DUCOS', +YAERO_NL(32)%CNAME='DU_CS', YAERO_NL(32)%IGRBCODE=212029, YAERO_NL(32)%LMASSFIX=.true., -!YAERO_NL(32)%LCOMAD=.true., +YAERO_NL(32)%LCOMAD=.true., YAERO_NL(32)%LQM=.false., YAERO_NL(32)%LQM3D=.true., YAERO_NL(32)%BETAMFBC=-999, YAERO_NL(32)%LADV=.true., YAERO_NL(32)%NREQIN=0, -YAERO_NL(33)%CNAME='NUS_N', +YAERO_NL(33)%CNAME='NS_N', YAERO_NL(33)%IGRBCODE=212030, YAERO_NL(33)%LMASSFIX=.true., -!YAERO_NL(33)%LCOMAD=.true., +YAERO_NL(33)%LCOMAD=.true., YAERO_NL(33)%LQM=.false., YAERO_NL(33)%LQM3D=.true., YAERO_NL(33)%BETAMFBC=-999, YAERO_NL(33)%LADV=.true., YAERO_NL(33)%NREQIN=0, -YAERO_NL(34)%CNAME='SO4NUS', +YAERO_NL(34)%CNAME='SO4_NS', YAERO_NL(34)%IGRBCODE=212031, YAERO_NL(34)%LMASSFIX=.true., -!YAERO_NL(34)%LCOMAD=.true., +YAERO_NL(34)%LCOMAD=.true., YAERO_NL(34)%LQM=.false., YAERO_NL(34)%LQM3D=.true., YAERO_NL(34)%BETAMFBC=-999, @@ -310,7 +313,7 @@ YAERO_NL(34)%NREQIN=0, YAERO_NL(35)%CNAME='ELVOC', YAERO_NL(35)%IGRBCODE=212032, YAERO_NL(35)%LMASSFIX=.true., -!YAERO_NL(35)%LCOMAD=.true., +YAERO_NL(35)%LCOMAD=.true., YAERO_NL(35)%LQM=.false., YAERO_NL(35)%LQM3D=.true., YAERO_NL(35)%BETAMFBC=-999, @@ -319,7 +322,7 @@ YAERO_NL(35)%NREQIN=0, YAERO_NL(36)%CNAME='ISVOC', YAERO_NL(36)%IGRBCODE=212033, YAERO_NL(36)%LMASSFIX=.true., -!YAERO_NL(36)%LCOMAD=.true., +YAERO_NL(36)%LCOMAD=.true., YAERO_NL(36)%LQM=.false., YAERO_NL(36)%LQM3D=.true., YAERO_NL(36)%BETAMFBC=-999, @@ -328,11 +331,32 @@ YAERO_NL(36)%NREQIN=0, YAERO_NL(37)%CNAME='MSA', YAERO_NL(37)%IGRBCODE=212034, YAERO_NL(37)%LMASSFIX=.true., -!YAERO_NL(37)%LCOMAD=.true., +YAERO_NL(37)%LCOMAD=.true., YAERO_NL(37)%LQM=.false., YAERO_NL(37)%LQM3D=.true., YAERO_NL(37)%BETAMFBC=-999, YAERO_NL(37)%LADV=.true., YAERO_NL(37)%NREQIN=0, + +YAERO_NL(38)%CNAME='CDNC', +YAERO_NL(38)%NREQIN=0, +YAERO_NL(38)%IGRBCODE=212037, +YAERO_NL(38)%LQM=.TRUE., +YAERO_NL(38)%LQM3D=.FALSE., +YAERO_NL(38)%LMASSFIX=.TRUE., +YAERO_NL(38)%BETAMFBC=-999.9, + +YAERO_NL(39)%CNAME='ICNC', +YAERO_NL(39)%NREQIN=0, +YAERO_NL(39)%IGRBCODE=212038, +YAERO_NL(39)%LQM=.TRUE., +YAERO_NL(39)%LQM3D=.FALSE., +YAERO_NL(39)%LMASSFIX=.TRUE., +YAERO_NL(39)%BETAMFBC=-999.9, + +YAERO_NL(40)%CNAME='Total_aerosol', +YAERO_NL(40)%IGRBCODE=210048, +YAERO_NL(40)%LADV5=true, + EOF diff --git a/ifs-test/tests/t21/ifsdata/rtablel_2095 b/ifs-test/tests/t21/ifsdata/rtablel_2095 new file mode 100755 index 00000000..f4e4b954 --- /dev/null +++ b/ifs-test/tests/t21/ifsdata/rtablel_2095 @@ -0,0 +1,98 @@ + &NAMRGRI + NRGRI(1)= 20, + NRGRI(2)= 25, + NRGRI(3)= 36, + NRGRI(4)= 40, + NRGRI(5)= 45, + NRGRI(6)= 50, + NRGRI(7)= 60, + NRGRI(8)= 60, + NRGRI(9)= 72, + NRGRI(10)= 75, + NRGRI(11)= 80, + NRGRI(12)= 90, + NRGRI(13)= 96, + NRGRI(14)=100, + NRGRI(15)=108, + NRGRI(16)=120, + NRGRI(17)=120, + NRGRI(18)=120, + NRGRI(19)=128, + NRGRI(20)=135, + NRGRI(21)=144, + NRGRI(22)=144, + NRGRI(23)=160, + NRGRI(24)=160, + NRGRI(25)=160, + NRGRI(26)=160, + NRGRI(27)=160, + NRGRI(28)=180, + NRGRI(29)=180, + NRGRI(30)=180, + NRGRI(31)=180, + NRGRI(32)=180, + NRGRI(33)=192, + NRGRI(34)=192, + NRGRI(35)=192, + NRGRI(36)=192, + NRGRI(37)=192, + NRGRI(38)=192, + NRGRI(39)=192, + NRGRI(40)=192, + NRGRI(41)=192, + NRGRI(42)=192, + NRGRI(43)=192, + NRGRI(44)=192, + NRGRI(45)=192, + NRGRI(46)=192, + NRGRI(47)=192, + NRGRI(48)=192, + NRGRI(49)=192, + NRGRI(50)=192, + NRGRI(51)=192, + NRGRI(52)=192, + NRGRI(53)=192, + NRGRI(54)=192, + NRGRI(55)=192, + NRGRI(56)=192, + NRGRI(57)=192, + NRGRI(58)=192, + NRGRI(59)=192, + NRGRI(60)=192, + NRGRI(61)=192, + NRGRI(62)=192, + NRGRI(63)=192, + NRGRI(64)=192, + NRGRI(65)=180, + NRGRI(66)=180, + NRGRI(67)=180, + NRGRI(68)=180, + NRGRI(69)=180, + NRGRI(70)=160, + NRGRI(71)=160, + NRGRI(72)=160, + NRGRI(73)=160, + NRGRI(74)=160, + NRGRI(75)=144, + NRGRI(76)=144, + NRGRI(77)=135, + NRGRI(78)=128, + NRGRI(79)=120, + NRGRI(80)=120, + NRGRI(81)=120, + NRGRI(82)=108, + NRGRI(83)=100, + NRGRI(84)= 96, + NRGRI(85)= 90, + NRGRI(86)= 80, + NRGRI(87)= 75, + NRGRI(88)= 72, + NRGRI(89)= 60, + NRGRI(90)= 60, + NRGRI(91)= 50, + NRGRI(92)= 45, + NRGRI(93)= 40, + NRGRI(94)= 36, + NRGRI(95)= 25, + NRGRI(96)= 20, + / diff --git a/ifs-test/tests/t21/test_compo_fc_m7_noemi/setup b/ifs-test/tests/t21/test_compo_fc_m7_noemi/setup index 474bdc87..164fe951 100644 --- a/ifs-test/tests/t21/test_compo_fc_m7_noemi/setup +++ b/ifs-test/tests/t21/test_compo_fc_m7_noemi/setup @@ -97,7 +97,7 @@ cat >> fort.4 << EOF LO3_CHEM_UV=true, NGHGRAD=20, NAERMACC=1, - !LAER3D=.false., ! CHECK + LAER3D=.false., / &NAMFPC CFPFMT="MODEL", @@ -116,7 +116,7 @@ cat >> fort.4 << EOF &NAEAER EOF -# Include NAEAER description (YAERO_DESC) => possible not for m7 +# Include NAEAER description (YAERO_DESC) . ../common/namelist_m7_yaerodesc cat >> fort.4 << EOF @@ -133,8 +133,8 @@ cat >> fort.4 << EOF LAERSEDIMSS=true, LAERDRYDP=true, LAERSURF=true, - NSSALT=4, - NDDUST=2, + NSSALT=1, + NDDUST=3, NSO4SCHEME=1, LSEASALT_RH80=true, LAERHYGRO=true, @@ -180,11 +180,9 @@ cat >> fort.4 << EOF LMCC_COMPO=false, / EOF -# Include compo emissions namelist (moved to end of file) +# Do NOT include compo emissions namelist since LMCC_COMPO=F #. ../common/namelist_m7_compoemis -. ../common/namelist_aer_compoemis - cat >> fort.4 << EOF &NAMM7CTL / diff --git a/ifs-test/tests/t21/test_compo_fc_m7_norad/setup b/ifs-test/tests/t21/test_compo_fc_m7_norad/setup index 0c874594..c73ce5c0 100644 --- a/ifs-test/tests/t21/test_compo_fc_m7_norad/setup +++ b/ifs-test/tests/t21/test_compo_fc_m7_norad/setup @@ -97,7 +97,7 @@ cat >> fort.4 << EOF LO3_CHEM_UV=true, NGHGRAD=20, NAERMACC=1, - !LAER3D=.false., ! CHECK + LAER3D=.false., / &NAMFPC CFPFMT="MODEL", @@ -133,8 +133,8 @@ cat >> fort.4 << EOF LAERSEDIMSS=true, LAERDRYDP=true, LAERSURF=true, - NSSALT=4, - NDDUST=2, + NSSALT=1, + NDDUST=3, NSO4SCHEME=1, LSEASALT_RH80=true, LAERHYGRO=true, diff --git a/ifs-test/tests/t255/common/CMakeLists.txt b/ifs-test/tests/t255/common/CMakeLists.txt index e361fb67..0716ebff 100644 --- a/ifs-test/tests/t255/common/CMakeLists.txt +++ b/ifs-test/tests/t255/common/CMakeLists.txt @@ -10,6 +10,7 @@ configure_file(m7/m7_aero.nml namelist_m7_aero COPYONLY) configure_file(m7/m7_aerowvldiag.nml namelist_m7_aerowvldiag COPYONLY) configure_file(m7/m7_chem.nml namelist_m7_chem COPYONLY) configure_file(m7/m7_compoemis.nml namelist_m7_compoemis COPYONLY) +configure_file(m7/fort.4-oac-adapted fort.4-oac-adapted COPYONLY) # === Parts that are replicated from test_compo_fc ==================== diff --git a/ifs-test/tests/t255/common/m7/fort.4-oac-adapted b/ifs-test/tests/t255/common/m7/fort.4-oac-adapted new file mode 100644 index 00000000..7dd134e0 --- /dev/null +++ b/ifs-test/tests/t255/common/m7/fort.4-oac-adapted @@ -0,0 +1,4995 @@ +&NAMIOS +CFRCF="./rcf", +CIOSPRF="./srf", +!B +/ +&NAMGRIB +CFCLASS="rd", +NCYCLE=154, +/ +&NAMCVER +LVERTFE=true, +NVSCH=3, +LVFE_GWMPA=true, +LVFE_GW=false, +LVFE_Z_TERM=false, +LVFE_X_TERM=false, +LVFE_LAPL_BC=true, +LVFE_LAPL=true, +NDLNPR=0, +/ +&NAMMCC +LMCC_COMPO=.true. +LMCCEC=true, +LMCCIEC=false, +/ +&NAMTRANS +LUSEFLT=false, +LFFTW=false, +/ +&NAERAD +CRTABLEDIR='./ifsdata/', +LECOMPGRID=false, +RMUZUV=0.01, +NUVTIM=72, +NRADUV=1, +NUV=24, +LUVPROC=false, +LUVAERP=true, +LO3_CHEM_UV=true, +KMODTS=2, +NAERMACC=0 +NAEROOPT=2 +NCLOUDACT=0 +NRPROMA=0, +/ +&NAEPHY +LNEEONLINE=true, +LWETONLINE=false, +LBFASCO2=false, +LEPHYS=true, +LEVDIF=true, +LESURF=true, +LECOND=true, +LECUMF=true, +LEPCLD=true, +LEEVAP=true, +LEVGEN=true, +LESSRO=true, +LECURR=false, +LEOCWA=true, +LEGWDG=true, +LEGWWMS=true, +LEOZOC=true, +LEQNGT=true, +LERADI=true, +LERADS=true, +LESICE=true, +LEO3CH=true, +LO3CH_HLO=true, +CO3CHEM="H1.0", +LEDCLD=true, +LDUCTDIA=false, +LDIAGTURB_EC=false, +LELIGHT=false, +LWCOU=.false. +LWCOU2W=true, +LWCOUHMF=false, +LWCOURNW=false, +NSTPW=1, +LSLPHY=true, +LESNML=true, +NSNMLWS=2, +LEFARQUHAR=true, +LEOPTSURF=false, +LEAIRCO2COUP=false, +LEC4MAP=true, +LEAGS=false, +/ +&NAMPAR1 +NOUTTYPE=1, +LSPLIT=true, +NWRTOUT=4, +NFLDIN=0, +NSTRIN=1, +/ +&NAMPAR0 +LXML_STATS=false, +LSTATS=true, +LDETAILED_STATS=false, +LSYNCSTATS=false, +LSTATSCPU=false, +NPRNT_STATS=256 +LBARRIER_STATS=false, +LBARRIER_STATS2=false, +NPROC=256 +NSPECRESMIN=256, +NOUTPUT=1, +MP_TYPE=1, +MBX_SIZE=0, +/ +&NAMDYNA +LSLAG=true, +LNHEE=false, +LNHQE=false, +LGRADSP=true, +LCOMAD_GFL=true, +LCOMADH=true, +/ +&NAMDYNCORE +LAQUA=false, +/ +&NAMDYN +LMASCOR=true, +NITMP=3, +/ +&NAMCT0 +LARPEGEF=false, +LFDBOP=false, +LSMSSIG=false, +N3DINI=0, +NFRDHP=12, +NFRDHFD=1, +NFRSDI=1, +NFRPOS=6, +NFRHIS=6, +NFRMASSCON=1, +NFPOS=2, +NPOSTS=0, +NHISTS=0, +NMASSCONS=0, +NFRCO=4, +NFRDHFZ=48, +NDHFZTS=0, +NDHFDTS=0, +NUNDEFLD=-999999, +CMETER="ecflow_client --meter", +CEVENT="ecflow_client --event", +/ +&NAMDDH +BDEDDH(1:6,1)=4.0,1.0,0.0,50.0,0.0,49.0, +NDHKD=120, +LHDZON=false, +LHDEFZ=false, +LHDDOP=false, +LHDEFD=false, +LHDGLB=false, +LHDPRG=false, +LHDHKS=false, +/ +&NAMIO_SERV +NPROCESS_LEVEL=5, +NIO_SERV_METHOD=2, +NMSG_LEVEL_CLIENT=0, +NMSG_LEVEL_SERVER=1, +/ +&NAMGFL +NAERO=40, +NACTAERO=39, +YAERO_NL(1)%CNAME='SO4', +YAERO_NL(1)%IGRBCODE=210011, +YAERO_NL(1)%LMASSFIX=.true., +YAERO_NL(1)%LCOMAD=.true., +YAERO_NL(1)%LQM=.false., +YAERO_NL(1)%LQM3D=.true., +YAERO_NL(1)%BETAMFBC=-999, +YAERO_NL(1)%LADV=.true., +YAERO_NL(1)%NREQIN=1, + +YAERO_NL(2)%CNAME='NH4', +YAERO_NL(2)%IGRBCODE=212035, +YAERO_NL(2)%LMASSFIX=.true., +YAERO_NL(2)%LCOMAD=.true., +YAERO_NL(2)%LQM=.false., +YAERO_NL(2)%LQM3D=.true., +YAERO_NL(2)%BETAMFBC=-999, +YAERO_NL(2)%LADV=.true., +YAERO_NL(2)%NREQIN=1, + +YAERO_NL(3)%CNAME='NO3_A', +YAERO_NL(3)%IGRBCODE=212036, +YAERO_NL(3)%LMASSFIX=.true., +YAERO_NL(3)%LCOMAD=.true., +YAERO_NL(3)%LQM=.false., +YAERO_NL(3)%LQM3D=.true., +YAERO_NL(3)%BETAMFBC=-999, +YAERO_NL(3)%LADV=.true., +YAERO_NL(3)%NREQIN=1, + +YAERO_NL(4)%CNAME='AS_N', +YAERO_NL(4)%IGRBCODE=212001, +YAERO_NL(4)%LMASSFIX=.true., +YAERO_NL(4)%LCOMAD=.true., +YAERO_NL(4)%LQM=.false., +YAERO_NL(4)%LQM3D=.true., +YAERO_NL(4)%BETAMFBC=-999, +YAERO_NL(4)%LADV=.true., +YAERO_NL(4)%NREQIN=1, +YAERO_NL(5)%CNAME='SO4_AS', +YAERO_NL(5)%IGRBCODE=212002, +YAERO_NL(5)%LMASSFIX=.true., +YAERO_NL(5)%LCOMAD=.true., +YAERO_NL(5)%LQM=.false., +YAERO_NL(5)%LQM3D=.true., +YAERO_NL(5)%BETAMFBC=-999, +YAERO_NL(5)%LADV=.true., +YAERO_NL(5)%NREQIN=1, +YAERO_NL(6)%CNAME='BC_AS', +YAERO_NL(6)%IGRBCODE=212003, +YAERO_NL(6)%LMASSFIX=.true., +YAERO_NL(6)%LCOMAD=.true., +YAERO_NL(6)%LQM=.false., +YAERO_NL(6)%LQM3D=.true., +YAERO_NL(6)%BETAMFBC=-999, +YAERO_NL(6)%LADV=.true., +YAERO_NL(6)%NREQIN=1, +YAERO_NL(7)%CNAME='POM_AS', +YAERO_NL(7)%IGRBCODE=212004, +YAERO_NL(7)%LMASSFIX=.true., +YAERO_NL(7)%LCOMAD=.true., +YAERO_NL(7)%LQM=.false., +YAERO_NL(7)%LQM3D=.true., +YAERO_NL(7)%BETAMFBC=-999, +YAERO_NL(7)%LADV=.true., +YAERO_NL(7)%NREQIN=1, +YAERO_NL(8)%CNAME='SS_AS', +YAERO_NL(8)%IGRBCODE=212005, +YAERO_NL(8)%LMASSFIX=.true., +YAERO_NL(8)%LCOMAD=.true., +YAERO_NL(8)%LQM=.false., +YAERO_NL(8)%LQM3D=.true., +YAERO_NL(8)%BETAMFBC=-999, +YAERO_NL(8)%LADV=.true., +YAERO_NL(8)%NREQIN=1, +YAERO_NL(9)%CNAME='DU_AS', +YAERO_NL(9)%IGRBCODE=212006, +YAERO_NL(9)%LMASSFIX=.true., +YAERO_NL(9)%LCOMAD=.true., +YAERO_NL(9)%LQM=.false., +YAERO_NL(9)%LQM3D=.true., +YAERO_NL(9)%BETAMFBC=-999, +YAERO_NL(9)%LADV=.true., +YAERO_NL(9)%NREQIN=1, +YAERO_NL(10)%CNAME='SOA_NS', +YAERO_NL(10)%IGRBCODE=212007, +YAERO_NL(10)%LMASSFIX=.true., +YAERO_NL(10)%LCOMAD=.true., +YAERO_NL(10)%LQM=.false., +YAERO_NL(10)%LQM3D=.true., +YAERO_NL(10)%BETAMFBC=-999, +YAERO_NL(10)%LADV=.true., +YAERO_NL(10)%NREQIN=1, +YAERO_NL(11)%CNAME='SOA_KS', +YAERO_NL(11)%IGRBCODE=212008, +YAERO_NL(11)%LMASSFIX=.true., +YAERO_NL(11)%LCOMAD=.true., +YAERO_NL(11)%LQM=.false., +YAERO_NL(11)%LQM3D=.true., +YAERO_NL(11)%BETAMFBC=-999, +YAERO_NL(11)%LADV=.true., +YAERO_NL(11)%NREQIN=1, +YAERO_NL(12)%CNAME='SOA_AS', +YAERO_NL(12)%IGRBCODE=212009, +YAERO_NL(12)%LMASSFIX=.true., +YAERO_NL(12)%LCOMAD=.true., +YAERO_NL(12)%LQM=.false., +YAERO_NL(12)%LQM3D=.true., +YAERO_NL(12)%BETAMFBC=-999, +YAERO_NL(12)%LADV=.true., +YAERO_NL(12)%NREQIN=1, +YAERO_NL(13)%CNAME='SOA_CS', +YAERO_NL(13)%IGRBCODE=212010, +YAERO_NL(13)%LMASSFIX=.true., +YAERO_NL(13)%LCOMAD=.true., +YAERO_NL(13)%LQM=.false., +YAERO_NL(13)%LQM3D=.true., +YAERO_NL(13)%BETAMFBC=-999, +YAERO_NL(13)%LADV=.true., +YAERO_NL(13)%NREQIN=1, +YAERO_NL(14)%CNAME='SOA_KI', +YAERO_NL(14)%IGRBCODE=212011, +YAERO_NL(14)%LMASSFIX=.true., +YAERO_NL(14)%LCOMAD=.true., +YAERO_NL(14)%LQM=.false., +YAERO_NL(14)%LQM3D=.true., +YAERO_NL(14)%BETAMFBC=-999, +YAERO_NL(14)%LADV=.true., +YAERO_NL(14)%NREQIN=1, +YAERO_NL(15)%CNAME='H2OPART', +YAERO_NL(15)%IGRBCODE=212012, +YAERO_NL(15)%LMASSFIX=.true., +YAERO_NL(15)%LCOMAD=.true., +YAERO_NL(15)%LQM=.false., +YAERO_NL(15)%LQM3D=.true., +YAERO_NL(15)%BETAMFBC=-999, +YAERO_NL(15)%LADV=.true., +YAERO_NL(15)%NREQIN=1, +YAERO_NL(16)%CNAME='KI_N', +YAERO_NL(16)%IGRBCODE=212013, +YAERO_NL(16)%LMASSFIX=.true., +YAERO_NL(16)%LCOMAD=.true., +YAERO_NL(16)%LQM=.false., +YAERO_NL(16)%LQM3D=.true., +YAERO_NL(16)%BETAMFBC=-999, +YAERO_NL(16)%LADV=.true., +YAERO_NL(16)%NREQIN=1, +YAERO_NL(17)%CNAME='BC_KI', +YAERO_NL(17)%IGRBCODE=212014, +YAERO_NL(17)%LMASSFIX=.true., +YAERO_NL(17)%LCOMAD=.true., +YAERO_NL(17)%LQM=.false., +YAERO_NL(17)%LQM3D=.true., +YAERO_NL(17)%BETAMFBC=-999, +YAERO_NL(17)%LADV=.true., +YAERO_NL(17)%NREQIN=1, +YAERO_NL(18)%CNAME='POM_KI', +YAERO_NL(18)%IGRBCODE=212015, +YAERO_NL(18)%LMASSFIX=.true., +YAERO_NL(18)%LCOMAD=.true., +YAERO_NL(18)%LQM=.false., +YAERO_NL(18)%LQM3D=.true., +YAERO_NL(18)%BETAMFBC=-999, +YAERO_NL(18)%LADV=.true., +YAERO_NL(18)%NREQIN=0, +YAERO_NL(19)%CNAME='AI_N', +YAERO_NL(19)%IGRBCODE=212016, +YAERO_NL(19)%LMASSFIX=.true., +YAERO_NL(19)%LCOMAD=.true., +YAERO_NL(19)%LQM=.false., +YAERO_NL(19)%LQM3D=.true., +YAERO_NL(19)%BETAMFBC=-999, +YAERO_NL(19)%LADV=.true., +YAERO_NL(19)%NREQIN=1, +YAERO_NL(20)%CNAME='DU_AI', +YAERO_NL(20)%IGRBCODE=212017, +YAERO_NL(20)%LMASSFIX=.true., +YAERO_NL(20)%LCOMAD=.true., +YAERO_NL(20)%LQM=.false., +YAERO_NL(20)%LQM3D=.true., +YAERO_NL(20)%BETAMFBC=-999, +YAERO_NL(20)%LADV=.true., +YAERO_NL(20)%NREQIN=1, +YAERO_NL(21)%CNAME='KS_N', +YAERO_NL(21)%IGRBCODE=212018, +YAERO_NL(21)%LMASSFIX=.true., +YAERO_NL(21)%LCOMAD=.true., +YAERO_NL(21)%LQM=.false., +YAERO_NL(21)%LQM3D=.true., +YAERO_NL(21)%BETAMFBC=-999, +YAERO_NL(21)%LADV=.true., +YAERO_NL(21)%NREQIN=1, +YAERO_NL(22)%CNAME='SO4_KS', +YAERO_NL(22)%IGRBCODE=212019, +YAERO_NL(22)%LMASSFIX=.true., +YAERO_NL(22)%LCOMAD=.true., +YAERO_NL(22)%LQM=.false., +YAERO_NL(22)%LQM3D=.true., +YAERO_NL(22)%BETAMFBC=-999, +YAERO_NL(22)%LADV=.true., +YAERO_NL(22)%NREQIN=1, +YAERO_NL(23)%CNAME='BC_KS', +YAERO_NL(23)%IGRBCODE=212020, +YAERO_NL(23)%LMASSFIX=.true., +YAERO_NL(23)%LCOMAD=.true., +YAERO_NL(23)%LQM=.false., +YAERO_NL(23)%LQM3D=.true., +YAERO_NL(23)%BETAMFBC=-999, +YAERO_NL(23)%LADV=.true., +YAERO_NL(23)%NREQIN=1, +YAERO_NL(24)%CNAME='POM_KS', +YAERO_NL(24)%IGRBCODE=212021, +YAERO_NL(24)%LMASSFIX=.true., +YAERO_NL(24)%LCOMAD=.true., +YAERO_NL(24)%LQM=.false., +YAERO_NL(24)%LQM3D=.true., +YAERO_NL(24)%BETAMFBC=-999, +YAERO_NL(24)%LADV=.true., +YAERO_NL(24)%NREQIN=1, +YAERO_NL(25)%CNAME='CI_N', +YAERO_NL(25)%IGRBCODE=212022, +YAERO_NL(25)%LMASSFIX=.true., +YAERO_NL(25)%LCOMAD=.true., +YAERO_NL(25)%LQM=.false., +YAERO_NL(25)%LQM3D=.true., +YAERO_NL(25)%BETAMFBC=-999, +YAERO_NL(25)%LADV=.true., +YAERO_NL(25)%NREQIN=1, +YAERO_NL(26)%CNAME='DU_CI', +YAERO_NL(26)%IGRBCODE=212023, +YAERO_NL(26)%LMASSFIX=.true., +YAERO_NL(26)%LCOMAD=.true., +YAERO_NL(26)%LQM=.false., +YAERO_NL(26)%LQM3D=.true., +YAERO_NL(26)%BETAMFBC=-999, +YAERO_NL(26)%LADV=.true., +YAERO_NL(26)%NREQIN=1, +YAERO_NL(27)%CNAME='CS_N', +YAERO_NL(27)%IGRBCODE=212024, +YAERO_NL(27)%LMASSFIX=.true., +YAERO_NL(27)%LCOMAD=.true., +YAERO_NL(27)%LQM=.false., +YAERO_NL(27)%LQM3D=.true., +YAERO_NL(27)%BETAMFBC=-999, +YAERO_NL(27)%LADV=.true., +YAERO_NL(27)%NREQIN=1, +YAERO_NL(28)%CNAME='SO4_CS', +YAERO_NL(28)%IGRBCODE=212025, +YAERO_NL(28)%LMASSFIX=.true., +YAERO_NL(28)%LCOMAD=.true., +YAERO_NL(28)%LQM=.false., +YAERO_NL(28)%LQM3D=.true., +YAERO_NL(28)%BETAMFBC=-999, +YAERO_NL(28)%LADV=.true., +YAERO_NL(28)%NREQIN=1, +YAERO_NL(29)%CNAME='BC_CS', +YAERO_NL(29)%IGRBCODE=212026, +YAERO_NL(29)%LMASSFIX=.true., +YAERO_NL(29)%LCOMAD=.true., +YAERO_NL(29)%LQM=.false., +YAERO_NL(29)%LQM3D=.true., +YAERO_NL(29)%BETAMFBC=-999, +YAERO_NL(29)%LADV=.true., +YAERO_NL(29)%NREQIN=1, +YAERO_NL(30)%CNAME='POM_CS', +YAERO_NL(30)%IGRBCODE=212027, +YAERO_NL(30)%LMASSFIX=.true., +YAERO_NL(30)%LCOMAD=.true., +YAERO_NL(30)%LQM=.false., +YAERO_NL(30)%LQM3D=.true., +YAERO_NL(30)%BETAMFBC=-999, +YAERO_NL(30)%LADV=.true., +YAERO_NL(30)%NREQIN=1, +YAERO_NL(31)%CNAME='SS_CS', +YAERO_NL(31)%IGRBCODE=212028, +YAERO_NL(31)%LMASSFIX=.true., +YAERO_NL(31)%LCOMAD=.true., +YAERO_NL(31)%LQM=.false., +YAERO_NL(31)%LQM3D=.true., +YAERO_NL(31)%BETAMFBC=-999, +YAERO_NL(31)%LADV=.true., +YAERO_NL(31)%NREQIN=1, +YAERO_NL(32)%CNAME='DU_CS', +YAERO_NL(32)%IGRBCODE=212029, +YAERO_NL(32)%LMASSFIX=.true., +YAERO_NL(32)%LCOMAD=.true., +YAERO_NL(32)%LQM=.false., +YAERO_NL(32)%LQM3D=.true., +YAERO_NL(32)%BETAMFBC=-999, +YAERO_NL(32)%LADV=.true., +YAERO_NL(32)%NREQIN=1, +YAERO_NL(33)%CNAME='NS_N', +YAERO_NL(33)%IGRBCODE=212030, +YAERO_NL(33)%LMASSFIX=.true., +YAERO_NL(33)%LCOMAD=.true., +YAERO_NL(33)%LQM=.false., +YAERO_NL(33)%LQM3D=.true., +YAERO_NL(33)%BETAMFBC=-999, +YAERO_NL(33)%LADV=.true., +YAERO_NL(33)%NREQIN=1, +YAERO_NL(34)%CNAME='SO4_NS', +YAERO_NL(34)%IGRBCODE=212031, +YAERO_NL(34)%LMASSFIX=.true., +YAERO_NL(34)%LCOMAD=.true., +YAERO_NL(34)%LQM=.false., +YAERO_NL(34)%LQM3D=.true., +YAERO_NL(34)%BETAMFBC=-999, +YAERO_NL(34)%LADV=.true., +YAERO_NL(34)%NREQIN=1, +YAERO_NL(35)%CNAME='ELVOC', +YAERO_NL(35)%IGRBCODE=212032, +YAERO_NL(35)%LMASSFIX=.true., +YAERO_NL(35)%LCOMAD=.true., +YAERO_NL(35)%LQM=.false., +YAERO_NL(35)%LQM3D=.true., +YAERO_NL(35)%BETAMFBC=-999, +YAERO_NL(35)%LADV=.true., +YAERO_NL(35)%NREQIN=1, +YAERO_NL(36)%CNAME='ISVOC', +YAERO_NL(36)%IGRBCODE=212033, +YAERO_NL(36)%LMASSFIX=.true., +YAERO_NL(36)%LCOMAD=.true., +YAERO_NL(36)%LQM=.false., +YAERO_NL(36)%LQM3D=.true., +YAERO_NL(36)%BETAMFBC=-999, +YAERO_NL(36)%LADV=.true., +YAERO_NL(36)%NREQIN=1, +YAERO_NL(37)%CNAME='MSA', +YAERO_NL(37)%IGRBCODE=212034, +YAERO_NL(37)%LMASSFIX=.true., +YAERO_NL(37)%LCOMAD=.true., +YAERO_NL(37)%LQM=.false., +YAERO_NL(37)%LQM3D=.true., +YAERO_NL(37)%BETAMFBC=-999, +YAERO_NL(37)%LADV=.true., +YAERO_NL(37)%NREQIN=1, + +YAERO_NL(38)%CNAME='CDNC', +YAERO_NL(38)%NREQIN=0, +YAERO_NL(38)%IGRBCODE=212037, +YAERO_NL(38)%LQM=.TRUE., +YAERO_NL(38)%LQM3D=.FALSE., +YAERO_NL(38)%LMASSFIX=.TRUE., +YAERO_NL(38)%BETAMFBC=-999.9, + +YAERO_NL(39)%CNAME='ICNC', +YAERO_NL(39)%NREQIN=0, +YAERO_NL(39)%IGRBCODE=212038, +YAERO_NL(39)%LQM=.TRUE., +YAERO_NL(39)%LQM3D=.FALSE., +YAERO_NL(39)%LMASSFIX=.TRUE., +YAERO_NL(39)%BETAMFBC=-999.9, + +YAERO_NL(40)%CNAME='Total_aerosol', +YAERO_NL(40)%IGRBCODE=210048, +YAERO_NL(40)%LADV5=true, + + +NAEROUT=45, +YAEROUT_NL(1)%CNAME='AEROUT-1', +YAEROUT_NL(1)%IGRBCODE=219001, +YAEROUT_NL(2)%CNAME='AEROUT-2', +YAEROUT_NL(2)%IGRBCODE=219002, +YAEROUT_NL(3)%CNAME='AEROUT-3', +YAEROUT_NL(3)%IGRBCODE=219003, +YAEROUT_NL(4)%CNAME='AEROUT-4', +YAEROUT_NL(4)%IGRBCODE=219004, +YAEROUT_NL(5)%CNAME='AEROUT-5', +YAEROUT_NL(5)%IGRBCODE=219005, +YAEROUT_NL(6)%CNAME='AEROUT-6', +YAEROUT_NL(6)%IGRBCODE=219006, +YAEROUT_NL(7)%CNAME='AEROUT-7', +YAEROUT_NL(7)%IGRBCODE=219007, +YAEROUT_NL(8)%CNAME='AEROUT-8', +YAEROUT_NL(8)%IGRBCODE=219008, +YAEROUT_NL(9)%CNAME='AEROUT-9', +YAEROUT_NL(9)%IGRBCODE=219009, +YAEROUT_NL(10)%CNAME='AEROUT-10', +YAEROUT_NL(10)%IGRBCODE=219010, +YAEROUT_NL(11)%CNAME='AEROUT-11', +YAEROUT_NL(11)%IGRBCODE=219011, +YAEROUT_NL(12)%CNAME='AEROUT-12', +YAEROUT_NL(12)%IGRBCODE=219012, +YAEROUT_NL(13)%CNAME='AEROUT-13', +YAEROUT_NL(13)%IGRBCODE=219013, +YAEROUT_NL(14)%CNAME='AEROUT-14', +YAEROUT_NL(14)%IGRBCODE=219014, +YAEROUT_NL(15)%CNAME='AEROUT-15', +YAEROUT_NL(15)%IGRBCODE=219015, +YAEROUT_NL(16)%CNAME='AEROUT-16', +YAEROUT_NL(16)%IGRBCODE=219016, +YAEROUT_NL(17)%CNAME='AEROUT-17', +YAEROUT_NL(17)%IGRBCODE=219017, +YAEROUT_NL(18)%CNAME='AEROUT-18', +YAEROUT_NL(18)%IGRBCODE=219018, +YAEROUT_NL(19)%CNAME='AEROUT-19', +YAEROUT_NL(19)%IGRBCODE=219019, +YAEROUT_NL(20)%CNAME='AEROUT-20', +YAEROUT_NL(20)%IGRBCODE=219020, +YAEROUT_NL(21)%CNAME='AEROUT-21', +YAEROUT_NL(21)%IGRBCODE=219021, +YAEROUT_NL(22)%CNAME='AEROUT-22', +YAEROUT_NL(22)%IGRBCODE=219022, +YAEROUT_NL(23)%CNAME='AEROUT-23', +YAEROUT_NL(23)%IGRBCODE=219023, +YAEROUT_NL(24)%CNAME='AEROUT-24', +YAEROUT_NL(24)%IGRBCODE=219024, +YAEROUT_NL(25)%CNAME='AEROUT-25', +YAEROUT_NL(25)%IGRBCODE=219025, +YAEROUT_NL(26)%CNAME='AEROUT-26', +YAEROUT_NL(26)%IGRBCODE=219026, +YAEROUT_NL(27)%CNAME='AEROUT-27', +YAEROUT_NL(27)%IGRBCODE=219027, +YAEROUT_NL(28)%CNAME='AEROUT-28', +YAEROUT_NL(28)%IGRBCODE=219028, +YAEROUT_NL(29)%CNAME='AEROUT-29', +YAEROUT_NL(29)%IGRBCODE=219029, +YAEROUT_NL(30)%CNAME='AEROUT-30', +YAEROUT_NL(30)%IGRBCODE=219030, +YAEROUT_NL(31)%CNAME='AEROUT-31', +YAEROUT_NL(31)%IGRBCODE=219031, +YAEROUT_NL(32)%CNAME='AEROUT-32', +YAEROUT_NL(32)%IGRBCODE=219032, +YAEROUT_NL(33)%CNAME='AEROUT-33', +YAEROUT_NL(33)%IGRBCODE=219033, +YAEROUT_NL(34)%CNAME='AEROUT-34', +YAEROUT_NL(34)%IGRBCODE=219034, +YAEROUT_NL(35)%CNAME='AEROUT-35', +YAEROUT_NL(35)%IGRBCODE=219035, +YAEROUT_NL(36)%CNAME='AEROUT-36', +YAEROUT_NL(36)%IGRBCODE=219036, +YAEROUT_NL(37)%CNAME='AEROUT-37', +YAEROUT_NL(37)%IGRBCODE=219037, +YAEROUT_NL(38)%CNAME='AEROUT-38', +YAEROUT_NL(38)%IGRBCODE=219038, +YAEROUT_NL(39)%CNAME='AEROUT-39', +YAEROUT_NL(39)%IGRBCODE=219039, +YAEROUT_NL(40)%CNAME='AEROUT-40', +YAEROUT_NL(40)%IGRBCODE=219040, +YAEROUT_NL(41)%CNAME='AEROUT-41', +YAEROUT_NL(41)%IGRBCODE=219041, +YAEROUT_NL(42)%CNAME='AEROUT-42', +YAEROUT_NL(42)%IGRBCODE=219042, +YAEROUT_NL(43)%CNAME='AEROUT-43', +YAEROUT_NL(43)%IGRBCODE=219043, +YAEROUT_NL(44)%CNAME='AEROUT-44', +YAEROUT_NL(44)%IGRBCODE=219044, +YAEROUT_NL(45)%CNAME='AEROUT-45', +YAEROUT_NL(45)%IGRBCODE=219045, + + +LAERAOT=false, +LAERLISI=false, +NAERO_WVL_DIAG=6, +NAERO_WVL_DIAG_TYPES=5, +YAERO_WVL_DIAG_NL(1)%IWVL=550, +YAERO_WVL_DIAG_NL(1)%IGRIBDIAG=210207,215104,215122,215140,215158, +YAERO_WVL_DIAG_NL(2)%IWVL=380, +YAERO_WVL_DIAG_NL(2)%IGRIBDIAG=210219,215098,215116,215134,215152, +YAERO_WVL_DIAG_NL(3)%IWVL=440, +YAERO_WVL_DIAG_NL(3)%IGRIBDIAG=210221,215100,215118,215136,215154, +YAERO_WVL_DIAG_NL(4)%IWVL=670, +YAERO_WVL_DIAG_NL(4)%IGRIBDIAG=210214,215106,215124,215142,215160, +YAERO_WVL_DIAG_NL(5)%IWVL=870, +YAERO_WVL_DIAG_NL(5)%IGRIBDIAG=210215,215109,215127,215145,215163, +YAERO_WVL_DIAG_NL(6)%IWVL=1020, +YAERO_WVL_DIAG_NL(6)%IGRIBDIAG=210227,215110,215128,215146,215164, +NCHEM=74, +YCHEM_NL(1)%CNAME='O3', +YCHEM_NL(1)%NREQIN=1, +YCHEM_NL(1)%RMOLMASS=48.0, +YCHEM_NL(1)%IGRBCODE=210203, +YCHEM_NL(1)%LNEGFIX=.TRUE., +YCHEM_NL(1)%IGRIBTC=210206, +YCHEM_NL(1)%IGRIBDV=221001, +YCHEM_NL(1)%HENRYA=1.0e-2, +YCHEM_NL(1)%HENRYB=2800.0, +YCHEM_NL(1)%LQM=.false., +YCHEM_NL(1)%LQM3D=.TRUE., +YCHEM_NL(1)%LCOMAD=.true., +YCHEM_NL(1)%LADV=.TRUE., +YCHEM_NL(1)%LMASSFIX=.TRUE., +YCHEM_NL(1)%BETAMFBC=-999.9, +YCHEM_NL(1)%LASSIM=.TRUE., +YCHEM_NL(1)%LADV5=.TRUE., +YCHEM_NL(2)%CNAME='NOx', +YCHEM_NL(2)%NREQIN=0, +YCHEM_NL(2)%RMOLMASS=14.0, +YCHEM_NL(2)%IGRBCODE=210129, +YCHEM_NL(2)%LNEGFIX=.TRUE., +YCHEM_NL(2)%IGRIBTC=210130, +YCHEM_NL(2)%LQM=.false., +YCHEM_NL(2)%LQM3D=.TRUE., +YCHEM_NL(2)%LCOMAD=.true., +YCHEM_NL(2)%LADV=.TRUE., +YCHEM_NL(2)%LMASSFIX=.TRUE., +YCHEM_NL(2)%BETAMFBC=-999.9, +YCHEM_NL(2)%LASSIM=.FALSE., +YCHEM_NL(3)%CNAME='H2O2', +YCHEM_NL(3)%NREQIN=1, +YCHEM_NL(3)%RMOLMASS=34.0, +YCHEM_NL(3)%IGRBCODE=217003, +YCHEM_NL(3)%LNEGFIX=.TRUE., +YCHEM_NL(3)%IGRIBTC=218003, +YCHEM_NL(3)%IGRIBDV=221003, +YCHEM_NL(3)%HENRYA=8.3e4, +YCHEM_NL(3)%HENRYB=7600.0, +YCHEM_NL(3)%LQM=.false., +YCHEM_NL(3)%LQM3D=.TRUE., +YCHEM_NL(3)%LCOMAD=.true., +YCHEM_NL(3)%LADV=.TRUE., +YCHEM_NL(3)%LMASSFIX=.TRUE., +YCHEM_NL(3)%BETAMFBC=-999.9, +YCHEM_NL(3)%LASSIM=.FALSE., +YCHEM_NL(4)%CNAME='CH4', +YCHEM_NL(4)%NREQIN=1, +YCHEM_NL(4)%RMOLMASS=16.0, +YCHEM_NL(4)%IGRBCODE=217004, +YCHEM_NL(4)%LNEGFIX=.TRUE., +YCHEM_NL(4)%IGRIBTC=218004, +YCHEM_NL(4)%LQM=.false., +YCHEM_NL(4)%LQM3D=.TRUE., +YCHEM_NL(4)%LCOMAD=.true., +YCHEM_NL(4)%LADV=.TRUE., +YCHEM_NL(4)%LMASSFIX=.TRUE., +YCHEM_NL(4)%BETAMFBC=-999.9, +YCHEM_NL(4)%LASSIM=.FALSE., +YCHEM_NL(5)%CNAME='CO', +YCHEM_NL(5)%NREQIN=1, +YCHEM_NL(5)%RMOLMASS=28.0, +YCHEM_NL(5)%IGRBCODE=210123, +YCHEM_NL(5)%LNEGFIX=.TRUE., +YCHEM_NL(5)%IGRIBTC=210127, +YCHEM_NL(5)%IGRIBDV=221005, +YCHEM_NL(5)%HENRYA=9.7e-4, +YCHEM_NL(5)%HENRYB=1300.0, +YCHEM_NL(5)%LQM=.false., +YCHEM_NL(5)%LQM3D=.TRUE., +YCHEM_NL(5)%LCOMAD=.true., +YCHEM_NL(5)%LADV=.TRUE., +YCHEM_NL(5)%LMASSFIX=.TRUE., +YCHEM_NL(5)%BETAMFBC=-999.9, +YCHEM_NL(5)%LASSIM=.TRUE., +YCHEM_NL(5)%LADV5=.TRUE., +YCHEM_NL(6)%CNAME='HNO3', +YCHEM_NL(6)%NREQIN=1, +YCHEM_NL(6)%RMOLMASS=63.0, +YCHEM_NL(6)%IGRBCODE=217006, +YCHEM_NL(6)%LNEGFIX=.TRUE., +YCHEM_NL(6)%IGRIBTC=218006, +YCHEM_NL(6)%IGRIBDV=221006, +YCHEM_NL(6)%HENRYA=3.2e11, +YCHEM_NL(6)%HENRYB=8700.0, +YCHEM_NL(6)%LQM=.false., +YCHEM_NL(6)%LQM3D=.TRUE., +YCHEM_NL(6)%LCOMAD=.true., +YCHEM_NL(6)%LADV=.TRUE., +YCHEM_NL(6)%LMASSFIX=.TRUE., +YCHEM_NL(6)%BETAMFBC=-999.9, +YCHEM_NL(6)%LASSIM=.FALSE., +YCHEM_NL(7)%CNAME='CH3OOH', +YCHEM_NL(7)%NREQIN=1, +YCHEM_NL(7)%RMOLMASS=48.0, +YCHEM_NL(7)%IGRBCODE=217007, +YCHEM_NL(7)%LNEGFIX=.TRUE., +YCHEM_NL(7)%IGRIBTC=218007, +YCHEM_NL(7)%IGRIBDV=221007, +YCHEM_NL(7)%HENRYA=2.9e2, +YCHEM_NL(7)%HENRYB=5200.0, +YCHEM_NL(7)%LQM=.false., +YCHEM_NL(7)%LQM3D=.TRUE., +YCHEM_NL(7)%LCOMAD=.true., +YCHEM_NL(7)%LADV=.TRUE., +YCHEM_NL(7)%LMASSFIX=.TRUE., +YCHEM_NL(7)%BETAMFBC=-999.9, +YCHEM_NL(7)%LASSIM=.FALSE., +YCHEM_NL(8)%CNAME='CH2O', +YCHEM_NL(8)%NREQIN=1, +YCHEM_NL(8)%RMOLMASS=30.0, +YCHEM_NL(8)%IGRBCODE=210124, +YCHEM_NL(8)%LNEGFIX=.TRUE., +YCHEM_NL(8)%IGRIBTC=210128, +YCHEM_NL(8)%IGRIBDV=221008, +YCHEM_NL(8)%HENRYA=3.2e3, +YCHEM_NL(8)%HENRYB=6800.0, +YCHEM_NL(8)%LQM=.false., +YCHEM_NL(8)%LQM3D=.TRUE., +YCHEM_NL(8)%LCOMAD=.true., +YCHEM_NL(8)%LADV=.TRUE., +YCHEM_NL(8)%LMASSFIX=.TRUE., +YCHEM_NL(8)%BETAMFBC=-999.9, +YCHEM_NL(8)%LASSIM=.TRUE., +YCHEM_NL(8)%LADV5=.TRUE., +YCHEM_NL(9)%CNAME='PAR', +YCHEM_NL(9)%NREQIN=1, +YCHEM_NL(9)%RMOLMASS=12.0, +YCHEM_NL(9)%IGRBCODE=217009, +YCHEM_NL(9)%LNEGFIX=.TRUE., +YCHEM_NL(9)%IGRIBTC=218009, +YCHEM_NL(9)%LQM=.false., +YCHEM_NL(9)%LQM3D=.TRUE., +YCHEM_NL(9)%LCOMAD=.true., +YCHEM_NL(9)%LADV=.TRUE., +YCHEM_NL(9)%LMASSFIX=.TRUE., +YCHEM_NL(9)%BETAMFBC=-999.9, +YCHEM_NL(9)%LASSIM=.FALSE., +YCHEM_NL(10)%CNAME='C2H4', +YCHEM_NL(10)%NREQIN=1, +YCHEM_NL(10)%RMOLMASS=28.0, +YCHEM_NL(10)%IGRBCODE=217010, +YCHEM_NL(10)%LNEGFIX=.TRUE., +YCHEM_NL(10)%IGRIBTC=218010, +YCHEM_NL(10)%LQM=.false., +YCHEM_NL(10)%LQM3D=.TRUE., +YCHEM_NL(10)%LCOMAD=.true., +YCHEM_NL(10)%LADV=.TRUE., +YCHEM_NL(10)%LMASSFIX=.TRUE., +YCHEM_NL(10)%BETAMFBC=-999.9, +YCHEM_NL(10)%LASSIM=.FALSE., +YCHEM_NL(11)%CNAME='OLE', +YCHEM_NL(11)%NREQIN=1, +YCHEM_NL(11)%RMOLMASS=24.0, +YCHEM_NL(11)%IGRBCODE=217011, +YCHEM_NL(11)%LNEGFIX=.TRUE., +YCHEM_NL(11)%IGRIBTC=218011, +YCHEM_NL(11)%LQM=.false., +YCHEM_NL(11)%LQM3D=.TRUE., +YCHEM_NL(11)%LCOMAD=.true., +YCHEM_NL(11)%LADV=.TRUE., +YCHEM_NL(11)%LMASSFIX=.TRUE., +YCHEM_NL(11)%BETAMFBC=-999.9, +YCHEM_NL(11)%LASSIM=.FALSE., +YCHEM_NL(12)%CNAME='ALD2', +YCHEM_NL(12)%NREQIN=1, +YCHEM_NL(12)%RMOLMASS=24.0, +YCHEM_NL(12)%IGRBCODE=217012, +YCHEM_NL(12)%LNEGFIX=.TRUE., +YCHEM_NL(12)%IGRIBTC=218012, +YCHEM_NL(12)%IGRIBDV=221012, +YCHEM_NL(12)%HENRYA=17.0, +YCHEM_NL(12)%HENRYB=5000.0, +YCHEM_NL(12)%LQM=.false., +YCHEM_NL(12)%LQM3D=.TRUE., +YCHEM_NL(12)%LCOMAD=.true., +YCHEM_NL(12)%LADV=.TRUE., +YCHEM_NL(12)%LMASSFIX=.TRUE., +YCHEM_NL(12)%BETAMFBC=-999.9, +YCHEM_NL(12)%LASSIM=.FALSE., +YCHEM_NL(13)%CNAME='PAN', +YCHEM_NL(13)%NREQIN=1, +YCHEM_NL(13)%RMOLMASS=121.0, +YCHEM_NL(13)%IGRBCODE=217013, +YCHEM_NL(13)%LNEGFIX=.TRUE., +YCHEM_NL(13)%IGRIBTC=218013, +YCHEM_NL(13)%IGRIBDV=221013, +YCHEM_NL(13)%HENRYA=2.9e+0, +YCHEM_NL(13)%HENRYB=5700.0, +YCHEM_NL(13)%LQM=.false., +YCHEM_NL(13)%LQM3D=.TRUE., +YCHEM_NL(13)%LCOMAD=.true., +YCHEM_NL(13)%LADV=.TRUE., +YCHEM_NL(13)%LMASSFIX=.TRUE., +YCHEM_NL(13)%BETAMFBC=-999.9, +YCHEM_NL(13)%LASSIM=.FALSE., +YCHEM_NL(14)%CNAME='ROOH', +YCHEM_NL(14)%NREQIN=1, +YCHEM_NL(14)%RMOLMASS=47.0, +YCHEM_NL(14)%IGRBCODE=217014, +YCHEM_NL(14)%LNEGFIX=.TRUE., +YCHEM_NL(14)%IGRIBTC=218014, +YCHEM_NL(14)%IGRIBDV=221014, +YCHEM_NL(14)%HENRYA=340.0, +YCHEM_NL(14)%HENRYB=6000.0, +YCHEM_NL(14)%LQM=.false., +YCHEM_NL(14)%LQM3D=.TRUE., +YCHEM_NL(14)%LCOMAD=.true., +YCHEM_NL(14)%LADV=.TRUE., +YCHEM_NL(14)%LMASSFIX=.TRUE., +YCHEM_NL(14)%BETAMFBC=-999.9, +YCHEM_NL(14)%LASSIM=.FALSE., +YCHEM_NL(15)%CNAME='ONIT', +YCHEM_NL(15)%NREQIN=1, +YCHEM_NL(15)%RMOLMASS=77.0, +YCHEM_NL(15)%IGRBCODE=217015, +YCHEM_NL(15)%LNEGFIX=.TRUE., +YCHEM_NL(15)%IGRIBTC=218015, +YCHEM_NL(15)%IGRIBDV=221015, +YCHEM_NL(15)%HENRYA=1.0e3, +YCHEM_NL(15)%HENRYB=6485., +YCHEM_NL(15)%LQM=.false., +YCHEM_NL(15)%LQM3D=.TRUE., +YCHEM_NL(15)%LCOMAD=.true., +YCHEM_NL(15)%LADV=.TRUE., +YCHEM_NL(15)%LMASSFIX=.TRUE., +YCHEM_NL(15)%BETAMFBC=-999.9, +YCHEM_NL(15)%LASSIM=.FALSE., +YCHEM_NL(16)%CNAME='C5H8', +YCHEM_NL(16)%NREQIN=1, +YCHEM_NL(16)%RMOLMASS=68.1, +YCHEM_NL(16)%IGRBCODE=217016, +YCHEM_NL(16)%LNEGFIX=.TRUE., +YCHEM_NL(16)%IGRIBTC=218016, +YCHEM_NL(16)%IGRIBDV=221016, +YCHEM_NL(16)%HENRYA=1.3e-2, +YCHEM_NL(16)%HENRYB=0.0, +YCHEM_NL(16)%LQM=.false., +YCHEM_NL(16)%LQM3D=.TRUE., +YCHEM_NL(16)%LCOMAD=.true., +YCHEM_NL(16)%LADV=.TRUE., +YCHEM_NL(16)%LMASSFIX=.TRUE., +YCHEM_NL(16)%BETAMFBC=-999.9, +YCHEM_NL(16)%LASSIM=.FALSE., +YCHEM_NL(17)%CNAME='SO2', +YCHEM_NL(17)%NREQIN=1, +YCHEM_NL(17)%RMOLMASS=64.1, +YCHEM_NL(17)%IGRBCODE=210122, +YCHEM_NL(17)%LNEGFIX=.TRUE., +YCHEM_NL(17)%IGRIBTC=210126, +YCHEM_NL(17)%IGRIBDV=221017, +YCHEM_NL(17)%HENRYA=1.0e5, +YCHEM_NL(17)%HENRYB=3000.0, +YCHEM_NL(17)%LQM=.false., +YCHEM_NL(17)%LQM3D=.TRUE., +YCHEM_NL(17)%LCOMAD=.true., +YCHEM_NL(17)%LADV=.TRUE., +YCHEM_NL(17)%LMASSFIX=.TRUE., +YCHEM_NL(17)%BETAMFBC=-999.9, +YCHEM_NL(17)%LASSIM=.TRUE., +YCHEM_NL(17)%LADV5=.TRUE., +YCHEM_NL(18)%CNAME='DMS', +YCHEM_NL(18)%NREQIN=1, +YCHEM_NL(18)%RMOLMASS=62.1, +YCHEM_NL(18)%IGRBCODE=217018, +YCHEM_NL(18)%LNEGFIX=.TRUE., +YCHEM_NL(18)%IGRIBTC=218018, +YCHEM_NL(18)%LQM=.false., +YCHEM_NL(18)%LQM3D=.TRUE., +YCHEM_NL(18)%LCOMAD=.true., +YCHEM_NL(18)%LADV=.TRUE., +YCHEM_NL(18)%LMASSFIX=.TRUE., +YCHEM_NL(18)%BETAMFBC=-999.9, +YCHEM_NL(18)%LASSIM=.FALSE., +YCHEM_NL(19)%CNAME='NH3', +YCHEM_NL(19)%NREQIN=1, +YCHEM_NL(19)%RMOLMASS=17.0, +YCHEM_NL(19)%IGRBCODE=217019, +YCHEM_NL(19)%LNEGFIX=.TRUE., +YCHEM_NL(19)%IGRIBTC=218019, +YCHEM_NL(19)%IGRIBDV=221019, +YCHEM_NL(19)%HENRYA=59.0, +YCHEM_NL(19)%HENRYB=4200.0, +YCHEM_NL(19)%LQM=.false., +YCHEM_NL(19)%LQM3D=.TRUE., +YCHEM_NL(19)%LCOMAD=.true., +YCHEM_NL(19)%LADV=.TRUE., +YCHEM_NL(19)%LMASSFIX=.TRUE., +YCHEM_NL(19)%BETAMFBC=-999.9, +YCHEM_NL(19)%LASSIM=.FALSE., +YCHEM_NL(20)%CNAME='SO4', +YCHEM_NL(20)%NREQIN=-1, +YCHEM_NL(20)%RMOLMASS=96.1, +YCHEM_NL(20)%IGRBCODE=217020, +YCHEM_NL(20)%LNEGFIX=.TRUE., +YCHEM_NL(20)%IGRIBTC=218020, +YCHEM_NL(20)%IGRIBDV=221020, +YCHEM_NL(20)%HENRYA=3.2e11, +YCHEM_NL(20)%HENRYB=8700.0, +YCHEM_NL(20)%LQM=.false., +YCHEM_NL(20)%LQM3D=.TRUE., +YCHEM_NL(20)%LCOMAD=.true., +YCHEM_NL(20)%LADV=.TRUE., +YCHEM_NL(20)%LMASSFIX=.TRUE., +YCHEM_NL(20)%BETAMFBC=-999.9, +YCHEM_NL(20)%LASSIM=.FALSE., +YCHEM_NL(21)%CNAME='NH4', +YCHEM_NL(21)%NREQIN=1, +YCHEM_NL(21)%RMOLMASS=18.0, +YCHEM_NL(21)%IGRBCODE=217021, +YCHEM_NL(21)%LNEGFIX=.TRUE., +YCHEM_NL(21)%IGRIBTC=218021, +YCHEM_NL(21)%IGRIBDV=221021, +YCHEM_NL(21)%HENRYA=3.2e11, +YCHEM_NL(21)%HENRYB=8700.0, +YCHEM_NL(21)%LQM=.false., +YCHEM_NL(21)%LQM3D=.TRUE., +YCHEM_NL(21)%LCOMAD=.true., +YCHEM_NL(21)%LADV=.TRUE., +YCHEM_NL(21)%LMASSFIX=.TRUE., +YCHEM_NL(21)%BETAMFBC=-999.9, +YCHEM_NL(21)%LASSIM=.FALSE., +YCHEM_NL(22)%CNAME='MSA', +YCHEM_NL(22)%NREQIN=1, +YCHEM_NL(22)%RMOLMASS=96.1, +YCHEM_NL(22)%IGRBCODE=217022, +YCHEM_NL(22)%LNEGFIX=.TRUE., +YCHEM_NL(22)%IGRIBTC=218022, +YCHEM_NL(22)%HENRYA=3.2e11, +YCHEM_NL(22)%HENRYB=8700.0, +YCHEM_NL(22)%LQM=.false., +YCHEM_NL(22)%LQM3D=.TRUE., +YCHEM_NL(22)%LCOMAD=.true., +YCHEM_NL(22)%LADV=.TRUE., +YCHEM_NL(22)%LMASSFIX=.TRUE., +YCHEM_NL(22)%BETAMFBC=-999.9, +YCHEM_NL(22)%LASSIM=.FALSE., +YCHEM_NL(23)%CNAME='CH3COCHO', +YCHEM_NL(23)%NREQIN=1, +YCHEM_NL(23)%RMOLMASS=72.1, +YCHEM_NL(23)%IGRBCODE=217023, +YCHEM_NL(23)%LNEGFIX=.TRUE., +YCHEM_NL(23)%IGRIBTC=218023, +YCHEM_NL(23)%IGRIBDV=221023, +YCHEM_NL(23)%HENRYA=3.4e3, +YCHEM_NL(23)%HENRYB=7500.0, +YCHEM_NL(23)%LQM=.false., +YCHEM_NL(23)%LQM3D=.TRUE., +YCHEM_NL(23)%LCOMAD=.true., +YCHEM_NL(23)%LADV=.TRUE., +YCHEM_NL(23)%LMASSFIX=.TRUE., +YCHEM_NL(23)%BETAMFBC=-999.9, +YCHEM_NL(23)%LASSIM=.FALSE., +YCHEM_NL(24)%CNAME='O3S', +YCHEM_NL(24)%NREQIN=1, +YCHEM_NL(24)%RMOLMASS=48.0, +YCHEM_NL(24)%IGRBCODE=217024, +YCHEM_NL(24)%LNEGFIX=.TRUE., +YCHEM_NL(24)%IGRIBTC=218024, +YCHEM_NL(24)%IGRIBDV=221024, +YCHEM_NL(24)%HENRYA=1.0e-2, +YCHEM_NL(24)%HENRYB=2800.0, +YCHEM_NL(24)%LQM=.false., +YCHEM_NL(24)%LQM3D=.TRUE., +YCHEM_NL(24)%LCOMAD=.true., +YCHEM_NL(24)%LADV=.TRUE., +YCHEM_NL(24)%LMASSFIX=.TRUE., +YCHEM_NL(24)%BETAMFBC=-999.9, +YCHEM_NL(24)%LASSIM=.FALSE., +YCHEM_NL(25)%CNAME='Rn', +YCHEM_NL(25)%NREQIN=1, +YCHEM_NL(25)%RMOLMASS=222.0, +YCHEM_NL(25)%IGRBCODE=210181, +YCHEM_NL(25)%LNEGFIX=.TRUE., +YCHEM_NL(25)%IGRIBTC=210183, +YCHEM_NL(25)%LQM=.false., +YCHEM_NL(25)%LQM3D=.TRUE., +YCHEM_NL(25)%LCOMAD=.true., +YCHEM_NL(25)%LADV=.TRUE., +YCHEM_NL(25)%LMASSFIX=.TRUE., +YCHEM_NL(25)%BETAMFBC=-999.9, +YCHEM_NL(25)%LASSIM=.FALSE., +YCHEM_NL(26)%CNAME='Pb', +YCHEM_NL(26)%NREQIN=1, +YCHEM_NL(26)%RMOLMASS=210.0, +YCHEM_NL(26)%IGRBCODE=217026, +YCHEM_NL(26)%LNEGFIX=.TRUE., +YCHEM_NL(26)%IGRIBTC=218026, +YCHEM_NL(26)%HENRYA=3.2e11, +YCHEM_NL(26)%HENRYB=8700.0, +YCHEM_NL(26)%LQM=.false., +YCHEM_NL(26)%LQM3D=.TRUE., +YCHEM_NL(26)%LCOMAD=.true., +YCHEM_NL(26)%LADV=.TRUE., +YCHEM_NL(26)%LMASSFIX=.TRUE., +YCHEM_NL(26)%BETAMFBC=-999.9, +YCHEM_NL(26)%LASSIM=.FALSE., +YCHEM_NL(27)%CNAME='NO', +YCHEM_NL(27)%NREQIN=1, +YCHEM_NL(27)%RMOLMASS=30.0, +YCHEM_NL(27)%IGRBCODE=217027, +YCHEM_NL(27)%LNEGFIX=.TRUE., +YCHEM_NL(27)%IGRIBTC=218027, +YCHEM_NL(27)%IGRIBDV=221027, +YCHEM_NL(27)%HENRYA=1.9e-3, +YCHEM_NL(27)%HENRYB=1600.0, +YCHEM_NL(27)%LQM=.false., +YCHEM_NL(27)%LQM3D=.TRUE., +YCHEM_NL(27)%LCOMAD=.true., +YCHEM_NL(27)%LADV=.TRUE., +YCHEM_NL(27)%LMASSFIX=.FALSE., +YCHEM_NL(27)%LASSIM=.FALSE., +YCHEM_NL(27)%LADV5=.TRUE., +YCHEM_NL(28)%CNAME='HO2', +YCHEM_NL(28)%NREQIN=1, +YCHEM_NL(28)%RMOLMASS=33.0, +YCHEM_NL(28)%IGRBCODE=217028, +YCHEM_NL(28)%LNEGFIX=.TRUE., +YCHEM_NL(28)%IGRIBTC=218028, +YCHEM_NL(28)%IGRIBDV=221028, +YCHEM_NL(28)%HENRYA=6.8e2, +YCHEM_NL(28)%HENRYB=0.0, +YCHEM_NL(28)%LQM=.false., +YCHEM_NL(28)%LQM3D=.TRUE., +YCHEM_NL(28)%LCOMAD=.true., +YCHEM_NL(28)%LADV=.FALSE., +YCHEM_NL(28)%LMASSFIX=.FALSE., +YCHEM_NL(28)%LMASSFIX=.FALSE., +YCHEM_NL(28)%LASSIM=.FALSE., +YCHEM_NL(29)%CNAME='CH3O2', +YCHEM_NL(29)%NREQIN=1, +YCHEM_NL(29)%RMOLMASS=47.0, +YCHEM_NL(29)%IGRBCODE=217029, +YCHEM_NL(29)%LNEGFIX=.TRUE., +YCHEM_NL(29)%IGRIBTC=218029, +YCHEM_NL(29)%IGRIBDV=221029, +YCHEM_NL(29)%HENRYA=1.5e1, +YCHEM_NL(29)%HENRYB=3700.0, +YCHEM_NL(29)%LQM=.false., +YCHEM_NL(29)%LQM3D=.TRUE., +YCHEM_NL(29)%LCOMAD=.true., +YCHEM_NL(29)%LADV=.FALSE., +YCHEM_NL(29)%LMASSFIX=.FALSE., +YCHEM_NL(29)%LMASSFIX=.FALSE., +YCHEM_NL(29)%LASSIM=.FALSE., +YCHEM_NL(30)%CNAME='OH', +YCHEM_NL(30)%NREQIN=1, +YCHEM_NL(30)%RMOLMASS=17.0, +YCHEM_NL(30)%IGRBCODE=217030, +YCHEM_NL(30)%LNEGFIX=.TRUE., +YCHEM_NL(30)%IGRIBTC=218030, +YCHEM_NL(30)%LQM=.false., +YCHEM_NL(30)%LQM3D=.TRUE., +YCHEM_NL(30)%LCOMAD=.true., +YCHEM_NL(30)%LADV=.FALSE., +YCHEM_NL(30)%LMASSFIX=.FALSE., +YCHEM_NL(30)%LMASSFIX=.FALSE., +YCHEM_NL(30)%LASSIM=.FALSE., +YCHEM_NL(30)%LADV5=.TRUE., +YCHEM_NL(31)%CNAME='NO2', +YCHEM_NL(31)%NREQIN=1, +YCHEM_NL(31)%RMOLMASS=46.0, +YCHEM_NL(31)%IGRBCODE=210121, +YCHEM_NL(31)%LNEGFIX=.TRUE., +YCHEM_NL(31)%IGRIBTC=210125, +YCHEM_NL(31)%IGRIBDV=221031, +YCHEM_NL(31)%HENRYA=1.2e-2, +YCHEM_NL(31)%HENRYB=2400.0, +YCHEM_NL(31)%LQM=.false., +YCHEM_NL(31)%LQM3D=.TRUE., +YCHEM_NL(31)%LCOMAD=.true., +YCHEM_NL(31)%LADV=.TRUE., +YCHEM_NL(31)%LMASSFIX=.FALSE., +YCHEM_NL(31)%LASSIM=.TRUE., +YCHEM_NL(31)%LADV5=.TRUE., +YCHEM_NL(32)%CNAME='NO3', +YCHEM_NL(32)%NREQIN=1, +YCHEM_NL(32)%RMOLMASS=62.0, +YCHEM_NL(32)%IGRBCODE=217032, +YCHEM_NL(32)%LNEGFIX=.TRUE., +YCHEM_NL(32)%IGRIBTC=218032, +YCHEM_NL(32)%IGRIBDV=221032, +YCHEM_NL(32)%HENRYA=3.8e-2, +YCHEM_NL(32)%HENRYB=0., +YCHEM_NL(32)%LQM=.false., +YCHEM_NL(32)%LQM3D=.TRUE., +YCHEM_NL(32)%LCOMAD=.true., +YCHEM_NL(32)%LADV=.TRUE., +YCHEM_NL(32)%LMASSFIX=.FALSE., +YCHEM_NL(32)%LASSIM=.FALSE., +YCHEM_NL(33)%CNAME='N2O5', +YCHEM_NL(33)%NREQIN=1, +YCHEM_NL(33)%RMOLMASS=108.0, +YCHEM_NL(33)%IGRBCODE=217033, +YCHEM_NL(33)%LNEGFIX=.TRUE., +YCHEM_NL(33)%IGRIBTC=218033, +YCHEM_NL(33)%IGRIBDV=221033, +YCHEM_NL(33)%HENRYA=2.1e+1, +YCHEM_NL(33)%HENRYB=3400.0, +YCHEM_NL(33)%LQM=.false., +YCHEM_NL(33)%LQM3D=.TRUE., +YCHEM_NL(33)%LCOMAD=.true., +YCHEM_NL(33)%LADV=.TRUE., +YCHEM_NL(33)%LMASSFIX=.TRUE., +YCHEM_NL(33)%BETAMFBC=-999.9, +YCHEM_NL(33)%LASSIM=.FALSE., +YCHEM_NL(34)%CNAME='HO2NO2', +YCHEM_NL(34)%NREQIN=1, +YCHEM_NL(34)%RMOLMASS=79.0, +YCHEM_NL(34)%IGRBCODE=217034, +YCHEM_NL(34)%LNEGFIX=.TRUE., +YCHEM_NL(34)%IGRIBTC=218034, +YCHEM_NL(34)%IGRIBDV=221034, +YCHEM_NL(34)%HENRYA=1.2e+4, +YCHEM_NL(34)%HENRYB=6900.0, +YCHEM_NL(34)%LQM=.false., +YCHEM_NL(34)%LQM3D=.TRUE., +YCHEM_NL(34)%LCOMAD=.true., +YCHEM_NL(34)%LADV=.TRUE., +YCHEM_NL(34)%LMASSFIX=.TRUE., +YCHEM_NL(34)%BETAMFBC=-999.9, +YCHEM_NL(34)%LASSIM=.FALSE., +YCHEM_NL(35)%CNAME='C2O3', +YCHEM_NL(35)%NREQIN=1, +YCHEM_NL(35)%RMOLMASS=75.0, +YCHEM_NL(35)%IGRBCODE=217035, +YCHEM_NL(35)%LNEGFIX=.TRUE., +YCHEM_NL(35)%IGRIBTC=218035, +YCHEM_NL(35)%LQM=.false., +YCHEM_NL(35)%LQM3D=.TRUE., +YCHEM_NL(35)%LCOMAD=.true., +YCHEM_NL(35)%LADV=.FALSE., +YCHEM_NL(35)%LMASSFIX=.FALSE., +YCHEM_NL(35)%LMASSFIX=.FALSE., +YCHEM_NL(35)%LASSIM=.FALSE., +YCHEM_NL(36)%CNAME='ROR', +YCHEM_NL(36)%NREQIN=1, +YCHEM_NL(36)%RMOLMASS=28.0, +YCHEM_NL(36)%IGRBCODE=217036, +YCHEM_NL(36)%LNEGFIX=.TRUE., +YCHEM_NL(36)%IGRIBTC=218036, +YCHEM_NL(36)%LQM=.false., +YCHEM_NL(36)%LQM3D=.TRUE., +YCHEM_NL(36)%LCOMAD=.true., +YCHEM_NL(36)%LADV=.FALSE., +YCHEM_NL(36)%LMASSFIX=.FALSE., +YCHEM_NL(36)%LMASSFIX=.FALSE., +YCHEM_NL(36)%LASSIM=.FALSE., +YCHEM_NL(37)%CNAME='RXPAR', +YCHEM_NL(37)%NREQIN=1, +YCHEM_NL(37)%RMOLMASS=12.0, +YCHEM_NL(37)%IGRBCODE=217037, +YCHEM_NL(37)%LNEGFIX=.TRUE., +YCHEM_NL(37)%IGRIBTC=218037, +YCHEM_NL(37)%LQM=.false., +YCHEM_NL(37)%LQM3D=.TRUE., +YCHEM_NL(37)%LCOMAD=.true., +YCHEM_NL(37)%LADV=.FALSE., +YCHEM_NL(37)%LMASSFIX=.FALSE., +YCHEM_NL(37)%LMASSFIX=.FALSE., +YCHEM_NL(37)%LASSIM=.FALSE., +YCHEM_NL(38)%CNAME='XO2', +YCHEM_NL(38)%NREQIN=1, +YCHEM_NL(38)%RMOLMASS=44.0, +YCHEM_NL(38)%IGRBCODE=217038, +YCHEM_NL(38)%LNEGFIX=.TRUE., +YCHEM_NL(38)%IGRIBTC=218038, +YCHEM_NL(38)%LQM=.false., +YCHEM_NL(38)%LQM3D=.TRUE., +YCHEM_NL(38)%LCOMAD=.true., +YCHEM_NL(38)%LADV=.FALSE., +YCHEM_NL(38)%LMASSFIX=.FALSE., +YCHEM_NL(38)%LMASSFIX=.FALSE., +YCHEM_NL(38)%LASSIM=.FALSE., +YCHEM_NL(39)%CNAME='XO2N', +YCHEM_NL(39)%NREQIN=1, +YCHEM_NL(39)%RMOLMASS=44.0, +YCHEM_NL(39)%IGRBCODE=217039, +YCHEM_NL(39)%LNEGFIX=.TRUE., +YCHEM_NL(39)%IGRIBTC=218039, +YCHEM_NL(39)%LQM=.false., +YCHEM_NL(39)%LQM3D=.TRUE., +YCHEM_NL(39)%LCOMAD=.true., +YCHEM_NL(39)%LADV=.FALSE., +YCHEM_NL(39)%LMASSFIX=.FALSE., +YCHEM_NL(39)%LMASSFIX=.FALSE., +YCHEM_NL(39)%LASSIM=.FALSE., +YCHEM_NL(40)%CNAME='NH2', +YCHEM_NL(40)%NREQIN=1, +YCHEM_NL(40)%RMOLMASS=16.0, +YCHEM_NL(40)%IGRBCODE=217040, +YCHEM_NL(40)%LNEGFIX=.TRUE., +YCHEM_NL(40)%IGRIBTC=218040, +YCHEM_NL(40)%LQM=.false., +YCHEM_NL(40)%LQM3D=.TRUE., +YCHEM_NL(40)%LCOMAD=.true., +YCHEM_NL(40)%LADV=.FALSE., +YCHEM_NL(40)%LMASSFIX=.FALSE., +YCHEM_NL(40)%LMASSFIX=.FALSE., +YCHEM_NL(40)%LASSIM=.FALSE., +YCHEM_NL(41)%CNAME='PSC', +YCHEM_NL(41)%NREQIN=0, +YCHEM_NL(41)%RMOLMASS=1.0, +YCHEM_NL(41)%IGRBCODE=217041, +YCHEM_NL(41)%LNEGFIX=.TRUE., +YCHEM_NL(41)%IGRIBTC=218041, +YCHEM_NL(41)%LQM=.false., +YCHEM_NL(41)%LQM3D=.TRUE., +YCHEM_NL(41)%LCOMAD=.true., +YCHEM_NL(41)%LADV=.TRUE., +YCHEM_NL(41)%LMASSFIX=.FALSE., +YCHEM_NL(41)%REFVALI=0.0, +YCHEM_NL(41)%NREQIN=-1, +YCHEM_NL(41)%LASSIM=.FALSE., +YCHEM_NL(42)%CNAME='CH3OH', +YCHEM_NL(42)%NREQIN=1, +YCHEM_NL(42)%RMOLMASS=31.01, +YCHEM_NL(42)%IGRBCODE=217042, +YCHEM_NL(42)%LNEGFIX=.TRUE., +YCHEM_NL(42)%IGRIBTC=218042, +YCHEM_NL(42)%IGRIBDV=221042, +YCHEM_NL(42)%HENRYA=200.0, +YCHEM_NL(42)%HENRYB=5600.0, +YCHEM_NL(42)%LQM=.false., +YCHEM_NL(42)%LQM3D=.TRUE., +YCHEM_NL(42)%LCOMAD=.true., +YCHEM_NL(42)%LADV=.TRUE., +YCHEM_NL(42)%LMASSFIX=.TRUE., +YCHEM_NL(42)%BETAMFBC=-999.9, +YCHEM_NL(42)%LASSIM=.FALSE., +YCHEM_NL(43)%CNAME='HCOOH', +YCHEM_NL(43)%NREQIN=1, +YCHEM_NL(43)%RMOLMASS=46.01, +YCHEM_NL(43)%IGRBCODE=217043, +YCHEM_NL(43)%LNEGFIX=.TRUE., +YCHEM_NL(43)%IGRIBTC=218043, +YCHEM_NL(43)%IGRIBDV=221043, +YCHEM_NL(43)%HENRYA=8.8e3, +YCHEM_NL(43)%HENRYB=6100.0, +YCHEM_NL(43)%LQM=.false., +YCHEM_NL(43)%LQM3D=.TRUE., +YCHEM_NL(43)%LCOMAD=.true., +YCHEM_NL(43)%LADV=.TRUE., +YCHEM_NL(43)%LMASSFIX=.TRUE., +YCHEM_NL(43)%BETAMFBC=-999.9, +YCHEM_NL(43)%LASSIM=.FALSE., +YCHEM_NL(44)%CNAME='MCOOH', +YCHEM_NL(44)%NREQIN=1, +YCHEM_NL(44)%RMOLMASS=62.02, +YCHEM_NL(44)%IGRBCODE=217044, +YCHEM_NL(44)%LNEGFIX=.TRUE., +YCHEM_NL(44)%IGRIBTC=218044, +YCHEM_NL(44)%IGRIBDV=221044, +YCHEM_NL(44)%HENRYA=4.1e3, +YCHEM_NL(44)%HENRYB=6300.0, +YCHEM_NL(44)%LQM=.false., +YCHEM_NL(44)%LQM3D=.TRUE., +YCHEM_NL(44)%LCOMAD=.true., +YCHEM_NL(44)%LADV=.TRUE., +YCHEM_NL(44)%LMASSFIX=.TRUE., +YCHEM_NL(44)%BETAMFBC=-999.9, +YCHEM_NL(44)%LASSIM=.FALSE., +YCHEM_NL(45)%CNAME='C2H6', +YCHEM_NL(45)%NREQIN=1, +YCHEM_NL(45)%RMOLMASS=30.02, +YCHEM_NL(45)%IGRBCODE=217045, +YCHEM_NL(45)%LNEGFIX=.TRUE., +YCHEM_NL(45)%IGRIBTC=218045, +YCHEM_NL(45)%IGRIBDV=221045, +YCHEM_NL(45)%HENRYA=1.9e-3, +YCHEM_NL(45)%HENRYB=2400.0, +YCHEM_NL(45)%LQM=.false., +YCHEM_NL(45)%LQM3D=.TRUE., +YCHEM_NL(45)%LCOMAD=.true., +YCHEM_NL(45)%LADV=.TRUE., +YCHEM_NL(45)%LMASSFIX=.TRUE., +YCHEM_NL(45)%BETAMFBC=-999.9, +YCHEM_NL(45)%LASSIM=.FALSE., +YCHEM_NL(46)%CNAME='C2H5OH', +YCHEM_NL(46)%NREQIN=1, +YCHEM_NL(46)%RMOLMASS=46.02, +YCHEM_NL(46)%IGRBCODE=217046, +YCHEM_NL(46)%LNEGFIX=.TRUE., +YCHEM_NL(46)%IGRIBTC=218046, +YCHEM_NL(46)%IGRIBDV=221046, +YCHEM_NL(46)%HENRYA=190.0, +YCHEM_NL(46)%HENRYB=6400.0, +YCHEM_NL(46)%LQM=.false., +YCHEM_NL(46)%LQM3D=.TRUE., +YCHEM_NL(46)%LCOMAD=.true., +YCHEM_NL(46)%LADV=.TRUE., +YCHEM_NL(46)%LMASSFIX=.TRUE., +YCHEM_NL(46)%BETAMFBC=-999.9, +YCHEM_NL(46)%LASSIM=.FALSE., +YCHEM_NL(47)%CNAME='C3H8', +YCHEM_NL(47)%NREQIN=1, +YCHEM_NL(47)%RMOLMASS=44.03, +YCHEM_NL(47)%IGRBCODE=217047, +YCHEM_NL(47)%LNEGFIX=.TRUE., +YCHEM_NL(47)%IGRIBTC=218047, +YCHEM_NL(47)%LQM=.false., +YCHEM_NL(47)%LQM3D=.TRUE., +YCHEM_NL(47)%LCOMAD=.true., +YCHEM_NL(47)%LADV=.TRUE., +YCHEM_NL(47)%LMASSFIX=.TRUE., +YCHEM_NL(47)%BETAMFBC=-999.9, +YCHEM_NL(47)%LASSIM=.FALSE., +YCHEM_NL(48)%CNAME='C3H6', +YCHEM_NL(48)%NREQIN=1, +YCHEM_NL(48)%RMOLMASS=42.03, +YCHEM_NL(48)%IGRBCODE=217048, +YCHEM_NL(48)%LNEGFIX=.TRUE., +YCHEM_NL(48)%IGRIBTC=218048, +YCHEM_NL(48)%LQM=.false., +YCHEM_NL(48)%LQM3D=.TRUE., +YCHEM_NL(48)%LCOMAD=.true., +YCHEM_NL(48)%LADV=.TRUE., +YCHEM_NL(48)%LMASSFIX=.TRUE., +YCHEM_NL(48)%BETAMFBC=-999.9, +YCHEM_NL(48)%LASSIM=.FALSE., +YCHEM_NL(49)%CNAME='C10H16', +YCHEM_NL(49)%NREQIN=1, +YCHEM_NL(49)%RMOLMASS=136.0, +YCHEM_NL(49)%IGRBCODE=217049, +YCHEM_NL(49)%LNEGFIX=.TRUE., +YCHEM_NL(49)%IGRIBTC=218049, +YCHEM_NL(49)%LQM=.false., +YCHEM_NL(49)%LQM3D=.TRUE., +YCHEM_NL(49)%LCOMAD=.true., +YCHEM_NL(49)%LADV=.TRUE., +YCHEM_NL(49)%LMASSFIX=.TRUE., +YCHEM_NL(49)%BETAMFBC=-999.9, +YCHEM_NL(49)%LASSIM=.FALSE., +YCHEM_NL(50)%CNAME='ISPD', +YCHEM_NL(50)%NREQIN=1, +YCHEM_NL(50)%RMOLMASS=70.0, +YCHEM_NL(50)%IGRBCODE=217050, +YCHEM_NL(50)%LNEGFIX=.TRUE., +YCHEM_NL(50)%IGRIBTC=218050, +YCHEM_NL(50)%IGRIBDV=221050, +YCHEM_NL(50)%HENRYA=4.3, +YCHEM_NL(50)%HENRYB=5300.0, +YCHEM_NL(50)%LQM=.false., +YCHEM_NL(50)%LQM3D=.TRUE., +YCHEM_NL(50)%LCOMAD=.true., +YCHEM_NL(50)%LADV=.TRUE., +YCHEM_NL(50)%LMASSFIX=.TRUE., +YCHEM_NL(50)%BETAMFBC=-999.9, +YCHEM_NL(50)%LASSIM=.FALSE., +YCHEM_NL(51)%CNAME='NO3_A', +YCHEM_NL(51)%NREQIN=1, +YCHEM_NL(51)%RMOLMASS=62.0, +YCHEM_NL(51)%IGRBCODE=217051, +YCHEM_NL(51)%LNEGFIX=.TRUE., +YCHEM_NL(51)%IGRIBTC=218051, +YCHEM_NL(51)%IGRIBDV=221051, +YCHEM_NL(51)%HENRYA=3.2e11, +YCHEM_NL(51)%HENRYB=8700.0, +YCHEM_NL(51)%LQM=.false., +YCHEM_NL(51)%LQM3D=.TRUE., +YCHEM_NL(51)%LCOMAD=.true., +YCHEM_NL(51)%LADV=.TRUE., +YCHEM_NL(51)%LMASSFIX=.TRUE., +YCHEM_NL(51)%BETAMFBC=-999.9, +YCHEM_NL(51)%LASSIM=.FALSE., +YCHEM_NL(52)%CNAME='CH3COCH3', +YCHEM_NL(52)%NREQIN=1, +YCHEM_NL(52)%RMOLMASS=58.0, +YCHEM_NL(52)%IGRBCODE=217052, +YCHEM_NL(52)%LNEGFIX=.TRUE., +YCHEM_NL(52)%IGRIBTC=218052, +YCHEM_NL(52)%IGRIBDV=221052, +YCHEM_NL(52)%HENRYA=27.0, +YCHEM_NL(52)%HENRYB=5500.0, +YCHEM_NL(52)%LQM=.false., +YCHEM_NL(52)%LQM3D=.TRUE., +YCHEM_NL(52)%LCOMAD=.true., +YCHEM_NL(52)%LADV=.TRUE., +YCHEM_NL(52)%LMASSFIX=.TRUE., +YCHEM_NL(52)%BETAMFBC=-999.9, +YCHEM_NL(52)%LASSIM=.FALSE., +YCHEM_NL(53)%CNAME='ACO2', +YCHEM_NL(53)%NREQIN=1, +YCHEM_NL(53)%RMOLMASS=58.0, +YCHEM_NL(53)%IGRBCODE=217053, +YCHEM_NL(53)%LNEGFIX=.TRUE., +YCHEM_NL(53)%IGRIBTC=218053, +YCHEM_NL(53)%LQM=.false., +YCHEM_NL(53)%LQM3D=.TRUE., +YCHEM_NL(53)%LCOMAD=.true., +YCHEM_NL(53)%LADV=.FALSE., +YCHEM_NL(53)%LMASSFIX=.FALSE., +YCHEM_NL(53)%LMASSFIX=.FALSE., +YCHEM_NL(53)%LASSIM=.FALSE., +YCHEM_NL(54)%CNAME='IC3H7O2', +YCHEM_NL(54)%NREQIN=1, +YCHEM_NL(54)%RMOLMASS=75.0, +YCHEM_NL(54)%IGRBCODE=217054, +YCHEM_NL(54)%LNEGFIX=.TRUE., +YCHEM_NL(54)%IGRIBTC=218054, +YCHEM_NL(54)%LQM=.false., +YCHEM_NL(54)%LQM3D=.TRUE., +YCHEM_NL(54)%LCOMAD=.true., +YCHEM_NL(54)%LADV=.FALSE., +YCHEM_NL(54)%LMASSFIX=.FALSE., +YCHEM_NL(54)%LMASSFIX=.FALSE., +YCHEM_NL(54)%LASSIM=.FALSE., +YCHEM_NL(55)%CNAME='HYPROPO2', +YCHEM_NL(55)%NREQIN=1, +YCHEM_NL(55)%RMOLMASS=91.0, +YCHEM_NL(55)%IGRBCODE=217055, +YCHEM_NL(55)%LNEGFIX=.TRUE., +YCHEM_NL(55)%IGRIBTC=218055, +YCHEM_NL(55)%LQM=.false., +YCHEM_NL(55)%LQM3D=.TRUE., +YCHEM_NL(55)%LCOMAD=.true., +YCHEM_NL(55)%LADV=.FALSE., +YCHEM_NL(55)%LMASSFIX=.FALSE., +YCHEM_NL(55)%LMASSFIX=.FALSE., +YCHEM_NL(55)%LASSIM=.FALSE., +YCHEM_NL(56)%CNAME='SO3', +YCHEM_NL(56)%NREQIN=1, +YCHEM_NL(56)%RMOLMASS=80.0, +YCHEM_NL(56)%IGRBCODE=217189, +YCHEM_NL(56)%LNEGFIX=.TRUE., +YCHEM_NL(56)%IGRIBTC=218189, +YCHEM_NL(56)%LQM=.false., +YCHEM_NL(56)%LQM3D=.TRUE., +YCHEM_NL(56)%LCOMAD=.true., +YCHEM_NL(56)%LADV=.TRUE., +YCHEM_NL(56)%LMASSFIX=.TRUE., +YCHEM_NL(56)%BETAMFBC=-999.9, +YCHEM_NL(56)%LASSIM=.FALSE., +YCHEM_NL(57)%CNAME='CH3O2NO2', +YCHEM_NL(57)%NREQIN=1, +YCHEM_NL(57)%RMOLMASS=93.0, +YCHEM_NL(57)%IGRBCODE=217225, +YCHEM_NL(57)%LNEGFIX=.TRUE., +YCHEM_NL(57)%IGRIBTC=218225, +YCHEM_NL(57)%LQM=.false., +YCHEM_NL(57)%LQM3D=.TRUE., +YCHEM_NL(57)%LCOMAD=.true., +YCHEM_NL(57)%LADV=.TRUE., +YCHEM_NL(57)%LMASSFIX=.TRUE., +YCHEM_NL(57)%BETAMFBC=-999.9, +YCHEM_NL(57)%LASSIM=.FALSE., +YCHEM_NL(58)%CNAME='HONO', +YCHEM_NL(58)%NREQIN=1, +YCHEM_NL(58)%RMOLMASS=47.0, +YCHEM_NL(58)%IGRBCODE=217086, +YCHEM_NL(58)%LNEGFIX=.TRUE., +YCHEM_NL(58)%IGRIBTC=218086, +YCHEM_NL(58)%IGRIBDV=221086, +YCHEM_NL(58)%HENRYA=4.8e+1, +YCHEM_NL(58)%HENRYB=4800.0, +YCHEM_NL(58)%LQM=.false., +YCHEM_NL(58)%LQM3D=.TRUE., +YCHEM_NL(58)%LCOMAD=.true., +YCHEM_NL(58)%LADV=.TRUE., +YCHEM_NL(58)%LMASSFIX=.TRUE., +YCHEM_NL(58)%BETAMFBC=-999.9, +YCHEM_NL(58)%LASSIM=.FALSE., +YCHEM_NL(59)%CNAME='HCN', +YCHEM_NL(59)%NREQIN=1, +YCHEM_NL(59)%RMOLMASS=27.0, +YCHEM_NL(59)%IGRBCODE=217226, +YCHEM_NL(59)%LNEGFIX=.TRUE., +YCHEM_NL(59)%IGRIBTC=218226, +YCHEM_NL(59)%IGRIBDV=221226, +YCHEM_NL(59)%HENRYA=12, +YCHEM_NL(59)%HENRYB=5000., +YCHEM_NL(59)%LQM=.false., +YCHEM_NL(59)%LQM3D=.TRUE., +YCHEM_NL(59)%LCOMAD=.true., +YCHEM_NL(59)%LADV=.TRUE., +YCHEM_NL(59)%LMASSFIX=.TRUE., +YCHEM_NL(59)%BETAMFBC=-999.9, +YCHEM_NL(59)%LASSIM=.FALSE., +YCHEM_NL(60)%CNAME='CH3CN', +YCHEM_NL(60)%NREQIN=1, +YCHEM_NL(60)%RMOLMASS=41.0, +YCHEM_NL(60)%IGRBCODE=217224, +YCHEM_NL(60)%LNEGFIX=.TRUE., +YCHEM_NL(60)%IGRIBTC=218224, +YCHEM_NL(60)%IGRIBDV=221224, +YCHEM_NL(60)%HENRYA=49, +YCHEM_NL(60)%HENRYB=4000., +YCHEM_NL(60)%LQM=.false., +YCHEM_NL(60)%LQM3D=.TRUE., +YCHEM_NL(60)%LCOMAD=.true., +YCHEM_NL(60)%LADV=.TRUE., +YCHEM_NL(60)%LMASSFIX=.TRUE., +YCHEM_NL(60)%BETAMFBC=-999.9, +YCHEM_NL(60)%LASSIM=.FALSE., +YCHEM_NL(61)%CNAME='XYL', +YCHEM_NL(61)%NREQIN=1, +YCHEM_NL(61)%RMOLMASS=106.0, +YCHEM_NL(61)%IGRBCODE=217100, +YCHEM_NL(61)%LNEGFIX=.TRUE., +YCHEM_NL(61)%IGRIBTC=218100, +YCHEM_NL(61)%IGRIBDV=221100, +YCHEM_NL(61)%HENRYA=0.14, +YCHEM_NL(61)%HENRYB=4200.0, +YCHEM_NL(61)%LQM=.false., +YCHEM_NL(61)%LQM3D=.TRUE., +YCHEM_NL(61)%LCOMAD=.true., +YCHEM_NL(61)%LADV=.TRUE., +YCHEM_NL(61)%LMASSFIX=.TRUE., +YCHEM_NL(61)%BETAMFBC=-999.9, +YCHEM_NL(61)%LASSIM=.FALSE., +YCHEM_NL(62)%CNAME='TOL', +YCHEM_NL(62)%NREQIN=1, +YCHEM_NL(62)%RMOLMASS=92.0, +YCHEM_NL(62)%IGRBCODE=217099, +YCHEM_NL(62)%LNEGFIX=.TRUE., +YCHEM_NL(62)%IGRIBTC=218099, +YCHEM_NL(62)%IGRIBDV=221099, +YCHEM_NL(62)%HENRYA=0.15, +YCHEM_NL(62)%HENRYB=4300.0, +YCHEM_NL(62)%LQM=.false., +YCHEM_NL(62)%LQM3D=.TRUE., +YCHEM_NL(62)%LCOMAD=.true., +YCHEM_NL(62)%LADV=.TRUE., +YCHEM_NL(62)%LMASSFIX=.TRUE., +YCHEM_NL(62)%BETAMFBC=-999.9, +YCHEM_NL(62)%LASSIM=.FALSE., +YCHEM_NL(63)%CNAME='AROO2', +YCHEM_NL(63)%NREQIN=1, +YCHEM_NL(63)%RMOLMASS=124.0, +YCHEM_NL(63)%IGRBCODE=217222, +YCHEM_NL(63)%LNEGFIX=.TRUE., +YCHEM_NL(63)%IGRIBTC=218222, +YCHEM_NL(63)%LQM=.false., +YCHEM_NL(63)%LQM3D=.TRUE., +YCHEM_NL(63)%LCOMAD=.true., +YCHEM_NL(63)%LADV=.FALSE., +YCHEM_NL(63)%LMASSFIX=.FALSE., +YCHEM_NL(63)%LMASSFIX=.FALSE., +YCHEM_NL(63)%LASSIM=.FALSE., +YCHEM_NL(64)%CNAME='HPALD1', +YCHEM_NL(64)%NREQIN=1, +YCHEM_NL(64)%RMOLMASS=148.0, +YCHEM_NL(64)%IGRBCODE=217227, +YCHEM_NL(64)%LNEGFIX=.TRUE., +YCHEM_NL(64)%IGRIBTC=218227, +YCHEM_NL(64)%HENRYA=17.0, +YCHEM_NL(64)%HENRYB=5000.0, +YCHEM_NL(64)%LQM=.false., +YCHEM_NL(64)%LQM3D=.TRUE., +YCHEM_NL(64)%LCOMAD=.true., +YCHEM_NL(64)%LADV=.TRUE., +YCHEM_NL(64)%LMASSFIX=.TRUE., +YCHEM_NL(64)%BETAMFBC=-999.9, +YCHEM_NL(64)%LASSIM=.FALSE., +YCHEM_NL(65)%CNAME='HPALD2', +YCHEM_NL(65)%NREQIN=1, +YCHEM_NL(65)%RMOLMASS=148.0, +YCHEM_NL(65)%IGRBCODE=217228, +YCHEM_NL(65)%LNEGFIX=.TRUE., +YCHEM_NL(65)%IGRIBTC=218228, +YCHEM_NL(65)%HENRYA=17.0, +YCHEM_NL(65)%HENRYB=5000.0, +YCHEM_NL(65)%LQM=.false., +YCHEM_NL(65)%LQM3D=.TRUE., +YCHEM_NL(65)%LCOMAD=.true., +YCHEM_NL(65)%LADV=.TRUE., +YCHEM_NL(65)%LMASSFIX=.TRUE., +YCHEM_NL(65)%BETAMFBC=-999.9, +YCHEM_NL(65)%LASSIM=.FALSE., +YCHEM_NL(66)%CNAME='ISOPOOH', +YCHEM_NL(66)%NREQIN=1, +YCHEM_NL(66)%RMOLMASS=118.0, +YCHEM_NL(66)%IGRBCODE=217161, +YCHEM_NL(66)%LNEGFIX=.TRUE., +YCHEM_NL(66)%IGRIBTC=218161, +YCHEM_NL(66)%IGRIBDV=221161, +YCHEM_NL(66)%HENRYA=3.2E11, +YCHEM_NL(66)%HENRYB=8700.0, +YCHEM_NL(66)%LQM=.false., +YCHEM_NL(66)%LQM3D=.TRUE., +YCHEM_NL(66)%LCOMAD=.true., +YCHEM_NL(66)%LADV=.TRUE., +YCHEM_NL(66)%LMASSFIX=.TRUE., +YCHEM_NL(66)%BETAMFBC=-999.9, +YCHEM_NL(66)%LASSIM=.FALSE., +YCHEM_NL(67)%CNAME='GLY', +YCHEM_NL(67)%NREQIN=1, +YCHEM_NL(67)%RMOLMASS=58.04, +YCHEM_NL(67)%IGRBCODE=217107, +YCHEM_NL(67)%LNEGFIX=.TRUE., +YCHEM_NL(67)%IGRIBTC=218107, +YCHEM_NL(67)%IGRIBDV=221107, +YCHEM_NL(67)%HENRYA=4.1E5, +YCHEM_NL(67)%HENRYB=7500.0, +YCHEM_NL(67)%LQM=.false., +YCHEM_NL(67)%LQM3D=.TRUE., +YCHEM_NL(67)%LCOMAD=.true., +YCHEM_NL(67)%LADV=.TRUE., +YCHEM_NL(67)%LMASSFIX=.TRUE., +YCHEM_NL(67)%BETAMFBC=-999.9, +YCHEM_NL(67)%LASSIM=.FALSE., +YCHEM_NL(68)%CNAME='GLYALD', +YCHEM_NL(68)%NREQIN=1, +YCHEM_NL(68)%RMOLMASS=60.05, +YCHEM_NL(68)%IGRBCODE=217101, +YCHEM_NL(68)%LNEGFIX=.TRUE., +YCHEM_NL(68)%IGRIBTC=218101, +YCHEM_NL(68)%IGRIBDV=221101, +YCHEM_NL(68)%HENRYA=4.1E4, +YCHEM_NL(68)%HENRYB=4600.0, +YCHEM_NL(68)%LQM=.false., +YCHEM_NL(68)%LQM3D=.TRUE., +YCHEM_NL(68)%LCOMAD=.true., +YCHEM_NL(68)%LADV=.TRUE., +YCHEM_NL(68)%LMASSFIX=.TRUE., +YCHEM_NL(68)%BETAMFBC=-999.9, +YCHEM_NL(68)%LASSIM=.FALSE., +YCHEM_NL(69)%CNAME='HYAC', +YCHEM_NL(69)%NREQIN=1, +YCHEM_NL(69)%RMOLMASS=74.1, +YCHEM_NL(69)%IGRBCODE=217118, +YCHEM_NL(69)%LNEGFIX=.TRUE., +YCHEM_NL(69)%IGRIBTC=218117, +YCHEM_NL(69)%IGRIBDV=221118, +YCHEM_NL(69)%HENRYA=6.3E3, +YCHEM_NL(69)%HENRYB=6460.0, +YCHEM_NL(69)%LQM=.false., +YCHEM_NL(69)%LQM3D=.TRUE., +YCHEM_NL(69)%LCOMAD=.true., +YCHEM_NL(69)%LADV=.TRUE., +YCHEM_NL(69)%LMASSFIX=.TRUE., +YCHEM_NL(69)%BETAMFBC=-999.9, +YCHEM_NL(69)%LASSIM=.FALSE., +YCHEM_NL(70)%CNAME='ISOPBO2', +YCHEM_NL(70)%NREQIN=1, +YCHEM_NL(70)%RMOLMASS=117.0, +YCHEM_NL(70)%IGRBCODE=217229, +YCHEM_NL(70)%LNEGFIX=.TRUE., +YCHEM_NL(70)%IGRIBTC=218229, +YCHEM_NL(70)%LQM=.false., +YCHEM_NL(70)%LQM3D=.TRUE., +YCHEM_NL(70)%LCOMAD=.true., +YCHEM_NL(70)%LADV=.FALSE., +YCHEM_NL(70)%LMASSFIX=.FALSE., +YCHEM_NL(70)%LMASSFIX=.FALSE., +YCHEM_NL(70)%LASSIM=.FALSE., +YCHEM_NL(71)%CNAME='ISOPDO2', +YCHEM_NL(71)%NREQIN=1, +YCHEM_NL(71)%RMOLMASS=117.0, +YCHEM_NL(71)%IGRBCODE=217230, +YCHEM_NL(71)%LNEGFIX=.TRUE., +YCHEM_NL(71)%IGRIBTC=218230, +YCHEM_NL(71)%LQM=.false., +YCHEM_NL(71)%LQM3D=.TRUE., +YCHEM_NL(71)%LCOMAD=.true., +YCHEM_NL(71)%LADV=.FALSE., +YCHEM_NL(71)%LMASSFIX=.FALSE., +YCHEM_NL(71)%LMASSFIX=.FALSE., +YCHEM_NL(71)%LASSIM=.FALSE., +YCHEM_NL(72)%CNAME='SOG1', +YCHEM_NL(72)%NREQIN=1, +YCHEM_NL(72)%RMOLMASS=180.0, +YCHEM_NL(72)%IGRBCODE=217186, +YCHEM_NL(72)%LNEGFIX=.TRUE., +YCHEM_NL(72)%IGRIBTC=218186, +YCHEM_NL(72)%HENRYA=1.E5, +YCHEM_NL(72)%HENRYB=6000.0, +YCHEM_NL(72)%LQM=.false., +YCHEM_NL(72)%LQM3D=.TRUE., +YCHEM_NL(72)%LCOMAD=.true., +YCHEM_NL(72)%LADV=.TRUE., +YCHEM_NL(72)%LMASSFIX=.TRUE., +YCHEM_NL(72)%BETAMFBC=-999.9, +YCHEM_NL(72)%LASSIM=.FALSE., +YCHEM_NL(73)%CNAME='SOG2A', +YCHEM_NL(73)%NREQIN=1, +YCHEM_NL(73)%RMOLMASS=120.0, +YCHEM_NL(73)%IGRBCODE=217187, +YCHEM_NL(73)%LNEGFIX=.TRUE., +YCHEM_NL(73)%IGRIBTC=218187, +YCHEM_NL(73)%HENRYA=1.E3, +YCHEM_NL(73)%HENRYB=6000.0, +YCHEM_NL(73)%LQM=.false., +YCHEM_NL(73)%LQM3D=.TRUE., +YCHEM_NL(73)%LCOMAD=.true., +YCHEM_NL(73)%LADV=.TRUE., +YCHEM_NL(73)%LMASSFIX=.TRUE., +YCHEM_NL(73)%BETAMFBC=-999.9, +YCHEM_NL(73)%LASSIM=.FALSE., +YCHEM_NL(74)%CNAME='SOG2B', +YCHEM_NL(74)%NREQIN=1, +YCHEM_NL(74)%RMOLMASS=120.0, +YCHEM_NL(74)%IGRBCODE=217188, +YCHEM_NL(74)%LNEGFIX=.TRUE., +YCHEM_NL(74)%IGRIBTC=218188, +YCHEM_NL(74)%HENRYA=1.E5, +YCHEM_NL(74)%HENRYB=6000.0, +YCHEM_NL(74)%LQM=.false., +YCHEM_NL(74)%LQM3D=.TRUE., +YCHEM_NL(74)%LCOMAD=.true., +YCHEM_NL(74)%LADV=.TRUE., +YCHEM_NL(74)%LMASSFIX=.TRUE., +YCHEM_NL(74)%BETAMFBC=-999.9, +YCHEM_NL(74)%LASSIM=.FALSE., +YEXT_NL(1)%CNAME='EMILI', +YEXT_NL(1)%NREQIN=0, +YEXT_NL(1)%IGRBCODE=212254, +YEXT_NL(1)%LADV=.FALSE., +YEXT_NL(1)%LGP=.TRUE., +YEXT_NL(1)%LGPINGP=.TRUE., +YEXT_NL(2)%CNAME='KCH4CHEM', +YEXT_NL(2)%NREQIN=0, +YEXT_NL(2)%IGRBCODE=210071, +YEXT_NL(2)%LADV=.FALSE., +YEXT_NL(2)%LGP=.TRUE., +YEXT_NL(2)%LGPINGP=.TRUE., +NGFL_EXT=2, +LAERCHEM=true +YQ_NL%LGP=true, +YQ_NL%LSP=false, +YL_NL%LGP=true, +YI_NL%LGP=true, +YA_NL%LGP=true, +YO3_NL%LGP=true, +LTRCMFQM=true, +/ +&NAMFPC +CFPFMT="MODEL", +NFP3DFS=5, +NFP3DFP=5, +NFP3DFT=1, +NFP3DFV=1, +MFP3DFS(:)=130,135,138,155,133, +MFP3DFP(:)=129,130,135,138,155, +MFP3DFT=60, +MFP3DFV=133, +NFP2DF=2, +MFP2DF(:)=129,152, +NFPPHY=1, +MFPPHY(:)=31, +NRFP3S(:)=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137, +RFP3P(:)=100000.0,92500.0,85000.0,70000.0,50000.0,40000.0,30000.0,25000.0,20000.0,15000.0,10000.0,7000.0,5000.0,3000.0,2000.0,1000.0,700.0,500.0,300.0,200.0,100.0, +NFPCLI=0, +LFPQ=false, +LTRACEFP=false, +RFPCORR=60000., +/ +&NAMDIM +NPROMA=16, +/ +&NAMDPHY +NVEXTR=7, +NCEXTR=137, +NCSNEC=5, +/ +&NAMGEM +LNONHYD_GEOM=false, +NHTYP=2, +/ +&NAMRIP +TSTEP=1800.0, +CSTOP='t48' +/ +&NAMARG +NCONF=1, +CNMEXP='ham7' +/ +&NAMRLX +/ +&NAEAER +NTYPAER=3,3,2,2,1,2,1,2,0,0, +YAERO_DESC(1)%IGRIBDIAG=215001,215004,215007,215010,215013,215016,215022,215019, +YAERO_DESC(1)%RDDEPVSEA=1.1000E-02, +YAERO_DESC(1)%RDDEPVLIC=1.1000E-02, +YAERO_DESC(1)%RSEDIMV=2.4000E-05, +YAERO_DESC(1)%RSCAVIN=0.9, +YAERO_DESC(1)%RSCAVBCR=0.001, +YAERO_DESC(1)%RSCAVBCS=0.005, +YAERO_DESC(1)%COPTCLASS='SeaSaltSmall', +YAERO_DESC(1)%CHYGCLASS='SeaSalt', +YAERO_DESC(1)%IAEROCV=1, +YAERO_DESC(2)%IGRIBDIAG=215002,215005,215008,215011,215014,215017,215023,215020, +YAERO_DESC(2)%RDDEPVSEA=1.1500E-02, +YAERO_DESC(2)%RDDEPVLIC=1.2000E-02, +YAERO_DESC(2)%RSEDIMV=1.9500E-03, +YAERO_DESC(2)%RSCAVIN=0.9, +YAERO_DESC(2)%RSCAVBCR=0.001, +YAERO_DESC(2)%RSCAVBCS=0.005, +YAERO_DESC(2)%COPTCLASS='SeaSaltMedium', +YAERO_DESC(2)%CHYGCLASS='SeaSalt', +YAERO_DESC(2)%IAEROCV=2, +YAERO_DESC(3)%IGRIBDIAG=215003,215006,215009,215012,215015,215018,215024,215021, +YAERO_DESC(3)%RDDEPVSEA=1.2000E-02, +YAERO_DESC(3)%RDDEPVLIC=1.5000E-02, +YAERO_DESC(3)%RSEDIMV=1.8000E-02, +YAERO_DESC(3)%RSCAVIN=0.9, +YAERO_DESC(3)%RSCAVBCR=0.1, +YAERO_DESC(3)%RSCAVBCS=0.005, +YAERO_DESC(3)%COPTCLASS='SeaSaltLarge', +YAERO_DESC(3)%CHYGCLASS='SeaSalt', +YAERO_DESC(3)%IAEROCV=2, +YAERO_DESC(4)%IGRIBDIAG=215025,215028,215031,215034,215037,215040,215046,215043, +YAERO_DESC(4)%RDDEPVSEA=2.0000E-04, +YAERO_DESC(4)%RDDEPVLIC=2.0000E-04, +YAERO_DESC(4)%RSEDIMV=6.9040E-05, +YAERO_DESC(4)%RSCAVIN=0.7, +YAERO_DESC(4)%RSCAVBCR=0.001, +YAERO_DESC(4)%RSCAVBCS=0.005, +YAERO_DESC(4)%COPTCLASS='DustSmall', +YAERO_DESC(4)%CHYGCLASS='Dust', +YAERO_DESC(4)%IAEROCV=1, +YAERO_DESC(5)%IGRIBDIAG=215026,215029,215032,215035,215038,215041,215047,215044, +YAERO_DESC(5)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(5)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(5)%RSEDIMV=1.9820E-04, +YAERO_DESC(5)%RSCAVIN=0.7, +YAERO_DESC(5)%RSCAVBCR=0.001, +YAERO_DESC(5)%RSCAVBCS=0.005, +YAERO_DESC(5)%COPTCLASS='DustMedium', +YAERO_DESC(5)%CHYGCLASS='Dust', +YAERO_DESC(5)%IAEROCV=2, +YAERO_DESC(6)%IGRIBDIAG=215027,215030,215033,215036,215039,215042,215048,215045, +YAERO_DESC(6)%RDDEPVSEA=1.2000E-02, +YAERO_DESC(6)%RDDEPVLIC=1.2000E-02, +YAERO_DESC(6)%RSEDIMV=1.9620E-03, +YAERO_DESC(6)%RSCAVIN=0.7, +YAERO_DESC(6)%RSCAVBCR=0.1, +YAERO_DESC(6)%RSCAVBCS=0.005, +YAERO_DESC(6)%COPTCLASS='DustLarge', +YAERO_DESC(6)%CHYGCLASS='Dust', +YAERO_DESC(6)%IAEROCV=2, +YAERO_DESC(7)%IGRIBDIAG=215050,215052,215054,215056,215058,215060,215064,215062, +YAERO_DESC(7)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(7)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(7)%RSEDIMV=2.0000E-04, +YAERO_DESC(7)%RSCAVIN=0.7, +YAERO_DESC(7)%RSCAVBCR=0.0001, +YAERO_DESC(7)%RSCAVBCS=0.005, +YAERO_DESC(7)%COPTCLASS='OrganicMatter', +YAERO_DESC(7)%CHYGCLASS='OrganicMatter', +YAERO_DESC(7)%IAEROCV=1, +YAERO_DESC(8)%IGRIBDIAG=215049,215051,215053,215055,215057,215059,215063,215061, +YAERO_DESC(8)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(8)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(8)%RSEDIMV=2.0000E-04, +YAERO_DESC(8)%RSCAVIN=0, +YAERO_DESC(8)%RSCAVBCR=0.0001, +YAERO_DESC(8)%RSCAVBCS=0.005, +YAERO_DESC(8)%COPTCLASS='OrganicMatter', +YAERO_DESC(8)%CHYGCLASS='Hydrophobic', +YAERO_DESC(8)%IAEROCV=1, +YAERO_DESC(9)%IGRIBDIAG=215066,215068,215070,215072,215074,215076,215080,215078, +YAERO_DESC(9)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(9)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(9)%RSEDIMV=2.0000E-04, +YAERO_DESC(9)%RSCAVIN=0.7, +YAERO_DESC(9)%RSCAVBCR=0.0001, +YAERO_DESC(9)%RSCAVBCS=0.005, +YAERO_DESC(9)%COPTCLASS='BlackCarbon', +YAERO_DESC(9)%CHYGCLASS='BlackCarbon', +YAERO_DESC(9)%IAEROCV=1, +YAERO_DESC(10)%IGRIBDIAG=215065,215067,215069,215071,215073,215075,215079,215077, +YAERO_DESC(10)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(10)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(10)%RSEDIMV=2.0000E-04, +YAERO_DESC(10)%RSCAVIN=0, +YAERO_DESC(10)%RSCAVBCR=0.0001, +YAERO_DESC(10)%RSCAVBCS=0.005, +YAERO_DESC(10)%COPTCLASS='BlackCarbon', +YAERO_DESC(10)%CHYGCLASS='Hydrophobic', +YAERO_DESC(10)%IAEROCV=1, +YAERO_DESC(11)%IGRIBDIAG=215081,215082,215083,215084,215085,215086,215088,215087, +YAERO_DESC(11)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(11)%RDDEPVLIC=2.5000E-03, +YAERO_DESC(11)%RSEDIMV=2.0000E-04, +YAERO_DESC(11)%RSCAVIN=0.7, +YAERO_DESC(11)%RSCAVBCR=0.0001, +YAERO_DESC(11)%RSCAVBCS=0.005, +YAERO_DESC(11)%COPTCLASS='Sulphate', +YAERO_DESC(11)%CHYGCLASS='Sulphate', +YAERO_DESC(11)%IAEROCV=1, +YAERO_DESC(12)%IGRIBDIAG=215189,215191,215193,215195,215197,215199,215203,215201, +YAERO_DESC(12)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(12)%RDDEPVLIC=1.5000E-03, +YAERO_DESC(12)%RSEDIMV=2.0000E-04, +YAERO_DESC(12)%RSCAVIN=0.8, +YAERO_DESC(12)%RSCAVBCR=0.0001, +YAERO_DESC(12)%RSCAVBCS=0.005, +YAERO_DESC(12)%COPTCLASS='NitrateFine', +YAERO_DESC(12)%CHYGCLASS='Nitrate', +YAERO_DESC(12)%IAEROCV=1, +YAERO_DESC(13)%IGRIBDIAG=215190,215192,215194,215196,215198,215200,215204,215202, +YAERO_DESC(13)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(13)%RDDEPVLIC=1.5000E-03, +YAERO_DESC(13)%RSEDIMV=1.3352E-03, +YAERO_DESC(13)%RSCAVIN=0.8, +YAERO_DESC(13)%RSCAVBCR=0.1, +YAERO_DESC(13)%RSCAVBCS=0.005, +YAERO_DESC(13)%COPTCLASS='NitrateCoarse', +YAERO_DESC(13)%CHYGCLASS='Nitrate', +YAERO_DESC(13)%IAEROCV=2, +YAERO_DESC(14)%IGRIBDIAG=215205,215206,215207,215208,215209,215210,216042,215211, +YAERO_DESC(14)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(14)%RDDEPVLIC=1.5000E-03, +YAERO_DESC(14)%RSEDIMV=2.0000E-04, +YAERO_DESC(14)%RSCAVIN=0.9, +YAERO_DESC(14)%RSCAVBCR=0.0001, +YAERO_DESC(14)%RSCAVBCS=0.005, +YAERO_DESC(14)%COPTCLASS='Ammonium', +YAERO_DESC(14)%CHYGCLASS='Ammonium', +YAERO_DESC(14)%IAEROCV=1, +YAERO_DESC(15)%IGRIBDIAG=215212,215213,215214,215215,215216,215217,216098,215218, +YAERO_DESC(15)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(15)%RDDEPVLIC=2.5000E-03, +YAERO_DESC(15)%RSEDIMV=2.4000E-04, +YAERO_DESC(15)%RSCAVIN=0.7, +YAERO_DESC(15)%RSCAVBCR=0.0001, +YAERO_DESC(15)%RSCAVBCS=0.005, +YAERO_DESC(15)%COPTCLASS='SecOrgBio', +YAERO_DESC(15)%CHYGCLASS='SecOrgBio', +YAERO_DESC(15)%IAEROCV=1, +YAERO_DESC(16)%IGRIBDIAG=215219,215220,215221,215222,215223,215224,216099,215225, +YAERO_DESC(16)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(16)%RDDEPVLIC=2.5000E-03, +YAERO_DESC(16)%RSEDIMV=2.4000E-04, +YAERO_DESC(16)%RSCAVIN=0.7, +YAERO_DESC(16)%RSCAVBCR=0.0001, +YAERO_DESC(16)%RSCAVBCS=0.005, +YAERO_DESC(16)%COPTCLASS='SecOrgAnth', +YAERO_DESC(16)%CHYGCLASS='SecOrgAnth', +YAERO_DESC(16)%IAEROCV=1, +LAERVOL=false, +NDRYDEPVEL_DYN=2, +LAERDUSTSOURCE=true, +LAERDUSTSIZEVAR=true, +LAERDUST_NEWBIN=false, +RAERDUST_REBOUND=0.1, +LAERNGAT=true, +NAERSCAV=3, +LAERGTOP=true, +LAERHYGRO=true, +LAERSEDIM=true, +LAERSEDIMSS=true, +LAERDRYDP=false, +LAERSURF=true, +NSSALT=1, +NDDUST=3, +NSO4SCHEME=1, +LSEASALT_RH80=true, +LAERRRTM=true, +/ +&NAMCOMPO +LCHEM_DIA=true +LCHEM_DDFLX=true, +LCOMPO_DDFLX_DIR=true, +LCHEM_TROPO=true, +LCOMPO_DCDD=true, +LAERNITRATE=false, +LAEREQSAM4CLIM=false, +LAERSOA=false, +LAERSOA_COUPLED=false, +KGHG_CHEMTEND_CH4=0, +LAERNUCL=true, +AERO_SCHEME="hamm7", + + +/ +&NAMCHEM +CHEM_SCHEME='tm5' +LCHEM_DIAC=.false. +LCHEM_LIGHT=false, + +KCHEM_WETDEP=2, +LCHEM_0NOX=false, +KCHEM_NOXADV=0, +LCHEM_ANAO3=false, +KCHEM_SOLVE=2 +LCHEM_REVCHEM=false, +LCHEM_BASCOE_JON=false, +LCHEM_BASCOE_HETCHEM=true, +LCHEM_EXTENDJNO2=true, +LCHEM_JOUT=false, +LCHEM_AEROI=.false. +LCHEM_O3RAD=true, +KCHEM_DRYDEP=3, +LCHEM_CSHAPE=.false., +LCHEM_WDFR=.true., +/ +&NAMVAR +LMODERR=.false., +LJCDFI=.false., +LUSEJCDFI=.false., +LECV=false, +/ +&NAETLDIAG +/ +&NAMVV0 +LLFORCE_READ=false, +/ +&NAEAER +/ +&NAEPHY +/ +&NAERAD +/ +&NALBAR +/ +&NALORI +/ +&NAM_DISTRIBUTED_VECTORS +/ +&NAM926 +/ +&NAMAFN +/ +&NAMANA +/ +&NAMARPHY +/ +&NAMCA +/ +&NAMCAPE +/ +&NAMCFU +/ +&NAMCHK +/ +&NAMCHET +/ +&NAMCLDP +/ +&NAMCLTC +/ +&NAMCOM +/ +&NAMCOS +/ +&NAMCTAN +/ +&NAMCUMF +/ +&NAMCUMFS +/ +&NAMCT1 +/ +&NAMCVA +/ +&NAMDDH +/ +&NAMDFHD +/ +&NAMDFI +/ +&NAMDIF +/ +&NAMDIM +/ +&NAMDIMO +/ +&NAMDMSP +/ +&NAMDPHY +/ +&NAMDYN +/ +&NAMDYNA +/ +&NAMDYNA_STATIC +/ +&NAMDYNCORE +/ +&NAMEMIS_CONF +/ +&NAMENKF +/ +&NAMFA +/ +&NAMFFT +/ +&NAMFPC +/ +&NAMFPD +/ +&NAMFPDY2 +/ +&NAMFPDYH +/ +&NAMFPDYP +/ +&NAMFPDYS +/ +&NAMFPDYT +/ +&NAMFPDYV +/ +&NAMFPEZO +/ +&NAMFPF +/ +&NAMFPG +/ +&NAMFPIOS +/ +&NAMFPPHY +/ +&NAMFPSC2 +/ +&NAMFPSC2_DEP +/ +&NAMFY2 +/ +&NAMGEM +/ +&NAMGFL +/ +&NAMGMS +/ +&NAMGOES +/ +&NAMGOM +/ +&NAMGRIB +/ +&NAMGWD +/ +&NAMGWWMS +/ +&NAMHLOPT +/ +&NAMINI +/ +&NAMIOMI +/ +&NAMIOS +/ +&NAMJBCODES +/ +&NAMJFH +/ +&NAMJG +/ +&NAMJO +/ +&NAMKAP +/ +&NAMLCZ +/ +&NAMLEG +/ +&NAMLFI +/ +&NAMMCC +/ +&NAMMCUF +/ +&NAMMETEOSAT +/ +&NAMMTS +/ +&NAMMTSAT +/ +&NAMMTT +/ +&NAMMUL +/ +&NAMNMI +/ +&NAMNASA +/ +&NAMNN +/ +&NAMNPROF +/ +&NAMNUD +/ +&NAMOBS +/ +&NAMONEDVAR +/ +&NAMOPH +/ +&NAMOPTCMEM +/ +&NAMPAR0 +/ +&NAMPARAR +/ +&NAMPAR1 +/ +&NAMPHY +/ +&NAMPHY0 +/ +&NAMPHY1 +/ +&NAMPHY2 +/ +&NAMPHY3 +/ +&NAMPHYDS +/ +&NAMPPC +/ +&NAMPONG +/ +&NAMRAD15 +/ +&NAMRADCMEM +/ +&NAMRCOEF +/ +&NAMRES +/ +&NAMRINC +/ +&NAMRIP +/ +&NAMSATS +/ +&NAMSCC +/ +&NAMSCEN +/ +&NAMSCM +/ +&NAMSENS +/ +&NAMSIMPHL +/ +&NAMSKF +/ +&NAMSPSDT +/ +&NAMSPP +/ +&NAMSSMI +/ +&NAMSTA +/ +&NAMSTOPH +/ +&NAMTCWV +/ +&NAMTESTVAR +/ +&NAMTOPH +/ +&NAMTOVS +/ +&NAMTRAJP +/ +&NAMTRANS +/ +&NAMTRM +/ +&NAMVAR +/ +&NAMVARBC +/ +&NAMVARBC_AIREP +/ +&NAMVARBC_ALLSKY +/ +&NAMVARBC_GBRAD +/ +&NAMVARBC_RAD +/ +&NAMVARBC_SFCOBS +/ +&NAMVARBC_TCWV +/ +&NAMVARBC_TO3 +/ +&NAMVAREPS +/ +&NAMVDOZ +/ +&NAMVFP +/ +&NAMVRTL +/ +&NAMVV0 +/ +&NAMVV1 +/ +&NAMVV2 +/ +&NAMVWRK +/ +&NAMWAVELETJB +/ +&NAMXFU +/ +&NAMZDI +/ +&NAPHLC +/ +&NAV1IS +/ +&NAEPHLI +/ +&NAMCVER +/ +&NAMPPVI +/ +&NAMSPNG +/ +&NAMRLX +/ +&NAMTHLIM +/ +&NAMOOPS +/ +&NAMINTFLEX +/ +&NAMIAU +/ +&NAMDIM_TRAJ +/ +&NAMVDF +/ +&NAMGWDIAG +/ +&NAMTRANS0 +/ +&NAMMETHOX +/ +&NAM_ATLAS_IFS +/ +&NAETLDIAG +/ +&NAMACV +/ +&NAM_MGRIDS_ADVECTION +/ +&NAMTRAJ +/ +&NAMSATSIM +/ +&NAMCMEM_MW +/ +&NAMPHMSE +/ +&NAMNORGWD +/ +&NAMCLRADLID +/ +&NAMDVISI +/ +&NAM_MGRIDS_ADVECTION +/ +&NAMNUDGLH +/ +&NAMPERTOBS +/ +&NAMVARBC_MODES +/ +&NAMM7CTL +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219209 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="awb" + THIS%PARAMID=216145 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="com" + THIS%PARAMID=216121 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212001 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="ene" + THIS%PARAMID=212002 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="fef" + THIS%PARAMID=212003 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="ind" + THIS%PARAMID=212004 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="res" + THIS%PARAMID=212006 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="shp" + THIS%PARAMID=212007 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="slv" + THIS%PARAMID=212189 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="swd" + THIS%PARAMID=212008 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="tnr" + THIS%PARAMID=212009 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="tro" + THIS%PARAMID=212010 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PSD_RADIUS=0.03e-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 + THIS%PARAMID=210091 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="awb" + THIS%PARAMID=216142 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="com" + THIS%PARAMID=216119 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="ene" + THIS%PARAMID=212221 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="fef" + THIS%PARAMID=212222 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="ind" + THIS%PARAMID=212223 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="ref" + THIS%PARAMID=212229 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="res" + THIS%PARAMID=212224 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="shp" + THIS%PARAMID=212225 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="swd" + THIS%PARAMID=212226 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="tnr" + THIS%PARAMID=212227 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="tro" + THIS%PARAMID=212228 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="awb" + THIS%PARAMID=216123 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="com" + THIS%PARAMID=212101 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212011 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="ene" + THIS%PARAMID=212012 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="fef" + THIS%PARAMID=212013 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="ind" + THIS%PARAMID=212014 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="res" + THIS%PARAMID=212015 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="shp" + THIS%PARAMID=212016 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="slv" + THIS%PARAMID=212019 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="swd" + THIS%PARAMID=212017 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="tnr" + THIS%PARAMID=212018 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210106 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="awb" + THIS%PARAMID=216124 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="com" + THIS%PARAMID=212102 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212021 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212022 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="ene" + THIS%PARAMID=212023 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="fef" + THIS%PARAMID=212024 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="ind" + THIS%PARAMID=212025 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="ref" + THIS%PARAMID=212020 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="res" + THIS%PARAMID=212026 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="shp" + THIS%PARAMID=212027 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="slv" + THIS%PARAMID=212133 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="swd" + THIS%PARAMID=212028 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="tnr" + THIS%PARAMID=212029 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="tro" + THIS%PARAMID=212030 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210104 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="com" + THIS%PARAMID=212103 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212031 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="ene" + THIS%PARAMID=212032 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="fef" + THIS%PARAMID=212033 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="ind" + THIS%PARAMID=212034 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="ref" + THIS%PARAMID=212040 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="res" + THIS%PARAMID=212035 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="shp" + THIS%PARAMID=212036 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="slv" + THIS%PARAMID=212137 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="swd" + THIS%PARAMID=212037 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="tnr" + THIS%PARAMID=212038 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="tro" + THIS%PARAMID=212039 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210118 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="awb" + THIS%PARAMID=216126 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="com" + THIS%PARAMID=212104 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212041 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212042 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="ene" + THIS%PARAMID=212043 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="fef" + THIS%PARAMID=212044 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="ind" + THIS%PARAMID=212045 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="ref" + THIS%PARAMID=212134 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="res" + THIS%PARAMID=212046 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="shp" + THIS%PARAMID=212047 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="slv" + THIS%PARAMID=212185 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="swd" + THIS%PARAMID=212048 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="tnr" + THIS%PARAMID=212049 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="tro" + THIS%PARAMID=212050 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210107 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="awb" + THIS%PARAMID=216127 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="com" + THIS%PARAMID=212105 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212051 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212052 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="ene" + THIS%PARAMID=212053 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="fef" + THIS%PARAMID=212054 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="ind" + THIS%PARAMID=212055 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="ref" + THIS%PARAMID=212135 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="res" + THIS%PARAMID=212056 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="shp" + THIS%PARAMID=212057 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="slv" + THIS%PARAMID=212186 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="swd" + THIS%PARAMID=212058 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="tnr" + THIS%PARAMID=212059 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="tro" + THIS%PARAMID=212060 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210105 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="awb" + THIS%PARAMID=216128 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="com" + THIS%PARAMID=212106 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212061 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212062 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="ene" + THIS%PARAMID=212063 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="fef" + THIS%PARAMID=212064 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="ind" + THIS%PARAMID=212065 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="ref" + THIS%PARAMID=212136 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="res" + THIS%PARAMID=212066 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="shp" + THIS%PARAMID=212067 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="slv" + THIS%PARAMID=212187 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="swd" + THIS%PARAMID=212068 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="tnr" + THIS%PARAMID=212069 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="tro" + THIS%PARAMID=212070 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210108 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="awb" + THIS%PARAMID=216129 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="com" + THIS%PARAMID=212107 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212071 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.00 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="ene" + THIS%PARAMID=212072 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="fef" + THIS%PARAMID=212073 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="ind" + THIS%PARAMID=212074 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="ref" + THIS%PARAMID=212080 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="res" + THIS%PARAMID=212075 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="shp" + THIS%PARAMID=212076 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="slv" + THIS%PARAMID=212198 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="swd" + THIS%PARAMID=212077 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="tnr" + THIS%PARAMID=212078 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="tro" + THIS%PARAMID=212079 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210113 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="awb" + THIS%PARAMID=216130 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="com" + THIS%PARAMID=212108 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212081 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="ene" + THIS%PARAMID=212082 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="fef" + THIS%PARAMID=212083 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="ind" + THIS%PARAMID=212084 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="res" + THIS%PARAMID=212085 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="shp" + THIS%PARAMID=212086 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="slv" + THIS%PARAMID=212090 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="swd" + THIS%PARAMID=212087 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="tnr" + THIS%PARAMID=212088 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="tro" + THIS%PARAMID=212089 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219220 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="ene" + THIS%SCALING=0.0015 + THIS%PARAMID=212123 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="ind" + THIS%SCALING=0.0015 + THIS%PARAMID=212125 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="ref" + THIS%SCALING=0.0015 + THIS%PARAMID=212120 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="res" + THIS%SCALING=0.0015 + THIS%PARAMID=212126 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210115 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="awb" + THIS%PARAMID=216131 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="com" + THIS%PARAMID=212109 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212091 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="emiss_nat" + THIS%SCALING=1.4 + THIS%PARAMID=212122 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="ene" + THIS%PARAMID=212092 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="fef" + THIS%PARAMID=212093 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="ind" + THIS%PARAMID=212094 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="ref" + THIS%PARAMID=212100 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="res" + THIS%PARAMID=212095 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="shp" + THIS%PARAMID=212096 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="slv" + THIS%PARAMID=212190 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="swd" + THIS%PARAMID=212097 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="tnr" + THIS%PARAMID=212098 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="tro" + THIS%PARAMID=212099 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210103 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="com" + THIS%PARAMID=212245 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212111 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="ene" + THIS%PARAMID=212112 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="fef" + THIS%PARAMID=212113 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="ind" + THIS%PARAMID=212114 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="ref" + THIS%PARAMID=212110 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="res" + THIS%PARAMID=212115 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="shp" + THIS%PARAMID=212116 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="slv" + THIS%PARAMID=212140 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="swd" + THIS%PARAMID=212117 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="tnr" + THIS%PARAMID=212118 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="tro" + THIS%PARAMID=212119 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210081 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="awb" + THIS%PARAMID=216133 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="com" + THIS%PARAMID=212246 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212121 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212122 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="ene" + THIS%PARAMID=212123 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="fef" + THIS%PARAMID=212124 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="ind" + THIS%PARAMID=212125 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="ref" + THIS%PARAMID=212120 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="res" + THIS%PARAMID=212126 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="shp" + THIS%PARAMID=212127 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="swd" + THIS%PARAMID=212128 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="tnr" + THIS%PARAMID=212129 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="tro" + THIS%PARAMID=212130 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="DMS" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210117 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="DMS" + THIS%SECTOR="emi_oceans" + THIS%PARAMID=212131 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="DMS" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212132 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="GLY" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=212244 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219219 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="ene" + THIS%SCALING=0.001 + THIS%PARAMID=212123 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="ind" + THIS%SCALING=0.001 + THIS%PARAMID=212125 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="ref" + THIS%SCALING=0.001 + THIS%PARAMID=212120 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="res" + THIS%SCALING=0.001 + THIS%PARAMID=212126 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="com" + THIS%PARAMID=212247 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212141 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="ene" + THIS%PARAMID=212142 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="fef" + THIS%PARAMID=212143 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="ind" + THIS%PARAMID=212144 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="res" + THIS%PARAMID=212145 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="shp" + THIS%PARAMID=212146 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="slv" + THIS%PARAMID=212240 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="swd" + THIS%PARAMID=212147 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="tnr" + THIS%PARAMID=212148 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="tro" + THIS%PARAMID=212149 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ISPD" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212150 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="com" + THIS%PARAMID=212248 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212151 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="ene" + THIS%PARAMID=212152 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="fef" + THIS%PARAMID=212153 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="ind" + THIS%PARAMID=212154 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="res" + THIS%PARAMID=212155 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="shp" + THIS%PARAMID=212156 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="slv" + THIS%PARAMID=212241 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="swd" + THIS%PARAMID=212157 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="tnr" + THIS%PARAMID=212158 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="tro" + THIS%PARAMID=212159 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210116 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="agl" + THIS%PARAMID=212163 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ags" + THIS%PARAMID=212164 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGS" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="awb" + THIS%PARAMID=216134 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="com" + THIS%PARAMID=212249 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212161 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212162 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ene" + THIS%PARAMID=212165 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ind" + THIS%PARAMID=212166 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ref" + THIS%PARAMID=212138 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="res" + THIS%PARAMID=212167 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="slv" + THIS%PARAMID=212169 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="swd" + THIS%PARAMID=212170 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="tnr" + THIS%PARAMID=212171 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="tro" + THIS%PARAMID=212172 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210085 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="TotalSoilEmis" + THIS%PARAMID=212173 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="agl" + THIS%PARAMID=212174 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="awb" + THIS%PARAMID=216135 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="com" + THIS%PARAMID=212250 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="ene" + THIS%PARAMID=212176 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="fef" + THIS%PARAMID=212177 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="ind" + THIS%PARAMID=212178 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="ref" + THIS%PARAMID=212184 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="res" + THIS%PARAMID=212179 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="shp" + THIS%PARAMID=212180 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="swd" + THIS%PARAMID=212181 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="tnr" + THIS%PARAMID=212182 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="tro" + THIS%PARAMID=212183 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO2" + THIS%SECTOR="Aviation" + THIS%VERTICAL_PROFILE_TYPE="3D" + THIS%PARAMID=212255 + THIS%SCALING=1.53333333333333 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219208 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="awb" + THIS%PARAMID=216136 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="com" + THIS%PARAMID=212251 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212191 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="ene" + THIS%PARAMID=212192 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="fef" + THIS%PARAMID=212193 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="ind" + THIS%PARAMID=212194 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="ref" + THIS%PARAMID=212200 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="res" + THIS%PARAMID=212195 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="shp" + THIS%PARAMID=212196 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="slv" + THIS%PARAMID=212242 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="swd" + THIS%PARAMID=212197 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="tnr" + THIS%PARAMID=212188 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="tro" + THIS%PARAMID=212199 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219207 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="awb" + THIS%PARAMID=216137 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="com" + THIS%PARAMID=212252 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212201 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="ene" + THIS%PARAMID=212202 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="fef" + THIS%PARAMID=212203 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="ind" + THIS%PARAMID=212204 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="ref" + THIS%PARAMID=212139 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="res" + THIS%PARAMID=212205 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="shp" + THIS%PARAMID=212206 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="slv" + THIS%PARAMID=212243 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="swd" + THIS%PARAMID=212207 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="tnr" + THIS%PARAMID=212208 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="tro" + THIS%PARAMID=212209 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PSD_RADIUS=0.03e-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 + THIS%PARAMID=210090 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="awb" + THIS%PARAMID=216143 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="com" + THIS%PARAMID=216120 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="ene" + THIS%PARAMID=212231 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="fef" + THIS%PARAMID=212232 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="ind" + THIS%PARAMID=212233 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="ref" + THIS%PARAMID=212239 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="res" + THIS%PARAMID=212234 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="shp" + THIS%PARAMID=212235 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="swd" + THIS%PARAMID=212236 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="tnr" + THIS%PARAMID=212237 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="tro" + THIS%PARAMID=212238 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210102 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="awb" + THIS%PARAMID=216138 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="com" + THIS%PARAMID=216114 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212211 + THIS%VERTICAL_PROFILE_TYPE="AltitudeMap" + THIS%VERTICAL_PARAMID=216045 + THIS%VERTICAL_BASE_LEVEL=-1 + THIS%VERTICAL_TOP_LEVEL=-4 + THIS%VERTICAL_THRESHOLD=200 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="ene" + THIS%PARAMID=212212 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="fef" + THIS%PARAMID=212213 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="ind" + THIS%PARAMID=212214 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="ref" + THIS%PARAMID=212220 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="res" + THIS%PARAMID=212215 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="shp" + THIS%PARAMID=212216 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="tnr" + THIS%PARAMID=212218 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="tro" + THIS%PARAMID=212219 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="agl" + THIS%PARAMID=216221 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="ags" + THIS%PARAMID=216117 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGS" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="awb" + THIS%PARAMID=216141 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="com" + THIS%PARAMID=216118 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="ene" + THIS%PARAMID=216222 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="fef" + THIS%PARAMID=216223 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="ind" + THIS%PARAMID=216224 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="ref" + THIS%PARAMID=216225 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="res" + THIS%PARAMID=216226 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="shp" + THIS%PARAMID=216227 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="slv" + THIS%PARAMID=216228 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="swd" + THIS%PARAMID=216229 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="tnr" + THIS%PARAMID=216230 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="tro" + THIS%PARAMID=216231 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219212 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="awb" + THIS%PARAMID=216139 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="com" + THIS%PARAMID=216115 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=216200 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="ene" + THIS%PARAMID=216201 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="fef" + THIS%PARAMID=216202 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="ind" + THIS%PARAMID=216203 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="ref" + THIS%PARAMID=216204 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="res" + THIS%PARAMID=216205 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="shp" + THIS%PARAMID=216206 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="slv" + THIS%PARAMID=216207 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="swd" + THIS%PARAMID=216208 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="tnr" + THIS%PARAMID=216209 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="tro" + THIS%PARAMID=216210 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219213 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="awb" + THIS%PARAMID=216140 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="com" + THIS%PARAMID=216116 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="ene" + THIS%PARAMID=216211 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="fef" + THIS%PARAMID=216212 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="ind" + THIS%PARAMID=216213 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="ref" + THIS%PARAMID=216214 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="res" + THIS%PARAMID=216215 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="shp" + THIS%PARAMID=216216 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="slv" + THIS%PARAMID=216217 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="swd" + THIS%PARAMID=216218 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="tnr" + THIS%PARAMID=216219 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="tro" + THIS%PARAMID=216220 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS +/ +&NAMCOMPO_EMIS_AUX + THIS%PARAMID=210060 +/ +&NAMCOMPO_EMIS_AUX + THIS%PARAMID=216045 +/ +&NAMCOMPO_EMIS_AUX +/ diff --git a/ifs-test/tests/t255/common/m7/m7_compoemis.nml b/ifs-test/tests/t255/common/m7/m7_compoemis.nml index c8481653..097df8e7 100644 --- a/ifs-test/tests/t255/common/m7/m7_compoemis.nml +++ b/ifs-test/tests/t255/common/m7/m7_compoemis.nml @@ -1,301 +1,2604 @@ cat >> fort.4 << EOF -&NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=219209 / -&NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="emiss_bio" THIS%PARAMID=212001 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.25 / -&NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="ene" THIS%PARAMID=212002 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="fef" THIS%PARAMID=212003 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / -&NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="ind" THIS%PARAMID=212004 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / -&NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="res" THIS%PARAMID=212006 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / -&NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="shp" THIS%PARAMID=212007 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="slv" THIS%PARAMID=212189 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / -&NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="swd" THIS%PARAMID=212008 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="tnr" THIS%PARAMID=212009 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / -&NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="tro" THIS%PARAMID=212010 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / -&NAMCOMPO_EMIS THIS%SPECIES="BC_KI" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PSD_RADIUS=0.03e-6 THIS%PSD_SIGMA=1.59 THIS%PSD_N0_TRACER="KI_N" THIS%MASS_DENSITY=1800 THIS%PARAMID=210091 / -&NAMCOMPO_EMIS THIS%SPECIES="BC_KI" THIS%SECTOR="ene" THIS%PARAMID=212221 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="BC_KI" THIS%SECTOR="fef" THIS%PARAMID=212222 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / -&NAMCOMPO_EMIS THIS%SPECIES="BC_KI" THIS%SECTOR="ind" THIS%PARAMID=212223 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / -&NAMCOMPO_EMIS THIS%SPECIES="BC_KI" THIS%SECTOR="ref" THIS%PARAMID=212229 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="BC_KI" THIS%SECTOR="res" THIS%PARAMID=212224 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / -&NAMCOMPO_EMIS THIS%SPECIES="BC_KI" THIS%SECTOR="shp" THIS%PARAMID=212225 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="BC_KI" THIS%SECTOR="swd" THIS%PARAMID=212226 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="BC_KI" THIS%SECTOR="tnr" THIS%PARAMID=212227 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / -&NAMCOMPO_EMIS THIS%SPECIES="BC_KI" THIS%SECTOR="tro" THIS%PARAMID=212228 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / -&NAMCOMPO_EMIS THIS%SPECIES="C10H16" THIS%SECTOR="emiss_bio" THIS%PARAMID=212011 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.65 / -&NAMCOMPO_EMIS THIS%SPECIES="C10H16" THIS%SECTOR="ene" THIS%PARAMID=212012 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="C10H16" THIS%SECTOR="fef" THIS%PARAMID=212013 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / -&NAMCOMPO_EMIS THIS%SPECIES="C10H16" THIS%SECTOR="ind" THIS%PARAMID=212014 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / -&NAMCOMPO_EMIS THIS%SPECIES="C10H16" THIS%SECTOR="res" THIS%PARAMID=212015 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / -&NAMCOMPO_EMIS THIS%SPECIES="C10H16" THIS%SECTOR="shp" THIS%PARAMID=212016 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="C10H16" THIS%SECTOR="slv" THIS%PARAMID=212019 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / -&NAMCOMPO_EMIS THIS%SPECIES="C10H16" THIS%SECTOR="swd" THIS%PARAMID=212017 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="C10H16" THIS%SECTOR="tnr" THIS%PARAMID=212018 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / -&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210106 / -&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="emiss_bio" THIS%PARAMID=212021 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.25 / -&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="emiss_nat" THIS%PARAMID=212022 / -&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="ene" THIS%PARAMID=212023 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="fef" THIS%PARAMID=212024 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / -&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="ind" THIS%PARAMID=212025 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / -&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="ref" THIS%PARAMID=212020 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="res" THIS%PARAMID=212026 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / -&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="shp" THIS%PARAMID=212027 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="slv" THIS%PARAMID=212133 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / -&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="swd" THIS%PARAMID=212028 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="tnr" THIS%PARAMID=212029 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / -&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="tro" THIS%PARAMID=212030 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / -&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210104 / -&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="emiss_bio" THIS%PARAMID=212031 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.25 / -&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="ene" THIS%PARAMID=212032 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="fef" THIS%PARAMID=212033 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / -&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="ind" THIS%PARAMID=212034 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / -&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="ref" THIS%PARAMID=212040 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="res" THIS%PARAMID=212035 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / -&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="shp" THIS%PARAMID=212036 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="slv" THIS%PARAMID=212137 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / -&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="swd" THIS%PARAMID=212037 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="tnr" THIS%PARAMID=212038 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / -&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="tro" THIS%PARAMID=212039 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / -&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210118 / -&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="emiss_bio" THIS%PARAMID=212041 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.65 / -&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="emiss_nat" THIS%PARAMID=212042 / -&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="ene" THIS%PARAMID=212043 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="fef" THIS%PARAMID=212044 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / -&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="ind" THIS%PARAMID=212045 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / -&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="ref" THIS%PARAMID=212134 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="res" THIS%PARAMID=212046 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / -&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="shp" THIS%PARAMID=212047 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="slv" THIS%PARAMID=212185 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / -&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="swd" THIS%PARAMID=212048 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="tnr" THIS%PARAMID=212049 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / -&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="tro" THIS%PARAMID=212050 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / -&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210107 / -&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="emiss_bio" THIS%PARAMID=212051 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.65 / -&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="emiss_nat" THIS%PARAMID=212052 / -&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="ene" THIS%PARAMID=212053 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="fef" THIS%PARAMID=212054 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / -&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="ind" THIS%PARAMID=212055 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / -&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="ref" THIS%PARAMID=212135 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="res" THIS%PARAMID=212056 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / -&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="shp" THIS%PARAMID=212057 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="slv" THIS%PARAMID=212186 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / -&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="swd" THIS%PARAMID=212058 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="tnr" THIS%PARAMID=212059 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / -&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="tro" THIS%PARAMID=212060 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / -&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210105 / -&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="emiss_bio" THIS%PARAMID=212061 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.65 / -&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="emiss_nat" THIS%PARAMID=212062 / -&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="ene" THIS%PARAMID=212063 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="fef" THIS%PARAMID=212064 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / -&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="ind" THIS%PARAMID=212065 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / -&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="ref" THIS%PARAMID=212136 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="res" THIS%PARAMID=212066 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / -&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="shp" THIS%PARAMID=212067 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="slv" THIS%PARAMID=212187 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / -&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="swd" THIS%PARAMID=212068 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="tnr" THIS%PARAMID=212069 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / -&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="tro" THIS%PARAMID=212070 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / -&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210108 / -&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="emiss_bio" THIS%PARAMID=212071 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.00 / -&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="ene" THIS%PARAMID=212072 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="fef" THIS%PARAMID=212073 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / -&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="ind" THIS%PARAMID=212074 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / -&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="ref" THIS%PARAMID=212080 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="res" THIS%PARAMID=212075 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / -&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="shp" THIS%PARAMID=212076 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="slv" THIS%PARAMID=212198 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / -&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="swd" THIS%PARAMID=212077 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="tnr" THIS%PARAMID=212078 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / -&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="tro" THIS%PARAMID=212079 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / -&NAMCOMPO_EMIS THIS%SPECIES="CH2O" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210113 / -&NAMCOMPO_EMIS THIS%SPECIES="CH2O" THIS%SECTOR="emiss_bio" THIS%PARAMID=212081 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.25 / -&NAMCOMPO_EMIS THIS%SPECIES="CH2O" THIS%SECTOR="ene" THIS%PARAMID=212082 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="CH2O" THIS%SECTOR="fef" THIS%PARAMID=212083 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / -&NAMCOMPO_EMIS THIS%SPECIES="CH2O" THIS%SECTOR="ind" THIS%PARAMID=212084 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / -&NAMCOMPO_EMIS THIS%SPECIES="CH2O" THIS%SECTOR="res" THIS%PARAMID=212085 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / -&NAMCOMPO_EMIS THIS%SPECIES="CH2O" THIS%SECTOR="shp" THIS%PARAMID=212086 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="CH2O" THIS%SECTOR="slv" THIS%PARAMID=212090 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / -&NAMCOMPO_EMIS THIS%SPECIES="CH2O" THIS%SECTOR="swd" THIS%PARAMID=212087 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="CH2O" THIS%SECTOR="tnr" THIS%PARAMID=212088 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / -&NAMCOMPO_EMIS THIS%SPECIES="CH2O" THIS%SECTOR="tro" THIS%PARAMID=212089 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / -&NAMCOMPO_EMIS THIS%SPECIES="CH3CN" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=219220 / -&NAMCOMPO_EMIS THIS%SPECIES="CH3CN" THIS%SECTOR="ene" THIS%SCALING=0.0015 THIS%PARAMID=212123 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="CH3CN" THIS%SECTOR="ind" THIS%SCALING=0.0015 THIS%PARAMID=212125 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / -&NAMCOMPO_EMIS THIS%SPECIES="CH3CN" THIS%SECTOR="ref" THIS%SCALING=0.0015 THIS%PARAMID=212120 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="CH3CN" THIS%SECTOR="res" THIS%SCALING=0.0015 THIS%PARAMID=212126 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / -&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210115 / -&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="emiss_bio" THIS%PARAMID=212091 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.65 / -&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="emiss_nat" THIS%SCALING=1.4 THIS%PARAMID=212122 / -&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="ene" THIS%PARAMID=212092 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="fef" THIS%PARAMID=212093 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / -&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="ind" THIS%PARAMID=212094 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / -&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="ref" THIS%PARAMID=212100 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="res" THIS%PARAMID=212095 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / -&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="shp" THIS%PARAMID=212096 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="slv" THIS%PARAMID=212190 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / -&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="swd" THIS%PARAMID=212097 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="tnr" THIS%PARAMID=212098 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / -&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="tro" THIS%PARAMID=212099 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / -&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210103 / -&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="emiss_bio" THIS%PARAMID=212111 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.25 / -&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="ene" THIS%PARAMID=212112 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="fef" THIS%PARAMID=212113 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / -&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="ind" THIS%PARAMID=212114 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / -&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="ref" THIS%PARAMID=212110 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="res" THIS%PARAMID=212115 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / -&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="shp" THIS%PARAMID=212116 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="slv" THIS%PARAMID=212140 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / -&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="swd" THIS%PARAMID=212117 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="tnr" THIS%PARAMID=212118 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / -&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="tro" THIS%PARAMID=212119 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / -&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210081 / -&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="emiss_bio" THIS%PARAMID=212121 / -&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="emiss_nat" THIS%PARAMID=212122 / -&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="ene" THIS%PARAMID=212123 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="fef" THIS%PARAMID=212124 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / -&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="ind" THIS%PARAMID=212125 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / -&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="ref" THIS%PARAMID=212120 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="res" THIS%PARAMID=212126 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / -&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="shp" THIS%PARAMID=212127 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="swd" THIS%PARAMID=212128 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="tnr" THIS%PARAMID=212129 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / -&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="tro" THIS%PARAMID=212130 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / -&NAMCOMPO_EMIS THIS%SPECIES="DMS" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210117 / -&NAMCOMPO_EMIS THIS%SPECIES="DMS" THIS%SECTOR="emiss_bio" THIS%PARAMID=212132 / -&NAMCOMPO_EMIS THIS%SPECIES="DMS" THIS%SECTOR="emiss_nat" THIS%PARAMID=212131 / -&NAMCOMPO_EMIS THIS%SPECIES="GLY" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=212244 / -&NAMCOMPO_EMIS THIS%SPECIES="HCN" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=219219 / -&NAMCOMPO_EMIS THIS%SPECIES="HCN" THIS%SECTOR="ene" THIS%SCALING=0.001 THIS%PARAMID=212123 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="HCN" THIS%SECTOR="ind" THIS%SCALING=0.001 THIS%PARAMID=212125 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / -&NAMCOMPO_EMIS THIS%SPECIES="HCN" THIS%SECTOR="ref" THIS%SCALING=0.001 THIS%PARAMID=212120 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="HCN" THIS%SECTOR="res" THIS%SCALING=0.001 THIS%PARAMID=212126 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / -&NAMCOMPO_EMIS THIS%SPECIES="HCOOH" THIS%SECTOR="emiss_bio" THIS%PARAMID=212141 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.25 / -&NAMCOMPO_EMIS THIS%SPECIES="HCOOH" THIS%SECTOR="ene" THIS%PARAMID=212142 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="HCOOH" THIS%SECTOR="fef" THIS%PARAMID=212143 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / -&NAMCOMPO_EMIS THIS%SPECIES="HCOOH" THIS%SECTOR="ind" THIS%PARAMID=212144 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / -&NAMCOMPO_EMIS THIS%SPECIES="HCOOH" THIS%SECTOR="res" THIS%PARAMID=212145 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / -&NAMCOMPO_EMIS THIS%SPECIES="HCOOH" THIS%SECTOR="shp" THIS%PARAMID=212146 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="HCOOH" THIS%SECTOR="slv" THIS%PARAMID=212240 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / -&NAMCOMPO_EMIS THIS%SPECIES="HCOOH" THIS%SECTOR="swd" THIS%PARAMID=212147 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="HCOOH" THIS%SECTOR="tnr" THIS%PARAMID=212148 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / -&NAMCOMPO_EMIS THIS%SPECIES="HCOOH" THIS%SECTOR="tro" THIS%PARAMID=212149 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / -&NAMCOMPO_EMIS THIS%SPECIES="ISPD" THIS%SECTOR="emiss_bio" THIS%PARAMID=212150 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.65 / -&NAMCOMPO_EMIS THIS%SPECIES="MCOOH" THIS%SECTOR="emiss_bio" THIS%PARAMID=212151 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.25 / -&NAMCOMPO_EMIS THIS%SPECIES="MCOOH" THIS%SECTOR="ene" THIS%PARAMID=212152 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="MCOOH" THIS%SECTOR="fef" THIS%PARAMID=212153 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / -&NAMCOMPO_EMIS THIS%SPECIES="MCOOH" THIS%SECTOR="ind" THIS%PARAMID=212154 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / -&NAMCOMPO_EMIS THIS%SPECIES="MCOOH" THIS%SECTOR="res" THIS%PARAMID=212155 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / -&NAMCOMPO_EMIS THIS%SPECIES="MCOOH" THIS%SECTOR="shp" THIS%PARAMID=212156 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="MCOOH" THIS%SECTOR="slv" THIS%PARAMID=212241 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / -&NAMCOMPO_EMIS THIS%SPECIES="MCOOH" THIS%SECTOR="swd" THIS%PARAMID=212157 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="MCOOH" THIS%SECTOR="tnr" THIS%PARAMID=212158 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / -&NAMCOMPO_EMIS THIS%SPECIES="MCOOH" THIS%SECTOR="tro" THIS%PARAMID=212159 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / -&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210116 / -&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="agl" THIS%PARAMID=212163 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" / -&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="ags" THIS%PARAMID=212164 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGS" / -&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="emiss_bio" THIS%PARAMID=212161 / -&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="emiss_nat" THIS%PARAMID=212162 / -&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="ene" THIS%PARAMID=212165 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="ind" THIS%PARAMID=212166 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / -&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="ref" THIS%PARAMID=212138 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="res" THIS%PARAMID=212167 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / -&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="slv" THIS%PARAMID=212169 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / -&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="swd" THIS%PARAMID=212170 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="tnr" THIS%PARAMID=212171 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / -&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="tro" THIS%PARAMID=212172 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / -&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210085 / -&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="agl" THIS%PARAMID=212174 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" / -&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="emiss_nat" THIS%PARAMID=212173 / -&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="ene" THIS%PARAMID=212176 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="fef" THIS%PARAMID=212177 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / -&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="ind" THIS%PARAMID=212178 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / -&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="ref" THIS%PARAMID=212184 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="res" THIS%PARAMID=212179 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / -&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="shp" THIS%PARAMID=212180 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="swd" THIS%PARAMID=212181 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="tnr" THIS%PARAMID=212182 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / -&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="tro" THIS%PARAMID=212183 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / -&NAMCOMPO_EMIS THIS%SPECIES="NO2" THIS%SECTOR="Aviation" THIS%VERTICAL_PROFILE_TYPE="3D" THIS%PARAMID=212255 THIS%SCALING=1.53333333333333 / -&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=219208 / -&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="emiss_bio" THIS%PARAMID=212191 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.65 / -&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="ene" THIS%PARAMID=212192 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="fef" THIS%PARAMID=212193 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / -&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="ind" THIS%PARAMID=212194 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / -&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="ref" THIS%PARAMID=212200 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="res" THIS%PARAMID=212195 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / -&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="shp" THIS%PARAMID=212196 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="slv" THIS%PARAMID=212242 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / -&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="swd" THIS%PARAMID=212197 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="tnr" THIS%PARAMID=212188 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / -&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="tro" THIS%PARAMID=212199 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / -&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=219207 / -&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="emiss_bio" THIS%PARAMID=212201 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.65 / -&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="ene" THIS%PARAMID=212202 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="fef" THIS%PARAMID=212203 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / -&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="ind" THIS%PARAMID=212204 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / -&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="ref" THIS%PARAMID=212139 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="res" THIS%PARAMID=212205 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / -&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="shp" THIS%PARAMID=212206 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="slv" THIS%PARAMID=212243 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / -&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="swd" THIS%PARAMID=212207 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="tnr" THIS%PARAMID=212208 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / -&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="tro" THIS%PARAMID=212209 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / -&NAMCOMPO_EMIS THIS%SPECIES="POM_KI" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PSD_RADIUS=0.03E-6 THIS%PSD_SIGMA=1.59 THIS%PSD_N0_TRACER="KI_N" THIS%MASS_DENSITY=1300 THIS%PARAMID=210090 / -&NAMCOMPO_EMIS THIS%SPECIES="POM_KI" THIS%SECTOR="ene" THIS%PARAMID=212231 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="POM_KI" THIS%SECTOR="fef" THIS%PARAMID=212232 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / -&NAMCOMPO_EMIS THIS%SPECIES="POM_KI" THIS%SECTOR="ind" THIS%PARAMID=212233 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / -&NAMCOMPO_EMIS THIS%SPECIES="POM_KI" THIS%SECTOR="ref" THIS%PARAMID=212239 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="POM_KI" THIS%SECTOR="res" THIS%PARAMID=212234 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / -&NAMCOMPO_EMIS THIS%SPECIES="POM_KI" THIS%SECTOR="shp" THIS%PARAMID=212235 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="POM_KI" THIS%SECTOR="swd" THIS%PARAMID=212236 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="POM_KI" THIS%SECTOR="tnr" THIS%PARAMID=212237 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / -&NAMCOMPO_EMIS THIS%SPECIES="POM_KI" THIS%SECTOR="tro" THIS%PARAMID=212238 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / -&NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210102 / -&NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="emiss_nat" THIS%PARAMID=212211 THIS%VERTICAL_PROFILE_TYPE="AltitudeMap" THIS%VERTICAL_PARAMID=216045 THIS%VERTICAL_BASE_LEVEL=-1 THIS%VERTICAL_TOP_LEVEL=-4 THIS%VERTICAL_THRESHOLD=200 / -&NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="ene" THIS%PARAMID=212212 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="fef" THIS%PARAMID=212213 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / -&NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="ind" THIS%PARAMID=212214 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / -&NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="ref" THIS%PARAMID=212220 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="res" THIS%PARAMID=212215 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / -&NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="shp" THIS%PARAMID=212216 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="tnr" THIS%PARAMID=212218 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / -&NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="tro" THIS%PARAMID=212219 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / -&NAMCOMPO_EMIS THIS%SPECIES="SOG2B" THIS%SECTOR="agl" THIS%PARAMID=216221 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" / -&NAMCOMPO_EMIS THIS%SPECIES="SOG2B" THIS%SECTOR="ene" THIS%PARAMID=216222 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="SOG2B" THIS%SECTOR="fef" THIS%PARAMID=216223 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / -&NAMCOMPO_EMIS THIS%SPECIES="SOG2B" THIS%SECTOR="ind" THIS%PARAMID=216224 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / -&NAMCOMPO_EMIS THIS%SPECIES="SOG2B" THIS%SECTOR="ref" THIS%PARAMID=216225 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="SOG2B" THIS%SECTOR="res" THIS%PARAMID=216226 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / -&NAMCOMPO_EMIS THIS%SPECIES="SOG2B" THIS%SECTOR="shp" THIS%PARAMID=216227 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="SOG2B" THIS%SECTOR="slv" THIS%PARAMID=216228 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / -&NAMCOMPO_EMIS THIS%SPECIES="SOG2B" THIS%SECTOR="swd" THIS%PARAMID=216229 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="SOG2B" THIS%SECTOR="tnr" THIS%PARAMID=216230 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / -&NAMCOMPO_EMIS THIS%SPECIES="SOG2B" THIS%SECTOR="tro" THIS%PARAMID=216231 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / -&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=219212 / -&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="emiss_bio" THIS%PARAMID=216200 / -&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="ene" THIS%PARAMID=216201 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="fef" THIS%PARAMID=216202 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / -&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="ind" THIS%PARAMID=216203 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / -&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="ref" THIS%PARAMID=216204 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="res" THIS%PARAMID=216205 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / -&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="shp" THIS%PARAMID=216206 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="slv" THIS%PARAMID=216207 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / -&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="swd" THIS%PARAMID=216208 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="tnr" THIS%PARAMID=216209 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / -&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="tro" THIS%PARAMID=216210 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / -&NAMCOMPO_EMIS THIS%SPECIES="XYL" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=219213 / -&NAMCOMPO_EMIS THIS%SPECIES="XYL" THIS%SECTOR="ene" THIS%PARAMID=216211 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="XYL" THIS%SECTOR="fef" THIS%PARAMID=216212 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / -&NAMCOMPO_EMIS THIS%SPECIES="XYL" THIS%SECTOR="ind" THIS%PARAMID=216213 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / -&NAMCOMPO_EMIS THIS%SPECIES="XYL" THIS%SECTOR="ref" THIS%PARAMID=216214 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / -&NAMCOMPO_EMIS THIS%SPECIES="XYL" THIS%SECTOR="res" THIS%PARAMID=216215 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / -&NAMCOMPO_EMIS THIS%SPECIES="XYL" THIS%SECTOR="shp" THIS%PARAMID=216216 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="XYL" THIS%SECTOR="slv" THIS%PARAMID=216217 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / -&NAMCOMPO_EMIS THIS%SPECIES="XYL" THIS%SECTOR="swd" THIS%PARAMID=216218 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / -&NAMCOMPO_EMIS THIS%SPECIES="XYL" THIS%SECTOR="tnr" THIS%PARAMID=216219 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / -&NAMCOMPO_EMIS THIS%SPECIES="XYL" THIS%SECTOR="tro" THIS%PARAMID=216220 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / -&NAMCOMPO_EMIS / -&NAMCOMPO_EMIS_AUX THIS%PARAMID=210060 / -&NAMCOMPO_EMIS_AUX THIS%PARAMID=216045 / -&NAMCOMPO_EMIS_AUX / +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219209 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="awb" + THIS%PARAMID=216145 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="com" + THIS%PARAMID=216121 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212001 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="ene" + THIS%PARAMID=212002 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="fef" + THIS%PARAMID=212003 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="ind" + THIS%PARAMID=212004 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="res" + THIS%PARAMID=212006 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="shp" + THIS%PARAMID=212007 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="slv" + THIS%PARAMID=212189 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="swd" + THIS%PARAMID=212008 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="tnr" + THIS%PARAMID=212009 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="tro" + THIS%PARAMID=212010 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PSD_RADIUS=0.03e-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 + THIS%PARAMID=210091 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="awb" + THIS%PARAMID=216142 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="com" + THIS%PARAMID=216119 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="ene" + THIS%PARAMID=212221 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="fef" + THIS%PARAMID=212222 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="ind" + THIS%PARAMID=212223 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="ref" + THIS%PARAMID=212229 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="res" + THIS%PARAMID=212224 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="shp" + THIS%PARAMID=212225 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="swd" + THIS%PARAMID=212226 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="tnr" + THIS%PARAMID=212227 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="tro" + THIS%PARAMID=212228 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="awb" + THIS%PARAMID=216123 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="com" + THIS%PARAMID=212101 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212011 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="ene" + THIS%PARAMID=212012 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="fef" + THIS%PARAMID=212013 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="ind" + THIS%PARAMID=212014 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="res" + THIS%PARAMID=212015 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="shp" + THIS%PARAMID=212016 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="slv" + THIS%PARAMID=212019 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="swd" + THIS%PARAMID=212017 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="tnr" + THIS%PARAMID=212018 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210106 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="awb" + THIS%PARAMID=216124 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="com" + THIS%PARAMID=212102 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212021 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212022 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="ene" + THIS%PARAMID=212023 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="fef" + THIS%PARAMID=212024 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="ind" + THIS%PARAMID=212025 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="ref" + THIS%PARAMID=212020 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="res" + THIS%PARAMID=212026 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="shp" + THIS%PARAMID=212027 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="slv" + THIS%PARAMID=212133 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="swd" + THIS%PARAMID=212028 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="tnr" + THIS%PARAMID=212029 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="tro" + THIS%PARAMID=212030 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210104 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="com" + THIS%PARAMID=212103 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212031 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="ene" + THIS%PARAMID=212032 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="fef" + THIS%PARAMID=212033 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="ind" + THIS%PARAMID=212034 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="ref" + THIS%PARAMID=212040 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="res" + THIS%PARAMID=212035 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="shp" + THIS%PARAMID=212036 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="slv" + THIS%PARAMID=212137 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="swd" + THIS%PARAMID=212037 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="tnr" + THIS%PARAMID=212038 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="tro" + THIS%PARAMID=212039 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210118 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="awb" + THIS%PARAMID=216126 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="com" + THIS%PARAMID=212104 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212041 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212042 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="ene" + THIS%PARAMID=212043 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="fef" + THIS%PARAMID=212044 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="ind" + THIS%PARAMID=212045 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="ref" + THIS%PARAMID=212134 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="res" + THIS%PARAMID=212046 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="shp" + THIS%PARAMID=212047 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="slv" + THIS%PARAMID=212185 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="swd" + THIS%PARAMID=212048 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="tnr" + THIS%PARAMID=212049 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="tro" + THIS%PARAMID=212050 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210107 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="awb" + THIS%PARAMID=216127 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="com" + THIS%PARAMID=212105 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212051 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212052 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="ene" + THIS%PARAMID=212053 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="fef" + THIS%PARAMID=212054 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="ind" + THIS%PARAMID=212055 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="ref" + THIS%PARAMID=212135 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="res" + THIS%PARAMID=212056 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="shp" + THIS%PARAMID=212057 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="slv" + THIS%PARAMID=212186 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="swd" + THIS%PARAMID=212058 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="tnr" + THIS%PARAMID=212059 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="tro" + THIS%PARAMID=212060 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210105 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="awb" + THIS%PARAMID=216128 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="com" + THIS%PARAMID=212106 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212061 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212062 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="ene" + THIS%PARAMID=212063 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="fef" + THIS%PARAMID=212064 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="ind" + THIS%PARAMID=212065 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="ref" + THIS%PARAMID=212136 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="res" + THIS%PARAMID=212066 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="shp" + THIS%PARAMID=212067 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="slv" + THIS%PARAMID=212187 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="swd" + THIS%PARAMID=212068 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="tnr" + THIS%PARAMID=212069 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="tro" + THIS%PARAMID=212070 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210108 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="awb" + THIS%PARAMID=216129 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="com" + THIS%PARAMID=212107 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212071 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.00 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="ene" + THIS%PARAMID=212072 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="fef" + THIS%PARAMID=212073 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="ind" + THIS%PARAMID=212074 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="ref" + THIS%PARAMID=212080 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="res" + THIS%PARAMID=212075 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="shp" + THIS%PARAMID=212076 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="slv" + THIS%PARAMID=212198 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="swd" + THIS%PARAMID=212077 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="tnr" + THIS%PARAMID=212078 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="tro" + THIS%PARAMID=212079 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210113 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="awb" + THIS%PARAMID=216130 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="com" + THIS%PARAMID=212108 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212081 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="ene" + THIS%PARAMID=212082 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="fef" + THIS%PARAMID=212083 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="ind" + THIS%PARAMID=212084 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="res" + THIS%PARAMID=212085 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="shp" + THIS%PARAMID=212086 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="slv" + THIS%PARAMID=212090 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="swd" + THIS%PARAMID=212087 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="tnr" + THIS%PARAMID=212088 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="tro" + THIS%PARAMID=212089 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219220 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="ene" + THIS%SCALING=0.0015 + THIS%PARAMID=212123 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="ind" + THIS%SCALING=0.0015 + THIS%PARAMID=212125 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="ref" + THIS%SCALING=0.0015 + THIS%PARAMID=212120 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="res" + THIS%SCALING=0.0015 + THIS%PARAMID=212126 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210115 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="awb" + THIS%PARAMID=216131 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="com" + THIS%PARAMID=212109 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212091 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="emiss_nat" + THIS%SCALING=1.4 + THIS%PARAMID=212122 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="ene" + THIS%PARAMID=212092 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="fef" + THIS%PARAMID=212093 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="ind" + THIS%PARAMID=212094 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="ref" + THIS%PARAMID=212100 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="res" + THIS%PARAMID=212095 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="shp" + THIS%PARAMID=212096 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="slv" + THIS%PARAMID=212190 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="swd" + THIS%PARAMID=212097 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="tnr" + THIS%PARAMID=212098 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="tro" + THIS%PARAMID=212099 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210103 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="com" + THIS%PARAMID=212245 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212111 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="ene" + THIS%PARAMID=212112 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="fef" + THIS%PARAMID=212113 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="ind" + THIS%PARAMID=212114 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="ref" + THIS%PARAMID=212110 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="res" + THIS%PARAMID=212115 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="shp" + THIS%PARAMID=212116 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="slv" + THIS%PARAMID=212140 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="swd" + THIS%PARAMID=212117 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="tnr" + THIS%PARAMID=212118 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="tro" + THIS%PARAMID=212119 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210081 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="awb" + THIS%PARAMID=216133 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="com" + THIS%PARAMID=212246 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212121 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212122 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="ene" + THIS%PARAMID=212123 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="fef" + THIS%PARAMID=212124 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="ind" + THIS%PARAMID=212125 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="ref" + THIS%PARAMID=212120 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="res" + THIS%PARAMID=212126 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="shp" + THIS%PARAMID=212127 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="swd" + THIS%PARAMID=212128 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="tnr" + THIS%PARAMID=212129 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="tro" + THIS%PARAMID=212130 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="DMS" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210117 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="DMS" + THIS%SECTOR="emi_oceans" + THIS%PARAMID=212131 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="DMS" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212132 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="GLY" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=212244 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219219 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="ene" + THIS%SCALING=0.001 + THIS%PARAMID=212123 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="ind" + THIS%SCALING=0.001 + THIS%PARAMID=212125 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="ref" + THIS%SCALING=0.001 + THIS%PARAMID=212120 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="res" + THIS%SCALING=0.001 + THIS%PARAMID=212126 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="com" + THIS%PARAMID=212247 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212141 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="ene" + THIS%PARAMID=212142 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="fef" + THIS%PARAMID=212143 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="ind" + THIS%PARAMID=212144 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="res" + THIS%PARAMID=212145 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="shp" + THIS%PARAMID=212146 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="slv" + THIS%PARAMID=212240 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="swd" + THIS%PARAMID=212147 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="tnr" + THIS%PARAMID=212148 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="tro" + THIS%PARAMID=212149 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ISPD" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212150 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="com" + THIS%PARAMID=212248 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212151 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="ene" + THIS%PARAMID=212152 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="fef" + THIS%PARAMID=212153 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="ind" + THIS%PARAMID=212154 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="res" + THIS%PARAMID=212155 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="shp" + THIS%PARAMID=212156 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="slv" + THIS%PARAMID=212241 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="swd" + THIS%PARAMID=212157 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="tnr" + THIS%PARAMID=212158 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="tro" + THIS%PARAMID=212159 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210116 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="agl" + THIS%PARAMID=212163 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ags" + THIS%PARAMID=212164 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGS" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="awb" + THIS%PARAMID=216134 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="com" + THIS%PARAMID=212249 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212161 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212162 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ene" + THIS%PARAMID=212165 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ind" + THIS%PARAMID=212166 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ref" + THIS%PARAMID=212138 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="res" + THIS%PARAMID=212167 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="slv" + THIS%PARAMID=212169 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="swd" + THIS%PARAMID=212170 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="tnr" + THIS%PARAMID=212171 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="tro" + THIS%PARAMID=212172 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210085 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="TotalSoilEmis" + THIS%PARAMID=212173 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="agl" + THIS%PARAMID=212174 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="awb" + THIS%PARAMID=216135 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="com" + THIS%PARAMID=212250 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="ene" + THIS%PARAMID=212176 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="fef" + THIS%PARAMID=212177 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="ind" + THIS%PARAMID=212178 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="ref" + THIS%PARAMID=212184 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="res" + THIS%PARAMID=212179 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="shp" + THIS%PARAMID=212180 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="swd" + THIS%PARAMID=212181 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="tnr" + THIS%PARAMID=212182 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="tro" + THIS%PARAMID=212183 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO2" + THIS%SECTOR="Aviation" + THIS%VERTICAL_PROFILE_TYPE="3D" + THIS%PARAMID=212255 + THIS%SCALING=1.53333333333333 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219208 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="awb" + THIS%PARAMID=216136 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="com" + THIS%PARAMID=212251 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212191 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="ene" + THIS%PARAMID=212192 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="fef" + THIS%PARAMID=212193 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="ind" + THIS%PARAMID=212194 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="ref" + THIS%PARAMID=212200 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="res" + THIS%PARAMID=212195 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="shp" + THIS%PARAMID=212196 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="slv" + THIS%PARAMID=212242 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="swd" + THIS%PARAMID=212197 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="tnr" + THIS%PARAMID=212188 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="tro" + THIS%PARAMID=212199 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219207 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="awb" + THIS%PARAMID=216137 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="com" + THIS%PARAMID=212252 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212201 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="ene" + THIS%PARAMID=212202 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="fef" + THIS%PARAMID=212203 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="ind" + THIS%PARAMID=212204 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="ref" + THIS%PARAMID=212139 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="res" + THIS%PARAMID=212205 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="shp" + THIS%PARAMID=212206 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="slv" + THIS%PARAMID=212243 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="swd" + THIS%PARAMID=212207 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="tnr" + THIS%PARAMID=212208 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="tro" + THIS%PARAMID=212209 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PSD_RADIUS=0.03e-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 + THIS%PARAMID=210090 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="awb" + THIS%PARAMID=216143 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="com" + THIS%PARAMID=216120 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="ene" + THIS%PARAMID=212231 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="fef" + THIS%PARAMID=212232 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="ind" + THIS%PARAMID=212233 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="ref" + THIS%PARAMID=212239 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="res" + THIS%PARAMID=212234 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="shp" + THIS%PARAMID=212235 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="swd" + THIS%PARAMID=212236 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="tnr" + THIS%PARAMID=212237 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="tro" + THIS%PARAMID=212238 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210102 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="awb" + THIS%PARAMID=216138 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="com" + THIS%PARAMID=216114 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212211 + THIS%VERTICAL_PROFILE_TYPE="AltitudeMap" + THIS%VERTICAL_PARAMID=216045 + THIS%VERTICAL_BASE_LEVEL=-1 + THIS%VERTICAL_TOP_LEVEL=-4 + THIS%VERTICAL_THRESHOLD=200 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="ene" + THIS%PARAMID=212212 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="fef" + THIS%PARAMID=212213 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="ind" + THIS%PARAMID=212214 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="ref" + THIS%PARAMID=212220 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="res" + THIS%PARAMID=212215 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="shp" + THIS%PARAMID=212216 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="tnr" + THIS%PARAMID=212218 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="tro" + THIS%PARAMID=212219 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="agl" + THIS%PARAMID=216221 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="ags" + THIS%PARAMID=216117 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGS" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="awb" + THIS%PARAMID=216141 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="com" + THIS%PARAMID=216118 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="ene" + THIS%PARAMID=216222 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="fef" + THIS%PARAMID=216223 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="ind" + THIS%PARAMID=216224 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="ref" + THIS%PARAMID=216225 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="res" + THIS%PARAMID=216226 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="shp" + THIS%PARAMID=216227 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="slv" + THIS%PARAMID=216228 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="swd" + THIS%PARAMID=216229 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="tnr" + THIS%PARAMID=216230 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="tro" + THIS%PARAMID=216231 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219212 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="awb" + THIS%PARAMID=216139 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="com" + THIS%PARAMID=216115 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=216200 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="ene" + THIS%PARAMID=216201 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="fef" + THIS%PARAMID=216202 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="ind" + THIS%PARAMID=216203 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="ref" + THIS%PARAMID=216204 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="res" + THIS%PARAMID=216205 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="shp" + THIS%PARAMID=216206 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="slv" + THIS%PARAMID=216207 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="swd" + THIS%PARAMID=216208 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="tnr" + THIS%PARAMID=216209 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="tro" + THIS%PARAMID=216210 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219213 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="awb" + THIS%PARAMID=216140 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="com" + THIS%PARAMID=216116 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="ene" + THIS%PARAMID=216211 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="fef" + THIS%PARAMID=216212 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="ind" + THIS%PARAMID=216213 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="ref" + THIS%PARAMID=216214 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="res" + THIS%PARAMID=216215 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="shp" + THIS%PARAMID=216216 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="slv" + THIS%PARAMID=216217 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="swd" + THIS%PARAMID=216218 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="tnr" + THIS%PARAMID=216219 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="tro" + THIS%PARAMID=216220 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS +/ +&NAMCOMPO_EMIS_AUX + THIS%PARAMID=210060 +/ +&NAMCOMPO_EMIS_AUX + THIS%PARAMID=216045 +/ +&NAMCOMPO_EMIS_AUX +/ EOF diff --git a/ifs-test/tests/t255/ifsdata/rtablel_2095 b/ifs-test/tests/t255/ifsdata/rtablel_2095 new file mode 120000 index 00000000..a3115a9c --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/rtablel_2095 @@ -0,0 +1 @@ +../../t21/ifsdata/rtablel_2095 \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/rtables b/ifs-test/tests/t255/ifsdata/rtables deleted file mode 120000 index 70dc7181..00000000 --- a/ifs-test/tests/t255/ifsdata/rtables +++ /dev/null @@ -1 +0,0 @@ -/perm/nld5163/openifs/oifs_data/48r1/rtables \ No newline at end of file diff --git a/ifs-test/tests/t255/inidata/PLS_ICMCLham7INIT_COMPO b/ifs-test/tests/t255/inidata/PLS_ICMCLham7INIT_COMPO index 4af0964c..f8b579b1 120000 --- a/ifs-test/tests/t255/inidata/PLS_ICMCLham7INIT_COMPO +++ b/ifs-test/tests/t255/inidata/PLS_ICMCLham7INIT_COMPO @@ -1 +1 @@ -/hpcperm/nm6/oifs48r1-data/datahub/ham7/2023070100/emissions/ICMCL-INIT-COMPO-2023070100-2023070300 \ No newline at end of file +/hpcperm/nm6/oifs48r1-data/datahub/ham7/2023070100/emissions/ICMCL-INIT-COMPO-2023070100-2023080100 \ No newline at end of file diff --git a/ifs-test/tests/t255/inidata/PLS_ICMGGham7INIT b/ifs-test/tests/t255/inidata/PLS_ICMGGham7INIT index 213710c8..2605cea6 120000 --- a/ifs-test/tests/t255/inidata/PLS_ICMGGham7INIT +++ b/ifs-test/tests/t255/inidata/PLS_ICMGGham7INIT @@ -1 +1 @@ -/hpcperm/nm6/oifs48r1-data/datahub/ham7/2023070100/ICMGGham7INIT \ No newline at end of file +/hpcperm/nm6/oifs48r1-data/datahub/ham7/2023070100/emissions/ICMGGham7INIT_2023070100_with_correct_emissions \ No newline at end of file diff --git a/ifs-test/tests/t255/test_compo_fc_m7/setup b/ifs-test/tests/t255/test_compo_fc_m7/setup index 8f20831e..7a12efa1 100644 --- a/ifs-test/tests/t255/test_compo_fc_m7/setup +++ b/ifs-test/tests/t255/test_compo_fc_m7/setup @@ -33,176 +33,176 @@ NFRPOS=3 # Include common namelists . ../common/namelists -# Note: In this setup we include some details by blocks to have a -# more structured and easier to read setup file. For the final -# namelist please check the generated fort.4 after running the experiment. - -cat >> fort.4 << EOF -&NAMGFL -!NGHG=2, -!YLRCH4_NL%CNAME='kCH4', -!YLRCH4_NL%IGRBCODE=210071, -!YLRCH4_NL%LGP=.TRUE.,YLRCH4_NL%LTRAJIO=.FALSE., -!YGHG_NL(1)%CNAME='CO2_GHG', -!YGHG_NL(1)%IGRBCODE=210061, -!YGHG_NL(1)%LADV5=true, -!YGHG_NL(1)%LASSIM=true, -!YGHG_NL(1)%LMASSFIX=true, -!YGHG_NL(1)%LNEGFIX=.FALSE., -!YGHG_NL(1)%LQM=false, -!YGHG_NL(1)%LQM3D=true, -!YGHG_NL(1)%BETAMFBC=2, -!YGHG_NL(2)%CNAME='CH4_GHG', -!YGHG_NL(2)%IGRBCODE=210062, -!YGHG_NL(2)%LADV5=true, -!YGHG_NL(2)%LASSIM=true, -!YGHG_NL(2)%LMASSFIX=true, -!YGHG_NL(2)%LNEGFIX=.FALSE., -!YGHG_NL(2)%LQM=false, -!YGHG_NL(2)%LQM3D=true, -!YGHG_NL(2)%BETAMFBC=2, -EOF - -# Include NAMGLF for aerosols (m7) -. ../common/namelist_m7_aero - -cat >> fort.4 << EOF -LAERAOT=false, -LAERLISI=false, -EOF - -# === Include NAMGLF for NAERO_WVL_DIAG -# Please comment/uncomment the appropiate line -# -#. ../common/namelist_aer_aerowvldiag # aerwvl used in test_compo_fc -. ../common/namelist_m7_aerowvldiag # aerwvl used in openifs/ac/m7 - - -# === Include chem NAMGLF and YEXT_NL (but only to describe species/outputs) -# Please comment/uncomment the appropiate line -# -#. ../common/namelist_aer_chem # original test_compo_fc settings -. ../common/namelist_m7_chem # chem used in openifs/ac - - - -cat >> fort.4 << EOF - LAERCHEM=true - YQ_NL%LGP=true, - YQ_NL%LSP=false, - YL_NL%LGP=true, - YI_NL%LGP=true, - YA_NL%LGP=true, - YO3_NL%LGP=true, - YQ_NL%LGPINGP=true, -/ -&NAERAD - CRTABLEDIR='./ifsdata/rtables/', - LECOMPGRID=false, - RMUZUV=0.01, - NUVTIM=72, - NRADUV=1, - NUV=24, - LUVPROC=false, - LUVAERP=true, - KMODTS=2, - NRPROMA=0, - LO3_CHEM_UV=true, - NAERMACC=0, - NAEROOPT=2, - NCLOUDACT=0, -/ -&NAMFPC - CFPFMT="MODEL", - NFP3DFS=2, - NFP3DFP=2, - MFP3DFS(:)=210203,212255 - MFP3DFP(:)=210011,217003 - NFP2DF=1, - MFP2DF(:)=152, - NFPPHY=8, - MFPPHY(:)=210072,210073,210074,210208,210052,214002,210207,215089, - NRFP3S(:)=-99, - RFP3P=100000.,85000.,70000.,50000., -/ -&NAEAER -EOF - -# === Include NAEAER description (YAERO_DESC) => possible not for m7 -# Please comment/uncomment the appropiate line -. ../common/namelist_aer_yaerodesc # original test_compo_fc description - -cat >> fort.4 << EOF - LAERVOL=false, - NDRYDEPVEL_DYN=2, - LAERDUSTSOURCE=true, - LAERDUSTSIZEVAR=true, - LAERDUST_NEWBIN=false, - RAERDUST_REBOUND=0.1, - LAERNGAT=true, - NAERSCAV=3, - LAERGTOP=true, - LAERHYGRO=true, - LAERSEDIM=true, - LAERSEDIMSS=true, - LAERDRYDP=false, - LAERSURF=true, - NSSALT=1, - NDDUST=3, - NSO4SCHEME=1, - LSEASALT_RH80=true, - LAERRRTM=true, -/ -&NAMCOMPO - LCHEM_DIA=false, - LCHEM_DDFLX=true, - LCOMPO_DDFLX_DIR=true, - LCHEM_TROPO=true, - LCOMPO_DCDD=true, - LAERNITRATE=false, - LAEREQSAM4CLIM=false, - LAERSOA=false, - LAERSOA_COUPLED=false, - KGHG_CHEMTEND_CH4=0, - LAERNUCL=true, - AERO_SCHEME="hamm7", -/ -&NAMCHEM - CHEM_SCHEME="tm5", - LCHEM_DIAC=false, - LCHEM_LIGHT=true, - KCHEM_WETDEP=2, - KCHEM_DRYDEP=3, - LCHEM_0NOX=false, - KCHEM_NOXADV=0, - LCHEM_ANAO3=false, - KCHEM_SOLVE=2, - LCHEM_REVCHEM=false, - LCHEM_BASCOE_JON=false, - LCHEM_BASCOE_HETCHEM=true, - LCHEM_EXTENDJNO2=true, - LCHEM_JOUT=false, - LCHEM_AEROI=false, - LCHEM_O3RAD=true, - LCHEM_CSHAPE=.false., - LCHEM_WDFR=.true., -/ - -&NAMMCC - LMCCEC=true, - LMCCIEC=false, - LMCC_COMPO=true, -/ -EOF - -# === Include compo emissions namelist (moved to end of file) -# Please comment/ uncomment the appropiate line -# -#. ../common/namelist_aer_compoemis # original test_compo_fc emissions - -. ../common/namelist_m7_compoemis # emissions used in openifs/ac - -cat >> fort.4 << EOF -&NAMM7CTL -/ -EOF +cp ../common/fort.4-oac-adapted fort.4 + +#NOTYET # Note: In this setup we include some details by blocks to have a +#NOTYET # more structured and easier to read setup file. For the final +#NOTYET # namelist please check the generated fort.4 after running the experiment. +#NOTYET +#NOTYET cat >> fort.4 << EOF +#NOTYET &NAMGFL +#NOTYET !NGHG=2, +#NOTYET !YLRCH4_NL%CNAME='kCH4', +#NOTYET !YLRCH4_NL%IGRBCODE=210071, +#NOTYET !YLRCH4_NL%LGP=.TRUE.,YLRCH4_NL%LTRAJIO=.FALSE., +#NOTYET !YGHG_NL(1)%CNAME='CO2_GHG', +#NOTYET !YGHG_NL(1)%IGRBCODE=210061, +#NOTYET !YGHG_NL(1)%LADV5=true, +#NOTYET !YGHG_NL(1)%LASSIM=true, +#NOTYET !YGHG_NL(1)%LMASSFIX=true, +#NOTYET !YGHG_NL(1)%LNEGFIX=.FALSE., +#NOTYET !YGHG_NL(1)%LQM=false, +#NOTYET !YGHG_NL(1)%LQM3D=true, +#NOTYET !YGHG_NL(1)%BETAMFBC=2, +#NOTYET !YGHG_NL(2)%CNAME='CH4_GHG', +#NOTYET !YGHG_NL(2)%IGRBCODE=210062, +#NOTYET !YGHG_NL(2)%LADV5=true, +#NOTYET !YGHG_NL(2)%LASSIM=true, +#NOTYET !YGHG_NL(2)%LMASSFIX=true, +#NOTYET !YGHG_NL(2)%LNEGFIX=.FALSE., +#NOTYET !YGHG_NL(2)%LQM=false, +#NOTYET !YGHG_NL(2)%LQM3D=true, +#NOTYET !YGHG_NL(2)%BETAMFBC=2, +#NOTYET EOF +#NOTYET +#NOTYET # Include NAMGLF for aerosols (m7) +#NOTYET . ../common/namelist_m7_aero +#NOTYET +#NOTYET cat >> fort.4 << EOF +#NOTYET LAERAOT=false, +#NOTYET LAERLISI=false, +#NOTYET EOF +#NOTYET +#NOTYET # === Include NAMGLF for NAERO_WVL_DIAG +#NOTYET # Please comment/uncomment the appropiate line +#NOTYET # +#NOTYET #. ../common/namelist_aer_aerowvldiag # aerwvl used in test_compo_fc +#NOTYET . ../common/namelist_m7_aerowvldiag # aerwvl used in openifs/ac/m7 +#NOTYET +#NOTYET +#NOTYET # === Include chem NAMGLF and YEXT_NL (but only to describe species/outputs) +#NOTYET # Please comment/uncomment the appropiate line +#NOTYET # +#NOTYET #. ../common/namelist_aer_chem # original test_compo_fc settings +#NOTYET . ../common/namelist_m7_chem # chem used in openifs/ac +#NOTYET +#NOTYET cat >> fort.4 << EOF +#NOTYET LAERCHEM=true +#NOTYET YQ_NL%LGP=true, +#NOTYET YQ_NL%LSP=false, +#NOTYET YL_NL%LGP=true, +#NOTYET YI_NL%LGP=true, +#NOTYET YA_NL%LGP=true, +#NOTYET YO3_NL%LGP=true, +#NOTYET YQ_NL%LGPINGP=true, +#NOTYET / +#NOTYET &NAERAD +#NOTYET CRTABLEDIR='./ifsdata/rtables/', +#NOTYET LECOMPGRID=false, +#NOTYET RMUZUV=0.01, +#NOTYET NUVTIM=72, +#NOTYET NRADUV=1, +#NOTYET NUV=24, +#NOTYET LUVPROC=false, +#NOTYET LUVAERP=true, +#NOTYET KMODTS=2, +#NOTYET NRPROMA=0, +#NOTYET LO3_CHEM_UV=true, +#NOTYET NAERMACC=0, +#NOTYET NAEROOPT=2, +#NOTYET NCLOUDACT=0, +#NOTYET / +#NOTYET &NAMFPC +#NOTYET CFPFMT="MODEL", +#NOTYET NFP3DFS=2, +#NOTYET NFP3DFP=2, +#NOTYET MFP3DFS(:)=210203,212255 +#NOTYET MFP3DFP(:)=210011,217003 +#NOTYET NFP2DF=1, +#NOTYET MFP2DF(:)=152, +#NOTYET NFPPHY=8, +#NOTYET MFPPHY(:)=210072,210073,210074,210208,210052,214002,210207,215089, +#NOTYET NRFP3S(:)=-99, +#NOTYET RFP3P=100000.,85000.,70000.,50000., +#NOTYET / +#NOTYET &NAEAER +#NOTYET EOF +#NOTYET +#NOTYET # === Include NAEAER description (YAERO_DESC) => possible not for m7 +#NOTYET # Please comment/uncomment the appropiate line +#NOTYET . ../common/namelist_aer_yaerodesc # original test_compo_fc description +#NOTYET +#NOTYET cat >> fort.4 << EOF +#NOTYET LAERVOL=false, +#NOTYET NDRYDEPVEL_DYN=2, +#NOTYET LAERDUSTSOURCE=true, +#NOTYET LAERDUSTSIZEVAR=true, +#NOTYET LAERDUST_NEWBIN=false, +#NOTYET RAERDUST_REBOUND=0.1, +#NOTYET LAERNGAT=true, +#NOTYET NAERSCAV=3, +#NOTYET LAERGTOP=true, +#NOTYET LAERHYGRO=true, +#NOTYET LAERSEDIM=true, +#NOTYET LAERSEDIMSS=true, +#NOTYET LAERDRYDP=false, +#NOTYET LAERSURF=true, +#NOTYET NSSALT=1, +#NOTYET NDDUST=3, +#NOTYET NSO4SCHEME=1, +#NOTYET LSEASALT_RH80=true, +#NOTYET LAERRRTM=true, +#NOTYET / +#NOTYET &NAMCOMPO +#NOTYET LCHEM_DIA=false, +#NOTYET LCHEM_DDFLX=true, +#NOTYET LCOMPO_DDFLX_DIR=true, +#NOTYET LCHEM_TROPO=true, +#NOTYET LCOMPO_DCDD=true, +#NOTYET LAERNITRATE=false, +#NOTYET LAEREQSAM4CLIM=false, +#NOTYET LAERSOA=false, +#NOTYET LAERSOA_COUPLED=false, +#NOTYET KGHG_CHEMTEND_CH4=0, +#NOTYET LAERNUCL=true, +#NOTYET AERO_SCHEME="hamm7", +#NOTYET / +#NOTYET &NAMCHEM +#NOTYET CHEM_SCHEME="tm5", +#NOTYET LCHEM_DIAC=false, +#NOTYET LCHEM_LIGHT=true, +#NOTYET KCHEM_WETDEP=2, +#NOTYET KCHEM_DRYDEP=3, +#NOTYET LCHEM_0NOX=false, +#NOTYET KCHEM_NOXADV=0, +#NOTYET LCHEM_ANAO3=false, +#NOTYET KCHEM_SOLVE=2, +#NOTYET LCHEM_REVCHEM=false, +#NOTYET LCHEM_BASCOE_JON=false, +#NOTYET LCHEM_BASCOE_HETCHEM=true, +#NOTYET LCHEM_EXTENDJNO2=true, +#NOTYET LCHEM_JOUT=false, +#NOTYET LCHEM_AEROI=false, +#NOTYET LCHEM_O3RAD=true, +#NOTYET LCHEM_CSHAPE=.false., +#NOTYET LCHEM_WDFR=.true., +#NOTYET / +#NOTYET +#NOTYET &NAMMCC +#NOTYET LMCCEC=true, +#NOTYET LMCCIEC=false, +#NOTYET LMCC_COMPO=true, +#NOTYET / +#NOTYET EOF +#NOTYET +#NOTYET # === Include compo emissions namelist (moved to end of file) +#NOTYET # Please comment/ uncomment the appropiate line +#NOTYET # +#NOTYET #. ../common/namelist_aer_compoemis # original test_compo_fc emissions +#NOTYET +#NOTYET . ../common/namelist_m7_compoemis # emissions used in openifs/ac +#NOTYET +#NOTYET cat >> fort.4 << EOF +#NOTYET &NAMM7CTL +#NOTYET / +#NOTYET EOF From 353b837959f0d9a54b29d4724476dd38f614d7b9 Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Mon, 27 Jan 2025 09:07:40 +0100 Subject: [PATCH 041/129] Allow users to set LMCCIEC_COMPO in the namelist --- ifs-source/arpifs/namelist/nammcc.nam.h | 2 +- ifs-source/arpifs/setup/sumcc.F90 | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/ifs-source/arpifs/namelist/nammcc.nam.h b/ifs-source/arpifs/namelist/nammcc.nam.h index 82a063f7..a3de1ce7 100644 --- a/ifs-source/arpifs/namelist/nammcc.nam.h +++ b/ifs-source/arpifs/namelist/nammcc.nam.h @@ -14,7 +14,7 @@ NAMELIST/NAMMCC/& &LCURR,LGELATO,LMCC01_MSE,LMCC01,LMCC02,LMCC03,LMCC04,LMCC05,LMCCEC,LMCCIEC, & &LMCCICEIC,N923,NOACOMM,NFRCPL,LNEMOCOUP,LNEMOFLUXNC,LNEMO1WAY, & &LMCCDYNSEAICE,LNEMOLIMGET,LNEMOLIMPUT,LNEMOLIMALB,LNEMOLIMTEMP, & - &LNEMOLIMTHK,LMULTIYR,LMCC_COMPO,LNEMOATMFLDS,LNEMOIFSLOG,NSSTICEOP,& + &LNEMOLIMTHK,LMULTIYR,LMCC_COMPO,LMCCIEC_COMPO,LNEMOATMFLDS,LNEMOIFSLOG,NSSTICEOP,& &LNEMOSSTFREEZ,LNEMOLIMTLVL,LNEMOOCEICEMIX,LNEMOQNSICEFILT,LNEMOSICOUP,& &LNEMOGRIBFLDS,LNEMOPARTCOUP,LNEMOPARTMASK,RNPARTRAMPSTART,RNPARTRAMPLEN,& &RNPARTLAT,RNPARTLATSPREAD,LNEMOPARTMASKFILE,CDNPARTMASKFILE,LNEMOGRIB3D,& diff --git a/ifs-source/arpifs/setup/sumcc.F90 b/ifs-source/arpifs/setup/sumcc.F90 index fd3974f6..ce15862d 100644 --- a/ifs-source/arpifs/setup/sumcc.F90 +++ b/ifs-source/arpifs/setup/sumcc.F90 @@ -81,7 +81,7 @@ SUBROUTINE SUMCC(YDMCC,YDEPHY,KULOUT) LOGICAL, POINTER :: LCURR, LGELATO, LMCC01_MSE, LMCC01, LMCC02, LMCC03, LMCC04, & & LMCC05, LMCCEC, LMCCIEC, LMCCICEIC, LNEMOCOUP, LNEMOFLUXNC, LNEMO1WAY, & & LMCCDYNSEAICE, LNEMOLIMGET, LNEMOLIMPUT, LNEMOLIMALB, LNEMOLIMTEMP, & - & LNEMOLIMTHK, LMULTIYR, LMCC_COMPO, LNEMOATMFLDS, LNEMOIFSLOG, LNEMOSSTFREEZ,& + & LNEMOLIMTHK, LMULTIYR, LMCC_COMPO, LMCCIEC_COMPO, LNEMOATMFLDS, LNEMOIFSLOG, LNEMOSSTFREEZ,& & LNEMOLIMTLVL, LESICE, LNEMOOCEICEMIX,LNEMOQNSICEFILT, LNEMOSICOUP, LNEMOGRIBFLDS,& & LNEMOPARTCOUP,LNEMOPARTMASK,LNEMOPARTMASKFILE,LNEMOGRIB3D,LNEMOGRIBMASK, L2DECV2NEMO,& & LNEMOOUTGRB,LCOUPINFOUT @@ -95,7 +95,6 @@ SUBROUTINE SUMCC(YDMCC,YDEPHY,KULOUT) ! ---------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('SUMCC',0,ZHOOK_HANDLE) -ASSOCIATE(LMCCIEC_COMPO=>YDMCC%LMCCIEC_COMPO) ! Associate pointers for variables in namelist LCURR => YDMCC%LCURR LGELATO => YDMCC%LGELATO @@ -128,6 +127,7 @@ SUBROUTINE SUMCC(YDMCC,YDEPHY,KULOUT) LNEMOQNSICEFILT=>YDMCC%LNEMOQNSICEFILT LMULTIYR => YDMCC%LMULTIYR LMCC_COMPO => YDMCC%LMCC_COMPO +LMCCIEC_COMPO => YDMCC%LMCCIEC_COMPO LNEMOATMFLDS => YDMCC%LNEMOATMFLDS LNEMOIFSLOG => YDMCC%LNEMOIFSLOG NSSTICEOP => YDMCC%NSSTICEOP @@ -299,6 +299,5 @@ SUBROUTINE SUMCC(YDMCC,YDEPHY,KULOUT) ENDIF ! ---------------------------------------------------------------- -END ASSOCIATE IF (LHOOK) CALL DR_HOOK('SUMCC',1,ZHOOK_HANDLE) END SUBROUTINE SUMCC From 8388998538cdf78ada054a1852b9c0e225a9963a Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Mon, 3 Feb 2025 13:29:58 +0100 Subject: [PATCH 042/129] Add Gong+SST scheme from HAM --- ifs-source/arpifs/m7/module/mo_ham.F90 | 8 +- ifs-source/arpifs/m7/module/mo_ham_init.F90 | 9 +- .../m7/module/mo_ham_m7_emi_seasalt.f90 | 414 ++++++++++++++++++ .../arpifs/m7/phys_ec/hamm7_interface.F90 | 1 + ifs-source/arpifs/m7/phys_ec/tm5m7_src_ss.F90 | 23 +- 5 files changed, 446 insertions(+), 9 deletions(-) create mode 100644 ifs-source/arpifs/m7/module/mo_ham_m7_emi_seasalt.f90 diff --git a/ifs-source/arpifs/m7/module/mo_ham.F90 b/ifs-source/arpifs/m7/module/mo_ham.F90 index af2484e8..c2856ecd 100644 --- a/ifs-source/arpifs/m7/module/mo_ham.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham.F90 @@ -157,8 +157,14 @@ MODULE mo_ham !--- 1.1) Physical: !--- Define control variables and pre-set with default values: - +#ifdef HAMMOZ INTEGER :: nseasalt = 2 ! Sea Salt emission scheme: +#else + ! SST scheme. OIFS supports only the "Gong + SST" scheme from either TM5 + ! implementation (nseasalt=0) or HAMM7 one (nseasalt=8), hardcoded + ! here. + INTEGER :: nseasalt = 8 ! Sea Salt emission scheme: +#endif ! ! nseasalt = 1 Monahan (1986) ! = 2 Schulz et al. (2002) diff --git a/ifs-source/arpifs/m7/module/mo_ham_init.F90 b/ifs-source/arpifs/m7/module/mo_ham_init.F90 index 3a6e5f3a..3fe50c2c 100644 --- a/ifs-source/arpifs/m7/module/mo_ham_init.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_init.F90 @@ -1069,9 +1069,9 @@ SUBROUTINE ham_initialize #endif USE mo_activ, ONLY: nfrzmod !>>dod (redmine #44) import of seasalt emission schemes from HAM2 -#ifdef HAMMOZ +!#ifdef HAMMOZ USE mo_ham_m7_emi_seasalt, ONLY: start_emi_seasalt -#endif +!#endif !<>SF #390 (for security) @@ -1101,11 +1101,12 @@ SUBROUTINE ham_initialize !#endif IF (nwater == 1 .AND. nham_subm == HAM_M7) CALL start_kappa !>>dod (redmine #44) import of seasalt emission schemes from HAM2 -#ifdef HAMMOZ +!#ifdef HAMMOZ + ! This is needed only if nseasalt=8 in OIFS CALL start_emi_seasalt !< +!! \filename +!! mo_ham_m7_emi_seasalt.f90 +!! +!! \brief +!! This module contains several sea salt emission schemes. +!! +!! \author Kai Zhang (MPI-Met) (see also the individual subroutines) +!! +!! \responsible_coder +!! Kai Zhang, kai.zhang@pnnl.gov +!! +!! \revision_history +!! -# Kai Zhang (MPI-Met) - original code (2009) +!! +!! \limitations +!! [ Start an optional warning here ] +!! +!! \details +!! Use nseasalt in namelist hamctl to select the scheme you want: +!! - seasalt_emissions_monahan: nseasalt=1 +!! - seasalt_emissions_lsce: nseasalt=2 +!! - seasalt_emissions_mh: nseasalt=4 +!! - seasalt_emissions_guelle: nseasalt=5 +!! - seasalt_emissions_gong: nseasalt=6 +!! - seasalt_emissions_long nseasalt=7 +!! - seasalt_emissions_gong_SST nseasalt=8 +!! +!! \bibliographic_references +!! - see individual seasalt scheme routines +!! +!! \belongs_to +!! HAMMOZ +!! +!! \copyright +!! Copyright and licencing conditions are defined in the ECHAM-HAMMOZ +!! licencing agreement to be found at: +!! https://redmine.hammoz.ethz.ch/projects/hammoz/wiki/1_Licencing_conditions +!! The ECHAM-HAMMOZ software is provided "as is" and without warranty of any kind. +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! Anton Laakso: Currently +!---- + +MODULE mo_ham_m7_emi_seasalt + + !---inherited types, data and functions + USE mo_kind, ONLY: dp + + IMPLICIT NONE + + !---public member functions + PUBLIC :: start_emi_seasalt + !PUBLIC :: seasalt_emissions_monahan ! nseasalt=1 + !PUBLIC :: seasalt_emissions_lsce ! nseasalt=2 + !!PUBLIC :: seasalt_emissions_martensson !nseasalt=3 + !PUBLIC :: seasalt_emissions_mh !nseasalt=4 + !PUBLIC :: seasalt_emissions_guelle !nseasalt=5 + !PUBLIC :: seasalt_emissions_gong !nseasalt=6 + !PUBLIC :: seasalt_emissions_long !nseasalt=7 + PUBLIC :: seasalt_emissions_gong_SST !nseasalt=8 + + !---module data + REAL(dp), PARAMETER, PRIVATE :: ppww = 3.41_dp ! exponent of wind speed |u| (|u|**ppww) + + INTEGER, PARAMETER, PRIVATE :: nbin = 300 ! number of bins for the bin schemes + ! (Monahan (nseasalt=4), Guelle or Gong, Long) + REAL(dp), PARAMETER, PRIVATE :: dmta = 0.100E-06_dp ! lower diameter [m], bin schemes + REAL(dp), PARAMETER, PRIVATE :: dmtd = 1.000E-05_dp ! upper diameter [m], bin schemes + + REAL(dp), PARAMETER, PRIVATE :: dmtb_gong = 0.221E-06_dp ! diameter limit, [m], corresponding to + ! 0.2um wet radius at 80% RH (G03), 0.2*2/1.814 + REAL(dp), PARAMETER, PRIVATE :: dmtb_guelle = 8.000E-06_dp ! dry diameter limit, [m], corresonding + ! to 4um radius in G01 + + REAL(dp), PARAMETER, PRIVATE :: dbeg(3) = (/0.050E-6_dp, 0.100E-6_dp, 1.000E-6_dp/) ! ait, acc, coa + REAL(dp), PARAMETER, PRIVATE :: dend(3) = (/0.100E-6_dp, 1.000E-6_dp, 1.000E-5_dp/) ! ait, acc, coa + + REAL(dp), PRIVATE :: dmt(nbin) + + REAL(dp), PRIVATE :: rm(nbin) + REAL(dp), PRIVATE :: rd(nbin) + REAL(dp), PRIVATE :: bmn(nbin) + + REAL(dp), PRIVATE :: ss1_mon ! sea salt flux factor 1, Monahan (nseasalt=1) scheme + REAL(dp), PRIVATE :: ss2_mon ! sea salt flux factor 2, Monahan (nseasalt=1) scheme + + + CONTAINS + + SUBROUTINE start_emi_seasalt + + USE mo_kind, ONLY: dp + USE mo_math_constants, ONLY: pi + USE mo_ham, ONLY: nseasalt + !USE mo_exception, ONLY: message, message_text, em_param + !USE mo_util_string, ONLY: separator + + IMPLICIT NONE + + !---local variables + ! intermediate variables in calculating flux factors ss1 and ss2 for the monahan (nseasalt=1) scheme + REAL(dp) :: zr1, zr2, zb1, zb2, zx1, zx2, zdr1, zdr2 + REAL(dp) :: zfact + + ! variables for constructing bins in the bin schemes + REAL(dp) :: zdx, zdd + INTEGER :: m + + !---executable procedure + + !---initialize the monahan (nseasalt=1) scheme (copy/paste ECHAM5/HAM2 code) + zr1=0.416_dp + zr2=3.49_dp + zb1=0.58_dp-1.54_dp*LOG10(zr1) + zb2=0.58_dp-1.54_dp*LOG10(zr2) + zx1=10._dp**(1.19_dp*EXP(-zb1*zb1)) + zx2=10._dp**(1.19_dp*EXP(-zb2*zb2)) + zdr1=0.5_dp + zdr2=4.5_dp + zfact=1.373_dp*4._dp/3._dp*pi*1.15e3_dp + ss1_mon=zfact*(1._dp+0.057_dp*zr1**1.05_dp)*zx1*zdr1*1.e-18_dp + ss2_mon=zfact*(1._dp+0.057_dp*zr2**1.05_dp)*zx2*zdr2*1.e-18_dp + + !IF (nseasalt==1) THEN + ! CALL message('', separator) + ! CALL message('', 'Monahan seasalt emissions:', level=em_param) + ! WRITE(message_text, '(a,e25.15,a,e25.15)') 'Factors for sea salt fluxes: 1st = ',ss1_mon, '2nd = ', ss2_mon + ! CALL message('', message_text, level=em_param) + ! CALL message('', separator) + !END IF + + !---construction of bins + ! dDp, take LOG scale + + zdx = (LOG(dmtd) - LOG(dmta) ) / REAL(nbin,dp) + + zdd = 0._dp + + DO m = 1, nbin + dmt(m) = EXP(LOG(dmta) + zdd) + zdd = zdd + zdx + END DO + + ! dry radius (m) + + rd(:) = dmt(:) * 0.5_dp + + ! wet radius (um) at RH=80% + + rm(:) = 1.814_dp*rd(:)*1.E+06_dp +#ifdef HAMMOZ + ! B: monahan and guelle schemes, also for larger particle in Gong scheme + bmn(:) = ( 0.380_dp - LOG10( rm(:) ) ) / 0.650_dp + + ! B: overwrite for smaller particles in the Gong scheme + IF (nseasalt == 6 .or. nseasalt == 8 ) THEN + DO m = 2,nbin + IF (dmt(m).GT.dmta .and. dmt(m).le.dmtb_gong) THEN + bmn(m) = ( 0.433_dp - LOG10( rm(m) ) ) / 0.433_dp + END IF + END DO + END IF +#else + + + ! alaak: openIFS - Gong used for all bins + IF (nseasalt == 6 .or. nseasalt == 8 ) THEN + bmn(:) = ( 0.433_dp - LOG10( rm(:) ) ) / 0.433_dp + END IF + + +#endif + END SUBROUTINE start_emi_seasalt + + + SUBROUTINE seasalt_emissions_gong_SST(kproma, kbdim, krow , sst, wind10m, ss_density, slf, alake, seaice, pmassf_as, pmassf_cs, pnumf_as, pnumf_cs) + + ! + ! Description: + ! ------------ + ! Calculates the emitted sea salt flux from the 10m wind speed following + ! Gong, 2003 + ! + ! method: M86/lab + ! size: 0.07um < r80 < 20um + ! wind speed: N.A. + ! SST: Explicit SST dependence, according to Sofiev et al 2011 + ! + ! currently Aitken mode particles are negelected. + ! + ! Authors: + ! ------------ + ! Kai Zhang, MPI-Met, 2009, modified by I. Tegen, 2016 + ! + ! References: + ! ------------ + ! 1. Monahan, E. C., D. E. Spiel, and K. L. Davidson, + ! A model of marine aerosol generation via whitecaps and wave disruption, + ! in Oceanic Whitecaps, edited by E. C. Monahan and G. MacNiochaill, + ! pp. 167–193, D. Reidel, Norwell, Mass., 1986. (M86) + ! + ! 2. S.L. Gong, + ! A parameterization of sea-salt aerosol source function for sub- and super-micron particles, + ! Global Biogeochemical Cycles 17 (2003) (4), p. 1097. (G03) + ! + ! 3. Sofiev, M., Soares,J.,Prank, M., deLeeuw, G., Kukkonen, J., A + ! regional-to-global model of emission and transport of sea salt particles + ! in the atmosphere, JGR (doi:0148‐0227/11/2010JD014713) + + ! + + USE mo_kind, ONLY: dp + USE mo_math_constants, ONLY: pi + USE mo_species, ONLY: speclist + !USE mo_ham_species, ONLY: id_ss + !USE mo_memory_g3b, ONLY: slf, alake, seaice + !USE mo_vphysc, ONLY: vphysc + + IMPLICIT NONE + + !--- Parameters: + ! - + + + !--- I/O: + + INTEGER, INTENT(in) :: kproma !kproma + INTEGER, INTENT(in) :: kbdim !column + INTEGER, INTENT(in) :: krow !chunk + REAL(dp), INTENT(in) :: sst(kbdim),wind10m(kbdim),ss_density,slf(kbdim),alake(kbdim),seaice(kbdim) + REAL(dp),INTENT(out) :: pmassf_as(kbdim) ! mass flux of ss acc particles + REAL(dp),INTENT(out) :: pmassf_cs(kbdim) ! mass flux of ss coa particles + REAL(dp),INTENT(out) :: pnumf_as(kbdim) ! number flux of ss acc particles + REAL(dp),INTENT(out) :: pnumf_cs(kbdim) ! number flux of ss coa particles + + !--- Local: + + REAL(dp):: zseafrac(kbdim) ! fraction of the gridcell covered by + ! non-iced sea water [0.-1.] + REAL(dp):: zmassf_ks(kbdim) ! mass flux of ss ait particles (currently not supported) + REAL(dp):: znumf_ks(kbdim) ! number flux of ss ait particles (currently not supported) + + + + + + + REAL(dp):: fi(kbdim,nbin) + REAL(dp):: p0,p1,p2,p3,dr + REAL(dp):: zav !particle volumn + REAL(dp):: SST_corr(1:kproma),SST_corr_1,SST_corr_2,dmtum(nbin) + REAL(dp):: SST_mask1(1:kproma),SST_mask2(1:kproma),SST_mask3(1:kproma),SST_corr_all(1:kproma) + + + + + INTEGER :: m + + ! initialize number flux for each bin (#/m2/s) + + fi = 0._dp + + ! calculate fraction of the gridcell of non ice-covered water +#ifdef HAMMOZ + zseafrac(1:kproma) = (1._dp-slf(1:kproma)-alake(1:kproma))*(1._dp-seaice(1:kproma)) +#else + !alaak: seaice fraction of gridbox in oifs: + zseafrac(1:kproma) = 1._dp-slf(1:kproma)-alake(1:kproma)-seaice(1:kproma) +#endif + zseafrac(1:kproma) = MAX(0._dp,MIN(zseafrac(1:kproma),1._dp)) + + !>>SF #458 (replacing where statements) + zseafrac(1:kproma) = MERGE( & + 0._dp, & + zseafrac(1:kproma), & + (slf(1:kproma) > 0.5_dp)) + !< micrometers + + SST_corr_1 = 0.092e0*dmtum(m)**(-0.96e0) ! valid for Tw=271.15K ; -2°C ! T base (Long) 25 deg + SST_corr_2 = 0.15e0*dmtum(m)**(-0.88e0) ! valid for Tw=278.15K ; 5°C + + ! SST_corr_1 = 0.19e0*dmtum(m)**(-0.60e0) ! valid for Tw=271.15K ; -2°CC T base (Long) 15 deg + ! SST_corr_2 = 0.31e0*dmtum(m)**(-0.56e0) ! valid for Tw=278.15K ; 5°C + + !SST_corr_1 = 0.13e0*dmtum(m)**(-0.78e0) ! valid for Tw=271.15K ; -2°CC T base (Long) 20 deg + !SST_corr_2 = 0.22e0*dmtum(m)**(-0.70e0) ! valid for Tw=278.15K ; 5°C + + + + SST_corr(1:kproma) = (SST_corr_1*(278.15e0-sst(1:kproma)) & + +SST_corr_2*(sst(1:kproma)-271.15e0))/7.e0 + + SST_mask1(1:kproma) = MERGE (SST_corr(1:kproma),0._dp,(sst(1:kproma) .LE. 278.15 )) + + SST_corr_1 = 0.15e0*dmtum(m)**(-0.88e0) ! valid for Tw=278.15K ; 5°C + SST_corr_2 = 0.48e0*dmtum(m)**(-0.36e0) ! valid for Tw=288.15K ; 15°C + + ! SST_corr_1 = 0.31e0*dmtum(m)**(-0.56e0) ! valid for Tw=278.15K ; 5°C + ! SST_corr_2 = 1.e0 ! valid for Tw=288.15K ; 15° + + !SST_corr_1 = 0.22e0*dmtum(m)**(-0.70e0) ! valid for Tw=278.15K ; 5°C + !SST_corr_2 = 0.70e0*dmtum(m)**(-0.18e0) ! valid for Tw=288.15K ; 15°C + + + SST_corr(1:kproma) = (SST_corr_1*(288.15e0-sst(1:kproma)) & + + SST_corr_2*(sst(1:kproma)-278.15e0))/1.e1 + + SST_mask2(1:kproma) = MERGE (SST_corr(1:kproma), 0._dp, & + (sst(1:kproma) .GT. 278.15 & + .AND. sst(1:kproma) .LE. 288.15)) + + + SST_corr_1 = 0.48e0*dmtum(m)**(-0.36e0) ! valid for Tw=288.15K ; 15°C + SST_corr_2 = 1.e0 ! valid for Tw=298.15K ; 25°C + + ! SST_corr_1 = 1.e0! valid for Tw=288.15K ; 15°C + ! SST_corr_2 = 2.08e0*dmtum(m)**(0.36e0) ! valid for Tw=298.15K ; 25°C + + + !SST_corr_1 = 0.70e0*dmtum(m)**(-0.18e0) ! valid for Tw=288.15K ; 15°C + !SST_corr_2 = 1.45e0*dmtum(m)**(0.18e0) ! valid for Tw=298.15K ; 25°C + + SST_corr(1:kproma) = (SST_corr_1*(298.15e0-sst(1:kproma)) & + +SST_corr_2*(sst(1:kproma)-288.15e0))/1.e1 + + SST_mask3(1:kproma) = MERGE (SST_corr(1:kproma), 0._dp, & + (sst(1:kproma) .GT. 288.15)) + + SST_corr_all(1:kproma)=SST_mask1(1:kproma)+SST_mask2(1:kproma)+SST_mask3(1:kproma) + !SST_corr_all(1:kproma) = MERGE (1._dp, SST_corr_all(1:kproma), & + !(vphysc%tsw(1:kproma) .GT. 298.15)) ! optional, limit T dependence to <25 deg C + + fi(1:kproma,m)=fi(1:kproma,m)*SST_corr_all(1:kproma) + + + zav = ss_density*4._dp/3._dp*pi*rd(m)**3 + ! mass flux (kg/m2/s) and number flux (#/m2/s) + + IF (dmt(m).GT.dbeg(1) .AND. dmt(m).LE.dend(1) ) THEN + znumf_ks(1:kproma) = znumf_ks(1:kproma) + fi(1:kproma,m)*zseafrac(1:kproma) + zmassf_ks(1:kproma) = zmassf_ks(1:kproma) + fi(1:kproma,m)*zseafrac(1:kproma)*zav + END IF + + IF (dmt(m).GT.dbeg(2) .AND. dmt(m).LE.dend(2) ) THEN + pnumf_as(1:kproma) = pnumf_as(1:kproma) + fi(1:kproma,m)*zseafrac(1:kproma) + pmassf_as(1:kproma) = pmassf_as(1:kproma) + fi(1:kproma,m)*zseafrac(1:kproma)*zav + END IF + + IF (dmt(m).GT.dbeg(3) .AND. dmt(m).LE.dend(3) ) THEN + pnumf_cs(1:kproma) = pnumf_cs(1:kproma) + fi(1:kproma,m)*zseafrac(1:kproma) + pmassf_cs(1:kproma) = pmassf_cs(1:kproma) + fi(1:kproma,m)*zseafrac(1:kproma)*zav + END IF + + END DO + + END SUBROUTINE seasalt_emissions_gong_SST + + + + END MODULE mo_ham_m7_emi_seasalt + diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index c8ff059b..4b72dd4e 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -486,6 +486,7 @@ SUBROUTINE HAMM7_INTERFACE( & !----------------------------------------------------------------------- +#include "abor1.intfb.h" #include "surf_inq.h" #include "aer_so2so4_v2.intfb.h" #include "satur.intfb.h" diff --git a/ifs-source/arpifs/m7/phys_ec/tm5m7_src_ss.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_src_ss.F90 index ddf64ee0..814dcffc 100644 --- a/ifs-source/arpifs/m7/phys_ec/tm5m7_src_ss.F90 +++ b/ifs-source/arpifs/m7/phys_ec/tm5m7_src_ss.F90 @@ -53,6 +53,9 @@ SUBROUTINE TM5M7_SRC_SS & USE TM5M7_DATA, ONLY: NMOD, MODE_ACS, MODE_COS, sigma_lognormal, SS_DENSITY USE TM5M7_EMIS_DATA, ONLY : MODAL_EMISSIONS, radius_ssa, radius_ssc +USE MO_HAM_M7_EMI_SEASALT, ONLY: seasalt_emissions_gong_SST +USE MO_HAM, ONLY: nseasalt + IMPLICIT NONE !----------------------------------------------------------------------- @@ -77,14 +80,16 @@ SUBROUTINE TM5M7_SRC_SS & REAL(KIND=JPRB) :: EMIS_FAC(KLON) REAL(KIND=JPRB) :: NUMBER(KLON), MASS(KLON) - REAL(KIND=JPHOOK) :: ZHOOK_HANDLE + +#include "abor1.intfb.h" + !----------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('TM5M7_SRC_SS',0,ZHOOK_HANDLE) !ASSOCIATE(RSSFLX=>YDEAERSRC%RSSFLX) - +IF (NSEASALT==0) THEN !>>> TvN ! The parameterization of Gong (2003) ! gives the particle number flux as a function @@ -359,10 +364,20 @@ SUBROUTINE TM5M7_SRC_SS & !For now introduce emissions in surface layer. Should be fixed. emis_mass(mode_cos)%d3(KIDIA:KFDIA,KLEV,4) = mass(KIDIA:KFDIA) !kg/m2/sec + ELSEIF (NSEASALT==8) THEN !HAM gong_SST + + CALL SEASALT_EMISSIONS_GONG_SST(KFDIA, KLON, 1,& + & PSST,PWIND, ss_density, PLSM, PCLAKE, PCI, & + & emis_mass(mode_acs)%d3(KIDIA:KFDIA,KLEV,4) , emis_mass(mode_cos)%d3(KIDIA:KFDIA,KLEV,4),& + & emis_number(mode_acs)%d3(KIDIA:KFDIA,KLEV,4), emis_number(mode_cos)%d3(KIDIA:KFDIA,KLEV,4)) + ELSE + + CALL ABOR1('ABORT: IN TM5_SRC_SS, NSEASALT is NOT 0 or 8!') - ! RCHG -> In AER scheme there is a flag named LVDFTRAC that might be related with not vertical diffusion. In that case, - ! the tendencies seems to be re-scaled in vertical layers "manually". The flux themselves are not changed. + END IF + ! RCHG -> In AER scheme there is a flag named LVDFTRAC that might be related with not vertical diffusion. In that case, + ! the tendencies seems to be re-scaled in vertical layers "manually". The flux themselves are not changed. IF (LHOOK) CALL DR_HOOK('TM5M7_SRC_SS',1,ZHOOK_HANDLE) END SUBROUTINE TM5M7_SRC_SS From 7e920653c7e9a7f69e379c55f13b0c59c407ddbc Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Mon, 3 Feb 2025 18:03:28 +0100 Subject: [PATCH 043/129] Remove unused M7 code and cleanup license --- ifs-source/arpifs/chem/chem_tm5.F90 | 2 +- ifs-source/arpifs/m7/hamm7_init.F90 | 31 +- ifs-source/arpifs/m7/module/mo_activ.F90 | 10 +- ifs-source/arpifs/m7/module/mo_advection.F90 | 26 +- ifs-source/arpifs/m7/module/mo_control.F90 | 144 +-- ifs-source/arpifs/m7/module/mo_exception.F90 | 228 +---- ifs-source/arpifs/m7/module/mo_ham.F90 | 11 +- ifs-source/arpifs/m7/module/mo_ham_init.F90 | 7 +- ifs-source/arpifs/m7/module/mo_ham_kappa.F90 | 4 +- ifs-source/arpifs/m7/module/mo_ham_m7ctl.F90 | 73 +- .../arpifs/m7/module/mo_ham_sedimentation.F90 | 14 +- ifs-source/arpifs/m7/module/mo_ham_subm.F90 | 2 +- .../m7/module/mo_hammoz_sedimentation.F90 | 6 +- ifs-source/arpifs/m7/module/mo_io_units.F90 | 14 - .../arpifs/m7/module/mo_math_constants.F90 | 189 ++-- .../arpifs/m7/module/mo_param_switches.F90 | 57 +- .../m7/module/mo_physical_constants.F90 | 298 +++--- .../m7/module/mo_radiation_parameters.F90 | 241 +---- ifs-source/arpifs/m7/module/mo_submodel.F90 | 930 +----------------- ifs-source/arpifs/m7/module/mo_tracdef.F90 | 108 +- .../arpifs/m7/module/mo_tracer_processes.F90 | 815 +-------------- .../arpifs/m7/module/mo_util_string.F90 | 18 +- .../arpifs/m7/phys_ec/hamm7_interface.F90 | 16 +- ifs-source/arpifs/phys_ec/aer_so2so4_v2.F90 | 16 +- ifs-source/arpifs/phys_ec/callpar.F90 | 7 +- ifs-source/arpifs/phys_ec/cloudsc.F90 | 8 +- 26 files changed, 356 insertions(+), 2919 deletions(-) diff --git a/ifs-source/arpifs/chem/chem_tm5.F90 b/ifs-source/arpifs/chem/chem_tm5.F90 index 727e1899..bf920aa6 100644 --- a/ifs-source/arpifs/chem/chem_tm5.F90 +++ b/ifs-source/arpifs/chem/chem_tm5.F90 @@ -436,7 +436,7 @@ SUBROUTINE CHEM_TM5& ! 1.2 Calculate integrated cloud cover above level - adapted from cldpp.f90 -ZCC=0.0_JPRB +ZCC(KIDIA:KFDIA,1:KLEV)=0.0_JPRB DO JL=KIDIA,KFDIA ZCC(JL,1)=1.0_JPRB-MIN(MAX(PAP(JL,1),REPCLC),1.0_JPRB-REPCLC) diff --git a/ifs-source/arpifs/m7/hamm7_init.F90 b/ifs-source/arpifs/m7/hamm7_init.F90 index f2ddd3ac..e18df563 100644 --- a/ifs-source/arpifs/m7/hamm7_init.F90 +++ b/ifs-source/arpifs/m7/hamm7_init.F90 @@ -97,8 +97,9 @@ SUBROUTINE hamm7_init(YGFL, YRRIP) USE MO_ADVECTION, ONLY: & !eehol: added for advection initialization iadvec, tpcore -USE MO_SUBMODEL, ONLY: & !eehol: added mo_submodel routines - setsubmodel, lham, id_ham, starttracdef, endtracdef +USE MO_SUBMODEL, & + ONLY: & !eehol: added mo_submodel routines + lham, id_ham USE MO_SPECIES, & ONLY: speclist, init_splist !eehol: added initialization for species list @@ -144,34 +145,14 @@ SUBROUTINE hamm7_init(YGFL, YRRIP) iadvec = tpcore !comes from ECHAM mo_control.f90 !eehol: set submodel parameters and flags -CALL setsubmodel -! start_ham calls: -! sethamm7, -! m7_initialize, -! ham_species, -! map_m7_species, -! ham_define_modes CALL init_splist !eehol: added init for splist CALL start_ham -!eehol: define tracer numbers, idt, etc. with ham_define_tracer -! RCHG: For the implementation in IFS code it would be worth to consider to -! rename starttracdef and similar subroutines to m7_starttracdef -IF (lham) THEN - CALL starttracdef(id_ham) - CALL ham_define_tracer - CALL endtracdef(id_ham) -END IF +id_ham=1 +CALL ham_define_tracer -! ham_initialize calls: -! start_kappa, if nwater == 1 -!eehol: added testing for lham -!calls also: -! ham_m7_set_idt -IF (lham) THEN - CALL ham_initialize -END IF +CALL ham_initialize ! ham_init_memory calls: ! ham_nucl_initialize, if nsnucl+nonucl > 0 !CALL ham_init_memory !eehol: this is not needed now diff --git a/ifs-source/arpifs/m7/module/mo_activ.F90 b/ifs-source/arpifs/m7/module/mo_activ.F90 index f012ba40..f64cafab 100644 --- a/ifs-source/arpifs/m7/module/mo_activ.F90 +++ b/ifs-source/arpifs/m7/module/mo_activ.F90 @@ -364,17 +364,17 @@ END SUBROUTINE activ_lin_leaitch SUBROUTINE activ_initialize - USE mo_control, ONLY: nlev, nn, & - lcouple !SF + USE mo_control, ONLY: nlev, nn #ifdef HAMMOZ + USE mo_control, ONLY: lcouple USE mo_exception, ONLY: message, em_param USE mo_submodel, ONLY: print_value, lham, lhammoz, lccnclim USE mo_echam_cloud_params, ONLY: ccsaut, ccraut USE mo_tracer, ONLY: get_tracer + USE mo_param_switches, ONLY: icover, nauto, nic_cirrus #endif - USE mo_param_switches, ONLY : icover, nauto, & !++mgs - ncd_activ, nactivpdf, nic_cirrus, lcdnc_progn, & - cdnc_min_fixed + USE mo_param_switches, ONLY: ncd_activ, nactivpdf, lcdnc_progn, & + cdnc_min_fixed USE mo_ham, ONLY: nham_subm, HAM_SALSA, HAM_M7 CHARACTER(len=24) :: csubmname diff --git a/ifs-source/arpifs/m7/module/mo_advection.F90 b/ifs-source/arpifs/m7/module/mo_advection.F90 index 8b3fd2ff..7f4a2f83 100644 --- a/ifs-source/arpifs/m7/module/mo_advection.F90 +++ b/ifs-source/arpifs/m7/module/mo_advection.F90 @@ -1,35 +1,11 @@ -!> -!! @par Copyright -!! This code is subject to the MPI-M-Software - License - Agreement in it's most recent form. -!! Please see URL http://www.mpimet.mpg.de/en/science/models/model-distribution.html and the -!! file COPYING in the root of the source tree for this code. -!! Where software is supplied by third parties, it is indicated in the headers of the routines. -!! MODULE mo_advection - ! L. Kornblueh, MPI, August 2001, initial coding - ! L. Kornblueh, MPI, Februrary 2012, remove spitfire - IMPLICIT NONE PUBLIC - ! defined advection schemes for passive tracer (in advection sense) - INTEGER, PARAMETER :: no_advection = 0 - INTEGER, PARAMETER :: semi_lagrangian = 1 - INTEGER, PARAMETER :: tpcore = 3 - - ! select variable, set in namelist runctl - INTEGER :: iadvec - - ! general dimension parameters to be set in the init section of - ! the diferent advection modules - - INTEGER :: nalatd, nalond, nalev, nacnst, nalat, nalon - - INTEGER, PARAMETER :: jps = 3 ! basic advected variables without tracers: - ! water vapour, cloud water, cloud ice + INTEGER :: tpcore END MODULE mo_advection diff --git a/ifs-source/arpifs/m7/module/mo_control.F90 b/ifs-source/arpifs/m7/module/mo_control.F90 index a4efb2ed..f639992d 100644 --- a/ifs-source/arpifs/m7/module/mo_control.F90 +++ b/ifs-source/arpifs/m7/module/mo_control.F90 @@ -1,144 +1,22 @@ -!> -!! @par Copyright -!! This code is subject to the MPI-M-Software - License - Agreement in it's most recent form. -!! Please see URL http://www.mpimet.mpg.de/en/science/models/model-distribution.html and the -!! file COPYING in the root of the source tree for this code. -!! Where software is supplied by third parties, it is indicated in the headers of the routines. -!! MODULE mo_control - ! Control variables for model housekeeping. - ! - ! U. Schlese, DKRZ, December 1994 - ! A. Rhodin, MPI, January 1999, - ! Subroutine m_control renamed to alloc_mods and moved from - ! module mo_control to module m_alloc_mods. - ! L. Kornblueh, MPI, June 1999, - ! added nproca and nprocb for driving the parallel decomposition - ! M. Esch, MPI, June 1999, ECHAM5-modifications - ! I. Kirchner, MPI, December 2000, time control - ! I. Kirchner, MPI, March 2001, revision - ! M. Esch, MPI, September 2002, add switch for mixed layer ocean - ! M. Esch, MPI, November 2003, add switch for scenario runs - ! L. Kornblueh, MPI, April 2010, more switches for parallel I/O - ! D. Popke, MPI, Nov 2013, Implementation of RCE (lrce) - ! ------------------------------------------------------------------ - USE mo_kind, ONLY: dp IMPLICIT NONE - SAVE ! to assure that the scope of all variables is for the whole program run - - REAL(dp), POINTER :: vct(:)=>NULL() ! vertical coefficients table. - - INTEGER :: nproma = -1 ! working dimension for grid-point computations - INTEGER :: nproca = 1 ! number of processors in set A - INTEGER :: nprocb = 1 ! number of processors in set B - INTEGER :: nprocio = 0 ! number of processors for I/O server - - INTEGER :: nm ! max zonal wave number. + SAVE + INTEGER :: nn ! max meridional wave number for m=0. - INTEGER :: nk ! max meridional wave number. - INTEGER :: ngl ! number of gaussian latitudes. - INTEGER :: nlon ! max number of points on each latitude line. - INTEGER :: nlev ! number of vertical levels. - INTEGER :: nmp1 ! max zonal wave number + 1. - INTEGER :: nnp1 ! max meridional wave number + 1. - INTEGER :: nkp1 - INTEGER :: n2mp1 ! 2 * (max zonal wave number + 1). - INTEGER :: n4mp1 ! 4 * (max zonal wave number + 1). - INTEGER :: nlp2 ! max number of points per latitude line + 2. + INTEGER :: ngl ! number of gaussian latitudes. + INTEGER :: nlon ! max number of points on each latitude line. + INTEGER :: nlev ! number of vertical levels. + INTEGER :: nmp1 ! max zonal wave number + 1. INTEGER :: nlevp1 ! *nlev+1. - INTEGER :: nsp ! number of spectral coefficients. - INTEGER :: n2sp ! 2*number of spectral coefficients. - INTEGER :: nhgl ! (number of gaussian latitudes)/2. - INTEGER :: nscan ! current scan number. - - INTEGER :: nspace1 ! memory manager space for use of root task - INTEGER :: nspace2 ! memory manager space for use of subtasks - - INTEGER :: nspadd ! memory manager space increase - - INTEGER :: nvclev ! number of levels with vertical coefficients. - - LOGICAL :: ldebug = .FALSE. ! .true. for mass fixer diagnostics - LOGICAL :: ldailysst = .FALSE. ! .true. for using daily SST and SIC - LOGICAL :: lamip = .FALSE. ! .true. for using variable sst - LOGICAL :: ldiagamip = .FALSE. ! .true. for AMIP diagnostics - LOGICAL :: lcouple = .FALSE. ! .true. for a coupled run - LOGICAL :: lcouple_co2 = .FALSE. ! .true. if coupled run includes co2 - LOGICAL :: lcouple_parallel = .FALSE. ! .true. if all PEs should communicate with oasis - LOGICAL :: lnwp = .FALSE. ! .false. for climate mode .true. for NWP mode - LOGICAL :: lnudge = .FALSE. ! .true. for Nudging mode - LOGICAL :: lmidatm = .TRUE. ! .true. for middle atmosphere model version - LOGICAL :: lmlo = .FALSE. ! .true. for mixed layer ocean - LOGICAL :: lmeltpond = .TRUE. ! .true. for calculation of meltponds - LOGICAL :: lmlo_ice = .TRUE. ! .true. for sea ice calculation in mixed layer ocean - REAL(dp):: rmlo_depth = 50._dp ! default mixed layer depth - REAL(dp):: earth_angular_velocity = 7.29212e-5_dp !! [rad/s] default value for model angular - !velocity, is set to namelist value once - !runctl is read in inictl.f90 - LOGICAL :: lrce = .FALSE. ! .true. if ECHAM is run in radiative-convective equilibrium - ! configuration; switches to RCE radiation calculation, - ! regulates pbl height calculation (vdiff.f90), - ! sets oceans surface albedo of direct radiation to constant - LOGICAL :: lfractional_mask = .FALSE. ! .true. for fractional land sea mask - - LOGICAL :: lprint_m0 = .FALSE. ! .false. for printing t(m0) and timestep time in stepon - LOGICAL :: lnmi = .FALSE. ! .true. normal mode initialisation - LOGICAL :: ltdiag = .FALSE. ! .true. run with additional tendency diagnostics - LOGICAL :: lcolumn = .FALSE. ! .true. column model mode - LOGICAL :: lvctch = .FALSE. ! .true. if column model has changed vct - - LOGICAL :: l_volc = .FALSE. ! switch for volcanic forcing - - REAL(dp):: satoverpasstime = 10.5_dp ! satellite overpass time at 10.30 a.m. [s] - - LOGICAL :: lhd ! activates hydrologic discharge (HD) model (defined in jsbach namelist jsbach_ctl) - - - ! Spectral and grid point initial files. - INTEGER, PARAMETER :: nisp = 23 ! unit for initial spectral fields. - INTEGER, PARAMETER :: nigp = 24 ! unit for initial grid point fields. - - ! Climate sea surface temperature and sea ice annual cycle file - INTEGER, PARAMETER :: nist = 20 ! unit for surf.temp. file - INTEGER, PARAMETER :: nice = 96 ! unit for amip ice file - - ! Climate flux correction file - INTEGER, PARAMETER :: nflu = 42 ! unit for flux correction file - - ! Climate leaf area index and vegetation ratio annual cycle file - INTEGER, PARAMETER :: nvltcl = 90 ! unit for climate leaf area index - INTEGER, PARAMETER :: nvgratcl = 91 ! unit for climate vegetation ratio - - ! Climate land surface temperature annual cycle file - INTEGER, PARAMETER :: ntslcl = 92 ! unit for climate land surface temperature - - INTEGER, PARAMETER :: nsurface = 79 ! unit for boundary atm-surface jsbach - - ! optional files - INTEGER :: ndiahdf = 10 ! I/O unit for hdiff diagnostics. - - ! Switches + INTEGER :: nsp ! number of spectral coefficients. + INTEGER :: nhgl ! (number of gaussian latitudes)/2. + INTEGER :: nvclev ! number of levels with vertical coefficients. + LOGICAL :: lrce = .FALSE. LOGICAL :: ltimer = .FALSE. ! to use timer - LOGICAL :: ldebugio = .FALSE. ! to debug IO - LOGICAL :: ldebugmem = .FALSE. ! to debug memory - LOGICAL :: ltctest = .FALSE. ! to test time control - LOGICAL :: ldebugs = .FALSE. ! to enable debug stream - LOGICAL :: lindependent_read = .FALSE. ! to read initial/restart input on each MPI rank separatly - LOGICAL :: lcollective_write = .FALSE. ! to write restart in parallel on each MPI rank - LOGICAL :: ldebugcpl = .FALSE. ! to debug coupling -!>>SF: to switchable internal rerun - LOGICAL :: lforcererun = .TRUE. ! to switch on/off internal rerun: - ! - true means internal rerun are forced (default in ECHAM6) - ! - false means internal rerun are bypassed (compulsory in ECHAM-HAMMOZ) -!< -!! @par Copyright -!! This code is subject to the MPI-M-Software - License - Agreement in it's most recent form. -!! Please see URL http://www.mpimet.mpg.de/en/science/models/model-distribution.html and the -!! file COPYING in the root of the source tree for this code. -!! Where software is supplied by third parties, it is indicated in the headers of the routines. +!! \filename +!! mo_exception.F90 !! +!! \belongs_to +!! HAMMOZ +!! +!! SPDX-License-Identifier: BSD-3-Clause +!! Copyright (c) 2021 hammoz + + MODULE mo_exception USE mo_io_units, ONLY: nerr, nlog -#ifdef HAMMOZ - USE mo_mpi, ONLY: p_abort, p_parallel, p_parallel_io, p_pe -#endif IMPLICIT NONE @@ -19,10 +21,6 @@ MODULE mo_exception PUBLIC :: message_text PUBLIC :: message, finish PUBLIC :: em_none, em_info, em_warn, em_error, em_param, em_debug - PUBLIC :: open_log, close_log - PUBLIC :: debug_messages_on, debug_messages_off - PUBLIC :: end_of_init_phase - PUBLIC :: number_of_warnings, number_of_errors INTEGER, PARAMETER :: em_none = 0 ! normal message INTEGER, PARAMETER :: em_info = 1 ! informational message @@ -33,132 +31,24 @@ MODULE mo_exception CHARACTER(len=256) :: message_text = '' !++mgs - LOGICAL :: l_debug = .FALSE. LOGICAL :: l_log = .FALSE. - LOGICAL :: l_init_phase = .TRUE. ! don't report PE during initialisation INTEGER :: number_of_warnings = 0 INTEGER :: number_of_errors = 0 -#ifndef HAMMOZ #include "abor1.intfb.h" -#endif CONTAINS - - SUBROUTINE debug_messages_on - l_debug = .TRUE. - END SUBROUTINE debug_messages_on - - SUBROUTINE debug_messages_off - l_debug = .FALSE. - END SUBROUTINE debug_messages_off - - SUBROUTINE end_of_init_phase - l_init_phase = .FALSE. - END SUBROUTINE end_of_init_phase - + SUBROUTINE finish (name, text, exit_no) -#ifdef __INTEL_COMPILER - USE ifcore -#endif - CHARACTER(len=*), INTENT(in) :: name CHARACTER(len=*), INTENT(in), OPTIONAL :: text INTEGER, INTENT(in), OPTIONAL :: exit_no INTEGER :: iexit -#ifdef HAMMOZ -#ifndef __STANDALONE - EXTERNAL :: util_exit -#if ! (defined (__SX__) || defined (__INTEL_COMPILER) || defined (__xlC__)) - EXTERNAL :: util_backtrace -#endif -#endif -#endif - - WRITE (nerr,'(/,80("="),/)') - IF (l_log) WRITE (nlog,'(/,80("="),/)') - - IF (PRESENT(exit_no)) THEN - iexit = exit_no - ELSE - iexit = 1 ! POSIX defines this as EXIT_FAILURE - END IF - - IF (PRESENT(text)) THEN - IF (iexit == 1) THEN - WRITE (nerr,'(a,a,a,a)') 'FATAL ERROR in ', TRIM(name), ': ', TRIM(text) - ELSE - WRITE (nerr,'(1x,a,a,a)') TRIM(name), ': ', TRIM(text) - ENDIF - IF (l_log) WRITE (nlog,'(1x,a,a,a)') TRIM(name), ': ', TRIM(text) - ELSE - IF (iexit == 1) THEN - WRITE (nerr,'(a,a)') 'FATAL ERROR in ', TRIM(name) - ELSE - WRITE (nerr,'(1x,a)') TRIM(name) - ENDIF - IF (l_log) WRITE (nlog,'(a,a)') TRIM(name) - ENDIF - -#ifdef HAMMOZ - IF (p_parallel .AND. iexit == 1) THEN - WRITE (nerr,'(1x,a,i0)') 'FINISH called from PE: ', p_pe - IF (l_log) WRITE (nlog,'(1x,a,i0)') 'FINISH called from PE: ', p_pe - ENDIF -#endif - - ! generate traceback in error cases - IF (iexit == 1) THEN - WRITE (nerr,'(/,80("-"),/,/)') - IF (l_log) WRITE (nlog,'(/,80("-"),/,/)') -#ifdef HAMMOZ -#ifdef __INTEL_COMPILER - CALL tracebackqq -#else -#ifdef __xlC__ - CALL xl__trbk -#else -#ifdef __SX__ - CALL mesput('Traceback: ', 11, 1) -#else -#ifndef __STANDALONE - CALL util_backtrace -#endif -#endif -#endif -#endif -#endif - ENDIF - - WRITE (nerr,'(/,80("="),/)') - IF (l_log) WRITE (nlog,'(/,80("="),/)') - -#ifdef HAMMOZ - IF (p_parallel) THEN - CALL p_abort - ELSE -#endif - -#ifdef HAMMOZ -#ifndef __STANDALONE - CALL util_exit(iexit) -#else - STOP 'mo_exception: finish ..' - - END IF -#endif -#endif - -#ifndef HAMMOZ - ! Ideally we should check if we are in OpenIFS. Now assume it is the case: - CALL ABOR1(" HAMM7 AEROSOL SCHEME " ) - - ! STOP 'mo_exception: finish ..' -#endif + CALL ABOR1(text) END SUBROUTINE finish @@ -180,98 +70,8 @@ SUBROUTINE message (name, text, out, level, all_print, adjust_right) CHARACTER(len=LEN(message_text)) :: write_text - IF (PRESENT(all_print)) THEN - lprint = all_print - ELSE - lprint = .FALSE. - ENDIF - - IF (PRESENT(adjust_right)) THEN - ladjustr = adjust_right - ELSE - ladjustr = .FALSE. - ENDIF - - IF (PRESENT(out)) THEN - iout = out - ELSE - iout = nerr - END IF - - IF (PRESENT(level)) THEN - ilevel = level - ELSE - ilevel = em_none - END IF - - SELECT CASE (ilevel) - CASE (em_none) ; prefix = ' ' - CASE (em_info) ; prefix = 'INFO :' - CASE (em_warn) ; prefix = 'WARNING:' ; number_of_warnings = number_of_warnings+1 - CASE (em_error) ; prefix = 'ERROR :' ; number_of_errors = number_of_errors+1 - CASE (em_param) ; prefix = '--- ' - CASE (em_debug) ; prefix = 'DEBUG :' - END SELECT - - IF (ladjustr) THEN - message_text = text - ELSE - message_text = TRIM(ADJUSTL(text)) - ENDIF - IF (name /= '') THEN - message_text = TRIM(name) // ': ' // TRIM(message_text) - ENDIF - IF (ilevel > em_none) THEN - message_text = TRIM(prefix) // ' ' // TRIM(message_text) - ENDIF - -#ifdef HAMMOZ - IF (p_parallel .AND. (l_debug .OR. ilevel == em_error)) THEN - WRITE(write_text,'(1x,a,i6,a,a)') 'PE ', p_pe, ' ', TRIM(message_text) - lprint = .TRUE. - ELSE - write_text = message_text - END IF - - IF (p_parallel_io .OR. lprint) THEN - WRITE(iout,'(1x,a)') TRIM(write_text) - IF (l_log) WRITE(nlog,'(1x,a)') TRIM(write_text) - END IF -#endif - + WRITE(nlog,*) name, text + END SUBROUTINE message - SUBROUTINE open_log (logfile_name) - - CHARACTER(len=*), INTENT(in) :: logfile_name - LOGICAL :: l_opened - - INQUIRE (UNIT=nlog,OPENED=l_opened) - - IF (l_opened) THEN - WRITE (message_text,'(a)') 'log file unit has been used already.' - CALL message ('open_log', message_text) - WRITE (message_text,'(a)') 'Close unit and reopen for log file.' - CALL message ('open_log', message_text, level=em_warn) - CLOSE (nlog) - ENDIF - - OPEN (nlog,file=TRIM(logfile_name)) - - l_log = .TRUE. - - END SUBROUTINE open_log - - SUBROUTINE close_log - LOGICAL :: l_opened - - INQUIRE (UNIT=nlog,OPENED=l_opened) - IF (l_opened) THEN - CLOSE (nlog) - ENDIF - - l_log = .FALSE. - - END SUBROUTINE close_log - END MODULE mo_exception diff --git a/ifs-source/arpifs/m7/module/mo_ham.F90 b/ifs-source/arpifs/m7/module/mo_ham.F90 index c2856ecd..77165bdc 100644 --- a/ifs-source/arpifs/m7/module/mo_ham.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham.F90 @@ -401,11 +401,15 @@ SUBROUTINE setham #ifdef HAMMOZ USE mo_submodel, ONLY: print_value USE mo_submodel_diag, ONLY: OFF, ON, BYTRACER, BYSPECIES + USE mo_param_switches, ONLY: nic_cirrus #endif - USE mo_param_switches, ONLY: nic_cirrus, ncd_activ + USE mo_param_switches, ONLY: ncd_activ ! other available options: EF_CONSTANT, EF_TIMERESOLVED, EF_LATLEV, EF_LONLAT, EF_UNDEFINED - USE mo_submodel, ONLY: lham, lhammoz + USE mo_submodel, ONLY: lham +#ifdef HAMMOZ + USE mo_submodel, ONLY: lhammoz +#endif USE mo_physical_constants, ONLY: amd IMPLICIT NONE @@ -669,8 +673,9 @@ SUBROUTINE setham csubmname = 'UNKNOWN' IF (lham) csubmname = 'HAM' +#ifdef HAMMOZ IF (lhammoz) csubmname = 'HAMMOZ' - +#endif CALL message('','') CALL message('', separator) CALL message('setham','Parameter settings for the ECHAM-'//TRIM(csubmname)//' aerosol model', & diff --git a/ifs-source/arpifs/m7/module/mo_ham_init.F90 b/ifs-source/arpifs/m7/module/mo_ham_init.F90 index 3fe50c2c..c731a845 100644 --- a/ifs-source/arpifs/m7/module/mo_ham_init.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_init.F90 @@ -97,7 +97,10 @@ SUBROUTINE start_ham HAM_M7, & HAM_SALSA, & subm_naerospec - USE mo_ham_m7ctl, ONLY : sethamM7, m7_initialize +#ifdef HAMMOZ + USE mo_ham_m7ctl, ONLY : sethamM7 +#endif + USE mo_ham_m7ctl, ONLY : m7_initialize #ifdef SALSA USE mo_ham_salsactl, ONLY : setham_salsa USE mo_ham_salsa_init, ONLY : salsa_initialize @@ -139,7 +142,9 @@ SUBROUTINE start_ham ! -- initialize M7 scheme +#ifdef HAMMOZ CALL sethamM7 +#endif CALL m7_initialize #ifdef SALSA CASE(HAM_SALSA) diff --git a/ifs-source/arpifs/m7/module/mo_ham_kappa.F90 b/ifs-source/arpifs/m7/module/mo_ham_kappa.F90 index 85ae1e6a..98456388 100644 --- a/ifs-source/arpifs/m7/module/mo_ham_kappa.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_kappa.F90 @@ -174,9 +174,9 @@ SUBROUTINE start_kappa #ifdef HAMMOZ USE mo_mpi, ONLY: p_parallel, p_parallel_io, p_bcast, p_io + USE mo_submodel, ONLY: print_value #endif USE mo_exception, ONLY: finish, message, em_info, em_param, em_warn - USE mo_submodel, ONLY: print_value USE mo_read_netcdf77, ONLY: read_var_nf77_1d, read_var_nf77_4d USE mo_netcdf, ONLY: nf_check, nf__open, nf_close, nf_nowrite, nf_global, chunksize, & IO_GET_ATT_TEXT, IO_INQ_DIMID, IO_INQ_DIMLEN @@ -353,7 +353,6 @@ SUBROUTINE start_kappa CALL p_bcast(gf, p_io) END IF -#endif !--- report lookup table data CALL message('','',level=em_param) @@ -374,7 +373,6 @@ SUBROUTINE start_kappa CALL print_value(' Max. kappa: ', kappa_max) CALL message('','',level=em_param) -#ifdef HAMMOZ !---Release memory holding the coordinate variables IF (p_parallel_io) THEN DEALLOCATE(Rd) diff --git a/ifs-source/arpifs/m7/module/mo_ham_m7ctl.F90 b/ifs-source/arpifs/m7/module/mo_ham_m7ctl.F90 index 6cc3d48f..0c790ef5 100644 --- a/ifs-source/arpifs/m7/module/mo_ham_m7ctl.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_m7ctl.F90 @@ -55,7 +55,10 @@ MODULE mo_ham_m7ctl PRIVATE ! -- subroutines - PUBLIC :: sethamM7, m7_initialize +#ifdef HAMMOZ + PUBLIC :: sethamM7 +#endif + PUBLIC :: m7_initialize ! -- variables PUBLIC :: nwater, nsnucl, nonucl @@ -528,7 +531,7 @@ SUBROUTINE m7_initialize END SUBROUTINE m7_initialize - +#ifdef HAMMOZ SUBROUTINE sethamM7 ! *sethamM7* modifies pre-set switches of the aeroM7ctl @@ -543,9 +546,7 @@ SUBROUTINE sethamM7 ! *sethamM7* is called from *init_subm* in mo_submodel_interface ! -#ifdef HAMMOZ USE mo_mpi, ONLY: p_parallel_io, p_bcast, p_io -#endif USE mo_namelist, ONLY: open_nml, position_nml, POSITIONED USE mo_exception, ONLY: message, em_warn, em_info USE mo_util_string, ONLY: separator @@ -553,60 +554,9 @@ SUBROUTINE sethamM7 IMPLICIT NONE - !INCLUDE 'ham_m7ctl.inc' + INCLUDE 'ham_m7ctl.inc' ! Local variables: -!! -!! \brief -!! namelist for the M7 aerosol model -!! -!! \author Philip Stier (MPI-Met) -!! -!! \responsible_coder -!! Philip Stier, philip.stier@physics.ox.ac.uk -!! -!! \revision_history -!! -# Philip Stier (MPI-Met) - original code (2003-01) -!! -# Jan Kazil (MPI-M) (2008-05) -!! -!! \limitations -!! None -!! -!! \details -!! None -!! -!! \bibliographic_references -!! None -!! -!! \belongs_to -!! HAMMOZ -!! -!! \copyright -!! Copyright and licencing conditions are defined in the ECHAM-HAMMOZ -!! licencing agreement to be found at: -!! https://redmine.hammoz.ethz.ch/projects/hammoz/wiki/1_Licencing_conditions -!! The ECHAM-HAMMOZ software is provided "as is" and without warranty of any kind. -!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -NAMELIST /ham_m7ctl/ nwater, & !< Aerosol water uptake scheme: - !! - !! nwater = 0 Jacobson et al., JGR 1996 - !! = 1 Kappa-Koehler theory based approach (Petters and Kreidenweis, ACP 2007) - nsnucl, & !< Choice of the sulfate aerosol nucleation scheme: - !! - !! nsnucl = 0 off - !! = 1 Vehkamaeki et al., JGR 2002 - !! = 2 Kazil and Lovejoy, ACP 2007 - !! - nonucl, & !< Choice of the organic aerosol nucleation scheme: - !! - !! nonucl = 0 off - !! = 1 Activation nucleation, Kulmala et al., ACP 2006 - !! = 2 Kinetic nucleation, Laakso et al., ACP 2004 - !! - lnucl_stat !< Sample the cloud-free volume as function of T, RH, [H2SO4(g)], - !! H2SO4 condensation sink, and ionization rate (memory intensive) INTEGER :: ierr, inml, iunit @@ -614,9 +564,9 @@ SUBROUTINE sethamM7 CALL message('',separator) CALL message('sethamM7', 'Reading namelist ham_m7ctl...', level=em_info) -#ifdef HAMMOZ + + IF (p_parallel_io) THEN -#endif inml = open_nml('namelist.echam') iunit = position_nml ('HAM_M7CTL', inml, status=ierr) @@ -625,17 +575,13 @@ SUBROUTINE sethamM7 READ (iunit, ham_m7ctl) END SELECT -#ifdef HAMMOZ ENDIF -#endif ! Broadcast the switches over the processors: -#ifdef HAMMOZ CALL p_bcast (nwater, p_io) CALL p_bcast (nsnucl, p_io) CALL p_bcast (nonucl, p_io) CALL p_bcast (lnucl_stat, p_io) -#endif !--- error checking IF (nsnucl > 1 .AND. .NOT. lgcr) THEN @@ -645,13 +591,10 @@ SUBROUTINE sethamM7 END IF !--- write the values of the switches: -#ifdef HAMMOZ CALL sethamM7_log(nwater,nsnucl,nonucl,lnucl_stat) -#endif END SUBROUTINE sethamM7 -#ifdef HAMMOZ SUBROUTINE sethamM7_log(nwater,nsnucl,nonucl,lnucl_stat) ! *sethamM7_log* writes the values of the given switches in a given output diff --git a/ifs-source/arpifs/m7/module/mo_ham_sedimentation.F90 b/ifs-source/arpifs/m7/module/mo_ham_sedimentation.F90 index 1253f30d..0fb29e48 100644 --- a/ifs-source/arpifs/m7/module/mo_ham_sedimentation.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_sedimentation.F90 @@ -207,7 +207,7 @@ SUBROUTINE ham_sedimentation(kproma, kbdim, klev, krow, & !--- Slinn correction for sedimentation velocity of a ! size distribution with a given sigma: slinnfac=sigma(imod)**(2._dp*sigmaln(imod)) - +#ifdef SALSA CASE(HAM_SALSA) #ifdef HAMMOZ zmd(1:kproma,:)=MIN( rwet_p(1:kproma,:,krow)*2._dp , 50.E-6_dp) @@ -216,7 +216,8 @@ SUBROUTINE ham_sedimentation(kproma, kbdim, klev, krow, & #endif !TB !slinnfac not needed - slinnfac=1.0_dp + slinnfac=1.0_dp +#endif END SELECT !>>SF #458 (replacing where statements) @@ -240,12 +241,14 @@ SUBROUTINE ham_sedimentation(kproma, kbdim, klev, krow, & * (slinnfac + & 1.246_dp*2._dp*plair(1:kproma,:) & /ztmp1(1:kproma,:)*exp((0.5_dp*sigmaln(imod)**2._dp))) -!< FMI suggests this unit should be [m] + pm6dry(kbdim,klev,nsol), & ! dry radius for soluble modes [cm] -> FMI suggests both radii unit should be [m] prhop(kbdim,klev,nclass), & ! mean mode particle density [g cm-3] -> FMI suggests this unit should be [kg m-3] pww(kbdim,klev,nclass) ! aerosol water content for each mode [kg(water) m-3(air)] diff --git a/ifs-source/arpifs/m7/module/mo_hammoz_sedimentation.F90 b/ifs-source/arpifs/m7/module/mo_hammoz_sedimentation.F90 index 5f379fdd..74d6e07d 100644 --- a/ifs-source/arpifs/m7/module/mo_hammoz_sedimentation.F90 +++ b/ifs-source/arpifs/m7/module/mo_hammoz_sedimentation.F90 @@ -229,9 +229,9 @@ SUBROUTINE sedi_interface(kbdim, kproma, klev, krow, & REAL(dp), INTENT(in) :: pm6rp(kbdim, klev, nclass), prhop(kbdim, klev, nclass) - REAL(dp), INTENT(inout) :: pxtte(kbdim,klev,ntrac), & ! tracer tendency - psediflux(kbdim,klev,ntrac), & - psedifluxsurf(kbdim,ntrac) + REAL(dp), INTENT(inout) :: pxtte(kbdim,klev,ntrac), & ! tracer tendency + psediflux(kbdim,klev,ntrac), & !sediflux diagnostic + psedifluxsurf(kbdim,ntrac) !sediflux surf diagnostic !--- local variables INTEGER :: jt, ierr REAL(dp) :: ztempc(kbdim, klev), & ! temp. above melting diff --git a/ifs-source/arpifs/m7/module/mo_io_units.F90 b/ifs-source/arpifs/m7/module/mo_io_units.F90 index e4a65fda..203c5fff 100644 --- a/ifs-source/arpifs/m7/module/mo_io_units.F90 +++ b/ifs-source/arpifs/m7/module/mo_io_units.F90 @@ -1,28 +1,14 @@ -!> -!! @par Copyright -!! This code is subject to the MPI-M-Software - License - Agreement in it's most recent form. -!! Please see URL http://www.mpimet.mpg.de/en/science/models/model-distribution.html and the -!! file COPYING in the root of the source tree for this code. -!! Where software is supplied by third parties, it is indicated in the headers of the routines. -!! MODULE mo_io_units IMPLICIT NONE PUBLIC - ! This paramter is taken from /usr/include/stdio.h (ANSI C standard). If - ! problems with filename length appear, check the before mentioned file. - INTEGER, PARAMETER :: filename_max = 1024 ! Standard I/O-units -#ifdef hpux - INTEGER, PARAMETER :: nerr = 7 ! error output -#else INTEGER, PARAMETER :: nerr = 0 ! error output -#endif INTEGER, PARAMETER :: nlog = 1 ! standard log file unit INTEGER, PARAMETER :: nin = 5 ! standard input INTEGER, PARAMETER :: nout = 6 ! standard output diff --git a/ifs-source/arpifs/m7/module/mo_math_constants.F90 b/ifs-source/arpifs/m7/module/mo_math_constants.F90 index d970dd76..80a56cef 100644 --- a/ifs-source/arpifs/m7/module/mo_math_constants.F90 +++ b/ifs-source/arpifs/m7/module/mo_math_constants.F90 @@ -1,106 +1,97 @@ -!> -!! @par Copyright -!! This code is subject to the MPI-M-Software - License - Agreement in it's most recent form. -!! Please see URL http://www.mpimet.mpg.de/en/science/models/model-distribution.html and the -!! file COPYING in the root of the source tree for this code. -!! Where software is supplied by third parties, it is indicated in the headers of the routines. -!! -!! Module defines main mathematical constants -!! -!! These constants are provided to more significant digits than is necessary for a 64-bit -!! double precision number; they may be used for other purposes where the extra precision -!! is necessary or useful. -!! -!! The variables are calculated by a multi-precision floating point package -!! (mpmath in python). -!! -!! @par Revision History -!! Developed by Luis Kornblueh (2004) -!! Modified to ProTeX-style by Luca Bonaventura and Thomas Heinze (2004). -!! Modified according to style guide by Thomas Heinze (2005-06-24): -!! - module renamed from mo_math to mo_math_constants -!! - eps moved from mo_physical_constants -!! - pid180i renamed to rad2deg -!! Including some more constants from math.h by Thomas Heinze (2005-07-18) -!! pid5 renamed to pi_5 by Thomas Heinze (2005-07-26) -!! Modification by Thomas Heinze (2006-02-21): -!! - renamed m_modules to mo_modules -!! Modification by Thomas Heinze (2006-05-18): -!! - introduced dbl_eps -!! Modified by Luis Kornblueh (2012) -!! - replaced arbitrary number of digits by 42 significant decimal digits calculated by -!! multi-precision algorithms -!! +! Module determines main mathematical constants to be used by shallow water +! prototype. Values are taken from glibc 2.2.5: /usr/include/math.h +! These constants +! are provided to more significant digits than is necessary for a 64-bit +! double precision number; they may be used for other purposes where the +! extra precision is necessary or useful. +! +! +! ICON +! +! --------------------------------------------------------------- +! Copyright (C) 2004-2024, DWD, MPI-M, DKRZ, KIT, ETH, MeteoSwiss +! Contact information: icon-model.org +! +! See AUTHORS.TXT for a list of authors +! See LICENSES/ for license information +! SPDX-License-Identifier: BSD-3-Clause +! --------------------------------------------------------------- + MODULE mo_math_constants - - USE mo_kind, ONLY: wp - IMPLICIT NONE - - PUBLIC +USE mo_kind, ONLY: wp + +IMPLICIT NONE + +PUBLIC + +! +! ! Mathematical constants (in brackets original C names) +! +! ! euler (mo_E ) -- e +! ! log2e (mo_LOG2E ) -- log2(e) +! ! log10e (mo_LOG10E ) -- log10(e) +! ! ln2 (mo_LN2 ) -- ln(2) +! ! ln10 (mo_LN10 ) -- ln(10) +! ! pi (mo_PI ) -- pi +! ! pi_2 (mo_PI_2 ) -- pi/2 +! ! pi_4 (mo_PI_4 ) -- pi/4 +! ! rpi (mo_1_PI ) -- 1/pi +! ! rpi_2 (mo_2_PI ) -- 2/pi +! ! rsqrtpi_2 (mo_2_SQRTPI) -- 2/(sqrt(pi)) +! ! sqrt2 (mo_SQRT2 ) -- sqrt(2) +! ! sqrt1_2 (mo_SQRT1_2 ) -- 1/sqrt(2) +! ! sqrt3 -- sqrt(3) +! ! sqrt1_3 -- 1/sqrt(3) +! ! +! +! + +REAL (wp), PARAMETER :: euler = 2.71828182845904523536028747135266250_wp +REAL (wp), PARAMETER :: log2e = 1.44269504088896340735992468100189214_wp +REAL (wp), PARAMETER :: log10e = 0.434294481903251827651128918916605082_wp +REAL (wp), PARAMETER :: ln2 = 0.693147180559945309417232121458176568_wp +REAL (wp), PARAMETER :: ln10 = 2.30258509299404568401799145468436421_wp +REAL (wp), PARAMETER :: pi = 3.14159265358979323846264338327950288_wp +!$ACC DECLARE COPYIN(pi) +REAL (wp), PARAMETER :: pi_2 = 1.57079632679489661923132169163975144_wp +REAL (wp), PARAMETER :: pi_4 = 0.785398163397448309615660845819875721_wp +REAL (wp), PARAMETER :: rpi = 0.318309886183790671537767526745028724_wp +REAL (wp), PARAMETER :: rpi_2 = 0.636619772367581343075535053490057448_wp +REAL (wp), PARAMETER :: rsqrtpi_2 = 1.12837916709551257389615890312154517_wp +REAL (wp), PARAMETER :: sqrt2 = 1.41421356237309504880168872420969808_wp +REAL (wp), PARAMETER :: sqrt1_2 = 0.707106781186547524400844362104849039_wp +REAL (wp), PARAMETER :: sqrt3 = 1.7320508075688772935274463415058723_wp +REAL (wp), PARAMETER :: sqrt1_3 = 0.5773502691896257645091487805019575_wp +REAL (wp), PARAMETER :: cos45 = sqrt1_2 +REAL (wp), PARAMETER :: one_third = 1.0_wp/3.0_wp + +! +! ! some more useful constants +! ! pi_5 -- half angle of pentagon +! ! rad2deg -- conversion factor from radians to degree +! ! deg2rad -- conversion factor from degree to radians +! ! eps -- residual bound for solvers +! + +REAL (wp), PARAMETER :: pi_5 = pi*0.2_wp +REAL (wp), PARAMETER :: pi2 = pi*2.0_wp +REAL (wp), PARAMETER :: rad2deg = 180.0_wp/pi +!$ACC DECLARE COPYIN(rad2deg) +REAL (wp), PARAMETER :: deg2rad = pi/180.0_wp +REAL (wp), PARAMETER :: eps = 1.e-8_wp +REAL (wp), PARAMETER :: dbl_eps = EPSILON(1._wp) +REAL (wp), PARAMETER :: pi_180 = pi/180._wp + +! +! ! phi0 is the latitude of the lowest major triangle corner +! ! and the latitude of the major hexagonal faces centers +! ! phi0 = 0.5_wp*pi - 2._wp*acos(1.0_wp/(2._wp*sin(pi/5._wp))) +! - CHARACTER(len=*), PARAMETER, PRIVATE :: version = '$Id$' +REAL (wp), PARAMETER :: phi0 = 0.46364760900080614903_wp - ! Mathematical constants defined: - ! - !-------------------------------------------------------------- - ! Fortran name | C name | meaning | - !-------------------------------------------------------------- - ! euler | M_E | e | - ! log2e | M_LOG2E | log2(e) | - ! log10e | M_LOG10E | log10(e) | - ! ln2 | M_LN2 | ln(2) | - ! ln10 | M_LN10 | ln(10) | - ! pi | M_PI | pi | - ! pi_2 | M_PI_2 | pi/2 | - ! pi_4 | M_PI_4 | pi/4 | - !>>SF/HK #525 | - ! pi_6 | M_PI_6 | pi/6 | - !<>SF/HK #525 - REAL(wp), PARAMETER :: pi_6 = 0.523598775598298873077107230546583814032862_wp -!< -!! @par Copyright -!! This code is subject to the MPI-M-Software - License - Agreement in it's most recent form. -!! Please see URL http://www.mpimet.mpg.de/en/science/models/model-distribution.html and the -!! file COPYING in the root of the source tree for this code. -!! Where software is supplied by third parties, it is indicated in the headers of the routines. -!! MODULE mo_param_switches IMPLICIT NONE - ! M.A. Giorgetta, March 2000, lrad added - ! - ! ---------------------------------------------------------------- - ! - ! module *mo_param_switches* switches related to the parameterisations of - ! diabatic processes except for radiation. - ! - ! ---------------------------------------------------------------- - - LOGICAL :: lphys ! *true for parameterisation of diabatic processes. - LOGICAL :: lrad ! *true for radiation. - LOGICAL :: lvdiff ! *true for vertical diffusion. - LOGICAL :: lcond ! *true for large scale condensation scheme. - LOGICAL :: lsurf ! *true for surface exchanges. - LOGICAL :: lconv ! *true to allow convection - LOGICAL :: lgwdrag ! *true for gravity wave drag scheme - LOGICAL :: lice ! *true for sea-ice temperature calculation - LOGICAL :: lconvmassfix ! *false for switching off aerosol mass fixer in conv - - INTEGER :: iconv = 1 ! *1,2,3 for different convection schemes - INTEGER :: icover = 1 ! *1 for default cloud cover scheme - ! *2 for prognostic cloud cover scheme - -!++mgs : new switches for interactive cloud scheme - LOGICAL :: lcdnc_progn ! true for prognostic cloud droplet activation - INTEGER :: ncd_activ ! type of cloud droplet activation scheme (see physctl.inc) + LOGICAL :: lcdnc_progn ! true for prognostic cloud droplet activation !HK + INTEGER :: ncd_activ ! type of cloud droplet activation scheme (see physctl.inc) !HK INTEGER :: nactivpdf ! sub-grid scale PDF of updraft velocities (see physctl.inc) !ZK -!>>SF changed the former logical lice_supersat into an integer characterizing the cirrus scheme - INTEGER :: nic_cirrus ! type of cirrus scheme (see physctl.inc) -!< orographic cirrus clouds) - ! lorocirrus = .FALSE. (default, no orographic cirrus clouds) - ! = .TRUE. (orographic cirrus clouds on) -!>>SF #475 - LOGICAL :: ldyn_cdnc_min ! switch to turn on the dynamical setting of the minimum cloud droplet number concentration - ! ldyn_cdnc_min = .FALSE. (default, fixed minimum CDNC) - ! .TRUE. (dynamical min CDNC) -!<>SF #589 - INTEGER :: cdnc_min_fixed ! fixed value for min CDNC in cm-3 (used when ldyn_cdnc_min is FALSE) - ! Warning! So far only values of 40 or 10 are accepted. -!< -!! @par Copyright -!! This code is subject to the MPI-M-Software - License - Agreement in it's most recent form. -!! Please see URL http://www.mpimet.mpg.de/en/science/models/model-distribution.html and the -!! file COPYING in the root of the source tree for this code. -!! Where software is supplied by third parties, it is indicated in the headers of the routines. -!! -!! This module provides physical constants for the ICON general circulation models. -!! -!! Physical constants are grouped as follows: -!! - Natural constants -!! - Molar weights -!! - Earth and Earth orbit constants -!! - Thermodynamic constants for the dry and moist atmosphere -!! - Constants used for the computation of lookup tables of the saturation -!! mixing ratio over liquid water (*c_les*) or ice(*c_ies*) -!! (to be shifted to the module that computes the lookup tables) - -!! -!! @par Revision History -!! Developed by Luis Kornblueh and Luca Bonaventura (2002-03) -!! Modified to ProTeX-style by Luca Bonaventura and Thomas Heinze (2004). -!! Modified according to style guide by Thomas Heinze (2005-06-24): -!! - module renamed from mo_constants to mo_physical_constants -!! - eps moved to mo_math_constants -!! - su0 renamed to u0 (as in Williamson et al. (1992) paper) -!! Adding units to comments by Thomas Heinze (2005-07-26) -!! Modification by Thomas Heinze (2006-02-21): -!! - renamed m_modules to mo_modules -!! Modification by Hui Wan (2007-01-12): -!! - added more constants from ECHAM5 -!! Modification by Hui Wan (2007-01-16): -!! - parameter u0 moved to mo_sw_testcases -!! Modification by Kristina Froehlich (2010-05-07): -!! - start to introduce consolidated physical constants -!! Modification by Marco Giorgetta (2010-07-16): -!! - improve comments and structure -!! - add "day" for length of day in [s] -!! - move constants "*_bg" for the background structure of the atmosphere of the nh-model -!! to mo_vertical_grid, which is the only module using these constants -!! - move "grav_o_cpd" to mo_divergent_modes.f90, which is th only module using this -!! derived constant -!! Modification by Felix Rieper (2012-02) -!! - added some constants needed in cloud physics scheme -!! +! This module provides physical constants for the ICON general circulation models. +! +! Physical constants are grouped as follows: +! - Natural constants +! - Molar weights +! - Earth and Earth orbit constants +! - Thermodynamic constants for the dry and moist atmosphere +! - Constants used for the computation of lookup tables of the saturation +! mixing ratio over liquid water (*c_les*) or ice(*c_ies*) +! (to be shifted to the module that computes the lookup tables) +! +! +! ICON +! +! --------------------------------------------------------------- +! Copyright (C) 2004-2024, DWD, MPI-M, DKRZ, KIT, ETH, MeteoSwiss +! Contact information: icon-model.org +! +! See AUTHORS.TXT for a list of authors +! See LICENSES/ for license information +! SPDX-License-Identifier: BSD-3-Clause +! --------------------------------------------------------------- + MODULE mo_physical_constants USE mo_kind, ONLY: wp @@ -54,18 +32,23 @@ MODULE mo_physical_constants ! Natural constants ! ----------------- ! +!!$ ! ECHAM values +!!$ REAL(wp), PARAMETER :: avo = 6.022045e23_wp ! [1/mo] Avogadro constant +!!$ REAL(wp), PARAMETER :: ak = 1.380662e-23_wp ! [J/K] Boltzmann constant +!!$ REAL(wp), PARAMETER :: argas = 8.314409_wp ! [J/K/mol] molar/universal/ideal gas constant +!!$ REAL(wp), PARAMETER :: stbo = 5.67E-8_wp ! [W/m2/K4] Stephan-Boltzmann constant ! WMO/SI values REAL(wp), PARAMETER :: avo = 6.02214179e23_wp !> [1/mo] Avogadro constant REAL(wp), PARAMETER :: ak = 1.3806504e-23_wp !! [J/K] Boltzmann constant REAL(wp), PARAMETER :: argas = 8.314472_wp !! [J/K/mol] molar/universal/ideal gas constant REAL(wp), PARAMETER :: stbo = 5.6704E-8_wp !! [W/m2/K4] Stephan-Boltzmann constant - ! + + !> Molar weights !! ------------- !! !! Pure species - REAL(wp), PARAMETER :: amco2 = 44.0095_wp !>[g/mol] CO2 (National Institute for - !! Standards and Technology (NIST)) + REAL(wp), PARAMETER :: amco2 = 44.011_wp !>[g/mol] CO2 REAL(wp), PARAMETER :: amch4 = 16.043_wp !! [g/mol] CH4 REAL(wp), PARAMETER :: amo3 = 47.9982_wp !! [g/mol] O3 REAL(wp), PARAMETER :: amo2 = 31.9988_wp !! [g/mol] O2 @@ -73,8 +56,11 @@ MODULE mo_physical_constants REAL(wp), PARAMETER :: amc11 =137.3686_wp !! [g/mol] CFC11 REAL(wp), PARAMETER :: amc12 =120.9140_wp !! [g/mol] CFC12 REAL(wp), PARAMETER :: amw = 18.0154_wp !! [g/mol] H2O - REAL(wp), PARAMETER :: ams = 32.064_wp !! [g/mol] S - REAL(wp), PARAMETER :: amso4 = 96.0631_wp !! [g/mol] SO4 + REAL(wp), PARAMETER :: amo = 15.9994_wp !! [g/mol] O + REAL(wp), PARAMETER :: amno = 30.0061398_wp !! [g/mol] NO + REAL(wp), PARAMETER :: amn2 = 28.0134_wp !! [g/mol] N2 + REAL(wp), PARAMETER :: amso4 = 96.0626_wp !! [g/mol] SO4 + REAL(wp), PARAMETER :: ams = 32.06_wp !! [g/mol] S ! !> Mixed species REAL(wp), PARAMETER :: amd = 28.970_wp !> [g/mol] dry air @@ -83,173 +69,175 @@ MODULE mo_physical_constants ! ppmv2gg converts ozone from volume mixing ratio in ppmv ! to mass mixing ratio in g/g REAL(wp), PARAMETER :: ppmv2gg=1.e-6_wp*amo3/amd - ! + REAL(wp), PARAMETER :: o3mr2gg=amo3/amd + + !> Conversion factor from CO2 volume to mass mixing ratio [kg(CO2)/kg(Air)/(mol(CO2)/mol(Air))]. + REAL(wp), PARAMETER :: vmr_to_mmr_co2 = amco2 / amd + !> Conversion factor from CH4 volume to mass mixing ratio [kg(CH4)/kg(Air)/(mol(CH4)/mol(Air))]. + REAL(wp), PARAMETER :: vmr_to_mmr_ch4 = amch4 / amd + !> Conversion factor from N2O volume to mass mixing ratio [kg(N2O)/kg(Air)/(mol(N2O)/mol(Air))]. + REAL(wp), PARAMETER :: vmr_to_mmr_n2o = amn2o / amd + !> Conversion factor from CFC11 volume to mass mixing ratio [kg(CFC11)/kg(Air)/(mol(CFC11)/mol(Air))]. + REAL(wp), PARAMETER :: vmr_to_mmr_c11 = amc11 / amd + !> Conversion factor from CFC12 volume to mass mixing ratio [kg(CFC12)/kg(Air)/(mol(CFC12)/mol(Air))]. + REAL(wp), PARAMETER :: vmr_to_mmr_c12 = amc12 / amd + !> Earth and Earth orbit constants !! ------------------------------- !! +! REAL(wp), PARAMETER :: re = 6.371229e6_wp !! [m] average radius +! REAL(wp), PARAMETER :: rre = 1._wp/ph_re !! [1/m] REAL(wp), PARAMETER :: earth_radius = 6.371229e6_wp !! [m] average radius REAL(wp), PARAMETER :: inverse_earth_radius = 1._wp/earth_radius !! [1/m] - !REAL(wp), PARAMETER :: earth_angular_velocity = 7.29212e-5_wp !! [rad/s] angular velocity - ! read from namelist runctl, is saved in mo_control (for RCE) + REAL(wp), PARAMETER :: earth_angular_velocity = 7.29212e-5_wp !! [rad/s] angular velocity ! +!!$ ! ECHAM values +!! REAL(wp), PARAMETER :: grav = 9.80616_wp ! [m/s2] av. gravitational acceleration ! WMO/SI value REAL(wp), PARAMETER :: grav = 9.80665_wp !> [m/s2] av. gravitational acceleration + !$ACC DECLARE COPYIN(grav) REAL(wp), PARAMETER :: rgrav = 1._wp/grav !! [s2/m] ! REAL(wp), PARAMETER :: rae = 0.1277E-2_wp !> [m/m] ratio of atm. scale height ! !! to Earth radius - REAL(wp), PARAMETER :: secperday = 86400._wp ! seconds per day - ! - !> Thermodynamic constants for the dry and moist atmosphere - !! -------------------------------------------------------- + + + ! Thermodynamic constants for the dry and moist atmosphere + ! -------------------------------------------------------- ! !> Dry air REAL(wp), PARAMETER :: rd = 287.04_wp !> [J/K/kg] gas constant + !$ACC DECLARE COPYIN(rd) REAL(wp), PARAMETER :: cpd = 1004.64_wp !! [J/K/kg] specific heat at constant pressure REAL(wp), PARAMETER :: cvd = cpd-rd !! [J/K/kg] specific heat at constant volume REAL(wp), PARAMETER :: con_m = 1.50E-5_wp !! [m^2/s] kinematic viscosity of dry air REAL(wp), PARAMETER :: con_h = 2.20E-5_wp !! [m^2/s] scalar conductivity of dry air REAL(wp), PARAMETER :: con0_h= 2.40e-2_wp !! [J/m/s/K]thermal conductivity of dry air REAL(wp), PARAMETER :: eta0d = 1.717e-5_wp !! [N*s/m2] dyn viscosity of dry air at tmelt -!>>SF/HK #525 - REAL(wp), PARAMETER :: mair = 28.97e-3_wp !! [kg/mol] molar mass -!< H2O !! - gas REAL(wp), PARAMETER :: rv = 461.51_wp !> [J/K/kg] gas constant for water vapor + !$ACC DECLARE COPYIN(rv) REAL(wp), PARAMETER :: cpv = 1869.46_wp !! [J/K/kg] specific heat at constant pressure REAL(wp), PARAMETER :: cvv = cpv-rv !! [J/K/kg] specific heat at constant volume REAL(wp), PARAMETER :: dv0 = 2.22e-5_wp !! [m^2/s] diff coeff of H2O vapor in dry air at tmelt !> - liquid / water REAL(wp), PARAMETER :: rhoh2o= 1000._wp !> [kg/m3] density of liquid water - !> H2O related constants (liquid, ice, snow), phase change constants - ! echam values - REAL(wp), PARAMETER :: rhosea = 1025.0_wp ! density of sea water in kg/m3 - REAL(wp), PARAMETER :: rhoice = 917.0_wp ! density of ice in kg/m3 - REAL(wp), PARAMETER :: rhosno = 300.0_wp ! density of snow in kg/m3 - REAL(wp), PARAMETER :: rhoiw = rhoice/rhoh2o ! density ratio (ice/water) - REAL(wp), PARAMETER :: cpliq = 4218._wp ! specific heat for liquid water J/K/kg - REAL(wp), PARAMETER :: cpsea = 3994._wp ! specific heat for sea water J/K/kg - REAL(wp), PARAMETER :: cpice = 2106._wp ! specific heat for ice J/K/kg - REAL(wp), PARAMETER :: cpsno = 2090._wp ! specific heat for snow J/K/kg - REAL(wp), PARAMETER :: alice = 2.1656_wp ! thermal conductivity of ice in W/K/m - REAL(wp), PARAMETER :: alsno = 0.31_wp ! thermal conductivity of snow in W/K/m - ! echam values end - ! + !> - solid / ice + REAL(wp), PARAMETER :: rhoice= 916.7_wp !> [kg/m3] density of pure ice + !REAL(wp), PARAMETER :: clw = 4186.84_wp !! [J/K/kg] specific heat of water - ! !! see below - REAL(wp), PARAMETER :: cv_i = 2000.0_wp + !! see below + REAL(wp), PARAMETER :: cv_i = 2000.0_wp !> - phase changes REAL(wp), PARAMETER :: alv = 2.5008e6_wp !> [J/kg] latent heat for vaporisation + !$ACC DECLARE COPYIN(alv) REAL(wp), PARAMETER :: als = 2.8345e6_wp !! [J/kg] latent heat for sublimation + !$ACC DECLARE COPYIN(als) REAL(wp), PARAMETER :: alf = als-alv !! [J/kg] latent heat for fusion + !$ACC DECLARE COPYIN(alf) REAL(wp), PARAMETER :: tmelt = 273.15_wp !! [K] melting temperature of ice/snow + REAL(wp), PARAMETER :: t3 = 273.16_wp !! [K] Triple point of water at 611hPa ! !> Auxiliary constants REAL(wp), PARAMETER :: rdv = rd/rv !> [ ] - ! the next 2 values not as parameters due to ECHAM-dyn - REAL(wp) :: vtmpc1= rv/rd-1.0_wp !! [ ] - REAL(wp) :: vtmpc2= cpv/cpd-1.0_wp !! [ ] - REAL(wp), PARAMETER :: rcpv = cpd/cpv-1.0_wp !! [ ] + !$ACC DECLARE COPYIN(rdv) + REAL(wp), PARAMETER :: vtmpc1= rv/rd-1._wp !! [ ] + !$ACC DECLARE COPYIN(vtmpc1) + REAL(wp), PARAMETER :: vtmpc2= cpv/cpd-1._wp !! [ ] + REAL(wp), PARAMETER :: rcpv = cpd/cpv-1._wp !! [ ] REAL(wp), PARAMETER :: alvdcp= alv/cpd !! [K] REAL(wp), PARAMETER :: alsdcp= als/cpd !! [K] - REAL(wp), PARAMETER :: rcpd = 1.0_wp/cpd !! [K*kg/J] - REAL(wp), PARAMETER :: rcvd = 1.0_wp/cvd !! [K*kg/J] + REAL(wp), PARAMETER :: rcpd = 1._wp/cpd !! [K*kg/J] + REAL(wp), PARAMETER :: rcvd = 1._wp/cvd !! [K*kg/J] REAL(wp), PARAMETER :: rcpl = 3.1733_wp !! cp_d / cp_l - 1 ! REAL(wp), PARAMETER :: clw = (rcpl + 1.0_wp) * cpd !> specific heat capacity of liquid water REAL(wp), PARAMETER :: cv_v = (rcpv + 1.0_wp) * cpd - rv ! - REAL(wp), PARAMETER :: O_m_rdv = 1._wp-rd/rv !> [ ] + REAL(wp), PARAMETER :: o_m_rdv = 1._wp-rd/rv !> [ ] + !$ACC DECLARE COPYIN(o_m_rdv) REAL(wp), PARAMETER :: rd_o_cpd = rd/cpd !! [ ] + !$ACC DECLARE COPYIN(rd_o_cpd) REAL(wp), PARAMETER :: cvd_o_rd = cvd/rd !! [ ] ! REAL(wp), PARAMETER :: p0ref = 100000.0_wp !> [Pa] reference pressure for Exner function - !> Auxiliary constants used in ECHAM - ! Constants used for computation of saturation mixing ratio - ! over liquid water (*c_les*) or ice(*c_ies*) - REAL(wp), PARAMETER :: c1es = 610.78_wp ! - REAL(wp), PARAMETER :: c2es = c1es*rd/rv ! - REAL(wp), PARAMETER :: c3les = 17.269_wp ! - REAL(wp), PARAMETER :: c3ies = 21.875_wp ! - REAL(wp), PARAMETER :: c4les = 35.86_wp ! - REAL(wp), PARAMETER :: c4ies = 7.66_wp ! - ! + !> Variables for computing cloud cover in RH scheme REAL(wp), PARAMETER :: uc1 = 0.8_wp REAL(wp), PARAMETER :: ucl = 1.00_wp - ! - !> vertical profile parameters (vpp) of CH4 and N2O - REAL(wp), PARAMETER :: vpp_ch4(3) = (/1.25e-01_wp, 683.0_wp, -1.43_wp/) - REAL(wp), PARAMETER :: vpp_n2o(3) = (/1.20e-02_wp, 1395.0_wp, -1.43_wp/) - ! + + !> U.S. standard atmosphere vertical tropospheric temperature gradient + REAL(wp), PARAMETER :: dtdz_standardatm = -6.5e-3_wp ! [ K/m ] + !> constants for radiation module REAL(wp), PARAMETER :: zemiss_def = 0.996_wp !> lw sfc default emissivity factor - ! - !--------------------------- - ! Specifications, thresholds, and derived constants for the following subroutines: - ! s_lake, s_licetemp, s_sicetemp, meltpond, meltpond_ice, update_albedo_ice_meltpond - ! - REAL(wp), PARAMETER :: dmix = 10.0_wp ! mixed-layer depth of lakes in m - !REAL(wp), PARAMETER :: dmixsea = 50.0_wp ! mixed-layer depth of ocean in m - ! read from namelist runctl as rmlo_depth, is saved in mo_control - REAL(wp), PARAMETER :: dice = 0.05_wp ! minimum ice thickness in m - REAL(wp), PARAMETER :: dicepond = 0.01_wp ! minimum ice thickness of pond ice in m - REAL(wp), PARAMETER :: dicelim = 0.10_wp ! threshold ice thickness for pond closing in m - REAL(wp), PARAMETER :: dpondmin = 0.01_wp ! minimum pond depth for pond fraction in m - REAL(wp), PARAMETER :: albpondi = 0.30_wp ! albedo of pond ice - ! - REAL(wp), PARAMETER :: snicecond = alice/alsno * rhoh2o/rhosno - REAL(wp), PARAMETER :: hcapmix = rhoh2o*cpliq*dmix ! heat capacity of lake mixed layer - ! ! in J/K/m2 - REAL(wp), PARAMETER :: hcapice = rhoice*cpice*dice ! heat capacity of upper ice layer - REAL(wp), PARAMETER :: hcapicep = rhoice*cpice*dicepond ! heat capacity of upper pond ice layer - ! - REAL(wp), PARAMETER :: rhoilf = rhoice*alf ! [J/m3] - REAL(wp), PARAMETER :: rhowlf = rhoh2o*alf ! [J/m3] - REAL(wp), PARAMETER :: hcaprilf = hcapmix/rhoilf ! [m/K] - REAL(wp), PARAMETER :: rilfhcap = rhoilf/hcapmix ! [K/m] - REAL(wp), PARAMETER :: tfreez = dice*rilfhcap ! cooling below tmelt required to form dice - !--------------------------- - ! - !------------below are parameters for ocean model--------------- + + !> salinity factor for reduced saturation vapor pressure over oceans + REAL(wp), PARAMETER :: salinity_fac = 0.981_wp + + !> dielectric constants at reference temperature 0 degree Celsius for radar reflectivity calculation: + REAL(wp), PARAMETER :: K_w_0 = 0.93_wp + REAL(wp), PARAMETER :: K_i_0 = 0.176_wp + +!------------below are parameters for ocean model--------------- ! coefficients in linear EOS - REAL(wp), PARAMETER :: a_T = 2.55E-04_wp ! thermal expansion coefficient (kg/m3/K) - REAL(wp), PARAMETER :: b_S = 7.64E-01_wp ! haline contraction coefficient (kg/m3/psu) - ! + REAL(wp), PARAMETER :: a_T = 2.55E-04_wp, & ! thermal expansion coefficient (kg/m3/K) + & b_S = 7.64E-01_wp ! haline contraction coefficient (kg/m3/psu) + ! density reference values, to be constant in Boussinesq ocean models REAL(wp), PARAMETER :: rho_ref = 1025.022_wp ! reference density [kg/m^3] REAL(wp), PARAMETER :: rho_inv = 0.0009755881663_wp ! inverse reference density [m^3/kg] REAL(wp), PARAMETER :: sal_ref = 35.0_wp ! reference salinity [psu] - ! + REAL(wp), PARAMETER :: SItodBar = 1.0e-4_wp !Conversion from pressure [p] to pressure [bar] - ! !used in ocean thermodynamics - REAL(wp), PARAMETER :: sfc_press_pascal = 101300.0_wp - REAL(wp), PARAMETER :: sfc_press_bar = 101300.0_wp*SItodBar - ! + !used in ocean thermodynamics + REAL(wp),PARAMETER :: sfc_press_pascal = 101300.0_wp + REAL(wp),PARAMETER :: sfc_press_bar = 101300.0_wp*SItodBar + REAL(wp), PARAMETER :: p0sl_bg = 101325._wp ! [Pa] sea level pressure + +!----------below are parameters for sea-ice and lake model--------------- + REAL(wp), PARAMETER :: & + ks = 0.31_wp, & ! heat conductivity snow [J / (m s K)] + ki = 2.1656_wp, & ! heat conductivity ice [J / (m s K)] + rhoi = 917.0_wp, & ! density of sea ice [kg / m**3] + rhos = 300.0_wp, & ! density of snow [kg / m**3] + ci = 2106.0_wp, & ! Heat capacity of ice [J / (kg K)] + cs = 2090._wp, &! Heat capacity of snow [J / (kg K)] + + Tf = -1.80_wp, & ! Temperature ice bottom [C] + mu = 0.054_wp, & ! Constant in linear freezing- + ! point relationship [C/ppt] + ! (aka melting) temperature) [C] +! muS = -(-0.0575 + 1.710523E-3*Sqrt(Sice) - 2.154996E-4*Sice) * Sice + albedoW = 0.07_wp, & ! albedo of the ocean used in atmosphere + + + fr_fac = 1.1925_wp, & ! Frank Roeske energy budget closing factor for OMIP +! fr_fac = 1.0_wp, ! factor not active + +! CCSM3 albedo scheme - not used for coupling + alb_ice_vis = 0.73_wp, & ! Albedo of dry ice (visible) + alb_ice_nir = 0.33_wp, & ! Albedo of dry ice (near-infrared) + alb_sno_vis = 0.96_wp, & ! Albedo of dry snow (visible) + alb_sno_nir = 0.68_wp, & ! Albedo of dry snow (near-infrared) + !I_0 = 0.3 ! Ice-surface penetrating shortwave fraction + I_0 = 0.17_wp ! Ice-surface penetrating shortwave fraction + +!--------- parameters for NWP sea-ice model (we should agree on a single value)----- +!_cdm> +! The value of the salt-water freezing point is the same as in GME and COSMO (-1.7 dgr C). +! Note that a different value (Tf=-1.8 dgr C) is defined in "mo_physical_constants". +!_cdm< + REAL (wp), PARAMETER :: & + & tf_salt = 271.45_wp !< salt-water freezing point [K] + !< (note that it differs from Tf) + + ! Length of day in seconds, as integer and real ! - !----------below are parameters for sea-ice model--------------- - REAL(wp), PARAMETER :: ks = 0.31_wp ! heat conductivity snow [J / (m s K)] - REAL(wp), PARAMETER :: ki = 2.03_wp ! heat conductivity ice [J / (m s K)] - REAL(wp), PARAMETER :: rhoi = 910.0_wp ! density of sea ice [kg / m3] - REAL(wp), PARAMETER :: rhos = 330.0_wp ! density of snow [kg / m3] - REAL(wp), PARAMETER :: ci = 2100.0_wp ! Heat capacity of ice [J / (kg K)] - REAL(wp), PARAMETER :: Tf = -1.80_wp ! Temperature ice bottom [C] - REAL(wp), PARAMETER :: Sice = 5.0_wp ! Sea-ice bulk salinity [ppt] - REAL(wp), PARAMETER :: mu = 0.054_wp ! Constant in linear freezing- - ! ! point relationship [C/ppt] - REAL(wp), PARAMETER :: muS = mu*Sice ! = - (sea-ice liquidus - ! ! (aka melting) temperature) [C] - !REAL(wp), PARAMETER :: muS = -(-0.0575 + 1.710523E-3*Sqrt(Sice) - 2.154996E-4*Sice) * Sice - REAL(wp), PARAMETER :: albs = 0.75_wp ! Albedo of snow (not melting) - REAL(wp), PARAMETER :: albsm = 0.65_wp ! Albedo of snow (melting) - REAL(wp), PARAMETER :: albi = 0.66_wp ! Albedo of ice (not melting) - REAL(wp), PARAMETER :: albim = 0.64_wp ! Albedo of ice (melting) - REAL(wp), PARAMETER :: albedoW = 0.1_wp ! albedo of the ocean - !REAL(wp), PARAMETER :: I_0 = 0.3 ! Ice-surface penetrating shortwave fraction - REAL(wp), PARAMETER :: I_0 = 0.0_wp ! Ice-surface penetrating shortwave fraction - !------------------------------------------------------------ + INTEGER, PARAMETER :: idaylen=86400 ! [s] + REAL(wp), PARAMETER :: rdaylen=86400._wp ! [s] END MODULE mo_physical_constants diff --git a/ifs-source/arpifs/m7/module/mo_radiation_parameters.F90 b/ifs-source/arpifs/m7/module/mo_radiation_parameters.F90 index c9c39b69..b9eebcb9 100644 --- a/ifs-source/arpifs/m7/module/mo_radiation_parameters.F90 +++ b/ifs-source/arpifs/m7/module/mo_radiation_parameters.F90 @@ -1,251 +1,16 @@ -!> -!! @par Copyright -!! This code is subject to the MPI-M-Software - License - Agreement in it's most recent form. -!! Please see URL http://www.mpimet.mpg.de/en/science/models/model-distribution.html and the -!! file COPYING in the root of the source tree for this code. -!! Where software is supplied by third parties, it is indicated in the headers of the routines. -!! -!++mgs: new module 14.03.2010 -!++mgs: added decl_sun_cur (for MOZ photolysis) 02.06.2010 -!! @brief Module to provide parameters to radiation routines and avoid circular dependencies. -!! -!! @remarks -!! This module contains the public parameters provided by the radiation module -!! mo_radiation. -!! -!! @author Bjorn Stevens, MPI-M, Hamburg (2009-09-19): -!! -!! Martin Schultz, FZJ, Juelich (2010-04-13): -!! extracted parameters from mo_radiation -!! Dagmar Popke, MPI-M, Hamburg (2013-11-15): -!! Implementation of RCE -!! -!! $ID: n/a$ -!! -!! @par Origin -!! see mo_radiation.f90 -!! -! MODULE mo_radiation_parameters USE mo_kind, ONLY: wp USE mo_math_constants, ONLY: pi - USE mo_control, ONLY: lrce IMPLICIT NONE PRIVATE - PUBLIC :: ldiur, lradforcing - PUBLIC :: lyr_perp, yr_perp, nmonth, isolrad, nb_sw - PUBLIC :: lw_spec_samp, sw_spec_samp, lw_gpts_ts, sw_gpts_ts, rad_perm - PUBLIC :: i_overlap, l_do_sep_clear_sky - PUBLIC :: ih2o, ico2, ich4, io3, io2, in2o, icfc, ighg, iaero, fco2 - PUBLIC :: co2vmr, ch4vmr, o2vmr, n2ovmr, cfcvmr - PUBLIC :: co2mmr, ch4mmr, o2mmr, n2ommr - PUBLIC :: twopi, deg2rad, ch4_v, n2o_v - PUBLIC :: cemiss, diff, rad_undef, solc - PUBLIC :: psct, psctm, ssi_factor, flx_ratio_cur, flx_ratio_rad, decl_sun_cur - PUBLIC :: l_interp_rad_in_time, zepzen - - ! 1.0 NAMELIST global variables and parameters - ! -------------------------------- - LOGICAL :: ldiur = .TRUE. !< diurnal cycle - LOGICAL :: lradforcing(2) = (/.FALSE.,.FALSE./) !< &! switch on/off diagnostic - !of instantaneous aerosol solar (lradforcing(1)) and - !thermal (lradforcing(2)) radiation forcing - LOGICAL :: lyr_perp = .FALSE. !< switch to specify perpetual vsop87 year - INTEGER :: yr_perp = -99999 !< year if (lyr_perp == .TRUE.) - INTEGER :: nmonth = 0 !< 0=annual cycle; 1-12 for perpetual month - ! nmonth currently works for zonal mean ozone and the orbit (year 1987) only - INTEGER :: isolrad = 3 !< mode of solar constant calculation - !< default is rrtm solar constant - INTEGER :: nb_sw !< number of shortwave bands, set in setup - - ! Spectral sampling - INTEGER :: lw_spec_samp = 1, sw_spec_samp = 1 ! 1 is broadband, 2 is MCSI, 3 and up are teams - INTEGER :: lw_gpts_ts = 1, sw_gpts_ts = 1 ! Number of g-points per time step using MCSI - INTEGER :: rad_perm = 0 ! Integer for perturbing random number seeds - ! Radiation driver - LOGICAL :: l_do_sep_clear_sky = .TRUE. ! Compute clear-sky fluxes by removing clouds - INTEGER :: i_overlap = 1 ! 1 = max-ran, 2 = max, 3 = ran - LOGICAL :: l_interp_rad_in_time = .TRUE. - ! - ! --- Switches for radiative agents - ! - INTEGER :: ih2o = 1 !< water vapor, clouds and ice for radiation - INTEGER :: ico2 = 2 !< carbon dioxide - INTEGER :: ich4 = 3 !< methane - INTEGER :: io3 = 3 !< ozone - INTEGER :: io2 = 2 !< molecular oxygen - INTEGER :: in2o = 3 !< nitrous oxide - INTEGER :: icfc = 2 !< cfc11 and cfc12 - INTEGER :: ighg = 0 !< greenhouse gase scenario - INTEGER :: iaero = 2 !< aerosol model - REAL(wp) :: fco2 = 1._wp !< factor for external co2 scenario (ico2=4) - ! - ! --- Default gas volume mixing ratios - 1990 values (CMIP5) - ! - REAL(wp) :: co2vmr = 353.9e-06_wp !< CO2 - REAL(wp) :: ch4vmr = 1693.6e-09_wp !< CH4 - REAL(wp) :: o2vmr = 0.20946_wp !< O2 - REAL(wp) :: n2ovmr = 309.5e-09_wp !< N20 - REAL(wp) :: cfcvmr(2) = (/252.8e-12_wp,466.2e-12_wp/) !< CFC 11 and CFC 12 - ! - ! 2.0 Non NAMELIST global variables and parameters - ! -------------------------------- - REAL(wp), PARAMETER :: twopi = 2.0_wp*pi - REAL(wp), PARAMETER :: deg2rad = pi/180.0_wp - REAL(wp), PARAMETER :: ch4_v(3) = (/1.25e-01_wp, 683.0_wp, -1.43_wp /) - REAL(wp), PARAMETER :: n2o_v(3) = (/1.20e-02_wp, 1395.0_wp, -1.43_wp/) - ! - ! --- radiative transfer parameters - ! - REAL(wp), PARAMETER :: cemiss = 0.996_wp !< LW Emissivity Factor - REAL(wp), PARAMETER :: diff = 1.66_wp !< LW Diffusivity Factor - REAL(wp), PARAMETER :: rad_undef = -999._wp - REAL(wp), PARAMETER :: zepzen = 1.e-10_wp - ! - ! - REAL(wp) :: solc = 1361.371_wp !< default solar constant [W/m2] for - ! AMIP-type CMIP5 simulation - !++hs - REAL(wp) :: psct !< local (orbit relative and possibly - ! time dependent) solar constant - REAL(wp) :: psctm !< orbit and time dependent solar constant for radiation time step - REAL(wp) :: ssi_factor(14) !< fraction of TSI in the 14 RRTM SW bands - !--hs - REAL(wp) :: flx_ratio_cur, flx_ratio_rad - REAL(wp) :: decl_sun_cur !< solar declination at current time step - ! - ! 3.0 Variables computed by routines in mo_radiation (export to submodels) - ! -------------------------------- - ! - REAL(wp) :: co2mmr, ch4mmr, o2mmr, n2ommr ! setup_radiation - - public solar_parameters - -contains - - !--------------------------------------------------------------------------- - !> - !! @brief Scans a block and fills with solar parameters - !! - !! @remarks: This routine calculates the solar zenith angle for each - !! point in a block of data. For simulations with no dirunal cycle - !! the cosine of the zenith angle is set to its average value (assuming - !! negatives to be zero and for a day divided into nds intervals). - !! Additionally a field is set indicating the fraction of the day over - !! which the solar zenith angle is greater than zero. Otherwise the field - !! is set to 1 or 0 depending on whether the zenith angle is greater or - !! less than 1. - ! - SUBROUTINE solar_parameters(decl_sun, dist_sun, time_of_day & - & ,sinlon, sinlat, coslon, coslat & - & ,flx_ratio, cos_mu0, daylght_frc) - - REAL(wp), INTENT(in) :: & - decl_sun, & !< delination of the sun - dist_sun, & !< distance from the sun in astronomical units - time_of_day, & !< time_of_day (in radians) - sinlon(:,:), & !< sines of longitudes - sinlat(:,:), & !< and latitudes - coslon(:,:), & !< cosines of longitudes - coslat(:,:) !< and latitudes - REAL(wp), INTENT(out) :: & - flx_ratio, & !< ratio of actual to average solar constant - cos_mu0(:,:), & !< cos_mu_0, cosine of the solar zenith angle - daylght_frc(:,:) !< daylight fraction (0 or 1) with diurnal cycle - - INTEGER :: i, j - REAL(wp) :: zen1, zen2, zen3, z1, z2, z3, xx - - LOGICAL, SAVE :: initialized = .FALSE. - INTEGER, PARAMETER :: nds = 128 !< number of diurnal samples - REAL (wp), SAVE :: cosrad(nds), sinrad(nds) - REAL (wp) :: xsmpl(nds), xnmbr(nds) - - IF (.NOT.initialized) THEN - DO i = 1, nds - xx = twopi*(i-1.0_wp)/nds - sinrad(i) = SIN(xx) - cosrad(i) = COS(xx) - END DO - initialized = .TRUE. - END IF - flx_ratio = 1.0_wp/dist_sun**2 - zen1 = SIN(decl_sun) - zen2 = COS(decl_sun)*COS(time_of_day) - zen3 = COS(decl_sun)*SIN(time_of_day) + PUBLIC :: iaero, decl_sun_cur - IF (lrce) THEN ! radiation calculation in RCE configuration (same equatorial zenith - ! angle for all gridpoints) - IF (ldiur) THEN ! all grid points have diurnal cycle of equator - cos_mu0(:,:) = -zen2 - daylght_frc(:,:) = 1.0_wp - WHERE (cos_mu0(:,:) < 0.0_wp) - cos_mu0(:,:) = 0.0_wp - daylght_frc(:,:) = 0.0_wp - END WHERE - ELSE - DO j = 1, SIZE(cos_mu0,2) - DO i = 1, SIZE(cos_mu0,1) - - xsmpl(:) = 0.7854_wp ! solar weighted zenith angle of equator - xnmbr(:) = 1.0_wp - WHERE (xsmpl(:) < EPSILON(1.0_wp)) - xsmpl(:) = 0.0_wp - xnmbr(:) = 0.0_wp - END WHERE - - cos_mu0(i,j) = SUM(xsmpl(:)) - daylght_frc(i,j) = SUM(xnmbr(:)) - END DO - END DO - - WHERE (daylght_frc(:,:) > EPSILON(1.0_wp)) - cos_mu0(:,:) = cos_mu0(:,:)/daylght_frc(:,:) - daylght_frc(:,:) = daylght_frc(:,:)/nds - END WHERE - END IF - ELSE ! normal radiation calculation - IF (ldiur) THEN - cos_mu0(:,:) = zen1*sinlat(:,:) & - & -zen2*coslat(:,:)*coslon(:,:) & - & +zen3*coslat(:,:)*sinlon(:,:) - daylght_frc(:,:) = 1.0_wp - WHERE (cos_mu0(:,:) < 0.0_wp) - cos_mu0(:,:) = 0.0_wp - daylght_frc(:,:) = 0.0_wp - END WHERE - ELSE - DO j = 1, SIZE(cos_mu0,2) - DO i = 1, SIZE(cos_mu0,1) - - z1 = zen1*sinlat(i,j) - z2 = -zen2*coslat(i,j) - z3 = zen3*coslat(i,j) - - xsmpl(:) = z1 + z2*cosrad(:) + z3*sinrad(:) - xnmbr(:) = 1.0_wp - WHERE (xsmpl(:) < EPSILON(1.0_wp)) - xsmpl(:) = 0.0_wp - xnmbr(:) = 0.0_wp - END WHERE - - cos_mu0(i,j) = SUM(xsmpl(:)) - daylght_frc(i,j) = SUM(xnmbr(:)) - END DO - END DO - - WHERE (daylght_frc(:,:) > EPSILON(1.0_wp)) - cos_mu0(:,:) = cos_mu0(:,:)/daylght_frc(:,:) - daylght_frc(:,:) = daylght_frc(:,:)/nds - END WHERE - END IF - END IF - - END SUBROUTINE solar_parameters + INTEGER :: iaero = 2 !< aerosol model + REAL(wp) :: decl_sun_cur !< solar declination at current time step END MODULE mo_radiation_parameters diff --git a/ifs-source/arpifs/m7/module/mo_submodel.F90 b/ifs-source/arpifs/m7/module/mo_submodel.F90 index 13e45a5c..9a963d41 100644 --- a/ifs-source/arpifs/m7/module/mo_submodel.F90 +++ b/ifs-source/arpifs/m7/module/mo_submodel.F90 @@ -1,938 +1,12 @@ -!> -!! @par Copyright -!! This code is subject to the MPI-M-Software - License - Agreement in it's most recent form. -!! Please see URL http://www.mpimet.mpg.de/en/science/models/model-distribution.html and the -!! file COPYING in the root of the source tree for this code. -!! Where software is supplied by third parties, it is indicated in the headers of the routines. -!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! This file defines and sets the control flags for the HAM, MOZ and -!! HAMMONIA submodels including the settings that control the HAM and -!! MOZ coupling and the switches for MEGAN, AIRCRAFT (emissions) and -!! LIGHTNING. -!! -!! These switches are controlled by the *submodelctl* namelist. -!! This namelist defines general submodel switches which are needed in -!! the interface layer (*mo_submodel_interface* or other parts of the -!! standard ECHAM code). Also included are switches which define the -!! coupling between various submodels (for example in HAMMOZ, which coupled -!! aerosol and gas-phase chemical processes). Other submodel-specific switches -!! should be defined and maintained in extra namelists which carry the name -!! of the submodel itself (e.g. mozctl or hamctl). -!! -!! Change this file to attach different or additional submodels to ECHAM. -!! -!! -!! @author -!!
    -!!
  1. M. Schultz (FZ-Juelich) -!!
  2. S. Rast (MPI-Met) -!!
  3. K. Zhang (MPI-Met) -!!
-!! -!! $Id: 1423$ -!! -!! @par Revision History -!!
    -!!
  1. M. Schultz (FZ-Juelich) -!! - original idea and code structure (2009-05-xx) -!!
  2. S. Rast (MPI-Met) -!! - original idea and code structure (2009-06-xx) -!!
  3. K. Zhang (MPI-Met) -!! - restucture and new style, implementation in ECHAM6 (2009-07-xx) -!!
  4. L. Kornblueh (MPI-Met) -!! - remove spitfire (2012-02-xx) -!!
-!! -!! @par This module is used by -!! ... -!! -!! @par Notes -!! mgs: new module - contains module variables for submodels and submodel -!! stuff from old mo_tracer -!! linterh2o: info from Hauke: even if linterh2o=true, output of H2O as tracer may differ from -!! ECHAM's sh output. Reason unclear. -!! -!! @par Responsible coder -!! m.schultz@fz-juelich.de -!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - - MODULE mo_submodel - USE mo_tracdef, ONLY: ln ! length of caracter string (module name) - IMPLICIT NONE PRIVATE - PUBLIC :: submlist ! submodel list (formerly in mo_tracdef) - PUBLIC :: t_submlist ! submodel list element data type (formerly in mo_tracdef) - PUBLIC :: nsubm ! number of submodel list entries (formerly in mo_tracdef) - PUBLIC :: new_submodel ! define a new submodel - PUBLIC :: setsubmodel ! read namelist - PUBLIC :: query_submodel ! check if a submodel was defined - PUBLIC :: starttracdef ! flag first tracer index of a submodel - PUBLIC :: endtracdef ! flag last tracer index of a submodel - - PUBLIC :: print_status ! utility routines - PUBLIC :: print_value ! utility routines - - PUBLIC :: lanysubmodel ! general submodel flag for fast testing - PUBLIC :: lchemistry ! general process switches - PUBLIC :: lemissions ! switch for emission diagnostics - PUBLIC :: ldrydep ! switch for dry diagnostics - PUBLIC :: lwetdep ! switch for wet diagnostics - PUBLIC :: lsedimentation ! switch for sedimentation - PUBLIC :: laero_micro ! switch for microphysics - PUBLIC :: lburden ! switch for burden diagnostics - -! central switches for submodels - PUBLIC :: lmethox ! switch for upper atmospheric H2O production from methane - PUBLIC :: lco2 ! switch on/off CO2 transport submodel - PUBLIC :: ltransdiag ! switch for turning on atmospheric energy transport diagnostic - ! submodel switches: - PUBLIC :: lhammoz ! HAMMOZ gas-phase and aerosol chemistry (lmoz+lham) - PUBLIC :: lham ! HAM aerosol module - PUBLIC :: lmoz ! MOZ chemistry module - PUBLIC :: lhammonia ! HAMMOZ with upper atmosphere extensions - PUBLIC :: llght ! (MOZ) lightning module (can run independently) - PUBLIC :: lbioemi_stdalone ! Biogenic emissions as a standalone submodel - PUBLIC :: lxt ! simple tracer module [yet to be completed] - PUBLIC :: losat ! satellite simulator switches - PUBLIC :: loisccp ! ISCCP simulator switches - PUBLIC :: lccnclim ! switch for CCN climatology (as submodel) - PUBLIC :: lflighttrack ! switch for flight-track simulator - - PUBLIC :: lhmzphoto ! HAMMOZ coupling switches - PUBLIC :: lhmzoxi ! - PUBLIC :: lhmzhet ! - PUBLIC :: lhmzhetwet ! - PUBLIC :: lhmzhetdust ! - - PUBLIC :: lchemfeedback ! Switches for chemistry feedbacks on ECHAM physics - PUBLIC :: lchemrad ! - PUBLIC :: linterh2o ! feedback water content from MOZ to ECHAM and vice versa - PUBLIC :: lchemheat ! HAMMONIA coupling switches - PUBLIC :: linteram ! - PUBLIC :: lintercp ! - PUBLIC :: laoa ! age-of-air submodel switch - - PUBLIC :: emi_basepath - PUBLIC :: emi_scenario !sschr See #411 (HAMMOZ) - - PUBLIC :: id_xt - PUBLIC :: id_ham - PUBLIC :: id_bioemi - PUBLIC :: id_moz - PUBLIC :: id_hammonia - PUBLIC :: id_lightning - PUBLIC :: id_isccp - PUBLIC :: id_sat - PUBLIC :: id_hrates - PUBLIC :: id_ccnclim - PUBLIC :: id_flighttrack - PUBLIC :: id_aoa - - ! - ! interfaces - ! - INTERFACE print_value ! report on a parameter value - MODULE PROCEDURE print_lvalue ! logical - MODULE PROCEDURE print_ivalue ! integer - MODULE PROCEDURE print_rvalue ! real - END INTERFACE - ! - ! Type declarations - ! - INTEGER, PARAMETER :: ns = 20 ! max number of submodels - - TYPE t_submlist - CHARACTER(len=ln) :: modulename ! name of sub-model - INTEGER :: idtfirst ! id of first tracer defined for this submodel - INTEGER :: idtlast ! id of last tracer defined for this submodel - END TYPE t_submlist - - - ! - ! module variables - ! - - TYPE(t_submlist) ,SAVE :: submlist (ns) ! submodel list - INTEGER ,SAVE :: nsubm = 0 ! number of submodels defined - -! submodel master switch: default false, set to true if any submodel registers - LOGICAL :: lanysubmodel = .FALSE. - -! general chemical process interface switches for debugging purposes: -! Default is true - will be turned off if no submodel is defined (*mo_submodel_interface*) -! or if switch is turned off in SUBMODELCTL namelist - LOGICAL :: lemissions = .TRUE. - LOGICAL :: lchemistry = .TRUE. - LOGICAL :: ldrydep = .TRUE. - LOGICAL :: lwetdep = .TRUE. - LOGICAL :: lsedimentation = .TRUE. - LOGICAL :: laero_micro = .TRUE. -!!$ LOGICAL :: lburden = .TRUE. ! .true. for burden diagnostics -!!$ ! (defaults to false if neither HAM nor MOZ are active) - LOGICAL :: lburden = .FALSE. ! has to be set by namelist - -! submodel switches (default: all submodels turned off) - LOGICAL :: lxt = .FALSE. ! .true. to activate simple generic tracer submodel - LOGICAL :: lmethox = .FALSE. ! .true. for upper atmospheric H2O production from methane - LOGICAL :: lco2 = .FALSE. ! .true. for interactive transport CO2 subm. - LOGICAL :: ltransdiag = .FALSE. ! .true. for atmospheric energy transport diagnostic - LOGICAL :: lhammoz = .FALSE. ! .true. to turn on HAM and MOZ and activate coupling - LOGICAL :: lham = .FALSE. ! .true. for aerosol module HAM + PUBLIC :: id_ham, lham, lmoz + LOGICAL :: lham = .TRUE. ! .true. for aerosol module HAM LOGICAL :: lmoz = .FALSE. ! .true. for gas-phase chemistry module MOZ - LOGICAL :: llght = .FALSE. ! .true. for enabling lightning emissions - LOGICAL :: lbioemi_stdalone = .FALSE. ! .true. for enabling biogenic emissions as - ! a standalone submodel - ! Diagnostics submodel switches - ! Satellite and ISCCP cloud diagnostic processors - LOGICAL :: losat = .FALSE. ! .true. for satellite simulator - LOGICAL :: loisccp = .FALSE. ! .true. for ISCCP diagnostics processor - LOGICAL :: lccnclim = .FALSE. ! .true. for CCN climatology - LOGICAL :: lflighttrack = .FALSE. ! .true. for flight-track simulator - - -! HAMMOZ coupling switches (default: true -- they are automatically turned off if one module is inactive) -! see also Liao et al, JGR, 2005, table 1. - LOGICAL :: lhmzphoto = .TRUE. ! switch HAMMOZ photolysis coupling off - LOGICAL :: lhmzoxi = .TRUE. ! switch HAMMOZ oxidant coupling off - LOGICAL :: lhmzhet = .TRUE. ! switch on/off all the HAMMOZ heterogenous reactions - LOGICAL :: lhmzhetwet = .TRUE. ! switch on/off het. reactions on SU,SS,BC,OC and wet aerosol - LOGICAL :: lhmzhetdust= .TRUE. ! switch on/off het. reactions on mineral dust - -! chemistry feedback switches - LOGICAL :: lchemfeedback = .FALSE. ! combined switch for linterh2o, lchemheat, linteram, lintercp + radiation - LOGICAL :: lchemrad = .FALSE. ! switch chemistry feedback on radiation - LOGICAL :: linterh2o = .FALSE. ! switch return of water vapour from chemistry to ECHAM physics -! HAMMONIA switches - LOGICAL :: lhammonia = .FALSE. ! switch HAMMONIA (not possible in this version) - LOGICAL :: lchemheat = .FALSE. ! switch chemical heating (HAMMONIA only) - LOGICAL :: linteram = .FALSE. ! switch calculation of air mass from chemistry (HAMMONIA only) - LOGICAL :: lintercp = .FALSE. ! switch calculation of cp from chemistry (HAMMONIA only) - LOGICAL :: laoa = .FALSE. ! .true. for enabling age-of-air submodel - - CHARACTER(LEN=256) :: emi_basepath = '' - CHARACTER(LEN=8) :: emi_scenario = '' - -!!mgs&jsr!! questionable if we need these id values. Might be removed later... - INTEGER :: id_methox - INTEGER :: id_co2 - INTEGER :: id_transdiag - INTEGER :: id_xt INTEGER :: id_ham - INTEGER :: id_bioemi - INTEGER :: id_moz - INTEGER :: id_hammonia - INTEGER :: id_lightning - INTEGER :: id_isccp - INTEGER :: id_sat - INTEGER :: id_hrates - INTEGER :: id_ccnclim - INTEGER :: id_flighttrack - - INTEGER :: id_aoa - - CONTAINS - - - -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!> -!! Check status of a given submodel. Return id of submodel if requested. -!! Function result is logical value indicating proper initialisation. -!! -!! @author see above -!! -!! $Id: 1423$ -!! -!! @par Revision History -!! see above -!! -!! @par This subroutine is called by -!! init_subm -!! -!! @par Externals -!! -!! @par Notes -!! not yet used -!! -!! @par Responsible coder -!! M.Schultz@fz-juelich.de -!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - - - LOGICAL FUNCTION query_submodel (modulename, id) - - - USE mo_util_string, ONLY : toupper - - CHARACTER(len=*) ,INTENT(in) :: modulename ! name of submodel - INTEGER ,INTENT(out) ,OPTIONAL :: id ! index of submodel, 0 if undefined - - !-- local variables -- - - INTEGER :: i - - IF (PRESENT(id)) id = 0 - - query_submodel = .false. - DO i=1, nsubm - IF (submlist(i)% modulename == toupper(modulename)) THEN - query_submodel = .true. - RETURN - END IF - END DO - - END FUNCTION query_submodel - - -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!> -!! Request a new submodel with name 'name'. -!! Name is always stored in uppercase characters -!! -!! @author see above -!! -!! $Id: 1423$ -!! -!! @par Revision History -!! see above -!! -!! @par This subroutine is called by -!! setsubmodel -!! -!! @par Externals -!! -!! @par Notes -!! -!! @par Responsible coder -!! M.Schultz@fz-juelich.de -!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - - - SUBROUTINE new_submodel(name,id) - - USE mo_util_string, ONLY: toupper - USE mo_exception, ONLY: message_text, finish - - CHARACTER (len=*) ,INTENT(in) :: name - INTEGER ,INTENT(out) ,OPTIONAL :: id ! index of submodel, 0 if undefined - - IF (PRESENT(id)) id = 0 - nsubm = nsubm + 1 - IF (nsubm > ns) THEN - WRITE(message_text,*) 'Submodel list full. ns = ', ns - CALL finish ('new_submodel', message_text) - END IF - IF (PRESENT(id)) id = nsubm - submlist (nsubm)% modulename = toupper(name) - lanysubmodel = .true. - - END SUBROUTINE new_submodel - - - -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!> -!! It reads the submodel.ctl namelist to set the submodel control switches. -!! -!! @author see above -!! -!! $Id: 1423$ -!! -!! @par Revision History -!! see above -!! -!! @par This subroutine is called by -!! initialize -!! -!! @par Externals: -!! -!! @par Notes -!! -!! @par Responsible coder -!! M.Schultz@fz-juelich.de -!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - - - SUBROUTINE setsubmodel - - -#ifdef HAMMOZ - USE mo_mpi, ONLY: p_io, p_parallel, p_parallel_io, p_bcast -#endif - USE mo_exception, ONLY: message, finish, em_info, em_param, & - message_text, em_warn, em_error - USE mo_namelist, ONLY: open_nml, position_nml, POSITIONED - USE mo_util_string, ONLY: separator ! format string (----) -#ifdef HAMMOZ - USE mo_advection, ONLY: iadvec, & - no_advection, & ! for diagnostic printout - semi_lagrangian, & - tpcore -#endif -! local variables - - INTEGER :: i, inml, iunit, ierr - - -! This namelist defines general submodel switches which are needed in the interface -! layer (*mo_submodel_interface* or other parts of the standard ECHAM code). Also -! included are switches which define the coupling between various submodels (for -! example in HAMMOZ, which coupled aerosol and gas-phase chemical processes). Other -! submodel-specific switches should be defined and maintained in extra namelists -! which carry the name of the submodel itself (e.g. mozctl or hamctl). -! -! ------------------------------------------------------------------ -NAMELIST /submodelctl/ & - lxt, & ! switch generic test tracer submodule on/off - lmethox, & ! switch for upper atmospheric H2O production from methane - ltransdiag, & ! switch to turn on atmospheric energy transport diagnostics - lco2, & ! switch for CO2 submodel (JSBACH related) - lham, & ! switch HAM aerosol module on/off - lmoz, & ! switch MOZART on/off - lhammoz, & ! switch HAM and MOZ on/off together with the coupling between the two - ! note: lhammoz overrides lham and lmoz - lhammonia, & ! switch HAMMONIA on/off - llght, & ! switch lightning emissions on/off - lbioemi_stdalone, & ! switch biogenic emissions model as a standalone submodel - ! (ie not embedded in HAM or MOZ) on/off - losat, & ! satellite simulator on/off - loisccp, & ! isccp diagnostics on/off - lhmzphoto, & ! hammoz photolysis frequency coupling on/off - lhmzoxi, & ! hammoz coupling of oxidant fields on/off - lhmzhet, & ! hammoz heterogeneous chemistry coupling on/off - lchemfeedback, & ! combi-switch for interactive chemistry: - ! for moz: lchemrad and linterh2o = true - ! for hammonia: as above plus lchemheat, atmospheric mass and cp - lchemrad, & ! chemistry interacts with radiation on/off - linterh2o, & ! feedback water content from MOZ to ECHAM and vice versa - lchemheat, & ! chemical heating on/off - lccnclim, & ! activate CCN climatology as submodel - lflighttrack, & ! flight-track simulator - linteram, & ! hammonia air mass from chemistry on/off - lintercp, & ! hammonia specific heat from chemistry on/off - lemissions, & ! switch emissions on/off - lchemistry, & ! switch chemistry calculations on/off - ldrydep, & ! switch dry deposition on/off - lwetdep, & ! switch wet deposition on/off - lsedimentation, & ! switch sedimentation on/off - laero_micro, & ! switch aerosol microphysical processes on/off - lburden, & ! activate burden (column integral) diagnostics for mass mixing ratio tracers - emi_basepath, & ! path to emission files specified in emi_spec.txt - emi_scenario, & ! RCP (Representative Concentration Pathway) to be modelled - laoa ! age-of-air tracer submodel -! ------------------------------------------------------------------ - - - !INCLUDE 'submodelctl.inc' - - - CALL message('', ' ') - CALL message('', '|') - CALL message('', '| setsubmodel ') - CALL message('', '|') - CALL message('', ' ') - - ! initialize submodel list - - submlist (:)% modulename = '' - submlist (:)% idtfirst = 0 - submlist (:)% idtlast = 0 - -#ifdef HAMMOZ - IF (p_parallel_io) THEN -#endif - - ! read namelist - - inml = open_nml('namelist.echam') - iunit = position_nml ('SUBMODELCTL', inml, status=ierr) - - SELECT CASE (ierr) - CASE (POSITIONED) - READ (iunit, submodelctl) - END SELECT - - ! evaluate HAMMONIA switch: exit model if activated. This code does not run HAMMONIA - - IF ( lhammonia ) THEN - CALL finish('setsubmodel', & - 'LHAMMONIA=.true. --> Abort program execution. This code version ' // & - 'does not contain HAMMONIA routines.') - END IF - - ! overwrite HAMMONIA flags for safety - - lchemheat = .false. - linteram = .false. - lintercp = .false. - -#ifdef HAMMOZ - ENDIF -#endif - -#ifdef HAMMOZ - IF (p_parallel) THEN - - ! submodel switches - CALL p_bcast (lmethox, p_io) - CALL p_bcast (lco2, p_io) - CALL p_bcast (ltransdiag, p_io) - CALL p_bcast (lxt, p_io) - CALL p_bcast (lham, p_io) - CALL p_bcast (lmoz, p_io) - CALL p_bcast (lhammoz, p_io) - CALL p_bcast (lhammonia, p_io) - CALL p_bcast (llght, p_io) - CALL p_bcast (lbioemi_stdalone, p_io) - CALL p_bcast (losat, p_io) - CALL p_bcast (loisccp, p_io) - CALL p_bcast (lccnclim, p_io) - CALL p_bcast (lflighttrack, p_io) - - ! generic process switches - CALL p_bcast (lchemistry, p_io) - CALL p_bcast (ldrydep, p_io) - CALL p_bcast (lwetdep, p_io) - CALL p_bcast (lemissions, p_io) - CALL p_bcast (lsedimentation, p_io) - CALL p_bcast (laero_micro, p_io) - - ! coupling and diagnostic switches - CALL p_bcast (lhmzphoto, p_io) - CALL p_bcast (lhmzoxi, p_io) - CALL p_bcast (lhmzhet, p_io) - CALL p_bcast (lchemfeedback, p_io) - CALL p_bcast (lchemrad, p_io) - CALL p_bcast (linterh2o, p_io) - CALL p_bcast (lchemheat, p_io) - CALL p_bcast (linteram, p_io) - CALL p_bcast (lintercp, p_io) - CALL p_bcast (lburden, p_io) - - CALL p_bcast (emi_basepath, p_io) - CALL p_bcast (emi_scenario, p_io) - - ! age-of-air tracer switch - CALL p_bcast (laoa, p_io) - - END IF -#endif - -!sschr: this is the right place for the following commands! - - ! evaluate HAMMOZ switches - ! hammoz always means moz and ham are on. By default all hammoz couplings are also on, - ! but you can switch them off in the namelist. The coupling is always off if lhammoz is not - ! set. - - IF ( lhammoz ) THEN - lham = .true. - lmoz = .true. - ELSE - lhmzphoto = .false. - lhmzoxi = .false. - lhmzhet = .false. - END IF - - ! set individual switches if lchemfeedback is true - IF ( lchemfeedback .AND. lmoz ) THEN - lchemrad = .TRUE. - linterh2o = .TRUE. - IF ( lhammonia ) THEN - lchemheat = .TRUE. - linteram = .TRUE. - lintercp = .TRUE. - ENDIF - ENDIF - - ! global flag for burden diagnostics - -!!$ IF (.NOT. lmoz .AND. .NOT. lham) THEN -!!$ lburden = .false. -!!$ END IF - - ! make sure that chemheat, linteram and lintercp are only set if HAMMONIA is active - IF ( .NOT. lhammonia ) THEN - IF ( lchemheat ) CALL message('setsubmodel', & - 'Switching off lchemheat now, because LHAMMONIA = false.', & - level=em_warn) - IF ( linteram ) CALL message('setsubmodel', & - 'Switching off linteram now, because LHAMMONIA = false.', & - level=em_warn) - IF ( lintercp ) CALL message('setsubmodel', & - 'Switching off lintercp now, because LHAMMONIA = false.', & - level=em_warn) - ENDIF - - ! evaluate MOZ and chemistry switches - - IF ( .NOT. lmoz .OR. .NOT. lchemistry ) THEN - IF ( lchemfeedback ) CALL message('setsubmodel', & - 'Switching off lchemfeedback now, because LMOZ = false. or lchemistry = .false.', & - level=em_warn) - IF ( lchemrad ) CALL message('setsubmodel', & - 'Switching off lchemrad now, because LMOZ = false. or lchemistry = .false.', & - level=em_warn) - IF ( linterh2o ) CALL message('setsubmodel', & - 'Switching off linterh2o now, because LMOZ = false. or lchemistry = .false.', & - level=em_warn) - IF ( lchemheat ) CALL message('setsubmodel', & - 'Switching off lchemheat now, because LMOZ = false. or lchemistry = .false.', & - level=em_warn) - IF ( linteram ) CALL message('setsubmodel', & - 'Switching off linteram now, because LMOZ = false. or lchemistry = .false.', & - level=em_warn) - IF ( lintercp ) CALL message('setsubmodel', & - 'Switching off lintercp now, because LMOZ = false. or lchemistry = .false.', & - level=em_warn) - lchemfeedback = .false. - lchemrad = .false. - linterh2o = .false. - lchemheat = .false. - linteram = .false. - lintercp = .false. - END IF - - ! make sure that ECHAM methox is not called if MOZART is active and linterh2o=true - - IF ( linterh2o .AND. lmethox ) THEN - CALL message('setsubmodel', & - 'Switching off lmethox, because stratospheric H2O is handled by MOZ and linterh2o=true.', & - level=em_warn) - lmethox = .FALSE. - ENDIF - - ! evaluate CCNCLIM and HAM switches - - IF ( lccnclim .AND. lham ) THEN - CALL message('setsubmodel', 'De-activating CCNCLIM, because LHAM=.TRUE.', level=em_warn) - lccnclim = .false. - END IF - - ! force chemical water vapour if radiative feedback is activated (???) !!baustelle!! -!!IF ( linterchem ) THEN -!! linterh2o = .true. -!!END IF - - ! individual het coupling processes - ! presently these are not independently controlled by namelist switches - - IF ( lhmzhet ) THEN - lhmzhetwet = .true. - lhmzhetdust = .true. - ELSE - lhmzhetwet = .false. - lhmzhetdust = .false. - END IF - -!!++mgs: potentially need to turn off lhmz switches if lchemistry=false... - - ! turn general chemistry process switches off if no submodel has been activated -!++mgs - IF (.NOT. (lham .OR. lmoz .OR. llght .OR. lbioemi_stdalone .OR. lco2) ) THEN -!--mgs - lchemistry = .FALSE. - lemissions = .FALSE. - ldrydep = .FALSE. - lwetdep = .FALSE. - lsedimentation = .FALSE. - laero_micro = .FALSE. - CALL message('setsubmodel', & - 'This run is without any chemical processes (lchemistry=F, lemissions=F'// & - ', ldrydep=F, lwetdep=F, lsedimentation=F, laero_micro=F)', level=em_info ) - END IF - -!>>SF check for biogenic emissions inconsistency: -! Biogenic emissions can be both handled by the standalone submodel and by -! HAM or MOZ at the same time - IF ((lham .OR. lmoz) .AND. lbioemi_stdalone) THEN - CALL message('setsubmodel', & - 'Biogenic emissions cannot be run as standalone if HAM or MOZ are active! '// & - 'Try and turn off lbioemi_stdalone or lham and/or lmoz', level=em_error) - ENDIF -!< 0 ) THEN - WRITE (message_text,*) nsubm, ' submodels registered:', & - (' '//TRIM(submlist(i)%modulename),i=1,nsubm) - ELSE - WRITE (message_text,*) 'No submodels registered (=> lanysubmodel = .false.)' - END IF - CALL message('', message_text, level=em_param) - CALL message('', 'Submodel switches processed.', level=em_param) - CALL print_status('METHOX module', lmethox) - CALL print_status('TRANSDIAG module', ltransdiag) - CALL print_status('HAM aerosol module', lham) - CALL print_status('MOZ chemistry module', lmoz) - - IF ( lham .AND. lmoz ) THEN - CALL print_status('HAMMOZ photolysis coupling', lhmzphoto) - CALL print_status('HAMMOZ oxidant coupling', lhmzoxi) - CALL print_status('HAMMOZ het. chemistry coupling', lhmzhet) - END IF - - IF ( lmoz ) THEN - CALL print_status('Chemistry feedback on radiation', lchemrad) - CALL print_status('Use of water vapour from chemistry', linterh2o) - IF (lhammonia) THEN - CALL print_status('Chemical heating', lchemheat) - CALL print_status('Use of air mass from chemistry', linteram) - CALL print_status('Use of specific heat from chemistry', lintercp) - END IF - CALL print_status('Lightning NOx emissions', llght) - END IF - - IF ( lbioemi_stdalone ) & - CALL print_status('Biogenic NMVOC emissions as standalone submodel', lbioemi_stdalone) - CALL print_status('Satellite processor diagnostics', losat) - CALL print_status('ISCCP cloud diagnostics', loisccp) - CALL print_status('Burden diagnostics', lburden) - CALL print_status('CCN climatology', lccnclim) - CALL print_status('Flight-track simulator', lflighttrack) - - SELECT CASE ( iadvec ) - CASE (no_advection) - CALL message('', 'Run without tracer advection!', level=em_warn) - CASE (semi_lagrangian) - CALL message('', 'Run with semi-lagrangian tracer advection! (are you sure?)', & - level=em_warn) - CASE (tpcore) - CALL message('', 'Run with Lin&Rood (tpcore) tracer advection.', level=em_param) - END SELECT - -!++mgs - IF (lham .OR. lmoz .OR. llght .OR. lbioemi_stdalone .OR. lco2) THEN -!--mgs - IF ( .NOT. lchemistry ) CALL message('', 'Run with lchemistry = false !', level=em_warn) - IF ( .NOT. lemissions ) CALL message('', 'Run with lemissions = false !', level=em_warn) - IF ( .NOT. ldrydep ) CALL message('', 'Run with ldrydep = false !', level=em_warn) - IF ( .NOT. lwetdep ) CALL message('', 'Run with lwetdep = false !', level=em_warn) - IF ( .NOT. lsedimentation ) CALL message('', 'Run with lsedimentation = false !', level=em_warn) - IF ( .NOT. laero_micro ) CALL message('', 'Run with laero_micro = false !', level=em_warn) - END IF - IF (lmoz .AND. .NOT. llght) THEN - CALL message('', 'Run with MOZ chemistry but without lightning NO!', level=em_warn) - END IF - - CALL print_status('Age-of-air submodel', laoa) - - CALL message('', separator) - - END IF -#endif - -END SUBROUTINE setsubmodel - -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!> -!! Flag first tracer defined in a given submodel. -!! -!! @author see above -!! -!! $Id: 1423$ -!! -!! @par Revision History -!! see above -!! -!! @par This subroutine is called by -!! init_subm -!! -!! @par Externals -!! -!! @par Notes -!! not yet used -!! -!! @par Responsible coder -!! M.Schultz@fz-juelich.de -!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - - SUBROUTINE starttracdef (idm) - ! helper routine to manage tracer ids in submodel list - USE mo_tracdef, ONLY: ntrac - INTEGER, INTENT(in) :: idm - - submlist (idm) % idtfirst = ntrac+1 - END SUBROUTINE starttracdef - - -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!> -!! Flag last tracer defined in a given submodel. -!! -!! @author see above -!! -!! $Id: 1423$ -!! -!! @par Revision History -!! see above -!! -!! @par This subroutine is called by -!! init_subm -!! -!! @par Externals -!! -!! @par Notes -!! not yet used -!! -!! @par Responsible coder -!! M.Schultz@fz-juelich.de -!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - - SUBROUTINE endtracdef (idm) - ! helper routine to manage tracer ids in submodel list - USE mo_tracdef, ONLY: ntrac - USE mo_exception, ONLY: message, message_text, em_info, em_error - - INTEGER, INTENT(in) :: idm - - submlist (idm) % idtlast = ntrac - - IF (submlist (idm) % idtfirst > submlist (idm) % idtlast ) THEN - CALL message('init_subm','No tracers defined for submodel '//submlist (idm) % modulename, & - level=em_error) - ELSE - WRITE (message_text,*) submlist (idm) % idtlast - submlist (idm) % idtfirst + 1, & - ' tracers defined for submodel '//submlist (idm) % modulename - CALL message('init_subm', message_text, level=em_info) - END IF - - END SUBROUTINE endtracdef - - - -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!> -!! Print status of a submodel or parameterisation (active or not active). -!! -!! @author see above -!! -!! $Id: 1423$ -!! -!! @par Revision History -!! see above -!! -!! @par This subroutine is called by -!! setsubmodel -!! -!! @par Externals -!! -!! @par Notes -!! not yet used -!! -!! @par Responsible coder -!! M.Schultz@fz-juelich.de -!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -SUBROUTINE print_status (mstring, flag) - - USE mo_exception, ONLY: message, message_text, em_param - - IMPLICIT NONE - - CHARACTER(len=*), intent(in) :: mstring - LOGICAL, intent(in) :: flag - - IF ( flag ) THEN - write(message_text,'(a60,1x,":",a)') mstring,'active' - ELSE - write(message_text,'(a60,1x,":",a)') mstring,'*not* active' - END IF - CALL message('', message_text, level=em_param) - -END SUBROUTINE print_status - - - -SUBROUTINE print_lvalue (mstring, lvalue) - -!------------------------------------------------------------------------------ -! Report the value of a logical, integer or real variable -! Convenience routine interfaced by print_value(mstring, value) - - USE mo_exception, ONLY: message, message_text, em_param - - IMPLICIT NONE - - CHARACTER(len=*), intent(in) :: mstring - LOGICAL, intent(in) :: lvalue - - IF (lvalue) THEN - write(message_text,'(a60,1x,": ",a)') mstring,'TRUE' - ELSE - write(message_text,'(a60,1x,": ",a)') mstring,'FALSE' - END IF - CALL message('', message_text, level=em_param) - -END SUBROUTINE print_lvalue - - - -SUBROUTINE print_ivalue (mstring, ivalue) - - USE mo_exception, ONLY: message, message_text, em_param - - IMPLICIT NONE - - CHARACTER(len=*), intent(in) :: mstring - INTEGER, intent(in) :: ivalue - - write(message_text,'(a60,1x,":",i10)') mstring, ivalue - CALL message('', message_text, level=em_param) - -END SUBROUTINE print_ivalue - - - -SUBROUTINE print_rvalue (mstring, rvalue) - - USE mo_kind, ONLY: wp - USE mo_exception, ONLY: message, message_text, em_param - - IMPLICIT NONE - - CHARACTER(len=*), intent(in) :: mstring - REAL(wp), intent(in) :: rvalue - - write(message_text,'(a60,1x,":",g12.5)') mstring, rvalue - CALL message('', message_text, level=em_param) - -END SUBROUTINE print_rvalue - - END MODULE mo_submodel diff --git a/ifs-source/arpifs/m7/module/mo_tracdef.F90 b/ifs-source/arpifs/m7/module/mo_tracdef.F90 index bf3b5418..895b096c 100644 --- a/ifs-source/arpifs/m7/module/mo_tracdef.F90 +++ b/ifs-source/arpifs/m7/module/mo_tracdef.F90 @@ -1,75 +1,14 @@ -!> -!! @par Copyright -!! This code is subject to the MPI-M-Software - License - Agreement in it's most recent form. -!! Please see URL http://www.mpimet.mpg.de/en/science/models/model-distribution.html and the -!! file COPYING in the root of the source tree for this code. -!! Where software is supplied by third parties, it is indicated in the headers of the routines. -!! -!! -------------------------------------------------------------------------------------------------- -!!mgs : henry and dryreac removed from trlist (see speclist!) -!!mgs : Cleanups ToDo: -!! -- ndrydep, nwetdep, n... : consistent scheme with -1 = interactive (choice in submodelctl) -!! 0 = OFF -!! 1 = prescribed (boundary condition) -!! -------------------------------------------------------------------------------------------------- - -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!> -!! Definition of tracer information data type and variable -!! -!! -!! @author -!!
    -!!
  1. ECHAM5 developers -!!
  2. M. Schultz (FZ-Juelich) -!!
  3. S. Rast (MPI-Met) -!!
  4. K. Zhang(MPI-Met) -!!
-!! -!! $Id: 1423$ -!! -!! @par Revision History -!!
    -!!
  1. ECHAM5 developers - (before 2009) -!!
  2. M. Schultz (FZ-Juelich), S. Rast (MPI-Met) - new tracer defination - (2009-05-xx) -!!
  3. K. Zhang (MPI-Met) - implementation in ECHAM6 and doxygen support - (2009-07-20) -!!
-!! -!! @par This module is used by -!! to_be_added -!! -!! @par Notes -!! -!! -!! @par Current responsible coder -!! kai.zhang@zmaw.de -!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - MODULE mo_tracdef USE mo_kind, ONLY: dp -#ifdef HAMMOZ - USE mo_advection, ONLY: NO_ADVECTION, &! choice of advection scheme - SEMI_LAGRANGIAN,&! (copied for convenience) - TPCORE ! - USE mo_memory_base, ONLY: AUTO ! flag to chose unique GRIB code - USE mo_linked_list, ONLY: memory_info ! I/O meta information data type - USE mo_time_conversion,ONLY: time_days ! date (days,seconds) data type -#endif - + IMPLICIT NONE PRIVATE PUBLIC :: trlist ! tracer info list variable PUBLIC :: t_trlist, t_trinfo, t_flag ! "" type definitions -#ifdef HAMMOZ - PUBLIC :: t_p_mi - PUBLIC :: time_days ! type definition - PUBLIC :: memory_info ! type definition -#endif PUBLIC :: ln, ll, lf, nf ! length of names in trlist PUBLIC :: jptrac ! max. number of tracers @@ -78,7 +17,6 @@ MODULE mo_tracdef ! It's just more convenient. !-- flag values -!!mgs!! PUBLIC :: OK, NAME_USED, NAME_MISS, TABLE_FULL ! error values ! general flag values PUBLIC :: OK PUBLIC :: ON @@ -99,30 +37,14 @@ MODULE mo_tracdef PUBLIC :: AEROSOLNUMBER PUBLIC :: UNDEFINED ! choice of advection scheme 'ntran' -#ifdef HAMMOZ - PUBLIC :: NO_ADVECTION - PUBLIC :: SEMI_LAGRANGIAN - PUBLIC :: TPCORE -#endif ! tracer type 'itrtype' PUBLIC :: ITRNONE PUBLIC :: ITRPRESC PUBLIC :: ITRDIAG PUBLIC :: ITRPROG - ! choose GRIB code automatically -#ifdef HAMMOZ - PUBLIC :: AUTO -#endif - ! - ! Type declarations - ! - - - ! ! Limits - ! - INTEGER, PARAMETER :: jptrac = 500 ! maximum number of tracers allowed - + ! + INTEGER, PARAMETER :: jptrac = 500 ! maximum number of tracers allowed ! ! Individual settings for each tracer ! @@ -187,8 +109,7 @@ MODULE mo_tracdef ! ! Individual settings for each tracer ! Default values are marked with * * - ! - + ! !=============! TYPE t_trinfo !=============! @@ -258,10 +179,6 @@ MODULE mo_tracdef INTEGER :: nsoluble ! soluble flag (default 0) TYPE(t_flag) :: myflag (nf)! user defined flag -#ifdef HAMMOZ - TYPE(time_days) :: tupdatel ! last update time - TYPE(time_days) :: tupdaten ! next update time -#endif ! ! Indicate actions actually performed by ECHAM ! @@ -274,19 +191,9 @@ MODULE mo_tracdef ! used to access the 'restart' flags ! -#ifdef HAMMOZ - !===========! - TYPE t_p_mi ! pointers to memory info type - !===========! - TYPE (memory_info), POINTER :: xt ! tracers ,meta information - TYPE (memory_info), POINTER :: xtm1 ! tracers at t-dt ,meta information - END TYPE t_p_mi -#endif - ! ! Basic data type definition for tracer info list ! - !=============! TYPE t_trlist !=============! @@ -311,14 +218,7 @@ MODULE mo_tracdef ! ! reference to memory buffer info ! -#ifdef HAMMOZ - TYPE (t_p_mi) :: mi (jptrac) ! memory buffer information for each tracer - - TYPE (memory_info), POINTER :: mixt ! memory buffer information for XT - TYPE (memory_info), POINTER :: mixtm1 ! memory buffer information for XTM1 -#endif END TYPE t_trlist - ! ! module variables ! diff --git a/ifs-source/arpifs/m7/module/mo_tracer_processes.F90 b/ifs-source/arpifs/m7/module/mo_tracer_processes.F90 index 8443c307..8f6e03a7 100755 --- a/ifs-source/arpifs/m7/module/mo_tracer_processes.F90 +++ b/ifs-source/arpifs/m7/module/mo_tracer_processes.F90 @@ -1,50 +1,16 @@ -!> -!! @par Copyright -!! This code is subject to the MPI-M-Software - License - Agreement in it's most recent form. -!! Please see URL http://www.mpimet.mpg.de/en/science/models/model-distribution.html and the -!! file COPYING in the root of the source tree for this code. -!! Where software is supplied by third parties, it is indicated in the headers of the routines. -!! +!! SPDX-License-Identifier: BSD-3-Clause +!! Copyright (c) 2021 hammoz, MPI fuer Meteorologie, FZJ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! mo_tracer_processes: collection of generic routines affecting the xt arrays: -!! xt_initialize : intialisation of tracer concentrations -!! xt_burden_init_mem : initialisation of burden diagnostics for tracers -!! xt_burden : burden diagnostics -!! xt_conv_massfix : mass fixer for convective transport (borrowing scheme) -!! xt_borrow : borrowing scheme to prevent negative tracer mass -!! -!! -!! @author -!!
    -!!
  1. ECHAM5 developers -!!
  2. M. Schultz (FZ-Juelich) -!!
-!! -!! $Id: 1423$ -!! -!! @par Responsible coder -!! m.schultzfz-juelich.de -!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - MODULE mo_tracer_processes USE mo_kind, ONLY: wp -#ifdef HAMMOZ - USE mo_filename, ONLY: trac_filetype, find_next_free_unit -#endif IMPLICIT NONE PRIVATE !! Interface routines ! purpose ! called by -#ifdef HAMMOZ - PUBLIC :: xt_initialize ! set initial values ! ioinitial, iorestart (### former xtini) - PUBLIC :: xt_burden_init_mem ! set up burden diagnostics - PUBLIC :: xt_burden ! calculate tracer burdens -#endif PUBLIC :: xt_conv_massfix ! adjust tracer mass in convection PUBLIC :: xt_borrow ! another mass fixer @@ -55,783 +21,6 @@ MODULE mo_tracer_processes !#endif CONTAINS -#ifdef HAMMOZ - SUBROUTINE xt_initialize (xt, xtm1) - - ! Description: - ! - ! Initialize the tracer fields - ! - ! Method: - ! - ! This routine is called from *ioinitial* and from *iorestart*. - ! Tracers not yet initialised are set to constant values. - ! Tracer input from file will be possible in the future. - ! - ! Authors: - ! - ! J. Feichter, MI, August 1991, original source - ! L. Kornblueh, MPI, May 1998, f90 rewrite - ! U. Schulzweida, MPI, May 1998, f90 rewrite - ! A. Rhodin, MPI, rewrite - ! M. Schultz, FZ Juelich - adaptation to ECHAM6 (2009-09-25) - ! - ! for more details see file AUTHORS - ! - - USE mo_mpi, ONLY: p_parallel_io - USE mo_semi_impl, ONLY: eps - USE mo_exception, ONLY: finish, & - message, & - message_text - USE mo_util_string, ONLY: separator ! format string (----) - USE mo_tracdef, ONLY: trlist, & ! tracer info variable -!!mgs!! ln, ll, nf, & ! len of char components of trlist - ntrac, & ! number of tracers defined - INITIAL, & ! - RESTART, & - CONSTANT - - ! - ! Arguments - ! - REAL(wp),INTENT(inout) :: xt (:,:,:,:) ! tracer array - REAL(wp),INTENT(inout) ,OPTIONAL :: xtm1(:,:,:,:) ! tracer array at t-dt - ! - ! Local scalars: - ! - INTEGER :: jt ! tracer index variable - CHARACTER(len=9) :: cini ! initialisation method to print - LOGICAL :: fault ! indicates that some tracer was not initialised - ! - ! Loop over all tracers , flag tracers read from restart file. - ! - DO jt = 1, trlist% ntrac - trlist% ti(jt)% init = 0 - IF (trlist% mi(jt)% xt% restart_read .AND. & - trlist% mi(jt)% xtm1% restart_read ) & - trlist% ti(jt)% init = RESTART - END DO - ! - ! If restart flag is not set, ignore values read so far. - ! - trlist% ti(1:ntrac)% init = IAND (trlist% ti(1:ntrac)% init, & - trlist% ti(1:ntrac)% ninit) - ! - ! Set 'lrerun' flag to .false. for XT and XTM1 on output. - ! Old restart file format is not written any more. - ! - trlist% mixt % lrerun = .FALSE. - trlist% mixtm1% lrerun = .FALSE. - ! - ! read initial concentrations from file - ! - CALL xt_init_file(xt,xtm1) - ! - ! loop over tracers not initialised so far - ! - DO jt = 1, trlist% ntrac - IF (trlist% ti(jt)% init > 0) CYCLE ! skip if already initialised - ! - ! Set to constant value - ! - IF (IAND (trlist% ti(jt)% ninit, CONSTANT) /= 0) THEN - xt(:,:,jt,:) = trlist% ti(jt)% vini - trlist% ti(jt)% init = CONSTANT - IF (PRESENT(xtm1)) xtm1(:,:,jt,:) = (1._wp - eps) * xt(:,:,jt,:) - ENDIF - END DO - ! - ! loop over all tracers, print initialisation method and min,max value - ! - IF (ntrac > 0 .AND. p_parallel_io) THEN - CALL message('',separator) - CALL message('','') - CALL message('','') - CALL message('xt_initialize','initial values of tracers:') - CALL message('','') - CALL message('',' tracer source minval maxval minval,maxval(xtm1)') - fault = .FALSE. - DO jt = 1, trlist% ntrac - SELECT CASE (trlist% ti(jt)% init) - CASE (CONSTANT) - cini = 'constant' - CASE (INITIAL) - cini = 'initial ' - CASE (RESTART) - cini = 'restart ' - CASE (0) - cini = 'NOT INIT.' - fault=.TRUE. - CASE DEFAULT - cini = 'unknown ' - END SELECT - IF(PRESENT(xtm1)) THEN - WRITE(message_text,'(2x,a16,a8,2x,4g10.3)') & - trlist%ti(jt)%fullname, cini, & - MINVAL(xt(:,:,jt,:)),MAXVAL(xt(:,:,jt,:)), & - MINVAL(xtm1(:,:,jt,:)),MAXVAL(xtm1(:,:,jt,:)) - CALL message('',message_text) - ELSE - WRITE(message_text,'(2x,a16,a8,2x,4g10.3)') & - trlist%ti(jt)%fullname, cini, & - MINVAL(xt(:,:,jt,:)),MAXVAL(xt(:,:,jt,:)) - CALL message('',message_text) - ENDIF - END DO - CALL message('','') - CALL message('',separator) - ! - ! Abort if any tracer is not initialised - ! - IF(fault) CALL finish ('xt_initialize','tracer not initialised') - ENDIF - - END SUBROUTINE xt_initialize - - - - SUBROUTINE xt_init_file(xt, xtm1) - - ! - ! This routine is called from xt_initialize to allow initialization of tracer - ! variables besides initialization with constant values or from the - ! rerun file. - ! - ! Base the decision whether to initialize on the following conditions: - ! - ! trlist%ti(jt)%init == 0 (not initialized so far) - ! trlist%ti(jt)%ninit: >= INITIAL (initialisation requested) - ! - ! Set trlist%ti(jt)%init to a value =/0 afterwards. - ! - - USE mo_control, ONLY: ngl, nlon, nlev, ldebugio - USE mo_mpi, ONLY: p_parallel_io, p_io, p_bcast - USE mo_exception, ONLY: message, message_text, em_error, em_warn, em_info, em_debug - USE mo_netcdf - USE mo_transpose, ONLY: scatter_gp - USE mo_decomposition, ONLY: dcg => global_decomposition - USE mo_read_netcdf77, ONLY: read_var_nf77_3d, read_var_hs_nf77_3d - USE mo_tracdef, ONLY: trlist, INITIAL - USE mo_physical_constants, ONLY: amd - USE mo_filename, ONLY: find_next_free_unit - - REAL(wp),INTENT(inout) :: xt (:,:,:,:) ! tracer array - REAL(wp),INTENT(inout) ,OPTIONAL :: xtm1(:,:,:,:) ! tracer array at t-dt - - CHARACTER(len=16), PARAMETER :: trinifile = 'tracer_ic.nc' ! file name for tracer file - CHARACTER(len=16) :: clon, clat, clev, ctime ! variable names for coordinates - CHARACTER(len=16) :: varname ! variable name for tracer variable - CHARACTER(len=80) :: cunits ! units string of variable - CHARACTER(len=32) :: cfactor ! character string of conversion factor - INTEGER :: jt, ierr, ierr0, iunit - INTEGER :: fileID, varID, timeID, nrec ! netcdf indices - INTEGER :: ndims ! number of variable dimensions - INTEGER :: nnodef ! number of tracers not found in file - CHARACTER(len=194) :: cnodef ! names of tracers not found in file - LOGICAL :: lfirst = .TRUE., & ! first attempt to read - lfound = .FALSE. ! netcdf file trinifile valid - REAL(wp) :: zfactor ! factor for unit conversion - REAL(wp), POINTER :: zptr(:,:,:) ! for reading variables from netCDF-file - - !-- Initialisation - IF (p_parallel_io) THEN - ALLOCATE(zptr(nlon, nlev, ngl)) - ELSE - NULLIFY(zptr) - ENDIF - clon = 'lon' - clat = 'lat' - clev = 'mlev' - ctime = 'time' ! optional 4th dimension: last index will be read - nnodef = 0 - cnodef = '' - cunits = '' - cfactor = '' - - !-- Find tracer file - !-- Find tracer file - ! check, if there is a file existing (probably with 0 bytes -- see issue #225) - iunit = find_next_free_unit (30, 100) - OPEN(iunit,file=TRIM(trinifile),status='OLD',iostat=ierr0) - ierr = NF_OPEN(TRIM(trinifile), NF_NOWRITE, fileID) - IF (ierr == NF_NOERR) THEN - lfound = .TRUE. - CALL nf_check(NF_CLOSE(fileID), fname=TRIM(trinifile)) - ELSE - IF (ierr0 == 0) CALL message('xt_init_file', 'damaged or empty tracer_ic.nc!', level=em_error) - END IF - IF(ldebugio) THEN - ! Note: if ldebugio=false we give a warning only when tracers are actually expected to be read - IF (lfound) THEN - CALL message('xt_init_file', 'Successfully opened tracer IC file '//TRIM(trinifile), & - level=em_debug) - ELSE - CALL message('xt_init_file', 'Failed to open tracer IC file '//TRIM(trinifile), & - level=em_debug) - END IF - END IF - - !-- Loop over all tracers and read all of those that have not yet been initialized and - ! which allow initialisation (from file) - DO jt = 1, trlist%ntrac - IF (trlist%ti(jt)%init == 0 .AND. IAND(trlist%ti(jt)%ninit,INITIAL) /= 0 ) THEN - ierr=1 ! default: return error - !-- report warning if no initial tracer file was found - IF (lfirst .AND. .NOT. lfound) THEN - CALL message('xt_init_file', 'Cannot find file '//TRIM(trinifile)//'!', level=em_warn) - CALL message('', 'Problem occured while trying to initialize '//TRIM(trlist%ti(jt)%basename), & - level=em_info) - RETURN ! no sense to continue - END IF - lfirst = .FALSE. - !-- try to read variable from file - IF (p_parallel_io) THEN - ! look for variable containing tracer mixing ratio - CALL nf_check(NF_OPEN(TRIM(trinifile), NF_NOWRITE, fileID), fname=TRIM(trinifile)) - CALL get_nf_varname(fileID, trlist%ti(jt)%fullname, varname, varID) - ! ... if not found try again with tracer basename - IF (varID < 0) CALL get_nf_varname(fileID, trlist%ti(jt)%basename, varname, varID) - IF (ldebugio) THEN - WRITE(message_text,*) 'Variable ID for '//TRIM(varname)//' : ', varID, & - ' (tracer name='//TRIM(trlist%ti(jt)%basename)//')' - CALL message('', message_text, level=em_debug) - END IF - IF (varID >= 0) THEN - ! find out number of dimensions - CALL nf_check(nf_inq_varndims(fileID, varID, ndims), fname=TRIM(trinifile)) - IF (ndims == 4) THEN - ! find maximum index of time dimension - CALL nf_check(nf_inq_dimid(fileID, ctime, timeID), fname=TRIM(trinifile)) - CALL nf_check(nf_inq_dimlen(fileID, timeID, nrec), fname=TRIM(trinifile)) - CALL nf_check(NF_CLOSE(fileID), fname=TRIM(trinifile)) - CALL read_var_hs_nf77_3d (trinifile, clon, clev, clat, ctime, & - nrec, varname, zptr, ierr) - IF (ldebugio) THEN - WRITE(message_text,*) 'Read in hyperslab for variable '//TRIM(varname)// & - ': nrec=', nrec, ', ierr = ', ierr - CALL message('', message_text, level=em_debug) - END IF - ELSE IF (ndims == 3) THEN - CALL nf_check(NF_CLOSE(fileID), fname=TRIM(trinifile)) - CALL read_var_nf77_3d (trinifile, clon, clev, clat, & - trlist%ti(jt)%basename, zptr, ierr) - IF (ldebugio) THEN - WRITE(message_text,*) 'Read in variable '//TRIM(varname)// & - ': ierr = ', ierr - CALL message('', message_text, level=em_debug) - END IF - ELSE - WRITE(message_text,*) 'Invalid dimensions of variable '//TRIM(trlist%ti(jt)%basename)// & - ' in file '//TRIM(trinifile)//'! ndims = ',ndims - CALL message('xt_init_file', message_text, level=em_error) - CYCLE - END IF - ! report error if reading failed - IF (ierr /= 0) THEN - WRITE(message_text,*) 'Error while reading variable '//TRIM(trlist%ti(jt)%basename)// & - ' from file '//TRIM(trinifile)//'! ierr = ',ierr - CALL message('xt_init_file', message_text, level=em_error) - CYCLE - END IF - ! obtain text of units attribute and appropriate scaling factor - CALL get_units_factor (trinifile, varname, & - trlist%ti(jt)%moleweight, amd, zfactor, cunits, ierr) - IF (ierr == 0) THEN - WRITE(cfactor,*) zfactor - WRITE(message_text,*) 'Read '//TRIM(trlist%ti(jt)%basename)// & - ' from '//TRIM(trinifile)// & - '. Units = '//TRIM(cunits)// & - ', conversion factor = '//TRIM(cfactor) - CALL message('xt_init_file', message_text, level=em_info) - zptr(:,:,:) = zptr(:,:,:) * zfactor - ELSE - WRITE(message_text,*) 'Error while trying to convert units for variable '// & - TRIM(trlist%ti(jt)%basename)//' in file '//TRIM(trinifile) - CALL message('xt_init_file', message_text, level=em_error) - END IF - - END IF ! variable found in file - END IF - CALL p_bcast (ierr, p_io) - IF (ierr == 0) THEN - CALL scatter_gp(zptr,xt(:,:,jt,:),dcg) - IF (PRESENT(xtm1)) xtm1(:,:,jt,:) = xt(:,:,jt,:) - ! set flag that shows that tracer is already initialized - trlist%ti(jt)%init = INITIAL - ELSE - IF (nnodef == 0) THEN - cnodef = TRIM(trlist%ti(jt)%fullname) - ELSE - IF (len(TRIM(cnodef)//', '//TRIM(trlist%ti(jt)%fullname)) <= 194) THEN - cnodef = TRIM(cnodef)//', '//TRIM(trlist%ti(jt)%fullname) - ELSE -! already write undefined tracers to logfile -! make sure message_text is not longer than defined in subroutine message (len=256) -! subroutine "message" changes public variable "message_text" in extending it with -! (in this case!) "WARNING: xt_init_file: "!!! -! ==> make sure that extended message_text will not exceed 256 characters! -! string "WARNING: xt_init_file: Tracers not found in TRIM(trinifile): " already accounts for 62 characters -! The following if statement is just for security reasons if max length of trinifile is modified. - IF (len(TRIM('WARNING: xt_init_file: Tracers not found in '// & - TRIM(trinifile)//': '//TRIM(cnodef))) <= 256) THEN - message_text='Tracers not found in '//TRIM(trinifile)//': '//TRIM(cnodef) - CALL message('xt_init_file', message_text, level=em_warn) - ELSE - message_text='Tracers not found in trinifile: '//TRIM(cnodef) - CALL message('xt_init_file', message_text, level=em_warn) - END IF - cnodef = "...(continued) "//TRIM(trlist%ti(jt)%fullname) - END IF - END IF - nnodef = nnodef+1 - END IF - END IF ! tracer needs initialisation from file - END DO - - IF (nnodef > 0) THEN -! make sure message_text is not longer than defined in subroutine message (len=256) -! (see explanation above) - IF (len(TRIM('WARNING: xt_init_file: Tracers not found in '// & - TRIM(trinifile)//': '//TRIM(cnodef))) <= 256) THEN - message_text='Tracers not found in '//TRIM(trinifile)//': '//TRIM(cnodef) - CALL message('xt_init_file', message_text, level=em_warn) - ELSE - message_text='Tracers not found in trinifile: '//TRIM(cnodef) - CALL message('xt_init_file', message_text, level=em_warn) - END IF - END IF - - IF (ASSOCIATED(zptr)) DEALLOCATE(zptr) - - END SUBROUTINE xt_init_file - - - SUBROUTINE get_nf_varname(fileID, trname, varname, varID) - - ! find a tracer variable in the initial condition file. The search is greedy and will - ! allow for upper and lower case characters or prepended or appended 'vmr_' or 'mmr_' strings - ! The netcdf file must be open and fileID must be valid - - USE mo_netcdf - USE mo_util_string, ONLY: tolower - - INTEGER, INTENT(in) :: fileID - CHARACTER(len=*), INTENT(in) :: trname - CHARACTER(len=*), INTENT(out) :: varname - INTEGER, INTENT(out) :: varID - - CHARACTER(len=256) :: ctmp - INTEGER :: jv, nvars, ierr - - ! test original tracer name first - varname = TRIM(trname) - ierr=nf_inq_varid(fileID, TRIM(varname), varID) - ! if not successful, try pattern match for each variable - IF (ierr /= 0) THEN - varID = -1 - CALL nf_check(nf_inq_nvars(fileID, nvars)) - DO jv=1,nvars - CALL nf_check(nf_inq_varname(fileID, jv, ctmp)) - IF (TRIM(tolower(varname)) == TRIM(tolower(ctmp))) THEN - varID = jv - varname = TRIM(ctmp) ! copy to preserve upper/lower case spelling - ELSE IF ('vmr_'//TRIM(tolower(varname)) == TRIM(tolower(ctmp))) THEN - varID = jv - varname = TRIM(ctmp) - ELSE IF (TRIM(tolower(varname))//'_vmr' == TRIM(tolower(ctmp))) THEN - varID = jv - varname = TRIM(ctmp) - ELSE IF ('mmr_'//TRIM(tolower(varname)) == TRIM(tolower(ctmp))) THEN - varID = jv - varname = TRIM(ctmp) - ELSE IF (TRIM(tolower(varname))//'_mmr' == TRIM(tolower(ctmp))) THEN - varID = jv - varname = TRIM(ctmp) - END IF - END DO - END IF - - END SUBROUTINE get_nf_varname - - - SUBROUTINE get_units_factor(file_name, var_name, var_mwght, air_mwght, & - pfactor, punits, ierr) - ! Description: - ! - ! Obtain conversion factor for initial tracer concentrations. - ! Currently handles only mass mixing ratio (factor = 1) and volume mixing - ! ratio (factor = var_mwght/air_mwght) - ! - ! Authors: - ! - ! J.S. Rast, MPI, December 2003, original source - ! M.G. Schultz, FZ Juelich, May 2010 -- adapted for ECHAM6-HAMMOZ - - USE mo_netcdf - USE mo_kind, ONLY: wp - USE mo_util_string, ONLY: tolower - USE mo_exception, ONLY: message, em_warn - ! - ! Arguments: - ! - CHARACTER (LEN = *), INTENT (in) :: file_name - CHARACTER (LEN = *), INTENT (in) :: var_name - REAL(wp), INTENT(in) :: var_mwght - REAL(wp), INTENT(in) :: air_mwght - REAL(wp), INTENT(out) :: pfactor - CHARACTER (len=80), INTENT(out) :: punits - INTEGER, INTENT(out) :: ierr - ! - ! Local variables: - ! - INTEGER :: zncid, zvarid, zierr, zlen - LOGICAL :: lfound - CHARACTER (len=80) :: ctmp, zunits - - !-- Initialize - pfactor = 1.0_wp - ierr = 0 - lfound = .FALSE. - - !-- Open netCDF file - CALL nf_check(nf_open(TRIM(file_name), nf_nowrite, zncid), & - fname=TRIM(file_name)) - !-- inquire variable name - zierr=nf_inq_varid(zncid, TRIM(var_name), zvarid) - IF (zierr /= NF_NOERR) THEN - ierr = zierr - write(0,*) '**** mo_tracer_processes: get_units_factor :: Should never be here! ***' - CALL nf_check(nf_close(zncid), fname=TRIM(file_name)) - RETURN - END IF - !-- inquire units attribute - zierr = nf_inq_attlen(zncid, zvarid, 'units', zlen) - IF (zierr /= NF_NOERR) THEN - ierr = zierr - CALL nf_check(nf_close(zncid), fname=TRIM(file_name)) - RETURN ! failed to read units attribute - END IF - !-- Get text of units attribute - ctmp = ' ' - zierr = nf_get_att_text(zncid, zvarid, 'units', ctmp) - IF (zierr /= NF_NOERR) THEN - ierr = zierr - zunits = 'unknown' - CALL nf_check(nf_close(zncid), fname=TRIM(file_name)) - RETURN ! failed to read units attribute - END IF - CALL nf_check(nf_close(zncid), fname=TRIM(file_name)) - !-- Process units string - zunits = tolower(TRIM(ctmp)) - !-- Check for mass mixing ratio units (safety check) - IF (zunits(1:7) == 'kg kg-1' .OR. zunits(1:5) == 'kg/kg' .OR. & - zunits(1:3) == 'mmr') THEN - lfound = .TRUE. - pfactor = 1.0_wp ! no conversion necessary - !-- Check for volume mixing ratio units - ELSE IF (zunits(1:11) == 'mole mole-1' .OR. zunits(1:9) == 'mole/mole' .OR. & - zunits(1:3) == 'vmr') THEN - lfound = .TRUE. - pfactor = var_mwght / air_mwght - END IF - - IF (.NOT. lfound) THEN - CALL message('get_units_factor', & - 'Cannot find mass or volume mixing ratio unit. Units = '//TRIM(zunits), & - level=em_warn) - END IF - - punits = zunits ! for reporting - - END SUBROUTINE get_units_factor - -!----- xt_burden --------------------------------------------------------------- - - ! Description: - ! - ! Calculation of tracer burdens (column integrals) - ! The mo_tracer module comprises the formerly independent routine xt_burden and the - ! burden memory management which was formerly handled in mo_aero_mem - ! - ! Authors: - ! - ! P. Stier, MPI, 2001, original source - ! M. Schultz, FZ Juelich - adaptation to ECHAM6 (2009-09-25) - ! - ! for more details see file AUTHORS - ! - -!### tstream: option to add burden diag to existing stream. May be obsolete, but leave for now. - SUBROUTINE xt_burden_init_mem ( tstream ) - - USE mo_submodel, ONLY: lburden ! switch burden diagnostics on/off - USE mo_tracer, ONLY: nburden, d_burden - USE mo_linked_list, ONLY: t_stream, SURFACE - USE mo_memory_base, ONLY: new_stream, add_stream_element, & - default_stream_setting, add_stream_reference, AUTO - - ! Arguments - TYPE (t_stream), TARGET, INTENT(inout), OPTIONAL :: tstream ! diag stream reference - - ! Local variables - TYPE (t_stream), POINTER :: diagstream - CHARACTER(len=32) :: cunit - INTEGER :: jn - - - IF (.NOT. lburden) RETURN ! don't do anything if burden diagnostics is inactive - - ! Set stream pointer to existing stream if given - IF (PRESENT(tstream)) THEN - diagstream => tstream - ELSE - ! Otherwise open a new diagnostic stream for burden diagnostics - ! file type taken from tracer files. - CALL new_stream (diagstream ,'burden',filetype=trac_filetype) - !--- Add standard fields for post-processing: - CALL add_stream_reference (diagstream, 'geosp' ,'g3b' ,lpost=.TRUE.) - CALL add_stream_reference (diagstream, 'lsp' ,'sp' ,lpost=.TRUE.) - CALL add_stream_reference (diagstream, 'aps' ,'g3b' ,lpost=.TRUE.) - CALL add_stream_reference (diagstream, 'gboxarea','geoloc',lpost=.TRUE.) - !--- Default stream element settings - CALL default_stream_setting (diagstream, lrerun = .TRUE. , & - contnorest= .TRUE. , & - laccu = .TRUE. , & - lpost = .TRUE. , & - leveltype = SURFACE, & - table = 199, & - code = AUTO ) - END IF - - ! Add burden fields for all d_burden entries - ! total column mass - DO jn=1, nburden - IF (IAND(d_burden(jn)%itype, 1) /= 0) THEN - cunit = 'kg m-2' - CALL add_stream_element(diagstream, 'burden_'//TRIM(d_burden(jn)%name), & - d_burden(jn)%ptr1, units=cunit, & - longname='atmospheric burden of '//TRIM(d_burden(jn)%name)) - END IF - END DO - ! tropospheric column mass - DO jn=1, nburden - IF (IAND(d_burden(jn)%itype, 2) /= 0) THEN - cunit = 'kg m-2' - CALL add_stream_element(diagstream, 'trburden_'//TRIM(d_burden(jn)%name), & - d_burden(jn)%ptr2, units=cunit, & - longname='tropospheric burden of '//TRIM(d_burden(jn)%name)) - END IF - END DO - ! stratospheric column mass - DO jn=1, nburden - IF (IAND(d_burden(jn)%itype, 4) /= 0) THEN - cunit = 'kg m-2' - CALL add_stream_element(diagstream, 'stburden_'//TRIM(d_burden(jn)%name), & - d_burden(jn)%ptr4, units=cunit, & - longname='stratospheric burden of '//TRIM(d_burden(jn)%name)) - END IF - END DO - ! total column density - DO jn=1, nburden - IF (IAND(d_burden(jn)%itype, 8) /= 0) THEN - cunit = 'm-2' - CALL add_stream_element(diagstream, 'coldensity_'//TRIM(d_burden(jn)%name), & - d_burden(jn)%ptr8, units=cunit, & - longname='atmospheric column density of '//TRIM(d_burden(jn)%name)) - END IF - END DO - ! tropospheric column density - DO jn=1, nburden - IF (IAND(d_burden(jn)%itype, 16) /= 0) THEN - cunit = 'm-2' - CALL add_stream_element(diagstream, 'trcoldensity_'//TRIM(d_burden(jn)%name), & - d_burden(jn)%ptr16, units=cunit, & - longname='tropospheric column density of '//TRIM(d_burden(jn)%name)) - END IF - END DO - ! stratospheric column density - DO jn=1, nburden - IF (IAND(d_burden(jn)%itype, 32) /= 0) THEN - cunit = 'm-2' - CALL add_stream_element(diagstream, 'stcoldensity_'//TRIM(d_burden(jn)%name), & - d_burden(jn)%ptr32, units=cunit, & - longname='stratospheric column density of '//TRIM(d_burden(jn)%name)) - END IF - END DO - - END SUBROUTINE xt_burden_init_mem - - - SUBROUTINE xt_burden(kproma, kbdim, klev, klevp1, krow, & ! Local dimensions - papp1, paphp1, & ! Thermodynamic quantities - pxtm1, pxtte ) ! Tracer fields - - ! *xt_burden* calculates the atmospheric burden and column densities for tracers - ! for which a burden diagnostics was defined. Note that several tracers can share - ! the same diagnostics to allow output for example by aerosol species or mode. - ! - ! Author: - ! ------- - ! Martin Schultz, FZ-Juelich (2009-09-25) - ! based on code from P. Stier (2002) - ! - ! Method: - ! ------- - ! Calculate burden [kg m-2] from mixing ratio [kg kg-1] by multiplying - ! with the term dp/g and summing up the vertical integral. - ! The burden is multiplied by dt and divided by the output interval - ! in the stream management to give a mean over the output interval. - ! - ! ToDo: - ! ----- - ! ### implement column density calculation (burden%itype >= 8) - ! ### implement global sum diagnostics (itype=64) - use trastat. ?? - - USE mo_kind, ONLY: wp - USE mo_exception, ONLY: finish, message, em_info, em_warn - USE mo_time_control, ONLY: delta_time, time_step_len - USE mo_physical_constants, ONLY: grav - USE mo_submodel, ONLY: lburden - USE mo_vphysc, ONLY: vphysc - USE mo_tracdef, ONLY: ntrac, trlist - USE mo_tracer, ONLY: nburden, d_burden - - - !--- Dummy Variables: - - INTEGER, INTENT(in) :: kproma, kbdim, klev, klevp1, krow - - REAL(wp), INTENT(in) :: paphp1(kbdim,klevp1), papp1(kbdim,klev) - REAL(wp), INTENT(in) :: pxtm1(kbdim,klev,ntrac), pxtte(kbdim,klev,ntrac) - - - !--- Local Variables: - - INTEGER :: jl, jk, jt, iburden, itype - - REAL(wp) :: zxtp1(kbdim) - REAL(wp) :: zdpg(kbdim,klev) - - LOGICAL, SAVE :: lfirst=.TRUE. - - - - !--- 0) Initializations: - - IF (ntrac == 0 .OR. .NOT. lburden) RETURN ! don't do anything if burden diagnostics is inactive - - !--- Calculate burden only for tracers that are given the unit of mixing ratio, - ! i.e. assume that the unit is mixing ratio occurs if the string kg-1 occurs - ! in the tracer units: - - IF (lfirst) THEN - CALL message('xt_burden', '----------------------------------------------------', level=em_info) - ! test for validity of burdenid - DO jt = 1, ntrac - IF (trlist%ti(jt)%burdenid > nburden) CALL finish('xt_burden', 'Invalid burden id for tracer '// & - trlist%ti(jt)%fullname) - END DO - END IF - - !--- 1) Calculate auxiliary variable dp/g : - - !--- Uppermost level: - zdpg(1:kproma,1)=2._wp*(paphp1(1:kproma,2)-papp1(1:kproma,1))/grav - !--- Other levels: - DO jk=2, klev - zdpg(1:kproma,jk)=(paphp1(1:kproma,jk+1)-paphp1(1:kproma,jk))/grav - END DO - - - !--- 2) Calculate and store d_burden: - - DO jt=1, ntrac - iburden = trlist%ti(jt)%burdenid - IF (iburden <= 0) CYCLE ! nothing to be done for this tracer - - itype = d_burden(iburden)%itype - - ! total column mass - IF (IAND(itype, 1) /= 0) THEN - DO jk=1, klev - zxtp1(1:kproma)=pxtm1(1:kproma,jk,jt)+pxtte(1:kproma,jk,jt)*time_step_len - d_burden(iburden)%ptr1(1:kproma,krow) = d_burden(iburden)%ptr1(1:kproma,krow) & - + zxtp1(1:kproma)*zdpg(1:kproma,jk)*delta_time - END DO - END IF - ! tropospheric column mass - IF (IAND(itype, 2) /= 0) THEN - DO jk=1, klev - DO jl=1, kproma - IF (vphysc%trpwmo(jl,krow) < jk) THEN - zxtp1(jl)=pxtm1(jl,jk,jt)+pxtte(jl,jk,jt)*time_step_len - d_burden(iburden)%ptr2(jl,krow) = d_burden(iburden)%ptr2(jl,krow) & - + zxtp1(jl)*zdpg(jl,jk)*delta_time - END IF - END DO - END DO - END IF - ! stratospheric column mass - IF (IAND(itype, 4) /= 0) THEN - DO jk=1, klev - DO jl=1, kproma - IF (vphysc%trpwmo(jl,krow) > jk) THEN - zxtp1(jl)=pxtm1(jl,jk,jt)+pxtte(jl,jk,jt)*time_step_len - d_burden(iburden)%ptr4(jl,krow) = d_burden(iburden)%ptr4(jl,krow) & - + zxtp1(jl)*zdpg(jl,jk)*delta_time - END IF - END DO - END DO - END IF - -!### MUST ADD UNIT CONVERSION / CHECK HERE !!! -!### the following code is just providing the structure but will not work properly!! - ! total column density - IF (IAND(itype, 8) /= 0) THEN -IF (lfirst) CALL message('xt_burden','burdentype 8 not properly implemented yet!', level=em_warn) - DO jk=1, klev - zxtp1(1:kproma)=pxtm1(1:kproma,jk,jt)+pxtte(1:kproma,jk,jt)*time_step_len - d_burden(iburden)%ptr8(1:kproma,krow) = d_burden(iburden)%ptr8(1:kproma,krow) & - + zxtp1(1:kproma)*zdpg(1:kproma,jk)*delta_time - END DO - END IF - ! tropospheric column density - IF (IAND(itype, 16) /= 0) THEN -IF (lfirst) CALL message('xt_burden','burdentype 16 not properly implemented yet!', level=em_warn) - DO jk=1, klev - DO jl=1, kproma - IF (vphysc%trpwmo(jl,krow) < jk) THEN - zxtp1(jl)=pxtm1(jl,jk,jt)+pxtte(jl,jk,jt)*time_step_len - d_burden(iburden)%ptr16(jl,krow) = d_burden(iburden)%ptr16(jl,krow) & - + zxtp1(jl)*zdpg(jl,jk)*delta_time - END IF - END DO - END DO - END IF - ! stratospheric column density - IF (IAND(itype, 32) /= 0) THEN -IF (lfirst) CALL message('xt_burden','burdentype 32 not properly implemented yet!', level=em_warn) - DO jk=1, klev - DO jl=1, kproma - IF (vphysc%trpwmo(jl,krow) > jk) THEN - zxtp1(jl)=pxtm1(jl,jk,jt)+pxtte(jl,jk,jt)*time_step_len - d_burden(iburden)%ptr32(jl,krow) = d_burden(iburden)%ptr32(jl,krow) & - + zxtp1(jl)*zdpg(jl,jk)*delta_time - END IF - END DO - END DO - END IF - END DO - - - lfirst=.FALSE. - - END SUBROUTINE xt_burden - -#endif - SUBROUTINE xt_conv_massfix (kproma, kbdim, klev, & klevp1, ktrac, krow, & papp1, paphp1, pxtte, & diff --git a/ifs-source/arpifs/m7/module/mo_util_string.F90 b/ifs-source/arpifs/m7/module/mo_util_string.F90 index bbbcdc1c..4cb505a6 100644 --- a/ifs-source/arpifs/m7/module/mo_util_string.F90 +++ b/ifs-source/arpifs/m7/module/mo_util_string.F90 @@ -1,10 +1,14 @@ -!> -!! @par Copyright -!! This code is subject to the MPI-M-Software - License - Agreement in it's most recent form. -!! Please see URL http://www.mpimet.mpg.de/en/science/models/model-distribution.html and the -!! file COPYING in the root of the source tree for this code. -!! Where software is supplied by third parties, it is indicated in the headers of the routines. -!! +! ICON +! +! --------------------------------------------------------------- +! Copyright (C) 2004-2024, DWD, MPI-M, DKRZ, KIT, ETH, MeteoSwiss +! Contact information: icon-model.org +! +! See AUTHORS.TXT for a list of authors +! See LICENSES/ for license information +! SPDX-License-Identifier: BSD-3-Clause +! --------------------------------------------------------------- + MODULE mo_util_string !---------------------------------------------- ! This module holds string conversion utilities diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index 4b72dd4e..f972e290 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -181,7 +181,6 @@ SUBROUTINE HAMM7_INTERFACE( & USE MO_PARAM_SWITCHES, ONLY: ncd_activ ! for activation USE MO_TRACDEF, ONLY: ntrac, trlist ! number of tracer for mass/number mixing ratio conversion, trlist for wet deposition flags USE MO_TRACER_PROCESSES, ONLY: xt_borrow, xt_conv_massfix ! conserving the negative tracer values from tendency, and convective case -USE MO_SUBMODEL, ONLY: lwetdep,lsedimentation ! logical for wetdeposition, sedimentation USE MO_TIME_CONTROL, ONLY: time_step_len ! time step length for tendency USE MO_HAMMOZ_WETDEP, ONLY: wetdep_interface ! wet deposition interface call USE MO_HAM_WETDEP, ONLY: ham_conv_lfraq_so2 @@ -226,9 +225,9 @@ SUBROUTINE HAMM7_INTERFACE( & REAL(KIND=JPRB),INTENT(IN) :: PAERFLX(KLON,12,9), PAERLIF(KLON,9), PCLAERS(KLON) REAL(KIND=JPRB),INTENT(IN) :: PLSM(KLON) , PSNS(KLON) , PWND(KLON) , PWS1(KLON) REAL(KIND=JPRB),INTENT(IN) :: PTSPHY -REAL(KIND=JPRB),INTENT(IN) :: PVERVEL(KLON,KLEV) ! added vertical velocity as an input to TM5M7 (needed in HAM-M7 activation) -REAL(KIND=JPRB),INTENT(IN) :: PCCNL(KLON) ! added CCN over land as an input to TM5M7 (needed in liquid effective radius calc.) -REAL(KIND=JPRB),INTENT(IN) :: PCCNO(KLON) ! added CCN over ocean as an input to TM5M7 (needed in liquid effective radius calc.) +REAL(KIND=JPRB),INTENT(IN) :: PVERVEL(KLON,KLEV) ! vertical velocity (needed in HAM-M7 activation) +REAL(KIND=JPRB),INTENT(IN) :: PCCNL(KLON) ! CCN over land (needed in liquid effective radius calc.) +REAL(KIND=JPRB),INTENT(IN) :: PCCNO(KLON) ! CCN over ocean (needed in liquid effective radius calc.) REAL(KIND=JPRB),INTENT(IN) :: PAHFSTI(KLON,KTILES) ! added surface sensible heat flux for dry deposition REAL(KIND=JPRB),INTENT(IN) :: PCI(KLON) ! added fraction of sea-ice for dry deposition REAL(KIND=JPRB),INTENT(IN) :: PZ0M(KLON) ! added roughness length for momentum for dry deposition @@ -497,7 +496,6 @@ SUBROUTINE HAMM7_INTERFACE( & #include "m7_simple_sulfur_drydep.intfb.h" #include "ice_effective_radius.intfb.h" !#include "m7.intfb.h" -! include calculations for ice effective radius !----------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('HAMM7_INTERFACE',0,ZHOOK_HANDLE) @@ -1058,7 +1056,7 @@ SUBROUTINE HAMM7_INTERFACE( & & ZCDNCACT, ZESW, ZRHO, & ! number of activated particles, saturation vapor pressure, air density & ZXTP1, PTP, PRSF1, ZQP, & ! tracer mix rat, temperature, air pressure, spec. humid. & ZW, ZWPDF, ZA, ZB, ZRDRY, & ! mean udr veloc, pdf of udr. veloc, Koehler A, Koehler B, dry radius - & ZNACT, ZFRACN, ZSC, ZRC, ZSMAX) ! num. act. part., frac ", crit. ssat., crit. radius, max ssat + & ZNACT, ZFRACN, ZSC, ZRC, ZSMAX) ! num. act. part. per mode, frac ", crit. ssat., crit. radius, max ssat CALL GSTATS(2502,1) !<-- End activation for HAM-M7 @@ -1147,14 +1145,14 @@ SUBROUTINE HAMM7_INTERFACE( & IF ( LAERSCAV ) THEN !--> initialize mixing ratios for wet deposition - ! Only ZXTP1, in case LWETDEP=false or no tracers subject to wet dep, since it may be used in drydep! + ! Only ZXTP1, in case no tracers subject to wet dep, since it may be used in drydep! DO JT = 1,NTRAC ZXTP1(KIDIA:KFDIA,1:KLEV,JT) = ZXTM1(KIDIA:KFDIA,1:KLEV,JT) + ZXTTE(KIDIA:KFDIA,1:KLEV,JT) * TIME_STEP_LEN END DO !<-- call wetdep interface for wet deposition !-- interface to wet deposition routine (also from cuflx_subm) - IF ( LWETDEP .AND. ANY(trlist%ti(:)%nwetdep > 0) ) THEN + IF ( ANY(trlist%ti(:)%nwetdep > 0) ) THEN ! for calculating the rain and snow evaporation/formation variables used in wet deposition DO JK=1,KLEV @@ -1313,7 +1311,7 @@ SUBROUTINE HAMM7_INTERFACE( & CALL GSTATS(2504,0) IF (LAERSEDIM) THEN - IF ( lsedimentation .AND. ANY(trlist%ti(:)%nsedi > 0) ) THEN + IF ( ANY(trlist%ti(:)%nsedi > 0) ) THEN ZTENCIH(KIDIA:KFDIA,1:KLEV,1:ntrac)=ZXTTE(KIDIA:KFDIA,1:KLEV,1:ntrac) diff --git a/ifs-source/arpifs/phys_ec/aer_so2so4_v2.F90 b/ifs-source/arpifs/phys_ec/aer_so2so4_v2.F90 index 309723dd..8bcdac2d 100644 --- a/ifs-source/arpifs/phys_ec/aer_so2so4_v2.F90 +++ b/ifs-source/arpifs/phys_ec/aer_so2so4_v2.F90 @@ -307,10 +307,12 @@ SUBROUTINE AER_SO2SO4_V2 & ! Split PCHEMSULF1 array !! Initialise tendencies (necessary when using sub-timesteps for chemistry, -!! since the total tendency will be the sum of "sub-tendencies" -PTSO2(:,:) = 0._JPRB -PTSO4(:,:) = 0._JPRB -PTSO4_AQ(:,:) = 0._JPRB +!! since the total tendency will be the sum of "sub-tendencies". +!! PLS: This was commented in 43r3, which seems logical since these +!! arrays are filled before calling the AER_SO2SO4_V2 in both hamm7_interface.F90 and aer_phy3.F90 +PTSO2(KIDIA:KFDIA,:) = 0._JPRB +PTSO4(KIDIA:KFDIA,:) = 0._JPRB +PTSO4_AQ(KIDIA:KFDIA,:) = 0._JPRB CALL COMPO_DIURNAL(YDRIP, KIDIA, KFDIA, KLON, 'Sine', PGELAM, PGELAT, ZSCALEOH, PAMPLITUDE=0.7_JPRB, PHOURPEAK=15.0_JPRB) CALL COMPO_DIURNAL(YDRIP, KIDIA, KFDIA, KLON, 'Sine', PGELAM, PGELAT, ZSCALEO3, PAMPLITUDE=0.7_JPRB, PHOURPEAK=15.0_JPRB) @@ -431,7 +433,7 @@ SUBROUTINE AER_SO2SO4_V2 & ! using PTSPHY=sum(ZPTSCHEM) PTSO2(JL,JK) = PTSO2(JL,JK) - ZTend_OH_Sum * ZRMSO2 / ZAIR_DENS / PTSPHY PTSO4(JL,JK) = PTSO4(JL,JK)+ ZTend_OH_Sum * ZRMSO4 / ZAIR_DENS / PTSPHY - + PTSO4_AQ(JL,JK) = 0._JPRB ! PLS: No accumulation here? ! -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- @@ -661,8 +663,10 @@ SUBROUTINE AER_SO2SO4_V2 & ZTend_Sum = ZTend_Aq_Sum + ZTend_OH_Sum + ! Separate wet and dry production of SO4 to allow wet SO4 distribution to M7 modes + ! For "aer" case, dry and wet production are summed in AER_PHY3 (FIXME TODO IF POSSIBLE) PTSO2(JL,JK) = PTSO2(JL,JK) - ZTend_Sum * ZRMSO2 / ZAIR_DENS / PTSPHY - PTSO4(JL,JK) = PTSO4(JL,JK) + ZTend_Sum * ZRMSO4 / ZAIR_DENS / PTSPHY + PTSO4(JL,JK) = PTSO4(JL,JK) + ZTend_OH_Sum * ZRMSO4 / ZAIR_DENS / PTSPHY PTSO4_AQ(JL,JK) = PTSO4_AQ(JL,JK) + ZTend_Aq_Sum * ZRMSO4 / ZAIR_DENS / PTSPHY ! -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- diff --git a/ifs-source/arpifs/phys_ec/callpar.F90 b/ifs-source/arpifs/phys_ec/callpar.F90 index 742dc554..c4177d94 100644 --- a/ifs-source/arpifs/phys_ec/callpar.F90 +++ b/ifs-source/arpifs/phys_ec/callpar.F90 @@ -640,7 +640,9 @@ SUBROUTINE CALLPAR(YDGEOMETRY,YDVARS,YDSURF,YDMODEL,KDIM,& ALLOCATE( ZCHEM2AER(KDIM%KLON,KDIM%KLEV,NCHEM2AER) ) ZCHEM2AER(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV,1:NCHEM2AER)=0._JPRB ELSE - ALLOCATE( ZCHEM2AER(1,1,1) ) + ! TB needed also in case of simple sulfur scheme + ALLOCATE( ZCHEM2AER(KDIM%KLON,KDIM%KLEV,NCHEM2AER) ) + ZCHEM2AER(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV,1:NCHEM2AER)=0._JPRB ENDIF ENDIF @@ -1119,7 +1121,8 @@ SUBROUTINE CALLPAR(YDGEOMETRY,YDVARS,YDSURF,YDMODEL,KDIM,& IF (NAERCLD > 0) THEN SELECT CASE (TRIM(AERO_SCHEME)) - CASE ("tm5m7", "hamm7")!!! introduce this to avoid modification within cloud_layer.F90 + CASE ("hamm7")!!! introduce this to avoid modification within cloud_layer.F90 + ! Note that in 43r3, ccn=max(.,1) and nice=max(.,0.027) AUXL%ZCCN(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV) = PGFL(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV,YGFL%YCDNC%MP9_PH)!!! liquid cloud condensation nuclei AUXL%ZNICE(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV) = PGFL(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV,YGFL%YICNC%MP9_PH)!!! ice number concentration (cf. CCN) CASE ("aer3") diff --git a/ifs-source/arpifs/phys_ec/cloudsc.F90 b/ifs-source/arpifs/phys_ec/cloudsc.F90 index 955a790e..d53ec6fb 100644 --- a/ifs-source/arpifs/phys_ec/cloudsc.F90 +++ b/ifs-source/arpifs/phys_ec/cloudsc.F90 @@ -2008,20 +2008,20 @@ SUBROUTINE CLOUDSC & IF (LLPERT_RCLCRIT) THEN !Apply SPP perturbations IF (PLSM(JL) > 0.5_JPRB) THEN - ZCONST = RCL_KK_CLOUD_NUM_LAND + ZCONST = RCL_KK_CLOUD_NUM_LAND ! FPE triggered below when using PCCN(JL,JK) here ! perturbed land value of RCLCRIT ZLCRIT = RCLCRIT_LAND*EXP(PN1RCLCRIT%MU(1)+PN1RCLCRIT%XMAG(1)*PGP2DSPP(JL, IPRCLCRIT)) ELSE - ZCONST = RCL_KK_CLOUD_NUM_SEA + ZCONST = RCL_KK_CLOUD_NUM_SEA ! FPE triggered below when using PCCN(JL,JK) here ! perturbed ocean value of RCLCRIT ZLCRIT = RCLCRIT_SEA *EXP(PN1RCLCRIT%MU(2)+PN1RCLCRIT%XMAG(2)*PGP2DSPP(JL, IPRCLCRIT)) ENDIF ELSE IF (PLSM(JL) > 0.5_JPRB) THEN ! land (unperturbed) - ZCONST = RCL_KK_CLOUD_NUM_LAND + ZCONST = RCL_KK_CLOUD_NUM_LAND ! FPE triggered below when using PCCN(JL,JK) here ZLCRIT = RCLCRIT_LAND ELSE ! ocean (unperturbed) - ZCONST = RCL_KK_CLOUD_NUM_SEA + ZCONST = RCL_KK_CLOUD_NUM_SEA ! FPE triggered below when using PCCN(JL,JK) here ZLCRIT = RCLCRIT_SEA ENDIF ENDIF From 24f03841a19d2d31c737de836cbc82c5377c66d8 Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Tue, 4 Feb 2025 17:40:39 +0100 Subject: [PATCH 044/129] Bring changes for the simple sulfur scheme (untested) --- .../arpifs/m7/phys_ec/hamm7_interface.F90 | 73 +++++++------------ 1 file changed, 26 insertions(+), 47 deletions(-) diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index f972e290..47cfa126 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -273,7 +273,7 @@ SUBROUTINE HAMM7_INTERFACE( & INTEGER(KIND=JPIM) :: JEXT, ITRC, IKLEVTROP(KLON), IW INTEGER(KIND=JPIM) :: JO, JH, JY ! inside loop index for OIFS contex, HAM context and YAEROUT INTEGER(KIND=JPIM) :: JCLASS, JTILE, JMASS, JGAS, JCLOUD ! local loop indice for activation and dry deposition and tracer indexing -INTEGER(KIND=JPIM) :: ISSO2, ISSO4, ISSO4_ACS +INTEGER(KIND=JPIM) :: ISSO2, ISSO4, ISSO4_ACS, INUM_ACS, INUM_COS INTEGER(KIND=JPIM) :: IMODE INTEGER(KIND=JPIM) :: IFLAG @@ -482,6 +482,7 @@ SUBROUTINE HAMM7_INTERFACE( & REAL(KIND=JPRB) :: PAOD(KLON,NASWBAND), PSSA(KLON,NASWBAND), PABS(KLON,NASWBAND), PASY(KLON,NASWBAND),PFAOD(KLON,NASWBAND) REAL(KIND=JPRB) :: PAOD_LW(KLON,16) +REAL(KIND=JPRB) :: ZCHEM2AER(KLON,KLEV,6) ! to overwrite PCHEM2AER (or we could set the latter to inout intent) !----------------------------------------------------------------------- @@ -632,6 +633,8 @@ SUBROUTINE HAMM7_INTERFACE( & !ZAERSRC(KIDIA:KFDIA,1:NACTAERO)=PAERSRC(KIDIA:KFDIA,1:NACTAERO) +ZCHEM2AER(KIDIA:KFDIA,1:KLEV,1:6)=PCHEM2AER(KIDIA:KFDIA,1:KLEV,1:6) + ! computation of tropopause level CALL TROPLEV(KLON,KIDIA,KFDIA,KLEV,.FALSE.,PTP,PQP,PRSF1,IKLEVTROP) @@ -730,20 +733,24 @@ SUBROUTINE HAMM7_INTERFACE( & ELSE IF (TRIM(YAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))%CNAME)=='SO4_gas')THEN ISSO4=ind_oifs_ham%ind_gas_OIFS(JGAS) ELSE - CALL ABOR1('ABORT: IN AER_PHY3_layer, SO2 not defined. Wrong table in use') + CALL ABOR1('HAMM7_INTERFACE: SO2 not defined. Wrong table in use') END IF END DO DO JAER=1,NACTAERO IF (TRIM(YAERO(JAER)%CNAME)=='SO4_AS') THEN ISSO4_ACS=JAER - EXIT + !EXIT !if looking three exit cannot be here FIXME: PLS DO NOT UNDERSTAND + ELSE IF (TRIM(YAERO(JAER)%CNAME)=='AS_N') THEN + INUM_ACS=JAER + ELSE IF (TRIM(YAERO(JAER)%CNAME)=='CS_N') THEN + INUM_COS=JAER + !write(2222,*)INUM_COS END IF END DO DO JK=1,KLEV DO JL=KIDIA,KFDIA - !!!ZDP(JL,JK)= PAUX%PRS1(JL,JK) - PAUX%PRS1(JL,JK-1) ZTSO2(JL,JK) = PTENC(JL,JK,ISSO2) ZTSO4(JL,JK, 1) = PTENC(JL,JK,ISSO4) ZTSO4_AQ(JL,JK) = 0.0_JPRB @@ -752,6 +759,8 @@ SUBROUTINE HAMM7_INTERFACE( & END DO END DO + ! FIXME - check on NSO4SCHEME (should be 2)? + !CALL AER_SO2SO4_V2 ( & ! KIDIA, KFDIA, KLON, KLEV, & ! ! TSPHY, STATE%T, PAUX%PRSF1 , PRAD%PNEB, PRAD%PQLI, PAUX%PGELAM,& @@ -779,12 +788,11 @@ SUBROUTINE HAMM7_INTERFACE( & ! ZTSO4 PTENC(JL,JK,ISSO4)=PTENC(JL,JK,ISSO4)+ZTSO4(JL,JK,1) ! SO4 formed in clouds is applied to Accumulati - !write(7700,*)ISSO4_ACS,shape(GEMSL%ZTENC(JL,JK,:)) PTENC(JL,JK,ISSO4_ACS)=PTENC(JL,JK,ISSO4_ACS)+ZTSO4_AQ(JL,JK) - !This is done insed aer_phy3.F90: - ! ELSE IF(AERO_SCHEME == "aer") THEN - ! GEMSL%ZTENC(JL,JK,ISSO4)=GEMSL%ZTENC(JL,JK,ISSO4)+ZTSO4(JL,JK) - + + ZCHEM2AER(JL,JK,1)=ZTSO4(JL,JK,1) + ZCHEM2AER(JL,JK,2)=ZTSO4_AQ(JL,JK) + END DO END DO @@ -856,16 +864,18 @@ SUBROUTINE HAMM7_INTERFACE( & END DO !mass DO JMASS=1,naerocomp + JO=ind_oifs_ham%ind_mass_OIFS(JMASS) ! JO -> index context OIFS + JH=ind_oifs_ham%ind_mass_HAM(JMASS) ! JH -> index context HAM DO JK=1,KLEV DO JL=KIDIA,KFDIA - ZXTM1(JL,JK,ind_oifs_ham%ind_mass_HAM(JMASS)) = ZCEN(JL,JK,KAERO(ind_oifs_ham%ind_mass_OIFS(JMASS))) - ZXTTE(JL,JK,ind_oifs_ham%ind_mass_HAM(JMASS)) = PTENC(JL,JK,KAERO(ind_oifs_ham%ind_mass_OIFS(JMASS))) + ZXTM1(JL,JK,JH) = ZCEN(JL,JK,KAERO(JO)) + ZXTTE(JL,JK,JH) = PTENC(JL,JK,KAERO(JO)) ! in case of simple sulfur scheme add SO4_AQ part into SO4_ACS ! both original tendency and m7tendency [FIXME: what??] !ADD SO4 from wet chemistry to tendencies - if(trim(YAERO(ind_oifs_ham%ind_mass_OIFS(JMASS))%CNAME)=='SO4_AS') then - ZXTTE(JL,JK,ind_oifs_ham%ind_mass_HAM(JMASS))=ZXTTE(JL,JK,ind_oifs_ham%ind_mass_HAM(JMASS))+PCHEM2AER(JL,JK,2) + if(trim(YAERO(JO)%CNAME)=='SO4_AS') then + ZXTTE(JL,JK,JH)=ZXTTE(JL,JK,JH)+ZCHEM2AER(JL,JK,2) end if END DO @@ -880,7 +890,7 @@ SUBROUTINE HAMM7_INTERFACE( & IF (LAERCHEM) THEN ZXTM1(JL,JK,JH) = ZCEN(JL,JK,KCHEM(JO)) IF(TRIM(YCHEM(JO)%CNAME)=='SO4')THEN ! Add SO4 from wet chemistry to tendencies - ZXTTE(JL,JK,JH) = PCHEM2AER(JL,JK,1) + ZXTTE(JL,JK,JH) = ZCHEM2AER(JL,JK,1) ELSE ZXTTE(JL,JK,JH) = PTENC(JL,JK,KCHEM(JO)) END IF @@ -893,7 +903,7 @@ SUBROUTINE HAMM7_INTERFACE( & ELSE IF (TRIM(YAERO(JO)%CNAME)=='SO4_gas')THEN ZXTM1(JL,JK,JH) = ZCEN(JL,JK,KAERO(JO)) - ZXTTE(JL,JK,JH) = PTENC(JL,JK,KAERO(JO)) + ZXTTE(JL,JK,JH) = ZCHEM2AER(JL,JK,1) + PTENC(JL,JK,KAERO(JO)) ZXTTEM1(JL,JK,JH) = PTENC(JL,JK,KAERO(JO)) END IF @@ -933,37 +943,6 @@ SUBROUTINE HAMM7_INTERFACE( & ! --> calling the correct microphysics scheme SELECT CASE (TRIM(AERO_SCHEME)) - CASE ("tm5m7") - ! ** OBSOLETE ** (PLS) - - !alaak: commented out because model crashes - !kg(air)-1 to cm-3 -!!$ - !do JK =1,KLEV - ! do JL =KIDIA,KFDIA - ! ZAIRDM(JL) = (7.24291E16_JPRB*PRSF1(JL,JK)/PTP(JL,JK)) * RMD - ! !end do - ! DO JMOD=1,NMOD - ! ZAERNL(JL,JK,JMOD)=MAX(PAEROP(JL,JK,MODE_START(JMOD))/ZAIRDM(JL),0.0_JPRB) - ! END DO - ! - ! end do - !end do - -!!$ DO JMOD=1,NMOD -!!$ DO JAERCLASS=1,NAERMOD -!!$ IF (MODE_TRACERS_BY_MODS(JAERCLASS,JMOD)>0) THEN -!!$ ZAERML(KIDIA:KFDIA,1:KLEV,JAERCLASS)=ZCEN(KIDIA:KFDIA,1:KLEV,MODE_TRACERS_BY_MODS(JAERCLASS,JMOD)) -!!$ END IF -!!$ END DO -!!$ END DO -!!$ -!!$ call M7(KIDIA , KFDIA , KLON , KLEV , & -!!$ ! & KFLDX, KLEVX, KTRAC , KAERO , KCHEM, & -!!$ PRSF1,ZRH,PTP,& -!!$ ZSO4G,ZELVOC, ZSVOC,ZAERML,ZAERNL,& -!!$ ZRHOP,ZWW,ZM6RP,ZM6DRY,& -!!$ PTSPHY) CASE("hamm7") ! Initializations for submodel interface @@ -1067,7 +1046,7 @@ SUBROUTINE HAMM7_INTERFACE( & ZXTM1(KIDIA:KFDIA,1:KLEV,idt_cdnc) = (MAX(ZCDNCACT(KIDIA:KFDIA,1:KLEV),((1.0E6_JPRB)*1._JPRB)))/ZRHO(KIDIA:KFDIA,1:KLEV) ! [#/kg] and treshold CDNC to 1 cm-3 ZXTM1(KIDIA:KFDIA,1:KLEV,idt_icnc) = (1.0E6_JPRB)*ZICNC(KIDIA:KFDIA,1:KLEV)/ZRHO(KIDIA:KFDIA,1:KLEV) !ice crystal number conc = #/cm3 --> number mix rat [#/kg] PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH) = 1.0E-6_JPRB*(PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH)+MAX((ZCDNCACT(KIDIA:KFDIA,1:KLEV)),1.0E+6_JPRB)) ! add CDNC to PGFL field (convert from #/m3 to #/cm3) and treshold minimum value to 1 cm-3 - PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH) = 1.0E-6_JPRB*(PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH)+ZICNC(KIDIA:KFDIA,1:KLEV)*1.0E6_JPRB) ! add ICNC to PGFL field (does not need convert) + PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH) = 1.0E-6_JPRB*(PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH)+ZICNC(KIDIA:KFDIA,1:KLEV)*1.0E6_JPRB) ! add ICNC to PGFL field (does not need convert) - CHECK: no conversion in 43r3 !--> End store CDNC and ICNC From 5669f4114b03caee0021dc277670bb1ec761e86f Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Tue, 4 Mar 2025 16:43:22 +0100 Subject: [PATCH 045/129] Remove unneeded code and cleanup comments --- ifs-source/arpifs/m7/module/mo_ham_subm.F90 | 11 +++++------ ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 | 8 +------- ifs-source/arpifs/phys_ec/aer_so2so4_v2.F90 | 6 ++++-- 3 files changed, 10 insertions(+), 15 deletions(-) diff --git a/ifs-source/arpifs/m7/module/mo_ham_subm.F90 b/ifs-source/arpifs/m7/module/mo_ham_subm.F90 index 29babbc9..8297ce21 100755 --- a/ifs-source/arpifs/m7/module/mo_ham_subm.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_subm.F90 @@ -153,9 +153,9 @@ SUBROUTINE ham_subm_interface(kproma, kbdim, klev, krow, ktrac, & REAL(dp), OPTIONAL :: pgrvolm1(kbdim,klev) ! grid box volume [m3] REAL(dp), OPTIONAL :: ppbl (kbdim) ! Planetary boundary layer top level - REAL(dp), OPTIONAL :: pm6rp(kbdim,klev,nclass), & ! mean mode actual radius (wet for soluble and dry for insoluble modes) [cm] - pm6dry(kbdim,klev,nsol), & ! dry radius for soluble modes [cm] -> FMI suggests both radii unit should be [m] - prhop(kbdim,klev,nclass), & ! mean mode particle density [g cm-3] -> FMI suggests this unit should be [kg m-3] + REAL(dp), OPTIONAL :: pm6rp(kbdim,klev,nclass), & ! mean mode actual radius (wet for soluble and dry for insoluble modes) [m] + pm6dry(kbdim,klev,nsol), & ! dry radius for soluble modes [m] + prhop(kbdim,klev,nclass), & ! mean mode particle density [kg m-3] pww(kbdim,klev,nclass) ! aerosol water content for each mode [kg(water) m-3(air)] @@ -209,8 +209,7 @@ SUBROUTINE ham_subm_interface(kproma, kbdim, klev, krow, ktrac, & ! and ug m-3 for bc, oc, ss, and dust] zaernl(kbdim,klev,nclass), & ! aerosol number for each mode [cm-3] zm6rp(kbdim,klev,nclass), & ! mean mode actual radius (wet for soluble and dry for insoluble modes) [cm] - !!!zm6dry(kbdim,klev,nclass), & ! dry radius for soluble modes [cm] !!! wlh - zm6dry(kbdim,klev,nsol), & ! dry radius for soluble modes [cm] + zm6dry(kbdim,klev,nsol), & ! dry radius for soluble modes [cm] zrhop(kbdim,klev,nclass), & ! mean mode particle density [g cm-3] zww(kbdim,klev,nclass), & ! aerosol water content for each mode [kg(water) m-3(air)] zaervl(kbdim,klev,naerocomp) ! aerosol mass for individual compounds [molec. cm-3 for sulfate and ug m-3 for bc, oc, ss, and dust] !alaak @@ -618,7 +617,7 @@ SUBROUTINE ham_subm_interface(kproma, kbdim, klev, krow, ktrac, & !--- Dry Count Median Radius from [cm] to [m]: pm6dry(1:kproma,:,:) = zm6dry(1:kproma,:,:)/100._dp !--- Mean mode density from [g/cm3] to [kg/m3]: - prhop(1:kproma,:,:) = zrhop(1:kproma,:,:)*1000._dp !eehol: g/cm3 to kg/m3 + prhop(1:kproma,:,:) = zrhop(1:kproma,:,:)*1000._dp !--- Store diagnostic aerosol properties pww(1:kproma,:,:) = zww(1:kproma,:,:) #ifdef HAMMOZ diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index 47cfa126..ffac5716 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -273,7 +273,7 @@ SUBROUTINE HAMM7_INTERFACE( & INTEGER(KIND=JPIM) :: JEXT, ITRC, IKLEVTROP(KLON), IW INTEGER(KIND=JPIM) :: JO, JH, JY ! inside loop index for OIFS contex, HAM context and YAEROUT INTEGER(KIND=JPIM) :: JCLASS, JTILE, JMASS, JGAS, JCLOUD ! local loop indice for activation and dry deposition and tracer indexing -INTEGER(KIND=JPIM) :: ISSO2, ISSO4, ISSO4_ACS, INUM_ACS, INUM_COS +INTEGER(KIND=JPIM) :: ISSO2, ISSO4, ISSO4_ACS INTEGER(KIND=JPIM) :: IMODE INTEGER(KIND=JPIM) :: IFLAG @@ -740,12 +740,6 @@ SUBROUTINE HAMM7_INTERFACE( & DO JAER=1,NACTAERO IF (TRIM(YAERO(JAER)%CNAME)=='SO4_AS') THEN ISSO4_ACS=JAER - !EXIT !if looking three exit cannot be here FIXME: PLS DO NOT UNDERSTAND - ELSE IF (TRIM(YAERO(JAER)%CNAME)=='AS_N') THEN - INUM_ACS=JAER - ELSE IF (TRIM(YAERO(JAER)%CNAME)=='CS_N') THEN - INUM_COS=JAER - !write(2222,*)INUM_COS END IF END DO diff --git a/ifs-source/arpifs/phys_ec/aer_so2so4_v2.F90 b/ifs-source/arpifs/phys_ec/aer_so2so4_v2.F90 index 8bcdac2d..7cf433a9 100644 --- a/ifs-source/arpifs/phys_ec/aer_so2so4_v2.F90 +++ b/ifs-source/arpifs/phys_ec/aer_so2so4_v2.F90 @@ -308,8 +308,10 @@ SUBROUTINE AER_SO2SO4_V2 & !! Initialise tendencies (necessary when using sub-timesteps for chemistry, !! since the total tendency will be the sum of "sub-tendencies". -!! PLS: This was commented in 43r3, which seems logical since these -!! arrays are filled before calling the AER_SO2SO4_V2 in both hamm7_interface.F90 and aer_phy3.F90 +!! PLS: This was commented in 43r3, which seems logical since (case of INTENT(INOUT)) these +!! arrays are filled before calling the AER_SO2SO4_V2 in both hamm7_interface.F90 and aer_phy3.F90. +!! Tommi had an issue: when these were intent(out), these initialisations were needed +!! TODO: review when we test the latest implementation of the sulfur scheme. Things depend on the code outside this routine. PTSO2(KIDIA:KFDIA,:) = 0._JPRB PTSO4(KIDIA:KFDIA,:) = 0._JPRB PTSO4_AQ(KIDIA:KFDIA,:) = 0._JPRB From 05ef6e60ea9b93c14086d413e02af9e3d82f5d6a Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Tue, 4 Mar 2025 17:18:42 +0100 Subject: [PATCH 046/129] Fix issues OIFS-587 and OIFS-588 --- ifs-source/arpifs/m7/module/mo_ham_m7ctl.F90 | 7 +------ ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 | 14 ++++++-------- 2 files changed, 7 insertions(+), 14 deletions(-) diff --git a/ifs-source/arpifs/m7/module/mo_ham_m7ctl.F90 b/ifs-source/arpifs/m7/module/mo_ham_m7ctl.F90 index 0c790ef5..def0ccd1 100644 --- a/ifs-source/arpifs/m7/module/mo_ham_m7ctl.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_m7ctl.F90 @@ -76,7 +76,7 @@ MODULE mo_ham_m7ctl PUBLIC :: bk, rerg, r_kcal PUBLIC :: so4_coating_threshold - PUBLIC :: cmr2ras, cmr2mmr, cmedr2mmedr, cmr2ram, ram2cmr, cmr2smr + PUBLIC :: cmr2ras, cmr2mmr, cmedr2mmedr, cmr2ram, ram2cmr !--- 1) Define and pre-set switches for the processes of M7: ----------------------- @@ -190,8 +190,6 @@ MODULE mo_ham_m7ctl REAL(dp) :: ram2cmr(naeroclass(HAM_M7)) ! Conversion factor: radius of average mass to count median radius - REAL(dp) :: cmr2smr(naeroclass(HAM_M7)) ! Conversion factor: count median radius to surface mean radius - !--- 6) Assumed thresholds for occurence of specific quantities: ------------- REAL(dp), PARAMETER :: cmin_aerml = 1.E-15_dp , & ! threshold for aerosol mass @@ -436,9 +434,6 @@ SUBROUTINE m7_initialize cmr2ras(jclass) = EXP(1.0_dp*(LOG(sigma(jclass)))**2) - !--- Count Median Radius to surface Mean Radius: - cmr2mmr(jclass) = EXP(2.0_dp*(LOG(sigma(jclass)))**2) - !--- 2) Calculate the natural logarithm of the standard deviation: sigmaln(jclass) = LOG(sigma(jclass)) diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index ffac5716..c52f540a 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -1035,14 +1035,12 @@ SUBROUTINE HAMM7_INTERFACE( & !<-- End activation for HAM-M7 !----------------------------------------------------------------- - - !<-- Store CDNC (number of activated particles) and ICNC as a number mixing ratio to tracer values and to PGFL fields - ZXTM1(KIDIA:KFDIA,1:KLEV,idt_cdnc) = (MAX(ZCDNCACT(KIDIA:KFDIA,1:KLEV),((1.0E6_JPRB)*1._JPRB)))/ZRHO(KIDIA:KFDIA,1:KLEV) ! [#/kg] and treshold CDNC to 1 cm-3 - ZXTM1(KIDIA:KFDIA,1:KLEV,idt_icnc) = (1.0E6_JPRB)*ZICNC(KIDIA:KFDIA,1:KLEV)/ZRHO(KIDIA:KFDIA,1:KLEV) !ice crystal number conc = #/cm3 --> number mix rat [#/kg] - PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH) = 1.0E-6_JPRB*(PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH)+MAX((ZCDNCACT(KIDIA:KFDIA,1:KLEV)),1.0E+6_JPRB)) ! add CDNC to PGFL field (convert from #/m3 to #/cm3) and treshold minimum value to 1 cm-3 - PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH) = 1.0E-6_JPRB*(PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH)+ZICNC(KIDIA:KFDIA,1:KLEV)*1.0E6_JPRB) ! add ICNC to PGFL field (does not need convert) - CHECK: no conversion in 43r3 - !--> End store CDNC and ICNC - + !<-- Store CDNC (number of activated particles) and ICNC as a number mixing ratio to tracer values and to PGFL fields + ZXTM1(KIDIA:KFDIA,1:KLEV,idt_cdnc) = (MAX(ZCDNCACT(KIDIA:KFDIA,1:KLEV),((1.0E6_JPRB)*1._JPRB)))/ZRHO(KIDIA:KFDIA,1:KLEV) ! [#/kg] and treshold CDNC to 1 cm-3 + ZXTM1(KIDIA:KFDIA,1:KLEV,idt_icnc) = (1.0E6_JPRB)*ZICNC(KIDIA:KFDIA,1:KLEV)/ZRHO(KIDIA:KFDIA,1:KLEV) !ice crystal number conc = #/cm3 --> number mix rat [#/kg] + PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH) = 1.0E-6_JPRB*( MAX(ZCDNCACT(KIDIA:KFDIA,1:KLEV), 1.0E+6_JPRB)) ! convert from #/m3 to #/cm3 and treshold minimum value to 1 cm-3 + PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH) = ZICNC(KIDIA:KFDIA,1:KLEV) ! no conversion needed: already in #/cm3 + !--> End store CDNC and ICNC !----------------------------------------------------------------- !--> Calculation for effective radii and put to PGFL fields From c8b9c3ec3e524fca24b04196a477fbbf44a70d18 Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Thu, 6 Mar 2025 08:18:25 +0100 Subject: [PATCH 047/129] Enforce minimum value for Ice Number Concentration --- .../arpifs/m7/phys_ec/hamm7_interface.F90 | 2 +- ifs-source/arpifs/phys_ec/callpar.F90 | 20 +++++++++---------- ifs-source/arpifs/setup/sugfl1.F90 | 1 - 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index c52f540a..cbbc5df1 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -1039,7 +1039,7 @@ SUBROUTINE HAMM7_INTERFACE( & ZXTM1(KIDIA:KFDIA,1:KLEV,idt_cdnc) = (MAX(ZCDNCACT(KIDIA:KFDIA,1:KLEV),((1.0E6_JPRB)*1._JPRB)))/ZRHO(KIDIA:KFDIA,1:KLEV) ! [#/kg] and treshold CDNC to 1 cm-3 ZXTM1(KIDIA:KFDIA,1:KLEV,idt_icnc) = (1.0E6_JPRB)*ZICNC(KIDIA:KFDIA,1:KLEV)/ZRHO(KIDIA:KFDIA,1:KLEV) !ice crystal number conc = #/cm3 --> number mix rat [#/kg] PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH) = 1.0E-6_JPRB*( MAX(ZCDNCACT(KIDIA:KFDIA,1:KLEV), 1.0E+6_JPRB)) ! convert from #/m3 to #/cm3 and treshold minimum value to 1 cm-3 - PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH) = ZICNC(KIDIA:KFDIA,1:KLEV) ! no conversion needed: already in #/cm3 + PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH) = MAX( ZICNC(KIDIA:KFDIA,1:KLEV), 0.027_JPRB) ! no conversion needed: already in #/cm3, just max of default value (RNICE in sucldp.F90) and icnc !--> End store CDNC and ICNC !----------------------------------------------------------------- diff --git a/ifs-source/arpifs/phys_ec/callpar.F90 b/ifs-source/arpifs/phys_ec/callpar.F90 index c4177d94..14d0d363 100644 --- a/ifs-source/arpifs/phys_ec/callpar.F90 +++ b/ifs-source/arpifs/phys_ec/callpar.F90 @@ -1120,16 +1120,16 @@ SUBROUTINE CALLPAR(YDGEOMETRY,YDVARS,YDSURF,YDMODEL,KDIM,& ! ------------------------------------------------------ IF (NAERCLD > 0) THEN - SELECT CASE (TRIM(AERO_SCHEME)) - CASE ("hamm7")!!! introduce this to avoid modification within cloud_layer.F90 - ! Note that in 43r3, ccn=max(.,1) and nice=max(.,0.027) - AUXL%ZCCN(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV) = PGFL(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV,YGFL%YCDNC%MP9_PH)!!! liquid cloud condensation nuclei - AUXL%ZNICE(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV) = PGFL(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV,YGFL%YICNC%MP9_PH)!!! ice number concentration (cf. CCN) - CASE ("aer3") - CALL AER_CLOUD_LAYER(YDMODEL,KDIM,PAUX,STATE_T0,PDIAG,GEMSL,AUXL) - CASE DEFAULT - CALL ABOR1(" NO AEROSOL SCHEME "//TRIM(AERO_SCHEME) ) - END SELECT + SELECT CASE (TRIM(AERO_SCHEME)) + CASE ("hamm7") + ! To avoid modification within cloud_layer.F90 + AUXL%ZCCN(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV) = PGFL(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV,YGFL%YCDNC%MP9_PH) ! liquid cloud condensation nuclei + AUXL%ZNICE(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV) = PGFL(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV,YGFL%YICNC%MP9_PH) ! ice number concentration (cf. CCN) + CASE ("aer3") + CALL AER_CLOUD_LAYER(YDMODEL,KDIM,PAUX,STATE_T0,PDIAG,GEMSL,AUXL) + CASE DEFAULT + CALL ABOR1(" NO AEROSOL SCHEME "//TRIM(AERO_SCHEME) ) + END SELECT ELSE ! routine is by-passed AUXL%ZLCRIT_AER(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV)=0.0_JPRB diff --git a/ifs-source/arpifs/setup/sugfl1.F90 b/ifs-source/arpifs/setup/sugfl1.F90 index b8735a08..5f72544a 100644 --- a/ifs-source/arpifs/setup/sugfl1.F90 +++ b/ifs-source/arpifs/setup/sugfl1.F90 @@ -110,7 +110,6 @@ SUBROUTINE SUGFL1(YDMODEL,KGFLCONF) & LCOMPO_DCDD, & & LAERNITRATE, LAEREQSAM4CLIM, LAERSOA, LINJ, LAEROSFC, LAERSOA_COUPLED, LCHEM_REVCHEM, LAERRESUSPENSION, LAERNUCL, & & LCHEM_ARPCLIM -!LH & LAERNITRATE, LAEREQSAM4CLIM, LAERSOA, LINJ, LAERSOA_COUPLED, LCHEM_REVCHEM, LAERRESUSPENSION, LAERNUCL, & REAL(KIND=JPRB), POINTER :: RCHEM_DIA_PERIOD From 90b72442c526b270055638519ff4f418192d29dd Mon Sep 17 00:00:00 2001 From: Harri Kokkola Date: Mon, 10 Mar 2025 15:29:37 +0000 Subject: [PATCH 048/129] Pull request #22: Fix use of CDNC in the Khairoutdinov and Kogan autoconversion scheme Merge in ~NM6/openifs-48r1 from knmi-m7-kk to knmi-m7 Squashed commit of the following: commit 61e63baf3cde4896a94732ab15a86dd2d6999099 Author: Philippe Le Sager Date: Mon Mar 10 15:27:00 2025 +0100 Remove undesired changes commit eaf149b3fd2cef3ee97acc63e900dee44a66d5de Author: kokkolah Date: Wed Mar 5 12:32:37 2025 +0200 OIFS-593: Fixes to use CDNC in the Khairoutdinov and Kogan autoconversion scheme. Requires NCLOUDACT > 0 to use with M7. commit 82fcbe517347393d520a85cd1b45b2321d9d0f0d Author: kokkolah Date: Wed Feb 19 08:51:46 2025 +0200 OIFS-593: CDNC from aerosol-cloud activation scheme coupled to the Khairoutdinov and Kogan (2000) scheme in cloudsc.F90 commit 98e5daaa35f0243d20168cf3e1ffa1358525ced4 Author: nld6854 Date: Fri Aug 2 08:29:01 2024 +0000 failed with build --- ifs-source/arpifs/phys_ec/callpar.F90 | 7 ++--- ifs-source/arpifs/phys_ec/cloudsc.F90 | 27 +++++++++++++++---- .../module/radiation_cloud_optics.F90 | 10 ++++--- 3 files changed, 33 insertions(+), 11 deletions(-) diff --git a/ifs-source/arpifs/phys_ec/callpar.F90 b/ifs-source/arpifs/phys_ec/callpar.F90 index 14d0d363..fab5b7a7 100644 --- a/ifs-source/arpifs/phys_ec/callpar.F90 +++ b/ifs-source/arpifs/phys_ec/callpar.F90 @@ -480,7 +480,8 @@ SUBROUTINE CALLPAR(YDGEOMETRY,YDVARS,YDSURF,YDMODEL,KDIM,& & AERO_SCHEME=>YDCOMPO%AERO_SCHEME, LCLDBUD_TIMEINT=>YDECLDP%LCLDBUD_TIMEINT, & & LAERSOA=>YDCOMPO%LAERSOA, & & TSPHY=>YDPHY2%TSPHY, LELIGHT=>YDEPHY%LELIGHT, LESNML=>YDEPHY%LESNML,& - & NSNMLWS=>YDEPHY%NSNMLWS) + & NSNMLWS=>YDEPHY%NSNMLWS, & + & NCLOUDACT=>YDERAD%NCLOUDACT ) ! ------------------------------------------------------------------ !* 0. INITIALIZATION @@ -1119,13 +1120,13 @@ SUBROUTINE CALLPAR(YDGEOMETRY,YDVARS,YDSURF,YDMODEL,KDIM,& !* 5a. get the aerosols to pass down to the cloud schemes ! ------------------------------------------------------ -IF (NAERCLD > 0) THEN +IF (NAERCLD > 0 .OR. NCLOUDACT > 0) THEN SELECT CASE (TRIM(AERO_SCHEME)) CASE ("hamm7") ! To avoid modification within cloud_layer.F90 AUXL%ZCCN(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV) = PGFL(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV,YGFL%YCDNC%MP9_PH) ! liquid cloud condensation nuclei AUXL%ZNICE(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV) = PGFL(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV,YGFL%YICNC%MP9_PH) ! ice number concentration (cf. CCN) - CASE ("aer3") + CASE ("aer") CALL AER_CLOUD_LAYER(YDMODEL,KDIM,PAUX,STATE_T0,PDIAG,GEMSL,AUXL) CASE DEFAULT CALL ABOR1(" NO AEROSOL SCHEME "//TRIM(AERO_SCHEME) ) diff --git a/ifs-source/arpifs/phys_ec/cloudsc.F90 b/ifs-source/arpifs/phys_ec/cloudsc.F90 index d53ec6fb..b9567710 100644 --- a/ifs-source/arpifs/phys_ec/cloudsc.F90 +++ b/ifs-source/arpifs/phys_ec/cloudsc.F90 @@ -663,7 +663,8 @@ SUBROUTINE CLOUDSC & & RCL_INHOMOGAUT => YDECLDP%RCL_INHOMOGAUT, & & RCL_INHOMOGACC => YDECLDP%RCL_INHOMOGACC, & & RCL_OVERLAPLIQICE => YDECLDP%RCL_OVERLAPLIQICE, & - & RCL_EFFRIME => YDECLDP%RCL_EFFRIME ) + & RCL_EFFRIME => YDECLDP%RCL_EFFRIME, & + & NCLOUDACT => YDERAD%NCLOUDACT) !=============================================================================== @@ -2008,20 +2009,36 @@ SUBROUTINE CLOUDSC & IF (LLPERT_RCLCRIT) THEN !Apply SPP perturbations IF (PLSM(JL) > 0.5_JPRB) THEN - ZCONST = RCL_KK_CLOUD_NUM_LAND ! FPE triggered below when using PCCN(JL,JK) here + IF (NCLOUDACT > 0) THEN + ZCONST = MAX(1.0_JPRB,PCCN(JL,JK)) ! CDNC from the cloud activation scheme + ELSE + ZCONST = RCL_KK_CLOUD_NUM_LAND ! constant value over land + END IF ! perturbed land value of RCLCRIT ZLCRIT = RCLCRIT_LAND*EXP(PN1RCLCRIT%MU(1)+PN1RCLCRIT%XMAG(1)*PGP2DSPP(JL, IPRCLCRIT)) ELSE - ZCONST = RCL_KK_CLOUD_NUM_SEA ! FPE triggered below when using PCCN(JL,JK) here + IF (NCLOUDACT > 0) THEN + ZCONST = MAX(1.0_JPRB,PCCN(JL,JK)) + ELSE + ZCONST = RCL_KK_CLOUD_NUM_SEA ! constant value over ocean + END IF ! perturbed ocean value of RCLCRIT ZLCRIT = RCLCRIT_SEA *EXP(PN1RCLCRIT%MU(2)+PN1RCLCRIT%XMAG(2)*PGP2DSPP(JL, IPRCLCRIT)) ENDIF ELSE IF (PLSM(JL) > 0.5_JPRB) THEN ! land (unperturbed) - ZCONST = RCL_KK_CLOUD_NUM_LAND ! FPE triggered below when using PCCN(JL,JK) here + IF (NCLOUDACT > 0) THEN + ZCONST = MAX(1.0_JPRB,PCCN(JL,JK)) ! CDNC from the cloud activation scheme + ELSE + ZCONST = RCL_KK_CLOUD_NUM_LAND ! constant value over land + END IF ZLCRIT = RCLCRIT_LAND ELSE ! ocean (unperturbed) - ZCONST = RCL_KK_CLOUD_NUM_SEA ! FPE triggered below when using PCCN(JL,JK) here + IF (NCLOUDACT > 0) THEN + ZCONST = MAX(1.0_JPRB,PCCN(JL,JK)) + ELSE + ZCONST = RCL_KK_CLOUD_NUM_SEA ! constant value over ocean + END IF ZLCRIT = RCLCRIT_SEA ENDIF ENDIF diff --git a/ifs-source/radiation/module/radiation_cloud_optics.F90 b/ifs-source/radiation/module/radiation_cloud_optics.F90 index a0c5b322..cf526427 100644 --- a/ifs-source/radiation/module/radiation_cloud_optics.F90 +++ b/ifs-source/radiation/module/radiation_cloud_optics.F90 @@ -466,9 +466,13 @@ subroutine cloud_optics(nlev,istartcol,iendcol, & & + od_lw_ice - scat_od_lw_ice end if od_sw_cloud(:,jlev,jcol) = od_sw_liq + od_sw_ice - g_sw_cloud(:,jlev,jcol) = (g_sw_liq * scat_od_sw_liq & - & + g_sw_ice * scat_od_sw_ice) & - & / (scat_od_sw_liq + scat_od_sw_ice) + where (scat_od_sw_liq+scat_od_sw_ice > 0.0_jprb) + g_sw_cloud(:,jlev,jcol) = (g_sw_liq * scat_od_sw_liq & + & + g_sw_ice * scat_od_sw_ice) & + & / (scat_od_sw_liq + scat_od_sw_ice) + elsewhere + g_sw_cloud(:,jlev,jcol) = 0.0_jprb + end where ssa_sw_cloud(:,jlev,jcol) & & = (scat_od_sw_liq + scat_od_sw_ice) / (od_sw_liq + od_sw_ice) end if ! Cloud present From 1a785b7a713dffd6c96017cea4fd3d7f9ad35ac1 Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Wed, 12 Mar 2025 10:02:52 +0000 Subject: [PATCH 049/129] Pull request #23: OIFS-565 Limit Meyer ice nucleation and remove last references to tm5m7 aerosol scheme Merge in ~NM6/openifs-48r1 from cleanup to knmi-m7 Squashed commit of the following: commit 658d349a8de3fbab25c5a750e1e8c0a80205b368 Author: Philippe Le Sager Date: Wed Mar 12 11:00:14 2025 +0100 Catch unsupported setup commit 1585d84f9a803eb62717ec9092074fd5db34cb0b Author: Philippe Le Sager Date: Tue Mar 11 17:01:51 2025 +0100 OIFS-565 Limit Meyers ice nucleation to T>-38C commit fbd90d53141b154edc494ca3d081908731a2bd56 Author: Philippe Le Sager Date: Tue Mar 11 09:29:04 2025 +0100 Fix ice deposition bug commit e23b13fe14c9fae2c6502320f3751f2e426c80f5 Author: Philippe Le Sager Date: Mon Mar 10 17:54:52 2025 +0100 Remove last references to tm5m7 aerosol scheme --- ifs-source/arpifs/chem/chem_tm5.F90 | 2 +- ifs-source/arpifs/control/cnt4.F90 | 2 - ifs-source/arpifs/m7/tm5m7_init.F90 | 192 ++++++--------------- ifs-source/arpifs/phys_ec/aer_rad.F90 | 4 + ifs-source/arpifs/phys_ec/aerini_layer.F90 | 2 +- ifs-source/arpifs/phys_ec/cloudsc.F90 | 4 +- ifs-source/arpifs/phys_ec/su_aerw.F90 | 4 +- ifs-source/arpifs/setup/su_surf_flds.F90 | 6 +- ifs-source/arpifs/setup/sugfl3.F90 | 4 +- 9 files changed, 68 insertions(+), 152 deletions(-) diff --git a/ifs-source/arpifs/chem/chem_tm5.F90 b/ifs-source/arpifs/chem/chem_tm5.F90 index bf920aa6..4c55e85a 100644 --- a/ifs-source/arpifs/chem/chem_tm5.F90 +++ b/ifs-source/arpifs/chem/chem_tm5.F90 @@ -503,7 +503,7 @@ SUBROUTINE CHEM_TM5& ! ITAU_MACC = 2_JPIM ! Use simple (but wrong) climatology for aerosol optical depth if no prognostic MACC aerosol is used IF ( LCHEM_AEROI ) THEN - IF (TRIM(AERO_SCHEME)=="aer" .OR. TRIM(AERO_SCHEME)=="hamm7")THEN !FIXME: no M7 and LCHEM_AEROI? + IF (TRIM(AERO_SCHEME)=="aer") THEN !FIXME: M7 and LCHEM_AEROI - see OIFS-568 ! * from MACC fields CALL TM5_MACC_AEROSOL(KIDIA,KFDIA,KLON,KLEV, KAERO, & & PRS1 , PAEROP , ZRHCL , & diff --git a/ifs-source/arpifs/control/cnt4.F90 b/ifs-source/arpifs/control/cnt4.F90 index f6fbbb9e..2eccef5a 100644 --- a/ifs-source/arpifs/control/cnt4.F90 +++ b/ifs-source/arpifs/control/cnt4.F90 @@ -507,8 +507,6 @@ SUBROUTINE CNT4(YDGEOMETRY,YDFIELDS,YDMTRAJ,YDMODEL,YDJOT,YDVARBC,YDTCV,YDGOM5,Y CASE ("aer") ! Setup of 'aer' configuration is done in su_aerw.F90 - CASE ("tm5m7") - CALL TM5M7_INIT(YDGEOMETRY, YDMODEL%YRML_CHEM%YRCOMPO, YGFL, YDMODEL%YRML_PHY_RAD%YRERAD) CASE ("hamm7") ! HAM-M7 only calculates aerosol micro-physics, ! all other processes are dealt with in TM5-M7 diff --git a/ifs-source/arpifs/m7/tm5m7_init.F90 b/ifs-source/arpifs/m7/tm5m7_init.F90 index 3b7aff1d..2cbd0157 100755 --- a/ifs-source/arpifs/m7/tm5m7_init.F90 +++ b/ifs-source/arpifs/m7/tm5m7_init.F90 @@ -24,8 +24,6 @@ SUBROUTINE TM5M7_INIT(YDGEOMETRY, YRCOMPO, YGFL, YDERAD) ! -------------- ! ORIGINAL : 2020-08-24 - - USE GEOMETRY_MOD, ONLY : GEOMETRY USE PARKIND1, ONLY : JPRB, JPIM USE YOMHOOK, ONLY : LHOOK, DR_HOOK, JPHOOK @@ -50,7 +48,6 @@ SUBROUTINE TM5M7_INIT(YDGEOMETRY, YRCOMPO, YGFL, YDERAD) IMPLICIT NONE - TYPE(GEOMETRY) ,INTENT(IN) :: YDGEOMETRY TYPE(TCOMPO) ,INTENT(IN) :: YRCOMPO TYPE(TYPE_GFLD) ,INTENT(IN) :: YGFL @@ -64,7 +61,6 @@ SUBROUTINE TM5M7_INIT(YDGEOMETRY, YRCOMPO, YGFL, YDERAD) REAL(KIND=JPHOOK) :: ZHOOK_HANDLE - !----------------------------------------------------------------------- !----------------------------------------------------------------------- #include "abor1.intfb.h" @@ -82,7 +78,6 @@ SUBROUTINE TM5M7_INIT(YDGEOMETRY, YRCOMPO, YGFL, YDERAD) !* Init aerosol scheme ! --------------- - SELECT CASE (TRIM(AERO_SCHEME)) CASE ("aer") @@ -91,75 +86,14 @@ SUBROUTINE TM5M7_INIT(YDGEOMETRY, YRCOMPO, YGFL, YDERAD) IF (LHOOK) CALL DR_HOOK('TM5M7_INIT',1,ZHOOK_HANDLE) RETURN - CASE ("tm5m7","hamm7") + CASE ("hamm7") - ! initialization of tm5m7 aerosol tracer indices. All may be moved to a separate - ! routine, if becomse too lengthy. - -! Following now handled in hamm7_init - -!!$ ! Make sure that aerosol indices are set correctly -!!$ DO JK=1,NAERO -!!$ -!!$ LLFOUND = .FALSE. -!!$ SELECT CASE (TRIM(YAERO(JK)%CNAME) ) -!!$ CASE ('SO4') ; LLFOUND = (ISO4 == JK) -!!$ CASE ('NH4') ; LLFOUND = (INH4 == JK) -!!$ CASE ('NO3_A') ; LLFOUND = (INO3_A == JK) -!!$ CASE ('ACS_N') ; LLFOUND = (IACS_N == JK) -!!$ CASE ('SO4ACS'); LLFOUND = (ISO4ACS == JK) -!!$ CASE ('BCACS') ; LLFOUND = (IBCACS == JK) -!!$ CASE ('POMACS'); LLFOUND = (IPOMACS == JK) -!!$ CASE ('SSACS') ; LLFOUND = (ISSACS == JK) -!!$ CASE ('DUACS') ; LLFOUND = (IDUACS == JK) -!!$ CASE ('SOANUS'); LLFOUND = (ISOANUS == JK) -!!$ CASE ('SOAAIS'); LLFOUND = (ISOAAIS == JK) -!!$ CASE ('SOAACS'); LLFOUND = (ISOAACS == JK) -!!$ CASE ('SOACOS'); LLFOUND = (ISOACOS == JK) -!!$ CASE ('SOAAII'); LLFOUND = (ISOAAII == JK) -!!$ CASE ('H2OPART');LLFOUND = (IH2OPART == JK) -!!$ CASE ('AII_N') ; LLFOUND = (IAII_N == JK) -!!$ CASE ('BCAII') ; LLFOUND = (IBCAII == JK) -!!$ CASE ('POMAII'); LLFOUND = (IPOMAII == JK) -!!$ CASE ('ACI_N') ; LLFOUND = (IACI_N == JK) -!!$ CASE ('DUACI') ; LLFOUND = (IDUACI == JK) -!!$ CASE ('AIS_N') ; LLFOUND = (IAIS_N == JK) -!!$ CASE ('SO4AIS'); LLFOUND = (ISO4AIS == JK) -!!$ CASE ('BCAIS') ; LLFOUND = (IBCAIS == JK) -!!$ CASE ('POMAIS'); LLFOUND = (IPOMAIS == JK) -!!$ CASE ('COI_N') ; LLFOUND = (ICOI_N == JK) -!!$ CASE ('DUCOI') ; LLFOUND = (IDUCOI == JK) -!!$ CASE ('COS_N') ; LLFOUND = (ICOS_N == JK) -!!$ CASE ('SO4COS'); LLFOUND = (ISO4COS == JK) -!!$ CASE ('BCCOS') ; LLFOUND = (IBCCOS == JK) -!!$ CASE ('POMCOS'); LLFOUND = (IPOMCOS == JK) -!!$ CASE ('SSCOS') ; LLFOUND = (ISSCOS == JK) -!!$ CASE ('DUCOS') ; LLFOUND = (IDUCOS == JK) -!!$ CASE ('NUS_N') ; LLFOUND = (INUS_N == JK) -!!$ CASE ('SO4NUS'); LLFOUND = (ISO4NUS == JK) -!!$ CASE ('ELVOC') ; LLFOUND = (IELVOC == JK) -!!$ CASE ('ISVOC') ; LLFOUND = (IISVOC == JK) -!!$ CASE ('MSA') ; LLFOUND = (IMSA == JK) -!!$ CASE ('Total_aerosol') ; LLFOUND = .TRUE. -!!$ -!!$ CASE DEFAULT -!!$ WRITE(NULOUT,*) 'ERROR tm5m7_init: no matching aerosol name for '//TRIM(YAERO(JK)%CNAME) -!!$ CALL ABOR1('tm5m7_init: No matching tracer name available') -!!$ END SELECT -!!$ -!!$ IF (.NOT. LLFOUND) THEN -!!$ WRITE(NULOUT,*) 'ERROR tm5m7_init: Wrong tracer index or status for '//TRIM(YAERO(JK)%CNAME) -!!$ CALL ABOR1('tm5m7_init: wrong tracer index or tracer name') -!!$ ENDIF -!!$ -!!$ ENDDO + ! Initialization of tm5m7 aerosol tracer indices is handled in hamm7_init -! CALL TM5M7_DIAGNOSTICS_DATA + ! Initialize various dust properties + CALL TM5M7_SRC_DUST_INIT - ! Initialize various dust properties - CALL TM5M7_SRC_DUST_INIT - - !IF(.not.LAERCHEM)THEN + !IF(.not.LAERCHEM)THEN ! Initialize optics: ! Make sure that 'WAVE' is already initialized (in tm5_init.F90) !IF (.NOT. LL_TM5_PHOTO_INI) THEN @@ -170,74 +104,58 @@ SUBROUTINE TM5M7_INIT(YDGEOMETRY, YRCOMPO, YGFL, YDERAD) ! END if !ENDIF - !END IF - ! define wavelengths for optics calculations - nwdep = nbands_trop + count(lmid.ne.lmid_gridA) - wav_grid = 0 - wav_gridA = 0 - allocate(photo_wavelengths(nwdep)) + !END IF + + ! Define wavelengths for optics calculations + nwdep = nbands_trop + count(lmid.ne.lmid_gridA) + wav_grid = 0 + wav_gridA = 0 + allocate(photo_wavelengths(nwdep)) - JL=1 - do JI=1,nbands_trop + JL=1 + do JI=1,nbands_trop if (lmid(JI)==lmid_gridA(JI)) then - photo_wavelengths(JL) = wave(lmid(JI))*1.e4 ! cm to um - wav_grid(JI) = JL - wav_gridA(JI) = JL - JL=JL+1 + photo_wavelengths(JL) = wave(lmid(JI))*1.e4 ! cm to um + wav_grid(JI) = JL + wav_gridA(JI) = JL + JL=JL+1 else - photo_wavelengths(JL) = wave(lmid(JI))*1.e4 ! cm to um - photo_wavelengths(JL+1) = wave(lmid_gridA(JI))*1.e4 ! cm to um - wav_grid(JI) = JL - wav_gridA(JI) = JL+1 - JL=JL+2 + photo_wavelengths(JL) = wave(lmid(JI))*1.e4 ! cm to um + photo_wavelengths(JL+1) = wave(lmid_gridA(JI))*1.e4 ! cm to um + wav_grid(JI) = JL + wav_gridA(JI) = JL+1 + JL=JL+2 endif - enddo - allocate(wdep(nwdep)) - wdep(:)%wl = photo_wavelengths - wdep(:)%split = .false. - wdep(:)%insitu = .false. - - CALL TM5M7_OPTICS_INIT(NWDEP,WDEP) - - - if (allocated(photo_wavelengths)) deallocate(photo_wavelengths) - if (allocated(wdep)) deallocate(wdep) - -! nwdep=14 -! !! A.Laakso: Taken from ecearth_optics (TM5-ECEARTH3) - ! HAM aerosol optics are using these too - NASWBAND=YDERAD%NTSW - if (allocated(ASWBAND)) deallocate(ASWBAND) - allocate(ASWBAND(YDERAD%NTSW)) - ASWBAND(13)%wl = 0.257_JPRB - ASWBAND(12)%wl = 0.313_JPRB - ASWBAND(11)%wl = 0.398_JPRB - ASWBAND(10)%wl = 0.530_JPRB - ASWBAND( 9)%wl = 0.697_JPRB - ASWBAND( 8)%wl = 0.973_JPRB - ASWBAND( 7)%wl = 1.269_JPRB - ASWBAND( 6)%wl = 1.447_JPRB - ASWBAND( 5)%wl = 1.767_JPRB - ASWBAND( 4)%wl = 2.040_JPRB - ASWBAND( 3)%wl = 2.308_JPRB - ASWBAND( 2)%wl = 2.752_JPRB - ASWBAND( 1)%wl = 3.407_JPRB - ASWBAND(14)%wl = 5.254_JPRB - -! ASWBAND( 1)%wl = 0.257 -! ASWBAND( 2)%wl = 0.313 -! ASWBAND( 3)%wl = 0.398 -! ASWBAND( 4)%wl = 0.530 -! ASWBAND( 5)%wl = 0.697 -! ASWBAND( 6)%wl = 0.973 -! ASWBAND( 7)%wl = 1.269 -! ASWBAND( 8)%wl = 1.447 -! ASWBAND( 9)%wl = 1.767 -! ASWBAND(10)%wl = 2.040 -! ASWBAND(11)%wl = 2.308 -! ASWBAND(12)%wl = 2.752 -! ASWBAND(13)%wl = 3.407 -! ASWBAND(14)%wl = 5.254 + enddo + allocate(wdep(nwdep)) + wdep(:)%wl = photo_wavelengths + wdep(:)%split = .false. + wdep(:)%insitu = .false. + + CALL TM5M7_OPTICS_INIT(NWDEP,WDEP) + + if (allocated(photo_wavelengths)) deallocate(photo_wavelengths) + if (allocated(wdep)) deallocate(wdep) + + ! A.Laakso: Taken from ecearth_optics (TM5-ECEARTH3) + ! HAM aerosol optics are using these too + NASWBAND=YDERAD%NTSW + if (allocated(ASWBAND)) deallocate(ASWBAND) + allocate(ASWBAND(YDERAD%NTSW)) + ASWBAND(13)%wl = 0.257_JPRB + ASWBAND(12)%wl = 0.313_JPRB + ASWBAND(11)%wl = 0.398_JPRB + ASWBAND(10)%wl = 0.530_JPRB + ASWBAND( 9)%wl = 0.697_JPRB + ASWBAND( 8)%wl = 0.973_JPRB + ASWBAND( 7)%wl = 1.269_JPRB + ASWBAND( 6)%wl = 1.447_JPRB + ASWBAND( 5)%wl = 1.767_JPRB + ASWBAND( 4)%wl = 2.040_JPRB + ASWBAND( 3)%wl = 2.308_JPRB + ASWBAND( 2)%wl = 2.752_JPRB + ASWBAND( 1)%wl = 3.407_JPRB + ASWBAND(14)%wl = 5.254_JPRB ASWBAND(:)%split = .false. ASWBAND(:)%insitu = .false. @@ -254,7 +172,6 @@ SUBROUTINE TM5M7_INIT(YDGEOMETRY, YRCOMPO, YGFL, YDERAD) & 1080._JPRB,1180._JPRB,1390._JPRB,1480._JPRB,1800._JPRB,2080._JPRB, & & 2250._JPRB,2380._JPRB,2600._JPRB,3250._JPRB/) - CASE DEFAULT ! Option not implemented @@ -262,9 +179,6 @@ SUBROUTINE TM5M7_INIT(YDGEOMETRY, YRCOMPO, YGFL, YDERAD) END SELECT - - END ASSOCIATE IF (LHOOK) CALL DR_HOOK('TM5M7_INIT',1,ZHOOK_HANDLE) END SUBROUTINE TM5M7_INIT - diff --git a/ifs-source/arpifs/phys_ec/aer_rad.F90 b/ifs-source/arpifs/phys_ec/aer_rad.F90 index f978fab1..d72f4b6f 100644 --- a/ifs-source/arpifs/phys_ec/aer_rad.F90 +++ b/ifs-source/arpifs/phys_ec/aer_rad.F90 @@ -86,6 +86,7 @@ SUBROUTINE AER_RAD & LOGICAL :: LLPHYLIN !----------------------------------------------------------------------- +#include "abor1.intfb.h" #include "satur.intfb.h" REAL(KIND=JPHOOK) :: ZHOOK_HANDLE @@ -242,6 +243,9 @@ SUBROUTINE AER_RAD & ITYP=YAERO_DESC(JAER)%NTYP IBIN=YAERO_DESC(JAER)%NBIN + CASE ("hamm7") + CALL ABOR1(" AEROSOL SCHEME hamm7 not supported yet in UV-radiation processor" ) + END SELECT IF (ITYP <= 8) THEN diff --git a/ifs-source/arpifs/phys_ec/aerini_layer.F90 b/ifs-source/arpifs/phys_ec/aerini_layer.F90 index 43dad335..1b45309e 100644 --- a/ifs-source/arpifs/phys_ec/aerini_layer.F90 +++ b/ifs-source/arpifs/phys_ec/aerini_layer.F90 @@ -206,7 +206,7 @@ SUBROUTINE AERINI_LAYER(YDGEOMETRY,YDSURF,& ! HAM-M7 only implements the micro-physics part ! all other processes are still handled by the TM5-M7 code - CASE ("tm5m7", "hamm7") + CASE ("hamm7") CALL TM5M7_PHY2( & & YDGEOMETRY, YDMODEL, KDIM%KIDIA, KDIM%KFDIA, KDIM%KLON , KDIM%KTDIA, KDIM%KLEV, KDIM%KFLDX , KDIM%KLEVX,& diff --git a/ifs-source/arpifs/phys_ec/cloudsc.F90 b/ifs-source/arpifs/phys_ec/cloudsc.F90 index b9567710..acb39334 100644 --- a/ifs-source/arpifs/phys_ec/cloudsc.F90 +++ b/ifs-source/arpifs/phys_ec/cloudsc.F90 @@ -2407,7 +2407,7 @@ SUBROUTINE CLOUDSC & !-------------------------------------------------------------- ZSUPERSATICE = (ZQSLIQ(JL,JK)-ZQSICE(JL,JK))/ZQSICE(JL,JK) - IF (ZTP1(JL,JK)<(RTT-5._JPRB) .AND. ZQXFG(JL,NCLDQL)>RLMIN) THEN ! T<273K + IF (ZTP1(JL,JK)>=RTHOMO .AND. ZTP1(JL,JK)<(RTT-5._JPRB) .AND. ZQXFG(JL,NCLDQL)>RLMIN) THEN ! 235.15= YSD_VF%YVF(JPMAXSFLDS) ! -IF (TRIM(AERO_SCHEME)=="tm5m7" .or. TRIM(AERO_SCHEME)=="hamm7" ) THEN +IF ( TRIM(AERO_SCHEME)=="hamm7" ) THEN YSD_VF%YSOILTYPE=> YSD_VF%YVF(JPMAXSFLDS) ENDIF @@ -1322,8 +1322,8 @@ SUBROUTINE SU_SURF_FLDS(YDDIMV,YDSURF,YDMODEL,LDVERBOSE) ! ENDIF - !TM5/M7 ancillary data - IF (TRIM(AERO_SCHEME) == "tm5m7" .or. TRIM(AERO_SCHEME) == "hamm7" ) THEN + !HAM_M7 ancillary data + IF ( TRIM(AERO_SCHEME) == "hamm7" ) THEN YSD_VF%YSOILTYPE => YSD_VF%YVF(YSD_VFD%IPTR) IREQIN=-1 ! This is relevant for dust emission in Tegen scheme (nddust=4), Lianghai Wu CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YSOILTYPE, & diff --git a/ifs-source/arpifs/setup/sugfl3.F90 b/ifs-source/arpifs/setup/sugfl3.F90 index 6d89676d..8e5d04e4 100644 --- a/ifs-source/arpifs/setup/sugfl3.F90 +++ b/ifs-source/arpifs/setup/sugfl3.F90 @@ -943,8 +943,8 @@ SUBROUTINE SUGFL3(YDDIMV,YDMODEL) & KCOUPLING=YAEROUT_NL(JGFL)%NCOUPLING,& & PREFVALC=YAEROUT_NL(JGFL)%REFVALC) ENDDO -!eehol: cloud prop -! Aerosol-cloud interaction fields, EC-EARTH + +! Aerosol-cloud interaction fields IF (TRIM(AERO_SCHEME)=="hamm7" )THEN IF (YCDNC%LACTIVE) THEN CALL SET_GFL_ATTR(YDDIMV, YGFL, YCDNC, LDADV=.FALSE., LDT9=.FALSE., LDPHY=.FALSE.) From d5920f584b3ae09e682c62dca19dd68f92d8f96e Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Wed, 12 Mar 2025 17:19:44 +0100 Subject: [PATCH 050/129] Fix aerosol drydep for M7 and apply it in its ifs-test --- .../arpifs/m7/module/mo_hammoz_drydep.F90 | 18 +++++++++--------- .../tests/t255/common/m7/fort.4-oac-adapted | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/ifs-source/arpifs/m7/module/mo_hammoz_drydep.F90 b/ifs-source/arpifs/m7/module/mo_hammoz_drydep.F90 index 4444df92..69cb62b1 100644 --- a/ifs-source/arpifs/m7/module/mo_hammoz_drydep.F90 +++ b/ifs-source/arpifs/m7/module/mo_hammoz_drydep.F90 @@ -463,15 +463,15 @@ SUBROUTINE drydep_interface(kbdim, kproma, klev, krow, & zvd, zvdstom, idt_ddep_detail ) !< Date: Wed, 14 May 2025 17:10:12 +0300 Subject: [PATCH 051/129] Nucleation work, switches, new parameters for calculation, new diagnostic variables into M7, and diagnostic output changes. --- ifs-source/arpifs/m7/module/mo_ham_m7.F90 | 46 +++++++++++--- ifs-source/arpifs/m7/module/mo_ham_m7ctl.F90 | 4 +- ifs-source/arpifs/m7/module/mo_ham_subm.F90 | 7 ++- .../arpifs/m7/phys_ec/hamm7_interface.F90 | 62 +++++++++++++++---- ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 | 1 + ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 | 3 +- 6 files changed, 99 insertions(+), 24 deletions(-) diff --git a/ifs-source/arpifs/m7/module/mo_ham_m7.F90 b/ifs-source/arpifs/m7/module/mo_ham_m7.F90 index 186782de..93c8a41d 100644 --- a/ifs-source/arpifs/m7/module/mo_ham_m7.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_m7.F90 @@ -343,7 +343,8 @@ SUBROUTINE m7(kproma, kbdim, klev, krow, & paerml, paernl, & pm6rp, pm6dry, prhop, pww, & pipr, paclc, & - pdz, pgrvol, ppbl,zout3) + pdz, pgrvol, ppbl, & + zout3, pforest, pout_dnuc) ! ! Authors: ! --------- @@ -458,6 +459,9 @@ SUBROUTINE m7(kproma, kbdim, klev, krow, & pdz(kbdim,klev), & ! layer thickness for diagnostics [m] pgrvol(kbdim,klev), & ! grid box volume for diagnostics [m-3] ppbl(kbdim) ! Planetary boundary layer top level +REAL(dp), OPTIONAL :: pforest (kbdim) ! forest fraction +REAL(dp), OPTIONAL :: pout_dnuc(kbdim,klev,4) + ! ! Local variables: ! @@ -592,7 +596,8 @@ SUBROUTINE m7(kproma, kbdim, klev, krow, & IF (nsnucl+nonucl.gt.0) CALL m7_nuck(kproma, kbdim, klev, krow, & papp1, ptp1, prhp1, paclc, pipr, & - pso4g, zcs, zanew, za4delt, pdz, ppbl) + pso4g, zcs, zanew, za4delt, pdz, ppbl, & + pforest, pout_dnuc) #ifdef HAMMOZ !>>dod timers IF (ltimer) THEN @@ -2258,7 +2263,7 @@ END SUBROUTINE m7_prod_cond SUBROUTINE m7_nuck(kproma, kbdim, klev, krow, & papp1, ptp1, prhp1, paclc, pipr, & ph2so4, pcs, panew, pa4delt, pdz, & - ppbl) + ppbl, pforest, pout_dnuc) ! ! Authors: ! -------- @@ -2349,7 +2354,10 @@ SUBROUTINE m7_nuck(kproma, kbdim, klev, krow, & ! to the nucleation mode due to H2SO4 nucleation over a timestep REAL(dp):: pdz(kbdim,klev) ! Layer thickness dz for diagnostics [m] REAL(dp):: ppbl(kbdim) ! Planetary boundary layer top level - + + REAL(dp), OPTIONAL :: pforest(kbdim) ! forest fraction + REAL(dp),OPTIONAL :: pout_dnuc(kbdim,klev,4) ! nucleation diagnostics + ! ! Local variables: ! @@ -2368,7 +2376,6 @@ SUBROUTINE m7_nuck(kproma, kbdim, klev, krow, & REAL(dp):: znucrate ! Total nucleation (particle formation) rate REAL(dp):: zsnucloss ! Total H2SO4(g) loss due to nucleation - ! Initialisations ztmst = time_step_len @@ -2415,12 +2422,20 @@ SUBROUTINE m7_nuck(kproma, kbdim, klev, krow, & ELSEIF (nonucl == 2) THEN CALL nucl_kinetic(kproma,kbdim,klev,zh2so4_cf0,forest(:,krow),ppbl,zonrate,zons) ELSE -#endif zons(1:kproma,:) = 0.0_dp zonrate(1:kproma,:) = 0.0_dp -#ifdef HAMMOZ END IF -#endif +#else + ! when not in HAMMOZ forest fraction as parameter (pforest) and not module variable + IF (nonucl == 1) THEN + CALL nucl_activation(kproma,kbdim,klev,zh2so4_cf0,pforest(1:kproma),ppbl,zonrate,zons) + ELSEIF (nonucl == 2) THEN + CALL nucl_kinetic(kproma,kbdim,klev,zh2so4_cf0,pforest(1:kproma),ppbl,zonrate,zons) + ELSE + zons(1:kproma,:) = 0.0_dp + zonrate(1:kproma,:) = 0.0_dp + END If +#endif DO jk = 1, klev DO jl = 1, kproma @@ -2457,6 +2472,21 @@ SUBROUTINE m7_nuck(kproma, kbdim, klev, krow, & ! convert [molec. cm-3] to [kg(S04) m-2]: d_nuc_so4(jl,krow) = d_nuc_so4(jl,krow) & + pa4delt(jl,jk,1)*mw_so4*1.E+03_dp/avo*pdz(jl,jk)*zqtmst*delta_time + +#else + !diagnostics: + ! 1: NS-mass from nucleatiom + ! 2: NS-number from nucleatiom + ! 3: original N/s from H2SO4/H2O nucleatiom + ! 4: original N/s from organic nucleatiom + pout_dnuc(jl,jk,1) = & + + pa4delt(jl,jk,1)*mw_so4*1.E+03_dp/avo*pdz(jl,jk) + pout_dnuc(jl,jk,2) = & + + panew(jl,jk)*1.E+03_dp + pout_dnuc(jl,jk,3) = & + + zsnrate(jl,jk) *1.E+03_dp + pout_dnuc(jl,jk,4) = & + + zonrate(jl,jk)*1.E+03_dp #endif END IF diff --git a/ifs-source/arpifs/m7/module/mo_ham_m7ctl.F90 b/ifs-source/arpifs/m7/module/mo_ham_m7ctl.F90 index def0ccd1..5daddc90 100644 --- a/ifs-source/arpifs/m7/module/mo_ham_m7ctl.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_m7ctl.F90 @@ -87,13 +87,13 @@ MODULE mo_ham_m7ctl ! nwater = 0 Jacobson et al., JGR 1996 ! = 1 Kappa-Koehler theory based approach (Petters and Kreidenweis, ACP 2007) - INTEGER :: nsnucl = 0!eehol: nucleation off for M7 originally: 2 ! Choice of the H2SO4/H2O nucleation scheme: + INTEGER :: nsnucl = 1!eehol: nucleation off for M7 originally: 2 ! Choice of the H2SO4/H2O nucleation scheme: ! ! nsnucl = 0 off ! = 1 Vehkamaeki et al., JGR 2002 ! = 2 Kazil and Lovejoy, ACP 2007 - INTEGER :: nonucl = 0!eehol: organic nucleation off for M7 originally 1 ! Choice of the organic nucleation scheme: + INTEGER :: nonucl = 1!eehol: organic nucleation off for M7 originally 1 ! Choice of the organic nucleation scheme: ! ! nonucl = 0 off ! = 1 Activation nucleation, Kulmala et al., ACP 2006 diff --git a/ifs-source/arpifs/m7/module/mo_ham_subm.F90 b/ifs-source/arpifs/m7/module/mo_ham_subm.F90 index 8297ce21..f83ed8d5 100755 --- a/ifs-source/arpifs/m7/module/mo_ham_subm.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_subm.F90 @@ -58,7 +58,8 @@ SUBROUTINE ham_subm_interface(kproma, kbdim, klev, krow, ktrac, & pt, pq, pqs, & pxtm1, pxtte, & pm6rp, pm6dry, prhop, pww, & - paclc, pgrvolm1, ppbl,zout3) + paclc, pgrvolm1, ppbl, zout3, & + pforest,pout_dnuc) ! ! Authors: ! -------- @@ -152,6 +153,8 @@ SUBROUTINE ham_subm_interface(kproma, kbdim, klev, krow, ktrac, & REAL(dp), OPTIONAL :: paclc (kbdim,klev) ! cloud cover [0,1] REAL(dp), OPTIONAL :: pgrvolm1(kbdim,klev) ! grid box volume [m3] REAL(dp), OPTIONAL :: ppbl (kbdim) ! Planetary boundary layer top level + REAL(dp), OPTIONAL :: pforest (kbdim) ! Planetary boundary layer top level + REAL(dp), OPTIONAL :: pout_dnuc(kbdim,klev,4) REAL(dp), OPTIONAL :: pm6rp(kbdim,klev,nclass), & ! mean mode actual radius (wet for soluble and dry for insoluble modes) [m] pm6dry(kbdim,klev,nsol), & ! dry radius for soluble modes [m] @@ -487,7 +490,7 @@ SUBROUTINE ham_subm_interface(kproma, kbdim, klev, krow, ktrac, & zm6rp, zm6dry, zrhop, zww, & ! Aerosol properties zipr, paclc, & ! Ionization rate, cloud cover zdz, pgrvolm1, & ! Layer thickness, grid box volume - ppbl , zout3 ) ! Planetary boundary layer top level + ppbl, zout3, pforest, pout_dnuc ) ! Planetary boundary layer top level, zout, forest fraction #ifdef HAMMOZ diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index cbbc5df1..a1c2a62f 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -14,7 +14,7 @@ SUBROUTINE HAMM7_INTERFACE( & & PTAUS_AER, PTAUA_AER, PPMAER, & & PEXTRA, PVERVEL, PCCNL, PCCNO, PAHFSTI, PCI, PZ0M, & !eehol: added here vertical velocity, CCN over land, CCN over ocean - & PAHFLEV, PUP, PVP, PCVL, PCVH, PSO2DD, PGEMU) + & PAHFLEV, PUP, PVP, PCVL, PCVH, PSO2DD, PGEMU, PBLH) !, PTSO2, PTSO4, PTSO4_AQ, PFSO2,PFSO4,PFSO4_AQ& ! u-wind, v-wind, low veg. cover, high veg. cover, sine of latitude @@ -259,6 +259,7 @@ SUBROUTINE HAMM7_INTERFACE( & REAL(KIND=JPRB),INTENT(INOUT) :: PGFL(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NDIM), PPRAERS(KLON) ! Simple sulfur scheme variables: REAL(KIND=JPRB),INTENT(INOUT) :: PSO2DD(KLON) +REAL(KIND=JPRB),INTENT(IN) :: PBLH(KLON) ! Boundary layer height !REAL(KIND=JPRB), INTENT(INOUT) :: PFSO2(KLON) , PFSO4(KLON), PFSO4_AQ(KLON) !REAL(KIND=JPRB), INTENT(INOUT) :: PTSO2(KLON, KLEV) , PTSO4(KLON, KLEV), PTSO4_AQ(KLON, KLEV) @@ -436,8 +437,8 @@ SUBROUTINE HAMM7_INTERFACE( & REAL(KIND=JPRB) :: ZCDNL(KLON), ZCDNW(KLON) !ustar (in not used variable), aerodynamic resis. on surface (in not used variable) REAL(KIND=JPRB) :: ZXTMD1(KLON,KLEV,ntrac) !tracer mixing ratios for HAM drydep (updated with tend) ! output diagnostics -REAL(KIND=JPRB) :: ZOUT(KLON,ntrac),ZOUT2(KLON,14),zout3(KLON,KLEV,2*(naerocomp+nclass)) - +INTEGER,parameter::n_nuc_diag=4 +REAL(KIND=JPRB) :: ZOUT(KLON,ntrac),ZOUT2(KLON,14),zout3(KLON,KLEV,2*(naerocomp+nclass)),zout_dnuc(KLON,KLEV,n_nuc_diag) REAL(KIND=JPRB) :: SEDOUT(KLON,KLEV,KTRAC) ! changed ntrack to ktrac (RCHG) REAL(KIND=JPRB) :: DDEPOUT(KLON,KLEV,KTRAC) REAL(KIND=JPRB) :: WDEPOUT(KLON,KLEV,KTRAC) @@ -483,6 +484,10 @@ SUBROUTINE HAMM7_INTERFACE( & REAL(KIND=JPRB) :: PAOD_LW(KLON,16) REAL(KIND=JPRB) :: ZCHEM2AER(KLON,KLEV,6) ! to overwrite PCHEM2AER (or we could set the latter to inout intent) +! Boundary layer height index calculation +REAL(KIND=JPRB) :: ZBLHIDX(KLON) ! index +LOGICAL :: LBLHFOUND(KLON) ! logical if boundary layer height is found +REAL(KIND=JPRB) :: ZRG ! 1/RG !----------------------------------------------------------------------- @@ -574,6 +579,9 @@ SUBROUTINE HAMM7_INTERFACE( & !* 0. PROGNOSTIC AEROSOLS - FINAL COMPUTATIONS ! ---------------------------------------- + +LBLHFOUND(:) = .FALSE. + ZAHFSM = 0._JPRB ZEPSCOV = 1.E-03_JPRB ZEPSWAT = 1.E-18_JPRB @@ -601,6 +609,7 @@ SUBROUTINE HAMM7_INTERFACE( & ZOUT(KIDIA:KFDIA,:) = 0._JPRB ZOUT2(KIDIA:KFDIA,:) = 0._JPRB ZOUT3(KIDIA:KFDIA,:,:) = 0._JPRB +ZOUT_dnuc(KIDIA:KFDIA,:,:) = 0._JPRB ! Need to initialize those 3 arrays early in case LAERDRYDP=F (GNU, Lianghai Wu) ZVDEP(KIDIA:KFDIA,:) = 0._JPRB ! ddep velocity as zero ZXTEMS(KIDIA:KFDIA,:) = 0._JPRB ! surface emissions as zero for input @@ -635,6 +644,8 @@ SUBROUTINE HAMM7_INTERFACE( & ZCHEM2AER(KIDIA:KFDIA,1:KLEV,1:6)=PCHEM2AER(KIDIA:KFDIA,1:KLEV,1:6) +ZRG=1/RG + ! computation of tropopause level CALL TROPLEV(KLON,KIDIA,KFDIA,KLEV,.FALSE.,PTP,PQP,PRSF1,IKLEVTROP) @@ -812,6 +823,23 @@ SUBROUTINE HAMM7_INTERFACE( & ZAP(JL,JK)=MIN(1.0_JPRB,MAX(0.0_JPRB,PAP(JL,JK))) !add threshold for cloud cover ENDDO ENDDO +ZBLHIDX(KIDIA:KFDIA)=1 +! Find top level index of bounrary layer +DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ! check the PBL height against the grid point height from surface + ! PGEOH used here as it is the layer interface geopotential, and when divided by gravitation constat gives height + ! + IF (PBLH(JL)>(((PGEOH(JL,JK)-PGEOH(JL,KLEV))*ZRG)) .and. .not. LBLHFOUND(JL)) THEN + ZBLHIDX(JL)=JK-1 + LBLHFOUND(JL)=.TRUE. + ! write(1212,*)PBLH(JL),PAPHIF(JL,JK),JL,JK-1 + ! else + ! write(1212,*)PBLH(JL),PAPHIF(JL,JK),JL,ZBLHIDX(JL) + + END IF + ENDDO +ENDDO ! TB apparently unnecessary in current implementation, but ISSO4_C still needed for chem_inext in the code. ! needs to be reviewed if it can be removed. @@ -974,7 +1002,7 @@ SUBROUTINE HAMM7_INTERFACE( & & ZM6RP, ZM6DRY, & !mean mode actual radius [m], dry radius for soluble modes [m] & ZRHOP, ZWW, & !mean mode particle density [kg m-3], aerosol water content for each mode [kg(water)-3(air)] & ZAP, ZGRVOL, & !cloud fraction, grid box volume (only for diagnostics) - & ZPBL, ZOUT3) !boundary layer top level, outputs + & ZBLHIDX, ZOUT3,PCVH, zout_dnuc) !boundary layer top level, outputs, high vegetation CALL GSTATS(2501,1) @@ -1817,15 +1845,20 @@ SUBROUTINE HAMM7_INTERFACE( & PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(3)%MP) = WDEPOUT_2D(KIDIA:KFDIA,KAERO(JN)) PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(17)%MP) = WDEPOUT_IC_2D(KIDIA:KFDIA,KAERO(JN)) PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(18)%MP) = WDEPOUT_BC_2D(KIDIA:KFDIA,KAERO(JN)) - PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(5)%MP) = PAERSRC(KIDIA:KFDIA,KAERO(JN)) + PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(5)%MP) = PAERSRC(KIDIA:KFDIA,KAERO(JN)) - PCFLX(KIDIA:KFDIA,KAERO(JN))* ZDPG(KIDIA:KFDIA,KLEV) END DO - + PGFL(KIDIA:KFDIA,NACTAERO+2,YAEROUT(5)%MP) = ZBLHIDX(KIDIA:KFDIA) + PGFL(KIDIA:KFDIA,NACTAERO+3,YAEROUT(5)%MP) = PBLH(KIDIA:KFDIA) + PGFL(KIDIA:KFDIA,NACTAERO+4,YAEROUT(5)%MP) = ((PGEOH(KIDIA:KFDIA,137)-PGEOH(KIDIA:KFDIA,KLEV))*ZRG) + PGFL(KIDIA:KFDIA,NACTAERO+5,YAEROUT(5)%MP) = ((PGEOH(KIDIA:KFDIA,136)-PGEOH(KIDIA:KFDIA,KLEV))*ZRG) + PGFL(KIDIA:KFDIA,NACTAERO+6,YAEROUT(5)%MP) = ((PGEOH(KIDIA:KFDIA,135)-PGEOH(KIDIA:KFDIA,KLEV))*ZRG) DO JN=1,NACTAERO !ktrac ZTMP=0.0_JPRB DO JK=1,KLEV ZTMP(KIDIA:KFDIA)=ZTMP(KIDIA:KFDIA)+PCEN(KIDIA:KFDIA,JK,KAERO(JN)) END DO - PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(9)%MP) = ZTMP(KIDIA:KFDIA) + !PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(9)%MP) = ZTMP(KIDIA:KFDIA) + PGFL(KIDIA:KFDIA,KAERO(JN),YGFL%YAEROUT(9)%MP)= - PCFLX(KIDIA:KFDIA,KAERO(JN))* ZDPG(KIDIA:KFDIA,KLEV) END DO DO JN=1,NACTAERO !ktrac @@ -1910,17 +1943,24 @@ SUBROUTINE HAMM7_INTERFACE( & PGFL(KIDIA:KFDIA,KLEV,YAEROUT(19)%MP) = ZXTTE(KIDIA:KFDIA,KLEV,3) ! tendency SS CS ham after update surface PGFL(KIDIA:KFDIA,KLEV-1,YAEROUT(20)%MP) = ZTENCIH(KIDIA:KFDIA,KLEV,17) ! tendency SS CS ham before update surface - PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(21)%MP) = ZXTMD1(KIDIA:KFDIA,1:KLEV,17) ! mix rat SS CS ham before update + DO JK=1,KLEV + ! height of level from the surface. + PGFL(KIDIA:KFDIA,JK,YAEROUT(21)%MP) = (PGEOH(KIDIA:KFDIA,JK)-PGEOH(KIDIA:KFDIA,KLEV))*ZRG + END DO + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(22)%MP) = ZOUT_dnuc(KIDIA:KFDIA,1:KLEV,1) + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(23)%MP) = ZOUT_dnuc(KIDIA:KFDIA,1:KLEV,2) + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(24)%MP) = ZOUT_dnuc(KIDIA:KFDIA,1:KLEV,3) + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(25)%MP) = ZOUT_dnuc(KIDIA:KFDIA,1:KLEV,4) ! It is not clear when NACTERO and when NTRAC DO JN=1,NACTAERO - PGFL(KIDIA:KFDIA,JN,YAEROUT(22)%MP)=DDEPOUT(KIDIA:KFDIA,KLEV,KAERO(JN)) + !PGFL(KIDIA:KFDIA,JN,YAEROUT(22)%MP)=DDEPOUT(KIDIA:KFDIA,KLEV,KAERO(JN)) PGFL(KIDIA:KFDIA, JN, YAEROUT(28)%MP) = PAERSRC(KIDIA:KFDIA,KAERO(JN)) ! Emissions per specie END DO DO JN=1,NTRAC - PGFL(KIDIA:KFDIA,JN,YAEROUT(23)%MP)=WDEPOUT(KIDIA:KFDIA,KLEV,JN) - PGFL(KIDIA:KFDIA,JN,YAEROUT(24)%MP)=SEDOUT(KIDIA:KFDIA,KLEV,JN) + !PGFL(KIDIA:KFDIA,JN,YAEROUT(23)%MP)=WDEPOUT(KIDIA:KFDIA,KLEV,JN) + !PGFL(KIDIA:KFDIA,JN,YAEROUT(24)%MP)=SEDOUT(KIDIA:KFDIA,KLEV,JN) PGFL(KIDIA:KFDIA,JN,YAEROUT(39)%MP)=ZXTEMS(KIDIA:KFDIA,JN) END DO DO JN=1,SUBM_NGASSPEC diff --git a/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 index d510c2c4..6cd95ca7 100644 --- a/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 +++ b/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 @@ -214,6 +214,7 @@ SUBROUTINE TM5M7_SRC( & #include "surf_inq.h" #include "tm5m7_src_ss.intfb.h" +!#include "tm5m7_src_ss_lhw.intfb.h" #include "tm5m7_src_dust.intfb.h" !#include "satur.intfb.h" !#include "aer_volce.intfb.h" diff --git a/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 b/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 index 75d691f0..b3360c40 100644 --- a/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 +++ b/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 @@ -250,9 +250,10 @@ SUBROUTINE AER_PHY3_LAYER(YDSURF, & & ZTAUS_AER , ZTAUA_AER, ZPMAER, & !VH & PSURF%PSD_XA, PAUX%PVERVEL, AUXL%ZCCNL, AUXL%ZCCNO, PSURF%PAHFSTI, PSURF%PSD_VF(:,YSD_VF%YCI%MP), GEMSL%ZAZ0M, FLUX%PFTLHEV, & - & STATE%U, STATE%V, PSURF%PCVL, PSURF%PCVH,PSURF%PSD_VF(:,YSD_VF%YSO2DD%MP), PAUX%PGEMU) !,ZTSO2,ZTSO4,ZTSO4_AQ,ZFSO2,ZFSO4 ,ZFSO4_AQ& + & STATE%U, STATE%V, PSURF%PCVL, PSURF%PCVH,PSURF%PSD_VF(:,YSD_VF%YSO2DD%MP), PAUX%PGEMU,PSURF%PSD_VD(:,YDSURF%YSD_VD%YBLH%MP)) !,ZTSO2,ZTSO4,ZTSO4_AQ,ZFSO2,ZFSO4 ,ZFSO4_AQ& !&) ! u-wind,v-wind,low veg. cover, high veg. cover, sine of latitude + !write(1022,*) YCDNC%MP9_PH,PGFL(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV,YCDNC%MP9_PH) ! FIXME Better than 1:14 is to define a variable with value 14 with a meaningful name (RCHG) ! Note that %M7AODLW has 16 wavelenghts (see phys_radi/suecrad.F90, PLS) From 2c43db7a70df912e7cb6828913648cc69551e14d Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Tue, 29 Apr 2025 10:53:38 +0000 Subject: [PATCH 052/129] Pull request #27: Support for single precision Merge in ~NM6/openifs-48r1 from single-precision to knmi-m7 Squashed commit of the following: commit 35cb3ba7209ea77b98490c9c4435072ce61df4b6 Author: Philippe Le Sager Date: Mon Apr 21 11:29:14 2025 +0200 Rewrite assignment to avoid div by 0 in sp commit 1bd432985db9ff7ac631fb5841a2c02a8204e38f Author: Philippe Le Sager Date: Wed Apr 16 10:41:15 2025 +0200 Fix FPE raised in single precision commit 69db3020b0d61193b84ab622d8f2229bd4ab6efd Author: Philippe Le Sager Date: Tue Apr 15 17:16:16 2025 +0200 Fix netCDF readings in M7 for single precision --- ifs-source/arpifs/m7/module/mo_ham_m7.F90 | 11 +++- ifs-source/arpifs/m7/module/mo_ham_subm.F90 | 14 ++-- ifs-source/arpifs/m7/module/mo_kind.F90 | 1 + ifs-source/arpifs/m7/module/mo_netcdf.F90 | 2 + .../arpifs/m7/module/mo_read_netcdf77.F90 | 66 +++++++++++++++---- 5 files changed, 71 insertions(+), 23 deletions(-) diff --git a/ifs-source/arpifs/m7/module/mo_ham_m7.F90 b/ifs-source/arpifs/m7/module/mo_ham_m7.F90 index 93c8a41d..4f6b618f 100644 --- a/ifs-source/arpifs/m7/module/mo_ham_m7.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_m7.F90 @@ -2047,9 +2047,14 @@ SUBROUTINE m7_h2so4_cs(kproma,kbdim,klev,ptp1,papp1,paernl,pm6rp,pcs,pcsi) !--- Diffusive flux to single particle surface: ! (Elisabetta's thesis: fraction in equ. 2.26) - pcsi(jl,jk,jclass)=(4.0_dp * pi * zde2 * zm6rp ) / & - ((4.0_dp * zde2) / (zvelb * zm6rp * caccso4(jclass)) + & - (zm6rp/(zm6rp+zf1)) ) +!ORIGINAL-FORMULATION pcsi(jl,jk,jclass)=(4.0_dp * pi * zde2 * zm6rp ) / & +!ORIGINAL-FORMULATION ((4.0_dp * zde2) / (zvelb * zm6rp * caccso4(jclass)) + & +!ORIGINAL-FORMULATION (zm6rp/(zm6rp+zf1)) ) + +!NEW-FORMULATION + pcsi(jl,jk,jclass)=(4.0_dp * pi * zde2 * zm6rp * zvelb * zm6rp * caccso4(jclass) * (zm6rp+zf1)) / & + ( 4.0_dp * zde2 * (zm6rp+zf1) + & + zvelb * zm6rp * caccso4(jclass) * zm6rp ) !--- Total diffusive flux to all particles in the respective mode: ! (per concentration of gas phase sulfate) diff --git a/ifs-source/arpifs/m7/module/mo_ham_subm.F90 b/ifs-source/arpifs/m7/module/mo_ham_subm.F90 index f83ed8d5..05388abf 100755 --- a/ifs-source/arpifs/m7/module/mo_ham_subm.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_subm.F90 @@ -176,13 +176,13 @@ SUBROUTINE ham_subm_interface(kproma, kbdim, klev, krow, ktrac, & INTEGER :: it,jl,jk,jc,jn,jt,jspec,jclass,ilevp1 - REAL(dp):: ztmst, zqtmst, zqs, zq_amb + REAL(dp):: ztmst, zqtmst, zqs !NOT-USED-AND-BROKEN-IN-SP-[PLS]: zq_amb REAL(dp):: zfac, zqfac, & zfacm, zqfacm, & zfacc, zqfacc, & - zfacn, zqfacn, & - zeps, zaclc + zfacn, zqfacn !, & +!NOT-USED-AND-BROKEN-IN-SP-[PLS] zeps, zaclc REAL(dp) :: zfac_vmr ! Conversion of vmr to molecules cm-3 #ifdef HAMMOZ @@ -238,7 +238,7 @@ SUBROUTINE ham_subm_interface(kproma, kbdim, klev, krow, ktrac, & ztmst = time_step_len zqtmst = 1._dp/time_step_len - zeps = 1.E-10_dp +!NOT-USED-AND-BROKEN-IN-SP-[PLS] zeps = 1.E-10_dp ilevp1 = klev+1 @@ -298,9 +298,9 @@ SUBROUTINE ham_subm_interface(kproma, kbdim, klev, krow, ktrac, & !<--eehol zqs = pqs(jl,jk) !eehol: read zqs from input sat. spec. hum - zaclc = MIN(paclc(jl,jk),1.0_dp-zeps) - - zq_amb = MAX( 0.0_dp , (pq(jl,jk)-zqs*zaclc)/(1._dp-zaclc) ) +!NOT-USED-AND-BROKEN-IN-SP-[PLS] zaclc = MIN(paclc(jl,jk),1.0_dp-zeps) +!NOT-USED-AND-BROKEN-IN-SP-[PLS] +!NOT-USED-AND-BROKEN-IN-SP-[PLS] zq_amb = MAX( 0.0_dp , (pq(jl,jk)-zqs*zaclc)/(1._dp-zaclc) ) !zrh(jl,jk) = zq_amb/zqs zrh(jl,jk) = pq(jl,jk)/zqs !changed to same as OIFS diff --git a/ifs-source/arpifs/m7/module/mo_kind.F90 b/ifs-source/arpifs/m7/module/mo_kind.F90 index c28edcd8..1dc979ba 100644 --- a/ifs-source/arpifs/m7/module/mo_kind.F90 +++ b/ifs-source/arpifs/m7/module/mo_kind.F90 @@ -4,6 +4,7 @@ MODULE mo_kind ! removed commented-out code USE parkind1, ONLY: dp => JPRB !TeMi USE parkind1, ONLY: wp => JPRB !eehol + USE parkind1, ONLY: JPRD IMPLICIT NONE ! <-- thk END MODULE mo_kind diff --git a/ifs-source/arpifs/m7/module/mo_netcdf.F90 b/ifs-source/arpifs/m7/module/mo_netcdf.F90 index 8ee66cef..266e2ebd 100644 --- a/ifs-source/arpifs/m7/module/mo_netcdf.F90 +++ b/ifs-source/arpifs/m7/module/mo_netcdf.F90 @@ -37,7 +37,9 @@ MODULE mo_netcdf PUBLIC :: nf_inq_dimid ! mo_io PUBLIC :: nf_inq_dimlen ! PUBLIC :: nf_get_var_double ! + PUBLIC :: nf_get_var_real ! PUBLIC :: nf_get_vara_double ! + PUBLIC :: nf_get_vara_real ! PUBLIC :: nf_get_att_int ! PUBLIC :: nf_global ! mo_io PUBLIC :: nf_double ! mo_io diff --git a/ifs-source/arpifs/m7/module/mo_read_netcdf77.F90 b/ifs-source/arpifs/m7/module/mo_read_netcdf77.F90 index d08fcb11..78a2b671 100644 --- a/ifs-source/arpifs/m7/module/mo_read_netcdf77.F90 +++ b/ifs-source/arpifs/m7/module/mo_read_netcdf77.F90 @@ -17,15 +17,15 @@ MODULE mo_read_netcdf77 ! J.S. Rast, MPI, May 2005, change all netcdf routines to fortran 77 calls ! D.O'Donnell, MPI-M, Feb 2008, added read 4-D variable - USE mo_kind, ONLY: dp + USE mo_kind, ONLY: dp, JPRD USE mo_exception, ONLY: finish USE mo_netcdf, ONLY: nf_check, nf_max_var_dims, nf_open, nf__open, & nf_close, chunksize, nf_nowrite, & nf_inq_dimlen, nf_inq_dimid, nf_inq_varid, & nf_get_vara_double, nf_inq_varndims, & nf_inq_nvars, nf_inq_vardimid, nf_inq_varname, & - nf_get_var_double - + nf_get_var_double, & + nf_get_vara_real, nf_get_var_real IMPLICIT NONE PRIVATE @@ -86,7 +86,11 @@ SUBROUTINE read_var_nf77_0d (file_name, varname, var, ierr) ! inquire variable and number of dimensions ierr=nf_inq_varid(zncid, TRIM(varname), znvar) IF (ierr == 0) THEN - CALL nf_check(nf_get_var_double(zncid, znvar, var), fname=TRIM(file_name)) + IF(dp==JPRD)THEN + CALL nf_check(nf_get_var_double(zncid, znvar, var), fname=TRIM(file_name)) + ELSE + CALL nf_check(nf_get_var_real(zncid, znvar, var), fname=TRIM(file_name)) + ENDIF ELSE CALL finish('read_var_nf77_0d:', & 'variable '//TRIM(varname)//' not found in '//TRIM(file_name)) @@ -151,7 +155,11 @@ SUBROUTINE read_var_nf77_1d (file_name, dimname, varname, varptr, ierr) CALL finish('read_var_nf77_1d:', & 'wrong number of dimension of variable '//TRIM(varname)) END IF - CALL nf_check(nf_get_vara_double(zncid, znvar, (/1/), (/zdims/), varptr), fname=TRIM(file_name)) + IF(dp==JPRD)THEN + CALL nf_check(nf_get_vara_double(zncid, znvar, (/1/), (/zdims/), varptr), fname=TRIM(file_name)) + ELSE + CALL nf_check(nf_get_vara_real(zncid, znvar, (/1/), (/zdims/), varptr), fname=TRIM(file_name)) + ENDIF ELSE CALL finish('read_var_nf77_1d:', & 'variable '//TRIM(varname)//' not found in '//TRIM(file_name)) @@ -243,7 +251,11 @@ SUBROUTINE read_var_nf77_2d (file_name, dimname1, dimname2, var_name, varptr, ie ALLOCATE(zin(zdims(zorder(1)), zdims(zorder(2)))) zcountvar(1)=zdims(zorder(1)) zcountvar(2)=zdims(zorder(2)) - CALL nf_check(nf_get_vara_double(zncid, zvarid, (/1,1/), zcountvar, zin), fname=TRIM(file_name)) + IF(dp==JPRD)THEN + CALL nf_check(nf_get_vara_double(zncid, zvarid, (/1,1/), zcountvar, zin), fname=TRIM(file_name)) + ELSE + CALL nf_check(nf_get_vara_real(zncid, zvarid, (/1,1/), zcountvar, zin), fname=TRIM(file_name)) + ENDIF CALL nf_check(nf_close(zncid), fname=TRIM(file_name)) IF (ALL(zorder == (/ 1, 2 /))) THEN varptr = zin @@ -353,7 +365,11 @@ SUBROUTINE read_var_nf77_3d (file_name, dimname1, dimname2, dimname3, var_name, zcountvar(1)=zdims(zorder(1)) zcountvar(2)=zdims(zorder(2)) zcountvar(3)=zdims(zorder(3)) - CALL nf_check(nf_get_vara_double(zncid, zvarid, (/1,1,1/), zcountvar, zin), fname=TRIM(file_name)) + IF(dp==JPRD)THEN + CALL nf_check(nf_get_vara_double(zncid, zvarid, (/1,1,1/), zcountvar, zin), fname=TRIM(file_name)) + ELSE + CALL nf_check(nf_get_vara_real(zncid, zvarid, (/1,1,1/), zcountvar, zin), fname=TRIM(file_name)) + ENDIF CALL nf_check(nf_close(zncid), fname=TRIM(file_name)) IF (ALL(zorder == (/ 1, 2, 3 /))) THEN varptr = zin @@ -477,7 +493,11 @@ SUBROUTINE read_var_nf77_4d (file_name, dimname1, dimname2, dimname3, dimname4, zcountvar(2)=zdims(zorder(2)) zcountvar(3)=zdims(zorder(3)) zcountvar(4)=zdims(zorder(4)) - CALL nf_check(nf_get_vara_double(zncid, zvarid, (/1,1,1,1/), zcountvar, zin), fname=TRIM(file_name)) + IF(dp==JPRD)THEN + CALL nf_check(nf_get_vara_double(zncid, zvarid, (/1,1,1,1/), zcountvar, zin), fname=TRIM(file_name)) + ELSE + CALL nf_check(nf_get_vara_real(zncid, zvarid, (/1,1,1,1/), zcountvar, zin), fname=TRIM(file_name)) + ENDIF CALL nf_check(nf_close(zncid), fname=TRIM(file_name)) IF (ALL(zorder == (/ 1, 2, 3, 4 /))) THEN varptr = zin @@ -614,7 +634,11 @@ SUBROUTINE read_sumvar_nf77_2d (file_name, dimname1, dimname2, dimname3, imonth, zcountvar(1)=zcount(zorder(1)) zcountvar(2)=zcount(zorder(2)) zcountvar(3)=zcount(zorder(3)) - CALL nf_check(nf_get_vara_double(zncid, ivar, zstartvar, zcountvar, zin),fname=TRIM(file_name)) + IF(dp==JPRD)THEN + CALL nf_check(nf_get_vara_double(zncid, ivar, zstartvar, zcountvar, zin),fname=TRIM(file_name)) + ELSE + CALL nf_check(nf_get_vara_real(zncid, ivar, zstartvar, zcountvar, zin),fname=TRIM(file_name)) + ENDIF ! zinre=RESHAPE(zin, zdims, order=zorder) varptr = varptr + RESHAPE(RESHAPE(zin, zdims, order=zorder),zdims(1:2)) IF (ASSOCIATED(zin)) DEALLOCATE(zin) @@ -700,7 +724,11 @@ SUBROUTINE read_var_hs_nf77_0d (file_name, dimname, & 'wrong number of dimension of variable '//TRIM(varname)) END IF ALLOCATE(zin(1)) - CALL nf_check(nf_get_vara_double(zncid, znvar, zstart, zcount, zin),fname=TRIM(file_name)) + IF(dp==JPRD)THEN + CALL nf_check(nf_get_vara_double(zncid, znvar, zstart, zcount, zin),fname=TRIM(file_name)) + ELSE + CALL nf_check(nf_get_vara_real(zncid, znvar, zstart, zcount, zin),fname=TRIM(file_name)) + ENDIF varptr = zin(1) IF (ASSOCIATED(zin)) DEALLOCATE(zin) ELSE @@ -799,7 +827,11 @@ SUBROUTINE read_var_hs_nf77_1d (file_name, dimname1, dimname2, & 'wrong number of dimension of variable '//TRIM(varname)) END IF ALLOCATE(zin(zdims(1), zdims(2))) - CALL nf_check(nf_get_vara_double(zncid, znvar, zstart, zcount, zin),fname=TRIM(file_name)) + IF(dp==JPRD)THEN + CALL nf_check(nf_get_vara_double(zncid, znvar, zstart, zcount, zin),fname=TRIM(file_name)) + ELSE + CALL nf_check(nf_get_vara_real(zncid, znvar, zstart, zcount, zin),fname=TRIM(file_name)) + ENDIF varptr = zin(:,1) IF (ASSOCIATED(zin)) DEALLOCATE(zin) ELSE @@ -923,7 +955,11 @@ SUBROUTINE read_var_hs_nf77_2d (file_name, dimname1, dimname2, dimname3, idx, va zcountvar(1)=zcount(zorder(1)) zcountvar(2)=zcount(zorder(2)) zcountvar(3)=zcount(zorder(3)) - CALL nf_check(nf_get_vara_double(zncid, znvar, zstartvar, zcountvar, zin), fname=TRIM(file_name)) + IF(dp==JPRD)THEN + CALL nf_check(nf_get_vara_double(zncid, znvar, zstartvar, zcountvar, zin), fname=TRIM(file_name)) + ELSE + CALL nf_check(nf_get_vara_real(zncid, znvar, zstartvar, zcountvar, zin), fname=TRIM(file_name)) + ENDIF varptr = RESHAPE(RESHAPE(zin, zdims, order=zorder),zdims(1:2)) IF (ASSOCIATED(zin)) DEALLOCATE(zin) ELSE @@ -1065,7 +1101,11 @@ SUBROUTINE read_var_hs_nf77_3d (file_name, dimname1, dimname2, dimname3, dimname zcountvar(2)=zcount(zorder(2)) zcountvar(3)=zcount(zorder(3)) zcountvar(4)=zcount(zorder(4)) - CALL nf_check(nf_get_vara_double(zncid, znvar, zstartvar, zcountvar, zin),fname=TRIM(file_name)) + IF(dp==JPRD)THEN + CALL nf_check(nf_get_vara_double(zncid, znvar, zstartvar, zcountvar, zin),fname=TRIM(file_name)) + ELSE + CALL nf_check(nf_get_vara_real(zncid, znvar, zstartvar, zcountvar, zin),fname=TRIM(file_name)) + ENDIF varptr = RESHAPE(RESHAPE(zin, zdims, order=zorder),zdims(1:3)) IF (ASSOCIATED(zin)) DEALLOCATE(zin) ELSE From d0692883b74662d0df4d5b03cf831eb8529bddf1 Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Tue, 29 Apr 2025 11:11:34 +0000 Subject: [PATCH 053/129] Pull request #7: Read emissions at the correct time step Merge in ~NM6/openifs-48r1 from bugfix/OIFS-536-read-emissions to knmi-m7 Squashed commit of the following: commit fa055ef946dbf4b9a3bd93f91f9588a331d0c527 Author: Philippe Le Sager Date: Tue Apr 29 13:10:20 2025 +0200 Separate updclie from updclie_compo when keeping track of read input file commit c0eed786dbe3c537380ac75c30bb0970453d5584 Author: Philippe Le Sager Date: Wed Jun 12 14:17:54 2024 +0200 Read emissions at the correct time step Minimal fix for OIFS-536: avoid reading emissions for T=0 when restarting the model. --- ifs-source/arpifs/climate/updclie_compo.F90 | 4 +++- ifs-source/arpifs/module/yommcc.F90 | 2 ++ ifs-source/arpifs/utility/updtim.F90 | 6 +++--- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/ifs-source/arpifs/climate/updclie_compo.F90 b/ifs-source/arpifs/climate/updclie_compo.F90 index bf044e29..e15852a3 100644 --- a/ifs-source/arpifs/climate/updclie_compo.F90 +++ b/ifs-source/arpifs/climate/updclie_compo.F90 @@ -135,7 +135,9 @@ SUBROUTINE UPDCLIE_COMPO(YDGEOMETRY,YDDYNA,YDSURF,YDCOMPO,YDMCC,YDERAD,YDML_GCON & SD_VF=>YDSURF%SD_VF, YSD_VF=>YDSURF%YSD_VF) ! ------------------------------------------------------------------ !* -LLFIRST = YDMCC%LFIRSTUPD +LLFIRST = YDMCC%LFIRSTUPDCOMPO +YDMCC%LFIRSTUPDCOMPO=.FALSE. + !* 1.1 Calendar IJ0=NDD(NINDAT) diff --git a/ifs-source/arpifs/module/yommcc.F90 b/ifs-source/arpifs/module/yommcc.F90 index 7586a910..4bf3799a 100644 --- a/ifs-source/arpifs/module/yommcc.F90 +++ b/ifs-source/arpifs/module/yommcc.F90 @@ -81,6 +81,7 @@ MODULE YOMMCC ! LMCCICEIC= .T. ===> ICE INITIAL CONDITIONS SENT TO COUPLER AT STARTUP ! =.F ===> NO OUTPUT OF ICE ! LFIRSTUPD ===> TRUE UNTIL UPDCLIE HAS BEEN CALLED +! LFIRSTUPDCOMPO ===> TRUE UNTIL UPDCLIE_COMPO HAS BEEN CALLED ! NCLIMTOT ===> TOTAL NUMBER OF FIELDS TO BE UPDATED IN TIME ! NCLIMR ===> NUMBER OF UPDATING FIELDS TO BE READ FROM FILE (OTHERS COME FROM OASIS COUPLER) ! NCLIGC ===> GRIB CODES OF THE FIELDS TO BE TIME UPDATED @@ -175,6 +176,7 @@ MODULE YOMMCC REAL(KIND=JPRD), ALLOCATABLE :: CLIMR(:,:,:) LOGICAL :: LFIRSTUPD = .TRUE. + LOGICAL :: LFIRSTUPDCOMPO = .TRUE. LOGICAL :: LCURR LOGICAL :: LGELATO LOGICAL :: LMCC01_MSE diff --git a/ifs-source/arpifs/utility/updtim.F90 b/ifs-source/arpifs/utility/updtim.F90 index 3bf8b34c..55b30431 100644 --- a/ifs-source/arpifs/utility/updtim.F90 +++ b/ifs-source/arpifs/utility/updtim.F90 @@ -900,10 +900,10 @@ SUBROUTINE UPDTIM(YDGEOMETRY,YDSURF,YDMODEL,KSTEP,PTDT,PTSTEP,LDCLUPD,LDUPDECAEC ENDIF ! .NOT. LSCMEC IF(ISTASS < ITIME)THEN - -! Updates daily emissions and dry dep velocities + +! Updates daily emissions IF(.NOT.LSCMEC) THEN - IF ( LMCC_COMPO ) THEN + IF ( LMCC_COMPO.AND.LDCLUPD ) THEN CALL UPDCLIE_COMPO(YDGEOMETRY,YDDYNA,YDSURF,YDMODEL%YRML_CHEM%YRCOMPO,YDMCC,YDERAD,YDMODEL%YRML_GCONF,PTSTEP) ENDIF ENDIF From 78c8c2b7b6f28ed6a809f7504d72544c2d1a54ae Mon Sep 17 00:00:00 2001 From: tommibergman Date: Thu, 22 May 2025 11:43:30 +0300 Subject: [PATCH 054/129] Add and correct diagnostics --- ifs-source/arpifs/m7/module/mo_ham_m7.F90 | 23 +++++++++++-------- .../arpifs/m7/phys_ec/hamm7_interface.F90 | 11 +++++---- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/ifs-source/arpifs/m7/module/mo_ham_m7.F90 b/ifs-source/arpifs/m7/module/mo_ham_m7.F90 index 4f6b618f..7d75e79d 100644 --- a/ifs-source/arpifs/m7/module/mo_ham_m7.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_m7.F90 @@ -460,7 +460,7 @@ SUBROUTINE m7(kproma, kbdim, klev, krow, & pgrvol(kbdim,klev), & ! grid box volume for diagnostics [m-3] ppbl(kbdim) ! Planetary boundary layer top level REAL(dp), OPTIONAL :: pforest (kbdim) ! forest fraction -REAL(dp), OPTIONAL :: pout_dnuc(kbdim,klev,4) +REAL(dp), OPTIONAL :: pout_dnuc(kbdim,klev,5) ! ! Local variables: @@ -2361,7 +2361,7 @@ SUBROUTINE m7_nuck(kproma, kbdim, klev, krow, & REAL(dp):: ppbl(kbdim) ! Planetary boundary layer top level REAL(dp), OPTIONAL :: pforest(kbdim) ! forest fraction - REAL(dp),OPTIONAL :: pout_dnuc(kbdim,klev,4) ! nucleation diagnostics + REAL(dp),OPTIONAL :: pout_dnuc(kbdim,klev,5) ! nucleation diagnostics ! ! Local variables: @@ -2480,18 +2480,21 @@ SUBROUTINE m7_nuck(kproma, kbdim, klev, krow, & #else !diagnostics: - ! 1: NS-mass from nucleatiom - ! 2: NS-number from nucleatiom - ! 3: original N/s from H2SO4/H2O nucleatiom - ! 4: original N/s from organic nucleatiom + ! 1: NS-mass production kg/s from nucleatiom (limited by amount of SO4) + ! 2: NS-number production rate #/s from nucleatiom (limited by amount of SO4 vs original #/s) + ! 3: original #/s from H2SO4/H2O nucleatiom + ! 4: original #/s from organic nucleatiom + ! 5: original #/s sum from organic and vehkamäki nucleation schemes pout_dnuc(jl,jk,1) = & - + pa4delt(jl,jk,1)*mw_so4*1.E+03_dp/avo*pdz(jl,jk) + + pa4delt(jl,jk,1)*mw_so4*1.E+03_dp/avo*pdz(jl,jk)*zqtmst pout_dnuc(jl,jk,2) = & - + panew(jl,jk)*1.E+03_dp + + panew(jl,jk)*1.E+06_dp*zqtmst pout_dnuc(jl,jk,3) = & - + zsnrate(jl,jk) *1.E+03_dp + + zsnrate(jl,jk) *1.E+06_dp pout_dnuc(jl,jk,4) = & - + zonrate(jl,jk)*1.E+03_dp + + zonrate(jl,jk)*1.E+06_dp + pout_dnuc(jl,jk,5) = (zsnrate(jl,jk) & + + zonrate(jl,jk))*1.E+06_dp #endif END IF diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index a1c2a62f..ed5b4cc4 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -437,7 +437,7 @@ SUBROUTINE HAMM7_INTERFACE( & REAL(KIND=JPRB) :: ZCDNL(KLON), ZCDNW(KLON) !ustar (in not used variable), aerodynamic resis. on surface (in not used variable) REAL(KIND=JPRB) :: ZXTMD1(KLON,KLEV,ntrac) !tracer mixing ratios for HAM drydep (updated with tend) ! output diagnostics -INTEGER,parameter::n_nuc_diag=4 +INTEGER,parameter::n_nuc_diag=5 REAL(KIND=JPRB) :: ZOUT(KLON,ntrac),ZOUT2(KLON,14),zout3(KLON,KLEV,2*(naerocomp+nclass)),zout_dnuc(KLON,KLEV,n_nuc_diag) REAL(KIND=JPRB) :: SEDOUT(KLON,KLEV,KTRAC) ! changed ntrack to ktrac (RCHG) REAL(KIND=JPRB) :: DDEPOUT(KLON,KLEV,KTRAC) @@ -1951,6 +1951,7 @@ SUBROUTINE HAMM7_INTERFACE( & PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(23)%MP) = ZOUT_dnuc(KIDIA:KFDIA,1:KLEV,2) PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(24)%MP) = ZOUT_dnuc(KIDIA:KFDIA,1:KLEV,3) PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(25)%MP) = ZOUT_dnuc(KIDIA:KFDIA,1:KLEV,4) + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(26)%MP) = ZOUT_dnuc(KIDIA:KFDIA,1:KLEV,5) ! It is not clear when NACTERO and when NTRAC @@ -1963,11 +1964,11 @@ SUBROUTINE HAMM7_INTERFACE( & !PGFL(KIDIA:KFDIA,JN,YAEROUT(24)%MP)=SEDOUT(KIDIA:KFDIA,KLEV,JN) PGFL(KIDIA:KFDIA,JN,YAEROUT(39)%MP)=ZXTEMS(KIDIA:KFDIA,JN) END DO - DO JN=1,SUBM_NGASSPEC - PGFL(KIDIA:KFDIA,JN,YAEROUT(25)%MP)=zxtm1(KIDIA:KFDIA,KLEV,ind_oifs_ham%ind_gas_HAM(JN)) - END DO + !DO JN=1,SUBM_NGASSPEC + ! PGFL(KIDIA:KFDIA,JN,YAEROUT(25)%MP)=zxtm1(KIDIA:KFDIA,KLEV,ind_oifs_ham%ind_gas_HAM(JN)) + !END DO - PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(26)%MP)=ZSEDIFLUX(KIDIA:KFDIA,1:KLEV,25) + !PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(26)%MP)=ZSEDIFLUX(KIDIA:KFDIA,1:KLEV,25) IF (LAERCHEM)THEN DO JGAS=1,SUBM_NGASSPEC From 921604fd7ae3626edabdc285bdf2b92a68b04b0c Mon Sep 17 00:00:00 2001 From: Eemeli Holopainen Date: Fri, 28 Mar 2025 13:04:35 +0200 Subject: [PATCH 055/129] Implementation of Morales & Nenes activation with only prescribed sigma_w. --- ifs-source/arpifs/m7/module/mo_activ.F90 | 5 +- ifs-source/arpifs/m7/module/tm5m7_data.F90 | 8 +- ifs-source/arpifs/m7/phys_ec/NdParam.f | 730 ++++ .../arpifs/m7/phys_ec/hamm7_interface.F90 | 265 +- ifs-source/arpifs/m7/phys_ec/parametr.inc | 43 + .../arpifs/m7/phys_ec/yoe_aer_activ.F90 | 3702 +++++++++++++++++ ifs-source/arpifs/module/yoeaeratm.F90 | 3 + ifs-source/arpifs/namelist/naeaer.nam.h | 3 +- ifs-source/arpifs/phys_ec/su_aerw.F90 | 14 +- 9 files changed, 4659 insertions(+), 114 deletions(-) create mode 100644 ifs-source/arpifs/m7/phys_ec/NdParam.f create mode 100644 ifs-source/arpifs/m7/phys_ec/parametr.inc create mode 100644 ifs-source/arpifs/m7/phys_ec/yoe_aer_activ.F90 diff --git a/ifs-source/arpifs/m7/module/mo_activ.F90 b/ifs-source/arpifs/m7/module/mo_activ.F90 index f64cafab..c01edbf2 100644 --- a/ifs-source/arpifs/m7/module/mo_activ.F90 +++ b/ifs-source/arpifs/m7/module/mo_activ.F90 @@ -167,12 +167,9 @@ SUBROUTINE activ_updraft(kproma, kbdim, klev, krow, & ! calculation. pwpdf(1:kproma,:,1) = 1.0_dp ELSE -#ifdef HAMMOZ + CALL aero_activ_updraft_sigma(kproma, kbdim, klev, krow, & ptkem1, zwturb ) -#else - zwturb(1:kproma,:) = 0.8_dp !eehol: use prescribed value for sigma if HAMMOZ not used -#endif CALL aero_activ_updraft_pdf(kproma, kbdim, klev, krow, & zwlarge, zwturb, pw, pwpdf ) diff --git a/ifs-source/arpifs/m7/module/tm5m7_data.F90 b/ifs-source/arpifs/m7/module/tm5m7_data.F90 index e2bc7054..e9cc21c0 100644 --- a/ifs-source/arpifs/m7/module/tm5m7_data.F90 +++ b/ifs-source/arpifs/m7/module/tm5m7_data.F90 @@ -231,7 +231,9 @@ MODULE TM5M7_DATA ! !doc = 2., & ! Density oc [g cm-3] & doc = 1.3, & ! Density POM [g cm-3] - !<<< TvN + !<<< TvN + & dnh4no3 = 1.73, & ! Density NH4NO3 [g cm-3] + & dmsa = 1.48, & ! Density MSA [g cm-3] & dnacl = 2.165, & ! Density NaCl [g cm-3] & dna2so4 = 2.68, & ! Density Na2SO4 [g cm-3] & dnahso4 = 2.435, & ! Density NaHSO4 [g cm-3] @@ -245,7 +247,9 @@ MODULE TM5M7_DATA & wcl = 35.453, & ! Atomic weight Cl [g mol-1] & wnacl = 58.443, & ! Molecular weight NaCl [g mol-1] & wna2so4 = 142.0376, & ! Molecular weight Na2SO4 [g mol-1] - & wnahso4 = 120.0555 ! Molecular weight NaHSO4 [g mol-1] + & wnahso4 = 120.0555, & ! Molecular weight NaHSO4 [g mol-1] + & wdair = 28.970 ! Molecular weight dry air[g mol-1] + !--- 9) Assumed parameters: ------------------------------------------------------ diff --git a/ifs-source/arpifs/m7/phys_ec/NdParam.f b/ifs-source/arpifs/m7/phys_ec/NdParam.f new file mode 100644 index 00000000..df60b50f --- /dev/null +++ b/ifs-source/arpifs/m7/phys_ec/NdParam.f @@ -0,0 +1,730 @@ +!======================================================================= +! +! *** BLOCK DATA BLKPAR +! *** THIS SUBROUTINE PROVIDES INITIAL (DEFAULT) VALUES TO PROGRAM +! PARAMETERS VIA DATA STATEMENTS +! +! *** WRITTEN BY ATHANASIOS NENES +! *** MODIFIED BY PRASHANT KUMAR AND ATHANASIOS NENES +! *** MODIFIED FOR EC-EARTH BY TWAN VAN NOIJE AND ATHANASIOS NENES +! +!======================================================================= +! + BLOCK DATA BLKPAR +! + INCLUDE 'parametr.inc' +! + DATA AMA /29d-3/ ! Air molecular weight + DATA GRAV /9.81d0/ ! g constant + DATA RGAS /8.31d0/ ! Universal gas constant + DATA Dw /2.75d-10/ ! Water Molecule Diameter + DATA AMW /18d-3/ ! Water molecular weight + DATA DENW /1d3/ ! Water density + DATA DHV /2.25d6/ ! Water enthalpy of vaporization + DATA CPAIR /1.0061d3/ ! Air Cp + +! Data for FHH exponent calculation + + DATA D11 /-0.1907/ + DATA D12 /-1.6929/ + DATA D13 /1.4963/ + DATA D14 /-0.5644/ + DATA D15 /0.0711/ + ! for C2 + DATA D21 /-3.9310/ + DATA D22 /7.0906/ + DATA D23 /-5.3436/ + DATA D24 /1.8025/ + DATA D25 /-0.2131/ + ! for C3 + DATA D31 /8.4825/ + DATA D32 /-14.9297/ + DATA D33 /11.4552/ + DATA D34 /-3.9115/ + DATA D35 /0.4647/ + ! for C4 + DATA D41 /-5.1774/ + DATA D42 /8.8725/ + DATA D43 /-6.8527/ + DATA D44 /2.3514/ + DATA D45 /-0.2799/ +! + DATA MAXIT /30/ ! Max iterations for solution + DATA EPS /1d-5/ ! Convergence criterion +! + DATA PI /3.1415927d0/ ! Some constants + DATA ZERO /0d0/ + DATA GREAT /1D30/ + DATA SQ2PI /2.5066282746d0/ +! + DATA CCNSPST /.FALSE./ ! Internal consistency check + DATA FIRST_GAULEG /.TRUE./ +! +! *** END OF BLOCK DATA SUBPROGRAM ************************************* +! + END +!======================================================================= +!======================================================================= +! +! *** SUBROUTINE CCNSPEC +! *** THIS SUBROUTINE CALCULATES THE CCN SPECTRUM OF THE AEROSOL USING +! THE APPROPRIATE FORM OF KOHLER THEORY +! +! *** ORIGINALLY WRITTEN BY ATHANASIOS NENES FOR ONLY KOHLER PARTICLES +! *** MODIFIED BY PRASHANT KUMAR AND ATHANSIOS NENES TO INCLUDE +! *** ACTIVATION BY FHH PARTICLES +! +!======================================================================= +! + SUBROUTINE CCNSPEC (TPI,DPGI,SIGI,MODEI,TPARC,PPARC,NMODES, + & AKKI,A,B,SG) +! + INCLUDE 'parametr.inc' + DOUBLE PRECISION, INTENT(IN) :: TPI(NMODES), DPGI(NMODES), + & SIGI(NMODES), TPARC, PPARC, + & AKKI(NSMX), A, B + + INTEGER, INTENT(IN) :: MODEI(NMODES), NMODES +! + DOUBLE PRECISION, INTENT(OUT) :: SG(NSMX) + + DOUBLE PRECISION, PARAMETER :: ZEPS = 1D-9 !eehol: small value for diameter (1e-8 = 0.01 um) + + DOUBLE PRECISION TP(NSMX) + DOUBLE PRECISION Dpcm + + NMD = NMODES ! Save aerosol params in COMMON + DO I=1,NMD + MODE(I)= MODEI(I) + DPG(I)=DPGI(I) + SIG(I) = SIGI(I) + TP(I) = TPI(I) + ENDDO +!C + TEMP = TPARC ! Save parcel props in COMMON + PRES = PPARC + CALL PROPS ! Thermophysical properties + AKOH = 4D0*AMW*SURT/RGAS/TEMP/DENW ! Kelvin parameter +!C + !WRITE(3345,*) 'AKKI= ', AKKI(:) + !WRITE(3345,*) 'DPG= ', DPG(:) + !WRITE(3345,*) 'AKOH= ', AKOH + + DO K=1,NMD + IF (MODE(K).EQ.1) THEN ! Kohler modes + IF (DPG(K).GE.ZEPS) THEN !eehol: add treshold if median diam is low + PAR1 = 4D0/27D0/AKKI(K)/DPG(K)**3 + PAR2 = SQRT(PAR1*AKOH**3) + SG(K) = EXP(PAR2) - 1D0 + ELSE + SG(K) = ZERO + END IF + ELSEIF (MODE(K).EQ.2) THEN ! FHH modes + CALL DpcFHH(DPG(K),TPARC,A,B,Dpcm) + Dpc(K) = Dpcm + SG(K) = (AKOH/Dpc(K))+(-A*(((Dpc(K)-DPG(K))/(2*Dw))**(-B))) + ENDIF + ENDDO +!C +!C ** INITIALIZE: CALCULATE GAUSS QUADRATURE POINTS ********************* +!C + IF (FIRST_GAULEG) THEN + CALL GAULEG (XGS, WGS, Npgauss) + FIRST_GAULEG = .FALSE. + ENDIF + + !open(unit=667, file='stuffxxx', access='append', status='unknown') + !write(667,*) TEMP, PRES, AKOH, AMW, SURT, RGAS, DENW, SG + !close(667) +!C +!C *** END OF SUBROUTINE CCNSPEC **************************************** +!C + RETURN + END +!C======================================================================= +!C======================================================================= +!C +!C *** SUBROUTINE DpcFHH +!C *** THIS SUBROUTINE CALCULATES THE CRITICAL PARTICLE DIAMETER +!C ACCORDING TO THE FHH ADSOSPRTION ISOTHERM THEORY. +!C +!C *** WRITTEN BY PRASHANT KUMAR AND ATHANASIOS NENES +!C +!C======================================================================= +!C + SUBROUTINE DpcFHH(Ddry,TPARC,A,B,Dc) +!C + Include 'parametr.inc' + DOUBLE PRECISION Ddry,mu,mu1,mu2,mu3,X1,X2l,Dpcm,Dpcl,Dpcu, + &X3,F1,F2,X3l,X2u,X3u,FDpcl,FDpcu,FDpcm,X2m,X3m,Dc,A,B + + TEMP = TPARC + CALL PROPS + + mu=(4*SURT*AMW)/(RGAS*TEMP*DENW) + mu1=(mu*2*Dw)/((A*B)*((2*Dw)**(B+1))) + mu2=1/mu1 + mu3=1-(mu2**(1/(1+B))) + + Dpcl = 0 !Lower Limit + Dpcu = 10e-4 !Upper Limit + +100 X1 = mu2**(1/(1+B)) + X2l = Dpcl**(2/(1+B)) + X3l = X1*X2l + FDpcl=((Dpcl-X3l)/Ddry)-1 + + X1 = mu2**(1/(1+B)) + X2u = Dpcu**(2/(1+B)) + X3u = X1*X2u + FDpcu=((Dpcu-X3u)/Ddry)-1 + + Dpcm = (Dpcu+Dpcl)/2 + + X1= mu2**(1/(1+B)) + X2m= Dpcm**(2/(1+B)) + X3m= X1*X2m + FDpcm=((Dpcm-X3m)/Ddry)-1 + + + If ((FDpcl*FDpcm).Le.0) Then + + If (ABS(FDpcm).Le.10e-8) Then + Goto 200 + Else + Dpcl = Dpcl + Dpcu = Dpcm + goto 100 + End if + + Else If ((FDpcl*FDpcm).GE.0) Then + + If (ABS(FDpcm).Le.10e-8) Then + Goto 200 + Else + Dpcl = Dpcm + Dpcu = Dpcu + goto 100 + End if + + Else If ((FDpcl*FDpcm).Eq.0) Then + Goto 200 + End if + +200 Dc = Dpcm + + RETURN + END + +!C *** END OF SUBROUTINE DpcFHH *************************************** +!C======================================================================= +!C======================================================================= +!C +!C *** SUBROUTINE PDFACTIV +!C *** THIS SUBROUTINE CALCULATES THE CCN ACTIVATION FRACTION ACCORDING +!C TO THE Nenes and Seinfeld (2003) PARAMETERIZATION, WITH +!C MODIFICATION FOR NON-CONTUNUUM EFFECTS AS PROPOSED BY Fountoukis +!C and Nenes (2004). THIS ROUTINE CALCULATES FOR A PDF OF +!C UPDRAFT VELOCITIES. +!C +!C *** WRITTEN BY ATHANASIOS NENES +!C +!C======================================================================= +!C + SUBROUTINE PDFACTIV (WPARC,TP,AKK,A,B,ACCOM,SG,SIGW, + & TPARC,PPARC,NACT,SMAX) +!C + INCLUDE 'parametr.inc' + DOUBLE PRECISION, INTENT(IN) :: TPARC, WPARC, A, B, ACCOM, SIGW, + & TP(NSMX),AKK(NSMX),SG(NSMX) + DOUBLE PRECISION, INTENT(OUT) :: NACT, SMAX + + DOUBLE PRECISION NACTI, SMAXI, DENOM + REAL PDF + +!C +!C *** Single updraft case +!C + IF (SIGW.LT.1e-10) THEN + + !C + !C *** Case where updraft is very small + !C + IF (WPARC.LE.1d-6) THEN + SMAX = 0d0 + NACT = 0d0 + RETURN + ENDIF + + CALL ACTIVATE (WPARC,TP,AKK,A,B,ACCOM,SG,NACT,SMAX) +!C +!C *** PDF of updrafts +!C + ELSE + NACT = ZERO + SMAX = ZERO + DENOM = ZERO + PLIMT = 1e-3 ! Probability of High Updraft limit + PROBI = SQRT(-2.0*LOG(PLIMT*SIGW*SQ2PI)) + WHI = WPARC + SIGW*PROBI ! Upper updrft limit + ! No need to cut off the PDF at 0.05 m/s. + ! Using a lower value will change the normalization. + ! WLO = 0.05 ! Low updrft limit + WLO = 0.0 + SCAL = 0.5*(WHI-WLO) ! Scaling for updrafts + !open(unit=667,file='pgaussxx',access='append',status='unknown') + DO I=1,Npgauss + ! Points are symmetric around zero, + ! so the sign of the XGS term is irrelevant. + ! As the convention is to use a plus sign, + ! we change the minus from the original code into a plus: + !WPI = WLO + SCAL*(1.0-XGS(i)) ! Updraft + WPI = WLO + SCAL*(1.0+XGS(i)) ! Updraft + + ! Catch very small velocities + ! using the same cutoff as above + IF (WPI.LE.1d-6) THEN + SMAXI = 0d0 + NACTI = 0d0 + ELSE + CALL ACTIVATE (WPI,TP,AKK,A,B,ACCOM,SG,NACTI,SMAXI) ! # of drops + ENDIF + PDF = (1.0/SQ2PI/SIGW)*EXP(-0.5*((WPI-WPARC)/SIGW)**2) ! Prob. of updrafts + NACT = NACT + WGS(i)*(PDF*NACTI) ! Integral for drops + SMAX = SMAX + WGS(i)*(PDF*SMAXI) ! Integral for Smax + DENOM = DENOM + WGS(i)*PDF + IF (PDF.LT.PLIMT) GOTO 100 + !write(667,*) NpGauss, i, nacti, smaxi + ENDDO + 100 NACT = NACT/DENOM + SMAX = SMAX/DENOM + !close(667) + ENDIF +!C + RETURN +!C +!C *** END OF SUBROUTINE PDFACTIV *************************************** +!C + END + +!C======================================================================= +!C======================================================================= +!C +!C *** SUBROUTINE ACTIVATE +!C *** THIS SUBROUTINE CALCULATES THE CCN ACTIVATION FRACTION ACCORDING +!C TO THE Nenes and Seinfeld (2003) PARAMETERIZATION, WITH +!C MODIFICATION FOR NON-CONTUNUUM EFFECTS AS PROPOSED BY Fountoukis +!C and Nenes (in preparation). +!C +!C *** WRITTEN BY ATHANASIOS NENES FOR KOHLER PARTICLES +!C *** MODIFIED BY PRASHANT KUMAR AND ATHANASIOS NENES TO INCLUDE FHH +!C PARTICLES +!C +!C======================================================================= +!C + SUBROUTINE ACTIVATE (WPARC,TP,AKK,A,B,ACCOM,SG,NDRPL,SMAX) + INCLUDE 'parametr.inc' + DOUBLE PRECISION NDRPL, WPARCEL,A,B,ACCOM,BET2,BETA + DOUBLE PRECISION TP(NSMX),AKK(NSMX),SG(NSMX) + DOUBLE PRECISION C1, C2, C3, C4, X_FHH +!C +!C *** Setup common block variables +!C + PRESA = PRES/1.013d5 ! Pressure (Pa) + DV = (0.211d0/PRESA)*(TEMP/273d0)**1.94 + DV = DV*1d-4 ! Water vapor diffusivity in air + DBIG = 5.0d-6 + DLOW = 0.207683*((ACCOM)**(-0.33048)) + DLOW = DLOW*1d-6 +!C +!C Compute an average diffusivity Dv as a function of ACCOM +!C + COEF = ((2*PI*AMW/(RGAS*TEMP))**0.5) + DV = (DV/(DBIG-DLOW))*((DBIG-DLOW)-(2*DV/ACCOM)*COEF* + & (DLOG((DBIG+(2*DV/ACCOM)*COEF)/(DLOW+(2*DV/ACCOM)* + & COEF)))) ! Non-continuum effects + + WPARCEL = WPARC +! +! *** Setup constants +! + ALFA = GRAV*AMW*DHV/CPAIR/RGAS/TEMP/TEMP - GRAV*AMA/RGAS/TEMP + BET1 = PRES*AMA/PSAT/AMW + AMW*DHV*DHV/CPAIR/RGAS/TEMP/TEMP + BET2 = RGAS*TEMP*DENW/PSAT/DV/AMW/4d0 + + & DHV*DENW/4d0/AKA/TEMP*(DHV*AMW/RGAS/TEMP - 1d0) + BETA = 0.5d0*PI*BET1*DENW/BET2/ALFA/WPARC/DAIR + CF1 = 0.5*(((1/BET2)/(ALFA*WPARC))**0.5) + CF2 = AKOH/3d0 +! +!C DETERMINATION OF EXPONENT FOR FHH PARTICLES +! + C1 = (D11)+(D12/A)+(D13/(A*A))+(D14/(A*A*A))+(D15/(A*A*A*A)) + C2 = (D21)+(D22/A)+(D23/(A*A))+(D24/(A*A*A))+(D25/(A*A*A*A)) + C3 = (D31)+(D32/A)+(D33/(A*A))+(D34/(A*A*A))+(D35/(A*A*A*A)) + C4 = (D41)+(D42/A)+(D43/(A*A))+(D44/(A*A*A))+(D45/(A*A*A*A)) + X_FHH = (C1) + (C2/B) + (C3/(B*B)) + (C4/(B*B*B)) +! +! *** INITIAL VALUES FOR BISECTION ************************************* +! + X1 = 1.0d-5 ! Min cloud supersaturation -> 0 + CALL SINTEGRAL (X1,NDRPL,WPARCEL,TP,X_FHH,BET2,SG, + & SINTEG1,SINTEG2,SINTEG3) + Y1 = (SINTEG1*CF1+SINTEG2*CF2+SINTEG3*CF1)*BETA*X1 - 1d0 +! + X2 = 0.1d0 ! MAX cloud supersaturation = 10% + CALL SINTEGRAL (X2,NDRPL,WPARCEL,TP,X_FHH,BET2,SG, + & SINTEG1,SINTEG2,SINTEG3) + Y2 = (SINTEG1*CF1+SINTEG2*CF2+SINTEG3*CF1)*BETA*X2 - 1d0 +! +! *** PERFORM BISECTION ************************************************ +! +20 DO 30 I=1,MAXIT + X3 = 0.5*(X1+X2) + CALL SINTEGRAL (X3,NDRPL,WPARCEL,TP,X_FHH,BET2,SG, + & SINTEG1,SINTEG2,SINTEG3) + Y3 = (SINTEG1*CF1+SINTEG2*CF2+SINTEG3*CF1)*BETA*X3 - 1d0 +! + IF (SIGN(1.d0,Y1)*SIGN(1.d0,Y3) .LE. ZERO) THEN ! (Y1*Y3 .LE. ZERO) + Y2 = Y3 + X2 = X3 + ELSE + Y1 = Y3 + X1 = X3 + ENDIF +! + IF (ABS(X2-X1) .LE. EPS*X1) GOTO 40 + NITER = I + +30 CONTINUE + +! *** CONVERGED ; RETURN *********************************************** +40 X3 = 0.5*(X1+X2) +! + CALL SINTEGRAL (X3,NDRPL,WPARCEL,TP,X_FHH,BET2,SG, + & SINTEG1,SINTEG2,SINTEG3) + Y3 = (SINTEG1*CF1+SINTEG2*CF2+SINTEG3*CF1)*BETA*X3 - 1d0 + + SMAX = X3 + + RETURN +!C +!C *** END OF SUBROUTINE ACTIVATE *************************************** +!C + END +!C======================================================================= +!C======================================================================= +!C +!C *** SUBROUTINE SINTEGRAL +!C *** THIS SUBROUTINE CALCULATES THE CONDENSATION INTEGRALS, ACCORDING +!C TO THE POPULATION SPLITTING ALGORITHM AND THE SUBSEQUENT VERSIONS: +!C +!C - Nenes and Seinfeld (2003) Population Splitting +!C - Fountoukis and Nenes (2004) Modal formulation +!C - Barahona and Nenes (2010) Approach for large CCN +!C - Morales and Nenes (2014) Population Splitting revised +!C +!C *** WRITTEN BY ATHANASIOS NENES for Kohler Particles +!C *** MODFIFIED BY PRASHANT KUMAR AND ATHANASIOS NENES TO INCLUDE FHH +!C PARTICLES +!C======================================================================= +!C + SUBROUTINE SINTEGRAL (SPAR, SUMMA, WPARCEL, TP, XFHH, BET2, SG, + & SUM, SUMMAT, SUMFHH) +!C + INCLUDE 'parametr.inc' + DOUBLE PRECISION SUM, SUMMAT, SUMMA, Nd(NSMX),WPARCEL,TP(NSMX), + & INTEG1(NSMX),INTEG2(NSMX),SG(NSMX),A,B,BET2 + & ,SUMFHH,INTEG1F(NSMX),NdF(NSMX), XFHH + + REAL ERF1,ERF2,ERF3,ERF4,ERF5,ERF6,ERF4F,ERF5F,ERF66F + REAL ORISM1, ORISM2, ORISM3, ORISM4, ORISM5,ORISM6 + REAL intaux2, intaux1p1, intaux1p2, DLGSP1,DLGSP2 + REAL scrit +!C + REAL ORISM1F, ORISM2F, ORISM3F, ORISM4F, ORISM5F, + & ORISM6F, ORISM7F, ORISM8F, ORISM9F, ORISM10F, + & ORISM11F, ORISM66F +! + SQTWO = SQRT(2d0) +!C +!C ** Population Splitting -- Modified by Ricardo Morales 2014 + + DESCR = 1d0 - (16d0/9d0)*ALFA*WPARCEL*BET2*(AKOH/SPAR**2)**2 + IF (DESCR.LE.0d0) THEN + CRIT2 = .TRUE. + scrit = ((16d0/9d0)*ALFA*WPARCEL*BET2*(AKOH**2))**(0.25d0) ! Scrit - (only for DELTA < 0 ) + RATIO = (2.0d7/3.0)*AKOH*(SPAR**(-0.3824)-scrit**(-0.3824)) ! Computing sp1 and sp2 (sp1 = sp2) + RATIO = 1/SQTWO + RATIO + IF (RATIO.GT.1.0) RATIO = 1.0 + SSPLT2 = SPAR*RATIO + ELSE + CRIT2 = .FALSE. + SSPLT1 = 0.5d0*(1d0-SQRT(DESCR)) ! min root --> sp1 + SSPLT2 = 0.5d0*(1d0+SQRT(DESCR)) ! max root --> sp2 + SSPLT1 = SQRT(SSPLT1)*SPAR ! Multiply ratios with Smax + SSPLT2 = SQRT(SSPLT2)*SPAR + ENDIF +!C + SSPLT = SSPLT2 ! Store Ssplit in COMMON +!C +!C *** Computing the condensation integrals I1 and I2 +!C + SUM = 0.0d0 !Contribution of integral 1 for Kohler + SUMMAT = 0.0d0 !Contribution of integral 2 for kohler + SUMMA = 0.0d0 !Variable that stores all droplets + SUMFHH = 0.0d0 !Contribution of FHH integral +!C + DO J = 1, NMD +!C + IF (SG(J).GT.0D0) THEN !eehol: do not calculate if SG=0 or less + IF (MODE(J).EQ.1) THEN ! Kohler modes +!C + DLGSG = DLOG(SIG(J)) !ln(sigmai) + DLGSP = DLOG(SG(J)/SPAR) !ln(sg/smax) + DLGSP2 = DLOG(SG(J)/SSPLT2) !ln(sg/sp2) +!C + ORISM1 = 2.d0*DLGSP2/(3.d0*SQTWO*DLGSG) ! u(sp2) + ORISM2 = ORISM1 - 3.d0*DLGSG/(2.d0*SQTWO) ! u(sp2)-3ln(sigmai)/(2sqrt(2) + ORISM5 = 2.d0*DLGSP/(3.d0*SQTWO*DLGSG) ! u(smax) + ORISM3 = ORISM5 - 3.d0*DLGSG/(2.d0*SQTWO) ! u(smax)-3ln(sigmai)/(2sqrt(2) + DEQ = AKOH*2d0/SG(j)/3d0/SQRT(3d0) ! Dp0 = Dpc/sqrt(3) - Equilibrium diameter + + ERF2 = erfp(ORISM2) + ERF3 = erfp(ORISM3) + + INTEG2(J) = (EXP(9D0/8D0*DLGSG*DLGSG)*TP(J)/SG(J))* + & (ERF2 - ERF3) ! I2(sp2,smax) + + IF (CRIT2) THEN + + ORISM6 = (SQTWO*DLGSP2/3d0/DLGSG)-(1.5d0*DLGSG/SQTWO) + ERF6 = erfp(ORISM6) + + INTEG1(J) = 0.0d0 + DW3 = TP(j)*DEQ*EXP(9D0/8D0*DLGSG*DLGSG)* ! 'inertially' limited particles + & (1d0-ERF6)*((BET2*ALFA*WPARCEL)**0.5d0) + + ELSE + + EKTH = EXP(9D0/2d0*DLGSG*DLGSG) + DLGSP1 = DLOG(SG(J)/SSPLT1) ! ln(sg/sp1) + ORISM4 = ORISM1 + 3.d0*DLGSG/SQTWO ! u(sp2) + 3ln(sigmai)/sqrt(2) + ERF1 = erfp(ORISM1) + ERF4 = erfp(ORISM4) + + intaux1p2 = TP(J)*SPAR*((1-ERF1) - + & 0.5d0*((SG(J)/SPAR)**2)*EKTH*(1-ERF4)) ! I1(0,sp2) + + ORISM1 = 2.d0*DLGSP1/(3.d0*SQTWO*DLGSG) ! u(sp1) + ORISM4 = ORISM1 + 3.d0*DLGSG/SQTWO ! u(sp1) + 3ln(sigmai)/sqrt(2) + ORISM6 = (SQTWO*DLGSP1/3d0/DLGSG)-(1.5d0*DLGSG/SQTWO) + + ERF1 = erfp(ORISM1) + ERF4 = erfp(ORISM4) + ERF6 = erfp(ORISM6) + + intaux1p1 = TP(J)*SPAR*((1-ERF1) - + & 0.5d0*((SG(J)/SPAR)**2)*EKTH*(1-ERF4)) ! I1(0,sp1) + + INTEG1(J) = (intaux1p2-intaux1p1) ! I1(sp1,sp2) = I1(0,sp2) - I1(0,sp1) +! + DW3 = TP(j)*DEQ*EXP(9D0/8D0*DLGSG*DLGSG)* ! 'inertially' limited particles. + & (1d0-ERF6)*((BET2*ALFA*WPARCEL)**0.5d0) + + ENDIF + +!C *** Calculate number of Drops + + ERF5 = erfp(ORISM5) +! + Nd(J) = (TP(J)/2.0)*(1.0-ERF5) + SUM = SUM + INTEG1(J) + DW3 !SUM OF INTEGRAL 1 FOR KOHLER + SUMMAT = SUMMAT + INTEG2(J) !SUM OF INTEGRAL 2 FOR KOHLER + SUMMA = SUMMA + Nd(J) !SUM OF ACTIVATED KOHLER PARTICLES + +!C + ELSEIF (MODE(J).EQ.2) THEN ! FHH modes +!C + DLGSGF = DLOG(SIG(J)) ! ln(sigma,i) + DLGSPF = DLOG(SG(J)/SPAR) ! ln(sg/smax) + ORISM1F = (SG(J)*SG(J))/(SPAR*SPAR) ! (sg/smax)^2 + ORISM2F = EXP(2D0*XFHH*XFHH*DLGSGF*DLGSGF) ! exp(term) + ORISM3F = SQTWO*XFHH*DLGSGF ! sqrt(2).x.ln(sigma,i) + ORISM4F = DLGSPF/(-1*ORISM3F) ! Umax + ORISM5F = ORISM3F - ORISM4F + ERF5F = erfp(ORISM5F) + ORISM6F = ERF5F + ORISM7F = ORISM6F + 1 + ORISM8F = 0.5*ORISM1F*ORISM2F*ORISM7F + ERF4F = erfp(ORISM4F) + ORISM9F = ORISM8F + ERF4F - 1 + + INTEG1F(J) =-1*TP(J)*SPAR*ORISM9F +!C +!C *** Calculate number of drops activated by FHH theory +!C + ERF4F = erfp(ORISM4F) + + NdF(J) = (TP(J)/2.0)*(1-ERF4F) + SUMFHH = SUMFHH + INTEG1F(J) !Sum of Integral 1 for FHH + SUMMA = SUMMA + NdF(J) !Sum of ACTIVATED Kohler + FHH particles + + ENDIF + ENDIF !eehol: if SG.GT.ZERO + ENDDO + RETURN +!C + END +!C======================================================================= +!C======================================================================= +!C +!C *** SUBROUTINE PROPS +!C *** THIS SUBROUTINE CALCULATES THE THERMOPHYSICAL PROPERTIES +!C +!C *** WRITTEN BY ATHANASIOS NENES +!C +!C======================================================================= +!C + SUBROUTINE PROPS + INCLUDE 'parametr.inc' + REAL VPRES, SFT +!C + PRESA = PRES/1.013d5 ! Pressure (Pa) + DAIR = PRES*AMA/RGAS/TEMP ! Air density + AKA = (4.39+0.071*TEMP)*1d-3 ! Air thermal conductivity + PSAT = VPRES(SNGL(TEMP))*(1e5/1.0d3) ! Saturation vapor pressure + SURT = SFT(SNGL(TEMP)) ! Surface Tension for water (J m-2) +!C + RETURN +!C +!C *** END OF SUBROUTINE PROPS ****************************************** +!C + END +!C======================================================================= +!C======================================================================= +!C +!C *** FUNCTION VPRES +!C *** THIS FUNCTION CALCULATES SATURATED WATER VAPOUR PRESSURE AS A +!C FUNCTION OF TEMPERATURE. VALID FOR TEMPERATURES BETWEEN -50 AND +!C 50 C. +!C +!C========================= ARGUMENTS / USAGE =========================== +!C +!C INPUT: +!C [T] +!C REAL variable. +!C Ambient temperature expressed in Kelvin. +!C OUTPUT: +!C [VPRES] +!C REAL variable. +!C Saturated vapor pressure expressed in mbar. +!C +!C======================================================================= +!C + REAL FUNCTION VPRES (T) + REAL A(0:6), T + DATA A/6.107799610E+0, 4.436518521E-1, 1.428945805E-2, + & 2.650648471E-4, 3.031240396E-6, 2.034080948E-8, + & 6.136820929E-11/ + + TTEMP = T-273 + VPRES = A(6)*TTEMP + DO I=5,1,-1 + VPRES = (VPRES + A(I))*TTEMP + ENDDO + VPRES = VPRES + A(0) + RETURN + END +!C======================================================================= +!C======================================================================= +!C +!C *** FUNCTION SFT +!C *** THIS FUNCTION CALCULATES WATER SURFACE TENSION AS A +!C FUNCTION OF TEMPERATURE. VALID FOR TEMPERATURES BETWEEN -40 AND +!C 40 C. +!C +!C ======================== ARGUMENTS / USAGE =========================== +!C +!C INPUT: +!C [T] +!C REAL variable. +!C Ambient temperature expressed in Kelvin. +!C +!C OUTPUT: +!C [SFT] +!C REAL variable. +!C Surface Tension expressed in J m-2. +!C +!C======================================================================= +!C + REAL FUNCTION SFT (T) + REAL T +!C + TPARS = T-273 + SFT = 0.0761-1.55e-4*TPARS +!C + RETURN + END +!C======================================================================= +!C *********************************************************************** +!C + SUBROUTINE GAULEG (X,W,N) +!C +!C Calculation of points and weights for N point GAUSS integration +!C *********************************************************************** + DIMENSION X(N), W(N) + PARAMETER (EPS=1.E-6) + PARAMETER (X1=-1.0, X2=1.0) +!C +!C Calculation +!C + M=(N+1)/2 + XM=0.5d0*(X2+X1) + XL=0.5d0*(X2-X1) + DO 12 I=1,M + Z=COS(3.141592654d0*(I-.25d0)/(N+.5d0)) +1 CONTINUE + P1=1.d0 + P2=0.d0 + DO 11 J=1,N + P3=P2 + P2=P1 + P1=((2.d0*J-1.)*Z*P2-(J-1.d0)*P3)/J +11 CONTINUE + PP=N*(Z*P1-P2)/(Z*Z-1.d0) + Z1=Z + Z=Z1-P1/PP + IF(ABS(Z-Z1).GT.EPS)GO TO 1 + X(I)=XM-XL*Z + X(N+1-I)=XM+XL*Z + W(I)=2.d0*XL/((1.d0-Z*Z)*PP*PP) + W(N+1-I)=W(I) +12 CONTINUE + RETURN + END + +!C======================================================================= +!C +!C *** REAL FUNCTION erfp +!C *** THIS SUBROUTINE CALCULATES THE ERROR FUNCTION USING A +!C *** POLYNOMIAL APPROXIMATION +!C +!C======================================================================= +!C + REAL*8 FUNCTION erfp(x) + REAL :: x + REAL*8 :: AA(4), axx, y + DATA AA /0.278393d0,0.230389d0,0.000972d0,0.078108d0/ + + y = dabs(dble(x)) + axx = 1.d0 + y*(AA(1)+y*(AA(2)+y*(AA(3)+y*AA(4)))) + axx = axx*axx + axx = axx*axx + axx = 1.d0 - (1.d0/axx) + if(x.le.0.) then + erfp = -axx + else + erfp = axx + endif + RETURN + END FUNCTION diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index ed5b4cc4..18ad0c96 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -188,6 +188,8 @@ SUBROUTINE HAMM7_INTERFACE( & USE MO_HAMMOZ_DRYDEP, ONLY: drydep_interface ! dry deposition interface call USE MO_HAM_RAD, ONLY: ham_rad,ham_rad_cache_cleanup,ham_rad_cache +USE YOE_AER_ACTIV, ONLY: AER_ACTIV !eehol use M&N activation scheme + ! [RCHG -> non used] USE MO_SPECIES, ONLY: speclist !SO2 wetdep for simple sulfur scheme ! [RCHG -> non used] USE mo_ham_species, ONLY: id_so2 !SO2 wetdep for simple sulfur scheme ! [RCHG -> non used] USE YOMMP0, ONLY : MYPROC, NPROC @@ -319,13 +321,15 @@ SUBROUTINE HAMM7_INTERFACE( & REAL(KIND=JPRB), ALLOCATABLE :: ZAERNGT(:,:) REAL(KIND=JPRB) :: ZDEGRAD, ZEPSCOV, ZEPSWAT, ZRWSAT, ZRWPWP -REAL(KIND=JPRB) :: ZQLWP(KLON,KLEV) !, ZQLWP2(KLON,KLEV) +REAL(KIND=JPRB) :: ZQLWP(KLON,KLEV), ZQLWP2(KLON,KLEV) REAL(KIND=JPRB) :: ZTMPA, ZTEMP, ZDPOG, ZQIWP, ZPODT LOGICAL :: LLIQCLD(KLON,KLEV) ! logical for liquid cloud LOGICAL :: LICECLD(KLON,KLEV) ! logical for ice cloud REAL(KIND=JPRB), PARAMETER :: ZEPSEC=1e-14 +REAL(KIND=JPRB), PARAMETER :: ZMIN_CDNC=1.0_JPRB !eehol: minimum CDNC (can be changed but for now 1 cm-3) +REAL(KIND=JPRB), PARAMETER :: ZTUNPAR=0.8164965_JPRB !eehol: tuning parameter for sigma_w derived from TKE (square root of 2/3 (isotropy assumption)) ! [RCHG -> var non used ] INTEGER(KIND=JPIM) :: j_yaerom, JMMD, JSCAV, JSW, JSPEC ! [RCHG -> var. non used ] INTEGER(KIND=JPIM) :: IAER, IEX3D, IEX3DP @@ -377,6 +381,8 @@ SUBROUTINE HAMM7_INTERFACE( & REAL(KIND=JPRB), ALLOCATABLE :: ZRC(:,:,:,:) !critical radius of activation per mode [m] REAL(KIND=JPRB), ALLOCATABLE :: ZSMAX(:,:,:) !maximum supersaturation REAL(KIND=JPRB) :: ZTKEM1(KLON,KLEV) !turbulent kinetic energy as zero as it is not used for now +REAL(KIND=JPRB) :: ZSIGMA_W(KLON,KLEV) !standard deviation of updraft pdf +REAL(KIND=JPRB) :: ZSMAXMN(KLON,KLEV) !maximum supersaturation for M&N scheme REAL(KIND=JPRB) :: ZWCAPE(KLON) !CAPE as zero as it is not used REAL(KIND=JPRB) :: ZRDRY(KLON,KLEV,nclass) !dry radius for each class REAL(KIND=JPRB) :: ZESW(KLON,KLEV) !saturation water vapor pressure @@ -543,6 +549,7 @@ SUBROUTINE HAMM7_INTERFACE( & ! --- YREAERATM ------------------------------------------- & LAERDRYDP => YREAERATM%LAERDRYDP, & & LAERSEDIM => YREAERATM%LAERSEDIM, & + & NAERACT => YREAERATM%NAERACT, & !eehol: integer to switch activation scheme & LAERSURF => YREAERATM%LAERSURF, & !add logicals for dry dep and sedi & LAER6SDIA => YREAERATM%LAER6SDIA, & & LAERCLIMG => YREAERATM%LAERCLIMG, & @@ -988,6 +995,8 @@ SUBROUTINE HAMM7_INTERFACE( & END IF ENDDO ! End allocate variables for aerosol processes + + ZWPDF(KIDIA:KFDIA,1:KLEV,:) = 0.0_JPRB !eehol: init zwpdf to zero !----------------------------------------------------------------- ! Submodel interface call (HAM aerosol microphysics) @@ -1021,115 +1030,161 @@ SUBROUTINE HAMM7_INTERFACE( & CALL GSTATS(2502,0) - !---calculate updraft velocity ZTKEM1(KIDIA:KFDIA,1:KLEV) = 0._JPRB ! turbulent kinetic energy as zero for now as it is not used (YET!) - ZWCAPE(KIDIA:KFDIA) = 0._JPRB ! CAPE as zero as it is not used - - CALL activ_updraft(KFDIA, KLON, KLEV, ZKROW, & ! krow = 1 - ZTKEM1, ZWCAPE, PVERVEL, ZRHO, & ! turbulent kinetic energy, CAPE contr. to conv. vert. veloc. [m s-1], large scale vert. veloc. - ZW, ZWPDF) - - DO JT = 1,NTRAC - ZXTP1(KIDIA:KFDIA,1:KLEV,JT) = ZXTM1(KIDIA:KFDIA,1:KLEV,JT) + ZXTTE(KIDIA:KFDIA,1:KLEV,JT) * TIME_STEP_LEN - END DO - - IF (ncd_activ == 2 .OR. nccndiag > 0) THEN - CALL ham_activ_koehler_ab(KFDIA, KLON, KLEV, ZKROW, KTDIA, & ! krow=1 ktdia=1 - ZXTP1, PTP, ZA, ZB) - END IF - DO JCLASS = 1,nclass! nclass=7 - IF (sizeclass(jclass)%lsoluble) THEN - ZRDRY(KIDIA:KFDIA,1:KLEV,JCLASS) = ZM6DRY(KIDIA:KFDIA,1:KLEV,JCLASS) !soluble modes rdry from rdry_m7 - ELSE - ZRDRY(KIDIA:KFDIA,1:KLEV,JCLASS) = ZM6RP(KIDIA:KFDIA,1:KLEV,JCLASS) !insoluble modes rdry from rwet_m7 - END IF - END DO + !eehol: integer to use M&N activation scheme or AR&G + IF ( NAERACT == 1 ) THEN ! Morales and Nenes activation scheme + + !IF ( LCONSIGW ) THEN !eehol: if using the constant sigma_w it is set to 0.8 otherwise use the TKE to calculate (NOT USED YET!) + ZSIGMA_W(KIDIA:KFDIA,1:KLEV) = 0.8_JPRB + !ELSE + ! ZSIGMA_W(KIDIA:KFDIA,1:KLEV)= MAX(0.1_JPRB, (ZTUNPAR*((ZTKEM1(KIDIA:KFDIA,1:KLEV))**0.5_JPRB))) ! m/s + !END IF + + ! put default values for effective radii + reffl(KIDIA:KFDIA,1:KLEV,ZKROW) = 4._JPRB ! comes from liquid effective radius routine (PP_MIN_RE_UM) + reffi(KIDIA:KFDIA,1:KLEV,ZKROW) = 80._JPRB*0.64952_JPRB ! comes from ice effective radius routine (ZDEFAULT_RE_UM) + CALL AER_ACTIV(KIDIA, KFDIA, KTDIA, KLON, KLEV, KSTGLO, & + & PRS1, PRSF1, PTP, ZQP, ZQSAT, & + & PVERVEL, ZAP, PLP, PIP, & + & PLSM, PGELAM, PGEMU, & !PSLON, PGEMU, & + & PGFL, YDMODEL, ZCDNCACT, ZICNC, REFFL(1:KLON,1:KLEV,ZKROW), REFFI(1:KLON,1:KLEV,ZKROW), & + & ZSMAXMN, ZM6DRY, ZXTM1, KTRAC, ZSIGMA_W) + + !<-- Store CDNC (number of activated particles) and ICNC as a number mixing ratio to tracer values + ZXTM1(KIDIA:KFDIA,1:KLEV,idt_cdnc) = (MAX(ZCDNCACT(KIDIA:KFDIA,1:KLEV),((1.0E6_JPRB)*ZMIN_CDNC)))/ZRHO(KIDIA:KFDIA,1:KLEV) ! [#/kg] and treshold CDNC + ZXTM1(KIDIA:KFDIA,1:KLEV,idt_icnc) = (1.0E6_JPRB)*ZICNC(KIDIA:KFDIA,1:KLEV)/ZRHO(KIDIA:KFDIA,1:KLEV) !ice crystal number conc = #/cm3 --> number mix rat [#/kg] + + PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH) = MAX(((1.0E-6_JPRB)*ZCDNCACT(KIDIA:KFDIA,1:KLEV)),ZMIN_CDNC) ! add CDNC to PGFL field (convert from #/m3 to #/cm3) and treshold minimum value + PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH) = ZICNC(KIDIA:KFDIA,1:KLEV) ! add ICNC to PGFL field (does not need convert) + ! add effective radii to PGFL fields + PGFL(KIDIA:KFDIA,1:KLEV,YRE_LIQ%MP9_PH) = 1.0E-06_JPRB * reffl(KIDIA:KFDIA,1:KLEV,ZKROW) ! convert um to meters and save to PGFL fields + PGFL(KIDIA:KFDIA,1:KLEV,YRE_ICE%MP9_PH) = 1.0E-06_JPRB * reffi(KIDIA:KFDIA,1:KLEV,ZKROW) ! convert um to meters and save to PGFL fields + + ELSE IF (NAERACT == 2) THEN !eehol: use AR&G scheme + + !IF ( LCONSIGW ) THEN !eehol: if using the constant sigma_w it is set to 0.8 otherwise use the TKE to calculate (NOT USED YET!!) + ZTKEM1(KIDIA:KFDIA,1:KLEV) = ((1/ZTUNPAR)**2)*((0.8_JPRB)**2) !eehol: this is converted back to sigma_w in mo_activ.F90 + !ELSE + ! ZTKEM1(KIDIA:KFDIA,1:KLEV) = ZTKEM1(KIDIA:KFDIA,1:KLEV) + !END IF + + !---calculate updraft velocity + ZWCAPE(KIDIA:KFDIA) = 0._JPRB ! CAPE as zero as it is not used + + CALL activ_updraft(KFDIA, KLON, KLEV, ZKROW, & ! krow = 1 + ZTKEM1, ZWCAPE, PVERVEL, ZRHO, & ! turbulent kinetic energy, CAPE contr. to conv. vert. veloc. [m s-1], large scale vert. veloc. + ZW, ZWPDF) + + DO JT = 1,NTRAC + ZXTP1(KIDIA:KFDIA,1:KLEV,JT) = ZXTM1(KIDIA:KFDIA,1:KLEV,JT) + ZXTTE(KIDIA:KFDIA,1:KLEV,JT) * TIME_STEP_LEN + END DO + + IF (ncd_activ == 2 .OR. nccndiag > 0) THEN + CALL ham_activ_koehler_ab(KFDIA, KLON, KLEV, ZKROW, KTDIA, & ! krow=1 ktdia=1 + ZXTP1, PTP, ZA, ZB) + END IF + + DO JCLASS = 1,nclass! nclass=7 + IF (sizeclass(jclass)%lsoluble) THEN + ZRDRY(KIDIA:KFDIA,1:KLEV,JCLASS) = ZM6DRY(KIDIA:KFDIA,1:KLEV,JCLASS) !soluble modes rdry from rdry_m7 + ELSE + ZRDRY(KIDIA:KFDIA,1:KLEV,JCLASS) = ZM6RP(KIDIA:KFDIA,1:KLEV,JCLASS) !insoluble modes rdry from rwet_m7 + END IF + END DO + + !calculate saturation water vapor pressure from saturation specific humidity + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZESW(JL,JK)=(ZQSAT(JL,JK)*PRSF1(JL,JK))/(0.62198_JPRB) + ENDDO + ENDDO - !calculate saturation water vapor pressure from saturation specific humidity - DO JK=1,KLEV - DO JL=KIDIA,KFDIA - ZESW(JL,JK)=(ZQSAT(JL,JK)*PRSF1(JL,JK))/(0.62198_JPRB) - ENDDO - ENDDO + ZWPDF(KIDIA:KFDIA,1:KLEV,:) = MAX(ZWPDF(KIDIA:KFDIA,1:KLEV,:),1.0E-6_JPRB) !eehol: treshold vvel PDF to 1e-6 to get rid of 0 division + + CALL HAM_ACTIV_ABDULRAZZAK_GHAN( KFDIA, KLON, KLEV, ZKROW, KTDIA, & ! in original 1 = ktdia... for diagnostics so krow=1 and ktdia=1 + & ZCDNCACT, ZESW, ZRHO, & ! number of activated particles, saturation vapor pressure, air density + & ZXTP1, PTP, PRSF1, ZQP, & ! tracer mix rat, temperature, air pressure, spec. humid. + & ZW, ZWPDF, ZA, ZB, ZRDRY, & ! mean udr veloc, pdf of udr. veloc, Koehler A, Koehler B, dry radius + & ZNACT, ZFRACN, ZSC, ZRC, ZSMAX) ! num. act. part. per mode, frac ", crit. ssat., crit. radius, max ssat + + !<-- End activation for HAM-M7 + !----------------------------------------------------------------- + + !<-- Store CDNC (number of activated particles) and ICNC as a number mixing ratio to tracer values and to PGFL fields + ZXTM1(KIDIA:KFDIA,1:KLEV,idt_cdnc) = (MAX(ZCDNCACT(KIDIA:KFDIA,1:KLEV),((1.0E6_JPRB)*ZMIN_CDNC)))/ZRHO(KIDIA:KFDIA,1:KLEV) ! [#/kg] and treshold CDNC to 1 cm-3 + ZXTM1(KIDIA:KFDIA,1:KLEV,idt_icnc) = (1.0E6_JPRB)*ZICNC(KIDIA:KFDIA,1:KLEV)/ZRHO(KIDIA:KFDIA,1:KLEV) !ice crystal number conc = #/cm3 --> number mix rat [#/kg] + PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH) = 1.0E-6_JPRB*( MAX(ZCDNCACT(KIDIA:KFDIA,1:KLEV), ZMIN_CDNC*1.0E+6_JPRB)) ! convert from #/m3 to #/cm3 and treshold minimum value to 1 cm-3 + PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH) = MAX( ZICNC(KIDIA:KFDIA,1:KLEV), 0.027_JPRB) ! no conversion needed: already in #/cm3, just max of default value (RNICE in sucldp.F90) and icnc + !--> End store CDNC and ICNC + + !----------------------------------------------------------------- + !--> Calculation for effective radii and put to PGFL fields + + ! put default values for effective radii + reffl(KIDIA:KFDIA,1:KLEV,ZKROW) = 4._JPRB ! comes from liquid effective radius routine (PP_MIN_RE_UM) + reffi(KIDIA:KFDIA,1:KLEV,ZKROW) = 80._JPRB*0.64952_JPRB ! comes from ice effective radius routine (ZDEFAULT_RE_UM) + + ! liquid effective radius + + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + IF ( PAP(JL,JK) >=0.001_JPRB ) THEN + ZTEMP=1.0_JPRB/PAP(JL,JK) + ZDPOG=1.0/RG*(PRS1(JL,JK)-PRS1(JL,JK-1)) + !-- cloud and ice water path in kg m-2 + ZQIWP =MAX(0._JPRB,ZDPOG*PIP(JL,JK)*ZTEMP) + ZQLWP(JL,JK) =MAX(0._JPRB,ZDPOG*PLP(JL,JK)*ZTEMP) + !-- cloud and ice water content in g m-3 + ZPODT=1.0/RD*PRSF1(JL,JK)/PTP(JL,JK) + ZIP(JL,JK)=PIP(JL,JK)*ZPODT*ZTEMP + ZLP(JL,JK)=PLP(JL,JK)*ZPODT*ZTEMP + ELSE + ZQIWP = 0._JPRB + ZQLWP(JL,JK) = 0._JPRB + ZLP(JL,JK) = 0._JPRB + ZIP(JL,JK) = 0._JPRB + ENDIF + END DO + END DO + + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZTMPA = 1.0_JPRB/MAX(ZAP(JL,JK),ZEPSEC) + LLIQCLD(JL,JK) = ( PLP(JL,JK)*ZTMPA ) > ZEPSEC ! logical for liquid cloud + LICECLD(JL,JK) = ( PIP(JL,JK)*ZTMPA ) > ZEPSEC ! logical for ice cloud + ZQLWP2(JL,JK) = PLP(JL,JK)/MAX(ZAP(JL,JK),1.E-10_JPRB) ! calculate lwp + ZQLWP2(JL,JK) = MIN(MAX(ZQLWP2(JL,JK),0.0_JPRB),10*RCLDMAX) ! treshold lwp, lianghai changed + + ! effective radius calculated similarly as in radlswr.F90 + ! 2.387e-10 is 3/(4*pi*rho_liq*10^6) [10^6 for N in right units] + ZRE_LIQ(JL,JK) = 1.0E+6_JPRB*(2.387e-10_JPRB*ZRHO(JL,JK)*ZQLWP2(JL,JK)/(MAX(PGFL(JL,JK,YCDNC%MP9_PH),ZMIN_CDNC)))**0.333_JPRB ! calculate effective radius in um (use minimum value for CDNC if CDNC is small) + END DO + END DO + ! Add liq. eff. rad. to HAM variables (only if there is liquid cloud else minimum value) + REFFL(KIDIA:KFDIA,1:KLEV,ZKROW) = MERGE(ZRE_LIQ(KIDIA:KFDIA,1:KLEV)*1.E+6_JPRB,4._JPRB,LLIQCLD(KIDIA:KFDIA,1:KLEV)) + CALL ICE_EFFECTIVE_RADIUS(YRERAD, YDSPP_CONFIG, KIDIA, KFDIA, KLON, KLEV, & + & PRSF1, PTP, ZAP, PIP, PSP, PGEMU, & ! pressure, temp, cloud fr., IWC, SWC, sine of latitude + & reffi(1:KLON,1:KLEV,ZKROW)) ! ice effective radius (updated to mo_activ variable 'reffi' which used in mo_ham_wetdep) + + ! only if there is ice cloud else minimum value + REFFI(KIDIA:KFDIA,1:KLEV,ZKROW) = MERGE(REFFI(KIDIA:KFDIA,1:KLEV,ZKROW), 20._JPRB, LICECLD(KIDIA:KFDIA,1:KLEV)) + + ! add effective radii to PGFL fields + PGFL(KIDIA:KFDIA,1:KLEV,YRE_LIQ%MP9_PH) = 1.0E-06_JPRB * reffl(KIDIA:KFDIA,1:KLEV,ZKROW) ! convert um to meters and save to PGFL fields + PGFL(KIDIA:KFDIA,1:KLEV,YRE_ICE%MP9_PH) = 1.0E-06_JPRB * reffi(KIDIA:KFDIA,1:KLEV,ZKROW) ! convert um to meters and save to PGFL fields + + !<-- End calculation for effective radii + !----------------------------------------------------------------- + + ! treshold CDNC and ICNC to gridcells with only liquid or ice clouds + PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH) = MERGE(PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH),ZMIN_CDNC,LLIQCLD(KIDIA:KFDIA,1:KLEV)) + PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH) = MERGE(PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH),RNICE,LICECLD(KIDIA:KFDIA,1:KLEV)) + + END IF !eehol: end if for M&N or AR&G activation - CALL HAM_ACTIV_ABDULRAZZAK_GHAN( KFDIA, KLON, KLEV, ZKROW, KTDIA, & ! in original 1 = ktdia... for diagnostics so krow=1 and ktdia=1 - & ZCDNCACT, ZESW, ZRHO, & ! number of activated particles, saturation vapor pressure, air density - & ZXTP1, PTP, PRSF1, ZQP, & ! tracer mix rat, temperature, air pressure, spec. humid. - & ZW, ZWPDF, ZA, ZB, ZRDRY, & ! mean udr veloc, pdf of udr. veloc, Koehler A, Koehler B, dry radius - & ZNACT, ZFRACN, ZSC, ZRC, ZSMAX) ! num. act. part. per mode, frac ", crit. ssat., crit. radius, max ssat CALL GSTATS(2502,1) - !<-- End activation for HAM-M7 - !----------------------------------------------------------------- - - !<-- Store CDNC (number of activated particles) and ICNC as a number mixing ratio to tracer values and to PGFL fields - ZXTM1(KIDIA:KFDIA,1:KLEV,idt_cdnc) = (MAX(ZCDNCACT(KIDIA:KFDIA,1:KLEV),((1.0E6_JPRB)*1._JPRB)))/ZRHO(KIDIA:KFDIA,1:KLEV) ! [#/kg] and treshold CDNC to 1 cm-3 - ZXTM1(KIDIA:KFDIA,1:KLEV,idt_icnc) = (1.0E6_JPRB)*ZICNC(KIDIA:KFDIA,1:KLEV)/ZRHO(KIDIA:KFDIA,1:KLEV) !ice crystal number conc = #/cm3 --> number mix rat [#/kg] - PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH) = 1.0E-6_JPRB*( MAX(ZCDNCACT(KIDIA:KFDIA,1:KLEV), 1.0E+6_JPRB)) ! convert from #/m3 to #/cm3 and treshold minimum value to 1 cm-3 - PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH) = MAX( ZICNC(KIDIA:KFDIA,1:KLEV), 0.027_JPRB) ! no conversion needed: already in #/cm3, just max of default value (RNICE in sucldp.F90) and icnc - !--> End store CDNC and ICNC - - !----------------------------------------------------------------- - !--> Calculation for effective radii and put to PGFL fields - - ! put default values for effective radii - reffl(KIDIA:KFDIA,1:KLEV,ZKROW) = 4._JPRB ! comes from liquid effective radius routine (PP_MIN_RE_UM) - reffi(KIDIA:KFDIA,1:KLEV,ZKROW) = 80._JPRB*0.64952_JPRB ! comes from ice effective radius routine (ZDEFAULT_RE_UM) - - ! liquid effective radius - - DO JK=1,KLEV - DO JL=KIDIA,KFDIA - IF ( PAP(JL,JK) >=0.001_JPRB ) THEN - ZTEMP=1.0_JPRB/PAP(JL,JK) - ZDPOG=1.0/RG*(PRS1(JL,JK)-PRS1(JL,JK-1)) - -!-- cloud and ice water path in kg m-2 - ZQIWP =MAX(0._JPRB,ZDPOG*PIP(JL,JK)*ZTEMP) - ZQLWP(JL,JK) =MAX(0._JPRB,ZDPOG*PLP(JL,JK)*ZTEMP) -!-- cloud and ice water content in g m-3 - ZPODT=1.0/RD*PRSF1(JL,JK)/PTP(JL,JK) - ZIP(JL,JK)=PIP(JL,JK)*ZPODT*ZTEMP - ZLP(JL,JK)=PLP(JL,JK)*ZPODT*ZTEMP - ELSE - ZQIWP = 0._JPRB - ZQLWP(JL,JK) = 0._JPRB - ZLP(JL,JK) = 0._JPRB - ZIP(JL,JK) = 0._JPRB - ENDIF - END DO - END DO - - DO JK=1,KLEV - DO JL=KIDIA,KFDIA - ZTMPA = 1.0_JPRB/MAX(ZAP(JL,JK),ZEPSEC) - LLIQCLD(JL,JK) = ( PLP(JL,JK)*ZTMPA ) > ZEPSEC ! logical for liquid cloud - LICECLD(JL,JK) = ( PIP(JL,JK)*ZTMPA ) > ZEPSEC ! logical for ice cloud - ! ZQLWP2(JL,JK) = PLP(JL,JK)/MAX(ZAP(JL,JK),1.E-10_JPRB) ! calculate lwp - ! ZQLWP2(JL,JK) = MIN(MAX(ZQLWP2(JL,JK),0.0_JPRB),10*RCLDMAX) ! treshold lwp, lianghai changed - - ! effective radius calculated similarly as in radlswr.F90 - ! 2.387e-10 is 3/(4*pi*rho_liq*10^6) [10^6 for N in right units] - ZRE_LIQ(JL,JK) = (2.387e-4_JPRB*ZRHO(JL,JK)*ZQLWP(JL,JK)/(MAX(PGFL(JL,JK,YCDNC%MP9_PH)*1.0E-6_JPRB,10._JPRB)))**0.333_JPRB ! calculate effective radius in um (use minimum value for CDNC if CDNC is small) - END DO - END DO - ! Add liq. eff. rad. to HAM variables (only if there is liquid cloud else minimum value) - REFFL(KIDIA:KFDIA,1:KLEV,ZKROW) = MERGE(ZRE_LIQ(KIDIA:KFDIA,1:KLEV)*1.E+6_JPRB,4._JPRB,LLIQCLD(KIDIA:KFDIA,1:KLEV)) - CALL ICE_EFFECTIVE_RADIUS(YRERAD, YDSPP_CONFIG, KIDIA, KFDIA, KLON, KLEV, & - & PRSF1, PTP, ZAP, PIP, PSP, PGEMU, & ! pressure, temp, cloud fr., IWC, SWC, sine of latitude - & reffi(1:KLON,1:KLEV,ZKROW)) ! ice effective radius (updated to mo_activ variable 'reffi' which used in mo_ham_wetdep) - - ! only if there is ice cloud else minimum value - REFFI(KIDIA:KFDIA,1:KLEV,ZKROW) = MERGE(REFFI(KIDIA:KFDIA,1:KLEV,ZKROW), 20._JPRB, LICECLD(KIDIA:KFDIA,1:KLEV)) - - ! add effective radii to PGFL fields - PGFL(KIDIA:KFDIA,1:KLEV,YRE_LIQ%MP9_PH) = 1.0E-06_JPRB * reffl(KIDIA:KFDIA,1:KLEV,ZKROW) ! convert um to meters and save to PGFL fields - PGFL(KIDIA:KFDIA,1:KLEV,YRE_ICE%MP9_PH) = 1.0E-06_JPRB * reffi(KIDIA:KFDIA,1:KLEV,ZKROW) ! convert um to meters and save to PGFL fields - - !<-- End calculation for effective radii - !----------------------------------------------------------------- - !--- Mass conserving correction of negative tracer values: CALL XT_BORROW(KFDIA, KLON, KLEV, KLEV+1, NTRAC, & PRSF1, PRS1, & @@ -1188,6 +1243,8 @@ SUBROUTINE HAMM7_INTERFACE( & ZIPDUM(KIDIA:KFDIA,1:KLEV) = 0._JPRB ! temporary variable for cloud ice water content (modified in wetdep) + ZLP(KIDIA:KFDIA,1:KLEV) = PLP(KIDIA:KFDIA,1:KLEV) ! temporary variable for cloud water content (modified in wetdep) + ZIP(KIDIA:KFDIA,1:KLEV) = PIP(KIDIA:KFDIA,1:KLEV) ! temporary variable for cloud ice water content (modified in wetdep) ZLPU(KIDIA:KFDIA,1:KLEV) = PLU(KIDIA:KFDIA,1:KLEV) ! temporary variable for cloud water content (modified in wetdep) IF (.NOT.LAERCHEM)THEN diff --git a/ifs-source/arpifs/m7/phys_ec/parametr.inc b/ifs-source/arpifs/m7/phys_ec/parametr.inc new file mode 100644 index 00000000..b7f0bfb0 --- /dev/null +++ b/ifs-source/arpifs/m7/phys_ec/parametr.inc @@ -0,0 +1,43 @@ +C======================================================================= +C +C *** INCLUDE FILE 'PARAMETR.INC' +C *** THIS FILE CONTAINS THE DECLARATIONS OF THE GLOBAL CONSTANTS +C AND VARIABLES. +C +C *** WRITTEN BY ATHANASIOS NENES +C *** MODIFIED BY ATHANASIOS NENES AND PRASHANT KUMAR +C +C======================================================================= +C + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + + ! Three points is enough for PDF integration + ! using Gauss-Legendre quadrature + PARAMETER (NpGauss=3) + !PARAMETER (NpGauss=10) + ! Maximum number of lognormal modes, + ! here set to three for M7. + PARAMETER (NSMX = 3) + REAL XGS, WGS + LOGICAL CRIT2, CCNSPST + LOGICAL FIRST_GAULEG + + COMMON /INPUTS/ TEMP, PRES +C + & /CCNSPC/ DPG(NSMX), SIG(NSMX), Dpc(NSMX), + & MODE(NSMX), NMD +C + & /ACTVPR/ AKOH, SSPLT, ALFA, BET1, CRIT2, CCNSPST +C + & /THERMO/ AMW, AMA, GRAV, DENW, CPAIR, DHV, RGAS, AKA, + & PSAT, DAIR, SURT, Dw +C + & /SLNPAR/ EPS, MAXIT, NITER +C + & /GAUSSL/ XGS(NpGauss), WGS(NpGauss), FIRST_GAULEG +C + & /OTHER/ PI, ZERO, GREAT, SQ2PI, + & D11,D12,D13,D14,D15, + & D21,D22,D23,D24,D25, + & D31,D32,D33,D34,D35, + & D41,D42,D43,D44,D45 diff --git a/ifs-source/arpifs/m7/phys_ec/yoe_aer_activ.F90 b/ifs-source/arpifs/m7/phys_ec/yoe_aer_activ.F90 new file mode 100644 index 00000000..f0030a0c --- /dev/null +++ b/ifs-source/arpifs/m7/phys_ec/yoe_aer_activ.F90 @@ -0,0 +1,3702 @@ + MODULE YOE_AER_ACTIV + + !---inherited functions, types, variables and constants + USE PARKIND1, ONLY: JPIM,JPRB + !USE PHY_DIAG_MOD, ONLY: T_DIAG + + IMPLICIT NONE + + !---public member functions + PUBLIC AER_ACTIV + !PUBLIC GET_CDNC_FACTOR + !PUBLIC SETUP_ACI_DIAG + + !---private member functions + !PRIVATE AER_ACTIV_FOUNTOUKIS_NENES + !PRIVATE AER_ACTIV_MORALES_NENES + PRIVATE AER_ACTIV_MORALES_NENES_FULL + !PRIVATE AER_ACTIV_MORALES_NENES_FULL_OLDPDF + !PRIVATE AER_ACTIV_ABDULRAZZAK_GHAN + !PRIVATE AER_ACTIV_MENON + !PRIVATE SINTEGRAL + !PRIVATE SINTEGRAL_MN + !PRIVATE DIAGNOSE_AEROSOL_MASS + PRIVATE GET_HAMM7_AERO_PROP + !PRIVATE LIQ_CLOUD_RE + PRIVATE ICE_CLOUD_PROP + !PRIVATE PDF_UPDRAFT + + !---module types, variables and constants + + ! surface tension of pure water at 273.15K [J m-2] + !REAL(KIND=JPRB), PARAMETER, PUBLIC :: PPSURFTEN = 0.075_JPRB + + ! standard deviation of updraft PDF + !REAL(KIND=JPRB), PARAMETER, PUBLIC :: PPDF_SIGMA = 0.8_JPRB + + ! minimum CDNC value + REAL(KIND=JPRB), PARAMETER, PUBLIC :: PPMINCDNC = 1._JPRB + + ! default CDNC value + REAL(KIND=JPRB), PARAMETER, PUBLIC :: PPDEFCDNC = 1._JPRB !1.E-14_JPRB !10._JPRB + + ! Diagnostics + !TYPE(T_DIAG), POINTER, PUBLIC :: D_CDNC + !TYPE(T_DIAG), POINTER, PUBLIC :: D_REFF + !TYPE(T_DIAG), POINTER, PUBLIC :: D_LIQCLDT + + ! default value of effective radius (value when gridbox is cloud-free) [um] + REAL(KIND=JPRB), PARAMETER, PRIVATE :: PPREFFL_DEF = 4.0_JPRB + +CONTAINS + SUBROUTINE AER_ACTIV(KIDIA, KFDIA, KTDIA, KLON, KLEV, KSTGLO, & + !& KLEVX, KFLDX, KFLDX2, & + & PAPH, PAP, PT, PQ, PQSAT, & + & PVERVEL, PA, PL, PI, & + & PLSM, PGELAM, PGEMU, & !PSLON, PGEMU, & + & PGFL, YDMODEL, PCDNCACT, PICNC, PREFFL, PREFFI, PSMAX, PDRYRSOLU, PXTM1, KTRAC, PSIGMA_W) !, PEXTRA, PEXTR2) + + ! *AER_ACTIV* is the interface to the cloud droplet activation scheme. + ! Four schemes are available, depending on the aerosol scheme used. + ! 1. Menon et al. for TM5 aerosols or Tegen climatological aerosols + ! 2. Abdul-Razzak & Ghan (2000) + ! 3. Fountoukis & Nenes (2005) + ! 4. Morales Betancourt & Nenes (2014) + ! 5. Morales Betancourt & Nenes (2014) with adsorption activation (Kumar et al., 2011), PDF integration with Gaussian-Legendre quadrature, explicit CCN spectra + ! 6. Same as 5. but with PDF sampling as in 2-4 + ! Schemes 2-6 currently require TM5 aerosols, + ! either via interactive coupling to TM5 or a prescribed pre-industrial climatology + + !---inherited functions, types, variables and constants + USE YOMHOOK, ONLY: LHOOK, DR_HOOK + USE YOMCST, ONLY: RD, RPI, RG + ! USE YOERAD, ONLY: LNEWAER, LCMIP5, LTM5AER, LCMIP6_PI_AEROSOLS, LMAC2SPACI + ! USE YOECLDP, ONLY: NCLOUDACT, JP_ACT_FOUNTOUKIS_NENES, JP_ACT_ABDULRAZZAK_GHAN, & + ! & JP_ACT_MENON, JP_ACT_MORALES_NENES, JP_ACT_MORALES_NENES_FULL, & + ! & JP_ACT_MORALES_NENES_FULL_OLDPDF, & + ! & LAERICESED, LAERICEAUTO, LACI_DIAG, NACTPDF, & + ! & RLMIN, RAMIN, RTHOMO + !USE YOECLDP, ONLY: LAERICESED, LAERICEAUTO, & + ! & RLMIN, RAMIN, RTHOMO + !USE MO_ACTIV, ONLY: nw !eehol: to replace NACTPDF + !USE YOE_AERO_M7_DATA, ONLY: NSOL + USE TM5M7_DATA, ONLY: NSOL + !USE YOMCT3, ONLY: NSTEP + !USE YOMCT0, ONLY: NFRPOS + !USE YOMDYN, ONLY: TSTEP + !USE YOM_YGFL, ONLY: YGFL, YCDNC, YICNC, YRE_LIQ, YRE_ICE + !USE YOE_PI_AERO, ONLY: LPI_AERO_UPDATED + USE TYPE_MODEL, ONLY: MODEL + + IMPLICIT NONE + + !---included functions from header files +#include "abor1.intfb.h" + !#include "ice_effective_radius.intfb.h" + + !---subroutine interface + ! + ! - Input arguments + ! --------------- + ! KIDIA : start of horizontal loop + ! KFDIA : end of horizontal loop + ! KLON : horizontal dimension + ! KLEV : vertical dimension + ! KSTGLO : offset of horizontal block in coupling arrays + ! KLEVX : vertical dimension, 3-D diagnostic fields + ! KFLDX : number of 3-D diagnostic fields + ! KFLDX2 : number of 2-D diagnostic fields + ! PAPH : pressure at half levels [Pa] + ! PAP : pressure at full levels [Pa] + ! PT : temperature [K] + ! PQ : specific humidity [kg/kg] + ! PQSAT : saturation specific humidity [kg/kg] + ! PVERVEL : large-scale vertical veloctiy [Pa/s] + ! PA : cloud fraction + ! PL : liquid water content + ! PI : ice content [kg/kg] + ! PLSM : land-sea mask + ! PGELAM : Longitude + ! PCLON : Cosine of longitude + ! PSLON : Sine of longitude + ! PGEMU : Sine of latitude + + ! - output arguments + ! ---------------- + ! The following are written to the appropriate PGFL: + ! CDNC : cloud droplet number concentration + ! ICNC : ice crystal number concentration + ! PRE_LIQ : liquid drop effective radius + ! PRE_ICE : ice crystal effective radius + ! PEXTRA : 3-D diagnostics + ! PEXTR2 : 2-D diagnostics + + TYPE(MODEL), INTENT(IN) :: YDMODEL + INTEGER(KIND=JPIM), INTENT(IN) :: KIDIA ! beginning of horizontal block + INTEGER(KIND=JPIM), INTENT(IN) :: KFDIA ! beginning of horizontal block + INTEGER(KIND=JPIM), INTENT(IN) :: KTDIA ! beginning of vertical block + INTEGER(KIND=JPIM), INTENT(IN) :: KLON ! horizontal dimension + INTEGER(KIND=JPIM), INTENT(IN) :: KLEV ! number of model vertical levels + INTEGER(KIND=JPIM), INTENT(IN) :: KSTGLO ! offset of horizontal block in coupling arrays + INTEGER(KIND=JPIM), INTENT(IN) :: KTRAC ! number of tracers + + !INTEGER(KIND=JPIM), INTENT(IN) :: KLEVX + !INTEGER(KIND=JPIM), INTENT(IN) :: KFLDX + !INTEGER(KIND=JPIM), INTENT(IN) :: KFLDX2 + + REAL(KIND=JPRB), INTENT(IN) :: PAPH(KLON,KLEV+1) ! half level pressure + REAL(KIND=JPRB), INTENT(IN) :: PAP(KLON,KLEV) ! full level pressure + REAL(KIND=JPRB), INTENT(IN) :: PT(KLON,KLEV) ! temperature + REAL(KIND=JPRB), INTENT(IN) :: PQ(KLON,KLEV) ! specific humidity + REAL(KIND=JPRB), INTENT(IN) :: PQSAT(KLON,KLEV) ! saturation specific humidity + REAL(KIND=JPRB), INTENT(IN) :: PVERVEL(KLON,KLEV) ! vertical velocity + + REAL(KIND=JPRB), INTENT(IN) :: PA(KLON,KLEV) ! cloud fraction + REAL(KIND=JPRB), INTENT(IN) :: PL(KLON,KLEV) ! cloud liquid water + REAL(KIND=JPRB), INTENT(IN) :: PI(KLON,KLEV) ! cloud ice + + REAL(KIND=JPRB), INTENT(IN) :: PLSM(KLON) ! land-sea mask + REAL(KIND=JPRB), INTENT(IN) :: PGELAM(KLON) ! longitude + !REAL(KIND=JPRB), INTENT(IN) :: PCLON(KLON) ! cosine of longitude + !REAL(KIND=JPRB), INTENT(IN) :: PSLON(KLON) ! sine of longitude + REAL(KIND=JPRB), INTENT(IN) :: PGEMU(KLON) ! sine of latitude + REAL(KIND=JPRB), INTENT(IN) :: PDRYRSOLU(KLON,KLEV,NSOL) ! rdry of soluble modes [m] + REAL(KIND=JPRB), INTENT(IN) :: PXTM1(KLON,KLEV,KTRAC) ! tracer mixing ratios + REAL(KIND=JPRB), INTENT(IN) :: PSIGMA_W(KLON,KLEV) ! sigma_w + + REAL(KIND=JPRB), INTENT(INOUT) :: PGFL(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NDIM) !YGFL%NDIM) + REAL(KIND=JPRB), INTENT(INOUT) :: PCDNCACT(KLON,KLEV) ! cloud droplet number concentration [#/cm-3] + REAL(KIND=JPRB), INTENT(INOUT) :: PICNC(KLON,KLEV) ! ice crystal number concentration [#/cm-3] + REAL(KIND=JPRB), INTENT(INOUT) :: PREFFL(KLON,KLEV) ! liquid droplet effective radius [um] + REAL(KIND=JPRB), INTENT(INOUT) :: PREFFI(KLON,KLEV) ! ice effective radius [um] + REAL(KIND=JPRB), INTENT(INOUT) :: PSMAX(KLON,KLEV) ! maximum supersaturation [%] + + !---extra diagnostics + !REAL(KIND=JPRB) ,INTENT(INOUT) :: PEXTRA(KLON,KLEVX,KFLDX) + !REAL(KIND=JPRB) ,INTENT(INOUT) :: PEXTR2(KLON,KFLDX2) + + !---local variables + REAL(KIND=JPRB) :: ZRHO(KLON,KLEV) ! air density [kg/m3] + REAL(KIND=JPRB) :: ZSO4MASS(KLON,KLEV,NSOL) ! modal so4 mass mixing ratio [kg/kg] + REAL(KIND=JPRB) :: ZBCMASS(KLON,KLEV,NSOL) ! modal black carbon mass mixing ratio [kg/kg] + REAL(KIND=JPRB) :: ZOMMASS(KLON,KLEV,NSOL) ! modal organic matter mass mixing ratio [kg/kg] + REAL(KIND=JPRB) :: ZSSMASS(KLON,KLEV,NSOL) ! modal sea salt mass mixing ratio [kg/kg] + REAL(KIND=JPRB) :: ZDUMASS(KLON,KLEV,NSOL) ! modal dust mass mixing ratio [kg/kg] + REAL(KIND=JPRB) :: ZNO3MASS(KLON,KLEV) ! nitrate mass mixing ratio [kg/kg] + REAL(KIND=JPRB) :: ZMSAMASS(KLON,KLEV) ! MSA mass mixing ratio [kg/kg] + REAL(KIND=JPRB) :: ZAERONUM(KLON,KLEV,NSOL) ! aerosol number mixing ratio [#/kg] + REAL(KIND=JPRB) :: ZDRYRSOL(KLON,KLEV,NSOL) ! dry count median radius of soluble modes + REAL(KIND=JPRB) :: ZDRYRSOLOLD(KLON,KLEV,NSOL) ! dry count median radius of soluble modes eehol: not calculated here but in HAM + REAL(KIND=JPRB) :: ZSO4BULK(KLON,KLEV) ! bulk so4 mass mixing ratio [kg/kg] + REAL(KIND=JPRB) :: ZBCBULK(KLON,KLEV) ! bulk black carbon mass mixing ratio [kg/kg] + REAL(KIND=JPRB) :: ZOMBULK(KLON,KLEV) ! bulk organic matter mass mixing ratio [kg/kg] + REAL(KIND=JPRB) :: ZSSBULK(KLON,KLEV) ! bulk sea salt mass mixing ratio [kg/kg] + REAL(KIND=JPRB) :: ZDUBULK(KLON,KLEV) ! bulk dust mass mixing ratio [kg/kg] + !REAL(KIND=JPRB) :: ZW(KLON,KLEV,nw) ! updraft speed [m/s] + !REAL(KIND=JPRB) :: ZWPDF(KLON,KLEV,nw) ! updraft probability + REAL(KIND=JPRB) :: ZHOOK_HANDLE + REAL(KIND=JPRB) :: ZTMP(KLON,KLEV) ! interim for diagnostics + + REAL(KIND=JPRB) :: ZCDNC(KLON,KLEV) ! cloud droplet number concentration [#/cm-3] + REAL(KIND=JPRB) :: ZICNC(KLON,KLEV) ! ice crystal number concentration [#/cm-3] + REAL(KIND=JPRB) :: ZRE_LIQ(KLON,KLEV) ! liquid droplet effective radius [um] + REAL(KIND=JPRB) :: ZRE_ICE(KLON,KLEV) ! ice crystal effective radius [um] + REAL(KIND=JPRB) :: ZSMAX(KLON,KLEV) ! maximum supersaturation [%] + + !variables for liquid droplet eff rad calculations + REAL(KIND=JPRB) :: ZQLWC(KLON,KLEV) !tresholded LWC [kg/kg] + REAL(KIND=JPRB) :: RCLDMAX=5.E-3_JPRB !max cloud water + + LOGICAL :: LLIQCLD(KLON,KLEV) ! true if liquid cloud is present + LOGICAL :: LLIQCLDD(KLON,KLEV) ! true if liquid cloud is present (for activation calculations) + LOGICAL :: LICECLD(KLON,KLEV) ! true if ice cloud is present + + LOGICAL :: LL1 + LOGICAL :: LBULK, LMODE ! fetch TM5 aerosols as bulk mass / per-mode mass + + LOGICAL :: LCALCINCLOUD = .TRUE. ! eehol: logical to calculate activation only in-cloud (T) or everywhere (F) + REAL(KIND=JPRB) :: ZEPS ! epsilon(1.) + INTEGER(KIND=JPIM) :: ITOP ! highest level for water cloud + INTEGER(KIND=JPIM) :: JK, JL, JMOD ! loop indices + !INTEGER(KIND=JPIM) :: IX ! index to PEXTRA diagnostic + + REAL(KIND=JPRB), PARAMETER :: ZEPSEC = 1.E-14_JPRB ! taken from cloudsc.F90 + REAL(KIND=JPRB) :: ZTMPA + + REAL(KIND=JPRB) :: ZMAC2SP_CDNC_FACTOR(KLON) + + !---executable procedure + IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.AER_ACTIV', 0, ZHOOK_HANDLE) + ASSOCIATE(YGFL=>YDMODEL%YRML_GCONF%YGFL,YDECLDP=>YDMODEL%YRML_PHY_EC%YRECLDP) + ASSOCIATE(YCDNC=>YGFL%YCDNC, YICNC=>YGFL%YICNC, YRE_LIQ=>YGFL%YRE_LIQ, YRE_ICE=>YGFL%YRE_ICE, & + & LAERICESED=>YDECLDP%LAERICESED, LAERICEAUTO=>YDECLDP%LAERICEAUTO, & + & RLMIN=>YDECLDP%RLMIN, RAMIN=>YDECLDP%RAMIN, RTHOMO=>YDECLDP%RTHOMO, RNICE=>YDECLDP%RNICE) + + !---air density + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZRHO(JL,JK)=PAP(JL,JK)/(RD*PT(JL,JK)) + IF (ZRHO(JL,JK) .LE. 1.E-12_JPRB) THEN + ZRHO(JL,JK)=1.E-12_JPRB + END IF + END DO + END DO + + !---background CDNC and Reff and ICNC and init ZSMAX + ZSMAX(KIDIA:KFDIA,1:KLEV) = 0._JPRB + ZCDNC(KIDIA:KFDIA,1:KLEV) = PPDEFCDNC + ZRE_LIQ(KIDIA:KFDIA,1:KLEV) = PPREFFL_DEF + ZICNC(KIDIA:KFDIA,1:KLEV) = RNICE + ZRE_ICE(KIDIA:KFDIA,1:KLEV) = 80._JPRB*0.64952_JPRB + !PGFL(KIDIA:KFDIA,:,YCDNC%MP9_PH) = PPDEFCDNC + !PGFL(KIDIA:KFDIA,:,YRE_LIQ%MP9_PH) = PPREFFL_DEF + !PGFL(KIDIA:KFDIA,:,YICNC%MP9_PH) = ZICNC(KIDIA:KFDIA,:) + !PGFL(KIDIA:KFDIA,:,YRE_ICE%MP9_PH) = PREFFI(KIDIA:KFDIA,:) + + !---get aerosols from TM5 + !IF (LTM5AER .OR. LCMIP6_PI_AEROSOLS) THEN + LMODE = .TRUE. + LBULK = (LAERICESED .OR. LAERICEAUTO) ! .OR. NCLOUDACT==JP_ACT_MENON) + CALL GET_HAMM7_AERO_PROP(KIDIA, KFDIA, KLON, KTDIA, KLEV, KSTGLO, LMODE, LBULK, & + & PAPH, PGELAM, PGEMU, PXTM1, KTRAC, & + & ZDRYRSOLOLD, ZAERONUM, & + & ZSO4MASS, ZBCMASS, ZOMMASS, ZSSMASS, ZDUMASS, & + & ZSO4BULK, ZBCBULK, ZOMBULK, ZSSBULK, ZDUBULK, & + & ZNO3MASS, ZMSAMASS) + !END IF + + ZDRYRSOL(KIDIA:KFDIA,1:KLEV,:) = PDRYRSOLU(KIDIA:KFDIA,1:KLEV,:) + + !---find cells where there is cloud (same criteria as cloudsc.F90 when it uses CDNC) + + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZTMPA = 1.0_JPRB/MAX(PA(JL,JK),ZEPSEC) + LLIQCLD(JL,JK) = ( PL(JL,JK)*ZTMPA ) > ZEPSEC + LICECLD(JL,JK) = ( PI(JL,JK)*ZTMPA ) > ZEPSEC ! logical for ice cloud + END DO + END DO + + IF (LCALCINCLOUD) THEN + !---find highest model level where there is cloud + DO JK=1,KLEV + IF (ANY(LLIQCLD(KIDIA:KFDIA,JK))) EXIT + END DO + ITOP=JK + LLIQCLDD(KIDIA:KFDIA,1:KLEV) = LLIQCLD(KIDIA:KFDIA,1:KLEV) + ELSE + ITOP=KTDIA + LLIQCLDD(KIDIA:KFDIA,1:KLEV) = .TRUE. + END IF + + IF (ITOP.LE.KLEV) THEN +! +! SELECT CASE(NCLOUDACT) +! CASE(JP_ACT_MENON) +! +! IF (.NOT. (LTM5AER .OR. LCMIP6_PI_AEROSOLS .OR. LCMIP5 .OR. LNEWAER)) & +! & CALL ABOR1('YOE_AER_ACTIV: No supported aerosol scheme for Menon cloud activation') +! +! !---Tegen or CMIP5 aerosols: map from optical properties to bulk aerosol mass +! IF ((.NOT.LTM5AER) .AND. (.NOT. LCMIP6_PI_AEROSOLS)) THEN +! CALL DIAGNOSE_AEROSOL_MASS(KIDIA, KFDIA, KLON, KLEV, PT, PQ, PQSAT, & +! & PAPH, PAP, PGELAM, PGEMU, PCLON, PSLON, & +! & ZSO4BULK, ZBCBULK, ZOMBULK, ZSSBULK, ZDUBULK) +! END IF +! +! CALL AER_ACTIV_MENON (KIDIA, KFDIA, KLON, ITOP, KLEV, PT, ZRHO, PLSM, ZSO4BULK, ZSSBULK, ZOMBULK, & +! & PGFL(:,:,YCDNC%MP9_PH)) +! +! +! CASE(JP_ACT_FOUNTOUKIS_NENES) +! +! IF ((.NOT.LTM5AER) .AND. (.NOT. LCMIP6_PI_AEROSOLS)) & +! & CALL ABOR1('YOE_AER_ACTIV:Fountoukis and Nenes scheme requires LTM5AER=T or LMIP6_PI_AEROSOLS=T') +! +! CALL PDF_UPDRAFT(KIDIA, KFDIA, KLON, ITOP, KLEV, NACTPDF, ZRHO, PLSM, PVERVEL, ZW, ZWPDF) +! +! CALL AER_ACTIV_FOUNTOUKIS_NENES(KIDIA, KFDIA, ITOP, KLON, KLEV, NACTPDF, LLIQCLD, PT, PAP, ZRHO, & +! & PQ, ZW, ZWPDF, ZSO4MASS, ZBCMASS, ZOMMASS, ZSSMASS, & +! & ZDUMASS, ZNO3MASS, ZMSAMASS, ZAERONUM, ZDRYRSOL, & +! & PGFL(:,:,YCDNC%MP9_PH), KFLDX, PEXTRA) +! +! CASE(JP_ACT_MORALES_NENES) +! +! IF ((.NOT.LTM5AER) .AND. (.NOT. LCMIP6_PI_AEROSOLS)) & +! & CALL ABOR1('YOE_AER_ACTIV:Morales and Nenes scheme requires LTM5AER=T or LMIP6_PI_AEROSOLS=T') +! +! CALL PDF_UPDRAFT(KIDIA, KFDIA, KLON, ITOP, KLEV, NACTPDF, ZRHO, PLSM, PVERVEL, ZW, ZWPDF) +! +! CALL AER_ACTIV_MORALES_NENES(KIDIA, KFDIA, ITOP, KLON, KLEV, NACTPDF, LLIQCLD, PT, PAP, ZRHO, & +! & PQ, ZW, ZWPDF, ZSO4MASS, ZBCMASS, ZOMMASS, ZSSMASS, & +! & ZDUMASS, ZNO3MASS, ZMSAMASS, ZAERONUM, ZDRYRSOL, & +! & PGFL(:,:,YCDNC%MP9_PH), KFLDX, PEXTRA) +! +! CASE(JP_ACT_MORALES_NENES_FULL) +! +! IF ((.NOT.LTM5AER) .AND. (.NOT. LCMIP6_PI_AEROSOLS)) & +! & CALL ABOR1('YOE_AER_ACTIV:Morales and Nenes full scheme requires LTM5AER=T or LMIP6_PI_AEROSOLS=T') + + ! The new scheme either approximates the integral over the updraft velocity PDF + ! by Gauss-Legendre quadrature or uses a PPDEFsingle characteristic velocity. + ! PDF_UPDRAFT, NACTPDF, ZW and ZWPDF are not used. + CALL AER_ACTIV_MORALES_NENES_FULL(KIDIA, KFDIA, ITOP, KLON, KLEV, LLIQCLDD, PT, PAP, ZRHO, & + & PVERVEL, ZSO4MASS, ZBCMASS, ZOMMASS, ZSSMASS, & + & ZDUMASS, ZNO3MASS, ZMSAMASS, ZAERONUM, ZDRYRSOL, & + & ZCDNC, ZSMAX, PGEMU, PSIGMA_W) !PSLON, PGEMU) + !& PGFL(:,:,YCDNC%MP9_PH), ZSMAX, PGEMU, PSIGMA_W) !PSLON, PGEMU) + !& PGFL(:,:,YCDNC%MP9_PH), KFLDX, PEXTRA, PSLON, PGEMU) +! +! CASE(JP_ACT_MORALES_NENES_FULL_OLDPDF) +! +! IF ((.NOT.LTM5AER) .AND. (.NOT. LCMIP6_PI_AEROSOLS)) & +! & CALL ABOR1('YOE_AER_ACTIV:Morales and Nenes full scheme with old PDF sampling requires LTM5AER=T or LMIP6_PI_AEROSOLS=T') +! +! CALL PDF_UPDRAFT(KIDIA, KFDIA, KLON, ITOP, KLEV, NACTPDF, ZRHO, PLSM, PVERVEL, ZW, ZWPDF) +! +! CALL AER_ACTIV_MORALES_NENES_FULL_OLDPDF(KIDIA, KFDIA, ITOP, KLON, KLEV, NACTPDF, LLIQCLD, PT, PAP, ZRHO, & +! & ZW, ZWPDF, ZSO4MASS, ZBCMASS, ZOMMASS, ZSSMASS, & +! & ZDUMASS, ZNO3MASS, ZMSAMASS, ZAERONUM, ZDRYRSOL, & +! & PGFL(:,:,YCDNC%MP9_PH), KFLDX, PEXTRA, PSLON, PGEMU) +! +! CASE(JP_ACT_ABDULRAZZAK_GHAN) +! +! IF ((.NOT.LTM5AER) .AND. (.NOT. LCMIP6_PI_AEROSOLS)) & +! & CALL ABOR1('YOE_AER_ACTIV:Abdul-Razzak and Ghan scheme requires LTM5AER=T or LCMIP6_PI_AEROSOLS=T') +! +! CALL PDF_UPDRAFT(KIDIA, KFDIA, KLON, ITOP, KLEV, NACTPDF, ZRHO, PLSM, PVERVEL, ZW, ZWPDF) +! +! CALL AER_ACTIV_ABDULRAZZAK_GHAN(KIDIA, KFDIA, ITOP, KLON, KLEV, NACTPDF, LLIQCLD, PT, PAP, ZRHO, & +! & PQ, ZW, ZWPDF, ZSO4MASS, ZBCMASS, ZOMMASS, ZSSMASS, & +! & ZDUMASS, ZNO3MASS, ZMSAMASS, ZAERONUM, ZDRYRSOL, & +! & PGFL(:,:,YCDNC%MP9_PH), KFLDX, PEXTRA) +! END SELECT + + !---get CDNC_FACTOR from MAC2SP if needed + ! IF (LMAC2SPACI .AND. .NOT.LTM5AER) THEN + ! CALL GET_CDNC_FACTOR(KIDIA,KFDIA,KLON,PGEMU,PGELAM,ZMAC2SP_CDNC_FACTOR) + ! ELSE + ! ZMAC2SP_CDNC_FACTOR(:)=1._JPRB + ! END IF + + ZMAC2SP_CDNC_FACTOR(:)=1._JPRB + + !---limit CDNC to min PPMINCDNC, set default value for CDNC outside clouds + DO JK=KTDIA,KLEV + ZCDNC(KIDIA:KFDIA,JK)=MAX(ZCDNC(KIDIA:KFDIA,JK)*ZMAC2SP_CDNC_FACTOR(KIDIA:KFDIA),PPMINCDNC) + !ZCDNC(KIDIA:KFDIA,JK)=MERGE( & + !& MAX(ZCDNC(KIDIA:KFDIA,JK)*ZMAC2SP_CDNC_FACTOR(KIDIA:KFDIA),PPMINCDNC), & + !& PPDEFCDNC, LLIQCLD(KIDIA:KFDIA,JK) ) + ! PGFL(KIDIA:KFDIA,JK,YCDNC%MP9_PH)=MERGE( & + ! & MAX(PGFL(KIDIA:KFDIA,JK,YCDNC%MP9_PH)*ZMAC2SP_CDNC_FACTOR(KIDIA:KFDIA),PPMINCDNC), & + ! & PPDEFCDNC, LLIQCLD(KIDIA:KFDIA,JK) ) + END DO + + !---cloud liquid water: droplet effective radius is computed in radlswr now + !CALL LIQ_CLOUD_RE(KIDIA, KFDIA, KLON, ITOP, KLEV, LLIQCLD, PL, PA, ZRHO, PGFL) + + ! liquid effective radius + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZQLWC(JL,JK) = PL(JL,JK)/MAX(PA(JL,JK),1.E-10_JPRB) ! calculate lwc + ZQLWC(JL,JK) = MIN(MAX(ZQLWC(JL,JK),0.0_JPRB),RCLDMAX) ! treshold lwc + ! effective radius calculated similarly as in radlswr.F90 + ! 2.387e-10 is 3/(4*pi*rho_liq*10^6) [10^6 for N in right units] + !ZRE_LIQ(JL,JK) = 1.E+06_JPRB*(2.387e-10_JPRB*ZRHO(JL,JK)*ZQLWC(JL,JK)/(MAX(PGFL(JL,JK,YCDNC%MP9_PH),PPMINCDNC)))**0.333_JPRB ! calculate effective radius in um (use minimum value for CDNC if CDNC is small) + ZRE_LIQ(JL,JK) = 1.E+06_JPRB*(2.387e-10_JPRB*ZRHO(JL,JK)*ZQLWC(JL,JK)/(MAX(ZCDNC(JL,JK),PPMINCDNC)))**0.333_JPRB ! calculate effective radius in um (use minimum value for CDNC if CDNC is small) + END DO + END DO + ZRE_LIQ(KIDIA:KFDIA,1:KLEV) = MERGE(ZRE_LIQ(KIDIA:KFDIA,1:KLEV),4._JPRB,LLIQCLD(KIDIA:KFDIA,1:KLEV)) + END IF + + !---cloud ice: ICNC and effective radius for ice crystals + IF (LAERICESED .OR. LAERICEAUTO) THEN + CALL ICE_CLOUD_PROP(KIDIA, KFDIA, KLON, KLEV, PT, ZRHO, PI, PA, PAP, & + & PQSAT, ZSO4BULK, ZBCBULK, ZDUBULK, PGFL, YDMODEL, ZRE_ICE, ZICNC) + END IF + + !eehol: diagnostics: + !--CDNC + !PCDNCACT(KIDIA:KFDIA,:) = 1.0E6_JPRB*PGFL(KIDIA:KFDIA,:,YCDNC%MP9_PH) !eehol: output CDNC [#/m3] + PCDNCACT(KIDIA:KFDIA,1:KLEV) = 1.0E6_JPRB*MAX(ZCDNC(KIDIA:KFDIA,1:KLEV),PPMINCDNC) !eehol: output CDNC [#/m3] + + !--ICNC + !PICNC(KIDIA:KFDIA,:) = PGFL(KIDIA:KFDIA,:,YICNC%MP9_PH) !eehol: output ICNC [#/cm3] + PICNC(KIDIA:KFDIA,1:KLEV) = ZICNC(KIDIA:KFDIA,1:KLEV) !eehol: output ICNC [#/cm3] + + !--Liq eff rad + !PGFL(KIDIA:KFDIA,1:KLEV,YRE_LIQ%MP9_PH) = 1.0E-06_JPRB * ZRE_LIQ(KIDIA:KFDIA,1:KLEV) !save liq eff rad in meters + PREFFL(KIDIA:KFDIA,1:KLEV) = MERGE(ZRE_LIQ(KIDIA:KFDIA,1:KLEV),4._JPRB,LLIQCLD(KIDIA:KFDIA,1:KLEV)) !eehol: output liq eff rad [um] + + !--Ice eff rad + ! only if there is ice cloud else minimum value + PREFFI(KIDIA:KFDIA,1:KLEV) = MERGE(ZRE_ICE(KIDIA:KFDIA,1:KLEV),20._JPRB,LICECLD(KIDIA:KFDIA,1:KLEV)) + !PREFFI(KIDIA:KFDIA,:) = 1.E-6_JPRB*PGFL(KIDIA:KFDIA,:,YRE_ICE%MP9_PH) !eehol: output ice eff rad [um] + ! only if there is ice cloud else minimum value + !PREFFI(KIDIA:KFDIA,1:KLEV) = MERGE(PREFFI(KIDIA:KFDIA,1:KLEV), 20._JPRB, LICECLD(KIDIA:KFDIA,1:KLEV)) + ! add effective radii to PGFL fields + !PGFL(KIDIA:KFDIA,1:KLEV,YRE_ICE%MP9_PH) = 1.0E-06_JPRB * PREFFI(KIDIA:KFDIA,1:KLEV) ! convert um to meters and save to PGFL fields + + !--Maximum supersaturation + PSMAX(KIDIA:KFDIA,1:KLEV) = ZSMAX(KIDIA:KFDIA,1:KLEV) !eehol: output maximum supersaturation [%] + +! IF (LACI_DIAG) THEN +! !---2D diagnostics: AOD - removed. Can be re-implemented in RADLSWR if needed. +! +! !---3D diagnostics: accumulated CDNC, ICNC, RE_liq, Re_ice, +! ! liquid cloud time, ice cloud time (ice diagnostics disabled for now) +! !DO JK=1,KLEV +! ! DO JL=KIDIA,KFDIA +! ! LICECLD(JL,JK) = (PI(JL,JK) > RLMIN) +! ! END DO +! !END DO +! +! IF (MOD(NSTEP,NFRPOS) == 0) THEN ! if first timestep after output step +! PEXTRA(KIDIA:KFDIA,:,D_CDNC%IXTRA) = 0._JPRB +! PEXTRA(KIDIA:KFDIA,:,D_LIQCLDT%IXTRA) = 0._JPRB +! END IF +! +! !--Reff (liq) +! ! moved to RADLSWR +! +! !--CDNC +! ZTMP(KIDIA:KFDIA,:) = PEXTRA(KIDIA:KFDIA,:,D_CDNC%IXTRA) + PGFL(KIDIA:KFDIA,:,YCDNC%MP9_PH)*TSTEP +! PEXTRA(KIDIA:KFDIA,:,D_CDNC%IXTRA) = MERGE(ZTMP(KIDIA:KFDIA,:), & +! & PEXTRA(KIDIA:KFDIA,:,D_CDNC%IXTRA), LLIQCLD(KIDIA:KFDIA,:)) +! !--cloud time (liq) +! ZTMP(KIDIA:KFDIA,:) = PEXTRA(KIDIA:KFDIA,:,D_LIQCLDT%IXTRA) + TSTEP +! PEXTRA(KIDIA:KFDIA,:,D_LIQCLDT%IXTRA) = MERGE(ZTMP(KIDIA:KFDIA,:), & +! & PEXTRA(KIDIA:KFDIA,:,D_LIQCLDT%IXTRA), LLIQCLD(KIDIA:KFDIA,:)) +! +! !--ICNC (not in CMIP6) +! ! IF (LAERICESED .OR. LAERICEAUTO) THEN +! ! ZTMP(KIDIA:KFDIA,:) = PEXTRA(KIDIA:KFDIA,:,IX+3) + PGFL(KIDIA:KFDIA,:,YICNC%MP9_PH)*TSTEP +! ! PEXTRA(KIDIA:KFDIA,:,IX+3) = MERGE(ZTMP(KIDIA:KFDIA,:), & +! ! & PEXTRA(KIDIA:KFDIA,:,IX+3), LICECLD(KIDIA:KFDIA,:)) +! ! END IF +! +! !--Reff (ice) (not in CMIP6) +! ! IF (LAERICESED .OR. LAERICEAUTO) THEN +! ! ZTMP(KIDIA:KFDIA,:) = PEXTRA(KIDIA:KFDIA,:,IX+4) + PGFL(KIDIA:KFDIA,:,YRE_ICE%MP9_PH)*TSTEP +! ! PEXTRA(KIDIA:KFDIA,:,IX+4) = MERGE(ZTMP(KIDIA:KFDIA,:), & +! ! & PEXTRA(KIDIA:KFDIA,:,IX+4), LICECLD(KIDIA:KFDIA,:)) +! ! END IF +! +! !--cloud time (ice) (not in CMIP6) +! ! IF (LAERICESED .OR. LAERICEAUTO) THEN +! ! ZTMP(KIDIA:KFDIA,:) = PEXTRA(KIDIA:KFDIA,:,IX+5) + TSTEP +! ! PEXTRA(KIDIA:KFDIA,:,IX+5) = MERGE(ZTMP(KIDIA:KFDIA,:), & +! ! & PEXTRA(KIDIA:KFDIA,:,IX+5), LICECLD(KIDIA:KFDIA,:)) +! ! END IF +! +! END IF + + END ASSOCIATE + END ASSOCIATE + + IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.AER_ACTIV', 1, ZHOOK_HANDLE) + + END SUBROUTINE AER_ACTIV + + +! SUBROUTINE AER_ACTIV_FOUNTOUKIS_NENES(KIDIA, KFDIA, KTDIA, KLON, KLEV, KPDF, LCLOUD, PT, PAP, PRHO, & +! & PQ, PW, PWPDF, PSO4MASS, PBCMASS, POMMASS, PSSMASS, & +! & PDUMASS,PNO3MASS, PMSAMASS, PAERONUM, PRDRY, PCDNC, KFLDX, PEXTRA) +! +! +! ! *aer_activ_fountoukis_nenes* calculates the number of activated aerosol +! ! particles from the aerosol size-distribution, +! ! composition and ambient supersaturation +! ! +! ! Author: +! ! ------- +! ! Sami Romakkaniemi, FMI +! ! Philip Stier, University of Oxford +! ! Declan O'Donnell, FMI +! ! Twan van Noije, KNMI +! ! +! ! References: +! ! ----------- +! ! Abdul-Razzak et al., JGR, 103, D6, 6123-6131, 1998 +! ! Abdul-Razzak and Ghan, JGR, 105, D5, 6837-6844, 2000 (referred to as ARG) +! ! Pruppbacher and Klett, Kluewer Ac. Pub., 1997 +! ! Ghan et al., JAMES 3, M10001, 2011 +! ! Nenes and Seinfeld, JGR, 108, D14, 4415, 2003 (referred to as NS) +! ! Fountoukis and Nenes, JGR, 110, D11212, 2005 (referred to as FN) +! ! Morales Betancourt and Nenes, GMD, 7, 2345-2357, 2014 (referred to as MN) +! ! Seinfeld and Pandis, Atmospheric Chemistry and Physics, Second Edition (referred to as SP) +! +! +! USE YOMCST, ONLY: R, RV, RPI, RCPD, RG, RLVTT, RMV, RMD, RTT , RLSTT +! USE YOECLDP, ONLY: RTHOMO, PPRHO_WAT +! USE YOMHOOK, ONLY: LHOOK, DR_HOOK +! USE YOMLUN, ONLY: NULOUT +! USE YOETHF , ONLY : R2ES ,R3LES ,R3IES ,R4LES ,& +! & R4IES ,R5LES ,R5IES ,R5ALVCP ,R5ALSCP ,& +! & RALVDCP ,RALSDCP ,RTWAT ,& +! & RTICE ,RTICECU ,& +! & RTWAT_RTICE_R ,RTWAT_RTICECU_R,& +! & RKOOP1 ,RKOOP2 +! USE YOE_AERO_M7_DATA, ONLY: NMOD, NSOL, SIGMALN, CMR2RAM, & +! & DH2SO4, DBC, DOC, DNACL, DDUST, & +! & DNA2SO4, DNH4NO3, DMSA, NH4NO3_FACTOR, & +! & PPKAPPA_H2SO4, PPKAPPA_NACL, PPKAPPA_NA2SO4, & +! & PPKAPPA_BC, PPKAPPA_OC, PPKAPPA_DU, & +! & PPKAPPA_NH4NO3, PPKAPPA_MSA, & +! & WSO4, WH2SO4, WNACL, WNA2SO4, & +! & WH2O, WDAIR +! +! IMPLICIT NONE +! +! !---included functions from header files +!#include "fcttre.h" +! +! !---subroutine interface +! INTEGER(KIND=JPIM), INTENT(IN) :: KIDIA +! INTEGER(KIND=JPIM), INTENT(IN) :: KFDIA +! INTEGER(KIND=JPIM), INTENT(IN) :: KTDIA +! INTEGER(KIND=JPIM), INTENT(IN) :: KLON +! INTEGER(KIND=JPIM), INTENT(IN) :: KLEV +! INTEGER(KIND=JPIM), INTENT(IN) :: KPDF +! INTEGER(KIND=JPIM), INTENT(IN) :: KFLDX +! +! LOGICAL, INTENT(IN) :: LCLOUD(KLON,KLEV) +! +! REAL(KIND=JPRB), INTENT(IN) :: PT(KLON,KLEV) +! REAL(KIND=JPRB), INTENT(IN) :: PAP(KLON,KLEV) +! REAL(KIND=JPRB), INTENT(IN) :: PRHO(KLON,KLEV) +! REAL(KIND=JPRB), INTENT(IN) :: PQ(KLON,KLEV) +! REAL(KIND=JPRB), INTENT(IN) :: PW(KLON,KLEV,KPDF) +! REAL(KIND=JPRB), INTENT(IN) :: PWPDF(KLON,KLEV,KPDF) +! REAL(KIND=JPRB), INTENT(IN) :: PSO4MASS(KLON,KLEV,NSOL) ! [KG(SO4)/KG(AIR)] +! REAL(KIND=JPRB), INTENT(IN) :: PBCMASS(KLON,KLEV,NSOL) ! [KG(BC)/KG(AIR)] +! REAL(KIND=JPRB), INTENT(IN) :: POMMASS(KLON,KLEV,NSOL) ! [KG(OM)/KG(AIR)] +! REAL(KIND=JPRB), INTENT(IN) :: PSSMASS(KLON,KLEV,NSOL) ! [KG(SS)/KG(AIR)] +! REAL(KIND=JPRB), INTENT(IN) :: PDUMASS(KLON,KLEV,NSOL) ! [KG(DU)/KG(AIR)] +! REAL(KIND=JPRB), INTENT(IN) :: PNO3MASS(KLON,KLEV) ! [KG(NO3)/KG(AIR)] +! REAL(KIND=JPRB), INTENT(IN) :: PMSAMASS(KLON,KLEV) ! [KG(MSA)/KG(AIR)] +! REAL(KIND=JPRB), INTENT(IN) :: PAERONUM(KLON,KLEV,NSOL) +! REAL(KIND=JPRB), INTENT(IN) :: PRDRY(KLON,KLEV,NSOL) +! REAL(KIND=JPRB), INTENT(IN) :: PEXTRA(KLON,KLEV,KFLDX) +! +! ! Output: +! REAL(KIND=JPRB), INTENT(INOUT) :: PCDNC(KLON,KLEV) +! +! !---local data +! INTEGER(KIND=JPIM) :: JL, JK, JMOD, JW +! +! REAL(KIND=JPRB) :: ZN(KLON,KLEV,NSOL) ! aerosol number concentration for each mode [m-3] +! REAL(KIND=JPRB) :: ZSM(KLON,KLEV,NSOL) ! critical supersaturation for activating particles +! ! with the mode number median radius +! REAL(KIND=JPRB) :: ZVOL(KLON) ! total dry particle volume +! REAL(KIND=JPRB) :: ZKAPPA(KLON) ! volume-weighted kappa +! REAL(KIND=JPRB) :: ZSMAX(KLON,KLEV,KPDF) ! maximum supersaturation +! REAL(KIND=JPRB) :: ZESW(KLON,KLEV) ! saturation water vapour pressure +! REAL(KIND=JPRB) :: ZDIF(KLON,KLEV) ! diffusivity +! REAL(KIND=JPRB) :: ZK(KLON,KLEV) ! thermal conductivity +! REAL(KIND=JPRB) :: ZA(KLON,KLEV) ! Kelvin coefficient +! REAL(KIND=JPRB) :: ZALPHA(KLON,KLEV) ! Intermediate term in supersaturation calulation +! REAL(KIND=JPRB) :: ZGAMMA(KLON,KLEV) ! Intermediate term in supersaturation calulation +! REAL(KIND=JPRB) :: ZGROWTH(KLON,KLEV) ! Growth coefficient +! REAL(KIND=JPRB) :: ZTERM1(KLON) ! Intermediate term in growth coefficient calulation +! REAL(KIND=JPRB) :: ZTERM2(KLON) ! Intermediate term in growth coefficient calulation +! REAL(KIND=JPRB) :: ZTERM3(KLON) ! Intermediate term in growth coefficient calulation +! +! REAL(KIND=JPRB) :: ZAMW ! molecular weight of water [kg mol-1] +! REAL(KIND=JPRB) :: ZAMD ! molecular weight of dry air [kg mol-1] +! +! REAL(KIND=JPRB) :: ZKA(KLON), ZKV(KLON) ! Intermediate terms in supersaturation calulation +! REAL(KIND=JPRB) :: ZXV(KLON), ZB(KLON) ! Intermediate terms in supersaturation calulation +! +! REAL(KIND=JPRB) :: ZDIFMOD(KLON) ! Modified diffusivity +! REAL(KIND=JPRB) :: ZNACT ! Intermediate values of the activated number concentration (#/m3) +! REAL(KIND=JPRB) :: ZNACT_WSUM(KLON,KLEV) ! Weighted sum of activated number concentration +! REAL(KIND=JPRB) :: ZPDF_NORM(KLON,KLEV) ! Normalization factor for ZNACT_WSUM +! +! REAL(KIND=JPRB) :: ZSSMASS(KLON) ! Sea salt MMR +! REAL(KIND=JPRB) :: ZDUMASS(KLON) ! Dust MMR +! REAL(KIND=JPRB) :: ZNO3MASS(KLON) ! Nitrate MMR +! REAL(KIND=JPRB) :: ZMSAMASS(KLON) ! MSA MMR +! +! REAL(KIND=JPRB) :: NSO4(KLON), NH2SO4(KLON) ! Particle numbers [kmol/kg air] +! REAL(KIND=JPRB) :: NNACL(KLON), NNA(KLON), NCL(KLON), NNA2SO4(KLON) +! +! ! Per-mode constants +! REAL(KIND=JPRB) :: ZMODECST1(NSOL), ZMODECST2(NSOL), ZMODECST3(NSOL), & +! & ZMODECST4(NSOL), ZMODECST5(NSOL) +! +! ! Intermediate values for the Fountoukis & Nenes iterative scheme +! REAL(KIND=JPRB) :: ZCF1, ZCF2, ZCF3 +! REAL(KIND=JPRB) :: ZVALUE1 +! REAL(KIND=JPRB) :: ZVALUE2 +! REAL(KIND=JPRB) :: ZVALUE3 +! REAL(KIND=JPRB) :: ZINT1 +! REAL(KIND=JPRB) :: ZINT2 +! REAL(KIND=JPRB) :: ZSMAXTEMP1, ZSMAXTEMP2, ZSMAXTEMP3 +! +! ! Control of iterative loop: +! ! According to Ghan et al. (2011) the FN scheme +! ! takes about 30 interations to converge; +! ! so safer to increase the maximum here. +! ! xxx to be tested +! INTEGER(KIND=JPIM), PARAMETER :: NMAXITER = 30 +! INTEGER(KIND=JPIM) :: NITERATIONS +! LOGICAL :: LCONVERGED +! +! ! Miscellaneous +! REAL(KIND=JPRB) :: ZEPS +! REAL(KIND=JPRB) :: Z4PIOVER3, ZSQRT2 +! REAL(KIND=JPRB) :: ZHOOK_HANDLE +! REAL(KIND=JPRB), PARAMETER :: PPEPSSEC = 1.E-25_JPRB ! used to avoid division by 0 +! +! ! mass accomodation coefficient +! ! between 0.1 and 1.0 +! ! Raatikainen et al., 2013 PNAS +! REAL(KIND=JPRB), PARAMETER :: PPALPHA_C = 1.E-1_JPRB +! +! ! Upper and lower size bounds (m) used for calculating the average water vapor diffusivity +! REAL(KIND=JPRB), PARAMETER :: DPBIG = 5.E-6_JPRB +! REAL(KIND=JPRB) :: DPLOW +! +! !--- executable procedure +! IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.AER_ACTIV_FOUNTOUKIS_NENES',0,ZHOOK_HANDLE) +! +! !--- 0) Initializations: +! +! ZSMAX(KIDIA:KFDIA,KTDIA:KLEV,:) = 0._JPRB +! ZSM(KIDIA:KFDIA,KTDIA:KLEV,:) = 0._JPRB +! ZNACT_WSUM(KIDIA:KFDIA,KTDIA:KLEV) = 0._JPRB +! ZPDF_NORM(KIDIA:KFDIA,KTDIA:KLEV) = 0._JPRB +! PCDNC(KIDIA:KFDIA,KTDIA:KLEV) = 0._JPRB +! +! ZEPS=EPSILON(1._JPRB) +! +! !--- Conversions to SI units [g mol-1 to kg mol-1]: +! ZAMW=WH2O*1.E-3_JPRB +! ZAMD=WDAIR*1.E-3_JPRB +! +! !---miscellaneous +! Z4PIOVER3 = 4._JPRB*RPI/3._JPRB +! ZSQRT2 = SQRT(2._JPRB) +! +! ! FN, Eq. (24) converted to m. +! DPLOW = MIN(0.207683E-6_JPRB * PPALPHA_C**(-0.33048_JPRB), DPBIG) +! +! !---grid-point calculations +! DO JK=KTDIA,KLEV +! DO JL=KIDIA,KFDIA +! IF (LCLOUD(JL,JK)) THEN +! !---Kelvin (curvature) coefficient, usually denoted by capital A. +! ! Here we use the definition of SP (introduced on p. 770), +! ! which is adopted in NS, FN, MN, +! ! and include an extra factor of 2 compared to the definition of Abdul-Razzak et al. (Eq. 5). +! ZA(JL,JK) = 4._JPRB * ZAMW * PPSURFTEN / (R * PPRHO_WAT * PT(JL,JK)) +! +! !--- Abdul-Razzak et al. (1998) (Eq. 11): +! ZALPHA(JL,JK) = (RG*ZAMW*RLVTT) / (RCPD*R*PT(JL,JK)*PT(JL,JK)) - & +! & (RG*ZAMD) / (R*PT(JL,JK)) +! +! ! Saturation water vapour pressure: +! ZESW(JL,JK) = FOEEWM(PT(JL,JK)) +! +! !--- Following the definitions of NS, FN and MN, +! ! gamma is defined as a dimensionless coefficient. +! ! We use Eq. (12) from Abdul-Razzak et al. (1998) and multiply it with the air density: +! ZGAMMA(JL,JK) = ( (R*PT(JL,JK)) / (ZESW(JL,JK)*ZAMW) + & +! & (ZAMW*RLVTT*RLVTT) / (RCPD*PAP(JL,JK)*ZAMD*PT(JL,JK)) ) * PRHO(JL,JK) +! +! !--- Diffusivity of water vapour in air (P&K, 13.3) [m2 s-1]: +! +! ZDIF(JL,JK)=0.211_JPRB * (PT(JL,JK)/RTT)**1.94_JPRB * (101325._JPRB/PAP(JL,JK)) *1.E-4_JPRB +! +! !--- modified diffusivity +! ! Average mode-independent value using FN, Eq. (23) +! ZB(JL) = (2._JPRB*ZDIF(JL,JK)/PPALPHA_C)*SQRT(2._JPRB*RPI*ZAMW/(R*PT(JL,JK))) +! +! !--- For any reasonable value of PPALPHA_C: DPBIG > DPLOW +! ZDIFMOD(JL) = ZDIF(JL,JK)*(1._JPRB-(ZB(JL)/(DPBIG-DPLOW))*LOG((DPBIG+ZB(JL))/(DPLOW+ZB(JL)))) +! +! !--- Thermal conductivity zk (P&K, 13.18) [cal cm-1 s-1 K-1]: +! +! ! Mole fraction of water: +! +! ZXV(JL) = PQ(JL,JK)*(ZAMD/ZAMW) +! +! ZKA(JL) = (5.69_JPRB+0.017_JPRB*(PT(JL,JK)-273.15_JPRB))*1.E-5_JPRB +! +! ZKV(JL) = (3.78_JPRB+0.020_JPRB*(PT(JL,JK)-273.15_JPRB))*1.E-5_JPRB +! +! ! Moist air, convert to [J m-1 s-1 K-1]: +! +! ZK(JL,JK) = ZKA(JL)*(1._JPRB-(1.17_JPRB-1.02_JPRB*ZKV(JL)/ZKA(JL))*ZXV(JL)) & +! & * 4.1868_JPRB*1.E2_JPRB +! +! !--- growth coefficient due to gas kinetic effects: +! !--- NS, Eq. (15) +! +! ZTERM1(JL) = (PPRHO_WAT*R*PT(JL,JK)) / (ZESW(JL,JK)*ZDIFMOD(JL)*ZAMW) +! +! !--- Note that no size dependence is introduced in the thermal conductivity +! ! See FN, p. 5 +! ZTERM2(JL) = (RLVTT*PPRHO_WAT) / (ZK(JL,JK)*PT(JL,JK)) +! +! ZTERM3(JL) = (RLVTT*ZAMW) / (R*PT(JL,JK))-1._JPRB +! +! !--- Note that the expression for G in NS (Eq. 15) has an additional factor of 4 +! ! compared to Abdul-Razzak et al. (1998), Eq. (16). +! ! FN follow the definition from NS, +! ! but have omitted the factor of 4 from their Eq. (12). This is a typo. +! ! See also SP (Eq. 17.70) and MN (Eq. A3). +! ZGROWTH(JL,JK) = 4._JPRB / (ZTERM1(JL) + ZTERM2(JL) * ZTERM3(JL)) +! +! END IF +! END DO +! END DO +! +! !---per-mode calculations: +! ! soluble mode number and critical supersaturation, ignore nucleation mode (mode 1) +! DO JMOD=2, NSOL +! DO JK=KTDIA,KLEV +! DO JL=KIDIA,KFDIA +! IF (LCLOUD(JL,JK)) THEN +! +! !---total volume per mode [m^3 / kg(air)], used for kappa calculation +! ZVOL(JL) = Z4PIOVER3 * PAERONUM(JL,JK,JMOD) * & +! & (CMR2RAM(JMOD)*PRDRY(JL,JK,JMOD))**3 +! +! !--- Number per unit volume [# m-3] for each mode: +! ZN(JL,JK,JMOD) = PAERONUM(JL,JK,JMOD)*PRHO(JL,JK) +! +! !---sea salt and dust do not exist in mode 2: +! ZSSMASS(JL) = MERGE(0._JPRB, PSSMASS(JL,JK,JMOD), JMOD==2) +! ZDUMASS(JL) = MERGE(0._JPRB, PDUMASS(JL,JK,JMOD), JMOD==2) +! +! !---ammonium-nitrate and MSA do not exit in mode 2 and 4: +! ZNO3MASS(JL) = MERGE(0._JPRB, PNO3MASS(JL,JK), JMOD==2 .OR. JMOD==4) +! ZMSAMASS(JL) = MERGE(0._JPRB, PMSAMASS(JL,JK), JMOD==2 .OR. JMOD==4) +! +! NNA(JL) = ZSSMASS(JL) / WNACL +! NCL(JL) = NNA(JL) +! NSO4(JL) = PSO4MASS(JL,JK,JMOD) / WSO4 +! NNA2SO4(JL) = MIN(NNA(JL)/2._JPRB, NSO4(JL)) +! NNA(JL) = NNA(JL) - 2._JPRB*NNA2SO4(JL) +! NNACL(JL) = MIN(NCL(JL), NNA(JL)) +! NCL(JL) = NNACL(JL) +! NH2SO4(JL) = NSO4(JL) - NNA2SO4(JL) +! +! !---mode kappa = volume-weighted sum of component kappa's +! ZKAPPA(JL) = ( (PPKAPPA_NACL * NNACL(JL) * WNACL / (DNACL*1.E3_JPRB)) + & +! & (PPKAPPA_NA2SO4 * NNA2SO4(JL) * WNA2SO4 / (DNA2SO4*1.E3_JPRB)) + & +! & (PPKAPPA_H2SO4 * NH2SO4(JL) * WH2SO4 / (DH2SO4*1.E3_JPRB)) + & +! & (PPKAPPA_BC * PBCMASS(JL,JK,JMOD) / (DBC*1.E3_JPRB)) + & +! & (PPKAPPA_OC * POMMASS(JL,JK,JMOD) / (DOC*1.E3_JPRB)) + & +! & (PPKAPPA_DU * ZDUMASS(JL) / (DDUST*1.E3_JPRB)) + & +! & (PPKAPPA_NH4NO3 * ZNO3MASS(JL) * NH4NO3_FACTOR / (DNH4NO3*1.E3_JPRB)) + & +! & (PPKAPPA_MSA * ZMSAMASS(JL) / (DMSA*1.E3_JPRB)) ) / & +! & ZVOL(JL) +! +! !---defensive step: minimum kappa to avoid divide by zero errors +! ZKAPPA(JL) = MERGE(ZKAPPA(JL), 0.04_JPRB, ZKAPPA(JL) > 0.04_JPRB ) +! +! !---eqn. (2) from Ghan et al (2011) +! ! an addition factor 0.5**3 has been included in the nominator +! ! because the Kelvin coefficient used here (ZA) +! ! is twice that in Ghan et al. (ZKELV) +! ZSM(JL,JK,JMOD) = SQRT(0.5_JPRB * ZA(JL,JK)**3 / & +! & (27._JPRB * ZKAPPA(JL) * PRDRY(JL,JK,JMOD)**3) ) +! +! END IF +! END DO +! END DO +! END DO +! +! +! !--- 2) Calculate maximum supersaturation: +! +! DO JMOD=2,NSOL +! +! !---some per-mode constants +! ZMODECST1(JMOD) = 3.0_JPRB*SIGMALN(JMOD)/ZSQRT2 ! final term in FN, Eq. (18) +! ZMODECST2(JMOD) = EXP(4.5_JPRB*SIGMALN(JMOD)**2) ! factor in FN, Eq. (18) +! +! ZMODECST3(JMOD) = ZMODECST1(JMOD)/2._JPRB ! final term in FN, Eq. (19) +! ZMODECST4(JMOD) = EXP(1.125_JPRB*SIGMALN(JMOD)**2) ! factor in FN, Eq. (19) +! +! ZMODECST5(JMOD) = 3.0_JPRB*ZSQRT2*SIGMALN(JMOD) ! denominator in FN, Eqs. (8) and (20) +! +! END DO +! +! DO JW=1,KPDF +! DO JK=KTDIA, KLEV +! DO JL=KIDIA,KFDIA +! IF (LCLOUD(JL,JK)) THEN +! IF (ZALPHA(JL,JK) > ZEPS .AND. PW(JL,JK,JW) > ZEPS) THEN +! ZSMAXTEMP1 = 1.0E-5_JPRB ! min cloud supersat. +! ZSMAXTEMP2 = 0.1_JPRB ! max cloud supersat. +! LCONVERGED = .FALSE. +! NITERATIONS = 0 +! +! ZCF1 = 0.5_JPRB*SQRT(ZGROWTH(JL,JK)/(ZALPHA(JL,JK)*PW(JL,JK,JW))) +! ZCF2 = ZA(JL,JK)/3.0_JPRB +! ! When gamma is defined as a dimensionless coefficient as above, +! ! ZCF3 should include a division by the air density. +! ! See MN, Eq. 5. +! ! This is an error in NS (Eq. 32) and FN (Eq. 10). +! ! It is can be traced back to the definition of the rate of water condensation in NS, Eq. (11), +! ! where W is expressed in units kg(liquid water)/m3(air) instead of kg(liquid water)/kg(air). +! ! See also SP, Eqs. (17.73) and (17.79). +! ZCF3 = 0.5_JPRB*RPI*ZGAMMA(JL,JK)*PPRHO_WAT*ZGROWTH(JL,JK) & +! & /ZALPHA(JL,JK)/PW(JL,JK,JW)/PRHO(JL,JK) +! +! CALL SINTEGRAL(ZA(JL,JK), ZALPHA(JL,JK), ZGAMMA(JL,JK), ZGROWTH(JL,JK), & +! & PW(JL,JK,JW), ZN(JL,JK,:), ZSM(JL,JK,:), ZSMAXTEMP1, & +! & ZMODECST1(:), ZMODECST2(:), ZMODECST3(:), ZMODECST4(:), & +! & ZMODECST5(:), ZINT1, ZINT2) +! +! ZVALUE1 = (ZINT1*ZCF1 + ZINT2*ZCF2)*ZCF3*ZSMAXTEMP1 - 1.0_JPRB +! +! !DIR$ INLINE +! CALL SINTEGRAL(ZA(JL,JK), ZALPHA(JL,JK), ZGAMMA(JL,JK), ZGROWTH(JL,JK), & +! & PW(JL,JK,JW), ZN(JL,JK,:), ZSM(JL,JK,:), ZSMAXTEMP2, & +! & ZMODECST1(:), ZMODECST2(:), ZMODECST3(:), ZMODECST4(:), & +! & ZMODECST5(:), ZINT1, ZINT2) +! ZVALUE2 = (ZINT1*ZCF1 + ZINT2*ZCF2) * ZCF3*ZSMAXTEMP2 - 1.0_JPRB +! +! DO WHILE ((.NOT.LCONVERGED) .AND. NITERATIONS < NMAXITER) +! NITERATIONS = NITERATIONS + 1 +! +! ZSMAXTEMP3 = 0.5_JPRB*(ZSMAXTEMP1+ZSMAXTEMP2) +! !DIR$ INLINE +! CALL SINTEGRAL(ZA(JL,JK), ZALPHA(JL,JK), ZGAMMA(JL,JK), ZGROWTH(JL,JK), & +! & PW(JL,JK,JW), ZN(JL,JK,:), ZSM(JL,JK,:), ZSMAXTEMP3, & +! & ZMODECST1(:), ZMODECST2(:), ZMODECST3(:), ZMODECST4(:), & +! & ZMODECST5(:), ZINT1, ZINT2) +! ZVALUE3 = (ZINT1*ZCF1 + ZINT2*ZCF2) * ZCF3*ZSMAXTEMP3 - 1.0_JPRB +! +! IF (SIGN(1.0_JPRB,ZVALUE1)*SIGN(1.0_JPRB,ZVALUE3) <= 0.0_JPRB) THEN +! ZVALUE2 = ZVALUE3 +! ZSMAXTEMP2 = ZSMAXTEMP3 +! ELSE +! ZVALUE1 = ZVALUE3 +! ZSMAXTEMP1 = ZSMAXTEMP3 +! END IF +! +! !xxx 1e-3, i.e. 0.1%, should be enough +! IF (ABS(ZSMAXTEMP2-ZSMAXTEMP1) <= 1.0E-5_JPRB*ZSMAXTEMP1) THEN +! +! ZSMAX(JL,JK,JW) = 0.5_JPRB*(ZSMAXTEMP1+ZSMAXTEMP2) +! LCONVERGED = .TRUE. +! +! ZNACT = 0._JPRB +! DO JMOD=2,NSOL +! IF (ZSM(JL,JK,JMOD) > ZEPS) THEN +! ZNACT = ZNACT + 0.5_JPRB*ZN(JL,JK,JMOD)*ERFC(2._JPRB*(LOG(ZSM(JL,JK,JMOD)/ZSMAX(JL,JK,JW)))/ZMODECST5(JMOD)) +! END IF +! END DO +! +! !---Sum up the total number of activated particles, weighted by the updraft PDF [m-3]: +! ZNACT_WSUM(JL,JK) = ZNACT_WSUM(JL,JK) + ZNACT*PWPDF(JL,JK,JW) +! +! ! Including the normalization here effectively means that conditions that don't yield a converged solution +! ! are discarded when calculating the mean CDNC over the updraft PDF. +! ZPDF_NORM(JL,JK) = ZPDF_NORM(JL,JK) + PWPDF(JL,JK,JW) +! +! END IF +! +! END DO ! do while +! +! IF (.NOT.LCONVERGED) THEN +! WRITE(NULOUT,*) 'WARNING: Fountoukis and Nenes scheme not converged for updraft velocity', PW(JL,JK,JW) +! ENDIF +! +! ELSE +! +! ! Set contribution to activation to zero when conditions are not met +! ZPDF_NORM(JL,JK) = ZPDF_NORM(JL,JK) + PWPDF(JL,JK,JW) +! +! END IF ! END IF safe wrt divide by 0, LOG(0)... +! END IF +! END DO !jl +! END DO !jk +! END DO +! +! DO JK=KTDIA,KLEV +! DO JL=KIDIA,KFDIA +! !---normalize the total number of activated particles over the PDF, and convert to [# cm-3] +! IF (LCLOUD(JL,JK) .AND. ZPDF_NORM(JL,JK) > ZEPS ) THEN +! PCDNC(JL,JK) = 1.E-6_JPRB * ZNACT_WSUM(JL,JK) / ZPDF_NORM(JL,JK) +! END IF +! END DO +! END DO +! +! IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.AER_ACTIV_FOUNTOUKIS_NENES',1,ZHOOK_HANDLE) +! +! END SUBROUTINE AER_ACTIV_FOUNTOUKIS_NENES +! +! SUBROUTINE SINTEGRAL(PA, PALPHA, PGAMMA, PGROWTH, PW, PN, PSM, & +! PSMAX, PUP1, PF1, PUP2, PF2, PUPD, PINTEG1, PINTEG2) +! +! USE YOE_AERO_M7_DATA, ONLY: NSOL +! +! IMPLICIT NONE +! +! REAL(KIND=JPRB), INTENT(IN) :: PN(NSOL), PSM(NSOL) +! REAL(KIND=JPRB), INTENT(IN) :: PUP1(NSOL), PF1(NSOL), PUP2(NSOL), PF2(NSOL), PUPD(NSOL) +! REAL(KIND=JPRB), INTENT(IN) :: PA, PALPHA, PGAMMA, PGROWTH, PW, PSMAX +! +! REAL(KIND=JPRB), INTENT(OUT) :: PINTEG1, PINTEG2 +! +! REAL(KIND=JPRB) :: ZUPART, ZUPM, ZUMAX, ZUMM, ZUPP +! +! REAL(KIND=JPRB) :: ZDELTA, ZRATIO, ZSPART2 +! +! REAL(KIND=JPRB) :: ZEPS +! +! INTEGER(KIND=JPIM) :: JMOD +! +! ! note: this subroutine is intended for inline compilation and therefore does not call dr_hook +! +! ZEPS=EPSILON(1._JPRB) +! +! ZDELTA = 1.0_JPRB - 16.0_JPRB/(9.0_JPRB*PGROWTH)*PALPHA*PW*(PA/PSMAX**2)**2 +! +! ! ZDELTA = ZSMAX**4 - 16.0_JPRB/(9.0_JPRB*ZGROWTH)*ZALPHA*ZW*ZA**2 +! IF (ZDELTA <= 0.0_JPRB) THEN +! ZRATIO = (2.0E7_JPRB/3.0_JPRB)*PA*PSMAX**(-0.3824) +! IF (ZRATIO > 1.0_JPRB) THEN +! ZRATIO = 1.0_JPRB +! END IF +! ZSPART2 = PSMAX*ZRATIO +! ELSE +! ZSPART2 = 0.5_JPRB*(1.0_JPRB + SQRT(ZDELTA)) !max root +! ZSPART2 = SQRT(ZSPART2)*PSMAX +! ENDIF +! +! !** Calculate integrals +! +! PINTEG1 = 0._JPRB +! PINTEG2 = 0._JPRB +! DO JMOD=2,NSOL +! IF (PSM(JMOD) > ZEPS) THEN +! ! FN, Eq. (20): +! ZUPART = 2.0_JPRB*LOG(PSM(JMOD)/ZSPART2)/PUPD(JMOD) +! +! ZUMAX = 2.0_JPRB*LOG(PSM(JMOD)/PSMAX)/ PUPD(JMOD) +! +! ! argument to last erfc in FN, Eq. (18) +! ZUPP = ZUPART + PUP1(JMOD) +! +! ! argument to first erf in FN, Eq. (19) +! ZUPM = ZUPART - PUP2(JMOD) +! +! ! argument to second erf in FN, Eq. (19) +! ZUMM = ZUMAX - PUP2(JMOD) +! +! ! intergral I1: FN, Eq. (18) without the factor 0.5 sqrt(G/aV) +! PINTEG1 = PINTEG1 + PN(JMOD)*PSMAX*(ERFC(ZUPART) - & +! & 0.5_JPRB*(PSM(JMOD)/PSMAX)**2*PF1(JMOD)*ERFC(ZUPP)) +! +! ! integral I2: FN, Eq. (19) without the factor A/3 +! PINTEG2 = PINTEG2 + (PF2(JMOD) * PN(JMOD)/PSM(JMOD))*(ERF(ZUPM) - ERF(ZUMM)) +! ENDIF +! ENDDO +! +! +! END SUBROUTINE SINTEGRAL + + +! SUBROUTINE AER_ACTIV_MORALES_NENES(KIDIA, KFDIA, KTDIA, KLON, KLEV, KPDF, LCLOUD, PT, PAP, PRHO, & +! & PQ, PW, PWPDF, PSO4MASS, PBCMASS, POMMASS, PSSMASS, & +! & PDUMASS,PNO3MASS, PMSAMASS, PAERONUM, PRDRY, PCDNC, KFLDX, PEXTRA) +! +! +! ! *aer_activ_morales_nenes* calculates the number of activated aerosol +! ! particles from the aerosol size-distribution, +! ! composition and ambient supersaturation +! ! +! ! Author: +! ! ------- +! ! Twan van Noije, KNMI +! ! +! ! References: +! ! ----------- +! ! Abdul-Razzak et al., JGR, 103, D6, 6123-6131, 1998 +! ! Abdul-Razzak and Ghan, JGR, 105, D5, 6837-6844, 2000 (referred to as ARG) +! ! Pruppbacher and Klett, Kluewer Ac. Pub., 1997 +! ! Ghan et al., JAMES 3, M10001, 2011 +! ! Nenes and Seinfeld, JGR, 108, D14, 4415, 2003 (referred to as NS) +! ! Fountoukis and Nenes, JGR, 110, D11212, 2005 (referred to as FN) +! ! Morales Betancourt and Nenes, GMD, 7, 2345-2357, 2014 (referred to as MN) +! ! Seinfeld and Pandis, Atmospheric Chemistry and Physics, Second Edition (referred to as SP) +! +! USE YOMCST, ONLY: R, RV, RPI, RCPD, RG, RLVTT, RMV, RMD, RTT , RLSTT +! USE YOECLDP, ONLY: RTHOMO, PPRHO_WAT +! USE YOMHOOK, ONLY: LHOOK, DR_HOOK +! USE YOMLUN, ONLY: NULOUT +! USE YOETHF , ONLY : R2ES ,R3LES ,R3IES ,R4LES ,& +! & R4IES ,R5LES ,R5IES ,R5ALVCP ,R5ALSCP ,& +! & RALVDCP ,RALSDCP ,RTWAT ,& +! & RTICE ,RTICECU ,& +! & RTWAT_RTICE_R ,RTWAT_RTICECU_R,& +! & RKOOP1 ,RKOOP2 +! USE YOE_AERO_M7_DATA, ONLY: NMOD, NSOL, SIGMALN, CMR2RAM, & +! & DH2SO4, DBC, DOC, DNACL, DDUST, & +! & DNA2SO4, DNH4NO3, DMSA, NH4NO3_FACTOR, & +! & PPKAPPA_H2SO4, PPKAPPA_NACL, PPKAPPA_NA2SO4, & +! & PPKAPPA_BC, PPKAPPA_OC, PPKAPPA_DU, & +! & PPKAPPA_NH4NO3, PPKAPPA_MSA, & +! & WSO4, WH2SO4, WNACL, WNA2SO4, & +! & WH2O, WDAIR +! +! IMPLICIT NONE +! +! !---included functions from header files +!#include "fcttre.h" +! +! !---subroutine interface +! INTEGER(KIND=JPIM), INTENT(IN) :: KIDIA +! INTEGER(KIND=JPIM), INTENT(IN) :: KFDIA +! INTEGER(KIND=JPIM), INTENT(IN) :: KTDIA +! INTEGER(KIND=JPIM), INTENT(IN) :: KLON +! INTEGER(KIND=JPIM), INTENT(IN) :: KLEV +! INTEGER(KIND=JPIM), INTENT(IN) :: KPDF +! INTEGER(KIND=JPIM), INTENT(IN) :: KFLDX +! +! LOGICAL, INTENT(IN) :: LCLOUD(KLON,KLEV) +! +! REAL(KIND=JPRB), INTENT(IN) :: PT(KLON,KLEV) +! REAL(KIND=JPRB), INTENT(IN) :: PAP(KLON,KLEV) +! REAL(KIND=JPRB), INTENT(IN) :: PRHO(KLON,KLEV) +! REAL(KIND=JPRB), INTENT(IN) :: PQ(KLON,KLEV) +! REAL(KIND=JPRB), INTENT(IN) :: PW(KLON,KLEV,KPDF) +! REAL(KIND=JPRB), INTENT(IN) :: PWPDF(KLON,KLEV,KPDF) +! REAL(KIND=JPRB), INTENT(IN) :: PSO4MASS(KLON,KLEV,NSOL) ! [KG(SO4)/KG(AIR)] +! REAL(KIND=JPRB), INTENT(IN) :: PBCMASS(KLON,KLEV,NSOL) ! [KG(BC)/KG(AIR)] +! REAL(KIND=JPRB), INTENT(IN) :: POMMASS(KLON,KLEV,NSOL) ! [KG(OM)/KG(AIR)] +! REAL(KIND=JPRB), INTENT(IN) :: PSSMASS(KLON,KLEV,NSOL) ! [KG(SS)/KG(AIR)] +! REAL(KIND=JPRB), INTENT(IN) :: PDUMASS(KLON,KLEV,NSOL) ! [KG(DU)/KG(AIR)] +! REAL(KIND=JPRB), INTENT(IN) :: PNO3MASS(KLON,KLEV) ! [KG(NO3)/KG(AIR)] +! REAL(KIND=JPRB), INTENT(IN) :: PMSAMASS(KLON,KLEV) ! [KG(MSA)/KG(AIR)] +! REAL(KIND=JPRB), INTENT(IN) :: PAERONUM(KLON,KLEV,NSOL) +! REAL(KIND=JPRB), INTENT(IN) :: PRDRY(KLON,KLEV,NSOL) +! REAL(KIND=JPRB), INTENT(IN) :: PEXTRA(KLON,KLEV,KFLDX) +! +! ! Output: +! REAL(KIND=JPRB), INTENT(INOUT) :: PCDNC(KLON,KLEV) +! +! !---local data +! INTEGER(KIND=JPIM) :: JL, JK, JMOD, JW +! +! REAL(KIND=JPRB) :: ZN(KLON,KLEV,NSOL) ! aerosol number concentration for each mode [m-3] +! REAL(KIND=JPRB) :: ZSM(KLON,KLEV,NSOL) ! critical supersaturation for activating particles +! ! with the mode number median radius +! REAL(KIND=JPRB) :: ZVOL(KLON) ! total dry particle volume +! REAL(KIND=JPRB) :: ZKAPPA(KLON) ! volume-weighted kappa +! REAL(KIND=JPRB) :: ZSMAX(KLON,KLEV,KPDF) ! maximum supersaturation +! REAL(KIND=JPRB) :: ZESW(KLON,KLEV) ! saturation water vapour pressure +! REAL(KIND=JPRB) :: ZDIF(KLON,KLEV) ! diffusivity +! REAL(KIND=JPRB) :: ZK(KLON,KLEV) ! thermal conductivity +! REAL(KIND=JPRB) :: ZA(KLON,KLEV) ! Kelvin coefficient +! REAL(KIND=JPRB) :: ZALPHA(KLON,KLEV) ! Intermediate term in supersaturation calulation +! REAL(KIND=JPRB) :: ZGAMMA(KLON,KLEV) ! Intermediate term in supersaturation calulation +! REAL(KIND=JPRB) :: ZGROWTH(KLON,KLEV) ! Growth coefficient +! REAL(KIND=JPRB) :: ZTERM1(KLON) ! Intermediate term in growth coefficient calulation +! REAL(KIND=JPRB) :: ZTERM2(KLON) ! Intermediate term in growth coefficient calulation +! REAL(KIND=JPRB) :: ZTERM3(KLON) ! Intermediate term in growth coefficient calulation +! +! REAL(KIND=JPRB) :: ZAMW ! molecular weight of water [kg mol-1] +! REAL(KIND=JPRB) :: ZAMD ! molecular weight of dry air [kg mol-1] +! +! REAL(KIND=JPRB) :: ZKA(KLON), ZKV(KLON) ! Intermediate terms in supersaturation calulation +! REAL(KIND=JPRB) :: ZXV(KLON), ZB(KLON) ! Intermediate terms in supersaturation calulation +! +! REAL(KIND=JPRB) :: ZDIFMOD(KLON) ! Modified diffusivity +! REAL(KIND=JPRB) :: ZNACT ! Intermediate values of the activated number concentration (#/m3) +! REAL(KIND=JPRB) :: ZNACT_WSUM(KLON,KLEV) ! Weighted sum of activated number concentration +! REAL(KIND=JPRB) :: ZPDF_NORM(KLON,KLEV) ! Normalization factor for ZNACT_WSUM +! +! REAL(KIND=JPRB) :: ZSSMASS(KLON) ! Sea salt MMR +! REAL(KIND=JPRB) :: ZDUMASS(KLON) ! Dust MMR +! REAL(KIND=JPRB) :: ZNO3MASS(KLON) ! Nitrate MMR +! REAL(KIND=JPRB) :: ZMSAMASS(KLON) ! MSA MMR +! +! REAL(KIND=JPRB) :: NSO4(KLON), NH2SO4(KLON) ! Particle numbers [kmol/kg air] +! REAL(KIND=JPRB) :: NNACL(KLON), NNA(KLON), NCL(KLON), NNA2SO4(KLON) +! +! ! Per-mode constants +! REAL(KIND=JPRB) :: ZMODECST1(NSOL), ZMODECST2(NSOL), ZMODECST3(NSOL), & +! & ZMODECST4(NSOL), ZMODECST5(NSOL) +! +! ! Intermediate values for the Morales & Nenes iterative scheme +! REAL(KIND=JPRB) :: ZCF1, ZCF2, ZCF3 +! REAL(KIND=JPRB) :: ZVALUE1 +! REAL(KIND=JPRB) :: ZVALUE2 +! REAL(KIND=JPRB) :: ZVALUE3 +! REAL(KIND=JPRB) :: ZINT1 +! REAL(KIND=JPRB) :: ZINT2 +! REAL(KIND=JPRB) :: ZSMAXTEMP1, ZSMAXTEMP2, ZSMAXTEMP3 +! +! ! Control of iterative loop: +! ! According to Ghan et al. (2011) the FN scheme +! ! takes about 30 interations to converge; +! ! so safer to increase the maximum here. +! ! xxx to be tested +! ! xxx should be enough, rarely exceeds 30 +! ! define convergence in terms of CDNC 1E-3, i.e. 0.1% +! INTEGER(KIND=JPIM), PARAMETER :: NMAXITER = 30 +! INTEGER(KIND=JPIM) :: NITERATIONS +! LOGICAL :: LCONVERGED +! +! ! Miscellaneous +! REAL(KIND=JPRB) :: ZEPS +! REAL(KIND=JPRB) :: Z4PIOVER3, ZSQRT2 +! REAL(KIND=JPRB) :: ZHOOK_HANDLE +! REAL(KIND=JPRB), PARAMETER :: PPEPSSEC = 1.E-25_JPRB ! used to avoid division by 0 +! +! ! mass accomodation coefficient +! ! between 0.1 and 1.0 +! ! Raatikainen et al., 2013 PNAS +! REAL(KIND=JPRB), PARAMETER :: PPALPHA_C = 1.E-1_JPRB +! +! ! Upper and lower size bounds (m) used for calculating the average water vapor diffusivity +! REAL(KIND=JPRB), PARAMETER :: DPBIG = 5.E-6_JPRB +! REAL(KIND=JPRB) :: DPLOW +! +! !--- executable procedure +! IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.AER_ACTIV_MORALES_NENES',0,ZHOOK_HANDLE) +! +! !--- 0) Initializations: +! +! ZSMAX(KIDIA:KFDIA,KTDIA:KLEV,:) = 0._JPRB +! ZSM(KIDIA:KFDIA,KTDIA:KLEV,:) = 0._JPRB +! ZNACT_WSUM(KIDIA:KFDIA,KTDIA:KLEV) = 0._JPRB +! ZPDF_NORM(KIDIA:KFDIA,KTDIA:KLEV) = 0._JPRB +! PCDNC(KIDIA:KFDIA,KTDIA:KLEV) = 0._JPRB +! +! ZEPS=EPSILON(1._JPRB) +! +! !--- Conversions to SI units [g mol-1 to kg mol-1]: +! ZAMW=WH2O*1.E-3_JPRB +! ZAMD=WDAIR*1.E-3_JPRB +! +! !---miscellaneous +! Z4PIOVER3 = 4._JPRB*RPI/3._JPRB +! ZSQRT2 = SQRT(2._JPRB) +! +! ! FN, Eq. (24) converted to m. +! DPLOW = MIN(0.207683E-6_JPRB * PPALPHA_C**(-0.33048_JPRB), DPBIG) +! +! !---grid-point calculations +! DO JK=KTDIA,KLEV +! DO JL=KIDIA,KFDIA +! IF (LCLOUD(JL,JK)) THEN +! !---Kelvin (curvature) coefficient, usually denoted by capital A. +! ! Here we use the definition of SP (introduced on p. 770), +! ! which is adopted in NS, FN, MN, +! ! and include an extra factor of 2 compared to the definition of Abdul-Razzak et al. (Eq. 5). +! ZA(JL,JK) = 4._JPRB * ZAMW * PPSURFTEN / (R * PPRHO_WAT * PT(JL,JK)) +! +! !--- Abdul-Razzak et al. (1998) (Eq. 11): +! +! ZALPHA(JL,JK) = (RG*ZAMW*RLVTT) / (RCPD*R*PT(JL,JK)*PT(JL,JK)) - & +! & (RG*ZAMD) / (R*PT(JL,JK)) +! +! ! Saturation water vapour pressure: +! ZESW(JL,JK) = FOEEWM(PT(JL,JK)) +! +! !--- Following the definitions of NS, FN and MN, +! ! gamma is defined as a dimensionless coefficient. +! ! We use Eq. (12) from Abdul-Razzak et al. (1998) and multiply it with the air density: +! ZGAMMA(JL,JK) = ( (R*PT(JL,JK)) / (ZESW(JL,JK)*ZAMW) + & +! & (ZAMW*RLVTT*RLVTT) / (RCPD*PAP(JL,JK)*ZAMD*PT(JL,JK)) ) * PRHO(JL,JK) +! +! !--- Diffusivity of water vapour in air (P&K, 13.3) [m2 s-1]: +! +! ZDIF(JL,JK)=0.211_JPRB * (PT(JL,JK)/RTT)**1.94_JPRB * (101325._JPRB/PAP(JL,JK)) *1.E-4_JPRB +! +! !--- modified diffusivity +! ! Average mode-independent value using FN, Eq. (23) +! ZB(JL) = (2._JPRB*ZDIF(JL,JK)/PPALPHA_C)*SQRT(2._JPRB*RPI*ZAMW/(R*PT(JL,JK))) +! +! !--- For any reasonable value of PPALPHA_C: DPBIG > DPLOW +! ZDIFMOD(JL) = ZDIF(JL,JK)*(1._JPRB-(ZB(JL)/(DPBIG-DPLOW))*LOG((DPBIG+ZB(JL))/(DPLOW+ZB(JL)))) +! +! !--- Thermal conductivity zk (P&K, 13.18) [cal cm-1 s-1 K-1]: +! +! ! Mole fraction of water: +! +! ZXV(JL) = PQ(JL,JK)*(ZAMD/ZAMW) +! +! ZKA(JL) = (5.69_JPRB+0.017_JPRB*(PT(JL,JK)-273.15_JPRB))*1.E-5_JPRB +! +! ZKV(JL) = (3.78_JPRB+0.020_JPRB*(PT(JL,JK)-273.15_JPRB))*1.E-5_JPRB +! +! ! Moist air, convert to [J m-1 s-1 K-1]: +! +! ZK(JL,JK) = ZKA(JL)*(1._JPRB-(1.17_JPRB-1.02_JPRB*ZKV(JL)/ZKA(JL))*ZXV(JL)) & +! & * 4.1868_JPRB*1.E2_JPRB +! +! !--- growth coefficient due to gas kinetic effects: +! !--- NS, Eq. (15) +! +! ZTERM1(JL) = (PPRHO_WAT*R*PT(JL,JK)) / (ZESW(JL,JK)*ZDIFMOD(JL)*ZAMW) +! +! !--- Note that no size dependence is introduced in the thermal conductivity +! ! See FN, p. 5 +! ZTERM2(JL) = (RLVTT*PPRHO_WAT) / (ZK(JL,JK)*PT(JL,JK)) +! +! ZTERM3(JL) = (RLVTT*ZAMW) / (R*PT(JL,JK))-1._JPRB +! +! !--- Note that the expression for G in NS (Eq. 15) has an additional factor of 4 +! ! compared to Abdul-Razzak et al. (1998), Eq. (16). +! ! FN follow the definition from NS, +! ! but have omitted the factor of 4 from their Eq. (12). This is a typo. +! ! See also SP (Eq. 17.70) MN (Eq. A3). +! ZGROWTH(JL,JK) = 4._JPRB / (ZTERM1(JL) + ZTERM2(JL) * ZTERM3(JL)) +! +! END IF +! END DO +! END DO +! +! !---per-mode calculations: +! ! soluble mode number and critical supersaturation, ignore nucleation mode (mode 1) +! DO JMOD=2, NSOL +! DO JK=KTDIA,KLEV +! DO JL=KIDIA,KFDIA +! IF (LCLOUD(JL,JK)) THEN +! +! !---total volume per mode [m-3 / kg(air)], used for kappa calculation +! ZVOL(JL) = Z4PIOVER3 * PAERONUM(JL,JK,JMOD) * & +! & (CMR2RAM(JMOD)*PRDRY(JL,JK,JMOD))**3 +! +! !--- Number per unit volume [# m-3] for each mode: +! ZN(JL,JK,JMOD) = PAERONUM(JL,JK,JMOD)*PRHO(JL,JK) +! +! !---sea salt and dust do not exist in mode 2: +! ZSSMASS(JL) = MERGE(0._JPRB, PSSMASS(JL,JK,JMOD), JMOD==2) +! ZDUMASS(JL) = MERGE(0._JPRB, PDUMASS(JL,JK,JMOD), JMOD==2) +! +! !---ammonium-nitrate and MSA do not exit in mode 2 and 4: +! ZNO3MASS(JL) = MERGE(0._JPRB, PNO3MASS(JL,JK), JMOD==2 .OR. JMOD==4) +! ZMSAMASS(JL) = MERGE(0._JPRB, PMSAMASS(JL,JK), JMOD==2 .OR. JMOD==4) +! +! NNA(JL) = ZSSMASS(JL) / WNACL +! NCL(JL) = NNA(JL) +! NSO4(JL) = PSO4MASS(JL,JK,JMOD) / WSO4 +! NNA2SO4(JL) = MIN(NNA(JL)/2._JPRB, NSO4(JL)) +! NNA(JL) = NNA(JL) - 2._JPRB*NNA2SO4(JL) +! NNACL(JL) = MIN(NCL(JL), NNA(JL)) +! NCL(JL) = NNACL(JL) +! NH2SO4(JL) = NSO4(JL) - NNA2SO4(JL) +! +! !---mode kappa = volume-weighted sum of component kappa's +! ZKAPPA(JL) = ( (PPKAPPA_NACL * NNACL(JL) * WNACL / (DNACL*1.E3_JPRB)) + & +! & (PPKAPPA_NA2SO4 * NNA2SO4(JL) * WNA2SO4 / (DNA2SO4*1.E3_JPRB)) + & +! & (PPKAPPA_H2SO4 * NH2SO4(JL) * WH2SO4 / (DH2SO4*1.E3_JPRB)) + & +! & (PPKAPPA_BC * PBCMASS(JL,JK,JMOD) / (DBC*1.E3_JPRB)) + & +! & (PPKAPPA_OC * POMMASS(JL,JK,JMOD) / (DOC*1.E3_JPRB)) + & +! & (PPKAPPA_DU * ZDUMASS(JL) / (DDUST*1.E3_JPRB)) + & +! & (PPKAPPA_NH4NO3 * ZNO3MASS(JL) * NH4NO3_FACTOR / (DNH4NO3*1.E3_JPRB)) + & +! & (PPKAPPA_MSA * ZMSAMASS(JL) / (DMSA*1.E3_JPRB)) ) / & +! & ZVOL(JL) +! +! !---defensive step: minimum kappa to avoid divide by zero errors +! ZKAPPA(JL) = MERGE(ZKAPPA(JL), 0.04_JPRB, ZKAPPA(JL) > 0.04_JPRB ) +! +! !---eqn. (2) from Ghan et al (2011) +! ! an addition factor 0.5**3 has been included in the nominator +! ! because the Kelvin coefficient used here (ZA) +! ! is twice that in Ghan et al. (ZKELV) +! ZSM(JL,JK,JMOD) = SQRT(0.5_JPRB * ZA(JL,JK)**3 / & +! & (27._JPRB * ZKAPPA(JL) * PRDRY(JL,JK,JMOD)**3) ) +! +! END IF +! END DO +! END DO +! END DO +! +! +! !--- 2) Calculate maximum supersaturation: +! +! DO JMOD=2,NSOL +! +! !---some per-mode constants +! ZMODECST1(JMOD) = 3.0_JPRB*SIGMALN(JMOD)/ZSQRT2 ! final term in FN, Eq. (18) +! ZMODECST2(JMOD) = EXP(4.5_JPRB*SIGMALN(JMOD)**2) ! factor in FN, Eq. (18) +! +! ZMODECST3(JMOD) = ZMODECST1(JMOD)/2._JPRB ! final term in FN, Eq. (19) +! ZMODECST4(JMOD) = EXP(1.125_JPRB*SIGMALN(JMOD)**2) ! factor in FN, Eq. (19) +! +! ZMODECST5(JMOD) = 3.0_JPRB*ZSQRT2*SIGMALN(JMOD) ! denominator in FN, Eqs. (8) and (20) +! +! END DO +! +! DO JW=1,KPDF +! DO JK=KTDIA, KLEV +! DO JL=KIDIA,KFDIA +! IF (LCLOUD(JL,JK)) THEN +! IF (ZALPHA(JL,JK) > ZEPS .AND. PW(JL,JK,JW) > ZEPS) THEN +! ZSMAXTEMP1 = 1.0E-5_JPRB ! min cloud supersat. +! ZSMAXTEMP2 = 0.1_JPRB ! max cloud supersat. +! LCONVERGED = .FALSE. +! NITERATIONS = 0 +! +! ZCF1 = 0.5_JPRB*SQRT(ZGROWTH(JL,JK)/(ZALPHA(JL,JK)*PW(JL,JK,JW))) +! ZCF2 = ZA(JL,JK)/3.0_JPRB +! ! When gamma is defined as a dimensionless coefficient as above, +! ! ZCF3 should include a division by the air density. +! ! See MN, Eq. 5. +! ! This is an error in NS (Eq. 32) and FN (Eq. 10). +! ! It is can be traced back to the definition of the rate of water condensation in NS, Eq. (11), +! ! where W is expressed in units kg(liquid water)/m3(air) instead of kg(liquid water)/kg(air). +! ! See also SP, Eqs. (17.73) and (17.79). +! ZCF3 = 0.5_JPRB*RPI*ZGAMMA(JL,JK)*PPRHO_WAT*ZGROWTH(JL,JK) & +! & /ZALPHA(JL,JK)/PW(JL,JK,JW)/PRHO(JL,JK) +! +! !DIR$ INLINE +! CALL SINTEGRAL_MN(ZA(JL,JK), ZALPHA(JL,JK), ZGAMMA(JL,JK), ZGROWTH(JL,JK), & +! & PW(JL,JK,JW), ZN(JL,JK,:), ZSM(JL,JK,:), ZSMAXTEMP1, & +! & ZMODECST1(:), ZMODECST2(:), ZMODECST3(:), ZMODECST4(:), & +! & ZMODECST5(:), ZINT1, ZINT2) +! ZVALUE1 = (ZINT1*ZCF1 + ZINT2*ZCF2) * ZCF3*ZSMAXTEMP1 - 1.0_JPRB +! +! !DIR$ INLINE +! CALL SINTEGRAL_MN(ZA(JL,JK), ZALPHA(JL,JK), ZGAMMA(JL,JK), ZGROWTH(JL,JK), & +! & PW(JL,JK,JW), ZN(JL,JK,:), ZSM(JL,JK,:), ZSMAXTEMP2, & +! & ZMODECST1(:), ZMODECST2(:), ZMODECST3(:), ZMODECST4(:), & +! & ZMODECST5(:), ZINT1, ZINT2) +! ZVALUE2 = (ZINT1*ZCF1 + ZINT2*ZCF2) * ZCF3*ZSMAXTEMP2 - 1.0_JPRB +! +! DO WHILE ((.NOT.LCONVERGED) .AND. NITERATIONS < NMAXITER) +! NITERATIONS = NITERATIONS + 1 +! +! ZSMAXTEMP3 = 0.5_JPRB*(ZSMAXTEMP1+ZSMAXTEMP2) +! !DIR$ INLINE +! CALL SINTEGRAL_MN(ZA(JL,JK), ZALPHA(JL,JK), ZGAMMA(JL,JK), ZGROWTH(JL,JK), & +! & PW(JL,JK,JW), ZN(JL,JK,:), ZSM(JL,JK,:), ZSMAXTEMP3, & +! & ZMODECST1(:), ZMODECST2(:), ZMODECST3(:), ZMODECST4(:), & +! & ZMODECST5(:), ZINT1, ZINT2) +! ZVALUE3 = (ZINT1*ZCF1 + ZINT2*ZCF2) * ZCF3*ZSMAXTEMP3 - 1.0_JPRB +! +! IF (SIGN(1.0_JPRB,ZVALUE1)*SIGN(1.0_JPRB,ZVALUE3) <= 0.0_JPRB) THEN +! ZVALUE2 = ZVALUE3 +! ZSMAXTEMP2 = ZSMAXTEMP3 +! ELSE +! ZVALUE1 = ZVALUE3 +! ZSMAXTEMP1 = ZSMAXTEMP3 +! END IF +! +! IF (ABS(ZSMAXTEMP2-ZSMAXTEMP1) <= 1.0E-5_JPRB*ZSMAXTEMP1) THEN +! +! ZSMAX(JL,JK,JW) = 0.5_JPRB*(ZSMAXTEMP1+ZSMAXTEMP2) +! LCONVERGED = .TRUE. +! +! ZNACT = 0._JPRB +! DO JMOD=2,NSOL +! IF (ZSM(JL,JK,JMOD) > ZEPS) THEN +! ZNACT = ZNACT + 0.5_JPRB*ZN(JL,JK,JMOD)*ERFC(2._JPRB*(LOG(ZSM(JL,JK,JMOD)/ZSMAX(JL,JK,JW)))/ZMODECST5(JMOD)) +! ENDIF +! END DO +! +! !---Sum up the total number of activated particles, weighted by the updraft PDF [m-3]: +! ZNACT_WSUM(JL,JK) = ZNACT_WSUM(JL,JK) + ZNACT*PWPDF(JL,JK,JW) +! +! ! Including the normalization here effectively means that conditions that don't yield a converged solution +! ! are discarded when calculating the mean CDNC over the updraft PDF. +! ZPDF_NORM(JL,JK) = ZPDF_NORM(JL,JK) + PWPDF(JL,JK,JW) +! +! END IF +! +! END DO ! do while +! +! IF (.NOT.LCONVERGED) THEN +! WRITE(NULOUT,*) 'WARNING: Morales and Nenes scheme not converged for updraft velocity ', PW(JL,JK,JW) +! ENDIF +! +! ELSE +! +! ! Set contribution to activation to zero when conditions are not met +! ZPDF_NORM(JL,JK) = ZPDF_NORM(JL,JK) + PWPDF(JL,JK,JW) +! +! END IF ! END IF safe wrt divide by 0, LOG(0)... +! END IF +! END DO !jl +! END DO !jk +! END DO +! +! DO JK=KTDIA,KLEV +! DO JL=KIDIA,KFDIA +! !---normalize the total number of activated particles over the PDF, and convert to [# cm-3] +! IF (LCLOUD(JL,JK) .AND. ZPDF_NORM(JL,JK) > ZEPS ) THEN +! PCDNC(JL,JK) = 1.E-6_JPRB * ZNACT_WSUM(JL,JK) / ZPDF_NORM(JL,JK) +! END IF +! END DO +! END DO +! +! IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.AER_ACTIV_MORALES_NENES',1,ZHOOK_HANDLE) +! +! END SUBROUTINE AER_ACTIV_MORALES_NENES + + +! SUBROUTINE SINTEGRAL_MN(PA, PALPHA, PGAMMA, PGROWTH, PW, PN, PSM, & +! PSMAX, PUP1, PF1, PUP2, PF2, PUPD, PINTEG1, PINTEG2) +! +! USE YOE_AERO_M7_DATA, ONLY: NSOL +! +! IMPLICIT NONE +! +! REAL(KIND=JPRB), INTENT(IN) :: PN(NSOL), PSM(NSOL) +! REAL(KIND=JPRB), INTENT(IN) :: PUP1(NSOL), PF1(NSOL), PUP2(NSOL), PF2(NSOL), PUPD(NSOL) +! REAL(KIND=JPRB), INTENT(IN) :: PA, PALPHA, PGAMMA, PGROWTH, PW, PSMAX +! REAL(KIND=JPRB), INTENT(OUT) :: PINTEG1, PINTEG2 +! +! REAL(KIND=JPRB) :: ZUPARTPLUS, ZUPARTMIN, ZUMAX +! +! REAL(KIND=JPRB) :: ZDELTA, ZRATIO, ZSPARTPLUS, ZSPARTMIN +! +! REAL(KIND=JPRB) :: XIC4, XIC4_EXP +! REAL(KIND=JPRB) :: PINTEG1_FACTOR, PINTEG1_MODE, PINTEG2_MODE +! +! REAL(KIND=JPRB) :: ZEPS +! +! ! Empirically derived exponent in MN, Eq. (14) +! REAL(KIND=JPRB), PARAMETER :: EXP_VALUE = -0.3824_JPRB +! +! INTEGER(KIND=JPIM) :: JMOD +! +! ! note: this subroutine is intended for inline compilation and therefore does not call dr_hook +! +! ZEPS=EPSILON(1._JPRB) +! +! ! xi_c to power 4 +! XIC4 = 16.0_JPRB*PALPHA*PW*(PA**2)/(9.0_JPRB*PGROWTH) +! ZDELTA = 1.0_JPRB - XIC4/PSMAX**4 +! +! IF (ZDELTA <= 0.0_JPRB) THEN +! ! MN, Eq. (14) +! XIC4_EXP = EXP_VALUE/4._JPRB +! ZRATIO = (2.0E7_JPRB/3.0_JPRB)*PA*(PSMAX**EXP_VALUE-XIC4**XIC4_EXP) + 1._JPRB/SQRT(2._JPRB) +! IF (ZRATIO > 1.0_JPRB) THEN +! ZRATIO = 1.0_JPRB +! END IF +! ZSPARTPLUS = PSMAX*ZRATIO +! ZSPARTMIN = ZSPARTPLUS +! ELSE +! ! MN, Eq. (10) +! ZSPARTPLUS = 0.5_JPRB*(1.0_JPRB + SQRT(ZDELTA)) +! ZSPARTPLUS = SQRT(ZSPARTPLUS)*PSMAX +! ZSPARTMIN = 0.5_JPRB*(1.0_JPRB - SQRT(ZDELTA)) +! ZSPARTMIN = SQRT(ZSPARTMIN)*PSMAX +! ENDIF +! +! !** Calculate integrals +! +! PINTEG1 = 0._JPRB +! PINTEG2 = 0._JPRB +! DO JMOD=2,NSOL +! IF ( PSM(JMOD) > ZEPS) THEN +! +! ! FN, Eq. (20); +! ! u_part for max root: +! ZUPARTPLUS = 2.0_JPRB*LOG(PSM(JMOD)/ZSPARTPLUS)/PUPD(JMOD) +! ! u_part for min root: +! ZUPARTMIN = 2.0_JPRB*LOG(PSM(JMOD)/ZSPARTMIN)/PUPD(JMOD) +! ! u_max: +! ZUMAX = 2.0_JPRB*LOG(PSM(JMOD)/PSMAX)/ PUPD(JMOD) +! +! ! The first integral describes the contribution from "population I" to I(0,smax), +! ! i.e. the term [I1(0,sp+) - I1(0,sp-)] in MN, Eq. (15). +! ! The integral I1 is given in FN, Eq. (18), +! ! but the factor 0.5 sqrt(G/aV) is not included here. +! IF (ZDELTA > 0.0_JPRB) THEN +! ! Contribution I1(0,sp+), +! ! i.e. the term between curly brackets in FN, Eq. (18) +! PINTEG1_FACTOR = 0.5_JPRB*(PSM(JMOD)/PSMAX)**2*PF1(JMOD) +! PINTEG1_MODE = ERFC(ZUPARTPLUS) - PINTEG1_FACTOR * ERFC(ZUPARTPLUS+PUP1(JMOD)) +! +! ! Subtract I1(0,sp1-): +! PINTEG1_MODE = PINTEG1_MODE - (ERFC(ZUPARTMIN) - PINTEG1_FACTOR * ERFC(ZUPARTMIN+PUP1(JMOD))) +! +! ! Include factor N_i * S_max from FN, Eq. (18): +! PINTEG1_MODE = PN(JMOD)*PSMAX*PINTEG1_MODE +! +! ! Add mode contribution +! PINTEG1 = PINTEG1 + PINTEG1_MODE +! ENDIF +! +! ! The second integral describes the contributions from populations II and III, +! ! i.e. the last and first terms in MN, Eq. (15). +! ! The two contributions are given by Eq. (19) of FN, +! ! but the factor A/3 is not included here. +! +! ! Contribution from population II, i.e. I2(sp+,s_max) +! PINTEG2_MODE = ERF(ZUPARTPLUS-PUP2(JMOD)) - ERF(ZUMAX-PUP2(JMOD)) +! +! ! Add contribution from population III, i.e. I2(0,sp-), +! ! which includes an additional factor 1/sqrt(3) +! PINTEG2_MODE = PINTEG2_MODE + (1._JPRB/SQRT(3._JPRB)) * ERFC(ZUPARTMIN-PUP2(JMOD)) +! +! ! Include prefactors in Eq. (19) of FN, but not the factor A/3. +! PINTEG2_MODE = PINTEG2_MODE*PF2(JMOD)*PN(JMOD)/PSM(JMOD) +! +! ! Add mode contribution +! PINTEG2 = PINTEG2 + PINTEG2_MODE +! ENDIF +! ENDDO +! +! END SUBROUTINE SINTEGRAL_MN + + + SUBROUTINE AER_ACTIV_MORALES_NENES_FULL(KIDIA, KFDIA, KTDIA, KLON, KLEV, LCLOUD, PT, PAP, PRHO, & + & PVERVEL, PSO4MASS, PBCMASS, POMMASS, PSSMASS, & + & PDUMASS,PNO3MASS, PMSAMASS, PAERONUM, PRDRY, PCDNC, PSMAX, PGEMU, PSIGMA_W) !, KFLDX, PEXTRA, PSLON, PGEMU) + + + ! *aer_activ_morales_nenes_full* calculates the number of activated aerosol + ! particles from the aerosol size-distribution, + ! composition and ambient supersaturation + ! + ! Author: + ! ------- + ! Twan van Noije, KNMI + ! Thanos Nenes, EPFL/FORTH + ! + ! References: + ! ----------- + ! Abdul-Razzak et al., JGR, 103, D6, 6123-6131, 1998 + ! Abdul-Razzak and Ghan, JGR, 105, D5, 6837-6844, 2000 (referred to as ARG) + ! Pruppbacher and Klett, Kluewer Ac. Pub., 1997 + ! Ghan et al., JAMES 3, M10001, 2011 + ! Nenes and Seinfeld, JGR, 108, D14, 4415, 2003 (referred to as NS) + ! Fountoukis and Nenes, JGR, 110, D11212, 2005 (referred to as FN) + ! Morales Betancourt and Nenes, GMD, 7, 2345-2357, 2014 (referred to as MN) + ! Kumar et al., ACP, 9, 2517-2532, 2009 + ! Seinfeld and Pandis, Atmospheric Chemistry and Physics, Second Edition (referred to as SP) + ! Morales and Nenes, JGR, D18220, 2010 + + USE YOMCST, ONLY: RG, RPI + USE YOMHOOK, ONLY: LHOOK, DR_HOOK + USE YOMLUN, ONLY: NULOUT + USE TM5M7_DATA, ONLY: NMOD, NSOL, DDUST, DNACL, & + & DOC, DBC, DH2SO4, DNA2SO4, DNH4NO3, DMSA, & + & NH4NO3_FACTOR, Kap_su,Kap_pom,Kap_soa, & + & Kap_bc,Kap_ss,Kap_du,Kap_na2so4,Kap_msa, & + & Kap_no3, WSO4, WH2SO4, WNACL, WNA2SO4, & + & WH2O, WDAIR + USE MO_HAM_M7CTL, ONLY: CMR2RAM, SIGMA, SIGMALN + ! USE YOE_AERO_M7_DATA, ONLY: NMOD, NSOL, SIGMA, SIGMALN, CMR2RAM, & + ! & DH2SO4, DBC, DOC, DNACL, DDUST, & + ! & DNA2SO4, DNH4NO3, DMSA, NH4NO3_FACTOR, & + ! & PPKAPPA_H2SO4, PPKAPPA_NACL, PPKAPPA_NA2SO4, & + ! & PPKAPPA_BC, PPKAPPA_OC, PPKAPPA_DU, & + ! & PPKAPPA_NH4NO3, PPKAPPA_MSA, & + ! & WSO4, WH2SO4, WNACL, WNA2SO4, & + ! & WH2O, WDAIR + + IMPLICIT NONE + + !---subroutine interface + INTEGER(KIND=JPIM), INTENT(IN) :: KIDIA + INTEGER(KIND=JPIM), INTENT(IN) :: KFDIA + INTEGER(KIND=JPIM), INTENT(IN) :: KTDIA + INTEGER(KIND=JPIM), INTENT(IN) :: KLON + INTEGER(KIND=JPIM), INTENT(IN) :: KLEV + !INTEGER(KIND=JPIM), INTENT(IN) :: KFLDX + + LOGICAL, INTENT(IN) :: LCLOUD(KLON,KLEV) + + REAL(KIND=JPRB), INTENT(IN) :: PT(KLON,KLEV) + REAL(KIND=JPRB), INTENT(IN) :: PAP(KLON,KLEV) + REAL(KIND=JPRB), INTENT(IN) :: PRHO(KLON,KLEV) + REAL(KIND=JPRB), INTENT(IN) :: PVERVEL(KLON,KLEV) + REAL(KIND=JPRB), INTENT(IN) :: PSO4MASS(KLON,KLEV,NSOL) ! [KG(SO4)/KG(AIR)] + REAL(KIND=JPRB), INTENT(IN) :: PBCMASS(KLON,KLEV,NSOL) ! [KG(BC)/KG(AIR)] + REAL(KIND=JPRB), INTENT(IN) :: POMMASS(KLON,KLEV,NSOL) ! [KG(OM)/KG(AIR)] + REAL(KIND=JPRB), INTENT(IN) :: PSSMASS(KLON,KLEV,NSOL) ! [KG(SS)/KG(AIR)] + REAL(KIND=JPRB), INTENT(IN) :: PDUMASS(KLON,KLEV,NSOL) ! [KG(DU)/KG(AIR)] + REAL(KIND=JPRB), INTENT(IN) :: PNO3MASS(KLON,KLEV) ! [KG(NO3)/KG(AIR)] + REAL(KIND=JPRB), INTENT(IN) :: PMSAMASS(KLON,KLEV) ! [KG(MSA)/KG(AIR)] + REAL(KIND=JPRB), INTENT(IN) :: PAERONUM(KLON,KLEV,NSOL) + REAL(KIND=JPRB), INTENT(IN) :: PRDRY(KLON,KLEV,NSOL) + !REAL(KIND=JPRB), INTENT(IN) :: PEXTRA(KLON,KLEV,KFLDX) + !REAL(KIND=JPRB), INTENT(IN) :: PSLON(KLON), PGEMU(KLON) + REAL(KIND=JPRB), INTENT(IN) :: PGEMU(KLON) + REAL(KIND=JPRB), INTENT(IN) :: PSIGMA_W(KLON,KLEV) !eehol: input sigma_w from outside [m/s] + + ! Output: + REAL(KIND=JPRB), INTENT(INOUT) :: PCDNC(KLON,KLEV) ! # cm-3 + REAL(KIND=JPRB), INTENT(INOUT) :: PSMAX(KLON,KLEV) ! maximum supersaturation in % + + !---local data + INTEGER(KIND=JPIM) :: JL, JK, JMOD, JW + + REAL(KIND=JPRB) :: ZN(KLON,KLEV,NSOL) ! aerosol number concentration for each mode [m-3] + ! with the mode number median radius + REAL(KIND=JPRB) :: ZVOL(KLON) ! total dry particle volume + REAL(KIND=JPRB) :: ZKAPPA(KLON,KLEV,NSOL) ! volume-weighted kappa + REAL(KIND=JPRB) :: ZWLARGE(KLON,KLEV) ! large-scale velocity (m/s) + !REAL(KIND=JPRB) :: PSMAX(KLON,KLEV) ! maximum supersaturation in % + + REAL(KIND=JPRB) :: ZSSMASS(KLON) ! Sea salt MMR + REAL(KIND=JPRB) :: ZDUMASS(KLON) ! Dust MMR + REAL(KIND=JPRB) :: ZNO3MASS(KLON) ! Nitrate MMR + REAL(KIND=JPRB) :: ZMSAMASS(KLON) ! MSA MMR + + REAL(KIND=JPRB) :: NSO4(KLON), NH2SO4(KLON) ! Particle numbers [kmol/kg air] + REAL(KIND=JPRB) :: NNACL(KLON), NNA(KLON), NCL(KLON), NNA2SO4(KLON) + + ! Miscellaneous + REAL(KIND=JPRB) :: ZEPS + REAL(KIND=JPRB) :: Z4PIOVER3 + REAL(KIND=JPRB) :: ZHOOK_HANDLE + + ! Variables to interface with Nenes routines + ! These are declared double precision as they are in those routines. + ! Can be changed to IFS style. + DOUBLE PRECISION TPI(NSOL-1), DPGI(NSOL-1), SIGI(NSOL-1), AKKI(NSOL-1), & + & TPARC, PPARC, WPARC, SG(NSOL-1), NACT, SMAX + + DOUBLE PRECISION, PARAMETER :: A = 2.25_JPRB ! Default FHH adsorption parameters (in the case of FHH-AT) + DOUBLE PRECISION, PARAMETER :: B = 1.20_JPRB ! See Kumar et al., (2011) ACP + DOUBLE PRECISION, PARAMETER :: ACCOM = 1.0_JPRB ! Accommodation coefficient + + ! Standard deviation of the updraft velocity distribution (m/s) + ! For the moment it is set to a constant value of 0.8 m/s, + ! as we did for the other activation schemes. + ! In reality it depends on turbulence characteristics. + ! Several parameterizations have been proposed + ! (see e.g., Hoose et al., 2010; Zheng et al., GRL, 2016) + ! A common approach is to use TKE or, alternatively, + ! the vertical diffusion coefficient + ! (see module VDIFLCZ in sinvect directory). + !DOUBLE PRECISION, PARAMETER :: SIGW = 0.6_JPRB + DOUBLE PRECISION SIGW !eehol: add sigma_w to not be a parameter but rather an input value + + ! Logical switch to use a single characteristic velocity + ! instead of Gauss-Legendre quadrature. + LOGICAL, PARAMETER :: CHAR_VELOCITY = .FALSE. + + INTEGER MODEI(NSOL-1) + + !--- executable procedure + IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.AER_ACTIV_MORALES_NENES_FULL',0,ZHOOK_HANDLE) + + !--- 0) Initializations: + + !PCDNC(KIDIA:KFDIA,KTDIA:KLEV) = 10._JPRB + PSMAX(KIDIA:KFDIA,KTDIA:KLEV) = 0._JPRB + + ZEPS=EPSILON(1._JPRB) + + ZWLARGE(KIDIA:KFDIA,KTDIA:KLEV) = -1._JPRB* PVERVEL(KIDIA:KFDIA,KTDIA:KLEV) / & + & (RG*PRHO(KIDIA:KFDIA,KTDIA:KLEV)) + + !---miscellaneous + Z4PIOVER3 = 4._JPRB*RPI/3._JPRB + + !---per-mode calculations: + ! soluble mode number and critical supersaturation, ignore nucleation mode (mode 1) + DO JMOD=2, NSOL + DO JK=KTDIA,KLEV + DO JL=KIDIA,KFDIA + IF (LCLOUD(JL,JK)) THEN + + !---total volume per mode [m-3 / kg(air)], used for kappa calculation + ZVOL(JL) = Z4PIOVER3 * PAERONUM(JL,JK,JMOD) * & + & (CMR2RAM(JMOD)*PRDRY(JL,JK,JMOD))**3 + + !--- Number per unit volume [# m-3] for each mode: + ZN(JL,JK,JMOD) = PAERONUM(JL,JK,JMOD)*PRHO(JL,JK) + + !---sea salt and dust do not exist in mode 2: + ZSSMASS(JL) = MERGE(0._JPRB, PSSMASS(JL,JK,JMOD), JMOD==2) + ZDUMASS(JL) = MERGE(0._JPRB, PDUMASS(JL,JK,JMOD), JMOD==2) + + !---ammonium-nitrate and MSA do not exit in mode 2 and 4: + ZNO3MASS(JL) = MERGE(0._JPRB, PNO3MASS(JL,JK), JMOD==2 .OR. JMOD==4) + ZMSAMASS(JL) = MERGE(0._JPRB, PMSAMASS(JL,JK), JMOD==2 .OR. JMOD==4) + + NNA(JL) = ZSSMASS(JL) / WNACL + NCL(JL) = NNA(JL) + NSO4(JL) = PSO4MASS(JL,JK,JMOD) / WSO4 + NNA2SO4(JL) = MIN(NNA(JL)/2._JPRB, NSO4(JL)) + NNA(JL) = NNA(JL) - 2._JPRB*NNA2SO4(JL) + NNACL(JL) = MIN(NCL(JL), NNA(JL)) + NCL(JL) = NNACL(JL) + NH2SO4(JL) = NSO4(JL) - NNA2SO4(JL) + + IF (ZVOL(JL) .GE. ZEPS) THEN !eehol: total volume per mode need to be above treshold to avoid div by zero + !---mode kappa = volume-weighted sum of component kappa's + ZKAPPA(JL,JK,JMOD) = ( (Kap_ss * NNACL(JL) * WNACL / (DNACL*1.E3_JPRB)) + & + & (Kap_na2so4 * NNA2SO4(JL) * WNA2SO4 / (DNA2SO4*1.E3_JPRB)) + & + & (Kap_su * NH2SO4(JL) * WH2SO4 / (DH2SO4*1.E3_JPRB)) + & + & (Kap_bc * PBCMASS(JL,JK,JMOD) / (DBC*1.E3_JPRB)) + & + & (Kap_pom * POMMASS(JL,JK,JMOD) / (DOC*1.E3_JPRB)) + & + & (Kap_du * ZDUMASS(JL) / (DDUST*1.E3_JPRB)) + & + & (Kap_no3 * ZNO3MASS(JL) * NH4NO3_FACTOR / (DNH4NO3*1.E3_JPRB)) + & + & (Kap_msa * ZMSAMASS(JL) / (DMSA*1.E3_JPRB)) ) / & + & ZVOL(JL) + + !---defensive step: minimum kappa to avoid divide by zero errors + ZKAPPA(JL,JK,JMOD) = MERGE(ZKAPPA(JL,JK,JMOD), 0.04_JPRB, ZKAPPA(JL,JK,JMOD) > 0.04_JPRB ) + ZKAPPA(JL,JK,JMOD)=MIN(ZKAPPA(JL,JK,JMOD),1.2) + ELSE !eehol: if total volume per mode is too small, use minimum kappa + ZKAPPA(JL,JK,JMOD)=0.04_JPRB + END IF + END IF !eehol: LCLOUD + END DO + END DO + END DO + + !--- 2) Calculate maximum supersaturation and cloud droplet number concentration, + ! averaged over the updraft velocity PDF + + DO JK=KTDIA, KLEV + DO JL=KIDIA,KFDIA + IF (LCLOUD(JL,JK)) THEN + + DO JMOD=2,NSOL + !Shift mode index + MODEI(JMOD-1) = 1 ! Kohler mode + TPI(JMOD-1) = PAERONUM(JL,JK,JMOD) * PRHO(JL,JK) ! Number concentration (#/m3) + DPGI(JMOD-1) = 2._JPRB * PRDRY(JL,JK,JMOD) ! Modal diameter (m) + SIGI(JMOD-1) = SIGMA(JMOD) ! Geometric dispersion (sigma_g) + AKKI(JMOD-1) = ZKAPPA(JL,JK,JMOD) ! Hygroscopicity parameter (kappa) + END DO + TPARC = PT(JL,JK) ! Temperature (K) + PPARC = PAP(JL,JK) ! Pressure (Pa) + + IF ( ANY(TPI(:) .GE. ZEPS) .AND. ANY(DPGI(:) .GE. 1e-9_JPRB) .AND. TPARC.GE.(273.15_JPRB-35.0_JPRB) ) THEN !eehol: any num con, diam and temperature need to be over treshold + ! Convert aerosol data into CCN + CALL CCNSPEC (TPI,DPGI,SIGI,MODEI,TPARC,PPARC,NSOL-1,AKKI,A,B,SG) + + ! xxx To be done: + ! Save CCN spectra for supersaturations: + ! S = 0.05, 0.1, 0.2, 0.3, 0.5, 1.0 % + ! New routine needs as input TPI, SG, S and returns CCN(S) + ! which needs to be put into the output as 6 3-D fields + + !eehol: give sigma_w a value depending on the input variable + SIGW = MAX(0.1_JPRB,PSIGMA_W(JL,JK)) !treshold sigma to min value + + IF ( ZWLARGE(JL,JK).GE.ZEPS ) THEN + ! Calculate activated droplet number + IF (CHAR_VELOCITY) THEN + ! Use characteristic updraft velocity (m/s) + ! from Morales and Nenes (2010) + WPARC = 0.79*SIGW + ! Call activation for a single velocity + ! equal to the characteristic velocity + CALL PDFACTIV (WPARC,TPI,AKKI,A,B,ACCOM,SG,0.d0,TPARC,PPARC,NACT,SMAX) + ELSE + ! Call activation for velocity PDF (SIGW is non-zero) + ! with WPARC set equal to the large-scale velocity (m/s) + WPARC = ZWLARGE(JL,JK) + CALL PDFACTIV (WPARC,TPI,AKKI,A,B,ACCOM,SG,SIGW,TPARC,PPARC,NACT,SMAX) + + ENDIF + + ! convert CDNC to # cm-3 + PCDNC(JL,JK) = 1.E-6_JPRB * NACT + + ! convert Smax to % + PSMAX(JL,JK) = 100._JPRB * SMAX + END IF + END IF + END IF ! LCLOUD + END DO !jl + END DO !jk + + IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.AER_ACTIV_MORALES_NENES_FULL',1,ZHOOK_HANDLE) + + END SUBROUTINE AER_ACTIV_MORALES_NENES_FULL + +! SUBROUTINE AER_ACTIV_MORALES_NENES_FULL_OLDPDF(KIDIA, KFDIA, KTDIA, KLON, KLEV, KPDF, LCLOUD, PT, PAP, PRHO, & +! & PW, PWPDF, PSO4MASS, PBCMASS, POMMASS, PSSMASS, & +! & PDUMASS,PNO3MASS, PMSAMASS, PAERONUM, PRDRY, PCDNC, KFLDX, PEXTRA, PSLON, PGEMU) +! +! +! ! *aer_activ_morales_nenes_full_oldpdf* calculates the number of activated aerosol +! ! particles from the aerosol size-distribution, +! ! composition and ambient supersaturation +! ! +! ! Author: +! ! ------- +! ! Twan van Noije, KNMI +! ! Thanos Nenes, EPFL/FORTH +! ! +! ! References: +! ! ----------- +! ! Abdul-Razzak et al., JGR, 103, D6, 6123-6131, 1998 +! ! Abdul-Razzak and Ghan, JGR, 105, D5, 6837-6844, 2000 (referred to as ARG) +! ! Pruppbacher and Klett, Kluewer Ac. Pub., 1997 +! ! Ghan et al., JAMES 3, M10001, 2011 +! ! Nenes and Seinfeld, JGR, 108, D14, 4415, 2003 (referred to as NS) +! ! Fountoukis and Nenes, JGR, 110, D11212, 2005 (referred to as FN) +! ! Morales Betancourt and Nenes, GMD, 7, 2345-2357, 2014 (referred to as MN) +! ! Kumar et al., ACP, 9, 2517-2532, 2009 +! ! Seinfeld and Pandis, Atmospheric Chemistry and Physics, Second Edition (referred to as SP) +! ! Morales and Nenes, JGR, D18220, 2010 +! +! USE YOMCST, ONLY: RG, RPI +! USE YOMHOOK, ONLY: LHOOK, DR_HOOK +! USE YOMLUN, ONLY: NULOUT +! USE YOE_AERO_M7_DATA, ONLY: NMOD, NSOL, SIGMA, SIGMALN, CMR2RAM, & +! & DH2SO4, DBC, DOC, DNACL, DDUST, & +! & DNA2SO4, DNH4NO3, DMSA, NH4NO3_FACTOR, & +! & PPKAPPA_H2SO4, PPKAPPA_NACL, PPKAPPA_NA2SO4, & +! & PPKAPPA_BC, PPKAPPA_OC, PPKAPPA_DU, & +! & PPKAPPA_NH4NO3, PPKAPPA_MSA, & +! & WSO4, WH2SO4, WNACL, WNA2SO4, & +! & WH2O, WDAIR +! +! IMPLICIT NONE +! +! !---subroutine interface +! INTEGER(KIND=JPIM), INTENT(IN) :: KIDIA +! INTEGER(KIND=JPIM), INTENT(IN) :: KFDIA +! INTEGER(KIND=JPIM), INTENT(IN) :: KTDIA +! INTEGER(KIND=JPIM), INTENT(IN) :: KLON +! INTEGER(KIND=JPIM), INTENT(IN) :: KLEV +! INTEGER(KIND=JPIM), INTENT(IN) :: KPDF +! INTEGER(KIND=JPIM), INTENT(IN) :: KFLDX +! +! LOGICAL, INTENT(IN) :: LCLOUD(KLON,KLEV) +! +! REAL(KIND=JPRB), INTENT(IN) :: PT(KLON,KLEV) +! REAL(KIND=JPRB), INTENT(IN) :: PAP(KLON,KLEV) +! REAL(KIND=JPRB), INTENT(IN) :: PRHO(KLON,KLEV) +! REAL(KIND=JPRB), INTENT(IN) :: PW(KLON,KLEV,KPDF) +! REAL(KIND=JPRB), INTENT(IN) :: PWPDF(KLON,KLEV,KPDF) +! REAL(KIND=JPRB), INTENT(IN) :: PSO4MASS(KLON,KLEV,NSOL) ! [KG(SO4)/KG(AIR)] +! REAL(KIND=JPRB), INTENT(IN) :: PBCMASS(KLON,KLEV,NSOL) ! [KG(BC)/KG(AIR)] +! REAL(KIND=JPRB), INTENT(IN) :: POMMASS(KLON,KLEV,NSOL) ! [KG(OM)/KG(AIR)] +! REAL(KIND=JPRB), INTENT(IN) :: PSSMASS(KLON,KLEV,NSOL) ! [KG(SS)/KG(AIR)] +! REAL(KIND=JPRB), INTENT(IN) :: PDUMASS(KLON,KLEV,NSOL) ! [KG(DU)/KG(AIR)] +! REAL(KIND=JPRB), INTENT(IN) :: PNO3MASS(KLON,KLEV) ! [KG(NO3)/KG(AIR)] +! REAL(KIND=JPRB), INTENT(IN) :: PMSAMASS(KLON,KLEV) ! [KG(MSA)/KG(AIR)] +! REAL(KIND=JPRB), INTENT(IN) :: PAERONUM(KLON,KLEV,NSOL) +! REAL(KIND=JPRB), INTENT(IN) :: PRDRY(KLON,KLEV,NSOL) +! REAL(KIND=JPRB), INTENT(IN) :: PEXTRA(KLON,KLEV,KFLDX) +! REAL(KIND=JPRB), INTENT(IN) :: PSLON(KLON), PGEMU(KLON) +! +! ! Output: +! REAL(KIND=JPRB), INTENT(OUT) :: PCDNC(KLON,KLEV) ! # cm-3 +! !REAL(KIND=JPRB), INTENT(OUT) :: PSMAX(KLON,KLEV) ! maximum supersaturation in % +! +! !---local data +! INTEGER(KIND=JPIM) :: JL, JK, JMOD, JW +! +! REAL(KIND=JPRB) :: ZN(KLON,KLEV,NSOL) ! aerosol number concentration for each mode [m-3] +! ! with the mode number median radius +! REAL(KIND=JPRB) :: ZVOL(KLON) ! total dry particle volume +! REAL(KIND=JPRB) :: ZKAPPA(KLON,KLEV,NSOL) ! volume-weighted kappa +! REAL(KIND=JPRB) :: ZWLARGE(KLON,KLEV) ! large-scale velocity (m/s) +! REAL(KIND=JPRB) :: PSMAX(KLON,KLEV) ! maximum supersaturation in % +! +! REAL(KIND=JPRB) :: ZNACT_WSUM(KLON,KLEV) ! Weighted sum of activated number concentration +! REAL(KIND=JPRB) :: ZSMAX_WSUM(KLON,KLEV) ! Weighted sum of Smax +! REAL(KIND=JPRB) :: ZPDF_NORM(KLON,KLEV) ! Normalization factor for ZNACT_WSUM +! +! REAL(KIND=JPRB) :: ZSSMASS(KLON) ! Sea salt MMR +! REAL(KIND=JPRB) :: ZDUMASS(KLON) ! Dust MMR +! REAL(KIND=JPRB) :: ZNO3MASS(KLON) ! Nitrate MMR +! REAL(KIND=JPRB) :: ZMSAMASS(KLON) ! MSA MMR +! +! REAL(KIND=JPRB) :: NSO4(KLON), NH2SO4(KLON) ! Particle numbers [kmol/kg air] +! REAL(KIND=JPRB) :: NNACL(KLON), NNA(KLON), NCL(KLON), NNA2SO4(KLON) +! +! ! Miscellaneous +! REAL(KIND=JPRB) :: ZEPS +! REAL(KIND=JPRB) :: Z4PIOVER3 +! REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +! ! Variables to interface with Nenes routines +! ! These are declared double precision as they are in those routines. +! ! Can be changed to IFS style. +! DOUBLE PRECISION TPI(NSOL-1), DPGI(NSOL-1), SIGI(NSOL-1), AKKI(NSOL-1), & +! & TPARC, PPARC, WPARC, SG(NSOL-1), NACT, SMAX +! +! DOUBLE PRECISION, PARAMETER :: A = 2.25_JPRB ! Default FHH adsorption parameters (in the case of FHH-AT) +! DOUBLE PRECISION, PARAMETER :: B = 1.20_JPRB ! See Kumar et al., (2011) ACP +! DOUBLE PRECISION, PARAMETER :: ACCOM = 1.0_JPRB ! Accommodation coefficient +! +! INTEGER MODEI(NSOL-1) +! +! !--- executable procedure +! IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.AER_ACTIV_MORALES_NENES_FULL_OLDPDF',0,ZHOOK_HANDLE) +! +! !--- 0) Initializations: +! +! ZNACT_WSUM(KIDIA:KFDIA,KTDIA:KLEV) = 0._JPRB +! ZSMAX_WSUM(KIDIA:KFDIA,KTDIA:KLEV) = 0._JPRB +! ZPDF_NORM(KIDIA:KFDIA,KTDIA:KLEV) = 0._JPRB +! PCDNC(KIDIA:KFDIA,KTDIA:KLEV) = 0._JPRB +! PSMAX(KIDIA:KFDIA,KTDIA:KLEV) = 0._JPRB +! +! ZEPS=EPSILON(1._JPRB) +! +! !---miscellaneous +! Z4PIOVER3 = 4._JPRB*RPI/3._JPRB +! +! !---per-mode calculations: +! ! soluble mode number and critical supersaturation, ignore nucleation mode (mode 1) +! DO JMOD=2, NSOL +! DO JK=KTDIA,KLEV +! DO JL=KIDIA,KFDIA +! IF (LCLOUD(JL,JK)) THEN +! +! !---total volume per mode [m-3 / kg(air)], used for kappa calculation +! ZVOL(JL) = Z4PIOVER3 * PAERONUM(JL,JK,JMOD) * & +! & (CMR2RAM(JMOD)*PRDRY(JL,JK,JMOD))**3 +! +! !--- Number per unit volume [# m-3] for each mode: +! ZN(JL,JK,JMOD) = PAERONUM(JL,JK,JMOD)*PRHO(JL,JK) +! +! !---sea salt and dust do not exist in mode 2: +! ZSSMASS(JL) = MERGE(0._JPRB, PSSMASS(JL,JK,JMOD), JMOD==2) +! ZDUMASS(JL) = MERGE(0._JPRB, PDUMASS(JL,JK,JMOD), JMOD==2) +! +! !---ammonium-nitrate and MSA do not exit in mode 2 and 4: +! ZNO3MASS(JL) = MERGE(0._JPRB, PNO3MASS(JL,JK), JMOD==2 .OR. JMOD==4) +! ZMSAMASS(JL) = MERGE(0._JPRB, PMSAMASS(JL,JK), JMOD==2 .OR. JMOD==4) +! +! NNA(JL) = ZSSMASS(JL) / WNACL +! NCL(JL) = NNA(JL) +! NSO4(JL) = PSO4MASS(JL,JK,JMOD) / WSO4 +! NNA2SO4(JL) = MIN(NNA(JL)/2._JPRB, NSO4(JL)) +! NNA(JL) = NNA(JL) - 2._JPRB*NNA2SO4(JL) +! NNACL(JL) = MIN(NCL(JL), NNA(JL)) +! NCL(JL) = NNACL(JL) +! NH2SO4(JL) = NSO4(JL) - NNA2SO4(JL) +! +! !---mode kappa = volume-weighted sum of component kappa's +! ZKAPPA(JL,JK,JMOD) = ( (PPKAPPA_NACL * NNACL(JL) * WNACL / (DNACL*1.E3_JPRB)) + & +! & (PPKAPPA_NA2SO4 * NNA2SO4(JL) * WNA2SO4 / (DNA2SO4*1.E3_JPRB)) + & +! & (PPKAPPA_H2SO4 * NH2SO4(JL) * WH2SO4 / (DH2SO4*1.E3_JPRB)) + & +! & (PPKAPPA_BC * PBCMASS(JL,JK,JMOD) / (DBC*1.E3_JPRB)) + & +! & (PPKAPPA_OC * POMMASS(JL,JK,JMOD) / (DOC*1.E3_JPRB)) + & +! & (PPKAPPA_DU * ZDUMASS(JL) / (DDUST*1.E3_JPRB)) + & +! & (PPKAPPA_NH4NO3 * ZNO3MASS(JL) * NH4NO3_FACTOR / (DNH4NO3*1.E3_JPRB)) + & +! & (PPKAPPA_MSA * ZMSAMASS(JL) / (DMSA*1.E3_JPRB)) ) / & +! & ZVOL(JL) +! +! !---defensive step: minimum kappa to avoid divide by zero errors +! ZKAPPA(JL,JK,JMOD) = MERGE(ZKAPPA(JL,JK,JMOD), 0.04_JPRB, ZKAPPA(JL,JK,JMOD) > 0.04_JPRB ) +! +! END IF +! END DO +! END DO +! END DO +! +! !--- 2) Calculate maximum supersaturation and cloud droplet number concentration, +! ! averaged over the updraft velocity PDF +! +! DO JW=1,KPDF +! DO JK=KTDIA, KLEV +! DO JL=KIDIA,KFDIA +! IF (LCLOUD(JL,JK)) THEN +! +! DO JMOD=2,NSOL +! !Shift mode index +! MODEI(JMOD-1) = 1 ! Kohler mode +! TPI(JMOD-1) = PAERONUM(JL,JK,JMOD) * PRHO(JL,JK) ! Number concentration (#/m3) +! DPGI(JMOD-1) = 2._JPRB * PRDRY(JL,JK,JMOD) ! Modal diameter (m) +! SIGI(JMOD-1) = SIGMA(JMOD) ! Geometric dispersion (sigma_g) +! AKKI(JMOD-1) = ZKAPPA(JL,JK,JMOD) ! Hygroscopicity parameter (kappa) +! END DO +! TPARC = PT(JL,JK) ! Temperature (K) +! PPARC = PAP(JL,JK) ! Pressure (Pa) +! +! ! Convert aerosol data into CCN +! CALL CCNSPEC (TPI,DPGI,SIGI,MODEI,TPARC,PPARC,NSOL-1,AKKI,A,B,SG) +! +! ! xxx To be done: +! ! Save CCN spectra for supersaturations: +! ! S = 0.05, 0.1, 0.2, 0.3, 0.5, 1.0 % +! ! New routine needs as input TPI, SG, S and returns CCN(S) +! ! which needs to be put into the output as 6 3-D fields +! +! ! Set WPARC to the updraft vertical velocity (m/s) +! WPARC = PW(JL,JK,JW) +! ! Call activation for a single velocity value: +! CALL PDFACTIV (WPARC,TPI,AKKI,A,B,ACCOM,SG,0.d0,TPARC,PPARC, NACT, SMAX) +! +! !IF(JW==5 .AND. PSLON(JL)>0.17 .AND. PSLON(JL)<0.19 .AND. PGEMU(JL)>0.76 .AND. PGEMU(JL)<0.78) THEN +! ! open(unit=666, file='parame', access='append', status='unknown') +! ! write(666,*) modei, tpi, dpgi, sigi, akki, tparc, pparc, wparc, accom, sigw, sg, nact, smax +! ! close(666) +! !ENDIF +! +! !IF(JW==5 .AND. PSLON(JL)>-0.35 .AND. PSLON(JL)<-0.33 .AND. PGEMU(JL)>0.76 .AND. PGEMU(JL)<0.78) THEN +! ! open(unit=666, file='paramp', access='append', status='unknown') +! ! write(666,*) modei, tpi, dpgi, sigi, akki, tparc, pparc, wparc, accom, sigw, sg, nact, smax +! ! close(666) +! !ENDIF +! +! !---Sum up the total number of activated particles, weighted by the updraft PDF [m-3]: +! ZNACT_WSUM(JL,JK) = ZNACT_WSUM(JL,JK) + NACT*PWPDF(JL,JK,JW) +! ZSMAX_WSUM(JL,JK) = ZSMAX_WSUM(JL,JK) + SMAX*PWPDF(JL,JK,JW) +! +! ZPDF_NORM(JL,JK) = ZPDF_NORM(JL,JK) + PWPDF(JL,JK,JW) +! +! END IF ! LCLOUD +! END DO !jl +! END DO !jk +! END DO ! PDF +! +! DO JK=KTDIA,KLEV +! DO JL=KIDIA,KFDIA +! !---normalize over the PDF +! IF (LCLOUD(JL,JK) .AND. ZPDF_NORM(JL,JK) > ZEPS ) THEN +! ! convert CDNC to # cm-3 +! PCDNC(JL,JK) = 1.E-6_JPRB * ZNACT_WSUM(JL,JK) / ZPDF_NORM(JL,JK) +! +! ! convert Smax to % +! PSMAX(JL,JK) = 100._JPRB * ZSMAX_WSUM(JL,JK) / ZPDF_NORM(JL,JK) +! END IF +! END DO +! END DO +! +! IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.AER_ACTIV_MORALES_NENES_FULL_OLDPDF',1,ZHOOK_HANDLE) +! +! END SUBROUTINE AER_ACTIV_MORALES_NENES_FULL_OLDPDF + + +! SUBROUTINE AER_ACTIV_ABDULRAZZAK_GHAN (KIDIA, KFDIA, KTDIA, KLON, KLEV, KPDF, LCLOUD, PT, PAP, PRHO, & +! & PQ, PW, PWPDF, PSO4MASS, PBCMASS, POMMASS, PSSMASS, & +! & PDUMASS, PNO3MASS, PMSAMASS, PAERONUM, PRDRY, PCDNC, KFLDX, PEXTRA) +! +! +! ! *aer_activ_abdulrazzak_ghan* calculates the number of activated aerosol +! ! particles from the aerosol size-distribution, +! ! composition and ambient supersaturation +! ! +! ! Author: +! ! ------- +! ! Philip Stier, MPI-MET, University of Oxford 2002-2009 +! ! +! ! Method: +! ! ------- +! ! The calculation of the activation can be reduced to 3 tasks: +! ! +! ! I) Calculate the maximum supersaturation +! ! II) Calculate the corresponding radius of activation +! ! for each mode +! ! III) Calculate the number of particles that are larger +! ! then the radius of activation for each mode. +! ! +! ! III) Calculation of the number of activated particles: +! ! See the routine ham_logtail below. +! ! +! ! The calculations are now performed separately for +! ! stratiform and convective updraft velocities. +! ! +! ! References: +! ! ----------- +! ! Abdul-Razzak et al., JGR, 103, D6, 6123-6131, 1998. +! ! Abdul-Razzak and Ghan, JGR, 105, D5, 6837-6844, 2000. +! ! Pruppbacher and Klett, Kluewer Ac. Pub., 1997. +! ! Ghan et al., JAMES 3, M10001, 2011 +! +! !---inherited functions, types, variables and constants +! USE YOMCST, ONLY: RPI, R, RCPD, RG, RMD, RV, RTT, RLVTT, RLSTT, RMD, RMV +! USE YOECLDP, ONLY: RTHOMO, PPRHO_WAT, LACI_DIAG +! USE YOMHOOK, ONLY: LHOOK, DR_HOOK +! USE YOE_AERO_M7_DATA, ONLY: NSOL, SIGMALN, CMR2RAM, & +! & PPKAPPA_H2SO4, PPKAPPA_NACL, PPKAPPA_NA2SO4, & +! & PPKAPPA_BC, PPKAPPA_OC, PPKAPPA_DU, & +! & PPKAPPA_NH4NO3, PPKAPPA_MSA, & +! & DH2SO4, DNACL, DNA2SO4, & +! & DBC, DOC, DDUST, & +! & DNH4NO3, DMSA, NH4NO3_FACTOR, & +! & WSO4, WH2SO4, WNACL, WNA2SO4 +! USE YOETHF , ONLY : R2ES ,R3LES ,R3IES ,R4LES ,& +! & R4IES ,R5LES ,R5IES ,R5ALVCP ,R5ALSCP ,& +! & RALVDCP ,RALSDCP ,RTWAT ,& +! & RTICE ,RTICECU ,& +! & RTWAT_RTICE_R ,RTWAT_RTICECU_R,& +! & RKOOP1 ,RKOOP2 +! +! IMPLICIT NONE +! +! !---included functions from header files +!#include "fcttre.h" +! +! !---subroutine interface +! INTEGER(KIND=JPIM), INTENT(IN) :: KIDIA +! INTEGER(KIND=JPIM), INTENT(IN) :: KFDIA +! INTEGER(KIND=JPIM), INTENT(IN) :: KTDIA +! INTEGER(KIND=JPIM), INTENT(IN) :: KLON +! INTEGER(KIND=JPIM), INTENT(IN) :: KLEV +! INTEGER(KIND=JPIM), INTENT(IN) :: KPDF +! INTEGER(KIND=JPIM), INTENT(IN) :: KFLDX +! +! LOGICAL, INTENT(IN) :: LCLOUD(KLON,KLEV) +! +! REAL(KIND=JPRB), INTENT(IN) :: PT(KLON,KLEV) +! REAL(KIND=JPRB), INTENT(IN) :: PAP(KLON,KLEV) +! REAL(KIND=JPRB), INTENT(IN) :: PRHO(KLON,KLEV) +! REAL(KIND=JPRB), INTENT(IN) :: PQ(KLON,KLEV) +! REAL(KIND=JPRB), INTENT(IN) :: PW(KLON,KLEV,KPDF) +! REAL(KIND=JPRB), INTENT(IN) :: PWPDF(KLON,KLEV,KPDF) +! REAL(KIND=JPRB), INTENT(IN) :: PSO4MASS(KLON,KLEV,NSOL) ! [KG(SO4)/KG(AIR)] +! REAL(KIND=JPRB), INTENT(IN) :: PBCMASS(KLON,KLEV,NSOL) ! [KG(BC)/KG(AIR)] +! REAL(KIND=JPRB), INTENT(IN) :: POMMASS(KLON,KLEV,NSOL) ! [KG(OM)/KG(AIR)] +! REAL(KIND=JPRB), INTENT(IN) :: PSSMASS(KLON,KLEV,NSOL) ! [KG(SS)/KG(AIR)] +! REAL(KIND=JPRB), INTENT(IN) :: PDUMASS(KLON,KLEV,NSOL) ! [KG(DU)/KG(AIR)] +! REAL(KIND=JPRB), INTENT(IN) :: PNO3MASS(KLON,KLEV) ! [KG(NO3)/KG(AIR)] +! REAL(KIND=JPRB), INTENT(IN) :: PMSAMASS(KLON,KLEV) ! [KG(MSA)/KG(AIR)] +! REAL(KIND=JPRB), INTENT(IN) :: PAERONUM(KLON,KLEV,NSOL) +! REAL(KIND=JPRB), INTENT(IN) :: PRDRY(KLON,KLEV,NSOL) +! +! ! Output: +! REAL(KIND=JPRB), INTENT(INOUT) :: PCDNC(KLON,KLEV) +! REAL(KIND=JPRB), INTENT(INOUT) :: PEXTRA(KLON,KLEV,KFLDX) +! +! !---local data +! INTEGER(KIND=JPIM) :: JL, JK, JMOD, JW +! +! REAL(KIND=JPRB) :: ZRC ! critical radius of a dry aerosol particle that becomes +! ! activated at the ambient supersaturation +! REAL(KIND=JPRB) :: ZN(KLON,KLEV,NSOL) ! aerosol number concentration for each mode [m-3] +! REAL(KIND=JPRB) :: ZSM(KLON,KLEV,NSOL) ! critical supersaturation for activating particles +! ! with the mode number median radius +! REAL(KIND=JPRB) :: ZVOL(KLON ) ! total dry particle volume per mode +! REAL(KIND=JPRB) :: ZKAPPA(KLON) ! volume-weighted kappa per mode +! REAL(KIND=JPRB) :: ZSMAX(KLON,KLEV,KPDF) ! maximum supersaturation +! +! REAL(KIND=JPRB) :: ZKELV(KLON,KLEV) ! Kelvin term +! REAL(KIND=JPRB) :: ZESW(KLON,KLEV) ! saturation vapour pressure +! REAL(KIND=JPRB) :: ZDIF(KLON,KLEV) ! diffusivity of air +! REAL(KIND=JPRB) :: ZALPHA(KLON,KLEV) ! Intermediate term in supersaturation calulation +! REAL(KIND=JPRB) :: ZGAMMA(KLON,KLEV) ! Intermediate term in supersaturation calulation +! REAL(KIND=JPRB) :: ZSUM(KLON,KLEV,KPDF) ! Intermediate term in supersaturation calulation +! REAL(KIND=JPRB) :: ZGROWTH(KLON,KLEV,NSOL) ! Growth due to vapour condensation +! REAL(KIND=JPRB) :: ZFRACN_TOP(KLON,KLEV,NSOL) +! REAL(KIND=JPRB) :: ZFRACN_BOT(KLON,KLEV,NSOL) +! +! REAL(KIND=JPRB) :: ZAMW ! molecular weight of water [kg mol-1] +! REAL(KIND=JPRB) :: ZAMD ! molecular weight of dry air [kg mol-1] +! +! REAL(KIND=JPRB) :: ZFRACN ! fraction of aerosol number activated for each mode +! REAL(KIND=JPRB) :: ZF(NSOL), ZG(NSOL) ! aerosol mode attributes, see AR&G +! REAL(KIND=JPRB) :: ZKA(KLON), ZKV(KLON) ! thermal conductivity of dry air/water vapour +! REAL(KIND=JPRB) :: ZK(KLON,KLEV) ! thermal conductivity of moist air +! REAL(KIND=JPRB) :: ZSQTERM(KLON) ! Intermediate terms in supersaturation calulation +! REAL(KIND=JPRB) :: ZXV, ZXI, ZETA ! Intermediate terms in supersaturation calulation +! REAL(KIND=JPRB) :: ZDIFMOD(KLON) ! Modified diffusion coefficient +! REAL(KIND=JPRB) :: ZKMOD(KLON) ! Intermediate terms in supersaturation calulation +! REAL(KIND=JPRB) :: ZT ! Intermediate term in activation calulation +! REAL(KIND=JPRB) :: ZTERM1(KLON) ! Intermediate term in activation calulation +! REAL(KIND=JPRB) :: ZTERM2(KLON) ! Intermediate term in activation calulation +! REAL(KIND=JPRB) :: ZTERM3(KLON) ! Intermediate term in activation calulation +! REAL(KIND=JPRB) :: ZSSMASS(KLON) ! Sea salt MMR +! REAL(KIND=JPRB) :: ZDUMASS (KLON) ! Dust MMR +! REAL(KIND=JPRB) :: ZNO3MASS(KLON) ! Nitrate MMR +! REAL(KIND=JPRB) :: ZMSAMASS(KLON) ! MSA MMR +! +! REAL(KIND=JPRB) :: NSO4(KLON), NH2SO4(KLON)! Particle numbers [kmol/kg air] +! REAL(KIND=JPRB) :: NNACL(KLON), NNA(KLON), NCL(KLON), NNA2SO4(KLON) +! +! REAL(KIND=JPRB) :: ZEPS +! REAL(KIND=JPRB) :: Z4PIOVER3, ZSQRT2 +! REAL(KIND=JPRB), PARAMETER :: PPEPSSEC = 1.E-25_JPRB ! used to avoid division by 0 +! +! ! the following constants from Abdul-Razzak et al. 1998 Ch. 3: +! ! thermal jump length [m] +! REAL(KIND=JPRB), PARAMETER :: PPDELTA_T = 2.16E-7_JPRB +! +! ! vapour jump length [m] +! REAL(KIND=JPRB), PARAMETER :: PPDELTA_V = 1.096E-7_JPRB +! +! ! mass accomodation coefficient +! REAL(KIND=JPRB), PARAMETER :: PPALPHA_C = 1.0_JPRB +! +! ! thermal accomodation coefficient +! REAL(KIND=JPRB), PARAMETER :: PPALPHA_T = 0.96_JPRB +! +! REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +! !---executable procedure +! IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.AER_ACTIV_ABDULRAZZAK_GHAN', 0, ZHOOK_HANDLE) +! +! !---Initializations: +! +! ZSUM(KIDIA:KFDIA,KTDIA:KLEV,:)= 0._JPRB +! ZSMAX(KIDIA:KFDIA,KTDIA:KLEV,:)= 0._JPRB +! ZSM(KIDIA:KFDIA,KTDIA:KLEV,:) = 0._JPRB +! ZFRACN_TOP(KIDIA:KFDIA,KTDIA:KLEV,:) = 0._JPRB +! ZFRACN_BOT(KIDIA:KFDIA,KTDIA:KLEV,:) = 0._JPRB +! PCDNC(KIDIA:KFDIA,KTDIA:KLEV) = 0._JPRB +! +! !--- Conversions to SI units [g mol-1 to kg mol-1]: +! ZAMW=RMV*1.E-3_JPRB +! ZAMD=RMD*1.E-3_JPRB +! +! !---miscellaneous +! Z4PIOVER3 = 4._JPRB*RPI/3._JPRB +! ZEPS=EPSILON(1._JPRB) +! ZSQRT2 = SQRT(2._JPRB) +! +! ! Abdul-Razzak and Ghan (2000): +! ! (Equations numbers from this paper unless otherwise quoted) +! +! DO JK=KTDIA,KLEV +! DO JL=KIDIA,KFDIA +! +! IF (LCLOUD(JL,JK)) THEN +! !---Kelvin (curvature) term (equation (5) in Abdul-Razzak et al. 1998) +! ! also (A1) in Ghan et al. 2011 +! ZKELV(JL,JK) = 2._JPRB * ZAMW * PPSURFTEN / (R * PPRHO_WAT * PT(JL,JK)) +! +! !--- Abdul-Razzak et al. (1998) (Eq. 11): +! ZALPHA(JL,JK) = (RG*ZAMW*RLVTT) / (RCPD*R*PT(JL,JK)**2) - & +! & (RG*ZAMD) / (R*PT(JL,JK)) +! +! ! Saturation water vapour pressure: +! ZESW(JL,JK) = FOEEWM(PT(JL,JK)) +! +! !--- Abdul-Razzak et al. (1998) (Eq. 12): +! ZGAMMA(JL,JK) = (R*PT(JL,JK)) / (ZESW(JL,JK)*ZAMW) + & +! & (ZAMW*RLVTT**2) / (RCPD*PAP(JL,JK)*ZAMD*PT(JL,JK)) +! +! !--- Diffusivity of water vapour in air (P&K, 13.3) [m2 s-1]: +! +! ZDIF(JL,JK)=0.211_JPRB * (PT(JL,JK)/RTT)**1.94_JPRB * (101325._JPRB/PAP(JL,JK)) *1.E-4_JPRB +! +! !--- Thermal conductivity zk (P&K, 13.18) [cal cm-1 s-1 K-1]: +! +! ! Mole fraction of water: +! +! ZKA(JL)=(5.69_JPRB+0.017_JPRB*(PT(JL,JK)-273.15_JPRB))*1.E-5_JPRB +! +! ZKV(JL)=(3.78_JPRB+0.020_JPRB*(PT(JL,JK)-273.15_JPRB))*1.E-5_JPRB +! +! ! Moist air, convert to [J m-1 s-1 K-1]: +! +! ZK(JL,JK) = ZKA(JL)*(1._JPRB-(1.17_JPRB-1.02_JPRB*ZKV(JL)/ZKA(JL))*PQ(JL,JK)*(ZAMD/ZAMW)) & +! & * 4.1868_JPRB*1.E2_JPRB +! END IF +! +! END DO +! END DO +! +! DO JMOD=2,NSOL +! ! (7): +! +! ZF(JMOD)=0.5_JPRB*EXP(2.5_JPRB*SIGMALN(JMOD)**2) +! +! ! (8): +! +! ZG(JMOD)=1._JPRB+0.25_JPRB*SIGMALN(JMOD) +! +! ! (9): +! !>>dod kappa +! ! replaced by eqn. (2) from Ghan et al (2011) +! DO JK=KTDIA,KLEV +! DO JL=KIDIA,KFDIA +! +! IF (LCLOUD(JL,JK)) THEN +! !---total volume per mode [m-3 / kg(air)], used for kappa calculation +! ZVOL(JL) = Z4PIOVER3 * PAERONUM(JL,JK,JMOD) * & +! (CMR2RAM(JMOD)*PRDRY(JL,JK,JMOD))**3 +! +! !--- Number per unit volume [# m-3] for each mode: +! ZN(JL,JK,JMOD) = PAERONUM(JL,JK,JMOD)*PRHO(JL,JK) +! +! !---sea salt and dust do not exist in mode 2: +! ZSSMASS(JL) = MERGE(0._JPRB, PSSMASS(JL,JK,JMOD), JMOD==2) +! ZDUMASS(JL) = MERGE(0._JPRB, PDUMASS(JL,JK,JMOD), JMOD==2) +! !---ammonium-nitrate and MSA do not exit in mode 2 and 4: +! ZNO3MASS(JL) = MERGE(0._JPRB, PNO3MASS(JL,JK), JMOD==2 .OR. JMOD==4) +! ZMSAMASS(JL) = MERGE(0._JPRB, PMSAMASS(JL,JK), JMOD==2 .OR. JMOD==4) +! +! NNA(JL) = ZSSMASS(JL) / WNACL +! NCL(JL) = NNA(JL) +! NSO4(JL) = PSO4MASS(JL,JK,JMOD) / WSO4 +! NNA2SO4(JL) = MIN(NNA(JL)/2._JPRB, NSO4(JL)) +! NNA(JL) = NNA(JL) - 2._JPRB*NNA2SO4(JL) +! NNACL(JL) = MIN(NCL(JL), NNA(JL)) +! NCL(JL) = NNACL(JL) +! NH2SO4(JL) = NSO4(JL) - NNA2SO4(JL) +! +! !---mode kappa = volume-weighted sum of component kappa's +! ZKAPPA(JL) = ( (PPKAPPA_NACL * NNACL(JL) * WNACL / (DNACL*1.E3_JPRB)) + & +! & (PPKAPPA_NA2SO4 * NNA2SO4(JL) * WNA2SO4 / (DNA2SO4*1.E3_JPRB)) + & +! & (PPKAPPA_H2SO4 * NH2SO4(JL) * WH2SO4 / (DH2SO4*1.E3_JPRB)) + & +! & (PPKAPPA_BC * PBCMASS(JL,JK,JMOD) / (DBC*1.E3_JPRB)) + & +! & (PPKAPPA_OC * POMMASS(JL,JK,JMOD) / (DOC*1.E3_JPRB)) + & +! & (PPKAPPA_DU * ZDUMASS(JL) / (DDUST*1.E3_JPRB)) + & +! & (PPKAPPA_NH4NO3 * ZNO3MASS(JL) * NH4NO3_FACTOR / (DNH4NO3*1.E3_JPRB)) + & +! & (PPKAPPA_MSA * ZMSAMASS(JL) / (DMSA*1.E3_JPRB)) ) / & +! & ZVOL(JL) +! +! !---defensive step: minimum kappa to avoid divide by zero errors +! ZKAPPA(JL) = MERGE(ZKAPPA(JL), 0.04_JPRB, ZKAPPA(JL) > 0.04_JPRB ) +! +! ZSM(JL,JK,JMOD) = SQRT(4._JPRB*ZKELV(JL,JK)**3 / & +! & (27._JPRB * ZKAPPA(JL) * PRDRY(JL,JK,JMOD)**3) ) +! +! !--- modified diffusivity and thermal conductivity +! ZSQTERM(JL) = SQRT(2._JPRB*RPI*ZAMW/(R*PT(JL,JK))) +! +! !--- Abdul-Razzak et al. (1998) (Eq. 17): +! ZDIFMOD(JL) = ZDIF(JL,JK) / & +! & ( (PRDRY(JL,JK,JMOD)/(PRDRY(JL,JK,JMOD)+PPDELTA_V)) + & +! & (ZDIF(JL,JK)/(PRDRY(JL,JK,JMOD)*PPALPHA_C)) * ZSQTERM(JL) ) +! +! !--- Abdul-Razzak et al. (1998) (Eq. 18): +! ZKMOD(JL) = ZK(JL,JK) / & +! & ( (PRDRY(JL,JK,JMOD)/(PRDRY(JL,JK,JMOD)+PPDELTA_T)) + & +! & (ZK(JL,JK)/(PRDRY(JL,JK,JMOD)*PPALPHA_T*RCPD)) * ZSQTERM(JL) ) +! +! !--- growth coefficient due to gas kinetic effects: +! +! !--- Abdul-Razzak et al. (1998) (Eq. 16): +! ZTERM1(JL) = (PPRHO_WAT*R*PT(JL,JK)) / (ZESW(JL,JK)*ZDIFMOD(JL)*ZAMW) +! +! ZTERM2(JL) = (RLVTT*PPRHO_WAT) / (ZKMOD(JL)*PT(JL,JK)) +! +! ZTERM3(JL) = (RLVTT*ZAMW) / (R*PT(JL,JK))-1._JPRB +! +! ZGROWTH(JL,JK,JMOD) = 1._JPRB / & +! & (ZTERM1(JL) + ZTERM2(JL) * ZTERM3(JL)) +! END IF +! END DO +! END DO +! +! END DO +! !< ZEPS .AND. & +! & PRDRY(JL,JK,JMOD)>1.E-9_JPRB .AND. & +! & LCLOUD(JL,JK) .AND. PW(JL,JK,JW) > ZEPS) THEN +! +! ! (10): +! ZXI = (2._JPRB*ZKELV(JL,JK)/3._JPRB) * & +! & SQRT(ZALPHA(JL,JK)*PW(JL,JK,JW)/ZGROWTH(JL,JK,JMOD)) +! +! ! (11): +! ZETA = ((ZALPHA(JL,JK)*PW(JL,JK,JW)/ZGROWTH(JL,JK,JMOD))**1.5_JPRB) / & +! & (2._JPRB*RPI*PPRHO_WAT*ZGAMMA(JL,JK)*ZN(JL,JK,JMOD)) +! +! ! (6): +! ZSUM(JL,JK,JW) = ZSUM(JL,JK,JW) + & +! & (1._JPRB/ZSM(JL,JK,JMOD)**2 * & +! & (ZF(JMOD)*(ZXI/ZETA)**1.5_JPRB + & +! & ZG(JMOD)*(ZSM(JL,JK,JMOD)**2._JPRB/(ZETA+3._JPRB*ZXI))**0.75_JPRB ) ) +! +! END IF +! +! END DO +! END DO +! END DO +! +! DO JK=KTDIA,KLEV +! DO JL=KIDIA,KFDIA +! IF (LCLOUD(JL,JK)) THEN +! IF (ZSUM(JL,JK,JW) > ZEPS) THEN +! ZSMAX(JL,JK,JW) = SQRT(1._JPRB / ZSUM(JL,JK,JW)) +! END IF +! END IF +! END DO +! END DO +! END DO +! +! !---Calculate activation: +! DO JW=1,KPDF +! DO JMOD=2, NSOL +! DO JK=KTDIA, KLEV +! DO JL=KIDIA,KFDIA +! +! IF ( LCLOUD(JL,JK) .AND. & +! & ZSMAX(JL,JK,JW)>ZEPS .AND. & +! & ZSM(JL,JK,JMOD)>ZEPS .AND. & +! & ZN(JL,JK,JMOD)>ZEPS .AND. & +! & PAERONUM(JL,JK,JMOD)>1.E-9_JPRB ) THEN +! +! !---critical radius (12): +! ZRC=PRDRY(JL,JK,JMOD)*(ZSM(JL,JK,JMOD)/ZSMAX(JL,JK,JW))**(2._JPRB/3._JPRB) +! +! !---fraction of particles that are *larger* than Rc: +! ZT=(LOG(ZRC)-LOG(PRDRY(JL,JK,JMOD))) / (ZSQRT2*SIGMALN(JMOD)) +! ZFRACN = 0.5_JPRB * ERFC(ZT) +! +! !---Sum up the total number of activated particles, integrating over updraft PDF [m-3]: +! ZFRACN_TOP(JL,JK,JMOD) = ZFRACN_TOP(JL,JK,JMOD) & +! + ZFRACN*PWPDF(JL,JK,JW) +! END IF +! +! ZFRACN_BOT(JL,JK,JMOD) = ZFRACN_BOT(JL,JK,JMOD) + PWPDF(JL,JK,JW) +! +! END DO ! jl +! END DO ! jk +! END DO +! END DO +! +! DO JMOD=2,NSOL +! DO JK=KTDIA,KLEV +! DO JL=KIDIA,KFDIA +! +! !---sum the total number of activated particles [# cm-3] +! IF (LCLOUD(JL,JK)) THEN +! PCDNC(JL,JK) = PCDNC(JL,JK) + 1.E-6_JPRB * ZN(JL,JK,JMOD) * & +! & ZFRACN_TOP(JL,JK,JMOD) / ZFRACN_BOT(JL,JK,JMOD) +! END IF +! +! END DO +! END DO +! END DO +! +! IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.AER_ACTIV_ABDULRAZZAK_GHAN', 1, ZHOOK_HANDLE) +! +! END SUBROUTINE AER_ACTIV_ABDULRAZZAK_GHAN +! +! SUBROUTINE AER_ACTIV_MENON(KIDIA, KFDIA, KLON, KTDIA, KLEV, PT, PRHO, PLSM, PSO4MASS, PSSMASS, POMMASS, & +! & PCDNC) +! +! ! Description +! ! ----------- +! ! aer_activ_menon calculates the CDNC concentration as a function of the bulk mass +! ! concentrations of sulfate, sea salt and organics +! +! ! Reference: +! ! ---------- +! ! GCM Simulations of the Aerosol Indirect Effect: Sensitivity to Cloud Parameterization +! ! and Aerosol Burden +! ! Menon et al., J. Atm. Sci. 59 692-713, 2002 +! +! !---inherited functions, types, variables and constants: +! USE YOMHOOK, ONLY: LHOOK, DR_HOOK +! USE YOMCST, ONLY: RPI +! USE YOECLDP, ONLY: RTHOMO, RCDNCSU, RCDNCSS, RCDNCOM +! +! !---subroutine interface +! INTEGER(KIND=JPIM), INTENT(IN) :: KIDIA ! beginning of horizontal block +! INTEGER(KIND=JPIM), INTENT(IN) :: KFDIA ! beginning of horizontal block +! INTEGER(KIND=JPIM), INTENT(IN) :: KLON ! horizontal dimension +! INTEGER(KIND=JPIM), INTENT(IN) :: KTDIA ! highest level with liquid cloud +! INTEGER(KIND=JPIM), INTENT(IN) :: KLEV ! number of model vertical levels +! REAL(KIND=JPRB), INTENT(IN) :: PT(KLON,KLEV) ! air temperature [K] +! REAL(KIND=JPRB), INTENT(IN) :: PRHO(KLON,KLEV) ! air density [kg m-3] +! REAL(KIND=JPRB), INTENT(IN) :: PLSM(KLON) ! land-sea mask +! REAL(KIND=JPRB), INTENT(IN) :: PSO4MASS(KLON,KLEV) ! so4 mass mixing ratio [kg/kg(air)] +! REAL(KIND=JPRB), INTENT(IN) :: PSSMASS(KLON,KLEV) ! sea salt mass mixing ratio [kg/kg(air)] +! REAL(KIND=JPRB), INTENT(IN) :: POMMASS(KLON,KLEV) ! OM mass mixing ratio [kg/kg(air)] +! REAL(KIND=JPRB), INTENT(INOUT) :: PCDNC(KLON,KLEV) ! number concentration of activated cloud droplets +! ! [#/cm3] +! +! !---local types, variables and constants: +! REAL(KIND=JPRB) :: ZSO4MASS ! sulfate mass [ug m-3] +! REAL(KIND=JPRB) :: ZOCMASS ! organic mass [ug m-3] +! REAL(KIND=JPRB) :: ZSSMASS ! sea salt mass [ug m-3] +! REAL(KIND=JPRB) :: ZCDNC_LAND(KLON) ! CDNC according to 'over land' formulation in Menon et al. +! REAL(KIND=JPRB) :: ZCDNC_OCEAN(KLON) ! CDNC according to 'over ocean' formulation in Menon et al. +! INTEGER(KIND=JPIM) :: JK, JL ! loop indices +! +! REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +! +! !---executable procedure +! IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.AER_ACTIV_MENON', 0, ZHOOK_HANDLE) +! +! PCDNC(KIDIA:KFDIA,KTDIA:KLEV) = 0.0_JPRB +! +! DO JK=KTDIA,KLEV +! DO JL=KIDIA,KFDIA +! +! ! SO4, BC, OC mass in ug m-3: +! ZSO4MASS = PSO4MASS(JL,JK)*PRHO(JL,JK)*1.E9_JPRB +! ZSSMASS = PSSMASS(JL,JK)*PRHO(JL,JK)*1.E9_JPRB +! ZOCMASS = POMMASS(JL,JK)*PRHO(JL,JK)*1.E9_JPRB +! +! !---equation 1(b) in Menon et al., reformulated without log function. +! ! Note: this gives CDNC in #/cm3 +! ZCDNC_LAND(JL) = 257._JPRB*(ZSO4MASS**RCDNCSU)*(ZOCMASS**RCDNCOM) +! ZCDNC_OCEAN(JL) = ZCDNC_LAND(JL)*(ZSSMASS**RCDNCSS) +! +! END DO +! +! PCDNC(KIDIA:KFDIA,JK)=MERGE(ZCDNC_LAND(KIDIA:KFDIA), & +! & ZCDNC_OCEAN(KIDIA:KFDIA),PLSM(KIDIA:KFDIA)>0.5) +! +! END DO +! +! IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.AER_ACTIV_MENON', 1, ZHOOK_HANDLE) +! +! END SUBROUTINE AER_ACTIV_MENON + + SUBROUTINE GET_HAMM7_AERO_PROP(KIDIA, KFDIA, KLON, KTDIA, KLEV, KSTGLO, LMODE, LBULK, & + & PAPH, PGELAM, PGEMU, PXTM1, KTRAC, & + & PDRYRSOL, PAERONUM, & + & PSO4MASS, PBCMASS, POMMASS, PSSMASS, PDUMASS, & + & PSO4BULK, PBCBULK, POMBULK, PSSBULK, PDUBULK, & + & PNO3MASS, PMSAMASS) + + !---inherited functions, types, variables and constants + USE YOMHOOK, ONLY: LHOOK, DR_HOOK + USE YOMCST, ONLY: RPI + USE TM5M7_DATA, ONLY: NSOL + + !<--eehol: add tracer variables for tracer indices to reduce hardcoding + USE MO_HAM, ONLY: & + sizeclass, & ! aerosol classes in HAM + aerocomp ! aerosol compounds by size class in HAM + USE mo_ham_m7ctl, ONLY: inucs, iaits, iaccs, icoas, & + iaiti, iacci, icoai, & + iso4ns, iso4ks, iso4as, iso4cs, & + ibcks, ibcas, ibccs, ibcki, & + iocks, iocas, ioccs, iocki, & + issas, isscs, & + iduas, iducs, iduai, iduci + !-->eehol + !USE YOERAD, ONLY: LTM5AER, LCMIP6_PI_AEROSOLS, NRADFR + !USE YOE_AERO_M7_DATA + !USE CPLNG, ONLY: CPLNG_FLD, CPLNG_IDX, LEV_IDX_TM5, & + ! & NLEV_TM5, NLEV_TM5_AER + !USE YOE_PI_AERO + !USE YOMCT3, ONLY: NSTEP + + IMPLICIT NONE + + !---subroutine interface + ! *GET_HAMM7_AERO_PROP* is called here before the activation calculations + ! + ! INPUT: + INTEGER(KIND=JPIM), INTENT(IN) :: KIDIA ! beginning of horizontal block + INTEGER(KIND=JPIM), INTENT(IN) :: KFDIA ! end of horizontal block + INTEGER(KIND=JPIM), INTENT(IN) :: KLON ! horizontal dimension + INTEGER(KIND=JPIM), INTENT(IN) :: KTDIA ! highest level with liquid cloud + INTEGER(KIND=JPIM), INTENT(IN) :: KLEV ! number of model vertical levels + INTEGER(KIND=JPIM), INTENT(IN) :: KSTGLO ! offset of horizontal block in coupling arrays + INTEGER(KIND=JPIM), INTENT(IN) :: KTRAC ! number of tracers + + LOGICAL, INTENT(IN) :: LMODE ! Per-mode data requested + LOGICAL, INTENT(IN) :: LBULK ! Bulk aerosol masses requested + + REAL(KIND=JPRB), INTENT(IN) :: PAPH(KLON,KLEV+1) ! half-level pressure + REAL(KIND=JPRB), INTENT(IN) :: PGELAM(KLON) ! longitude + REAL(KIND=JPRB), INTENT(IN) :: PGEMU(KLON) ! sine of latitude + REAL(KIND=JPRB), INTENT(IN) :: PXTM1(KLON,KLEV,KTRAC) ! sine of latitude + + ! OUTPUT: + REAL(KIND=JPRB), INTENT(OUT) :: PDRYRSOL(KLON,KLEV,NSOL) ! [M] + REAL(KIND=JPRB), INTENT(OUT) :: PAERONUM(KLON,KLEV,NSOL) ! [#/KG(AIR)] + REAL(KIND=JPRB), INTENT(OUT) :: PSO4MASS(KLON,KLEV,NSOL) ! [KG(SO4)/KG(AIR)] + REAL(KIND=JPRB), INTENT(OUT) :: PBCMASS(KLON,KLEV,NSOL) ! [KG(BC)/KG(AIR)] + REAL(KIND=JPRB), INTENT(OUT) :: POMMASS(KLON,KLEV,NSOL) ! [KG(OM)/KG(AIR)] + REAL(KIND=JPRB), INTENT(OUT) :: PSSMASS(KLON,KLEV,NSOL) ! [KG(SS)/KG(AIR)] + REAL(KIND=JPRB), INTENT(OUT) :: PDUMASS(KLON,KLEV,NSOL) ! [KG(DU)/KG(AIR)] + REAL(KIND=JPRB), INTENT(OUT) :: PSO4BULK(KLON,KLEV) ! [KG(SO4)/KG(AIR)] + REAL(KIND=JPRB), INTENT(OUT) :: PBCBULK(KLON,KLEV) ! [KG(BC)/KG(AIR)] + REAL(KIND=JPRB), INTENT(OUT) :: POMBULK(KLON,KLEV) ! [KG(OM)/KG(AIR)] + REAL(KIND=JPRB), INTENT(OUT) :: PSSBULK(KLON,KLEV) ! [KG(SS)/KG(AIR)] + REAL(KIND=JPRB), INTENT(OUT) :: PDUBULK(KLON,KLEV) ! [KG(DU)/KG(AIR)] + REAL(KIND=JPRB), INTENT(OUT) :: PNO3MASS(KLON,KLEV) ! [KG(NO3)/KG(AIR)] + REAL(KIND=JPRB), INTENT(OUT) :: PMSAMASS(KLON,KLEV) ! [KG(MSA)/KG(AIR)] + + !---local data + REAL(KIND=JPRB) :: NSO4, NH2SO4, NNACL, NNA, NCL, NNA2SO4 ! Particle numbers [kmol/kg air] + REAL(KIND=JPRB) :: ZDRYVOL2, ZDRYVOL3, ZDRYVOL4 ! Volume per particle [m3/#] + REAL(KIND=JPRB) :: ZDUMMY(KLON,KLEV) ! For fields we don't use in subroutine call + REAL(KIND=JPRB) :: Z4PIOVER3 + REAL(KIND=JPRB) :: ZHOOK_HANDLE + INTEGER(KIND=JPIM) :: JL, JK, IBL, IL, IK + + !---executable procedure + IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.GET_HAMM7_AERO_PROP', 0, ZHOOK_HANDLE) + +! IF (LCMIP6_PI_AEROSOLS) THEN +! +! IBL = (KSTGLO-1)/KLON+1 +! +! IF (LPI_AERO_UPDATED .AND. MOD(NSTEP,NRADFR)==0) THEN +! +! !---CMIP6 preindustrial aerosols: interpolate from TM5 grid to physics grid +! CALL CMIP6_PIAER_MXR_INTERP(KIDIA, KFDIA, KLON, KLEV, 1, 0, & +! & PAPH, PGELAM, PGEMU, & +! & PAERONUM(:,:,2), PAERONUM(:,:,3), PAERONUM(:,:,4), & +! & PSO4MASS(:,:,2), PSO4MASS(:,:,3), PSO4MASS(:,:,4), & +! & PBCMASS(:,:,2), PBCMASS(:,:,3), PBCMASS(:,:,4), ZDUMMY, & +! & POMMASS(:,:,2), POMMASS(:,:,3), POMMASS(:,:,4), ZDUMMY, & +! & PSSMASS(:,:,3), PSSMASS(:,:,4), & +! & PDUMASS(:,:,3), PDUMASS(:,:,4), ZDUMMY, ZDUMMY, & +! & PNO3MASS(:,:), PMSAMASS(:,:) ) +! +! PI_AERO_PHY(KIDIA:KFDIA,:,IPINUM_KS,IBL) = PAERONUM(KIDIA:KFDIA,:,JP_AITS) +! PI_AERO_PHY(KIDIA:KFDIA,:,IPINUM_AS,IBL) = PAERONUM(KIDIA:KFDIA,:,JP_ACCS) +! PI_AERO_PHY(KIDIA:KFDIA,:,IPINUM_CS,IBL) = PAERONUM(KIDIA:KFDIA,:,JP_COAS) +! PI_AERO_PHY(KIDIA:KFDIA,:,IPIMSO4_KS,IBL) = PSO4MASS(KIDIA:KFDIA,:,JP_AITS) +! PI_AERO_PHY(KIDIA:KFDIA,:,IPIMSO4_AS,IBL) = PSO4MASS(KIDIA:KFDIA,:,JP_ACCS) +! PI_AERO_PHY(KIDIA:KFDIA,:,IPIMSO4_CS,IBL) = PSO4MASS(KIDIA:KFDIA,:,JP_COAS) +! PI_AERO_PHY(KIDIA:KFDIA,:,IPIMBC_KS,IBL) = PBCMASS(KIDIA:KFDIA,:,JP_AITS) +! PI_AERO_PHY(KIDIA:KFDIA,:,IPIMBC_AS,IBL) = PBCMASS(KIDIA:KFDIA,:,JP_ACCS) +! PI_AERO_PHY(KIDIA:KFDIA,:,IPIMBC_CS,IBL) = PBCMASS(KIDIA:KFDIA,:,JP_COAS) +! ! Note: insoluble modes are not presently used on the physics grid and +! ! are therefore not stored. Note also the third dimension of the PxxMASS +! ! arrays is NSOL. +! ! PI_AERO_PHY(KIDIA:KFDIA,:,IPIMBC_KI,IBL) = PBCMASS((KIDIA:KFDIA,:,JP_AITI) +! PI_AERO_PHY(KIDIA:KFDIA,:,IPIMOC_KS,IBL) = POMMASS(KIDIA:KFDIA,:,JP_AITS) +! PI_AERO_PHY(KIDIA:KFDIA,:,IPIMOC_AS,IBL) = POMMASS(KIDIA:KFDIA,:,JP_ACCS) +! PI_AERO_PHY(KIDIA:KFDIA,:,IPIMOC_CS,IBL) = POMMASS(KIDIA:KFDIA,:,JP_COAS) +! ! PI_AERO_PHY(KIDIA:KFDIA,:,IPIMOC_KI,IBL) = POMMASS(KIDIA:KFDIA,:,JP_AITI) +! PI_AERO_PHY(KIDIA:KFDIA,:,IPIMSS_AS,IBL) = PSSMASS(KIDIA:KFDIA,:,JP_ACCS) +! PI_AERO_PHY(KIDIA:KFDIA,:,IPIMSS_CS,IBL) = PSSMASS(KIDIA:KFDIA,:,JP_COAS) +! PI_AERO_PHY(KIDIA:KFDIA,:,IPIMDU_AS,IBL) = PDUMASS(KIDIA:KFDIA,:,JP_ACCS) +! PI_AERO_PHY(KIDIA:KFDIA,:,IPIMDU_CS,IBL) = PDUMASS(KIDIA:KFDIA,:,JP_COAS) +! ! PI_AERO_PHY(KIDIA:KFDIA,:,IPIMDU_AI,IBL) = PDUMASS(KIDIA:KFDIA,:,JP_ACCI) +! ! PI_AERO_PHY(KIDIA:KFDIA,:,IPIMDU_CI,IBL) = PDUMASS(KIDIA:KFDIA,:,JP_COAI) +! PI_AERO_PHY(KIDIA:KFDIA,:,IPIMNO3,IBL) = PNO3MASS(KIDIA:KFDIA,:) +! PI_AERO_PHY(KIDIA:KFDIA,:,IPIMMSA,IBL) = PMSAMASS(KIDIA:KFDIA,:) +! ELSE +! PAERONUM(KIDIA:KFDIA,:,JP_AITS) = PI_AERO_PHY(KIDIA:KFDIA,:,IPINUM_KS,IBL) +! PAERONUM(KIDIA:KFDIA,:,JP_ACCS) = PI_AERO_PHY(KIDIA:KFDIA,:,IPINUM_AS,IBL) +! PAERONUM(KIDIA:KFDIA,:,JP_COAS) = PI_AERO_PHY(KIDIA:KFDIA,:,IPINUM_CS,IBL) +! PSO4MASS(KIDIA:KFDIA,:,JP_AITS) = PI_AERO_PHY(KIDIA:KFDIA,:,IPIMSO4_KS,IBL) +! PSO4MASS(KIDIA:KFDIA,:,JP_ACCS) = PI_AERO_PHY(KIDIA:KFDIA,:,IPIMSO4_AS,IBL) +! PSO4MASS(KIDIA:KFDIA,:,JP_COAS) = PI_AERO_PHY(KIDIA:KFDIA,:,IPIMSO4_CS,IBL) +! PBCMASS(KIDIA:KFDIA,:,JP_AITS) = PI_AERO_PHY(KIDIA:KFDIA,:,IPIMBC_KS,IBL) +! PBCMASS(KIDIA:KFDIA,:,JP_ACCS) = PI_AERO_PHY(KIDIA:KFDIA,:,IPIMBC_AS,IBL) +! PBCMASS(KIDIA:KFDIA,:,JP_COAS) = PI_AERO_PHY(KIDIA:KFDIA,:,IPIMBC_CS,IBL) +! ! PBCMASS(KIDIA:KFDIA,:,JP_AITI) = PI_AERO_PHY(KIDIA:KFDIA,:,IPIMBC_KI,IBL) +! POMMASS(KIDIA:KFDIA,:,JP_AITS) = PI_AERO_PHY(KIDIA:KFDIA,:,IPIMOC_KS,IBL) +! POMMASS(KIDIA:KFDIA,:,JP_ACCS) = PI_AERO_PHY(KIDIA:KFDIA,:,IPIMOC_AS,IBL) +! POMMASS(KIDIA:KFDIA,:,JP_COAS) = PI_AERO_PHY(KIDIA:KFDIA,:,IPIMOC_CS,IBL) +! ! POMMASS(KIDIA:KFDIA,:,JP_AITI) = PI_AERO_PHY(KIDIA:KFDIA,:,IPIMOC_KI,IBL) +! PSSMASS(KIDIA:KFDIA,:,JP_ACCS) = PI_AERO_PHY(KIDIA:KFDIA,:,IPIMSS_AS,IBL) +! PSSMASS(KIDIA:KFDIA,:,JP_COAS) = PI_AERO_PHY(KIDIA:KFDIA,:,IPIMSS_CS,IBL) +! PDUMASS(KIDIA:KFDIA,:,JP_ACCS) = PI_AERO_PHY(KIDIA:KFDIA,:,IPIMDU_AS,IBL) +! PDUMASS(KIDIA:KFDIA,:,JP_COAS) = PI_AERO_PHY(KIDIA:KFDIA,:,IPIMDU_CS,IBL) +! ! PDUMASS(KIDIA:KFDIA,:,JP_ACCI) = PI_AERO_PHY(KIDIA:KFDIA,:,IPIMDU_AI,IBL) +! ! PDUMASS(KIDIA:KFDIA,:,JP_COAI) = PI_AERO_PHY(KIDIA:KFDIA,:,IPIMDU_CI,IBL) +! PNO3MASS(KIDIA:KFDIA,:) = PI_AERO_PHY(KIDIA:KFDIA,:,IPIMNO3,IBL) +! PMSAMASS(KIDIA:KFDIA,:) = PI_AERO_PHY(KIDIA:KFDIA,:,IPIMMSA,IBL) +! END IF +! ELSE +! +! IF (LTM5AER) THEN +! IF (ICPLSU2 == -1) THEN +! ICPLSU2 = CPLNG_IDX('A_SU2') +! ICPLSU3 = CPLNG_IDX('A_SU3') +! ICPLSU4 = CPLNG_IDX('A_SU4') +! ICPLBC2 = CPLNG_IDX('A_BC2') +! ICPLBC3 = CPLNG_IDX('A_BC3') +! ICPLBC4 = CPLNG_IDX('A_BC4') +! ICPLOM2 = CPLNG_IDX('A_OM2') +! ICPLOM3 = CPLNG_IDX('A_OM3') +! ICPLOM4 = CPLNG_IDX('A_OM4') +! ICPLSS3 = CPLNG_IDX('A_SS3') +! ICPLSS4 = CPLNG_IDX('A_SS4') +! ICPLDD3 = CPLNG_IDX('A_DD3') +! ICPLDD4 = CPLNG_IDX('A_DD4') +! ICPLNO3 = CPLNG_IDX('A_NO3') +! ICPLMSA = CPLNG_IDX('A_MSA') +! END IF +! ! NO3 and MSA are not set in RADINTG +! IF (ICPLNO3 == -1) ICPLNO3 = CPLNG_IDX('A_NO3') +! IF (ICPLMSA == -1) ICPLMSA = CPLNG_IDX('A_MSA') +! +! !---aerosol masses: +! DO JK=KTDIA,KLEV +! +! ! Include offset in case upper levels have not been received from TM5 +! IK = LEV_IDX_TM5(JK) - NLEV_TM5 + NLEV_TM5_AER +! IF (IK >= 1) THEN +! DO JL=KIDIA,KFDIA +! IL = KSTGLO+JL-1 +! !---nucleation mode is ignored +! +! !---accumulation mode: SU, OM, BC +! PSO4MASS(JL,JK,JP_AITS) = CPLNG_FLD(ICPLSU2)%D(IL,IK,1) +! POMMASS(JL,JK,JP_AITS) = CPLNG_FLD(ICPLOM2)%D(IL,IK,1) +! PBCMASS(JL,JK,JP_AITS) = CPLNG_FLD(ICPLBC2)%D(IL,IK,1) +! +! !---accumulation mode: SU, OM, BC, SS, DU +! PSO4MASS(JL,JK,JP_ACCS) = CPLNG_FLD(ICPLSU3)%D(IL,IK,1) +! POMMASS(JL,JK,JP_ACCS) = CPLNG_FLD(ICPLOM3)%D(IL,IK,1) +! PBCMASS(JL,JK,JP_ACCS) = CPLNG_FLD(ICPLBC3)%D(IL,IK,1) +! PSSMASS(JL,JK,JP_ACCS) = CPLNG_FLD(ICPLSS3)%D(IL,IK,1) +! PDUMASS(JL,JK,JP_ACCS) = CPLNG_FLD(ICPLDD3)%D(IL,IK,1) +! +! !---coarse mode: SU, OM, BC, SS, DU +! PSO4MASS(JL,JK,JP_COAS) = CPLNG_FLD(ICPLSU4)%D(IL,IK,1) +! POMMASS(JL,JK,JP_COAS) = CPLNG_FLD(ICPLOM4)%D(IL,IK,1) +! PBCMASS(JL,JK,JP_COAS) = CPLNG_FLD(ICPLBC4)%D(IL,IK,1) +! PSSMASS(JL,JK,JP_COAS) = CPLNG_FLD(ICPLSS4)%D(IL,IK,1) +! PDUMASS(JL,JK,JP_COAS) = CPLNG_FLD(ICPLDD4)%D(IL,IK,1) +! +! !---nitrate and MSA +! PNO3MASS(JL,JK) = CPLNG_FLD(ICPLNO3)%D(IL,IK,1) +! PMSAMASS(JL,JK) = CPLNG_FLD(ICPLMSA)%D(IL,IK,1) +! END DO +! ELSE +! ! These levels have not been received from TM5 +! ! and should be set to zero +! PSO4MASS(KIDIA:KFDIA,JK,:) = 0._JPRB +! POMMASS(KIDIA:KFDIA,JK,:) = 0._JPRB +! PBCMASS(KIDIA:KFDIA,JK,:) = 0._JPRB +! PSSMASS(KIDIA:KFDIA,JK,:) = 0._JPRB +! PDUMASS(KIDIA:KFDIA,JK,:) = 0._JPRB +! PNO3MASS(KIDIA:KFDIA,JK) = 0._JPRB +! PMSAMASS(KIDIA:KFDIA,JK) = 0._JPRB +! END IF +! +! END DO +! +! !---aerosol number and radius (if needed) +! IF (LMODE) THEN +! IF (ICPLN2 == -1) THEN +! ICPLN2=CPLNG_IDX('A_N2') +! ICPLN3=CPLNG_IDX('A_N3') +! ICPLN4=CPLNG_IDX('A_N4') +! END IF +! DO JK=KTDIA,KLEV +! ! Include offset in case upper levels have not been received from TM5 +! IK = LEV_IDX_TM5(JK) - NLEV_TM5 + NLEV_TM5_AER +! IF (IK >= 1) THEN +! DO JL=KIDIA,KFDIA +! IL = KSTGLO+JL-1 +! PAERONUM(JL,JK,JP_AITS) = CPLNG_FLD(ICPLN2)%D(IL,IK,1) +! PAERONUM(JL,JK,JP_ACCS) = CPLNG_FLD(ICPLN3)%D(IL,IK,1) +! PAERONUM(JL,JK,JP_COAS) = CPLNG_FLD(ICPLN4)%D(IL,IK,1) +! END DO +! ELSE +! ! These levels have not been received from TM5 +! ! and should be set to zero +! PAERONUM(KIDIA:KFDIA,JK,:) = TINY(0._JPRB) +! END IF +! END DO +! END IF +! END IF ! ltm5aer +! END IF ! lcmip6_pi_aerosols +! +! !---aerosol radius (if needed) for both interactive TM5 and preindustrial climatology +! IF (LMODE) THEN +! Z4PIOVER3 = 4._JPRB*RPI/3._JPRB +! DO JK=KTDIA,KLEV +! DO JL=KIDIA,KFDIA +! ! Aitken mode +! NSO4 = PSO4MASS(JL,JK,JP_AITS) / WSO4 +! NH2SO4 = NSO4 +! ! dry volume [m3] +! ZDRYVOL2 = & +! & (NH2SO4*WH2SO4 / (DH2SO4 * 1.0E3_JPRB) + & +! & POMMASS(JL,JK,JP_AITS) / (DOC * 1.0E3_JPRB) + & +! & PBCMASS(JL,JK,JP_AITS) / (DBC * 1.0E3_JPRB)) / & +! & PAERONUM(JL,JK,JP_AITS) +! ! dry radius [m] +! !PDRYRSOL(JL,JK,JP_AITS) = RAM2CMR(JP_AITS)* & +! ! & (ZDRYVOL2 / Z4PIOVER3)**(1._JPRB/3._JPRB) +! +! ! Accumulation mode +! NNA = PSSMASS(JL,JK,JP_ACCS) / WNACL +! NCL = NNA +! NSO4 = PSO4MASS(JL,JK,JP_ACCS) / WSO4 +! NNA2SO4 = MIN(NNA/2._JPRB, NSO4) +! NNA = NNA - 2._JPRB*NNA2SO4 +! NNACL = MIN(NCL, NNA) +! NCL = NNACL +! NH2SO4 = NSO4 - NNA2SO4 +! ! dry volume [m3] +! ZDRYVOL3 = & +! & (NNACL*WNACL / (DNACL * 1.0E3_JPRB) + & +! & NNA2SO4*WNA2SO4 / (DNA2SO4 * 1.0E3_JPRB) + & +! & NH2SO4*WH2SO4/ (DH2SO4 * 1.0E3_JPRB) + & +! & POMMASS(JL,JK,JP_ACCS) / (DOC * 1.0E3_JPRB) + & +! & PBCMASS(JL,JK,JP_ACCS) / (DBC * 1.0E3_JPRB) + & +! & PDUMASS(JL,JK,JP_ACCS) / (DDUST * 1.0E3_JPRB) + & +! & PNO3MASS(JL,JK) * NH4NO3_FACTOR / (DNH4NO3 * 1.0E3_JPRB) + & +! & PMSAMASS(JL,JK) / (DMSA * 1.0E3_JPRB)) / & +! & PAERONUM(JL,JK,JP_ACCS) +! ! dry radius [m] +! !PDRYRSOL(JL,JK,JP_ACCS) = RAM2CMR(JP_ACCS)* & +! ! & (ZDRYVOL3 / Z4PIOVER3)**(1._JPRB/3._JPRB) +! +! ! Coarse mode +! NNA = PSSMASS(JL,JK,JP_COAS) / WNACL +! NCL = NNA +! NSO4 = PSO4MASS(JL,JK,JP_COAS) / WSO4 +! NNA2SO4 = MIN(NNA/2._JPRB, NSO4) +! NNA = NNA - 2._JPRB*NNA2SO4 +! NNACL = MIN(NCL, NNA) +! NCL = NNACL +! NH2SO4 = NSO4 - NNA2SO4 +! ! dry volume [m3] +! ZDRYVOL4 = & +! & (NNACL*WNACL / (DNACL * 1.0E3_JPRB) + & +! & NNA2SO4*WNA2SO4 / (DNA2SO4 * 1.0E3_JPRB) + & +! & NH2SO4*WH2SO4/ (DH2SO4 * 1.0E3_JPRB) + & +! & POMMASS(JL,JK,JP_COAS) / (DOC * 1.0E3_JPRB) + & +! & PBCMASS(JL,JK,JP_COAS) / (DBC * 1.0E3_JPRB) + & +! & PDUMASS(JL,JK,JP_COAS) / (DDUST * 1.0E3_JPRB)) / & +! & PAERONUM(JL,JK,JP_COAS) +! ! dry radius [m] +! !PDRYRSOL(JL,JK,JP_COAS) = RAM2CMR(JP_COAS)* & +! ! & (ZDRYVOL4 / Z4PIOVER3)**(1._JPRB/3._JPRB) +! END DO +! END DO +! END IF + + !eehol: add separation of tracers NOTE: These PXTM1 indices need to go according to HAM indices and not OIFS!! + IF (LMODE) THEN + DO JK=KTDIA,KLEV + DO JL=KIDIA,KFDIA + + !---nucleation mode is ignored + + !---Aitken soluble mode: SU, OM, BC + PSO4MASS(JL,JK,2) = PXTM1(JL,JK,aerocomp(iso4ks)%idt) !SO4 Ait sol + POMMASS(JL,JK,2) = PXTM1(JL,JK,aerocomp(iocks)%idt) !OC Ait sol + PBCMASS(JL,JK,2) = PXTM1(JL,JK,aerocomp(ibcks)%idt) !BC Ait sol + + !PSO4MASS(JL,JK,2) = PXTM1(JL,JK,5) !SO4 Ait sol + !POMMASS(JL,JK,2) = PXTM1(JL,JK,12) !OC Ait sol + !PBCMASS(JL,JK,2) = PXTM1(JL,JK,8) !BC Ait sol + + !---accumulation soluble mode: SU, OM, BC, SS, DU + PSO4MASS(JL,JK,3) = PXTM1(JL,JK,aerocomp(iso4as)%idt) !SO4 acc sol + POMMASS(JL,JK,3) = PXTM1(JL,JK,aerocomp(iocas)%idt) !OC acc sol + PBCMASS(JL,JK,3) = PXTM1(JL,JK,aerocomp(ibcas)%idt) !BC acc sol + PSSMASS(JL,JK,3) = PXTM1(JL,JK,aerocomp(issas)%idt) !SS acc sol + PDUMASS(JL,JK,3) = PXTM1(JL,JK,aerocomp(iduas)%idt) !DU acc sol + + !PSO4MASS(JL,JK,3) = PXTM1(JL,JK,6) !SO4 acc sol + !POMMASS(JL,JK,3) = PXTM1(JL,JK,13) !OC acc sol + !PBCMASS(JL,JK,3) = PXTM1(JL,JK,9) !BC acc sol + !PSSMASS(JL,JK,3) = PXTM1(JL,JK,16) !SS acc sol + !PDUMASS(JL,JK,3) = PXTM1(JL,JK,18) !DU acc sol + + !---coarse soluble mode: SU, OM, BC, SS, DU + PSO4MASS(JL,JK,4) = PXTM1(JL,JK,aerocomp(iso4cs)%idt) !SO4 coa sol + POMMASS(JL,JK,4) = PXTM1(JL,JK,aerocomp(ioccs)%idt) !OC coa sol + PBCMASS(JL,JK,4) = PXTM1(JL,JK,aerocomp(ibccs)%idt) !BC coa sol + PSSMASS(JL,JK,4) = PXTM1(JL,JK,aerocomp(isscs)%idt) !SS coa sol + PDUMASS(JL,JK,4) = PXTM1(JL,JK,aerocomp(iducs)%idt) !DU coa sol + + !PSO4MASS(JL,JK,4) = PXTM1(JL,JK,7) !SO4 coa sol + !POMMASS(JL,JK,4) = PXTM1(JL,JK,14) !OC coa sol + !PBCMASS(JL,JK,4) = PXTM1(JL,JK,10) !BC coa sol + !PSSMASS(JL,JK,4) = PXTM1(JL,JK,17) !SS coa sol + !PDUMASS(JL,JK,4) = PXTM1(JL,JK,19) !DU coa sol + + !---nitrate and MSA eehol: Currently not used in HAM... need to be added later! + PNO3MASS(JL,JK) = 0._JPRB !CPLNG_FLD(ICPLNO3)%D(IL,IK,1) + PMSAMASS(JL,JK) = 0._JPRB !CPLNG_FLD(ICPLMSA)%D(IL,IK,1) + + PAERONUM(JL,JK,2) = PXTM1(JL,JK,sizeclass(iaits)%idt_no) !Ait sol + PAERONUM(JL,JK,3) = PXTM1(JL,JK,sizeclass(iaccs)%idt_no) !acc sol + PAERONUM(JL,JK,4) = PXTM1(JL,JK,sizeclass(icoas)%idt_no) !coa sol + + !PAERONUM(JL,JK,2) = PXTM1(JL,JK,23) !Ait sol + !PAERONUM(JL,JK,3) = PXTM1(JL,JK,24) !acc sol + !PAERONUM(JL,JK,4) = PXTM1(JL,JK,25) !coa sol + END DO + END DO + END IF + + ! bulk masses, if requested + IF (LBULK) THEN + DO JK=KTDIA,KLEV + DO JL=KIDIA,KFDIA + PSO4BULK(JL,JK) = PSO4MASS(JL,JK,2) + & + & PSO4MASS(JL,JK,3) + & + & PSO4MASS(JL,JK,4) + POMBULK(JL,JK) = POMMASS(JL,JK,2) + & + & POMMASS(JL,JK,3) + & + & POMMASS(JL,JK,4) + PBCBULK(JL,JK) = PBCMASS(JL,JK,2) + & + & PBCMASS(JL,JK,3) + & + & PBCMASS(JL,JK,4) + PSSBULK(JL,JK) = PSSMASS(JL,JK,3) + & + & PSSMASS(JL,JK,4) + PDUBULK(JL,JK) = PDUMASS(JL,JK,3) + & + & PDUMASS(JL,JK,4) + END DO + END DO + END IF + + IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.GET_HAMM7_AERO_PROP', 1, ZHOOK_HANDLE) + + END SUBROUTINE GET_HAMM7_AERO_PROP + + +! SUBROUTINE DIAGNOSE_AEROSOL_MASS ( & +! ! input +! & KIDIA, KFDIA, KLON, KLEV,& +! & PT, PQ, PQSAT, & +! & PAPH, PAP, & +! & PGELAM, PGEMU, PCLON, PSLON,& +! ! output +! & PSO4MASS, PBCMASS, POMMASS, PSSMASS, PDUMASS) +! +! ! DIAGNOSE_AEROSOL_MASS +! ! --------------------- +! ! Diagnose the bulk mass mixing ratios of sulfate, black carbon, organic matter, +! ! sea salt and mineral dust from the optical properties given by the Tegen climatology +! ! effects on clouds and convection +! +! ! AUTHOR +! ! A. Tompkins E.C.M.W.F. (aer_clcld.F90, on which this is based) +! ! D. O'Donnell, FMI +! ! PURPOSE. +! ! -------- +! +! ! INTERFACE. +! ! ---------- +! +! ! *DIAGNOSE_AEROSOL_MASS* IS CALLED FROM *MOD_AER_ACTIV.MAIN* +! +! ! PARAMETER DESCRIPTION UNITS +! ! --------- ----------- ----- +! +! ! - INPUT ARGUMENTS. +! ! ------------------- +! +! ! KIDIA : START OF HORIZONTAL LOOP +! ! KFDIA : END OF HORIZONTAL LOOP +! ! KLON : HORIZONTAL DIMENSION +! ! KLEV : END OF VERTICAL LOOP AND VERTICAL DIMENSION +! ! PGELAM : LONGITUDE +! ! PCLON : COSINE OF LONGITUDE +! ! PSLON : SINE OF LONGITUDE +! ! PGEMU : SINE OF LATITUDE +! +! ! - OUTPUT ARGUMENTS. +! ! ------------------- +! ! PSSMASS : mass mixing ratio of seasalt aerosol +! ! PSO4MASS : mass mixing ratio of sulfate aerosol +! ! POMMASS : mass mixing ratio of organic aerosol +! ! PBCMASS : mass mixing ratio of black carbon aerosol +! ! PDUMASS : mass mixing ratio of mineral dust aerosol +! +! USE PARKIND1 ,ONLY : JPIM ,JPRB +! USE YOMHOOK ,ONLY : LHOOK, DR_HOOK +! +! USE YOMCST , ONLY : RG ,RD ,RETV ,& +! & RLVTT ,RTT ,RPI, RLSTT +! USE YOECLDP , ONLY : RCLCRIT ,RLCRITSNOW, RCLDMAX,& +! & RNICE , LAERLIQAUTOLSP, LAERLIQCOLL, LAERICESED, LAERICEAUTO +! USE YOEAEROP , ONLY : ALF_SS, ALF_SU, ALF_BC, ALF_DD, ALF_OM !>>dod << +! USE YOEAERSNK, ONLY : RRHTAB +! USE YOERAD , ONLY : LEPO3RA +! USE YOE_AERO_M7_DATA, ONLY: NSOL +! USE YOETHF , ONLY : R2ES ,R3LES ,R3IES ,R4LES ,& +! & R4IES ,R5LES ,R5IES ,R5ALVCP ,R5ALSCP ,& +! & RALVDCP ,RALSDCP ,RTWAT ,& +! & RTICE ,RTICECU ,& +! & RTWAT_RTICE_R ,RTWAT_RTICECU_R,& +! & RKOOP1 ,RKOOP2 +! +! IMPLICIT NONE +! +! ! input variables +! INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA +! INTEGER(KIND=JPIM),INTENT(IN) :: KFDIA +! INTEGER(KIND=JPIM),INTENT(IN) :: KLON +! INTEGER(KIND=JPIM),INTENT(IN) :: KLEV +! REAL(KIND=JPRB) ,INTENT(IN) :: PAPH(KLON,KLEV+1) +! REAL(KIND=JPRB) ,INTENT(IN) :: PAP(KLON,KLEV) +! REAL(KIND=JPRB) ,INTENT(IN) :: PT(KLON,KLEV) +! REAL(KIND=JPRB) ,INTENT(IN) :: PQ(KLON,KLEV) +! REAL(KIND=JPRB) ,INTENT(IN) :: PQSAT(KLON,KLEV) +! REAL(KIND=JPRB) ,INTENT(IN) :: PGELAM(KLON) +! REAL(KIND=JPRB) ,INTENT(IN) :: PCLON(KLON) +! REAL(KIND=JPRB) ,INTENT(IN) :: PSLON(KLON) +! REAL(KIND=JPRB) ,INTENT(IN) :: PGEMU(KLON) +! +! ! output +! REAL(KIND=JPRB), INTENT(OUT) :: PSSMASS(KLON,KLEV) +! REAL(KIND=JPRB), INTENT(OUT) :: PSO4MASS(KLON,KLEV) +! REAL(KIND=JPRB), INTENT(OUT) :: POMMASS(KLON,KLEV) +! REAL(KIND=JPRB), INTENT(OUT) :: PBCMASS(KLON,KLEV) +! REAL(KIND=JPRB), INTENT(OUT) :: PDUMASS(KLON,KLEV) +! +! !---------------------------------------------------------------------- +! +! ! local arrays +! +! ! Aerosol arrays +! REAL(KIND=JPRB) :: ZAOD(KLON,6,KLEV) ! aerosol optical depth +! REAL(KIND=JPRB) :: ZOZONE(KLON,KLEV) ! O3 concentration, not currently used +! REAL(KIND=JPRB) :: ZMAERMN(6) ! annual column mean mass of aerosol +! REAL(KIND=JPRB) :: ZECPO3(KLON,KLEV) ! dummy prognostic ozone array +! REAL(KIND=JPRB) :: ZQS(KLON,KLEV) ! saturation +! +! REAL(KIND=JPRB) :: ZS0, ZSCRITHOMO, ZSVP, ZTEMPC +! REAL(KIND=JPRB) :: ZNCRIT_GIERENS, ZNCRIT_REN +! REAL(KIND=JPRB) :: ZNICEHOMO +! !REAL(KIND=JPRB) :: ZLIQCLD, ZICERE +! +! REAL(KIND=JPRB) :: ZCLD +! REAL(KIND=JPRB) :: ZRLIQ_CRIT, ZRICE_CRIT ! critical radii for autoconversion process +! +! ! for RH look up tables +! INTEGER(KIND=JPIM) :: IRH(KLON,KLEV) +! INTEGER(KIND=JPIM) :: JTYP, JTAB, IBIN +! INTEGER(KIND=JPIM) :: JAERSS, JAERDU, JAEROM, JAERSU, JAERBC +! +! ! these are reduced compared to USE YOEAEROP, since 1 band only +! !REAL(KIND=JPRB) :: ZALF_BC(1) +! !REAL(KIND=JPRB) :: ZALF_DD(3) +! !REAL(KIND=JPRB) :: ZALF_OM(12) +! !REAL(KIND=JPRB) :: ZALF_SS(12,3) +! !REAL(KIND=JPRB) :: ZALF_SU(12) +! !REAL(KIND=JPRB) :: ZRHTAB(12) +! +! REAL(KIND=JPRB) :: ZALF, ZRH, ZWTOT, ZALF_SU, ZALF_BC, ZALF_OM, ZALF_SS, ZALF_DU +! +! ! general arrays +! REAL(KIND=JPRB) :: ZTHF(KLON,KLEV+1) ! T on half levels +! +! REAL(KIND=JPRB) :: ZDPR +! +! ! misc variables +! REAL(KIND=JPRB) :: ZEPSEC +! INTEGER(KIND=JPIM) :: IWAVL +! INTEGER(KIND=JPIM) :: JK, JL +! +! REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +! !------------------------ +! ! interface include files +! !------------------------ +!#include "radact.intfb.h" +! +!#include "fcttre.h" +! +! !-------------------------------------------------------------------------- +! +! IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.DIAGNOSE_AEROSOL_MASS',0,ZHOOK_HANDLE) +! +! !###################################################################### +! ! 1.0 Basic variables +! !###################################################################### +! +! ZEPSEC=1.E-10_JPRB +! IWAVL=8 ! reference to 550 nm +! +! ! move to cldp module +! ZRLIQ_CRIT=9.3E-6_JPRB ! cloud to rain critical radius +! ZWTOT=0.1_JPRB ! governs critical N +! +! !---initialization +! PSSMASS(:,:) = 0.0_JPRB +! PSO4MASS(:,:) = 0.0_JPRB +! POMMASS(:,:) = 0.0_JPRB +! PBCMASS(:,:) = 0.0_JPRB +! PDUMASS(:,:) = 0.0_JPRB +! +! ! change to vector vmass +! DO JK=1,KLEV +! DO JL=KIDIA,KFDIA +! ZQS(JL,JK)=FOEEWM(PT(JL,JK))/PAP(JL,JK) +! ZQS(JL,JK)=MIN(0.5_JPRB,ZQS(JL,JK)) +! ZQS(JL,JK)=ZQS(JL,JK)/(1.0_JPRB-RETV*ZQS(JL,JK)) +! ENDDO +! ENDDO +! DO JK=2,KLEV +! DO JL=KIDIA,KFDIA +! ZTHF(JL,JK)=(PT(JL,JK-1)*PAP(JL,JK-1)& +! & *(PAP(JL,JK)-PAPH(JL,JK))& +! & +PT(JL,JK)*PAP(JL,JK)*(PAPH(JL,JK)-PAP(JL,JK-1)))& +! & *(1.0_JPRB/(PAPH(JL,JK)*(PAP(JL,JK)-PAP(JL,JK-1)))) +! ENDDO +! ENDDO +! +! DO JL=KIDIA,KFDIA +! ZTHF(JL,KLEV+1)=PT(JL,KLEV) ! should be surface temperature +! ZTHF(JL,1)=PT(JL,1) +! ENDDO +! +! IF (LEPO3RA) THEN +! DO JK=1,KLEV +! DO JL=KIDIA,KFDIA +! ZECPO3(JL,JK)=0.0_JPRB +! ENDDO +! ENDDO +! ENDIF +! +! !###################################################################### +! ! 2. Retrieve aerosols optical depths +! !###################################################################### +! ! line 2: KRINT=1, KDLON=KLON , P2=KLON, KSHIFT=0, +! ! line 4: ozone set to dummy variable. +! +! CALL RADACT ( KIDIA , KFDIA, KLON , KLEV,& +! & 1 , KLON , KLON , 0 , 1 ,& +! & PAPH , & +! & PGELAM, PGEMU, PCLON, PSLON, ZTHF,& +! & PQ , PQSAT , ZECPO3,& +! & ZAOD, ZOZONE ) +! +! +! !###################################################################### +! ! 3. Retrieve Aerosol mass from Tau +! !###################################################################### +! +! ! RADACT order: +! ! 1=sulfate + organics +! ! 2=sea salt +! ! 3=black carbon +! ! 4=mineral dust +! ! 5=Volcanic +! ! 6=Background +! ! set up indices +! JAERSU=1 +! JAERSS=2 +! JAERDU=3 +! JAERBC=4 +! JAEROM=1 +! +! +! !======================================== +! ! conversion of aerosols from Tau to Mass +! !======================================== +! !-- define RH index from "clear-sky" (not yet!) relative humidity +! +! ! for now fix to using Bin 1, meaning the smallest SS particles +! IBIN=1 +! +! ! taken from YOEAEROP: 17- band data for IWAVL=8 corresponding to 550nm +! +! DO JK=1,KLEV +! DO JL=KIDIA,KFDIA +! ZRH=100.0_JPRB*PQ(JL,JK)/PQSAT(JL,JK) +! ZRH=MIN(MAX(ZRH,1.0_JPRB),100.0_JPRB) +! !>>dod +! IRH(JL,JK) = 1 +! !< RRHTAB(JTAB)) THEN +! IRH(JL,JK)=JTAB +! ENDIF +! ENDDO +! ENDDO +! ENDDO +! +! +! ZALF_BC=ALF_BC(IWAVL) +! ZALF_DU=ALF_DD(IBIN,IWAVL) +! +! DO JK=1,KLEV +! DO JL=KIDIA,KFDIA +! +! ZALF_SU=ALF_SU(IRH(JL,JK),IWAVL) +! ZALF_OM=ALF_OM(IRH(JL,JK),IWAVL) +! ZALF_SS=ALF_SS(IRH(JL,JK),IWAVL,IBIN) +! +! ZDPR=PAPH(JL,JK+1)-PAPH(JL,JK) +! +! !---sulfate and organics: allocate 50% to the sulfate mass and 50% to organics +! IF (ZALF_SU /= 0.0_JPRB .AND. ZDPR /=0.0_JPRB ) THEN +! ! PSO4MASS(JL,JK) = ZAOD(JL,JAERSU,JK)*RG/(ZDPR*ZALF_SU*1000._JPRB) +! PSO4MASS(JL,JK) = 0.5_JPRB*ZAOD(JL,JAERSU,JK)*RG/(ZDPR*ZALF_SU*1000._JPRB) +! END IF +! +! IF (ZALF_OM /= 0.0_JPRB .AND. ZDPR /=0.0_JPRB ) THEN +! ! POMMASS(JL,JK) = 0._JPRB +! POMMASS(JL,JK) = 0.5_JPRB*ZAOD(JL,JAERSU,JK)*RG/(ZDPR*ZALF_OM*1000._JPRB) +! END IF +! +! !---black carbon +! IF (ZALF_BC /= 0.0_JPRB .AND. ZDPR /=0.0_JPRB ) THEN +! PBCMASS(JL,JK) = ZAOD(JL,JAERBC,JK)*RG/(ZDPR*ZALF_BC*1000._JPRB) +! END IF +! +! !---sea salt +! IF (ZALF_SS /= 0.0_JPRB .AND. ZDPR /=0.0_JPRB ) THEN +! PSSMASS(JL,JK) = ZAOD(JL,JAERSS,JK)*RG/(ZDPR*ZALF_SS*1000._JPRB) +! END IF +! +! !---mineral dust +! IF (ZALF_DU /= 0.0_JPRB .AND. ZDPR /=0.0_JPRB ) THEN +! PDUMASS(JL,JK) = ZAOD(JL,JAERDU,JK)*RG/(ZDPR*ZALF_DU*1000._JPRB) +! END IF +! +! END DO +! END DO +! +! IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.DIAGNOSE_AEROSOL_MASS', 1, ZHOOK_HANDLE) +! +! END SUBROUTINE DIAGNOSE_AEROSOL_MASS + +! SUBROUTINE LIQ_CLOUD_RE(KIDIA, KFDIA, KLON, KTDIA, KLEV, LCLOUD, PL, PA, PRHO, PGFL) +! +! ! *LIQ_CLOUD_RE* calculates the effective radius (Re) for liquid clouds +! +! !---inherited functions, types, variables and constants +! USE YOMHOOK, ONLY: LHOOK, DR_HOOK +! USE YOMCST, ONLY: RPI +! USE YOECLDP, ONLY: RCLDMAX, PPRHO_WAT +! USE YOM_YGFL, ONLY: YGFL, YCDNC, YRE_LIQ +! +! IMPLICIT NONE +! +! !---subroutine interface +! ! Input: +! INTEGER(KIND=JPIM), INTENT(IN) :: KIDIA +! INTEGER(KIND=JPIM), INTENT(IN) :: KFDIA +! INTEGER(KIND=JPIM), INTENT(IN) :: KLON +! INTEGER(KIND=JPIM), INTENT(IN) :: KTDIA +! INTEGER(KIND=JPIM), INTENT(IN) :: KLEV +! +! LOGICAL, INTENT(IN) :: LCLOUD(KLON,KLEV) +! +! REAL(KIND=JPRB), INTENT(IN) :: PL(KLON,KLEV) +! REAL(KIND=JPRB), INTENT(IN) :: PA(KLON,KLEV) +! REAL(KIND=JPRB), INTENT(IN) :: PRHO(KLON,KLEV) +! +! ! Input and output +! REAL(KIND=JPRB), INTENT(INOUT) :: PGFL(KLON,KLEV,YGFL%NDIM) +! +! !---local data: +! REAL(KIND=JPRB) :: ZCLD, ZRE_LIQ(KLON,KLEV) +! REAL(KIND=JPRB) :: ZEPSEC +! REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +! INTEGER(KIND=JPIM) :: JL,JK +! +! !---executable procedure +! IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.LIQ_CLOUD_RE', 0, ZHOOK_HANDLE) +! +! ZEPSEC = 1.E-10_JPRB +! +!! this is effective radius calculation +! DO JK=KTDIA,KLEV +! DO JL=KIDIA,KFDIA +! ZCLD=PL(JL,JK)/MAX(PA(JL,JK),ZEPSEC) +! ZCLD=MIN(MAX(ZCLD,0.0_JPRB),RCLDMAX) +! +! ! 2.387e-10 is 3/(4*pi*rho_liq*10^6) [10^6 for N in right units] +! ! PRE_LIQ(JL,JK)=(2.387e-10_JPRB*PRHO(JL,JK)*ZCLD/PCDNC(JL,JK))**0.333_JPRB +! +! ZRE_LIQ(JL,JK) = (0.75_JPRB*PRHO(JL,JK)*ZCLD / & +! & (RPI*PPRHO_WAT*1.E6_JPRB*PGFL(JL,JK,YCDNC%MP9_PH)))**0.333_JPRB +! END DO +! END DO +! +! ZRE_LIQ = ZRE_LIQ*1.E6_JPRB +! +! ! This taken from old radlswr:- +! ! Limit effective radius to within defined range +! ZRE_LIQ = MAX(ZRE_LIQ, 4.0_JPRB) +! ZRE_LIQ = MIN(ZRE_LIQ,30.0_JPRB) +! +! ! Set R_eff_liq only where there are clouds +! PGFL(KIDIA:KFDIA,KTDIA:KLEV,YRE_LIQ%MP9_PH) = & +! & MERGE( ZRE_LIQ(KIDIA:KFDIA,KTDIA:KLEV), & +! & PGFL(KIDIA:KFDIA,KTDIA:KLEV,YRE_LIQ%MP9_PH), & +! & LCLOUD(KIDIA:KFDIA,KTDIA:KLEV) ) +! +! IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.LIQ_CLOUD_RE', 1, ZHOOK_HANDLE) +! +! END SUBROUTINE LIQ_CLOUD_RE + + SUBROUTINE ICE_CLOUD_PROP(KIDIA, KFDIA, KLON, KLEV, PT, PRHO, PI, PA, PAP, & + & PQSAT, PSO4MASS, PBCMASS, PDUMASS, PGFL, YDMODEL, PRE_ICE, PICNC) + + ! This subroutine is mainly a copy/paste of the ice phase microphysics + ! implemented in the subroutine aer_cld.F90 + + !---inherited functions, types, variables and constants + USE YOMHOOK, ONLY: LHOOK, DR_HOOK + USE YOMCST, ONLY: RPI, RTT, RETV, RLSTT, RLVTT + !USE YOECLDP, ONLY: RNICE, PPRHO_ICE, RCLDMAX + !USE YOE_AERO_M7_DATA, ONLY: NSOL + USE TM5M7_DATA, ONLY: NSOL + !USE YOM_YGFL, ONLY: YGFL, YICNC, YRE_ICE + USE YOETHF , ONLY : R2ES ,R3LES ,R3IES ,R4LES ,& + & R4IES ,R5LES ,R5IES ,R5ALVCP ,R5ALSCP ,& + & RALVDCP ,RALSDCP ,RTWAT ,& + & RTICE ,RTICECU ,& + & RTWAT_RTICE_R ,RTWAT_RTICECU_R,& + & RKOOP1 ,RKOOP2 + USE TYPE_MODEL, ONLY: MODEL + + IMPLICIT NONE + + !---subroutine interface + ! *ICE_CLD_PROP* is called from AER_ACTIV + ! + ! Input: + TYPE(MODEL), INTENT(IN) :: YDMODEL + INTEGER(KIND=JPIM), INTENT(IN) :: KIDIA + INTEGER(KIND=JPIM), INTENT(IN) :: KFDIA + INTEGER(KIND=JPIM), INTENT(IN) :: KLON + INTEGER(KIND=JPIM), INTENT(IN) :: KLEV + + REAL(KIND=JPRB), INTENT(IN) :: PT(KLON,KLEV) + REAL(KIND=JPRB), INTENT(IN) :: PRHO(KLON,KLEV) + REAL(KIND=JPRB), INTENT(IN) :: PI(KLON,KLEV) + REAL(KIND=JPRB), INTENT(IN) :: PA(KLON,KLEV) + REAL(KIND=JPRB), INTENT(IN) :: PAP(KLON,KLEV) + REAL(KIND=JPRB), INTENT(IN) :: PQSAT(KLON,KLEV) + REAL(KIND=JPRB), INTENT(IN) :: PSO4MASS(KLON,KLEV) + REAL(KIND=JPRB), INTENT(IN) :: PBCMASS(KLON,KLEV) + REAL(KIND=JPRB), INTENT(IN) :: PDUMASS(KLON,KLEV) + + ! Input and output: + REAL(KIND=JPRB), INTENT(INOUT) :: PGFL(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NDIM) + REAL(KIND=JPRB), INTENT(INOUT) :: PICNC(KLON,KLEV) + REAL(KIND=JPRB), INTENT(INOUT) :: PRE_ICE(KLON,KLEV) + + + !---local data + INTEGER(KIND=JPIM) :: JL,JK + + REAL(KIND=JPRB) :: ZICENUCLEI + REAL(KIND=JPRB) :: ZICNC + REAL(KIND=JPRB) :: ZRE_ICE + REAL(KIND=JPRB) :: ZQS ! saturation + REAL(KIND=JPRB) :: ZS0 + REAL(KIND=JPRB) :: ZTEMPC + REAL(KIND=JPRB) :: ZSO4MASS + REAL(KIND=JPRB) :: ZBCMASS + REAL(KIND=JPRB) :: ZDUMASS + REAL(KIND=JPRB) :: ZMAERMEAN_SO4 + REAL(KIND=JPRB) :: ZMAERMEAN_BC + REAL(KIND=JPRB) :: ZMAERMEAN_DU + REAL(KIND=JPRB) :: ZNICEHOMO + REAL(KIND=JPRB) :: ZSO + REAL(KIND=JPRB) :: ZSVP + REAL(KIND=JPRB) :: ZSCRITHOMO + REAL(KIND=JPRB) :: ZWTOT + REAL(KIND=JPRB) :: ZRHO_ICE + REAL(KIND=JPRB) :: ZRICE_CRIT + REAL(KIND=JPRB) :: ZNCRIT_GIERENS, ZNCRIT_REN + REAL(KIND=JPRB) :: ZCLD + REAL(KIND=JPRB) :: ZZEPSEC + REAL(KIND=JPRB) :: ZHOOK_HANDLE + + + !---executable procedure + IF (LHOOK) CALL DR_HOOK('ICE_CLD_PROP', 0, ZHOOK_HANDLE) + ASSOCIATE(YGFL=>YDMODEL%YRML_GCONF%YGFL,YDECLDP=>YDMODEL%YRML_PHY_EC%YRECLDP) + ASSOCIATE(YICNC=>YGFL%YICNC, YRE_ICE=>YGFL%YRE_ICE, & + & RNICE=>YDECLDP%RNICE, RCLDMAX=>YDECLDP%RCLDMAX) + + ! move to cldp module + ZWTOT=0.1_JPRB ! governs critical N + + ! Table of column/annual mean mass of aerosol + ! converted to microgram per m**3 + ! ZMAERMEAN_SO4=1.02E-09_JPRB*1.E9_JPRB + ZMAERMEAN_SO4=0._JPRB + ! ZMAERMEAN_SS=2.12E-10_JPRB*1.E9_JPRB + ZMAERMEAN_DU=1.01E-09_JPRB*1.E9_JPRB + ZMAERMEAN_BC=3.05E-11_JPRB*1.E9_JPRB + + ZZEPSEC=1.E-10_JPRB + + ZRHO_ICE=900.0_JPRB + + !--------------------------------------------------------------------- + ! Turn aerosol mass into a Ice Number concentration for ice processes + !--------------------------------------------------------------------- + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + + !---aerosol masses in ug m-3 + ! ZSO4MASS = PSO4MASS(JL,JK)*PRHO(JL,JK)*1.E9_JPRB + ZSO4MASS = 0._JPRB + ZBCMASS = PBCMASS(JL,JK)*PRHO(JL,JK)*1.E9_JPRB + ZDUMASS = PDUMASS(JL,JK)*PRHO(JL,JK)*1.E9_JPRB + + ! 0.01_JPRB is "default" value from + ! Demott et al. Ice SS=55% or Meyers et al. 1992 JAS, ISS=25% + ! In a prognostic scheme this will be function of clear sky humidity + + ! By relating IN to Aerosol mass we are assuming that the mode of the + ! Aerosol size distribution lies in the accumulation or coarse mode + + ! The relationship will implicitly introduce the exponential height + ! dependence that Sassen (1992) and K and Curry (1998) explicitly + ! introduced to their parameterizations. + + ZICENUCLEI=0.01_JPRB*& + & (ZSO4MASS + ZBCMASS + ZDUMASS) & + & /(ZMAERMEAN_SO4 + ZMAERMEAN_BC +ZMAERMEAN_DU) + ZICENUCLEI=MAX(ZICENUCLEI,0.0_JPRB) + + ! T in oC + ZTEMPC=PT(JL,JK)-RTT + + ! Re form for ice crystals from Liou and Oort 1994 + ! used to derive Re(ice) as in Lohmann JC 2002 + ZNICEHOMO=0.0_JPRB + ZRE_ICE=0.5_JPRB*(326.3_JPRB+ZTEMPC* & + & (12.42_JPRB + ZTEMPC*(0.197_JPRB + ZTEMPC*0.0012_JPRB))) + ZRE_ICE=MAX(ZRE_ICE,0.0_JPRB) + + ! effect Re to volume mean from S Moss or Lohmann and Kaercher papers 200? + ! ZRE_ICE on both LHS and RHS ?? + ZRE_ICE=(MAX(SQRT(5.113E6_JPRB+2.809E3_JPRB*ZRE_ICE**3.0_JPRB)-2.261E3_JPRB,0.0_JPRB))**0.333_JPRB + ZRE_ICE=MAX(ZRE_ICE,1.0_JPRB) ! diameter minimum 1.0 microns + + ! more default values if not applying + ZICNC=RNICE ! place as default + + ZQS=PQSAT(JL,JK) + ZQS=MIN(0.5_JPRB,ZQS) + ZQS=ZQS/(1.0_JPRB-RETV*ZQS) + + IF (PT(JL,JK)<238._JPRB .AND. PI(JL,JK)>ZZEPSEC) THEN + ZS0=1.3_JPRB + ZSCRITHOMO=2.349_JPRB-PT(JL,JK)/259.0_JPRB !ren form of Koop 2000 + ZSVP=MAX(ZZEPSEC,ZQS*PAP(JL,JK)/0.622_JPRB) + + ! Klaus Gierens critical ice nuclei: Gierens (2003) + ZNCRIT_GIERENS=2.81E11_JPRB*(10.0_JPRB**(4.0_JPRB-0.02_JPRB*PT(JL,JK)))**0.75_JPRB& + &*(ZWTOT**1.5_JPRB)*PAP(JL,JK)**1.5_JPRB/& + &(PT(JL,JK)**5.415_JPRB*(1.5_JPRB*ZSVP)**0.5_JPRB*(ZSCRITHOMO-ZS0)**0.75_JPRB) + ZNCRIT_GIERENS=ZNCRIT_GIERENS/1.E6_JPRB ! cm**-3 + + ! Ren and Mackensie QJRMS 2005 critical ice nuclei + ZNCRIT_REN=5.4E10_JPRB*(ZWTOT**1.5_JPRB)*PAP(JL,JK)**1.5_JPRB*& + & (ZSCRITHOMO/(ZSCRITHOMO-1.0_JPRB))**1.5_JPRB/ & + & (PT(JL,JK)**5.415_JPRB*(1.5_JPRB*ZSVP)**0.5_JPRB) + ZNCRIT_REN=ZNCRIT_REN/1.E6_JPRB ! cm**-3 + + ! from Re derive the number concentration - here ice density is 900 kg/m**3 + ! Re is in microns, 1e18 factor + ZCLD=PI(JL,JK)/MAX(PA(JL,JK),ZZEPSEC) + ZCLD=MIN(MAX(ZCLD,0.0_JPRB),RCLDMAX) + IF (ZCLD>ZZEPSEC) THEN + ZNICEHOMO=0.75_JPRB*PRHO(JL,JK)*ZCLD/(RPI*ZRHO_ICE*1.0E-18_JPRB*ZRE_ICE**3.0_JPRB) + ENDIF + ZNICEHOMO = ZNICEHOMO/1.E6_JPRB ! cm**-3 + + ! following Ren and Mackensie, 2005, linearly interpolate to get Ice number + IF (ZICENUCLEI 1) THEN +! +! ZW_WIDTH = (RW_MAX - RW_MIN) / REAL(nw,JPRB) +! +! DO JW=1,KPDF +! DO JK=KTDIA,KLEV +! PW(KIDIA:KFDIA,JK,JW) = RW_MIN + (REAL(JW,JPRB) - 0.5_JPRB) * ZW_WIDTH +! +! PWPDF(KIDIA:KFDIA,JK,JW) = ZSQ2PI * RINVSIGMA * & +! & EXP( -(PW(KIDIA:KFDIA,JK,JW) - ZWLARGE(KIDIA:KFDIA,JK))**2._JPRB & +! & / R2SIGMA2) +! END DO +! END DO +! ELSE +! ZW_PRESC(KIDIA:KFDIA) = MERGE(RUPDRAFT_LAND, RUPDRAFT_SEA, & +! & PLSM(KIDIA:KFDIA) > 0.5_JPRB) +! DO JK=KTDIA,KLEV +! PW(KIDIA:KFDIA,JK,1) = MERGE(ZW_PRESC(KIDIA:KFDIA), 0._JPRB, & +! & ZWLARGE(KIDIA:KFDIA,JK) > RW_MIN) +! PWPDF(KIDIA:KFDIA,JK,1) = 1._JPRB +! END DO +! END IF +! +! IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.PDF_UPDRAFT',1,ZHOOK_HANDLE) +! END SUBROUTINE PDF_UPDRAFT + +! SUBROUTINE GET_CDNC_FACTOR(KIDIA,KFDIA,KLON,PGEMU,PGELAM,PMAC2SP_CDNC_FACTOR) +! +! USE YOMHOOK , ONLY : LHOOK, DR_HOOK +! USE YOMCST , ONLY : RPI, RDAY +! USE YOMCT0 , ONLY : LTWOTL, LNF +! USE YOMCT2 , ONLY : NSTAR2 +! USE YOMDYN , ONLY : TSTEP +! USE YOMRIP , ONLY : NINDAT, NSTADD +! USE YOMLUN , ONLY : NULOUT +! USE YOERAD , ONLY : MAC2SP_LAMDA, NCMIPFIXYR, LMAC2SP +! USE AER_MACV2SP_MOD, ONLY: SP_AOP_PROFILE, MAC2SP_YEAR_MIN, MAC2SP_YEAR_MAX +! USE DAY_NUMBER_MOD, ONLY: NUMBER_OF_DAY +! +! IMPLICIT NONE +! +! INTEGER(KIND=JPIM), INTENT(IN) :: KIDIA +! INTEGER(KIND=JPIM), INTENT(IN) :: KFDIA +! INTEGER(KIND=JPIM), INTENT(IN) :: KLON +! REAL(KIND=JPRB), INTENT(IN) :: PGEMU(KLON) +! REAL(KIND=JPRB), INTENT(IN) :: PGELAM(KLON) +! REAL(KIND=JPRB), INTENT(OUT):: PMAC2SP_CDNC_FACTOR(KLON) +! +! !---the CDNC factor doesn't vary with height, thus only 1 level is needed +! INTEGER(KIND=JPIM), PARAMETER :: KLEV=1 +! +! REAL(KIND=JPRB) :: ZR2D, ZGLAT(KLON), ZGLON(KLON) +! REAL(KIND=JPRB) :: YEAR_FR, KNDY +! REAL(KIND=JPRB) :: PGEOH(KLON,KLEV+1) +! +! INTEGER(KIND=JPIM) :: IDY0, IMN0, IYR0, IDY, IMN, IYR, IDOY +! INTEGER(KIND=JPIM) :: IZT, ISTADD, ITIME +! INTEGER(KIND=JPIM) :: ILMONTH(12) +! +! INTEGER(KIND=JPIM) :: JL +! +! !-- variables for MAC2SP anthropogenic aerosol +! REAL(KIND=JPRB):: AOD_MAC2SP(KLON,KLEV) +! REAL(KIND=JPRB):: SSA_MAC2SP(KLON,KLEV) +! REAL(KIND=JPRB):: ASY_MAC2SP(KLON,KLEV) +! +! REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +!#include "updcal.intfb.h" +!#include "fcttim.h" +! +! !---executable procedure +! IF (LHOOK) CALL DR_HOOK('GET_CDNC_FACTOR', 0, ZHOOK_HANDLE) +! +! ! fake geopotential, doesn't matter for the CDNC factor +! PGEOH(:,1)=100._JPRB +! PGEOH(:,2)=10._JPRB +! +! ZR2D=180.0_JPRB/RPI +! DO JL=KIDIA,KFDIA +! ZGLAT(JL)= ASIN(PGEMU(JL)) * ZR2D +! ZGLON(JL)= PGELAM(JL) * ZR2D +! END DO +! +! ! Prepare year fraction +! IF(.NOT.LNF.AND.NSTADD == 0) THEN +! ! IN CASE OF RESTART: +! ITIME=NINT(TSTEP,KIND(ITIME)) +! IF (LTWOTL) THEN +! IZT=NINT(TSTEP*(REAL(NSTAR2,JPRB)+0.5_JPRB),KIND(IZT)) +! ELSE +! IZT=INT(ITIME,KIND(IZT))*INT(NSTAR2,KIND(IZT)) +! ENDIF +! ISTADD=INT(IZT/NINT(RDAY,KIND(IZT)),KIND(ISTADD)) +! ELSE +! ISTADD=NSTADD +! ENDIF +! IYR0=NCCAA(NINDAT) +! IMN0=NMM(NINDAT) +! IDY0=NDD(NINDAT) +! +! CALL UPDCAL(IDY0,IMN0,IYR0, ISTADD, IDY,IMN,IYR, ILMONTH, NULOUT) +! +! ! Day number and total number of days for that year +! CALL NUMBER_OF_DAY(IDY,IMN,IYR,IDOY) +! IF(MOD(IYR,4) == 0 .AND. MOD(IYR,400) /= 100 & +! & .AND. MOD(IYR,400) /= 200 .AND. MOD(IYR,400) /= 300)THEN +! KNDY=366._JPRB +! ELSE +! KNDY=365._JPRB +! ENDIF +! +! ! Replace IYR with NCMIPFIXYR +! IF (NCMIPFIXYR>0) IYR=NCMIPFIXYR +! +! ! Limit IYR to available dataset +! IYR = MIN(MAC2SP_YEAR_MAX, MAX(MAC2SP_YEAR_MIN, IYR)) +! +! YEAR_FR = IYR + (REAL(IDOY,JPRB) - 0.5_JPRB)/KNDY +! +! CALL SP_AOP_PROFILE (KLEV ,KIDIA ,KFDIA ,KLON ,MAC2SP_LAMDA(1) , & +! & ZGLON ,ZGLAT ,YEAR_FR ,PGEOH ,PMAC2SP_CDNC_FACTOR , & +! & AOD_MAC2SP ,SSA_MAC2SP ,ASY_MAC2SP ) +! +! IF (LHOOK) CALL DR_HOOK('GET_CDNC_FACTOR',1,ZHOOK_HANDLE) +! END SUBROUTINE GET_CDNC_FACTOR +! SUBROUTINE SETUP_ACI_DIAG +! +! USE YOMHOOK, ONLY: LHOOK, DR_HOOK +! USE PHY_DIAG_MOD, ONLY: NEW_DIAG_SET, NEW_DIAGNOSTIC +! USE YOM_GRIB_CODES, ONLY: NGRBCDNC, NGRBREFF, NGRBLIQCLDTIME +! USE YOMLUN, ONLY: NULOUT +! +! IMPLICIT NONE +! +! INTEGER(KIND=JPIM) :: ISET +! REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +! IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.SETUP_ACI_DIAG',0,ZHOOK_HANDLE) +! +! CALL NEW_DIAG_SET('ACI', ISET) +! CALL NEW_DIAGNOSTIC(ISET, 'CDNC', 3, NGRBCDNC, .TRUE., .FALSE., D_CDNC) +! CALL NEW_DIAGNOSTIC(ISET, 'REFF', 3, NGRBREFF, .FALSE., .TRUE., D_REFF) +! CALL NEW_DIAGNOSTIC(ISET, 'LIQ_CLD_TIME', 3, NGRBLIQCLDTIME, .TRUE., .FALSE., & +! & D_LIQCLDT) +! +! IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.SETUP_ACI_DIAG',1,ZHOOK_HANDLE) +! END SUBROUTINE SETUP_ACI_DIAG + +END MODULE YOE_AER_ACTIV diff --git a/ifs-source/arpifs/module/yoeaeratm.F90 b/ifs-source/arpifs/module/yoeaeratm.F90 index 75112719..8826a5ac 100644 --- a/ifs-source/arpifs/module/yoeaeratm.F90 +++ b/ifs-source/arpifs/module/yoeaeratm.F90 @@ -56,6 +56,7 @@ MODULE YOEAERATM INTEGER(KIND=JPIM) :: NTYPAER(NMAXTAER) INTEGER(KIND=JPIM) :: NAER_BLNUCL INTEGER(KIND=JPIM) :: NAERSCAV +INTEGER(KIND=JPIM) :: NAERACT REAL(KIND=JPRB) :: RGRATE @@ -114,6 +115,7 @@ MODULE YOEAERATM ! LAERHYDRO : .T. hygroscopic effects on BC and OM aerosols ! LAERNGAT : .T. prevents negative aerosol concentrations ! NAERSCAV : aerosol scanvenging scheme: 1=historical, 2=from CB05, 3=Luo et al. 2019 +! NAERACT : Activation scheme selection: 1=Morales and Nenes full, 2=Abdul-Razzak & Ghan ! LAERSEDIM : .T. sedimentation is active ! LAERSEDIMSS : .T. special sedimentation for sea-salt is active ! LAERSURF : .T. if surface emissions @@ -186,6 +188,7 @@ SUBROUTINE PRINT_CONFIGURATION(SELF, KDEPTH, KOUTNO) WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'LAERLISI = ', SELF%LAERLISI WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'LAERNGAT = ', SELF%LAERNGAT WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'NAERSCAV = ', SELF%NAERSCAV +WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'NAERACT = ', SELF%NAERACT WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'LAERSEDIM = ', SELF%LAERSEDIM WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'LAERSEDIMSS = ', SELF%LAERSEDIMSS WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'LAERSURF = ', SELF%LAERSURF diff --git a/ifs-source/arpifs/namelist/naeaer.nam.h b/ifs-source/arpifs/namelist/naeaer.nam.h index d512fdac..ee7fefb3 100644 --- a/ifs-source/arpifs/namelist/naeaer.nam.h +++ b/ifs-source/arpifs/namelist/naeaer.nam.h @@ -22,7 +22,8 @@ NAMELIST/NAEAER/& & NDRYDEP , NDUSRCP , & & RAERDUB , RDDUAER , RFCTDUR , RFCTSSR , RLATVOL , RLONVOL , & & RSUCV1 , RSUCV2 , & - & NAERSCAV , LSEASALT_RH80, NDRYDEPVEL_DYN, RAERDUST_REBOUND,& + & NAERSCAV , NAERACT , & + & LSEASALT_RH80, NDRYDEPVEL_DYN, RAERDUST_REBOUND,& & LAERDUSTSOURCE, LAERDUST_NEWBIN, YAERO_DESC, NSO4SCHEME, & & NAER_BLNUCL, LAERDUSTSIZEVAR ! ----------------------------------------------------------------- diff --git a/ifs-source/arpifs/phys_ec/su_aerw.F90 b/ifs-source/arpifs/phys_ec/su_aerw.F90 index d44f2859..52fc0aaf 100644 --- a/ifs-source/arpifs/phys_ec/su_aerw.F90 +++ b/ifs-source/arpifs/phys_ec/su_aerw.F90 @@ -108,7 +108,8 @@ SUBROUTINE SU_AERW(YDMODEL) & NDDOPTP, NOMOPTP, NSSOPTP, NSUOPTP, NVISWL, NDRYDEP, NDRYDEPVEL_DYN, & & NTYPAER(:), NDDUST, NSO4SCHEME, NSSALT, NDMSO, NPIST, KSTPDBG(:), NSTPDBG,& & NAERWND, NAERLISI, NDUSRCP(:), NAERVOLC, NAERVOLE, NVOLDATS(:), NVOLERUP,& - & NVOLERUZ(:), NVOLOPTP, NVOLHOMO, NINTERPT, NAER_BLNUCL, NVOLDATE(:), NAERSCAV + & NVOLERUZ(:), NVOLOPTP, NVOLHOMO, NINTERPT, NAER_BLNUCL, NVOLDATE(:), NAERSCAV,& + & NAERACT REAL(KIND=JPRB), POINTER :: RAERDUB, RDDUAER(:), RFCTDUR, RFCTSSR, RLATVOL,& & RLONVOL, RSUCV1, RSUCV2, RAERDUST_REBOUND, & & RAERVOLC(:,:), RAERVOLE(:,:), RVOLERUZ(:) @@ -195,6 +196,7 @@ SUBROUTINE SU_AERW(YDMODEL) LAERSCAV_CHEM => YDEAERATM%LAERSCAV_CHEM LAERSOA_CHEM => YDEAERATM%LAERSOA_CHEM NAERSCAV => YDEAERATM%NAERSCAV +NAERACT => YDEAERATM%NAERACT LSEASALT_RH80=> YDEAERATM%LSEASALT_RH80 NTYPAER => YDEAERATM%NTYPAER YAERO_DESC=> YDEAERATM%YAERO_DESC @@ -316,6 +318,7 @@ SUBROUTINE SU_AERW(YDMODEL) LAERSCAV_CHEM =.FALSE. LAERSOA_CHEM =.FALSE. NAERSCAV = 0 + NAERACT = 2 LAERDUSTSOURCE =.FALSE. LAERDUST_NEWBIN =.FALSE. LAERDUSTSIZEVAR =.FALSE. @@ -413,6 +416,8 @@ SUBROUTINE SU_AERW(YDMODEL) LAERNITRATE = .FALSE. LDRYDEPVEL_DYN=.FALSE. + NAERACT = 2 + REPSCAER=1.E-20_JPRB ! minimum value for AOD !-- minimum oceanic production of DMS @@ -497,6 +502,7 @@ SUBROUTINE SU_AERW(YDMODEL) LAERHYGRO=.TRUE. LAERNGAT =.TRUE. NAERSCAV = 2 + NAERACT = 2 LAERDUSTSOURCE =.FALSE. LAERDUST_NEWBIN =.FALSE. LAERDUSTSIZEVAR =.FALSE. @@ -938,6 +944,7 @@ SUBROUTINE SU_AERW(YDMODEL) & ,'' LAERGTOP = '',L1 & & ,'' LAERHYGRO= '',L1 & & ,'' NAERSCAV = '',I1& + & ,'' NAERACT = '',I1& & ,'' LAERCHEM = '',L1& & ,'' LAERNITRATE = '',L1& & ,'' LAERSOA = '',L1& @@ -953,7 +960,7 @@ SUBROUTINE SU_AERW(YDMODEL) & ,'' LAERCLIST= '',L1& & ,'' LAERRAD= '',L1& & )')& - & LAERGBUD,LAERNGAT,LAERDRYDP,LAERSEDIM,LAERSEDIMSS,LAERGTOP,LAERHYGRO,NAERSCAV,LAERCHEM,LAERNITRATE,LAERSOA,LAERSOA_COUPLED, & + & LAERGBUD,LAERNGAT,LAERDRYDP,LAERSEDIM,LAERSEDIMSS,LAERGTOP,LAERHYGRO,NAERSCAV,NAERACT,LAERCHEM,LAERNITRATE,LAERSOA,LAERSOA_COUPLED, & & NDRYDEPVEL_DYN,LAERDUSTSOURCE,LAERDUST_NEWBIN,LAERDUSTSIZEVAR,RAERDUST_REBOUND,LAER6SDIA,& & LAERCLIMZ,LAERCLIMG,LAERCLIST,LAERRAD WRITE(UNIT=NULOUT,FMT='('' NAERLISI = '',I1)') NAERLISI @@ -982,13 +989,14 @@ SUBROUTINE SU_AERW(YDMODEL) & ,'' LAERGTOP = '',L1 & & ,'' LAERHYGRO= '',L1 & & ,'' NAERSCAV = '',I1 & + & ,'' NAERACT = '',I1 & & ,'' LAER6SDIA= '',L1 & & ,'' LAERCLIMZ= '',L1 & & ,'' LAERCLIMG= '',L1 & & ,'' LAERCLIST= '',L1 & & )')& & LAERGBUD,LAERNGAT,LAERDRYDP,LAERSEDIM,LAERSEDIMSS,LAERGTOP,LAERHYGRO, & - & NAERSCAV,LAER6SDIA, & + & NAERSCAV,NAERACT,LAER6SDIA, & & LAERCLIMZ,LAERCLIMG,LAERCLIST WRITE(UNIT=NULOUT,FMT='('' NAERLISI = '',I1 & & )')& From f6ac80a56fd5c863dec2e30ec7c9c8ba289a3f42 Mon Sep 17 00:00:00 2001 From: Eemeli Holopainen Date: Tue, 15 Apr 2025 12:11:54 +0300 Subject: [PATCH 056/129] Delete NAERACT and use NCLOUDACT with activation. Add default scheme for actiation. Some bugfixes. --- .../arpifs/m7/phys_ec/hamm7_interface.F90 | 113 +++++++++++------- .../arpifs/m7/phys_ec/yoe_aer_activ.F90 | 6 +- ifs-source/arpifs/module/yoeaeratm.F90 | 3 - ifs-source/arpifs/namelist/naeaer.nam.h | 3 +- ifs-source/arpifs/phys_ec/su_aerw.F90 | 14 +-- .../arpifs/phys_radi/radiation_scheme.F90 | 7 +- ifs-source/arpifs/phys_radi/suecrad.F90 | 5 +- 7 files changed, 88 insertions(+), 63 deletions(-) diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index 18ad0c96..81ccc9ac 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -321,8 +321,8 @@ SUBROUTINE HAMM7_INTERFACE( & REAL(KIND=JPRB), ALLOCATABLE :: ZAERNGT(:,:) REAL(KIND=JPRB) :: ZDEGRAD, ZEPSCOV, ZEPSWAT, ZRWSAT, ZRWPWP -REAL(KIND=JPRB) :: ZQLWP(KLON,KLEV), ZQLWP2(KLON,KLEV) -REAL(KIND=JPRB) :: ZTMPA, ZTEMP, ZDPOG, ZQIWP, ZPODT +REAL(KIND=JPRB) :: ZQLWP(KLON,KLEV) +REAL(KIND=JPRB) :: ZTMPA!, ZTEMP, ZDPOG, ZQIWP, ZPODT LOGICAL :: LLIQCLD(KLON,KLEV) ! logical for liquid cloud LOGICAL :: LICECLD(KLON,KLEV) ! logical for ice cloud @@ -549,7 +549,6 @@ SUBROUTINE HAMM7_INTERFACE( & ! --- YREAERATM ------------------------------------------- & LAERDRYDP => YREAERATM%LAERDRYDP, & & LAERSEDIM => YREAERATM%LAERSEDIM, & - & NAERACT => YREAERATM%NAERACT, & !eehol: integer to switch activation scheme & LAERSURF => YREAERATM%LAERSURF, & !add logicals for dry dep and sedi & LAER6SDIA => YREAERATM%LAER6SDIA, & & LAERCLIMG => YREAERATM%LAERCLIMG, & @@ -570,6 +569,9 @@ SUBROUTINE HAMM7_INTERFACE( & & RSIGAIR => YRERAD%RSIGAIR, & !!! YAERCLIM is now become YAEROCLIM & NRADFR => YRERAD%NRADFR, & !FREQUENCY OF FULL RADIATION COMPUTATIONS & NAEROOPT => YRERAD%NAEROOPT, & + & NCLOUDACT => YRERAD%NCLOUDACT, & !eehol: integer to switch activation scheme (0=default,1=Morales&Nenes, 2=Abdul-Razzak&Ghan) + & RCCNSEA => YRERAD%RCCNSEA, & !eehol: default ccn value over sea + & RCCNLND => YRERAD%RCCNLND, & !eehol: default ccn value over land ! --- OTHERS ---------------------------------------------- & YDAERM7 => YDPHYAER%YREAEROPT, & ! use this to transfer AOD, SSA and ASY to rad scheme & NWLID => YREAERLID%NWLID, & @@ -1032,8 +1034,18 @@ SUBROUTINE HAMM7_INTERFACE( & ZTKEM1(KIDIA:KFDIA,1:KLEV) = 0._JPRB ! turbulent kinetic energy as zero for now as it is not used (YET!) + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZTMPA = 1.0_JPRB/MAX(ZAP(JL,JK),ZEPSEC) + LLIQCLD(JL,JK) = ( PLP(JL,JK)*ZTMPA ) > ZEPSEC ! logical for liquid cloud + LICECLD(JL,JK) = ( PIP(JL,JK)*ZTMPA ) > ZEPSEC ! logical for ice cloud + ZQLWP(JL,JK) = PLP(JL,JK)/MAX(ZAP(JL,JK),1.E-10_JPRB) ! calculate lwc + ZQLWP(JL,JK) = MIN(MAX(ZQLWP(JL,JK),0.0_JPRB),RCLDMAX) ! treshold lwc + END DO + END DO + !eehol: integer to use M&N activation scheme or AR&G - IF ( NAERACT == 1 ) THEN ! Morales and Nenes activation scheme + IF ( NCLOUDACT == 1 ) THEN ! Morales and Nenes activation scheme !IF ( LCONSIGW ) THEN !eehol: if using the constant sigma_w it is set to 0.8 otherwise use the TKE to calculate (NOT USED YET!) ZSIGMA_W(KIDIA:KFDIA,1:KLEV) = 0.8_JPRB @@ -1061,7 +1073,7 @@ SUBROUTINE HAMM7_INTERFACE( & PGFL(KIDIA:KFDIA,1:KLEV,YRE_LIQ%MP9_PH) = 1.0E-06_JPRB * reffl(KIDIA:KFDIA,1:KLEV,ZKROW) ! convert um to meters and save to PGFL fields PGFL(KIDIA:KFDIA,1:KLEV,YRE_ICE%MP9_PH) = 1.0E-06_JPRB * reffi(KIDIA:KFDIA,1:KLEV,ZKROW) ! convert um to meters and save to PGFL fields - ELSE IF (NAERACT == 2) THEN !eehol: use AR&G scheme + ELSE IF (NCLOUDACT == 2) THEN !eehol: use AR&G scheme !IF ( LCONSIGW ) THEN !eehol: if using the constant sigma_w it is set to 0.8 otherwise use the TKE to calculate (NOT USED YET!!) ZTKEM1(KIDIA:KFDIA,1:KLEV) = ((1/ZTUNPAR)**2)*((0.8_JPRB)**2) !eehol: this is converted back to sigma_w in mo_activ.F90 @@ -1110,6 +1122,10 @@ SUBROUTINE HAMM7_INTERFACE( & !<-- End activation for HAM-M7 !----------------------------------------------------------------- + + ! treshold CDNC and ICNC to gridcells with only liquid or ice clouds + ZCDNCACT(KIDIA:KFDIA,1:KLEV) = MERGE(ZCDNCACT(KIDIA:KFDIA,1:KLEV),1.0E6_JPRB*ZMIN_CDNC,LLIQCLD(KIDIA:KFDIA,1:KLEV)) !mask only values inside liq cloud + ZICNC(KIDIA:KFDIA,1:KLEV) = MERGE(ZICNC(KIDIA:KFDIA,1:KLEV),1.0E6_JPRB*RNICE,LICECLD(KIDIA:KFDIA,1:KLEV)) !mask only values inside ice cloud !<-- Store CDNC (number of activated particles) and ICNC as a number mixing ratio to tracer values and to PGFL fields ZXTM1(KIDIA:KFDIA,1:KLEV,idt_cdnc) = (MAX(ZCDNCACT(KIDIA:KFDIA,1:KLEV),((1.0E6_JPRB)*ZMIN_CDNC)))/ZRHO(KIDIA:KFDIA,1:KLEV) ! [#/kg] and treshold CDNC to 1 cm-3 @@ -1126,43 +1142,15 @@ SUBROUTINE HAMM7_INTERFACE( & reffi(KIDIA:KFDIA,1:KLEV,ZKROW) = 80._JPRB*0.64952_JPRB ! comes from ice effective radius routine (ZDEFAULT_RE_UM) ! liquid effective radius - DO JK=1,KLEV - DO JL=KIDIA,KFDIA - IF ( PAP(JL,JK) >=0.001_JPRB ) THEN - ZTEMP=1.0_JPRB/PAP(JL,JK) - ZDPOG=1.0/RG*(PRS1(JL,JK)-PRS1(JL,JK-1)) - !-- cloud and ice water path in kg m-2 - ZQIWP =MAX(0._JPRB,ZDPOG*PIP(JL,JK)*ZTEMP) - ZQLWP(JL,JK) =MAX(0._JPRB,ZDPOG*PLP(JL,JK)*ZTEMP) - !-- cloud and ice water content in g m-3 - ZPODT=1.0/RD*PRSF1(JL,JK)/PTP(JL,JK) - ZIP(JL,JK)=PIP(JL,JK)*ZPODT*ZTEMP - ZLP(JL,JK)=PLP(JL,JK)*ZPODT*ZTEMP - ELSE - ZQIWP = 0._JPRB - ZQLWP(JL,JK) = 0._JPRB - ZLP(JL,JK) = 0._JPRB - ZIP(JL,JK) = 0._JPRB - ENDIF - END DO - END DO - - DO JK=1,KLEV - DO JL=KIDIA,KFDIA - ZTMPA = 1.0_JPRB/MAX(ZAP(JL,JK),ZEPSEC) - LLIQCLD(JL,JK) = ( PLP(JL,JK)*ZTMPA ) > ZEPSEC ! logical for liquid cloud - LICECLD(JL,JK) = ( PIP(JL,JK)*ZTMPA ) > ZEPSEC ! logical for ice cloud - ZQLWP2(JL,JK) = PLP(JL,JK)/MAX(ZAP(JL,JK),1.E-10_JPRB) ! calculate lwp - ZQLWP2(JL,JK) = MIN(MAX(ZQLWP2(JL,JK),0.0_JPRB),10*RCLDMAX) ! treshold lwp, lianghai changed - + DO JL=KIDIA,KFDIA ! effective radius calculated similarly as in radlswr.F90 ! 2.387e-10 is 3/(4*pi*rho_liq*10^6) [10^6 for N in right units] - ZRE_LIQ(JL,JK) = 1.0E+6_JPRB*(2.387e-10_JPRB*ZRHO(JL,JK)*ZQLWP2(JL,JK)/(MAX(PGFL(JL,JK,YCDNC%MP9_PH),ZMIN_CDNC)))**0.333_JPRB ! calculate effective radius in um (use minimum value for CDNC if CDNC is small) + ZRE_LIQ(JL,JK) = 1.0E+6_JPRB*(2.387e-10_JPRB*ZRHO(JL,JK)*ZQLWP(JL,JK)/(MAX(PGFL(JL,JK,YCDNC%MP9_PH),ZMIN_CDNC)))**0.333_JPRB ! calculate effective radius in um (use minimum value for CDNC if CDNC is small) END DO END DO ! Add liq. eff. rad. to HAM variables (only if there is liquid cloud else minimum value) - REFFL(KIDIA:KFDIA,1:KLEV,ZKROW) = MERGE(ZRE_LIQ(KIDIA:KFDIA,1:KLEV)*1.E+6_JPRB,4._JPRB,LLIQCLD(KIDIA:KFDIA,1:KLEV)) + REFFL(KIDIA:KFDIA,1:KLEV,ZKROW) = MERGE(ZRE_LIQ(KIDIA:KFDIA,1:KLEV),4._JPRB,LLIQCLD(KIDIA:KFDIA,1:KLEV)) CALL ICE_EFFECTIVE_RADIUS(YRERAD, YDSPP_CONFIG, KIDIA, KFDIA, KLON, KLEV, & & PRSF1, PTP, ZAP, PIP, PSP, PGEMU, & ! pressure, temp, cloud fr., IWC, SWC, sine of latitude & reffi(1:KLON,1:KLEV,ZKROW)) ! ice effective radius (updated to mo_activ variable 'reffi' which used in mo_ham_wetdep) @@ -1176,12 +1164,57 @@ SUBROUTINE HAMM7_INTERFACE( & !<-- End calculation for effective radii !----------------------------------------------------------------- - + + ELSE !eehol: default values if neither activation is used + + DO JL = KIDIA,KFDIA !eehol: add CDNC over land and over ocean as default values + IF ( PLSM(JL) < 0.5_JPRB ) THEN !over ocean + ZCDNCACT(JL,1:KLEV) = RCCNSEA*1.0E6_JPRB !from 1/cm3 to 1/m3 + ELSE !over land + ZCDNCACT(JL,1:KLEV) = RCCNLND*1.0E6_JPRB !from 1/cm3 to 1/m3 + END IF + END DO + ! treshold CDNC and ICNC to gridcells with only liquid or ice clouds - PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH) = MERGE(PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH),ZMIN_CDNC,LLIQCLD(KIDIA:KFDIA,1:KLEV)) - PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH) = MERGE(PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH),RNICE,LICECLD(KIDIA:KFDIA,1:KLEV)) + ZCDNCACT(KIDIA:KFDIA,1:KLEV) = MERGE(ZCDNCACT(KIDIA:KFDIA,1:KLEV),1.0E6_JPRB*ZMIN_CDNC,LLIQCLD(KIDIA:KFDIA,1:KLEV)) !mask only values inside liq cloud + ZICNC(KIDIA:KFDIA,1:KLEV) = MERGE(ZICNC(KIDIA:KFDIA,1:KLEV),1.0E6_JPRB*RNICE,LICECLD(KIDIA:KFDIA,1:KLEV)) !mask only values inside ice cloud + + !<-- Store CDNC (number of activated particles) and ICNC as a number mixing ratio to tracer values + ZXTM1(KIDIA:KFDIA,1:KLEV,idt_cdnc) = (MAX(ZCDNCACT(KIDIA:KFDIA,1:KLEV),((1.0E6_JPRB)*ZMIN_CDNC)))/ZRHO(KIDIA:KFDIA,1:KLEV) ! [#/kg] and treshold CDNC to 1 cm-3 + ZXTM1(KIDIA:KFDIA,1:KLEV,idt_icnc) = (1.0E6_JPRB)*ZICNC(KIDIA:KFDIA,1:KLEV)/ZRHO(KIDIA:KFDIA,1:KLEV) !ice crystal number conc = #/cm3 --> number mix rat [#/kg] + + PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH) = 1.0E-6_JPRB*( MAX(ZCDNCACT(KIDIA:KFDIA,1:KLEV), ZMIN_CDNC*1.0E+6_JPRB)) ! convert from #/m3 to #/cm3 and treshold minimum value to 1 cm-3 + PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH) = MAX( ZICNC(KIDIA:KFDIA,1:KLEV), 0.027_JPRB) ! no conversion needed: already in #/cm3, just max of default value (RNICE in sucldp.F90) and icnc + + ! put default values for effective radii + reffl(KIDIA:KFDIA,1:KLEV,ZKROW) = 4._JPRB ! comes from liquid effective radius routine (PP_MIN_RE_UM) + reffi(KIDIA:KFDIA,1:KLEV,ZKROW) = 80._JPRB*0.64952_JPRB ! comes from ice effective radius routine (ZDEFAULT_RE_UM) + + !liquid effective radius + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ! effective radius calculated similarly as in radlswr.F90 + ! 2.387e-10 is 3/(4*pi*rho_liq*10^6) [10^6 for N in right units] + ZRE_LIQ(JL,JK) = 1.E+6_JPRB*(2.387e-10_JPRB*ZRHO(JL,JK)*ZQLWP(JL,JK)/(MAX(PGFL(JL,JK,YCDNC%MP9_PH),ZMIN_CDNC)))**0.333_JPRB ! calculate effective radius in um (use minimum value for CDNC if CDNC is small) + END DO + END DO + + ! Add liq. eff. rad. to HAM variables (only if there is liquid cloud else minimum value) + REFFL(KIDIA:KFDIA,1:KLEV,ZKROW) = MERGE(ZRE_LIQ(KIDIA:KFDIA,1:KLEV),4._JPRB,LLIQCLD(KIDIA:KFDIA,1:KLEV)) + + !ice effective radius + CALL ICE_EFFECTIVE_RADIUS(YRERAD, YDSPP_CONFIG, KIDIA, KFDIA, KLON, KLEV, & + & PRSF1, PTP, ZAP, PIP, PSP, PGEMU, & ! pressure, temp, cloud fr., IWC, SWC, sine of latitude + & reffi(1:KLON,1:KLEV,ZKROW)) ! ice effective radius (updated to mo_activ variable 'reffi' which used in mo_ham_wetdep) - END IF !eehol: end if for M&N or AR&G activation + ! only if there is ice cloud else minimum value + REFFI(KIDIA:KFDIA,1:KLEV,ZKROW) = MERGE(REFFI(KIDIA:KFDIA,1:KLEV,ZKROW), 20._JPRB, LICECLD(KIDIA:KFDIA,1:KLEV)) + + ! add effective radii to PGFL fields + PGFL(KIDIA:KFDIA,1:KLEV,YRE_LIQ%MP9_PH) = 1.0E-06_JPRB * reffl(KIDIA:KFDIA,1:KLEV,ZKROW) ! convert um to meters and save to PGFL fields + PGFL(KIDIA:KFDIA,1:KLEV,YRE_ICE%MP9_PH) = 1.0E-06_JPRB * reffi(KIDIA:KFDIA,1:KLEV,ZKROW) ! convert um to meters and save to PGFL fields + + END IF !eehol: end if for default or M&N or AR&G activation CALL GSTATS(2502,1) diff --git a/ifs-source/arpifs/m7/phys_ec/yoe_aer_activ.F90 b/ifs-source/arpifs/m7/phys_ec/yoe_aer_activ.F90 index f0030a0c..cb8f1726 100644 --- a/ifs-source/arpifs/m7/phys_ec/yoe_aer_activ.F90 +++ b/ifs-source/arpifs/m7/phys_ec/yoe_aer_activ.F90 @@ -1656,9 +1656,9 @@ SUBROUTINE AER_ACTIV_MORALES_NENES_FULL(KIDIA, KFDIA, KTDIA, KLON, KLEV, LCLOUD, DOUBLE PRECISION TPI(NSOL-1), DPGI(NSOL-1), SIGI(NSOL-1), AKKI(NSOL-1), & & TPARC, PPARC, WPARC, SG(NSOL-1), NACT, SMAX - DOUBLE PRECISION, PARAMETER :: A = 2.25_JPRB ! Default FHH adsorption parameters (in the case of FHH-AT) - DOUBLE PRECISION, PARAMETER :: B = 1.20_JPRB ! See Kumar et al., (2011) ACP - DOUBLE PRECISION, PARAMETER :: ACCOM = 1.0_JPRB ! Accommodation coefficient + DOUBLE PRECISION, PARAMETER :: A = 2.25 ! Default FHH adsorption parameters (in the case of FHH-AT) + DOUBLE PRECISION, PARAMETER :: B = 1.20 ! See Kumar et al., (2011) ACP + DOUBLE PRECISION, PARAMETER :: ACCOM = 1.0 ! Accommodation coefficient ! Standard deviation of the updraft velocity distribution (m/s) ! For the moment it is set to a constant value of 0.8 m/s, diff --git a/ifs-source/arpifs/module/yoeaeratm.F90 b/ifs-source/arpifs/module/yoeaeratm.F90 index 8826a5ac..75112719 100644 --- a/ifs-source/arpifs/module/yoeaeratm.F90 +++ b/ifs-source/arpifs/module/yoeaeratm.F90 @@ -56,7 +56,6 @@ MODULE YOEAERATM INTEGER(KIND=JPIM) :: NTYPAER(NMAXTAER) INTEGER(KIND=JPIM) :: NAER_BLNUCL INTEGER(KIND=JPIM) :: NAERSCAV -INTEGER(KIND=JPIM) :: NAERACT REAL(KIND=JPRB) :: RGRATE @@ -115,7 +114,6 @@ MODULE YOEAERATM ! LAERHYDRO : .T. hygroscopic effects on BC and OM aerosols ! LAERNGAT : .T. prevents negative aerosol concentrations ! NAERSCAV : aerosol scanvenging scheme: 1=historical, 2=from CB05, 3=Luo et al. 2019 -! NAERACT : Activation scheme selection: 1=Morales and Nenes full, 2=Abdul-Razzak & Ghan ! LAERSEDIM : .T. sedimentation is active ! LAERSEDIMSS : .T. special sedimentation for sea-salt is active ! LAERSURF : .T. if surface emissions @@ -188,7 +186,6 @@ SUBROUTINE PRINT_CONFIGURATION(SELF, KDEPTH, KOUTNO) WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'LAERLISI = ', SELF%LAERLISI WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'LAERNGAT = ', SELF%LAERNGAT WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'NAERSCAV = ', SELF%NAERSCAV -WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'NAERACT = ', SELF%NAERACT WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'LAERSEDIM = ', SELF%LAERSEDIM WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'LAERSEDIMSS = ', SELF%LAERSEDIMSS WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'LAERSURF = ', SELF%LAERSURF diff --git a/ifs-source/arpifs/namelist/naeaer.nam.h b/ifs-source/arpifs/namelist/naeaer.nam.h index ee7fefb3..d512fdac 100644 --- a/ifs-source/arpifs/namelist/naeaer.nam.h +++ b/ifs-source/arpifs/namelist/naeaer.nam.h @@ -22,8 +22,7 @@ NAMELIST/NAEAER/& & NDRYDEP , NDUSRCP , & & RAERDUB , RDDUAER , RFCTDUR , RFCTSSR , RLATVOL , RLONVOL , & & RSUCV1 , RSUCV2 , & - & NAERSCAV , NAERACT , & - & LSEASALT_RH80, NDRYDEPVEL_DYN, RAERDUST_REBOUND,& + & NAERSCAV , LSEASALT_RH80, NDRYDEPVEL_DYN, RAERDUST_REBOUND,& & LAERDUSTSOURCE, LAERDUST_NEWBIN, YAERO_DESC, NSO4SCHEME, & & NAER_BLNUCL, LAERDUSTSIZEVAR ! ----------------------------------------------------------------- diff --git a/ifs-source/arpifs/phys_ec/su_aerw.F90 b/ifs-source/arpifs/phys_ec/su_aerw.F90 index 52fc0aaf..3012c1c5 100644 --- a/ifs-source/arpifs/phys_ec/su_aerw.F90 +++ b/ifs-source/arpifs/phys_ec/su_aerw.F90 @@ -108,8 +108,7 @@ SUBROUTINE SU_AERW(YDMODEL) & NDDOPTP, NOMOPTP, NSSOPTP, NSUOPTP, NVISWL, NDRYDEP, NDRYDEPVEL_DYN, & & NTYPAER(:), NDDUST, NSO4SCHEME, NSSALT, NDMSO, NPIST, KSTPDBG(:), NSTPDBG,& & NAERWND, NAERLISI, NDUSRCP(:), NAERVOLC, NAERVOLE, NVOLDATS(:), NVOLERUP,& - & NVOLERUZ(:), NVOLOPTP, NVOLHOMO, NINTERPT, NAER_BLNUCL, NVOLDATE(:), NAERSCAV,& - & NAERACT + & NVOLERUZ(:), NVOLOPTP, NVOLHOMO, NINTERPT, NAER_BLNUCL, NVOLDATE(:), NAERSCAV REAL(KIND=JPRB), POINTER :: RAERDUB, RDDUAER(:), RFCTDUR, RFCTSSR, RLATVOL,& & RLONVOL, RSUCV1, RSUCV2, RAERDUST_REBOUND, & & RAERVOLC(:,:), RAERVOLE(:,:), RVOLERUZ(:) @@ -196,7 +195,6 @@ SUBROUTINE SU_AERW(YDMODEL) LAERSCAV_CHEM => YDEAERATM%LAERSCAV_CHEM LAERSOA_CHEM => YDEAERATM%LAERSOA_CHEM NAERSCAV => YDEAERATM%NAERSCAV -NAERACT => YDEAERATM%NAERACT LSEASALT_RH80=> YDEAERATM%LSEASALT_RH80 NTYPAER => YDEAERATM%NTYPAER YAERO_DESC=> YDEAERATM%YAERO_DESC @@ -318,7 +316,6 @@ SUBROUTINE SU_AERW(YDMODEL) LAERSCAV_CHEM =.FALSE. LAERSOA_CHEM =.FALSE. NAERSCAV = 0 - NAERACT = 2 LAERDUSTSOURCE =.FALSE. LAERDUST_NEWBIN =.FALSE. LAERDUSTSIZEVAR =.FALSE. @@ -415,8 +412,6 @@ SUBROUTINE SU_AERW(YDMODEL) LUVINDX =.FALSE. LAERNITRATE = .FALSE. LDRYDEPVEL_DYN=.FALSE. - - NAERACT = 2 REPSCAER=1.E-20_JPRB ! minimum value for AOD @@ -502,7 +497,6 @@ SUBROUTINE SU_AERW(YDMODEL) LAERHYGRO=.TRUE. LAERNGAT =.TRUE. NAERSCAV = 2 - NAERACT = 2 LAERDUSTSOURCE =.FALSE. LAERDUST_NEWBIN =.FALSE. LAERDUSTSIZEVAR =.FALSE. @@ -944,7 +938,6 @@ SUBROUTINE SU_AERW(YDMODEL) & ,'' LAERGTOP = '',L1 & & ,'' LAERHYGRO= '',L1 & & ,'' NAERSCAV = '',I1& - & ,'' NAERACT = '',I1& & ,'' LAERCHEM = '',L1& & ,'' LAERNITRATE = '',L1& & ,'' LAERSOA = '',L1& @@ -960,7 +953,7 @@ SUBROUTINE SU_AERW(YDMODEL) & ,'' LAERCLIST= '',L1& & ,'' LAERRAD= '',L1& & )')& - & LAERGBUD,LAERNGAT,LAERDRYDP,LAERSEDIM,LAERSEDIMSS,LAERGTOP,LAERHYGRO,NAERSCAV,NAERACT,LAERCHEM,LAERNITRATE,LAERSOA,LAERSOA_COUPLED, & + & LAERGBUD,LAERNGAT,LAERDRYDP,LAERSEDIM,LAERSEDIMSS,LAERGTOP,LAERHYGRO,NAERSCAV,LAERCHEM,LAERNITRATE,LAERSOA,LAERSOA_COUPLED, & & NDRYDEPVEL_DYN,LAERDUSTSOURCE,LAERDUST_NEWBIN,LAERDUSTSIZEVAR,RAERDUST_REBOUND,LAER6SDIA,& & LAERCLIMZ,LAERCLIMG,LAERCLIST,LAERRAD WRITE(UNIT=NULOUT,FMT='('' NAERLISI = '',I1)') NAERLISI @@ -989,14 +982,13 @@ SUBROUTINE SU_AERW(YDMODEL) & ,'' LAERGTOP = '',L1 & & ,'' LAERHYGRO= '',L1 & & ,'' NAERSCAV = '',I1 & - & ,'' NAERACT = '',I1 & & ,'' LAER6SDIA= '',L1 & & ,'' LAERCLIMZ= '',L1 & & ,'' LAERCLIMG= '',L1 & & ,'' LAERCLIST= '',L1 & & )')& & LAERGBUD,LAERNGAT,LAERDRYDP,LAERSEDIM,LAERSEDIMSS,LAERGTOP,LAERHYGRO, & - & NAERSCAV,NAERACT,LAER6SDIA, & + & NAERSCAV,LAER6SDIA, & & LAERCLIMZ,LAERCLIMG,LAERCLIST WRITE(UNIT=NULOUT,FMT='('' NAERLISI = '',I1 & & )')& diff --git a/ifs-source/arpifs/phys_radi/radiation_scheme.F90 b/ifs-source/arpifs/phys_radi/radiation_scheme.F90 index ec3a1f45..31c10cff 100644 --- a/ifs-source/arpifs/phys_radi/radiation_scheme.F90 +++ b/ifs-source/arpifs/phys_radi/radiation_scheme.F90 @@ -451,8 +451,11 @@ SUBROUTINE RADIATION_SCHEME & & PPRESSURE, PTEMPERATURE, PCLOUD_FRAC, PQ_ICE, PQ_SNOW, PGEMU, & & ZRE_ICE_UM, PPERT=PPERT) ENDIF -YLCLOUD%RE_LIQ(KIDIA:KFDIA,:) = ZRE_LIQUID_UM(KIDIA:KFDIA,:) * 1.0E-6_JPRB -YLCLOUD%RE_ICE(KIDIA:KFDIA,:) = ZRE_ICE_UM(KIDIA:KFDIA,:) * 1.0E-6_JPRB +!YLCLOUD%RE_LIQ(KIDIA:KFDIA,:) = ZRE_LIQUID_UM(KIDIA:KFDIA,:) * 1.0E-6_JPRB +!YLCLOUD%RE_ICE(KIDIA:KFDIA,:) = ZRE_ICE_UM(KIDIA:KFDIA,:) * 1.0E-6_JPRB + +YLCLOUD%RE_LIQ(KIDIA:KFDIA,:) = MIN((MAX((ZRE_LIQUID_UM(KIDIA:KFDIA,:) * 1.0E-6_JPRB),2.0E-6_JPRB)),50.0E-6_JPRB) !eehol: treshold liq effective radius 2-50 um +YLCLOUD%RE_ICE(KIDIA:KFDIA,:) = MIN((MAX((ZRE_ICE_UM(KIDIA:KFDIA,:) * 1.0E-6_JPRB),10.0E-6_JPRB)),150.0E-6_JPRB) !eehol: treshold ice effective radius 10-150 um ! Get the cloud overlap decorrelation length (for cloud boundaries), ! in km, according to the parameterization specified by NDECOLAT, diff --git a/ifs-source/arpifs/phys_radi/suecrad.F90 b/ifs-source/arpifs/phys_radi/suecrad.F90 index 3c18195a..5b709685 100644 --- a/ifs-source/arpifs/phys_radi/suecrad.F90 +++ b/ifs-source/arpifs/phys_radi/suecrad.F90 @@ -522,8 +522,9 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) ! -------------------------- ! Cloud activation scheme -NCLOUDACT= 0 ! 0: effective radius from IFS code - ! >0: use Abdul-Razzak & Ghan activation scheme from HAMM7 +NCLOUDACT= 0 ! 0: effective radius from IFS code and default activation + ! 1: use Morales & Nenes activation scheme from HAMM7 + ! 2: use Abdul-Razzak & Ghan activation scheme from HAMM7 ! Computation of M7 aerosols optical properties NAEROOPT = 2 ! 2: HAM optics (faster and calculated for LW too) From 12dbae95e8422b76428c6c20f0cda8a975b3d7d3 Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Tue, 22 Apr 2025 18:20:30 +0200 Subject: [PATCH 057/129] Fix DrHook handler in new aactivation module --- .../arpifs/m7/phys_ec/yoe_aer_activ.F90 | 51 +++++++------------ 1 file changed, 19 insertions(+), 32 deletions(-) diff --git a/ifs-source/arpifs/m7/phys_ec/yoe_aer_activ.F90 b/ifs-source/arpifs/m7/phys_ec/yoe_aer_activ.F90 index cb8f1726..4f815629 100644 --- a/ifs-source/arpifs/m7/phys_ec/yoe_aer_activ.F90 +++ b/ifs-source/arpifs/m7/phys_ec/yoe_aer_activ.F90 @@ -2,6 +2,7 @@ MODULE YOE_AER_ACTIV !---inherited functions, types, variables and constants USE PARKIND1, ONLY: JPIM,JPRB + USE YOMHOOK, ONLY: LHOOK, DR_HOOK, JPHOOK !USE PHY_DIAG_MOD, ONLY: T_DIAG IMPLICIT NONE @@ -68,7 +69,6 @@ SUBROUTINE AER_ACTIV(KIDIA, KFDIA, KTDIA, KLON, KLEV, KSTGLO, & ! either via interactive coupling to TM5 or a prescribed pre-industrial climatology !---inherited functions, types, variables and constants - USE YOMHOOK, ONLY: LHOOK, DR_HOOK USE YOMCST, ONLY: RD, RPI, RG ! USE YOERAD, ONLY: LNEWAER, LCMIP5, LTM5AER, LCMIP6_PI_AEROSOLS, LMAC2SPACI ! USE YOECLDP, ONLY: NCLOUDACT, JP_ACT_FOUNTOUKIS_NENES, JP_ACT_ABDULRAZZAK_GHAN, & @@ -194,7 +194,7 @@ SUBROUTINE AER_ACTIV(KIDIA, KFDIA, KTDIA, KLON, KLEV, KSTGLO, & REAL(KIND=JPRB) :: ZDUBULK(KLON,KLEV) ! bulk dust mass mixing ratio [kg/kg] !REAL(KIND=JPRB) :: ZW(KLON,KLEV,nw) ! updraft speed [m/s] !REAL(KIND=JPRB) :: ZWPDF(KLON,KLEV,nw) ! updraft probability - REAL(KIND=JPRB) :: ZHOOK_HANDLE + REAL(KIND=JPHOOK) :: ZHOOK_HANDLE REAL(KIND=JPRB) :: ZTMP(KLON,KLEV) ! interim for diagnostics REAL(KIND=JPRB) :: ZCDNC(KLON,KLEV) ! cloud droplet number concentration [#/cm-3] @@ -529,7 +529,6 @@ END SUBROUTINE AER_ACTIV ! ! USE YOMCST, ONLY: R, RV, RPI, RCPD, RG, RLVTT, RMV, RMD, RTT , RLSTT ! USE YOECLDP, ONLY: RTHOMO, PPRHO_WAT -! USE YOMHOOK, ONLY: LHOOK, DR_HOOK ! USE YOMLUN, ONLY: NULOUT ! USE YOETHF , ONLY : R2ES ,R3LES ,R3IES ,R4LES ,& ! & R4IES ,R5LES ,R5IES ,R5ALVCP ,R5ALSCP ,& @@ -646,7 +645,7 @@ END SUBROUTINE AER_ACTIV ! ! Miscellaneous ! REAL(KIND=JPRB) :: ZEPS ! REAL(KIND=JPRB) :: Z4PIOVER3, ZSQRT2 -! REAL(KIND=JPRB) :: ZHOOK_HANDLE +! REAL(KIND=JPHOOK) :: ZHOOK_HANDLE ! REAL(KIND=JPRB), PARAMETER :: PPEPSSEC = 1.E-25_JPRB ! used to avoid division by 0 ! ! ! mass accomodation coefficient @@ -1031,7 +1030,6 @@ END SUBROUTINE AER_ACTIV ! ! USE YOMCST, ONLY: R, RV, RPI, RCPD, RG, RLVTT, RMV, RMD, RTT , RLSTT ! USE YOECLDP, ONLY: RTHOMO, PPRHO_WAT -! USE YOMHOOK, ONLY: LHOOK, DR_HOOK ! USE YOMLUN, ONLY: NULOUT ! USE YOETHF , ONLY : R2ES ,R3LES ,R3IES ,R4LES ,& ! & R4IES ,R5LES ,R5IES ,R5ALVCP ,R5ALSCP ,& @@ -1150,7 +1148,7 @@ END SUBROUTINE AER_ACTIV ! ! Miscellaneous ! REAL(KIND=JPRB) :: ZEPS ! REAL(KIND=JPRB) :: Z4PIOVER3, ZSQRT2 -! REAL(KIND=JPRB) :: ZHOOK_HANDLE +! REAL(KIND=JPHOOK) :: ZHOOK_HANDLE ! REAL(KIND=JPRB), PARAMETER :: PPEPSSEC = 1.E-25_JPRB ! used to avoid division by 0 ! ! ! mass accomodation coefficient @@ -1575,7 +1573,6 @@ SUBROUTINE AER_ACTIV_MORALES_NENES_FULL(KIDIA, KFDIA, KTDIA, KLON, KLEV, LCLOUD, ! Morales and Nenes, JGR, D18220, 2010 USE YOMCST, ONLY: RG, RPI - USE YOMHOOK, ONLY: LHOOK, DR_HOOK USE YOMLUN, ONLY: NULOUT USE TM5M7_DATA, ONLY: NMOD, NSOL, DDUST, DNACL, & & DOC, DBC, DH2SO4, DNA2SO4, DNH4NO3, DMSA, & @@ -1648,7 +1645,7 @@ SUBROUTINE AER_ACTIV_MORALES_NENES_FULL(KIDIA, KFDIA, KTDIA, KLON, KLEV, LCLOUD, ! Miscellaneous REAL(KIND=JPRB) :: ZEPS REAL(KIND=JPRB) :: Z4PIOVER3 - REAL(KIND=JPRB) :: ZHOOK_HANDLE + REAL(KIND=JPHOOK) :: ZHOOK_HANDLE ! Variables to interface with Nenes routines ! These are declared double precision as they are in those routines. @@ -1839,7 +1836,6 @@ END SUBROUTINE AER_ACTIV_MORALES_NENES_FULL ! ! Morales and Nenes, JGR, D18220, 2010 ! ! USE YOMCST, ONLY: RG, RPI -! USE YOMHOOK, ONLY: LHOOK, DR_HOOK ! USE YOMLUN, ONLY: NULOUT ! USE YOE_AERO_M7_DATA, ONLY: NMOD, NSOL, SIGMA, SIGMALN, CMR2RAM, & ! & DH2SO4, DBC, DOC, DNACL, DDUST, & @@ -1909,7 +1905,7 @@ END SUBROUTINE AER_ACTIV_MORALES_NENES_FULL ! ! Miscellaneous ! REAL(KIND=JPRB) :: ZEPS ! REAL(KIND=JPRB) :: Z4PIOVER3 -! REAL(KIND=JPRB) :: ZHOOK_HANDLE +! REAL(KIND=JPHOOK) :: ZHOOK_HANDLE ! ! ! Variables to interface with Nenes routines ! ! These are declared double precision as they are in those routines. @@ -2102,7 +2098,6 @@ END SUBROUTINE AER_ACTIV_MORALES_NENES_FULL ! !---inherited functions, types, variables and constants ! USE YOMCST, ONLY: RPI, R, RCPD, RG, RMD, RV, RTT, RLVTT, RLSTT, RMD, RMV ! USE YOECLDP, ONLY: RTHOMO, PPRHO_WAT, LACI_DIAG -! USE YOMHOOK, ONLY: LHOOK, DR_HOOK ! USE YOE_AERO_M7_DATA, ONLY: NSOL, SIGMALN, CMR2RAM, & ! & PPKAPPA_H2SO4, PPKAPPA_NACL, PPKAPPA_NA2SO4, & ! & PPKAPPA_BC, PPKAPPA_OC, PPKAPPA_DU, & @@ -2216,7 +2211,7 @@ END SUBROUTINE AER_ACTIV_MORALES_NENES_FULL ! ! thermal accomodation coefficient ! REAL(KIND=JPRB), PARAMETER :: PPALPHA_T = 0.96_JPRB ! -! REAL(KIND=JPRB) :: ZHOOK_HANDLE +! REAL(KIND=JPHOOK) :: ZHOOK_HANDLE ! ! !---executable procedure ! IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.AER_ACTIV_ABDULRAZZAK_GHAN', 0, ZHOOK_HANDLE) @@ -2474,7 +2469,6 @@ END SUBROUTINE AER_ACTIV_MORALES_NENES_FULL ! ! Menon et al., J. Atm. Sci. 59 692-713, 2002 ! ! !---inherited functions, types, variables and constants: -! USE YOMHOOK, ONLY: LHOOK, DR_HOOK ! USE YOMCST, ONLY: RPI ! USE YOECLDP, ONLY: RTHOMO, RCDNCSU, RCDNCSS, RCDNCOM ! @@ -2501,7 +2495,7 @@ END SUBROUTINE AER_ACTIV_MORALES_NENES_FULL ! REAL(KIND=JPRB) :: ZCDNC_OCEAN(KLON) ! CDNC according to 'over ocean' formulation in Menon et al. ! INTEGER(KIND=JPIM) :: JK, JL ! loop indices ! -! REAL(KIND=JPRB) :: ZHOOK_HANDLE +! REAL(KIND=JPHOOK) :: ZHOOK_HANDLE ! ! ! !---executable procedure @@ -2541,7 +2535,6 @@ SUBROUTINE GET_HAMM7_AERO_PROP(KIDIA, KFDIA, KLON, KTDIA, KLEV, KSTGLO, LMODE, L & PNO3MASS, PMSAMASS) !---inherited functions, types, variables and constants - USE YOMHOOK, ONLY: LHOOK, DR_HOOK USE YOMCST, ONLY: RPI USE TM5M7_DATA, ONLY: NSOL @@ -2607,7 +2600,7 @@ SUBROUTINE GET_HAMM7_AERO_PROP(KIDIA, KFDIA, KLON, KTDIA, KLEV, KSTGLO, LMODE, L REAL(KIND=JPRB) :: ZDRYVOL2, ZDRYVOL3, ZDRYVOL4 ! Volume per particle [m3/#] REAL(KIND=JPRB) :: ZDUMMY(KLON,KLEV) ! For fields we don't use in subroutine call REAL(KIND=JPRB) :: Z4PIOVER3 - REAL(KIND=JPRB) :: ZHOOK_HANDLE + REAL(KIND=JPHOOK) :: ZHOOK_HANDLE INTEGER(KIND=JPIM) :: JL, JK, IBL, IL, IK !---executable procedure @@ -2977,7 +2970,6 @@ END SUBROUTINE GET_HAMM7_AERO_PROP ! ! PDUMASS : mass mixing ratio of mineral dust aerosol ! ! USE PARKIND1 ,ONLY : JPIM ,JPRB -! USE YOMHOOK ,ONLY : LHOOK, DR_HOOK ! ! USE YOMCST , ONLY : RG ,RD ,RETV ,& ! & RLVTT ,RTT ,RPI, RLSTT @@ -3062,7 +3054,7 @@ END SUBROUTINE GET_HAMM7_AERO_PROP ! INTEGER(KIND=JPIM) :: IWAVL ! INTEGER(KIND=JPIM) :: JK, JL ! -! REAL(KIND=JPRB) :: ZHOOK_HANDLE +! REAL(KIND=JPHOOK) :: ZHOOK_HANDLE ! ! !------------------------ ! ! interface include files @@ -3232,7 +3224,6 @@ END SUBROUTINE GET_HAMM7_AERO_PROP ! ! *LIQ_CLOUD_RE* calculates the effective radius (Re) for liquid clouds ! ! !---inherited functions, types, variables and constants -! USE YOMHOOK, ONLY: LHOOK, DR_HOOK ! USE YOMCST, ONLY: RPI ! USE YOECLDP, ONLY: RCLDMAX, PPRHO_WAT ! USE YOM_YGFL, ONLY: YGFL, YCDNC, YRE_LIQ @@ -3259,7 +3250,7 @@ END SUBROUTINE GET_HAMM7_AERO_PROP ! !---local data: ! REAL(KIND=JPRB) :: ZCLD, ZRE_LIQ(KLON,KLEV) ! REAL(KIND=JPRB) :: ZEPSEC -! REAL(KIND=JPRB) :: ZHOOK_HANDLE +! REAL(KIND=JPHOOK) :: ZHOOK_HANDLE ! ! INTEGER(KIND=JPIM) :: JL,JK ! @@ -3306,7 +3297,6 @@ SUBROUTINE ICE_CLOUD_PROP(KIDIA, KFDIA, KLON, KLEV, PT, PRHO, PI, PA, PAP, & ! implemented in the subroutine aer_cld.F90 !---inherited functions, types, variables and constants - USE YOMHOOK, ONLY: LHOOK, DR_HOOK USE YOMCST, ONLY: RPI, RTT, RETV, RLSTT, RLVTT !USE YOECLDP, ONLY: RNICE, PPRHO_ICE, RCLDMAX !USE YOE_AERO_M7_DATA, ONLY: NSOL @@ -3373,7 +3363,7 @@ SUBROUTINE ICE_CLOUD_PROP(KIDIA, KFDIA, KLON, KLEV, PT, PRHO, PI, PA, PAP, & REAL(KIND=JPRB) :: ZNCRIT_GIERENS, ZNCRIT_REN REAL(KIND=JPRB) :: ZCLD REAL(KIND=JPRB) :: ZZEPSEC - REAL(KIND=JPRB) :: ZHOOK_HANDLE + REAL(KIND=JPHOOK) :: ZHOOK_HANDLE !---executable procedure @@ -3502,7 +3492,6 @@ END SUBROUTINE ICE_CLOUD_PROP ! SUBROUTINE PDF_UPDRAFT(KIDIA, KFDIA, KLON, KTDIA, KLEV, KPDF, PRHO, PLSM, PVERVEL, PW, PWPDF) ! ! !---inherited functions, types, variables and constants -! USE YOMHOOK, ONLY: LHOOK, DR_HOOK ! USE YOMCST, ONLY: RG, RPI ! !USE YOECLDP, ONLY: NACTPDF ! USE MO_ACTIV, ONLY: nw @@ -3536,11 +3525,11 @@ END SUBROUTINE ICE_CLOUD_PROP ! ! INTEGER(KIND=JPIM) :: JL,JK, JW ! -! REAL(KIND=JPRB) :: ZWLARGE(KLON,KLEV) -! REAL(KIND=JPRB) :: ZW_PRESC(KLON) -! REAL(KIND=JPRB) :: ZSQ2PI -! REAL(KIND=JPRB) :: ZW_WIDTH -! REAL(KIND=JPRB) :: ZHOOK_HANDLE +! REAL(KIND=JPRB) :: ZWLARGE(KLON,KLEV) +! REAL(KIND=JPRB) :: ZW_PRESC(KLON) +! REAL(KIND=JPRB) :: ZSQ2PI +! REAL(KIND=JPRB) :: ZW_WIDTH +! REAL(KIND=JPHOOK) :: ZHOOK_HANDLE ! ! !---executable procedure ! IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.PDF_UPDRAFT',0,ZHOOK_HANDLE) @@ -3578,7 +3567,6 @@ END SUBROUTINE ICE_CLOUD_PROP ! SUBROUTINE GET_CDNC_FACTOR(KIDIA,KFDIA,KLON,PGEMU,PGELAM,PMAC2SP_CDNC_FACTOR) ! -! USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! USE YOMCST , ONLY : RPI, RDAY ! USE YOMCT0 , ONLY : LTWOTL, LNF ! USE YOMCT2 , ONLY : NSTAR2 @@ -3616,7 +3604,7 @@ END SUBROUTINE ICE_CLOUD_PROP ! REAL(KIND=JPRB):: SSA_MAC2SP(KLON,KLEV) ! REAL(KIND=JPRB):: ASY_MAC2SP(KLON,KLEV) ! -! REAL(KIND=JPRB) :: ZHOOK_HANDLE +! REAL(KIND=JPHOOK) :: ZHOOK_HANDLE ! !#include "updcal.intfb.h" !#include "fcttim.h" @@ -3678,7 +3666,6 @@ END SUBROUTINE ICE_CLOUD_PROP ! END SUBROUTINE GET_CDNC_FACTOR ! SUBROUTINE SETUP_ACI_DIAG ! -! USE YOMHOOK, ONLY: LHOOK, DR_HOOK ! USE PHY_DIAG_MOD, ONLY: NEW_DIAG_SET, NEW_DIAGNOSTIC ! USE YOM_GRIB_CODES, ONLY: NGRBCDNC, NGRBREFF, NGRBLIQCLDTIME ! USE YOMLUN, ONLY: NULOUT @@ -3686,7 +3673,7 @@ END SUBROUTINE ICE_CLOUD_PROP ! IMPLICIT NONE ! ! INTEGER(KIND=JPIM) :: ISET -! REAL(KIND=JPRB) :: ZHOOK_HANDLE +! REAL(KIND=JPHOOK) :: ZHOOK_HANDLE ! ! IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.SETUP_ACI_DIAG',0,ZHOOK_HANDLE) ! From 2ce669918e2bbeca1b6f1569d02edc268845e922 Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Fri, 25 Apr 2025 17:32:33 +0200 Subject: [PATCH 058/129] Switch to F2008 version of Morales & Nenes --- ifs-source/arpifs/m7/module/nd_param.F90 | 800 ++++++++++++++++++ ifs-source/arpifs/m7/phys_ec/NdParam.f | 730 ---------------- ifs-source/arpifs/m7/phys_ec/parametr.inc | 43 - .../arpifs/m7/phys_ec/yoe_aer_activ.F90 | 346 +++----- ifs-source/arpifs/phys_radi/suecrad.F90 | 4 +- 5 files changed, 917 insertions(+), 1006 deletions(-) create mode 100644 ifs-source/arpifs/m7/module/nd_param.F90 delete mode 100644 ifs-source/arpifs/m7/phys_ec/NdParam.f delete mode 100644 ifs-source/arpifs/m7/phys_ec/parametr.inc diff --git a/ifs-source/arpifs/m7/module/nd_param.F90 b/ifs-source/arpifs/m7/module/nd_param.F90 new file mode 100644 index 00000000..6bb52286 --- /dev/null +++ b/ifs-source/arpifs/m7/module/nd_param.F90 @@ -0,0 +1,800 @@ +MODULE ND_PARAM + !======================================================================= + ! This is a F90 version of a F77 code + ! *** WRITTEN BY ATHANASIOS NENES + ! *** MODIFIED BY PRASHANT KUMAR AND ATHANASIOS NENES + ! *** MODIFIED FOR EC-EARTH3 BY TWAN VAN NOIJE AND ATHANASIOS NENES + ! *** MODIFIED FOR OpenIFS 48R1 BY PHILIPPE LE SAGER (KNMI) + !======================================================================= + + !---Inherited functions, types, variables and constants + USE PARKIND1, ONLY: JPIM, JPRB + + IMPLICIT NONE + PRIVATE + + !---public member functions + PUBLIC ND_PARAM_SETUP + PUBLIC CCNSPEC + PUBLIC PDFACTIV + + ! Three points is enough for PDF integration using Gauss-Legendre quadrature + INTEGER(KIND=JPIM), PARAMETER :: NPGAUSS=3 + REAL(KIND=JPRB) :: XGS(NPGAUSS), WGS(NPGAUSS) ! Points and weights for GAUSS integration + + ! Maximum number of lognormal modes, set to three for M7 (but basically should be .GE. "NSOL-1 = 3" from TM5M7_DATA) + INTEGER(KIND=JPIM), PARAMETER :: NSMX = 3 + + TYPE, PUBLIC :: NDPARAM + REAL(KIND=JPRB) :: A ! Default FHH adsorption parameters (in the case of FHH-AT) [READ] + REAL(KIND=JPRB) :: B ! See Kumar et al., (2011) ACP [READ] + REAL(KIND=JPRB) :: ACCOM ! Accommodation coefficient [READ] + ! Parcel props + REAL(KIND=JPRB) :: TEMP ! Temperture (K) [READ] + REAL(KIND=JPRB) :: PRES ! Pressure (Pa) [READ] + REAL(KIND=JPRB) :: ALFA ! [COMPUTED] + REAL(KIND=JPRB) :: AKOH ! Kelvin parameter [COMPUTED] + REAL(KIND=JPRB) :: SURT ! Surface Tension for water (J m-2) [COMPUTED] + ! Aerosol params + INTEGER(KIND=JPIM) :: NMD ! Number of lognormal modes effectively used in calculations [READ]. Ideally should be used to allocate DPG/SIG/DPC/TP, for now just be sure that NMD .LE. NSMX + REAL(KIND=JPRB) :: DPG(NSMX) ! Modal diameter (m) [READ for 1:NMD] + REAL(KIND=JPRB) :: SIG(NSMX) ! Geometric dispersion (sigma_g) [READ for 1:NMD] + REAL(KIND=JPRB) :: TP(NSMX) ! Number concentration (#/m3) [READ for 1:NMD] + INTEGER(KIND=JPIM) :: MODE(NSMX) ! Kohler mode [READ for 1:NMD] + REAL(KIND=JPRB) :: DPC(NSMX) ! Critical particle diameter [COMPUTED for 1:NMD] + REAL(KIND=JPRB) :: SG(NSMX) ! [COMPUTED for 1:NMD] + END TYPE NDPARAM + + ! Physical constants + REAL(KIND=JPRB), PARAMETER :: AMA = 29.E-3_JPRB ! Air molecular weight + REAL(KIND=JPRB), PARAMETER :: GRAV = 9.81_JPRB ! g constant + REAL(KIND=JPRB), PARAMETER :: RGAS = 8.31_JPRB ! Universal gas constant + REAL(KIND=JPRB), PARAMETER :: Dw = 2.75E-10_JPRB ! Water Molecule Diameter + REAL(KIND=JPRB), PARAMETER :: AMW = 18.E-3_JPRB ! Water molecular weight + REAL(KIND=JPRB), PARAMETER :: DENW = 1E+3_JPRB ! Water density + REAL(KIND=JPRB), PARAMETER :: DHV = 2.25E+6_JPRB ! Water enthalpy of vaporization + REAL(KIND=JPRB), PARAMETER :: CPAIR= 1.0061E+3_JPRB ! Air Cp + + ! Data for FHH exponent calculation + ! for C1 + REAL(KIND=JPRB), PARAMETER :: D11 = -0.1907_JPRB + REAL(KIND=JPRB), PARAMETER :: D12 = -1.6929_JPRB + REAL(KIND=JPRB), PARAMETER :: D13 = 1.4963_JPRB + REAL(KIND=JPRB), PARAMETER :: D14 = -0.5644_JPRB + REAL(KIND=JPRB), PARAMETER :: D15 = 0.0711_JPRB + ! for C2 + REAL(KIND=JPRB), PARAMETER :: D21 = -3.9310_JPRB + REAL(KIND=JPRB), PARAMETER :: D22 = 7.0906_JPRB + REAL(KIND=JPRB), PARAMETER :: D23 = -5.3436_JPRB + REAL(KIND=JPRB), PARAMETER :: D24 = 1.8025_JPRB + REAL(KIND=JPRB), PARAMETER :: D25 = -0.2131_JPRB + ! for C3 + REAL(KIND=JPRB), PARAMETER :: D31 = 8.4825_JPRB + REAL(KIND=JPRB), PARAMETER :: D32 = -14.9297_JPRB + REAL(KIND=JPRB), PARAMETER :: D33 = 11.4552_JPRB + REAL(KIND=JPRB), PARAMETER :: D34 = -3.9115_JPRB + REAL(KIND=JPRB), PARAMETER :: D35 = 0.4647_JPRB + ! for C4 + REAL(KIND=JPRB), PARAMETER :: D41 = -5.1774_JPRB + REAL(KIND=JPRB), PARAMETER :: D42 = 8.8725_JPRB + REAL(KIND=JPRB), PARAMETER :: D43 = -6.8527_JPRB + REAL(KIND=JPRB), PARAMETER :: D44 = 2.3514_JPRB + REAL(KIND=JPRB), PARAMETER :: D45 = -0.2799_JPRB + ! + INTEGER(KIND=JPIM), PARAMETER :: MAXIT = 30 ! Max iterations for solution + REAL(KIND=JPRB), PARAMETER :: EPS = 1.E-5_JPRB ! Convergence criterion + ! + REAL(KIND=JPRB), PARAMETER :: PI = 3.1415927_JPRB ! Some constants + REAL(KIND=JPRB), PARAMETER :: ZERO = 0.0_JPRB + REAL(KIND=JPRB), PARAMETER :: GREAT = 1.E+30_JPRB + REAL(KIND=JPRB), PARAMETER :: SQ2PI = 2.5066282746_JPRB + +CONTAINS + + SUBROUTINE ND_PARAM_SETUP + ! + ! ** CALCULATE GAUSS QUADRATURE POINTS + ! + CALL GAULEG (XGS, WGS, NPGAUSS) + + END SUBROUTINE ND_PARAM_SETUP + +!======================================================================= +! +! *** SUBROUTINE CCNSPEC +! *** THIS SUBROUTINE CALCULATES THE CCN SPECTRUM OF THE AEROSOL USING +! THE APPROPRIATE FORM OF KOHLER THEORY +! +! *** ORIGINALLY WRITTEN BY ATHANASIOS NENES FOR ONLY KOHLER PARTICLES +! *** MODIFIED BY PRASHANT KUMAR AND ATHANSIOS NENES TO INCLUDE +! *** ACTIVATION BY FHH PARTICLES +! +!======================================================================= + + SUBROUTINE CCNSPEC (TPI,DPGI,SIGI,MODEI,TPARC,PPARC,NMODES, & + AKKI,A,B,ACCOM,BOX) + + REAL(KIND=JPRB), INTENT(IN) :: TPI(NMODES) + REAL(KIND=JPRB), INTENT(IN) :: DPGI(NMODES) + REAL(KIND=JPRB), INTENT(IN) :: SIGI(NMODES) + INTEGER(KIND=JPIM), INTENT(IN) :: MODEI(NMODES) + REAL(KIND=JPRB), INTENT(IN) :: TPARC + REAL(KIND=JPRB), INTENT(IN) :: PPARC + INTEGER(KIND=JPIM), INTENT(IN) :: NMODES + REAL(KIND=JPRB), INTENT(IN) :: AKKI(NMODES), A, B, ACCOM + + TYPE(NDPARAM), INTENT(OUT) :: BOX + + REAL(KIND=JPRB), PARAMETER :: ZEPS = 1E-9_JPRB !eehol: small value for diameter (1e-8 = 0.01 um) + REAL(KIND=JPRB) :: Dpcm, PAR1, PAR2 + INTEGER(KIND=JPIM) :: I,K + +#include "abor1.intfb.h" + + ! Check + IF (NMODES > NSMX ) THEN + CALL ABOR1('CCNSPEC: NMODES must be .LE. NSMX. Increase NSMX') + ENDIF + + ! Store aerosol params, parcel properties, etc. + ! + BOX%A = A ! Default FHH adsorption parameters (in the case of FHH-AT) + BOX%B = B ! See Kumar et al., (2011) ACP + BOX%ACCOM = ACCOM ! Accommodation coefficient + BOX%NMD = NMODES + DO I=1,BOX%NMD + BOX%MODE(I)= MODEI(I) + BOX%DPG(I) = DPGI(I) + BOX%SIG(I) = SIGI(I) + BOX%TP(I) = TPI(I) + ENDDO + + BOX%TEMP = TPARC ! Temperature (K) + BOX%PRES = PPARC ! Pressure (Pa) + + ! Thermophysical properties + BOX%SURT = SFT(TPARC) ! Surface Tension for water (J m-2) + BOX%AKOH = 4._JPRB*AMW*BOX%SURT/RGAS/BOX%TEMP/DENW ! Kelvin parameter + BOX%ALFA = GRAV*AMW*DHV/CPAIR/RGAS/TPARC/TPARC - GRAV*AMA/RGAS/TPARC ! Need to store this intermediate variable, because it is used in SINTEGRAL + + DO K=1,BOX%NMD + IF (MODEI(K).EQ.1) THEN ! Kohler modes + IF (DPGI(K).GE.ZEPS) THEN !eehol: add treshold if median diam is low + PAR1 = 4._JPRB/27._JPRB/AKKI(K)/DPGI(K)**3 + PAR2 = SQRT(PAR1*BOX%AKOH**3) + BOX%SG(K) = EXP(PAR2) - 1._JPRB + ELSE + BOX%SG(K) = ZERO + END IF + ELSEIF (MODEI(K).EQ.2) THEN ! FHH modes + CALL DpcFHH(DPGI(K),BOX,Dpcm) + BOX%DPC(K) = Dpcm + BOX%SG(K) = (BOX%AKOH/Dpcm)+(-A*(((Dpcm-DPGI(K))/(2*Dw))**(-B))) + ENDIF + ENDDO + + !open(unit=667, file='stuffxxx', access='append', status='unknown') + !write(667,*) TEMP, PRES, AKOH, AMW, SURT, RGAS, DENW, SG + !close(667) + + END SUBROUTINE CCNSPEC + +!C======================================================================= +!C +!C *** SUBROUTINE DpcFHH +!C *** THIS SUBROUTINE CALCULATES THE CRITICAL PARTICLE DIAMETER +!C ACCORDING TO THE FHH ADSOSPRTION ISOTHERM THEORY. +!C +!C *** WRITTEN BY PRASHANT KUMAR AND ATHANASIOS NENES +!C +!C======================================================================= + + SUBROUTINE DPCFHH(DDRY,BOX,DC) + + REAL(KIND=JPRB), INTENT(IN) :: DDRY + TYPE(NDPARAM), INTENT(IN) :: BOX + REAL(KIND=JPRB), INTENT(OUT) :: DC + + REAL(KIND=JPRB) :: mu,mu1,mu2,mu3,X1,X2l,Dpcm,Dpcl,Dpcu,TEMP,SURT, A, B + REAL(KIND=JPRB) :: X3l,X2u,X3u,FDpcl,FDpcu,FDpcm,X2m,X3m + + ! inputs + SURT = BOX%SURT + TEMP = BOX%TEMP + A = BOX%A + B = BOX%B + + mu=(4._JPRB*SURT*AMW)/(RGAS*TEMP*DENW) + mu1=(mu*2._JPRB*Dw)/((A*B)*((2._JPRB*Dw)**(B+1._JPRB))) + mu2=1._JPRB/mu1 + mu3=1._JPRB-(mu2**(1._JPRB/(1._JPRB+B))) + + Dpcl = 0._JPRB !Lower Limit + Dpcu = 10.E-4_JPRB !Upper Limit + + DO + + X1 = mu2**(1._JPRB/(1._JPRB+B)) + X2l = Dpcl**(2._JPRB/(1._JPRB+B)) + X3l = X1*X2l + FDpcl=((Dpcl-X3l)/Ddry)-1._JPRB + + X1 = mu2**(1._JPRB/(1._JPRB+B)) + X2u = Dpcu**(2._JPRB/(1._JPRB+B)) + X3u = X1*X2u + FDpcu=((Dpcu-X3u)/Ddry)-1._JPRB + + Dpcm = (Dpcu+Dpcl)/2._JPRB + + X1= mu2**(1._JPRB/(1._JPRB+B)) + X2m= Dpcm**(2._JPRB/(1._JPRB+B)) + X3m= X1*X2m + FDpcm=((Dpcm-X3m)/Ddry)-1._JPRB + + IF ((FDPCL*FDPCM).LE.0._JPRB) THEN + + IF (ABS(FDPCM).LE.10E-8_JPRB) THEN + EXIT + ELSE + DPCL = DPCL + DPCU = DPCM + END IF + + ELSE IF ((FDPCL*FDPCM).GE.0._JPRB) THEN + + IF (ABS(FDPCM).LE.10E-8_JPRB) THEN + EXIT + ELSE + DPCL = DPCM + DPCU = DPCU + END IF + +! ELSE IF ((FDPCL*FDPCM).EQ.0) THEN + ELSE + EXIT + END IF + + END DO + + DC = DPCM + + END SUBROUTINE DPCFHH + +!C======================================================================= +!C +!C *** SUBROUTINE PDFACTIV +!C *** THIS SUBROUTINE CALCULATES THE CCN ACTIVATION FRACTION ACCORDING +!C TO THE Nenes and Seinfeld (2003) PARAMETERIZATION, WITH +!C MODIFICATION FOR NON-CONTUNUUM EFFECTS AS PROPOSED BY Fountoukis +!C and Nenes (2004). THIS ROUTINE CALCULATES FOR A PDF OF +!C UPDRAFT VELOCITIES. +!C +!C *** WRITTEN BY ATHANASIOS NENES +!C +!C======================================================================= + + SUBROUTINE PDFACTIV (WPARC,SIGW,NACT,SMAX,BOX) + + REAL(KIND=JPRB), INTENT(IN) :: WPARC, SIGW + REAL(KIND=JPRB), INTENT(OUT) :: NACT, SMAX + TYPE(NDPARAM), INTENT(IN) :: BOX + + REAL(KIND=JPRB) :: NACTI, SMAXI, DENOM, WPI + REAL(KIND=JPRB) :: A, B, ACCOM, PDF, WHI, WLO, SCAL, PROBI + INTEGER(KIND=JPIM) :: I + + REAL(KIND=JPRB), PARAMETER :: PLIMT = 1.0E-3_JPRB + ! + ! *** Single updraft case + ! + IF (SIGW.LT.1.e-10_JPRB) THEN + ! + ! *** Case where updraft is very small + ! + IF (WPARC.LE.1E-6_JPRB) THEN + SMAX = 0.0_JPRB + NACT = 0.0_JPRB + RETURN + ENDIF + + CALL ACTIVATE (WPARC,NACT,SMAX,BOX) + ! + ! *** PDF of updrafts + ! + ELSE + NACT = ZERO + SMAX = ZERO + DENOM = ZERO + PROBI = SQRT(-2.0_JPRB*LOG(PLIMT*SIGW*SQ2PI)) ! Probability of High Updraft limit + WHI = WPARC + SIGW*PROBI ! Upper updrft limit + ! No need to cut off the PDF at 0.05 m/s. + ! Using a lower value will change the normalization. + ! WLO = 0.05 ! Low updrft limit + WLO = 0.0_JPRB + SCAL = 0.5_JPRB*(WHI-WLO) ! Scaling for updrafts + !open(unit=667,file='pgaussxx',access='append',status='unknown') + DO I=1,NPGAUSS + ! Points are symmetric around zero, + ! so the sign of the XGS term is irrelevant. + ! As the convention is to use a plus sign, + ! we change the minus from the original code into a plus: + !WPI = WLO + SCAL*(1.0-XGS(i)) ! Updraft + WPI = WLO + SCAL*(1.0_JPRB+XGS(i)) ! Updraft + + ! Catch very small velocities using the same cutoff as above + IF (WPI.LE.1E-6_JPRB) THEN + SMAXI = 0.0_JPRB + NACTI = 0.0_JPRB + ELSE + CALL ACTIVATE (WPI,NACTI,SMAXI,BOX) ! # of drops + ENDIF + PDF = (1.0_JPRB/SQ2PI/SIGW)*EXP(-0.5_JPRB*((WPI-WPARC)/SIGW)**2) ! Prob. of updrafts + NACT = NACT + WGS(i)*(PDF*NACTI) ! Integral for drops + SMAX = SMAX + WGS(i)*(PDF*SMAXI) ! Integral for Smax + DENOM = DENOM + WGS(i)*PDF + IF (PDF.LT.PLIMT) EXIT + !write(667,*) NpGauss, i, nacti, smaxi + ENDDO + NACT = NACT/DENOM + SMAX = SMAX/DENOM + !close(667) + ENDIF + + END SUBROUTINE PDFACTIV + +!C======================================================================= +!C +!C *** SUBROUTINE ACTIVATE +!C *** THIS SUBROUTINE CALCULATES THE CCN ACTIVATION FRACTION ACCORDING +!C TO THE Nenes and Seinfeld (2003) PARAMETERIZATION, WITH +!C MODIFICATION FOR NON-CONTUNUUM EFFECTS AS PROPOSED BY Fountoukis +!C and Nenes (in preparation). +!C +!C *** WRITTEN BY ATHANASIOS NENES FOR KOHLER PARTICLES +!C *** MODIFIED BY PRASHANT KUMAR AND ATHANASIOS NENES TO INCLUDE FHH +!C PARTICLES +!C======================================================================= + + + SUBROUTINE ACTIVATE (WPARC,NDRPL,SMAX,BOX) + + REAL(KIND=JPRB), INTENT(IN) :: WPARC + REAL(KIND=JPRB), INTENT(OUT) :: NDRPL, SMAX + TYPE(NDPARAM), INTENT(IN) :: BOX + + REAL(KIND=JPRB) :: TEMP, PRES, AKOH, A, B, ACCOM + REAL(KIND=JPRB) :: PRESA, AKA, DAIR, PSAT, DV, DBIG, DLOW, COEF, ALFA, BET1 + REAL(KIND=JPRB) :: WPARCEL, BET2, BETA, CF1, CF2 + REAL(KIND=JPRB) :: C1, C2, C3, C4, X_FHH + REAL(KIND=JPRB) :: X1, X2, X3, Y1, Y2, Y3, SINTEG1, SINTEG2, SINTEG3 + INTEGER(KIND=JPIM) :: I + + ! Inputs + TEMP = BOX%TEMP + PRES = BOX%PRES + AKOH = BOX%AKOH + ALFA = BOX%ALFA + A = BOX%A + B = BOX%B + ACCOM = BOX%ACCOM + ! + ! *** Setup common block variables + ! + PRESA = PRES/1.013E+5_JPRB ! Pressure (Pa) + AKA = (4.39_JPRB+0.071_JPRB*TEMP)*1.E-3_JPRB ! Air thermal conductivity + DAIR = PRES*AMA/RGAS/TEMP ! Air density + PSAT = VPRES(TEMP)*(1.E+5_JPRB/1.0E+3_JPRB) ! Saturation vapor pressure + DV = (0.211_JPRB/PRESA)*(TEMP/273._JPRB)**1.94 + DV = DV*1.E-4_JPRB ! Water vapor diffusivity in air + DBIG = 5.0E-6_JPRB + DLOW = 0.207683_JPRB*((ACCOM)**(-0.33048_JPRB)) + DLOW = DLOW*1.E-6_JPRB + ! + ! *** Compute an average diffusivity Dv as a function of ACCOM + ! + COEF = ((2._JPRB*PI*AMW/(RGAS*TEMP))**0.5_JPRB) + DV = (DV/(DBIG-DLOW))*((DBIG-DLOW)-(2._JPRB*DV/ACCOM)*COEF* & + (LOG((DBIG+(2._JPRB*DV/ACCOM)*COEF)/(DLOW+(2._JPRB*DV/ACCOM)* & + COEF)))) ! Non-continuum effects + + WPARCEL = WPARC + ! + ! *** Setup constants + ! + BET1 = PRES*AMA/PSAT/AMW + AMW*DHV*DHV/CPAIR/RGAS/TEMP/TEMP + BET2 = RGAS*TEMP*DENW/PSAT/DV/AMW/4._JPRB + & + DHV*DENW/4._JPRB/AKA/TEMP*(DHV*AMW/RGAS/TEMP - 1._JPRB) + BETA = 0.5_JPRB*PI*BET1*DENW/BET2/ALFA/WPARC/DAIR + CF1 = 0.5_JPRB*(((1._JPRB/BET2)/(ALFA*WPARC))**0.5_JPRB) + CF2 = AKOH/3._JPRB + ! + ! DETERMINATION OF EXPONENT FOR FHH PARTICLES + ! + C1 = (D11)+(D12/A)+(D13/(A*A))+(D14/(A*A*A))+(D15/(A*A*A*A)) + C2 = (D21)+(D22/A)+(D23/(A*A))+(D24/(A*A*A))+(D25/(A*A*A*A)) + C3 = (D31)+(D32/A)+(D33/(A*A))+(D34/(A*A*A))+(D35/(A*A*A*A)) + C4 = (D41)+(D42/A)+(D43/(A*A))+(D44/(A*A*A))+(D45/(A*A*A*A)) + X_FHH = (C1) + (C2/B) + (C3/(B*B)) + (C4/(B*B*B)) + ! + ! *** INITIAL VALUES FOR BISECTION ************************************* + ! + X1 = 1.0E-5_JPRB ! Min cloud supersaturation -> 0 + CALL SINTEGRAL (X1,NDRPL,WPARCEL,X_FHH,BET2, & + SINTEG1,SINTEG2,SINTEG3,BOX) + Y1 = (SINTEG1*CF1+SINTEG2*CF2+SINTEG3*CF1)*BETA*X1 - 1._JPRB + ! + X2 = 0.1_JPRB ! MAX cloud supersaturation = 10% + CALL SINTEGRAL (X2,NDRPL,WPARCEL,X_FHH,BET2, & + SINTEG1,SINTEG2,SINTEG3,BOX) + Y2 = (SINTEG1*CF1+SINTEG2*CF2+SINTEG3*CF1)*BETA*X2 - 1._JPRB + ! + ! *** PERFORM BISECTION ************************************************ + ! + DO I=1,MAXIT + X3 = 0.5_JPRB*(X1+X2) + CALL SINTEGRAL (X3,NDRPL,WPARCEL,X_FHH,BET2, & + SINTEG1,SINTEG2,SINTEG3,BOX) + Y3 = (SINTEG1*CF1+SINTEG2*CF2+SINTEG3*CF1)*BETA*X3 - 1._JPRB + ! + IF (SIGN(1._JPRB,Y1)*SIGN(1._JPRB,Y3) .LE. ZERO) THEN ! (Y1*Y3 .LE. ZERO) + Y2 = Y3 + X2 = X3 + ELSE + Y1 = Y3 + X1 = X3 + ENDIF + ! + IF (ABS(X2-X1) .LE. EPS*X1) EXIT + + ENDDO + + ! *** CONVERGED ; RETURN *********************************************** + X3 = 0.5_JPRB*(X1+X2) + + CALL SINTEGRAL (X3,NDRPL,WPARCEL,X_FHH,BET2, & + SINTEG1,SINTEG2,SINTEG3,BOX) + Y3 = (SINTEG1*CF1+SINTEG2*CF2+SINTEG3*CF1)*BETA*X3 - 1._JPRB + + SMAX = X3 + + END SUBROUTINE ACTIVATE + +!C======================================================================= +!C +!C *** SUBROUTINE SINTEGRAL +!C *** THIS SUBROUTINE CALCULATES THE CONDENSATION INTEGRALS, ACCORDING +!C TO THE POPULATION SPLITTING ALGORITHM AND THE SUBSEQUENT VERSIONS: +!C +!C - Nenes and Seinfeld (2003) Population Splitting +!C - Fountoukis and Nenes (2004) Modal formulation +!C - Barahona and Nenes (2010) Approach for large CCN +!C - Morales and Nenes (2014) Population Splitting revised +!C +!C *** WRITTEN BY ATHANASIOS NENES for Kohler Particles +!C *** MODFIFIED BY PRASHANT KUMAR AND ATHANASIOS NENES TO INCLUDE FHH +!C PARTICLES +!C======================================================================= + + SUBROUTINE SINTEGRAL (SPAR, SUMMA, WPARCEL, XFHH, BET2, & + SUM, SUMMAT, SUMFHH, BOX) + + REAL(KIND=JPRB), INTENT(IN) :: SPAR + REAL(KIND=JPRB), INTENT(IN) :: WPARCEL + REAL(KIND=JPRB), INTENT(IN) :: XFHH + REAL(KIND=JPRB), INTENT(IN) :: BET2 + + REAL(KIND=JPRB), INTENT(OUT) :: SUMMA, SUM, SUMMAT, SUMFHH + + TYPE(NDPARAM), INTENT(IN) :: BOX + + REAL(KIND=JPRB) :: ND(NSMX), NDF(NSMX) + REAL(KIND=JPRB) :: INTEG1(NSMX), INTEG2(NSMX), INTEG1F(NSMX) + REAL(KIND=JPRB) :: ALFA, AKOH, TP(NSMX), SG(NSMX), SIG(NSMX) + + REAL(KIND=JPRB) :: ERF1C,ERF2,ERF3,ERF4C,ERF5C,ERF6C,ERF4FC,ERF5F + REAL(KIND=JPRB) :: ORISM1, ORISM2, ORISM3, ORISM4, ORISM5,ORISM6 + REAL(KIND=JPRB) :: INTAUX1P1, INTAUX1P2, DLGSP, DLGSP1, DLGSP2, DLGSPF, DLGSGF, DLGSG + REAL(KIND=JPRB) :: RATIO, SCRIT, DW3, SSPLT1, SSPLT2, DESCR, DEQ, EKTH, SQTWO + + REAL(KIND=JPRB) :: ORISM1F, ORISM2F, ORISM3F, ORISM4F, ORISM5F + REAL(KIND=JPRB) :: ORISM6F, ORISM7F, ORISM8F, ORISM9F + LOGICAL :: CRIT2 + INTEGER(KIND=JPIM) :: I,J + + SQTWO = SQRT(2._JPRB) + + ! input + ALFA = BOX%ALFA + AKOH = BOX%AKOH + DO I=1,BOX%NMD + TP(I) = BOX%TP(I) + SG(I) = BOX%SG(I) + SIG(I) = BOX%SIG(I) + ENDDO + + ! ** Population Splitting -- Modified by Ricardo Morales 2014 + + DESCR = 1._JPRB - (16._JPRB/9._JPRB)*ALFA*WPARCEL*BET2*(AKOH/SPAR**2)**2 + IF (DESCR.LE.0.0_JPRB) THEN + CRIT2 = .TRUE. + scrit = ((16._JPRB/9._JPRB)*ALFA*WPARCEL*BET2*(AKOH**2))**(0.25_JPRB) ! Scrit - (only for DELTA < 0 ) + RATIO = (2.0E+7_JPRB/3.0_JPRB)*AKOH*(SPAR**(-0.3824_JPRB)-scrit**(-0.3824_JPRB)) ! Computing sp1 and sp2 (sp1 = sp2) + RATIO = 1._JPRB/SQTWO + RATIO + IF (RATIO.GT.1.0_JPRB) RATIO = 1.0_JPRB + SSPLT2 = SPAR*RATIO + ELSE + CRIT2 = .FALSE. + SSPLT1 = 0.5_JPRB*(1._JPRB-SQRT(DESCR)) ! min root --> sp1 + SSPLT2 = 0.5_JPRB*(1._JPRB+SQRT(DESCR)) ! max root --> sp2 + SSPLT1 = SQRT(SSPLT1)*SPAR ! Multiply ratios with Smax + SSPLT2 = SQRT(SSPLT2)*SPAR + ENDIF + + ! + ! *** Computing the condensation integrals I1 and I2 + ! + SUM = 0.0_JPRB !Contribution of integral 1 for Kohler + SUMMAT = 0.0_JPRB !Contribution of integral 2 for kohler + SUMMA = 0.0_JPRB !Variable that stores all droplets + SUMFHH = 0.0_JPRB !Contribution of FHH integral + + DO J = 1, BOX%NMD + + IF (SG(J).GT.0.0_JPRB) THEN !eehol: do not calculate if SG=0 or less + IF (BOX%MODE(J).EQ.1) THEN ! Kohler modes + + DLGSG = LOG(SIG(J)) !ln(sigmai) + DLGSP = LOG(SG(J)/SPAR) !ln(sg/smax) + DLGSP2 = LOG(SG(J)/SSPLT2) !ln(sg/sp2) + + ORISM1 = 2._JPRB*DLGSP2/(3._JPRB*SQTWO*DLGSG) ! u(sp2) + ORISM2 = ORISM1 - 3._JPRB*DLGSG/(2._JPRB*SQTWO) ! u(sp2)-3ln(sigmai)/(2sqrt(2) + ORISM5 = 2._JPRB*DLGSP/(3._JPRB*SQTWO*DLGSG) ! u(smax) + ORISM3 = ORISM5 - 3._JPRB*DLGSG/(2._JPRB*SQTWO) ! u(smax)-3ln(sigmai)/(2sqrt(2) + DEQ = AKOH*2._JPRB/SG(j)/3._JPRB/SQRT(3._JPRB) ! Dp0 = Dpc/sqrt(3) - Equilibrium diameter + + ERF2 = erf(ORISM2) + ERF3 = erf(ORISM3) + + INTEG2(J) = (EXP(9._JPRB/8._JPRB*DLGSG*DLGSG)*TP(J)/SG(J))* & + (ERF2 - ERF3) ! I2(sp2,smax) + + IF (CRIT2) THEN + + ORISM6 = (SQTWO*DLGSP2/3._JPRB/DLGSG)-(1.5_JPRB*DLGSG/SQTWO) + ERF6C = erfc(ORISM6) + + INTEG1(J) = 0.0_JPRB + DW3 = TP(j)*DEQ*EXP(9._JPRB/8._JPRB*DLGSG*DLGSG)* & ! 'inertially' limited particles + ERF6C*((BET2*ALFA*WPARCEL)**0.5_JPRB) + + ELSE + + EKTH = EXP(9._JPRB/2._JPRB*DLGSG*DLGSG) + DLGSP1 = LOG(SG(J)/SSPLT1) ! ln(sg/sp1) + ORISM4 = ORISM1 + 3._JPRB*DLGSG/SQTWO ! u(sp2) + 3ln(sigmai)/sqrt(2) + ERF1C = erfc(ORISM1) + ERF4C = erfc(ORISM4) + + intaux1p2 = TP(J)*SPAR*(ERF1C - & + 0.5_JPRB*((SG(J)/SPAR)**2)*EKTH*ERF4C) ! I1(0,sp2) + + ORISM1 = 2._JPRB*DLGSP1/(3._JPRB*SQTWO*DLGSG) ! u(sp1) + ORISM4 = ORISM1 + 3._JPRB*DLGSG/SQTWO ! u(sp1) + 3ln(sigmai)/sqrt(2) + ORISM6 = (SQTWO*DLGSP1/3._JPRB/DLGSG)-(1.5_JPRB*DLGSG/SQTWO) + + ERF1C = erfc(ORISM1) + ERF4C = erfc(ORISM4) + ERF6C = erfc(ORISM6) + + intaux1p1 = TP(J)*SPAR*(ERF1C - & + 0.5_JPRB*((SG(J)/SPAR)**2)*EKTH*ERF4C) ! I1(0,sp1) + + INTEG1(J) = (intaux1p2-intaux1p1) ! I1(sp1,sp2) = I1(0,sp2) - I1(0,sp1) + ! + DW3 = TP(j)*DEQ*EXP(9._JPRB/8._JPRB*DLGSG*DLGSG)* & ! 'inertially' limited particles. + ERF6C*((BET2*ALFA*WPARCEL)**0.5_JPRB) + + ENDIF + + ! *** Calculate number of Drops + + ERF5C = erfc(ORISM5) + ! + Nd(J) = (TP(J)/2.0_JPRB)*ERF5C + SUM = SUM + INTEG1(J) + DW3 !SUM OF INTEGRAL 1 FOR KOHLER + SUMMAT = SUMMAT + INTEG2(J) !SUM OF INTEGRAL 2 FOR KOHLER + SUMMA = SUMMA + Nd(J) !SUM OF ACTIVATED KOHLER PARTICLES + + ELSEIF (BOX%MODE(J).EQ.2) THEN ! FHH modes + + DLGSGF = LOG(SIG(J)) ! ln(sigma,i) + DLGSPF = LOG(SG(J)/SPAR) ! ln(sg/smax) + ORISM1F = (SG(J)*SG(J))/(SPAR*SPAR) ! (sg/smax)^2 + ORISM2F = EXP(2._JPRB*XFHH*XFHH*DLGSGF*DLGSGF) ! exp(term) + ORISM3F = SQTWO*XFHH*DLGSGF ! sqrt(2).x.ln(sigma,i) + ORISM4F = DLGSPF/(-1._JPRB*ORISM3F) ! Umax + ORISM5F = ORISM3F - ORISM4F + ERF5F = erf(ORISM5F) + ORISM6F = ERF5F + ORISM7F = ORISM6F + 1._JPRB + ORISM8F = 0.5_JPRB*ORISM1F*ORISM2F*ORISM7F + ERF4FC = erfc(ORISM4F) + ORISM9F = ORISM8F - ERF4FC + + INTEG1F(J) =-1._JPRB*TP(J)*SPAR*ORISM9F + + ! *** Calculate number of drops activated by FHH theory + ERF4FC = erfc(ORISM4F) + + NdF(J) = (TP(J)/2.0_JPRB)*ERF4FC + SUMFHH = SUMFHH + INTEG1F(J) !Sum of Integral 1 for FHH + SUMMA = SUMMA + NdF(J) !Sum of ACTIVATED Kohler + FHH particles + + ENDIF + ENDIF !eehol: if SG.GT.ZERO + ENDDO + + END SUBROUTINE SINTEGRAL + + !C======================================================================= + !C + !C *** SUBROUTINE PROPS + !C *** THIS SUBROUTINE CALCULATES THE THERMOPHYSICAL PROPERTIES + !C + !C *** WRITTEN BY ATHANASIOS NENES + !C + !C======================================================================= + +! SUBROUTINE PROPS +! +! !REAL(KIND=JPRB) :: VPRES, SFT +! +! !PRESA = PRES/1.013d5 ! Pressure (Pa) +! !DAIR = PRES*AMA/RGAS/TEMP ! Air density +! !AKA = (4.39+0.071*TEMP)*1d-3 ! Air thermal conductivity +! !PSAT = VPRES(SNGL(TEMP))*(1e5/1.0d3) ! Saturation vapor pressure +! !SURT = SFT(SNGL(TEMP)) ! Surface Tension for water (J m-2) +! +! END SUBROUTINE PROPS + + !C======================================================================= + !C + !C *** FUNCTION VPRES + !C *** THIS FUNCTION CALCULATES SATURATED WATER VAPOUR PRESSURE AS A + !C FUNCTION OF TEMPERATURE. VALID FOR TEMPERATURES BETWEEN -50 AND + !C 50 C. + !C + !C========================= ARGUMENTS / USAGE =========================== + !C + !C INPUT: + !C [T] + !C REAL variable. + !C Ambient temperature expressed in Kelvin. + !C OUTPUT: + !C [VPRES] + !C REAL variable. + !C Saturated vapor pressure expressed in mbar. + !C + !C======================================================================= + + REAL(KIND=JPRB) PURE FUNCTION VPRES (T) + + REAL(KIND=JPRB), INTENT(IN) :: T + REAL(KIND=JPRB) :: A(0:6), TTEMP + INTEGER(KIND=JPIM) :: I + + A=(/ 6.107799610E+0_JPRB, 4.436518521E-1_JPRB, 1.428945805E-2_JPRB, & + 2.650648471E-4_JPRB, 3.031240396E-6_JPRB, 2.034080948E-8_JPRB, & + 6.136820929E-11_JPRB /) + + TTEMP = T-273._JPRB + VPRES = A(6)*TTEMP + DO I=5,1,-1 + VPRES = (VPRES + A(I))*TTEMP + ENDDO + VPRES = VPRES + A(0) + RETURN + END FUNCTION VPRES + +!C======================================================================= +!C +!C *** FUNCTION SFT +!C *** THIS FUNCTION CALCULATES WATER SURFACE TENSION AS A +!C FUNCTION OF TEMPERATURE. VALID FOR TEMPERATURES BETWEEN -40 AND +!C 40 C. +!C +!C ======================== ARGUMENTS / USAGE =========================== +!C +!C INPUT: +!C [T] +!C REAL variable. +!C Ambient temperature expressed in Kelvin. +!C +!C OUTPUT: +!C [SFT] +!C REAL variable. +!C Surface Tension expressed in J m-2. +!C +!C======================================================================= + + REAL(KIND=JPRB) PURE FUNCTION SFT (T) + REAL(KIND=JPRB), INTENT(IN) :: T + REAL(KIND=JPRB) :: TPARS + + TPARS = T-273._JPRB + SFT = 0.0761_JPRB - 1.55E-4_JPRB*TPARS + + RETURN + END FUNCTION SFT + + !C *********************************************************************** + !C Calculation of points and weights for N point GAUSS integration + !C *********************************************************************** + SUBROUTINE GAULEG (X,W,N) + + INTEGER(KIND=JPIM), INTENT(IN) :: N + REAL(KIND=JPRB), INTENT(OUT) :: X(N), W(N) + + REAL(KIND=JPRB), PARAMETER :: EPS=1.E-6_JPRB + REAL(KIND=JPRB), PARAMETER :: X1=-1.0_JPRB, X2=1.0_JPRB + + REAL(KIND=JPRB) :: XM, XL, Z, Z1, P1, P2, P3, PP + INTEGER(KIND=JPIM) :: I,J,M + ! + ! Calculation + ! + M=(N+1)/2 + XM=0.5_JPRB*(X2+X1) + XL=0.5_JPRB*(X2-X1) + DO I=1,M + Z=COS(3.141592654_JPRB*(I-.25_JPRB)/(N+.5_JPRB)) + DO + P1=1._JPRB + P2=0._JPRB + DO J=1,N + P3=P2 + P2=P1 + P1=((2._JPRB*J-1._JPRB)*Z*P2-(J-1._JPRB)*P3)/J + ENDDO + PP=N*(Z*P1-P2)/(Z*Z-1._JPRB) + Z1=Z + Z=Z1-P1/PP + IF (ABS(Z-Z1).LE.EPS) EXIT + END DO + + X(I)=XM-XL*Z + X(N+1-I)=XM+XL*Z + W(I)=2._JPRB*XL/((1._JPRB-Z*Z)*PP*PP) + W(N+1-I)=W(I) + ENDDO + RETURN + END SUBROUTINE GAULEG + +!C======================================================================= +!C +!C *** REAL FUNCTION erfp +!C *** THIS SUBROUTINE CALCULATES THE ERROR FUNCTION USING A +!C *** POLYNOMIAL APPROXIMATION +!C +!C======================================================================= + +!USE-ERF/ERFC-BUILTINS REAL(KIND=JPRB) PURE FUNCTION ERFP(X) +!USE-ERF/ERFC-BUILTINS REAL(KIND=JPRB), INTENT(IN) :: X +!USE-ERF/ERFC-BUILTINS REAL(KIND=JPRB) :: AXX, Y +!USE-ERF/ERFC-BUILTINS REAL(KIND=JPRB), DIMENSION(4), PARAMETER :: AA = (/0.278393_JPRB, 0.230389_JPRB, 0.000972_JPRB, 0.078108_JPRB/) +!USE-ERF/ERFC-BUILTINS +!USE-ERF/ERFC-BUILTINS Y = ABS(X) +!USE-ERF/ERFC-BUILTINS AXX = 1._JPRB + Y*(AA(1)+Y*(AA(2)+Y*(AA(3)+Y*AA(4)))) +!USE-ERF/ERFC-BUILTINS AXX = AXX*AXX +!USE-ERF/ERFC-BUILTINS AXX = AXX*AXX +!USE-ERF/ERFC-BUILTINS AXX = 1._JPRB - (1._JPRB/AXX) +!USE-ERF/ERFC-BUILTINS IF(X.LE.0._JPRB) THEN +!USE-ERF/ERFC-BUILTINS ERFP = -AXX +!USE-ERF/ERFC-BUILTINS ELSE +!USE-ERF/ERFC-BUILTINS ERFP = AXX +!USE-ERF/ERFC-BUILTINS ENDIF +!USE-ERF/ERFC-BUILTINS RETURN +!USE-ERF/ERFC-BUILTINS END FUNCTION ERFP + +END MODULE ND_PARAM diff --git a/ifs-source/arpifs/m7/phys_ec/NdParam.f b/ifs-source/arpifs/m7/phys_ec/NdParam.f deleted file mode 100644 index df60b50f..00000000 --- a/ifs-source/arpifs/m7/phys_ec/NdParam.f +++ /dev/null @@ -1,730 +0,0 @@ -!======================================================================= -! -! *** BLOCK DATA BLKPAR -! *** THIS SUBROUTINE PROVIDES INITIAL (DEFAULT) VALUES TO PROGRAM -! PARAMETERS VIA DATA STATEMENTS -! -! *** WRITTEN BY ATHANASIOS NENES -! *** MODIFIED BY PRASHANT KUMAR AND ATHANASIOS NENES -! *** MODIFIED FOR EC-EARTH BY TWAN VAN NOIJE AND ATHANASIOS NENES -! -!======================================================================= -! - BLOCK DATA BLKPAR -! - INCLUDE 'parametr.inc' -! - DATA AMA /29d-3/ ! Air molecular weight - DATA GRAV /9.81d0/ ! g constant - DATA RGAS /8.31d0/ ! Universal gas constant - DATA Dw /2.75d-10/ ! Water Molecule Diameter - DATA AMW /18d-3/ ! Water molecular weight - DATA DENW /1d3/ ! Water density - DATA DHV /2.25d6/ ! Water enthalpy of vaporization - DATA CPAIR /1.0061d3/ ! Air Cp - -! Data for FHH exponent calculation - - DATA D11 /-0.1907/ - DATA D12 /-1.6929/ - DATA D13 /1.4963/ - DATA D14 /-0.5644/ - DATA D15 /0.0711/ - ! for C2 - DATA D21 /-3.9310/ - DATA D22 /7.0906/ - DATA D23 /-5.3436/ - DATA D24 /1.8025/ - DATA D25 /-0.2131/ - ! for C3 - DATA D31 /8.4825/ - DATA D32 /-14.9297/ - DATA D33 /11.4552/ - DATA D34 /-3.9115/ - DATA D35 /0.4647/ - ! for C4 - DATA D41 /-5.1774/ - DATA D42 /8.8725/ - DATA D43 /-6.8527/ - DATA D44 /2.3514/ - DATA D45 /-0.2799/ -! - DATA MAXIT /30/ ! Max iterations for solution - DATA EPS /1d-5/ ! Convergence criterion -! - DATA PI /3.1415927d0/ ! Some constants - DATA ZERO /0d0/ - DATA GREAT /1D30/ - DATA SQ2PI /2.5066282746d0/ -! - DATA CCNSPST /.FALSE./ ! Internal consistency check - DATA FIRST_GAULEG /.TRUE./ -! -! *** END OF BLOCK DATA SUBPROGRAM ************************************* -! - END -!======================================================================= -!======================================================================= -! -! *** SUBROUTINE CCNSPEC -! *** THIS SUBROUTINE CALCULATES THE CCN SPECTRUM OF THE AEROSOL USING -! THE APPROPRIATE FORM OF KOHLER THEORY -! -! *** ORIGINALLY WRITTEN BY ATHANASIOS NENES FOR ONLY KOHLER PARTICLES -! *** MODIFIED BY PRASHANT KUMAR AND ATHANSIOS NENES TO INCLUDE -! *** ACTIVATION BY FHH PARTICLES -! -!======================================================================= -! - SUBROUTINE CCNSPEC (TPI,DPGI,SIGI,MODEI,TPARC,PPARC,NMODES, - & AKKI,A,B,SG) -! - INCLUDE 'parametr.inc' - DOUBLE PRECISION, INTENT(IN) :: TPI(NMODES), DPGI(NMODES), - & SIGI(NMODES), TPARC, PPARC, - & AKKI(NSMX), A, B - - INTEGER, INTENT(IN) :: MODEI(NMODES), NMODES -! - DOUBLE PRECISION, INTENT(OUT) :: SG(NSMX) - - DOUBLE PRECISION, PARAMETER :: ZEPS = 1D-9 !eehol: small value for diameter (1e-8 = 0.01 um) - - DOUBLE PRECISION TP(NSMX) - DOUBLE PRECISION Dpcm - - NMD = NMODES ! Save aerosol params in COMMON - DO I=1,NMD - MODE(I)= MODEI(I) - DPG(I)=DPGI(I) - SIG(I) = SIGI(I) - TP(I) = TPI(I) - ENDDO -!C - TEMP = TPARC ! Save parcel props in COMMON - PRES = PPARC - CALL PROPS ! Thermophysical properties - AKOH = 4D0*AMW*SURT/RGAS/TEMP/DENW ! Kelvin parameter -!C - !WRITE(3345,*) 'AKKI= ', AKKI(:) - !WRITE(3345,*) 'DPG= ', DPG(:) - !WRITE(3345,*) 'AKOH= ', AKOH - - DO K=1,NMD - IF (MODE(K).EQ.1) THEN ! Kohler modes - IF (DPG(K).GE.ZEPS) THEN !eehol: add treshold if median diam is low - PAR1 = 4D0/27D0/AKKI(K)/DPG(K)**3 - PAR2 = SQRT(PAR1*AKOH**3) - SG(K) = EXP(PAR2) - 1D0 - ELSE - SG(K) = ZERO - END IF - ELSEIF (MODE(K).EQ.2) THEN ! FHH modes - CALL DpcFHH(DPG(K),TPARC,A,B,Dpcm) - Dpc(K) = Dpcm - SG(K) = (AKOH/Dpc(K))+(-A*(((Dpc(K)-DPG(K))/(2*Dw))**(-B))) - ENDIF - ENDDO -!C -!C ** INITIALIZE: CALCULATE GAUSS QUADRATURE POINTS ********************* -!C - IF (FIRST_GAULEG) THEN - CALL GAULEG (XGS, WGS, Npgauss) - FIRST_GAULEG = .FALSE. - ENDIF - - !open(unit=667, file='stuffxxx', access='append', status='unknown') - !write(667,*) TEMP, PRES, AKOH, AMW, SURT, RGAS, DENW, SG - !close(667) -!C -!C *** END OF SUBROUTINE CCNSPEC **************************************** -!C - RETURN - END -!C======================================================================= -!C======================================================================= -!C -!C *** SUBROUTINE DpcFHH -!C *** THIS SUBROUTINE CALCULATES THE CRITICAL PARTICLE DIAMETER -!C ACCORDING TO THE FHH ADSOSPRTION ISOTHERM THEORY. -!C -!C *** WRITTEN BY PRASHANT KUMAR AND ATHANASIOS NENES -!C -!C======================================================================= -!C - SUBROUTINE DpcFHH(Ddry,TPARC,A,B,Dc) -!C - Include 'parametr.inc' - DOUBLE PRECISION Ddry,mu,mu1,mu2,mu3,X1,X2l,Dpcm,Dpcl,Dpcu, - &X3,F1,F2,X3l,X2u,X3u,FDpcl,FDpcu,FDpcm,X2m,X3m,Dc,A,B - - TEMP = TPARC - CALL PROPS - - mu=(4*SURT*AMW)/(RGAS*TEMP*DENW) - mu1=(mu*2*Dw)/((A*B)*((2*Dw)**(B+1))) - mu2=1/mu1 - mu3=1-(mu2**(1/(1+B))) - - Dpcl = 0 !Lower Limit - Dpcu = 10e-4 !Upper Limit - -100 X1 = mu2**(1/(1+B)) - X2l = Dpcl**(2/(1+B)) - X3l = X1*X2l - FDpcl=((Dpcl-X3l)/Ddry)-1 - - X1 = mu2**(1/(1+B)) - X2u = Dpcu**(2/(1+B)) - X3u = X1*X2u - FDpcu=((Dpcu-X3u)/Ddry)-1 - - Dpcm = (Dpcu+Dpcl)/2 - - X1= mu2**(1/(1+B)) - X2m= Dpcm**(2/(1+B)) - X3m= X1*X2m - FDpcm=((Dpcm-X3m)/Ddry)-1 - - - If ((FDpcl*FDpcm).Le.0) Then - - If (ABS(FDpcm).Le.10e-8) Then - Goto 200 - Else - Dpcl = Dpcl - Dpcu = Dpcm - goto 100 - End if - - Else If ((FDpcl*FDpcm).GE.0) Then - - If (ABS(FDpcm).Le.10e-8) Then - Goto 200 - Else - Dpcl = Dpcm - Dpcu = Dpcu - goto 100 - End if - - Else If ((FDpcl*FDpcm).Eq.0) Then - Goto 200 - End if - -200 Dc = Dpcm - - RETURN - END - -!C *** END OF SUBROUTINE DpcFHH *************************************** -!C======================================================================= -!C======================================================================= -!C -!C *** SUBROUTINE PDFACTIV -!C *** THIS SUBROUTINE CALCULATES THE CCN ACTIVATION FRACTION ACCORDING -!C TO THE Nenes and Seinfeld (2003) PARAMETERIZATION, WITH -!C MODIFICATION FOR NON-CONTUNUUM EFFECTS AS PROPOSED BY Fountoukis -!C and Nenes (2004). THIS ROUTINE CALCULATES FOR A PDF OF -!C UPDRAFT VELOCITIES. -!C -!C *** WRITTEN BY ATHANASIOS NENES -!C -!C======================================================================= -!C - SUBROUTINE PDFACTIV (WPARC,TP,AKK,A,B,ACCOM,SG,SIGW, - & TPARC,PPARC,NACT,SMAX) -!C - INCLUDE 'parametr.inc' - DOUBLE PRECISION, INTENT(IN) :: TPARC, WPARC, A, B, ACCOM, SIGW, - & TP(NSMX),AKK(NSMX),SG(NSMX) - DOUBLE PRECISION, INTENT(OUT) :: NACT, SMAX - - DOUBLE PRECISION NACTI, SMAXI, DENOM - REAL PDF - -!C -!C *** Single updraft case -!C - IF (SIGW.LT.1e-10) THEN - - !C - !C *** Case where updraft is very small - !C - IF (WPARC.LE.1d-6) THEN - SMAX = 0d0 - NACT = 0d0 - RETURN - ENDIF - - CALL ACTIVATE (WPARC,TP,AKK,A,B,ACCOM,SG,NACT,SMAX) -!C -!C *** PDF of updrafts -!C - ELSE - NACT = ZERO - SMAX = ZERO - DENOM = ZERO - PLIMT = 1e-3 ! Probability of High Updraft limit - PROBI = SQRT(-2.0*LOG(PLIMT*SIGW*SQ2PI)) - WHI = WPARC + SIGW*PROBI ! Upper updrft limit - ! No need to cut off the PDF at 0.05 m/s. - ! Using a lower value will change the normalization. - ! WLO = 0.05 ! Low updrft limit - WLO = 0.0 - SCAL = 0.5*(WHI-WLO) ! Scaling for updrafts - !open(unit=667,file='pgaussxx',access='append',status='unknown') - DO I=1,Npgauss - ! Points are symmetric around zero, - ! so the sign of the XGS term is irrelevant. - ! As the convention is to use a plus sign, - ! we change the minus from the original code into a plus: - !WPI = WLO + SCAL*(1.0-XGS(i)) ! Updraft - WPI = WLO + SCAL*(1.0+XGS(i)) ! Updraft - - ! Catch very small velocities - ! using the same cutoff as above - IF (WPI.LE.1d-6) THEN - SMAXI = 0d0 - NACTI = 0d0 - ELSE - CALL ACTIVATE (WPI,TP,AKK,A,B,ACCOM,SG,NACTI,SMAXI) ! # of drops - ENDIF - PDF = (1.0/SQ2PI/SIGW)*EXP(-0.5*((WPI-WPARC)/SIGW)**2) ! Prob. of updrafts - NACT = NACT + WGS(i)*(PDF*NACTI) ! Integral for drops - SMAX = SMAX + WGS(i)*(PDF*SMAXI) ! Integral for Smax - DENOM = DENOM + WGS(i)*PDF - IF (PDF.LT.PLIMT) GOTO 100 - !write(667,*) NpGauss, i, nacti, smaxi - ENDDO - 100 NACT = NACT/DENOM - SMAX = SMAX/DENOM - !close(667) - ENDIF -!C - RETURN -!C -!C *** END OF SUBROUTINE PDFACTIV *************************************** -!C - END - -!C======================================================================= -!C======================================================================= -!C -!C *** SUBROUTINE ACTIVATE -!C *** THIS SUBROUTINE CALCULATES THE CCN ACTIVATION FRACTION ACCORDING -!C TO THE Nenes and Seinfeld (2003) PARAMETERIZATION, WITH -!C MODIFICATION FOR NON-CONTUNUUM EFFECTS AS PROPOSED BY Fountoukis -!C and Nenes (in preparation). -!C -!C *** WRITTEN BY ATHANASIOS NENES FOR KOHLER PARTICLES -!C *** MODIFIED BY PRASHANT KUMAR AND ATHANASIOS NENES TO INCLUDE FHH -!C PARTICLES -!C -!C======================================================================= -!C - SUBROUTINE ACTIVATE (WPARC,TP,AKK,A,B,ACCOM,SG,NDRPL,SMAX) - INCLUDE 'parametr.inc' - DOUBLE PRECISION NDRPL, WPARCEL,A,B,ACCOM,BET2,BETA - DOUBLE PRECISION TP(NSMX),AKK(NSMX),SG(NSMX) - DOUBLE PRECISION C1, C2, C3, C4, X_FHH -!C -!C *** Setup common block variables -!C - PRESA = PRES/1.013d5 ! Pressure (Pa) - DV = (0.211d0/PRESA)*(TEMP/273d0)**1.94 - DV = DV*1d-4 ! Water vapor diffusivity in air - DBIG = 5.0d-6 - DLOW = 0.207683*((ACCOM)**(-0.33048)) - DLOW = DLOW*1d-6 -!C -!C Compute an average diffusivity Dv as a function of ACCOM -!C - COEF = ((2*PI*AMW/(RGAS*TEMP))**0.5) - DV = (DV/(DBIG-DLOW))*((DBIG-DLOW)-(2*DV/ACCOM)*COEF* - & (DLOG((DBIG+(2*DV/ACCOM)*COEF)/(DLOW+(2*DV/ACCOM)* - & COEF)))) ! Non-continuum effects - - WPARCEL = WPARC -! -! *** Setup constants -! - ALFA = GRAV*AMW*DHV/CPAIR/RGAS/TEMP/TEMP - GRAV*AMA/RGAS/TEMP - BET1 = PRES*AMA/PSAT/AMW + AMW*DHV*DHV/CPAIR/RGAS/TEMP/TEMP - BET2 = RGAS*TEMP*DENW/PSAT/DV/AMW/4d0 + - & DHV*DENW/4d0/AKA/TEMP*(DHV*AMW/RGAS/TEMP - 1d0) - BETA = 0.5d0*PI*BET1*DENW/BET2/ALFA/WPARC/DAIR - CF1 = 0.5*(((1/BET2)/(ALFA*WPARC))**0.5) - CF2 = AKOH/3d0 -! -!C DETERMINATION OF EXPONENT FOR FHH PARTICLES -! - C1 = (D11)+(D12/A)+(D13/(A*A))+(D14/(A*A*A))+(D15/(A*A*A*A)) - C2 = (D21)+(D22/A)+(D23/(A*A))+(D24/(A*A*A))+(D25/(A*A*A*A)) - C3 = (D31)+(D32/A)+(D33/(A*A))+(D34/(A*A*A))+(D35/(A*A*A*A)) - C4 = (D41)+(D42/A)+(D43/(A*A))+(D44/(A*A*A))+(D45/(A*A*A*A)) - X_FHH = (C1) + (C2/B) + (C3/(B*B)) + (C4/(B*B*B)) -! -! *** INITIAL VALUES FOR BISECTION ************************************* -! - X1 = 1.0d-5 ! Min cloud supersaturation -> 0 - CALL SINTEGRAL (X1,NDRPL,WPARCEL,TP,X_FHH,BET2,SG, - & SINTEG1,SINTEG2,SINTEG3) - Y1 = (SINTEG1*CF1+SINTEG2*CF2+SINTEG3*CF1)*BETA*X1 - 1d0 -! - X2 = 0.1d0 ! MAX cloud supersaturation = 10% - CALL SINTEGRAL (X2,NDRPL,WPARCEL,TP,X_FHH,BET2,SG, - & SINTEG1,SINTEG2,SINTEG3) - Y2 = (SINTEG1*CF1+SINTEG2*CF2+SINTEG3*CF1)*BETA*X2 - 1d0 -! -! *** PERFORM BISECTION ************************************************ -! -20 DO 30 I=1,MAXIT - X3 = 0.5*(X1+X2) - CALL SINTEGRAL (X3,NDRPL,WPARCEL,TP,X_FHH,BET2,SG, - & SINTEG1,SINTEG2,SINTEG3) - Y3 = (SINTEG1*CF1+SINTEG2*CF2+SINTEG3*CF1)*BETA*X3 - 1d0 -! - IF (SIGN(1.d0,Y1)*SIGN(1.d0,Y3) .LE. ZERO) THEN ! (Y1*Y3 .LE. ZERO) - Y2 = Y3 - X2 = X3 - ELSE - Y1 = Y3 - X1 = X3 - ENDIF -! - IF (ABS(X2-X1) .LE. EPS*X1) GOTO 40 - NITER = I - -30 CONTINUE - -! *** CONVERGED ; RETURN *********************************************** -40 X3 = 0.5*(X1+X2) -! - CALL SINTEGRAL (X3,NDRPL,WPARCEL,TP,X_FHH,BET2,SG, - & SINTEG1,SINTEG2,SINTEG3) - Y3 = (SINTEG1*CF1+SINTEG2*CF2+SINTEG3*CF1)*BETA*X3 - 1d0 - - SMAX = X3 - - RETURN -!C -!C *** END OF SUBROUTINE ACTIVATE *************************************** -!C - END -!C======================================================================= -!C======================================================================= -!C -!C *** SUBROUTINE SINTEGRAL -!C *** THIS SUBROUTINE CALCULATES THE CONDENSATION INTEGRALS, ACCORDING -!C TO THE POPULATION SPLITTING ALGORITHM AND THE SUBSEQUENT VERSIONS: -!C -!C - Nenes and Seinfeld (2003) Population Splitting -!C - Fountoukis and Nenes (2004) Modal formulation -!C - Barahona and Nenes (2010) Approach for large CCN -!C - Morales and Nenes (2014) Population Splitting revised -!C -!C *** WRITTEN BY ATHANASIOS NENES for Kohler Particles -!C *** MODFIFIED BY PRASHANT KUMAR AND ATHANASIOS NENES TO INCLUDE FHH -!C PARTICLES -!C======================================================================= -!C - SUBROUTINE SINTEGRAL (SPAR, SUMMA, WPARCEL, TP, XFHH, BET2, SG, - & SUM, SUMMAT, SUMFHH) -!C - INCLUDE 'parametr.inc' - DOUBLE PRECISION SUM, SUMMAT, SUMMA, Nd(NSMX),WPARCEL,TP(NSMX), - & INTEG1(NSMX),INTEG2(NSMX),SG(NSMX),A,B,BET2 - & ,SUMFHH,INTEG1F(NSMX),NdF(NSMX), XFHH - - REAL ERF1,ERF2,ERF3,ERF4,ERF5,ERF6,ERF4F,ERF5F,ERF66F - REAL ORISM1, ORISM2, ORISM3, ORISM4, ORISM5,ORISM6 - REAL intaux2, intaux1p1, intaux1p2, DLGSP1,DLGSP2 - REAL scrit -!C - REAL ORISM1F, ORISM2F, ORISM3F, ORISM4F, ORISM5F, - & ORISM6F, ORISM7F, ORISM8F, ORISM9F, ORISM10F, - & ORISM11F, ORISM66F -! - SQTWO = SQRT(2d0) -!C -!C ** Population Splitting -- Modified by Ricardo Morales 2014 - - DESCR = 1d0 - (16d0/9d0)*ALFA*WPARCEL*BET2*(AKOH/SPAR**2)**2 - IF (DESCR.LE.0d0) THEN - CRIT2 = .TRUE. - scrit = ((16d0/9d0)*ALFA*WPARCEL*BET2*(AKOH**2))**(0.25d0) ! Scrit - (only for DELTA < 0 ) - RATIO = (2.0d7/3.0)*AKOH*(SPAR**(-0.3824)-scrit**(-0.3824)) ! Computing sp1 and sp2 (sp1 = sp2) - RATIO = 1/SQTWO + RATIO - IF (RATIO.GT.1.0) RATIO = 1.0 - SSPLT2 = SPAR*RATIO - ELSE - CRIT2 = .FALSE. - SSPLT1 = 0.5d0*(1d0-SQRT(DESCR)) ! min root --> sp1 - SSPLT2 = 0.5d0*(1d0+SQRT(DESCR)) ! max root --> sp2 - SSPLT1 = SQRT(SSPLT1)*SPAR ! Multiply ratios with Smax - SSPLT2 = SQRT(SSPLT2)*SPAR - ENDIF -!C - SSPLT = SSPLT2 ! Store Ssplit in COMMON -!C -!C *** Computing the condensation integrals I1 and I2 -!C - SUM = 0.0d0 !Contribution of integral 1 for Kohler - SUMMAT = 0.0d0 !Contribution of integral 2 for kohler - SUMMA = 0.0d0 !Variable that stores all droplets - SUMFHH = 0.0d0 !Contribution of FHH integral -!C - DO J = 1, NMD -!C - IF (SG(J).GT.0D0) THEN !eehol: do not calculate if SG=0 or less - IF (MODE(J).EQ.1) THEN ! Kohler modes -!C - DLGSG = DLOG(SIG(J)) !ln(sigmai) - DLGSP = DLOG(SG(J)/SPAR) !ln(sg/smax) - DLGSP2 = DLOG(SG(J)/SSPLT2) !ln(sg/sp2) -!C - ORISM1 = 2.d0*DLGSP2/(3.d0*SQTWO*DLGSG) ! u(sp2) - ORISM2 = ORISM1 - 3.d0*DLGSG/(2.d0*SQTWO) ! u(sp2)-3ln(sigmai)/(2sqrt(2) - ORISM5 = 2.d0*DLGSP/(3.d0*SQTWO*DLGSG) ! u(smax) - ORISM3 = ORISM5 - 3.d0*DLGSG/(2.d0*SQTWO) ! u(smax)-3ln(sigmai)/(2sqrt(2) - DEQ = AKOH*2d0/SG(j)/3d0/SQRT(3d0) ! Dp0 = Dpc/sqrt(3) - Equilibrium diameter - - ERF2 = erfp(ORISM2) - ERF3 = erfp(ORISM3) - - INTEG2(J) = (EXP(9D0/8D0*DLGSG*DLGSG)*TP(J)/SG(J))* - & (ERF2 - ERF3) ! I2(sp2,smax) - - IF (CRIT2) THEN - - ORISM6 = (SQTWO*DLGSP2/3d0/DLGSG)-(1.5d0*DLGSG/SQTWO) - ERF6 = erfp(ORISM6) - - INTEG1(J) = 0.0d0 - DW3 = TP(j)*DEQ*EXP(9D0/8D0*DLGSG*DLGSG)* ! 'inertially' limited particles - & (1d0-ERF6)*((BET2*ALFA*WPARCEL)**0.5d0) - - ELSE - - EKTH = EXP(9D0/2d0*DLGSG*DLGSG) - DLGSP1 = DLOG(SG(J)/SSPLT1) ! ln(sg/sp1) - ORISM4 = ORISM1 + 3.d0*DLGSG/SQTWO ! u(sp2) + 3ln(sigmai)/sqrt(2) - ERF1 = erfp(ORISM1) - ERF4 = erfp(ORISM4) - - intaux1p2 = TP(J)*SPAR*((1-ERF1) - - & 0.5d0*((SG(J)/SPAR)**2)*EKTH*(1-ERF4)) ! I1(0,sp2) - - ORISM1 = 2.d0*DLGSP1/(3.d0*SQTWO*DLGSG) ! u(sp1) - ORISM4 = ORISM1 + 3.d0*DLGSG/SQTWO ! u(sp1) + 3ln(sigmai)/sqrt(2) - ORISM6 = (SQTWO*DLGSP1/3d0/DLGSG)-(1.5d0*DLGSG/SQTWO) - - ERF1 = erfp(ORISM1) - ERF4 = erfp(ORISM4) - ERF6 = erfp(ORISM6) - - intaux1p1 = TP(J)*SPAR*((1-ERF1) - - & 0.5d0*((SG(J)/SPAR)**2)*EKTH*(1-ERF4)) ! I1(0,sp1) - - INTEG1(J) = (intaux1p2-intaux1p1) ! I1(sp1,sp2) = I1(0,sp2) - I1(0,sp1) -! - DW3 = TP(j)*DEQ*EXP(9D0/8D0*DLGSG*DLGSG)* ! 'inertially' limited particles. - & (1d0-ERF6)*((BET2*ALFA*WPARCEL)**0.5d0) - - ENDIF - -!C *** Calculate number of Drops - - ERF5 = erfp(ORISM5) -! - Nd(J) = (TP(J)/2.0)*(1.0-ERF5) - SUM = SUM + INTEG1(J) + DW3 !SUM OF INTEGRAL 1 FOR KOHLER - SUMMAT = SUMMAT + INTEG2(J) !SUM OF INTEGRAL 2 FOR KOHLER - SUMMA = SUMMA + Nd(J) !SUM OF ACTIVATED KOHLER PARTICLES - -!C - ELSEIF (MODE(J).EQ.2) THEN ! FHH modes -!C - DLGSGF = DLOG(SIG(J)) ! ln(sigma,i) - DLGSPF = DLOG(SG(J)/SPAR) ! ln(sg/smax) - ORISM1F = (SG(J)*SG(J))/(SPAR*SPAR) ! (sg/smax)^2 - ORISM2F = EXP(2D0*XFHH*XFHH*DLGSGF*DLGSGF) ! exp(term) - ORISM3F = SQTWO*XFHH*DLGSGF ! sqrt(2).x.ln(sigma,i) - ORISM4F = DLGSPF/(-1*ORISM3F) ! Umax - ORISM5F = ORISM3F - ORISM4F - ERF5F = erfp(ORISM5F) - ORISM6F = ERF5F - ORISM7F = ORISM6F + 1 - ORISM8F = 0.5*ORISM1F*ORISM2F*ORISM7F - ERF4F = erfp(ORISM4F) - ORISM9F = ORISM8F + ERF4F - 1 - - INTEG1F(J) =-1*TP(J)*SPAR*ORISM9F -!C -!C *** Calculate number of drops activated by FHH theory -!C - ERF4F = erfp(ORISM4F) - - NdF(J) = (TP(J)/2.0)*(1-ERF4F) - SUMFHH = SUMFHH + INTEG1F(J) !Sum of Integral 1 for FHH - SUMMA = SUMMA + NdF(J) !Sum of ACTIVATED Kohler + FHH particles - - ENDIF - ENDIF !eehol: if SG.GT.ZERO - ENDDO - RETURN -!C - END -!C======================================================================= -!C======================================================================= -!C -!C *** SUBROUTINE PROPS -!C *** THIS SUBROUTINE CALCULATES THE THERMOPHYSICAL PROPERTIES -!C -!C *** WRITTEN BY ATHANASIOS NENES -!C -!C======================================================================= -!C - SUBROUTINE PROPS - INCLUDE 'parametr.inc' - REAL VPRES, SFT -!C - PRESA = PRES/1.013d5 ! Pressure (Pa) - DAIR = PRES*AMA/RGAS/TEMP ! Air density - AKA = (4.39+0.071*TEMP)*1d-3 ! Air thermal conductivity - PSAT = VPRES(SNGL(TEMP))*(1e5/1.0d3) ! Saturation vapor pressure - SURT = SFT(SNGL(TEMP)) ! Surface Tension for water (J m-2) -!C - RETURN -!C -!C *** END OF SUBROUTINE PROPS ****************************************** -!C - END -!C======================================================================= -!C======================================================================= -!C -!C *** FUNCTION VPRES -!C *** THIS FUNCTION CALCULATES SATURATED WATER VAPOUR PRESSURE AS A -!C FUNCTION OF TEMPERATURE. VALID FOR TEMPERATURES BETWEEN -50 AND -!C 50 C. -!C -!C========================= ARGUMENTS / USAGE =========================== -!C -!C INPUT: -!C [T] -!C REAL variable. -!C Ambient temperature expressed in Kelvin. -!C OUTPUT: -!C [VPRES] -!C REAL variable. -!C Saturated vapor pressure expressed in mbar. -!C -!C======================================================================= -!C - REAL FUNCTION VPRES (T) - REAL A(0:6), T - DATA A/6.107799610E+0, 4.436518521E-1, 1.428945805E-2, - & 2.650648471E-4, 3.031240396E-6, 2.034080948E-8, - & 6.136820929E-11/ - - TTEMP = T-273 - VPRES = A(6)*TTEMP - DO I=5,1,-1 - VPRES = (VPRES + A(I))*TTEMP - ENDDO - VPRES = VPRES + A(0) - RETURN - END -!C======================================================================= -!C======================================================================= -!C -!C *** FUNCTION SFT -!C *** THIS FUNCTION CALCULATES WATER SURFACE TENSION AS A -!C FUNCTION OF TEMPERATURE. VALID FOR TEMPERATURES BETWEEN -40 AND -!C 40 C. -!C -!C ======================== ARGUMENTS / USAGE =========================== -!C -!C INPUT: -!C [T] -!C REAL variable. -!C Ambient temperature expressed in Kelvin. -!C -!C OUTPUT: -!C [SFT] -!C REAL variable. -!C Surface Tension expressed in J m-2. -!C -!C======================================================================= -!C - REAL FUNCTION SFT (T) - REAL T -!C - TPARS = T-273 - SFT = 0.0761-1.55e-4*TPARS -!C - RETURN - END -!C======================================================================= -!C *********************************************************************** -!C - SUBROUTINE GAULEG (X,W,N) -!C -!C Calculation of points and weights for N point GAUSS integration -!C *********************************************************************** - DIMENSION X(N), W(N) - PARAMETER (EPS=1.E-6) - PARAMETER (X1=-1.0, X2=1.0) -!C -!C Calculation -!C - M=(N+1)/2 - XM=0.5d0*(X2+X1) - XL=0.5d0*(X2-X1) - DO 12 I=1,M - Z=COS(3.141592654d0*(I-.25d0)/(N+.5d0)) -1 CONTINUE - P1=1.d0 - P2=0.d0 - DO 11 J=1,N - P3=P2 - P2=P1 - P1=((2.d0*J-1.)*Z*P2-(J-1.d0)*P3)/J -11 CONTINUE - PP=N*(Z*P1-P2)/(Z*Z-1.d0) - Z1=Z - Z=Z1-P1/PP - IF(ABS(Z-Z1).GT.EPS)GO TO 1 - X(I)=XM-XL*Z - X(N+1-I)=XM+XL*Z - W(I)=2.d0*XL/((1.d0-Z*Z)*PP*PP) - W(N+1-I)=W(I) -12 CONTINUE - RETURN - END - -!C======================================================================= -!C -!C *** REAL FUNCTION erfp -!C *** THIS SUBROUTINE CALCULATES THE ERROR FUNCTION USING A -!C *** POLYNOMIAL APPROXIMATION -!C -!C======================================================================= -!C - REAL*8 FUNCTION erfp(x) - REAL :: x - REAL*8 :: AA(4), axx, y - DATA AA /0.278393d0,0.230389d0,0.000972d0,0.078108d0/ - - y = dabs(dble(x)) - axx = 1.d0 + y*(AA(1)+y*(AA(2)+y*(AA(3)+y*AA(4)))) - axx = axx*axx - axx = axx*axx - axx = 1.d0 - (1.d0/axx) - if(x.le.0.) then - erfp = -axx - else - erfp = axx - endif - RETURN - END FUNCTION diff --git a/ifs-source/arpifs/m7/phys_ec/parametr.inc b/ifs-source/arpifs/m7/phys_ec/parametr.inc deleted file mode 100644 index b7f0bfb0..00000000 --- a/ifs-source/arpifs/m7/phys_ec/parametr.inc +++ /dev/null @@ -1,43 +0,0 @@ -C======================================================================= -C -C *** INCLUDE FILE 'PARAMETR.INC' -C *** THIS FILE CONTAINS THE DECLARATIONS OF THE GLOBAL CONSTANTS -C AND VARIABLES. -C -C *** WRITTEN BY ATHANASIOS NENES -C *** MODIFIED BY ATHANASIOS NENES AND PRASHANT KUMAR -C -C======================================================================= -C - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - - ! Three points is enough for PDF integration - ! using Gauss-Legendre quadrature - PARAMETER (NpGauss=3) - !PARAMETER (NpGauss=10) - ! Maximum number of lognormal modes, - ! here set to three for M7. - PARAMETER (NSMX = 3) - REAL XGS, WGS - LOGICAL CRIT2, CCNSPST - LOGICAL FIRST_GAULEG - - COMMON /INPUTS/ TEMP, PRES -C - & /CCNSPC/ DPG(NSMX), SIG(NSMX), Dpc(NSMX), - & MODE(NSMX), NMD -C - & /ACTVPR/ AKOH, SSPLT, ALFA, BET1, CRIT2, CCNSPST -C - & /THERMO/ AMW, AMA, GRAV, DENW, CPAIR, DHV, RGAS, AKA, - & PSAT, DAIR, SURT, Dw -C - & /SLNPAR/ EPS, MAXIT, NITER -C - & /GAUSSL/ XGS(NpGauss), WGS(NpGauss), FIRST_GAULEG -C - & /OTHER/ PI, ZERO, GREAT, SQ2PI, - & D11,D12,D13,D14,D15, - & D21,D22,D23,D24,D25, - & D31,D32,D33,D34,D35, - & D41,D42,D43,D44,D45 diff --git a/ifs-source/arpifs/m7/phys_ec/yoe_aer_activ.F90 b/ifs-source/arpifs/m7/phys_ec/yoe_aer_activ.F90 index 4f815629..e7ddf2e4 100644 --- a/ifs-source/arpifs/m7/phys_ec/yoe_aer_activ.F90 +++ b/ifs-source/arpifs/m7/phys_ec/yoe_aer_activ.F90 @@ -1,8 +1,8 @@ MODULE YOE_AER_ACTIV !---inherited functions, types, variables and constants - USE PARKIND1, ONLY: JPIM,JPRB - USE YOMHOOK, ONLY: LHOOK, DR_HOOK, JPHOOK + USE PARKIND1, ONLY: JPIM, JPRB + USE YOMHOOK, ONLY: LHOOK, DR_HOOK, JPHOOK !USE PHY_DIAG_MOD, ONLY: T_DIAG IMPLICIT NONE @@ -192,8 +192,8 @@ SUBROUTINE AER_ACTIV(KIDIA, KFDIA, KTDIA, KLON, KLEV, KSTGLO, & REAL(KIND=JPRB) :: ZOMBULK(KLON,KLEV) ! bulk organic matter mass mixing ratio [kg/kg] REAL(KIND=JPRB) :: ZSSBULK(KLON,KLEV) ! bulk sea salt mass mixing ratio [kg/kg] REAL(KIND=JPRB) :: ZDUBULK(KLON,KLEV) ! bulk dust mass mixing ratio [kg/kg] - !REAL(KIND=JPRB) :: ZW(KLON,KLEV,nw) ! updraft speed [m/s] - !REAL(KIND=JPRB) :: ZWPDF(KLON,KLEV,nw) ! updraft probability + !REAL(KIND=JPRB) :: ZW(KLON,KLEV,nw) ! updraft speed [m/s] + !REAL(KIND=JPRB) :: ZWPDF(KLON,KLEV,nw) ! updraft probability REAL(KIND=JPHOOK) :: ZHOOK_HANDLE REAL(KIND=JPRB) :: ZTMP(KLON,KLEV) ! interim for diagnostics @@ -201,7 +201,7 @@ SUBROUTINE AER_ACTIV(KIDIA, KFDIA, KTDIA, KLON, KLEV, KSTGLO, & REAL(KIND=JPRB) :: ZICNC(KLON,KLEV) ! ice crystal number concentration [#/cm-3] REAL(KIND=JPRB) :: ZRE_LIQ(KLON,KLEV) ! liquid droplet effective radius [um] REAL(KIND=JPRB) :: ZRE_ICE(KLON,KLEV) ! ice crystal effective radius [um] - REAL(KIND=JPRB) :: ZSMAX(KLON,KLEV) ! maximum supersaturation [%] + REAL(KIND=JPRB) :: ZSMAX(KLON,KLEV) ! maximum supersaturation [%] !variables for liquid droplet eff rad calculations REAL(KIND=JPRB) :: ZQLWC(KLON,KLEV) !tresholded LWC [kg/kg] @@ -212,9 +212,9 @@ SUBROUTINE AER_ACTIV(KIDIA, KFDIA, KTDIA, KLON, KLEV, KSTGLO, & LOGICAL :: LICECLD(KLON,KLEV) ! true if ice cloud is present LOGICAL :: LL1 - LOGICAL :: LBULK, LMODE ! fetch TM5 aerosols as bulk mass / per-mode mass + LOGICAL :: LBULK, LMODE ! fetch HAMM7 aerosols as bulk mass / per-mode mass - LOGICAL :: LCALCINCLOUD = .TRUE. ! eehol: logical to calculate activation only in-cloud (T) or everywhere (F) + LOGICAL :: LCALCINCLOUD = .TRUE. ! calculate activation only in-cloud (T) or everywhere (F) REAL(KIND=JPRB) :: ZEPS ! epsilon(1.) INTEGER(KIND=JPIM) :: ITOP ! highest level for water cloud INTEGER(KIND=JPIM) :: JK, JL, JMOD ! loop indices @@ -253,17 +253,15 @@ SUBROUTINE AER_ACTIV(KIDIA, KFDIA, KTDIA, KLON, KLEV, KSTGLO, & !PGFL(KIDIA:KFDIA,:,YICNC%MP9_PH) = ZICNC(KIDIA:KFDIA,:) !PGFL(KIDIA:KFDIA,:,YRE_ICE%MP9_PH) = PREFFI(KIDIA:KFDIA,:) - !---get aerosols from TM5 - !IF (LTM5AER .OR. LCMIP6_PI_AEROSOLS) THEN + !---get aerosols from HAMM7 LMODE = .TRUE. LBULK = (LAERICESED .OR. LAERICEAUTO) ! .OR. NCLOUDACT==JP_ACT_MENON) CALL GET_HAMM7_AERO_PROP(KIDIA, KFDIA, KLON, KTDIA, KLEV, KSTGLO, LMODE, LBULK, & - & PAPH, PGELAM, PGEMU, PXTM1, KTRAC, & - & ZDRYRSOLOLD, ZAERONUM, & - & ZSO4MASS, ZBCMASS, ZOMMASS, ZSSMASS, ZDUMASS, & - & ZSO4BULK, ZBCBULK, ZOMBULK, ZSSBULK, ZDUBULK, & - & ZNO3MASS, ZMSAMASS) - !END IF + & PAPH, PGELAM, PGEMU, PXTM1, KTRAC, & + & ZDRYRSOLOLD, ZAERONUM, & + & ZSO4MASS, ZBCMASS, ZOMMASS, ZSSMASS, ZDUMASS, & + & ZSO4BULK, ZBCBULK, ZOMBULK, ZSSBULK, ZDUBULK, & + & ZNO3MASS, ZMSAMASS) ZDRYRSOL(KIDIA:KFDIA,1:KLEV,:) = PDRYRSOLU(KIDIA:KFDIA,1:KLEV,:) @@ -1589,6 +1587,7 @@ SUBROUTINE AER_ACTIV_MORALES_NENES_FULL(KIDIA, KFDIA, KTDIA, KLON, KLEV, LCLOUD, ! & PPKAPPA_NH4NO3, PPKAPPA_MSA, & ! & WSO4, WH2SO4, WNACL, WNA2SO4, & ! & WH2O, WDAIR + USE ND_PARAM, ONLY: CCNSPEC, PDFACTIV, NDPARAM IMPLICIT NONE @@ -1648,14 +1647,13 @@ SUBROUTINE AER_ACTIV_MORALES_NENES_FULL(KIDIA, KFDIA, KTDIA, KLON, KLEV, LCLOUD, REAL(KIND=JPHOOK) :: ZHOOK_HANDLE ! Variables to interface with Nenes routines - ! These are declared double precision as they are in those routines. - ! Can be changed to IFS style. - DOUBLE PRECISION TPI(NSOL-1), DPGI(NSOL-1), SIGI(NSOL-1), AKKI(NSOL-1), & - & TPARC, PPARC, WPARC, SG(NSOL-1), NACT, SMAX + TYPE(NDPARAM) :: BOX + REAL(KIND=JPRB) :: TPI(NSOL-1), DPGI(NSOL-1), SIGI(NSOL-1), AKKI(NSOL-1) + REAL(KIND=JPRB) :: TPARC, PPARC, WPARC, SG(NSOL-1), NACT, SMAX - DOUBLE PRECISION, PARAMETER :: A = 2.25 ! Default FHH adsorption parameters (in the case of FHH-AT) - DOUBLE PRECISION, PARAMETER :: B = 1.20 ! See Kumar et al., (2011) ACP - DOUBLE PRECISION, PARAMETER :: ACCOM = 1.0 ! Accommodation coefficient + REAL(KIND=JPRB), PARAMETER :: A = 2.25 ! Default FHH adsorption parameters (in the case of FHH-AT) + REAL(KIND=JPRB), PARAMETER :: B = 1.20 ! See Kumar et al., (2011) ACP + REAL(KIND=JPRB), PARAMETER :: ACCOM = 1.0 ! Accommodation coefficient ! Standard deviation of the updraft velocity distribution (m/s) ! For the moment it is set to a constant value of 0.8 m/s, @@ -1666,14 +1664,14 @@ SUBROUTINE AER_ACTIV_MORALES_NENES_FULL(KIDIA, KFDIA, KTDIA, KLON, KLEV, LCLOUD, ! A common approach is to use TKE or, alternatively, ! the vertical diffusion coefficient ! (see module VDIFLCZ in sinvect directory). - !DOUBLE PRECISION, PARAMETER :: SIGW = 0.6_JPRB - DOUBLE PRECISION SIGW !eehol: add sigma_w to not be a parameter but rather an input value + !REAL(KIND=JPRB), PARAMETER :: SIGW = 0.6_JPRB + REAL(KIND=JPRB) :: SIGW ! sigma_w is input now ! Logical switch to use a single characteristic velocity ! instead of Gauss-Legendre quadrature. LOGICAL, PARAMETER :: CHAR_VELOCITY = .FALSE. - INTEGER MODEI(NSOL-1) + INTEGER(KIND=JPIM) :: MODEI(NSOL-1) !--- executable procedure IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.AER_ACTIV_MORALES_NENES_FULL',0,ZHOOK_HANDLE) @@ -1736,11 +1734,11 @@ SUBROUTINE AER_ACTIV_MORALES_NENES_FULL(KIDIA, KFDIA, KTDIA, KLON, KLEV, LCLOUD, !---defensive step: minimum kappa to avoid divide by zero errors ZKAPPA(JL,JK,JMOD) = MERGE(ZKAPPA(JL,JK,JMOD), 0.04_JPRB, ZKAPPA(JL,JK,JMOD) > 0.04_JPRB ) - ZKAPPA(JL,JK,JMOD)=MIN(ZKAPPA(JL,JK,JMOD),1.2) - ELSE !eehol: if total volume per mode is too small, use minimum kappa - ZKAPPA(JL,JK,JMOD)=0.04_JPRB + ZKAPPA(JL,JK,JMOD) = MIN(ZKAPPA(JL,JK,JMOD),1.2_JPRB) + ELSE + ZKAPPA(JL,JK,JMOD) = 0.04_JPRB ! if total volume per mode is too small, use minimum kappa END IF - END IF !eehol: LCLOUD + END IF END DO END DO END DO @@ -1754,18 +1752,19 @@ SUBROUTINE AER_ACTIV_MORALES_NENES_FULL(KIDIA, KFDIA, KTDIA, KLON, KLEV, LCLOUD, DO JMOD=2,NSOL !Shift mode index - MODEI(JMOD-1) = 1 ! Kohler mode + MODEI(JMOD-1) = 1 ! Kohler mode TPI(JMOD-1) = PAERONUM(JL,JK,JMOD) * PRHO(JL,JK) ! Number concentration (#/m3) - DPGI(JMOD-1) = 2._JPRB * PRDRY(JL,JK,JMOD) ! Modal diameter (m) - SIGI(JMOD-1) = SIGMA(JMOD) ! Geometric dispersion (sigma_g) - AKKI(JMOD-1) = ZKAPPA(JL,JK,JMOD) ! Hygroscopicity parameter (kappa) + DPGI(JMOD-1) = 2._JPRB * PRDRY(JL,JK,JMOD) ! Modal diameter (m) + SIGI(JMOD-1) = SIGMA(JMOD) ! Geometric dispersion (sigma_g) + AKKI(JMOD-1) = ZKAPPA(JL,JK,JMOD) ! Hygroscopicity parameter (kappa) END DO TPARC = PT(JL,JK) ! Temperature (K) PPARC = PAP(JL,JK) ! Pressure (Pa) IF ( ANY(TPI(:) .GE. ZEPS) .AND. ANY(DPGI(:) .GE. 1e-9_JPRB) .AND. TPARC.GE.(273.15_JPRB-35.0_JPRB) ) THEN !eehol: any num con, diam and temperature need to be over treshold - ! Convert aerosol data into CCN - CALL CCNSPEC (TPI,DPGI,SIGI,MODEI,TPARC,PPARC,NSOL-1,AKKI,A,B,SG) + + ! Convert aerosol data into CCN, fill BOX object + CALL CCNSPEC (TPI,DPGI,SIGI,MODEI,TPARC,PPARC,NSOL-1,AKKI,A,B,ACCOM,BOX) ! xxx To be done: ! Save CCN spectra for supersaturations: @@ -1774,7 +1773,7 @@ SUBROUTINE AER_ACTIV_MORALES_NENES_FULL(KIDIA, KFDIA, KTDIA, KLON, KLEV, LCLOUD, ! which needs to be put into the output as 6 3-D fields !eehol: give sigma_w a value depending on the input variable - SIGW = MAX(0.1_JPRB,PSIGMA_W(JL,JK)) !treshold sigma to min value + SIGW = MAX(0.1_JPRB,PSIGMA_W(JL,JK)) ! threshold sigma to min value IF ( ZWLARGE(JL,JK).GE.ZEPS ) THEN ! Calculate activated droplet number @@ -1784,13 +1783,12 @@ SUBROUTINE AER_ACTIV_MORALES_NENES_FULL(KIDIA, KFDIA, KTDIA, KLON, KLEV, LCLOUD, WPARC = 0.79*SIGW ! Call activation for a single velocity ! equal to the characteristic velocity - CALL PDFACTIV (WPARC,TPI,AKKI,A,B,ACCOM,SG,0.d0,TPARC,PPARC,NACT,SMAX) + CALL PDFACTIV (WPARC,0._JPRB,NACT,SMAX,BOX) ELSE ! Call activation for velocity PDF (SIGW is non-zero) ! with WPARC set equal to the large-scale velocity (m/s) WPARC = ZWLARGE(JL,JK) - CALL PDFACTIV (WPARC,TPI,AKKI,A,B,ACCOM,SG,SIGW,TPARC,PPARC,NACT,SMAX) - + CALL PDFACTIV (WPARC,SIGW,NACT,SMAX,BOX) ENDIF ! convert CDNC to # cm-3 @@ -1908,16 +1906,14 @@ END SUBROUTINE AER_ACTIV_MORALES_NENES_FULL ! REAL(KIND=JPHOOK) :: ZHOOK_HANDLE ! ! ! Variables to interface with Nenes routines -! ! These are declared double precision as they are in those routines. -! ! Can be changed to IFS style. -! DOUBLE PRECISION TPI(NSOL-1), DPGI(NSOL-1), SIGI(NSOL-1), AKKI(NSOL-1), & -! & TPARC, PPARC, WPARC, SG(NSOL-1), NACT, SMAX +! REAL(KIND=JPRB) :: TPI(NSOL-1), DPGI(NSOL-1), SIGI(NSOL-1), AKKI(NSOL-1) +! REAL(KIND=JPRB) :: TPARC, PPARC, WPARC, SG(NSOL-1), NACT, SMAX ! -! DOUBLE PRECISION, PARAMETER :: A = 2.25_JPRB ! Default FHH adsorption parameters (in the case of FHH-AT) -! DOUBLE PRECISION, PARAMETER :: B = 1.20_JPRB ! See Kumar et al., (2011) ACP -! DOUBLE PRECISION, PARAMETER :: ACCOM = 1.0_JPRB ! Accommodation coefficient +! REAL(KIND=JPRB), PARAMETER :: A = 2.25_JPRB ! Default FHH adsorption parameters (in the case of FHH-AT) +! REAL(KIND=JPRB), PARAMETER :: B = 1.20_JPRB ! See Kumar et al., (2011) ACP +! REAL(KIND=JPRB), PARAMETER :: ACCOM = 1.0_JPRB ! Accommodation coefficient ! -! INTEGER MODEI(NSOL-1) +! INTEGER(KIND=JPIM) :: MODEI(NSOL-1) ! ! !--- executable procedure ! IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.AER_ACTIV_MORALES_NENES_FULL_OLDPDF',0,ZHOOK_HANDLE) @@ -2528,72 +2524,70 @@ END SUBROUTINE AER_ACTIV_MORALES_NENES_FULL ! END SUBROUTINE AER_ACTIV_MENON SUBROUTINE GET_HAMM7_AERO_PROP(KIDIA, KFDIA, KLON, KTDIA, KLEV, KSTGLO, LMODE, LBULK, & - & PAPH, PGELAM, PGEMU, PXTM1, KTRAC, & - & PDRYRSOL, PAERONUM, & - & PSO4MASS, PBCMASS, POMMASS, PSSMASS, PDUMASS, & - & PSO4BULK, PBCBULK, POMBULK, PSSBULK, PDUBULK, & - & PNO3MASS, PMSAMASS) + & PAPH, PGELAM, PGEMU, PXTM1, KTRAC, & + & PDRYRSOL, PAERONUM, & + & PSO4MASS, PBCMASS, POMMASS, PSSMASS, PDUMASS, & + & PSO4BULK, PBCBULK, POMBULK, PSSBULK, PDUBULK, & + & PNO3MASS, PMSAMASS) !---inherited functions, types, variables and constants USE YOMCST, ONLY: RPI USE TM5M7_DATA, ONLY: NSOL - !<--eehol: add tracer variables for tracer indices to reduce hardcoding + !---aerosols variables and indices USE MO_HAM, ONLY: & - sizeclass, & ! aerosol classes in HAM - aerocomp ! aerosol compounds by size class in HAM - USE mo_ham_m7ctl, ONLY: inucs, iaits, iaccs, icoas, & - iaiti, iacci, icoai, & - iso4ns, iso4ks, iso4as, iso4cs, & - ibcks, ibcas, ibccs, ibcki, & - iocks, iocas, ioccs, iocki, & - issas, isscs, & - iduas, iducs, iduai, iduci - !-->eehol - !USE YOERAD, ONLY: LTM5AER, LCMIP6_PI_AEROSOLS, NRADFR + SIZECLASS, & ! Aerosol classes in HAM + AEROCOMP ! Aerosol compounds by size class in HAM + USE MO_HAM_M7CTL, ONLY: INUCS, IAITS, IACCS, ICOAS, & + IAITI, IACCI, ICOAI, & + ISO4NS, ISO4KS, ISO4AS, ISO4CS, & + IBCKS, IBCAS, IBCCS, IBCKI, & + IOCKS, IOCAS, IOCCS, IOCKI, & + ISSAS, ISSCS, & + IDUAS, IDUCS, IDUAI, IDUCI + + !USE YOERAD, ONLY: LCMIP6_PI_AEROSOLS, NRADFR !USE YOE_AERO_M7_DATA - !USE CPLNG, ONLY: CPLNG_FLD, CPLNG_IDX, LEV_IDX_TM5, & - ! & NLEV_TM5, NLEV_TM5_AER !USE YOE_PI_AERO !USE YOMCT3, ONLY: NSTEP IMPLICIT NONE !---subroutine interface - ! *GET_HAMM7_AERO_PROP* is called here before the activation calculations + ! *GET_HAMM7_AERO_PROP* is called from AER_ACTIV before the activation calculations ! ! INPUT: - INTEGER(KIND=JPIM), INTENT(IN) :: KIDIA ! beginning of horizontal block - INTEGER(KIND=JPIM), INTENT(IN) :: KFDIA ! end of horizontal block - INTEGER(KIND=JPIM), INTENT(IN) :: KLON ! horizontal dimension - INTEGER(KIND=JPIM), INTENT(IN) :: KTDIA ! highest level with liquid cloud - INTEGER(KIND=JPIM), INTENT(IN) :: KLEV ! number of model vertical levels - INTEGER(KIND=JPIM), INTENT(IN) :: KSTGLO ! offset of horizontal block in coupling arrays - INTEGER(KIND=JPIM), INTENT(IN) :: KTRAC ! number of tracers - - LOGICAL, INTENT(IN) :: LMODE ! Per-mode data requested - LOGICAL, INTENT(IN) :: LBULK ! Bulk aerosol masses requested + INTEGER(KIND=JPIM), INTENT(IN) :: KIDIA ! beginning of horizontal block + INTEGER(KIND=JPIM), INTENT(IN) :: KFDIA ! end of horizontal block + INTEGER(KIND=JPIM), INTENT(IN) :: KLON ! horizontal dimension + INTEGER(KIND=JPIM), INTENT(IN) :: KTDIA ! highest level with liquid cloud + INTEGER(KIND=JPIM), INTENT(IN) :: KLEV ! number of model vertical levels + INTEGER(KIND=JPIM), INTENT(IN) :: KSTGLO ! offset of horizontal block in coupling arrays + INTEGER(KIND=JPIM), INTENT(IN) :: KTRAC ! number of tracers + + LOGICAL, INTENT(IN) :: LMODE ! Per-mode data requested + LOGICAL, INTENT(IN) :: LBULK ! Bulk aerosol masses requested - REAL(KIND=JPRB), INTENT(IN) :: PAPH(KLON,KLEV+1) ! half-level pressure - REAL(KIND=JPRB), INTENT(IN) :: PGELAM(KLON) ! longitude - REAL(KIND=JPRB), INTENT(IN) :: PGEMU(KLON) ! sine of latitude - REAL(KIND=JPRB), INTENT(IN) :: PXTM1(KLON,KLEV,KTRAC) ! sine of latitude + REAL(KIND=JPRB), INTENT(IN) :: PAPH(KLON,KLEV+1) ! half-level pressure + REAL(KIND=JPRB), INTENT(IN) :: PGELAM(KLON) ! longitude + REAL(KIND=JPRB), INTENT(IN) :: PGEMU(KLON) ! sine of latitude + REAL(KIND=JPRB), INTENT(IN) :: PXTM1(KLON,KLEV,KTRAC) ! tracer mixing ratios ! OUTPUT: - REAL(KIND=JPRB), INTENT(OUT) :: PDRYRSOL(KLON,KLEV,NSOL) ! [M] - REAL(KIND=JPRB), INTENT(OUT) :: PAERONUM(KLON,KLEV,NSOL) ! [#/KG(AIR)] - REAL(KIND=JPRB), INTENT(OUT) :: PSO4MASS(KLON,KLEV,NSOL) ! [KG(SO4)/KG(AIR)] - REAL(KIND=JPRB), INTENT(OUT) :: PBCMASS(KLON,KLEV,NSOL) ! [KG(BC)/KG(AIR)] - REAL(KIND=JPRB), INTENT(OUT) :: POMMASS(KLON,KLEV,NSOL) ! [KG(OM)/KG(AIR)] - REAL(KIND=JPRB), INTENT(OUT) :: PSSMASS(KLON,KLEV,NSOL) ! [KG(SS)/KG(AIR)] - REAL(KIND=JPRB), INTENT(OUT) :: PDUMASS(KLON,KLEV,NSOL) ! [KG(DU)/KG(AIR)] - REAL(KIND=JPRB), INTENT(OUT) :: PSO4BULK(KLON,KLEV) ! [KG(SO4)/KG(AIR)] - REAL(KIND=JPRB), INTENT(OUT) :: PBCBULK(KLON,KLEV) ! [KG(BC)/KG(AIR)] - REAL(KIND=JPRB), INTENT(OUT) :: POMBULK(KLON,KLEV) ! [KG(OM)/KG(AIR)] - REAL(KIND=JPRB), INTENT(OUT) :: PSSBULK(KLON,KLEV) ! [KG(SS)/KG(AIR)] - REAL(KIND=JPRB), INTENT(OUT) :: PDUBULK(KLON,KLEV) ! [KG(DU)/KG(AIR)] - REAL(KIND=JPRB), INTENT(OUT) :: PNO3MASS(KLON,KLEV) ! [KG(NO3)/KG(AIR)] - REAL(KIND=JPRB), INTENT(OUT) :: PMSAMASS(KLON,KLEV) ! [KG(MSA)/KG(AIR)] + REAL(KIND=JPRB), INTENT(OUT) :: PDRYRSOL(KLON,KLEV,NSOL) ! [M] + REAL(KIND=JPRB), INTENT(OUT) :: PAERONUM(KLON,KLEV,NSOL) ! [#/KG(AIR)] + REAL(KIND=JPRB), INTENT(OUT) :: PSO4MASS(KLON,KLEV,NSOL) ! [KG(SO4)/KG(AIR)] + REAL(KIND=JPRB), INTENT(OUT) :: PBCMASS(KLON,KLEV,NSOL) ! [KG(BC)/KG(AIR)] + REAL(KIND=JPRB), INTENT(OUT) :: POMMASS(KLON,KLEV,NSOL) ! [KG(OM)/KG(AIR)] + REAL(KIND=JPRB), INTENT(OUT) :: PSSMASS(KLON,KLEV,NSOL) ! [KG(SS)/KG(AIR)] + REAL(KIND=JPRB), INTENT(OUT) :: PDUMASS(KLON,KLEV,NSOL) ! [KG(DU)/KG(AIR)] + REAL(KIND=JPRB), INTENT(OUT) :: PSO4BULK(KLON,KLEV) ! [KG(SO4)/KG(AIR)] + REAL(KIND=JPRB), INTENT(OUT) :: PBCBULK(KLON,KLEV) ! [KG(BC)/KG(AIR)] + REAL(KIND=JPRB), INTENT(OUT) :: POMBULK(KLON,KLEV) ! [KG(OM)/KG(AIR)] + REAL(KIND=JPRB), INTENT(OUT) :: PSSBULK(KLON,KLEV) ! [KG(SS)/KG(AIR)] + REAL(KIND=JPRB), INTENT(OUT) :: PDUBULK(KLON,KLEV) ! [KG(DU)/KG(AIR)] + REAL(KIND=JPRB), INTENT(OUT) :: PNO3MASS(KLON,KLEV) ! [KG(NO3)/KG(AIR)] + REAL(KIND=JPRB), INTENT(OUT) :: PMSAMASS(KLON,KLEV) ! [KG(MSA)/KG(AIR)] !---local data REAL(KIND=JPRB) :: NSO4, NH2SO4, NNACL, NNA, NCL, NNA2SO4 ! Particle numbers [kmol/kg air] @@ -2673,101 +2667,7 @@ SUBROUTINE GET_HAMM7_AERO_PROP(KIDIA, KFDIA, KLON, KTDIA, KLEV, KSTGLO, LMODE, L ! PMSAMASS(KIDIA:KFDIA,:) = PI_AERO_PHY(KIDIA:KFDIA,:,IPIMMSA,IBL) ! END IF ! ELSE -! -! IF (LTM5AER) THEN -! IF (ICPLSU2 == -1) THEN -! ICPLSU2 = CPLNG_IDX('A_SU2') -! ICPLSU3 = CPLNG_IDX('A_SU3') -! ICPLSU4 = CPLNG_IDX('A_SU4') -! ICPLBC2 = CPLNG_IDX('A_BC2') -! ICPLBC3 = CPLNG_IDX('A_BC3') -! ICPLBC4 = CPLNG_IDX('A_BC4') -! ICPLOM2 = CPLNG_IDX('A_OM2') -! ICPLOM3 = CPLNG_IDX('A_OM3') -! ICPLOM4 = CPLNG_IDX('A_OM4') -! ICPLSS3 = CPLNG_IDX('A_SS3') -! ICPLSS4 = CPLNG_IDX('A_SS4') -! ICPLDD3 = CPLNG_IDX('A_DD3') -! ICPLDD4 = CPLNG_IDX('A_DD4') -! ICPLNO3 = CPLNG_IDX('A_NO3') -! ICPLMSA = CPLNG_IDX('A_MSA') -! END IF -! ! NO3 and MSA are not set in RADINTG -! IF (ICPLNO3 == -1) ICPLNO3 = CPLNG_IDX('A_NO3') -! IF (ICPLMSA == -1) ICPLMSA = CPLNG_IDX('A_MSA') -! -! !---aerosol masses: -! DO JK=KTDIA,KLEV -! -! ! Include offset in case upper levels have not been received from TM5 -! IK = LEV_IDX_TM5(JK) - NLEV_TM5 + NLEV_TM5_AER -! IF (IK >= 1) THEN -! DO JL=KIDIA,KFDIA -! IL = KSTGLO+JL-1 -! !---nucleation mode is ignored -! -! !---accumulation mode: SU, OM, BC -! PSO4MASS(JL,JK,JP_AITS) = CPLNG_FLD(ICPLSU2)%D(IL,IK,1) -! POMMASS(JL,JK,JP_AITS) = CPLNG_FLD(ICPLOM2)%D(IL,IK,1) -! PBCMASS(JL,JK,JP_AITS) = CPLNG_FLD(ICPLBC2)%D(IL,IK,1) -! -! !---accumulation mode: SU, OM, BC, SS, DU -! PSO4MASS(JL,JK,JP_ACCS) = CPLNG_FLD(ICPLSU3)%D(IL,IK,1) -! POMMASS(JL,JK,JP_ACCS) = CPLNG_FLD(ICPLOM3)%D(IL,IK,1) -! PBCMASS(JL,JK,JP_ACCS) = CPLNG_FLD(ICPLBC3)%D(IL,IK,1) -! PSSMASS(JL,JK,JP_ACCS) = CPLNG_FLD(ICPLSS3)%D(IL,IK,1) -! PDUMASS(JL,JK,JP_ACCS) = CPLNG_FLD(ICPLDD3)%D(IL,IK,1) -! -! !---coarse mode: SU, OM, BC, SS, DU -! PSO4MASS(JL,JK,JP_COAS) = CPLNG_FLD(ICPLSU4)%D(IL,IK,1) -! POMMASS(JL,JK,JP_COAS) = CPLNG_FLD(ICPLOM4)%D(IL,IK,1) -! PBCMASS(JL,JK,JP_COAS) = CPLNG_FLD(ICPLBC4)%D(IL,IK,1) -! PSSMASS(JL,JK,JP_COAS) = CPLNG_FLD(ICPLSS4)%D(IL,IK,1) -! PDUMASS(JL,JK,JP_COAS) = CPLNG_FLD(ICPLDD4)%D(IL,IK,1) -! -! !---nitrate and MSA -! PNO3MASS(JL,JK) = CPLNG_FLD(ICPLNO3)%D(IL,IK,1) -! PMSAMASS(JL,JK) = CPLNG_FLD(ICPLMSA)%D(IL,IK,1) -! END DO -! ELSE -! ! These levels have not been received from TM5 -! ! and should be set to zero -! PSO4MASS(KIDIA:KFDIA,JK,:) = 0._JPRB -! POMMASS(KIDIA:KFDIA,JK,:) = 0._JPRB -! PBCMASS(KIDIA:KFDIA,JK,:) = 0._JPRB -! PSSMASS(KIDIA:KFDIA,JK,:) = 0._JPRB -! PDUMASS(KIDIA:KFDIA,JK,:) = 0._JPRB -! PNO3MASS(KIDIA:KFDIA,JK) = 0._JPRB -! PMSAMASS(KIDIA:KFDIA,JK) = 0._JPRB -! END IF -! -! END DO -! -! !---aerosol number and radius (if needed) -! IF (LMODE) THEN -! IF (ICPLN2 == -1) THEN -! ICPLN2=CPLNG_IDX('A_N2') -! ICPLN3=CPLNG_IDX('A_N3') -! ICPLN4=CPLNG_IDX('A_N4') -! END IF -! DO JK=KTDIA,KLEV -! ! Include offset in case upper levels have not been received from TM5 -! IK = LEV_IDX_TM5(JK) - NLEV_TM5 + NLEV_TM5_AER -! IF (IK >= 1) THEN -! DO JL=KIDIA,KFDIA -! IL = KSTGLO+JL-1 -! PAERONUM(JL,JK,JP_AITS) = CPLNG_FLD(ICPLN2)%D(IL,IK,1) -! PAERONUM(JL,JK,JP_ACCS) = CPLNG_FLD(ICPLN3)%D(IL,IK,1) -! PAERONUM(JL,JK,JP_COAS) = CPLNG_FLD(ICPLN4)%D(IL,IK,1) -! END DO -! ELSE -! ! These levels have not been received from TM5 -! ! and should be set to zero -! PAERONUM(KIDIA:KFDIA,JK,:) = TINY(0._JPRB) -! END IF -! END DO -! END IF -! END IF ! ltm5aer +! [...] ! END IF ! lcmip6_pi_aerosols ! ! !---aerosol radius (if needed) for both interactive TM5 and preindustrial climatology @@ -2837,7 +2737,8 @@ SUBROUTINE GET_HAMM7_AERO_PROP(KIDIA, KFDIA, KLON, KTDIA, KLEV, KSTGLO, LMODE, L ! END DO ! END IF - !eehol: add separation of tracers NOTE: These PXTM1 indices need to go according to HAM indices and not OIFS!! + !---Aerosols masses and numbers + ! NOTE: PXTM1 indices need to go according to HAM indices and not OIFS! IF (LMODE) THEN DO JK=KTDIA,KLEV DO JL=KIDIA,KFDIA @@ -2845,51 +2746,32 @@ SUBROUTINE GET_HAMM7_AERO_PROP(KIDIA, KFDIA, KLON, KTDIA, KLEV, KSTGLO, LMODE, L !---nucleation mode is ignored !---Aitken soluble mode: SU, OM, BC - PSO4MASS(JL,JK,2) = PXTM1(JL,JK,aerocomp(iso4ks)%idt) !SO4 Ait sol - POMMASS(JL,JK,2) = PXTM1(JL,JK,aerocomp(iocks)%idt) !OC Ait sol - PBCMASS(JL,JK,2) = PXTM1(JL,JK,aerocomp(ibcks)%idt) !BC Ait sol + PSO4MASS(JL,JK,2) = PXTM1(JL,JK,AEROCOMP(ISO4KS)%IDT) !SO4 Ait sol + POMMASS(JL,JK,2) = PXTM1(JL,JK,AEROCOMP(IOCKS)%IDT) !OC Ait sol + PBCMASS(JL,JK,2) = PXTM1(JL,JK,AEROCOMP(IBCKS)%IDT) !BC Ait sol - !PSO4MASS(JL,JK,2) = PXTM1(JL,JK,5) !SO4 Ait sol - !POMMASS(JL,JK,2) = PXTM1(JL,JK,12) !OC Ait sol - !PBCMASS(JL,JK,2) = PXTM1(JL,JK,8) !BC Ait sol - !---accumulation soluble mode: SU, OM, BC, SS, DU - PSO4MASS(JL,JK,3) = PXTM1(JL,JK,aerocomp(iso4as)%idt) !SO4 acc sol - POMMASS(JL,JK,3) = PXTM1(JL,JK,aerocomp(iocas)%idt) !OC acc sol - PBCMASS(JL,JK,3) = PXTM1(JL,JK,aerocomp(ibcas)%idt) !BC acc sol - PSSMASS(JL,JK,3) = PXTM1(JL,JK,aerocomp(issas)%idt) !SS acc sol - PDUMASS(JL,JK,3) = PXTM1(JL,JK,aerocomp(iduas)%idt) !DU acc sol + PSO4MASS(JL,JK,3) = PXTM1(JL,JK,AEROCOMP(ISO4AS)%IDT) !SO4 acc sol + POMMASS(JL,JK,3) = PXTM1(JL,JK,AEROCOMP(IOCAS)%IDT) !OC acc sol + PBCMASS(JL,JK,3) = PXTM1(JL,JK,AEROCOMP(IBCAS)%IDT) !BC acc sol + PSSMASS(JL,JK,3) = PXTM1(JL,JK,AEROCOMP(ISSAS)%IDT) !SS acc sol + PDUMASS(JL,JK,3) = PXTM1(JL,JK,AEROCOMP(IDUAS)%IDT) !DU acc sol - !PSO4MASS(JL,JK,3) = PXTM1(JL,JK,6) !SO4 acc sol - !POMMASS(JL,JK,3) = PXTM1(JL,JK,13) !OC acc sol - !PBCMASS(JL,JK,3) = PXTM1(JL,JK,9) !BC acc sol - !PSSMASS(JL,JK,3) = PXTM1(JL,JK,16) !SS acc sol - !PDUMASS(JL,JK,3) = PXTM1(JL,JK,18) !DU acc sol - !---coarse soluble mode: SU, OM, BC, SS, DU - PSO4MASS(JL,JK,4) = PXTM1(JL,JK,aerocomp(iso4cs)%idt) !SO4 coa sol - POMMASS(JL,JK,4) = PXTM1(JL,JK,aerocomp(ioccs)%idt) !OC coa sol - PBCMASS(JL,JK,4) = PXTM1(JL,JK,aerocomp(ibccs)%idt) !BC coa sol - PSSMASS(JL,JK,4) = PXTM1(JL,JK,aerocomp(isscs)%idt) !SS coa sol - PDUMASS(JL,JK,4) = PXTM1(JL,JK,aerocomp(iducs)%idt) !DU coa sol - - !PSO4MASS(JL,JK,4) = PXTM1(JL,JK,7) !SO4 coa sol - !POMMASS(JL,JK,4) = PXTM1(JL,JK,14) !OC coa sol - !PBCMASS(JL,JK,4) = PXTM1(JL,JK,10) !BC coa sol - !PSSMASS(JL,JK,4) = PXTM1(JL,JK,17) !SS coa sol - !PDUMASS(JL,JK,4) = PXTM1(JL,JK,19) !DU coa sol - - !---nitrate and MSA eehol: Currently not used in HAM... need to be added later! - PNO3MASS(JL,JK) = 0._JPRB !CPLNG_FLD(ICPLNO3)%D(IL,IK,1) - PMSAMASS(JL,JK) = 0._JPRB !CPLNG_FLD(ICPLMSA)%D(IL,IK,1) - - PAERONUM(JL,JK,2) = PXTM1(JL,JK,sizeclass(iaits)%idt_no) !Ait sol - PAERONUM(JL,JK,3) = PXTM1(JL,JK,sizeclass(iaccs)%idt_no) !acc sol - PAERONUM(JL,JK,4) = PXTM1(JL,JK,sizeclass(icoas)%idt_no) !coa sol - - !PAERONUM(JL,JK,2) = PXTM1(JL,JK,23) !Ait sol - !PAERONUM(JL,JK,3) = PXTM1(JL,JK,24) !acc sol - !PAERONUM(JL,JK,4) = PXTM1(JL,JK,25) !coa sol + PSO4MASS(JL,JK,4) = PXTM1(JL,JK,AEROCOMP(ISO4CS)%IDT) !SO4 coa sol + POMMASS(JL,JK,4) = PXTM1(JL,JK,AEROCOMP(IOCCS)%IDT) !OC coa sol + PBCMASS(JL,JK,4) = PXTM1(JL,JK,AEROCOMP(IBCCS)%IDT) !BC coa sol + PSSMASS(JL,JK,4) = PXTM1(JL,JK,AEROCOMP(ISSCS)%IDT) !SS coa sol + PDUMASS(JL,JK,4) = PXTM1(JL,JK,AEROCOMP(IDUCS)%IDT) !DU coa sol + + !---Nitrate and MSA - TODO Currently not used in HAM... need to be added later! + PNO3MASS(JL,JK) = 0._JPRB + PMSAMASS(JL,JK) = 0._JPRB + + PAERONUM(JL,JK,2) = PXTM1(JL,JK,SIZECLASS(IAITS)%IDT_NO) !Ait sol + PAERONUM(JL,JK,3) = PXTM1(JL,JK,SIZECLASS(IACCS)%IDT_NO) !acc sol + PAERONUM(JL,JK,4) = PXTM1(JL,JK,SIZECLASS(ICOAS)%IDT_NO) !coa sol + END DO END DO END IF diff --git a/ifs-source/arpifs/phys_radi/suecrad.F90 b/ifs-source/arpifs/phys_radi/suecrad.F90 index 5b709685..912eb68a 100644 --- a/ifs-source/arpifs/phys_radi/suecrad.F90 +++ b/ifs-source/arpifs/phys_radi/suecrad.F90 @@ -155,7 +155,7 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) USE YOMSOLARIRRADIANCE, ONLY :YSOLARIRRADIANCE ! Total solar irradiance multi-annual timeseries USE YOERADGHG , ONLY : YRADGHG ! Climatology interpolated to current model time USE RADIATION_SETUP , ONLY : SETUP_RADIATION_SCHEME - +USE ND_PARAM , ONLY : ND_PARAM_SETUP !------------------------------------------------------------------------------- IMPLICIT NONE @@ -2135,6 +2135,8 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) YDAERM7%M7SSA(:,:,:,:) = 0.0_JPRB YDAERM7%M7ASYM(:,:,:,:) = 0.0_JPRB YDAERM7%M7AODLW(:,:,:,:) = 0.0_JPRB + + IF (NCLOUDACT == 1) CALL ND_PARAM_SETUP ENDIF ENDIF ! - 6.1. PARAMETERS FOR THE STANDARD TEGEN AEROSOL CLIMATOLOGY From a06c88b058d21e61269091bd1af1d4808ac63f8e Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Mon, 28 Apr 2025 16:36:38 +0200 Subject: [PATCH 059/129] Ensure that fraction of activated particles is set in case of M&N --- .../arpifs/m7/phys_ec/hamm7_interface.F90 | 10 ++++---- .../arpifs/m7/phys_ec/yoe_aer_activ.F90 | 24 ++++++++++++------- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index 81ccc9ac..8c933331 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -1044,8 +1044,8 @@ SUBROUTINE HAMM7_INTERFACE( & END DO END DO - !eehol: integer to use M&N activation scheme or AR&G - IF ( NCLOUDACT == 1 ) THEN ! Morales and Nenes activation scheme + ! Cloud activation scheme + CLDACT: IF ( NCLOUDACT == 1 ) THEN ! Morales and Nenes !IF ( LCONSIGW ) THEN !eehol: if using the constant sigma_w it is set to 0.8 otherwise use the TKE to calculate (NOT USED YET!) ZSIGMA_W(KIDIA:KFDIA,1:KLEV) = 0.8_JPRB @@ -1061,7 +1061,7 @@ SUBROUTINE HAMM7_INTERFACE( & & PVERVEL, ZAP, PLP, PIP, & & PLSM, PGELAM, PGEMU, & !PSLON, PGEMU, & & PGFL, YDMODEL, ZCDNCACT, ZICNC, REFFL(1:KLON,1:KLEV,ZKROW), REFFI(1:KLON,1:KLEV,ZKROW), & - & ZSMAXMN, ZM6DRY, ZXTM1, KTRAC, ZSIGMA_W) + & ZSMAXMN, ZM6DRY, ZXTM1, KTRAC, ZSIGMA_W, ZFRACN) !<-- Store CDNC (number of activated particles) and ICNC as a number mixing ratio to tracer values ZXTM1(KIDIA:KFDIA,1:KLEV,idt_cdnc) = (MAX(ZCDNCACT(KIDIA:KFDIA,1:KLEV),((1.0E6_JPRB)*ZMIN_CDNC)))/ZRHO(KIDIA:KFDIA,1:KLEV) ! [#/kg] and treshold CDNC @@ -1073,7 +1073,7 @@ SUBROUTINE HAMM7_INTERFACE( & PGFL(KIDIA:KFDIA,1:KLEV,YRE_LIQ%MP9_PH) = 1.0E-06_JPRB * reffl(KIDIA:KFDIA,1:KLEV,ZKROW) ! convert um to meters and save to PGFL fields PGFL(KIDIA:KFDIA,1:KLEV,YRE_ICE%MP9_PH) = 1.0E-06_JPRB * reffi(KIDIA:KFDIA,1:KLEV,ZKROW) ! convert um to meters and save to PGFL fields - ELSE IF (NCLOUDACT == 2) THEN !eehol: use AR&G scheme + ELSE IF (NCLOUDACT == 2) THEN ! AR&G scheme !IF ( LCONSIGW ) THEN !eehol: if using the constant sigma_w it is set to 0.8 otherwise use the TKE to calculate (NOT USED YET!!) ZTKEM1(KIDIA:KFDIA,1:KLEV) = ((1/ZTUNPAR)**2)*((0.8_JPRB)**2) !eehol: this is converted back to sigma_w in mo_activ.F90 @@ -1214,7 +1214,7 @@ SUBROUTINE HAMM7_INTERFACE( & PGFL(KIDIA:KFDIA,1:KLEV,YRE_LIQ%MP9_PH) = 1.0E-06_JPRB * reffl(KIDIA:KFDIA,1:KLEV,ZKROW) ! convert um to meters and save to PGFL fields PGFL(KIDIA:KFDIA,1:KLEV,YRE_ICE%MP9_PH) = 1.0E-06_JPRB * reffi(KIDIA:KFDIA,1:KLEV,ZKROW) ! convert um to meters and save to PGFL fields - END IF !eehol: end if for default or M&N or AR&G activation + END IF CLDACT CALL GSTATS(2502,1) diff --git a/ifs-source/arpifs/m7/phys_ec/yoe_aer_activ.F90 b/ifs-source/arpifs/m7/phys_ec/yoe_aer_activ.F90 index e7ddf2e4..bec978e4 100644 --- a/ifs-source/arpifs/m7/phys_ec/yoe_aer_activ.F90 +++ b/ifs-source/arpifs/m7/phys_ec/yoe_aer_activ.F90 @@ -55,7 +55,8 @@ SUBROUTINE AER_ACTIV(KIDIA, KFDIA, KTDIA, KLON, KLEV, KSTGLO, & & PAPH, PAP, PT, PQ, PQSAT, & & PVERVEL, PA, PL, PI, & & PLSM, PGELAM, PGEMU, & !PSLON, PGEMU, & - & PGFL, YDMODEL, PCDNCACT, PICNC, PREFFL, PREFFI, PSMAX, PDRYRSOLU, PXTM1, KTRAC, PSIGMA_W) !, PEXTRA, PEXTR2) + & PGFL, YDMODEL, PCDNCACT, PICNC, PREFFL, PREFFI, PSMAX, PDRYRSOLU, PXTM1, KTRAC, PSIGMA_W, & + & PFRACN )!, PEXTRA, PEXTR2) ! *AER_ACTIV* is the interface to the cloud droplet activation scheme. ! Four schemes are available, depending on the aerosol scheme used. @@ -80,7 +81,8 @@ SUBROUTINE AER_ACTIV(KIDIA, KFDIA, KTDIA, KLON, KLEV, KSTGLO, & ! & RLMIN, RAMIN, RTHOMO !USE MO_ACTIV, ONLY: nw !eehol: to replace NACTPDF !USE YOE_AERO_M7_DATA, ONLY: NSOL - USE TM5M7_DATA, ONLY: NSOL + USE TM5M7_DATA, ONLY: NSOL + USE MO_HAM, ONLY: NCLASS !USE YOMCT3, ONLY: NSTEP !USE YOMCT0, ONLY: NFRPOS !USE YOMDYN, ONLY: TSTEP @@ -164,13 +166,14 @@ SUBROUTINE AER_ACTIV(KIDIA, KFDIA, KTDIA, KLON, KLEV, KSTGLO, & REAL(KIND=JPRB), INTENT(IN) :: PXTM1(KLON,KLEV,KTRAC) ! tracer mixing ratios REAL(KIND=JPRB), INTENT(IN) :: PSIGMA_W(KLON,KLEV) ! sigma_w - REAL(KIND=JPRB), INTENT(INOUT) :: PGFL(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NDIM) !YGFL%NDIM) - REAL(KIND=JPRB), INTENT(INOUT) :: PCDNCACT(KLON,KLEV) ! cloud droplet number concentration [#/cm-3] - REAL(KIND=JPRB), INTENT(INOUT) :: PICNC(KLON,KLEV) ! ice crystal number concentration [#/cm-3] - REAL(KIND=JPRB), INTENT(INOUT) :: PREFFL(KLON,KLEV) ! liquid droplet effective radius [um] - REAL(KIND=JPRB), INTENT(INOUT) :: PREFFI(KLON,KLEV) ! ice effective radius [um] - REAL(KIND=JPRB), INTENT(INOUT) :: PSMAX(KLON,KLEV) ! maximum supersaturation [%] - + REAL(KIND=JPRB), INTENT(INOUT) :: PGFL(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NDIM) + REAL(KIND=JPRB), INTENT(INOUT) :: PCDNCACT(KLON,KLEV) ! cloud droplet number concentration [#/cm-3] + REAL(KIND=JPRB), INTENT(INOUT) :: PICNC(KLON,KLEV) ! ice crystal number concentration [#/cm-3] + REAL(KIND=JPRB), INTENT(INOUT) :: PREFFL(KLON,KLEV) ! liquid droplet effective radius [um] + REAL(KIND=JPRB), INTENT(INOUT) :: PREFFI(KLON,KLEV) ! ice effective radius [um] + REAL(KIND=JPRB), INTENT(INOUT) :: PSMAX(KLON,KLEV) ! maximum supersaturation [%] + REAL(KIND=JPRB), INTENT(OUT) :: PFRACN(KLON,KLEV,NCLASS) ! fraction of activated particles per mode + !---extra diagnostics !REAL(KIND=JPRB) ,INTENT(INOUT) :: PEXTRA(KLON,KLEVX,KFLDX) !REAL(KIND=JPRB) ,INTENT(INOUT) :: PEXTR2(KLON,KFLDX2) @@ -232,6 +235,9 @@ SUBROUTINE AER_ACTIV(KIDIA, KFDIA, KTDIA, KLON, KLEV, KSTGLO, & & LAERICESED=>YDECLDP%LAERICESED, LAERICEAUTO=>YDECLDP%LAERICEAUTO, & & RLMIN=>YDECLDP%RLMIN, RAMIN=>YDECLDP%RAMIN, RTHOMO=>YDECLDP%RTHOMO, RNICE=>YDECLDP%RNICE) + ! Init + PFRACN(KIDIA:KFDIA,:,:) = 0._JPRB ! FIXME + !---air density DO JK=1,KLEV DO JL=KIDIA,KFDIA From f457391c073879a3671c266fe4aeeee0adf06723 Mon Sep 17 00:00:00 2001 From: Eemeli Holopainen Date: Tue, 27 May 2025 10:05:40 +0300 Subject: [PATCH 060/129] Added modewise activated fraction calculations. --- .../arpifs/m7/phys_ec/hamm7_interface.F90 | 52 +++++++++++++++++-- .../arpifs/m7/phys_ec/yoe_aer_activ.F90 | 46 +++++++++++++++- 2 files changed, 92 insertions(+), 6 deletions(-) diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index 8c933331..b52d8031 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -393,6 +393,9 @@ SUBROUTINE HAMM7_INTERFACE( & REAL(KIND=JPRB) :: ZFRACN(KLON,KLEV,nclass) !fraction of activated particles per mode REAL(KIND=JPRB) :: ZCDNCACT(KLON,KLEV) !number of activated particles [m-3] REAL(KIND=JPRB) :: ZRE_LIQ(KLON,KLEV)! liquid effective radius +REAL(KIND=JPRB) :: ZNACT_AS(KLON,KLEV),ZNACT_CS(KLON,KLEV),ZNACT_KS(KLON,KLEV) ! variables for modewise activated fraction calculations +REAL(KIND=JPRB) :: ZFRAC_KS,ZFRAC_AS,ZFRAC_CS ! variables for modewise activated fraction calculation +REAL(KIND=JPRB) :: ZNACT_TOT ! variables for modewise activated fraction calculation ! variables for HAM-M7 wet deposition REAL(KIND=JPRB) :: ZXTP1(KLON,KLEV,ntrac) !updated tracer mass/number mixing ratio REAL(KIND=JPRB) :: ZXTP1C(KLON,KLEV,ntrac) !in-cloud tracer mass/number mixing ratio @@ -1062,7 +1065,7 @@ SUBROUTINE HAMM7_INTERFACE( & & PLSM, PGELAM, PGEMU, & !PSLON, PGEMU, & & PGFL, YDMODEL, ZCDNCACT, ZICNC, REFFL(1:KLON,1:KLEV,ZKROW), REFFI(1:KLON,1:KLEV,ZKROW), & & ZSMAXMN, ZM6DRY, ZXTM1, KTRAC, ZSIGMA_W, ZFRACN) - + !<-- Store CDNC (number of activated particles) and ICNC as a number mixing ratio to tracer values ZXTM1(KIDIA:KFDIA,1:KLEV,idt_cdnc) = (MAX(ZCDNCACT(KIDIA:KFDIA,1:KLEV),((1.0E6_JPRB)*ZMIN_CDNC)))/ZRHO(KIDIA:KFDIA,1:KLEV) ! [#/kg] and treshold CDNC ZXTM1(KIDIA:KFDIA,1:KLEV,idt_icnc) = (1.0E6_JPRB)*ZICNC(KIDIA:KFDIA,1:KLEV)/ZRHO(KIDIA:KFDIA,1:KLEV) !ice crystal number conc = #/cm3 --> number mix rat [#/kg] @@ -1122,7 +1125,11 @@ SUBROUTINE HAMM7_INTERFACE( & !<-- End activation for HAM-M7 !----------------------------------------------------------------- - + + ! treshold fraction of activated particles to gridcells with only liquid clouds + DO JCLASS = 1,NCLASS + ZFRACN(KIDIA:KFDIA,1:KLEV,JCLASS) = MERGE(ZFRACN(KIDIA:KFDIA,1:KLEV,JCLASS),0._JPRB,LLIQCLD(KIDIA:KFDIA,1:KLEV)) + ENDDO ! treshold CDNC and ICNC to gridcells with only liquid or ice clouds ZCDNCACT(KIDIA:KFDIA,1:KLEV) = MERGE(ZCDNCACT(KIDIA:KFDIA,1:KLEV),1.0E6_JPRB*ZMIN_CDNC,LLIQCLD(KIDIA:KFDIA,1:KLEV)) !mask only values inside liq cloud ZICNC(KIDIA:KFDIA,1:KLEV) = MERGE(ZICNC(KIDIA:KFDIA,1:KLEV),1.0E6_JPRB*RNICE,LICECLD(KIDIA:KFDIA,1:KLEV)) !mask only values inside ice cloud @@ -1133,7 +1140,7 @@ SUBROUTINE HAMM7_INTERFACE( & PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH) = 1.0E-6_JPRB*( MAX(ZCDNCACT(KIDIA:KFDIA,1:KLEV), ZMIN_CDNC*1.0E+6_JPRB)) ! convert from #/m3 to #/cm3 and treshold minimum value to 1 cm-3 PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH) = MAX( ZICNC(KIDIA:KFDIA,1:KLEV), 0.027_JPRB) ! no conversion needed: already in #/cm3, just max of default value (RNICE in sucldp.F90) and icnc !--> End store CDNC and ICNC - + !----------------------------------------------------------------- !--> Calculation for effective radii and put to PGFL fields @@ -1166,7 +1173,9 @@ SUBROUTINE HAMM7_INTERFACE( & !----------------------------------------------------------------- ELSE !eehol: default values if neither activation is used - + + ZFRACN(KIDIA:KFDIA,:,:) = 0._JPRB !init + DO JL = KIDIA,KFDIA !eehol: add CDNC over land and over ocean as default values IF ( PLSM(JL) < 0.5_JPRB ) THEN !over ocean ZCDNCACT(JL,1:KLEV) = RCCNSEA*1.0E6_JPRB !from 1/cm3 to 1/m3 @@ -1175,6 +1184,41 @@ SUBROUTINE HAMM7_INTERFACE( & END IF END DO + !calculate modewise fraction of activated particles + !assume only KS, AS, CS modes to be activated + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZNACT_TOT = ZCDNCACT(JL,JK) / ZRHO(JL,JK) !calculate total number of activated particles in #/kg + IF ( ZXTM1(JL,JK,SIZECLASS(4)%IDT_NO) > 1.E-9_JPRB ) THEN + ZFRAC_CS = MAX(ZNACT_TOT,0._JPRB) / ZXTM1(JL,JK,SIZECLASS(4)%IDT_NO) + ELSE + ZFRAC_CS = 0._JPRB + ENDIF + ZFRACN(JL,JK,4) = MAX(0._JPRB,MIN(ZFRAC_CS,1._JPRB)) !threshold between 0 and 1 + ZNACT_CS(JL,JK) = ZXTM1(JL,JK,SIZECLASS(4)%IDT_NO) * ZFRACN(JL,JK,4) !calculate activated number for CS mode + + IF ( ZXTM1(JL,JK,SIZECLASS(3)%IDT_NO) > 1.E-9_JPRB ) THEN + ZFRAC_AS = MAX(ZNACT_TOT - ZNACT_CS(JL,JK),0._JPRB) / ZXTM1(JL,JK,SIZECLASS(3)%IDT_NO) + ELSE + ZFRAC_AS = 0._JPRB + ENDIF + ZFRACN(JL,JK,3) = MAX(0._JPRB,MIN(ZFRAC_AS, 1._JPRB)) !threshold between 0 and 1 + ZNACT_AS(JL,JK) = ZXTM1(JL,JK,SIZECLASS(3)%IDT_NO) * ZFRACN(JL,JK,3) !calculate activated number for AS mode + + IF ( ZXTM1(JL,JK,SIZECLASS(2)%IDT_NO) > 1.E-9_JPRB ) THEN + ZFRAC_KS = MAX((ZNACT_TOT - ZNACT_CS(JL,JK) - ZNACT_AS(JL,JK)),0._JPRB) / ZXTM1(JL,JK,SIZECLASS(2)%IDT_NO) + ELSE + ZFRAC_KS = 0._JPRB + ENDIF + ZFRACN(JL,JK,2) = MAX(0._JPRB,MIN(ZFRAC_KS, 1._JPRB)) !threshold between 0 and 1 + ZNACT_KS(JL,JK) = ZXTM1(JL,JK,SIZECLASS(2)%IDT_NO) * ZFRACN(JL,JK,2) !calculate activated number for KS mode + + ZFRACN(JL,JK,2) = MERGE(ZFRACN(JL,JK,2),0._JPRB,LLIQCLD(JL,JK)) !fraction only where there is cloud + ZFRACN(JL,JK,3) = MERGE(ZFRACN(JL,JK,3),0._JPRB,LLIQCLD(JL,JK)) !fraction only where there is cloud + ZFRACN(JL,JK,4) = MERGE(ZFRACN(JL,JK,4),0._JPRB,LLIQCLD(JL,JK)) !fraction only where there is cloud + END DO + END DO + ! treshold CDNC and ICNC to gridcells with only liquid or ice clouds ZCDNCACT(KIDIA:KFDIA,1:KLEV) = MERGE(ZCDNCACT(KIDIA:KFDIA,1:KLEV),1.0E6_JPRB*ZMIN_CDNC,LLIQCLD(KIDIA:KFDIA,1:KLEV)) !mask only values inside liq cloud ZICNC(KIDIA:KFDIA,1:KLEV) = MERGE(ZICNC(KIDIA:KFDIA,1:KLEV),1.0E6_JPRB*RNICE,LICECLD(KIDIA:KFDIA,1:KLEV)) !mask only values inside ice cloud diff --git a/ifs-source/arpifs/m7/phys_ec/yoe_aer_activ.F90 b/ifs-source/arpifs/m7/phys_ec/yoe_aer_activ.F90 index bec978e4..408fb59a 100644 --- a/ifs-source/arpifs/m7/phys_ec/yoe_aer_activ.F90 +++ b/ifs-source/arpifs/m7/phys_ec/yoe_aer_activ.F90 @@ -205,6 +205,11 @@ SUBROUTINE AER_ACTIV(KIDIA, KFDIA, KTDIA, KLON, KLEV, KSTGLO, & REAL(KIND=JPRB) :: ZRE_LIQ(KLON,KLEV) ! liquid droplet effective radius [um] REAL(KIND=JPRB) :: ZRE_ICE(KLON,KLEV) ! ice crystal effective radius [um] REAL(KIND=JPRB) :: ZSMAX(KLON,KLEV) ! maximum supersaturation [%] + REAL(KIND=JPRB) :: ZNACT_TOT ! variables for modewise activated fraction calculations + REAL(KIND=JPRB) :: ZNACT_AS(KLON,KLEV) + REAL(KIND=JPRB) :: ZNACT_CS(KLON,KLEV) + REAL(KIND=JPRB) :: ZNACT_KS(KLON,KLEV) ! variables for modewise activated fraction calculations + REAL(KIND=JPRB) :: ZFRAC_KS,ZFRAC_AS,ZFRAC_CS ! variables for modewise activated fraction calculations !variables for liquid droplet eff rad calculations REAL(KIND=JPRB) :: ZQLWC(KLON,KLEV) !tresholded LWC [kg/kg] @@ -236,7 +241,7 @@ SUBROUTINE AER_ACTIV(KIDIA, KFDIA, KTDIA, KLON, KLEV, KSTGLO, & & RLMIN=>YDECLDP%RLMIN, RAMIN=>YDECLDP%RAMIN, RTHOMO=>YDECLDP%RTHOMO, RNICE=>YDECLDP%RNICE) ! Init - PFRACN(KIDIA:KFDIA,:,:) = 0._JPRB ! FIXME + PFRACN(KIDIA:KFDIA,:,:) = 0._JPRB !---air density DO JK=1,KLEV @@ -418,7 +423,44 @@ SUBROUTINE AER_ACTIV(KIDIA, KFDIA, KTDIA, KLON, KLEV, KSTGLO, & CALL ICE_CLOUD_PROP(KIDIA, KFDIA, KLON, KLEV, PT, ZRHO, PI, PA, PAP, & & PQSAT, ZSO4BULK, ZBCBULK, ZDUBULK, PGFL, YDMODEL, ZRE_ICE, ZICNC) END IF - + + + !eehol: calculate modewise fraction of activated particles + !assume only KS, AS, CS modes to be activated + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZNACT_TOT = 1.0E6_JPRB * ZCDNC(JL,JK) / ZRHO(JL,JK) !calculate total number of activated particles in #/kg + IF ( ZAERONUM(JL,JK,4) > 1.E-9_JPRB ) THEN + ZFRAC_CS = MAX(ZNACT_TOT,0._JPRB) / ZAERONUM(JL,JK,4) + ELSE + ZFRAC_CS = 0._JPRB + ENDIF + PFRACN(JL,JK,4) = MAX(0._JPRB,MIN(ZFRAC_CS,1._JPRB)) !threshold between 0 and 1 + ZNACT_CS(JL,JK) = ZAERONUM(JL,JK,4) * PFRACN(JL,JK,4) !calculate activated number for CS mode + + IF ( ZAERONUM(JL,JK,3) > 1.E-9_JPRB ) THEN + ZFRAC_AS = MAX(ZNACT_TOT - ZNACT_CS(JL,JK),0._JPRB) / ZAERONUM(JL,JK,3) + ELSE + ZFRAC_AS = 0._JPRB + ENDIF + PFRACN(JL,JK,3) = MAX(0._JPRB,MIN(ZFRAC_AS, 1._JPRB)) !threshold between 0 and 1 + ZNACT_AS(JL,JK) = ZAERONUM(JL,JK,3) * PFRACN(JL,JK,3) !calculate activated number for AS mode + + IF ( ZAERONUM(JL,JK,2) > 1.E-9_JPRB ) THEN + ZFRAC_KS = MAX((ZNACT_TOT - ZNACT_CS(JL,JK) - ZNACT_AS(JL,JK)),0._JPRB) / ZAERONUM(JL,JK,2) + ELSE + ZFRAC_KS = 0._JPRB + ENDIF + PFRACN(JL,JK,2) = MAX(0._JPRB,MIN(ZFRAC_KS, 1._JPRB)) !threshold between 0 and 1 + ZNACT_KS(JL,JK) = ZAERONUM(JL,JK,2) * PFRACN(JL,JK,2) !calculate activated number for KS mode + + PFRACN(JL,JK,2) = MERGE(PFRACN(JL,JK,2),0._JPRB,LLIQCLD(JL,JK)) !fraction only where there is cloud + PFRACN(JL,JK,3) = MERGE(PFRACN(JL,JK,3),0._JPRB,LLIQCLD(JL,JK)) !fraction only where there is cloud + PFRACN(JL,JK,4) = MERGE(PFRACN(JL,JK,4),0._JPRB,LLIQCLD(JL,JK)) !fraction only where there is cloud + END DO + END DO + + !eehol: diagnostics: !--CDNC !PCDNCACT(KIDIA:KFDIA,:) = 1.0E6_JPRB*PGFL(KIDIA:KFDIA,:,YCDNC%MP9_PH) !eehol: output CDNC [#/m3] From 863ae5d8e3c96ed312c3b1dffb808119383b6d05 Mon Sep 17 00:00:00 2001 From: Lianghai Wu Date: Thu, 30 Jan 2025 15:27:30 +0000 Subject: [PATCH 061/129] Add diagnostic of aerosol optical properties at various wavelengths --- ifs-source/arpifs/m7/module/mo_ham_rad.F90 | 213 ++++++++++++++- .../arpifs/m7/phys_ec/hamm7_interface.F90 | 250 +++++++++++++----- 2 files changed, 386 insertions(+), 77 deletions(-) diff --git a/ifs-source/arpifs/m7/module/mo_ham_rad.F90 b/ifs-source/arpifs/m7/module/mo_ham_rad.F90 index 4b8a758d..c3923702 100755 --- a/ifs-source/arpifs/m7/module/mo_ham_rad.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_rad.F90 @@ -874,7 +874,9 @@ END SUBROUTINE ham_rad_refrac_brugge SUBROUTINE ham_rad(kproma, kbdim, klev, krow, kpband, kb_sw, & pxtm1, ppd_hl, & - aer_tau_sw_vr, aer_piz_sw_vr, aer_cg_sw_vr, aer_tau_lw_vr, rwet_m7) + aer_tau_sw_vr, aer_piz_sw_vr, aer_cg_sw_vr, aer_tau_lw_vr, rwet_m7, & + & ldiag_aeropt, kb_diag, ntype_diaf, & + & lambda_diag, zaer_tau_diag, zaer_ssa_diag, zaer_asym_diag) ! *ham_rad* calculates optical properties for ! aerosol distributions from look-up ! tables. @@ -931,7 +933,7 @@ SUBROUTINE ham_rad(kproma, kbdim, klev, krow, kpband, kb_sw, & !--- Arguments: - INTEGER,INTENT(IN) :: kproma , kbdim, klev, krow, kpband, kb_sw + INTEGER,INTENT(IN) :: kproma , kbdim, klev, krow, kpband, kb_sw,kb_diag,ntype_diaf REAL(dp), INTENT(in) :: ppd_hl(kbdim,klev) ! pressure diff between half levels [Pa] @@ -942,6 +944,18 @@ SUBROUTINE ham_rad(kproma, kbdim, klev, krow, kpband, kb_sw, & aer_cg_sw_vr(kbdim,klev,kb_sw), & !< aerosol asymmetry factor aer_piz_sw_vr(kbdim,klev,kb_sw) !< aerosol single scattering albedo + ! diagnostic aerosol optical properties + logical,intent(in) :: ldiag_aeropt ! logical for aerosol optics + real(dp),intent(in) :: lambda_diag(kb_diag) + real(dp),intent(inout) :: zaer_tau_diag(kbdim,klev,kb_diag) + real(dp),intent(inout) :: zaer_ssa_diag(kbdim,klev,kb_diag) + real(dp),intent(inout) :: zaer_asym_diag(kbdim,klev,kb_diag) + + REAL(dp) :: sigma_diag(kbdim,klev,kb_diag,nclass), & + omega_diag(kbdim,klev,kb_diag,nclass), & + asym_diag (kbdim,klev,kb_diag,nclass), & + nr_diag(kbdim,klev,kb_diag,nclass), & + ni_diag(kbdim,klev,kb_diag,nclass) !--- Local Variables: #ifdef HAMMOZ @@ -956,7 +970,8 @@ SUBROUTINE ham_rad(kproma, kbdim, klev, krow, kpband, kb_sw, & zdpg(kbdim,klev) ! auxiliary parameter dp/grav REAL(dp) :: zaer_tau_sw_vr(kbdim,klev,Nwv_sw_tot,nclass),& ! SW optical depth for each band and mode - zaer_tau_lw_vr(kbdim,klev,Nwv_lw,nclass) ! LW optical depth for each band and mode + zaer_tau_lw_vr(kbdim,klev,Nwv_lw,nclass),& ! LW optical depth for each band and mode + zaer_tau_diag_vr(kbdim,klev,kb_diag,nclass) ! diag optical depth for each band and mode !>>gf: needed to avoid architecture-dependent problems (Cray XT5) REAL(dp) :: znr2d(kbdim,klev), & ! 2D subset of 4D array nr @@ -989,6 +1004,10 @@ SUBROUTINE ham_rad(kproma, kbdim, klev, krow, kpband, kb_sw, & sigma(1:kproma,:,:,:)=0._dp omega(1:kproma,:,:,:)=0._dp asym(1:kproma,:,:,:) =0._dp + + sigma_diag(1:kproma,:,:,:)=0._dp + omega_diag(1:kproma,:,:,:)=0._dp + asym_diag (1:kproma,:,:,:)=0._dp !nr(1:kproma,:,:,:) =0._dp !ni(1:kproma,:,:,:) =0._dp !znum(1:kproma,:,:) =0._dp @@ -1305,7 +1324,193 @@ SUBROUTINE ham_rad(kproma, kbdim, klev, krow, kpband, kb_sw, & END IF - !--- 3) Set echam fields to zero for diagnostic aerosol radiative properties only: + + + + + !--- 3) Calculate optical properties for diagnostic bands: + + IF (ldiag_aeropt) THEN + IF (ANY(nrad(:)==1) .OR. ANY(nrad(:)==3)) THEN + + DO jclass=1, nclass + IF (nrad(jclass)==1 .OR. nrad(jclass)==3) THEN + +#ifdef HAMMOZ + rwet_p => rwet(jclass)%ptr +#endif + + DO jwv=1,kb_diag + + !--- 1.1) Calculate volume averaged refractive index nr and ni: +#ifdef HAMMOZ + IF (ltimer) CALL timer_start(timer_ham_rad_refrac) +#endif + !gf: the former usage of nr(1:kproma,:,jwv,jclass) and ni(1:kproma,:,jwv,jclass) + ! directly in the call to ham_rad_refrac is causing architecture-dependent problems (Cray XT5) + ! Therefore intermediate variables znr2d and zni2d are introduced + + znr2d(1:kproma,:) = nr_diag(1:kproma,:,jwv,jclass) + zni2d(1:kproma,:) = ni_diag(1:kproma,:,jwv,jclass) + + CALL ham_rad_refrac(kproma, kbdim, klev, krow, & + ntrac, jclass, jwv, & + pxtm1, znr2d, zni2d ) + +#ifdef HAMMOZ + IF (ltimer) CALL timer_stop(timer_ham_rad_refrac) +#endif + !--- 1.1) Calculate size parameter: +#ifdef HAMMOZ + zxx(1:kproma,:) = 2._dp*pi*rwet_p(1:kproma,:,krow)/lambda_diag(jwv) +#else + zxx(1:kproma,:) = 2._dp*pi*rwet_m7(1:kproma,:,jclass)/lambda_diag(jwv) +#endif + + !--- 1.2) Table-lookup for optical properties: +#ifdef HAMMOZ + IF (ltimer) CALL timer_start(timer_ham_rad_fitplus) +#endif + !gf: same as in the call to ham_rad_refrac, for the call to ham_rad_fitplus + + zsigma2d(1:kproma,:) = sigma_diag(1:kproma,:,jwv,jclass) + zomega2d(1:kproma,:) = omega_diag(1:kproma,:,jwv,jclass) + zasym2d(1:kproma,:) = asym_diag(1:kproma,:,jwv,jclass) + + SELECT CASE(nham_subm) + + CASE(HAM_M7) + + IF (ABS(modesigma(jclass)-sigma_fine) fn2a .AND. jclass < fn2b-(nbin3-1))) THEN + itable=1 + ELSE + itable=2 + END IF +#endif + END SELECT + + IF (itable == 1) THEN + CALL ham_rad_fitplus(kproma, kbdim, klev, & + zxx, znr2d, zni2d, & + itable, lut1_sigma, zsigma2d, & + lut1_omega, zomega2d, & + lut1_g, zasym2d ) + + ELSE + + CALL ham_rad_fitplus(kproma, kbdim, klev, & + zxx, znr2d, zni2d, & + itable, lut2_sigma, zsigma2d, & + lut2_omega, zomega2d, & + lut2_g, zasym2d ) + + END IF +#ifdef HAMMOZ + IF (ltimer) CALL timer_stop(timer_ham_rad_fitplus) +#endif + !>>gf: update the original 4d arrays + sigma_diag(1:kproma,:,jwv,jclass) = zsigma2d(1:kproma,:)*lambda_diag(jwv)*lambda_diag(jwv) + omega_diag(1:kproma,:,jwv,jclass) = zomega2d(1:kproma,:) + asym_diag(1:kproma,:,jwv,jclass) = zasym2d(1:kproma,:) + nr_diag(1:kproma,:,jwv,jclass) = znr2d(1:kproma,:) + ni_diag(1:kproma,:,jwv,jclass) = zni2d(1:kproma,:) + !<0) THEN + DO jwv=1, kb_diag + zaer_tau_diag_vr(1:kproma,:,jwv,jclass)=znum(1:kproma,:,jclass)*sigma_diag(1:kproma,:,jwv,jclass) + END DO + END IF + END DO + + !--- Diagnose AOD for requested each mode (nrad) and wavelength (nraddiagwv): +!#ifdef HAMMOZ +! DO jclass=1, nclass +! IF(nrad(jclass)>0) THEN +! DO jwv=1, kb_diag +! IF (nraddiagwv(jwv)>0) THEN +! tau_mode(jclass,jwv)%ptr(1:kproma,:,krow)=zaer_tau_sw_vr(1:kproma,:,jwv,jclass) +! END IF +! END DO +! END IF +! END DO +!#endif + !--- Calculation of weighted properties and vertical reordering to RRTM structure: + + DO jwv=1, kb_diag !ham_ps +Nwv_sw_opt + + DO jclass=1, nclass + DO jk=1, klev +#ifdef HAMMOZ + ikl=klev+1-jk +#else + !No vertical reordering here + ikl=jk +#endif + DO jl=1, kproma + + + !real(kind=jprb),intent(inout) :: zaer_tau_diag(kbdim,klev,kb_diag,ntype_diaf) + !real(kind=jprb),intent(inout) :: zaer_ssa_diag(kbdim,klev,kb_diag,ntype_diaf) + !real(kind=jprb),intent(inout) :: zaer_asym_diag(kbdim,klev,kb_diag,ntype_diaf) + + zaer_tau_diag(jl,jk,jwv) =zaer_tau_diag(jl,jk,jwv) + & + zaer_tau_diag_vr(jl,ikl,jwv,jclass) + zaer_ssa_diag(jl,jk,jwv) =zaer_ssa_diag(jl,jk,jwv) + & + zaer_tau_diag_vr(jl,ikl,jwv,jclass)*omega_diag(jl,ikl,jwv,jclass) + zaer_asym_diag(jl,jk,jwv) =zaer_asym_diag(jl,jk,jwv) + & + zaer_tau_diag_vr(jl,ikl,jwv,jclass)*omega_diag(jl,ikl,jwv,jclass)*asym_diag(jl,ikl,jwv,jclass) + END DO + END DO + END DO + + DO jk=1, klev + DO jl=1, kproma + IF(zaer_tau_diag(jl,jk,jwv)>EPSILON(1.0_dp)) THEN + zaer_ssa_diag(jl,jk,jwv) = zaer_ssa_diag(jl,jk,jwv)/ zaer_tau_diag(jl,jk,jwv) + zaer_asym_diag(jl,jk,jwv) = zaer_asym_diag(jl,jk,jwv)/zaer_tau_diag(jl,jk,jwv) + END IF + END DO + END DO + + END DO + + END IF + END IF ! ldiag_aeropt + + + !--- 4) Set echam fields to zero for diagnostic aerosol radiative properties only: IF (naerorad==2) THEN aer_tau_lw_vr(1:kproma,:,:) = 0.0_dp diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index b52d8031..09863036 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -327,6 +327,7 @@ SUBROUTINE HAMM7_INTERFACE( & LOGICAL :: LLIQCLD(KLON,KLEV) ! logical for liquid cloud LOGICAL :: LICECLD(KLON,KLEV) ! logical for ice cloud + REAL(KIND=JPRB), PARAMETER :: ZEPSEC=1e-14 REAL(KIND=JPRB), PARAMETER :: ZMIN_CDNC=1.0_JPRB !eehol: minimum CDNC (can be changed but for now 1 cm-3) REAL(KIND=JPRB), PARAMETER :: ZTUNPAR=0.8164965_JPRB !eehol: tuning parameter for sigma_w derived from TKE (square root of 2/3 (isotropy assumption)) @@ -498,6 +499,15 @@ SUBROUTINE HAMM7_INTERFACE( & LOGICAL :: LBLHFOUND(KLON) ! logical if boundary layer height is found REAL(KIND=JPRB) :: ZRG ! 1/RG +!!! parameters needed for diagnostic aerosol optical properties +LOGICAL :: LDIAG_AEROPT ! logical for aerosol optics +REAL(KIND=JPRB) :: ZAER_TAU_DIAG(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG) +REAL(KIND=JPRB) :: ZAER_SSA_DIAG(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG) +REAL(KIND=JPRB) :: ZAER_ASYM_DIAG(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG) +REAL(KIND=JPRB) :: LAMBDA_DIAG(YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG) + +REAL(KIND=JPRB) :: ZAOD_DIAG(KLON,YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG), ZSSA_DIAG(KLON,YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG) +REAL(KIND=JPRB) :: ZABS_DIAG(KLON,YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG), ZASY_DIAG(KLON,YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG) !----------------------------------------------------------------------- #include "abor1.intfb.h" @@ -1262,6 +1272,77 @@ SUBROUTINE HAMM7_INTERFACE( & CALL GSTATS(2502,1) + !<-- End activation for HAM-M7 + !----------------------------------------------------------------- + + !<-- Store CDNC (number of activated particles) and ICNC as a number mixing ratio to tracer values and to PGFL fields + ZXTM1(KIDIA:KFDIA,1:KLEV,idt_cdnc) = (MAX(ZCDNCACT(KIDIA:KFDIA,1:KLEV),((1.0E6_JPRB)*1._JPRB)))/ZRHO(KIDIA:KFDIA,1:KLEV) ! [#/kg] and treshold CDNC to 1 cm-3 + ZXTM1(KIDIA:KFDIA,1:KLEV,idt_icnc) = (1.0E6_JPRB)*ZICNC(KIDIA:KFDIA,1:KLEV)/ZRHO(KIDIA:KFDIA,1:KLEV) !ice crystal number conc = #/cm3 --> number mix rat [#/kg] + PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH) = 1.0E-6_JPRB*( MAX(ZCDNCACT(KIDIA:KFDIA,1:KLEV), 1.0E+6_JPRB)) ! convert from #/m3 to #/cm3 and treshold minimum value to 1 cm-3 + PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH) = MAX( ZICNC(KIDIA:KFDIA,1:KLEV), 0.027_JPRB) ! no conversion needed: already in #/cm3, just max of default value (RNICE in sucldp.F90) and icnc + !--> End store CDNC and ICNC + + !----------------------------------------------------------------- + !--> Calculation for effective radii and put to PGFL fields + + ! put default values for effective radii + reffl(KIDIA:KFDIA,1:KLEV,ZKROW) = 4._JPRB ! comes from liquid effective radius routine (PP_MIN_RE_UM) + reffi(KIDIA:KFDIA,1:KLEV,ZKROW) = 80._JPRB*0.64952_JPRB ! comes from ice effective radius routine (ZDEFAULT_RE_UM) + + ! liquid effective radius + + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + IF ( PAP(JL,JK) >=0.001_JPRB ) THEN + ZTEMP=1.0_JPRB/PAP(JL,JK) + ZDPOG=1.0/RG*(PRS1(JL,JK)-PRS1(JL,JK-1)) + +!-- cloud and ice water path in kg m-2 + ZQIWP =MAX(0._JPRB,ZDPOG*PIP(JL,JK)*ZTEMP) + ZQLWP(JL,JK) =MAX(0._JPRB,ZDPOG*PLP(JL,JK)*ZTEMP) +!-- cloud and ice water content in g m-3 + ZPODT=1.0/RD*PRSF1(JL,JK)/PTP(JL,JK) + ZIP(JL,JK)=PIP(JL,JK)*ZPODT*ZTEMP + ZLP(JL,JK)=PLP(JL,JK)*ZPODT*ZTEMP + ELSE + ZQIWP = 0._JPRB + ZQLWP(JL,JK) = 0._JPRB + ZLP(JL,JK) = 0._JPRB + ZIP(JL,JK) = 0._JPRB + ENDIF + END DO + END DO + + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZTMPA = 1.0_JPRB/MAX(ZAP(JL,JK),ZEPSEC) + LLIQCLD(JL,JK) = ( PLP(JL,JK)*ZTMPA ) > ZEPSEC ! logical for liquid cloud + LICECLD(JL,JK) = ( PIP(JL,JK)*ZTMPA ) > ZEPSEC ! logical for ice cloud + ! ZQLWP2(JL,JK) = PLP(JL,JK)/MAX(ZAP(JL,JK),1.E-10_JPRB) ! calculate lwp + ! ZQLWP2(JL,JK) = MIN(MAX(ZQLWP2(JL,JK),0.0_JPRB),10*RCLDMAX) ! treshold lwp, lianghai changed + + ! effective radius calculated similarly as in radlswr.F90 + ! 2.387e-10 is 3/(4*pi*rho_liq*10^6) [10^6 for N in right units] + ZRE_LIQ(JL,JK) = 1.E+06_JPRB*(2.387e-10_JPRB*ZRHO(JL,JK)*ZQLWP2(JL,JK)/(MAX(PGFL(JL,JK,YCDNC%MP9_PH),10._JPRB)))**0.333_JPRB ! calculate effective radius in um (use minimum value for CDNC if CDNC is small) + + END DO + END DO + ! Add liq. eff. rad. to HAM variables (only if there is liquid cloud else minimum value) + REFFL(KIDIA:KFDIA,1:KLEV,ZKROW) = MERGE(ZRE_LIQ(KIDIA:KFDIA,1:KLEV)*1.E+6_JPRB,4._JPRB,LLIQCLD(KIDIA:KFDIA,1:KLEV)) + CALL ICE_EFFECTIVE_RADIUS(YRERAD, YDSPP_CONFIG, KIDIA, KFDIA, KLON, KLEV, & + & PRSF1, PTP, ZAP, PIP, PSP, PGEMU, & ! pressure, temp, cloud fr., IWC, SWC, sine of latitude + & reffi(1:KLON,1:KLEV,ZKROW)) ! ice effective radius (updated to mo_activ variable 'reffi' which used in mo_ham_wetdep) + + ! only if there is ice cloud else minimum value + REFFI(KIDIA:KFDIA,1:KLEV,ZKROW) = MERGE(REFFI(KIDIA:KFDIA,1:KLEV,ZKROW), 20._JPRB, LICECLD(KIDIA:KFDIA,1:KLEV)) + + ! add effective radii to PGFL fields + PGFL(KIDIA:KFDIA,1:KLEV,YRE_LIQ%MP9_PH) = 1.0E-06_JPRB * reffl(KIDIA:KFDIA,1:KLEV,ZKROW) ! convert um to meters and save to PGFL fields + PGFL(KIDIA:KFDIA,1:KLEV,YRE_ICE%MP9_PH) = 1.0E-06_JPRB * reffi(KIDIA:KFDIA,1:KLEV,ZKROW) ! convert um to meters and save to PGFL fields + + !<-- End calculation for effective radii + !----------------------------------------------------------------- + !--- Mass conserving correction of negative tracer values: CALL XT_BORROW(KFDIA, KLON, KLEV, KLEV+1, NTRAC, & PRSF1, PRS1, & @@ -1743,6 +1824,10 @@ SUBROUTINE HAMM7_INTERFACE( & ENDDO ENDDO +ZAER_TAU_DIAG(KIDIA:KFDIA,:,:) = 0.0_JPRB +ZAER_SSA_DIAG(KIDIA:KFDIA,:,:) = 0.0_JPRB +ZAER_ASYM_DIAG(KIDIA:KFDIA,:,:) = 0.0_JPRB + IF(MOD(NSTEP+1,NRADFR) == 0) THEN CALL GSTATS(2506,0) ZAER_TAU(KIDIA:KFDIA,:,:,:) = 0.0_JPRB @@ -1823,10 +1908,20 @@ SUBROUTINE HAMM7_INTERFACE( & ! Use HAM codes to calculate optical properties LWBANDS=16 PRS1D(KIDIA:KFDIA,:) = PRS1(KIDIA:KFDIA,1:KLEV)-PRS1(KIDIA:KFDIA,0:KLEV-1) + + LDIAG_AEROPT = (NAERO_WVL_DIAG >0) .AND. (YGFL%NAERO_WVL_DIAG_TYPES>0) + + DO IW = 1, NAERO_WVL_DIAG + LAMBDA_DIAG(IW) = YGFL%YAERO_WVL_DIAG_NL(IW)%IWVL *1.0E-9_JPRB ! nm to m + ENDDO !CALL ham_rad_cache(KLON,KLEV) ZXTM0(KIDIA:KFDIA,1:KLEV,:) = ZXTM1(KIDIA:KFDIA,1:KLEV,:) + ZXTTE(KIDIA:KFDIA,1:KLEV,:)*time_step_len + CALL HAM_RAD(KFDIA, KLON, KLEV, ZKROW, LWBANDS, NASWBAND, ZXTM0, PRS1D, & - & ZAER_TAU(:,:,:,1), ZAER_SSA, ZAER_ASYM, ZAER_TAU_LW, ZM6RP) + & ZAER_TAU(:,:,:,1), ZAER_SSA, ZAER_ASYM, ZAER_TAU_LW, ZM6RP, & + & LDIAG_AEROPT,NAERO_WVL_DIAG,YGFL%NAERO_WVL_DIAG_TYPES, & + & LAMBDA_DIAG, ZAER_TAU_DIAG, ZAER_SSA_DIAG, ZAER_ASYM_DIAG) + !CALL ham_rad_cache_cleanup DO JK = 1, KLEV @@ -1854,6 +1949,10 @@ SUBROUTINE HAMM7_INTERFACE( & PASY (KIDIA:KFDIA,:)=0._JPRB PAOD_LW(KIDIA:KFDIA,:)=0._JPRB +ZAOD_DIAG(KIDIA:KFDIA,:)= 0._JPRB +ZSSA_DIAG(KIDIA:KFDIA,:)= 0._JPRB +ZASY_DIAG(KIDIA:KFDIA,:)= 0._JPRB + DO JK = 1, KLEV DO JL = KIDIA,KFDIA DO IW=1,NASWBAND @@ -1863,20 +1962,32 @@ SUBROUTINE HAMM7_INTERFACE( & END DO DO IW=1,16 - PAOD_LW(JL,IW)=PAOD_LW(JL,IW)+PAER_TAU_LW(JL,JK,IW) + PAOD_LW(JL,IW)=PAOD_LW(JL,IW)+PAER_TAU_LW(JL,JK,IW) + END DO + + DO IW=1,NAERO_WVL_DIAG + ZAOD_DIAG(JL,IW)= ZAER_TAU_DIAG(JL,JK,IW)+ZAOD_DIAG(JL,IW) + ZSSA_DIAG(JL,IW)= ZAER_SSA_DIAG(JL,JK,IW)*ZAER_TAU_DIAG(JL,JK,IW)+ZSSA_DIAG(JL,IW) + ZASY_DIAG(JL,IW)= ZAER_ASYM_DIAG(JL,JK,IW)*ZAER_TAU_DIAG(JL,JK,IW)+ZASY_DIAG(JL,IW) END DO !IF(PAOD(JL,IW)>0._JPRB) THEN - ! PSSA(JL,:) =PSSA(JL,:)/PAOD(JL,IW)! AOD AVERAGE + ! PSSA(JL,:) =PSSA(JL,:)/PAOD(JL,IW)! AOD AVERAGE ! PASY(JL,:) =PASY(JL,:)/PAOD(JL,IW)! AOD AVERAGE - !ENDIF + !ENDIF END DO END DO DO JL = KIDIA,KFDIA DO IW=1,NASWBAND IF(PAOD(JL,IW)>0._JPRB) THEN - PSSA(JL,IW) =PSSA(JL,IW)/PAOD(JL,IW)! AOD AVERAGE - PASY(JL,IW) =PASY(JL,IW)/PAOD(JL,IW)! AOD AVERAGE + PSSA(JL,IW) = PSSA(JL,IW)/PAOD(JL,IW)! AOD AVERAGE + PASY(JL,IW) = PASY(JL,IW)/PAOD(JL,IW)! AOD AVERAGE + ENDIF + END DO + DO IW=1,NAERO_WVL_DIAG + IF(ZAOD_DIAG(JL,IW)>0._JPRB) THEN + ZSSA_DIAG(JL,IW) = ZSSA_DIAG(JL,IW)/ZAOD_DIAG(JL,IW)! AOD AVERAGE + ZASY_DIAG(JL,IW) = ZASY_DIAG(JL,IW)/ZAOD_DIAG(JL,IW)! AOD AVERAGE ENDIF END DO END DO @@ -1887,19 +1998,20 @@ SUBROUTINE HAMM7_INTERFACE( & DO JWAVL=1,MIN(INWAVL,NAERO_WVL_DIAG) DO JL=KIDIA,KFDIA IF (YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_AOD) THEN - PAERO_WVL_DIAG(JL,JWAVL,JPAERO_WVL_AOD) = PAOD(JL,JWAVL) + PAERO_WVL_DIAG(JL,JWAVL,JPAERO_WVL_AOD) = ZAOD_DIAG(JL,JWAVL) ENDIF IF (YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_AODABS) THEN - PAERO_WVL_DIAG(JL,JWAVL,JPAERO_WVL_AODABS) = PABS(JL,JWAVL)! 0.0 + !PAERO_WVL_DIAG(JL,JWAVL,JPAERO_WVL_AODABS) = ZABS_DIAG(JL,JWAVL)! 0.0 + PAERO_WVL_DIAG(JL,JWAVL,JPAERO_WVL_AODABS) = ZAOD_DIAG(JL,JWAVL)*(1._JPRB-ZSSA_DIAG(JL,JWAVL))! absorption ENDIF IF (YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_AODFM) THEN - PAERO_WVL_DIAG(JL,JWAVL,JPAERO_WVL_AODFM) = PFAOD(JL,JWAVL)! 0.0 + PAERO_WVL_DIAG(JL,JWAVL,JPAERO_WVL_AODFM) = 0._JPRB!PFAOD(JL,JWAVL)! 0.0 ENDIF IF (YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_SSA) THEN - PAERO_WVL_DIAG(JL,JWAVL,JPAERO_WVL_SSA) = PSSA(JL,JWAVL) + PAERO_WVL_DIAG(JL,JWAVL,JPAERO_WVL_SSA) = ZSSA_DIAG(JL,JWAVL) ENDIF IF (YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_ASSIMETRY) THEN - PAERO_WVL_DIAG(JL,JWAVL,JPAERO_WVL_ASSIMETRY) = PASY(JL,JWAVL) + PAERO_WVL_DIAG(JL,JWAVL,JPAERO_WVL_ASSIMETRY) = ZASY_DIAG(JL,JWAVL) ENDIF ENDDO ENDDO @@ -1944,49 +2056,39 @@ SUBROUTINE HAMM7_INTERFACE( & ! RCHG -> TODO explain here LIFSMIN and LIFSTRAJ --- IF(.NOT.LIFSMIN .AND. .NOT.LIFSTRAJ) THEN ! input for HAM-M7 - PGFL(KIDIA:KFDIA,1,YAEROUT(1)%MP)=PAOD(KIDIA:KFDIA,10) !PAER_TAU(KIDIA:KFDIA,1:KLEV,10) !533nm - PGFL(KIDIA:KFDIA,2,YAEROUT(1)%MP)=PSSA(KIDIA:KFDIA,10) !PAER_TAU(KIDIA:KFDIA,1:KLEV,10) !533nm - PGFL(KIDIA:KFDIA,3,YAEROUT(1)%MP)=PASY(KIDIA:KFDIA,10) !PAER_TAU(KIDIA:KFDIA,1:KLEV,10) !533nm + PGFL(KIDIA:KFDIA,1,YAEROUT(1)%MP)=PAOD(KIDIA:KFDIA,10) ! 533nm?? + PGFL(KIDIA:KFDIA,2,YAEROUT(1)%MP)=PSSA(KIDIA:KFDIA,10) ! 533nm + PGFL(KIDIA:KFDIA,3,YAEROUT(1)%MP)=PASY(KIDIA:KFDIA,10) ! 533nm - PGFL(KIDIA:KFDIA,10:25,YAEROUT(1)%MP)= PAOD_LW(KIDIA:KFDIA,1:16) + ! ASSUMPTION : YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG .LE. 7 + PGFL(KIDIA:KFDIA,4:YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG+3,YAEROUT(1)%MP)= ZAOD_DIAG(KIDIA:KFDIA,1:YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG) + PGFL(KIDIA:KFDIA,11:26,YAEROUT(1)%MP)= PAOD_LW(KIDIA:KFDIA,1:16) - ! RCHG: It seems that here 1:14 refers to 14 species. PLS: AOD of 14 short wavelengths stored in YAEROUT(12)%MP of first 14 tracers (juggling!!) + ! AOD of 14 short wavelengths stored in first 14 "levels/tracers" of YAEROUT(27)%MP PGFL(KIDIA:KFDIA,1:14,YAEROUT(27)%MP)=PAOD(KIDIA:KFDIA,1:14) - DO JN=1,NAEROCOMP !ntrac!NACTAERO + DO JN=1,NAEROCOMP PGFL(KIDIA:KFDIA,ind_oifs_ham%ind_mass_OIFS(JN),YAEROUT(2)%MP)=ZDDEPFLUX(KIDIA:KFDIA,ind_oifs_ham%IND_mass_HAM(JN)) END DO DO JN=1,NCLASS PGFL(KIDIA:KFDIA,ind_oifs_ham%ind_class_OIFS(JN),YAEROUT(2)%MP)=ZDDEPFLUX(KIDIA:KFDIA,ind_oifs_ham%IND_class_HAM(JN)) END DO - DO JN=1,NAEROCOMP !ntrac!NACTAERO + DO JN=1,NAEROCOMP PGFL(KIDIA:KFDIA,ind_oifs_ham%ind_mass_OIFS(JN),YAEROUT(4)%MP) = ZSEDIFLUXSURF(KIDIA:KFDIA,ind_oifs_ham%IND_mass_HAM(JN)) END DO DO JN=1,NCLASS PGFL(KIDIA:KFDIA,ind_oifs_ham%ind_class_OIFS(JN),YAEROUT(4)%MP) = ZSEDIFLUXSURF(KIDIA:KFDIA,ind_oifs_ham%IND_class_HAM(JN)) END DO - !do JN=1,NACTAERO !ktrac - ! if (NSTEP==10)then - ! do JL=KIDIA,KFDIA - ! write(3345,*)JN,WDEPOUT_2D(JL,KAERO(JN)) - ! end do - ! end if - !end do - - DO JN=1,NACTAERO !ktrac + DO JN=1,NACTAERO PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(3)%MP) = WDEPOUT_2D(KIDIA:KFDIA,KAERO(JN)) PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(17)%MP) = WDEPOUT_IC_2D(KIDIA:KFDIA,KAERO(JN)) PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(18)%MP) = WDEPOUT_BC_2D(KIDIA:KFDIA,KAERO(JN)) PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(5)%MP) = PAERSRC(KIDIA:KFDIA,KAERO(JN)) - PCFLX(KIDIA:KFDIA,KAERO(JN))* ZDPG(KIDIA:KFDIA,KLEV) END DO - PGFL(KIDIA:KFDIA,NACTAERO+2,YAEROUT(5)%MP) = ZBLHIDX(KIDIA:KFDIA) - PGFL(KIDIA:KFDIA,NACTAERO+3,YAEROUT(5)%MP) = PBLH(KIDIA:KFDIA) - PGFL(KIDIA:KFDIA,NACTAERO+4,YAEROUT(5)%MP) = ((PGEOH(KIDIA:KFDIA,137)-PGEOH(KIDIA:KFDIA,KLEV))*ZRG) - PGFL(KIDIA:KFDIA,NACTAERO+5,YAEROUT(5)%MP) = ((PGEOH(KIDIA:KFDIA,136)-PGEOH(KIDIA:KFDIA,KLEV))*ZRG) - PGFL(KIDIA:KFDIA,NACTAERO+6,YAEROUT(5)%MP) = ((PGEOH(KIDIA:KFDIA,135)-PGEOH(KIDIA:KFDIA,KLEV))*ZRG) - DO JN=1,NACTAERO !ktrac + + DO JN=1,NACTAERO ZTMP=0.0_JPRB DO JK=1,KLEV ZTMP(KIDIA:KFDIA)=ZTMP(KIDIA:KFDIA)+PCEN(KIDIA:KFDIA,JK,KAERO(JN)) @@ -1995,7 +2097,7 @@ SUBROUTINE HAMM7_INTERFACE( & PGFL(KIDIA:KFDIA,KAERO(JN),YGFL%YAEROUT(9)%MP)= - PCFLX(KIDIA:KFDIA,KAERO(JN))* ZDPG(KIDIA:KFDIA,KLEV) END DO - DO JN=1,NACTAERO !ktrac + DO JN=1,NACTAERO ZTMP=0.0_JPRB DO JK=1,KLEV ZTMP(KIDIA:KFDIA)=ZTMP(KIDIA:KFDIA)+ZCEN(KIDIA:KFDIA,JK,KAERO(JN)) @@ -2003,7 +2105,7 @@ SUBROUTINE HAMM7_INTERFACE( & PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(10)%MP) = ZTMP(KIDIA:KFDIA) END DO - DO JN=1,NACTAERO !ktrac + DO JN=1,NACTAERO ZTMP=0.0_JPRB DO JK=1,KLEV ZTMP(KIDIA:KFDIA)=ZTMP(KIDIA:KFDIA)+PTENC(KIDIA:KFDIA,JK,KAERO(JN)) @@ -2011,7 +2113,8 @@ SUBROUTINE HAMM7_INTERFACE( & PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(11)%MP) = ZTMP(KIDIA:KFDIA) END DO - DO JN=1,NAEROCOMP !ntrac!NACTAERO + ! mass and number concentration + DO JN=1,NAEROCOMP JO=ind_oifs_ham%ind_mass_OIFS(JN) ! JO -> index context OIFS JH=ind_oifs_ham%IND_mass_HAM(JN) ! JH -> index context HAM JY=YAEROUT(7)%MP @@ -2032,48 +2135,49 @@ SUBROUTINE HAMM7_INTERFACE( & END DO PGFL(KIDIA:KFDIA,JO,JY) = ZTMP(KIDIA:KFDIA) END DO - - ! save load for each N/M as one level - ! kg/kg -> kg/m2 N/kg-> N/m2 - DO JN=1,NAEROCOMP !ntrac!NACTAERO - JO=ind_oifs_ham%ind_mass_OIFS(JN) ! JO -> index context OIFS - JH=ind_oifs_ham%IND_mass_HAM(JN) ! JH -> index context HAM - JY=YAEROUT(8)%MP - ZTMP=0.0_JPRB - DO JK=1,KLEV - ZTMP(KIDIA:KFDIA) = ZTMP(KIDIA:KFDIA) + ZXTTE(KIDIA:KFDIA,JK,JH) - END DO - PGFL(KIDIA:KFDIA,JO,JY) = ZTMP(KIDIA:KFDIA) + + ! mass and number tendency + ! kg/kg -> kg/m2 N/kg-> N/m2 + DO JN=1,NAEROCOMP !ntrac!NACTAERO + JO=ind_oifs_ham%ind_mass_OIFS(JN) ! JO -> index context OIFS + JH=ind_oifs_ham%IND_mass_HAM(JN) ! JH -> index context HAM + JY=YAEROUT(8)%MP + ZTMP=0.0_JPRB + DO JK=1,KLEV + ZTMP(KIDIA:KFDIA) = ZTMP(KIDIA:KFDIA) + ZXTTE(KIDIA:KFDIA,JK,JH) END DO + PGFL(KIDIA:KFDIA,JO,JY) = ZTMP(KIDIA:KFDIA) + END DO - DO JN=1,NCLASS - JO=ind_oifs_ham%ind_class_OIFS(JN) ! JO -> index context OIFS - JH=ind_oifs_ham%IND_class_HAM(JN) ! JH -> index context HAM - JY=YAEROUT(8)%MP - ZTMP=0.0_JPRB - DO JK=1,KLEV - ZTMP(KIDIA:KFDIA) = ZTMP(KIDIA:KFDIA) + ZXTTE(KIDIA:KFDIA,JK,JH) - END DO - PGFL(KIDIA:KFDIA,JO,JY) = ZTMP(KIDIA:KFDIA) + DO JN=1,NCLASS + JO=ind_oifs_ham%ind_class_OIFS(JN) ! JO -> index context OIFS + JH=ind_oifs_ham%IND_class_HAM(JN) ! JH -> index context HAM + JY=YAEROUT(8)%MP + ZTMP=0.0_JPRB + DO JK=1,KLEV + ZTMP(KIDIA:KFDIA) = ZTMP(KIDIA:KFDIA) + ZXTTE(KIDIA:KFDIA,JK,JH) END DO + PGFL(KIDIA:KFDIA,JO,JY) = ZTMP(KIDIA:KFDIA) + END DO - DO JN=1,NAEROCOMP !ntrac!NACTAERO - JO=ind_oifs_ham%ind_mass_OIFS(JN) ! JO -> index context OIFS - JH=ind_oifs_ham%IND_mass_HAM(JN) ! JH -> index context HAM - JY=YAEROUT(12)%MP - ZTMP=0.0_JPRB - ZTMP(KIDIA:KFDIA)= ZXTM1(KIDIA:KFDIA,KLEV,JH)+(ZXTTE(KIDIA:KFDIA,KLEV,JH)*TIME_STEP_LEN)!*ZDPG(KIDIA:KFDIA,KLEV) - PGFL(KIDIA:KFDIA,JO,JY) = ZTMP(KIDIA:KFDIA) - END DO + ! mass and number mixing ratio at surface + DO JN=1,NAEROCOMP !ntrac!NACTAERO + JO=ind_oifs_ham%ind_mass_OIFS(JN) ! JO -> index context OIFS + JH=ind_oifs_ham%IND_mass_HAM(JN) ! JH -> index context HAM + JY=YAEROUT(12)%MP + ZTMP=0.0_JPRB + ZTMP(KIDIA:KFDIA)= ZXTM1(KIDIA:KFDIA,KLEV,JH)+(ZXTTE(KIDIA:KFDIA,KLEV,JH)*TIME_STEP_LEN)!*ZDPG(KIDIA:KFDIA,KLEV) + PGFL(KIDIA:KFDIA,JO,JY) = ZTMP(KIDIA:KFDIA) + END DO - DO JN=1,NCLASS - JO=ind_oifs_ham%ind_class_OIFS(JN) ! JO -> index context OIFS - JH=ind_oifs_ham%IND_class_HAM(JN) ! JH -> index context HAM - JY=YAEROUT(12)%MP - ZTMP=0.0_JPRB - ZTMP(KIDIA:KFDIA) = ZXTM1(KIDIA:KFDIA,KLEV,JH)+(ZXTTE(KIDIA:KFDIA,KLEV,JH)*TIME_STEP_LEN)!*PRHO(KIDIA:KFDIA,KLEV) - PGFL(KIDIA:KFDIA,JO,JY) = ZTMP(KIDIA:KFDIA) - END DO + DO JN=1,NCLASS + JO=ind_oifs_ham%ind_class_OIFS(JN) ! JO -> index context OIFS + JH=ind_oifs_ham%IND_class_HAM(JN) ! JH -> index context HAM + JY=YAEROUT(12)%MP + ZTMP=0.0_JPRB + ZTMP(KIDIA:KFDIA) = ZXTM1(KIDIA:KFDIA,KLEV,JH)+(ZXTTE(KIDIA:KFDIA,KLEV,JH)*TIME_STEP_LEN)!*PRHO(KIDIA:KFDIA,KLEV) + PGFL(KIDIA:KFDIA,JO,JY) = ZTMP(KIDIA:KFDIA) + END DO PGFL(KIDIA:KFDIA,KLEV,YAEROUT(19)%MP) = ZXTTE(KIDIA:KFDIA,KLEV,3) ! tendency SS CS ham after update surface PGFL(KIDIA:KFDIA,KLEV-1,YAEROUT(20)%MP) = ZTENCIH(KIDIA:KFDIA,KLEV,17) ! tendency SS CS ham before update surface From 57ded0d930fc539fd8ba14858f0f3ab17c27d7e5 Mon Sep 17 00:00:00 2001 From: Lianghai Wu Date: Wed, 12 Feb 2025 12:26:01 +0000 Subject: [PATCH 062/129] Fix lwc unit and rain formation rates (OIFS-590 OIFS-591) --- .../arpifs/m7/phys_ec/hamm7_interface.F90 | 35 +++++++++++-------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index 09863036..f91758e5 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -1373,11 +1373,13 @@ SUBROUTINE HAMM7_INTERFACE( & ZFLXS=PFPLCN(JL,JK-1) ZFLXRB=PFPLCL(JL,JK) ZFLXSB=PFPLCN(JL,JK) - !same formula negatives/positives for evap or formation - ZMRATEPR_cov(JL,JK) = ZFLXRB-ZFLXR - ZMRATEPS_cov(JL,JK) = ZFLXSB-ZFLXS - ZFEVAPR_cov(JL,JK) = ZFLXRB-ZFLXR - ZFSUBLS_cov(JL,JK) = ZFLXSB-ZFLXS + ZMRATEPR_cov(JL,JK) = MAX(ZFLXRB-ZFLXR,1.E-10_JPRB)/ZDPG(JL,JK) ! [kg/kg/s] + ZMRATEPS_cov(JL,JK) = MAX(ZFLXSB-ZFLXS,1.E-10_JPRB)/ZDPG(JL,JK) ! [kg/kg/s] + ZMRATEPR_cov(JL,JK) = ZMRATEPR_cov(JL,JK) * TIME_STEP_LEN ! time integrated + ZMRATEPS_cov(JL,JK) = ZMRATEPS_cov(JL,JK) * TIME_STEP_LEN ! time integrated + !same formula negatives/positives for evap or formation + ZFEVAPR_cov(JL,JK) = -1._JPRB*MIN(ZFLXRB-ZFLXR,0._JPRB) ! [kg/m2.s] + ZFSUBLS_cov(JL,JK) = -1._JPRB*MIN(ZFLXSB-ZFLXS,0._JPRB) ! [kg/m2.s] END DO END DO @@ -1387,23 +1389,26 @@ SUBROUTINE HAMM7_INTERFACE( & ZFLXS=PFPLSN(JL,JK-1) ZFLXRB=PFPLSL(JL,JK) ZFLXSB=PFPLSN(JL,JK) - !same formula negatives/positives for evap or formation - ZMRATEPR_str(JL,JK) = ZFLXRB-ZFLXR - ZMRATEPS_str(JL,JK) = ZFLXSB-ZFLXS - ZFEVAPR_str(JL,JK) = ZFLXRB-ZFLXR - ZFSUBLS_str(JL,JK) = ZFLXSB-ZFLXS + ZMRATEPR_str(JL,JK) = MAX(ZFLXRB-ZFLXR,1.E-10_JPRB)/ZDPG(JL,JK) ! [kg/kg/s] + ZMRATEPS_str(JL,JK) = MAX(ZFLXSB-ZFLXS,1.E-10_JPRB)/ZDPG(JL,JK) ! [kg/kg/s] + ZMRATEPR_str(JL,JK) = ZMRATEPR_str(JL,JK) * TIME_STEP_LEN ! time integrated + ZMRATEPS_str(JL,JK) = ZMRATEPS_str(JL,JK) * TIME_STEP_LEN ! time integrated + !same formula negatives/positives for evap or formation + ZFEVAPR_str(JL,JK) = -1._JPRB*MIN(ZFLXRB-ZFLXR,0._JPRB) ! [kg/m2.s] + ZFSUBLS_str(JL,JK) = -1._JPRB*MIN(ZFLXSB-ZFLXS,0._JPRB) ! [kg/m2.s] END DO END DO - ZMSNOWACL(KIDIA:KFDIA,1:KLEV) = ZMRATEPS_str(KIDIA:KFDIA,1:KLEV) !? + !ZMSNOWACL(KIDIA:KFDIA,1:KLEV) = ZMRATEPS_str(KIDIA:KFDIA,1:KLEV) !? + ZMSNOWACL(KIDIA:KFDIA,1:KLEV) = PSP(KIDIA:KFDIA,1:KLEV) !? ZLFRAC_SO2(KIDIA:KFDIA,:) = 0._JPRB ! zlfrac_so2 only needed in gas scavenging and this is off for now (put this zero) - ZIPDUM(KIDIA:KFDIA,1:KLEV) = 0._JPRB ! temporary variable for cloud ice water content (modified in wetdep) - ZLP(KIDIA:KFDIA,1:KLEV) = PLP(KIDIA:KFDIA,1:KLEV) ! temporary variable for cloud water content (modified in wetdep) ZIP(KIDIA:KFDIA,1:KLEV) = PIP(KIDIA:KFDIA,1:KLEV) ! temporary variable for cloud ice water content (modified in wetdep) + ZIPDUM(KIDIA:KFDIA,1:KLEV) = 0._JPRB ! temporary variable for cloud ice water content (modified in wetdep) + ZLPU(KIDIA:KFDIA,1:KLEV) = PLU(KIDIA:KFDIA,1:KLEV) ! temporary variable for cloud water content (modified in wetdep) IF (.NOT.LAERCHEM)THEN CALL HAM_CONV_LFRAQ_SO2(KFDIA,KLON,KLEV,PTP,ZXTM1,ZRHO,ZLP,ZLFRAC_SO2) @@ -1434,7 +1439,7 @@ SUBROUTINE HAMM7_INTERFACE( & CALL XT_CONV_MASSFIX(KFDIA, KLON, KLEV, KLEV+1, NTRAC, ZKROW, PRSF1, PRS1, ZXTTE, .TRUE., ZDUMMY) ! call convective mass conserving (init zxtte_old) CALL WETDEP_INTERFACE(KFDIA, KLON, KLEV, 1, ZKROW, LSTRAT, & ! ktop = 1 (top level index), lstrat = FALSE for conv. case - ZDPG, PRP, PSP, ZMSNOWACL, & ! dp/g, evap. of rain, subl. of snow, accr. rate of snow with cl. drop in-cl. + ZDPG, ZMRATEPR_COV, ZMRATEPS_COV, ZMSNOWACL, & ! dp/g, evap. of rain, subl. of snow, accr. rate of snow with cl. drop in-cl. ZLPU, ZIP, & ! cloud water content, cloud ice water content ZM6RP, ZM6DRY, & ! m7 aerosol: to replace rwet_m7, dry radius for soluble modes [cm] REFFI, REFFL, & ! effective radii @@ -1482,7 +1487,7 @@ SUBROUTINE HAMM7_INTERFACE( & LSTRAT = .TRUE. !True for strat case, large scale CALL WETDEP_INTERFACE(KFDIA, KLON, KLEV, 1, ZKROW, LSTRAT, & ! ktop = 1 (top level index), lstrat = TRUE for strat. case - ZDPG, PRP, PSP, ZMSNOWACL, & ! dp/g, evap. of rain, subl. of snow, accr. rate of snow with cl. drop in-cl. + ZDPG, ZMRATEPR_STR, ZMRATEPS_STR, ZMSNOWACL, & ! dp/g, evap. of rain, subl. of snow, accr. rate of snow with cl. drop in-cl. ZLP, ZIP, & ! cloud water content, cloud ice water content ZM6RP, ZM6DRY, & ! m7 aerosol: to replace rwet_m7, dry radius for soluble modes [cm] REFFI, REFFL, & ! effective radii From 812bf0d868b1532205625ca21cad3cf948203793 Mon Sep 17 00:00:00 2001 From: Lianghai Wu Date: Tue, 21 Jan 2025 08:24:39 +0000 Subject: [PATCH 063/129] OIFS-574 Add simplified sulfur scheme as a chemistry scheme (M7 only) --- ifs-source/arpifs/chem/chem_init.F90 | 4 + ifs-source/arpifs/chem/chem_main.F90 | 79 +++++- ifs-source/arpifs/control/cnt4.F90 | 3 +- ifs-source/arpifs/m7/hamm7_init.F90 | 20 +- .../arpifs/m7/phys_ec/hamm7_interface.F90 | 252 ++++++++---------- ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 | 60 ++--- ifs-source/arpifs/phys_ec/aerini_layer.F90 | 42 ++- 7 files changed, 268 insertions(+), 192 deletions(-) diff --git a/ifs-source/arpifs/chem/chem_init.F90 b/ifs-source/arpifs/chem/chem_init.F90 index 0591de77..2a6d819f 100644 --- a/ifs-source/arpifs/chem/chem_init.F90 +++ b/ifs-source/arpifs/chem/chem_init.F90 @@ -159,6 +159,10 @@ SUBROUTINE CHEM_INIT(YDGEOMETRY,YDML_GCONF,YDDYNA,YDML_CHEM) CALL ARPCLIM_CHEM_INI(YDGEOMETRY,YGFL,YDCHEM) + CASE ("SimChem") + + WRITE(*,*)"SimChem:what need to be initialize here? Lianghai" + CASE DEFAULT CALL ABOR1(" NO KNOWN CHEMISTRY SCHEME "//TRIM(CHEM_SCHEME) ) diff --git a/ifs-source/arpifs/chem/chem_main.F90 b/ifs-source/arpifs/chem/chem_main.F90 index e0f201a2..070d719a 100644 --- a/ifs-source/arpifs/chem/chem_main.F90 +++ b/ifs-source/arpifs/chem/chem_main.F90 @@ -223,8 +223,10 @@ SUBROUTINE CHEM_MAIN & INTEGER(KIND=JPIM) :: JK, JL, JT, INO, IN2O, IJOUT, IPOS, ILI, IICH4, IIHNO3 INTEGER(KIND=JPIM) :: ICO,IGHGCH4,FCO2,FCO2NOBIO,FCO2NOFLX INTEGER(KIND=JPIM) :: IPCH4, ISAD +INTEGER(KIND=JPIM) :: ISSO2, ISSO4, ISSO4_ACS ! SimChem + REAL(KIND=JPRB) :: ZDELP(KLON,KLEV) -REAL(KIND=JPHOOK) :: ZHOOK_HANDLE +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE REAL(KIND=JPRB) :: ZCON(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NCHEM) REAL(KIND=JPRB) :: ZTENC0(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NCHEM) REAL(KIND=JPRB) :: ZTENC1(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NCHEM) @@ -256,6 +258,8 @@ SUBROUTINE CHEM_MAIN & REAL(KIND=JPRB) :: ZEMIS(KLON,KLEV,3) ! 3 especes emises par l'aviation, parametrisation à implementer REAL(KIND=JPRB) :: ZAREAD_NAT(KLON,KLEV),ZAREAD_ICE(KLON,KLEV),ZAREAD_SUL(KLON,KLEV) REAL(KIND=JPRB) :: ZSO4_LPROD(KLON,KLEV) +REAL(KIND=JPRB) :: ZTSO2(KLON,KLEV), ZTSO4(KLON,KLEV), ZTSO4_AQ(KLON,KLEV), ZITSO2(KLON,KLEV) +REAL(KIND=JPRB) :: ZSO2(KLON,KLEV), ZFSO2(KLON,KLEV), ZFSO4_AQ(KLON,KLEV), ZFSO4(KLON,KLEV) LOGICAL :: LLCHECK_METEO, LLTENDUPDT !------------------------------------------------------------------------ !------------------------------------------------------------------------ @@ -274,15 +278,11 @@ SUBROUTINE CHEM_MAIN & #include "troplev.intfb.h" #include "chem_rnpb.intfb.h" #include "chem_nwpo3.intfb.h" - - - - - +#include "aer_so2so4_v2.intfb.h" IF (LHOOK) CALL DR_HOOK('CHEM_MAIN',0,ZHOOK_HANDLE) -ASSOCIATE(YGFL=>YDMODEL%YRML_GCONF%YGFL,YDCHEM=>YDMODEL%YRML_CHEM%YRCHEM,YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO) +ASSOCIATE(YGFL=>YDMODEL%YRML_GCONF%YGFL,YDRIP=>YDMODEL%YRML_GCONF%YRRIP,YDCHEM=>YDMODEL%YRML_CHEM%YRCHEM,YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO) ASSOCIATE(NACTAERO=>YGFL%NACTAERO, NCHEM=>YGFL%NCHEM, NCHEM_DV=>YGFL%NCHEM_DV, & & NCHEM_SCV=>YGFL%NCHEM_SCV, NDIM=>YGFL%NDIM, NDIM1=>YGFL%NDIM1, NGFL_EXT=>YGFL%NGFL_EXT, & & YCHEM=>YGFL%YCHEM, YGHG=>YGFL%YGHG, NGHG=>YGFL%NGHG, YEXT=>YGFL%YEXT, YLRCH4=>YGFL%YLRCH4,& @@ -650,7 +650,7 @@ SUBROUTINE CHEM_MAIN & PCHEM2AER(KIDIA:KFDIA,1:KLEV,6) = ZSOGTOSOA(KIDIA:KFDIA,1:KLEV,2) ENDIF - IICH4=ICH4_TM5 + IICH4=ICH4_TM5 ! Diagnostics in 3d extra fields IF (LCHEM_DIA) THEN ! chemistry tendencies @@ -816,6 +816,67 @@ SUBROUTINE CHEM_MAIN & CALL CHEM_INEXT( KIDIA , KFDIA , KLON , KLEV , NCHEM, & & KLEVX,ZDELP,PTSTEP,ZTENC1,ZTENC0,PEXTRA(:,:, IEXTR_CH)) ENDIF + + ! Simplified sulfur scheme, implemented for coupling with M7 aerosol scheme + CASE ("SimChem") + + ISSO2=ISO2_TM5! need to be checked, Lianghai + ISSO4=ISO4_TM5 + ISSO4_ACS=5! index in YAERO OIFS + ! for test only, not checked yet + + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + !ZTSO2(JL,JK) = PTENC(JL,JK,ISSO2) + !ZTSO4(JL,JK) = PTENC(JL,JK,ISSO4) + !ZTSO4_AQ(JL,JK) = PTENC(JL,JK,ISSO4_ACS)! liquid phase + !ZSO2(JL,JK) = PAEROP(JL,JK,ISSO2) + ZSO2(JL,JK) = ZCON(JL,JK,ISSO2)! SO2 concentration + + ZITSO2(JL,JK) = ZTENC0(JL,JK,ISSO2)! SO2 tendecny at previous time step + END DO + END DO + + CALL AER_SO2SO4_V2( YDRIP, & + & KIDIA , KFDIA , KLON , KLEV , & + & PTSTEP, PTP , PRSF1 , PAP , PLP , PGELAT, PGELAM, & + & ZSO2 , ZITSO2, & + & PGFL(:,:, YGFL%YAEROCLIM(1)%MP), & + & PGFL(:,:,YGFL%YAEROCLIM(2)%MP), & + & PGFL(:,:,YGFL%YAEROCLIM(3)%MP) , & + & ZTSO2 , ZTSO4(:,:), ZTSO4_AQ, ZFSO2, ZFSO4, ZFSO4_AQ, ZDELP) + + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ! ZTSO2 + !PTENC(JL,JK,ISSO2) = PTENC(JL,JK,ISSO2)+ZTSO2(JL,JK) + ZTENC1(JL,JK,ISSO2) = ZTENC1(JL,JK,ISSO2)+ZTSO2(JL,JK) + !! ZTSO4 + !PTENC(JL,JK,ISSO4)=PTENC(JL,JK,ISSO4)+ZTSO4(JL,Jk) + !! SO4 formed in clouds is applied to Accumulati + !PTENC(JL,JK,ISSO4_ACS)=PTENC(JL,JK,ISSO4_ACS)+ZTSO4_AQ(JL,JK) + PCHEM2AER(JL,JK,1) = ZTSO4(JL,Jk) + PCHEM2AER(JL,JK,2) = ZTSO4_AQ(JL,JK) + + END DO + END DO + + ! output for aerosol scheme + !IF (NACTAERO > 0 .AND. LAERCHEM) THEN + + ! PCHEM2AER(KIDIA:KFDIA,1:KLEV,1) = ZTENC1(KIDIA:KFDIA,1:KLEV,ISO4_TM5) -ZTENC0(KIDIA:KFDIA,1:KLEV,ISO4_TM5) + ! ZTENC1(KIDIA:KFDIA,1:KLEV,ISO4_TM5) = ZTENC0(KIDIA:KFDIA,1:KLEV,ISO4_TM5) + ! + ! SELECT CASE (TRIM(AERO_SCHEME)) + ! CASE ("aer") + ! PCHEM2AER(KIDIA:KFDIA,1:KLEV,2) = -1.0_JPRB*ZBUDR(KIDIA:KFDIA,1:KLEV,ISO2_TM5) + ! PCHEM2AER(KIDIA:KFDIA,1:KLEV,3) = ZTENC1(KIDIA:KFDIA,1:KLEV,ISO2_TM5) - ZTENC0(KIDIA:KFDIA,1:KLEV,ISO2_TM5) + + ! CASE ("hamm7") + ! PCHEM2AER(KIDIA:KFDIA,1:KLEV,2) = ZSO4_LPROD(KIDIA:KFDIA,1:KLEV) + ! END SELECT + !ENDIF + CASE DEFAULT CALL ABOR1(" NO CHEMISTRY SCHEME "//TRIM(CHEM_SCHEME) ) @@ -824,7 +885,7 @@ SUBROUTINE CHEM_MAIN & IF (LLTENDUPDT ) THEN DO JT=1,NCHEM - ! WRITE(NULOUT,*) ' Species ', JT , YCHEM(JT)%CNAME, + ! WRITE(NULOUT,*) ' Species ', JT , YCHEM(JT)%CNAME, ! loop over levels DO JK=1,KLEV ! loop over points diff --git a/ifs-source/arpifs/control/cnt4.F90 b/ifs-source/arpifs/control/cnt4.F90 index 2eccef5a..94367a65 100644 --- a/ifs-source/arpifs/control/cnt4.F90 +++ b/ifs-source/arpifs/control/cnt4.F90 @@ -512,7 +512,8 @@ SUBROUTINE CNT4(YDGEOMETRY,YDFIELDS,YDMTRAJ,YDMODEL,YDJOT,YDVARBC,YDTCV,YDGOM5,Y ! all other processes are dealt with in TM5-M7 ! therefore we also have to initialize TM5-M7 CALL TM5M7_INIT(YDGEOMETRY, YDMODEL%YRML_CHEM%YRCOMPO, YGFL, YDMODEL%YRML_PHY_RAD%YRERAD) - CALL HAMM7_INIT(YGFL, YDRIP) !requires stuff which is defined in TM5M7_INIT + CALL HAMM7_INIT(YGFL, YDRIP, YDMODEL%YRML_CHEM%YRCHEM%CHEM_SCHEME) !requires stuff which is defined in TM5M7_INIT + CASE DEFAULT ! Option not implemented CALL ABOR1(" NO AEROSOL SCHEME "//TRIM(AERO_SCHEME)) diff --git a/ifs-source/arpifs/m7/hamm7_init.F90 b/ifs-source/arpifs/m7/hamm7_init.F90 index e18df563..91e7bea9 100644 --- a/ifs-source/arpifs/m7/hamm7_init.F90 +++ b/ifs-source/arpifs/m7/hamm7_init.F90 @@ -1,4 +1,4 @@ -SUBROUTINE hamm7_init(YGFL, YRRIP) +SUBROUTINE hamm7_init(YGFL, YRRIP, CHEM_SCHEME) ! ╭────────────────────────────────────────────────────────────────────────────╮ ! │ (updated 14-MAY-2024) │ @@ -118,6 +118,7 @@ SUBROUTINE hamm7_init(YGFL, YRRIP) IMPLICIT NONE TYPE(TYPE_GFLD), INTENT(IN) :: YGFL TYPE(TRIP), INTENT(IN) :: YRRIP +CHARACTER(len=20), INTENT(IN) :: CHEM_SCHEME !---------------------------------------------------------------------- !* 0.5 LOCAL VARIABLES @@ -336,7 +337,7 @@ SUBROUTINE hamm7_init(YGFL, YRRIP) ! chemistry tracers in HAM do not have separate metadata, because there is only one ! tracer per species. Therefore we have to check the HAM species metadata and ! make sure that the metadata actually describes a gas. -IF (LAERCHEM)THEN +IF (LAERCHEM.AND.TRIM(CHEM_SCHEME)=="tm5")THEN LABEL_IFS_CHEM: DO j_ychem = 1,NCHEM ! looping over the gas phase tracers in HAM @@ -405,7 +406,7 @@ SUBROUTINE hamm7_init(YGFL, YRRIP) WRITE(2000+MYPROC,'(a)') 'not a gas in HAM: '//TRIM(YCHEM(j_ychem)%CNAME) END IF END DO LABEL_IFS_CHEM -ELSE +ELSE IF (LAERCHEM.AND.TRIM(CHEM_SCHEME)=="SimChem") THEN Write(9191,*)'simple SO4 in development' LABEL_IFS_CHEM_SO4: DO j_ychem = 1,NAERO @@ -442,7 +443,13 @@ SUBROUTINE hamm7_init(YGFL, YRRIP) ! sulfuric acid is special, because in HAM it is tagges as H2SO4, while in IFS it ! is called SO4 -- hard-coding for now - IF ( (TRIM(YAERO(j_ychem)%CNAME) == 'SO4_gas') .AND. (TRIM(speclist(j_spec)%shortname) == 'H2SO4') ) THEN + !IF ( (TRIM(YAERO(j_ychem)%CNAME) == 'SO4_gas') .AND. (TRIM(speclist(j_spec)%shortname) == 'H2SO4') ) THEN + !WRITE(*,*)"j_spec:",j_spec + !WRITE(*,*)"j_ychem:",j_ychem + !WRITE(*,*)"YAERO(j_ychem)%CNAME:",YAERO(j_ychem)%CNAME + !WRITE(*,*)"speclist(j_spec)%shortname:",speclist(j_spec)%shortname + !IF ( (TRIM(YAERO(j_ychem)%CNAME) == 'SO4_gas') .AND. (TRIM(speclist(j_spec)%shortname) == 'H2SO4') ) THEN + IF ( (TRIM(YAERO(j_ychem)%CNAME) == 'SO4') .AND. (TRIM(speclist(j_spec)%shortname) == 'H2SO4') ) THEN ! In case of a match, we set the tracer index in the HAM meta data to the ! according IFS-index and write a note into the logfile kt = speclist(j_spec)%idt @@ -471,6 +478,11 @@ SUBROUTINE hamm7_init(YGFL, YRRIP) IF (MYPROC == 1) THEN WRITE(2000+MYPROC,'(a)') 'not a gas in HAM: '//TRIM(YCHEM(j_ychem)%CNAME) END IF + + ELSE + ! Note that We are also checking that LAERCHEM should always be true with M7 (and could probably be ignored: it was used to indicate that chem_scheme='tm5'). Redundant... + + CALL ABOR1(" hamm7_init: UNCOUPLED CHEMISTRY SCHEME "//TRIM(CHEM_SCHEME) ) END IF IF (MYPROC == 1) THEN diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index f91758e5..38e2f367 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -266,8 +266,6 @@ SUBROUTINE HAMM7_INTERFACE( & !REAL(KIND=JPRB), INTENT(INOUT) :: PFSO2(KLON) , PFSO4(KLON), PFSO4_AQ(KLON) !REAL(KIND=JPRB), INTENT(INOUT) :: PTSO2(KLON, KLEV) , PTSO4(KLON, KLEV), PTSO4_AQ(KLON, KLEV) -!REAL(KIND=JPRB), INTENT(INOUT) :: ZFSO2(KLON), ZFSO4(KLON), ZFSO4_AQ(KLON) -!REAL(KIND=JPRB), INTENT(INOUT) :: ZTSO2(KLON, KLEV), ZTSO4(KLON, KLEV), ZTSO4_AQ(KLON, KLEV) !* 0.5 LOCAL VARIABLES ! --------------- @@ -301,7 +299,7 @@ SUBROUTINE HAMM7_INTERFACE( & REAL(KIND=JPRB) :: ZRHOP(KLON,KLEV,NMOD) REAL(KIND=JPRB) :: ZSVOC(KLON,KLEV) REAL(KIND=JPRB) :: ZELVOC(KLON,KLEV) -REAL(KIND=JPRB) :: ZSO4G(KLON,KLEV) +!THIS-IS-NEVER-USED REAL(KIND=JPRB) :: ZSO4G(KLON,KLEV) REAL(KIND=JPRB) :: ZCEN(KLON,KLEV,KTRAC) ! local tracer number and mixing ratios and gas concentrations for not tendency updated values REAL(KIND=JPRB) :: PODTO469(KLON), PODTO670(KLON), PODTO865(KLON), PODTO1240(KLON) REAL(KIND=JPRB) :: ZAER_TAU(KLON,KLEV,14,1), ZAER_SSA(KLON,KLEV,14),ZAER_ASYM(KLON,KLEV,14),ZAER_TAU_LW(KLON,KLEV,16) @@ -556,7 +554,8 @@ SUBROUTINE HAMM7_INTERFACE( & & LAERCHEM => YGFL%LAERCHEM, & ! --- YRCOMPO --------------------------------------------- & LCHEM_DIA => YRCOMPO%LCHEM_DIA, & - & AERO_SCHEME => YRCOMPO%AERO_SCHEME, & !CHEM_SCHEME=>YDCHEM%CHEM_SCHEME,& + & AERO_SCHEME => YRCOMPO%AERO_SCHEME, & + & CHEM_SCHEME => YDCHEM%CHEM_SCHEME, & & LAERNITRATE => YRCOMPO%LAERNITRATE, & & NSO4SCHEME => YREAERSRC%NSO4SCHEME, & ! --- YREAERATM ------------------------------------------- @@ -701,8 +700,8 @@ SUBROUTINE HAMM7_INTERFACE( & ENDDO ENDDO -IF(LAERCHEM) then - DO JEXT=1,NCHEM +!NOT-AN-OPTION-WITH-M7 IF(LAERCHEM) then +DO JEXT=1,NCHEM ITRC=ITRC+1 DO JK=1,KLEV DO JL=KIDIA,KFDIA @@ -710,8 +709,8 @@ SUBROUTINE HAMM7_INTERFACE( & ENDDO ENDDO ENDDO -ENDIF - +!NOT-AN-OPTION-WITH-M7 ENDIF + !DO JAER=1,NACTAERO ! DO JK=1,KLEV ! DO JL=KIDIA,KFDIA @@ -753,81 +752,28 @@ SUBROUTINE HAMM7_INTERFACE( & ZTENC0(KIDIA:KFDIA,1:KLEV, :) = 0._JPRB ENDIF -! RCHG -> I would move this block to a subroutine (here after a "contains") -!* 0.2 Preliminary computation -!* GAS-TO-PARTICLE CONVERSION (SO2 -> SO4) -!* (SO2 -> SO4) - -IF(.NOT. LAERCHEM) THEN - - DO JGAS=1,2 - IF (TRIM(YAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))%CNAME)=='SO2') THEN - ISSO2=ind_oifs_ham%ind_gas_OIFS(JGAS) - ELSE IF (TRIM(YAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))%CNAME)=='SO4_gas')THEN - ISSO4=ind_oifs_ham%ind_gas_OIFS(JGAS) - ELSE - CALL ABOR1('HAMM7_INTERFACE: SO2 not defined. Wrong table in use') - END IF - END DO - - DO JAER=1,NACTAERO - IF (TRIM(YAERO(JAER)%CNAME)=='SO4_AS') THEN - ISSO4_ACS=JAER - END IF - END DO - - DO JK=1,KLEV - DO JL=KIDIA,KFDIA - ZTSO2(JL,JK) = PTENC(JL,JK,ISSO2) - ZTSO4(JL,JK, 1) = PTENC(JL,JK,ISSO4) - ZTSO4_AQ(JL,JK) = 0.0_JPRB - ZSO2(JL,JK) = PAEROP(JL,JK,ISSO2) - ZITSO2(JL,JK) = PTENC(JL,JK,ISSO2) - END DO - END DO - - ! FIXME - check on NSO4SCHEME (should be 2)? - - !CALL AER_SO2SO4_V2 ( & - ! KIDIA, KFDIA, KLON, KLEV, & - ! ! TSPHY, STATE%T, PAUX%PRSF1 , PRAD%PNEB, PRAD%PQLI, PAUX%PGELAM,& - ! ! take the liquidwater and cloud fraction from state variables i - ! ! instead of radiation data structures, in 43r3 PRAD% are zero - ! ! between radiation time steps - ! TSPHY, STATE%T, PAUX%PRSF1 , STATE%A, STATE%CLD(:,:,NCLDQL), PAUX%PGELAM,& - ! ZSO2, ZITSO2, PGFL(:,:,YAERCLIM(1)%MP),& - ! PGFL(:,:,YAERCLIM(2)%MP), PGFL(:,:,YAERCLIM(3)%MP) ,& - ! ZTSO2 , ZTSO4, ZTSO4_AQ, ZFSO2, ZFSO4, ZFSO4_AQ, ZDP ) - - CALL AER_SO2SO4_V2( YDRIP, & - & KIDIA , KFDIA , KLON , KLEV , & - & PTSPHY, PTP , PRSF1 , PAP , PLP , PGELAT, PGELAM, & - & ZSO2 , ZITSO2, & - & PGFL(:,:, YGFL%YAEROCLIM(1)%MP), & - & PGFL(:,:,YGFL%YAEROCLIM(2)%MP), & - & PGFL(:,:,YGFL%YAEROCLIM(3)%MP) , & - & ZTSO2 , ZTSO4(:,:,1), ZTSO4_AQ, ZFSO2, ZFSO4, ZFSO4_AQ, ZDP) - - DO JK=1,KLEV - DO JL=KIDIA,KFDIA - ! ZTSO2 - PTENC(JL,JK,ISSO2)=PTENC(JL,JK,ISSO2)+ZTSO2(JL,JK) - ! ZTSO4 - PTENC(JL,JK,ISSO4)=PTENC(JL,JK,ISSO4)+ZTSO4(JL,JK,1) - ! SO4 formed in clouds is applied to Accumulati - PTENC(JL,JK,ISSO4_ACS)=PTENC(JL,JK,ISSO4_ACS)+ZTSO4_AQ(JL,JK) - - ZCHEM2AER(JL,JK,1)=ZTSO4(JL,JK,1) - ZCHEM2AER(JL,JK,2)=ZTSO4_AQ(JL,JK) - - END DO - END DO - -ENDIF -!end of * (SO2 -> SO4) - +!* 0.2 GAS-TO-PARTICLE CONVERSION (SO2 -> SO4) +! --------------------------------------- + +! IF(TRIM(CHEM_SCHEME)=="SimChem") THEN +! DO JGAS=1,2 +! IF (TRIM(YAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))%CNAME)=='SO2') THEN +! ISSO2 = ind_oifs_ham%ind_gas_OIFS(JGAS) +! ELSE IF (TRIM(YAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))%CNAME)=='SO4_gas')THEN +! ISSO4 = ind_oifs_ham%ind_gas_OIFS(JGAS) +! ELSE +! CALL ABOR1('HAMM7_INTERFACE: SO2 not defined. Wrong table in use') +! END IF +! END DO + +! DO JAER=1,NACTAERO +! IF (TRIM(YAERO(JAER)%CNAME)=='SO4_AS') THEN +! ISSO4_ACS=JAER +! EXIT +! END IF +! END DO +! ENDIF -!RCHG -> I would move this to a second subroutine (again after "CONTAINS") ! !* 1.1 COMPUTE RELATIVE HUMIDITY WITHOUT VERTICAL SMOOTING ! --------------------------------------------------- @@ -863,30 +809,36 @@ SUBROUTINE HAMM7_INTERFACE( & ENDDO ENDDO -! TB apparently unnecessary in current implementation, but ISSO4_C still needed for chem_inext in the code. -! needs to be reviewed if it can be removed. -IF(LAERCHEM .AND. NCHEM>0) THEN - DO JT=1,NCHEM - IF(TRIM(YCHEM(JT)%CNAME)== 'SO4' ) THEN - ISSO4_C=KCHEM(JT) - ISO4_C=JT - ENDIF - ENDDO - ZSO4G(KIDIA:KFDIA,1:KLEV)=ZCEN(KIDIA:KFDIA,1:KLEV,ISSO4_C) -ELSE - ZSO4G(KIDIA:KFDIA,1:KLEV)=0._JPRB -ENDIF +!THIS-IS-NEVER-USED ! TB apparently unnecessary in current implementation, but ISSO4_C still needed for chem_inext in the code. +!THIS-IS-NEVER-USED ! needs to be reviewed if it can be removed. +!THIS-IS-NEVER-USED IF(LAERCHEM .AND. NCHEM>0 .AND. TRIM(CHEM_SCHEME)=="tm5") THEN +!THIS-IS-NEVER-USED DO JT=1,NCHEM +!THIS-IS-NEVER-USED IF(TRIM(YCHEM(JT)%CNAME)== 'SO4' ) THEN +!THIS-IS-NEVER-USED ISSO4_C=KCHEM(JT) +!THIS-IS-NEVER-USED ISO4_C=JT +!THIS-IS-NEVER-USED ENDIF +!THIS-IS-NEVER-USED ENDDO +!THIS-IS-NEVER-USED ZSO4G(KIDIA:KFDIA,1:KLEV)=ZCEN(KIDIA:KFDIA,1:KLEV,ISSO4_C) +!THIS-IS-NEVER-USED ELSE IF(LAERCHEM .AND. NCHEM>0 .AND. TRIM(CHEM_SCHEME)=="SimChem") THEN +!THIS-IS-NEVER-USED ZSO4G(KIDIA:KFDIA,1:KLEV)=0._JPRB +!THIS-IS-NEVER-USED ELSE +!THIS-IS-NEVER-USED CALL ABOR1(" M7: UNCOUPLED CHEMISTRY SCHEME "//TRIM(CHEM_SCHEME) ) +!THIS-IS-NEVER-USED ENDIF ! Convert from kg kg-1 to molec cm-3 -IF (LAERCHEM) THEN - ZELVOC(KIDIA:KFDIA,1:KLEV)=ZCEN(KIDIA:KFDIA,1:KLEV,KAERO(ielvoc)) - ZSVOC(KIDIA:KFDIA,1:KLEV)=ZCEN(KIDIA:KFDIA,1:KLEV,KAERO(iisvoc)) -ELSE - ZELVOC(KIDIA:KFDIA,1:KLEV)=0.0_JPRB - ZSVOC(KIDIA:KFDIA,1:KLEV)=0.0_JPRB -END IF +SELECT CASE (TRIM(CHEM_SCHEME)) +CASE("tm5") + ZELVOC(KIDIA:KFDIA,1:KLEV)= ZCEN(KIDIA:KFDIA,1:KLEV,KAERO(ielvoc)) + ZSVOC(KIDIA:KFDIA,1:KLEV) = ZCEN(KIDIA:KFDIA,1:KLEV,KAERO(iisvoc)) +CASE("SimChem") + ZELVOC(KIDIA:KFDIA,1:KLEV)= 0.0_JPRB + ZSVOC(KIDIA:KFDIA,1:KLEV) = 0.0_JPRB +CASE DEFAULT + ! This should be caught earlier at setup + CALL ABOR1(" M7: UNCOUPLED CHEMISTRY SCHEME "//TRIM(CHEM_SCHEME) ) +END SELECT !calculate ICNC ZICNC(KIDIA:KFDIA,1:KLEV) = 0._JPRB @@ -922,23 +874,34 @@ SUBROUTINE HAMM7_INTERFACE( & ZXTTE(JL,JK,JH)=ZXTTE(JL,JK,JH)+ZCHEM2AER(JL,JK,2) end if + !if(trim(YAERO(ind_oifs_ham%ind_mass_OIFS(JMASS))%CNAME)=='SO4') then!!! add SO4 into tendency, ugly loop for now,Lianghai + ! ZXTTE(JL,JK,ind_oifs_ham%ind_mass_HAM(JMASS))=ZXTTE(JL,JK,ind_oifs_ham%ind_mass_HAM(JMASS))+PCHEM2AER(JL,JK,1) + !end if + END DO END DO + + END DO !gas + + !WRITE(*,*)"subm_ngasspec", subm_ngasspec DO JGAS=1,subm_ngasspec JO=ind_oifs_ham%ind_gas_OIFS(JGAS) ! JO -> index context OIFS JH=ind_oifs_ham%ind_gas_HAM(JGAS) ! JH -> index context HAM + !WRITE(*,*)"JO",JO + !WRITE(*,*)"JH",JH + !WRITE(*,*)"YCHEM(JO)%CNAME",YCHEM(JO)%CNAME DO JK=1,KLEV DO JL=KIDIA,KFDIA - IF (LAERCHEM) THEN + IF (TRIM(CHEM_SCHEME)=="tm5") THEN ZXTM1(JL,JK,JH) = ZCEN(JL,JK,KCHEM(JO)) IF(TRIM(YCHEM(JO)%CNAME)=='SO4')THEN ! Add SO4 from wet chemistry to tendencies ZXTTE(JL,JK,JH) = ZCHEM2AER(JL,JK,1) ELSE ZXTTE(JL,JK,JH) = PTENC(JL,JK,KCHEM(JO)) END IF - ELSE + ELSE IF (TRIM(CHEM_SCHEME)=="SimChem") THEN ! Simple sulfur scheme IF(TRIM(YAERO(JO)%CNAME)=='SO2')THEN ZXTM1(JL,JK,JH) = ZCEN(JL,JK,KAERO(JO)) @@ -947,10 +910,11 @@ SUBROUTINE HAMM7_INTERFACE( & ELSE IF (TRIM(YAERO(JO)%CNAME)=='SO4_gas')THEN ZXTM1(JL,JK,JH) = ZCEN(JL,JK,KAERO(JO)) - ZXTTE(JL,JK,JH) = ZCHEM2AER(JL,JK,1) + PTENC(JL,JK,KAERO(JO)) - ZXTTEM1(JL,JK,JH) = PTENC(JL,JK,KAERO(JO)) + ZXTTE(JL,JK,JH) = ZCHEM2AER(JL,JK,1)! + PTENC(JL,JK,KAERO(JO)) + !ZXTTEM1(JL,JK,JH) = PTENC(JL,JK,KAERO(JO)) END IF - + ELSE + CALL ABOR1(" M7: UNCOUPLED CHEMISTRY SCHEME "//TRIM(CHEM_SCHEME) ) END IF END DO END DO @@ -986,9 +950,9 @@ SUBROUTINE HAMM7_INTERFACE( & ! --> calling the correct microphysics scheme -SELECT CASE (TRIM(AERO_SCHEME)) - - CASE("hamm7") +!THIS-IS-NOT-NEEDED SELECT CASE (TRIM(AERO_SCHEME)) +!THIS-IS-NOT-NEEDED +!THIS-IS-NOT-NEEDED CASE("hamm7") ! Initializations for submodel interface ZGRVOL(KIDIA:KFDIA,1:KLEV) = 1.79e12_JPRB ! ZGRVOL is only used for diagnostics (only when HAMMOZ is on) ZPBL = 1 ! boundary layer top = 1 (ITOP=1) @@ -1410,7 +1374,8 @@ SUBROUTINE HAMM7_INTERFACE( & ZIPDUM(KIDIA:KFDIA,1:KLEV) = 0._JPRB ! temporary variable for cloud ice water content (modified in wetdep) ZLPU(KIDIA:KFDIA,1:KLEV) = PLU(KIDIA:KFDIA,1:KLEV) ! temporary variable for cloud water content (modified in wetdep) - IF (.NOT.LAERCHEM)THEN + + IF (TRIM(CHEM_SCHEME)=="SimChem")THEN CALL HAM_CONV_LFRAQ_SO2(KFDIA,KLON,KLEV,PTP,ZXTM1,ZRHO,ZLP,ZLFRAC_SO2) END IF @@ -1639,7 +1604,7 @@ SUBROUTINE HAMM7_INTERFACE( & & ZXTEMS, ZXTMD1, ZRHO(:,KLEV), PRS1, ZFOREST, ZTSI, & !air dens lowest, air press at int. & ZAZ0L, ZAZ0W, ZAZ0I, ZCDNL, ZCDNW, ZCDNI, ZDDEPFLUX, ZVDEP) !ZCDNL and ZCDNW used for ustar and aerodyn. resist. - IF (.NOT. LAERCHEM) THEN + IF (TRIM(CHEM_SCHEME)=="SimChem")THEN CALL M7_SIMPLE_SULFUR_DRYDEP(YDMODEL, KIDIA,KFDIA, KLON, KLEV, & Zxtm1, PCFLX(:,KAERO(1):KAERO(NACTAERO)), & ZDP, PGEOH, ZRHO, ZXTTE, PTSPHY,& @@ -1680,13 +1645,13 @@ SUBROUTINE HAMM7_INTERFACE( & END DO !gas IF(LAERCHEM) THEN - DO JGAS=1,SUBM_NGASSPEC - PTENC(KIDIA:KFDIA,1:KLEV,KCHEM(ind_oifs_ham%ind_gas_OIFS(JGAS))) = ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_gas_HAM(JGAS)) - END DO - ELSE - DO JGAS=1,SUBM_NGASSPEC - PTENC(KIDIA:KFDIA,1:KLEV,KAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))) = ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_gas_HAM(JGAS)) - END DO + !DO JGAS=1,SUBM_NGASSPEC + ! PTENC(KIDIA:KFDIA,1:KLEV,KCHEM(ind_oifs_ham%ind_gas_OIFS(JGAS))) = ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_gas_HAM(JGAS)) + !END DO + !ELSE + ! DO JGAS=1,SUBM_NGASSPEC + ! PTENC(KIDIA:KFDIA,1:KLEV,KAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))) = ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_gas_HAM(JGAS)) + ! END DO END IF ! RCHG -> not sure best way to solve here. I commented to avoid segmentation fault @@ -1705,17 +1670,19 @@ SUBROUTINE HAMM7_INTERFACE( & !<-- End adding HAM modified tendency back to PTENC !----------------------------------------------------------------- - CASE DEFAULT - ! this case should never occur, as it is handled in the calling subroutine - CALL ABOR1(" AEROSOL SCHEME "//TRIM(AERO_SCHEME)//" IS NOT HANDLED IN HAMM7" ) - -END SELECT +!THIS-IS-NOT-NEEDED CASE DEFAULT +!THIS-IS-NOT-NEEDED ! this case should never occur, as it is handled in the calling subroutine +!THIS-IS-NOT-NEEDED CALL ABOR1(" AEROSOL SCHEME "//TRIM(AERO_SCHEME)//" IS NOT HANDLED IN HAMM7" ) +!THIS-IS-NOT-NEEDED +!THIS-IS-NOT-NEEDED END SELECT -! write flux to extra fields for diagnostic of aerosol 'chemical' conversion -IF (.NOT. LAERCHEM .AND. LCHEM_DIA) THEN ! As of 2025-01-24, ZTSO4 is filled only if LAERCHEM=F - CALL CHEM_INEXT( KIDIA , KFDIA , KLON , KLEV , 1, 1, & - & ZDP, PTSPHY, ZTSO4, ZTENC0,PEXTRA(:,ISO4_C,IEXTR_CH)) -END IF +! ZTSO4 is filled only if LAERCHEM=F, which is not possible with M7 - Commented out +!THIS-IS-NEVER-USED +!THIS-IS-NEVER-USED ! write flux to extra fields for diagnostic of aerosol 'chemical' conversion +!THIS-IS-NEVER-USED IF (.NOT. LAERCHEM .AND. LCHEM_DIA) THEN +!THIS-IS-NEVER-USED CALL CHEM_INEXT( KIDIA , KFDIA , KLON , KLEV , 1, 1, & +!THIS-IS-NEVER-USED & ZDP, PTSPHY, ZTSO4, ZTENC0,PEXTRA(:,ISO4_C,IEXTR_CH)) +!THIS-IS-NEVER-USED END IF !* 4. ELIMINATION OF NEGATIVE PROGNOSTIC AEROSOL CONCENTRATIONS @@ -2213,30 +2180,31 @@ SUBROUTINE HAMM7_INTERFACE( & !PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(26)%MP)=ZSEDIFLUX(KIDIA:KFDIA,1:KLEV,25) - IF (LAERCHEM)THEN - DO JGAS=1,SUBM_NGASSPEC + !IF (LAERCHEM)THEN + !DO JGAS=1,SUBM_NGASSPEC !ZXTM1(JL,JK,ind_gas_HAM(JGAS)) = MAX(0._JPRB,ZCEN(JL,JK,KCHEM(ind_gas_OIFS(JGAS)))) !eehol: remove negative values !PGFL(KIDIA:KFDIA,JN,YAEROUT(28+JGAS)%MP)=ZCEN(JL,JK,KCHEM(ind_gas_OIFS(JGAS))) - PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(28+JGAS)%MP)= PTENC(KIDIA:KFDIA,1:KLEV,KCHEM(ind_oifs_ham%ind_gas_OIFS(JGAS))) - END DO + !PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(28+JGAS)%MP)= PTENC(KIDIA:KFDIA,1:KLEV,KCHEM(ind_oifs_ham%ind_gas_OIFS(JGAS))) + !END DO !ELSE ! DO JGAS=1,subm_ngasspec ! PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(28+JGAS)%MP)= PTENC(KIDIA:KFDIA,1:KLEV,KAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))) ! ENDDO - ENDIF + !ENDIF DO IMODE=1,NMOD PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(30+IMODE)%MP)=RW_MODE(IMODE)%d2(KIDIA:KFDIA,1:KLEV) ! m ENDDO - IF (.NOT.LAERCHEM) THEN - PGFL(KIDIA:KFDIA,KLEV,YAEROUT(40)%MP) = ZFSO2(KIDIA:KFDIA) ! tendency SS CS ham after update surface - PGFL(KIDIA:KFDIA,KLEV,YAEROUT(41)%MP) = ZFSO4(KIDIA:KFDIA) ! tendency SS CS ham after update surfac - PGFL(KIDIA:KFDIA,KLEV,YAEROUT(42)%MP) = ZFSO4_AQ(KIDIA:KFDIA) ! tendency SS CS ham after update surface - PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(43)%MP) = ZTSO4(KIDIA:KFDIA,1:KLEV,1) ! tendency SS CS ham after update surface - PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(44)%MP) = ZTSO4_AQ(KIDIA:KFDIA,1:KLEV) ! tendency SS CS ham after update surface - PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(45)%MP) = ZTSO2(KIDIA:KFDIA,1:KLEV) ! tendency SS CS ham after update surface - END IF + !IF (.NOT.LAERCHEM) THEN + !IF (LAERCHEM .AND. TRIM(CHEM_SCHEME)=="SimChem")THEN + ! PGFL(KIDIA:KFDIA,KLEV,YAEROUT(40)%MP) = ZFSO2(KIDIA:KFDIA) ! tendency SS CS ham after update surface + ! PGFL(KIDIA:KFDIA,KLEV,YAEROUT(41)%MP) = ZFSO4(KIDIA:KFDIA) ! tendency SS CS ham after update surfac + ! PGFL(KIDIA:KFDIA,KLEV,YAEROUT(42)%MP) = ZFSO4_AQ(KIDIA:KFDIA) ! tendency SS CS ham after update surface + ! PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(43)%MP) = ZTSO4(KIDIA:KFDIA,1:KLEV,1) ! tendency SS CS ham after update surface + ! PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(44)%MP) = ZTSO4_AQ(KIDIA:KFDIA,1:KLEV) ! tendency SS CS ham after update surface + ! PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(45)%MP) = ZTSO2(KIDIA:KFDIA,1:KLEV) ! tendency SS CS ham after update surface + !END IF ENDIF diff --git a/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 index 6cd95ca7..705e84a7 100644 --- a/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 +++ b/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 @@ -491,36 +491,36 @@ SUBROUTINE TM5M7_SRC( & ! at begining of this subroutine. Note that here we are not filling PCFLX ! Is this ok? ! -IF (.not. LAERCHEM) THEN - DO JL=KIDIA,KFDIA - DO JK=1,KLEV - DO JGAS=1,2 - IF (TRIM(YAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))%CNAME)=='SO2') THEN - ISSO2=ind_oifs_ham%ind_gas_OIFS(JGAS) - PTENC(JL,JK,KAERO(ISSO2))=PTENC(JL,JK,KAERO(ISSO2))+ PSO2SRC(JL,JK) - !PCFLX(JL,KAERO(ISSO2))=PCFLX(JL,KAERO(ISSO2)) + PSO2SRC(JL,JK) - PEMIDIAG(JL,KAERO(ISSO2))=PEMIDIAG(JL,KAERO(ISSO2))+ PSO2SRC(JL,JK) - ELSE IF (TRIM(YAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))%CNAME)=='SO4_gas') THEN - ISSO4=ind_oifs_ham%ind_gas_OIFS(JGAS) - PTENC(JL,JK,KAERO(ISSO4))=PTENC(JL,JK,KAERO(ISSO4))+ PSO4SRC(JL,JK) - !PCFLX(JL,KAERO(ISSO4))=PCFLX(JL,KAERO(ISSO4)) + PSO4SRC(JL,JK) - PEMIDIAG(JL,KAERO(ISSO4))=PEMIDIAG(JL,KAERO(ISSO4)) + PSO4SRC(JL,JK) - END IF - END DO - END DO - - -! For add SOA from CO into ISVOC tracer -!!$ DO JGAS=1,NACTAERO -!!$ IF (TRIM(YAERO(JGAS)%CNAME)=='ISVOC') THEN -!!$ -!!$ PTENC(JL,JK,KAERO(JGAS))=PTENC(JL,JK,KAERO(JGAS))+ PSOACO(JL) -!!$ PEMIDIAG(JL,KAERO(JGAS))=PEMIDIAG(JL,KAERO(JGAS)) + PSOACO(JL) -!!$ END IF -!!$ END DO - - END DO - END IF +!IF (.not. LAERCHEM) THEN +! DO JL=KIDIA,KFDIA +! DO JK=1,KLEV +! DO JGAS=1,2 +! IF (TRIM(YAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))%CNAME)=='SO2') THEN +! ISSO2=ind_oifs_ham%ind_gas_OIFS(JGAS) +! PTENC(JL,JK,KAERO(ISSO2))=PTENC(JL,JK,KAERO(ISSO2))+ PSO2SRC(JL,JK) +! !PCFLX(JL,KAERO(ISSO2))=PCFLX(JL,KAERO(ISSO2)) + PSO2SRC(JL,JK) +! PEMIDIAG(JL,KAERO(ISSO2))=PEMIDIAG(JL,KAERO(ISSO2))+ PSO2SRC(JL,JK) +! ELSE IF (TRIM(YAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))%CNAME)=='SO4_gas') THEN +! ISSO4=ind_oifs_ham%ind_gas_OIFS(JGAS) +! PTENC(JL,JK,KAERO(ISSO4))=PTENC(JL,JK,KAERO(ISSO4))+ PSO4SRC(JL,JK) +! !PCFLX(JL,KAERO(ISSO4))=PCFLX(JL,KAERO(ISSO4)) + PSO4SRC(JL,JK) +! PEMIDIAG(JL,KAERO(ISSO4))=PEMIDIAG(JL,KAERO(ISSO4)) + PSO4SRC(JL,JK) +! END IF +! END DO +! END DO +! +! +!! For add SOA from CO into ISVOC tracer +!!!$ DO JGAS=1,NACTAERO +!!!$ IF (TRIM(YAERO(JGAS)%CNAME)=='ISVOC') THEN +!!!$ +!!!$ PTENC(JL,JK,KAERO(JGAS))=PTENC(JL,JK,KAERO(JGAS))+ PSOACO(JL) +!!!$ PEMIDIAG(JL,KAERO(JGAS))=PEMIDIAG(JL,KAERO(JGAS)) + PSOACO(JL) +!!!$ END IF +!!!$ END DO +! +! END DO +! END IF !----------------------------------------------------------------------- diff --git a/ifs-source/arpifs/phys_ec/aerini_layer.F90 b/ifs-source/arpifs/phys_ec/aerini_layer.F90 index 1b45309e..5cabff36 100644 --- a/ifs-source/arpifs/phys_ec/aerini_layer.F90 +++ b/ifs-source/arpifs/phys_ec/aerini_layer.F90 @@ -178,7 +178,7 @@ SUBROUTINE AERINI_LAYER(YDGEOMETRY,YDSURF,& ZSNM = SUM(PSURF%PSP_SG(:,:,YSP_SG%YF%MP9),DIM=2) ! pre-compute total snow mass -IF(.not. LAERCHEM .and. LAEROSFC)THEN + !IF(.not. LAERCHEM .and. LAEROSFC)THEN !IF(LAEROSFC) !call simple_sulfur_src(YDGEOMETRY, YDMODEL, KDIM%KIDIA, KDIM%KFDIA, KDIM%KLON , KDIM%KTDIA, KDIM%KLEV,& ! & KDIM%KSTGLO, GEMSL%ITRAC, GEMSL%IAERO, & @@ -193,11 +193,41 @@ SUBROUTINE AERINI_LAYER(YDGEOMETRY,YDSURF,& ! & GEMSL%ZAERWS,& ! & GEMSL%ZDMSO, GEMSL%ZLDAY, GEMSL%ZLISS, GEMSL%ZSO2, GEMSL%ZTDMS,& ! & GEMSL%ZODMS, PSO4SRC,PSO2SRC) -ELSE - ! Set to zero - PSO4SRC(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV)=0.0_JPRB - PSO2SRC(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV)=0.0_JPRB -END IF +!IF (trim(CHEM_SCHEME)=="Sim_Chem".and.LAERCHEM) +! DO JL=KIDIA,KFDIA +! DO JK=1,KLEV +! DO JGAS=1,2 +! IF (TRIM(YAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))%CNAME)=='SO2') THEN +! ISSO2=ind_oifs_ham%ind_gas_OIFS(JGAS) +! GEMSL%ZTENC(JL,JK,KAERO(ISSO2))=GEMSL%ZTENC(JL,JK,KAERO(ISSO2))+ PSO2SRC(JL,JK) +! !PCFLX(JL,KAERO(ISSO2))=PCFLX(JL,KAERO(ISSO2)) + PSO2SRC(JL,JK) +! !PEMIDIAG(JL,KAERO(ISSO2))=PEMIDIAG(JL,KAERO(ISSO2))+ PSO2SRC(JL,JK) +! ELSE IF (TRIM(YAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))%CNAME)=='SO4_gas') THEN +! ISSO4=ind_oifs_ham%ind_gas_OIFS(JGAS) +! GEMSL%ZTENC(JL,JK,KAERO(ISSO4))=GEMSL%ZTENC(JL,JK,KAERO(ISSO4))+ PSO4SRC(JL,JK) +! !PCFLX(JL,KAERO(ISSO4))=PCFLX(JL,KAERO(ISSO4)) + PSO4SRC(JL,JK) +! !PEMIDIAG(JL,KAERO(ISSO4))=PEMIDIAG(JL,KAERO(ISSO4)) + PSO4SRC(JL,JK) +! END IF +! END DO +! END DO +! +!! For add SOA from CO into ISVOC tracer +!!!$ DO JGAS=1,NACTAERO +!!!$ IF (TRIM(YAERO(JGAS)%CNAME)=='ISVOC') THEN +!!!$ +!!!$ PTENC(JL,JK,KAERO(JGAS))=PTENC(JL,JK,KAERO(JGAS))+ PSOACO(JL) +!!!$ PEMIDIAG(JL,KAERO(JGAS))=PEMIDIAG(JL,KAERO(JGAS)) + PSOACO(JL) +!!!$ END IF +!!!$ END DO +! +! END DO +! END IF +! +!ELSE +! ! Set to zero +! PSO4SRC(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV)=0.0_JPRB +! PSO2SRC(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV)=0.0_JPRB +!END IF SELECT CASE (TRIM(AERO_SCHEME)) From 9a4d238fff95fa9e28e96c75ac037512cb57cf0d Mon Sep 17 00:00:00 2001 From: Lianghai Wu Date: Tue, 18 Mar 2025 08:16:01 +0000 Subject: [PATCH 064/129] Fix merge function issue and bit of cleanup --- ifs-source/arpifs/m7/module/mo_ham_wetdep.F90 | 16 ++++++++-------- ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 | 5 ++--- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/ifs-source/arpifs/m7/module/mo_ham_wetdep.F90 b/ifs-source/arpifs/m7/module/mo_ham_wetdep.F90 index e77986f1..dce89a46 100755 --- a/ifs-source/arpifs/m7/module/mo_ham_wetdep.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_wetdep.F90 @@ -1328,6 +1328,7 @@ SUBROUTINE ham_conv_lfraq_so2(kproma, kbdim, klev, & zheneff(kbdim,klev), zhp(kbdim,klev), & zhenry_so2(2) + REAL(dp) :: tmp1(kbdim,klev) INTEGER :: jt, jn_idt_so4, jdx, idt_so2_loc INTEGER, ALLOCATABLE :: idt_so4_array(:) @@ -1342,16 +1343,15 @@ SUBROUTINE ham_conv_lfraq_so2(kproma, kbdim, klev, & !>>SF #458 (replacing where statements) ll1(1:kproma,:) = (pmlwc(1:kproma,:) > 1.E-15_dp) + !tmp1 = 1000._dp/(pmlwc(1:kproma,:)*mw_so2) - zfac(1:kproma,:) = MERGE( & - 1000._dp/(pmlwc(1:kproma,:)*mw_so2), & - 0._dp, & - ll1(1:kproma,:) ) + where (pmlwc(1:kproma,:) > 1.E-15_dp) tmp1 = 1000._dp/(pmlwc(1:kproma,:)*mw_so2) + !zfac(1:kproma,:) = MERGE( 1000._dp/(pmlwc(1:kproma,:)*mw_so2), 0._dp, ll1(1:kproma,:) ) + zfac(1:kproma,:) = MERGE( tmp1, 0._dp, ll1(1:kproma,:)) - zfac4(1:kproma,:) = MERGE( & - 1000._dp/(pmlwc(1:kproma,:)*mw_so4), & - 0._dp, & - ll1(1:kproma,:) ) + where (pmlwc(1:kproma,:) > 1.E-15_dp) tmp1 = 1000._dp/(pmlwc(1:kproma,:)*mw_so4) + !zfac4(1:kproma,:) = MERGE( 1000._dp/(pmlwc(1:kproma,:)*mw_so4), 0._dp, ll1(1:kproma,:) ) + zfac4(1:kproma,:) = MERGE( tmp1, 0._dp, ll1(1:kproma,:)) !< ZEPSEC ! logical for liquid cloud LICECLD(JL,JK) = ( PIP(JL,JK)*ZTMPA ) > ZEPSEC ! logical for ice cloud ! ZQLWP2(JL,JK) = PLP(JL,JK)/MAX(ZAP(JL,JK),1.E-10_JPRB) ! calculate lwp - ! ZQLWP2(JL,JK) = MIN(MAX(ZQLWP2(JL,JK),0.0_JPRB),10*RCLDMAX) ! treshold lwp, lianghai changed ! effective radius calculated similarly as in radlswr.F90 ! 2.387e-10 is 3/(4*pi*rho_liq*10^6) [10^6 for N in right units] - ZRE_LIQ(JL,JK) = 1.E+06_JPRB*(2.387e-10_JPRB*ZRHO(JL,JK)*ZQLWP2(JL,JK)/(MAX(PGFL(JL,JK,YCDNC%MP9_PH),10._JPRB)))**0.333_JPRB ! calculate effective radius in um (use minimum value for CDNC if CDNC is small) + ZRE_LIQ(JL,JK) = 1.E+06_JPRB*(2.387e-10_JPRB*ZRHO(JL,JK)*ZQLWP(JL,JK)/(MAX(PGFL(JL,JK,YCDNC%MP9_PH),10._JPRB)))**0.333_JPRB ! calculate effective radius in um (use minimum value for CDNC if CDNC is small) END DO END DO From e880cef35f13ebe268c0dac17e10ea7015efef7f Mon Sep 17 00:00:00 2001 From: Lianghai Wu Date: Fri, 4 Apr 2025 09:49:45 +0000 Subject: [PATCH 065/129] Make on-line sea-salt emission consistent --- ifs-source/arpifs/chem/chem_main.F90 | 86 ++++++++--------- ifs-source/arpifs/m7/module/mo_ham.F90 | 2 +- ifs-source/arpifs/m7/module/mo_ham_subm.F90 | 28 +++--- .../arpifs/m7/phys_ec/hamm7_interface.F90 | 94 ++++++++++--------- 4 files changed, 106 insertions(+), 104 deletions(-) diff --git a/ifs-source/arpifs/chem/chem_main.F90 b/ifs-source/arpifs/chem/chem_main.F90 index 070d719a..bf78cbf9 100644 --- a/ifs-source/arpifs/chem/chem_main.F90 +++ b/ifs-source/arpifs/chem/chem_main.F90 @@ -817,51 +817,53 @@ SUBROUTINE CHEM_MAIN & & KLEVX,ZDELP,PTSTEP,ZTENC1,ZTENC0,PEXTRA(:,:, IEXTR_CH)) ENDIF - ! Simplified sulfur scheme, implemented for coupling with M7 aerosol scheme + ! Simplified sulfur scheme V2 - here only for M7 aerosols scheme CASE ("SimChem") - ISSO2=ISO2_TM5! need to be checked, Lianghai - ISSO4=ISO4_TM5 - ISSO4_ACS=5! index in YAERO OIFS - ! for test only, not checked yet - - DO JK=1,KLEV - DO JL=KIDIA,KFDIA - !ZTSO2(JL,JK) = PTENC(JL,JK,ISSO2) - !ZTSO4(JL,JK) = PTENC(JL,JK,ISSO4) - !ZTSO4_AQ(JL,JK) = PTENC(JL,JK,ISSO4_ACS)! liquid phase - !ZSO2(JL,JK) = PAEROP(JL,JK,ISSO2) - ZSO2(JL,JK) = ZCON(JL,JK,ISSO2)! SO2 concentration - - ZITSO2(JL,JK) = ZTENC0(JL,JK,ISSO2)! SO2 tendecny at previous time step - END DO - END DO - - CALL AER_SO2SO4_V2( YDRIP, & - & KIDIA , KFDIA , KLON , KLEV , & - & PTSTEP, PTP , PRSF1 , PAP , PLP , PGELAT, PGELAM, & - & ZSO2 , ZITSO2, & - & PGFL(:,:, YGFL%YAEROCLIM(1)%MP), & - & PGFL(:,:,YGFL%YAEROCLIM(2)%MP), & - & PGFL(:,:,YGFL%YAEROCLIM(3)%MP) , & - & ZTSO2 , ZTSO4(:,:), ZTSO4_AQ, ZFSO2, ZFSO4, ZFSO4_AQ, ZDELP) - - DO JK=1,KLEV - DO JL=KIDIA,KFDIA - ! ZTSO2 - !PTENC(JL,JK,ISSO2) = PTENC(JL,JK,ISSO2)+ZTSO2(JL,JK) - ZTENC1(JL,JK,ISSO2) = ZTENC1(JL,JK,ISSO2)+ZTSO2(JL,JK) - !! ZTSO4 - !PTENC(JL,JK,ISSO4)=PTENC(JL,JK,ISSO4)+ZTSO4(JL,Jk) - !! SO4 formed in clouds is applied to Accumulati - !PTENC(JL,JK,ISSO4_ACS)=PTENC(JL,JK,ISSO4_ACS)+ZTSO4_AQ(JL,JK) - PCHEM2AER(JL,JK,1) = ZTSO4(JL,Jk) - PCHEM2AER(JL,JK,2) = ZTSO4_AQ(JL,JK) - - END DO - END DO + !ISSO4=ISO4_TM5 + !ISSO4_ACS=5! index in YAERO OIFS + + DO JT=1,NCHEM + IF (TRIM (YCHEM(JT)%CNAME) == 'SO2' ) ISSO2=JT + ! IF (TRIM (YCHEM(JT)%CNAME) == 'SO4' ) ISSO4=JT + ENDDO + + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + !ZTSO2(JL,JK) = PTENC(JL,JK,ISSO2) + !ZTSO4(JL,JK) = PTENC(JL,JK,ISSO4) + !ZTSO4_AQ(JL,JK) = PTENC(JL,JK,ISSO4_ACS)! liquid phase + !ZSO2(JL,JK) = PAEROP(JL,JK,ISSO2) + ZSO2(JL,JK) = ZCON(JL,JK,ISSO2) ! SO2 concentration + ZITSO2(JL,JK) = ZTENC0(JL,JK,ISSO2)! SO2 tendecny at previous time step + END DO + END DO + + CALL AER_SO2SO4_V2( YDRIP, & + & KIDIA , KFDIA , KLON , KLEV , & + & PTSTEP, PTP , PRSF1 , PAP , PLP , PGELAT, PGELAM, & + & ZSO2 , ZITSO2, & + & PGFL(:,:, YGFL%YAEROCLIM(1)%MP), & + & PGFL(:,:,YGFL%YAEROCLIM(2)%MP), & + & PGFL(:,:,YGFL%YAEROCLIM(3)%MP) , & + & ZTSO2 , ZTSO4(:,:), ZTSO4_AQ, ZFSO2, ZFSO4, ZFSO4_AQ, ZDELP) - ! output for aerosol scheme + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ! ZTSO2 + !PTENC(JL,JK,ISSO2) = PTENC(JL,JK,ISSO2)+ZTSO2(JL,JK) + !ZTENC1(JL,JK,ISSO2) = ZTENC1(JL,JK,ISSO2)+ZTSO2(JL,JK) + ZTENC1(JL,JK,ISSO2) = ZTSO2(JL,JK) + !! ZTSO4 + !PTENC(JL,JK,ISSO4)=PTENC(JL,JK,ISSO4)+ZTSO4(JL,Jk) + !! SO4 formed in clouds is applied to Accumulati + !PTENC(JL,JK,ISSO4_ACS)=PTENC(JL,JK,ISSO4_ACS)+ZTSO4_AQ(JL,JK) + PCHEM2AER(JL,JK,1) = ZTSO4(JL,Jk) + PCHEM2AER(JL,JK,2) = ZTSO4_AQ(JL,JK) + END DO + END DO + + ! output for aerosol scheme !IF (NACTAERO > 0 .AND. LAERCHEM) THEN ! PCHEM2AER(KIDIA:KFDIA,1:KLEV,1) = ZTENC1(KIDIA:KFDIA,1:KLEV,ISO4_TM5) -ZTENC0(KIDIA:KFDIA,1:KLEV,ISO4_TM5) diff --git a/ifs-source/arpifs/m7/module/mo_ham.F90 b/ifs-source/arpifs/m7/module/mo_ham.F90 index 77165bdc..04ecaadd 100644 --- a/ifs-source/arpifs/m7/module/mo_ham.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham.F90 @@ -163,7 +163,7 @@ MODULE mo_ham ! SST scheme. OIFS supports only the "Gong + SST" scheme from either TM5 ! implementation (nseasalt=0) or HAMM7 one (nseasalt=8), hardcoded ! here. - INTEGER :: nseasalt = 8 ! Sea Salt emission scheme: + INTEGER :: nseasalt = 0 ! Sea Salt emission scheme: #endif ! ! nseasalt = 1 Monahan (1986) diff --git a/ifs-source/arpifs/m7/module/mo_ham_subm.F90 b/ifs-source/arpifs/m7/module/mo_ham_subm.F90 index 05388abf..99553644 100755 --- a/ifs-source/arpifs/m7/module/mo_ham_subm.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_subm.F90 @@ -142,21 +142,19 @@ SUBROUTINE ham_subm_interface(kproma, kbdim, klev, krow, ktrac, & ! optional arguments - INTEGER, OPTIONAL :: krow ! geographic block number - REAL(dp), OPTIONAL :: pap (kbdim,klev) ! pressure [Pa], at full levels - REAL(dp), OPTIONAL :: paph (kbdim,klev+1) ! pressure [Pa], at half levels - REAL(dp), OPTIONAL :: pt (kbdim,klev) ! temperature [K] - REAL(dp), OPTIONAL :: pq (kbdim,klev) ! specific humidity [kg/kg] - REAL(dp), OPTIONAL :: pqs (kbdim,klev) ! saturation specific humidity [kg/kg] - REAL(dp), OPTIONAL :: pxtm1 (kbdim,klev,ktrac) ! tracer mass/number mixing ratio at - REAL(dp), OPTIONAL :: pxtte (kbdim,klev,ktrac) ! tracer mass/number mixing ratio tendencies [kg/kg s-1 or #/kg s-1] - REAL(dp), OPTIONAL :: paclc (kbdim,klev) ! cloud cover [0,1] - REAL(dp), OPTIONAL :: pgrvolm1(kbdim,klev) ! grid box volume [m3] - REAL(dp), OPTIONAL :: ppbl (kbdim) ! Planetary boundary layer top level - REAL(dp), OPTIONAL :: pforest (kbdim) ! Planetary boundary layer top level - REAL(dp), OPTIONAL :: pout_dnuc(kbdim,klev,4) - - REAL(dp), OPTIONAL :: pm6rp(kbdim,klev,nclass), & ! mean mode actual radius (wet for soluble and dry for insoluble modes) [m] + INTEGER :: krow ! geographic block number + REAL(dp) :: pap (kbdim,klev) ! pressure [Pa], at full levels + REAL(dp) :: paph (kbdim,klev+1) ! pressure [Pa], at half levels + REAL(dp) :: pt (kbdim,klev) ! temperature [K] + REAL(dp) :: pq (kbdim,klev) ! specific humidity [kg/kg] + REAL(dp) :: pqs (kbdim,klev) ! saturation specific humidity [kg/kg] + REAL(dp) :: pxtm1 (kbdim,klev,ktrac) ! tracer mass/number mixing ratio at + REAL(dp) :: pxtte (kbdim,klev,ktrac) ! tracer mass/number mixing ratio tendencies [kg/kg s-1 or #/kg s-1] + REAL(dp) :: paclc (kbdim,klev) ! cloud cover [0,1] + REAL(dp) :: pgrvolm1(kbdim,klev) ! grid box volume [m3] + REAL(dp) :: ppbl (kbdim) ! Planetary boundary layer top level + + REAL(dp) :: pm6rp(kbdim,klev,nclass), & ! mean mode actual radius (wet for soluble and dry for insoluble modes) [m] pm6dry(kbdim,klev,nsol), & ! dry radius for soluble modes [m] prhop(kbdim,klev,nclass), & ! mean mode particle density [kg m-3] pww(kbdim,klev,nclass) ! aerosol water content for each mode [kg(water) m-3(air)] diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index 2c71e062..1d4382d6 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -858,13 +858,14 @@ SUBROUTINE HAMM7_INTERFACE( & END DO END DO END DO + !mass DO JMASS=1,naerocomp JO=ind_oifs_ham%ind_mass_OIFS(JMASS) ! JO -> index context OIFS JH=ind_oifs_ham%ind_mass_HAM(JMASS) ! JH -> index context HAM DO JK=1,KLEV DO JL=KIDIA,KFDIA - ZXTM1(JL,JK,JH) = ZCEN(JL,JK,KAERO(JO)) + ZXTM1(JL,JK,JH) = ZCEN(JL,JK,KAERO(JO)) ZXTTE(JL,JK,JH) = PTENC(JL,JK,KAERO(JO)) ! in case of simple sulfur scheme add SO4_AQ part into SO4_ACS ! both original tendency and m7tendency [FIXME: what??] @@ -874,52 +875,53 @@ SUBROUTINE HAMM7_INTERFACE( & ZXTTE(JL,JK,JH)=ZXTTE(JL,JK,JH)+ZCHEM2AER(JL,JK,2) end if + if(trim(YAERO(JO)%CNAME)=='SO4') then + ZXTTE(JL,JK,JH)=ZXTTE(JL,JK,JH)+ZCHEM2AER(JL,JK,1) + end if !if(trim(YAERO(ind_oifs_ham%ind_mass_OIFS(JMASS))%CNAME)=='SO4') then!!! add SO4 into tendency, ugly loop for now,Lianghai ! ZXTTE(JL,JK,ind_oifs_ham%ind_mass_HAM(JMASS))=ZXTTE(JL,JK,ind_oifs_ham%ind_mass_HAM(JMASS))+PCHEM2AER(JL,JK,1) !end if END DO END DO - - -END DO -!gas - - !WRITE(*,*)"subm_ngasspec", subm_ngasspec -DO JGAS=1,subm_ngasspec - JO=ind_oifs_ham%ind_gas_OIFS(JGAS) ! JO -> index context OIFS - JH=ind_oifs_ham%ind_gas_HAM(JGAS) ! JH -> index context HAM - !WRITE(*,*)"JO",JO - !WRITE(*,*)"JH",JH - !WRITE(*,*)"YCHEM(JO)%CNAME",YCHEM(JO)%CNAME - DO JK=1,KLEV - DO JL=KIDIA,KFDIA - IF (TRIM(CHEM_SCHEME)=="tm5") THEN - ZXTM1(JL,JK,JH) = ZCEN(JL,JK,KCHEM(JO)) - IF(TRIM(YCHEM(JO)%CNAME)=='SO4')THEN ! Add SO4 from wet chemistry to tendencies - ZXTTE(JL,JK,JH) = ZCHEM2AER(JL,JK,1) - ELSE - ZXTTE(JL,JK,JH) = PTENC(JL,JK,KCHEM(JO)) - END IF - ELSE IF (TRIM(CHEM_SCHEME)=="SimChem") THEN - ! Simple sulfur scheme - IF(TRIM(YAERO(JO)%CNAME)=='SO2')THEN - ZXTM1(JL,JK,JH) = ZCEN(JL,JK,KAERO(JO)) - ZXTTE(JL,JK,JH) = PTENC(JL,JK,KAERO(JO)) - ZXTTEM1(JL,JK,JH) = PTENC(JL,JK,KAERO(JO)) - - ELSE IF (TRIM(YAERO(JO)%CNAME)=='SO4_gas')THEN - ZXTM1(JL,JK,JH) = ZCEN(JL,JK,KAERO(JO)) - ZXTTE(JL,JK,JH) = ZCHEM2AER(JL,JK,1)! + PTENC(JL,JK,KAERO(JO)) - !ZXTTEM1(JL,JK,JH) = PTENC(JL,JK,KAERO(JO)) - END IF - ELSE - CALL ABOR1(" M7: UNCOUPLED CHEMISTRY SCHEME "//TRIM(CHEM_SCHEME) ) - END IF - END DO - END DO END DO +!!gas +!DO JGAS=1,subm_ngasspec +! JO=ind_oifs_ham%ind_gas_OIFS(JGAS) ! JO -> index context OIFS +! JH=ind_oifs_ham%ind_gas_HAM(JGAS) ! JH -> index context HAM +! !WRITE(*,*)"JO",JO +! !WRITE(*,*)"JH",JH +! !WRITE(*,*)"YCHEM(JO)%CNAME",YCHEM(JO)%CNAME +! DO JK=1,KLEV +! DO JL=KIDIA,KFDIA +! IF (TRIM(CHEM_SCHEME)=="tm5") THEN +! ZXTM1(JL,JK,JH) = ZCEN(JL,JK,KCHEM(JO)) +! IF(TRIM(YCHEM(JO)%CNAME)=='SO4')THEN ! Add SO4 from wet chemistry to tendencies +! ZXTTE(JL,JK,JH) = ZCHEM2AER(JL,JK,1) +! ELSE +! ZXTTE(JL,JK,JH) = PTENC(JL,JK,KCHEM(JO)) +! END IF +! ELSE IF (TRIM(CHEM_SCHEME)=="SimChem") THEN +! ZXTM1(JL,JK,JH) = ZCEN(JL,JK,KAERO(JO)) +! IF (TRIM(YAERO(JO)%CNAME)=='SO4')THEN +! ZXTTE(JL,JK,JH) = ZCHEM2AER(JL,JK,1)! + PTENC(JL,JK,KAERO(JO)) +! !ZXTTEM1(JL,JK,JH) = PTENC(JL,JK,KAERO(JO)) +! END IF +! !IF(TRIM(YAERO(JO)%CNAME)=='SO2')THEN +! ! ZXTTE(JL,JK,JH) = PTENC(JL,JK,KAERO(JO)) +! ! ZXTTEM1(JL,JK,JH) = PTENC(JL,JK,KAERO(JO)) +! !ELSE IF (TRIM(YAERO(JO)%CNAME)=='SO4_gas')THEN +! ! ZXTTE(JL,JK,JH) = ZCHEM2AER(JL,JK,1)! + PTENC(JL,JK,KAERO(JO)) +! ! !ZXTTEM1(JL,JK,JH) = PTENC(JL,JK,KAERO(JO)) +! !END IF +! ELSE +! CALL ABOR1(" M7: UNCOUPLED CHEMISTRY SCHEME "//TRIM(CHEM_SCHEME) ) +! END IF +! END DO +! END DO +!END DO + ! RCHG -> This will produce segmentation fault if CDNC are not in the namelist ! we need to test these things and do a CALL ABORT1() @@ -1643,15 +1645,15 @@ SUBROUTINE HAMM7_INTERFACE( & PTENC(KIDIA:KFDIA,1:KLEV,KAERO(ind_oifs_ham%ind_mass_OIFS(JMASS))) = ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_mass_HAM(JMASS)) END DO !gas - IF(LAERCHEM) THEN - !DO JGAS=1,SUBM_NGASSPEC - ! PTENC(KIDIA:KFDIA,1:KLEV,KCHEM(ind_oifs_ham%ind_gas_OIFS(JGAS))) = ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_gas_HAM(JGAS)) - !END DO - !ELSE + !IF(LAERCHEM) THEN ! DO JGAS=1,SUBM_NGASSPEC - ! PTENC(KIDIA:KFDIA,1:KLEV,KAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))) = ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_gas_HAM(JGAS)) + ! PTENC(KIDIA:KFDIA,1:KLEV,KCHEM(ind_oifs_ham%ind_gas_OIFS(JGAS))) = ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_gas_HAM(JGAS)) ! END DO - END IF + !!ELSE + !! DO JGAS=1,SUBM_NGASSPEC + !! PTENC(KIDIA:KFDIA,1:KLEV,KAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))) = ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_gas_HAM(JGAS)) + !! END DO + !END IF ! RCHG -> not sure best way to solve here. I commented to avoid segmentation fault ! but it may be avoided with other more specific flag. Anyway something was From ae680ff5051d19c7788407bcd6480c55d25031a8 Mon Sep 17 00:00:00 2001 From: Lianghai Wu Date: Mon, 14 Apr 2025 07:57:53 +0000 Subject: [PATCH 066/129] Account for prescribed oxidant fields for sulfur scheme --- ifs-source/arpifs/climate/updclie_aerclim.F90 | 607 ++++++++++++++++++ ifs-source/arpifs/control/cnt4.F90 | 6 +- ifs-source/arpifs/control/stepx.F90 | 2 +- .../module/model_mod_model_ini_phys.F90 | 2 +- .../arpifs/module/model_mod_model_step.F90 | 2 +- ifs-source/arpifs/module/yommcc.F90 | 10 +- ifs-source/arpifs/phys_ec/su_aerw.F90 | 2 + ifs-source/arpifs/setup/su0yomb.F90 | 2 +- ifs-source/arpifs/setup/sumcc.F90 | 4 +- ifs-source/arpifs/setup/sumcclag.F90 | 54 +- ifs-source/arpifs/utility/updtim.F90 | 29 +- ifs-source/scmec/source/cnt41c.F90 | 2 +- 12 files changed, 702 insertions(+), 20 deletions(-) create mode 100644 ifs-source/arpifs/climate/updclie_aerclim.F90 diff --git a/ifs-source/arpifs/climate/updclie_aerclim.F90 b/ifs-source/arpifs/climate/updclie_aerclim.F90 new file mode 100644 index 00000000..631a0a08 --- /dev/null +++ b/ifs-source/arpifs/climate/updclie_aerclim.F90 @@ -0,0 +1,607 @@ +SUBROUTINE UPDCLIE_AERCLIM(YDGEOMETRY,YDDYNA,YDCOMPO, YDMCC, YDGFL, YDML_GCONF,PTSTEP) + +!**** *UPDCLIE_AERCLIM* + +! PURPOSE. +! -------- + +! Updates the SO2 oxidants climatology fields every month; +! interpolation in time in between +! (ECMWF version, distributed or shared memory) + +!** INTERFACE. +! ---------- + +! CALL UPDCLIE_AERCLIM(...) + +! Explicit arguments : +! -------------------- +! PTSTEP: TIME STEP + +! METHOD. +! ------- + +! Reads the time-varying 3D fields for composition. +! Uses time interpolation if LMCCIEC_AERCLIM=true, +! otherwise the most recent fields are used. + +! EXTERNALS. +! ---------- + +! UPDCAL + +! AUTHORS. +! -------- +! V Huijnen (KNMI) Oct 2022 (based on routine UPDCLIE_COMPO) + +! MODIFICATIONS. +! -------------- +! ------------------------------------------------------------------ + +USE MODEL_GENERAL_CONF_MOD , ONLY : MODEL_GENERAL_CONF_TYPE +USE GEOMETRY_MOD , ONLY : GEOMETRY +! USE SURFACE_FIELDS_MIX , ONLY : TSURF +USE YOMGFL , ONLY : TGFL +USE YOM_YGFL , ONLY : YGFL +USE PARKIND1 , ONLY : JPIM, JPRB, JPRD +USE YOMHOOK , ONLY : LHOOK, DR_HOOK,JPHOOK +USE YOERAD , ONLY : YRERAD +USE YOMCST , ONLY : RDAY +USE YOMCT0 , ONLY : CNMEXP!, LTWOTL +USE YOMLUN , ONLY : NULOUT, NULERR +USE YOMMCC , ONLY : TMCC +USE YOMMP0 , ONLY : MYPROC +!USE YOMRIP , ONLY : YRRIP +USE YOMRIP0 , ONLY : NINDAT +USE YOM_YGFL , ONLY : YGFL +USE YOMCOMPO , ONLY : TCOMPO +USE YOMDYNA , ONLY : TDYNA +USE MPL_MODULE, ONLY : MPL_BROADCAST, MPL_BARRIER +USE DISGRID_MOD, ONLY : DISGRID_SEND, DISGRID_RECV +USE GRIB_API, ONLY : GRIB_OPEN_FILE, GRIB_SUCCESS, GRIB_NEW_FROM_FILE, GRIB_END_OF_FILE, GRIB_GET, GRIB_SET,& + & GRIB_RELEASE, GRIB_CLOSE_FILE +! ------------------------------------------------------------------ + +IMPLICIT NONE + +TYPE(GEOMETRY) ,INTENT(IN) :: YDGEOMETRY +TYPE(TDYNA) ,INTENT(IN) :: YDDYNA +TYPE(TMCC) ,INTENT(INOUT) :: YDMCC +TYPE(TCOMPO) ,INTENT(INOUT) :: YDCOMPO +TYPE(MODEL_GENERAL_CONF_TYPE),INTENT(INOUT):: YDML_GCONF +TYPE(TGFL) ,INTENT(INOUT) :: YDGFL +REAL(KIND=JPRB) ,INTENT(IN) :: PTSTEP +! ------------------------------------------------------------------ +INTEGER(KIND=JPIM) :: ILMOIS(12),IDM(3) +INTEGER(KIND=JPIM) :: IINFO(10000,YGFL%NAEROCLIM) +INTEGER(KIND=JPIM) :: ILOENG(YDGEOMETRY%YRDIM%NDGLG) +REAL(KIND=JPRB) :: ZBUF(YDGEOMETRY%YRGEM%NGPTOTG) +REAL(KIND=JPRB) :: ZBUF_2D(YDGEOMETRY%YRGEM%NGPTOTG,YDGEOMETRY%YRDIMV%NFLEVG) +CHARACTER :: CLNOMF*13 +CHARACTER :: CLEVTY*20,CLREPRT*20 + +INTEGER(KIND=JPIM) :: IA, IA0, IADD, IAE, IAN, ICCYY0, ICCYYE,& + & ICOU, ID, IDIF, IDIFD, IDUMY, IEND,& + & IFIRST, IGRIB, ICOUNT, IDGNH,& + & IIM1, IIM2, IJ0, IJDCR, IJE, IJOUR,& + & IJT1, IJT2, IJUL, IJUL0, IJUL1, IJUL2, IJULE,& + & IM, IM0, IME, IMM0, IMME, IMOIS, IMT1,& + & IPARAM, IPARMAL,& + & IBL,& + & IRET, IST, ISTADDE,& + & ITAG, ITIM, ITIME,& + & IYYM0, IYYMD, IZTE, J, JCL, JLEV, JF, JGL,& + & JM, JROF, JSTGLO, JTIM, JY, ISECND + +LOGICAL :: LLFIRST, LLFOUND, LLREAD +INTEGER(KIND=JPIM),SAVE :: IDATEREF=0, IUNITCOMPO +INTEGER(KIND=JPIM) :: IDATE, IBITMAP, IYSDMP,ILEVEL + +REAL(KIND=JPRB) :: ZPOID1, ZPOID2 + +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE + +! ------------------------------------------------------------------ + +#include "abor1.intfb.h" +#include "updcal.intfb.h" + +#include "fcttim.func.h" + +! ------------------------------------------------------------------ + +DATA LLFIRST /.TRUE./ + +! ------------------------------------------------------------------ +IF (LHOOK) CALL DR_HOOK('UPDCLIE_AERCLIM',0,ZHOOK_HANDLE) + +ASSOCIATE(YDDIM=>YDGEOMETRY%YRDIM,YDDIMV=>YDGEOMETRY%YRDIMV,YDGEM=>YDGEOMETRY%YRGEM, YDMP=>YDGEOMETRY%YRMP,YDRIP=>YDML_GCONF%YRRIP,YGFL=>YDML_GCONF%YGFL ) +!ASSOCIATE(NACTAERO=>YGFL%NACTAERO, NCHEM=>YGFL%NCHEM, YCHEM=>YGFL%YCHEM, NGHG=>YGFL%NGHG,LINJ=>YRCOMPO%LINJ, & +ASSOCIATE(NDGLG=>YDDIM%NDGLG, NDGNH=>YDDIM%NDGNH, NDLON=>YDDIM%NDLON, & + & NPROMA=>YDDIM%NPROMA, & + & LPERPET=>YRERAD%LPERPET, & + & NGPTOT=>YDGEM%NGPTOT, NGPTOTG=>YDGEM%NGPTOTG, NHTYP=>YDGEM%NHTYP, & + & NLOENG=>YDGEM%NLOENG, & + & CLIMRAER=>YDMCC%CLIMRAER, LMCCIEC_AERCLIM=>YDMCC%LMCCIEC_AERCLIM, & + & NCLIGC_AERCLIM=>YDMCC%NCLIGC_AERCLIM, NAERCLIM=>YGFL%NAEROCLIM, & + & NDIFC_COMPO=>YDMCC%NDIFC_COMPO, NJDCR_COMPO=>YDMCC%NJDCR_COMPO,NYSDMP_AERCLIM=>YDMCC%NYSDMP_AERCLIM, & + & NPCOMPO_1=>YDMCC%NPCOMPO_1, NPCOMPO_2=>YDMCC%NPCOMPO_2, & + & NUNITCM=>YDMCC%NUNITCM, & + & NSTADD=>YDRIP%NSTADD, NSTOP=>YDRIP%NSTOP, & + & NFLEVG=>YDDIMV%NFLEVG) + +! ------------------------------------------------------------------ +!* + +!* 1.1 Calendar + +IJ0=NDD(NINDAT) +IM0=NMM(NINDAT) +IA0=NCCAA(NINDAT) +CALL UPDCAL(IJ0,IM0,IA0,NSTADD,IJOUR,IMOIS,IAN,ILMOIS,NULOUT) +IF(IJOUR > 15)THEN + IMT1=IMOIS + IJT1=15 + IJT2=15+ILMOIS(IMT1) +ELSE + IMT1=1+MOD(IMOIS+10,12) + IJT1=15-ILMOIS(IMT1) + IJT2=15 +ENDIF + + +!* +! 2. OPEN AND SCAN THE FILE, IF CLIMATE FIELDS REQUIRED +! ----------------------------------------------------- + +!* 2.1 OPEN CLIMATE FILE + +SCANIF:IF(NAERCLIM >= 1.AND.LLFIRST) THEN + + MYPROCIF: IF (MYPROC == 1) THEN + +! ONLY PROCESSOR 1 SHOULD OPEN + + ! CLNOMF='ICMCL'//CNMEXP(1:4)//'INIT_COMPO' + CLNOMF='aeroclim.grib' + WRITE(NULOUT,*) ' READ AER_CLIMATE FIELDS FROM GRIB ' + WRITE(NULOUT,*) ' INITIAL DATA TO BE READ FROM FILE ',CLNOMF + CALL GRIB_OPEN_FILE(IUNITCOMPO,CLNOMF,'r',IRET) + IF(IRET /= GRIB_SUCCESS) THEN + WRITE(NULERR,'(A,I2)')'UPDCLIE_AERCLIM: PROBLEM IN GRIB_OPEN_FILE, IRET=',IRET + CALL ABOR1('UPDCLIE_AERCLIM: PROBLEM IN GRIB_OPEN_FILE') + ENDIF + + +!* 2.2 READ, DECODE HEADERS, CHECK THE FIELDS AND POSITIONS THE FILE + + SCAN: DO JTIM=1,10000 + DO JCL=1,NAERCLIM + DO JLEV=1,NFLEVG + CALL GRIB_NEW_FROM_FILE(IUNITCOMPO,IGRIB,IRET) + IF(IRET == GRIB_END_OF_FILE) THEN + ITIM=JTIM-1 + EXIT SCAN + ELSEIF(IRET /= GRIB_SUCCESS) THEN + WRITE(NULERR,'(A,I2)')'UPDCLIE_AERCLIM: PROBLEM IN GRIB_NEW_FROM_FILE, IRET=',IRET + CALL ABOR1('UPDCLIE_AERCLIM: PROBLEM IN GRIB_NEW_FROM_FILE') + ENDIF + CALL GRIB_GET(IGRIB,'ifsParam',IPARAM) + CALL GRIB_GET(IGRIB,'dataDate',IYYMD) + CALL GRIB_GET(IGRIB,'typeOfLevel',CLEVTY) + CALL GRIB_GET(IGRIB,'gridType',CLREPRT) + CALL GRIB_GET(IGRIB,'level',ILEVEL) + CALL GRIB_GET(IGRIB,'N',IDGNH) + WRITE(NULOUT,'(A,I6,A,I4,A,I8.8,A)')& + & 'UPDCLIE_AERCLIM: PARAMETER ',IPARAM, ' Level ' ,ILEVEL,' FOR DATE ',IYYMD,' FOUND IN CLIMATE FILE' + +! check some parameters + + IF (TRIM(CLREPRT) /= 'regular_gg' .AND. TRIM(CLREPRT) /= 'reduced_gg') THEN + WRITE(NULERR,*) 'UPDCLIE_AERCLIM: UNEXPECTED DATA REPRESENTATION TYPE',CLREPRT + CALL ABOR1(' UPDCLIE_AERCLIM:INVALID DATA REPRESENTATION TYPE') + ENDIF + IF(IDGNH /= NDGNH) THEN + WRITE(NULERR,*) 'UPDCLIE_AERCLIM: RESOLUTION OF MODEL ',NDGNH,', OF INITIAL DATA ',IDGNH + CALL ABOR1(' UPDCLIE_AERCLIM : INVALID DATA RESOLUTION') + ENDIF + IF(TRIM(CLEVTY) /= 'hybrid') THEN + WRITE(NULERR,*) 'UDPCLIE_AERCLIM: UNEXPECTED LEVEL TYPE ', CLEVTY + CALL ABOR1(' UPDCLIE_AERCLIM : INVALID LEVEL TYPE') + ENDIF + + IF( NHTYP /= 0 )THEN + CALL GRIB_GET(IGRIB,'pl',ILOENG) + DO JGL=1,NDGLG + IF( NLOENG(JGL) /= ILOENG(JGL) )THEN + WRITE(NULERR,*) ' UPDCLIE_AERCLIM :' + WRITE(NULERR,*) ' INCONSISTENT REDUCED GRID' + WRITE(NULERR,*) ' IN MODEL ',(NLOENG(J),J=1,NDGLG) + WRITE(NULERR,*) ' IN FILE ',(ILOENG(J),J=1,NDGLG) + CALL ABOR1(' UPDCLIE_AERCLIM : INCONSISTENT REDUCED GRID') + ENDIF + ENDDO + ENDIF + + CALL GRIB_RELEASE(IGRIB) + +! record/communicate field index + + IF( NCLIGC_AERCLIM(JCL) == IPARAM )THEN + IINFO(JTIM,JCL)=IYYMD + ELSE + WRITE(NULERR,'("UPDCLIE_AERCLIM: SKIPPING OVER FIELD,",& + & "GRIB CODE=",I6,", date=",I8)') IPARAM,IYYMD + WRITE(NULERR,'("UPDCLIE_AERCLIM: EXPECTED FIELD,",& + & "GRIB CODE=",I6)') NCLIGC_AERCLIM(JCL) + ! CALL ABOR1(' UPDCLIE_AERCLIM : UNEXPECTED FIELD') + ENDIF + ENDDO ! JLEV + ENDDO ! JCL + ENDDO SCAN + +! Check fields come in a consistent order and position file at the +! right place + + ITIME=NINT(PTSTEP) + IF (YDDYNA%LTWOTL) THEN + IZTE=NINT(PTSTEP*(REAL(NSTOP,JPRB)+0.5_JPRB)) + ELSE + IZTE=ITIME*NSTOP + ENDIF + +!-- + IF (LPERPET) THEN + ISECND=IZTE/NINT(RDAY) + IZTE=IZTE-ISECND*NINT(RDAY) + ENDIF +!-- + + ISTADDE=IZTE/NINT(RDAY) + CALL UPDCAL(IJ0,IM0,IA0,ISTADDE,IJE,IME,IAE,ILMOIS,NULOUT) + IF (LMCCIEC_AERCLIM) THEN + IF (IJOUR > 0) THEN + ICCYY0=IAN + IMM0=IMOIS + ELSE + IMM0=1+MOD(IMOIS+10,12) + IF (IMM0 == 12) THEN + ICCYY0=IAN-1 + ELSE + ICCYY0=IAN + ENDIF + ENDIF + IF (IJE > 0) THEN + IMME=1+MOD(IME,12) + IF (IMME == 1) THEN + ICCYYE=IAE+1 + ELSE + ICCYYE=IAE + ENDIF + ELSE + ICCYYE=IAE + IMME=IME + ENDIF + +! Locates the first field needed + + IYYM0=IMM0+100*ICCYY0 + LLFOUND=.FALSE. + DO J=1,ITIM + IF (IYYM0 == IINFO(J,1)/100) THEN + IFIRST=J + IADD=IINFO(J,1) + LLFOUND=.TRUE. + EXIT + ENDIF + ENDDO + IF (.NOT.LLFOUND) THEN + CALL ABOR1(' UPDCLIE_AERCLIM : FIRST FILE NOT FOUND') + ENDIF + +! Check all fields in the right time order + + ICOU=IFIRST + DO JY=ICCYY0,ICCYYE + IF (JY == ICCYY0) THEN + IIM1=IMM0 + ELSE + IIM1=1 + ENDIF + IF (JY == ICCYYE) THEN + IIM2=IMME + ELSE + IIM2=12 + ENDIF + DO JM=IIM1,IIM2 + IDUMY=JM+100*JY + DO JCL=1,NAERCLIM + IF (IDUMY /= IINFO(ICOU,JCL)/100) THEN + WRITE(NULERR,'(A,I4,A,I6.6,A)')& + & 'UPDCLIE_AERCLIM: FIELD ',NCLIGC_AERCLIM(JCL),' NOT FOUND FOR ',& + & IDUMY,'00' + CALL ABOR1(' UPDCLIE_AERCLIM : FIELD NOT FOUND') + ENDIF + ENDDO + ICOU=ICOU+1 + ENDDO + ENDDO + IDIF=-999 + IJDCR=-999 + + ELSE +! Locates the first field needed + + IJUL0=RJUDAT(IAN,IMOIS,IJOUR) + DO J=1,ITIM + IA=NCCAA(IINFO(J,1)) + IM=NMM(IINFO(J,1)) + ID=NDD(IINFO(J,1)) + IJUL=RJUDAT(IA,IM,ID) + IF (IJUL > IJUL0) THEN + IF (J == 1) THEN + WRITE(NULERR,'(A,I8.8)')& + & 'UPDCLIE_AERCLIM: FIRST FILE IS FOR ',IINFO(J,1) + CALL ABOR1(' UPDCLIE_AERCLIM : FIRST FILE NEEDED NOT FOUND') + ENDIF + IFIRST=J-1 + IADD=IINFO(IFIRST,1) + EXIT + ENDIF + ENDDO + +! Check all fields in the right time order + + IA=NCCAA(IINFO(IFIRST,1)) + IM=NMM(IINFO(IFIRST,1)) + ID=NDD(IINFO(IFIRST,1)) + IJUL1=RJUDAT(IA,IM,ID) + IJDCR=IJUL1 + IA=NCCAA(IINFO(IFIRST+1,1)) + IM=NMM(IINFO(IFIRST+1,1)) + ID=NDD(IINFO(IFIRST+1,1)) + IJUL2=RJUDAT(IA,IM,ID) + IDIF=IJUL2-IJUL1 + IF (NAERCLIM > 1) THEN + DO JCL=2,NAERCLIM + IA=NCCAA(IINFO(IFIRST,JCL)) + IM=NMM(IINFO(IFIRST,JCL)) + ID=NDD(IINFO(IFIRST,JCL)) + IJUL1=RJUDAT(IA,IM,ID) + IA=NCCAA(IINFO(IFIRST+1,JCL)) + IM=NMM(IINFO(IFIRST+1,JCL)) + ID=NDD(IINFO(IFIRST+1,JCL)) + IJUL2=RJUDAT(IA,IM,ID) + IDIFD=IJUL2-IJUL1 + IF (IDIFD /= IDIF) THEN + WRITE(NULERR,'(A,2I20,A,I8)')& + & 'UPDCLIE_AERCLIM: JULIAN DAYS ',IJUL1,IJUL2,' FOR FIELD '& + & ,NCLIGC_AERCLIM(JCL) + WRITE(NULERR,'(A,I8)')'UPDCLIE_AERCLIM: DIFFERENCE EXPECTED ',IDIF + CALL ABOR1(' UPDCLIE_AERCLIM : IRREGULARLY SPACED FIELDS') + ENDIF + ENDDO + ENDIF + DO J=IFIRST+1,ITIM-1 + DO JCL=1,NAERCLIM + IA=NCCAA(IINFO(J,JCL)) + IM=NMM(IINFO(J,JCL)) + ID=NDD(IINFO(J,JCL)) + IJUL1=RJUDAT(IA,IM,ID) + IA=NCCAA(IINFO(J+1,JCL)) + IM=NMM(IINFO(J+1,JCL)) + ID=NDD(IINFO(J+1,JCL)) + IJUL2=RJUDAT(IA,IM,ID) + IDIFD=IJUL2-IJUL1 + IF (IDIFD /= IDIF) THEN + WRITE(NULERR,'(A,2I20,A,I8)')& + & 'UPDCLIE_AERCLIM: JULIAN DAYS ',IJUL1,IJUL2,' FOR FIELD '& + & ,NCLIGC_AERCLIM(JCL) + WRITE(NULERR,'(A,I8)')'UPDCLIE_AERCLIM: DIFFERENCE EXPECTED ',IDIF + CALL ABOR1(' UPDCLIE_AERCLIM : IRREGULARLY SPACED FIELDS') + ENDIF + ENDDO + ENDDO + IJULE=RJUDAT(IAE,IME,IJE) + DO JCL=1,NAERCLIM + IA=NCCAA(IINFO(ITIM,JCL)) + IM=NMM(IINFO(ITIM,JCL)) + ID=NDD(IINFO(ITIM,JCL)) + IJUL2=RJUDAT(IA,IM,ID) + IDIFD=IJULE-IJUL2 + IF (IDIFD > IDIF) THEN + WRITE(NULERR,'(A)')'UPDCLIE_AERCLIM: FILE TOO SHORTJULIAN DAYS ' + WRITE(NULERR,'(A,I20)')'UPDCLIE_AERCLIM: FORECAST ENDS ',IJULE + WRITE(NULERR,'(A,I20)')'UPDCLIE_AERCLIM: CLIMATE DATA ENDS ',IJUL2 + WRITE(NULERR,'(A,I2)')'UPDCLIE_AERCLIM: DIFFERENCE EXPECTED ',IDIF + CALL ABOR1(' UPDCLIE_AERCLIM : IRREGULARLY SPACED FIELDS') + ENDIF + ENDDO + + ENDIF +! Positions the file in the first field needed + + CALL GRIB_CLOSE_FILE(IUNITCOMPO,IRET) + IF( IRET /= GRIB_SUCCESS )THEN + CALL ABOR1(' UPDCLIE_AERCLIM: ERROR ON GRIB_CLOSE_FILE') + ENDIF + CALL GRIB_OPEN_FILE(IUNITCOMPO,CLNOMF,'r') + DO JTIM=1,10000*(NAERCLIM) + CALL GRIB_NEW_FROM_FILE(IUNITCOMPO,IGRIB,IRET) + IF(IRET /= GRIB_SUCCESS) THEN + WRITE(NULERR,'(A,I2)')'UPDCLIE_AERCLIM: PROBLEM IN GRIB_NEW_FROM_FILE, IRET=',IRET + CALL ABOR1('UPDCLIE_AERCLIM: PROBLEM IN GRIB_NEW_FROM_FILE') + ENDIF + CALL GRIB_GET(IGRIB,'dataDate',IYYMD) + IF (IYYMD == IADD) THEN + EXIT + ELSE + CALL GRIB_RELEASE(IGRIB) + ENDIF + ENDDO + +! Pack message + + IDM(1)=IDIF + IDM(2)=IJDCR + IDM(3)=IUNITCOMPO + ENDIF MYPROCIF + +! Broadcast + + ITAG=19591214 + CALL MPL_BROADCAST(IDM,KTAG=ITAG,KROOT=1,CDSTRING='UPDCLIE_AERCLIM') + + NDIFC_COMPO=IDM(1) + NJDCR_COMPO=IDM(2) + NUNITCM=IDM(3) + +ENDIF SCANIF + +!* 3. READ THE FILE, IF NEEDED. +! ----------------------------- + +READIF: IF(NAERCLIM >= 1) THEN + +!* Decide if reading time + IDATE=-999 + IF (LMCCIEC_AERCLIM) THEN + IF (LLFIRST) THEN + IDATEREF=0 + LLREAD=.TRUE. + IFIRST=2 + ELSE + IDATE=IAN*10000+IMOIS*100+IJOUR + WRITE(NULOUT,*) 'IDATE=',IDATE,IDATEREF + IF (IJOUR == 16 .AND. IDATE > IDATEREF) THEN + LLREAD=.TRUE. + IFIRST=1 + ELSE + LLREAD=.FALSE. + IFIRST=1 + ENDIF + ENDIF + ELSE + IF (LLFIRST) THEN + LLREAD=.TRUE. + IFIRST=1 + ELSE + IFIRST=1 + IJUL=RJUDAT(IAN,IMOIS,IJOUR) + LLREAD=NJDCR_COMPO == IJUL + ENDIF + ENDIF + + WRITE(NULOUT,*) 'UPDCLIME_AERCLIM IDATE INFO: ',IDATE,IDATEREF,LLREAD, NJDCR_COMPO,NDIFC_COMPO +!* 3.1 READ, DECODE AND SELECT THE FIELDS + + IF (LLREAD) THEN + FIRST: DO JF=1,IFIRST + IF (LMCCIEC_AERCLIM) THEN + NPCOMPO_1=3-NPCOMPO_1 + NPCOMPO_2=3-NPCOMPO_2 + ELSE + NJDCR_COMPO=NJDCR_COMPO+NDIFC_COMPO + NPCOMPO_1=1 + NPCOMPO_2=1 + ENDIF + READ: DO JCL=1,NAERCLIM + IPARAM=NCLIGC_AERCLIM(JCL) + IF (MYPROC == 1) THEN + DO JLEV=1,NFLEVG + IF (.NOT. (LLFIRST.AND.JF==1.AND.JCL==1.AND.JLEV==1)) THEN + CALL GRIB_NEW_FROM_FILE(IUNITCOMPO,IGRIB,IRET) + IF(IRET /= GRIB_SUCCESS ) THEN + WRITE(NULERR,'(A,I2)')'UPDCLIE_AERCLIM: PROBLEM IN GRIB_NEW_FROM_FILE, IRET=',IRET + CALL ABOR1('UPDCLIE_AERCLIM: PROBLEM IN GRIB_NEW_FROM_INDEX') + ENDIF + ENDIF +!VH Strange/problematic line?! CALL GRIB_SET(IGRIB,'missingValue',19591204.0_JPRB) + CALL GSTATS(1703,0) + CALL GRIB_GET(IGRIB,'values',ZBUF) + CALL GSTATS(1703,1) + CALL GRIB_GET(IGRIB,'bitmapPresent',IBITMAP) + CALL GRIB_GET(IGRIB,'numberOfValues',ICOUNT) + CALL GRIB_GET(IGRIB,'level',ILEVEL) + CALL GRIB_GET(IGRIB,'dataDate',IYYMD) + CALL GRIB_RELEASE(IGRIB) + + WRITE(NULOUT,'(A,I6,A,I8.8,A, I4, A)')& + & 'UPDCLIE_AERCLIM: PARAMETER ',IPARAM, ' FOR DATE ',& + & IYYMD,', LEVEL ',ILEVEL,' READ FROM FILE' + + IDATEREF=IYYMD + ZBUF_2D(:,JLEV)=ZBUF + ENDDO + ENDIF + + !! ! DEBUG INFO + !! WRITE(NULERR,"(A,4I6)"),'SHAPE ZBUF_2D:',SHAPE(ZBUF_2D) + !! WRITE(NULERR,"(A,4I6)"),'SHAPE CLIMRAER:',SHAPE(CLIMRAER(:,1:NFLEVG,NPCOMPO_2,JCL)) + !! WRITE(NULERR,"(A,2I6)"),'other dims:',YDGEOMETRY%YRGEM%NGPTOTG, YDGEOMETRY%YRGEM%NGPTOT + + ! DM communications. + IF (MYPROC == 1) THEN + CALL DISGRID_SEND(YDGEOMETRY,NFLEVG,ZBUF_2D,JCL,CLIMRAER(:,1:NFLEVG,NPCOMPO_2,JCL)) + ELSE + !CALL DISGRID_RECV(YDGEOMETRY%YRGEM,1,NFLEVG,CLIMRAER(:,1:NFLEVG,NPCOMPO_2,JCL),JCL) + CALL DISGRID_RECV(YDGEOMETRY,1,NFLEVG,CLIMRAER(:,1:NFLEVG,NPCOMPO_2,JCL),JCL) + ENDIF + CALL MPL_BARRIER(CDSTRING='UPDCLIE_AERCLIM') + + +! Synchronize IDATEREF + ITAG=19591204 + CALL MPL_BROADCAST(IDATEREF,KTAG=ITAG,KROOT=1,CDSTRING='UPDCLIE_AERCLIM') + ! ENDDO ! JLEV + ENDDO READ + ENDDO FIRST + ENDIF + + IF (LMCCIEC_AERCLIM) THEN + ZPOID1=REAL(IJT2-IJOUR,JPRB)/REAL(IJT2-IJT1,JPRB) + ZPOID2=1.0_JPRB-ZPOID1 + ENDIF + + +! Fill GFL array ! make openmp + DO IPARMAL=1,NAERCLIM + IYSDMP=NYSDMP_AERCLIM(IPARMAL) + IF (LMCCIEC_AERCLIM) THEN + DO JLEV=1,NFLEVG + DO JSTGLO=1,NGPTOT,NPROMA + IEND=MIN(NPROMA,NGPTOT-JSTGLO+1) + IST=1 + IBL=(JSTGLO-1)/NPROMA+1 + DO JROF =1,IEND + YDGFL%GFL(JROF,JLEV,IYSDMP,IBL)=CLIMRAER(JSTGLO+JROF-1,JLEV,NPCOMPO_1,IPARMAL)*ZPOID1 & + & +CLIMRAER(JSTGLO+JROF-1,JLEV,NPCOMPO_2,IPARMAL)*ZPOID2 + ENDDO + ENDDO + ENDDO + ELSE + DO JLEV=1,NFLEVG + DO JSTGLO=1,NGPTOT,NPROMA + IEND=MIN(NPROMA,NGPTOT-JSTGLO+1) + IST=1 + IBL=(JSTGLO-1)/NPROMA+1 + DO JROF =1,IEND + YDGFL%GFL(JROF,JLEV,IYSDMP,IBL)=CLIMRAER(JSTGLO+JROF-1,JLEV,NPCOMPO_2,IPARMAL) + ENDDO + ENDDO + ENDDO + ENDIF + ENDDO + +ENDIF READIF + +LLFIRST=.FALSE. + +WRITE(NULOUT,*) 'UPDCLIE_AERCLIM finished' +CALL FLUSH(NULOUT) + +! ------------------------------------------------------------------ +END ASSOCIATE +END ASSOCIATE +IF (LHOOK) CALL DR_HOOK('UPDCLIE_AERCLIM',1,ZHOOK_HANDLE) +END SUBROUTINE UPDCLIE_AERCLIM diff --git a/ifs-source/arpifs/control/cnt4.F90 b/ifs-source/arpifs/control/cnt4.F90 index 94367a65..78f57308 100644 --- a/ifs-source/arpifs/control/cnt4.F90 +++ b/ifs-source/arpifs/control/cnt4.F90 @@ -393,7 +393,7 @@ SUBROUTINE CNT4(YDGEOMETRY,YDFIELDS,YDMTRAJ,YDMODEL,YDJOT,YDVARBC,YDTCV,YDGOM5,Y IF (.NOT. LNF) THEN TDT=TSTEP NSTEP=0 - CALL UPDTIM(YDGEOMETRY,YDFIELDS%YRSURF,YDMODEL,0,TDT,TSTEP,.FALSE.) + CALL UPDTIM(YDGEOMETRY,YDFIELDS,YDMODEL,0,TDT,TSTEP,.FALSE.) ENDIF IF ((NCONF == 1.OR.NCONF == 302).AND.NSTOP > 0 .AND. LNF .AND. .NOT.FP_SERV_C001%LFP_SERVER) THEN @@ -646,9 +646,9 @@ SUBROUTINE CNT4(YDGEOMETRY,YDFIELDS,YDMTRAJ,YDMODEL,YDJOT,YDVARBC,YDTCV,YDGOM5,Y LLFOUND = .FALSE. ENDIF IF (LLFOUND) THEN - CALL UPDTIM(YDGEOMETRY,YDFIELDS%YRSURF,YDMODEL,JSTEP,TDT,TSTEP,.TRUE.,PI05=ZI05) + CALL UPDTIM(YDGEOMETRY,YDFIELDS,YDMODEL,JSTEP,TDT,TSTEP,.TRUE.,PI05=ZI05) ELSE - CALL UPDTIM(YDGEOMETRY,YDFIELDS%YRSURF,YDMODEL,JSTEP,TDT,TSTEP,.TRUE.) + CALL UPDTIM(YDGEOMETRY,YDFIELDS,YDMODEL,JSTEP,TDT,TSTEP,.TRUE.) ENDIF ! Update ocean fields from if previus time step was a coupled time step ! or we are at the beginning of the run. diff --git a/ifs-source/arpifs/control/stepx.F90 b/ifs-source/arpifs/control/stepx.F90 index 9908bbe6..e32b2a96 100644 --- a/ifs-source/arpifs/control/stepx.F90 +++ b/ifs-source/arpifs/control/stepx.F90 @@ -132,7 +132,7 @@ SUBROUTINE STEPX(YDGEOMETRY,YDFIELDS,YDMTRAJ,YDMODEL) CALL OPDIS(CLCONF,'STEPX ',ZCT,ZVT,ZWT,RSTART,RTIMEF,NSTEP,YDDYNA%LNHDYN) ENDIF - CALL UPDTIM(YDGEOMETRY,YDFIELDS%YRSURF,YDMODEL,0,YDRIP%TSTEP,YDRIP%TSTEP,.FALSE.) + CALL UPDTIM(YDGEOMETRY,YDFIELDS,YDMODEL,0,YDRIP%TSTEP,YDRIP%TSTEP,.FALSE.) #ifdef WITH_NEMO IF(YDMODEL%YRML_AOC%YRMCC%LMCC04.AND.YDMODEL%YRML_AOC%YRMCC%LNEMOCOUP) THEN CALL GSTATS(33,0) diff --git a/ifs-source/arpifs/module/model_mod_model_ini_phys.F90 b/ifs-source/arpifs/module/model_mod_model_ini_phys.F90 index dd7c812f..78b23f81 100644 --- a/ifs-source/arpifs/module/model_mod_model_ini_phys.F90 +++ b/ifs-source/arpifs/module/model_mod_model_ini_phys.F90 @@ -113,7 +113,7 @@ MODULE SUBROUTINE MODEL_INI_PHYS(SELF, YDFIELDS, YDTIME) ENDIF CALL SETRIP0(YDTIME) -CALL UPDTIM(YDFIELDS%GEOM,YDFIELDS%YRSURF,SELF,NSTEP, & +CALL UPDTIM(YDFIELDS%GEOM,YDFIELDS,SELF,NSTEP, & & SELF%YRML_GCONF%YRRIP%TDT,SELF%YRML_GCONF%YRRIP%TSTEP,.TRUE.) IF (SELF%YRML_PHY_EC%YREPHY%LEPHYS.OR. & & (SELF%YRML_PHY_MF%YRPHY%LMPHYS.AND.SELF%YRML_PHY_MF%YRPHY%LRAYFM)) THEN diff --git a/ifs-source/arpifs/module/model_mod_model_step.F90 b/ifs-source/arpifs/module/model_mod_model_step.F90 index 1f1c09a4..77a46605 100644 --- a/ifs-source/arpifs/module/model_mod_model_step.F90 +++ b/ifs-source/arpifs/module/model_mod_model_step.F90 @@ -98,7 +98,7 @@ MODULE SUBROUTINE MODEL_STEP(SELF, YDFIELDS, YDTIME, KSECS, YDERRMOD_FIELDS, LDC ! Set time-step and update time of the model CALL SETRIPSTEP(SELF%YRML_GCONF%YRRIP%TSTEP, YDTIME, KSECS) -CALL UPDTIM(YDFIELDS%GEOM,YDFIELDS%YRSURF,SELF,NSTEP, & +CALL UPDTIM(YDFIELDS%GEOM,YDFIELDS,SELF,NSTEP, & & SELF%YRML_GCONF%YRRIP%TDT,SELF%YRML_GCONF%YRRIP%TSTEP,LLCLUPD) CALL DATE_AND_TIME(CLDAT(1),CLTIMEOD,CLDAT(3),IVALUES) diff --git a/ifs-source/arpifs/module/yommcc.F90 b/ifs-source/arpifs/module/yommcc.F90 index 4bf3799a..fb5df51f 100644 --- a/ifs-source/arpifs/module/yommcc.F90 +++ b/ifs-source/arpifs/module/yommcc.F90 @@ -78,6 +78,8 @@ MODULE YOMMCC ! LMCCIEC_COMPO= .T. ===> THE BOUNDARY CONDITIONS FOR COMPOSITION FLUXES ARE INTERPOLATED IN TIME ( NOT DEFAULT) ! CLIMATOLOGY FILES ! = .F. ===> THEY ARE NOT INTERPOLATED +! LMCCIEC_AERCLIM= .T. ===> THE BOUNDARY CONDITIONS FOR SULFUR OXIDANTS ARE INTERPOLATED IN TIME +! = .F. ===> THEY ARE NOT INTERPOLATED ! LMCCICEIC= .T. ===> ICE INITIAL CONDITIONS SENT TO COUPLER AT STARTUP ! =.F ===> NO OUTPUT OF ICE ! LFIRSTUPD ===> TRUE UNTIL UPDCLIE HAS BEEN CALLED @@ -154,6 +156,11 @@ MODULE YOMMCC ! pointer to YSD SD_VF array for input field INTEGER(KIND=JPIM) :: NYSDMP_COMPO(NPEMIS2D+NPEMIS2DAUX+JPCHEM+2) INTEGER(KIND=JPIM) :: NCLIMR_COMPO + ! To read prescribed oxidants for SO2-SO4 scheme + INTEGER(KIND=JPIM) :: NCLIGC_AERCLIM(10) + INTEGER(KIND=JPIM) :: NYSDMP_AERCLIM(10) + INTEGER(KIND=JPIM) :: NPAERCLIM_1,NPAERCLIM_2 + INTEGER(KIND=JPIM) :: NCLIAER(16) INTEGER(KIND=JPIM) :: NDIFC INTEGER(KIND=JPIM) :: NJDCR @@ -171,7 +178,7 @@ MODULE YOMMCC INTEGER(KIND=JPIM) :: NUNITCM INTEGER(KIND=JPIM) :: NOACOMM INTEGER(KIND=JPIM) :: NSSTICEOP - REAL(KIND=JPRB),ALLOCATABLE:: CLIMRCO2(:,:,:),CLIMRAER(:,:,:),CLIMRCOMPO(:,:,:),ZLAKE(:,:,:),OCEANBC(:,:) + REAL(KIND=JPRB),ALLOCATABLE:: CLIMRCO2(:,:,:),CLIMRAER(:,:,:,:),CLIMRCOMPO(:,:,:),ZLAKE(:,:,:),OCEANBC(:,:) REAL(KIND=JPRD), ALLOCATABLE :: CLIMR(:,:,:) @@ -189,6 +196,7 @@ MODULE YOMMCC LOGICAL :: LMCCEC LOGICAL :: LMCCIEC LOGICAL :: LMCCIEC_COMPO + LOGICAL :: LMCCIEC_AERCLIM LOGICAL :: LMCCICEIC LOGICAL :: LMCCDYNSEAICE LOGICAL :: LNEMOCOUP diff --git a/ifs-source/arpifs/phys_ec/su_aerw.F90 b/ifs-source/arpifs/phys_ec/su_aerw.F90 index 3012c1c5..b830e86b 100644 --- a/ifs-source/arpifs/phys_ec/su_aerw.F90 +++ b/ifs-source/arpifs/phys_ec/su_aerw.F90 @@ -429,6 +429,8 @@ SUBROUTINE SU_AERW(YDMODEL) !- NAERWND = 2 for wind+gust in dust emission !- NAERWND = 3 for wind+gust in sea salt and dust emissions +!-- Sulphate scheme + NSO4SCHEME = 2 WRITE(UNIT=NULOUT,FMT='('' NAERWND= '',I1)') & & NAERWND diff --git a/ifs-source/arpifs/setup/su0yomb.F90 b/ifs-source/arpifs/setup/su0yomb.F90 index ee404cd3..c33e1adb 100644 --- a/ifs-source/arpifs/setup/su0yomb.F90 +++ b/ifs-source/arpifs/setup/su0yomb.F90 @@ -505,7 +505,7 @@ SUBROUTINE SU0YOMB(YDFPOS,YDGEOMETRY,YDFIELDS,YDMTRAJ,YDMODEL,YDJOT,YDVARBC,YDTC WRITE(NULOUT,*) '---- Set up MCC climate model keys (lagged part) --',CLINE CALL SUMCCLAG(YDGEM,YDMODEL%YRML_GCONF,YDMODEL%YRML_AOC,YDMODEL%YRML_CHEM%YRCOMPO, & & YDMODEL%YRML_CHEM%YRCHEM, YDMODEL%YRML_PHY_AER%YREAERSRC, & - & YDMODEL%YRML_PHY_EC%YREPHY, NULOUT, YDSURF=YDSURF) + & YDMODEL%YRML_PHY_EC%YREPHY, NULOUT, YDSURF=YDSURF, NFLEVG=YDDIMV%NFLEVG) ENDIF !* Initialize cumulated fluxes requests diff --git a/ifs-source/arpifs/setup/sumcc.F90 b/ifs-source/arpifs/setup/sumcc.F90 index ce15862d..f173676f 100644 --- a/ifs-source/arpifs/setup/sumcc.F90 +++ b/ifs-source/arpifs/setup/sumcc.F90 @@ -81,7 +81,7 @@ SUBROUTINE SUMCC(YDMCC,YDEPHY,KULOUT) LOGICAL, POINTER :: LCURR, LGELATO, LMCC01_MSE, LMCC01, LMCC02, LMCC03, LMCC04, & & LMCC05, LMCCEC, LMCCIEC, LMCCICEIC, LNEMOCOUP, LNEMOFLUXNC, LNEMO1WAY, & & LMCCDYNSEAICE, LNEMOLIMGET, LNEMOLIMPUT, LNEMOLIMALB, LNEMOLIMTEMP, & - & LNEMOLIMTHK, LMULTIYR, LMCC_COMPO, LMCCIEC_COMPO, LNEMOATMFLDS, LNEMOIFSLOG, LNEMOSSTFREEZ,& + & LNEMOLIMTHK, LMULTIYR, LMCC_COMPO, LMCCIEC_COMPO, LMCCIEC_AERCLIM, LNEMOATMFLDS, LNEMOIFSLOG, LNEMOSSTFREEZ,& & LNEMOLIMTLVL, LESICE, LNEMOOCEICEMIX,LNEMOQNSICEFILT, LNEMOSICOUP, LNEMOGRIBFLDS,& & LNEMOPARTCOUP,LNEMOPARTMASK,LNEMOPARTMASKFILE,LNEMOGRIB3D,LNEMOGRIBMASK, L2DECV2NEMO,& & LNEMOOUTGRB,LCOUPINFOUT @@ -128,6 +128,7 @@ SUBROUTINE SUMCC(YDMCC,YDEPHY,KULOUT) LMULTIYR => YDMCC%LMULTIYR LMCC_COMPO => YDMCC%LMCC_COMPO LMCCIEC_COMPO => YDMCC%LMCCIEC_COMPO +LMCCIEC_AERCLIM => YDMCC%LMCCIEC_AERCLIM LNEMOATMFLDS => YDMCC%LNEMOATMFLDS LNEMOIFSLOG => YDMCC%LNEMOIFSLOG NSSTICEOP => YDMCC%NSSTICEOP @@ -179,6 +180,7 @@ SUBROUTINE SUMCC(YDMCC,YDEPHY,KULOUT) LNEMOGRIBFLDS=.FALSE. LMULTIYR=.FALSE. LMCCIEC_COMPO= .FALSE. +LMCCIEC_AERCLIM= .TRUE. LMCC_COMPO=.FALSE. NSSTICEOP=9 LNEMOGRIB3D=.FALSE. diff --git a/ifs-source/arpifs/setup/sumcclag.F90 b/ifs-source/arpifs/setup/sumcclag.F90 index e6c414ed..5b0ea7ea 100644 --- a/ifs-source/arpifs/setup/sumcclag.F90 +++ b/ifs-source/arpifs/setup/sumcclag.F90 @@ -9,7 +9,7 @@ ! (C) Copyright 1989- Meteo-France. ! -SUBROUTINE SUMCCLAG(YDGEM,YDML_GCONF,YDML_AOC,YDCOMPO,YDCHEM,YDEAERSRC,YDEPHY,KULOUT,YDSURF) +SUBROUTINE SUMCCLAG(YDGEM,YDML_GCONF,YDML_AOC,YDCOMPO,YDCHEM,YDEAERSRC,YDEPHY,KULOUT,YDSURF, NFLEVG) !**** *SUMCCLAG* * - ROUTINE TO INITIALIZE SWITCHES FOR THE CLIMATE VERSION @@ -91,7 +91,8 @@ SUBROUTINE SUMCCLAG(YDGEM,YDML_GCONF,YDML_AOC,YDCOMPO,YDCHEM,YDEAERSRC,YDEPHY,KU TYPE(TEPHY) , INTENT(INOUT) :: YDEPHY INTEGER(KIND=JPIM) , INTENT(IN) :: KULOUT TYPE(TSURF) , OPTIONAL, INTENT(IN) :: YDSURF -INTEGER(KIND=JPIM) :: IOPROC, ISTEP, ITIM, IT, IC, ICHEMFLX +INTEGER(KIND=JPIM) , OPTIONAL, INTENT(IN) :: NFLEVG +INTEGER(KIND=JPIM) :: IOPROC, ISTEP, ITIM, IT, IC, ICHEMFLX,ITIM_AERCLIM REAL(KIND=JPHOOK) :: ZHOOK_HANDLE LOGICAL :: LLP, LLELAIV, LLMODISALBEDO @@ -115,6 +116,7 @@ SUBROUTINE SUMCCLAG(YDGEM,YDML_GCONF,YDML_AOC,YDCOMPO,YDCHEM,YDEAERSRC,YDEPHY,KU & LMCC03 => YDML_AOC%YRMCC%LMCC03, LMCC04 => YDML_AOC%YRMCC%LMCC04, & & LMCC05 => YDML_AOC%YRMCC%LMCC05, LMCCEC => YDML_AOC%YRMCC%LMCCEC, & & LMCCIEC => YDML_AOC%YRMCC%LMCCIEC, LMCCIEC_COMPO => YDML_AOC%YRMCC%LMCCIEC_COMPO, & + & LMCCIEC_AERCLIM => YDML_AOC%YRMCC%LMCCIEC_AERCLIM, & & LMCC_COMPO => YDML_AOC%YRMCC%LMCC_COMPO, LNEMO1WAY => YDML_AOC%YRMCC%LNEMO1WAY, & & LNEMOCOUP => YDML_AOC%YRMCC%LNEMOCOUP, LNEMOLIMGET => YDML_AOC%YRMCC%LNEMOLIMGET, & & LNEMOLIMPUT => YDML_AOC%YRMCC%LNEMOLIMPUT, NCLIGC => YDML_AOC%YRMCC%NCLIGC, & @@ -131,7 +133,12 @@ SUBROUTINE SUMCCLAG(YDGEM,YDML_GCONF,YDML_AOC,YDCOMPO,YDCHEM,YDEAERSRC,YDEPHY,KU & NPCO2_2 => YDML_AOC%YRMCC%NPCO2_2, LEOCLAKE => YDEPHY%LEOCLAKE, & & LEOBC => YDEPHY%LEOBC, LEOBCICE => YDEPHY%LEOBCICE, & & KCHEM_DRYDEP => YDCHEM%KCHEM_DRYDEP, LNEEONLINE => YDEPHY%LNEEONLINE, & - & YDCOM => YDML_AOC%YRCOM, YDMCC => YDML_AOC%YRMCC) + & YDCOM => YDML_AOC%YRCOM, YDMCC => YDML_AOC%YRMCC, & + & NSO4SCHEME => YDEAERSRC%NSO4SCHEME, NYSDMP_AERCLIM => YDML_AOC%YRMCC%NYSDMP_AERCLIM,& + & NPAERCLIM_1 => YDML_AOC%YRMCC%NPAERCLIM_1, NPAERCLIM_2 => YDML_AOC%YRMCC%NPAERCLIM_2, & + & NCLIGC_AERCLIM=>YDML_AOC%YRMCC%NCLIGC_AERCLIM, NAEROCLIM => YDML_GCONF%YGFL%NAEROCLIM, & + & YAEROCLIM_NL =>YDML_GCONF%YGFL%YAEROCLIM_NL) + ! ---------------------------------------------------------------- !* 1. CALCULATIONS. @@ -460,6 +467,47 @@ SUBROUTINE SUMCCLAG(YDGEM,YDML_GCONF,YDML_AOC,YDCOMPO,YDCHEM,YDEAERSRC,YDEPHY,KU WRITE(KULOUT,"(1X,3I10)") IT, NCLIGC_COMPO(IT), NYSDMP_COMPO(IT) ENDDO + + +!VH Add stuff associated to 3D aerosol climatology + IF( NSO4SCHEME == 2 ) THEN + + IF (LMCCIEC_AERCLIM) THEN !THE 3D fields ARE INTERPOLATED IN TIME + NPAERCLIM_1=1 + NPAERCLIM_2=2 + !NPCOMPO_1=1 + !NPCOMPO_2=2 + ITIM_AERCLIM=2 + ELSE !THE FLUXES ARE NOT INTERPOLATED IN TIME + NPAERCLIM_1=1 + NPAERCLIM_2=NPAERCLIM_1 + !NPCOMPO_1=1 + !NPCOMPO_2=NPCOMPO_1 + ITIM_AERCLIM=1 + ENDIF + + DO IT=1,NAEROCLIM + NCLIGC_AERCLIM(IT) = YAEROCLIM_NL(IT)%IGRBCODE + NYSDMP_AERCLIM(IT) = YDML_GCONF%YGFL%YAEROCLIM(IT)%MP + ENDDO + + ! allocate communication array + ALLOCATE(YDML_AOC%YRMCC%CLIMRAER(NGPTOT,NFLEVG,ITIM_AERCLIM,NAEROCLIM)) + !ALLOCATE(YDML_AOC%YRMCC%CLIMRAER(NGPTOT,NFLEVG,NAEROCLIM)) !!! default array is 3 dims instead of 4 dims + + WRITE(KULOUT,"(1X,'ARRAY ',A10,' ALLOCATED ',10I8)")& + & 'CLIMRAER ',SIZE(YDML_AOC%YRMCC%CLIMRAER),SHAPE(YDML_AOC%YRMCC%CLIMRAER) + + WRITE(KULOUT,"(1X,A20)") ' EXPECTED ORDER ' + DO IT=1,NAEROCLIM + WRITE(KULOUT,"(1X,3I10)") IT, NCLIGC_AERCLIM(IT), NYSDMP_AERCLIM(IT) + ENDDO + + ENDIF + + + + ENDIF ! Composition part ENDIF ! END BOUNDARY CONDITIONS UPDATED BY ECMWF ROUTINES diff --git a/ifs-source/arpifs/utility/updtim.F90 b/ifs-source/arpifs/utility/updtim.F90 index 55b30431..2b2df032 100644 --- a/ifs-source/arpifs/utility/updtim.F90 +++ b/ifs-source/arpifs/utility/updtim.F90 @@ -9,7 +9,7 @@ ! (C) Copyright 1989- Meteo-France. ! -SUBROUTINE UPDTIM(YDGEOMETRY,YDSURF,YDMODEL,KSTEP,PTDT,PTSTEP,LDCLUPD,LDUPDECAEC,PI05) +SUBROUTINE UPDTIM(YDGEOMETRY,YDFIELDS,YDMODEL,KSTEP,PTDT,PTSTEP,LDCLUPD,LDUPDECAEC,PI05) !**** *UPDTIM* - UPDATE TIME OF THE MODEL @@ -96,6 +96,7 @@ SUBROUTINE UPDTIM(YDGEOMETRY,YDSURF,YDMODEL,KSTEP,PTDT,PTSTEP,LDCLUPD,LDUPDECAEC ! R Hogan (Jan 2019) Removed stuff for old cycle 15 radiation scheme ! ------------------------------------------------------------------ +USE FIELDS_MOD , ONLY : FIELDS USE TYPE_MODEL , ONLY : MODEL USE GEOMETRY_MOD , ONLY : GEOMETRY USE SURFACE_FIELDS_MIX , ONLY : TSURF @@ -119,7 +120,9 @@ SUBROUTINE UPDTIM(YDGEOMETRY,YDSURF,YDMODEL,KSTEP,PTDT,PTSTEP,LDCLUPD,LDUPDECAEC IMPLICIT NONE TYPE(GEOMETRY) ,INTENT(IN) :: YDGEOMETRY -TYPE(TSURF) ,INTENT(INOUT) :: YDSURF + +!TYPE(TSURF) ,INTENT(INOUT) :: YDSURF +TYPE(FIELDS), INTENT(INOUT) :: YDFIELDS TYPE(MODEL) ,INTENT(INOUT) :: YDMODEL INTEGER(KIND=JPIM) ,INTENT(IN) :: KSTEP REAL(KIND=JPRB) ,INTENT(IN) :: PTDT @@ -177,6 +180,7 @@ SUBROUTINE UPDTIM(YDGEOMETRY,YDSURF,YDMODEL,KSTEP,PTDT,PTSTEP,LDCLUPD,LDUPDECAEC #include "updrgas.intfb.h" #include "su_aervole.intfb.h" #include "updclie_compo.intfb.h" +#include "updclie_aerclim.intfb.h" #include "fctast.func.h" #include "fcttim.func.h" @@ -187,17 +191,19 @@ SUBROUTINE UPDTIM(YDGEOMETRY,YDSURF,YDMODEL,KSTEP,PTDT,PTSTEP,LDCLUPD,LDUPDECAEC IF (LHOOK) CALL DR_HOOK('UPDTIM',0,ZHOOK_HANDLE) ASSOCIATE(YDDIM=>YDGEOMETRY%YRDIM,YDDIMV=>YDGEOMETRY%YRDIMV,YDGEM=>YDGEOMETRY%YRGEM, YDMP=>YDGEOMETRY%YRMP, & & YDPHY=>YDMODEL%YRML_PHY_MF%YRPHY,YDEAERVOL=>YDMODEL%YRML_PHY_AER%YREAERVOL,YDMCC=>YDMODEL%YRML_AOC%YRMCC, & - & YDRIP=>YDMODEL%YRML_GCONF%YRRIP,YDDPHY=>YDMODEL%YRML_PHY_G%YRDPHY,YDERAD=>YDMODEL%YRML_PHY_RAD%YRERAD, & - & YDARPHY=>YDMODEL%YRML_PHY_MF%YRARPHY,YDEUVRAD=>YDMODEL%YRML_PHY_RAD%YREUVRAD,YDERIP=>YDMODEL%YRML_PHY_RAD%YRERIP, & - & YDEPHLI=>YDMODEL%YRML_PHY_SLIN%YREPHLI,YDPHY3=>YDMODEL%YRML_PHY_MF%YRPHY3,YDPHY2=>YDMODEL%YRML_PHY_MF%YRPHY2, & - & YDEAERSRC=>YDMODEL%YRML_PHY_AER%YREAERSRC,YGFL=>YDMODEL%YRML_GCONF%YGFL,YDEPHY=>YDMODEL%YRML_PHY_EC%YREPHY, & - & YDERDI=>YDMODEL%YRML_PHY_RAD%YRERDI, YDSIMPHL=>YDMODEL%YRML_PHY_MF%YRSIMPHL,YDDYNA=>YDMODEL%YRML_DYN%YRDYNA) + & YDRIP=>YDMODEL%YRML_GCONF%YRRIP,YDDPHY=>YDMODEL%YRML_PHY_G%YRDPHY,YDERAD=>YDMODEL%YRML_PHY_RAD%YRERAD, & + & YDARPHY=>YDMODEL%YRML_PHY_MF%YRARPHY,YDEUVRAD=>YDMODEL%YRML_PHY_RAD%YREUVRAD,YDERIP=>YDMODEL%YRML_PHY_RAD%YRERIP, & + & YDEPHLI=>YDMODEL%YRML_PHY_SLIN%YREPHLI,YDPHY3=>YDMODEL%YRML_PHY_MF%YRPHY3,YDPHY2=>YDMODEL%YRML_PHY_MF%YRPHY2, & + & YDEAERSRC=>YDMODEL%YRML_PHY_AER%YREAERSRC,YGFL=>YDMODEL%YRML_GCONF%YGFL,YDEPHY=>YDMODEL%YRML_PHY_EC%YREPHY, & + & YDERDI=>YDMODEL%YRML_PHY_RAD%YRERDI, YDSIMPHL=>YDMODEL%YRML_PHY_MF%YRSIMPHL,YDDYNA=>YDMODEL%YRML_DYN%YRDYNA, & + & YDSURF=>YDFIELDS%YRSURF, YDGFL=> YDFIELDS%YRGFL) ASSOCIATE(NAERO=>YGFL%NAERO, & & NSMAX=>YDDIM%NSMAX, & & NFLEVG=>YDDIMV%NFLEVG, & & NTSSG=>YDDPHY%NTSSG, & & RCODECA=>YDEAERSRC%RCODECA, RCOVSRA=>YDEAERSRC%RCOVSRA, & & RSIDECA=>YDEAERSRC%RSIDECA, RSIVSRA=>YDEAERSRC%RSIVSRA, & + & NSO4SCHEME=>YDEAERSRC%NSO4SCHEME, & & NVOLERUP=>YDEAERVOL%NVOLERUP, & & LPHYLIN=>YDEPHLI%LPHYLIN, & & LEO3CH=>YDEPHY%LEO3CH, LEOCML=>YDEPHY%LEOCML, LOCMLTKE=>YDEPHY%LOCMLTKE, & @@ -908,6 +914,15 @@ SUBROUTINE UPDTIM(YDGEOMETRY,YDSURF,YDMODEL,KSTEP,PTDT,PTSTEP,LDCLUPD,LDUPDECAEC ENDIF ENDIF + +! update climatology for SO2 oxidation + IF(.NOT.LSCMEC) THEN + IF ( NSO4SCHEME == 2 ) THEN + CALL UPDCLIE_AERCLIM(YDGEOMETRY,YDDYNA,YDMODEL%YRML_CHEM%YRCOMPO,YDMCC,YDGFL,YDMODEL%YRML_GCONF,PTSTEP) + ENDIF + ENDIF + + ! Updates climatology (SST) ECMWF style IF(.NOT.LSCMEC) THEN diff --git a/ifs-source/scmec/source/cnt41c.F90 b/ifs-source/scmec/source/cnt41c.F90 index be2c3c54..3621878f 100644 --- a/ifs-source/scmec/source/cnt41c.F90 +++ b/ifs-source/scmec/source/cnt41c.F90 @@ -168,7 +168,7 @@ SUBROUTINE CNT41C(YDGEOMETRY,YDMODEL,YDFIELDS) !* 3.2 RESET OF TIME DEPENDENT CONSTANTS. ! ---------------------------------- - CALL UPDTIM(YDGEOMETRY,YDFIELDS%YRSURF,YDMODEL,JSTEP,TDT,TSTEP,.FALSE.) + CALL UPDTIM(YDGEOMETRY,YDFIELDS,YDMODEL,JSTEP,TDT,TSTEP,.FALSE.) !* 3.3 FREQUENCY OF FULL-RADIATION COMPUTATIONS. ! ----------------------------------------- From 064a36fa57ab07ce4a02122a7cf5090bf6f991ae Mon Sep 17 00:00:00 2001 From: Lianghai Wu Date: Fri, 14 Feb 2025 10:08:35 +0000 Subject: [PATCH 067/129] Add comment OIFS-592 --- ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index 1d4382d6..5b73a17b 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -1264,7 +1264,7 @@ SUBROUTINE HAMM7_INTERFACE( & ZDPOG=1.0/RG*(PRS1(JL,JK)-PRS1(JL,JK-1)) !-- cloud and ice water path in kg m-2 - ZQIWP =MAX(0._JPRB,ZDPOG*PIP(JL,JK)*ZTEMP) + ZQIWP =MAX(0._JPRB,ZDPOG*PIP(JL,JK)*ZTEMP)!!!!jira 592 ZQLWP(JL,JK) =MAX(0._JPRB,ZDPOG*PLP(JL,JK)*ZTEMP) !-- cloud and ice water content in g m-3 ZPODT=1.0/RD*PRSF1(JL,JK)/PTP(JL,JK) From c624d7dd55ff338dbedfebc11651980662e79bd6 Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Wed, 7 May 2025 17:30:55 +0200 Subject: [PATCH 068/129] Rename ZTSO4 as ZTSO4_GAS --- ifs-source/arpifs/chem/chem_main.F90 | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ifs-source/arpifs/chem/chem_main.F90 b/ifs-source/arpifs/chem/chem_main.F90 index bf78cbf9..9af80e5b 100644 --- a/ifs-source/arpifs/chem/chem_main.F90 +++ b/ifs-source/arpifs/chem/chem_main.F90 @@ -258,7 +258,7 @@ SUBROUTINE CHEM_MAIN & REAL(KIND=JPRB) :: ZEMIS(KLON,KLEV,3) ! 3 especes emises par l'aviation, parametrisation à implementer REAL(KIND=JPRB) :: ZAREAD_NAT(KLON,KLEV),ZAREAD_ICE(KLON,KLEV),ZAREAD_SUL(KLON,KLEV) REAL(KIND=JPRB) :: ZSO4_LPROD(KLON,KLEV) -REAL(KIND=JPRB) :: ZTSO2(KLON,KLEV), ZTSO4(KLON,KLEV), ZTSO4_AQ(KLON,KLEV), ZITSO2(KLON,KLEV) +REAL(KIND=JPRB) :: ZTSO2(KLON,KLEV), ZTSO4_GAS(KLON,KLEV), ZTSO4_AQ(KLON,KLEV), ZITSO2(KLON,KLEV) REAL(KIND=JPRB) :: ZSO2(KLON,KLEV), ZFSO2(KLON,KLEV), ZFSO4_AQ(KLON,KLEV), ZFSO4(KLON,KLEV) LOGICAL :: LLCHECK_METEO, LLTENDUPDT !------------------------------------------------------------------------ @@ -831,7 +831,7 @@ SUBROUTINE CHEM_MAIN & DO JK=1,KLEV DO JL=KIDIA,KFDIA !ZTSO2(JL,JK) = PTENC(JL,JK,ISSO2) - !ZTSO4(JL,JK) = PTENC(JL,JK,ISSO4) + !ZTSO4_GAS(JL,JK) = PTENC(JL,JK,ISSO4) !ZTSO4_AQ(JL,JK) = PTENC(JL,JK,ISSO4_ACS)! liquid phase !ZSO2(JL,JK) = PAEROP(JL,JK,ISSO2) ZSO2(JL,JK) = ZCON(JL,JK,ISSO2) ! SO2 concentration @@ -846,7 +846,7 @@ SUBROUTINE CHEM_MAIN & & PGFL(:,:, YGFL%YAEROCLIM(1)%MP), & & PGFL(:,:,YGFL%YAEROCLIM(2)%MP), & & PGFL(:,:,YGFL%YAEROCLIM(3)%MP) , & - & ZTSO2 , ZTSO4(:,:), ZTSO4_AQ, ZFSO2, ZFSO4, ZFSO4_AQ, ZDELP) + & ZTSO2 , ZTSO4_GAS, ZTSO4_AQ, ZFSO2, ZFSO4, ZFSO4_AQ, ZDELP) DO JK=1,KLEV DO JL=KIDIA,KFDIA @@ -854,11 +854,11 @@ SUBROUTINE CHEM_MAIN & !PTENC(JL,JK,ISSO2) = PTENC(JL,JK,ISSO2)+ZTSO2(JL,JK) !ZTENC1(JL,JK,ISSO2) = ZTENC1(JL,JK,ISSO2)+ZTSO2(JL,JK) ZTENC1(JL,JK,ISSO2) = ZTSO2(JL,JK) - !! ZTSO4 - !PTENC(JL,JK,ISSO4)=PTENC(JL,JK,ISSO4)+ZTSO4(JL,Jk) + !! ZTSO4_GAS + !PTENC(JL,JK,ISSO4)=PTENC(JL,JK,ISSO4)+ZTSO4_GAS(JL,Jk) !! SO4 formed in clouds is applied to Accumulati !PTENC(JL,JK,ISSO4_ACS)=PTENC(JL,JK,ISSO4_ACS)+ZTSO4_AQ(JL,JK) - PCHEM2AER(JL,JK,1) = ZTSO4(JL,Jk) + PCHEM2AER(JL,JK,1) = ZTSO4_GAS(JL,Jk) PCHEM2AER(JL,JK,2) = ZTSO4_AQ(JL,JK) END DO END DO From fa3c3ed9f50322f074a7964fce48a39b4b0f1696 Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Wed, 7 May 2025 17:37:55 +0200 Subject: [PATCH 069/129] Fix Reff_liq --- .../arpifs/m7/phys_ec/hamm7_interface.F90 | 61 +++++++++---------- 1 file changed, 30 insertions(+), 31 deletions(-) diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index 5b73a17b..830f6a02 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -319,16 +319,14 @@ SUBROUTINE HAMM7_INTERFACE( & REAL(KIND=JPRB), ALLOCATABLE :: ZAERNGT(:,:) REAL(KIND=JPRB) :: ZDEGRAD, ZEPSCOV, ZEPSWAT, ZRWSAT, ZRWPWP -REAL(KIND=JPRB) :: ZQLWP(KLON,KLEV) +REAL(KIND=JPRB) :: ZQLWP2(KLON,KLEV) REAL(KIND=JPRB) :: ZTMPA, ZTEMP, ZDPOG, ZQIWP, ZPODT LOGICAL :: LLIQCLD(KLON,KLEV) ! logical for liquid cloud LOGICAL :: LICECLD(KLON,KLEV) ! logical for ice cloud -REAL(KIND=JPRB), PARAMETER :: ZEPSEC=1e-14 -REAL(KIND=JPRB), PARAMETER :: ZMIN_CDNC=1.0_JPRB !eehol: minimum CDNC (can be changed but for now 1 cm-3) -REAL(KIND=JPRB), PARAMETER :: ZTUNPAR=0.8164965_JPRB !eehol: tuning parameter for sigma_w derived from TKE (square root of 2/3 (isotropy assumption)) +REAL(KIND=JPRB), PARAMETER :: ZEPSEC=1e-14_JPRB ! [RCHG -> var non used ] INTEGER(KIND=JPIM) :: j_yaerom, JMMD, JSCAV, JSW, JSPEC ! [RCHG -> var. non used ] INTEGER(KIND=JPIM) :: IAER, IEX3D, IEX3DP @@ -1257,43 +1255,44 @@ SUBROUTINE HAMM7_INTERFACE( & ! liquid effective radius - DO JK=1,KLEV - DO JL=KIDIA,KFDIA - IF ( PAP(JL,JK) >=0.001_JPRB ) THEN - ZTEMP=1.0_JPRB/PAP(JL,JK) - ZDPOG=1.0/RG*(PRS1(JL,JK)-PRS1(JL,JK-1)) - -!-- cloud and ice water path in kg m-2 - ZQIWP =MAX(0._JPRB,ZDPOG*PIP(JL,JK)*ZTEMP)!!!!jira 592 - ZQLWP(JL,JK) =MAX(0._JPRB,ZDPOG*PLP(JL,JK)*ZTEMP) -!-- cloud and ice water content in g m-3 - ZPODT=1.0/RD*PRSF1(JL,JK)/PTP(JL,JK) - ZIP(JL,JK)=PIP(JL,JK)*ZPODT*ZTEMP - ZLP(JL,JK)=PLP(JL,JK)*ZPODT*ZTEMP - ELSE - ZQIWP = 0._JPRB - ZQLWP(JL,JK) = 0._JPRB - ZLP(JL,JK) = 0._JPRB - ZIP(JL,JK) = 0._JPRB - ENDIF - END DO - END DO +!NOT-USED DO JK=1,KLEV +!NOT-USED DO JL=KIDIA,KFDIA +!NOT-USED IF ( PAP(JL,JK) >=0.001_JPRB ) THEN +!NOT-USED ZTEMP=1.0_JPRB/PAP(JL,JK) +!NOT-USED ZDPOG=1.0/RG*(PRS1(JL,JK)-PRS1(JL,JK-1)) +!NOT-USED +!NOT-USED !-- cloud and ice water path in kg m-2 +!NOT-USED ZQIWP =MAX(0._JPRB,ZDPOG*PIP(JL,JK)*ZTEMP)!!!!jira 592 +!NOT-USED ZQLWP(JL,JK) =MAX(0._JPRB,ZDPOG*PLP(JL,JK)*ZTEMP) +!NOT-USED !-- cloud and ice water content in g m-3 +!NOT-USED ZPODT=1.0/RD*PRSF1(JL,JK)/PTP(JL,JK) +!NOT-USED ZIP(JL,JK)=PIP(JL,JK)*ZPODT*ZTEMP +!NOT-USED ZLP(JL,JK)=PLP(JL,JK)*ZPODT*ZTEMP +!NOT-USED ELSE +!NOT-USED ZQIWP = 0._JPRB +!NOT-USED ZQLWP(JL,JK) = 0._JPRB +!NOT-USED ZLP(JL,JK) = 0._JPRB +!NOT-USED ZIP(JL,JK) = 0._JPRB +!NOT-USED ENDIF +!NOT-USED END DO +!NOT-USED END DO DO JK=1,KLEV DO JL=KIDIA,KFDIA ZTMPA = 1.0_JPRB/MAX(ZAP(JL,JK),ZEPSEC) LLIQCLD(JL,JK) = ( PLP(JL,JK)*ZTMPA ) > ZEPSEC ! logical for liquid cloud LICECLD(JL,JK) = ( PIP(JL,JK)*ZTMPA ) > ZEPSEC ! logical for ice cloud - ! ZQLWP2(JL,JK) = PLP(JL,JK)/MAX(ZAP(JL,JK),1.E-10_JPRB) ! calculate lwp + ZQLWP2(JL,JK) = PLP(JL,JK) !/MAX(ZAP(JL,JK),1.E-10_JPRB) ! calculate lwp - ! effective radius calculated similarly as in radlswr.F90 + ! effective radius (in um) calculated similarly as in radlswr.F90 ! 2.387e-10 is 3/(4*pi*rho_liq*10^6) [10^6 for N in right units] - ZRE_LIQ(JL,JK) = 1.E+06_JPRB*(2.387e-10_JPRB*ZRHO(JL,JK)*ZQLWP(JL,JK)/(MAX(PGFL(JL,JK,YCDNC%MP9_PH),10._JPRB)))**0.333_JPRB ! calculate effective radius in um (use minimum value for CDNC if CDNC is small) - + ZRE_LIQ(JL,JK) = 1.E+06_JPRB*(2.387e-10_JPRB*ZRHO(JL,JK)*ZQLWP2(JL,JK)/PGFL(JL,JK,YCDNC%MP9_PH))**0.333_JPRB END DO - END DO + END DO + ! Add liq. eff. rad. to HAM variables (only if there is liquid cloud else minimum value) - REFFL(KIDIA:KFDIA,1:KLEV,ZKROW) = MERGE(ZRE_LIQ(KIDIA:KFDIA,1:KLEV)*1.E+6_JPRB,4._JPRB,LLIQCLD(KIDIA:KFDIA,1:KLEV)) + REFFL(KIDIA:KFDIA,1:KLEV,ZKROW) = MERGE(ZRE_LIQ(KIDIA:KFDIA,1:KLEV), 4._JPRB, LLIQCLD(KIDIA:KFDIA,1:KLEV)) + CALL ICE_EFFECTIVE_RADIUS(YRERAD, YDSPP_CONFIG, KIDIA, KFDIA, KLON, KLEV, & & PRSF1, PTP, ZAP, PIP, PSP, PGEMU, & ! pressure, temp, cloud fr., IWC, SWC, sine of latitude & reffi(1:KLON,1:KLEV,ZKROW)) ! ice effective radius (updated to mo_activ variable 'reffi' which used in mo_ham_wetdep) From 042bfe46c8d72432a3d3a0b0195fe2bccdef5596 Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Tue, 13 May 2025 12:04:33 +0200 Subject: [PATCH 070/129] Fix Reff_liq further --- .../arpifs/m7/phys_ec/hamm7_interface.F90 | 52 ++++++------------- 1 file changed, 17 insertions(+), 35 deletions(-) diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index 830f6a02..8c040f9b 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -319,7 +319,7 @@ SUBROUTINE HAMM7_INTERFACE( & REAL(KIND=JPRB), ALLOCATABLE :: ZAERNGT(:,:) REAL(KIND=JPRB) :: ZDEGRAD, ZEPSCOV, ZEPSWAT, ZRWSAT, ZRWPWP -REAL(KIND=JPRB) :: ZQLWP2(KLON,KLEV) +REAL(KIND=JPRB) :: ZQLWP2 REAL(KIND=JPRB) :: ZTMPA, ZTEMP, ZDPOG, ZQIWP, ZPODT LOGICAL :: LLIQCLD(KLON,KLEV) ! logical for liquid cloud @@ -1247,47 +1247,29 @@ SUBROUTINE HAMM7_INTERFACE( & !--> End store CDNC and ICNC !----------------------------------------------------------------- - !--> Calculation for effective radii and put to PGFL fields + !--> Calculation of effective radii and put to PGFL fields ! put default values for effective radii reffl(KIDIA:KFDIA,1:KLEV,ZKROW) = 4._JPRB ! comes from liquid effective radius routine (PP_MIN_RE_UM) reffi(KIDIA:KFDIA,1:KLEV,ZKROW) = 80._JPRB*0.64952_JPRB ! comes from ice effective radius routine (ZDEFAULT_RE_UM) ! liquid effective radius - -!NOT-USED DO JK=1,KLEV -!NOT-USED DO JL=KIDIA,KFDIA -!NOT-USED IF ( PAP(JL,JK) >=0.001_JPRB ) THEN -!NOT-USED ZTEMP=1.0_JPRB/PAP(JL,JK) -!NOT-USED ZDPOG=1.0/RG*(PRS1(JL,JK)-PRS1(JL,JK-1)) -!NOT-USED -!NOT-USED !-- cloud and ice water path in kg m-2 -!NOT-USED ZQIWP =MAX(0._JPRB,ZDPOG*PIP(JL,JK)*ZTEMP)!!!!jira 592 -!NOT-USED ZQLWP(JL,JK) =MAX(0._JPRB,ZDPOG*PLP(JL,JK)*ZTEMP) -!NOT-USED !-- cloud and ice water content in g m-3 -!NOT-USED ZPODT=1.0/RD*PRSF1(JL,JK)/PTP(JL,JK) -!NOT-USED ZIP(JL,JK)=PIP(JL,JK)*ZPODT*ZTEMP -!NOT-USED ZLP(JL,JK)=PLP(JL,JK)*ZPODT*ZTEMP -!NOT-USED ELSE -!NOT-USED ZQIWP = 0._JPRB -!NOT-USED ZQLWP(JL,JK) = 0._JPRB -!NOT-USED ZLP(JL,JK) = 0._JPRB -!NOT-USED ZIP(JL,JK) = 0._JPRB -!NOT-USED ENDIF -!NOT-USED END DO -!NOT-USED END DO - DO JK=1,KLEV DO JL=KIDIA,KFDIA - ZTMPA = 1.0_JPRB/MAX(ZAP(JL,JK),ZEPSEC) - LLIQCLD(JL,JK) = ( PLP(JL,JK)*ZTMPA ) > ZEPSEC ! logical for liquid cloud - LICECLD(JL,JK) = ( PIP(JL,JK)*ZTMPA ) > ZEPSEC ! logical for ice cloud - ZQLWP2(JL,JK) = PLP(JL,JK) !/MAX(ZAP(JL,JK),1.E-10_JPRB) ! calculate lwp - - ! effective radius (in um) calculated similarly as in radlswr.F90 - ! 2.387e-10 is 3/(4*pi*rho_liq*10^6) [10^6 for N in right units] - ZRE_LIQ(JL,JK) = 1.E+06_JPRB*(2.387e-10_JPRB*ZRHO(JL,JK)*ZQLWP2(JL,JK)/PGFL(JL,JK,YCDNC%MP9_PH))**0.333_JPRB - END DO + IF ( ZAP(JL,JK) >=0.001_JPRB ) THEN + ZTMPA = 1.0_JPRB/ZAP(JL,JK) + LLIQCLD(JL,JK) = ( PLP(JL,JK)*ZTMPA ) > ZEPSEC ! logical for liquid cloud + LICECLD(JL,JK) = ( PIP(JL,JK)*ZTMPA ) > ZEPSEC ! logical for ice cloud + ZQLWP2 = MAX(0._JPRB, PLP(JL,JK)*ZTMPA) ! lwp + + ! effective radius (in um) calculated similarly as in radlswr.F90 + ! 2.387e-10 is 3/(4*pi*rho_liq*10^6) [10^6 for N in right units] + ZRE_LIQ(JL,JK) = 1.E+06_JPRB*(2.387e-10_JPRB*ZRHO(JL,JK)*ZQLWP2/PGFL(JL,JK,YCDNC%MP9_PH))**0.333_JPRB + ELSE + LLIQCLD(JL,JK) = .FALSE. + LICECLD(JL,JK) = .FALSE. + END IF + END DO END DO ! Add liq. eff. rad. to HAM variables (only if there is liquid cloud else minimum value) @@ -1304,7 +1286,7 @@ SUBROUTINE HAMM7_INTERFACE( & PGFL(KIDIA:KFDIA,1:KLEV,YRE_LIQ%MP9_PH) = 1.0E-06_JPRB * reffl(KIDIA:KFDIA,1:KLEV,ZKROW) ! convert um to meters and save to PGFL fields PGFL(KIDIA:KFDIA,1:KLEV,YRE_ICE%MP9_PH) = 1.0E-06_JPRB * reffi(KIDIA:KFDIA,1:KLEV,ZKROW) ! convert um to meters and save to PGFL fields - !<-- End calculation for effective radii + !<-- End calculation of effective radii !----------------------------------------------------------------- !--- Mass conserving correction of negative tracer values: From 98fe9b38074533e9436466f066271483410aa896 Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Wed, 14 May 2025 09:11:14 +0200 Subject: [PATCH 071/129] Remove duplicated photolysis code --- ifs-source/arpifs/chem/bascoetm5_chem_ini.F90 | 260 +----------------- ifs-source/arpifs/chem/tm5_chem_ini.F90 | 259 +---------------- 2 files changed, 2 insertions(+), 517 deletions(-) diff --git a/ifs-source/arpifs/chem/bascoetm5_chem_ini.F90 b/ifs-source/arpifs/chem/bascoetm5_chem_ini.F90 index b78586bf..60ddb6af 100644 --- a/ifs-source/arpifs/chem/bascoetm5_chem_ini.F90 +++ b/ifs-source/arpifs/chem/bascoetm5_chem_ini.F90 @@ -60,7 +60,7 @@ SUBROUTINE BASCOETM5_CHEM_INI(YGFL,YDCHEM,YDCOMPO) USE PARKIND1 ,ONLY : JPIM, JPRM, JPRB USE YOMHOOK ,ONLY : LHOOK, DR_HOOK, JPHOOK USE BASCOETM5_MODULE, ONLY : NBC, BASCOE_BCVAL, BASCOE_BCNAME - +USE TM5_PHOTOLYSIS, ONLY : PHOTOLYSIS_INI IMPLICIT NONE @@ -403,264 +403,6 @@ SUBROUTINE TRACER_IDX_CHECK_BASCOETM5(YGFL,YDCOMPO) END SUBROUTINE TRACER_IDX_CHECK_BASCOETM5 -! Initialize new photolysis routine -! ----------------------------------------------------------- -SUBROUTINE PHOTOLYSIS_INI -USE TM5_PHOTOLYSIS , ONLY : WAVE_FULL, DWAVE_FULL, WAVE, DWAVE, MAXWAV, & - & NWAV_NO2,NWAV_CO,NWAV_HNO3,NWAV_O3,NWAV_PAN,NWAV_H2O2,NWAV_N2O5,NWAV_CH2O,& - & NWAV_NO3,NWAV_ACET, & - & CS_RAY, PHI0, RD, FLUX, NTEMP_MAX, & - & XS_O3_LOOK,XS_HNO3_LOOK,XS_PAN_LOOK,QY_O3_LOOK,XS_H2O2_LOOK, & - & XS_N2O5_LOOK,XS_NO2_LOOK,QY_NO2_LOOK,QY_CO_LOOK,XS_NO3_LOOK, XS_CH2O_LOOK, & - & A1_ACET,A2_ACET,A3_ACET,A4_ACET, & - & SCA,ABS_EFF, GFAC, EXT , PN_REF - -USE YOMLUN , ONLY : NULOUT -USE PARKIND1 , ONLY : JPIM ,JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK - -IMPLICIT NONE - -! Local parameters -INTEGER(KIND=JPIM), PARAMETER :: IUTMP=77 -INTEGER(KIND=JPIM) :: IK, IWAV, JL -REAL(KIND=JPRB) :: ZWL,ZX -LOGICAL :: LLFILEOK -REAL(KIND=JPHOOK) :: ZHOOK_HANDLE - -!TM5 photolysis info file -CHARACTER(LEN=27) :: CL_TM5_PHOTO_LOOKUP='tropo_look_up_cbmhybrid.dat' -!TM5 extraterrestrial flux: -CHARACTER(LEN=21) :: CL_TM5_EXTRATERRESTRIAL='OMI.data.extraterrest' -!TM5 aerosol: -CHARACTER(LEN=18) :: CL_TM5_AEROSOL='aerosol_reduce.dat' -#include "abor1.intfb.h" - - -IF (LHOOK) CALL DR_HOOK('BASCOETM5_CHEM_INI:PHOTOLYSIS_INI',0,ZHOOK_HANDLE) - -DO IK=1,13 - WAVE_FULL(IK)=1._JPRB/(56250._JPRB-500._JPRB*IK) -ENDDO - -DO IK=14,45 - WAVE_FULL(IK)=1._JPRB/(49750._JPRB-(IK-13)*500._JPRB) -ENDDO - -DO IK=46,68 - WAVE_FULL(IK)=(266._JPRB+(IK-13))*1.E-7_JPRB -ENDDO - -DO IK=69,71 - WAVE_FULL(IK)=(320.5_JPRB+2.*(IK-68))*1.E-7_JPRB -ENDDO -DO IK=72,176 - WAVE_FULL(IK)=(325._JPRB+5._JPRB*(IK-71))*1.E-7_JPRB -ENDDO - -DO IK=2,MAXWAV-1 - DWAVE_FULL(IK)=0.5_JPRB*(WAVE_FULL(IK+1)-WAVE_FULL(IK-1)) -ENDDO -DWAVE_FULL(1) = DWAVE_FULL(2) -DWAVE_FULL(MAXWAV) = DWAVE_FULL(MAXWAV-1) -! select a subset from the full spctral grid to remove the first band -WAVE=WAVE_FULL(14:135) -DWAVE=DWAVE_FULL(14:135) - - -!--------------------------------------------------------------------- -! Rayleigh scattering cross sections -! emp. formula of Nicolet plan. space sci.32, 1467f (1984) -!--------------------------------------------------------------------- - -DO IK=1,MAXWAV - ZWL=WAVE(IK)*1.E4_JPRB - ZX=0.389*ZWL+0.09426_JPRB/ZWL-0.3228_JPRB - CS_RAY(IK)=4.02E-28_JPRB/ZWL**(4._JPRB+ZX) -ENDDO - -!--------------------------------------------------------------------- -! QUANTUM YIELD OF METHYGLYOXAL S. KOCH and G. K. MOORTGAT -! J Phys Chem, 102, 9142-9153, 1998. -! -! JEW: the qy_ch3cocho array has been reduced to 52 bins to represent the pressure. -! dep. spectral bins ONLY !! -!--------------------------------------------------------------------- - -! Calculate co-efficients for METHYGLYOXAL qy outside loop -PHI0 = 1. -RD = 0. - -! for wave < 380nm qy is essentially = 1.0. -DO IK = 1,39 - IF(IK<32) THEN - PHI0(IK) = 1 - ELSEIF(IK>=32) THEN - PHI0(IK) = 8.15E-9_JPRB * EXP(7131._JPRB/WAVE(IK+37_JPIM)*1.E-7_JPRB) - ENDIF - RD(IK) = 7.34E-9_JPRB * EXP(8793._JPRB/WAVE(IK+37_JPIM)*1.E-7_JPRB) -ENDDO - -DO IK = 40,52 - PHI0(IK) = 3.63E-7_JPRB * EXP(5693._JPRB/WAVE(IK+37_JPIM)*1.E-7_JPRB) - RD(IK) = 1.93E4_JPRB*EXP(-5639._JPRB/WAVE(IK+37_JPIM)*1.E-7_JPRB) -ENDDO - -!-------------------------------------------------------------- -! Read and store temperature dependent cross-section values -!-------------------------------------------------------------- -LLFILEOK=.FALSE. -INQUIRE(FILE=TRIM(CL_TM5_PHOTO_LOOKUP),EXIST=LLFILEOK ) -IF(.NOT. LLFILEOK)THEN - WRITE(NULOUT,*) 'ERROR bascoetm5_chem_ini: Cannot read TM5 file '//TRIM(CL_TM5_PHOTO_LOOKUP) - CALL ABOR1('tm5_chem_ini: photo inputfile does not exist.') -ELSE - WRITE(NULOUT,*) 'INFO bascoetm5_chem_ini: Opening TM5 file '//TRIM(CL_TM5_PHOTO_LOOKUP) - OPEN(IUTMP,FORM='FORMATTED',ACTION='READ',STATUS='OLD', & - & FILE=TRIM(CL_TM5_PHOTO_LOOKUP)) - -READ(IUTMP,*) -READ(IUTMP,*) -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*) (XS_O3_LOOK(IWAV,IK),IWAV=1,MAXWAV) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*) (XS_NO2_LOOK(IWAV,IK),IWAV=1,NWAV_NO2) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*) (XS_HNO3_LOOK(IWAV,IK),IWAV=1,NWAV_HNO3) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*) (XS_H2O2_LOOK(IWAV,IK),IWAV=1,NWAV_H2O2) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*) (XS_N2O5_LOOK(IWAV,IK),IWAV=1,NWAV_N2O5) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*) (XS_CH2O_LOOK(IWAV,IK),IWAV=1,NWAV_CH2O) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*) (XS_PAN_LOOK(IWAV,IK),IWAV=1,NWAV_PAN) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*) (XS_NO3_LOOK(IWAV,IK),IWAV=1,NWAV_NO3) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*) (QY_O3_LOOK(IWAV,IK),IWAV=1,NWAV_O3) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*)(QY_NO2_LOOK(IWAV,IK),IWAV=1,NWAV_NO2) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*)(QY_CO_LOOK(IWAV,IK),IWAV=1,NWAV_CO) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*)(A1_ACET(IWAV,IK),IWAV=1,NWAV_ACET) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*)(A2_ACET(IWAV,IK),IWAV=1,NWAV_ACET) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*)(A3_ACET(IWAV,IK),IWAV=1,NWAV_ACET) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*)(A4_ACET(IWAV,IK),IWAV=1,NWAV_ACET) -ENDDO -CLOSE(IUTMP) - -ENDIF - -! put constants in correct units -A1_ACET=A1_ACET*1E-18_JPRB -A2_ACET=A2_ACET*1E-17_JPRB -A4_ACET=A4_ACET*1E-15_JPRB - -!-------------------------------------------------------------- -! Read and store temperature dependent cross-section values -! -!----- extraterrestrial flux from input file ------------------ -LLFILEOK=.FALSE. -INQUIRE(FILE=TRIM(CL_TM5_EXTRATERRESTRIAL),EXIST=LLFILEOK ) -IF(.NOT. LLFILEOK)THEN - WRITE(NULOUT,*) 'ERROR bascoectm5_chem_ini: Cannot read TM5 file '//TRIM(CL_TM5_EXTRATERRESTRIAL) - CALL ABOR1('tm5_chem_ini: extraterrestrial inputfile does not exist.') -ELSE - WRITE(NULOUT,*) 'INFO bascoetm5_chem_ini: Opening TM5 file '//TRIM(CL_TM5_EXTRATERRESTRIAL) - OPEN(IUTMP,FORM='FORMATTED',ACTION='READ',STATUS='OLD', & - & FILE=TRIM(CL_TM5_EXTRATERRESTRIAL)) - READ(IUTMP,*) - READ(IUTMP,*) FLUX - CLOSE(IUTMP) -ENDIF - -!************************************************************************** -! aerosol data from: "Models for Aerosols of the Lower Atmosphere -! and the Effects of Humidity Variations on their Optical Properties -! E. P. Shettle and R. W. Fenn (1979), Environmental Research Paper -! No. 676 -!************************************************************************** -LLFILEOK=.FALSE. -INQUIRE(FILE=TRIM(CL_TM5_AEROSOL),EXIST=LLFILEOK ) -IF(.NOT. LLFILEOK)THEN - WRITE(NULOUT,*) 'ERROR bascoetm5_chem_ini: Cannot read TM5 file '//TRIM(CL_TM5_AEROSOL) - CALL ABOR1('tm5_chem_ini: aerosol inputfile does not exist.') -ELSE - WRITE(NULOUT,*) 'INFO bascoetm5_chem_ini: Opening TM5 file '//TRIM(CL_TM5_AEROSOL) - OPEN(IUTMP,FORM='FORMATTED',ACTION='READ',STATUS='OLD', & - & FILE=TRIM(CL_TM5_AEROSOL)) - DO JL = 1,4 - READ(IUTMP,*) - DO IK = 1,8 - READ(IUTMP,*) - READ(IUTMP,'(6(1X,F7.5))')(EXT(IWAV,IK,JL),IWAV=1,MAXWAV) - READ(IUTMP,'(6(1X,F7.5))')(ABS_EFF(IWAV,IK,JL),IWAV=1,MAXWAV) - READ(IUTMP,'(6(1X,F7.5))')(GFAC(IWAV,IK,JL),IWAV=1,MAXWAV) - DO IWAV=1,MAXWAV - SCA(IWAV,IK,JL) = EXT(IWAV,IK,JL) - ABS_EFF(IWAV,IK,JL) - ENDDO - ENDDO - ENDDO - CLOSE(IUTMP) - - DO IWAV=1,MAXWAV - DO IK=1,8 - DO JL=1,4 - SCA(IWAV,IK,JL) = SCA(IWAV,IK,JL)/PN_REF(JL)*1.E-5_JPRB - ABS_EFF(IWAV,IK,JL) = ABS_EFF(IWAV,IK,JL)/PN_REF(JL)*1.E-5_JPRB - ENDDO - ENDDO - ENDDO - -ENDIF - -!VH - file format(6(1X,F7.5)) - -WRITE(NULOUT,*) 'INFO bascoetm5_chem_ini: Finished reading TM5 photolysis input files ' - - -IF (LHOOK) CALL DR_HOOK('BASCOETM5_CHEM_INI:PHOTOLYSIS_INI',1,ZHOOK_HANDLE) - - -END SUBROUTINE PHOTOLYSIS_INI - - - - SUBROUTINE BASCOETM5_INI_BUDGET(YGFL,YDCHEM) !** DESCRIPTION diff --git a/ifs-source/arpifs/chem/tm5_chem_ini.F90 b/ifs-source/arpifs/chem/tm5_chem_ini.F90 index 98eb89c6..de2010a8 100644 --- a/ifs-source/arpifs/chem/tm5_chem_ini.F90 +++ b/ifs-source/arpifs/chem/tm5_chem_ini.F90 @@ -51,6 +51,7 @@ SUBROUTINE TM5_CHEM_INI(YGFL,YDCHEM,YDCOMPO) USE YOMCOMPO , ONLY : TCOMPO USE PARKIND1 ,ONLY : JPIM, JPRM, JPRB USE YOMHOOK ,ONLY : LHOOK, DR_HOOK, JPHOOK +USE TM5_PHOTOLYSIS, ONLY : PHOTOLYSIS_INI IMPLICIT NONE @@ -280,264 +281,6 @@ SUBROUTINE TRACER_IDX_CHECK(YGFL,YDCHEM, YDCOMPO) END SUBROUTINE TRACER_IDX_CHECK -! Initialize new photolysis routine -! ----------------------------------------------------------- -SUBROUTINE PHOTOLYSIS_INI -USE TM5_PHOTOLYSIS , ONLY : WAVE_FULL, DWAVE_FULL, WAVE, DWAVE, MAXWAV, & - & NWAV_NO2,NWAV_CO,NWAV_HNO3,NWAV_O3,NWAV_PAN,NWAV_H2O2,NWAV_N2O5,NWAV_CH2O,& - & NWAV_NO3,NWAV_ACET, & - & CS_RAY, PHI0, RD, FLUX, NTEMP_MAX, & - & XS_O3_LOOK,XS_HNO3_LOOK,XS_PAN_LOOK,QY_O3_LOOK,XS_H2O2_LOOK, & - & XS_N2O5_LOOK,XS_NO2_LOOK,QY_NO2_LOOK,QY_CO_LOOK,XS_NO3_LOOK, XS_CH2O_LOOK, & - & A1_ACET,A2_ACET,A3_ACET,A4_ACET, & - & SCA,ABS_EFF, GFAC, EXT , PN_REF, & - & LL_TM5_PHOTO_INI - -USE YOMLUN , ONLY : NULOUT -USE PARKIND1 , ONLY : JPIM ,JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK - -IMPLICIT NONE - -! Local parameters -INTEGER(KIND=JPIM), PARAMETER :: IUTMP=77 -INTEGER(KIND=JPIM) :: IK, IWAV, JL -REAL(KIND=JPRB) :: ZWL,ZX -LOGICAL :: LLFILEOK -REAL(KIND=JPHOOK) :: ZHOOK_HANDLE - -!TM5 photolysis info file -CHARACTER(LEN=27) :: CL_TM5_PHOTO_LOOKUP='tropo_look_up_cbmhybrid.dat' -!TM5 extraterrestrial flux: -CHARACTER(LEN=21) :: CL_TM5_EXTRATERRESTRIAL='OMI.data.extraterrest' -!TM5 aerosol: -CHARACTER(LEN=18) :: CL_TM5_AEROSOL='aerosol_reduce.dat' -#include "abor1.intfb.h" - -IF (LHOOK) CALL DR_HOOK('TM5_CHEM_INI:PHOTOLYSIS_INI',0,ZHOOK_HANDLE) - -DO IK=1,13 - WAVE_FULL(IK)=1._JPRB/(56250._JPRB-500._JPRB*IK) -ENDDO - -DO IK=14,45 - WAVE_FULL(IK)=1._JPRB/(49750._JPRB-(IK-13)*500._JPRB) -ENDDO - -DO IK=46,68 - WAVE_FULL(IK)=(266._JPRB+(IK-13))*1.E-7_JPRB -ENDDO - -DO IK=69,71 - WAVE_FULL(IK)=(320.5_JPRB+2.*(IK-68))*1.E-7_JPRB -ENDDO -DO IK=72,176 - WAVE_FULL(IK)=(325._JPRB+5._JPRB*(IK-71))*1.E-7_JPRB -ENDDO - -DO IK=2,MAXWAV-1 - DWAVE_FULL(IK)=0.5_JPRB*(WAVE_FULL(IK+1)-WAVE_FULL(IK-1)) -ENDDO -DWAVE_FULL(1) = DWAVE_FULL(2) -DWAVE_FULL(MAXWAV) = DWAVE_FULL(MAXWAV-1) -! select a subset from the full spctral grid to remove the first band -WAVE=WAVE_FULL(14:135) -DWAVE=DWAVE_FULL(14:135) - - -!--------------------------------------------------------------------- -! Rayleigh scattering cross sections -! emp. formula of Nicolet plan. space sci.32, 1467f (1984) -!--------------------------------------------------------------------- - -DO IK=1,MAXWAV - ZWL=WAVE(IK)*1.E4_JPRB - ZX=0.389*ZWL+0.09426_JPRB/ZWL-0.3228_JPRB - CS_RAY(IK)=4.02E-28_JPRB/ZWL**(4._JPRB+ZX) -ENDDO - -!--------------------------------------------------------------------- -! QUANTUM YIELD OF METHYGLYOXAL S. KOCH and G. K. MOORTGAT -! J Phys Chem, 102, 9142-9153, 1998. -! -! JEW: the qy_ch3cocho array has been reduced to 52 bins to represent the pressure. -! dep. spectral bins ONLY !! -!--------------------------------------------------------------------- - -! Calculate co-efficients for METHYGLYOXAL qy outside loop -PHI0 = 1. -RD = 0. - -! for wave < 380nm qy is essentially = 1.0. -DO IK = 1,39 - IF(IK<32) THEN - PHI0(IK) = 1 - ELSEIF(IK>=32) THEN - PHI0(IK) = 8.15E-9_JPRB * EXP(7131._JPRB/WAVE(IK+37_JPIM)*1.E-7_JPRB) - ENDIF - RD(IK) = 7.34E-9_JPRB * EXP(8793._JPRB/WAVE(IK+37_JPIM)*1.E-7_JPRB) -ENDDO - -DO IK = 40,52 - PHI0(IK) = 3.63E-7_JPRB * EXP(5693._JPRB/WAVE(IK+37_JPIM)*1.E-7_JPRB) - RD(IK) = 1.93E4_JPRB*EXP(-5639._JPRB/WAVE(IK+37_JPIM)*1.E-7_JPRB) -ENDDO - -!-------------------------------------------------------------- -! Read and store temperature dependent cross-section values -!-------------------------------------------------------------- -LLFILEOK=.FALSE. -INQUIRE(FILE=TRIM(CL_TM5_PHOTO_LOOKUP),EXIST=LLFILEOK ) -IF(.NOT. LLFILEOK)THEN - WRITE(NULOUT,*) 'ERROR tm5_chem_ini: Cannot read TM5 file '//TRIM(CL_TM5_PHOTO_LOOKUP) - CALL ABOR1('tm5_chem_ini: photo inputfile does not exist.') -ELSE - WRITE(NULOUT,*) 'INFO tm5_chem_ini: Opening TM5 file '//TRIM(CL_TM5_PHOTO_LOOKUP) - OPEN(IUTMP,FORM='FORMATTED',ACTION='READ',STATUS='OLD', & - & FILE=TRIM(CL_TM5_PHOTO_LOOKUP)) - -READ(IUTMP,*) -READ(IUTMP,*) -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*) (XS_O3_LOOK(IWAV,IK),IWAV=1,MAXWAV) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*) (XS_NO2_LOOK(IWAV,IK),IWAV=1,NWAV_NO2) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*) (XS_HNO3_LOOK(IWAV,IK),IWAV=1,NWAV_HNO3) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*) (XS_H2O2_LOOK(IWAV,IK),IWAV=1,NWAV_H2O2) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*) (XS_N2O5_LOOK(IWAV,IK),IWAV=1,NWAV_N2O5) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*) (XS_CH2O_LOOK(IWAV,IK),IWAV=1,NWAV_CH2O) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*) (XS_PAN_LOOK(IWAV,IK),IWAV=1,NWAV_PAN) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*) (XS_NO3_LOOK(IWAV,IK),IWAV=1,NWAV_NO3) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*) (QY_O3_LOOK(IWAV,IK),IWAV=1,NWAV_O3) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*)(QY_NO2_LOOK(IWAV,IK),IWAV=1,NWAV_NO2) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*)(QY_CO_LOOK(IWAV,IK),IWAV=1,NWAV_CO) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*)(A1_ACET(IWAV,IK),IWAV=1,NWAV_ACET) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*)(A2_ACET(IWAV,IK),IWAV=1,NWAV_ACET) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*)(A3_ACET(IWAV,IK),IWAV=1,NWAV_ACET) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*)(A4_ACET(IWAV,IK),IWAV=1,NWAV_ACET) -ENDDO -CLOSE(IUTMP) - -ENDIF - -! put constants in correct units - -A1_ACET=A1_ACET*1E-18_JPRB -A2_ACET=A2_ACET*1E-17_JPRB -A4_ACET=A4_ACET*1E-15_JPRB - -!-------------------------------------------------------------- -! Read and store temperature dependent cross-section values -! -!----- extraterrestrial flux from input file ------------------ -LLFILEOK=.FALSE. -INQUIRE(FILE=TRIM(CL_TM5_EXTRATERRESTRIAL),EXIST=LLFILEOK ) -IF(.NOT. LLFILEOK)THEN - WRITE(NULOUT,*) 'ERROR tm5_chem_ini: Cannot read TM5 file '//TRIM(CL_TM5_EXTRATERRESTRIAL) - CALL ABOR1('tm5_chem_ini: extraterrestrial inputfile does not exist.') -ELSE - WRITE(NULOUT,*) 'INFO tm5_chem_ini: Opening TM5 file '//TRIM(CL_TM5_EXTRATERRESTRIAL) - OPEN(IUTMP,FORM='FORMATTED',ACTION='READ',STATUS='OLD', & - & FILE=TRIM(CL_TM5_EXTRATERRESTRIAL)) - READ(IUTMP,*) - READ(IUTMP,*) FLUX - CLOSE(IUTMP) -ENDIF - - -!************************************************************************** -! aerosol data from: "Models for Aerosols of the Lower Atmosphere -! and the Effects of Humidity Variations on their Optical Properties -! E. P. Shettle and R. W. Fenn (1979), Environmental Research Paper -! No. 676 -!************************************************************************** -LLFILEOK=.FALSE. -INQUIRE(FILE=TRIM(CL_TM5_AEROSOL),EXIST=LLFILEOK ) -IF(.NOT. LLFILEOK)THEN - WRITE(NULOUT,*) 'ERROR tm5_chem_ini: Cannot read TM5 file '//TRIM(CL_TM5_AEROSOL) - CALL ABOR1('tm5_chem_ini: aerosol inputfile does not exist.') -ELSE - WRITE(NULOUT,*) 'INFO tm5_chem_ini: Opening TM5 file '//TRIM(CL_TM5_AEROSOL) - OPEN(IUTMP,FORM='FORMATTED',ACTION='READ',STATUS='OLD', & - & FILE=TRIM(CL_TM5_AEROSOL)) - DO JL = 1,4 - READ(IUTMP,*) - DO IK = 1,8 - READ(IUTMP,*) - READ(IUTMP,'(6(1X,F7.5))')(EXT(IWAV,IK,JL),IWAV=1,MAXWAV) - READ(IUTMP,'(6(1X,F7.5))')(ABS_EFF(IWAV,IK,JL),IWAV=1,MAXWAV) - READ(IUTMP,'(6(1X,F7.5))')(GFAC(IWAV,IK,JL),IWAV=1,MAXWAV) - DO IWAV=1,MAXWAV - SCA(IWAV,IK,JL) = EXT(IWAV,IK,JL) - ABS_EFF(IWAV,IK,JL) - ENDDO - ENDDO - ENDDO - CLOSE(IUTMP) - - DO IWAV=1,MAXWAV - DO IK=1,8 - DO JL=1,4 - SCA(IWAV,IK,JL) = SCA(IWAV,IK,JL)/PN_REF(JL)*1.E-5_JPRB - ABS_EFF(IWAV,IK,JL) = ABS_EFF(IWAV,IK,JL)/PN_REF(JL)*1.E-5_JPRB - ENDDO - ENDDO - ENDDO - -ENDIF - -!VH - file format(6(1X,F7.5)) - -WRITE(NULOUT,*) 'INFO tm5_chem_ini: Finished reading TM5 photolysis input files ' -LL_TM5_PHOTO_INI=.TRUE. - - -IF (LHOOK) CALL DR_HOOK('TM5_CHEM_INI:PHOTOLYSIS_INI',1,ZHOOK_HANDLE) -END SUBROUTINE PHOTOLYSIS_INI - - - SUBROUTINE IFS_INI_BUDGET(YGFL,YDCHEM) !** DESCRIPTION From 6bb09c3e1f6e2eea66335ef74fb9781cd86e34fe Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Wed, 14 May 2025 15:21:57 +0200 Subject: [PATCH 072/129] Skip wavelength init if not used --- ifs-source/arpifs/control/cnt4.F90 | 2 +- ifs-source/arpifs/m7/tm5m7_init.F90 | 109 ++++++++++++++-------------- 2 files changed, 54 insertions(+), 57 deletions(-) diff --git a/ifs-source/arpifs/control/cnt4.F90 b/ifs-source/arpifs/control/cnt4.F90 index 78f57308..40fadb45 100644 --- a/ifs-source/arpifs/control/cnt4.F90 +++ b/ifs-source/arpifs/control/cnt4.F90 @@ -511,7 +511,7 @@ SUBROUTINE CNT4(YDGEOMETRY,YDFIELDS,YDMTRAJ,YDMODEL,YDJOT,YDVARBC,YDTCV,YDGOM5,Y ! HAM-M7 only calculates aerosol micro-physics, ! all other processes are dealt with in TM5-M7 ! therefore we also have to initialize TM5-M7 - CALL TM5M7_INIT(YDGEOMETRY, YDMODEL%YRML_CHEM%YRCOMPO, YGFL, YDMODEL%YRML_PHY_RAD%YRERAD) + CALL TM5M7_INIT(YDGEOMETRY, YDMODEL%YRML_CHEM, YGFL, YDMODEL%YRML_PHY_RAD%YRERAD) CALL HAMM7_INIT(YGFL, YDRIP, YDMODEL%YRML_CHEM%YRCHEM%CHEM_SCHEME) !requires stuff which is defined in TM5M7_INIT CASE DEFAULT diff --git a/ifs-source/arpifs/m7/tm5m7_init.F90 b/ifs-source/arpifs/m7/tm5m7_init.F90 index 2cbd0157..51d63f13 100755 --- a/ifs-source/arpifs/m7/tm5m7_init.F90 +++ b/ifs-source/arpifs/m7/tm5m7_init.F90 @@ -1,4 +1,4 @@ - SUBROUTINE TM5M7_INIT(YDGEOMETRY, YRCOMPO, YGFL, YDERAD) +SUBROUTINE TM5M7_INIT(YDGEOMETRY, YDCHEM, YGFL, YDERAD) !** DESCRIPTION ! ---------- @@ -28,10 +28,9 @@ SUBROUTINE TM5M7_INIT(YDGEOMETRY, YRCOMPO, YGFL, YDERAD) USE PARKIND1, ONLY : JPRB, JPIM USE YOMHOOK, ONLY : LHOOK, DR_HOOK, JPHOOK USE YOMLUN, ONLY : NULOUT -!USE YOMCOMPO , ONLY : YRCOMPO -USE YOMCOMPO, ONLY : TCOMPO -USE YOM_YGFL, ONLY : TYPE_GFLD!YGFL -USE TM5_PHOTOLYSIS, ONLY : PHOTOLYSIS_INI, NBANDS_TROP,LMID,LMID_GRIDA,WAVE,WAV_GRID,WAV_GRIDA,LL_TM5_PHOTO_INI +USE MODEL_CHEM_MOD, ONLY : MODEL_CHEM_TYPE +USE YOM_YGFL, ONLY : TYPE_GFLD +USE TM5_PHOTOLYSIS, ONLY : PHOTOLYSIS_INI, NBANDS_TROP, LMID, LMID_GRIDA, WAVE, WAV_GRID, WAV_GRIDA USE TM5M7_DATA, ONLY : ISO4 , INH4 , INO3_A , IACS_N , ISO4ACS , IBCACS , IPOMACS , ISSACS , IDUACS , & & ISOANUS , ISOAAIS , ISOAACS , ISOACOS , ISOAAII , IH2OPART ,IAII_N , IBCAII , & & IPOMAII , IACI_N , IDUACI , IAIS_N , ISO4AIS , IBCAIS , IPOMAIS , ICOI_N , & @@ -48,10 +47,11 @@ SUBROUTINE TM5M7_INIT(YDGEOMETRY, YRCOMPO, YGFL, YDERAD) IMPLICIT NONE -TYPE(GEOMETRY) ,INTENT(IN) :: YDGEOMETRY -TYPE(TCOMPO) ,INTENT(IN) :: YRCOMPO -TYPE(TYPE_GFLD) ,INTENT(IN) :: YGFL -TYPE(TERAD),INTENT(IN) :: YDERAD +TYPE(GEOMETRY), INTENT(IN) :: YDGEOMETRY +TYPE(MODEL_CHEM_TYPE),INTENT(IN) :: YDCHEM +TYPE(TYPE_GFLD), INTENT(IN) :: YGFL +TYPE(TERAD), INTENT(IN) :: YDERAD + !----------------------------------------------------------------------- !* 0.5 LOCAL VARIABLES ! --------------- @@ -70,11 +70,13 @@ SUBROUTINE TM5M7_INIT(YDGEOMETRY, YRCOMPO, YGFL, YDERAD) IF (LHOOK) CALL DR_HOOK('TM5M7_INIT',0,ZHOOK_HANDLE) ASSOCIATE(& - & NACTAERO => YGFL%NACTAERO, YAERO => YGFL%YAERO, & - & NAERO => YGFL%NAERO, LAERCHEM => YGFL%LAERCHEM, & - & AERO_SCHEME => YRCOMPO%AERO_SCHEME ) + & NACTAERO => YGFL%NACTAERO, YAERO => YGFL%YAERO, & + & NAERO => YGFL%NAERO, LAERCHEM => YGFL%LAERCHEM, & + & AERO_SCHEME => YDCHEM%YRCOMPO%AERO_SCHEME, & + & CHEM_SCHEME => YDCHEM%YRCHEM%CHEM_SCHEME, & + & NAEROOPT => YDERAD%NAEROOPT ) + - !* Init aerosol scheme ! --------------- @@ -93,49 +95,44 @@ SUBROUTINE TM5M7_INIT(YDGEOMETRY, YRCOMPO, YGFL, YDERAD) ! Initialize various dust properties CALL TM5M7_SRC_DUST_INIT - !IF(.not.LAERCHEM)THEN - ! Initialize optics: - ! Make sure that 'WAVE' is already initialized (in tm5_init.F90) - !IF (.NOT. LL_TM5_PHOTO_INI) THEN - ! if (.NOT. LAERCHEM)THEN - ! call PHOTOLYSIS_INI - ! ELSE - ! CALL ABOR1('tm5-based photolysis not yet initialized!!') - ! END if - - !ENDIF - !END IF - - ! Define wavelengths for optics calculations - nwdep = nbands_trop + count(lmid.ne.lmid_gridA) - wav_grid = 0 - wav_gridA = 0 - allocate(photo_wavelengths(nwdep)) - - JL=1 - do JI=1,nbands_trop - if (lmid(JI)==lmid_gridA(JI)) then - photo_wavelengths(JL) = wave(lmid(JI))*1.e4 ! cm to um - wav_grid(JI) = JL - wav_gridA(JI) = JL - JL=JL+1 - else - photo_wavelengths(JL) = wave(lmid(JI))*1.e4 ! cm to um - photo_wavelengths(JL+1) = wave(lmid_gridA(JI))*1.e4 ! cm to um - wav_grid(JI) = JL - wav_gridA(JI) = JL+1 - JL=JL+2 - endif - enddo - allocate(wdep(nwdep)) - wdep(:)%wl = photo_wavelengths - wdep(:)%split = .false. - wdep(:)%insitu = .false. - - CALL TM5M7_OPTICS_INIT(NWDEP,WDEP) - - if (allocated(photo_wavelengths)) deallocate(photo_wavelengths) - if (allocated(wdep)) deallocate(wdep) + ! Define wavelengths (only if using TM5 code to calculate aerosols properties) + IF (NAEROOPT == 1) THEN + + IF (CHEM_SCHEME == "SimChem") THEN + CALL PHOTOLYSIS_INI + ENDIF + + nwdep = nbands_trop + count(lmid.ne.lmid_gridA) + wav_grid = 0 + wav_gridA = 0 + allocate(photo_wavelengths(nwdep)) + + JL=1 + do JI=1,nbands_trop + if (lmid(JI)==lmid_gridA(JI)) then + photo_wavelengths(JL) = wave(lmid(JI))*1.e4 ! cm to um + wav_grid(JI) = JL + wav_gridA(JI) = JL + JL=JL+1 + else + photo_wavelengths(JL) = wave(lmid(JI))*1.e4 ! cm to um + photo_wavelengths(JL+1) = wave(lmid_gridA(JI))*1.e4 ! cm to um + wav_grid(JI) = JL + wav_gridA(JI) = JL+1 + JL=JL+2 + endif + enddo + allocate(wdep(nwdep)) + wdep(:)%wl = photo_wavelengths + wdep(:)%split = .false. + wdep(:)%insitu = .false. + + CALL TM5M7_OPTICS_INIT(NWDEP,WDEP) + + if (allocated(photo_wavelengths)) deallocate(photo_wavelengths) + if (allocated(wdep)) deallocate(wdep) + + ENDIF ! A.Laakso: Taken from ecearth_optics (TM5-ECEARTH3) ! HAM aerosol optics are using these too From 4dc96f0b55db80fbe83a54bebbd336d4dca8c48b Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Fri, 16 May 2025 10:44:27 +0200 Subject: [PATCH 073/129] Fix a couple of HOOK tags --- ifs-source/arpifs/m7/phys_ec/tm5m7_optics_init.F90 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ifs-source/arpifs/m7/phys_ec/tm5m7_optics_init.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_optics_init.F90 index 38fc0849..69d587dd 100644 --- a/ifs-source/arpifs/m7/phys_ec/tm5m7_optics_init.F90 +++ b/ifs-source/arpifs/m7/phys_ec/tm5m7_optics_init.F90 @@ -218,7 +218,7 @@ SUBROUTINE LOAD_TM5M7_OPTICS_DATA_3D(CD_FILE_NAME, CD_VAR_NAME, ILEN,JLEN,KLEN,P & CDSTRING='TM5M7_OPTICS_INIT:LOAD_TM5M7_OPTICS_DATA_3D') ENDIF - IF (LHOOK) CALL DR_HOOK('TM5M7_OPTICS_INIT:TM5M7_OPTICS_INIT:LOAD_TM5M7_OPTICS_DATA_3D',1,ZHOOK_HANDLE) + IF (LHOOK) CALL DR_HOOK('TM5M7_OPTICS_INIT:LOAD_TM5M7_OPTICS_DATA_3D',1,ZHOOK_HANDLE) END SUBROUTINE LOAD_TM5M7_OPTICS_DATA_3D @@ -279,7 +279,7 @@ SUBROUTINE LOAD_TM5M7_OPTICS_DATA_2D(CD_FILE_NAME, CD_VAR_NAME, ILEN,JLEN,PVAR) & CDSTRING='TM5M7_OPTICS_INIT:LOAD_TM5M7_OPTICS_DATA_2D') ENDIF - IF (LHOOK) CALL DR_HOOK('TM5M7_OPTICS_INIT:TM5M7_OPTICS_INIT:LOAD_TM5M7_OPTICS_DATA_2D',1,ZHOOK_HANDLE) + IF (LHOOK) CALL DR_HOOK('TM5M7_OPTICS_INIT:LOAD_TM5M7_OPTICS_DATA_2D',1,ZHOOK_HANDLE) END SUBROUTINE LOAD_TM5M7_OPTICS_DATA_2D @@ -338,7 +338,7 @@ SUBROUTINE LOAD_TM5M7_OPTICS_DATA_1D(CD_FILE_NAME, CD_VAR_NAME, KLEN,PVAR) & CDSTRING='TM5M7_OPTICS_INIT:LOAD_TM5M7_OPTICS_DATA_1D') ENDIF - IF (LHOOK) CALL DR_HOOK('TM5M7_OPTICS_INIT:TM5M7_OPTICS_INIT:LOAD_TM5M7_OPTICS_DATA_1D',1,ZHOOK_HANDLE) + IF (LHOOK) CALL DR_HOOK('TM5M7_OPTICS_INIT:LOAD_TM5M7_OPTICS_DATA_1D',1,ZHOOK_HANDLE) END SUBROUTINE LOAD_TM5M7_OPTICS_DATA_1D From a035b292475389b19378651af9997c198c82fc7b Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Fri, 16 May 2025 14:58:23 +0200 Subject: [PATCH 074/129] Remove unused elements from YGFL type --- .../arpifs/m7/phys_ec/hamm7_interface.F90 | 27 +++++++------------ ifs-source/arpifs/module/yom_ygfl.F90 | 8 +----- 2 files changed, 10 insertions(+), 25 deletions(-) diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index 8c040f9b..c2c35f7a 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -538,15 +538,15 @@ SUBROUTINE HAMM7_INTERFACE( & ASSOCIATE( & ! --- YGFL ------------------------------------------------ - & NACTAERO => YGFL%NACTAERO, NAERO => YGFL%NAERO, & - & NGHG => YGFL%NGHG, NCHEM => YGFL%NCHEM, & - & ZTRAC => YGFL%NTRAC, NDIM => YGFL%NDIM, & - & YAEROUT => YGFL%YAEROUT, YR => YGFL%YR, & - & YS => YGFL%YS, YCHEM => YGFL%YCHEM, & - & YAERO => YGFL%YAERO, YGHG => YGFL%YGHG, & - & YTRAC => YGFL%YTRAC, YAEROCLIM => YGFL%YAEROCLIM, & - & YCDNC => YGFL%YCDNC, YICNC => YGFL%YICNC, & - & YRE_LIQ => YGFL%YRE_LIQ, YRE_ICE => YGFL%YRE_ICE, & + & NACTAERO => YGFL%NACTAERO, NAERO => YGFL%NAERO, & + & NGHG => YGFL%NGHG, NCHEM => YGFL%NCHEM, & + & NDIM => YGFL%NDIM, & + & YAEROUT => YGFL%YAEROUT, YR => YGFL%YR, & + & YS => YGFL%YS, YCHEM => YGFL%YCHEM, & + & YAERO => YGFL%YAERO, YGHG => YGFL%YGHG, & + & YAEROCLIM => YGFL%YAEROCLIM, & + & YCDNC => YGFL%YCDNC, YICNC => YGFL%YICNC, & + & YRE_LIQ => YGFL%YRE_LIQ, YRE_ICE => YGFL%YRE_ICE, & !included CDNC, ICNC, liq and ice eff rad & NAERO_WVL_DIAG => YGFL%NAERO_WVL_DIAG, & & LAERCHEM => YGFL%LAERCHEM, & @@ -680,15 +680,6 @@ SUBROUTINE HAMM7_INTERFACE( & ENDDO ENDDO -DO JEXT=1,ZTRAC - ITRC=ITRC+1 - DO JK=1,KLEV - DO JL=KIDIA,KFDIA - ZCEN(JL,JK,ITRC) = PGFL(JL,JK,YTRAC(JEXT)%MP9_PH) - ENDDO - ENDDO -ENDDO - DO JEXT=1,NAERO ITRC=ITRC+1 DO JK=1,KLEV diff --git a/ifs-source/arpifs/module/yom_ygfl.F90 b/ifs-source/arpifs/module/yom_ygfl.F90 index dd6f6bff..9d6bd585 100644 --- a/ifs-source/arpifs/module/yom_ygfl.F90 +++ b/ifs-source/arpifs/module/yom_ygfl.F90 @@ -223,7 +223,7 @@ MODULE YOM_YGFL ! │ 14-Feb-2019 P Bechtold - add turbulence diagnostics EDR Parameter │ ! │ 20-Feb-2019 F. Vana - WENO quintic interpolation │ ! │ 11-Sep-2020 F. Vana - SLAVEPP in TL/AD │ -! │ 01-Apr-2024 Wu Lianghai - NTRAC and NCHEM_FLX (for hamm7 ?) │ +! │ 01-Apr-2024 Wu Lianghai - NCHEM_FLX (for hamm7 ?) │ ! │ │ ! ╰────────────────────────────────────────────────────────────────────────────╯ @@ -259,7 +259,6 @@ MODULE YOM_YGFL INTEGER(KIND=JPIM) :: NGFL_FORC INTEGER(KIND=JPIM) :: NGFL_EZDIAG INTEGER(KIND=JPIM) :: NGHG -INTEGER(KIND=JPIM) :: NTRAC ! Added for M7 INTEGER(KIND=JPIM) :: NGHG_ASSIM INTEGER(KIND=JPIM) :: NAERO INTEGER(KIND=JPIM) :: NACTAERO @@ -377,8 +376,6 @@ MODULE YOM_YGFL TYPE(TYPE_GFL_COMP),POINTER :: YCHEM(:) => NULL() ! Chemistry TYPE(TYPE_GFL_COMP),POINTER :: YAERO(:) => NULL() ! Aerosols -TYPE(TYPE_GFL_COMP),POINTER :: YTRAC(:) => NULL() ! tracers for diagnostics, due to M7 - TYPE(TYPE_GFL_COMP),POINTER :: YLRCH4 => NULL() ! CH4 loss rate (instantaneous field) TYPE(TYPE_GFL_COMP),POINTER :: YEMIS3D(:) => NULL() ! 3D emissions for atmospheric composition @@ -503,14 +500,11 @@ MODULE YOM_YGFL TYPE(TYPE_AERO_WVL_DIAG) :: YAERO_WVL_DIAG_NL(NPAERO_WVL_DIAG) ! Per-wavelength aerosol optical diagnostics TYPE(TYPE_GFL_NAML) :: YLIMA_NL(JPLIMA) ! LIMA prognostic fields - -!-->eehol: added these ! water and ice cloud variables when using online aerosols TYPE(TYPE_GFL_NAML) :: YCDNC_NL ! Cloud droplet number concentration TYPE(TYPE_GFL_NAML) :: YICNC_NL ! Ice crystal number concentration TYPE(TYPE_GFL_NAML) :: YRE_LIQ_NL ! Effective radius of liquid water droplets TYPE(TYPE_GFL_NAML) :: YRE_ICE_NL ! Effective radius of ice crystals -!-->eehol END TYPE TYPE_GFLD From 74bbe52f51192892e61dd51c7711360ed10f3755 Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Fri, 16 May 2025 15:01:50 +0200 Subject: [PATCH 075/129] Remove dbg print --- ifs-source/arpifs/chem/chem_init.F90 | 5 +++-- ifs-source/arpifs/m7/phys_ec/tm5m7_optics_init.F90 | 7 ++----- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/ifs-source/arpifs/chem/chem_init.F90 b/ifs-source/arpifs/chem/chem_init.F90 index 2a6d819f..4fbb3777 100644 --- a/ifs-source/arpifs/chem/chem_init.F90 +++ b/ifs-source/arpifs/chem/chem_init.F90 @@ -161,11 +161,12 @@ SUBROUTINE CHEM_INIT(YDGEOMETRY,YDML_GCONF,YDDYNA,YDML_CHEM) CASE ("SimChem") - WRITE(*,*)"SimChem:what need to be initialize here? Lianghai" + ! TO BE DONE IN TM5M7_INIT IF NEEDED: + !CALL PHOTOLYSIS_INI CASE DEFAULT - CALL ABOR1(" NO KNOWN CHEMISTRY SCHEME "//TRIM(CHEM_SCHEME) ) + CALL ABOR1(" NO KNOWN CHEMISTRY SCHEME "//TRIM(CHEM_SCHEME) ) END SELECT diff --git a/ifs-source/arpifs/m7/phys_ec/tm5m7_optics_init.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_optics_init.F90 index 69d587dd..c7ba73cc 100644 --- a/ifs-source/arpifs/m7/phys_ec/tm5m7_optics_init.F90 +++ b/ifs-source/arpifs/m7/phys_ec/tm5m7_optics_init.F90 @@ -342,11 +342,6 @@ SUBROUTINE LOAD_TM5M7_OPTICS_DATA_1D(CD_FILE_NAME, CD_VAR_NAME, KLEN,PVAR) END SUBROUTINE LOAD_TM5M7_OPTICS_DATA_1D -END SUBROUTINE TM5M7_OPTICS_INIT - - - - !-------------------------------------------------------------------------- ! TM5 ! !-------------------------------------------------------------------------- @@ -529,3 +524,5 @@ SUBROUTINE TM5M7_OPTICS_WAVELEN_INIT( wdep,NWL ) IF (LHOOK) CALL DR_HOOK('TM5M7_OPTICS_WAVELEN_INIT',1,ZHOOK_HANDLE) END SUBROUTINE TM5M7_OPTICS_WAVELEN_INIT + +END SUBROUTINE TM5M7_OPTICS_INIT From 3efe7979719da85295180ea966ceb95953b844b2 Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Wed, 28 May 2025 12:26:10 +0200 Subject: [PATCH 076/129] Cleanup --- .../arpifs/m7/phys_ec/hamm7_interface.F90 | 25 ++++++++----------- ifs-source/arpifs/phys_ec/su_aerw.F90 | 2 +- .../arpifs/phys_radi/radiation_scheme.F90 | 6 ++--- 3 files changed, 14 insertions(+), 19 deletions(-) diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index c2c35f7a..e879701b 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -188,7 +188,7 @@ SUBROUTINE HAMM7_INTERFACE( & USE MO_HAMMOZ_DRYDEP, ONLY: drydep_interface ! dry deposition interface call USE MO_HAM_RAD, ONLY: ham_rad,ham_rad_cache_cleanup,ham_rad_cache -USE YOE_AER_ACTIV, ONLY: AER_ACTIV !eehol use M&N activation scheme +USE YOE_AER_ACTIV, ONLY: AER_ACTIV ! M&N activation scheme ! [RCHG -> non used] USE MO_SPECIES, ONLY: speclist !SO2 wetdep for simple sulfur scheme ! [RCHG -> non used] USE mo_ham_species, ONLY: id_so2 !SO2 wetdep for simple sulfur scheme @@ -576,12 +576,12 @@ SUBROUTINE HAMM7_INTERFACE( & & LAERVISI => YRERAD%LAERVISI, & & NTSW => YRERAD%NTSW, & & RNS => YRERAD%RNS, & - & RSIGAIR => YRERAD%RSIGAIR, & !!! YAERCLIM is now become YAEROCLIM + & RSIGAIR => YRERAD%RSIGAIR, & & NRADFR => YRERAD%NRADFR, & !FREQUENCY OF FULL RADIATION COMPUTATIONS & NAEROOPT => YRERAD%NAEROOPT, & - & NCLOUDACT => YRERAD%NCLOUDACT, & !eehol: integer to switch activation scheme (0=default,1=Morales&Nenes, 2=Abdul-Razzak&Ghan) - & RCCNSEA => YRERAD%RCCNSEA, & !eehol: default ccn value over sea - & RCCNLND => YRERAD%RCCNLND, & !eehol: default ccn value over land + & NCLOUDACT => YRERAD%NCLOUDACT, & ! integer to switch activation scheme (0=default,1=Morales&Nenes, 2=Abdul-Razzak&Ghan) + & RCCNSEA => YRERAD%RCCNSEA, & ! default ccn value over sea + & RCCNLND => YRERAD%RCCNLND, & ! default ccn value over land ! --- OTHERS ---------------------------------------------- & YDAERM7 => YDPHYAER%YREAEROPT, & ! use this to transfer AOD, SSA and ASY to rad scheme & NWLID => YREAERLID%NWLID, & @@ -832,8 +832,8 @@ SUBROUTINE HAMM7_INTERFACE( & !calculate ICNC ZICNC(KIDIA:KFDIA,1:KLEV) = 0._JPRB ZICNC(KIDIA:KFDIA,1:KLEV) = RNICE -!Put tracer mixing ratios and tendencies to from OIFS to HAM -!initialize to zero + +! Initialize "from-OIFS-to-HAM" tracer mixing ratios and tendencies ZXTM1(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB ZXTTE(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB ZXTTEM1(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB @@ -966,7 +966,7 @@ SUBROUTINE HAMM7_INTERFACE( & ENDDO ! End allocate variables for aerosol processes - ZWPDF(KIDIA:KFDIA,1:KLEV,:) = 0.0_JPRB !eehol: init zwpdf to zero + ZWPDF(KIDIA:KFDIA,1:KLEV,:) = 0.0_JPRB !----------------------------------------------------------------- ! Submodel interface call (HAM aerosol microphysics) @@ -1336,16 +1336,13 @@ SUBROUTINE HAMM7_INTERFACE( & END DO END DO - !ZMSNOWACL(KIDIA:KFDIA,1:KLEV) = ZMRATEPS_str(KIDIA:KFDIA,1:KLEV) !? ZMSNOWACL(KIDIA:KFDIA,1:KLEV) = PSP(KIDIA:KFDIA,1:KLEV) !? ZLFRAC_SO2(KIDIA:KFDIA,:) = 0._JPRB ! zlfrac_so2 only needed in gas scavenging and this is off for now (put this zero) - ZLP(KIDIA:KFDIA,1:KLEV) = PLP(KIDIA:KFDIA,1:KLEV) ! temporary variable for cloud water content (modified in wetdep) - ZIP(KIDIA:KFDIA,1:KLEV) = PIP(KIDIA:KFDIA,1:KLEV) ! temporary variable for cloud ice water content (modified in wetdep) - - ZIPDUM(KIDIA:KFDIA,1:KLEV) = 0._JPRB ! temporary variable for cloud ice water content (modified in wetdep) - + ZLP(KIDIA:KFDIA,1:KLEV) = PLP(KIDIA:KFDIA,1:KLEV) ! temporary variable for cloud water content (modified in wetdep) + ZIP(KIDIA:KFDIA,1:KLEV) = PIP(KIDIA:KFDIA,1:KLEV) ! temporary variable for cloud ice water content (modified in wetdep) + ZIPDUM(KIDIA:KFDIA,1:KLEV) = 0._JPRB ! temporary variable for cloud ice water content (modified in wetdep) ZLPU(KIDIA:KFDIA,1:KLEV) = PLU(KIDIA:KFDIA,1:KLEV) ! temporary variable for cloud water content (modified in wetdep) IF (TRIM(CHEM_SCHEME)=="SimChem")THEN diff --git a/ifs-source/arpifs/phys_ec/su_aerw.F90 b/ifs-source/arpifs/phys_ec/su_aerw.F90 index b830e86b..5eeb92bc 100644 --- a/ifs-source/arpifs/phys_ec/su_aerw.F90 +++ b/ifs-source/arpifs/phys_ec/su_aerw.F90 @@ -412,7 +412,7 @@ SUBROUTINE SU_AERW(YDMODEL) LUVINDX =.FALSE. LAERNITRATE = .FALSE. LDRYDEPVEL_DYN=.FALSE. - + REPSCAER=1.E-20_JPRB ! minimum value for AOD !-- minimum oceanic production of DMS diff --git a/ifs-source/arpifs/phys_radi/radiation_scheme.F90 b/ifs-source/arpifs/phys_radi/radiation_scheme.F90 index 31c10cff..c81f255e 100644 --- a/ifs-source/arpifs/phys_radi/radiation_scheme.F90 +++ b/ifs-source/arpifs/phys_radi/radiation_scheme.F90 @@ -451,11 +451,9 @@ SUBROUTINE RADIATION_SCHEME & & PPRESSURE, PTEMPERATURE, PCLOUD_FRAC, PQ_ICE, PQ_SNOW, PGEMU, & & ZRE_ICE_UM, PPERT=PPERT) ENDIF -!YLCLOUD%RE_LIQ(KIDIA:KFDIA,:) = ZRE_LIQUID_UM(KIDIA:KFDIA,:) * 1.0E-6_JPRB -!YLCLOUD%RE_ICE(KIDIA:KFDIA,:) = ZRE_ICE_UM(KIDIA:KFDIA,:) * 1.0E-6_JPRB -YLCLOUD%RE_LIQ(KIDIA:KFDIA,:) = MIN((MAX((ZRE_LIQUID_UM(KIDIA:KFDIA,:) * 1.0E-6_JPRB),2.0E-6_JPRB)),50.0E-6_JPRB) !eehol: treshold liq effective radius 2-50 um -YLCLOUD%RE_ICE(KIDIA:KFDIA,:) = MIN((MAX((ZRE_ICE_UM(KIDIA:KFDIA,:) * 1.0E-6_JPRB),10.0E-6_JPRB)),150.0E-6_JPRB) !eehol: treshold ice effective radius 10-150 um +YLCLOUD%RE_LIQ(KIDIA:KFDIA,:) = MIN((MAX((ZRE_LIQUID_UM(KIDIA:KFDIA,:) * 1.0E-6_JPRB),2.0E-6_JPRB)), 50.0E-6_JPRB) ! threshold liq effective radius 2-50 um +YLCLOUD%RE_ICE(KIDIA:KFDIA,:) = MIN((MAX((ZRE_ICE_UM(KIDIA:KFDIA,:) * 1.0E-6_JPRB), 10.0E-6_JPRB)),150.0E-6_JPRB) ! threshold ice effective radius 10-150 um ! Get the cloud overlap decorrelation length (for cloud boundaries), ! in km, according to the parameterization specified by NDECOLAT, From f7ae527036cfb52bcafd20e689c4e51a88641003 Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Tue, 3 Jun 2025 15:02:23 +0200 Subject: [PATCH 077/129] Cleanup --- ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 | 7 ++++--- ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 | 1 - ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 | 2 -- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index e879701b..a6786a5c 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -443,8 +443,8 @@ SUBROUTINE HAMM7_INTERFACE( & REAL(KIND=JPRB) :: ZCDNL(KLON), ZCDNW(KLON) !ustar (in not used variable), aerodynamic resis. on surface (in not used variable) REAL(KIND=JPRB) :: ZXTMD1(KLON,KLEV,ntrac) !tracer mixing ratios for HAM drydep (updated with tend) ! output diagnostics -INTEGER,parameter::n_nuc_diag=5 -REAL(KIND=JPRB) :: ZOUT(KLON,ntrac),ZOUT2(KLON,14),zout3(KLON,KLEV,2*(naerocomp+nclass)),zout_dnuc(KLON,KLEV,n_nuc_diag) +INTEGER, PARAMETER :: N_NUC_DIAG=5 +REAL(KIND=JPRB) :: ZOUT(KLON,NTRAC), ZOUT2(KLON,14), ZOUT3(KLON,KLEV,2*(NAEROCOMP+NCLASS)), ZOUT_DNUC(KLON,KLEV,N_NUC_DIAG) REAL(KIND=JPRB) :: SEDOUT(KLON,KLEV,KTRAC) ! changed ntrack to ktrac (RCHG) REAL(KIND=JPRB) :: DDEPOUT(KLON,KLEV,KTRAC) REAL(KIND=JPRB) :: WDEPOUT(KLON,KLEV,KTRAC) @@ -1995,7 +1995,8 @@ SUBROUTINE HAMM7_INTERFACE( & ! ENDDO -! RCHG -> TODO explain here LIFSMIN and LIFSTRAJ --- +! LIFSMIN (T if running minimisation) and LIFSTRAJ (T if running high +! resolution trajectory integration) are both assimilation flags IF(.NOT.LIFSMIN .AND. .NOT.LIFSTRAJ) THEN ! input for HAM-M7 PGFL(KIDIA:KFDIA,1,YAEROUT(1)%MP)=PAOD(KIDIA:KFDIA,10) ! 533nm?? diff --git a/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 index 705e84a7..8f3f47e6 100644 --- a/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 +++ b/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 @@ -214,7 +214,6 @@ SUBROUTINE TM5M7_SRC( & #include "surf_inq.h" #include "tm5m7_src_ss.intfb.h" -!#include "tm5m7_src_ss_lhw.intfb.h" #include "tm5m7_src_dust.intfb.h" !#include "satur.intfb.h" !#include "aer_volce.intfb.h" diff --git a/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 b/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 index b3360c40..3039c544 100644 --- a/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 +++ b/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 @@ -253,8 +253,6 @@ SUBROUTINE AER_PHY3_LAYER(YDSURF, & & STATE%U, STATE%V, PSURF%PCVL, PSURF%PCVH,PSURF%PSD_VF(:,YSD_VF%YSO2DD%MP), PAUX%PGEMU,PSURF%PSD_VD(:,YDSURF%YSD_VD%YBLH%MP)) !,ZTSO2,ZTSO4,ZTSO4_AQ,ZFSO2,ZFSO4 ,ZFSO4_AQ& !&) ! u-wind,v-wind,low veg. cover, high veg. cover, sine of latitude - !write(1022,*) YCDNC%MP9_PH,PGFL(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV,YCDNC%MP9_PH) - ! FIXME Better than 1:14 is to define a variable with value 14 with a meaningful name (RCHG) ! Note that %M7AODLW has 16 wavelenghts (see phys_radi/suecrad.F90, PLS) DO JAER=1,14 From 5fa6b022a667eb2ff156ee4aaec57f6901fdfb2d Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Tue, 3 Jun 2025 14:17:43 +0000 Subject: [PATCH 078/129] Pull request #34: Fix BC/OA mass densities OIFS-602 Merge in ~NM6/openifs-48r1 from OIFS-602-review-m7-bc-oa-mass-densities to knmi-m7 Squashed commit of the following: commit 01e934e966c5626d07c6a8a350f7c180622e6fb8 Author: Philippe Le Sager Date: Tue Jun 3 15:30:57 2025 +0200 Fix BC/OA mass densities --- ifs-source/arpifs/m7/module/mo_ham_m7ctl.F90 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ifs-source/arpifs/m7/module/mo_ham_m7ctl.F90 b/ifs-source/arpifs/m7/module/mo_ham_m7ctl.F90 index 5daddc90..546bf001 100644 --- a/ifs-source/arpifs/m7/module/mo_ham_m7ctl.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_m7ctl.F90 @@ -87,13 +87,13 @@ MODULE mo_ham_m7ctl ! nwater = 0 Jacobson et al., JGR 1996 ! = 1 Kappa-Koehler theory based approach (Petters and Kreidenweis, ACP 2007) - INTEGER :: nsnucl = 1!eehol: nucleation off for M7 originally: 2 ! Choice of the H2SO4/H2O nucleation scheme: + INTEGER :: nsnucl = 1 ! Choice of the H2SO4/H2O nucleation scheme: ! ! nsnucl = 0 off ! = 1 Vehkamaeki et al., JGR 2002 ! = 2 Kazil and Lovejoy, ACP 2007 - INTEGER :: nonucl = 1!eehol: organic nucleation off for M7 originally 1 ! Choice of the organic nucleation scheme: + INTEGER :: nonucl = 1 ! Choice of the organic nucleation scheme: ! ! nonucl = 0 off ! = 1 Activation nucleation, Kulmala et al., ACP 2006 @@ -231,8 +231,8 @@ MODULE mo_ham_m7ctl ! REAL(dp), PARAMETER :: dh2so4 = 1.841_dp, & ! Density H2SO4 [g cm-3] ddust = 2.650_dp, & ! Density du [g cm-3] - dbc = 2._dp, & ! Density bc [g cm-3] - doc = 2._dp, & ! Density oc [g cm-3] + dbc = 1.8_dp, & ! Density bc [g cm-3] + doc = 1.3_dp, & ! Density oc [g cm-3] dnacl = 2.165_dp, & ! Density NaCl [g cm-3] dna2so4 = 2.68_dp, & ! Density Na2SO4 [g cm-3] dnahso4 = 2.435_dp, & ! Density NaHSO4 [g cm-3] From 1338288a05be611ad98721776f4a9b1ab27551bb Mon Sep 17 00:00:00 2001 From: Tommi Bergman Date: Tue, 10 Jun 2025 10:00:44 +0000 Subject: [PATCH 079/129] Pull request #17: Setup for CSC machines (Puhti, ...) Merge in ~NM6/openifs-48r1 from puhti-setup-m7 to knmi-m7 Squashed commit of the following: commit 572577d860809a96b255c3ff01956bf8080bdd09 Author: Philippe Le Sager Date: Tue Jun 10 11:56:14 2025 +0200 Better name for CSC platforms config file commit 2aafeb57d3d5cfa5c1bb2a7b981147aae6167942 Author: Philippe Le Sager Date: Fri May 16 16:52:10 2025 +0200 fixup! Cleanup link-to-link cases commit d5deed5717a502163aa80813fbd05d22e2290d9a Author: Philippe Le Sager Date: Fri May 16 16:39:09 2025 +0200 Cleanup link-to-link cases commit a2e137264f1ff05b69e1fed264e25e9d3be8d825 Author: Philippe Le Sager Date: Wed Apr 9 13:06:10 2025 +0200 Use links for Lumi/gnu config commit 1df12995a2780d254247deb9fa7658dc19ad2f33 Author: Philippe Le Sager Date: Wed Apr 9 11:09:37 2025 +0200 Support for CSC/puhti,mahti,lumi platforms --- arch/csc/final.cmake | 1 + arch/csc/lumi/default | 1 + arch/csc/lumi/gnu/11.2.0/env.sh | 49 ++ arch/csc/lumi/gnu/11.2.0/final.cmake | 1 + arch/csc/lumi/gnu/11.2.0/modulefile.in | 1 + arch/csc/mahti/default | 1 + arch/csc/mahti/gnu/11.2.0/env.sh | 47 ++ arch/csc/mahti/gnu/11.2.0/final.cmake | 1 + arch/csc/mahti/gnu/11.2.0/modulefile.in | 1 + arch/csc/modulefile.in | 1 + arch/csc/puhti/compile_flags_puhti.cmake | 535 ++++++++++++++++++++ arch/csc/puhti/default | 1 + arch/csc/puhti/gnu/11.3.0/env.sh | 44 ++ arch/csc/puhti/gnu/11.3.0/final.cmake | 1 + arch/csc/puhti/gnu/11.3.0/modulefile.in | 1 + arch/csc/puhti/gnu/default | 1 + arch/csc/puhti/intel/2021.6.0/env.sh | 62 +++ arch/csc/puhti/intel/2021.6.0/final.cmake | 1 + arch/csc/puhti/intel/2021.6.0/modulefile.in | 1 + hpc-csc-config.edit_me.sh | 97 ++++ ifs-test/bin/set_launcher.bash | 6 + 21 files changed, 854 insertions(+) create mode 120000 arch/csc/final.cmake create mode 120000 arch/csc/lumi/default create mode 100644 arch/csc/lumi/gnu/11.2.0/env.sh create mode 120000 arch/csc/lumi/gnu/11.2.0/final.cmake create mode 120000 arch/csc/lumi/gnu/11.2.0/modulefile.in create mode 120000 arch/csc/mahti/default create mode 100644 arch/csc/mahti/gnu/11.2.0/env.sh create mode 120000 arch/csc/mahti/gnu/11.2.0/final.cmake create mode 120000 arch/csc/mahti/gnu/11.2.0/modulefile.in create mode 120000 arch/csc/modulefile.in create mode 100644 arch/csc/puhti/compile_flags_puhti.cmake create mode 120000 arch/csc/puhti/default create mode 100755 arch/csc/puhti/gnu/11.3.0/env.sh create mode 120000 arch/csc/puhti/gnu/11.3.0/final.cmake create mode 120000 arch/csc/puhti/gnu/11.3.0/modulefile.in create mode 120000 arch/csc/puhti/gnu/default create mode 100755 arch/csc/puhti/intel/2021.6.0/env.sh create mode 120000 arch/csc/puhti/intel/2021.6.0/final.cmake create mode 120000 arch/csc/puhti/intel/2021.6.0/modulefile.in create mode 100644 hpc-csc-config.edit_me.sh diff --git a/arch/csc/final.cmake b/arch/csc/final.cmake new file mode 120000 index 00000000..0db77c05 --- /dev/null +++ b/arch/csc/final.cmake @@ -0,0 +1 @@ +../ecmwf/final.cmake \ No newline at end of file diff --git a/arch/csc/lumi/default b/arch/csc/lumi/default new file mode 120000 index 00000000..0bb37cb5 --- /dev/null +++ b/arch/csc/lumi/default @@ -0,0 +1 @@ +gnu/11.2.0/ \ No newline at end of file diff --git a/arch/csc/lumi/gnu/11.2.0/env.sh b/arch/csc/lumi/gnu/11.2.0/env.sh new file mode 100644 index 00000000..81b08409 --- /dev/null +++ b/arch/csc/lumi/gnu/11.2.0/env.sh @@ -0,0 +1,49 @@ +# Source me to get the correct configure/build/run environment + +# Store tracing and disable (module is *way* too verbose) +{ tracing_=${-//[^x]/}; set +x; } 2>/dev/null + +module_load() { + echo "+ module load $*" + module load $* +} +module_unload() { + echo "+ module unload $*" + module unload $* +} +module_purge() { + echo "+ module purge" + module purge +} + +# Unload all modules to be certain +module_purge + +# Load modules +module_load LUMI/22.12 +module_load partition/C +module_load EasyBuild-user + +module_load PrgEnv-gnu/8.3.3 +module_load gcc/11.2.0 +module_load cray-mpich/8.1.23 +module_load cray-libsci + +module_load cray-fftw/3.3.10.3 +module_load cray-hdf5/1.12.2.1 +module_load cray-netcdf/4.9.0.1 +#module_load eigen/3.3.7 +#module_load cmake/3.20.2 +#module_load ninja/1.10.0 +#module_load fcm/2019.05.0 +module_load libaec/1.0.6-cpeGNU-22.12 + + +# Setting required for bit reproducibility with Intel MKL: +export MKL_CBWR=AUTO,STRICT + +# Record the RPATH in the executable +export LD_RUN_PATH=$LD_LIBRARY_PATH + +# Restore tracing to stored setting +{ if [[ -n "$tracing_" ]]; then set -x; else set +x; fi } 2>/dev/null diff --git a/arch/csc/lumi/gnu/11.2.0/final.cmake b/arch/csc/lumi/gnu/11.2.0/final.cmake new file mode 120000 index 00000000..bb3bb4f4 --- /dev/null +++ b/arch/csc/lumi/gnu/11.2.0/final.cmake @@ -0,0 +1 @@ +../../../../ecmwf/final.cmake \ No newline at end of file diff --git a/arch/csc/lumi/gnu/11.2.0/modulefile.in b/arch/csc/lumi/gnu/11.2.0/modulefile.in new file mode 120000 index 00000000..67a37141 --- /dev/null +++ b/arch/csc/lumi/gnu/11.2.0/modulefile.in @@ -0,0 +1 @@ +../../../ecmwf/modulefile.in \ No newline at end of file diff --git a/arch/csc/mahti/default b/arch/csc/mahti/default new file mode 120000 index 00000000..0bb37cb5 --- /dev/null +++ b/arch/csc/mahti/default @@ -0,0 +1 @@ +gnu/11.2.0/ \ No newline at end of file diff --git a/arch/csc/mahti/gnu/11.2.0/env.sh b/arch/csc/mahti/gnu/11.2.0/env.sh new file mode 100644 index 00000000..b74b27c7 --- /dev/null +++ b/arch/csc/mahti/gnu/11.2.0/env.sh @@ -0,0 +1,47 @@ +# Source me to get the correct configure/build/run environment + +# Store tracing and disable (module is *way* too verbose) +{ tracing_=${-//[^x]/}; set +x; } 2>/dev/null + +module_load() { + echo "+ module load $*" + module load $* +} +module_unload() { + echo "+ module unload $*" + module unload $* +} +module_purge() { + echo "+ module purge" + module purge +} + +# Unload all modules to be certain +module_purge + +# Load modules +module_load gcc/11.2.0 + +module_load openmpi/4.1.2 +module_load mpich/4.0.1 +module_load netlib-scalapack/2.1.0 +module_load openblas/0.3.18-omp +#module_load intel-oneapi-mkl/2022.1.0 +module_load fftw/3.3.10-mpi +module_load netcdf-fortran/4.5.3 +module_load netcdf-c/4.8.1 +module_load hdf5/1.10.7-mpi +module_load cmake/3.21.4 +module_load libaec/1.0.5 + +# Correct python version and libraries +#module_load geoconda + +# Setting required for bit reproducibility with Intel MKL: +export MKL_CBWR=AUTO,STRICT + +# Record the RPATH in the executable +export LD_RUN_PATH=$LD_LIBRARY_PATH + +# Restore tracing to stored setting +{ if [[ -n "$tracing_" ]]; then set -x; else set +x; fi } 2>/dev/null diff --git a/arch/csc/mahti/gnu/11.2.0/final.cmake b/arch/csc/mahti/gnu/11.2.0/final.cmake new file mode 120000 index 00000000..bb3bb4f4 --- /dev/null +++ b/arch/csc/mahti/gnu/11.2.0/final.cmake @@ -0,0 +1 @@ +../../../../ecmwf/final.cmake \ No newline at end of file diff --git a/arch/csc/mahti/gnu/11.2.0/modulefile.in b/arch/csc/mahti/gnu/11.2.0/modulefile.in new file mode 120000 index 00000000..0801ce95 --- /dev/null +++ b/arch/csc/mahti/gnu/11.2.0/modulefile.in @@ -0,0 +1 @@ +../../../../ecmwf/modulefile.in \ No newline at end of file diff --git a/arch/csc/modulefile.in b/arch/csc/modulefile.in new file mode 120000 index 00000000..dae96ffd --- /dev/null +++ b/arch/csc/modulefile.in @@ -0,0 +1 @@ +../ecmwf/modulefile.in \ No newline at end of file diff --git a/arch/csc/puhti/compile_flags_puhti.cmake b/arch/csc/puhti/compile_flags_puhti.cmake new file mode 100644 index 00000000..f4a1db42 --- /dev/null +++ b/arch/csc/puhti/compile_flags_puhti.cmake @@ -0,0 +1,535 @@ + +# noopt: -DCMAKE_BUILD_TYPE=Debug +# NANS_C: -DCMAKE_BUILD_TYPE=Bit -DIFS_CHECK_BOUNDS=ON -DIFS_INIT_SNAN=ON +# noopt_NANS_C: -DCMAKE_BUILD_TYPE=Debug -DIFS_CHECK_BOUNDS=ON -DIFS_INIT_SNAN=ON + +if(IFS_CHECK_BOUNDS) + # Files that fail bounds checking across multiple compilers. + # Only files generating false positives should be added to this list. + list(APPEND no_bounds_checking + arpifs/adiab/cpg5_gp.F90 + arpifs/adiab/cpg_gp.F90 + arpifs/adiab/cpg_gp_ad.F90 + arpifs/adiab/cpg_gp_hyd.F90 + arpifs/adiab/cpg_gp_tl.F90 + arpifs/adiab/lapinea.F90 + arpifs/adiab/lapinea5.F90 + arpifs/adiab/lapineaad.F90 + arpifs/adiab/lapineatl.F90 + arpifs/adiab/larcinb.F90 + arpifs/adiab/larmes.F90 + arpifs/adiab/larmes5.F90 + arpifs/adiab/larmesad.F90 + arpifs/adiab/larmestl.F90 + arpifs/adiab/lattex.F90 + arpifs/adiab/postphy.F90 + arpifs/chem/chem_bascoetm5.F90 + arpifs/chem/chem_main.F90 + arpifs/chem/chem_massdia.F90 + arpifs/chem/tm5_rbud.F90 + arpifs/phys_radi/radintg.F90 + ) +endif() + + +if(CMAKE_Fortran_COMPILER_ID MATCHES "Cray") + set(autopromote_flags -sreal64) +elseif(CMAKE_Fortran_COMPILER_ID MATCHES "GNU") + set(autopromote_flags -fdefault-real-8 -fdefault-double-8) +elseif(CMAKE_Fortran_COMPILER_ID MATCHES "Intel") + set(autopromote_flags -real-size 64) +elseif(CMAKE_Fortran_COMPILER_ID MATCHES "PGI|NVHPC") + set(autopromote_flags -r8) +endif() + + +if(CMAKE_Fortran_COMPILER_ID MATCHES "Cray") + + set(IFS_Fortran_FLAGS "${IFS_Fortran_FLAGS} -ram -emf") # common flags for all build types + + if(IFS_CHECK_BOUNDS) + set(IFS_Fortran_FLAGS "${IFS_Fortran_FLAGS} -Rb") + endif() + + if(IFS_INIT_SNAN) + set(IFS_Fortran_FLAGS "${IFS_Fortran_FLAGS} -ei") + endif() + + if(IFS_SHARED_LIBS) + set(PIC_FLAGS "-fPIC -hPIC") + endif() + + set(IFS_Fortran_FLAGS_BIT "-hflex_mp=conservative -Othread1 -hfp1 -hadd_paren -homp") # no debug symbols + set(IFS_Fortran_FLAGS_DEBUG "-G0 -O0 -hflex_mp=conservative -hfp0 -hadd_paren -homp") + + if($ENV{CRAY_FTN_VERSION} MATCHES "8.7.0") + # FMA with 8.7.0 breaks the adjoint test + set(IFS_Fortran_FLAGS_BIT "${IFS_Fortran_FLAGS_BIT} -hnofma") # no fused muiltply-add instructions + endif() + + if($ENV{CRAY_FTN_VERSION} MATCHES "8.5.6|8.5.8") + set(IFS_Fortran_FLAGS_BIT "${IFS_Fortran_FLAGS_BIT} -hipa0") # disable interprocedural analysis + endif() + + set(IFS_C_FLAGS_BIT "-O2 -hlist=a -homp") + set(IFS_C_FLAGS_DEBUG "-g -O0 -hlist=a -homp") + + set(IFS_CXX_FLAGS_BIT "-g -O1 -hlist=a -homp") + set(IFS_CXX_FLAGS_DEBUG "-g -O0 -hlist=a -homp") + + set(ECBUILD_SHARED_LINKER_FLAGS "-Wl,--eh-frame-hdr -Wl,--disable-new-dtags -Ktrap=fp -homp") + set(ECBUILD_EXE_LINKER_FLAGS "${ECBUILD_SHARED_LINKER_FLAGS} -Wl,--as-needed -hbyteswapio") + + # Some macro expansions generate very long lines + file(GLOB_RECURSE long_line_srcs RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" + "${CMAKE_CURRENT_SOURCE_DIR}/satrad/rttov/*/*.F*" "${CMAKE_CURRENT_SOURCE_DIR}/odb/*/*.F*") + set_source_files_properties(${long_line_srcs} + PROPERTIES COMPILE_FLAGS "-N1023") + + set_source_files_properties(arpifs/mwave/mwave_emis.F90 + arpifs/mwave/mwave_emis_cmem.F90 + arpifs/phys_radi/raddiag.F90 arpifs/setup/suvert.F90 + arpifs/phys_ec/vdfexcus.F90 arpifs/phys_ec/vdfexcusad.F90 arpifs/phys_ec/vdfexcustl.F90 + surf/external/surftstp.F90 surf/module/surftstp_ctl_mod.F90 + PROPERTIES OVERRIDE_COMPILE_FLAGS "${IFS_Fortran_FLAGS} -O0,fp1,omp ${PIC_FLAGS}") + + set_source_files_properties(arpifs/module/spectral_arp_mod.F90 arpifs/module/varbc_allsky.F90 + arpifs/utility/deallo.F90 arpifs/cma2odb/create_averaged_values.F90 + PROPERTIES OVERRIDE_COMPILE_FLAGS "-g ${IFS_Fortran_FLAGS} -hflex_mp=conservative -hfp1 -hadd_paren ${PIC_FLAGS}") + + set_source_files_properties(arpifs/adiab/larmes.F90 + arpifs/adiab/larmes_xyz.F90 + arpifs/phys_ec/phys_arrays_ini.F90 arpifs/phys_ec/cloudsc.F90 + PROPERTIES COMPILE_FLAGS "-hcontiguous") + + set_source_files_properties(arpifs/phys_ec/vdfouter.F90 + PROPERTIES COMPILE_FLAGS "-Oloop_trips=small") + + set_source_files_properties(arpifs/phys_ec/local_state_ini.F90 + PROPERTIES COMPILE_FLAGS "-hcontiguous -hnopattern") + + set_source_files_properties(arpifs/adiab/larche.F90 + PROPERTIES COMPILE_FLAGS "-Oshortcircuit1 -Oloop_trips=small -hcontiguous") + + set_source_files_properties(wam/Wam_oper/propags2.F + PROPERTIES COMPILE_FLAGS "-Oloop_trips=small") + + set_source_files_properties(arpifs/adiab/cpg.F90 + arpifs/phys_ec/state_update.F90 arpifs/phys_ec/state_increment.F90 arpifs/phys_ec/state_copy.F90 + PROPERTIES COMPILE_FLAGS "-Onopattern -hcontiguous") + + set_source_files_properties(arpifs/phys_radi/radlswr.F90 + PROPERTIES COMPILE_FLAGS "-Ovector0") + + set_source_files_properties(arpifs/phys_radi/lwad.F90 + arpifs/phys_radi/rrtm_ecrt_140gp_mcica.F90 arpifs/phys_radi/srtm_srtm_224gp_mcica.F90 + PROPERTIES COMPILE_FLAGS "-Onopattern") + + set_source_files_properties(wam/Wam_oper/secspom.F + PROPERTIES COMPILE_FLAGS "-hloop_trips=small") + + set_source_files_properties(arpifs/interpol/lascaw.F90 + PROPERTIES COMPILE_FLAGS "-Othread2 -Oshortcircuit1 -hcontiguous") + + set_source_files_properties(arpifs/parallel/brptob.F90 + PROPERTIES COMPILE_FLAGS "-hnopattern -hcontiguous") + + set_source_files_properties(arpifs/phys_radi/radlswad.F90 + PROPERTIES COMPILE_FLAGS "-Onopattern -hcontiguous") + + # Optimised code takes wrong branch leading to division by zero in odb/lib/aggr.c + set_source_files_properties(lib/aggr.c + PROPERTIES COMPILE_FLAGS "-O0") + + # IFS-864 Chemistry solver is not bit-reproducible between NPES settings without + # either -fp0 or -hcpu=ivybridge (as at 46r1 and crayftn 8.5.8) + set_source_files_properties(arpifs/chem/tm5_do_ebi.F90 arpifs/chem/tm5_do_ebi_tc02b.F90 + PROPERTIES COMPILE_FLAGS "-hcpu=ivybridge") + + # Fix internal compiler error + set_source_files_properties(satrad/programs/bufr_grid_screen.F90 + PROPERTIES OVERRIDE_COMPILE_FLAGS "${IFS_Fortran_FLAGS} -hflex_mp=intolerant -Othread1 -hfp1 -hadd_paren" + OVERRIDE_COMPILE_FLAGS_DEBUG "${IFS_Fortran_FLAGS} -g -hflex_mp=intolerant -hfp0 -hadd_paren") + + # Compile MPL sources with -g for better traceback + file(GLOB mpl_srcs RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/ifsaux/module/mpl_*.F90") + set_source_files_properties(${mpl_srcs} PROPERTIES COMPILE_FLAGS "-g") + + # Fix for "CONGRAD: SPTSV/DPTSV returned non-zero info with crayftn 8.7.7 (cdt/18.12) + if($ENV{CRAY_FTN_VERSION} VERSION_GREATER 8.7.6) + set_source_files_properties(trans/module/ftinv_ctlad_mod.F90 + PROPERTIES COMPILE_FLAGS "-O0,fp1,omp") + endif() + + # Fix for FP Overflow in CY47R2 + if($ENV{CRAY_FTN_VERSION} VERSION_GREATER 8.7.6) + set_source_files_properties(arpifs/dia/cpdyddh.F90 + PROPERTIES COMPILE_FLAGS "-O0,fp1,omp") + endif() + + # Fix for FPE in CY47R2 ifs-test/tests/t21/test_4dvar_airep_t + if($ENV{CRAY_FTN_VERSION} VERSION_GREATER 8.7.6) + set_source_files_properties(arpifs/dia/spnorm.F90 + PROPERTIES COMPILE_FLAGS "-O0,fp1,omp") + endif() + + # Fix for internal compiler errors with crayftn 8.7.7 (cdt/18.12) + if($ENV{CRAY_FTN_VERSION} VERSION_GREATER 8.7.6) + set_source_files_properties(arpifs/module/surface_views_module.fypp + PROPERTIES COMPILE_FLAGS "-O0,fp0,noomp") + + set_source_files_properties( + satrad/rttov/main/rttov_alloc_sunglint.F90 satrad/rttov/main/rttov_alloc_transmission_aux.F90 + PROPERTIES COMPILE_FLAGS "-O0,fp1,omp") + + string(TOUPPER ${CMAKE_BUILD_TYPE} btype) + string(REGEX REPLACE "-Rb" "" flags "${IFS_Fortran_FLAGS} ${IFS_Fortran_FLAGS_${btype}}") + set_source_files_properties(arpifs/module/traj_semilag_mod.F90 arpifs/module/traj_physics_mod.F90 enkf/module/obs_base_mod.F90 + PROPERTIES OVERRIDE_COMPILE_FLAGS "${flags} ${PIC_FLAGS}") + endif() + + # IFS-1933 Fix for adjoint test + set_source_files_properties(arpifs/phys_ec/cuascn.F90 + PROPERTIES COMPILE_FLAGS "-hcpu=ivybridge") + + # Fix for adjoint problem with crayftn 8.7.7 (cdt/18.12) + if($ENV{CRAY_FTN_VERSION} VERSION_GREATER 8.7.6) + set_source_files_properties( + surf/module/surfexcdrivers_ctl_mod.F90 surf/module/surfexcdriverstl_ctl_mod.F90 + surf/module/surfexcdriversad_ctl_mod.F90 surf/module/surfexcdriver_ctl_mod.F90 + PROPERTIES COMPILE_FLAGS "-O0,fp1,omp") + endif() + + # Fix for an exception with ifs-test/tests/t21/test_glomap_edge_fc with crayftn 8.7.7 (cdt/18.23) + if($ENV{CRAY_FTN_VERSION} VERSION_GREATER 8.7.6) + set_source_files_properties(arpifs/glomap_mode/ukca_so2so4.F90 + PROPERTIES COMPILE_FLAGS "-O0,fp1") + endif() + + # Routines with very long compile times with crayftn 8.5.8 (cdt/17.03) + if($ENV{CRAY_FTN_VERSION} VERSION_GREATER 8.5.7) + file(GLOB fa_srcs RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/ifsaux/fa/*.F90") + set_source_files_properties(${fa_srcs} arpifs/op_obs/bgobs.F90 + arpifs/control/cnt0.F90 arpifs/control/cprep3.F90 arpifs/control/cprep4.F90 + arpifs/module/field_registry_mod.fypp + arpifs/phys_dmn/aplpar.F90 arpifs/phys_dmn/apl_arome.F90 + arpifs/op_obs/departure_jo.F90 arpifs/op_obs/departure_joad.F90 arpifs/op_obs/departure_jotl.F90 + arpifs/op_obs/hop.F90 arpifs/op_obs/hretr_aeolus.F90 arpifs/obs_preproc/mw_clearsky_screen_wrapper.F90 + arpifs/setup/suafn.F90 arpifs/setup/suafn1.F90 arpifs/setup/su0yomb.F90 arpifs/var/sujbtest.F90 + PROPERTIES COMPILE_FLAGS "-O0,fp1") + endif() + + # Fix for LREPRO4DVAR in crayftn 8.6.2 (cdt/17.09) + if($ENV{CRAY_FTN_VERSION} VERSION_GREATER 8.6.1) + set_source_files_properties(arpifs/adiab/lattex.F90 + PROPERTIES COMPILE_FLAGS "-O0,fp1,omp") + endif() + + # Fix for LREPRO4DVAR in crayftn 8.5.8 (cdt/17.03) + if($ENV{CRAY_FTN_VERSION} VERSION_GREATER 8.5.7) + set_source_files_properties(arpifs/phys_ec/cumastrn.F90 arpifs/phys_ec/cuadjtqs.F90 + arpifs/phys_ec/cuadjtqsad.F90 arpifs/phys_ec/cuadjtqstl.F90 + arpifs/phys_radi/swniad.F90 arpifs/phys_radi/swnitl.F90 arpifs/var/pregprh.F90 + PROPERTIES COMPILE_FLAGS "-O0,fp1,omp,scalar2") + endif() + + # Fix for bugs in crayftn 8.4.5 (cdt/16.03) and 8.5.8 (cdt/17.03) + if($ENV{CRAY_FTN_VERSION} MATCHES "8.4.5|8.5.8") + file(GLOB_RECURSE prepdata_srcs RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/prepdata/*.F*") + set_source_files_properties(${prepdata_srcs} + ssa/plot/coordinates.F90 ssa/plot/fdb_output.F90 ssa/plot/getfields.F90 ssa/plot/print_nml.F90 + ssa/sub/inisnw.F90 ssa/sub/inisst.F90 ssa/sub/init2m.F90 ssa/sub/reg_to_gg.F90 ssa/util/setcomssa.F90 + satrad/programs/bufr_screen_nexrad.F90 satrad/programs/bufr_screen_nexrad.F90 satrad/programs/bufr_screen_opera.F90 + satrad/programs/bufr_screen_synop_rain_gauges.F90 satrad/programs/calc_radiance_fields.F90 + satrad/programs/eda_rad_scale.F90 satrad/programs/gensatim.F90 + PROPERTIES COMPILE_FLAGS "-hipa0") + set_source_files_properties(arpifs/interpol/slcomm2a.F90 arpifs/pp_obs/pos.F90 + PROPERTIES COMPILE_FLAGS "-g") + endif() + + if($ENV{CRAY_FTN_VERSION} VERSION_GREATER 8.4.0) # cdt/15.11 + + # Fix for adjoint test + set_source_files_properties(surf/module/vsurf_mod.F90 surf/module/vsurfs_mod.F90 + surf/module/vsurfstl_mod.F90 surf/module/vsurfsad_mod.F90 surf/module/vupdz0_mod.F90 + surf/module/vupdz0s_mod.F90 surf/module/vupdz0stl_mod.F90 surf/module/vupdz0sad_mod.F90 + surf/module/surfsebs_ctl_mod.F90 surf/module/surfsebstl_ctl_mod.F90 surf/module/surfsebsad_ctl_mod.F90 + surf/module/surfrad_ctl_mod.F90 + PROPERTIES COMPILE_FLAGS "-hcpu=ivybridge") + + # Fix for hang at MPI_finialize in 43R3 with crayftn 8.4.1 (in cdt/15.11) + set_source_files_properties(arpifs/io_serv/io_serv_flush.F90 + PROPERTIES COMPILE_FLAGS "-g") + + # Fix for double free error + string(TOUPPER ${CMAKE_BUILD_TYPE} btype) + string(REGEX REPLACE "-g|-G[0-2]|-Gfast|-Rb" "" flags "${IFS_Fortran_FLAGS} ${IFS_Fortran_FLAGS_${btype}}") + set_source_files_properties(arpifs/adiab/gp_derivatives.F90 + arpifs/setup/sump.F90 arpifs/dia/wrspeca.F90 arpifs/module/iogrida_mod.F90 + PROPERTIES OVERRIDE_COMPILE_FLAGS "${flags} ${PIC_FLAGS}") + + endif() + + if($ENV{CRAY_FTN_VERSION} VERSION_GREATER 8.4.5) # cdt/16.04 + + # Fix for crash in __pgas_runtime_error_checking with crayftn 8.4.6 (in cdt/16.04) + set_source_files_properties(ifsaux/module/oml_mod.F90 arpifs/module/varbc_pred.F90 + PROPERTIES COMPILE_FLAGS "-hnocaf") + + set_source_files_properties(radiation/module/easy_netcdf_read_mpi.F90 radiation/module/easy_netcdf.F90 + PROPERTIES OVERRIDE_COMPILE_FLAGS "${IFS_Fortran_FLAGS} ${IFS_Fortran_FLAGS_DEBUG} ${PIC_FLAGS}") + + endif() + + set_source_files_properties( + climfield/ifs_tools/grib_set_vtable.F90 + climfield/src/checkgg.F90 + climfield/ifs_tools/spint_special_filter.F90 + climfield/ifs_tools/cheminterpol.F90 + climfield/ifs_tools/cheminterpol_vms.F90 + PROPERTIES + OVERRIDE_COMPILE_FLAGS "${IFS_Fortran_FLAGS} -hflex_mp=intolerant -hfp0" + OVERRIDE_COMPILE_FLAGS_DEBUG "${IFS_Fortran_FLAGS} -g -hflex_mp=intolerant -hfp0") + + set_source_files_properties( + climfield/ifs_tools/depth_mode_filter.F90 + PROPERTIES COMPILE_FLAGS "-N 255") + +elseif(CMAKE_Fortran_COMPILER_ID MATCHES "GNU") + + if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "aarch64") + set(IFS_GNU64_FLAG "") + else() + set(IFS_GNU64_FLAG "-m64") + endif() + + string(CONCAT IFS_Fortran_FLAGS "${IFS_Fortran_FLAGS} ${IFS_GNU64_FLAG} " + "-fconvert=big-endian -fPIC -fopenmp " + "-fno-range-check -ffree-line-length-none -fbacktrace -fno-second-underscore " + "-fconvert=swap") + #"-ffpe-trap=invalid,zero,overflow -fconvert=swap") + + # gfortran 10 has become stricter with argument matching + if( NOT CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 10 ) + string(CONCAT IFS_Fortran_FLAGS "${IFS_Fortran_FLAGS} -fallow-argument-mismatch -fallow-invalid-boz") + endif() + + if(IFS_CHECK_BOUNDS) + set(IFS_Fortran_FLAGS "${IFS_Fortran_FLAGS} -fcheck=bounds") + + # Disable bounds checking on files that would fail the check. + # Only files generating false positives should be added to this list. + set_source_files_properties( + ${no_bounds_checking} + arpifs/adiab/call_sl.F90 + arpifs/adiab/cpg_drv.F90 + arpifs/adiab/cpg_drv_ad.F90 + arpifs/adiab/cpg_drv_tl.F90 + arpifs/glomap_mode/aer_dust.F90 + arpifs/module/ecphys_perturb_type_mod.F90 + arpifs/phys_ec/ec_phys_ad.F90 + arpifs/phys_ec/ec_phys_drv.F90 + arpifs/phys_ec/ec_phys_drv_tl.F90 + arpifs/phys_ec/ec_phys_tl.F90 + PROPERTIES COMPILE_FLAGS "-fcheck=no-bounds") + endif() + + if(IFS_INIT_SNAN) + set(IFS_Fortran_FLAGS "${IFS_Fortran_FLAGS} -finit-real=snan") + endif() + + set(IFS_Fortran_FLAGS_BIT "-g -O2") + set(IFS_Fortran_FLAGS_DEBUG "-g -O0") + + set(IFS_C_FLAGS_BIT "-g ${IFS_GNU64_FLAG}") + set(IFS_C_FLAGS_DEBUG "-g -O0 ${IFS_GNU64_FLAG}") + + if( CMAKE_CXX_COMPILER_ID MATCHES "GNU" ) + set(IFS_CXX_FLAGS_BIT "-g -O1 ${IFS_GNU64_FLAG}") + set(IFS_CXX_FLAGS_DEBUG "-g -O0 ${IFS_GNU64_FLAG}") + endif() + + find_package( OpenMP COMPONENTS Fortran REQUIRED ) + if( TARGET OpenMP::OpenMP_Fortran ) + set( IFS_OMP_Fortran_LIBRARIES OpenMP::OpenMP_Fortran ) + endif() + + if( APPLE ) + + if( NOT IFS_OMP_Fortran_LIBRARIES ) + ecbuild_error( "OpenMP libraries not found" ) + endif() + + else() + + set( IFS_LINK_FLAGS "-Wl,--eh-frame-hdr -Wl,--disable-new-dtags -fopenmp" ) + + endif() + + set( ECBUILD_SHARED_LINKER_FLAGS "${IFS_LINK_FLAGS}" ) + if( NOT ${CMAKE_SYSTEM_NAME} MATCHES "Darwin") # Darwin linker does not support --as-needed + set( ECBUILD_EXE_LINKER_FLAGS "${ECBUILD_SHARED_LINKER_FLAGS} -Wl,--as-needed" ) + endif() + + if( $ENV{HOSTNAME} MATCHES "lxc.*|lxg.*") + set( ECBUILD_EXE_LINKER_FLAGS "${ECBUILD_EXE_LINKER_FLAGS} -Wl,--allow-shlib-undefined" ) + set( ECBUILD_MODULE_LINKER_FLAGS "${ECBUILD_MODULE_LINKER_FLAGS} -Wl,--allow-shlib-undefined" ) + set( ECBUILD_SHARED_LINKER_FLAGS "${ECBUILD_SHARED_LINKER_FLAGS} -Wl,--allow-shlib-undefined" ) + endif() + + # Fixes for Ubuntu Docker container running OpenMPI 4.1 + # Without these changes, ifstest fails on the ubuntu dockers + # None of these routines use OpenMP directly, so apply generally. + + set_source_files_properties( + # Fix most ifs-test configurations + arpifs/control/cnt0.F90 arpifs/setup/su0yomb.F90 arpifs/fullpos/sufpdyn.F90 + # Fix adjoint & tangent tests + arpifs/var/suscal.F90 + # Fix 4dvar tests + arpifs/var/suecges.F90 arpifs/var/suinfce.F90 + # Fix SCM test + scmec/source/cnt1c.F90 + PROPERTIES COMPILE_FLAGS "-fno-openmp") + +elseif(CMAKE_Fortran_COMPILER_ID MATCHES "Intel") + + string(CONCAT IFS_Fortran_FLAGS "${IFS_Fortran_FLAGS} -fpe0 -convert big_endian -assume byterecl -align array64byte " + "-traceback -fpic -qopenmp -qopenmp-threadprivate compat -fp-model precise " + "-fp-speculation=safe -qopt-report=2 -qopt-report-phase=all -fast-transcendentals -ftz " + "-finline-functions -finline-limit=1500 -Winline -assume realloc_lhs " + "-diag-disable=7713 " # disable unused statement functions warning + "-diag-disable=11021 " # disable unresolved libraries in ipo warning + "-diag-disable=10397" ) # disable message reporting location of opt report files + + if(IFS_CHECK_BOUNDS) + set(IFS_Fortran_FLAGS "${IFS_Fortran_FLAGS} -check bounds") + + # Disable bounds checking on files that would fail the check. + # Only files generating false positives should be added to this list. + set_source_files_properties( + ${no_bounds_checking} + PROPERTIES COMPILE_FLAGS "-check nobounds") + endif() + + if(IFS_INIT_SNAN) + set(IFS_Fortran_FLAGS "${IFS_Fortran_FLAGS} -init=snan") + endif() + + set(IFS_Fortran_FLAGS_BIT "-g -O2 -march=core-avx2 -no-fma ") + set(IFS_Fortran_FLAGS_DEBUG "-g -O0") + + set(IFS_C_FLAGS_BIT "-g -O2 -march=core-avx2 -no-fma ") + set(IFS_C_FLAGS_DEBUG "-g -O0") + + set(IFS_CXX_FLAGS_BIT "-g -O2 -march=core-avx2 -no-fma ") + set(IFS_CXX_FLAGS_DEBUG "-g -O0") + + set(ECBUILD_SHARED_LINKER_FLAGS "-Wl,--eh-frame-hdr -Wl,--disable-new-dtags -qopenmp -O2 -L$ENV{TBBROOT}/lib/intel64/gcc4.8 -ltbbmalloc_proxy") + if( $ENV{HOSTNAME} MATCHES "cc.*") + # On Cray using the Intel compiler cmake links with the Intel ifcore run-time library without + # multi-threaded support. This adds the version with multi-threaded support. See JIRA issue ECBUILD-464. + set(ECBUILD_SHARED_LINKER_FLAGS "${ECBUILD_SHARED_LINKER_FLAGS} -lifcoremt" ) + endif() + set(ECBUILD_EXE_LINKER_FLAGS "${ECBUILD_SHARED_LINKER_FLAGS}") + + # Use heap-arrays on leap42 desktops which have small default stack size + if( $ENV{ECPLATFORM} MATCHES "desktop-leap42") + set(IFS_Fortran_FLAGS "${IFS_Fortran_FLAGS} -heap-arrays 64 ") + endif() + + # Workaround for Intel 18.0.1 bug + string(TOUPPER ${CMAKE_BUILD_TYPE} btype) + string(REPLACE "-qopenmp " "" flags "${IFS_Fortran_FLAGS} ${IFS_Fortran_FLAGS_${btype}}") + set_source_files_properties(arpifs/fullpos/sufpdyn.F90 PROPERTIES OVERRIDE_COMPILE_FLAGS "${flags}") + + # Source file specific optimisations + set_source_files_properties(arpifs/phys_ec/cloudsc.F90 + PROPERTIES OVERRIDE_COMPILE_FLAGS "${IFS_Fortran_FLAGS} -g -O3 -march=core-avx2 -no-fma ") + + set_source_files_properties(arpifs/adiab/laitli.F90 + PROPERTIES OVERRIDE_COMPILE_FLAGS "${IFS_Fortran_FLAGS} -g -O3 -march=core-avx2 -no-fma -qopt-prefetch=0 ") + + set_source_files_properties(arpifs/phys_ec/cloudvar.F90 + PROPERTIES OVERRIDE_COMPILE_FLAGS "${IFS_Fortran_FLAGS} -g -O3 -march=core-avx2 -no-fma ") + + set_source_files_properties(radiation/module/radiation_mcica_sw.F90 + PROPERTIES OVERRIDE_COMPILE_FLAGS "${IFS_Fortran_FLAGS} -g -O2 -march=core-avx2 -no-fma -vecabi=cmdtarget ") + + set_source_files_properties(radiation/module/radiation_cloud_generator.F90 + PROPERTIES OVERRIDE_COMPILE_FLAGS "${IFS_Fortran_FLAGS} -g -O2 -march=core-avx2 -no-fma -vecabi=cmdtarget ") + + set_source_files_properties(arpifs/phys_radi/radintg.F90 + PROPERTIES OVERRIDE_COMPILE_FLAGS "${IFS_Fortran_FLAGS} -g -O3 -march=core-avx2 -no-fma ") + + set_source_files_properties(arpifs/phys_ec/radiation_aerosol_optics.F90 + PROPERTIES OVERRIDE_COMPILE_FLAGS "${IFS_Fortran_FLAGS} -g -O3 -march=core-avx2 -no-fma ") + + set_source_files_properties(arpifs/adiab/larmes.F90 + PROPERTIES OVERRIDE_COMPILE_FLAGS "${IFS_Fortran_FLAGS} -g -O3 -march=core-avx2 -no-fma ") + + set_source_files_properties(ifs/adiab/larmes_xyz.F90 + PROPERTIES OVERRIDE_COMPILE_FLAGS "${IFS_Fortran_FLAGS} -g -O3 -march=core-avx2 -no-fma ") + + + # Workaround for Intel 18.0.0 bug IFS-1425 + set_source_files_properties(satrad/programs/calc_radiance_fields.F90 + PROPERTIES OVERRIDE_COMPILE_FLAGS "${IFS_Fortran_FLAGS} -O1 -g ") + + if($ENV{ECPLATFORM} MATCHES "desktop-leap42") + set_source_files_properties(ifsaux/support/ec_args.c + PROPERTIES OVERRIDE_COMPILE_FLAGS "${IFS_C_FLAGS} -std=c99") + endif() + +elseif(CMAKE_Fortran_COMPILER_ID MATCHES "PGI") + +# # Global flags + set(IFS_Fortran_FLAGS "${IFS_Fortran_FLAGS} -Mbyteswapio -Kieee -mp") +# + set(IFS_Fortran_FLAGS_BIT "-g -O2") + set(IFS_Fortran_FLAGS_DEBUG "-O0 -g -C -Mchkstk -Ktrap=fp -Mchkfpstk -Mchkptr -Mbounds -Mcoff -Mdwarf1 -Mdwarf2 -Mdwarf3 -Melf -Mnodwarf -traceback") +# +# # Directory flags +# file(GLOB phys_radi_srcs RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/arpifs/phys_radi/*.F90") +# set_source_files_properties(${phys_radi_srcs} PROPERTIES COMPILE_FLAGS "-Mbyteswapio") +# +# # Single file flags + set_source_files_properties(arpifs/phys_radi/surrtab.F90 PROPERTIES COMPILE_FLAGS "-Kieee -Mbyteswapio") +# + set(IFS_C_FLAGS_BIT "-g -O1") + set(IFS_C_FLAGS_DEBUG "-g -O0") +# +# set(ECBUILD_SHARED_LINKER_FLAGS "-Wl,--eh-frame-hdr -Wl,--disable-new-dtags -openmp") +# set(ECBUILD_EXE_LINKER_FLAGS "${ECBUILD_SHARED_LINKER_FLAGS}") + +endif() + +if( CMAKE_C_COMPILER_ID MATCHES "Clang") + set(CMAKE_C_LINK_FLAGS "") # no openmp possible +endif() +if( CMAKE_CXX_COMPILER_ID MATCHES "Clang") + set(CMAKE_CXX_LINK_FLAGS "") # no openmp possible +endif() + +if( ${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + set(ECBUILD_EXE_LINKER_FLAGS "${ECBUILD_EXE_LINKER_FLAGS} -Wl,-stack_size,12000000") # 1000000 = 16MB +endif() + +macro( add_precision_suffix _var ) + if( DEFINED ${_var} ) + string( REPLACE "IFS" "${PNAME}" _var_with_suffix "${_var}" ) + set( ${_var_with_suffix} ${${_var}} ) + endif() +endmacro() + +add_precision_suffix( IFS_Fortran_FLAGS ) +add_precision_suffix( IFS_Fortran_FLAGS_DEBUG ) +add_precision_suffix( IFS_Fortran_FLAGS_BIT ) + +add_precision_suffix( IFS_C_FLAGS ) +add_precision_suffix( IFS_C_FLAGS_DEBUG ) +add_precision_suffix( IFS_C_FLAGS_BIT ) + +add_precision_suffix( IFS_CXX_FLAGS ) +add_precision_suffix( IFS_CXX_FLAGS_DEBUG ) +add_precision_suffix( IFS_CXX_FLAGS_BIT ) diff --git a/arch/csc/puhti/default b/arch/csc/puhti/default new file mode 120000 index 00000000..78100fda --- /dev/null +++ b/arch/csc/puhti/default @@ -0,0 +1 @@ +intel/2021.6.0/ \ No newline at end of file diff --git a/arch/csc/puhti/gnu/11.3.0/env.sh b/arch/csc/puhti/gnu/11.3.0/env.sh new file mode 100755 index 00000000..61a317e0 --- /dev/null +++ b/arch/csc/puhti/gnu/11.3.0/env.sh @@ -0,0 +1,44 @@ +# Source me to get the correct configure/build/run environment + +# Store tracing and disable (module is *way* too verbose) +{ tracing_=${-//[^x]/}; set +x; } 2>/dev/null + +module_load() { + echo "+ module load $*" + module load $* +} +module_unload() { + echo "+ module unload $*" + module unload $* +} +module_purge() { + echo "+ module purge" + module purge +} + +# Unload all modules to be certain +module_purge + +# Load modules +module_load gcc/11.3.0 + +module_load openmpi/4.1.4 +module_load intel-oneapi-mkl/2022.1.0 +module_load fftw/3.3.10-mpi +module_load netcdf-fortran/4.5.4 +module_load netcdf-c/4.8.1 +module_load hdf5/1.10.8 +module_load cmake/3.23.1 +module_load libaec/1.0.6 + +# Correct python version and libraries +module_load geoconda + +# Setting required for bit reproducibility with Intel MKL: +export MKL_CBWR=AUTO,STRICT + +# Record the RPATH in the executable +export LD_RUN_PATH=$LD_LIBRARY_PATH + +# Restore tracing to stored setting +{ if [[ -n "$tracing_" ]]; then set -x; else set +x; fi } 2>/dev/null diff --git a/arch/csc/puhti/gnu/11.3.0/final.cmake b/arch/csc/puhti/gnu/11.3.0/final.cmake new file mode 120000 index 00000000..bb3bb4f4 --- /dev/null +++ b/arch/csc/puhti/gnu/11.3.0/final.cmake @@ -0,0 +1 @@ +../../../../ecmwf/final.cmake \ No newline at end of file diff --git a/arch/csc/puhti/gnu/11.3.0/modulefile.in b/arch/csc/puhti/gnu/11.3.0/modulefile.in new file mode 120000 index 00000000..0801ce95 --- /dev/null +++ b/arch/csc/puhti/gnu/11.3.0/modulefile.in @@ -0,0 +1 @@ +../../../../ecmwf/modulefile.in \ No newline at end of file diff --git a/arch/csc/puhti/gnu/default b/arch/csc/puhti/gnu/default new file mode 120000 index 00000000..fcfed5b0 --- /dev/null +++ b/arch/csc/puhti/gnu/default @@ -0,0 +1 @@ +11.3.0 \ No newline at end of file diff --git a/arch/csc/puhti/intel/2021.6.0/env.sh b/arch/csc/puhti/intel/2021.6.0/env.sh new file mode 100755 index 00000000..1971aada --- /dev/null +++ b/arch/csc/puhti/intel/2021.6.0/env.sh @@ -0,0 +1,62 @@ +# Source me to get the correct configure/build/run environment + +# Store tracing and disable (module is *way* too verbose) +{ tracing_=${-//[^x]/}; set +x; } 2>/dev/null + +module_load() { + echo "+ module load $*" + module load $* +} +module_unload() { + echo "+ module unload $*" + module unload $* +} +module_purge() { + echo "+ module purge" + module purge +} + +# Unload all modules to be certain +[[ ${IFS_RUNTIME_ENV:-unset} == "unset" ]] && module_purge + +# Load modules + +export USER_SPACK_ROOT=/fmi/projappl/project_2003011/spack-intel +module_load spack/v0.18-user + +module_load intel-oneapi-compilers-classic/2021.6.0 +#module_load intel-oneapi-compilers/2022.1.0 +module_load intel-oneapi-tbb/2021.6.0 +module_load intel-oneapi-mpi/2021.6.0 +module_load intel-oneapi-mkl/2022.1.0 + +module_load fftw/3.3.10-mpi +module_load netcdf-c/4.8.1 +module_load netcdf-fortran/4.5.4 +module_load hdf5/1.12.2-mpi +module_load cmake/3.23.1 + +#module_load geoconda +source /fmi/projappl/project_2003011/bergmant/openifs-48r1-pls/.oifspy/bin/activate +lspack="/appl/spack/v018/install-tree/intel-2021.6.0" +llibaec=$lspack/libaec-1.0.6-txsq2w + +for lib in $llibaec; do + export CPATH=$lib/include:$CPATH + export LIBRARY_PATH=$lib/lib64:$LIBRARY_PATH + export PATH=$lib/bin:$PATH + export PKG_CONFIG_PATH=$lib/lib/pkgconfig:$PKG_CONFIG_PATH + export CMAKE_PREFIX_PATH=$lib/.:$CMAKE_PREFIX_PATH + export LD_LIBRARY_PATH=$lib/lib64:$LD_LIBRARY_PATH + export LIBAEC_INSTALL_ROOT=$lib +done + +# Setting required for bit reproducibility with Intel MKL: +export MKL_CBWR=AUTO,STRICT + +# Record the RPATH in the executable +export LD_RUN_PATH=$LD_LIBRARY_PATH + +# Restore tracing to stored setting +{ if [[ -n "$tracing_" ]]; then set -x; else set +x; fi } 2>/dev/null + diff --git a/arch/csc/puhti/intel/2021.6.0/final.cmake b/arch/csc/puhti/intel/2021.6.0/final.cmake new file mode 120000 index 00000000..bb3bb4f4 --- /dev/null +++ b/arch/csc/puhti/intel/2021.6.0/final.cmake @@ -0,0 +1 @@ +../../../../ecmwf/final.cmake \ No newline at end of file diff --git a/arch/csc/puhti/intel/2021.6.0/modulefile.in b/arch/csc/puhti/intel/2021.6.0/modulefile.in new file mode 120000 index 00000000..0801ce95 --- /dev/null +++ b/arch/csc/puhti/intel/2021.6.0/modulefile.in @@ -0,0 +1 @@ +../../../../ecmwf/modulefile.in \ No newline at end of file diff --git a/hpc-csc-config.edit_me.sh b/hpc-csc-config.edit_me.sh new file mode 100644 index 00000000..e93431de --- /dev/null +++ b/hpc-csc-config.edit_me.sh @@ -0,0 +1,97 @@ +# +# +# hpc-config.edit_me.sh +# +# +# This script sets the HPC environment for CSC platforms (puhti, +# lumi, and mahti) for OpenIFS 48r1 +# +# The script is ran in oifs-config.edit_me.sh, which requires +# editing for that purpose. +# +# + +#--- set default values to unset for some variables ---------------------- +unset HPC_PARTITION +unset HPC_ACCOUNT +unset DEFAULT_NUM_THREADS +unset IGT_BUILD_LAUNCHER +unset IGT_TEST_LAUNCHER +unset HPC_FLAGS + +#--- set HPC architecture specific settings ----------------------------- + +if [[ $HPC_PLATFORM == "hpc2020" ]]; then + #--- HPC2020 SPECIFIC SETTINGS + + #--- global variables + export DEFAULT_NUM_THREADS=64 + + #--- + +elif [[ $HPC_PLATFORM == "puhti" ]]; then + #--- PUHTI SPECIFIC SETTINGS + #--- local variables + PARTITION="--partition=fmi" + ACCOUNT="--account=project_2003011" + MEM="--mem=0" + + # Add exclusive flag for Puhti: + # start a single tasks reserving a full node (shared otherwise), + # also change the default TMPDIR (changed in openifs-bundle) + HPC_FLAGS="-n 1 --exclusive --export=ALL,MY_TMP=/dev/shm" + + #--- global variables + # Since we need to reserve the full node, make use of it + export DEFAULT_NUM_THREADS=40 + + # Make sure GIT is loaded + module load git + + # Overwrite compile flags. There's a bug in Puhti installed libxml + # resulting in floating point exception due to the use of -ffpe-trap= + cp -f /fmi/projappl/project_2003011/bergmant/openifs-48r1-pls/arch/csc/puhti/compile_flags_puhti.cmake /fmi/projappl/project_2003011/bergmant/openifs-48r1-pls/ifs-source/cmake/compile_flags.cmake + + #--- + +elif [[ $HPC_PLATFORM == "lumi" ]]; then + #--- LUMI SPECIFIC SETTINGS + #--- local variables + PARTITION="--partition=small" + ACCOUNT="--account=project_462000178" + MEM="--mem=60GB" + + #--- global variables + export DEFAULT_NUM_THREADS=16 + export EBU_USER_PREFIX=/project/project_462000178/EasyBuild + + #--- + +elif [[ $HPC_PLATFORM == "mahti" ]]; then + #--- MAHTI SPECIFIC SETTINGS + #--- local variables + PARTITION="--partition=medium" + ACCOUNT="--account=project_2001029" + MEM="--mem=60GB" + + # Need specify the number of tasks for slurm, + # otherwise thread number used as tasks + HPC_FLAGS="-n 1" + + #--- global variables + export DEFAULT_NUM_THREADS=10 + + #--- + +else + #--- UNSPECIFIED PLATFORM DEFAULTS + # Note: Default threads = 8 works on Mac M1 but is + # potentially too high for older systems + export DEFAULT_NUM_THREADS=8 +fi + +#--- set non-default launcher options +if [[ $HPC_HOST == "csc" ]]; then + export IGT_BUILD_LAUNCHER="srun $HPC_FLAGS -c ${DEFAULT_NUM_THREADS} ${MEM} --time=60 $ACCOUNT $PARTITION" + export IGT_TEST_LAUNCHER="salloc -n 8 --mem=20GB --time=60 $ACCOUNT $PARTITION" +fi diff --git a/ifs-test/bin/set_launcher.bash b/ifs-test/bin/set_launcher.bash index 635c7607..2d7834a1 100644 --- a/ifs-test/bin/set_launcher.bash +++ b/ifs-test/bin/set_launcher.bash @@ -12,4 +12,10 @@ if [[ "${ECPLATFORM:-"unset"}" == "hpc2020" ]] ; then LAUNCHER_OTHER_FLAGS="--gres=ssdtmp:0" export OMP_PROC_BIND=true export OMP_PLACES=threads +elif [[ "${ECPLATFORM:-"unset"}" == "puhti" ]] + LAUNCHER="srun" + LAUNCHER_NPROC_FLAG="-n" + LAUNCHER_NTHREAD_FLAG="--cpus-per-task" + export OMP_PROC_BIND=true + export OMP_PLACES=threads fi From 099085837fdfa86599342e9dfca9b9c2f661251a Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Thu, 19 Jun 2025 12:48:12 +0000 Subject: [PATCH 080/129] Pull request #36: Fix broken use cases (not using M7 or 137 levels) Merge in ~NM6/openifs-48r1 from fix-91Levels-n-stdt-fc to knmi-m7 Squashed commit of the following: commit 8f112297b763fb4a94267f6960b067e1abf78d42 Author: Philippe Le Sager Date: Fri Jun 13 16:57:21 2025 +0200 Fix NCLOUDACT usage if not using M7 commit caaf3c8b126fa975ffb5a648e75e2ee058bf52c7 Author: Philippe Le Sager Date: Fri Jun 13 13:27:03 2025 +0200 Fix interface to cloud aerosol interactions commit 56a556f77995d8d133b13abfc3ff5d7742bede38 Author: Philippe Le Sager Date: Fri Jun 13 13:20:57 2025 +0200 Fix for 91 levels --- .../arpifs/m7/phys_ec/hamm7_interface.F90 | 6 +++ ifs-source/arpifs/phys_ec/callpar.F90 | 13 ++--- ifs-source/arpifs/phys_radi/raddrv.F90 | 54 +++++++++---------- 3 files changed, 37 insertions(+), 36 deletions(-) diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index a6786a5c..542b18d4 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -2030,6 +2030,12 @@ SUBROUTINE HAMM7_INTERFACE( & PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(18)%MP) = WDEPOUT_BC_2D(KIDIA:KFDIA,KAERO(JN)) PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(5)%MP) = PAERSRC(KIDIA:KFDIA,KAERO(JN)) - PCFLX(KIDIA:KFDIA,KAERO(JN))* ZDPG(KIDIA:KFDIA,KLEV) END DO + PGFL(KIDIA:KFDIA,NACTAERO+2,YAEROUT(5)%MP) = ZBLHIDX(KIDIA:KFDIA) + PGFL(KIDIA:KFDIA,NACTAERO+3,YAEROUT(5)%MP) = PBLH(KIDIA:KFDIA) + + PGFL(KIDIA:KFDIA,NACTAERO+4,YAEROUT(5)%MP) = ((PGEOH(KIDIA:KFDIA,KLEV)-PGEOH(KIDIA:KFDIA,KLEV))*ZRG) + PGFL(KIDIA:KFDIA,NACTAERO+5,YAEROUT(5)%MP) = ((PGEOH(KIDIA:KFDIA,KLEV-1)-PGEOH(KIDIA:KFDIA,KLEV))*ZRG) + PGFL(KIDIA:KFDIA,NACTAERO+6,YAEROUT(5)%MP) = ((PGEOH(KIDIA:KFDIA,KLEV-2)-PGEOH(KIDIA:KFDIA,KLEV))*ZRG) DO JN=1,NACTAERO ZTMP=0.0_JPRB diff --git a/ifs-source/arpifs/phys_ec/callpar.F90 b/ifs-source/arpifs/phys_ec/callpar.F90 index fab5b7a7..2237e20c 100644 --- a/ifs-source/arpifs/phys_ec/callpar.F90 +++ b/ifs-source/arpifs/phys_ec/callpar.F90 @@ -1120,17 +1120,14 @@ SUBROUTINE CALLPAR(YDGEOMETRY,YDVARS,YDSURF,YDMODEL,KDIM,& !* 5a. get the aerosols to pass down to the cloud schemes ! ------------------------------------------------------ -IF (NAERCLD > 0 .OR. NCLOUDACT > 0) THEN - SELECT CASE (TRIM(AERO_SCHEME)) - CASE ("hamm7") +IF (NAERCLD > 0) THEN + IF ( NACTAERO /= 0 .AND. TRIM(AERO_SCHEME) == "hamm7") THEN ! To avoid modification within cloud_layer.F90 AUXL%ZCCN(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV) = PGFL(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV,YGFL%YCDNC%MP9_PH) ! liquid cloud condensation nuclei - AUXL%ZNICE(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV) = PGFL(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV,YGFL%YICNC%MP9_PH) ! ice number concentration (cf. CCN) - CASE ("aer") + AUXL%ZNICE(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV) = PGFL(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV,YGFL%YICNC%MP9_PH) ! ice number concentration (cf. CCN) + ELSE CALL AER_CLOUD_LAYER(YDMODEL,KDIM,PAUX,STATE_T0,PDIAG,GEMSL,AUXL) - CASE DEFAULT - CALL ABOR1(" NO AEROSOL SCHEME "//TRIM(AERO_SCHEME) ) - END SELECT + ENDIF ELSE ! routine is by-passed AUXL%ZLCRIT_AER(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV)=0.0_JPRB diff --git a/ifs-source/arpifs/phys_radi/raddrv.F90 b/ifs-source/arpifs/phys_radi/raddrv.F90 index 860e6bc6..1d73e116 100644 --- a/ifs-source/arpifs/phys_radi/raddrv.F90 +++ b/ifs-source/arpifs/phys_radi/raddrv.F90 @@ -687,36 +687,34 @@ SUBROUTINE RADDRV(YDGEOMETRY,YDFIELDS,YDMODEL,KGPTOT,KFLDS,KBLOCKS,PGPIN) ENDDO IF (TRIM(AERO_SCHEME) == "hamm7" ) THEN - !IF (NSTEP /= YDRIP%NSTART) THEN - DO JAER=1,14 - DO JK=1,NFLEVG - DO JL=IST,IEND - ZAEROTAU(JSTGLO+JL-1,JK,JAER) = YDAERM7%M7AOD(JL,JK,JAER,IBL) - ZAEROSSA(JSTGLO+JL-1,JK,JAER) = YDAERM7%M7SSA(JL,JK,JAER,IBL)*YDAERM7%M7AOD(JL,JK,JAER,IBL) - ZAEROASYM(JSTGLO+JL-1,JK,JAER)= YDAERM7%M7ASYM(JL,JK,JAER,IBL)*YDAERM7%M7SSA(JL,JK,JAER,IBL)*YDAERM7%M7AOD(JL,JK,JAER,IBL) - ENDDO - ENDDO + + DO JAER=1,14 + DO JK=1,NFLEVG + DO JL=IST,IEND + ZAEROTAU(JSTGLO+JL-1,JK,JAER) = YDAERM7%M7AOD(JL,JK,JAER,IBL) + ZAEROSSA(JSTGLO+JL-1,JK,JAER) = YDAERM7%M7SSA(JL,JK,JAER,IBL)*YDAERM7%M7AOD(JL,JK,JAER,IBL) + ZAEROASYM(JSTGLO+JL-1,JK,JAER)= YDAERM7%M7ASYM(JL,JK,JAER,IBL)*YDAERM7%M7SSA(JL,JK,JAER,IBL)*YDAERM7%M7AOD(JL,JK,JAER,IBL) ENDDO - DO JAER=1,16 - DO JK=1,NFLEVG - DO JL=IST,IEND - ZAEROTAULW(JSTGLO+JL-1,JK,JAER)=YDAERM7%M7AODLW(JL,JK,JAER,IBL) - ENDDO - ENDDO + ENDDO + ENDDO + DO JAER=1,16 + DO JK=1,NFLEVG + DO JL=IST,IEND + ZAEROTAULW(JSTGLO+JL-1,JK,JAER)=YDAERM7%M7AODLW(JL,JK,JAER,IBL) ENDDO - !ENDIF!nstep - ENDIF !aero_scheme - - ENDIF! NACTAERO - - IF (NCLOUDACT > 0) THEN - DO JK=1,NFLEVG - DO JL=IST,IEND - ZRE_LIQT(JSTGLO+JL-1,JK) = GFL(JL,JK,YRE_LIQ%MP9_PH,IBL) - ZRE_ICET(JSTGLO+JL-1,JK) = GFL(JL,JK,YRE_ICE%MP9_PH,IBL) - END DO - END DO - END IF + ENDDO + ENDDO + + IF (NCLOUDACT > 0) THEN + DO JK=1,NFLEVG + DO JL=IST,IEND + ZRE_LIQT(JSTGLO+JL-1,JK) = GFL(JL,JK,YRE_LIQ%MP9_PH,IBL) + ZRE_ICET(JSTGLO+JL-1,JK) = GFL(JL,JK,YRE_ICE%MP9_PH,IBL) + END DO + END DO + END IF + ENDIF ! M7 + ENDIF ! NACTAERO DO JK=1,NFLEVG DO JL=IST,IEND From 269bb12fbf81d430481c17cdc264476e058b6482 Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Tue, 24 Jun 2025 16:59:13 +0000 Subject: [PATCH 081/129] Pull request #38: Fix SimChem/HAMM7 interface and nucleation compuation at Single Precision Merge in ~NM6/openifs-48r1 from simchem-update to knmi-m7 Squashed commit of the following: commit 2e826b1aa6b9c245417f0e014309ae6233889695 Author: Philippe Le Sager Date: Tue Jun 24 17:39:48 2025 +0200 More robust if-tests in M&N activation scheme; remove its DOS formating commit 8b19e704f1a186ce037be467467bb1b91f9084a8 Author: Philippe Le Sager Date: Mon Jun 23 15:50:40 2025 +0200 Force calculation of nucleation rates to double precision commit ae6c39060c3e0b16da0a22f1bc219f484626d156 Author: Philippe Le Sager Date: Sun Jun 22 10:45:50 2025 +0200 [Bug fix] Add explicit indexing to avoid FPE in full chemistry commit 9fd460b5834634a80c74a6f80b21a2aebb780478 Author: Philippe Le Sager Date: Sun Jun 22 10:39:09 2025 +0200 [Bug fix] Correctly map H2SO4 M7 index in case of full chemistry commit 5adfa1bee99beaa53a62cdb5a749a3b8ecbe3156 Author: Philippe Le Sager Date: Sun Jun 22 10:35:45 2025 +0200 Put HAMM7 initialization debugging output behind a logical flag commit c8d6bd8dd1a6f2620c00d365432e5b3910aae1c1 Author: Philippe Le Sager Date: Sun Jun 22 10:31:52 2025 +0200 More cleanup and cosmetic commit 8e5afee8860e467380419cc447135dbde7fd3429 Author: Philippe Le Sager Date: Thu Jun 19 18:00:09 2025 +0200 Cleanup commit ac37172142a0a59d2a466d989f9b60abeeb07d1b Author: Lianghai Wu Date: Thu Jun 19 11:19:13 2025 +0000 add comments commit b6846c4b4c6b9291d21a19309b19d9a15184f683 Author: Lianghai Wu Date: Tue Jun 17 20:53:43 2025 +0000 H2SO4 coupling between SimChem and hamm7 --- ifs-source/arpifs/chem/chem_init.F90 | 3 +- ifs-source/arpifs/chem/chem_main.F90 | 51 +- ifs-source/arpifs/m7/hamm7_init.F90 | 192 +- .../arpifs/m7/module/mo_ham_m7_nucl.F90 | 252 ++- ifs-source/arpifs/m7/module/nd_param.F90 | 1600 ++++++++--------- .../arpifs/m7/phys_ec/hamm7_interface.F90 | 250 +-- ifs-source/arpifs/phys_ec/aer_so2so4_v2.F90 | 8 +- ifs-source/arpifs/phys_ec/aerini_layer.F90 | 2 +- 8 files changed, 1131 insertions(+), 1227 deletions(-) diff --git a/ifs-source/arpifs/chem/chem_init.F90 b/ifs-source/arpifs/chem/chem_init.F90 index 4fbb3777..c115ce80 100644 --- a/ifs-source/arpifs/chem/chem_init.F90 +++ b/ifs-source/arpifs/chem/chem_init.F90 @@ -161,8 +161,7 @@ SUBROUTINE CHEM_INIT(YDGEOMETRY,YDML_GCONF,YDDYNA,YDML_CHEM) CASE ("SimChem") - ! TO BE DONE IN TM5M7_INIT IF NEEDED: - !CALL PHOTOLYSIS_INI + ! Nothing to do CASE DEFAULT diff --git a/ifs-source/arpifs/chem/chem_main.F90 b/ifs-source/arpifs/chem/chem_main.F90 index 9af80e5b..fdaf2a39 100644 --- a/ifs-source/arpifs/chem/chem_main.F90 +++ b/ifs-source/arpifs/chem/chem_main.F90 @@ -146,9 +146,6 @@ SUBROUTINE CHEM_MAIN & & ISO2_BASCOETM5=>ISO2, ISO4_BASCOETM5=>ISO4, INH4_BASCOETM5=>INH4 USE BASCOE_MODULE, ONLY : BASCOE_BC, NBC - - - USE TM5_PHOTOLYSIS, ONLY : NPHOTO USE UKCA_MODE_SETUP, ONLY: NMODES USE YOM_GRIB_CODES, ONLY : NGRBGHG @@ -258,8 +255,8 @@ SUBROUTINE CHEM_MAIN & REAL(KIND=JPRB) :: ZEMIS(KLON,KLEV,3) ! 3 especes emises par l'aviation, parametrisation à implementer REAL(KIND=JPRB) :: ZAREAD_NAT(KLON,KLEV),ZAREAD_ICE(KLON,KLEV),ZAREAD_SUL(KLON,KLEV) REAL(KIND=JPRB) :: ZSO4_LPROD(KLON,KLEV) -REAL(KIND=JPRB) :: ZTSO2(KLON,KLEV), ZTSO4_GAS(KLON,KLEV), ZTSO4_AQ(KLON,KLEV), ZITSO2(KLON,KLEV) -REAL(KIND=JPRB) :: ZSO2(KLON,KLEV), ZFSO2(KLON,KLEV), ZFSO4_AQ(KLON,KLEV), ZFSO4(KLON,KLEV) +REAL(KIND=JPRB) :: ZTSO2(KLON,KLEV), ZTSO4(KLON,KLEV), ZTSO4_AQ(KLON,KLEV), ZITSO2(KLON,KLEV), ZSO2(KLON,KLEV) +REAL(KIND=JPRB) :: ZFSO2(KLON), ZFSO4_AQ(KLON), ZFSO4(KLON) LOGICAL :: LLCHECK_METEO, LLTENDUPDT !------------------------------------------------------------------------ !------------------------------------------------------------------------ @@ -448,7 +445,6 @@ SUBROUTINE CHEM_MAIN & WHERE (ZCSZA(KIDIA:KFDIA) < -1._JPRB) ZCSZA(KIDIA:KFDIA) = -1.0_JPRB ENDIF - !* 2.0 Chemistry ! --------------- ! initialise zbudr to prevent fpe in openifs-test @@ -820,46 +816,47 @@ SUBROUTINE CHEM_MAIN & ! Simplified sulfur scheme V2 - here only for M7 aerosols scheme CASE ("SimChem") - !ISSO4=ISO4_TM5 - !ISSO4_ACS=5! index in YAERO OIFS - + IF(NCHEM.NE.2) THEN + CALL ABOR1(" NCHEM IS NOT EQUAL TO 2 " ) + ENDIF + DO JT=1,NCHEM IF (TRIM (YCHEM(JT)%CNAME) == 'SO2' ) ISSO2=JT - ! IF (TRIM (YCHEM(JT)%CNAME) == 'SO4' ) ISSO4=JT + IF (TRIM (YCHEM(JT)%CNAME) == 'H2SO4' ) ISSO4=JT ENDDO - DO JK=1,KLEV DO JL=KIDIA,KFDIA !ZTSO2(JL,JK) = PTENC(JL,JK,ISSO2) - !ZTSO4_GAS(JL,JK) = PTENC(JL,JK,ISSO4) + !ZTSO4(JL,JK) = PTENC(JL,JK,ISSO4) !ZTSO4_AQ(JL,JK) = PTENC(JL,JK,ISSO4_ACS)! liquid phase !ZSO2(JL,JK) = PAEROP(JL,JK,ISSO2) ZSO2(JL,JK) = ZCON(JL,JK,ISSO2) ! SO2 concentration + ZITSO2(JL,JK) = ZTENC0(JL,JK,ISSO2)! SO2 tendecny at previous time step + !ZITSO2(JL,JK) = PTENC(JL,JK,KCHEM(ISSO2))! SO2 tendecny at previous time step END DO END DO - CALL AER_SO2SO4_V2( YDRIP, & - & KIDIA , KFDIA , KLON , KLEV , & - & PTSTEP, PTP , PRSF1 , PAP , PLP , PGELAT, PGELAM, & - & ZSO2 , ZITSO2, & - & PGFL(:,:, YGFL%YAEROCLIM(1)%MP), & - & PGFL(:,:,YGFL%YAEROCLIM(2)%MP), & - & PGFL(:,:,YGFL%YAEROCLIM(3)%MP) , & - & ZTSO2 , ZTSO4_GAS, ZTSO4_AQ, ZFSO2, ZFSO4, ZFSO4_AQ, ZDELP) + & KIDIA , KFDIA , KLON , KLEV , & + & PTSTEP, PTP , PRSF1 , ZAP, ZLP, PGELAT, PGELAM, & + & ZSO2 , ZITSO2, & + & PGFL(:,:,YGFL%YAEROCLIM(1)%MP), & + & PGFL(:,:,YGFL%YAEROCLIM(2)%MP), & + & PGFL(:,:,YGFL%YAEROCLIM(3)%MP), & + & ZTSO2 , ZTSO4, ZTSO4_AQ, ZFSO2, ZFSO4, ZFSO4_AQ, ZDELP) DO JK=1,KLEV DO JL=KIDIA,KFDIA ! ZTSO2 - !PTENC(JL,JK,ISSO2) = PTENC(JL,JK,ISSO2)+ZTSO2(JL,JK) !ZTENC1(JL,JK,ISSO2) = ZTENC1(JL,JK,ISSO2)+ZTSO2(JL,JK) - ZTENC1(JL,JK,ISSO2) = ZTSO2(JL,JK) - !! ZTSO4_GAS - !PTENC(JL,JK,ISSO4)=PTENC(JL,JK,ISSO4)+ZTSO4_GAS(JL,Jk) + ZTENC1(JL,JK,ISSO2) = ZTSO2(JL,JK) ! + ZTENC1(JL,JK,ISSO4)= ZTSO4(JL,JK) ! index ISSO4 + !ZTENC1(JL,JK,ISSO2) = ZTENC0(JL,JK,ISSO2) + !ZTENC1(JL,JK,ISSO4) = ZTENC0(JL,JK,ISSO4) !! SO4 formed in clouds is applied to Accumulati - !PTENC(JL,JK,ISSO4_ACS)=PTENC(JL,JK,ISSO4_ACS)+ZTSO4_AQ(JL,JK) - PCHEM2AER(JL,JK,1) = ZTSO4_GAS(JL,Jk) - PCHEM2AER(JL,JK,2) = ZTSO4_AQ(JL,JK) + PCHEM2AER(JL,JK,1) = ZTSO4(JL,JK) ! gas phase + PCHEM2AER(JL,JK,2) = ZTSO4_AQ(JL,JK)!liquid (AQueous) phase + END DO END DO diff --git a/ifs-source/arpifs/m7/hamm7_init.F90 b/ifs-source/arpifs/m7/hamm7_init.F90 index 91e7bea9..24aac2d7 100644 --- a/ifs-source/arpifs/m7/hamm7_init.F90 +++ b/ifs-source/arpifs/m7/hamm7_init.F90 @@ -51,19 +51,11 @@ SUBROUTINE hamm7_init(YGFL, YRRIP, CHEM_SCHEME) USE YOMHOOK, ONLY : LHOOK, DR_HOOK, JPHOOK USE YOMRIP, ONLY : TRIP USE YOM_YGFL, ONLY : TYPE_GFLD ! Gives type for YGFL - -!!!!TEMPORARY Use YOMMP0, ONLY : MYPROC -!!!!TEMPORARY - ! --- M7 modules -------------------------------------------------------------- -! --> thk: bug fix USE MO_TIME_CONTROL, ONLY: init_mo_time_control -! <-- thk - USE MO_SPECIES, ONLY: speclist ! tracer species in HAM - USE MO_HAM, ONLY: & sizeclass, & ! aerosol classes in HAM nclass, & ! number of aerosol classes in HAM @@ -129,6 +121,7 @@ SUBROUTINE hamm7_init(YGFL, YRRIP, CHEM_SCHEME) & kt, znclass, znaerocomp, zsubm_ngasspec, zcloudind ! eehol: indices for OIFS to HAM CHARACTER(len=64) :: int_str, int_str_ham ! eehol: integer as string +LOGICAL, PARAMETER :: LLDEBUG=.FALSE. ! Debug flag REAL(KIND=JPHOOK) :: ZHOOK_HANDLE ! return status @@ -198,11 +191,6 @@ SUBROUTINE hamm7_init(YGFL, YRRIP, CHEM_SCHEME) ! AC-experiments/ctrl/Table/bins_hamm7ver1.csv and compare the names you get ! in the files. - -! RCHG -> this nested loop aims to indentify corresponding indices of OPENIFS vs HAM -! data structures. If the several files stored "fort.N" are just for testing -! purposes we may add a LLDEBUG flag to activate/deactive the savings. FIXME. - ! aerosol tracers LABEL_IFS_AERO: DO j_yaero = 1,NAERO @@ -223,7 +211,7 @@ SUBROUTINE hamm7_init(YGFL, YRRIP, CHEM_SCHEME) kt = sizeclass(j_class)%idt_no ind_oifs_ham%ind_class_OIFS(j_class) = j_yaero !eehol: take indices for sizeclass to a vector for OIFS ind_oifs_ham%ind_class_HAM(j_class) = kt !eehol: take indices for sizeclass to a vector for HAM - IF (MYPROC == 1) THEN + IF (LLDEBUG .AND. MYPROC == 1) THEN WRITE(int_str,*) j_yaero WRITE(int_str_ham,*) kt !sizeclass(j_class)%idt_no WRITE(2000+MYPROC,'(a)') 'sizeclass: '//TRIM(YAERO(j_yaero)%CNAME) @@ -260,7 +248,7 @@ SUBROUTINE hamm7_init(YGFL, YRRIP, CHEM_SCHEME) kt = aerocomp(j_mass)%idt ind_oifs_ham%ind_mass_OIFS(j_mass) = j_yaero !eehol: take indices for masses to a vector for OIFS ind_oifs_ham%ind_mass_HAM(j_mass) = kt !eehol: take indices for masses to a vector for HAM - IF (MYPROC == 1) THEN + IF (LLDEBUG .AND. MYPROC == 1) THEN WRITE(int_str,*) j_yaero WRITE(int_str_ham,*) kt WRITE(2000+MYPROC,'(a)') 'mass: '//TRIM(YAERO(j_yaero)%CNAME) @@ -283,7 +271,7 @@ SUBROUTINE hamm7_init(YGFL, YRRIP, CHEM_SCHEME) ind_oifs_ham%ind_mass_OIFS(j_mass) = j_yaero !eehol: take indices for masses to a vector for OIFS ind_oifs_ham%ind_mass_HAM(j_mass) = kt !eehol: take indices for masses to a vector for HAM - IF (MYPROC == 1) THEN + IF (LLDEBUG .AND. MYPROC == 1) THEN WRITE(int_str,*) j_yaero WRITE(int_str_ham,*) kt WRITE(2000+MYPROC,'(a)') 'mass: '//TRIM(YAERO(j_yaero)%CNAME) @@ -310,7 +298,7 @@ SUBROUTINE hamm7_init(YGFL, YRRIP, CHEM_SCHEME) kt = j_cloud ind_oifs_ham%ind_cloud_OIFS(j_cloud-idt_cdnc+1) = j_yaero !eehol: take indices for sizeclass to a vector for OIFS ind_oifs_ham%ind_cloud_HAM(j_cloud-idt_cdnc+1) = kt !eehol: take indices for sizeclass to a vector for HAM - IF (MYPROC == 1) THEN + IF (LLDEBUG .AND. MYPROC == 1) THEN WRITE(int_str,*) j_yaero WRITE(int_str_ham,*) kt !sizeclass(j_class)%idt_no WRITE(2000+MYPROC,'(a)') 'cloud class: '//TRIM(YAERO(j_yaero)%CNAME) @@ -327,7 +315,7 @@ SUBROUTINE hamm7_init(YGFL, YRRIP, CHEM_SCHEME) END DO LABEL_CLOUD ! If we end up here, the tracer is not a sizeclass or mass - IF (MYPROC == 1) THEN + IF (LLDEBUG .AND. MYPROC == 1) THEN WRITE(2000+MYPROC,'(a)') 'neither mass nor sizeclass in HAM: '//TRIM(YAERO(j_yaero)%CNAME) END IF @@ -337,7 +325,7 @@ SUBROUTINE hamm7_init(YGFL, YRRIP, CHEM_SCHEME) ! chemistry tracers in HAM do not have separate metadata, because there is only one ! tracer per species. Therefore we have to check the HAM species metadata and ! make sure that the metadata actually describes a gas. -IF (LAERCHEM.AND.TRIM(CHEM_SCHEME)=="tm5")THEN +IF (LAERCHEM.AND.(TRIM(CHEM_SCHEME)=="tm5".OR.TRIM(CHEM_SCHEME)=="SimChem"))THEN LABEL_IFS_CHEM: DO j_ychem = 1,NCHEM ! looping over the gas phase tracers in HAM @@ -356,7 +344,7 @@ SUBROUTINE hamm7_init(YGFL, YRRIP, CHEM_SCHEME) ! turn wetdep off for gases if LAERCHEM=.true. trlist%ti(kt)%nwetdep=0 - IF (MYPROC == 1) THEN + IF (LLDEBUG .AND. MYPROC == 1) THEN WRITE(int_str,*) j_ychem WRITE(int_str_ham,*) kt WRITE(2000+MYPROC,'(a)') 'gas: '//TRIM(YCHEM(j_ychem)%CNAME) @@ -373,9 +361,11 @@ SUBROUTINE hamm7_init(YGFL, YRRIP, CHEM_SCHEME) CYCLE LABEL_IFS_CHEM END IF - ! sulfuric acid is special, because in HAM it is tagges as H2SO4, while in IFS it - ! is called SO4 -- hard-coding for now - IF ( (TRIM(YCHEM(j_ychem)%CNAME) == 'SO4') .AND. (TRIM(speclist(j_spec)%shortname) == 'H2SO4') ) THEN + ! sulfuric acid is special, because in HAM it is tagged as H2SO4, while in IFS it + ! is called SO4 ('tm5' case) 'H2SO4' or ('SimChem' case ) + IF ( (TRIM(speclist(j_spec)%shortname) == 'H2SO4') .AND. & + & ( ( TRIM(YCHEM(j_ychem)%CNAME) == 'H2SO4' .AND. TRIM(CHEM_SCHEME)=="SimChem" ) & + & .OR. ( TRIM(YCHEM(j_ychem)%CNAME) == 'SO4' .AND. TRIM(CHEM_SCHEME)=="tm5" ) ) ) THEN ! In case of a match, we set the tracer index in the HAM meta data to the ! according IFS-index and write a note into the logfile kt = speclist(j_spec)%idt @@ -384,7 +374,7 @@ SUBROUTINE hamm7_init(YGFL, YRRIP, CHEM_SCHEME) ! turn wetdep off for SO4 if LAERCHEM=.true. trlist%ti(kt)%nwetdep=0 - IF (MYPROC == 1) THEN + IF (LLDEBUG .AND. MYPROC == 1) THEN WRITE(int_str,*) j_ychem WRITE(int_str_ham,*) kt WRITE(2000+MYPROC,'(a)') 'gas: '//TRIM(YCHEM(j_ychem)%CNAME) @@ -392,7 +382,7 @@ SUBROUTINE hamm7_init(YGFL, YRRIP, CHEM_SCHEME) WRITE(7000+MYPROC,'(a)') 'j_ychem ='//TRIM(int_str) WRITE(7000+MYPROC,'(a)') 'HAM gas: '//TRIM(trlist%ti(speclist(j_spec)%idt)%fullname) WRITE(7000+MYPROC,'(a)') 'gas idt_no ='//TRIM(int_str_ham) - WRITE(7000+MYPROC,'(a)') 'wetdep',trlist%ti(kt)%nwetdep + WRITE(7000+MYPROC,'(a)') 'wetdep=',trlist%ti(kt)%nwetdep END IF ! once the tracer is identified we can check the next one @@ -402,90 +392,88 @@ SUBROUTINE hamm7_init(YGFL, YRRIP, CHEM_SCHEME) END DO LABEL_GAS ! If we end up here, the tracer is not a sizeclass or mass - IF (MYPROC == 1) THEN + IF (LLDEBUG .AND. MYPROC == 1) THEN WRITE(2000+MYPROC,'(a)') 'not a gas in HAM: '//TRIM(YCHEM(j_ychem)%CNAME) END IF - END DO LABEL_IFS_CHEM -ELSE IF (LAERCHEM.AND.TRIM(CHEM_SCHEME)=="SimChem") THEN - Write(9191,*)'simple SO4 in development' - LABEL_IFS_CHEM_SO4: DO j_ychem = 1,NAERO - - ! looping over the gas phase tracers in HAM - LABEL_GAS_SO4: DO j_gas = 1,subm_ngasspec - j_spec = subm_gasspec(j_gas) - ! If the species does not exist in gas form in HAM, we don't consider it further - IF ((speclist(j_spec)%nphase == GAS) .OR. (speclist(j_spec)%nphase == GAS_OR_AEROSOL)) THEN - IF(MYPROC==1)THEN - write(4001,*)TRIM(YAERO(j_ychem)%CNAME),TRIM(speclist(j_spec)%shortname) - END IF - IF (TRIM(YAERO(j_ychem)%CNAME) == TRIM(speclist(j_spec)%shortname)) THEN - ! In case of a match, we set the tracer index in the HAM meta data to the - ! according IFS-index and write a note into the logfile - !speclist(j_spec)%idt = j_ychem - kt = speclist(j_spec)%idt - ind_oifs_ham%ind_gas_OIFS(j_gas) = j_ychem !eehol: take indices for gases to a vector for OIFS - ind_oifs_ham%ind_gas_HAM(j_gas) = kt !eehol: take indices for gases to a vector for HAM - ! turn wetdep on for gases if LAERCHEM=.false. - trlist%ti(kt)%nwetdep=1 - IF (MYPROC == 1) THEN - WRITE(int_str,*) j_ychem - WRITE(int_str_ham,*) kt - WRITE(2000+MYPROC,'(a)') 'gas: '//TRIM(YCHEM(j_ychem)%CNAME) - WRITE(7000+MYPROC,'(a)') 'OIFS gas: '//TRIM(YCHEM(j_ychem)%CNAME) - WRITE(7000+MYPROC,'(a)') 'j_ychem ='//TRIM(int_str) - WRITE(7000+MYPROC,'(a)') 'HAM gas: '//TRIM(trlist%ti(speclist(j_spec)%idt)%fullname) - WRITE(7000+MYPROC,'(a)') 'gas idt_no ='//TRIM(int_str_ham) - END IF - ! once the tracer is identified we can check the next one - CYCLE LABEL_IFS_CHEM_SO4 - END IF - - ! sulfuric acid is special, because in HAM it is tagges as H2SO4, while in IFS it - ! is called SO4 -- hard-coding for now - !IF ( (TRIM(YAERO(j_ychem)%CNAME) == 'SO4_gas') .AND. (TRIM(speclist(j_spec)%shortname) == 'H2SO4') ) THEN - !WRITE(*,*)"j_spec:",j_spec - !WRITE(*,*)"j_ychem:",j_ychem - !WRITE(*,*)"YAERO(j_ychem)%CNAME:",YAERO(j_ychem)%CNAME - !WRITE(*,*)"speclist(j_spec)%shortname:",speclist(j_spec)%shortname - !IF ( (TRIM(YAERO(j_ychem)%CNAME) == 'SO4_gas') .AND. (TRIM(speclist(j_spec)%shortname) == 'H2SO4') ) THEN - IF ( (TRIM(YAERO(j_ychem)%CNAME) == 'SO4') .AND. (TRIM(speclist(j_spec)%shortname) == 'H2SO4') ) THEN - ! In case of a match, we set the tracer index in the HAM meta data to the - ! according IFS-index and write a note into the logfile - kt = speclist(j_spec)%idt - ind_oifs_ham%ind_gas_OIFS(j_gas) = j_ychem !eehol: take indices for gases to a vector for OIFS - ind_oifs_ham%ind_gas_HAM(j_gas) = kt !eehol: take indices for gases to a vector for HAM - ! turn wetdep on for gases if LAERCHEM=.false. - trlist%ti(kt)%nwetdep=1 - IF (MYPROC == 1) THEN - WRITE(int_str,*) j_ychem - WRITE(int_str_ham,*) kt - WRITE(2000+MYPROC,'(a)') 'gas: '//TRIM(YCHEM(j_ychem)%CNAME) - WRITE(7000+MYPROC,'(a)') 'OIFS gas: '//TRIM(YCHEM(j_ychem)%CNAME) - WRITE(7000+MYPROC,'(a)') 'j_ychem ='//TRIM(int_str) - WRITE(7000+MYPROC,'(a)') 'HAM gas: '//TRIM(trlist%ti(speclist(j_spec)%idt)%fullname) - WRITE(7000+MYPROC,'(a)') 'gas idt_no ='//TRIM(int_str_ham) - END IF - - ! once the tracer is identified we can check the next one - CYCLE LABEL_IFS_CHEM_SO4 - END IF - END IF - END DO LABEL_GAS_SO4 - END DO LABEL_IFS_CHEM_SO4 - - ! If we end up here, the tracer is not a sizeclass or mass - IF (MYPROC == 1) THEN - WRITE(2000+MYPROC,'(a)') 'not a gas in HAM: '//TRIM(YCHEM(j_ychem)%CNAME) - END IF - - ELSE - ! Note that We are also checking that LAERCHEM should always be true with M7 (and could probably be ignored: it was used to indicate that chem_scheme='tm5'). Redundant... + END DO LABEL_IFS_CHEM + +!ELSE IF (LAERCHEM.AND.TRIM(CHEM_SCHEME)=="SimChem") THEN +! Write(9191,*)'simple SO4 in development' +! +! LABEL_IFS_CHEM_SO4: DO j_ychem = 1,NAERO +! +! ! looping over the gas phase tracers in HAM +! LABEL_GAS_SO4: DO j_gas = 1,subm_ngasspec +! j_spec = subm_gasspec(j_gas) +! ! If the species does not exist in gas form in HAM, we don't consider it further +! IF ((speclist(j_spec)%nphase == GAS) .OR. (speclist(j_spec)%nphase == GAS_OR_AEROSOL)) THEN +! IF(MYPROC==1)THEN +! write(4001,*)TRIM(YAERO(j_ychem)%CNAME),TRIM(speclist(j_spec)%shortname) +! END IF +! IF (TRIM(YAERO(j_ychem)%CNAME) == TRIM(speclist(j_spec)%shortname)) THEN +! ! In case of a match, we set the tracer index in the HAM meta data to the +! ! according IFS-index and write a note into the logfile +! !speclist(j_spec)%idt = j_ychem +! kt = speclist(j_spec)%idt +! ind_oifs_ham%ind_gas_OIFS(j_gas) = j_ychem !eehol: take indices for gases to a vector for OIFS +! ind_oifs_ham%ind_gas_HAM(j_gas) = kt !eehol: take indices for gases to a vector for HAM +! ! turn wetdep on for gases if LAERCHEM=.false. +! trlist%ti(kt)%nwetdep=1 +! IF (LLDEBUG .AND. MYPROC == 1) THEN +! WRITE(int_str,*) j_ychem +! WRITE(int_str_ham,*) kt +! WRITE(2000+MYPROC,'(a)') 'gas: '//TRIM(YCHEM(j_ychem)%CNAME) +! WRITE(7000+MYPROC,'(a)') 'OIFS gas: '//TRIM(YCHEM(j_ychem)%CNAME) +! WRITE(7000+MYPROC,'(a)') 'j_ychem ='//TRIM(int_str) +! WRITE(7000+MYPROC,'(a)') 'HAM gas: '//TRIM(trlist%ti(speclist(j_spec)%idt)%fullname) +! WRITE(7000+MYPROC,'(a)') 'gas idt_no ='//TRIM(int_str_ham) +! END IF +! ! once the tracer is identified we can check the next one +! CYCLE LABEL_IFS_CHEM_SO4 +! END IF +! +! ! sulfuric acid is special, because in HAM it is tagges as H2SO4, while in IFS it +! ! is called SO4 -- hard-coding for now +! !IF ( (TRIM(YAERO(j_ychem)%CNAME) == 'SO4_gas') .AND. (TRIM(speclist(j_spec)%shortname) == 'H2SO4') ) THEN +! !WRITE(*,*)"j_spec:",j_spec +! !WRITE(*,*)"j_ychem:",j_ychem +! !WRITE(*,*)"YAERO(j_ychem)%CNAME:",YAERO(j_ychem)%CNAME +! !WRITE(*,*)"speclist(j_spec)%shortname:",speclist(j_spec)%shortname +! !IF ( (TRIM(YAERO(j_ychem)%CNAME) == 'SO4_gas') .AND. (TRIM(speclist(j_spec)%shortname) == 'H2SO4') ) THEN +! IF ( (TRIM(YAERO(j_ychem)%CNAME) == 'SO4') .AND. (TRIM(speclist(j_spec)%shortname) == 'H2SO4') ) THEN +! ! In case of a match, we set the tracer index in the HAM meta data to the +! ! according IFS-index and write a note into the logfile +! kt = speclist(j_spec)%idt +! ind_oifs_ham%ind_gas_OIFS(j_gas) = j_ychem !eehol: take indices for gases to a vector for OIFS +! ind_oifs_ham%ind_gas_HAM(j_gas) = kt !eehol: take indices for gases to a vector for HAM +! ! turn wetdep on for gases if LAERCHEM=.false. +! trlist%ti(kt)%nwetdep=1 +! IF (LLDEBUG .AND. MYPROC == 1) THEN +! WRITE(int_str,*) j_ychem +! WRITE(int_str_ham,*) kt +! WRITE(2000+MYPROC,'(a)') 'gas: '//TRIM(YCHEM(j_ychem)%CNAME) +! WRITE(7000+MYPROC,'(a)') 'OIFS gas: '//TRIM(YCHEM(j_ychem)%CNAME) +! WRITE(7000+MYPROC,'(a)') 'j_ychem ='//TRIM(int_str) +! WRITE(7000+MYPROC,'(a)') 'HAM gas: '//TRIM(trlist%ti(speclist(j_spec)%idt)%fullname) +! WRITE(7000+MYPROC,'(a)') 'gas idt_no ='//TRIM(int_str_ham) +! END IF +! +! ! once the tracer is identified we can check the next one +! CYCLE LABEL_IFS_CHEM_SO4 +! END IF +! END IF +! END DO LABEL_GAS_SO4 +! END DO LABEL_IFS_CHEM_SO4 +ELSE + ! Note that here we are checking that: + ! - LAERCHEM is true (should always be the case with M7). It was used to distinguish between chem_scheme='tm5' and "no chemistry" in 43r3/AC with M7 activated (and still the case in 48r1 with AER!). + ! - CHEM_SCHEME is either 'tm5' or 'SimChem' CALL ABOR1(" hamm7_init: UNCOUPLED CHEMISTRY SCHEME "//TRIM(CHEM_SCHEME) ) END IF -IF (MYPROC == 1) THEN +IF (LLDEBUG .AND. MYPROC == 1) THEN WRITE(5001+MYPROC,*) 'HAM class idts =', ind_oifs_ham%ind_class_HAM(:) WRITE(5001+MYPROC,*) 'OIFS class idts =', ind_oifs_ham%ind_class_OIFS(:) WRITE(5001+MYPROC,*) 'HAM mass idts =', ind_oifs_ham%ind_mass_HAM(:) diff --git a/ifs-source/arpifs/m7/module/mo_ham_m7_nucl.F90 b/ifs-source/arpifs/m7/module/mo_ham_m7_nucl.F90 index d052b0ac..93eabad7 100644 --- a/ifs-source/arpifs/m7/module/mo_ham_m7_nucl.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_m7_nucl.F90 @@ -38,7 +38,7 @@ MODULE mo_ham_m7_nucl - USE mo_kind, ONLY: dp + USE mo_kind, ONLY: dp, JPRD USE mo_netcdf IMPLICIT NONE @@ -97,7 +97,7 @@ SUBROUTINE nucl_vehkamaeki(kproma, kbdim, klev, & ! ECHAM5 dimensions ! ! pxtrnucr = nucleation rate in [1/m3s] ! xrhoc = density of the critical nucleus in kg/m^3 - ! zrxc = ? + ! zrxc = ? Not used as of 2025-06-23 - Commented PLS !---------------------------------------------------- @@ -112,19 +112,17 @@ SUBROUTINE nucl_vehkamaeki(kproma, kbdim, klev, & ! ECHAM5 dimensions !---------------------------------------------------- ! - REAL(dp):: ptp1(kbdim,klev), psatrat(kbdim,klev), & - pxtrnucr(kbdim,klev), & - pmolecH2SO4(kbdim,klev), & ! revisited, ok - pntot(kbdim,klev) + REAL(dp), intent(in) :: ptp1(kbdim,klev), psatrat(kbdim,klev) + REAL(dp), intent(in) :: pmolecH2SO4(kbdim,klev) + REAL(dp), intent(out) :: pxtrnucr(kbdim,klev) + REAL(dp), intent(out) :: pntot(kbdim,klev) !---------------------------------------------------- ! Local Arrays - REAL(dp):: zrxc(kbdim) - - REAL(dp):: zrhoa, zrh, zt, x, zjnuc, zrc, zxmole, zntot - - REAL(dp):: zlogrh, zlogrh2, zlogrh3, zlogrhoa, zlogrhoa2, zlogrhoa3, & + !PLS REAL(JPRD):: zrxc(kbdim) + REAL(JPRD):: zrhoa, zrh, zt, x, zjnuc, zrc, zxmole, zntot + REAL(JPRD):: zlogrh, zlogrh2, zlogrh3, zlogrhoa, zlogrhoa2, zlogrhoa3, & zix, zt2, zt3 !--- 0) Initializations: @@ -144,14 +142,14 @@ SUBROUTINE nucl_vehkamaeki(kproma, kbdim, klev, & ! ECHAM5 dimensions ! Calculate nucleation only for valid thermodynamic conditions: - zrhoa = max(pmolecH2SO4(jl,jk),1.E+4_dp) - zrhoa = min(zrhoa,1.E11_dp) + zrhoa = max(REAL(pmolecH2SO4(jl,jk), KIND=JPRD),1.E+4_JPRD) + zrhoa = min(zrhoa,1.E11_JPRD) - zrh = max(psatrat(jl,jk),1.E-4_dp) - zrh = min(zrh,1.0_dp) + zrh = max(REAL(psatrat(jl,jk), KIND=JPRD),1.E-4_JPRD) + zrh = min(zrh,1.0_JPRD) - zt = max(ptp1(jl,jk),190.15_dp) - zt = min(zt,300.15_dp) + zt = max(REAL(ptp1(jl,jk), KIND=JPRD) ,190.15_JPRD) + zt = min(zt,300.15_JPRD) zt2 = zt*zt zt3 = zt2*zt @@ -166,148 +164,148 @@ SUBROUTINE nucl_vehkamaeki(kproma, kbdim, klev, & ! ECHAM5 dimensions zlogrhoa2 = zlogrhoa*zlogrhoa zlogrhoa3 = zlogrhoa2*zlogrhoa - x=0.7409967177282139_dp - 0.002663785665140117_dp*zt & - + 0.002010478847383187_dp*zlogrh & - - 0.0001832894131464668_dp*zt*zlogrh & - + 0.001574072538464286_dp*zlogrh2 & - - 0.00001790589121766952_dp*zt*zlogrh2 & - + 0.0001844027436573778_dp*zlogrh3 & - - 1.503452308794887e-6_dp*zt*zlogrh3 & - - 0.003499978417957668_dp*zlogrhoa & - + 0.0000504021689382576_dp*zt*zlogrhoa + x=0.7409967177282139_JPRD - 0.002663785665140117_JPRD*zt & + + 0.002010478847383187_JPRD*zlogrh & + - 0.0001832894131464668_JPRD*zt*zlogrh & + + 0.001574072538464286_JPRD*zlogrh2 & + - 0.00001790589121766952_JPRD*zt*zlogrh2 & + + 0.0001844027436573778_JPRD*zlogrh3 & + - 1.503452308794887e-6_JPRD*zt*zlogrh3 & + - 0.003499978417957668_JPRD*zlogrhoa & + + 0.0000504021689382576_JPRD*zt*zlogrhoa zxmole=x - zix = 1.0_dp/x + zix = 1.0_JPRD/x ! Equation (12) - nucleation rate in 1/cm3s - zjnuc=0.1430901615568665_dp + 2.219563673425199_dp*zt - & - 0.02739106114964264_dp*zt2 + & - 0.00007228107239317088_dp*zt3 + 5.91822263375044_dp*zix + & - 0.1174886643003278_dp*zlogrh + 0.4625315047693772_dp*zt*zlogrh - & - 0.01180591129059253_dp*zt2*zlogrh + & - 0.0000404196487152575_dp*zt3*zlogrh + & - (15.79628615047088_dp*zlogrh)*zix - & - 0.215553951893509_dp*zlogrh2 - & - 0.0810269192332194_dp*zt*zlogrh2 + & - 0.001435808434184642_dp*zt2*zlogrh2 - & - 4.775796947178588e-6_dp*zt3*zlogrh2 - & - (2.912974063702185_dp*zlogrh2)*zix - & - 3.588557942822751_dp*zlogrh3 + & - 0.04950795302831703_dp*zt*zlogrh3 - & - 0.0002138195118737068_dp*zt2*zlogrh3 + & - 3.108005107949533e-7_dp*zt3*zlogrh3 - & - (0.02933332747098296_dp*zlogrh3)*zix + & - 1.145983818561277_dp*zlogrhoa - & - 0.6007956227856778_dp*zt*zlogrhoa + & - 0.00864244733283759_dp*zt2*zlogrhoa - & - 0.00002289467254710888_dp*zt3*zlogrhoa - & - (8.44984513869014_dp*zlogrhoa)*zix + & - 2.158548369286559_dp*zlogrh*zlogrhoa + & - 0.0808121412840917_dp*zt*zlogrh*zlogrhoa - & - 0.0004073815255395214_dp*zt2*zlogrh*zlogrhoa - & - 4.019572560156515e-7_dp*zt3*zlogrh*zlogrhoa + & - (0.7213255852557236_dp*zlogrh*zlogrhoa)*zix + & - 1.62409850488771_dp*zlogrh2*zlogrhoa - & - 0.01601062035325362_dp*zt*zlogrh2*zlogrhoa + & - 0.00003771238979714162_dp*zt2*zlogrh2*zlogrhoa + & - 3.217942606371182e-8_dp*zt3*zlogrh2*zlogrhoa - & - (0.01132550810022116_dp*zlogrh2*zlogrhoa)*zix + & - 9.71681713056504_dp*zlogrhoa2 - & - 0.1150478558347306_dp*zt*zlogrhoa2 + & - 0.0001570982486038294_dp*zt2*zlogrhoa2 + & - 4.009144680125015e-7_dp*zt3*zlogrhoa2 + & - (0.7118597859976135_dp*zlogrhoa2)*zix - & - 1.056105824379897_dp*zlogrh*zlogrhoa2 + & - 0.00903377584628419_dp*zt*zlogrh*zlogrhoa2 - & - 0.00001984167387090606_dp*zt2*zlogrh*zlogrhoa2 + & - 2.460478196482179e-8_dp*zt3*zlogrh*zlogrhoa2 - & - (0.05790872906645181_dp*zlogrh*zlogrhoa2)*zix - & - 0.1487119673397459_dp*zlogrhoa3 + & - 0.002835082097822667_dp*zt*zlogrhoa3 - & - 9.24618825471694e-6_dp*zt2*zlogrhoa3 + & - 5.004267665960894e-9_dp*zt3*zlogrhoa3 - & - (0.01270805101481648_dp*zlogrhoa3)*zix + zjnuc=0.1430901615568665_JPRD + 2.219563673425199_JPRD*zt - & + 0.02739106114964264_JPRD*zt2 + & + 0.00007228107239317088_JPRD*zt3 + 5.91822263375044_JPRD*zix + & + 0.1174886643003278_JPRD*zlogrh + 0.4625315047693772_JPRD*zt*zlogrh - & + 0.01180591129059253_JPRD*zt2*zlogrh + & + 0.0000404196487152575_JPRD*zt3*zlogrh + & + (15.79628615047088_JPRD*zlogrh)*zix - & + 0.215553951893509_JPRD*zlogrh2 - & + 0.0810269192332194_JPRD*zt*zlogrh2 + & + 0.001435808434184642_JPRD*zt2*zlogrh2 - & + 4.775796947178588e-6_JPRD*zt3*zlogrh2 - & + (2.912974063702185_JPRD*zlogrh2)*zix - & + 3.588557942822751_JPRD*zlogrh3 + & + 0.04950795302831703_JPRD*zt*zlogrh3 - & + 0.0002138195118737068_JPRD*zt2*zlogrh3 + & + 3.108005107949533e-7_JPRD*zt3*zlogrh3 - & + (0.02933332747098296_JPRD*zlogrh3)*zix + & + 1.145983818561277_JPRD*zlogrhoa - & + 0.6007956227856778_JPRD*zt*zlogrhoa + & + 0.00864244733283759_JPRD*zt2*zlogrhoa - & + 0.00002289467254710888_JPRD*zt3*zlogrhoa - & + (8.44984513869014_JPRD*zlogrhoa)*zix + & + 2.158548369286559_JPRD*zlogrh*zlogrhoa + & + 0.0808121412840917_JPRD*zt*zlogrh*zlogrhoa - & + 0.0004073815255395214_JPRD*zt2*zlogrh*zlogrhoa - & + 4.019572560156515e-7_JPRD*zt3*zlogrh*zlogrhoa + & + (0.7213255852557236_JPRD*zlogrh*zlogrhoa)*zix + & + 1.62409850488771_JPRD*zlogrh2*zlogrhoa - & + 0.01601062035325362_JPRD*zt*zlogrh2*zlogrhoa + & + 0.00003771238979714162_JPRD*zt2*zlogrh2*zlogrhoa + & + 3.217942606371182e-8_JPRD*zt3*zlogrh2*zlogrhoa - & + (0.01132550810022116_JPRD*zlogrh2*zlogrhoa)*zix + & + 9.71681713056504_JPRD*zlogrhoa2 - & + 0.1150478558347306_JPRD*zt*zlogrhoa2 + & + 0.0001570982486038294_JPRD*zt2*zlogrhoa2 + & + 4.009144680125015e-7_JPRD*zt3*zlogrhoa2 + & + (0.7118597859976135_JPRD*zlogrhoa2)*zix - & + 1.056105824379897_JPRD*zlogrh*zlogrhoa2 + & + 0.00903377584628419_JPRD*zt*zlogrh*zlogrhoa2 - & + 0.00001984167387090606_JPRD*zt2*zlogrh*zlogrhoa2 + & + 2.460478196482179e-8_JPRD*zt3*zlogrh*zlogrhoa2 - & + (0.05790872906645181_JPRD*zlogrh*zlogrhoa2)*zix - & + 0.1487119673397459_JPRD*zlogrhoa3 + & + 0.002835082097822667_JPRD*zt*zlogrhoa3 - & + 9.24618825471694e-6_JPRD*zt2*zlogrhoa3 + & + 5.004267665960894e-9_JPRD*zt3*zlogrhoa3 - & + (0.01270805101481648_JPRD*zlogrhoa3)*zix zjnuc=EXP(zjnuc) ! add. Eq. (12) [1/(cm^3s)] ! Equation (13) - total number of molecules in the critical cluster - zntot=-0.002954125078716302_dp - 0.0976834264241286_dp*zt + & - 0.001024847927067835_dp*zt2 - 2.186459697726116e-6_dp*zt3 - & - 0.1017165718716887_dp*zix - 0.002050640345231486_dp*zlogrh - & - 0.007585041382707174_dp*zt*zlogrh + & - 0.0001926539658089536_dp*zt2*zlogrh - & - 6.70429719683894e-7_dp*zt3*zlogrh - & - (0.2557744774673163_dp*zlogrh)*zix + & - 0.003223076552477191_dp*zlogrh2 + & - 0.000852636632240633_dp*zt*zlogrh2 - & - 0.00001547571354871789_dp*zt2*zlogrh2 + & - 5.666608424980593e-8_dp*zt3*zlogrh2 + & - (0.03384437400744206_dp*zlogrh2)*zix + & - 0.04743226764572505_dp*zlogrh3 - & - 0.0006251042204583412_dp*zt*zlogrh3 + & - 2.650663328519478e-6_dp*zt2*zlogrh3 - & - 3.674710848763778e-9_dp*zt3*zlogrh3 - & - (0.0002672510825259393_dp*zlogrh3)*zix - & - 0.01252108546759328_dp*zlogrhoa + & - 0.005806550506277202_dp*zt*zlogrhoa - & - 0.0001016735312443444_dp*zt2*zlogrhoa + & - 2.881946187214505e-7_dp*zt3*zlogrhoa + & - (0.0942243379396279_dp*zlogrhoa)*zix - & - 0.0385459592773097_dp*zlogrh*zlogrhoa - & - 0.0006723156277391984_dp*zt*zlogrh*zlogrhoa + & - 2.602884877659698e-6_dp*zt2*zlogrh*zlogrhoa + & - 1.194163699688297e-8_dp*zt3*zlogrh*zlogrhoa - & - (0.00851515345806281_dp*zlogrh*zlogrhoa)*zix - & - 0.01837488495738111_dp*zlogrh2*zlogrhoa + & - 0.0001720723574407498_dp*zt*zlogrh2*zlogrhoa - & - 3.717657974086814e-7_dp*zt2*zlogrh2*zlogrhoa - & - 5.148746022615196e-10_dp*zt3*zlogrh2*zlogrhoa + & - (0.0002686602132926594_dp*zlogrh2*zlogrhoa)*zix - & - 0.06199739728812199_dp*zlogrhoa2 + & - 0.000906958053583576_dp*zt*zlogrhoa2 - & - 9.11727926129757e-7_dp*zt2*zlogrhoa2 - & - 5.367963396508457e-9_dp*zt3*zlogrhoa2 - & - (0.007742343393937707_dp*zlogrhoa2)*zix + & - 0.0121827103101659_dp*zlogrh*zlogrhoa2 - & - 0.0001066499571188091_dp*zt*zlogrh*zlogrhoa2 + & - 2.534598655067518e-7_dp*zt2*zlogrh*zlogrhoa2 - & - 3.635186504599571e-10_dp*zt3*zlogrh*zlogrhoa2 + & - (0.0006100650851863252_dp*zlogrh*zlogrhoa2)*zix + & - 0.0003201836700403512_dp*zlogrhoa3 - & - 0.0000174761713262546_dp*zt*zlogrhoa3 + & - 6.065037668052182e-8_dp*zt2*zlogrhoa3 - & - 1.421771723004557e-11_dp*zt3*zlogrhoa3 + & - (0.0001357509859501723_dp*zlogrhoa3)*zix + zntot=-0.002954125078716302_JPRD - 0.0976834264241286_JPRD*zt + & + 0.001024847927067835_JPRD*zt2 - 2.186459697726116e-6_JPRD*zt3 - & + 0.1017165718716887_JPRD*zix - 0.002050640345231486_JPRD*zlogrh - & + 0.007585041382707174_JPRD*zt*zlogrh + & + 0.0001926539658089536_JPRD*zt2*zlogrh - & + 6.70429719683894e-7_JPRD*zt3*zlogrh - & + (0.2557744774673163_JPRD*zlogrh)*zix + & + 0.003223076552477191_JPRD*zlogrh2 + & + 0.000852636632240633_JPRD*zt*zlogrh2 - & + 0.00001547571354871789_JPRD*zt2*zlogrh2 + & + 5.666608424980593e-8_JPRD*zt3*zlogrh2 + & + (0.03384437400744206_JPRD*zlogrh2)*zix + & + 0.04743226764572505_JPRD*zlogrh3 - & + 0.0006251042204583412_JPRD*zt*zlogrh3 + & + 2.650663328519478e-6_JPRD*zt2*zlogrh3 - & + 3.674710848763778e-9_JPRD*zt3*zlogrh3 - & + (0.0002672510825259393_JPRD*zlogrh3)*zix - & + 0.01252108546759328_JPRD*zlogrhoa + & + 0.005806550506277202_JPRD*zt*zlogrhoa - & + 0.0001016735312443444_JPRD*zt2*zlogrhoa + & + 2.881946187214505e-7_JPRD*zt3*zlogrhoa + & + (0.0942243379396279_JPRD*zlogrhoa)*zix - & + 0.0385459592773097_JPRD*zlogrh*zlogrhoa - & + 0.0006723156277391984_JPRD*zt*zlogrh*zlogrhoa + & + 2.602884877659698e-6_JPRD*zt2*zlogrh*zlogrhoa + & + 1.194163699688297e-8_JPRD*zt3*zlogrh*zlogrhoa - & + (0.00851515345806281_JPRD*zlogrh*zlogrhoa)*zix - & + 0.01837488495738111_JPRD*zlogrh2*zlogrhoa + & + 0.0001720723574407498_JPRD*zt*zlogrh2*zlogrhoa - & + 3.717657974086814e-7_JPRD*zt2*zlogrh2*zlogrhoa - & + 5.148746022615196e-10_JPRD*zt3*zlogrh2*zlogrhoa + & + (0.0002686602132926594_JPRD*zlogrh2*zlogrhoa)*zix - & + 0.06199739728812199_JPRD*zlogrhoa2 + & + 0.000906958053583576_JPRD*zt*zlogrhoa2 - & + 9.11727926129757e-7_JPRD*zt2*zlogrhoa2 - & + 5.367963396508457e-9_JPRD*zt3*zlogrhoa2 - & + (0.007742343393937707_JPRD*zlogrhoa2)*zix + & + 0.0121827103101659_JPRD*zlogrh*zlogrhoa2 - & + 0.0001066499571188091_JPRD*zt*zlogrh*zlogrhoa2 + & + 2.534598655067518e-7_JPRD*zt2*zlogrh*zlogrhoa2 - & + 3.635186504599571e-10_JPRD*zt3*zlogrh*zlogrhoa2 + & + (0.0006100650851863252_JPRD*zlogrh*zlogrhoa2)*zix + & + 0.0003201836700403512_JPRD*zlogrhoa3 - & + 0.0000174761713262546_JPRD*zt*zlogrhoa3 + & + 6.065037668052182e-8_JPRD*zt2*zlogrhoa3 - & + 1.421771723004557e-11_JPRD*zt3*zlogrhoa3 + & + (0.0001357509859501723_JPRD*zlogrhoa3)*zix zntot=EXP(zntot) ! add. Eq. (13) ! Equation (14) - radius of the critical cluster in nm - zrc=EXP(-1.6524245_dp+0.42316402_dp*x+0.33466487_dp*LOG(zntot)) ! [nm] + !PLS zrc=EXP(-1.6524245_JPRD+0.42316402_JPRD*x+0.33466487_JPRD*LOG(zntot)) ! [nm] ! Conversion [nm -> m] - zrxc(jl)=zrc*1e-9_dp + !PLS zrxc(jl)=zrc*1e-9_JPRD !----1.2) Limiter - IF(zjnuc<1.e-7_dp .OR. zntot<4.0_dp) zjnuc=0.0_dp + IF(zjnuc<1.e-7_JPRD .OR. zntot<4.0_JPRD) zjnuc=0.0_JPRD ! limitation to 1E+10 [1/cm3s] - zjnuc=MIN(zjnuc,1.e10_dp) + zjnuc=MIN(zjnuc,1.e10_JPRD) - pxtrnucr(jl,jk) = zjnuc + pxtrnucr(jl,jk) = REAL(zjnuc, KIND=dp) ! convert total number of molecules in the critical cluster ! to number of sulfate molecules: - pntot(jl,jk)=zntot*zxmole + pntot(jl,jk)=REAL(zntot*zxmole, KIND=dp) ENDDO ! kproma diff --git a/ifs-source/arpifs/m7/module/nd_param.F90 b/ifs-source/arpifs/m7/module/nd_param.F90 index 6bb52286..22481afc 100644 --- a/ifs-source/arpifs/m7/module/nd_param.F90 +++ b/ifs-source/arpifs/m7/module/nd_param.F90 @@ -1,800 +1,800 @@ -MODULE ND_PARAM - !======================================================================= - ! This is a F90 version of a F77 code - ! *** WRITTEN BY ATHANASIOS NENES - ! *** MODIFIED BY PRASHANT KUMAR AND ATHANASIOS NENES - ! *** MODIFIED FOR EC-EARTH3 BY TWAN VAN NOIJE AND ATHANASIOS NENES - ! *** MODIFIED FOR OpenIFS 48R1 BY PHILIPPE LE SAGER (KNMI) - !======================================================================= - - !---Inherited functions, types, variables and constants - USE PARKIND1, ONLY: JPIM, JPRB - - IMPLICIT NONE - PRIVATE - - !---public member functions - PUBLIC ND_PARAM_SETUP - PUBLIC CCNSPEC - PUBLIC PDFACTIV - - ! Three points is enough for PDF integration using Gauss-Legendre quadrature - INTEGER(KIND=JPIM), PARAMETER :: NPGAUSS=3 - REAL(KIND=JPRB) :: XGS(NPGAUSS), WGS(NPGAUSS) ! Points and weights for GAUSS integration - - ! Maximum number of lognormal modes, set to three for M7 (but basically should be .GE. "NSOL-1 = 3" from TM5M7_DATA) - INTEGER(KIND=JPIM), PARAMETER :: NSMX = 3 - - TYPE, PUBLIC :: NDPARAM - REAL(KIND=JPRB) :: A ! Default FHH adsorption parameters (in the case of FHH-AT) [READ] - REAL(KIND=JPRB) :: B ! See Kumar et al., (2011) ACP [READ] - REAL(KIND=JPRB) :: ACCOM ! Accommodation coefficient [READ] - ! Parcel props - REAL(KIND=JPRB) :: TEMP ! Temperture (K) [READ] - REAL(KIND=JPRB) :: PRES ! Pressure (Pa) [READ] - REAL(KIND=JPRB) :: ALFA ! [COMPUTED] - REAL(KIND=JPRB) :: AKOH ! Kelvin parameter [COMPUTED] - REAL(KIND=JPRB) :: SURT ! Surface Tension for water (J m-2) [COMPUTED] - ! Aerosol params - INTEGER(KIND=JPIM) :: NMD ! Number of lognormal modes effectively used in calculations [READ]. Ideally should be used to allocate DPG/SIG/DPC/TP, for now just be sure that NMD .LE. NSMX - REAL(KIND=JPRB) :: DPG(NSMX) ! Modal diameter (m) [READ for 1:NMD] - REAL(KIND=JPRB) :: SIG(NSMX) ! Geometric dispersion (sigma_g) [READ for 1:NMD] - REAL(KIND=JPRB) :: TP(NSMX) ! Number concentration (#/m3) [READ for 1:NMD] - INTEGER(KIND=JPIM) :: MODE(NSMX) ! Kohler mode [READ for 1:NMD] - REAL(KIND=JPRB) :: DPC(NSMX) ! Critical particle diameter [COMPUTED for 1:NMD] - REAL(KIND=JPRB) :: SG(NSMX) ! [COMPUTED for 1:NMD] - END TYPE NDPARAM - - ! Physical constants - REAL(KIND=JPRB), PARAMETER :: AMA = 29.E-3_JPRB ! Air molecular weight - REAL(KIND=JPRB), PARAMETER :: GRAV = 9.81_JPRB ! g constant - REAL(KIND=JPRB), PARAMETER :: RGAS = 8.31_JPRB ! Universal gas constant - REAL(KIND=JPRB), PARAMETER :: Dw = 2.75E-10_JPRB ! Water Molecule Diameter - REAL(KIND=JPRB), PARAMETER :: AMW = 18.E-3_JPRB ! Water molecular weight - REAL(KIND=JPRB), PARAMETER :: DENW = 1E+3_JPRB ! Water density - REAL(KIND=JPRB), PARAMETER :: DHV = 2.25E+6_JPRB ! Water enthalpy of vaporization - REAL(KIND=JPRB), PARAMETER :: CPAIR= 1.0061E+3_JPRB ! Air Cp - - ! Data for FHH exponent calculation - ! for C1 - REAL(KIND=JPRB), PARAMETER :: D11 = -0.1907_JPRB - REAL(KIND=JPRB), PARAMETER :: D12 = -1.6929_JPRB - REAL(KIND=JPRB), PARAMETER :: D13 = 1.4963_JPRB - REAL(KIND=JPRB), PARAMETER :: D14 = -0.5644_JPRB - REAL(KIND=JPRB), PARAMETER :: D15 = 0.0711_JPRB - ! for C2 - REAL(KIND=JPRB), PARAMETER :: D21 = -3.9310_JPRB - REAL(KIND=JPRB), PARAMETER :: D22 = 7.0906_JPRB - REAL(KIND=JPRB), PARAMETER :: D23 = -5.3436_JPRB - REAL(KIND=JPRB), PARAMETER :: D24 = 1.8025_JPRB - REAL(KIND=JPRB), PARAMETER :: D25 = -0.2131_JPRB - ! for C3 - REAL(KIND=JPRB), PARAMETER :: D31 = 8.4825_JPRB - REAL(KIND=JPRB), PARAMETER :: D32 = -14.9297_JPRB - REAL(KIND=JPRB), PARAMETER :: D33 = 11.4552_JPRB - REAL(KIND=JPRB), PARAMETER :: D34 = -3.9115_JPRB - REAL(KIND=JPRB), PARAMETER :: D35 = 0.4647_JPRB - ! for C4 - REAL(KIND=JPRB), PARAMETER :: D41 = -5.1774_JPRB - REAL(KIND=JPRB), PARAMETER :: D42 = 8.8725_JPRB - REAL(KIND=JPRB), PARAMETER :: D43 = -6.8527_JPRB - REAL(KIND=JPRB), PARAMETER :: D44 = 2.3514_JPRB - REAL(KIND=JPRB), PARAMETER :: D45 = -0.2799_JPRB - ! - INTEGER(KIND=JPIM), PARAMETER :: MAXIT = 30 ! Max iterations for solution - REAL(KIND=JPRB), PARAMETER :: EPS = 1.E-5_JPRB ! Convergence criterion - ! - REAL(KIND=JPRB), PARAMETER :: PI = 3.1415927_JPRB ! Some constants - REAL(KIND=JPRB), PARAMETER :: ZERO = 0.0_JPRB - REAL(KIND=JPRB), PARAMETER :: GREAT = 1.E+30_JPRB - REAL(KIND=JPRB), PARAMETER :: SQ2PI = 2.5066282746_JPRB - -CONTAINS - - SUBROUTINE ND_PARAM_SETUP - ! - ! ** CALCULATE GAUSS QUADRATURE POINTS - ! - CALL GAULEG (XGS, WGS, NPGAUSS) - - END SUBROUTINE ND_PARAM_SETUP - -!======================================================================= -! -! *** SUBROUTINE CCNSPEC -! *** THIS SUBROUTINE CALCULATES THE CCN SPECTRUM OF THE AEROSOL USING -! THE APPROPRIATE FORM OF KOHLER THEORY -! -! *** ORIGINALLY WRITTEN BY ATHANASIOS NENES FOR ONLY KOHLER PARTICLES -! *** MODIFIED BY PRASHANT KUMAR AND ATHANSIOS NENES TO INCLUDE -! *** ACTIVATION BY FHH PARTICLES -! -!======================================================================= - - SUBROUTINE CCNSPEC (TPI,DPGI,SIGI,MODEI,TPARC,PPARC,NMODES, & - AKKI,A,B,ACCOM,BOX) - - REAL(KIND=JPRB), INTENT(IN) :: TPI(NMODES) - REAL(KIND=JPRB), INTENT(IN) :: DPGI(NMODES) - REAL(KIND=JPRB), INTENT(IN) :: SIGI(NMODES) - INTEGER(KIND=JPIM), INTENT(IN) :: MODEI(NMODES) - REAL(KIND=JPRB), INTENT(IN) :: TPARC - REAL(KIND=JPRB), INTENT(IN) :: PPARC - INTEGER(KIND=JPIM), INTENT(IN) :: NMODES - REAL(KIND=JPRB), INTENT(IN) :: AKKI(NMODES), A, B, ACCOM - - TYPE(NDPARAM), INTENT(OUT) :: BOX - - REAL(KIND=JPRB), PARAMETER :: ZEPS = 1E-9_JPRB !eehol: small value for diameter (1e-8 = 0.01 um) - REAL(KIND=JPRB) :: Dpcm, PAR1, PAR2 - INTEGER(KIND=JPIM) :: I,K - -#include "abor1.intfb.h" - - ! Check - IF (NMODES > NSMX ) THEN - CALL ABOR1('CCNSPEC: NMODES must be .LE. NSMX. Increase NSMX') - ENDIF - - ! Store aerosol params, parcel properties, etc. - ! - BOX%A = A ! Default FHH adsorption parameters (in the case of FHH-AT) - BOX%B = B ! See Kumar et al., (2011) ACP - BOX%ACCOM = ACCOM ! Accommodation coefficient - BOX%NMD = NMODES - DO I=1,BOX%NMD - BOX%MODE(I)= MODEI(I) - BOX%DPG(I) = DPGI(I) - BOX%SIG(I) = SIGI(I) - BOX%TP(I) = TPI(I) - ENDDO - - BOX%TEMP = TPARC ! Temperature (K) - BOX%PRES = PPARC ! Pressure (Pa) - - ! Thermophysical properties - BOX%SURT = SFT(TPARC) ! Surface Tension for water (J m-2) - BOX%AKOH = 4._JPRB*AMW*BOX%SURT/RGAS/BOX%TEMP/DENW ! Kelvin parameter - BOX%ALFA = GRAV*AMW*DHV/CPAIR/RGAS/TPARC/TPARC - GRAV*AMA/RGAS/TPARC ! Need to store this intermediate variable, because it is used in SINTEGRAL - - DO K=1,BOX%NMD - IF (MODEI(K).EQ.1) THEN ! Kohler modes - IF (DPGI(K).GE.ZEPS) THEN !eehol: add treshold if median diam is low - PAR1 = 4._JPRB/27._JPRB/AKKI(K)/DPGI(K)**3 - PAR2 = SQRT(PAR1*BOX%AKOH**3) - BOX%SG(K) = EXP(PAR2) - 1._JPRB - ELSE - BOX%SG(K) = ZERO - END IF - ELSEIF (MODEI(K).EQ.2) THEN ! FHH modes - CALL DpcFHH(DPGI(K),BOX,Dpcm) - BOX%DPC(K) = Dpcm - BOX%SG(K) = (BOX%AKOH/Dpcm)+(-A*(((Dpcm-DPGI(K))/(2*Dw))**(-B))) - ENDIF - ENDDO - - !open(unit=667, file='stuffxxx', access='append', status='unknown') - !write(667,*) TEMP, PRES, AKOH, AMW, SURT, RGAS, DENW, SG - !close(667) - - END SUBROUTINE CCNSPEC - -!C======================================================================= -!C -!C *** SUBROUTINE DpcFHH -!C *** THIS SUBROUTINE CALCULATES THE CRITICAL PARTICLE DIAMETER -!C ACCORDING TO THE FHH ADSOSPRTION ISOTHERM THEORY. -!C -!C *** WRITTEN BY PRASHANT KUMAR AND ATHANASIOS NENES -!C -!C======================================================================= - - SUBROUTINE DPCFHH(DDRY,BOX,DC) - - REAL(KIND=JPRB), INTENT(IN) :: DDRY - TYPE(NDPARAM), INTENT(IN) :: BOX - REAL(KIND=JPRB), INTENT(OUT) :: DC - - REAL(KIND=JPRB) :: mu,mu1,mu2,mu3,X1,X2l,Dpcm,Dpcl,Dpcu,TEMP,SURT, A, B - REAL(KIND=JPRB) :: X3l,X2u,X3u,FDpcl,FDpcu,FDpcm,X2m,X3m - - ! inputs - SURT = BOX%SURT - TEMP = BOX%TEMP - A = BOX%A - B = BOX%B - - mu=(4._JPRB*SURT*AMW)/(RGAS*TEMP*DENW) - mu1=(mu*2._JPRB*Dw)/((A*B)*((2._JPRB*Dw)**(B+1._JPRB))) - mu2=1._JPRB/mu1 - mu3=1._JPRB-(mu2**(1._JPRB/(1._JPRB+B))) - - Dpcl = 0._JPRB !Lower Limit - Dpcu = 10.E-4_JPRB !Upper Limit - - DO - - X1 = mu2**(1._JPRB/(1._JPRB+B)) - X2l = Dpcl**(2._JPRB/(1._JPRB+B)) - X3l = X1*X2l - FDpcl=((Dpcl-X3l)/Ddry)-1._JPRB - - X1 = mu2**(1._JPRB/(1._JPRB+B)) - X2u = Dpcu**(2._JPRB/(1._JPRB+B)) - X3u = X1*X2u - FDpcu=((Dpcu-X3u)/Ddry)-1._JPRB - - Dpcm = (Dpcu+Dpcl)/2._JPRB - - X1= mu2**(1._JPRB/(1._JPRB+B)) - X2m= Dpcm**(2._JPRB/(1._JPRB+B)) - X3m= X1*X2m - FDpcm=((Dpcm-X3m)/Ddry)-1._JPRB - - IF ((FDPCL*FDPCM).LE.0._JPRB) THEN - - IF (ABS(FDPCM).LE.10E-8_JPRB) THEN - EXIT - ELSE - DPCL = DPCL - DPCU = DPCM - END IF - - ELSE IF ((FDPCL*FDPCM).GE.0._JPRB) THEN - - IF (ABS(FDPCM).LE.10E-8_JPRB) THEN - EXIT - ELSE - DPCL = DPCM - DPCU = DPCU - END IF - -! ELSE IF ((FDPCL*FDPCM).EQ.0) THEN - ELSE - EXIT - END IF - - END DO - - DC = DPCM - - END SUBROUTINE DPCFHH - -!C======================================================================= -!C -!C *** SUBROUTINE PDFACTIV -!C *** THIS SUBROUTINE CALCULATES THE CCN ACTIVATION FRACTION ACCORDING -!C TO THE Nenes and Seinfeld (2003) PARAMETERIZATION, WITH -!C MODIFICATION FOR NON-CONTUNUUM EFFECTS AS PROPOSED BY Fountoukis -!C and Nenes (2004). THIS ROUTINE CALCULATES FOR A PDF OF -!C UPDRAFT VELOCITIES. -!C -!C *** WRITTEN BY ATHANASIOS NENES -!C -!C======================================================================= - - SUBROUTINE PDFACTIV (WPARC,SIGW,NACT,SMAX,BOX) - - REAL(KIND=JPRB), INTENT(IN) :: WPARC, SIGW - REAL(KIND=JPRB), INTENT(OUT) :: NACT, SMAX - TYPE(NDPARAM), INTENT(IN) :: BOX - - REAL(KIND=JPRB) :: NACTI, SMAXI, DENOM, WPI - REAL(KIND=JPRB) :: A, B, ACCOM, PDF, WHI, WLO, SCAL, PROBI - INTEGER(KIND=JPIM) :: I - - REAL(KIND=JPRB), PARAMETER :: PLIMT = 1.0E-3_JPRB - ! - ! *** Single updraft case - ! - IF (SIGW.LT.1.e-10_JPRB) THEN - ! - ! *** Case where updraft is very small - ! - IF (WPARC.LE.1E-6_JPRB) THEN - SMAX = 0.0_JPRB - NACT = 0.0_JPRB - RETURN - ENDIF - - CALL ACTIVATE (WPARC,NACT,SMAX,BOX) - ! - ! *** PDF of updrafts - ! - ELSE - NACT = ZERO - SMAX = ZERO - DENOM = ZERO - PROBI = SQRT(-2.0_JPRB*LOG(PLIMT*SIGW*SQ2PI)) ! Probability of High Updraft limit - WHI = WPARC + SIGW*PROBI ! Upper updrft limit - ! No need to cut off the PDF at 0.05 m/s. - ! Using a lower value will change the normalization. - ! WLO = 0.05 ! Low updrft limit - WLO = 0.0_JPRB - SCAL = 0.5_JPRB*(WHI-WLO) ! Scaling for updrafts - !open(unit=667,file='pgaussxx',access='append',status='unknown') - DO I=1,NPGAUSS - ! Points are symmetric around zero, - ! so the sign of the XGS term is irrelevant. - ! As the convention is to use a plus sign, - ! we change the minus from the original code into a plus: - !WPI = WLO + SCAL*(1.0-XGS(i)) ! Updraft - WPI = WLO + SCAL*(1.0_JPRB+XGS(i)) ! Updraft - - ! Catch very small velocities using the same cutoff as above - IF (WPI.LE.1E-6_JPRB) THEN - SMAXI = 0.0_JPRB - NACTI = 0.0_JPRB - ELSE - CALL ACTIVATE (WPI,NACTI,SMAXI,BOX) ! # of drops - ENDIF - PDF = (1.0_JPRB/SQ2PI/SIGW)*EXP(-0.5_JPRB*((WPI-WPARC)/SIGW)**2) ! Prob. of updrafts - NACT = NACT + WGS(i)*(PDF*NACTI) ! Integral for drops - SMAX = SMAX + WGS(i)*(PDF*SMAXI) ! Integral for Smax - DENOM = DENOM + WGS(i)*PDF - IF (PDF.LT.PLIMT) EXIT - !write(667,*) NpGauss, i, nacti, smaxi - ENDDO - NACT = NACT/DENOM - SMAX = SMAX/DENOM - !close(667) - ENDIF - - END SUBROUTINE PDFACTIV - -!C======================================================================= -!C -!C *** SUBROUTINE ACTIVATE -!C *** THIS SUBROUTINE CALCULATES THE CCN ACTIVATION FRACTION ACCORDING -!C TO THE Nenes and Seinfeld (2003) PARAMETERIZATION, WITH -!C MODIFICATION FOR NON-CONTUNUUM EFFECTS AS PROPOSED BY Fountoukis -!C and Nenes (in preparation). -!C -!C *** WRITTEN BY ATHANASIOS NENES FOR KOHLER PARTICLES -!C *** MODIFIED BY PRASHANT KUMAR AND ATHANASIOS NENES TO INCLUDE FHH -!C PARTICLES -!C======================================================================= - - - SUBROUTINE ACTIVATE (WPARC,NDRPL,SMAX,BOX) - - REAL(KIND=JPRB), INTENT(IN) :: WPARC - REAL(KIND=JPRB), INTENT(OUT) :: NDRPL, SMAX - TYPE(NDPARAM), INTENT(IN) :: BOX - - REAL(KIND=JPRB) :: TEMP, PRES, AKOH, A, B, ACCOM - REAL(KIND=JPRB) :: PRESA, AKA, DAIR, PSAT, DV, DBIG, DLOW, COEF, ALFA, BET1 - REAL(KIND=JPRB) :: WPARCEL, BET2, BETA, CF1, CF2 - REAL(KIND=JPRB) :: C1, C2, C3, C4, X_FHH - REAL(KIND=JPRB) :: X1, X2, X3, Y1, Y2, Y3, SINTEG1, SINTEG2, SINTEG3 - INTEGER(KIND=JPIM) :: I - - ! Inputs - TEMP = BOX%TEMP - PRES = BOX%PRES - AKOH = BOX%AKOH - ALFA = BOX%ALFA - A = BOX%A - B = BOX%B - ACCOM = BOX%ACCOM - ! - ! *** Setup common block variables - ! - PRESA = PRES/1.013E+5_JPRB ! Pressure (Pa) - AKA = (4.39_JPRB+0.071_JPRB*TEMP)*1.E-3_JPRB ! Air thermal conductivity - DAIR = PRES*AMA/RGAS/TEMP ! Air density - PSAT = VPRES(TEMP)*(1.E+5_JPRB/1.0E+3_JPRB) ! Saturation vapor pressure - DV = (0.211_JPRB/PRESA)*(TEMP/273._JPRB)**1.94 - DV = DV*1.E-4_JPRB ! Water vapor diffusivity in air - DBIG = 5.0E-6_JPRB - DLOW = 0.207683_JPRB*((ACCOM)**(-0.33048_JPRB)) - DLOW = DLOW*1.E-6_JPRB - ! - ! *** Compute an average diffusivity Dv as a function of ACCOM - ! - COEF = ((2._JPRB*PI*AMW/(RGAS*TEMP))**0.5_JPRB) - DV = (DV/(DBIG-DLOW))*((DBIG-DLOW)-(2._JPRB*DV/ACCOM)*COEF* & - (LOG((DBIG+(2._JPRB*DV/ACCOM)*COEF)/(DLOW+(2._JPRB*DV/ACCOM)* & - COEF)))) ! Non-continuum effects - - WPARCEL = WPARC - ! - ! *** Setup constants - ! - BET1 = PRES*AMA/PSAT/AMW + AMW*DHV*DHV/CPAIR/RGAS/TEMP/TEMP - BET2 = RGAS*TEMP*DENW/PSAT/DV/AMW/4._JPRB + & - DHV*DENW/4._JPRB/AKA/TEMP*(DHV*AMW/RGAS/TEMP - 1._JPRB) - BETA = 0.5_JPRB*PI*BET1*DENW/BET2/ALFA/WPARC/DAIR - CF1 = 0.5_JPRB*(((1._JPRB/BET2)/(ALFA*WPARC))**0.5_JPRB) - CF2 = AKOH/3._JPRB - ! - ! DETERMINATION OF EXPONENT FOR FHH PARTICLES - ! - C1 = (D11)+(D12/A)+(D13/(A*A))+(D14/(A*A*A))+(D15/(A*A*A*A)) - C2 = (D21)+(D22/A)+(D23/(A*A))+(D24/(A*A*A))+(D25/(A*A*A*A)) - C3 = (D31)+(D32/A)+(D33/(A*A))+(D34/(A*A*A))+(D35/(A*A*A*A)) - C4 = (D41)+(D42/A)+(D43/(A*A))+(D44/(A*A*A))+(D45/(A*A*A*A)) - X_FHH = (C1) + (C2/B) + (C3/(B*B)) + (C4/(B*B*B)) - ! - ! *** INITIAL VALUES FOR BISECTION ************************************* - ! - X1 = 1.0E-5_JPRB ! Min cloud supersaturation -> 0 - CALL SINTEGRAL (X1,NDRPL,WPARCEL,X_FHH,BET2, & - SINTEG1,SINTEG2,SINTEG3,BOX) - Y1 = (SINTEG1*CF1+SINTEG2*CF2+SINTEG3*CF1)*BETA*X1 - 1._JPRB - ! - X2 = 0.1_JPRB ! MAX cloud supersaturation = 10% - CALL SINTEGRAL (X2,NDRPL,WPARCEL,X_FHH,BET2, & - SINTEG1,SINTEG2,SINTEG3,BOX) - Y2 = (SINTEG1*CF1+SINTEG2*CF2+SINTEG3*CF1)*BETA*X2 - 1._JPRB - ! - ! *** PERFORM BISECTION ************************************************ - ! - DO I=1,MAXIT - X3 = 0.5_JPRB*(X1+X2) - CALL SINTEGRAL (X3,NDRPL,WPARCEL,X_FHH,BET2, & - SINTEG1,SINTEG2,SINTEG3,BOX) - Y3 = (SINTEG1*CF1+SINTEG2*CF2+SINTEG3*CF1)*BETA*X3 - 1._JPRB - ! - IF (SIGN(1._JPRB,Y1)*SIGN(1._JPRB,Y3) .LE. ZERO) THEN ! (Y1*Y3 .LE. ZERO) - Y2 = Y3 - X2 = X3 - ELSE - Y1 = Y3 - X1 = X3 - ENDIF - ! - IF (ABS(X2-X1) .LE. EPS*X1) EXIT - - ENDDO - - ! *** CONVERGED ; RETURN *********************************************** - X3 = 0.5_JPRB*(X1+X2) - - CALL SINTEGRAL (X3,NDRPL,WPARCEL,X_FHH,BET2, & - SINTEG1,SINTEG2,SINTEG3,BOX) - Y3 = (SINTEG1*CF1+SINTEG2*CF2+SINTEG3*CF1)*BETA*X3 - 1._JPRB - - SMAX = X3 - - END SUBROUTINE ACTIVATE - -!C======================================================================= -!C -!C *** SUBROUTINE SINTEGRAL -!C *** THIS SUBROUTINE CALCULATES THE CONDENSATION INTEGRALS, ACCORDING -!C TO THE POPULATION SPLITTING ALGORITHM AND THE SUBSEQUENT VERSIONS: -!C -!C - Nenes and Seinfeld (2003) Population Splitting -!C - Fountoukis and Nenes (2004) Modal formulation -!C - Barahona and Nenes (2010) Approach for large CCN -!C - Morales and Nenes (2014) Population Splitting revised -!C -!C *** WRITTEN BY ATHANASIOS NENES for Kohler Particles -!C *** MODFIFIED BY PRASHANT KUMAR AND ATHANASIOS NENES TO INCLUDE FHH -!C PARTICLES -!C======================================================================= - - SUBROUTINE SINTEGRAL (SPAR, SUMMA, WPARCEL, XFHH, BET2, & - SUM, SUMMAT, SUMFHH, BOX) - - REAL(KIND=JPRB), INTENT(IN) :: SPAR - REAL(KIND=JPRB), INTENT(IN) :: WPARCEL - REAL(KIND=JPRB), INTENT(IN) :: XFHH - REAL(KIND=JPRB), INTENT(IN) :: BET2 - - REAL(KIND=JPRB), INTENT(OUT) :: SUMMA, SUM, SUMMAT, SUMFHH - - TYPE(NDPARAM), INTENT(IN) :: BOX - - REAL(KIND=JPRB) :: ND(NSMX), NDF(NSMX) - REAL(KIND=JPRB) :: INTEG1(NSMX), INTEG2(NSMX), INTEG1F(NSMX) - REAL(KIND=JPRB) :: ALFA, AKOH, TP(NSMX), SG(NSMX), SIG(NSMX) - - REAL(KIND=JPRB) :: ERF1C,ERF2,ERF3,ERF4C,ERF5C,ERF6C,ERF4FC,ERF5F - REAL(KIND=JPRB) :: ORISM1, ORISM2, ORISM3, ORISM4, ORISM5,ORISM6 - REAL(KIND=JPRB) :: INTAUX1P1, INTAUX1P2, DLGSP, DLGSP1, DLGSP2, DLGSPF, DLGSGF, DLGSG - REAL(KIND=JPRB) :: RATIO, SCRIT, DW3, SSPLT1, SSPLT2, DESCR, DEQ, EKTH, SQTWO - - REAL(KIND=JPRB) :: ORISM1F, ORISM2F, ORISM3F, ORISM4F, ORISM5F - REAL(KIND=JPRB) :: ORISM6F, ORISM7F, ORISM8F, ORISM9F - LOGICAL :: CRIT2 - INTEGER(KIND=JPIM) :: I,J - - SQTWO = SQRT(2._JPRB) - - ! input - ALFA = BOX%ALFA - AKOH = BOX%AKOH - DO I=1,BOX%NMD - TP(I) = BOX%TP(I) - SG(I) = BOX%SG(I) - SIG(I) = BOX%SIG(I) - ENDDO - - ! ** Population Splitting -- Modified by Ricardo Morales 2014 - - DESCR = 1._JPRB - (16._JPRB/9._JPRB)*ALFA*WPARCEL*BET2*(AKOH/SPAR**2)**2 - IF (DESCR.LE.0.0_JPRB) THEN - CRIT2 = .TRUE. - scrit = ((16._JPRB/9._JPRB)*ALFA*WPARCEL*BET2*(AKOH**2))**(0.25_JPRB) ! Scrit - (only for DELTA < 0 ) - RATIO = (2.0E+7_JPRB/3.0_JPRB)*AKOH*(SPAR**(-0.3824_JPRB)-scrit**(-0.3824_JPRB)) ! Computing sp1 and sp2 (sp1 = sp2) - RATIO = 1._JPRB/SQTWO + RATIO - IF (RATIO.GT.1.0_JPRB) RATIO = 1.0_JPRB - SSPLT2 = SPAR*RATIO - ELSE - CRIT2 = .FALSE. - SSPLT1 = 0.5_JPRB*(1._JPRB-SQRT(DESCR)) ! min root --> sp1 - SSPLT2 = 0.5_JPRB*(1._JPRB+SQRT(DESCR)) ! max root --> sp2 - SSPLT1 = SQRT(SSPLT1)*SPAR ! Multiply ratios with Smax - SSPLT2 = SQRT(SSPLT2)*SPAR - ENDIF - - ! - ! *** Computing the condensation integrals I1 and I2 - ! - SUM = 0.0_JPRB !Contribution of integral 1 for Kohler - SUMMAT = 0.0_JPRB !Contribution of integral 2 for kohler - SUMMA = 0.0_JPRB !Variable that stores all droplets - SUMFHH = 0.0_JPRB !Contribution of FHH integral - - DO J = 1, BOX%NMD - - IF (SG(J).GT.0.0_JPRB) THEN !eehol: do not calculate if SG=0 or less - IF (BOX%MODE(J).EQ.1) THEN ! Kohler modes - - DLGSG = LOG(SIG(J)) !ln(sigmai) - DLGSP = LOG(SG(J)/SPAR) !ln(sg/smax) - DLGSP2 = LOG(SG(J)/SSPLT2) !ln(sg/sp2) - - ORISM1 = 2._JPRB*DLGSP2/(3._JPRB*SQTWO*DLGSG) ! u(sp2) - ORISM2 = ORISM1 - 3._JPRB*DLGSG/(2._JPRB*SQTWO) ! u(sp2)-3ln(sigmai)/(2sqrt(2) - ORISM5 = 2._JPRB*DLGSP/(3._JPRB*SQTWO*DLGSG) ! u(smax) - ORISM3 = ORISM5 - 3._JPRB*DLGSG/(2._JPRB*SQTWO) ! u(smax)-3ln(sigmai)/(2sqrt(2) - DEQ = AKOH*2._JPRB/SG(j)/3._JPRB/SQRT(3._JPRB) ! Dp0 = Dpc/sqrt(3) - Equilibrium diameter - - ERF2 = erf(ORISM2) - ERF3 = erf(ORISM3) - - INTEG2(J) = (EXP(9._JPRB/8._JPRB*DLGSG*DLGSG)*TP(J)/SG(J))* & - (ERF2 - ERF3) ! I2(sp2,smax) - - IF (CRIT2) THEN - - ORISM6 = (SQTWO*DLGSP2/3._JPRB/DLGSG)-(1.5_JPRB*DLGSG/SQTWO) - ERF6C = erfc(ORISM6) - - INTEG1(J) = 0.0_JPRB - DW3 = TP(j)*DEQ*EXP(9._JPRB/8._JPRB*DLGSG*DLGSG)* & ! 'inertially' limited particles - ERF6C*((BET2*ALFA*WPARCEL)**0.5_JPRB) - - ELSE - - EKTH = EXP(9._JPRB/2._JPRB*DLGSG*DLGSG) - DLGSP1 = LOG(SG(J)/SSPLT1) ! ln(sg/sp1) - ORISM4 = ORISM1 + 3._JPRB*DLGSG/SQTWO ! u(sp2) + 3ln(sigmai)/sqrt(2) - ERF1C = erfc(ORISM1) - ERF4C = erfc(ORISM4) - - intaux1p2 = TP(J)*SPAR*(ERF1C - & - 0.5_JPRB*((SG(J)/SPAR)**2)*EKTH*ERF4C) ! I1(0,sp2) - - ORISM1 = 2._JPRB*DLGSP1/(3._JPRB*SQTWO*DLGSG) ! u(sp1) - ORISM4 = ORISM1 + 3._JPRB*DLGSG/SQTWO ! u(sp1) + 3ln(sigmai)/sqrt(2) - ORISM6 = (SQTWO*DLGSP1/3._JPRB/DLGSG)-(1.5_JPRB*DLGSG/SQTWO) - - ERF1C = erfc(ORISM1) - ERF4C = erfc(ORISM4) - ERF6C = erfc(ORISM6) - - intaux1p1 = TP(J)*SPAR*(ERF1C - & - 0.5_JPRB*((SG(J)/SPAR)**2)*EKTH*ERF4C) ! I1(0,sp1) - - INTEG1(J) = (intaux1p2-intaux1p1) ! I1(sp1,sp2) = I1(0,sp2) - I1(0,sp1) - ! - DW3 = TP(j)*DEQ*EXP(9._JPRB/8._JPRB*DLGSG*DLGSG)* & ! 'inertially' limited particles. - ERF6C*((BET2*ALFA*WPARCEL)**0.5_JPRB) - - ENDIF - - ! *** Calculate number of Drops - - ERF5C = erfc(ORISM5) - ! - Nd(J) = (TP(J)/2.0_JPRB)*ERF5C - SUM = SUM + INTEG1(J) + DW3 !SUM OF INTEGRAL 1 FOR KOHLER - SUMMAT = SUMMAT + INTEG2(J) !SUM OF INTEGRAL 2 FOR KOHLER - SUMMA = SUMMA + Nd(J) !SUM OF ACTIVATED KOHLER PARTICLES - - ELSEIF (BOX%MODE(J).EQ.2) THEN ! FHH modes - - DLGSGF = LOG(SIG(J)) ! ln(sigma,i) - DLGSPF = LOG(SG(J)/SPAR) ! ln(sg/smax) - ORISM1F = (SG(J)*SG(J))/(SPAR*SPAR) ! (sg/smax)^2 - ORISM2F = EXP(2._JPRB*XFHH*XFHH*DLGSGF*DLGSGF) ! exp(term) - ORISM3F = SQTWO*XFHH*DLGSGF ! sqrt(2).x.ln(sigma,i) - ORISM4F = DLGSPF/(-1._JPRB*ORISM3F) ! Umax - ORISM5F = ORISM3F - ORISM4F - ERF5F = erf(ORISM5F) - ORISM6F = ERF5F - ORISM7F = ORISM6F + 1._JPRB - ORISM8F = 0.5_JPRB*ORISM1F*ORISM2F*ORISM7F - ERF4FC = erfc(ORISM4F) - ORISM9F = ORISM8F - ERF4FC - - INTEG1F(J) =-1._JPRB*TP(J)*SPAR*ORISM9F - - ! *** Calculate number of drops activated by FHH theory - ERF4FC = erfc(ORISM4F) - - NdF(J) = (TP(J)/2.0_JPRB)*ERF4FC - SUMFHH = SUMFHH + INTEG1F(J) !Sum of Integral 1 for FHH - SUMMA = SUMMA + NdF(J) !Sum of ACTIVATED Kohler + FHH particles - - ENDIF - ENDIF !eehol: if SG.GT.ZERO - ENDDO - - END SUBROUTINE SINTEGRAL - - !C======================================================================= - !C - !C *** SUBROUTINE PROPS - !C *** THIS SUBROUTINE CALCULATES THE THERMOPHYSICAL PROPERTIES - !C - !C *** WRITTEN BY ATHANASIOS NENES - !C - !C======================================================================= - -! SUBROUTINE PROPS -! -! !REAL(KIND=JPRB) :: VPRES, SFT -! -! !PRESA = PRES/1.013d5 ! Pressure (Pa) -! !DAIR = PRES*AMA/RGAS/TEMP ! Air density -! !AKA = (4.39+0.071*TEMP)*1d-3 ! Air thermal conductivity -! !PSAT = VPRES(SNGL(TEMP))*(1e5/1.0d3) ! Saturation vapor pressure -! !SURT = SFT(SNGL(TEMP)) ! Surface Tension for water (J m-2) -! -! END SUBROUTINE PROPS - - !C======================================================================= - !C - !C *** FUNCTION VPRES - !C *** THIS FUNCTION CALCULATES SATURATED WATER VAPOUR PRESSURE AS A - !C FUNCTION OF TEMPERATURE. VALID FOR TEMPERATURES BETWEEN -50 AND - !C 50 C. - !C - !C========================= ARGUMENTS / USAGE =========================== - !C - !C INPUT: - !C [T] - !C REAL variable. - !C Ambient temperature expressed in Kelvin. - !C OUTPUT: - !C [VPRES] - !C REAL variable. - !C Saturated vapor pressure expressed in mbar. - !C - !C======================================================================= - - REAL(KIND=JPRB) PURE FUNCTION VPRES (T) - - REAL(KIND=JPRB), INTENT(IN) :: T - REAL(KIND=JPRB) :: A(0:6), TTEMP - INTEGER(KIND=JPIM) :: I - - A=(/ 6.107799610E+0_JPRB, 4.436518521E-1_JPRB, 1.428945805E-2_JPRB, & - 2.650648471E-4_JPRB, 3.031240396E-6_JPRB, 2.034080948E-8_JPRB, & - 6.136820929E-11_JPRB /) - - TTEMP = T-273._JPRB - VPRES = A(6)*TTEMP - DO I=5,1,-1 - VPRES = (VPRES + A(I))*TTEMP - ENDDO - VPRES = VPRES + A(0) - RETURN - END FUNCTION VPRES - -!C======================================================================= -!C -!C *** FUNCTION SFT -!C *** THIS FUNCTION CALCULATES WATER SURFACE TENSION AS A -!C FUNCTION OF TEMPERATURE. VALID FOR TEMPERATURES BETWEEN -40 AND -!C 40 C. -!C -!C ======================== ARGUMENTS / USAGE =========================== -!C -!C INPUT: -!C [T] -!C REAL variable. -!C Ambient temperature expressed in Kelvin. -!C -!C OUTPUT: -!C [SFT] -!C REAL variable. -!C Surface Tension expressed in J m-2. -!C -!C======================================================================= - - REAL(KIND=JPRB) PURE FUNCTION SFT (T) - REAL(KIND=JPRB), INTENT(IN) :: T - REAL(KIND=JPRB) :: TPARS - - TPARS = T-273._JPRB - SFT = 0.0761_JPRB - 1.55E-4_JPRB*TPARS - - RETURN - END FUNCTION SFT - - !C *********************************************************************** - !C Calculation of points and weights for N point GAUSS integration - !C *********************************************************************** - SUBROUTINE GAULEG (X,W,N) - - INTEGER(KIND=JPIM), INTENT(IN) :: N - REAL(KIND=JPRB), INTENT(OUT) :: X(N), W(N) - - REAL(KIND=JPRB), PARAMETER :: EPS=1.E-6_JPRB - REAL(KIND=JPRB), PARAMETER :: X1=-1.0_JPRB, X2=1.0_JPRB - - REAL(KIND=JPRB) :: XM, XL, Z, Z1, P1, P2, P3, PP - INTEGER(KIND=JPIM) :: I,J,M - ! - ! Calculation - ! - M=(N+1)/2 - XM=0.5_JPRB*(X2+X1) - XL=0.5_JPRB*(X2-X1) - DO I=1,M - Z=COS(3.141592654_JPRB*(I-.25_JPRB)/(N+.5_JPRB)) - DO - P1=1._JPRB - P2=0._JPRB - DO J=1,N - P3=P2 - P2=P1 - P1=((2._JPRB*J-1._JPRB)*Z*P2-(J-1._JPRB)*P3)/J - ENDDO - PP=N*(Z*P1-P2)/(Z*Z-1._JPRB) - Z1=Z - Z=Z1-P1/PP - IF (ABS(Z-Z1).LE.EPS) EXIT - END DO - - X(I)=XM-XL*Z - X(N+1-I)=XM+XL*Z - W(I)=2._JPRB*XL/((1._JPRB-Z*Z)*PP*PP) - W(N+1-I)=W(I) - ENDDO - RETURN - END SUBROUTINE GAULEG - -!C======================================================================= -!C -!C *** REAL FUNCTION erfp -!C *** THIS SUBROUTINE CALCULATES THE ERROR FUNCTION USING A -!C *** POLYNOMIAL APPROXIMATION -!C -!C======================================================================= - -!USE-ERF/ERFC-BUILTINS REAL(KIND=JPRB) PURE FUNCTION ERFP(X) -!USE-ERF/ERFC-BUILTINS REAL(KIND=JPRB), INTENT(IN) :: X -!USE-ERF/ERFC-BUILTINS REAL(KIND=JPRB) :: AXX, Y -!USE-ERF/ERFC-BUILTINS REAL(KIND=JPRB), DIMENSION(4), PARAMETER :: AA = (/0.278393_JPRB, 0.230389_JPRB, 0.000972_JPRB, 0.078108_JPRB/) -!USE-ERF/ERFC-BUILTINS -!USE-ERF/ERFC-BUILTINS Y = ABS(X) -!USE-ERF/ERFC-BUILTINS AXX = 1._JPRB + Y*(AA(1)+Y*(AA(2)+Y*(AA(3)+Y*AA(4)))) -!USE-ERF/ERFC-BUILTINS AXX = AXX*AXX -!USE-ERF/ERFC-BUILTINS AXX = AXX*AXX -!USE-ERF/ERFC-BUILTINS AXX = 1._JPRB - (1._JPRB/AXX) -!USE-ERF/ERFC-BUILTINS IF(X.LE.0._JPRB) THEN -!USE-ERF/ERFC-BUILTINS ERFP = -AXX -!USE-ERF/ERFC-BUILTINS ELSE -!USE-ERF/ERFC-BUILTINS ERFP = AXX -!USE-ERF/ERFC-BUILTINS ENDIF -!USE-ERF/ERFC-BUILTINS RETURN -!USE-ERF/ERFC-BUILTINS END FUNCTION ERFP - -END MODULE ND_PARAM +MODULE ND_PARAM + !======================================================================= + ! This is a F90 version of a F77 code + ! *** WRITTEN BY ATHANASIOS NENES + ! *** MODIFIED BY PRASHANT KUMAR AND ATHANASIOS NENES + ! *** MODIFIED FOR EC-EARTH3 BY TWAN VAN NOIJE AND ATHANASIOS NENES + ! *** MODIFIED FOR OpenIFS 48R1 BY PHILIPPE LE SAGER (KNMI) + !======================================================================= + + !---Inherited functions, types, variables and constants + USE PARKIND1, ONLY: JPIM, JPRB + + IMPLICIT NONE + PRIVATE + + !---public member functions + PUBLIC ND_PARAM_SETUP + PUBLIC CCNSPEC + PUBLIC PDFACTIV + + ! Three points is enough for PDF integration using Gauss-Legendre quadrature + INTEGER(KIND=JPIM), PARAMETER :: NPGAUSS=3 + REAL(KIND=JPRB) :: XGS(NPGAUSS), WGS(NPGAUSS) ! Points and weights for GAUSS integration + + ! Maximum number of lognormal modes, set to three for M7 (but basically should be .GE. "NSOL-1 = 3" from TM5M7_DATA) + INTEGER(KIND=JPIM), PARAMETER :: NSMX = 3 + + TYPE, PUBLIC :: NDPARAM + REAL(KIND=JPRB) :: A ! Default FHH adsorption parameters (in the case of FHH-AT) [READ] + REAL(KIND=JPRB) :: B ! See Kumar et al., (2011) ACP [READ] + REAL(KIND=JPRB) :: ACCOM ! Accommodation coefficient [READ] + ! Parcel props + REAL(KIND=JPRB) :: TEMP ! Temperture (K) [READ] + REAL(KIND=JPRB) :: PRES ! Pressure (Pa) [READ] + REAL(KIND=JPRB) :: ALFA ! [COMPUTED] + REAL(KIND=JPRB) :: AKOH ! Kelvin parameter [COMPUTED] + REAL(KIND=JPRB) :: SURT ! Surface Tension for water (J m-2) [COMPUTED] + ! Aerosol params + INTEGER(KIND=JPIM) :: NMD ! Number of lognormal modes effectively used in calculations [READ]. Ideally should be used to allocate DPG/SIG/DPC/TP, for now just be sure that NMD .LE. NSMX + REAL(KIND=JPRB) :: DPG(NSMX) ! Modal diameter (m) [READ for 1:NMD] + REAL(KIND=JPRB) :: SIG(NSMX) ! Geometric dispersion (sigma_g) [READ for 1:NMD] + REAL(KIND=JPRB) :: TP(NSMX) ! Number concentration (#/m3) [READ for 1:NMD] + INTEGER(KIND=JPIM) :: MODE(NSMX) ! Kohler mode [READ for 1:NMD] + REAL(KIND=JPRB) :: DPC(NSMX) ! Critical particle diameter [COMPUTED for 1:NMD] + REAL(KIND=JPRB) :: SG(NSMX) ! [COMPUTED for 1:NMD] + END TYPE NDPARAM + + ! Physical constants + REAL(KIND=JPRB), PARAMETER :: AMA = 29.E-3_JPRB ! Air molecular weight + REAL(KIND=JPRB), PARAMETER :: GRAV = 9.81_JPRB ! g constant + REAL(KIND=JPRB), PARAMETER :: RGAS = 8.31_JPRB ! Universal gas constant + REAL(KIND=JPRB), PARAMETER :: Dw = 2.75E-10_JPRB ! Water Molecule Diameter + REAL(KIND=JPRB), PARAMETER :: AMW = 18.E-3_JPRB ! Water molecular weight + REAL(KIND=JPRB), PARAMETER :: DENW = 1E+3_JPRB ! Water density + REAL(KIND=JPRB), PARAMETER :: DHV = 2.25E+6_JPRB ! Water enthalpy of vaporization + REAL(KIND=JPRB), PARAMETER :: CPAIR= 1.0061E+3_JPRB ! Air Cp + + ! Data for FHH exponent calculation + ! for C1 + REAL(KIND=JPRB), PARAMETER :: D11 = -0.1907_JPRB + REAL(KIND=JPRB), PARAMETER :: D12 = -1.6929_JPRB + REAL(KIND=JPRB), PARAMETER :: D13 = 1.4963_JPRB + REAL(KIND=JPRB), PARAMETER :: D14 = -0.5644_JPRB + REAL(KIND=JPRB), PARAMETER :: D15 = 0.0711_JPRB + ! for C2 + REAL(KIND=JPRB), PARAMETER :: D21 = -3.9310_JPRB + REAL(KIND=JPRB), PARAMETER :: D22 = 7.0906_JPRB + REAL(KIND=JPRB), PARAMETER :: D23 = -5.3436_JPRB + REAL(KIND=JPRB), PARAMETER :: D24 = 1.8025_JPRB + REAL(KIND=JPRB), PARAMETER :: D25 = -0.2131_JPRB + ! for C3 + REAL(KIND=JPRB), PARAMETER :: D31 = 8.4825_JPRB + REAL(KIND=JPRB), PARAMETER :: D32 = -14.9297_JPRB + REAL(KIND=JPRB), PARAMETER :: D33 = 11.4552_JPRB + REAL(KIND=JPRB), PARAMETER :: D34 = -3.9115_JPRB + REAL(KIND=JPRB), PARAMETER :: D35 = 0.4647_JPRB + ! for C4 + REAL(KIND=JPRB), PARAMETER :: D41 = -5.1774_JPRB + REAL(KIND=JPRB), PARAMETER :: D42 = 8.8725_JPRB + REAL(KIND=JPRB), PARAMETER :: D43 = -6.8527_JPRB + REAL(KIND=JPRB), PARAMETER :: D44 = 2.3514_JPRB + REAL(KIND=JPRB), PARAMETER :: D45 = -0.2799_JPRB + ! + INTEGER(KIND=JPIM), PARAMETER :: MAXIT = 30 ! Max iterations for solution + REAL(KIND=JPRB), PARAMETER :: EPS = 1.E-5_JPRB ! Convergence criterion + ! + REAL(KIND=JPRB), PARAMETER :: PI = 3.1415927_JPRB ! Some constants + REAL(KIND=JPRB), PARAMETER :: ZERO = 0.0_JPRB + REAL(KIND=JPRB), PARAMETER :: GREAT = 1.E+30_JPRB + REAL(KIND=JPRB), PARAMETER :: SQ2PI = 2.5066282746_JPRB + +CONTAINS + + SUBROUTINE ND_PARAM_SETUP + ! + ! ** CALCULATE GAUSS QUADRATURE POINTS + ! + CALL GAULEG (XGS, WGS, NPGAUSS) + + END SUBROUTINE ND_PARAM_SETUP + +!======================================================================= +! +! *** SUBROUTINE CCNSPEC +! *** THIS SUBROUTINE CALCULATES THE CCN SPECTRUM OF THE AEROSOL USING +! THE APPROPRIATE FORM OF KOHLER THEORY +! +! *** ORIGINALLY WRITTEN BY ATHANASIOS NENES FOR ONLY KOHLER PARTICLES +! *** MODIFIED BY PRASHANT KUMAR AND ATHANSIOS NENES TO INCLUDE +! *** ACTIVATION BY FHH PARTICLES +! +!======================================================================= + + SUBROUTINE CCNSPEC (TPI,DPGI,SIGI,MODEI,TPARC,PPARC,NMODES, & + AKKI,A,B,ACCOM,BOX) + + REAL(KIND=JPRB), INTENT(IN) :: TPI(NMODES) + REAL(KIND=JPRB), INTENT(IN) :: DPGI(NMODES) + REAL(KIND=JPRB), INTENT(IN) :: SIGI(NMODES) + INTEGER(KIND=JPIM), INTENT(IN) :: MODEI(NMODES) + REAL(KIND=JPRB), INTENT(IN) :: TPARC + REAL(KIND=JPRB), INTENT(IN) :: PPARC + INTEGER(KIND=JPIM), INTENT(IN) :: NMODES + REAL(KIND=JPRB), INTENT(IN) :: AKKI(NMODES), A, B, ACCOM + + TYPE(NDPARAM), INTENT(OUT) :: BOX + + REAL(KIND=JPRB), PARAMETER :: ZEPS = 1E-9_JPRB !eehol: small value for diameter (1e-8 = 0.01 um) + REAL(KIND=JPRB) :: Dpcm, PAR1, PAR2 + INTEGER(KIND=JPIM) :: I,K + +#include "abor1.intfb.h" + + ! Check + IF (NMODES > NSMX ) THEN + CALL ABOR1('CCNSPEC: NMODES must be .LE. NSMX. Increase NSMX') + ENDIF + + ! Store aerosol params, parcel properties, etc. + ! + BOX%A = A ! Default FHH adsorption parameters (in the case of FHH-AT) + BOX%B = B ! See Kumar et al., (2011) ACP + BOX%ACCOM = ACCOM ! Accommodation coefficient + BOX%NMD = NMODES + DO I=1,BOX%NMD + BOX%MODE(I)= MODEI(I) + BOX%DPG(I) = DPGI(I) + BOX%SIG(I) = SIGI(I) + BOX%TP(I) = TPI(I) + ENDDO + + BOX%TEMP = TPARC ! Temperature (K) + BOX%PRES = PPARC ! Pressure (Pa) + + ! Thermophysical properties + BOX%SURT = SFT(TPARC) ! Surface Tension for water (J m-2) + BOX%AKOH = 4._JPRB*AMW*BOX%SURT/RGAS/BOX%TEMP/DENW ! Kelvin parameter + BOX%ALFA = GRAV*AMW*DHV/CPAIR/RGAS/TPARC/TPARC - GRAV*AMA/RGAS/TPARC ! Need to store this intermediate variable, because it is used in SINTEGRAL + + DO K=1,BOX%NMD + IF (MODEI(K).EQ.1) THEN ! Kohler modes + IF (DPGI(K).GE.ZEPS) THEN !eehol: add treshold if median diam is low + PAR1 = 4._JPRB/27._JPRB/AKKI(K)/DPGI(K)**3 + PAR2 = SQRT(PAR1*BOX%AKOH**3) + BOX%SG(K) = EXP(PAR2) - 1._JPRB + ELSE + BOX%SG(K) = ZERO + END IF + ELSEIF (MODEI(K).EQ.2) THEN ! FHH modes + CALL DpcFHH(DPGI(K),BOX,Dpcm) + BOX%DPC(K) = Dpcm + BOX%SG(K) = (BOX%AKOH/Dpcm)+(-A*(((Dpcm-DPGI(K))/(2*Dw))**(-B))) + ENDIF + ENDDO + + !open(unit=667, file='stuffxxx', access='append', status='unknown') + !write(667,*) TEMP, PRES, AKOH, AMW, SURT, RGAS, DENW, SG + !close(667) + + END SUBROUTINE CCNSPEC + +!C======================================================================= +!C +!C *** SUBROUTINE DpcFHH +!C *** THIS SUBROUTINE CALCULATES THE CRITICAL PARTICLE DIAMETER +!C ACCORDING TO THE FHH ADSOSPRTION ISOTHERM THEORY. +!C +!C *** WRITTEN BY PRASHANT KUMAR AND ATHANASIOS NENES +!C +!C======================================================================= + + SUBROUTINE DPCFHH(DDRY,BOX,DC) + + REAL(KIND=JPRB), INTENT(IN) :: DDRY + TYPE(NDPARAM), INTENT(IN) :: BOX + REAL(KIND=JPRB), INTENT(OUT) :: DC + + REAL(KIND=JPRB) :: mu,mu1,mu2,mu3,X1,X2l,Dpcm,Dpcl,Dpcu,TEMP,SURT, A, B + REAL(KIND=JPRB) :: X3l,X2u,X3u,FDpcl,FDpcu,FDpcm,X2m,X3m + + ! inputs + SURT = BOX%SURT + TEMP = BOX%TEMP + A = BOX%A + B = BOX%B + + mu=(4._JPRB*SURT*AMW)/(RGAS*TEMP*DENW) + mu1=(mu*2._JPRB*Dw)/((A*B)*((2._JPRB*Dw)**(B+1._JPRB))) + mu2=1._JPRB/mu1 + mu3=1._JPRB-(mu2**(1._JPRB/(1._JPRB+B))) + + Dpcl = 0._JPRB !Lower Limit + Dpcu = 10.E-4_JPRB !Upper Limit + + DO + + X1 = mu2**(1._JPRB/(1._JPRB+B)) + X2l = Dpcl**(2._JPRB/(1._JPRB+B)) + X3l = X1*X2l + FDpcl=((Dpcl-X3l)/Ddry)-1._JPRB + + X1 = mu2**(1._JPRB/(1._JPRB+B)) + X2u = Dpcu**(2._JPRB/(1._JPRB+B)) + X3u = X1*X2u + FDpcu=((Dpcu-X3u)/Ddry)-1._JPRB + + Dpcm = (Dpcu+Dpcl)/2._JPRB + + X1= mu2**(1._JPRB/(1._JPRB+B)) + X2m= Dpcm**(2._JPRB/(1._JPRB+B)) + X3m= X1*X2m + FDpcm=((Dpcm-X3m)/Ddry)-1._JPRB + + IF ((FDPCL*FDPCM).LE.0._JPRB) THEN + + IF (ABS(FDPCM).LE.10.E-8_JPRB) THEN + EXIT + ELSE + DPCL = DPCL + DPCU = DPCM + END IF + + ELSE IF ((FDPCL*FDPCM).GE.0._JPRB) THEN + + IF (ABS(FDPCM).LE.10.E-8_JPRB) THEN + EXIT + ELSE + DPCL = DPCM + DPCU = DPCU + END IF + +! ELSE IF ((FDPCL*FDPCM).EQ.0) THEN + ELSE + EXIT + END IF + + END DO + + DC = DPCM + + END SUBROUTINE DPCFHH + +!C======================================================================= +!C +!C *** SUBROUTINE PDFACTIV +!C *** THIS SUBROUTINE CALCULATES THE CCN ACTIVATION FRACTION ACCORDING +!C TO THE Nenes and Seinfeld (2003) PARAMETERIZATION, WITH +!C MODIFICATION FOR NON-CONTUNUUM EFFECTS AS PROPOSED BY Fountoukis +!C and Nenes (2004). THIS ROUTINE CALCULATES FOR A PDF OF +!C UPDRAFT VELOCITIES. +!C +!C *** WRITTEN BY ATHANASIOS NENES +!C +!C======================================================================= + + SUBROUTINE PDFACTIV (WPARC,SIGW,NACT,SMAX,BOX) + + REAL(KIND=JPRB), INTENT(IN) :: WPARC, SIGW + REAL(KIND=JPRB), INTENT(OUT) :: NACT, SMAX + TYPE(NDPARAM), INTENT(IN) :: BOX + + REAL(KIND=JPRB) :: NACTI, SMAXI, DENOM, WPI + REAL(KIND=JPRB) :: A, B, ACCOM, PDF, WHI, WLO, SCAL, PROBI + INTEGER(KIND=JPIM) :: I + + REAL(KIND=JPRB), PARAMETER :: PLIMT = 1.0E-3_JPRB + ! + ! *** Single updraft case + ! + IF (SIGW.LT.1.e-10_JPRB) THEN + ! + ! *** Case where updraft is very small + ! + IF (WPARC.LE.1.0E-6_JPRB) THEN + SMAX = 0.0_JPRB + NACT = 0.0_JPRB + RETURN + ENDIF + + CALL ACTIVATE (WPARC,NACT,SMAX,BOX) + ! + ! *** PDF of updrafts + ! + ELSE + NACT = ZERO + SMAX = ZERO + DENOM = ZERO + PROBI = SQRT(-2.0_JPRB*LOG(PLIMT*SIGW*SQ2PI)) ! Probability of High Updraft limit + WHI = WPARC + SIGW*PROBI ! Upper updrft limit + ! No need to cut off the PDF at 0.05 m/s. + ! Using a lower value will change the normalization. + ! WLO = 0.05 ! Low updrft limit + WLO = 0.0_JPRB + SCAL = 0.5_JPRB*(WHI-WLO) ! Scaling for updrafts + !open(unit=667,file='pgaussxx',access='append',status='unknown') + DO I=1,NPGAUSS + ! Points are symmetric around zero, + ! so the sign of the XGS term is irrelevant. + ! As the convention is to use a plus sign, + ! we change the minus from the original code into a plus: + !WPI = WLO + SCAL*(1.0-XGS(i)) ! Updraft + WPI = WLO + SCAL*(1.0_JPRB+XGS(i)) ! Updraft + + ! Catch very small velocities using the same cutoff as above + IF (WPI.LE.1.0E-6_JPRB) THEN + SMAXI = 0.0_JPRB + NACTI = 0.0_JPRB + ELSE + CALL ACTIVATE (WPI,NACTI,SMAXI,BOX) ! # of drops + ENDIF + PDF = (1.0_JPRB/SQ2PI/SIGW)*EXP(-0.5_JPRB*((WPI-WPARC)/SIGW)**2) ! Prob. of updrafts + NACT = NACT + WGS(i)*(PDF*NACTI) ! Integral for drops + SMAX = SMAX + WGS(i)*(PDF*SMAXI) ! Integral for Smax + DENOM = DENOM + WGS(i)*PDF + IF (PDF.LT.PLIMT) EXIT + !write(667,*) NpGauss, i, nacti, smaxi + ENDDO + NACT = NACT/DENOM + SMAX = SMAX/DENOM + !close(667) + ENDIF + + END SUBROUTINE PDFACTIV + +!C======================================================================= +!C +!C *** SUBROUTINE ACTIVATE +!C *** THIS SUBROUTINE CALCULATES THE CCN ACTIVATION FRACTION ACCORDING +!C TO THE Nenes and Seinfeld (2003) PARAMETERIZATION, WITH +!C MODIFICATION FOR NON-CONTUNUUM EFFECTS AS PROPOSED BY Fountoukis +!C and Nenes (in preparation). +!C +!C *** WRITTEN BY ATHANASIOS NENES FOR KOHLER PARTICLES +!C *** MODIFIED BY PRASHANT KUMAR AND ATHANASIOS NENES TO INCLUDE FHH +!C PARTICLES +!C======================================================================= + + + SUBROUTINE ACTIVATE (WPARC,NDRPL,SMAX,BOX) + + REAL(KIND=JPRB), INTENT(IN) :: WPARC + REAL(KIND=JPRB), INTENT(OUT) :: NDRPL, SMAX + TYPE(NDPARAM), INTENT(IN) :: BOX + + REAL(KIND=JPRB) :: TEMP, PRES, AKOH, A, B, ACCOM + REAL(KIND=JPRB) :: PRESA, AKA, DAIR, PSAT, DV, DBIG, DLOW, COEF, ALFA, BET1 + REAL(KIND=JPRB) :: WPARCEL, BET2, BETA, CF1, CF2 + REAL(KIND=JPRB) :: C1, C2, C3, C4, X_FHH + REAL(KIND=JPRB) :: X1, X2, X3, Y1, Y2, Y3, SINTEG1, SINTEG2, SINTEG3 + INTEGER(KIND=JPIM) :: I + + ! Inputs + TEMP = BOX%TEMP + PRES = BOX%PRES + AKOH = BOX%AKOH + ALFA = BOX%ALFA + A = BOX%A + B = BOX%B + ACCOM = BOX%ACCOM + ! + ! *** Setup common block variables + ! + PRESA = PRES/1.013E+5_JPRB ! Pressure (Pa) + AKA = (4.39_JPRB+0.071_JPRB*TEMP)*1.E-3_JPRB ! Air thermal conductivity + DAIR = PRES*AMA/RGAS/TEMP ! Air density + PSAT = VPRES(TEMP)*(1.E+5_JPRB/1.0E+3_JPRB) ! Saturation vapor pressure + DV = (0.211_JPRB/PRESA)*(TEMP/273._JPRB)**1.94 + DV = DV*1.E-4_JPRB ! Water vapor diffusivity in air + DBIG = 5.0E-6_JPRB + DLOW = 0.207683_JPRB*((ACCOM)**(-0.33048_JPRB)) + DLOW = DLOW*1.E-6_JPRB + ! + ! *** Compute an average diffusivity Dv as a function of ACCOM + ! + COEF = ((2._JPRB*PI*AMW/(RGAS*TEMP))**0.5_JPRB) + DV = (DV/(DBIG-DLOW))*((DBIG-DLOW)-(2._JPRB*DV/ACCOM)*COEF* & + (LOG((DBIG+(2._JPRB*DV/ACCOM)*COEF)/(DLOW+(2._JPRB*DV/ACCOM)* & + COEF)))) ! Non-continuum effects + + WPARCEL = WPARC + ! + ! *** Setup constants + ! + BET1 = PRES*AMA/PSAT/AMW + AMW*DHV*DHV/CPAIR/RGAS/TEMP/TEMP + BET2 = RGAS*TEMP*DENW/PSAT/DV/AMW/4._JPRB + & + DHV*DENW/4._JPRB/AKA/TEMP*(DHV*AMW/RGAS/TEMP - 1._JPRB) + BETA = 0.5_JPRB*PI*BET1*DENW/BET2/ALFA/WPARC/DAIR + CF1 = 0.5_JPRB*(((1._JPRB/BET2)/(ALFA*WPARC))**0.5_JPRB) + CF2 = AKOH/3._JPRB + ! + ! DETERMINATION OF EXPONENT FOR FHH PARTICLES + ! + C1 = (D11)+(D12/A)+(D13/(A*A))+(D14/(A*A*A))+(D15/(A*A*A*A)) + C2 = (D21)+(D22/A)+(D23/(A*A))+(D24/(A*A*A))+(D25/(A*A*A*A)) + C3 = (D31)+(D32/A)+(D33/(A*A))+(D34/(A*A*A))+(D35/(A*A*A*A)) + C4 = (D41)+(D42/A)+(D43/(A*A))+(D44/(A*A*A))+(D45/(A*A*A*A)) + X_FHH = (C1) + (C2/B) + (C3/(B*B)) + (C4/(B*B*B)) + ! + ! *** INITIAL VALUES FOR BISECTION ************************************* + ! + X1 = 1.0E-5_JPRB ! Min cloud supersaturation -> 0 + CALL SINTEGRAL (X1,NDRPL,WPARCEL,X_FHH,BET2, & + SINTEG1,SINTEG2,SINTEG3,BOX) + Y1 = (SINTEG1*CF1+SINTEG2*CF2+SINTEG3*CF1)*BETA*X1 - 1._JPRB + ! + X2 = 0.1_JPRB ! MAX cloud supersaturation = 10% + CALL SINTEGRAL (X2,NDRPL,WPARCEL,X_FHH,BET2, & + SINTEG1,SINTEG2,SINTEG3,BOX) + Y2 = (SINTEG1*CF1+SINTEG2*CF2+SINTEG3*CF1)*BETA*X2 - 1._JPRB + ! + ! *** PERFORM BISECTION ************************************************ + ! + DO I=1,MAXIT + X3 = 0.5_JPRB*(X1+X2) + CALL SINTEGRAL (X3,NDRPL,WPARCEL,X_FHH,BET2, & + SINTEG1,SINTEG2,SINTEG3,BOX) + Y3 = (SINTEG1*CF1+SINTEG2*CF2+SINTEG3*CF1)*BETA*X3 - 1._JPRB + ! + IF (SIGN(1._JPRB,Y1)*SIGN(1._JPRB,Y3) .LE. ZERO) THEN ! (Y1*Y3 .LE. ZERO) + Y2 = Y3 + X2 = X3 + ELSE + Y1 = Y3 + X1 = X3 + ENDIF + ! + IF (ABS(X2-X1) .LE. EPS*X1) EXIT + + ENDDO + + ! *** CONVERGED ; RETURN *********************************************** + X3 = 0.5_JPRB*(X1+X2) + + CALL SINTEGRAL (X3,NDRPL,WPARCEL,X_FHH,BET2, & + SINTEG1,SINTEG2,SINTEG3,BOX) + Y3 = (SINTEG1*CF1+SINTEG2*CF2+SINTEG3*CF1)*BETA*X3 - 1._JPRB + + SMAX = X3 + + END SUBROUTINE ACTIVATE + +!C======================================================================= +!C +!C *** SUBROUTINE SINTEGRAL +!C *** THIS SUBROUTINE CALCULATES THE CONDENSATION INTEGRALS, ACCORDING +!C TO THE POPULATION SPLITTING ALGORITHM AND THE SUBSEQUENT VERSIONS: +!C +!C - Nenes and Seinfeld (2003) Population Splitting +!C - Fountoukis and Nenes (2004) Modal formulation +!C - Barahona and Nenes (2010) Approach for large CCN +!C - Morales and Nenes (2014) Population Splitting revised +!C +!C *** WRITTEN BY ATHANASIOS NENES for Kohler Particles +!C *** MODFIFIED BY PRASHANT KUMAR AND ATHANASIOS NENES TO INCLUDE FHH +!C PARTICLES +!C======================================================================= + + SUBROUTINE SINTEGRAL (SPAR, SUMMA, WPARCEL, XFHH, BET2, & + SUM, SUMMAT, SUMFHH, BOX) + + REAL(KIND=JPRB), INTENT(IN) :: SPAR + REAL(KIND=JPRB), INTENT(IN) :: WPARCEL + REAL(KIND=JPRB), INTENT(IN) :: XFHH + REAL(KIND=JPRB), INTENT(IN) :: BET2 + + REAL(KIND=JPRB), INTENT(OUT) :: SUMMA, SUM, SUMMAT, SUMFHH + + TYPE(NDPARAM), INTENT(IN) :: BOX + + REAL(KIND=JPRB) :: ND(NSMX), NDF(NSMX) + REAL(KIND=JPRB) :: INTEG1(NSMX), INTEG2(NSMX), INTEG1F(NSMX) + REAL(KIND=JPRB) :: ALFA, AKOH, TP(NSMX), SG(NSMX), SIG(NSMX) + + REAL(KIND=JPRB) :: ERF1C,ERF2,ERF3,ERF4C,ERF5C,ERF6C,ERF4FC,ERF5F + REAL(KIND=JPRB) :: ORISM1, ORISM2, ORISM3, ORISM4, ORISM5,ORISM6 + REAL(KIND=JPRB) :: INTAUX1P1, INTAUX1P2, DLGSP, DLGSP1, DLGSP2, DLGSPF, DLGSGF, DLGSG + REAL(KIND=JPRB) :: RATIO, SCRIT, DW3, SSPLT1, SSPLT2, DESCR, DEQ, EKTH, SQTWO + + REAL(KIND=JPRB) :: ORISM1F, ORISM2F, ORISM3F, ORISM4F, ORISM5F + REAL(KIND=JPRB) :: ORISM6F, ORISM7F, ORISM8F, ORISM9F + LOGICAL :: CRIT2 + INTEGER(KIND=JPIM) :: I,J + + SQTWO = SQRT(2._JPRB) + + ! input + ALFA = BOX%ALFA + AKOH = BOX%AKOH + DO I=1,BOX%NMD + TP(I) = BOX%TP(I) + SG(I) = BOX%SG(I) + SIG(I) = BOX%SIG(I) + ENDDO + + ! ** Population Splitting -- Modified by Ricardo Morales 2014 + + DESCR = 1._JPRB - (16._JPRB/9._JPRB)*ALFA*WPARCEL*BET2*(AKOH/SPAR**2)**2 + IF (DESCR.LT.EPSILON(0.0_JPRB)) THEN + CRIT2 = .TRUE. + scrit = ((16._JPRB/9._JPRB)*ALFA*WPARCEL*BET2*(AKOH**2))**(0.25_JPRB) ! Scrit - (only for DELTA < 0 ) + RATIO = (2.0E+7_JPRB/3.0_JPRB)*AKOH*(SPAR**(-0.3824_JPRB)-scrit**(-0.3824_JPRB)) ! Computing sp1 and sp2 (sp1 = sp2) + RATIO = 1._JPRB/SQTWO + RATIO + IF (RATIO.GT.1.0_JPRB) RATIO = 1.0_JPRB + SSPLT2 = SPAR*RATIO + ELSE + CRIT2 = .FALSE. + SSPLT1 = 0.5_JPRB*(1._JPRB-SQRT(DESCR)) ! min root --> sp1 + SSPLT2 = 0.5_JPRB*(1._JPRB+SQRT(DESCR)) ! max root --> sp2 + SSPLT1 = SQRT(SSPLT1)*SPAR ! Multiply ratios with Smax + SSPLT2 = SQRT(SSPLT2)*SPAR + ENDIF + + ! + ! *** Computing the condensation integrals I1 and I2 + ! + SUM = 0.0_JPRB !Contribution of integral 1 for Kohler + SUMMAT = 0.0_JPRB !Contribution of integral 2 for kohler + SUMMA = 0.0_JPRB !Variable that stores all droplets + SUMFHH = 0.0_JPRB !Contribution of FHH integral + + DO J = 1, BOX%NMD + IF (SG(J).GT.EPSILON(1.0_JPRB)) THEN !eehol: do not calculate if SG=0 or less + + IF (BOX%MODE(J).EQ.1) THEN ! Kohler modes + + DLGSG = LOG(SIG(J)) !ln(sigmai) + DLGSP = LOG(SG(J)/SPAR) !ln(sg/smax) + DLGSP2 = LOG(SG(J)/SSPLT2) !ln(sg/sp2) + + ORISM1 = 2._JPRB*DLGSP2/(3._JPRB*SQTWO*DLGSG) ! u(sp2) + ORISM2 = ORISM1 - 3._JPRB*DLGSG/(2._JPRB*SQTWO) ! u(sp2)-3ln(sigmai)/(2sqrt(2) + ORISM5 = 2._JPRB*DLGSP/(3._JPRB*SQTWO*DLGSG) ! u(smax) + ORISM3 = ORISM5 - 3._JPRB*DLGSG/(2._JPRB*SQTWO) ! u(smax)-3ln(sigmai)/(2sqrt(2) + DEQ = AKOH*2._JPRB/SG(j)/3._JPRB/SQRT(3._JPRB) ! Dp0 = Dpc/sqrt(3) - Equilibrium diameter + + ERF2 = erf(ORISM2) + ERF3 = erf(ORISM3) + + INTEG2(J) = (EXP(9._JPRB/8._JPRB*DLGSG*DLGSG)*TP(J)/SG(J))* & + (ERF2 - ERF3) ! I2(sp2,smax) + + IF (CRIT2) THEN + + ORISM6 = (SQTWO*DLGSP2/3._JPRB/DLGSG)-(1.5_JPRB*DLGSG/SQTWO) + ERF6C = erfc(ORISM6) + + INTEG1(J) = 0.0_JPRB + DW3 = TP(j)*DEQ*EXP(9._JPRB/8._JPRB*DLGSG*DLGSG)* & ! 'inertially' limited particles + ERF6C*((BET2*ALFA*WPARCEL)**0.5_JPRB) + + ELSE + + EKTH = EXP(9._JPRB/2._JPRB*DLGSG*DLGSG) + DLGSP1 = LOG(SG(J)/SSPLT1) ! ln(sg/sp1) + ORISM4 = ORISM1 + 3._JPRB*DLGSG/SQTWO ! u(sp2) + 3ln(sigmai)/sqrt(2) + ERF1C = erfc(ORISM1) + ERF4C = erfc(ORISM4) + + intaux1p2 = TP(J)*SPAR*(ERF1C - & + 0.5_JPRB*((SG(J)/SPAR)**2)*EKTH*ERF4C) ! I1(0,sp2) + + ORISM1 = 2._JPRB*DLGSP1/(3._JPRB*SQTWO*DLGSG) ! u(sp1) + ORISM4 = ORISM1 + 3._JPRB*DLGSG/SQTWO ! u(sp1) + 3ln(sigmai)/sqrt(2) + ORISM6 = (SQTWO*DLGSP1/3._JPRB/DLGSG)-(1.5_JPRB*DLGSG/SQTWO) + + ERF1C = erfc(ORISM1) + ERF4C = erfc(ORISM4) + ERF6C = erfc(ORISM6) + + intaux1p1 = TP(J)*SPAR*(ERF1C - & + 0.5_JPRB*((SG(J)/SPAR)**2)*EKTH*ERF4C) ! I1(0,sp1) + + INTEG1(J) = (intaux1p2-intaux1p1) ! I1(sp1,sp2) = I1(0,sp2) - I1(0,sp1) + ! + DW3 = TP(j)*DEQ*EXP(9._JPRB/8._JPRB*DLGSG*DLGSG)* & ! 'inertially' limited particles. + ERF6C*((BET2*ALFA*WPARCEL)**0.5_JPRB) + + ENDIF + + ! *** Calculate number of Drops + + ERF5C = erfc(ORISM5) + ! + Nd(J) = (TP(J)/2.0_JPRB)*ERF5C + SUM = SUM + INTEG1(J) + DW3 !SUM OF INTEGRAL 1 FOR KOHLER + SUMMAT = SUMMAT + INTEG2(J) !SUM OF INTEGRAL 2 FOR KOHLER + SUMMA = SUMMA + Nd(J) !SUM OF ACTIVATED KOHLER PARTICLES + + ELSEIF (BOX%MODE(J).EQ.2) THEN ! FHH modes + + DLGSGF = LOG(SIG(J)) ! ln(sigma,i) + DLGSPF = LOG(SG(J)/SPAR) ! ln(sg/smax) + ORISM1F = (SG(J)*SG(J))/(SPAR*SPAR) ! (sg/smax)^2 + ORISM2F = EXP(2._JPRB*XFHH*XFHH*DLGSGF*DLGSGF) ! exp(term) + ORISM3F = SQTWO*XFHH*DLGSGF ! sqrt(2).x.ln(sigma,i) + ORISM4F = DLGSPF/(-1._JPRB*ORISM3F) ! Umax + ORISM5F = ORISM3F - ORISM4F + ERF5F = erf(ORISM5F) + ORISM6F = ERF5F + ORISM7F = ORISM6F + 1._JPRB + ORISM8F = 0.5_JPRB*ORISM1F*ORISM2F*ORISM7F + ERF4FC = erfc(ORISM4F) + ORISM9F = ORISM8F - ERF4FC + + INTEG1F(J) =-1._JPRB*TP(J)*SPAR*ORISM9F + + ! *** Calculate number of drops activated by FHH theory + ERF4FC = erfc(ORISM4F) + + NdF(J) = (TP(J)/2.0_JPRB)*ERF4FC + SUMFHH = SUMFHH + INTEG1F(J) !Sum of Integral 1 for FHH + SUMMA = SUMMA + NdF(J) !Sum of ACTIVATED Kohler + FHH particles + + ENDIF + ENDIF !eehol: if SG.GT.ZERO + ENDDO + + END SUBROUTINE SINTEGRAL + + !C======================================================================= + !C + !C *** SUBROUTINE PROPS + !C *** THIS SUBROUTINE CALCULATES THE THERMOPHYSICAL PROPERTIES + !C + !C *** WRITTEN BY ATHANASIOS NENES + !C + !C======================================================================= + +! SUBROUTINE PROPS +! +! !REAL(KIND=JPRB) :: VPRES, SFT +! +! !PRESA = PRES/1.013d5 ! Pressure (Pa) +! !DAIR = PRES*AMA/RGAS/TEMP ! Air density +! !AKA = (4.39+0.071*TEMP)*1d-3 ! Air thermal conductivity +! !PSAT = VPRES(SNGL(TEMP))*(1e5/1.0d3) ! Saturation vapor pressure +! !SURT = SFT(SNGL(TEMP)) ! Surface Tension for water (J m-2) +! +! END SUBROUTINE PROPS + + !C======================================================================= + !C + !C *** FUNCTION VPRES + !C *** THIS FUNCTION CALCULATES SATURATED WATER VAPOUR PRESSURE AS A + !C FUNCTION OF TEMPERATURE. VALID FOR TEMPERATURES BETWEEN -50 AND + !C 50 C. + !C + !C========================= ARGUMENTS / USAGE =========================== + !C + !C INPUT: + !C [T] + !C REAL variable. + !C Ambient temperature expressed in Kelvin. + !C OUTPUT: + !C [VPRES] + !C REAL variable. + !C Saturated vapor pressure expressed in mbar. + !C + !C======================================================================= + + REAL(KIND=JPRB) PURE FUNCTION VPRES (T) + + REAL(KIND=JPRB), INTENT(IN) :: T + REAL(KIND=JPRB) :: A(0:6), TTEMP + INTEGER(KIND=JPIM) :: I + + A=(/ 6.107799610E+0_JPRB, 4.436518521E-1_JPRB, 1.428945805E-2_JPRB, & + 2.650648471E-4_JPRB, 3.031240396E-6_JPRB, 2.034080948E-8_JPRB, & + 6.136820929E-11_JPRB /) + + TTEMP = T-273._JPRB + VPRES = A(6)*TTEMP + DO I=5,1,-1 + VPRES = (VPRES + A(I))*TTEMP + ENDDO + VPRES = VPRES + A(0) + RETURN + END FUNCTION VPRES + +!C======================================================================= +!C +!C *** FUNCTION SFT +!C *** THIS FUNCTION CALCULATES WATER SURFACE TENSION AS A +!C FUNCTION OF TEMPERATURE. VALID FOR TEMPERATURES BETWEEN -40 AND +!C 40 C. +!C +!C ======================== ARGUMENTS / USAGE =========================== +!C +!C INPUT: +!C [T] +!C REAL variable. +!C Ambient temperature expressed in Kelvin. +!C +!C OUTPUT: +!C [SFT] +!C REAL variable. +!C Surface Tension expressed in J m-2. +!C +!C======================================================================= + + REAL(KIND=JPRB) PURE FUNCTION SFT (T) + REAL(KIND=JPRB), INTENT(IN) :: T + REAL(KIND=JPRB) :: TPARS + + TPARS = T-273._JPRB + SFT = 0.0761_JPRB - 1.55E-4_JPRB*TPARS + + RETURN + END FUNCTION SFT + + !C *********************************************************************** + !C Calculation of points and weights for N point GAUSS integration + !C *********************************************************************** + SUBROUTINE GAULEG (X,W,N) + + INTEGER(KIND=JPIM), INTENT(IN) :: N + REAL(KIND=JPRB), INTENT(OUT) :: X(N), W(N) + + REAL(KIND=JPRB), PARAMETER :: EPS=1.E-6_JPRB + REAL(KIND=JPRB), PARAMETER :: X1=-1.0_JPRB, X2=1.0_JPRB + + REAL(KIND=JPRB) :: XM, XL, Z, Z1, P1, P2, P3, PP + INTEGER(KIND=JPIM) :: I,J,M + ! + ! Calculation + ! + M=(N+1)/2 + XM=0.5_JPRB*(X2+X1) + XL=0.5_JPRB*(X2-X1) + DO I=1,M + Z=COS(3.141592654_JPRB*(I-.25_JPRB)/(N+.5_JPRB)) + DO + P1=1._JPRB + P2=0._JPRB + DO J=1,N + P3=P2 + P2=P1 + P1=((2._JPRB*J-1._JPRB)*Z*P2-(J-1._JPRB)*P3)/J + ENDDO + PP=N*(Z*P1-P2)/(Z*Z-1._JPRB) + Z1=Z + Z=Z1-P1/PP + IF (ABS(Z-Z1).LE.EPS) EXIT + END DO + + X(I)=XM-XL*Z + X(N+1-I)=XM+XL*Z + W(I)=2._JPRB*XL/((1._JPRB-Z*Z)*PP*PP) + W(N+1-I)=W(I) + ENDDO + RETURN + END SUBROUTINE GAULEG + +!C======================================================================= +!C +!C *** REAL FUNCTION erfp +!C *** THIS SUBROUTINE CALCULATES THE ERROR FUNCTION USING A +!C *** POLYNOMIAL APPROXIMATION +!C +!C======================================================================= + +!USE-ERF/ERFC-BUILTINS REAL(KIND=JPRB) PURE FUNCTION ERFP(X) +!USE-ERF/ERFC-BUILTINS REAL(KIND=JPRB), INTENT(IN) :: X +!USE-ERF/ERFC-BUILTINS REAL(KIND=JPRB) :: AXX, Y +!USE-ERF/ERFC-BUILTINS REAL(KIND=JPRB), DIMENSION(4), PARAMETER :: AA = (/0.278393_JPRB, 0.230389_JPRB, 0.000972_JPRB, 0.078108_JPRB/) +!USE-ERF/ERFC-BUILTINS +!USE-ERF/ERFC-BUILTINS Y = ABS(X) +!USE-ERF/ERFC-BUILTINS AXX = 1._JPRB + Y*(AA(1)+Y*(AA(2)+Y*(AA(3)+Y*AA(4)))) +!USE-ERF/ERFC-BUILTINS AXX = AXX*AXX +!USE-ERF/ERFC-BUILTINS AXX = AXX*AXX +!USE-ERF/ERFC-BUILTINS AXX = 1._JPRB - (1._JPRB/AXX) +!USE-ERF/ERFC-BUILTINS IF(X.LE.0._JPRB) THEN +!USE-ERF/ERFC-BUILTINS ERFP = -AXX +!USE-ERF/ERFC-BUILTINS ELSE +!USE-ERF/ERFC-BUILTINS ERFP = AXX +!USE-ERF/ERFC-BUILTINS ENDIF +!USE-ERF/ERFC-BUILTINS RETURN +!USE-ERF/ERFC-BUILTINS END FUNCTION ERFP + +END MODULE ND_PARAM diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index 542b18d4..1c4df1aa 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -13,10 +13,7 @@ SUBROUTINE HAMM7_INTERFACE( & & PAER_TAU, PAER_SSA, PAER_ASYM, PAER_TAU_LW, & & PTAUS_AER, PTAUA_AER, PPMAER, & & PEXTRA, PVERVEL, PCCNL, PCCNO, PAHFSTI, PCI, PZ0M, & - !eehol: added here vertical velocity, CCN over land, CCN over ocean & PAHFLEV, PUP, PVP, PCVL, PCVH, PSO2DD, PGEMU, PBLH) - !, PTSO2, PTSO4, PTSO4_AQ, PFSO2,PFSO4,PFSO4_AQ& - ! u-wind, v-wind, low veg. cover, high veg. cover, sine of latitude ! ╭────────────────────────────────────────────────────────────────────────────╮ ! │ (updated 30-APR-2024) │ @@ -169,9 +166,6 @@ SUBROUTINE HAMM7_INTERFACE( & & JPAERO_WVL_SSA, JPAERO_WVL_ASSIMETRY USE YOMLUN, ONLY: NULOUT -! [RCHG -> var non used ] USE YOMCST, ONLY: RMSO2, RMSO4, RMD, RNAVO -! [RCHG -> var non used ] USE YOESRTCOP, ONLY: RSASWA, RSASWB, RSFUA0, RSFUA1 - ! HAM-M7 USE MO_HAM, ONLY: nclass, naerocomp, sizeclass, nccndiag, subm_ngasspec USE OIFS_TO_HAM, ONLY: ind_oifs_ham @@ -190,13 +184,10 @@ SUBROUTINE HAMM7_INTERFACE( & USE YOE_AER_ACTIV, ONLY: AER_ACTIV ! M&N activation scheme -! [RCHG -> non used] USE MO_SPECIES, ONLY: speclist !SO2 wetdep for simple sulfur scheme -! [RCHG -> non used] USE mo_ham_species, ONLY: id_so2 !SO2 wetdep for simple sulfur scheme -! [RCHG -> non used] USE YOMMP0, ONLY : MYPROC, NPROC - USE TM5M7_OPTICS_DATA, ONLY : NWDEP, NASWBAND, ASWBAND !,WDEP, AER_TAU, AER_SSA,AER_ASYM,AER_TAU_LW USE TM5_PHOTOLYSIS, ONLY : NBANDS_TROP, WAV_GRID, WAV_GRIDA USE TM5M7_EMIS_DATA, ONLY : VKARMAN ! von karman constant for dry deposition +USE TM5_CHEM_MODULE, ONLY : NCHEM2AER !----------------------------------------------------------------------- IMPLICIT NONE @@ -223,7 +214,7 @@ SUBROUTINE HAMM7_INTERFACE( & REAL(KIND=JPRB),INTENT(IN) :: PFRTI(KLON,KTILES) REAL(KIND=JPRB),INTENT(IN) :: PAERWS(KLON), PAERGUST(KLON), PAERUST(KLON), PAERMAP(KLON,5) REAL(KIND=JPRB),INTENT(IN) :: PAERSRC(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO) -REAL(KIND=JPRB),INTENT(IN) :: PCHEM2AER(KLON,KLEV,6) +REAL(KIND=JPRB),INTENT(IN) :: PCHEM2AER(KLON,KLEV,NCHEM2AER) REAL(KIND=JPRB),INTENT(IN) :: PAERFLX(KLON,12,9), PAERLIF(KLON,9), PCLAERS(KLON) REAL(KIND=JPRB),INTENT(IN) :: PLSM(KLON) , PSNS(KLON) , PWND(KLON) , PWS1(KLON) REAL(KIND=JPRB),INTENT(IN) :: PTSPHY @@ -263,9 +254,6 @@ SUBROUTINE HAMM7_INTERFACE( & REAL(KIND=JPRB),INTENT(INOUT) :: PSO2DD(KLON) REAL(KIND=JPRB),INTENT(IN) :: PBLH(KLON) ! Boundary layer height -!REAL(KIND=JPRB), INTENT(INOUT) :: PFSO2(KLON) , PFSO4(KLON), PFSO4_AQ(KLON) -!REAL(KIND=JPRB), INTENT(INOUT) :: PTSO2(KLON, KLEV) , PTSO4(KLON, KLEV), PTSO4_AQ(KLON, KLEV) - !* 0.5 LOCAL VARIABLES ! --------------- @@ -328,36 +316,7 @@ SUBROUTINE HAMM7_INTERFACE( & REAL(KIND=JPRB), PARAMETER :: ZEPSEC=1e-14_JPRB -! [RCHG -> var non used ] INTEGER(KIND=JPIM) :: j_yaerom, JMMD, JSCAV, JSW, JSPEC -! [RCHG -> var. non used ] INTEGER(KIND=JPIM) :: IAER, IEX3D, IEX3DP -! [RCHG -> vas. non used ] INTEGER(KIND=JPIM) :: IEXTR2,ISHIFT1, IKPAER, IKP, ISTO, IWHERE -! [RCHG -> var. non used ] INTEGER(KIND=JPIM) :: NSO4SCHEME -! [RCHG -> non used ] REAL(KIND=JPRB) :: ZLAT, ZLON -! [RCHG -> non used ] REAL(KIND=JPRB) :: BETAB(KLON,KLEV), ZBETAI(KLON,KLEV) -! [RCHG -> non used ] REAL(KIND=JPRB) :: ZCLDWAT(KLON,KLEV), ZDUM(KLON,KLEV) -! [RCHG -> non used ] REAL(KIND=JPRB) :: ZBCPHI(KLON,KLEV), ZBCPHO(KLON,KLEV) -! [RCHG -> non used ] REAL(KIND=JPRB) :: ZOMPHI(KLON,KLEV) , ZOMPHO(KLON,KLEV) -! [RCHG -> non used ] REAL(KIND=JPRB) :: ZTBCPHI(KLON,KLEV),ZTBCPHO(KLON,KLEV) -! [RCHG -> non used ] REAL(KIND=JPRB) :: ZTOMPHI(KLON,KLEV), ZTOMPHO(KLON,KLEV) -! [RCHG -> non used ] REAL(KIND=JPRB) :: ZITBCPHO(KLON,KLEV),ZITOMPHO(KLON,KLEV) -! [RCHG -> non used ] REAL(KIND=JPRB) :: ZAIRDM(KLON), ZRHCL(KLON,KLEV) -! [RCHG -> non used ] REAL(KIND=JPRB) :: ZTAERI(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO) -! [RCHG -> non used ] REAL(KIND=JPRB) :: ZAERWET(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO) -! REAL(KIND=JPRB) :: ZAERNL(KLON,KLEV,NMOD) -! REAL(KIND=JPRB) :: ZAERML(KLON,KLEV,NAERMOD) -! [RCHG -> var non used ] INTEGER(KIND=JPIM) :: JMOD -! [RCHG -> var non used ] INTEGER(KIND=JPIM) :: JAERCLASS -! [RCHG -> non used ] REAL(KIND=JPRB) :: ZTENV(KLON) -! [RCHG -> non used ] REAL(KIND=JPRB) :: ZGDT -! [RCHG -> non used ] REAL(KIND=JPRB) :: ZVISICL, ZVISIPR, ZVISCAE, ZVISPAE -!REAL(KIND=JPRB) :: PAER_TAU(KLON,KLEV,14), PAER_SSA(KLON,KLEV,14),PAER_ASYM(KLON,KLEV,14) -!REAL(KIND=JPRB), ALLOCATABLE :: ZAERSRC(:,:), ZAERNGT(:,:) , ZAERSCC(:,:) -! [RCHG -> non used ] REAL(KIND=JPRB) :: ZQRWP, ZQSWP, ZQIWP, ZRANGE, ZRELRA, ZSIGAIR, ZSNOICE -! [RCHG -> non used ] REAL(KIND=JPRB) :: Z1CLD, ZCFLIRA, ZCFSNIC, ZDENSVIS, ZDESIC, ZCLWAT, ZLIQRAI, ZNS -! [RCHG -> non used ] REAL(KIND=JPRB) :: ZVISCON, ZVISRAY -! [RCHG -> non used ] REAL(KIND=JPRB) :: pmrateps(KLON,KLEV),pmrater(KLON,KLEV),pfevapr(KLON,KLEV) -! [RCHG -> non used ] REAL(KIND=JPRB) :: pfsubls(KLON,KLEV),pmsnowacl(KLON,KLEV) -! [RCHG -> non used ] INTEGER(KIND=JPIM) ::KTOP +!REAL(KIND=JPRB), ALLOCATABLE :: ZAERSRC(:,:), ZAERSCC(:,:) ! [RCHG -> non used ] REAL(KIND=JPRB) :: ZAEROUT1(KLON,KLEV),ZAEROUT2(KLON,KLEV),ZAEROUT3(KLON,KLEV),ZAEROUT4(KLON,KLEV),ZAEROUT5(KLON,KLEV) REAL(KIND=JPRB),PARAMETER :: INFINITY=HUGE(1._JPRB) @@ -441,28 +400,19 @@ SUBROUTINE HAMM7_INTERFACE( & REAL(KIND=JPRB) :: ZXTEMS(KLON,ntrac) !surface emissions modified by dry deposition REAL(KIND=JPRB) :: ZAZ0W(KLON), ZFRW(KLON), ZCVS(KLON), ZCVW(KLON), ZVGRAT(KLON) !rough. len. wat., wat. frac., snow cov. frac., wet skin frac., veg. ratio REAL(KIND=JPRB) :: ZCDNL(KLON), ZCDNW(KLON) !ustar (in not used variable), aerodynamic resis. on surface (in not used variable) -REAL(KIND=JPRB) :: ZXTMD1(KLON,KLEV,ntrac) !tracer mixing ratios for HAM drydep (updated with tend) +REAL(KIND=JPRB) :: ZXTMD1(KLON,KLEV,NTRAC) !tracer mixing ratios for HAM drydep (updated with tend) ! output diagnostics INTEGER, PARAMETER :: N_NUC_DIAG=5 -REAL(KIND=JPRB) :: ZOUT(KLON,NTRAC), ZOUT2(KLON,14), ZOUT3(KLON,KLEV,2*(NAEROCOMP+NCLASS)), ZOUT_DNUC(KLON,KLEV,N_NUC_DIAG) +REAL(KIND=JPRB) :: ZOUT3(KLON,KLEV,2*(NAEROCOMP+NCLASS)), ZOUT_DNUC(KLON,KLEV,N_NUC_DIAG) REAL(KIND=JPRB) :: SEDOUT(KLON,KLEV,KTRAC) ! changed ntrack to ktrac (RCHG) REAL(KIND=JPRB) :: DDEPOUT(KLON,KLEV,KTRAC) REAL(KIND=JPRB) :: WDEPOUT(KLON,KLEV,KTRAC) REAL(KIND=JPRB) :: SEDOUT_2D(KLON,KTRAC) -REAL(KIND=JPRB) :: DDEPOUT_2D(KLON,KTRAC) REAL(KIND=JPRB) :: WDEPOUT_2D(KLON,KTRAC) - REAL(KIND=JPRB) :: WDEPOUT_IC_2D(KLON,KTRAC) REAL(KIND=JPRB) :: WDEPOUT_BC_2D(KLON,KTRAC) -REAL(KIND=JPRB) :: M7TEND_OUT(KLON,KLEV,KTRAC) -REAL(KIND=JPRB) :: M7TEND_IN(KLON,KLEV,KTRAC) -REAL(KIND=JPRB) :: ZAVERAGEP(KLON,KLEV,(NCLASS+NAEROCOMP)) -REAL(KIND=JPRB) :: ZM7KAPPA(KLON,KLEV,(NCLASS+NAEROCOMP)) -REAL(KIND=JPRB) :: ZH2SO4CS(KLON,KLEV,(NCLASS+NAEROCOMP)) -REAL(KIND=JPRB) :: ZM7PRODCOND(KLON,KLEV,(NCLASS+NAEROCOMP)) -REAL(KIND=JPRB) :: ZVDA(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO) REAL(KIND=JPRB) :: ZSEDIFLUX(KLON,KLEV,NTRAC) REAL(KIND=JPRB) :: ZSEDIFLUXSURF(KLON,NTRAC) REAL(KIND=JPRB) :: ZDDEPFLUX(KLON,NTRAC) @@ -476,20 +426,9 @@ SUBROUTINE HAMM7_INTERFACE( & REAL(KIND=JPRB) :: PRS1D(KLON,KLEV) INTEGER(KIND=JPIM) :: ISO4_C, ISSO4_C ! temporary tracer index of gas-phase SO4 (retrieved from chemistry module) -! [RCHG -> non used ] REAL(KIND=JPRB) :: ZTENCI(KLON,KLEV,KTRAC) !for OIFS tendencies -! [RCHG -> non used ] INTEGER(kind=JPIM)::ZISO4 ! temporary tracer index of gas-phase SO4 (retrieved from chemistry module) -! [RCHG -> non used ] REAL(KIND=JPRB):: zza(KLON,klev) -! [RCHG -> non used ] REAL(KIND=JPRB)::zhenry_so2(2),zheneff(KLON,klev),ze3(KLON,klev), zqtp1(KLON,KLEV) -! [RCHG -> non used ] INTEGER(KIND=JPIM) :: IWHAT -! [RCHG -> non used] REAL(KIND=JPRB) :: TEST1(KLON,KLEV), TEST2(KLON,KLEV) -! [RCHG -> non used] REAL(KIND=JPRB) :: TEST3(KLON,KLEV), TEST4(KLON,KLEV) -! [RCHG -> non used] REAL(KIND=JPRB) :: TEST5(KLON,KLEV), TEST6(KLON,KLEV) -! [RCHG -> non used] REAL(KIND=JPRB) :: TEST7(KLON,KLEV), TEST8(KLON,KLEV) - REAL(KIND=JPRB) :: PAOD(KLON,NASWBAND), PSSA(KLON,NASWBAND), PABS(KLON,NASWBAND), PASY(KLON,NASWBAND),PFAOD(KLON,NASWBAND) REAL(KIND=JPRB) :: PAOD_LW(KLON,16) -REAL(KIND=JPRB) :: ZCHEM2AER(KLON,KLEV,6) ! to overwrite PCHEM2AER (or we could set the latter to inout intent) ! Boundary layer height index calculation REAL(KIND=JPRB) :: ZBLHIDX(KLON) ! index LOGICAL :: LBLHFOUND(KLON) ! logical if boundary layer height is found @@ -508,7 +447,6 @@ SUBROUTINE HAMM7_INTERFACE( & #include "abor1.intfb.h" #include "surf_inq.h" -#include "aer_so2so4_v2.intfb.h" #include "satur.intfb.h" #include "aer_negat.intfb.h" #include "tm5m7_optics_aop_get.intfb.h" @@ -516,7 +454,6 @@ SUBROUTINE HAMM7_INTERFACE( & #include "chem_inext.intfb.h" #include "m7_simple_sulfur_drydep.intfb.h" #include "ice_effective_radius.intfb.h" -!#include "m7.intfb.h" !----------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('HAMM7_INTERFACE',0,ZHOOK_HANDLE) @@ -625,8 +562,6 @@ SUBROUTINE HAMM7_INTERFACE( & !ZAEROUT4(KIDIA:KFDIA,:) =0._JPRB !ZAEROUT5(KIDIA:KFDIA,:) =0._JPRB -ZOUT(KIDIA:KFDIA,:) = 0._JPRB -ZOUT2(KIDIA:KFDIA,:) = 0._JPRB ZOUT3(KIDIA:KFDIA,:,:) = 0._JPRB ZOUT_dnuc(KIDIA:KFDIA,:,:) = 0._JPRB ! Need to initialize those 3 arrays early in case LAERDRYDP=F (GNU, Lianghai Wu) @@ -634,8 +569,6 @@ SUBROUTINE HAMM7_INTERFACE( & ZXTEMS(KIDIA:KFDIA,:) = 0._JPRB ! surface emissions as zero for input ZXTMD1(KIDIA:KFDIA,:,:) = 0._JPRB -M7TEND_IN(KIDIA:KFDIA,:,:) = 0._JPRB ! unused 2024-07-11 -M7TEND_OUT(KIDIA:KFDIA,:,:) = 0._JPRB ! unused 2024-07-11 SEDOUT(KIDIA:KFDIA,:,:) = 0._JPRB DDEPOUT(KIDIA:KFDIA,:,:) = 0._JPRB WDEPOUT(KIDIA:KFDIA,:,:) = 0._JPRB @@ -643,26 +576,22 @@ SUBROUTINE HAMM7_INTERFACE( & ZSEDIFLUXSURF(KIDIA:KFDIA,:) = 0._JPRB ZDDEPFLUX(KIDIA:KFDIA,:) = 0._JPRB ZDDEPFLUX_SO2(KIDIA:KFDIA) = 0._JPRB -ZVDA(KIDIA:KFDIA,:) = 0._JPRB ! unused 2024-07-11 SEDOUT_2D(KIDIA:KFDIA,:) = 0._JPRB -DDEPOUT_2D(KIDIA:KFDIA,:) = 0._JPRB ! unused 2024-07-11 WDEPOUT_2D(KIDIA:KFDIA,:) = 0._JPRB WDEPOUT_IC_2D(KIDIA:KFDIA,:) = 0._JPRB WDEPOUT_BC_2D(KIDIA:KFDIA,:) = 0._JPRB +ZMRATEPR_cov(KIDIA:KFDIA,:) = 0._JPRB +ZMRATEPS_cov(KIDIA:KFDIA,:) = 0._JPRB +ZFEVAPR_cov(KIDIA:KFDIA,:) = 0._JPRB ! +ZFSUBLS_cov(KIDIA:KFDIA,:) = 0._JPRB +ZTAERO(KIDIA:KFDIA,:,:) = 0._JPRB -ZAVERAGEP(KIDIA:KFDIA,:,:) = 0.0_JPRB ! unused 2024-07-11 -ZM7KAPPA(KIDIA:KFDIA,:,:) = 0.0_JPRB ! unused 2024-07-11 -ZH2SO4CS(KIDIA:KFDIA,:,:) = 0.0_JPRB ! unused 2024-07-11 -ZM7PRODCOND(KIDIA:KFDIA,:,:) = 0.0_JPRB ! unused 2024-07-11 - -ZTAERO(KIDIA:KFDIA,:,:) = 0._JPRB - -ZCEN(KIDIA:KFDIA,:,:) = 0._JPRB +ZCDNCACT(KIDIA:KFDIA,:) = 0._JPRB !number of activated particles [m-3] +ZCEN(KIDIA:KFDIA,:,:) = 0._JPRB +ZFRACN(KIDIA:KFDIA,:,:) = 0._JPRB !fraction of activated particles per mode !ZAERSRC(KIDIA:KFDIA,1:NACTAERO)=PAERSRC(KIDIA:KFDIA,1:NACTAERO) -ZCHEM2AER(KIDIA:KFDIA,1:KLEV,1:6)=PCHEM2AER(KIDIA:KFDIA,1:KLEV,1:6) - ZRG=1/RG ! computation of tropopause level @@ -733,8 +662,6 @@ SUBROUTINE HAMM7_INTERFACE( & ZM6DRY(KIDIA:KFDIA,:,:) = 0.0_JPRB ZRHOP(KIDIA:KFDIA,:,:) = 0.0_JPRB ZWW(KIDIA:KFDIA,:,:) = 0.0_JPRB -!ZAERML(KIDIA:KFDIA,:,:)=0.0_JPRB -!ZAERNL(KIDIA:KFDIA,:,:)=0.0_JPRB IF (LCHEM_DIA) THEN ZTAERO0(KIDIA:KFDIA,1:KLEV,1:NACTAERO) = ZTAEROK(KIDIA:KFDIA,1:KLEV,1:NACTAERO) @@ -800,7 +727,7 @@ SUBROUTINE HAMM7_INTERFACE( & !THIS-IS-NEVER-USED ! TB apparently unnecessary in current implementation, but ISSO4_C still needed for chem_inext in the code. !THIS-IS-NEVER-USED ! needs to be reviewed if it can be removed. -!THIS-IS-NEVER-USED IF(LAERCHEM .AND. NCHEM>0 .AND. TRIM(CHEM_SCHEME)=="tm5") THEN +!THIS-IS-NEVER-USED IF (TRIM(CHEM_SCHEME)=="tm5") THEN !THIS-IS-NEVER-USED DO JT=1,NCHEM !THIS-IS-NEVER-USED IF(TRIM(YCHEM(JT)%CNAME)== 'SO4' ) THEN !THIS-IS-NEVER-USED ISSO4_C=KCHEM(JT) @@ -808,7 +735,7 @@ SUBROUTINE HAMM7_INTERFACE( & !THIS-IS-NEVER-USED ENDIF !THIS-IS-NEVER-USED ENDDO !THIS-IS-NEVER-USED ZSO4G(KIDIA:KFDIA,1:KLEV)=ZCEN(KIDIA:KFDIA,1:KLEV,ISSO4_C) -!THIS-IS-NEVER-USED ELSE IF(LAERCHEM .AND. NCHEM>0 .AND. TRIM(CHEM_SCHEME)=="SimChem") THEN +!THIS-IS-NEVER-USED ELSE IF (TRIM(CHEM_SCHEME)=="SimChem") THEN !THIS-IS-NEVER-USED ZSO4G(KIDIA:KFDIA,1:KLEV)=0._JPRB !THIS-IS-NEVER-USED ELSE !THIS-IS-NEVER-USED CALL ABOR1(" M7: UNCOUPLED CHEMISTRY SCHEME "//TRIM(CHEM_SCHEME) ) @@ -861,11 +788,7 @@ SUBROUTINE HAMM7_INTERFACE( & !ADD SO4 from wet chemistry to tendencies if(trim(YAERO(JO)%CNAME)=='SO4_AS') then - ZXTTE(JL,JK,JH)=ZXTTE(JL,JK,JH)+ZCHEM2AER(JL,JK,2) - end if - - if(trim(YAERO(JO)%CNAME)=='SO4') then - ZXTTE(JL,JK,JH)=ZXTTE(JL,JK,JH)+ZCHEM2AER(JL,JK,1) + ZXTTE(JL,JK,JH)=ZXTTE(JL,JK,JH)+PCHEM2AER(JL,JK,2)!!! need to be verrified, Lianghai end if !if(trim(YAERO(ind_oifs_ham%ind_mass_OIFS(JMASS))%CNAME)=='SO4') then!!! add SO4 into tendency, ugly loop for now,Lianghai ! ZXTTE(JL,JK,ind_oifs_ham%ind_mass_HAM(JMASS))=ZXTTE(JL,JK,ind_oifs_ham%ind_mass_HAM(JMASS))+PCHEM2AER(JL,JK,1) @@ -875,42 +798,42 @@ SUBROUTINE HAMM7_INTERFACE( & END DO END DO -!!gas -!DO JGAS=1,subm_ngasspec -! JO=ind_oifs_ham%ind_gas_OIFS(JGAS) ! JO -> index context OIFS -! JH=ind_oifs_ham%ind_gas_HAM(JGAS) ! JH -> index context HAM -! !WRITE(*,*)"JO",JO -! !WRITE(*,*)"JH",JH -! !WRITE(*,*)"YCHEM(JO)%CNAME",YCHEM(JO)%CNAME -! DO JK=1,KLEV -! DO JL=KIDIA,KFDIA -! IF (TRIM(CHEM_SCHEME)=="tm5") THEN -! ZXTM1(JL,JK,JH) = ZCEN(JL,JK,KCHEM(JO)) -! IF(TRIM(YCHEM(JO)%CNAME)=='SO4')THEN ! Add SO4 from wet chemistry to tendencies -! ZXTTE(JL,JK,JH) = ZCHEM2AER(JL,JK,1) -! ELSE -! ZXTTE(JL,JK,JH) = PTENC(JL,JK,KCHEM(JO)) -! END IF -! ELSE IF (TRIM(CHEM_SCHEME)=="SimChem") THEN -! ZXTM1(JL,JK,JH) = ZCEN(JL,JK,KAERO(JO)) -! IF (TRIM(YAERO(JO)%CNAME)=='SO4')THEN -! ZXTTE(JL,JK,JH) = ZCHEM2AER(JL,JK,1)! + PTENC(JL,JK,KAERO(JO)) -! !ZXTTEM1(JL,JK,JH) = PTENC(JL,JK,KAERO(JO)) -! END IF -! !IF(TRIM(YAERO(JO)%CNAME)=='SO2')THEN -! ! ZXTTE(JL,JK,JH) = PTENC(JL,JK,KAERO(JO)) -! ! ZXTTEM1(JL,JK,JH) = PTENC(JL,JK,KAERO(JO)) -! !ELSE IF (TRIM(YAERO(JO)%CNAME)=='SO4_gas')THEN -! ! ZXTTE(JL,JK,JH) = ZCHEM2AER(JL,JK,1)! + PTENC(JL,JK,KAERO(JO)) -! ! !ZXTTEM1(JL,JK,JH) = PTENC(JL,JK,KAERO(JO)) -! !END IF -! ELSE -! CALL ABOR1(" M7: UNCOUPLED CHEMISTRY SCHEME "//TRIM(CHEM_SCHEME) ) -! END IF -! END DO -! END DO -!END DO - +!gas +DO JGAS=1,subm_ngasspec + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + JO = ind_oifs_ham%ind_gas_OIFS(JGAS) ! JO -> index context OIFS + JH = ind_oifs_ham%ind_gas_HAM(JGAS) ! JH -> index context HAM + + ZXTM1(JL,JK,JH) = ZCEN(JL,JK,KCHEM(JO)) + ZXTTE(JL,JK,JH) = PTENC(JL,JK,KCHEM(JO)) + + !IF(TRIM(YCHEM(JO)%CNAME)=='H2SO4')THEN + ! ZXTM1(JL,JK,JH) = ZCEN(JL,JK,KCHEM(JO)) + ! !ZSO4_PROD(JL,JK) = PCHEM2AER(JL,JK,1)*time_step_len!PTENC(JL,JK,KCHEM(ind_gas_OIFS(JGAS)))*time_step_len + ! !ZSO4_PROD_TEST(JL,JK) = PTENC(JL,JK,KCHEM(JO))*time_step_len + !ELSE + ! ZXTTE(JL,JK,JH) = PTENC(JL,JK,KCHEM(JO)) + !END IF + + !add for diagnostics + !ZSO4_PROD(JL,JK) = PTENC(JL,JK,KCHEM(JO))*time_step_len + !ZSO4_CONC(JL,JK) = ZCEN(JL,JK,KCHEM(JO)) + ! ELSE !simple sulfur scheme + ! IF(TRIM(YAERO(JO)%CNAME)=='SO2')THEN + ! ZXTM1(JL,JK,JH) = ZCEN(JL,JK,KAERO(JO)) + ! ! + ! ZXTTE(JL,JK,JH) = PTENC(JL,JK,KAERO(JO)) + ! ZXTTEM1(JL,JK,JH) = PTENC(JL,JK,KAERO(JO)) + ! + ! ELSE IF (TRIM(YAERO(JO)%CNAME)=='SO4_gas')THEN + ! ZXTM1(JL,JK,JH) = ZCEN(JL,JK,KAERO(JO)) + ! ZXTTE(JL,JK,JH) = PTENC(JL,JK,KAERO(JO)) + ! ZXTTEM1(JL,JK,JH) = PTENC(JL,JK,KAERO(JO)) + ! END IF + END DO + END DO +END DO ! RCHG -> This will produce segmentation fault if CDNC are not in the namelist ! we need to test these things and do a CALL ABORT1() @@ -939,7 +862,7 @@ SUBROUTINE HAMM7_INTERFACE( & ENDDO ENDDO -! --> calling the correct microphysics scheme +! --> calling the microphysics scheme !THIS-IS-NOT-NEEDED SELECT CASE (TRIM(AERO_SCHEME)) !THIS-IS-NOT-NEEDED @@ -1346,7 +1269,10 @@ SUBROUTINE HAMM7_INTERFACE( & ZLPU(KIDIA:KFDIA,1:KLEV) = PLU(KIDIA:KFDIA,1:KLEV) ! temporary variable for cloud water content (modified in wetdep) IF (TRIM(CHEM_SCHEME)=="SimChem")THEN - CALL HAM_CONV_LFRAQ_SO2(KFDIA,KLON,KLEV,PTP,ZXTM1,ZRHO,ZLP,ZLFRAC_SO2) + ! We need to revisit this subroutine, it can crash. Commented out for now. + ! Moreover, from the perspective of aligning SimChem and TM5 schemes, + ! this step should be (or probably has already been) handled on the chemistry side. + !LHW CALL HAM_CONV_LFRAQ_SO2(KFDIA,KLON,KLEV,PTP,ZXTM1,ZRHO,ZLP,ZLFRAC_SO2) END IF !Double call to wet deposition. One for convective case and one for stratiform case. @@ -1372,6 +1298,7 @@ SUBROUTINE HAMM7_INTERFACE( & LSTRAT = .FALSE. !False for convective case IF (.NOT. LSTRAT) THEN CALL XT_CONV_MASSFIX(KFDIA, KLON, KLEV, KLEV+1, NTRAC, ZKROW, PRSF1, PRS1, ZXTTE, .TRUE., ZDUMMY) ! call convective mass conserving (init zxtte_old) + CALL WETDEP_INTERFACE(KFDIA, KLON, KLEV, 1, ZKROW, LSTRAT, & ! ktop = 1 (top level index), lstrat = FALSE for conv. case ZDPG, ZMRATEPR_COV, ZMRATEPS_COV, ZMSNOWACL, & ! dp/g, evap. of rain, subl. of snow, accr. rate of snow with cl. drop in-cl. @@ -1467,14 +1394,14 @@ SUBROUTINE HAMM7_INTERFACE( & IF (LAERSEDIM) THEN IF ( ANY(trlist%ti(:)%nsedi > 0) ) THEN - ZTENCIH(KIDIA:KFDIA,1:KLEV,1:ntrac)=ZXTTE(KIDIA:KFDIA,1:KLEV,1:ntrac) + ZTENCIH(KIDIA:KFDIA,1:KLEV,1:NTRAC)=ZXTTE(KIDIA:KFDIA,1:KLEV,1:NTRAC) CALL SEDI_INTERFACE(KLON, KFDIA, KLEV, ZKROW, & PTP, ZQP, PRSF1, PRS1, & ! temperature, specific humidity, pressure at full level, pressure at half level ZM6RP, ZRHOP, & ! mean mode actual radius [m], mean mode particle density [kg m-3] ZXTM1, ZXTTE, ZSEDIFLUX, ZSEDIFLUXSURF) ! tracer mixing ratios and tendency (sediflux for diagnostics) - SEDOUT(KIDIA:KFDIA, 1:KLEV,:)=(ZTENCIH(KIDIA:KFDIA, 1:KLEV,:)-ZXTTE(KIDIA:KFDIA, 1:KLEV,:)) + SEDOUT(KIDIA:KFDIA, 1:KLEV,1:NTRAC) = ZTENCIH(KIDIA:KFDIA, 1:KLEV,1:NTRAC) - ZXTTE(KIDIA:KFDIA, 1:KLEV,1:NTRAC) DO JK=1,KLEV DO JCLASS=1,NCLASS SEDOUT_2D(KIDIA:KFDIA,KAERO(ind_oifs_ham%ind_class_OIFS(JCLASS)))=SEDOUT_2D(KIDIA:KFDIA,KAERO(ind_oifs_ham%ind_class_OIFS(JCLASS))) + ZSEDIFLUX(KIDIA:KFDIA, JK,ind_oifs_ham%ind_class_HAM(JCLASS)) @@ -1575,12 +1502,17 @@ SUBROUTINE HAMM7_INTERFACE( & & ZAZ0L, ZAZ0W, ZAZ0I, ZCDNL, ZCDNW, ZCDNI, ZDDEPFLUX, ZVDEP) !ZCDNL and ZCDNW used for ustar and aerodyn. resist. IF (TRIM(CHEM_SCHEME)=="SimChem")THEN - CALL M7_SIMPLE_SULFUR_DRYDEP(YDMODEL, KIDIA,KFDIA, KLON, KLEV, & - Zxtm1, PCFLX(:,KAERO(1):KAERO(NACTAERO)), & - ZDP, PGEOH, ZRHO, ZXTTE, PTSPHY,& - PSO2DD, PGELAM, & - ZFAERO, ZXTP1, ZDDEPFLUX_SO2) - ZDDEPFLUX(KIDIA:KFDIA,2)=ZDDEPFLUX_SO2(KIDIA:KFDIA) + ! Here inconsistent array dimensions have been fixed but + ! still commented this out. Because from the perspective of + ! aligning SimChem and TM5, I think this removal step should + ! be (or probably has already been) handled on the chemistry + ! side. Lianghai +! CALL M7_SIMPLE_SULFUR_DRYDEP(YDMODEL, KIDIA,KFDIA, KLON, KLEV, & +! ZXTM1(:,:,KAERO(1):KAERO(NACTAERO)), PCFLX(:,KAERO(1):KAERO(NACTAERO)), & +! ZDP, PGEOH, ZRHO, ZXTTE(:,:,KAERO(1):KAERO(NACTAERO)), PTSPHY,& +! PSO2DD, PGELAM, & +! ZFAERO(:,:,KAERO(1):KAERO(NACTAERO), ZXTP1(:,:,KAERO(1):KAERO(NACTAERO), ZDDEPFLUX_SO2) +! ZDDEPFLUX(KIDIA:KFDIA,2)=ZDDEPFLUX_SO2(KIDIA:KFDIA) END IF !--> modify tendency at surface according to changes in surface emissions @@ -1614,15 +1546,16 @@ SUBROUTINE HAMM7_INTERFACE( & PTENC(KIDIA:KFDIA,1:KLEV,KAERO(ind_oifs_ham%ind_mass_OIFS(JMASS))) = ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_mass_HAM(JMASS)) END DO !gas - !IF(LAERCHEM) THEN - ! DO JGAS=1,SUBM_NGASSPEC - ! PTENC(KIDIA:KFDIA,1:KLEV,KCHEM(ind_oifs_ham%ind_gas_OIFS(JGAS))) = ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_gas_HAM(JGAS)) - ! END DO + IF(LAERCHEM ) THEN + DO JGAS=1,SUBM_NGASSPEC + PTENC(KIDIA:KFDIA,1:KLEV,KCHEM(ind_oifs_ham%ind_gas_OIFS(JGAS))) = ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_gas_HAM(JGAS)) + END DO + END IF !!ELSE !! DO JGAS=1,SUBM_NGASSPEC !! PTENC(KIDIA:KFDIA,1:KLEV,KAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))) = ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_gas_HAM(JGAS)) !! END DO - !END IF + !!END IF ! RCHG -> not sure best way to solve here. I commented to avoid segmentation fault ! but it may be avoided with other more specific flag. Anyway something was @@ -2143,38 +2076,31 @@ SUBROUTINE HAMM7_INTERFACE( & ! It is not clear when NACTERO and when NTRAC DO JN=1,NACTAERO - !PGFL(KIDIA:KFDIA,JN,YAEROUT(22)%MP)=DDEPOUT(KIDIA:KFDIA,KLEV,KAERO(JN)) - PGFL(KIDIA:KFDIA, JN, YAEROUT(28)%MP) = PAERSRC(KIDIA:KFDIA,KAERO(JN)) ! Emissions per specie + PGFL(KIDIA:KFDIA, JN, YAEROUT(22)%MP) = DDEPOUT(KIDIA:KFDIA,KLEV,KAERO(JN)) + PGFL(KIDIA:KFDIA, JN, YAEROUT(27)%MP) = PAERSRC(KIDIA:KFDIA,KAERO(JN)) ! Emissions per specie END DO DO JN=1,NTRAC !PGFL(KIDIA:KFDIA,JN,YAEROUT(23)%MP)=WDEPOUT(KIDIA:KFDIA,KLEV,JN) !PGFL(KIDIA:KFDIA,JN,YAEROUT(24)%MP)=SEDOUT(KIDIA:KFDIA,KLEV,JN) PGFL(KIDIA:KFDIA,JN,YAEROUT(39)%MP)=ZXTEMS(KIDIA:KFDIA,JN) END DO - !DO JN=1,SUBM_NGASSPEC - ! PGFL(KIDIA:KFDIA,JN,YAEROUT(25)%MP)=zxtm1(KIDIA:KFDIA,KLEV,ind_oifs_ham%ind_gas_HAM(JN)) - !END DO + DO JN=1,SUBM_NGASSPEC + PGFL(KIDIA:KFDIA,JN,YAEROUT(25)%MP)=zxtm1(KIDIA:KFDIA,KLEV,ind_oifs_ham%ind_gas_HAM(JN)) + END DO !PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(26)%MP)=ZSEDIFLUX(KIDIA:KFDIA,1:KLEV,25) - !IF (LAERCHEM)THEN - !DO JGAS=1,SUBM_NGASSPEC - !ZXTM1(JL,JK,ind_gas_HAM(JGAS)) = MAX(0._JPRB,ZCEN(JL,JK,KCHEM(ind_gas_OIFS(JGAS)))) !eehol: remove negative values - !PGFL(KIDIA:KFDIA,JN,YAEROUT(28+JGAS)%MP)=ZCEN(JL,JK,KCHEM(ind_gas_OIFS(JGAS))) - !PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(28+JGAS)%MP)= PTENC(KIDIA:KFDIA,1:KLEV,KCHEM(ind_oifs_ham%ind_gas_OIFS(JGAS))) - !END DO - !ELSE - ! DO JGAS=1,subm_ngasspec - ! PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(28+JGAS)%MP)= PTENC(KIDIA:KFDIA,1:KLEV,KAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))) - ! ENDDO - !ENDIF + DO JGAS=1,SUBM_NGASSPEC + !ZXTM1(JL,JK,ind_oifs_ham%ind_gas_HAM(JGAS)) = MAX(0._JPRB,ZCEN(JL,JK,KCHEM(ind_oifs_ham%ind_gas_OIFS(JGAS)))) !eehol: remove negative values + PGFL(KIDIA:KFDIA,JGAS,YAEROUT(28+JGAS)%MP)=ZCEN(JL,JK,KCHEM(ind_oifs_ham%ind_gas_OIFS(JGAS))) + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(29+JGAS)%MP)= PTENC(KIDIA:KFDIA,1:KLEV,KCHEM(ind_oifs_ham%ind_gas_OIFS(JGAS))) + END DO DO IMODE=1,NMOD PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(30+IMODE)%MP)=RW_MODE(IMODE)%d2(KIDIA:KFDIA,1:KLEV) ! m ENDDO - !IF (.NOT.LAERCHEM) THEN - !IF (LAERCHEM .AND. TRIM(CHEM_SCHEME)=="SimChem")THEN + !IF (TRIM(CHEM_SCHEME)=="SimChem")THEN ! PGFL(KIDIA:KFDIA,KLEV,YAEROUT(40)%MP) = ZFSO2(KIDIA:KFDIA) ! tendency SS CS ham after update surface ! PGFL(KIDIA:KFDIA,KLEV,YAEROUT(41)%MP) = ZFSO4(KIDIA:KFDIA) ! tendency SS CS ham after update surfac ! PGFL(KIDIA:KFDIA,KLEV,YAEROUT(42)%MP) = ZFSO4_AQ(KIDIA:KFDIA) ! tendency SS CS ham after update surface diff --git a/ifs-source/arpifs/phys_ec/aer_so2so4_v2.F90 b/ifs-source/arpifs/phys_ec/aer_so2so4_v2.F90 index 7cf433a9..31c08ef8 100644 --- a/ifs-source/arpifs/phys_ec/aer_so2so4_v2.F90 +++ b/ifs-source/arpifs/phys_ec/aer_so2so4_v2.F90 @@ -306,12 +306,8 @@ SUBROUTINE AER_SO2SO4_V2 & ! Split PCHEMSULF1 array -!! Initialise tendencies (necessary when using sub-timesteps for chemistry, -!! since the total tendency will be the sum of "sub-tendencies". -!! PLS: This was commented in 43r3, which seems logical since (case of INTENT(INOUT)) these -!! arrays are filled before calling the AER_SO2SO4_V2 in both hamm7_interface.F90 and aer_phy3.F90. -!! Tommi had an issue: when these were intent(out), these initialisations were needed -!! TODO: review when we test the latest implementation of the sulfur scheme. Things depend on the code outside this routine. +! Initialise tendencies (necessary when using sub-timesteps for chemistry, +! since the total tendency will be the sum of "sub-tendencies"). These arrays could be declared "intent(out)" then PTSO2(KIDIA:KFDIA,:) = 0._JPRB PTSO4(KIDIA:KFDIA,:) = 0._JPRB PTSO4_AQ(KIDIA:KFDIA,:) = 0._JPRB diff --git a/ifs-source/arpifs/phys_ec/aerini_layer.F90 b/ifs-source/arpifs/phys_ec/aerini_layer.F90 index 5cabff36..03746fb0 100644 --- a/ifs-source/arpifs/phys_ec/aerini_layer.F90 +++ b/ifs-source/arpifs/phys_ec/aerini_layer.F90 @@ -119,7 +119,7 @@ SUBROUTINE AERINI_LAYER(YDGEOMETRY,YDSURF,& #include "aer_wind.intfb.h" #include "aer_phy2.intfb.h" #include "tm5m7_phy2.intfb.h" -#include "simple_sulfur_src.intfb.h" +!#include "simple_sulfur_src.intfb.h" #include "abor1.intfb.h" From 590168cdacffbb916ad8baec088413b9a4a17c47 Mon Sep 17 00:00:00 2001 From: Anton Laakso Date: Wed, 25 Jun 2025 23:09:32 +0300 Subject: [PATCH 082/129] Fix M7 aerosol optical properties for LW radiation (cherry picked from commit 0521d71816ad37cadfbb49c3bc86cb1646a2099c) --- ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 | 25 +++++++++++++------ .../arpifs/phys_radi/radiation_scheme.F90 | 17 ++++++++++--- ifs-source/arpifs/phys_radi/radintg.F90 | 17 +++++++------ 3 files changed, 41 insertions(+), 18 deletions(-) diff --git a/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 b/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 index 3039c544..9d96cb0e 100644 --- a/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 +++ b/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 @@ -200,7 +200,7 @@ SUBROUTINE AER_PHY3_LAYER(YDSURF, & ! FIXME Better than 1:14 is to define a variable with value 14 with a ! meaningful name (RCHG) - DO JAER=1,14 + DO JAER=1,YDMODEL%YRML_PHY_RAD%YRERAD%NTSW DO JK=1,KDIM%KLEV DO JL=KDIM%KIDIA,KDIM%KFDIA GEMSL%ZAEROTAU(JL,JK,JAER) = YDAERM7%M7AOD( JL,JK,JAER,IBLK) @@ -209,7 +209,13 @@ SUBROUTINE AER_PHY3_LAYER(YDSURF, & ENDDO ENDDO ENDDO - + DO JAER=1,16 + DO JK=1,KDIM%KLEV + DO JL=KDIM%KIDIA,KDIM%KFDIA + GEMSL%ZAEROTAULW(JL,JK,JAER) = YDAERM7%M7AODLW(JL,JK,JAER,IBLK) + ENDDO + ENDDO + ENDDO ZTAUS_AER = 0._JPRB ZTAUA_AER = 0._JPRB ZPMAER = 0._JPRB @@ -253,19 +259,24 @@ SUBROUTINE AER_PHY3_LAYER(YDSURF, & & STATE%U, STATE%V, PSURF%PCVL, PSURF%PCVH,PSURF%PSD_VF(:,YSD_VF%YSO2DD%MP), PAUX%PGEMU,PSURF%PSD_VD(:,YDSURF%YSD_VD%YBLH%MP)) !,ZTSO2,ZTSO4,ZTSO4_AQ,ZFSO2,ZFSO4 ,ZFSO4_AQ& !&) ! u-wind,v-wind,low veg. cover, high veg. cover, sine of latitude - ! FIXME Better than 1:14 is to define a variable with value 14 with a meaningful name (RCHG) - ! Note that %M7AODLW has 16 wavelenghts (see phys_radi/suecrad.F90, PLS) - DO JAER=1,14 + DO JAER=1,YDMODEL%YRML_PHY_RAD%YRERAD%NTSW DO JK=1,KDIM%KLEV DO JL=KDIM%KIDIA,KDIM%KFDIA YDAERM7%M7AOD(JL,JK,JAER,IBLK) = GEMSL%ZAEROTAU(JL,JK,JAER) YDAERM7%M7SSA(JL,JK,JAER,IBLK) = GEMSL%ZAEROSSA(JL,JK,JAER) !*GEMSL%ZAEROTAU(JL,JK,JAER) YDAERM7%M7ASYM(JL,JK,JAER,IBLK) = GEMSL%ZAEROASY(JL,JK,JAER) !*GEMSL%ZAEROSSA(JL,JK,JAER)*GEMSL%ZAEROTAU(JL,JK,JAER) - YDAERM7%M7AODLW(JL,JK,JAER,IBLK) = GEMSL%ZAEROTAULW(JL,JK,JAER) !weighed values calculated in raddvr. ENDDO ENDDO - ENDDO + ENDDO + DO JAER=1,16 !FIXME this needs better variable + DO JK=1,KDIM%KLEV + DO JL=KDIM%KIDIA,KDIM%KFDIA + YDAERM7%M7AODLW(JL,JK,JAER,IBLK) = GEMSL%ZAEROTAULW(JL,JK,JAER) + !weighed values calculated in raddvr. + ENDDO + ENDDO + ENDDO CASE ("aer") diff --git a/ifs-source/arpifs/phys_radi/radiation_scheme.F90 b/ifs-source/arpifs/phys_radi/radiation_scheme.F90 index c81f255e..de0e2698 100644 --- a/ifs-source/arpifs/phys_radi/radiation_scheme.F90 +++ b/ifs-source/arpifs/phys_radi/radiation_scheme.F90 @@ -23,7 +23,7 @@ SUBROUTINE RADIATION_SCHEME & & PFLUX_UV, PFLUX_PAR, PFLUX_PAR_CLEAR, & & PFLUX_SW_DN_TOA, PEMIS_OUT, PLWDERIVATIVE, & & PSWDIFFUSEBAND, PSWDIRECTBAND, & - & PAEROM7_TAU, PAEROM7_SSA, PAEROM7_ASYM, & ! added for M7 aerosol + & PAEROM7_TAU, PAEROM7_SSA, PAEROM7_ASYM, PAEROM7_TAULW, & ! added for M7 aerosol & PRE_LIQ, PRE_ICE, & & PPERT, PFSD) @@ -95,6 +95,9 @@ SUBROUTINE RADIATION_SCHEME & IMPLICIT NONE +! TEMPO HACK UNTIL WE GOT THE CMIP STRATO AEROSOLS +INTEGER(KIND=JPIM), PARAMETER :: STRATO_CMIP_NTB=16 + ! INPUT ARGUMENTS ! *** Array dimensions and ranges @@ -153,7 +156,7 @@ SUBROUTINE RADIATION_SCHEME & REAL(KIND=JPRB), INTENT(IN), OPTIONAL :: PAEROM7_TAU(KLON,KLEV,14) REAL(KIND=JPRB), INTENT(IN), OPTIONAL :: PAEROM7_SSA(KLON,KLEV,14) REAL(KIND=JPRB), INTENT(IN), OPTIONAL :: PAEROM7_ASYM(KLON,KLEV,14) -!REAL(KIND=JPRB), INTENT(IN) :: PAEROM7_TAULW(KLON,KLEV,16) +REAL(KIND=JPRB), INTENT(IN), OPTIONAL :: PAEROM7_TAULW(KLON,KLEV,16) REAL(KIND=JPRB), INTENT(IN) :: PCCN_LAND(KLON) REAL(KIND=JPRB), INTENT(IN) :: PCCN_SEA(KLON) @@ -588,7 +591,7 @@ SUBROUTINE RADIATION_SCHEME & AEROSOL%G_SW(1:YRERAD%NTSW,:,KIDIA:KFDIA) = 0.0_JPRB ENDIF IF (RAD_CONFIG%DO_LW) THEN - AEROSOL%OD_LW(1:YRERAD%NTSW,:,KIDIA:KFDIA) = 0.0_JPRB + AEROSOL%OD_LW(1:STRATO_CMIP_NTB,:,KIDIA:KFDIA) = 0.0_JPRB ENDIF ! fill with M7 values -> @@ -605,7 +608,13 @@ SUBROUTINE RADIATION_SCHEME & ENDDO ENDIF IF (RAD_CONFIG%DO_LW) THEN - AEROSOL%OD_LW = REPSCAER ! Min value. FIXME TODO need update + DO JAER = 1,STRATO_CMIP_NTB + DO JLEV = 1,KLEV + DO JLON = KIDIA,KFDIA + AEROSOL%OD_LW(JAER,JLEV,JLON) = MAX(REPSCAER,PAEROM7_TAULW(JLON,JLEV,JAER)) + ENDDO + ENDDO + ENDDO ENDIF ENDIF !ENDIF diff --git a/ifs-source/arpifs/phys_radi/radintg.F90 b/ifs-source/arpifs/phys_radi/radintg.F90 index 040514e3..3dbcee1a 100644 --- a/ifs-source/arpifs/phys_radi/radintg.F90 +++ b/ifs-source/arpifs/phys_radi/radintg.F90 @@ -372,7 +372,7 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE, & & IECPO3, ICCNL, ICCNO, ICO2, ICH4, IN2O, INO2, & & IC11, IC12, IC22, ICL4, IFSD, & & ILWDERIVATIVE, ISWDIRECTBAND, ISWDIFFUSEBAND, & - & IHAMAEROAOD, IHAMAEROSSA, IHAMAEROASYM !,IHAMAEROAODLW + & IHAMAEROAOD, IHAMAEROSSA, IHAMAEROASYM, IHAMAEROAODLW INTEGER(KIND=JPIM) :: IRE_LIQ, IRE_ICE @@ -429,7 +429,7 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE, & REAL(KIND=JPHOOK) :: ZHOOK_HANDLE -INTEGER(KIND=JPIM) :: IAUX +INTEGER(KIND=JPIM) :: IAUX, INLWTEMP ! ------------------------------------------------------------------- @@ -561,7 +561,7 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE, & LLDEBUGRW=.FALSE. ENDIF #endif - +INLWTEMP=16 !-- NAERO > 0 and <= 16 is GEMS/MACC active configuration !-- YDERAD%NAERMACC = 1 is MACC-derived aerosol climatology !-- NACTAERO is the number of aerosol active in the prognostic scheme @@ -659,6 +659,7 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE, & IHAMAEROAOD =INDRAD(INEXT,KLEV*NTSW,(TRIM(AERO_SCHEME) == "hamm7" .AND. LAERRRTM)) IHAMAEROSSA =INDRAD(INEXT,KLEV*NTSW,(TRIM(AERO_SCHEME) == "hamm7" .AND. LAERRRTM)) IHAMAEROASYM =INDRAD(INEXT,KLEV*NTSW,(TRIM(AERO_SCHEME) == "hamm7" .AND. LAERRRTM)) +IHAMAEROAODLW =INDRAD(INEXT,KLEV*INLWTEMP,(TRIM(AERO_SCHEME) == "hamm7" .AND. LAERRRTM)) !write(*,*) "IAERO ",IAERO !write(*,*) "IHAMAEROAOD ",IHAMAEROAOD !write(*,*) "IHAMAEROSSA ",IHAMAEROSSA @@ -794,6 +795,7 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE, & WRITE(NULOUT,'("RADINTG: IHAMAEROAOD =",I0)')IHAMAEROAOD WRITE(NULOUT,'("RADINTG: IHAMAEROSSA =",I0)')IHAMAEROSSA WRITE(NULOUT,'("RADINTG: IHAMAEROASYM =",I0)')IHAMAEROASYM + WRITE(NULOUT,'("RADINTG: IHAMAEROASYM =",I0)')IHAMAEROAODLW WRITE(NULOUT,'("RADINTG: IPERT =",I0)')IPERT WRITE(NULOUT,'("RADINTG: ICO2 =",I0)')ICO2 WRITE(NULOUT,'("RADINTG: ICH4 =",I0)')ICH4 @@ -1011,10 +1013,10 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE, & ZRGP(1:IL,IHAMAEROASYM+IAE:IHAMAEROASYM+IAE+KLEV-1,IB) = MAX(0._JPRB, PAEROASYM(IBEG:IEND,1:KLEV,JAERO)) ENDDO - !DO JAERO=1,STRATO_CMIP6_NTB - !IAE=(JAERO-1)*KLEV - !ZRGP(1:IL,IHAMAEROAODLW+IAE:IHAMAEROAODLW+IAE+KLEV-1,IB) =MAX(0._JPRB, PAEROTAULW(IBEG:IEND,1:KLEV,JAERO)) - !ENDDO + DO JAERO=1,16 ! ALaak: Need to be changed to some variable + IAE=(JAERO-1)*KLEV + ZRGP(1:IL,IHAMAEROAODLW+IAE:IHAMAEROAODLW+IAE+KLEV-1,IB) =MAX(0._JPRB, PAEROTAULW(IBEG:IEND,1:KLEV,JAERO)) + ENDDO !ENDIF ELSE @@ -1701,6 +1703,7 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE, & & ZRGP(1,ISwDiffuseBand,IB), ZRGP(1,ISwDirectBand,IB),& ! OPTIONAL ARGUMENTS & PAEROM7_TAU=ZRGP(1,IHAMAEROAOD,IB), PAEROM7_SSA=ZRGP(1,IHAMAEROSSA,IB), PAEROM7_ASYM=ZRGP(1,IHAMAEROASYM,IB), & + & PAEROM7_TAULW=ZRGP(1,IHAMAEROAODLW,IB), & & PRE_LIQ=ZRGP(1,IRE_LIQ,IB), PRE_ICE=ZRGP(1,IRE_ICE,IB),& & PPERT=ZRGP(1,IPERT,IB), PFSD=ZRGP(1,IFSD,IB) ) ENDIF From 5e01facc22176e46fd91e82f98d6717df5d5b9ff Mon Sep 17 00:00:00 2001 From: Anton Laakso Date: Wed, 2 Jul 2025 22:14:33 +0300 Subject: [PATCH 083/129] Hotfix: Avoid double weighting of M7 aerosol properties (cherry picked from commit 38e0a02edf414b25f09078acdeadabfd6ffdbd12) --- ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 | 4 +--- ifs-source/arpifs/phys_radi/raddrv.F90 | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 b/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 index 9d96cb0e..1632f2a1 100644 --- a/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 +++ b/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 @@ -264,8 +264,7 @@ SUBROUTINE AER_PHY3_LAYER(YDSURF, & DO JL=KDIM%KIDIA,KDIM%KFDIA YDAERM7%M7AOD(JL,JK,JAER,IBLK) = GEMSL%ZAEROTAU(JL,JK,JAER) YDAERM7%M7SSA(JL,JK,JAER,IBLK) = GEMSL%ZAEROSSA(JL,JK,JAER) !*GEMSL%ZAEROTAU(JL,JK,JAER) - YDAERM7%M7ASYM(JL,JK,JAER,IBLK) = GEMSL%ZAEROASY(JL,JK,JAER) !*GEMSL%ZAEROSSA(JL,JK,JAER)*GEMSL%ZAEROTAU(JL,JK,JAER) - !weighed values calculated in raddvr. + YDAERM7%M7ASYM(JL,JK,JAER,IBLK) = GEMSL%ZAEROASY(JL,JK,JAER) !*GEMSL%ZAEROSSA(JL,JK,JAER)*GEMSL%ZAEROTAU(JL,JK,JAER) ENDDO ENDDO ENDDO @@ -273,7 +272,6 @@ SUBROUTINE AER_PHY3_LAYER(YDSURF, & DO JK=1,KDIM%KLEV DO JL=KDIM%KIDIA,KDIM%KFDIA YDAERM7%M7AODLW(JL,JK,JAER,IBLK) = GEMSL%ZAEROTAULW(JL,JK,JAER) - !weighed values calculated in raddvr. ENDDO ENDDO ENDDO diff --git a/ifs-source/arpifs/phys_radi/raddrv.F90 b/ifs-source/arpifs/phys_radi/raddrv.F90 index 1d73e116..4ad6d294 100644 --- a/ifs-source/arpifs/phys_radi/raddrv.F90 +++ b/ifs-source/arpifs/phys_radi/raddrv.F90 @@ -692,8 +692,8 @@ SUBROUTINE RADDRV(YDGEOMETRY,YDFIELDS,YDMODEL,KGPTOT,KFLDS,KBLOCKS,PGPIN) DO JK=1,NFLEVG DO JL=IST,IEND ZAEROTAU(JSTGLO+JL-1,JK,JAER) = YDAERM7%M7AOD(JL,JK,JAER,IBL) - ZAEROSSA(JSTGLO+JL-1,JK,JAER) = YDAERM7%M7SSA(JL,JK,JAER,IBL)*YDAERM7%M7AOD(JL,JK,JAER,IBL) - ZAEROASYM(JSTGLO+JL-1,JK,JAER)= YDAERM7%M7ASYM(JL,JK,JAER,IBL)*YDAERM7%M7SSA(JL,JK,JAER,IBL)*YDAERM7%M7AOD(JL,JK,JAER,IBL) + ZAEROSSA(JSTGLO+JL-1,JK,JAER) = YDAERM7%M7SSA(JL,JK,JAER,IBL) ! This weighting is done in add_aerosol_optics_direct: *YDAERM7%M7AOD(JL,JK,JAER,IBL) + ZAEROASYM(JSTGLO+JL-1,JK,JAER)= YDAERM7%M7ASYM(JL,JK,JAER,IBL) ! This weighting is done in add_aerosol_optics_direct: *YDAERM7%M7SSA(JL,JK,JAER,IBL)*YDAERM7%M7AOD(JL,JK,JAER,IBL) ENDDO ENDDO ENDDO From 608219f819dccdc1ed3d518e6908fc54aa982a55 Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Tue, 8 Jul 2025 12:11:04 +0200 Subject: [PATCH 084/129] Initialize unused data returned by interface with M7 --- .../arpifs/m7/phys_ec/hamm7_interface.F90 | 38 +++++-------------- 1 file changed, 9 insertions(+), 29 deletions(-) diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index 1c4df1aa..e362911a 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -663,6 +663,15 @@ SUBROUTINE HAMM7_INTERFACE( & ZRHOP(KIDIA:KFDIA,:,:) = 0.0_JPRB ZWW(KIDIA:KFDIA,:,:) = 0.0_JPRB +DO JB=1, NBANDS_TROP + PTAUS_AER(KIDIA:KFDIA,1:KLEV,JB,1) = 0.0_JPRB + PTAUA_AER(KIDIA:KFDIA,1:KLEV,JB,1) = 0.0_JPRB + PPMAER (KIDIA:KFDIA,1:KLEV,JB,1) = 0.0_JPRB + PTAUS_AER(KIDIA:KFDIA,1:KLEV,JB,2) = 0.0_JPRB + PTAUA_AER(KIDIA:KFDIA,1:KLEV,JB,2) = 0.0_JPRB + PPMAER (KIDIA:KFDIA,1:KLEV,JB,2) = 0.0_JPRB +ENDDO + IF (LCHEM_DIA) THEN ZTAERO0(KIDIA:KFDIA,1:KLEV,1:NACTAERO) = ZTAEROK(KIDIA:KFDIA,1:KLEV,1:NACTAERO) ZTENC0(KIDIA:KFDIA,1:KLEV, :) = 0._JPRB @@ -1750,35 +1759,6 @@ SUBROUTINE HAMM7_INTERFACE( & ENDDO ENDDO - ! "I am not sure if the rest is needed" [who is 'I'? FIXME] - ! [PLS, 2024-07-11] This is only assigning 0 to output variables. - - !PLS-NOT-USED ALLOCATE( ZAOP_OUT_EXT( KLON, KLEV, NWDEP, 1)) ; ZAOP_OUT_EXT = 0.0_JPRB - !PLS-NOT-USED ALLOCATE( ZAOP_OUT_A ( KLON, KLEV, NWDEP) ) ; ZAOP_OUT_A = 0.0_JPRB - !PLS-NOT-USED ALLOCATE( ZAOP_OUT_G ( KLON, KLEV, NWDEP) ) ; ZAOP_OUT_G = 0.0_JPRB - !PLS-NOT-USED - !PLS-NOT-USED ALLOCATE(ZTAUS_AER (KLON, KLEV,NWDEP)); ZTAUS_AER = 0.0 - !PLS-NOT-USED ALLOCATE(ZTAUA_AER (KLON, KLEV,NWDEP)); ZTAUA_AER = 0.0 - !PLS-NOT-USED ALLOCATE(ZPMAER (KLON, KLEV,NWDEP)); ZPMAER = 0.0 - - DO JB=1, NBANDS_TROP - PTAUS_AER(KIDIA:KFDIA,:,JB,1) = 0.0_JPRB !ZTAUS_AER(:,:,WAV_GRID(JB)) - PTAUA_AER(KIDIA:KFDIA,:,JB,1) = 0.0_JPRB !ZTAUA_AER(:,:,WAV_GRID(JB)) - PPMAER (KIDIA:KFDIA,:,JB,1) = 0.0_JPRB !ZPMAER (:,:,WAV_GRID(JB)) - - PTAUS_AER(KIDIA:KFDIA,:,JB,2) = 0.0_JPRB !ZTAUS_AER(:,:,WAV_GRIDA(JB)) - PTAUA_AER(KIDIA:KFDIA,:,JB,2) = 0.0_JPRB !ZTAUA_AER(:,:,WAV_GRIDA(JB)) - PPMAER (KIDIA:KFDIA,:,JB,2) = 0.0_JPRB !ZPMAER (:,:,WAV_GRIDA(JB)) - ENDDO - - !PLS-NOT-USED DEALLOCATE(ZTAUS_AER) - !PLS-NOT-USED DEALLOCATE(ZTAUA_AER) - !PLS-NOT-USED DEALLOCATE(ZPMAER) - !PLS-NOT-USED - !PLS-NOT-USED DEALLOCATE(ZAOP_OUT_EXT) - !PLS-NOT-USED DEALLOCATE(ZAOP_OUT_A ) - !PLS-NOT-USED DEALLOCATE(ZAOP_OUT_G ) - CASE (2) ! Use HAM codes to calculate optical properties LWBANDS=16 From 33d9070a4c300dab568e8dd35f85bfc9dd8818b7 Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Fri, 11 Jul 2025 13:11:59 +0200 Subject: [PATCH 085/129] Ensure that computed aerosol optical properties are sent back --- ifs-source/arpifs/m7/hamm7_init.F90 | 3 ++- ifs-source/arpifs/m7/module/mo_radiation_parameters.F90 | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/ifs-source/arpifs/m7/hamm7_init.F90 b/ifs-source/arpifs/m7/hamm7_init.F90 index 24aac2d7..98bcee9a 100644 --- a/ifs-source/arpifs/m7/hamm7_init.F90 +++ b/ifs-source/arpifs/m7/hamm7_init.F90 @@ -104,7 +104,7 @@ SUBROUTINE hamm7_init(YGFL, YRRIP, CHEM_SCHEME) ONLY: activ_initialize, idt_cdnc, idt_icnc USE MO_PARAM_SWITCHES, & - ONLY: ncd_activ, nactivpdf + ONLY: ncd_activ, nactivpdf, lcdnc_progn IMPLICIT NONE @@ -154,6 +154,7 @@ SUBROUTINE hamm7_init(YGFL, YRRIP, CHEM_SCHEME) !eehol: activation initialization nactivpdf = 1 !eehol: using PDF to calculate updraft. Hardcoded for now.. need to check this later (add setphys to oifs?) ncd_activ = 2 !eehol: Abdul-Razzak and Ghan activation scheme. Hardcoded for now.. need to check this later (add setphys to oifs?) +lcdnc_progn = .TRUE. CALL activ_initialize !eehol: set cdnc and icnc indices for HAM diff --git a/ifs-source/arpifs/m7/module/mo_radiation_parameters.F90 b/ifs-source/arpifs/m7/module/mo_radiation_parameters.F90 index b9eebcb9..64503ed7 100644 --- a/ifs-source/arpifs/m7/module/mo_radiation_parameters.F90 +++ b/ifs-source/arpifs/m7/module/mo_radiation_parameters.F90 @@ -10,7 +10,7 @@ MODULE mo_radiation_parameters PUBLIC :: iaero, decl_sun_cur - INTEGER :: iaero = 2 !< aerosol model + INTEGER :: iaero = 1 !< aerosol model REAL(wp) :: decl_sun_cur !< solar declination at current time step END MODULE mo_radiation_parameters From ebc694f33bd9083655b5773809c08e9ffdd6db12 Mon Sep 17 00:00:00 2001 From: Eemeli Holopainen Date: Thu, 10 Jul 2025 07:07:13 +0300 Subject: [PATCH 086/129] Adding cloud top level index to wet deposition to reduce computation --- ifs-source/arpifs/m7/module/mo_ham_tools.F90 | 78 +++++++++---------- ifs-source/arpifs/m7/module/mo_ham_wetdep.F90 | 11 +-- .../arpifs/m7/phys_ec/hamm7_interface.F90 | 20 ++++- 3 files changed, 60 insertions(+), 49 deletions(-) diff --git a/ifs-source/arpifs/m7/module/mo_ham_tools.F90 b/ifs-source/arpifs/m7/module/mo_ham_tools.F90 index 6c3917e2..086c0045 100644 --- a/ifs-source/arpifs/m7/module/mo_ham_tools.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_tools.F90 @@ -463,66 +463,66 @@ SUBROUTINE scavcoef_bilinterp(kproma, kbdim, klev, krow, ktop, & ! ---------------------------------------------------------------------------------------- - pscavcoef(1:kproma,:) = 0._dp + pscavcoef(1:kproma,:) = 0._dp !eehol: put scav coef to 0 for all levels but use ktop:klev slice from here on - lint1(1:kproma,:) = (X1(1:kproma,:) /= X2(1:kproma,:)) .AND. (Y1(1:kproma,:) == Y2(1:kproma,:)) - lint2(1:kproma,:) = (X1(1:kproma,:) == X2(1:kproma,:)) .AND. (Y1(1:kproma,:) /= Y2(1:kproma,:)) - lint3(1:kproma,:) = (X1(1:kproma,:) == X2(1:kproma,:)) .AND. (Y1(1:kproma,:) == Y2(1:kproma,:)) - lint4(1:kproma,:) = (X1(1:kproma,:) /= X2(1:kproma,:)) .AND. (Y1(1:kproma,:) /= Y2(1:kproma,:)) + lint1(1:kproma,ktop:klev) = (X1(1:kproma,ktop:klev) /= X2(1:kproma,ktop:klev)) .AND. (Y1(1:kproma,ktop:klev) == Y2(1:kproma,ktop:klev)) + lint2(1:kproma,ktop:klev) = (X1(1:kproma,ktop:klev) == X2(1:kproma,ktop:klev)) .AND. (Y1(1:kproma,ktop:klev) /= Y2(1:kproma,ktop:klev)) + lint3(1:kproma,ktop:klev) = (X1(1:kproma,ktop:klev) == X2(1:kproma,ktop:klev)) .AND. (Y1(1:kproma,ktop:klev) == Y2(1:kproma,ktop:klev)) + lint4(1:kproma,ktop:klev) = (X1(1:kproma,ktop:klev) /= X2(1:kproma,ktop:klev)) .AND. (Y1(1:kproma,ktop:klev) /= Y2(1:kproma,ktop:klev)) ! --- Interpolation in x direction only (rain rates) ------------------------------------- - ztmp1(1:kproma,:) = MERGE( & - X2(1:kproma,:)-X1(1:kproma,:), & - 1._dp, & !SF dummy value - lint1(1:kproma,:)) + ztmp1(1:kproma,ktop:klev) = MERGE( & + X2(1:kproma,ktop:klev)-X1(1:kproma,ktop:klev), & + 1._dp, & !SF dummy value + lint1(1:kproma,ktop:klev)) - ztmp1(1:kproma,:) = & - (((X2(1:kproma,:)-pfprecip(1:kproma,:))/ztmp1(1:kproma,:))*Q11(1:kproma,:)) & - +(((pfprecip(1:kproma,:)-X1(1:kproma,:))/ztmp1(1:kproma,:))*Q21(1:kproma,:)) + ztmp1(1:kproma,ktop:klev) = & + (((X2(1:kproma,ktop:klev)-pfprecip(1:kproma,ktop:klev))/ztmp1(1:kproma,ktop:klev))*Q11(1:kproma,ktop:klev)) & + +(((pfprecip(1:kproma,ktop:klev)-X1(1:kproma,ktop:klev))/ztmp1(1:kproma,ktop:klev))*Q21(1:kproma,ktop:klev)) - pscavcoef(1:kproma,:) = MERGE(ztmp1(1:kproma,:), pscavcoef(1:kproma,:), lint1(1:kproma,:)) + pscavcoef(1:kproma,ktop:klev) = MERGE(ztmp1(1:kproma,ktop:klev), pscavcoef(1:kproma,ktop:klev), lint1(1:kproma,ktop:klev)) ! --- Interpolation in y direction only (aerosol radii) ---------------------------------- - ztmp1(1:kproma,:) = MERGE( & - Y2(1:kproma,:)-Y1(1:kproma,:), & - 1._dp, & !SF dummy value - lint2(1:kproma,:)) + ztmp1(1:kproma,ktop:klev) = MERGE( & + Y2(1:kproma,ktop:klev)-Y1(1:kproma,ktop:klev), & + 1._dp, & !SF dummy value + lint2(1:kproma,ktop:klev)) - ztmp1(1:kproma,:) = & - (((Y2(1:kproma,:)-pmr(1:kproma,:))/ztmp1(1:kproma,:))*Q21(1:kproma,:)) & - +(((pmr(1:kproma,:)-Y1(1:kproma,:))/ztmp1(1:kproma,:))*Q22(1:kproma,:)) + ztmp1(1:kproma,ktop:klev) = & + (((Y2(1:kproma,ktop:klev)-pmr(1:kproma,ktop:klev))/ztmp1(1:kproma,ktop:klev))*Q21(1:kproma,ktop:klev)) & + +(((pmr(1:kproma,ktop:klev)-Y1(1:kproma,ktop:klev))/ztmp1(1:kproma,ktop:klev))*Q22(1:kproma,ktop:klev)) - pscavcoef(1:kproma,:) = MERGE(ztmp1(1:kproma,:), pscavcoef(1:kproma,:), lint2(1:kproma,:)) + pscavcoef(1:kproma,ktop:klev) = MERGE(ztmp1(1:kproma,ktop:klev), pscavcoef(1:kproma,ktop:klev), lint2(1:kproma,ktop:klev)) ! --- No interpolation of below-cloud scavenging coefficents ----------------------------- - ztmp1(1:kproma,:) = Q11(1:kproma,:) + ztmp1(1:kproma,ktop:klev) = Q11(1:kproma,ktop:klev) - pscavcoef(1:kproma,:) = MERGE(ztmp1(1:kproma,:), pscavcoef(1:kproma,:), lint3(1:kproma,:)) + pscavcoef(1:kproma,ktop:klev) = MERGE(ztmp1(1:kproma,ktop:klev), pscavcoef(1:kproma,ktop:klev), lint3(1:kproma,ktop:klev)) ! --- Bilinear interpolation of below-cloud scavenging coefficients ---------------------- - ztmp1(1:kproma,:) = MERGE( & - X2(1:kproma,:)-X1(1:kproma,:), & + ztmp1(1:kproma,ktop:klev) = MERGE( & + X2(1:kproma,ktop:klev)-X1(1:kproma,ktop:klev), & 1._dp, & !SF dummy value - lint4(1:kproma,:)) + lint4(1:kproma,ktop:klev)) - ztmp2(1:kproma,:) = MERGE( & - Y2(1:kproma,:)-Y1(1:kproma,:), & + ztmp2(1:kproma,ktop:klev) = MERGE( & + Y2(1:kproma,ktop:klev)-Y1(1:kproma,ktop:klev), & 1._dp, & !SF dummy value - lint4(1:kproma,:)) - - ztmp3(1:kproma,:) = & - (((Y2(1:kproma,:)-pmr(1:kproma,:))/ztmp2(1:kproma,:))* & - ((((X2(1:kproma,:)-pfprecip(1:kproma,:))/ztmp1(1:kproma,:))*Q11(1:kproma,:)) & - +((pfprecip(1:kproma,:)-X1(1:kproma,:))/ztmp1(1:kproma,:))*Q21(1:kproma,:))) + & - (((pmr(1:kproma,:)-Y1(1:kproma,:))/ztmp2(1:kproma,:))* & - ((((X2(1:kproma,:)-pfprecip(1:kproma,:))/ztmp1(1:kproma,:))*Q12(1:kproma,:)) & - +((pfprecip(1:kproma,:)-X1(1:kproma,:))/ztmp1(1:kproma,:))*Q22(1:kproma,:))) - - pscavcoef(1:kproma,:) = MERGE(ztmp3(1:kproma,:), pscavcoef(1:kproma,:), lint4(1:kproma,:)) + lint4(1:kproma,ktop:klev)) + + ztmp3(1:kproma,ktop:klev) = & + (((Y2(1:kproma,ktop:klev)-pmr(1:kproma,ktop:klev))/ztmp2(1:kproma,ktop:klev))* & + ((((X2(1:kproma,ktop:klev)-pfprecip(1:kproma,ktop:klev))/ztmp1(1:kproma,ktop:klev))*Q11(1:kproma,ktop:klev)) & + +((pfprecip(1:kproma,ktop:klev)-X1(1:kproma,ktop:klev))/ztmp1(1:kproma,ktop:klev))*Q21(1:kproma,ktop:klev))) + & + (((pmr(1:kproma,ktop:klev)-Y1(1:kproma,ktop:klev))/ztmp2(1:kproma,ktop:klev))* & + ((((X2(1:kproma,ktop:klev)-pfprecip(1:kproma,ktop:klev))/ztmp1(1:kproma,ktop:klev))*Q12(1:kproma,ktop:klev)) & + +((pfprecip(1:kproma,ktop:klev)-X1(1:kproma,ktop:klev))/ztmp1(1:kproma,ktop:klev))*Q22(1:kproma,ktop:klev))) + + pscavcoef(1:kproma,ktop:klev) = MERGE(ztmp3(1:kproma,ktop:klev), pscavcoef(1:kproma,ktop:klev), lint4(1:kproma,ktop:klev)) END SUBROUTINE scavcoef_bilinterp diff --git a/ifs-source/arpifs/m7/module/mo_ham_wetdep.F90 b/ifs-source/arpifs/m7/module/mo_ham_wetdep.F90 index dce89a46..e7d49784 100755 --- a/ifs-source/arpifs/m7/module/mo_ham_wetdep.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_wetdep.F90 @@ -230,9 +230,7 @@ SUBROUTINE ham_wetdep(kproma, kbdim, klev, krow, ktop, kt, ztmp1(kbdim,klev), ztmp2(kbdim,klev) !--- 0/ Initializations: - - !CALL prep_ham_mode_init(kproma, kbdim, klev) - + ztmst = time_step_len imod = trlist%ti(kt)%mode @@ -453,11 +451,10 @@ SUBROUTINE ham_wetdep(kproma, kbdim, klev, krow, ktop, kt, !--- Calculate fraction of below cloud scavenged tracer: ll1(1:kproma,:) = (paclc(1:kproma,:) < zmin) + + ztmp1(1:kproma,:) = -ztmst*MAX(sfrain(1:kproma,:,itrac_phase,imod),0._dp) + ztmp2(1:kproma,:) = -ztmst*MAX(sfsnow(1:kproma,:,itrac_phase,imod),0._dp) - !ztmp1(1:kproma,:) = -ztmst*MAX(sfrain(1:kproma,:,itrac_phase,imod),0._dp) - !ztmp2(1:kproma,:) = -ztmst*MAX(sfsnow(1:kproma,:,itrac_phase,imod),0._dp) - ztmp1(1:kproma,:) = -ztmst*MIN(MAX((1._dp)*sfrain(1:kproma,:,itrac_phase,imod),0._dp),1._dp) !eehol: test - ztmp2(1:kproma,:) = -ztmst*MIN(MAX((1._dp)*sfsnow(1:kproma,:,itrac_phase,imod),0._dp),1._dp) !eehol: test !SFnote: in the above two expressions, the MAX function is here only to rule out the cases where sfrain and/or ! sfsnow is/are equal to UNDEF, ie in cases where scavenging by rain and/or snow is not relevant. ! Initializing sfrain and sfsnow to 0 at the beginning would defeat the concept of having an UNDEF value, diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index e362911a..020fb23a 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -265,6 +265,7 @@ SUBROUTINE HAMM7_INTERFACE( & INTEGER(KIND=JPIM) :: ISSO2, ISSO4, ISSO4_ACS INTEGER(KIND=JPIM) :: IMODE INTEGER(KIND=JPIM) :: IFLAG +INTEGER(KIND=JPIM) :: KTOP ! cloud top index REAL(KIND=JPRB) :: ZAEROK(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO) REAL(KIND=JPRB) :: ZTAEROK(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO) @@ -943,7 +944,20 @@ SUBROUTINE HAMM7_INTERFACE( & ZQLWP(JL,JK) = MIN(MAX(ZQLWP(JL,JK),0.0_JPRB),RCLDMAX) ! treshold lwc END DO END DO - + + !---find highest model level where there is cloud + KTOP = KLEV !eehol: add as default (basically if no cloud so KTOP is assigned to lowest level) + DO JK=1,KLEV + IF ( ANY(ZAP(KIDIA:KFDIA,JK) >=0.001_JPRB) ) THEN !eehol: if cloud fraction is larger than threshold + KTOP = JK + EXIT + ENDIF + END DO + + ! Default values for effective radii + REFFL(KIDIA:KFDIA,1:KLEV,ZKROW) = 4._JPRB ! comes from liquid effective radius routine (PP_MIN_RE_UM) + REFFI(KIDIA:KFDIA,1:KLEV,ZKROW) = 80._JPRB*0.64952_JPRB ! comes from ice effective radius routine (ZDEFAULT_RE_UM) + ! Cloud activation scheme CLDACT: IF ( NCLOUDACT == 1 ) THEN ! Morales and Nenes @@ -1309,7 +1323,7 @@ SUBROUTINE HAMM7_INTERFACE( & CALL XT_CONV_MASSFIX(KFDIA, KLON, KLEV, KLEV+1, NTRAC, ZKROW, PRSF1, PRS1, ZXTTE, .TRUE., ZDUMMY) ! call convective mass conserving (init zxtte_old) - CALL WETDEP_INTERFACE(KFDIA, KLON, KLEV, 1, ZKROW, LSTRAT, & ! ktop = 1 (top level index), lstrat = FALSE for conv. case + CALL WETDEP_INTERFACE(KFDIA, KLON, KLEV, KTOP, ZKROW, LSTRAT, & ! ktop = cloud top level index, lstrat = FALSE for conv. case ZDPG, ZMRATEPR_COV, ZMRATEPS_COV, ZMSNOWACL, & ! dp/g, evap. of rain, subl. of snow, accr. rate of snow with cl. drop in-cl. ZLPU, ZIP, & ! cloud water content, cloud ice water content ZM6RP, ZM6DRY, & ! m7 aerosol: to replace rwet_m7, dry radius for soluble modes [cm] @@ -1357,7 +1371,7 @@ SUBROUTINE HAMM7_INTERFACE( & ZDUM3D(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB ! dummy updraft mass flux for strat. case LSTRAT = .TRUE. !True for strat case, large scale - CALL WETDEP_INTERFACE(KFDIA, KLON, KLEV, 1, ZKROW, LSTRAT, & ! ktop = 1 (top level index), lstrat = TRUE for strat. case + CALL WETDEP_INTERFACE(KFDIA, KLON, KLEV, KTOP, ZKROW, LSTRAT, & ! ktop = cloud top level index, lstrat = TRUE for strat. case ZDPG, ZMRATEPR_STR, ZMRATEPS_STR, ZMSNOWACL, & ! dp/g, evap. of rain, subl. of snow, accr. rate of snow with cl. drop in-cl. ZLP, ZIP, & ! cloud water content, cloud ice water content ZM6RP, ZM6DRY, & ! m7 aerosol: to replace rwet_m7, dry radius for soluble modes [cm] From 5fa4d942d50ea17f7f65efb857ba8817bf612f33 Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Wed, 6 Aug 2025 11:44:32 +0000 Subject: [PATCH 087/129] Pull request #44: Fix aerosols diagnostics and timing of aerosols optical properties computation Merge in ~NM6/openifs-48r1 from Fix-aerosols-diagnostics to knmi-m7 Squashed commit of the following: commit 3fc6c96449156f302ea704feed5d028d14e0abe7 Author: Philippe Le Sager Date: Wed Aug 6 13:40:50 2025 +0200 OIFS-611 fix timing of aerosols optical properties computation commit e80835d4e2a8c40466e9ff27cf4a4d21ed5d9e2e Author: Philippe Le Sager Date: Sun Jul 27 14:46:26 2025 +0200 Cleanup/fix aerosols output commit cfcb0bc46d1789f602d4c64dae869a77943952de Author: Philippe Le Sager Date: Sun Jul 27 11:16:20 2025 +0200 Add OIFS-M7 mapping info to IFS main log --- ifs-source/arpifs/m7/hamm7_init.F90 | 53 ++++- .../arpifs/m7/phys_ec/hamm7_interface.F90 | 209 +++++++++++------- 2 files changed, 180 insertions(+), 82 deletions(-) diff --git a/ifs-source/arpifs/m7/hamm7_init.F90 b/ifs-source/arpifs/m7/hamm7_init.F90 index 98bcee9a..3ed6c0af 100644 --- a/ifs-source/arpifs/m7/hamm7_init.F90 +++ b/ifs-source/arpifs/m7/hamm7_init.F90 @@ -51,7 +51,8 @@ SUBROUTINE hamm7_init(YGFL, YRRIP, CHEM_SCHEME) USE YOMHOOK, ONLY : LHOOK, DR_HOOK, JPHOOK USE YOMRIP, ONLY : TRIP USE YOM_YGFL, ONLY : TYPE_GFLD ! Gives type for YGFL -Use YOMMP0, ONLY : MYPROC +USE YOMMP0, ONLY : MYPROC +USE YOMLUN, ONLY : NULOUT ! --- M7 modules -------------------------------------------------------------- USE MO_TIME_CONTROL, ONLY: init_mo_time_control @@ -186,7 +187,7 @@ SUBROUTINE hamm7_init(YGFL, YRRIP, CHEM_SCHEME) ! tracer data stored in PCEN and PTENC in the HAM routines without ! having to copy the data into new fields. ! The naming conventions in IFS and HAM are somewhat different, so -! tracher naming is somewhat hard-coded. As a first instance to troubleshooting, +! tracer naming is somewhat hard-coded. As a first instance to troubleshooting, ! check the logfile 'fort.2001' in the run directory and see which tracers ! are not recognised by HAM. Then check the file ! AC-experiments/ctrl/Table/bins_hamm7ver1.csv and compare the names you get @@ -474,6 +475,54 @@ SUBROUTINE hamm7_init(YGFL, YRRIP, CHEM_SCHEME) CALL ABOR1(" hamm7_init: UNCOUPLED CHEMISTRY SCHEME "//TRIM(CHEM_SCHEME) ) END IF +! -- LOG +WRITE(NULOUT,'("====== HAMM7_INIT ===== ")') + +WRITE(NULOUT,'("Number of size classes:", I3)') znclass +WRITE(NULOUT,'(" class# / IFS id / HM7 id / IFSNAME / M7NAME ")') +DO J_CLASS = 1,NCLASS + WRITE(NULOUT,'(1x,I6,3x,I6,3x,I6,3x,A,2x,A)') & + & J_CLASS, & + & IND_OIFS_HAM%IND_CLASS_OIFS(J_CLASS), & + & IND_OIFS_HAM%IND_CLASS_HAM(J_CLASS), & + & TRIM(YAERO(IND_OIFS_HAM%IND_CLASS_OIFS(J_CLASS))%CNAME), & + & TRIM(trlist%ti(sizeclass(J_CLASS)%idt_no)%fullname) +ENDDO + +WRITE(NULOUT,'("Number of mass tracers:", I3)') znaerocomp +WRITE(NULOUT,'(" mass# / IFS id / HM7 id / IFSNAME / M7NAME ")') +DO J_MASS = 1,NAEROCOMP + WRITE(NULOUT,'(1x,I6,3x,I6,3x,I6,3x,A,2x,A)') & + & J_MASS, & + & IND_OIFS_HAM%IND_MASS_OIFS(J_MASS), & + & IND_OIFS_HAM%IND_MASS_HAM(J_MASS), & + & TRIM(YAERO(IND_OIFS_HAM%IND_MASS_OIFS(J_MASS))%CNAME), & + & TRIM(trlist%ti(aerocomp(J_MASS)%idt)%fullname) +ENDDO + +WRITE(NULOUT,'("Number of gas tracers:", I3)') zsubm_ngasspec +WRITE(NULOUT,'(" gas# / IFS id / HM7 id / IFSNAME / M7NAME ")') +DO J_GAS = 1,SUBM_NGASSPEC + J_SPEC = SUBM_GASSPEC(J_GAS) + WRITE(NULOUT,'(1x,I6,3x,I6,3x,I6,3x,A,2x,A)') & + & J_GAS, & + & IND_OIFS_HAM%IND_GAS_OIFS(J_GAS), & + & IND_OIFS_HAM%IND_GAS_HAM(J_GAS), & + & TRIM(YCHEM(IND_OIFS_HAM%IND_GAS_OIFS(J_GAS))%CNAME), & + & TRIM(TRLIST%TI(SPECLIST(J_SPEC)%IDT)%FULLNAME) +ENDDO + +WRITE(NULOUT,'("Number of cloud tracers:", I3)') zcloudind +WRITE(NULOUT,'(" cloud# / IFS id / HM7 id / IFSNAME / M7NAME ")') +DO J_CLOUD = IDT_CDNC,IDT_ICNC + WRITE(NULOUT,'(1x,I6,3x,I6,3x,I6,3x,A,2x,A)') & + & J_CLOUD-IDT_CDNC+1, & + & IND_OIFS_HAM%IND_CLOUD_OIFS(J_CLOUD-IDT_CDNC+1), & + & IND_OIFS_HAM%IND_CLOUD_HAM(J_CLOUD-IDT_CDNC+1), & + & TRIM(YAERO(IND_OIFS_HAM%IND_CLOUD_OIFS(J_CLOUD-IDT_CDNC+1))%CNAME), & + & TRIM(trlist%ti(IND_OIFS_HAM%IND_CLOUD_HAM(J_CLOUD-IDT_CDNC+1))%fullname) +ENDDO + IF (LLDEBUG .AND. MYPROC == 1) THEN WRITE(5001+MYPROC,*) 'HAM class idts =', ind_oifs_ham%ind_class_HAM(:) WRITE(5001+MYPROC,*) 'OIFS class idts =', ind_oifs_ham%ind_class_OIFS(:) diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index 020fb23a..703b8294 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -1726,7 +1726,7 @@ SUBROUTINE HAMM7_INTERFACE( & ZAER_SSA_DIAG(KIDIA:KFDIA,:,:) = 0.0_JPRB ZAER_ASYM_DIAG(KIDIA:KFDIA,:,:) = 0.0_JPRB -IF(MOD(NSTEP+1,NRADFR) == 0) THEN +IF(MOD(NSTEP,NRADFR) == 0) THEN CALL GSTATS(2506,0) ZAER_TAU(KIDIA:KFDIA,:,:,:) = 0.0_JPRB ZAER_SSA(KIDIA:KFDIA,:,:) = 0.0_JPRB @@ -1909,7 +1909,7 @@ SUBROUTINE HAMM7_INTERFACE( & !-- -!* 6.1 STORE IN AEROUT2-AEROUT4 +!* 6.1 STORE IN AEROUTs ! ------------------------------ !-- the total extinction coefficient at wavelengths ?? nm is archived in GFL%AEROUT @@ -1925,17 +1925,25 @@ SUBROUTINE HAMM7_INTERFACE( & ! LIFSMIN (T if running minimisation) and LIFSTRAJ (T if running high ! resolution trajectory integration) are both assimilation flags IF(.NOT.LIFSMIN .AND. .NOT.LIFSTRAJ) THEN - ! input for HAM-M7 - PGFL(KIDIA:KFDIA,1,YAEROUT(1)%MP)=PAOD(KIDIA:KFDIA,10) ! 533nm?? - PGFL(KIDIA:KFDIA,2,YAEROUT(1)%MP)=PSSA(KIDIA:KFDIA,10) ! 533nm - PGFL(KIDIA:KFDIA,3,YAEROUT(1)%MP)=PASY(KIDIA:KFDIA,10) ! 533nm - ! ASSUMPTION : YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG .LE. 7 - PGFL(KIDIA:KFDIA,4:YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG+3,YAEROUT(1)%MP)= ZAOD_DIAG(KIDIA:KFDIA,1:YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG) - PGFL(KIDIA:KFDIA,11:26,YAEROUT(1)%MP)= PAOD_LW(KIDIA:KFDIA,1:16) + !** YAEROUT(1) : RADIATIVE PROPERTIES + + ! AOD/SSA/ASY of one internal (short) wavelengths - 533 nm + PGFL(KIDIA:KFDIA,1,YAEROUT(1)%MP)=PAOD(KIDIA:KFDIA,10) + PGFL(KIDIA:KFDIA,2,YAEROUT(1)%MP)=PSSA(KIDIA:KFDIA,10) + PGFL(KIDIA:KFDIA,3,YAEROUT(1)%MP)=PASY(KIDIA:KFDIA,10) + + ! AOD of 14 internal (short) wavelengths + PGFL(KIDIA:KFDIA,4:17,YAEROUT(1)%MP)=PAOD(KIDIA:KFDIA,1:14) + + ! AOD of 16 internal (long) wavelengths + PGFL(KIDIA:KFDIA,18:33,YAEROUT(1)%MP)= PAOD_LW(KIDIA:KFDIA,1:16) - ! AOD of 14 short wavelengths stored in first 14 "levels/tracers" of YAEROUT(27)%MP - PGFL(KIDIA:KFDIA,1:14,YAEROUT(27)%MP)=PAOD(KIDIA:KFDIA,1:14) + ! AOD at selected (diagnostic) wavelengths + JK = YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG ! Should check (at setup, not here) that JK+33 <= KLEV + PGFL(KIDIA:KFDIA,34:JK+33,YAEROUT(1)%MP)= ZAOD_DIAG(KIDIA:KFDIA,1:YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG) + + !** YAEROUT(2) : DRY DEPOSITION DO JN=1,NAEROCOMP PGFL(KIDIA:KFDIA,ind_oifs_ham%ind_mass_OIFS(JN),YAEROUT(2)%MP)=ZDDEPFLUX(KIDIA:KFDIA,ind_oifs_ham%IND_mass_HAM(JN)) @@ -1943,58 +1951,39 @@ SUBROUTINE HAMM7_INTERFACE( & DO JN=1,NCLASS PGFL(KIDIA:KFDIA,ind_oifs_ham%ind_class_OIFS(JN),YAEROUT(2)%MP)=ZDDEPFLUX(KIDIA:KFDIA,ind_oifs_ham%IND_class_HAM(JN)) END DO + + !** YAEROUT(3) : COLUMN INTEGRATED WET-DEPOSITION + + DO JN=1,NACTAERO + PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(3)%MP) = WDEPOUT_2D(KIDIA:KFDIA,KAERO(JN)) + END DO + + !** YAEROUT(4) : SEDIMENTATION DO JN=1,NAEROCOMP PGFL(KIDIA:KFDIA,ind_oifs_ham%ind_mass_OIFS(JN),YAEROUT(4)%MP) = ZSEDIFLUXSURF(KIDIA:KFDIA,ind_oifs_ham%IND_mass_HAM(JN)) END DO DO JN=1,NCLASS - PGFL(KIDIA:KFDIA,ind_oifs_ham%ind_class_OIFS(JN),YAEROUT(4)%MP) = ZSEDIFLUXSURF(KIDIA:KFDIA,ind_oifs_ham%IND_class_HAM(JN)) + PGFL(KIDIA:KFDIA,ind_oifs_ham%ind_class_OIFS(JN),YAEROUT(4)%MP) = ZSEDIFLUXSURF(KIDIA:KFDIA,ind_oifs_ham%IND_class_HAM(JN)) END DO + !** YAEROUT(5) : NET AEROSOLS FLUXES (EMISSIONS - ???) ; level index of top of boundary layer ; boundary layer height + DO JN=1,NACTAERO - PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(3)%MP) = WDEPOUT_2D(KIDIA:KFDIA,KAERO(JN)) - PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(17)%MP) = WDEPOUT_IC_2D(KIDIA:KFDIA,KAERO(JN)) - PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(18)%MP) = WDEPOUT_BC_2D(KIDIA:KFDIA,KAERO(JN)) PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(5)%MP) = PAERSRC(KIDIA:KFDIA,KAERO(JN)) - PCFLX(KIDIA:KFDIA,KAERO(JN))* ZDPG(KIDIA:KFDIA,KLEV) END DO PGFL(KIDIA:KFDIA,NACTAERO+2,YAEROUT(5)%MP) = ZBLHIDX(KIDIA:KFDIA) PGFL(KIDIA:KFDIA,NACTAERO+3,YAEROUT(5)%MP) = PBLH(KIDIA:KFDIA) - - PGFL(KIDIA:KFDIA,NACTAERO+4,YAEROUT(5)%MP) = ((PGEOH(KIDIA:KFDIA,KLEV)-PGEOH(KIDIA:KFDIA,KLEV))*ZRG) - PGFL(KIDIA:KFDIA,NACTAERO+5,YAEROUT(5)%MP) = ((PGEOH(KIDIA:KFDIA,KLEV-1)-PGEOH(KIDIA:KFDIA,KLEV))*ZRG) - PGFL(KIDIA:KFDIA,NACTAERO+6,YAEROUT(5)%MP) = ((PGEOH(KIDIA:KFDIA,KLEV-2)-PGEOH(KIDIA:KFDIA,KLEV))*ZRG) - - DO JN=1,NACTAERO - ZTMP=0.0_JPRB - DO JK=1,KLEV - ZTMP(KIDIA:KFDIA)=ZTMP(KIDIA:KFDIA)+PCEN(KIDIA:KFDIA,JK,KAERO(JN)) - END DO - !PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(9)%MP) = ZTMP(KIDIA:KFDIA) - PGFL(KIDIA:KFDIA,KAERO(JN),YGFL%YAEROUT(9)%MP)= - PCFLX(KIDIA:KFDIA,KAERO(JN))* ZDPG(KIDIA:KFDIA,KLEV) - END DO - DO JN=1,NACTAERO - ZTMP=0.0_JPRB - DO JK=1,KLEV - ZTMP(KIDIA:KFDIA)=ZTMP(KIDIA:KFDIA)+ZCEN(KIDIA:KFDIA,JK,KAERO(JN)) - END DO - PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(10)%MP) = ZTMP(KIDIA:KFDIA) - END DO - - DO JN=1,NACTAERO - ZTMP=0.0_JPRB - DO JK=1,KLEV - ZTMP(KIDIA:KFDIA)=ZTMP(KIDIA:KFDIA)+PTENC(KIDIA:KFDIA,JK,KAERO(JN)) - END DO - PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(11)%MP) = ZTMP(KIDIA:KFDIA) - END DO - - ! mass and number concentration + !** YAEROUT(6) : -- + + !** YAEROUT(7) : Total column mass and number concentration + DO JN=1,NAEROCOMP JO=ind_oifs_ham%ind_mass_OIFS(JN) ! JO -> index context OIFS JH=ind_oifs_ham%IND_mass_HAM(JN) ! JH -> index context HAM JY=YAEROUT(7)%MP - ZTMP=0.0_JPRB + ZTMP(KIDIA:KFDIA)=0.0_JPRB DO JK=1,KLEV ZTMP(KIDIA:KFDIA)= ZTMP(KIDIA:KFDIA) + (ZXTM1(KIDIA:KFDIA,JK,JH)+(ZXTTE(KIDIA:KFDIA,JK,JH)*TIME_STEP_LEN)) * ZDPG(KIDIA:KFDIA,JK) END DO @@ -2005,20 +1994,20 @@ SUBROUTINE HAMM7_INTERFACE( & JO=ind_oifs_ham%ind_class_OIFS(JN) ! JO -> index context OIFS JH=ind_oifs_ham%IND_class_HAM(JN) ! JH -> index context HAM JY=YAEROUT(7)%MP - ZTMP=0.0_JPRB + ZTMP(KIDIA:KFDIA)=0.0_JPRB DO JK=1,KLEV ZTMP(KIDIA:KFDIA) = ZTMP(KIDIA:KFDIA) + (ZXTM1(KIDIA:KFDIA,JK,JH)+(ZXTTE(KIDIA:KFDIA,JK,JH)*TIME_STEP_LEN)) * ZDPG(KIDIA:KFDIA,JK) END DO PGFL(KIDIA:KFDIA,JO,JY) = ZTMP(KIDIA:KFDIA) END DO - - ! mass and number tendency + + !** YAEROUT(8) : mass and number tendency ! kg/kg -> kg/m2 N/kg-> N/m2 DO JN=1,NAEROCOMP !ntrac!NACTAERO JO=ind_oifs_ham%ind_mass_OIFS(JN) ! JO -> index context OIFS JH=ind_oifs_ham%IND_mass_HAM(JN) ! JH -> index context HAM JY=YAEROUT(8)%MP - ZTMP=0.0_JPRB + ZTMP(KIDIA:KFDIA)=0.0_JPRB DO JK=1,KLEV ZTMP(KIDIA:KFDIA) = ZTMP(KIDIA:KFDIA) + ZXTTE(KIDIA:KFDIA,JK,JH) END DO @@ -2029,19 +2018,50 @@ SUBROUTINE HAMM7_INTERFACE( & JO=ind_oifs_ham%ind_class_OIFS(JN) ! JO -> index context OIFS JH=ind_oifs_ham%IND_class_HAM(JN) ! JH -> index context HAM JY=YAEROUT(8)%MP - ZTMP=0.0_JPRB + ZTMP(KIDIA:KFDIA)=0.0_JPRB DO JK=1,KLEV ZTMP(KIDIA:KFDIA) = ZTMP(KIDIA:KFDIA) + ZXTTE(KIDIA:KFDIA,JK,JH) END DO PGFL(KIDIA:KFDIA,JO,JY) = ZTMP(KIDIA:KFDIA) END DO - ! mass and number mixing ratio at surface + !** YAEROUT(9) : Surface fluxes of tracers (not emissions) + + DO JN=1,NACTAERO + !ZTMP(KIDIA:KFDIA)=0.0_JPRB + !DO JK=1,KLEV + ! ZTMP(KIDIA:KFDIA)=ZTMP(KIDIA:KFDIA)+PCEN(KIDIA:KFDIA,JK,KAERO(JN)) + !END DO + !PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(9)%MP) = ZTMP(KIDIA:KFDIA) + PGFL(KIDIA:KFDIA,KAERO(JN),YGFL%YAEROUT(9)%MP)= - PCFLX(KIDIA:KFDIA,KAERO(JN))* ZDPG(KIDIA:KFDIA,KLEV) + END DO + + !** YAEROUT(10) : Total column tracer/number PREVIOUS (before call to M7) concentration + + DO JN=1,NACTAERO + ZTMP(KIDIA:KFDIA)=0.0_JPRB + DO JK=1,KLEV + ZTMP(KIDIA:KFDIA)=ZTMP(KIDIA:KFDIA)+ZCEN(KIDIA:KFDIA,JK,KAERO(JN)) + END DO + PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(10)%MP) = ZTMP(KIDIA:KFDIA) + END DO + + !** YAEROUT(11) : Total column UPDATED TENDENCIES tracer + + DO JN=1,NACTAERO + ZTMP(KIDIA:KFDIA)=0.0_JPRB + DO JK=1,KLEV + ZTMP(KIDIA:KFDIA)=ZTMP(KIDIA:KFDIA)+PTENC(KIDIA:KFDIA,JK,KAERO(JN)) + END DO + PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(11)%MP) = ZTMP(KIDIA:KFDIA) + END DO + + !** YAEROUT(12) : M7 mass and number mixing ratio at surface + DO JN=1,NAEROCOMP !ntrac!NACTAERO JO=ind_oifs_ham%ind_mass_OIFS(JN) ! JO -> index context OIFS JH=ind_oifs_ham%IND_mass_HAM(JN) ! JH -> index context HAM JY=YAEROUT(12)%MP - ZTMP=0.0_JPRB ZTMP(KIDIA:KFDIA)= ZXTM1(KIDIA:KFDIA,KLEV,JH)+(ZXTTE(KIDIA:KFDIA,KLEV,JH)*TIME_STEP_LEN)!*ZDPG(KIDIA:KFDIA,KLEV) PGFL(KIDIA:KFDIA,JO,JY) = ZTMP(KIDIA:KFDIA) END DO @@ -2050,49 +2070,78 @@ SUBROUTINE HAMM7_INTERFACE( & JO=ind_oifs_ham%ind_class_OIFS(JN) ! JO -> index context OIFS JH=ind_oifs_ham%IND_class_HAM(JN) ! JH -> index context HAM JY=YAEROUT(12)%MP - ZTMP=0.0_JPRB ZTMP(KIDIA:KFDIA) = ZXTM1(KIDIA:KFDIA,KLEV,JH)+(ZXTTE(KIDIA:KFDIA,KLEV,JH)*TIME_STEP_LEN)!*PRHO(KIDIA:KFDIA,KLEV) PGFL(KIDIA:KFDIA,JO,JY) = ZTMP(KIDIA:KFDIA) END DO + !** YAEROUT(13) : -- + !** YAEROUT(14) : -- + !** YAEROUT(15) : -- + !** YAEROUT(16) : -- + + !** YAEROUT(17-18) : IN-CLOUD & BELOW CLOUD WET DEPOSITION + + DO JN=1,NACTAERO + PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(17)%MP) = WDEPOUT_IC_2D(KIDIA:KFDIA,KAERO(JN)) + PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(18)%MP) = WDEPOUT_BC_2D(KIDIA:KFDIA,KAERO(JN)) + END DO + + !** YAEROUT(19-20) : + PGFL(KIDIA:KFDIA,KLEV,YAEROUT(19)%MP) = ZXTTE(KIDIA:KFDIA,KLEV,3) ! tendency SS CS ham after update surface PGFL(KIDIA:KFDIA,KLEV-1,YAEROUT(20)%MP) = ZTENCIH(KIDIA:KFDIA,KLEV,17) ! tendency SS CS ham before update surface + + !** YAEROUT(21) : height of each level top + DO JK=1,KLEV - ! height of level from the surface. - PGFL(KIDIA:KFDIA,JK,YAEROUT(21)%MP) = (PGEOH(KIDIA:KFDIA,JK)-PGEOH(KIDIA:KFDIA,KLEV))*ZRG + PGFL(KIDIA:KFDIA,JK,YAEROUT(21)%MP) = (PGEOH(KIDIA:KFDIA,JK-1)-PGEOH(KIDIA:KFDIA,KLEV))*ZRG END DO - PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(22)%MP) = ZOUT_dnuc(KIDIA:KFDIA,1:KLEV,1) - PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(23)%MP) = ZOUT_dnuc(KIDIA:KFDIA,1:KLEV,2) - PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(24)%MP) = ZOUT_dnuc(KIDIA:KFDIA,1:KLEV,3) - PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(25)%MP) = ZOUT_dnuc(KIDIA:KFDIA,1:KLEV,4) - PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(26)%MP) = ZOUT_dnuc(KIDIA:KFDIA,1:KLEV,5) + + !** YAEROUT(22-26) : Nucleation diagnostics + + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(22)%MP) = ZOUT_dnuc(KIDIA:KFDIA,1:KLEV,1) ! NS-mass production kg/s from nucleatiom (limited by amount of SO4) + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(23)%MP) = ZOUT_dnuc(KIDIA:KFDIA,1:KLEV,2) ! NS-number production rate #/s from nucleatiom (limited by amount of SO4 vs original #/s) + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(24)%MP) = ZOUT_dnuc(KIDIA:KFDIA,1:KLEV,3) ! original #/s from H2SO4/H2O nucleatiom + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(25)%MP) = ZOUT_dnuc(KIDIA:KFDIA,1:KLEV,4) ! original #/s from organic nucleatiom + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(26)%MP) = ZOUT_dnuc(KIDIA:KFDIA,1:KLEV,5) ! original #/s sum from organic and vehkamäki nucleation schemes + !** YAEROUT(27) : M7 GAS MIXING RATIOS at SURFACE - ! It is not clear when NACTERO and when NTRAC - DO JN=1,NACTAERO - PGFL(KIDIA:KFDIA, JN, YAEROUT(22)%MP) = DDEPOUT(KIDIA:KFDIA,KLEV,KAERO(JN)) - PGFL(KIDIA:KFDIA, JN, YAEROUT(27)%MP) = PAERSRC(KIDIA:KFDIA,KAERO(JN)) ! Emissions per specie - END DO - DO JN=1,NTRAC - !PGFL(KIDIA:KFDIA,JN,YAEROUT(23)%MP)=WDEPOUT(KIDIA:KFDIA,KLEV,JN) - !PGFL(KIDIA:KFDIA,JN,YAEROUT(24)%MP)=SEDOUT(KIDIA:KFDIA,KLEV,JN) - PGFL(KIDIA:KFDIA,JN,YAEROUT(39)%MP)=ZXTEMS(KIDIA:KFDIA,JN) - END DO DO JN=1,SUBM_NGASSPEC - PGFL(KIDIA:KFDIA,JN,YAEROUT(25)%MP)=zxtm1(KIDIA:KFDIA,KLEV,ind_oifs_ham%ind_gas_HAM(JN)) + PGFL(KIDIA:KFDIA,JN,YAEROUT(27)%MP)=zxtm1(KIDIA:KFDIA,KLEV,ind_oifs_ham%ind_gas_HAM(JN)) END DO - !PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(26)%MP)=ZSEDIFLUX(KIDIA:KFDIA,1:KLEV,25) + !** YAEROUT(28) : EMISSIONS + + DO JN=1,NACTAERO + PGFL(KIDIA:KFDIA, JN, YAEROUT(28)%MP) = PAERSRC(KIDIA:KFDIA,KAERO(JN)) + END DO - DO JGAS=1,SUBM_NGASSPEC - !ZXTM1(JL,JK,ind_oifs_ham%ind_gas_HAM(JGAS)) = MAX(0._JPRB,ZCEN(JL,JK,KCHEM(ind_oifs_ham%ind_gas_OIFS(JGAS)))) !eehol: remove negative values - PGFL(KIDIA:KFDIA,JGAS,YAEROUT(28+JGAS)%MP)=ZCEN(JL,JK,KCHEM(ind_oifs_ham%ind_gas_OIFS(JGAS))) - PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(29+JGAS)%MP)= PTENC(KIDIA:KFDIA,1:KLEV,KCHEM(ind_oifs_ham%ind_gas_OIFS(JGAS))) + !** YAEROUT(29) : SURFACE EMISSIONS MODIFIED BY DRY DEPOSITION + + DO JN=1,NTRAC + PGFL(KIDIA:KFDIA,JN,YAEROUT(39)%MP)=ZXTEMS(KIDIA:KFDIA,JN) END DO - DO IMODE=1,NMOD - PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(30+IMODE)%MP)=RW_MODE(IMODE)%d2(KIDIA:KFDIA,1:KLEV) ! m - ENDDO + !** YAEROUT(30) : -- + !** YAEROUT(31) : -- + !** YAEROUT(32) : -- + !** YAEROUT(33) : -- + !** YAEROUT(34) : -- + !** YAEROUT(35) : -- + !** YAEROUT(36) : -- + !** YAEROUT(37) : -- + !** YAEROUT(38) : -- + !** YAEROUT(39) : -- + +!Commented because of overlap DO JGAS=1,SUBM_NGASSPEC +!Commented because of overlap !!! BUG: JL? JK? !!! PGFL(KIDIA:KFDIA,JGAS,YAEROUT(28+JGAS)%MP)=ZCEN(JL,JK,KCHEM(ind_oifs_ham%ind_gas_OIFS(JGAS))) +!Commented because of overlap PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(29+JGAS)%MP)= PTENC(KIDIA:KFDIA,1:KLEV,KCHEM(ind_oifs_ham%ind_gas_OIFS(JGAS))) +!Commented because of overlap END DO +!Commented because of overlap +!Commented because of overlap DO IMODE=1,NMOD +!Commented because of overlap PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(30+IMODE)%MP)=RW_MODE(IMODE)%d2(KIDIA:KFDIA,1:KLEV) ! m +!Commented because of overlap ENDDO !IF (TRIM(CHEM_SCHEME)=="SimChem")THEN ! PGFL(KIDIA:KFDIA,KLEV,YAEROUT(40)%MP) = ZFSO2(KIDIA:KFDIA) ! tendency SS CS ham after update surface From b1a5634baa0f1e0439113f218a1d88d48ab5803c Mon Sep 17 00:00:00 2001 From: Lianghai Wu Date: Tue, 2 Sep 2025 11:41:59 +0000 Subject: [PATCH 088/129] Pull request #46: OIFS-612 constrain pmfu and fix inconsistent dims Merge in ~NM6/openifs-48r1 from bugfix/OIFS-612 to knmi-m7 Squashed commit of the following: commit 1009595b9a57bd6dd91086387e2a0ebbe8995a17 Author: Lianghai Wu Date: Fri Aug 29 08:07:07 2025 +0000 OIFS-612 constrain pmfu and fix inconsistent dims --- .../arpifs/m7/phys_ec/hamm7_interface.F90 | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index 703b8294..e4cf317d 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -381,10 +381,13 @@ SUBROUTINE HAMM7_INTERFACE( & REAL(KIND=JPRB) :: ZMSNOWACL(KLON,KLEV) !accretion rate of snow with cloud droplets in cloudy part REAL(KIND=JPRB) :: ZFLXR, ZFLXS, ZFLXRB, ZFLXSB !variables to calculate rain and snow evap/formation + +REAL(KIND=JPRB) :: ZFPLCL(KLON,KLEV),ZFPLCN(KLON,KLEV),ZFPLSL(KLON,KLEV),ZFPLSN(KLON,KLEV) REAL(KIND=JPRB) :: ZLP(KLON,KLEV) !temporary variable for cloud water content REAL(KIND=JPRB) :: ZIP(KLON,KLEV) !temporary variable for cloud ice water content REAL(KIND=JPRB) :: ZLPU(KLON,KLEV) !temporary variable for cloud water content REAL(KIND=JPRB) :: ZIPDUM(KLON,KLEV) !temporary variable for cloud ice water content +REAL(KIND=JPRB) :: ZMFU(KLON,KLEV) ! temporary variable for constraing Conv. mass flux up ! variables for ICNC calculations REAL(KIND=JPRB) :: ZICNC(KLON,KLEV) ! ice crystal number concentration [#/cm3] ! added here variables for dry deposition and sedimentation @@ -1282,6 +1285,11 @@ SUBROUTINE HAMM7_INTERFACE( & END DO END DO + ZFPLCL(KIDIA:KFDIA,1:KLEV) = 0.5_JPRB*(PFPLCL(KIDIA:KFDIA,0:KLEV-1)+PFPLCL(KIDIA:KFDIA,1:KLEV)) + ZFPLCN(KIDIA:KFDIA,1:KLEV) = 0.5_JPRB*(PFPLCN(KIDIA:KFDIA,0:KLEV-1)+PFPLCN(KIDIA:KFDIA,1:KLEV)) + ZFPLSL(KIDIA:KFDIA,1:KLEV) = 0.5_JPRB*(PFPLSL(KIDIA:KFDIA,0:KLEV-1)+PFPLSL(KIDIA:KFDIA,1:KLEV)) + ZFPLSN(KIDIA:KFDIA,1:KLEV) = 0.5_JPRB*(PFPLSN(KIDIA:KFDIA,0:KLEV-1)+PFPLSN(KIDIA:KFDIA,1:KLEV)) + ZMSNOWACL(KIDIA:KFDIA,1:KLEV) = PSP(KIDIA:KFDIA,1:KLEV) !? ZLFRAC_SO2(KIDIA:KFDIA,:) = 0._JPRB ! zlfrac_so2 only needed in gas scavenging and this is off for now (put this zero) @@ -1322,17 +1330,18 @@ SUBROUTINE HAMM7_INTERFACE( & IF (.NOT. LSTRAT) THEN CALL XT_CONV_MASSFIX(KFDIA, KLON, KLEV, KLEV+1, NTRAC, ZKROW, PRSF1, PRS1, ZXTTE, .TRUE., ZDUMMY) ! call convective mass conserving (init zxtte_old) + ZMFU(KIDIA:KFDIA,1:KLEV) = min(PMFU(KIDIA:KFDIA,1:KLEV),ZDPG(KIDIA:KFDIA,1:KLEV)/TIME_STEP_LEN)!constraing Conv. mass flux up CALL WETDEP_INTERFACE(KFDIA, KLON, KLEV, KTOP, ZKROW, LSTRAT, & ! ktop = cloud top level index, lstrat = FALSE for conv. case ZDPG, ZMRATEPR_COV, ZMRATEPS_COV, ZMSNOWACL, & ! dp/g, evap. of rain, subl. of snow, accr. rate of snow with cl. drop in-cl. - ZLPU, ZIP, & ! cloud water content, cloud ice water content + ZLPU, ZIPDUM, & ! cloud water content, cloud ice water content ZM6RP, ZM6DRY, & ! m7 aerosol: to replace rwet_m7, dry radius for soluble modes [cm] REFFI, REFFL, & ! effective radii ZCDNCACT, ZFRACN, & ! number/fraction of activated particles per mode PTP, ZXTM1, ZLFRAC_SO2, & ! temperature, prev. mixing ratio, zlfrac_so2 only needed in gas scavenging (0 for now) ZXTTE, ZXTP10, ZXTP1C, & ! tendencies/mixing ratios (in/out) - PFPLCL, PFPLCN, ZFEVAPR_cov, ZFSUBLS_cov, & ! rain flux, snow flux, - PMFU, ZFUXT3D, & ! conv flux, updraft mass flux (updated in wetdep) + ZFPLCL, ZFPLCN, ZFEVAPR_cov, ZFSUBLS_cov, & ! rain flux, snow flux, + ZMFU, ZFUXT3D, & ! conv flux, updraft mass flux (updated in wetdep) ZAP, ZDUM2D, ZRHO, ZDUMMY, ZWDEP_SCAV_IC, ZWDEP_SCAV_BC) ! cloud frac., precip. frac., air dens., in/output*3 CALL XT_CONV_MASSFIX(KFDIA, KLON, KLEV, KLEV+1, NTRAC, ZKROW, PRSF1, PRS1, ZXTTE, .FALSE., ZDUMMY) ! call convective mass conserving @@ -1379,7 +1388,7 @@ SUBROUTINE HAMM7_INTERFACE( & ZCDNCACT, ZFRACN, & ! number/fraction of activated particles per mode PTP, ZXTM1, ZLFRAC_SO2, & ! temperature, prev. mixing ratio, zlfrac_so2 only needed in gas scavenging (0 for now) ZXTTE, ZXTP10, ZXTP1C, & ! tendencies/mixing ratios (in/out) - PFPLSL, PFPLSN, ZFEVAPR_str, ZFSUBLS_str, & ! rain flux, snow flux, + ZFPLSL, ZFPLSN, ZFEVAPR_str, ZFSUBLS_str, & ! rain flux, snow flux, ZDUM2D, ZDUM3D, & ! zeroes as these are not needed in strat. case ZAP, PCOVPTOT, ZRHO, ZDUMMY, ZWDEP_SCAV_IC, ZWDEP_SCAV_BC) ! cloud frac., precip. frac., air dens., in/output*3 From 8f48af1a2d8092548499eb6581352117e833a88e Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Wed, 3 Sep 2025 09:16:42 +0000 Subject: [PATCH 089/129] Pull request #47: Disentangle reading of emissions and SO2 oxidants Merge in ~NM6/openifs-48r1 from bugfix/OIFS-619 to knmi-m7 Squashed commit of the following: commit 918a991f1aefb3d65c1c8ea9c6ebd64ce593ff96 Author: Philippe Le Sager Date: Wed Sep 3 11:15:40 2025 +0200 Revert uneeded radintg changes commit 571e905ab28e0c4701706f971d71d8bef2a4fe68 Author: Philippe Le Sager Date: Wed Sep 3 10:30:07 2025 +0200 Fix entangled reading of emissions and SO2 oxidants commit 66bc770b53f3af67a38428b0f2cb97ca77ced01c Author: Philippe Le Sager Date: Wed Sep 3 10:05:38 2025 +0200 Allow compo_apply_emissions_layer.F90 to pass check-bound test commit fb85c55c3bc5e3aa0c5493005905be09c179db4c Author: Philippe Le Sager Date: Wed Sep 3 09:27:05 2025 +0200 Ensure that LMCCIEC_COMPO is hardcoded and not set by user (revert dbb6b7ea984) --- ifs-source/arpifs/climate/updclie_aerclim.F90 | 137 ++++++++---------- ifs-source/arpifs/module/yommcc.F90 | 90 ++++++------ ifs-source/arpifs/namelist/nammcc.nam.h | 2 +- .../phys_ec/compo_apply_emissions_layer.F90 | 20 +++ ifs-source/arpifs/setup/sumcc.F90 | 4 +- ifs-source/arpifs/setup/sumcclag.F90 | 24 ++- ifs-source/arpifs/utility/updtim.F90 | 4 +- 7 files changed, 140 insertions(+), 141 deletions(-) diff --git a/ifs-source/arpifs/climate/updclie_aerclim.F90 b/ifs-source/arpifs/climate/updclie_aerclim.F90 index 631a0a08..f7e0d10e 100644 --- a/ifs-source/arpifs/climate/updclie_aerclim.F90 +++ b/ifs-source/arpifs/climate/updclie_aerclim.F90 @@ -1,4 +1,4 @@ -SUBROUTINE UPDCLIE_AERCLIM(YDGEOMETRY,YDDYNA,YDCOMPO, YDMCC, YDGFL, YDML_GCONF,PTSTEP) +SUBROUTINE UPDCLIE_AERCLIM(YDGEOMETRY, YDDYNA, YDMCC, YDGFL, YDML_GCONF, PTSTEP) !**** *UPDCLIE_AERCLIM* @@ -21,8 +21,8 @@ SUBROUTINE UPDCLIE_AERCLIM(YDGEOMETRY,YDDYNA,YDCOMPO, YDMCC, YDGFL, YDML_GCONF,P ! METHOD. ! ------- -! Reads the time-varying 3D fields for composition. -! Uses time interpolation if LMCCIEC_AERCLIM=true, +! Reads the time-varying 3D fields for SO2 oxidants (OH, H2O2, O3) a/k/a "aerosol climatology" +! Uses time interpolation if LMCCIEC_AERCLIM=true, ! otherwise the most recent fields are used. ! EXTERNALS. @@ -40,21 +40,17 @@ SUBROUTINE UPDCLIE_AERCLIM(YDGEOMETRY,YDDYNA,YDCOMPO, YDMCC, YDGFL, YDML_GCONF,P USE MODEL_GENERAL_CONF_MOD , ONLY : MODEL_GENERAL_CONF_TYPE USE GEOMETRY_MOD , ONLY : GEOMETRY -! USE SURFACE_FIELDS_MIX , ONLY : TSURF USE YOMGFL , ONLY : TGFL -USE YOM_YGFL , ONLY : YGFL USE PARKIND1 , ONLY : JPIM, JPRB, JPRD -USE YOMHOOK , ONLY : LHOOK, DR_HOOK,JPHOOK +USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK USE YOERAD , ONLY : YRERAD USE YOMCST , ONLY : RDAY -USE YOMCT0 , ONLY : CNMEXP!, LTWOTL +USE YOMCT0 , ONLY : CNMEXP USE YOMLUN , ONLY : NULOUT, NULERR USE YOMMCC , ONLY : TMCC USE YOMMP0 , ONLY : MYPROC -!USE YOMRIP , ONLY : YRRIP USE YOMRIP0 , ONLY : NINDAT USE YOM_YGFL , ONLY : YGFL -USE YOMCOMPO , ONLY : TCOMPO USE YOMDYNA , ONLY : TDYNA USE MPL_MODULE, ONLY : MPL_BROADCAST, MPL_BARRIER USE DISGRID_MOD, ONLY : DISGRID_SEND, DISGRID_RECV @@ -67,7 +63,6 @@ SUBROUTINE UPDCLIE_AERCLIM(YDGEOMETRY,YDDYNA,YDCOMPO, YDMCC, YDGFL, YDML_GCONF,P TYPE(GEOMETRY) ,INTENT(IN) :: YDGEOMETRY TYPE(TDYNA) ,INTENT(IN) :: YDDYNA TYPE(TMCC) ,INTENT(INOUT) :: YDMCC -TYPE(TCOMPO) ,INTENT(INOUT) :: YDCOMPO TYPE(MODEL_GENERAL_CONF_TYPE),INTENT(INOUT):: YDML_GCONF TYPE(TGFL) ,INTENT(INOUT) :: YDGFL REAL(KIND=JPRB) ,INTENT(IN) :: PTSTEP @@ -94,7 +89,7 @@ SUBROUTINE UPDCLIE_AERCLIM(YDGEOMETRY,YDDYNA,YDCOMPO, YDMCC, YDGFL, YDML_GCONF,P & JM, JROF, JSTGLO, JTIM, JY, ISECND LOGICAL :: LLFIRST, LLFOUND, LLREAD -INTEGER(KIND=JPIM),SAVE :: IDATEREF=0, IUNITCOMPO +INTEGER(KIND=JPIM), SAVE :: IDATEREF=0, IUNITAERCLIM INTEGER(KIND=JPIM) :: IDATE, IBITMAP, IYSDMP,ILEVEL REAL(KIND=JPRB) :: ZPOID1, ZPOID2 @@ -108,15 +103,11 @@ SUBROUTINE UPDCLIE_AERCLIM(YDGEOMETRY,YDDYNA,YDCOMPO, YDMCC, YDGFL, YDML_GCONF,P #include "fcttim.func.h" -! ------------------------------------------------------------------ - -DATA LLFIRST /.TRUE./ - ! ------------------------------------------------------------------ IF (LHOOK) CALL DR_HOOK('UPDCLIE_AERCLIM',0,ZHOOK_HANDLE) -ASSOCIATE(YDDIM=>YDGEOMETRY%YRDIM,YDDIMV=>YDGEOMETRY%YRDIMV,YDGEM=>YDGEOMETRY%YRGEM, YDMP=>YDGEOMETRY%YRMP,YDRIP=>YDML_GCONF%YRRIP,YGFL=>YDML_GCONF%YGFL ) -!ASSOCIATE(NACTAERO=>YGFL%NACTAERO, NCHEM=>YGFL%NCHEM, YCHEM=>YGFL%YCHEM, NGHG=>YGFL%NGHG,LINJ=>YRCOMPO%LINJ, & +!ASSOCIATE(YDDIM=>YDGEOMETRY%YRDIM,YDDIMV=>YDGEOMETRY%YRDIMV,YDGEM=>YDGEOMETRY%YRGEM, YDMP=>YDGEOMETRY%YRMP,YDRIP=>YDML_GCONF%YRRIP,YGFL=>YDML_GCONF%YGFL ) +ASSOCIATE(YDDIM=>YDGEOMETRY%YRDIM,YDDIMV=>YDGEOMETRY%YRDIMV,YDGEM=>YDGEOMETRY%YRGEM, YDMP=>YDGEOMETRY%YRMP,YDRIP=>YDML_GCONF%YRRIP) ASSOCIATE(NDGLG=>YDDIM%NDGLG, NDGNH=>YDDIM%NDGNH, NDLON=>YDDIM%NDLON, & & NPROMA=>YDDIM%NPROMA, & & LPERPET=>YRERAD%LPERPET, & @@ -124,14 +115,16 @@ SUBROUTINE UPDCLIE_AERCLIM(YDGEOMETRY,YDDYNA,YDCOMPO, YDMCC, YDGFL, YDML_GCONF,P & NLOENG=>YDGEM%NLOENG, & & CLIMRAER=>YDMCC%CLIMRAER, LMCCIEC_AERCLIM=>YDMCC%LMCCIEC_AERCLIM, & & NCLIGC_AERCLIM=>YDMCC%NCLIGC_AERCLIM, NAERCLIM=>YGFL%NAEROCLIM, & - & NDIFC_COMPO=>YDMCC%NDIFC_COMPO, NJDCR_COMPO=>YDMCC%NJDCR_COMPO,NYSDMP_AERCLIM=>YDMCC%NYSDMP_AERCLIM, & - & NPCOMPO_1=>YDMCC%NPCOMPO_1, NPCOMPO_2=>YDMCC%NPCOMPO_2, & - & NUNITCM=>YDMCC%NUNITCM, & + & NDIFC_AERCLIM=>YDMCC%NDIFC_AERCLIM, NJDCR_AERCLIM=>YDMCC%NJDCR_AERCLIM,NYSDMP_AERCLIM=>YDMCC%NYSDMP_AERCLIM, & + & NPAERCLIM_1=>YDMCC%NPAERCLIM_1, NPAERCLIM_2=>YDMCC%NPAERCLIM_2, & + & NUNITCAERCLIM=>YDMCC%NUNITCAERCLIM, & & NSTADD=>YDRIP%NSTADD, NSTOP=>YDRIP%NSTOP, & & NFLEVG=>YDDIMV%NFLEVG) ! ------------------------------------------------------------------ !* +LLFIRST = YDMCC%LFIRSTUPDAERCLIM +YDMCC%LFIRSTUPDAERCLIM=.FALSE. !* 1.1 Calendar @@ -162,11 +155,10 @@ SUBROUTINE UPDCLIE_AERCLIM(YDGEOMETRY,YDDYNA,YDCOMPO, YDMCC, YDGFL, YDML_GCONF,P ! ONLY PROCESSOR 1 SHOULD OPEN - ! CLNOMF='ICMCL'//CNMEXP(1:4)//'INIT_COMPO' CLNOMF='aeroclim.grib' WRITE(NULOUT,*) ' READ AER_CLIMATE FIELDS FROM GRIB ' WRITE(NULOUT,*) ' INITIAL DATA TO BE READ FROM FILE ',CLNOMF - CALL GRIB_OPEN_FILE(IUNITCOMPO,CLNOMF,'r',IRET) + CALL GRIB_OPEN_FILE(IUNITAERCLIM,CLNOMF,'r',IRET) IF(IRET /= GRIB_SUCCESS) THEN WRITE(NULERR,'(A,I2)')'UPDCLIE_AERCLIM: PROBLEM IN GRIB_OPEN_FILE, IRET=',IRET CALL ABOR1('UPDCLIE_AERCLIM: PROBLEM IN GRIB_OPEN_FILE') @@ -178,7 +170,7 @@ SUBROUTINE UPDCLIE_AERCLIM(YDGEOMETRY,YDDYNA,YDCOMPO, YDMCC, YDGFL, YDML_GCONF,P SCAN: DO JTIM=1,10000 DO JCL=1,NAERCLIM DO JLEV=1,NFLEVG - CALL GRIB_NEW_FROM_FILE(IUNITCOMPO,IGRIB,IRET) + CALL GRIB_NEW_FROM_FILE(IUNITAERCLIM,IGRIB,IRET) IF(IRET == GRIB_END_OF_FILE) THEN ITIM=JTIM-1 EXIT SCAN @@ -421,13 +413,13 @@ SUBROUTINE UPDCLIE_AERCLIM(YDGEOMETRY,YDDYNA,YDCOMPO, YDMCC, YDGFL, YDML_GCONF,P ENDIF ! Positions the file in the first field needed - CALL GRIB_CLOSE_FILE(IUNITCOMPO,IRET) + CALL GRIB_CLOSE_FILE(IUNITAERCLIM,IRET) IF( IRET /= GRIB_SUCCESS )THEN CALL ABOR1(' UPDCLIE_AERCLIM: ERROR ON GRIB_CLOSE_FILE') ENDIF - CALL GRIB_OPEN_FILE(IUNITCOMPO,CLNOMF,'r') + CALL GRIB_OPEN_FILE(IUNITAERCLIM,CLNOMF,'r') DO JTIM=1,10000*(NAERCLIM) - CALL GRIB_NEW_FROM_FILE(IUNITCOMPO,IGRIB,IRET) + CALL GRIB_NEW_FROM_FILE(IUNITAERCLIM,IGRIB,IRET) IF(IRET /= GRIB_SUCCESS) THEN WRITE(NULERR,'(A,I2)')'UPDCLIE_AERCLIM: PROBLEM IN GRIB_NEW_FROM_FILE, IRET=',IRET CALL ABOR1('UPDCLIE_AERCLIM: PROBLEM IN GRIB_NEW_FROM_FILE') @@ -444,7 +436,7 @@ SUBROUTINE UPDCLIE_AERCLIM(YDGEOMETRY,YDDYNA,YDCOMPO, YDMCC, YDGFL, YDML_GCONF,P IDM(1)=IDIF IDM(2)=IJDCR - IDM(3)=IUNITCOMPO + IDM(3)=IUNITAERCLIM ENDIF MYPROCIF ! Broadcast @@ -452,9 +444,9 @@ SUBROUTINE UPDCLIE_AERCLIM(YDGEOMETRY,YDDYNA,YDCOMPO, YDMCC, YDGFL, YDML_GCONF,P ITAG=19591214 CALL MPL_BROADCAST(IDM,KTAG=ITAG,KROOT=1,CDSTRING='UPDCLIE_AERCLIM') - NDIFC_COMPO=IDM(1) - NJDCR_COMPO=IDM(2) - NUNITCM=IDM(3) + NDIFC_AERCLIM=IDM(1) + NJDCR_AERCLIM=IDM(2) + NUNITCAERCLIM=IDM(3) ENDIF SCANIF @@ -488,29 +480,29 @@ SUBROUTINE UPDCLIE_AERCLIM(YDGEOMETRY,YDDYNA,YDCOMPO, YDMCC, YDGFL, YDML_GCONF,P ELSE IFIRST=1 IJUL=RJUDAT(IAN,IMOIS,IJOUR) - LLREAD=NJDCR_COMPO == IJUL + LLREAD=NJDCR_AERCLIM == IJUL ENDIF ENDIF - WRITE(NULOUT,*) 'UPDCLIME_AERCLIM IDATE INFO: ',IDATE,IDATEREF,LLREAD, NJDCR_COMPO,NDIFC_COMPO + WRITE(NULOUT,*) 'UPDCLIME_AERCLIM IDATE INFO: ',IDATE,IDATEREF,LLREAD, NJDCR_AERCLIM,NDIFC_AERCLIM !* 3.1 READ, DECODE AND SELECT THE FIELDS IF (LLREAD) THEN FIRST: DO JF=1,IFIRST IF (LMCCIEC_AERCLIM) THEN - NPCOMPO_1=3-NPCOMPO_1 - NPCOMPO_2=3-NPCOMPO_2 + NPAERCLIM_1=3-NPAERCLIM_1 + NPAERCLIM_2=3-NPAERCLIM_2 ELSE - NJDCR_COMPO=NJDCR_COMPO+NDIFC_COMPO - NPCOMPO_1=1 - NPCOMPO_2=1 + NJDCR_AERCLIM=NJDCR_AERCLIM+NDIFC_AERCLIM + NPAERCLIM_1=1 + NPAERCLIM_2=1 ENDIF READ: DO JCL=1,NAERCLIM IPARAM=NCLIGC_AERCLIM(JCL) IF (MYPROC == 1) THEN DO JLEV=1,NFLEVG IF (.NOT. (LLFIRST.AND.JF==1.AND.JCL==1.AND.JLEV==1)) THEN - CALL GRIB_NEW_FROM_FILE(IUNITCOMPO,IGRIB,IRET) + CALL GRIB_NEW_FROM_FILE(IUNITAERCLIM,IGRIB,IRET) IF(IRET /= GRIB_SUCCESS ) THEN WRITE(NULERR,'(A,I2)')'UPDCLIE_AERCLIM: PROBLEM IN GRIB_NEW_FROM_FILE, IRET=',IRET CALL ABOR1('UPDCLIE_AERCLIM: PROBLEM IN GRIB_NEW_FROM_INDEX') @@ -537,23 +529,21 @@ SUBROUTINE UPDCLIE_AERCLIM(YDGEOMETRY,YDDYNA,YDCOMPO, YDMCC, YDGFL, YDML_GCONF,P !! ! DEBUG INFO !! WRITE(NULERR,"(A,4I6)"),'SHAPE ZBUF_2D:',SHAPE(ZBUF_2D) - !! WRITE(NULERR,"(A,4I6)"),'SHAPE CLIMRAER:',SHAPE(CLIMRAER(:,1:NFLEVG,NPCOMPO_2,JCL)) + !! WRITE(NULERR,"(A,4I6)"),'SHAPE CLIMRAER:',SHAPE(CLIMRAER(:,1:NFLEVG,NPAERCLIM_2,JCL)) !! WRITE(NULERR,"(A,2I6)"),'other dims:',YDGEOMETRY%YRGEM%NGPTOTG, YDGEOMETRY%YRGEM%NGPTOT ! DM communications. IF (MYPROC == 1) THEN - CALL DISGRID_SEND(YDGEOMETRY,NFLEVG,ZBUF_2D,JCL,CLIMRAER(:,1:NFLEVG,NPCOMPO_2,JCL)) + CALL DISGRID_SEND(YDGEOMETRY,NFLEVG,ZBUF_2D,JCL,CLIMRAER(:,1:NFLEVG,NPAERCLIM_2,JCL)) ELSE - !CALL DISGRID_RECV(YDGEOMETRY%YRGEM,1,NFLEVG,CLIMRAER(:,1:NFLEVG,NPCOMPO_2,JCL),JCL) - CALL DISGRID_RECV(YDGEOMETRY,1,NFLEVG,CLIMRAER(:,1:NFLEVG,NPCOMPO_2,JCL),JCL) + CALL DISGRID_RECV(YDGEOMETRY,1,NFLEVG,CLIMRAER(:,1:NFLEVG,NPAERCLIM_2,JCL),JCL) ENDIF CALL MPL_BARRIER(CDSTRING='UPDCLIE_AERCLIM') - -! Synchronize IDATEREF + ! Synchronize IDATEREF ITAG=19591204 CALL MPL_BROADCAST(IDATEREF,KTAG=ITAG,KROOT=1,CDSTRING='UPDCLIE_AERCLIM') - ! ENDDO ! JLEV + ENDDO READ ENDDO FIRST ENDIF @@ -563,40 +553,37 @@ SUBROUTINE UPDCLIE_AERCLIM(YDGEOMETRY,YDDYNA,YDCOMPO, YDMCC, YDGFL, YDML_GCONF,P ZPOID2=1.0_JPRB-ZPOID1 ENDIF - -! Fill GFL array ! make openmp - DO IPARMAL=1,NAERCLIM - IYSDMP=NYSDMP_AERCLIM(IPARMAL) - IF (LMCCIEC_AERCLIM) THEN - DO JLEV=1,NFLEVG - DO JSTGLO=1,NGPTOT,NPROMA - IEND=MIN(NPROMA,NGPTOT-JSTGLO+1) - IST=1 - IBL=(JSTGLO-1)/NPROMA+1 - DO JROF =1,IEND - YDGFL%GFL(JROF,JLEV,IYSDMP,IBL)=CLIMRAER(JSTGLO+JROF-1,JLEV,NPCOMPO_1,IPARMAL)*ZPOID1 & - & +CLIMRAER(JSTGLO+JROF-1,JLEV,NPCOMPO_2,IPARMAL)*ZPOID2 - ENDDO - ENDDO + ! Fill GFL array + DO IPARMAL=1,NAERCLIM + IYSDMP=NYSDMP_AERCLIM(IPARMAL) + IF (LMCCIEC_AERCLIM) THEN + DO JLEV=1,NFLEVG + DO JSTGLO=1,NGPTOT,NPROMA + IEND=MIN(NPROMA,NGPTOT-JSTGLO+1) + IST=1 + IBL=(JSTGLO-1)/NPROMA+1 + DO JROF =1,IEND + YDGFL%GFL(JROF,JLEV,IYSDMP,IBL) = CLIMRAER(JSTGLO+JROF-1,JLEV,NPAERCLIM_1,IPARMAL)*ZPOID1 & + & +CLIMRAER(JSTGLO+JROF-1,JLEV,NPAERCLIM_2,IPARMAL)*ZPOID2 + ENDDO ENDDO - ELSE - DO JLEV=1,NFLEVG - DO JSTGLO=1,NGPTOT,NPROMA - IEND=MIN(NPROMA,NGPTOT-JSTGLO+1) - IST=1 - IBL=(JSTGLO-1)/NPROMA+1 - DO JROF =1,IEND - YDGFL%GFL(JROF,JLEV,IYSDMP,IBL)=CLIMRAER(JSTGLO+JROF-1,JLEV,NPCOMPO_2,IPARMAL) - ENDDO - ENDDO - ENDDO - ENDIF - ENDDO + ENDDO + ELSE + DO JLEV=1,NFLEVG + DO JSTGLO=1,NGPTOT,NPROMA + IEND=MIN(NPROMA,NGPTOT-JSTGLO+1) + IST=1 + IBL=(JSTGLO-1)/NPROMA+1 + DO JROF =1,IEND + YDGFL%GFL(JROF,JLEV,IYSDMP,IBL) = CLIMRAER(JSTGLO+JROF-1,JLEV,NPAERCLIM_2,IPARMAL) + ENDDO + ENDDO + ENDDO + ENDIF + ENDDO ENDIF READIF -LLFIRST=.FALSE. - WRITE(NULOUT,*) 'UPDCLIE_AERCLIM finished' CALL FLUSH(NULOUT) diff --git a/ifs-source/arpifs/module/yommcc.F90 b/ifs-source/arpifs/module/yommcc.F90 index fb5df51f..6c900035 100644 --- a/ifs-source/arpifs/module/yommcc.F90 +++ b/ifs-source/arpifs/module/yommcc.F90 @@ -82,55 +82,49 @@ MODULE YOMMCC ! = .F. ===> THEY ARE NOT INTERPOLATED ! LMCCICEIC= .T. ===> ICE INITIAL CONDITIONS SENT TO COUPLER AT STARTUP ! =.F ===> NO OUTPUT OF ICE -! LFIRSTUPD ===> TRUE UNTIL UPDCLIE HAS BEEN CALLED -! LFIRSTUPDCOMPO ===> TRUE UNTIL UPDCLIE_COMPO HAS BEEN CALLED + +! LFIRSTUPD ===> TRUE UNTIL UPDCLIE HAS BEEN CALLED +! LFIRSTUPDCOMPO ===> TRUE UNTIL UPDCLIE_COMPO HAS BEEN CALLED +! LFIRSTUPDAERCLIM ===> TRUE UNTIL UPDCLIE_AERCLIM HAS BEEN CALLED + ! NCLIMTOT ===> TOTAL NUMBER OF FIELDS TO BE UPDATED IN TIME ! NCLIMR ===> NUMBER OF UPDATING FIELDS TO BE READ FROM FILE (OTHERS COME FROM OASIS COUPLER) -! NCLIGC ===> GRIB CODES OF THE FIELDS TO BE TIME UPDATED -! NCLIAER ===> GRIB CODES OF CLIM.AEROSOL FIELDS TO BE TIME UPDATED -! NDIFC ===> DIFFERENCE, IN DAYS, BETWEEN CONSECUTIVE TIMES -! IN THE CLIMATE FILE (ONLY USED FOR LMCCIEC_COMPO=.FALSE.) -! NJDCR ===> JULIAN DAY OF THE NEXT FIELD TO BE READ -! IN THE CLIMATE FILE (ONLY USED FOR LMCCIEC_COMPO=.FALSE.) -! NJDCR1 ===> JULIAN DAY OF THE NEXT FIELD TO BE READ -! IN THE ICMBC FILE (ONLY USED FOR LMCCIEC_COMPO=.FALSE.) -! NDIFC_COMPO ===> DIFFERENCE, IN DAYS, BETWEEN CONSECUTIVE TIMES -! IN THE CLIMATE FILE (ONLY USED FOR LMCCIEC=.FALSE.) -! NJDCR_COMPO ===> JULIAN DAY OF THE NEXT FIELD TO BE READ -! IN THE CLIMATE FILE (ONLY USED FOR LMCCIEC=.FALSE.) -! NJDCR1_COMPO ===> JULIAN DAY OF THE NEXT FIELD TO BE READ -! IN THE ICMBC FILE (ONLY USED FOR LMCCIEC=.FALSE.) -! NP1 ===> INDEX FOR THE FIRST FILE IN TIME INTERPOLATION -! (ONLY USED FOR LMCCIEC=.TRUE.) -! NP2 ===> INDEX FOR THE SECOND FILE IN TIME INTERPOLATION -! (ONLY USED FOR LMCCIEC=.TRUE.) -! NPAER_1 ===> INDEX FOR THE FIRST FILE IN TIME INTERPOLATION -! (ONLY USED FOR LEAERDIU=.TRUE.) -! NPAER_2 ===> INDEX FOR THE SECOND FILE IN TIME INTERPOLATION -! (ONLY USED FOR LEAERDIU=.TRUE.) -! NPCOMPO_1 ===> INDEX FOR THE SECOND FILE IN TIME INTERPOLATION -! (ONLY USED FOR LMCC_COMPO =.TRUE.) ! naj -! NPCOMPO_2 ===> INDEX FOR THE FIRST FILE IN TIME INTERPOLATION -! (ONLY USED FOR LECO2DIU=.TRUE.) -! NPCO2_1 ===> INDEX FOR THE FIRST FILE IN TIME INTERPOLATION -! (ONLY USED FOR LECO2DIU=.TRUE.) -! NPCO2_2 ===> INDEX FOR THE SECOND FILE IN TIME INTERPOLATION -! (ONLY USED FOR LECO2DIU=.TRUE.) +! NCLIGC ===> GRIB CODES OF THE FIELDS TO BE TIME UPDATED FROM CLIMATE FILE +! NCLIGC_COMPO ===> GRIB CODES OF THE FIELDS TO BE TIME UPDATED FROM CLIMATE FILE FOR COMPO +! NCLIGC_AERCLIM ===> GRIB CODES OF THE FIELDS TO BE TIME UPDATED FROM CLIMATE FILE FOR AERCLIM (SO2 oxidants) +! NCLIAER ===> GRIB CODES OF CLIM.AEROSOL FIELDS TO BE TIME UPDATED (not the SO2 oxidants!) [UNUSED] + +! NDIFC ===> DIFFERENCE, IN DAYS, BETWEEN CONSECUTIVE TIMES IN THE CLIMATE FILE (ONLY USED FOR LMCCIEC=.FALSE.) +! NDIFC_COMPO ===> DIFFERENCE, IN DAYS, BETWEEN CONSECUTIVE TIMES IN THE CLIMATE FILE (ONLY USED FOR LMCCIEC_COMPO=.FALSE.) +! NDIFC_AERCLIM ===> DIFFERENCE, IN DAYS, BETWEEN CONSECUTIVE TIMES IN THE CLIMATE FILE (ONLY USED FOR LMCCIEC_AERCLIM=.FALSE.) + +! NJDCR ===> JULIAN DAY OF THE NEXT FIELD TO BE READ IN THE CLIMATE FILE (ONLY USED FOR LMCCIEC=.FALSE.) +! NJDCR1 ===> JULIAN DAY OF THE NEXT FIELD TO BE READ IN THE ICMBC FILE (ONLY USED FOR LMCCIEC=.FALSE.) +! NJDCR_COMPO ===> JULIAN DAY OF THE NEXT FIELD TO BE READ IN THE CLIMATE FILE (ONLY USED FOR LMCCIEC_COMPO=.FALSE.) +! NJDCR1_COMPO ===> JULIAN DAY OF THE NEXT FIELD TO BE READ IN THE ICMBC FILE (ONLY USED FOR LMCCIEC_COMPO=.FALSE.) [UNUSED] +! NJDCR_AERCLIM ===> JULIAN DAY OF THE NEXT FIELD TO BE READ IN THE CLIMATE FILE (ONLY USED FOR LMCCIEC_AERCLIM=.FALSE.) + +! NP1 ===> INDEX FOR THE FIRST FILE IN TIME INTERPOLATION (ONLY USED FOR LMCCIEC=.TRUE.) +! NP2 ===> INDEX FOR THE SECOND FILE IN TIME INTERPOLATION (ONLY USED FOR LMCCIEC=.TRUE.) +! NPAER_1 ===> INDEX FOR THE FIRST FILE IN TIME INTERPOLATION (ONLY USED FOR LEAERDIU=.TRUE.) +! NPAER_2 ===> INDEX FOR THE SECOND FILE IN TIME INTERPOLATION (ONLY USED FOR LEAERDIU=.TRUE.) +! NPCOMPO_1 ===> INDEX FOR THE FIRST FILE IN TIME INTERPOLATION (ONLY USED FOR LMCCIEC_COMPO=.TRUE., ELSE FIXED) +! NPCOMPO_2 ===> INDEX FOR THE SECOND FILE IN TIME INTERPOLATION (ONLY USED FOR LMCCIEC_COMPO=.TRUE., ELSE FIXED) +! NPAERCLIM_1 ===> INDEX FOR THE FIRST FILE IN TIME INTERPOLATION (ONLY USED FOR LMCCIEC_AERCLIM=.TRUE., ELSE FIXED) +! NPAERCLIM_2 ===> INDEX FOR THE SECOND FILE IN TIME INTERPOLATION (ONLY USED FOR LMCCIEC_AERCLIM=.TRUE., ELSE FIXED) +! NPCO2_1 ===> INDEX FOR THE FIRST FILE IN TIME INTERPOLATION (ONLY USED FOR LECO2DIU=.TRUE.) +! NPCO2_2 ===> INDEX FOR THE SECOND FILE IN TIME INTERPOLATION (ONLY USED FOR LECO2DIU=.TRUE.) ! NUNITC ===> PBOPEN UNIT FOR CLIMATE FILE ! NUNITCM ===> PBOPEN UNIT FOR CLIMATE FILE FOR COMPO +! NUNITCAERCLIM ===> PBOPEN UNIT FOR CLIMATE FILE FOR AERCLIM (SO2 oxidants) ! NUNITC1 ===> PBOPEN UNIT FOR OCEAN BIAS CORRECTION FILE -! CLIMR ===> HOLDS THE LAST CLIMATE FILES READ (ONLY USED FOR -! LMCCEC=.TRUE. .AND. LMCC04=.FALSE.) -! ZLAKE ===> HOLDS THE LAST LAKE FILES READ ( -! (ONLY USED FOR LEOCLAKE=.TRUE. ) -! OCEANBC ===> HOLDS THE LAST OCEAN BC FILES READ -! (ONLY USED FOR LMCCEC=.TRUE. .AND. LMCC04=.FALSE.) -! CLIMRAER ===> HOLDS THE LAST NBF AER FILES READ -! (ONLY USED FOR LEAERDIU=.TRUE.) -! CLIMRCOMPO ===> HOLDS THE LAST NBF COMPO FILES READ -! (ONLY USED FOR LMCC_COMPO =.TRUE.) ! naj -! CLIMRCO2 ===> HOLDS THE LAST NBF CO2 FILES READ -! (ONLY USED FOR LECO2DIU=.TRUE.) + +! CLIMR ===> HOLDS THE LAST CLIMATE FILES READ (ONLY USED FOR LMCCEC=.TRUE. .AND. LMCC04=.FALSE.) +! ZLAKE ===> HOLDS THE LAST LAKE FILES READ (ONLY USED FOR LEOCLAKE=.TRUE. ) +! OCEANBC ===> HOLDS THE LAST OCEAN BC FILES READ (ONLY USED FOR LMCCEC=.TRUE. .AND. LMCC04=.FALSE.) +! CLIMRAER ===> HOLDS THE LAST SO2-OXIDANTS FILES READ (ONLY USED FOR LMCC_COMPO =.TRUE. .AND. NSO4SCHEME == 2) +! CLIMRCOMPO ===> HOLDS THE LAST COMPO-EMISS FILES READ (ONLY USED FOR LMCC_COMPO =.TRUE.) +! CLIMRCO2 ===> HOLDS THE LAST NBF CO2 FILES READ (ONLY USED FOR LECO2DIU=.TRUE.) ! NFRCPL ===> COUPLING FREQUENCY ! NSSTICEOP ===> INDEX FOR SST TREATMENT IN POINTS CONTAINING SEA ICE ! @@ -159,23 +153,26 @@ MODULE YOMMCC ! To read prescribed oxidants for SO2-SO4 scheme INTEGER(KIND=JPIM) :: NCLIGC_AERCLIM(10) INTEGER(KIND=JPIM) :: NYSDMP_AERCLIM(10) - INTEGER(KIND=JPIM) :: NPAERCLIM_1,NPAERCLIM_2 INTEGER(KIND=JPIM) :: NCLIAER(16) INTEGER(KIND=JPIM) :: NDIFC INTEGER(KIND=JPIM) :: NJDCR INTEGER(KIND=JPIM) :: NJDCR1 INTEGER(KIND=JPIM) :: NDIFC_COMPO + INTEGER(KIND=JPIM) :: NDIFC_AERCLIM INTEGER(KIND=JPIM) :: NJDCR_COMPO INTEGER(KIND=JPIM) :: NJDCR1_COMPO + INTEGER(KIND=JPIM) :: NJDCR_AERCLIM INTEGER(KIND=JPIM) :: NP1 INTEGER(KIND=JPIM) :: NP2 INTEGER(KIND=JPIM) :: NPCO2_1, NPCO2_2 INTEGER(KIND=JPIM) :: NPAER_1, NPAER_2 INTEGER(KIND=JPIM) :: NPCOMPO_1, NPCOMPO_2 + INTEGER(KIND=JPIM) :: NPAERCLIM_1,NPAERCLIM_2 INTEGER(KIND=JPIM) :: NUNITC - INTEGER(KIND=JPIM) :: NUNITC1 INTEGER(KIND=JPIM) :: NUNITCM + INTEGER(KIND=JPIM) :: NUNITCAERCLIM + INTEGER(KIND=JPIM) :: NUNITC1 INTEGER(KIND=JPIM) :: NOACOMM INTEGER(KIND=JPIM) :: NSSTICEOP REAL(KIND=JPRB),ALLOCATABLE:: CLIMRCO2(:,:,:),CLIMRAER(:,:,:,:),CLIMRCOMPO(:,:,:),ZLAKE(:,:,:),OCEANBC(:,:) @@ -184,6 +181,7 @@ MODULE YOMMCC LOGICAL :: LFIRSTUPD = .TRUE. LOGICAL :: LFIRSTUPDCOMPO = .TRUE. + LOGICAL :: LFIRSTUPDAERCLIM = .TRUE. LOGICAL :: LCURR LOGICAL :: LGELATO LOGICAL :: LMCC01_MSE diff --git a/ifs-source/arpifs/namelist/nammcc.nam.h b/ifs-source/arpifs/namelist/nammcc.nam.h index a3de1ce7..82a063f7 100644 --- a/ifs-source/arpifs/namelist/nammcc.nam.h +++ b/ifs-source/arpifs/namelist/nammcc.nam.h @@ -14,7 +14,7 @@ NAMELIST/NAMMCC/& &LCURR,LGELATO,LMCC01_MSE,LMCC01,LMCC02,LMCC03,LMCC04,LMCC05,LMCCEC,LMCCIEC, & &LMCCICEIC,N923,NOACOMM,NFRCPL,LNEMOCOUP,LNEMOFLUXNC,LNEMO1WAY, & &LMCCDYNSEAICE,LNEMOLIMGET,LNEMOLIMPUT,LNEMOLIMALB,LNEMOLIMTEMP, & - &LNEMOLIMTHK,LMULTIYR,LMCC_COMPO,LMCCIEC_COMPO,LNEMOATMFLDS,LNEMOIFSLOG,NSSTICEOP,& + &LNEMOLIMTHK,LMULTIYR,LMCC_COMPO,LNEMOATMFLDS,LNEMOIFSLOG,NSSTICEOP,& &LNEMOSSTFREEZ,LNEMOLIMTLVL,LNEMOOCEICEMIX,LNEMOQNSICEFILT,LNEMOSICOUP,& &LNEMOGRIBFLDS,LNEMOPARTCOUP,LNEMOPARTMASK,RNPARTRAMPSTART,RNPARTRAMPLEN,& &RNPARTLAT,RNPARTLATSPREAD,LNEMOPARTMASKFILE,CDNPARTMASKFILE,LNEMOGRIB3D,& diff --git a/ifs-source/arpifs/phys_ec/compo_apply_emissions_layer.F90 b/ifs-source/arpifs/phys_ec/compo_apply_emissions_layer.F90 index 585753af..6cd5c265 100644 --- a/ifs-source/arpifs/phys_ec/compo_apply_emissions_layer.F90 +++ b/ifs-source/arpifs/phys_ec/compo_apply_emissions_layer.F90 @@ -49,6 +49,8 @@ SUBROUTINE COMPO_APPLY_EMISSIONS_LAYER(YDSURF, & IF (LHOOK) CALL DR_HOOK('COMPO_APPLY_EMISSIONS_LAYER',0,ZHOOK_HANDLE) +IF ( YDMODEL%YRML_GCONF%YGFL%NEMIS3D .GT. 0 ) THEN + ! ------------------------------------------------------------------ CALL COMPO_APPLY_EMISSIONS(YDMODEL, & & KDIM%KIDIA, KDIM%KFDIA, KDIM%KLEV, KDIM%KLON, GEMSL%ITRAC, & @@ -63,6 +65,24 @@ SUBROUTINE COMPO_APPLY_EMISSIONS_LAYER(YDSURF, & & PLSM=PSURF%PSD_VF(:,YDSURF%YSD_VF%YLSM%MP), & & PBLH=PSURF%PSD_VD(:,YDSURF%YSD_VD%YBLH%MP)) +ELSE + + ! ------------------------------------------------------------------ + CALL COMPO_APPLY_EMISSIONS(YDMODEL, & + & KDIM%KIDIA, KDIM%KFDIA, KDIM%KLEV, KDIM%KLON, GEMSL%ITRAC, & + & PAUX%PGELAT, PAUX%PGELAM, PAUX%PDELP, & + & GEMSL%ZCEN, GEMSL%ZTENC, GEMSL%ZCFLX, & + & PEMIS2D=PSURF%PSD_VF(:,YDSURF%YSD_VF%YEMIS2D(1)%MP:YDSURF%YSD_VF%YEMIS2D(YDMODEL%YRML_GCONF%YGFL%NEMIS2D)%MP), & + & PEMIS2DAUX=PSURF%PSD_VF(:,YDSURF%YSD_VF%YEMIS2DAUX(1)%MP:YDSURF%YSD_VF%YEMIS2DAUX(YDMODEL%YRML_GCONF%YGFL%NEMIS2DAUX)%MP), & + & PEMIS3D=PGFL(:,:,1:), & + & KAERO=GEMSL%IAERO, KCHEM=GEMSL%ICHEM, & + & PEXTRA=PSURF%PSD_XA, & + & PAPHIF=PAUX%PAPHIF, & + & PLSM=PSURF%PSD_VF(:,YDSURF%YSD_VF%YLSM%MP), & + & PBLH=PSURF%PSD_VD(:,YDSURF%YSD_VD%YBLH%MP)) + +ENDIF + ! ------------------------------------------------------------------ IF (LHOOK) CALL DR_HOOK('COMPO_APPLY_EMISSIONS_LAYER',1,ZHOOK_HANDLE) END SUBROUTINE COMPO_APPLY_EMISSIONS_LAYER diff --git a/ifs-source/arpifs/setup/sumcc.F90 b/ifs-source/arpifs/setup/sumcc.F90 index f173676f..2bc0ee44 100644 --- a/ifs-source/arpifs/setup/sumcc.F90 +++ b/ifs-source/arpifs/setup/sumcc.F90 @@ -179,8 +179,8 @@ SUBROUTINE SUMCC(YDMCC,YDEPHY,KULOUT) LMCCDYNSEAICE= .FALSE. LNEMOGRIBFLDS=.FALSE. LMULTIYR=.FALSE. -LMCCIEC_COMPO= .FALSE. -LMCCIEC_AERCLIM= .TRUE. +LMCCIEC_COMPO= .FALSE. ! Daily emissions not interpolated in time +LMCCIEC_AERCLIM= .TRUE. ! Monthly climatology interpolated in time LMCC_COMPO=.FALSE. NSSTICEOP=9 LNEMOGRIB3D=.FALSE. diff --git a/ifs-source/arpifs/setup/sumcclag.F90 b/ifs-source/arpifs/setup/sumcclag.F90 index 5b0ea7ea..db9486f6 100644 --- a/ifs-source/arpifs/setup/sumcclag.F90 +++ b/ifs-source/arpifs/setup/sumcclag.F90 @@ -375,7 +375,7 @@ SUBROUTINE SUMCCLAG(YDGEM,YDML_GCONF,YDML_AOC,YDCOMPO,YDCHEM,YDEAERSRC,YDEPHY,KU WRITE(NULOUT,*) 'OCEANBC ALLOCATED' ENDIF -! naj set up mechanism to read in emissions and dry deposition fields during model run for COMPO (AER AND CHEM) + ! Set up mechanism to read in emissions fields during model run for COMPO (AER AND CHEM) IF (LMCC_COMPO) THEN IF (LMCCIEC_COMPO) THEN ! Emissions etc. interpolated in time NPCOMPO_1=1 @@ -456,44 +456,41 @@ SUBROUTINE SUMCCLAG(YDGEM,YDML_GCONF,YDML_AOC,YDCOMPO,YDCHEM,YDEAERSRC,YDEPHY,KU NJDCR1_COMPO=-999 -! allocate communication array + ! allocate communication array ALLOCATE(YDMCC%CLIMRCOMPO(NGPTOT,ITIM,NCLIMR_COMPO)) WRITE(KULOUT,"(1X,'ARRAY ',A10,' ALLOCATED ',8I8)")& & 'CLIMRCOMPO ',SIZE(YDMCC%CLIMRCOMPO),SHAPE(YDMCC%CLIMRCOMPO) WRITE(KULOUT,"(1X,A20)") ' EXPECTED ORDER ' - DO IT=1,NCLIMR_COMPO + DO IT=1,NCLIMR_COMPO WRITE(KULOUT,"(1X,3I10)") IT, NCLIGC_COMPO(IT), NYSDMP_COMPO(IT) ENDDO - - -!VH Add stuff associated to 3D aerosol climatology + ! Add stuff associated to 3D SO2 oxidants climatology IF( NSO4SCHEME == 2 ) THEN + IF (NAEROCLIM == 0) THEN + CALL ABOR1('SUMCCLAG: "NSO4SCHEME == 2" requires SO2 oxidants') + ENDIF + IF (LMCCIEC_AERCLIM) THEN !THE 3D fields ARE INTERPOLATED IN TIME NPAERCLIM_1=1 NPAERCLIM_2=2 - !NPCOMPO_1=1 - !NPCOMPO_2=2 ITIM_AERCLIM=2 ELSE !THE FLUXES ARE NOT INTERPOLATED IN TIME NPAERCLIM_1=1 NPAERCLIM_2=NPAERCLIM_1 - !NPCOMPO_1=1 - !NPCOMPO_2=NPCOMPO_1 ITIM_AERCLIM=1 ENDIF - DO IT=1,NAEROCLIM + DO IT=1,NAEROCLIM NCLIGC_AERCLIM(IT) = YAEROCLIM_NL(IT)%IGRBCODE NYSDMP_AERCLIM(IT) = YDML_GCONF%YGFL%YAEROCLIM(IT)%MP ENDDO ! allocate communication array ALLOCATE(YDML_AOC%YRMCC%CLIMRAER(NGPTOT,NFLEVG,ITIM_AERCLIM,NAEROCLIM)) - !ALLOCATE(YDML_AOC%YRMCC%CLIMRAER(NGPTOT,NFLEVG,NAEROCLIM)) !!! default array is 3 dims instead of 4 dims WRITE(KULOUT,"(1X,'ARRAY ',A10,' ALLOCATED ',10I8)")& & 'CLIMRAER ',SIZE(YDML_AOC%YRMCC%CLIMRAER),SHAPE(YDML_AOC%YRMCC%CLIMRAER) @@ -505,9 +502,6 @@ SUBROUTINE SUMCCLAG(YDGEM,YDML_GCONF,YDML_AOC,YDCOMPO,YDCHEM,YDEAERSRC,YDEPHY,KU ENDIF - - - ENDIF ! Composition part ENDIF ! END BOUNDARY CONDITIONS UPDATED BY ECMWF ROUTINES diff --git a/ifs-source/arpifs/utility/updtim.F90 b/ifs-source/arpifs/utility/updtim.F90 index 2b2df032..69e7901d 100644 --- a/ifs-source/arpifs/utility/updtim.F90 +++ b/ifs-source/arpifs/utility/updtim.F90 @@ -918,9 +918,9 @@ SUBROUTINE UPDTIM(YDGEOMETRY,YDFIELDS,YDMODEL,KSTEP,PTDT,PTSTEP,LDCLUPD,LDUPDECA ! update climatology for SO2 oxidation IF(.NOT.LSCMEC) THEN IF ( NSO4SCHEME == 2 ) THEN - CALL UPDCLIE_AERCLIM(YDGEOMETRY,YDDYNA,YDMODEL%YRML_CHEM%YRCOMPO,YDMCC,YDGFL,YDMODEL%YRML_GCONF,PTSTEP) + CALL UPDCLIE_AERCLIM(YDGEOMETRY,YDDYNA,YDMCC,YDGFL,YDMODEL%YRML_GCONF,PTSTEP) ENDIF - ENDIF + ENDIF ! Updates climatology (SST) ECMWF style From a2d91bd24054a5596726bbf3b953b86d52f2716a Mon Sep 17 00:00:00 2001 From: Tommi Bergman Date: Wed, 3 Sep 2025 09:24:18 +0000 Subject: [PATCH 090/129] Pull request #45: OIFS-615 Fix incorrect boundary layer index calculation for nucleation Merge in ~NM6/openifs-48r1 from bugfix/OIFS-615-incorrect-boundary-layer-index-calculation-for-nucleation to knmi-m7 Squashed commit of the following: commit 18bdc28a1eb7ba10bbec098ec4f5d520c6e57105 Author: tommibergman Date: Tue Sep 2 17:37:55 2025 +0300 int -> nint for index of pbl top level commit 27ccfad875fdf9826bca82812fe0205f8e7f3c7f Author: tommibergman Date: Fri Aug 29 13:30:06 2025 +0300 OIFS-615 PR review corrections commit d30fd5df7e6bb4a90e8fe575b48e4b3fa617b2c5 Author: tommibergman Date: Thu Aug 21 11:43:05 2025 +0300 OIFS-615 clear out writouts/comments on pblh index calc.' commit 70244f0ef831f4f1022fe21542c1ae38d22aaef8 Author: tommibergman Date: Thu Aug 21 11:30:43 2025 +0300 OIFS-615 boundary layer index calculation changed to reflect that the PGEOH is the bottom of the grid box. --- ifs-source/arpifs/m7/module/mo_ham_m7_nucl.F90 | 8 ++++---- ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 | 8 ++------ 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/ifs-source/arpifs/m7/module/mo_ham_m7_nucl.F90 b/ifs-source/arpifs/m7/module/mo_ham_m7_nucl.F90 index 93eabad7..b6fb0e91 100644 --- a/ifs-source/arpifs/m7/module/mo_ham_m7_nucl.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_m7_nucl.F90 @@ -720,12 +720,12 @@ SUBROUTINE nucl_activation(kproma,kbdim,klev,ph2so4,pforest,ppbl,ppfr,pns) DO jl = 1, kproma ! Above the boundary layer: - DO jk = 1, int(ppbl(jl)) - 1 + DO jk = 1, nint(ppbl(jl)) - 1 pns(jl,jk) = 0.0_dp ppfr(jl,jk) = 0.0_dp ENDDO ! In the boundary layer: - DO jk = int(ppbl(jl)), klev + DO jk = nint(ppbl(jl)), klev pns(jl,jk) = 1.0_dp ppfr(jl,jk) = 1.0E-6_dp*ph2so4(jl,jk)*pforest(jl) ENDDO @@ -792,12 +792,12 @@ SUBROUTINE nucl_kinetic(kproma,kbdim,klev,ph2so4,pforest,ppbl,ppfr,pns) DO jl = 1, kproma ! Above the boundary layer: - DO jk = 1, int(ppbl(jl)) - 1 + DO jk = 1, nint(ppbl(jl)) - 1 pns(jl,jk) = 0.0_dp ppfr(jl,jk) = 0.0_dp ENDDO ! In the boundary layer: - DO jk = int(ppbl(jl)), klev + DO jk = nint(ppbl(jl)), klev pns(jl,jk) = 2.0_dp ppfr(jl,jk) = 3.86E-13_dp*ph2so4(jl,jk)*ph2so4(jl,jk)*pforest(jl) ENDDO diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index e4cf317d..c740e614 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -720,7 +720,7 @@ SUBROUTINE HAMM7_INTERFACE( & ZAP(JL,JK)=MIN(1.0_JPRB,MAX(0.0_JPRB,PAP(JL,JK))) !add threshold for cloud cover ENDDO ENDDO -ZBLHIDX(KIDIA:KFDIA)=1 +ZBLHIDX(KIDIA:KFDIA)=1.0_JPRB ! Find top level index of bounrary layer DO JK=1,KLEV DO JL=KIDIA,KFDIA @@ -728,12 +728,8 @@ SUBROUTINE HAMM7_INTERFACE( & ! PGEOH used here as it is the layer interface geopotential, and when divided by gravitation constat gives height ! IF (PBLH(JL)>(((PGEOH(JL,JK)-PGEOH(JL,KLEV))*ZRG)) .and. .not. LBLHFOUND(JL)) THEN - ZBLHIDX(JL)=JK-1 + ZBLHIDX(JL)=REAL(JK, KIND=JPRB) LBLHFOUND(JL)=.TRUE. - ! write(1212,*)PBLH(JL),PAPHIF(JL,JK),JL,JK-1 - ! else - ! write(1212,*)PBLH(JL),PAPHIF(JL,JK),JL,ZBLHIDX(JL) - END IF ENDDO ENDDO From b6945e466414e8a30556841a57ff37af8ffddf31 Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Thu, 4 Sep 2025 10:59:08 +0000 Subject: [PATCH 091/129] Pull request #48: Fix some indexing and bounds (OIFS-618) for M7 aerosols properties Merge in ~NM6/openifs-48r1 from bugfix/OIFS-618 to knmi-m7 Squashed commit of the following: commit 847afff43d5e9e5489da56703da73f0b3321ff7d Author: Philippe Le Sager Date: Wed Sep 3 16:17:29 2025 +0200 Enforce correct bounds to M7 aerosols properties commit 2290532bb11fad26c496a1c0dd6e42c9cf20872e Author: Philippe Le Sager Date: Wed Sep 3 16:12:00 2025 +0200 Fix indexing error in M7 radiation code --- ifs-source/arpifs/m7/module/mo_ham_rad.F90 | 2 +- ifs-source/arpifs/phys_radi/radintg.F90 | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ifs-source/arpifs/m7/module/mo_ham_rad.F90 b/ifs-source/arpifs/m7/module/mo_ham_rad.F90 index c3923702..9c0987a4 100755 --- a/ifs-source/arpifs/m7/module/mo_ham_rad.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_rad.F90 @@ -1228,7 +1228,7 @@ SUBROUTINE ham_rad(kproma, kbdim, klev, krow, kpband, kb_sw, & #ifdef HAMMOZ zxx(1:kproma,:)=2._dp*pi*rwet_p(1:kproma,:,krow)/lambda(jlwv) #else - zxx(1:kproma,:) = 2._dp*pi*rwet_m7(1:kproma,:,jclass)/lambda(jwv) + zxx(1:kproma,:) = 2._dp*pi*rwet_m7(1:kproma,:,jclass)/lambda(jlwv) #endif !--- 1.2) Table-lookup for optical properties: diff --git a/ifs-source/arpifs/phys_radi/radintg.F90 b/ifs-source/arpifs/phys_radi/radintg.F90 index 3dbcee1a..fe56c990 100644 --- a/ifs-source/arpifs/phys_radi/radintg.F90 +++ b/ifs-source/arpifs/phys_radi/radintg.F90 @@ -1005,12 +1005,12 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE, & DO JAERO=1,YDMODEL%YRML_PHY_RAD%YRERAD%NTSW IAE=(JAERO-1)*KLEV - ZRGP(1:IL,IHAMAEROSSA+IAE:IHAMAEROSSA+IAE+KLEV-1,IB) = MAX(0._JPRB,PAEROSSA(IBEG:IEND,1:KLEV,JAERO)) + ZRGP(1:IL,IHAMAEROSSA+IAE:IHAMAEROSSA+IAE+KLEV-1,IB) = MIN(MAX(0._JPRB,PAEROSSA(IBEG:IEND,1:KLEV,JAERO)), 1._JPRB) ENDDO DO JAERO=1,YDMODEL%YRML_PHY_RAD%YRERAD%NTSW IAE=(JAERO-1)*KLEV - ZRGP(1:IL,IHAMAEROASYM+IAE:IHAMAEROASYM+IAE+KLEV-1,IB) = MAX(0._JPRB, PAEROASYM(IBEG:IEND,1:KLEV,JAERO)) + ZRGP(1:IL,IHAMAEROASYM+IAE:IHAMAEROASYM+IAE+KLEV-1,IB) = MIN( MAX(-1._JPRB, PAEROASYM(IBEG:IEND,1:KLEV,JAERO)), 1._JPRB) ENDDO DO JAERO=1,16 ! ALaak: Need to be changed to some variable From aab13afe2feec80b917a46b03c304b4ac4442731 Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Thu, 11 Sep 2025 18:00:03 +0000 Subject: [PATCH 092/129] Pull request #49: Correct call to read and update of SO2 oxidants Merge in ~NM6/openifs-48r1 from bugfix/reading-oxidant to knmi-m7 Squashed commit of the following: commit 715463f0fbb6b246c6a1cfa680eeda6c3d684cec Author: Philippe Le Sager Date: Thu Sep 11 17:03:12 2025 +0200 Correct call to read and update of SO2 oxidants --- ifs-source/arpifs/climate/updclie_aerclim.F90 | 50 ++++++++++++------- ifs-source/arpifs/utility/updtim.F90 | 2 +- 2 files changed, 32 insertions(+), 20 deletions(-) diff --git a/ifs-source/arpifs/climate/updclie_aerclim.F90 b/ifs-source/arpifs/climate/updclie_aerclim.F90 index f7e0d10e..73346422 100644 --- a/ifs-source/arpifs/climate/updclie_aerclim.F90 +++ b/ifs-source/arpifs/climate/updclie_aerclim.F90 @@ -21,9 +21,12 @@ SUBROUTINE UPDCLIE_AERCLIM(YDGEOMETRY, YDDYNA, YDMCC, YDGFL, YDML_GCONF, PTSTEP) ! METHOD. ! ------- -! Reads the time-varying 3D fields for SO2 oxidants (OH, H2O2, O3) a/k/a "aerosol climatology" -! Uses time interpolation if LMCCIEC_AERCLIM=true, -! otherwise the most recent fields are used. +! Reads the time-varying 3D fields for SO2 oxidants (OH, H2O2, O3) a/k/a "aerosol climatology". +! Uses time interpolation if LMCCIEC_AERCLIM=true (tested, assumes +! that monthly data are in the middle of the month), otherwise the +! most recent fields are used (untested). +! +! Note that reading is sequential and, to be correct, detection of the first field is crucial. ! EXTERNALS. ! ---------- @@ -33,6 +36,7 @@ SUBROUTINE UPDCLIE_AERCLIM(YDGEOMETRY, YDDYNA, YDMCC, YDGFL, YDML_GCONF, PTSTEP) ! AUTHORS. ! -------- ! V Huijnen (KNMI) Oct 2022 (based on routine UPDCLIE_COMPO) +! P Le Sager (KNMI) Sept 2025 - Fix reading ! MODIFICATIONS. ! -------------- @@ -131,7 +135,7 @@ SUBROUTINE UPDCLIE_AERCLIM(YDGEOMETRY, YDDYNA, YDMCC, YDGFL, YDML_GCONF, PTSTEP) IJ0=NDD(NINDAT) IM0=NMM(NINDAT) IA0=NCCAA(NINDAT) -CALL UPDCAL(IJ0,IM0,IA0,NSTADD,IJOUR,IMOIS,IAN,ILMOIS,NULOUT) +CALL UPDCAL(IJ0,IM0,IA0,NSTADD,IJOUR,IMOIS,IAN,ILMOIS,NULOUT) ! Current date IF(IJOUR > 15)THEN IMT1=IMOIS IJT1=15 @@ -235,6 +239,7 @@ SUBROUTINE UPDCLIE_AERCLIM(YDGEOMETRY, YDDYNA, YDMCC, YDGFL, YDML_GCONF, PTSTEP) ! Check fields come in a consistent order and position file at the ! right place + ! End date of current integration ('leg' in EC-Earth vocab) ITIME=NINT(PTSTEP) IF (YDDYNA%LTWOTL) THEN IZTE=NINT(PTSTEP*(REAL(NSTOP,JPRB)+0.5_JPRB)) @@ -251,19 +256,20 @@ SUBROUTINE UPDCLIE_AERCLIM(YDGEOMETRY, YDDYNA, YDMCC, YDGFL, YDML_GCONF, PTSTEP) ISTADDE=IZTE/NINT(RDAY) CALL UPDCAL(IJ0,IM0,IA0,ISTADDE,IJE,IME,IAE,ILMOIS,NULOUT) + IF (LMCCIEC_AERCLIM) THEN - IF (IJOUR > 0) THEN + IF (IJOUR > 15) THEN ! which month is needed first: current or... ICCYY0=IAN IMM0=IMOIS ELSE - IMM0=1+MOD(IMOIS+10,12) + IMM0=1+MOD(IMOIS+10,12) ! ...previous month IF (IMM0 == 12) THEN ICCYY0=IAN-1 ELSE ICCYY0=IAN ENDIF ENDIF - IF (IJE > 0) THEN + IF (IJE > 15) THEN ! which month is needed last IMME=1+MOD(IME,12) IF (IMME == 1) THEN ICCYYE=IAE+1 @@ -275,7 +281,7 @@ SUBROUTINE UPDCLIE_AERCLIM(YDGEOMETRY, YDDYNA, YDMCC, YDGFL, YDML_GCONF, PTSTEP) IMME=IME ENDIF -! Locates the first field needed + ! Locates the first field needed (check only YYYY and MM) IYYM0=IMM0+100*ICCYY0 LLFOUND=.FALSE. @@ -288,10 +294,14 @@ SUBROUTINE UPDCLIE_AERCLIM(YDGEOMETRY, YDDYNA, YDMCC, YDGFL, YDML_GCONF, PTSTEP) ENDIF ENDDO IF (.NOT.LLFOUND) THEN - CALL ABOR1(' UPDCLIE_AERCLIM : FIRST FILE NOT FOUND') + WRITE(NULERR,'(A,I6,A)')& + & 'UPDCLIE_AERCLIM: FIRST FIELD FOR ',IYYM0,' (YYYYMM) NOT FOUND' + CALL ABOR1(' UPDCLIE_AERCLIM : FIRST FIELD NOT FOUND') + ELSE + WRITE(NULOUT,'(A,I6)') 'UPDCLIME_AERCLIM: FOUND FIRST FIELD FOR ',IYYM0 ENDIF -! Check all fields in the right time order + ! Check all fields in the right time order ICOU=IFIRST DO JY=ICCYY0,ICCYYE @@ -410,8 +420,9 @@ SUBROUTINE UPDCLIE_AERCLIM(YDGEOMETRY, YDDYNA, YDMCC, YDGFL, YDML_GCONF, PTSTEP) ENDIF ENDDO - ENDIF -! Positions the file in the first field needed + ENDIF + + ! Position the file to the first field needed CALL GRIB_CLOSE_FILE(IUNITAERCLIM,IRET) IF( IRET /= GRIB_SUCCESS )THEN @@ -429,17 +440,17 @@ SUBROUTINE UPDCLIE_AERCLIM(YDGEOMETRY, YDDYNA, YDMCC, YDGFL, YDML_GCONF, PTSTEP) EXIT ELSE CALL GRIB_RELEASE(IGRIB) - ENDIF - ENDDO + ENDIF + ENDDO -! Pack message + ! Pack message IDM(1)=IDIF IDM(2)=IJDCR IDM(3)=IUNITAERCLIM ENDIF MYPROCIF -! Broadcast + ! Broadcast ITAG=19591214 CALL MPL_BROADCAST(IDM,KTAG=ITAG,KROOT=1,CDSTRING='UPDCLIE_AERCLIM') @@ -464,7 +475,6 @@ SUBROUTINE UPDCLIE_AERCLIM(YDGEOMETRY, YDDYNA, YDMCC, YDGFL, YDML_GCONF, PTSTEP) IFIRST=2 ELSE IDATE=IAN*10000+IMOIS*100+IJOUR - WRITE(NULOUT,*) 'IDATE=',IDATE,IDATEREF IF (IJOUR == 16 .AND. IDATE > IDATEREF) THEN LLREAD=.TRUE. IFIRST=1 @@ -473,6 +483,7 @@ SUBROUTINE UPDCLIE_AERCLIM(YDGEOMETRY, YDDYNA, YDMCC, YDGFL, YDML_GCONF, PTSTEP) IFIRST=1 ENDIF ENDIF + WRITE(NULOUT,*) 'UPDCLIME_AERCLIM IDATE INFO: ',IDATE, IDATEREF, LLREAD, IFIRST ELSE IF (LLFIRST) THEN LLREAD=.TRUE. @@ -482,9 +493,9 @@ SUBROUTINE UPDCLIE_AERCLIM(YDGEOMETRY, YDDYNA, YDMCC, YDGFL, YDML_GCONF, PTSTEP) IJUL=RJUDAT(IAN,IMOIS,IJOUR) LLREAD=NJDCR_AERCLIM == IJUL ENDIF + WRITE(NULOUT,*) 'UPDCLIME_AERCLIM IDATE INFO: ', IDATE, IDATEREF, LLREAD, NJDCR_AERCLIM, NDIFC_AERCLIM ENDIF - WRITE(NULOUT,*) 'UPDCLIME_AERCLIM IDATE INFO: ',IDATE,IDATEREF,LLREAD, NJDCR_AERCLIM,NDIFC_AERCLIM !* 3.1 READ, DECODE AND SELECT THE FIELDS IF (LLREAD) THEN @@ -507,8 +518,9 @@ SUBROUTINE UPDCLIE_AERCLIM(YDGEOMETRY, YDDYNA, YDMCC, YDGFL, YDML_GCONF, PTSTEP) WRITE(NULERR,'(A,I2)')'UPDCLIE_AERCLIM: PROBLEM IN GRIB_NEW_FROM_FILE, IRET=',IRET CALL ABOR1('UPDCLIE_AERCLIM: PROBLEM IN GRIB_NEW_FROM_INDEX') ENDIF + ! ELSE + ! WRITE(NULOUT,*) 'UPDCLIME_AERCLIM : use igrib from last position in scan above' ENDIF -!VH Strange/problematic line?! CALL GRIB_SET(IGRIB,'missingValue',19591204.0_JPRB) CALL GSTATS(1703,0) CALL GRIB_GET(IGRIB,'values',ZBUF) CALL GSTATS(1703,1) diff --git a/ifs-source/arpifs/utility/updtim.F90 b/ifs-source/arpifs/utility/updtim.F90 index 69e7901d..d15de184 100644 --- a/ifs-source/arpifs/utility/updtim.F90 +++ b/ifs-source/arpifs/utility/updtim.F90 @@ -917,7 +917,7 @@ SUBROUTINE UPDTIM(YDGEOMETRY,YDFIELDS,YDMODEL,KSTEP,PTDT,PTSTEP,LDCLUPD,LDUPDECA ! update climatology for SO2 oxidation IF(.NOT.LSCMEC) THEN - IF ( NSO4SCHEME == 2 ) THEN + IF ( NSO4SCHEME == 2 .AND.LDCLUPD) THEN CALL UPDCLIE_AERCLIM(YDGEOMETRY,YDDYNA,YDMCC,YDGFL,YDMODEL%YRML_GCONF,PTSTEP) ENDIF ENDIF From 6774160dd1bf7a372a7e517691d46384ef131677 Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Thu, 18 Sep 2025 06:44:52 +0000 Subject: [PATCH 093/129] Pull request #50: Use one oxidants file and do not limit AOD/SSA/ASYM Merge in ~NM6/openifs-48r1 from dev/cleanup-before-tag to knmi-m7 Squashed commit of the following: commit 2d1e9931f595df813a34868037d1e15faf159ff4 Author: Philippe Le Sager Date: Wed Sep 17 15:53:55 2025 +0200 Remove more obsolete code commit 74e7456a2c51ae9cd55309f7e215d02b24e4a221 Author: Philippe Le Sager Date: Wed Sep 17 14:04:44 2025 +0200 Use the same oxidant file for all simulations commit 1d0fd1a1b5311beb3c5d4894a1093a4e95525235 Author: Philippe Le Sager Date: Wed Sep 17 13:53:43 2025 +0200 Remove obsolete code commit 6eedd2b941ccc17778d10ebfadbb99e1b5629faa Author: Philippe Le Sager Date: Tue Sep 16 12:40:00 2025 +0200 Constrain (now optional) M7 optical properties before diagnostics OIFS-618 commit 861d781aa51fe8db83da5929ab669fe185a9c83f Author: Philippe Le Sager Date: Tue Sep 16 09:43:30 2025 +0200 Fix weighting of M7 aerosol properties at diagnostic wavelengths OIFS-609 commit 56d9a042eaef01aec6c6eaf7418519a1c1e80e0e Author: Philippe Le Sager Date: Fri Sep 12 23:06:21 2025 +0200 Get all limitations on M7 optical properties in the same place commit 2ee204d6322963bf3668359bab6a15ab410ebb97 Author: Philippe Le Sager Date: Fri Sep 12 23:01:58 2025 +0200 Add reminder about PLU (input to wetdep) for future development commit 09873dd21c66f23b49181341529cd5c17f908c6e Author: Philippe Le Sager Date: Fri Sep 12 17:18:49 2025 +0200 Remove obsolete code OIFS-573 commit 4fe2e268885d2bdb66ab7ba80cb75d391b964d7b Author: Philippe Le Sager Date: Fri Sep 12 16:46:28 2025 +0200 Remove obsolete code OIFS-533 --- ifs-source/arpifs/climate/updclie_aerclim.F90 | 52 ++- ifs-source/arpifs/m7/module/mo_ham_rad.F90 | 6 +- .../arpifs/m7/phys_ec/hamm7_interface.F90 | 178 +++----- .../m7/phys_ec/m7_simple_sulfur_drydep.F90 | 380 ------------------ ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 | 105 ++--- .../arpifs/phys_radi/radiation_scheme.F90 | 3 +- ifs-source/arpifs/phys_radi/radintg.F90 | 24 +- 7 files changed, 139 insertions(+), 609 deletions(-) delete mode 100644 ifs-source/arpifs/m7/phys_ec/m7_simple_sulfur_drydep.F90 diff --git a/ifs-source/arpifs/climate/updclie_aerclim.F90 b/ifs-source/arpifs/climate/updclie_aerclim.F90 index 73346422..27023a99 100644 --- a/ifs-source/arpifs/climate/updclie_aerclim.F90 +++ b/ifs-source/arpifs/climate/updclie_aerclim.F90 @@ -97,20 +97,29 @@ SUBROUTINE UPDCLIE_AERCLIM(YDGEOMETRY, YDDYNA, YDMCC, YDGFL, YDML_GCONF, PTSTEP) INTEGER(KIND=JPIM) :: IDATE, IBITMAP, IYSDMP,ILEVEL REAL(KIND=JPRB) :: ZPOID1, ZPOID2 - REAL(KIND=JPHOOK) :: ZHOOK_HANDLE +! LCLIMATO allows us to use the same file regardless of the date. +! +! It is then assumed that a full year of data is needed. +! +! To account for any start date, the oxidants file must contain 2 +! years of data with an extra month before and after. For example: +! monthly data from 1989-12-15 to 1992-01-15 (use IYEARCLIMATO=1990 +! then). +! +LOGICAL, PARAMETER :: LCLIMATO=.TRUE. +INTEGER(KIND=JPIM), PARAMETER :: IYEARCLIMATO=1990 + ! ------------------------------------------------------------------ #include "abor1.intfb.h" #include "updcal.intfb.h" - #include "fcttim.func.h" ! ------------------------------------------------------------------ IF (LHOOK) CALL DR_HOOK('UPDCLIE_AERCLIM',0,ZHOOK_HANDLE) -!ASSOCIATE(YDDIM=>YDGEOMETRY%YRDIM,YDDIMV=>YDGEOMETRY%YRDIMV,YDGEM=>YDGEOMETRY%YRGEM, YDMP=>YDGEOMETRY%YRMP,YDRIP=>YDML_GCONF%YRRIP,YGFL=>YDML_GCONF%YGFL ) ASSOCIATE(YDDIM=>YDGEOMETRY%YRDIM,YDDIMV=>YDGEOMETRY%YRDIMV,YDGEM=>YDGEOMETRY%YRGEM, YDMP=>YDGEOMETRY%YRMP,YDRIP=>YDML_GCONF%YRRIP) ASSOCIATE(NDGLG=>YDDIM%NDGLG, NDGNH=>YDDIM%NDGNH, NDLON=>YDDIM%NDLON, & & NPROMA=>YDDIM%NPROMA, & @@ -146,6 +155,9 @@ SUBROUTINE UPDCLIE_AERCLIM(YDGEOMETRY, YDDYNA, YDMCC, YDGFL, YDML_GCONF, PTSTEP) IJT2=15 ENDIF +IF (LCLIMATO) THEN + IAN = IYEARCLIMATO +ENDIF !* ! 2. OPEN AND SCAN THE FILE, IF CLIMATE FIELDS REQUIRED @@ -239,23 +251,29 @@ SUBROUTINE UPDCLIE_AERCLIM(YDGEOMETRY, YDDYNA, YDMCC, YDGFL, YDML_GCONF, PTSTEP) ! Check fields come in a consistent order and position file at the ! right place - ! End date of current integration ('leg' in EC-Earth vocab) - ITIME=NINT(PTSTEP) - IF (YDDYNA%LTWOTL) THEN - IZTE=NINT(PTSTEP*(REAL(NSTOP,JPRB)+0.5_JPRB)) + ! -- End date of current integration ('leg' in EC-Earth vocab) + IF (LCLIMATO) THEN + ! Assume that an entire year will be simulated + IJE = IJOUR + IME = IMOIS + IF ((IME == 2).AND.(IJE == 29 )) IJE=28 ! to avoid error in IJULE below + IAE = IYEARCLIMATO + 1 ELSE - IZTE=ITIME*NSTOP - ENDIF + ITIME=NINT(PTSTEP) + IF (YDDYNA%LTWOTL) THEN + IZTE=NINT(PTSTEP*(REAL(NSTOP,JPRB)+0.5_JPRB)) + ELSE + IZTE=ITIME*NSTOP + ENDIF -!-- - IF (LPERPET) THEN - ISECND=IZTE/NINT(RDAY) - IZTE=IZTE-ISECND*NINT(RDAY) - ENDIF -!-- + IF (LPERPET) THEN + ISECND=IZTE/NINT(RDAY) + IZTE=IZTE-ISECND*NINT(RDAY) + ENDIF - ISTADDE=IZTE/NINT(RDAY) - CALL UPDCAL(IJ0,IM0,IA0,ISTADDE,IJE,IME,IAE,ILMOIS,NULOUT) + ISTADDE=IZTE/NINT(RDAY) + CALL UPDCAL(IJ0,IM0,IA0,ISTADDE,IJE,IME,IAE,ILMOIS,NULOUT) + ENDIF IF (LMCCIEC_AERCLIM) THEN IF (IJOUR > 15) THEN ! which month is needed first: current or... diff --git a/ifs-source/arpifs/m7/module/mo_ham_rad.F90 b/ifs-source/arpifs/m7/module/mo_ham_rad.F90 index 9c0987a4..2c88957b 100755 --- a/ifs-source/arpifs/m7/module/mo_ham_rad.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_rad.F90 @@ -1497,9 +1497,9 @@ SUBROUTINE ham_rad(kproma, kbdim, klev, krow, kpband, kb_sw, & DO jk=1, klev DO jl=1, kproma - IF(zaer_tau_diag(jl,jk,jwv)>EPSILON(1.0_dp)) THEN - zaer_ssa_diag(jl,jk,jwv) = zaer_ssa_diag(jl,jk,jwv)/ zaer_tau_diag(jl,jk,jwv) - zaer_asym_diag(jl,jk,jwv) = zaer_asym_diag(jl,jk,jwv)/zaer_tau_diag(jl,jk,jwv) + IF(zaer_ssa_diag(jl,jk,jwv)>EPSILON(1.0_dp)) THEN + zaer_asym_diag(jl,jk,jwv) = zaer_asym_diag(jl,jk,jwv)/zaer_ssa_diag(jl,jk,jwv) + zaer_ssa_diag(jl,jk,jwv) = zaer_ssa_diag(jl,jk,jwv)/ zaer_tau_diag(jl,jk,jwv) END IF END DO END DO diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index c740e614..802a004f 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -317,9 +317,6 @@ SUBROUTINE HAMM7_INTERFACE( & REAL(KIND=JPRB), PARAMETER :: ZEPSEC=1e-14_JPRB -!REAL(KIND=JPRB), ALLOCATABLE :: ZAERSRC(:,:), ZAERSCC(:,:) -! [RCHG -> non used ] REAL(KIND=JPRB) :: ZAEROUT1(KLON,KLEV),ZAEROUT2(KLON,KLEV),ZAEROUT3(KLON,KLEV),ZAEROUT4(KLON,KLEV),ZAEROUT5(KLON,KLEV) - REAL(KIND=JPRB),PARAMETER :: INFINITY=HUGE(1._JPRB) REAL(KIND=JPHOOK) :: ZHOOK_HANDLE @@ -439,6 +436,7 @@ SUBROUTINE HAMM7_INTERFACE( & REAL(KIND=JPRB) :: ZRG ! 1/RG !!! parameters needed for diagnostic aerosol optical properties +LOGICAL, PARAMETER :: LSAFETY=.FALSE. ! If true, impose limits on computed optical properties LOGICAL :: LDIAG_AEROPT ! logical for aerosol optics REAL(KIND=JPRB) :: ZAER_TAU_DIAG(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG) REAL(KIND=JPRB) :: ZAER_SSA_DIAG(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG) @@ -456,7 +454,6 @@ SUBROUTINE HAMM7_INTERFACE( & #include "tm5m7_optics_aop_get.intfb.h" #include "troplev.intfb.h" #include "chem_inext.intfb.h" -#include "m7_simple_sulfur_drydep.intfb.h" #include "ice_effective_radius.intfb.h" !----------------------------------------------------------------------- @@ -512,7 +509,8 @@ SUBROUTINE HAMM7_INTERFACE( & & LAERSCAV_CHEM => YREAERATM%LAERSCAV_CHEM, & & LAERVOL => YREAERATM%LAERVOL, & & NXT3DAER => YREAERATM%NXT3DAER, & - & LAERRRTM => YREAERATM%LAERRRTM, & + & LAERRRTM => YREAERATM%LAERRRTM, & + & REPSCAER => YREAERATM%REPSCAER, & ! --- YRERAD ---------------------------------------------- & LAERVISI => YRERAD%LAERVISI, & & NTSW => YRERAD%NTSW, & @@ -556,16 +554,6 @@ SUBROUTINE HAMM7_INTERFACE( & ALLOCATE( ZAERNGT(KLON,NACTAERO) ) ZAERNGT(KIDIA:KFDIA,1:NACTAERO) = 0._JPRB -!ALLOCATE( ZAERSCC(KLON,NACTAERO) ) -!ALLOCATE( ZAERSRC(KLON,NACTAERO) ) -!ZAERSRC(KIDIA:KFDIA,1:NACTAERO) =0._JPRB -!ZAERSCC(KIDIA:KFDIA,1:NACTAERO) =0._JPRB -!ZAEROUT1(KIDIA:KFDIA,:) =0._JPRB -!ZAEROUT2(KIDIA:KFDIA,:) =0._JPRB -!ZAEROUT3(KIDIA:KFDIA,:) =0._JPRB -!ZAEROUT4(KIDIA:KFDIA,:) =0._JPRB -!ZAEROUT5(KIDIA:KFDIA,:) =0._JPRB - ZOUT3(KIDIA:KFDIA,:,:) = 0._JPRB ZOUT_dnuc(KIDIA:KFDIA,:,:) = 0._JPRB ! Need to initialize those 3 arrays early in case LAERDRYDP=F (GNU, Lianghai Wu) @@ -594,7 +582,6 @@ SUBROUTINE HAMM7_INTERFACE( & ZCEN(KIDIA:KFDIA,:,:) = 0._JPRB ZFRACN(KIDIA:KFDIA,:,:) = 0._JPRB !fraction of activated particles per mode -!ZAERSRC(KIDIA:KFDIA,1:NACTAERO)=PAERSRC(KIDIA:KFDIA,1:NACTAERO) ZRG=1/RG @@ -681,28 +668,6 @@ SUBROUTINE HAMM7_INTERFACE( & ZTENC0(KIDIA:KFDIA,1:KLEV, :) = 0._JPRB ENDIF -!* 0.2 GAS-TO-PARTICLE CONVERSION (SO2 -> SO4) -! --------------------------------------- - -! IF(TRIM(CHEM_SCHEME)=="SimChem") THEN -! DO JGAS=1,2 -! IF (TRIM(YAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))%CNAME)=='SO2') THEN -! ISSO2 = ind_oifs_ham%ind_gas_OIFS(JGAS) -! ELSE IF (TRIM(YAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))%CNAME)=='SO4_gas')THEN -! ISSO4 = ind_oifs_ham%ind_gas_OIFS(JGAS) -! ELSE -! CALL ABOR1('HAMM7_INTERFACE: SO2 not defined. Wrong table in use') -! END IF -! END DO - -! DO JAER=1,NACTAERO -! IF (TRIM(YAERO(JAER)%CNAME)=='SO4_AS') THEN -! ISSO4_ACS=JAER -! EXIT -! END IF -! END DO -! ENDIF - ! !* 1.1 COMPUTE RELATIVE HUMIDITY WITHOUT VERTICAL SMOOTING ! --------------------------------------------------- @@ -1290,19 +1255,16 @@ SUBROUTINE HAMM7_INTERFACE( & ZLFRAC_SO2(KIDIA:KFDIA,:) = 0._JPRB ! zlfrac_so2 only needed in gas scavenging and this is off for now (put this zero) - ZLP(KIDIA:KFDIA,1:KLEV) = PLP(KIDIA:KFDIA,1:KLEV) ! temporary variable for cloud water content (modified in wetdep) - ZIP(KIDIA:KFDIA,1:KLEV) = PIP(KIDIA:KFDIA,1:KLEV) ! temporary variable for cloud ice water content (modified in wetdep) - ZIPDUM(KIDIA:KFDIA,1:KLEV) = 0._JPRB ! temporary variable for cloud ice water content (modified in wetdep) - ZLPU(KIDIA:KFDIA,1:KLEV) = PLU(KIDIA:KFDIA,1:KLEV) ! temporary variable for cloud water content (modified in wetdep) + ! In cloudsc.f90 PLU is defined as convective condensate (understood as total condensate, ie "include liquid and ice phases"). + ! So we use ZIPDUM to set the ice part to zero and use total condensate as liquid for the convective case of wetdep. + ! In the future, it would be better to calculate the actual fraction based on 7.6. This may be important to describe the + ! liquid and ice fractions correctly. + ZLP(KIDIA:KFDIA,1:KLEV) = PLP(KIDIA:KFDIA,1:KLEV) ! temporary variable for cloud water content (modified in wetdep - stratif case) + ZIP(KIDIA:KFDIA,1:KLEV) = PIP(KIDIA:KFDIA,1:KLEV) ! temporary variable for cloud ice water content (modified in wetdep - stratif case) + ZIPDUM(KIDIA:KFDIA,1:KLEV) = 0._JPRB ! temporary variable for cloud ice water content (modified in wetdep - convec case) + ZLPU(KIDIA:KFDIA,1:KLEV) = PLU(KIDIA:KFDIA,1:KLEV) ! temporary variable for cloud water content (modified in wetdep - convec case) - IF (TRIM(CHEM_SCHEME)=="SimChem")THEN - ! We need to revisit this subroutine, it can crash. Commented out for now. - ! Moreover, from the perspective of aligning SimChem and TM5 schemes, - ! this step should be (or probably has already been) handled on the chemistry side. - !LHW CALL HAM_CONV_LFRAQ_SO2(KFDIA,KLON,KLEV,PTP,ZXTM1,ZRHO,ZLP,ZLFRAC_SO2) - END IF - - !Double call to wet deposition. One for convective case and one for stratiform case. + ! Double call to wet deposition. One for convective case and one for stratiform case: ! WETDEP CONVECTIVE CASE @@ -1515,7 +1477,7 @@ SUBROUTINE HAMM7_INTERFACE( & ! RCHG: Recommendation, those subroutines specific of m7 should have ! m7 in the name not sure if this is specific or general/common - ! but adapted to m7. Like m7_simple_sulfur_drydep below. + ! but adapted to m7. CALL DRYDEP_INTERFACE(KLON, KFDIA, KLEV, ZKROW, & & ZQP(:,KLEV), ZQSAT(:,KLEV), PTP(:,KLEV), ZCFML, ZCFMW, ZCFMI, & & ZCFNCL, ZCFNCW, ZCFNCI, & @@ -1529,19 +1491,6 @@ SUBROUTINE HAMM7_INTERFACE( & & ZXTEMS, ZXTMD1, ZRHO(:,KLEV), PRS1, ZFOREST, ZTSI, & !air dens lowest, air press at int. & ZAZ0L, ZAZ0W, ZAZ0I, ZCDNL, ZCDNW, ZCDNI, ZDDEPFLUX, ZVDEP) !ZCDNL and ZCDNW used for ustar and aerodyn. resist. - IF (TRIM(CHEM_SCHEME)=="SimChem")THEN - ! Here inconsistent array dimensions have been fixed but - ! still commented this out. Because from the perspective of - ! aligning SimChem and TM5, I think this removal step should - ! be (or probably has already been) handled on the chemistry - ! side. Lianghai -! CALL M7_SIMPLE_SULFUR_DRYDEP(YDMODEL, KIDIA,KFDIA, KLON, KLEV, & -! ZXTM1(:,:,KAERO(1):KAERO(NACTAERO)), PCFLX(:,KAERO(1):KAERO(NACTAERO)), & -! ZDP, PGEOH, ZRHO, ZXTTE(:,:,KAERO(1):KAERO(NACTAERO)), PTSPHY,& -! PSO2DD, PGELAM, & -! ZFAERO(:,:,KAERO(1):KAERO(NACTAERO), ZXTP1(:,:,KAERO(1):KAERO(NACTAERO), ZDDEPFLUX_SO2) -! ZDDEPFLUX(KIDIA:KFDIA,2)=ZDDEPFLUX_SO2(KIDIA:KFDIA) - END IF !--> modify tendency at surface according to changes in surface emissions DO JT = 1,NTRAC @@ -1667,7 +1616,7 @@ SUBROUTINE HAMM7_INTERFACE( & ENDIF !------------------------------------------------------------------------------ -!* 7. STORE ALL AEROSOL VERTICALLY INTEGRATED FLUXES +!* 5. STORE ALL AEROSOL VERTICALLY INTEGRATED FLUXES ! ---------------------------------------------- DO JAER=1,NACTAERO @@ -1675,20 +1624,16 @@ SUBROUTINE HAMM7_INTERFACE( & PAERODDF(JL,JAER,1)=PAERSRC(JL,JAER) !aerosol so4 source term PAERODDF(JL,JAER,2)=PAERDDP(JL,JAER) ! aerosol dry deposition PAERODDF(JL,JAER,3)=PAERSDM(JL,JAER) ! aerosol sedimentation - PAERODDF(JL,JAER,4)=0.0!ZAERSCL(JL,JAER) ! so2 sink added to scavenging - PAERODDF(JL,JAER,5)=0.0!ZAERSCC(JL,JAER) ! scavenging (in-cloud & below cloud) so wet deposition + PAERODDF(JL,JAER,4)=0.0 ! (todo) so2 sink added to scavenging + PAERODDF(JL,JAER,5)=0.0 ! (todo) scavenging (in-cloud & below cloud) so wet deposition PAERODDF(JL,JAER,6)=ZAERNGT(JL,JAER) - PAERODDF(JL,JAER,7)=0.0!ZAERTAUT(JL,JAER,1) !total AOD? + PAERODDF(JL,JAER,7)=0.0 ! (todo) total AOD? ENDDO ENDDO !----------------------------------------------------------------------- - - -!* 5. OPTICAL DEPTH +!* 6. OPTICAL PROPERTIES ! -------------------------------------------------- -!calculate optical properties only when radiation is calculated -!radiation is calculated before microphysics -> nstep+1 INWAVL = 20 ITWAVL( 1)= 9 ! 550 nm @@ -1731,12 +1676,15 @@ SUBROUTINE HAMM7_INTERFACE( & ZAER_SSA_DIAG(KIDIA:KFDIA,:,:) = 0.0_JPRB ZAER_ASYM_DIAG(KIDIA:KFDIA,:,:) = 0.0_JPRB +!* 6.1 Calculate optical properties only when radiation is called +! ---------------------------------------------------------- IF(MOD(NSTEP,NRADFR) == 0) THEN -CALL GSTATS(2506,0) -ZAER_TAU(KIDIA:KFDIA,:,:,:) = 0.0_JPRB -ZAER_SSA(KIDIA:KFDIA,:,:) = 0.0_JPRB -ZAER_ASYM(KIDIA:KFDIA,:,:) = 0.0_JPRB -ZAER_TAU_LW(KIDIA:KFDIA,:,:) = 0.0_JPRB + + CALL GSTATS(2506,0) + ZAER_TAU(KIDIA:KFDIA,:,:,:) = 0.0_JPRB + ZAER_SSA(KIDIA:KFDIA,:,:) = 0.0_JPRB + ZAER_ASYM(KIDIA:KFDIA,:,:) = 0.0_JPRB + ZAER_TAU_LW(KIDIA:KFDIA,:,:) = 0.0_JPRB SELECT CASE (NAEROOPT) @@ -1766,10 +1714,10 @@ SUBROUTINE HAMM7_INTERFACE( & PAOD(KIDIA:KFDIA,:)=0._JPRB DO JK = 1, KLEV DO JL = KIDIA,KFDIA - DO IW=1,NASWBAND - PAER_TAU(JL,JK,IW)=ZAER_TAU(JL,JK,IW,1)*(PGEOH(JL,JK-1) - PGEOH(JL,JK))/RG - PAER_SSA(JL,JK,IW)=ZAER_SSA(JL,JK,IW) - PAER_ASYM(JL,JK,IW)=ZAER_ASYM(JL,JK,IW) + DO IW=1,NASWBAND + PAER_TAU(JL,JK,IW) = ZAER_TAU(JL,JK,IW,1)*(PGEOH(JL,JK-1) - PGEOH(JL,JK))/RG + PAER_SSA(JL,JK,IW) = ZAER_SSA(JL,JK,IW) + PAER_ASYM(JL,JK,IW)= ZAER_ASYM(JL,JK,IW) !PAOD(JL,IW)=ZAER_TAU(JL,JK,IW,1)*(PGEOH(JL,JK-1) - PGEOH(JL,JK))+PAOD(JL,IW) ENDDO DO IW=1,16 @@ -1800,10 +1748,10 @@ SUBROUTINE HAMM7_INTERFACE( & DO JK = 1, KLEV DO JL = KIDIA,KFDIA - DO IW=1,NASWBAND - PAER_TAU(JL,JK,IW)=ZAER_TAU(JL,JK,IW,1)!*(PGEOH(JL,JK-1) - PGEOH(JL,JK)) - PAER_SSA(JL,JK,IW)=ZAER_SSA(JL,JK,IW) - PAER_ASYM(JL,JK,IW)=ZAER_ASYM(JL,JK,IW) + DO IW=1,NASWBAND + PAER_TAU(JL,JK,IW) = ZAER_TAU(JL,JK,IW,1)!*(PGEOH(JL,JK-1) - PGEOH(JL,JK)) + PAER_SSA(JL,JK,IW) = ZAER_SSA(JL,JK,IW) + PAER_ASYM(JL,JK,IW)= ZAER_ASYM(JL,JK,IW) ENDDO DO IW=1,16 PAER_TAU_LW(JL,JK,IW)=ZAER_TAU_LW(JL,JK,IW) @@ -1813,9 +1761,30 @@ SUBROUTINE HAMM7_INTERFACE( & END SELECT + ! Impose safety limits + IF ((NAEROOPT .NE. 0).AND. LSAFETY) THEN + ! REPSCAER was needed to avoid corruption in radiation_scheme at + ! some point. Such limit could be removed once we are satisfied + ! with computed optical depths + DO JK = 1, KLEV + DO JL = KIDIA,KFDIA + DO IW=1,NASWBAND + PAER_TAU(JL,JK,IW) = MAX(REPSCAER, PAER_TAU(JL,JK,IW) ) + PAER_SSA(JL,JK,IW) = MIN(MAX(0._JPRB, PAER_SSA(JL,JK,IW) ), 1._JPRB) + PAER_ASYM(JL,JK,IW)= MIN( MAX(-1._JPRB, PAER_ASYM(JL,JK,IW)), 1._JPRB) + ENDDO + DO IW=1,16 + PAER_TAU_LW(JL,JK,IW) = MAX(REPSCAER, PAER_TAU_LW(JL,JK,IW)) + END DO + ENDDO + ENDDO + ENDIF + CALL GSTATS(2506,1) -ENDIF ! (MOD(NSTEP+1,NRADFR) == 0) +ENDIF ! It's a time step when radiation is called +!* 6.2 Vertically integrated optical properties +! ---------------------------------------- PAOD (KIDIA:KFDIA,:)=0._JPRB PABS (KIDIA:KFDIA,:)=0._JPRB PFAOD(KIDIA:KFDIA,:)=0._JPRB @@ -1866,8 +1835,8 @@ SUBROUTINE HAMM7_INTERFACE( & END DO END DO -!------------------------------------------------------------------------------ -!* 6.0 Fill selective aerosol OD fields in structure as available in IFS-AER +!* 6.3 Fill selective aerosol OD fields in structure as available in IFS-AER +! --------------------------------------------------------------------- DO JWAVL=1,MIN(INWAVL,NAERO_WVL_DIAG) DO JL=KIDIA,KFDIA @@ -1901,31 +1870,9 @@ SUBROUTINE HAMM7_INTERFACE( & PODTO1240(JL)=PTAUS_AER(JL,KLEV,5,1) ENDDO -!* 6.1 STORE IN AEROUT-1 -! ------------------------------ - -!-- total instantaneous optical depth -! DO JB=1,NBANDS_TROP -! DO JL=KIDIA,KFDIA -! ZAEROUT1(JL,JB)= PTAUS_AER(JL,KLEV,JB,1) -! ZAEROUT1(JL,NBANDS_TROP+JB)= PTAUA_AER(JL,KLEV,JB,1) -! ENDDO -! ENDDO - -!-- - -!* 6.1 STORE IN AEROUTs -! ------------------------------ - -!-- the total extinction coefficient at wavelengths ?? nm is archived in GFL%AEROUT -! DO JK=1,KLEV -! DO JL=KIDIA,KFDIA -! ZAEROUT2(JL,JK)=PTAUS_AER(JL,JK, 1,1) -! ZAEROUT3(JL,JK)=PTAUA_AER(JL,JK, 1,1) -! ZAEROUT4(JL,JK)=Ppmaer(JL,JK,1,1) -! ENDDO -! ENDDO +!* 7. STORE IN AEROUTs +! ------------------------------ ! LIFSMIN (T if running minimisation) and LIFSTRAJ (T if running high ! resolution trajectory integration) are both assimilation flags @@ -2162,10 +2109,7 @@ SUBROUTINE HAMM7_INTERFACE( & !------------------------------------------------------------------------------ !* 9. RELEASE LOCAL MEMORY ! -------------------- -!DEALLOCATE( ZAERSRC ) -IF (ALLOCATED(ZAERNGT ) ) DEALLOCATE( ZAERNGT ) -!DEALLOCATE( ZAERSCC ) - +IF (ALLOCATED(ZAERNGT)) DEALLOCATE( ZAERNGT ) IF (ALLOCATED(ZWPDF ) ) DEALLOCATE( ZWPDF ) IF (ALLOCATED(ZW ) ) DEALLOCATE( ZW ) IF (ALLOCATED(ZRC) ) DEALLOCATE( ZRC ) diff --git a/ifs-source/arpifs/m7/phys_ec/m7_simple_sulfur_drydep.F90 b/ifs-source/arpifs/m7/phys_ec/m7_simple_sulfur_drydep.F90 deleted file mode 100644 index 89c063e3..00000000 --- a/ifs-source/arpifs/m7/phys_ec/m7_simple_sulfur_drydep.F90 +++ /dev/null @@ -1,380 +0,0 @@ -SUBROUTINE m7_simple_sulfur_DRYDEP & -!---inputs - & ( YDMODEL, KIDIA , KFDIA , KLON , KLEV , & - & PAERO , PFAERI , & - & PDP , PGEOH, PRHO , PTAERI, PTSPHY, & - & PSO2DD, PGELAM, & -!-- outputs - & PFAERO , PTAERO, PFDRYD) - - -!**** *m7_simple_sulfur_DRYDEP* - ROUTINE FOR PARAMETRIZATION OF DRY DEPOSITION - - ! Modified from Dry dep routine for AER aerosols (aer_drydep.f90) for use in - ! OpenIFS/AC dry deposition of so2 when using simple sulfur chemistry - ! Original by - ! Jean-Jacques Morcrette - ! following O.Boucher's formulation for LMD-Z - - ! Modifications Tommi Bergman (FMI) - ! - ! Dry deposition is (simply) represented by a modification of the - ! instantaneous surface flux by what comes down from layer just - ! above the surface - -!** INTERFACE. -! ---------- -! *M7_simple_sulfur_DRYDEP* IS CALLED FROM *TM5M7*. - -! INPUTS: -! ------- -! PFAERI(KLON,NACTAERO) : INPUT SURFACE FLUX (xx m-2) -! PTAERI(KLON,KLEV,NACTAERO) : INPUT TENDENCIES (xx kg s-1) - -! OUTPUTS: -! -------- -! PFAERO(KLON,NACTAERO) : SURFACE FLUX (xx m-2) -! PTAERO(KLON,KLEV,NACTAERO) : UPDATED TENDENCIES (xx kg s-1) -! PFDRYD(KLON) : DIAGNOSTIC DRY DEPOSITION AT THE SURFACE (xx m-2) - -! EXTERNALS. -! ---------- -! NONE - -! MODIFICATIONS. -! ------------- -! JJMorcrette 20110725 maximum deposition speed -! SRémy 20160309 SO2 dry deposition velocity from SUMO (same as -! CHEM) -! SRémy 20160830 dry deposition velocities (except SO2) computed -! following Zhang et al 2001. -! TBergman 20230207 remove most of the code which is not needed for so2 - -! SWITCHES. -! -------- - -! MODEL PARAMETERS -! ---------------- - -!----------------------------------------------------------------------- -USE TYPE_MODEL , ONLY : MODEL -USE PARKIND1 ,ONLY : JPIM ,JPRB -USE YOMHOOK ,ONLY : LHOOK, DR_HOOK, JPHOOK - -!USE YOEAERATM, ONLY : YREAERATM -!USE YOEAERSNK, ONLY : YREAERSNK -!USE YOEAERSRC ,ONLY : YREAERSRC -!USE YOM_YGFL , ONLY : YGFL -USE YOMCST , ONLY : RG, RPI -!USE YOMRIP , ONLY : YRRIP -!USE YOMLUN , ONLY : NULOUT -USE MO_TRACDEF, ONLY: ntrac, trlist -USE MO_HAM, ONLY: nclass, naerocomp, sizeclass, nccndiag, subm_ngasspec - -IMPLICIT NONE - -!----------------------------------------------------------------------- - -!* 0.1 ARGUMENTS -! --------- - -!---input fields -TYPE(MODEL) ,INTENT(IN) :: YDMODEL -INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA -INTEGER(KIND=JPIM),INTENT(IN) :: KFDIA -INTEGER(KIND=JPIM),INTENT(IN) :: KLON -!INTEGER(KIND=JPIM),INTENT(IN) :: KTDIA -INTEGER(KIND=JPIM),INTENT(IN) :: KLEV -!INTEGER(KIND=JPIM),INTENT(IN) :: KSTEP - -!REAL(KIND=JPRB) ,INTENT(IN) :: PLSM(KLON), PCI(KLON) -!REAL(KIND=JPRB) ,INTENT(IN) :: PAERO(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO), PTAERI(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO) -REAL(KIND=JPRB) ,INTENT(IN) :: PAERO(KLON,KLEV,ntrac), PTAERI(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO) -!REAL(KIND=JPRB) ,INTENT(IN) :: PAPH(KLON,0:KLEV) -!REAL(KIND=JPRB) ,INTENT(IN) :: PAP(KLON,KLEV) -REAL(KIND=JPRB) ,INTENT(IN) :: PDP(KLON,KLEV), PGEOH(KLON,0:KLEV), PRHO(KLON,KLEV) -REAL(KIND=JPRB) ,INTENT(IN) :: PFAERI(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO) -REAL(KIND=JPRB) ,INTENT(IN) :: PTSPHY -REAL(KIND=JPRB) ,INTENT(IN) :: PSO2DD(KLON) -REAL(KIND=JPRB) ,INTENT(IN) :: PGELAM(KLON) -!REAL(KIND=JPRB) ,INTENT(IN) :: PAERUST(KLON) -!REAL(KIND=JPRB) ,INTENT(IN) :: PZ0M(KLON) -!REAL(KIND=JPRB) ,INTENT(IN) :: PT(KLON,KLEV) -!REAL(KIND=JPRB) ,INTENT(IN) :: PQ(KLON) -!REAL(KIND=JPRB) ,INTENT(IN) :: PDZ(KLON) - -!---output fields -REAL(KIND=JPRB) ,INTENT(OUT) :: PFAERO(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO) -REAL(KIND=JPRB) ,INTENT(OUT) :: PTAERO(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO) -REAL(KIND=JPRB) ,INTENT(OUT) :: PFDRYD(KLON)!,YGFL%NACTAERO) - -!--- local variables -INTEGER(KIND=JPIM) :: JL, JAER, JAERO -REAL(KIND=JPRB) :: ZAERO, ZFROC, ZOCEA, ZLAND, ZLICE, ZSICE, ZRHO -REAL(KIND=JPRB) :: Z1RG , Z1TSPHY, ZHGT, ZALPHA, ZAERI -REAL(KIND=JPRB) :: ZVDEP,ZVDEP2(YDMODEL%YRML_GCONF%YGFL%NACTAERO) - -REAL(KIND=JPRB) :: ZRHOP -REAL(KIND=JPRB) :: ZWETD -REAL(KIND=JPRB) :: ZSIGMA - -!!$!* Taken from J.J.Morcrette -!!$REAL(KIND=JPRB), PARAMETER :: ZR_OM = 0.13E-6 !m -!!$REAL(KIND=JPRB), PARAMETER :: ZR_BC = 0.04E-6 !m -!!$REAL(KIND=JPRB), PARAMETER :: ZR_SO4 = 0.9E-6 !m SO4 dry particle radius,Martin et al., 2003 -!!$REAL(KIND=JPRB), PARAMETER :: ZR_AM = 0.35E-6 !m Wang et al ACP 2014 -!!$REAL(KIND=JPRB), DIMENSION(2),PARAMETER :: ZR_NI =(/0.35E-6,1.5E-6/) !m Wang et al ACP 2014 -!!$!* Growth factors corresponding to RH table as given in RRHTAB, according to -!!$!J.J. Morcrette -!!$REAL(KIND=JPRB), DIMENSION(12), PARAMETER :: ZRH_GROWTH_SO4= & -!!$ & (/1.00,1.00,1.00,1.00,1.169,1.220,1.282,1.363,1.485,1.581,1.732,2.085/) -!!$! According to Chin et al., AMS 2002 -!!$REAL(KIND=JPRB), DIMENSION(12), PARAMETER :: ZRH_GROWTH_BC= & -!!$ & (/1.00,1.00,1.00,1.00,1.00,1.000,1.000,1.000,1.200,1.300,1.400,1.500/) -!!$REAL(KIND=JPRB), DIMENSION(12), PARAMETER :: ZRH_GROWTH_OM= & -!!$ & (/1.00,1.00,1.00,1.00,1.169,1.200,1.300,1.400,1.500,1.550,1.600,1.800/) -!!$! Nitrate : Svenningsson et al ACP 2006 -!!$REAL(KIND=JPRB), DIMENSION(12), PARAMETER :: ZRH_GROWTH_NI= & -!!$ & (/1.00,1.00,1.00,1.00,1.100,1.200,1.250,1.300,1.350,1.500,1.700,2.100/) -!!$REAL(KIND=JPRB), DIMENSION(12), PARAMETER :: ZRH_GROWTH_AM= & -!!$ & (/1.00,1.00,1.00,1.00,1.169,1.220,1.282,1.363,1.485,1.581,1.732,2.085/) - -!!$REAL(KIND=JPRB), PARAMETER :: ZRHO_OM=1800 ! kg/m^3 -!!$REAL(KIND=JPRB), PARAMETER :: ZRHO_BC=1000 ! kg/m^3 -!!$REAL(KIND=JPRB), PARAMETER :: ZRHO_SO4=1760 ! kg/m^3 -!!$REAL(KIND=JPRB), PARAMETER :: ZRHO_H2O=1000 ! kg/m^3 (water) -!!$REAL(KIND=JPRB), PARAMETER :: ZRHO_AM=1760 ! kg/m^3 (water) -!!$REAL(KIND=JPRB), DIMENSION(2), PARAMETER :: ZRHO_NI=(/1730,1400/) ! kg/m^3 (water) - - - -REAL(KIND=JPRB) :: ZMAXVDRY(KLON), ZDZ(KLON),ZDVMAX,ZHOURLT, ZSCALE, ZVFRAC -REAL(KIND=JPRB) :: ZQSAT(KLON,KLEV) -REAL(KIND=JPRB) :: ZRHCL(KLON) -INTEGER(KIND=JPIM) :: IAER, ICAER, ITAER, ITYP, IBIN, JTAB -INTEGER(KIND=JPIM) :: INAER(18),IRH(KLON) - - - -LOGICAL :: LLPRINT - - -REAL(KIND=JPHOOK) :: ZHOOK_HANDLE - -!#include "aer_drydepvel.intfb.h"! -!#include "satur.intfb.h"! - -!----------------------------------------------------------------------- -IF (LHOOK) CALL DR_HOOK('M7_SIMPLE_SULFUR_DRYDEP',0,ZHOOK_HANDLE) -ASSOCIATE(YGFL=>YDMODEL%YRML_GCONF%YGFL, YREAERSNK=>YDMODEL%YRML_PHY_AER%YREAERSNK, YDRIP=>YDMODEL%YRML_GCONF%YRRIP) -ASSOCIATE(NDRYDEP=>YREAERSNK%NDRYDEP, NACTAERO=>YGFL%NACTAERO) - - -! & RVDPLIC=>YREAERSNK%RVDPLIC, RVDPLND=>YREAERSNK%RVDPLND, & -! & RVDPOCE=>YREAERSNK%RVDPOCE, RVDPSIC=>YREAERSNK%RVDPSIC, & -! & RRHO_DD=>YREAERSNK%RRHO_DD, RRHO_SS=>YREAERSNK%RRHO_SS, & -! & RMMD_DD=>YREAERSNK%RMMD_DD, RMMD_SS=>YREAERSNK%RMMD_SS, & -! & RSSDENS_RHTAB=>YREAERSNK%RSSDENS_RHTAB, & -! & RSSGROWTH_RHTAB=>YREAERSNK%RSSGROWTH_RHTAB, & -! & RRHTAB=>YREAERSNK%RRHTAB, & -! & NACTAERO=>YGFL%NACTAERO, & -! & NINDDDEP=>YREAERATM%NINDDDEP, & -! & LDRYDEPVEL_DYN => YREAERSNK%LDRYDEPVEL_DYN, & -! & NTDDEP=>YREAERATM%NTDDEP,YAERO=>YGFL%YAERO, & -! & NMAXTAER=>YREAERSRC%NMAXTAER, NTYPAER=>YREAERSRC%NTYPAER) - -!- PFAERI in unit of xx m-2 s-1 (surface flux) -!- PFAERO in unit of xx m-2 s-1 (surface flux) -!- N.B. Surface emission fluxes are negative upward, so contribution of -! dry deposition is to make the surface flux less negative - -LLPRINT=.FALSE. -!DO JL=1,NSTPDBG -! IF (KSTEP == KSTPDBG(JL)) THEN -! LLPRINT=.TRUE. -! ENDIF -!ENDDO - -!!$ICAER=0 -!!$DO JAER=1,NMAXTAER -!!$ IF (NTYPAER(JAER) /= 0) THEN -!!$ ITAER=NTYPAER(JAER) -!!$ DO IAER=1,ITAER -!!$ ICAER=ICAER+1 -!!$ INAER(ICAER)=JAER*10+IAER -!!$ ENDDO -!!$ ENDIF -!!$ENDDO - - -Z1RG = 1.0_JPRB/RG -Z1TSPHY= 1.0_JPRB/PTSPHY -PTAERO(KIDIA:KFDIA,1:KLEV,1:YGFL%NACTAERO)=PTAERI(KIDIA:KFDIA,1:KLEV,1:YGFL%NACTAERO) -PFAERO(KIDIA:KFDIA,1:YGFL%NACTAERO)= PFAERI(KIDIA:KFDIA,1:YGFL%NACTAERO) -ZVDEP=0._JPRB -!!$ZVDEP2(:)=0._JPRB - -!!$DO JL=KIDIA,KFDIA -!!$ ZDZ(JL)=(PAPH(JL,KLEV)-PAPH(JL,KLEV-1)) / (RG*PRHO(JL,KLEV)) -!!$ ZMAXVDRY(JL)= ZDZ(JL) / PTSPHY -!!$ENDDO - -! limit max der dep velocity based on 30 m box height (it is 10-15 m) -ZDVMAX=30.0_JPRB/PTSPHY - -!CALL SATUR (KIDIA, KFDIA, KLON , KTDIA, KLEV, PAP, PT, ZQSAT, 2 ) -PFDRYD(:)=0.0_JPRB -!IRH=12 -!write(3434,*)NDRYDEP -!NDRYDEP=1 -DO JAERO=1,subm_ngasspec!NACTAERO!NTDDEP - !JAER=NINDDDEP(JDDEP) - !write(3535,*)JAERO,TRIM(trlist%ti(JAERO)%basename) - !IF (TRIM(YAERO(JAERO)%CNAME)=='SO2')THEN - IF(TRIM(trlist%ti(JAERO)%basename)=='SO2')THEN - JAER=JAERO - ELSE - CYCLE - END IF -! ITYP=INAER(JAER)/10 -! IBIN=INAER(JAER)-ITYP*10 - DO JL=KIDIA,KFDIA - -!!$ ZRHCL(JL)=PQ(JL)/ZQSAT(JL,KLEV) - ZRHO = PRHO(JL,KLEV) -!!$ DO JTAB=1,12 -!!$ IF (ZRHCL(JL)*100._JPRB > RRHTAB(JTAB)) THEN -!!$ IRH(JL)=JTAB -!!$ ENDIF -!!$ ENDDO - ZAERO = PAERO(JL,KLEV,JAER) + PTSPHY * PTAERI(JL,KLEV,JAER) - !write(3434,*)PAERO(JL,KLEV,JAER) , PTSPHY * PTAERI(JL,KLEV,JAER) - !IF (ITYP == 5 .AND. IBIN == 2) THEN -! IF (.true.) THEN - ! use SUMO dry dep velocity for SO2 - !ZVDEP(JAER)=PSO2DD(JL) - ZVDEP=PSO2DD(JL) - ZHOURLT = (RPI - YDRIP%RWSOVR) - PGELAM(JL) - ! Difference w.r.t to longitude of sza max - ZSCALE = 1.0 + COS(ZHOURLT) * 0.7_JPRB - !ZVDEP(JAER) = ZSCALE * MIN(ZDVMAX,ZSCALE*ZVDEP(JAER)) - ZVDEP = ZSCALE * MIN(ZDVMAX,ZSCALE*ZVDEP) -!!$ ELSE -!!$ ZLAND= PLSM(JL) -!!$ ZOCEA= 1._JPRB-PLSM(JL) -!!$ ZFROC= ZOCEA*(1._JPRB-PCI(JL)) -!!$ ZSICE= ZOCEA*PCI(JL) -!!$ ZLICE= 0._JPRB -!!$ -!!$ ZVDEP2(JAER)= ZLAND * RVDPLND(JAER) + ZFROC * RVDPOCE(JAER) + & -!!$ & ZSICE * RVDPSIC(JAER) + ZLICE * RVDPLIC(JAER) -!!$ ZVDEP2(JAER)= MIN(ZVDEP2(JAER),ZMAXVDRY(JL)) -!!$ -!!$ ! set RHOP and WETD for each aerosol type -!!$ ZSIGMA=2.0_JPRB -!!$ IF (ITYP == 1) THEN - ! for land, adjust size -!!$ IF (PLSM(JL) > 0.5_JPRB) THEN -!!$ ZRHOP=RSSDENS_RHTAB(12) -!!$ ZWETD=1.E-6_JPRB*RMMD_SS(IBIN)*RSSGROWTH_RHTAB(12)/RSSGROWTH_RHTAB(9) -!!$ ELSE -!!$ ZRHOP=RSSDENS_RHTAB(IRH(JL)) -!!$ ZWETD=1.E-6_JPRB*RMMD_SS(IBIN)*RSSGROWTH_RHTAB(IRH(JL))/RSSGROWTH_RHTAB(9) -!!$ ENDIF -!!$ ELSEIF (ITYP == 2) THEN -!!$ ZRHOP=RRHO_DD(IBIN) -!!$ ZWETD=1.E-6_JPRB*RMMD_DD(IBIN) -!!$ ELSEIF (ITYP == 3) THEN -!!$ ZWETD=2._JPRB*ZR_OM*ZRH_GROWTH_OM(IRH(JL)) -!!$ ZVFRAC = 1.0 / ZRH_GROWTH_OM(IRH(JL))**3 -!!$ ZRHOP = ZRHO_H2O*(1.0-ZVFRAC) + ZVFRAC*ZRHO_OM -!!$ ELSEIF (ITYP == 4) THEN -!!$ ZVFRAC = 1.0 / ZRH_GROWTH_BC(IRH(JL))**3 -!!$ ZRHOP = ZRHO_H2O*(1.0-ZVFRAC) + ZVFRAC*ZRHO_BC -!!$ ZWETD=2._JPRB*ZR_BC*ZRH_GROWTH_BC(IRH(JL)) -!!$ ELSEIF (ITYP == 5) THEN ! SO4 only -!!$ ZVFRAC = 1.0 / ZRH_GROWTH_SO4(IRH(JL))**3 -!!$ ZRHOP = ZRHO_H2O*(1.0-ZVFRAC) + ZVFRAC*ZRHO_SO4 -!!$ ZWETD=2._JPRB*ZR_SO4*ZRH_GROWTH_SO4(IRH(JL)) -!!$ ELSEIF (ITYP == 6) THEN ! nitrate -!!$ ZVFRAC = 1.0 / ZRH_GROWTH_NI(IRH(JL))**3 -!!$ ZRHOP = ZRHO_H2O*(1.0-ZVFRAC) + ZVFRAC*ZRHO_NI(IBIN) -!!$ ZWETD=2._JPRB*ZR_NI(IBIN)*ZRH_GROWTH_NI(IRH(JL)) -!!$ ELSEIF (ITYP == 7) THEN ! Ammonium -!!$ ZVFRAC = 1.0 / ZRH_GROWTH_AM(IRH(JL))**3 -!!$ ZRHOP = ZRHO_H2O*(1.0-ZVFRAC) + ZVFRAC*ZRHO_AM -!!$ ZWETD=2._JPRB*ZR_AM*ZRH_GROWTH_AM(IRH(JL)) -!!$ ENDIF -!!$ -!!$ IF (LDRYDEPVEL_DYN) THEN -!!$ ! compute deposition velocity following Zhang et al 2001 -!!$ ! CALL AER_DRYDEPVEL(ZRHOP,ZWETD,ZSIGMA,PZ0M(JL),PCI(JL),PAERUST(JL),PDZ(JL),PT(JL,KLEV),ZRHO,ZVDEP(JAER)) -!!$ CALL ABOR1("dynamic dry dep for AER not yet supported in OIFS!") -!!$ -!!$ ZVDEP=MIN(0.1_JPRB,ZVDEP) -!!$ ELSE -!!$ ZVDEP(JAER)=ZVDEP2(JAER) -!!$ ENDIF - -! RVDPxxx (from su_aerp, derived from LMDZ in m s-1) -! formula is consistent: (xx m-2 s-1) - (m s-1) * (xx kg-1) * (kg m-3) -! PFAERO is then in xx m-2 s-1 -! ENDIF - - IF (NDRYDEP == 1) THEN - -!-- only the surface flux is diminished of the equivalent effect of the dry deposition -! but the vertical distribution of tendencies is untouched - - PFAERO(JL,JAER)=PFAERI(JL,JAER) & - & + ZVDEP * ZAERO * ZRHO - !PFDRYD(JL,JAER)=0._JPRB - PFDRYD(JL)=0._JPRB - - ELSE - -!-- Alternate formulation -! using the analytical solution (Flemming et al., 2011, D_GRG_4.6) -! The tendency in the lowest layer is modified, but the surface flux remains -! untouched. - - ZHGT= PGEOH(JL,KLEV-1) * Z1RG - ZALPHA= PTSPHY* ZVDEP/ZHGT -!-- using Euler forward -! ZAERI = ZAERO * (1.0_JPRB - ZALPHA) -!-- using Euler backward -! ZAERI = ZAERO * (1.0_JPRB + ZALPHA) -!-- using Euler centered -! ZAERI = ZAERO * ((1.0_JPRB - ZALPHA)/(1.0_JPRB + ZALPHA)) -!-- using the analytical solution (Flemming et al., 2011, D_GRG_4.6) - ZAERI = ZAERO * EXP(-1.0_JPRB * ZALPHA) -! PTAERO(JL,KLEV,JAER)= PTAERI(JL,KLEV,JAER) & -! & + (ZAERI-PAERO(JL,KLEV,JAER)) * Z1TSPHY - PTAERO(JL,KLEV,JAER)= PTAERO(JL,KLEV,JAER) & - & + (ZAERI-ZAERO) * Z1TSPHY - !write(3434,*)ZAERO , ZAERI - !write(3434,*)Z1TSPHY - !write(3434,*)PDP(JL,KLEV) - !write(3434,*)Z1RG - !if (((ZAERO - ZAERI))>1e-20_JPRB)THEN - PFDRYD(JL)= (ZAERO - ZAERI)*Z1TSPHY * PDP(JL,KLEV) * Z1RG - !ELSE - ! PFDRYD(JL)= 0.0_JPRB - !END if - PFAERO(JL,JAER)= PFAERI(JL,JAER) - - ENDIF -! write(3434,*)NDRYDEP,JL,PFAERO(JL,JAER),PFDRYD(JL) - ENDDO -ENDDO - -!IF (LLPRINT) THEN -! WRITE(UNIT=NULOUT,FMT='(1x,''DRYDEP'',I5,9E12.5)') KSTEP,PRHO(KIDIA,KLEV),& -! & (PFAERI(KIDIA,JAER),PFAERO(KIDIA,JAER),ZVDEP(JAER),PAERO(KIDIA,KLEV,JAER),JAER=3,YGFL%NACTAERO,3) -!ENDIF - -!----------------------------------------------------------------------- -END ASSOCIATE -END ASSOCIATE -IF (LHOOK) CALL DR_HOOK('M7_SIMPLE_SULFUR_DRYDEP',1,ZHOOK_HANDLE) -END SUBROUTINE M7_SIMPLE_SULFUR_DRYDEP diff --git a/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 index 8f3f47e6..812a8c9b 100644 --- a/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 +++ b/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 @@ -486,41 +486,6 @@ SUBROUTINE TM5M7_SRC( & ENDDO ENDDO -! RCHG -> This is outside the previous loop so it is important to initialize PEMIDIAG(:,:) = 0. -! at begining of this subroutine. Note that here we are not filling PCFLX -! Is this ok? -! -!IF (.not. LAERCHEM) THEN -! DO JL=KIDIA,KFDIA -! DO JK=1,KLEV -! DO JGAS=1,2 -! IF (TRIM(YAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))%CNAME)=='SO2') THEN -! ISSO2=ind_oifs_ham%ind_gas_OIFS(JGAS) -! PTENC(JL,JK,KAERO(ISSO2))=PTENC(JL,JK,KAERO(ISSO2))+ PSO2SRC(JL,JK) -! !PCFLX(JL,KAERO(ISSO2))=PCFLX(JL,KAERO(ISSO2)) + PSO2SRC(JL,JK) -! PEMIDIAG(JL,KAERO(ISSO2))=PEMIDIAG(JL,KAERO(ISSO2))+ PSO2SRC(JL,JK) -! ELSE IF (TRIM(YAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))%CNAME)=='SO4_gas') THEN -! ISSO4=ind_oifs_ham%ind_gas_OIFS(JGAS) -! PTENC(JL,JK,KAERO(ISSO4))=PTENC(JL,JK,KAERO(ISSO4))+ PSO4SRC(JL,JK) -! !PCFLX(JL,KAERO(ISSO4))=PCFLX(JL,KAERO(ISSO4)) + PSO4SRC(JL,JK) -! PEMIDIAG(JL,KAERO(ISSO4))=PEMIDIAG(JL,KAERO(ISSO4)) + PSO4SRC(JL,JK) -! END IF -! END DO -! END DO -! -! -!! For add SOA from CO into ISVOC tracer -!!!$ DO JGAS=1,NACTAERO -!!!$ IF (TRIM(YAERO(JGAS)%CNAME)=='ISVOC') THEN -!!!$ -!!!$ PTENC(JL,JK,KAERO(JGAS))=PTENC(JL,JK,KAERO(JGAS))+ PSOACO(JL) -!!!$ PEMIDIAG(JL,KAERO(JGAS))=PEMIDIAG(JL,KAERO(JGAS)) + PSOACO(JL) -!!!$ END IF -!!!$ END DO -! -! END DO -! END IF - !----------------------------------------------------------------------- !* 6.0 De-allocate arrays @@ -890,43 +855,43 @@ SUBROUTINE BC_SRC_43R3() END SUBROUTINE -SUBROUTINE ADD_TOFLUX() - emit(KIDIA:KFDIA,:) = 0.0 - DO IMODE=1,NMOD ! loop in each mode - DO INMODE=0,MODE_NM_SED(IMODE) ! loop in aerosols species per mode - JN = MODE_TRACERS_SED(INMODE,IMODE) ! retrieve indentifier of each specie - if (JN==ino3_a.or.JN==inh4.or.JN==imsa) then - emit(KIDIA:KFDIA,:) = 0.0 - else if(inmode == 0) then ! 1st specie of mode is number part. in mode - emit(KIDIA:KFDIA,:) = 0.0 - do ii=1,mode_nm(IMODE) ! add up all number emissions in the mode 'imode'... - emit(KIDIA:KFDIA,:) = emit(KIDIA:KFDIA,:) + emis_number(IMODE)%d3(KIDIA:KFDIA,:,ii) - enddo - else ! this is a 'mass' emission with index nmode - emit(KIDIA:KFDIA,:) = emis_mass(IMODE)%d3(KIDIA:KFDIA,:,inmode) - endif - ! Change units from kg/m2/sec to kg/kg/sec and update tendency.. - DO JL=KIDIA,KFDIA - ! Should limit to troposphere?! (for now sfc only) - !JK=91 - !if (JN==iduai)then - ! write(2020,*)jk,emit(jl,jk) - !end if - !if (JN==iaii_n)then - ! write(2020,*)jk,emit(jl,jk) - !end if - !write(2929,*)JN,KAERO(JN) - PEMIDIAG(JL,KAERO(JN))=PEMIDIAG(JL,KAERO(JN))+sum(emit(JL,:)) - DO JK=1,KLEV - !PCFLX(JL,KAERO(JN))=PCFLX(JL,KAERO(JN))+emit(JL,JK) +! SUBROUTINE ADD_TOFLUX() +! emit(KIDIA:KFDIA,:) = 0.0 +! DO IMODE=1,NMOD ! loop in each mode +! DO INMODE=0,MODE_NM_SED(IMODE) ! loop in aerosols species per mode +! JN = MODE_TRACERS_SED(INMODE,IMODE) ! retrieve indentifier of each specie +! if (JN==ino3_a.or.JN==inh4.or.JN==imsa) then +! emit(KIDIA:KFDIA,:) = 0.0 +! else if(inmode == 0) then ! 1st specie of mode is number part. in mode +! emit(KIDIA:KFDIA,:) = 0.0 +! do ii=1,mode_nm(IMODE) ! add up all number emissions in the mode 'imode'... +! emit(KIDIA:KFDIA,:) = emit(KIDIA:KFDIA,:) + emis_number(IMODE)%d3(KIDIA:KFDIA,:,ii) +! enddo +! else ! this is a 'mass' emission with index nmode +! emit(KIDIA:KFDIA,:) = emis_mass(IMODE)%d3(KIDIA:KFDIA,:,inmode) +! endif +! ! Change units from kg/m2/sec to kg/kg/sec and update tendency.. +! DO JL=KIDIA,KFDIA +! ! Should limit to troposphere?! (for now sfc only) +! !JK=91 +! !if (JN==iduai)then +! ! write(2020,*)jk,emit(jl,jk) +! !end if +! !if (JN==iaii_n)then +! ! write(2020,*)jk,emit(jl,jk) +! !end if +! !write(2929,*)JN,KAERO(JN) +! PEMIDIAG(JL,KAERO(JN))=PEMIDIAG(JL,KAERO(JN))+sum(emit(JL,:)) +! DO JK=1,KLEV +! !PCFLX(JL,KAERO(JN))=PCFLX(JL,KAERO(JN))+emit(JL,JK) - PTENC(JL,JK,KAERO(JN))=PTENC(JL,JK,KAERO(JN))+emit(JL,JK) * RG /PDELP(JL,JK) - ENDDO +! PTENC(JL,JK,KAERO(JN))=PTENC(JL,JK,KAERO(JN))+emit(JL,JK) * RG /PDELP(JL,JK) +! ENDDO - ENDDO - ENDDO - ENDDO - END SUBROUTINE +! ENDDO +! ENDDO +! ENDDO +! END SUBROUTINE ADD_TOFLUX END SUBROUTINE TM5M7_SRC diff --git a/ifs-source/arpifs/phys_radi/radiation_scheme.F90 b/ifs-source/arpifs/phys_radi/radiation_scheme.F90 index de0e2698..2bbf202b 100644 --- a/ifs-source/arpifs/phys_radi/radiation_scheme.F90 +++ b/ifs-source/arpifs/phys_radi/radiation_scheme.F90 @@ -302,7 +302,6 @@ SUBROUTINE RADIATION_SCHEME & & WEIGHT_PAR => YDRADIATION%WEIGHT_PAR(:), & & TROP_BG_AER_MASS_EXT => YDRADIATION%TROP_BG_AER_MASS_EXT, & & STRAT_BG_AER_MASS_EXT => YDRADIATION%STRAT_BG_AER_MASS_EXT, & - & REPSCAER => YDEAERATM%REPSCAER, & & AERO_SCHEME => YDCOMPO%AERO_SCHEME) ! Allocate memory in radiation objects @@ -611,7 +610,7 @@ SUBROUTINE RADIATION_SCHEME & DO JAER = 1,STRATO_CMIP_NTB DO JLEV = 1,KLEV DO JLON = KIDIA,KFDIA - AEROSOL%OD_LW(JAER,JLEV,JLON) = MAX(REPSCAER,PAEROM7_TAULW(JLON,JLEV,JAER)) + AEROSOL%OD_LW(JAER,JLEV,JLON) = PAEROM7_TAULW(JLON,JLEV,JAER) ENDDO ENDDO ENDDO diff --git a/ifs-source/arpifs/phys_radi/radintg.F90 b/ifs-source/arpifs/phys_radi/radintg.F90 index fe56c990..e1eabfea 100644 --- a/ifs-source/arpifs/phys_radi/radintg.F90 +++ b/ifs-source/arpifs/phys_radi/radintg.F90 @@ -983,42 +983,26 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE, & IF (TRIM(AERO_SCHEME) == "hamm7" ) THEN - !IF (NSTEP == YDRIP%NSTART) THEN - ! DO JAERO=1,YDERAD%NTSW - ! IAE=(JAERO-1)*KLEV - ! ZRGP(1:IL,IHAMAEROAOD+IAE:IHAMAEROAOD+IAE+KLEV-1,IB) =REPSCAER - ! ZRGP(1:IL,IHAMAEROSSA+IAE:IHAMAEROSSA+IAE+KLEV-1,IB) =0._JPRB - ! ZRGP(1:IL,IHAMAEROASYM+IAE:IHAMAEROASYM+IAE+KLEV-1,IB) =0._JPRB - ! END DO - - ! !DO JAERO=1,STRATO_CMIP6_NTB - ! !IAE=(JAERO-1)*KLEV - ! !ZRGP(1:IL,IHAMAEROAODLW+IAE:IHAMAEROAODLW+IAE+KLEV-1,IB) =0._JPRB - ! !END DO - - !ELSE DO JAERO=1,YDMODEL%YRML_PHY_RAD%YRERAD%NTSW IAE=(JAERO-1)*KLEV - ZRGP(1:IL,IHAMAEROAOD+IAE:IHAMAEROAOD+IAE+KLEV-1,IB) = MAX(REPSCAER, PAEROTAU(IBEG:IEND,1:KLEV,JAERO)) - !REPSCAER is needed to avoid corruption in radiation_scheme + ZRGP(1:IL,IHAMAEROAOD+IAE:IHAMAEROAOD+IAE+KLEV-1,IB) = PAEROTAU(IBEG:IEND,1:KLEV,JAERO) ENDDO DO JAERO=1,YDMODEL%YRML_PHY_RAD%YRERAD%NTSW IAE=(JAERO-1)*KLEV - ZRGP(1:IL,IHAMAEROSSA+IAE:IHAMAEROSSA+IAE+KLEV-1,IB) = MIN(MAX(0._JPRB,PAEROSSA(IBEG:IEND,1:KLEV,JAERO)), 1._JPRB) + ZRGP(1:IL,IHAMAEROSSA+IAE:IHAMAEROSSA+IAE+KLEV-1,IB) = PAEROSSA(IBEG:IEND,1:KLEV,JAERO) ENDDO DO JAERO=1,YDMODEL%YRML_PHY_RAD%YRERAD%NTSW IAE=(JAERO-1)*KLEV - ZRGP(1:IL,IHAMAEROASYM+IAE:IHAMAEROASYM+IAE+KLEV-1,IB) = MIN( MAX(-1._JPRB, PAEROASYM(IBEG:IEND,1:KLEV,JAERO)), 1._JPRB) + ZRGP(1:IL,IHAMAEROASYM+IAE:IHAMAEROASYM+IAE+KLEV-1,IB) = PAEROASYM(IBEG:IEND,1:KLEV,JAERO) ENDDO DO JAERO=1,16 ! ALaak: Need to be changed to some variable IAE=(JAERO-1)*KLEV - ZRGP(1:IL,IHAMAEROAODLW+IAE:IHAMAEROAODLW+IAE+KLEV-1,IB) =MAX(0._JPRB, PAEROTAULW(IBEG:IEND,1:KLEV,JAERO)) + ZRGP(1:IL,IHAMAEROAODLW+IAE:IHAMAEROAODLW+IAE+KLEV-1,IB) = PAEROTAULW(IBEG:IEND,1:KLEV,JAERO) ENDDO - !ENDIF ELSE DO JAERO=1,IRADAER2 IAE=(JAERO-1)*KLEV From 8b862460bcf654c347c47f521b6c68bc0fa0f84b Mon Sep 17 00:00:00 2001 From: Tommi Bergman Date: Tue, 23 Sep 2025 09:44:41 +0000 Subject: [PATCH 094/129] Pull request #51: OIFS-622 Fix sulfate in fullchem runs Merge in ~NM6/openifs-48r1 from bugfix/OIFS-622-sulfate-in-fullchem-runs to knmi-m7 Squashed commit of the following: commit 367235a2f0288010c8af3b0bec6b3b18962b48bf Author: Tommi Bergman Date: Fri Sep 19 07:16:26 2025 +0000 OIFS-622 HAMM7+BASCOETM5 not supported, yet but create the structure. Also the model aborts when HAMM7 and BASCOETM5 are used together. commit e8ad15eb33feea279acb50bf6b9ae9711a4958cf Author: Tommi Bergman Date: Fri Sep 19 07:14:42 2025 +0000 OIFS-622 Change the tendency change to include production of SO4 from chemistry, leave pchem2aer for diagnostics. --- ifs-source/arpifs/chem/chem_main.F90 | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/ifs-source/arpifs/chem/chem_main.F90 b/ifs-source/arpifs/chem/chem_main.F90 index fdaf2a39..82f02d60 100644 --- a/ifs-source/arpifs/chem/chem_main.F90 +++ b/ifs-source/arpifs/chem/chem_main.F90 @@ -535,12 +535,23 @@ SUBROUTINE CHEM_MAIN & ! output for aerosol scheme IF (NACTAERO > 0 .AND. LAERCHEM) THEN + ! BASCOE not supported at the moment with HAMM7 + ! BASCOETM5 does not have separated Gas-phase and Aqueous phase SO4, which will most probably lead to crash/incorrect results. PCHEM2AER(KIDIA:KFDIA,1:KLEV,1) = ZTENC1(KIDIA:KFDIA,1:KLEV,ISO4_BASCOETM5) -ZTENC0(KIDIA:KFDIA,1:KLEV,ISO4_BASCOETM5) - PCHEM2AER(KIDIA:KFDIA,1:KLEV,2) = -1.0_JPRB*ZBUDR(KIDIA:KFDIA,1:KLEV,ISO2_BASCOETM5) - PCHEM2AER(KIDIA:KFDIA,1:KLEV,3) = ZTENC1(KIDIA:KFDIA,1:KLEV,ISO2_BASCOETM5) - ZTENC0(KIDIA:KFDIA,1:KLEV,ISO2_BASCOETM5) - - ZTENC1(KIDIA:KFDIA,1:KLEV,ISO4_BASCOETM5) = ZTENC0(KIDIA:KFDIA,1:KLEV,ISO4_BASCOETM5) + ZTENC1(KIDIA:KFDIA,1:KLEV,ISO4_BASCOETM5) = ZTENC1(KIDIA:KFDIA,1:KLEV,ISO4_BASCOETM5) -ZTENC0(KIDIA:KFDIA,1:KLEV,ISO4_BASCOETM5) ! this will be added to incoming tendency + + SELECT CASE (TRIM(AERO_SCHEME)) + CASE ("aer") + PCHEM2AER(KIDIA:KFDIA,1:KLEV,2) = -1.0_JPRB*ZBUDR(KIDIA:KFDIA,1:KLEV,ISO2_TM5) + PCHEM2AER(KIDIA:KFDIA,1:KLEV,3) = ZTENC1(KIDIA:KFDIA,1:KLEV,ISO2_TM5) - ZTENC0(KIDIA:KFDIA,1:KLEV,ISO2_TM5) + CASE ("hamm7") + CALL ABOR1(" HAMM7 not supported for BASCOETM5 yet " ) + !!!!!! + !BASCOETM5 does not have LPROD yet, uncomment when added!!! + !!!!!! + !PCHEM2AER(KIDIA:KFDIA,1:KLEV,2) = ZSO4_LPROD(KIDIA:KFDIA,1:KLEV) + END SELECT ENDIF IF (NACTAERO > 0 .AND. LAERNITRATE) THEN PCHEM2AER(KIDIA:KFDIA,1:KLEV,4) = ZTENC1(KIDIA:KFDIA,1:KLEV,INH4_BASCOETM5) - ZTENC0(KIDIA:KFDIA,1:KLEV,INH4_BASCOETM5) @@ -622,8 +633,8 @@ SUBROUTINE CHEM_MAIN & ! output for aerosol scheme IF (NACTAERO > 0 .AND. LAERCHEM) THEN - PCHEM2AER(KIDIA:KFDIA,1:KLEV,1) = ZTENC1(KIDIA:KFDIA,1:KLEV,ISO4_TM5) -ZTENC0(KIDIA:KFDIA,1:KLEV,ISO4_TM5) - ZTENC1(KIDIA:KFDIA,1:KLEV,ISO4_TM5) = ZTENC0(KIDIA:KFDIA,1:KLEV,ISO4_TM5) + PCHEM2AER(KIDIA:KFDIA,1:KLEV,1) = ZTENC1(KIDIA:KFDIA,1:KLEV,ISO4_TM5) -ZTENC0(KIDIA:KFDIA,1:KLEV,ISO4_TM5) ! leave this for diagnostics + ZTENC1(KIDIA:KFDIA,1:KLEV,ISO4_TM5) = ZTENC1(KIDIA:KFDIA,1:KLEV,ISO4_TM5) -ZTENC0(KIDIA:KFDIA,1:KLEV,ISO4_TM5) ! this will be added to incoming tendency SELECT CASE (TRIM(AERO_SCHEME)) CASE ("aer") From aff53ec37d566ce6c45ec1295334287373bee663 Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Thu, 9 Oct 2025 15:46:18 +0000 Subject: [PATCH 095/129] Pull request #54: Bug fix use of minimum ice concentration Merge in ~NM6/openifs-48r1 from bugfix/OIFS-588-ice-crystal-nb-concentration to knmi-m7 Squashed commit of the following: commit dde2f7d1437202f6e0c70fece202e16c8df9a2b2 Author: Philippe Le Sager Date: Wed Oct 8 13:23:40 2025 +0200 Correct another comment about units commit 6c85efeac66b29069d2bf2c96a49191e0c2f0303 Author: Philippe Le Sager Date: Wed Oct 8 10:43:30 2025 +0200 Correct a comment about units commit 48a40baef92176cae2a4fe4284ef46176c1af1e8 Author: Philippe Le Sager Date: Tue Oct 7 16:02:06 2025 +0200 Correct use of minimum ice number concentration --- .../arpifs/m7/phys_ec/hamm7_interface.F90 | 20 +++++++++---------- .../arpifs/m7/phys_ec/yoe_aer_activ.F90 | 2 +- ifs-source/arpifs/phys_ec/sucldp.F90 | 4 ++-- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index 802a004f..1bb0e073 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -1007,14 +1007,7 @@ SUBROUTINE HAMM7_INTERFACE( & ENDDO ! treshold CDNC and ICNC to gridcells with only liquid or ice clouds ZCDNCACT(KIDIA:KFDIA,1:KLEV) = MERGE(ZCDNCACT(KIDIA:KFDIA,1:KLEV),1.0E6_JPRB*ZMIN_CDNC,LLIQCLD(KIDIA:KFDIA,1:KLEV)) !mask only values inside liq cloud - ZICNC(KIDIA:KFDIA,1:KLEV) = MERGE(ZICNC(KIDIA:KFDIA,1:KLEV),1.0E6_JPRB*RNICE,LICECLD(KIDIA:KFDIA,1:KLEV)) !mask only values inside ice cloud - - !<-- Store CDNC (number of activated particles) and ICNC as a number mixing ratio to tracer values and to PGFL fields - ZXTM1(KIDIA:KFDIA,1:KLEV,idt_cdnc) = (MAX(ZCDNCACT(KIDIA:KFDIA,1:KLEV),((1.0E6_JPRB)*ZMIN_CDNC)))/ZRHO(KIDIA:KFDIA,1:KLEV) ! [#/kg] and treshold CDNC to 1 cm-3 - ZXTM1(KIDIA:KFDIA,1:KLEV,idt_icnc) = (1.0E6_JPRB)*ZICNC(KIDIA:KFDIA,1:KLEV)/ZRHO(KIDIA:KFDIA,1:KLEV) !ice crystal number conc = #/cm3 --> number mix rat [#/kg] - PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH) = 1.0E-6_JPRB*( MAX(ZCDNCACT(KIDIA:KFDIA,1:KLEV), ZMIN_CDNC*1.0E+6_JPRB)) ! convert from #/m3 to #/cm3 and treshold minimum value to 1 cm-3 - PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH) = MAX( ZICNC(KIDIA:KFDIA,1:KLEV), 0.027_JPRB) ! no conversion needed: already in #/cm3, just max of default value (RNICE in sucldp.F90) and icnc - !--> End store CDNC and ICNC + ZICNC(KIDIA:KFDIA,1:KLEV) = MERGE(ZICNC(KIDIA:KFDIA,1:KLEV), RNICE, LICECLD(KIDIA:KFDIA,1:KLEV)) !mask only values inside ice cloud !----------------------------------------------------------------- !--> Calculation for effective radii and put to PGFL fields @@ -1096,7 +1089,7 @@ SUBROUTINE HAMM7_INTERFACE( & ! treshold CDNC and ICNC to gridcells with only liquid or ice clouds ZCDNCACT(KIDIA:KFDIA,1:KLEV) = MERGE(ZCDNCACT(KIDIA:KFDIA,1:KLEV),1.0E6_JPRB*ZMIN_CDNC,LLIQCLD(KIDIA:KFDIA,1:KLEV)) !mask only values inside liq cloud - ZICNC(KIDIA:KFDIA,1:KLEV) = MERGE(ZICNC(KIDIA:KFDIA,1:KLEV),1.0E6_JPRB*RNICE,LICECLD(KIDIA:KFDIA,1:KLEV)) !mask only values inside ice cloud + ZICNC(KIDIA:KFDIA,1:KLEV) = MERGE(ZICNC(KIDIA:KFDIA,1:KLEV), RNICE, LICECLD(KIDIA:KFDIA,1:KLEV)) !mask only values inside ice cloud !<-- Store CDNC (number of activated particles) and ICNC as a number mixing ratio to tracer values ZXTM1(KIDIA:KFDIA,1:KLEV,idt_cdnc) = (MAX(ZCDNCACT(KIDIA:KFDIA,1:KLEV),((1.0E6_JPRB)*ZMIN_CDNC)))/ZRHO(KIDIA:KFDIA,1:KLEV) ! [#/kg] and treshold CDNC to 1 cm-3 @@ -1137,7 +1130,14 @@ SUBROUTINE HAMM7_INTERFACE( & CALL GSTATS(2502,1) - !<-- End activation for HAM-M7 + ! Store CDNC (number of activated particles) and ICNC as a number mixing ratio to tracer values, and in PGFL + ZXTM1(KIDIA:KFDIA,1:KLEV,IDT_CDNC) = (MAX(ZCDNCACT(KIDIA:KFDIA,1:KLEV),((1.0E6_JPRB)*ZMIN_CDNC)))/ZRHO(KIDIA:KFDIA,1:KLEV) ! [#/kg] and threshold CDNC + ZXTM1(KIDIA:KFDIA,1:KLEV,IDT_ICNC) = (1.0E6_JPRB)*ZICNC(KIDIA:KFDIA,1:KLEV)/ZRHO(KIDIA:KFDIA,1:KLEV) !ice crystal number conc = #/cm3 --> number mix rat [#/kg] + + PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH) = MAX((1.0E-6_JPRB)*ZCDNCACT(KIDIA:KFDIA,1:KLEV),ZMIN_CDNC) ! convert from #/m3 to #/cm3 and threshold minimum value to 1 cm-3 + PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH) = MAX( ZICNC(KIDIA:KFDIA,1:KLEV), RNICE) ! no conversion needed: already in #/cm3, just impose minimum value + + !----------------------------------------------------------------- !<-- Store CDNC (number of activated particles) and ICNC as a number mixing ratio to tracer values and to PGFL fields diff --git a/ifs-source/arpifs/m7/phys_ec/yoe_aer_activ.F90 b/ifs-source/arpifs/m7/phys_ec/yoe_aer_activ.F90 index 408fb59a..8bf797f7 100644 --- a/ifs-source/arpifs/m7/phys_ec/yoe_aer_activ.F90 +++ b/ifs-source/arpifs/m7/phys_ec/yoe_aer_activ.F90 @@ -167,7 +167,7 @@ SUBROUTINE AER_ACTIV(KIDIA, KFDIA, KTDIA, KLON, KLEV, KSTGLO, & REAL(KIND=JPRB), INTENT(IN) :: PSIGMA_W(KLON,KLEV) ! sigma_w REAL(KIND=JPRB), INTENT(INOUT) :: PGFL(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NDIM) - REAL(KIND=JPRB), INTENT(INOUT) :: PCDNCACT(KLON,KLEV) ! cloud droplet number concentration [#/cm-3] + REAL(KIND=JPRB), INTENT(INOUT) :: PCDNCACT(KLON,KLEV) ! cloud droplet number concentration [#/m-3] REAL(KIND=JPRB), INTENT(INOUT) :: PICNC(KLON,KLEV) ! ice crystal number concentration [#/cm-3] REAL(KIND=JPRB), INTENT(INOUT) :: PREFFL(KLON,KLEV) ! liquid droplet effective radius [um] REAL(KIND=JPRB), INTENT(INOUT) :: PREFFI(KLON,KLEV) ! ice effective radius [um] diff --git a/ifs-source/arpifs/phys_ec/sucldp.F90 b/ifs-source/arpifs/phys_ec/sucldp.F90 index 1bf26514..cdf6bf94 100644 --- a/ifs-source/arpifs/phys_ec/sucldp.F90 +++ b/ifs-source/arpifs/phys_ec/sucldp.F90 @@ -421,8 +421,8 @@ SUBROUTINE SUCLDP(YDSTA,YDDIMV,YDPHY2,YDECLDP) RCL_KKAAU = 1350._JPRB ! s-1 RCL_KKBAUQ = 2.47_JPRB RCL_KKBAUN = -1.79_JPRB -RCL_KK_CLOUD_NUM_SEA = 50._JPRB ! m-3 -RCL_KK_CLOUD_NUM_LAND = 300._JPRB ! m-3 +RCL_KK_CLOUD_NUM_SEA = 50._JPRB ! cm-3 +RCL_KK_CLOUD_NUM_LAND = 300._JPRB ! cm-3 ! default false: use constant ZEaut, ZEacc ! if true, use regime-dependent FSD to calculate ! ZEaut and ZEacc From c18ec8193da0ebc8c064e97dadb7deb684f0f19d Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Fri, 10 Oct 2025 15:45:21 +0200 Subject: [PATCH 096/129] Hotfix from EC-Earth 4 --- ifs-source/arpifs/m7/module/mo_activ.F90 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ifs-source/arpifs/m7/module/mo_activ.F90 b/ifs-source/arpifs/m7/module/mo_activ.F90 index c01edbf2..6aa8a82d 100644 --- a/ifs-source/arpifs/m7/module/mo_activ.F90 +++ b/ifs-source/arpifs/m7/module/mo_activ.F90 @@ -34,8 +34,8 @@ MODULE mo_activ REAL(dp), PUBLIC, POINTER :: swat(:,:,:) REAL(dp), PUBLIC, POINTER :: w_cape(:,:) - REAL(dp), PUBLIC, POINTER :: w_sigma(:,:,:) #ifdef HAMMOZ + REAL(dp), PUBLIC, POINTER :: w_sigma(:,:,:) REAL(dp), PUBLIC, POINTER :: reffl(:,:,:) REAL(dp), PUBLIC, POINTER :: reffi(:,:,:) REAL(dp), PUBLIC, POINTER :: w_large(:,:,:) @@ -203,7 +203,9 @@ SUBROUTINE aero_activ_updraft_sigma(kproma, kbdim, klev, krow, & !--- Large scale vertical velocity in SI units: pwsigma(1:kproma,:) = MAX(w_sigma_min, ((2.0_dp/3.0_dp)*ptkem1(1:kproma,:))**0.5_dp) ! m/s +#ifdef HAMMOZ w_sigma(1:kproma,:,krow) = pwsigma(1:kproma,:) +#endif END SUBROUTINE aero_activ_updraft_sigma From a624f1bb046aaf1a3254e66054430d52ca9c5288 Mon Sep 17 00:00:00 2001 From: Anton Laakso Date: Fri, 10 Oct 2025 13:51:14 +0000 Subject: [PATCH 097/129] Pull request #31: Implement CMIP6/7 stratospheric aerosols Merge in ~NM6/openifs-48r1 from OIFS-567-stratospheric-aerosol-representation_new to knmi-m7 Squashed commit of the following: commit 0024719bccf1172fee6b3c6eaa53c7a9252ff486 Merge: 85d4a2e 8f13dc9 Author: Philippe Le Sager Date: Fri Oct 10 15:49:26 2025 +0200 Merge branch 'origin/knmi-m7' into OIFS-567-strat-aero commit 85d4a2e69a8c3ca9b2bb2602901963e10c89c04f Author: Philippe Le Sager Date: Thu Oct 9 12:34:44 2025 +0200 Round of cleanup commit 17547af119dc3a21a771f884f119858d6cbfd462 Merge: d906d3e 49ba7bc Author: Philippe Le Sager Date: Thu Oct 9 08:17:30 2025 +0200 Merge 'origin/knmi-m7' into OIFS-567-strat-aero commit d906d3e45cb8ac440bc874f8edc20459579703f4 Merge: 38e0a02 c4b4c1a Author: Philippe Le Sager Date: Wed Jul 9 10:45:32 2025 +0200 Merge remote-tracking branch 'knmi-m7' into OIFS-567-strat-aero commit 38e0a02edf414b25f09078acdeadabfd6ffdbd12 Author: Anton Laakso Date: Wed Jul 2 22:14:33 2025 +0300 The double addition of M7 aerosol properties to the radiation module was fixed. commit 52df1cfee929ed64a338bf049eb67bb24498c2e5 Merge: 6df7f12 d23d492 Author: Anton Laakso Date: Wed Jul 2 20:51:12 2025 +0300 Merge branch 'OIFS-567-stratospheric-aerosol-representation_new' of https://git.ecmwf.int/scm/~nm6/openifs-48r1 into OIFS-567-stratospheric-aerosol-representation_new commit 6df7f12542fcb8323178f681b1685bc101538536 Author: Anton Laakso Date: Wed Jul 2 20:47:28 2025 +0300 A missing call to add CMIP stratospheric aerosols was added commit d23d49218e2e56d14b0966c5e8837e51972098c1 Merge: 0521d71 b068987 Author: Philippe Le Sager Date: Fri Jun 27 22:41:16 2025 +0200 Merge remote-tracking branch 'origin/knmi-m7' into strato commit 0521d71816ad37cadfbb49c3bc86cb1646a2099c Author: Anton Laakso Date: Wed Jun 25 23:09:32 2025 +0300 M7 aerosol optical properties for LW radiation fixed commit 3a22ca80d75dfd94e59404c1531267632cf33a1d Author: Anton Laakso Date: Wed Jun 25 10:52:34 2025 +0300 modifications for using CMIP7 stratospheric aerosols - part 2 commit 178a4fb6ab38c9b4db00f636eddba56761e2c56f Author: Anton Laakso Date: Wed Jun 25 10:51:46 2025 +0300 modifications for using CMIP7 stratospheric aerosols commit 98999dcacfb2479a063c0d48ca1b344ab831fe40 Author: Philippe Le Sager Date: Thu May 22 09:51:02 2025 +0200 Cleanup and straighten code commit c83c58de7b95912dfd42c87f139134859b3526de Author: Philippe Le Sager Date: Wed May 21 18:07:02 2025 +0200 Fix for long runs commit dfc0ac9c0b3fd0179007990e5813d5813b1bc0b5 Author: Philippe Le Sager Date: Wed May 21 17:59:47 2025 +0200 Fix DrHook calls commit 500bbe9cc2234c2097a5bf7a03bc950e859d9585 Merge: 5c9295e 4f10207 Author: Philippe Le Sager Date: Fri May 16 17:08:57 2025 +0200 Merge remote-tracking branch 'origin/knmi-m7' into OIFS-567-stratospheric-aerosol-representation_new commit 5c9295edf6890f95eabaf5a8031246bc54e6e5b5 Author: Anton Laakso Date: Tue May 6 15:29:18 2025 +0300 re-implementation of CMIP6 stratospheric aerosols --- .../module/model_physics_aerosol_mod.F90 | 3 +- ifs-source/arpifs/module/yoeaerop.F90 | 46 +- ifs-source/arpifs/module/yoerad.F90 | 4 + ifs-source/arpifs/namelist/naerad.nam.h | 4 +- ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 | 4 +- .../arpifs/phys_ec/cmip_strato_aero.F90 | 922 ++++++++++++++++++ .../phys_ec/cmip_strato_aero_interp.F90 | 324 ++++++ .../phys_ec/cmip_strato_aero_process.F90 | 261 +++++ .../arpifs/phys_radi/radiation_scheme.F90 | 138 ++- ifs-source/arpifs/phys_radi/radintg.F90 | 9 +- ifs-source/arpifs/phys_radi/suecrad.F90 | 60 +- ifs-source/arpifs/utility/updtim.F90 | 11 +- .../module/radiation_aerosol_optics.F90 | 79 +- .../radiation/module/radiation_interface.F90 | 35 +- 14 files changed, 1824 insertions(+), 76 deletions(-) create mode 100755 ifs-source/arpifs/phys_ec/cmip_strato_aero.F90 create mode 100755 ifs-source/arpifs/phys_ec/cmip_strato_aero_interp.F90 create mode 100755 ifs-source/arpifs/phys_ec/cmip_strato_aero_process.F90 diff --git a/ifs-source/arpifs/module/model_physics_aerosol_mod.F90 b/ifs-source/arpifs/module/model_physics_aerosol_mod.F90 index eeb358a0..d85c817e 100644 --- a/ifs-source/arpifs/module/model_physics_aerosol_mod.F90 +++ b/ifs-source/arpifs/module/model_physics_aerosol_mod.F90 @@ -16,7 +16,7 @@ MODULE MODEL_PHYSICS_AEROSOL_MOD USE YOEAERSNK, ONLY : TEAERSNK USE YOEAERSRC, ONLY : TEAERSRC USE YOEAERVOL, ONLY : TEAERVOL - USE YOEAEROP, ONLY : TEAERM7 + USE YOEAEROP, ONLY : TEAERM7,TEAEROCMIPSTRAT USE YOEDBUG, ONLY : TEDBUG IMPLICIT NONE @@ -30,6 +30,7 @@ MODULE MODEL_PHYSICS_AEROSOL_MOD TYPE(TEAERVOL) :: YREAERVOL !! volcanic aerosols TYPE(TEDBUG) :: YREDBUG !! aerosol debugging help TYPE(TEAERM7) :: YREAEROPT !! M7 aerosol optical properties + TYPE(TEAEROCMIPSTRAT):: YREAEROSTRAT !! cmip6 and cmip7 stratospheric aerosols CONTAINS diff --git a/ifs-source/arpifs/module/yoeaerop.F90 b/ifs-source/arpifs/module/yoeaerop.F90 index b5c06895..0c8fb6d4 100644 --- a/ifs-source/arpifs/module/yoeaerop.F90 +++ b/ifs-source/arpifs/module/yoeaerop.F90 @@ -10,7 +10,7 @@ MODULE YOEAEROP -USE PARKIND1 ,ONLY : JPRB +USE PARKIND1 ,ONLY : JPRB, JPIM IMPLICIT NONE @@ -48,16 +48,6 @@ MODULE YOEAEROP REAL(KIND=JPRB) :: ALFL_SS(12,16,3), ASYL_SS(12,16,3), OMGL_SS(12,16,3) REAL(KIND=JPRB) :: ALFL_SU(12,16) , ASYL_SU(12,16) , OMGL_SU(12,16) - -! M7 aerosol optical properties -TYPE:: TEAERM7 - -REAL(KIND=JPRB), ALLOCATABLE, PUBLIC :: M7AOD(:,:,:,:) -REAL(KIND=JPRB), ALLOCATABLE, PUBLIC :: M7SSA(:,:,:,:) -REAL(KIND=JPRB), ALLOCATABLE, PUBLIC :: M7ASYM(:,:,:,:) -REAL(KIND=JPRB), ALLOCATABLE, PUBLIC :: M7AODLW(:,:,:,:) - -END TYPE TEAERM7 ! ------------------------------------------------------------------ ! 9 refers to up to 9 bins (3 operationally for SS and DD) ! 20 to 19 SW channel radiances + 1 channel at 10 micron @@ -78,5 +68,39 @@ MODULE YOEAEROP ! OMG is pizero, the single scattering albedo ND ! RALI is the lidar ratio ND ! ------------------------------------------------------------------ + +!CMIP6/7 Stratospheric aerosols +INTEGER(KIND=JPIM), PARAMETER :: STRATO_CMIP_NLAT = 36 +INTEGER(KIND=JPIM), PARAMETER :: STRATO_CMIP_NSB = 14 +INTEGER(KIND=JPIM), PARAMETER :: STRATO_CMIP_NTB = 16 +INTEGER(KIND=JPIM), PARAMETER :: STRATO_CMIP_NMONTH = 3 +REAL(KIND=JPRB), DIMENSION(STRATO_CMIP_NLAT):: STRATO_CMIP_LAT +REAL(KIND=JPRB), DIMENSION(STRATO_CMIP_NSB) :: STRATO_CMIP_SB +REAL(KIND=JPRB), DIMENSION(STRATO_CMIP_NTB) :: STRATO_CMIP_TB +INTEGER(KIND=JPIM) :: STRATO_CMIP_NALT, STRATO_FIRSTYEAR, STRATO_LASTYEAR, STRATO_CMIP_NTIME + +REAL(KIND=JPRB) :: CHECK_SUN_MEAN = -9999._JPRB, CHECK_EARTH_MEAN = -9999._JPRB + +TYPE:: TEAEROCMIPSTRAT + REAL(KIND=JPRB), PUBLIC, ALLOCATABLE, DIMENSION(:) :: STRATO_CMIP_ALT + REAL(KIND=JPRB), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:,:) :: AOD_SUN, AAOD_SUN, REFAOD_SUN + REAL(KIND=JPRB), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:,:) :: AAOD_EARTH + REAL(KIND=JPRB), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:) :: AOD_SUN_MEAN, AAOD_SUN_MEAN, REFAOD_SUN_MEAN + REAL(KIND=JPRB), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:) :: AAOD_EARTH_MEAN + ! Stratospheric aerosol optical properties + REAL(KIND=JPRB), ALLOCATABLE, PUBLIC :: STRAT_AOD(:,:,:,:,:) + REAL(KIND=JPRB), ALLOCATABLE, PUBLIC :: STRAT_AAOD(:,:,:,:,:) + REAL(KIND=JPRB), ALLOCATABLE, PUBLIC :: STRAT_REFAOD(:,:,:,:,:) + REAL(KIND=JPRB), ALLOCATABLE, PUBLIC :: STRAT_AAOD_LW(:,:,:,:,:) +END TYPE TEAEROCMIPSTRAT + +! M7 aerosol optical properties +TYPE:: TEAERM7 + REAL(KIND=JPRB), ALLOCATABLE, PUBLIC :: M7AOD(:,:,:,:) + REAL(KIND=JPRB), ALLOCATABLE, PUBLIC :: M7SSA(:,:,:,:) + REAL(KIND=JPRB), ALLOCATABLE, PUBLIC :: M7ASYM(:,:,:,:) + REAL(KIND=JPRB), ALLOCATABLE, PUBLIC :: M7AODLW(:,:,:,:) +END TYPE TEAERM7 + END MODULE YOEAEROP diff --git a/ifs-source/arpifs/module/yoerad.F90 b/ifs-source/arpifs/module/yoerad.F90 index d40786ad..599615b3 100644 --- a/ifs-source/arpifs/module/yoerad.F90 +++ b/ifs-source/arpifs/module/yoerad.F90 @@ -142,6 +142,10 @@ MODULE YOERAD ! Look-up table for Planck function in emissivity intervals TYPE(TSPECTRALPLANCK) :: YSPECTPLANCK +!CMIP6/7 Stratospheric aerosols +CHARACTER(LEN=500) :: CCMIP_STRAT_FULL, CCMIP_STRAT_FULL_CLIM +LOGICAL :: LSTRATAERO_UPDATED, LCMIP_STRATAER_CMIP6, LCMIP_STRATAER_CMIP7, LCMIP_STRATAER_BCKGD + INTEGER :: NCLOUDACT INTEGER :: NAEROOPT diff --git a/ifs-source/arpifs/namelist/naerad.nam.h b/ifs-source/arpifs/namelist/naerad.nam.h index 537414ce..cb00198a 100644 --- a/ifs-source/arpifs/namelist/naerad.nam.h +++ b/ifs-source/arpifs/namelist/naerad.nam.h @@ -44,6 +44,8 @@ NAMELIST/NAERAD/& &, NCLOUDOVERLAP, NDUMPINPUTS & &, RCLOUD_SEPARATION_SCALE_TOA, RCLOUD_SEPARATION_SCALE_SURF & &, CGHGCLIMFILE, CGHGTIMESERIESFILE, CSOLARIRRADIANCEFILE & -&, NCLOUDACT, NAEROOPT +&, LCMIP_STRATAER_CMIP6,LCMIP_STRATAER_CMIP7 & +&, LCMIP_STRATAER_BCKGD, CCMIP_STRAT_FULL & +&, CCMIP_STRAT_FULL_CLIM, NCLOUDACT, NAEROOPT ! ----------------------------------------------------------------- diff --git a/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 b/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 index 1632f2a1..338951be 100644 --- a/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 +++ b/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 @@ -198,8 +198,6 @@ SUBROUTINE AER_PHY3_LAYER(YDSURF, & IBLK=(KDIM%KSTGLO-1)/KDIM%KLON + 1 - ! FIXME Better than 1:14 is to define a variable with value 14 with a - ! meaningful name (RCHG) DO JAER=1,YDMODEL%YRML_PHY_RAD%YRERAD%NTSW DO JK=1,KDIM%KLEV DO JL=KDIM%KIDIA,KDIM%KFDIA @@ -209,7 +207,7 @@ SUBROUTINE AER_PHY3_LAYER(YDSURF, & ENDDO ENDDO ENDDO - DO JAER=1,16 + DO JAER=1,16 !FIXME this needs better variable DO JK=1,KDIM%KLEV DO JL=KDIM%KIDIA,KDIM%KFDIA GEMSL%ZAEROTAULW(JL,JK,JAER) = YDAERM7%M7AODLW(JL,JK,JAER,IBLK) diff --git a/ifs-source/arpifs/phys_ec/cmip_strato_aero.F90 b/ifs-source/arpifs/phys_ec/cmip_strato_aero.F90 new file mode 100755 index 00000000..77618900 --- /dev/null +++ b/ifs-source/arpifs/phys_ec/cmip_strato_aero.F90 @@ -0,0 +1,922 @@ +SUBROUTINE CMIP_STRATO_AERO(YDMODEL) + +! PURPOSE. +! -------- +! Read stratospheric aerosol from CMIP6/CMIP7 + +! INTERFACE. +! ---------- +! CALL *CMIP_STRATO_AERO* FROM *UPDTIM* + +! AUTHOR. +! ------- +! M.Ménégoz for EC-EARTH 2017 +! A.Laakso for EC-EARTH4/OIFS 2022 +! A.Laakso for OIFS48 2025 CMIP6 and CMIP7 + +! Reading the CMIP stratospheric aerosol dataset. +! The vertical interpolation of this data is done off-line. + +! Horizontal and time interpolation are done in +! cmip_strato_aero_interp.F90 and cmip_strato_aero_process.F90 + +! The data is read with a broadcast approach. +! Forcing in the SW (AOD_SUN, AAOD_SUN, REF_AOD_SUN) and in the LW +! (AAOD_EARTH) + +! Note: The code has not been tested in longer simulations, especially at the threshold year +! of historical and future climatological aerosols. +! Please contact anton.laakso@fmi.fi if you experience any issues. + +! MODIFICATIONS. +! -------------- + +!--------------------------------------------------------------------- + +! Modules +USE NETCDF +USE PARKIND1, ONLY: JPIM, JPRB, JPRD +USE YOMLUN, ONLY: NULOUT, NULERR +USE YOMRIP0, ONLY: NINDAT +USE YOEAEROP, ONLY :STRATO_FIRSTYEAR, STRATO_CMIP_NLAT, STRATO_CMIP_NALT, STRATO_CMIP_NTIME, & + & STRATO_LASTYEAR, STRATO_CMIP_LAT, STRATO_CMIP_SB, STRATO_CMIP_TB,& + & STRATO_CMIP_NSB, STRATO_CMIP_NTB, & + & STRATO_CMIP_NMONTH, & + & CHECK_SUN_MEAN, CHECK_EARTH_MEAN +USE YOMMP0, ONLY: MYPROC +USE MPL_MODULE, ONLY: MPL_BROADCAST +USE TYPE_MODEL, ONLY: MODEL +USE YOMHOOK, ONLY: LHOOK, DR_HOOK, JPHOOK + +IMPLICIT NONE + +TYPE(MODEL), INTENT(INOUT) :: YDMODEL +! Local variables +INTEGER :: IUNIT,FORC_MONTH +INTEGER(KIND=JPIM) :: ILAT, ILEV, ILON, IMONTH,IB, JLEV +INTEGER(KIND=JPIM) :: IJ0, IM0, IA0, IDAY, IMON, IMODYR, ILMOIS(12) +INTEGER(KIND=JPIM) :: IYR1, IMV1 +INTEGER(KIND=JPIM), SAVE :: IMONOLD=-999 +INTEGER(KIND=JPIM), PARAMETER :: ITAG = 98684 +INTEGER(KIND=JPIM), PARAMETER :: RPRC = 1 + +REAL(KIND=JPRB) :: TIME(STRATO_CMIP_NTIME) +CHARACTER (LEN=*), PARAMETER :: LAT_NAME='latitude' +CHARACTER (LEN=*), PARAMETER :: ALT_NAME='altitude' +CHARACTER (LEN=*), PARAMETER :: TIME_NAME='month' +CHARACTER (LEN=*), PARAMETER :: SB_NAME='solar_bands' +CHARACTER (LEN=*), PARAMETER :: TB_NAME='terrestrial_bands' +INTEGER :: LAT_VARID, ALT_VARID, TIME_VARID, SB_VARID, TB_VARID, IOS +LOGICAL :: LLOPEN, LLSTRAT, LLOPENC,LLSTRATC + +! Triplets of variable for SW and only absorption for LW (because IFS +! is currently not considering aerosol scattering in the LW): + +CHARACTER (LEN=*), PARAMETER :: AOD_SUN_NAME='AOD_sun' +INTEGER :: AOD_SUN_VARID +REAL(KIND=JPRB), ALLOCATABLE :: AOD_SUN_ORIG(:,:,:,:) + +CHARACTER (LEN=*), PARAMETER :: AAOD_SUN_NAME='AAOD_sun' +INTEGER :: AAOD_SUN_VARID +REAL(KIND=JPRB), ALLOCATABLE :: AAOD_SUN_ORIG(:,:,:,:) + +CHARACTER (LEN=*), PARAMETER :: REFAOD_SUN_NAME='REFAOD_sun' +INTEGER :: REFAOD_SUN_VARID +REAL(KIND=JPRB), ALLOCATABLE :: REFAOD_SUN_ORIG(:,:,:,:) + +CHARACTER (LEN=*), PARAMETER :: AAOD_EARTH_NAME='AAOD_earth' +INTEGER :: AAOD_EARTH_VARID +REAL(KIND=JPRB), ALLOCATABLE :: AAOD_EARTH_ORIG(:,:,:,:) + +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE + +! Read the nectdf data with an adequate format and order. +INTEGER, DIMENSION(4) :: START, FINAL, FINAL_LW, FINAL_MEAN, FINAL_LW_MEAN + +!REAL, POINTER :: AOD_SUN(:,:,:,:), REFAOD_SUN(:,:,:,:), AOD_SUN_MEAN(:,:,:,:), AAOD_SUN_MEAN(:,:,:,:) +!REAL, POINTER :: AAOD_EARTH_MEAN(:,:,:,:), AAOD_EARTH(:,:,:,:) + +!#include "netcdf.inc" +#include "abor1.intfb.h" +#include "updcal.intfb.h" +#include "fcttim.func.h" + +IF (LHOOK) CALL DR_HOOK('CMIP_STRATO_AERO',0,ZHOOK_HANDLE) + +WRITE(NULOUT,*)'Entering Subroutine CMIP_STRATO_AERO' + +ASSOCIATE(& + & YDERAD=>YDMODEL%YRML_PHY_RAD%YRERAD, YDPHYAER => YDMODEL%YRML_PHY_AER, & + & YDRIP=>YDMODEL%YRML_GCONF%YRRIP& + ) + +ASSOCIATE(& + & YDAERSTRAT => YDPHYAER%YREAEROSTRAT & + ) + +ASSOCIATE(& + & LSTRATAERO_UPDATED=>YDERAD%LSTRATAERO_UPDATED, CCMIP_STRAT_FULL=>YDERAD%CCMIP_STRAT_FULL, & + & CCMIP_STRAT_FULL_CLIM=>YDERAD%CCMIP_STRAT_FULL_CLIM, & + & LCMIP_STRATAER_BCKGD =>YDERAD%LCMIP_STRATAER_BCKGD, & + & LCMIP_STRATAER_CMIP6 =>YDERAD%LCMIP_STRATAER_CMIP6, & + & LCMIP_STRATAER_CMIP7 =>YDERAD%LCMIP_STRATAER_CMIP7 & + ) + + ASSOCIATE(& + & AOD_SUN=>YDAERSTRAT%AOD_SUN,AAOD_SUN=>YDAERSTRAT%AAOD_SUN,REFAOD_SUN=>YDAERSTRAT%REFAOD_SUN, & + & AOD_SUN_MEAN=>YDAERSTRAT%AOD_SUN_MEAN, AAOD_SUN_MEAN=>YDAERSTRAT%AAOD_SUN_MEAN,REFAOD_SUN_MEAN=>YDAERSTRAT%REFAOD_SUN_MEAN, & + & AAOD_EARTH_MEAN=>YDAERSTRAT%AAOD_EARTH_MEAN, AAOD_EARTH=>YDAERSTRAT%AAOD_EARTH& + ) + + +! What is the date please? +IJ0=NDD(NINDAT) +IM0=NMM(NINDAT) +IA0=NCCAA(NINDAT) +CALL UPDCAL(IJ0,IM0,IA0,YDRIP%NSTADD,IDAY,IMON,IMODYR,ILMOIS,NULOUT) + +! Open the file only if we begin a new month and I am the master process +IF (IMON/=IMONOLD) THEN + IMONOLD=IMON + + IF (MYPROC==RPRC) THEN + + ! Forcing file includes 1980 months since 01/1850 for CMIP7 and + FORC_MONTH=(IMODYR-STRATO_FIRSTYEAR)*12+IMON + WRITE(NULOUT,*)'CMIP_STRATO_AERO; FORCING MONTH = ',FORC_MONTH,'/1980, starting from the year 1850' + + WRITE(NULOUT,*) 'CCMIP_STRAT_FULL: ',TRIM(CCMIP_STRAT_FULL) + + LLOPEN=.FALSE. + IOS= 0 + INQUIRE(FILE=CCMIP_STRAT_FULL,IOSTAT=IOS,EXIST=LLSTRAT,OPENED=LLOPEN) + LLSTRAT = LLSTRAT .AND. (IOS == 0) .AND. .NOT.LLOPEN + + IF (.NOT.LLSTRAT) THEN + WRITE(NULERR,'('' ERROR IN CMIP_STRATO_AERO.F90 :'',& + & '' THE FORCING FILE IS NOT AVAILABLE !'')') + CALL ABOR1('CMIP_STRATO_AERO') + ENDIF + + IF (IMODYR>=STRATO_FIRSTYEAR .AND. IMODYR<=STRATO_LASTYEAR .AND. .NOT. LCMIP_STRATAER_BCKGD .AND. FORC_MONTH/=1 .AND. FORC_MONTH/=STRATO_CMIP_NTIME) THEN + + START=(/1, 1, 1, FORC_MONTH-1/) + FINAL=(/STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NMONTH/) + FINAL_LW=(/STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NMONTH/) + + ! Allocate temporary arrays + ALLOCATE(AOD_SUN_ORIG (STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NMONTH)) + ALLOCATE(AAOD_SUN_ORIG (STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NMONTH)) + ALLOCATE(REFAOD_SUN_ORIG(STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NMONTH)) + ALLOCATE(AAOD_EARTH_ORIG(STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NMONTH)) + + ! Initialise arrays: + AOD_SUN_ORIG(:,:,:,:)=0._JPRB + AAOD_SUN_ORIG(:,:,:,:)=0._JPRB + REFAOD_SUN_ORIG(:,:,:,:)=0._JPRB + AAOD_EARTH_ORIG(:,:,:,:)=0._JPRB + + ! OPEN NETCDF FILE + CALL CHECK( NF90_OPEN(CCMIP_STRAT_FULL,NF90_NOWRITE,IUNIT) ) + + ! Reading latitudes needed for the interpolation. + CALL CHECK( NF90_INQ_VARID(IUNIT, LAT_NAME, LAT_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, LAT_VARID, STRATO_CMIP_LAT) ) + + ! READ 4-D FIELDS + CALL CHECK( NF90_INQ_VARID(IUNIT, AOD_SUN_NAME, AOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AOD_SUN_VARID, AOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_SUN_NAME, AAOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_SUN_VARID, AAOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, REFAOD_SUN_NAME, REFAOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, REFAOD_SUN_VARID, REFAOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_EARTH_NAME, AAOD_EARTH_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_EARTH_VARID, AAOD_EARTH_ORIG, START, FINAL_LW) ) + + ! CLOSE NETCDF FILE + CALL CHECK( NF90_CLOSE(IUNIT) ) + + ! Fill the data for the current month and reorder the arrays + DO ILEV=1,STRATO_CMIP_NALT + JLEV=STRATO_CMIP_NALT-ILEV+1 + DO ILAT=1,STRATO_CMIP_NLAT + ! SW parameters + DO IB=1,STRATO_CMIP_NSB + ! We keep three months to make a smoothed forcing (linear interpolation along the axis time) + DO IMONTH=1,STRATO_CMIP_NMONTH + + AOD_SUN(ILEV,ILAT,IB,IMONTH)=AOD_SUN_ORIG(IB,ILAT,JLEV,IMONTH) + AAOD_SUN(ILEV,ILAT,IB,IMONTH)=AAOD_SUN_ORIG(IB,ILAT,JLEV,IMONTH) + REFAOD_SUN(ILEV,ILAT,IB,IMONTH)=REFAOD_SUN_ORIG(IB,ILAT,JLEV,IMONTH) + + ENDDO + ENDDO + ! LW parameter + DO IB=1,STRATO_CMIP_NTB + DO IMONTH=1,STRATO_CMIP_NMONTH + AAOD_EARTH(ILEV,ILAT,IB,IMONTH)=AAOD_EARTH_ORIG(IB,ILAT,JLEV,IMONTH) + ENDDO + ENDDO + ENDDO + ENDDO + + DEALLOCATE(AOD_SUN_ORIG ) + DEALLOCATE(AAOD_SUN_ORIG ) + DEALLOCATE(REFAOD_SUN_ORIG) + DEALLOCATE(AAOD_EARTH_ORIG) + + ELSE IF (.NOT. LCMIP_STRATAER_BCKGD .AND. LCMIP_STRATAER_CMIP6 & + &.AND. (FORC_MONTH==1 .OR. FORC_MONTH==STRATO_CMIP_NTIME)) THEN + IF(LCMIP_STRATAER_CMIP6) THEN + WRITE(NULOUT,*)'CMIP_STRATO_AERO; computing climatological stratospherical forcing' + + START=(/1, 1, 1, 1/) + FINAL=(/STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME/) + FINAL_LW=(/STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME/) + + ! Allocate temporary arrays + ALLOCATE(AOD_SUN_ORIG (STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME)) + ALLOCATE(AAOD_SUN_ORIG(STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME)) + ALLOCATE(REFAOD_SUN_ORIG(STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME)) + ALLOCATE(AAOD_EARTH_ORIG(STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME)) + + ! Initialise arrays: + AOD_SUN_ORIG(:,:,:,:)=0._JPRB + AAOD_SUN_ORIG(:,:,:,:)=0._JPRB + REFAOD_SUN_ORIG(:,:,:,:)=0._JPRB + AAOD_EARTH_ORIG(:,:,:,:)=0._JPRB + + ! OPEN NETCDF FILE + CALL CHECK( NF90_OPEN(CCMIP_STRAT_FULL,NF90_NOWRITE,IUNIT) ) + + ! Reading latitudes needed for the interpolation. + CALL CHECK( NF90_INQ_VARID(IUNIT, LAT_NAME, LAT_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, LAT_VARID, STRATO_CMIP_LAT) ) + + ! READ 4-D FIELDS + CALL CHECK( NF90_INQ_VARID(IUNIT, AOD_SUN_NAME, AOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AOD_SUN_VARID, AOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_SUN_NAME, AAOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_SUN_VARID, AAOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, REFAOD_SUN_NAME, REFAOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, REFAOD_SUN_VARID, REFAOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_EARTH_NAME, AAOD_EARTH_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_EARTH_VARID, AAOD_EARTH_ORIG, START, FINAL_LW) ) + + ! CLOSE NETCDF FILE + CALL CHECK( NF90_CLOSE(IUNIT) ) + + ! Climatology computed on-line, only one time. + WRITE(NULOUT,*)'CMIP_STRATO_AERO; transition between climatological and time-resolved stratospherical forcing' + DO ILEV=1,STRATO_CMIP_NALT + JLEV=STRATO_CMIP_NALT-ILEV+1 + DO ILAT=1,STRATO_CMIP_NLAT + ! SW parameters + DO IB=1,STRATO_CMIP_NSB + + AOD_SUN_MEAN(ILEV,ILAT,IB)=SUM(AOD_SUN_ORIG(IB,ILAT,JLEV,:))/STRATO_CMIP_NTIME + AAOD_SUN_MEAN(ILEV,ILAT,IB)=SUM(AAOD_SUN_ORIG(IB,ILAT,JLEV,:))/STRATO_CMIP_NTIME + REFAOD_SUN_MEAN(ILEV,ILAT,IB)=SUM(REFAOD_SUN_ORIG(IB,ILAT,JLEV,:))/STRATO_CMIP_NTIME + + IF (FORC_MONTH==1) THEN + + AOD_SUN(ILEV,ILAT,IB,1)=AOD_SUN_MEAN(ILEV,ILAT,IB) + AAOD_SUN(ILEV,ILAT,IB,1)=AAOD_SUN_MEAN(ILEV,ILAT,IB) + REFAOD_SUN(ILEV,ILAT,IB,1)=REFAOD_SUN_MEAN(ILEV,ILAT,IB) + + DO IMONTH=2,STRATO_CMIP_NMONTH + AOD_SUN(ILEV,ILAT,IB,IMONTH)=AOD_SUN_ORIG(IB,ILAT,JLEV,IMONTH-1) + AAOD_SUN(ILEV,ILAT,IB,IMONTH)=AAOD_SUN_ORIG(IB,ILAT,JLEV,IMONTH-1) + REFAOD_SUN(ILEV,ILAT,IB,IMONTH)=REFAOD_SUN_ORIG(IB,ILAT,JLEV,IMONTH-1) + ENDDO + + ELSE IF (FORC_MONTH==STRATO_CMIP_NTIME) THEN + + AOD_SUN(ILEV,ILAT,IB,STRATO_CMIP_NMONTH)=AOD_SUN_MEAN(ILEV,ILAT,IB) + AAOD_SUN(ILEV,ILAT,IB,STRATO_CMIP_NMONTH)=AAOD_SUN_MEAN(ILEV,ILAT,IB) + REFAOD_SUN(ILEV,ILAT,IB,STRATO_CMIP_NMONTH)=REFAOD_SUN_MEAN(ILEV,ILAT,IB) + DO IMONTH=1,STRATO_CMIP_NMONTH-1 + AOD_SUN(ILEV,ILAT,IB,IMONTH)=AOD_SUN_ORIG(IB,ILAT,JLEV,STRATO_CMIP_NTIME+IMONTH-2) + AAOD_SUN(ILEV,ILAT,IB,IMONTH)=AAOD_SUN_ORIG(IB,ILAT,JLEV,STRATO_CMIP_NTIME+IMONTH-2) + REFAOD_SUN(ILEV,ILAT,IB,IMONTH)=REFAOD_SUN_ORIG(IB,ILAT,JLEV,STRATO_CMIP_NTIME+IMONTH-2) + ENDDO + + ENDIF + ENDDO + + ! LW parameters + DO IB=1,STRATO_CMIP_NTB + AAOD_EARTH_MEAN(ILEV,ILAT,IB)=SUM(AAOD_EARTH_ORIG(IB,ILAT,JLEV,:))/STRATO_CMIP_NTIME + IF (FORC_MONTH==1) THEN + AAOD_EARTH(ILEV,ILAT,IB,1)=AAOD_EARTH_MEAN(ILEV,ILAT,IB) + DO IMONTH=2,STRATO_CMIP_NMONTH + AAOD_EARTH(ILEV,ILAT,IB,IMONTH)=AAOD_EARTH_ORIG(IB,ILAT,JLEV,IMONTH-1) + ENDDO + ELSE IF (FORC_MONTH==STRATO_CMIP_NTIME) THEN + AAOD_EARTH(ILEV,ILAT,IB,STRATO_CMIP_NMONTH)=AAOD_EARTH_MEAN(ILEV,ILAT,IB) + DO IMONTH=1,STRATO_CMIP_NMONTH-1 + AAOD_EARTH(ILEV,ILAT,IB,IMONTH)=AAOD_EARTH_ORIG(IB,ILAT,JLEV,STRATO_CMIP_NTIME+IMONTH-2) + ENDDO + ENDIF + ENDDO + + ENDDO + ENDDO + + DEALLOCATE(AOD_SUN_ORIG ) + DEALLOCATE(AAOD_SUN_ORIG ) + DEALLOCATE(REFAOD_SUN_ORIG) + DEALLOCATE(AAOD_EARTH_ORIG) + + ELSEIF(LCMIP_STRATAER_CMIP7) THEN + WRITE(NULOUT,*) 'CCMIP_STRAT_FULL: ',TRIM(CCMIP_STRAT_FULL_CLIM) + + LLOPEN=.FALSE. + IOS= 0 + INQUIRE(FILE=CCMIP_STRAT_FULL_CLIM,IOSTAT=IOS,EXIST=LLSTRATC,OPENED=LLOPENC) + LLSTRATC = LLSTRATC .AND. (IOS == 0) .AND. .NOT.LLOPENC + + IF (.NOT.LLSTRATC) THEN + WRITE(NULERR,'('' ERROR IN CMIP_STRATO_AERO.F90 :'',& + & '' THE CLIMATOLOGICAL FORCING FILE IS NOT AVAILABLE !'')') + CALL ABOR1('CMIP_STRATO_AERO') + ENDIF + IF (FORC_MONTH==1) THEN + START=(/1, 1, 1, 1/) + FINAL=(/STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,2/) + FINAL_LW=(/STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,2/) + + ! Allocate temporary arrays + ALLOCATE(AOD_SUN_ORIG (STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,2)) + ALLOCATE(AAOD_SUN_ORIG(STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,2)) + ALLOCATE(REFAOD_SUN_ORIG(STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,2)) + ALLOCATE(AAOD_EARTH_ORIG(STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,2)) + + ! Initialise arrays: + AOD_SUN_ORIG(:,:,:,:)=0._JPRB + AAOD_SUN_ORIG(:,:,:,:)=0._JPRB + REFAOD_SUN_ORIG(:,:,:,:)=0._JPRB + AAOD_EARTH_ORIG(:,:,:,:)=0._JPRB + + ! OPEN NETCDF FILE + CALL CHECK( NF90_OPEN(CCMIP_STRAT_FULL,NF90_NOWRITE,IUNIT) ) + + ! Reading latitudes needed for the interpolation. + CALL CHECK( NF90_INQ_VARID(IUNIT, LAT_NAME, LAT_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, LAT_VARID, STRATO_CMIP_LAT) ) + + ! READ 4-D FIELDS + CALL CHECK( NF90_INQ_VARID(IUNIT, AOD_SUN_NAME, AOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AOD_SUN_VARID, AOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_SUN_NAME, AAOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_SUN_VARID, AAOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, REFAOD_SUN_NAME, REFAOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, REFAOD_SUN_VARID, REFAOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_EARTH_NAME, AAOD_EARTH_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_EARTH_VARID, AAOD_EARTH_ORIG, START, FINAL_LW) ) + + ! CLOSE NETCDF FILE + CALL CHECK( NF90_CLOSE(IUNIT) ) + + DO ILEV=1,STRATO_CMIP_NALT + JLEV=STRATO_CMIP_NALT-ILEV+1 + DO ILAT=1,STRATO_CMIP_NLAT + ! SW parameters + DO IB=1,STRATO_CMIP_NSB + ! We keep three months to make a smoothed forcing (linear interpolation along the axis time) + + DO IMONTH=2,STRATO_CMIP_NMONTH + + AOD_SUN(ILEV,ILAT,IB,IMONTH)=AOD_SUN_ORIG(IB,ILAT,JLEV,IMONTH-1) + AAOD_SUN(ILEV,ILAT,IB,IMONTH)=AAOD_SUN_ORIG(IB,ILAT,JLEV,IMONTH-1) + REFAOD_SUN(ILEV,ILAT,IB,IMONTH)=REFAOD_SUN_ORIG(IB,ILAT,JLEV,IMONTH-1) + + ENDDO + ENDDO + ! LW parameter + DO IB=1,STRATO_CMIP_NTB + DO IMONTH=2,STRATO_CMIP_NMONTH + AAOD_EARTH(ILEV,ILAT,IB,IMONTH)=AAOD_EARTH_ORIG(IB,ILAT,JLEV,IMONTH-1) + ENDDO + ENDDO + ENDDO + ENDDO + DEALLOCATE(AOD_SUN_ORIG ) + DEALLOCATE(AAOD_SUN_ORIG ) + DEALLOCATE(REFAOD_SUN_ORIG) + DEALLOCATE(AAOD_EARTH_ORIG) + + !Climatological file + START=(/1, 1, 1, 12/) + FINAL=(/STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,12/) + FINAL_LW=(/STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,12/) + + ! Allocate temporary arrays + ALLOCATE(AOD_SUN_ORIG (STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,1)) + ALLOCATE(AAOD_SUN_ORIG(STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,1)) + ALLOCATE(REFAOD_SUN_ORIG(STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,1)) + ALLOCATE(AAOD_EARTH_ORIG(STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,1)) + + ! Initialise arrays: + AOD_SUN_ORIG(:,:,:,:)=0._JPRB + AAOD_SUN_ORIG(:,:,:,:)=0._JPRB + REFAOD_SUN_ORIG(:,:,:,:)=0._JPRB + AAOD_EARTH_ORIG(:,:,:,:)=0._JPRB + + ! OPEN NETCDF FILE + CALL CHECK( NF90_OPEN(CCMIP_STRAT_FULL_CLIM,NF90_NOWRITE,IUNIT) ) + + ! Reading latitudes needed for the interpolation. + CALL CHECK( NF90_INQ_VARID(IUNIT, LAT_NAME, LAT_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, LAT_VARID, STRATO_CMIP_LAT) ) + + ! READ 4-D FIELDS + CALL CHECK( NF90_INQ_VARID(IUNIT, AOD_SUN_NAME, AOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AOD_SUN_VARID, AOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_SUN_NAME, AAOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_SUN_VARID, AAOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, REFAOD_SUN_NAME, REFAOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, REFAOD_SUN_VARID, REFAOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_EARTH_NAME, AAOD_EARTH_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_EARTH_VARID, AAOD_EARTH_ORIG, START, FINAL_LW) ) + + ! CLOSE NETCDF FILE + CALL CHECK( NF90_CLOSE(IUNIT) ) + DO ILEV=1,STRATO_CMIP_NALT + JLEV=STRATO_CMIP_NALT-ILEV+1 + DO ILAT=1,STRATO_CMIP_NLAT + ! SW parameters + DO IB=1,STRATO_CMIP_NSB + ! We keep three months to make a smoothed forcing (linear interpolation along the axis time) + + + + AOD_SUN(ILEV,ILAT,IB,1)=AOD_SUN_ORIG(IB,ILAT,JLEV,1) + AAOD_SUN(ILEV,ILAT,IB,1)=AAOD_SUN_ORIG(IB,ILAT,JLEV,1) + REFAOD_SUN(ILEV,ILAT,IB,1)=REFAOD_SUN_ORIG(IB,ILAT,JLEV,1) + + ENDDO + ! LW parameter + DO IB=1,STRATO_CMIP_NTB + + AAOD_EARTH(ILEV,ILAT,IB,1)=AAOD_EARTH_ORIG(IB,ILAT,JLEV,1) + ENDDO + ENDDO + ENDDO + DEALLOCATE(AOD_SUN_ORIG ) + DEALLOCATE(AAOD_SUN_ORIG ) + DEALLOCATE(REFAOD_SUN_ORIG) + DEALLOCATE(AAOD_EARTH_ORIG) + + ENDIF + ENDIF + !December 2023 + IF (FORC_MONTH==STRATO_CMIP_NTIME) THEN + START=(/1, 1, 1, STRATO_CMIP_NTIME-1/) + FINAL=(/STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME/) + FINAL_LW=(/STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME/) + + ! Allocate temporary arrays + ALLOCATE(AOD_SUN_ORIG (STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,2)) + ALLOCATE(AAOD_SUN_ORIG(STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,2)) + ALLOCATE(REFAOD_SUN_ORIG(STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,2)) + ALLOCATE(AAOD_EARTH_ORIG(STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,2)) + + ! Initialise arrays: + AOD_SUN_ORIG(:,:,:,:)=0._JPRB + AAOD_SUN_ORIG(:,:,:,:)=0._JPRB + REFAOD_SUN_ORIG(:,:,:,:)=0._JPRB + AAOD_EARTH_ORIG(:,:,:,:)=0._JPRB + + ! OPEN NETCDF FILE + CALL CHECK( NF90_OPEN(CCMIP_STRAT_FULL,NF90_NOWRITE,IUNIT) ) + + ! Reading latitudes needed for the interpolation. + CALL CHECK( NF90_INQ_VARID(IUNIT, LAT_NAME, LAT_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, LAT_VARID, STRATO_CMIP_LAT) ) + + ! READ 4-D FIELDS + CALL CHECK( NF90_INQ_VARID(IUNIT, AOD_SUN_NAME, AOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AOD_SUN_VARID, AOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_SUN_NAME, AAOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_SUN_VARID, AAOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, REFAOD_SUN_NAME, REFAOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, REFAOD_SUN_VARID, REFAOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_EARTH_NAME, AAOD_EARTH_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_EARTH_VARID, AAOD_EARTH_ORIG, START, FINAL_LW) ) + + ! CLOSE NETCDF FILE + CALL CHECK( NF90_CLOSE(IUNIT) ) + + DO ILEV=1,STRATO_CMIP_NALT + JLEV=STRATO_CMIP_NALT-ILEV+1 + DO ILAT=1,STRATO_CMIP_NLAT + ! SW parameters + DO IB=1,STRATO_CMIP_NSB + ! We keep three months to make a smoothed forcing (linear interpolation along the axis time) + + DO IMONTH=1,STRATO_CMIP_NMONTH-1 + + AOD_SUN(ILEV,ILAT,IB,IMONTH)=AOD_SUN_ORIG(IB,ILAT,JLEV,IMONTH) + AAOD_SUN(ILEV,ILAT,IB,IMONTH)=AAOD_SUN_ORIG(IB,ILAT,JLEV,IMONTH) + REFAOD_SUN(ILEV,ILAT,IB,IMONTH)=REFAOD_SUN_ORIG(IB,ILAT,JLEV,IMONTH) + + ENDDO + ENDDO + ! LW parameter + DO IB=1,STRATO_CMIP_NTB + DO IMONTH=1,STRATO_CMIP_NMONTH-1 + AAOD_EARTH(ILEV,ILAT,IB,IMONTH)=AAOD_EARTH_ORIG(IB,ILAT,JLEV,IMONTH) + ENDDO + ENDDO + ENDDO + ENDDO + DEALLOCATE(AOD_SUN_ORIG ) + DEALLOCATE(AAOD_SUN_ORIG ) + DEALLOCATE(REFAOD_SUN_ORIG) + DEALLOCATE(AAOD_EARTH_ORIG) + + !Climatological file + START=(/1, 1, 1, 1/) + FINAL=(/STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,1/) + FINAL_LW=(/STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,1/) + + ! Allocate temporary arrays + ALLOCATE(AOD_SUN_ORIG (STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,1)) + ALLOCATE(AAOD_SUN_ORIG(STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,1)) + ALLOCATE(REFAOD_SUN_ORIG(STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,1)) + ALLOCATE(AAOD_EARTH_ORIG(STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,1)) + + ! Initialise arrays: + AOD_SUN_ORIG(:,:,:,:)=0._JPRB + AAOD_SUN_ORIG(:,:,:,:)=0._JPRB + REFAOD_SUN_ORIG(:,:,:,:)=0._JPRB + AAOD_EARTH_ORIG(:,:,:,:)=0._JPRB + + ! OPEN NETCDF FILE + CALL CHECK( NF90_OPEN(CCMIP_STRAT_FULL_CLIM,NF90_NOWRITE,IUNIT) ) + + ! Reading latitudes needed for the interpolation. + CALL CHECK( NF90_INQ_VARID(IUNIT, LAT_NAME, LAT_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, LAT_VARID, STRATO_CMIP_LAT) ) + + ! READ 4-D FIELDS + CALL CHECK( NF90_INQ_VARID(IUNIT, AOD_SUN_NAME, AOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AOD_SUN_VARID, AOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_SUN_NAME, AAOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_SUN_VARID, AAOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, REFAOD_SUN_NAME, REFAOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, REFAOD_SUN_VARID, REFAOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_EARTH_NAME, AAOD_EARTH_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_EARTH_VARID, AAOD_EARTH_ORIG, START, FINAL_LW) ) + + ! CLOSE NETCDF FILE + CALL CHECK( NF90_CLOSE(IUNIT) ) + DO ILEV=1,STRATO_CMIP_NALT + JLEV=STRATO_CMIP_NALT-ILEV+1 + DO ILAT=1,STRATO_CMIP_NLAT + ! SW parameters + DO IB=1,STRATO_CMIP_NSB + ! We keep three months to make a smoothed forcing (linear interpolation along the axis time) + + + + AOD_SUN(ILEV,ILAT,IB,STRATO_CMIP_NMONTH)=AOD_SUN_ORIG(IB,ILAT,JLEV,1) + AAOD_SUN(ILEV,ILAT,IB,STRATO_CMIP_NMONTH)=AAOD_SUN_ORIG(IB,ILAT,JLEV,1) + REFAOD_SUN(ILEV,ILAT,IB,STRATO_CMIP_NMONTH)=REFAOD_SUN_ORIG(IB,ILAT,JLEV,1) + + ENDDO + ! LW parameter + DO IB=1,STRATO_CMIP_NTB + + AAOD_EARTH(ILEV,ILAT,IB,STRATO_CMIP_NMONTH)=AAOD_EARTH_ORIG(IB,ILAT,JLEV,1) + ENDDO + ENDDO + ENDDO + DEALLOCATE(AOD_SUN_ORIG ) + DEALLOCATE(AAOD_SUN_ORIG ) + DEALLOCATE(REFAOD_SUN_ORIG) + DEALLOCATE(AAOD_EARTH_ORIG) + + + ENDIF + + + + + + ENDIF !First month of 1750/1850 and last month of 2014/2023 + ELSE !(IMODYR<1850/1750 .OR. IMODYR>2014/2023 .OR. LCMIP_STRATAER_BCKGD) + IF(LCMIP_STRATAER_CMIP6) THEN + IF (MINVAL(AOD_SUN_MEAN)==CHECK_SUN_MEAN .OR. MINVAL(AAOD_SUN_MEAN)==CHECK_SUN_MEAN & + & .OR. MINVAL(REFAOD_SUN_MEAN)==CHECK_SUN_MEAN .OR. MINVAL(AAOD_EARTH_MEAN)==CHECK_EARTH_MEAN) THEN + + WRITE(NULOUT,*)'CMIP_STRATO_AERO; computing climatological stratospherical forcing' + + START=(/1, 1, 1, 1/) + FINAL=(/STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME/) + FINAL_LW=(/STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME/) + + ! Allocate temporary arrays + ALLOCATE(AOD_SUN_ORIG (STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME)) + ALLOCATE(AAOD_SUN_ORIG(STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME)) + ALLOCATE(REFAOD_SUN_ORIG(STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME)) + ALLOCATE(AAOD_EARTH_ORIG(STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME)) + + ! Initialise arrays: + AOD_SUN_ORIG(:,:,:,:)=0._JPRB + AAOD_SUN_ORIG(:,:,:,:)=0._JPRB + REFAOD_SUN_ORIG(:,:,:,:)=0._JPRB + AAOD_EARTH_ORIG(:,:,:,:)=0._JPRB + + ! OPEN NETCDF FILE + CALL CHECK( NF90_OPEN(CCMIP_STRAT_FULL,NF90_NOWRITE,IUNIT) ) + + ! Reading latitudes needed for the interpolation. + CALL CHECK( NF90_INQ_VARID(IUNIT, LAT_NAME, LAT_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, LAT_VARID, STRATO_CMIP_LAT) ) + + ! READ 4-D FIELDS + CALL CHECK( NF90_INQ_VARID(IUNIT, AOD_SUN_NAME, AOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AOD_SUN_VARID, AOD_SUN_ORIG, START, FINAL ) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_SUN_NAME, AAOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_SUN_VARID, AAOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, REFAOD_SUN_NAME, REFAOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, REFAOD_SUN_VARID, REFAOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_EARTH_NAME, AAOD_EARTH_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_EARTH_VARID, AAOD_EARTH_ORIG, START, FINAL_LW) ) + + ! CLOSE NETCDF FILE + CALL CHECK( NF90_CLOSE(IUNIT) ) + + ! Climatology computed on-line, only one time. + DO ILEV=1,STRATO_CMIP_NALT + JLEV=STRATO_CMIP_NALT-ILEV+1 + DO ILAT=1,STRATO_CMIP_NLAT + ! SW parameters + DO IB=1,STRATO_CMIP_NSB + AOD_SUN_MEAN(JLEV,ILAT,IB)=SUM(AOD_SUN_ORIG(IB,ILAT,ILEV,:))/STRATO_CMIP_NTIME + AAOD_SUN_MEAN(JLEV,ILAT,IB)=SUM(AAOD_SUN_ORIG(IB,ILAT,ILEV,:))/STRATO_CMIP_NTIME + REFAOD_SUN_MEAN(JLEV,ILAT,IB)=SUM(REFAOD_SUN_ORIG(IB,ILAT,ILEV,:))/STRATO_CMIP_NTIME + ENDDO + ! LW parameters + DO IB=1,STRATO_CMIP_NTB + AAOD_EARTH_MEAN(JLEV,ILAT,IB)=SUM(AAOD_EARTH_ORIG(IB,ILAT,ILEV,:))/STRATO_CMIP_NTIME + ENDDO + ENDDO + ENDDO + + DEALLOCATE(AOD_SUN_ORIG ) + DEALLOCATE(AAOD_SUN_ORIG ) + DEALLOCATE(REFAOD_SUN_ORIG) + DEALLOCATE(AAOD_EARTH_ORIG) + + ENDIF + + WRITE(NULOUT,*)'CMIP_STRATO_AERO; using climatological stratospherical forcing' + DO IMONTH=1,STRATO_CMIP_NMONTH + ! SW parameters + AOD_SUN(:,:,:,IMONTH)=AOD_SUN_MEAN(:,:,:) + AAOD_SUN(:,:,:,IMONTH)=AAOD_SUN_MEAN(:,:,:) + REFAOD_SUN(:,:,:,IMONTH)=REFAOD_SUN_MEAN(:,:,:) + ! LW parameters + AAOD_EARTH(:,:,:,IMONTH)=AAOD_EARTH_MEAN(:,:,:) + ENDDO + ENDIF + IF(LCMIP_STRATAER_CMIP7) THEN + + + LLOPEN=.FALSE. + IOS= 0 + INQUIRE(FILE=CCMIP_STRAT_FULL_CLIM,IOSTAT=IOS,EXIST=LLSTRATC,OPENED=LLOPENC) + LLSTRATC = LLSTRATC .AND. (IOS == 0) .AND. .NOT.LLOPENC + + IF (.NOT.LLSTRATC) THEN + WRITE(NULERR,'('' ERROR IN CMIP_STRATO_AERO.F90 :'',& + & '' THE CLIMATOLOGICAL FORCING FILE IS NOT AVAILABLE !'')') + CALL ABOR1('CMIP_STRATO_AERO') + ENDIF + + !Climatological file for CMIP7 - All months are readed + START=(/1, 1, 1, 1/) + FINAL=(/STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,12/) + FINAL_LW=(/STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,12/) + + ! Allocate temporary arrays + ALLOCATE(AOD_SUN_ORIG (STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,12)) + ALLOCATE(AAOD_SUN_ORIG (STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,12)) + ALLOCATE(REFAOD_SUN_ORIG(STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,12)) + ALLOCATE(AAOD_EARTH_ORIG(STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,12)) + + ! Initialise arrays: + AOD_SUN_ORIG(:,:,:,:)=0._JPRB + AAOD_SUN_ORIG(:,:,:,:)=0._JPRB + REFAOD_SUN_ORIG(:,:,:,:)=0._JPRB + AAOD_EARTH_ORIG(:,:,:,:)=0._JPRB + + ! OPEN NETCDF FILE + CALL CHECK( NF90_OPEN(CCMIP_STRAT_FULL_CLIM,NF90_NOWRITE,IUNIT) ) + + ! Reading latitudes needed for the interpolation. + CALL CHECK( NF90_INQ_VARID(IUNIT, LAT_NAME, LAT_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, LAT_VARID, STRATO_CMIP_LAT) ) + + ! READ 4-D FIELDS + CALL CHECK( NF90_INQ_VARID(IUNIT, AOD_SUN_NAME, AOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AOD_SUN_VARID, AOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_SUN_NAME, AAOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_SUN_VARID, AAOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, REFAOD_SUN_NAME, REFAOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, REFAOD_SUN_VARID, REFAOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_EARTH_NAME, AAOD_EARTH_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_EARTH_VARID, AAOD_EARTH_ORIG, START, FINAL_LW) ) + + ! CLOSE NETCDF FILE + CALL CHECK( NF90_CLOSE(IUNIT) ) + + ! Fill the data for the current month and reorder the arrays + IF (IMON==1)THEN + DO ILEV=1,STRATO_CMIP_NALT + JLEV=STRATO_CMIP_NALT-ILEV+1 + DO ILAT=1,STRATO_CMIP_NLAT + ! SW parameters + DO IB=1,STRATO_CMIP_NSB + ! We keep three months to make a smoothed forcing (linear interpolation along the axis time) + AOD_SUN(ILEV,ILAT,IB,1)=AOD_SUN_ORIG(IB,ILAT,JLEV,12) + AAOD_SUN(ILEV,ILAT,IB,1)=AAOD_SUN_ORIG(IB,ILAT,JLEV,12) + REFAOD_SUN(ILEV,ILAT,IB,1)=REFAOD_SUN_ORIG(IB,ILAT,JLEV,12) + DO IMONTH=2,STRATO_CMIP_NMONTH + + AOD_SUN(ILEV,ILAT,IB,IMONTH)=AOD_SUN_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) + AAOD_SUN(ILEV,ILAT,IB,IMONTH)=AAOD_SUN_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) + REFAOD_SUN(ILEV,ILAT,IB,IMONTH)=REFAOD_SUN_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) + + ENDDO + ENDDO + ! LW parameter + DO IB=1,STRATO_CMIP_NTB + AAOD_EARTH(ILEV,ILAT,IB,1)=AAOD_EARTH_ORIG(IB,ILAT,JLEV,12) + DO IMONTH=2,STRATO_CMIP_NMONTH + AAOD_EARTH(ILEV,ILAT,IB,IMONTH)=AAOD_EARTH_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) + ENDDO + ENDDO + ENDDO + ENDDO + + ELSEIF(IMON==12) THEN + DO ILEV=1,STRATO_CMIP_NALT + JLEV=STRATO_CMIP_NALT-ILEV+1 + DO ILAT=1,STRATO_CMIP_NLAT + ! SW parameters + DO IB=1,STRATO_CMIP_NSB + ! We keep three months to make a smoothed forcing (linear interpolation along the axis time) + + DO IMONTH=1,STRATO_CMIP_NMONTH-1 + + AOD_SUN(ILEV,ILAT,IB,IMONTH)=AOD_SUN_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) + AAOD_SUN(ILEV,ILAT,IB,IMONTH)=AAOD_SUN_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) + REFAOD_SUN(ILEV,ILAT,IB,IMONTH)=REFAOD_SUN_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) + + ENDDO + AOD_SUN(ILEV,ILAT,IB,STRATO_CMIP_NMONTH)=AOD_SUN_ORIG(IB,ILAT,JLEV,1) + AAOD_SUN(ILEV,ILAT,IB,STRATO_CMIP_NMONTH)=AAOD_SUN_ORIG(IB,ILAT,JLEV,1) + REFAOD_SUN(ILEV,ILAT,IB,STRATO_CMIP_NMONTH)=REFAOD_SUN_ORIG(IB,ILAT,JLEV,1) + ENDDO + ! LW parameter + DO IB=1,STRATO_CMIP_NTB + + DO IMONTH=1,STRATO_CMIP_NMONTH-1 + AAOD_EARTH(ILEV,ILAT,IB,IMONTH)=AAOD_EARTH_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) + ENDDO + AAOD_EARTH(ILEV,ILAT,IB,STRATO_CMIP_NMONTH)=AAOD_EARTH_ORIG(IB,ILAT,JLEV,1) + ENDDO + ENDDO + ENDDO + + ELSE + DO ILEV=1,STRATO_CMIP_NALT + JLEV=STRATO_CMIP_NALT-ILEV+1 + DO ILAT=1,STRATO_CMIP_NLAT + ! SW parameters + DO IB=1,STRATO_CMIP_NSB + ! We keep three months to make a smoothed forcing (linear interpolation along the axis time) + DO IMONTH=1,STRATO_CMIP_NMONTH + + AOD_SUN(ILEV,ILAT,IB,IMONTH)=AOD_SUN_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) + AAOD_SUN(ILEV,ILAT,IB,IMONTH)=AAOD_SUN_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) + REFAOD_SUN(ILEV,ILAT,IB,IMONTH)=REFAOD_SUN_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) + + ENDDO + ENDDO + ! LW parameter + DO IB=1,STRATO_CMIP_NTB + DO IMONTH=1,STRATO_CMIP_NMONTH + AAOD_EARTH(ILEV,ILAT,IB,IMONTH)=AAOD_EARTH_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) + ENDDO + ENDDO + ENDDO + ENDDO + ENDIF !IMON + DEALLOCATE(AOD_SUN_ORIG ) + DEALLOCATE(AAOD_SUN_ORIG ) + DEALLOCATE(REFAOD_SUN_ORIG) + DEALLOCATE(AAOD_EARTH_ORIG) + ENDIF !(IMODYR>=1850 .AND. IMODYR<=2014 .AND. .NOT. LCMIP_STRATAER_BCKGD) + + ENDIF ! (MYPROC==RPRC) + + CALL BROADCAST_AER_CMIP_PROP(YDMODEL) + LSTRATAERO_UPDATED = .TRUE. + +ELSE ! (IMON/=IMONOLD) + + WRITE(NULOUT,*)'Same month in CMIP_STRATO_AERO -> nothing to update ' + LSTRATAERO_UPDATED = .FALSE. + +ENDIF + +END ASSOCIATE +END ASSOCIATE +END ASSOCIATE +END ASSOCIATE + +IF (LHOOK) CALL DR_HOOK('CMIP_STRATO_AERO',1,ZHOOK_HANDLE) + +CONTAINS + + SUBROUTINE CHECK(STATUS) + INTEGER, INTENT ( IN) :: STATUS + + IF(STATUS /= NF90_NOERR) THEN + CALL ABOR1('CMIP_STRATO_AERO: '//TRIM(NF90_STRERROR(STATUS))) + END IF + END SUBROUTINE CHECK + +!-------------------------------------------------------------------------------------------------------------- + + SUBROUTINE BROADCAST_AER_CMIP_PROP(YDMODEL) + !--- inherited types, functions and data + USE YOMHOOK, ONLY: LHOOK, DR_HOOK, JPHOOK + USE MPL_MODULE, ONLY: MPL_BROADCAST + + USE YOEAEROP, ONLY: STRATO_CMIP_LAT + USE TYPE_MODEL, ONLY: MODEL + + IMPLICIT NONE + + TYPE(MODEL), INTENT(INOUT) :: YDMODEL + !---local data + REAL(KIND=JPHOOK) :: ZHOOK_HANDLE + + !---executable procedure + IF (LHOOK) CALL DR_HOOK('BROADCAST_AER_CMIP_PROP',0,ZHOOK_HANDLE) + + ASSOCIATE(& + & YDPHYAER => YDMODEL%YRML_PHY_AER & + ) + + ASSOCIATE(& + & YDAERSTRAT => YDPHYAER%YREAEROSTRAT & + ) + + ASSOCIATE(& + & AOD_SUN=>YDAERSTRAT%AOD_SUN,AAOD_SUN=>YDAERSTRAT%AAOD_SUN, & + & AAOD_EARTH=>YDAERSTRAT%AAOD_EARTH,REFAOD_SUN=>YDAERSTRAT%REFAOD_SUN& + ) + + CALL MPL_BROADCAST(AOD_SUN, KTAG=ITAG+1,KROOT=RPRC,CDSTRING='AER_CMIP_PROP-1: ') + CALL MPL_BROADCAST(AAOD_SUN, KTAG=ITAG+2,KROOT=RPRC,CDSTRING='AER_CMIP_PROP-2: ') + CALL MPL_BROADCAST(REFAOD_SUN, KTAG=ITAG+3,KROOT=RPRC,CDSTRING='AER_CMIP_PROP-3: ') + CALL MPL_BROADCAST(AAOD_EARTH, KTAG=ITAG+4,KROOT=RPRC,CDSTRING='AER_CMIP_PROP-4: ') + CALL MPL_BROADCAST(STRATO_CMIP_LAT, KTAG=ITAG+5,KROOT=RPRC,CDSTRING='AER_CMIP_PROP-5: ') + END ASSOCIATE + END ASSOCIATE + END ASSOCIATE + IF (LHOOK) CALL DR_HOOK('BROADCAST_AER_CMIP_PROP',1,ZHOOK_HANDLE) + END SUBROUTINE BROADCAST_AER_CMIP_PROP + +END SUBROUTINE CMIP_STRATO_AERO diff --git a/ifs-source/arpifs/phys_ec/cmip_strato_aero_interp.F90 b/ifs-source/arpifs/phys_ec/cmip_strato_aero_interp.F90 new file mode 100755 index 00000000..7fc87c93 --- /dev/null +++ b/ifs-source/arpifs/phys_ec/cmip_strato_aero_interp.F90 @@ -0,0 +1,324 @@ +SUBROUTINE CMIP_STRATO_AERO_INTERP & +&(YDMODEL, KIDIA, KFDIA, KLON ,KLEV, & +& KRINT, KSHIFT, & +& PAPRS, PGELAM, PSINLAT, & +& STRATAOD, STRATAAOD, STRATREFAOD, & +& STRATAAOD_LW) + +! PURPOSE. +! -------- + +! INTERFACE. +! ---------- +! CALL *CMIP_STRATO_AERO_INTERP* FROM *RADLSWR* + +! AUTHOR. +! ------- +! M.Ménégoz for EC-EARTH 2017 +! A.Laakso for EC-EARTH4/OIFS 2022 +! +! Horizontal interpolation of the stratospheric aerosol CMIP +! dataset. The data need to have the correct vertical resolution. +! The vertical interpolation is done off-line. +! The horizontal interpolation id done on-line. +! In the SW, the triplet (AOD, AAOD, REFAOD) is used +! In the LW, only AAOD is used, since only the aerosol absorption +! is taken into account in IFS (aerosol scattering neglected in +! the LW in IFS) + +! MODIFICATIONS. +! -------------- + +!--------------------------------------------------------------------- + +!--- inherited types, functions and data +USE PARKIND1, ONLY: JPIM, JPRB, JPRD +USE YOMHOOK, ONLY: LHOOK, DR_HOOK, JPHOOK +USE YOMLUN, ONLY: NULOUT, NULERR +USE YOMCST, ONLY: RPI +USE YOMMP0, ONLY: MYPROC + +USE YOEAEROP, ONLY: STRATO_CMIP_NLAT, STRATO_CMIP_NALT, STRATO_CMIP_NTIME, & + & STRATO_CMIP_LAT, STRATO_CMIP_SB, STRATO_CMIP_TB, & + & STRATO_CMIP_NSB, STRATO_CMIP_NTB, STRATO_CMIP_NMONTH + +USE YOMCT3, ONLY: NSTEP +USE TYPE_MODEL, ONLY: MODEL + +IMPLICIT NONE +TYPE(MODEL), INTENT(IN) :: YDMODEL +INTEGER(KIND=JPIM),INTENT(IN) :: KLON +INTEGER(KIND=JPIM),INTENT(IN) :: KLEV +INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA +INTEGER(KIND=JPIM),INTENT(IN) :: KFDIA +INTEGER(KIND=JPIM),INTENT(IN) :: KRINT +INTEGER(KIND=JPIM),INTENT(IN) :: KSHIFT +REAL(KIND=JPRB) ,INTENT(IN) :: PAPRS(KLON,KLEV+1) +REAL(KIND=JPRB) ,INTENT(IN) :: PGELAM(KLON) +REAL(KIND=JPRB) ,INTENT(IN) :: PSINLAT(KLON) +REAL(KIND=JPRB) ,INTENT(OUT) :: STRATAOD(KLON,KLEV,STRATO_CMIP_NSB,STRATO_CMIP_NMONTH) +REAL(KIND=JPRB) ,INTENT(OUT) :: STRATAAOD(KLON,KLEV,STRATO_CMIP_NSB,STRATO_CMIP_NMONTH) +REAL(KIND=JPRB) ,INTENT(OUT) :: STRATREFAOD(KLON,KLEV,STRATO_CMIP_NSB,STRATO_CMIP_NMONTH) +REAL(KIND=JPRB) ,INTENT(OUT) :: STRATAAOD_LW(KLON,KLEV,STRATO_CMIP_NTB,STRATO_CMIP_NMONTH) + +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE + +INTEGER(KIND=JPIM), PARAMETER :: RPRC = 1 + +REAL(KIND=JPRB) :: ZSTRATAOD(KLON,KLEV) +REAL(KIND=JPRB) :: ZSTRATAAOD(KLON,KLEV) +REAL(KIND=JPRB) :: ZSTRATREFAOD(KLON,KLEV) +REAL(KIND=JPRB) :: ZSTRATAAOD_LW(KLON,KLEV) + +REAL(KIND=JPRB) :: ZAOD_SUN(STRATO_CMIP_NALT, STRATO_CMIP_NLAT) +REAL(KIND=JPRB) :: ZAAOD_SUN(STRATO_CMIP_NALT, STRATO_CMIP_NLAT) +REAL(KIND=JPRB) :: ZREFAOD_SUN(STRATO_CMIP_NALT, STRATO_CMIP_NLAT) +REAL(KIND=JPRB) :: ZAAOD_EARTH(STRATO_CMIP_NALT, STRATO_CMIP_NLAT) + +REAL(KIND=JPRB) :: ZLAT(KLON) +REAL(KIND=JPRB) :: ZGLAT(KLON) +REAL(KIND=JPRB) :: ZGLON(KLON) +REAL(KIND=JPRB) :: ZRPI +INTEGER(KIND=JPIM) :: IMONTH, ILEV +INTEGER(KIND=JPIM) :: JN, JL, JK + +REAL, POINTER :: AOD_SUN(:,:,:,:), AAOD_SUN(:,:,:,:), AAOD_EARTH(:,:,:,:), REFAOD_SUN(:,:,:,:) +REAL, POINTER :: STRATO_CMIP_ALT(:) + +!---executable procedure +IF (LHOOK) CALL DR_HOOK('CMIP_STRATO_AERO_INTERP',0,ZHOOK_HANDLE) + +WRITE(NULOUT,*)'Entering Subroutine CMIP_STRATO_AERO_INTERP' + +ASSOCIATE(& + & YDPHYAER => YDMODEL%YRML_PHY_AER & + ) + +ASSOCIATE(& + & YDAERSTRAT => YDPHYAER%YREAEROSTRAT & + ) + +ASSOCIATE(& + & AOD_SUN=>YDAERSTRAT%AOD_SUN,AAOD_SUN=>YDAERSTRAT%AAOD_SUN, & + & AAOD_EARTH=>YDAERSTRAT%AAOD_EARTH,STRATO_CMIP_ALT=>YDAERSTRAT%STRATO_CMIP_ALT,& + & REFAOD_SUN=>YDAERSTRAT%REFAOD_SUN& + ) + + STRATAOD(KIDIA:KFDIA,:,:,:)=0._JPRB + STRATAAOD(KIDIA:KFDIA,:,:,:)=0._JPRB + STRATREFAOD(KIDIA:KFDIA,:,:,:)=0._JPRB + STRATAAOD_LW(KIDIA:KFDIA,:,:,:)=0._JPRB + ZAOD_SUN(KIDIA:KFDIA,:)=0._JPRB + ZAAOD_SUN(KIDIA:KFDIA,:)=0._JPRB + ZREFAOD_SUN(KIDIA:KFDIA,:)=0._JPRB + ZAAOD_EARTH(KIDIA:KFDIA,:)=0._JPRB + + ZSTRATAOD(KIDIA:KFDIA,:)=0._JPRB + ZSTRATAAOD(KIDIA:KFDIA,:)=0._JPRB + ZSTRATREFAOD(KIDIA:KFDIA,:)=0._JPRB + ZSTRATAAOD_LW(KIDIA:KFDIA,:)=0._JPRB + + ZRPI=1.0_JPRB/RPI + DO JL=KIDIA,KFDIA + ZLAT(JL) = ASIN(PSINLAT(JL)) + ZGLAT(JL)= ZLAT(JL) * 180._JPRB*ZRPI + ZGLON(JL)= PGELAM(JL) * 180._JPRB*ZRPI + END DO + + IF (MYPROC==RPRC) WRITE(NULOUT,*) 'Interpolating stratospheric aerosol optical properties' + + DO JN=1,STRATO_CMIP_NSB + DO IMONTH=1,STRATO_CMIP_NMONTH + IF (STRATO_CMIP_NALT == KLEV) THEN + ! No vertical regridding, therefore no conversion to intensive properties + ZAOD_SUN(:,:)=AOD_SUN(:,:,JN,IMONTH) + ZAAOD_SUN(:,:)=AAOD_SUN(:,:,JN,IMONTH) + ZREFAOD_SUN(:,:)=REFAOD_SUN(:,:,JN,IMONTH) + ELSE + WRITE(NULERR,*) 'MITKA', STRATO_CMIP_NALT, KLEV + CALL ABOR1('Number of levels of stratospheric aerosol CMIP forcing unequal to model resolution!') + ENDIF + + CALL INTERPOLATE_STRATAERO(KIDIA, KFDIA, KLON, KLEV, KRINT, KSHIFT, & + & PGELAM, PSINLAT, STRATO_CMIP_LAT, & + & PAPRS, ZAOD_SUN, ZSTRATAOD ) + + CALL INTERPOLATE_STRATAERO(KIDIA, KFDIA, KLON, KLEV, KRINT, KSHIFT, & + & PGELAM, PSINLAT, STRATO_CMIP_LAT, & + & PAPRS, ZAAOD_SUN, ZSTRATAAOD ) + + CALL INTERPOLATE_STRATAERO(KIDIA, KFDIA, KLON, KLEV, KRINT, KSHIFT, & + & PGELAM, PSINLAT, STRATO_CMIP_LAT, & + & PAPRS, ZREFAOD_SUN, ZSTRATREFAOD) + + DO JL=KIDIA,KFDIA,KRINT + STRATAOD(JL,:,JN,IMONTH)=ZSTRATAOD(JL,:) + STRATAAOD(JL,:,JN,IMONTH)=ZSTRATAAOD(JL,:) + STRATREFAOD(JL,:,JN,IMONTH)=ZSTRATREFAOD(JL,:) + END DO + + END DO + END DO + + DO JN=1,STRATO_CMIP_NTB + DO IMONTH=1,STRATO_CMIP_NMONTH + IF (STRATO_CMIP_NALT == KLEV) THEN + ! No vertical regridding, therefore no conversion to intensive properties + ZAAOD_EARTH(:,:)=AAOD_EARTH(:,:,JN,IMONTH) + ELSE + CALL ABOR1('Number of levels of stratospheric aerosol CMIP forcing unequal to model resolution!') + ENDIF + + CALL INTERPOLATE_STRATAERO(KIDIA, KFDIA, KLON, KLEV, KRINT, KSHIFT, & + & PGELAM, PSINLAT, STRATO_CMIP_LAT, & + & PAPRS, ZAAOD_EARTH, ZSTRATAAOD_LW ) + + DO JL=KIDIA,KFDIA,KRINT + STRATAAOD_LW(JL,:,JN,IMONTH)=ZSTRATAAOD_LW(JL,:) + END DO + END DO + END DO + +END ASSOCIATE +END ASSOCIATE +END ASSOCIATE +WRITE(NULOUT,*)'Leaving Subroutine CMIP_STRATO_AERO_INTERP' + +IF (LHOOK) CALL DR_HOOK('CMIP_STRATO_AERO_INTERP',1,ZHOOK_HANDLE) + + +CONTAINS + + !-------------------------------------------------------------------------------------------------------------- + SUBROUTINE INTERPOLATE_STRATAERO(KIDIA, KFDIA, KLON, KLEV, KRINT, KSHIFT, & + & PGELAM, PSINLAT, PSTRATO_CMIP_LAT, & + & PAPRS, PIN_FIELD, POUT_FIELD ) + +USE YOMHOOK, ONLY : LHOOK, DR_HOOK +USE YOMLUN, ONLY : NULOUT +USE YOMCST, ONLY : RPI +!---subroutine interface +INTEGER(KIND=JPIM), INTENT(IN) :: KIDIA +INTEGER(KIND=JPIM), INTENT(IN) :: KFDIA +INTEGER(KIND=JPIM), INTENT(IN) :: KLON +INTEGER(KIND=JPIM), INTENT(IN) :: KLEV +INTEGER(KIND=JPIM),INTENT(IN) :: KRINT +INTEGER(KIND=JPIM),INTENT(IN) :: KSHIFT +REAL(KIND=JPRB), INTENT(IN) :: PGELAM(KLON) +REAL(KIND=JPRB), INTENT(IN) :: PSINLAT(KLON) +REAL(KIND=JPRB), INTENT(IN) :: PSTRATO_CMIP_LAT(STRATO_CMIP_NLAT) +REAL(KIND=JPRB), INTENT(IN) :: PIN_FIELD(STRATO_CMIP_NALT,STRATO_CMIP_NLAT) +REAL(KIND=JPRB), INTENT(IN) :: PAPRS(KLON,KLEV+1) + +REAL(KIND=JPRB), INTENT(OUT) :: POUT_FIELD(KLON,KLEV) +!---local data +INTEGER(KIND=JPIM) :: IINLA1(KLON), IINLA2(KLON) +INTEGER(KIND=JPIM) :: IINLO1(KLON), IINLO2(KLON) +INTEGER(KIND=JPIM) :: IL, JL, JLR, JK +INTEGER(KIND=JPIM) :: INLA1, INLA2, INLO1, INLO2, ILEV, INLA + +REAL(KIND=JPRB) :: ZSILAT(KLON) +REAL(KIND=JPRB) :: ZLON(KLON) +REAL(KIND=JPRB) :: ZNLO1(KLON) +REAL(KIND=JPRB) :: ZNLO2(KLON) + +REAL(KIND=JPRB) :: ZGELAM(KLON) +REAL(KIND=JPRB) :: ZAER1, ZAER2,ZRPI, Z2PI, ZZRPI +REAL(KIND=JPRB) :: ZAERLEV1, ZAERLEV2 + +REAL(KIND=JPRB) :: ZSINT + +REAL(KIND=JPRB) :: ZSINR(STRATO_CMIP_NLAT) +REAL(KIND=JPRB) :: ZGRIDR, ZLATR, ZDLONR + +!---local data +REAL(KIND=JPRB) :: ZOUT_FIELD(KLON, STRATO_CMIP_NALT) +REAL(KIND=JPRB) :: ZP_STR_LEV(KLON, STRATO_CMIP_NALT) +REAL(KIND=JPRB) :: ZINFIELD(KLON, STRATO_CMIP_NALT) +REAL(KIND=JPRB) :: ZPRE(KLON) + +REAL(KIND=JPRB) :: ZRRR +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE + +#include "abor1.intfb.h" +POUT_FIELD(:,:)=0._JPRB +!ZOUT_FIELD(:,:)=0._JPRB +IINLA1(:)=0 +IINLA2(:)=0 +ZSILAT(:)=0._JPRB +ZAER1=0._JPRB +!---executable procedure +IF (LHOOK) CALL DR_HOOK('INTERPOLATE_STRATAERO',0, ZHOOK_HANDLE) + +!================================================================================================ +! +ZRPI=RPI/180.0_JPRB +Z2PI=2._JPRB*RPI +ZZRPI=180._JPRB/RPI +ZSINR(:) = SIN(ZRPI*PSTRATO_CMIP_LAT(:)) + +!-- latitudinal interpolation +IL=KSHIFT +DO JL=KIDIA,KFDIA,KRINT + IL=IL+1 + IINLA1(IL)=0 + IINLA2(IL)=0 + ZSILAT(IL)=-9999._JPRB + ZSINT=PSINLAT(JL) + IF (ZSINT <= ZSINR(1)) THEN + INLA=1 + IINLA1(IL)=1 + IINLA2(IL)=1 + ZSILAT(IL)=0._JPRB + ENDIF + IF (ZSINT >= ZSINR(STRATO_CMIP_NLAT)) THEN + INLA=STRATO_CMIP_NLAT + IINLA1(IL)=STRATO_CMIP_NLAT + IINLA2(IL)=STRATO_CMIP_NLAT + ZSILAT(IL)=0._JPRB + ENDIF + + DO JLR=1,STRATO_CMIP_NLAT-1 + + IF (ZSINT >= ZSINR(JLR) .AND. ZSINT < ZSINR(JLR+1)) THEN + INLA=JLR + IINLA1(IL)=JLR + IINLA2(IL)=JLR+1 + ZSILAT(IL)=(ZSINT-ZSINR(INLA))/(ZSINR(INLA+1)-ZSINR(INLA)) + ENDIF + + ENDDO + + !IF (INLA == 0) THEN + IF (IINLA1(IL) == 0 .OR. IINLA2(IL) == 0) THEN + CALL ABOR1(' Problem with lat. interpolation in in CMIP_strato_aero_interp!') + ENDIF +ENDDO + +DO JK=1,STRATO_CMIP_NALT + !-- compute interpolated field + IL=KSHIFT + DO JL=KIDIA,KFDIA, KRINT + IL=IL+1 + INLA1=IINLA1(IL) + INLA2=IINLA2(IL) + + ZAER1=PIN_FIELD(JK,INLA1) & + & +ZSILAT(IL)*(PIN_FIELD(JK,INLA2)-PIN_FIELD(JK,INLA1)) + POUT_FIELD(IL,JK)=ZAER1 + + END DO +END DO ! JK (vertical loop) + +!================================================================================================ +! DO JL=KIDIA,KFDIA, KRINT +! POUT_FIELD(JL,:) = ZOUT_FIELD(JL,:) +! END DO + +!================================================================================================ + +IF (LHOOK) CALL DR_HOOK('INTERPOLATE_STRATAERO',1,ZHOOK_HANDLE) +END SUBROUTINE INTERPOLATE_STRATAERO + !-------------------------------------------------------------------------------------------------------------- + +END SUBROUTINE CMIP_STRATO_AERO_INTERP diff --git a/ifs-source/arpifs/phys_ec/cmip_strato_aero_process.F90 b/ifs-source/arpifs/phys_ec/cmip_strato_aero_process.F90 new file mode 100755 index 00000000..5c8fb57d --- /dev/null +++ b/ifs-source/arpifs/phys_ec/cmip_strato_aero_process.F90 @@ -0,0 +1,261 @@ +SUBROUTINE CMIP_STRATO_AERO_PROCESS & +&(YDMODEL, KIDIA , KFDIA , KLON , KLEV, & +& KRINT , KSHIFT, & +& KINDAT,KSTADD, & +& PAPF, PAPRS , ZPT, ZPTH, PGELAM, & +& STRATAOD_M, STRATAAOD_M, STRATREFAOD_M, STRATAAOD_LW_M, & +& STRATAOD , STRATAAOD , STRATREFAOD, STRATAAOD_LW, TROPOPAUSE ) + +! PURPOSE. +! -------- + +! INTERFACE. +! ---------- +! CALL *CMIP_STRATO_AERO_PROCESS* FROM *RADLSWR* + +! AUTHOR. +! ------- +! M.Ménégoz for EC-EARTH 2017 +! A.Laakso for EC-EARTH4/OIFS 2022 +! +! Time interpolation of the stratospheric aerosol CMIP dataset +! Remove the aerosols located below the tropopause and above 10 +! hPa. (WMO criteria based on the vertical lapse rate temperature) + +! MODIFICATIONS. +! -------------- + +!--------------------------------------------------------------------- + +USE YOEAEROP ,ONLY : STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME, & + & STRATO_CMIP_LAT,STRATO_CMIP_SB,STRATO_CMIP_TB,& + & STRATO_CMIP_NSB,STRATO_CMIP_NTB,STRATO_CMIP_NMONTH + +USE YOMCT0 , ONLY : LNF +USE YOMCT2 , ONLY : NSTAR2 +USE YOMCST , ONLY : RDAY +USE YOMLUN , ONLY : NULOUT +USE PARKIND1 , ONLY : JPIM, JPIB, JPRB, JPRD !JBRD needed for fcttim.func +USE YOMHOOK, ONLY: LHOOK, DR_HOOK, JPHOOK +USE TYPE_MODEL, ONLY: MODEL + +! For the tropopause criteria: +USE YOMCST , ONLY : RD, RG + +IMPLICIT NONE + +! ----------------------------------------------------------------- +! ARGUMENTS. +! ------------- +TYPE(MODEL), INTENT(IN) :: YDMODEL +INTEGER(KIND=JPIM),INTENT(IN) :: KLON +INTEGER(KIND=JPIM),INTENT(IN) :: KLEV +INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA +INTEGER(KIND=JPIM),INTENT(IN) :: KFDIA +INTEGER(KIND=JPIM),INTENT(IN) :: KRINT !Alaak: not used +INTEGER(KIND=JPIM),INTENT(IN) :: KSHIFT !Alaak: not used +INTEGER(KIND=JPIM),INTENT(IN) :: KINDAT +INTEGER(KIND=JPIM),INTENT(IN) :: KSTADD +REAL(KIND=JPRB) ,INTENT(IN) :: PAPF(KLON,KLEV) +REAL(KIND=JPRB) ,INTENT(IN) :: PAPRS(KLON,KLEV+1) +REAL(KIND=JPRB) ,INTENT(IN) :: ZPT(KLON,KLEV) +REAL(KIND=JPRB) ,INTENT(IN) :: ZPTH(KLON,KLEV+1) +REAL(KIND=JPRB) ,INTENT(IN) :: PGELAM(KLON) +REAL(KIND=JPRB) ,INTENT(IN) :: STRATAOD_M(KLON,KLEV,STRATO_CMIP_NSB,STRATO_CMIP_NMONTH) +REAL(KIND=JPRB) ,INTENT(IN) :: STRATAAOD_M(KLON,KLEV,STRATO_CMIP_NSB,STRATO_CMIP_NMONTH) +REAL(KIND=JPRB) ,INTENT(IN) :: STRATREFAOD_M(KLON,KLEV,STRATO_CMIP_NSB,STRATO_CMIP_NMONTH) +REAL(KIND=JPRB) ,INTENT(IN) :: STRATAAOD_LW_M(KLON,KLEV,STRATO_CMIP_NTB,STRATO_CMIP_NMONTH) +REAL(KIND=JPRB) ,INTENT(OUT):: STRATAOD(KLON,KLEV,STRATO_CMIP_NSB) +REAL(KIND=JPRB) ,INTENT(OUT):: STRATAAOD(KLON,KLEV,STRATO_CMIP_NSB) +REAL(KIND=JPRB) ,INTENT(OUT):: STRATREFAOD(KLON,KLEV,STRATO_CMIP_NSB) +REAL(KIND=JPRB) ,INTENT(OUT):: STRATAAOD_LW(KLON,KLEV,STRATO_CMIP_NTB) +INTEGER(KIND=JPIM),INTENT(OUT):: TROPOPAUSE(KLON) + +! ----------------------------------------------------------------- +! LOCAL ARRAYS. +! ------------- + +INTEGER(KIND=JPIB) :: ITIME, IZT +INTEGER(KIND=JPIM) :: ISTADD +INTEGER(KIND=JPIM) :: IMV1, IMV2, IYR1, IYR2, INYR, INDY, INMN, IT1, IT2, IMP1, IMP2 +INTEGER(KIND=JPIM) :: ILMO(12) +INTEGER(KIND=JPIM) :: IDY0,IMN0,IYR0,IYNR +INTEGER(KIND=JPIM) :: JK,JL +REAL(KIND=JPRB) :: ZW1, ZW2, ZSIG +REAL(KIND=JPRB) :: ZTRPAUS(KLON), ZPAPHD(KLON) +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE + +! For the Reichler criteria (tropopause): +REAL(KIND=JPRB) :: LAPSE_RATE, LAPSE_RATE_MEAN, DZ +INTEGER(KIND=JPIM) :: JLEV +LOGICAL :: LTEST(KLON) +INTEGER(KIND=JPIM) :: RVOLCDEC + +!---included functions +#include "fcttim.func.h" +#include "updcal.intfb.h" + +IF (LHOOK) CALL DR_HOOK('CMIP_STRATO_AERO_PROCESS',0,ZHOOK_HANDLE) + +WRITE(NULOUT,*)'Entering Subroutine CMIP_STRATO_AERO_PROCESS' + +ASSOCIATE(& + & YDPHYAER => YDMODEL%YRML_PHY_AER, & + <WOTL=>YDMODEL%YRML_DYN%YRDYNA%LTWOTL,& + &YDRIP=>YDMODEL%YRML_GCONF%YRRIP & + ) + +ASSOCIATE(& + & YDAERSTRAT => YDPHYAER%YREAEROSTRAT & + ) +ASSOCIATE(& + STRATO_CMIP_ALT=>YDAERSTRAT%STRATO_CMIP_ALT& + ) + +STRATAOD(:,:,:)=0.0_JPRB +STRATAAOD(:,:,:)=0.0_JPRB +STRATREFAOD(:,:,:)=0.0_JPRB +STRATAAOD_LW(:,:,:)=0.0_JPRB + +! Time interpolation +! Assume monthly means valid at 0Z on the 16th of each month +! and interpolate linearly + +! prepare monthly weights +IF(.NOT.LNF.AND.KSTADD == 0) THEN + ! IN CASE OF RESTART: + IF (LTWOTL) THEN + IZT=NINT(YDRIP%TSTEP*(REAL(NSTAR2,JPRB)+0.5_JPRB), KIND=JPIB) + ELSE + ITIME=NINT(YDRIP%TSTEP, KIND=JPIB) + IZT=ITIME*INT(NSTAR2, KIND=JPIB) + ENDIF + ISTADD=INT(IZT/NINT(RDAY, KIND=JPIB), KIND=JPIM) + ELSE + ISTADD=KSTADD ! NUMBER OF DAYS SINCE START OF THE MODEL +ENDIF + +IYR0=NCCAA(KINDAT) +IMN0=NMM(KINDAT) +IDY0=NDD(KINDAT) + +CALL UPDCAL(IDY0,IMN0,IYR0, ISTADD, INDY,INMN,INYR, ILMO, NULOUT) + +! Assume monthly means valid at 0Z on the 16th of each month +! and interpolate linearly (daily values) + +IF(INDY >= 16) THEN + ! Month to consider to apply the interpolation + IMP1=2 + IMP2=3 + ! + IMV1=INMN + IMV2=1+MOD(INMN,12) + IYR1=INYR + IF(IMV1 /= 12) THEN + IYR2=INYR + ELSE + IYR2=INYR+1 + ENDIF + IT1=16 + IT2=16+ILMO(IMV1) + ELSE + ! Month to consider to apply the interpolation + IMP1=1 + IMP2=2 + ! + IMV1=1+MOD(INMN+10,12) + IMV2=INMN + IF(IMV1 /= 12) THEN + IYR1=INYR + ELSE + IYR1=INYR-1 + ENDIF + IYR2=IYNR + IT1=16-ILMO(IMV1) + IT2=16 +ENDIF + +! Weights +ZW1=REAL(IT2-INDY,JPRB)/REAL(IT2-IT1,JPRB) +ZW2=1.0_JPRB-ZW1 + +! Interpolation and application of the RVOLCDEC factor (2-year +! exponential decay if NVOLCSTOP different from 99999999) +! --ALaakso: no exponential decay, RVOLCDEC is set to 1 +RVOLCDEC=1 +STRATAOD(:,:,:)=RVOLCDEC*(ZW1*STRATAOD_M(:,:,:,IMP1)+ZW2*STRATAOD_M(:,:,:,IMP2)) +STRATAAOD(:,:,:)=RVOLCDEC*(ZW1*STRATAAOD_M(:,:,:,IMP1)+ZW2*STRATAAOD_M(:,:,:,IMP2)) +STRATREFAOD(:,:,:)=RVOLCDEC*(ZW1*STRATREFAOD_M(:,:,:,IMP1)+ZW2*STRATREFAOD_M(:,:,:,IMP2)) +STRATAAOD_LW(:,:,:)=RVOLCDEC*(ZW1*STRATAAOD_LW_M(:,:,:,IMP1)+ZW2*STRATAAOD_LW_M(:,:,:,IMP2)) +!STRATAOD(:,:,:)=(ZW1*STRATAOD_M(:,:,:,IMP1)+ZW2*STRATAOD_M(:,:,:,IMP2)) +!STRATAAOD(:,:,:)=(ZW1*STRATAAOD_M(:,:,:,IMP1)+ZW2*STRATAAOD_M(:,:,:,IMP2)) +!STRATREFAOD(:,:,:)=(ZW1*STRATREFAOD_M(:,:,:,IMP1)+ZW2*STRATREFAOD_M(:,:,:,IMP2)) +!STRATAAOD_LW(:,:,:)=(ZW1*STRATAAOD_LW_M(:,:,:,IMP1)+ZW2*STRATAAOD_LW_M(:,:,:,IMP2)) + +! Computing the tropopause height +DO JL=KIDIA,KFDIA + ZTRPAUS(JL)=0.1_JPRB + ZPAPHD(JL)=1.0_JPRB/PAPRS(JL,KLEV+1) +ENDDO + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! According to the WMO (1975), the tropopause is defined as the lowest +! level at which the lapse-rate decreases to 2°C/km or less, provided +! that the average lapse-rate between this level and all higher levels +! within 2 km does not exceed 2°C/km.(see Reichler et al.,2003) +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! +LTEST(:)=.FALSE. + +DO JK=KLEV,1,-1 + DO JL=KIDIA,KFDIA + ! As in cloudsc.F90, the pressure level is normalized by the + ! surface pressure before checking that the level is located on + ! the tropopause altitude. + ZSIG=PAPF(JL,JK)*ZPAPHD(JL) + IF (PAPF(JL,JK)>7500._JPRB.AND.PAPF(JL,JK)<55000._JPRB) THEN + ! The lapse rate is computed for each layer (here we use the gas + ! equation and the hydrostatic approximation): + LAPSE_RATE=(ZPTH(JL,JK+1)-ZPTH(JL,JK))/(PAPRS(JL,JK+1)-PAPRS(JL,JK))*PAPF(JL,JK)/ZPT(JL,JK)*RG/RD + IF (LAPSE_RATE <= 0.002_JPRB) THEN + DZ=0 + JLEV=JK + DO WHILE (DZ <= 2000_JPRB) ! Compute the delta(P) corresponding to 2km + DZ=DZ+(PAPF(JL,JLEV)-PAPF(JL,JLEV-1))/PAPRS(JL,JLEV)*ZPTH(JL,JLEV)*RD/RG + JLEV=JLEV-1 + END DO + LAPSE_RATE_MEAN=(ZPT(JL,JK)-ZPT(JL,JLEV))/DZ ! Lapse rate over 2 km + IF (LAPSE_RATE_MEAN <= 0.002_JPRB) THEN + ZTRPAUS(JL)=MAX(ZSIG,ZTRPAUS(JL)) ! We kep the lowest value that fit the two conditions + LTEST(JL)=.TRUE. + ENDIF + ENDIF + ENDIF + ENDDO +ENDDO + +! Removing the stratospheric forcing that is located below the tropopause +! Use default tropopause at 100 hPa in case the above tropopause criteria fails +TROPOPAUSE(KIDIA:KFDIA)=KLEV +DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZSIG=PAPF(JL,JK)*ZPAPHD(JL) + IF ((LTEST(JL) .AND. ZSIG>ZTRPAUS(JL)) .OR. & + & (.NOT.LTEST(JL) .AND. PAPF(JL,JK)>10000._JPRB)) THEN + STRATAOD(JL,JK,:)=0.0_JPRB + STRATAAOD(JL,JK,:)=0.0_JPRB + STRATREFAOD(JL,JK,:)=0.0_JPRB + STRATAAOD_LW(JL,JK,:)=0.0_JPRB + TROPOPAUSE(JL)=MIN(TROPOPAUSE(JL),JK) + ENDIF + ENDDO +ENDDO + +END ASSOCIATE +END ASSOCIATE +END ASSOCIATE +WRITE(NULOUT,*)'Leaving subroutine CMIP_STRATO_AERO_PROCESS' +IF (LHOOK) CALL DR_HOOK('CMIP_STRATO_AERO_PROCESS',1,ZHOOK_HANDLE) + +END SUBROUTINE CMIP_STRATO_AERO_PROCESS diff --git a/ifs-source/arpifs/phys_radi/radiation_scheme.F90 b/ifs-source/arpifs/phys_radi/radiation_scheme.F90 index 2bbf202b..dbdcb8fc 100644 --- a/ifs-source/arpifs/phys_radi/radiation_scheme.F90 +++ b/ifs-source/arpifs/phys_radi/radiation_scheme.F90 @@ -6,7 +6,7 @@ ! granted to it by virtue of its status as an intergovernmental organisation ! nor does it submit to any jurisdiction SUBROUTINE RADIATION_SCHEME & - & (YDMODEL,KIDIA, KFDIA, KLON, KLEV, KAEROSOL, & + & (YDMODEL,KIDIA, KFDIA, KLON, KLEV, KBL, KAEROSOL, & & PSOLAR_IRRADIANCE, & & PMU0, PTEMPERATURE_SKIN, PALBEDO_DIF, PALBEDO_DIR, & & PSPECTRALEMISS, & @@ -28,7 +28,7 @@ SUBROUTINE RADIATION_SCHEME & & PPERT, PFSD) ! RADIATION_SCHEME - Interface to modular radiation scheme -! +! ! PURPOSE ! ------- ! The modular radiation scheme is contained in a separate @@ -93,10 +93,10 @@ SUBROUTINE RADIATION_SCHEME & USE RADIATION_INTERFACE, ONLY : RADIATION, SET_GAS_UNITS USE RADIATION_SAVE, ONLY : SAVE_INPUTS, SAVE_FLUXES -IMPLICIT NONE +! CMIP6/7 straotspheric aerosols +USE YOEAEROP, ONLY: STRATO_CMIP_NMONTH, STRATO_CMIP_NTB -! TEMPO HACK UNTIL WE GOT THE CMIP STRATO AEROSOLS -INTEGER(KIND=JPIM), PARAMETER :: STRATO_CMIP_NTB=16 +IMPLICIT NONE ! INPUT ARGUMENTS @@ -106,6 +106,7 @@ SUBROUTINE RADIATION_SCHEME & INTEGER(KIND=JPIM),INTENT(IN) :: KFDIA ! End column to process INTEGER(KIND=JPIM),INTENT(IN) :: KLON ! Number of columns INTEGER(KIND=JPIM),INTENT(IN) :: KLEV ! Number of levels +INTEGER(KIND=JPIM),INTENT(IN) :: KBL ! Block to read strat aerosols INTEGER(KIND=JPIM),INTENT(IN) :: KAEROSOL ! Number of aerosol types ! *** Single-level fields @@ -220,6 +221,7 @@ SUBROUTINE RADIATION_SCHEME & TYPE(GAS_TYPE) :: GAS TYPE(CLOUD_TYPE) :: YLCLOUD TYPE(AEROSOL_TYPE) :: AEROSOL +TYPE(AEROSOL_TYPE) :: STRAT_AEROSOL TYPE(FLUX_TYPE) :: FLUX ! Mass mixing ratio of ozone (kg/kg) @@ -256,7 +258,7 @@ SUBROUTINE RADIATION_SCHEME & INTEGER(KIND=JPIM) :: ITIM, IDAY ! Loop indices -INTEGER(KIND=JPIM) :: JLON, JLEV, JBAND, JAER +INTEGER(KIND=JPIM) :: JLON, JLEV, JBAND, JAER, JIW, IJLEV, JSW_ORDERED_BIS ! Have any fluxes been returned that are out of a physically ! reasonable range? This integer stores the number of blocks of fluxes @@ -275,6 +277,16 @@ SUBROUTINE RADIATION_SCHEME & REAL(KIND=JPHOOK) :: ZHOOK_HANDLE +! CMIP6/7 stratospheric aerosols - ALaakso +REAL(KIND=JPRB) :: ZAODSTRAT_M(KLON,KLEV,YDMODEL%YRML_PHY_RAD%YRERAD%NSW,STRATO_CMIP_NMONTH) +REAL(KIND=JPRB) :: ZAAODSTRAT_M(KLON,KLEV,YDMODEL%YRML_PHY_RAD%YRERAD%NSW,STRATO_CMIP_NMONTH) +REAL(KIND=JPRB) :: ZREFAODSTRAT_M(KLON,KLEV,YDMODEL%YRML_PHY_RAD%YRERAD%NSW,STRATO_CMIP_NMONTH) +REAL(KIND=JPRB) :: ZAAODSTRAT_LW_M(KLON,KLEV,STRATO_CMIP_NTB,STRATO_CMIP_NMONTH) +REAL(KIND=JPRB) :: ZAODSTRAT(KLON,KLEV,YDMODEL%YRML_PHY_RAD%YRERAD%NSW) +REAL(KIND=JPRB) :: ZAAODSTRAT(KLON,KLEV,YDMODEL%YRML_PHY_RAD%YRERAD%NSW) +REAL(KIND=JPRB) :: ZREFAODSTRAT(KLON,KLEV,YDMODEL%YRML_PHY_RAD%YRERAD%NSW) +REAL(KIND=JPRB) :: ZAAODSTRAT_LW(KLON,KLEV,STRATO_CMIP_NTB) +INTEGER(KIND=JPIM) :: KTROPPAUSE(KLON) ! Import time functions for iseed calculation #include "fcttim.func.h" @@ -285,6 +297,10 @@ SUBROUTINE RADIATION_SCHEME & #include "satur.intfb.h" !#include "abor1.intfb.h" +!CMIP7 stratospheric aerosols +#include "cmip_strato_aero_interp.intfb.h" +#include "cmip_strato_aero_process.intfb.h" + IF (LHOOK) CALL DR_HOOK('RADIATION_SCHEME',0,ZHOOK_HANDLE) ASSOCIATE(YDRADIATION => YDMODEL%YRML_PHY_RAD%YRADIATION, & @@ -304,6 +320,9 @@ SUBROUTINE RADIATION_SCHEME & & STRAT_BG_AER_MASS_EXT => YDRADIATION%STRAT_BG_AER_MASS_EXT, & & AERO_SCHEME => YDCOMPO%AERO_SCHEME) +ASSOCIATE(YDPHYAER => YDMODEL%YRML_PHY_AER ) +ASSOCIATE(YDAERSTRAT => YDPHYAER%YREAEROSTRAT ) + ! Allocate memory in radiation objects CALL SINGLE_LEVEL%ALLOCATE(KLON, YRERAD%NSW, YRERAD%NLWEMISS, & & USE_SW_ALBEDO_DIRECT=.TRUE.) @@ -329,6 +348,8 @@ SUBROUTINE RADIATION_SCHEME & ENDIF CALL FLUX%ALLOCATE(RAD_CONFIG, 1, KLON, KLEV) +! Stratospheric aerosols. Fields are 0 if LCMIP6_STRATAER_FULL = FALSE +CALL STRAT_AEROSOL%ALLOCATE_DIRECT(RAD_CONFIG, KLON, 1, KLEV) ! Set thermodynamic profiles: simply copy over the half-level ! pressure and temperature @@ -639,6 +660,105 @@ SUBROUTINE RADIATION_SCHEME & ENDIF +!CMIP6/7 Stratospheric aerosols +ZAODSTRAT(:,:,:)=0.0_JPRB +ZAAODSTRAT(:,:,:)=0.0_JPRB +ZREFAODSTRAT(:,:,:)=0.0_JPRB +ZAAODSTRAT_LW(:,:,:)=0.0_JPRB +IF (YRERAD%LCMIP_STRATAER_CMIP6 .OR. YRERAD%LCMIP_STRATAER_CMIP7) THEN + IF (YRERAD%LSTRATAERO_UPDATED) THEN + + ! Read the data, only one time per month + CALL CMIP_STRATO_AERO_INTERP (YDMODEL, KIDIA, KFDIA, KLON, KLEV, 1 , 0, & + & PPRESSURE_H, PGELAM, PGEMU, & + & ZAODSTRAT_M, ZAAODSTRAT_M, ZREFAODSTRAT_M, ZAAODSTRAT_LW_M) + + YDAERSTRAT%STRAT_AOD(KIDIA:KFDIA,:,:,:,KBL) = ZAODSTRAT_M(KIDIA:KFDIA,:,:,:) + YDAERSTRAT%STRAT_AAOD(KIDIA:KFDIA,:,:,:,KBL) = ZAAODSTRAT_M(KIDIA:KFDIA,:,:,:) + YDAERSTRAT%STRAT_REFAOD(KIDIA:KFDIA,:,:,:,KBL)= ZREFAODSTRAT_M(KIDIA:KFDIA,:,:,:) + YDAERSTRAT%STRAT_AAOD_LW(KIDIA:KFDIA,:,:,:,KBL) = ZAAODSTRAT_LW_M(KIDIA:KFDIA,:,:,:) + + ELSE + ! no new data, use the last computed values + ZAODSTRAT_M(KIDIA:KFDIA,:,:,:) = YDAERSTRAT%STRAT_AOD(KIDIA:KFDIA,:,:,:,KBL) + ZAAODSTRAT_M(KIDIA:KFDIA,:,:,:) = YDAERSTRAT%STRAT_AAOD(KIDIA:KFDIA,:,:,:,KBL) + ZREFAODSTRAT_M(KIDIA:KFDIA,:,:,:) = YDAERSTRAT%STRAT_REFAOD(KIDIA:KFDIA,:,:,:,KBL) + ZAAODSTRAT_LW_M(KIDIA:KFDIA,:,:,:) = YDAERSTRAT%STRAT_AAOD_LW(KIDIA:KFDIA,:,:,:,KBL) + ENDIF + + ! Time interpolation and excluding the data below the tropopause, each timestep. + CALL CMIP_STRATO_AERO_PROCESS (YDMODEL,KIDIA, KFDIA, KLON, KLEV, 1 , 0, & + & NINDAT, YDMODEL%YRML_GCONF%YRRIP%NSTADD, & + & PPRESSURE, PPRESSURE_H, PTEMPERATURE, PTEMPERATURE_H, PGELAM, & + & ZAODSTRAT_M, ZAAODSTRAT_M, ZREFAODSTRAT_M, ZAAODSTRAT_LW_M,& + & ZAODSTRAT, ZAAODSTRAT, ZREFAODSTRAT, ZAAODSTRAT_LW, KTROPPAUSE) + + !Excluding optical properties of M7 aerosols above stratosphere if CMIP stratospheric aerosols are used + ! If we want do this here, remember add same for LW properties + ! DO JLON=KIDIA,KFDIA + ! AEROSOL%OD_SW(:,1:KTROPPAUSE(JLON)-1,JLON) = 0.0_JPRB + ! AEROSOL%SSA_SW(:,1:KTROPPAUSE(JLON)-1,JLON) = 0.0_JPRB + ! AEROSOL%G_SW(:,1:KTROPPAUSE(JLON)-1,JLON) = 0.0_JPRB + !ENDDO + +ELSE + ZAODSTRAT(:,:,:)=0.0_JPRB + ZAAODSTRAT(:,:,:)=0.0_JPRB + ZREFAODSTRAT(:,:,:)=0.0_JPRB + ZAAODSTRAT_LW(:,:,:)=0.0_JPRB +ENDIF + +STRAT_AEROSOL%OD_SW(:,:,KIDIA:KFDIA)=0.0_JPRB +STRAT_AEROSOL%SSA_SW(:,:,KIDIA:KFDIA) = 0.0_JPRB +STRAT_AEROSOL%G_SW(:,:,KIDIA:KFDIA) = 0.0_JPRB +STRAT_AEROSOL%OD_LW(:,:,KIDIA:KFDIA) = 0.0_JPRB +STRAT_AEROSOL%SSA_LW(:,:,KIDIA:KFDIA) = 0.0_JPRB +STRAT_AEROSOL%G_LW(:,:,KIDIA:KFDIA) = 0.0_JPRB +IF (RAD_CONFIG%DO_SW) THEN + IF (YRERAD%LCMIP_STRATAER_CMIP6) THEN + DO JLEV = 1,KLEV + IJLEV=KLEV+1-JLEV + DO JAER=1,YRERAD%NTSW ! SW radiation + ! ! IFS wavelength intervals 1..14 as defined in SUSRTAER correspond to 2..14,1 in the CMIP6 forcing + JSW_ORDERED_BIS=JAER+1 + IF (JAER==14) THEN + JSW_ORDERED_BIS=1 + ENDIF + STRAT_AEROSOL%OD_SW(JAER,JLEV,KIDIA:KFDIA)=ZAODSTRAT(KIDIA:KFDIA,IJLEV,JSW_ORDERED_BIS) + STRAT_AEROSOL%SSA_SW(JAER,JLEV,KIDIA:KFDIA) = & + &ZAODSTRAT(KIDIA:KFDIA,IJLEV,JSW_ORDERED_BIS)-ZAAODSTRAT(KIDIA:KFDIA,JLEV,JSW_ORDERED_BIS) + STRAT_AEROSOL%G_SW(JAER,JLEV,KIDIA:KFDIA) = ZREFAODSTRAT(KIDIA:KFDIA,IJLEV,JSW_ORDERED_BIS) + + ENDDO + ENDDO + + ELSEIF(YRERAD%LCMIP_STRATAER_CMIP7) THEN + DO JLEV = 1,KLEV + IJLEV=KLEV+1-JLEV + DO JAER=1,YRERAD%NTSW ! SW radiation + ! CMIP7 wavelengts are already in right order + STRAT_AEROSOL%OD_SW(JAER,JLEV,KIDIA:KFDIA)=ZAODSTRAT(KIDIA:KFDIA,IJLEV,JAER) + STRAT_AEROSOL%SSA_SW(JAER,JLEV,KIDIA:KFDIA) = & + &ZAODSTRAT(KIDIA:KFDIA,IJLEV,JAER)-ZAAODSTRAT(KIDIA:KFDIA,JLEV,JAER) + STRAT_AEROSOL%G_SW(JAER,JLEV,KIDIA:KFDIA) = ZREFAODSTRAT(KIDIA:KFDIA,IJLEV,JAER) + + ENDDO + ENDDO + + ENDIF +ENDIF + +IF (RAD_CONFIG%DO_LW) THEN + DO JLEV = 1,KLEV + IJLEV=KLEV+1-JLEV + DO JAER=1,STRATO_CMIP_NTB !LW radiation + STRAT_AEROSOL%OD_LW(JAER,JLEV,KIDIA:KFDIA)=ZAAODSTRAT_LW(KIDIA:KFDIA,IJLEV,JAER) + STRAT_AEROSOL%SSA_LW(JAER,JLEV,KIDIA:KFDIA)=0.0_JPRB !only absorbtion for LW + STRAT_AEROSOL%G_LW(JAER,JLEV,KIDIA:KFDIA)=0.0_JPRB + ENDDO + ENDDO +ENDIF + ! Convert ozone Pa*kg/kg to kg/kg DO JLEV = 1,KLEV @@ -666,7 +786,7 @@ SUBROUTINE RADIATION_SCHEME & ! Call radiation scheme CALL RADIATION( KLON, KLEV, KIDIA, KFDIA, RAD_CONFIG, & - & SINGLE_LEVEL, THERMODYNAMICS, GAS, YLCLOUD, AEROSOL, FLUX) + & SINGLE_LEVEL, THERMODYNAMICS, GAS, YLCLOUD, AEROSOL, STRAT_AEROSOL, FLUX) ! Check fluxes are within physical bounds IF (YRERAD%NDUMPBADINPUTS /= 0 & @@ -797,11 +917,13 @@ SUBROUTINE RADIATION_SCHEME & CALL GAS%DEALLOCATE CALL YLCLOUD%DEALLOCATE CALL AEROSOL%DEALLOCATE +CALL STRAT_AEROSOL%DEALLOCATE CALL FLUX%DEALLOCATE END ASSOCIATE END ASSOCIATE - +END ASSOCIATE +END ASSOCIATE IF (LHOOK) CALL DR_HOOK('RADIATION_SCHEME',1,ZHOOK_HANDLE) END SUBROUTINE RADIATION_SCHEME diff --git a/ifs-source/arpifs/phys_radi/radintg.F90 b/ifs-source/arpifs/phys_radi/radintg.F90 index e1eabfea..115d3298 100644 --- a/ifs-source/arpifs/phys_radi/radintg.F90 +++ b/ifs-source/arpifs/phys_radi/radintg.F90 @@ -659,12 +659,7 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE, & IHAMAEROAOD =INDRAD(INEXT,KLEV*NTSW,(TRIM(AERO_SCHEME) == "hamm7" .AND. LAERRRTM)) IHAMAEROSSA =INDRAD(INEXT,KLEV*NTSW,(TRIM(AERO_SCHEME) == "hamm7" .AND. LAERRRTM)) IHAMAEROASYM =INDRAD(INEXT,KLEV*NTSW,(TRIM(AERO_SCHEME) == "hamm7" .AND. LAERRRTM)) -IHAMAEROAODLW =INDRAD(INEXT,KLEV*INLWTEMP,(TRIM(AERO_SCHEME) == "hamm7" .AND. LAERRRTM)) -!write(*,*) "IAERO ",IAERO -!write(*,*) "IHAMAEROAOD ",IHAMAEROAOD -!write(*,*) "IHAMAEROSSA ",IHAMAEROSSA -!write(*,*) "IHAMAEROASYM ",IHAMAEROASYM - +IHAMAEROAODLW =INDRAD(INEXT,KLEV*INLWTEMP,(TRIM(AERO_SCHEME) == "hamm7" .AND. LAERRRTM)) IPERT =INDRAD(INEXT,YDSPP_CONFIG%SM%NRFTOTAL_RADGRID, LLSPPRAD ) @@ -1662,7 +1657,7 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE, & ELSE ! Use the modular radiation scheme "ecRad" CALL RADIATION_SCHEME & - & (YDMODEL, 1, IL, NRPROMA, KLEV, IRADAER, & + & (YDMODEL, 1, IL, NRPROMA, KLEV, IB, IRADAER, & ! IB required to read stratosospheric aerosols & ZRII0, & & ZRGP(1,IAMU0,IB), ZRGP(1,ITS,IB), ZRGP(1,IALD,IB), ZRGP(1,IALP,IB), & & ZRGP(1,IEMISS,IB), & diff --git a/ifs-source/arpifs/phys_radi/suecrad.F90 b/ifs-source/arpifs/phys_radi/suecrad.F90 index 912eb68a..8b5a14e2 100644 --- a/ifs-source/arpifs/phys_radi/suecrad.F90 +++ b/ifs-source/arpifs/phys_radi/suecrad.F90 @@ -155,6 +155,10 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) USE YOMSOLARIRRADIANCE, ONLY :YSOLARIRRADIANCE ! Total solar irradiance multi-annual timeseries USE YOERADGHG , ONLY : YRADGHG ! Climatology interpolated to current model time USE RADIATION_SETUP , ONLY : SETUP_RADIATION_SCHEME +USE YOEAEROP , ONLY : STRATO_CMIP_NMONTH, STRATO_CMIP_NTB, & + & STRATO_CMIP_NALT, STRATO_CMIP_NLAT, STRATO_CMIP_NSB, & + & CHECK_SUN_MEAN, CHECK_EARTH_MEAN, & + & STRATO_FIRSTYEAR, STRATO_LASTYEAR, STRATO_CMIP_NTIME USE ND_PARAM , ONLY : ND_PARAM_SETUP !------------------------------------------------------------------------------- @@ -188,7 +192,7 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) INTEGER(KIND=JPIM) :: I_MIN_HALO INTEGER(KIND=JPIM) :: ISW,JUV,IDAYUV INTEGER(KIND=JPIM) :: IDGSAH,IDGENH - +INTEGER(KIND=JPIM) :: IGPBLKS_RAD ! CMIP strat.aerosols LOGICAL :: LLINEAR_GRID, LLREDURAD LOGICAL :: LLDEBUG,LLP,LLGRIDONLY @@ -287,6 +291,9 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) CHARACTER (LEN=80), POINTER :: CO3DATAFIL CHARACTER (LEN=256), POINTER :: CGHGCLIMFILE, CGHGTIMESERIESFILE, CSOLARIRRADIANCEFILE +CHARACTER(LEN=500), POINTER ::CCMIP_STRAT_FULL, CCMIP_STRAT_FULL_CLIM +LOGICAL, POINTER :: LCMIP_STRATAER_BCKGD, LCMIP_STRATAER_CMIP6, LCMIP_STRATAER_CMIP7 + #include "naerad.nam.h" #include "naercli.nam.h" #include "namrgri.nam.h" @@ -306,6 +313,7 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) & YDEPHY=>YDMODEL%YRML_PHY_EC%YREPHY,YDEAERATM=>YDMODEL%YRML_PHY_RAD%YREAERATM, & & YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO, & & YDAERM7=>YDMODEL%YRML_PHY_AER%YREAEROPT,&! use this to transfer AOD, SSA and ASY to rad scheme + & YDAERSTRAT=>YDMODEL%YRML_PHY_AER%YREAEROSTRAT,& & YDEAERD=>YDMODEL%YRML_PHY_RAD%YREAERD, RADGRID=>YDMODEL%YRML_PHY_RAD%RADGRID, & & YDPHNC=>YDMODEL%YRML_PHY_SLIN%YRPHNC, YDRADF=>YDMODEL%YRML_PHY_RAD%YRRADF, YDRI=>YDMODEL%YRML_PHY_RAD%YRRI, & & YDRO=>YDMODEL%YRML_PHY_RAD%YRRO,YDRADIATION=>YDMODEL%YRML_PHY_RAD%YRADIATION) @@ -351,6 +359,11 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) & LHLRADUPD=>YDPHY%LHLRADUPD, RADGR=>YDPARAR%RADGR, RADSN=>YDPARAR%RADSN) ! Associate pointers for variables in namelist NAERAD +CCMIP_STRAT_FULL=>YDERAD%CCMIP_STRAT_FULL +CCMIP_STRAT_FULL_CLIM=>YDERAD%CCMIP_STRAT_FULL_CLIM +LCMIP_STRATAER_BCKGD=>YDERAD%LCMIP_STRATAER_BCKGD +LCMIP_STRATAER_CMIP6=>YDERAD%LCMIP_STRATAER_CMIP6 +LCMIP_STRATAER_CMIP7=>YDERAD%LCMIP_STRATAER_CMIP7 NCLOUDACT => YDERAD%NCLOUDACT NAEROOPT => YDERAD%NAEROOPT @@ -520,7 +533,12 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) IDUM=0 !* 2.1 PRESET INDICES IN *YOERAD* ! -------------------------- - +!CMIP6/CMIP7 stratospheric aerosols +LCMIP_STRATAER_BCKGD=.FALSE. +LCMIP_STRATAER_CMIP6=.FALSE. +LCMIP_STRATAER_CMIP7=.FALSE. +CCMIP_STRAT_FULL='' +CCMIP_STRAT_FULL_CLIM='' ! Cloud activation scheme NCLOUDACT= 0 ! 0: effective radius from IFS code and default activation ! 1: use Morales & Nenes activation scheme from HAMM7 @@ -2139,6 +2157,44 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) IF (NCLOUDACT == 1) CALL ND_PARAM_SETUP ENDIF ENDIF +! - 6.0.1 PARAMETERS FOR stratospheric aerosols +!CMIP stratospheric aerosols +IF (LCMIP_STRATAER_CMIP7) THEN + LCMIP_STRATAER_CMIP6 = .FALSE. +ENDIF +IF (LCMIP_STRATAER_CMIP6 .OR. LCMIP_STRATAER_CMIP7) THEN ! + IGPBLKS_RAD=(RADGRID%NGPTOT-1)/NRPROMA+1 + ALLOCATE(YDAERSTRAT%STRAT_AOD(NRPROMA,NFLEVG,NTSW,STRATO_CMIP_NMONTH,IGPBLKS_RAD)) + ALLOCATE(YDAERSTRAT%STRAT_AAOD(NRPROMA,NFLEVG,NTSW,STRATO_CMIP_NMONTH,IGPBLKS_RAD)) + ALLOCATE(YDAERSTRAT%STRAT_REFAOD(NRPROMA,NFLEVG,NTSW,STRATO_CMIP_NMONTH,IGPBLKS_RAD)) + ALLOCATE(YDAERSTRAT%STRAT_AAOD_LW(NRPROMA,NFLEVG,STRATO_CMIP_NTB,STRATO_CMIP_NMONTH,IGPBLKS_RAD)) + + STRATO_CMIP_NALT=NFLEVG + ALLOCATE(YDAERSTRAT%STRATO_CMIP_ALT(STRATO_CMIP_NALT)) + ALLOCATE(YDAERSTRAT%AOD_SUN(STRATO_CMIP_NALT,STRATO_CMIP_NLAT,STRATO_CMIP_NSB,STRATO_CMIP_NMONTH)) + ALLOCATE(YDAERSTRAT%AAOD_SUN(STRATO_CMIP_NALT,STRATO_CMIP_NLAT,STRATO_CMIP_NSB,STRATO_CMIP_NMONTH)) + ALLOCATE(YDAERSTRAT%REFAOD_SUN(STRATO_CMIP_NALT,STRATO_CMIP_NLAT,STRATO_CMIP_NSB,STRATO_CMIP_NMONTH)) + ALLOCATE(YDAERSTRAT%AAOD_EARTH(STRATO_CMIP_NALT,STRATO_CMIP_NLAT,STRATO_CMIP_NTB,STRATO_CMIP_NMONTH)) + ALLOCATE(YDAERSTRAT%AOD_SUN_MEAN(STRATO_CMIP_NALT,STRATO_CMIP_NLAT,STRATO_CMIP_NSB)) + ALLOCATE(YDAERSTRAT%AAOD_SUN_MEAN(STRATO_CMIP_NALT,STRATO_CMIP_NLAT,STRATO_CMIP_NSB)) + ALLOCATE(YDAERSTRAT%REFAOD_SUN_MEAN(STRATO_CMIP_NALT,STRATO_CMIP_NLAT,STRATO_CMIP_NSB)) + ALLOCATE(YDAERSTRAT%AAOD_EARTH_MEAN(STRATO_CMIP_NALT,STRATO_CMIP_NLAT,STRATO_CMIP_NTB)) + + YDAERSTRAT%AOD_SUN_MEAN=CHECK_SUN_MEAN + YDAERSTRAT%AAOD_SUN_MEAN=CHECK_SUN_MEAN + YDAERSTRAT%REFAOD_SUN_MEAN=CHECK_SUN_MEAN + YDAERSTRAT%AAOD_EARTH_MEAN=CHECK_EARTH_MEAN +ENDIF +IF (LCMIP_STRATAER_CMIP6) THEN + STRATO_FIRSTYEAR = 1850 + STRATO_LASTYEAR = 2014 + STRATO_CMIP_NTIME = 1980 +ENDIF +IF (LCMIP_STRATAER_CMIP7) THEN + STRATO_FIRSTYEAR = 1750 + STRATO_LASTYEAR = 2023 + STRATO_CMIP_NTIME = 3288 +ENDIF ! - 6.1. PARAMETERS FOR THE STANDARD TEGEN AEROSOL CLIMATOLOGY ! ----------------------------------------------------- diff --git a/ifs-source/arpifs/utility/updtim.F90 b/ifs-source/arpifs/utility/updtim.F90 index d15de184..6240e997 100644 --- a/ifs-source/arpifs/utility/updtim.F90 +++ b/ifs-source/arpifs/utility/updtim.F90 @@ -187,6 +187,8 @@ SUBROUTINE UPDTIM(YDGEOMETRY,YDFIELDS,YDMODEL,KSTEP,PTDT,PTSTEP,LDCLUPD,LDUPDECA #include "fcttrm.func.h" #include "updcal.intfb.h" +#include "cmip_strato_aero.intfb.h" + ! ------------------------------------------------------------------ IF (LHOOK) CALL DR_HOOK('UPDTIM',0,ZHOOK_HANDLE) ASSOCIATE(YDDIM=>YDGEOMETRY%YRDIM,YDDIMV=>YDGEOMETRY%YRDIMV,YDGEM=>YDGEOMETRY%YRGEM, YDMP=>YDGEOMETRY%YRMP, & @@ -245,7 +247,9 @@ SUBROUTINE UPDTIM(YDGEOMETRY,YDFIELDS,YDMODEL,KSTEP,PTDT,PTSTEP,LDCLUPD,LDUPDECA & LMPHYS=>YDPHY%LMPHYS, LSIMPH=>YDSIMPHL%LSIMPH, LOZONE=>YDPHY%LOZONE, & & LRAYFM=>YDPHY%LRAYFM, LRAYFM15=>YDPHY%LRAYFM15, LRAYLU=>YDPHY%LRAYLU, & & LRMU0M=>YDPHY%LRMU0M, LSOLV=>YDPHY%LSOLV, TSPHY=>YDPHY2%TSPHY, & - & RII0=>YDPHY3%RII0) + & RII0=>YDPHY3%RII0, & + & LCMIP_STRATAER_CMIP6=>YDERAD%LCMIP_STRATAER_CMIP6,& + & LCMIP_STRATAER_CMIP7=>YDERAD%LCMIP_STRATAER_CMIP7) ! ------------------------------------------------------------------ LLUPDECAEC=.TRUE. @@ -758,7 +762,10 @@ SUBROUTINE UPDTIM(YDGEOMETRY,YDFIELDS,YDMODEL,KSTEP,PTDT,PTSTEP,LDCLUPD,LDUPDECA ENDIF ENDIF CALL GSTATS(1904,1) - + !CMIP6/7 stratospheric aerosols + IF (LCMIP_STRATAER_CMIP6 .OR. LCMIP_STRATAER_CMIP7) THEN + CALL CMIP_STRATO_AERO(YDMODEL) + ENDIF IF (LRMU0M) THEN ZSTATI=REAL(IZT,JPRB)+NRADFR*ITIME ZTIMTR=RTIMST+ZSTATI diff --git a/ifs-source/radiation/module/radiation_aerosol_optics.F90 b/ifs-source/radiation/module/radiation_aerosol_optics.F90 index 9a8bd752..48ff5e53 100644 --- a/ifs-source/radiation/module/radiation_aerosol_optics.F90 +++ b/ifs-source/radiation/module/radiation_aerosol_optics.F90 @@ -4,7 +4,7 @@ ! ! Author: Robin Hogan ! Email: r.j.hogan@ecmwf.int -! License: see the COPYING file for details +! License: see the COPYING file for details ! ! Modifications ! 2018-04-15 R Hogan Add "direct" option @@ -521,7 +521,7 @@ end subroutine add_aerosol_optics_direct ! If they are provided, adds AOD, SSA, ASYM of aerosols to corresponding variables in ! radiation module. ! Note: - ! - Weighting of SSA, ASYM (added not background) is done before calling this subroutine + ! - Weighting of SSA, ASYM is done before calling this subroutine ! - For LW only AOD is added ! Original code: A.Laakso (FMI) subroutine add_aerosol_aod_ssa_asym(ncol, nlev, istartcol, iendcol, config, aerosol, & @@ -557,39 +557,60 @@ subroutine add_aerosol_aod_ssa_asym(ncol, nlev, istartcol, iendcol, config, aero istartlev = lbound(aerosol%od_sw,2) iendlev = ubound(aerosol%od_sw,2) - ! Loop over position - do jlev = istartlev,iendlev - do jcol = istartcol,iendcol - do jg = 1,config%n_g_lw - - od_lw(jg,jlev,jcol) = od_lw(jg,jlev,jcol)& - + aerosol%od_sw(jcol,jlev,config%n_bands_sw+config%i_band_from_reordered_g_lw(jg)) - end do + if (config%do_sw) then + ! Loop over position + do jlev = istartlev,iendlev + do jcol = istartcol,iendcol ! Weighting - only for existing aerosols do jg = 1,config%n_g_sw - iband=config%i_band_from_reordered_g_sw(jg) - IF (aerosol%od_sw(jcol,jlev,iband) > 0.0_jprb) THEN - g_sw(jg,jlev,jcol) = g_sw(jg,jlev,jcol)*ssa_sw(jg,jlev,jcol)*od_sw(jg,jlev,jcol) & - +aerosol%g_sw(jcol,jlev,iband) - - ssa_sw(jg,jlev,jcol) = ssa_sw(jg,jlev,jcol)*od_sw(jg,jlev,jcol) & - +aerosol%ssa_sw(jcol,jlev,iband) - - od_sw(jg,jlev,jcol) = od_sw(jg,jlev,jcol) & - +aerosol%od_sw(jcol,jlev,iband) - - IF (ssa_sw(jg,jlev,jcol) /= 0.0_jprb) THEN - g_sw(jg,jlev,jcol)=g_sw(jg,jlev,jcol)/ssa_sw(jg,jlev,jcol) - ENDIF - !IF (od_sw(jg,jlev,jcol) /= 0.0_jprb) THEN - ssa_sw(jg,jlev,jcol)=ssa_sw(jg,jlev,jcol)/od_sw(jg,jlev,jcol) - ENDIF + iband=config%i_band_from_reordered_g_sw(jg) + IF (aerosol%od_sw(iband,jlev,jcol) > 0.0_jprb) THEN + g_sw(jg,jlev,jcol) = g_sw(jg,jlev,jcol)*ssa_sw(jg,jlev,jcol)*od_sw(jg,jlev,jcol) & + +aerosol%g_sw(iband,jlev,jcol) + + ssa_sw(jg,jlev,jcol) = ssa_sw(jg,jlev,jcol)*od_sw(jg,jlev,jcol) & + +aerosol%ssa_sw(iband,jlev,jcol) + + od_sw(jg,jlev,jcol) = od_sw(jg,jlev,jcol) & + +aerosol%od_sw(iband,jlev,jcol) + + IF (ssa_sw(jg,jlev,jcol) /= 0.0_jprb) THEN + g_sw(jg,jlev,jcol)=g_sw(jg,jlev,jcol)/ssa_sw(jg,jlev,jcol) + ENDIF + !IF (od_sw(jg,jlev,jcol) /= 0.0_jprb) THEN + ssa_sw(jg,jlev,jcol)=ssa_sw(jg,jlev,jcol)/od_sw(jg,jlev,jcol) + !ENDIF + ENDIF end do - end do ! Loop over column - end do ! Loop over level + end do ! Loop over column + end do ! Loop over level + endif + + if (config%do_lw) then + + if (ubound(aerosol%od_lw,1) /= config%n_bands_lw) then + write(nulerr,'(a,i0,a,i0)') '*** Error: aerosol%od_lw contains ', & + & ubound(aerosol%od_lw,1), ' band, expected ', & + & config%n_bands_lw + call radiation_abort() + end if + + istartlev = lbound(aerosol%od_lw,2) + iendlev = ubound(aerosol%od_lw,2) + !A.Laakso: This module is done for aerosols without scattering of LW + ! Loop over position + do jcol = istartcol,iendcol + do jlev = istartlev,iendlev + do jg = 1,config%n_g_lw + od_lw(jg,jlev,jcol) = od_lw(jg,jlev,jcol) & + & + aerosol%od_lw(config%i_band_from_reordered_g_lw(jg),jlev,jcol) + end do + end do + end do + endif if (lhook) call dr_hook('radiation_aerosol_optics:add_aerosol_aod_ssa_asym',1,hook_handle) end subroutine diff --git a/ifs-source/radiation/module/radiation_interface.F90 b/ifs-source/radiation/module/radiation_interface.F90 index 676d4390..4ed5ae6d 100644 --- a/ifs-source/radiation/module/radiation_interface.F90 +++ b/ifs-source/radiation/module/radiation_interface.F90 @@ -194,7 +194,7 @@ end subroutine set_gas_units ! to reverse the order for the computation and then reverse the ! order of the output fluxes to match the inputs. subroutine radiation(ncol, nlev, istartcol, iendcol, config, & - & single_level, thermodynamics, gas, cloud, aerosol, flux) + & single_level, thermodynamics, gas, cloud, aerosol, strat_aerosol, flux) use parkind1, only : jprb use yomhook, only : lhook, dr_hook, jphook @@ -244,7 +244,7 @@ subroutine radiation(ncol, nlev, istartcol, iendcol, config, & type(thermodynamics_type),intent(in) :: thermodynamics type(gas_type), intent(in) :: gas type(cloud_type), intent(inout):: cloud - type(aerosol_type), intent(in) :: aerosol + type(aerosol_type), intent(in) :: aerosol,strat_aerosol ! Output type(flux_type), intent(inout):: flux @@ -311,7 +311,7 @@ subroutine radiation(ncol, nlev, istartcol, iendcol, config, & ! call the radiation scheme and then reverses the returned ! fluxes call radiation_reverse(ncol, nlev, istartcol, iendcol, config, & - & single_level, thermodynamics, gas, cloud, aerosol, flux) + & single_level, thermodynamics, gas, cloud, aerosol, strat_aerosol, flux) else ! Input arrays arranged in order of increasing pressure / @@ -388,10 +388,9 @@ subroutine radiation(ncol, nlev, istartcol, iendcol, config, & & od_lw, ssa_lw, g_lw, od_sw, ssa_sw, g_sw) ! optical properties from aerosol model if provided - !call add_aerosol_aod_ssa_asym(ncol,nlev,istartcol,iendcol, & - ! & config, aerosol, & - ! & od_lw, ssa_lw, g_lw, od_sw, ssa_sw, g_sw) - + call add_aerosol_aod_ssa_asym(ncol,nlev,istartcol,iendcol, & + & config, strat_aerosol, & + & od_lw, ssa_lw, g_lw, od_sw, ssa_sw, g_sw) end if else g_sw = 0.0_jprb @@ -517,7 +516,7 @@ end subroutine radiation ! subroutine calls, and is called by "radiation", it must be in this ! module to avoid circular dependencies. subroutine radiation_reverse(ncol, nlev, istartcol, iendcol, config, & - & single_level, thermodynamics, gas, cloud, aerosol, flux) + & single_level, thermodynamics, gas, cloud, aerosol, strat_aerosol, flux) use parkind1, only : jprb @@ -539,7 +538,7 @@ subroutine radiation_reverse(ncol, nlev, istartcol, iendcol, config, & type(thermodynamics_type),intent(in) :: thermodynamics type(gas_type), intent(in) :: gas type(cloud_type), intent(in) :: cloud - type(aerosol_type), intent(in) :: aerosol + type(aerosol_type), intent(in) :: aerosol, strat_aerosol ! Output type(flux_type), intent(inout):: flux @@ -547,7 +546,7 @@ subroutine radiation_reverse(ncol, nlev, istartcol, iendcol, config, & type(thermodynamics_type) :: thermodynamics_rev type(gas_type) :: gas_rev type(cloud_type) :: cloud_rev - type(aerosol_type) :: aerosol_rev + type(aerosol_type) :: aerosol_rev, strat_aerosol_rev type(flux_type) :: flux_rev ! Start and end levels for aerosol data @@ -628,11 +627,23 @@ subroutine radiation_reverse(ncol, nlev, istartcol, iendcol, config, & & = aerosol%g_sw(:,aerosol%iendlev:aerosol%istartlev:-1,:) end if + if (allocated(strat_aerosol%od_sw)) then + strat_aerosol_rev%od_sw(:,istartlev:iendlev,:) & + & = strat_aerosol%od_sw(:,strat_aerosol%iendlev:strat_aerosol%istartlev:-1,:) + end if + if (allocated(strat_aerosol%ssa_sw)) then + strat_aerosol_rev%ssa_sw(:,istartlev:iendlev,:) & + & = strat_aerosol%ssa_sw(:,strat_aerosol%iendlev:strat_aerosol%istartlev:-1,:) + end if + if (allocated(aerosol%g_sw)) then + strat_aerosol_rev%g_sw(:,istartlev:iendlev,:) & + & = strat_aerosol%g_sw(:,strat_aerosol%iendlev:strat_aerosol%istartlev:-1,:) + end if ! Run radiation scheme on reversed profiles call radiation(ncol, nlev,istartcol,iendcol, & & config, single_level, thermodynamics_rev, gas_rev, & - & cloud_rev, aerosol_rev, flux_rev) + & cloud_rev, aerosol_rev, strat_aerosol_rev, flux_rev) ! Reorder fluxes if (allocated(flux%lw_up)) then @@ -674,7 +685,7 @@ subroutine radiation_reverse(ncol, nlev, istartcol, iendcol, config, & call cloud_rev%deallocate call flux_rev%deallocate call aerosol_rev%deallocate - + call strat_aerosol_rev%deallocate end subroutine radiation_reverse end module radiation_interface From 58146eb2ac843091cb3f9dba6192306114a5d07e Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Wed, 29 Oct 2025 10:29:42 +0000 Subject: [PATCH 098/129] Pull request #57: Use HAM routine for seasalt, update BC/OC densities, and account for tendencies when calling M&N Merge in ~NM6/openifs-48r1 from bugfix/OIFS-636-use-tendency-in-M-and-N to knmi-m7 Squashed commit of the following: commit fd555c6f437ab8d7f5f273b7282184dbe591cc5a Author: Philippe Le Sager Date: Wed Oct 29 11:02:41 2025 +0100 Revert OC molecular weight commit 69790b908e0da34af4db242a65e9ef427895cf71 Author: Philippe Le Sager Date: Mon Oct 27 16:02:11 2025 +0100 Fix OIFS-640 commit 1dcad5d49afaff211f2d9f09ae36d1a794289184 Author: Philippe Le Sager Date: Wed Oct 22 20:19:34 2025 +0200 Fix OIFS-643 commit 8b0c9f7b9c3587503dc53737b8f86fc460d5fe3b Author: Philippe Le Sager Date: Wed Oct 22 20:18:27 2025 +0200 Fix OIFS-636 --- ifs-source/arpifs/m7/module/m7_data.F90 | 10 +++++----- ifs-source/arpifs/m7/module/mo_ham.F90 | 2 +- ifs-source/arpifs/m7/module/mo_ham_species.F90 | 4 ++-- ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 | 10 ++++++---- 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/ifs-source/arpifs/m7/module/m7_data.F90 b/ifs-source/arpifs/m7/module/m7_data.F90 index c21f83ae..958b4bbd 100755 --- a/ifs-source/arpifs/m7/module/m7_data.F90 +++ b/ifs-source/arpifs/m7/module/m7_data.F90 @@ -50,11 +50,11 @@ MODULE M7_DATA ! ndust = 1 Balkanski et al. (2002) ! = 2 Tegen et al. (2002) ! - nseasalt = 2, & ! Sea Salt emission scheme: - ! - ! nseasalt = 1 Monahan (1986) - ! = 2 Schulz et al. (2002) - ! +!mo_ham.f90 is used nseasalt = 2, & ! Sea Salt emission scheme: +!mo_ham.f90 is used ! +!mo_ham.f90 is used ! nseasalt = 1 Monahan (1986) +!mo_ham.f90 is used ! = 2 Schulz et al. (2002) +!mo_ham.f90 is used ! npist = 3, & ! DMS emission scheme: ! ! npist = 1 Liss & Merlivat (1986) diff --git a/ifs-source/arpifs/m7/module/mo_ham.F90 b/ifs-source/arpifs/m7/module/mo_ham.F90 index 04ecaadd..77165bdc 100644 --- a/ifs-source/arpifs/m7/module/mo_ham.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham.F90 @@ -163,7 +163,7 @@ MODULE mo_ham ! SST scheme. OIFS supports only the "Gong + SST" scheme from either TM5 ! implementation (nseasalt=0) or HAMM7 one (nseasalt=8), hardcoded ! here. - INTEGER :: nseasalt = 0 ! Sea Salt emission scheme: + INTEGER :: nseasalt = 8 ! Sea Salt emission scheme: #endif ! ! nseasalt = 1 Monahan (1986) diff --git a/ifs-source/arpifs/m7/module/mo_ham_species.F90 b/ifs-source/arpifs/m7/module/mo_ham_species.F90 index aea4f4a9..e87bdba9 100755 --- a/ifs-source/arpifs/m7/module/mo_ham_species.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_species.F90 @@ -345,7 +345,7 @@ SUBROUTINE ham_species mw = 12.010_dp, & tsubmname = 'HAM', & itrtype = itrprog, & - density = 2000._dp, & + density = 1800._dp, & iaerorad = iradbc, & lwatsol = .FALSE., & ldrydep = .TRUE., & @@ -364,7 +364,7 @@ SUBROUTINE ham_species mw = 180._dp, & tsubmname = 'HAM', & itrtype = itrprog, & - density = 2000._dp, & + density = 1300._dp, & iaerorad = iradoc, & lwatsol = .TRUE., & kappa = 0.06_dp, & diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index 1bb0e073..914678c1 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -931,15 +931,17 @@ SUBROUTINE HAMM7_INTERFACE( & ! ZSIGMA_W(KIDIA:KFDIA,1:KLEV)= MAX(0.1_JPRB, (ZTUNPAR*((ZTKEM1(KIDIA:KFDIA,1:KLEV))**0.5_JPRB))) ! m/s !END IF - ! put default values for effective radii - reffl(KIDIA:KFDIA,1:KLEV,ZKROW) = 4._JPRB ! comes from liquid effective radius routine (PP_MIN_RE_UM) - reffi(KIDIA:KFDIA,1:KLEV,ZKROW) = 80._JPRB*0.64952_JPRB ! comes from ice effective radius routine (ZDEFAULT_RE_UM) + ! Update mixing ratios with tendencies + DO JT =1,NTRAC + ZXTP1(KIDIA:KFDIA,1:KLEV,JT) = ZXTM1(KIDIA:KFDIA,1:KLEV,JT) + ZXTTE(KIDIA:KFDIA,1:KLEV,JT) * TIME_STEP_LEN + END DO + CALL AER_ACTIV(KIDIA, KFDIA, KTDIA, KLON, KLEV, KSTGLO, & & PRS1, PRSF1, PTP, ZQP, ZQSAT, & & PVERVEL, ZAP, PLP, PIP, & & PLSM, PGELAM, PGEMU, & !PSLON, PGEMU, & & PGFL, YDMODEL, ZCDNCACT, ZICNC, REFFL(1:KLON,1:KLEV,ZKROW), REFFI(1:KLON,1:KLEV,ZKROW), & - & ZSMAXMN, ZM6DRY, ZXTM1, KTRAC, ZSIGMA_W, ZFRACN) + & ZSMAXMN, ZM6DRY, ZXTP1, KTRAC, ZSIGMA_W, ZFRACN) !<-- Store CDNC (number of activated particles) and ICNC as a number mixing ratio to tracer values ZXTM1(KIDIA:KFDIA,1:KLEV,idt_cdnc) = (MAX(ZCDNCACT(KIDIA:KFDIA,1:KLEV),((1.0E6_JPRB)*ZMIN_CDNC)))/ZRHO(KIDIA:KFDIA,1:KLEV) ! [#/kg] and treshold CDNC From d63e6d7ff2a7430fe6945d899af8802cc26ecab2 Mon Sep 17 00:00:00 2001 From: Eemeli Holopainen Date: Tue, 4 Nov 2025 13:03:49 +0000 Subject: [PATCH 099/129] Pull request #58: Fix use of min/def CDNC in MBN activation (OIFS-637) Merge in ~NM6/openifs-48r1 from bugfix_MBN_activation to knmi-m7 Squashed commit of the following: commit 52ef8e0ebdd49bdff3a13864448a072d60ba0042 Author: Philippe Le Sager Date: Tue Nov 4 13:59:54 2025 +0100 Small cleanup commit 9eac8af66f0c3b58a16131932a732c5ac82c709a Author: Eemeli Holopainen Date: Mon Nov 3 13:01:54 2025 +0200 Add default values for liq and ice effective radii and use them in related calculations. commit 5a48f849920d2cd6435242853fb16f8f5fc84591 Author: Eemeli Holopainen Date: Mon Nov 3 11:01:11 2025 +0200 Bugfix to MBN activation. Some cleanup. 0 threshold to nd_param to account for very low critical supersaturations. Add CDNC and ICNC to tendencies for output. --- ifs-source/arpifs/m7/hamm7_init.F90 | 8 +- ifs-source/arpifs/m7/module/mo_activ.F90 | 4 +- ifs-source/arpifs/m7/module/nd_param.F90 | 2 +- .../arpifs/m7/phys_ec/hamm7_interface.F90 | 65 ++++++++++--- .../arpifs/m7/phys_ec/yoe_aer_activ.F90 | 91 ++++++------------- 5 files changed, 84 insertions(+), 86 deletions(-) diff --git a/ifs-source/arpifs/m7/hamm7_init.F90 b/ifs-source/arpifs/m7/hamm7_init.F90 index 3ed6c0af..0736abbc 100644 --- a/ifs-source/arpifs/m7/hamm7_init.F90 +++ b/ifs-source/arpifs/m7/hamm7_init.F90 @@ -138,6 +138,10 @@ SUBROUTINE hamm7_init(YGFL, YRRIP, CHEM_SCHEME) !eehol: set advection scheme iadvec = tpcore !comes from ECHAM mo_control.f90 +!eehol: activation initialization +nactivpdf = 1 !eehol: using PDF to calculate updraft. Hardcoded for now.. need to check this later (add setphys to oifs?) +ncd_activ = 2 !eehol: Abdul-Razzak and Ghan activation scheme. Hardcoded for now.. need to check this later (add setphys to oifs?) +lcdnc_progn = .TRUE. !eehol: set submodel parameters and flags CALL init_splist !eehol: added init for splist @@ -152,10 +156,6 @@ SUBROUTINE hamm7_init(YGFL, YRRIP, CHEM_SCHEME) ! ham_nucl_initialize, if nsnucl+nonucl > 0 !CALL ham_init_memory !eehol: this is not needed now -!eehol: activation initialization -nactivpdf = 1 !eehol: using PDF to calculate updraft. Hardcoded for now.. need to check this later (add setphys to oifs?) -ncd_activ = 2 !eehol: Abdul-Razzak and Ghan activation scheme. Hardcoded for now.. need to check this later (add setphys to oifs?) -lcdnc_progn = .TRUE. CALL activ_initialize !eehol: set cdnc and icnc indices for HAM diff --git a/ifs-source/arpifs/m7/module/mo_activ.F90 b/ifs-source/arpifs/m7/module/mo_activ.F90 index 6aa8a82d..8abdda47 100644 --- a/ifs-source/arpifs/m7/module/mo_activ.F90 +++ b/ifs-source/arpifs/m7/module/mo_activ.F90 @@ -31,10 +31,10 @@ MODULE mo_activ REAL(dp), POINTER :: ptr(:,:,:) END TYPE vmem3d #endif - + +#ifdef HAMMOZ REAL(dp), PUBLIC, POINTER :: swat(:,:,:) REAL(dp), PUBLIC, POINTER :: w_cape(:,:) -#ifdef HAMMOZ REAL(dp), PUBLIC, POINTER :: w_sigma(:,:,:) REAL(dp), PUBLIC, POINTER :: reffl(:,:,:) REAL(dp), PUBLIC, POINTER :: reffi(:,:,:) diff --git a/ifs-source/arpifs/m7/module/nd_param.F90 b/ifs-source/arpifs/m7/module/nd_param.F90 index 22481afc..2b3a9fe3 100644 --- a/ifs-source/arpifs/m7/module/nd_param.F90 +++ b/ifs-source/arpifs/m7/module/nd_param.F90 @@ -539,7 +539,7 @@ SUBROUTINE SINTEGRAL (SPAR, SUMMA, WPARCEL, XFHH, BET2, & SUMFHH = 0.0_JPRB !Contribution of FHH integral DO J = 1, BOX%NMD - IF (SG(J).GT.EPSILON(1.0_JPRB)) THEN !eehol: do not calculate if SG=0 or less + IF (SG(J).GT.(0.0_JPRB)) THEN !eehol: do not calculate if SG=0 or less IF (BOX%MODE(J).EQ.1) THEN ! Kohler modes diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index 914678c1..3269e0d1 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -316,6 +316,11 @@ SUBROUTINE HAMM7_INTERFACE( & REAL(KIND=JPRB), PARAMETER :: ZEPSEC=1e-14_JPRB +REAL(KIND=JPRB), PARAMETER :: ZMIN_CDNC=10.0_JPRB !eehol: minimum CDNC (can be changed but for now 10 cm-3) +REAL(KIND=JPRB), PARAMETER :: ZDEF_CDNC=125.0_JPRB !eehol: default CDNC (can be changed but for now 125 cm-3) +REAL(KIND=JPRB), PARAMETER :: ZDEF_RE_LIQ=4.0_JPRB !eehol: default liq eff radius (can be changed but for now 4 mu m comes from liquid effective radius routine (PP_MIN_RE_UM)) +REAL(KIND=JPRB), PARAMETER :: ZDEF_RE_ICE=80._JPRB*0.64952_JPRB !eehol: default ice eff radius (comes from ice effective radius routine (ZDEFAULT_RE_UM)) +REAL(KIND=JPRB), PARAMETER :: ZTUNPAR=0.8164965_JPRB !eehol: tuning parameter for sigma_w derived from TKE (square root of 2/3 (isotropy assumption)) REAL(KIND=JPRB),PARAMETER :: INFINITY=HUGE(1._JPRB) @@ -346,6 +351,8 @@ SUBROUTINE HAMM7_INTERFACE( & REAL(KIND=JPRB) :: ZNACT(KLON,KLEV,nclass) !number of activated particles per mode [m-3] REAL(KIND=JPRB) :: ZFRACN(KLON,KLEV,nclass) !fraction of activated particles per mode REAL(KIND=JPRB) :: ZCDNCACT(KLON,KLEV) !number of activated particles [m-3] +REAL(KIND=JPRB) :: ZCDNC_temp(KLON,KLEV) !eehol: temporary for tendency of CDNC +REAL(KIND=JPRB) :: ZICNC_temp(KLON,KLEV) !eehol: temporary for tendency of ICNC REAL(KIND=JPRB) :: ZRE_LIQ(KLON,KLEV)! liquid effective radius REAL(KIND=JPRB) :: ZNACT_AS(KLON,KLEV),ZNACT_CS(KLON,KLEV),ZNACT_KS(KLON,KLEV) ! variables for modewise activated fraction calculations REAL(KIND=JPRB) :: ZFRAC_KS,ZFRAC_AS,ZFRAC_CS ! variables for modewise activated fraction calculation @@ -826,6 +833,10 @@ SUBROUTINE HAMM7_INTERFACE( & END DO !ENDIF +!eehol: init CDNC and ICNC with non updated to temporary HAMM7 variables (unit in #/kg) +ZCDNC_temp(KIDIA:KFDIA,1:KLEV) = (1.0E6_JPRB*PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH))/ZRHO(KIDIA:KFDIA,1:KLEV) +ZICNC_temp(KIDIA:KFDIA,1:KLEV) = (1.0E6_JPRB*PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH))/ZRHO(KIDIA:KFDIA,1:KLEV) + ! implementation of HAM-M7 ZWND(KIDIA:KFDIA) = 0._JPRB DO JL=KIDIA,KFDIA @@ -919,8 +930,8 @@ SUBROUTINE HAMM7_INTERFACE( & END DO ! Default values for effective radii - REFFL(KIDIA:KFDIA,1:KLEV,ZKROW) = 4._JPRB ! comes from liquid effective radius routine (PP_MIN_RE_UM) - REFFI(KIDIA:KFDIA,1:KLEV,ZKROW) = 80._JPRB*0.64952_JPRB ! comes from ice effective radius routine (ZDEFAULT_RE_UM) + REFFL(KIDIA:KFDIA,1:KLEV,ZKROW) = ZDEF_RE_LIQ ! comes from liquid effective radius routine (PP_MIN_RE_UM) + REFFI(KIDIA:KFDIA,1:KLEV,ZKROW) = ZDEF_RE_ICE ! comes from ice effective radius routine (ZDEFAULT_RE_UM) ! Cloud activation scheme CLDACT: IF ( NCLOUDACT == 1 ) THEN ! Morales and Nenes @@ -941,7 +952,8 @@ SUBROUTINE HAMM7_INTERFACE( & & PVERVEL, ZAP, PLP, PIP, & & PLSM, PGELAM, PGEMU, & !PSLON, PGEMU, & & PGFL, YDMODEL, ZCDNCACT, ZICNC, REFFL(1:KLON,1:KLEV,ZKROW), REFFI(1:KLON,1:KLEV,ZKROW), & - & ZSMAXMN, ZM6DRY, ZXTP1, KTRAC, ZSIGMA_W, ZFRACN) + & ZSMAXMN, ZM6DRY, ZXTP1, KTRAC, ZSIGMA_W, ZFRACN, ZMIN_CDNC, ZDEF_CDNC, & + & ZQLWP, LLIQCLD, LICECLD, ZDEF_RE_LIQ, ZDEF_RE_ICE) !<-- Store CDNC (number of activated particles) and ICNC as a number mixing ratio to tracer values ZXTM1(KIDIA:KFDIA,1:KLEV,idt_cdnc) = (MAX(ZCDNCACT(KIDIA:KFDIA,1:KLEV),((1.0E6_JPRB)*ZMIN_CDNC)))/ZRHO(KIDIA:KFDIA,1:KLEV) ! [#/kg] and treshold CDNC @@ -1007,8 +1019,9 @@ SUBROUTINE HAMM7_INTERFACE( & DO JCLASS = 1,NCLASS ZFRACN(KIDIA:KFDIA,1:KLEV,JCLASS) = MERGE(ZFRACN(KIDIA:KFDIA,1:KLEV,JCLASS),0._JPRB,LLIQCLD(KIDIA:KFDIA,1:KLEV)) ENDDO - ! treshold CDNC and ICNC to gridcells with only liquid or ice clouds - ZCDNCACT(KIDIA:KFDIA,1:KLEV) = MERGE(ZCDNCACT(KIDIA:KFDIA,1:KLEV),1.0E6_JPRB*ZMIN_CDNC,LLIQCLD(KIDIA:KFDIA,1:KLEV)) !mask only values inside liq cloud + + ! threshold CDNC and ICNC to grid cells with only liquid or ice clouds + ZCDNCACT(KIDIA:KFDIA,1:KLEV) = MERGE(ZCDNCACT(KIDIA:KFDIA,1:KLEV),1.0E6_JPRB*ZDEF_CDNC,LLIQCLD(KIDIA:KFDIA,1:KLEV)) !mask only values inside liq cloud ZICNC(KIDIA:KFDIA,1:KLEV) = MERGE(ZICNC(KIDIA:KFDIA,1:KLEV), RNICE, LICECLD(KIDIA:KFDIA,1:KLEV)) !mask only values inside ice cloud !----------------------------------------------------------------- @@ -1089,8 +1102,8 @@ SUBROUTINE HAMM7_INTERFACE( & END DO END DO - ! treshold CDNC and ICNC to gridcells with only liquid or ice clouds - ZCDNCACT(KIDIA:KFDIA,1:KLEV) = MERGE(ZCDNCACT(KIDIA:KFDIA,1:KLEV),1.0E6_JPRB*ZMIN_CDNC,LLIQCLD(KIDIA:KFDIA,1:KLEV)) !mask only values inside liq cloud + ! threshold CDNC and ICNC to grid cells with only liquid or ice clouds + ZCDNCACT(KIDIA:KFDIA,1:KLEV) = MERGE(ZCDNCACT(KIDIA:KFDIA,1:KLEV),1.0E6_JPRB*ZDEF_CDNC,LLIQCLD(KIDIA:KFDIA,1:KLEV)) !mask only values inside liq cloud ZICNC(KIDIA:KFDIA,1:KLEV) = MERGE(ZICNC(KIDIA:KFDIA,1:KLEV), RNICE, LICECLD(KIDIA:KFDIA,1:KLEV)) !mask only values inside ice cloud !<-- Store CDNC (number of activated particles) and ICNC as a number mixing ratio to tracer values @@ -1139,15 +1152,36 @@ SUBROUTINE HAMM7_INTERFACE( & PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH) = MAX((1.0E-6_JPRB)*ZCDNCACT(KIDIA:KFDIA,1:KLEV),ZMIN_CDNC) ! convert from #/m3 to #/cm3 and threshold minimum value to 1 cm-3 PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH) = MAX( ZICNC(KIDIA:KFDIA,1:KLEV), RNICE) ! no conversion needed: already in #/cm3, just impose minimum value + !eehol: update tendency of CDNC and ICNC (calculate only the newly formed droplets) + ZXTTE(KIDIA:KFDIA,1:KLEV,IDT_CDNC) = (ZXTM1(KIDIA:KFDIA,1:KLEV,IDT_CDNC) - ZCDNC_temp(KIDIA:KFDIA,1:KLEV))/time_step_len + ZXTTE(KIDIA:KFDIA,1:KLEV,IDT_ICNC) = (ZXTM1(KIDIA:KFDIA,1:KLEV,IDT_ICNC) - ZICNC_temp(KIDIA:KFDIA,1:KLEV))/time_step_len !----------------------------------------------------------------- - - !<-- Store CDNC (number of activated particles) and ICNC as a number mixing ratio to tracer values and to PGFL fields - ZXTM1(KIDIA:KFDIA,1:KLEV,idt_cdnc) = (MAX(ZCDNCACT(KIDIA:KFDIA,1:KLEV),((1.0E6_JPRB)*1._JPRB)))/ZRHO(KIDIA:KFDIA,1:KLEV) ! [#/kg] and treshold CDNC to 1 cm-3 - ZXTM1(KIDIA:KFDIA,1:KLEV,idt_icnc) = (1.0E6_JPRB)*ZICNC(KIDIA:KFDIA,1:KLEV)/ZRHO(KIDIA:KFDIA,1:KLEV) !ice crystal number conc = #/cm3 --> number mix rat [#/kg] - PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH) = 1.0E-6_JPRB*( MAX(ZCDNCACT(KIDIA:KFDIA,1:KLEV), 1.0E+6_JPRB)) ! convert from #/m3 to #/cm3 and treshold minimum value to 1 cm-3 - PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH) = MAX( ZICNC(KIDIA:KFDIA,1:KLEV), 0.027_JPRB) ! no conversion needed: already in #/cm3, just max of default value (RNICE in sucldp.F90) and icnc - !--> End store CDNC and ICNC + !--> Calculation of effective radii (Note: already done if NCLOUDACT=1) + IF (NCLOUDACT == 2 .OR. NCLOUDACT == 0 ) THEN + + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ! effective radius (in um) calculated similarly as in radlswr.F90 + ! 2.387e-10 is 3/(4*pi*rho_liq*10^6) [10^6 for N in right units] + ZRE_LIQ(JL,JK) = 1.E+06_JPRB*(2.387e-10_JPRB*ZRHO(JL,JK)*ZQLWP(JL,JK)/PGFL(JL,JK,YCDNC%MP9_PH))**0.333_JPRB + END DO + END DO + + ! Add liq. eff. rad. to HAM variables (only if there is liquid cloud else minimum value) + REFFL(KIDIA:KFDIA,1:KLEV,ZKROW) = MERGE(ZRE_LIQ(KIDIA:KFDIA,1:KLEV), ZDEF_RE_LIQ, LLIQCLD(KIDIA:KFDIA,1:KLEV)) + + CALL ICE_EFFECTIVE_RADIUS(YRERAD, YDSPP_CONFIG, KIDIA, KFDIA, KLON, KLEV, & + & PRSF1, PTP, ZAP, PIP, PSP, PGEMU, & ! pressure, temp, cloud fr., IWC, SWC, sine of latitude + & reffi(1:KLON,1:KLEV,ZKROW)) ! ice effective radius (updated to mo_activ variable 'reffi' which used in mo_ham_wetdep) + + ! only if there is ice cloud else minimum value + REFFI(KIDIA:KFDIA,1:KLEV,ZKROW) = MERGE(REFFI(KIDIA:KFDIA,1:KLEV,ZKROW), ZDEF_RE_ICE, LICECLD(KIDIA:KFDIA,1:KLEV)) + + ! add effective radii to PGFL fields + PGFL(KIDIA:KFDIA,1:KLEV,YRE_LIQ%MP9_PH) = 1.0E-06_JPRB * REFFL(KIDIA:KFDIA,1:KLEV,ZKROW) ! convert um to meters and save to PGFL fields + PGFL(KIDIA:KFDIA,1:KLEV,YRE_ICE%MP9_PH) = 1.0E-06_JPRB * REFFI(KIDIA:KFDIA,1:KLEV,ZKROW) ! convert um to meters and save to PGFL fields + ENDIF !----------------------------------------------------------------- !--> Calculation of effective radii and put to PGFL fields @@ -1547,7 +1581,8 @@ SUBROUTINE HAMM7_INTERFACE( & ! problems with these tracers about CCN. !cloud variables DO JCLOUD=1,2 !CDNC and ICNC - PTENC(KIDIA:KFDIA,1:KLEV,KAERO(ind_oifs_ham%ind_cloud_OIFS(JCLOUD))) = ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_cloud_HAM(JCLOUD)) + !PTENC(KIDIA:KFDIA,1:KLEV,KAERO(ind_oifs_ham%ind_cloud_OIFS(JCLOUD))) = ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_cloud_HAM(JCLOUD)) + PTENC(KIDIA:KFDIA,1:KLEV,KAERO(ind_oifs_ham%ind_cloud_OIFS(JCLOUD))) = (1.0E-6_JPRB) * ZRHO(KIDIA:KFDIA,1:KLEV) * ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_cloud_HAM(JCLOUD)) END DO !<-- End adding HAM modified tendency back to PTENC !----------------------------------------------------------------- diff --git a/ifs-source/arpifs/m7/phys_ec/yoe_aer_activ.F90 b/ifs-source/arpifs/m7/phys_ec/yoe_aer_activ.F90 index 8bf797f7..8b66a848 100644 --- a/ifs-source/arpifs/m7/phys_ec/yoe_aer_activ.F90 +++ b/ifs-source/arpifs/m7/phys_ec/yoe_aer_activ.F90 @@ -35,19 +35,10 @@ MODULE YOE_AER_ACTIV ! standard deviation of updraft PDF !REAL(KIND=JPRB), PARAMETER, PUBLIC :: PPDF_SIGMA = 0.8_JPRB - ! minimum CDNC value - REAL(KIND=JPRB), PARAMETER, PUBLIC :: PPMINCDNC = 1._JPRB - - ! default CDNC value - REAL(KIND=JPRB), PARAMETER, PUBLIC :: PPDEFCDNC = 1._JPRB !1.E-14_JPRB !10._JPRB - ! Diagnostics !TYPE(T_DIAG), POINTER, PUBLIC :: D_CDNC !TYPE(T_DIAG), POINTER, PUBLIC :: D_REFF !TYPE(T_DIAG), POINTER, PUBLIC :: D_LIQCLDT - - ! default value of effective radius (value when gridbox is cloud-free) [um] - REAL(KIND=JPRB), PARAMETER, PRIVATE :: PPREFFL_DEF = 4.0_JPRB CONTAINS SUBROUTINE AER_ACTIV(KIDIA, KFDIA, KTDIA, KLON, KLEV, KSTGLO, & @@ -56,7 +47,7 @@ SUBROUTINE AER_ACTIV(KIDIA, KFDIA, KTDIA, KLON, KLEV, KSTGLO, & & PVERVEL, PA, PL, PI, & & PLSM, PGELAM, PGEMU, & !PSLON, PGEMU, & & PGFL, YDMODEL, PCDNCACT, PICNC, PREFFL, PREFFI, PSMAX, PDRYRSOLU, PXTM1, KTRAC, PSIGMA_W, & - & PFRACN )!, PEXTRA, PEXTR2) + & PFRACN, PPMINCDNC, PPDEFCDNC, PQLWC, LLIQCLD, LICECLD, PPREFFL_DEF, PPREFFI_DEF)!, PEXTRA, PEXTR2) ! *AER_ACTIV* is the interface to the cloud droplet activation scheme. ! Four schemes are available, depending on the aerosol scheme used. @@ -165,10 +156,17 @@ SUBROUTINE AER_ACTIV(KIDIA, KFDIA, KTDIA, KLON, KLEV, KSTGLO, & REAL(KIND=JPRB), INTENT(IN) :: PDRYRSOLU(KLON,KLEV,NSOL) ! rdry of soluble modes [m] REAL(KIND=JPRB), INTENT(IN) :: PXTM1(KLON,KLEV,KTRAC) ! tracer mixing ratios REAL(KIND=JPRB), INTENT(IN) :: PSIGMA_W(KLON,KLEV) ! sigma_w + REAL(KIND=JPRB), INTENT(IN) :: PPMINCDNC ! minimum CDNC [# cm-3] + REAL(KIND=JPRB), INTENT(IN) :: PPDEFCDNC ! default (background) CDNC [# cm-3] + REAL(KIND=JPRB), INTENT(IN) :: PQLWC(KLON,KLEV) ! LWC [kg kg-1] + LOGICAL, INTENT(IN) :: LLIQCLD(KLON,KLEV) ! logical for liquid cloud + LOGICAL, INTENT(IN) :: LICECLD(KLON,KLEV) ! logical for ice cloud + REAL(KIND=JPRB), INTENT(IN) :: PPREFFI_DEF ! default (background) ice eff rad [mu m] + REAL(KIND=JPRB), INTENT(IN) :: PPREFFL_DEF ! default (background) liq eff rad [mu m] REAL(KIND=JPRB), INTENT(INOUT) :: PGFL(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NDIM) - REAL(KIND=JPRB), INTENT(INOUT) :: PCDNCACT(KLON,KLEV) ! cloud droplet number concentration [#/m-3] - REAL(KIND=JPRB), INTENT(INOUT) :: PICNC(KLON,KLEV) ! ice crystal number concentration [#/cm-3] + REAL(KIND=JPRB), INTENT(INOUT) :: PCDNCACT(KLON,KLEV) ! cloud droplet number concentration [# cm-3] + REAL(KIND=JPRB), INTENT(INOUT) :: PICNC(KLON,KLEV) ! ice crystal number concentration [# cm-3] REAL(KIND=JPRB), INTENT(INOUT) :: PREFFL(KLON,KLEV) ! liquid droplet effective radius [um] REAL(KIND=JPRB), INTENT(INOUT) :: PREFFI(KLON,KLEV) ! ice effective radius [um] REAL(KIND=JPRB), INTENT(INOUT) :: PSMAX(KLON,KLEV) ! maximum supersaturation [%] @@ -211,13 +209,7 @@ SUBROUTINE AER_ACTIV(KIDIA, KFDIA, KTDIA, KLON, KLEV, KSTGLO, & REAL(KIND=JPRB) :: ZNACT_KS(KLON,KLEV) ! variables for modewise activated fraction calculations REAL(KIND=JPRB) :: ZFRAC_KS,ZFRAC_AS,ZFRAC_CS ! variables for modewise activated fraction calculations - !variables for liquid droplet eff rad calculations - REAL(KIND=JPRB) :: ZQLWC(KLON,KLEV) !tresholded LWC [kg/kg] - REAL(KIND=JPRB) :: RCLDMAX=5.E-3_JPRB !max cloud water - - LOGICAL :: LLIQCLD(KLON,KLEV) ! true if liquid cloud is present LOGICAL :: LLIQCLDD(KLON,KLEV) ! true if liquid cloud is present (for activation calculations) - LOGICAL :: LICECLD(KLON,KLEV) ! true if ice cloud is present LOGICAL :: LL1 LOGICAL :: LBULK, LMODE ! fetch HAMM7 aerosols as bulk mass / per-mode mass @@ -258,11 +250,7 @@ SUBROUTINE AER_ACTIV(KIDIA, KFDIA, KTDIA, KLON, KLEV, KSTGLO, & ZCDNC(KIDIA:KFDIA,1:KLEV) = PPDEFCDNC ZRE_LIQ(KIDIA:KFDIA,1:KLEV) = PPREFFL_DEF ZICNC(KIDIA:KFDIA,1:KLEV) = RNICE - ZRE_ICE(KIDIA:KFDIA,1:KLEV) = 80._JPRB*0.64952_JPRB - !PGFL(KIDIA:KFDIA,:,YCDNC%MP9_PH) = PPDEFCDNC - !PGFL(KIDIA:KFDIA,:,YRE_LIQ%MP9_PH) = PPREFFL_DEF - !PGFL(KIDIA:KFDIA,:,YICNC%MP9_PH) = ZICNC(KIDIA:KFDIA,:) - !PGFL(KIDIA:KFDIA,:,YRE_ICE%MP9_PH) = PREFFI(KIDIA:KFDIA,:) + ZRE_ICE(KIDIA:KFDIA,1:KLEV) = PPREFFI_DEF !---get aerosols from HAMM7 LMODE = .TRUE. @@ -276,16 +264,6 @@ SUBROUTINE AER_ACTIV(KIDIA, KFDIA, KTDIA, KLON, KLEV, KSTGLO, & ZDRYRSOL(KIDIA:KFDIA,1:KLEV,:) = PDRYRSOLU(KIDIA:KFDIA,1:KLEV,:) - !---find cells where there is cloud (same criteria as cloudsc.F90 when it uses CDNC) - - DO JK=1,KLEV - DO JL=KIDIA,KFDIA - ZTMPA = 1.0_JPRB/MAX(PA(JL,JK),ZEPSEC) - LLIQCLD(JL,JK) = ( PL(JL,JK)*ZTMPA ) > ZEPSEC - LICECLD(JL,JK) = ( PI(JL,JK)*ZTMPA ) > ZEPSEC ! logical for ice cloud - END DO - END DO - IF (LCALCINCLOUD) THEN !---find highest model level where there is cloud DO JK=1,KLEV @@ -392,13 +370,9 @@ SUBROUTINE AER_ACTIV(KIDIA, KFDIA, KTDIA, KLON, KLEV, KSTGLO, & !---limit CDNC to min PPMINCDNC, set default value for CDNC outside clouds DO JK=KTDIA,KLEV - ZCDNC(KIDIA:KFDIA,JK)=MAX(ZCDNC(KIDIA:KFDIA,JK)*ZMAC2SP_CDNC_FACTOR(KIDIA:KFDIA),PPMINCDNC) - !ZCDNC(KIDIA:KFDIA,JK)=MERGE( & - !& MAX(ZCDNC(KIDIA:KFDIA,JK)*ZMAC2SP_CDNC_FACTOR(KIDIA:KFDIA),PPMINCDNC), & - !& PPDEFCDNC, LLIQCLD(KIDIA:KFDIA,JK) ) - ! PGFL(KIDIA:KFDIA,JK,YCDNC%MP9_PH)=MERGE( & - ! & MAX(PGFL(KIDIA:KFDIA,JK,YCDNC%MP9_PH)*ZMAC2SP_CDNC_FACTOR(KIDIA:KFDIA),PPMINCDNC), & - ! & PPDEFCDNC, LLIQCLD(KIDIA:KFDIA,JK) ) + ZCDNC(KIDIA:KFDIA,JK)=MERGE( & + & MAX(ZCDNC(KIDIA:KFDIA,JK)*ZMAC2SP_CDNC_FACTOR(KIDIA:KFDIA),PPMINCDNC), & + & PPDEFCDNC, LLIQCLD(KIDIA:KFDIA,JK) ) END DO !---cloud liquid water: droplet effective radius is computed in radlswr now @@ -406,16 +380,14 @@ SUBROUTINE AER_ACTIV(KIDIA, KFDIA, KTDIA, KLON, KLEV, KSTGLO, & ! liquid effective radius DO JK=1,KLEV - DO JL=KIDIA,KFDIA - ZQLWC(JL,JK) = PL(JL,JK)/MAX(PA(JL,JK),1.E-10_JPRB) ! calculate lwc - ZQLWC(JL,JK) = MIN(MAX(ZQLWC(JL,JK),0.0_JPRB),RCLDMAX) ! treshold lwc + DO JL=KIDIA,KFDIA ! effective radius calculated similarly as in radlswr.F90 ! 2.387e-10 is 3/(4*pi*rho_liq*10^6) [10^6 for N in right units] - !ZRE_LIQ(JL,JK) = 1.E+06_JPRB*(2.387e-10_JPRB*ZRHO(JL,JK)*ZQLWC(JL,JK)/(MAX(PGFL(JL,JK,YCDNC%MP9_PH),PPMINCDNC)))**0.333_JPRB ! calculate effective radius in um (use minimum value for CDNC if CDNC is small) - ZRE_LIQ(JL,JK) = 1.E+06_JPRB*(2.387e-10_JPRB*ZRHO(JL,JK)*ZQLWC(JL,JK)/(MAX(ZCDNC(JL,JK),PPMINCDNC)))**0.333_JPRB ! calculate effective radius in um (use minimum value for CDNC if CDNC is small) + ZRE_LIQ(JL,JK) = 1.E+06_JPRB*(2.387e-10_JPRB*ZRHO(JL,JK)*PQLWC(JL,JK)/ZCDNC(JL,JK))**0.333_JPRB END DO END DO - ZRE_LIQ(KIDIA:KFDIA,1:KLEV) = MERGE(ZRE_LIQ(KIDIA:KFDIA,1:KLEV),4._JPRB,LLIQCLD(KIDIA:KFDIA,1:KLEV)) + ZRE_LIQ(KIDIA:KFDIA,1:KLEV) = MERGE(ZRE_LIQ(KIDIA:KFDIA,1:KLEV),PPREFFL_DEF,LLIQCLD(KIDIA:KFDIA,1:KLEV)) + END IF !---cloud ice: ICNC and effective radius for ice crystals @@ -454,35 +426,26 @@ SUBROUTINE AER_ACTIV(KIDIA, KFDIA, KTDIA, KLON, KLEV, KSTGLO, & PFRACN(JL,JK,2) = MAX(0._JPRB,MIN(ZFRAC_KS, 1._JPRB)) !threshold between 0 and 1 ZNACT_KS(JL,JK) = ZAERONUM(JL,JK,2) * PFRACN(JL,JK,2) !calculate activated number for KS mode - PFRACN(JL,JK,2) = MERGE(PFRACN(JL,JK,2),0._JPRB,LLIQCLD(JL,JK)) !fraction only where there is cloud - PFRACN(JL,JK,3) = MERGE(PFRACN(JL,JK,3),0._JPRB,LLIQCLD(JL,JK)) !fraction only where there is cloud - PFRACN(JL,JK,4) = MERGE(PFRACN(JL,JK,4),0._JPRB,LLIQCLD(JL,JK)) !fraction only where there is cloud + PFRACN(JL,JK,2) = MERGE(PFRACN(JL,JK,2),0._JPRB,LLIQCLD(JL,JK)) !fraction only where there is liquid cloud + PFRACN(JL,JK,3) = MERGE(PFRACN(JL,JK,3),0._JPRB,LLIQCLD(JL,JK)) !fraction only where there is liquid cloud + PFRACN(JL,JK,4) = MERGE(PFRACN(JL,JK,4),0._JPRB,LLIQCLD(JL,JK)) !fraction only where there is liquid cloud END DO END DO !eehol: diagnostics: !--CDNC - !PCDNCACT(KIDIA:KFDIA,:) = 1.0E6_JPRB*PGFL(KIDIA:KFDIA,:,YCDNC%MP9_PH) !eehol: output CDNC [#/m3] PCDNCACT(KIDIA:KFDIA,1:KLEV) = 1.0E6_JPRB*MAX(ZCDNC(KIDIA:KFDIA,1:KLEV),PPMINCDNC) !eehol: output CDNC [#/m3] !--ICNC - !PICNC(KIDIA:KFDIA,:) = PGFL(KIDIA:KFDIA,:,YICNC%MP9_PH) !eehol: output ICNC [#/cm3] PICNC(KIDIA:KFDIA,1:KLEV) = ZICNC(KIDIA:KFDIA,1:KLEV) !eehol: output ICNC [#/cm3] - + !--Liq eff rad - !PGFL(KIDIA:KFDIA,1:KLEV,YRE_LIQ%MP9_PH) = 1.0E-06_JPRB * ZRE_LIQ(KIDIA:KFDIA,1:KLEV) !save liq eff rad in meters - PREFFL(KIDIA:KFDIA,1:KLEV) = MERGE(ZRE_LIQ(KIDIA:KFDIA,1:KLEV),4._JPRB,LLIQCLD(KIDIA:KFDIA,1:KLEV)) !eehol: output liq eff rad [um] - - !--Ice eff rad - ! only if there is ice cloud else minimum value - PREFFI(KIDIA:KFDIA,1:KLEV) = MERGE(ZRE_ICE(KIDIA:KFDIA,1:KLEV),20._JPRB,LICECLD(KIDIA:KFDIA,1:KLEV)) - !PREFFI(KIDIA:KFDIA,:) = 1.E-6_JPRB*PGFL(KIDIA:KFDIA,:,YRE_ICE%MP9_PH) !eehol: output ice eff rad [um] - ! only if there is ice cloud else minimum value - !PREFFI(KIDIA:KFDIA,1:KLEV) = MERGE(PREFFI(KIDIA:KFDIA,1:KLEV), 20._JPRB, LICECLD(KIDIA:KFDIA,1:KLEV)) - ! add effective radii to PGFL fields - !PGFL(KIDIA:KFDIA,1:KLEV,YRE_ICE%MP9_PH) = 1.0E-06_JPRB * PREFFI(KIDIA:KFDIA,1:KLEV) ! convert um to meters and save to PGFL fields + PREFFL(KIDIA:KFDIA,1:KLEV) = MERGE(ZRE_LIQ(KIDIA:KFDIA,1:KLEV),PPREFFL_DEF,LLIQCLD(KIDIA:KFDIA,1:KLEV)) !eehol: output liq eff rad [um] + !--Ice eff rad (only if there is ice cloud else minimum value) + PREFFI(KIDIA:KFDIA,1:KLEV) = MERGE(ZRE_ICE(KIDIA:KFDIA,1:KLEV),PPREFFI_DEF,LICECLD(KIDIA:KFDIA,1:KLEV)) + !--Maximum supersaturation PSMAX(KIDIA:KFDIA,1:KLEV) = ZSMAX(KIDIA:KFDIA,1:KLEV) !eehol: output maximum supersaturation [%] @@ -1726,7 +1689,7 @@ SUBROUTINE AER_ACTIV_MORALES_NENES_FULL(KIDIA, KFDIA, KTDIA, KLON, KLEV, LCLOUD, !--- 0) Initializations: - !PCDNC(KIDIA:KFDIA,KTDIA:KLEV) = 10._JPRB + PCDNC(KIDIA:KFDIA,KTDIA:KLEV) = 0._JPRB PSMAX(KIDIA:KFDIA,KTDIA:KLEV) = 0._JPRB ZEPS=EPSILON(1._JPRB) From 521c8d38dfdf81fc830e3c999aec8da40f949804 Mon Sep 17 00:00:00 2001 From: Lianghai Wu Date: Tue, 4 Nov 2025 20:02:57 +0000 Subject: [PATCH 100/129] Pull request #52: Bugfix/aerosol output at diagnostic wavelengths Merge in ~NM6/openifs-48r1 from bugfix/aerosol_output_diagnostic_wavelengths to knmi-m7 Squashed commit of the following: commit a1f4729103c1bf3a5c7bc085048be1dcb06e6b31 Author: Philippe Le Sager Date: Tue Nov 4 20:57:44 2025 +0100 Tidy up commit 5d33935c875bf4ccf9e25bc0b9b00b0ca00aec56 Author: Philippe Le Sager Date: Tue Nov 4 17:21:16 2025 +0100 Revert unneeded changes commit cec9fe161331bbec5adf3f1c693459572fd6e5c2 Merge: 8e70967 ff9686d Author: Philippe Le Sager Date: Tue Nov 4 14:26:58 2025 +0100 Merge 'knmi-m7' into bugfix/aerosol_output_diagnostic_wavelengths commit 8e70967dcfa532079173e7ae234d4dab5f30fb43 Author: Lianghai Wu Date: Tue Oct 28 11:13:50 2025 +0000 Separate normalization under different conditions commit 80a6692a042ee9e57067aab42062167e4cff7e38 Author: Lianghai Wu Date: Tue Oct 28 09:39:22 2025 +0000 fix order commit 077f5baf1cf0e439c6773d5007f0e8abc8658b50 Author: Lianghai Wu Date: Tue Oct 28 09:34:55 2025 +0000 fix commit 972a4e55dcd47eedb3a1762f273d447acbadb249 Author: Lianghai Wu Date: Tue Oct 28 09:17:50 2025 +0000 clean updclie_aerclim commit f106cdc64cabbb23cd81ecf2096d2209178b2a22 Author: Lianghai Wu Date: Tue Oct 28 09:16:25 2025 +0000 Update hamm7_interface.F90 commit fdeee959ffa75e1ab7f6c41fd0ae29c449eaf357 Author: Lianghai Wu Date: Fri Oct 24 13:05:03 2025 +0000 debug commit f0b3e053edb207e7c12c7b19f15182f2ceaa3d35 Author: Lianghai Wu Date: Tue Oct 21 20:22:31 2025 +0000 fix updclie_aerclim bug commit 275c34e416104066e103107513456dda8a11adb3 Merge: 49ba7bc ce72c39 Author: Lianghai Wu Date: Thu Oct 2 09:07:39 2025 +0000 Merge branch 'knmi-m7' into aerosol_output_diagnostic_wavelengths commit ce72c398902cea1f5fc41c81ca3234eaedcb2f3f Author: Lianghai Wu Date: Thu Oct 2 09:04:03 2025 +0000 OIFS-621 fix aerosol OP output at diagnostic wavelength --- ifs-source/arpifs/m7/module/mo_ham_rad.F90 | 69 +++++++++- .../arpifs/m7/module/mo_ham_rad_data.F90 | 34 +++-- .../arpifs/m7/phys_ec/hamm7_interface.F90 | 118 ++++++++++-------- 3 files changed, 145 insertions(+), 76 deletions(-) diff --git a/ifs-source/arpifs/m7/module/mo_ham_rad.F90 b/ifs-source/arpifs/m7/module/mo_ham_rad.F90 index 2c88957b..fd8543ca 100755 --- a/ifs-source/arpifs/m7/module/mo_ham_rad.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_rad.F90 @@ -962,7 +962,7 @@ SUBROUTINE ham_rad(kproma, kbdim, klev, krow, kpband, kb_sw, & #else REAL(dp), INTENT(in) :: rwet_m7(kbdim,klev,nclass) #endif - INTEGER :: jclass, jl, jk, jwv, itable, itrac, ikl + INTEGER :: jclass, jl, jk, jwv, jwv_diag, itable, itrac, ikl REAL(dp) :: zeps @@ -1183,6 +1183,8 @@ SUBROUTINE ham_rad(kproma, kbdim, klev, krow, kpband, kb_sw, & DO jl=1, kproma IF(aer_piz_sw_vr(jl,jk,jwv)>EPSILON(1.0_dp)) THEN aer_cg_sw_vr(jl,jk,jwv) =aer_cg_sw_vr(jl,jk,jwv)/aer_piz_sw_vr(jl,jk,jwv) + END IF + IF(aer_tau_sw_vr(jl,jk,jwv)>EPSILON(1.0_dp)) THEN aer_piz_sw_vr(jl,jk,jwv)=aer_piz_sw_vr(jl,jk,jwv)/aer_tau_sw_vr(jl,jk,jwv) END IF END DO @@ -1353,9 +1355,16 @@ SUBROUTINE ham_rad(kproma, kbdim, klev, krow, kpband, kb_sw, & znr2d(1:kproma,:) = nr_diag(1:kproma,:,jwv,jclass) zni2d(1:kproma,:) = ni_diag(1:kproma,:,jwv,jclass) - CALL ham_rad_refrac(kproma, kbdim, klev, krow, & - ntrac, jclass, jwv, & - pxtm1, znr2d, zni2d ) + + ! 3.46, 2.79, 2.33, 2.05, 1.78, 1.46, 1.27, 1.01, 0.70, 0.53, 0.39, 0.30, 0.23, 8.02 [um] + call interp_refr_index(kbdim, klev, lambda, nr(1:kproma,:,:,jclass), lambda_diag(jwv), znr2d(1:kproma,:)) + + ! should we do logarithmic interpolation for imaginary part? + call interp_refr_index(kbdim, klev, lambda, ni(1:kproma,:,:,jclass), lambda_diag(jwv), zni2d(1:kproma,:)) + + !CALL ham_rad_refrac(kproma, kbdim, klev, krow, & + ! ntrac, jclass, jwv, & + ! pxtm1, znr2d, zni2d ) #ifdef HAMMOZ IF (ltimer) CALL timer_stop(timer_ham_rad_refrac) @@ -1521,6 +1530,51 @@ SUBROUTINE ham_rad(kproma, kbdim, klev, krow, kpband, kb_sw, & END SUBROUTINE ham_rad + !---------------------------------------------------------------------------------------------------------------- + + SUBROUTINE interp_refr_index(kbdim, klev, wl_in, nr_in, wl_out, nr_out) + !! Interpolates refractive index nr_in(kbdim,klev,Nwv_tot) + !! at a single wavelength wl_out, result in nr_out(kbdim,klev) + + implicit none + + ! Input + integer :: kbdim, klev + real(dp), intent(in) :: wl_in(Nwv_tot) ! (Nwv_tot), unsorted + real(dp), intent(in) :: nr_in(kbdim,klev,Nwv_tot) ! (kbdim,klev,Nwv_tot) + real(dp), intent(in) :: wl_out ! single query wavelength + + ! Output + real(dp), intent(out) :: nr_out(kbdim, klev) + + ! Locals + integer :: idx_low, idx_high + real(dp) :: val_low, val_high, weight + + ! ---- Sort wl_in (insertion sort) ---- + + ! nearest smaller/equal + !write(*,*)"wl_in",wl_in + !write(*,*)"wl_out",wl_out + val_low = maxval(pack(wl_in, wl_in <= wl_out)) + idx_low = maxloc(wl_in, mask = wl_in == val_low, dim=1) + !write(*,*)"val_low ",val_low + !write(*,*)"idx_low ",idx_low + + ! nearest larger/equal + val_high = minval(pack(wl_in, wl_in > wl_out)) + idx_high = maxloc(wl_in, mask = wl_in == val_high, dim=1) + !write(*,*)"val_high ",val_high + !write(*,*)"idx_high ",idx_high + + weight = (wl_out-val_low)/(val_high-val_low) + + !write(*,*)"wl_out",wl_out + + nr_out(1:kbdim,1:klev) = (1.0_dp - weight) * nr_in(:,:,idx_low)+ weight*nr_in(:,:,idx_high) + + END SUBROUTINE interp_refr_index + !---------------------------------------------------------------------------------------------------------------- !>>dod removed wavelength from subroutine interface SUBROUTINE ham_rad_fitplus(kproma, kbdim, klev, & @@ -1913,6 +1967,13 @@ SUBROUTINE ham_rad_initialize(nclass) DO jwv=1, Nwv_sw !Laakso: note different order than HAM (here same as RRTM) lambda(jwv)=ASWBAND(jwv)%wl*1.E-6_dp END DO + !!! include diagnostic wavelengths, lhw + DO jwv=1, Nwv_sw_opt + iwv=Nwv_sw+jwv + lambda(iwv)=lambda_sw_opt(jwv) + WRITE(message_text,fmt='(a,i3,a,f8.2)') ' lambda(', iwv, ') = ', lambda(iwv)*1.E6_dp + CALL message('', message_text, level=em_param) + END DO #endif END IF diff --git a/ifs-source/arpifs/m7/module/mo_ham_rad_data.F90 b/ifs-source/arpifs/m7/module/mo_ham_rad_data.F90 index 4c9cbfd4..7635ad20 100755 --- a/ifs-source/arpifs/m7/module/mo_ham_rad_data.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_rad_data.F90 @@ -114,19 +114,15 @@ MODULE mo_ham_rad_data !--- Indices and dimensions: INTEGER, PARAMETER :: Nwv_sw = 14, & !-- RRTM-SW GCM wavebands -#ifdef HAMMOZ Nwv_sw_opt = 2, & !--Optional SW wavebands (550nm+865nm) -#else - Nwv_sw_opt = 0, & !--Optional SW wavebands (550nm+865nm) -#endif -! Nwv_sw_opt = 2, & !--Optional SW wavebands (550nm+865nm+440nm) +! Nwv_sw_opt = 3, & !--Optional SW wavebands (550nm+865nm+440nm) Nwv_sw_tot = Nwv_sw+Nwv_sw_opt, & Nwv_lw = 16, & !--RRTM-LW GCM wavebands Nwv_swlw = Nwv_sw+Nwv_lw, & Nwv_tot = Nwv_sw+Nwv_sw_opt+Nwv_lw - REAL(dp), PARAMETER :: lambda_sw_opt(2)=(/ 0.550E-6_dp, 0.865E-6_dp /) !used only with #HAMMOZ -! REAL(dp), PARAMETER :: lambda_sw_opt(2)=(/ 0.550E-6_dp, 0.865E-6_dp , 0.440E-6_dp/) + REAL(dp), PARAMETER :: lambda_sw_opt(2)=(/ 0.550E-6_dp, 0.865E-6_dp /) +! REAL(dp), PARAMETER :: lambda_sw_opt(3)=(/ 0.550E-6_dp, 0.865E-6_dp , 0.440E-6_dp/) !--- Define mask for output of wavelengths: ! @@ -216,13 +212,13 @@ SUBROUTINE ham_rad_data_initialize 1.000E-09_dp, 2.600E-01_dp /) !--- Optional Wavelengths at 550 and 865nm: -#ifdef HAMMOZ + cnr(Nwv_sw+1:Nwv_sw+Nwv_sw_opt,iradso4) = & (/ 1.432_dp, 1.424_dp /) cni(Nwv_sw+1:Nwv_sw+Nwv_sw_opt,iradso4) = & (/ 1.000E-09_dp, 7.384E-07_dp /) -#endif + !--- Black Carbon (Medium-absorbing values from Bond & Bergstrom, 2006): ! ! - at 550 nm: n=1.85-0.71i @@ -237,7 +233,7 @@ SUBROUTINE ham_rad_data_initialize (/ 8.975E-01_dp, 8.510E-01_dp, 8.120E-01_dp, 7.939E-01_dp, 7.765E-01_dp, 7.397E-01_dp, & 7.274E-01_dp, 7.106E-01_dp, 6.939E-01_dp, 7.213E-01_dp, 7.294E-01_dp, 7.584E-01_dp, & 7.261E-01_dp, 1.088E+00_dp /) -#ifdef HAMMOZ + !--- Optional Wavelengths at 550nm and 865nm: cnr(Nwv_sw+1:Nwv_sw+Nwv_sw_opt,iradbc) = & @@ -245,7 +241,7 @@ SUBROUTINE ham_rad_data_initialize cni(Nwv_sw+1:Nwv_sw+Nwv_sw_opt,iradbc) = & (/ 7.10E-01_dp, 6.99E-01_dp /) -#endif + !--- Organic Carbon (Medium-absorbing values from Bond & Bergstrom, 2006): ! ! - wavelength dependency scaled from OPAC (Hess et al., 1998) @@ -261,13 +257,13 @@ SUBROUTINE ham_rad_data_initialize 5.27E-03_dp, 7.24E-02_dp /) !--- Optional Wavelengths at 550nm and 865nm: -#ifdef HAMMOZ + cnr(Nwv_sw+1:Nwv_sw+Nwv_sw_opt,iradoc) = & (/ 1.53_dp, 1.52_dp /) cni(Nwv_sw+1:Nwv_sw+Nwv_sw_opt,iradoc) = & (/ 5.50E-03_dp, 1.10E-02_dp /) -#endif +!#endif !--- Sea Salt (Nilsson, 1979): cnr(1:Nwv_sw,iradss) = & @@ -281,13 +277,13 @@ SUBROUTINE ham_rad_data_initialize 1.000E-05_dp, 1.400E-02_dp /) !--- Optional Wavelengths at 550nm and 865nm: -#ifdef HAMMOZ + cnr(Nwv_sw+1:Nwv_sw+Nwv_sw_opt,iradss) = & (/ 1.450_dp, 1.470_dp /) cni(Nwv_sw+1:Nwv_sw+Nwv_sw_opt,iradss) = & (/ 1.000E-08_dp, 1.000E-8_dp /) -#endif + !--- Dust (provided by Stefan Kinne, MPI-MET: ! mainly based on Sokolik & Toon, JGR, 1999) ! imaginary parts in the visible modified according to AERONET statistics @@ -304,13 +300,13 @@ SUBROUTINE ham_rad_data_initialize 2.500E-02_dp, 1.000E-01_dp /) !--- Optional Wavelengths at 550nm and 865nm: -#ifdef HAMMOZ + cnr(Nwv_sw+1:Nwv_sw+Nwv_sw_opt,iraddu) = & (/ 1.450_dp, 1.450_dp /) cni(Nwv_sw+1:Nwv_sw+Nwv_sw_opt,iraddu) = & (/ 1.000E-03_dp, 8.400E-4_dp /) -#endif + !--- Water (provided by Stefan Kinne interpolated with code by Andy Lacis (NASA-GISS): ! (Hale and Querry [1973] for 0.2 to 0.7 mm, ! Palmer and Williams [1974] for 0.7 to 2.0 mm) @@ -326,13 +322,13 @@ SUBROUTINE ham_rad_data_initialize 6.400E-08_dp, 4.000E-02_dp /) !--- Optional Wavelengths at 550nm and 865nm: -#ifdef HAMMOZ + cnr(Nwv_sw+1:Nwv_sw+Nwv_sw_opt,iradwat) = & (/ 1.335_dp, 1.329_dp /) cni(Nwv_sw+1:Nwv_sw+Nwv_sw_opt,iradwat) = & (/ 2.800E-09, 1.186E-06 /) -#endif + !--- 2) LW refractive indices: ! Note that the RRTM spectral bands are ordered with increasing wavenumber, diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index 3269e0d1..d3f11852 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -742,6 +742,7 @@ SUBROUTINE HAMM7_INTERFACE( & ZICNC(KIDIA:KFDIA,1:KLEV) = RNICE ! Initialize "from-OIFS-to-HAM" tracer mixing ratios and tendencies +ZXTM0(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB ZXTM1(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB ZXTTE(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB ZXTTEM1(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB @@ -1709,9 +1710,6 @@ SUBROUTINE HAMM7_INTERFACE( & ENDDO ENDDO -ZAER_TAU_DIAG(KIDIA:KFDIA,:,:) = 0.0_JPRB -ZAER_SSA_DIAG(KIDIA:KFDIA,:,:) = 0.0_JPRB -ZAER_ASYM_DIAG(KIDIA:KFDIA,:,:) = 0.0_JPRB !* 6.1 Calculate optical properties only when radiation is called ! ---------------------------------------------------------- @@ -1723,6 +1721,13 @@ SUBROUTINE HAMM7_INTERFACE( & ZAER_ASYM(KIDIA:KFDIA,:,:) = 0.0_JPRB ZAER_TAU_LW(KIDIA:KFDIA,:,:) = 0.0_JPRB + ZAOD_DIAG(KIDIA:KFDIA,:)= 0._JPRB + ZSSA_DIAG(KIDIA:KFDIA,:)= 0._JPRB + ZASY_DIAG(KIDIA:KFDIA,:)= 0._JPRB + ZAER_TAU_DIAG(KIDIA:KFDIA,:,:) = 0.0_JPRB + ZAER_SSA_DIAG(KIDIA:KFDIA,:,:) = 0.0_JPRB + ZAER_ASYM_DIAG(KIDIA:KFDIA,:,:) = 0.0_JPRB + SELECT CASE (NAEROOPT) CASE (0) @@ -1780,7 +1785,6 @@ SUBROUTINE HAMM7_INTERFACE( & & ZAER_TAU(:,:,:,1), ZAER_SSA, ZAER_ASYM, ZAER_TAU_LW, ZM6RP, & & LDIAG_AEROPT,NAERO_WVL_DIAG,YGFL%NAERO_WVL_DIAG_TYPES, & & LAMBDA_DIAG, ZAER_TAU_DIAG, ZAER_SSA_DIAG, ZAER_ASYM_DIAG) - !CALL ham_rad_cache_cleanup DO JK = 1, KLEV @@ -1793,9 +1797,32 @@ SUBROUTINE HAMM7_INTERFACE( & DO IW=1,16 PAER_TAU_LW(JL,JK,IW)=ZAER_TAU_LW(JL,JK,IW) END DO + ENDDO ENDDO + ! Vertically integrated optical properties at diagnostic wavelenghts + DO JK = 1, KLEV + DO JL = KIDIA,KFDIA + DO IW=1,NAERO_WVL_DIAG + ZAOD_DIAG(JL,IW)= ZAER_TAU_DIAG(JL,JK,IW)+ZAOD_DIAG(JL,IW) + ZSSA_DIAG(JL,IW)= ZAER_SSA_DIAG(JL,JK,IW)*ZAER_TAU_DIAG(JL,JK,IW)+ZSSA_DIAG(JL,IW) + ZASY_DIAG(JL,IW)= ZAER_ASYM_DIAG(JL,JK,IW)*ZAER_SSA_DIAG(JL,JK,IW)*ZAER_TAU_DIAG(JL,JK,IW)+ZASY_DIAG(JL,IW) + END DO + END DO + END DO + + DO JL = KIDIA,KFDIA + DO IW=1,NAERO_WVL_DIAG + IF(ZSSA_DIAG(JL,IW)>0._JPRB) THEN + ZASY_DIAG(JL,IW) = ZASY_DIAG(JL,IW)/ZSSA_DIAG(JL,IW)! AVERAGE + ENDIF + IF(ZAOD_DIAG(JL,IW)>0._JPRB) THEN + ZSSA_DIAG(JL,IW) = ZSSA_DIAG(JL,IW)/ZAOD_DIAG(JL,IW)! AOD AVERAGE + ENDIF + END DO + END DO + END SELECT ! Impose safety limits @@ -1829,45 +1856,28 @@ SUBROUTINE HAMM7_INTERFACE( & PASY (KIDIA:KFDIA,:)=0._JPRB PAOD_LW(KIDIA:KFDIA,:)=0._JPRB -ZAOD_DIAG(KIDIA:KFDIA,:)= 0._JPRB -ZSSA_DIAG(KIDIA:KFDIA,:)= 0._JPRB -ZASY_DIAG(KIDIA:KFDIA,:)= 0._JPRB - DO JK = 1, KLEV DO JL = KIDIA,KFDIA - DO IW=1,NASWBAND - PAOD(JL,IW)=PAER_TAU(JL,JK,IW)+PAOD(JL,IW) - PSSA(JL,IW)=PAER_SSA(JL,JK,IW)*PAER_TAU(JL,JK,IW)+PSSA(JL,IW) - PASY(JL,IW)=PAER_ASYM(JL,JK,IW)*PAER_TAU(JL,JK,IW)+PASY(JL,IW) + DO IW=1,NASWBAND + PAOD(JL,IW)=PAER_TAU(JL,JK,IW)+PAOD(JL,IW) + PSSA(JL,IW)=PAER_SSA(JL,JK,IW)*PAER_TAU(JL,JK,IW)+PSSA(JL,IW) + PASY(JL,IW)=PAER_ASYM(JL,JK,IW)*PAER_TAU(JL,JK,IW)*PAER_SSA(JL,JK,IW)+PASY(JL,IW) END DO DO IW=1,16 PAOD_LW(JL,IW)=PAOD_LW(JL,IW)+PAER_TAU_LW(JL,JK,IW) END DO - DO IW=1,NAERO_WVL_DIAG - ZAOD_DIAG(JL,IW)= ZAER_TAU_DIAG(JL,JK,IW)+ZAOD_DIAG(JL,IW) - ZSSA_DIAG(JL,IW)= ZAER_SSA_DIAG(JL,JK,IW)*ZAER_TAU_DIAG(JL,JK,IW)+ZSSA_DIAG(JL,IW) - ZASY_DIAG(JL,IW)= ZAER_ASYM_DIAG(JL,JK,IW)*ZAER_TAU_DIAG(JL,JK,IW)+ZASY_DIAG(JL,IW) - END DO - !IF(PAOD(JL,IW)>0._JPRB) THEN - ! PSSA(JL,:) =PSSA(JL,:)/PAOD(JL,IW)! AOD AVERAGE - ! PASY(JL,:) =PASY(JL,:)/PAOD(JL,IW)! AOD AVERAGE - !ENDIF END DO END DO DO JL = KIDIA,KFDIA DO IW=1,NASWBAND - IF(PAOD(JL,IW)>0._JPRB) THEN - PSSA(JL,IW) = PSSA(JL,IW)/PAOD(JL,IW)! AOD AVERAGE - PASY(JL,IW) = PASY(JL,IW)/PAOD(JL,IW)! AOD AVERAGE + IF(PSSA(JL,IW)>0._JPRB) THEN + PASY(JL,IW) = PASY(JL,IW)/PSSA(JL,IW) ! AVERAGE ENDIF - END DO - DO IW=1,NAERO_WVL_DIAG - IF(ZAOD_DIAG(JL,IW)>0._JPRB) THEN - ZSSA_DIAG(JL,IW) = ZSSA_DIAG(JL,IW)/ZAOD_DIAG(JL,IW)! AOD AVERAGE - ZASY_DIAG(JL,IW) = ZASY_DIAG(JL,IW)/ZAOD_DIAG(JL,IW)! AOD AVERAGE + IF(PAOD(JL,IW)>0._JPRB) THEN + PSSA(JL,IW) = PSSA(JL,IW)/PAOD(JL,IW) ! AOD AVERAGE ENDIF END DO END DO @@ -1875,26 +1885,28 @@ SUBROUTINE HAMM7_INTERFACE( & !* 6.3 Fill selective aerosol OD fields in structure as available in IFS-AER ! --------------------------------------------------------------------- -DO JWAVL=1,MIN(INWAVL,NAERO_WVL_DIAG) - DO JL=KIDIA,KFDIA - IF (YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_AOD) THEN - PAERO_WVL_DIAG(JL,JWAVL,JPAERO_WVL_AOD) = ZAOD_DIAG(JL,JWAVL) - ENDIF - IF (YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_AODABS) THEN - !PAERO_WVL_DIAG(JL,JWAVL,JPAERO_WVL_AODABS) = ZABS_DIAG(JL,JWAVL)! 0.0 - PAERO_WVL_DIAG(JL,JWAVL,JPAERO_WVL_AODABS) = ZAOD_DIAG(JL,JWAVL)*(1._JPRB-ZSSA_DIAG(JL,JWAVL))! absorption - ENDIF - IF (YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_AODFM) THEN - PAERO_WVL_DIAG(JL,JWAVL,JPAERO_WVL_AODFM) = 0._JPRB!PFAOD(JL,JWAVL)! 0.0 - ENDIF - IF (YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_SSA) THEN - PAERO_WVL_DIAG(JL,JWAVL,JPAERO_WVL_SSA) = ZSSA_DIAG(JL,JWAVL) - ENDIF - IF (YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_ASSIMETRY) THEN - PAERO_WVL_DIAG(JL,JWAVL,JPAERO_WVL_ASSIMETRY) = ZASY_DIAG(JL,JWAVL) - ENDIF +IF(MOD(NSTEP,NRADFR) == 0) THEN ! otherwise overwritten with initial values + DO JWAVL=1,MIN(INWAVL,NAERO_WVL_DIAG) + DO JL=KIDIA,KFDIA + IF (YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_AOD) THEN + PAERO_WVL_DIAG(JL,JWAVL,JPAERO_WVL_AOD) = ZAOD_DIAG(JL,JWAVL) + ENDIF + IF (YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_AODABS) THEN + !PAERO_WVL_DIAG(JL,JWAVL,JPAERO_WVL_AODABS) = ZABS_DIAG(JL,JWAVL)! 0.0 + PAERO_WVL_DIAG(JL,JWAVL,JPAERO_WVL_AODABS) = ZAOD_DIAG(JL,JWAVL)*(1._JPRB-ZSSA_DIAG(JL,JWAVL))! absorption + ENDIF + IF (YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_AODFM) THEN! not implemented yet + PAERO_WVL_DIAG(JL,JWAVL,JPAERO_WVL_AODFM) = 0._JPRB!PFAOD(JL,JWAVL)! 0.0 + ENDIF + IF (YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_SSA) THEN + PAERO_WVL_DIAG(JL,JWAVL,JPAERO_WVL_SSA) = ZSSA_DIAG(JL,JWAVL) + ENDIF + IF (YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_ASSIMETRY) THEN + PAERO_WVL_DIAG(JL,JWAVL,JPAERO_WVL_ASSIMETRY) = ZASY_DIAG(JL,JWAVL) + ENDIF + ENDDO ENDDO -ENDDO +ENDIF !* !* VH - Requires full checking by expert if this makes sense - FIXME @@ -1928,10 +1940,6 @@ SUBROUTINE HAMM7_INTERFACE( & ! AOD of 16 internal (long) wavelengths PGFL(KIDIA:KFDIA,18:33,YAEROUT(1)%MP)= PAOD_LW(KIDIA:KFDIA,1:16) - ! AOD at selected (diagnostic) wavelengths - JK = YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG ! Should check (at setup, not here) that JK+33 <= KLEV - PGFL(KIDIA:KFDIA,34:JK+33,YAEROUT(1)%MP)= ZAOD_DIAG(KIDIA:KFDIA,1:YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG) - !** YAEROUT(2) : DRY DEPOSITION DO JN=1,NAEROCOMP @@ -1964,7 +1972,11 @@ SUBROUTINE HAMM7_INTERFACE( & PGFL(KIDIA:KFDIA,NACTAERO+2,YAEROUT(5)%MP) = ZBLHIDX(KIDIA:KFDIA) PGFL(KIDIA:KFDIA,NACTAERO+3,YAEROUT(5)%MP) = PBLH(KIDIA:KFDIA) - !** YAEROUT(6) : -- + !** YAEROUT(6) : AOD at selected (diagnostic) wavelengths + + IF(MOD(NSTEP,NRADFR) == 0) THEN !otherwise overwriten with ini + PGFL(KIDIA:KFDIA, 1:NAERO_WVL_DIAG, YAEROUT(6)%MP) = ZAOD_DIAG(KIDIA:KFDIA, 1:YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG) + ENDIF !** YAEROUT(7) : Total column mass and number concentration From 6b7b1f3875146fc6479ec6dc4fc376b24e3a5ba2 Mon Sep 17 00:00:00 2001 From: Tommi Bergman Date: Wed, 26 Nov 2025 15:27:13 +0000 Subject: [PATCH 101/129] Pull request #59: Remove erroneous zeroing of some emissions fluxes Merge in ~NM6/openifs-48r1 from hotfix/OIFS-651-bug-in-pcflx-fields to knmi-m7 Squashed commit of the following: commit f2d3b65484cddf78476210ca3eba8f3b45cd8d75 Author: tommibergman Date: Wed Nov 26 11:58:38 2025 +0200 Remove emission code for compounds thate are now handled elsewhere, in compo_emission code. commit 74cbd76f7a8cdc658dba62568c4c7dee493ad975 Author: tommibergman Date: Wed Nov 26 10:30:12 2025 +0200 remove PCFLX from TM5_SRC.F90 commit 1e5ef6446c9adc1abc1761e3bbaa485b80d0af0e Author: tommibergman Date: Fri Nov 21 13:54:11 2025 +0200 PCFLX zeroing removed. This would occur after emissions_apply zeroing already assigned number emissions for accumulation mode. --- ifs-source/arpifs/m7/phys_ec/tm5m7_phy2.F90 | 2 +- ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 | 431 +------------------- 2 files changed, 6 insertions(+), 427 deletions(-) diff --git a/ifs-source/arpifs/m7/phys_ec/tm5m7_phy2.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_phy2.F90 index 9d8d42fd..198f26ff 100644 --- a/ifs-source/arpifs/m7/phys_ec/tm5m7_phy2.F90 +++ b/ifs-source/arpifs/m7/phys_ec/tm5m7_phy2.F90 @@ -313,7 +313,7 @@ SUBROUTINE TM5M7_PHY2 & & PLSM , PSST , PQP , ZRHO , PSNS , PTP , PTL , PTSPHY, PZ0M, KCHEM, & & ZWND , PWSA1 , PSOIL_TYPE, & & PCVL , PCVH, KTVL, KTVH, & - & PLDAY , PAERFLX, PCFLX, PCEN , PTENC, ZEMIDIAG, PSO2SRC,PSO4SRC) + & PLDAY , PAERFLX, PCEN , PTENC, ZEMIDIAG, PSO2SRC,PSO4SRC) ! sea salt and desert dust fluxes in kg m-2 s-1, thus: diff --git a/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 index 812a8c9b..2b9139f5 100644 --- a/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 +++ b/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 @@ -7,7 +7,7 @@ SUBROUTINE TM5M7_SRC( & & PLSM , PSST , PQ , PRHO , PSNS , PT , PTL , PTSPHY, PZ0M, KCHEM, & & PWIND, PWS1 ,PSOIL_TYPE, & & PCVL, PCVH, KTVL, KTVH, & - & PLDAY, PAERFLX, PCFLX , PCEN , PTENC, PEMIDIAG, PSO2SRC,PSO4SRC ) + & PLDAY, PAERFLX, PCEN , PTENC, PEMIDIAG, PSO2SRC,PSO4SRC ) ! ╭────────────────────────────────────────────────────────────────────────────╮ ! │ (updated 03-Jun-2024) │ @@ -118,7 +118,6 @@ SUBROUTINE TM5M7_SRC( & ! RCHG -> try to understand what is 12 and 9 here. REAL(KIND=JPRB), INTENT(INOUT) :: PAERFLX(KLON,12,9) -REAL(KIND=JPRB), INTENT(INOUT) :: PCFLX(KLON,KTRAC) REAL(KIND=JPRB), INTENT(IN) :: PCVL(KLON), PCVH(KLON) ! Low/High vegetation cover INTEGER(KIND=JPIM), INTENT(IN) :: KTVL(KLON), KTVH(KLON) ! Low/High vegetation type @@ -156,7 +155,6 @@ SUBROUTINE TM5M7_SRC( & !-- various sources REAL(KIND=JPRB) :: ZLOCALTIM , ZDIURN(KLON) REAL(KIND=JPRB) :: ZWNDDU(KLON), ZWNDSS(KLON) -REAL(KIND=JPRB) :: ZBCSOURC, ZOMSOURC REAL(KIND=JPRB) :: ZDEGRAD REAL(KIND=JPRB) :: ZRWPWP , ZRWSAT @@ -176,24 +174,10 @@ SUBROUTINE TM5M7_SRC( & REAL(KIND=JPRB) :: ZGEMU(KLON), ZLATK(KLON) -REAL(KIND=JPRB) :: numbscale_exp, mass2numb_fact, & - & mass2numb_ff_sol, mass2numb_ff_insol, & - & mass2numb_ene_sol, mass2numb_ene_insol, & - & mass2numb_ind_sol, mass2numb_ind_insol, & - & mass2numb_tra_sol, mass2numb_tra_insol, & - & mass2numb_shp_sol, mass2numb_shp_insol, & - & mass2numb_air_sol, mass2numb_air_insol, & - & mass2numb_bf_sol, mass2numb_bf_insol, & - & mass2numb_bb_sol, mass2numb_bb_insol, & - & mass2numb_nonbf_sol, mass2numb_nonbf_insol, & - & oc2pom -REAL(KIND=JPRB) :: ZSOA(KLON) REAL(KIND=JPRB) :: FRAC_BF(KLON), EMIT(KLON,KLEV) INTEGER(KIND=JPIM) :: ISSO2, ISSO4 -!-- Injection height for biomass burning emissions -INTEGER(KIND=JPIM) :: ILINJ1, ILINJ2, IX(1) REAL(KIND=JPRB) :: ZDELP !RCHG -> try to understand what is 5 here @@ -338,11 +322,6 @@ SUBROUTINE TM5M7_SRC( & EMIS_MASS(IMODE)%d3(KIDIA:KFDIA,1:KLEV,1:MODE_NM(IMODE))=0.0_JPRB ENDDO -!DO JAER=1,NACTAERO -! DO JL=KIDIA,KFDIA -! PCFLX(JL,KAERO(JAER))=0._JPRB -! END DO -!END DO ZFAERO (KIDIA:KFDIA, 1:NACTAERO) = 0.0_JPRB ZAEROK (KIDIA:KFDIA, 1:KLEV, 1:NACTAERO) = PCEN (KIDIA:KFDIA, 1:KLEV, KAERO(1):KAERO(NACTAERO)) @@ -424,17 +403,14 @@ SUBROUTINE TM5M7_SRC( & !----------------------------------------------------------------------- !* 3.0 PARTICULATE ORGANIC MATTER ! --------------------------------------------------------- -! CALL POM_SRC_43R3() +! in compo_emission_apply ! !----------------------------------------------------------------------- !* 4.0 BLACK CARBON ! ------------ -! CALL BC_SRC_43R3() +! in compo_emission_apply ! !---------------------------------------------------------------------- -!* 5.0 Convert emissions into tendencies: loop over tracers in mode -! ------------ -! CALL ADD_TOFLUX() ! -> only used for CY43R3 ! ! ! RCHG -> in the case of CY48R1 the emissions non-interactive (all except SS and DUST) @@ -447,14 +423,7 @@ SUBROUTINE TM5M7_SRC( & ! I keep current implementation. DO JL=KIDIA,KFDIA - PCFLX(JL,KAERO(iacs_n)) = 0.0 - PCFLX(JL,KAERO(icos_n)) = 0.0 - PCFLX(JL,KAERO(issacs)) = 0.0 - PCFLX(JL,KAERO(isscos)) = 0.0 - PCFLX(JL,KAERO(iaci_n)) = 0.0 - PCFLX(JL,KAERO(icoi_n)) = 0.0 - PCFLX(JL,KAERO(iduaci)) = 0.0 - PCFLX(JL,KAERO(iducoi)) = 0.0 + ZCFLX(JL,KAERO(iacs_n)) = emis_number(mode_acs)%d3(JL,KLEV,4)*(-1._JPRB) ZCFLX(JL,KAERO(icos_n)) = emis_number(mode_cos)%d3(JL,KLEV,4)*(-1._JPRB) @@ -501,397 +470,7 @@ SUBROUTINE TM5M7_SRC( & IF (LHOOK) CALL DR_HOOK('TM5M7_SRC',1,ZHOOK_HANDLE) -CONTAINS -SUBROUTINE POM_SRC_43R3() - - ! mass to number conversion factors for the relevant modes - numbscale_exp = EXP(1.5*(LOG(sigma_lognormal(mode_aii)))**2) - mass2numb_fact = 3./(4.*RPI*(numbscale_exp**3)*pom_density) - mass2numb_ff_insol = mass2numb_fact/(rad_emi_ff_insol**3) - mass2numb_ene_insol = mass2numb_fact/(rad_emi_ene_insol**3) - mass2numb_ind_insol = mass2numb_fact/(rad_emi_ind_insol**3) - mass2numb_tra_insol = mass2numb_fact/(rad_emi_tra_insol**3) - mass2numb_shp_insol = mass2numb_fact/(rad_emi_shp_insol**3) - mass2numb_air_insol = mass2numb_fact/(rad_emi_air_insol**3) - mass2numb_bf_insol = mass2numb_fact/(rad_emi_bf_insol**3) - mass2numb_bb_insol = mass2numb_fact/(rad_emi_bb_insol**3) - - numbscale_exp = EXP(1.5*(LOG(sigma_lognormal(mode_ais)))**2) - mass2numb_fact = 3./(4.*RPI*(numbscale_exp**3)*pom_density) - mass2numb_ff_sol = mass2numb_fact/(rad_emi_ff_sol**3) - mass2numb_ene_sol = mass2numb_fact/(rad_emi_ene_sol**3) - mass2numb_ind_sol = mass2numb_fact/(rad_emi_ind_sol**3) - mass2numb_tra_sol = mass2numb_fact/(rad_emi_tra_sol**3) - mass2numb_shp_sol = mass2numb_fact/(rad_emi_shp_sol**3) - mass2numb_air_sol = mass2numb_fact/(rad_emi_air_sol**3) - - numbscale_exp = EXP(1.5*(LOG(sigma_lognormal(mode_acs)))**2) - mass2numb_fact = 3./(4.*RPI*(numbscale_exp**3)*pom_density) - mass2numb_bf_sol = mass2numb_fact/(rad_emi_bf_sol**3) - !mass2numb_bb_sol = mass2numb_fact/(rad_emi_bb_sol**3) - mass2numb_nonbf_sol = mass2numb_ff_sol - mass2numb_nonbf_insol = mass2numb_ff_insol - - frac_bf(KIDIA:KFDIA)=1.0_JPRB - ! calculate mass fraction related to solid biofuel - where ( ZOMFF(KIDIA:KFDIA) > 1E-30_JPRB ) - frac_bf(KIDIA:KFDIA) = ZOMBF(KIDIA:KFDIA) / ZOMFF(KIDIA:KFDIA) - elsewhere - frac_bf(KIDIA:KFDIA) = 0.0_JPRB - endwhere - - ! for safety, prevent fractions larger than unity. - where (frac_bf(KIDIA:KFDIA) > 1.0_JPRB ) - frac_bf(KIDIA:KFDIA) = 1.0_JPRB - endwhere - - ! add to emis target arrays. - ! For now treat all sectors identical, and put all emissions in lowest model layer (KLEV) - - ! Fossil fuel categories.. - DO JL=KIDIA,KFDIA - emis_mass (mode_aii)%d3(JL,KLEV,2) = & - & emis_mass (mode_aii)%d3(JL,KLEV,2) + ZOMFF(JL) * & - & ( (1.-frac_bf(JL)) * (1.-frac_pom_sol_ff) + & - & frac_bf(JL) * (1.-frac_pom_sol_bf) ) - - emis_number(mode_aii)%d3(JL,KLEV,2) = & - & emis_number(mode_aii)%d3(JL,KLEV,2) + ZOMFF(JL) * & - & ( (1.-frac_bf(JL)) * (1.-frac_pom_sol_ff) * mass2numb_nonbf_insol + & - & frac_bf(JL) * (1.-frac_pom_sol_bf) * mass2numb_bf_insol ) - - emis_mass (mode_ais)%d3(JL,KLEV,3) = & - & emis_mass (mode_ais)%d3(JL,KLEV,3) + ZOMFF(JL) * & - & ( (1.-frac_bf(JL)) * frac_pom_sol_ff ) - - emis_number(mode_ais)%d3(JL,KLEV,3) = & - & emis_number(mode_ais)%d3(JL,KLEV,3) + ZOMFF(JL) * & - & ( (1.-frac_bf(JL)) * frac_pom_sol_ff * mass2numb_nonbf_sol ) - - emis_mass (mode_acs)%d3(JL,KLEV,3) = & - & emis_mass (mode_acs)%d3(JL,KLEV,3) + ZOMFF(JL) * & - & ( frac_bf(JL) * frac_pom_sol_bf ) - - emis_number(mode_acs)%d3(JL,KLEV,3) = & - & emis_number(mode_acs)%d3(JL,KLEV,3) + ZOMFF(JL) * & - & ( frac_bf(JL) * frac_pom_sol_bf * mass2numb_bf_sol ) - ENDDO - - ! Biofuel categories ? (ZOMBF emissions) - -!!$ IF (.not. LAERCHEM)THEN -!!$ ! SOA from CO -!VH DO JL=KIDIA,KFDIA -!VH ZSOA(JL)=0._JPRB -!VH IF (LAERSOA_CHEM) THEN -!VH ZSOA(JL)=MAX(PSOACO(JL),PSOA(JL)) -!VH ELSE -!VH ZSOA(JL)=PSOACO(JL) -!VH ENDIF -!VH ZOMSOURC=ZOMSOURC+ZSOA(JL) -!VH END DO - ! These do not apply for M7 -!!$ PCFLX(JL,KAERO(INBAER+1))= -ZOMSOURC * ROMPHIL -!!$ PCFLX(JL,KAERO(INBAER+2))= -ZOMSOURC * ROMPHOB -!!$ END IF - ! biomass burning - -!VH IF (LFIRE) THEN -!VH IF (LINJ) THEN -!VH DO JL=KIDIA,KFDIA -!VH ! Height of injection for biomass burning emissions : update emis_mass -!VH IF (PINJF(JL) > 200._JPRB .AND. PBLH(JL) > 1500._JPRB) THEN -!VH IX=MINLOC( ABS( (PAPHI(JL,1:KLEV)-PAPHI(JL,KLEV))/RG - PINJF(JL))) -!VH ILINJ1=IX(1) -!VH ILINJ2=ILINJ1 -!VH ! calculate total deltap over injected levels -!VH ZDELP=0.0_JPRB -!VH DO JK = ILINJ1, ILINJ2 -!VH ZDELP = ZDELP + PDELP(JL,JK) -!VH ENDDO -!VH DO JK = ILINJ1, ILINJ2 -!VH -!VH ! add to emis target arrays -!VH emis_mass (mode_aii)%d3(JL,JK,2) = & -!VH & emis_mass (mode_aii)%d3(JL,JK,2) + ZOMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & -!VH & (1.-frac_pom_sol_bb) -!VH -!VH emis_number(mode_aii)%d3(JL,JK,2) = & -!VH & emis_number(mode_aii)%d3(JL,JK,2) + ZOMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & -!VH & (1.-frac_pom_sol_bb) * mass2numb_bb_insol -!VH -!VH emis_mass (mode_acs)%d3(JL,JK,3) = & -!VH & emis_mass (mode_acs)%d3(JL,JK,3) + ZOMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & -!VH & frac_pom_sol_bb -!VH -!VH emis_number(mode_acs)%d3(JL,JK,3) = & -!VH & emis_number(mode_acs)%d3(JL,JK,3) + ZOMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & -!VH & frac_pom_sol_bb * mass2numb_bb_sol -!VH ENDDO -!VH ELSE -!VH ZDELP=0.0_JPRB -!VH DO JK = KLEV-3, KLEV-2 -!VH ZDELP = ZDELP + PDELP(JL,JK) -!VH ENDDO -!VH DO JK = KLEV-3, KLEV-2 -!VH ! add to emis target arrays -!VH emis_mass (mode_aii)%d3(JL,JK,2) = & -!VH & emis_mass (mode_aii)%d3(JL,JK,2) + ZOMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & -!VH & (1.-frac_pom_sol_bb) -!VH -!VH emis_number(mode_aii)%d3(JL,JK,2) = & -!VH & emis_number(mode_aii)%d3(JL,JK,2) + ZOMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & -!VH & (1.-frac_pom_sol_bb) * mass2numb_bb_insol -!VH -!VH emis_mass (mode_acs)%d3(JL,JK,3) = & -!VH & emis_mass (mode_acs)%d3(JL,JK,3) + ZOMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & -!VH & frac_pom_sol_bb -!VH -!VH emis_number(mode_acs)%d3(JL,JK,3) = & -!VH & emis_number(mode_acs)%d3(JL,JK,3) + ZOMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & -!VH & frac_pom_sol_bb * mass2numb_bb_sol -!VH ENDDO -!VH ENDIF -!VH ENDDO -!VH ELSE ! LINJ=false: always injection at lowest levels -!VH DO JL=KIDIA,KFDIA -!VH ZDELP=0.0_JPRB -!VH DO JK = KLEV-2, KLEV-1 -!VH ZDELP = ZDELP + PDELP(JL,JK) -!VH ENDDO -!VH DO JK = KLEV-2, KLEV -!VH ! add to emis target arrays -!VH emis_mass (mode_aii)%d3(JL,JK,2) = & -!VH & emis_mass (mode_aii)%d3(JL,JK,2) + ZOMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & -!VH & (1.-frac_pom_sol_bb) -!VH -!VH emis_number(mode_aii)%d3(JL,JK,2) = & -!VH & emis_number(mode_aii)%d3(JL,JK,2) + ZOMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & -!VH & (1.-frac_pom_sol_bb) * mass2numb_bb_insol -!VH -!VH emis_mass (mode_acs)%d3(JL,JK,3) = & -!VH & emis_mass (mode_acs)%d3(JL,JK,3) + ZOMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & -!VH & frac_pom_sol_bb -!VH -!VH emis_number(mode_acs)%d3(JL,JK,3) = & -!VH & emis_number(mode_acs)%d3(JL,JK,3) + ZOMGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & -!VH & frac_pom_sol_bb * mass2numb_bb_sol -!VH ENDDO -!VH ENDDO -!VH ENDIF ! LINJ -!VH ENDIF ! LFIRE - -END SUBROUTINE - - -SUBROUTINE BC_SRC_43R3() - - ! mass to number conversion factors for the relevant modes - numbscale_exp = EXP(1.5*(LOG(sigma_lognormal(mode_aii)))**2) - mass2numb_fact = 3./(4.*RPI*(numbscale_exp**3)*carbon_density) - mass2numb_ff_insol = mass2numb_fact/(rad_emi_ff_insol**3) - mass2numb_ene_insol = mass2numb_fact/(rad_emi_ene_insol**3) - mass2numb_ind_insol = mass2numb_fact/(rad_emi_ind_insol**3) - mass2numb_tra_insol = mass2numb_fact/(rad_emi_tra_insol**3) - mass2numb_shp_insol = mass2numb_fact/(rad_emi_shp_insol**3) - mass2numb_air_insol = mass2numb_fact/(rad_emi_air_insol**3) - mass2numb_bf_insol = mass2numb_fact/(rad_emi_bf_insol**3) - mass2numb_bb_insol = mass2numb_fact/(rad_emi_bb_insol**3) - - numbscale_exp = EXP(1.5*(LOG(sigma_lognormal(mode_ais)))**2) - mass2numb_fact = 3./(4.*RPI*(numbscale_exp**3)*carbon_density) - mass2numb_ff_sol = mass2numb_fact/(rad_emi_ff_sol**3) - mass2numb_ene_sol = mass2numb_fact/(rad_emi_ene_sol**3) - mass2numb_ind_sol = mass2numb_fact/(rad_emi_ind_sol**3) - mass2numb_tra_sol = mass2numb_fact/(rad_emi_tra_sol**3) - mass2numb_shp_sol = mass2numb_fact/(rad_emi_shp_sol**3) - mass2numb_air_sol = mass2numb_fact/(rad_emi_air_sol**3) - - numbscale_exp = EXP(1.5*(LOG(sigma_lognormal(mode_acs)))**2) - mass2numb_fact = 3./(4.*RPI*(numbscale_exp**3)*carbon_density) - mass2numb_bf_sol = mass2numb_fact/(rad_emi_bf_sol**3) - !mass2numb_bb_sol = mass2numb_fact/(rad_emi_bb_sol**3) - mass2numb_nonbf_sol = mass2numb_ff_sol - mass2numb_nonbf_insol = mass2numb_ff_insol - -! frac_bf(KIDIA:KFDIA)=1.0_JPRB - ! calculate mass fraction related to solid biofuel - where ( ZBCFF(KIDIA:KFDIA) > 1E-30_JPRB ) - frac_bf(KIDIA:KFDIA) = ZBCBF(KIDIA:KFDIA) / & - ZBCFF(KIDIA:KFDIA) - elsewhere - frac_bf(KIDIA:KFDIA) = 0.0_JPRB - endwhere - - ! for safety, prevent fractions larger than unity. - where (frac_bf(KIDIA:KFDIA) > 1.0_JPRB ) - frac_bf(KIDIA:KFDIA) = 1.0_JPRB - endwhere - - - - ! add to emis target arrays. - ! For now treat all sectors identical, and put all emissions in lowest model layer (KLEV) - - ! Fossil fuel categories.. - DO JL=KIDIA,KFDIA - emis_mass (mode_aii)%d3(JL,KLEV,1) = & - & emis_mass (mode_aii)%d3(JL,KLEV,1) + ZBCFF(JL) * & - & ( (1.-frac_bf(JL)) * (1.-frac_bc_sol_ff) + & - & frac_bf(JL) * (1.-frac_bc_sol_bf) ) - - emis_number(mode_aii)%d3(JL,KLEV,1) = & - & emis_number(mode_aii)%d3(JL,KLEV,1) + ZBCFF(JL) * & - & ( (1.-frac_bf(JL)) * (1.-frac_bc_sol_ff) * mass2numb_nonbf_insol + & - & frac_bf(JL) * (1.-frac_bc_sol_bf) * mass2numb_bf_insol ) - - emis_mass (mode_ais)%d3(JL,KLEV,2) = & - & emis_mass (mode_ais)%d3(JL,KLEV,2) + ZBCFF(JL) * & - & ( (1.-frac_bf(JL)) * frac_bc_sol_ff ) - - emis_number(mode_ais)%d3(JL,KLEV,2) = & - & emis_number(mode_ais)%d3(JL,KLEV,2) + ZBCFF(JL) * & - & ( (1.-frac_bf(JL)) * frac_bc_sol_ff * mass2numb_nonbf_sol ) - - emis_mass (mode_acs)%d3(JL,KLEV,2) = & - & emis_mass (mode_acs)%d3(JL,KLEV,2) + ZBCFF(JL) * & - & ( frac_bf(JL) * frac_bc_sol_bf ) - - emis_number(mode_acs)%d3(JL,KLEV,2) = & - & emis_number(mode_acs)%d3(JL,KLEV,2) + ZBCFF(JL) * & - & ( frac_bf(JL) * frac_bc_sol_bf * mass2numb_bf_sol ) - ENDDO - - ! Biofuel categories ? (ZBCBF emissions - currently not treated..) - - - ! biomass burning - -!VH IF (LFIRE) THEN -!VH IF (LINJ) THEN -!VH DO JL=KIDIA,KFDIA -!VH ! Height of injection for biomass burning emissions : update emis_mass -!VH -!VH IF (PINJF(JL) > 200._JPRB .AND. PBLH(JL) > 1500._JPRB) THEN -!VH IX=MINLOC( ABS( (PAPHI(JL,1:KLEV)-PAPHI(JL,KLEV))/RG - PINJF(JL))) -!VH ILINJ1=IX(1) -!VH ILINJ2=ILINJ1 -!VH ! calculate total deltap over injected levels -!VH ZDELP=0.0_JPRB -!VH DO JK = ILINJ1, ILINJ2 -!VH ZDELP = ZDELP + PDELP(JL,JK) -!VH ENDDO -!VH DO JK = ILINJ1, ILINJ2 -!VH -!VH ! add to emis target arrays -!VH emis_mass (mode_aii)%d3(JL,JK,1) = & -!VH & emis_mass (mode_aii)%d3(JL,JK,1) + ZBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & -!VH & (1.-frac_bc_sol_bb) -!VH -!VH emis_number(mode_aii)%d3(JL,JK,1) = & -!VH & emis_number(mode_aii)%d3(JL,JK,1) + ZBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & -!VH & (1.-frac_bc_sol_bb) * mass2numb_bb_insol -!VH -!VH emis_mass (mode_acs)%d3(JL,JK,2) = & -!VH & emis_mass (mode_acs)%d3(JL,JK,2) + ZBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & -!VH & frac_bc_sol_bb -!VH -!VH emis_number(mode_acs)%d3(JL,JK,2) = & -!VH & emis_number(mode_acs)%d3(JL,JK,2) + ZBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & -!VH & frac_bc_sol_bb * mass2numb_bb_sol -!VH ENDDO -!VH ELSE -!VH ZDELP=0.0_JPRB -!VH DO JK = KLEV-3, KLEV-2 -!VH ZDELP = ZDELP + PDELP(JL,JK) -!VH ENDDO -!VH DO JK = KLEV-3, KLEV-2 -!VH ! add to emis target arrays -!VH emis_mass (mode_aii)%d3(JL,JK,1) = & -!VH & emis_mass (mode_aii)%d3(JL,JK,1) + ZBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & -!VH & (1.-frac_bc_sol_bb) -!VH -!VH emis_number(mode_aii)%d3(JL,JK,1) = & -!VH & emis_number(mode_aii)%d3(JL,JK,1) + ZBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & -!VH & (1.-frac_bc_sol_bb) * mass2numb_bb_insol -!VH -!VH emis_mass (mode_acs)%d3(JL,JK,2) = & -!VH & emis_mass (mode_acs)%d3(JL,JK,2) + ZBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & -!VH & frac_bc_sol_bb -!VH -!VH emis_number(mode_acs)%d3(JL,JK,2) = & -!VH & emis_number(mode_acs)%d3(JL,JK,2) + ZBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & -!VH & frac_bc_sol_bb * mass2numb_bb_sol -!VH ENDDO -!VH ENDIF -!VH ENDDO -!VH ELSE ! LINJ=false: always injection at lowest levels -!VH DO JL=KIDIA,KFDIA -!VH ZDELP=0.0_JPRB -!VH DO JK = KLEV-2, KLEV-1 -!VH ZDELP = ZDELP + PDELP(JL,JK) -!VH ENDDO -!VH DO JK = KLEV-2, KLEV -!VH ! add to emis target arrays -!VH emis_mass (mode_aii)%d3(JL,JK,1) = & -!VH & emis_mass (mode_aii)%d3(JL,JK,1) + ZBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & -!VH & (1.-frac_bc_sol_bb) -!VH -!VH emis_number(mode_aii)%d3(JL,JK,1) = & -!VH & emis_number(mode_aii)%d3(JL,JK,1) + ZBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & -!VH & (1.-frac_bc_sol_bb) * mass2numb_bb_insol -!VH -!VH emis_mass (mode_acs)%d3(JL,JK,2) = & -!VH & emis_mass (mode_acs)%d3(JL,JK,2) + ZBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & -!VH & frac_bc_sol_bb -!VH -!VH emis_number(mode_acs)%d3(JL,JK,2) = & -!VH & emis_number(mode_acs)%d3(JL,JK,2) + ZBCGF(JL)*ZDIURN(JL)*PDELP(JL,JK)/ZDELP * & -!VH & frac_bc_sol_bb * mass2numb_bb_sol -!VH ENDDO -!VH ENDDO -!VH ENDIF ! LINJ -!VH ENDIF ! LFIRE - -END SUBROUTINE - -! SUBROUTINE ADD_TOFLUX() -! emit(KIDIA:KFDIA,:) = 0.0 -! DO IMODE=1,NMOD ! loop in each mode -! DO INMODE=0,MODE_NM_SED(IMODE) ! loop in aerosols species per mode -! JN = MODE_TRACERS_SED(INMODE,IMODE) ! retrieve indentifier of each specie -! if (JN==ino3_a.or.JN==inh4.or.JN==imsa) then -! emit(KIDIA:KFDIA,:) = 0.0 -! else if(inmode == 0) then ! 1st specie of mode is number part. in mode -! emit(KIDIA:KFDIA,:) = 0.0 -! do ii=1,mode_nm(IMODE) ! add up all number emissions in the mode 'imode'... -! emit(KIDIA:KFDIA,:) = emit(KIDIA:KFDIA,:) + emis_number(IMODE)%d3(KIDIA:KFDIA,:,ii) -! enddo -! else ! this is a 'mass' emission with index nmode -! emit(KIDIA:KFDIA,:) = emis_mass(IMODE)%d3(KIDIA:KFDIA,:,inmode) -! endif -! ! Change units from kg/m2/sec to kg/kg/sec and update tendency.. -! DO JL=KIDIA,KFDIA -! ! Should limit to troposphere?! (for now sfc only) -! !JK=91 -! !if (JN==iduai)then -! ! write(2020,*)jk,emit(jl,jk) -! !end if -! !if (JN==iaii_n)then -! ! write(2020,*)jk,emit(jl,jk) -! !end if -! !write(2929,*)JN,KAERO(JN) -! PEMIDIAG(JL,KAERO(JN))=PEMIDIAG(JL,KAERO(JN))+sum(emit(JL,:)) -! DO JK=1,KLEV -! !PCFLX(JL,KAERO(JN))=PCFLX(JL,KAERO(JN))+emit(JL,JK) - -! PTENC(JL,JK,KAERO(JN))=PTENC(JL,JK,KAERO(JN))+emit(JL,JK) * RG /PDELP(JL,JK) -! ENDDO - -! ENDDO -! ENDDO -! ENDDO -! END SUBROUTINE ADD_TOFLUX + END SUBROUTINE TM5M7_SRC From a3cee743aaebdad24dfc66186848ccebe362f19a Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Thu, 27 Nov 2025 16:21:06 +0000 Subject: [PATCH 102/129] Pull request #61: Bug fix interpolation of refractive indices in OP diagnostics Merge in ~NM6/openifs-48r1 from bugfix/optprop-diag-wvl to knmi-m7 Squashed commit of the following: commit 392a5db70cdc27f6835bf08492e39ee474d50189 Author: Philippe Le Sager Date: Thu Nov 27 16:58:21 2025 +0100 Account for difference between 'kproma' and 'kbdim' in refractive index interpolations --- ifs-source/arpifs/m7/module/mo_ham_rad.F90 | 30 ++++++++-------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/ifs-source/arpifs/m7/module/mo_ham_rad.F90 b/ifs-source/arpifs/m7/module/mo_ham_rad.F90 index fd8543ca..34fb2e0e 100755 --- a/ifs-source/arpifs/m7/module/mo_ham_rad.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_rad.F90 @@ -1348,23 +1348,15 @@ SUBROUTINE ham_rad(kproma, kbdim, klev, krow, kpband, kb_sw, & #ifdef HAMMOZ IF (ltimer) CALL timer_start(timer_ham_rad_refrac) #endif - !gf: the former usage of nr(1:kproma,:,jwv,jclass) and ni(1:kproma,:,jwv,jclass) - ! directly in the call to ham_rad_refrac is causing architecture-dependent problems (Cray XT5) - ! Therefore intermediate variables znr2d and zni2d are introduced - - znr2d(1:kproma,:) = nr_diag(1:kproma,:,jwv,jclass) - zni2d(1:kproma,:) = ni_diag(1:kproma,:,jwv,jclass) - - + ! Fill znr2d(1:kproma,:) with interpolated values; to becopied into nr_diag(1:kproma,:,jwv,jclass) + ! ! 3.46, 2.79, 2.33, 2.05, 1.78, 1.46, 1.27, 1.01, 0.70, 0.53, 0.39, 0.30, 0.23, 8.02 [um] - call interp_refr_index(kbdim, klev, lambda, nr(1:kproma,:,:,jclass), lambda_diag(jwv), znr2d(1:kproma,:)) - - ! should we do logarithmic interpolation for imaginary part? - call interp_refr_index(kbdim, klev, lambda, ni(1:kproma,:,:,jclass), lambda_diag(jwv), zni2d(1:kproma,:)) + call interp_refr_index(kproma, kbdim, klev, lambda, nr(:,:,:,jclass), lambda_diag(jwv), znr2d) - !CALL ham_rad_refrac(kproma, kbdim, klev, krow, & - ! ntrac, jclass, jwv, & - ! pxtm1, znr2d, zni2d ) + ! Fill zni2d(1:kproma,:) with interpolated values; to becopied into ni_diag(1:kproma,:,jwv,jclass) + ! + ! should we do logarithmic interpolation for imaginary part? + call interp_refr_index(kproma, kbdim, klev, lambda, ni(:,:,:,jclass), lambda_diag(jwv), zni2d) #ifdef HAMMOZ IF (ltimer) CALL timer_stop(timer_ham_rad_refrac) @@ -1445,7 +1437,7 @@ SUBROUTINE ham_rad(kproma, kbdim, klev, krow, kpband, kb_sw, & !ALLOCATE(ni(kbdim,klev,Nwv_tot,nclass)) !sigma(1:kproma,:,jwv,jclass) = sigma(1:kproma,:,jwv,jclass)*lambda(jwv)*lambda(jwv) - END DO ! jwv + END DO ! jwv diag END IF ! nrad END DO ! jclass @@ -1532,14 +1524,14 @@ END SUBROUTINE ham_rad !---------------------------------------------------------------------------------------------------------------- - SUBROUTINE interp_refr_index(kbdim, klev, wl_in, nr_in, wl_out, nr_out) + SUBROUTINE interp_refr_index(kproma, kbdim, klev, wl_in, nr_in, wl_out, nr_out) !! Interpolates refractive index nr_in(kbdim,klev,Nwv_tot) !! at a single wavelength wl_out, result in nr_out(kbdim,klev) implicit none ! Input - integer :: kbdim, klev + integer :: kproma, kbdim, klev real(dp), intent(in) :: wl_in(Nwv_tot) ! (Nwv_tot), unsorted real(dp), intent(in) :: nr_in(kbdim,klev,Nwv_tot) ! (kbdim,klev,Nwv_tot) real(dp), intent(in) :: wl_out ! single query wavelength @@ -1571,7 +1563,7 @@ SUBROUTINE interp_refr_index(kbdim, klev, wl_in, nr_in, wl_out, nr_out) !write(*,*)"wl_out",wl_out - nr_out(1:kbdim,1:klev) = (1.0_dp - weight) * nr_in(:,:,idx_low)+ weight*nr_in(:,:,idx_high) + nr_out(1:kproma,1:klev) = (1.0_dp - weight) * nr_in(1:kproma,:,idx_low)+ weight*nr_in(1:kproma,:,idx_high) END SUBROUTINE interp_refr_index From 4ca64d6cbb31c611fc6224eddf0086fa5fa74e9c Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Thu, 27 Nov 2025 17:10:48 +0000 Subject: [PATCH 103/129] Pull request #60: Fix CMIP stratospheric aerosols Merge in ~NM6/openifs-48r1 from bugfix/strataero to knmi-m7 Squashed commit of the following: commit 265f69c9c8948ebd9a19eeb8ba17c9c4ff9b1c11 Merge: f97211c 445383a Author: Philippe Le Sager Date: Thu Nov 27 17:25:28 2025 +0100 Merge remote-tracking branch 'origin/knmi-m7' into bugfix/strataero commit f97211c1b1c64ae7587c961594ebc77887c2549f Author: Philippe Le Sager Date: Thu Nov 27 16:51:48 2025 +0100 Use explicit indices in strat process commit 2e1c2b0481a3a33af10158ce2ef0772f02615a66 Merge: 8abae0d c5ad923 Author: Philippe Le Sager Date: Wed Nov 26 16:43:02 2025 +0100 Merge remote-tracking branch 'origin/knmi-m7' into bugfix/strataero commit 8abae0d153b4857832756a6f4b0524648d60f6a2 Author: Philippe Le Sager Date: Wed Nov 26 16:41:14 2025 +0100 Align with EC-Earth4 version commit a7c4edc900204cd5f602adf5e6e8e609e4f51436 Author: Philippe Le Sager Date: Wed Nov 26 16:34:45 2025 +0100 Fix indentation of the code (only whitespace changes\!) commit 2775da5c884f420ab2f6690c1d9ca1a84cd97422 Author: Philippe Le Sager Date: Tue Nov 25 17:47:30 2025 +0100 Fix strataero array size commit c38bbd9ee7bb38ec605463e7cfce34f133193a61 Author: Philippe Le Sager Date: Tue Nov 25 16:43:37 2025 +0100 Fix decision tree for cases requiring background data --- .../arpifs/phys_ec/cmip_strato_aero.F90 | 731 +++++++++--------- .../phys_ec/cmip_strato_aero_process.F90 | 20 +- .../arpifs/phys_radi/radiation_scheme.F90 | 18 +- ifs-source/arpifs/phys_radi/suecrad.F90 | 25 +- 4 files changed, 397 insertions(+), 397 deletions(-) diff --git a/ifs-source/arpifs/phys_ec/cmip_strato_aero.F90 b/ifs-source/arpifs/phys_ec/cmip_strato_aero.F90 index 77618900..ff8c3a8f 100755 --- a/ifs-source/arpifs/phys_ec/cmip_strato_aero.F90 +++ b/ifs-source/arpifs/phys_ec/cmip_strato_aero.F90 @@ -103,8 +103,6 @@ SUBROUTINE CMIP_STRATO_AERO(YDMODEL) IF (LHOOK) CALL DR_HOOK('CMIP_STRATO_AERO',0,ZHOOK_HANDLE) -WRITE(NULOUT,*)'Entering Subroutine CMIP_STRATO_AERO' - ASSOCIATE(& & YDERAD=>YDMODEL%YRML_PHY_RAD%YRERAD, YDPHYAER => YDMODEL%YRML_PHY_AER, & & YDRIP=>YDMODEL%YRML_GCONF%YRRIP& @@ -122,11 +120,11 @@ SUBROUTINE CMIP_STRATO_AERO(YDMODEL) & LCMIP_STRATAER_CMIP7 =>YDERAD%LCMIP_STRATAER_CMIP7 & ) - ASSOCIATE(& - & AOD_SUN=>YDAERSTRAT%AOD_SUN,AAOD_SUN=>YDAERSTRAT%AAOD_SUN,REFAOD_SUN=>YDAERSTRAT%REFAOD_SUN, & - & AOD_SUN_MEAN=>YDAERSTRAT%AOD_SUN_MEAN, AAOD_SUN_MEAN=>YDAERSTRAT%AAOD_SUN_MEAN,REFAOD_SUN_MEAN=>YDAERSTRAT%REFAOD_SUN_MEAN, & - & AAOD_EARTH_MEAN=>YDAERSTRAT%AAOD_EARTH_MEAN, AAOD_EARTH=>YDAERSTRAT%AAOD_EARTH& - ) +ASSOCIATE(& + & AOD_SUN=>YDAERSTRAT%AOD_SUN,AAOD_SUN=>YDAERSTRAT%AAOD_SUN,REFAOD_SUN=>YDAERSTRAT%REFAOD_SUN, & + & AOD_SUN_MEAN=>YDAERSTRAT%AOD_SUN_MEAN, AAOD_SUN_MEAN=>YDAERSTRAT%AAOD_SUN_MEAN,REFAOD_SUN_MEAN=>YDAERSTRAT%REFAOD_SUN_MEAN, & + & AAOD_EARTH_MEAN=>YDAERSTRAT%AAOD_EARTH_MEAN, AAOD_EARTH=>YDAERSTRAT%AAOD_EARTH& + ) ! What is the date please? @@ -136,34 +134,38 @@ SUBROUTINE CMIP_STRATO_AERO(YDMODEL) CALL UPDCAL(IJ0,IM0,IA0,YDRIP%NSTADD,IDAY,IMON,IMODYR,ILMOIS,NULOUT) ! Open the file only if we begin a new month and I am the master process -IF (IMON/=IMONOLD) THEN - IMONOLD=IMON +NEWMONTH: IF (IMON/=IMONOLD) THEN + IMONOLD=IMON - IF (MYPROC==RPRC) THEN + ROOT: IF (MYPROC==RPRC) THEN - ! Forcing file includes 1980 months since 01/1850 for CMIP7 and + ! Forcing file includes 1980 months since 1850-01 for CMIP6, and 3288 months starting on 1750-01 for CMIP7 FORC_MONTH=(IMODYR-STRATO_FIRSTYEAR)*12+IMON - WRITE(NULOUT,*)'CMIP_STRATO_AERO; FORCING MONTH = ',FORC_MONTH,'/1980, starting from the year 1850' - - WRITE(NULOUT,*) 'CCMIP_STRAT_FULL: ',TRIM(CCMIP_STRAT_FULL) + !WRITE(NULOUT,'(A,I4,A,I4,A,I4)') 'CMIP_STRATO_AERO: FORCING MONTH NB= ', FORC_MONTH, '/', STRATO_CMIP_NTIME, ', starting from the year ', STRATO_FIRSTYEAR + !WRITE(NULOUT,*) 'CCMIP_STRAT_FULL: ',TRIM(CCMIP_STRAT_FULL) + ! Check on transient file LLOPEN=.FALSE. IOS= 0 INQUIRE(FILE=CCMIP_STRAT_FULL,IOSTAT=IOS,EXIST=LLSTRAT,OPENED=LLOPEN) LLSTRAT = LLSTRAT .AND. (IOS == 0) .AND. .NOT.LLOPEN - + IF (.NOT.LLSTRAT) THEN WRITE(NULERR,'('' ERROR IN CMIP_STRATO_AERO.F90 :'',& - & '' THE FORCING FILE IS NOT AVAILABLE !'')') + & '' THE FORCING FILE IS NOT AVAILABLE OR ALREADY OPENED !'')') CALL ABOR1('CMIP_STRATO_AERO') ENDIF - IF (IMODYR>=STRATO_FIRSTYEAR .AND. IMODYR<=STRATO_LASTYEAR .AND. .NOT. LCMIP_STRATAER_BCKGD .AND. FORC_MONTH/=1 .AND. FORC_MONTH/=STRATO_CMIP_NTIME) THEN + ! Any available month except 1st or last + AVAIL: IF (IMODYR>=STRATO_FIRSTYEAR .AND. IMODYR<=STRATO_LASTYEAR .AND. .NOT. LCMIP_STRATAER_BCKGD .AND. FORC_MONTH/=1 .AND. FORC_MONTH/=STRATO_CMIP_NTIME) THEN + + WRITE(NULOUT,'(A,I4,A,I4,A,I4)') 'CMIP_STRATO_AERO [1]: GETTING FORCING FOR MONTH NB= ', FORC_MONTH, '/', STRATO_CMIP_NTIME, ', starting from the year ', STRATO_FIRSTYEAR + WRITE(NULOUT,FMT='('' CCMIP_STRAT_FULL = '',A)') TRIM(CCMIP_STRAT_FULL) START=(/1, 1, 1, FORC_MONTH-1/) FINAL=(/STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NMONTH/) FINAL_LW=(/STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NMONTH/) - + ! Allocate temporary arrays ALLOCATE(AOD_SUN_ORIG (STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NMONTH)) ALLOCATE(AAOD_SUN_ORIG (STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NMONTH)) @@ -175,30 +177,30 @@ SUBROUTINE CMIP_STRATO_AERO(YDMODEL) AAOD_SUN_ORIG(:,:,:,:)=0._JPRB REFAOD_SUN_ORIG(:,:,:,:)=0._JPRB AAOD_EARTH_ORIG(:,:,:,:)=0._JPRB - + ! OPEN NETCDF FILE CALL CHECK( NF90_OPEN(CCMIP_STRAT_FULL,NF90_NOWRITE,IUNIT) ) - + ! Reading latitudes needed for the interpolation. CALL CHECK( NF90_INQ_VARID(IUNIT, LAT_NAME, LAT_VARID) ) CALL CHECK( NF90_GET_VAR(IUNIT, LAT_VARID, STRATO_CMIP_LAT) ) - + ! READ 4-D FIELDS CALL CHECK( NF90_INQ_VARID(IUNIT, AOD_SUN_NAME, AOD_SUN_VARID) ) CALL CHECK( NF90_GET_VAR(IUNIT, AOD_SUN_VARID, AOD_SUN_ORIG, START, FINAL) ) - + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_SUN_NAME, AAOD_SUN_VARID) ) CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_SUN_VARID, AAOD_SUN_ORIG, START, FINAL) ) - + CALL CHECK( NF90_INQ_VARID(IUNIT, REFAOD_SUN_NAME, REFAOD_SUN_VARID) ) CALL CHECK( NF90_GET_VAR(IUNIT, REFAOD_SUN_VARID, REFAOD_SUN_ORIG, START, FINAL) ) - + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_EARTH_NAME, AAOD_EARTH_VARID) ) CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_EARTH_VARID, AAOD_EARTH_ORIG, START, FINAL_LW) ) - + ! CLOSE NETCDF FILE CALL CHECK( NF90_CLOSE(IUNIT) ) - + ! Fill the data for the current month and reorder the arrays DO ILEV=1,STRATO_CMIP_NALT JLEV=STRATO_CMIP_NALT-ILEV+1 @@ -222,168 +224,173 @@ SUBROUTINE CMIP_STRATO_AERO(YDMODEL) ENDDO ENDDO ENDDO - + DEALLOCATE(AOD_SUN_ORIG ) DEALLOCATE(AAOD_SUN_ORIG ) DEALLOCATE(REFAOD_SUN_ORIG) DEALLOCATE(AAOD_EARTH_ORIG) - ELSE IF (.NOT. LCMIP_STRATAER_BCKGD .AND. LCMIP_STRATAER_CMIP6 & - &.AND. (FORC_MONTH==1 .OR. FORC_MONTH==STRATO_CMIP_NTIME)) THEN + ! Special cases of 1st and last available month + ELSE IF (.NOT. LCMIP_STRATAER_BCKGD .AND. (FORC_MONTH==1 .OR. FORC_MONTH==STRATO_CMIP_NTIME)) THEN IF(LCMIP_STRATAER_CMIP6) THEN - WRITE(NULOUT,*)'CMIP_STRATO_AERO; computing climatological stratospherical forcing' + WRITE(NULOUT,'(A,I4,A,I4,A,I4)') 'CMIP_STRATO_AERO [2]: GETTING FORCING FOR MONTH NB= ', FORC_MONTH, '/', STRATO_CMIP_NTIME, ', starting from the year ', STRATO_FIRSTYEAR + WRITE(NULOUT,*)'CMIP_STRATO_AERO [1] computing CMIP6 climatological stratospheric forcing' - START=(/1, 1, 1, 1/) - FINAL=(/STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME/) - FINAL_LW=(/STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME/) - - ! Allocate temporary arrays - ALLOCATE(AOD_SUN_ORIG (STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME)) - ALLOCATE(AAOD_SUN_ORIG(STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME)) - ALLOCATE(REFAOD_SUN_ORIG(STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME)) - ALLOCATE(AAOD_EARTH_ORIG(STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME)) + START=(/1, 1, 1, 1/) + FINAL=(/STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME/) + FINAL_LW=(/STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME/) - ! Initialise arrays: - AOD_SUN_ORIG(:,:,:,:)=0._JPRB - AAOD_SUN_ORIG(:,:,:,:)=0._JPRB - REFAOD_SUN_ORIG(:,:,:,:)=0._JPRB - AAOD_EARTH_ORIG(:,:,:,:)=0._JPRB - - ! OPEN NETCDF FILE - CALL CHECK( NF90_OPEN(CCMIP_STRAT_FULL,NF90_NOWRITE,IUNIT) ) - - ! Reading latitudes needed for the interpolation. - CALL CHECK( NF90_INQ_VARID(IUNIT, LAT_NAME, LAT_VARID) ) - CALL CHECK( NF90_GET_VAR(IUNIT, LAT_VARID, STRATO_CMIP_LAT) ) - - ! READ 4-D FIELDS - CALL CHECK( NF90_INQ_VARID(IUNIT, AOD_SUN_NAME, AOD_SUN_VARID) ) - CALL CHECK( NF90_GET_VAR(IUNIT, AOD_SUN_VARID, AOD_SUN_ORIG, START, FINAL) ) - - CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_SUN_NAME, AAOD_SUN_VARID) ) - CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_SUN_VARID, AAOD_SUN_ORIG, START, FINAL) ) - - CALL CHECK( NF90_INQ_VARID(IUNIT, REFAOD_SUN_NAME, REFAOD_SUN_VARID) ) - CALL CHECK( NF90_GET_VAR(IUNIT, REFAOD_SUN_VARID, REFAOD_SUN_ORIG, START, FINAL) ) - - CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_EARTH_NAME, AAOD_EARTH_VARID) ) - CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_EARTH_VARID, AAOD_EARTH_ORIG, START, FINAL_LW) ) - - ! CLOSE NETCDF FILE - CALL CHECK( NF90_CLOSE(IUNIT) ) + ! Allocate temporary arrays + ALLOCATE(AOD_SUN_ORIG (STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME)) + ALLOCATE(AAOD_SUN_ORIG(STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME)) + ALLOCATE(REFAOD_SUN_ORIG(STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME)) + ALLOCATE(AAOD_EARTH_ORIG(STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME)) + + ! Initialise arrays: + AOD_SUN_ORIG(:,:,:,:)=0._JPRB + AAOD_SUN_ORIG(:,:,:,:)=0._JPRB + REFAOD_SUN_ORIG(:,:,:,:)=0._JPRB + AAOD_EARTH_ORIG(:,:,:,:)=0._JPRB + + ! OPEN NETCDF FILE + CALL CHECK( NF90_OPEN(CCMIP_STRAT_FULL,NF90_NOWRITE,IUNIT) ) + + ! Reading latitudes needed for the interpolation. + CALL CHECK( NF90_INQ_VARID(IUNIT, LAT_NAME, LAT_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, LAT_VARID, STRATO_CMIP_LAT) ) + + ! READ 4-D FIELDS + CALL CHECK( NF90_INQ_VARID(IUNIT, AOD_SUN_NAME, AOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AOD_SUN_VARID, AOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_SUN_NAME, AAOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_SUN_VARID, AAOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, REFAOD_SUN_NAME, REFAOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, REFAOD_SUN_VARID, REFAOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_EARTH_NAME, AAOD_EARTH_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_EARTH_VARID, AAOD_EARTH_ORIG, START, FINAL_LW) ) + + ! CLOSE NETCDF FILE + CALL CHECK( NF90_CLOSE(IUNIT) ) - ! Climatology computed on-line, only one time. - WRITE(NULOUT,*)'CMIP_STRATO_AERO; transition between climatological and time-resolved stratospherical forcing' - DO ILEV=1,STRATO_CMIP_NALT - JLEV=STRATO_CMIP_NALT-ILEV+1 - DO ILAT=1,STRATO_CMIP_NLAT - ! SW parameters - DO IB=1,STRATO_CMIP_NSB + ! Climatology computed on-line. Transition between climatological and time-resolved stratospheric forcing + DO ILEV=1,STRATO_CMIP_NALT + JLEV=STRATO_CMIP_NALT-ILEV+1 + DO ILAT=1,STRATO_CMIP_NLAT + ! SW parameters + DO IB=1,STRATO_CMIP_NSB - AOD_SUN_MEAN(ILEV,ILAT,IB)=SUM(AOD_SUN_ORIG(IB,ILAT,JLEV,:))/STRATO_CMIP_NTIME - AAOD_SUN_MEAN(ILEV,ILAT,IB)=SUM(AAOD_SUN_ORIG(IB,ILAT,JLEV,:))/STRATO_CMIP_NTIME - REFAOD_SUN_MEAN(ILEV,ILAT,IB)=SUM(REFAOD_SUN_ORIG(IB,ILAT,JLEV,:))/STRATO_CMIP_NTIME + AOD_SUN_MEAN(ILEV,ILAT,IB)=SUM(AOD_SUN_ORIG(IB,ILAT,JLEV,:))/STRATO_CMIP_NTIME + AAOD_SUN_MEAN(ILEV,ILAT,IB)=SUM(AAOD_SUN_ORIG(IB,ILAT,JLEV,:))/STRATO_CMIP_NTIME + REFAOD_SUN_MEAN(ILEV,ILAT,IB)=SUM(REFAOD_SUN_ORIG(IB,ILAT,JLEV,:))/STRATO_CMIP_NTIME - IF (FORC_MONTH==1) THEN + IF (FORC_MONTH==1) THEN - AOD_SUN(ILEV,ILAT,IB,1)=AOD_SUN_MEAN(ILEV,ILAT,IB) - AAOD_SUN(ILEV,ILAT,IB,1)=AAOD_SUN_MEAN(ILEV,ILAT,IB) - REFAOD_SUN(ILEV,ILAT,IB,1)=REFAOD_SUN_MEAN(ILEV,ILAT,IB) + AOD_SUN(ILEV,ILAT,IB,1)=AOD_SUN_MEAN(ILEV,ILAT,IB) + AAOD_SUN(ILEV,ILAT,IB,1)=AAOD_SUN_MEAN(ILEV,ILAT,IB) + REFAOD_SUN(ILEV,ILAT,IB,1)=REFAOD_SUN_MEAN(ILEV,ILAT,IB) - DO IMONTH=2,STRATO_CMIP_NMONTH - AOD_SUN(ILEV,ILAT,IB,IMONTH)=AOD_SUN_ORIG(IB,ILAT,JLEV,IMONTH-1) - AAOD_SUN(ILEV,ILAT,IB,IMONTH)=AAOD_SUN_ORIG(IB,ILAT,JLEV,IMONTH-1) - REFAOD_SUN(ILEV,ILAT,IB,IMONTH)=REFAOD_SUN_ORIG(IB,ILAT,JLEV,IMONTH-1) - ENDDO + DO IMONTH=2,STRATO_CMIP_NMONTH + AOD_SUN(ILEV,ILAT,IB,IMONTH)=AOD_SUN_ORIG(IB,ILAT,JLEV,IMONTH-1) + AAOD_SUN(ILEV,ILAT,IB,IMONTH)=AAOD_SUN_ORIG(IB,ILAT,JLEV,IMONTH-1) + REFAOD_SUN(ILEV,ILAT,IB,IMONTH)=REFAOD_SUN_ORIG(IB,ILAT,JLEV,IMONTH-1) + ENDDO - ELSE IF (FORC_MONTH==STRATO_CMIP_NTIME) THEN + ELSE IF (FORC_MONTH==STRATO_CMIP_NTIME) THEN - AOD_SUN(ILEV,ILAT,IB,STRATO_CMIP_NMONTH)=AOD_SUN_MEAN(ILEV,ILAT,IB) - AAOD_SUN(ILEV,ILAT,IB,STRATO_CMIP_NMONTH)=AAOD_SUN_MEAN(ILEV,ILAT,IB) - REFAOD_SUN(ILEV,ILAT,IB,STRATO_CMIP_NMONTH)=REFAOD_SUN_MEAN(ILEV,ILAT,IB) - DO IMONTH=1,STRATO_CMIP_NMONTH-1 - AOD_SUN(ILEV,ILAT,IB,IMONTH)=AOD_SUN_ORIG(IB,ILAT,JLEV,STRATO_CMIP_NTIME+IMONTH-2) - AAOD_SUN(ILEV,ILAT,IB,IMONTH)=AAOD_SUN_ORIG(IB,ILAT,JLEV,STRATO_CMIP_NTIME+IMONTH-2) - REFAOD_SUN(ILEV,ILAT,IB,IMONTH)=REFAOD_SUN_ORIG(IB,ILAT,JLEV,STRATO_CMIP_NTIME+IMONTH-2) - ENDDO + AOD_SUN(ILEV,ILAT,IB,STRATO_CMIP_NMONTH)=AOD_SUN_MEAN(ILEV,ILAT,IB) + AAOD_SUN(ILEV,ILAT,IB,STRATO_CMIP_NMONTH)=AAOD_SUN_MEAN(ILEV,ILAT,IB) + REFAOD_SUN(ILEV,ILAT,IB,STRATO_CMIP_NMONTH)=REFAOD_SUN_MEAN(ILEV,ILAT,IB) + DO IMONTH=1,STRATO_CMIP_NMONTH-1 + AOD_SUN(ILEV,ILAT,IB,IMONTH)=AOD_SUN_ORIG(IB,ILAT,JLEV,STRATO_CMIP_NTIME+IMONTH-2) + AAOD_SUN(ILEV,ILAT,IB,IMONTH)=AAOD_SUN_ORIG(IB,ILAT,JLEV,STRATO_CMIP_NTIME+IMONTH-2) + REFAOD_SUN(ILEV,ILAT,IB,IMONTH)=REFAOD_SUN_ORIG(IB,ILAT,JLEV,STRATO_CMIP_NTIME+IMONTH-2) + ENDDO - ENDIF - ENDDO + ENDIF + ENDDO - ! LW parameters - DO IB=1,STRATO_CMIP_NTB - AAOD_EARTH_MEAN(ILEV,ILAT,IB)=SUM(AAOD_EARTH_ORIG(IB,ILAT,JLEV,:))/STRATO_CMIP_NTIME - IF (FORC_MONTH==1) THEN - AAOD_EARTH(ILEV,ILAT,IB,1)=AAOD_EARTH_MEAN(ILEV,ILAT,IB) - DO IMONTH=2,STRATO_CMIP_NMONTH - AAOD_EARTH(ILEV,ILAT,IB,IMONTH)=AAOD_EARTH_ORIG(IB,ILAT,JLEV,IMONTH-1) - ENDDO - ELSE IF (FORC_MONTH==STRATO_CMIP_NTIME) THEN - AAOD_EARTH(ILEV,ILAT,IB,STRATO_CMIP_NMONTH)=AAOD_EARTH_MEAN(ILEV,ILAT,IB) - DO IMONTH=1,STRATO_CMIP_NMONTH-1 - AAOD_EARTH(ILEV,ILAT,IB,IMONTH)=AAOD_EARTH_ORIG(IB,ILAT,JLEV,STRATO_CMIP_NTIME+IMONTH-2) - ENDDO - ENDIF - ENDDO + ! LW parameters + DO IB=1,STRATO_CMIP_NTB + AAOD_EARTH_MEAN(ILEV,ILAT,IB)=SUM(AAOD_EARTH_ORIG(IB,ILAT,JLEV,:))/STRATO_CMIP_NTIME + IF (FORC_MONTH==1) THEN + AAOD_EARTH(ILEV,ILAT,IB,1)=AAOD_EARTH_MEAN(ILEV,ILAT,IB) + DO IMONTH=2,STRATO_CMIP_NMONTH + AAOD_EARTH(ILEV,ILAT,IB,IMONTH)=AAOD_EARTH_ORIG(IB,ILAT,JLEV,IMONTH-1) + ENDDO + ELSE IF (FORC_MONTH==STRATO_CMIP_NTIME) THEN + AAOD_EARTH(ILEV,ILAT,IB,STRATO_CMIP_NMONTH)=AAOD_EARTH_MEAN(ILEV,ILAT,IB) + DO IMONTH=1,STRATO_CMIP_NMONTH-1 + AAOD_EARTH(ILEV,ILAT,IB,IMONTH)=AAOD_EARTH_ORIG(IB,ILAT,JLEV,STRATO_CMIP_NTIME+IMONTH-2) + ENDDO + ENDIF + ENDDO + ENDDO ENDDO - ENDDO - DEALLOCATE(AOD_SUN_ORIG ) - DEALLOCATE(AAOD_SUN_ORIG ) - DEALLOCATE(REFAOD_SUN_ORIG) - DEALLOCATE(AAOD_EARTH_ORIG) + DEALLOCATE(AOD_SUN_ORIG ) + DEALLOCATE(AAOD_SUN_ORIG ) + DEALLOCATE(REFAOD_SUN_ORIG) + DEALLOCATE(AAOD_EARTH_ORIG) - ELSEIF(LCMIP_STRATAER_CMIP7) THEN - WRITE(NULOUT,*) 'CCMIP_STRAT_FULL: ',TRIM(CCMIP_STRAT_FULL_CLIM) + ELSEIF (LCMIP_STRATAER_CMIP7) THEN - LLOPEN=.FALSE. + ! Check on climatology file + WRITE(NULOUT,*) 'CMIP7 CCMIP_STRAT_FULL_CLIM: ',TRIM(CCMIP_STRAT_FULL_CLIM) + LLOPENC=.FALSE. IOS= 0 INQUIRE(FILE=CCMIP_STRAT_FULL_CLIM,IOSTAT=IOS,EXIST=LLSTRATC,OPENED=LLOPENC) LLSTRATC = LLSTRATC .AND. (IOS == 0) .AND. .NOT.LLOPENC - + IF (.NOT.LLSTRATC) THEN WRITE(NULERR,'('' ERROR IN CMIP_STRATO_AERO.F90 :'',& - & '' THE CLIMATOLOGICAL FORCING FILE IS NOT AVAILABLE !'')') + & '' THE CMIP7 CLIMATOLOGICAL FORCING FILE IS NOT AVAILABLE !'')') CALL ABOR1('CMIP_STRATO_AERO') ENDIF + + WRITE(NULOUT,'(A,I4,A,I4,A,I4)') 'CMIP_STRATO_AERO [2]: GETTING FORCING FOR MONTH NB= ', FORC_MONTH, '/', STRATO_CMIP_NTIME, ', starting from the year ', STRATO_FIRSTYEAR + WRITE(NULOUT,*) 'CCMIP_STRAT_FULL: ',TRIM(CCMIP_STRAT_FULL) + IF (FORC_MONTH==1) THEN START=(/1, 1, 1, 1/) FINAL=(/STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,2/) FINAL_LW=(/STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,2/) - + ! Allocate temporary arrays ALLOCATE(AOD_SUN_ORIG (STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,2)) ALLOCATE(AAOD_SUN_ORIG(STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,2)) ALLOCATE(REFAOD_SUN_ORIG(STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,2)) ALLOCATE(AAOD_EARTH_ORIG(STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,2)) - + ! Initialise arrays: AOD_SUN_ORIG(:,:,:,:)=0._JPRB AAOD_SUN_ORIG(:,:,:,:)=0._JPRB REFAOD_SUN_ORIG(:,:,:,:)=0._JPRB AAOD_EARTH_ORIG(:,:,:,:)=0._JPRB - + ! OPEN NETCDF FILE CALL CHECK( NF90_OPEN(CCMIP_STRAT_FULL,NF90_NOWRITE,IUNIT) ) - + ! Reading latitudes needed for the interpolation. CALL CHECK( NF90_INQ_VARID(IUNIT, LAT_NAME, LAT_VARID) ) CALL CHECK( NF90_GET_VAR(IUNIT, LAT_VARID, STRATO_CMIP_LAT) ) - + ! READ 4-D FIELDS CALL CHECK( NF90_INQ_VARID(IUNIT, AOD_SUN_NAME, AOD_SUN_VARID) ) CALL CHECK( NF90_GET_VAR(IUNIT, AOD_SUN_VARID, AOD_SUN_ORIG, START, FINAL) ) - + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_SUN_NAME, AAOD_SUN_VARID) ) CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_SUN_VARID, AAOD_SUN_ORIG, START, FINAL) ) - + CALL CHECK( NF90_INQ_VARID(IUNIT, REFAOD_SUN_NAME, REFAOD_SUN_VARID) ) CALL CHECK( NF90_GET_VAR(IUNIT, REFAOD_SUN_VARID, REFAOD_SUN_ORIG, START, FINAL) ) - + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_EARTH_NAME, AAOD_EARTH_VARID) ) CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_EARTH_VARID, AAOD_EARTH_ORIG, START, FINAL_LW) ) - + ! CLOSE NETCDF FILE CALL CHECK( NF90_CLOSE(IUNIT) ) @@ -393,13 +400,13 @@ SUBROUTINE CMIP_STRATO_AERO(YDMODEL) ! SW parameters DO IB=1,STRATO_CMIP_NSB ! We keep three months to make a smoothed forcing (linear interpolation along the axis time) - + DO IMONTH=2,STRATO_CMIP_NMONTH - + AOD_SUN(ILEV,ILAT,IB,IMONTH)=AOD_SUN_ORIG(IB,ILAT,JLEV,IMONTH-1) AAOD_SUN(ILEV,ILAT,IB,IMONTH)=AAOD_SUN_ORIG(IB,ILAT,JLEV,IMONTH-1) REFAOD_SUN(ILEV,ILAT,IB,IMONTH)=REFAOD_SUN_ORIG(IB,ILAT,JLEV,IMONTH-1) - + ENDDO ENDDO ! LW parameter @@ -419,39 +426,39 @@ SUBROUTINE CMIP_STRATO_AERO(YDMODEL) START=(/1, 1, 1, 12/) FINAL=(/STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,12/) FINAL_LW=(/STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,12/) - + ! Allocate temporary arrays ALLOCATE(AOD_SUN_ORIG (STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,1)) ALLOCATE(AAOD_SUN_ORIG(STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,1)) ALLOCATE(REFAOD_SUN_ORIG(STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,1)) ALLOCATE(AAOD_EARTH_ORIG(STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,1)) - + ! Initialise arrays: AOD_SUN_ORIG(:,:,:,:)=0._JPRB AAOD_SUN_ORIG(:,:,:,:)=0._JPRB REFAOD_SUN_ORIG(:,:,:,:)=0._JPRB AAOD_EARTH_ORIG(:,:,:,:)=0._JPRB - + ! OPEN NETCDF FILE CALL CHECK( NF90_OPEN(CCMIP_STRAT_FULL_CLIM,NF90_NOWRITE,IUNIT) ) - + ! Reading latitudes needed for the interpolation. CALL CHECK( NF90_INQ_VARID(IUNIT, LAT_NAME, LAT_VARID) ) CALL CHECK( NF90_GET_VAR(IUNIT, LAT_VARID, STRATO_CMIP_LAT) ) - + ! READ 4-D FIELDS CALL CHECK( NF90_INQ_VARID(IUNIT, AOD_SUN_NAME, AOD_SUN_VARID) ) CALL CHECK( NF90_GET_VAR(IUNIT, AOD_SUN_VARID, AOD_SUN_ORIG, START, FINAL) ) - + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_SUN_NAME, AAOD_SUN_VARID) ) CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_SUN_VARID, AAOD_SUN_ORIG, START, FINAL) ) - + CALL CHECK( NF90_INQ_VARID(IUNIT, REFAOD_SUN_NAME, REFAOD_SUN_VARID) ) CALL CHECK( NF90_GET_VAR(IUNIT, REFAOD_SUN_VARID, REFAOD_SUN_ORIG, START, FINAL) ) - + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_EARTH_NAME, AAOD_EARTH_VARID) ) CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_EARTH_VARID, AAOD_EARTH_ORIG, START, FINAL_LW) ) - + ! CLOSE NETCDF FILE CALL CHECK( NF90_CLOSE(IUNIT) ) DO ILEV=1,STRATO_CMIP_NALT @@ -460,17 +467,17 @@ SUBROUTINE CMIP_STRATO_AERO(YDMODEL) ! SW parameters DO IB=1,STRATO_CMIP_NSB ! We keep three months to make a smoothed forcing (linear interpolation along the axis time) - - - + + + AOD_SUN(ILEV,ILAT,IB,1)=AOD_SUN_ORIG(IB,ILAT,JLEV,1) AAOD_SUN(ILEV,ILAT,IB,1)=AAOD_SUN_ORIG(IB,ILAT,JLEV,1) REFAOD_SUN(ILEV,ILAT,IB,1)=REFAOD_SUN_ORIG(IB,ILAT,JLEV,1) - + ENDDO ! LW parameter DO IB=1,STRATO_CMIP_NTB - + AAOD_EARTH(ILEV,ILAT,IB,1)=AAOD_EARTH_ORIG(IB,ILAT,JLEV,1) ENDDO ENDDO @@ -480,46 +487,44 @@ SUBROUTINE CMIP_STRATO_AERO(YDMODEL) DEALLOCATE(REFAOD_SUN_ORIG) DEALLOCATE(AAOD_EARTH_ORIG) - ENDIF - ENDIF !December 2023 - IF (FORC_MONTH==STRATO_CMIP_NTIME) THEN + ELSEIF (FORC_MONTH==STRATO_CMIP_NTIME) THEN START=(/1, 1, 1, STRATO_CMIP_NTIME-1/) FINAL=(/STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME/) FINAL_LW=(/STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME/) - + ! Allocate temporary arrays ALLOCATE(AOD_SUN_ORIG (STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,2)) ALLOCATE(AAOD_SUN_ORIG(STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,2)) ALLOCATE(REFAOD_SUN_ORIG(STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,2)) ALLOCATE(AAOD_EARTH_ORIG(STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,2)) - + ! Initialise arrays: AOD_SUN_ORIG(:,:,:,:)=0._JPRB AAOD_SUN_ORIG(:,:,:,:)=0._JPRB REFAOD_SUN_ORIG(:,:,:,:)=0._JPRB AAOD_EARTH_ORIG(:,:,:,:)=0._JPRB - + ! OPEN NETCDF FILE CALL CHECK( NF90_OPEN(CCMIP_STRAT_FULL,NF90_NOWRITE,IUNIT) ) - + ! Reading latitudes needed for the interpolation. CALL CHECK( NF90_INQ_VARID(IUNIT, LAT_NAME, LAT_VARID) ) CALL CHECK( NF90_GET_VAR(IUNIT, LAT_VARID, STRATO_CMIP_LAT) ) - + ! READ 4-D FIELDS CALL CHECK( NF90_INQ_VARID(IUNIT, AOD_SUN_NAME, AOD_SUN_VARID) ) CALL CHECK( NF90_GET_VAR(IUNIT, AOD_SUN_VARID, AOD_SUN_ORIG, START, FINAL) ) - + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_SUN_NAME, AAOD_SUN_VARID) ) CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_SUN_VARID, AAOD_SUN_ORIG, START, FINAL) ) - + CALL CHECK( NF90_INQ_VARID(IUNIT, REFAOD_SUN_NAME, REFAOD_SUN_VARID) ) CALL CHECK( NF90_GET_VAR(IUNIT, REFAOD_SUN_VARID, REFAOD_SUN_ORIG, START, FINAL) ) - + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_EARTH_NAME, AAOD_EARTH_VARID) ) CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_EARTH_VARID, AAOD_EARTH_ORIG, START, FINAL_LW) ) - + ! CLOSE NETCDF FILE CALL CHECK( NF90_CLOSE(IUNIT) ) @@ -529,13 +534,13 @@ SUBROUTINE CMIP_STRATO_AERO(YDMODEL) ! SW parameters DO IB=1,STRATO_CMIP_NSB ! We keep three months to make a smoothed forcing (linear interpolation along the axis time) - + DO IMONTH=1,STRATO_CMIP_NMONTH-1 - + AOD_SUN(ILEV,ILAT,IB,IMONTH)=AOD_SUN_ORIG(IB,ILAT,JLEV,IMONTH) AAOD_SUN(ILEV,ILAT,IB,IMONTH)=AAOD_SUN_ORIG(IB,ILAT,JLEV,IMONTH) REFAOD_SUN(ILEV,ILAT,IB,IMONTH)=REFAOD_SUN_ORIG(IB,ILAT,JLEV,IMONTH) - + ENDDO ENDDO ! LW parameter @@ -555,39 +560,39 @@ SUBROUTINE CMIP_STRATO_AERO(YDMODEL) START=(/1, 1, 1, 1/) FINAL=(/STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,1/) FINAL_LW=(/STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,1/) - + ! Allocate temporary arrays ALLOCATE(AOD_SUN_ORIG (STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,1)) ALLOCATE(AAOD_SUN_ORIG(STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,1)) ALLOCATE(REFAOD_SUN_ORIG(STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,1)) ALLOCATE(AAOD_EARTH_ORIG(STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,1)) - + ! Initialise arrays: AOD_SUN_ORIG(:,:,:,:)=0._JPRB AAOD_SUN_ORIG(:,:,:,:)=0._JPRB REFAOD_SUN_ORIG(:,:,:,:)=0._JPRB AAOD_EARTH_ORIG(:,:,:,:)=0._JPRB - + ! OPEN NETCDF FILE CALL CHECK( NF90_OPEN(CCMIP_STRAT_FULL_CLIM,NF90_NOWRITE,IUNIT) ) - + ! Reading latitudes needed for the interpolation. CALL CHECK( NF90_INQ_VARID(IUNIT, LAT_NAME, LAT_VARID) ) CALL CHECK( NF90_GET_VAR(IUNIT, LAT_VARID, STRATO_CMIP_LAT) ) - + ! READ 4-D FIELDS CALL CHECK( NF90_INQ_VARID(IUNIT, AOD_SUN_NAME, AOD_SUN_VARID) ) CALL CHECK( NF90_GET_VAR(IUNIT, AOD_SUN_VARID, AOD_SUN_ORIG, START, FINAL) ) - + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_SUN_NAME, AAOD_SUN_VARID) ) CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_SUN_VARID, AAOD_SUN_ORIG, START, FINAL) ) - + CALL CHECK( NF90_INQ_VARID(IUNIT, REFAOD_SUN_NAME, REFAOD_SUN_VARID) ) CALL CHECK( NF90_GET_VAR(IUNIT, REFAOD_SUN_VARID, REFAOD_SUN_ORIG, START, FINAL) ) - + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_EARTH_NAME, AAOD_EARTH_VARID) ) CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_EARTH_VARID, AAOD_EARTH_ORIG, START, FINAL_LW) ) - + ! CLOSE NETCDF FILE CALL CHECK( NF90_CLOSE(IUNIT) ) DO ILEV=1,STRATO_CMIP_NALT @@ -596,17 +601,17 @@ SUBROUTINE CMIP_STRATO_AERO(YDMODEL) ! SW parameters DO IB=1,STRATO_CMIP_NSB ! We keep three months to make a smoothed forcing (linear interpolation along the axis time) - - - + + + AOD_SUN(ILEV,ILAT,IB,STRATO_CMIP_NMONTH)=AOD_SUN_ORIG(IB,ILAT,JLEV,1) AAOD_SUN(ILEV,ILAT,IB,STRATO_CMIP_NMONTH)=AAOD_SUN_ORIG(IB,ILAT,JLEV,1) REFAOD_SUN(ILEV,ILAT,IB,STRATO_CMIP_NMONTH)=REFAOD_SUN_ORIG(IB,ILAT,JLEV,1) - + ENDDO ! LW parameter DO IB=1,STRATO_CMIP_NTB - + AAOD_EARTH(ILEV,ILAT,IB,STRATO_CMIP_NMONTH)=AAOD_EARTH_ORIG(IB,ILAT,JLEV,1) ENDDO ENDDO @@ -616,248 +621,246 @@ SUBROUTINE CMIP_STRATO_AERO(YDMODEL) DEALLOCATE(REFAOD_SUN_ORIG) DEALLOCATE(AAOD_EARTH_ORIG) + ENDIF ! 1st or last month of CMIP7 + ENDIF ! CMIP6 or CMIP7 - ENDIF + ELSE ! PURE CLIMATOLOGY CASES (IMODYR<1850/1750 .OR. IMODYR>2014/2023 .OR. LCMIP_STRATAER_BCKGD) + + CMIP: IF(LCMIP_STRATAER_CMIP6) THEN + + IF (MINVAL(AOD_SUN_MEAN)==CHECK_SUN_MEAN .OR. MINVAL(AAOD_SUN_MEAN)==CHECK_SUN_MEAN & + & .OR. MINVAL(REFAOD_SUN_MEAN)==CHECK_SUN_MEAN .OR. MINVAL(AAOD_EARTH_MEAN)==CHECK_EARTH_MEAN) THEN + + WRITE(NULOUT,*)'CMIP_STRATO_AERO [2] computing CMIP6 climatological stratospheric forcing' + START=(/1, 1, 1, 1/) + FINAL=(/STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME/) + FINAL_LW=(/STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME/) + ! Allocate temporary arrays + ALLOCATE(AOD_SUN_ORIG (STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME)) + ALLOCATE(AAOD_SUN_ORIG(STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME)) + ALLOCATE(REFAOD_SUN_ORIG(STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME)) + ALLOCATE(AAOD_EARTH_ORIG(STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME)) + + ! Initialise arrays: + AOD_SUN_ORIG(:,:,:,:)=0._JPRB + AAOD_SUN_ORIG(:,:,:,:)=0._JPRB + REFAOD_SUN_ORIG(:,:,:,:)=0._JPRB + AAOD_EARTH_ORIG(:,:,:,:)=0._JPRB + ! OPEN NETCDF FILE + CALL CHECK( NF90_OPEN(CCMIP_STRAT_FULL,NF90_NOWRITE,IUNIT) ) + ! Reading latitudes needed for the interpolation. + CALL CHECK( NF90_INQ_VARID(IUNIT, LAT_NAME, LAT_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, LAT_VARID, STRATO_CMIP_LAT) ) - ENDIF !First month of 1750/1850 and last month of 2014/2023 - ELSE !(IMODYR<1850/1750 .OR. IMODYR>2014/2023 .OR. LCMIP_STRATAER_BCKGD) - IF(LCMIP_STRATAER_CMIP6) THEN - IF (MINVAL(AOD_SUN_MEAN)==CHECK_SUN_MEAN .OR. MINVAL(AAOD_SUN_MEAN)==CHECK_SUN_MEAN & - & .OR. MINVAL(REFAOD_SUN_MEAN)==CHECK_SUN_MEAN .OR. MINVAL(AAOD_EARTH_MEAN)==CHECK_EARTH_MEAN) THEN - - WRITE(NULOUT,*)'CMIP_STRATO_AERO; computing climatological stratospherical forcing' + ! READ 4-D FIELDS + CALL CHECK( NF90_INQ_VARID(IUNIT, AOD_SUN_NAME, AOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AOD_SUN_VARID, AOD_SUN_ORIG, START, FINAL ) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_SUN_NAME, AAOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_SUN_VARID, AAOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, REFAOD_SUN_NAME, REFAOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, REFAOD_SUN_VARID, REFAOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_EARTH_NAME, AAOD_EARTH_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_EARTH_VARID, AAOD_EARTH_ORIG, START, FINAL_LW) ) + + ! CLOSE NETCDF FILE + CALL CHECK( NF90_CLOSE(IUNIT) ) + + ! Climatology computed on-line, only once + DO ILEV=1,STRATO_CMIP_NALT + JLEV=STRATO_CMIP_NALT-ILEV+1 + DO ILAT=1,STRATO_CMIP_NLAT + ! SW parameters + DO IB=1,STRATO_CMIP_NSB + AOD_SUN_MEAN(JLEV,ILAT,IB)=SUM(AOD_SUN_ORIG(IB,ILAT,ILEV,:))/STRATO_CMIP_NTIME + AAOD_SUN_MEAN(JLEV,ILAT,IB)=SUM(AAOD_SUN_ORIG(IB,ILAT,ILEV,:))/STRATO_CMIP_NTIME + REFAOD_SUN_MEAN(JLEV,ILAT,IB)=SUM(REFAOD_SUN_ORIG(IB,ILAT,ILEV,:))/STRATO_CMIP_NTIME + ENDDO + ! LW parameters + DO IB=1,STRATO_CMIP_NTB + AAOD_EARTH_MEAN(JLEV,ILAT,IB)=SUM(AAOD_EARTH_ORIG(IB,ILAT,ILEV,:))/STRATO_CMIP_NTIME + ENDDO + ENDDO + ENDDO + + DEALLOCATE(AOD_SUN_ORIG ) + DEALLOCATE(AAOD_SUN_ORIG ) + DEALLOCATE(REFAOD_SUN_ORIG) + DEALLOCATE(AAOD_EARTH_ORIG) + + ENDIF + + WRITE(NULOUT,*)'CMIP_STRATO_AERO: using CMIP6 climatological stratospheric forcing' + DO IMONTH=1,STRATO_CMIP_NMONTH + ! SW parameters + AOD_SUN(:,:,:,IMONTH)=AOD_SUN_MEAN(:,:,:) + AAOD_SUN(:,:,:,IMONTH)=AAOD_SUN_MEAN(:,:,:) + REFAOD_SUN(:,:,:,IMONTH)=REFAOD_SUN_MEAN(:,:,:) + ! LW parameters + AAOD_EARTH(:,:,:,IMONTH)=AAOD_EARTH_MEAN(:,:,:) + ENDDO + + ELSEIF (LCMIP_STRATAER_CMIP7) THEN + WRITE(NULOUT,*) 'CMIP_STRATO_AERO: Reading CMIP7 climatological stratospheric forcing (3 months)' + WRITE(NULOUT,FMT='('' CMIP7 CCMIP_STRAT_FULL_CLIM = '',A)') TRIM(CCMIP_STRAT_FULL_CLIM) + LLOPENC=.FALSE. + IOS= 0 + INQUIRE(FILE=CCMIP_STRAT_FULL_CLIM,IOSTAT=IOS,EXIST=LLSTRATC,OPENED=LLOPENC) + LLSTRATC = LLSTRATC .AND. (IOS == 0) .AND. .NOT.LLOPENC + + IF (.NOT.LLSTRATC) THEN + WRITE(NULERR,'('' ERROR IN CMIP_STRATO_AERO.F90 :'',& + & '' THE CMIP7 CLIMATOLOGICAL FORCING FILE IS NOT AVAILABLE OR ALREADY OPENED !'')') + CALL ABOR1('CMIP_STRATO_AERO') + ENDIF + + !Climatological file for CMIP7 - All months are readed START=(/1, 1, 1, 1/) - FINAL=(/STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME/) - FINAL_LW=(/STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME/) - + FINAL=(/STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,12/) + FINAL_LW=(/STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,12/) + ! Allocate temporary arrays - ALLOCATE(AOD_SUN_ORIG (STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME)) - ALLOCATE(AAOD_SUN_ORIG(STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME)) - ALLOCATE(REFAOD_SUN_ORIG(STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME)) - ALLOCATE(AAOD_EARTH_ORIG(STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME)) + ALLOCATE(AOD_SUN_ORIG (STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,12)) + ALLOCATE(AAOD_SUN_ORIG (STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,12)) + ALLOCATE(REFAOD_SUN_ORIG(STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,12)) + ALLOCATE(AAOD_EARTH_ORIG(STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,12)) ! Initialise arrays: AOD_SUN_ORIG(:,:,:,:)=0._JPRB AAOD_SUN_ORIG(:,:,:,:)=0._JPRB REFAOD_SUN_ORIG(:,:,:,:)=0._JPRB AAOD_EARTH_ORIG(:,:,:,:)=0._JPRB - + ! OPEN NETCDF FILE - CALL CHECK( NF90_OPEN(CCMIP_STRAT_FULL,NF90_NOWRITE,IUNIT) ) - + CALL CHECK( NF90_OPEN(CCMIP_STRAT_FULL_CLIM,NF90_NOWRITE,IUNIT) ) + ! Reading latitudes needed for the interpolation. CALL CHECK( NF90_INQ_VARID(IUNIT, LAT_NAME, LAT_VARID) ) CALL CHECK( NF90_GET_VAR(IUNIT, LAT_VARID, STRATO_CMIP_LAT) ) - + ! READ 4-D FIELDS CALL CHECK( NF90_INQ_VARID(IUNIT, AOD_SUN_NAME, AOD_SUN_VARID) ) - CALL CHECK( NF90_GET_VAR(IUNIT, AOD_SUN_VARID, AOD_SUN_ORIG, START, FINAL ) ) - + CALL CHECK( NF90_GET_VAR(IUNIT, AOD_SUN_VARID, AOD_SUN_ORIG, START, FINAL) ) + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_SUN_NAME, AAOD_SUN_VARID) ) CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_SUN_VARID, AAOD_SUN_ORIG, START, FINAL) ) - + CALL CHECK( NF90_INQ_VARID(IUNIT, REFAOD_SUN_NAME, REFAOD_SUN_VARID) ) CALL CHECK( NF90_GET_VAR(IUNIT, REFAOD_SUN_VARID, REFAOD_SUN_ORIG, START, FINAL) ) - + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_EARTH_NAME, AAOD_EARTH_VARID) ) CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_EARTH_VARID, AAOD_EARTH_ORIG, START, FINAL_LW) ) - + ! CLOSE NETCDF FILE CALL CHECK( NF90_CLOSE(IUNIT) ) - - ! Climatology computed on-line, only one time. - DO ILEV=1,STRATO_CMIP_NALT - JLEV=STRATO_CMIP_NALT-ILEV+1 - DO ILAT=1,STRATO_CMIP_NLAT - ! SW parameters - DO IB=1,STRATO_CMIP_NSB - AOD_SUN_MEAN(JLEV,ILAT,IB)=SUM(AOD_SUN_ORIG(IB,ILAT,ILEV,:))/STRATO_CMIP_NTIME - AAOD_SUN_MEAN(JLEV,ILAT,IB)=SUM(AAOD_SUN_ORIG(IB,ILAT,ILEV,:))/STRATO_CMIP_NTIME - REFAOD_SUN_MEAN(JLEV,ILAT,IB)=SUM(REFAOD_SUN_ORIG(IB,ILAT,ILEV,:))/STRATO_CMIP_NTIME - ENDDO - ! LW parameters - DO IB=1,STRATO_CMIP_NTB - AAOD_EARTH_MEAN(JLEV,ILAT,IB)=SUM(AAOD_EARTH_ORIG(IB,ILAT,ILEV,:))/STRATO_CMIP_NTIME - ENDDO - ENDDO - ENDDO - - DEALLOCATE(AOD_SUN_ORIG ) - DEALLOCATE(AAOD_SUN_ORIG ) - DEALLOCATE(REFAOD_SUN_ORIG) - DEALLOCATE(AAOD_EARTH_ORIG) - - ENDIF - - WRITE(NULOUT,*)'CMIP_STRATO_AERO; using climatological stratospherical forcing' - DO IMONTH=1,STRATO_CMIP_NMONTH - ! SW parameters - AOD_SUN(:,:,:,IMONTH)=AOD_SUN_MEAN(:,:,:) - AAOD_SUN(:,:,:,IMONTH)=AAOD_SUN_MEAN(:,:,:) - REFAOD_SUN(:,:,:,IMONTH)=REFAOD_SUN_MEAN(:,:,:) - ! LW parameters - AAOD_EARTH(:,:,:,IMONTH)=AAOD_EARTH_MEAN(:,:,:) - ENDDO - ENDIF - IF(LCMIP_STRATAER_CMIP7) THEN + ! Fill the data for the current month and reorder the arrays + IF (IMON==1)THEN + DO ILEV=1,STRATO_CMIP_NALT + JLEV=STRATO_CMIP_NALT-ILEV+1 + DO ILAT=1,STRATO_CMIP_NLAT + ! SW parameters + DO IB=1,STRATO_CMIP_NSB + ! We keep three months to make a smoothed forcing (linear interpolation along the axis time) + AOD_SUN(ILEV,ILAT,IB,1)=AOD_SUN_ORIG(IB,ILAT,JLEV,12) + AAOD_SUN(ILEV,ILAT,IB,1)=AAOD_SUN_ORIG(IB,ILAT,JLEV,12) + REFAOD_SUN(ILEV,ILAT,IB,1)=REFAOD_SUN_ORIG(IB,ILAT,JLEV,12) + DO IMONTH=2,STRATO_CMIP_NMONTH - LLOPEN=.FALSE. - IOS= 0 - INQUIRE(FILE=CCMIP_STRAT_FULL_CLIM,IOSTAT=IOS,EXIST=LLSTRATC,OPENED=LLOPENC) - LLSTRATC = LLSTRATC .AND. (IOS == 0) .AND. .NOT.LLOPENC - - IF (.NOT.LLSTRATC) THEN - WRITE(NULERR,'('' ERROR IN CMIP_STRATO_AERO.F90 :'',& - & '' THE CLIMATOLOGICAL FORCING FILE IS NOT AVAILABLE !'')') - CALL ABOR1('CMIP_STRATO_AERO') - ENDIF - - !Climatological file for CMIP7 - All months are readed - START=(/1, 1, 1, 1/) - FINAL=(/STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,12/) - FINAL_LW=(/STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,12/) - - ! Allocate temporary arrays - ALLOCATE(AOD_SUN_ORIG (STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,12)) - ALLOCATE(AAOD_SUN_ORIG (STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,12)) - ALLOCATE(REFAOD_SUN_ORIG(STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,12)) - ALLOCATE(AAOD_EARTH_ORIG(STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,12)) + AOD_SUN(ILEV,ILAT,IB,IMONTH)=AOD_SUN_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) + AAOD_SUN(ILEV,ILAT,IB,IMONTH)=AAOD_SUN_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) + REFAOD_SUN(ILEV,ILAT,IB,IMONTH)=REFAOD_SUN_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) - ! Initialise arrays: - AOD_SUN_ORIG(:,:,:,:)=0._JPRB - AAOD_SUN_ORIG(:,:,:,:)=0._JPRB - REFAOD_SUN_ORIG(:,:,:,:)=0._JPRB - AAOD_EARTH_ORIG(:,:,:,:)=0._JPRB - - ! OPEN NETCDF FILE - CALL CHECK( NF90_OPEN(CCMIP_STRAT_FULL_CLIM,NF90_NOWRITE,IUNIT) ) - - ! Reading latitudes needed for the interpolation. - CALL CHECK( NF90_INQ_VARID(IUNIT, LAT_NAME, LAT_VARID) ) - CALL CHECK( NF90_GET_VAR(IUNIT, LAT_VARID, STRATO_CMIP_LAT) ) - - ! READ 4-D FIELDS - CALL CHECK( NF90_INQ_VARID(IUNIT, AOD_SUN_NAME, AOD_SUN_VARID) ) - CALL CHECK( NF90_GET_VAR(IUNIT, AOD_SUN_VARID, AOD_SUN_ORIG, START, FINAL) ) - - CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_SUN_NAME, AAOD_SUN_VARID) ) - CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_SUN_VARID, AAOD_SUN_ORIG, START, FINAL) ) - - CALL CHECK( NF90_INQ_VARID(IUNIT, REFAOD_SUN_NAME, REFAOD_SUN_VARID) ) - CALL CHECK( NF90_GET_VAR(IUNIT, REFAOD_SUN_VARID, REFAOD_SUN_ORIG, START, FINAL) ) - - CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_EARTH_NAME, AAOD_EARTH_VARID) ) - CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_EARTH_VARID, AAOD_EARTH_ORIG, START, FINAL_LW) ) - - ! CLOSE NETCDF FILE - CALL CHECK( NF90_CLOSE(IUNIT) ) - - ! Fill the data for the current month and reorder the arrays - IF (IMON==1)THEN - DO ILEV=1,STRATO_CMIP_NALT - JLEV=STRATO_CMIP_NALT-ILEV+1 - DO ILAT=1,STRATO_CMIP_NLAT - ! SW parameters - DO IB=1,STRATO_CMIP_NSB - ! We keep three months to make a smoothed forcing (linear interpolation along the axis time) - AOD_SUN(ILEV,ILAT,IB,1)=AOD_SUN_ORIG(IB,ILAT,JLEV,12) - AAOD_SUN(ILEV,ILAT,IB,1)=AAOD_SUN_ORIG(IB,ILAT,JLEV,12) - REFAOD_SUN(ILEV,ILAT,IB,1)=REFAOD_SUN_ORIG(IB,ILAT,JLEV,12) - DO IMONTH=2,STRATO_CMIP_NMONTH - - AOD_SUN(ILEV,ILAT,IB,IMONTH)=AOD_SUN_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) - AAOD_SUN(ILEV,ILAT,IB,IMONTH)=AAOD_SUN_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) - REFAOD_SUN(ILEV,ILAT,IB,IMONTH)=REFAOD_SUN_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) - + ENDDO ENDDO - ENDDO - ! LW parameter - DO IB=1,STRATO_CMIP_NTB - AAOD_EARTH(ILEV,ILAT,IB,1)=AAOD_EARTH_ORIG(IB,ILAT,JLEV,12) - DO IMONTH=2,STRATO_CMIP_NMONTH - AAOD_EARTH(ILEV,ILAT,IB,IMONTH)=AAOD_EARTH_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) + ! LW parameter + DO IB=1,STRATO_CMIP_NTB + AAOD_EARTH(ILEV,ILAT,IB,1)=AAOD_EARTH_ORIG(IB,ILAT,JLEV,12) + DO IMONTH=2,STRATO_CMIP_NMONTH + AAOD_EARTH(ILEV,ILAT,IB,IMONTH)=AAOD_EARTH_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) + ENDDO ENDDO ENDDO ENDDO - ENDDO - ELSEIF(IMON==12) THEN - DO ILEV=1,STRATO_CMIP_NALT - JLEV=STRATO_CMIP_NALT-ILEV+1 - DO ILAT=1,STRATO_CMIP_NLAT - ! SW parameters - DO IB=1,STRATO_CMIP_NSB - ! We keep three months to make a smoothed forcing (linear interpolation along the axis time) + ELSEIF(IMON==12) THEN + DO ILEV=1,STRATO_CMIP_NALT + JLEV=STRATO_CMIP_NALT-ILEV+1 + DO ILAT=1,STRATO_CMIP_NLAT + ! SW parameters + DO IB=1,STRATO_CMIP_NSB + ! We keep three months to make a smoothed forcing (linear interpolation along the axis time) - DO IMONTH=1,STRATO_CMIP_NMONTH-1 - - AOD_SUN(ILEV,ILAT,IB,IMONTH)=AOD_SUN_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) - AAOD_SUN(ILEV,ILAT,IB,IMONTH)=AAOD_SUN_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) - REFAOD_SUN(ILEV,ILAT,IB,IMONTH)=REFAOD_SUN_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) - + DO IMONTH=1,STRATO_CMIP_NMONTH-1 + + AOD_SUN(ILEV,ILAT,IB,IMONTH)=AOD_SUN_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) + AAOD_SUN(ILEV,ILAT,IB,IMONTH)=AAOD_SUN_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) + REFAOD_SUN(ILEV,ILAT,IB,IMONTH)=REFAOD_SUN_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) + + ENDDO + AOD_SUN(ILEV,ILAT,IB,STRATO_CMIP_NMONTH)=AOD_SUN_ORIG(IB,ILAT,JLEV,1) + AAOD_SUN(ILEV,ILAT,IB,STRATO_CMIP_NMONTH)=AAOD_SUN_ORIG(IB,ILAT,JLEV,1) + REFAOD_SUN(ILEV,ILAT,IB,STRATO_CMIP_NMONTH)=REFAOD_SUN_ORIG(IB,ILAT,JLEV,1) ENDDO - AOD_SUN(ILEV,ILAT,IB,STRATO_CMIP_NMONTH)=AOD_SUN_ORIG(IB,ILAT,JLEV,1) - AAOD_SUN(ILEV,ILAT,IB,STRATO_CMIP_NMONTH)=AAOD_SUN_ORIG(IB,ILAT,JLEV,1) - REFAOD_SUN(ILEV,ILAT,IB,STRATO_CMIP_NMONTH)=REFAOD_SUN_ORIG(IB,ILAT,JLEV,1) - ENDDO - ! LW parameter - DO IB=1,STRATO_CMIP_NTB + ! LW parameter + DO IB=1,STRATO_CMIP_NTB - DO IMONTH=1,STRATO_CMIP_NMONTH-1 - AAOD_EARTH(ILEV,ILAT,IB,IMONTH)=AAOD_EARTH_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) + DO IMONTH=1,STRATO_CMIP_NMONTH-1 + AAOD_EARTH(ILEV,ILAT,IB,IMONTH)=AAOD_EARTH_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) + ENDDO + AAOD_EARTH(ILEV,ILAT,IB,STRATO_CMIP_NMONTH)=AAOD_EARTH_ORIG(IB,ILAT,JLEV,1) ENDDO - AAOD_EARTH(ILEV,ILAT,IB,STRATO_CMIP_NMONTH)=AAOD_EARTH_ORIG(IB,ILAT,JLEV,1) ENDDO ENDDO - ENDDO - ELSE - DO ILEV=1,STRATO_CMIP_NALT - JLEV=STRATO_CMIP_NALT-ILEV+1 - DO ILAT=1,STRATO_CMIP_NLAT - ! SW parameters - DO IB=1,STRATO_CMIP_NSB - ! We keep three months to make a smoothed forcing (linear interpolation along the axis time) - DO IMONTH=1,STRATO_CMIP_NMONTH + ELSE + DO ILEV=1,STRATO_CMIP_NALT + JLEV=STRATO_CMIP_NALT-ILEV+1 + DO ILAT=1,STRATO_CMIP_NLAT + ! SW parameters + DO IB=1,STRATO_CMIP_NSB + ! We keep three months to make a smoothed forcing (linear interpolation along the axis time) + DO IMONTH=1,STRATO_CMIP_NMONTH - AOD_SUN(ILEV,ILAT,IB,IMONTH)=AOD_SUN_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) - AAOD_SUN(ILEV,ILAT,IB,IMONTH)=AAOD_SUN_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) - REFAOD_SUN(ILEV,ILAT,IB,IMONTH)=REFAOD_SUN_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) + AOD_SUN(ILEV,ILAT,IB,IMONTH)=AOD_SUN_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) + AAOD_SUN(ILEV,ILAT,IB,IMONTH)=AAOD_SUN_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) + REFAOD_SUN(ILEV,ILAT,IB,IMONTH)=REFAOD_SUN_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) + ENDDO + ENDDO + ! LW parameter + DO IB=1,STRATO_CMIP_NTB + DO IMONTH=1,STRATO_CMIP_NMONTH + AAOD_EARTH(ILEV,ILAT,IB,IMONTH)=AAOD_EARTH_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) + ENDDO + ENDDO ENDDO ENDDO - ! LW parameter - DO IB=1,STRATO_CMIP_NTB - DO IMONTH=1,STRATO_CMIP_NMONTH - AAOD_EARTH(ILEV,ILAT,IB,IMONTH)=AAOD_EARTH_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) - ENDDO - ENDDO - ENDDO - ENDDO - ENDIF !IMON - DEALLOCATE(AOD_SUN_ORIG ) - DEALLOCATE(AAOD_SUN_ORIG ) - DEALLOCATE(REFAOD_SUN_ORIG) - DEALLOCATE(AAOD_EARTH_ORIG) - ENDIF !(IMODYR>=1850 .AND. IMODYR<=2014 .AND. .NOT. LCMIP_STRATAER_BCKGD) - - ENDIF ! (MYPROC==RPRC) + ENDIF !IMON + DEALLOCATE(AOD_SUN_ORIG ) + DEALLOCATE(AAOD_SUN_ORIG ) + DEALLOCATE(REFAOD_SUN_ORIG) + DEALLOCATE(AAOD_EARTH_ORIG) + ENDIF CMIP + ENDIF AVAIL + ENDIF ROOT CALL BROADCAST_AER_CMIP_PROP(YDMODEL) LSTRATAERO_UPDATED = .TRUE. -ELSE ! (IMON/=IMONOLD) +ELSE - WRITE(NULOUT,*)'Same month in CMIP_STRATO_AERO -> nothing to update ' + !DBG WRITE(NULOUT,*)'Same month in CMIP_STRATO_AERO -> nothing to update ' LSTRATAERO_UPDATED = .FALSE. -ENDIF +ENDIF NEWMONTH END ASSOCIATE END ASSOCIATE diff --git a/ifs-source/arpifs/phys_ec/cmip_strato_aero_process.F90 b/ifs-source/arpifs/phys_ec/cmip_strato_aero_process.F90 index 5c8fb57d..cec2930b 100755 --- a/ifs-source/arpifs/phys_ec/cmip_strato_aero_process.F90 +++ b/ifs-source/arpifs/phys_ec/cmip_strato_aero_process.F90 @@ -112,10 +112,10 @@ SUBROUTINE CMIP_STRATO_AERO_PROCESS & STRATO_CMIP_ALT=>YDAERSTRAT%STRATO_CMIP_ALT& ) -STRATAOD(:,:,:)=0.0_JPRB -STRATAAOD(:,:,:)=0.0_JPRB -STRATREFAOD(:,:,:)=0.0_JPRB -STRATAAOD_LW(:,:,:)=0.0_JPRB +STRATAOD (KIDIA:KFDIA,:,:) = 0.0_JPRB +STRATAAOD (KIDIA:KFDIA,:,:) = 0.0_JPRB +STRATREFAOD (KIDIA:KFDIA,:,:) = 0.0_JPRB +STRATAAOD_LW(KIDIA:KFDIA,:,:) = 0.0_JPRB ! Time interpolation ! Assume monthly means valid at 0Z on the 16th of each month @@ -184,14 +184,10 @@ SUBROUTINE CMIP_STRATO_AERO_PROCESS & ! exponential decay if NVOLCSTOP different from 99999999) ! --ALaakso: no exponential decay, RVOLCDEC is set to 1 RVOLCDEC=1 -STRATAOD(:,:,:)=RVOLCDEC*(ZW1*STRATAOD_M(:,:,:,IMP1)+ZW2*STRATAOD_M(:,:,:,IMP2)) -STRATAAOD(:,:,:)=RVOLCDEC*(ZW1*STRATAAOD_M(:,:,:,IMP1)+ZW2*STRATAAOD_M(:,:,:,IMP2)) -STRATREFAOD(:,:,:)=RVOLCDEC*(ZW1*STRATREFAOD_M(:,:,:,IMP1)+ZW2*STRATREFAOD_M(:,:,:,IMP2)) -STRATAAOD_LW(:,:,:)=RVOLCDEC*(ZW1*STRATAAOD_LW_M(:,:,:,IMP1)+ZW2*STRATAAOD_LW_M(:,:,:,IMP2)) -!STRATAOD(:,:,:)=(ZW1*STRATAOD_M(:,:,:,IMP1)+ZW2*STRATAOD_M(:,:,:,IMP2)) -!STRATAAOD(:,:,:)=(ZW1*STRATAAOD_M(:,:,:,IMP1)+ZW2*STRATAAOD_M(:,:,:,IMP2)) -!STRATREFAOD(:,:,:)=(ZW1*STRATREFAOD_M(:,:,:,IMP1)+ZW2*STRATREFAOD_M(:,:,:,IMP2)) -!STRATAAOD_LW(:,:,:)=(ZW1*STRATAAOD_LW_M(:,:,:,IMP1)+ZW2*STRATAAOD_LW_M(:,:,:,IMP2)) +STRATAOD (KIDIA:KFDIA,:,:) = RVOLCDEC*(ZW1*STRATAOD_M (KIDIA:KFDIA,:,:,IMP1) + ZW2*STRATAOD_M (KIDIA:KFDIA,:,:,IMP2)) +STRATAAOD (KIDIA:KFDIA,:,:) = RVOLCDEC*(ZW1*STRATAAOD_M (KIDIA:KFDIA,:,:,IMP1) + ZW2*STRATAAOD_M (KIDIA:KFDIA,:,:,IMP2)) +STRATREFAOD (KIDIA:KFDIA,:,:) = RVOLCDEC*(ZW1*STRATREFAOD_M (KIDIA:KFDIA,:,:,IMP1) + ZW2*STRATREFAOD_M (KIDIA:KFDIA,:,:,IMP2)) +STRATAAOD_LW(KIDIA:KFDIA,:,:) = RVOLCDEC*(ZW1*STRATAAOD_LW_M(KIDIA:KFDIA,:,:,IMP1) + ZW2*STRATAAOD_LW_M(KIDIA:KFDIA,:,:,IMP2)) ! Computing the tropopause height DO JL=KIDIA,KFDIA diff --git a/ifs-source/arpifs/phys_radi/radiation_scheme.F90 b/ifs-source/arpifs/phys_radi/radiation_scheme.F90 index dbdcb8fc..2eb77b99 100644 --- a/ifs-source/arpifs/phys_radi/radiation_scheme.F90 +++ b/ifs-source/arpifs/phys_radi/radiation_scheme.F90 @@ -94,7 +94,7 @@ SUBROUTINE RADIATION_SCHEME & USE RADIATION_SAVE, ONLY : SAVE_INPUTS, SAVE_FLUXES ! CMIP6/7 straotspheric aerosols -USE YOEAEROP, ONLY: STRATO_CMIP_NMONTH, STRATO_CMIP_NTB +USE YOEAEROP, ONLY: STRATO_CMIP_NMONTH, STRATO_CMIP_NTB, STRATO_CMIP_NSB IMPLICIT NONE @@ -278,14 +278,14 @@ SUBROUTINE RADIATION_SCHEME & REAL(KIND=JPHOOK) :: ZHOOK_HANDLE ! CMIP6/7 stratospheric aerosols - ALaakso -REAL(KIND=JPRB) :: ZAODSTRAT_M(KLON,KLEV,YDMODEL%YRML_PHY_RAD%YRERAD%NSW,STRATO_CMIP_NMONTH) -REAL(KIND=JPRB) :: ZAAODSTRAT_M(KLON,KLEV,YDMODEL%YRML_PHY_RAD%YRERAD%NSW,STRATO_CMIP_NMONTH) -REAL(KIND=JPRB) :: ZREFAODSTRAT_M(KLON,KLEV,YDMODEL%YRML_PHY_RAD%YRERAD%NSW,STRATO_CMIP_NMONTH) -REAL(KIND=JPRB) :: ZAAODSTRAT_LW_M(KLON,KLEV,STRATO_CMIP_NTB,STRATO_CMIP_NMONTH) -REAL(KIND=JPRB) :: ZAODSTRAT(KLON,KLEV,YDMODEL%YRML_PHY_RAD%YRERAD%NSW) -REAL(KIND=JPRB) :: ZAAODSTRAT(KLON,KLEV,YDMODEL%YRML_PHY_RAD%YRERAD%NSW) -REAL(KIND=JPRB) :: ZREFAODSTRAT(KLON,KLEV,YDMODEL%YRML_PHY_RAD%YRERAD%NSW) -REAL(KIND=JPRB) :: ZAAODSTRAT_LW(KLON,KLEV,STRATO_CMIP_NTB) +REAL(KIND=JPRB) :: ZAODSTRAT_M (KLON,KLEV, STRATO_CMIP_NSB, STRATO_CMIP_NMONTH) +REAL(KIND=JPRB) :: ZAAODSTRAT_M (KLON,KLEV, STRATO_CMIP_NSB, STRATO_CMIP_NMONTH) +REAL(KIND=JPRB) :: ZREFAODSTRAT_M (KLON,KLEV, STRATO_CMIP_NSB, STRATO_CMIP_NMONTH) +REAL(KIND=JPRB) :: ZAAODSTRAT_LW_M(KLON,KLEV, STRATO_CMIP_NTB, STRATO_CMIP_NMONTH) +REAL(KIND=JPRB) :: ZAODSTRAT (KLON,KLEV, STRATO_CMIP_NSB) +REAL(KIND=JPRB) :: ZAAODSTRAT (KLON,KLEV, STRATO_CMIP_NSB) +REAL(KIND=JPRB) :: ZREFAODSTRAT (KLON,KLEV, STRATO_CMIP_NSB) +REAL(KIND=JPRB) :: ZAAODSTRAT_LW (KLON,KLEV, STRATO_CMIP_NTB) INTEGER(KIND=JPIM) :: KTROPPAUSE(KLON) ! Import time functions for iseed calculation diff --git a/ifs-source/arpifs/phys_radi/suecrad.F90 b/ifs-source/arpifs/phys_radi/suecrad.F90 index 8b5a14e2..588288c0 100644 --- a/ifs-source/arpifs/phys_radi/suecrad.F90 +++ b/ifs-source/arpifs/phys_radi/suecrad.F90 @@ -2164,21 +2164,22 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) ENDIF IF (LCMIP_STRATAER_CMIP6 .OR. LCMIP_STRATAER_CMIP7) THEN ! IGPBLKS_RAD=(RADGRID%NGPTOT-1)/NRPROMA+1 - ALLOCATE(YDAERSTRAT%STRAT_AOD(NRPROMA,NFLEVG,NTSW,STRATO_CMIP_NMONTH,IGPBLKS_RAD)) - ALLOCATE(YDAERSTRAT%STRAT_AAOD(NRPROMA,NFLEVG,NTSW,STRATO_CMIP_NMONTH,IGPBLKS_RAD)) - ALLOCATE(YDAERSTRAT%STRAT_REFAOD(NRPROMA,NFLEVG,NTSW,STRATO_CMIP_NMONTH,IGPBLKS_RAD)) - ALLOCATE(YDAERSTRAT%STRAT_AAOD_LW(NRPROMA,NFLEVG,STRATO_CMIP_NTB,STRATO_CMIP_NMONTH,IGPBLKS_RAD)) + ! Note assumption that NTSW == STRATO_CMIP_NSB + ALLOCATE(YDAERSTRAT%STRAT_AOD (NRPROMA, NFLEVG, NTSW, STRATO_CMIP_NMONTH, IGPBLKS_RAD)) + ALLOCATE(YDAERSTRAT%STRAT_AAOD (NRPROMA, NFLEVG, NTSW, STRATO_CMIP_NMONTH, IGPBLKS_RAD)) + ALLOCATE(YDAERSTRAT%STRAT_REFAOD (NRPROMA, NFLEVG, NTSW, STRATO_CMIP_NMONTH, IGPBLKS_RAD)) + ALLOCATE(YDAERSTRAT%STRAT_AAOD_LW(NRPROMA, NFLEVG, STRATO_CMIP_NTB, STRATO_CMIP_NMONTH, IGPBLKS_RAD)) STRATO_CMIP_NALT=NFLEVG ALLOCATE(YDAERSTRAT%STRATO_CMIP_ALT(STRATO_CMIP_NALT)) - ALLOCATE(YDAERSTRAT%AOD_SUN(STRATO_CMIP_NALT,STRATO_CMIP_NLAT,STRATO_CMIP_NSB,STRATO_CMIP_NMONTH)) - ALLOCATE(YDAERSTRAT%AAOD_SUN(STRATO_CMIP_NALT,STRATO_CMIP_NLAT,STRATO_CMIP_NSB,STRATO_CMIP_NMONTH)) - ALLOCATE(YDAERSTRAT%REFAOD_SUN(STRATO_CMIP_NALT,STRATO_CMIP_NLAT,STRATO_CMIP_NSB,STRATO_CMIP_NMONTH)) - ALLOCATE(YDAERSTRAT%AAOD_EARTH(STRATO_CMIP_NALT,STRATO_CMIP_NLAT,STRATO_CMIP_NTB,STRATO_CMIP_NMONTH)) - ALLOCATE(YDAERSTRAT%AOD_SUN_MEAN(STRATO_CMIP_NALT,STRATO_CMIP_NLAT,STRATO_CMIP_NSB)) - ALLOCATE(YDAERSTRAT%AAOD_SUN_MEAN(STRATO_CMIP_NALT,STRATO_CMIP_NLAT,STRATO_CMIP_NSB)) - ALLOCATE(YDAERSTRAT%REFAOD_SUN_MEAN(STRATO_CMIP_NALT,STRATO_CMIP_NLAT,STRATO_CMIP_NSB)) - ALLOCATE(YDAERSTRAT%AAOD_EARTH_MEAN(STRATO_CMIP_NALT,STRATO_CMIP_NLAT,STRATO_CMIP_NTB)) + ALLOCATE(YDAERSTRAT%AOD_SUN (STRATO_CMIP_NALT, STRATO_CMIP_NLAT, STRATO_CMIP_NSB, STRATO_CMIP_NMONTH)) + ALLOCATE(YDAERSTRAT%AAOD_SUN (STRATO_CMIP_NALT, STRATO_CMIP_NLAT, STRATO_CMIP_NSB, STRATO_CMIP_NMONTH)) + ALLOCATE(YDAERSTRAT%REFAOD_SUN(STRATO_CMIP_NALT, STRATO_CMIP_NLAT, STRATO_CMIP_NSB, STRATO_CMIP_NMONTH)) + ALLOCATE(YDAERSTRAT%AAOD_EARTH(STRATO_CMIP_NALT, STRATO_CMIP_NLAT, STRATO_CMIP_NTB, STRATO_CMIP_NMONTH)) + ALLOCATE(YDAERSTRAT%AOD_SUN_MEAN (STRATO_CMIP_NALT, STRATO_CMIP_NLAT, STRATO_CMIP_NSB)) + ALLOCATE(YDAERSTRAT%AAOD_SUN_MEAN (STRATO_CMIP_NALT, STRATO_CMIP_NLAT, STRATO_CMIP_NSB)) + ALLOCATE(YDAERSTRAT%REFAOD_SUN_MEAN(STRATO_CMIP_NALT, STRATO_CMIP_NLAT, STRATO_CMIP_NSB)) + ALLOCATE(YDAERSTRAT%AAOD_EARTH_MEAN(STRATO_CMIP_NALT, STRATO_CMIP_NLAT, STRATO_CMIP_NTB)) YDAERSTRAT%AOD_SUN_MEAN=CHECK_SUN_MEAN YDAERSTRAT%AAOD_SUN_MEAN=CHECK_SUN_MEAN From 1f6d62a00edc844b4d11c63c751eee46a360683d Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Wed, 3 Dec 2025 15:55:02 +0100 Subject: [PATCH 104/129] Hotfix from ECE4 - Avoid double accounting of aerosols in stratosphere --- .../phys_ec/cmip_strato_aero_process.F90 | 12 ++---- .../arpifs/phys_radi/radiation_scheme.F90 | 39 ++++++++++++------- ifs-source/arpifs/phys_radi/suecrad.F90 | 17 ++++++-- 3 files changed, 40 insertions(+), 28 deletions(-) diff --git a/ifs-source/arpifs/phys_ec/cmip_strato_aero_process.F90 b/ifs-source/arpifs/phys_ec/cmip_strato_aero_process.F90 index cec2930b..2f50c6ae 100755 --- a/ifs-source/arpifs/phys_ec/cmip_strato_aero_process.F90 +++ b/ifs-source/arpifs/phys_ec/cmip_strato_aero_process.F90 @@ -97,20 +97,14 @@ SUBROUTINE CMIP_STRATO_AERO_PROCESS & IF (LHOOK) CALL DR_HOOK('CMIP_STRATO_AERO_PROCESS',0,ZHOOK_HANDLE) -WRITE(NULOUT,*)'Entering Subroutine CMIP_STRATO_AERO_PROCESS' - ASSOCIATE(& & YDPHYAER => YDMODEL%YRML_PHY_AER, & <WOTL=>YDMODEL%YRML_DYN%YRDYNA%LTWOTL,& &YDRIP=>YDMODEL%YRML_GCONF%YRRIP & ) -ASSOCIATE(& - & YDAERSTRAT => YDPHYAER%YREAEROSTRAT & - ) -ASSOCIATE(& - STRATO_CMIP_ALT=>YDAERSTRAT%STRATO_CMIP_ALT& - ) +ASSOCIATE(YDAERSTRAT => YDPHYAER%YREAEROSTRAT) +ASSOCIATE(STRATO_CMIP_ALT => YDAERSTRAT%STRATO_CMIP_ALT) STRATAOD (KIDIA:KFDIA,:,:) = 0.0_JPRB STRATAAOD (KIDIA:KFDIA,:,:) = 0.0_JPRB @@ -251,7 +245,7 @@ SUBROUTINE CMIP_STRATO_AERO_PROCESS & END ASSOCIATE END ASSOCIATE END ASSOCIATE -WRITE(NULOUT,*)'Leaving subroutine CMIP_STRATO_AERO_PROCESS' + IF (LHOOK) CALL DR_HOOK('CMIP_STRATO_AERO_PROCESS',1,ZHOOK_HANDLE) END SUBROUTINE CMIP_STRATO_AERO_PROCESS diff --git a/ifs-source/arpifs/phys_radi/radiation_scheme.F90 b/ifs-source/arpifs/phys_radi/radiation_scheme.F90 index 2eb77b99..cf7e2097 100644 --- a/ifs-source/arpifs/phys_radi/radiation_scheme.F90 +++ b/ifs-source/arpifs/phys_radi/radiation_scheme.F90 @@ -601,9 +601,6 @@ SUBROUTINE RADIATION_SCHEME & ! Copy optical properties of HAMM7 aerosols - ! Optical properties of HAMM7 aerosols - !IF ( TRIM(AERO_SCHEME) =="hamm7" ) THEN - ! reset IF (RAD_CONFIG%DO_SW) THEN AEROSOL%OD_SW(1:YRERAD%NTSW,:,KIDIA:KFDIA) = 0.0_JPRB @@ -614,7 +611,7 @@ SUBROUTINE RADIATION_SCHEME & AEROSOL%OD_LW(1:STRATO_CMIP_NTB,:,KIDIA:KFDIA) = 0.0_JPRB ENDIF - ! fill with M7 values -> + ! fill with M7 values IF (YRERAD%NAEROOPT>0) THEN IF (RAD_CONFIG%DO_SW) THEN DO JAER = 1,YRERAD%NTSW @@ -637,7 +634,6 @@ SUBROUTINE RADIATION_SCHEME & ENDDO ENDIF ENDIF - !ENDIF ENDIF ELSE @@ -688,18 +684,31 @@ SUBROUTINE RADIATION_SCHEME & ! Time interpolation and excluding the data below the tropopause, each timestep. CALL CMIP_STRATO_AERO_PROCESS (YDMODEL,KIDIA, KFDIA, KLON, KLEV, 1 , 0, & - & NINDAT, YDMODEL%YRML_GCONF%YRRIP%NSTADD, & - & PPRESSURE, PPRESSURE_H, PTEMPERATURE, PTEMPERATURE_H, PGELAM, & - & ZAODSTRAT_M, ZAAODSTRAT_M, ZREFAODSTRAT_M, ZAAODSTRAT_LW_M,& + & NINDAT, YDMODEL%YRML_GCONF%YRRIP%NSTADD, & + & PPRESSURE, PPRESSURE_H, PTEMPERATURE, PTEMPERATURE_H, PGELAM, & + & ZAODSTRAT_M, ZAAODSTRAT_M, ZREFAODSTRAT_M, ZAAODSTRAT_LW_M, & & ZAODSTRAT, ZAAODSTRAT, ZREFAODSTRAT, ZAAODSTRAT_LW, KTROPPAUSE) - !Excluding optical properties of M7 aerosols above stratosphere if CMIP stratospheric aerosols are used - ! If we want do this here, remember add same for LW properties - ! DO JLON=KIDIA,KFDIA - ! AEROSOL%OD_SW(:,1:KTROPPAUSE(JLON)-1,JLON) = 0.0_JPRB - ! AEROSOL%SSA_SW(:,1:KTROPPAUSE(JLON)-1,JLON) = 0.0_JPRB - ! AEROSOL%G_SW(:,1:KTROPPAUSE(JLON)-1,JLON) = 0.0_JPRB - !ENDDO + ! Excluding optical properties of M7 aerosols above stratosphere + IF ( AEROSOL%IS_DIRECT ) THEN + DO JLON=KIDIA,KFDIA + IF (RAD_CONFIG%DO_SW) THEN + AEROSOL%OD_SW (1:YRERAD%NTSW, 1:KTROPPAUSE(JLON)-1, JLON) = 0.0_JPRB + AEROSOL%SSA_SW(1:YRERAD%NTSW, 1:KTROPPAUSE(JLON)-1, JLON) = 0.0_JPRB + AEROSOL%G_SW (1:YRERAD%NTSW, 1:KTROPPAUSE(JLON)-1, JLON) = 0.0_JPRB + ENDIF + IF (RAD_CONFIG%DO_LW) THEN + AEROSOL%OD_LW(1:STRATO_CMIP_NTB, 1:KTROPPAUSE(JLON)-1, JLON) = 0.0_JPRB + ENDIF + ENDDO + ELSE + ! TODO: this needs to be confirmed + DO JAER = 1,KAEROSOL + DO JLON = KIDIA,KFDIA + AEROSOL%MIXING_RATIO(JLON, 1:KTROPPAUSE(JLON)-1, JAER) = 0.0_JPRB + ENDDO + ENDDO + ENDIF ELSE ZAODSTRAT(:,:,:)=0.0_JPRB diff --git a/ifs-source/arpifs/phys_radi/suecrad.F90 b/ifs-source/arpifs/phys_radi/suecrad.F90 index 588288c0..4951eea2 100644 --- a/ifs-source/arpifs/phys_radi/suecrad.F90 +++ b/ifs-source/arpifs/phys_radi/suecrad.F90 @@ -2157,12 +2157,16 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) IF (NCLOUDACT == 1) CALL ND_PARAM_SETUP ENDIF ENDIF + ! - 6.0.1 PARAMETERS FOR stratospheric aerosols -!CMIP stratospheric aerosols -IF (LCMIP_STRATAER_CMIP7) THEN - LCMIP_STRATAER_CMIP6 = .FALSE. + +IF (LCMIP_STRATAER_CMIP7 .AND. LCMIP_STRATAER_CMIP6) THEN + WRITE(UNIT=KULOUT,FMT='(A)')& + & 'Only one of CMIP6 or CMIP7 Stratospheric Aerosols can be used, not both!' + CALL ABOR1('SUECRAD: ABORT') ENDIF -IF (LCMIP_STRATAER_CMIP6 .OR. LCMIP_STRATAER_CMIP7) THEN ! + +IF (LCMIP_STRATAER_CMIP6 .OR. LCMIP_STRATAER_CMIP7) THEN IGPBLKS_RAD=(RADGRID%NGPTOT-1)/NRPROMA+1 ! Note assumption that NTSW == STRATO_CMIP_NSB ALLOCATE(YDAERSTRAT%STRAT_AOD (NRPROMA, NFLEVG, NTSW, STRATO_CMIP_NMONTH, IGPBLKS_RAD)) @@ -2621,6 +2625,11 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) ! WRITE(UNIT=KULOUT,FMT='(A)') 'NCLOUDACT/NAEROOPT not used' ! ENDIF + ! CMIP stratospheric aerosols + WRITE(UNIT=KULOUT,FMT='('' LCMIP_STRATAER_BCKGD = '',L5)') LCMIP_STRATAER_BCKGD + WRITE(UNIT=KULOUT,FMT='('' LCMIP_STRATAER_CMIP6 = '',L5)') LCMIP_STRATAER_CMIP6 + WRITE(UNIT=KULOUT,FMT='('' LCMIP_STRATAER_CMIP7 = '',L5)') LCMIP_STRATAER_CMIP7 + ENDIF ! Load total solar irradiance From 0307bba2e6c0e966208e94d8dd3f771d5bdb4fae Mon Sep 17 00:00:00 2001 From: Eemeli Holopainen Date: Tue, 16 Dec 2025 11:52:09 +0000 Subject: [PATCH 105/129] Pull request #63: Correct use of in-cloud values for cloud variables in wet removal Merge in ~NM6/openifs-48r1 from bugfix/OIFS-652-using-lwc-and-iwc-inconsistencies to knmi-m7 Squashed commit of the following: commit c0da836c388294e7cfb4e75deaffc5b7a0645eaf Author: Philippe Le Sager Date: Tue Dec 16 12:47:29 2025 +0100 Cosmetic changes commit 5cc013c9b4f326f1b210161638702dd94a18f2a8 Author: Eemeli Holopainen Date: Fri Dec 12 12:47:24 2025 +0200 Correct using in-cloud values for cloud variables in wet removal. Correct LWC and IWC inconsistencies with effective radius. --- .../arpifs/m7/phys_ec/hamm7_interface.F90 | 109 +++++++++++------- ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 | 6 +- ifs-source/arpifs/phys_ec/callpar.F90 | 7 +- ifs-source/arpifs/phys_ec/cloud_layer.F90 | 5 +- ifs-source/arpifs/phys_ec/cloudsc.F90 | 5 +- 5 files changed, 86 insertions(+), 46 deletions(-) diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index d3f11852..2cfea866 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -13,7 +13,8 @@ SUBROUTINE HAMM7_INTERFACE( & & PAER_TAU, PAER_SSA, PAER_ASYM, PAER_TAU_LW, & & PTAUS_AER, PTAUA_AER, PPMAER, & & PEXTRA, PVERVEL, PCCNL, PCCNO, PAHFSTI, PCI, PZ0M, & - & PAHFLEV, PUP, PVP, PCVL, PCVH, PSO2DD, PGEMU, PBLH) + & PAHFLEV, PUP, PVP, PCVL, PCVH, PSO2DD, PGEMU, & + & PBLH, PSNOWACL, KCTOP, KCBOT) ! ╭────────────────────────────────────────────────────────────────────────────╮ ! │ (updated 30-APR-2024) │ @@ -200,6 +201,8 @@ SUBROUTINE HAMM7_INTERFACE( & INTEGER(KIND=JPIM), INTENT(IN) :: KAERO(YDMODEL%YRML_GCONF%YGFL%NAERO) INTEGER(KIND=JPIM), INTENT(IN) :: KCHEM(YDMODEL%YRML_GCONF%YGFL%NCHEM) INTEGER(KIND=JPIM), INTENT(IN) :: KSTGLO +INTEGER(KIND=JPIM), INTENT(IN) :: KCTOP(KLON) ! cloud top level index +INTEGER(KIND=JPIM), INTENT(IN) :: KCBOT(KLON) ! cloud bottom level index REAL(KIND=JPRB),INTENT(IN) :: PGEOH(KLON,0:KLEV) REAL(KIND=JPRB),INTENT(IN) :: PRSF1(KLON,KLEV), PRS1(KLON,0:KLEV), PAPHIF(KLON,KLEV) @@ -221,16 +224,17 @@ SUBROUTINE HAMM7_INTERFACE( & REAL(KIND=JPRB),INTENT(IN) :: PVERVEL(KLON,KLEV) ! vertical velocity (needed in HAM-M7 activation) REAL(KIND=JPRB),INTENT(IN) :: PCCNL(KLON) ! CCN over land (needed in liquid effective radius calc.) REAL(KIND=JPRB),INTENT(IN) :: PCCNO(KLON) ! CCN over ocean (needed in liquid effective radius calc.) -REAL(KIND=JPRB),INTENT(IN) :: PAHFSTI(KLON,KTILES) ! added surface sensible heat flux for dry deposition -REAL(KIND=JPRB),INTENT(IN) :: PCI(KLON) ! added fraction of sea-ice for dry deposition -REAL(KIND=JPRB),INTENT(IN) :: PZ0M(KLON) ! added roughness length for momentum for dry deposition -REAL(KIND=JPRB),INTENT(IN) :: PAHFLEV(KLON) ! added latent heat flux for dry deposition -REAL(KIND=JPRB),INTENT(IN) :: PUP(KLON,KLEV) ! added u component of wind -REAL(KIND=JPRB),INTENT(IN) :: PVP(KLON,KLEV) ! added v component of wind -REAL(KIND=JPRB),INTENT(IN) :: PCVL(KLON) ! added low vegetation cover -REAL(KIND=JPRB),INTENT(IN) :: PCVH(KLON) ! added high vegetation cover +REAL(KIND=JPRB),INTENT(IN) :: PAHFSTI(KLON,KTILES) ! surface sensible heat flux for dry deposition +REAL(KIND=JPRB),INTENT(IN) :: PCI(KLON) ! fraction of sea-ice for dry deposition +REAL(KIND=JPRB),INTENT(IN) :: PZ0M(KLON) ! roughness length for momentum for dry deposition +REAL(KIND=JPRB),INTENT(IN) :: PAHFLEV(KLON) ! latent heat flux for dry deposition +REAL(KIND=JPRB),INTENT(IN) :: PUP(KLON,KLEV) ! u component of wind +REAL(KIND=JPRB),INTENT(IN) :: PVP(KLON,KLEV) ! v component of wind +REAL(KIND=JPRB),INTENT(IN) :: PCVL(KLON) ! low vegetation cover +REAL(KIND=JPRB),INTENT(IN) :: PCVH(KLON) ! high vegetation cover REAL(KIND=JPRB),INTENT(IN) :: PGEMU(KLON) ! sine of latitude REAL(KIND=JPRB),INTENT(IN) :: PMFU(KLON,KLEV) ! Conv. mass flux up +REAL(KIND=JPRB),INTENT(IN) :: PSNOWACL(KLON,KLEV) ! accretion rate of snow with cloud droplets REAL(KIND=JPRB),INTENT(INOUT) :: PTENC(KLON,KLEV,KTRAC) REAL(KIND=JPRB),INTENT(INOUT) :: PAERDDP(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO) REAL(KIND=JPRB),INTENT(INOUT) :: PAERSDM(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO) @@ -272,7 +276,7 @@ SUBROUTINE HAMM7_INTERFACE( & REAL(KIND=JPRB) :: ZTAERO0(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO) REAL(KIND=JPRB) :: ZFAERO(KLON,ntrac)!YGFL%NACTAERO) REAL(KIND=JPRB) :: ZAER(KLON,KLEV), ZAERNEG(KLON,KLEV) -REAL(KIND=JPRB) :: ZAP(KLON,KLEV) +REAL(KIND=JPRB) :: ZAP(KLON,KLEV), ZAP_COV(KLON,KLEV) REAL(KIND=JPRB) :: ZSO2(KLON,KLEV), ZDP(KLON,KLEV), ZDZ(KLON,KLEV) REAL(KIND=JPRB) :: ZITSO2(KLON,KLEV) REAL(KIND=JPRB) :: ZFSO2(KLON) , ZFSO4(KLON), ZFSO4_AQ(KLON) @@ -308,8 +312,8 @@ SUBROUTINE HAMM7_INTERFACE( & REAL(KIND=JPRB), ALLOCATABLE :: ZAERNGT(:,:) REAL(KIND=JPRB) :: ZDEGRAD, ZEPSCOV, ZEPSWAT, ZRWSAT, ZRWPWP -REAL(KIND=JPRB) :: ZQLWP2 -REAL(KIND=JPRB) :: ZTMPA, ZTEMP, ZDPOG, ZQIWP, ZPODT +REAL(KIND=JPRB) :: ZQLWP(KLON,KLEV), ZQIWP(KLON,KLEV) +REAL(KIND=JPRB) :: ZTMPA LOGICAL :: LLIQCLD(KLON,KLEV) ! logical for liquid cloud LOGICAL :: LICECLD(KLON,KLEV) ! logical for ice cloud @@ -383,7 +387,8 @@ SUBROUTINE HAMM7_INTERFACE( & REAL(KIND=JPRB) :: ZMRATEPR_str(KLON,KLEV) !rain formation rate in cloudy part, stratiform case REAL(KIND=JPRB) :: ZMRATEPS_str(KLON,KLEV) ! ice formation rate in cloudy part, stratiform case -REAL(KIND=JPRB) :: ZMSNOWACL(KLON,KLEV) !accretion rate of snow with cloud droplets in cloudy part +REAL(KIND=JPRB) :: ZMSNOWACL_str(KLON,KLEV) !accretion rate of snow with cloud droplets in cloudy part strat +REAL(KIND=JPRB) :: ZMSNOWACL_cov(KLON,KLEV) !accretion rate of snow with cloud droplets in cloudy part conv REAL(KIND=JPRB) :: ZFLXR, ZFLXS, ZFLXRB, ZFLXSB !variables to calculate rain and snow evap/formation REAL(KIND=JPRB) :: ZFPLCL(KLON,KLEV),ZFPLCN(KLON,KLEV),ZFPLSL(KLON,KLEV),ZFPLSN(KLON,KLEV) @@ -686,10 +691,15 @@ SUBROUTINE HAMM7_INTERFACE( & ! RH calculation DO JK=1,KLEV DO JL=KIDIA,KFDIA - ZQP(JL,JK)=MAX(0.0_JPRB,PQP(JL,JK)) !add treshold for full level humid + ZQP(JL,JK)=MAX(0.0_JPRB,PQP(JL,JK)) ! threshold for full level humid ZRH(JL,JK)=ZQP(JL,JK)/(MAX(1.E-30_JPRB,ZQSAT(JL,JK))) ZRH(JL,JK)=MIN(1.0_JPRB,MAX(0.0_JPRB,ZRH(JL,JK))) - ZAP(JL,JK)=MIN(1.0_JPRB,MAX(0.0_JPRB,PAP(JL,JK))) !add threshold for cloud cover + ZAP(JL,JK)=MIN(1.0_JPRB,MAX(0.0_JPRB,PAP(JL,JK))) ! threshold for cloud cover + IF (JK >= KCTOP(JL) .AND. JK <= KCBOT(JL)) THEN ! cloud fraction for convective wet removal (0 outside and 1 inside cloud) + ZAP_COV(JL,JK) = 1.0_JPRB + ELSE + ZAP_COV(JL,JK) = 0.0_JPRB + END IF ENDDO ENDDO ZBLHIDX(KIDIA:KFDIA)=1.0_JPRB @@ -916,15 +926,24 @@ SUBROUTINE HAMM7_INTERFACE( & ZTMPA = 1.0_JPRB/MAX(ZAP(JL,JK),ZEPSEC) LLIQCLD(JL,JK) = ( PLP(JL,JK)*ZTMPA ) > ZEPSEC ! logical for liquid cloud LICECLD(JL,JK) = ( PIP(JL,JK)*ZTMPA ) > ZEPSEC ! logical for ice cloud - ZQLWP(JL,JK) = PLP(JL,JK)/MAX(ZAP(JL,JK),1.E-10_JPRB) ! calculate lwc - ZQLWP(JL,JK) = MIN(MAX(ZQLWP(JL,JK),0.0_JPRB),RCLDMAX) ! treshold lwc - END DO + ZQLWP(JL,JK) = MIN(MAX(0._JPRB, PLP(JL,JK)*ZTMPA), RCLDMAX) ! lwc + ZQIWP(JL,JK) = MIN(MAX(0._JPRB, PIP(JL,JK)*ZTMPA), RCLDMAX) ! iwc + ZMSNOWACL_str(JL,JK) = PSNOWACL(JL,JK)*ZTMPA ! accretion rate of snow with cloud drop. in cloudy part for strat. wetdep + ELSE + LLIQCLD(JL,JK) = .FALSE. + LICECLD(JL,JK) = .FALSE. + ZQLWP(JL,JK) = 0.0_JPRB + ZQIWP(JL,JK) = 0.0_JPRB + ZMSNOWACL_str(JL,JK) = 0.0_JPRB + END IF + END DO END DO + ZMSNOWACL_cov(KIDIA:KFDIA,1:KLEV) = 0.0_JPRB ! accretion rate of snow 0 for conv. wetdep !---find highest model level where there is cloud KTOP = KLEV !eehol: add as default (basically if no cloud so KTOP is assigned to lowest level) DO JK=1,KLEV - IF ( ANY(ZAP(KIDIA:KFDIA,JK) >=0.001_JPRB) ) THEN !eehol: if cloud fraction is larger than threshold + IF ( ANY(ZAP(KIDIA:KFDIA,JK) >=0.001_JPRB) ) THEN ! if cloud fraction is larger than threshold KTOP = JK EXIT ENDIF @@ -1251,6 +1270,7 @@ SUBROUTINE HAMM7_INTERFACE( & IF ( ANY(trlist%ti(:)%nwetdep > 0) ) THEN ! for calculating the rain and snow evaporation/formation variables used in wet deposition + ! convective wet deposition values DO JK=1,KLEV DO JL=KIDIA,KFDIA ZFLXR=PFPLCL(JL,JK-1) @@ -1264,40 +1284,51 @@ SUBROUTINE HAMM7_INTERFACE( & !same formula negatives/positives for evap or formation ZFEVAPR_cov(JL,JK) = -1._JPRB*MIN(ZFLXRB-ZFLXR,0._JPRB) ! [kg/m2.s] ZFSUBLS_cov(JL,JK) = -1._JPRB*MIN(ZFLXSB-ZFLXS,0._JPRB) ! [kg/m2.s] + ZFPLCL(JL,JK) = 0.5_JPRB*(ZFLXR+ZFLXRB) + ZFPLCN(JL,JK) = 0.5_JPRB*(ZFLXS+ZFLXSB) END DO END DO - + ! stratiform wet deposition values DO JK=1,KLEV DO JL=KIDIA,KFDIA ZFLXR=PFPLSL(JL,JK-1) ZFLXS=PFPLSN(JL,JK-1) ZFLXRB=PFPLSL(JL,JK) ZFLXSB=PFPLSN(JL,JK) - ZMRATEPR_str(JL,JK) = MAX(ZFLXRB-ZFLXR,1.E-10_JPRB)/ZDPG(JL,JK) ! [kg/kg/s] - ZMRATEPS_str(JL,JK) = MAX(ZFLXSB-ZFLXS,1.E-10_JPRB)/ZDPG(JL,JK) ! [kg/kg/s] - ZMRATEPR_str(JL,JK) = ZMRATEPR_str(JL,JK) * TIME_STEP_LEN ! time integrated - ZMRATEPS_str(JL,JK) = ZMRATEPS_str(JL,JK) * TIME_STEP_LEN ! time integrated + IF ( ZAP(JL,JK) >=0.001_JPRB ) THEN + ZTMPA = 1.0_JPRB/ZAP(JL,JK) + ZMRATEPR_str(JL,JK) = MAX(ZFLXRB-ZFLXR,1.E-10_JPRB)/ZDPG(JL,JK) ! [kg/kg/s] + ZMRATEPS_str(JL,JK) = MAX(ZFLXSB-ZFLXS,1.E-10_JPRB)/ZDPG(JL,JK) ! [kg/kg/s] + ZMRATEPR_str(JL,JK) = ZMRATEPR_str(JL,JK) * TIME_STEP_LEN * ZTMPA ! time integrated + ZMRATEPS_str(JL,JK) = ZMRATEPS_str(JL,JK) * TIME_STEP_LEN * ZTMPA ! time integrated + ELSE + ZMRATEPR_str(JL,JK) = 0.0_JPRB + ZMRATEPS_str(JL,JK) = 0.0_JPRB + END IF !same formula negatives/positives for evap or formation - ZFEVAPR_str(JL,JK) = -1._JPRB*MIN(ZFLXRB-ZFLXR,0._JPRB) ! [kg/m2.s] - ZFSUBLS_str(JL,JK) = -1._JPRB*MIN(ZFLXSB-ZFLXS,0._JPRB) ! [kg/m2.s] + IF ( PCOVPTOT(JL,JK) > ZEPSEC ) THEN + ZTMPA = 1.0_JPRB/PCOVPTOT(JL,JK) + ZFEVAPR_str(JL,JK) = -1._JPRB*MIN(ZFLXRB-ZFLXR,0._JPRB) * ZTMPA ! [kg/m2.s] + ZFSUBLS_str(JL,JK) = -1._JPRB*MIN(ZFLXSB-ZFLXS,0._JPRB) * ZTMPA ! [kg/m2.s] + ZFPLSL(JL,JK) = 0.5_JPRB*(ZFLXR+ZFLXRB) * ZTMPA + ZFPLSN(JL,JK) = 0.5_JPRB*(ZFLXS+ZFLXSB) * ZTMPA + ELSE + ZFEVAPR_str(JL,JK) = 0.0_JPRB + ZFSUBLS_str(JL,JK) = 0.0_JPRB + ZFPLSL(JL,JK) = 0.0_JPRB + ZFPLSN(JL,JK) = 0.0_JPRB + END IF END DO END DO - ZFPLCL(KIDIA:KFDIA,1:KLEV) = 0.5_JPRB*(PFPLCL(KIDIA:KFDIA,0:KLEV-1)+PFPLCL(KIDIA:KFDIA,1:KLEV)) - ZFPLCN(KIDIA:KFDIA,1:KLEV) = 0.5_JPRB*(PFPLCN(KIDIA:KFDIA,0:KLEV-1)+PFPLCN(KIDIA:KFDIA,1:KLEV)) - ZFPLSL(KIDIA:KFDIA,1:KLEV) = 0.5_JPRB*(PFPLSL(KIDIA:KFDIA,0:KLEV-1)+PFPLSL(KIDIA:KFDIA,1:KLEV)) - ZFPLSN(KIDIA:KFDIA,1:KLEV) = 0.5_JPRB*(PFPLSN(KIDIA:KFDIA,0:KLEV-1)+PFPLSN(KIDIA:KFDIA,1:KLEV)) - - ZMSNOWACL(KIDIA:KFDIA,1:KLEV) = PSP(KIDIA:KFDIA,1:KLEV) !? - ZLFRAC_SO2(KIDIA:KFDIA,:) = 0._JPRB ! zlfrac_so2 only needed in gas scavenging and this is off for now (put this zero) ! In cloudsc.f90 PLU is defined as convective condensate (understood as total condensate, ie "include liquid and ice phases"). ! So we use ZIPDUM to set the ice part to zero and use total condensate as liquid for the convective case of wetdep. ! In the future, it would be better to calculate the actual fraction based on 7.6. This may be important to describe the ! liquid and ice fractions correctly. - ZLP(KIDIA:KFDIA,1:KLEV) = PLP(KIDIA:KFDIA,1:KLEV) ! temporary variable for cloud water content (modified in wetdep - stratif case) - ZIP(KIDIA:KFDIA,1:KLEV) = PIP(KIDIA:KFDIA,1:KLEV) ! temporary variable for cloud ice water content (modified in wetdep - stratif case) + ZLP(KIDIA:KFDIA,1:KLEV) = ZQLWP(KIDIA:KFDIA,1:KLEV) ! temporary variable for cloud water content (modified in wetdep - stratif case) + ZIP(KIDIA:KFDIA,1:KLEV) = ZQIWP(KIDIA:KFDIA,1:KLEV) ! temporary variable for cloud ice water content (modified in wetdep - stratif case) ZIPDUM(KIDIA:KFDIA,1:KLEV) = 0._JPRB ! temporary variable for cloud ice water content (modified in wetdep - convec case) ZLPU(KIDIA:KFDIA,1:KLEV) = PLU(KIDIA:KFDIA,1:KLEV) ! temporary variable for cloud water content (modified in wetdep - convec case) @@ -1325,10 +1356,10 @@ SUBROUTINE HAMM7_INTERFACE( & IF (.NOT. LSTRAT) THEN CALL XT_CONV_MASSFIX(KFDIA, KLON, KLEV, KLEV+1, NTRAC, ZKROW, PRSF1, PRS1, ZXTTE, .TRUE., ZDUMMY) ! call convective mass conserving (init zxtte_old) - ZMFU(KIDIA:KFDIA,1:KLEV) = min(PMFU(KIDIA:KFDIA,1:KLEV),ZDPG(KIDIA:KFDIA,1:KLEV)/TIME_STEP_LEN)!constraing Conv. mass flux up + ZMFU(KIDIA:KFDIA,1:KLEV) = MIN(PMFU(KIDIA:KFDIA,1:KLEV),ZDPG(KIDIA:KFDIA,1:KLEV)/TIME_STEP_LEN)!constraing Conv. mass flux up CALL WETDEP_INTERFACE(KFDIA, KLON, KLEV, KTOP, ZKROW, LSTRAT, & ! ktop = cloud top level index, lstrat = FALSE for conv. case - ZDPG, ZMRATEPR_COV, ZMRATEPS_COV, ZMSNOWACL, & ! dp/g, evap. of rain, subl. of snow, accr. rate of snow with cl. drop in-cl. + ZDPG, ZMRATEPR_COV, ZMRATEPS_COV, ZMSNOWACL_cov, & ! dp/g, evap. of rain, subl. of snow, accr. rate of snow with cl. drop in-cl. ZLPU, ZIPDUM, & ! cloud water content, cloud ice water content ZM6RP, ZM6DRY, & ! m7 aerosol: to replace rwet_m7, dry radius for soluble modes [cm] REFFI, REFFL, & ! effective radii @@ -1337,7 +1368,7 @@ SUBROUTINE HAMM7_INTERFACE( & ZXTTE, ZXTP10, ZXTP1C, & ! tendencies/mixing ratios (in/out) ZFPLCL, ZFPLCN, ZFEVAPR_cov, ZFSUBLS_cov, & ! rain flux, snow flux, ZMFU, ZFUXT3D, & ! conv flux, updraft mass flux (updated in wetdep) - ZAP, ZDUM2D, ZRHO, ZDUMMY, ZWDEP_SCAV_IC, ZWDEP_SCAV_BC) ! cloud frac., precip. frac., air dens., in/output*3 + ZAP_COV, ZDUM2D, ZRHO, ZDUMMY, ZWDEP_SCAV_IC, ZWDEP_SCAV_BC) ! cloud frac., precip. frac., air dens., in/output*3 CALL XT_CONV_MASSFIX(KFDIA, KLON, KLEV, KLEV+1, NTRAC, ZKROW, PRSF1, PRS1, ZXTTE, .FALSE., ZDUMMY) ! call convective mass conserving END IF @@ -1376,7 +1407,7 @@ SUBROUTINE HAMM7_INTERFACE( & LSTRAT = .TRUE. !True for strat case, large scale CALL WETDEP_INTERFACE(KFDIA, KLON, KLEV, KTOP, ZKROW, LSTRAT, & ! ktop = cloud top level index, lstrat = TRUE for strat. case - ZDPG, ZMRATEPR_STR, ZMRATEPS_STR, ZMSNOWACL, & ! dp/g, evap. of rain, subl. of snow, accr. rate of snow with cl. drop in-cl. + ZDPG, ZMRATEPR_STR, ZMRATEPS_STR, ZMSNOWACL_str, & ! dp/g, evap. of rain, subl. of snow, accr. rate of snow with cl. drop in-cl. ZLP, ZIP, & ! cloud water content, cloud ice water content ZM6RP, ZM6DRY, & ! m7 aerosol: to replace rwet_m7, dry radius for soluble modes [cm] REFFI, REFFL, & ! effective radii diff --git a/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 b/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 index 338951be..d4970af3 100644 --- a/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 +++ b/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 @@ -10,7 +10,7 @@ SUBROUTINE AER_PHY3_LAYER(YDSURF, & ! Input quantities & YDMODEL,KDIM, PAUX, STATE, SURFL, AUXL, PDIAG, PCHEM2AER, & ! Input/Output quantities - & PGFL, PSURF, FLUX, GEMSL, PRAD) + & PGFL, PSURF, FLUX, GEMSL, PRAD, PSNOWACL) !**** *AER_PHY3_LAYER* - Layer routine calling the last part of prognostics aerosol scheme @@ -97,6 +97,7 @@ SUBROUTINE AER_PHY3_LAYER(YDSURF, & TYPE (FLUX_TYPE) , INTENT(INOUT) :: FLUX TYPE (GEMS_LOCAL_TYPE) , INTENT(INOUT) :: GEMSL TYPE (AUX_RAD_TYPE) , INTENT(INOUT) :: PRAD +REAL(KIND=JPRB) , INTENT (IN) :: PSNOWACL(KDIM%KLON,KDIM%KLEV) ! accretion rate of snow with cloud droplets !----------------------------------------------------------------------- INTEGER(KIND=JPIM) :: JAER, JVAR, JWVL, JGFL, JK, JL INTEGER(KIND=JPIM) :: IBLK @@ -254,7 +255,8 @@ SUBROUTINE AER_PHY3_LAYER(YDSURF, & & ZTAUS_AER , ZTAUA_AER, ZPMAER, & !VH & PSURF%PSD_XA, PAUX%PVERVEL, AUXL%ZCCNL, AUXL%ZCCNO, PSURF%PAHFSTI, PSURF%PSD_VF(:,YSD_VF%YCI%MP), GEMSL%ZAZ0M, FLUX%PFTLHEV, & - & STATE%U, STATE%V, PSURF%PCVL, PSURF%PCVH,PSURF%PSD_VF(:,YSD_VF%YSO2DD%MP), PAUX%PGEMU,PSURF%PSD_VD(:,YDSURF%YSD_VD%YBLH%MP)) !,ZTSO2,ZTSO4,ZTSO4_AQ,ZFSO2,ZFSO4 ,ZFSO4_AQ& + & STATE%U, STATE%V, PSURF%PCVL, PSURF%PCVH,PSURF%PSD_VF(:,YSD_VF%YSO2DD%MP), PAUX%PGEMU,PSURF%PSD_VD(:,YDSURF%YSD_VD%YBLH%MP), & + & PSNOWACL, PDIAG%ICTOP, PDIAG%ICBOT) !,ZTSO2,ZTSO4,ZTSO4_AQ,ZFSO2,ZFSO4 ,ZFSO4_AQ& !&) ! u-wind,v-wind,low veg. cover, high veg. cover, sine of latitude DO JAER=1,YDMODEL%YRML_PHY_RAD%YRERAD%NTSW diff --git a/ifs-source/arpifs/phys_ec/callpar.F90 b/ifs-source/arpifs/phys_ec/callpar.F90 index 2237e20c..e028d877 100644 --- a/ifs-source/arpifs/phys_ec/callpar.F90 +++ b/ifs-source/arpifs/phys_ec/callpar.F90 @@ -309,6 +309,7 @@ SUBROUTINE CALLPAR(YDGEOMETRY,YDVARS,YDSURF,YDMODEL,KDIM,& INTEGER(KIND=JPIM) :: IFLAG, JK, JL, JSW, JEXT, ITRC, J2D, JRF REAL(KIND=JPRB) :: ZRG, ZRCPD, ZCONS, ZCONS1 +REAL(KIND=JPRB) :: ZSNOWACL(KDIM%KLON,KDIM%KLEV) ! accretion rate of snow with cloud drops REAL(KIND=JPHOOK) :: ZHOOK_HANDLE @@ -531,6 +532,8 @@ SUBROUTINE CALLPAR(YDGEOMETRY,YDVARS,YDSURF,YDMODEL,KDIM,& ! Initialize tendency_cml (being simple copy of tendency_dyn at the moment) CALL STATE_COPY(KDIM,TENDENCY_DYN,TENDENCY_CML) +ZSNOWACL(:,:) = 0.0_JPRB ! init accretion rate of snow with cloud drop + ! ------------------------------------------------------------------ !* 1. INITIAL COMPUTATIONS. @@ -1358,7 +1361,7 @@ SUBROUTINE CALLPAR(YDGEOMETRY,YDVARS,YDSURF,YDMODEL,KDIM,& & KDIM,LLSLPHY, PAUX, PPERT, STATE_T0, & & TENDENCY_CML, TENDENCY_DYN, TENDENCY_VDF, & & PRAD, PSURF, LLKEYS, AUXL, FLUX, PDIAG, & - & YDVARS%FSD, TENDENCY_LOC) + & YDVARS%FSD, ZSNOWACL, TENDENCY_LOC) ELSE @@ -1641,7 +1644,7 @@ SUBROUTINE CALLPAR(YDGEOMETRY,YDVARS,YDSURF,YDMODEL,KDIM,& IF (NACTAERO /=0 .AND. LL_HRES) THEN IF (.NOT.LAERINIT) THEN - CALL AER_PHY3_LAYER(YDSURF,YDMODEL,KDIM, PAUX, STATE_TMP, SURFL, AUXL, PDIAG, ZCHEM2AER, PGFL, PSURF, FLUX, GEMSL, PRAD) + CALL AER_PHY3_LAYER(YDSURF,YDMODEL,KDIM, PAUX, STATE_TMP, SURFL, AUXL, PDIAG, ZCHEM2AER, PGFL, PSURF, FLUX, GEMSL, PRAD, ZSNOWACL) ELSE GEMSL%ZTENC(KDIM%KIDIA:KDIM%KFDIA, 1:KDIM%KLEV, GEMSL%IAERO(1):GEMSL%IAERO(NACTAERO))=0._JPRB ENDIF diff --git a/ifs-source/arpifs/phys_ec/cloud_layer.F90 b/ifs-source/arpifs/phys_ec/cloud_layer.F90 index 52e9e3a9..e2483633 100644 --- a/ifs-source/arpifs/phys_ec/cloud_layer.F90 +++ b/ifs-source/arpifs/phys_ec/cloud_layer.F90 @@ -14,7 +14,7 @@ SUBROUTINE CLOUD_LAYER( & & TENDENCY_CML, TENDENCY_DYN, TENDENCY_VDF, PRAD, & & PSURF, LLKEYS, & ! Input/Output quantities - & AUXL, FLUX, PDIAG, FSD, & + & AUXL, FLUX, PDIAG, FSD, PSNOWACL, & ! Output tendencies & TENDENCY_LOC) @@ -123,6 +123,7 @@ SUBROUTINE CLOUD_LAYER( & TYPE (AUX_DIAG_TYPE) , INTENT(INOUT) :: PDIAG TYPE (VARIABLE_3D) , INTENT(INOUT) :: FSD TYPE (STATE_TYPE) , INTENT(INOUT) :: TENDENCY_LOC +REAL(KIND=JPRB) , INTENT(INOUT) :: PSNOWACL(KDIM%KLON,KDIM%KLEV) ! accretion rate of snow with cloud droplets !----------------------------------------------------------------------- INTEGER(KIND=JPIM) :: JRF, JL, JK REAL(KIND=JPRB) :: ZGP2DSPP(KDIM%KLON, YDSPP_CONFIG%SM%NRFTOTAL) !SPP pattern @@ -192,7 +193,7 @@ SUBROUTINE CLOUD_LAYER( & & FLUX%PFSQRF, FLUX%PFSQSF , FLUX%PFCQRNG, FLUX%PFCQSNG,& & FLUX%PFSQLTUR, FLUX%PFSQITUR , & & FLUX%PFPLSL, FLUX%PFPLSN, FLUX%PFHPSL, FLUX%PFHPSN,& - & PSURF%PSD_XA, KDIM%KFLDX) + & PSURF%PSD_XA, KDIM%KFLDX, PSNOWACL) IF(YDEPHY%LRAD_CLOUD_INHOMOG) THEN DO JK=1,KDIM%KLEV diff --git a/ifs-source/arpifs/phys_ec/cloudsc.F90 b/ifs-source/arpifs/phys_ec/cloudsc.F90 index acb39334..9bd5070e 100644 --- a/ifs-source/arpifs/phys_ec/cloudsc.F90 +++ b/ifs-source/arpifs/phys_ec/cloudsc.F90 @@ -40,7 +40,7 @@ SUBROUTINE CLOUDSC & & PFSQRF, PFSQSF , PFCQRNG, PFCQSNG, & & PFSQLTUR, PFSQITUR , & & PFPLSL, PFPLSN, PFHPSL, PFHPSN, & - & PEXTRA, KFLDX) + & PEXTRA, KFLDX, PSNOWACL) !=============================================================================== !**** *CLOUDSC* - ROUTINE FOR PARAMETRIZATION OF CLOUD PROCESSES @@ -267,6 +267,7 @@ SUBROUTINE CLOUDSC & REAL(KIND=JPRB) ,INTENT(OUT) :: PFPLSN(KLON,KLEV+1) ! ice+snow sedim flux REAL(KIND=JPRB) ,INTENT(OUT) :: PFHPSL(KLON,KLEV+1) ! Enthalpy flux for liq REAL(KIND=JPRB) ,INTENT(OUT) :: PFHPSN(KLON,KLEV+1) ! Enthalp flux for ice +REAL(KIND=JPRB) ,INTENT(INOUT) :: PSNOWACL(KLON,KLEV) ! accretion rate of snow with cloud droplets ! Extra fields for diagnostics REAL(KIND=JPRB) ,INTENT(INOUT) :: PEXTRA(KLON,KLEV,KFLDX) ! extra fields INTEGER(KIND=JPIM),INTENT(IN) :: KFLDX ! Number of extra fields @@ -3670,6 +3671,8 @@ SUBROUTINE CLOUDSC & ZBUDI(JL,13)= -ZFALLSINK(JL,NCLDQI)*ZQXN(JL,NCLDQI)*ZQTMST ZBUDL(JL,21)= -ZSNOWRIME(JL)*ZQXN(JL,NCLDQL)*ZQTMST ZBUDI(JL,14)= -ZSNOWAUT(JL)*ZQXN(JL,NCLDQI)*ZQTMST + + PSNOWACL(JL,JK) = ZSNOWRIME(JL)*ZQXN(JL,NCLDQL) ENDDO From b94d9b7d02b9226bcb0da1705d994e1cc423f5bd Mon Sep 17 00:00:00 2001 From: Lianghai Wu Date: Wed, 3 Dec 2025 12:03:17 +0000 Subject: [PATCH 106/129] add pcflx --- ifs-source/arpifs/m7/phys_ec/tm5m7_phy2.F90 | 4 ++-- ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 | 12 ++++++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/ifs-source/arpifs/m7/phys_ec/tm5m7_phy2.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_phy2.F90 index 198f26ff..7a985a89 100644 --- a/ifs-source/arpifs/m7/phys_ec/tm5m7_phy2.F90 +++ b/ifs-source/arpifs/m7/phys_ec/tm5m7_phy2.F90 @@ -157,7 +157,7 @@ SUBROUTINE TM5M7_PHY2 & REAL(KIND=JPRB),INTENT(INOUT) :: PTENC(KLON,KLEV,KTRAC) -REAL(KIND=JPRB),INTENT(OUT) :: PCFLX(KLON,KTRAC) +REAL(KIND=JPRB),INTENT(INOUT) :: PCFLX(KLON,KTRAC) REAL(KIND=JPRB),INTENT(INOUT) :: PAERDDP(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO), PAERSDM(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO), PAERSRC(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO) REAL(KIND=JPRB),INTENT(OUT) :: PAERMAP(KLON,5) REAL(KIND=JPRB),INTENT(OUT) :: PAERFLX(KLON,12,9), PAERLIF(KLON,9) @@ -313,7 +313,7 @@ SUBROUTINE TM5M7_PHY2 & & PLSM , PSST , PQP , ZRHO , PSNS , PTP , PTL , PTSPHY, PZ0M, KCHEM, & & ZWND , PWSA1 , PSOIL_TYPE, & & PCVL , PCVH, KTVL, KTVH, & - & PLDAY , PAERFLX, PCEN , PTENC, ZEMIDIAG, PSO2SRC,PSO4SRC) + & PLDAY , PAERFLX, PCFLX, PCEN , PTENC, ZEMIDIAG, PSO2SRC,PSO4SRC) ! sea salt and desert dust fluxes in kg m-2 s-1, thus: diff --git a/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 index 2b9139f5..aeb477e8 100644 --- a/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 +++ b/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 @@ -7,7 +7,7 @@ SUBROUTINE TM5M7_SRC( & & PLSM , PSST , PQ , PRHO , PSNS , PT , PTL , PTSPHY, PZ0M, KCHEM, & & PWIND, PWS1 ,PSOIL_TYPE, & & PCVL, PCVH, KTVL, KTVH, & - & PLDAY, PAERFLX, PCEN , PTENC, PEMIDIAG, PSO2SRC,PSO4SRC ) + & PLDAY, PAERFLX, PCFLX, PCEN , PTENC, PEMIDIAG, PSO2SRC,PSO4SRC ) ! ╭────────────────────────────────────────────────────────────────────────────╮ ! │ (updated 03-Jun-2024) │ @@ -118,6 +118,7 @@ SUBROUTINE TM5M7_SRC( & ! RCHG -> try to understand what is 12 and 9 here. REAL(KIND=JPRB), INTENT(INOUT) :: PAERFLX(KLON,12,9) +REAL(KIND=JPRB),INTENT(INOUT) :: PCFLX(KLON,KTRAC) REAL(KIND=JPRB), INTENT(IN) :: PCVL(KLON), PCVH(KLON) ! Low/High vegetation cover INTEGER(KIND=JPIM), INTENT(IN) :: KTVL(KLON), KTVH(KLON) ! Low/High vegetation type @@ -423,7 +424,14 @@ SUBROUTINE TM5M7_SRC( & ! I keep current implementation. DO JL=KIDIA,KFDIA - + PCFLX(JL,KAERO(iacs_n)) =PCFLX(JL,KAERO(iacs_n))+ emis_number(mode_acs)%d3(JL,KLEV,4)*(-1._JPRB) + PCFLX(JL,KAERO(icos_n)) =PCFLX(JL,KAERO(icos_n))+ emis_number(mode_cos)%d3(JL,KLEV,4)*(-1._JPRB) + PCFLX(JL,KAERO(issacs)) =PCFLX(JL,KAERO(issacs))+ emis_mass(mode_acs)%d3(JL,KLEV,4)*(-1._JPRB) + PCFLX(JL,KAERO(isscos)) =PCFLX(JL,KAERO(isscos))+ emis_mass(mode_cos)%d3(JL,KLEV,4)*(-1._JPRB) + PCFLX(JL,KAERO(iaci_n)) =PCFLX(JL,KAERO(iaci_n))+ emis_number(mode_aci)%d3(JL,KLEV,1)*(-1._JPRB) + PCFLX(JL,KAERO(icoi_n)) =PCFLX(JL,KAERO(icoi_n))+ emis_number(mode_coi)%d3(JL,KLEV,1)*(-1._JPRB) + PCFLX(JL,KAERO(iduaci)) =PCFLX(JL,KAERO(iduaci))+ emis_mass(mode_aci)%d3(JL,KLEV,1)*(-1._JPRB) + PCFLX(JL,KAERO(iducoi)) =PCFLX(JL,KAERO(iducoi))+ emis_mass(mode_coi)%d3(JL,KLEV,1)*(-1._JPRB) ZCFLX(JL,KAERO(iacs_n)) = emis_number(mode_acs)%d3(JL,KLEV,4)*(-1._JPRB) ZCFLX(JL,KAERO(icos_n)) = emis_number(mode_cos)%d3(JL,KLEV,4)*(-1._JPRB) From 3055a03c68f742e60f7468889188403baf29c497 Mon Sep 17 00:00:00 2001 From: Lianghai Wu Date: Thu, 4 Dec 2025 12:23:39 +0000 Subject: [PATCH 107/129] resotring refractive index array assignment --- ifs-source/arpifs/m7/module/mo_ham_rad.F90 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ifs-source/arpifs/m7/module/mo_ham_rad.F90 b/ifs-source/arpifs/m7/module/mo_ham_rad.F90 index 34fb2e0e..7da04d0d 100755 --- a/ifs-source/arpifs/m7/module/mo_ham_rad.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_rad.F90 @@ -1348,6 +1348,8 @@ SUBROUTINE ham_rad(kproma, kbdim, klev, krow, kpband, kb_sw, & #ifdef HAMMOZ IF (ltimer) CALL timer_start(timer_ham_rad_refrac) #endif + znr2d(1:kproma,:) = nr_diag(1:kproma,:,jwv,jclass) + zni2d(1:kproma,:) = ni_diag(1:kproma,:,jwv,jclass) ! Fill znr2d(1:kproma,:) with interpolated values; to becopied into nr_diag(1:kproma,:,jwv,jclass) ! ! 3.46, 2.79, 2.33, 2.05, 1.78, 1.46, 1.27, 1.01, 0.70, 0.53, 0.39, 0.30, 0.23, 8.02 [um] From 5c03f216982e7ea99dacdb8ad171f7462b8ebbee Mon Sep 17 00:00:00 2001 From: Lianghai Wu Date: Thu, 11 Dec 2025 08:11:35 +0000 Subject: [PATCH 108/129] using optical properties at radiation steps for in between --- ifs-source/arpifs/m7/module/mo_ham_rad.F90 | 2 +- ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 | 2 +- ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 | 10 ++++++++++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/ifs-source/arpifs/m7/module/mo_ham_rad.F90 b/ifs-source/arpifs/m7/module/mo_ham_rad.F90 index 7da04d0d..51da3f93 100755 --- a/ifs-source/arpifs/m7/module/mo_ham_rad.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_rad.F90 @@ -1533,7 +1533,7 @@ SUBROUTINE interp_refr_index(kproma, kbdim, klev, wl_in, nr_in, wl_out, nr_out) implicit none ! Input - integer :: kproma, kbdim, klev + integer, intent(in) :: kproma, kbdim, klev real(dp), intent(in) :: wl_in(Nwv_tot) ! (Nwv_tot), unsorted real(dp), intent(in) :: nr_in(kbdim,klev,Nwv_tot) ! (kbdim,klev,Nwv_tot) real(dp), intent(in) :: wl_out ! single query wavelength diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index 2cfea866..d86ea158 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -246,7 +246,7 @@ SUBROUTINE HAMM7_INTERFACE( & !REAL(KIND=JPRB),INTENT(OUT) :: PODTO469(KLON), PODTO670(KLON), PODTO865(KLON), PODTO1240(KLON) !REAL(KIND=JPRB),INTENT(IN) :: PALBD(KLON,YDMODEL%YRML_PHY_RAD%YRERAD%NTSW), PFRTI(KLON,KTILES) -REAL(KIND=JPRB),INTENT(OUT) :: PAERO_WVL_DIAG(KLON,YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG,YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG_TYPES) +REAL(KIND=JPRB),INTENT(INOUT) :: PAERO_WVL_DIAG(KLON,YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG,YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG_TYPES) REAL(KIND=JPRB),INTENT(OUT) :: PAERODDF(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO,8) REAL(KIND=JPRB),INTENT(INOUT) :: PEXTRA(KLON,KLEVX,KFLDX) REAL(KIND=JPRB),INTENT(INOUT) :: PAER_TAU(KLON,KLEV,14), PAER_SSA(KLON,KLEV,14),PAER_ASYM(KLON,KLEV,14) diff --git a/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 b/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 index d4970af3..8f7b8250 100644 --- a/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 +++ b/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 @@ -215,6 +215,16 @@ SUBROUTINE AER_PHY3_LAYER(YDSURF, & ENDDO ENDDO ENDDO + + DO JVAR=1,NAERO_WVL_DIAG_TYPES + DO JWVL=1,NAERO_WVL_DIAG + DO JL=KDIM%KIDIA,KDIM%KFDIA + ZAERO_WVL_DIAG(JL,JWVL,JVAR) = PSURF%PSD_VD(JL,YSD_VD%YAERO_WVL_DIAG(JWVL,JVAR)%MP) + ENDDO + ENDDO + ENDDO + + ZTAUS_AER = 0._JPRB ZTAUA_AER = 0._JPRB ZPMAER = 0._JPRB From 3f53d322a67a50c197af077a94878f47fe0ed293 Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Thu, 18 Dec 2025 11:06:46 +0100 Subject: [PATCH 109/129] Remove unneeded initialization of variables --- ifs-source/arpifs/m7/module/mo_ham_rad.F90 | 24 +++++++--------------- ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 | 2 +- 2 files changed, 8 insertions(+), 18 deletions(-) diff --git a/ifs-source/arpifs/m7/module/mo_ham_rad.F90 b/ifs-source/arpifs/m7/module/mo_ham_rad.F90 index 51da3f93..b2c34bf7 100755 --- a/ifs-source/arpifs/m7/module/mo_ham_rad.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_rad.F90 @@ -1039,9 +1039,9 @@ SUBROUTINE ham_rad(kproma, kbdim, klev, krow, kpband, kb_sw, & !gf: the former usage of nr(1:kproma,:,jwv,jclass) and ni(1:kproma,:,jwv,jclass) ! directly in the call to ham_rad_refrac is causing architecture-dependent problems (Cray XT5) ! Therefore intermediate variables znr2d and zni2d are introduced - - znr2d(1:kproma,:) = nr(1:kproma,:,jwv,jclass) - zni2d(1:kproma,:) = ni(1:kproma,:,jwv,jclass) + !pls: no need to intialize them, they are intent(out) in ham_rad_refrac. Comment these 2 lines: + ! znr2d(1:kproma,:) = nr(1:kproma,:,jwv,jclass) + ! zni2d(1:kproma,:) = ni(1:kproma,:,jwv,jclass) CALL ham_rad_refrac(kproma, kbdim, klev, krow, & ntrac, jclass, jwv, & @@ -1216,9 +1216,9 @@ SUBROUTINE ham_rad(kproma, kbdim, klev, krow, kpband, kb_sw, & !gf: the former usage of nr(1:kproma,:,jwv,jclass) and ni(1:kproma,:,jwv,jclass) ! directly in the call to ham_rad_refrac is causing architecture-dependent problems (Cray XT5) ! Therefore intermediate variables znr2d and zni2d are introduced - - znr2d(1:kproma,:) = nr(1:kproma,:,jlwv,jclass) - zni2d(1:kproma,:) = ni(1:kproma,:,jlwv,jclass) + !pls: no need to intialize them, they are intent(out) in ham_rad_refrac. Comment these 2 lines: + ! znr2d(1:kproma,:) = nr(1:kproma,:,jlwv,jclass) + ! zni2d(1:kproma,:) = ni(1:kproma,:,jlwv,jclass) CALL ham_rad_refrac(kproma, kbdim, klev, krow, & ntrac, jclass, jlwv, & @@ -1347,9 +1347,7 @@ SUBROUTINE ham_rad(kproma, kbdim, klev, krow, kpband, kb_sw, & !--- 1.1) Calculate volume averaged refractive index nr and ni: #ifdef HAMMOZ IF (ltimer) CALL timer_start(timer_ham_rad_refrac) -#endif - znr2d(1:kproma,:) = nr_diag(1:kproma,:,jwv,jclass) - zni2d(1:kproma,:) = ni_diag(1:kproma,:,jwv,jclass) +#endif ! Fill znr2d(1:kproma,:) with interpolated values; to becopied into nr_diag(1:kproma,:,jwv,jclass) ! ! 3.46, 2.79, 2.33, 2.05, 1.78, 1.46, 1.27, 1.01, 0.70, 0.53, 0.39, 0.30, 0.23, 8.02 [um] @@ -1548,23 +1546,15 @@ SUBROUTINE interp_refr_index(kproma, kbdim, klev, wl_in, nr_in, wl_out, nr_out) ! ---- Sort wl_in (insertion sort) ---- ! nearest smaller/equal - !write(*,*)"wl_in",wl_in - !write(*,*)"wl_out",wl_out val_low = maxval(pack(wl_in, wl_in <= wl_out)) idx_low = maxloc(wl_in, mask = wl_in == val_low, dim=1) - !write(*,*)"val_low ",val_low - !write(*,*)"idx_low ",idx_low ! nearest larger/equal val_high = minval(pack(wl_in, wl_in > wl_out)) idx_high = maxloc(wl_in, mask = wl_in == val_high, dim=1) - !write(*,*)"val_high ",val_high - !write(*,*)"idx_high ",idx_high weight = (wl_out-val_low)/(val_high-val_low) - !write(*,*)"wl_out",wl_out - nr_out(1:kproma,1:klev) = (1.0_dp - weight) * nr_in(1:kproma,:,idx_low)+ weight*nr_in(1:kproma,:,idx_high) END SUBROUTINE interp_refr_index diff --git a/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 index aeb477e8..123b3066 100644 --- a/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 +++ b/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 @@ -118,7 +118,7 @@ SUBROUTINE TM5M7_SRC( & ! RCHG -> try to understand what is 12 and 9 here. REAL(KIND=JPRB), INTENT(INOUT) :: PAERFLX(KLON,12,9) -REAL(KIND=JPRB),INTENT(INOUT) :: PCFLX(KLON,KTRAC) +REAL(KIND=JPRB), INTENT(INOUT) :: PCFLX(KLON,KTRAC) REAL(KIND=JPRB), INTENT(IN) :: PCVL(KLON), PCVH(KLON) ! Low/High vegetation cover INTEGER(KIND=JPIM), INTENT(IN) :: KTVL(KLON), KTVH(KLON) ! Low/High vegetation type From 1a7efaeec6c4c8db614198d106e16ff7be1d84a2 Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Thu, 18 Dec 2025 10:43:18 +0000 Subject: [PATCH 110/129] Pull request #66: Update dry-to-wet radius conversion factor for seasalt Merge in ~NM6/openifs-48r1 from bugfix/OIFS-650-ss-dry2wet-radius-conversion to knmi-m7 Squashed commit of the following: commit 7e36d43ce73db369af12c4315beff843734ba2ea Author: Philippe Le Sager Date: Thu Dec 18 11:40:11 2025 +0100 Update dry-to-wet radius conversion factor for seasalt --- ifs-source/arpifs/m7/module/mo_ham_m7_emi_seasalt.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ifs-source/arpifs/m7/module/mo_ham_m7_emi_seasalt.f90 b/ifs-source/arpifs/m7/module/mo_ham_m7_emi_seasalt.f90 index fa01415a..daf3f759 100644 --- a/ifs-source/arpifs/m7/module/mo_ham_m7_emi_seasalt.f90 +++ b/ifs-source/arpifs/m7/module/mo_ham_m7_emi_seasalt.f90 @@ -149,7 +149,7 @@ SUBROUTINE start_emi_seasalt ! wet radius (um) at RH=80% - rm(:) = 1.814_dp*rd(:)*1.E+06_dp + rm(:) = 2.0_dp*rd(:)*1.E+06_dp #ifdef HAMMOZ ! B: monahan and guelle schemes, also for larger particle in Gong scheme bmn(:) = ( 0.380_dp - LOG10( rm(:) ) ) / 0.650_dp From 9b7476b14685350fdfdb0a9a7dbaf3f671e69026 Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Wed, 14 Jan 2026 10:09:15 +0000 Subject: [PATCH 111/129] Pull request #65: Fix date handling in CMIP strat aero (restart and long run) Merge in ~NM6/openifs-48r1 from bugfix/calendar-strataero to knmi-m7 Squashed commit of the following: commit 1cf0a56d3eaec39fab18e531809f706f12742624 Author: Philippe Le Sager Date: Wed Jan 7 18:36:49 2026 +0100 Fix handling of update flag commit d6214dfeb3a00a4c1647ce88cf5e7647dd0a53ee Author: Philippe Le Sager Date: Wed Dec 17 16:49:53 2025 +0100 Fix date retrieval for CMIP strat aero Accounts for long integrations --- .../arpifs/phys_ec/cmip_strato_aero.F90 | 45 ++++++++++++------- .../arpifs/phys_radi/radiation_scheme.F90 | 37 +++++++-------- ifs-source/arpifs/phys_radi/suecrad.F90 | 14 +++--- ifs-source/arpifs/utility/updtim.F90 | 10 +++-- 4 files changed, 63 insertions(+), 43 deletions(-) diff --git a/ifs-source/arpifs/phys_ec/cmip_strato_aero.F90 b/ifs-source/arpifs/phys_ec/cmip_strato_aero.F90 index ff8c3a8f..53d7cfd4 100755 --- a/ifs-source/arpifs/phys_ec/cmip_strato_aero.F90 +++ b/ifs-source/arpifs/phys_ec/cmip_strato_aero.F90 @@ -1,4 +1,4 @@ -SUBROUTINE CMIP_STRATO_AERO(YDMODEL) +SUBROUTINE CMIP_STRATO_AERO(YDMODEL,YDDYNA) ! PURPOSE. ! -------- @@ -35,10 +35,14 @@ SUBROUTINE CMIP_STRATO_AERO(YDMODEL) ! Modules USE NETCDF -USE PARKIND1, ONLY: JPIM, JPRB, JPRD +USE PARKIND1, ONLY: JPIM, JPIB, JPRB, JPRD USE YOMLUN, ONLY: NULOUT, NULERR +USE YOMDYNA, ONLY: TDYNA +USE YOMCT0, ONLY: LNF +USE YOMCT2, ONLY: NSTAR2 +USE YOMCST, ONLY: RDAY USE YOMRIP0, ONLY: NINDAT -USE YOEAEROP, ONLY :STRATO_FIRSTYEAR, STRATO_CMIP_NLAT, STRATO_CMIP_NALT, STRATO_CMIP_NTIME, & +USE YOEAEROP, ONLY: STRATO_FIRSTYEAR, STRATO_CMIP_NLAT, STRATO_CMIP_NALT, STRATO_CMIP_NTIME, & & STRATO_LASTYEAR, STRATO_CMIP_LAT, STRATO_CMIP_SB, STRATO_CMIP_TB,& & STRATO_CMIP_NSB, STRATO_CMIP_NTB, & & STRATO_CMIP_NMONTH, & @@ -50,11 +54,13 @@ SUBROUTINE CMIP_STRATO_AERO(YDMODEL) IMPLICIT NONE -TYPE(MODEL), INTENT(INOUT) :: YDMODEL +TYPE(MODEL), INTENT(INOUT) :: YDMODEL +TYPE(TDYNA), INTENT(IN) :: YDDYNA ! Local variables INTEGER :: IUNIT,FORC_MONTH INTEGER(KIND=JPIM) :: ILAT, ILEV, ILON, IMONTH,IB, JLEV -INTEGER(KIND=JPIM) :: IJ0, IM0, IA0, IDAY, IMON, IMODYR, ILMOIS(12) +INTEGER(KIND=JPIM) :: ISTADD, IJ0, IM0, IA0, IDAY, IMON, IMODYR, ILMOIS(12) +INTEGER(KIND=JPIB) :: ITIME, IZT INTEGER(KIND=JPIM) :: IYR1, IMV1 INTEGER(KIND=JPIM), SAVE :: IMONOLD=-999 INTEGER(KIND=JPIM), PARAMETER :: ITAG = 98684 @@ -108,9 +114,9 @@ SUBROUTINE CMIP_STRATO_AERO(YDMODEL) & YDRIP=>YDMODEL%YRML_GCONF%YRRIP& ) -ASSOCIATE(& - & YDAERSTRAT => YDPHYAER%YREAEROSTRAT & - ) +ASSOCIATE(NSTADD=>YDRIP%NSTADD, TSTEP=>YDRIP%TSTEP) + +ASSOCIATE(YDAERSTRAT => YDPHYAER%YREAEROSTRAT) ASSOCIATE(& & LSTRATAERO_UPDATED=>YDERAD%LSTRATAERO_UPDATED, CCMIP_STRAT_FULL=>YDERAD%CCMIP_STRAT_FULL, & @@ -126,12 +132,23 @@ SUBROUTINE CMIP_STRATO_AERO(YDMODEL) & AAOD_EARTH_MEAN=>YDAERSTRAT%AAOD_EARTH_MEAN, AAOD_EARTH=>YDAERSTRAT%AAOD_EARTH& ) +! Number of steps since start of integration +IF(.NOT.LNF.AND.NSTADD == 0) THEN ! is restart + IF (YDDYNA%LTWOTL) THEN + IZT=NINT(TSTEP*(REAL(NSTAR2,JPRB)+0.5_JPRB), KIND=JPIB) + ELSE + ITIME=NINT(TSTEP, KIND=JPIB) + IZT=ITIME*INT(NSTAR2, KIND=JPIB) + ENDIF + ISTADD=INT(IZT/NINT(RDAY, KIND=JPIB), KIND=JPIM) +ELSE + ISTADD=NSTADD +ENDIF -! What is the date please? IJ0=NDD(NINDAT) IM0=NMM(NINDAT) IA0=NCCAA(NINDAT) -CALL UPDCAL(IJ0,IM0,IA0,YDRIP%NSTADD,IDAY,IMON,IMODYR,ILMOIS,NULOUT) +CALL UPDCAL(IJ0,IM0,IA0,ISTADD,IDAY,IMON,IMODYR,ILMOIS,NULOUT) ! Open the file only if we begin a new month and I am the master process NEWMONTH: IF (IMON/=IMONOLD) THEN @@ -853,12 +870,7 @@ SUBROUTINE CMIP_STRATO_AERO(YDMODEL) ENDIF ROOT CALL BROADCAST_AER_CMIP_PROP(YDMODEL) - LSTRATAERO_UPDATED = .TRUE. - -ELSE - - !DBG WRITE(NULOUT,*)'Same month in CMIP_STRATO_AERO -> nothing to update ' - LSTRATAERO_UPDATED = .FALSE. + LSTRATAERO_UPDATED = .TRUE. ! In effect it means "need remapping" ENDIF NEWMONTH @@ -866,6 +878,7 @@ SUBROUTINE CMIP_STRATO_AERO(YDMODEL) END ASSOCIATE END ASSOCIATE END ASSOCIATE +END ASSOCIATE IF (LHOOK) CALL DR_HOOK('CMIP_STRATO_AERO',1,ZHOOK_HANDLE) diff --git a/ifs-source/arpifs/phys_radi/radiation_scheme.F90 b/ifs-source/arpifs/phys_radi/radiation_scheme.F90 index cf7e2097..9ad03df4 100644 --- a/ifs-source/arpifs/phys_radi/radiation_scheme.F90 +++ b/ifs-source/arpifs/phys_radi/radiation_scheme.F90 @@ -662,25 +662,26 @@ SUBROUTINE RADIATION_SCHEME & ZREFAODSTRAT(:,:,:)=0.0_JPRB ZAAODSTRAT_LW(:,:,:)=0.0_JPRB IF (YRERAD%LCMIP_STRATAER_CMIP6 .OR. YRERAD%LCMIP_STRATAER_CMIP7) THEN - IF (YRERAD%LSTRATAERO_UPDATED) THEN - - ! Read the data, only one time per month - CALL CMIP_STRATO_AERO_INTERP (YDMODEL, KIDIA, KFDIA, KLON, KLEV, 1 , 0, & - & PPRESSURE_H, PGELAM, PGEMU, & - & ZAODSTRAT_M, ZAAODSTRAT_M, ZREFAODSTRAT_M, ZAAODSTRAT_LW_M) - - YDAERSTRAT%STRAT_AOD(KIDIA:KFDIA,:,:,:,KBL) = ZAODSTRAT_M(KIDIA:KFDIA,:,:,:) - YDAERSTRAT%STRAT_AAOD(KIDIA:KFDIA,:,:,:,KBL) = ZAAODSTRAT_M(KIDIA:KFDIA,:,:,:) - YDAERSTRAT%STRAT_REFAOD(KIDIA:KFDIA,:,:,:,KBL)= ZREFAODSTRAT_M(KIDIA:KFDIA,:,:,:) - YDAERSTRAT%STRAT_AAOD_LW(KIDIA:KFDIA,:,:,:,KBL) = ZAAODSTRAT_LW_M(KIDIA:KFDIA,:,:,:) + + ! Interpolate only if new data have been read + IF (YRERAD%LSTRATAERO_UPDATED) THEN - ELSE - ! no new data, use the last computed values - ZAODSTRAT_M(KIDIA:KFDIA,:,:,:) = YDAERSTRAT%STRAT_AOD(KIDIA:KFDIA,:,:,:,KBL) - ZAAODSTRAT_M(KIDIA:KFDIA,:,:,:) = YDAERSTRAT%STRAT_AAOD(KIDIA:KFDIA,:,:,:,KBL) - ZREFAODSTRAT_M(KIDIA:KFDIA,:,:,:) = YDAERSTRAT%STRAT_REFAOD(KIDIA:KFDIA,:,:,:,KBL) - ZAAODSTRAT_LW_M(KIDIA:KFDIA,:,:,:) = YDAERSTRAT%STRAT_AAOD_LW(KIDIA:KFDIA,:,:,:,KBL) - ENDIF + CALL CMIP_STRATO_AERO_INTERP (YDMODEL, KIDIA, KFDIA, KLON, KLEV, 1 , 0, & + & PPRESSURE_H, PGELAM, PGEMU, & + & ZAODSTRAT_M, ZAAODSTRAT_M, ZREFAODSTRAT_M, ZAAODSTRAT_LW_M) + + YDAERSTRAT%STRAT_AOD(KIDIA:KFDIA,:,:,:,KBL) = ZAODSTRAT_M(KIDIA:KFDIA,:,:,:) + YDAERSTRAT%STRAT_AAOD(KIDIA:KFDIA,:,:,:,KBL) = ZAAODSTRAT_M(KIDIA:KFDIA,:,:,:) + YDAERSTRAT%STRAT_REFAOD(KIDIA:KFDIA,:,:,:,KBL)= ZREFAODSTRAT_M(KIDIA:KFDIA,:,:,:) + YDAERSTRAT%STRAT_AAOD_LW(KIDIA:KFDIA,:,:,:,KBL) = ZAAODSTRAT_LW_M(KIDIA:KFDIA,:,:,:) + YRERAD%LSTRATAERO_UPDATED = .FALSE. + ELSE + ! no new data, use the last computed values + ZAODSTRAT_M(KIDIA:KFDIA,:,:,:) = YDAERSTRAT%STRAT_AOD(KIDIA:KFDIA,:,:,:,KBL) + ZAAODSTRAT_M(KIDIA:KFDIA,:,:,:) = YDAERSTRAT%STRAT_AAOD(KIDIA:KFDIA,:,:,:,KBL) + ZREFAODSTRAT_M(KIDIA:KFDIA,:,:,:) = YDAERSTRAT%STRAT_REFAOD(KIDIA:KFDIA,:,:,:,KBL) + ZAAODSTRAT_LW_M(KIDIA:KFDIA,:,:,:) = YDAERSTRAT%STRAT_AAOD_LW(KIDIA:KFDIA,:,:,:,KBL) + ENDIF ! Time interpolation and excluding the data below the tropopause, each timestep. CALL CMIP_STRATO_AERO_PROCESS (YDMODEL,KIDIA, KFDIA, KLON, KLEV, 1 , 0, & diff --git a/ifs-source/arpifs/phys_radi/suecrad.F90 b/ifs-source/arpifs/phys_radi/suecrad.F90 index 4951eea2..ba7e3074 100644 --- a/ifs-source/arpifs/phys_radi/suecrad.F90 +++ b/ifs-source/arpifs/phys_radi/suecrad.F90 @@ -293,6 +293,7 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) CHARACTER(LEN=500), POINTER ::CCMIP_STRAT_FULL, CCMIP_STRAT_FULL_CLIM LOGICAL, POINTER :: LCMIP_STRATAER_BCKGD, LCMIP_STRATAER_CMIP6, LCMIP_STRATAER_CMIP7 +LOGICAL, POINTER :: LSTRATAERO_UPDATED #include "naerad.nam.h" #include "naercli.nam.h" @@ -359,11 +360,12 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) & LHLRADUPD=>YDPHY%LHLRADUPD, RADGR=>YDPARAR%RADGR, RADSN=>YDPARAR%RADSN) ! Associate pointers for variables in namelist NAERAD -CCMIP_STRAT_FULL=>YDERAD%CCMIP_STRAT_FULL -CCMIP_STRAT_FULL_CLIM=>YDERAD%CCMIP_STRAT_FULL_CLIM -LCMIP_STRATAER_BCKGD=>YDERAD%LCMIP_STRATAER_BCKGD -LCMIP_STRATAER_CMIP6=>YDERAD%LCMIP_STRATAER_CMIP6 -LCMIP_STRATAER_CMIP7=>YDERAD%LCMIP_STRATAER_CMIP7 +CCMIP_STRAT_FULL => YDERAD%CCMIP_STRAT_FULL +CCMIP_STRAT_FULL_CLIM => YDERAD%CCMIP_STRAT_FULL_CLIM +LCMIP_STRATAER_BCKGD => YDERAD%LCMIP_STRATAER_BCKGD +LCMIP_STRATAER_CMIP6 => YDERAD%LCMIP_STRATAER_CMIP6 +LCMIP_STRATAER_CMIP7 => YDERAD%LCMIP_STRATAER_CMIP7 +LSTRATAERO_UPDATED => YDERAD%LSTRATAERO_UPDATED NCLOUDACT => YDERAD%NCLOUDACT NAEROOPT => YDERAD%NAEROOPT @@ -539,6 +541,8 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) LCMIP_STRATAER_CMIP7=.FALSE. CCMIP_STRAT_FULL='' CCMIP_STRAT_FULL_CLIM='' +LSTRATAERO_UPDATED = .FALSE. + ! Cloud activation scheme NCLOUDACT= 0 ! 0: effective radius from IFS code and default activation ! 1: use Morales & Nenes activation scheme from HAMM7 diff --git a/ifs-source/arpifs/utility/updtim.F90 b/ifs-source/arpifs/utility/updtim.F90 index 6240e997..2fae145b 100644 --- a/ifs-source/arpifs/utility/updtim.F90 +++ b/ifs-source/arpifs/utility/updtim.F90 @@ -762,10 +762,12 @@ SUBROUTINE UPDTIM(YDGEOMETRY,YDFIELDS,YDMODEL,KSTEP,PTDT,PTSTEP,LDCLUPD,LDUPDECA ENDIF ENDIF CALL GSTATS(1904,1) - !CMIP6/7 stratospheric aerosols - IF (LCMIP_STRATAER_CMIP6 .OR. LCMIP_STRATAER_CMIP7) THEN - CALL CMIP_STRATO_AERO(YDMODEL) - ENDIF + + ! CMIP6/7 stratospheric aerosols optical properties + IF (LCMIP_STRATAER_CMIP6 .OR. LCMIP_STRATAER_CMIP7) THEN + CALL CMIP_STRATO_AERO(YDMODEL,YDDYNA) + ENDIF + IF (LRMU0M) THEN ZSTATI=REAL(IZT,JPRB)+NRADFR*ITIME ZTIMTR=RTIMST+ZSTATI From bec33341bfb70e87c5c6e6b9f06ddc3940cff4a9 Mon Sep 17 00:00:00 2001 From: Tommi Bergman Date: Wed, 14 Jan 2026 15:32:14 +0000 Subject: [PATCH 112/129] Pull request #64: OIFS-632 Back port PM diagnostics from CAMS/IFS Merge in ~NM6/openifs-48r1 from feature/OIFS-632-back-port-pm-output-from-cams-ifs to knmi-m7 Squashed commit of the following: commit 3639ccec1825d31b20975173b05ac6b262a4447d Merge: 2dbe850 a7f1335 Author: Philippe Le Sager Date: Wed Jan 14 16:29:52 2026 +0100 Merge 'origin/knmi-m7' into feature/OIFS-632-back-port-pm-output-from-cams-ifs commit 2dbe850d8ca6b286a71084dc5a00b11b763b640d Author: Tommi Bergman Date: Wed Jan 14 14:24:46 2026 +0000 cleanup commit 0b396b53c9dffb830b69ae3ad968e3582187f941 Merge: 28cccb7 20faee6 Author: Philippe Le Sager Date: Thu Dec 18 12:00:42 2025 +0100 Merge 'knmi-m7' into feature/OIFS-632-back-port-pm-output-from-cams commit 28cccb7d135518200ebdde65ec9d470e2295e94c Author: Tommi Bergman Date: Thu Dec 18 08:01:35 2025 +0000 remove input parameter which is not needed anymore commit 43c6815f72e7e90f7ccfc69a435e8ac82c09542b Author: Tommi Bergman Date: Wed Dec 17 11:54:02 2025 +0000 latest updates from CAMS + cleanup commit 4ff3e70c11c18ebef4d37dc6e22fb0f287cdf935 Author: tommibergman Date: Fri Oct 17 16:24:00 2025 +0300 Add PM 1, 2.5 and 10 calculations --- ifs-source/arpifs/m7/hamm7_diag_pm.F90 | 221 ++++++++++++++++++ .../arpifs/m7/phys_ec/hamm7_interface.F90 | 13 +- ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 | 4 +- 3 files changed, 234 insertions(+), 4 deletions(-) create mode 100644 ifs-source/arpifs/m7/hamm7_diag_pm.F90 diff --git a/ifs-source/arpifs/m7/hamm7_diag_pm.F90 b/ifs-source/arpifs/m7/hamm7_diag_pm.F90 new file mode 100644 index 00000000..fc918838 --- /dev/null +++ b/ifs-source/arpifs/m7/hamm7_diag_pm.F90 @@ -0,0 +1,221 @@ +SUBROUTINE HAMM7_DIAG_PM & + &( YDMODEL, KIDIA , KFDIA , KLON , KLEV , NAERO, & + & PAEROP,PAEPM1,PAEPM25,PAEPM10,PRHO, PDRYRADIUS, PWETRADIUS, PRHOP) + +! ╭────────────────────────────────────────────────────────────────────────────╮ +! │ │ +! │ Purpose : │ +! │ ------- │ +! │ *hamm7_diag_pm* - │ +! │ │ +! │ │ +! │ Interface : │ +! │ --------- │ +! │ *HAMM7_DIAG_PM* is called from HAMM7_INTERFACE │ +! │ │ +! │ │ +! │ Input : │ +! │ ----- │ +! │ Dimensions │ +! │ Aerosol mass mixing │ +! │ aerosol mode sizes │ +! │ aerosol densitities │ +! │ │ +! │ Output : │ +! │ ------ │ +! │ PAEPM1 PM1 consentration │ +! │ PAEPM25 PM2.5 consentration │ +! │ PAEPM10 PM10 consentration │ +! │ │ +! │ Method : │ +! │ ------ │ +! │ Calcluate particulate concentration for given │ +! │ aerosol size limits. Takes into account that observations. │ +! │ select particles with aerodynmic diameter while mass is calculated │ +! │ from dry mass. │ +! │ │ +! │ Reference : │ +! │ --------- │ +! │ │ +! │ Author : │ +! │ ------- │ +! │ Orginal version: │ +! │ Tommi Bergman (FMI) │ +! │ │ +! │ Modifications : │ +! │ ------------- │ +! │ │ +! ╰────────────────────────────────────────────────────────────────────────────╯ +USE TYPE_MODEL, ONLY : MODEL +USE MO_HAM, ONLY : sigma_fine, sigma_coarse, nsol, nclass +USE PARKIND1, ONLY : JPIM, JPRB +USE YOMHOOK, ONLY : LHOOK, DR_HOOK, JPHOOK +USE mo_ham_m7ctl, ONLY : cmedr2mmedr + +IMPLICIT NONE + +TYPE(MODEL) , INTENT(IN) :: YDMODEL ! For finding tracer indices +INTEGER(KIND=JPIM), INTENT(IN) :: KLON +INTEGER(KIND=JPIM), INTENT(IN) :: KIDIA +INTEGER(KIND=JPIM), INTENT(IN) :: KFDIA +INTEGER(KIND=JPIM), INTENT(IN) :: KLEV +INTEGER(KIND=JPIM), INTENT(IN) :: NAERO ! Number of active aerosol species +REAL(KIND=JPRB), INTENT(IN) :: PAEROP(KLON,KLEV,NAERO) ! aerosol mass mixing ratios + +REAL(KIND=JPRB), INTENT(OUT) :: PAEPM1(KLON),PAEPM25(KLON),PAEPM10(KLON) ! PM output variables +REAL(KIND=JPRB), INTENT(IN) :: PDRYRADIUS(KLON,KLEV,NSOL) ! Dry radii of particles (only for soluble classes) +REAL(KIND=JPRB), INTENT(IN) :: PWETRADIUS(KLON,KLEV,NCLASS) ! Wet radii of particles (actually dry for insoluble) +REAL(KIND=JPRB), INTENT(IN) :: PRHOP(KLON,KLEV,NCLASS) ! Particle density +REAL(KIND=JPRB), INTENT(IN) :: PRHO(KLON,KLEV) ! Air density Kg(air)/M3 for unit conversion + +!* 0.1 LOCAL VARIABLES + +INTEGER(KIND=JPIM) :: JAER, JL + +! inidices for modes in local ZMASSDRYDIAMETER (also in pwetradius and dryradius (1-4)) + +INTEGER(KIND=JPIM), PARAMETER :: I_NS = 1 ! Nucleation mode +!INTEGER(KIND=JPIM), PARAMETER :: I_KS = 2 ! Aitken soluble (not needed at the moment) +INTEGER(KIND=JPIM), PARAMETER :: I_AS = 3 ! accumulation soluble +INTEGER(KIND=JPIM), PARAMETER :: I_CS = 4 ! coarse soluble +INTEGER(KIND=JPIM), PARAMETER :: I_KI = 5 ! Aitken insoluble +INTEGER(KIND=JPIM), PARAMETER :: I_AI = 6 ! accumulation insoluble +INTEGER(KIND=JPIM), PARAMETER :: I_CI = 7 ! coarse insoluble + +INTEGER(KIND=JPIM) :: ICLASS ! loop index +INTEGER(KIND=JPIM) :: IPM ! loop index + +REAL(KIND=JPRB) :: ZPM_FRACTION(3) ! Fraction of mass in the PM range temporary for a mode +REAL(KIND=JPRB) :: ZPM_LIMIT(3) ! diameter limits for the three PM +REAL(KIND=JPRB) :: ZDRYRADIUS(KLON,KLEV,NCLASS) ! count median dry radii of the M7 classes (modes) +REAL(KIND=JPRB) :: ZMASSDRYDIAMETER(KLON,KLEV,NCLASS) ! mass median dry diameters + +REAL(KIND=JPRB) :: ZHR ! Temporary variable +REAL(KIND=JPRB) :: ZTMP ! Temporary variable + +INTRINSIC ERF + +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE +!----------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('HAMM7_DIAG_PM',0,ZHOOK_HANDLE) +ASSOCIATE( YAERO_NL => YDMODEL%YRML_GCONF%YGFL%YAERO_NL ) + +!* 0.5 Initialisations + +! output +PAEPM1(:) = 0.0_JPRB +PAEPM25(:) = 0.0_JPRB +PAEPM10(:) = 0.0_JPRB + +! local variables +ZDRYRADIUS(:,:,:) = 0.0_JPRB +ZMASSDRYDIAMETER(:,:,:) = 0.0_JPRB + +! Size limits +ZPM_LIMIT(1) = 1.0e-6_JPRB ! sizelimit for PM1 +ZPM_LIMIT(2) = 2.5e-6_JPRB ! sizelimit for PM2.5 +ZPM_LIMIT(3) = 1.0e-5_JPRB ! sizelimit for PM10 +ZPM_FRACTION(:) = 0.0_JPRB + +! dry radii into one array +ZDRYRADIUS(KIDIA:KFDIA, 1:KLEV, I_NS:I_CS) = PDRYRADIUS(KIDIA:KFDIA, 1:KLEV, I_NS:I_CS) ! Dry radius defined only for soluble modes +ZDRYRADIUS(KIDIA:KFDIA, 1:KLEV, I_KI:I_CI) = PWETRADIUS(KIDIA:KFDIA, 1:KLEV, I_KI:I_CI) ! for Insoluble WET=DRY + +! change count median radii to mass median diameter +do iclass=1,nclass + ZMASSDRYDIAMETER(KIDIA:KFDIA, 1:KLEV, iclass) = 2.0_JPRB * ZDRYRADIUS(KIDIA:KFDIA, 1:KLEV, iclass) * cmedr2mmedr(iclass) +ENDDO + +! determine PMs +DO JAER=1,NAERO + IF ((INDEX(YAERO_NL(JAER)%CNAME ,'NS')>0 ) .or. (INDEX(YAERO_NL(JAER)%CNAME ,'KS')>0) .or.& + & (INDEX(YAERO_NL(JAER)%CNAME ,'KI')>0 ) ) THEN + ! exclude Number concentrations e.g. "xxxAS_N" + IF(INDEX(YAERO_NL(JAER)%CNAME ,'_N') ==0 ) THEN + DO JL=KIDIA,KFDIA + PAEPM1(JL) = PAEPM1(JL) + PAEROP(JL,KLEV,JAER) * PRHO(JL,KLEV) + PAEPM25(JL) = PAEPM25(JL) + PAEROP(JL,KLEV,JAER) * PRHO(JL,KLEV) + PAEPM10(JL) = PAEPM10(JL) + PAEROP(JL,KLEV,JAER) * PRHO(JL,KLEV) + ENDDO + ENDIF + ELSEIF((INDEX(YAERO_NL(JAER)%CNAME ,'AS')>0 ) ) THEN + ! exclude Number concentrations e.g. "xxxAS_N" + IF(INDEX(YAERO_NL(JAER)%CNAME ,'_N') ==0 ) THEN ! exclude number mixing ratios + DO JL=KIDIA,KFDIA + if ((ZMASSDRYDIAMETER(JL,KLEV,I_AS))>1e-20_JPRB) then + ZHR = 0.5 * SQRT(2.0) + DO IPM=1,3 + ! the limit is multiplied to account for aerodynamic diameter (in contrast to geometric mean diameter) + ZTMP = ( log(ZPM_LIMIT(IPM)*((1000./prhop(JL,KLEV,I_AS))**0.5)) & + & - log(ZMASSDRYDIAMETER(JL,KLEV,I_AS) ) ) / log(sigma_fine) + ZPM_FRACTION(IPM) = 0.5 + 0.5 * ERF(ZTMP * ZHR) + ENDDO + PAEPM1(JL) = PAEPM1(JL) + ZPM_FRACTION(1) * PAEROP(JL,KLEV,JAER) * PRHO(JL,KLEV) + PAEPM25(JL) = PAEPM25(JL) + ZPM_FRACTION(2) * PAEROP(JL,KLEV,JAER) * PRHO(JL,KLEV) + PAEPM10(JL) = PAEPM10(JL) + ZPM_FRACTION(3) * PAEROP(JL,KLEV,JAER) * PRHO(JL,KLEV) + ENDIF + ENDDO + ENDIF + ELSEIF((INDEX(YAERO_NL(JAER)%CNAME ,'AI')>0 ) ) THEN + ! exclude Number concentrations e.g. "xxxAS_N" + IF(INDEX(YAERO_NL(JAER)%CNAME ,'_N') ==0 ) THEN ! exclude number mixing ratios + DO JL=KIDIA,KFDIA + if ((ZMASSDRYDIAMETER(JL,KLEV,I_AI))>1e-20_JPRB) then + ZHR = 0.5 * SQRT(2.0) + DO IPM=1,3 + ! the limit is multiplied to account for aerodynamic diameter (in contrast to geometric mean diameter) + ZTMP = ( log(ZPM_LIMIT(IPM)*((1000./prhop(JL,KLEV,I_AI))**0.5)) & + & - log(ZMASSDRYDIAMETER(JL,KLEV,I_AI) ) ) / log(sigma_fine) + ZPM_FRACTION(IPM) = 0.5 + 0.5 * ERF(ZTMP * ZHR) + ENDDO + PAEPM1(JL) = PAEPM1(JL) + ZPM_FRACTION(1) * PAEROP(JL,KLEV,JAER) * PRHO(JL,KLEV) + PAEPM25(JL) = PAEPM25(JL) + ZPM_FRACTION(2) * PAEROP(JL,KLEV,JAER) * PRHO(JL,KLEV) + PAEPM10(JL) = PAEPM10(JL) + ZPM_FRACTION(3) * PAEROP(JL,KLEV,JAER) * PRHO(JL,KLEV) + ENDIF + ENDDO + ENDIF + ELSEIF((INDEX(YAERO_NL(JAER)%CNAME ,'CS')>0 ) ) THEN + ! exclude Number concentrations e.g. "xxxAS_N" + IF(INDEX(YAERO_NL(JAER)%CNAME ,'_N') ==0 ) THEN ! exclude number mixing ratios + DO JL=KIDIA,KFDIA + if ((ZMASSDRYDIAMETER(JL,KLEV,I_CS))>1e-20_JPRB) then + ZHR = 0.5 * SQRT(2.0) + DO IPM=1,3 + ! the limit is multiplied to account for aerodynamic diameter (in contrast to geometric mean diameter) + ZTMP = ( log(ZPM_LIMIT(IPM)*((1000./prhop(JL,KLEV,I_CS))**0.5)) & + & - log( ZMASSDRYDIAMETER(JL,KLEV,I_CS) ) ) / log(sigma_coarse) + ZPM_FRACTION(IPM) = 0.5 + 0.5 * ERF(ZTMP * ZHR) + ENDDO + PAEPM1(JL) = PAEPM1(JL) + ZPM_FRACTION(1) * PAEROP(JL,KLEV,JAER) * PRHO(JL,KLEV) + PAEPM25(JL) = PAEPM25(JL) + ZPM_FRACTION(2) * PAEROP(JL,KLEV,JAER) * PRHO(JL,KLEV) + PAEPM10(JL) = PAEPM10(JL) + ZPM_FRACTION(3) * PAEROP(JL,KLEV,JAER) * PRHO(JL,KLEV) + ENDIF + ENDDO + ENDIF + ELSEIF (INDEX(YAERO_NL(JAER)%CNAME ,'CI')>0) THEN + ! exclude Number concentrations e.g. "xxxAS_N" + IF(INDEX(YAERO_NL(JAER)%CNAME ,'_N') ==0 ) THEN ! exclude number mixing ratios + DO JL=KIDIA,KFDIA + if ((ZMASSDRYDIAMETER(JL,KLEV,I_CI))>1e-20_JPRB) then + ZHR = 0.5 * SQRT(2.0) + DO IPM=1,3 + ! the limit is multiplied to account for aerodynamic diameter (in contrast to geometric mean diameter) + ZTMP = ( log(ZPM_LIMIT(IPM)*((1000./prhop(JL,KLEV,I_CI))**0.5)) & + & - log( ZMASSDRYDIAMETER(JL,KLEV,I_CI) ) ) / log(sigma_coarse) + ZPM_FRACTION(IPM) = 0.5 + 0.5 * ERF(ZTMP * ZHR) + ENDDO + PAEPM1(JL) = PAEPM1(JL) + ZPM_FRACTION(1) * PAEROP(JL,KLEV,JAER) * PRHO(JL,KLEV) + PAEPM25(JL) = PAEPM25(JL) + ZPM_FRACTION(2) * PAEROP(JL,KLEV,JAER) * PRHO(JL,KLEV) + PAEPM10(JL) = PAEPM10(JL) + ZPM_FRACTION(3) * PAEROP(JL,KLEV,JAER) * PRHO(JL,KLEV) + ENDIF + ENDDO + + ENDIF + ENDIF +ENDDO + + + +END ASSOCIATE +IF (LHOOK) CALL DR_HOOK('HAMM7_DIAG_PM',1,ZHOOK_HANDLE) +END SUBROUTINE HAMM7_DIAG_PM diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index d86ea158..2fe64413 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -14,7 +14,8 @@ SUBROUTINE HAMM7_INTERFACE( & & PTAUS_AER, PTAUA_AER, PPMAER, & & PEXTRA, PVERVEL, PCCNL, PCCNO, PAHFSTI, PCI, PZ0M, & & PAHFLEV, PUP, PVP, PCVL, PCVH, PSO2DD, PGEMU, & - & PBLH, PSNOWACL, KCTOP, KCBOT) + & PBLH, PSNOWACL, KCTOP, KCBOT, & + & PAEPM1, PAEPM25, PAEPM10) ! ╭────────────────────────────────────────────────────────────────────────────╮ ! │ (updated 30-APR-2024) │ @@ -257,7 +258,10 @@ SUBROUTINE HAMM7_INTERFACE( & ! Simple sulfur scheme variables: REAL(KIND=JPRB),INTENT(INOUT) :: PSO2DD(KLON) REAL(KIND=JPRB),INTENT(IN) :: PBLH(KLON) ! Boundary layer height - +! PM output +REAL(KIND=JPRB),INTENT(OUT) :: PAEPM1(KLON) +REAL(KIND=JPRB),INTENT(OUT) :: PAEPM25(KLON) +REAL(KIND=JPRB),INTENT(OUT) :: PAEPM10(KLON) !* 0.5 LOCAL VARIABLES ! --------------- @@ -1951,6 +1955,11 @@ SUBROUTINE HAMM7_INTERFACE( & ENDDO +CALL HAMM7_DIAG_PM & + &( YDMODEL, KIDIA , KFDIA , KLON , KLEV , NAERO ,& + & PAEROP, & + & PAEPM1, PAEPM25, PAEPM10, & + & ZRHO, ZM6DRY, ZM6RP, ZRHOP) !* 7. STORE IN AEROUTs ! ------------------------------ diff --git a/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 b/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 index 8f7b8250..dd072477 100644 --- a/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 +++ b/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 @@ -266,8 +266,8 @@ SUBROUTINE AER_PHY3_LAYER(YDSURF, & !VH & PSURF%PSD_XA, PAUX%PVERVEL, AUXL%ZCCNL, AUXL%ZCCNO, PSURF%PAHFSTI, PSURF%PSD_VF(:,YSD_VF%YCI%MP), GEMSL%ZAZ0M, FLUX%PFTLHEV, & & STATE%U, STATE%V, PSURF%PCVL, PSURF%PCVH,PSURF%PSD_VF(:,YSD_VF%YSO2DD%MP), PAUX%PGEMU,PSURF%PSD_VD(:,YDSURF%YSD_VD%YBLH%MP), & - & PSNOWACL, PDIAG%ICTOP, PDIAG%ICBOT) !,ZTSO2,ZTSO4,ZTSO4_AQ,ZFSO2,ZFSO4 ,ZFSO4_AQ& - !&) ! u-wind,v-wind,low veg. cover, high veg. cover, sine of latitude + & PSNOWACL, PDIAG%ICTOP, PDIAG%ICBOT, & + & PSURF%PSD_VD(:,YSD_VD%YAEPM1%MP), PSURF%PSD_VD(:,YSD_VD%YAEPM25%MP), PSURF%PSD_VD(:,YSD_VD%YAEPM10%MP) ) DO JAER=1,YDMODEL%YRML_PHY_RAD%YRERAD%NTSW DO JK=1,KDIM%KLEV From 9cee6554698e54f2bdc9184321956ad6850dd82c Mon Sep 17 00:00:00 2001 From: Lianghai Wu Date: Wed, 28 Jan 2026 14:13:08 +0000 Subject: [PATCH 113/129] Pull request #69: Bugfix OIFS-665 (double counting dust/ss emissions) and OIFS-532 (tm5/bascoe scheme restartability) Fixes two bugs: - remove double counting of inline dust and seasalt emissions in case tracer transport by vertical diffusion is turned on (LVDFTRAC=T) - allow model to restart when using TM5 or BASCOE chemistry scheme Squashed commit of the following: commit a946dddf9d6ded046d764699897276c7c37ed5af Author: Philippe Le Sager Date: Wed Jan 28 15:05:34 2026 +0100 Fix restart for BASCOE scheme commit 499a516ee75a01e75ac85d95e1157b4c3197fbad Author: Philippe Le Sager Date: Wed Jan 28 14:44:37 2026 +0100 Remove unneeded debug comment commit 12665bb769b03251c855a6ab2ef941720e3c0927 Author: Lianghai Wu Date: Tue Jan 27 12:00:27 2026 +0000 cleanup commit f3dafae821ddfe96710adcde9ac79a86715253a1 Merge: 515edb8 9e46a70 Author: Lianghai Wu Date: Tue Jan 27 11:18:52 2026 +0000 Merge branch 'knmi-m7' of ssh://git.ecmwf.int/~nm6/openifs-48r1 into knmi-m7 commit 515edb88debb74484711f686e37870e059dbe384 Author: Lianghai Wu Date: Tue Jan 27 11:16:45 2026 +0000 avoid double accounting of sea salt and dust emissions commit 1107ec2f8f3ea84a7cedfa6794ba81d36729aabb Author: Lianghai Wu Date: Thu Jan 22 11:36:06 2026 +0000 full chem restartbility --- ifs-source/arpifs/chem/chem_bascoetm5.F90 | 4 ++-- ifs-source/arpifs/chem/chem_tm5.F90 | 4 ++-- ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 | 25 ++++++++++++++-------- 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/ifs-source/arpifs/chem/chem_bascoetm5.F90 b/ifs-source/arpifs/chem/chem_bascoetm5.F90 index fff33ead..d512f1cb 100644 --- a/ifs-source/arpifs/chem/chem_bascoetm5.F90 +++ b/ifs-source/arpifs/chem/chem_bascoetm5.F90 @@ -538,10 +538,10 @@ SUBROUTINE CHEM_BASCOETM5 & ! Compute here 'roundoff' number - there is a paralellization ! issue when calling WLMACH as part of kpp-code. -IF ( KSTEP == 0_JPIM ) THEN +!IF ( KSTEP == 0_JPIM ) THEN ! a more robust test on YDRIP%NSTADD instead of kstep, and done in a setup routine, should be devised CALL CIFS_KPP_WLAMCH(ROUNDOFF_BASCOE , 'E') ROUNDOFF_TM5=ROUNDOFF_BASCOE -ENDIF +!ENDIF ! 1.0 Initialize output tendencies to 0. PTENC1(KIDIA:KFDIA,:,:)=0.0_JPRB diff --git a/ifs-source/arpifs/chem/chem_tm5.F90 b/ifs-source/arpifs/chem/chem_tm5.F90 index 4c55e85a..ffe0c0c1 100644 --- a/ifs-source/arpifs/chem/chem_tm5.F90 +++ b/ifs-source/arpifs/chem/chem_tm5.F90 @@ -376,9 +376,9 @@ SUBROUTINE CHEM_TM5& ! Compute here 'roundoff' number - there is a paralellization ! issue when calling WLMACH as part of kpp-code. -IF ( KSTEP == 0_JPIM ) THEN +!IF ( KSTEP == 0_JPIM ) THEN ! a more robust test on YDRIP%NSTADD instead of kstep, and done in a setup routine, should be devised CALL CIFS_KPP_WLAMCH(ROUNDOFF_STORE , 'E') -ENDIF +!ENDIF JAER_TRACER(1)=ISO4 JAER_TRACER(2)=IMSA diff --git a/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 index 123b3066..526d29b1 100644 --- a/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 +++ b/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 @@ -224,6 +224,7 @@ SUBROUTINE TM5M7_SRC( & & RSIVSRA => YDEAERSRC%RSIVSRA, RCODECA => YDEAERSRC%RCODECA, & & RCOVSRA => YDEAERSRC%RCOVSRA, & & NLOENG => YDGEOMETRY%YRGEM%NLOENG, NGLOBALAT => YDGEOMETRY%YRMP%NGLOBALAT,& + & LVDFTRAC=> YDEPHY%LVDFTRAC, & & YSURF => YDEPHY%YSURF, LAERCHEM => YGFL%LAERCHEM) !VH maybe 43r3, only?? @@ -442,17 +443,23 @@ SUBROUTINE TM5M7_SRC( & ZCFLX(JL,KAERO(iduaci)) = emis_mass(mode_aci)%d3(JL,KLEV,1)*(-1._JPRB) ZCFLX(JL,KAERO(iducoi)) = emis_mass(mode_coi)%d3(JL,KLEV,1)*(-1._JPRB) - PTENC(JL,KLEV, KAERO(iacs_n)) = PTENC(JL,KLEV, KAERO(iacs_n)) + emis_number(mode_acs)%d3(JL,KLEV,4) * RG / PDELP(JL,KLEV) - PTENC(JL,KLEV, KAERO(icos_n)) = PTENC(JL,KLEV, KAERO(icos_n)) + emis_number(mode_cos)%d3(JL,KLEV,4) * RG / PDELP(JL,KLEV) - PTENC(JL,KLEV, KAERO(issacs)) = PTENC(JL,KLEV, KAERO(issacs)) + emis_mass(mode_acs)%d3(JL,KLEV,4) * RG / PDELP(JL,KLEV) - PTENC(JL,KLEV, KAERO(isscos)) = PTENC(JL,KLEV, KAERO(isscos)) + emis_mass(mode_cos)%d3(JL,KLEV,4) * RG / PDELP(JL,KLEV) +ENDDO - PTENC(JL,KLEV, KAERO(iaci_n)) = PTENC(JL,KLEV, KAERO(iaci_n)) + emis_number(mode_aci)%d3(JL,KLEV,1) * RG / PDELP(JL,KLEV) - PTENC(JL,KLEV, KAERO(icoi_n)) = PTENC(JL,KLEV, KAERO(icoi_n)) + emis_number(mode_coi)%d3(JL,KLEV,1) * RG / PDELP(JL,KLEV) - PTENC(JL,KLEV, KAERO(iduaci)) = PTENC(JL,KLEV, KAERO(iduaci)) + emis_mass(mode_aci)%d3(JL,KLEV,1) * RG / PDELP(JL,KLEV) - PTENC(JL,KLEV, KAERO(iducoi)) = PTENC(JL,KLEV, KAERO(iducoi)) + emis_mass(mode_coi)%d3(JL,KLEV,1) * RG / PDELP(JL,KLEV) -ENDDO +IF (.NOT.LVDFTRAC) THEN + DO JL=KIDIA,KFDIA + PTENC(JL,KLEV, KAERO(iacs_n)) = PTENC(JL,KLEV, KAERO(iacs_n)) + emis_number(mode_acs)%d3(JL,KLEV,4) * RG / PDELP(JL,KLEV) + PTENC(JL,KLEV, KAERO(icos_n)) = PTENC(JL,KLEV, KAERO(icos_n)) + emis_number(mode_cos)%d3(JL,KLEV,4) * RG / PDELP(JL,KLEV) + PTENC(JL,KLEV, KAERO(issacs)) = PTENC(JL,KLEV, KAERO(issacs)) + emis_mass(mode_acs)%d3(JL,KLEV,4) * RG / PDELP(JL,KLEV) + PTENC(JL,KLEV, KAERO(isscos)) = PTENC(JL,KLEV, KAERO(isscos)) + emis_mass(mode_cos)%d3(JL,KLEV,4) * RG / PDELP(JL,KLEV) + + PTENC(JL,KLEV, KAERO(iaci_n)) = PTENC(JL,KLEV, KAERO(iaci_n)) + emis_number(mode_aci)%d3(JL,KLEV,1) * RG / PDELP(JL,KLEV) + PTENC(JL,KLEV, KAERO(icoi_n)) = PTENC(JL,KLEV, KAERO(icoi_n)) + emis_number(mode_coi)%d3(JL,KLEV,1) * RG / PDELP(JL,KLEV) + PTENC(JL,KLEV, KAERO(iduaci)) = PTENC(JL,KLEV, KAERO(iduaci)) + emis_mass(mode_aci)%d3(JL,KLEV,1) * RG / PDELP(JL,KLEV) + PTENC(JL,KLEV, KAERO(iducoi)) = PTENC(JL,KLEV, KAERO(iducoi)) + emis_mass(mode_coi)%d3(JL,KLEV,1) * RG / PDELP(JL,KLEV) + ENDDO +ENDIF + DO JL=KIDIA,KFDIA DO IMODE=1,NMOD ! loop in each mode From af7c68ae3eb093a7e46431e1af2698613a26f7f0 Mon Sep 17 00:00:00 2001 From: Eemeli Holopainen Date: Wed, 28 Jan 2026 16:36:40 +0000 Subject: [PATCH 114/129] Pull request #70: Fix double addition of CDNC and ICNC tendencies in wet removal Merge in ~NM6/openifs-48r1 from bugfix/OIFS-666-double-addition-of-cdnc-and-icnc-to-wet-removal to knmi-m7 Squashed commit of the following: commit 1345052181149e0d4acbc1f0e1788747d6772f71 Author: Eemeli Holopainen Date: Wed Jan 28 12:33:21 2026 +0200 Fix double adding of CDNC and ICNC tendencies to wet removal. --- ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index 2fe64413..f820119b 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -341,6 +341,7 @@ SUBROUTINE HAMM7_INTERFACE( & REAL(KIND=JPRB) :: ZXTM0(KLON,KLEV,ntrac) !tracer mixing ratios for HAM REAL(KIND=JPRB) :: ZXTM1(KLON,KLEV,ntrac) !tracer mixing ratios for HAM REAL(KIND=JPRB) :: ZXTTE(KLON,KLEV,ntrac) !tracer tendency for HAM +REAL(KIND=JPRB) :: ZXTTE_CLD(KLON,KLEV,ntrac) !tracer tendency for cloud vars for HAM REAL(KIND=JPRB) :: ZXTTEM1(KLON,KLEV,ntrac) !tracer tendency for HAM ! added here variables for HAM-M7 activation REAL(KIND=JPRB), ALLOCATABLE :: ZW(:,:,:) !mean or bins of updraft velocity [m s-1] @@ -759,6 +760,7 @@ SUBROUTINE HAMM7_INTERFACE( & ZXTM0(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB ZXTM1(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB ZXTTE(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB +ZXTTE_CLD(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB ZXTTEM1(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB !number @@ -1177,8 +1179,8 @@ SUBROUTINE HAMM7_INTERFACE( & PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH) = MAX( ZICNC(KIDIA:KFDIA,1:KLEV), RNICE) ! no conversion needed: already in #/cm3, just impose minimum value !eehol: update tendency of CDNC and ICNC (calculate only the newly formed droplets) - ZXTTE(KIDIA:KFDIA,1:KLEV,IDT_CDNC) = (ZXTM1(KIDIA:KFDIA,1:KLEV,IDT_CDNC) - ZCDNC_temp(KIDIA:KFDIA,1:KLEV))/time_step_len - ZXTTE(KIDIA:KFDIA,1:KLEV,IDT_ICNC) = (ZXTM1(KIDIA:KFDIA,1:KLEV,IDT_ICNC) - ZICNC_temp(KIDIA:KFDIA,1:KLEV))/time_step_len + ZXTTE_CLD(KIDIA:KFDIA,1:KLEV,IDT_CDNC) = (ZXTM1(KIDIA:KFDIA,1:KLEV,IDT_CDNC) - ZCDNC_temp(KIDIA:KFDIA,1:KLEV))/time_step_len + ZXTTE_CLD(KIDIA:KFDIA,1:KLEV,IDT_ICNC) = (ZXTM1(KIDIA:KFDIA,1:KLEV,IDT_ICNC) - ZICNC_temp(KIDIA:KFDIA,1:KLEV))/time_step_len !----------------------------------------------------------------- !--> Calculation of effective radii (Note: already done if NCLOUDACT=1) @@ -1618,7 +1620,7 @@ SUBROUTINE HAMM7_INTERFACE( & !cloud variables DO JCLOUD=1,2 !CDNC and ICNC !PTENC(KIDIA:KFDIA,1:KLEV,KAERO(ind_oifs_ham%ind_cloud_OIFS(JCLOUD))) = ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_cloud_HAM(JCLOUD)) - PTENC(KIDIA:KFDIA,1:KLEV,KAERO(ind_oifs_ham%ind_cloud_OIFS(JCLOUD))) = (1.0E-6_JPRB) * ZRHO(KIDIA:KFDIA,1:KLEV) * ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_cloud_HAM(JCLOUD)) + PTENC(KIDIA:KFDIA,1:KLEV,KAERO(ind_oifs_ham%ind_cloud_OIFS(JCLOUD))) = (1.0E-6_JPRB) * ZRHO(KIDIA:KFDIA,1:KLEV) * ZXTTE_CLD(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_cloud_HAM(JCLOUD)) END DO !<-- End adding HAM modified tendency back to PTENC !----------------------------------------------------------------- From 864d571ddfb47365287a31c0ea35de60ed6fd950 Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Thu, 12 Feb 2026 11:57:32 +0000 Subject: [PATCH 115/129] Pull request #71: OIFS-688 Fix AOP diagnostic for NRADFR/=-1 Merge in ~NM6/openifs-48r1 from OIFS-668-fix-aop-diagnostic to knmi-m7 Squashed commit of the following: commit 9a07032bbfda14ac94b816175589d947fb8ed008 Author: Philippe Le Sager Date: Wed Feb 11 15:55:36 2026 +0100 Fix AOP diagnostic for NRADFR/=-1 --- .../arpifs/m7/phys_ec/hamm7_interface.F90 | 114 +++++++++--------- 1 file changed, 58 insertions(+), 56 deletions(-) diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index f820119b..1aed0573 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -439,8 +439,7 @@ SUBROUTINE HAMM7_INTERFACE( & INTEGER(KIND=JPIM), parameter::ZKROW=1 ! KROW only used in ECHAM but needed inside HAM-codes so set as 1. INTEGER(KIND=JPIM) :: IBLK REAL(KIND=JPRB) :: REFFI(KLON,KLEV,ZKROW), REFFL(KLON,KLEV,ZKROW) -INTEGER(KIND=JPIM) :: LWBANDS !laakso: number of LW bands -INTEGER(KIND=JPIM) :: INWAVL, ITWAVL(20) +INTEGER(KIND=JPIM) :: LWBANDS ! number of LW bands REAL(KIND=JPRB) :: PRS1D(KLON,KLEV) INTEGER(KIND=JPIM) :: ISO4_C, ISSO4_C ! temporary tracer index of gas-phase SO4 (retrieved from chemistry module) @@ -1709,29 +1708,6 @@ SUBROUTINE HAMM7_INTERFACE( & !----------------------------------------------------------------------- !* 6. OPTICAL PROPERTIES ! -------------------------------------------------- - -INWAVL = 20 -ITWAVL( 1)= 9 ! 550 nm -ITWAVL( 2)= 1 ! 340 nm -ITWAVL( 3)= 2 ! 355 nm -ITWAVL( 4)= 3 ! 380 nm -ITWAVL( 5)= 4 ! 400 nm -ITWAVL( 6)= 5 ! 440 nm -ITWAVL( 7)= 6 ! 469 nm -ITWAVL( 8)= 7 ! 500 nm -ITWAVL( 9)= 8 ! 532 nm -ITWAVL(10)=10 ! 645 nm -ITWAVL(11)=11 ! 670 nm -ITWAVL(12)=12 ! 800 nm -ITWAVL(13)=13 ! 858 nm -ITWAVL(14)=14 ! 865 nm -ITWAVL(15)=15 ! 1020 nm -ITWAVL(16)=16 ! 1064 nm -ITWAVL(17)=17 ! 1240 nm -ITWAVL(18)=18 ! 1640 nm -ITWAVL(19)=19 ! 2130 nm -ITWAVL(20)=20 ! 10 microns - IBLK=(KSTGLO-1)/KLON + 1 DO JK=1,KLEV @@ -1922,27 +1898,44 @@ SUBROUTINE HAMM7_INTERFACE( & !* 6.3 Fill selective aerosol OD fields in structure as available in IFS-AER ! --------------------------------------------------------------------- -IF(MOD(NSTEP,NRADFR) == 0) THEN ! otherwise overwritten with initial values - DO JWAVL=1,MIN(INWAVL,NAERO_WVL_DIAG) +IF(MOD(NSTEP,NRADFR) == 0) THEN ! Use computed values + DO JWAVL=1,NAERO_WVL_DIAG DO JL=KIDIA,KFDIA - IF (YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_AOD) THEN + IF (YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_AOD) THEN PAERO_WVL_DIAG(JL,JWAVL,JPAERO_WVL_AOD) = ZAOD_DIAG(JL,JWAVL) ENDIF - IF (YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_AODABS) THEN + IF (YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_AODABS) THEN !PAERO_WVL_DIAG(JL,JWAVL,JPAERO_WVL_AODABS) = ZABS_DIAG(JL,JWAVL)! 0.0 PAERO_WVL_DIAG(JL,JWAVL,JPAERO_WVL_AODABS) = ZAOD_DIAG(JL,JWAVL)*(1._JPRB-ZSSA_DIAG(JL,JWAVL))! absorption ENDIF - IF (YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_AODFM) THEN! not implemented yet + IF (YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_AODFM) THEN! not implemented yet PAERO_WVL_DIAG(JL,JWAVL,JPAERO_WVL_AODFM) = 0._JPRB!PFAOD(JL,JWAVL)! 0.0 ENDIF - IF (YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_SSA) THEN + IF (YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_SSA) THEN PAERO_WVL_DIAG(JL,JWAVL,JPAERO_WVL_SSA) = ZSSA_DIAG(JL,JWAVL) ENDIF - IF (YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_ASSIMETRY) THEN + IF (YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_ASSIMETRY) THEN PAERO_WVL_DIAG(JL,JWAVL,JPAERO_WVL_ASSIMETRY) = ZASY_DIAG(JL,JWAVL) ENDIF ENDDO ENDDO +ELSE ! Use stored values (PAERO_WVL_DIAG get corrupted - see ticket OIFS-668) + + IF (YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_AOD) THEN + PAERO_WVL_DIAG(KIDIA:KFDIA, 1:NAERO_WVL_DIAG, JPAERO_WVL_AOD) = PGFL(KIDIA:KFDIA, 1:NAERO_WVL_DIAG, YAEROUT(6)%MP) + ENDIF + IF (YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_AODABS) THEN + PAERO_WVL_DIAG(KIDIA:KFDIA, 1:NAERO_WVL_DIAG, JPAERO_WVL_AODABS) = PGFL(KIDIA:KFDIA, 1:NAERO_WVL_DIAG, YAEROUT(7)%MP) + ENDIF + IF (YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_AODFM) THEN + PAERO_WVL_DIAG(KIDIA:KFDIA, 1:NAERO_WVL_DIAG, JPAERO_WVL_AODFM) = PGFL(KIDIA:KFDIA, 1:NAERO_WVL_DIAG, YAEROUT(8)%MP) + ENDIF + IF (YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_SSA) THEN + PAERO_WVL_DIAG(KIDIA:KFDIA, 1:NAERO_WVL_DIAG, JPAERO_WVL_SSA) = PGFL(KIDIA:KFDIA, 1:NAERO_WVL_DIAG, YAEROUT(9)%MP) + ENDIF + IF (YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_ASSIMETRY) THEN + PAERO_WVL_DIAG(KIDIA:KFDIA, 1:NAERO_WVL_DIAG, JPAERO_WVL_ASSIMETRY) = PGFL(KIDIA:KFDIA, 1:NAERO_WVL_DIAG, YAEROUT(10)%MP) + ENDIF ENDIF !* @@ -2014,18 +2007,32 @@ SUBROUTINE HAMM7_INTERFACE( & PGFL(KIDIA:KFDIA,NACTAERO+2,YAEROUT(5)%MP) = ZBLHIDX(KIDIA:KFDIA) PGFL(KIDIA:KFDIA,NACTAERO+3,YAEROUT(5)%MP) = PBLH(KIDIA:KFDIA) - !** YAEROUT(6) : AOD at selected (diagnostic) wavelengths + !** YAEROUT(6:10) : Store all requested AOP at selected (diagnostic) wavelengths - IF(MOD(NSTEP,NRADFR) == 0) THEN !otherwise overwriten with ini - PGFL(KIDIA:KFDIA, 1:NAERO_WVL_DIAG, YAEROUT(6)%MP) = ZAOD_DIAG(KIDIA:KFDIA, 1:YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG) + IF(MOD(NSTEP,NRADFR) == 0) THEN + IF (YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_AOD) THEN + PGFL(KIDIA:KFDIA, 1:NAERO_WVL_DIAG, YAEROUT(6)%MP) = PAERO_WVL_DIAG(KIDIA:KFDIA, 1:NAERO_WVL_DIAG, JPAERO_WVL_AOD) + ENDIF + IF (YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_AODABS) THEN + PGFL(KIDIA:KFDIA, 1:NAERO_WVL_DIAG, YAEROUT(7)%MP) = PAERO_WVL_DIAG(KIDIA:KFDIA, 1:NAERO_WVL_DIAG, JPAERO_WVL_AODABS) + ENDIF + IF (YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_AODFM) THEN + PGFL(KIDIA:KFDIA, 1:NAERO_WVL_DIAG, YAEROUT(8)%MP) = PAERO_WVL_DIAG(KIDIA:KFDIA, 1:NAERO_WVL_DIAG, JPAERO_WVL_AODFM) + ENDIF + IF (YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_SSA) THEN + PGFL(KIDIA:KFDIA, 1:NAERO_WVL_DIAG, YAEROUT(9)%MP) = PAERO_WVL_DIAG(KIDIA:KFDIA, 1:NAERO_WVL_DIAG, JPAERO_WVL_SSA) + ENDIF + IF (YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_ASSIMETRY) THEN + PGFL(KIDIA:KFDIA, 1:NAERO_WVL_DIAG, YAEROUT(10)%MP) = PAERO_WVL_DIAG(KIDIA:KFDIA, 1:NAERO_WVL_DIAG, JPAERO_WVL_ASSIMETRY) + ENDIF ENDIF - !** YAEROUT(7) : Total column mass and number concentration + !** YAEROUT(11) : Total column mass and number concentration DO JN=1,NAEROCOMP JO=ind_oifs_ham%ind_mass_OIFS(JN) ! JO -> index context OIFS JH=ind_oifs_ham%IND_mass_HAM(JN) ! JH -> index context HAM - JY=YAEROUT(7)%MP + JY=YAEROUT(11)%MP ZTMP(KIDIA:KFDIA)=0.0_JPRB DO JK=1,KLEV ZTMP(KIDIA:KFDIA)= ZTMP(KIDIA:KFDIA) + (ZXTM1(KIDIA:KFDIA,JK,JH)+(ZXTTE(KIDIA:KFDIA,JK,JH)*TIME_STEP_LEN)) * ZDPG(KIDIA:KFDIA,JK) @@ -2036,7 +2043,7 @@ SUBROUTINE HAMM7_INTERFACE( & DO JN=1,NCLASS JO=ind_oifs_ham%ind_class_OIFS(JN) ! JO -> index context OIFS JH=ind_oifs_ham%IND_class_HAM(JN) ! JH -> index context HAM - JY=YAEROUT(7)%MP + JY=YAEROUT(11)%MP ZTMP(KIDIA:KFDIA)=0.0_JPRB DO JK=1,KLEV ZTMP(KIDIA:KFDIA) = ZTMP(KIDIA:KFDIA) + (ZXTM1(KIDIA:KFDIA,JK,JH)+(ZXTTE(KIDIA:KFDIA,JK,JH)*TIME_STEP_LEN)) * ZDPG(KIDIA:KFDIA,JK) @@ -2044,12 +2051,12 @@ SUBROUTINE HAMM7_INTERFACE( & PGFL(KIDIA:KFDIA,JO,JY) = ZTMP(KIDIA:KFDIA) END DO - !** YAEROUT(8) : mass and number tendency + !** YAEROUT(12) : mass and number tendency ! kg/kg -> kg/m2 N/kg-> N/m2 DO JN=1,NAEROCOMP !ntrac!NACTAERO JO=ind_oifs_ham%ind_mass_OIFS(JN) ! JO -> index context OIFS JH=ind_oifs_ham%IND_mass_HAM(JN) ! JH -> index context HAM - JY=YAEROUT(8)%MP + JY=YAEROUT(12)%MP ZTMP(KIDIA:KFDIA)=0.0_JPRB DO JK=1,KLEV ZTMP(KIDIA:KFDIA) = ZTMP(KIDIA:KFDIA) + ZXTTE(KIDIA:KFDIA,JK,JH) @@ -2060,7 +2067,7 @@ SUBROUTINE HAMM7_INTERFACE( & DO JN=1,NCLASS JO=ind_oifs_ham%ind_class_OIFS(JN) ! JO -> index context OIFS JH=ind_oifs_ham%IND_class_HAM(JN) ! JH -> index context HAM - JY=YAEROUT(8)%MP + JY=YAEROUT(12)%MP ZTMP(KIDIA:KFDIA)=0.0_JPRB DO JK=1,KLEV ZTMP(KIDIA:KFDIA) = ZTMP(KIDIA:KFDIA) + ZXTTE(KIDIA:KFDIA,JK,JH) @@ -2068,43 +2075,43 @@ SUBROUTINE HAMM7_INTERFACE( & PGFL(KIDIA:KFDIA,JO,JY) = ZTMP(KIDIA:KFDIA) END DO - !** YAEROUT(9) : Surface fluxes of tracers (not emissions) + !** YAEROUT(13) : Surface fluxes of tracers (not emissions) DO JN=1,NACTAERO !ZTMP(KIDIA:KFDIA)=0.0_JPRB !DO JK=1,KLEV ! ZTMP(KIDIA:KFDIA)=ZTMP(KIDIA:KFDIA)+PCEN(KIDIA:KFDIA,JK,KAERO(JN)) !END DO - !PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(9)%MP) = ZTMP(KIDIA:KFDIA) - PGFL(KIDIA:KFDIA,KAERO(JN),YGFL%YAEROUT(9)%MP)= - PCFLX(KIDIA:KFDIA,KAERO(JN))* ZDPG(KIDIA:KFDIA,KLEV) + !PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(13)%MP) = ZTMP(KIDIA:KFDIA) + PGFL(KIDIA:KFDIA,KAERO(JN),YGFL%YAEROUT(13)%MP)= - PCFLX(KIDIA:KFDIA,KAERO(JN))* ZDPG(KIDIA:KFDIA,KLEV) END DO - !** YAEROUT(10) : Total column tracer/number PREVIOUS (before call to M7) concentration + !** YAEROUT(14) : Total column tracer/number PREVIOUS (before call to M7) concentration DO JN=1,NACTAERO ZTMP(KIDIA:KFDIA)=0.0_JPRB DO JK=1,KLEV ZTMP(KIDIA:KFDIA)=ZTMP(KIDIA:KFDIA)+ZCEN(KIDIA:KFDIA,JK,KAERO(JN)) END DO - PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(10)%MP) = ZTMP(KIDIA:KFDIA) + PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(14)%MP) = ZTMP(KIDIA:KFDIA) END DO - !** YAEROUT(11) : Total column UPDATED TENDENCIES tracer + !** YAEROUT(15) : Total column UPDATED TENDENCIES tracer DO JN=1,NACTAERO ZTMP(KIDIA:KFDIA)=0.0_JPRB DO JK=1,KLEV ZTMP(KIDIA:KFDIA)=ZTMP(KIDIA:KFDIA)+PTENC(KIDIA:KFDIA,JK,KAERO(JN)) END DO - PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(11)%MP) = ZTMP(KIDIA:KFDIA) + PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(15)%MP) = ZTMP(KIDIA:KFDIA) END DO - !** YAEROUT(12) : M7 mass and number mixing ratio at surface + !** YAEROUT(16) : M7 mass and number mixing ratio at surface DO JN=1,NAEROCOMP !ntrac!NACTAERO JO=ind_oifs_ham%ind_mass_OIFS(JN) ! JO -> index context OIFS JH=ind_oifs_ham%IND_mass_HAM(JN) ! JH -> index context HAM - JY=YAEROUT(12)%MP + JY=YAEROUT(16)%MP ZTMP(KIDIA:KFDIA)= ZXTM1(KIDIA:KFDIA,KLEV,JH)+(ZXTTE(KIDIA:KFDIA,KLEV,JH)*TIME_STEP_LEN)!*ZDPG(KIDIA:KFDIA,KLEV) PGFL(KIDIA:KFDIA,JO,JY) = ZTMP(KIDIA:KFDIA) END DO @@ -2112,15 +2119,10 @@ SUBROUTINE HAMM7_INTERFACE( & DO JN=1,NCLASS JO=ind_oifs_ham%ind_class_OIFS(JN) ! JO -> index context OIFS JH=ind_oifs_ham%IND_class_HAM(JN) ! JH -> index context HAM - JY=YAEROUT(12)%MP + JY=YAEROUT(16)%MP ZTMP(KIDIA:KFDIA) = ZXTM1(KIDIA:KFDIA,KLEV,JH)+(ZXTTE(KIDIA:KFDIA,KLEV,JH)*TIME_STEP_LEN)!*PRHO(KIDIA:KFDIA,KLEV) PGFL(KIDIA:KFDIA,JO,JY) = ZTMP(KIDIA:KFDIA) END DO - - !** YAEROUT(13) : -- - !** YAEROUT(14) : -- - !** YAEROUT(15) : -- - !** YAEROUT(16) : -- !** YAEROUT(17-18) : IN-CLOUD & BELOW CLOUD WET DEPOSITION From b69abcdba2553b21b93178205784f363d4b25e0e Mon Sep 17 00:00:00 2001 From: Jan Streffing Date: Sun, 15 Feb 2026 11:49:44 +0000 Subject: [PATCH 116/129] ECE4 HotFix (OpenMP) handling of strataero remap flag --- ifs-source/arpifs/phys_radi/radiation_scheme.F90 | 1 - ifs-source/arpifs/phys_radi/radintg.F90 | 5 +++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/ifs-source/arpifs/phys_radi/radiation_scheme.F90 b/ifs-source/arpifs/phys_radi/radiation_scheme.F90 index 9ad03df4..60887a6b 100644 --- a/ifs-source/arpifs/phys_radi/radiation_scheme.F90 +++ b/ifs-source/arpifs/phys_radi/radiation_scheme.F90 @@ -674,7 +674,6 @@ SUBROUTINE RADIATION_SCHEME & YDAERSTRAT%STRAT_AAOD(KIDIA:KFDIA,:,:,:,KBL) = ZAAODSTRAT_M(KIDIA:KFDIA,:,:,:) YDAERSTRAT%STRAT_REFAOD(KIDIA:KFDIA,:,:,:,KBL)= ZREFAODSTRAT_M(KIDIA:KFDIA,:,:,:) YDAERSTRAT%STRAT_AAOD_LW(KIDIA:KFDIA,:,:,:,KBL) = ZAAODSTRAT_LW_M(KIDIA:KFDIA,:,:,:) - YRERAD%LSTRATAERO_UPDATED = .FALSE. ELSE ! no new data, use the last computed values ZAODSTRAT_M(KIDIA:KFDIA,:,:,:) = YDAERSTRAT%STRAT_AOD(KIDIA:KFDIA,:,:,:,KBL) diff --git a/ifs-source/arpifs/phys_radi/radintg.F90 b/ifs-source/arpifs/phys_radi/radintg.F90 index 115d3298..bffb6413 100644 --- a/ifs-source/arpifs/phys_radi/radintg.F90 +++ b/ifs-source/arpifs/phys_radi/radintg.F90 @@ -1690,6 +1690,11 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE, & ENDDO !$OMP END PARALLEL DO +! Reset the strat aero remap flag: remapping was done in RADIATION_SCHEME if +! needed and does not need to be done until new data are read. +! Reset here after ALL blocks have been processed to avoid race condition. +YDERAD%LSTRATAERO_UPDATED = .FALSE. + CALL GSTATS(1210,1) ! OUTPUT INTERPOLATION IF REQUIRED From 6c06cfde4667419c1b79470ad2ad2eb55260e7f8 Mon Sep 17 00:00:00 2001 From: Marios Chatziparasch Date: Thu, 19 Feb 2026 10:17:54 +0000 Subject: [PATCH 117/129] Pull request #56: OIFS-586 Add Tegen dust emission scheme Merge in ~NM6/openifs-48r1 from knmi-m7_bsc_dust to knmi-m7 Squashed commit of the following: commit e3013b6a24af88e67c91695666388860129b9f80 Merge: 6b2724e 0789d5d Author: Philippe Le Sager Date: Thu Feb 19 11:16:25 2026 +0100 Merge branch 'origin/knmi-m7' into knmi-m7_bsc_dust commit 6b2724ea4ea80f71cbd22e5812fe767e5db7fc75 Author: Philippe Le Sager Date: Thu Feb 19 10:50:38 2026 +0100 Bug fix commit 67a5ffb2bb2c33a8c8cb8b339f9eaa6a0de6ef03 Author: Philippe Le Sager Date: Thu Feb 19 09:43:53 2026 +0100 Bugfix commit db99ce6046c2bef45f3650e0a71ee5115382ad4f Author: Philippe Le Sager Date: Wed Feb 18 17:30:43 2026 +0100 cosmetic commit 6970012c1c772e8b8457518e47b3cb21c330d66f Author: Philippe Le Sager Date: Wed Feb 18 16:02:55 2026 +0100 Remove unused declarations commit 5c005497c0fe400fd38a075da371606dbe9dc461 Author: Philippe Le Sager Date: Wed Feb 18 15:25:58 2026 +0100 Remove unused USE statements commit 336555b8d500bb7d6088ce52e414122ada377fb2 Author: Philippe Le Sager Date: Wed Feb 18 10:29:07 2026 +0100 Cosmetic round commit 8e93b49012b50d2bc65815ee3f73b74e923f4f7b Merge: 27e9f2f 12d109b Author: Philippe Le Sager Date: Sun Feb 15 10:29:47 2026 +0100 Merge remote-tracking branch 'origin/knmi-m7' into knmi-m7_bsc_dust commit 27e9f2f5a2e017c50ba108c06e09adb9fa213cb0 Author: Philippe Le Sager Date: Sun Feb 15 10:00:29 2026 +0100 Clean up (cosmetic/info) commit b581dae589bc5f028f7d8254ec40ec009ed7217d Author: Philippe Le Sager Date: Sun Feb 15 09:59:31 2026 +0100 Set default to dust namelist entries commit f13e26236b341c448f4dc8c572030eec123f3d91 Author: Philippe Le Sager Date: Sun Feb 15 09:57:44 2026 +0100 Change location of auxiliary file for Tegen scheme commit 9b52ea00f28c4d99aeacb382233e877bf7632fd7 Author: Philippe Le Sager Date: Sun Feb 15 09:56:19 2026 +0100 Read data for Tegen dust scheme only if scheme is activated commit ab58f7f4816d57db0a494350b316d449be0bf059 Merge: a190284 882fda2 Author: Marios Chatziparasch Date: Mon Feb 2 14:41:13 2026 +0100 Merge branch 'knmi-m7_bsc_dust' into dust commit 882fda2e91d97d2a61adee19c8dee1598e326f04 Merge: 61dd4a9 9e46a70 Author: Marios Chatziparasch Date: Fri Jan 23 16:53:26 2026 +0100 updated base on knmi-m7 commit 61dd4a9c6d28e1cc6ba797522db88ceaf307b0db Author: Marios Chatziparasch Date: Fri Jan 23 15:31:56 2026 +0000 tm5m7_src.F90 edited online with Bitbucket commit 53ce51ff9ad5a82964457d16c9db23d5cdfe7c09 Author: Marios Chatziparasch Date: Fri Jan 23 15:30:09 2026 +0000 tm5m7_src.F90 edited online with Bitbucket commit efc5caa919b105e77ee1512df994834e3c4cb969 Author: Marios Chatziparasch Date: Fri Jan 23 15:29:39 2026 +0000 tm5m7_src.F90 edited online with Bitbucket commit 4aaffa6a24959dcbe0f12f1885728e62e89be33f Author: Simone Vacondio Date: Wed Nov 5 15:22:05 2025 +0100 Undo MN5-dependent changes commit 7df9b3815df9d5dd2b10cde5e41d1626b604850b Author: Simone Vacondio Date: Thu Nov 6 14:39:57 2025 +0100 Remove leftover dust diagnostic commit 919488c4a15bd1568af33b43358877d02b66fb4f Merge: 9815110 f8d0e56 Author: Marios Chatziparasch Date: Wed Nov 5 16:11:22 2025 +0100 merge with knmi_m7 ... and 6 more commits --- .../m7/module/mo_ham_m7_emi_seasalt.f90 | 12 +- .../arpifs/m7/phys_ec/hamm7_interface.F90 | 38 + ifs-source/arpifs/m7/phys_ec/tm5m7_phy2.F90 | 7 +- ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 | 49 +- .../arpifs/m7/phys_ec/tm5m7_src_dust.F90 | 893 ++++++++++++------ ifs-source/arpifs/m7/phys_ec/tm5m7_src_ss.F90 | 28 +- ifs-source/arpifs/module/yoeaersrc.F90 | 7 + ifs-source/arpifs/module/yoedust.F90 | 513 ++++++++++ ifs-source/arpifs/namelist/naeaer.nam.h | 2 +- ifs-source/arpifs/phys_ec/aerini_layer.F90 | 5 +- ifs-source/arpifs/phys_ec/callpar.F90 | 2 +- ifs-source/arpifs/phys_ec/su_aerw.F90 | 26 +- ifs-source/arpifs/phys_radi/suecrad.F90 | 10 + 13 files changed, 1266 insertions(+), 326 deletions(-) create mode 100755 ifs-source/arpifs/module/yoedust.F90 diff --git a/ifs-source/arpifs/m7/module/mo_ham_m7_emi_seasalt.f90 b/ifs-source/arpifs/m7/module/mo_ham_m7_emi_seasalt.f90 index daf3f759..434b1633 100644 --- a/ifs-source/arpifs/m7/module/mo_ham_m7_emi_seasalt.f90 +++ b/ifs-source/arpifs/m7/module/mo_ham_m7_emi_seasalt.f90 @@ -175,7 +175,7 @@ SUBROUTINE start_emi_seasalt END SUBROUTINE start_emi_seasalt - SUBROUTINE seasalt_emissions_gong_SST(kproma, kbdim, krow , sst, wind10m, ss_density, slf, alake, seaice, pmassf_as, pmassf_cs, pnumf_as, pnumf_cs) + SUBROUTINE seasalt_emissions_gong_SST(kproma, kbdim, krow , sst, wind10m, ss_density, slf, alake, seaice, pmassf_as, pmassf_cs,pnumf_as, pnumf_cs, SSCAL) ! ! Description: @@ -234,7 +234,7 @@ SUBROUTINE seasalt_emissions_gong_SST(kproma, kbdim, krow , sst, wind10m, ss_den REAL(dp),INTENT(out) :: pmassf_cs(kbdim) ! mass flux of ss coa particles REAL(dp),INTENT(out) :: pnumf_as(kbdim) ! number flux of ss acc particles REAL(dp),INTENT(out) :: pnumf_cs(kbdim) ! number flux of ss coa particles - + REAL(dp), INTENT(in) ::SSCAL !SEASALT deactivation !Mch !--- Local: REAL(dp):: zseafrac(kbdim) ! fraction of the gridcell covered by @@ -395,13 +395,13 @@ SUBROUTINE seasalt_emissions_gong_SST(kproma, kbdim, krow , sst, wind10m, ss_den END IF IF (dmt(m).GT.dbeg(2) .AND. dmt(m).LE.dend(2) ) THEN - pnumf_as(1:kproma) = pnumf_as(1:kproma) + fi(1:kproma,m)*zseafrac(1:kproma) - pmassf_as(1:kproma) = pmassf_as(1:kproma) + fi(1:kproma,m)*zseafrac(1:kproma)*zav + pnumf_as(1:kproma) = pnumf_as(1:kproma) + fi(1:kproma,m)*zseafrac(1:kproma) * SSCAL + pmassf_as(1:kproma) = pmassf_as(1:kproma) + fi(1:kproma,m)*zseafrac(1:kproma)*zav * SSCAL END IF IF (dmt(m).GT.dbeg(3) .AND. dmt(m).LE.dend(3) ) THEN - pnumf_cs(1:kproma) = pnumf_cs(1:kproma) + fi(1:kproma,m)*zseafrac(1:kproma) - pmassf_cs(1:kproma) = pmassf_cs(1:kproma) + fi(1:kproma,m)*zseafrac(1:kproma)*zav + pnumf_cs(1:kproma) = pnumf_cs(1:kproma) + fi(1:kproma,m)*zseafrac(1:kproma) * SSCAL + pmassf_cs(1:kproma) = pmassf_cs(1:kproma) + fi(1:kproma,m)*zseafrac(1:kproma)*zav * SSCAL END IF END DO diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index 1aed0573..d1ab81f2 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -2178,7 +2178,45 @@ SUBROUTINE HAMM7_INTERFACE( & !** YAEROUT(37) : -- !** YAEROUT(38) : -- !** YAEROUT(39) : -- + !** YAEROUT(46) + ! !---------------DUST FIELDS DIAGNOSTICS----------------------- + ! !** YAEROUT(47) : -- + ! !3D Dust DU_AI in KG/M3 + ! JO= 20 ! JO -> index context OIFS`` + ! JH= 20 ! JH -> index context HAM + ! JY=YAEROUT(47)%MP + ! DO JK=1,KLEV + ! PGFL(KIDIA:KFDIA,JK,JY)= (ZXTM1(KIDIA:KFDIA,JK,JH)+(ZXTTE(KIDIA:KFDIA,JK,JH)*TIME_STEP_LEN)) * ZDPG(KIDIA:KFDIA,JK) + ! END DO + + + ! ! ** YAEROUT(48) : -- + ! !DU_CI + ! JO= 26 ! JO -> index context OIFS`` + ! JH= 21 ! JH -> index context HAM + ! JY=YAEROUT(48)%MP + ! DO JK=1,KLEV + ! PGFL(KIDIA:KFDIA,JK,JY)= (ZXTM1(KIDIA:KFDIA,JK,JH)+(ZXTTE(KIDIA:KFDIA,JK,JH)*TIME_STEP_LEN)) * ZDPG(KIDIA:KFDIA,JK) + ! END DO + + ! ! **YAEROUT(49) + ! !DU_AI NUM + ! JO= 19 ! JO -> index context OIFS`` + ! JH= 27 ! JH -> index context HAM + ! JY=YAEROUT(49)%MP + ! DO JK=1,KLEV + ! PGFL(KIDIA:KFDIA,JK,JY)= ZXTM1(KIDIA:KFDIA,JK,JH)+(ZXTTE(KIDIA:KFDIA,JK,JH)*TIME_STEP_LEN) + ! END DO + ! ! **YAEROUT(50) + ! !DU_CI NUM + ! JO= 25 ! JO -> index context OIFS`` + ! JH= 28 ! JH -> index context HAM + ! JY=YAEROUT(50)%MP + ! DO JK=1,KLEV + ! PGFL(KIDIA:KFDIA,JK,JY)= ZXTM1(KIDIA:KFDIA,JK,JH)+(ZXTTE(KIDIA:KFDIA,JK,JH)*TIME_STEP_LEN) + ! END DO + !Commented because of overlap DO JGAS=1,SUBM_NGASSPEC !Commented because of overlap !!! BUG: JL? JK? !!! PGFL(KIDIA:KFDIA,JGAS,YAEROUT(28+JGAS)%MP)=ZCEN(JL,JK,KCHEM(ind_oifs_ham%ind_gas_OIFS(JGAS))) !Commented because of overlap PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(29+JGAS)%MP)= PTENC(KIDIA:KFDIA,1:KLEV,KCHEM(ind_oifs_ham%ind_gas_OIFS(JGAS))) diff --git a/ifs-source/arpifs/m7/phys_ec/tm5m7_phy2.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_phy2.F90 index 7a985a89..87acc0b8 100644 --- a/ifs-source/arpifs/m7/phys_ec/tm5m7_phy2.F90 +++ b/ifs-source/arpifs/m7/phys_ec/tm5m7_phy2.F90 @@ -15,7 +15,7 @@ SUBROUTINE TM5M7_PHY2 & !-- OUTPUTS & PCFLX, PTENC, & & PLDAY, PLISS, PSO2 , PTDMS, PAERDDP, PAERSDM, PAERSRC, PAERMAP, PAERFLX, PAERLIF, & - & PODMS, PEXTRA , PSO4SRC, PSO2SRC) + & PODMS, PEXTRA , PSO4SRC, PSO2SRC, GPGAW) !**** *TM5M7_PHY2* - ROUTINE DEALING WITH AEROSOL SOURCES, DRY DEPOSITION ! AND SEDIMENTATION for TM5M7 aerosol @@ -134,7 +134,7 @@ SUBROUTINE TM5M7_PHY2 & REAL(KIND=JPRB),INTENT(IN) :: PGEOH(KLON,0:KLEV) !!!!!!!! PCEN is IN or INOUT REAL(KIND=JPRB),INTENT(INOUT) :: PCEN(KLON,KLEV,KTRAC) - +REAL(KIND=JPRB),INTENT(IN) :: GPGAW(KLON) REAL(KIND=JPRB),INTENT(IN) :: PALB(KLON) , PALBD(KLON,KSW) REAL(KIND=JPRB),INTENT(IN) :: PALUVD(KLON) REAL(KIND=JPRB),INTENT(IN) :: PAERDEP(KLON), PAERLTS(KLON), PAERSCC(KLON) @@ -304,6 +304,7 @@ SUBROUTINE TM5M7_PHY2 & ! write(8000+MYPROC,*)jtile,jl,PFRTI(JL,JTILE),PAHFSTI(JL,JTILE),PFRTI(JL,JTILE)*PAHFSTI(JL,JTILE) !write(3334,*)jtile,jl,PFRTI(JL,JTILE),PAHFSTI(JL,JTILE) !end DO + CALL TM5M7_SRC & &( YDGEOMETRY, YDMODEL, KIDIA , KFDIA , KLON , KTDIA, KLEV , KTILES, NSTART, NSTEP , KSTGLO, & & KSW , KTRAC , KAERO, & @@ -313,7 +314,7 @@ SUBROUTINE TM5M7_PHY2 & & PLSM , PSST , PQP , ZRHO , PSNS , PTP , PTL , PTSPHY, PZ0M, KCHEM, & & ZWND , PWSA1 , PSOIL_TYPE, & & PCVL , PCVH, KTVL, KTVH, & - & PLDAY , PAERFLX, PCFLX, PCEN , PTENC, ZEMIDIAG, PSO2SRC,PSO4SRC) + & PLDAY , PAERFLX, PCFLX, PCEN , PTENC, ZEMIDIAG, PSO2SRC,PSO4SRC, GPGAW) ! sea salt and desert dust fluxes in kg m-2 s-1, thus: diff --git a/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 index 526d29b1..de405e3a 100644 --- a/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 +++ b/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 @@ -7,7 +7,7 @@ SUBROUTINE TM5M7_SRC( & & PLSM , PSST , PQ , PRHO , PSNS , PT , PTL , PTSPHY, PZ0M, KCHEM, & & PWIND, PWS1 ,PSOIL_TYPE, & & PCVL, PCVH, KTVL, KTVH, & - & PLDAY, PAERFLX, PCFLX, PCEN , PTENC, PEMIDIAG, PSO2SRC,PSO4SRC ) + & PLDAY, PAERFLX, PCFLX, PCEN , PTENC, PEMIDIAG, PSO2SRC,PSO4SRC, GPGAW) ! ╭────────────────────────────────────────────────────────────────────────────╮ ! │ (updated 03-Jun-2024) │ @@ -60,6 +60,7 @@ SUBROUTINE TM5M7_SRC( & USE YOMLUN, ONLY : NULOUT, NULERR USE YOMCST, ONLY : RA, RPI, RDAY, RG USE YOMRIP0, ONLY : NINDAT, NSSSSS +USE YOEDUST, ONLY : YDUSTCLIM !(soiltype. soil ph ..ect) ! M7 modules ------------------------------------------------------------------- @@ -95,6 +96,7 @@ SUBROUTINE TM5M7_SRC( & INTEGER(KIND=JPIM), INTENT(IN) :: KTRAC INTEGER(KIND=JPIM), INTENT(IN) :: KAERO(YDMODEL%YRML_GCONF%YGFL%NAERO) +REAL(KIND=JPRB), INTENT(IN) :: GPGAW(KLON) REAL(KIND=JPRB), INTENT(IN) :: PALB(KLON), PALBD(KLON,KSW) REAL(KIND=JPRB), INTENT(IN) :: PAPHI(KLON,0:KLEV), PALTH(KLON,0:KLEV) REAL(KIND=JPRB), INTENT(IN) :: PAERDEP(KLON), PAERLTS(KLON), PAERSCC(KLON) @@ -136,6 +138,12 @@ SUBROUTINE TM5M7_SRC( & REAL(KIND=JPRB) :: ZOMBF(KLON), ZOMFF(KLON), ZOMGF(KLON) ! OM related INTEGER(KIND=JPIM) :: JAER, JK, JL, IMODE, INMODE, JN, II, JGAS INTEGER(KIND=JPIM) :: IGLGLO, IHTST +! soiltype. soil ph ..etc +REAL(KIND=JPRB) :: ISOILTYPE(KLON) +REAL(KIND=JPRB) :: ISOILPH1(KLON), ISOILPH2(KLON), ISOILPH3(KLON), ISOILPH4(KLON), ISOILPH5(KLON), & + & IZ0AM(KLON), IPOTSRC(KLON), IAREA(KLON), ICULT(KLON) +REAL(KIND=JPRB) :: IZ0M(KLON), IFPAR(KLON) +REAL(KIND=JPRB) :: ILAI_MAX(KLON), ILAI_AVG(KLON) ! TM5-M7 data @@ -227,12 +235,16 @@ SUBROUTINE TM5M7_SRC( & & LVDFTRAC=> YDEPHY%LVDFTRAC, & & YSURF => YDEPHY%YSURF, LAERCHEM => YGFL%LAERCHEM) +ASSOCIATE(NDDUST => YDEAERSRC%NDDUST) + !VH maybe 43r3, only?? !& LAERODIU=>YDCOMPO%LAERODIU, YAERO=>YGFL%YAERO, LFIRE=>YDCOMPO%LFIRE, LINJ=>YDCOMPO%LINJ, & ! N.B.: In ECMWF model conventions, flux going upward from the surface ! are negative ! All surface fluxes PCFLUX in kg m-2 s-1 +! PGEMU : SINLAT PGELAT(KLON) : LATITUDE (RADIANS) +! PGELAM : LONGITUDE (RADIANS) !----------------------------------------------------------------------- @@ -284,7 +296,7 @@ SUBROUTINE TM5M7_SRC( & ENDDO ENDDO -ZDEGRAD= 180._JPRB/RPI +ZDEGRAD= 180._JPRB/RPI ! radians to degrees ZDLAT = 180._JPRB / NDGLG ! distance in degrees between latitude lines ZGRDLAT= RPI / NDGLG ! distance in radians between latitude lines ZGRDLAT2=ZGRDLAT*0.55_JPRB @@ -296,10 +308,10 @@ SUBROUTINE TM5M7_SRC( & ZGRDLON(JL)=ZDLON ZLAT=ASIN(YDCSGLEG%RMU(IGLGLO)) ! latitude in radians - ZGLON(JL)=PGELAM(JL)*ZDEGRAD - ZGLAT(JL)=ZLAT*ZDEGRAD - ZGDLAT(JL)=ZDLAT - ZGDLON(JL)=360._JPRB*Z1GP + ZGLON(JL)=PGELAM(JL)*ZDEGRAD ! Lon in Degrees + ZGLAT(JL)=ZLAT*ZDEGRAD ! Lat in Degrees + ZGDLAT(JL)=ZDLAT ! Lat + ZGDLON(JL)=360._JPRB*Z1GP ! Lat spacing ZLOCALTIM =RHGMT + ZGLON(JL)/360._JPRB*RDAY ZDIURN(JL)=COS( ((ZLOCALTIM-54000._JPRB)/RDAY) * 2._JPRB*RPI)+1._JPRB @@ -380,9 +392,18 @@ SUBROUTINE TM5M7_SRC( & ! RCHG: PCI, PCLAKE, PLSM, PSST CALL TM5M7_SRC_SS( KIDIA, KFDIA, KLON, KLEV, & & PCI, PCLAKE, PLSM, PSST, ZWNDSS, & - & emis_mass, emis_number ) - - + & emis_mass, emis_number ,YDEAERSRC) + +!------------------------------------------------------------ +! 1.9 INTERPOLATION FIELDS DUST TEGEN ONLINE SCHEME +! --------- +IF (NDDUST == 8) THEN + CALL YDUSTCLIM%INTERPOLATION( & + KIDIA, KFDIA, KLON, & ! start/end, number of columns + PGELAT, PGELAM, & ! lat/lon in radians + ISOILPH1, ISOILPH2, ISOILPH3, ISOILPH4, ISOILPH5, & + IZ0AM, IPOTSRC, ISOILTYPE, IAREA, ICULT,IZ0M, IFPAR, IMM, ILAI_MAX, ILAI_AVG) +ENDIF !----------------------------------------------------------------------- !* 2.0 DESERT DUST @@ -400,8 +421,10 @@ SUBROUTINE TM5M7_SRC( & & PAP(:,KLEV), PTL, PSOIL_TYPE, & & PFRTI, PCVL, PCVH, KTVL, KTVH, & & emis_mass, emis_number, PAERFLX, ZGLON, ZGLAT, & - & ZRWPWP, ZRWSAT, ZAERMAP, PALB, PALBD, PWS1, PHSDFOR) - + & ZRWPWP, ZRWSAT, ZAERMAP, PALB, PALBD, PWS1, PHSDFOR, & + & IMM,ISOILPH1, ISOILPH2, ISOILPH3, ISOILPH4, ISOILPH5, & + & IZ0AM, IPOTSRC, ISOILTYPE, IAREA, ICULT,IZ0M, IFPAR, GPGAW, & + & ILAI_MAX, ILAI_AVG) !----------------------------------------------------------------------- !* 3.0 PARTICULATE ORGANIC MATTER ! --------------------------------------------------------- @@ -480,12 +503,10 @@ SUBROUTINE TM5M7_SRC( & IF(associated(EMIS_MASS(IMODE)%d3)) DEALLOCATE(EMIS_MASS(IMODE)%d3) ENDDO +END ASSOCIATE END ASSOCIATE END ASSOCIATE IF (LHOOK) CALL DR_HOOK('TM5M7_SRC',1,ZHOOK_HANDLE) - - - END SUBROUTINE TM5M7_SRC diff --git a/ifs-source/arpifs/m7/phys_ec/tm5m7_src_dust.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_src_dust.F90 index d21971cc..8b6a4cab 100644 --- a/ifs-source/arpifs/m7/phys_ec/tm5m7_src_dust.F90 +++ b/ifs-source/arpifs/m7/phys_ec/tm5m7_src_dust.F90 @@ -4,7 +4,10 @@ SUBROUTINE TM5M7_SRC_DUST( YDEPHY, YDEAERMAP, YDEAERSRC, & & SP, PTL, PSOIL_TYPE, & & PFRTI, PCVL, PCVH, KTVL, KTVH, & & EMIS_MASS, EMIS_NUMBER ,PAERFLX,PGLON, PGLAT, & - & PRWPWP,PRWSAT,PAERMAP,PALB,PALBD,PWS1,PHSDFOR) + & PRWPWP,PRWSAT,PAERMAP,PALB,PALBD,PWS1,PHSDFOR,& + & IMM,ISOILPH1, ISOILPH2, ISOILPH3, ISOILPH4, ISOILPH5, & !Tegen scheme only - not all used yet + & IZ0AM, IPOTSRC, ISOILTYPE, IAREA, ICULT,IZ0M, IFPAR, GPGAW,& !Tegen scheme only - not all used yet + & ILAI_MAX,ILAI_AVG) !Tegen scheme only - not all used yet ! RCHG -> Here a dependence is KLEV => it is that ok? @@ -63,7 +66,8 @@ SUBROUTINE TM5M7_SRC_DUST( YDEPHY, YDEAERMAP, YDEAERSRC, & ! │ Modifications : │ ! │ ------------- │ ! │ Jun. 2024 - R. Checa-Garcia: revision for CY48r1 and refactory │ -! │ │ +! │ Apr. 2025 - BSC: Add Tegen dust scheme | +! │ | ! ╰────────────────────────────────────────────────────────────────────────────╯ @@ -73,31 +77,95 @@ SUBROUTINE TM5M7_SRC_DUST( YDEPHY, YDEAERMAP, YDEAERSRC, & USE YOMLUN, ONLY : NULOUT USE PARKIND1 ,ONLY : JPIM ,JPRB USE YOMHOOK ,ONLY : LHOOK, DR_HOOK, JPHOOK - -USE YOMCST, ONLY : RPI +USE YOMCST, ONLY : RPI ! -- M7 modules ---------------------------------------------------------------- USE TM5M7_DATA, ONLY: NMOD, MODE_ACI, MODE_COI, sigma, sigma_lognormal, & - & ddust,iacci,icoai -USE TM5M7_EMIS_DATA, ONLY: MODAL_EMISSIONS, NTRACED, & - & nclass, nmode,nbin, nats,solspe, nsoilph, nfpar, & - & umin, z0_min, lai_lim, lai_lim2, ROA, & - & U1FAC, cd, min_ai, max_ai, min_ci, max_ci, & - & vkarman, zz, airfac, DMIN, DMAX, DSTEP, & - & UTH, SREL, SRELV, SU_SRELV, & - & ratio_coa, ratio_acc, denom_acc_inv, denom_coa_inv, & - & mf_coa_r12_inv, mf_acc_r12_inv, & - & mmr_ai, mmr_ci - + & iacci,icoai +! +USE TM5M7_EMIS_DATA, ONLY: MODAL_EMISSIONS, & + & nsoilph, nfpar, & + & vkarman!, & + USE YOEPHY , ONLY : TEPHY USE YOEAERMAP, ONLY : TEAERMAP USE YOEAERSRC, ONLY : TEAERSRC +!------------------------------------------------------------------------------! +! 0.6 ARGUMENTS TEGEN ! +! ! +!------------------------------------------------------------------------------! + +! parameters for online dust calculations +INTEGER, PARAMETER :: ntraced=8 ! number of coarse-grained bins + ! in the original emission model +INTEGER, PARAMETER :: nbin=24 ! number of discretization points per bin +INTEGER, PARAMETER :: nclass=ntraced*nbin ! total number of discretization points +INTEGER, PARAMETER :: nats=12 ! number of soil types +INTEGER, PARAMETER :: nmode=4 ! number of particle size distributions in soils, + ! which distinguishes between clay, silt, + ! medium/fine sand, and coarse sand +INTEGER, PARAMETER :: nspe=nmode*3+2 ! for explanation, see below +REAL(KIND=JPRB), PARAMETER :: xmair=28.94 ! mass of air, g/mol +REAL(KIND=JPRB), PARAMETER :: xmdust=xmair +! Constants used in the parameterization of the efficient friction velocity ratio, +! see Eqs. (17-20) in MB95: +REAL(KIND=JPRB), PARAMETER :: aeff=0.35 +REAL(KIND=JPRB), PARAMETER :: xeff=10. +REAL(KIND=JPRB), PARAMETER :: u1fac=0.6 ! 0.7 in EC-Earth 3.2.3 +REAL(KIND=JPRB), PARAMETER :: ddcal=0.1 + +REAL(KIND=JPRB), PARAMETER :: cd=1.2507E-06 ! flux dimensioning parameter [g s^2/cm^4] +REAL(KIND=JPRB), PARAMETER :: z0_min=1.e-2 +REAL(KIND=JPRB), PARAMETER :: lai_lim=0.25 +REAL(KIND=JPRB), PARAMETER :: lai_lim2=0.5 +REAL(KIND=JPRB), PARAMETER :: d_thrsld=2.31e-6 ! threshold value +REAL(KIND=JPRB), PARAMETER :: Dmin=2.0210403762e-5 ! diameter (cm) at first discretization point +REAL(KIND=JPRB), PARAMETER :: Dmax=0.126667434757 ! diameter (cm) at last discretization point +REAL(KIND=JPRB), PARAMETER :: Dstep=0.04577551202 ! diameter increment in log-space +REAL(KIND=JPRB), PARAMETER :: grav = 9.80665 ! m/s2 +! Constants in the parameterization of the Reynolds number, +! see Eq. (5) in MB95: +REAL(KIND=JPRB), PARAMETER :: a_rnolds=1331.647 ! Reynolds constant +REAL(KIND=JPRB), PARAMETER :: b_rnolds=0.38194 ! Reynolds constant +REAL(KIND=JPRB), PARAMETER :: x_rnolds=1.561228 ! Reynolds constant +REAL(KIND=JPRB), PARAMETER :: roa=0.001227 ! reference air density (g/cm^3) + +REAL(KIND=JPRB) :: rho_air ! variable air density (g/cm^3) +REAL(KIND=JPRB), PARAMETER :: rgas =8.3144 +REAL(KIND=JPRB), PARAMETER :: airfac=1./rgas*xmair*1.e-6 ! factor for rho_air +REAL(KIND=JPRB) :: airdens_ratio, airdens_ratio2 +REAL(KIND=JPRB), PARAMETER :: umin=13.75 ! minimum threshold friction velocity (cm/s) +REAL(KIND=JPRB), PARAMETER :: ZZ=1000. ! wind measurement height (cm) +REAL(KIND=JPRB), PARAMETER :: ddust = 2.650 ! Density du [g cm-3] +REAL(KIND=JPRB), PARAMETER :: dust_density = ddust * 1.e3 + +INTEGER(KIND=JPIM), PARAMETER :: min_ai=1 +INTEGER(KIND=JPIM), PARAMETER :: max_ai=1 +! Boundaries for Coa. mode +INTEGER(KIND=JPIM), PARAMETER :: min_ci=2 +INTEGER(KIND=JPIM), PARAMETER :: max_ci=4 +REAL(KIND=JPRB), PARAMETER :: mf_acc_r1 = 0.313758 +REAL(KIND=JPRB), PARAMETER :: mf_acc_r2 = 0.684043 +REAL(KIND=JPRB), PARAMETER :: mf_coa_r1 = 0.00518309 +REAL(KIND=JPRB), PARAMETER :: mf_coa_r2 = 0.980634 + +REAL(KIND=JPRB), PARAMETER :: ratio_coa = mf_coa_r1/mf_coa_r2 +REAL(KIND=JPRB), PARAMETER :: ratio_acc = mf_acc_r2/mf_acc_r1 +REAL(KIND=JPRB), PARAMETER :: denom_acc_inv = 1./(mf_acc_r1-ratio_coa*mf_acc_r2) +REAL(KIND=JPRB), PARAMETER :: denom_coa_inv = 1./(mf_coa_r2-ratio_acc*mf_coa_r1) +REAL(KIND=JPRB), PARAMETER :: mf_acc_r12_inv = 1./(mf_acc_r1+mf_acc_r2) +REAL(KIND=JPRB), PARAMETER :: mf_coa_r12_inv = 1./(mf_coa_r1+mf_coa_r2) + +REAL(KIND=JPRB), PARAMETER :: mmr_ai=0.37E-4 ! cm +REAL(KIND=JPRB), PARAMETER :: mmr_ci=1.75E-4 + +!---------------------------------------------------------------- !----------------------------------------------------------------------- !* 0.1 ARGUMENTS ! --------- - +INTEGER(KIND=JPIM), INTENT(IN) :: IMM ! not used TYPE(TEPHY), INTENT(IN) :: YDEPHY TYPE(TEAERMAP), INTENT(INOUT) :: YDEAERMAP TYPE(TEAERSRC), INTENT(IN) :: YDEAERSRC @@ -109,6 +177,7 @@ SUBROUTINE TM5M7_SRC_DUST( YDEPHY, YDEAERMAP, YDEAERSRC, & INTEGER(KIND=JPIM), INTENT(IN) :: KTILES INTEGER(KIND=JPIM), INTENT(IN) :: KSW +REAL(KIND=JPRB), INTENT(IN) :: GPGAW(KLON) REAL(KIND=JPRB), INTENT(IN) :: PLSM(KLON) REAL(KIND=JPRB), INTENT(IN) :: PWIND(KLON) ! 10m wind speed, see tm5m7_src.F90 REAL(KIND=JPRB), INTENT(IN) :: PSNS(KLON) ! Snow depth @@ -126,28 +195,23 @@ SUBROUTINE TM5M7_SRC_DUST( YDEPHY, YDEAERMAP, YDEAERSRC, & ! M7 TYPE(MODAL_EMISSIONS), INTENT(INOUT) :: emis_mass(NMOD) TYPE(MODAL_EMISSIONS), INTENT(INOUT) :: emis_number(NMOD) -REAL(KIND=JPRB), INTENT(INOUT) :: PAERFLX(KLON,12,9) +REAL(KIND=JPRB), INTENT(INOUT) :: PAERFLX(KLON,12,9) !diagnostic array/not used. REAL(KIND=JPRB), INTENT(IN) :: PGLON(KLON),PGLAT(KLON) REAL(KIND=JPRB), INTENT(INOUT) :: PRWPWP, PRWSAT, PAERMAP(KLON,5) REAL(KIND=JPRB), INTENT(IN) :: PALB(KLON), PALBD(KLON,KSW) REAL(KIND=JPRB), INTENT(IN) :: PWS1(KLON),PHSDFOR(KLON) +REAL(KIND=JPRB), INTENT(IN) :: ISOILPH1(KLON), ISOILPH2(KLON), ISOILPH3(KLON), ISOILPH4(KLON), ISOILPH5(KLON), & + & IZ0AM(KLON), IPOTSRC(KLON), IAREA(KLON), ICULT(KLON) +REAL(KIND=JPRB), INTENT(IN) :: IZ0M(KLON), IFPAR(KLON) +REAL(KIND=JPRB), INTENT(IN) :: ILAI_MAX(KLON) ,ILAI_AVG(KLON) +REAL(KIND=JPRB), INTENT(IN) :: ISOILTYPE(KLON) + !* 0.5 LOCAL VARIABLES ! --------------- - +REAL(KIND=JPRB) :: exp_Dstep, sqrt_2pi INTEGER(KIND=JPIM), PARAMETER :: KBINDD=3 -INTEGER(KIND=JPIM) :: JL, I_S1,I_S11, ID, JAER, INBAER -INTEGER(KIND=JPIM) :: IDUST,KK,KKK,KFIRST,KKMIN,NN -REAL(KIND=JPRB) :: FDP1,FDP2 -REAL(KIND=JPRB) :: VEGET, z0s, dpd, uthp, flux_diam, cultfac1 -REAL(KIND=JPRB) :: AAA,BB, CCC, AEFF,FF, XEFF, feff, DBSTART, USTAR, rho_air -REAL(KIND=JPRB) :: DLAST,DP -REAL(KIND=JPRB) :: AIRDENS_RATIO,AIRDENS_RATIO2 -REAL(KIND=JPRB) :: FLUX_R1,FLUX_R2 -REAL(KIND=JPRB) :: SNOWCOVER(KLON), DESERT(KLON) -REAL(KIND=JPRB) :: LAI_EFF(KLON),UMIN2(KLON), ALPHA(KLON), C_EFF(KLON) -REAL(KIND=JPRB) :: Z0(KLON) ! Local copy of roughness length -REAL(KIND=JPRB) :: SOIL_TYPE(KLON) ! Local copy of soil type +INTEGER(KIND=JPIM) :: JL, ID, JAER, INBAER REAL(KIND=JPRB) :: FLUX_AI(KLON), FLUX_CI(KLON),FNUM_AI(KLON),FNUM_CI(KLON) REAL(KIND=JPRB) :: FLUXTOT(NTRACED),FDUST(NTRACED) @@ -170,13 +234,338 @@ SUBROUTINE TM5M7_SRC_DUST( YDEPHY, YDEAERMAP, YDEAERSRC, & REAL(KIND=JPRB) :: RDDUSRC(9) LOGICAL :: LLDUST(KLON,12), LLPDUSTS(KLON) REAL(KIND=JPHOOK) :: ZHOOK_HANDLE +LOGICAL :: TEGEN +CHARACTER(LEN=45) :: CLAERWND(0:3) +!---------------------------------------------------------------- +! SOIL CARACTERISTICS: +! ZOBLER texture classes: +!---------------------------------------------------------------- +!! nats =12 +!! nspe =nmode*3+2 = 14 +!! nmode=4 +INTEGER :: jp + +!!!!>>>>> +REAL(KIND=JPRB), DIMENSION(nats,nspe) :: solspe +!-- soil type 1 : Coarse +DATA (solspe(1,jp),jp=1,nspe)/ & + 0.0707, 2., 0.43 , & + 0.0158, 2., 0.4 , & + 0.0015, 2., 0.17 , & + 0.0002 ,2., 0. , & + 2.1E-06, 0.2/ +!-- soil type 2 : Medium +DATA (solspe(2,jp),jp=1,nspe)/ & + 0.0707, 2., 0. , & + 0.0158, 2., 0.37 , & + 0.0015, 2., 0.33 , & + 0.0002, 2., 0.3 , & + 4.0e-6, 0.25/ +!-- soil type 3 : Fine +DATA (solspe(3,jp),jp=1,nspe)/ & + 0.0707, 2., 0. , & + 0.0158, 2., 0. , & + 0.0015, 2., 0.33 , & + 0.0002, 2., 0.67 , & + !>>> TvN + ! 33% x 1e-5 + 67% x 1e-7 = 3.367e-6 cm^-1 + !1.E-07, 0.5/ + 3.4e-6, 0.5/ + !<<< TvN +!-- soil type 4 : Coarse Medium +DATA (solspe(4,jp),jp=1,nspe)/ & + 0.0707, 2., 0.1 , & + 0.0158, 2., 0.5 , & + 0.0015, 2., 0.2 , & + 0.0002, 2., 0.2 , & + 2.7E-06, 0.23/ +!-- soil type 5 : Coarse Fine +DATA (solspe(5,jp),jp=1,nspe)/ & + 0.0707, 2., 0. , & + 0.0158, 2., 0.5 , & + 0.0015, 2., 0.12 , & + 0.0002, 2., 0.38 , & + !>>> TvN + ! 50% x 1e-6 + 12% x 1e-5 + 38% x 1e-6 = 2.08e-6 cm^-1 + !2.8E-06, 0.25/ + 2.1e-6, 0.25/ + !<<< TvN +!-- soil type 6 : Medium Fine +DATA (solspe(6,jp),jp=1,nspe)/ & + 0.0707, 2., 0. , & + 0.0158, 2., 0.27 , & + 0.0015, 2., 0.25 , & + 0.0002, 2., 0.48 , & + !>>> TvN + ! 27% x 1e-6 + 25% x 1e-5 + 48% x 1e-7 = 2.818e-6 cm^-1 + !1e-07, 0.36/ + 2.8e-6, 0.36/ + !<<< TvN +!-- soil type 7 : Coarse, Medium, Fine +DATA (solspe(7,jp),jp=1,nspe)/ & + 0.0707, 2., 0.23 , & + 0.0158, 2., 0.23 , & + 0.0015, 2., 0.19 , & + 0.0002, 2., 0.35 , & + 2.5E-06, 0.25/ +!-- soil type 8 : Organic +DATA (solspe(8,jp),jp=1,nspe)/ & + 0.0707, 2., 0.25 , & + 0.0158, 2., 0.25 , & + 0.0015, 2., 0.25 , & + 0.0002, 2., 0.25 , & + 0., 0.5/ +!-- soil type 9 : Ice +DATA (solspe(9,jp),jp=1,nspe)/ & + 0.0707, 2., 0.25 , & + 0.0158, 2., 0.25 , & + 0.0015, 2., 0.25 , & + 0.0002, 2., 0.25 , & + 0., 0.5/ +!-- soil type 10 : Potential Lakes (additional) +! GENERAL CASE +DATA (solspe(10,jp),jp=1,nspe)/ & + 0.0707, 2., 0. , & + 0.0158, 2., 0. , & + 0.0015, 2., 1. , & + 0.0002, 2., 0. , & + 1.E-05, 0.25/ +!-- soil type 11 : Potential Lakes (clay) +! GENERAL CASE +DATA (solspe(11,jp),jp=1,nspe)/ & + 0.0707, 2., 0. , & + 0.0158, 2., 0. , & + 0.0015, 2., 0. , & + 0.0002, 2., 1. , & + 1.E-05, 0.25/ +!-- soil type 12 : Potential Lakes Australia +DATA (solspe(12,jp),jp=1,nspe)/ & + 0.0707, 2., 0. , & + 0.0158, 2., 0. , & + 0.0027, 2., 1. , & + 0.0002, 2., 0. , & + 1.E-05, 0.25/ + +!!!!!!<<<<< +!------------CRITICAL ARRAYS------------- +REAL(KIND=JPRB) :: SOIL_TYPE(KLON) +REAL(KIND=JPRB) :: POT_SOURCE(KLON) ! Local potencial sources are calculated +REAL(KIND=JPRB) :: CULT(KLON) ! Local copy of cultivation +REAL(KIND=JPRB) :: Z0(KLON) ! Local copy of roughness lengthi +REAL(KIND=JPRB) :: FPAR(KLON) ! Local copy of fraction photochem/radiation +REAL(KIND=JPRB) :: SOILPH(KLON) ! Local copy of [THIS SHOULD BE 5 different types] + +REAL(KIND=JPRB) :: UTH ( NCLASS) +REAL(KIND=JPRB) :: SREL (NATS,NCLASS) +REAL(KIND=JPRB) :: SRELV(NATS,NCLASS) +REAL(KIND=JPRB) :: SU_SRELV(NATS,NCLASS) -!------------------------------------------------------------------------------- +REAL(KIND=JPRB) :: SNOWCOVER(KLON), DESERT(KLON) +REAL(KIND=JPRB) :: LAI_EFF(KLON),UMIN2(KLON), ALPHA(KLON), C_EFF(KLON) +REAL(KIND=JPRB) :: AREA(KLON) + +INTEGER(KIND=JPIM) :: NN, ND, NS, KK, NM, NSI, NP +REAL(KIND=JPRB) :: DP, STOTAL,STOTALV +REAL(KIND=JPRB) :: su_class(nclass), su_classv(nclass), utest(nats) + +REAL(KIND=JPRB) :: VEGET, LAI_MAX, LAI_AVG, LAI_CUR, Z0S, DPD, FLUX_DIAM, CULTFAC1, DLAST +REAL(KIND=JPRB) :: AAA, BB, CCC, FF, FEFF, DBSTART, UTHP, WIND10M, USTAR +REAL(KIND=JPRB) :: XK, DDD, EE, FDP1, FDP2,temp_val +REAL(KIND=JPRB) :: SU, SUV, SU_LOC, SU_LOCV, XL, XM, XN, XNV +REAL(KIND=JPRB) :: FLUX_R1, FLUX_R2 + +REAL(KIND=JPRB) :: log_dp, log_mmd, log_stdv +REAL(KIND=JPRB), PARAMETER :: small_number = 1.0E-10 + +INTEGER(KIND=JPIM) :: ISTAT, REGION +INTEGER(KIND=JPIM) :: I, J, I_S1, I_S11, I_S111, IDUST, LAI_FLAG, MONTH, IVEG +INTEGER(KIND=JPIM) :: KKK, KFIRST, KKMIN +INTEGER(KIND=JPIM) :: I01, J01, I02, J02 +INTEGER(KIND=JPIM) :: I1, J1, I2, J2, ACCESS_MODE +! saving the status of being called +LOGICAL, SAVE :: initial = .TRUE. +#include "abor1.intfb.h" +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! IF (LHOOK) CALL DR_HOOK('TM5M7_SRC_DUST',0,ZHOOK_HANDLE) ASSOCIATE( NDUSRCP => YDEAERMAP%NDUSRCP, RDDUAER => YDEAERMAP%RDDUAER, & & RDUSRCP => YDEAERMAP%RDUSRCP, NDDUST => YDEAERSRC%NDDUST, & - & NALBEDOSCHEME => YDEPHY%NALBEDOSCHEME) ! LE4ALB to NALBEDOSCHEME + & NALBEDOSCHEME => YDEPHY%NALBEDOSCHEME, DCAL => YDEAERSRC%DCAL, & + & NAERWND => YDEAERSRC%NAERWND) ! LE4ALB to NALBEDOSCHEME + +CLAERWND(0) = '10-M WIND AS PREDICTOR FOR SS AND DU ' +CLAERWND(1) = 'PREDICTORS: WIND GUST FOR SS, 10M-WIND FOR DU' +CLAERWND(2) = 'PREDICTORS: WIND GUST FOR DU, 10M-WIND FOR SS' +CLAERWND(3) = 'WIND GUST AS PREDICTORS FOR SS AND DU ' + +! =========================== INIT +!IF( initial ) THEN + + !--------------------------------------------------------------------------------------- + ! initializations : This should be done idealy once per day. + !--------------------------------------------------------------------------------------- + uth = 0. + srel = 0. ! fraction of the grid area correspondent to each soil population + srelV = 0. ! fraction of volume + su_srelV = 0. + utest = 0. + + !--------------------------------------------------------------------------------------- + ! Uth calculation + ! Threshold friction velocity dependent on the particle diameter + ! following Eqs. (3-5) in MB95. + !--------------------------------------------------------------------------------------- + nn = 0 + dp = Dmin + !dp = MAX(Dmin, 1.0E-6) ! avoid zero or negative dp (more robust than 1e-10) + + DO WHILE (dp <= Dmax + 1.0E-5) + + nn = nn + 1 + + ! ----------------------------------------------------------------------------------- + ! Protect BB calculation: avoid dp ** x_rnolds if dp <= 0 + ! ----------------------------------------------------------------------------------- + IF (dp > 0.0) THEN + BB = a_rnolds * (dp ** x_rnolds) + b_rnolds + ELSE + !BB = b_rnolds + CALL ABOR1('ABORT: dp is negative in BB caclulation') + END IF + ! remove the check of negative + ! ----------------------------------------------------------------------------------- + ! XK computation - safe sqrt + ! ----------------------------------------------------------------------------------- + IF (roa > 0.0 .AND. ddust > 0.0 .AND. grav > 0.0) THEN + XK = SQRT(MAX(0.0, ddust * grav * 100.0 * dp / roa)) + ELSE + CALL ABOR1('ABORT: roa or ddust or grav is Negative in XK calculation') + END IF + + ! ----------------------------------------------------------------------------------- + ! CCC computation - safe sqrt + ! ----------------------------------------------------------------------------------- + IF (dp > 0.0) THEN + CCC = SQRT(MAX(0.0, 1.0 + d_thrsld / (dp ** 2.5))) + ELSE + CALL ABOR1('ABORT: dp is negative in CCC caclulation') + END IF + + ! ----------------------------------------------------------------------------------- + ! Uth computation + ! ----------------------------------------------------------------------------------- + IF (BB < 10.0) THEN + ! Safe DDD calculation + temp_val = 1.928 * (BB ** 0.092) - 1.0 + IF (temp_val > 0.0) THEN + DDD = SQRT(temp_val) + IF (DDD /= 0.0) THEN + Uth(nn) = 0.129 * XK * CCC / DDD + ELSE + CALL ABOR1('ABORT:DDD is 0 negative Uth(nn)') + !Uth(nn) = 0.0 ! PRINT UTH is zeros ABORT! IDIALY NO IF ! OR SET IT TO UMIN =! ... + END IF + ELSE + CALL ABOR1('ABORT: negative BB is 0 negative Uth(nn)') + !Uth(nn) = 0.0 !PRINT IS ZEROS ? ! ABORT + END IF + ELSE + EE = -0.0617 * (BB - 10.0) + FF = 1.0 - 0.0858 * EXP(EE) + Uth(nn) = 0.12 * XK * CCC * FF + END IF + + ! ----------------------------------------------------------------------------------- + ! Advance dp + ! ----------------------------------------------------------------------------------- + dp = dp * EXP(Dstep) + + !IF (dp > Dmax+1e.-05) CALL ABOR1("[TM5M7_SRC_DUST_INIT] NCLASS inconsistent with [Dmin,Dmax]") + END DO + !THERE is BUG is the loop is not consistance with nn Uth has unidentified variables + !--------------------------------------------------------------------------------------- + ! surface calculation - calculation of the soil size distribution + ! Through all soil particle diameter the calculation of the relative contribution + ! in surface and volume of the soil population independently of the grid + !--------------------------------------------------------------------------------------- + ! ============================ +! Soil Types Loop +! ============================ + DO ns = 1, nats ! soil types + + Stotal = 0. + StotalV = 0. + su_class = 0. + su_classV = 0. + + kk = 0 + dp = Dmin + !dp = MAX(Dmin, 1.0E-10) + DO WHILE( dp <= Dmax + 1.0E-5 ) + kk = kk + 1 + su = 0. + suV = 0. + DO nm = 1, Nmode ! particle size populations in soils + nd = ((nm - 1) *3 ) + 1 ! index to mass median diameter + nsi = nd + 1 ! index to standard deviation + np = nd + 2 ! index to relative contribution + ! + ! based on soil type and contribution of population of the soil type the soil size + ! distribution population is calculated + ! + + !>>> TvN + ! Bug in the original code: nd should be np + ! Since solspe(ns,nd) is never zero + ! and the final result is proportional to solspe(ns,np), + ! the bug has no impact on the results. + !IF (solspe(ns,nd).EQ.0.) THEN + !IF (solspe(ns,np).EQ.0.) THEN + IF (solspe(ns,np).EQ.0. .or. solspe(ns,nsi).EQ.0. .or. solspe(ns,nd).EQ.0.) THEN + !<<< TvN + su_loc = 0. + su_locV=0. + ELSE + xk = solspe(ns,np)/(SQRT(2.* RPI)*LOG(solspe(ns,nsi))) + xl = ( (LOG(dp) - LOG( solspe(ns,nd ) ))**2 ) / & + (2.*(LOG( solspe(ns,nsi) ))**2 ) + xm = xk * EXP(-xl) ! value of the lognormal mass size distribution + ! dM/dln(dp) in Eq. (29) in MB95 + ! (Aerosol Sci. Technol., 1994) + xn = ddust*(2./3.)*(dp/2.) ! surface + ! cf. the denominator in Eq. (30) in MB95 + ! The factor 2 difference is irrelevant, + ! since only relative contributions are used. + xnV = 1. !volume + su_loc = (xm*Dstep/xn) ! Eq. (30) in MB95 + su_locV = (xm*Dstep/xnV) + END IF ! + su = su + su_loc + suV = suV + su_locV + END DO !Nmode + + su_class(kk) = su + su_classV(kk) = suV + Stotal = Stotal + su + StotalV = StotalV + suV + dp = dp * EXP(Dstep) + END DO !dp + + DO nn = 1,Nclass + IF (Stotal.EQ.0.)THEN + srel (ns,nn) = 0. + srelV(ns,nn) = 0. + ELSE + srel (ns,nn) = su_class(nn)/Stotal + srelV (ns,nn) = su_classV(nn)/StotalV + utest (ns ) = utest(ns)+srelV(ns,nn) + su_srelV(ns,nn) = utest(ns) + END IF + END DO !j=1,nclass + END DO !ns (soil type) + + initial = .FALSE. +!END IF ! =========================== INIT ! ifs vegetation ! @@ -200,42 +589,59 @@ SUBROUTINE TM5M7_SRC_DUST( YDEPHY, YDEAERMAP, YDEAERSRC, & !18) H ! Mixed Forest/woodland !19) H ! Interrupted Forest !20) L ! Water and Land Mixtures +!PAERFLX(KIDIA:KFDIA,1:12,1:9)=0._JPRB ZFLX_SDUST(KIDIA:KFDIA,1:9,1:12)=0._JPRB -if (NDDUST==4)then -! Make local copy: -uthp = 0._JPRB -SOIL_TYPE(KIDIA:KFDIA)=PSOIL_TYPE(KIDIA:KFDIA) -! init -xeff=10.0_JPRB -aeff=0.35_JPRB -! Ensure initialization is done elsewhere (tm5m7_init.F90) -! Also - are necessary input data available.. (soil type, ...) - - - ! ideally only once per day .. not yet possible -!VH IF( newday ) THEN - - ! calculation of snow cover from snow dept - ! Tegen et al. fraction (0-1) - snowcover(KIDIA:KFDIA) = PSNS(KIDIA:KFDIA) / 0.015 - WHERE( snowcover(KIDIA:KFDIA) > 1. ) snowcover(KIDIA:KFDIA) = 1. - - !--------------------------------------------------------------------------------------- - ! Prepare the flux calculation - !--------------------------------------------------------------------------------------- - ! - ! Calculations done on monthly fields - - ! default: no dust source due to - ! - vegetation - ! - not a desert pixel or - ! - no pure land grid cell - lai_eff(KIDIA:KFDIA) = 0. - - ! per grid box - DO JL=KIDIA,KFDIA + +DUSTOPT: If (NDDUST==8) then + ! Make local copy: + uthp = 0._JPRB + SOIL_TYPE(KIDIA:KFDIA)= ISOILTYPE(KIDIA:KFDIA) + POT_SOURCE(KIDIA:KFDIA)= IPOTSRC(KIDIA:KFDIA) + FPAR(KIDIA:KFDIA) = IFPAR(KIDIA:KFDIA) + Z0(KIDIA:KFDIA) = IZ0M(KIDIA:KFDIA) + + ! calculation of snow cover from snow dept + ! Tegen et al. fraction (0-1) + snowcover(KIDIA:KFDIA) = PSNS(KIDIA:KFDIA) / 0.015 + WHERE( snowcover(KIDIA:KFDIA) > 1. ) snowcover(KIDIA:KFDIA) = 1. + + + !!Maria G Checking the decimal values ? + !DO JL = KIDIA, KFDIA + + ! IF (SOIL_TYPE(JL) > 1.0 .AND. SOIL_TYPE(JL) < 2.0) THEN + ! WRITE(NULOUT,*) 'Decimal soil type between 1 and 2:', SOIL_TYPE(JL), & + ! 'at lat r =', PGLAT(JL), 'lon r =', PGLON(JL) + + ! ELSE IF (SOIL_TYPE(JL) > 2.0 .AND. SOIL_TYPE(JL) < 3.0) THEN + ! WRITE(NULOUT,*) 'Decimal soil type between 2 and 3:', SOIL_TYPE(JL), & + ! 'at lat r =', PGLAT(JL), 'lon r =', PGLON(JL) + + ! ELSE IF (SOIL_TYPE(JL) > 4.0 .AND. SOIL_TYPE(JL) < 5.0) THEN + ! WRITE(NULOUT,*) 'Decimal soil type between 4 and 5:', SOIL_TYPE(JL), & + ! 'at lat r =', PGLAT(JL), 'lon r =', PGLON(JL) + + ! END IF + + !END DO + ! + ! + !--------------------------------------------------------------------------------------- + ! Prepare the flux calculation + !--------------------------------------------------------------------------------------- + ! + ! Calculations done on monthly fields + + ! default: no dust source due to + ! - vegetation + ! - not a desert pixel or + ! - no pure land grid cell + lai_eff(KIDIA:KFDIA) = 0. + + ! per grid box + DO JL=KIDIA,KFDIA TV_DAT(:)=0. ! Fraction IFS land type in grid cell, between 0-1 ! VH identify dominant ifs land use type. DO ID=1,KTILES @@ -276,25 +682,25 @@ SUBROUTINE TM5M7_SRC_DUST( YDEPHY, YDEAERMAP, YDEAERSRC, & ! based on all available months, ! it has a much better spatial coverage ! than the individual months. - ! VH IF( PZ0M(JL) <= 0. .AND. Pz0M(JL) > 0. ) THEN - ! VH z0(JL) = Pz0M(JL) - ! VH ENDIF - !<<< TvN - -!VH - for now neglect this 'pot_source' input. Can we use ECMWF quantities? -!VH IF( pot_source(JL) > 0.5 ) THEN -!VH ! if the potential lake area is > 50%, it is a pot. lake grid -!VH soil_type(JL) = 10. - !>>> TvN - ! Use minimum value for roughness length. - ! Since there are only few potential source areas - ! where the annual mean is not available, - ! this will only have a limited impact. - !IF( z0(JL,idate(2)) <= 0. ) z0(JL,idate(2)) = 0.001 !! if z0 is not valid or missing (cm), PhD thesis Marticorena p.85 -!VH IF( PZ0M(JL) <= 0. ) z0(JL) = z0_min -!VH !<<< TvN -!VH END IF + IF( Z0(JL) <= 0. .AND. IZ0AM(JL) > 0. ) THEN + Z0(JL) = IZ0AM(JL) + !ELSE IF ( Z0(JL) <= 0. .AND. IZ0AM(JL) < 0. ) THEN + ! Z0(JL) = z0_min + ENDIF + !<<< TvN + IF( pot_source(JL) > 0.5 ) THEN + ! if the potential lake area is > 50%, it is a pot. lake grid + SOIL_TYPE(JL) = 10. + !>>> TvN + ! Use minimum value for roughness length. + ! Since there are only few potential source areas + ! where the annual mean is not available, + ! this will only have a limited impact. + !IF( z0(JL,idate(2)) <= 0. ) z0(JL,idate(2)) = 0.001 !! if z0 is not valid or missing (cm), PhD thesis Marticorena p.85 + IF( Z0(JL) <= 0. ) Z0(JL) = z0_min + !<<< TvN + END IF !--------------------------------------------------------------------------------------- ! Calculation of the ratio: horizontal/vertical flux (alpha) !--------------------------------------------------------------------------------------- @@ -304,9 +710,8 @@ SUBROUTINE TM5M7_SRC_DUST( YDEPHY, YDEAERMAP, YDEAERSRC, & ! When cult=0, the cultivation field info is not used. Otherwise: cult(JL)=3 !!$ cult(JL) = 0. -!VH desert(JL) = soilph(JL,3) + soilph(JL,4) -!VH is this good enough?? - desert(JL)=TV_DAT(8)+TV_DAT(11) + desert(JL) = isoilph3(JL) + isoilph4(JL) + !desert(JL)=TV_DAT(8)+TV_DAT(11) veget=0. veget = veget + PFRTI(JL,4)+PFRTI(JL,6)+PFRTI(JL,7) ! dry low veg + dry high veg + snow under high veg @@ -329,72 +734,53 @@ SUBROUTINE TM5M7_SRC_DUST( YDEPHY, YDEAERMAP, YDEAERSRC, & ! so we start with no vegetation --> full area available lai_eff(JL) = 1. - !VH consider alternative computation for lai_eff, without use of fpar, but use of PCVH/PCVL or so. - !VH !-- get max/mean fpar of the full year --> needed for shrub land - !VH lai_max = MAXVAL(fpar(JL,1:12)) - !VH lai_avg = SUM(fpar(JL,1:12)) / 12. - !VH lai_cur = fpar(JL,idate(2)) -!VH -!VH -!VH ! --------------------------------------------- -!VH ! 3 classes: grass, shrub, mixed{grass,shrub} -!VH ! --------------------------------------------- -!VH -!VH ! first: grass dominated (tv(2) and tv(7)) -!VH ! current fpar determines available area -!VH !VH IF( (tv_dat(iglbsfc,2)%data(JL,1) + tv_dat(iglbsfc,7)%data(JL,1)) > 50 ) THEN -!VH !VH: over 50% tile fraction is low veg, with dominant veg type being agricultural land or range land: -!VH IF ((TV_DAT(2) + TV_DAT(7)) > 0.5 ) THEN -!VH -!VH lai_eff (JL) = 1. - lai_cur / lai_lim -!VH -!VH ! second: shrub dominated (tv(16) and tv(17)) -!VH ! if max(fpar) > 0.25 --> no dust -!VH ! else max(fpar) determines area -!VH ELSEIF( (tv_dat(16) + tv_dat(17)) > 0.5 ) THEN -!VH -!VH ! lai_eff is zero for lai_max > lai_min and -!VH ! [0,1] for lai_max < lai_lim -!VH lai_eff (JL) = 1. - lai_max / lai_lim -!VH -!VH ! third: mixtures of grass and shrub land -!VH ! if mean(fpar) > 0.5 --> shrub dominated --> use max(fpar) for scaling -!VH ! else grass dominated --> use current(fpar) for scaling -!VH ELSE -!VH -!VH IF( lai_avg > lai_lim2 ) THEN -!VH lai_eff (JL) = 1. - lai_max / lai_lim -!VH ELSE -!VH lai_eff (JL) = 1. - lai_cur / lai_lim -!VH END IF -!VH -!VH END IF + !-- get max/mean fpar of the full year --> needed for shrub land + !lai_max = MAXVAL(ifpar(JL,1:12)) + !lai_avg = SUM(ifpar(JL,1:12)) / 12. + lai_max = ILAI_MAX(JL) + lai_avg = ILAI_AVG(JL) + lai_cur = IFPAR(JL) - ! limit to valid range [0,1] - lai_eff(JL) = MAX( 0., MIN( 1., lai_eff(JL) ) ) + ! --------------------------------------------- + ! 3 classes: grass, shrub, mixed{grass,shrub} + ! --------------------------------------------- + ! HERE + ! first: grass dominated (tv(2) and tv(7)) + ! current fpar determines available area + !VH IF( (tv_dat(iglbsfc,2)%data(JL,1) + tv_dat(iglbsfc,7)%data(JL,1)) > 50 ) THEN + !VH: over 50% tile fraction is low veg, with dominant veg type being agricultural land or range land: + IF ((TV_DAT(2) + TV_DAT(7)) > 0.5 ) THEN + + lai_eff (JL) = 1. - lai_cur / lai_lim + + ! second: shrub dominated (tv(16) and tv(17)) + ! if max(fpar) > 0.25 --> no dust + ! else max(fpar) determines area + ELSEIF( (tv_dat(16) + tv_dat(17)) > 0.5 ) THEN + + ! lai_eff is zero for lai_max > lai_min and + ! [0,1] for lai_max < lai_lim + lai_eff (JL) = 1. - lai_max / lai_lim + + ! third: mixtures of grass and shrub land + ! if mean(fpar) > 0.5 --> shrub dominated --> use max(fpar) for scaling + ! else grass dominated --> use current(fpar) for scaling + ELSE -!!$ ............... !!!!hier ist das AND falsch!!!! .................. -!!$ DO month = 1, 12 -!!$ IF( ( tv_dat(JL,16) > 50 ) .OR. ( tv_dat(JL,17) > 50 ) .AND. ( lai_flag == 0 ) ) then -!!$ lai_eff(JL,month) = 1. - fpar(JL,month) / lai_lim !lai_lim=0.25 -!!$ ELSEIF( ( tv_dat(JL, 2) > 50 ) .OR. ( tv_dat(JL, 7) > 50 ) .OR. ( desert(JL) > 0.) ) then -!!$ lai_eff(JL,month) = 1. - fpar(JL,month) / lai_lim !lai_lim=0.25 -!!$ ELSE -!!$ lai_eff(JL,month) = 1. - lai_max / lai_lim !shrubs=1 -!!$ END IF -!!$ ! original formulation -!!$ ! lai_eff(j,i,1,month)=1.-(lai(j,i,1,month) & -!!$ ! *(1.-shrub(int(sp(j,i,1,5)))) & -!!$ ! +lai_max*shrub(int(sp(j,i,1,5))) & -!!$ ! )*1./lai_lim -!!$ IF( lai_eff(JL,month) <= 0 ) lai_eff(JL,month) = 0 -!!$ IF( lai_eff(JL,month) > 1 ) lai_eff(JL,month) = 1 -!!$ END DO !month + IF( lai_avg > lai_lim2 ) THEN + lai_eff (JL) = 1. - lai_max / lai_lim + ELSE + lai_eff (JL) = 1. - lai_cur / lai_lim + END IF + + END IF + + ! limit to valid range [0,1] + lai_eff(JL) = MAX( 0., MIN( 1., lai_eff(JL) ) ) END IF ! if idust=1 - ! print *, 'lai_eff=1 everywhere' !--------------------------------------------------------------------------------------- ! Lowering the threshold friction velocity depending on the presence of cultivations !--------------------------------------------------------------------------------------- @@ -403,29 +789,28 @@ SUBROUTINE TM5M7_SRC_DUST( YDEPHY, YDEAERMAP, YDEAERSRC, & umin2(JL) = umin ! !--------------------------------------------------------------------------------------- -!VH IF( cult(JL) <= 0.5 .AND. cult(JL) > 0.08 ) THEN -!VH IF( desert(JL) > 0. .OR. tv_dat(16) > 0.5 .OR. tv_dat(17) > 0.5 ) & -!VH umin2(JL) = umin * 0.93 -!VH ! -!VH !--------------------------------------------------------------------------------------- -!VH IF( tv_dat(2) > 0.5 .OR. tv_dat(7) > 0.5 ) & -!VH umin2(JL) = umin * 0.99 -!VH END IF !cult=2 -!VH -!VH ! -!VH !--------------------------------------------------------------------------------------- -!VH IF( cult(JL) > 0.5 ) THEN -!VH IF( ( desert(JL) > 0 ) .OR. ( tv_dat(16) > 0.5 ) .OR. ( tv_dat(17) > 0.5 ) ) & -!VH umin2(JL) = umin * 0.73 -!VH END IF !cult=1 + IF( icult(JL) <= 0.5 .AND. icult(JL) > 0.08 ) THEN + IF( desert(JL) > 0. .OR. tv_dat(16) > 0.5 .OR. tv_dat(17) > 0.5 ) & + umin2(JL) = umin * 0.93 + ! + !--------------------------------------------------------------------------------------- + IF( tv_dat(2) > 0.5 .OR. tv_dat(7) > 0.5 ) & + umin2(JL) = umin * 0.99 + END IF !cult=2 + ! + !--------------------------------------------------------------------------------------- + IF( icult(JL) > 0.5 ) THEN + IF( ( desert(JL) > 0 ) .OR. ( tv_dat(16) > 0.5 ) .OR. ( tv_dat(17) > 0.5 ) ) & + umin2(JL) = umin * 0.73 + END IF !cult=1 !--------------------------------------------------------------------------------------- ! Daily z0 and efficient fraction feff !--------------------------------------------------------------------------------------- - i_s1 = INT( soil_type(JL) ) ! soil type index for the calcl. of horiz. dust flux + i_s1 = INT( SOIL_TYPE(JL) ) ! soil type index for the calcl. of horiz. dust flux IF( i_s1 == 0 ) i_s1 = 9 ! set it the same as ice if the soil type is not defined - PAERFLX(JL,3,2)=i_s1 + !PAERFLX(JL,3,2)=i_s1 ! Roughness length [cm] of the surface without obstacles, i.e. of the smooth surface: Z0S = 0.001 !! en cm, these Marticorena p.85 ! optimum value for the calculation of energy loss @@ -433,11 +818,9 @@ SUBROUTINE TM5M7_SRC_DUST( YDEPHY, YDEAERMAP, YDEAERSRC, & ! Soil-type dependent saltation efficiency, ! i.e. the ratio between vertical and horizontal fluxes, ! (see Eq. (42) in MB95; Eq. (3) in Heinold et al.): - !write(5545,*)solspe(i_s1,nmode*3+1),i_s1,nmode*3+1,nmode - !write(5546,*)i_s1,solspe(i_s1,:) alpha(JL) = solspe(i_s1,nmode*3+1) - PAERFLX(JL,3,4)=alpha(JL) !=2 on land + !PAERFLX(JL,3,4)=alpha(JL) !=2 on land ! for now moist is not included but when it is done then: @@ -451,15 +834,15 @@ SUBROUTINE TM5M7_SRC_DUST( YDEPHY, YDEAERMAP, YDEAERSRC, & ! * partition of energy between the surface and the elements of rugosity * ! these pp 111-112 - IF( PZ0M(JL ) <= 0. ) THEN ! if there are no info on z0 and no potential sources - z0(JL) = 1. ! then z0 is set to 1 and no dust can be produced + IF( Z0(JL) <= 0. ) THEN ! if there are no info on z0 and no potential sources + Z0(JL) = 1. ! then z0 is set to 1 and no dust can be produced feff = 0. ELSE !>>> TvN ! Use minimum value for roughness length. ! VH convert PZ0M from [m] to [cm] !z0(JL) = z0_min !max(z0_min,PZ0M(JL)*100._JPRB ) - z0(JL) = max(z0_min,PZ0M(JL)*100._JPRB ) + Z0(JL) = max(z0_min,Z0(JL)) !write(3000,*)z0(JL),z0_min !<<< TvN ! Eq. (20) in MB95: @@ -472,15 +855,13 @@ SUBROUTINE TM5M7_SRC_DUST( YDEPHY, YDEAERMAP, YDEAERSRC, & ! gives dust and solid material which is not mobilised ! total efficient friction velocity ratio: feff = FF * CCC - PAERFLX(JL,3,5)=feff - PAERFLX(JL,4,1)=AAA - PAERFLX(JL,4,2)=BB - PAERFLX(JL,4,3)=CCC - + !!PAERFLX(JL,6,1) = feff + !!PAERFLX(JL,6,2) = AAA + !!PAERFLX(JL,6,3) = BB + !!PAERFLX(JL,6,4) = CCC ! restrict to [0,1] feff = MIN( 1., feff ) feff = MAX( 0., feff ) - !write(3001,*)feff END IF c_eff(JL) = feff ! scaling parameter for the threshold friction velocity @@ -493,10 +874,6 @@ SUBROUTINE TM5M7_SRC_DUST( YDEPHY, YDEAERMAP, YDEAERSRC, & !VH END IF ! newday - - - - ! reset flux masses flux_ai(KIDIA:KFDIA) = 0. flux_ci(KIDIA:KFDIA) = 0. @@ -523,7 +900,7 @@ SUBROUTINE TM5M7_SRC_DUST( YDEPHY, YDEAERMAP, YDEAERSRC, & IF( PLSM(JL) > 0. ) THEN ! wind10m = SQRT(u10m_dat(iglbsfc)%data(JL,1)**2 + & ! v10m_dat(iglbsfc)%data(JL,1)**2) * 100. ! cm/s - ustar = (vKarman * PWIND(JL)*100._JPRB) / ( log( ZZ / z0(JL) ) ) ! cm/s + ustar = (vKarman * PWIND(JL)*100._JPRB) / ( log( ZZ / Z0(JL) ) ) ! cm/s ENDIF IF( Ustar > 0 .AND. (Ustar > umin2(JL) / c_eff(JL)) ) THEN @@ -543,7 +920,7 @@ SUBROUTINE TM5M7_SRC_DUST( YDEPHY, YDEAERMAP, YDEAERSRC, & ! soil type index for the calcl. of horiz. dust flux - i_s1 = INT( soil_type(JL) ) + i_s1 = INT( SOIL_TYPE(JL) ) ! set it the same as ice IF( i_s1 == 0 ) i_s1 = 9 ! to separate from now on between saltation and mobilisation @@ -666,18 +1043,10 @@ SUBROUTINE TM5M7_SRC_DUST( YDEPHY, YDEAERMAP, YDEAERSRC, & ! IF(qrsur(JL).GE.w0) THEN ! fdust(JL,nn)=0. ! END IF - PAERFLX(JL,1,nn)=fdust(nn) - PAERFLX(JL,2,nn)=fluxtot(nn) + !soil size distribution + ! Through all soil particle diameter the calculation of the relative contribution + ! in surface and volume of the soil population independently of the grid END DO - PAERFLX(JL,3,1)=snowcover(JL) - !PAERFLX(JL,3,2)=cultfac1 !=1 - PAERFLX(JL,3,3)=c_eff(JL) - !PAERFLX(JL,3,5)=ustar - !PAERFLX(JL,3,6)=umin2(JL) !=13.75 - PAERFLX(JL,3,6)=uthp - PAERFLX(JL,3,7)=lai_eff(JL) !=1 most of land - PAERFLX(JL,3,8)=PWIND(JL)*100._JPRB - PAERFLX(JL,3,9)=Z0(JL) ! ------------------------------------------------------------------------------ ! Grouping into 2 modes: 1sec accumulation ! @@ -703,6 +1072,10 @@ SUBROUTINE TM5M7_SRC_DUST( YDEPHY, YDEAERMAP, YDEAERSRC, & ! in either the accumulation or coarse mode. ! In those case, all mass is put into ! the other mode. + + !units : + ! + flux_ai(JL) = flux_r1 - ratio_coa * flux_r2 flux_ci(JL) = flux_r2 - ratio_acc * flux_r1 IF (flux_ai(JL) .gt. 0. .AND. flux_ci(JL) .gt. 0.) THEN @@ -718,96 +1091,50 @@ SUBROUTINE TM5M7_SRC_DUST( YDEPHY, YDEAERMAP, YDEAERSRC, & !<<< TvN ! now scale the emissions - ! convert from g/cm2/s to g/grid_cell/month (area is in m2) - !VH flux_ai(JL) = flux_ai(JL) * sec_month * 1.E4 * area(JL) - !VH flux_ci(JL) = flux_ci(JL) * sec_month * 1.E4 * area(JL) - ! convert from g/cm2/s to g/m2/sec - flux_ai(JL) = flux_ai(JL) * 1.E4 - flux_ci(JL) = flux_ci(JL) * 1.E4 + ! convert from g/cm2/s to g/m2/s to kg/m2/s + flux_ai(JL) = flux_ai(JL) * 1.E01 *DCAL + flux_ci(JL) = flux_ci(JL) * 1.E01 *DCAL + + !---------------------------------------------------------- + ! Ensure fluxes are non-negative + IF (flux_ai(JL) < 0.0_JPRB) THEN + flux_ai(JL) = 0.0_JPRB + END IF + IF (flux_ci(JL) < 0.0_JPRB) THEN + flux_ci(JL) = 0.0_JPRB + END IF + !------------------------------------------------------------------------------- ! Calculating number flux (#/m2/sec) - ! + ! (kg/m2/s) / g/cm3 *cm3 = (kg/s)/g *1e3 = #/m2/s = ! Accumulation - fnum_ai(JL) = flux_ai(JL) * 3. / (4.*RPI*ddust*mmr_ai**3) * EXP(4.5*LOG(sigma(iacci))**2) + fnum_ai(JL) = 1e3*flux_ai(JL) * 3. / (4.*RPI*ddust*mmr_ai**3) * EXP(4.5*LOG(sigma(iacci))**2) ! Coarse - fnum_ci(JL) = flux_ci(JL) * 3. / (4.*RPI*ddust*mmr_ci**3) * EXP(4.5*LOG(sigma(icoai))**2) - - - ! scale the flux from g to kg - flux_ai(JL) = flux_ai(JL) * 1.E-03 - flux_ci(JL) = flux_ci(JL) * 1.E-03 - - END DO ! JL - - ! free memory - ! DEALLOCATE( fluxtyp, fluxtot, fdust ) - - - ! ------------------------------ - ! add sources to emission arrays - ! ------------------------------ - - ! vertical splitting is that class - ! splittype = 'nearsurface' - - ! ------------------------------ - ! accumulation mode - - ! number - - ! vertically distribute according to sector - ! CALL emission_vdist_by_sector( splittype, 'DUST', region, emis_temp(region), emis3d(region), status ) - - emis_number(mode_aci)%d3(KIDIA:KFDIA,KLEV,1) = fnum_ai(KIDIA:KFDIA) - - ! mass - - ! vertically distribute according to sector - ! CALL emission_vdist_by_sector( splittype, 'DUST', region, emis_temp(region), emis3d(region), status ) - - emis_mass(mode_aci)%d3(KIDIA:KFDIA,KLEV,1) = flux_ai(KIDIA:KFDIA) - - ! ------------------------------ - ! coarse mode - - ! number - - ! vertically distribute according to sector - ! CALL emission_vdist_by_sector( splittype, 'DUST', region, emis_temp(region), emis3d(region), status ) - - emis_number(mode_coi)%d3(KIDIA:KFDIA,KLEV,1) = fnum_ci(KIDIA:KFDIA) - - ! mass - - ! vertically distribute according to sector - !CALL emission_vdist_by_sector( splittype, 'DUST', region, emis_temp(region), emis3d(region), status ) - !write(8331,*) flux_ci(KIDIA),fnum_ci(KIDIA) - !write(8332,*) flux_ai(KIDIA),fnum_ai(KIDIA) - emis_mass(mode_coi)%d3(KIDIA:KFDIA,KLEV,1) = flux_ci(KIDIA:KFDIA) - - !else - else IF (NDDUST == 3 ) THEN ! case ECMWF formulation - !end if - -!!!!! AER emissions -!!$CALL SURF_INQ(YSURF,PRWPWP=ZRWPWP) -!!$CALL SURF_INQ(YSURF,PRWSAT=ZRWSAT) - -!!$ZETAH(KIDIA:KFDIA,0)=0._JPRB -!!$DO JK=1,KLEV -!!$ DO JL=KIDIA,KFDIA -!!$ ZETA(JL,JK) =PAP(JL,JK) /PAPH(JL,KLEV) -!!$ ZETAH(JL,JK)=PAPH(JL,JK)/PAPH(JL,KLEV) -!!$ ENDDO -!!$ENDDO - -!ITEST=0 -!ZDEGRAD= 180._JPRB/RPI -!ZDLAT = 180._JPRB / NDGLG ! distance in degrees between latitude lines -!ZGRDLAT= RPI / NDGLG ! distance in radians between latitude lines -!ZGRDLAT2=ZGRDLAT*0.55_JPRB + fnum_ci(JL) = 1e3*flux_ci(JL) * 3. / (4.*RPI*ddust*mmr_ci**3) * EXP(4.5*LOG(sigma(icoai))**2) + + IF (fnum_ai(JL) < 0.0_JPRB) THEN + fnum_ai(JL)= 0.0_JPRB + END IF + IF (fnum_ci(JL) < 0.0_JPRB) THEN + fnum_ci(JL)= 0.0_JPRB + END IF + ! ------------------------------ + ! accumulation mode + ! number + emis_number(mode_aci)%d3(JL,KLEV,1) = emis_number(mode_aci)%d3(JL,KLEV,1) +fnum_ai(JL) + + ! mass + emis_mass(mode_aci)%d3(JL,KLEV,1) = emis_mass(mode_aci)%d3(JL,KLEV,1) +flux_ai(JL) + ! ------------------------------ + ! coarse mode + ! number + emis_number(mode_coi)%d3(JL,KLEV,1) = emis_number(mode_coi)%d3(JL,KLEV,1) + fnum_ci(JL) + ! mass + emis_mass(mode_coi)%d3(JL,KLEV,1) = emis_mass(mode_coi)%d3(JL,KLEV,1)+flux_ci(JL) + ENDDO +ELSE IF (NDDUST == 3 ) THEN ! case ECMWF formulation !ZDDUAER(:) = 1.00_JPRB !KBINDD=3 @@ -1225,7 +1552,7 @@ SUBROUTINE TM5M7_SRC_DUST( YDEPHY, YDEAERMAP, YDEAERSRC, & ENDDO PAERMAP(JL,2)=ZDUEMPOT(JL,1) ! for diagnostics only ELSE - WRITE(NULOUT,FMT='(''aer_src: Unassigned grid for Lat,Lon='',2F8.2)') ZLAT,ZLON + !WRITE(NULOUT,FMT='(''aer_src: Unassigned grid for Lat,Lon='',2F8.2)') ZLAT,ZLON PAERMAP(JL,:)=0._JPRB ENDIF ENDDO @@ -1269,7 +1596,8 @@ SUBROUTINE TM5M7_SRC_DUST( YDEPHY, YDEAERMAP, YDEAERSRC, & ZHDD=MAX(1.0_JPRB,8434._JPRB/1000._JPRB) !PAERLIF(KIDIA:KFDIA,1:9)=0._JPRB -PAERFLX(KIDIA:KFDIA,1:12,1:9)=0._JPRB +!PAERFLX(KIDIA:KFDIA,1:12,1:9)=0._JPRB + ZFLX_SDUST(KIDIA:KFDIA,1:9,1:12)=0._JPRB !----------------------------------------------- @@ -1375,7 +1703,7 @@ SUBROUTINE TM5M7_SRC_DUST( YDEPHY, YDEAERMAP, YDEAERSRC, & ENDIF LLDUST(JL,3)=.TRUE. - PAERFLX(JL,3,JAER) = ZFLX_SDUST(JL,JAER,3) + !PAERFLX(JL,3,JAER) = ZFLX_SDUST(JL,JAER,3) !write(9504,*)ZFLX_SDUST(JL,JAER,3) !if (NSTEP==2.or.NSTEP==3 )write(9501,*)JAER,ZDEP2(JL), ZDUEMPOT(JL,JAER),PALB(JL) !write(9502,*)PALB(JL) @@ -1383,7 +1711,6 @@ SUBROUTINE TM5M7_SRC_DUST( YDEPHY, YDEAERMAP, YDEAERSRC, & ENDIF ENDDO ENDDO -ENDIF ! case NDDUST == 3 !-- PCFLX in kg m-2 s-1 @@ -1412,12 +1739,15 @@ SUBROUTINE TM5M7_SRC_DUST( YDEPHY, YDEAERMAP, YDEAERSRC, & end if ENDDO END DO +END IF DUSTOPT + + !-- if no vertical diffusion, distribute the flux in layers with scale height !-- between half-levels IHTST-1 and KLEV !!$ IF (.NOT.LVDFTRAC) THEN !!$ DO JK=IHTST,KLEV !!$ DO JL=KIDIA,KFDIA -!!$ ZDETAH(JL,JK) = ZETAH(JL,JK)**ZHDD - ZETAH(JL,JK-1)**ZHDD +!!$ ZDETAH(JL,JK) = ZETAH(JL,JK)***1.E+03ZHDD - ZETAH(JL,JK-1)**ZHDD !!$ PTENC(JL,JK,KAERO(INBAER)) = PTENC(JL,JK,KAERO(INBAER))+PCFLX(JL,KAERO(INBAER))*ZDETAH(JL,JK) !!$ ENDDO !!$ ENDDO @@ -1428,4 +1758,3 @@ SUBROUTINE TM5M7_SRC_DUST( YDEPHY, YDEAERMAP, YDEAERSRC, & END ASSOCIATE IF (LHOOK) CALL DR_HOOK('TM5M7_SRC_DUST',1,ZHOOK_HANDLE) END SUBROUTINE TM5M7_SRC_DUST - diff --git a/ifs-source/arpifs/m7/phys_ec/tm5m7_src_ss.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_src_ss.F90 index 814dcffc..82f11141 100644 --- a/ifs-source/arpifs/m7/phys_ec/tm5m7_src_ss.F90 +++ b/ifs-source/arpifs/m7/phys_ec/tm5m7_src_ss.F90 @@ -1,8 +1,8 @@ SUBROUTINE TM5M7_SRC_SS & &( KIDIA, KFDIA, KLON, KLEV, & & PCI , PCLAKE, PLSM , PSST, PWIND, & - & emis_mass, emis_number & - &) + & emis_mass, emis_number, & + & YDEAERSRC) !*** * TM5M7_SRC_SS* - SOURCE TERMS FOR SEA SALT AEROSOLS @@ -55,7 +55,7 @@ SUBROUTINE TM5M7_SRC_SS & USE MO_HAM_M7_EMI_SEASALT, ONLY: seasalt_emissions_gong_SST USE MO_HAM, ONLY: nseasalt - +USE YOEAERSRC, ONLY : TEAERSRC IMPLICIT NONE !----------------------------------------------------------------------- @@ -70,7 +70,7 @@ SUBROUTINE TM5M7_SRC_SS & REAL(KIND=JPRB), INTENT(IN) :: PWIND(KLON) ! 10m wind speed, see tm5m7_src.F90 TYPE(MODAL_EMISSIONS), INTENT(INOUT) :: emis_mass(NMOD) TYPE(MODAL_EMISSIONS), INTENT(INOUT) :: emis_number(NMOD) - +TYPE(TEAERSRC), INTENT(IN) :: YDEAERSRC !* 0.5 LOCAL VARIABLES ! --------------- @@ -81,13 +81,20 @@ SUBROUTINE TM5M7_SRC_SS & REAL(KIND=JPRB) :: NUMBER(KLON), MASS(KLON) REAL(KIND=JPHOOK) :: ZHOOK_HANDLE +REAL(KIND=JPRB) :: SSCAL ! switch on/off seasalt emissions #include "abor1.intfb.h" +!----------------------------------------------------------------------- !----------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('TM5M7_SRC_SS',0,ZHOOK_HANDLE) - +ASSOCIATE(NOSEASALT => YDEAERSRC%NOSEASALT) !ASSOCIATE(RSSFLX=>YDEAERSRC%RSSFLX) +IF (NOSEASALT) THEN + SSCAL=0.0_JPRB +ELSE + SSCAL=1.0_JPRB +END IF IF (NSEASALT==0) THEN !>>> TvN @@ -274,7 +281,7 @@ SUBROUTINE TM5M7_SRC_SS & ! CALL emission_vdist_by_sector( splittype, 'SS', region, emis_temp(region), emis3d, status ) ! For now fill in surface layer - emis_number(mode_acs)%d3(KIDIA:KFDIA,KLEV,4) = number(KIDIA:KFDIA) !#/m2/sec + emis_number(mode_acs)%d3(KIDIA:KFDIA,KLEV,4) = number(KIDIA:KFDIA) *SSCAL !#/m2/sec !write(6565,*) number(KIDIA:KFDIA) ! emitted mass @@ -287,7 +294,7 @@ SUBROUTINE TM5M7_SRC_SS & ! vertically distribute according to sector ! CALL emission_vdist_by_sector( splittype, 'SS', region, emis_temp(region), emis3d, status ) - emis_mass(mode_acs)%d3(KIDIA:KFDIA,KLEV,4) = mass(KIDIA:KFDIA) !kg/m2/sec + emis_mass(mode_acs)%d3(KIDIA:KFDIA,KLEV,4) = mass(KIDIA:KFDIA) *SSCAL !kg/m2/sec !=================== @@ -352,7 +359,7 @@ SUBROUTINE TM5M7_SRC_SS & ENDDO !VH: For now emitted at surface, to be fixed - emis_number(mode_cos)%d3(KIDIA:KFDIA,KLEV,4) = number(KIDIA:KFDIA) !#/grid/month + emis_number(mode_cos)%d3(KIDIA:KFDIA,KLEV,4) = number(KIDIA:KFDIA) *SSCAL !#/grid/month ! emitted mass @@ -362,14 +369,14 @@ SUBROUTINE TM5M7_SRC_SS & mass(KIDIA:KFDIA) = number(KIDIA:KFDIA)*RPI*4./3. *(rg2*1e-4)**3 * EXP(9./2.*log(sigma_lognormal(4))**2)*dens*1e-3 ! kg/m2/sec !For now introduce emissions in surface layer. Should be fixed. - emis_mass(mode_cos)%d3(KIDIA:KFDIA,KLEV,4) = mass(KIDIA:KFDIA) !kg/m2/sec + emis_mass(mode_cos)%d3(KIDIA:KFDIA,KLEV,4) = mass(KIDIA:KFDIA) *SSCAL !kg/m2/sec ELSEIF (NSEASALT==8) THEN !HAM gong_SST CALL SEASALT_EMISSIONS_GONG_SST(KFDIA, KLON, 1,& & PSST,PWIND, ss_density, PLSM, PCLAKE, PCI, & & emis_mass(mode_acs)%d3(KIDIA:KFDIA,KLEV,4) , emis_mass(mode_cos)%d3(KIDIA:KFDIA,KLEV,4),& - & emis_number(mode_acs)%d3(KIDIA:KFDIA,KLEV,4), emis_number(mode_cos)%d3(KIDIA:KFDIA,KLEV,4)) + & emis_number(mode_acs)%d3(KIDIA:KFDIA,KLEV,4), emis_number(mode_cos)%d3(KIDIA:KFDIA,KLEV,4),SSCAL) ELSE CALL ABOR1('ABORT: IN TM5_SRC_SS, NSEASALT is NOT 0 or 8!') @@ -379,6 +386,7 @@ SUBROUTINE TM5M7_SRC_SS & ! RCHG -> In AER scheme there is a flag named LVDFTRAC that might be related with not vertical diffusion. In that case, ! the tendencies seems to be re-scaled in vertical layers "manually". The flux themselves are not changed. +END ASSOCIATE IF (LHOOK) CALL DR_HOOK('TM5M7_SRC_SS',1,ZHOOK_HANDLE) END SUBROUTINE TM5M7_SRC_SS diff --git a/ifs-source/arpifs/module/yoeaersrc.F90 b/ifs-source/arpifs/module/yoeaersrc.F90 index 3e503a44..0b4c25dd 100644 --- a/ifs-source/arpifs/module/yoeaersrc.F90 +++ b/ifs-source/arpifs/module/yoeaersrc.F90 @@ -24,6 +24,9 @@ MODULE YOEAERSRC TYPE :: TEAERSRC INTEGER(KIND=JPIM) :: NDDUST, NSSALT, NAERWND, NDMSO, NPIST,NSO4SCHEME +REAL(KIND=JPRB) :: DCAL +LOGICAL :: GUSTS,NOSEASALT + LOGICAL :: LEPAERO, LAEROMIN, LOCNDMS REAL(KIND=JPRB) :: RGELAV, RGEMUV, RDGLAV, RDGMUV @@ -71,6 +74,10 @@ SUBROUTINE PRINT_CONFIGURATION(SELF, KDEPTH, KOUTNO) IDEPTHLOC = KDEPTH+2 + +WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'GUSTS = ', SELF%GUSTS +WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'DCAL = ', SELF%DCAL +WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'NOSEASALT = ', SELF%NOSEASALT WRITE(KOUTNO,*) REPEAT(' ',KDEPTH ) // 'MODEL%YRML_PHY_AER%YREAERSRC : ' WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'NDDUST = ', SELF%NDDUST WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'NSSALT = ', SELF%NSSALT diff --git a/ifs-source/arpifs/module/yoedust.F90 b/ifs-source/arpifs/module/yoedust.F90 new file mode 100755 index 00000000..f5c522f5 --- /dev/null +++ b/ifs-source/arpifs/module/yoedust.F90 @@ -0,0 +1,513 @@ +MODULE YOEDUST + +USE PARKIND1, ONLY: JPIM, JPRB +USE YOMHOOK, ONLY: LHOOK, DR_HOOK, JPHOOK +USE YOMLUN, ONLY: NULOUT + +IMPLICIT NONE + +SAVE +! ------------------------------------------------------------------ +!*** *YOEDUST* - ECE4 CLIMATOLOGIAL FIELD FOR DUST EMISSION SCHEME ! +! Called in tm5m7_src_dust.F90 +! info: +! This module reads and interpolates climatological ! +! surface fields that used in Dust emission Scheme +! Tegen et al., 2002. +! +! : Marios Chatziparaschos +! Barcelona Supercomputing Center +! : 26/06/2025 +! -----------------------------------------------------------------!- + +INTEGER(KIND=JPIM), PARAMETER :: IMONTH = 12 +INTEGER(KIND=JPIM), PARAMETER :: ILAT = 180 +INTEGER(KIND=JPIM), PARAMETER :: ILON = 360 + +TYPE :: TEAERC_DUST +!- based on SURFACE 2D (lat,lon) 1x1 +REAL(KIND=JPRB), ALLOCATABLE, DIMENSION(:,:) :: CULT,POTSRC !,SOILTYPE +REAL(KIND=JPRB), ALLOCATABLE, DIMENSION(:,:) :: CULT1, SOILTYPE1,POTSRC1 +REAL(KIND=JPRB), ALLOCATABLE, DIMENSION(:) :: SOILTYPE12 +REAL(KIND=JPRB), ALLOCATABLE, DIMENSION(:) :: SOILTYPE123 +REAL(KIND=JPRB), ALLOCATABLE, DIMENSION(:,:) :: AREA,SOILPH +REAL(KIND=JPRB), ALLOCATABLE, DIMENSION(:,:) :: SOILPH1,SOILPH2,SOILPH3,SOILPH4,SOILPH5 +REAL(KIND=JPRB), ALLOCATABLE, DIMENSION(:,:) :: LAI_MAX, LAI_AVG +REAL(KIND=JPRB), ALLOCATABLE, DIMENSION(:,:) :: Z0AM +REAL(KIND=JPRB), ALLOCATABLE, DIMENSION(:,:) :: SOILTYPE + +!latitude and logitude in Degrees +REAL(KIND=JPRB),ALLOCATABLE, DIMENSION(:) :: LATD,LOND + +! in radians +REAL(KIND=JPRB) :: LAT1 = 0.0_JPRB, LON1 = 0.0_JPRB +REAL(KIND=JPRB) :: DLAT = 0.0_JPRB, DLON = 0.0_JPRB +INTEGER(KIND=JPIM) :: NLAT = 0, NLON = 0, NLEV = 0, NMON = 0, NAER = 0 + +REAL(KIND=JPRB), ALLOCATABLE, DIMENSION(:,:,:) :: Z0M +REAL(KIND=JPRB), ALLOCATABLE, DIMENSION(:,:,:) :: FPAR +REAL(KIND=JPRB), ALLOCATABLE, DIMENSION(:,:,:) :: FPAR1 +REAL(KIND=JPRB), ALLOCATABLE, DIMENSION(:,:) :: FPAR2 +!lon,lat,month + +! Number of the Grouped fields for 2d-3d, numb-month +INTEGER(KIND=JPIM) :: N3D = 0, N2D = 0, N4D = 0, NMONTH=0 +!Grouped of 2D species (lon, lat, species) +REAL(KIND=JPRB),ALLOCATABLE, DIMENSION(:,:,:) :: SPECIES3D +REAL(KIND=JPRB),ALLOCATABLE, DIMENSION(:,:,:,:) :: SPECIES4D + +! INTERPOLATED ARRAYS MAYBE DO NOT NEED IT but saved into the main pointer +REAL(KIND=JPRB),ALLOCATABLE, DIMENSION(:) :: TCULT, TSOILTYPE, TPOTSRC +REAL(KIND=JPRB),ALLOCATABLE, DIMENSION(:) :: TAREA, TSOILPH, TZ0AM +REAL(KIND=JPRB),ALLOCATABLE, DIMENSION(:) :: TSOILPH1, TSOILPH2, TSOILPH3, TSOILPH4, TSOILPH5 +REAL(KIND=JPRB),ALLOCATABLE, DIMENSION(:) :: TZ0M , TFPAR +REAL(KIND=JPRB),ALLOCATABLE, DIMENSION(:) :: TLAI_MAX, TLAI_AVG +LOGICAL :: IS_INITIALISED = .FALSE. +LOGICAL :: IS_INTERPOLATED = .FALSE. +LOGICAL :: IS_GROUPED = .FALSE. +CONTAINS +PROCEDURE :: READ => SETUP_DUST_CLIM +PROCEDURE :: INTERPOLATION =>SU_DUST_FIELDS_INTERP + +END TYPE TEAERC_DUST + +TYPE(TEAERC_DUST), POINTER :: YDUSTCLIM => NULL() + +!========================================================================================== + +CONTAINS + +SUBROUTINE SETUP_DUST_CLIM(SELF) + USE YOMLUN, ONLY : NULOUT + !------------ + CLASS(TEAERC_DUST), INTENT(INOUT) :: SELF + + CALL SU_DUST_FIELDS(SELF) + WRITE(NULOUT,*) '2D FIELDS FOR DUST CLIMATOLOGY IS LOADED' + SELF%IS_INITIALISED = .TRUE. + +END SUBROUTINE SETUP_DUST_CLIM + +SUBROUTINE GET_2DSPECIES(SELF) +IMPLICIT NONE +! ARGUMENTS +! ------------ +TYPE(TEAERC_DUST), INTENT(INOUT) :: SELF + +! Expected dimension lengths for month, latitude and longitude +INTEGER(KIND=JPIM), PARAMETER :: IMONTH = 12 +INTEGER(KIND=JPIM), PARAMETER :: ILAT = 180 !61 +INTEGER(KIND=JPIM), PARAMETER :: ILON = 360 !120 +INTEGER, PARAMETER :: idx_SOILPH1 = 1 +INTEGER, PARAMETER :: idx_SOILPH2 = 2 +INTEGER, PARAMETER :: idx_SOILPH3 = 3 +INTEGER, PARAMETER :: idx_SOILPH4 = 4 +INTEGER, PARAMETER :: idx_SOILPH5 = 5 +INTEGER, PARAMETER :: idx_Z0AM = 6 +INTEGER, PARAMETER :: idx_POTSRC = 7 +INTEGER, PARAMETER :: idx_SOILTYPE = 8 +INTEGER, PARAMETER :: idx_AREA = 9 +INTEGER, PARAMETER :: idx_CULT = 10 +!3D SPECIES +INTEGER, PARAMETER :: idx_FPAR = 1 +INTEGER, PARAMETER :: idx_Z0M = 2 +! Assuming dimensions have been set for lat and lon +IF (.NOT. ALLOCATED(SELF%SPECIES3D)) THEN + ALLOCATE(SELF%SPECIES3D(SELF%NLON, SELF%NLAT, 10)) +END IF +! Assuming dimensions have been set for lat and lon +IF (.NOT. ALLOCATED(SELF%SPECIES4D)) THEN + ALLOCATE(SELF%SPECIES4D(SELF%NLON, SELF%NLAT, SELF%NMONTH, 2)) +END IF +! Populate the 3D array with existing 2D data +SELF%SPECIES3D(:,:, idx_SOILPH1) = SELF%SOILPH1(:,:) !1 +SELF%SPECIES3D(:,:, idx_SOILPH2) = SELF%SOILPH2(:,:) !2 +SELF%SPECIES3D(:,:, idx_SOILPH3) = SELF%SOILPH3(:,:) !3 +SELF%SPECIES3D(:,:, idx_SOILPH4) = SELF%SOILPH4(:,:) !4 +SELF%SPECIES3D(:,:, idx_SOILPH5) = SELF%SOILPH5(:,:) !5 +SELF%SPECIES3D(:,:, idx_Z0AM) = SELF%Z0AM(:,:) !6 +SELF%SPECIES3D(:,:, idx_POTSRC) = SELF%POTSRC(:,:) !7 +SELF%SPECIES3D(:,:, idx_SOILTYPE)= SELF%SOILTYPE(:,:)!8 +SELF%SPECIES3D(:,:, idx_AREA)= SELF%AREA(:,:) !9 +SELF%SPECIES3D(:,:, idx_CULT)= SELF%CULT(:,:) !10 +SELF%IS_GROUPED = .TRUE. +SELF%N2D=SIZE(SELF%SPECIES3D,3) +SELF%SPECIES4D(:,:,:,idx_FPAR) = SELF%FPAR(:,:,:) +SELF%SPECIES4D(:,:,:,idx_Z0M) = SELF%Z0M(:,:,:) +SELF%N4D=SIZE(SELF%SPECIES4D,4) +END SUBROUTINE GET_2DSPECIES + +SUBROUTINE SU_DUST_FIELDS(SELF_DUST) +!----------------------------------------------------------------------- +USE PARKIND1 , ONLY : JPIM, JPRB +USE EASY_NETCDF_READ_MPI,ONLY : NETCDF_FILE +USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK +USE YOMLUN , ONLY : NULERR +USE YOMLUN , ONLY : NULOUT +USE YOMCST , ONLY : RPI + +IMPLICIT NONE + +! ARGUMENTS +TYPE(TEAERC_DUST), INTENT(INOUT) :: SELF_DUST +! Expected dimension lengths for month, latitude and longitude +INTEGER(KIND=JPIM), PARAMETER :: IMONTH = 12 +INTEGER(KIND=JPIM), PARAMETER :: ILAT = 180 !61 +INTEGER(KIND=JPIM), PARAMETER :: ILON = 360 !120 +! Full and base names of the aerosol climatology file +CHARACTER(len=:),ALLOCATABLE :: CL_FILE_NAME, CL_AER_CLIM_FILE +!Temporary file containing the input of fields +! "DATA" directory +CHARACTER(LEN=512) :: CLDIRECTORY +! The NetCDF file containing the input climatology +TYPE(NETCDF_FILE) :: FILE +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE +!LOCAL TEMPORAL ARRAY +REAL(KIND=JPRB), ALLOCATABLE, DIMENSION(:,:) :: RSOILTYPE +!REAL(KIND=JPRB), ALLOCATABLE, DIMENSION(:,:) :: RZ0AM, RSOILPH3, RSOILPH4, RSOILPH5 + +#include "abor1.intfb.h" +! ------------------------------------------------------------------ + +IF (LHOOK) CALL DR_HOOK('YOEDUST:SU_DUST_CLIMATOLOGY',0,ZHOOK_HANDLE) + + CL_AER_CLIM_FILE = "onlinedust_v4_rmp.nc" + CALL GET_ENVIRONMENT_VARIABLE("DATA",CLDIRECTORY) + IF(CLDIRECTORY /= " ") THEN + CL_FILE_NAME = TRIM(CLDIRECTORY) // "/composition/" // CL_AER_CLIM_FILE + ELSE + CL_FILE_NAME = CL_AER_CLIM_FILE + ENDIF + CALL FILE%OPEN(TRIM(CL_FILE_NAME), IVERBOSE=4) + CALL FILE%GET('lat', SELF_DUST%LATD) + CALL FILE%GET('lon', SELF_DUST%LOND) + CALL FILE%GET('cult', SELF_DUST%CULT) + CALL FILE%GET('lai_max', SELF_DUST%LAI_MAX) + CALL FILE%GET('lai_avg', SELF_DUST%LAI_AVG) + + CALL FILE%GET('fpar', SELF_DUST%FPAR) + IF ( SIZE(SELF_DUST%FPAR,1) /= ILON .OR. & + & SIZE(SELF_DUST%FPAR,2) /= ILAT .OR. & + & SIZE(SELF_DUST%FPAR,3) /= IMONTH) THEN + WRITE(NULERR,*) 'Aerosols in', CL_FILE_NAME, 'must be dimensioned (', & + & ILON, ",", ILAT, ",", IMONTH, ")" + CALL ABOR1("Error reading aerosol climatology NetCDF file") + ENDIF + CALL FILE%GET('potsrc', SELF_DUST%POTSRC) + !CALL FILE%GET('soiltype', RSOILTYPE) + !SELF_DUST%SOILTYPE = RSOILTYPE + CALL FILE%GET('soiltype',SELF_DUST%SOILTYPE) + CALL FILE%GET('soilph1', SELF_DUST%SOILPH1) + CALL FILE%GET('soilph2', SELF_DUST%SOILPH2) + CALL FILE%GET('soilph3', SELF_DUST%SOILPH3) + CALL FILE%GET('soilph4', SELF_DUST%SOILPH4) + CALL FILE%GET('soilph5', SELF_DUST%SOILPH5) + CALL FILE%GET('z0am', SELF_DUST%Z0AM) + CALL FILE%GET('area', SELF_DUST%AREA) + CALL FILE%GET('z0m', SELF_DUST%Z0M) + + SELF_DUST%NLAT = SIZE(SELF_DUST%LATD) + SELF_DUST%LAT1 = SELF_DUST%LATD(1) * RPI / 180.0_JPRB !rads + SELF_DUST%DLAT = (SELF_DUST%LATD(2)-SELF_DUST%LATD(1)) * RPI / 180.0_JPRB ! delta in rads + + IF (SELF_DUST%LOND(1) < 0) THEN + WRITE(NULERR,*) "THE LON SHOULD BE 0- 360 THE CURRENT FILE LON ARE -180 to 180" + ! SELF_DUST%LOND = MOD(SELF_DUST%LOND(:) +180.0,360.0) + ELSE + SELF_DUST%LOND = SELF_DUST%LOND + ENDIF + SELF_DUST%NLON = SIZE(SELF_DUST%LOND) + SELF_DUST%LON1 = SELF_DUST%LOND(1) * RPI / 180.0_JPRB !rad + SELF_DUST%DLON = (SELF_DUST%LOND(2)-SELF_DUST%LOND(1)) * RPI / 180.0_JPRB !delta in rads + + ! Check dimensions + IF ( SIZE(SELF_DUST%Z0M,1) /= SELF_DUST%NLON .OR. & + & SIZE(SELF_DUST%Z0M,2) /= SELF_DUST%NLAT .OR. & + & SIZE(SELF_DUST%Z0M,3) /= IMONTH) THEN + WRITE(NULERR,*) 'Aerosols in', CL_FILE_NAME, 'must be dimensioned LON,LAT,MONTH (', & + & ILON, ",", ILAT, ",", IMONTH, ")" + CALL ABOR1("Error reading aerosol climatology NetCDF file") + ENDIF + SELF_DUST%NMONTH= SIZE(SELF_DUST%Z0M,3) + + CALL FILE%CLOSE() + +IF (LHOOK) CALL DR_HOOK('YOEDUST:SU_AER_CLIMATOLOGY',1,ZHOOK_HANDLE) + +END SUBROUTINE SU_DUST_FIELDS + +SUBROUTINE SU_DUST_FIELDS_INTERP(SELF, KSTART, KEND, KCOL, PLAT, PLON, & + ISOILPH1, ISOILPH2, ISOILPH3, ISOILPH4, ISOILPH5, & + IZ0AM, IPOTSRC, ISOILTYPE, IAREA, ICULT, IZ0M, IFPAR, IM0,ILAI_MAX,ILAI_AVG ) + + USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK + IMPLICIT NONE + CLASS(TEAERC_DUST), INTENT(INOUT) :: SELF + INTEGER(KIND=JPIM), INTENT(IN) :: KCOL + INTEGER(KIND=JPIM), INTENT(IN) :: KSTART, KEND + INTEGER(KIND=JPIM), INTENT(IN) :: IM0 + ! Sine of latitude of input columns + !REAL(KIND=JPRB) :: PSINLAT(KSTART:KEND) + REAL(KIND=JPRB), INTENT(IN) :: PLAT(KCOL) !rads = PGELAT + REAL(KIND=JPRB), INTENT(IN) :: PLON(KCOL) !rads = PGELAM + REAL(KIND=JPHOOK) :: ZHOOK_HANDLE + REAL(KIND=JPRB), INTENT(OUT) :: & + ISOILPH1(KCOL), ISOILPH2(KCOL), ISOILPH3(KCOL), ISOILPH4(KCOL), ISOILPH5(KCOL), & + IZ0AM(KCOL), IPOTSRC(KCOL), IAREA(KCOL), ICULT(KCOL)!, ISOILTYPE(KCOL) + REAL(KIND=JPRB), INTENT(OUT) :: ILAI_MAX(KCOL), ILAI_AVG(KCOL) + REAL(KIND=JPRB), INTENT(OUT) :: IZ0M(KCOL), IFPAR(KCOL) + !INTEGER(KIND=JPIM), INTENT(OUT) :: ISOILTYPE(KSTART:KEND) + REAL(KIND=JPRB), INTENT(OUT) :: ISOILTYPE(KSTART:KEND) + + #include "abor1.intfb.h" + + IF (LHOOK) CALL DR_HOOK('YOEDUST:INTERPOLATION main call',0,ZHOOK_HANDLE) + + CALL INTP_SOILT(SELF,SELF%SOILTYPE, KSTART, KEND, KCOL, PLAT(KSTART:KEND), PLON(KSTART:KEND), ISOILTYPE) + SELF%TSOILTYPE(:) = ISOILTYPE(:) + + + CALL INTP_SOILT(SELF, SELF%AREA, KSTART, KEND, KCOL, PLAT(KSTART:KEND), PLON(KSTART:KEND), IAREA) + SELF%TAREA(:) = IAREA(:) + + CALL INTP_SOILT(SELF, SELF%SOILPH1, KSTART, KEND, KCOL, PLAT(KSTART:KEND), PLON(KSTART:KEND), ISOILPH1) + SELF%TSOILPH1(:) = ISOILPH1(:) + + CALL INTP_SOILT(SELF, SELF%SOILPH2, KSTART, KEND, KCOL, PLAT(KSTART:KEND), PLON(KSTART:KEND), ISOILPH2) + SELF%TSOILPH2(:) = ISOILPH2(:) + + CALL INTP_SOILT(SELF, SELF%SOILPH3, KSTART, KEND, KCOL, PLAT(KSTART:KEND), PLON(KSTART:KEND), ISOILPH3) + SELF%TSOILPH3(:) = ISOILPH3(:) + + CALL INTP_SOILT(SELF, SELF%SOILPH4, KSTART, KEND, KCOL, PLAT(KSTART:KEND), PLON(KSTART:KEND), ISOILPH4) + SELF%TSOILPH4(:) = ISOILPH4(:) + + CALL INTP_SOILT(SELF, SELF%SOILPH5, KSTART, KEND, KCOL, PLAT(KSTART:KEND), PLON(KSTART:KEND), ISOILPH5) + SELF%TSOILPH5(:) = ISOILPH5(:) + + CALL INTP_SOILT(SELF, SELF%Z0AM, KSTART, KEND, KCOL, PLAT(KSTART:KEND), PLON(KSTART:KEND), IZ0AM) + SELF%TZ0AM(:) = IZ0AM(:) + + CALL INTP_SOILT(SELF, SELF%POTSRC, KSTART, KEND, KCOL, PLAT(KSTART:KEND), PLON(KSTART:KEND), IPOTSRC) + SELF%TPOTSRC(:) = IPOTSRC(:) + + CALL INTP_SOILT(SELF, SELF%CULT, KSTART, KEND, KCOL, PLAT(KSTART:KEND), PLON(KSTART:KEND), ICULT) + SELF%TCULT(:) = ICULT(:) + + CALL INTP_SOILT(SELF, SELF%LAI_MAX, KSTART, KEND, KCOL, PLAT(KSTART:KEND), PLON(KSTART:KEND), ILAI_MAX) + SELF%TLAI_MAX(:) = ILAI_MAX(:) + + CALL INTP_SOILT(SELF, SELF%LAI_AVG, KSTART, KEND, KCOL, PLAT(KSTART:KEND), PLON(KSTART:KEND), ILAI_AVG) + SELF%TLAI_AVG(:) = ILAI_AVG(:) + + CALL INTP_SOILT(SELF, SELF%FPAR(:,:,IM0), KSTART, KEND, KCOL, PLAT(KSTART:KEND), PLON(KSTART:KEND), IFPAR) + SELF%TFPAR(:) = IFPAR(:) + + CALL INTP_SOILT(SELF, SELF%Z0M(:,:,IM0), KSTART, KEND, KCOL, PLAT(KSTART:KEND), PLON(KSTART:KEND), IZ0M) + SELF%TZ0M(:) = IZ0M(:) + + + IF (LHOOK) CALL DR_HOOK('YOEDUST:INTERPOLATION FIELDS main call',1,ZHOOK_HANDLE) + + +CONTAINS + +SUBROUTINE CALC_INTERP_DUST(SELF, FIELD2D, KSTART, KEND, KCOL, PLAT, PLON, INTEROUT) + + USE YOMLUN , ONLY : NULERR + USE YOMLUN , ONLY : NULOUT + USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK + !USE, INTRINSIC :: IEEE_ARITHMETIC + LOGICAL :: LPROBLEM + REAL(KIND=JPRB) :: BIG_VAL = HUGE(1.0_JPRB), SMALL_VAL = TINY(1.0_JPRB) + CLASS(TEAERC_DUST), INTENT(INOUT):: SELF + + REAL(KIND=JPRB), INTENT(IN) :: FIELD2D(:,:) + INTEGER(KIND=JPIM), INTENT(IN) :: KCOL + INTEGER(KIND=JPIM), INTENT(IN) :: KSTART, KEND + REAL(KIND=JPRB), INTENT(OUT) :: INTEROUT(KSTART:KEND) + ! Sine of latitude of input columns + REAL(KIND=JPRB) :: PSINLAT(KSTART:KEND) + REAL(KIND=JPRB), INTENT(IN) :: PLAT(KSTART:KEND) + REAL(KIND=JPRB), INTENT(IN) :: PLON(KSTART:KEND) + INTEGER(KIND=JPIM), DIMENSION(KSTART:KEND) :: KLAT1, KLAT2, KLON1, KLON2 + REAL(KIND=JPRB) , DIMENSION(KSTART:KEND) :: PLATWEIGHT, PLONWEIGHT + INTEGER(KIND=JPIM) :: JL, JS, N2, N4, NM, JM, JA + REAL(KIND=JPRB) :: ZLAT(KSTART:KEND) + REAL(KIND=JPRB) :: ZAERA, ZAERB + REAL(KIND=JPRB), DIMENSION(KSTART:KEND) :: ZAER2D + REAL(KIND=JPHOOK) :: ZHOOK_HANDLE + REAL(KIND=JPHOOK) :: DENOM + + #include "abor1.intfb.h" + + IF (LHOOK) CALL DR_HOOK('YOEDUST:INTERPOLATION FIELDS 2D',0,ZHOOK_HANDLE) + + PLONWEIGHT = 0.0 + ! Longitude interpolation points and weights + PLONWEIGHT = 1.0_JPRB + (PLON - SELF%LON1) / SELF%DLON + KLON1 = MAX(1, MIN(INT(PLONWEIGHT), SELF%NLON)) + KLON2 = MOD(KLON1,SELF%NLON)+1 ! Correct treatment of dateline + PLONWEIGHT = PLONWEIGHT - KLON1 + !ZLAT = ASIN(PSINLAT) + PSINLAT=SIN(PLAT) ! SIN of rads + ZLAT = PLAT !RADS + + PLATWEIGHT = 0.0 + PLATWEIGHT = 1.0_JPRB + (ZLAT - SELF%LAT1) / SELF%DLAT + KLAT1 = MAX(0, MIN(INT(PLATWEIGHT), SELF%NLAT-1)) + KLAT2 = KLAT1+1 + ! Interpolation in sin(latitude) + DO JL = KSTART, KEND + DENOM = SIN(SELF%LAT1+(KLAT2(JL)-1)*SELF%DLAT) - SIN(SELF%LAT1+(KLAT1(JL)-1)*SELF%DLAT) + PLATWEIGHT(JL) = (PSINLAT(JL) - SIN(SELF%LAT1 + (KLAT1(JL)-1)*SELF%DLAT)) / DENOM + END DO + !PLATWEIGHT = (PSINLAT - SIN(SELF%LAT1+(KLAT1-1)*SELF%DLAT)) & + ! & / (SIN(SELF%LAT1+(KLAT2-1)*SELF%DLAT) - SIN(SELF%LAT1+(KLAT1-1)*SELF%DLAT)) + ZAERA =0.0_JPRB + ZAERB = 0.0_JPRB + INTEROUT(KSTART:KEND) = 0.0_JPRB + ! Interpolation loop + DO JL = KSTART, KEND + ZAERA = FIELD2D(KLON1(JL), KLAT1(JL)) + & + PLATWEIGHT(JL) * (FIELD2D(KLON1(JL), KLAT2(JL)) - FIELD2D(KLON1(JL), KLAT1(JL))) + ZAERB = FIELD2D(KLON2(JL), KLAT1(JL)) + & + PLATWEIGHT(JL) * (FIELD2D(KLON2(JL), KLAT2(JL)) - FIELD2D(KLON2(JL), KLAT1(JL))) + INTEROUT(JL) = ZAERA + PLONWEIGHT(JL) * (ZAERB - ZAERA) + END DO + + IF (LHOOK) CALL DR_HOOK('YOEDUST:INTERPOLATION FIELDS 2D',1,ZHOOK_HANDLE) +END SUBROUTINE CALC_INTERP_DUST + +!for simplicity this routine do NOT be USED. +! +SUBROUTINE CALC_3DINTERP_DUST(SELF, FIELD3D, KSTART, KEND, KCOL, PLAT, PLON, INTEROUT) + USE YOMLUN, ONLY : NULOUT + USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK + IMPLICIT NONE + + CLASS(TEAERC_DUST), INTENT(INOUT) :: SELF + REAL(KIND=JPRB), INTENT(IN) :: FIELD3D(:,:,:) + INTEGER(KIND=JPIM), INTENT(IN) :: KSTART, KEND, KCOL + REAL(KIND=JPRB), INTENT(IN) :: PLAT(KSTART:KEND), PLON(KSTART:KEND) + REAL(KIND=JPRB), INTENT(OUT) :: INTEROUT(KSTART:KEND,SELF%NMONTH) + INTEGER(KIND=JPIM), PARAMETER :: ILAT = 180, ILON = 360, IMONTH = 12 + REAL(KIND=JPHOOK) :: ZHOOK_HANDLE + INTEGER(KIND=JPIM) :: JL, JM + INTEGER(KIND=JPIM), DIMENSION(KSTART:KEND) :: KLAT1, KLAT2, KLON1, KLON2 + REAL(KIND=JPRB), DIMENSION(KSTART:KEND) :: PLATWEIGHT, PLONWEIGHT + REAL(KIND=JPRB), DIMENSION(KSTART:KEND):: PSINLAT, ZLAT + REAL(KIND=JPRB) :: ZAERA, ZAERB + #include "abor1.intfb.h" + + IF (LHOOK) CALL DR_HOOK('YOEDUST:INTERPOLATION FIELDS 3D',0,ZHOOK_HANDLE) + ! Precompute sine of latitude and indices + PSINLAT = SIN(PLAT) + ZLAT = PLAT + + PLONWEIGHT = 1.0_JPRB + (PLON - SELF%LON1) / SELF%DLON + KLON1 = MAX(1, MIN(INT(PLONWEIGHT), SELF%NLON)) + KLON2 = MOD(KLON1, SELF%NLON) + 1 + PLONWEIGHT = PLONWEIGHT - KLON1 + + PLATWEIGHT = 1.0_JPRB + (ZLAT - SELF%LAT1) / SELF%DLAT + KLAT1 = MAX(1, MIN(INT(PLATWEIGHT), SELF%NLAT - 1)) + KLAT2 = KLAT1 + 1 + PLATWEIGHT = (PSINLAT - SIN(SELF%LAT1 + (KLAT1 - 1)*SELF%DLAT)) / & + (SIN(SELF%LAT1 + (KLAT2 - 1)*SELF%DLAT) - SIN(SELF%LAT1 + (KLAT1 - 1)*SELF%DLAT)) + + ! --- Interpolate for each column across all months and average --- + IF ( SIZE(FIELD3D,1) == ILON .OR. & + & SIZE(FIELD3D,2) == ILAT .OR. & + & SIZE(FIELD3D,3) == IMONTH) THEN + WRITE(NULOUT,*) '3D FIELDS INTERPOLATION ...' + ELSE + WRITE(NULOUT,*) '3D FIELDS INTERPOLATION was not 3d ...', FIELD3D(195,116,6) + WRITE(NULOUT,*) '3D FIELDS LON:',SIZE(FIELD3D,1),'LAT:', SIZE(FIELD3D,2), 'MONTH:', SIZE(FIELD3D,3) + END IF + DO JM =1,SELF%NMONTH !loop months + DO JL = KSTART,KEND !loop model colum + ! Bilinear interpolation in lon/lat month for each species3d + ZAERA = FIELD3D(KLON1(JL), KLAT1(JL), JM) & + & + PLATWEIGHT(JL) * (FIELD3D(KLON1(JL), KLAT2(JL), JM) & + & - FIELD3D(KLON1(JL), KLAT1(JL), JM)) + ZAERB = FIELD3D(KLON2(JL), KLAT1(JL), JM) & + & + PLATWEIGHT(JL) * (FIELD3D(KLON2(JL), KLAT2(JL), JM) & + & - FIELD3D(KLON2(JL), KLAT1(JL), JM)) + INTEROUT(JL,JM) = ZAERA + PLONWEIGHT(JL) * (ZAERB - ZAERA) + END DO + END DO + + IF (LHOOK) CALL DR_HOOK('YOEDUST:INTERPOLATION FIELDS 3D',1,ZHOOK_HANDLE) +END SUBROUTINE CALC_3DINTERP_DUST + +SUBROUTINE INTP_SOILT(SELF,FIELD2D, KSTART, KEND,KCOL, PLAT, PLON, INTERSOILT) + + USE YOMHOOK, ONLY : LHOOK, DR_HOOK, JPHOOK + USE YOMLUN , ONLY : NULOUT + REAL(KIND=JPRB), INTENT(IN) :: FIELD2D(:,:) + INTEGER(KIND=JPIM), INTENT(IN) :: KCOL + CLASS(TEAERC_DUST), INTENT(IN) :: SELF + INTEGER(KIND=JPIM), INTENT(IN) :: KSTART, KEND + REAL(KIND=JPRB) :: PSINLAT(KSTART:KEND) + REAL(KIND=JPRB), INTENT(IN) :: PLAT(KSTART:KEND) + REAL(KIND=JPRB), INTENT(IN) :: PLON(KSTART:KEND) + !REAL(KIND=JPRM), INTENT(OUT), DIMENSION(KCOL) :: INTERSOILT + !INTEGER(KIND=JPIM), INTENT(OUT) :: INTERSOILT (KSTART:KEND) + REAL(KIND=JPRB), INTENT(OUT) :: INTERSOILT (KSTART:KEND) + + INTEGER(KIND=JPIM), DIMENSION(KSTART:KEND) :: KLAT1, KLAT2, KLON1, KLON2 + REAL(KIND=JPRB), DIMENSION(KSTART:KEND) :: PLATWEIGHT, PLONWEIGHT + INTEGER(KIND=JPIM) :: JL, JS, N2, N4, NM, JM, JA + REAL(KIND=JPRB) :: ZLAT(KSTART:KEND) + REAL(KIND=JPHOOK) :: ZHOOK_HANDLE + REAL(KIND=JPRB) :: ZAERA, ZAERB + REAL(KIND=JPRB), DIMENSION(KSTART:KEND) :: ZAER2D + !C. Perez + INTEGER(KIND=JPIM) :: I_INX, J_INX + IF (LHOOK) CALL DR_HOOK('YOEDUST:INTERPOLATION FIELDS SOILTYPE',0,ZHOOK_HANDLE) + + PLATWEIGHT = 0.0 + PLONWEIGHT = 0.0 + ! Longitude interpolation points and weights + PLONWEIGHT = 1.0_JPRB + (PLON - SELF%LON1) / SELF%DLON + KLON1 = MAX(1, MIN(INT(PLONWEIGHT), SELF%NLON)) + KLON2 = MOD(KLON1,SELF%NLON)+1 ! Correct treatment of dateline + PLONWEIGHT = PLONWEIGHT - KLON1 + + !ZLAT = ASIN(PSINLAT) + PSINLAT=SIN(PLAT) ! SIN of rads + ZLAT = PLAT !RADS + PLATWEIGHT = 1.0_JPRB + (ZLAT - SELF%LAT1) / SELF%DLAT +! KLAT1 = MAX(0, MIN(INT(PLATWEIGHT), SELF%NLAT-1)) !C. Perez: Why 0? Does the latitude indexing start in 0? + KLAT1 = MAX(1, MIN(INT(PLATWEIGHT), SELF%NLAT-1)) + KLAT2 = KLAT1+1 + + ! Interpolation in sin(latitude) + PLATWEIGHT = (PSINLAT - SIN(SELF%LAT1+(KLAT1-1)*SELF%DLAT)) & + & / (SIN(SELF%LAT1+(KLAT2-1)*SELF%DLAT) - SIN(SELF%LAT1+(KLAT1-1)*SELF%DLAT)) + + DO JL = KSTART,KEND + !C.Perez + !choose the closer longitude corner + IF (PLONWEIGHT(JL) > 0.5_JPRB) THEN + I_INX = KLON2(JL) + ELSE + I_INX = KLON1(JL) + END IF + !choose the closer latitude corner + IF (PLATWEIGHT(JL) > 0.5_JPRB) THEN + J_INX = KLAT2(JL) + ELSE + J_INX = KLAT1(JL) + END IF + + INTERSOILT(JL) = FIELD2D(I_INX, J_INX) + !C. Perez + END DO + IF (LHOOK) CALL DR_HOOK('YOEDUST:INTERPOLATION FIELDS SOILTYPE',1,ZHOOK_HANDLE) +END SUBROUTINE INTP_SOILT + +END SUBROUTINE SU_DUST_FIELDS_INTERP + +END MODULE YOEDUST diff --git a/ifs-source/arpifs/namelist/naeaer.nam.h b/ifs-source/arpifs/namelist/naeaer.nam.h index d512fdac..ccaf4291 100644 --- a/ifs-source/arpifs/namelist/naeaer.nam.h +++ b/ifs-source/arpifs/namelist/naeaer.nam.h @@ -24,6 +24,6 @@ NAMELIST/NAEAER/& & RSUCV1 , RSUCV2 , & & NAERSCAV , LSEASALT_RH80, NDRYDEPVEL_DYN, RAERDUST_REBOUND,& & LAERDUSTSOURCE, LAERDUST_NEWBIN, YAERO_DESC, NSO4SCHEME, & - & NAER_BLNUCL, LAERDUSTSIZEVAR + & NAER_BLNUCL, LAERDUSTSIZEVAR, DCAL, GUSTS, NOSEASALT ! ----------------------------------------------------------------- diff --git a/ifs-source/arpifs/phys_ec/aerini_layer.F90 b/ifs-source/arpifs/phys_ec/aerini_layer.F90 index 03746fb0..f746eefb 100644 --- a/ifs-source/arpifs/phys_ec/aerini_layer.F90 +++ b/ifs-source/arpifs/phys_ec/aerini_layer.F90 @@ -7,7 +7,7 @@ ! nor does it submit to any jurisdiction SUBROUTINE AERINI_LAYER(YDGEOMETRY,YDSURF,& - & YDMODEL,KDIM,PAUX,STATE,R,S,PSURF,SURFL,GEMSL) + & YDMODEL,KDIM,PAUX,STATE,R,S,PSURF,SURFL,GEMSL,GPGAW) !**** *AERINI_LAYER* - Layer routine calling time stepping of first part ! of prognostic aerosol computations @@ -89,6 +89,7 @@ SUBROUTINE AERINI_LAYER(YDGEOMETRY,YDSURF,& TYPE (SURF_AND_MORE_TYPE) ,INTENT(INOUT) :: PSURF TYPE (SURF_AND_MORE_LOCAL_TYPE),INTENT(INOUT) :: SURFL TYPE (GEMS_LOCAL_TYPE) ,INTENT(INOUT) :: GEMSL +REAL(KIND=JPRB) ,INTENT(IN) :: GPGAW(KDIM%KLON) !----------------------------------------------------------------------- INTEGER(KIND=JPIM) :: JL, ISNH3_C,ISHNO3_C,JK,JT ! names begin with "IX" to avoid confusion with the species indices used in the chemical schemes @@ -264,7 +265,7 @@ SUBROUTINE AERINI_LAYER(YDGEOMETRY,YDSURF,& & GEMSL%ZLDAY, GEMSL%ZLISS, GEMSL%ZSO2, GEMSL%ZTDMS,& & GEMSL%ZAERDDP, GEMSL%ZAERSDM, GEMSL%ZAERSRC, GEMSL%ZAERMAP, GEMSL%ZAERFLX_M7, GEMSL%ZAERLIF,& & GEMSL%ZODMS, PSURF%PSD_XA, & - & PSO4SRC,PSO2SRC) + & PSO4SRC, PSO2SRC, GPGAW) CASE ("aer") diff --git a/ifs-source/arpifs/phys_ec/callpar.F90 b/ifs-source/arpifs/phys_ec/callpar.F90 index e028d877..300775ed 100644 --- a/ifs-source/arpifs/phys_ec/callpar.F90 +++ b/ifs-source/arpifs/phys_ec/callpar.F90 @@ -724,7 +724,7 @@ SUBROUTINE CALLPAR(YDGEOMETRY,YDVARS,YDSURF,YDMODEL,KDIM,& ! (currently via YDMODEL%YRML_CHEM%YRCOMPO%AERO_SCHEME ! several aerosols schemes can be called) CALL AERINI_LAYER( YDGEOMETRY, YDSURF, YDMODEL, KDIM, PAUX, STATE_TMP, & - & YDVARS%R, YDVARS%S, PSURF, SURFL, GEMSL) + & YDVARS%R, YDVARS%S, PSURF, SURFL, GEMSL, PAUX%PGAW) ELSE GEMSL%ZCFLX(KDIM%KIDIA:KDIM%KFDIA, GEMSL%IAERO(1):GEMSL%IAERO(NACTAERO))=0._JPRB GEMSL%ZTENC(KDIM%KIDIA:KDIM%KFDIA, 1:KDIM%KLEV, GEMSL%IAERO(1):GEMSL%IAERO(NACTAERO))=0._JPRB diff --git a/ifs-source/arpifs/phys_ec/su_aerw.F90 b/ifs-source/arpifs/phys_ec/su_aerw.F90 index 5eeb92bc..2b8f2c13 100644 --- a/ifs-source/arpifs/phys_ec/su_aerw.F90 +++ b/ifs-source/arpifs/phys_ec/su_aerw.F90 @@ -102,7 +102,7 @@ SUBROUTINE SU_AERW(YDMODEL) & LAERSEDIM, LAERSURF, LAERGTOP, LAER6SDIA, LAERCCN, LAERSEDIMSS, & & LAERINIT, LAERCSTR, LAERRRTM, LAERDIAG1, LAERDIAG2, LAERUVP, LUVINDX, & & LAERVOL, LAERCALIP, LEPAERO, LAEROMIN, LOCNDMS ,LAERSCAV_CHEM,LAERSOA_CHEM, LDRYDEPVEL_DYN, & - & LSEASALT_RH80, LAERDUSTSOURCE, LAERDUST_NEWBIN, LAERDUSTSIZEVAR + & LSEASALT_RH80, LAERDUSTSOURCE, LAERDUST_NEWBIN, LAERDUSTSIZEVAR, GUSTS,NOSEASALT INTEGER(KIND=JPIM), POINTER :: NAERCONF, NXT3DAER, NINIDAY, NBCOPTP,& & NDDOPTP, NOMOPTP, NSSOPTP, NSUOPTP, NVISWL, NDRYDEP, NDRYDEPVEL_DYN, & @@ -111,7 +111,7 @@ SUBROUTINE SU_AERW(YDMODEL) & NVOLERUZ(:), NVOLOPTP, NVOLHOMO, NINTERPT, NAER_BLNUCL, NVOLDATE(:), NAERSCAV REAL(KIND=JPRB), POINTER :: RAERDUB, RDDUAER(:), RFCTDUR, RFCTSSR, RLATVOL,& & RLONVOL, RSUCV1, RSUCV2, RAERDUST_REBOUND, & - & RAERVOLC(:,:), RAERVOLE(:,:), RVOLERUZ(:) + & RAERVOLC(:,:), RAERVOLE(:,:), RVOLERUZ(:), DCAL TYPE(TYPE_AERO_DESC), POINTER :: YAERO_DESC(:) @@ -202,6 +202,9 @@ SUBROUTINE SU_AERW(YDMODEL) LAEROMIN => YDEAERSRC%LAEROMIN LOCNDMS => YDEAERSRC%LOCNDMS NDDUST => YDEAERSRC%NDDUST +DCAL => YDEAERSRC%DCAL +GUSTS => YDEAERSRC%GUSTS +NOSEASALT => YDEAERSRC%NOSEASALT NSO4SCHEME => YDEAERSRC%NSO4SCHEME NAER_BLNUCL => YDEAERATM%NAER_BLNUCL NSSALT => YDEAERSRC%NSSALT @@ -301,6 +304,11 @@ SUBROUTINE SU_AERW(YDMODEL) ! Default to backwards compatibility for now LSEASALT_RH80 = .TRUE. +! Applies to case of active aerosols: +NOSEASALT = .FALSE. ! Switch on/off sea salt emissions +GUSTS = .FALSE. ! Not used yet +DCAL = 0._JPRB ! Scale factor for Tegen dust (NDDUST==8) only + IF (NAERO == 0) THEN LEPAERO =.FALSE. LAERCLIMG=.FALSE. @@ -419,9 +427,13 @@ SUBROUTINE SU_AERW(YDMODEL) RDMSMIN = 5.E-11_JPRB NDMSO = 2 NPIST = 1 - ! Various other settings may/may not be used, see scheme 'aer' below - -!-- default value are for use of "plain" or "gusty" 10-m wind as predictor for SS and DU + ! -- Dust scheme (Recommend 3 as default, 8 for Tegen) + NDDUST =3 + ! See scheme 'aer' below for other possible default + !NSSALT =3 ! not used - superseded by HAMM7 dedicated scheme + + !-- default value are for use of "plain" or "gusty" 10-m wind as predictor for SS and DU + ! Use 2 by default, and if Tegen (nddust=8) then use 0 NAERWND = 2 !-- other values would be: (see *aer_src*) !- NAERWND = 0 for "plain" 10-m wind as predictor for sea salt and desert dust emissions @@ -912,8 +924,8 @@ SUBROUTINE SU_AERW(YDMODEL) & ,'' LAERNITRATE = '',L5 & & ,'' NMAXTAER = '',I2 ,'' NDDUST = '',I1 & & ,'' NSSALT = '',I1,'' NSO4SCHEME = '',I1 & - & ,'' NINIDAY = '',I8)') & - & AERO_SCHEME,LEPAERO,LAERNITRATE,NMAXTAER,NDDUST,NSSALT,NSO4SCHEME,NINIDAY + & ,'' NINIDAY = '',I8,'' DCAL = '',F10.4,'' NOSEASALT = '',L5,'' GUSTS = '',L5)') & + & AERO_SCHEME,LEPAERO,LAERNITRATE,NMAXTAER,NDDUST,NSSALT,NSO4SCHEME,NINIDAY,DCAL,NOSEASALT,GUSTS WRITE(UNIT=NULOUT,FMT='('' NAERO = '',I2,'' NACTAERO = '',I2,& &'' NXT3DAER = '',I2,'' NAERCONF = '',I3)') & diff --git a/ifs-source/arpifs/phys_radi/suecrad.F90 b/ifs-source/arpifs/phys_radi/suecrad.F90 index ba7e3074..0dffd4eb 100644 --- a/ifs-source/arpifs/phys_radi/suecrad.F90 +++ b/ifs-source/arpifs/phys_radi/suecrad.F90 @@ -155,6 +155,7 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) USE YOMSOLARIRRADIANCE, ONLY :YSOLARIRRADIANCE ! Total solar irradiance multi-annual timeseries USE YOERADGHG , ONLY : YRADGHG ! Climatology interpolated to current model time USE RADIATION_SETUP , ONLY : SETUP_RADIATION_SCHEME +USE YOEDUST , ONLY : YDUSTCLIM USE YOEAEROP , ONLY : STRATO_CMIP_NMONTH, STRATO_CMIP_NTB, & & STRATO_CMIP_NALT, STRATO_CMIP_NLAT, STRATO_CMIP_NSB, & & CHECK_SUN_MEAN, CHECK_EARTH_MEAN, & @@ -315,6 +316,7 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) & YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO, & & YDAERM7=>YDMODEL%YRML_PHY_AER%YREAEROPT,&! use this to transfer AOD, SSA and ASY to rad scheme & YDAERSTRAT=>YDMODEL%YRML_PHY_AER%YREAEROSTRAT,& + & NDDUST=>YDMODEL%YRML_PHY_AER%YREAERSRC%NDDUST, & & YDEAERD=>YDMODEL%YRML_PHY_RAD%YREAERD, RADGRID=>YDMODEL%YRML_PHY_RAD%RADGRID, & & YDPHNC=>YDMODEL%YRML_PHY_SLIN%YRPHNC, YDRADF=>YDMODEL%YRML_PHY_RAD%YRRADF, YDRI=>YDMODEL%YRML_PHY_RAD%YRRI, & & YDRO=>YDMODEL%YRML_PHY_RAD%YRRO,YDRADIATION=>YDMODEL%YRML_PHY_RAD%YRADIATION) @@ -2647,6 +2649,14 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) ENDIF ENDIF +IF (.NOT. ASSOCIATED(YDUSTCLIM)) THEN + ALLOCATE(YDUSTCLIM) +!ENDIF +!IF (NDDUST==8) THEN !! Cannot skip this "READ" step even if not used + WRITE(UNIT=KULOUT,FMT='(" TEGEN DUST CLIM: Reading dust fields ")') + CALL YDUSTCLIM%READ() +ENDIF + ! Load greenhouse-gas climatology IF (.NOT. ASSOCIATED(YGHGCLIM)) THEN ALLOCATE(YGHGCLIM) From e84aaa024cef02d3d7d8d4b7dbbc9539333d84cc Mon Sep 17 00:00:00 2001 From: Simone Vacondio Date: Mon, 23 Feb 2026 13:42:57 +0000 Subject: [PATCH 118/129] Pull request #68: OIFS-661 Add support to BSC MN5 platform Merge in ~NM6/openifs-48r1 from OIFS-661-mn5-arch to knmi-m7 Squashed commit of the following: commit 6a125bbbe6d6dd764912c56c94f2fefd6e9eaed3 Author: Simone Vacondio Date: Wed Jan 14 16:00:39 2026 +0100 Clean up commit 1fbbdff20ba7c23252059bd71b7408b6cbbcdd64 Author: Simone Vacondio Date: Mon Dec 22 14:14:10 2025 +0100 Fix Intel env's commit 535ad4f8c82650ac74c3bf41bd3141d8283456b3 Author: Simone Vacondio Date: Mon Dec 22 14:11:57 2025 +0100 Change default MN5 arch to Intel+OMPI commit 692e493011141a1d19c0cff3f59bce80c1fa79f9 Author: Simone Vacondio Date: Mon Dec 22 11:06:52 2025 +0100 Add default MN5 arch commit 61677fca5bd33c050902230cb7f1ae6d185658c8 Author: Simone Vacondio Date: Mon Dec 22 10:36:57 2025 +0100 Add MN5 case to set_launcher (ifs-test) commit d3e4762fab2ac14d783a4b874b320a89794cb42a Author: Simone Vacondio Date: Mon Dec 22 10:22:18 2025 +0100 Add BSC arch files commit 8c304c8f0d3f7a89b2ab0e814e330605b08b4d2f Author: Simone Vacondio Date: Fri Dec 19 15:42:31 2025 +0100 Fix for Intel 2023.2.0 --- arch/bsc/mn5-gpp/default | 1 + arch/bsc/mn5-gpp/gnu/env.sh | 43 +++++++++++++++ arch/bsc/mn5-gpp/gnu/final.cmake | 1 + arch/bsc/mn5-gpp/gnu/modulefile.in | 1 + arch/bsc/mn5-gpp/intel/intelmpi/env.sh | 53 +++++++++++++++++++ arch/bsc/mn5-gpp/intel/intelmpi/final.cmake | 1 + arch/bsc/mn5-gpp/intel/intelmpi/modulefile.in | 1 + arch/bsc/mn5-gpp/intel/openmpi/env.sh | 46 ++++++++++++++++ arch/bsc/mn5-gpp/intel/openmpi/final.cmake | 1 + arch/bsc/mn5-gpp/intel/openmpi/modulefile.in | 1 + .../advection/mgrids_advection_module.F90 | 4 +- .../advection/mgrids_advection_submodule.F90 | 4 +- ifs-test/bin/set_launcher.bash | 6 +++ 13 files changed, 159 insertions(+), 4 deletions(-) create mode 120000 arch/bsc/mn5-gpp/default create mode 100755 arch/bsc/mn5-gpp/gnu/env.sh create mode 120000 arch/bsc/mn5-gpp/gnu/final.cmake create mode 120000 arch/bsc/mn5-gpp/gnu/modulefile.in create mode 100644 arch/bsc/mn5-gpp/intel/intelmpi/env.sh create mode 120000 arch/bsc/mn5-gpp/intel/intelmpi/final.cmake create mode 120000 arch/bsc/mn5-gpp/intel/intelmpi/modulefile.in create mode 100755 arch/bsc/mn5-gpp/intel/openmpi/env.sh create mode 120000 arch/bsc/mn5-gpp/intel/openmpi/final.cmake create mode 120000 arch/bsc/mn5-gpp/intel/openmpi/modulefile.in diff --git a/arch/bsc/mn5-gpp/default b/arch/bsc/mn5-gpp/default new file mode 120000 index 00000000..cd30990e --- /dev/null +++ b/arch/bsc/mn5-gpp/default @@ -0,0 +1 @@ +intel/openmpi \ No newline at end of file diff --git a/arch/bsc/mn5-gpp/gnu/env.sh b/arch/bsc/mn5-gpp/gnu/env.sh new file mode 100755 index 00000000..8b20cab8 --- /dev/null +++ b/arch/bsc/mn5-gpp/gnu/env.sh @@ -0,0 +1,43 @@ +# Source me to get the correct configure/build/run environment + +# Store tracing and disable (module is *way* too verbose) +{ tracing_=${-//[^x]/}; set +x; } 2>/dev/null + +module_load() { + echo "+ module load $*" + module load $* +} +module_unload() { + echo "+ module unload $*" + module unload $* +} +module_purge() { + echo "+ module purge" + module purge +} + +module_purge +module_load gcc/12.3.0 +module_load openmpi/4.1.5-gcc +module_load hdf5/1.14.1-2-gcc-openmpi +module_load pnetcdf/1.12.3-gcc-openmpi +module_load netcdf/c-4.9.2_fortran-4.6.1_cxx4-4.3.1_hdf5-1.14.1-2_pnetcdf-1.12.3-gcc-openmpi +module_load cmake/3.29.2 +module_load aec/1.1.2-gcc +module_load mkl/2024.1 +module_load python/3.12.1-gcc +module_load ucx/1.16.0-gcc +module_load fftw/3.3.10-gcc-ompi + +# Setting required for bit reproducibility with Intel MKL: +export MKL_CBWR=AUTO,STRICT + +# Record the RPATH in the executable +export LD_RUN_PATH=$LD_LIBRARY_PATH + +# Undo stack size limitation enforced by Python module (prevent segfault during +# runtime) +ulimit -s unlimited + +# Restore tracing to stored setting +{ if [[ -n "$tracing_" ]]; then set -x; else set +x; fi } 2>/dev/null diff --git a/arch/bsc/mn5-gpp/gnu/final.cmake b/arch/bsc/mn5-gpp/gnu/final.cmake new file mode 120000 index 00000000..a07077d3 --- /dev/null +++ b/arch/bsc/mn5-gpp/gnu/final.cmake @@ -0,0 +1 @@ +../../../ecmwf/final.cmake \ No newline at end of file diff --git a/arch/bsc/mn5-gpp/gnu/modulefile.in b/arch/bsc/mn5-gpp/gnu/modulefile.in new file mode 120000 index 00000000..67a37141 --- /dev/null +++ b/arch/bsc/mn5-gpp/gnu/modulefile.in @@ -0,0 +1 @@ +../../../ecmwf/modulefile.in \ No newline at end of file diff --git a/arch/bsc/mn5-gpp/intel/intelmpi/env.sh b/arch/bsc/mn5-gpp/intel/intelmpi/env.sh new file mode 100644 index 00000000..1ff5b69a --- /dev/null +++ b/arch/bsc/mn5-gpp/intel/intelmpi/env.sh @@ -0,0 +1,53 @@ +# Source me to get the correct configure/build/run environment + +# Store tracing and disable (module is *way* too verbose) +{ tracing_=${-//[^x]/}; set +x; } 2>/dev/null + +module_load() { + echo "+ module load $*" + module load $* +} +module_unload() { + echo "+ module unload $*" + module unload $* +} +module_purge() { + echo "+ module purge" + module purge +} + +module_purge +module_load intel/2023.2.0 +module_load impi/2021.10.0 +module_load hdf5/1.14.1-2 +module_load pnetcdf/1.12.3 +module_load netcdf/2023-06-14 +module_load fftw/3.3.10 +module_load mkl/2024.1 +module_load ucx/1.16.0 +module_load aec/1.1.2 +module_load cmake/3.29.2 +module_load python/3.12.1 + +export TBBMALLOC_DIR="/apps/GPP/ONEAPI/2023.2.0/tbb/2021.10.0/lib/intel64/gcc4.8" +export TBBROOT="/apps/GPP/ONEAPI/2023.2.0/tbb/2021.10.0" +export TBB_MALLOC_USE_HUGE_PAGES=1 +export TBB_MALLOC_SET_HUGE_SIZE_THRESHOLD=0 +export I_MPI_FABRICS="shm:ofi" +export I_MPI_OFI_PROVIDER="verbs" +export FI_PROVIDER="verbs" +export I_MPI_PLATFORM="spr" +export UCX_TLS="rc,sm,self" # or rc,self if no shared memory + +# Setting required for bit reproducibility with Intel MKL: +export MKL_CBWR=AUTO,STRICT + +# Record the RPATH in the executable +export LD_RUN_PATH=$LD_LIBRARY_PATH + +# Undo stack size limitation enforced by Python module (prevent segfault during +# runtime) +ulimit -s unlimited + +# Restore tracing to stored setting +{ if [[ -n "$tracing_" ]]; then set -x; else set +x; fi } 2>/dev/null diff --git a/arch/bsc/mn5-gpp/intel/intelmpi/final.cmake b/arch/bsc/mn5-gpp/intel/intelmpi/final.cmake new file mode 120000 index 00000000..bb3bb4f4 --- /dev/null +++ b/arch/bsc/mn5-gpp/intel/intelmpi/final.cmake @@ -0,0 +1 @@ +../../../../ecmwf/final.cmake \ No newline at end of file diff --git a/arch/bsc/mn5-gpp/intel/intelmpi/modulefile.in b/arch/bsc/mn5-gpp/intel/intelmpi/modulefile.in new file mode 120000 index 00000000..0801ce95 --- /dev/null +++ b/arch/bsc/mn5-gpp/intel/intelmpi/modulefile.in @@ -0,0 +1 @@ +../../../../ecmwf/modulefile.in \ No newline at end of file diff --git a/arch/bsc/mn5-gpp/intel/openmpi/env.sh b/arch/bsc/mn5-gpp/intel/openmpi/env.sh new file mode 100755 index 00000000..e2304652 --- /dev/null +++ b/arch/bsc/mn5-gpp/intel/openmpi/env.sh @@ -0,0 +1,46 @@ +# Source me to get the correct configure/build/run environment + +# Store tracing and disable (module is *way* too verbose) +{ tracing_=${-//[^x]/}; set +x; } 2>/dev/null + +module_load() { + echo "+ module load $*" + module load $* +} +module_unload() { + echo "+ module unload $*" + module unload $* +} +module_purge() { + echo "+ module purge" + module purge +} + +module_purge +module_load intel/2023.2.0 +module_load openmpi/4.1.5 +module_load hdf5/1.14.1-2-openmpi +module_load pnetcdf/1.12.3-openmpi +module_load netcdf/2023-06-14-ompi +module_load fftw/3.3.10-openmpi +module_load mkl/2024.1 +module_load ucx/1.16.0 +module_load aec/1.1.2 +module_load cmake/3.29.2 +module_load python/3.12.1 + +export TBBMALLOC_DIR=/apps/GPP/ONEAPI/2023.2.0/tbb/2021.10.0/lib/intel64/gcc4.8 +export TBBROOT=/apps/GPP/ONEAPI/2023.2.0/tbb/2021.10.0/ + +# Setting required for bit reproducibility with Intel MKL: +export MKL_CBWR=AUTO,STRICT + +# Record the RPATH in the executable +export LD_RUN_PATH=$LD_LIBRARY_PATH + +# Undo stack size limitation enforced by Python module (prevent segfault during +# runtime) +ulimit -s unlimited + +# Restore tracing to stored setting +{ if [[ -n "$tracing_" ]]; then set -x; else set +x; fi } 2>/dev/null diff --git a/arch/bsc/mn5-gpp/intel/openmpi/final.cmake b/arch/bsc/mn5-gpp/intel/openmpi/final.cmake new file mode 120000 index 00000000..bb3bb4f4 --- /dev/null +++ b/arch/bsc/mn5-gpp/intel/openmpi/final.cmake @@ -0,0 +1 @@ +../../../../ecmwf/final.cmake \ No newline at end of file diff --git a/arch/bsc/mn5-gpp/intel/openmpi/modulefile.in b/arch/bsc/mn5-gpp/intel/openmpi/modulefile.in new file mode 120000 index 00000000..0801ce95 --- /dev/null +++ b/arch/bsc/mn5-gpp/intel/openmpi/modulefile.in @@ -0,0 +1 @@ +../../../../ecmwf/modulefile.in \ No newline at end of file diff --git a/ifs-source/arpifs/mgrids/advection/mgrids_advection_module.F90 b/ifs-source/arpifs/mgrids/advection/mgrids_advection_module.F90 index 8f06617c..70e28676 100644 --- a/ifs-source/arpifs/mgrids/advection/mgrids_advection_module.F90 +++ b/ifs-source/arpifs/mgrids/advection/mgrids_advection_module.F90 @@ -57,7 +57,7 @@ module mgrids_advection_module !! Notify if mgrids_advection is active ( implementation != null ) procedure, public :: execute !! Execute mgrids_advection - procedure, public :: final + procedure, public :: cleanup !! Cleanup mgrids_advection end type @@ -131,7 +131,7 @@ module subroutine execute( & !------------------------------------------------------------------------------ interface - module subroutine final(this) + module subroutine cleanup(this) class(mgrids_advection) :: this end subroutine end interface diff --git a/ifs-source/arpifs/mgrids/advection/mgrids_advection_submodule.F90 b/ifs-source/arpifs/mgrids/advection/mgrids_advection_submodule.F90 index 322e21f9..58f25623 100644 --- a/ifs-source/arpifs/mgrids/advection/mgrids_advection_submodule.F90 +++ b/ifs-source/arpifs/mgrids/advection/mgrids_advection_submodule.F90 @@ -67,7 +67,7 @@ module function mgrids_advection_create( & contains subroutine setup_no_advection() - call this%final() + call this%cleanup() end subroutine subroutine setup_mgrids_sladv() @@ -197,7 +197,7 @@ module subroutine execute( & !------------------------------------------------------------------------------ -module subroutine final(this) +module subroutine cleanup(this) class(mgrids_advection) :: this if( associated( this%implementation ) ) then call this%implementation%final() diff --git a/ifs-test/bin/set_launcher.bash b/ifs-test/bin/set_launcher.bash index 2d7834a1..76073012 100644 --- a/ifs-test/bin/set_launcher.bash +++ b/ifs-test/bin/set_launcher.bash @@ -18,4 +18,10 @@ elif [[ "${ECPLATFORM:-"unset"}" == "puhti" ]] LAUNCHER_NTHREAD_FLAG="--cpus-per-task" export OMP_PROC_BIND=true export OMP_PLACES=threads +elif [[ "${ECPLATFORM:-"unset"}" == "mn5-gpp" ]] + LAUNCHER="srun" + LAUNCHER_NPROC_FLAG="-n" + LAUNCHER_NTHREAD_FLAG="--cpus-per-task" + export OMP_PROC_BIND=true + export OMP_PLACES=threads fi From 43420109ee861e8566cd5245938033d37151f020 Mon Sep 17 00:00:00 2001 From: Lianghai Wu Date: Wed, 11 Mar 2026 13:14:14 +0000 Subject: [PATCH 119/129] Pull request #74: Remove condition on zwlarge for MBN cloud activation computation Merge in ~NM6/openifs-48r1 from fix_mn_zwlarge to knmi-m7 Squashed commit of the following: commit 31131003b6d0420c3062401482131ed442d6aef4 Author: Philippe Le Sager Date: Wed Mar 11 14:11:11 2026 +0100 More cleanup commit c7f330fb6383c1489c128c8c33bff48db856d0ab Author: Lianghai Wu Date: Tue Mar 10 12:37:00 2026 +0000 cherry pick to fix too strict zwlarge condition --- .../arpifs/m7/phys_ec/yoe_aer_activ.F90 | 2688 +---------------- 1 file changed, 33 insertions(+), 2655 deletions(-) diff --git a/ifs-source/arpifs/m7/phys_ec/yoe_aer_activ.F90 b/ifs-source/arpifs/m7/phys_ec/yoe_aer_activ.F90 index 8b66a848..4bdee7ce 100644 --- a/ifs-source/arpifs/m7/phys_ec/yoe_aer_activ.F90 +++ b/ifs-source/arpifs/m7/phys_ec/yoe_aer_activ.F90 @@ -9,23 +9,11 @@ MODULE YOE_AER_ACTIV !---public member functions PUBLIC AER_ACTIV - !PUBLIC GET_CDNC_FACTOR - !PUBLIC SETUP_ACI_DIAG !---private member functions - !PRIVATE AER_ACTIV_FOUNTOUKIS_NENES - !PRIVATE AER_ACTIV_MORALES_NENES PRIVATE AER_ACTIV_MORALES_NENES_FULL - !PRIVATE AER_ACTIV_MORALES_NENES_FULL_OLDPDF - !PRIVATE AER_ACTIV_ABDULRAZZAK_GHAN - !PRIVATE AER_ACTIV_MENON - !PRIVATE SINTEGRAL - !PRIVATE SINTEGRAL_MN - !PRIVATE DIAGNOSE_AEROSOL_MASS PRIVATE GET_HAMM7_AERO_PROP - !PRIVATE LIQ_CLOUD_RE PRIVATE ICE_CLOUD_PROP - !PRIVATE PDF_UPDRAFT !---module types, variables and constants @@ -61,25 +49,10 @@ SUBROUTINE AER_ACTIV(KIDIA, KFDIA, KTDIA, KLON, KLEV, KSTGLO, & ! either via interactive coupling to TM5 or a prescribed pre-industrial climatology !---inherited functions, types, variables and constants - USE YOMCST, ONLY: RD, RPI, RG - ! USE YOERAD, ONLY: LNEWAER, LCMIP5, LTM5AER, LCMIP6_PI_AEROSOLS, LMAC2SPACI - ! USE YOECLDP, ONLY: NCLOUDACT, JP_ACT_FOUNTOUKIS_NENES, JP_ACT_ABDULRAZZAK_GHAN, & - ! & JP_ACT_MENON, JP_ACT_MORALES_NENES, JP_ACT_MORALES_NENES_FULL, & - ! & JP_ACT_MORALES_NENES_FULL_OLDPDF, & - ! & LAERICESED, LAERICEAUTO, LACI_DIAG, NACTPDF, & - ! & RLMIN, RAMIN, RTHOMO - !USE YOECLDP, ONLY: LAERICESED, LAERICEAUTO, & - ! & RLMIN, RAMIN, RTHOMO - !USE MO_ACTIV, ONLY: nw !eehol: to replace NACTPDF - !USE YOE_AERO_M7_DATA, ONLY: NSOL - USE TM5M7_DATA, ONLY: NSOL - USE MO_HAM, ONLY: NCLASS - !USE YOMCT3, ONLY: NSTEP - !USE YOMCT0, ONLY: NFRPOS - !USE YOMDYN, ONLY: TSTEP - !USE YOM_YGFL, ONLY: YGFL, YCDNC, YICNC, YRE_LIQ, YRE_ICE - !USE YOE_PI_AERO, ONLY: LPI_AERO_UPDATED - USE TYPE_MODEL, ONLY: MODEL + USE YOMCST, ONLY: RD, RPI, RG + USE TM5M7_DATA, ONLY: NSOL + USE MO_HAM, ONLY: NCLASS + USE TYPE_MODEL, ONLY: MODEL IMPLICIT NONE @@ -223,8 +196,6 @@ SUBROUTINE AER_ACTIV(KIDIA, KFDIA, KTDIA, KLON, KLEV, KSTGLO, & REAL(KIND=JPRB), PARAMETER :: ZEPSEC = 1.E-14_JPRB ! taken from cloudsc.F90 REAL(KIND=JPRB) :: ZTMPA - REAL(KIND=JPRB) :: ZMAC2SP_CDNC_FACTOR(KLON) - !---executable procedure IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.AER_ACTIV', 0, ZHOOK_HANDLE) ASSOCIATE(YGFL=>YDMODEL%YRML_GCONF%YGFL,YDECLDP=>YDMODEL%YRML_PHY_EC%YRECLDP) @@ -277,101 +248,21 @@ SUBROUTINE AER_ACTIV(KIDIA, KFDIA, KTDIA, KLON, KLEV, KSTGLO, & END IF IF (ITOP.LE.KLEV) THEN -! -! SELECT CASE(NCLOUDACT) -! CASE(JP_ACT_MENON) -! -! IF (.NOT. (LTM5AER .OR. LCMIP6_PI_AEROSOLS .OR. LCMIP5 .OR. LNEWAER)) & -! & CALL ABOR1('YOE_AER_ACTIV: No supported aerosol scheme for Menon cloud activation') -! -! !---Tegen or CMIP5 aerosols: map from optical properties to bulk aerosol mass -! IF ((.NOT.LTM5AER) .AND. (.NOT. LCMIP6_PI_AEROSOLS)) THEN -! CALL DIAGNOSE_AEROSOL_MASS(KIDIA, KFDIA, KLON, KLEV, PT, PQ, PQSAT, & -! & PAPH, PAP, PGELAM, PGEMU, PCLON, PSLON, & -! & ZSO4BULK, ZBCBULK, ZOMBULK, ZSSBULK, ZDUBULK) -! END IF -! -! CALL AER_ACTIV_MENON (KIDIA, KFDIA, KLON, ITOP, KLEV, PT, ZRHO, PLSM, ZSO4BULK, ZSSBULK, ZOMBULK, & -! & PGFL(:,:,YCDNC%MP9_PH)) -! -! -! CASE(JP_ACT_FOUNTOUKIS_NENES) -! -! IF ((.NOT.LTM5AER) .AND. (.NOT. LCMIP6_PI_AEROSOLS)) & -! & CALL ABOR1('YOE_AER_ACTIV:Fountoukis and Nenes scheme requires LTM5AER=T or LMIP6_PI_AEROSOLS=T') -! -! CALL PDF_UPDRAFT(KIDIA, KFDIA, KLON, ITOP, KLEV, NACTPDF, ZRHO, PLSM, PVERVEL, ZW, ZWPDF) -! -! CALL AER_ACTIV_FOUNTOUKIS_NENES(KIDIA, KFDIA, ITOP, KLON, KLEV, NACTPDF, LLIQCLD, PT, PAP, ZRHO, & -! & PQ, ZW, ZWPDF, ZSO4MASS, ZBCMASS, ZOMMASS, ZSSMASS, & -! & ZDUMASS, ZNO3MASS, ZMSAMASS, ZAERONUM, ZDRYRSOL, & -! & PGFL(:,:,YCDNC%MP9_PH), KFLDX, PEXTRA) -! -! CASE(JP_ACT_MORALES_NENES) -! -! IF ((.NOT.LTM5AER) .AND. (.NOT. LCMIP6_PI_AEROSOLS)) & -! & CALL ABOR1('YOE_AER_ACTIV:Morales and Nenes scheme requires LTM5AER=T or LMIP6_PI_AEROSOLS=T') -! -! CALL PDF_UPDRAFT(KIDIA, KFDIA, KLON, ITOP, KLEV, NACTPDF, ZRHO, PLSM, PVERVEL, ZW, ZWPDF) -! -! CALL AER_ACTIV_MORALES_NENES(KIDIA, KFDIA, ITOP, KLON, KLEV, NACTPDF, LLIQCLD, PT, PAP, ZRHO, & -! & PQ, ZW, ZWPDF, ZSO4MASS, ZBCMASS, ZOMMASS, ZSSMASS, & -! & ZDUMASS, ZNO3MASS, ZMSAMASS, ZAERONUM, ZDRYRSOL, & -! & PGFL(:,:,YCDNC%MP9_PH), KFLDX, PEXTRA) -! -! CASE(JP_ACT_MORALES_NENES_FULL) -! -! IF ((.NOT.LTM5AER) .AND. (.NOT. LCMIP6_PI_AEROSOLS)) & -! & CALL ABOR1('YOE_AER_ACTIV:Morales and Nenes full scheme requires LTM5AER=T or LMIP6_PI_AEROSOLS=T') - - ! The new scheme either approximates the integral over the updraft velocity PDF - ! by Gauss-Legendre quadrature or uses a PPDEFsingle characteristic velocity. - ! PDF_UPDRAFT, NACTPDF, ZW and ZWPDF are not used. + + ! The new scheme either approximates the integral over the updraft velocity PDF + ! by Gauss-Legendre quadrature or uses a PPDEFsingle characteristic velocity. + ! PDF_UPDRAFT, NACTPDF, ZW and ZWPDF are not used. CALL AER_ACTIV_MORALES_NENES_FULL(KIDIA, KFDIA, ITOP, KLON, KLEV, LLIQCLDD, PT, PAP, ZRHO, & & PVERVEL, ZSO4MASS, ZBCMASS, ZOMMASS, ZSSMASS, & & ZDUMASS, ZNO3MASS, ZMSAMASS, ZAERONUM, ZDRYRSOL, & & ZCDNC, ZSMAX, PGEMU, PSIGMA_W) !PSLON, PGEMU) !& PGFL(:,:,YCDNC%MP9_PH), ZSMAX, PGEMU, PSIGMA_W) !PSLON, PGEMU) !& PGFL(:,:,YCDNC%MP9_PH), KFLDX, PEXTRA, PSLON, PGEMU) -! -! CASE(JP_ACT_MORALES_NENES_FULL_OLDPDF) -! -! IF ((.NOT.LTM5AER) .AND. (.NOT. LCMIP6_PI_AEROSOLS)) & -! & CALL ABOR1('YOE_AER_ACTIV:Morales and Nenes full scheme with old PDF sampling requires LTM5AER=T or LMIP6_PI_AEROSOLS=T') -! -! CALL PDF_UPDRAFT(KIDIA, KFDIA, KLON, ITOP, KLEV, NACTPDF, ZRHO, PLSM, PVERVEL, ZW, ZWPDF) -! -! CALL AER_ACTIV_MORALES_NENES_FULL_OLDPDF(KIDIA, KFDIA, ITOP, KLON, KLEV, NACTPDF, LLIQCLD, PT, PAP, ZRHO, & -! & ZW, ZWPDF, ZSO4MASS, ZBCMASS, ZOMMASS, ZSSMASS, & -! & ZDUMASS, ZNO3MASS, ZMSAMASS, ZAERONUM, ZDRYRSOL, & -! & PGFL(:,:,YCDNC%MP9_PH), KFLDX, PEXTRA, PSLON, PGEMU) -! -! CASE(JP_ACT_ABDULRAZZAK_GHAN) -! -! IF ((.NOT.LTM5AER) .AND. (.NOT. LCMIP6_PI_AEROSOLS)) & -! & CALL ABOR1('YOE_AER_ACTIV:Abdul-Razzak and Ghan scheme requires LTM5AER=T or LCMIP6_PI_AEROSOLS=T') -! -! CALL PDF_UPDRAFT(KIDIA, KFDIA, KLON, ITOP, KLEV, NACTPDF, ZRHO, PLSM, PVERVEL, ZW, ZWPDF) -! -! CALL AER_ACTIV_ABDULRAZZAK_GHAN(KIDIA, KFDIA, ITOP, KLON, KLEV, NACTPDF, LLIQCLD, PT, PAP, ZRHO, & -! & PQ, ZW, ZWPDF, ZSO4MASS, ZBCMASS, ZOMMASS, ZSSMASS, & -! & ZDUMASS, ZNO3MASS, ZMSAMASS, ZAERONUM, ZDRYRSOL, & -! & PGFL(:,:,YCDNC%MP9_PH), KFLDX, PEXTRA) -! END SELECT - - !---get CDNC_FACTOR from MAC2SP if needed - ! IF (LMAC2SPACI .AND. .NOT.LTM5AER) THEN - ! CALL GET_CDNC_FACTOR(KIDIA,KFDIA,KLON,PGEMU,PGELAM,ZMAC2SP_CDNC_FACTOR) - ! ELSE - ! ZMAC2SP_CDNC_FACTOR(:)=1._JPRB - ! END IF - - ZMAC2SP_CDNC_FACTOR(:)=1._JPRB !---limit CDNC to min PPMINCDNC, set default value for CDNC outside clouds DO JK=KTDIA,KLEV ZCDNC(KIDIA:KFDIA,JK)=MERGE( & - & MAX(ZCDNC(KIDIA:KFDIA,JK)*ZMAC2SP_CDNC_FACTOR(KIDIA:KFDIA),PPMINCDNC), & + & MAX(ZCDNC(KIDIA:KFDIA,JK),PPMINCDNC), & & PPDEFCDNC, LLIQCLD(KIDIA:KFDIA,JK) ) END DO @@ -435,10 +326,10 @@ SUBROUTINE AER_ACTIV(KIDIA, KFDIA, KTDIA, KLON, KLEV, KSTGLO, & !eehol: diagnostics: !--CDNC - PCDNCACT(KIDIA:KFDIA,1:KLEV) = 1.0E6_JPRB*MAX(ZCDNC(KIDIA:KFDIA,1:KLEV),PPMINCDNC) !eehol: output CDNC [#/m3] + PCDNCACT(KIDIA:KFDIA,1:KLEV) = 1.0E6_JPRB*ZCDNC(KIDIA:KFDIA,1:KLEV) ! CDNC [#/m3] !--ICNC - PICNC(KIDIA:KFDIA,1:KLEV) = ZICNC(KIDIA:KFDIA,1:KLEV) !eehol: output ICNC [#/cm3] + PICNC(KIDIA:KFDIA,1:KLEV) = ZICNC(KIDIA:KFDIA,1:KLEV) ! ICNC [#/cm3] !--Liq eff rad PREFFL(KIDIA:KFDIA,1:KLEV) = MERGE(ZRE_LIQ(KIDIA:KFDIA,1:KLEV),PPREFFL_DEF,LLIQCLD(KIDIA:KFDIA,1:KLEV)) !eehol: output liq eff rad [um] @@ -449,56 +340,6 @@ SUBROUTINE AER_ACTIV(KIDIA, KFDIA, KTDIA, KLON, KLEV, KSTGLO, & !--Maximum supersaturation PSMAX(KIDIA:KFDIA,1:KLEV) = ZSMAX(KIDIA:KFDIA,1:KLEV) !eehol: output maximum supersaturation [%] -! IF (LACI_DIAG) THEN -! !---2D diagnostics: AOD - removed. Can be re-implemented in RADLSWR if needed. -! -! !---3D diagnostics: accumulated CDNC, ICNC, RE_liq, Re_ice, -! ! liquid cloud time, ice cloud time (ice diagnostics disabled for now) -! !DO JK=1,KLEV -! ! DO JL=KIDIA,KFDIA -! ! LICECLD(JL,JK) = (PI(JL,JK) > RLMIN) -! ! END DO -! !END DO -! -! IF (MOD(NSTEP,NFRPOS) == 0) THEN ! if first timestep after output step -! PEXTRA(KIDIA:KFDIA,:,D_CDNC%IXTRA) = 0._JPRB -! PEXTRA(KIDIA:KFDIA,:,D_LIQCLDT%IXTRA) = 0._JPRB -! END IF -! -! !--Reff (liq) -! ! moved to RADLSWR -! -! !--CDNC -! ZTMP(KIDIA:KFDIA,:) = PEXTRA(KIDIA:KFDIA,:,D_CDNC%IXTRA) + PGFL(KIDIA:KFDIA,:,YCDNC%MP9_PH)*TSTEP -! PEXTRA(KIDIA:KFDIA,:,D_CDNC%IXTRA) = MERGE(ZTMP(KIDIA:KFDIA,:), & -! & PEXTRA(KIDIA:KFDIA,:,D_CDNC%IXTRA), LLIQCLD(KIDIA:KFDIA,:)) -! !--cloud time (liq) -! ZTMP(KIDIA:KFDIA,:) = PEXTRA(KIDIA:KFDIA,:,D_LIQCLDT%IXTRA) + TSTEP -! PEXTRA(KIDIA:KFDIA,:,D_LIQCLDT%IXTRA) = MERGE(ZTMP(KIDIA:KFDIA,:), & -! & PEXTRA(KIDIA:KFDIA,:,D_LIQCLDT%IXTRA), LLIQCLD(KIDIA:KFDIA,:)) -! -! !--ICNC (not in CMIP6) -! ! IF (LAERICESED .OR. LAERICEAUTO) THEN -! ! ZTMP(KIDIA:KFDIA,:) = PEXTRA(KIDIA:KFDIA,:,IX+3) + PGFL(KIDIA:KFDIA,:,YICNC%MP9_PH)*TSTEP -! ! PEXTRA(KIDIA:KFDIA,:,IX+3) = MERGE(ZTMP(KIDIA:KFDIA,:), & -! ! & PEXTRA(KIDIA:KFDIA,:,IX+3), LICECLD(KIDIA:KFDIA,:)) -! ! END IF -! -! !--Reff (ice) (not in CMIP6) -! ! IF (LAERICESED .OR. LAERICEAUTO) THEN -! ! ZTMP(KIDIA:KFDIA,:) = PEXTRA(KIDIA:KFDIA,:,IX+4) + PGFL(KIDIA:KFDIA,:,YRE_ICE%MP9_PH)*TSTEP -! ! PEXTRA(KIDIA:KFDIA,:,IX+4) = MERGE(ZTMP(KIDIA:KFDIA,:), & -! ! & PEXTRA(KIDIA:KFDIA,:,IX+4), LICECLD(KIDIA:KFDIA,:)) -! ! END IF -! -! !--cloud time (ice) (not in CMIP6) -! ! IF (LAERICESED .OR. LAERICEAUTO) THEN -! ! ZTMP(KIDIA:KFDIA,:) = PEXTRA(KIDIA:KFDIA,:,IX+5) + TSTEP -! ! PEXTRA(KIDIA:KFDIA,:,IX+5) = MERGE(ZTMP(KIDIA:KFDIA,:), & -! ! & PEXTRA(KIDIA:KFDIA,:,IX+5), LICECLD(KIDIA:KFDIA,:)) -! ! END IF -! -! END IF END ASSOCIATE END ASSOCIATE @@ -508,1051 +349,6 @@ SUBROUTINE AER_ACTIV(KIDIA, KFDIA, KTDIA, KLON, KLEV, KSTGLO, & END SUBROUTINE AER_ACTIV -! SUBROUTINE AER_ACTIV_FOUNTOUKIS_NENES(KIDIA, KFDIA, KTDIA, KLON, KLEV, KPDF, LCLOUD, PT, PAP, PRHO, & -! & PQ, PW, PWPDF, PSO4MASS, PBCMASS, POMMASS, PSSMASS, & -! & PDUMASS,PNO3MASS, PMSAMASS, PAERONUM, PRDRY, PCDNC, KFLDX, PEXTRA) -! -! -! ! *aer_activ_fountoukis_nenes* calculates the number of activated aerosol -! ! particles from the aerosol size-distribution, -! ! composition and ambient supersaturation -! ! -! ! Author: -! ! ------- -! ! Sami Romakkaniemi, FMI -! ! Philip Stier, University of Oxford -! ! Declan O'Donnell, FMI -! ! Twan van Noije, KNMI -! ! -! ! References: -! ! ----------- -! ! Abdul-Razzak et al., JGR, 103, D6, 6123-6131, 1998 -! ! Abdul-Razzak and Ghan, JGR, 105, D5, 6837-6844, 2000 (referred to as ARG) -! ! Pruppbacher and Klett, Kluewer Ac. Pub., 1997 -! ! Ghan et al., JAMES 3, M10001, 2011 -! ! Nenes and Seinfeld, JGR, 108, D14, 4415, 2003 (referred to as NS) -! ! Fountoukis and Nenes, JGR, 110, D11212, 2005 (referred to as FN) -! ! Morales Betancourt and Nenes, GMD, 7, 2345-2357, 2014 (referred to as MN) -! ! Seinfeld and Pandis, Atmospheric Chemistry and Physics, Second Edition (referred to as SP) -! -! -! USE YOMCST, ONLY: R, RV, RPI, RCPD, RG, RLVTT, RMV, RMD, RTT , RLSTT -! USE YOECLDP, ONLY: RTHOMO, PPRHO_WAT -! USE YOMLUN, ONLY: NULOUT -! USE YOETHF , ONLY : R2ES ,R3LES ,R3IES ,R4LES ,& -! & R4IES ,R5LES ,R5IES ,R5ALVCP ,R5ALSCP ,& -! & RALVDCP ,RALSDCP ,RTWAT ,& -! & RTICE ,RTICECU ,& -! & RTWAT_RTICE_R ,RTWAT_RTICECU_R,& -! & RKOOP1 ,RKOOP2 -! USE YOE_AERO_M7_DATA, ONLY: NMOD, NSOL, SIGMALN, CMR2RAM, & -! & DH2SO4, DBC, DOC, DNACL, DDUST, & -! & DNA2SO4, DNH4NO3, DMSA, NH4NO3_FACTOR, & -! & PPKAPPA_H2SO4, PPKAPPA_NACL, PPKAPPA_NA2SO4, & -! & PPKAPPA_BC, PPKAPPA_OC, PPKAPPA_DU, & -! & PPKAPPA_NH4NO3, PPKAPPA_MSA, & -! & WSO4, WH2SO4, WNACL, WNA2SO4, & -! & WH2O, WDAIR -! -! IMPLICIT NONE -! -! !---included functions from header files -!#include "fcttre.h" -! -! !---subroutine interface -! INTEGER(KIND=JPIM), INTENT(IN) :: KIDIA -! INTEGER(KIND=JPIM), INTENT(IN) :: KFDIA -! INTEGER(KIND=JPIM), INTENT(IN) :: KTDIA -! INTEGER(KIND=JPIM), INTENT(IN) :: KLON -! INTEGER(KIND=JPIM), INTENT(IN) :: KLEV -! INTEGER(KIND=JPIM), INTENT(IN) :: KPDF -! INTEGER(KIND=JPIM), INTENT(IN) :: KFLDX -! -! LOGICAL, INTENT(IN) :: LCLOUD(KLON,KLEV) -! -! REAL(KIND=JPRB), INTENT(IN) :: PT(KLON,KLEV) -! REAL(KIND=JPRB), INTENT(IN) :: PAP(KLON,KLEV) -! REAL(KIND=JPRB), INTENT(IN) :: PRHO(KLON,KLEV) -! REAL(KIND=JPRB), INTENT(IN) :: PQ(KLON,KLEV) -! REAL(KIND=JPRB), INTENT(IN) :: PW(KLON,KLEV,KPDF) -! REAL(KIND=JPRB), INTENT(IN) :: PWPDF(KLON,KLEV,KPDF) -! REAL(KIND=JPRB), INTENT(IN) :: PSO4MASS(KLON,KLEV,NSOL) ! [KG(SO4)/KG(AIR)] -! REAL(KIND=JPRB), INTENT(IN) :: PBCMASS(KLON,KLEV,NSOL) ! [KG(BC)/KG(AIR)] -! REAL(KIND=JPRB), INTENT(IN) :: POMMASS(KLON,KLEV,NSOL) ! [KG(OM)/KG(AIR)] -! REAL(KIND=JPRB), INTENT(IN) :: PSSMASS(KLON,KLEV,NSOL) ! [KG(SS)/KG(AIR)] -! REAL(KIND=JPRB), INTENT(IN) :: PDUMASS(KLON,KLEV,NSOL) ! [KG(DU)/KG(AIR)] -! REAL(KIND=JPRB), INTENT(IN) :: PNO3MASS(KLON,KLEV) ! [KG(NO3)/KG(AIR)] -! REAL(KIND=JPRB), INTENT(IN) :: PMSAMASS(KLON,KLEV) ! [KG(MSA)/KG(AIR)] -! REAL(KIND=JPRB), INTENT(IN) :: PAERONUM(KLON,KLEV,NSOL) -! REAL(KIND=JPRB), INTENT(IN) :: PRDRY(KLON,KLEV,NSOL) -! REAL(KIND=JPRB), INTENT(IN) :: PEXTRA(KLON,KLEV,KFLDX) -! -! ! Output: -! REAL(KIND=JPRB), INTENT(INOUT) :: PCDNC(KLON,KLEV) -! -! !---local data -! INTEGER(KIND=JPIM) :: JL, JK, JMOD, JW -! -! REAL(KIND=JPRB) :: ZN(KLON,KLEV,NSOL) ! aerosol number concentration for each mode [m-3] -! REAL(KIND=JPRB) :: ZSM(KLON,KLEV,NSOL) ! critical supersaturation for activating particles -! ! with the mode number median radius -! REAL(KIND=JPRB) :: ZVOL(KLON) ! total dry particle volume -! REAL(KIND=JPRB) :: ZKAPPA(KLON) ! volume-weighted kappa -! REAL(KIND=JPRB) :: ZSMAX(KLON,KLEV,KPDF) ! maximum supersaturation -! REAL(KIND=JPRB) :: ZESW(KLON,KLEV) ! saturation water vapour pressure -! REAL(KIND=JPRB) :: ZDIF(KLON,KLEV) ! diffusivity -! REAL(KIND=JPRB) :: ZK(KLON,KLEV) ! thermal conductivity -! REAL(KIND=JPRB) :: ZA(KLON,KLEV) ! Kelvin coefficient -! REAL(KIND=JPRB) :: ZALPHA(KLON,KLEV) ! Intermediate term in supersaturation calulation -! REAL(KIND=JPRB) :: ZGAMMA(KLON,KLEV) ! Intermediate term in supersaturation calulation -! REAL(KIND=JPRB) :: ZGROWTH(KLON,KLEV) ! Growth coefficient -! REAL(KIND=JPRB) :: ZTERM1(KLON) ! Intermediate term in growth coefficient calulation -! REAL(KIND=JPRB) :: ZTERM2(KLON) ! Intermediate term in growth coefficient calulation -! REAL(KIND=JPRB) :: ZTERM3(KLON) ! Intermediate term in growth coefficient calulation -! -! REAL(KIND=JPRB) :: ZAMW ! molecular weight of water [kg mol-1] -! REAL(KIND=JPRB) :: ZAMD ! molecular weight of dry air [kg mol-1] -! -! REAL(KIND=JPRB) :: ZKA(KLON), ZKV(KLON) ! Intermediate terms in supersaturation calulation -! REAL(KIND=JPRB) :: ZXV(KLON), ZB(KLON) ! Intermediate terms in supersaturation calulation -! -! REAL(KIND=JPRB) :: ZDIFMOD(KLON) ! Modified diffusivity -! REAL(KIND=JPRB) :: ZNACT ! Intermediate values of the activated number concentration (#/m3) -! REAL(KIND=JPRB) :: ZNACT_WSUM(KLON,KLEV) ! Weighted sum of activated number concentration -! REAL(KIND=JPRB) :: ZPDF_NORM(KLON,KLEV) ! Normalization factor for ZNACT_WSUM -! -! REAL(KIND=JPRB) :: ZSSMASS(KLON) ! Sea salt MMR -! REAL(KIND=JPRB) :: ZDUMASS(KLON) ! Dust MMR -! REAL(KIND=JPRB) :: ZNO3MASS(KLON) ! Nitrate MMR -! REAL(KIND=JPRB) :: ZMSAMASS(KLON) ! MSA MMR -! -! REAL(KIND=JPRB) :: NSO4(KLON), NH2SO4(KLON) ! Particle numbers [kmol/kg air] -! REAL(KIND=JPRB) :: NNACL(KLON), NNA(KLON), NCL(KLON), NNA2SO4(KLON) -! -! ! Per-mode constants -! REAL(KIND=JPRB) :: ZMODECST1(NSOL), ZMODECST2(NSOL), ZMODECST3(NSOL), & -! & ZMODECST4(NSOL), ZMODECST5(NSOL) -! -! ! Intermediate values for the Fountoukis & Nenes iterative scheme -! REAL(KIND=JPRB) :: ZCF1, ZCF2, ZCF3 -! REAL(KIND=JPRB) :: ZVALUE1 -! REAL(KIND=JPRB) :: ZVALUE2 -! REAL(KIND=JPRB) :: ZVALUE3 -! REAL(KIND=JPRB) :: ZINT1 -! REAL(KIND=JPRB) :: ZINT2 -! REAL(KIND=JPRB) :: ZSMAXTEMP1, ZSMAXTEMP2, ZSMAXTEMP3 -! -! ! Control of iterative loop: -! ! According to Ghan et al. (2011) the FN scheme -! ! takes about 30 interations to converge; -! ! so safer to increase the maximum here. -! ! xxx to be tested -! INTEGER(KIND=JPIM), PARAMETER :: NMAXITER = 30 -! INTEGER(KIND=JPIM) :: NITERATIONS -! LOGICAL :: LCONVERGED -! -! ! Miscellaneous -! REAL(KIND=JPRB) :: ZEPS -! REAL(KIND=JPRB) :: Z4PIOVER3, ZSQRT2 -! REAL(KIND=JPHOOK) :: ZHOOK_HANDLE -! REAL(KIND=JPRB), PARAMETER :: PPEPSSEC = 1.E-25_JPRB ! used to avoid division by 0 -! -! ! mass accomodation coefficient -! ! between 0.1 and 1.0 -! ! Raatikainen et al., 2013 PNAS -! REAL(KIND=JPRB), PARAMETER :: PPALPHA_C = 1.E-1_JPRB -! -! ! Upper and lower size bounds (m) used for calculating the average water vapor diffusivity -! REAL(KIND=JPRB), PARAMETER :: DPBIG = 5.E-6_JPRB -! REAL(KIND=JPRB) :: DPLOW -! -! !--- executable procedure -! IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.AER_ACTIV_FOUNTOUKIS_NENES',0,ZHOOK_HANDLE) -! -! !--- 0) Initializations: -! -! ZSMAX(KIDIA:KFDIA,KTDIA:KLEV,:) = 0._JPRB -! ZSM(KIDIA:KFDIA,KTDIA:KLEV,:) = 0._JPRB -! ZNACT_WSUM(KIDIA:KFDIA,KTDIA:KLEV) = 0._JPRB -! ZPDF_NORM(KIDIA:KFDIA,KTDIA:KLEV) = 0._JPRB -! PCDNC(KIDIA:KFDIA,KTDIA:KLEV) = 0._JPRB -! -! ZEPS=EPSILON(1._JPRB) -! -! !--- Conversions to SI units [g mol-1 to kg mol-1]: -! ZAMW=WH2O*1.E-3_JPRB -! ZAMD=WDAIR*1.E-3_JPRB -! -! !---miscellaneous -! Z4PIOVER3 = 4._JPRB*RPI/3._JPRB -! ZSQRT2 = SQRT(2._JPRB) -! -! ! FN, Eq. (24) converted to m. -! DPLOW = MIN(0.207683E-6_JPRB * PPALPHA_C**(-0.33048_JPRB), DPBIG) -! -! !---grid-point calculations -! DO JK=KTDIA,KLEV -! DO JL=KIDIA,KFDIA -! IF (LCLOUD(JL,JK)) THEN -! !---Kelvin (curvature) coefficient, usually denoted by capital A. -! ! Here we use the definition of SP (introduced on p. 770), -! ! which is adopted in NS, FN, MN, -! ! and include an extra factor of 2 compared to the definition of Abdul-Razzak et al. (Eq. 5). -! ZA(JL,JK) = 4._JPRB * ZAMW * PPSURFTEN / (R * PPRHO_WAT * PT(JL,JK)) -! -! !--- Abdul-Razzak et al. (1998) (Eq. 11): -! ZALPHA(JL,JK) = (RG*ZAMW*RLVTT) / (RCPD*R*PT(JL,JK)*PT(JL,JK)) - & -! & (RG*ZAMD) / (R*PT(JL,JK)) -! -! ! Saturation water vapour pressure: -! ZESW(JL,JK) = FOEEWM(PT(JL,JK)) -! -! !--- Following the definitions of NS, FN and MN, -! ! gamma is defined as a dimensionless coefficient. -! ! We use Eq. (12) from Abdul-Razzak et al. (1998) and multiply it with the air density: -! ZGAMMA(JL,JK) = ( (R*PT(JL,JK)) / (ZESW(JL,JK)*ZAMW) + & -! & (ZAMW*RLVTT*RLVTT) / (RCPD*PAP(JL,JK)*ZAMD*PT(JL,JK)) ) * PRHO(JL,JK) -! -! !--- Diffusivity of water vapour in air (P&K, 13.3) [m2 s-1]: -! -! ZDIF(JL,JK)=0.211_JPRB * (PT(JL,JK)/RTT)**1.94_JPRB * (101325._JPRB/PAP(JL,JK)) *1.E-4_JPRB -! -! !--- modified diffusivity -! ! Average mode-independent value using FN, Eq. (23) -! ZB(JL) = (2._JPRB*ZDIF(JL,JK)/PPALPHA_C)*SQRT(2._JPRB*RPI*ZAMW/(R*PT(JL,JK))) -! -! !--- For any reasonable value of PPALPHA_C: DPBIG > DPLOW -! ZDIFMOD(JL) = ZDIF(JL,JK)*(1._JPRB-(ZB(JL)/(DPBIG-DPLOW))*LOG((DPBIG+ZB(JL))/(DPLOW+ZB(JL)))) -! -! !--- Thermal conductivity zk (P&K, 13.18) [cal cm-1 s-1 K-1]: -! -! ! Mole fraction of water: -! -! ZXV(JL) = PQ(JL,JK)*(ZAMD/ZAMW) -! -! ZKA(JL) = (5.69_JPRB+0.017_JPRB*(PT(JL,JK)-273.15_JPRB))*1.E-5_JPRB -! -! ZKV(JL) = (3.78_JPRB+0.020_JPRB*(PT(JL,JK)-273.15_JPRB))*1.E-5_JPRB -! -! ! Moist air, convert to [J m-1 s-1 K-1]: -! -! ZK(JL,JK) = ZKA(JL)*(1._JPRB-(1.17_JPRB-1.02_JPRB*ZKV(JL)/ZKA(JL))*ZXV(JL)) & -! & * 4.1868_JPRB*1.E2_JPRB -! -! !--- growth coefficient due to gas kinetic effects: -! !--- NS, Eq. (15) -! -! ZTERM1(JL) = (PPRHO_WAT*R*PT(JL,JK)) / (ZESW(JL,JK)*ZDIFMOD(JL)*ZAMW) -! -! !--- Note that no size dependence is introduced in the thermal conductivity -! ! See FN, p. 5 -! ZTERM2(JL) = (RLVTT*PPRHO_WAT) / (ZK(JL,JK)*PT(JL,JK)) -! -! ZTERM3(JL) = (RLVTT*ZAMW) / (R*PT(JL,JK))-1._JPRB -! -! !--- Note that the expression for G in NS (Eq. 15) has an additional factor of 4 -! ! compared to Abdul-Razzak et al. (1998), Eq. (16). -! ! FN follow the definition from NS, -! ! but have omitted the factor of 4 from their Eq. (12). This is a typo. -! ! See also SP (Eq. 17.70) and MN (Eq. A3). -! ZGROWTH(JL,JK) = 4._JPRB / (ZTERM1(JL) + ZTERM2(JL) * ZTERM3(JL)) -! -! END IF -! END DO -! END DO -! -! !---per-mode calculations: -! ! soluble mode number and critical supersaturation, ignore nucleation mode (mode 1) -! DO JMOD=2, NSOL -! DO JK=KTDIA,KLEV -! DO JL=KIDIA,KFDIA -! IF (LCLOUD(JL,JK)) THEN -! -! !---total volume per mode [m^3 / kg(air)], used for kappa calculation -! ZVOL(JL) = Z4PIOVER3 * PAERONUM(JL,JK,JMOD) * & -! & (CMR2RAM(JMOD)*PRDRY(JL,JK,JMOD))**3 -! -! !--- Number per unit volume [# m-3] for each mode: -! ZN(JL,JK,JMOD) = PAERONUM(JL,JK,JMOD)*PRHO(JL,JK) -! -! !---sea salt and dust do not exist in mode 2: -! ZSSMASS(JL) = MERGE(0._JPRB, PSSMASS(JL,JK,JMOD), JMOD==2) -! ZDUMASS(JL) = MERGE(0._JPRB, PDUMASS(JL,JK,JMOD), JMOD==2) -! -! !---ammonium-nitrate and MSA do not exit in mode 2 and 4: -! ZNO3MASS(JL) = MERGE(0._JPRB, PNO3MASS(JL,JK), JMOD==2 .OR. JMOD==4) -! ZMSAMASS(JL) = MERGE(0._JPRB, PMSAMASS(JL,JK), JMOD==2 .OR. JMOD==4) -! -! NNA(JL) = ZSSMASS(JL) / WNACL -! NCL(JL) = NNA(JL) -! NSO4(JL) = PSO4MASS(JL,JK,JMOD) / WSO4 -! NNA2SO4(JL) = MIN(NNA(JL)/2._JPRB, NSO4(JL)) -! NNA(JL) = NNA(JL) - 2._JPRB*NNA2SO4(JL) -! NNACL(JL) = MIN(NCL(JL), NNA(JL)) -! NCL(JL) = NNACL(JL) -! NH2SO4(JL) = NSO4(JL) - NNA2SO4(JL) -! -! !---mode kappa = volume-weighted sum of component kappa's -! ZKAPPA(JL) = ( (PPKAPPA_NACL * NNACL(JL) * WNACL / (DNACL*1.E3_JPRB)) + & -! & (PPKAPPA_NA2SO4 * NNA2SO4(JL) * WNA2SO4 / (DNA2SO4*1.E3_JPRB)) + & -! & (PPKAPPA_H2SO4 * NH2SO4(JL) * WH2SO4 / (DH2SO4*1.E3_JPRB)) + & -! & (PPKAPPA_BC * PBCMASS(JL,JK,JMOD) / (DBC*1.E3_JPRB)) + & -! & (PPKAPPA_OC * POMMASS(JL,JK,JMOD) / (DOC*1.E3_JPRB)) + & -! & (PPKAPPA_DU * ZDUMASS(JL) / (DDUST*1.E3_JPRB)) + & -! & (PPKAPPA_NH4NO3 * ZNO3MASS(JL) * NH4NO3_FACTOR / (DNH4NO3*1.E3_JPRB)) + & -! & (PPKAPPA_MSA * ZMSAMASS(JL) / (DMSA*1.E3_JPRB)) ) / & -! & ZVOL(JL) -! -! !---defensive step: minimum kappa to avoid divide by zero errors -! ZKAPPA(JL) = MERGE(ZKAPPA(JL), 0.04_JPRB, ZKAPPA(JL) > 0.04_JPRB ) -! -! !---eqn. (2) from Ghan et al (2011) -! ! an addition factor 0.5**3 has been included in the nominator -! ! because the Kelvin coefficient used here (ZA) -! ! is twice that in Ghan et al. (ZKELV) -! ZSM(JL,JK,JMOD) = SQRT(0.5_JPRB * ZA(JL,JK)**3 / & -! & (27._JPRB * ZKAPPA(JL) * PRDRY(JL,JK,JMOD)**3) ) -! -! END IF -! END DO -! END DO -! END DO -! -! -! !--- 2) Calculate maximum supersaturation: -! -! DO JMOD=2,NSOL -! -! !---some per-mode constants -! ZMODECST1(JMOD) = 3.0_JPRB*SIGMALN(JMOD)/ZSQRT2 ! final term in FN, Eq. (18) -! ZMODECST2(JMOD) = EXP(4.5_JPRB*SIGMALN(JMOD)**2) ! factor in FN, Eq. (18) -! -! ZMODECST3(JMOD) = ZMODECST1(JMOD)/2._JPRB ! final term in FN, Eq. (19) -! ZMODECST4(JMOD) = EXP(1.125_JPRB*SIGMALN(JMOD)**2) ! factor in FN, Eq. (19) -! -! ZMODECST5(JMOD) = 3.0_JPRB*ZSQRT2*SIGMALN(JMOD) ! denominator in FN, Eqs. (8) and (20) -! -! END DO -! -! DO JW=1,KPDF -! DO JK=KTDIA, KLEV -! DO JL=KIDIA,KFDIA -! IF (LCLOUD(JL,JK)) THEN -! IF (ZALPHA(JL,JK) > ZEPS .AND. PW(JL,JK,JW) > ZEPS) THEN -! ZSMAXTEMP1 = 1.0E-5_JPRB ! min cloud supersat. -! ZSMAXTEMP2 = 0.1_JPRB ! max cloud supersat. -! LCONVERGED = .FALSE. -! NITERATIONS = 0 -! -! ZCF1 = 0.5_JPRB*SQRT(ZGROWTH(JL,JK)/(ZALPHA(JL,JK)*PW(JL,JK,JW))) -! ZCF2 = ZA(JL,JK)/3.0_JPRB -! ! When gamma is defined as a dimensionless coefficient as above, -! ! ZCF3 should include a division by the air density. -! ! See MN, Eq. 5. -! ! This is an error in NS (Eq. 32) and FN (Eq. 10). -! ! It is can be traced back to the definition of the rate of water condensation in NS, Eq. (11), -! ! where W is expressed in units kg(liquid water)/m3(air) instead of kg(liquid water)/kg(air). -! ! See also SP, Eqs. (17.73) and (17.79). -! ZCF3 = 0.5_JPRB*RPI*ZGAMMA(JL,JK)*PPRHO_WAT*ZGROWTH(JL,JK) & -! & /ZALPHA(JL,JK)/PW(JL,JK,JW)/PRHO(JL,JK) -! -! CALL SINTEGRAL(ZA(JL,JK), ZALPHA(JL,JK), ZGAMMA(JL,JK), ZGROWTH(JL,JK), & -! & PW(JL,JK,JW), ZN(JL,JK,:), ZSM(JL,JK,:), ZSMAXTEMP1, & -! & ZMODECST1(:), ZMODECST2(:), ZMODECST3(:), ZMODECST4(:), & -! & ZMODECST5(:), ZINT1, ZINT2) -! -! ZVALUE1 = (ZINT1*ZCF1 + ZINT2*ZCF2)*ZCF3*ZSMAXTEMP1 - 1.0_JPRB -! -! !DIR$ INLINE -! CALL SINTEGRAL(ZA(JL,JK), ZALPHA(JL,JK), ZGAMMA(JL,JK), ZGROWTH(JL,JK), & -! & PW(JL,JK,JW), ZN(JL,JK,:), ZSM(JL,JK,:), ZSMAXTEMP2, & -! & ZMODECST1(:), ZMODECST2(:), ZMODECST3(:), ZMODECST4(:), & -! & ZMODECST5(:), ZINT1, ZINT2) -! ZVALUE2 = (ZINT1*ZCF1 + ZINT2*ZCF2) * ZCF3*ZSMAXTEMP2 - 1.0_JPRB -! -! DO WHILE ((.NOT.LCONVERGED) .AND. NITERATIONS < NMAXITER) -! NITERATIONS = NITERATIONS + 1 -! -! ZSMAXTEMP3 = 0.5_JPRB*(ZSMAXTEMP1+ZSMAXTEMP2) -! !DIR$ INLINE -! CALL SINTEGRAL(ZA(JL,JK), ZALPHA(JL,JK), ZGAMMA(JL,JK), ZGROWTH(JL,JK), & -! & PW(JL,JK,JW), ZN(JL,JK,:), ZSM(JL,JK,:), ZSMAXTEMP3, & -! & ZMODECST1(:), ZMODECST2(:), ZMODECST3(:), ZMODECST4(:), & -! & ZMODECST5(:), ZINT1, ZINT2) -! ZVALUE3 = (ZINT1*ZCF1 + ZINT2*ZCF2) * ZCF3*ZSMAXTEMP3 - 1.0_JPRB -! -! IF (SIGN(1.0_JPRB,ZVALUE1)*SIGN(1.0_JPRB,ZVALUE3) <= 0.0_JPRB) THEN -! ZVALUE2 = ZVALUE3 -! ZSMAXTEMP2 = ZSMAXTEMP3 -! ELSE -! ZVALUE1 = ZVALUE3 -! ZSMAXTEMP1 = ZSMAXTEMP3 -! END IF -! -! !xxx 1e-3, i.e. 0.1%, should be enough -! IF (ABS(ZSMAXTEMP2-ZSMAXTEMP1) <= 1.0E-5_JPRB*ZSMAXTEMP1) THEN -! -! ZSMAX(JL,JK,JW) = 0.5_JPRB*(ZSMAXTEMP1+ZSMAXTEMP2) -! LCONVERGED = .TRUE. -! -! ZNACT = 0._JPRB -! DO JMOD=2,NSOL -! IF (ZSM(JL,JK,JMOD) > ZEPS) THEN -! ZNACT = ZNACT + 0.5_JPRB*ZN(JL,JK,JMOD)*ERFC(2._JPRB*(LOG(ZSM(JL,JK,JMOD)/ZSMAX(JL,JK,JW)))/ZMODECST5(JMOD)) -! END IF -! END DO -! -! !---Sum up the total number of activated particles, weighted by the updraft PDF [m-3]: -! ZNACT_WSUM(JL,JK) = ZNACT_WSUM(JL,JK) + ZNACT*PWPDF(JL,JK,JW) -! -! ! Including the normalization here effectively means that conditions that don't yield a converged solution -! ! are discarded when calculating the mean CDNC over the updraft PDF. -! ZPDF_NORM(JL,JK) = ZPDF_NORM(JL,JK) + PWPDF(JL,JK,JW) -! -! END IF -! -! END DO ! do while -! -! IF (.NOT.LCONVERGED) THEN -! WRITE(NULOUT,*) 'WARNING: Fountoukis and Nenes scheme not converged for updraft velocity', PW(JL,JK,JW) -! ENDIF -! -! ELSE -! -! ! Set contribution to activation to zero when conditions are not met -! ZPDF_NORM(JL,JK) = ZPDF_NORM(JL,JK) + PWPDF(JL,JK,JW) -! -! END IF ! END IF safe wrt divide by 0, LOG(0)... -! END IF -! END DO !jl -! END DO !jk -! END DO -! -! DO JK=KTDIA,KLEV -! DO JL=KIDIA,KFDIA -! !---normalize the total number of activated particles over the PDF, and convert to [# cm-3] -! IF (LCLOUD(JL,JK) .AND. ZPDF_NORM(JL,JK) > ZEPS ) THEN -! PCDNC(JL,JK) = 1.E-6_JPRB * ZNACT_WSUM(JL,JK) / ZPDF_NORM(JL,JK) -! END IF -! END DO -! END DO -! -! IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.AER_ACTIV_FOUNTOUKIS_NENES',1,ZHOOK_HANDLE) -! -! END SUBROUTINE AER_ACTIV_FOUNTOUKIS_NENES -! -! SUBROUTINE SINTEGRAL(PA, PALPHA, PGAMMA, PGROWTH, PW, PN, PSM, & -! PSMAX, PUP1, PF1, PUP2, PF2, PUPD, PINTEG1, PINTEG2) -! -! USE YOE_AERO_M7_DATA, ONLY: NSOL -! -! IMPLICIT NONE -! -! REAL(KIND=JPRB), INTENT(IN) :: PN(NSOL), PSM(NSOL) -! REAL(KIND=JPRB), INTENT(IN) :: PUP1(NSOL), PF1(NSOL), PUP2(NSOL), PF2(NSOL), PUPD(NSOL) -! REAL(KIND=JPRB), INTENT(IN) :: PA, PALPHA, PGAMMA, PGROWTH, PW, PSMAX -! -! REAL(KIND=JPRB), INTENT(OUT) :: PINTEG1, PINTEG2 -! -! REAL(KIND=JPRB) :: ZUPART, ZUPM, ZUMAX, ZUMM, ZUPP -! -! REAL(KIND=JPRB) :: ZDELTA, ZRATIO, ZSPART2 -! -! REAL(KIND=JPRB) :: ZEPS -! -! INTEGER(KIND=JPIM) :: JMOD -! -! ! note: this subroutine is intended for inline compilation and therefore does not call dr_hook -! -! ZEPS=EPSILON(1._JPRB) -! -! ZDELTA = 1.0_JPRB - 16.0_JPRB/(9.0_JPRB*PGROWTH)*PALPHA*PW*(PA/PSMAX**2)**2 -! -! ! ZDELTA = ZSMAX**4 - 16.0_JPRB/(9.0_JPRB*ZGROWTH)*ZALPHA*ZW*ZA**2 -! IF (ZDELTA <= 0.0_JPRB) THEN -! ZRATIO = (2.0E7_JPRB/3.0_JPRB)*PA*PSMAX**(-0.3824) -! IF (ZRATIO > 1.0_JPRB) THEN -! ZRATIO = 1.0_JPRB -! END IF -! ZSPART2 = PSMAX*ZRATIO -! ELSE -! ZSPART2 = 0.5_JPRB*(1.0_JPRB + SQRT(ZDELTA)) !max root -! ZSPART2 = SQRT(ZSPART2)*PSMAX -! ENDIF -! -! !** Calculate integrals -! -! PINTEG1 = 0._JPRB -! PINTEG2 = 0._JPRB -! DO JMOD=2,NSOL -! IF (PSM(JMOD) > ZEPS) THEN -! ! FN, Eq. (20): -! ZUPART = 2.0_JPRB*LOG(PSM(JMOD)/ZSPART2)/PUPD(JMOD) -! -! ZUMAX = 2.0_JPRB*LOG(PSM(JMOD)/PSMAX)/ PUPD(JMOD) -! -! ! argument to last erfc in FN, Eq. (18) -! ZUPP = ZUPART + PUP1(JMOD) -! -! ! argument to first erf in FN, Eq. (19) -! ZUPM = ZUPART - PUP2(JMOD) -! -! ! argument to second erf in FN, Eq. (19) -! ZUMM = ZUMAX - PUP2(JMOD) -! -! ! intergral I1: FN, Eq. (18) without the factor 0.5 sqrt(G/aV) -! PINTEG1 = PINTEG1 + PN(JMOD)*PSMAX*(ERFC(ZUPART) - & -! & 0.5_JPRB*(PSM(JMOD)/PSMAX)**2*PF1(JMOD)*ERFC(ZUPP)) -! -! ! integral I2: FN, Eq. (19) without the factor A/3 -! PINTEG2 = PINTEG2 + (PF2(JMOD) * PN(JMOD)/PSM(JMOD))*(ERF(ZUPM) - ERF(ZUMM)) -! ENDIF -! ENDDO -! -! -! END SUBROUTINE SINTEGRAL - - -! SUBROUTINE AER_ACTIV_MORALES_NENES(KIDIA, KFDIA, KTDIA, KLON, KLEV, KPDF, LCLOUD, PT, PAP, PRHO, & -! & PQ, PW, PWPDF, PSO4MASS, PBCMASS, POMMASS, PSSMASS, & -! & PDUMASS,PNO3MASS, PMSAMASS, PAERONUM, PRDRY, PCDNC, KFLDX, PEXTRA) -! -! -! ! *aer_activ_morales_nenes* calculates the number of activated aerosol -! ! particles from the aerosol size-distribution, -! ! composition and ambient supersaturation -! ! -! ! Author: -! ! ------- -! ! Twan van Noije, KNMI -! ! -! ! References: -! ! ----------- -! ! Abdul-Razzak et al., JGR, 103, D6, 6123-6131, 1998 -! ! Abdul-Razzak and Ghan, JGR, 105, D5, 6837-6844, 2000 (referred to as ARG) -! ! Pruppbacher and Klett, Kluewer Ac. Pub., 1997 -! ! Ghan et al., JAMES 3, M10001, 2011 -! ! Nenes and Seinfeld, JGR, 108, D14, 4415, 2003 (referred to as NS) -! ! Fountoukis and Nenes, JGR, 110, D11212, 2005 (referred to as FN) -! ! Morales Betancourt and Nenes, GMD, 7, 2345-2357, 2014 (referred to as MN) -! ! Seinfeld and Pandis, Atmospheric Chemistry and Physics, Second Edition (referred to as SP) -! -! USE YOMCST, ONLY: R, RV, RPI, RCPD, RG, RLVTT, RMV, RMD, RTT , RLSTT -! USE YOECLDP, ONLY: RTHOMO, PPRHO_WAT -! USE YOMLUN, ONLY: NULOUT -! USE YOETHF , ONLY : R2ES ,R3LES ,R3IES ,R4LES ,& -! & R4IES ,R5LES ,R5IES ,R5ALVCP ,R5ALSCP ,& -! & RALVDCP ,RALSDCP ,RTWAT ,& -! & RTICE ,RTICECU ,& -! & RTWAT_RTICE_R ,RTWAT_RTICECU_R,& -! & RKOOP1 ,RKOOP2 -! USE YOE_AERO_M7_DATA, ONLY: NMOD, NSOL, SIGMALN, CMR2RAM, & -! & DH2SO4, DBC, DOC, DNACL, DDUST, & -! & DNA2SO4, DNH4NO3, DMSA, NH4NO3_FACTOR, & -! & PPKAPPA_H2SO4, PPKAPPA_NACL, PPKAPPA_NA2SO4, & -! & PPKAPPA_BC, PPKAPPA_OC, PPKAPPA_DU, & -! & PPKAPPA_NH4NO3, PPKAPPA_MSA, & -! & WSO4, WH2SO4, WNACL, WNA2SO4, & -! & WH2O, WDAIR -! -! IMPLICIT NONE -! -! !---included functions from header files -!#include "fcttre.h" -! -! !---subroutine interface -! INTEGER(KIND=JPIM), INTENT(IN) :: KIDIA -! INTEGER(KIND=JPIM), INTENT(IN) :: KFDIA -! INTEGER(KIND=JPIM), INTENT(IN) :: KTDIA -! INTEGER(KIND=JPIM), INTENT(IN) :: KLON -! INTEGER(KIND=JPIM), INTENT(IN) :: KLEV -! INTEGER(KIND=JPIM), INTENT(IN) :: KPDF -! INTEGER(KIND=JPIM), INTENT(IN) :: KFLDX -! -! LOGICAL, INTENT(IN) :: LCLOUD(KLON,KLEV) -! -! REAL(KIND=JPRB), INTENT(IN) :: PT(KLON,KLEV) -! REAL(KIND=JPRB), INTENT(IN) :: PAP(KLON,KLEV) -! REAL(KIND=JPRB), INTENT(IN) :: PRHO(KLON,KLEV) -! REAL(KIND=JPRB), INTENT(IN) :: PQ(KLON,KLEV) -! REAL(KIND=JPRB), INTENT(IN) :: PW(KLON,KLEV,KPDF) -! REAL(KIND=JPRB), INTENT(IN) :: PWPDF(KLON,KLEV,KPDF) -! REAL(KIND=JPRB), INTENT(IN) :: PSO4MASS(KLON,KLEV,NSOL) ! [KG(SO4)/KG(AIR)] -! REAL(KIND=JPRB), INTENT(IN) :: PBCMASS(KLON,KLEV,NSOL) ! [KG(BC)/KG(AIR)] -! REAL(KIND=JPRB), INTENT(IN) :: POMMASS(KLON,KLEV,NSOL) ! [KG(OM)/KG(AIR)] -! REAL(KIND=JPRB), INTENT(IN) :: PSSMASS(KLON,KLEV,NSOL) ! [KG(SS)/KG(AIR)] -! REAL(KIND=JPRB), INTENT(IN) :: PDUMASS(KLON,KLEV,NSOL) ! [KG(DU)/KG(AIR)] -! REAL(KIND=JPRB), INTENT(IN) :: PNO3MASS(KLON,KLEV) ! [KG(NO3)/KG(AIR)] -! REAL(KIND=JPRB), INTENT(IN) :: PMSAMASS(KLON,KLEV) ! [KG(MSA)/KG(AIR)] -! REAL(KIND=JPRB), INTENT(IN) :: PAERONUM(KLON,KLEV,NSOL) -! REAL(KIND=JPRB), INTENT(IN) :: PRDRY(KLON,KLEV,NSOL) -! REAL(KIND=JPRB), INTENT(IN) :: PEXTRA(KLON,KLEV,KFLDX) -! -! ! Output: -! REAL(KIND=JPRB), INTENT(INOUT) :: PCDNC(KLON,KLEV) -! -! !---local data -! INTEGER(KIND=JPIM) :: JL, JK, JMOD, JW -! -! REAL(KIND=JPRB) :: ZN(KLON,KLEV,NSOL) ! aerosol number concentration for each mode [m-3] -! REAL(KIND=JPRB) :: ZSM(KLON,KLEV,NSOL) ! critical supersaturation for activating particles -! ! with the mode number median radius -! REAL(KIND=JPRB) :: ZVOL(KLON) ! total dry particle volume -! REAL(KIND=JPRB) :: ZKAPPA(KLON) ! volume-weighted kappa -! REAL(KIND=JPRB) :: ZSMAX(KLON,KLEV,KPDF) ! maximum supersaturation -! REAL(KIND=JPRB) :: ZESW(KLON,KLEV) ! saturation water vapour pressure -! REAL(KIND=JPRB) :: ZDIF(KLON,KLEV) ! diffusivity -! REAL(KIND=JPRB) :: ZK(KLON,KLEV) ! thermal conductivity -! REAL(KIND=JPRB) :: ZA(KLON,KLEV) ! Kelvin coefficient -! REAL(KIND=JPRB) :: ZALPHA(KLON,KLEV) ! Intermediate term in supersaturation calulation -! REAL(KIND=JPRB) :: ZGAMMA(KLON,KLEV) ! Intermediate term in supersaturation calulation -! REAL(KIND=JPRB) :: ZGROWTH(KLON,KLEV) ! Growth coefficient -! REAL(KIND=JPRB) :: ZTERM1(KLON) ! Intermediate term in growth coefficient calulation -! REAL(KIND=JPRB) :: ZTERM2(KLON) ! Intermediate term in growth coefficient calulation -! REAL(KIND=JPRB) :: ZTERM3(KLON) ! Intermediate term in growth coefficient calulation -! -! REAL(KIND=JPRB) :: ZAMW ! molecular weight of water [kg mol-1] -! REAL(KIND=JPRB) :: ZAMD ! molecular weight of dry air [kg mol-1] -! -! REAL(KIND=JPRB) :: ZKA(KLON), ZKV(KLON) ! Intermediate terms in supersaturation calulation -! REAL(KIND=JPRB) :: ZXV(KLON), ZB(KLON) ! Intermediate terms in supersaturation calulation -! -! REAL(KIND=JPRB) :: ZDIFMOD(KLON) ! Modified diffusivity -! REAL(KIND=JPRB) :: ZNACT ! Intermediate values of the activated number concentration (#/m3) -! REAL(KIND=JPRB) :: ZNACT_WSUM(KLON,KLEV) ! Weighted sum of activated number concentration -! REAL(KIND=JPRB) :: ZPDF_NORM(KLON,KLEV) ! Normalization factor for ZNACT_WSUM -! -! REAL(KIND=JPRB) :: ZSSMASS(KLON) ! Sea salt MMR -! REAL(KIND=JPRB) :: ZDUMASS(KLON) ! Dust MMR -! REAL(KIND=JPRB) :: ZNO3MASS(KLON) ! Nitrate MMR -! REAL(KIND=JPRB) :: ZMSAMASS(KLON) ! MSA MMR -! -! REAL(KIND=JPRB) :: NSO4(KLON), NH2SO4(KLON) ! Particle numbers [kmol/kg air] -! REAL(KIND=JPRB) :: NNACL(KLON), NNA(KLON), NCL(KLON), NNA2SO4(KLON) -! -! ! Per-mode constants -! REAL(KIND=JPRB) :: ZMODECST1(NSOL), ZMODECST2(NSOL), ZMODECST3(NSOL), & -! & ZMODECST4(NSOL), ZMODECST5(NSOL) -! -! ! Intermediate values for the Morales & Nenes iterative scheme -! REAL(KIND=JPRB) :: ZCF1, ZCF2, ZCF3 -! REAL(KIND=JPRB) :: ZVALUE1 -! REAL(KIND=JPRB) :: ZVALUE2 -! REAL(KIND=JPRB) :: ZVALUE3 -! REAL(KIND=JPRB) :: ZINT1 -! REAL(KIND=JPRB) :: ZINT2 -! REAL(KIND=JPRB) :: ZSMAXTEMP1, ZSMAXTEMP2, ZSMAXTEMP3 -! -! ! Control of iterative loop: -! ! According to Ghan et al. (2011) the FN scheme -! ! takes about 30 interations to converge; -! ! so safer to increase the maximum here. -! ! xxx to be tested -! ! xxx should be enough, rarely exceeds 30 -! ! define convergence in terms of CDNC 1E-3, i.e. 0.1% -! INTEGER(KIND=JPIM), PARAMETER :: NMAXITER = 30 -! INTEGER(KIND=JPIM) :: NITERATIONS -! LOGICAL :: LCONVERGED -! -! ! Miscellaneous -! REAL(KIND=JPRB) :: ZEPS -! REAL(KIND=JPRB) :: Z4PIOVER3, ZSQRT2 -! REAL(KIND=JPHOOK) :: ZHOOK_HANDLE -! REAL(KIND=JPRB), PARAMETER :: PPEPSSEC = 1.E-25_JPRB ! used to avoid division by 0 -! -! ! mass accomodation coefficient -! ! between 0.1 and 1.0 -! ! Raatikainen et al., 2013 PNAS -! REAL(KIND=JPRB), PARAMETER :: PPALPHA_C = 1.E-1_JPRB -! -! ! Upper and lower size bounds (m) used for calculating the average water vapor diffusivity -! REAL(KIND=JPRB), PARAMETER :: DPBIG = 5.E-6_JPRB -! REAL(KIND=JPRB) :: DPLOW -! -! !--- executable procedure -! IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.AER_ACTIV_MORALES_NENES',0,ZHOOK_HANDLE) -! -! !--- 0) Initializations: -! -! ZSMAX(KIDIA:KFDIA,KTDIA:KLEV,:) = 0._JPRB -! ZSM(KIDIA:KFDIA,KTDIA:KLEV,:) = 0._JPRB -! ZNACT_WSUM(KIDIA:KFDIA,KTDIA:KLEV) = 0._JPRB -! ZPDF_NORM(KIDIA:KFDIA,KTDIA:KLEV) = 0._JPRB -! PCDNC(KIDIA:KFDIA,KTDIA:KLEV) = 0._JPRB -! -! ZEPS=EPSILON(1._JPRB) -! -! !--- Conversions to SI units [g mol-1 to kg mol-1]: -! ZAMW=WH2O*1.E-3_JPRB -! ZAMD=WDAIR*1.E-3_JPRB -! -! !---miscellaneous -! Z4PIOVER3 = 4._JPRB*RPI/3._JPRB -! ZSQRT2 = SQRT(2._JPRB) -! -! ! FN, Eq. (24) converted to m. -! DPLOW = MIN(0.207683E-6_JPRB * PPALPHA_C**(-0.33048_JPRB), DPBIG) -! -! !---grid-point calculations -! DO JK=KTDIA,KLEV -! DO JL=KIDIA,KFDIA -! IF (LCLOUD(JL,JK)) THEN -! !---Kelvin (curvature) coefficient, usually denoted by capital A. -! ! Here we use the definition of SP (introduced on p. 770), -! ! which is adopted in NS, FN, MN, -! ! and include an extra factor of 2 compared to the definition of Abdul-Razzak et al. (Eq. 5). -! ZA(JL,JK) = 4._JPRB * ZAMW * PPSURFTEN / (R * PPRHO_WAT * PT(JL,JK)) -! -! !--- Abdul-Razzak et al. (1998) (Eq. 11): -! -! ZALPHA(JL,JK) = (RG*ZAMW*RLVTT) / (RCPD*R*PT(JL,JK)*PT(JL,JK)) - & -! & (RG*ZAMD) / (R*PT(JL,JK)) -! -! ! Saturation water vapour pressure: -! ZESW(JL,JK) = FOEEWM(PT(JL,JK)) -! -! !--- Following the definitions of NS, FN and MN, -! ! gamma is defined as a dimensionless coefficient. -! ! We use Eq. (12) from Abdul-Razzak et al. (1998) and multiply it with the air density: -! ZGAMMA(JL,JK) = ( (R*PT(JL,JK)) / (ZESW(JL,JK)*ZAMW) + & -! & (ZAMW*RLVTT*RLVTT) / (RCPD*PAP(JL,JK)*ZAMD*PT(JL,JK)) ) * PRHO(JL,JK) -! -! !--- Diffusivity of water vapour in air (P&K, 13.3) [m2 s-1]: -! -! ZDIF(JL,JK)=0.211_JPRB * (PT(JL,JK)/RTT)**1.94_JPRB * (101325._JPRB/PAP(JL,JK)) *1.E-4_JPRB -! -! !--- modified diffusivity -! ! Average mode-independent value using FN, Eq. (23) -! ZB(JL) = (2._JPRB*ZDIF(JL,JK)/PPALPHA_C)*SQRT(2._JPRB*RPI*ZAMW/(R*PT(JL,JK))) -! -! !--- For any reasonable value of PPALPHA_C: DPBIG > DPLOW -! ZDIFMOD(JL) = ZDIF(JL,JK)*(1._JPRB-(ZB(JL)/(DPBIG-DPLOW))*LOG((DPBIG+ZB(JL))/(DPLOW+ZB(JL)))) -! -! !--- Thermal conductivity zk (P&K, 13.18) [cal cm-1 s-1 K-1]: -! -! ! Mole fraction of water: -! -! ZXV(JL) = PQ(JL,JK)*(ZAMD/ZAMW) -! -! ZKA(JL) = (5.69_JPRB+0.017_JPRB*(PT(JL,JK)-273.15_JPRB))*1.E-5_JPRB -! -! ZKV(JL) = (3.78_JPRB+0.020_JPRB*(PT(JL,JK)-273.15_JPRB))*1.E-5_JPRB -! -! ! Moist air, convert to [J m-1 s-1 K-1]: -! -! ZK(JL,JK) = ZKA(JL)*(1._JPRB-(1.17_JPRB-1.02_JPRB*ZKV(JL)/ZKA(JL))*ZXV(JL)) & -! & * 4.1868_JPRB*1.E2_JPRB -! -! !--- growth coefficient due to gas kinetic effects: -! !--- NS, Eq. (15) -! -! ZTERM1(JL) = (PPRHO_WAT*R*PT(JL,JK)) / (ZESW(JL,JK)*ZDIFMOD(JL)*ZAMW) -! -! !--- Note that no size dependence is introduced in the thermal conductivity -! ! See FN, p. 5 -! ZTERM2(JL) = (RLVTT*PPRHO_WAT) / (ZK(JL,JK)*PT(JL,JK)) -! -! ZTERM3(JL) = (RLVTT*ZAMW) / (R*PT(JL,JK))-1._JPRB -! -! !--- Note that the expression for G in NS (Eq. 15) has an additional factor of 4 -! ! compared to Abdul-Razzak et al. (1998), Eq. (16). -! ! FN follow the definition from NS, -! ! but have omitted the factor of 4 from their Eq. (12). This is a typo. -! ! See also SP (Eq. 17.70) MN (Eq. A3). -! ZGROWTH(JL,JK) = 4._JPRB / (ZTERM1(JL) + ZTERM2(JL) * ZTERM3(JL)) -! -! END IF -! END DO -! END DO -! -! !---per-mode calculations: -! ! soluble mode number and critical supersaturation, ignore nucleation mode (mode 1) -! DO JMOD=2, NSOL -! DO JK=KTDIA,KLEV -! DO JL=KIDIA,KFDIA -! IF (LCLOUD(JL,JK)) THEN -! -! !---total volume per mode [m-3 / kg(air)], used for kappa calculation -! ZVOL(JL) = Z4PIOVER3 * PAERONUM(JL,JK,JMOD) * & -! & (CMR2RAM(JMOD)*PRDRY(JL,JK,JMOD))**3 -! -! !--- Number per unit volume [# m-3] for each mode: -! ZN(JL,JK,JMOD) = PAERONUM(JL,JK,JMOD)*PRHO(JL,JK) -! -! !---sea salt and dust do not exist in mode 2: -! ZSSMASS(JL) = MERGE(0._JPRB, PSSMASS(JL,JK,JMOD), JMOD==2) -! ZDUMASS(JL) = MERGE(0._JPRB, PDUMASS(JL,JK,JMOD), JMOD==2) -! -! !---ammonium-nitrate and MSA do not exit in mode 2 and 4: -! ZNO3MASS(JL) = MERGE(0._JPRB, PNO3MASS(JL,JK), JMOD==2 .OR. JMOD==4) -! ZMSAMASS(JL) = MERGE(0._JPRB, PMSAMASS(JL,JK), JMOD==2 .OR. JMOD==4) -! -! NNA(JL) = ZSSMASS(JL) / WNACL -! NCL(JL) = NNA(JL) -! NSO4(JL) = PSO4MASS(JL,JK,JMOD) / WSO4 -! NNA2SO4(JL) = MIN(NNA(JL)/2._JPRB, NSO4(JL)) -! NNA(JL) = NNA(JL) - 2._JPRB*NNA2SO4(JL) -! NNACL(JL) = MIN(NCL(JL), NNA(JL)) -! NCL(JL) = NNACL(JL) -! NH2SO4(JL) = NSO4(JL) - NNA2SO4(JL) -! -! !---mode kappa = volume-weighted sum of component kappa's -! ZKAPPA(JL) = ( (PPKAPPA_NACL * NNACL(JL) * WNACL / (DNACL*1.E3_JPRB)) + & -! & (PPKAPPA_NA2SO4 * NNA2SO4(JL) * WNA2SO4 / (DNA2SO4*1.E3_JPRB)) + & -! & (PPKAPPA_H2SO4 * NH2SO4(JL) * WH2SO4 / (DH2SO4*1.E3_JPRB)) + & -! & (PPKAPPA_BC * PBCMASS(JL,JK,JMOD) / (DBC*1.E3_JPRB)) + & -! & (PPKAPPA_OC * POMMASS(JL,JK,JMOD) / (DOC*1.E3_JPRB)) + & -! & (PPKAPPA_DU * ZDUMASS(JL) / (DDUST*1.E3_JPRB)) + & -! & (PPKAPPA_NH4NO3 * ZNO3MASS(JL) * NH4NO3_FACTOR / (DNH4NO3*1.E3_JPRB)) + & -! & (PPKAPPA_MSA * ZMSAMASS(JL) / (DMSA*1.E3_JPRB)) ) / & -! & ZVOL(JL) -! -! !---defensive step: minimum kappa to avoid divide by zero errors -! ZKAPPA(JL) = MERGE(ZKAPPA(JL), 0.04_JPRB, ZKAPPA(JL) > 0.04_JPRB ) -! -! !---eqn. (2) from Ghan et al (2011) -! ! an addition factor 0.5**3 has been included in the nominator -! ! because the Kelvin coefficient used here (ZA) -! ! is twice that in Ghan et al. (ZKELV) -! ZSM(JL,JK,JMOD) = SQRT(0.5_JPRB * ZA(JL,JK)**3 / & -! & (27._JPRB * ZKAPPA(JL) * PRDRY(JL,JK,JMOD)**3) ) -! -! END IF -! END DO -! END DO -! END DO -! -! -! !--- 2) Calculate maximum supersaturation: -! -! DO JMOD=2,NSOL -! -! !---some per-mode constants -! ZMODECST1(JMOD) = 3.0_JPRB*SIGMALN(JMOD)/ZSQRT2 ! final term in FN, Eq. (18) -! ZMODECST2(JMOD) = EXP(4.5_JPRB*SIGMALN(JMOD)**2) ! factor in FN, Eq. (18) -! -! ZMODECST3(JMOD) = ZMODECST1(JMOD)/2._JPRB ! final term in FN, Eq. (19) -! ZMODECST4(JMOD) = EXP(1.125_JPRB*SIGMALN(JMOD)**2) ! factor in FN, Eq. (19) -! -! ZMODECST5(JMOD) = 3.0_JPRB*ZSQRT2*SIGMALN(JMOD) ! denominator in FN, Eqs. (8) and (20) -! -! END DO -! -! DO JW=1,KPDF -! DO JK=KTDIA, KLEV -! DO JL=KIDIA,KFDIA -! IF (LCLOUD(JL,JK)) THEN -! IF (ZALPHA(JL,JK) > ZEPS .AND. PW(JL,JK,JW) > ZEPS) THEN -! ZSMAXTEMP1 = 1.0E-5_JPRB ! min cloud supersat. -! ZSMAXTEMP2 = 0.1_JPRB ! max cloud supersat. -! LCONVERGED = .FALSE. -! NITERATIONS = 0 -! -! ZCF1 = 0.5_JPRB*SQRT(ZGROWTH(JL,JK)/(ZALPHA(JL,JK)*PW(JL,JK,JW))) -! ZCF2 = ZA(JL,JK)/3.0_JPRB -! ! When gamma is defined as a dimensionless coefficient as above, -! ! ZCF3 should include a division by the air density. -! ! See MN, Eq. 5. -! ! This is an error in NS (Eq. 32) and FN (Eq. 10). -! ! It is can be traced back to the definition of the rate of water condensation in NS, Eq. (11), -! ! where W is expressed in units kg(liquid water)/m3(air) instead of kg(liquid water)/kg(air). -! ! See also SP, Eqs. (17.73) and (17.79). -! ZCF3 = 0.5_JPRB*RPI*ZGAMMA(JL,JK)*PPRHO_WAT*ZGROWTH(JL,JK) & -! & /ZALPHA(JL,JK)/PW(JL,JK,JW)/PRHO(JL,JK) -! -! !DIR$ INLINE -! CALL SINTEGRAL_MN(ZA(JL,JK), ZALPHA(JL,JK), ZGAMMA(JL,JK), ZGROWTH(JL,JK), & -! & PW(JL,JK,JW), ZN(JL,JK,:), ZSM(JL,JK,:), ZSMAXTEMP1, & -! & ZMODECST1(:), ZMODECST2(:), ZMODECST3(:), ZMODECST4(:), & -! & ZMODECST5(:), ZINT1, ZINT2) -! ZVALUE1 = (ZINT1*ZCF1 + ZINT2*ZCF2) * ZCF3*ZSMAXTEMP1 - 1.0_JPRB -! -! !DIR$ INLINE -! CALL SINTEGRAL_MN(ZA(JL,JK), ZALPHA(JL,JK), ZGAMMA(JL,JK), ZGROWTH(JL,JK), & -! & PW(JL,JK,JW), ZN(JL,JK,:), ZSM(JL,JK,:), ZSMAXTEMP2, & -! & ZMODECST1(:), ZMODECST2(:), ZMODECST3(:), ZMODECST4(:), & -! & ZMODECST5(:), ZINT1, ZINT2) -! ZVALUE2 = (ZINT1*ZCF1 + ZINT2*ZCF2) * ZCF3*ZSMAXTEMP2 - 1.0_JPRB -! -! DO WHILE ((.NOT.LCONVERGED) .AND. NITERATIONS < NMAXITER) -! NITERATIONS = NITERATIONS + 1 -! -! ZSMAXTEMP3 = 0.5_JPRB*(ZSMAXTEMP1+ZSMAXTEMP2) -! !DIR$ INLINE -! CALL SINTEGRAL_MN(ZA(JL,JK), ZALPHA(JL,JK), ZGAMMA(JL,JK), ZGROWTH(JL,JK), & -! & PW(JL,JK,JW), ZN(JL,JK,:), ZSM(JL,JK,:), ZSMAXTEMP3, & -! & ZMODECST1(:), ZMODECST2(:), ZMODECST3(:), ZMODECST4(:), & -! & ZMODECST5(:), ZINT1, ZINT2) -! ZVALUE3 = (ZINT1*ZCF1 + ZINT2*ZCF2) * ZCF3*ZSMAXTEMP3 - 1.0_JPRB -! -! IF (SIGN(1.0_JPRB,ZVALUE1)*SIGN(1.0_JPRB,ZVALUE3) <= 0.0_JPRB) THEN -! ZVALUE2 = ZVALUE3 -! ZSMAXTEMP2 = ZSMAXTEMP3 -! ELSE -! ZVALUE1 = ZVALUE3 -! ZSMAXTEMP1 = ZSMAXTEMP3 -! END IF -! -! IF (ABS(ZSMAXTEMP2-ZSMAXTEMP1) <= 1.0E-5_JPRB*ZSMAXTEMP1) THEN -! -! ZSMAX(JL,JK,JW) = 0.5_JPRB*(ZSMAXTEMP1+ZSMAXTEMP2) -! LCONVERGED = .TRUE. -! -! ZNACT = 0._JPRB -! DO JMOD=2,NSOL -! IF (ZSM(JL,JK,JMOD) > ZEPS) THEN -! ZNACT = ZNACT + 0.5_JPRB*ZN(JL,JK,JMOD)*ERFC(2._JPRB*(LOG(ZSM(JL,JK,JMOD)/ZSMAX(JL,JK,JW)))/ZMODECST5(JMOD)) -! ENDIF -! END DO -! -! !---Sum up the total number of activated particles, weighted by the updraft PDF [m-3]: -! ZNACT_WSUM(JL,JK) = ZNACT_WSUM(JL,JK) + ZNACT*PWPDF(JL,JK,JW) -! -! ! Including the normalization here effectively means that conditions that don't yield a converged solution -! ! are discarded when calculating the mean CDNC over the updraft PDF. -! ZPDF_NORM(JL,JK) = ZPDF_NORM(JL,JK) + PWPDF(JL,JK,JW) -! -! END IF -! -! END DO ! do while -! -! IF (.NOT.LCONVERGED) THEN -! WRITE(NULOUT,*) 'WARNING: Morales and Nenes scheme not converged for updraft velocity ', PW(JL,JK,JW) -! ENDIF -! -! ELSE -! -! ! Set contribution to activation to zero when conditions are not met -! ZPDF_NORM(JL,JK) = ZPDF_NORM(JL,JK) + PWPDF(JL,JK,JW) -! -! END IF ! END IF safe wrt divide by 0, LOG(0)... -! END IF -! END DO !jl -! END DO !jk -! END DO -! -! DO JK=KTDIA,KLEV -! DO JL=KIDIA,KFDIA -! !---normalize the total number of activated particles over the PDF, and convert to [# cm-3] -! IF (LCLOUD(JL,JK) .AND. ZPDF_NORM(JL,JK) > ZEPS ) THEN -! PCDNC(JL,JK) = 1.E-6_JPRB * ZNACT_WSUM(JL,JK) / ZPDF_NORM(JL,JK) -! END IF -! END DO -! END DO -! -! IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.AER_ACTIV_MORALES_NENES',1,ZHOOK_HANDLE) -! -! END SUBROUTINE AER_ACTIV_MORALES_NENES - - -! SUBROUTINE SINTEGRAL_MN(PA, PALPHA, PGAMMA, PGROWTH, PW, PN, PSM, & -! PSMAX, PUP1, PF1, PUP2, PF2, PUPD, PINTEG1, PINTEG2) -! -! USE YOE_AERO_M7_DATA, ONLY: NSOL -! -! IMPLICIT NONE -! -! REAL(KIND=JPRB), INTENT(IN) :: PN(NSOL), PSM(NSOL) -! REAL(KIND=JPRB), INTENT(IN) :: PUP1(NSOL), PF1(NSOL), PUP2(NSOL), PF2(NSOL), PUPD(NSOL) -! REAL(KIND=JPRB), INTENT(IN) :: PA, PALPHA, PGAMMA, PGROWTH, PW, PSMAX -! REAL(KIND=JPRB), INTENT(OUT) :: PINTEG1, PINTEG2 -! -! REAL(KIND=JPRB) :: ZUPARTPLUS, ZUPARTMIN, ZUMAX -! -! REAL(KIND=JPRB) :: ZDELTA, ZRATIO, ZSPARTPLUS, ZSPARTMIN -! -! REAL(KIND=JPRB) :: XIC4, XIC4_EXP -! REAL(KIND=JPRB) :: PINTEG1_FACTOR, PINTEG1_MODE, PINTEG2_MODE -! -! REAL(KIND=JPRB) :: ZEPS -! -! ! Empirically derived exponent in MN, Eq. (14) -! REAL(KIND=JPRB), PARAMETER :: EXP_VALUE = -0.3824_JPRB -! -! INTEGER(KIND=JPIM) :: JMOD -! -! ! note: this subroutine is intended for inline compilation and therefore does not call dr_hook -! -! ZEPS=EPSILON(1._JPRB) -! -! ! xi_c to power 4 -! XIC4 = 16.0_JPRB*PALPHA*PW*(PA**2)/(9.0_JPRB*PGROWTH) -! ZDELTA = 1.0_JPRB - XIC4/PSMAX**4 -! -! IF (ZDELTA <= 0.0_JPRB) THEN -! ! MN, Eq. (14) -! XIC4_EXP = EXP_VALUE/4._JPRB -! ZRATIO = (2.0E7_JPRB/3.0_JPRB)*PA*(PSMAX**EXP_VALUE-XIC4**XIC4_EXP) + 1._JPRB/SQRT(2._JPRB) -! IF (ZRATIO > 1.0_JPRB) THEN -! ZRATIO = 1.0_JPRB -! END IF -! ZSPARTPLUS = PSMAX*ZRATIO -! ZSPARTMIN = ZSPARTPLUS -! ELSE -! ! MN, Eq. (10) -! ZSPARTPLUS = 0.5_JPRB*(1.0_JPRB + SQRT(ZDELTA)) -! ZSPARTPLUS = SQRT(ZSPARTPLUS)*PSMAX -! ZSPARTMIN = 0.5_JPRB*(1.0_JPRB - SQRT(ZDELTA)) -! ZSPARTMIN = SQRT(ZSPARTMIN)*PSMAX -! ENDIF -! -! !** Calculate integrals -! -! PINTEG1 = 0._JPRB -! PINTEG2 = 0._JPRB -! DO JMOD=2,NSOL -! IF ( PSM(JMOD) > ZEPS) THEN -! -! ! FN, Eq. (20); -! ! u_part for max root: -! ZUPARTPLUS = 2.0_JPRB*LOG(PSM(JMOD)/ZSPARTPLUS)/PUPD(JMOD) -! ! u_part for min root: -! ZUPARTMIN = 2.0_JPRB*LOG(PSM(JMOD)/ZSPARTMIN)/PUPD(JMOD) -! ! u_max: -! ZUMAX = 2.0_JPRB*LOG(PSM(JMOD)/PSMAX)/ PUPD(JMOD) -! -! ! The first integral describes the contribution from "population I" to I(0,smax), -! ! i.e. the term [I1(0,sp+) - I1(0,sp-)] in MN, Eq. (15). -! ! The integral I1 is given in FN, Eq. (18), -! ! but the factor 0.5 sqrt(G/aV) is not included here. -! IF (ZDELTA > 0.0_JPRB) THEN -! ! Contribution I1(0,sp+), -! ! i.e. the term between curly brackets in FN, Eq. (18) -! PINTEG1_FACTOR = 0.5_JPRB*(PSM(JMOD)/PSMAX)**2*PF1(JMOD) -! PINTEG1_MODE = ERFC(ZUPARTPLUS) - PINTEG1_FACTOR * ERFC(ZUPARTPLUS+PUP1(JMOD)) -! -! ! Subtract I1(0,sp1-): -! PINTEG1_MODE = PINTEG1_MODE - (ERFC(ZUPARTMIN) - PINTEG1_FACTOR * ERFC(ZUPARTMIN+PUP1(JMOD))) -! -! ! Include factor N_i * S_max from FN, Eq. (18): -! PINTEG1_MODE = PN(JMOD)*PSMAX*PINTEG1_MODE -! -! ! Add mode contribution -! PINTEG1 = PINTEG1 + PINTEG1_MODE -! ENDIF -! -! ! The second integral describes the contributions from populations II and III, -! ! i.e. the last and first terms in MN, Eq. (15). -! ! The two contributions are given by Eq. (19) of FN, -! ! but the factor A/3 is not included here. -! -! ! Contribution from population II, i.e. I2(sp+,s_max) -! PINTEG2_MODE = ERF(ZUPARTPLUS-PUP2(JMOD)) - ERF(ZUMAX-PUP2(JMOD)) -! -! ! Add contribution from population III, i.e. I2(0,sp-), -! ! which includes an additional factor 1/sqrt(3) -! PINTEG2_MODE = PINTEG2_MODE + (1._JPRB/SQRT(3._JPRB)) * ERFC(ZUPARTMIN-PUP2(JMOD)) -! -! ! Include prefactors in Eq. (19) of FN, but not the factor A/3. -! PINTEG2_MODE = PINTEG2_MODE*PF2(JMOD)*PN(JMOD)/PSM(JMOD) -! -! ! Add mode contribution -! PINTEG2 = PINTEG2 + PINTEG2_MODE -! ENDIF -! ENDDO -! -! END SUBROUTINE SINTEGRAL_MN - SUBROUTINE AER_ACTIV_MORALES_NENES_FULL(KIDIA, KFDIA, KTDIA, KLON, KLEV, LCLOUD, PT, PAP, PRHO, & & PVERVEL, PSO4MASS, PBCMASS, POMMASS, PSSMASS, & @@ -1786,28 +582,26 @@ SUBROUTINE AER_ACTIV_MORALES_NENES_FULL(KIDIA, KFDIA, KTDIA, KLON, KLEV, LCLOUD, !eehol: give sigma_w a value depending on the input variable SIGW = MAX(0.1_JPRB,PSIGMA_W(JL,JK)) ! threshold sigma to min value - IF ( ZWLARGE(JL,JK).GE.ZEPS ) THEN - ! Calculate activated droplet number - IF (CHAR_VELOCITY) THEN - ! Use characteristic updraft velocity (m/s) - ! from Morales and Nenes (2010) - WPARC = 0.79*SIGW - ! Call activation for a single velocity - ! equal to the characteristic velocity - CALL PDFACTIV (WPARC,0._JPRB,NACT,SMAX,BOX) - ELSE - ! Call activation for velocity PDF (SIGW is non-zero) - ! with WPARC set equal to the large-scale velocity (m/s) - WPARC = ZWLARGE(JL,JK) - CALL PDFACTIV (WPARC,SIGW,NACT,SMAX,BOX) - ENDIF - - ! convert CDNC to # cm-3 - PCDNC(JL,JK) = 1.E-6_JPRB * NACT - - ! convert Smax to % - PSMAX(JL,JK) = 100._JPRB * SMAX - END IF + ! Calculate activated droplet number + IF (CHAR_VELOCITY) THEN + ! Use characteristic updraft velocity (m/s) + ! from Morales and Nenes (2010) + WPARC = 0.79*SIGW + ! Call activation for a single velocity + ! equal to the characteristic velocity + CALL PDFACTIV (WPARC,0._JPRB,NACT,SMAX,BOX) + ELSE + ! Call activation for velocity PDF (SIGW is non-zero) + ! with WPARC set equal to the large-scale velocity (m/s) + WPARC = ZWLARGE(JL,JK) + CALL PDFACTIV (WPARC,SIGW,NACT,SMAX,BOX) + ENDIF + + ! convert CDNC to # cm-3 + PCDNC(JL,JK) = 1.E-6_JPRB * NACT + + ! convert Smax to % + PSMAX(JL,JK) = 100._JPRB * SMAX END IF END IF ! LCLOUD END DO !jl @@ -1817,722 +611,7 @@ SUBROUTINE AER_ACTIV_MORALES_NENES_FULL(KIDIA, KFDIA, KTDIA, KLON, KLEV, LCLOUD, END SUBROUTINE AER_ACTIV_MORALES_NENES_FULL -! SUBROUTINE AER_ACTIV_MORALES_NENES_FULL_OLDPDF(KIDIA, KFDIA, KTDIA, KLON, KLEV, KPDF, LCLOUD, PT, PAP, PRHO, & -! & PW, PWPDF, PSO4MASS, PBCMASS, POMMASS, PSSMASS, & -! & PDUMASS,PNO3MASS, PMSAMASS, PAERONUM, PRDRY, PCDNC, KFLDX, PEXTRA, PSLON, PGEMU) -! -! -! ! *aer_activ_morales_nenes_full_oldpdf* calculates the number of activated aerosol -! ! particles from the aerosol size-distribution, -! ! composition and ambient supersaturation -! ! -! ! Author: -! ! ------- -! ! Twan van Noije, KNMI -! ! Thanos Nenes, EPFL/FORTH -! ! -! ! References: -! ! ----------- -! ! Abdul-Razzak et al., JGR, 103, D6, 6123-6131, 1998 -! ! Abdul-Razzak and Ghan, JGR, 105, D5, 6837-6844, 2000 (referred to as ARG) -! ! Pruppbacher and Klett, Kluewer Ac. Pub., 1997 -! ! Ghan et al., JAMES 3, M10001, 2011 -! ! Nenes and Seinfeld, JGR, 108, D14, 4415, 2003 (referred to as NS) -! ! Fountoukis and Nenes, JGR, 110, D11212, 2005 (referred to as FN) -! ! Morales Betancourt and Nenes, GMD, 7, 2345-2357, 2014 (referred to as MN) -! ! Kumar et al., ACP, 9, 2517-2532, 2009 -! ! Seinfeld and Pandis, Atmospheric Chemistry and Physics, Second Edition (referred to as SP) -! ! Morales and Nenes, JGR, D18220, 2010 -! -! USE YOMCST, ONLY: RG, RPI -! USE YOMLUN, ONLY: NULOUT -! USE YOE_AERO_M7_DATA, ONLY: NMOD, NSOL, SIGMA, SIGMALN, CMR2RAM, & -! & DH2SO4, DBC, DOC, DNACL, DDUST, & -! & DNA2SO4, DNH4NO3, DMSA, NH4NO3_FACTOR, & -! & PPKAPPA_H2SO4, PPKAPPA_NACL, PPKAPPA_NA2SO4, & -! & PPKAPPA_BC, PPKAPPA_OC, PPKAPPA_DU, & -! & PPKAPPA_NH4NO3, PPKAPPA_MSA, & -! & WSO4, WH2SO4, WNACL, WNA2SO4, & -! & WH2O, WDAIR -! -! IMPLICIT NONE -! -! !---subroutine interface -! INTEGER(KIND=JPIM), INTENT(IN) :: KIDIA -! INTEGER(KIND=JPIM), INTENT(IN) :: KFDIA -! INTEGER(KIND=JPIM), INTENT(IN) :: KTDIA -! INTEGER(KIND=JPIM), INTENT(IN) :: KLON -! INTEGER(KIND=JPIM), INTENT(IN) :: KLEV -! INTEGER(KIND=JPIM), INTENT(IN) :: KPDF -! INTEGER(KIND=JPIM), INTENT(IN) :: KFLDX -! -! LOGICAL, INTENT(IN) :: LCLOUD(KLON,KLEV) -! -! REAL(KIND=JPRB), INTENT(IN) :: PT(KLON,KLEV) -! REAL(KIND=JPRB), INTENT(IN) :: PAP(KLON,KLEV) -! REAL(KIND=JPRB), INTENT(IN) :: PRHO(KLON,KLEV) -! REAL(KIND=JPRB), INTENT(IN) :: PW(KLON,KLEV,KPDF) -! REAL(KIND=JPRB), INTENT(IN) :: PWPDF(KLON,KLEV,KPDF) -! REAL(KIND=JPRB), INTENT(IN) :: PSO4MASS(KLON,KLEV,NSOL) ! [KG(SO4)/KG(AIR)] -! REAL(KIND=JPRB), INTENT(IN) :: PBCMASS(KLON,KLEV,NSOL) ! [KG(BC)/KG(AIR)] -! REAL(KIND=JPRB), INTENT(IN) :: POMMASS(KLON,KLEV,NSOL) ! [KG(OM)/KG(AIR)] -! REAL(KIND=JPRB), INTENT(IN) :: PSSMASS(KLON,KLEV,NSOL) ! [KG(SS)/KG(AIR)] -! REAL(KIND=JPRB), INTENT(IN) :: PDUMASS(KLON,KLEV,NSOL) ! [KG(DU)/KG(AIR)] -! REAL(KIND=JPRB), INTENT(IN) :: PNO3MASS(KLON,KLEV) ! [KG(NO3)/KG(AIR)] -! REAL(KIND=JPRB), INTENT(IN) :: PMSAMASS(KLON,KLEV) ! [KG(MSA)/KG(AIR)] -! REAL(KIND=JPRB), INTENT(IN) :: PAERONUM(KLON,KLEV,NSOL) -! REAL(KIND=JPRB), INTENT(IN) :: PRDRY(KLON,KLEV,NSOL) -! REAL(KIND=JPRB), INTENT(IN) :: PEXTRA(KLON,KLEV,KFLDX) -! REAL(KIND=JPRB), INTENT(IN) :: PSLON(KLON), PGEMU(KLON) -! -! ! Output: -! REAL(KIND=JPRB), INTENT(OUT) :: PCDNC(KLON,KLEV) ! # cm-3 -! !REAL(KIND=JPRB), INTENT(OUT) :: PSMAX(KLON,KLEV) ! maximum supersaturation in % -! -! !---local data -! INTEGER(KIND=JPIM) :: JL, JK, JMOD, JW -! -! REAL(KIND=JPRB) :: ZN(KLON,KLEV,NSOL) ! aerosol number concentration for each mode [m-3] -! ! with the mode number median radius -! REAL(KIND=JPRB) :: ZVOL(KLON) ! total dry particle volume -! REAL(KIND=JPRB) :: ZKAPPA(KLON,KLEV,NSOL) ! volume-weighted kappa -! REAL(KIND=JPRB) :: ZWLARGE(KLON,KLEV) ! large-scale velocity (m/s) -! REAL(KIND=JPRB) :: PSMAX(KLON,KLEV) ! maximum supersaturation in % -! -! REAL(KIND=JPRB) :: ZNACT_WSUM(KLON,KLEV) ! Weighted sum of activated number concentration -! REAL(KIND=JPRB) :: ZSMAX_WSUM(KLON,KLEV) ! Weighted sum of Smax -! REAL(KIND=JPRB) :: ZPDF_NORM(KLON,KLEV) ! Normalization factor for ZNACT_WSUM -! -! REAL(KIND=JPRB) :: ZSSMASS(KLON) ! Sea salt MMR -! REAL(KIND=JPRB) :: ZDUMASS(KLON) ! Dust MMR -! REAL(KIND=JPRB) :: ZNO3MASS(KLON) ! Nitrate MMR -! REAL(KIND=JPRB) :: ZMSAMASS(KLON) ! MSA MMR -! -! REAL(KIND=JPRB) :: NSO4(KLON), NH2SO4(KLON) ! Particle numbers [kmol/kg air] -! REAL(KIND=JPRB) :: NNACL(KLON), NNA(KLON), NCL(KLON), NNA2SO4(KLON) -! -! ! Miscellaneous -! REAL(KIND=JPRB) :: ZEPS -! REAL(KIND=JPRB) :: Z4PIOVER3 -! REAL(KIND=JPHOOK) :: ZHOOK_HANDLE -! -! ! Variables to interface with Nenes routines -! REAL(KIND=JPRB) :: TPI(NSOL-1), DPGI(NSOL-1), SIGI(NSOL-1), AKKI(NSOL-1) -! REAL(KIND=JPRB) :: TPARC, PPARC, WPARC, SG(NSOL-1), NACT, SMAX -! -! REAL(KIND=JPRB), PARAMETER :: A = 2.25_JPRB ! Default FHH adsorption parameters (in the case of FHH-AT) -! REAL(KIND=JPRB), PARAMETER :: B = 1.20_JPRB ! See Kumar et al., (2011) ACP -! REAL(KIND=JPRB), PARAMETER :: ACCOM = 1.0_JPRB ! Accommodation coefficient -! -! INTEGER(KIND=JPIM) :: MODEI(NSOL-1) -! -! !--- executable procedure -! IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.AER_ACTIV_MORALES_NENES_FULL_OLDPDF',0,ZHOOK_HANDLE) -! -! !--- 0) Initializations: -! -! ZNACT_WSUM(KIDIA:KFDIA,KTDIA:KLEV) = 0._JPRB -! ZSMAX_WSUM(KIDIA:KFDIA,KTDIA:KLEV) = 0._JPRB -! ZPDF_NORM(KIDIA:KFDIA,KTDIA:KLEV) = 0._JPRB -! PCDNC(KIDIA:KFDIA,KTDIA:KLEV) = 0._JPRB -! PSMAX(KIDIA:KFDIA,KTDIA:KLEV) = 0._JPRB -! -! ZEPS=EPSILON(1._JPRB) -! -! !---miscellaneous -! Z4PIOVER3 = 4._JPRB*RPI/3._JPRB -! -! !---per-mode calculations: -! ! soluble mode number and critical supersaturation, ignore nucleation mode (mode 1) -! DO JMOD=2, NSOL -! DO JK=KTDIA,KLEV -! DO JL=KIDIA,KFDIA -! IF (LCLOUD(JL,JK)) THEN -! -! !---total volume per mode [m-3 / kg(air)], used for kappa calculation -! ZVOL(JL) = Z4PIOVER3 * PAERONUM(JL,JK,JMOD) * & -! & (CMR2RAM(JMOD)*PRDRY(JL,JK,JMOD))**3 -! -! !--- Number per unit volume [# m-3] for each mode: -! ZN(JL,JK,JMOD) = PAERONUM(JL,JK,JMOD)*PRHO(JL,JK) -! -! !---sea salt and dust do not exist in mode 2: -! ZSSMASS(JL) = MERGE(0._JPRB, PSSMASS(JL,JK,JMOD), JMOD==2) -! ZDUMASS(JL) = MERGE(0._JPRB, PDUMASS(JL,JK,JMOD), JMOD==2) -! -! !---ammonium-nitrate and MSA do not exit in mode 2 and 4: -! ZNO3MASS(JL) = MERGE(0._JPRB, PNO3MASS(JL,JK), JMOD==2 .OR. JMOD==4) -! ZMSAMASS(JL) = MERGE(0._JPRB, PMSAMASS(JL,JK), JMOD==2 .OR. JMOD==4) -! -! NNA(JL) = ZSSMASS(JL) / WNACL -! NCL(JL) = NNA(JL) -! NSO4(JL) = PSO4MASS(JL,JK,JMOD) / WSO4 -! NNA2SO4(JL) = MIN(NNA(JL)/2._JPRB, NSO4(JL)) -! NNA(JL) = NNA(JL) - 2._JPRB*NNA2SO4(JL) -! NNACL(JL) = MIN(NCL(JL), NNA(JL)) -! NCL(JL) = NNACL(JL) -! NH2SO4(JL) = NSO4(JL) - NNA2SO4(JL) -! -! !---mode kappa = volume-weighted sum of component kappa's -! ZKAPPA(JL,JK,JMOD) = ( (PPKAPPA_NACL * NNACL(JL) * WNACL / (DNACL*1.E3_JPRB)) + & -! & (PPKAPPA_NA2SO4 * NNA2SO4(JL) * WNA2SO4 / (DNA2SO4*1.E3_JPRB)) + & -! & (PPKAPPA_H2SO4 * NH2SO4(JL) * WH2SO4 / (DH2SO4*1.E3_JPRB)) + & -! & (PPKAPPA_BC * PBCMASS(JL,JK,JMOD) / (DBC*1.E3_JPRB)) + & -! & (PPKAPPA_OC * POMMASS(JL,JK,JMOD) / (DOC*1.E3_JPRB)) + & -! & (PPKAPPA_DU * ZDUMASS(JL) / (DDUST*1.E3_JPRB)) + & -! & (PPKAPPA_NH4NO3 * ZNO3MASS(JL) * NH4NO3_FACTOR / (DNH4NO3*1.E3_JPRB)) + & -! & (PPKAPPA_MSA * ZMSAMASS(JL) / (DMSA*1.E3_JPRB)) ) / & -! & ZVOL(JL) -! -! !---defensive step: minimum kappa to avoid divide by zero errors -! ZKAPPA(JL,JK,JMOD) = MERGE(ZKAPPA(JL,JK,JMOD), 0.04_JPRB, ZKAPPA(JL,JK,JMOD) > 0.04_JPRB ) -! -! END IF -! END DO -! END DO -! END DO -! -! !--- 2) Calculate maximum supersaturation and cloud droplet number concentration, -! ! averaged over the updraft velocity PDF -! -! DO JW=1,KPDF -! DO JK=KTDIA, KLEV -! DO JL=KIDIA,KFDIA -! IF (LCLOUD(JL,JK)) THEN -! -! DO JMOD=2,NSOL -! !Shift mode index -! MODEI(JMOD-1) = 1 ! Kohler mode -! TPI(JMOD-1) = PAERONUM(JL,JK,JMOD) * PRHO(JL,JK) ! Number concentration (#/m3) -! DPGI(JMOD-1) = 2._JPRB * PRDRY(JL,JK,JMOD) ! Modal diameter (m) -! SIGI(JMOD-1) = SIGMA(JMOD) ! Geometric dispersion (sigma_g) -! AKKI(JMOD-1) = ZKAPPA(JL,JK,JMOD) ! Hygroscopicity parameter (kappa) -! END DO -! TPARC = PT(JL,JK) ! Temperature (K) -! PPARC = PAP(JL,JK) ! Pressure (Pa) -! -! ! Convert aerosol data into CCN -! CALL CCNSPEC (TPI,DPGI,SIGI,MODEI,TPARC,PPARC,NSOL-1,AKKI,A,B,SG) -! -! ! xxx To be done: -! ! Save CCN spectra for supersaturations: -! ! S = 0.05, 0.1, 0.2, 0.3, 0.5, 1.0 % -! ! New routine needs as input TPI, SG, S and returns CCN(S) -! ! which needs to be put into the output as 6 3-D fields -! -! ! Set WPARC to the updraft vertical velocity (m/s) -! WPARC = PW(JL,JK,JW) -! ! Call activation for a single velocity value: -! CALL PDFACTIV (WPARC,TPI,AKKI,A,B,ACCOM,SG,0.d0,TPARC,PPARC, NACT, SMAX) -! -! !IF(JW==5 .AND. PSLON(JL)>0.17 .AND. PSLON(JL)<0.19 .AND. PGEMU(JL)>0.76 .AND. PGEMU(JL)<0.78) THEN -! ! open(unit=666, file='parame', access='append', status='unknown') -! ! write(666,*) modei, tpi, dpgi, sigi, akki, tparc, pparc, wparc, accom, sigw, sg, nact, smax -! ! close(666) -! !ENDIF -! -! !IF(JW==5 .AND. PSLON(JL)>-0.35 .AND. PSLON(JL)<-0.33 .AND. PGEMU(JL)>0.76 .AND. PGEMU(JL)<0.78) THEN -! ! open(unit=666, file='paramp', access='append', status='unknown') -! ! write(666,*) modei, tpi, dpgi, sigi, akki, tparc, pparc, wparc, accom, sigw, sg, nact, smax -! ! close(666) -! !ENDIF -! -! !---Sum up the total number of activated particles, weighted by the updraft PDF [m-3]: -! ZNACT_WSUM(JL,JK) = ZNACT_WSUM(JL,JK) + NACT*PWPDF(JL,JK,JW) -! ZSMAX_WSUM(JL,JK) = ZSMAX_WSUM(JL,JK) + SMAX*PWPDF(JL,JK,JW) -! -! ZPDF_NORM(JL,JK) = ZPDF_NORM(JL,JK) + PWPDF(JL,JK,JW) -! -! END IF ! LCLOUD -! END DO !jl -! END DO !jk -! END DO ! PDF -! -! DO JK=KTDIA,KLEV -! DO JL=KIDIA,KFDIA -! !---normalize over the PDF -! IF (LCLOUD(JL,JK) .AND. ZPDF_NORM(JL,JK) > ZEPS ) THEN -! ! convert CDNC to # cm-3 -! PCDNC(JL,JK) = 1.E-6_JPRB * ZNACT_WSUM(JL,JK) / ZPDF_NORM(JL,JK) -! -! ! convert Smax to % -! PSMAX(JL,JK) = 100._JPRB * ZSMAX_WSUM(JL,JK) / ZPDF_NORM(JL,JK) -! END IF -! END DO -! END DO -! -! IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.AER_ACTIV_MORALES_NENES_FULL_OLDPDF',1,ZHOOK_HANDLE) -! -! END SUBROUTINE AER_ACTIV_MORALES_NENES_FULL_OLDPDF - - -! SUBROUTINE AER_ACTIV_ABDULRAZZAK_GHAN (KIDIA, KFDIA, KTDIA, KLON, KLEV, KPDF, LCLOUD, PT, PAP, PRHO, & -! & PQ, PW, PWPDF, PSO4MASS, PBCMASS, POMMASS, PSSMASS, & -! & PDUMASS, PNO3MASS, PMSAMASS, PAERONUM, PRDRY, PCDNC, KFLDX, PEXTRA) -! -! -! ! *aer_activ_abdulrazzak_ghan* calculates the number of activated aerosol -! ! particles from the aerosol size-distribution, -! ! composition and ambient supersaturation -! ! -! ! Author: -! ! ------- -! ! Philip Stier, MPI-MET, University of Oxford 2002-2009 -! ! -! ! Method: -! ! ------- -! ! The calculation of the activation can be reduced to 3 tasks: -! ! -! ! I) Calculate the maximum supersaturation -! ! II) Calculate the corresponding radius of activation -! ! for each mode -! ! III) Calculate the number of particles that are larger -! ! then the radius of activation for each mode. -! ! -! ! III) Calculation of the number of activated particles: -! ! See the routine ham_logtail below. -! ! -! ! The calculations are now performed separately for -! ! stratiform and convective updraft velocities. -! ! -! ! References: -! ! ----------- -! ! Abdul-Razzak et al., JGR, 103, D6, 6123-6131, 1998. -! ! Abdul-Razzak and Ghan, JGR, 105, D5, 6837-6844, 2000. -! ! Pruppbacher and Klett, Kluewer Ac. Pub., 1997. -! ! Ghan et al., JAMES 3, M10001, 2011 -! -! !---inherited functions, types, variables and constants -! USE YOMCST, ONLY: RPI, R, RCPD, RG, RMD, RV, RTT, RLVTT, RLSTT, RMD, RMV -! USE YOECLDP, ONLY: RTHOMO, PPRHO_WAT, LACI_DIAG -! USE YOE_AERO_M7_DATA, ONLY: NSOL, SIGMALN, CMR2RAM, & -! & PPKAPPA_H2SO4, PPKAPPA_NACL, PPKAPPA_NA2SO4, & -! & PPKAPPA_BC, PPKAPPA_OC, PPKAPPA_DU, & -! & PPKAPPA_NH4NO3, PPKAPPA_MSA, & -! & DH2SO4, DNACL, DNA2SO4, & -! & DBC, DOC, DDUST, & -! & DNH4NO3, DMSA, NH4NO3_FACTOR, & -! & WSO4, WH2SO4, WNACL, WNA2SO4 -! USE YOETHF , ONLY : R2ES ,R3LES ,R3IES ,R4LES ,& -! & R4IES ,R5LES ,R5IES ,R5ALVCP ,R5ALSCP ,& -! & RALVDCP ,RALSDCP ,RTWAT ,& -! & RTICE ,RTICECU ,& -! & RTWAT_RTICE_R ,RTWAT_RTICECU_R,& -! & RKOOP1 ,RKOOP2 -! -! IMPLICIT NONE -! -! !---included functions from header files -!#include "fcttre.h" -! -! !---subroutine interface -! INTEGER(KIND=JPIM), INTENT(IN) :: KIDIA -! INTEGER(KIND=JPIM), INTENT(IN) :: KFDIA -! INTEGER(KIND=JPIM), INTENT(IN) :: KTDIA -! INTEGER(KIND=JPIM), INTENT(IN) :: KLON -! INTEGER(KIND=JPIM), INTENT(IN) :: KLEV -! INTEGER(KIND=JPIM), INTENT(IN) :: KPDF -! INTEGER(KIND=JPIM), INTENT(IN) :: KFLDX -! -! LOGICAL, INTENT(IN) :: LCLOUD(KLON,KLEV) -! -! REAL(KIND=JPRB), INTENT(IN) :: PT(KLON,KLEV) -! REAL(KIND=JPRB), INTENT(IN) :: PAP(KLON,KLEV) -! REAL(KIND=JPRB), INTENT(IN) :: PRHO(KLON,KLEV) -! REAL(KIND=JPRB), INTENT(IN) :: PQ(KLON,KLEV) -! REAL(KIND=JPRB), INTENT(IN) :: PW(KLON,KLEV,KPDF) -! REAL(KIND=JPRB), INTENT(IN) :: PWPDF(KLON,KLEV,KPDF) -! REAL(KIND=JPRB), INTENT(IN) :: PSO4MASS(KLON,KLEV,NSOL) ! [KG(SO4)/KG(AIR)] -! REAL(KIND=JPRB), INTENT(IN) :: PBCMASS(KLON,KLEV,NSOL) ! [KG(BC)/KG(AIR)] -! REAL(KIND=JPRB), INTENT(IN) :: POMMASS(KLON,KLEV,NSOL) ! [KG(OM)/KG(AIR)] -! REAL(KIND=JPRB), INTENT(IN) :: PSSMASS(KLON,KLEV,NSOL) ! [KG(SS)/KG(AIR)] -! REAL(KIND=JPRB), INTENT(IN) :: PDUMASS(KLON,KLEV,NSOL) ! [KG(DU)/KG(AIR)] -! REAL(KIND=JPRB), INTENT(IN) :: PNO3MASS(KLON,KLEV) ! [KG(NO3)/KG(AIR)] -! REAL(KIND=JPRB), INTENT(IN) :: PMSAMASS(KLON,KLEV) ! [KG(MSA)/KG(AIR)] -! REAL(KIND=JPRB), INTENT(IN) :: PAERONUM(KLON,KLEV,NSOL) -! REAL(KIND=JPRB), INTENT(IN) :: PRDRY(KLON,KLEV,NSOL) -! -! ! Output: -! REAL(KIND=JPRB), INTENT(INOUT) :: PCDNC(KLON,KLEV) -! REAL(KIND=JPRB), INTENT(INOUT) :: PEXTRA(KLON,KLEV,KFLDX) -! -! !---local data -! INTEGER(KIND=JPIM) :: JL, JK, JMOD, JW -! -! REAL(KIND=JPRB) :: ZRC ! critical radius of a dry aerosol particle that becomes -! ! activated at the ambient supersaturation -! REAL(KIND=JPRB) :: ZN(KLON,KLEV,NSOL) ! aerosol number concentration for each mode [m-3] -! REAL(KIND=JPRB) :: ZSM(KLON,KLEV,NSOL) ! critical supersaturation for activating particles -! ! with the mode number median radius -! REAL(KIND=JPRB) :: ZVOL(KLON ) ! total dry particle volume per mode -! REAL(KIND=JPRB) :: ZKAPPA(KLON) ! volume-weighted kappa per mode -! REAL(KIND=JPRB) :: ZSMAX(KLON,KLEV,KPDF) ! maximum supersaturation -! -! REAL(KIND=JPRB) :: ZKELV(KLON,KLEV) ! Kelvin term -! REAL(KIND=JPRB) :: ZESW(KLON,KLEV) ! saturation vapour pressure -! REAL(KIND=JPRB) :: ZDIF(KLON,KLEV) ! diffusivity of air -! REAL(KIND=JPRB) :: ZALPHA(KLON,KLEV) ! Intermediate term in supersaturation calulation -! REAL(KIND=JPRB) :: ZGAMMA(KLON,KLEV) ! Intermediate term in supersaturation calulation -! REAL(KIND=JPRB) :: ZSUM(KLON,KLEV,KPDF) ! Intermediate term in supersaturation calulation -! REAL(KIND=JPRB) :: ZGROWTH(KLON,KLEV,NSOL) ! Growth due to vapour condensation -! REAL(KIND=JPRB) :: ZFRACN_TOP(KLON,KLEV,NSOL) -! REAL(KIND=JPRB) :: ZFRACN_BOT(KLON,KLEV,NSOL) -! -! REAL(KIND=JPRB) :: ZAMW ! molecular weight of water [kg mol-1] -! REAL(KIND=JPRB) :: ZAMD ! molecular weight of dry air [kg mol-1] -! -! REAL(KIND=JPRB) :: ZFRACN ! fraction of aerosol number activated for each mode -! REAL(KIND=JPRB) :: ZF(NSOL), ZG(NSOL) ! aerosol mode attributes, see AR&G -! REAL(KIND=JPRB) :: ZKA(KLON), ZKV(KLON) ! thermal conductivity of dry air/water vapour -! REAL(KIND=JPRB) :: ZK(KLON,KLEV) ! thermal conductivity of moist air -! REAL(KIND=JPRB) :: ZSQTERM(KLON) ! Intermediate terms in supersaturation calulation -! REAL(KIND=JPRB) :: ZXV, ZXI, ZETA ! Intermediate terms in supersaturation calulation -! REAL(KIND=JPRB) :: ZDIFMOD(KLON) ! Modified diffusion coefficient -! REAL(KIND=JPRB) :: ZKMOD(KLON) ! Intermediate terms in supersaturation calulation -! REAL(KIND=JPRB) :: ZT ! Intermediate term in activation calulation -! REAL(KIND=JPRB) :: ZTERM1(KLON) ! Intermediate term in activation calulation -! REAL(KIND=JPRB) :: ZTERM2(KLON) ! Intermediate term in activation calulation -! REAL(KIND=JPRB) :: ZTERM3(KLON) ! Intermediate term in activation calulation -! REAL(KIND=JPRB) :: ZSSMASS(KLON) ! Sea salt MMR -! REAL(KIND=JPRB) :: ZDUMASS (KLON) ! Dust MMR -! REAL(KIND=JPRB) :: ZNO3MASS(KLON) ! Nitrate MMR -! REAL(KIND=JPRB) :: ZMSAMASS(KLON) ! MSA MMR -! -! REAL(KIND=JPRB) :: NSO4(KLON), NH2SO4(KLON)! Particle numbers [kmol/kg air] -! REAL(KIND=JPRB) :: NNACL(KLON), NNA(KLON), NCL(KLON), NNA2SO4(KLON) -! -! REAL(KIND=JPRB) :: ZEPS -! REAL(KIND=JPRB) :: Z4PIOVER3, ZSQRT2 -! REAL(KIND=JPRB), PARAMETER :: PPEPSSEC = 1.E-25_JPRB ! used to avoid division by 0 -! -! ! the following constants from Abdul-Razzak et al. 1998 Ch. 3: -! ! thermal jump length [m] -! REAL(KIND=JPRB), PARAMETER :: PPDELTA_T = 2.16E-7_JPRB -! -! ! vapour jump length [m] -! REAL(KIND=JPRB), PARAMETER :: PPDELTA_V = 1.096E-7_JPRB -! -! ! mass accomodation coefficient -! REAL(KIND=JPRB), PARAMETER :: PPALPHA_C = 1.0_JPRB -! -! ! thermal accomodation coefficient -! REAL(KIND=JPRB), PARAMETER :: PPALPHA_T = 0.96_JPRB -! -! REAL(KIND=JPHOOK) :: ZHOOK_HANDLE -! -! !---executable procedure -! IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.AER_ACTIV_ABDULRAZZAK_GHAN', 0, ZHOOK_HANDLE) -! -! !---Initializations: -! -! ZSUM(KIDIA:KFDIA,KTDIA:KLEV,:)= 0._JPRB -! ZSMAX(KIDIA:KFDIA,KTDIA:KLEV,:)= 0._JPRB -! ZSM(KIDIA:KFDIA,KTDIA:KLEV,:) = 0._JPRB -! ZFRACN_TOP(KIDIA:KFDIA,KTDIA:KLEV,:) = 0._JPRB -! ZFRACN_BOT(KIDIA:KFDIA,KTDIA:KLEV,:) = 0._JPRB -! PCDNC(KIDIA:KFDIA,KTDIA:KLEV) = 0._JPRB -! -! !--- Conversions to SI units [g mol-1 to kg mol-1]: -! ZAMW=RMV*1.E-3_JPRB -! ZAMD=RMD*1.E-3_JPRB -! -! !---miscellaneous -! Z4PIOVER3 = 4._JPRB*RPI/3._JPRB -! ZEPS=EPSILON(1._JPRB) -! ZSQRT2 = SQRT(2._JPRB) -! -! ! Abdul-Razzak and Ghan (2000): -! ! (Equations numbers from this paper unless otherwise quoted) -! -! DO JK=KTDIA,KLEV -! DO JL=KIDIA,KFDIA -! -! IF (LCLOUD(JL,JK)) THEN -! !---Kelvin (curvature) term (equation (5) in Abdul-Razzak et al. 1998) -! ! also (A1) in Ghan et al. 2011 -! ZKELV(JL,JK) = 2._JPRB * ZAMW * PPSURFTEN / (R * PPRHO_WAT * PT(JL,JK)) -! -! !--- Abdul-Razzak et al. (1998) (Eq. 11): -! ZALPHA(JL,JK) = (RG*ZAMW*RLVTT) / (RCPD*R*PT(JL,JK)**2) - & -! & (RG*ZAMD) / (R*PT(JL,JK)) -! -! ! Saturation water vapour pressure: -! ZESW(JL,JK) = FOEEWM(PT(JL,JK)) -! -! !--- Abdul-Razzak et al. (1998) (Eq. 12): -! ZGAMMA(JL,JK) = (R*PT(JL,JK)) / (ZESW(JL,JK)*ZAMW) + & -! & (ZAMW*RLVTT**2) / (RCPD*PAP(JL,JK)*ZAMD*PT(JL,JK)) -! -! !--- Diffusivity of water vapour in air (P&K, 13.3) [m2 s-1]: -! -! ZDIF(JL,JK)=0.211_JPRB * (PT(JL,JK)/RTT)**1.94_JPRB * (101325._JPRB/PAP(JL,JK)) *1.E-4_JPRB -! -! !--- Thermal conductivity zk (P&K, 13.18) [cal cm-1 s-1 K-1]: -! -! ! Mole fraction of water: -! -! ZKA(JL)=(5.69_JPRB+0.017_JPRB*(PT(JL,JK)-273.15_JPRB))*1.E-5_JPRB -! -! ZKV(JL)=(3.78_JPRB+0.020_JPRB*(PT(JL,JK)-273.15_JPRB))*1.E-5_JPRB -! -! ! Moist air, convert to [J m-1 s-1 K-1]: -! -! ZK(JL,JK) = ZKA(JL)*(1._JPRB-(1.17_JPRB-1.02_JPRB*ZKV(JL)/ZKA(JL))*PQ(JL,JK)*(ZAMD/ZAMW)) & -! & * 4.1868_JPRB*1.E2_JPRB -! END IF -! -! END DO -! END DO -! -! DO JMOD=2,NSOL -! ! (7): -! -! ZF(JMOD)=0.5_JPRB*EXP(2.5_JPRB*SIGMALN(JMOD)**2) -! -! ! (8): -! -! ZG(JMOD)=1._JPRB+0.25_JPRB*SIGMALN(JMOD) -! -! ! (9): -! !>>dod kappa -! ! replaced by eqn. (2) from Ghan et al (2011) -! DO JK=KTDIA,KLEV -! DO JL=KIDIA,KFDIA -! -! IF (LCLOUD(JL,JK)) THEN -! !---total volume per mode [m-3 / kg(air)], used for kappa calculation -! ZVOL(JL) = Z4PIOVER3 * PAERONUM(JL,JK,JMOD) * & -! (CMR2RAM(JMOD)*PRDRY(JL,JK,JMOD))**3 -! -! !--- Number per unit volume [# m-3] for each mode: -! ZN(JL,JK,JMOD) = PAERONUM(JL,JK,JMOD)*PRHO(JL,JK) -! -! !---sea salt and dust do not exist in mode 2: -! ZSSMASS(JL) = MERGE(0._JPRB, PSSMASS(JL,JK,JMOD), JMOD==2) -! ZDUMASS(JL) = MERGE(0._JPRB, PDUMASS(JL,JK,JMOD), JMOD==2) -! !---ammonium-nitrate and MSA do not exit in mode 2 and 4: -! ZNO3MASS(JL) = MERGE(0._JPRB, PNO3MASS(JL,JK), JMOD==2 .OR. JMOD==4) -! ZMSAMASS(JL) = MERGE(0._JPRB, PMSAMASS(JL,JK), JMOD==2 .OR. JMOD==4) -! -! NNA(JL) = ZSSMASS(JL) / WNACL -! NCL(JL) = NNA(JL) -! NSO4(JL) = PSO4MASS(JL,JK,JMOD) / WSO4 -! NNA2SO4(JL) = MIN(NNA(JL)/2._JPRB, NSO4(JL)) -! NNA(JL) = NNA(JL) - 2._JPRB*NNA2SO4(JL) -! NNACL(JL) = MIN(NCL(JL), NNA(JL)) -! NCL(JL) = NNACL(JL) -! NH2SO4(JL) = NSO4(JL) - NNA2SO4(JL) -! -! !---mode kappa = volume-weighted sum of component kappa's -! ZKAPPA(JL) = ( (PPKAPPA_NACL * NNACL(JL) * WNACL / (DNACL*1.E3_JPRB)) + & -! & (PPKAPPA_NA2SO4 * NNA2SO4(JL) * WNA2SO4 / (DNA2SO4*1.E3_JPRB)) + & -! & (PPKAPPA_H2SO4 * NH2SO4(JL) * WH2SO4 / (DH2SO4*1.E3_JPRB)) + & -! & (PPKAPPA_BC * PBCMASS(JL,JK,JMOD) / (DBC*1.E3_JPRB)) + & -! & (PPKAPPA_OC * POMMASS(JL,JK,JMOD) / (DOC*1.E3_JPRB)) + & -! & (PPKAPPA_DU * ZDUMASS(JL) / (DDUST*1.E3_JPRB)) + & -! & (PPKAPPA_NH4NO3 * ZNO3MASS(JL) * NH4NO3_FACTOR / (DNH4NO3*1.E3_JPRB)) + & -! & (PPKAPPA_MSA * ZMSAMASS(JL) / (DMSA*1.E3_JPRB)) ) / & -! & ZVOL(JL) -! -! !---defensive step: minimum kappa to avoid divide by zero errors -! ZKAPPA(JL) = MERGE(ZKAPPA(JL), 0.04_JPRB, ZKAPPA(JL) > 0.04_JPRB ) -! -! ZSM(JL,JK,JMOD) = SQRT(4._JPRB*ZKELV(JL,JK)**3 / & -! & (27._JPRB * ZKAPPA(JL) * PRDRY(JL,JK,JMOD)**3) ) -! -! !--- modified diffusivity and thermal conductivity -! ZSQTERM(JL) = SQRT(2._JPRB*RPI*ZAMW/(R*PT(JL,JK))) -! -! !--- Abdul-Razzak et al. (1998) (Eq. 17): -! ZDIFMOD(JL) = ZDIF(JL,JK) / & -! & ( (PRDRY(JL,JK,JMOD)/(PRDRY(JL,JK,JMOD)+PPDELTA_V)) + & -! & (ZDIF(JL,JK)/(PRDRY(JL,JK,JMOD)*PPALPHA_C)) * ZSQTERM(JL) ) -! -! !--- Abdul-Razzak et al. (1998) (Eq. 18): -! ZKMOD(JL) = ZK(JL,JK) / & -! & ( (PRDRY(JL,JK,JMOD)/(PRDRY(JL,JK,JMOD)+PPDELTA_T)) + & -! & (ZK(JL,JK)/(PRDRY(JL,JK,JMOD)*PPALPHA_T*RCPD)) * ZSQTERM(JL) ) -! -! !--- growth coefficient due to gas kinetic effects: -! -! !--- Abdul-Razzak et al. (1998) (Eq. 16): -! ZTERM1(JL) = (PPRHO_WAT*R*PT(JL,JK)) / (ZESW(JL,JK)*ZDIFMOD(JL)*ZAMW) -! -! ZTERM2(JL) = (RLVTT*PPRHO_WAT) / (ZKMOD(JL)*PT(JL,JK)) -! -! ZTERM3(JL) = (RLVTT*ZAMW) / (R*PT(JL,JK))-1._JPRB -! -! ZGROWTH(JL,JK,JMOD) = 1._JPRB / & -! & (ZTERM1(JL) + ZTERM2(JL) * ZTERM3(JL)) -! END IF -! END DO -! END DO -! -! END DO -! !< ZEPS .AND. & -! & PRDRY(JL,JK,JMOD)>1.E-9_JPRB .AND. & -! & LCLOUD(JL,JK) .AND. PW(JL,JK,JW) > ZEPS) THEN -! -! ! (10): -! ZXI = (2._JPRB*ZKELV(JL,JK)/3._JPRB) * & -! & SQRT(ZALPHA(JL,JK)*PW(JL,JK,JW)/ZGROWTH(JL,JK,JMOD)) -! -! ! (11): -! ZETA = ((ZALPHA(JL,JK)*PW(JL,JK,JW)/ZGROWTH(JL,JK,JMOD))**1.5_JPRB) / & -! & (2._JPRB*RPI*PPRHO_WAT*ZGAMMA(JL,JK)*ZN(JL,JK,JMOD)) -! -! ! (6): -! ZSUM(JL,JK,JW) = ZSUM(JL,JK,JW) + & -! & (1._JPRB/ZSM(JL,JK,JMOD)**2 * & -! & (ZF(JMOD)*(ZXI/ZETA)**1.5_JPRB + & -! & ZG(JMOD)*(ZSM(JL,JK,JMOD)**2._JPRB/(ZETA+3._JPRB*ZXI))**0.75_JPRB ) ) -! -! END IF -! -! END DO -! END DO -! END DO -! -! DO JK=KTDIA,KLEV -! DO JL=KIDIA,KFDIA -! IF (LCLOUD(JL,JK)) THEN -! IF (ZSUM(JL,JK,JW) > ZEPS) THEN -! ZSMAX(JL,JK,JW) = SQRT(1._JPRB / ZSUM(JL,JK,JW)) -! END IF -! END IF -! END DO -! END DO -! END DO -! -! !---Calculate activation: -! DO JW=1,KPDF -! DO JMOD=2, NSOL -! DO JK=KTDIA, KLEV -! DO JL=KIDIA,KFDIA -! -! IF ( LCLOUD(JL,JK) .AND. & -! & ZSMAX(JL,JK,JW)>ZEPS .AND. & -! & ZSM(JL,JK,JMOD)>ZEPS .AND. & -! & ZN(JL,JK,JMOD)>ZEPS .AND. & -! & PAERONUM(JL,JK,JMOD)>1.E-9_JPRB ) THEN -! -! !---critical radius (12): -! ZRC=PRDRY(JL,JK,JMOD)*(ZSM(JL,JK,JMOD)/ZSMAX(JL,JK,JW))**(2._JPRB/3._JPRB) -! -! !---fraction of particles that are *larger* than Rc: -! ZT=(LOG(ZRC)-LOG(PRDRY(JL,JK,JMOD))) / (ZSQRT2*SIGMALN(JMOD)) -! ZFRACN = 0.5_JPRB * ERFC(ZT) -! -! !---Sum up the total number of activated particles, integrating over updraft PDF [m-3]: -! ZFRACN_TOP(JL,JK,JMOD) = ZFRACN_TOP(JL,JK,JMOD) & -! + ZFRACN*PWPDF(JL,JK,JW) -! END IF -! -! ZFRACN_BOT(JL,JK,JMOD) = ZFRACN_BOT(JL,JK,JMOD) + PWPDF(JL,JK,JW) -! -! END DO ! jl -! END DO ! jk -! END DO -! END DO -! -! DO JMOD=2,NSOL -! DO JK=KTDIA,KLEV -! DO JL=KIDIA,KFDIA -! -! !---sum the total number of activated particles [# cm-3] -! IF (LCLOUD(JL,JK)) THEN -! PCDNC(JL,JK) = PCDNC(JL,JK) + 1.E-6_JPRB * ZN(JL,JK,JMOD) * & -! & ZFRACN_TOP(JL,JK,JMOD) / ZFRACN_BOT(JL,JK,JMOD) -! END IF -! -! END DO -! END DO -! END DO -! -! IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.AER_ACTIV_ABDULRAZZAK_GHAN', 1, ZHOOK_HANDLE) -! -! END SUBROUTINE AER_ACTIV_ABDULRAZZAK_GHAN -! -! SUBROUTINE AER_ACTIV_MENON(KIDIA, KFDIA, KLON, KTDIA, KLEV, PT, PRHO, PLSM, PSO4MASS, PSSMASS, POMMASS, & -! & PCDNC) -! -! ! Description -! ! ----------- -! ! aer_activ_menon calculates the CDNC concentration as a function of the bulk mass -! ! concentrations of sulfate, sea salt and organics -! -! ! Reference: -! ! ---------- -! ! GCM Simulations of the Aerosol Indirect Effect: Sensitivity to Cloud Parameterization -! ! and Aerosol Burden -! ! Menon et al., J. Atm. Sci. 59 692-713, 2002 -! -! !---inherited functions, types, variables and constants: -! USE YOMCST, ONLY: RPI -! USE YOECLDP, ONLY: RTHOMO, RCDNCSU, RCDNCSS, RCDNCOM -! -! !---subroutine interface -! INTEGER(KIND=JPIM), INTENT(IN) :: KIDIA ! beginning of horizontal block -! INTEGER(KIND=JPIM), INTENT(IN) :: KFDIA ! beginning of horizontal block -! INTEGER(KIND=JPIM), INTENT(IN) :: KLON ! horizontal dimension -! INTEGER(KIND=JPIM), INTENT(IN) :: KTDIA ! highest level with liquid cloud -! INTEGER(KIND=JPIM), INTENT(IN) :: KLEV ! number of model vertical levels -! REAL(KIND=JPRB), INTENT(IN) :: PT(KLON,KLEV) ! air temperature [K] -! REAL(KIND=JPRB), INTENT(IN) :: PRHO(KLON,KLEV) ! air density [kg m-3] -! REAL(KIND=JPRB), INTENT(IN) :: PLSM(KLON) ! land-sea mask -! REAL(KIND=JPRB), INTENT(IN) :: PSO4MASS(KLON,KLEV) ! so4 mass mixing ratio [kg/kg(air)] -! REAL(KIND=JPRB), INTENT(IN) :: PSSMASS(KLON,KLEV) ! sea salt mass mixing ratio [kg/kg(air)] -! REAL(KIND=JPRB), INTENT(IN) :: POMMASS(KLON,KLEV) ! OM mass mixing ratio [kg/kg(air)] -! REAL(KIND=JPRB), INTENT(INOUT) :: PCDNC(KLON,KLEV) ! number concentration of activated cloud droplets -! ! [#/cm3] -! -! !---local types, variables and constants: -! REAL(KIND=JPRB) :: ZSO4MASS ! sulfate mass [ug m-3] -! REAL(KIND=JPRB) :: ZOCMASS ! organic mass [ug m-3] -! REAL(KIND=JPRB) :: ZSSMASS ! sea salt mass [ug m-3] -! REAL(KIND=JPRB) :: ZCDNC_LAND(KLON) ! CDNC according to 'over land' formulation in Menon et al. -! REAL(KIND=JPRB) :: ZCDNC_OCEAN(KLON) ! CDNC according to 'over ocean' formulation in Menon et al. -! INTEGER(KIND=JPIM) :: JK, JL ! loop indices -! -! REAL(KIND=JPHOOK) :: ZHOOK_HANDLE -! -! -! !---executable procedure -! IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.AER_ACTIV_MENON', 0, ZHOOK_HANDLE) -! -! PCDNC(KIDIA:KFDIA,KTDIA:KLEV) = 0.0_JPRB -! -! DO JK=KTDIA,KLEV -! DO JL=KIDIA,KFDIA -! -! ! SO4, BC, OC mass in ug m-3: -! ZSO4MASS = PSO4MASS(JL,JK)*PRHO(JL,JK)*1.E9_JPRB -! ZSSMASS = PSSMASS(JL,JK)*PRHO(JL,JK)*1.E9_JPRB -! ZOCMASS = POMMASS(JL,JK)*PRHO(JL,JK)*1.E9_JPRB -! -! !---equation 1(b) in Menon et al., reformulated without log function. -! ! Note: this gives CDNC in #/cm3 -! ZCDNC_LAND(JL) = 257._JPRB*(ZSO4MASS**RCDNCSU)*(ZOCMASS**RCDNCOM) -! ZCDNC_OCEAN(JL) = ZCDNC_LAND(JL)*(ZSSMASS**RCDNCSS) -! -! END DO -! -! PCDNC(KIDIA:KFDIA,JK)=MERGE(ZCDNC_LAND(KIDIA:KFDIA), & -! & ZCDNC_OCEAN(KIDIA:KFDIA),PLSM(KIDIA:KFDIA)>0.5) -! -! END DO -! -! IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.AER_ACTIV_MENON', 1, ZHOOK_HANDLE) -! -! END SUBROUTINE AER_ACTIV_MENON + SUBROUTINE GET_HAMM7_AERO_PROP(KIDIA, KFDIA, KLON, KTDIA, KLEV, KSTGLO, LMODE, LBULK, & & PAPH, PGELAM, PGEMU, PXTM1, KTRAC, & @@ -2611,143 +690,6 @@ SUBROUTINE GET_HAMM7_AERO_PROP(KIDIA, KFDIA, KLON, KTDIA, KLEV, KSTGLO, LMODE, L !---executable procedure IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.GET_HAMM7_AERO_PROP', 0, ZHOOK_HANDLE) -! IF (LCMIP6_PI_AEROSOLS) THEN -! -! IBL = (KSTGLO-1)/KLON+1 -! -! IF (LPI_AERO_UPDATED .AND. MOD(NSTEP,NRADFR)==0) THEN -! -! !---CMIP6 preindustrial aerosols: interpolate from TM5 grid to physics grid -! CALL CMIP6_PIAER_MXR_INTERP(KIDIA, KFDIA, KLON, KLEV, 1, 0, & -! & PAPH, PGELAM, PGEMU, & -! & PAERONUM(:,:,2), PAERONUM(:,:,3), PAERONUM(:,:,4), & -! & PSO4MASS(:,:,2), PSO4MASS(:,:,3), PSO4MASS(:,:,4), & -! & PBCMASS(:,:,2), PBCMASS(:,:,3), PBCMASS(:,:,4), ZDUMMY, & -! & POMMASS(:,:,2), POMMASS(:,:,3), POMMASS(:,:,4), ZDUMMY, & -! & PSSMASS(:,:,3), PSSMASS(:,:,4), & -! & PDUMASS(:,:,3), PDUMASS(:,:,4), ZDUMMY, ZDUMMY, & -! & PNO3MASS(:,:), PMSAMASS(:,:) ) -! -! PI_AERO_PHY(KIDIA:KFDIA,:,IPINUM_KS,IBL) = PAERONUM(KIDIA:KFDIA,:,JP_AITS) -! PI_AERO_PHY(KIDIA:KFDIA,:,IPINUM_AS,IBL) = PAERONUM(KIDIA:KFDIA,:,JP_ACCS) -! PI_AERO_PHY(KIDIA:KFDIA,:,IPINUM_CS,IBL) = PAERONUM(KIDIA:KFDIA,:,JP_COAS) -! PI_AERO_PHY(KIDIA:KFDIA,:,IPIMSO4_KS,IBL) = PSO4MASS(KIDIA:KFDIA,:,JP_AITS) -! PI_AERO_PHY(KIDIA:KFDIA,:,IPIMSO4_AS,IBL) = PSO4MASS(KIDIA:KFDIA,:,JP_ACCS) -! PI_AERO_PHY(KIDIA:KFDIA,:,IPIMSO4_CS,IBL) = PSO4MASS(KIDIA:KFDIA,:,JP_COAS) -! PI_AERO_PHY(KIDIA:KFDIA,:,IPIMBC_KS,IBL) = PBCMASS(KIDIA:KFDIA,:,JP_AITS) -! PI_AERO_PHY(KIDIA:KFDIA,:,IPIMBC_AS,IBL) = PBCMASS(KIDIA:KFDIA,:,JP_ACCS) -! PI_AERO_PHY(KIDIA:KFDIA,:,IPIMBC_CS,IBL) = PBCMASS(KIDIA:KFDIA,:,JP_COAS) -! ! Note: insoluble modes are not presently used on the physics grid and -! ! are therefore not stored. Note also the third dimension of the PxxMASS -! ! arrays is NSOL. -! ! PI_AERO_PHY(KIDIA:KFDIA,:,IPIMBC_KI,IBL) = PBCMASS((KIDIA:KFDIA,:,JP_AITI) -! PI_AERO_PHY(KIDIA:KFDIA,:,IPIMOC_KS,IBL) = POMMASS(KIDIA:KFDIA,:,JP_AITS) -! PI_AERO_PHY(KIDIA:KFDIA,:,IPIMOC_AS,IBL) = POMMASS(KIDIA:KFDIA,:,JP_ACCS) -! PI_AERO_PHY(KIDIA:KFDIA,:,IPIMOC_CS,IBL) = POMMASS(KIDIA:KFDIA,:,JP_COAS) -! ! PI_AERO_PHY(KIDIA:KFDIA,:,IPIMOC_KI,IBL) = POMMASS(KIDIA:KFDIA,:,JP_AITI) -! PI_AERO_PHY(KIDIA:KFDIA,:,IPIMSS_AS,IBL) = PSSMASS(KIDIA:KFDIA,:,JP_ACCS) -! PI_AERO_PHY(KIDIA:KFDIA,:,IPIMSS_CS,IBL) = PSSMASS(KIDIA:KFDIA,:,JP_COAS) -! PI_AERO_PHY(KIDIA:KFDIA,:,IPIMDU_AS,IBL) = PDUMASS(KIDIA:KFDIA,:,JP_ACCS) -! PI_AERO_PHY(KIDIA:KFDIA,:,IPIMDU_CS,IBL) = PDUMASS(KIDIA:KFDIA,:,JP_COAS) -! ! PI_AERO_PHY(KIDIA:KFDIA,:,IPIMDU_AI,IBL) = PDUMASS(KIDIA:KFDIA,:,JP_ACCI) -! ! PI_AERO_PHY(KIDIA:KFDIA,:,IPIMDU_CI,IBL) = PDUMASS(KIDIA:KFDIA,:,JP_COAI) -! PI_AERO_PHY(KIDIA:KFDIA,:,IPIMNO3,IBL) = PNO3MASS(KIDIA:KFDIA,:) -! PI_AERO_PHY(KIDIA:KFDIA,:,IPIMMSA,IBL) = PMSAMASS(KIDIA:KFDIA,:) -! ELSE -! PAERONUM(KIDIA:KFDIA,:,JP_AITS) = PI_AERO_PHY(KIDIA:KFDIA,:,IPINUM_KS,IBL) -! PAERONUM(KIDIA:KFDIA,:,JP_ACCS) = PI_AERO_PHY(KIDIA:KFDIA,:,IPINUM_AS,IBL) -! PAERONUM(KIDIA:KFDIA,:,JP_COAS) = PI_AERO_PHY(KIDIA:KFDIA,:,IPINUM_CS,IBL) -! PSO4MASS(KIDIA:KFDIA,:,JP_AITS) = PI_AERO_PHY(KIDIA:KFDIA,:,IPIMSO4_KS,IBL) -! PSO4MASS(KIDIA:KFDIA,:,JP_ACCS) = PI_AERO_PHY(KIDIA:KFDIA,:,IPIMSO4_AS,IBL) -! PSO4MASS(KIDIA:KFDIA,:,JP_COAS) = PI_AERO_PHY(KIDIA:KFDIA,:,IPIMSO4_CS,IBL) -! PBCMASS(KIDIA:KFDIA,:,JP_AITS) = PI_AERO_PHY(KIDIA:KFDIA,:,IPIMBC_KS,IBL) -! PBCMASS(KIDIA:KFDIA,:,JP_ACCS) = PI_AERO_PHY(KIDIA:KFDIA,:,IPIMBC_AS,IBL) -! PBCMASS(KIDIA:KFDIA,:,JP_COAS) = PI_AERO_PHY(KIDIA:KFDIA,:,IPIMBC_CS,IBL) -! ! PBCMASS(KIDIA:KFDIA,:,JP_AITI) = PI_AERO_PHY(KIDIA:KFDIA,:,IPIMBC_KI,IBL) -! POMMASS(KIDIA:KFDIA,:,JP_AITS) = PI_AERO_PHY(KIDIA:KFDIA,:,IPIMOC_KS,IBL) -! POMMASS(KIDIA:KFDIA,:,JP_ACCS) = PI_AERO_PHY(KIDIA:KFDIA,:,IPIMOC_AS,IBL) -! POMMASS(KIDIA:KFDIA,:,JP_COAS) = PI_AERO_PHY(KIDIA:KFDIA,:,IPIMOC_CS,IBL) -! ! POMMASS(KIDIA:KFDIA,:,JP_AITI) = PI_AERO_PHY(KIDIA:KFDIA,:,IPIMOC_KI,IBL) -! PSSMASS(KIDIA:KFDIA,:,JP_ACCS) = PI_AERO_PHY(KIDIA:KFDIA,:,IPIMSS_AS,IBL) -! PSSMASS(KIDIA:KFDIA,:,JP_COAS) = PI_AERO_PHY(KIDIA:KFDIA,:,IPIMSS_CS,IBL) -! PDUMASS(KIDIA:KFDIA,:,JP_ACCS) = PI_AERO_PHY(KIDIA:KFDIA,:,IPIMDU_AS,IBL) -! PDUMASS(KIDIA:KFDIA,:,JP_COAS) = PI_AERO_PHY(KIDIA:KFDIA,:,IPIMDU_CS,IBL) -! ! PDUMASS(KIDIA:KFDIA,:,JP_ACCI) = PI_AERO_PHY(KIDIA:KFDIA,:,IPIMDU_AI,IBL) -! ! PDUMASS(KIDIA:KFDIA,:,JP_COAI) = PI_AERO_PHY(KIDIA:KFDIA,:,IPIMDU_CI,IBL) -! PNO3MASS(KIDIA:KFDIA,:) = PI_AERO_PHY(KIDIA:KFDIA,:,IPIMNO3,IBL) -! PMSAMASS(KIDIA:KFDIA,:) = PI_AERO_PHY(KIDIA:KFDIA,:,IPIMMSA,IBL) -! END IF -! ELSE -! [...] -! END IF ! lcmip6_pi_aerosols -! -! !---aerosol radius (if needed) for both interactive TM5 and preindustrial climatology -! IF (LMODE) THEN -! Z4PIOVER3 = 4._JPRB*RPI/3._JPRB -! DO JK=KTDIA,KLEV -! DO JL=KIDIA,KFDIA -! ! Aitken mode -! NSO4 = PSO4MASS(JL,JK,JP_AITS) / WSO4 -! NH2SO4 = NSO4 -! ! dry volume [m3] -! ZDRYVOL2 = & -! & (NH2SO4*WH2SO4 / (DH2SO4 * 1.0E3_JPRB) + & -! & POMMASS(JL,JK,JP_AITS) / (DOC * 1.0E3_JPRB) + & -! & PBCMASS(JL,JK,JP_AITS) / (DBC * 1.0E3_JPRB)) / & -! & PAERONUM(JL,JK,JP_AITS) -! ! dry radius [m] -! !PDRYRSOL(JL,JK,JP_AITS) = RAM2CMR(JP_AITS)* & -! ! & (ZDRYVOL2 / Z4PIOVER3)**(1._JPRB/3._JPRB) -! -! ! Accumulation mode -! NNA = PSSMASS(JL,JK,JP_ACCS) / WNACL -! NCL = NNA -! NSO4 = PSO4MASS(JL,JK,JP_ACCS) / WSO4 -! NNA2SO4 = MIN(NNA/2._JPRB, NSO4) -! NNA = NNA - 2._JPRB*NNA2SO4 -! NNACL = MIN(NCL, NNA) -! NCL = NNACL -! NH2SO4 = NSO4 - NNA2SO4 -! ! dry volume [m3] -! ZDRYVOL3 = & -! & (NNACL*WNACL / (DNACL * 1.0E3_JPRB) + & -! & NNA2SO4*WNA2SO4 / (DNA2SO4 * 1.0E3_JPRB) + & -! & NH2SO4*WH2SO4/ (DH2SO4 * 1.0E3_JPRB) + & -! & POMMASS(JL,JK,JP_ACCS) / (DOC * 1.0E3_JPRB) + & -! & PBCMASS(JL,JK,JP_ACCS) / (DBC * 1.0E3_JPRB) + & -! & PDUMASS(JL,JK,JP_ACCS) / (DDUST * 1.0E3_JPRB) + & -! & PNO3MASS(JL,JK) * NH4NO3_FACTOR / (DNH4NO3 * 1.0E3_JPRB) + & -! & PMSAMASS(JL,JK) / (DMSA * 1.0E3_JPRB)) / & -! & PAERONUM(JL,JK,JP_ACCS) -! ! dry radius [m] -! !PDRYRSOL(JL,JK,JP_ACCS) = RAM2CMR(JP_ACCS)* & -! ! & (ZDRYVOL3 / Z4PIOVER3)**(1._JPRB/3._JPRB) -! -! ! Coarse mode -! NNA = PSSMASS(JL,JK,JP_COAS) / WNACL -! NCL = NNA -! NSO4 = PSO4MASS(JL,JK,JP_COAS) / WSO4 -! NNA2SO4 = MIN(NNA/2._JPRB, NSO4) -! NNA = NNA - 2._JPRB*NNA2SO4 -! NNACL = MIN(NCL, NNA) -! NCL = NNACL -! NH2SO4 = NSO4 - NNA2SO4 -! ! dry volume [m3] -! ZDRYVOL4 = & -! & (NNACL*WNACL / (DNACL * 1.0E3_JPRB) + & -! & NNA2SO4*WNA2SO4 / (DNA2SO4 * 1.0E3_JPRB) + & -! & NH2SO4*WH2SO4/ (DH2SO4 * 1.0E3_JPRB) + & -! & POMMASS(JL,JK,JP_COAS) / (DOC * 1.0E3_JPRB) + & -! & PBCMASS(JL,JK,JP_COAS) / (DBC * 1.0E3_JPRB) + & -! & PDUMASS(JL,JK,JP_COAS) / (DDUST * 1.0E3_JPRB)) / & -! & PAERONUM(JL,JK,JP_COAS) -! ! dry radius [m] -! !PDRYRSOL(JL,JK,JP_COAS) = RAM2CMR(JP_COAS)* & -! ! & (ZDRYVOL4 / Z4PIOVER3)**(1._JPRB/3._JPRB) -! END DO -! END DO -! END IF - !---Aerosols masses and numbers ! NOTE: PXTM1 indices need to go according to HAM indices and not OIFS! IF (LMODE) THEN @@ -2813,375 +755,7 @@ SUBROUTINE GET_HAMM7_AERO_PROP(KIDIA, KFDIA, KLON, KTDIA, KLEV, KSTGLO, LMODE, L END SUBROUTINE GET_HAMM7_AERO_PROP -! SUBROUTINE DIAGNOSE_AEROSOL_MASS ( & -! ! input -! & KIDIA, KFDIA, KLON, KLEV,& -! & PT, PQ, PQSAT, & -! & PAPH, PAP, & -! & PGELAM, PGEMU, PCLON, PSLON,& -! ! output -! & PSO4MASS, PBCMASS, POMMASS, PSSMASS, PDUMASS) -! -! ! DIAGNOSE_AEROSOL_MASS -! ! --------------------- -! ! Diagnose the bulk mass mixing ratios of sulfate, black carbon, organic matter, -! ! sea salt and mineral dust from the optical properties given by the Tegen climatology -! ! effects on clouds and convection -! -! ! AUTHOR -! ! A. Tompkins E.C.M.W.F. (aer_clcld.F90, on which this is based) -! ! D. O'Donnell, FMI -! ! PURPOSE. -! ! -------- -! -! ! INTERFACE. -! ! ---------- -! -! ! *DIAGNOSE_AEROSOL_MASS* IS CALLED FROM *MOD_AER_ACTIV.MAIN* -! -! ! PARAMETER DESCRIPTION UNITS -! ! --------- ----------- ----- -! -! ! - INPUT ARGUMENTS. -! ! ------------------- -! -! ! KIDIA : START OF HORIZONTAL LOOP -! ! KFDIA : END OF HORIZONTAL LOOP -! ! KLON : HORIZONTAL DIMENSION -! ! KLEV : END OF VERTICAL LOOP AND VERTICAL DIMENSION -! ! PGELAM : LONGITUDE -! ! PCLON : COSINE OF LONGITUDE -! ! PSLON : SINE OF LONGITUDE -! ! PGEMU : SINE OF LATITUDE -! -! ! - OUTPUT ARGUMENTS. -! ! ------------------- -! ! PSSMASS : mass mixing ratio of seasalt aerosol -! ! PSO4MASS : mass mixing ratio of sulfate aerosol -! ! POMMASS : mass mixing ratio of organic aerosol -! ! PBCMASS : mass mixing ratio of black carbon aerosol -! ! PDUMASS : mass mixing ratio of mineral dust aerosol -! -! USE PARKIND1 ,ONLY : JPIM ,JPRB -! -! USE YOMCST , ONLY : RG ,RD ,RETV ,& -! & RLVTT ,RTT ,RPI, RLSTT -! USE YOECLDP , ONLY : RCLCRIT ,RLCRITSNOW, RCLDMAX,& -! & RNICE , LAERLIQAUTOLSP, LAERLIQCOLL, LAERICESED, LAERICEAUTO -! USE YOEAEROP , ONLY : ALF_SS, ALF_SU, ALF_BC, ALF_DD, ALF_OM !>>dod << -! USE YOEAERSNK, ONLY : RRHTAB -! USE YOERAD , ONLY : LEPO3RA -! USE YOE_AERO_M7_DATA, ONLY: NSOL -! USE YOETHF , ONLY : R2ES ,R3LES ,R3IES ,R4LES ,& -! & R4IES ,R5LES ,R5IES ,R5ALVCP ,R5ALSCP ,& -! & RALVDCP ,RALSDCP ,RTWAT ,& -! & RTICE ,RTICECU ,& -! & RTWAT_RTICE_R ,RTWAT_RTICECU_R,& -! & RKOOP1 ,RKOOP2 -! -! IMPLICIT NONE -! -! ! input variables -! INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA -! INTEGER(KIND=JPIM),INTENT(IN) :: KFDIA -! INTEGER(KIND=JPIM),INTENT(IN) :: KLON -! INTEGER(KIND=JPIM),INTENT(IN) :: KLEV -! REAL(KIND=JPRB) ,INTENT(IN) :: PAPH(KLON,KLEV+1) -! REAL(KIND=JPRB) ,INTENT(IN) :: PAP(KLON,KLEV) -! REAL(KIND=JPRB) ,INTENT(IN) :: PT(KLON,KLEV) -! REAL(KIND=JPRB) ,INTENT(IN) :: PQ(KLON,KLEV) -! REAL(KIND=JPRB) ,INTENT(IN) :: PQSAT(KLON,KLEV) -! REAL(KIND=JPRB) ,INTENT(IN) :: PGELAM(KLON) -! REAL(KIND=JPRB) ,INTENT(IN) :: PCLON(KLON) -! REAL(KIND=JPRB) ,INTENT(IN) :: PSLON(KLON) -! REAL(KIND=JPRB) ,INTENT(IN) :: PGEMU(KLON) -! -! ! output -! REAL(KIND=JPRB), INTENT(OUT) :: PSSMASS(KLON,KLEV) -! REAL(KIND=JPRB), INTENT(OUT) :: PSO4MASS(KLON,KLEV) -! REAL(KIND=JPRB), INTENT(OUT) :: POMMASS(KLON,KLEV) -! REAL(KIND=JPRB), INTENT(OUT) :: PBCMASS(KLON,KLEV) -! REAL(KIND=JPRB), INTENT(OUT) :: PDUMASS(KLON,KLEV) -! -! !---------------------------------------------------------------------- -! -! ! local arrays -! -! ! Aerosol arrays -! REAL(KIND=JPRB) :: ZAOD(KLON,6,KLEV) ! aerosol optical depth -! REAL(KIND=JPRB) :: ZOZONE(KLON,KLEV) ! O3 concentration, not currently used -! REAL(KIND=JPRB) :: ZMAERMN(6) ! annual column mean mass of aerosol -! REAL(KIND=JPRB) :: ZECPO3(KLON,KLEV) ! dummy prognostic ozone array -! REAL(KIND=JPRB) :: ZQS(KLON,KLEV) ! saturation -! -! REAL(KIND=JPRB) :: ZS0, ZSCRITHOMO, ZSVP, ZTEMPC -! REAL(KIND=JPRB) :: ZNCRIT_GIERENS, ZNCRIT_REN -! REAL(KIND=JPRB) :: ZNICEHOMO -! !REAL(KIND=JPRB) :: ZLIQCLD, ZICERE -! -! REAL(KIND=JPRB) :: ZCLD -! REAL(KIND=JPRB) :: ZRLIQ_CRIT, ZRICE_CRIT ! critical radii for autoconversion process -! -! ! for RH look up tables -! INTEGER(KIND=JPIM) :: IRH(KLON,KLEV) -! INTEGER(KIND=JPIM) :: JTYP, JTAB, IBIN -! INTEGER(KIND=JPIM) :: JAERSS, JAERDU, JAEROM, JAERSU, JAERBC -! -! ! these are reduced compared to USE YOEAEROP, since 1 band only -! !REAL(KIND=JPRB) :: ZALF_BC(1) -! !REAL(KIND=JPRB) :: ZALF_DD(3) -! !REAL(KIND=JPRB) :: ZALF_OM(12) -! !REAL(KIND=JPRB) :: ZALF_SS(12,3) -! !REAL(KIND=JPRB) :: ZALF_SU(12) -! !REAL(KIND=JPRB) :: ZRHTAB(12) -! -! REAL(KIND=JPRB) :: ZALF, ZRH, ZWTOT, ZALF_SU, ZALF_BC, ZALF_OM, ZALF_SS, ZALF_DU -! -! ! general arrays -! REAL(KIND=JPRB) :: ZTHF(KLON,KLEV+1) ! T on half levels -! -! REAL(KIND=JPRB) :: ZDPR -! -! ! misc variables -! REAL(KIND=JPRB) :: ZEPSEC -! INTEGER(KIND=JPIM) :: IWAVL -! INTEGER(KIND=JPIM) :: JK, JL -! -! REAL(KIND=JPHOOK) :: ZHOOK_HANDLE -! -! !------------------------ -! ! interface include files -! !------------------------ -!#include "radact.intfb.h" -! -!#include "fcttre.h" -! -! !-------------------------------------------------------------------------- -! -! IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.DIAGNOSE_AEROSOL_MASS',0,ZHOOK_HANDLE) -! -! !###################################################################### -! ! 1.0 Basic variables -! !###################################################################### -! -! ZEPSEC=1.E-10_JPRB -! IWAVL=8 ! reference to 550 nm -! -! ! move to cldp module -! ZRLIQ_CRIT=9.3E-6_JPRB ! cloud to rain critical radius -! ZWTOT=0.1_JPRB ! governs critical N -! -! !---initialization -! PSSMASS(:,:) = 0.0_JPRB -! PSO4MASS(:,:) = 0.0_JPRB -! POMMASS(:,:) = 0.0_JPRB -! PBCMASS(:,:) = 0.0_JPRB -! PDUMASS(:,:) = 0.0_JPRB -! -! ! change to vector vmass -! DO JK=1,KLEV -! DO JL=KIDIA,KFDIA -! ZQS(JL,JK)=FOEEWM(PT(JL,JK))/PAP(JL,JK) -! ZQS(JL,JK)=MIN(0.5_JPRB,ZQS(JL,JK)) -! ZQS(JL,JK)=ZQS(JL,JK)/(1.0_JPRB-RETV*ZQS(JL,JK)) -! ENDDO -! ENDDO -! DO JK=2,KLEV -! DO JL=KIDIA,KFDIA -! ZTHF(JL,JK)=(PT(JL,JK-1)*PAP(JL,JK-1)& -! & *(PAP(JL,JK)-PAPH(JL,JK))& -! & +PT(JL,JK)*PAP(JL,JK)*(PAPH(JL,JK)-PAP(JL,JK-1)))& -! & *(1.0_JPRB/(PAPH(JL,JK)*(PAP(JL,JK)-PAP(JL,JK-1)))) -! ENDDO -! ENDDO -! -! DO JL=KIDIA,KFDIA -! ZTHF(JL,KLEV+1)=PT(JL,KLEV) ! should be surface temperature -! ZTHF(JL,1)=PT(JL,1) -! ENDDO -! -! IF (LEPO3RA) THEN -! DO JK=1,KLEV -! DO JL=KIDIA,KFDIA -! ZECPO3(JL,JK)=0.0_JPRB -! ENDDO -! ENDDO -! ENDIF -! -! !###################################################################### -! ! 2. Retrieve aerosols optical depths -! !###################################################################### -! ! line 2: KRINT=1, KDLON=KLON , P2=KLON, KSHIFT=0, -! ! line 4: ozone set to dummy variable. -! -! CALL RADACT ( KIDIA , KFDIA, KLON , KLEV,& -! & 1 , KLON , KLON , 0 , 1 ,& -! & PAPH , & -! & PGELAM, PGEMU, PCLON, PSLON, ZTHF,& -! & PQ , PQSAT , ZECPO3,& -! & ZAOD, ZOZONE ) -! -! -! !###################################################################### -! ! 3. Retrieve Aerosol mass from Tau -! !###################################################################### -! -! ! RADACT order: -! ! 1=sulfate + organics -! ! 2=sea salt -! ! 3=black carbon -! ! 4=mineral dust -! ! 5=Volcanic -! ! 6=Background -! ! set up indices -! JAERSU=1 -! JAERSS=2 -! JAERDU=3 -! JAERBC=4 -! JAEROM=1 -! -! -! !======================================== -! ! conversion of aerosols from Tau to Mass -! !======================================== -! !-- define RH index from "clear-sky" (not yet!) relative humidity -! -! ! for now fix to using Bin 1, meaning the smallest SS particles -! IBIN=1 -! -! ! taken from YOEAEROP: 17- band data for IWAVL=8 corresponding to 550nm -! -! DO JK=1,KLEV -! DO JL=KIDIA,KFDIA -! ZRH=100.0_JPRB*PQ(JL,JK)/PQSAT(JL,JK) -! ZRH=MIN(MAX(ZRH,1.0_JPRB),100.0_JPRB) -! !>>dod -! IRH(JL,JK) = 1 -! !< RRHTAB(JTAB)) THEN -! IRH(JL,JK)=JTAB -! ENDIF -! ENDDO -! ENDDO -! ENDDO -! -! -! ZALF_BC=ALF_BC(IWAVL) -! ZALF_DU=ALF_DD(IBIN,IWAVL) -! -! DO JK=1,KLEV -! DO JL=KIDIA,KFDIA -! -! ZALF_SU=ALF_SU(IRH(JL,JK),IWAVL) -! ZALF_OM=ALF_OM(IRH(JL,JK),IWAVL) -! ZALF_SS=ALF_SS(IRH(JL,JK),IWAVL,IBIN) -! -! ZDPR=PAPH(JL,JK+1)-PAPH(JL,JK) -! -! !---sulfate and organics: allocate 50% to the sulfate mass and 50% to organics -! IF (ZALF_SU /= 0.0_JPRB .AND. ZDPR /=0.0_JPRB ) THEN -! ! PSO4MASS(JL,JK) = ZAOD(JL,JAERSU,JK)*RG/(ZDPR*ZALF_SU*1000._JPRB) -! PSO4MASS(JL,JK) = 0.5_JPRB*ZAOD(JL,JAERSU,JK)*RG/(ZDPR*ZALF_SU*1000._JPRB) -! END IF -! -! IF (ZALF_OM /= 0.0_JPRB .AND. ZDPR /=0.0_JPRB ) THEN -! ! POMMASS(JL,JK) = 0._JPRB -! POMMASS(JL,JK) = 0.5_JPRB*ZAOD(JL,JAERSU,JK)*RG/(ZDPR*ZALF_OM*1000._JPRB) -! END IF -! -! !---black carbon -! IF (ZALF_BC /= 0.0_JPRB .AND. ZDPR /=0.0_JPRB ) THEN -! PBCMASS(JL,JK) = ZAOD(JL,JAERBC,JK)*RG/(ZDPR*ZALF_BC*1000._JPRB) -! END IF -! -! !---sea salt -! IF (ZALF_SS /= 0.0_JPRB .AND. ZDPR /=0.0_JPRB ) THEN -! PSSMASS(JL,JK) = ZAOD(JL,JAERSS,JK)*RG/(ZDPR*ZALF_SS*1000._JPRB) -! END IF -! -! !---mineral dust -! IF (ZALF_DU /= 0.0_JPRB .AND. ZDPR /=0.0_JPRB ) THEN -! PDUMASS(JL,JK) = ZAOD(JL,JAERDU,JK)*RG/(ZDPR*ZALF_DU*1000._JPRB) -! END IF -! -! END DO -! END DO -! -! IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.DIAGNOSE_AEROSOL_MASS', 1, ZHOOK_HANDLE) -! -! END SUBROUTINE DIAGNOSE_AEROSOL_MASS - -! SUBROUTINE LIQ_CLOUD_RE(KIDIA, KFDIA, KLON, KTDIA, KLEV, LCLOUD, PL, PA, PRHO, PGFL) -! -! ! *LIQ_CLOUD_RE* calculates the effective radius (Re) for liquid clouds -! -! !---inherited functions, types, variables and constants -! USE YOMCST, ONLY: RPI -! USE YOECLDP, ONLY: RCLDMAX, PPRHO_WAT -! USE YOM_YGFL, ONLY: YGFL, YCDNC, YRE_LIQ -! -! IMPLICIT NONE -! -! !---subroutine interface -! ! Input: -! INTEGER(KIND=JPIM), INTENT(IN) :: KIDIA -! INTEGER(KIND=JPIM), INTENT(IN) :: KFDIA -! INTEGER(KIND=JPIM), INTENT(IN) :: KLON -! INTEGER(KIND=JPIM), INTENT(IN) :: KTDIA -! INTEGER(KIND=JPIM), INTENT(IN) :: KLEV -! -! LOGICAL, INTENT(IN) :: LCLOUD(KLON,KLEV) -! -! REAL(KIND=JPRB), INTENT(IN) :: PL(KLON,KLEV) -! REAL(KIND=JPRB), INTENT(IN) :: PA(KLON,KLEV) -! REAL(KIND=JPRB), INTENT(IN) :: PRHO(KLON,KLEV) -! -! ! Input and output -! REAL(KIND=JPRB), INTENT(INOUT) :: PGFL(KLON,KLEV,YGFL%NDIM) -! -! !---local data: -! REAL(KIND=JPRB) :: ZCLD, ZRE_LIQ(KLON,KLEV) -! REAL(KIND=JPRB) :: ZEPSEC -! REAL(KIND=JPHOOK) :: ZHOOK_HANDLE -! -! INTEGER(KIND=JPIM) :: JL,JK -! -! !---executable procedure -! IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.LIQ_CLOUD_RE', 0, ZHOOK_HANDLE) -! -! ZEPSEC = 1.E-10_JPRB -! -!! this is effective radius calculation -! DO JK=KTDIA,KLEV -! DO JL=KIDIA,KFDIA -! ZCLD=PL(JL,JK)/MAX(PA(JL,JK),ZEPSEC) -! ZCLD=MIN(MAX(ZCLD,0.0_JPRB),RCLDMAX) -! -! ! 2.387e-10 is 3/(4*pi*rho_liq*10^6) [10^6 for N in right units] -! ! PRE_LIQ(JL,JK)=(2.387e-10_JPRB*PRHO(JL,JK)*ZCLD/PCDNC(JL,JK))**0.333_JPRB -! -! ZRE_LIQ(JL,JK) = (0.75_JPRB*PRHO(JL,JK)*ZCLD / & -! & (RPI*PPRHO_WAT*1.E6_JPRB*PGFL(JL,JK,YCDNC%MP9_PH)))**0.333_JPRB -! END DO -! END DO -! -! ZRE_LIQ = ZRE_LIQ*1.E6_JPRB -! -! ! This taken from old radlswr:- -! ! Limit effective radius to within defined range -! ZRE_LIQ = MAX(ZRE_LIQ, 4.0_JPRB) -! ZRE_LIQ = MIN(ZRE_LIQ,30.0_JPRB) -! -! ! Set R_eff_liq only where there are clouds -! PGFL(KIDIA:KFDIA,KTDIA:KLEV,YRE_LIQ%MP9_PH) = & -! & MERGE( ZRE_LIQ(KIDIA:KFDIA,KTDIA:KLEV), & -! & PGFL(KIDIA:KFDIA,KTDIA:KLEV,YRE_LIQ%MP9_PH), & -! & LCLOUD(KIDIA:KFDIA,KTDIA:KLEV) ) -! -! IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.LIQ_CLOUD_RE', 1, ZHOOK_HANDLE) -! -! END SUBROUTINE LIQ_CLOUD_RE + SUBROUTINE ICE_CLOUD_PROP(KIDIA, KFDIA, KLON, KLEV, PT, PRHO, PI, PA, PAP, & & PQSAT, PSO4MASS, PBCMASS, PDUMASS, PGFL, YDMODEL, PRE_ICE, PICNC) @@ -3382,201 +956,5 @@ SUBROUTINE ICE_CLOUD_PROP(KIDIA, KFDIA, KLON, KLEV, PT, PRHO, PI, PA, PAP, & IF (LHOOK) CALL DR_HOOK('ICE_CLD_PROP', 1, ZHOOK_HANDLE) END SUBROUTINE ICE_CLOUD_PROP -! SUBROUTINE PDF_UPDRAFT(KIDIA, KFDIA, KLON, KTDIA, KLEV, KPDF, PRHO, PLSM, PVERVEL, PW, PWPDF) -! -! !---inherited functions, types, variables and constants -! USE YOMCST, ONLY: RG, RPI -! !USE YOECLDP, ONLY: NACTPDF -! USE MO_ACTIV, ONLY: nw -! -! IMPLICIT NONE -! -! !---subroutine interface -! ! Input: -! INTEGER(KIND=JPIM), INTENT(IN) :: KIDIA -! INTEGER(KIND=JPIM), INTENT(IN) :: KFDIA -! INTEGER(KIND=JPIM), INTENT(IN) :: KLON -! INTEGER(KIND=JPIM), INTENT(IN) :: KTDIA -! INTEGER(KIND=JPIM), INTENT(IN) :: KLEV -! INTEGER(KIND=JPIM), INTENT(IN) :: KPDF -! REAL(KIND=JPRB), INTENT(IN) :: PRHO(KLON,KLEV) -! REAL(KIND=JPRB), INTENT(IN) :: PLSM(KLON) -! REAL(KIND=JPRB), INTENT(IN) :: PVERVEL(KLON,KLEV) -! ! Output: -! REAL(KIND=JPRB), INTENT(OUT) :: PW(KLON,KLEV,KPDF) -! REAL(KIND=JPRB), INTENT(OUT) :: PWPDF(KLON,KLEV,KPDF) -! -! !---local data -! REAL(KIND=JPRB), PARAMETER :: RW_MIN = 0._JPRB -! !xxx 4 sigma is too much -! REAL(KIND=JPRB), PARAMETER :: RW_MAX = 4._JPRB*PPDF_SIGMA -! REAL(KIND=JPRB), PARAMETER :: RINVSIGMA = 1._JPRB/PPDF_SIGMA -! REAL(KIND=JPRB), PARAMETER :: R2SIGMA2 = 2._JPRB*PPDF_SIGMA**2 -! -! REAL(KIND=JPRB), PARAMETER :: RUPDRAFT_LAND = 1.0_JPRB -! REAL(KIND=JPRB), PARAMETER :: RUPDRAFT_SEA = 0.5_JPRB -! -! INTEGER(KIND=JPIM) :: JL,JK, JW -! -! REAL(KIND=JPRB) :: ZWLARGE(KLON,KLEV) -! REAL(KIND=JPRB) :: ZW_PRESC(KLON) -! REAL(KIND=JPRB) :: ZSQ2PI -! REAL(KIND=JPRB) :: ZW_WIDTH -! REAL(KIND=JPHOOK) :: ZHOOK_HANDLE -! -! !---executable procedure -! IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.PDF_UPDRAFT',0,ZHOOK_HANDLE) -! -! ZSQ2PI = 1._JPRB/SQRT(2._JPRB*RPI) -! -! ZWLARGE(KIDIA:KFDIA,KTDIA:KLEV) = -1._JPRB* PVERVEL(KIDIA:KFDIA,KTDIA:KLEV) / & -! & (RG*PRHO(KIDIA:KFDIA,KTDIA:KLEV)) -! -! IF (KPDF > 1) THEN -! -! ZW_WIDTH = (RW_MAX - RW_MIN) / REAL(nw,JPRB) -! -! DO JW=1,KPDF -! DO JK=KTDIA,KLEV -! PW(KIDIA:KFDIA,JK,JW) = RW_MIN + (REAL(JW,JPRB) - 0.5_JPRB) * ZW_WIDTH -! -! PWPDF(KIDIA:KFDIA,JK,JW) = ZSQ2PI * RINVSIGMA * & -! & EXP( -(PW(KIDIA:KFDIA,JK,JW) - ZWLARGE(KIDIA:KFDIA,JK))**2._JPRB & -! & / R2SIGMA2) -! END DO -! END DO -! ELSE -! ZW_PRESC(KIDIA:KFDIA) = MERGE(RUPDRAFT_LAND, RUPDRAFT_SEA, & -! & PLSM(KIDIA:KFDIA) > 0.5_JPRB) -! DO JK=KTDIA,KLEV -! PW(KIDIA:KFDIA,JK,1) = MERGE(ZW_PRESC(KIDIA:KFDIA), 0._JPRB, & -! & ZWLARGE(KIDIA:KFDIA,JK) > RW_MIN) -! PWPDF(KIDIA:KFDIA,JK,1) = 1._JPRB -! END DO -! END IF -! -! IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.PDF_UPDRAFT',1,ZHOOK_HANDLE) -! END SUBROUTINE PDF_UPDRAFT - -! SUBROUTINE GET_CDNC_FACTOR(KIDIA,KFDIA,KLON,PGEMU,PGELAM,PMAC2SP_CDNC_FACTOR) -! -! USE YOMCST , ONLY : RPI, RDAY -! USE YOMCT0 , ONLY : LTWOTL, LNF -! USE YOMCT2 , ONLY : NSTAR2 -! USE YOMDYN , ONLY : TSTEP -! USE YOMRIP , ONLY : NINDAT, NSTADD -! USE YOMLUN , ONLY : NULOUT -! USE YOERAD , ONLY : MAC2SP_LAMDA, NCMIPFIXYR, LMAC2SP -! USE AER_MACV2SP_MOD, ONLY: SP_AOP_PROFILE, MAC2SP_YEAR_MIN, MAC2SP_YEAR_MAX -! USE DAY_NUMBER_MOD, ONLY: NUMBER_OF_DAY -! -! IMPLICIT NONE -! -! INTEGER(KIND=JPIM), INTENT(IN) :: KIDIA -! INTEGER(KIND=JPIM), INTENT(IN) :: KFDIA -! INTEGER(KIND=JPIM), INTENT(IN) :: KLON -! REAL(KIND=JPRB), INTENT(IN) :: PGEMU(KLON) -! REAL(KIND=JPRB), INTENT(IN) :: PGELAM(KLON) -! REAL(KIND=JPRB), INTENT(OUT):: PMAC2SP_CDNC_FACTOR(KLON) -! -! !---the CDNC factor doesn't vary with height, thus only 1 level is needed -! INTEGER(KIND=JPIM), PARAMETER :: KLEV=1 -! -! REAL(KIND=JPRB) :: ZR2D, ZGLAT(KLON), ZGLON(KLON) -! REAL(KIND=JPRB) :: YEAR_FR, KNDY -! REAL(KIND=JPRB) :: PGEOH(KLON,KLEV+1) -! -! INTEGER(KIND=JPIM) :: IDY0, IMN0, IYR0, IDY, IMN, IYR, IDOY -! INTEGER(KIND=JPIM) :: IZT, ISTADD, ITIME -! INTEGER(KIND=JPIM) :: ILMONTH(12) -! -! INTEGER(KIND=JPIM) :: JL -! -! !-- variables for MAC2SP anthropogenic aerosol -! REAL(KIND=JPRB):: AOD_MAC2SP(KLON,KLEV) -! REAL(KIND=JPRB):: SSA_MAC2SP(KLON,KLEV) -! REAL(KIND=JPRB):: ASY_MAC2SP(KLON,KLEV) -! -! REAL(KIND=JPHOOK) :: ZHOOK_HANDLE -! -!#include "updcal.intfb.h" -!#include "fcttim.h" -! -! !---executable procedure -! IF (LHOOK) CALL DR_HOOK('GET_CDNC_FACTOR', 0, ZHOOK_HANDLE) -! -! ! fake geopotential, doesn't matter for the CDNC factor -! PGEOH(:,1)=100._JPRB -! PGEOH(:,2)=10._JPRB -! -! ZR2D=180.0_JPRB/RPI -! DO JL=KIDIA,KFDIA -! ZGLAT(JL)= ASIN(PGEMU(JL)) * ZR2D -! ZGLON(JL)= PGELAM(JL) * ZR2D -! END DO -! -! ! Prepare year fraction -! IF(.NOT.LNF.AND.NSTADD == 0) THEN -! ! IN CASE OF RESTART: -! ITIME=NINT(TSTEP,KIND(ITIME)) -! IF (LTWOTL) THEN -! IZT=NINT(TSTEP*(REAL(NSTAR2,JPRB)+0.5_JPRB),KIND(IZT)) -! ELSE -! IZT=INT(ITIME,KIND(IZT))*INT(NSTAR2,KIND(IZT)) -! ENDIF -! ISTADD=INT(IZT/NINT(RDAY,KIND(IZT)),KIND(ISTADD)) -! ELSE -! ISTADD=NSTADD -! ENDIF -! IYR0=NCCAA(NINDAT) -! IMN0=NMM(NINDAT) -! IDY0=NDD(NINDAT) -! -! CALL UPDCAL(IDY0,IMN0,IYR0, ISTADD, IDY,IMN,IYR, ILMONTH, NULOUT) -! -! ! Day number and total number of days for that year -! CALL NUMBER_OF_DAY(IDY,IMN,IYR,IDOY) -! IF(MOD(IYR,4) == 0 .AND. MOD(IYR,400) /= 100 & -! & .AND. MOD(IYR,400) /= 200 .AND. MOD(IYR,400) /= 300)THEN -! KNDY=366._JPRB -! ELSE -! KNDY=365._JPRB -! ENDIF -! -! ! Replace IYR with NCMIPFIXYR -! IF (NCMIPFIXYR>0) IYR=NCMIPFIXYR -! -! ! Limit IYR to available dataset -! IYR = MIN(MAC2SP_YEAR_MAX, MAX(MAC2SP_YEAR_MIN, IYR)) -! -! YEAR_FR = IYR + (REAL(IDOY,JPRB) - 0.5_JPRB)/KNDY -! -! CALL SP_AOP_PROFILE (KLEV ,KIDIA ,KFDIA ,KLON ,MAC2SP_LAMDA(1) , & -! & ZGLON ,ZGLAT ,YEAR_FR ,PGEOH ,PMAC2SP_CDNC_FACTOR , & -! & AOD_MAC2SP ,SSA_MAC2SP ,ASY_MAC2SP ) -! -! IF (LHOOK) CALL DR_HOOK('GET_CDNC_FACTOR',1,ZHOOK_HANDLE) -! END SUBROUTINE GET_CDNC_FACTOR -! SUBROUTINE SETUP_ACI_DIAG -! -! USE PHY_DIAG_MOD, ONLY: NEW_DIAG_SET, NEW_DIAGNOSTIC -! USE YOM_GRIB_CODES, ONLY: NGRBCDNC, NGRBREFF, NGRBLIQCLDTIME -! USE YOMLUN, ONLY: NULOUT -! -! IMPLICIT NONE -! -! INTEGER(KIND=JPIM) :: ISET -! REAL(KIND=JPHOOK) :: ZHOOK_HANDLE -! -! IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.SETUP_ACI_DIAG',0,ZHOOK_HANDLE) -! -! CALL NEW_DIAG_SET('ACI', ISET) -! CALL NEW_DIAGNOSTIC(ISET, 'CDNC', 3, NGRBCDNC, .TRUE., .FALSE., D_CDNC) -! CALL NEW_DIAGNOSTIC(ISET, 'REFF', 3, NGRBREFF, .FALSE., .TRUE., D_REFF) -! CALL NEW_DIAGNOSTIC(ISET, 'LIQ_CLD_TIME', 3, NGRBLIQCLDTIME, .TRUE., .FALSE., & -! & D_LIQCLDT) -! -! IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.SETUP_ACI_DIAG',1,ZHOOK_HANDLE) -! END SUBROUTINE SETUP_ACI_DIAG END MODULE YOE_AER_ACTIV From 1b4b177f04b0dfd67907bdeb5a62dd077b188b45 Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Wed, 11 Mar 2026 14:19:32 +0100 Subject: [PATCH 120/129] ECE4 HotFix - Fix to compile with GNU --- ifs-source/arpifs/module/yoedust.F90 | 5 ----- 1 file changed, 5 deletions(-) diff --git a/ifs-source/arpifs/module/yoedust.F90 b/ifs-source/arpifs/module/yoedust.F90 index f5c522f5..7d7c6882 100755 --- a/ifs-source/arpifs/module/yoedust.F90 +++ b/ifs-source/arpifs/module/yoedust.F90 @@ -258,8 +258,6 @@ SUBROUTINE SU_DUST_FIELDS_INTERP(SELF, KSTART, KEND, KCOL, PLAT, PLON, & REAL(KIND=JPRB), INTENT(OUT) :: IZ0M(KCOL), IFPAR(KCOL) !INTEGER(KIND=JPIM), INTENT(OUT) :: ISOILTYPE(KSTART:KEND) REAL(KIND=JPRB), INTENT(OUT) :: ISOILTYPE(KSTART:KEND) - - #include "abor1.intfb.h" IF (LHOOK) CALL DR_HOOK('YOEDUST:INTERPOLATION main call',0,ZHOOK_HANDLE) @@ -339,8 +337,6 @@ SUBROUTINE CALC_INTERP_DUST(SELF, FIELD2D, KSTART, KEND, KCOL, PLAT, PLON, INTER REAL(KIND=JPHOOK) :: ZHOOK_HANDLE REAL(KIND=JPHOOK) :: DENOM - #include "abor1.intfb.h" - IF (LHOOK) CALL DR_HOOK('YOEDUST:INTERPOLATION FIELDS 2D',0,ZHOOK_HANDLE) PLONWEIGHT = 0.0 @@ -398,7 +394,6 @@ SUBROUTINE CALC_3DINTERP_DUST(SELF, FIELD3D, KSTART, KEND, KCOL, PLAT, PLON, INT REAL(KIND=JPRB), DIMENSION(KSTART:KEND) :: PLATWEIGHT, PLONWEIGHT REAL(KIND=JPRB), DIMENSION(KSTART:KEND):: PSINLAT, ZLAT REAL(KIND=JPRB) :: ZAERA, ZAERB - #include "abor1.intfb.h" IF (LHOOK) CALL DR_HOOK('YOEDUST:INTERPOLATION FIELDS 3D',0,ZHOOK_HANDLE) ! Precompute sine of latitude and indices From 7438bb85df30eed81bc80174ffb6297a7d620d9c Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Fri, 13 Mar 2026 15:16:50 +0000 Subject: [PATCH 121/129] Pull request #75: Fix Tegen dust and Single Precision (MBN activation, M7) Merge in ~NM6/openifs-48r1 from bugfix/mbn-sp to knmi-m7 Squashed commit of the following: commit bbefb61c84c987fa0e66cd4015e4b4caeb0b3768 Author: Philippe Le Sager Date: Thu Mar 12 09:13:03 2026 +0100 Avoid division by zero in M7 in SP commit 140f2db4d713b13e43c432607e6d037e4f204636 Author: Philippe Le Sager Date: Wed Mar 11 16:11:13 2026 +0100 Remove assignment to unallocated arrays commit 429c768da7b7be913095d6bfe77013d71425c875 Author: Philippe Le Sager Date: Wed Mar 11 14:26:07 2026 +0100 Fix MBN for SP --- ifs-source/arpifs/m7/module/mo_ham_m7.F90 | 22 +++++--- ifs-source/arpifs/m7/module/nd_param.F90 | 34 ++++++----- ifs-source/arpifs/module/yoedust.F90 | 69 +++++++++++------------ 3 files changed, 67 insertions(+), 58 deletions(-) diff --git a/ifs-source/arpifs/m7/module/mo_ham_m7.F90 b/ifs-source/arpifs/m7/module/mo_ham_m7.F90 index 7d75e79d..dfea5825 100644 --- a/ifs-source/arpifs/m7/module/mo_ham_m7.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_m7.F90 @@ -4094,7 +4094,7 @@ SUBROUTINE m7_delcoa(kproma, kbdim, klev, krow, paerml, & INTEGER :: jspec, isoans, isoaks, isoaas, isoacs, jn2 !< Date: Sun, 10 May 2026 09:08:12 +0200 Subject: [PATCH 122/129] Fix bugs introduced during rebased --- ifs-source/arpifs/chem/tm5_glomap_aerosol.F90 | 8 + ifs-source/arpifs/m7/module/mo_ham_m7.F90 | 2 +- ifs-source/arpifs/m7/module/mo_ham_subm.F90 | 2 + .../arpifs/m7/phys_ec/hamm7_interface.F90 | 196 +++--------------- ifs-source/arpifs/phys_ec/aer_negat.F90 | 5 +- 5 files changed, 45 insertions(+), 168 deletions(-) diff --git a/ifs-source/arpifs/chem/tm5_glomap_aerosol.F90 b/ifs-source/arpifs/chem/tm5_glomap_aerosol.F90 index bbed4118..fdb5008b 100644 --- a/ifs-source/arpifs/chem/tm5_glomap_aerosol.F90 +++ b/ifs-source/arpifs/chem/tm5_glomap_aerosol.F90 @@ -1,3 +1,11 @@ +! (C) Copyright 2009- ECMWF. +! This software is licensed under the terms of the Apache Licence Version 2.0 +! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. +! +! In applying this licence, ECMWF does not waive the privileges and immunities +! granted to it by virtue of its status as an intergovernmental organisation +! nor does it submit to any jurisdiction + SUBROUTINE TM5_GLOMAP_AEROSOL ( KIDIA,KFDIA,KLON,KLEV, & & PAERAOT, PAERAAOT, PAERASY, & & PTAUS_AER,PTAUA_AER, PMAER ) diff --git a/ifs-source/arpifs/m7/module/mo_ham_m7.F90 b/ifs-source/arpifs/m7/module/mo_ham_m7.F90 index dfea5825..cda7565b 100644 --- a/ifs-source/arpifs/m7/module/mo_ham_m7.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_m7.F90 @@ -2361,7 +2361,7 @@ SUBROUTINE m7_nuck(kproma, kbdim, klev, krow, & REAL(dp):: ppbl(kbdim) ! Planetary boundary layer top level REAL(dp), OPTIONAL :: pforest(kbdim) ! forest fraction - REAL(dp),OPTIONAL :: pout_dnuc(kbdim,klev,5) ! nucleation diagnostics + REAL(dp), OPTIONAL :: pout_dnuc(kbdim,klev,5) ! nucleation diagnostics ! ! Local variables: diff --git a/ifs-source/arpifs/m7/module/mo_ham_subm.F90 b/ifs-source/arpifs/m7/module/mo_ham_subm.F90 index 99553644..768ac6b8 100755 --- a/ifs-source/arpifs/m7/module/mo_ham_subm.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_subm.F90 @@ -153,6 +153,8 @@ SUBROUTINE ham_subm_interface(kproma, kbdim, klev, krow, ktrac, & REAL(dp) :: paclc (kbdim,klev) ! cloud cover [0,1] REAL(dp) :: pgrvolm1(kbdim,klev) ! grid box volume [m3] REAL(dp) :: ppbl (kbdim) ! Planetary boundary layer top level + REAL(dp), OPTIONAL :: pforest(kbdim) ! forest fraction + REAL(dp), OPTIONAL :: pout_dnuc(kbdim,klev,4) REAL(dp) :: pm6rp(kbdim,klev,nclass), & ! mean mode actual radius (wet for soluble and dry for insoluble modes) [m] pm6dry(kbdim,klev,nsol), & ! dry radius for soluble modes [m] diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index d1ab81f2..d475d84e 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -56,7 +56,7 @@ SUBROUTINE HAMM7_INTERFACE( & ! │ May. 2020 - V. Huijnen : Modifications for TM5M7 │ ! │ Sep. 2020 - T. Bergman : TM5M7 work │ ! │ Apr. 2024 - Lianghai Wu : revision for CY48r1 │ -! │ May. 2024 - R. Checa-Garcia: revision for CY48r1 and refactory │ +! │ May. 2024 - R. Checa-Garcia: revision for CY48r1 and refactoring │ ! │ │ ! ╰────────────────────────────────────────────────────────────────────────────╯ @@ -289,7 +289,6 @@ SUBROUTINE HAMM7_INTERFACE( & REAL(KIND=JPRB) :: ZTAER(KLON,KLEV) REAL(KIND=JPRB) :: ZTAERO(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO) REAL(KIND=JPRB) :: ZRH(KLON,KLEV),ZTENC0(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NCHEM)!,ZTSO4(KLON,KLEV) -!REAL(KIND=JPRB) :: ZM6RP(KLON,KLEV,NMOD) REAL(KIND=JPRB) :: ZM6RP(KLON,KLEV,NMOD)! NMOD=7 REAL(KIND=JPRB) :: ZM6DRY(KLON,KLEV,NSOL) REAL(KIND=JPRB) :: ZWW(KLON,KLEV,NMOD) @@ -322,7 +321,6 @@ SUBROUTINE HAMM7_INTERFACE( & LOGICAL :: LLIQCLD(KLON,KLEV) ! logical for liquid cloud LOGICAL :: LICECLD(KLON,KLEV) ! logical for ice cloud - REAL(KIND=JPRB), PARAMETER :: ZEPSEC=1e-14_JPRB REAL(KIND=JPRB), PARAMETER :: ZMIN_CDNC=10.0_JPRB !eehol: minimum CDNC (can be changed but for now 10 cm-3) REAL(KIND=JPRB), PARAMETER :: ZDEF_CDNC=125.0_JPRB !eehol: default CDNC (can be changed but for now 125 cm-3) @@ -380,7 +378,7 @@ SUBROUTINE HAMM7_INTERFACE( & REAL(KIND=JPRB) :: ZDUM2D(KLON,KLEV) !convective flux needed only for conv. case (see cuflx) REAL(KIND=JPRB) :: ZLFRAC_SO2(KLON,KLEV) !liquid tracer fraction (SO2) -ham specific- REAL(KIND=JPRB) :: ZDPG(KLON,KLEV) !dp/g -REAL(KIND=JPRB) :: ZQP(KLON,KLEV) !full level humidity with treshold +REAL(KIND=JPRB) :: ZQP(KLON,KLEV) !full level humidity with threshold LOGICAL :: LSTRAT !logical switch for stratiform or convective case (TRUE for strat., FALSE for conv.) REAL(KIND=JPRB) :: ZFEVAPR_cov(KLON,KLEV) !evaporation of rain, convective case [kg/m2/s] @@ -625,16 +623,14 @@ SUBROUTINE HAMM7_INTERFACE( & ENDDO ENDDO -!NOT-AN-OPTION-WITH-M7 IF(LAERCHEM) then DO JEXT=1,NCHEM - ITRC=ITRC+1 - DO JK=1,KLEV - DO JL=KIDIA,KFDIA - ZCEN(JL,JK,ITRC) = PGFL(JL,JK,YCHEM(JEXT)%MP9_PH) - ENDDO + ITRC=ITRC+1 + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZCEN(JL,JK,ITRC) = PGFL(JL,JK,YCHEM(JEXT)%MP9_PH) ENDDO ENDDO -!NOT-AN-OPTION-WITH-M7 ENDIF +ENDDO !DO JAER=1,NACTAERO ! DO JK=1,KLEV @@ -865,9 +861,6 @@ SUBROUTINE HAMM7_INTERFACE( & ! --> calling the microphysics scheme -!THIS-IS-NOT-NEEDED SELECT CASE (TRIM(AERO_SCHEME)) -!THIS-IS-NOT-NEEDED -!THIS-IS-NOT-NEEDED CASE("hamm7") ! Initializations for submodel interface ZGRVOL(KIDIA:KFDIA,1:KLEV) = 1.79e12_JPRB ! ZGRVOL is only used for diagnostics (only when HAMMOZ is on) ZPBL = 1 ! boundary layer top = 1 (ITOP=1) @@ -926,9 +919,11 @@ SUBROUTINE HAMM7_INTERFACE( & ZTKEM1(KIDIA:KFDIA,1:KLEV) = 0._JPRB ! turbulent kinetic energy as zero for now as it is not used (YET!) + ! LWP DO JK=1,KLEV - DO JL=KIDIA,KFDIA - ZTMPA = 1.0_JPRB/MAX(ZAP(JL,JK),ZEPSEC) + DO JL=KIDIA,KFDIA + IF ( ZAP(JL,JK) >=0.001_JPRB ) THEN + ZTMPA = 1.0_JPRB/ZAP(JL,JK) LLIQCLD(JL,JK) = ( PLP(JL,JK)*ZTMPA ) > ZEPSEC ! logical for liquid cloud LICECLD(JL,JK) = ( PIP(JL,JK)*ZTMPA ) > ZEPSEC ! logical for ice cloud ZQLWP(JL,JK) = MIN(MAX(0._JPRB, PLP(JL,JK)*ZTMPA), RCLDMAX) ! lwc @@ -980,15 +975,9 @@ SUBROUTINE HAMM7_INTERFACE( & & ZSMAXMN, ZM6DRY, ZXTP1, KTRAC, ZSIGMA_W, ZFRACN, ZMIN_CDNC, ZDEF_CDNC, & & ZQLWP, LLIQCLD, LICECLD, ZDEF_RE_LIQ, ZDEF_RE_ICE) - !<-- Store CDNC (number of activated particles) and ICNC as a number mixing ratio to tracer values - ZXTM1(KIDIA:KFDIA,1:KLEV,idt_cdnc) = (MAX(ZCDNCACT(KIDIA:KFDIA,1:KLEV),((1.0E6_JPRB)*ZMIN_CDNC)))/ZRHO(KIDIA:KFDIA,1:KLEV) ! [#/kg] and treshold CDNC - ZXTM1(KIDIA:KFDIA,1:KLEV,idt_icnc) = (1.0E6_JPRB)*ZICNC(KIDIA:KFDIA,1:KLEV)/ZRHO(KIDIA:KFDIA,1:KLEV) !ice crystal number conc = #/cm3 --> number mix rat [#/kg] - - PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH) = MAX(((1.0E-6_JPRB)*ZCDNCACT(KIDIA:KFDIA,1:KLEV)),ZMIN_CDNC) ! add CDNC to PGFL field (convert from #/m3 to #/cm3) and treshold minimum value - PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH) = ZICNC(KIDIA:KFDIA,1:KLEV) ! add ICNC to PGFL field (does not need convert) - ! add effective radii to PGFL fields - PGFL(KIDIA:KFDIA,1:KLEV,YRE_LIQ%MP9_PH) = 1.0E-06_JPRB * reffl(KIDIA:KFDIA,1:KLEV,ZKROW) ! convert um to meters and save to PGFL fields - PGFL(KIDIA:KFDIA,1:KLEV,YRE_ICE%MP9_PH) = 1.0E-06_JPRB * reffi(KIDIA:KFDIA,1:KLEV,ZKROW) ! convert um to meters and save to PGFL fields + ! Store effective radii in PGFL + PGFL(KIDIA:KFDIA,1:KLEV,YRE_LIQ%MP9_PH) = 1.0E-06_JPRB * REFFL(KIDIA:KFDIA,1:KLEV,ZKROW) ! convert um to meters + PGFL(KIDIA:KFDIA,1:KLEV,YRE_ICE%MP9_PH) = 1.0E-06_JPRB * REFFI(KIDIA:KFDIA,1:KLEV,ZKROW) ! convert um to meters ELSE IF (NCLOUDACT == 2) THEN ! AR&G scheme @@ -1001,7 +990,7 @@ SUBROUTINE HAMM7_INTERFACE( & !---calculate updraft velocity ZWCAPE(KIDIA:KFDIA) = 0._JPRB ! CAPE as zero as it is not used - CALL activ_updraft(KFDIA, KLON, KLEV, ZKROW, & ! krow = 1 + CALL ACTIV_UPDRAFT(KFDIA, KLON, KLEV, ZKROW, & ! krow = 1 ZTKEM1, ZWCAPE, PVERVEL, ZRHO, & ! turbulent kinetic energy, CAPE contr. to conv. vert. veloc. [m s-1], large scale vert. veloc. ZW, ZWPDF) @@ -1009,13 +998,13 @@ SUBROUTINE HAMM7_INTERFACE( & ZXTP1(KIDIA:KFDIA,1:KLEV,JT) = ZXTM1(KIDIA:KFDIA,1:KLEV,JT) + ZXTTE(KIDIA:KFDIA,1:KLEV,JT) * TIME_STEP_LEN END DO - IF (ncd_activ == 2 .OR. nccndiag > 0) THEN - CALL ham_activ_koehler_ab(KFDIA, KLON, KLEV, ZKROW, KTDIA, & ! krow=1 ktdia=1 + IF (NCD_ACTIV == 2 .OR. NCCNDIAG > 0) THEN + CALL HAM_ACTIV_KOEHLER_AB(KFDIA, KLON, KLEV, ZKROW, KTDIA, & ! krow=1 ktdia=1 ZXTP1, PTP, ZA, ZB) END IF - DO JCLASS = 1,nclass! nclass=7 - IF (sizeclass(jclass)%lsoluble) THEN + DO JCLASS = 1,NCLASS + IF (SIZECLASS(JCLASS)%LSOLUBLE) THEN ZRDRY(KIDIA:KFDIA,1:KLEV,JCLASS) = ZM6DRY(KIDIA:KFDIA,1:KLEV,JCLASS) !soluble modes rdry from rdry_m7 ELSE ZRDRY(KIDIA:KFDIA,1:KLEV,JCLASS) = ZM6RP(KIDIA:KFDIA,1:KLEV,JCLASS) !insoluble modes rdry from rwet_m7 @@ -1029,7 +1018,7 @@ SUBROUTINE HAMM7_INTERFACE( & ENDDO ENDDO - ZWPDF(KIDIA:KFDIA,1:KLEV,:) = MAX(ZWPDF(KIDIA:KFDIA,1:KLEV,:),1.0E-6_JPRB) !eehol: treshold vvel PDF to 1e-6 to get rid of 0 division + ZWPDF(KIDIA:KFDIA,1:KLEV,:) = MAX(ZWPDF(KIDIA:KFDIA,1:KLEV,:),1.0E-6_JPRB) !eehol: threshold vvel PDF to 1e-6 to get rid of 0 division CALL HAM_ACTIV_ABDULRAZZAK_GHAN( KFDIA, KLON, KLEV, ZKROW, KTDIA, & ! in original 1 = ktdia... for diagnostics so krow=1 and ktdia=1 & ZCDNCACT, ZESW, ZRHO, & ! number of activated particles, saturation vapor pressure, air density @@ -1037,50 +1026,16 @@ SUBROUTINE HAMM7_INTERFACE( & & ZW, ZWPDF, ZA, ZB, ZRDRY, & ! mean udr veloc, pdf of udr. veloc, Koehler A, Koehler B, dry radius & ZNACT, ZFRACN, ZSC, ZRC, ZSMAX) ! num. act. part. per mode, frac ", crit. ssat., crit. radius, max ssat - !<-- End activation for HAM-M7 - !----------------------------------------------------------------- - - ! treshold fraction of activated particles to gridcells with only liquid clouds + ! threshold fraction of activated particles to gridcells with only liquid clouds DO JCLASS = 1,NCLASS - ZFRACN(KIDIA:KFDIA,1:KLEV,JCLASS) = MERGE(ZFRACN(KIDIA:KFDIA,1:KLEV,JCLASS),0._JPRB,LLIQCLD(KIDIA:KFDIA,1:KLEV)) + ZFRACN(KIDIA:KFDIA,1:KLEV,JCLASS) = MERGE(ZFRACN(KIDIA:KFDIA,1:KLEV,JCLASS),0._JPRB,LLIQCLD(KIDIA:KFDIA,1:KLEV)) ENDDO ! threshold CDNC and ICNC to grid cells with only liquid or ice clouds ZCDNCACT(KIDIA:KFDIA,1:KLEV) = MERGE(ZCDNCACT(KIDIA:KFDIA,1:KLEV),1.0E6_JPRB*ZDEF_CDNC,LLIQCLD(KIDIA:KFDIA,1:KLEV)) !mask only values inside liq cloud ZICNC(KIDIA:KFDIA,1:KLEV) = MERGE(ZICNC(KIDIA:KFDIA,1:KLEV), RNICE, LICECLD(KIDIA:KFDIA,1:KLEV)) !mask only values inside ice cloud - !----------------------------------------------------------------- - !--> Calculation for effective radii and put to PGFL fields - - ! put default values for effective radii - reffl(KIDIA:KFDIA,1:KLEV,ZKROW) = 4._JPRB ! comes from liquid effective radius routine (PP_MIN_RE_UM) - reffi(KIDIA:KFDIA,1:KLEV,ZKROW) = 80._JPRB*0.64952_JPRB ! comes from ice effective radius routine (ZDEFAULT_RE_UM) - - ! liquid effective radius - DO JK=1,KLEV - DO JL=KIDIA,KFDIA - ! effective radius calculated similarly as in radlswr.F90 - ! 2.387e-10 is 3/(4*pi*rho_liq*10^6) [10^6 for N in right units] - ZRE_LIQ(JL,JK) = 1.0E+6_JPRB*(2.387e-10_JPRB*ZRHO(JL,JK)*ZQLWP(JL,JK)/(MAX(PGFL(JL,JK,YCDNC%MP9_PH),ZMIN_CDNC)))**0.333_JPRB ! calculate effective radius in um (use minimum value for CDNC if CDNC is small) - END DO - END DO - ! Add liq. eff. rad. to HAM variables (only if there is liquid cloud else minimum value) - REFFL(KIDIA:KFDIA,1:KLEV,ZKROW) = MERGE(ZRE_LIQ(KIDIA:KFDIA,1:KLEV),4._JPRB,LLIQCLD(KIDIA:KFDIA,1:KLEV)) - CALL ICE_EFFECTIVE_RADIUS(YRERAD, YDSPP_CONFIG, KIDIA, KFDIA, KLON, KLEV, & - & PRSF1, PTP, ZAP, PIP, PSP, PGEMU, & ! pressure, temp, cloud fr., IWC, SWC, sine of latitude - & reffi(1:KLON,1:KLEV,ZKROW)) ! ice effective radius (updated to mo_activ variable 'reffi' which used in mo_ham_wetdep) - - ! only if there is ice cloud else minimum value - REFFI(KIDIA:KFDIA,1:KLEV,ZKROW) = MERGE(REFFI(KIDIA:KFDIA,1:KLEV,ZKROW), 20._JPRB, LICECLD(KIDIA:KFDIA,1:KLEV)) - - ! add effective radii to PGFL fields - PGFL(KIDIA:KFDIA,1:KLEV,YRE_LIQ%MP9_PH) = 1.0E-06_JPRB * reffl(KIDIA:KFDIA,1:KLEV,ZKROW) ! convert um to meters and save to PGFL fields - PGFL(KIDIA:KFDIA,1:KLEV,YRE_ICE%MP9_PH) = 1.0E-06_JPRB * reffi(KIDIA:KFDIA,1:KLEV,ZKROW) ! convert um to meters and save to PGFL fields - - !<-- End calculation for effective radii - !----------------------------------------------------------------- - - ELSE !eehol: default values if neither activation is used + ELSE !Default values if no activation scheme is used ZFRACN(KIDIA:KFDIA,:,:) = 0._JPRB !init @@ -1131,41 +1086,6 @@ SUBROUTINE HAMM7_INTERFACE( & ZCDNCACT(KIDIA:KFDIA,1:KLEV) = MERGE(ZCDNCACT(KIDIA:KFDIA,1:KLEV),1.0E6_JPRB*ZDEF_CDNC,LLIQCLD(KIDIA:KFDIA,1:KLEV)) !mask only values inside liq cloud ZICNC(KIDIA:KFDIA,1:KLEV) = MERGE(ZICNC(KIDIA:KFDIA,1:KLEV), RNICE, LICECLD(KIDIA:KFDIA,1:KLEV)) !mask only values inside ice cloud - !<-- Store CDNC (number of activated particles) and ICNC as a number mixing ratio to tracer values - ZXTM1(KIDIA:KFDIA,1:KLEV,idt_cdnc) = (MAX(ZCDNCACT(KIDIA:KFDIA,1:KLEV),((1.0E6_JPRB)*ZMIN_CDNC)))/ZRHO(KIDIA:KFDIA,1:KLEV) ! [#/kg] and treshold CDNC to 1 cm-3 - ZXTM1(KIDIA:KFDIA,1:KLEV,idt_icnc) = (1.0E6_JPRB)*ZICNC(KIDIA:KFDIA,1:KLEV)/ZRHO(KIDIA:KFDIA,1:KLEV) !ice crystal number conc = #/cm3 --> number mix rat [#/kg] - - PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH) = 1.0E-6_JPRB*( MAX(ZCDNCACT(KIDIA:KFDIA,1:KLEV), ZMIN_CDNC*1.0E+6_JPRB)) ! convert from #/m3 to #/cm3 and treshold minimum value to 1 cm-3 - PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH) = MAX( ZICNC(KIDIA:KFDIA,1:KLEV), 0.027_JPRB) ! no conversion needed: already in #/cm3, just max of default value (RNICE in sucldp.F90) and icnc - - ! put default values for effective radii - reffl(KIDIA:KFDIA,1:KLEV,ZKROW) = 4._JPRB ! comes from liquid effective radius routine (PP_MIN_RE_UM) - reffi(KIDIA:KFDIA,1:KLEV,ZKROW) = 80._JPRB*0.64952_JPRB ! comes from ice effective radius routine (ZDEFAULT_RE_UM) - - !liquid effective radius - DO JK=1,KLEV - DO JL=KIDIA,KFDIA - ! effective radius calculated similarly as in radlswr.F90 - ! 2.387e-10 is 3/(4*pi*rho_liq*10^6) [10^6 for N in right units] - ZRE_LIQ(JL,JK) = 1.E+6_JPRB*(2.387e-10_JPRB*ZRHO(JL,JK)*ZQLWP(JL,JK)/(MAX(PGFL(JL,JK,YCDNC%MP9_PH),ZMIN_CDNC)))**0.333_JPRB ! calculate effective radius in um (use minimum value for CDNC if CDNC is small) - END DO - END DO - - ! Add liq. eff. rad. to HAM variables (only if there is liquid cloud else minimum value) - REFFL(KIDIA:KFDIA,1:KLEV,ZKROW) = MERGE(ZRE_LIQ(KIDIA:KFDIA,1:KLEV),4._JPRB,LLIQCLD(KIDIA:KFDIA,1:KLEV)) - - !ice effective radius - CALL ICE_EFFECTIVE_RADIUS(YRERAD, YDSPP_CONFIG, KIDIA, KFDIA, KLON, KLEV, & - & PRSF1, PTP, ZAP, PIP, PSP, PGEMU, & ! pressure, temp, cloud fr., IWC, SWC, sine of latitude - & reffi(1:KLON,1:KLEV,ZKROW)) ! ice effective radius (updated to mo_activ variable 'reffi' which used in mo_ham_wetdep) - - ! only if there is ice cloud else minimum value - REFFI(KIDIA:KFDIA,1:KLEV,ZKROW) = MERGE(REFFI(KIDIA:KFDIA,1:KLEV,ZKROW), 20._JPRB, LICECLD(KIDIA:KFDIA,1:KLEV)) - - ! add effective radii to PGFL fields - PGFL(KIDIA:KFDIA,1:KLEV,YRE_LIQ%MP9_PH) = 1.0E-06_JPRB * reffl(KIDIA:KFDIA,1:KLEV,ZKROW) ! convert um to meters and save to PGFL fields - PGFL(KIDIA:KFDIA,1:KLEV,YRE_ICE%MP9_PH) = 1.0E-06_JPRB * reffi(KIDIA:KFDIA,1:KLEV,ZKROW) ! convert um to meters and save to PGFL fields - END IF CLDACT CALL GSTATS(2502,1) @@ -1209,55 +1129,11 @@ SUBROUTINE HAMM7_INTERFACE( & ENDIF !----------------------------------------------------------------- - !--> Calculation of effective radii and put to PGFL fields - - ! put default values for effective radii - reffl(KIDIA:KFDIA,1:KLEV,ZKROW) = 4._JPRB ! comes from liquid effective radius routine (PP_MIN_RE_UM) - reffi(KIDIA:KFDIA,1:KLEV,ZKROW) = 80._JPRB*0.64952_JPRB ! comes from ice effective radius routine (ZDEFAULT_RE_UM) - - ! liquid effective radius - DO JK=1,KLEV - DO JL=KIDIA,KFDIA - IF ( ZAP(JL,JK) >=0.001_JPRB ) THEN - ZTMPA = 1.0_JPRB/ZAP(JL,JK) - LLIQCLD(JL,JK) = ( PLP(JL,JK)*ZTMPA ) > ZEPSEC ! logical for liquid cloud - LICECLD(JL,JK) = ( PIP(JL,JK)*ZTMPA ) > ZEPSEC ! logical for ice cloud - ZQLWP2 = MAX(0._JPRB, PLP(JL,JK)*ZTMPA) ! lwp - - ! effective radius (in um) calculated similarly as in radlswr.F90 - ! 2.387e-10 is 3/(4*pi*rho_liq*10^6) [10^6 for N in right units] - ZRE_LIQ(JL,JK) = 1.E+06_JPRB*(2.387e-10_JPRB*ZRHO(JL,JK)*ZQLWP2/PGFL(JL,JK,YCDNC%MP9_PH))**0.333_JPRB - ELSE - LLIQCLD(JL,JK) = .FALSE. - LICECLD(JL,JK) = .FALSE. - END IF - END DO - END DO - - ! Add liq. eff. rad. to HAM variables (only if there is liquid cloud else minimum value) - REFFL(KIDIA:KFDIA,1:KLEV,ZKROW) = MERGE(ZRE_LIQ(KIDIA:KFDIA,1:KLEV), 4._JPRB, LLIQCLD(KIDIA:KFDIA,1:KLEV)) - - CALL ICE_EFFECTIVE_RADIUS(YRERAD, YDSPP_CONFIG, KIDIA, KFDIA, KLON, KLEV, & - & PRSF1, PTP, ZAP, PIP, PSP, PGEMU, & ! pressure, temp, cloud fr., IWC, SWC, sine of latitude - & reffi(1:KLON,1:KLEV,ZKROW)) ! ice effective radius (updated to mo_activ variable 'reffi' which used in mo_ham_wetdep) - - ! only if there is ice cloud else minimum value - REFFI(KIDIA:KFDIA,1:KLEV,ZKROW) = MERGE(REFFI(KIDIA:KFDIA,1:KLEV,ZKROW), 20._JPRB, LICECLD(KIDIA:KFDIA,1:KLEV)) - - ! add effective radii to PGFL fields - PGFL(KIDIA:KFDIA,1:KLEV,YRE_LIQ%MP9_PH) = 1.0E-06_JPRB * reffl(KIDIA:KFDIA,1:KLEV,ZKROW) ! convert um to meters and save to PGFL fields - PGFL(KIDIA:KFDIA,1:KLEV,YRE_ICE%MP9_PH) = 1.0E-06_JPRB * reffi(KIDIA:KFDIA,1:KLEV,ZKROW) ! convert um to meters and save to PGFL fields - - !<-- End calculation of effective radii - !----------------------------------------------------------------- - !--- Mass conserving correction of negative tracer values: CALL XT_BORROW(KFDIA, KLON, KLEV, KLEV+1, NTRAC, & PRSF1, PRS1, & ZXTM1, ZXTTE) - ! RCHG -> This is wetdep interface it can be a subroutine afer "CONTAINS" - ! !----------------------------------------------------------------- !--> Wet deposition for HAM-M7 CALL GSTATS(2503,0) @@ -1532,7 +1408,7 @@ SUBROUTINE HAMM7_INTERFACE( & ZLOLAND(JL) = .TRUE. ZAZ0W(JL) = 0._JPRB END IF - ZAZ0W(JL) = MAX(1.0E-5_JPRB,ZAZ0W(JL)) ! treshold roughness length to min value + ZAZ0W(JL) = MAX(1.0E-5_JPRB,ZAZ0W(JL)) ! threshold roughness length to min value ZFRW(JL) = MAX(0.,1.-PLSM(JL)-PCI(JL)) ! water fraction = 1 - land mask - sea ice fraction ZCVS(JL) = PFRTI(JL,5)+PFRTI(JL,7) ! snow cover fraction = Snow on low-veg + snow on bare-soil + snow under high-veg ZCVW(JL) = PFRTI(JL,3) ! wet skin fraction @@ -1624,11 +1500,6 @@ SUBROUTINE HAMM7_INTERFACE( & !<-- End adding HAM modified tendency back to PTENC !----------------------------------------------------------------- -!THIS-IS-NOT-NEEDED CASE DEFAULT -!THIS-IS-NOT-NEEDED ! this case should never occur, as it is handled in the calling subroutine -!THIS-IS-NOT-NEEDED CALL ABOR1(" AEROSOL SCHEME "//TRIM(AERO_SCHEME)//" IS NOT HANDLED IN HAMM7" ) -!THIS-IS-NOT-NEEDED -!THIS-IS-NOT-NEEDED END SELECT ! ZTSO4 is filled only if LAERCHEM=F, which is not possible with M7 - Commented out !THIS-IS-NEVER-USED @@ -1650,12 +1521,12 @@ SUBROUTINE HAMM7_INTERFACE( & DO JAER=1,NACTAERO - DO JK=1,KLEV - DO JL=KIDIA,KFDIA - ZAER(JL,JK) = ZCEN(JL,JK,KAERO(JAER)) - ZTAER(JL,JK)= PTENC(JL,JK,KAERO(JAER)) - ENDDO + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZAER(JL,JK) = ZCEN(JL,JK,KAERO(JAER)) + ZTAER(JL,JK)= PTENC(JL,JK,KAERO(JAER)) ENDDO + ENDDO CALL AER_NEGAT & & ( YREAERATM, KIDIA , KFDIA, KLON , KLEV, & @@ -1680,13 +1551,10 @@ SUBROUTINE HAMM7_INTERFACE( & & ZDP, PTSPHY, ZTAERO ,ZTAERO0, PEXTRA(:,NCHEM+1:NCHEM+NACTAERO,IEXTR_NG)) ENDIF - -! do not fix the tendencies for now, number concentration fixes will break the -! correlation between mass and number + ! do not fix the tendencies for now, number concentration fixes will break the + ! correlation between mass and number PTENC(KIDIA:KFDIA,1:KLEV,KAERO(1):KAERO(NACTAERO)) = ZTAERO(KIDIA:KFDIA,1:KLEV,1:NACTAERO) -!ELSE -! ZAERNGT(:,:)=0._JPRB ENDIF !------------------------------------------------------------------------------ @@ -1695,7 +1563,7 @@ SUBROUTINE HAMM7_INTERFACE( & DO JAER=1,NACTAERO DO JL=KIDIA,KFDIA - PAERODDF(JL,JAER,1)=PAERSRC(JL,JAER) !aerosol so4 source term + PAERODDF(JL,JAER,1)=PAERSRC(JL,JAER) ! aerosol so4 source term PAERODDF(JL,JAER,2)=PAERDDP(JL,JAER) ! aerosol dry deposition PAERODDF(JL,JAER,3)=PAERSDM(JL,JAER) ! aerosol sedimentation PAERODDF(JL,JAER,4)=0.0 ! (todo) so2 sink added to scavenging diff --git a/ifs-source/arpifs/phys_ec/aer_negat.F90 b/ifs-source/arpifs/phys_ec/aer_negat.F90 index e611fe3b..36dff811 100644 --- a/ifs-source/arpifs/phys_ec/aer_negat.F90 +++ b/ifs-source/arpifs/phys_ec/aer_negat.F90 @@ -66,8 +66,7 @@ SUBROUTINE AER_NEGAT & REAL(KIND=JPRB) ,INTENT(INOUT) :: PTAERO(KLON,KLEV) REAL(KIND=JPRB) ,INTENT(IN) :: PAPHP1(KLON,KLEV+1) -!REAL(KIND=JPRB) ,INTENT(OUT) :: PFAERNG(KLON,KLEV+1) -REAL(KIND=JPRB) ,INTENT(OUT) :: PFAERNG(KLON,KLEV) +REAL(KIND=JPRB) ,INTENT(OUT) :: PFAERNG(KLON,KLEV) !* flux outputs @@ -80,6 +79,7 @@ SUBROUTINE AER_NEGAT & REAL(KIND=JPRB) :: ZCONS1, ZDAER, ZGDPH, ZTMST REAL(KIND=JPHOOK) :: ZHOOK_HANDLE + !------------------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('AER_NEGAT',0,ZHOOK_HANDLE) ASSOCIATE(REPSCAER=>YREAERATM%REPSCAER) @@ -139,7 +139,6 @@ SUBROUTINE AER_NEGAT & DO JL=KIDIA,KFDIA PFAERNG(JL,1)=0.0_JPRB ENDDO -!DO JK=1,KLEV DO JK=1,KLEV-1 DO JL=KIDIA,KFDIA ZGDPH = -RG /(PAPHP1(JL,JK+1)-PAPHP1(JL,JK)) From 41b7c12334d3a75eeabec24fd24c77601ba359d5 Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Wed, 20 May 2026 13:05:13 +0000 Subject: [PATCH 123/129] Pull request #77: OIFS-672 Remove double counting of coagulated particles Merge in ~NM6/openifs-48r1 from knmi-m7-coagulation-fix to knmi-m7 Squashed commit of the following: commit 0b9a6b94aa0bc2139eb2529f2f2e28f5caf34074 Author: Philippe Le Sager Date: Wed May 20 15:04:18 2026 +0200 Cleanup commit 4da63c69d631748bfb2e51a5437760a6697d6f52 Merge: c5e128e 66c890a Author: Philippe Le Sager Date: Wed May 20 15:00:11 2026 +0200 Merge remote branch 'origin/knmi-m7' into knmi-m7-coagulation-fix commit c5e128ee44463e500f4f9600dcf4da5dbfed3f17 Author: Harri Kokkola Date: Tue Mar 17 09:27:41 2026 +0200 Fix for Issue OIFS-672 Double counting of mass in Subroutine m7_delcoa in mo_ham_m7.F90 --- ifs-source/arpifs/m7/module/mo_ham_m7.F90 | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/ifs-source/arpifs/m7/module/mo_ham_m7.F90 b/ifs-source/arpifs/m7/module/mo_ham_m7.F90 index cda7565b..ad942064 100644 --- a/ifs-source/arpifs/m7/module/mo_ham_m7.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_m7.F90 @@ -4177,12 +4177,9 @@ SUBROUTINE m7_delcoa(kproma, kbdim, klev, krow, paerml, & ! nucleation mode (transfers to the soluble modes ! of the particles coagulating with the nucleation mode ! are done in m7_concoag): - - paerml(jl,jk,ibcki)=( zaernt + zansq + pbfract5(jl,jk,1)*zanli(jl,jk,iaiti) ) * & - pttn(jl,jk,ibcki)*1.e12_dp + paerml(jl,jk,ibcki) = zaernt * pttn(jl,jk,ibcki) * 1.e12_dp + paerml(jl,jk,iocki) = zaernt * pttn(jl,jk,iocki) * 1.e12_dp - paerml(jl,jk,iocki)=( zaernt + zansq + pbfract5(jl,jk,1)*zanli(jl,jk,iaiti) ) * & - pttn(jl,jk,iocki)*1.e12_dp !--- 1.2.4) Change the numbers of the insoluble aitken mode due to ! intra-modal coagulation: @@ -4208,9 +4205,9 @@ SUBROUTINE m7_delcoa(kproma, kbdim, klev, krow, paerml, & jn = speclist(jspec)%iaerocomp(iaiti) !<>dod deleted isoa_ix jn = speclist(jspec)%iaerocomp(iaits) From 52e7fe1ceaf68f7594e2381477d0efcd8dfbef45 Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Wed, 20 May 2026 13:14:25 +0000 Subject: [PATCH 124/129] Pull request #73: OpenMP fixes in radiation Merge in ~NM6/openifs-48r1 from bugfix/openmp to knmi-m7 Squashed commit of the following: commit 77d946ca265898b1241a8207ba012ca068842d7a Merge: d017f72 ccfdc0b Author: Philippe Le Sager Date: Wed May 20 15:08:12 2026 +0200 Merge remote branch 'origin/knmi-m7' into bugfix/openmp commit d017f72ced5d6993fac33177d0415165934871b6 Author: Philippe Le Sager Date: Thu Feb 19 13:02:46 2026 +0100 OpenMP fixes --- ifs-source/arpifs/phys_radi/radintg.F90 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ifs-source/arpifs/phys_radi/radintg.F90 b/ifs-source/arpifs/phys_radi/radintg.F90 index bffb6413..b70e52b7 100644 --- a/ifs-source/arpifs/phys_radi/radintg.F90 +++ b/ifs-source/arpifs/phys_radi/radintg.F90 @@ -829,7 +829,7 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE, & CALL GSTATS(1205,0) !$OMP PARALLEL DO SCHEDULE(STATIC)& -!$OMP& PRIVATE(JSTGLO,JK,JSW,JLW,JL,IAE,IBEG,IEND,IL,IB,IARP,JARP,& +!$OMP& PRIVATE(JSTGLO,JK,JSW,JLW,JL,IAE,IBEG,IEND,IL,IB,IARP,JARP,JAERO,& !$OMP& ZCLC,ZQLWP,ZQIWP,ZQRWP,ZQSWP,ZPQO3,ZCAPH,ZCHTI) DO JSTGLO=1,NGPTOT,NRPROMA IBEG=JSTGLO @@ -1323,7 +1323,7 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE, & CALL GSTATS(1209,0) !$OMP PARALLEL DO SCHEDULE(DYNAMIC,1)& -!$OMP& PRIVATE(JSTGLO,J,JLEV,JSW,JL,IAE,IBEG,IEND,I,I1,I2,IL,IB,LLDOLAST,& +!$OMP& PRIVATE(JSTGLO,J,JLEV,JSW,JL,IAE,IBEG,IEND,I,I1,I2,IL,IB,LLDOLAST,JAERO,& !$OMP& ZQAERO,ZQAER,ZQOZ,ZQCO2,ZQCH4,ZQN2O,ZQNO2,ZQC11,ZQC12,ZQOZO,ZQC22,ZQCL4,ZECPO3) DO JSTGLO=1,RADGRID%NGPTOT,NRPROMA IBEG=JSTGLO @@ -1985,7 +1985,7 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE, & CALL GSTATS(1213,0) !$OMP PARALLEL DO SCHEDULE(STATIC) & -!$OMP& PRIVATE(JSTGLO,JK,IBEG,IEND,IL,IB,JSW,& +!$OMP& PRIVATE(JSTGLO,JK,IBEG,IEND,IL,IB,JSW,JL,I,IAUX,& !$OMP& ZTRSO,ZEMTD,ZEMTU,ZTRSC,ZEMTC,ZTRSOD,ZTRSODC,ZEMTDC,ZAERMACCM,ZRHCL,ZQSAT,IFLAG,& !$OMP& ZAERTAUL, ZAERASYL, ZAEROMGL, ZAERTAUS, ZAERASYS, ZAEROMGS,ZTAUAER,IAE,ZAERTAULJ,ZAERTAUSJ,& !$OMP& ZFRSOD,ZFRTED,ZFRSODC,ZFRTEDC,ZEMIT,ZSUDU,ZUVDF,ZPARF,& From 1ff5f7eab037558269835715fc94750e6d2b92b6 Mon Sep 17 00:00:00 2001 From: Simone Vacondio Date: Wed, 20 May 2026 18:22:01 +0000 Subject: [PATCH 125/129] Pull request #79: Update MN5 arch and fix ifs-test launch script Merge in ~NM6/openifs-48r1 from fix/mn5-arch-update to knmi-m7 Squashed commit of the following: commit 46cef349f7579a417be376efbfc61bdcb0cdeedc Merge: 368ecdc 6599ae5 Author: Philippe Le Sager Date: Wed May 20 15:24:02 2026 +0200 Merge remote branch 'origin/knmi-m7' into fix/mn5-arch-update commit 368ecdc013b23bbe38bc53b0891c4e142fbc9d9d Author: Simone Vacondio Date: Fri May 8 10:08:59 2026 +0200 Remove duplicated if block commit 4efb4de8ab4751357a6d66f0c0408bb7225caa38 Author: Simone Vacondio Date: Thu May 7 08:32:06 2026 +0000 Remove some exports from MN5 IMPI arch commit e7188d930da85ee9014a4e6360bd661a81bf018b Author: Simone Vacondio Date: Wed May 6 13:51:48 2026 +0000 Fix "if" syntax in set_launcher.bash --- arch/bsc/mn5-gpp/intel/intelmpi/env.sh | 7 ------- ifs-test/bin/set_launcher.bash | 4 ++-- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/arch/bsc/mn5-gpp/intel/intelmpi/env.sh b/arch/bsc/mn5-gpp/intel/intelmpi/env.sh index 1ff5b69a..b36def0f 100644 --- a/arch/bsc/mn5-gpp/intel/intelmpi/env.sh +++ b/arch/bsc/mn5-gpp/intel/intelmpi/env.sh @@ -31,13 +31,6 @@ module_load python/3.12.1 export TBBMALLOC_DIR="/apps/GPP/ONEAPI/2023.2.0/tbb/2021.10.0/lib/intel64/gcc4.8" export TBBROOT="/apps/GPP/ONEAPI/2023.2.0/tbb/2021.10.0" -export TBB_MALLOC_USE_HUGE_PAGES=1 -export TBB_MALLOC_SET_HUGE_SIZE_THRESHOLD=0 -export I_MPI_FABRICS="shm:ofi" -export I_MPI_OFI_PROVIDER="verbs" -export FI_PROVIDER="verbs" -export I_MPI_PLATFORM="spr" -export UCX_TLS="rc,sm,self" # or rc,self if no shared memory # Setting required for bit reproducibility with Intel MKL: export MKL_CBWR=AUTO,STRICT diff --git a/ifs-test/bin/set_launcher.bash b/ifs-test/bin/set_launcher.bash index 76073012..1b95a9e8 100644 --- a/ifs-test/bin/set_launcher.bash +++ b/ifs-test/bin/set_launcher.bash @@ -12,13 +12,13 @@ if [[ "${ECPLATFORM:-"unset"}" == "hpc2020" ]] ; then LAUNCHER_OTHER_FLAGS="--gres=ssdtmp:0" export OMP_PROC_BIND=true export OMP_PLACES=threads -elif [[ "${ECPLATFORM:-"unset"}" == "puhti" ]] +elif [[ "${ECPLATFORM:-"unset"}" == "puhti" ]] ; then LAUNCHER="srun" LAUNCHER_NPROC_FLAG="-n" LAUNCHER_NTHREAD_FLAG="--cpus-per-task" export OMP_PROC_BIND=true export OMP_PLACES=threads -elif [[ "${ECPLATFORM:-"unset"}" == "mn5-gpp" ]] +elif [[ "${ECPLATFORM:-"unset"}" == "mn5-gpp" ]] ; then LAUNCHER="srun" LAUNCHER_NPROC_FLAG="-n" LAUNCHER_NTHREAD_FLAG="--cpus-per-task" From ec44277160230bd475b9d58135a4e338d31d1a26 Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Wed, 27 May 2026 09:28:23 +0000 Subject: [PATCH 126/129] Pull request #78: Enforce double precision in SO2-to-SO4 simplified chemistry Includes: - Compute diurnal cycle in double precision (does'nt make a difference but kept in DP) - Pre-compute some constant (does'nt make a difference but kept in DP) - Fix liquid volume fraction computation and aqueous phase test ( **this was broken in SP** ) Squashed commit of the following: commit 29a4eb6d0598bd4a01ede6ffc92f234473265516 Merge: 4e063b7 ad446f6 Author: Philippe Le Sager Date: Wed May 27 11:15:05 2026 +0200 Merge knmi-m7 commit 4e063b76ce4d4d8c0c1a9658d6e6967ba71d194b Merge: 145300f 6599ae5 Author: Philippe Le Sager Date: Wed May 20 19:29:27 2026 +0200 Merge remote branch 'origin/knmi-m7' into so2so4-always-dbl commit 145300fe72c37035832a28111ea503eee5d84ae2 Author: Philippe Le Sager Date: Wed May 20 14:01:35 2026 +0200 Cleanup commit 72a984916bd0c4eb30e6ab0b05f1d49cb6d5af6f Author: Philippe Le Sager Date: Wed May 20 13:44:34 2026 +0200 Fix liquid volume fraction computation and aqueous phase test commit 6f259b9372fcf08f796d14dba8bdcb65f4fbe7b5 Author: Philippe Le Sager Date: Wed May 20 11:28:04 2026 +0200 Pre-compute some constant commit c1d802d6ca516384c8c3cfc071750b3d54564cff Author: Philippe Le Sager Date: Tue May 19 21:12:58 2026 +0200 Compute diurnal cycle in double precision commit fbc3e4cfe5d1e2936ff2cd85ddf3f9f66353f37f Author: Philippe Le Sager Date: Thu Apr 16 18:52:38 2026 +0200 typo commit be553eb5d10da48c5a949bfb2acaa53fb703fd89 Author: Philippe Le Sager Date: Thu Apr 16 17:10:28 2026 +0200 First shot at enforcing dbl precision in so2so4 commit d017f72ced5d6993fac33177d0415165934871b6 Author: Philippe Le Sager Date: Thu Feb 19 13:02:46 2026 +0100 OpenMP fixes --- ifs-source/arpifs/module/yomcst.F90 | 13 +- ifs-source/arpifs/phys_ec/aer_so2so4_v2.F90 | 541 ++++++++++---------- 2 files changed, 286 insertions(+), 268 deletions(-) diff --git a/ifs-source/arpifs/module/yomcst.F90 b/ifs-source/arpifs/module/yomcst.F90 index 3ff944a6..cb05b9fc 100644 --- a/ifs-source/arpifs/module/yomcst.F90 +++ b/ifs-source/arpifs/module/yomcst.F90 @@ -9,7 +9,7 @@ MODULE YOMCST -USE PARKIND1 ,ONLY : JPRB +USE PARKIND1 ,ONLY : JPRB, JPRD IMPLICIT NONE @@ -31,6 +31,8 @@ MODULE YOMCST REAL(KIND=JPRB),PROTECTED :: RHPLA REAL(KIND=JPRB),PROTECTED :: RKBOL REAL(KIND=JPRB),PROTECTED :: RNAVO +REAL(KIND=JPRD),PROTECTED :: DRKBOL ! double precision for use in mixed precision code +REAL(KIND=JPRD),PROTECTED :: DRNAVO ! double precision for use in mixed precision code ! A1.1 Astronomical constants ! * RDAY : duration of the solar day @@ -115,6 +117,8 @@ MODULE YOMCST REAL(KIND=JPRB),PROTECTED :: RMCFC12 REAL(KIND=JPRB),PROTECTED :: RMHCFC22 REAL(KIND=JPRB),PROTECTED :: RMCCL4 +REAL(KIND=JPRD),PROTECTED :: DR ! double precision for use in mixed precision code +REAL(KIND=JPRD),PROTECTED :: DRD ! double precision for use in mixed precision code ! A1.5,6 Thermodynamic liquid,solid phases ! * RCW : Cw (calorific capacity of liquid water) @@ -263,6 +267,9 @@ SUBROUTINE SETUP_CONSTANTS(KULOUT,KPRINTLEV) RKBOL=1.380658E-23_JPRB RNAVO=6.0221367E+23_JPRB +DRKBOL=1.380658E-23_JPRD +DRNAVO=6.0221367E+23_JPRD + ! ------------------------------------------------------------------ !* 2. DEFINE ASTRONOMICAL CONSTANTS. @@ -352,6 +359,10 @@ SUBROUTINE SETUP_CONSTANTS(KULOUT,KPRINTLEV) RMCFC12=120.914_JPRB RMHCFC22=86.469_JPRB RMCCL4=153.823_JPRB + +DR=DRNAVO*DRKBOL +DRD=1000._JPRD*DR/28.9644_JPRD + ! ------------------------------------------------------------------ !* 6. DEFINE THERMODYNAMIC CONSTANTS, LIQUID PHASE. diff --git a/ifs-source/arpifs/phys_ec/aer_so2so4_v2.F90 b/ifs-source/arpifs/phys_ec/aer_so2so4_v2.F90 index 31c08ef8..4158587c 100644 --- a/ifs-source/arpifs/phys_ec/aer_so2so4_v2.F90 +++ b/ifs-source/arpifs/phys_ec/aer_so2so4_v2.F90 @@ -31,7 +31,8 @@ SUBROUTINE AER_SO2SO4_V2 & ! 28-Mar-2017 : in this test version, oxidants are not depleted ! reason: C-IFS climatologies are already depleted after S(iv) oxidation, thus input oxidants concentration ! can be considered as "background" concentrations, which should not be depleted during oxidation - +! 2026-05-14: Force computation in double precision, and modify condition to account for aqueous phase reaction, P. Le Sager (KNMI) +! ! FUTURE IMPROVEMENTS / To Do LIST ! -------------------------------- ! - check that SO2 (g) + OH (g) is the limiting step: see notebook p. 93 @@ -42,19 +43,15 @@ SUBROUTINE AER_SO2SO4_V2 & ! - notebook p. 24: oxidants limitation !----------------------------------------------------------------------- -USE PARKIND1 ,ONLY : JPIM ,JPRB -USE YOMHOOK ,ONLY : LHOOK, DR_HOOK, JPHOOK -USE YOMRIP , ONLY : TRIP - -USE YOMCST ,ONLY : & - & RNAVO, & ! Avogadro number [mol**-1] - & R, & ! gas constant [J / K / mol] - & RD,RG ! dry air gas constant [J / K / kg] - +USE PARKIND1, ONLY : JPIM, JPRB, JPRD +USE YOMHOOK, ONLY : LHOOK, DR_HOOK, JPHOOK +USE YOMRIP, ONLY : TRIP +USE YOMCST, ONLY : & + & DR, & ! gas constant [J / K / mol] + & DRD, RG ! dry air gas constant [J / K / kg] IMPLICIT NONE - !* 0.1 ARGUMENTS ! --------- @@ -75,12 +72,11 @@ SUBROUTINE AER_SO2SO4_V2 & REAL(KIND=JPRB) ,INTENT(IN) :: PSO2(KLON,KLEV) ! SO2 mass mixing ratio [kg / kg(air)] REAL(KIND=JPRB) ,INTENT(IN) :: PITSO2(KLON,KLEV) ! previous tendency for SO2 [kg / kg(air) / s] REAL(KIND=JPRB) ,INTENT(IN) :: POH(KLON,KLEV) ! oxidants [kg / kg] -REAL(KIND=JPRB) ,INTENT(IN) :: PH2O2(KLON,KLEV) ! oxidants [kg / kg] +REAL(KIND=JPRB) ,INTENT(IN) :: PH2O2(KLON,KLEV) ! oxidants [kg / kg] REAL(KIND=JPRB) ,INTENT(IN) :: PO3(KLON,KLEV) ! oxidants [kg / kg] REAL(KIND=JPRB) ,INTENT(IN) :: PDP(KLON,KLEV) - -REAL(KIND=JPRB) ,INTENT(INOUT) :: PTSO2(KLON,KLEV), PTSO4(KLON,KLEV), PTSO4_AQ(KLON,KLEV)! new tendencies [kg / kg(air) / s] +REAL(KIND=JPRB) ,INTENT(OUT) :: PTSO2(KLON,KLEV), PTSO4(KLON,KLEV), PTSO4_AQ(KLON,KLEV) ! new tendencies [kg / kg(air) / s] REAL(KIND=JPRB) ,INTENT(OUT) :: PFSO2(KLON), PFSO4(KLON), PFSO4_AQ(KLON) @@ -91,98 +87,87 @@ SUBROUTINE AER_SO2SO4_V2 & ! Henry's law data ! !==================! ! reference temperature for Henry's law solubility coefficients [K] -REAL(KIND=JPRB), PARAMETER :: ZTREF_H = 298.15_JPRB +REAL(KIND=JPRD), PARAMETER :: ZTREF_H = 298.15_JPRD ! inverse reference temperature for Henry's law solubility coefficients, and some rate constants [K**-1] -REAL(KIND=JPRB), PARAMETER :: ZITREF_H = 1._JPRB / ZTREF_H +REAL(KIND=JPRD), PARAMETER :: ZITREF_H = 1._JPRD / ZTREF_H ! Henry's law solubility coefficients at T=Tref, and their temperature dependency (if relevant) -REAL(KIND=JPRB), PARAMETER :: ZHCP_H2O2_REF = 9.1E+2_JPRB ! H^cp(H2O2), Sander, ACP 2015 [mol/m3/Pa] -REAL(KIND=JPRB), PARAMETER :: ZHCP_H2O2_TD = 6600._JPRB ! temperature dependency for H^cp(H2O2) [K] -REAL(KIND=JPRB), PARAMETER :: ZHCP_O3_REF = 1.0E-4_JPRB ! H^cp(O3), Sander, ACP 2015 [mol/m3/Pa] -REAL(KIND=JPRB), PARAMETER :: ZHCP_O3_TD = 2800._JPRB ! temperature dependency for H^cp(O3) [K] -REAL(KIND=JPRB), PARAMETER :: ZHCP_OH_REF = 3.8E-1_JPRB ! H^cp(OH), Sander, ACP 2015 [mol/m3/Pa] -!REAL(KIND=JPRB), PARAMETER :: ZHCP_OH_TD = ! no temperature dependency for H^cp(OH) -REAL(KIND=JPRB), PARAMETER :: ZHCP_SO2_REF = 1.3E-2_JPRB ! H^cp(SO2), Sander, ACP 2015 [mol/m3/Pa] -REAL(KIND=JPRB), PARAMETER :: ZHCP_SO2_TD = 2100._JPRB ! temperature dependency for H^cp(SO2) [K] +REAL(KIND=JPRD), PARAMETER :: ZHCP_H2O2_REF = 9.1E+2_JPRD ! H^cp(H2O2), Sander, ACP 2015 [mol/m3/Pa] +REAL(KIND=JPRD), PARAMETER :: ZHCP_H2O2_TD = 6600._JPRD ! temperature dependency for H^cp(H2O2) [K] +REAL(KIND=JPRD), PARAMETER :: ZHCP_O3_REF = 1.0E-4_JPRD ! H^cp(O3), Sander, ACP 2015 [mol/m3/Pa] +REAL(KIND=JPRD), PARAMETER :: ZHCP_O3_TD = 2800._JPRD ! temperature dependency for H^cp(O3) [K] +REAL(KIND=JPRD), PARAMETER :: ZHCP_OH_REF = 3.8E-1_JPRD ! H^cp(OH), Sander, ACP 2015 [mol/m3/Pa] +!REAL(KIND=JPRD), PARAMETER :: ZHCP_OH_TD = ! no temperature dependency for H^cp(OH) +REAL(KIND=JPRD), PARAMETER :: ZHCP_SO2_REF = 1.3E-2_JPRD ! H^cp(SO2), Sander, ACP 2015 [mol/m3/Pa] +REAL(KIND=JPRD), PARAMETER :: ZHCP_SO2_TD = 2100._JPRD ! temperature dependency for H^cp(SO2) [K] !=================================! ! Acid-base equilibrium constants ! !=================================! ! Keq_1(SO2(aq)<=>HSO3-) Seinfeld & Pandis, 1998, table 6.A.1 p.394 -REAL(KIND=JPRB), PARAMETER :: ZKEQ1_SO2_REF = 1.3E-2_JPRB ! Keq_1(SO2(aq)<=>HSO3-) at T=Tref [mol / L] -REAL(KIND=JPRB), PARAMETER :: ZKEQ1_SO2_TD = 1960._JPRB ! temperature dependency for Keq_1 [K] +REAL(KIND=JPRD), PARAMETER :: ZKEQ1_SO2_REF = 1.3E-2_JPRD ! Keq_1(SO2(aq)<=>HSO3-) at T=Tref [mol / L] +REAL(KIND=JPRD), PARAMETER :: ZKEQ1_SO2_TD = 1960._JPRD ! temperature dependency for Keq_1 [K] ! Keq_2(HSO3-<=>SO3=) Seinfeld & Pandis, 1998, table 6.A.1 p.394 -REAL(KIND=JPRB), PARAMETER :: ZKEQ2_SO2_REF = 6.6E-8_JPRB ! Keq_2(HSO3-<=>SO3=) at T=Tref [mol / L] -REAL(KIND=JPRB), PARAMETER :: ZKEQ2_SO2_TD = 1500._JPRB ! temperature dependency for Keq_2 [K] +REAL(KIND=JPRD), PARAMETER :: ZKEQ2_SO2_REF = 6.6E-8_JPRD ! Keq_2(HSO3-<=>SO3=) at T=Tref [mol / L] +REAL(KIND=JPRD), PARAMETER :: ZKEQ2_SO2_TD = 1500._JPRD ! temperature dependency for Keq_2 [K] !=========================! ! Reaction rate constants ! !=========================! -! +! Avogadro number - Copied from YOMCST because you can't create parameters from protected variables +REAL(KIND=JPRD), PARAMETER :: ZNAVO=6.0221367E+23_JPRD ! [mol**-1] ! conversion factor, multiply by ZCONV1 to convert cm**3/molec into m**3/mol -!REAL(KIND=JPRB), PARAMETER :: ZCONV1 = 1.E-6_JPRB * RNAVO ! doesn't work, cf comment above -!REAL(KIND=JPRB) :: ZCONV1 = 1.E-6_JPRB * RNAVO ! doesn't work, cf comment above -REAL(KIND=JPRB) :: ZCONV1 -! conversion factor, multiply by ZCONV3 to convert L into m3 -! for instance, 2nd order reaction rate in aqueous phase [L / mol / s] into SI units [m3 / mol / s] -REAL(KIND=JPRB) :: ZCONV3 = 1.E-3_JPRB ! [m**3 / L] - +!REAL(KIND=JPRD), PARAMETER :: ZCONV1 = 1.E-6_JPRD * ZNAVO ! [m3 / cm3 / mol] +REAL(KIND=JPRD), PARAMETER :: ZCONV1 = 6.0221367E+17_JPRD ! [m3 / cm3 / mol] ! k_OH reaction rate, low pressure limit, at 300 K, converted in [m**6 / (mol**2 * s)] -!REAL(KIND=JPRB), PARAMETER :: ZKOH_LOW300 = 3.3E-31_JPRB * ZCONV1 * ZCONV1 ! doesn't work, cf comment above -!REAL(KIND=JPRB) :: ZKOH_LOW300 = 3.3E-31_JPRB * ZCONV1 * ZCONV1 ! doesn't work, cf comment above -REAL(KIND=JPRB) :: ZKOH_LOW300 +!REAL(KIND=JPRD), PARAMETER :: ZKOH_LOW300 = 3.3E-31_JPRD * ZCONV1 * ZCONV1 ! now in [m**6 / mol**2 / s] +REAL(KIND=JPRD), PARAMETER :: ZKOH_LOW300 = 119.678230431E+3_JPRD ! now in [m**6 / mol**2 / s] + ! k_OH reaction rate, high pressure limit, no temp. dependency, converted in [m**3 / (mol * s)] -!REAL(KIND=JPRB), PARAMETER :: ZKOH_HIGH = 1.6E-12_JPRB * ZCONV1 ! doesn't work, cf comment above -!REAL(KIND=JPRB) :: ZKOH_HIGH = 1.6E-12_JPRB * ZCONV1 ! doesn't work, cf comment above -REAL(KIND=JPRB) :: ZKOH_HIGH +REAL(KIND=JPRD), PARAMETER :: ZKOH_HIGH = 1.6E-12_JPRD * ZCONV1 ! now in [m**3 / mol / s] +! conversion factor, multiply by ZCONV3 to convert L into m3 +! for instance, 2nd order reaction rate in aqueous phase [L / mol / s] into SI units [m3 / mol / s] +REAL(KIND=JPRD) :: ZCONV3 = 1.E-3_JPRD ! [m**3 / L] ! Reaction rate constant k_(S(iv)+H2O2(aq)) Seinfeld & Pandis, 1998, pp.366, 378, and 396 ! second one: see for instance Berglen et al 2004, JGR vol. 109, D19310 ! Notice the different units! ! note: in S & P, there is a mistake on the unit of k, which is a 3rd order rate constant (not a 2nd order) INTEGER(KIND=JPIM), PARAMETER :: IKH2O2_select = 1 ! Case selector, choose one of the following kinetics -REAL(KIND=JPRB), PARAMETER :: ZKH2O2_REF_v1 = 7.5E+7_JPRB ! k_(S(iv)+H2O2) at Tref=298.15 K [L**2 / mol**2 / s] -REAL(KIND=JPRB), PARAMETER :: ZKH2O2_TD_v1 = -4430._JPRB ! temperature dependency [K] -REAL(KIND=JPRB), PARAMETER :: ZKH2O2_REF_v2 = 8.0E+4_JPRB ! k_(S(iv)+H2O2) at Tref=298.15 K [L / mol / s] -REAL(KIND=JPRB), PARAMETER :: ZKH2O2_TD_v2 = -3650._JPRB ! temperature dependency [K] - - +REAL(KIND=JPRD), PARAMETER :: ZKH2O2_REF_v1 = 7.5E+7_JPRD ! k_(S(iv)+H2O2) at Tref=298.15 K [L**2 / mol**2 / s] +REAL(KIND=JPRD), PARAMETER :: ZKH2O2_TD_v1 = -4430._JPRD ! temperature dependency [K] +REAL(KIND=JPRD), PARAMETER :: ZKH2O2_REF_v2 = 8.0E+4_JPRD ! k_(S(iv)+H2O2) at Tref=298.15 K [L / mol / s] +REAL(KIND=JPRD), PARAMETER :: ZKH2O2_TD_v2 = -3650._JPRD ! temperature dependency [K] ! Reaction rate constants O3(aq) + S(iv)(aq) is split in 3 parts (reaction with SO2(aq), HSO3-(aq) and SO3=(aq) -REAL(KIND=JPRB), PARAMETER :: ZKO3_REF1 = 2.4E+4_JPRB ! k_(SO2(aq))+O3(aq)) [L / mol / s] -REAL(KIND=JPRB), PARAMETER :: ZKO3_REF2 = 3.7E+5_JPRB ! k_(HSO3-(aq))+O3(aq)) at Tref=298.15 K [L / mol / s] -REAL(KIND=JPRB), PARAMETER :: ZKO3_TD2 = -5530._JPRB ! temperature dependency [K] -REAL(KIND=JPRB), PARAMETER :: ZKO3_REF3 = 1.5E+9_JPRB ! k_(SO3=(aq))+O3(aq)) at Tref=298.15 K [L / mol / s] -REAL(KIND=JPRB), PARAMETER :: ZKO3_TD3 = -5280._JPRB ! temperature dependency [K] - +REAL(KIND=JPRD), PARAMETER :: ZKO3_REF1 = 2.4E+4_JPRD ! k_(SO2(aq))+O3(aq)) [L / mol / s] +REAL(KIND=JPRD), PARAMETER :: ZKO3_REF2 = 3.7E+5_JPRD ! k_(HSO3-(aq))+O3(aq)) at Tref=298.15 K [L / mol / s] +REAL(KIND=JPRD), PARAMETER :: ZKO3_TD2 = -5530._JPRD ! temperature dependency [K] +REAL(KIND=JPRD), PARAMETER :: ZKO3_REF3 = 1.5E+9_JPRD ! k_(SO3=(aq))+O3(aq)) at Tref=298.15 K [L / mol / s] +REAL(KIND=JPRD), PARAMETER :: ZKO3_TD3 = -5280._JPRD ! temperature dependency [K] !==============! ! Molar masses ! !==============! -!REAL(KIND=JPRB), PARAMETER :: ZRMD = 28.9644E-3_JPRB ! air molar mass [kg / mol] -REAL(KIND=JPRB), PARAMETER :: ZRMH2O2 = 34.0147E-3_JPRB ! H2O2 molar mass [kg / mol] -REAL(KIND=JPRB), PARAMETER :: ZRMO3 = 47.9982E-3_JPRB ! O3 molar mass [kg / mol] -REAL(KIND=JPRB), PARAMETER :: ZRMOH = 17.008E-3_JPRB ! OH molar mass [kg / mol] -REAL(KIND=JPRB), PARAMETER :: ZRMSO2 = 64.056E-3_JPRB ! SO2 molar mass [kg / mol] ! jjb quick fix: change unit in sucst.F90 -REAL(KIND=JPRB), PARAMETER :: ZRMSO4 = 96.052E-3_JPRB ! SO4= molar mass [kg / mol] +!REAL(KIND=JPRD), PARAMETER :: ZRMD = 28.9644E-3_JPRD ! air molar mass [kg / mol] +REAL(KIND=JPRD), PARAMETER :: ZRMH2O2 = 34.0147E-3_JPRD ! H2O2 molar mass [kg / mol] +REAL(KIND=JPRD), PARAMETER :: ZRMO3 = 47.9982E-3_JPRD ! O3 molar mass [kg / mol] +REAL(KIND=JPRD), PARAMETER :: ZRMOH = 17.008E-3_JPRD ! OH molar mass [kg / mol] +REAL(KIND=JPRD), PARAMETER :: ZRMSO2 = 64.056E-3_JPRD ! SO2 molar mass [kg / mol] ! jjb quick fix: change unit in sucst.F90 +REAL(KIND=JPRD), PARAMETER :: ZRMSO4 = 96.052E-3_JPRD ! SO4= molar mass [kg / mol] ! Other parameters ! ---------------- -REAL(KIND=JPRB), PARAMETER :: ZRHOLW = 1000._JPRB ! liquid water density [kg / m3] +REAL(KIND=JPRD), PARAMETER :: ZRHOLW = 1000._JPRD ! liquid water density [kg / m3] -!REAL(KIND=JPRB), PARAMETER :: ZPH = 5._JPRB ! pH of cloud liquid water, assumed -REAL(KIND=JPRB), PARAMETER :: ZHP = 1.0E-5_JPRB ! proton concentration [mol / L] - -REAL(KIND=JPRB), PARAMETER :: ZPTSCHEM = 2._JPRB ! timestep for chemistry [s] +!REAL(KIND=JPRD), PARAMETER :: ZPH = 5._JPRD ! pH of cloud liquid water, assumed +REAL(KIND=JPRD), PARAMETER :: ZHP = 1.0E-5_JPRD ! proton concentration [mol / L] +REAL(KIND=JPRD), PARAMETER :: ZPTSCHEM = 2._JPRD ! timestep for chemistry [s] !* 0.5 LOCAL VARIABLES @@ -192,175 +177,195 @@ SUBROUTINE AER_SO2SO4_V2 & REAL(KIND=JPHOOK) :: ZHOOK_HANDLE -! jjb -! -REAL(KIND=JPRB) :: ZTEMPERAT ! grid cell temperature [K] -REAL(KIND=JPRB) :: ZPRESSURE ! grid cell pressure [Pa] +REAL(KIND=JPRD) :: ZTEMPERAT ! grid cell temperature [K] +REAL(KIND=JPRD) :: ZPRESSURE ! grid cell pressure [Pa] -REAL(KIND=JPRB) :: ZAIR_CONC ! air concentration [mol / m3] -REAL(KIND=JPRB) :: ZAIR_DENS ! air density [kg / m3] +REAL(KIND=JPRD) :: ZAIR_CONC ! air concentration [mol / m3] +REAL(KIND=JPRD) :: ZAIR_DENS ! air density [kg / m3] -REAL(KIND=JPRB) :: ZCLW_VFRAC ! volume fraction of cloud liquid water [m3(aq) / m3(g)] +REAL(KIND=JPRD) :: ZCLW_VFRAC ! volume fraction of cloud liquid water [m3(aq) / m3(g)] ! conversion factor, ZCONV2 = R * T. Multiply by ZCONV2 to convert H^cp (in mol/m3/Pa) into H^cc (in m3(g) / m3(aq)) -REAL(KIND=JPRB) :: ZCONV2 ! [J/mol] - -! Oxidants concentrations. Local arrays to split PCHEMSULF1 - -REAL(KIND=JPRB) :: ZFACT1 ! intermediate factor 1 -REAL(KIND=JPRB) :: ZFACT2 ! intermediate factor 2 - -REAL(KIND=JPRB) :: ZFAQ_H2O2 ! fraction of H2O2 dissolved in aqueous phase [dimensionless] -REAL(KIND=JPRB) :: ZFAQ_O3 ! fraction of O3 dissolved in aqueous phase [dimensionless] -REAL(KIND=JPRB) :: ZFAQ_OH ! fraction of OH dissolved in aqueous phase [dimensionless] -REAL(KIND=JPRB) :: ZFAQ_SO2 ! fraction of SO2 dissolved in aqueous phase [dimensionless] - -REAL(KIND=JPRB) :: ZHCC_H2O2 ! dimensionless Henry's law solubility for H2O2 [m3(g) / m3(aq)] -REAL(KIND=JPRB) :: ZHCC_O3 ! dimensionless Henry's law solubility for O3 [m3(g) / m3(aq)] -REAL(KIND=JPRB) :: ZHCC_OH ! dimensionless Henry's law solubility for OH [m3(g) / m3(aq)] -REAL(KIND=JPRB) :: ZHCC_SO2 ! dimensionless Henry's law solubility for SO2 [m3(g) / m3(aq)] -REAL(KIND=JPRB) :: ZHCC_SO2_EFF ! dimensionless Henry's law effective solubility for SO2 [m3(g) / m3(aq)] - -REAL(KIND=JPRB) :: ZKEQ1_SO2 ! equilibrium constant SO2(aq) <=> HSO3- [mol / L] -REAL(KIND=JPRB) :: ZKEQ2_SO2 ! equilibrium constant HSO3- <=> SO3= [mol / L] -REAL(KIND=JPRB) :: ZKEQ1_FACT -REAL(KIND=JPRB) :: ZKEQ2_FACT - -REAL(KIND=JPRB) :: ZKOH_LOW ! low pressure limit = f(T) [m**6 / (mol**2 * s)] -REAL(KIND=JPRB) :: ZKOH ! gas phase reaction rate SO2 + OH [m**3 / (mol * s)] -!REAL(KIND=JPRB) :: ZKPOH ! modified gas phase reaction rate SO2 + OH including OH and SO2 gas fractions [m**3 / (mol * s)] - -REAL(KIND=JPRB) :: ZKH2O2 ! Reaction rate constant k_(S(iv)+H2O2(aq)) [mol**2 / L**2 / s] - -REAL(KIND=JPRB) :: ZKO3_1 ! Reaction rate constant k_(O3+SO2(aq)) (T) [mol / m3 / s] -REAL(KIND=JPRB) :: ZKO3_2 ! Reaction rate constant k_(O3+HSO3-(aq)) (T) [mol / m3 / s] -REAL(KIND=JPRB) :: ZKO3_3 ! Reaction rate constant k_(O3+SO3--(aq)) (T) [mol / m3 / s] - -REAL(KIND=JPRB) :: ZTFACT ! temperature factor for Henry's law solubility calculation [K**-1] - -REAL(KIND=JPRB) :: ZC_H2O2_gas ! concentration of H2O2 in the gas phase [mol/m3(air)] -REAL(KIND=JPRB) :: ZC_O3_gas ! concentration of O3 in the gas phase [mol/m3(air)] -REAL(KIND=JPRB) :: ZC_OH_gas ! concentration of OH in the gas phase [mol/m3(air)] -REAL(KIND=JPRB) :: ZC_SO2_gas ! concentration of SO2 in the gas phase [mol/m3(air)] -REAL(KIND=JPRB) :: ZC_SO2_tot ! total concentration of SO2 [mol/m3(air)] - -REAL(KIND=JPRB) :: ZC_H2O2_gas_ini ! initial concentration of H2O2 in the gas phase [mol/m3(air)] -REAL(KIND=JPRB) :: ZC_O3_gas_ini ! initial concentration of O3 in the gas phase [mol/m3(air)] -REAL(KIND=JPRB) :: ZC_OH_gas_ini ! initial concentration of OH in the gas phase [mol/m3(air)] - -REAL(KIND=JPRB) :: ZC_H2O2_aqp ! "potential" concentration of H2O2 in the aqueous phase [mol/m3(aq)] -REAL(KIND=JPRB) :: ZC_O3_aqp ! "potential" concentration of O3 in the aqueous phase [mol/m3(aq)] -REAL(KIND=JPRB) :: ZC_Siv_aqp ! "potential" concentration of S(iv) in the aqueous phase [mol/m3(aq)] -REAL(KIND=JPRB) :: ZC_SO2_aqp ! "potential" concentration of SO2 in the aqueous phase [mol/m3(aq)] -REAL(KIND=JPRB) :: ZC_HSO3m_aqp ! "potential" concentration of HSO3- in the aqueous phase [mol/m3(aq)] -REAL(KIND=JPRB) :: ZC_SO3mm_aqp ! "potential" concentration of SO3= in the aqueous phase [mol/m3(aq)] - -REAL(KIND=JPRB) :: ZTend_OH ! tendency for S(iv) + OH(g) [mol/m3(air)] -REAL(KIND=JPRB) :: ZTend_H2O2 ! tendency for S(iv) + H2O2(aq) [mol/m3(air)] <== final unit -REAL(KIND=JPRB) :: ZTend_O3 ! tendency for S(iv) + O3(aq) [mol/m3(air)] <== final unit -REAL(KIND=JPRB) :: ZTend_O3_r1 ! tendency for SO2(aq) + O3(aq) [mol/m3(air)] <== final unit -REAL(KIND=JPRB) :: ZTend_O3_r2 ! tendency for HS03m + O3(aq) [mol/m3(air)] <== final unit -REAL(KIND=JPRB) :: ZTend_O3_r3 ! tendency for SO3mm + O3(aq) [mol/m3(air)] <== final unit -REAL(KIND=JPRB) :: ZTend_O3_ul ! unlimited -REAL(KIND=JPRB) :: ZTend_O3_li ! limited -REAL(KIND=JPRB) :: ZLimit_fact_O3 -REAL(KIND=JPRB) :: ZSum_HSO3m_ox_ul -REAL(KIND=JPRB) :: ZSum_HSO3m_ox_li -REAL(KIND=JPRB) :: ZLimit_fact_HSO3m -!REAL(KIND=JPRB) :: ZTend_TOT_1 ! tendency for S(iv) --> S(vi) including oxidants and "branch-specific" S(iv) limitation -!REAL(KIND=JPRB) :: ZTend_TOT_2 ! tendency for S(iv) --> S(vi) further including total S(iv) limitation -REAL(KIND=JPRB) :: ZTend_H2O2_Sum ! -REAL(KIND=JPRB) :: ZTend_O3_Sum ! -REAL(KIND=JPRB) :: ZTend_OH_Sum ! -REAL(KIND=JPRB) :: ZTend_Gas ! -REAL(KIND=JPRB) :: ZTend_Aq ! -REAL(KIND=JPRB) :: ZTend_Aq_Sum ! -REAL(KIND=JPRB) :: ZTend_Sum ! - -REAL(KIND=JPRB) :: ZPNEB, ZSCALEO3(KLON), ZSCALEOH(KLON) - -REAL(KIND=JPRB) :: ZmmrH2O2 -REAL(KIND=JPRB) :: ZmmrO3 -REAL(KIND=JPRB) :: ZmmrOH -REAL(KIND=JPRB) :: ZmmrSO2 +REAL(KIND=JPRD) :: ZCONV2 ! [J/mol] + +! Oxidants concentrations + +REAL(KIND=JPRD) :: ZFACT1 ! intermediate factor 1 +REAL(KIND=JPRD) :: ZFACT2 ! intermediate factor 2 + +REAL(KIND=JPRD) :: ZFAQ_H2O2 ! fraction of H2O2 dissolved in aqueous phase [dimensionless] +REAL(KIND=JPRD) :: ZFAQ_O3 ! fraction of O3 dissolved in aqueous phase [dimensionless] +REAL(KIND=JPRD) :: ZFAQ_OH ! fraction of OH dissolved in aqueous phase [dimensionless] +REAL(KIND=JPRD) :: ZFAQ_SO2 ! fraction of SO2 dissolved in aqueous phase [dimensionless] + +REAL(KIND=JPRD) :: ZHCC_H2O2 ! dimensionless Henry's law solubility for H2O2 [m3(g) / m3(aq)] +REAL(KIND=JPRD) :: ZHCC_O3 ! dimensionless Henry's law solubility for O3 [m3(g) / m3(aq)] +REAL(KIND=JPRD) :: ZHCC_OH ! dimensionless Henry's law solubility for OH [m3(g) / m3(aq)] +REAL(KIND=JPRD) :: ZHCC_SO2 ! dimensionless Henry's law solubility for SO2 [m3(g) / m3(aq)] +REAL(KIND=JPRD) :: ZHCC_SO2_EFF ! dimensionless Henry's law effective solubility for SO2 [m3(g) / m3(aq)] + +REAL(KIND=JPRD) :: ZKEQ1_SO2 ! equilibrium constant SO2(aq) <=> HSO3- [mol / L] +REAL(KIND=JPRD) :: ZKEQ2_SO2 ! equilibrium constant HSO3- <=> SO3= [mol / L] +REAL(KIND=JPRD) :: ZKEQ1_FACT +REAL(KIND=JPRD) :: ZKEQ2_FACT + +REAL(KIND=JPRD) :: ZKOH_LOW ! low pressure limit = f(T) [m**6 / (mol**2 * s)] +REAL(KIND=JPRD) :: ZKOH ! gas phase reaction rate SO2 + OH [m**3 / (mol * s)] +!REAL(KIND=JPRD) :: ZKPOH ! modified gas phase reaction rate SO2 + OH including OH and SO2 gas fractions [m**3 / (mol * s)] + +REAL(KIND=JPRD) :: ZKH2O2 ! Reaction rate constant k_(S(iv)+H2O2(aq)) [mol**2 / L**2 / s] + +REAL(KIND=JPRD) :: ZKO3_1 ! Reaction rate constant k_(O3+SO2(aq)) (T) [mol / m3 / s] +REAL(KIND=JPRD) :: ZKO3_2 ! Reaction rate constant k_(O3+HSO3-(aq)) (T) [mol / m3 / s] +REAL(KIND=JPRD) :: ZKO3_3 ! Reaction rate constant k_(O3+SO3--(aq)) (T) [mol / m3 / s] + +REAL(KIND=JPRD) :: ZTFACT ! temperature factor for Henry's law solubility calculation [K**-1] + +REAL(KIND=JPRD) :: ZC_H2O2_gas ! concentration of H2O2 in the gas phase [mol/m3(air)] +REAL(KIND=JPRD) :: ZC_O3_gas ! concentration of O3 in the gas phase [mol/m3(air)] +REAL(KIND=JPRD) :: ZC_OH_gas ! concentration of OH in the gas phase [mol/m3(air)] +REAL(KIND=JPRD) :: ZC_SO2_gas ! concentration of SO2 in the gas phase [mol/m3(air)] +REAL(KIND=JPRD) :: ZC_SO2_tot ! total concentration of SO2 [mol/m3(air)] + +REAL(KIND=JPRD) :: ZC_H2O2_gas_ini ! initial concentration of H2O2 in the gas phase [mol/m3(air)] +REAL(KIND=JPRD) :: ZC_O3_gas_ini ! initial concentration of O3 in the gas phase [mol/m3(air)] +REAL(KIND=JPRD) :: ZC_OH_gas_ini ! initial concentration of OH in the gas phase [mol/m3(air)] + +REAL(KIND=JPRD) :: ZC_H2O2_aqp ! "potential" concentration of H2O2 in the aqueous phase [mol/m3(aq)] +REAL(KIND=JPRD) :: ZC_O3_aqp ! "potential" concentration of O3 in the aqueous phase [mol/m3(aq)] +REAL(KIND=JPRD) :: ZC_Siv_aqp ! "potential" concentration of S(iv) in the aqueous phase [mol/m3(aq)] +REAL(KIND=JPRD) :: ZC_SO2_aqp ! "potential" concentration of SO2 in the aqueous phase [mol/m3(aq)] +REAL(KIND=JPRD) :: ZC_HSO3m_aqp ! "potential" concentration of HSO3- in the aqueous phase [mol/m3(aq)] +REAL(KIND=JPRD) :: ZC_SO3mm_aqp ! "potential" concentration of SO3= in the aqueous phase [mol/m3(aq)] + +REAL(KIND=JPRD) :: ZTend_OH ! tendency for S(iv) + OH(g) [mol/m3(air)] +REAL(KIND=JPRD) :: ZTend_H2O2 ! tendency for S(iv) + H2O2(aq) [mol/m3(air)] <== final unit +REAL(KIND=JPRD) :: ZTend_O3 ! tendency for S(iv) + O3(aq) [mol/m3(air)] <== final unit +REAL(KIND=JPRD) :: ZTend_O3_r1 ! tendency for SO2(aq) + O3(aq) [mol/m3(air)] <== final unit +REAL(KIND=JPRD) :: ZTend_O3_r2 ! tendency for HS03m + O3(aq) [mol/m3(air)] <== final unit +REAL(KIND=JPRD) :: ZTend_O3_r3 ! tendency for SO3mm + O3(aq) [mol/m3(air)] <== final unit +REAL(KIND=JPRD) :: ZTend_O3_ul ! unlimited +REAL(KIND=JPRD) :: ZTend_O3_li ! limited +REAL(KIND=JPRD) :: ZLimit_fact_O3 +REAL(KIND=JPRD) :: ZSum_HSO3m_ox_ul +REAL(KIND=JPRD) :: ZSum_HSO3m_ox_li +REAL(KIND=JPRD) :: ZLimit_fact_HSO3m +!REAL(KIND=JPRD) :: ZTend_TOT_1 ! tendency for S(iv) --> S(vi) including oxidants and "branch-specific" S(iv) limitation +!REAL(KIND=JPRD) :: ZTend_TOT_2 ! tendency for S(iv) --> S(vi) further including total S(iv) limitation +REAL(KIND=JPRD) :: ZTend_H2O2_Sum ! +REAL(KIND=JPRD) :: ZTend_O3_Sum ! +REAL(KIND=JPRD) :: ZTend_OH_Sum ! +REAL(KIND=JPRD) :: ZTend_Gas ! +REAL(KIND=JPRD) :: ZTend_Aq ! +REAL(KIND=JPRD) :: ZTend_Aq_Sum ! +REAL(KIND=JPRD) :: ZTend_Sum ! + +REAL(KIND=JPRB) :: ZSCALEO3(KLON), ZSCALEOH(KLON) +REAL(KIND=JPRD) :: ZPNEB, DSCALEO3(KLON), DSCALEOH(KLON) + +REAL(KIND=JPRD) :: ZmmrH2O2 +REAL(KIND=JPRD) :: ZmmrO3 +REAL(KIND=JPRD) :: ZmmrOH +REAL(KIND=JPRD) :: ZmmrSO2 INTEGER(KIND=JPIM) :: JPTS ! Number of sub-timesteps for chemistry INTEGER(KIND=JPIM) :: JTS ! Running index for chemistry do-loop -#include "compo_diurnal.intfb.h" +! Recast input/output +REAL(KIND=JPRD) :: ZTSPHY +REAL(KIND=JPRD) :: ZSO2, ZITSO2, ZOH, ZO3, ZH2O2 +REAL(KIND=JPRD) :: ZTSO2(KLON,KLEV), ZTSO4(KLON,KLEV), ZTSO4_AQ(KLON,KLEV) + +REAL(KIND=JPRD) :: ZRPI, ZLTRAD(KLON) + +!PLS #include "compo_diurnal.intfb.h" !----------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('AER_SO2SO4_V2',0,ZHOOK_HANDLE) -! Initialisation of "parameters" that cannot be initialised in the declaration part (cf. remarks above) -ZCONV1 = 1.E-6_JPRB * RNAVO ! [m3 / cm3 / mol] -ZKOH_LOW300 = 3.3E-31_JPRB * ZCONV1 * ZCONV1 ! now in [m**6 / mol**2 / s] -ZKOH_HIGH = 1.6E-12_JPRB * ZCONV1 ! now in [m**3 / mol / s] ! Define the number of intermediate timesteps for chemistry -IF(MODULO(PTSPHY,ZPTSCHEM) > 0._JPRB) THEN +ZTSPHY = REAL(PTSPHY, KIND=JPRD) +IF(MODULO(ZTSPHY,ZPTSCHEM) > 0._JPRD) THEN CALL ABOR1('ABORT: IN AER_SO2SO4_V2, ZPTSCHEM must divide PTSTEMP') ENDIF -JPTS = INT(PTSPHY/ZPTSCHEM) - - -! Split PCHEMSULF1 array +JPTS = INT(ZTSPHY/ZPTSCHEM) ! Initialise tendencies (necessary when using sub-timesteps for chemistry, -! since the total tendency will be the sum of "sub-tendencies"). These arrays could be declared "intent(out)" then -PTSO2(KIDIA:KFDIA,:) = 0._JPRB -PTSO4(KIDIA:KFDIA,:) = 0._JPRB -PTSO4_AQ(KIDIA:KFDIA,:) = 0._JPRB - -CALL COMPO_DIURNAL(YDRIP, KIDIA, KFDIA, KLON, 'Sine', PGELAM, PGELAT, ZSCALEOH, PAMPLITUDE=0.7_JPRB, PHOURPEAK=15.0_JPRB) -CALL COMPO_DIURNAL(YDRIP, KIDIA, KFDIA, KLON, 'Sine', PGELAM, PGELAT, ZSCALEO3, PAMPLITUDE=0.7_JPRB, PHOURPEAK=15.0_JPRB) +! since the total tendency will be the sum of "sub-tendencies") +ZTSO2(KIDIA:KFDIA,:) = 0._JPRD +ZTSO4(KIDIA:KFDIA,:) = 0._JPRD +ZTSO4_AQ(KIDIA:KFDIA,:) = 0._JPRD + +!PLS CALL COMPO_DIURNAL(YDRIP, KIDIA, KFDIA, KLON, 'Sine', PGELAM, PGELAT, ZSCALEOH, PAMPLITUDE=0.7_JPRB, PHOURPEAK=15.0_JPRB) +!PLS CALL COMPO_DIURNAL(YDRIP, KIDIA, KFDIA, KLON, 'Sine', PGELAM, PGELAT, ZSCALEO3, PAMPLITUDE=0.7_JPRB, PHOURPEAK=15.0_JPRB) +!PLS DO JL=KIDIA,KFDIA +!PLS DSCALEOH(JL) = REAL(ZSCALEOH(JL), KIND=JPRD) +!PLS DSCALEO3(JL) = REAL(ZSCALEO3(JL), KIND=JPRD) +!PLS ENDDO + +! Diurnal cycle in JPRD precision +ZRPI=2.0_JPRD*ASIN(1.0_JPRD) +ZLTRAD(KIDIA:KFDIA) = REAL( (YDRIP%RWSOVR + PGELAM(KIDIA:KFDIA)), KIND=JPRD) +DSCALEOH(KIDIA:KFDIA) = 1.0_JPRD + COS(ZLTRAD(KIDIA:KFDIA) - 15.0_JPRD/12.0_JPRD * ZRPI) * 0.7_JPRD +DSCALEO3(KIDIA:KFDIA) = DSCALEOH(KIDIA:KFDIA) DO JK=1,KLEV DO JL=KIDIA,KFDIA - ! Initialise all scalar variables to 0._JPRB (for debug only) - ZmmrH2O2 = 0._JPRB - ZmmrO3 = 0._JPRB - ZC_H2O2_gas = 0._JPRB - ZC_O3_gas = 0._JPRB - ZFAQ_H2O2 = 0._JPRB - ZFAQ_O3 = 0._JPRB - ZFAQ_OH = 0._JPRB - ZFAQ_SO2 = 0._JPRB - ZHCC_H2O2 = 0._JPRB - ZHCC_OH = 0._JPRB - ZHCC_O3 = 0._JPRB - ZHCC_SO2 = 0._JPRB - ZHCC_SO2_EFF = 0._JPRB - ZTend_OH_Sum = 0._JPRB - ZTend_Gas = 0._JPRB - ZTend_Aq = 0._JPRB - ZTend_O3_Sum = 0._JPRB - ZTend_H2O2_Sum = 0._JPRB + ! Initialise all scalar variables to 0._JPRD (for debug only) + ZmmrH2O2 = 0._JPRD + ZmmrO3 = 0._JPRD + ZC_H2O2_gas = 0._JPRD + ZC_O3_gas = 0._JPRD + ZFAQ_H2O2 = 0._JPRD + ZFAQ_O3 = 0._JPRD + ZFAQ_OH = 0._JPRD + ZFAQ_SO2 = 0._JPRD + ZHCC_H2O2 = 0._JPRD + ZHCC_OH = 0._JPRD + ZHCC_O3 = 0._JPRD + ZHCC_SO2 = 0._JPRD + ZHCC_SO2_EFF = 0._JPRD + ZTend_OH_Sum = 0._JPRD + ZTend_Gas = 0._JPRD + ZTend_Aq = 0._JPRD + ZTend_O3_Sum = 0._JPRD + ZTend_H2O2_Sum = 0._JPRD ! -- Miscellaneous variables + ! -- pressure and temperature copied in scalars - ZPRESSURE = PRSF1(JL,JK) - ZTEMPERAT = PTP (JL,JK) + ZPRESSURE = REAL(PRSF1(JL,JK), KIND=JPRD) + ZTEMPERAT = REAL(PTP(JL,JK), KIND=JPRD) + ! -- air concentration and density - ZAIR_CONC = ZPRESSURE / (R *ZTEMPERAT) ! [mol / m3] - ZAIR_DENS = ZPRESSURE / (RD*ZTEMPERAT) ! [kg / m3] + ZAIR_CONC = ZPRESSURE / (DR *ZTEMPERAT) ! [mol / m3] + ZAIR_DENS = ZPRESSURE / (DRD*ZTEMPERAT) ! [kg / m3] + ! -- fractional cloudiness - ZPNEB = PNEB(JL,JK) - ! -- liquid volume fraction in the cloudy part [m3(aq) / m3(g)] + ZPNEB = REAL(PNEB(JL,JK), KIND=JPRD) - ZCLW_VFRAC = 0._JPRB - IF (ZPNEB > 1.0E-12_JPRB) THEN - ZCLW_VFRAC = PQLI(JL,JK) / ZPNEB * ZAIR_DENS / ZRHOLW + ! -- liquid volume fraction in the cloudy part [m3(aq) / m3(g)] + ZCLW_VFRAC = 0._JPRD + ! Note: The smallest cloud fraction PNEB is ~1e-8 in JPRD, and ~1e-12 in JPRB [2-day tests at TL255L91] + ! The latter (and values below ~1.e-9) can create unrealistic large ZCLW_VFRAC. + IF (ZPNEB > 1.0E-6_JPRD) THEN + ZCLW_VFRAC = REAL(PQLI(JL,JK), KIND=JPRD) / ZPNEB * ZAIR_DENS / ZRHOLW ENDIF + ! Cast other input into double precision + ZSO2 = REAL(PSO2 (JL,JK), KIND=JPRD) + ZITSO2 = REAL(PITSO2(JL,JK), KIND=JPRD) + ZOH = REAL(POH (JL,JK), KIND=JPRD) + ZO3 = REAL(PO3 (JL,JK), KIND=JPRD) + ZH2O2 = REAL(PH2O2 (JL,JK), KIND=JPRD) - !write (*,*) "SO2SO4",JL,JK,ZPNEB,ZCLW_VFRAC,POH(JL,JK),PO3(JL,JK),PH2O2(JL,JK) !======================================================================= ! Two cases: ! - gas phase reaction only (if no cloud, or no liquid water) ! - gas + aqueous phase reactions !======================================================================= - IF (.NOT.(ZPNEB > 1.0E-12_JPRB )) THEN ! 1.0E-12 is the default PNEB value + IF ( ZCLW_VFRAC < 1.0E-10_JPRD ) THEN !======================================================================= ! GAS PHASE ONLY: @@ -368,28 +373,25 @@ SUBROUTINE AER_SO2SO4_V2 & ! -- Reactants concentration (gas phase only) ! -- mmr [kg / kg] - IF (POH(JL,JK) > 1.0E-14_JPRB ) THEN - ZmmrOH = POH(JL,JK)*ZSCALEOH(JL) + IF (ZOH > 1.0E-14_JPRD ) THEN + ZmmrOH = ZOH * DSCALEOH(JL) ELSE - ZmmrOH = 0.0_JPRB + ZmmrOH = 0.0_JPRD ENDIF - ZmmrSO2 = PSO2(JL,JK) + PTSPHY * PITSO2(JL,JK) + ZmmrSO2 = ZSO2 + ZTSPHY * ZITSO2 ! -- gas phase concentration [mol / m3] ZC_OH_gas = ZmmrOH * ZAIR_DENS / ZRMOH ! OH concentration from climatology is a gas concentration ZC_SO2_tot = ZmmrSO2 * ZAIR_DENS / ZRMSO2 ! SO2 concentration : in this case, ZC_SO2_gas = ZC_SO2_tot ZC_SO2_gas = ZC_SO2_tot - IF (ZC_OH_gas < 1E-18_JPRB) THEN - ZC_OH_gas=0._JPRB - ENDIF - IF (ZC_SO2_gas < 1E-18_JPRB) THEN - ZC_SO2_gas=0._JPRB + IF (ZC_OH_gas < 1E-18_JPRD) THEN + ZC_OH_gas=0._JPRD ENDIF - IF (ZC_SO2_tot < 1E-18_JPRB) THEN - ZC_SO2_tot=0._JPRB + IF (ZC_SO2_gas < 1E-18_JPRD) THEN + ZC_SO2_gas=0._JPRD + ZC_SO2_tot=0._JPRD ENDIF - ZC_OH_gas_ini = ZC_OH_gas ! -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- @@ -398,20 +400,19 @@ SUBROUTINE AER_SO2SO4_V2 & ! reference: JPL Pub. 15-10, Eval Nb 18 ! low pressure limit depends on temperature - ZKOH_LOW = ZKOH_LOW300 * (300._JPRB / ZTEMPERAT)**4.3_JPRB + ZKOH_LOW = ZKOH_LOW300 * (300._JPRD / ZTEMPERAT)**4.3_JPRD ! complete expression: see doc ZFACT1 = ZKOH_LOW * ZAIR_CONC ZFACT2 = ZFACT1 / ZKOH_HIGH - ZKOH = ZFACT1 / (1._JPRB + ZFACT2) - ZKOH = ZKOH * .6_JPRB ** (1._JPRB / (1._JPRB + LOG10(ZFACT2)**2) ) + ZKOH = ZFACT1 / (1._JPRD + ZFACT2) + ZKOH = ZKOH * .6_JPRD ** (1._JPRD / (1._JPRD + LOG10(ZFACT2)**2) ) ! -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - IF (ZKOH < 1E-18_JPRB) THEN - ZKOH=0._JPRB + IF (ZKOH < 1E-18_JPRD) THEN + ZKOH=0._JPRD ENDIF - DO JTS=1,JPTS ! -- ZTend_OH [mol / m3(air)] @@ -429,9 +430,9 @@ SUBROUTINE AER_SO2SO4_V2 & ! -- PT(xxx) in [kg(xxx) / kg(air) / s] ! using PTSPHY=sum(ZPTSCHEM) - PTSO2(JL,JK) = PTSO2(JL,JK) - ZTend_OH_Sum * ZRMSO2 / ZAIR_DENS / PTSPHY - PTSO4(JL,JK) = PTSO4(JL,JK)+ ZTend_OH_Sum * ZRMSO4 / ZAIR_DENS / PTSPHY - PTSO4_AQ(JL,JK) = 0._JPRB ! PLS: No accumulation here? + ZTSO2(JL,JK) = ZTSO2(JL,JK) - ZTend_OH_Sum * ZRMSO2 / ZAIR_DENS / ZTSPHY + ZTSO4(JL,JK) = ZTSO4(JL,JK)+ ZTend_OH_Sum * ZRMSO4 / ZAIR_DENS / ZTSPHY + ZTSO4_AQ(JL,JK) = 0._JPRD ! -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- @@ -443,13 +444,13 @@ SUBROUTINE AER_SO2SO4_V2 & ! -- Miscellaneous variables only used in aqueous phase ! -- temperature factor for Henry's law and reaction rates - ZTFACT = 1._JPRB / ZTEMPERAT - ZITREF_H + ZTFACT = 1._JPRD / ZTEMPERAT - ZITREF_H ! -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ! -- dimensionless Henry's law solubility constants [m3(g) / m3(aq)] ! -- Conversion factor, to get dimensionless Henry coefficients (H^cc) - ZCONV2 = R * ZTEMPERAT + ZCONV2 = DR * ZTEMPERAT ! -- of H2O2 ZHCC_H2O2 = ZHCP_H2O2_REF * EXP(ZHCP_H2O2_TD * ZTFACT) * ZCONV2 @@ -470,35 +471,35 @@ SUBROUTINE AER_SO2SO4_V2 & ZKEQ1_FACT = ZKEQ1_SO2 / ZHP ZKEQ2_FACT = ZKEQ2_SO2 / ZHP ! Effective Henry solubility coefficient for SO2 - ZHCC_SO2_EFF = ZHCC_SO2 * ( 1._JPRB + ZKEQ1_FACT + ZKEQ1_FACT * ZKEQ2_FACT ) + ZHCC_SO2_EFF = ZHCC_SO2 * ( 1._JPRD + ZKEQ1_FACT + ZKEQ1_FACT * ZKEQ2_FACT ) ! -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ! -- aqueous fractions in the cloudy part [dimensionless] - ZFAQ_H2O2 = 1._JPRB / (1._JPRB + 1._JPRB / (ZHCC_H2O2 * ZPNEB ) ) - ZFAQ_O3 = 1._JPRB / (1._JPRB + 1._JPRB / (ZHCC_O3 * ZPNEB ) ) - ZFAQ_OH = 1._JPRB / (1._JPRB + 1._JPRB / (ZHCC_OH * ZPNEB ) ) - ZFAQ_SO2 = 1._JPRB / (1._JPRB + 1._JPRB / (ZHCC_SO2_EFF * ZPNEB ) ) + ZFAQ_H2O2 = 1._JPRD / (1._JPRD + 1._JPRD / (ZHCC_H2O2 * ZPNEB ) ) + ZFAQ_O3 = 1._JPRD / (1._JPRD + 1._JPRD / (ZHCC_O3 * ZPNEB ) ) + ZFAQ_OH = 1._JPRD / (1._JPRD + 1._JPRD / (ZHCC_OH * ZPNEB ) ) + ZFAQ_SO2 = 1._JPRD / (1._JPRD + 1._JPRD / (ZHCC_SO2_EFF * ZPNEB ) ) ! -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ! -- Oxidants concentrations / partial pressure / ... ! -- mmr [kg / kg] - IF (PH2O2(JL,JK) > 1.0E-14_JPRB ) THEN - ZmmrH2O2 = PH2O2(JL,JK) + IF (ZH2O2 > 1.0E-14_JPRD ) THEN + ZmmrH2O2 = ZH2O2 ELSE - ZmmrH2O2 = 0.0_JPRB + ZmmrH2O2 = 0.0_JPRD ENDIF - IF (PO3(JL,JK) > 1.0E-14_JPRB ) THEN - ZmmrO3 = PO3(JL,JK)*ZSCALEO3(JL) + IF (ZO3 > 1.0E-14_JPRD ) THEN + ZmmrO3 = ZO3 * DSCALEO3(JL) ELSE - ZmmrO3 = 0.0_JPRB + ZmmrO3 = 0.0_JPRD ENDIF - IF (POH(JL,JK) > 1.0E-14_JPRB ) THEN - ZmmrOH = POH(JL,JK)*ZSCALEOH(JL) + IF (ZOH > 1.0E-14_JPRD ) THEN + ZmmrOH = ZOH * DSCALEOH(JL) ELSE - ZmmrOH = 0.0_JPRB + ZmmrOH = 0.0_JPRD ENDIF - ZmmrSO2 = PSO2(JL,JK) + PTSPHY * PITSO2(JL,JK) + ZmmrSO2 = ZSO2 + ZTSPHY * ZITSO2 ! -- gas phase concentration [mol / m3(g)] ! -- oxidants concentrations from climatologies are gas phase concentration. @@ -522,25 +523,25 @@ SUBROUTINE AER_SO2SO4_V2 & ! reference: JPL Pub. 15-10, Eval Nb 18 ! low pressure limit depends on temperature - ZKOH_LOW = ZKOH_LOW300 * (300._JPRB / ZTEMPERAT)**4.3_JPRB + ZKOH_LOW = ZKOH_LOW300 * (300._JPRD / ZTEMPERAT)**4.3_JPRD ! complete expression: see doc ZFACT1 = ZKOH_LOW * ZAIR_CONC ZFACT2 = ZFACT1 / ZKOH_HIGH - ZKOH = ZFACT1 / (1._JPRB + ZFACT2) - ZKOH = ZKOH * .6_JPRB ** (1._JPRB / (1._JPRB + LOG10(ZFACT2)**2) ) + ZKOH = ZFACT1 / (1._JPRD + ZFACT2) + ZKOH = ZKOH * .6_JPRD ** (1._JPRD / (1._JPRD + LOG10(ZFACT2)**2) ) ! -- k_H2O2 reaction rate ! reference: Seinfeld and Pandis, 2nd Ed., 2006, table 7.6 p.316 SELECT CASE(IKH2O2_select) CASE(1) ZKH2O2 = ZKH2O2_REF_v1 * EXP(ZKH2O2_TD_v1 * ZTFACT) ! unit is [L**2 / mol**2 / s] - ZKH2O2 = ZKH2O2 * ZHP / (1._JPRB + 13._JPRB * ZHP) ! unit is [L / mol / s] + ZKH2O2 = ZKH2O2 * ZHP / (1._JPRD + 13._JPRD * ZHP) ! unit is [L / mol / s] ZKH2O2 = ZKH2O2 * ZCONV3 ! unit is [m**3 / mol / s] CASE(2) ZKH2O2 = ZKH2O2_REF_v2 * EXP(ZKH2O2_TD_v2 * ZTFACT) ! unit is [L / mol / s] ??? - ZKH2O2 = ZKH2O2 / (0.1_JPRB + ZHP) ! unit is [L / mol / s] ??? according to Tsai et al ACP 2010 + ZKH2O2 = ZKH2O2 / (0.1_JPRD + ZHP) ! unit is [L / mol / s] ??? according to Tsai et al ACP 2010 ZKH2O2 = ZKH2O2 * ZCONV3 ! unit is [m**3 / mol / s] CASE DEFAULT CALL ABOR1('ABORT: IN AER_SO2SO4_V2, IKH2O2_select has incorrect value') @@ -559,7 +560,7 @@ SUBROUTINE AER_SO2SO4_V2 & ! -- gas phase concentration [mol / m3(g)] - ZC_SO2_gas = ZC_SO2_tot * (1._JPRB - ZFAQ_SO2*ZCLW_VFRAC) + ZC_SO2_gas = ZC_SO2_tot * (1._JPRD - ZFAQ_SO2*ZCLW_VFRAC) ! -- aqueous phase concentration [mol / m3(aq)] ! WARNING: these are "potential" aqueous concentrations ZC_H2O2_aqp = ZC_H2O2_gas * ZHCC_H2O2 @@ -568,7 +569,7 @@ SUBROUTINE AER_SO2SO4_V2 & ZC_Siv_aqp = ZC_SO2_gas * ZHCC_SO2_EFF ! Update fractioning between aqueous forms of S(iv) - ZC_SO2_aqp = ZC_Siv_aqp / (1._JPRB + ZKEQ1_FACT + ZKEQ1_FACT * ZKEQ2_FACT ) + ZC_SO2_aqp = ZC_Siv_aqp / (1._JPRD + ZKEQ1_FACT + ZKEQ1_FACT * ZKEQ2_FACT ) ZC_HSO3m_aqp = ZC_SO2_aqp * ZKEQ1_FACT ZC_SO3mm_aqp = ZC_HSO3m_aqp * ZKEQ2_FACT ! -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- @@ -612,20 +613,20 @@ SUBROUTINE AER_SO2SO4_V2 & ! --> will be applied to the sum of 3 reaction paths with O3 ZTend_O3_ul = ZTend_O3_r1 + ZTend_O3_r2 + ZTend_O3_r3 ZTend_O3_li = MIN(ZTend_O3_ul, ZC_O3_aqp) - IF(ZTend_O3_ul > 0._JPRB) THEN + IF(ZTend_O3_ul > 0._JPRD) THEN ZLimit_fact_O3 = ZTend_O3_li / ZTend_O3_ul ELSE - ZLimit_fact_O3 = 0._JPRB + ZLimit_fact_O3 = 0._JPRD ENDIF ! Limiting factor due to HSO3- availability ! --> will be applied to the 2 reaction with HSO3- ZSum_HSO3m_ox_ul = ZTend_H2O2 + ZTend_O3_r2 * ZLimit_fact_O3 ZSum_HSO3m_ox_li = MIN(ZSum_HSO3m_ox_ul, ZC_HSO3m_aqp) - IF(ZSum_HSO3m_ox_ul > 0._JPRB) THEN + IF(ZSum_HSO3m_ox_ul > 0._JPRD) THEN ZLimit_fact_HSO3m = ZSum_HSO3m_ox_li / ZSum_HSO3m_ox_ul ELSE - ZLimit_fact_HSO3m = 0._JPRB + ZLimit_fact_HSO3m = 0._JPRD ENDIF ! Final tendencies expressed as "potential" concentrations [mol / m3(aq)] @@ -652,7 +653,6 @@ SUBROUTINE AER_SO2SO4_V2 & ZC_H2O2_gas = ZC_H2O2_gas - ZTend_Aq ZC_O3_gas = ZC_O3_gas - ZTend_Aq - ENDDO ZTend_H2O2_Sum = ZTend_H2O2_Sum * ZCLW_VFRAC ! convert to [mol / m**3(g)] @@ -663,34 +663,41 @@ SUBROUTINE AER_SO2SO4_V2 & ! Separate wet and dry production of SO4 to allow wet SO4 distribution to M7 modes ! For "aer" case, dry and wet production are summed in AER_PHY3 (FIXME TODO IF POSSIBLE) - PTSO2(JL,JK) = PTSO2(JL,JK) - ZTend_Sum * ZRMSO2 / ZAIR_DENS / PTSPHY - PTSO4(JL,JK) = PTSO4(JL,JK) + ZTend_OH_Sum * ZRMSO4 / ZAIR_DENS / PTSPHY - PTSO4_AQ(JL,JK) = PTSO4_AQ(JL,JK) + ZTend_Aq_Sum * ZRMSO4 / ZAIR_DENS / PTSPHY + ZTSO2(JL,JK) = ZTSO2(JL,JK) - ZTend_Sum * ZRMSO2 / ZAIR_DENS / ZTSPHY + ZTSO4(JL,JK) = ZTSO4(JL,JK) + ZTend_OH_Sum * ZRMSO4 / ZAIR_DENS / ZTSPHY + ZTSO4_AQ(JL,JK) = ZTSO4_AQ(JL,JK) + ZTend_Aq_Sum * ZRMSO4 / ZAIR_DENS / ZTSPHY ! -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ENDIF - ENDDO ENDDO -DO JL=KIDIA,KFDIA - PFSO4(JL) =0.0_JPRB - PFSO4_AQ(JL)=0.0_JPRB - PFSO2(JL) =0.0_JPRB +! Cast to working precision +DO JK=1,KLEV + DO JL=KIDIA,KFDIA + PTSO4(JL,JK) = REAL(ZTSO4(JL,JK), KIND=JPRB) + PTSO4_AQ(JL,JK) = REAL(ZTSO4_AQ(JL,JK), KIND=JPRB) + PTSO2(JL,JK) = REAL(ZTSO2(JL,JK), KIND=JPRB) + ENDDO ENDDO +! Column integrated output +DO JL=KIDIA,KFDIA + PFSO4(JL) = 0.0_JPRB + PFSO4_AQ(JL)= 0.0_JPRB + PFSO2(JL) = 0.0_JPRB +ENDDO DO JK=1,KLEV - DO JL=KIDIA,KFDIA - PFSO4(JL) = PFSO4(JL) + PTSO4(JL,JK)*(PDP(JL,JK))/RG - PFSO4_AQ(JL) = PFSO4_AQ(JL) + PTSO4_AQ(JL,JK)*(PDP(JL,JK))/RG - PFSO2(JL) = PFSO2(JL) + PTSO2(JL,JK)*(PDP(JL,JK))/RG - ENDDO + DO JL=KIDIA,KFDIA + PFSO4(JL) = PFSO4(JL) + PTSO4(JL,JK) * PDP(JL,JK)/RG + PFSO4_AQ(JL) = PFSO4_AQ(JL) + PTSO4_AQ(JL,JK) * PDP(JL,JK)/RG + PFSO2(JL) = PFSO2(JL) + PTSO2(JL,JK) * PDP(JL,JK)/RG + ENDDO ENDDO - !----------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('AER_SO2SO4_V2',1,ZHOOK_HANDLE) END SUBROUTINE AER_SO2SO4_V2 From a38f73af85b6a32cc84e7fed83bf4e6118c5802f Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Fri, 29 May 2026 10:36:13 +0000 Subject: [PATCH 127/129] Pull request #80: Read Tegen dust climatology only if used Merge in ~NM6/openifs-48r1 from tegen-nc-read to knmi-m7 Squashed commit of the following: commit ee5e31cd62806b4b63370cf408741bd6e82fdba6 Author: Simone Vacondio Date: Wed May 27 15:11:46 2026 +0200 Restore Tegen dust clim condition Restore Tegen dust climatology condition for setup: Tegen setup is only done when NDDUST=8. --- ifs-source/arpifs/phys_radi/suecrad.F90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ifs-source/arpifs/phys_radi/suecrad.F90 b/ifs-source/arpifs/phys_radi/suecrad.F90 index 0dffd4eb..095f4790 100644 --- a/ifs-source/arpifs/phys_radi/suecrad.F90 +++ b/ifs-source/arpifs/phys_radi/suecrad.F90 @@ -2651,8 +2651,8 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) IF (.NOT. ASSOCIATED(YDUSTCLIM)) THEN ALLOCATE(YDUSTCLIM) -!ENDIF -!IF (NDDUST==8) THEN !! Cannot skip this "READ" step even if not used +ENDIF +IF (NDDUST==8) THEN WRITE(UNIT=KULOUT,FMT='(" TEGEN DUST CLIM: Reading dust fields ")') CALL YDUSTCLIM%READ() ENDIF From d26e031e374884ac13fd296225b178e6accc0dbd Mon Sep 17 00:00:00 2001 From: Philippe Le Sager Date: Fri, 12 Jun 2026 11:34:30 +0000 Subject: [PATCH 128/129] Pull request #81: Fix ice Reff in case of MBN cloud activation scheme Merge in ~NM6/openifs-48r1 from OIFS-683-fix-reffice to knmi-m7 Squashed commit of the following: commit 7b4b600b204bf8fd04ade94f09e67463073199de Author: Philippe Le Sager Date: Mon Jun 8 18:14:20 2026 +0200 Fix ice Reff in case of MBN cloud activation scheme --- ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 index d475d84e..5948dd0c 100755 --- a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -542,6 +542,8 @@ SUBROUTINE HAMM7_INTERFACE( & & RRHTAB => YREAERSNK%RRHTAB, & & RNICE => YRECLDP%RNICE, & !default for ICNC & RCLDMAX => YRECLDP%RCLDMAX, & !max cloud value + & LAERICESED => YRECLDP%LAERICESED, & + & LAERICEAUTO => YRECLDP%LAERICEAUTO, & & NSTART => YDRIP%NSTART ) ! & NINDSCAV=>YREAERATM%NINDSCAV, NTSCAV=>YREAERATM%NTSCAV, & @@ -977,7 +979,9 @@ SUBROUTINE HAMM7_INTERFACE( & ! Store effective radii in PGFL PGFL(KIDIA:KFDIA,1:KLEV,YRE_LIQ%MP9_PH) = 1.0E-06_JPRB * REFFL(KIDIA:KFDIA,1:KLEV,ZKROW) ! convert um to meters - PGFL(KIDIA:KFDIA,1:KLEV,YRE_ICE%MP9_PH) = 1.0E-06_JPRB * REFFI(KIDIA:KFDIA,1:KLEV,ZKROW) ! convert um to meters + IF (LAERICESED .OR. LAERICEAUTO) THEN + PGFL(KIDIA:KFDIA,1:KLEV,YRE_ICE%MP9_PH) = 1.0E-06_JPRB * REFFI(KIDIA:KFDIA,1:KLEV,ZKROW) ! convert um to meters + ENDIF ELSE IF (NCLOUDACT == 2) THEN ! AR&G scheme @@ -1102,7 +1106,7 @@ SUBROUTINE HAMM7_INTERFACE( & ZXTTE_CLD(KIDIA:KFDIA,1:KLEV,IDT_ICNC) = (ZXTM1(KIDIA:KFDIA,1:KLEV,IDT_ICNC) - ZICNC_temp(KIDIA:KFDIA,1:KLEV))/time_step_len !----------------------------------------------------------------- - !--> Calculation of effective radii (Note: already done if NCLOUDACT=1) + !--> Calculation of liquid effective radii (Note: already done if NCLOUDACT=1) IF (NCLOUDACT == 2 .OR. NCLOUDACT == 0 ) THEN DO JK=1,KLEV @@ -1116,6 +1120,12 @@ SUBROUTINE HAMM7_INTERFACE( & ! Add liq. eff. rad. to HAM variables (only if there is liquid cloud else minimum value) REFFL(KIDIA:KFDIA,1:KLEV,ZKROW) = MERGE(ZRE_LIQ(KIDIA:KFDIA,1:KLEV), ZDEF_RE_LIQ, LLIQCLD(KIDIA:KFDIA,1:KLEV)) + ! add effective radii to PGFL fields + PGFL(KIDIA:KFDIA,1:KLEV,YRE_LIQ%MP9_PH) = 1.0E-06_JPRB * REFFL(KIDIA:KFDIA,1:KLEV,ZKROW) ! convert um to meters and save to PGFL fields + ENDIF + + !--> Calculation of ice effective radii (Note: already done if NCLOUDACT=1 *and* (LAERICESED .OR. LAERICEAUTO) ) + IF (.NOT. (NCLOUDACT==1 .AND. (LAERICESED .OR. LAERICEAUTO) )) THEN CALL ICE_EFFECTIVE_RADIUS(YRERAD, YDSPP_CONFIG, KIDIA, KFDIA, KLON, KLEV, & & PRSF1, PTP, ZAP, PIP, PSP, PGEMU, & ! pressure, temp, cloud fr., IWC, SWC, sine of latitude & reffi(1:KLON,1:KLEV,ZKROW)) ! ice effective radius (updated to mo_activ variable 'reffi' which used in mo_ham_wetdep) @@ -1124,7 +1134,6 @@ SUBROUTINE HAMM7_INTERFACE( & REFFI(KIDIA:KFDIA,1:KLEV,ZKROW) = MERGE(REFFI(KIDIA:KFDIA,1:KLEV,ZKROW), ZDEF_RE_ICE, LICECLD(KIDIA:KFDIA,1:KLEV)) ! add effective radii to PGFL fields - PGFL(KIDIA:KFDIA,1:KLEV,YRE_LIQ%MP9_PH) = 1.0E-06_JPRB * REFFL(KIDIA:KFDIA,1:KLEV,ZKROW) ! convert um to meters and save to PGFL fields PGFL(KIDIA:KFDIA,1:KLEV,YRE_ICE%MP9_PH) = 1.0E-06_JPRB * REFFI(KIDIA:KFDIA,1:KLEV,ZKROW) ! convert um to meters and save to PGFL fields ENDIF From 7e1a9c91fd56d3cf070479674a01abfb04a71204 Mon Sep 17 00:00:00 2001 From: "P. Le Sager" Date: Tue, 23 Jun 2026 11:41:25 +0200 Subject: [PATCH 129/129] Reconcile SP and DP computations Several strategies are applied to resolve discrepancies between SP and DP experiments: * Use the standard erf implementation to compute CDF and its complement * Use the same threshold value to guard against FPEs and for physical branch cutoffs regardless of precision * Add M7 threshold to log * Force H2SO4 condensation/budget code (m7_prod_cond) to double precision: The H2SO4 gas-phase condensation calculation in working precision with unguarded division by pcs (condensation sink) and multiple catastrophic cancellations. In SP, this creates large errors: - Division by pcs without adequate floor amplifies noise - Analytic solution: (zh2so4_cf0 - dpso4g/pcs)*exp(...) + dpso4g/pcs loses significant digits when dpso4g/pcs >> zh2so4_cf0 - Second cancellation: zfcond_cf = zh2so4_cf0 - zh2so4_cf1 Fix: enforce DP computations, casting input into DP and output to working precision. This mirrors the nucleation treatment (already forced to JPRD) and removes a major SP divergence source in the condensation pathway. * Remove unneeded minimum value in one radius average computation * Increase test robustness in mo_ham_rad * Make a safe division more robust in kappa computation in mo_ham_m7 * Better guard against division by 0 in wetdep * Remove if statement before call to CCNSPEC in MBN * Straighten some constant declaration --- ifs-source/arpifs/m7/hamm7_init.F90 | 3 + ifs-source/arpifs/m7/module/mo_ham_activ.F90 | 12 +- ifs-source/arpifs/m7/module/mo_ham_m7.F90 | 329 +++++------------- ifs-source/arpifs/m7/module/mo_ham_rad.F90 | 54 +-- ifs-source/arpifs/m7/module/mo_ham_tools.F90 | 4 +- ifs-source/arpifs/m7/module/mo_ham_wetdep.F90 | 17 +- ifs-source/arpifs/m7/module/mo_kind.F90 | 6 + .../arpifs/m7/module/mo_math_constants.F90 | 4 +- .../arpifs/m7/module/mo_tracer_processes.F90 | 9 +- ifs-source/arpifs/m7/module/nd_param.F90 | 6 +- .../arpifs/m7/phys_ec/yoe_aer_activ.F90 | 49 ++- 11 files changed, 171 insertions(+), 322 deletions(-) diff --git a/ifs-source/arpifs/m7/hamm7_init.F90 b/ifs-source/arpifs/m7/hamm7_init.F90 index 0736abbc..a6d0a670 100644 --- a/ifs-source/arpifs/m7/hamm7_init.F90 +++ b/ifs-source/arpifs/m7/hamm7_init.F90 @@ -55,6 +55,7 @@ SUBROUTINE hamm7_init(YGFL, YRRIP, CHEM_SCHEME) USE YOMLUN, ONLY : NULOUT ! --- M7 modules -------------------------------------------------------------- +USE MO_KIND, ONLY: THRESHOLD USE MO_TIME_CONTROL, ONLY: init_mo_time_control USE MO_SPECIES, ONLY: speclist ! tracer species in HAM USE MO_HAM, ONLY: & @@ -478,6 +479,8 @@ SUBROUTINE hamm7_init(YGFL, YRRIP, CHEM_SCHEME) ! -- LOG WRITE(NULOUT,'("====== HAMM7_INIT ===== ")') +WRITE(NULOUT,*) "TOLERANCE (EPS): ", THRESHOLD + WRITE(NULOUT,'("Number of size classes:", I3)') znclass WRITE(NULOUT,'(" class# / IFS id / HM7 id / IFSNAME / M7NAME ")') DO J_CLASS = 1,NCLASS diff --git a/ifs-source/arpifs/m7/module/mo_ham_activ.F90 b/ifs-source/arpifs/m7/module/mo_ham_activ.F90 index 73adbbe1..451cbc43 100644 --- a/ifs-source/arpifs/m7/module/mo_ham_activ.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_activ.F90 @@ -45,7 +45,7 @@ MODULE mo_ham_activ - USE mo_kind, ONLY: dp + USE mo_kind, ONLY: dp, THRESHOLD USE mo_ham, ONLY: sizeclass,nclass !#ifdef _OPENMP @@ -207,7 +207,7 @@ SUBROUTINE ham_activ_abdulrazzak_ghan(kproma, kbdim, klev, krow, ktdia, & pfracn(1:kproma,:,:) = 0._dp pcdncact(1:kproma,:) = 0._dp - zeps=EPSILON(1._dp) + zeps=THRESHOLD ! Use for both physical cutoff and safe division !--- Conversions to SI units [g mol-1 to kg mol-1]: @@ -320,6 +320,7 @@ SUBROUTINE ham_activ_abdulrazzak_ghan(kproma, kbdim, klev, krow, ktdia, & !< zeps) psmax(jl,jk,:)=1._dp/SQRT(zsum(:)) ELSEWHERE @@ -558,7 +559,7 @@ SUBROUTINE ham_activ_koehler_ab(kproma, kbdim, klev, krow, ktdia, & zsumtop(1:kproma,:,:) = 0._dp zsumbot(1:kproma,:,:) = 0._dp - zeps=EPSILON(1._dp) + zeps=THRESHOLD ! Use for safe division only here !--- Conversions to SI units [g mol-1 to kg mol-1]: @@ -596,6 +597,7 @@ SUBROUTINE ham_activ_koehler_ab(kproma, kbdim, klev, krow, ktdia, & jclass = aerocomp(jn)%iclass IF (nion > 0 .AND. sizeclass(jclass)%lactivation) THEN !>>dod<< #377 + ! PLS - TODO: SAFE DIVISION WHERE(zmasssum(1:kproma,:,jclass)>zeps) zmassfrac(1:kproma,:)=pxtm1(1:kproma,:,jt)/zmasssum(1:kproma,:,jclass) @@ -696,7 +698,7 @@ SUBROUTINE ham_avail_activ_lin_leaitch(kproma, kbdim, klev, krow, & DO jclass=1, nclass !SF the ham_m7_logtail calculation is now done mode per mode for better efficiency IF (sizeclass(jclass)%lactivation) THEN - IF (cfracn(jclass) > EPSILON(1._dp)) THEN !SF #279: only performs this calculation when relevant + IF (cfracn(jclass) > THRESHOLD ) THEN !SF #279: only performs this calculation when relevant !SF stratiform: zr(1:kproma,:,jclass)=crcut @@ -786,7 +788,7 @@ SUBROUTINE ham_activ_diag_lin_leaitch(kproma, kbdim, klev, krow, prho, pxtm1, pc REAL(dp) :: zeps REAL(dp) :: ztmp1(kbdim,klev), ztmp2(kbdim,klev) - zeps = EPSILON(1._dp) + zeps = THRESHOLD !EPSILON(1._dp) DO jclass=1, nclass !>>dod #377 diff --git a/ifs-source/arpifs/m7/module/mo_ham_m7.F90 b/ifs-source/arpifs/m7/module/mo_ham_m7.F90 index ad942064..5cf02d10 100644 --- a/ifs-source/arpifs/m7/module/mo_ham_m7.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_m7.F90 @@ -59,16 +59,16 @@ MODULE mo_ham_m7 -USE mo_kind, ONLY: dp + USE mo_kind, ONLY: dp, THRESHOLD + USE parkind1, ONLY: JPRD -IMPLICIT NONE - -PRIVATE + IMPLICIT NONE -PUBLIC :: m7, m7_cumulative_normal + PRIVATE + PUBLIC :: m7, m7_cumulative_normal -!REAL(dp), PUBLIC, ALLOCATABLE :: rwet_m7(:,:,:), rdry_m7(:,:,:) -!REAL(dp), PUBLIC, ALLOCATABLE :: densaer_m7(:,:,:), aerwat_m7(:,:,:) + !REAL(dp), PUBLIC, ALLOCATABLE :: rwet_m7(:,:,:), rdry_m7(:,:,:) + !REAL(dp), PUBLIC, ALLOCATABLE :: densaer_m7(:,:,:), aerwat_m7(:,:,:) CONTAINS @@ -143,192 +143,17 @@ SUBROUTINE m7_cumulative_normal ( arg, presult, ccum ) ! functions, and proper selection of the machine-dependent ! constants. ! - ! Explanation of machine-dependent constants. - ! - ! MIN = smallest machine representable number. - ! - ! EPS = argument below which anorm(x) may be represented by - ! 0.5 and above which x*x will not underflow. - ! A conservative value is the largest machine number X - ! such that 1.0 + X = 1.0 to machine precision. - ! - ! Error returns - ! - ! The program returns ANORM = 0 for ARG .LE. XLOW. - ! - ! Author: - ! - ! W. J. Cody - ! Mathematics and Computer Science Division - ! Argonne National Laboratory - ! Argonne, IL 60439 - ! - ! Latest modification: March 15, 1992 ! USE mo_kind, ONLY: dp ! IMPLICIT NONE ! - REAL(dp), PARAMETER, DIMENSION ( 5 ) :: a = (/ & - 2.2352520354606839287e00_dp, & - 1.6102823106855587881e02_dp, & - 1.0676894854603709582e03_dp, & - 1.8154981253343561249e04_dp, & - 6.5682337918207449113e-2_dp /) - REAL(dp) :: arg - REAL(dp), PARAMETER, DIMENSION ( 4 ) :: b = (/ & - 4.7202581904688241870e01_dp, & - 9.7609855173777669322e02_dp, & - 1.0260932208618978205e04_dp, & - 4.5507789335026729956e04_dp /) - REAL(dp), PARAMETER, DIMENSION ( 9 ) :: c = (/ & - 3.9894151208813466764e-1_dp, & - 8.8831497943883759412e00_dp, & - 9.3506656132177855979e01_dp, & - 5.9727027639480026226e02_dp, & - 2.4945375852903726711e03_dp, & - 6.8481904505362823326e03_dp, & - 1.1602651437647350124e04_dp, & - 9.8427148383839780218e03_dp, & - 1.0765576773720192317e-8_dp /) - REAL(dp) :: ccum - REAL(dp), PARAMETER, DIMENSION ( 8 ) :: d = (/ & - 2.2266688044328115691e01_dp, & - 2.3538790178262499861e02_dp, & - 1.5193775994075548050e03_dp, & - 6.4855582982667607550e03_dp, & - 1.8615571640885098091e04_dp, & - 3.4900952721145977266e04_dp, & - 3.8912003286093271411e04_dp, & - 1.9685429676859990727e04_dp /) - REAL(dp) :: del -!@@@ REAL(dp) :: dpmpar - REAL(dp) :: eps - INTEGER :: i - REAL(dp) :: zmin - REAL(dp), PARAMETER, DIMENSION ( 6 ) :: p = (/ & - 2.1589853405795699e-1_dp, & - 1.274011611602473639e-1_dp, & - 2.2235277870649807e-2_dp, & - 1.421619193227893466e-3_dp, & - 2.9112874951168792e-5_dp, & - 2.307344176494017303e-2_dp /) - REAL(dp), PARAMETER, DIMENSION ( 5 ) :: q = (/ & - 1.28426009614491121e00_dp, & - 4.68238212480865118e-1_dp, & - 6.59881378689285515e-2_dp, & - 3.78239633202758244e-3_dp, & - 7.29751555083966205e-5_dp /) - REAL(dp) :: presult - REAL(dp), PARAMETER :: root32 = 5.656854248_dp - REAL(dp), PARAMETER :: sixten = 16.0_dp - REAL(dp) :: temp - REAL(dp), PARAMETER :: sqrpi = 3.9894228040143267794e-1_dp - REAL(dp), PARAMETER :: thrsh = 0.66291_dp - REAL(dp) :: x - REAL(dp) :: xden - REAL(dp) :: xnum - REAL(dp) :: y - REAL(dp) :: xsq - - - !REAL(dp), ALLOCATABLE :: rwet_m7(:,:,:), rdry_m7(:,:,:) - !REAL(dp), ALLOCATABLE :: densaer_m7(:,:,:), aerwat_m7(:,:,:) - ! - ! Machine dependent constants - ! - eps = EPSILON ( 1.0_dp ) * 0.5_dp - ! - !@@@ Simplified calculation of the smallest machine representable number - ! (Higher accuracy than needed!) - ! - !@@@ min = dpmpar(2) - - zmin = EPSILON ( 1.0_dp ) - - x = arg - y = ABS ( x ) - - IF ( y <= thrsh ) THEN - ! - ! Evaluate anorm for |X| <= 0.66291 - ! - IF ( y > eps ) THEN - xsq = x * x - ELSE - xsq = 0.0_dp - END IF - - xnum = a(5) * xsq - xden = xsq - DO i = 1, 3 - xnum = ( xnum + a(i) ) * xsq - xden = ( xden + b(i) ) * xsq - END DO - presult = x * ( xnum + a(4) ) / ( xden + b(4) ) - temp = presult - presult = 0.5_dp + temp - ccum = 0.5_dp - temp - ! - ! Evaluate ANORM for 0.66291 <= |X| <= sqrt(32) - ! - ELSE IF ( y <= root32 ) THEN - - xnum = c(9) * y - xden = y -!DIR$ UNROLL -!CDIR UNROLL=7 - DO i = 1, 7 - xnum = ( xnum + c(i) ) * y - xden = ( xden + d(i) ) * y - END DO - presult = ( xnum + c(8) ) / ( xden + d(8) ) - xsq = AINT ( y * sixten ) / sixten - del = ( y - xsq ) * ( y + xsq ) - presult = EXP(-xsq*xsq*0.5_dp) * EXP(-del*0.5_dp) * presult - ccum = 1.0_dp - presult - - IF ( x > 0.0_dp ) THEN - temp = presult - presult = ccum - ccum = temp - END IF - ! - ! Evaluate anorm for |X| > sqrt(32). - ! - ELSE + REAL(dp), INTENT(IN) :: arg + REAL(dp), INTENT(OUT) :: ccum + REAL(dp), INTENT(OUT) :: presult - presult = 0.0_dp - xsq = 1.0_dp / ( x * x ) - xnum = p(6) * xsq - xden = xsq - DO i = 1, 4 - xnum = ( xnum + p(i) ) * xsq - xden = ( xden + q(i) ) * xsq - END DO - - presult = xsq * ( xnum + p(5) ) / ( xden + q(5) ) - presult = ( sqrpi - presult ) / y - xsq = AINT ( x * sixten ) / sixten - del = ( x - xsq ) * ( x + xsq ) - presult = EXP ( - xsq * xsq * 0.5_dp ) * EXP ( - del * 0.5_dp ) * presult - ccum = 1.0_dp - presult - - IF ( x > 0.0_dp ) THEN - temp = presult - presult = ccum - ccum = temp - END IF - - END IF - - IF ( presult < zmin ) THEN - presult = 0.0_dp - END IF - - IF ( ccum < zmin ) THEN - ccum = 0.0_dp - END IF + presult = 0.5_dp * (1.0_dp + erf(arg / sqrt(2.0_dp))) + ccum = 0.5_dp * erfc(arg / sqrt(2.0_dp)) END SUBROUTINE m7_cumulative_normal @@ -913,6 +738,7 @@ SUBROUTINE m7_averageproperties(kproma, kbdim, klev, krow, paernl, paerml, pttn, ztmp2(1:kproma,:) = ram2cmr(jclass)*((ztmp1(1:kproma,:)/z4piover3)**(1._dp/3._dp)) + ! Use cminrad as fallback instead of keeping stale pm6rp? TODO check pm6rp(1:kproma,:,jclass) = MERGE(ztmp2(1:kproma,:), pm6rp(1:kproma,:,jclass), ll1(1:kproma,:)) !< 1.0E-10_dp) THEN ! Regular H2SO4 condensation sink of the aerosol - + + ! Floor pcs for safe division and promote to JPRD for precision-critical condensation calculation + zpcs_safe = MAX(REAL(pcs(jl,jk), JPRD), 1.0E-10_JPRD) + zdpso4g = REAL(dpso4g(jl,jk), JPRD) + zpcs_ts = zpcs_safe * REAL(time_step_len, JPRD) + ! Safety check on the cloud fraction: cc = min(paclc(jl,jk),1.0_dp) cc = max(cc,0.0_dp) - + ! ! Cloud-free part of the grid box: ! - + ! Start [H2SO4(g)]: - zh2so4_cf0 = pso4g(jl,jk) - + zh2so4_cf0 = REAL(pso4g(jl,jk), JPRD) + ! End [H2SO4(g)]: zh2so4_cf1 = & - (zh2so4_cf0 - dpso4g(jl,jk)/pcs(jl,jk))*exp(-pcs(jl,jk)*time_step_len) & - + dpso4g(jl,jk)/pcs(jl,jk) - + (zh2so4_cf0 - zdpso4g/zpcs_safe)*EXP(-zpcs_ts) & + + zdpso4g/zpcs_safe + ! Safety check: - zh2so4_cf1 = max(zh2so4_cf1,0.0_dp) + zh2so4_cf1 = MAX(zh2so4_cf1, 0.0_JPRD) ! ! Cloudy part of the grid box: ! - + ! Start [H2SO4(g)]: - zh2so4_cy0 = pso4g(jl,jk) - + zh2so4_cy0 = REAL(pso4g(jl,jk), JPRD) + ! End [H2SO4(g)]: - zh2so4_cy1 = 0.0_dp - - ! + zh2so4_cy1 = 0.0_JPRD + + ! ! New grid box-averaged [H2SO4(g)]: ! - - pso4g(jl,jk) = (1.0_dp-cc)*zh2so4_cf1 + cc*zh2so4_cy1 - + + pso4g(jl,jk) = REAL((1.0_JPRD-REAL(cc,JPRD))*zh2so4_cf1 + REAL(cc,JPRD)*zh2so4_cy1, dp) + ! [H2SO4(g)] that condensed onto aerosol particles during the time step ! in the cloud-free and cloudy part of the grid box: - - zfcond_cf = (1.0_dp-cc)*(zh2so4_cf0 - zh2so4_cf1 + dpso4g(jl,jk)*time_step_len) - zfcond_cy = cc*(zh2so4_cy0 - zh2so4_cy1 + dpso4g(jl,jk)*time_step_len) + + zfcond_cf = (1.0_JPRD-REAL(cc,JPRD))*(zh2so4_cf0 - zh2so4_cf1 + zdpso4g*REAL(time_step_len,JPRD)) + zfcond_cy = REAL(cc,JPRD)*(zh2so4_cy0 - zh2so4_cy1 + zdpso4g*REAL(time_step_len,JPRD)) ! Distribute H2SO4(g) condensing in the cloud-free part of the grid box ! on the soluble and insoluble aerosol modes according to their ! condensation sinks: - - paerml(jl,jk,iso4ns) = paerml(jl,jk,iso4ns) + pcsi(jl,jk,iso4ns)/pcs(jl,jk)*zfcond_cf - paerml(jl,jk,iso4ks) = paerml(jl,jk,iso4ks) + pcsi(jl,jk,iso4ks)/pcs(jl,jk)*zfcond_cf - paerml(jl,jk,iso4as) = paerml(jl,jk,iso4as) + pcsi(jl,jk,iso4as)/pcs(jl,jk)*zfcond_cf - paerml(jl,jk,iso4cs) = paerml(jl,jk,iso4cs) + pcsi(jl,jk,iso4cs)/pcs(jl,jk)*zfcond_cf - + + paerml(jl,jk,iso4ns) = paerml(jl,jk,iso4ns) + REAL(REAL(pcsi(jl,jk,iso4ns),JPRD)/zpcs_safe*zfcond_cf, dp) + paerml(jl,jk,iso4ks) = paerml(jl,jk,iso4ks) + REAL(REAL(pcsi(jl,jk,iso4ks),JPRD)/zpcs_safe*zfcond_cf, dp) + paerml(jl,jk,iso4as) = paerml(jl,jk,iso4as) + REAL(REAL(pcsi(jl,jk,iso4as),JPRD)/zpcs_safe*zfcond_cf, dp) + paerml(jl,jk,iso4cs) = paerml(jl,jk,iso4cs) + REAL(REAL(pcsi(jl,jk,iso4cs),JPRD)/zpcs_safe*zfcond_cf, dp) + ! Number of H2SO4 molecules condensing on the insoluble modes: ! (Transfer from insoluble to soluble modes is calculated in m7_concoag) - - pso4_5(jl,jk) = pcsi(jl,jk,5)/pcs(jl,jk)*zfcond_cf - pso4_6(jl,jk) = pcsi(jl,jk,6)/pcs(jl,jk)*zfcond_cf - pso4_7(jl,jk) = pcsi(jl,jk,7)/pcs(jl,jk)*zfcond_cf + + pso4_5(jl,jk) = REAL(REAL(pcsi(jl,jk,5),JPRD)/zpcs_safe*zfcond_cf, dp) + pso4_6(jl,jk) = REAL(REAL(pcsi(jl,jk,6),JPRD)/zpcs_safe*zfcond_cf, dp) + pso4_7(jl,jk) = REAL(REAL(pcsi(jl,jk,7),JPRD)/zpcs_safe*zfcond_cf, dp) ! Commit the H2SO4(g) condensing in the cloudy part of the grid box ! to the largest aerosol mode, assuming that that mode contributes ! aerosol particles that activated and became cloud droplets: - + IF (pcsi(jl,jk,iso4cs) > 0.0_dp) THEN - paerml(jl,jk,iso4cs) = paerml(jl,jk,iso4cs) + zfcond_cy + paerml(jl,jk,iso4cs) = paerml(jl,jk,iso4cs) + REAL(zfcond_cy, dp) ELSEIF (pcsi(jl,jk,iso4as) > 0.0_dp) THEN - paerml(jl,jk,iso4as) = paerml(jl,jk,iso4as) + zfcond_cy + paerml(jl,jk,iso4as) = paerml(jl,jk,iso4as) + REAL(zfcond_cy, dp) ELSEIF (pcsi(jl,jk,iso4ks) > 0.0_dp) THEN - paerml(jl,jk,iso4ks) = paerml(jl,jk,iso4ks) + zfcond_cy + paerml(jl,jk,iso4ks) = paerml(jl,jk,iso4ks) + REAL(zfcond_cy, dp) ELSEIF (pcsi(jl,jk,iso4ns) > 0.0_dp) THEN - paerml(jl,jk,iso4ns) = paerml(jl,jk,iso4ns) + zfcond_cy + paerml(jl,jk,iso4ns) = paerml(jl,jk,iso4ns) + REAL(zfcond_cy, dp) ELSEIF (pcsi(jl,jk,7) > 0.0_dp) THEN - pso4_7(jl,jk) = pso4_7(jl,jk) + zfcond_cy + pso4_7(jl,jk) = pso4_7(jl,jk) + REAL(zfcond_cy, dp) ELSEIF (pcsi(jl,jk,6) > 0.0_dp) THEN - pso4_6(jl,jk) = pso4_6(jl,jk) + zfcond_cy + pso4_6(jl,jk) = pso4_6(jl,jk) + REAL(zfcond_cy, dp) ELSEIF (pcsi(jl,jk,5) > 0.0_dp) THEN - pso4_5(jl,jk) = pso4_5(jl,jk) + zfcond_cy + pso4_5(jl,jk) = pso4_5(jl,jk) + REAL(zfcond_cy, dp) ENDIF ! Vertically integrate mass of condensed sulfate for diagnostics, ! converting [molec. cm-3] to [kg(SO4) m-2]: #ifdef HAMMOZ d_cond_so4(jl,krow) = d_cond_so4(jl,krow) & - + (((zfcond_cf + zfcond_cy)*mw_so4*1.E3_dp)/avo)*pdz(jl,jk)*zqtmst*delta_time + + REAL((((zfcond_cf + zfcond_cy)*REAL(mw_so4,JPRD)*1.E3_JPRD)/REAL(avo,JPRD)) & + *REAL(pdz(jl,jk),JPRD)*REAL(zqtmst,JPRD)*REAL(delta_time,JPRD), dp) #endif ELSE ! H2SO4 condensation sink of the aerosol extremely small: @@ -2387,7 +2224,7 @@ SUBROUTINE m7_nuck(kproma, kbdim, klev, krow, & zqtmst = 1.0_dp/ztmst - zeps = EPSILON(1.0_dp) + zeps = THRESHOLD ! Relative humidity [%]: @@ -3039,7 +2876,7 @@ SUBROUTINE m7_dconc(kproma, kbdim, klev, krow, paerml, paernl, pm6dry) zfconm(:,:,:) = 1._dp zfconn(:,:,:) = 1._dp - zeps = EPSILON(1._dp) + zeps = THRESHOLD ! threshold for numerical zero in CDF comparisons ! !--- 1) Identify how much the mode jclass has grown into the next higher mode @@ -3491,7 +3328,7 @@ SUBROUTINE m7_coaset(kproma, kbdim, klev, krow, paernl, ptp1, & zhu2, zhu !---executable procedure - zeps = EPSILON(1._dp) + zeps = THRESHOLD !EPSILON(1._dp) !---1) gridpoint properties DO jk=1,klev @@ -3574,7 +3411,9 @@ SUBROUTINE m7_coaset(kproma, kbdim, klev, krow, paernl, ptp1, & IF (lsuffaero(jl,jk,jm1) .AND. lsuffaero(jl,jk,jm2)) THEN !--- Average radius of the modes: - zrpav=zeps+0.5_dp*(pm6rp(jl,jk,jm1)+pm6rp(jl,jk,jm2)) + zrpav=0.5_dp*(pm6rp(jl,jk,jm1)+pm6rp(jl,jk,jm2)) + ! Note the pm6rp are > cimrad=1.e-8, so the following is not needed: + ! zrpav = MAX(zeps, 0.5_dp*(pm6rp(jl,jk,jm1)+pm6rp(jl,jk,jm2)) ) !--- Fuchs: G_r (below Eq. 49.27): zcv2av=SQRT(zcv2(jl,jk,jm1) + zcv2(jl,jk,jm2)) @@ -3732,7 +3571,7 @@ SUBROUTINE m7_concoag (kproma, kbdim, klev, krow, & !--- 0) Initializations: - zeps=EPSILON(1._dp) + zeps = THRESHOLD ! Use for safe division. Could use EPSILON, but smaller-in-SP THRESHOLD is ok because of the MIN(a,b/threshold). TINY would be good candidate here. !--- 1) Redistribution of mass and numbers after nucleation, coagulation ---- @@ -4099,7 +3938,7 @@ SUBROUTINE m7_delcoa(kproma, kbdim, klev, krow, paerml, & !--- 0) Initialisations: ------------------------------------------------ ztmst = time_step_len - zeps = EPSILON(1._dp) + zeps = THRESHOLD za4av = 0._dp za4av1(:,:) = 0._dp @@ -4480,6 +4319,8 @@ SUBROUTINE m7_delcoa(kproma, kbdim, klev, krow, paerml, & DO kmod=1,nclass IF (kmod>jclass) THEN !kai + ! Current value of THRESHOLD (epsilon of double precision) sits between TINY and + ! EPSILON. Fine, mimics original DP case when running in SP. IF (abs(zbftot).gt.zeps) then pbfract1(jl,jk,kmod-jclass)=pbfract1(jl,jk,kmod-jclass)/zbftot ELSE diff --git a/ifs-source/arpifs/m7/module/mo_ham_rad.F90 b/ifs-source/arpifs/m7/module/mo_ham_rad.F90 index b2c34bf7..bd67c688 100755 --- a/ifs-source/arpifs/m7/module/mo_ham_rad.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_rad.F90 @@ -68,7 +68,7 @@ MODULE mo_ham_rad sizeclass, & nclass USE mo_ham, ONLY: subm_aerospec - USE mo_kind, ONLY: dp + USE mo_kind, ONLY: dp, THRESHOLD USE mo_species, ONLY: speclist, naerospec, nmaxspec !>>dod soa USE mo_ham_species, ONLY: id_oc, id_wat !!mgs!! , naerospec=>ham_naerospec, aerospec=>ham_aerospec @@ -240,7 +240,7 @@ SUBROUTINE ham_rad_refrac_volume(kproma, kbdim, klev, krow, ktrac, kmod, kwv, & !---executable procedure - zeps=EPSILON(1.0_dp) + zeps = THRESHOLD ! Used for both physical cutoff and safe division !>>dod openmp bugfix removed allocation of arrays @@ -304,7 +304,7 @@ SUBROUTINE ham_rad_refrac_volume(kproma, kbdim, klev, krow, ktrac, kmod, kwv, & !---Weighted averaging: DO jk=1,klev DO jl=1,kproma - IF(zvsum(jl,jk)>zeps) THEN + IF(zvsum(jl,jk)>zeps) THEN ! safe division pnr(jl,jk)=znrsum(jl,jk)/zvsum(jl,jk) pni(jl,jk)=znisum(jl,jk)/zvsum(jl,jk) @@ -372,7 +372,7 @@ SUBROUTINE ham_rad_refrac_maxgar(kproma, kbdim, klev, krow, ktrac, kmod, kwv, & !--- Local variables: INTEGER :: jl, jk, jt, jn - REAL(dp) :: zdensity, zeps, zv, zvfrac + REAL(dp) :: zdensity, zeps, zv, zvfrac, zepsrel INTEGER :: ikey @@ -393,7 +393,8 @@ SUBROUTINE ham_rad_refrac_maxgar(kproma, kbdim, klev, krow, ktrac, kmod, kwv, & !---executable procedure - zeps=EPSILON(1.0_dp) + zeps = THRESHOLD ! Used for both physical cutoff and safe division + zepsrel = EPSILON(1._dp)*100. ! Used for bound checking !>>dod openmp bugfix removed allocation of arrays !<zeps) THEN + IF(zvsum(jl,jk)>zeps) THEN ! Safe division cn_eff(jl,jk)=CMPLX( znrsum(jl,jk)/zvsum(jl,jk) , znisum(jl,jk)/zvsum(jl,jk), kind=dp ) ELSE cn_eff(jl,jk)=CMPLX( 0.0_dp , 0.0_dp, kind=dp ) @@ -486,9 +486,8 @@ SUBROUTINE ham_rad_refrac_maxgar(kproma, kbdim, klev, krow, ktrac, kmod, kwv, & DO jk=1,klev DO jl=1,kproma !<zeps) THEN - IF (zvcore(jl,jk)/zvsum(jl,jk)>zeps .AND. zvcore(jl,jk)/zvsum(jl,jk)<(1.0_dp-zeps)) THEN + IF (zvsum(jl,jk)>0._dp) THEN + IF (zvcore(jl,jk) > zvsum(jl,jk)*zepsrel .AND. zvcore(jl,jk) < zvsum(jl,jk)*(1.0_dp-zepsrel)) THEN lcore(jl,jk)=.TRUE. END IF END IF @@ -536,7 +535,7 @@ SUBROUTINE ham_rad_refrac_maxgar(kproma, kbdim, klev, krow, ktrac, kmod, kwv, & DO jk=1, klev DO jl=1, kproma - IF(pxtm1(jl,jk,jt)>zeps) THEN + IF(pxtm1(jl,jk,jt)>zeps) THEN !Physical cutoff zv=pxtm1(jl,jk,jt)/zdensity @@ -556,8 +555,7 @@ SUBROUTINE ham_rad_refrac_maxgar(kproma, kbdim, klev, krow, ktrac, kmod, kwv, & DO jk=1,klev DO jl=1,kproma - - IF(zvsum(jl,jk)>zeps .AND. lcore(jl,jk)) THEN + IF(zvsum(jl,jk)>zeps .AND. lcore(jl,jk)) THEN ! Safe division cn_0(jl,jk)=CMPLX( znrsum(jl,jk)/zvsum(jl,jk) , znisum(jl,jk)/zvsum(jl,jk), kind=dp ) ELSE cn_0(jl,jk)=CMPLX( 0.0_dp , 0.0_dp, kind=dp ) @@ -629,7 +627,7 @@ SUBROUTINE ham_rad_refrac_maxgar(kproma, kbdim, klev, krow, ktrac, kmod, kwv, & DO jk=1,klev DO jl=1,kproma - IF(pxtm1(jl,jk,jt)>zeps .AND. lcore(jl,jk)) THEN + IF(pxtm1(jl,jk,jt)>zeps .AND. lcore(jl,jk)) THEN !Physical cutoff/safe division implied zvfrac=(pxtm1(jl,jk,jt)/zdensity) / zvsum(jl,jk) @@ -749,7 +747,7 @@ SUBROUTINE ham_rad_refrac_brugge(kproma, kbdim, klev, krow, ktrac, kmod, kwv, & !---executable procedure - zeps=EPSILON(1.0_dp) + zeps=THRESHOLD ! Used for both physical cutoff and safe division !>>dod deleted allocation of arrays !<EPSILON(1.0_dp)) THEN + ! PLS - TODO: SAFE DIVISION + IF (aer_piz_sw_vr(jl,jk,jwv) > THRESHOLD ) THEN aer_cg_sw_vr(jl,jk,jwv) =aer_cg_sw_vr(jl,jk,jwv)/aer_piz_sw_vr(jl,jk,jwv) END IF - IF(aer_tau_sw_vr(jl,jk,jwv)>EPSILON(1.0_dp)) THEN + IF (aer_tau_sw_vr(jl,jk,jwv) > THRESHOLD ) THEN aer_piz_sw_vr(jl,jk,jwv)=aer_piz_sw_vr(jl,jk,jwv)/aer_tau_sw_vr(jl,jk,jwv) END IF END DO @@ -1246,9 +1245,9 @@ SUBROUTINE ham_rad(kproma, kbdim, klev, krow, kpband, kb_sw, & CASE(HAM_M7) - IF (ABS(modesigma(jclass)-sigma_fine)EPSILON(1.0_dp)) THEN + ! PLS - TODO: SAFE DIVISION + IF (zaer_ssa_diag(jl,jk,jwv) > THRESHOLD) THEN zaer_asym_diag(jl,jk,jwv) = zaer_asym_diag(jl,jk,jwv)/zaer_ssa_diag(jl,jk,jwv) zaer_ssa_diag(jl,jk,jwv) = zaer_ssa_diag(jl,jk,jwv)/ zaer_tau_diag(jl,jk,jwv) END IF @@ -2048,7 +2048,7 @@ SUBROUTINE ham_rad_diag(kproma, kbdim, klev, krow, pxtm1) !--- 0) - zeps=EPSILON(1.0_dp) + zeps = EPSILON(1.0_dp) ! Usage must be checked. Not done yet since we do not use HAMMOZ !--- Optical thickness for optional wavelengths: @@ -2272,7 +2272,7 @@ SUBROUTINE ham_rad_diag(kproma, kbdim, klev, krow, pxtm1) DO jk=1, klev DO jl=1, kproma - IF (zvsum(jl,jk,jclass)>zeps) THEN + IF (zvsum(jl,jk,jclass)>zeps) THEN ztaucomp(jl)=ztaucomp(jl) + & tau_p(jl,jk,krow)*zvcomp(jl,jk,jspec,jclass)/zvsum(jl,jk,jclass) zabscomp(jl)=zabscomp(jl) + & diff --git a/ifs-source/arpifs/m7/module/mo_ham_tools.F90 b/ifs-source/arpifs/m7/module/mo_ham_tools.F90 index 086c0045..24c49b65 100644 --- a/ifs-source/arpifs/m7/module/mo_ham_tools.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_tools.F90 @@ -41,7 +41,7 @@ MODULE mo_ham_tools ! *mo_ham_tools* hold auxiliary routines for the ! HAM aerosol model - USE mo_kind, ONLY: dp + USE mo_kind, ONLY: dp, THRESHOLD USE mo_exception, ONLY: finish IMPLICIT NONE @@ -275,7 +275,7 @@ SUBROUTINE ham_m7_logtail(kproma, kbdim, klev, krow, kmod, & !--- 0) - zeps=EPSILON(1.0_dp) + zeps= THRESHOLD !--- 1) diff --git a/ifs-source/arpifs/m7/module/mo_ham_wetdep.F90 b/ifs-source/arpifs/m7/module/mo_ham_wetdep.F90 index e7d49784..8586cc4c 100755 --- a/ifs-source/arpifs/m7/module/mo_ham_wetdep.F90 +++ b/ifs-source/arpifs/m7/module/mo_ham_wetdep.F90 @@ -48,7 +48,7 @@ MODULE mo_ham_wetdep - USE mo_kind, ONLY: dp + USE mo_kind, ONLY: dp, THRESHOLD USE mo_physical_constants, ONLY: tmelt USE mo_exception, ONLY: finish USE mo_tracdef, ONLY: ntrac, trlist, AEROSOLNUMBER, AEROSOLMASS @@ -74,7 +74,8 @@ MODULE mo_ham_wetdep !--- Constants: REAL(dp), PARAMETER :: zmin = 1.e-10_dp REAL(dp), PARAMETER :: UNDEF = -999._dp - REAL(dp), PARAMETER :: zeps = EPSILON(1._dp) + INTEGER, PARAMETER :: NUNDEF = -999 + REAL(dp), PARAMETER :: zeps = THRESHOLD REAL(dp), PARAMETER :: zeps_mass = 1.e-30_dp !--- Mode-wise scavenging coefficients and related @@ -288,7 +289,7 @@ SUBROUTINE ham_wetdep(kproma, kbdim, klev, krow, ktop, kt, IF (kscavBCtype == 3 .OR. kscavICtype == 3 ) THEN !only necessary for size-dep scavenging: - IF (indexy1(1,1,itrac_phase,imod) == UNDEF) THEN ! mode-phase calculation required! + IF (indexy1(1,1,itrac_phase,imod) == NUNDEF) THEN ! mode-phase calculation required! !--- Select aerosol wet radius and limit it to maximal 50 um: ! @@ -900,17 +901,19 @@ SUBROUTINE ic_scav_nuc(kproma, kbdim, klev, krow, kwat_phase, & ll1(1:kproma,:) = (zxtp1c(1:kproma,:,idt_icnc) > zeps_mass) !>>SF to refactor! (M7-dependency) + ! PLS: Replaced X+zpes with MAX(x,zeps) for correctness when x~O(zeps). + ! Could replace zeps with TINY, but current ZEPS value is alright (ie << epsilon(1) in single precision) IF (kmod == 4) ztmp1(1:kproma,:) = MIN(1._dp, & - zxtp1c(1:kproma,:,idt_icnc) / (zxtp1c(1:kproma,:,idt_ncs)+zeps)) + zxtp1c(1:kproma,:,idt_icnc) / MAX(zxtp1c(1:kproma,:,idt_ncs),zeps)) IF (kmod == 3) ztmp1(1:kproma,:) = MIN(1._dp, & MAX(0._dp, & zxtp1c(1:kproma,:,idt_icnc)-zxtp1c(1:kproma,:,idt_ncs)) & - /(zxtp1c(1:kproma,:,idt_nas)+zeps)) + /MAX(zxtp1c(1:kproma,:,idt_nas),zeps)) IF (kmod == 2) ztmp1(1:kproma,:) = MIN(1._dp, & MAX(0._dp, & zxtp1c(1:kproma,:,idt_icnc)-zxtp1c(1:kproma,:,idt_ncs) & -zxtp1c(1:kproma,:,idt_nas)) & - /(zxtp1c(1:kproma,:,idt_nks)+zeps)) + /MAX(zxtp1c(1:kproma,:,idt_nks),zeps)) !< zeps) THEN + ! PLS - TODO: SAFE DIVISION + IF (ABS(zdxtdtsum(jl)) > zeps) THEN zxttefix=-((ABS(zxtte(jl,jk)*zdpg(jl,jk))/zdxtdtsum(jl))*zdxtdt(jl))/zdpg(jl,jk) @@ -209,7 +210,7 @@ SUBROUTINE xt_borrow(kproma, kbdim, klev, klevp1, ktrac, & !--- 0) Initializations: ztmst=time_step_len - zeps=10._wp*EPSILON(1.0_wp) + zeps=10._wp*THRESHOLD ! Original was: 10._wp*EPSILON(1.0_wp) !--- 1) Calculate auxiliary variable dp/g : diff --git a/ifs-source/arpifs/m7/module/nd_param.F90 b/ifs-source/arpifs/m7/module/nd_param.F90 index 5e08284a..9af97b44 100644 --- a/ifs-source/arpifs/m7/module/nd_param.F90 +++ b/ifs-source/arpifs/m7/module/nd_param.F90 @@ -9,7 +9,8 @@ MODULE ND_PARAM !---Inherited functions, types, variables and constants USE PARKIND1, ONLY: JPIM, JPRB - + USE MO_KIND, ONLY: THRESHOLD + IMPLICIT NONE PRIVATE @@ -515,7 +516,8 @@ SUBROUTINE SINTEGRAL (SPAR, SUMMA, WPARCEL, XFHH, BET2, & ! ** Population Splitting -- Modified by Ricardo Morales 2014 DESCR = 1._JPRB - (16._JPRB/9._JPRB)*ALFA*WPARCEL*BET2*(AKOH/SPAR**2)**2 - IF (DESCR.LT.EPSILON(0.0_JPRB)) THEN + + IF (DESCR.LT.THRESHOLD) THEN CRIT2 = .TRUE. scrit = ((16._JPRB/9._JPRB)*ALFA*WPARCEL*BET2*(AKOH**2))**(0.25_JPRB) ! Scrit - (only for DELTA < 0 ) RATIO = (2.0E+7_JPRB/3.0_JPRB)*AKOH*(SPAR**(-0.3824_JPRB)-scrit**(-0.3824_JPRB)) ! Computing sp1 and sp2 (sp1 = sp2) diff --git a/ifs-source/arpifs/m7/phys_ec/yoe_aer_activ.F90 b/ifs-source/arpifs/m7/phys_ec/yoe_aer_activ.F90 index 4bdee7ce..bed23464 100644 --- a/ifs-source/arpifs/m7/phys_ec/yoe_aer_activ.F90 +++ b/ifs-source/arpifs/m7/phys_ec/yoe_aer_activ.F90 @@ -274,7 +274,7 @@ SUBROUTINE AER_ACTIV(KIDIA, KFDIA, KTDIA, KLON, KLEV, KSTGLO, & DO JL=KIDIA,KFDIA ! effective radius calculated similarly as in radlswr.F90 ! 2.387e-10 is 3/(4*pi*rho_liq*10^6) [10^6 for N in right units] - ZRE_LIQ(JL,JK) = 1.E+06_JPRB*(2.387e-10_JPRB*ZRHO(JL,JK)*PQLWC(JL,JK)/ZCDNC(JL,JK))**0.333_JPRB + ZRE_LIQ(JL,JK) = 1.E+06_JPRB*(2.387e-10_JPRB*ZRHO(JL,JK)*PQLWC(JL,JK)/ZCDNC(JL,JK))**(1.0_JPRB/3.0_JPRB) END DO END DO ZRE_LIQ(KIDIA:KFDIA,1:KLEV) = MERGE(ZRE_LIQ(KIDIA:KFDIA,1:KLEV),PPREFFL_DEF,LLIQCLD(KIDIA:KFDIA,1:KLEV)) @@ -377,24 +377,17 @@ SUBROUTINE AER_ACTIV_MORALES_NENES_FULL(KIDIA, KFDIA, KTDIA, KLON, KLEV, LCLOUD, ! Seinfeld and Pandis, Atmospheric Chemistry and Physics, Second Edition (referred to as SP) ! Morales and Nenes, JGR, D18220, 2010 - USE YOMCST, ONLY: RG, RPI - USE YOMLUN, ONLY: NULOUT - USE TM5M7_DATA, ONLY: NMOD, NSOL, DDUST, DNACL, & - & DOC, DBC, DH2SO4, DNA2SO4, DNH4NO3, DMSA, & - & NH4NO3_FACTOR, Kap_su,Kap_pom,Kap_soa, & - & Kap_bc,Kap_ss,Kap_du,Kap_na2so4,Kap_msa, & - & Kap_no3, WSO4, WH2SO4, WNACL, WNA2SO4, & - & WH2O, WDAIR - USE MO_HAM_M7CTL, ONLY: CMR2RAM, SIGMA, SIGMALN - ! USE YOE_AERO_M7_DATA, ONLY: NMOD, NSOL, SIGMA, SIGMALN, CMR2RAM, & - ! & DH2SO4, DBC, DOC, DNACL, DDUST, & - ! & DNA2SO4, DNH4NO3, DMSA, NH4NO3_FACTOR, & - ! & PPKAPPA_H2SO4, PPKAPPA_NACL, PPKAPPA_NA2SO4, & - ! & PPKAPPA_BC, PPKAPPA_OC, PPKAPPA_DU, & - ! & PPKAPPA_NH4NO3, PPKAPPA_MSA, & - ! & WSO4, WH2SO4, WNACL, WNA2SO4, & - ! & WH2O, WDAIR - USE ND_PARAM, ONLY: CCNSPEC, PDFACTIV, NDPARAM + USE YOMCST, ONLY: RG, RPI + USE YOMLUN, ONLY: NULOUT + USE TM5M7_DATA, ONLY: NMOD, NSOL, DDUST, DNACL, & + & DOC, DBC, DH2SO4, DNA2SO4, DNH4NO3, DMSA, & + & NH4NO3_FACTOR, Kap_su,Kap_pom,Kap_soa, & + & Kap_bc,Kap_ss,Kap_du,Kap_na2so4,Kap_msa, & + & Kap_no3, WSO4, WH2SO4, WNACL, WNA2SO4, & + & WH2O, WDAIR + USE MO_HAM_M7CTL, ONLY: CMR2RAM, SIGMA, SIGMALN + USE MO_KIND, ONLY: THRESHOLD + USE ND_PARAM, ONLY: CCNSPEC, PDFACTIV, NDPARAM IMPLICIT NONE @@ -488,7 +481,7 @@ SUBROUTINE AER_ACTIV_MORALES_NENES_FULL(KIDIA, KFDIA, KTDIA, KLON, KLEV, LCLOUD, PCDNC(KIDIA:KFDIA,KTDIA:KLEV) = 0._JPRB PSMAX(KIDIA:KFDIA,KTDIA:KLEV) = 0._JPRB - ZEPS=EPSILON(1._JPRB) + ZEPS=THRESHOLD !EPSILON(1._JPRB) ZWLARGE(KIDIA:KFDIA,KTDIA:KLEV) = -1._JPRB* PVERVEL(KIDIA:KFDIA,KTDIA:KLEV) / & & (RG*PRHO(KIDIA:KFDIA,KTDIA:KLEV)) @@ -527,6 +520,7 @@ SUBROUTINE AER_ACTIV_MORALES_NENES_FULL(KIDIA, KFDIA, KTDIA, KLON, KLEV, LCLOUD, NCL(JL) = NNACL(JL) NH2SO4(JL) = NSO4(JL) - NNA2SO4(JL) + ! PLS - TODO: SAFE DIVISION IF (ZVOL(JL) .GE. ZEPS) THEN !eehol: total volume per mode need to be above treshold to avoid div by zero !---mode kappa = volume-weighted sum of component kappa's ZKAPPA(JL,JK,JMOD) = ( (Kap_ss * NNACL(JL) * WNACL / (DNACL*1.E3_JPRB)) + & @@ -540,11 +534,11 @@ SUBROUTINE AER_ACTIV_MORALES_NENES_FULL(KIDIA, KFDIA, KTDIA, KLON, KLEV, LCLOUD, & ZVOL(JL) !---defensive step: minimum kappa to avoid divide by zero errors - ZKAPPA(JL,JK,JMOD) = MERGE(ZKAPPA(JL,JK,JMOD), 0.04_JPRB, ZKAPPA(JL,JK,JMOD) > 0.04_JPRB ) - ZKAPPA(JL,JK,JMOD) = MIN(ZKAPPA(JL,JK,JMOD),1.2_JPRB) - ELSE + ZKAPPA(JL,JK,JMOD) = MAX(ZKAPPA(JL,JK,JMOD), 0.04_JPRB) + ZKAPPA(JL,JK,JMOD) = MIN(ZKAPPA(JL,JK,JMOD), 1.2_JPRB) + ELSE ZKAPPA(JL,JK,JMOD) = 0.04_JPRB ! if total volume per mode is too small, use minimum kappa - END IF + END IF END IF END DO END DO @@ -568,8 +562,6 @@ SUBROUTINE AER_ACTIV_MORALES_NENES_FULL(KIDIA, KFDIA, KTDIA, KLON, KLEV, LCLOUD, TPARC = PT(JL,JK) ! Temperature (K) PPARC = PAP(JL,JK) ! Pressure (Pa) - IF ( ANY(TPI(:) .GE. ZEPS) .AND. ANY(DPGI(:) .GE. 1e-9_JPRB) .AND. TPARC.GE.(273.15_JPRB-35.0_JPRB) ) THEN !eehol: any num con, diam and temperature need to be over treshold - ! Convert aerosol data into CCN, fill BOX object CALL CCNSPEC (TPI,DPGI,SIGI,MODEI,TPARC,PPARC,NSOL-1,AKKI,A,B,ACCOM,BOX) @@ -602,7 +594,6 @@ SUBROUTINE AER_ACTIV_MORALES_NENES_FULL(KIDIA, KFDIA, KTDIA, KLON, KLEV, LCLOUD, ! convert Smax to % PSMAX(JL,JK) = 100._JPRB * SMAX - END IF END IF ! LCLOUD END DO !jl END DO !jk @@ -894,7 +885,7 @@ SUBROUTINE ICE_CLOUD_PROP(KIDIA, KFDIA, KLON, KLEV, PT, PRHO, PI, PA, PAP, & ! effect Re to volume mean from S Moss or Lohmann and Kaercher papers 200? ! ZRE_ICE on both LHS and RHS ?? - ZRE_ICE=(MAX(SQRT(5.113E6_JPRB+2.809E3_JPRB*ZRE_ICE**3.0_JPRB)-2.261E3_JPRB,0.0_JPRB))**0.333_JPRB + ZRE_ICE=(MAX(SQRT(5.113E6_JPRB+2.809E3_JPRB*ZRE_ICE**3.0_JPRB)-2.261E3_JPRB,0.0_JPRB))**(1.0_JPRB/3.0_JPRB) ZRE_ICE=MAX(ZRE_ICE,1.0_JPRB) ! diameter minimum 1.0 microns ! more default values if not applying @@ -938,7 +929,7 @@ SUBROUTINE ICE_CLOUD_PROP(KIDIA, KFDIA, KLON, KLEV, PT, PRHO, PI, PA, PAP, & ENDIF !---why is this recalculated here ? - ZRE_ICE=(0.75_JPRB*PRHO(JL,JK)*ZCLD/(RPI*ZRHO_ICE*1.E6_JPRB*ZICNC))**0.333_JPRB + ZRE_ICE=(0.75_JPRB*PRHO(JL,JK)*ZCLD/(RPI*ZRHO_ICE*1.E6_JPRB*ZICNC))**(1.0_JPRB/3.0_JPRB) ZRE_ICE=ZRE_ICE*1.E6_JPRB !PGFL(JL,JK,YICNC%MP9_PH) = ZICNC