diff --git a/.gitmodules b/.gitmodules index 2d1616f6c6..4e4a8f34d6 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,14 @@ +#----------------------------- +# Required CAM externals +#----------------------------- + +[submodule "atmos_phys"] + path = src/atmos_phys + url = https://github.com/ESCOMP/atmospheric_physics + fxtag = atmos_phys0_05_001 + fxrequired = AlwaysRequired + fxDONOTUSEurl = https://github.com/ESCOMP/atmospheric_physics + [submodule "chem_proc"] path = chem_proc url = https://github.com/ESCOMP/CHEM_PREPROCESSOR.git @@ -12,6 +23,29 @@ fxtag = carma4_01 fxDONOTUSEurl = https://github.com/ESCOMP/CARMA_base.git +[submodule "clubb"] + path = src/physics/clubb + url = https://github.com/larson-group/clubb_release + fxrequired = AlwaysRequired + fxsparse = ../.clubb_sparse_checkout + fxtag = clubb_4ncar_20240605_73d60f6_gpufixes_posinf + fxDONOTUSEurl = https://github.com/larson-group/clubb_release + +[submodule "cosp2"] + path = src/physics/cosp2/src + url = https://github.com/CFMIP/COSPv2.0 + fxrequired = AlwaysRequired + fxsparse = ../.cosp_sparse_checkout + fxtag = v2.1.4cesm + fxDONOTUSEurl = https://github.com/CFMIP/COSPv2.0 + +[submodule "hemco"] + path = src/hemco + url = https://github.com/ESCOMP/HEMCO_CESM.git + fxtag = hemco-cesm2_0_hemco3_9_0 + fxrequired = AlwaysRequired + fxDONOTUSEurl = https://github.com/ESCOMP/HEMCO_CESM.git + [submodule "pumas"] path = src/physics/pumas url = https://github.com/ESCOMP/PUMAS @@ -26,6 +60,24 @@ fxtag = pumas_cam-release_v1.17_rename fxDONOTUSEurl = https://github.com/ESCOMP/PUMAS +[submodule "rrtmgp-data"] + path = src/physics/rrtmgp/data + url = https://github.com/earth-system-radiation/rrtmgp-data.git + fxrequired = AlwaysRequired + fxtag = v1.8 + fxDONOTUSEurl = https://github.com/earth-system-radiation/rrtmgp-data.git + +[submodule "rte-rrtmgp"] + path = src/physics/rrtmgp/ext + url = https://github.com/earth-system-radiation/rte-rrtmgp.git + fxrequired = AlwaysRequired + fxtag = v1.7 + fxDONOTUSEurl = https://github.com/earth-system-radiation/rte-rrtmgp.git + +#----------------------------- +# Optional CAM externals +#----------------------------- + [submodule "ali_arms"] path = src/physics/ali_arms url = https://github.com/ESCOMP/ALI-ARMS @@ -33,64 +85,38 @@ fxtag = ALI_ARMS_v1.0.1 fxDONOTUSEurl = https://github.com/ESCOMP/ALI-ARMS -[submodule "atmos_phys"] - path = src/atmos_phys - url = https://github.com/ESCOMP/atmospheric_physics - fxtag = atmos_phys0_02_006 - fxrequired = AlwaysRequired - fxDONOTUSEurl = https://github.com/ESCOMP/atmospheric_physics +[submodule "cloud_j"] + path = src/chemistry/cloud_j + url = https://github.com/geoschem/cloud-j.git + fxrequired = AlwaysOptional + fxtag = 7.7.3 + fxDONOTUSEurl = https://github.com/geoschem/cloud-j.git [submodule "geoschem"] path = src/chemistry/geoschem/geoschem_src url = https://github.com/geoschem/geos-chem.git fxrequired = AlwaysOptional - fxtag = 14.1.2 + fxtag = 14.4.3 fxDONOTUSEurl = https://github.com/geoschem/geos-chem.git -[submodule "hemco"] - path = src/hemco - url = https://github.com/ESCOMP/HEMCO_CESM.git - fxtag = hemco-cesm1_2_1_hemco3_6_3_cesm_rme - fxrequired = AlwaysRequired - fxDONOTUSEurl = https://github.com/ESCOMP/HEMCO_CESM.git - -[submodule "rte-rrtmgp"] - path = src/physics/rrtmgp/ext - url = https://github.com/earth-system-radiation/rte-rrtmgp.git - fxrequired = AlwaysRequired - fxtag = v1.7 - fxDONOTUSEurl = https://github.com/earth-system-radiation/rte-rrtmgp.git - -[submodule "rrtmgp-data"] - path = src/physics/rrtmgp/data - url = https://github.com/earth-system-radiation/rrtmgp-data.git - fxrequired = AlwaysRequired - fxtag = v1.8 - fxDONOTUSEurl = https://github.com/earth-system-radiation/rrtmgp-data.git +[submodule "hetp"] + path = src/chemistry/hetp + url = https://github.com/geoschem/heterogeneous-vectorized-or-parallel.git + fxrequired = AlwaysOptional + fxtag = geoschem_hetp_1.0 + fxDONOTUSEurl = https://github.com/geoschem/heterogeneous-vectorized-or-parallel.git [submodule "mpas"] path = src/dynamics/mpas/dycore url = https://github.com/MPAS-Dev/MPAS-Model.git fxrequired = AlwaysOptional fxsparse = ../.mpas_sparse_checkout - fxtag = b8c33daa + fxtag = v8.2.1 fxDONOTUSEurl = https://github.com/MPAS-Dev/MPAS-Model.git -[submodule "cosp2"] - path = src/physics/cosp2/src - url = https://github.com/CFMIP/COSPv2.0 - fxrequired = AlwaysRequired - fxsparse = ../.cosp_sparse_checkout - fxtag = v2.1.4cesm - fxDONOTUSEurl = https://github.com/CFMIP/COSPv2.0 - -[submodule "clubb"] - path = src/physics/clubb - url = https://github.com/larson-group/clubb_release - fxrequired = AlwaysRequired - fxsparse = ../.clubb_sparse_checkout - fxtag = clubb_4ncar_20231115_5406350 - fxDONOTUSEurl = https://github.com/larson-group/clubb_release +#----------------------------- +# CESM libraries +#----------------------------- [submodule "parallelio"] path = libraries/parallelio @@ -180,4 +206,3 @@ url = https://github.com/ESCOMP/MOSART fxtag = mosart1.1.02 fxrequired = ToplevelRequired fxDONOTUSEurl = https://github.com/ESCOMP/MOSART - diff --git a/bld/build-namelist b/bld/build-namelist index 739e9cab13..cbdaed40a9 100755 --- a/bld/build-namelist +++ b/bld/build-namelist @@ -509,6 +509,14 @@ if ($phys_mode_flags > 1) { my $simple_phys = 0; if ($adia_mode or $ideal_mode) { $simple_phys = 1; } +# If running either a simple physics or an aquaplanet configuration, the +# nitrogen deposition data is not used. These files are set in buildnml and +# can't be overridden via user_nl_cam. So provide an override here. +if ($simple_phys or $aqua_mode) { + $nl->set_variable_value('ndep_stream_nl', 'stream_ndep_data_filename', '" "'); + $nl->set_variable_value('ndep_stream_nl', 'stream_ndep_mesh_filename', '" "'); ++} + # Single column mode my $scam = $cfg->get('scam'); @@ -574,6 +582,14 @@ if( $chem =~ /_oslo/){ print " ==> Using Oslo aerosols: PRESCRIBED AERO = FALSE (not yet implemented) \n" } +# CTSM Dust emissions scheme +my $soil_erod_atm = $FALSE; +add_default($nl, 'dust_emis_method'); +if ( $nl->get_value('dust_emis_method') =~ /Zender/ ) { + add_default($nl, 'zender_soil_erod_source'); + if ($nl->get_value('zender_soil_erod_source') =~ /atm/) {$soil_erod_atm = $TRUE;} +} + # Chemistry deposition lists if ( ($chem ne 'none') or ( $prog_species ) ){ my $chem_proc_src = $cfg->get('chem_proc_src'); @@ -597,7 +613,9 @@ if ( ($chem ne 'none') or ( $prog_species ) ){ $prescribe_aerosols = $FALSE; } - add_default($nl, 'aer_wetdep_list', 'val'=>$aer_wetdep_list ); + if ($chem !~ /_mam/) { + add_default($nl, 'aer_wetdep_list', 'val'=>$aer_wetdep_list ); + } if (!($chem =~ /_mam/)) { if (!defined $nl->get_value('aer_sol_facti')) { @@ -620,10 +638,14 @@ if ( ($chem ne 'none') or ( $prog_species ) ){ } } if ($chem) { - # drydep_srf_file is only needed for prognostic MAM when the grid is unstructured. - # structured grids can do interpolation on the fly. - if ($chem =~ /_mam/ and ($dyn =~ /se|fv3|mpas/)) { - add_default($nl, 'drydep_srf_file'); + # drydep_srf_file is not needed for simple physics or aquaplanet + if ( !($simple_phys or $aqua_mode) ) { + + # drydep_srf_file is only needed for prognostic MAM when the grid is unstructured. + # structured grids can do interpolation on the fly. + if ($chem =~ /_mam/ and ($dyn =~ /se|fv3|mpas/)) { + add_default($nl, 'drydep_srf_file'); + } } add_default($nl, 'dep_data_file'); } @@ -746,7 +768,7 @@ if ($rad_pkg =~ /rrtmg/ or $chem =~ /waccm/) { elsif (!$simple_phys) { if ($chem eq 'none' and !($prog_species =~ /SO4/) ) { # Spectral solar data is needed for photolysis - # this preserves the default cam3 and cam4 configurations which do not have chemistry + # this preserves the default cam4 configuration which does not have chemistry unless (defined $nl->get_value('solar_irrad_data_file')) { add_default($nl, 'solar_const'); } @@ -825,17 +847,8 @@ if ($test_tracer_num > 0) { if ($cfg->get('age_of_air_trcs')) { add_default($nl, 'aoa_tracers_flag', 'val'=>'.true.'); } -# If phys option is "cam3" then turn on the CAM3 prescribed ozone and aerosols -if ($phys eq 'cam3' and !$aqua_mode) { - add_default($nl, 'cam3_ozone_data_on', 'val'=>'.true.'); - add_default($nl, 'cam3_aero_data_on', 'val'=>'.true.'); -} - # Defaults for radiatively active constituents -my $cam3_ozone_data = $FALSE; -my $cam3_aero_data = $FALSE; - my $moz_ozone_data = $FALSE; if (!$rad_prog_ozone) { $moz_ozone_data = $TRUE; @@ -846,24 +859,6 @@ if (!($rad_prog_ocarb) or !($rad_prog_bcarb) or !($rad_prog_sulf) or !($rad_prog $moz_aero_data = $TRUE; } -# CAM3 prescribed ozone only by request -if (defined $nl->get_value('cam3_ozone_data_on') and - $nl->get_value('cam3_ozone_data_on') =~ /$TRUE/io) { - add_default($nl, 'bndtvo'); - $cam3_ozone_data = $TRUE; - $moz_ozone_data = $FALSE; -} - -# CAM3 prescribed aerosols only by request -if (defined $nl->get_value('cam3_aero_data_on') and - $nl->get_value('cam3_aero_data_on') =~ /$TRUE/io) { - - # CAM3 aerosol mass climatology dataset (horizontal resolution dependent) - add_default($nl, 'bndtvaer'); - $cam3_aero_data = $TRUE; - $moz_aero_data = $FALSE; -} - if ($chem_rad_passive or $aqua_mode) { add_default($nl, 'atm_dep_flux', 'val'=>'.false.'); } @@ -912,8 +907,6 @@ if ($rad_prog_ozone) { add_default($nl, 'prescribed_ozone_type'); add_default($nl, 'prescribed_ozone_cycle_yr'); } -} elsif ($cam3_ozone_data =~ /$TRUE/io) { - $radval .= ",'N:O3:O3'"; } else { die "ERROR: can not set ozone rad_climate specification\n"; } @@ -1106,9 +1099,6 @@ if ($aer_model eq 'oslo') { } elsif ($moz_aero_data =~ /$TRUE/io) { push(@aero_names, "sulf"); push(@aerosources, "N:" ); - } elsif ($cam3_aero_data =~ /$TRUE/io) { - push(@aero_names, "cam3_sul" ); - push(@aerosources, "N:" ); } else { die "ERROR: can not set sulf rad_climate specification\n"; } @@ -1119,9 +1109,6 @@ if ($aer_model eq 'oslo') { } elsif ($moz_aero_data =~ /$TRUE/io) { push(@aero_names, "dust1", "dust2", "dust3", "dust4"); push(@aerosources, "N:", "N:", "N:", "N:" ); - } elsif ($cam3_aero_data =~ /$TRUE/io) { - push(@aero_names, "cam3_dust1", "cam3_dust2", "cam3_dust3", "cam3_dust4" ); - push(@aerosources, "N:", "N:", "N:", "N:" ); } else { die "ERROR: can not set dust rad_climate specification\n"; } @@ -1132,9 +1119,6 @@ if ($aer_model eq 'oslo') { } elsif ($moz_aero_data =~ /$TRUE/io) { push(@aero_names, "bcar1", "bcar2"); push(@aerosources, "N:", "N:" ); - } elsif ($cam3_aero_data =~ /$TRUE/io) { - push(@aero_names, "cam3_bcpho", "cam3_bcphi"); - push(@aerosources, "N:", "N:" ); } else { die "ERROR: can not set black carbon rad_climate specification\n"; } @@ -1145,9 +1129,6 @@ if ($aer_model eq 'oslo') { } elsif ($moz_aero_data =~ /$TRUE/io) { push(@aero_names, "ocar1", "ocar2"); push(@aerosources, "N:", "N:" ); - } elsif ($cam3_aero_data =~ /$TRUE/io) { - push(@aero_names, "cam3_ocpho", "cam3_ocphi"); - push(@aerosources, "N:", "N:" ); } else { die "ERROR: can not set organic carbon rad_climate specification\n"; } @@ -1168,9 +1149,6 @@ if ($aer_model eq 'oslo') { push(@aero_names, "SSLTA", "SSLTC"); push(@aerosources, "N:", "N:"); } - } elsif ($cam3_aero_data =~ /$TRUE/io ) { - push(@aero_names, "cam3_ssam", "cam3_sscm"); - push(@aerosources, "N:", "N:" ); } else { die "ERROR: can not set sslt rad_climate specification\n"; } @@ -1191,7 +1169,7 @@ if ( $prescribed_aero_model ne 'none' ) { # Prescribed aerosol deposition fluxes. # Not needed if in aquaplanet mode. - if ( (($moz_aero_data =~ /$TRUE/io) or ($cam3_aero_data =~ /$TRUE/io)) and !$aqua_mode ) { + if ( $moz_aero_data and !$aqua_mode ) { # If user has not set aerodep_flx_file, then use defaults unless (defined $nl->get_value('aerodep_flx_file')) { my @settings = ('aerodep_flx_datapath', 'aerodep_flx_file', 'aerodep_flx_type', @@ -1577,7 +1555,7 @@ elsif ($carma eq 'tholin') { # turn on stratospheric aerosol forcings in CAM6 configurations my $chem_has_ocs = chem_has_species($cfg, 'OCS'); -if (($phys =~ /cam6/ or $phys =~ /cam_dev/) and $chem =~ /_mam/ and $chem ne 'trop_mam_oslo') { +if (($phys =~ /cam6/ or $phys =~ /cam7/) and $chem =~ /_mam/ and $chem ne 'trop_mam_oslo') { # turn on volc forcings in cam6 -- prognostic or prescribed if ( $chem_has_ocs ) { # turn on prognostic stratospheric aerosols @@ -1607,9 +1585,9 @@ if (chem_has_species($cfg, 'O3S')) { # stratospheric aerosols are needed for heterogeneous chemistry as well as radiation feedback my $het_chem = chem_has_species($cfg, 'N2O5'); -# Default for CAM6, is that prescribed_strataero_3modes is TRUE, but allow user to override +# Default for cam6 and cam7, is that prescribed_strataero_3modes is TRUE, but allow user to override my $prescribed_strataero_3modes = $FALSE; -if ($phys =~ /cam6/ or $phys =~ /cam_dev/) { +if ($phys =~ /cam6/ or $phys =~ /cam7/) { $prescribed_strataero_3modes = $TRUE; } if (defined $nl->get_value('prescribed_strataero_3modes')) { @@ -1797,7 +1775,7 @@ if ( $prog_species ) { add_default($nl, 'ghg_chem', 'val'=>".true."); add_default($nl, 'bndtvg'); } - if ( $prog_species =~ /DST/ ) { + if ( $prog_species =~ /DST/ and $soil_erod_atm =~ /$TRUE/ ) { add_default($nl, 'soil_erod_file' ); } @@ -1865,7 +1843,7 @@ my $megan_emis = defined $nl->get_value('megan_specifier'); if ( $megan_emis ) { add_default($nl, 'megan_factors_file'); } # Tropospheric full chemistry options -if (($chem =~ /trop_mozart/ or $chem =~ /trop_strat/ or $chem =~ /waccm_tsmlt/) and ($phys !~ /cam6/) and ($phys !~ /cam_dev/)) { +if (($chem =~ /trop_mozart/ or $chem =~ /trop_strat/ or $chem =~ /waccm_tsmlt/) and ($phys !~ /cam6/) and ($phys !~ /cam7/)) { # Surface emission datasets: my %verhash; @@ -2069,10 +2047,13 @@ if (($chem =~ /trop_mozart/ or $chem =~ /trop_strat/ or $chem =~ /waccm_tsmlt/) if ($chem =~ /geoschem/) { - my $val; + # Input directories + add_default($nl, 'geoschem_chem_inputs'); + add_default($nl, 'geoschem_aeropt_inputs'); + add_default($nl, 'geoschem_photol_inputs'); # Species with fixed lower boundary - $val = "'CCL4','CH4','N2O','CO2','CFC11','CFC12','CH3BR','CH3CCL3','CH3CL'" + my $val = "'CCL4','CH4','N2O','CO2','CFC11','CFC12','CH3BR','CH3CCL3','CH3CL'" .",'HCFC22','CFC114','CFC115','HCFC141B','HCFC142B','CH2BR2','CHBR3','H2402'"; if ($chem_has_ocs) { @@ -2087,8 +2068,11 @@ if ($chem =~ /geoschem/) { add_default($nl, 'flbc_cycle_yr', 'val'=>'2000'); } - my @files; # Datasets + my @files = ( 'flbc_file' ); + if ($soil_erod_atm =~ /$TRUE/) { + @files = ( @files, 'soil_erod_file' ); + } @files = ( 'soil_erod_file', 'flbc_file' ); foreach my $file (@files) { add_default($nl, $file); @@ -2128,12 +2112,15 @@ if ($chem =~ /trop_mozart/ or $chem =~ /trop_strat/ or $chem =~ /waccm_tsmlt/) { my @files; # Datasets if ($chem =~ /trop_strat/ or $chem =~ /waccm_tsmlt/) { - @files = ( 'soil_erod_file', 'flbc_file', + @files = ( 'flbc_file', 'xs_coef_file','xs_short_file','xs_long_file', 'rsf_file' ); } else { - @files = ( 'soil_erod_file', 'flbc_file', + @files = ( 'flbc_file', 'xs_coef_file','xs_short_file','xs_long_file', 'rsf_file', 'exo_coldens_file', 'sulf_file' ); } + if ($soil_erod_atm =~ /$TRUE/) { + @files = ( @files, 'soil_erod_file' ); + } foreach my $file (@files) { add_default($nl, $file); } @@ -2231,15 +2218,17 @@ if ($chem eq 'trop_mam3') { add_default($nl, 'flbc_list', 'val'=>"' '"); # Datasets - my @files = ('soil_erod_file', - 'xs_long_file', 'rsf_file', 'exo_coldens_file' ); + my @files = ('xs_long_file', 'rsf_file', 'exo_coldens_file' ); + if ($soil_erod_atm =~ /$TRUE/) { + @files = ( @files, 'soil_erod_file' ); + } foreach my $file (@files) { add_default($nl, $file); } } # CMIP6 emissions -if (($chem =~ /_mam4/ or $chem =~ /_mam5/) and ($phys =~ /cam6/ or $phys =~ /cam_dev/)) { +if (($chem =~ /_mam4/ or $chem =~ /_mam5/) and ($phys =~ /cam6/ or $phys =~ /cam7/)) { # OASISS (ocean) DMS emissions if (!$aqua_mode and !$scam) { @@ -2317,14 +2306,8 @@ if (($chem =~ /_mam4/ or $chem =~ /_mam5/) and ($phys =~ /cam6/ or $phys =~ /cam # for troposphere gas-phase chemistry if ($chem =~ /trop_strat/ or $chem =~ /_tsmlt/) { %species = (%species, - 'BENZENE_an_srf_file' => 'BENZENE', - 'BENZENE_bb_srf_file' => 'BENZENE', 'BIGALK_an_srf_file' => 'BIGALK', 'BIGALK_bb_srf_file' => 'BIGALK', - 'BIGENE_an_srf_file' => 'BIGENE', - 'BIGENE_bb_srf_file' => 'BIGENE', - 'C2H2_an_srf_file' => 'C2H2', - 'C2H2_bb_srf_file' => 'C2H2', 'C2H4_an_srf_file' => 'C2H4', 'C2H4_bb_srf_file' => 'C2H4', 'C2H4_ot_srf_file' => 'C2H4', @@ -2341,8 +2324,6 @@ if (($chem =~ /_mam4/ or $chem =~ /_mam5/) and ($phys =~ /cam6/ or $phys =~ /cam 'C3H8_ot_srf_file' => 'C3H8', 'CH3CHO_an_srf_file' => 'CH3CHO', 'CH3CHO_bb_srf_file' => 'CH3CHO', - 'CH3CN_an_srf_file' => 'CH3CN', - 'CH3CN_bb_srf_file' => 'CH3CN', 'CH3COCH3_an_srf_file' => 'CH3COCH3', 'CH3COCH3_bb_srf_file' => 'CH3COCH3', 'CH3COCHO_bb_srf_file' => 'CH3COCHO', @@ -2351,25 +2332,39 @@ if (($chem =~ /_mam4/ or $chem =~ /_mam5/) and ($phys =~ /cam6/ or $phys =~ /cam 'CH3OH_an_srf_file' => 'CH3OH', 'CH3OH_bb_srf_file' => 'CH3OH', 'GLYALD_bb_srf_file' => 'GLYALD', + 'ISOP_bb_srf_file' => 'ISOP', + 'NH3_an_srf_file' => 'NH3', + 'NH3_bb_srf_file' => 'NH3', + 'NH3_ot_srf_file' => 'NH3', + 'E90_srf_file' => 'E90' ); + if ($chem !~ /_ts4/) { + %species = (%species, + 'BENZENE_an_srf_file' => 'BENZENE', + 'BENZENE_bb_srf_file' => 'BENZENE', + 'BIGENE_an_srf_file' => 'BIGENE', + 'BIGENE_bb_srf_file' => 'BIGENE', + 'C2H2_an_srf_file' => 'C2H2', + 'C2H2_bb_srf_file' => 'C2H2', + 'CH3CN_an_srf_file' => 'CH3CN', + 'CH3CN_bb_srf_file' => 'CH3CN', 'HCN_an_srf_file' => 'HCN', 'HCN_bb_srf_file' => 'HCN', 'HCOOH_an_srf_file' => 'HCOOH', 'HCOOH_bb_srf_file' => 'HCOOH', - 'ISOP_bb_srf_file' => 'ISOP', 'MEK_an_srf_file' => 'MEK', 'MEK_bb_srf_file' => 'MEK', - 'NH3_an_srf_file' => 'NH3', - 'NH3_bb_srf_file' => 'NH3', - 'NH3_ot_srf_file' => 'NH3', 'TOLUENE_an_srf_file' => 'TOLUENE', 'TOLUENE_bb_srf_file' => 'TOLUENE', 'XYLENES_an_srf_file' => 'XYLENES', - 'XYLENES_bb_srf_file' => 'XYLENES', - 'E90_srf_file' => 'E90' ); + 'XYLENES_bb_srf_file' => 'XYLENES' ); + } if ($chem =~ /trop_strat_mam4_ts2/ or $chem =~ /trop_strat_mam5_ts2/) { %species = (%species, 'MTERP_bb_srf_file' => 'APIN') ; - } else { + } elsif ($chem =~ /_ts4/) { + %species = (%species, + 'MTERP_bb_srf_file' => 'TERP') ; + } else { %species = (%species, 'MTERP_bb_srf_file' => 'MTERP' ); } @@ -2391,7 +2386,7 @@ if (($chem =~ /_mam4/ or $chem =~ /_mam5/) and ($phys =~ /cam6/ or $phys =~ /cam 'IVOC_bb_srf_file' => 'IVOCbb', 'SVOC_an_srf_file' => 'SVOCff', 'SVOC_bb_srf_file' => 'SVOCbb' ); - } else { + } elsif ($chem !~ /_ts4/) { %species = (%species, 'IVOC_an_srf_file' => 'IVOC', 'IVOC_bb_srf_file' => 'IVOC', @@ -2400,7 +2395,7 @@ if (($chem =~ /_mam4/ or $chem =~ /_mam5/) and ($phys =~ /cam6/ or $phys =~ /cam } } - # Note, this section might need to be modified if cam_dev values + # Note, this section might need to be modified if cam7 values # diverge from cam6 values my %verhash = ('ver'=>'cam6'); my $first = 1; @@ -2416,7 +2411,7 @@ if (($chem =~ /_mam4/ or $chem =~ /_mam5/) and ($phys =~ /cam6/ or $phys =~ /cam $first = 0; } } - if ($chem eq 'trop_mam4' or $chem eq 'waccm_sc_mam4'or $chem eq 'ghg_mam4') { + if ($chem eq 'trop_mam4' or $chem eq 'waccm_sc_mam4'or $chem eq 'ghg_mam4' or $chem =~ /_ts4/) { # SOA yields (used for the interactive emissions) have been calculated based on the VBS yields in CAM-chem. # Duseong S. Jo, et al. to be submitted to GMD, 2023 -- see https://github.com/ESCOMP/CAM/pull/727 discussion for additional detail. my %soae_fctrs = ('BENZENE_an_srf_file' => '2.5592D0', @@ -2626,6 +2621,38 @@ if (($chem =~ /_mam4/ or $chem =~ /_mam5/) and ($phys =~ /cam6/ or $phys =~ /cam add_default($nl, 'megan_factors_file'); add_default($nl, 'megan_mapped_emisfctrs', 'val'=>'.false.'); } + if ($chem =~ /trop_strat_mam5_ts4/) { + my $val = "'ISOP = isoprene'," + . "'TERP = carene_3 + pinene_a + thujene_a + bornene + terpineol_4 + terpineol_a + terpinyl_ACT_a +'," + . "' myrtenal + sabinene + pinene_b + camphene + fenchene_a + limonene + phellandrene_a + terpinene_a +'," + . "' terpinene_g + terpinolene + phellandrene_b + linalool + ionone_b + geranyl_acetone + neryl_acetone +'," + . "' jasmone + verbenene + ipsenol + myrcene + ocimene_t_b + ocimene_al + ocimene_c_b + 2met_nonatriene +'," + . "' farnescene_a + caryophyllene_b + acoradiene + aromadendrene + bergamotene_a + bergamotene_b +'," + . "' bisabolene_a + bisabolene_b + bourbonene_b + cadinene_d + cadinene_g + cedrene_a + copaene_a +'," + . "' cubebene_a + cubebene_b + elemene_b + farnescene_b + germacrene_B + germacrene_D + gurjunene_b +'," + . "' humulene_a + humulene_g + isolongifolene + longifolene + longipinene + muurolene_a + muurolene_g +'," + . "' selinene_b + selinene_d + nerolidol_c + nerolidol_t'," + . "'BIGALK = tricyclene + camphor + fenchone + thujone_a + thujone_b + cineole_1_8 + borneol + bornyl_ACT +'," + . "' cedrol + decanal + heptanal + heptane + hexane + nonanal + octanal + octanol + oxopentanal + pentane +'," + . "' hexanal + hexanol_1 + pentanal + heptanone', 'CH3OH = methanol'," + . "'CH3COCH3 = acetone', 'CH3CHO = acetaldehyde', 'C2H5OH = ethanol'," + . "'CH2O = formaldehyde', 'CH3COOH = acetic_acid', 'CO = carbon_monoxide'," + . "'C2H6 = ethane', 'C2H4 = ethene', 'C3H8 = propane', 'C3H6 = propene'," + . "'SOAE = 0.5954*isoprene + 5.1004*(carene_3 + pinene_a + thujene_a + bornene +'," + . "' terpineol_4 + terpineol_a + terpinyl_ACT_a + myrtenal + sabinene + pinene_b + camphene +'," + . "' fenchene_a + limonene + phellandrene_a + terpinene_a + terpinene_g + terpinolene +'," + . "' phellandrene_b + linalool + ionone_b + geranyl_acetone + neryl_acetone + jasmone +'," + . "' verbenene + ipsenol + myrcene + ocimene_t_b + ocimene_al + ocimene_c_b + 2met_nonatriene) + '," + . "' 12.3942*(farnescene_a + caryophyllene_b + acoradiene + aromadendrene + bergamotene_a +'," + . "' bergamotene_b + bisabolene_a + bisabolene_b + bourbonene_b + cadinene_d + cadinene_g +'," + . "' cedrene_a + copaene_a + cubebene_a + cubebene_b + elemene_b + farnescene_b +'," + . "' germacrene_B + germacrene_D + gurjunene_b + humulene_a + humulene_g + isolongifolene +'," + . "' longifolene + longipinene + muurolene_a + muurolene_g + selinene_b + selinene_d +'," + . "' nerolidol_c + nerolidol_t)'"; + add_default($nl, 'megan_specifier', 'val'=>$val); + add_default($nl, 'megan_factors_file'); + add_default($nl, 'megan_mapped_emisfctrs', 'val'=>'.false.'); + } if ($chem =~ /trop_strat_mam4_ts2/ or $chem =~ /trop_strat_mam5_ts2/) { my $val = "'ISOP = isoprene'," . "'APIN = pinene_a + myrtenal'," @@ -2698,8 +2725,10 @@ if (($chem eq 'trop_mam4') or ($chem eq 'waccm_sc_mam4') or ($chem eq 'ghg_mam4' add_default($nl, 'flbc_list', 'val'=>"' '"); # Datasets - my @files = ('soil_erod_file', - 'xs_long_file', 'rsf_file', 'exo_coldens_file' ); + my @files = ('xs_long_file', 'rsf_file', 'exo_coldens_file' ); + if ($soil_erod_atm =~ /$TRUE/) { + @files = ( @files, 'soil_erod_file' ); + } foreach my $file (@files) { add_default($nl, $file); } @@ -2783,8 +2812,10 @@ if ($chem eq 'trop_mam_oslo' ) { add_default($nl, 'flbc_list', 'val'=>"' '"); # Datasets - my @files = ('soil_erod_file', - 'xs_long_file', 'rsf_file', 'exo_coldens_file' ); + my @files = ('xs_long_file', 'rsf_file', 'exo_coldens_file' ); + if ($soil_erod_atm =~ /$TRUE/) { + @files = ( @files, 'soil_erod_file' ); + } foreach my $file (@files) { add_default($nl, $file); } @@ -2872,8 +2903,10 @@ if ($chem eq 'trop_mam7') { add_default($nl, 'flbc_list', 'val'=>"' '"); # Datasets - my @files = ('soil_erod_file', - 'xs_long_file', 'rsf_file', 'exo_coldens_file' ); + my @files = ('xs_long_file', 'rsf_file', 'exo_coldens_file' ); + if ($soil_erod_atm =~ /$TRUE/) { + @files = ( @files, 'soil_erod_file' ); + } foreach my $file (@files) { add_default($nl, $file); } @@ -3197,6 +3230,7 @@ if ($waccmx) { add_default($nl,'ionos_xport_nsplit'); add_default($nl,'steady_state_ion_elec_temp', 'val'=>'.false.'); add_default($nl,'oplus_ring_polar_filter'); + add_default($nl,'rxn_rate_sums'); } # Chemistry options @@ -3263,17 +3297,18 @@ if (($chem ne 'none') and ($chem ne 'terminator') and !($chem =~ /geoschem/)) { # Deep convection scheme add_default($nl, 'deep_scheme'); +my $deep_scheme = $nl->get_value('deep_scheme'); # Aerosol convective processes -if (($phys =~ /cam6/ or $phys =~ /cam_dev/) and $nl->get_value('deep_scheme') =~ /ZM/) { +if (($phys =~ /cam6/ or $phys =~ /cam7/) and $deep_scheme =~ /ZM/) { add_default($nl, 'convproc_do_aer', 'val'=>'.true.'); add_default($nl, 'convproc_do_evaprain_atonce', 'val'=>'.true.'); add_default($nl, 'convproc_pom_spechygro', 'val'=>'0.2D0'); add_default($nl, 'convproc_wup_max', 'val'=>'4.0D0'); } -# cam_dev specific namelists -if ($phys =~ /cam_dev/ and $nl->get_value('deep_scheme') =~ /ZM/) { +# cam7 specific namelists +if ($phys =~ /cam7/ and $deep_scheme =~ /ZM/) { add_default($nl, 'zmconv_parcel_pbl', 'val'=>'.true.'); } else { add_default($nl, 'zmconv_parcel_pbl', 'val'=>'.false.'); @@ -3326,8 +3361,8 @@ if ($cfg->get('microphys') =~ /^mg/) { # namelist options for pumas tag release_v1.22 or later - # (currently only in the cam_dev physics package) - if ($phys =~ /cam_dev/) { + # (currently only in the cam7 physics package) + if ($phys =~ /cam7/) { add_default($nl, 'micro_mg_warm_rain'); add_default($nl, 'micro_mg_accre_sees_auto'); add_default($nl, 'micro_mg_vtrms_factor'); @@ -3344,7 +3379,7 @@ if ($cfg->get('microphys') =~ /^mg/) { }else { # For CESM2, the decision was made to set micro_do_sb_physics to false - # This variable is replaced with micro_mg_warm_rain in cam_dev runs + # This variable is replaced with micro_mg_warm_rain in cam7 runs add_default($nl, 'micro_do_sb_physics', 'val'=>'.false.'); } @@ -3360,13 +3395,13 @@ if ($cfg->get('microphys') =~ /^mg/) { $micro_mg_dcs = '390.D-6'; # default for SIHLS } elsif ($hgrid =~ /1.9x2.5/ and $phys eq 'cam6') { - $micro_mg_dcs = '200.D-6'; # default for FV 2-deg + $micro_mg_dcs = '200.D-6'; } elsif ($phys eq 'cam6') { - $micro_mg_dcs = '500.D-6'; # default for cam6 + $micro_mg_dcs = '500.D-6'; } - elsif ($phys eq 'cam_dev') { - $micro_mg_dcs = '500.D-6'; # default for cam_dev + elsif ($phys eq 'cam7') { + $micro_mg_dcs = '500.D-6'; } } @@ -3472,6 +3507,12 @@ if ($use_subcol_microp =~ /$TRUE/io) { } # CLUBB_SGS +my $do_clubb_sgs = $nl->get_value('do_clubb_sgs'); +if (defined $do_clubb_sgs) { + die "CAM Namelist ERROR: User may not specify the value of do_clubb_sgs.\n". + "This variable is set by build-namelist based on information\n". + "from the configure cache file.\n"; +} add_default($nl, 'do_clubb_sgs'); my $clubb_sgs = $nl->get_value('do_clubb_sgs'); if ($clubb_sgs =~ /$TRUE/io) { @@ -3640,13 +3681,6 @@ if ($clubb_sgs =~ /$TRUE/io) { add_default($nl, 'do_hb_above_clubb'); } -# Force exit if running cam_dev and CLUBB is off -if ($phys eq 'cam_dev') { - if ($clubb_sgs =~ /$FALSE/io) { - die "$ProgName - ERROR: If running cam_dev physics, do_clubb_sgs must be .true.\n"; - } -} - # Tuning for wet scavenging of modal aerosols if ($chem =~ /_mam/) { add_default($nl, 'sol_facti_cloud_borne'); @@ -3834,7 +3868,7 @@ if ($chem =~ /_mam(\d)/) { # By default, orographic waves are always on if (!$simple_phys) { - if ($phys =~ /cam6/ or $phys =~ /cam_dev/) { + if ($phys =~ /cam6/ or $phys =~ /cam7/) { add_default($nl, 'use_gw_oro', 'val'=>'.false.'); @@ -3888,8 +3922,8 @@ if ($waccm_phys or } add_default($nl, 'gw_qbo_hdepth_scaling', 'val'=>$hdepth_scaling); add_default($nl, 'gw_top_taper'); -} elsif ($phys =~ /cam_dev/) { - # cam_dev settings for nlev<60 (Other cam_dev set above) +} elsif ($phys =~ /cam7/) { + # cam7 settings for nlev<60 (Other cam7 set above) add_default($nl, 'use_gw_front' , 'val'=>'.true.'); add_default($nl, 'use_gw_convect_dp', 'val'=>'.true.'); add_default($nl, 'gw_qbo_hdepth_scaling', 'val'=>'1.0D0'); @@ -4025,7 +4059,7 @@ if ((not $waccm_phys) and ($do_gw_front or $do_gw_front_igw or $do_gw_convect_dp or $do_gw_convect_sh )) { add_default($nl, 'tau_0_ubc', 'val'=>'.true.'); -} elsif ($phys =~ /cam_dev/) { +} elsif ($phys =~ /cam7/) { add_default($nl, 'tau_0_ubc', 'val'=>'.true.'); } elsif (!$simple_phys) { add_default($nl, 'tau_0_ubc', 'val'=>'.false.'); @@ -5199,8 +5233,8 @@ sub check_snapshot_settings { if ($chem ne 'none') { push (@validList_bc, ("'chem_timestep_tend'")); } - } elsif ($phys =~ /cam_dev/) { - # CAM_DEV physpkg + } elsif ($phys =~ /cam7/) { + # CAM7 physpkg push(@validList_ac, ("'chem_emissions'", "'clubb_tend_cam'", "'microp_section'"));