diff --git a/.gitignore b/.gitignore index fbccc45e74..6beb06fc54 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ src/physics/silhs src/physics/pumas src/physics/pumas-frozen src/dynamics/fv3/atmos_cubed_sphere +src/hemco libraries/FMS libraries/mct libraries/parallelio diff --git a/Externals.cfg b/Externals.cfg index 133bfa0561..45d8422403 100644 --- a/Externals.cfg +++ b/Externals.cfg @@ -3,15 +3,15 @@ #----------------------------- [parallelio] -tag = pio2_5_10 protocol = git +tag = pio2_5_10 repo_url = https://github.com/NCAR/ParallelIO local_path = libraries/parallelio required = True [mct] -tag = MCT_2.11.0 protocol = git +tag = MCT_2.11.0 repo_url = https://github.com/MCSclimate/MCT local_path = libraries/mct required = True @@ -21,15 +21,15 @@ required = True #----------------------------- [ccs_config] -tag = ccs_config_noresm0.0.13 protocol = git +tag = ccs_config_noresm0.0.14 repo_url = https://github.com/NorESMhub/ccs_config_noresm.git local_path = ccs_config required = True [cime] -tag = cime6.0.105_noresm_v2 protocol = git +tag = cime6.0.105_noresm_v4 repo_url = https://github.com/NorESMhub/cime.git local_path = cime required = True @@ -39,8 +39,8 @@ required = True #----------------------------- [share] -tag = share1.0.17_noresm_v1 protocol = git +tag = share1.0.17_noresm_v1 repo_url = https://github.com/NorESMHub/NorESM_share local_path = share required = True @@ -50,24 +50,24 @@ required = True #----------------------------- [cice6] -tag = cesm_cice6_4_1_7_noresm_v1 protocol = git +tag = cesm_cice6_4_1_7_noresm_v1 repo_url = https://github.com/NorESMhub/NorESM_CICE local_path = components/cice externals = Externals.cfg required = True [cdeps] -tag = cdeps1.0.10 protocol = git +tag = cdeps1.0.10 repo_url = https://github.com/NorESMhub/CDEPS.git local_path = components/cdeps externals = Externals_CDEPS.cfg required = True [cmeps] -tag = cmeps0.14.32_noresm_v0 protocol = git +tag = cmeps0.14.32_noresm_v2 repo_url = https://github.com/NorESMhub/CMEPS.git local_path = components/cmeps required = True @@ -81,30 +81,30 @@ externals = Externals_CISM.cfg required = True [clm] -tag = ctsm5.1.dev124-noresm_v1 protocol = git +tag = ctsm5.1dev130-noresm_v1 repo_url = https://github.com/NorESMhub/CTSM local_path = components/clm externals = Externals_CLM.cfg required = True [mosart] -tag = mosart1_0_48_noresm_v1 protocol = git +tag = mosart1_0_48_noresm_v1 repo_url = https://github.com/NorESMhub/MOSART local_path = components/mosart required = True [rtm] -tag = rtm1_0_78 protocol = git +tag = rtm1_0_78 repo_url = https://github.com/ESCOMP/RTM local_path = components/rtm required = True [cam] -local_path = . protocol = externals_only +local_path = . externals = Externals_CAM.cfg required = True diff --git a/Externals_CAM.cfg b/Externals_CAM.cfg index 539a9c7361..4a43ae2d5d 100644 --- a/Externals_CAM.cfg +++ b/Externals_CAM.cfg @@ -1,72 +1,80 @@ [chem_proc] -local_path = chem_proc protocol = git -repo_url = https://github.com/ESCOMP/CHEM_PREPROCESSOR.git tag = chem_proc5_0_05 +repo_url = https://github.com/ESCOMP/CHEM_PREPROCESSOR.git +local_path = chem_proc required = True [carma] -local_path = src/physics/carma/base protocol = git -repo_url = https://github.com/ESCOMP/CARMA_base.git tag = carma4_00 +repo_url = https://github.com/ESCOMP/CARMA_base.git +local_path = src/physics/carma/base required = True [cosp2] -local_path = src/physics/cosp2/src protocol = svn -repo_url = https://github.com/CFMIP/COSPv2.0/tags/ tag = v2.1.4cesm/src +repo_url = https://github.com/CFMIP/COSPv2.0/tags/ +local_path = src/physics/cosp2/src required = True [clubb] -local_path = src/physics/clubb protocol = svn -repo_url = https://github.com/larson-group/clubb_release/tags/ tag = clubb_4ncar_20221129_59cb19f_20230330_branchtag/src/CLUBB_core +repo_url = https://github.com/larson-group/clubb_release/tags/ +local_path = src/physics/clubb required = True [silhs] -local_path = src/physics/silhs protocol = svn -repo_url = https://github.com/larson-group/clubb_release/tags/ tag = clubb_4ncar_20221129_59cb19f_20230330_branchtag/src/SILHS +repo_url = https://github.com/larson-group/clubb_release/tags/ +local_path = src/physics/silhs required = True [pumas] -local_path = src/physics/pumas protocol = git -repo_url = https://github.com/ESCOMP/PUMAS tag = pumas_cam-release_v1.29 +repo_url = https://github.com/ESCOMP/PUMAS +local_path = src/physics/pumas required = True [pumas-frozen] -local_path = src/physics/pumas-frozen protocol = git -repo_url = https://github.com/ESCOMP/PUMAS tag = pumas_cam-release_v1.17_rename +repo_url = https://github.com/ESCOMP/PUMAS +local_path = src/physics/pumas-frozen required = True [ali_arms] -local_path = src/physics/ali_arms protocol = git +tag = ALI_ARMS_v1.0.1 repo_url = https://github.com/ESCOMP/ALI-ARMS -tag = ALI_ARMS_v1.0.0 +local_path = src/physics/ali_arms required = True [atmos_phys] -tag = atmos_phys0_00_011 protocol = git +tag = atmos_phys0_00_011 repo_url = https://github.com/NCAR/atmospheric_physics -required = True local_path = src/atmos_phys +required = True [camnor_phys] -tag = camnor_noresm_v0.0.1 protocol = git +tag = camnor_noresm_v0.0.3 repo_url = https://github.com/NorESMhub/CAM-Nor-physics -required = True local_path = src/physics/camnor_phys +required = True + +[hemco] +protocol = git +tag = hemco-cesm1_2_0_hemco3_6_2_cesm +repo_url = https://github.com/ESCOMP/HEMCO_CESM.git +local_path = src/hemco +required = True +externals = Externals_HCO.cfg [externals_description] -schema_version = 1.0.0 +schema_version = 1.0.01 diff --git a/bld/build-namelist b/bld/build-namelist index 8e7ea8d2b2..efd42d4949 100755 --- a/bld/build-namelist +++ b/bld/build-namelist @@ -3,8 +3,7 @@ # # build-namelist # -# This script builds the namelists for the standalone CAM configuration of -# CESM. +# This script builds the namelists for the CAM component of CESM. # # build-namelist is designed to be used in conjuction with configure. # By default configure produces a config_cache.xml file that contains all @@ -49,7 +48,7 @@ OPTIONS -case "name" Case identifier up to 32 characters -config "filepath" Read the given configuration cache file to determine the configuration of the CAM executable. Default: "config_cache.xml". - -csmdata "dir" Root directory of CCSM input data. + -csmdata "dir" Root directory of CESM input data. Can also be set by using the CSMDATA environment variable. -dir "directory" Directory where output namelist files for each component will be written, i.e., atm_in, drv_in, ice_in, lnd_in, rof_in, and ocn_in. @@ -93,7 +92,7 @@ EOF (my $ProgName = $0) =~ s!(.*)/!!; # name of this script $ProgName = "CAM $ProgName"; # Since multiple components are now using a build-namelist # utility add "CAM" qualifier to the name. This helps when - # looking at error output from the whole CCSM system. + # looking at error output from the whole CESM system. my $ProgDir = $1; # name of directory containing this script -- may be a # relative or absolute path, or null if the script is in # the user's PATH @@ -183,7 +182,7 @@ EOF if ($print>=2) { print "Using CAM configuration cache file $opts{'config'}$eol"; } -# Check that the CCSM inputdata root directory has been specified. +# Check that the CESM inputdata root directory has been specified. my $inputdata_rootdir = undef; if (defined($opts{'csmdata'})) { $inputdata_rootdir = $opts{'csmdata'}; @@ -192,16 +191,16 @@ elsif (defined $ENV{'CSMDATA'}) { $inputdata_rootdir = $ENV{'CSMDATA'}; } else { - die "$ProgName - ERROR: CCSM inputdata root directory must be specified by either -csmdata argument\n" . + die "$ProgName - ERROR: CESM inputdata root directory must be specified by either -csmdata argument\n" . " or by the CSMDATA environment variable. :"; } -if ($print>=2) { print "CCSM inputdata root directory: $inputdata_rootdir$eol"; } +if ($print>=2) { print "CESM inputdata root directory: $inputdata_rootdir$eol"; } # If the -test option is specified, then the inputdata root directory must be local or nfs mounted. if ($opts{'test'}) { (-d $inputdata_rootdir) or die <<"EOF"; -** $ProgName - ERROR: CCSM inputdata root is not a directory: \"$inputdata_rootdir\" ** +** $ProgName - ERROR: CESM inputdata root is not a directory: \"$inputdata_rootdir\" ** EOF } @@ -369,7 +368,9 @@ if (defined $opts{'case'}) { add_default($nl, 'case_name', 'val'=>$opts{'case'}) # Run type if (defined $opts{'runtype'}) { add_default($nl, 'start_type', 'val'=>$opts{'runtype'}); } -# Process the -namelist arg. +# Process the -namelist argument. CIME uses this argument to pass the values that have been +# set by the compset definition via the CAM_NAMELIST_OPTS variable, along with additional +# settings made in the buildnml script. if (defined $opts{'namelist'}) { # Parse commandline namelist @@ -387,7 +388,8 @@ if (defined $opts{'namelist'}) { $nl->merge_nl($nl_arg_valid); } -# Process the -infile arg. +# Process the -infile argument. CIME uses this argument to pass the contents of the user_nl_cam +# file, along with additional settings made in the buildnml script. if (defined $opts{'infile'}) { # Parse namelist input from a file @@ -405,6 +407,11 @@ if (defined $opts{'infile'}) { $nl->merge_nl($nl_infile_valid); } +# Check for user input via the user_nl_cam file which is inconsistent with settings determined by +# the compset definition. + +check_user_input($nl); + # Process the -use_case arg. # Declare global symbol $uc_defaults even if it's not defined, because we check whether it's # defined before using it in the get_default_value method below. @@ -473,10 +480,26 @@ if ($phys eq 'adiabatic') { ++$phys_mode_flags; } my $ideal_mode = 0; -if ($phys eq 'kessler' or $phys eq 'held_suarez' or $phys eq 'tj2016') { +if ($phys eq 'kessler' or $phys eq 'held_suarez' or $phys eq 'tj2016' or $phys eq 'grayrad' ) { $ideal_mode = 1; ++$phys_mode_flags; } +if ($phys eq 'grayrad' ) { + add_default($nl, 'frierson_albedo'); + add_default($nl, 'frierson_c0'); + add_default($nl, 'frierson_deltas'); + add_default($nl, 'frierson_fb'); + add_default($nl, 'frierson_linfrac'); + add_default($nl, 'frierson_ri_c'); + add_default($nl, 'frierson_tau_eqtr'); + add_default($nl, 'frierson_tau_pole'); + add_default($nl, 'frierson_tdlt'); + add_default($nl, 'frierson_tmin'); + add_default($nl, 'frierson_twidth'); + add_default($nl, 'frierson_wetdrycoef'); + add_default($nl, 'frierson_wind_min'); + add_default($nl, 'frierson_z0'); +} if ($phys_mode_flags > 1) { die "$ProgName - ERROR: Only one of the variables atm_adiabatic, atm_ideal_phys, and aqua_planet can be set .true. \n"; } @@ -2319,18 +2342,18 @@ if (($chem =~ /_mam4/ or $chem =~ /_mam5/) and ($phys =~ /cam6/ or $phys =~ /cam if ($chem eq 'trop_mam4' or $chem eq 'waccm_sc_mam4'or $chem eq 'ghg_mam4') { # 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' => '3.4192D0', - 'BENZENE_bb_srf_file' => '3.4192D0', - 'ISOP_bb_srf_file' => '0.9058D0', - 'MTERP_bb_srf_file' => '5.8638D0', - 'TOLUENE_an_srf_file' => '9.4429D0', - 'TOLUENE_bb_srf_file' => '9.4429D0', - 'XYLENES_an_srf_file' => '7.3804D0', - 'XYLENES_bb_srf_file' => '7.3804D0', - 'IVOC_an_srf_file' => '8.6158D0', - 'IVOC_bb_srf_file' => '8.6158D0', - 'SVOC_an_srf_file' => '16.7388D0', - 'SVOC_bb_srf_file' => '16.7388D0'); + my %soae_fctrs = ('BENZENE_an_srf_file' => '2.5592D0', + 'BENZENE_bb_srf_file' => '2.5592D0', + 'ISOP_bb_srf_file' => '0.5954D0', + 'MTERP_bb_srf_file' => '5.1004D0', + 'TOLUENE_an_srf_file' => '8.2367D0', + 'TOLUENE_bb_srf_file' => '8.2367D0', + 'XYLENES_an_srf_file' => '6.5013D0', + 'XYLENES_bb_srf_file' => '6.5013D0', + 'IVOC_an_srf_file' => '8.5371D0', + 'IVOC_bb_srf_file' => '8.5371D0', + 'SVOC_an_srf_file' => '16.650D0', + 'SVOC_bb_srf_file' => '16.650D0'); foreach my $id (sort keys %soae_fctrs) { my $rel_filepath = get_default_value($id, \%verhash); my $abs_filepath = set_abs_filepath($rel_filepath, $inputdata_rootdir); @@ -2413,12 +2436,12 @@ if (($chem =~ /_mam4/ or $chem =~ /_mam5/) and ($phys =~ /cam6/ or $phys =~ /cam # MEGAN emissions if (($chem eq 'trop_mam4' or $chem eq 'waccm_sc_mam4' or $chem eq 'ghg_mam4') and !$aqua_mode and !$scam){ - my $val = "'SOAE = 0.9058*isoprene + 5.8638*(carene_3 + pinene_a + thujene_a + bornene +'," + my $val = "'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) + '," - . "' 13.4042*(farnescene_a + caryophyllene_b + acoradiene + aromadendrene + bergamotene_a +'," + . "' 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 +'," @@ -2854,6 +2877,23 @@ else { } } +# Harmonized Emissions Component (HEMCO) options +# Because HEMCO is configured at runtime, all of the options will be +# present in the namelist. +add_default($nl, 'use_hemco'); +if ($nl->get_value('use_hemco') =~ m/$TRUE/io) { + add_default($nl, 'cam_physics_mesh'); + add_default($nl, 'hemco_data_root'); + add_default($nl, 'hemco_config_file'); + add_default($nl, 'hemco_diagn_file'); + add_default($nl, 'hemco_grid_xdim'); + add_default($nl, 'hemco_grid_ydim'); + # Remove these variables if present in the namelist since they are + # ignored at runtime when HEMCO is used. + $nl->delete_variable('chem_inparm', 'ext_frc_specifier'); + $nl->delete_variable('chem_inparm', 'srf_emis_specifier'); +} + # Physics options # Add the name of the physics package based on the info in configure. If the user tries @@ -3029,7 +3069,6 @@ if ($cfg->get('microphys') =~ /^mg/) { add_default($nl, 'nucleate_ice_subgrid_strat'); add_default($nl, 'nucleate_ice_use_troplev'); add_default($nl, 'cld_macmic_num_steps', 'dtime'=>$dtime); - add_default($nl, 'micro_mg_dcs'); add_default($nl, 'micro_mg_precip_frac_method'); add_default($nl, 'micro_mg_berg_eff_factor'); add_default($nl, 'nucleate_ice_incloud'); @@ -3057,6 +3096,31 @@ if ($cfg->get('microphys') =~ /^mg/) { add_default($nl, 'micro_mg_accre_sees_auto'); add_default($nl, 'micro_mg_implicit_fall'); } + + # tunings for micro_mg_dcs + my $microphys = $cfg->get('microphys'); + my $hgrid = $cfg->get('hgrid'); + my $silhs = $cfg->get('silhs'); + + my $micro_mg_dcs = '400.D-6'; # default for cam5/mg1 + + if ($microphys =~ /mg2|mg3/) { + if ($silhs eq '1') { + $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 + } + elsif ($phys eq 'cam6') { + $micro_mg_dcs = '500.D-6'; # default for cam6 + } + elsif ($phys eq 'cam_dev') { + $micro_mg_dcs = '250.D-6'; # default for cam_dev + } + } + + + add_default($nl, 'micro_mg_dcs', 'val'=>$micro_mg_dcs); } # Aerosol Namelist options @@ -3564,6 +3628,11 @@ 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) + 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'); } else { add_default($nl, 'use_gw_front' , 'val'=>'.false.'); add_default($nl, 'use_gw_convect_dp', 'val'=>'.false.'); @@ -3619,6 +3688,7 @@ if ($do_gw_front_igw) { if ($do_gw_front or $do_gw_front_igw) { add_default($nl, 'frontgfc'); + add_default($nl, 'front_gaussian_width'); } if ($do_gw_convect_dp) { @@ -3636,8 +3706,8 @@ if ($do_gw_rdg_beta) { die "$ProgName - ERROR: beta ridge scheme requires data from a topo file.\n"; } add_default($nl, 'n_rdg_beta', 'val'=>'10'); - add_default($nl, 'effgw_rdg_beta', 'val'=>'1.0D0'); - add_default($nl, 'effgw_rdg_beta_max', 'val'=>'1.0D0'); + add_default($nl, 'effgw_rdg_beta'); + add_default($nl, 'effgw_rdg_beta_max'); add_default($nl, 'trpd_leewv_rdg_beta', 'val'=>'.false.'); add_default($nl, 'rdg_beta_cd_llb', 'val'=>'1.0D0'); } @@ -3693,7 +3763,9 @@ if (($do_gw_rdg_beta or $do_gw_rdg_gamma)) { # use tau_0_ubc = .false. to avoid changing answers. if ((not $waccm_phys) and ($do_gw_front or $do_gw_front_igw or - $do_gw_convect_dp or $do_gw_convect_sh)) { + $do_gw_convect_dp or $do_gw_convect_sh )) { + add_default($nl, 'tau_0_ubc', 'val'=>'.true.'); +} elsif ($phys =~ /cam_dev/) { add_default($nl, 'tau_0_ubc', 'val'=>'.true.'); } elsif (!$simple_phys) { add_default($nl, 'tau_0_ubc', 'val'=>'.false.'); @@ -4299,7 +4371,7 @@ sub add_default { # # ***** N.B. ***** This routine assumes the following variables are in package main:: # $definition -- the namelist definition object -# $inputdata_rootdir -- CCSM inputdata root directory +# $inputdata_rootdir -- CESM inputdata root directory my $nl = shift; # namelist object my $var = shift; # name of namelist variable @@ -4352,7 +4424,7 @@ sub add_default { # The default values for input pathnames are relative. If the namelist # variable is defined to be an absolute pathname, then prepend - # the CCSM inputdata root directory. + # the CESM inputdata root directory. if ($is_input_pathname eq 'abs') { $val = set_abs_filepath($val, $inputdata_rootdir); } @@ -4522,6 +4594,37 @@ sub fv3_decomp_set{ #----------------------------------------------------------------------------------------------- +sub check_user_input { + +# Check that user input in the user_nl_cam file is consistent with input that has been set by +# the compset definition via CAM_NAMELIST_OPTS. This routine is called after build-namelist has +# processed both the -namelist argument which contains the input from CAM_NAMELIST_OPTS, and +# the -infile argument which contains input from user_nl_cam. +# +# Checks for specific inconsistencies are added here by CAM developers as deemed useful for +# improving robustness of the user interface. + + my $nl = shift; # namelist object + + # When HEMCO is being used any emissions or external forcings specified by the + # srf_emis_specifier and ext_frc_specifier variables will be ignored at runtime. + # Check here that these variable are not set if the compset definition sets + # use_hemco=.true. + + my $hemco = $nl->get_value('use_hemco'); + if (defined $hemco and $hemco =~ m/$TRUE/io) { + if (defined $nl->get_value('srf_emis_specifier') or + defined $nl->get_value('ext_frc_specifier') ) { + die "$ProgName - ERROR: It is not allowed to set either srf_emis_specifier \n", + " or ext_frc_specifier when HEMCO is used.\n"; + } + } + + +} + +#----------------------------------------------------------------------------------------------- + sub check_input_files { # For each variable in the namelist which is an input dataset, or contains filepaths @@ -4687,7 +4790,7 @@ sub check_input_files { # If $name2 starts with a slash, then it is an absolute filepath. # If $name2 starts with a $, then it is an unresolved filepath - # (generated when run from CCSM scripts). + # (generated when run from CIME scripts). # Otherwise check for more fields if ($name2 =~ m:^[/\$]:) { @@ -4827,6 +4930,8 @@ sub check_snapshot_settings { push (@validList_bc, ("'kessler_tend'")); } elsif ($phys eq 'tj2016') { push (@validList_bc, ("'thatcher_jablonowski_precip_tend'")); + } elsif ($phys eq 'grayrad') { + push (@validList_bc, ("'frierson_tend'")); } if ($chem ne 'none') { push (@validList_bc, ("'chem_timestep_tend'")); @@ -4945,38 +5050,6 @@ sub check_snapshot_settings { #----------------------------------------------------------------------------------------------- -sub strip_rootdir { - -# Strip a root directory from the begining of a filepath. -# Allow for the possibility that the root directory is specified as a shell variable -# to support a CCSM script requirement. - - my ($filepath, $rootdir) = @_; - - # Check whether the rootdir is specified as a shell variable. - if ($rootdir =~ m/^\$(\w*)/) { - - my $rootname = $1; - - # Strip off the root directory with the following regexp that - # avoids the problem of $rootdir being interpolated to a scalar variable - # name... - #$filepath =~ s:^\$$rootname::; - - # The CCSM scripts are currently set up to expect the shell variable in the - # output file that contains the list of inputdata files. So in this case - # do nothing. - - } - else { - # Strip off the rootdir specified as a resolved pathname - $filepath =~ s:^$rootdir::; - } - return $filepath; -} - -#----------------------------------------------------------------------------------------------- - sub set_abs_filepath { # check whether the input filepath is an absolute path, and if it isn't then diff --git a/bld/config_files/definition.xml b/bld/config_files/definition.xml index f286a6ff29..251669792a 100644 --- a/bld/config_files/definition.xml +++ b/bld/config_files/definition.xml @@ -46,14 +46,22 @@ Switch to turn on analytic initial conditions for the dynamics state: 0 => no 1 => yes. + +Model top specifier - set by compset definition + lt: ~ 40 km top + mt: ~ 80 km top + Option to turn on waccmx thermosphere/ionosphere extension: 0 => no, 1 => yes Ionosphere model used in WACCMX. - -Physics package: cam3, cam4, cam5, cam6, cam_dev, held_suarez, adiabatic, kessler, tj2016, spcam_sam1mom, spcam_m2005. + +Physics package: cam3, cam4, cam5, cam6, cam_dev, held_suarez, adiabatic, kessler, tj2016, grayrad, spcam_sam1mom, spcam_m2005. + + +Switch to turn on Harmonized Emissions Component (HEMCO) for chemistry: 0 => no, 1 => yes. Option to turn on NorESM modifications to baseline CESM/CAM physics and dynamics diff --git a/bld/configure b/bld/configure index 724694f850..dce056db30 100755 --- a/bld/configure +++ b/bld/configure @@ -90,6 +90,7 @@ OPTIONS -max_n_rad_cnst Maximum number of constituents that are either radiatively active, or in any single diagnostic list for the radiation. -microphys Specify the microphysics option [mg1 | mg2 | mg3| rk]. + -model_top Specify the model_top option [ lt | mt ]. -nadv Set total number of advected species to . -nadv_tt Set number of advected test tracers . -nlev Set number of levels to . @@ -98,7 +99,7 @@ OPTIONS -pcols Set maximum number of columns in a chunk to . -pergro Switch enables building CAM for perturbation growth tests. -phys Physics option [cam3 | cam4 | cam5 | cam6 | cam_dev | - held_suarez | adiabatic | kessler | tj2016 | + held_suarez | adiabatic | kessler | tj2016 | grayrad | spcam_sam1mom | spcam_m2005]. Default: cam6 -prog_species Comma-separate list of prognostic mozart species packages. Currently available: DST,SSLT,SO4,GHG,OC,BC,CARBON16 @@ -270,6 +271,7 @@ GetOptions( "max_n_rad_cnst=s" => \$opts{'max_n_rad_cnst'}, "mct_libdir=s" => \$opts{'mct_libdir'}, "microphys=s" => \$opts{'microphys'}, + "model_top=s" => \$opts{'model_top'}, "mpi_inc=s" => \$opts{'mpi_inc'}, "mpi_lib=s" => \$opts{'mpi_lib'}, "nadv=s" => \$opts{'nadv'}, @@ -574,7 +576,7 @@ if ($print>=2) { # Set flag to indicate a simple physics option my $simple_phys = 0; -if ($phys_pkg =~ m/^adiabatic$|^held_suarez$|^kessler$|^tj2016$/) { +if ($phys_pkg =~ m/^adiabatic$|^held_suarez$|^kessler$|^tj2016$|^grayrad$/) { $simple_phys = 1; } @@ -687,6 +689,18 @@ my $max_n_rad_cnst = $cfg_ref->get('max_n_rad_cnst'); if ($print>=2) { print "Maximum radiatively active tracers: $max_n_rad_cnst$eol"; } +#----------------------------------------------------------------------------------------------- +# model_top - not set by default +my $model_top = 'none'; +$cfg_ref->set('model_top', $model_top); + +# user override +if (defined $opts{'model_top'}) { + $cfg_ref->set('model_top', $opts{'model_top'}); +} +if ($print>=2) { print "model_top: $model_top$eol"; } + + #----------------------------------------------------------------------------------------------- # waccm physics my $waccm_phys = 0; @@ -1559,6 +1573,8 @@ $nadv = $cfg_ref->get('nadv'); if ($print>=2) { print "Total advected constituents: $nadv$eol"; } #----------------------------------------------------------------------------------------------- + +##----------------------------------------------------------------------------------------------- # Makefile configuration ####################################################################### #----------------------------------------------------------------------------------------------- @@ -1913,9 +1929,20 @@ if ($silhs == 1) { $cfg_cppdefs .= ' -DSILHS'; } +# Simple Models +if ($simple_phys) { $cfg_cppdefs .= ' -DSIMPLE'; } + # UNICON if ($unicon) { $cfg_cppdefs .= ' -DUSE_UNICON'; } +# Harmonized Emissions Component (HEMCO) +# These CPP definitions are used by HEMCO to recognize - +# MODEL_ - HEMCO/GEOS-Chem components running in model environment +# MODEL_CESM - ...within CESM +# USE_REAL8 - HEMCO/GEOS-Chem should use real8 internal precision +# HEMCO_CESM - indicates CESM model environment. Deprecated, will be removed soon. +$cfg_cppdefs .= ' -DMODEL_ -DMODEL_CESM -DHEMCO_CESM -DUSE_REAL8 '; + #----------------------------------------------------------------------------------------------- # CPP defines to put on Makefile @@ -2125,6 +2152,21 @@ sub write_filepath print $fh "$camsrcdir/src/ionosphere\n"; print $fh "$camsrcdir/src/chemistry/mozart\n"; + + print $fh "$camsrcdir/src/hemco\n"; + + # shared dependencies for HEMCO (Harmonized Emissions Component) + print $fh "$camsrcdir/src/hemco/HEMCO/src/Shared\n"; + print $fh "$camsrcdir/src/hemco/HEMCO/src/Shared/Headers\n"; + print $fh "$camsrcdir/src/hemco/HEMCO/src/Shared/GeosUtil\n"; + print $fh "$camsrcdir/src/hemco/HEMCO/src/Shared/NcdfUtil\n"; + + # HEMCO source code directory paths from HEMCO external + print $fh "$camsrcdir/src/hemco/HEMCO/src/Core\n"; + print $fh "$camsrcdir/src/hemco/HEMCO/src/Extensions\n"; + print $fh "$camsrcdir/src/hemco/HEMCO/src/Interfaces/Shared\n"; + + print $fh "$camsrcdir/src/chemistry/utils\n"; if ($rad eq 'rrtmg') { diff --git a/bld/namelist_files/namelist_defaults_cam.xml b/bld/namelist_files/namelist_defaults_cam.xml index 0db8c5b711..6eb81ca2e8 100644 --- a/bld/namelist_files/namelist_defaults_cam.xml +++ b/bld/namelist_files/namelist_defaults_cam.xml @@ -78,6 +78,7 @@ atm/cam/inic/fv/f.e22.FC2010climo.f09_f09_mg17.cam6_2_022.001.cam.i.0016-01-01-00000_c200610.nc atm/cam/inic/fv/f.e22.FC2010climo.f09_f09_mg17.cam6_2_022.001.cam.i.0016-01-01-00000_c200610.nc atm/cam/inic/fv/f.e22.FC2010climo.f09_f09_mg17.cam6_2_022.001.cam.i.0016-01-01-00000_c200610.nc +atm/cam/inic/fv/FC2000mam5_f10_0002-01-01_c221214.nc atm/cam/inic/fv/cami-mam3_0000-01-01_0.9x1.25_L32_c141031.nc atm/cam/inic/fv/cami-mam3_0000-01-01_1.9x2.5_L32_c150407.nc atm/cam/inic/fv/cami-mam4_0000-01-01_10x15_L32_c170914.nc @@ -123,10 +124,9 @@ atm/cam/inic/se/f.e22.FCnudged.ne0CONUSne30x8_ne0CONUSne30x8_mt12.cam6_2_032.002.cam.i.2013-01-01-00000_c200623.nc atm/cam/inic/se/f.e22.FCnudged.ne30_ne30_mg17.release-cesm2.2.0_spinup.2010_2020.001.cam.i.2011-01-01-00000_L58_c220310.nc atm/cam/inic/se/FCMTHIST_ne30pg3_1980-01-01_c221214.nc -atm/cam/inic/fv/FC2000mam5_f10_0002-01-01_c221214.nc -atm/cam/inic/se/FWsc_ne30pg3_58L_GRID_48_taperstart10km_lowtop_BL10_v3_beta1p75_Top_43km.nc -atm/cam/inic/se/L93_ne30pg3_ne30pg3_mg17_450_short.cam.i.1979-01-07-00000.nc +atm/cam/inic/se/FLT_L58_ne30pg3_IC_c220623.nc +atm/cam/inic/se/cam7_FMT_ne30pg3_mg17_L93_c221118.nc atm/cam/chem/trop_mozart/ic/cami_0000-09-01_4x5_L26_c060217.nc atm/cam/chem/trop_mozart/ic/cami_0000-09-01_10x15_L26_c060216.nc @@ -217,8 +217,13 @@ atm/cam/inic/gaus/cami_0000-09-01_8x16_L26_c030918.nc atm/cam/inic/gaus/cami_0000-01-01_8x16_L30_c090102.nc - +atm/cam/inic/se/cam6_QPC6_topo_ne3pg3_mg37_L32_01-01-31_c221214.nc +atm/cam/inic/se/cam6_QPC6_topo_ne3pg3_mg37_L58_01-01-31_c221214.nc +atm/cam/inic/se/cam6_QPC6_topo_ne3pg3_mg37_L93_01-01-31_c221214.nc atm/cam/inic/homme/cami-mam3_0000-01_ne5np4_L30.140707.nc +atm/cam/inic/se/F2000climo_ne5pg3_mg37_L32_01-01-31_c230520.nc +atm/cam/inic/se/F2000climo_ne5pg3_mg37_L58_01-01-31_c230520.nc + atm/cam/inic/se/ape_topo_cam4_ne16np4_L26_c171020.nc atm/cam/inic/se/ape_topo_cam4_ne16np4_L30_c171020.nc atm/cam/inic/se/ape_topo_cam4_ne16np4_L32_c171020.nc @@ -236,6 +241,9 @@ atm/cam/inic/homme/cami-mam3_0000-01-ne240np4_L30_c111004.nc +atm/cam/inic/se/cam6_QPC6_aqua_ne3pg3_mg37_L32_01-01-31_c221214.nc +atm/cam/inic/se/cam6_QPC6_aqua_ne3pg3_mg37_L58_01-01-31_c221214.nc +atm/cam/inic/se/cam6_QPC6_aqua_ne3pg3_mg37_L93_01-01-31_c221214.nc atm/cam/inic/se/ape_cam4_ne5np4_L26_c170517.nc atm/cam/inic/se/ape_cam4_ne16np4_L26_c170417.nc atm/cam/inic/se/ape_cam4_ne30np4_L26_c170417.nc @@ -361,6 +369,24 @@ held_suarez_1994 moist_baroclinic_wave_dcmip2016 moist_baroclinic_wave_dcmip2016 + moist_baroclinic_wave_dcmip2016 + + + + 1.0d-5 + 3.21d-5 + 1.0d0 + 0.1d0 + 0.310d0 + 1.4d0 + 6.0d0 + 1.5d0 + 0.1d0 + 1.d7 + 1.d0 + 271.d0 + 39.d0 + 26.d0 @@ -691,6 +717,7 @@ 3.00D-15 7.5D-16 3.0D-15 + 30.D0 @@ -705,6 +732,8 @@ 0.7D0 0.4D0 +0.30D0 +0.70D0 0.55D0 0.5D0 0.5D0 @@ -713,8 +742,17 @@ 0.5D0 0.5D0 0.5D0 + 0.0625D0 +1.0D0 +0.5D0 +0.5D0 + +1.0D0 +0.5D0 +0.5D0 + 0.03D0 @@ -745,9 +783,8 @@ .true. .true. .true. -.true. -.false. -.false. +.true. +.false. .false. .false. .false. @@ -797,15 +834,15 @@ 320x385 -atm/cam/coords/fv0.47x0.63_esmf_c210305.nc -atm/cam/coords/fv0.9x1.25_esmf_c210305.nc -atm/cam/coords/fv1.9x2.5_esmf_200428.nc -atm/cam/coords/fv4x5_esmf_c210305.nc -atm/cam/coords/ne5np4_esmf_20191204.nc -atm/cam/coords/ne5np4.pg3_esmf_mesh_c210121.nc -atm/cam/coords/ne16np4_esmf_c210305.nc -atm/cam/coords/ne30np4_esmf_c210305.nc -atm/cam/coords/ne30pg3_esmf_20200428.nc +atm/cam/coords/fv0.47x0.63_esmf_c210305.nc +atm/cam/coords/fv0.9x1.25_esmf_c210305.nc +atm/cam/coords/fv1.9x2.5_esmf_200428.nc +atm/cam/coords/fv4x5_esmf_c210305.nc +atm/cam/coords/ne5np4_esmf_20191204.nc +atm/cam/coords/ne5np4.pg3_esmf_mesh_c210121.nc +atm/cam/coords/ne16np4_esmf_c210305.nc +atm/cam/coords/ne30np4_esmf_c210305.nc +atm/cam/coords/ne30pg3_esmf_20200428.nc 1.00D0 @@ -1859,8 +1896,10 @@ atm/cam/chem/trop_mam/atmsrf_ne3np4.pg3_cdf5_c221214.nc +atm/cam/chem/trop_mam/atmsrf_ne5pg3_201105.nc atm/cam/chem/trop_mam/atmsrf_ne5np4_cdf5_110920.nc atm/cam/chem/trop_mam/atmsrf_ne16np4_cdf5_110920.nc +atm/cam/chem/trop_mam/atmsrf_ne16pg3_c230520.nc atm/cam/chem/trop_mam/atmsrf_ne30np4_cdf5_110920.nc atm/cam/chem/trop_mam/atmsrf_ne30pg3_cdf5_180522.nc atm/cam/chem/trop_mam/atmsrf_ne60np4_110920.nc @@ -1995,6 +2034,7 @@ 6.0 1.0 0.5 + 0.1 0.5 4.2 0.0 @@ -2013,6 +2053,7 @@ 1.25 0.25 0.3 + 0.1 0.3 0.0 0.4 @@ -2023,7 +2064,7 @@ .true. .false. 0.308 - 0.280 + 0.280 0.270 0.32 2 @@ -2047,10 +2088,11 @@ .true. .true. .true. - .false. - .false. + .true. + .true. .false. .false. + .true. .false. .false. .false. @@ -2145,21 +2187,13 @@ 1 0 1 - 400.D-6 - - 2 - 0 - 1 - 500.D-6 - 390.D-6 - 200.D-6 - - 3 - 0 - 1 - 500.D-6 - 390.D-6 - 200.D-6 + 2 + 0 + 1 + + 3 + 0 + 1 .false. .true. @@ -2190,6 +2224,7 @@ 1.D0 1.D0 + 2.5D0 0.2D0 @@ -2199,7 +2234,7 @@ 25.D-6 1.D0 - 1.D0 + 0.5D0 1.D0 1.D0 @@ -2334,7 +2369,7 @@ 0.55D0 0.22D0 0.70D0 -0.70D0 +0.80D0 0.8D0 0.8D0 0.8D0 @@ -2370,13 +2405,14 @@ -1.35D0 -1.62D0 -0.90D0 -1.00D0 -1.10D0 -1.2D0 -0.60D0 +1.35D0 +1.62D0 +0.90D0 +1.00D0 +1.5D0 +1.10D0 +1.2D0 +0.60D0 1.0D0 @@ -2925,6 +2961,7 @@ 1 3 1 + 1 0 0 -10 @@ -2980,12 +3017,12 @@ 3.22D0 - 3 - 2 - 4 - 4 - 3 - 1 + 3 + 2 + 4 + 4 + 3 + 1 1 20 @@ -3012,9 +3049,9 @@ -1 - 1.25e5 - 1.0e6 - 1.0e6 + 1.25e5 + 1.0e6 + 1.0e6 0.0 1.0 @@ -3034,18 +3071,18 @@ 2 1 - 3 - 5 - 3 - 5 - 3 - 10 + 3 + 5 + 3 + 5 + 3 + 10 7 3 4 - 6 + 6 3 -1 @@ -3140,6 +3177,16 @@ + + 'O3S_Loss = 2.0*O_O3 + O1D_H2O + HO2_O + HO2_O3 + OH_O + OH_O3 + H_O3 + 2.0*NO2_O + 2.0*jno3_b + 2.0*CLO_O + 2.0*jcl2o2 + ', + '2.0*CLO_CLOa + 2.0*CLO_CLOb + 2.0*BRO_CLOb + 2.0*BRO_CLOc + 2.0*BRO_BRO + 2.0*BRO_O + CLO_HO2 + BRO_HO2 + S_O3' + + + 'O3S_Loss = 2.0*O_O3 + O1D_H2O + HO2_O + HO2_O3 + OH_O + OH_O3 + H_O3 + 2.0*NO2_O + 2.0*jno3_b + 2.0*CLO_O + 2.0*jcl2o2 + ', + '2.0*CLO_CLOa + 2.0*CLO_CLOb + 2.0*BRO_CLOb + 2.0*BRO_CLOc + 2.0*BRO_BRO + 2.0*BRO_O + CLO_HO2 + BRO_HO2 + S_O3', + 'SolIonRate_Tot = jeuv_1 + jeuv_2 + jeuv_3 + jeuv_4 + jeuv_5 + jeuv_6 + jeuv_7 + jeuv_8 + jeuv_9 + jeuv_10 + jeuv_11 + ', + 'jeuv_14 + jeuv_15 + jeuv_16 + jeuv_17 + jeuv_18 + jeuv_19 + jeuv_20 + jeuv_21 + jeuv_22 + jeuv_23', + 'O3_Prod = NO_HO2 + CH3O2_NO + HOCH2OO_NO + C2H5O2_NO + CH3CO3_NO + EO2_NO + C3H7O2_NO + PO2_NO + ', 'RO2_NO + ENEO2_NO + MACRO2_NOa + jhonitr + ', @@ -3291,4 +3338,31 @@ ' C3H6_O3 + ISOP_O3 + MVK_O3 + MACR_O3 + MTERP_O3 + BCARY_O3 + S_O3 + SO_O3' + +.false. +atm/cam/geoschem/emis/ExtData/HEMCO +atm/cam/geoschem/emis/HEMCO_Config.CC.CEDS_AEIC19.NEx.c230615.rc +atm/cam/geoschem/emis/HEMCO_Diagn.3_5_0.c230307.rc +-1 + + +144 +91 + + +576 +361 + + +288 +201 + + +288 +201 + + +144 +91 + diff --git a/bld/namelist_files/namelist_definition.xml b/bld/namelist_files/namelist_definition.xml index 14a8864857..3ba59737e0 100644 --- a/bld/namelist_files/namelist_definition.xml +++ b/bld/namelist_files/namelist_definition.xml @@ -54,6 +54,122 @@ that have only a small number of allowed values. --> + + + + Minimum Wind Threshold for surface flux calculations which is + added to avoid possible cases that would result in a division by zero. + Default: 1.0d-5 + + + + Surface Roughness Length for surface drag calculation. + Default: 3.21d-5 + + + + Critical Richardson Number for stable mixing cutoff. + Default: 1.0 + + + + Surface Layer Fraction of boundary layer depth. + The prescribed fraction of the boundary layer depth + for surface interactions. + Default: 0.1 + + + + Frierson Albedo: Frierson's Net Solar Flux=> 938.4 = 1360*(1.-0.31) + The Frierson model prescribes a net solar flux which incorporated the + effects of albedo. Rather than adhering to this formulation, the net + solar flux is obtained by a more common practice of specifying an albedo + value. For the approximate (simple) solar flux of 1360 W m-2, the albedo + value of 0.31 yields the value used by Frierson. + Default: 0.31 + + + + Latitudinal Variation of Shortwave Radiation. + Shortwave radiation contains no seasonal/diurnal variations and has a + Latitudinal variation specified by DeltaS according to: + R_solar = (R_net/4)*[1 + DeltaS*P_2(Lat)] + where P_2 is the second Legendre polynomial. + Default: 1.4 + + + + Longwave Optical Depth at Equator. + The optical depths are specified as a function of Latitude to approximate + the effects of water vapor according to: + Tau_0 = Tau_eqtr + (Tau_pole - Tau_eqtr)*sin^2(Lat) + Default: 6.0 + + + + Longwave Optical Depth at Poles. + The optical depths are specified as a function of Latitude to approximate + the effects of water vapor according to: + Tau_0 = Tau_eqtr + (Tau_pole - Tau_eqtr)*sin^2(Lat) + Default: 1.5 + + + + Linear Optical Depth Parameter for stratosphere. + The pressure dependence of optical depths that approximate the effects of + water vapor varies according to: + Tau = Tau_0*[ LinFrac*(P/P_s) + (1-LinFrac)*(P/P_s)^4 ] + Default: 0.1 + + + + Ocean Mixed-Layer Heat Capacity. + The ocean surface is a slab mixed layer with a specified heat capacity in units of J K-1 m-2 + Default: 1.e7 + + + + Scale Factor for E0 (saturation vapor pressure) to contol wet/dry experiments. + WetDryCoef=0 corresponds to the atmosphere in the dry limit. + Friersons wet limit corresponds to WetDryCoef=10. + Default: 1. + + + + Tsrf Initial Condition: Minimum SST (K). + The ocean temperatures are initailized with the values: + T_s = Tmin + Tdlt*exp[-0.5*(Lat/Twidth)^2] + Default: 271. + + + + Tsrf Initial Condition: Equator-Pole SST difference (K). + The ocean temperatures are initailized with the values: + T_s = Tmin + Tdlt*exp[-0.5*(Lat/Twidth)^2] + Default: 39. + + + + Tsrf Initial Condition: Latitudinal width parameter for sst (degrees latitude) + The ocean temperatures are initailized with the values: + T_s = Tmin + Tdlt*exp[-0.5*(Lat/Twidth)^2] + Default: 26. + + + +Width of gaussian used to create frontogenesis tau profile [m/s]. +Default: set by build-namelist. + + Full pathname of Beres lookup table data file for gravity waves sourced @@ -2830,7 +2952,7 @@ Default: .false. Heterogeneous freezing scaling factor for black carbon aerosols. -Default: 0.0 +Default: 0.01 + group="phys_ctl_nl" valid_values="cam3,cam4,cam5,cam6,adiabatic,held_suarez,kessler,frierson" > Name of the CAM physics package. N.B. this variable may not be set by the user. It is set by build-namelist via information in the configure cache file to be consistent with how CAM was built. @@ -4798,6 +4920,14 @@ cache file to be consistent with how CAM was built. Default: set by build-namelist + +If TRUE then the Harmonized Emissions Component, HEMCO, will be used +to calculate emissions in chemistry. ext_frc_specifier and srf_emis_specifier +will be ignored. +Default: FALSE + + Runtime options of upper thermosphere WACCM-X. 'ionosphere' for @@ -4929,6 +5059,45 @@ List of full pathnames of LTR electic potential inputs for both hemispheres. Default: NONE. + + +Full pathname of HEMCO data root for use in reading HEMCO input files. +(e.g., '$DIN_LOC_ROOT/atm/cam/geoschem/emis/ExtData/HEMCO'). +Default: set by build-namelist. + + + +Full pathname of the HEMCO_Config.rc input file used to configure HEMCO. +Default: set by build-namelist. + + + +Full pathname of the HEMCO_Diagn.rc input file used to configure HEMCO diagnostics. +Default: set by build-namelist. + + + +Number of x-dimensions in HEMCO internal grid. +Default: set by build-namelist. + + + +Number of y-dimensions in HEMCO internal grid. +Default: set by build-namelist. + + + +Force emission year for HEMCO clock if positive. This will force cycling of data on this year. +Default: set by build-namelist for climo cases, otherwise -1 to use model clock. + + + 18500101 FIXED - -atm/cam/inic/se/FWsc_ne30pg3_58L_GRID_48_taperstart10km_lowtop_BL10_v3_beta1p75_Top_43km.nc - atm/waccm/lb/LBC_17500116-20150116_CMIP6_0p5degLat_c180905.nc 1850 diff --git a/bld/namelist_files/use_cases/1850_cam_mt.xml b/bld/namelist_files/use_cases/1850_cam_mt.xml index 67049703f3..5a535f27be 100644 --- a/bld/namelist_files/use_cases/1850_cam_mt.xml +++ b/bld/namelist_files/use_cases/1850_cam_mt.xml @@ -6,9 +6,6 @@ 18500101 FIXED - -atm/cam/inic/se/L93_ne30pg3_ne30pg3_mg17_450_short.cam.i.1979-01-07-00000.nc - atm/waccm/lb/LBC_17500116-20150116_CMIP6_0p5degLat_c180905.nc 1850 diff --git a/bld/namelist_files/use_cases/2000_cam4_trop_chem.xml b/bld/namelist_files/use_cases/2000_cam4_trop_chem.xml index 3d96dd4c48..a47840883e 100644 --- a/bld/namelist_files/use_cases/2000_cam4_trop_chem.xml +++ b/bld/namelist_files/use_cases/2000_cam4_trop_chem.xml @@ -63,7 +63,7 @@ 'C10H16', 'TERPO2', 'TERPOOH', 'TOLUENE', 'CRESOL', 'TOLO2', 'TOLOOH', 'XOH', 'BIGALD', 'GLYOXAL', 'PAN', 'ONIT', 'MPAN', 'ISOPNO3', 'ONITR', 'CB1', 'CB2', 'OC1', 'OC2', 'SOA', 'SO2', 'SO4', 'DMS', 'NH3', 'NH4', 'NH4NO3', 'SSLT01', 'SSLT02', 'SSLT03', 'SSLT04', 'DST01', 'DST02', 'DST03', 'DST04', 'Rn', 'Pb','HCN','CH3CN', - 'SFNO','SFNO2','SFCO','SFBIGALK','SFBIGENE','SFC10H16','SFC2H4','SFC2H5OH','SFC2H6','SFC3H6','SFC3H8', + 'SFNO','SFCO','SFBIGALK','SFBIGENE','SFC10H16','SFC2H4','SFC2H5OH','SFC2H6','SFC3H6','SFC3H8', 'SFCH2O','SFCH3CHO','SFCH3COCH3','SFCH3OH','SFDMS','SFISOP','SFMEK','SFNH3', 'SFCB1','SFCB2','SFOC1','SFOC2','SFSO2','SFTOLUENE','SFHCN','SFCH3CN', 'DV_HCN','DV_CH3CN','WD_HCN','WD_CH3CN','WD_SO2','WD_HNO3','WD_H2O2','WD_CH2O', diff --git a/bld/namelist_files/use_cases/2000_cam6.xml b/bld/namelist_files/use_cases/2000_cam6.xml index fef59dc7d3..05d019beb2 100644 --- a/bld/namelist_files/use_cases/2000_cam6.xml +++ b/bld/namelist_files/use_cases/2000_cam6.xml @@ -63,20 +63,23 @@ 'so4_a1 -> $INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_so4_a1_anthro-ag-ship_surface_2000climo_0.9x1.25_c20170616.nc', 'so4_a1 -> $INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_so4_a1_bb_surface_2000climo_0.9x1.25_c20170322.nc', 'so4_a2 -> $INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_so4_a2_anthro-res_surface_2000climo_0.9x1.25_c20170616.nc', - 'SOAE -> 4.4323D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_BENZENE_anthro_surface_2000climo_0.9x1.25_c20170608.nc', - 'SOAE -> 4.4323D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_BENZENE_bb_surface_2000climo_0.9x1.25_c20170322.nc', - 'SOAE -> 1.2021D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_ISOP_bb_surface_2000climo_0.9x1.25_c20170322.nc', - 'SOAE -> 6.6625D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_MTERP_bb_surface_2000climo_0.9x1.25_c20170322.nc', - 'SOAE -> 9.9042D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_TOLUENE_anthro_surface_2000climo_0.9x1.25_c20170608.nc', - 'SOAE -> 9.9042D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_TOLUENE_bb_surface_2000climo_0.9x1.25_c20170322.nc', - 'SOAE -> 8.3792D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_XYLENES_anthro_surface_2000climo_0.9x1.25_c20170608.nc', - 'SOAE -> 8.3792D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_XYLENES_bb_surface_2000climo_0.9x1.25_c20170322.nc', - 'SOAE -> 8.6865D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_IVOC_anthro_surface_2000climo_0.9x1.25_c20170608.nc', - 'SOAE -> 8.6865D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_IVOC_bb_surface_2000climo_0.9x1.25_c20170322.nc', - 'SOAE -> 16.8188D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_SVOC_anthro_surface_2000climo_0.9x1.25_c20170608.nc', - 'SOAE -> 16.8188D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_SVOC_bb_surface_2000climo_0.9x1.25_c20170322.nc' + 'SOAE -> 2.5592D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_BENZENE_anthro_surface_2000climo_0.9x1.25_c20170608.nc', + 'SOAE -> 2.5592D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_BENZENE_bb_surface_2000climo_0.9x1.25_c20170322.nc', + 'SOAE -> 0.5954D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_ISOP_bb_surface_2000climo_0.9x1.25_c20170322.nc', + 'SOAE -> 5.1004D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_MTERP_bb_surface_2000climo_0.9x1.25_c20170322.nc', + 'SOAE -> 8.2367D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_TOLUENE_anthro_surface_2000climo_0.9x1.25_c20170608.nc', + 'SOAE -> 8.2367D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_TOLUENE_bb_surface_2000climo_0.9x1.25_c20170322.nc', + 'SOAE -> 6.5013D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_XYLENES_anthro_surface_2000climo_0.9x1.25_c20170608.nc', + 'SOAE -> 6.5013D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_XYLENES_bb_surface_2000climo_0.9x1.25_c20170322.nc', + 'SOAE -> 8.5371D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_IVOC_anthro_surface_2000climo_0.9x1.25_c20170608.nc', + 'SOAE -> 8.5371D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_IVOC_bb_surface_2000climo_0.9x1.25_c20170322.nc', + 'SOAE -> 16.650D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_SVOC_anthro_surface_2000climo_0.9x1.25_c20170608.nc', + 'SOAE -> 16.650D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_SVOC_bb_surface_2000climo_0.9x1.25_c20170322.nc' + +2000 + 'atm/waccm/lb/LBC_2000climo_CMIP6_0p5degLat_c180227.nc' 'CO2','CH4','N2O','CFC11eq','CFC12' 'CYCLICAL' diff --git a/bld/namelist_files/use_cases/2000_trop_strat_vbs_cam6.xml b/bld/namelist_files/use_cases/2000_trop_strat_vbs_cam6.xml index d00387437c..2ba0c53847 100644 --- a/bld/namelist_files/use_cases/2000_trop_strat_vbs_cam6.xml +++ b/bld/namelist_files/use_cases/2000_trop_strat_vbs_cam6.xml @@ -128,6 +128,9 @@ 'so4_a2 -> $INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_so4_a2_anthro-res_surface_2000climo_0.9x1.25_c20170616.nc' + +2000 + 'noy', 'nhx' @@ -148,7 +151,7 @@ - 'CFC11STAR', 'AODDUST', 'AODDUST2', 'T', 'U', 'V', 'O3', 'OH', 'NO3', 'HO2', + 'CFC11STAR', 'AODDUST', 'AODDUST02', 'T', 'U', 'V', 'O3', 'OH', 'NO3', 'HO2', 'LNO_COL_PROD', 'NO2_CLXF', 'SFNO', 'SFNH3', 'BRO', 'CH3CL', 'CLO', 'CO2', 'HCL', 'HO2', 'HOCL', 'H2O', 'PHIS', 'Z3', 'BENZENE', 'C2H2', 'C2H4', 'C2H6', 'C3H8', 'CCL4', 'CFC11', 'CFC113', 'CFC12', @@ -180,8 +183,8 @@ 'SAD_SULFC', 'SAD_TROP', 'SAD_AERO', 'REFF_AERO', 'PDELDRY', 'RAD_ICE', 'RAD_LNAT', 'RAD_SULFC', 'H2SO4M_C', 'HNO3_GAS', 'HNO3_STS', 'HNO3_NAT', 'VEL_NAT2', 'NITROP_PD', 'NOX', 'NOY', 'CLOX', 'CLOY', 'BROX', 'BROY', 'TCLY', 'TOTH', 'MASS', 'TBRY', 'HCL_GAS', 'wet_deposition_NHx_as_N', 'wet_deposition_NOy_as_N', - 'HCL_GAS', 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'ABSORB', 'AODVISdn', 'AODdnMODE1', 'AODVISstdn', 'AODNIRstdn', - 'AODUVstdn', 'AODdnMODE2', 'AODdnMODE3', 'AODdnDUST1', 'AODdnDUST2', 'AODdnDUST3', 'AODVISstdn', 'AODUVstdn', 'AODNIRstdn', + 'HCL_GAS', 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'ABSORB', 'AODVISdn', 'AODdn_aitken', 'AODVISstdn', 'AODNIRstdn', + 'AODUVstdn', 'AODdn_accum', 'AODdn_coarse', 'AODdnDUST01', 'AODdnDUST02', 'AODdnDUST03', 'AODVISstdn', 'AODUVstdn', 'AODNIRstdn', 'AODNIRstdn', 'AODVISdn', 'AODUVdn', 'EXTINCTdn', 'EXTxASYMdn', 'EXTINCTNIRdn', 'EXTINCTUVdn', 'WD_ALKNIT', 'WD_ALKOOH', 'WD_BENZOOH', 'WD_BRONO2', 'WD_BZOOH', 'WD_C2H5OH', 'WD_C2H5OOH', 'WD_C3H7OOH', 'WD_C6H5OOH', 'WD_CH2O', 'WD_CH3CHO', 'WD_CH3CN', 'WD_CH3COCHO', 'WD_CH3COOH', 'WD_CH3COOOH', 'WD_CH3COCH3', 'WD_CH3OH', 'WD_CH3OOH', 'WD_CLONO2', 'WD_COF2', 'WD_COFCL', diff --git a/bld/namelist_files/use_cases/2010_cam6.xml b/bld/namelist_files/use_cases/2010_cam6.xml index f0adab0c26..239f5436f6 100644 --- a/bld/namelist_files/use_cases/2010_cam6.xml +++ b/bld/namelist_files/use_cases/2010_cam6.xml @@ -58,20 +58,23 @@ 'so4_a1 -> $INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_so4_a1_anthro-ag-ship_surface_2010climo_0.9x1.25_c20180918.nc', 'so4_a1 -> $INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_so4_a1_bb_surface_2010climo_0.9x1.25_c20180918.nc', 'so4_a2 -> $INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_so4_a2_anthro-res_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 4.4323D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_BENZENE_anthro_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 4.4323D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_BENZENE_bb_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 1.2021D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_ISOP_bb_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 6.6625D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_MTERP_bb_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 9.9042D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_TOLUENE_anthro_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 9.9042D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_TOLUENE_bb_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 8.3792D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_XYLENES_anthro_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 8.3792D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_XYLENES_bb_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 8.6865D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_IVOC_anthro_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 8.6865D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_IVOC_bb_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 16.8188D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_SVOC_anthro_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 16.8188D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_SVOC_bb_surface_2010climo_0.9x1.25_c20180918.nc' + 'SOAE -> 2.5592D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_BENZENE_anthro_surface_2010climo_0.9x1.25_c20180918.nc', + 'SOAE -> 2.5592D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_BENZENE_bb_surface_2010climo_0.9x1.25_c20180918.nc', + 'SOAE -> 0.5954D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_ISOP_bb_surface_2010climo_0.9x1.25_c20180918.nc', + 'SOAE -> 5.1004D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_MTERP_bb_surface_2010climo_0.9x1.25_c20180918.nc', + 'SOAE -> 8.2367D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_TOLUENE_anthro_surface_2010climo_0.9x1.25_c20180918.nc', + 'SOAE -> 8.2367D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_TOLUENE_bb_surface_2010climo_0.9x1.25_c20180918.nc', + 'SOAE -> 6.5013D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_XYLENES_anthro_surface_2010climo_0.9x1.25_c20180918.nc', + 'SOAE -> 6.5013D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_XYLENES_bb_surface_2010climo_0.9x1.25_c20180918.nc', + 'SOAE -> 8.5371D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_IVOC_anthro_surface_2010climo_0.9x1.25_c20180918.nc', + 'SOAE -> 8.5371D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_IVOC_bb_surface_2010climo_0.9x1.25_c20180918.nc', + 'SOAE -> 16.650D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_SVOC_anthro_surface_2010climo_0.9x1.25_c20180918.nc', + 'SOAE -> 16.650D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_SVOC_bb_surface_2010climo_0.9x1.25_c20180918.nc' + +2010 + CYCLICAL 2010 diff --git a/bld/namelist_files/use_cases/2010_trop_strat_vbs_cam6.xml b/bld/namelist_files/use_cases/2010_trop_strat_vbs_cam6.xml index ebc15d2115..1000976390 100644 --- a/bld/namelist_files/use_cases/2010_trop_strat_vbs_cam6.xml +++ b/bld/namelist_files/use_cases/2010_trop_strat_vbs_cam6.xml @@ -319,6 +319,9 @@ 'so4_a2 -> $INPUTDATA_ROOT/atm/cam/chem/emis/ne30pg3/2010climo/emissions-cmip6_so4_a2_anthro-res_surface_mol_2010climo_ne30pg3_c20200224.nc' + +2010 + 'noy', 'nhx' @@ -339,7 +342,7 @@ - 'CFC11STAR', 'AODDUST', 'AODDUST2', 'T', 'U', 'V', 'O3', 'OH', 'NO3', 'HO2', + 'CFC11STAR', 'AODDUST', 'AODDUST02', 'T', 'U', 'V', 'O3', 'OH', 'NO3', 'HO2', 'LNO_COL_PROD', 'NO2_CLXF', 'SFNO', 'SFNH3', 'BRO', 'CH3CL', 'CLO', 'CO2', 'HCL', 'HO2', 'HOCL', 'H2O', 'PHIS', 'Z3', 'BENZENE', 'C2H2', 'C2H4', 'C2H6', 'C3H8', 'CCL4', 'CFC11', 'CFC113', 'CFC12', @@ -371,8 +374,8 @@ 'SAD_SULFC', 'SAD_TROP', 'SAD_AERO', 'REFF_AERO', 'PDELDRY', 'RAD_ICE', 'RAD_LNAT', 'RAD_SULFC', 'H2SO4M_C', 'HNO3_GAS', 'HNO3_STS', 'HNO3_NAT', 'VEL_NAT2', 'NITROP_PD', 'NOX', 'NOY', 'CLOX', 'CLOY', 'BROX', 'BROY', 'TCLY', 'TOTH', 'MASS', 'TBRY', 'HCL_GAS', 'wet_deposition_NHx_as_N', 'wet_deposition_NOy_as_N', - 'HCL_GAS', 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'ABSORB', 'AODVISdn', 'AODdnMODE1', 'AODVISstdn', 'AODNIRstdn', - 'AODUVstdn', 'AODdnMODE2', 'AODdnMODE3', 'AODdnDUST1', 'AODdnDUST2', 'AODdnDUST3', 'AODVISstdn', 'AODUVstdn', 'AODNIRstdn', + 'HCL_GAS', 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'ABSORB', 'AODVISdn', 'AODdn_aitken', 'AODVISstdn', 'AODNIRstdn', + 'AODUVstdn', 'AODdn_accum', 'AODdn_coarse', 'AODdnDUST01', 'AODdnDUST02', 'AODdnDUST03', 'AODVISstdn', 'AODUVstdn', 'AODNIRstdn', 'AODNIRstdn', 'AODVISdn', 'AODUVdn', 'EXTINCTdn', 'EXTxASYMdn', 'EXTINCTNIRdn', 'EXTINCTUVdn', 'WD_ALKNIT', 'WD_ALKOOH', 'WD_BENZOOH', 'WD_BRONO2', 'WD_BZOOH', 'WD_C2H5OH', 'WD_C2H5OOH', 'WD_C3H7OOH', 'WD_C6H5OOH', 'WD_CH2O', 'WD_CH3CHO', 'WD_CH3CN', 'WD_CH3COCHO', 'WD_CH3COOH', 'WD_CH3COOOH', 'WD_CH3COCH3', 'WD_CH3OH', 'WD_CH3OOH', 'WD_CLONO2', 'WD_COF2', 'WD_COFCL', diff --git a/bld/namelist_files/use_cases/dctest_frierson.xml b/bld/namelist_files/use_cases/dctest_frierson.xml new file mode 100644 index 0000000000..340052bc84 --- /dev/null +++ b/bld/namelist_files/use_cases/dctest_frierson.xml @@ -0,0 +1,31 @@ + + + + + +0. +0. +0. +fixed_parameters + + +.false. + + +.true. +-720 +'A' + + + 'U:A','T:A','V:A','Q:A','Z3:A','PRECL:A','PRECC:A','PS:A','SST:A','TS:A', 'gray_DTCOND', 'gray_DQCOND', 'gray_EVAPDT', 'gray_EVAPDQ', 'gray_PRECL' , 'gray_PRECC' , 'gray_Tsurf' , 'gray_Qsurf' , 'gray_Cdrag' , 'gray_Zpbl' , 'gray_KVH' , 'gray_KVM' , 'gray_VSE' , 'gray_Zm' , 'gray_Rf' , 'gray_DTV' , 'gray_DUV' , 'gray_DVV' , 'gray_VD01' , 'gray_SHflux', 'gray_LHflux', 'gray_TauU' , 'gray_TauV' , 'gray_QRL' , 'gray_QRS' , 'gray_SWflux', 'gray_LUflux', 'gray_LDflux', 'gray_LWflux', 'gray_LUflux_TOA', 'gray_LDflux_TOA', 'gray_LWflux_TOA' + + +'moist_baroclinic_wave_dcmip2016' + +atm/cam/inic/fv/FGRAYRAD_f19.cam.i.0051-01-01-00000_c20230510.nc + + + 'TT_SLOT','TT_GBALL','TT_TANH','TT_EM8','TT_Y2_2','TT_Y32_16' + + + diff --git a/bld/namelist_files/use_cases/hist_cam_lt.xml b/bld/namelist_files/use_cases/hist_cam_lt.xml index 577610275c..81834955c3 100644 --- a/bld/namelist_files/use_cases/hist_cam_lt.xml +++ b/bld/namelist_files/use_cases/hist_cam_lt.xml @@ -6,9 +6,6 @@ atm/cam/solar/SolarForcingCMIP6_18491230-23000102_c20200615.nc - -atm/cam/inic/se/FWsc_ne30pg3_58L_GRID_48_taperstart10km_lowtop_BL10_v3_beta1p75_Top_43km.nc - atm/waccm/lb/LBC_17500116-20150116_CMIP6_0p5degLat_c180905.nc 'SERIAL' diff --git a/bld/namelist_files/use_cases/hist_cam_mt.xml b/bld/namelist_files/use_cases/hist_cam_mt.xml index 08c53aa595..c100cc6e85 100644 --- a/bld/namelist_files/use_cases/hist_cam_mt.xml +++ b/bld/namelist_files/use_cases/hist_cam_mt.xml @@ -6,9 +6,6 @@ atm/cam/solar/SolarForcingCMIP6_18491230-23000102_c20200615.nc - -atm/cam/inic/se/L93_ne30pg3_ne30pg3_mg17_450_short.cam.i.1979-01-07-00000.nc - atm/waccm/lb/LBC_17500116-20150116_CMIP6_0p5degLat_c180905.nc 'SERIAL' diff --git a/bld/namelist_files/use_cases/hist_trop_strat_nudged_cam6.xml b/bld/namelist_files/use_cases/hist_trop_strat_nudged_cam6.xml index 2875336285..ff2a92b3ef 100644 --- a/bld/namelist_files/use_cases/hist_trop_strat_nudged_cam6.xml +++ b/bld/namelist_files/use_cases/hist_trop_strat_nudged_cam6.xml @@ -16,16 +16,116 @@ .false. 0.25D0 + SERIAL -atm/waccm/lb/LBC_1750-2014_CMIP6_0p5degLat_c170126.nc +atm/waccm/lb/LBC_17500116-25001216_CMIP6_SSP585_0p5degLat_c20200824.nc SERIAL +2.70D0 + 0.38D0 + 'SERIAL' + INTERP_MISSING_MONTHS + + 'bc_a4 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_bc_a4_aircraft_vertical_mol_175001-210101_0.9x1.25_c20190224.nc', + 'NO2 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_NO2_aircraft_vertical_mol_175001-210101_0.9x1.25_c20190224.nc', + 'num_a1 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_num_so4_a1_anthro-ene_vertical_mol_175001-210101_0.9x1.25_c20190224.nc', + 'num_a1 -> $INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_num_a1_so4_contvolcano_vertical_850-5000_0.9x1.25_c20170724.nc', + 'num_a2 -> $INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_num_a2_so4_contvolcano_vertical_850-5000_0.9x1.25_c20170724.nc', + 'num_a4 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_num_bc_a4_aircraft_vertical_mol_175001-210101_0.9x1.25_c20190224.nc', + 'SO2 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_SO2_aircraft_vertical_mol_175001-210101_0.9x1.25_c20190224.nc', + 'SO2 -> $INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_SO2_contvolcano_vertical_850-5000_0.9x1.25_c20170724.nc', + 'SO2 -> $INPUTDATA_ROOT/atm/cam/chem/stratvolc/VolcanEESMv3.10_piControl_SO2_1850-2014average_ext_1deg_ZeroTrop_c181020.nc', + 'so4_a1 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_so4_a1_anthro-ene_vertical_mol_175001-210101_0.9x1.25_c20190224.nc', + 'so4_a1 -> $INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_so4_a1_contvolcano_vertical_850-5000_0.9x1.25_c20170724.nc', + 'so4_a2 -> $INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_so4_a2_contvolcano_vertical_850-5000_0.9x1.25_c20170724.nc' + INTERP_MISSING_MONTHS + + 'BENZENE -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_BENZENE_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'BENZENE -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_BENZENE_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'BIGALK -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_BIGALK_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'BIGALK -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_BIGALK_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'BIGENE -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_BIGENE_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'BIGENE -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_BIGENE_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'C2H2 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_C2H2_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'C2H2 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_C2H2_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'C2H4 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_C2H4_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'C2H4 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-SSP_C2H4_other_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'C2H5OH -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_C2H5OH_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'C2H5OH -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_C2H5OH_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'C2H6 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_C2H6_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'C2H6 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_C2H6_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'C2H6 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-SSP_C2H6_other_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'C3H6 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_C3H6_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'C3H6 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_C3H6_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'C3H6 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-SSP_C3H6_other_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'C3H8 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_C3H8_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'C3H8 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_C3H8_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'C3H8 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-SSP_C3H8_other_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'CH2O -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_CH2O_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'CH2O -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_CH2O_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'CH3CHO -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_CH3CHO_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'CH3CHO -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_CH3CHO_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'CH3CN -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_CH3CN_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'CH3CN -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_CH3CN_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'CH3COCH3 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_CH3COCH3_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'CH3COCH3 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_CH3COCH3_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'CH3COCHO -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_CH3COCHO_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'CH3COOH -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_CH3COOH_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'CH3COOH -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_CH3COOH_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'CH3OH -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_CH3OH_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'CH3OH -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_CH3OH_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'CO -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_CO_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'CO -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_CO_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'CO -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-SSP_CO_other_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'E90 -> $INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions_E90global_surface_175001-210101_0.9x1.25_c20190224.nc', + 'GLYALD -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_GLYALD_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'HCN -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_HCN_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'HCN -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_HCN_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'HCOOH -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_HCOOH_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'HCOOH -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_HCOOH_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'ISOP -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_ISOP_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'IVOC -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_IVOC_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'IVOC -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_IVOC_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'MEK -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_MEK_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'MEK -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_MEK_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'MTERP -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_MTERP_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'NH3 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_NH3_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'NH3 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_NH3_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'NH3 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-SSP_NH3_other_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'NO -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_NO_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'NO -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_NO_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'NO -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-SSP_NO_other_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'SVOC -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_SVOC_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'SVOC -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_SVOC_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'TOLUENE -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_TOLUENE_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'TOLUENE -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_TOLUENE_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'XYLENES -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_XYLENES_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'XYLENES -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_XYLENES_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'bc_a4 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_bc_a4_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'bc_a4 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_bc_a4_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'DMS -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_DMS_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'num_a1 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_num_so4_a1_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'num_a1 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_num_so4_a1_anthro-ag-ship_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'num_a2 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_num_so4_a2_anthro-res_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'num_a4 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_num_bc_a4_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'num_a4 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_num_bc_a4_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'num_a4 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_num_pom_a4_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'num_a4 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_num_pom_a4_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'pom_a4 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_pom_a4_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'pom_a4 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_pom_a4_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'SO2 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_SO2_anthro-ag-ship-res_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'SO2 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_SO2_anthro-ene_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'SO2 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_SO2_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'so4_a1 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_so4_a1_anthro-ag-ship_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'so4_a1 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_so4_a1_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'so4_a2 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_so4_a2_anthro-res_surface_mol_175001-210101_0.9x1.25_c20190224.nc' + 'noy', 'nhx' @@ -87,14 +187,14 @@ 0, -24 'A', 'A' - 1, 1 - 0, 0 -'A', 'A' + 1, 1 + 0, 0 +'A', 'A' .true. .false. .false. -.false. +.true. .false. .false. .false. @@ -102,236 +202,51 @@ .false. - - 'CFC11STAR', 'AODDUST', 'AODDUST2', 'T', 'U', 'V', 'O3', 'OH', 'NO3', 'HO2', - 'LNO_COL_PROD', 'NO2_CLXF', 'SFNO', 'SFNH3', 'BRO', - 'CH3CL', 'CLO', 'CO2', 'HCL', 'HO2', 'HOCL', 'H2O', 'PHIS', 'Z3', - 'BENZENE', 'C2H2', 'C2H4', 'C2H6', 'C3H8', 'CCL4', 'CFC11', 'CFC113', 'CFC12', - 'CH2O', 'CH3BR', 'CH3CCL3', 'CH3CHO', 'CH3CL', 'CH3CN', 'CH3COCH3', 'CH3OH', 'CH4', - 'CO', 'H2O2', 'HCFC22', 'HCN', 'HNO3', 'ISOP', 'MTERP', 'N2O', 'O3', 'O3S', - 'PAN', 'SO2', 'TOLUENE', 'OH', 'ALKNIT', 'ALKOOH', 'BCARY', 'BENZENE', 'BENZOOH', - 'BEPOMUC', 'BIGALD', 'BIGALD1', 'BIGALD2', 'BIGALD3', 'BIGALD4', 'BIGALK', 'BIGENE', 'BR', - 'BRCL', 'BRO', 'BRONO2', 'BRY', 'BZALD', 'BZOOH', 'C2H2', 'C2H4', 'C2H5OH', - 'C2H5OOH', 'C2H6', 'C3H6', 'C3H7OOH', 'C3H8', 'C6H5OOH', 'CCL4', 'CF2CLBR', 'CF3BR', - 'CFC11', 'CFC113', 'CFC114', 'CFC115', 'CFC12', 'CH2BR2', 'CH2O', 'CH3BR', 'CH3CCL3', - 'CH3CHO', 'CH3CL', 'CH3CN', 'CH3COCH3', 'CH3COCHO', 'CH3COOH', 'CH3COOOH', 'CH3OH', 'CH3OOH', - 'CH4', 'CHBR3', 'CL', 'CL2', 'CL2O2', 'CLO', 'CLONO2', 'CLY', 'CO', - 'CO2', 'COF2', 'COFCL', 'CRESOL', 'DMS', 'EOOH', 'F', 'GLYALD', 'GLYOXAL', - 'H', 'H2', 'H2402', 'H2O2', 'H2SO4', 'HBR', 'HCFC141B', 'HCFC142B', 'HCFC22', - 'HCL', 'HCN', 'HCOOH', 'HF', 'HNO3', 'HO2NO2', 'HOBR', 'HOCL', 'HONITR', - 'HPALD', 'HYAC', 'HYDRALD', 'IEPOX', 'ISOP', 'ISOPNITA', 'ISOPNITB', 'ISOPNO3', 'ISOPNOOH', - 'ISOPOOH', 'IVOC', 'MACR', 'MACROOH', 'MEK', 'MEKOOH', 'MPAN', 'MTERP', 'MVK', - 'N', 'N2O', 'N2O5', 'NC4CH2OH', 'NC4CHO', 'NH3', 'NH4', 'NO', - 'NO2', 'NO3', 'NOA', 'NTERPOOH', 'O', 'OCLO', - 'OCS', 'ONITR', 'PAN', 'PBZNIT', 'PHENO', 'PHENOL', 'PHENOOH', 'POOH', 'ROOH', - 'S', 'SF6', 'SO', 'SO2', 'SO3', 'SOAG0', 'SOAG1', 'SOAG2', 'SOAG3', - 'SOAG4', 'SVOC', 'TEPOMUC', 'TERP2OOH', 'TERPNIT', 'TERPOOH', 'TERPROD1', 'TERPROD2', 'TOLOOH', - 'TOLUENE', 'XOOH', 'XYLENES', 'XYLENOOH', 'XYLOL', 'XYLOLOOH', 'NHDEP', 'NDEP', 'ACBZO2', - 'ALKO2', 'BENZO2', 'BZOO', 'C2H5O2', 'C3H7O2', 'C6H5O2', 'CH3CO3', 'CH3O2', 'DICARBO2', - 'ENEO2', 'EO', 'EO2', 'HO2', 'HOCH2OO', 'ISOPAO2', 'ISOPBO2', 'MACRO2', - 'MALO2', 'MCO3', 'MDIALO2', 'MEKO2', 'NTERPO2', - 'O1D', 'OH', 'PHENO2', 'PO2', 'RO2', - 'TERP2O2', 'TERPO2', 'TOLO2', 'XO2', 'XYLENO2', 'XYLOLO2', 'H2O', 'SAD_ICE', 'SAD_LNAT', - 'SAD_SULFC', 'SAD_TROP', 'SAD_AERO', 'REFF_AERO', 'PDELDRY', 'RAD_ICE', 'RAD_LNAT', 'RAD_SULFC', 'H2SO4M_C', - 'HNO3_GAS', 'HNO3_STS', 'HNO3_NAT', 'VEL_NAT2', 'NITROP_PD', 'NOX', 'NOY', 'CLOX', 'CLOY', - 'BROX', 'BROY', 'TCLY', 'TOTH', 'MASS', 'TBRY', 'HCL_GAS', 'wet_deposition_NHx_as_N', 'wet_deposition_NOy_as_N', - 'HCL_GAS', 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'ABSORB', 'AODVISdn', 'AODdnMODE1', 'AODVISstdn', 'AODNIRstdn', - 'AODUVstdn', 'AODdnMODE2', 'AODdnMODE3', 'AODdnDUST1', 'AODdnDUST2', 'AODdnDUST3', 'AODVISstdn', 'AODUVstdn', 'AODNIRstdn', - 'AODNIRstdn', 'AODVISdn', 'AODUVdn', 'EXTINCTdn', 'EXTxASYMdn', 'EXTINCTNIRdn', 'EXTINCTUVdn', 'WD_ALKNIT', 'WD_ALKOOH', - 'WD_BENZOOH', 'WD_BRONO2', 'WD_BZOOH', 'WD_C2H5OH', 'WD_C2H5OOH', 'WD_C3H7OOH', 'WD_C6H5OOH', 'WD_CH2O', 'WD_CH3CHO', - 'WD_CH3CN', 'WD_CH3COCHO', 'WD_CH3COOH', 'WD_CH3COOOH', 'WD_CH3COCH3', 'WD_CH3OH', 'WD_CH3OOH', 'WD_CLONO2', 'WD_COF2', 'WD_COFCL', - 'WD_EOOH', 'WD_GLYALD', 'WD_H2O2', 'WD_H2SO4', 'WD_HBR', 'WD_HCL', 'WD_HCN', 'WD_HCOOH', 'WD_HF', - 'WD_HNO3', 'WD_HO2NO2', 'WD_HOBR', 'WD_HOCL', 'WD_HONITR', 'WD_HPALD', 'WD_HYAC', 'WD_HYDRALD', 'WD_IEPOX', - 'WD_ISOPNITA', 'WD_ISOPNITB', 'WD_ISOPNO3', 'WD_ISOPNOOH', 'WD_ISOPOOH', 'WD_IVOC', 'WD_MACR', 'WD_MACROOH', 'WD_MEKOOH', - 'WD_MVK', 'WD_NC4CH2OH', 'WD_NC4CHO', 'WD_NDEP', 'WD_NH3', 'WD_NH4', 'WD_NHDEP', 'WD_NOA', - 'WD_NTERPOOH', 'WD_ONITR', 'WD_PHENOOH', 'WD_POOH', 'WD_ROOH', 'WD_SO2', 'WD_SOAG0', 'WD_SOAG1', 'WD_SOAG2', - 'WD_SOAG3', 'WD_SOAG4', 'WD_SVOC', 'WD_TERP2OOH', 'WD_TERPNIT', 'WD_TERPOOH', 'WD_TERPROD1', 'WD_TERPROD2', 'WD_TOLOOH', - 'WD_XOOH', 'WD_XYLENOOH', 'WD_XYLOLOOH', 'DF_ALKNIT', 'DF_ALKOOH', 'DF_BENZOOH', 'DF_BZOOH', 'DF_C2H5OH', 'DF_C2H5OOH', - 'DF_C3H7OOH', 'DF_C6H5OOH', 'DF_CH2O', 'DF_CH3CHO', 'DF_CH3CN', 'DF_CH3COCH3', 'DF_CH3COCHO', 'DF_CH3COOH', 'DF_CH3COOOH', - 'DF_CH3OH', 'DF_CH3OOH', 'DF_CO', 'DF_EOOH', 'DF_GLYALD', 'DF_H2O2', 'DF_H2SO4', 'DF_HCN', 'DF_HCOOH', - 'DF_HNO3', 'DF_HO2NO2', 'DF_HONITR', 'DF_HPALD', 'DF_HYAC', 'DF_HYDRALD', 'DF_IEPOX', 'DF_ISOPNITA', 'DF_ISOPNITB', - 'DF_ISOPNO3', 'DF_ISOPNOOH', 'DF_ISOPOOH', 'DF_IVOC', 'DF_MACROOH', 'DF_MEKOOH', 'DF_MPAN', 'DF_NC4CH2OH', 'DF_NC4CHO', - 'dry_deposition_NHx_as_N', 'DF_NH3', 'DF_NH4', 'DF_NO', 'DF_NO2', 'DF_NOA', 'DF_NTERPOOH', 'DF_O3', 'DF_ONITR', - 'DF_PAN', 'DF_PHENOOH', 'DF_POOH', 'DF_ROOH', 'DF_SO2', 'DF_SOAG0', 'DF_SOAG1', 'DF_SOAG2', 'DF_SOAG3', - 'DF_SOAG4', 'DF_SVOC', 'DF_TERP2OOH', 'DF_TERPNIT', 'DF_TERPOOH', 'DF_TERPROD1', 'DF_TERPROD2', 'DF_TOLOOH', 'DF_XOOH', - 'DF_XYLENOOH', 'DF_XYLOLOOH', 'dry_deposition_NOy_as_N', 'SO2_CLXF', 'SO2_XFRC', 'SVOC_CLXF', 'CO_CLXF', 'NO2_CLXF', 'LNO_PROD', - 'LNO_COL_PROD', 'SFISOP', 'SFMTERP', 'SFBCARY', 'SFCH3OH', 'SFC2H5OH', 'SFCH3CHO', 'SFMEK', 'SFHCN', - 'SFCH3CN', 'SFCH2O', 'SFC2H6', 'SFC3H8', 'SFC2H4', 'SFC3H6', 'SFCH3COCH3', 'SFBIGALK', 'SFBIGENE', - 'SFBENZENE', 'SFTOLUENE', 'SFXYLENES', 'SFCO', 'SFNO', 'SFC2H2', 'SFHCOOH', 'SFCH3COOH', 'SFCH3COCH3', - 'SFDMS', 'SFMEK', 'SFSO2', 'SFNH3', 'SFIVOC', 'SFSVOC', 'MEG_ISOP', 'MEG_MTERP', 'MEG_BCARY', - 'MEG_CH3OH', 'MEG_C2H5OH', 'MEG_CH2O', 'MEG_CH3CHO', 'MEG_CH3COOH', 'MEG_CH3COCH3', 'MEG_HCOOH', 'MEG_HCN', 'MEG_CO', - 'MEG_C2H6', 'MEG_C2H4', 'MEG_C3H8', 'MEG_C3H6', 'MEG_BIGALK', 'MEG_BIGENE', 'MEG_TOLUENE', 'Dso4_a1CHM', 'Dso4_a2CHM', - 'Dso4_a3CHM', 'DO3CHM', 'DCOCHM', 'DHNO3CHM', 'DH2O2CHM', 'CH4_CHML', 'CO_CHMP', 'CO_CHML', 'CH3CCL3_CHML', - 'CO2_CHML', 'AQ_SO2', 'GS_SO2', 'SO2_CHML', 'SO2_CHMP', 'SO2_CLXF', 'SOAG0_CHMP', 'SOAG1_CHMP', 'SOAG2_CHMP', - 'SOAG3_CHMP', 'SOAG4_CHMP', 'IVOC_CHMP', 'SVOC_CHML', 'MASS', 'ABSORB', 'WD_H2SO4', 'WD_IVOC', 'WD_SO2', - 'WD_SOAG0', 'WD_SOAG1', 'WD_SOAG2', 'WD_SOAG3', 'WD_SOAG4', 'WD_SVOC', 'DF_CO', 'DF_IVOC', 'DF_O3', - 'DF_SO2', 'DF_SOAG0', 'DF_SOAG1', 'DF_SOAG2', 'DF_SOAG3', 'DF_SOAG4', 'DF_SVOC', 'SO2_CLXF', 'SVOC_CLXF', - 'SFISOP', 'SFMTERP', 'SFCH3OH', 'SFCH3COCH3', 'SFCO', 'SFIVOC', 'SFSVOC', 'DO3CHM', 'DCOCHM', - 'O3_CHMP', 'O3_CHML', 'CH4_CHML', 'CO_CHMP', 'CO_CHML', 'CH3CCL3_CHML', 'SO2_CHML', 'SO2_CHMP', 'SO2_CLXF', - 'SOAG0_CHMP', 'SOAG1_CHMP', 'SOAG2_CHMP', 'SOAG3_CHMP', 'SOAG4_CHMP', - 'r_HO2_O3', 'r_OH_O3', 'r_OH_O', 'r_O1D_H2O', 'r_het1', 'r_het2', 'r_het3', 'r_het4', 'r_het5', 'r_het6', - 'jo3_a', 'jno2', 'jpan', 'jh2o2', 'jcl2o2', 'bc_a1', 'bc_a4', 'dst_a1', 'dst_a2', - 'dst_a3', 'ncl_a1', 'ncl_a1', 'ncl_a2', 'ncl_a3', 'pom_a1', 'pom_a4', 'so4_a1', 'so4_a2', - 'so4_a3', 'soa1_a1', 'soa2_a1', 'soa3_a1', 'soa4_a1', 'soa5_a1', 'soa1_a2', 'soa2_a2', 'soa3_a2', - 'soa4_a2', 'soa5_a2', 'bc_c1', 'bc_c4', 'dst_c1', 'dst_c2', 'dst_c3', 'ncl_c1', 'ncl_c1', - 'ncl_c2', 'ncl_c3', 'pom_c1', 'pom_c4', 'so4_c1', 'so4_c2', 'so4_c3', 'soa1_c1', 'soa2_c1', - 'soa3_c1', 'soa4_c1', 'soa5_c1', 'soa1_c2', 'soa2_c2', 'soa3_c2', 'soa4_c2', 'soa5_c2', - 'num_a1','num_a2','num_a3','num_a4','num_c1','num_c2','num_c3','num_c4', - 'bc_a1SFWET', 'bc_a4SFWET', 'dst_a1SFWET', 'dst_a2SFWET', 'dst_a3SFWET', 'ncl_a1SFWET', 'ncl_a2SFWET', 'ncl_a3SFWET', 'pom_a1SFWET', 'pom_a4SFWET', - 'so4_a1SFWET', 'so4_a2SFWET', 'so4_a3SFWET', 'soa1_a1SFWET', 'soa1_a2SFWET', 'soa2_a1SFWET', 'soa2_a2SFWET', 'soa3_a1SFWET', 'soa3_a2SFWET', - 'soa4_a1SFWET', 'soa4_a2SFWET', 'soa5_a1SFWET', 'soa5_a2SFWET', 'bc_c1SFWET', 'bc_c4SFWET', 'dst_c1SFWET', 'dst_c2SFWET', 'dst_c3SFWET', - 'ncl_c1SFWET', 'ncl_c2SFWET', 'ncl_c3SFWET', 'pom_c1SFWET', 'pom_c4SFWET', 'so4_c1SFWET', 'so4_c2SFWET', 'so4_c3SFWET', 'soa1_c1SFWET', - 'soa1_c2SFWET', 'soa2_c1SFWET', 'soa2_c2SFWET', 'soa3_c1SFWET', 'soa3_c2SFWET', 'soa4_c1SFWET', 'soa4_c2SFWET', 'soa5_c1SFWET', 'soa5_c2SFWET', - 'bc_a1DDF', 'bc_a4DDF', 'dst_a1DDF', 'dst_a2DDF', 'dst_a3DDF', 'ncl_a1DDF', 'ncl_a2DDF', 'ncl_a3DDF', 'pom_a1DDF', - 'pom_a4DDF', 'so4_a1DDF', 'so4_a2DDF', 'so4_a3DDF', 'soa1_a1DDF', 'soa1_a2DDF', 'soa2_a1DDF', 'soa2_a2DDF', 'soa3_a1DDF', - 'soa3_a2DDF', 'soa4_a1DDF', 'soa4_a2DDF', 'soa5_a1DDF', 'soa5_a2DDF', 'bc_c1DDF', 'bc_c4DDF', 'dst_c1DDF', 'dst_c2DDF', - 'dst_c3DDF', 'ncl_c1DDF', 'ncl_c2DDF', 'ncl_c3DDF', 'pom_c1DDF', 'pom_c4DDF', 'so4_c1DDF', 'so4_c2DDF', 'so4_c3DDF', - 'soa1_c1DDF', 'soa1_c2DDF', 'soa2_c1DDF', 'soa2_c2DDF', 'soa3_c1DDF', 'soa3_c2DDF', 'soa4_c1DDF', 'soa4_c2DDF', 'soa5_c1DDF', - 'soa5_c2DDF', 'num_a1DDF', 'num_a2DDF', 'num_a3DDF', 'num_a4DDF', 'num_c1DDF', 'num_c2DDF', 'num_c3DDF', 'num_c4DDF', - 'bc_a4_CLXF', 'pom_a4_CLXF', 'so4_a1_CLXF', 'so4_a2_CLXF', 'num_a1_CLXF', 'num_a2_CLXF', 'SFbc_a4', 'SFpom_a4', 'SFso4_a1', - 'SFso4_a2', 'SFnum_a1', 'SFnum_a2', 'SFnum_a3', 'so4_a1_sfgaex1', 'so4_a2_sfgaex1', 'so4_a3_sfgaex1', 'soa1_a1_sfgaex1', 'soa1_a2_sfgaex1', - 'soa2_a1_sfgaex1', 'soa2_a2_sfgaex1', 'soa3_a1_sfgaex1', 'soa3_a2_sfgaex1', 'soa4_a1_sfgaex1', 'soa4_a2_sfgaex1', 'soa5_a1_sfgaex1', 'soa5_a2_sfgaex1', 'so4_a2_sfnnuc1', - 'so4_c1AQH2SO4', 'so4_c2AQH2SO4', 'so4_c3AQH2SO4', 'so4_c1AQSO4', 'so4_c2AQSO4', 'so4_c3AQSO4', 'SFdst_a1', 'SFdst_a2', 'SFdst_a3', - 'SFncl_a1', 'SFncl_a2', 'SFncl_a3', 'soa1_a1_CHML', 'soa2_a1_CHML', 'soa3_a1_CHML', 'soa4_a1_CHML', 'soa5_a1_CHML', 'soa1_a2_CHML', - 'soa2_a2_CHML', 'soa3_a2_CHML', 'soa4_a2_CHML', 'soa5_a2_CHML', 'so4_a1_CHMP', 'so4_a2_CHMP', 'so4_a3_CHMP', 'soa1_a1_CHMP', 'soa2_a1_CHMP', - 'soa3_a1_CHMP', 'soa4_a1_CHMP', 'soa5_a1_CHMP', 'soa1_a2_CHMP', 'soa2_a2_CHMP', 'soa3_a2_CHMP', 'soa4_a2_CHMP', 'soa5_a2_CHMP', 'r_jsoa1_a1', - 'r_jsoa2_a1', 'r_jsoa3_a1', 'r_jsoa4_a1', 'r_jsoa5_a1', 'r_jsoa1_a2', 'r_jsoa2_a2', 'r_jsoa3_a2', 'r_jsoa4_a2', 'r_jsoa5_a2', - 'r_GLYOXAL_aer', 'H2SO4_sfnnuc1', 'num_a2_sfnnuc1', 'TMOCS', 'TMSO2', 'TMDMS', 'TMso4_a1', 'TMso4_a2', 'TMso4_a3', - 'BURDENDUSTdn', 'BURDENPOMdn', 'BURDENSO4dn', 'BURDENSOAdn', 'BURDENSEASALTdn','BURDENBCdn', 'PM25', - 'O3_Prod','O3_Loss','O3S_Loss','RO2_NO_sum','O3_alkenes','RO2_NO3_sum','RO2_HO2_sum','RO2_RO2_sum','RCO2_NO2_sum', - 'OddOx_Ox_Loss','OddOx_HOx_Loss','OddOx_NOx_Loss','OddOx_CLOxBROx_Loss','OddOx_Loss_Tot','OddOx_Prod_Tot', - 'Ox_Prod','Ox_Loss' + + 'ACTREL', 'AQ_SO2', 'AREA', 'BROX', 'BROY', 'BRY', 'CLOX', 'CLOY', 'CLY', 'NOX', 'NOY', 'TBRY', 'TCLY', 'CFC11STAR', + 'BTTGWSPEC', 'BTTGWSDF', 'BTTGWSKE', 'CONCLD', 'CME', 'CMFDQ', 'CMFMC', 'CMFMC_DP', + 'CH3CCL3_CHML', 'CH4_CHML', 'CO2_CHML', 'CO_CHML', 'IVOC_CHML', 'N2O_CHML', 'O3_CHML', 'SO2_CHML', + 'CO_CHMP', 'O3_CHMP', 'SO2_CHMP', 'TMDMS', 'TMOCS', 'TMSO2','TMso4_a1', 'TMso4_a2', 'TMso4_a3', + 'soa1_a1_CHML', 'soa1_a2_CHML', 'soa2_a1_CHML', 'soa2_a2_CHML', 'soa3_a1_CHML', 'soa3_a2_CHML', + 'soa4_a1_CHML', 'soa4_a2_CHML', 'soa5_a1_CHML', 'soa5_a2_CHML', 'SVOC_CHML', + 'so4_a1_CHMP','so4_a2_CHMP', 'SOAG0_CHMP', 'SOAG1_CHMP', 'SOAG2_CHMP', 'SOAG3_CHMP', 'SOAG4_CHMP', 'TOTH', 'TOT_CLD_VISTAU', + 'TREFHTMN', 'TREFHTMX', 'TROP_P', 'TROP_T', 'TROP_Z', 'TTEND_TOT', 'TTGWORO', 'TTGWSDF', 'TTGWSDFORO', 'TTGWSKE', 'TTGWSKEORO', + 'BURDENBCdn', 'BURDENDUSTdn', 'BURDENPOMdn', 'BURDENSEASALTdn', 'BURDENSO4dn', 'BURDENSOAdn', + 'ABSORB', 'AODABSdn', 'AODBCdn', 'AODdnDUST01', 'AODdnDUST02', 'AODdnDUST03', 'AODdn_aitken', 'AODdn_accum', 'AODdn_coarse', + 'AODDUST02', 'AODDUST', 'AODNIRstdn', 'AODPOMdn', 'AODSO4dn', 'AODSOAdn', 'AODSSdn', 'AODUVdn', 'AODUVstdn', 'AODVIS', + 'AODVISdn', 'AODVISstdn', 'EXTINCTdn', 'EXTINCTNIRdn', 'EXTINCTUVdn', 'EXTxASYMdn', 'FLDSC', 'FLNR', 'FSNR', + 'CME', 'CMFDQ', 'CMFMC','CMFMC_DP', 'SOLLD', 'SOLSD', 'SSAVIS', 'SST','TAQ', + 'DCOCHM','DH2O2CHM', 'DHNO3CHM', 'DO3CHM', 'Dso4_a1CHM', 'Dso4_a2CHM', 'Dso4_a3CHM', + 'FLASHFRQ', 'LNO_COL_PROD', 'LNO_PROD','KVH_CLUBB','MASS', 'PDELDRY', 'NITROP_PD','PM25', 'PRECT', 'PTEQ', 'PTTEND', + 'QRLC', 'QRSC', 'QSNOW', 'QRAIN','GS_SO2', 'HNO3_GAS', 'HNO3_NAT', 'HNO3_STS','H2SO4M_C', 'H2SO4_sfnnuc1','HCL_GAS', + 'SAD_AERO', 'SAD_ICE', 'SAD_LNAT', 'SAD_SULFC', 'SAD_TROP' 'RAD_ICE', 'RAD_LNAT', 'RAD_SULFC', 'REFF_AERO', 'RHREFHT', + 'EVAPPREC', 'EVAPQZM', 'EVAPTZM', 'FCTL','FREQZM', 'ZMDQ', 'ZMDT', 'ZMMTT', 'ZMMU','VEL_NAT2', + 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'bc_c1DDF', 'bc_c4DDF', 'dst_c1DDF', 'dst_c2DDF', 'dst_c3DDF', + 'ncl_c1DDF', 'ncl_c2DDF', 'ncl_c3DDF', 'pom_c1DDF', 'pom_c4DDF', 'num_c1DDF','num_c2DDF','num_c3DDF','num_c4DDF', + 'so4_a1_sfgaex1', 'so4_c1AQH2SO4', 'so4_c1AQSO4', 'so4_c1DDF', 'so4_a2_sfgaex1', 'so4_c2AQH2SO4', 'so4_c2AQSO4', 'so4_c2DDF', + 'so4_a3_sfgaex1', 'so4_c3AQH2SO4', 'so4_c3AQSO4', 'so4_c3DDF', 'so4_a2_sfnnuc1', 'num_a2_sfnnuc1', + 'soa1_a1_sfgaex1','soa1_c1DDF', 'soa1_a2_sfgaex1','soa1_c2DDF', 'soa2_a1_sfgaex1','soa2_c1DDF', 'soa2_a2_sfgaex1','soa2_c2DDF', + 'soa3_a1_sfgaex1','soa3_c1DDF', 'soa3_a2_sfgaex1','soa3_c2DDF', 'soa4_a1_sfgaex1','soa4_c1DDF', 'soa4_a2_sfgaex1','soa4_c2DDF', + 'soa5_a1_sfgaex1','soa5_c1DDF', 'soa5_a2_sfgaex1','soa5_c2DDF', 'jcl2o2', 'jh2o2', 'jno2', 'jo2_a', 'jo2_b', 'jo3_a', 'jo3_b', 'jpan', + 'r_het1', 'r_het2', 'r_het3', 'r_het4', 'r_het5', 'r_het6', 'r_het7', 'r_het8', 'r_het9', 'r_het10', 'r_het11', 'r_het12', 'r_het13', + 'r_het15', 'r_het16', 'r_het17', 'r_jsoa1_a1', 'r_jsoa1_a2', 'r_jsoa2_a1', 'r_jsoa2_a2', 'r_jsoa3_a1', 'r_jsoa3_a2', 'r_jsoa4_a1', + 'r_jsoa4_a2', 'r_jsoa5_a1', 'r_jsoa5_a2', 'r_GLYOXAL_aer', 'r_HO2_O3', 'r_N2O5_aer', 'r_NO2_aer', 'r_NO3_aer', 'r_O1D_H2O', 'r_OH_O3', 'r_OH_O', + 'O3_Prod','O3_Loss','O3S_Loss','RO2_NO_sum','O3_alkenes','RO2_NO3_sum','RO2_HO2_sum','RO2_RO2_sum','RCO2_NO2_sum', + 'OddOx_Ox_Loss','OddOx_HOx_Loss','OddOx_NOx_Loss','OddOx_CLOxBROx_Loss','OddOx_Loss_Tot','OddOx_Prod_Tot', 'Ox_Prod','Ox_Loss' - - 'CFC11STAR', 'AODDUST', 'AODDUST2', 'T', 'U', 'V', 'O3', 'OH', - 'NO3', 'HO2', 'LNO_COL_PROD', 'NO2_CLXF', 'SFNO', 'SFNH3', 'BRO', 'CH3CL', - 'CLO', 'CO2', 'HCL', 'HO2', 'HOCL', 'H2O', 'PHIS', 'Z3', - 'BENZENE', 'C2H2', 'C2H4', 'C2H6', 'C3H8', 'CCL4', 'CFC11', 'CFC113', - 'CFC12', 'CH2O', 'CH3BR', 'CH3CCL3', 'CH3CHO', 'CH3CL', 'CH3CN', 'CH3COCH3', - 'CH3OH', 'CH4', 'CO', 'H2O2', 'HCFC22', 'HCN', 'HNO3', 'ISOP', - 'N2O', 'O3', 'PAN', 'SO2', 'TOLUENE', 'OH', 'ALKNIT', - 'ALKOOH', 'BCARY', 'BENZENE', 'BENZOOH', 'BEPOMUC', 'BIGALD1', 'BIGALD2', - 'BIGALD3', 'BIGALD4', 'BIGALK', 'BIGENE', 'BR', 'BRCL', 'BRO', 'BRONO2', - 'BRY', 'BZALD', 'BZOOH', 'C2H2', 'C2H4', 'C2H5OH', 'C2H5OOH', 'C2H6', - 'C3H6', 'C3H7OOH', 'C3H8', 'C6H5OOH', 'CCL4', 'CF2CLBR', 'CF3BR', 'CFC11', - 'CFC113', 'CFC114', 'CFC115', 'CFC12', 'CH2BR2', 'CH2O', 'CH3BR', 'CH3CCL3', - 'CH3CHO', 'CH3CL', 'CH3CN', 'CH3COCH3', 'CH3COCHO', 'CH3COOH', 'CH3COOOH', 'CH3OH', - 'CH3OOH', 'CH4', 'CHBR3', 'CL', 'CL2', 'CL2O2', 'CLO', 'CLONO2', - 'CLY', 'CO', 'CO2', 'COF2', 'COFCL', 'CRESOL', 'DMS', 'EOOH', - 'F', 'GLYALD', 'GLYOXAL', 'H', 'H2', 'H2402', 'H2O2', 'H2SO4', - 'HBR', 'HCFC141B', 'HCFC142B', 'HCFC22', 'HCL', 'HCN', 'HCOOH', 'HF', - 'HNO3', 'HO2NO2', 'HOBR', 'HOCL', 'HONITR', 'HYAC', 'HYDRALD', - 'IEPOX', 'ISOP', 'ISOPNO3', 'ISOPOOH', 'IVOC', - 'MACR', 'MACROOH', 'MEK', 'MEKOOH', 'MPAN', 'MVK', 'N', - 'N2O', 'N2O5', 'NC4CHO', 'NH3', 'NH4', 'NO', 'NO2', - 'NO3', 'NOA', 'O', 'OCLO', 'OCS', 'ONITR', 'PAN', - 'PBZNIT', 'PHENO', 'PHENOL', 'PHENOOH', 'POOH', 'ROOH', 'S', 'SF6', - 'SO', 'SO2', 'SO3', 'SOAG0', 'SOAG1', 'SOAG2', 'SOAG3', 'SOAG4', - 'SVOC', 'TEPOMUC', 'TERP2AOOH', 'TERPOOH', 'TOLOOH', - 'TOLUENE', 'XYLENES', 'XYLENOOH', 'XYLOL', 'XYLOLOOH', 'NHDEP', 'NDEP', - 'ACBZO2', 'ALKO2', 'BENZO2', 'BZOO', 'C2H5O2', 'C3H7O2', 'C6H5O2', 'CH3CO3', - 'CH3O2', 'DICARBO2', 'ENEO2', 'EO', 'EO2', 'HO2', 'HOCH2OO', - 'MACRO2', 'MALO2', 'MCO3', 'MDIALO2', 'MEKO2', 'O1D', - 'OH', 'PHENO2', 'PO2', 'RO2', 'TOLO2', - 'XYLENO2', 'XYLOLO2', 'H2O', 'SAD_ICE', 'SAD_LNAT', 'SAD_SULFC', 'SAD_TROP', 'SAD_AERO', - 'REFF_AERO', 'PDELDRY', 'RAD_ICE', 'RAD_LNAT', 'RAD_SULFC', 'H2SO4M_C', 'HNO3_GAS', 'HNO3_STS', - 'HNO3_NAT', 'VEL_NAT2', 'NITROP_PD', 'NOX', 'NOY', 'CLOX', 'CLOY', 'BROX', - 'BROY', 'TCLY', 'TOTH', 'MASS', 'TBRY', 'HCL_GAS', 'wet_deposition_NHx_as_N', 'wet_deposition_NOy_as_N', - 'HCL_GAS', 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'ABSORB', 'AODVISdn', 'AODdnMODE1', 'AODVISstdn', - 'AODNIRstdn', 'AODUVstdn', 'AODdnMODE2', 'AODdnMODE3', 'AODdnDUST1', 'AODdnDUST2', 'AODdnDUST3', 'AODVISstdn', - 'AODUVstdn', 'AODNIRstdn', 'AODNIRstdn', 'AODVISdn', 'AODUVdn', 'EXTINCTdn', 'EXTxASYMdn', 'EXTINCTNIRdn', - 'EXTINCTUVdn', 'WD_ALKNIT', 'WD_ALKOOH', 'WD_BENZOOH', 'WD_BRONO2', 'WD_BZOOH', 'WD_C2H5OH', 'WD_C2H5OOH', - 'WD_C3H7OOH', 'WD_C6H5OOH', 'WD_CH2O', 'WD_CH3CHO', 'WD_CH3CN', 'WD_CH3COCHO', 'WD_CH3COOH', 'WD_CH3COOOH', - 'WD_CH3COCH3', 'WD_CH3OH', 'WD_CH3OOH', 'WD_CLONO2', 'WD_COF2', 'WD_COFCL', 'WD_EOOH', 'WD_GLYALD', - 'WD_H2O2', 'WD_H2SO4', 'WD_HBR', 'WD_HCL', 'WD_HCN', 'WD_HCOOH', 'WD_HF', 'WD_HNO3', - 'WD_HO2NO2', 'WD_HOBR', 'WD_HOCL', 'WD_HONITR', 'WD_HYAC', 'WD_HYDRALD', 'WD_IEPOX', - 'WD_ISOPOOH', 'WD_IVOC', 'WD_MACR', 'WD_MACROOH', - 'WD_MEKOOH', 'WD_MVK', 'WD_NC4CHO', 'WD_NDEP', 'WD_NH3', 'WD_NH4', 'WD_NHDEP', - 'WD_NOA', 'WD_ONITR', 'WD_PHENOOH', 'WD_POOH', 'WD_ROOH', 'WD_SO2', 'WD_SOAG0', - 'WD_SOAG1', 'WD_SOAG2', 'WD_SOAG3', 'WD_SOAG4', 'WD_SVOC', 'WD_TERP2AOOH', 'WD_TERPOOH', - 'WD_TOLOOH', 'WD_XYLENOOH', 'WD_XYLOLOOH', 'DF_ALKNIT', 'DF_ALKOOH', - 'DF_BENZOOH', 'DF_BZOOH', 'DF_C2H5OH', 'DF_C2H5OOH', 'DF_C3H7OOH', 'DF_C6H5OOH', 'DF_CH2O', 'DF_CH3CHO', - 'DF_CH3CN', 'DF_CH3COCH3', 'DF_CH3COCHO', 'DF_CH3COOH', 'DF_CH3COOOH', 'DF_CH3OH', 'DF_CH3OOH', 'DF_CO', - 'DF_EOOH', 'DF_GLYALD', 'DF_H2O2', 'DF_H2SO4', 'DF_HCN', 'DF_HCOOH', 'DF_HNO3', 'DF_HO2NO2', - 'DF_HONITR', 'DF_HYAC', 'DF_HYDRALD', 'DF_IEPOX', - 'DF_ISOPOOH', 'DF_IVOC', 'DF_MACROOH', 'DF_MEKOOH', 'DF_MPAN', 'DF_NC4CHO', - 'dry_deposition_NHx_as_N', 'DF_NH3', 'DF_NH4', 'DF_NO', 'DF_NO2', 'DF_NOA', 'DF_O3', - 'DF_ONITR', 'DF_PAN', 'DF_PHENOOH', 'DF_POOH', 'DF_ROOH', 'DF_SO2', 'DF_SOAG0', 'DF_SOAG1', - 'DF_SOAG2', 'DF_SOAG3', 'DF_SOAG4', 'DF_SVOC', 'DF_TERP2AOOH', 'DF_TERPOOH', - 'DF_TOLOOH', 'DF_XYLENOOH', 'DF_XYLOLOOH', 'dry_deposition_NOy_as_N', 'SO2_CLXF', 'SO2_XFRC', - 'SVOC_CLXF', 'CO_CLXF', 'NO2_CLXF', 'LNO_PROD', 'LNO_COL_PROD', 'SFISOP', 'SFBCARY', - 'SFCH3OH', 'SFC2H5OH', 'SFCH3CHO', 'SFMEK', 'SFHCN', 'SFCH3CN', 'SFCH2O', 'SFC2H6', - 'SFC3H8', 'SFC2H4', 'SFC3H6', 'SFCH3COCH3', 'SFBIGALK', 'SFBIGENE', 'SFBENZENE', 'SFTOLUENE', - 'SFXYLENES', 'SFCO', 'SFNO', 'SFC2H2', 'SFHCOOH', 'SFCH3COOH', 'SFCH3COCH3', 'SFDMS', - 'SFMEK', 'SFSO2', 'SFNH3', 'SFIVOC', 'SFSVOC', 'MEG_ISOP', 'MEG_BCARY', - 'MEG_CH3OH', 'MEG_C2H5OH', 'MEG_CH2O', 'MEG_CH3CHO', 'MEG_CH3COOH', 'MEG_CH3COCH3', 'MEG_HCOOH', 'MEG_HCN', - 'MEG_CO', 'MEG_C2H6', 'MEG_C2H4', 'MEG_C3H8', 'MEG_C3H6', 'MEG_BIGALK', 'MEG_BIGENE', 'MEG_TOLUENE', - 'Dso4_a1CHM', 'Dso4_a2CHM', 'Dso4_a3CHM', 'DO3CHM', 'DCOCHM', 'DHNO3CHM', 'DH2O2CHM', 'CH4_CHML', - 'CO_CHMP', 'CO_CHML', 'CH3CCL3_CHML', 'CO2_CHML', 'AQ_SO2', 'GS_SO2', 'SO2_CHML', 'SO2_CHMP', - 'SO2_CLXF', 'SOAG0_CHMP', 'SOAG1_CHMP', 'SOAG2_CHMP', 'SOAG3_CHMP', 'SOAG4_CHMP', 'IVOC_CHMP', 'SVOC_CHML', - 'MASS', 'ABSORB', 'WD_H2SO4', 'WD_IVOC', 'WD_SO2', 'WD_SOAG0', 'WD_SOAG1', 'WD_SOAG2', - 'WD_SOAG3', 'WD_SOAG4', 'WD_SVOC', 'DF_CO', 'DF_IVOC', 'DF_O3', 'DF_SO2', 'DF_SOAG0', - 'DF_SOAG1', 'DF_SOAG2', 'DF_SOAG3', 'DF_SOAG4', 'DF_SVOC', 'SO2_CLXF', 'SVOC_CLXF', 'SFISOP', - 'SFCH3OH', 'SFCH3COCH3', 'SFCO', 'SFIVOC', 'SFSVOC', 'DO3CHM', 'DCOCHM', - 'O3_CHMP', 'O3_CHML', 'CH4_CHML', 'CO_CHMP', 'CO_CHML', 'CH3CCL3_CHML', 'SO2_CHML', 'SO2_CHMP', - 'SO2_CLXF', 'SOAG0_CHMP', 'SOAG1_CHMP', 'SOAG2_CHMP', 'SOAG3_CHMP', 'SOAG4_CHMP', 'O3_Prod', 'O3_Loss', - 'OddOx_Ox_Loss', 'OddOx_HOx_Loss', 'OddOx_NOx_Loss', 'OddOx_CLOxBROx_Loss', 'OddOx_Loss_Tot', 'OddOx_Prod_Tot', 'O3_Prod', 'O3_Loss', - 'r_HO2_O3', 'r_OH_O3', 'r_OH_O', 'r_O1D_H2O', 'r_het1', 'r_het2', 'r_het3', 'r_het4', - 'r_het5', 'r_het6', 'jo3_a', 'jno2', 'jpan', 'jh2o2', 'jcl2o2', 'bc_a1', - 'bc_a4', 'dst_a1', 'dst_a2', 'dst_a3', 'ncl_a1', 'ncl_a1', 'ncl_a2', 'ncl_a3', - 'pom_a1', 'pom_a4', 'so4_a1', 'so4_a2', 'so4_a3', 'soa1_a1', 'soa2_a1', 'soa3_a1', - 'soa4_a1', 'soa5_a1', 'soa1_a2', 'soa2_a2', 'soa3_a2', 'soa4_a2', 'soa5_a2', 'bc_c1', - 'bc_c4', 'dst_c1', 'dst_c2', 'dst_c3', 'ncl_c1', 'ncl_c1', 'ncl_c2', 'ncl_c3', - 'pom_c1', 'pom_c4', 'so4_c1', 'so4_c2', 'so4_c3', 'soa1_c1', 'soa2_c1', 'soa3_c1', - 'soa4_c1', 'soa5_c1', 'soa1_c2', 'soa2_c2', 'soa3_c2', 'soa4_c2', 'soa5_c2', 'bc_a1SFWET', - 'num_a1', 'num_a2', 'num_a3', 'num_a4', 'num_c1', 'num_c2', 'num_c3', 'num_c4', - 'bc_a1SFWET', 'bc_a4SFWET', 'dst_a1SFWET', 'dst_a2SFWET', 'dst_a3SFWET', 'ncl_a1SFWET', 'ncl_a2SFWET', 'ncl_a3SFWET', - 'pom_a1SFWET', 'pom_a4SFWET', 'so4_a1SFWET', 'so4_a2SFWET', 'so4_a3SFWET', 'soa1_a1SFWET', 'soa1_a2SFWET', 'soa2_a1SFWET', - 'soa2_a2SFWET', 'soa3_a1SFWET', 'soa3_a2SFWET', 'soa4_a1SFWET', 'soa4_a2SFWET', 'soa5_a1SFWET', 'soa5_a2SFWET', 'bc_c1SFWET', - 'bc_c4SFWET', 'dst_c1SFWET', 'dst_c2SFWET', 'dst_c3SFWET', 'ncl_c1SFWET', 'ncl_c2SFWET', 'ncl_c3SFWET', 'pom_c1SFWET', - 'pom_c4SFWET', 'so4_c1SFWET', 'so4_c2SFWET', 'so4_c3SFWET', 'soa1_c1SFWET', 'soa1_c2SFWET', 'soa2_c1SFWET', 'soa2_c2SFWET', - 'soa3_c1SFWET', 'soa3_c2SFWET', 'soa4_c1SFWET', 'soa4_c2SFWET', 'soa5_c1SFWET', 'soa5_c2SFWET', 'bc_a1DDF', 'bc_a4DDF', - 'dst_a1DDF', 'dst_a2DDF', 'dst_a3DDF', 'ncl_a1DDF', 'ncl_a2DDF', 'ncl_a3DDF', 'pom_a1DDF', 'pom_a4DDF', - 'so4_a1DDF', 'so4_a2DDF', 'so4_a3DDF', 'soa1_a1DDF', 'soa1_a2DDF', 'soa2_a1DDF', 'soa2_a2DDF', 'soa3_a1DDF', - 'soa3_a2DDF', 'soa4_a1DDF', 'soa4_a2DDF', 'soa5_a1DDF', 'soa5_a2DDF', 'bc_c1DDF', 'bc_c4DDF', 'dst_c1DDF', - 'dst_c2DDF', 'dst_c3DDF', 'ncl_c1DDF', 'ncl_c2DDF', 'ncl_c3DDF', 'pom_c1DDF', 'pom_c4DDF', 'so4_c1DDF', - 'so4_c2DDF', 'so4_c3DDF', 'soa1_c1DDF', 'soa1_c2DDF', 'soa2_c1DDF', 'soa2_c2DDF', 'soa3_c1DDF', 'soa3_c2DDF', - 'soa4_c1DDF', 'soa4_c2DDF', 'soa5_c1DDF', 'soa5_c2DDF', 'num_a1DDF', 'num_a2DDF', 'num_a3DDF', 'num_a4DDF', - 'num_c1DDF', 'num_c2DDF', 'num_c3DDF', 'num_c4DDF', 'bc_a4_CLXF', 'pom_a4_CLXF', 'so4_a1_CLXF', 'so4_a2_CLXF', - 'num_a1_CLXF', 'num_a2_CLXF', 'SFbc_a4', 'SFpom_a4', 'SFso4_a1', 'SFso4_a2', 'SFnum_a1', 'SFnum_a2', - 'SFnum_a3', 'so4_a1_sfgaex1', 'so4_a2_sfgaex1', 'so4_a3_sfgaex1', 'soa1_a1_sfgaex1', 'soa1_a2_sfgaex1', 'soa2_a1_sfgaex1', 'soa2_a2_sfgaex1', - 'soa3_a1_sfgaex1', 'soa3_a2_sfgaex1', 'soa4_a1_sfgaex1', 'soa4_a2_sfgaex1', 'soa5_a1_sfgaex1', 'soa5_a2_sfgaex1', 'so4_a2_sfnnuc1', 'so4_c1AQH2SO4', - 'so4_c2AQH2SO4', 'so4_c3AQH2SO4', 'so4_c1AQSO4', 'so4_c2AQSO4', 'so4_c3AQSO4', 'SFdst_a1', 'SFdst_a2', 'SFdst_a3', - 'SFncl_a1', 'SFncl_a2', 'SFncl_a3', 'soa1_a1_CHML', 'soa2_a1_CHML', 'soa3_a1_CHML', 'soa4_a1_CHML', 'soa5_a1_CHML', - 'soa1_a2_CHML', 'soa2_a2_CHML', 'soa3_a2_CHML', 'soa4_a2_CHML', 'soa5_a2_CHML', 'so4_a1_CHMP', 'so4_a2_CHMP', 'so4_a3_CHMP', - 'r_jsoa1_a1', 'r_jsoa2_a1', 'r_jsoa3_a1', 'r_jsoa4_a1', 'r_jsoa5_a1', 'r_jsoa1_a2', 'r_jsoa2_a2', 'r_jsoa3_a2', - 'r_jsoa4_a2', 'r_jsoa5_a2', 'r_GLYOXAL_aer', 'H2SO4_sfnnuc1', 'num_a2_sfnnuc1', 'TMOCS', 'TMSO2', 'TMDMS', - 'TMso4_a1', 'TMso4_a2', 'TMso4_a3', 'BURDENDUSTdn', 'BURDENPOMdn', 'BURDENSO4dn', 'BURDENSOAdn', 'BURDENSEASALTdn', - 'BURDENBCdn', 'PM25', - 'MEG_XYLENES','MEG_BZALD','MEG_MEK', - 'DF_BCARY', 'DF_BENZENE', 'DF_BEPOMUC', 'DF_BIGALD1', 'DF_BIGALD2', 'DF_BIGALD3', - 'DF_BIGALD4', 'DF_BIGALK', 'DF_BIGENE', 'DF_BZALD', 'DF_C2H2', 'DF_C2H4', 'DF_C2H6', 'DF_C3H6', - 'DF_C3H8', 'DF_CRESOL', 'DF_DMS', 'DF_GLYOXAL', 'DF_ISOP', 'DF_MACR', 'DF_MEK', - 'DF_MVK', 'DF_N2O5', 'DF_PBZNIT', 'DF_PHENOL', 'DF_TEPOMUC', 'DF_TOLUENE', 'DF_XYLENES', 'DF_XYLOL', - 'WD_BCARY', 'WD_BENZENE', 'WD_BEPOMUC', 'WD_BIGALD1', 'WD_BIGALD2', 'WD_BIGALD3', 'WD_BIGALD4', - 'WD_BIGALK', 'WD_BIGENE', 'WD_BZALD', - 'WD_C2H2', 'WD_C2H4', 'WD_C2H6', 'WD_C3H6', 'WD_C3H8', 'WD_CO', 'WD_CRESOL', 'WD_DMS', 'WD_GLYOXAL', 'WD_ISOP', - 'WD_MEK', 'WD_MPAN', - 'WD_N2O5', 'WD_NO', 'WD_NO2', 'WD_PAN', 'WD_PBZNIT', 'WD_PHENOL', 'WD_TEPOMUC','WD_TOLUENE', 'WD_XYLENES', 'WD_XYLOL' - - + 'PMID', 'PDELDRY','PS','PHIS:I','Z3','T','U','V','Q','TROP_P', 'CLOUD', 'CO','O3','O3S','NO2','NO','OH','ISOP','SO2', 'PAN', 'HNO3', 'C2H6', 'C3H8', 'CH2O', 'CH3COCH3', 'SFISOP','SFCO','SFNO','SFNO2', 'PM25_SRF', 'so4_a1','so4_a2','so4_a3','dst_a1','dst_a2','dst_a3','soa_a1','soa_a2', 'ncl_a1','ncl_a2','ncl_a3','bc_a1', 'bc_a4','pom_a1','pom_a4', 'AODVISdn', - + 'soa_a1 = soa1_a1 + soa2_a1 + soa3_a1 + soa4_a1 + soa5_a1', 'soa_a2 = soa1_a2 + soa2_a2 + soa3_a2 + soa4_a2 + soa5_a2' - + 'MEG_APIN','MEG_BPIN','MEG_LIMON','MEG_MYRC', 'ISOPFDN', 'ISOPFNP', 'ISOPN3B', 'ISOPN2B', 'ISOPN1D', 'ISOPN4D', 'ISOPNBNO3', 'ISOPNOOHB', 'ISOPNOOHD', 'INHEB','INHED', diff --git a/bld/namelist_files/use_cases/hist_trop_strat_vbs_cam6.xml b/bld/namelist_files/use_cases/hist_trop_strat_vbs_cam6.xml index 98309c552e..f9ea8eb9eb 100644 --- a/bld/namelist_files/use_cases/hist_trop_strat_vbs_cam6.xml +++ b/bld/namelist_files/use_cases/hist_trop_strat_vbs_cam6.xml @@ -16,17 +16,114 @@ 0.25D0 SERIAL -atm/waccm/lb/LBC_1750-2014_CMIP6_0p5degLat_c170126.nc +atm/waccm/lb/LBC_17500116-25001216_CMIP6_SSP585_0p5degLat_c20200824.nc - SERIAL +SERIAL +2.70D0 + 0.38D0 + 'SERIAL' + INTERP_MISSING_MONTHS + + 'bc_a4 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_bc_a4_aircraft_vertical_mol_175001-210101_0.9x1.25_c20190224.nc', + 'NO2 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_NO2_aircraft_vertical_mol_175001-210101_0.9x1.25_c20190224.nc', + 'num_a1 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_num_so4_a1_anthro-ene_vertical_mol_175001-210101_0.9x1.25_c20190224.nc', + 'num_a1 -> $INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_num_a1_so4_contvolcano_vertical_850-5000_0.9x1.25_c20170724.nc', + 'num_a2 -> $INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_num_a2_so4_contvolcano_vertical_850-5000_0.9x1.25_c20170724.nc', + 'num_a4 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_num_bc_a4_aircraft_vertical_mol_175001-210101_0.9x1.25_c20190224.nc', + 'SO2 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_SO2_aircraft_vertical_mol_175001-210101_0.9x1.25_c20190224.nc', + 'SO2 -> $INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_SO2_contvolcano_vertical_850-5000_0.9x1.25_c20170724.nc', + 'SO2 -> $INPUTDATA_ROOT/atm/cam/chem/stratvolc/VolcanEESMv3.10_piControl_SO2_1850-2014average_ext_1deg_ZeroTrop_c181020.nc', + 'so4_a1 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_so4_a1_anthro-ene_vertical_mol_175001-210101_0.9x1.25_c20190224.nc', + 'so4_a1 -> $INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_so4_a1_contvolcano_vertical_850-5000_0.9x1.25_c20170724.nc', + 'so4_a2 -> $INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions-cmip6_so4_a2_contvolcano_vertical_850-5000_0.9x1.25_c20170724.nc' + INTERP_MISSING_MONTHS - -'noy', 'nhx' + + 'BENZENE -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_BENZENE_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'BENZENE -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_BENZENE_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'BIGALK -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_BIGALK_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'BIGALK -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_BIGALK_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'BIGENE -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_BIGENE_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'BIGENE -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_BIGENE_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'C2H2 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_C2H2_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'C2H2 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_C2H2_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'C2H4 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_C2H4_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'C2H4 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-SSP_C2H4_other_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'C2H5OH -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_C2H5OH_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'C2H5OH -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_C2H5OH_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'C2H6 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_C2H6_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'C2H6 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_C2H6_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'C2H6 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-SSP_C2H6_other_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'C3H6 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_C3H6_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'C3H6 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_C3H6_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'C3H6 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-SSP_C3H6_other_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'C3H8 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_C3H8_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'C3H8 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_C3H8_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'C3H8 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-SSP_C3H8_other_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'CH2O -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_CH2O_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'CH2O -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_CH2O_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'CH3CHO -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_CH3CHO_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'CH3CHO -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_CH3CHO_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'CH3CN -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_CH3CN_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'CH3CN -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_CH3CN_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'CH3COCH3 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_CH3COCH3_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'CH3COCH3 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_CH3COCH3_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'CH3COCHO -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_CH3COCHO_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'CH3COOH -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_CH3COOH_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'CH3COOH -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_CH3COOH_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'CH3OH -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_CH3OH_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'CH3OH -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_CH3OH_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'CO -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_CO_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'CO -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_CO_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'CO -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-SSP_CO_other_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'E90 -> $INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions_E90global_surface_175001-210101_0.9x1.25_c20190224.nc', + 'GLYALD -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_GLYALD_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'HCN -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_HCN_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'HCN -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_HCN_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'HCOOH -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_HCOOH_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'HCOOH -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_HCOOH_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'ISOP -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_ISOP_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'IVOC -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_IVOC_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'IVOC -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_IVOC_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'MEK -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_MEK_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'MEK -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_MEK_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'MTERP -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_MTERP_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'NH3 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_NH3_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'NH3 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_NH3_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'NH3 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-SSP_NH3_other_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'NO -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_NO_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'NO -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_NO_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'NO -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-SSP_NO_other_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'SVOC -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_SVOC_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'SVOC -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_SVOC_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'TOLUENE -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_TOLUENE_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'TOLUENE -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_TOLUENE_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'XYLENES -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_XYLENES_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'XYLENES -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_XYLENES_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'bc_a4 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_bc_a4_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'bc_a4 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_bc_a4_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'DMS -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_DMS_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'num_a1 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_num_so4_a1_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'num_a1 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_num_so4_a1_anthro-ag-ship_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'num_a2 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_num_so4_a2_anthro-res_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'num_a4 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_num_bc_a4_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'num_a4 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_num_bc_a4_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'num_a4 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_num_pom_a4_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'num_a4 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_num_pom_a4_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'pom_a4 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_pom_a4_anthro_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'pom_a4 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_pom_a4_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'SO2 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_SO2_anthro-ag-ship-res_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'SO2 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_SO2_anthro-ene_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'SO2 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_SO2_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'so4_a1 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_so4_a1_anthro-ag-ship_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'so4_a1 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_so4_a1_bb_surface_mol_175001-210101_0.9x1.25_c20190224.nc', + 'so4_a2 -> $INPUTDATA_ROOT/atm/cam/chem/emis/emissions_ssp585/emissions-cmip6-ScenarioMIP_IAMC-REMIND-MAGPIE-ssp585-1-1_so4_a2_anthro-res_surface_mol_175001-210101_0.9x1.25_c20190224.nc' + @@ -37,113 +134,45 @@ .true. .false. .false. -.false. +.true. .false. .false. .false. .false. .false. - + - 'CFC11STAR', 'AODDUST', 'AODDUST2', 'T', 'U', 'V', 'O3', 'OH', 'NO3', 'HO2', - 'LNO_COL_PROD', 'NO2_CLXF', 'SFNO', 'SFNH3', 'BRO', - 'CH3CL', 'CLO', 'CO2', 'HCL', 'HO2', 'HOCL', 'H2O', 'PHIS', 'Z3', - 'BENZENE', 'C2H2', 'C2H4', 'C2H6', 'C3H8', 'CCL4', 'CFC11', 'CFC113', 'CFC12', - 'CH2O', 'CH3BR', 'CH3CCL3', 'CH3CHO', 'CH3CL', 'CH3CN', 'CH3COCH3', 'CH3OH', 'CH4', - 'CO', 'H2O2', 'HCFC22', 'HCN', 'HNO3', 'ISOP', 'MTERP', 'N2O', 'O3', 'O3S', - 'PAN', 'SO2', 'TOLUENE', 'OH', 'ALKNIT', 'ALKOOH', 'BCARY', 'BENZENE', 'BENZOOH', - 'BEPOMUC', 'BIGALD', 'BIGALD1', 'BIGALD2', 'BIGALD3', 'BIGALD4', 'BIGALK', 'BIGENE', 'BR', - 'BRCL', 'BRO', 'BRONO2', 'BRY', 'BZALD', 'BZOOH', 'C2H2', 'C2H4', 'C2H5OH', - 'C2H5OOH', 'C2H6', 'C3H6', 'C3H7OOH', 'C3H8', 'C6H5OOH', 'CCL4', 'CF2CLBR', 'CF3BR', - 'CFC11', 'CFC113', 'CFC114', 'CFC115', 'CFC12', 'CH2BR2', 'CH2O', 'CH3BR', 'CH3CCL3', - 'CH3CHO', 'CH3CL', 'CH3CN', 'CH3COCH3', 'CH3COCHO', 'CH3COOH', 'CH3COOOH', 'CH3OH', 'CH3OOH', - 'CH4', 'CHBR3', 'CL', 'CL2', 'CL2O2', 'CLO', 'CLONO2', 'CLY', 'CO', - 'CO2', 'COF2', 'COFCL', 'CRESOL', 'DMS', 'EOOH', 'F', 'GLYALD', 'GLYOXAL', - 'H', 'H2', 'H2402', 'H2O2', 'H2SO4', 'HBR', 'HCFC141B', 'HCFC142B', 'HCFC22', - 'HCL', 'HCN', 'HCOOH', 'HF', 'HNO3', 'HO2NO2', 'HOBR', 'HOCL', 'HONITR', - 'HPALD', 'HYAC', 'HYDRALD', 'IEPOX', 'ISOP', 'ISOPNITA', 'ISOPNITB', 'ISOPNO3', 'ISOPNOOH', - 'ISOPOOH', 'IVOC', 'MACR', 'MACROOH', 'MEK', 'MEKOOH', 'MPAN', 'MTERP', 'MVK', - 'N', 'N2O', 'N2O5', 'NC4CH2OH', 'NC4CHO', 'NH3', 'NH4', 'NO', - 'NO2', 'NO3', 'NOA', 'NTERPOOH', 'O', 'OCLO', - 'OCS', 'ONITR', 'PAN', 'PBZNIT', 'PHENO', 'PHENOL', 'PHENOOH', 'POOH', 'ROOH', - 'S', 'SF6', 'SO', 'SO2', 'SO3', 'SOAG0', 'SOAG1', 'SOAG2', 'SOAG3', - 'SOAG4', 'SVOC', 'TEPOMUC', 'TERP2OOH', 'TERPNIT', 'TERPOOH', 'TERPROD1', 'TERPROD2', 'TOLOOH', - 'TOLUENE', 'XOOH', 'XYLENES', 'XYLENOOH', 'XYLOL', 'XYLOLOOH', 'NHDEP', 'NDEP', 'ACBZO2', - 'ALKO2', 'BENZO2', 'BZOO', 'C2H5O2', 'C3H7O2', 'C6H5O2', 'CH3CO3', 'CH3O2', 'DICARBO2', - 'ENEO2', 'EO', 'EO2', 'HO2', 'HOCH2OO', 'ISOPAO2', 'ISOPBO2', 'MACRO2', - 'MALO2', 'MCO3', 'MDIALO2', 'MEKO2', 'NTERPO2', - 'O1D', 'OH', 'PHENO2', 'PO2', 'RO2', - 'TERP2O2', 'TERPO2', 'TOLO2', 'XO2', 'XYLENO2', 'XYLOLO2', 'H2O', 'SAD_ICE', 'SAD_LNAT', - 'SAD_SULFC', 'SAD_TROP', 'SAD_AERO', 'REFF_AERO', 'PDELDRY', 'RAD_ICE', 'RAD_LNAT', 'RAD_SULFC', 'H2SO4M_C', - 'HNO3_GAS', 'HNO3_STS', 'HNO3_NAT', 'VEL_NAT2', 'NITROP_PD', 'NOX', 'NOY', 'CLOX', 'CLOY', - 'BROX', 'BROY', 'TCLY', 'TOTH', 'MASS', 'TBRY', 'HCL_GAS', 'wet_deposition_NHx_as_N', 'wet_deposition_NOy_as_N', - 'HCL_GAS', 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'ABSORB', 'AODVISdn', 'AODdnMODE1', 'AODVISstdn', 'AODNIRstdn', - 'AODUVstdn', 'AODdnMODE2', 'AODdnMODE3', 'AODdnDUST1', 'AODdnDUST2', 'AODdnDUST3', 'AODVISstdn', 'AODUVstdn', 'AODNIRstdn', - 'AODNIRstdn', 'AODVISdn', 'AODUVdn', 'EXTINCTdn', 'EXTxASYMdn', 'EXTINCTNIRdn', 'EXTINCTUVdn', 'WD_ALKNIT', 'WD_ALKOOH', - 'WD_BENZOOH', 'WD_BRONO2', 'WD_BZOOH', 'WD_C2H5OH', 'WD_C2H5OOH', 'WD_C3H7OOH', 'WD_C6H5OOH', 'WD_CH2O', 'WD_CH3CHO', - 'WD_CH3CN', 'WD_CH3COCHO', 'WD_CH3COOH', 'WD_CH3COOOH', 'WD_CH3COCH3', 'WD_CH3OH', 'WD_CH3OOH', 'WD_CLONO2', 'WD_COF2', 'WD_COFCL', - 'WD_EOOH', 'WD_GLYALD', 'WD_H2O2', 'WD_H2SO4', 'WD_HBR', 'WD_HCL', 'WD_HCN', 'WD_HCOOH', 'WD_HF', - 'WD_HNO3', 'WD_HO2NO2', 'WD_HOBR', 'WD_HOCL', 'WD_HONITR', 'WD_HPALD', 'WD_HYAC', 'WD_HYDRALD', 'WD_IEPOX', - 'WD_ISOPNITA', 'WD_ISOPNITB', 'WD_ISOPNO3', 'WD_ISOPNOOH', 'WD_ISOPOOH', 'WD_IVOC', 'WD_MACR', 'WD_MACROOH', 'WD_MEKOOH', - 'WD_MVK', 'WD_NC4CH2OH', 'WD_NC4CHO', 'WD_NDEP', 'WD_NH3', 'WD_NH4', 'WD_NHDEP', 'WD_NOA', - 'WD_NTERPOOH', 'WD_ONITR', 'WD_PHENOOH', 'WD_POOH', 'WD_ROOH', 'WD_SO2', 'WD_SOAG0', 'WD_SOAG1', 'WD_SOAG2', - 'WD_SOAG3', 'WD_SOAG4', 'WD_SVOC', 'WD_TERP2OOH', 'WD_TERPNIT', 'WD_TERPOOH', 'WD_TERPROD1', 'WD_TERPROD2', 'WD_TOLOOH', - 'WD_XOOH', 'WD_XYLENOOH', 'WD_XYLOLOOH', 'DF_ALKNIT', 'DF_ALKOOH', 'DF_BENZOOH', 'DF_BZOOH', 'DF_C2H5OH', 'DF_C2H5OOH', - 'DF_C3H7OOH', 'DF_C6H5OOH', 'DF_CH2O', 'DF_CH3CHO', 'DF_CH3CN', 'DF_CH3COCH3', 'DF_CH3COCHO', 'DF_CH3COOH', 'DF_CH3COOOH', - 'DF_CH3OH', 'DF_CH3OOH', 'DF_CO', 'DF_EOOH', 'DF_GLYALD', 'DF_H2O2', 'DF_H2SO4', 'DF_HCN', 'DF_HCOOH', - 'DF_HNO3', 'DF_HO2NO2', 'DF_HONITR', 'DF_HPALD', 'DF_HYAC', 'DF_HYDRALD', 'DF_IEPOX', 'DF_ISOPNITA', 'DF_ISOPNITB', - 'DF_ISOPNO3', 'DF_ISOPNOOH', 'DF_ISOPOOH', 'DF_IVOC', 'DF_MACROOH', 'DF_MEKOOH', 'DF_MPAN', 'DF_NC4CH2OH', 'DF_NC4CHO', - 'dry_deposition_NHx_as_N', 'DF_NH3', 'DF_NH4', 'DF_NO', 'DF_NO2', 'DF_NOA', 'DF_NTERPOOH', 'DF_O3', 'DF_ONITR', - 'DF_PAN', 'DF_PHENOOH', 'DF_POOH', 'DF_ROOH', 'DF_SO2', 'DF_SOAG0', 'DF_SOAG1', 'DF_SOAG2', 'DF_SOAG3', - 'DF_SOAG4', 'DF_SVOC', 'DF_TERP2OOH', 'DF_TERPNIT', 'DF_TERPOOH', 'DF_TERPROD1', 'DF_TERPROD2', 'DF_TOLOOH', 'DF_XOOH', - 'DF_XYLENOOH', 'DF_XYLOLOOH', 'dry_deposition_NOy_as_N', 'SO2_CLXF', 'SO2_XFRC', 'SVOC_CLXF', 'CO_CLXF', 'NO2_CLXF', 'LNO_PROD', - 'LNO_COL_PROD', 'SFISOP', 'SFMTERP', 'SFBCARY', 'SFCH3OH', 'SFC2H5OH', 'SFCH3CHO', 'SFMEK', 'SFHCN', - 'SFCH3CN', 'SFCH2O', 'SFC2H6', 'SFC3H8', 'SFC2H4', 'SFC3H6', 'SFCH3COCH3', 'SFBIGALK', 'SFBIGENE', - 'SFBENZENE', 'SFTOLUENE', 'SFXYLENES', 'SFCO', 'SFNO', 'SFC2H2', 'SFHCOOH', 'SFCH3COOH', 'SFCH3COCH3', - 'SFDMS', 'SFMEK', 'SFSO2', 'SFNH3', 'SFIVOC', 'SFSVOC', 'MEG_ISOP', 'MEG_MTERP', 'MEG_BCARY', - 'MEG_CH3OH', 'MEG_C2H5OH', 'MEG_CH2O', 'MEG_CH3CHO', 'MEG_CH3COOH', 'MEG_CH3COCH3', 'MEG_HCOOH', 'MEG_HCN', 'MEG_CO', - 'MEG_C2H6', 'MEG_C2H4', 'MEG_C3H8', 'MEG_C3H6', 'MEG_BIGALK', 'MEG_BIGENE', 'MEG_TOLUENE', 'Dso4_a1CHM', 'Dso4_a2CHM', - 'Dso4_a3CHM', 'DO3CHM', 'DCOCHM', 'DHNO3CHM', 'DH2O2CHM', 'CH4_CHML', 'CO_CHMP', 'CO_CHML', 'CH3CCL3_CHML', - 'CO2_CHML', 'AQ_SO2', 'GS_SO2', 'SO2_CHML', 'SO2_CHMP', 'SO2_CLXF', 'SOAG0_CHMP', 'SOAG1_CHMP', 'SOAG2_CHMP', - 'SOAG3_CHMP', 'SOAG4_CHMP', 'IVOC_CHMP', 'SVOC_CHML', 'MASS', 'ABSORB', 'WD_H2SO4', 'WD_IVOC', 'WD_SO2', - 'WD_SOAG0', 'WD_SOAG1', 'WD_SOAG2', 'WD_SOAG3', 'WD_SOAG4', 'WD_SVOC', 'DF_CO', 'DF_IVOC', 'DF_O3', - 'DF_SO2', 'DF_SOAG0', 'DF_SOAG1', 'DF_SOAG2', 'DF_SOAG3', 'DF_SOAG4', 'DF_SVOC', 'SO2_CLXF', 'SVOC_CLXF', - 'SFISOP', 'SFMTERP', 'SFCH3OH', 'SFCH3COCH3', 'SFCO', 'SFIVOC', 'SFSVOC', 'DO3CHM', 'DCOCHM', - 'O3_CHMP', 'O3_CHML', 'CH4_CHML', 'CO_CHMP', 'CO_CHML', 'CH3CCL3_CHML', 'SO2_CHML', 'SO2_CHMP', 'SO2_CLXF', - 'SOAG0_CHMP', 'SOAG1_CHMP', 'SOAG2_CHMP', 'SOAG3_CHMP', 'SOAG4_CHMP', - 'r_HO2_O3', 'r_OH_O3', 'r_OH_O', 'r_O1D_H2O', 'r_het1', 'r_het2', 'r_het3', 'r_het4', 'r_het5', 'r_het6', - 'jo3_a', 'jno2', 'jpan', 'jh2o2', 'jcl2o2', 'bc_a1', 'bc_a4', 'dst_a1', 'dst_a2', - 'dst_a3', 'ncl_a1', 'ncl_a1', 'ncl_a2', 'ncl_a3', 'pom_a1', 'pom_a4', 'so4_a1', 'so4_a2', - 'so4_a3', 'soa1_a1', 'soa2_a1', 'soa3_a1', 'soa4_a1', 'soa5_a1', 'soa1_a2', 'soa2_a2', 'soa3_a2', - 'soa4_a2', 'soa5_a2', 'bc_c1', 'bc_c4', 'dst_c1', 'dst_c2', 'dst_c3', 'ncl_c1', 'ncl_c1', - 'ncl_c2', 'ncl_c3', 'pom_c1', 'pom_c4', 'so4_c1', 'so4_c2', 'so4_c3', 'soa1_c1', 'soa2_c1', - 'soa3_c1', 'soa4_c1', 'soa5_c1', 'soa1_c2', 'soa2_c2', 'soa3_c2', 'soa4_c2', 'soa5_c2', - 'num_a1','num_a2','num_a3','num_a4','num_c1','num_c2','num_c3','num_c4', - 'bc_a1SFWET', 'bc_a4SFWET', 'dst_a1SFWET', 'dst_a2SFWET', 'dst_a3SFWET', 'ncl_a1SFWET', 'ncl_a2SFWET', 'ncl_a3SFWET', 'pom_a1SFWET', 'pom_a4SFWET', - 'so4_a1SFWET', 'so4_a2SFWET', 'so4_a3SFWET', 'soa1_a1SFWET', 'soa1_a2SFWET', 'soa2_a1SFWET', 'soa2_a2SFWET', 'soa3_a1SFWET', 'soa3_a2SFWET', - 'soa4_a1SFWET', 'soa4_a2SFWET', 'soa5_a1SFWET', 'soa5_a2SFWET', 'bc_c1SFWET', 'bc_c4SFWET', 'dst_c1SFWET', 'dst_c2SFWET', 'dst_c3SFWET', - 'ncl_c1SFWET', 'ncl_c2SFWET', 'ncl_c3SFWET', 'pom_c1SFWET', 'pom_c4SFWET', 'so4_c1SFWET', 'so4_c2SFWET', 'so4_c3SFWET', 'soa1_c1SFWET', - 'soa1_c2SFWET', 'soa2_c1SFWET', 'soa2_c2SFWET', 'soa3_c1SFWET', 'soa3_c2SFWET', 'soa4_c1SFWET', 'soa4_c2SFWET', 'soa5_c1SFWET', 'soa5_c2SFWET', - 'bc_a1DDF', 'bc_a4DDF', 'dst_a1DDF', 'dst_a2DDF', 'dst_a3DDF', 'ncl_a1DDF', 'ncl_a2DDF', 'ncl_a3DDF', 'pom_a1DDF', - 'pom_a4DDF', 'so4_a1DDF', 'so4_a2DDF', 'so4_a3DDF', 'soa1_a1DDF', 'soa1_a2DDF', 'soa2_a1DDF', 'soa2_a2DDF', 'soa3_a1DDF', - 'soa3_a2DDF', 'soa4_a1DDF', 'soa4_a2DDF', 'soa5_a1DDF', 'soa5_a2DDF', 'bc_c1DDF', 'bc_c4DDF', 'dst_c1DDF', 'dst_c2DDF', - 'dst_c3DDF', 'ncl_c1DDF', 'ncl_c2DDF', 'ncl_c3DDF', 'pom_c1DDF', 'pom_c4DDF', 'so4_c1DDF', 'so4_c2DDF', 'so4_c3DDF', - 'soa1_c1DDF', 'soa1_c2DDF', 'soa2_c1DDF', 'soa2_c2DDF', 'soa3_c1DDF', 'soa3_c2DDF', 'soa4_c1DDF', 'soa4_c2DDF', 'soa5_c1DDF', - 'soa5_c2DDF', 'num_a1DDF', 'num_a2DDF', 'num_a3DDF', 'num_a4DDF', 'num_c1DDF', 'num_c2DDF', 'num_c3DDF', 'num_c4DDF', - 'bc_a4_CLXF', 'pom_a4_CLXF', 'so4_a1_CLXF', 'so4_a2_CLXF', 'num_a1_CLXF', 'num_a2_CLXF', 'SFbc_a4', 'SFpom_a4', 'SFso4_a1', - 'SFso4_a2', 'SFnum_a1', 'SFnum_a2', 'SFnum_a3', 'so4_a1_sfgaex1', 'so4_a2_sfgaex1', 'so4_a3_sfgaex1', 'soa1_a1_sfgaex1', 'soa1_a2_sfgaex1', - 'soa2_a1_sfgaex1', 'soa2_a2_sfgaex1', 'soa3_a1_sfgaex1', 'soa3_a2_sfgaex1', 'soa4_a1_sfgaex1', 'soa4_a2_sfgaex1', 'soa5_a1_sfgaex1', 'soa5_a2_sfgaex1', 'so4_a2_sfnnuc1', - 'so4_c1AQH2SO4', 'so4_c2AQH2SO4', 'so4_c3AQH2SO4', 'so4_c1AQSO4', 'so4_c2AQSO4', 'so4_c3AQSO4', 'SFdst_a1', 'SFdst_a2', 'SFdst_a3', - 'SFncl_a1', 'SFncl_a2', 'SFncl_a3', 'soa1_a1_CHML', 'soa2_a1_CHML', 'soa3_a1_CHML', 'soa4_a1_CHML', 'soa5_a1_CHML', 'soa1_a2_CHML', - 'soa2_a2_CHML', 'soa3_a2_CHML', 'soa4_a2_CHML', 'soa5_a2_CHML', 'so4_a1_CHMP', 'so4_a2_CHMP', 'so4_a3_CHMP', 'soa1_a1_CHMP', 'soa2_a1_CHMP', - 'soa3_a1_CHMP', 'soa4_a1_CHMP', 'soa5_a1_CHMP', 'soa1_a2_CHMP', 'soa2_a2_CHMP', 'soa3_a2_CHMP', 'soa4_a2_CHMP', 'soa5_a2_CHMP', 'r_jsoa1_a1', - 'r_jsoa2_a1', 'r_jsoa3_a1', 'r_jsoa4_a1', 'r_jsoa5_a1', 'r_jsoa1_a2', 'r_jsoa2_a2', 'r_jsoa3_a2', 'r_jsoa4_a2', 'r_jsoa5_a2', - 'r_GLYOXAL_aer', 'H2SO4_sfnnuc1', 'num_a2_sfnnuc1', 'TMOCS', 'TMSO2', 'TMDMS', 'TMso4_a1', 'TMso4_a2', 'TMso4_a3', - 'BURDENDUSTdn', 'BURDENPOMdn', 'BURDENSO4dn', 'BURDENSOAdn', 'BURDENSEASALTdn','BURDENBCdn', 'PM25', - 'O3_Prod','O3_Loss','O3S_Loss','RO2_NO_sum','O3_alkenes','RO2_NO3_sum','RO2_HO2_sum','RO2_RO2_sum','RCO2_NO2_sum', - 'OddOx_Ox_Loss','OddOx_HOx_Loss','OddOx_NOx_Loss','OddOx_CLOxBROx_Loss','OddOx_Loss_Tot','OddOx_Prod_Tot', - 'Ox_Prod','Ox_Loss' + 'ACTREL', 'AQ_SO2', 'AREA', 'BROX', 'BROY', 'BRY', 'CLOX', 'CLOY', 'CLY', 'NOX', 'NOY', 'TBRY', 'TCLY', 'CFC11STAR', + 'BTTGWSPEC', 'BTTGWSDF', 'BTTGWSKE', 'CONCLD', 'CME', 'CMFMC', 'CMFMC_DP', + 'CH3CCL3_CHML', 'CH4_CHML', 'CO2_CHML', 'CO_CHML', 'IVOC_CHML', 'N2O_CHML', 'O3_CHML', 'SO2_CHML', + 'CO_CHMP', 'O3_CHMP', 'SO2_CHMP', 'TMDMS', 'TMOCS', 'TMSO2','TMso4_a1', 'TMso4_a2', 'TMso4_a3', + 'soa1_a1_CHML', 'soa1_a2_CHML', 'soa2_a1_CHML', 'soa2_a2_CHML', 'soa3_a1_CHML', 'soa3_a2_CHML', + 'soa4_a1_CHML', 'soa4_a2_CHML', 'soa5_a1_CHML', 'soa5_a2_CHML', 'SVOC_CHML', + 'so4_a1_CHMP','so4_a2_CHMP', 'SOAG0_CHMP', 'SOAG1_CHMP', 'SOAG2_CHMP', 'SOAG3_CHMP', 'SOAG4_CHMP', 'TOTH', 'TOT_CLD_VISTAU', + 'TREFHTMN', 'TREFHTMX', 'TROP_P', 'TROP_T', 'TROP_Z', 'TTEND_TOT', 'TTGWORO', 'TTGWSDF', 'TTGWSDFORO', 'TTGWSKE', 'TTGWSKEORO', + 'BURDENBCdn', 'BURDENDUSTdn', 'BURDENPOMdn', 'BURDENSEASALTdn', 'BURDENSO4dn', 'BURDENSOAdn', + 'ABSORB', 'AODABSdn', 'AODBCdn', 'AODdnDUST01', 'AODdnDUST02', 'AODdnDUST03', 'AODdn_aitken', 'AODdn_accum', 'AODdn_coarse', + 'AODDUST02', 'AODDUST', 'AODNIRstdn', 'AODPOMdn', 'AODSO4dn', 'AODSOAdn', 'AODSSdn', 'AODUVdn', 'AODUVstdn', 'AODVIS', + 'AODVISdn', 'AODVISstdn', 'EXTINCTdn', 'EXTINCTNIRdn', 'EXTINCTUVdn', 'EXTxASYMdn', 'FLDSC', 'FLNR', 'FSNR', + 'SOLLD', 'SOLSD', 'SSAVIS', 'SST','TAQ', + 'DCOCHM','DH2O2CHM', 'DHNO3CHM', 'DO3CHM', 'Dso4_a1CHM', 'Dso4_a2CHM', 'Dso4_a3CHM', + 'FLASHFRQ', 'LNO_COL_PROD', 'LNO_PROD','KVH_CLUBB','MASS', 'PDELDRY', 'NITROP_PD','PM25', 'PRECT', 'PTEQ', 'PTTEND', + 'QRLC', 'QRSC', 'QSNOW', 'QRAIN','GS_SO2', 'HNO3_GAS', 'HNO3_NAT', 'HNO3_STS','H2SO4M_C', 'H2SO4_sfnnuc1','HCL_GAS', + 'SAD_AERO', 'SAD_ICE', 'SAD_LNAT', 'SAD_SULFC', 'SAD_TROP' 'RAD_ICE', 'RAD_LNAT', 'RAD_SULFC', 'REFF_AERO', 'RHREFHT', + 'EVAPPREC', 'EVAPQZM', 'EVAPTZM', 'FCTL','FREQZM', 'ZMDQ', 'ZMDT', 'ZMMTT', 'ZMMU','VEL_NAT2', + 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'bc_c1DDF', 'bc_c4DDF', 'dst_c1DDF', 'dst_c2DDF', 'dst_c3DDF', + 'ncl_c1DDF', 'ncl_c2DDF', 'ncl_c3DDF', 'pom_c1DDF', 'pom_c4DDF', 'num_c1DDF','num_c2DDF','num_c3DDF','num_c4DDF', + 'so4_a1_sfgaex1', 'so4_c1AQH2SO4', 'so4_c1AQSO4', 'so4_c1DDF', 'so4_a2_sfgaex1', 'so4_c2AQH2SO4', 'so4_c2AQSO4', 'so4_c2DDF', + 'so4_a3_sfgaex1', 'so4_c3AQH2SO4', 'so4_c3AQSO4', 'so4_c3DDF', 'so4_a2_sfnnuc1', 'num_a2_sfnnuc1', + 'soa1_a1_sfgaex1','soa1_c1DDF', 'soa1_a2_sfgaex1','soa1_c2DDF', 'soa2_a1_sfgaex1','soa2_c1DDF', 'soa2_a2_sfgaex1','soa2_c2DDF', + 'soa3_a1_sfgaex1','soa3_c1DDF', 'soa3_a2_sfgaex1','soa3_c2DDF', 'soa4_a1_sfgaex1','soa4_c1DDF', 'soa4_a2_sfgaex1','soa4_c2DDF', + 'soa5_a1_sfgaex1','soa5_c1DDF', 'soa5_a2_sfgaex1','soa5_c2DDF', 'jcl2o2', 'jh2o2', 'jno2', 'jo2_a', 'jo2_b', 'jo3_a', 'jo3_b', 'jpan', + 'r_het1', 'r_het2', 'r_het3', 'r_het4', 'r_het5', 'r_het6', 'r_het7', 'r_het8', 'r_het9', 'r_het10', 'r_het11', 'r_het12', 'r_het13', + 'r_het15', 'r_het16', 'r_het17', 'r_jsoa1_a1', 'r_jsoa1_a2', 'r_jsoa2_a1', 'r_jsoa2_a2', 'r_jsoa3_a1', 'r_jsoa3_a2', 'r_jsoa4_a1', + 'r_jsoa4_a2', 'r_jsoa5_a1', 'r_jsoa5_a2', 'r_GLYOXAL_aer', 'r_HO2_O3', 'r_N2O5_aer', 'r_NO2_aer', 'r_NO3_aer', 'r_O1D_H2O', 'r_OH_O3', 'r_OH_O', + 'O3_Prod','O3_Loss','O3S_Loss','RO2_NO_sum','O3_alkenes','RO2_NO3_sum','RO2_HO2_sum','RO2_RO2_sum','RCO2_NO2_sum', + 'OddOx_Ox_Loss','OddOx_HOx_Loss','OddOx_NOx_Loss','OddOx_CLOxBROx_Loss','OddOx_Loss_Tot','OddOx_Prod_Tot', 'Ox_Prod','Ox_Loss' diff --git a/bld/namelist_files/use_cases/hist_trop_strat_vbsext_cam6.xml b/bld/namelist_files/use_cases/hist_trop_strat_vbsext_cam6.xml index 8d8ff90bf9..38e1439ed0 100644 --- a/bld/namelist_files/use_cases/hist_trop_strat_vbsext_cam6.xml +++ b/bld/namelist_files/use_cases/hist_trop_strat_vbsext_cam6.xml @@ -46,7 +46,7 @@ - 'CFC11STAR', 'AODDUST', 'AODDUST2', 'T', 'U', 'V', 'O3', 'OH', 'O3S', + 'CFC11STAR', 'AODDUST', 'AODDUST02', 'T', 'U', 'V', 'O3', 'OH', 'O3S', 'NO3', 'HO2', 'LNO_COL_PROD', 'NO2_CLXF', 'SFNO', 'SFNH3', 'BRO', 'CH3CL', 'CLO', 'CO2', 'HCL', 'HO2', 'HOCL', 'H2O', 'PHIS', 'Z3', 'BENZENE', 'C2H2', 'C2H4', 'C2H6', 'C3H8', 'CCL4', 'CFC11', 'CFC113', @@ -81,8 +81,8 @@ 'REFF_AERO', 'PDELDRY', 'RAD_ICE', 'RAD_LNAT', 'RAD_SULFC', 'H2SO4M_C', 'HNO3_GAS', 'HNO3_STS', 'HNO3_NAT', 'VEL_NAT2', 'NITROP_PD', 'NOX', 'NOY', 'CLOX', 'CLOY', 'BROX', 'BROY', 'TCLY', 'TOTH', 'MASS', 'TBRY', 'HCL_GAS', 'wet_deposition_NHx_as_N', 'wet_deposition_NOy_as_N', - 'HCL_GAS', 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'ABSORB', 'AODVISdn', 'AODdnMODE1', 'AODVISstdn', - 'AODNIRstdn', 'AODUVstdn', 'AODdnMODE2', 'AODdnMODE3', 'AODdnDUST1', 'AODdnDUST2', 'AODdnDUST3', 'AODVISstdn', + 'HCL_GAS', 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'ABSORB', 'AODVISdn', 'AODdn_aitken', 'AODVISstdn', + 'AODNIRstdn', 'AODUVstdn', 'AODdn_accum', 'AODdn_coarse', 'AODdnDUST01', 'AODdnDUST02', 'AODdnDUST03', 'AODVISstdn', 'AODUVstdn', 'AODNIRstdn', 'AODNIRstdn', 'AODVISdn', 'AODUVdn', 'EXTINCTdn', 'EXTxASYMdn', 'EXTINCTNIRdn', 'EXTINCTUVdn', 'WD_NC4CH2OH', 'WD_NC4CHO', 'WD_NDEP', 'WD_NH3', 'WD_NH4', 'WD_NHDEP', 'WD_NOA', 'WD_NTERPOOH', 'WD_ONITR', 'WD_PHENOOH', 'WD_POOH', 'WD_ROOH', 'WD_SO2', diff --git a/bld/namelist_files/use_cases/hist_trop_strat_vbsfire_cam6.xml b/bld/namelist_files/use_cases/hist_trop_strat_vbsfire_cam6.xml index 896609e72a..7219cf0322 100644 --- a/bld/namelist_files/use_cases/hist_trop_strat_vbsfire_cam6.xml +++ b/bld/namelist_files/use_cases/hist_trop_strat_vbsfire_cam6.xml @@ -78,7 +78,7 @@ .true. .false. .false. -.false. +.true. .false. .false. .false. @@ -87,104 +87,36 @@ - 'CFC11STAR', 'AODDUST', 'AODDUST2', 'T', 'U', 'V', 'O3', 'OH', 'NO3', 'HO2', - 'LNO_COL_PROD', 'NO2_CLXF', 'SFNO', 'SFNH3', 'BRO', - 'CH3CL', 'CLO', 'CO2', 'HCL', 'HO2', 'HOCL', 'H2O', 'PHIS', 'Z3', - 'BENZENE', 'C2H2', 'C2H4', 'C2H6', 'C3H8', 'CCL4', 'CFC11', 'CFC113', 'CFC12', - 'CH2O', 'CH3BR', 'CH3CCL3', 'CH3CHO', 'CH3CL', 'CH3CN', 'CH3COCH3', 'CH3OH', 'CH4', - 'CO', 'H2O2', 'HCFC22', 'HCN', 'HNO3', 'ISOP', 'MTERP', 'N2O', 'O3', 'O3S', - 'PAN', 'SO2', 'TOLUENE', 'OH', 'ALKNIT', 'ALKOOH', 'BCARY', 'BENZENE', 'BENZOOH', - 'BEPOMUC', 'BIGALD', 'BIGALD1', 'BIGALD2', 'BIGALD3', 'BIGALD4', 'BIGALK', 'BIGENE', 'BR', - 'BRCL', 'BRO', 'BRONO2', 'BRY', 'BZALD', 'BZOOH', 'C2H2', 'C2H4', 'C2H5OH', - 'C2H5OOH', 'C2H6', 'C3H6', 'C3H7OOH', 'C3H8', 'C6H5OOH', 'CCL4', 'CF2CLBR', 'CF3BR', - 'CFC11', 'CFC113', 'CFC114', 'CFC115', 'CFC12', 'CH2BR2', 'CH2O', 'CH3BR', 'CH3CCL3', - 'CH3CHO', 'CH3CL', 'CH3CN', 'CH3COCH3', 'CH3COCHO', 'CH3COOH', 'CH3COOOH', 'CH3OH', 'CH3OOH', - 'CH4', 'CHBR3', 'CL', 'CL2', 'CL2O2', 'CLO', 'CLONO2', 'CLY', 'CO', - 'CO2', 'COF2', 'COFCL', 'CRESOL', 'DMS', 'EOOH', 'F', 'GLYALD', 'GLYOXAL', - 'H', 'H2', 'H2402', 'H2O2', 'H2SO4', 'HBR', 'HCFC141B', 'HCFC142B', 'HCFC22', - 'HCL', 'HCN', 'HCOOH', 'HF', 'HNO3', 'HO2NO2', 'HOBR', 'HOCL', 'HONITR', - 'HPALD', 'HYAC', 'HYDRALD', 'IEPOX', 'ISOP', 'ISOPNITA', 'ISOPNITB', 'ISOPNO3', 'ISOPNOOH', - 'ISOPOOH', 'IVOC', 'MACR', 'MACROOH', 'MEK', 'MEKOOH', 'MPAN', 'MTERP', 'MVK', - 'N', 'N2O', 'N2O5', 'NC4CH2OH', 'NC4CHO', 'NH3', 'NH4', 'NO', - 'NO2', 'NO3', 'NOA', 'NTERPOOH', 'O', 'OCLO', - 'OCS', 'ONITR', 'PAN', 'PBZNIT', 'PHENO', 'PHENOL', 'PHENOOH', 'POOH', 'ROOH', - 'S', 'SF6', 'SO', 'SO2', 'SO3', 'SOAG0', 'SOAG1', 'SOAG2', 'SOAG3', - 'SOAG4', 'SVOC', 'TEPOMUC', 'TERP2OOH', 'TERPNIT', 'TERPOOH', 'TERPROD1', 'TERPROD2', 'TOLOOH', - 'TOLUENE', 'XOOH', 'XYLENES', 'XYLENOOH', 'XYLOL', 'XYLOLOOH', 'NHDEP', 'NDEP', 'ACBZO2', - 'ALKO2', 'BENZO2', 'BZOO', 'C2H5O2', 'C3H7O2', 'C6H5O2', 'CH3CO3', 'CH3O2', 'DICARBO2', - 'ENEO2', 'EO', 'EO2', 'HO2', 'HOCH2OO', 'ISOPAO2', 'ISOPBO2', 'MACRO2', - 'MALO2', 'MCO3', 'MDIALO2', 'MEKO2', 'NTERPO2', - 'O1D', 'OH', 'PHENO2', 'PO2', 'RO2', - 'TERP2O2', 'TERPO2', 'TOLO2', 'XO2', 'XYLENO2', 'XYLOLO2', 'H2O', 'SAD_ICE', 'SAD_LNAT', - 'SAD_SULFC', 'SAD_TROP', 'SAD_AERO', 'REFF_AERO', 'PDELDRY', 'RAD_ICE', 'RAD_LNAT', 'RAD_SULFC', 'H2SO4M_C', - 'HNO3_GAS', 'HNO3_STS', 'HNO3_NAT', 'VEL_NAT2', 'NITROP_PD', 'NOX', 'NOY', 'CLOX', 'CLOY', - 'BROX', 'BROY', 'TCLY', 'TOTH', 'MASS', 'TBRY', 'HCL_GAS', 'wet_deposition_NHx_as_N', 'wet_deposition_NOy_as_N', - 'HCL_GAS', 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'ABSORB', 'AODVISdn', 'AODdnMODE1', 'AODVISstdn', 'AODNIRstdn', - 'AODUVstdn', 'AODdnMODE2', 'AODdnMODE3', 'AODdnDUST1', 'AODdnDUST2', 'AODdnDUST3', 'AODVISstdn', 'AODUVstdn', 'AODNIRstdn', - 'AODNIRstdn', 'AODVISdn', 'AODUVdn', 'EXTINCTdn', 'EXTxASYMdn', 'EXTINCTNIRdn', 'EXTINCTUVdn', 'WD_ALKNIT', 'WD_ALKOOH', - 'WD_BENZOOH', 'WD_BRONO2', 'WD_BZOOH', 'WD_C2H5OH', 'WD_C2H5OOH', 'WD_C3H7OOH', 'WD_C6H5OOH', 'WD_CH2O', 'WD_CH3CHO', - 'WD_CH3CN', 'WD_CH3COCHO', 'WD_CH3COOH', 'WD_CH3COOOH', 'WD_CH3COCH3', 'WD_CH3OH', 'WD_CH3OOH', 'WD_CLONO2', 'WD_COF2', 'WD_COFCL', - 'WD_EOOH', 'WD_GLYALD', 'WD_H2O2', 'WD_H2SO4', 'WD_HBR', 'WD_HCL', 'WD_HCN', 'WD_HCOOH', 'WD_HF', - 'WD_HNO3', 'WD_HO2NO2', 'WD_HOBR', 'WD_HOCL', 'WD_HONITR', 'WD_HPALD', 'WD_HYAC', 'WD_HYDRALD', 'WD_IEPOX', - 'WD_ISOPNITA', 'WD_ISOPNITB', 'WD_ISOPNO3', 'WD_ISOPNOOH', 'WD_ISOPOOH', 'WD_IVOC', 'WD_MACR', 'WD_MACROOH', 'WD_MEKOOH', - 'WD_MVK', 'WD_NC4CH2OH', 'WD_NC4CHO', 'WD_NDEP', 'WD_NH3', 'WD_NH4', 'WD_NHDEP', 'WD_NOA', - 'WD_NTERPOOH', 'WD_ONITR', 'WD_PHENOOH', 'WD_POOH', 'WD_ROOH', 'WD_SO2', 'WD_SOAG0', 'WD_SOAG1', 'WD_SOAG2', - 'WD_SOAG3', 'WD_SOAG4', 'WD_SVOC', 'WD_TERP2OOH', 'WD_TERPNIT', 'WD_TERPOOH', 'WD_TERPROD1', 'WD_TERPROD2', 'WD_TOLOOH', - 'WD_XOOH', 'WD_XYLENOOH', 'WD_XYLOLOOH', 'DF_ALKNIT', 'DF_ALKOOH', 'DF_BENZOOH', 'DF_BZOOH', 'DF_C2H5OH', 'DF_C2H5OOH', - 'DF_C3H7OOH', 'DF_C6H5OOH', 'DF_CH2O', 'DF_CH3CHO', 'DF_CH3CN', 'DF_CH3COCH3', 'DF_CH3COCHO', 'DF_CH3COOH', 'DF_CH3COOOH', - 'DF_CH3OH', 'DF_CH3OOH', 'DF_CO', 'DF_EOOH', 'DF_GLYALD', 'DF_H2O2', 'DF_H2SO4', 'DF_HCN', 'DF_HCOOH', - 'DF_HNO3', 'DF_HO2NO2', 'DF_HONITR', 'DF_HPALD', 'DF_HYAC', 'DF_HYDRALD', 'DF_IEPOX', 'DF_ISOPNITA', 'DF_ISOPNITB', - 'DF_ISOPNO3', 'DF_ISOPNOOH', 'DF_ISOPOOH', 'DF_IVOC', 'DF_MACROOH', 'DF_MEKOOH', 'DF_MPAN', 'DF_NC4CH2OH', 'DF_NC4CHO', - 'dry_deposition_NHx_as_N', 'DF_NH3', 'DF_NH4', 'DF_NO', 'DF_NO2', 'DF_NOA', 'DF_NTERPOOH', 'DF_O3', 'DF_ONITR', - 'DF_PAN', 'DF_PHENOOH', 'DF_POOH', 'DF_ROOH', 'DF_SO2', 'DF_SOAG0', 'DF_SOAG1', 'DF_SOAG2', 'DF_SOAG3', - 'DF_SOAG4', 'DF_SVOC', 'DF_TERP2OOH', 'DF_TERPNIT', 'DF_TERPOOH', 'DF_TERPROD1', 'DF_TERPROD2', 'DF_TOLOOH', 'DF_XOOH', - 'DF_XYLENOOH', 'DF_XYLOLOOH', 'dry_deposition_NOy_as_N', 'SO2_CLXF', 'SO2_XFRC', 'SVOC_CLXF', 'CO_CLXF', 'NO2_CLXF', 'LNO_PROD', - 'LNO_COL_PROD', 'SFISOP', 'SFMTERP', 'SFBCARY', 'SFCH3OH', 'SFC2H5OH', 'SFCH3CHO', 'SFMEK', 'SFHCN', - 'SFCH3CN', 'SFCH2O', 'SFC2H6', 'SFC3H8', 'SFC2H4', 'SFC3H6', 'SFCH3COCH3', 'SFBIGALK', 'SFBIGENE', - 'SFBENZENE', 'SFTOLUENE', 'SFXYLENES', 'SFCO', 'SFNO', 'SFC2H2', 'SFHCOOH', 'SFCH3COOH', 'SFCH3COCH3', - 'SFDMS', 'SFMEK', 'SFSO2', 'SFNH3', 'SFIVOC', 'SFSVOC', 'MEG_ISOP', 'MEG_MTERP', 'MEG_BCARY', - 'MEG_CH3OH', 'MEG_C2H5OH', 'MEG_CH2O', 'MEG_CH3CHO', 'MEG_CH3COOH', 'MEG_CH3COCH3', 'MEG_HCOOH', 'MEG_HCN', 'MEG_CO', - 'MEG_C2H6', 'MEG_C2H4', 'MEG_C3H8', 'MEG_C3H6', 'MEG_BIGALK', 'MEG_BIGENE', 'MEG_TOLUENE', 'Dso4_a1CHM', 'Dso4_a2CHM', - 'Dso4_a3CHM', 'DO3CHM', 'DCOCHM', 'DHNO3CHM', 'DH2O2CHM', 'CH4_CHML', 'CO_CHMP', 'CO_CHML', 'CH3CCL3_CHML', - 'CO2_CHML', 'AQ_SO2', 'GS_SO2', 'SO2_CHML', 'SO2_CHMP', 'SO2_CLXF', 'SOAG0_CHMP', 'SOAG1_CHMP', 'SOAG2_CHMP', - 'SOAG3_CHMP', 'SOAG4_CHMP', 'IVOC_CHMP', 'SVOC_CHML', 'MASS', 'ABSORB', 'WD_H2SO4', 'WD_IVOC', 'WD_SO2', - 'WD_SOAG0', 'WD_SOAG1', 'WD_SOAG2', 'WD_SOAG3', 'WD_SOAG4', 'WD_SVOC', 'DF_CO', 'DF_IVOC', 'DF_O3', - 'DF_SO2', 'DF_SOAG0', 'DF_SOAG1', 'DF_SOAG2', 'DF_SOAG3', 'DF_SOAG4', 'DF_SVOC', 'SO2_CLXF', 'SVOC_CLXF', - 'SFISOP', 'SFMTERP', 'SFCH3OH', 'SFCH3COCH3', 'SFCO', 'SFIVOC', 'SFSVOC', 'DO3CHM', 'DCOCHM', - 'O3_CHMP', 'O3_CHML', 'CH4_CHML', 'CO_CHMP', 'CO_CHML', 'CH3CCL3_CHML', 'SO2_CHML', 'SO2_CHMP', 'SO2_CLXF', - 'SOAG0_CHMP', 'SOAG1_CHMP', 'SOAG2_CHMP', 'SOAG3_CHMP', 'SOAG4_CHMP', - 'r_HO2_O3', 'r_OH_O3', 'r_OH_O', 'r_O1D_H2O', 'r_het1', 'r_het2', 'r_het3', 'r_het4', 'r_het5', 'r_het6', - 'jo3_a', 'jno2', 'jpan', 'jh2o2', 'jcl2o2', 'bc_a1', 'bc_a4', 'dst_a1', 'dst_a2', - 'dst_a3', 'ncl_a1', 'ncl_a1', 'ncl_a2', 'ncl_a3', 'pom_a1', 'pom_a4', 'so4_a1', 'so4_a2', - 'so4_a3', 'soa1_a1', 'soa2_a1', 'soa3_a1', 'soa4_a1', 'soa5_a1', 'soa1_a2', 'soa2_a2', 'soa3_a2', - 'soa4_a2', 'soa5_a2', 'bc_c1', 'bc_c4', 'dst_c1', 'dst_c2', 'dst_c3', 'ncl_c1', 'ncl_c1', - 'ncl_c2', 'ncl_c3', 'pom_c1', 'pom_c4', 'so4_c1', 'so4_c2', 'so4_c3', 'soa1_c1', 'soa2_c1', - 'soa3_c1', 'soa4_c1', 'soa5_c1', 'soa1_c2', 'soa2_c2', 'soa3_c2', 'soa4_c2', 'soa5_c2', - 'num_a1','num_a2','num_a3','num_a4','num_c1','num_c2','num_c3','num_c4', - 'bc_a1SFWET', 'bc_a4SFWET', 'dst_a1SFWET', 'dst_a2SFWET', 'dst_a3SFWET', 'ncl_a1SFWET', 'ncl_a2SFWET', 'ncl_a3SFWET', 'pom_a1SFWET', 'pom_a4SFWET', - 'so4_a1SFWET', 'so4_a2SFWET', 'so4_a3SFWET', 'soa1_a1SFWET', 'soa1_a2SFWET', 'soa2_a1SFWET', 'soa2_a2SFWET', 'soa3_a1SFWET', 'soa3_a2SFWET', - 'soa4_a1SFWET', 'soa4_a2SFWET', 'soa5_a1SFWET', 'soa5_a2SFWET', 'bc_c1SFWET', 'bc_c4SFWET', 'dst_c1SFWET', 'dst_c2SFWET', 'dst_c3SFWET', - 'ncl_c1SFWET', 'ncl_c2SFWET', 'ncl_c3SFWET', 'pom_c1SFWET', 'pom_c4SFWET', 'so4_c1SFWET', 'so4_c2SFWET', 'so4_c3SFWET', 'soa1_c1SFWET', - 'soa1_c2SFWET', 'soa2_c1SFWET', 'soa2_c2SFWET', 'soa3_c1SFWET', 'soa3_c2SFWET', 'soa4_c1SFWET', 'soa4_c2SFWET', 'soa5_c1SFWET', 'soa5_c2SFWET', - 'bc_a1DDF', 'bc_a4DDF', 'dst_a1DDF', 'dst_a2DDF', 'dst_a3DDF', 'ncl_a1DDF', 'ncl_a2DDF', 'ncl_a3DDF', 'pom_a1DDF', - 'pom_a4DDF', 'so4_a1DDF', 'so4_a2DDF', 'so4_a3DDF', 'soa1_a1DDF', 'soa1_a2DDF', 'soa2_a1DDF', 'soa2_a2DDF', 'soa3_a1DDF', - 'soa3_a2DDF', 'soa4_a1DDF', 'soa4_a2DDF', 'soa5_a1DDF', 'soa5_a2DDF', 'bc_c1DDF', 'bc_c4DDF', 'dst_c1DDF', 'dst_c2DDF', - 'dst_c3DDF', 'ncl_c1DDF', 'ncl_c2DDF', 'ncl_c3DDF', 'pom_c1DDF', 'pom_c4DDF', 'so4_c1DDF', 'so4_c2DDF', 'so4_c3DDF', - 'soa1_c1DDF', 'soa1_c2DDF', 'soa2_c1DDF', 'soa2_c2DDF', 'soa3_c1DDF', 'soa3_c2DDF', 'soa4_c1DDF', 'soa4_c2DDF', 'soa5_c1DDF', - 'soa5_c2DDF', 'num_a1DDF', 'num_a2DDF', 'num_a3DDF', 'num_a4DDF', 'num_c1DDF', 'num_c2DDF', 'num_c3DDF', 'num_c4DDF', - 'bc_a4_CLXF', 'pom_a4_CLXF', 'so4_a1_CLXF', 'so4_a2_CLXF', 'num_a1_CLXF', 'num_a2_CLXF', 'SFbc_a4', 'SFpom_a4', 'SFso4_a1', - 'SFso4_a2', 'SFnum_a1', 'SFnum_a2', 'SFnum_a3', 'so4_a1_sfgaex1', 'so4_a2_sfgaex1', 'so4_a3_sfgaex1', 'soa1_a1_sfgaex1', 'soa1_a2_sfgaex1', - 'soa2_a1_sfgaex1', 'soa2_a2_sfgaex1', 'soa3_a1_sfgaex1', 'soa3_a2_sfgaex1', 'soa4_a1_sfgaex1', 'soa4_a2_sfgaex1', 'soa5_a1_sfgaex1', 'soa5_a2_sfgaex1', 'so4_a2_sfnnuc1', - 'so4_c1AQH2SO4', 'so4_c2AQH2SO4', 'so4_c3AQH2SO4', 'so4_c1AQSO4', 'so4_c2AQSO4', 'so4_c3AQSO4', 'SFdst_a1', 'SFdst_a2', 'SFdst_a3', - 'SFncl_a1', 'SFncl_a2', 'SFncl_a3', 'soa1_a1_CHML', 'soa2_a1_CHML', 'soa3_a1_CHML', 'soa4_a1_CHML', 'soa5_a1_CHML', 'soa1_a2_CHML', - 'soa2_a2_CHML', 'soa3_a2_CHML', 'soa4_a2_CHML', 'soa5_a2_CHML', 'so4_a1_CHMP', 'so4_a2_CHMP', 'so4_a3_CHMP', 'soa1_a1_CHMP', 'soa2_a1_CHMP', - 'soa3_a1_CHMP', 'soa4_a1_CHMP', 'soa5_a1_CHMP', 'soa1_a2_CHMP', 'soa2_a2_CHMP', 'soa3_a2_CHMP', 'soa4_a2_CHMP', 'soa5_a2_CHMP', 'r_jsoa1_a1', - 'r_jsoa2_a1', 'r_jsoa3_a1', 'r_jsoa4_a1', 'r_jsoa5_a1', 'r_jsoa1_a2', 'r_jsoa2_a2', 'r_jsoa3_a2', 'r_jsoa4_a2', 'r_jsoa5_a2', - 'r_GLYOXAL_aer', 'H2SO4_sfnnuc1', 'num_a2_sfnnuc1', 'TMOCS', 'TMSO2', 'TMDMS', 'TMso4_a1', 'TMso4_a2', 'TMso4_a3', - 'BURDENDUSTdn', 'BURDENPOMdn', 'BURDENSO4dn', 'BURDENSOAdn', 'BURDENSEASALTdn','BURDENBCdn', 'PM25', - 'O3_Prod','O3_Loss','O3S_Loss','RO2_NO_sum','O3_alkenes','RO2_NO3_sum','RO2_HO2_sum','RO2_RO2_sum','RCO2_NO2_sum', - 'OddOx_Ox_Loss','OddOx_HOx_Loss','OddOx_NOx_Loss','OddOx_CLOxBROx_Loss','OddOx_Loss_Tot','OddOx_Prod_Tot', - 'Ox_Prod','Ox_Loss' + 'ACTREL', 'AQ_SO2', 'AREA', 'BROX', 'BROY', 'BRY', 'CLOX', 'CLOY', 'CLY', 'NOX', 'NOY', 'TBRY', 'TCLY', 'CFC11STAR', + 'BTTGWSPEC', 'BTTGWSDF', 'BTTGWSKE', 'CONCLD', 'CME', 'CMFDQ', 'CMFMC', 'CMFMC_DP', + 'CH3CCL3_CHML', 'CH4_CHML', 'CO2_CHML', 'CO_CHML', 'IVOC_CHML', 'N2O_CHML', 'O3_CHML', 'SO2_CHML', + 'CO_CHMP', 'O3_CHMP', 'SO2_CHMP', 'TMDMS', 'TMOCS', 'TMSO2','TMso4_a1', 'TMso4_a2', 'TMso4_a3', + 'soa1_a1_CHML', 'soa1_a2_CHML', 'soa2_a1_CHML', 'soa2_a2_CHML', 'soa3_a1_CHML', 'soa3_a2_CHML', + 'soa4_a1_CHML', 'soa4_a2_CHML', 'soa5_a1_CHML', 'soa5_a2_CHML', 'SVOC_CHML', + 'so4_a1_CHMP','so4_a2_CHMP', 'SOAG0_CHMP', 'SOAG1_CHMP', 'SOAG2_CHMP', 'SOAG3_CHMP', 'SOAG4_CHMP', 'TOTH', 'TOT_CLD_VISTAU', + 'TREFHTMN', 'TREFHTMX', 'TROP_P', 'TROP_T', 'TROP_Z', 'TTEND_TOT', 'TTGWORO', 'TTGWSDF', 'TTGWSDFORO', 'TTGWSKE', 'TTGWSKEORO', + 'BURDENBCdn', 'BURDENDUSTdn', 'BURDENPOMdn', 'BURDENSEASALTdn', 'BURDENSO4dn', 'BURDENSOAdn', + 'ABSORB', 'AODABSdn', 'AODBCdn', 'AODdnDUST01', 'AODdnDUST02', 'AODdnDUST03', 'AODdn_aitken', 'AODdn_accum', 'AODdn_coarse', + 'AODDUST02', 'AODDUST', 'AODNIRstdn', 'AODPOMdn', 'AODSO4dn', 'AODSOAdn', 'AODSSdn', 'AODUVdn', 'AODUVstdn', 'AODVIS', + 'AODVISdn', 'AODVISstdn', 'EXTINCTdn', 'EXTINCTNIRdn', 'EXTINCTUVdn', 'EXTxASYMdn', 'FLDSC', 'FLNR', 'FSNR', + 'CME', 'CMFDQ', 'CMFMC','CMFMC_DP', 'SOLLD', 'SOLSD', 'SSAVIS', 'SST','TAQ', + 'DCOCHM','DH2O2CHM', 'DHNO3CHM', 'DO3CHM', 'Dso4_a1CHM', 'Dso4_a2CHM', 'Dso4_a3CHM', + 'FLASHFRQ', 'LNO_COL_PROD', 'LNO_PROD','KVH_CLUBB','MASS', 'PDELDRY', 'NITROP_PD','PM25', 'PRECT', 'PTEQ', 'PTTEND', + 'QRLC', 'QRSC', 'QSNOW', 'QRAIN','GS_SO2', 'HNO3_GAS', 'HNO3_NAT', 'HNO3_STS','H2SO4M_C', 'H2SO4_sfnnuc1','HCL_GAS', + 'SAD_AERO', 'SAD_ICE', 'SAD_LNAT', 'SAD_SULFC', 'SAD_TROP' 'RAD_ICE', 'RAD_LNAT', 'RAD_SULFC', 'REFF_AERO', 'RHREFHT', + 'EVAPPREC', 'EVAPQZM', 'EVAPTZM', 'FCTL','FREQZM', 'ZMDQ', 'ZMDT', 'ZMMTT', 'ZMMU','VEL_NAT2', + 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'bc_c1DDF', 'bc_c4DDF', 'dst_c1DDF', 'dst_c2DDF', 'dst_c3DDF', + 'ncl_c1DDF', 'ncl_c2DDF', 'ncl_c3DDF', 'pom_c1DDF', 'pom_c4DDF', 'num_c1DDF','num_c2DDF','num_c3DDF','num_c4DDF', + 'so4_a1_sfgaex1', 'so4_c1AQH2SO4', 'so4_c1AQSO4', 'so4_c1DDF', 'so4_a2_sfgaex1', 'so4_c2AQH2SO4', 'so4_c2AQSO4', 'so4_c2DDF', + 'so4_a3_sfgaex1', 'so4_c3AQH2SO4', 'so4_c3AQSO4', 'so4_c3DDF', 'so4_a2_sfnnuc1', 'num_a2_sfnnuc1', + 'soa1_a1_sfgaex1','soa1_c1DDF', 'soa1_a2_sfgaex1','soa1_c2DDF', 'soa2_a1_sfgaex1','soa2_c1DDF', 'soa2_a2_sfgaex1','soa2_c2DDF', + 'soa3_a1_sfgaex1','soa3_c1DDF', 'soa3_a2_sfgaex1','soa3_c2DDF', 'soa4_a1_sfgaex1','soa4_c1DDF', 'soa4_a2_sfgaex1','soa4_c2DDF', + 'soa5_a1_sfgaex1','soa5_c1DDF', 'soa5_a2_sfgaex1','soa5_c2DDF', 'jcl2o2', 'jh2o2', 'jno2', 'jo2_a', 'jo2_b', 'jo3_a', 'jo3_b', 'jpan', + 'r_het1', 'r_het2', 'r_het3', 'r_het4', 'r_het5', 'r_het6', 'r_het7', 'r_het8', 'r_het9', 'r_het10', 'r_het11', 'r_het12', 'r_het13', + 'r_het15', 'r_het16', 'r_het17', 'r_jsoa1_a1', 'r_jsoa1_a2', 'r_jsoa2_a1', 'r_jsoa2_a2', 'r_jsoa3_a1', 'r_jsoa3_a2', 'r_jsoa4_a1', + 'r_jsoa4_a2', 'r_jsoa5_a1', 'r_jsoa5_a2', 'r_GLYOXAL_aer', 'r_HO2_O3', 'r_N2O5_aer', 'r_NO2_aer', 'r_NO3_aer', 'r_O1D_H2O', 'r_OH_O3', 'r_OH_O', + 'O3_Prod','O3_Loss','O3S_Loss','RO2_NO_sum','O3_alkenes','RO2_NO3_sum','RO2_HO2_sum','RO2_RO2_sum','RCO2_NO2_sum', + 'OddOx_Ox_Loss','OddOx_HOx_Loss','OddOx_NOx_Loss','OddOx_CLOxBROx_Loss','OddOx_Loss_Tot','OddOx_Prod_Tot', 'Ox_Prod','Ox_Loss' diff --git a/bld/namelist_files/use_cases/sd_trop_strat2_cam6.xml b/bld/namelist_files/use_cases/sd_trop_strat2_cam6.xml index 8ef3f6903d..4075ad584c 100644 --- a/bld/namelist_files/use_cases/sd_trop_strat2_cam6.xml +++ b/bld/namelist_files/use_cases/sd_trop_strat2_cam6.xml @@ -51,7 +51,7 @@ - 'CFC11STAR', 'AODDUST', 'AODDUST2', 'T', 'U', 'V', 'O3', 'OH', + 'CFC11STAR', 'AODDUST', 'AODDUST02', 'T', 'U', 'V', 'O3', 'OH', 'NO3', 'HO2', 'LNO_COL_PROD', 'NO2_CLXF', 'SFNO', 'SFNH3', 'BRO', 'CH3CL', 'CLO', 'CO2', 'HCL', 'HO2', 'HOCL', 'H2O', 'PHIS', 'Z3', 'BENZENE', 'C2H2', 'C2H4', 'C2H6', 'C3H8', 'CCL4', 'CFC11', 'CFC113', @@ -85,8 +85,8 @@ 'REFF_AERO', 'PDELDRY', 'RAD_ICE', 'RAD_LNAT', 'RAD_SULFC', 'H2SO4M_C', 'HNO3_GAS', 'HNO3_STS', 'HNO3_NAT', 'VEL_NAT2', 'NITROP_PD', 'NOX', 'NOY', 'CLOX', 'CLOY', 'BROX', 'BROY', 'TCLY', 'TOTH', 'MASS', 'TBRY', 'HCL_GAS', 'wet_deposition_NHx_as_N', 'wet_deposition_NOy_as_N', - 'HCL_GAS', 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'ABSORB', 'AODVISdn', 'AODdnMODE1', 'AODVISstdn', - 'AODNIRstdn', 'AODUVstdn', 'AODdnMODE2', 'AODdnMODE3', 'AODdnDUST1', 'AODdnDUST2', 'AODdnDUST3', 'AODVISstdn', + 'HCL_GAS', 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'ABSORB', 'AODVISdn', 'AODdn_aitken', 'AODVISstdn', + 'AODNIRstdn', 'AODUVstdn', 'AODdn_accum', 'AODdn_coarse', 'AODdnDUST01', 'AODdnDUST02', 'AODdnDUST03', 'AODVISstdn', 'AODUVstdn', 'AODNIRstdn', 'AODNIRstdn', 'AODVISdn', 'AODUVdn', 'EXTINCTdn', 'EXTxASYMdn', 'EXTINCTNIRdn', 'EXTINCTUVdn', 'WD_ALKNIT', 'WD_ALKOOH', 'WD_BENZOOH', 'WD_BRONO2', 'WD_BZOOH', 'WD_C2H5OH', 'WD_C2H5OOH', 'WD_C3H7OOH', 'WD_C6H5OOH', 'WD_CH2O', 'WD_CH3CHO', 'WD_CH3CN', 'WD_CH3COCHO', 'WD_CH3COOH', 'WD_CH3COOOH', diff --git a/bld/namelist_files/use_cases/sd_trop_strat_vbs_cam6.xml b/bld/namelist_files/use_cases/sd_trop_strat_vbs_cam6.xml index 10cf37265a..2fe99cb0eb 100644 --- a/bld/namelist_files/use_cases/sd_trop_strat_vbs_cam6.xml +++ b/bld/namelist_files/use_cases/sd_trop_strat_vbs_cam6.xml @@ -52,113 +52,45 @@ .true. .false. .false. -.false. +.true. .false. .false. .false. .false. .false. - + - 'CFC11STAR', 'AODDUST', 'AODDUST2', 'T', 'U', 'V', 'O3', 'OH', 'NO3', 'HO2', - 'LNO_COL_PROD', 'NO2_CLXF', 'SFNO', 'SFNH3', 'BRO', - 'CH3CL', 'CLO', 'CO2', 'HCL', 'HO2', 'HOCL', 'H2O', 'PHIS', 'Z3', - 'BENZENE', 'C2H2', 'C2H4', 'C2H6', 'C3H8', 'CCL4', 'CFC11', 'CFC113', 'CFC12', - 'CH2O', 'CH3BR', 'CH3CCL3', 'CH3CHO', 'CH3CL', 'CH3CN', 'CH3COCH3', 'CH3OH', 'CH4', - 'CO', 'H2O2', 'HCFC22', 'HCN', 'HNO3', 'ISOP', 'MTERP', 'N2O', 'O3', 'O3S', - 'PAN', 'SO2', 'TOLUENE', 'OH', 'ALKNIT', 'ALKOOH', 'BCARY', 'BENZENE', 'BENZOOH', - 'BEPOMUC', 'BIGALD', 'BIGALD1', 'BIGALD2', 'BIGALD3', 'BIGALD4', 'BIGALK', 'BIGENE', 'BR', - 'BRCL', 'BRO', 'BRONO2', 'BRY', 'BZALD', 'BZOOH', 'C2H2', 'C2H4', 'C2H5OH', - 'C2H5OOH', 'C2H6', 'C3H6', 'C3H7OOH', 'C3H8', 'C6H5OOH', 'CCL4', 'CF2CLBR', 'CF3BR', - 'CFC11', 'CFC113', 'CFC114', 'CFC115', 'CFC12', 'CH2BR2', 'CH2O', 'CH3BR', 'CH3CCL3', - 'CH3CHO', 'CH3CL', 'CH3CN', 'CH3COCH3', 'CH3COCHO', 'CH3COOH', 'CH3COOOH', 'CH3OH', 'CH3OOH', - 'CH4', 'CHBR3', 'CL', 'CL2', 'CL2O2', 'CLO', 'CLONO2', 'CLY', 'CO', - 'CO2', 'COF2', 'COFCL', 'CRESOL', 'DMS', 'EOOH', 'F', 'GLYALD', 'GLYOXAL', - 'H', 'H2', 'H2402', 'H2O2', 'H2SO4', 'HBR', 'HCFC141B', 'HCFC142B', 'HCFC22', - 'HCL', 'HCN', 'HCOOH', 'HF', 'HNO3', 'HO2NO2', 'HOBR', 'HOCL', 'HONITR', - 'HPALD', 'HYAC', 'HYDRALD', 'IEPOX', 'ISOP', 'ISOPNITA', 'ISOPNITB', 'ISOPNO3', 'ISOPNOOH', - 'ISOPOOH', 'IVOC', 'MACR', 'MACROOH', 'MEK', 'MEKOOH', 'MPAN', 'MTERP', 'MVK', - 'N', 'N2O', 'N2O5', 'NC4CH2OH', 'NC4CHO', 'NH3', 'NH4', 'NO', - 'NO2', 'NO3', 'NOA', 'NTERPOOH', 'O', 'OCLO', - 'OCS', 'ONITR', 'PAN', 'PBZNIT', 'PHENO', 'PHENOL', 'PHENOOH', 'POOH', 'ROOH', - 'S', 'SF6', 'SO', 'SO2', 'SO3', 'SOAG0', 'SOAG1', 'SOAG2', 'SOAG3', - 'SOAG4', 'SVOC', 'TEPOMUC', 'TERP2OOH', 'TERPNIT', 'TERPOOH', 'TERPROD1', 'TERPROD2', 'TOLOOH', - 'TOLUENE', 'XOOH', 'XYLENES', 'XYLENOOH', 'XYLOL', 'XYLOLOOH', 'NHDEP', 'NDEP', 'ACBZO2', - 'ALKO2', 'BENZO2', 'BZOO', 'C2H5O2', 'C3H7O2', 'C6H5O2', 'CH3CO3', 'CH3O2', 'DICARBO2', - 'ENEO2', 'EO', 'EO2', 'HO2', 'HOCH2OO', 'ISOPAO2', 'ISOPBO2', 'MACRO2', - 'MALO2', 'MCO3', 'MDIALO2', 'MEKO2', 'NTERPO2', - 'O1D', 'OH', 'PHENO2', 'PO2', 'RO2', - 'TERP2O2', 'TERPO2', 'TOLO2', 'XO2', 'XYLENO2', 'XYLOLO2', 'H2O', 'SAD_ICE', 'SAD_LNAT', - 'SAD_SULFC', 'SAD_TROP', 'SAD_AERO', 'REFF_AERO', 'PDELDRY', 'RAD_ICE', 'RAD_LNAT', 'RAD_SULFC', 'H2SO4M_C', - 'HNO3_GAS', 'HNO3_STS', 'HNO3_NAT', 'VEL_NAT2', 'NITROP_PD', 'NOX', 'NOY', 'CLOX', 'CLOY', - 'BROX', 'BROY', 'TCLY', 'TOTH', 'MASS', 'TBRY', 'HCL_GAS', 'wet_deposition_NHx_as_N', 'wet_deposition_NOy_as_N', - 'HCL_GAS', 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'ABSORB', 'AODVISdn', 'AODdnMODE1', 'AODVISstdn', 'AODNIRstdn', - 'AODUVstdn', 'AODdnMODE2', 'AODdnMODE3', 'AODdnDUST1', 'AODdnDUST2', 'AODdnDUST3', 'AODVISstdn', 'AODUVstdn', 'AODNIRstdn', - 'AODNIRstdn', 'AODVISdn', 'AODUVdn', 'EXTINCTdn', 'EXTxASYMdn', 'EXTINCTNIRdn', 'EXTINCTUVdn', 'WD_ALKNIT', 'WD_ALKOOH', - 'WD_BENZOOH', 'WD_BRONO2', 'WD_BZOOH', 'WD_C2H5OH', 'WD_C2H5OOH', 'WD_C3H7OOH', 'WD_C6H5OOH', 'WD_CH2O', 'WD_CH3CHO', - 'WD_CH3CN', 'WD_CH3COCHO', 'WD_CH3COOH', 'WD_CH3COOOH', 'WD_CH3COCH3', 'WD_CH3OH', 'WD_CH3OOH', 'WD_CLONO2', 'WD_COF2', 'WD_COFCL', - 'WD_EOOH', 'WD_GLYALD', 'WD_H2O2', 'WD_H2SO4', 'WD_HBR', 'WD_HCL', 'WD_HCN', 'WD_HCOOH', 'WD_HF', - 'WD_HNO3', 'WD_HO2NO2', 'WD_HOBR', 'WD_HOCL', 'WD_HONITR', 'WD_HPALD', 'WD_HYAC', 'WD_HYDRALD', 'WD_IEPOX', - 'WD_ISOPNITA', 'WD_ISOPNITB', 'WD_ISOPNO3', 'WD_ISOPNOOH', 'WD_ISOPOOH', 'WD_IVOC', 'WD_MACR', 'WD_MACROOH', 'WD_MEKOOH', - 'WD_MVK', 'WD_NC4CH2OH', 'WD_NC4CHO', 'WD_NDEP', 'WD_NH3', 'WD_NH4', 'WD_NHDEP', 'WD_NOA', - 'WD_NTERPOOH', 'WD_ONITR', 'WD_PHENOOH', 'WD_POOH', 'WD_ROOH', 'WD_SO2', 'WD_SOAG0', 'WD_SOAG1', 'WD_SOAG2', - 'WD_SOAG3', 'WD_SOAG4', 'WD_SVOC', 'WD_TERP2OOH', 'WD_TERPNIT', 'WD_TERPOOH', 'WD_TERPROD1', 'WD_TERPROD2', 'WD_TOLOOH', - 'WD_XOOH', 'WD_XYLENOOH', 'WD_XYLOLOOH', 'DF_ALKNIT', 'DF_ALKOOH', 'DF_BENZOOH', 'DF_BZOOH', 'DF_C2H5OH', 'DF_C2H5OOH', - 'DF_C3H7OOH', 'DF_C6H5OOH', 'DF_CH2O', 'DF_CH3CHO', 'DF_CH3CN', 'DF_CH3COCH3', 'DF_CH3COCHO', 'DF_CH3COOH', 'DF_CH3COOOH', - 'DF_CH3OH', 'DF_CH3OOH', 'DF_CO', 'DF_EOOH', 'DF_GLYALD', 'DF_H2O2', 'DF_H2SO4', 'DF_HCN', 'DF_HCOOH', - 'DF_HNO3', 'DF_HO2NO2', 'DF_HONITR', 'DF_HPALD', 'DF_HYAC', 'DF_HYDRALD', 'DF_IEPOX', 'DF_ISOPNITA', 'DF_ISOPNITB', - 'DF_ISOPNO3', 'DF_ISOPNOOH', 'DF_ISOPOOH', 'DF_IVOC', 'DF_MACROOH', 'DF_MEKOOH', 'DF_MPAN', 'DF_NC4CH2OH', 'DF_NC4CHO', - 'dry_deposition_NHx_as_N', 'DF_NH3', 'DF_NH4', 'DF_NO', 'DF_NO2', 'DF_NOA', 'DF_NTERPOOH', 'DF_O3', 'DF_ONITR', - 'DF_PAN', 'DF_PHENOOH', 'DF_POOH', 'DF_ROOH', 'DF_SO2', 'DF_SOAG0', 'DF_SOAG1', 'DF_SOAG2', 'DF_SOAG3', - 'DF_SOAG4', 'DF_SVOC', 'DF_TERP2OOH', 'DF_TERPNIT', 'DF_TERPOOH', 'DF_TERPROD1', 'DF_TERPROD2', 'DF_TOLOOH', 'DF_XOOH', - 'DF_XYLENOOH', 'DF_XYLOLOOH', 'dry_deposition_NOy_as_N', 'SO2_CLXF', 'SO2_XFRC', 'SVOC_CLXF', 'CO_CLXF', 'NO2_CLXF', 'LNO_PROD', - 'LNO_COL_PROD', 'SFISOP', 'SFMTERP', 'SFBCARY', 'SFCH3OH', 'SFC2H5OH', 'SFCH3CHO', 'SFMEK', 'SFHCN', - 'SFCH3CN', 'SFCH2O', 'SFC2H6', 'SFC3H8', 'SFC2H4', 'SFC3H6', 'SFCH3COCH3', 'SFBIGALK', 'SFBIGENE', - 'SFBENZENE', 'SFTOLUENE', 'SFXYLENES', 'SFCO', 'SFNO', 'SFC2H2', 'SFHCOOH', 'SFCH3COOH', 'SFCH3COCH3', - 'SFDMS', 'SFMEK', 'SFSO2', 'SFNH3', 'SFIVOC', 'SFSVOC', 'MEG_ISOP', 'MEG_MTERP', 'MEG_BCARY', - 'MEG_CH3OH', 'MEG_C2H5OH', 'MEG_CH2O', 'MEG_CH3CHO', 'MEG_CH3COOH', 'MEG_CH3COCH3', 'MEG_HCOOH', 'MEG_HCN', 'MEG_CO', - 'MEG_C2H6', 'MEG_C2H4', 'MEG_C3H8', 'MEG_C3H6', 'MEG_BIGALK', 'MEG_BIGENE', 'MEG_TOLUENE', 'Dso4_a1CHM', 'Dso4_a2CHM', - 'Dso4_a3CHM', 'DO3CHM', 'DCOCHM', 'DHNO3CHM', 'DH2O2CHM', 'CH4_CHML', 'CO_CHMP', 'CO_CHML', 'CH3CCL3_CHML', - 'CO2_CHML', 'AQ_SO2', 'GS_SO2', 'SO2_CHML', 'SO2_CHMP', 'SO2_CLXF', 'SOAG0_CHMP', 'SOAG1_CHMP', 'SOAG2_CHMP', - 'SOAG3_CHMP', 'SOAG4_CHMP', 'IVOC_CHMP', 'SVOC_CHML', 'MASS', 'ABSORB', 'WD_H2SO4', 'WD_IVOC', 'WD_SO2', - 'WD_SOAG0', 'WD_SOAG1', 'WD_SOAG2', 'WD_SOAG3', 'WD_SOAG4', 'WD_SVOC', 'DF_CO', 'DF_IVOC', 'DF_O3', - 'DF_SO2', 'DF_SOAG0', 'DF_SOAG1', 'DF_SOAG2', 'DF_SOAG3', 'DF_SOAG4', 'DF_SVOC', 'SO2_CLXF', 'SVOC_CLXF', - 'SFISOP', 'SFMTERP', 'SFCH3OH', 'SFCH3COCH3', 'SFCO', 'SFIVOC', 'SFSVOC', 'DO3CHM', 'DCOCHM', - 'O3_CHMP', 'O3_CHML', 'CH4_CHML', 'CO_CHMP', 'CO_CHML', 'CH3CCL3_CHML', 'SO2_CHML', 'SO2_CHMP', 'SO2_CLXF', - 'SOAG0_CHMP', 'SOAG1_CHMP', 'SOAG2_CHMP', 'SOAG3_CHMP', 'SOAG4_CHMP', - 'r_HO2_O3', 'r_OH_O3', 'r_OH_O', 'r_O1D_H2O', 'r_het1', 'r_het2', 'r_het3', 'r_het4', 'r_het5', 'r_het6', - 'jo3_a', 'jno2', 'jpan', 'jh2o2', 'jcl2o2', 'bc_a1', 'bc_a4', 'dst_a1', 'dst_a2', - 'dst_a3', 'ncl_a1', 'ncl_a1', 'ncl_a2', 'ncl_a3', 'pom_a1', 'pom_a4', 'so4_a1', 'so4_a2', - 'so4_a3', 'soa1_a1', 'soa2_a1', 'soa3_a1', 'soa4_a1', 'soa5_a1', 'soa1_a2', 'soa2_a2', 'soa3_a2', - 'soa4_a2', 'soa5_a2', 'bc_c1', 'bc_c4', 'dst_c1', 'dst_c2', 'dst_c3', 'ncl_c1', 'ncl_c1', - 'ncl_c2', 'ncl_c3', 'pom_c1', 'pom_c4', 'so4_c1', 'so4_c2', 'so4_c3', 'soa1_c1', 'soa2_c1', - 'soa3_c1', 'soa4_c1', 'soa5_c1', 'soa1_c2', 'soa2_c2', 'soa3_c2', 'soa4_c2', 'soa5_c2', - 'num_a1','num_a2','num_a3','num_a4','num_c1','num_c2','num_c3','num_c4', - 'bc_a1SFWET', 'bc_a4SFWET', 'dst_a1SFWET', 'dst_a2SFWET', 'dst_a3SFWET', 'ncl_a1SFWET', 'ncl_a2SFWET', 'ncl_a3SFWET', 'pom_a1SFWET', 'pom_a4SFWET', - 'so4_a1SFWET', 'so4_a2SFWET', 'so4_a3SFWET', 'soa1_a1SFWET', 'soa1_a2SFWET', 'soa2_a1SFWET', 'soa2_a2SFWET', 'soa3_a1SFWET', 'soa3_a2SFWET', - 'soa4_a1SFWET', 'soa4_a2SFWET', 'soa5_a1SFWET', 'soa5_a2SFWET', 'bc_c1SFWET', 'bc_c4SFWET', 'dst_c1SFWET', 'dst_c2SFWET', 'dst_c3SFWET', - 'ncl_c1SFWET', 'ncl_c2SFWET', 'ncl_c3SFWET', 'pom_c1SFWET', 'pom_c4SFWET', 'so4_c1SFWET', 'so4_c2SFWET', 'so4_c3SFWET', 'soa1_c1SFWET', - 'soa1_c2SFWET', 'soa2_c1SFWET', 'soa2_c2SFWET', 'soa3_c1SFWET', 'soa3_c2SFWET', 'soa4_c1SFWET', 'soa4_c2SFWET', 'soa5_c1SFWET', 'soa5_c2SFWET', - 'bc_a1DDF', 'bc_a4DDF', 'dst_a1DDF', 'dst_a2DDF', 'dst_a3DDF', 'ncl_a1DDF', 'ncl_a2DDF', 'ncl_a3DDF', 'pom_a1DDF', - 'pom_a4DDF', 'so4_a1DDF', 'so4_a2DDF', 'so4_a3DDF', 'soa1_a1DDF', 'soa1_a2DDF', 'soa2_a1DDF', 'soa2_a2DDF', 'soa3_a1DDF', - 'soa3_a2DDF', 'soa4_a1DDF', 'soa4_a2DDF', 'soa5_a1DDF', 'soa5_a2DDF', 'bc_c1DDF', 'bc_c4DDF', 'dst_c1DDF', 'dst_c2DDF', - 'dst_c3DDF', 'ncl_c1DDF', 'ncl_c2DDF', 'ncl_c3DDF', 'pom_c1DDF', 'pom_c4DDF', 'so4_c1DDF', 'so4_c2DDF', 'so4_c3DDF', - 'soa1_c1DDF', 'soa1_c2DDF', 'soa2_c1DDF', 'soa2_c2DDF', 'soa3_c1DDF', 'soa3_c2DDF', 'soa4_c1DDF', 'soa4_c2DDF', 'soa5_c1DDF', - 'soa5_c2DDF', 'num_a1DDF', 'num_a2DDF', 'num_a3DDF', 'num_a4DDF', 'num_c1DDF', 'num_c2DDF', 'num_c3DDF', 'num_c4DDF', - 'bc_a4_CLXF', 'pom_a4_CLXF', 'so4_a1_CLXF', 'so4_a2_CLXF', 'num_a1_CLXF', 'num_a2_CLXF', 'SFbc_a4', 'SFpom_a4', 'SFso4_a1', - 'SFso4_a2', 'SFnum_a1', 'SFnum_a2', 'SFnum_a3', 'so4_a1_sfgaex1', 'so4_a2_sfgaex1', 'so4_a3_sfgaex1', 'soa1_a1_sfgaex1', 'soa1_a2_sfgaex1', - 'soa2_a1_sfgaex1', 'soa2_a2_sfgaex1', 'soa3_a1_sfgaex1', 'soa3_a2_sfgaex1', 'soa4_a1_sfgaex1', 'soa4_a2_sfgaex1', 'soa5_a1_sfgaex1', 'soa5_a2_sfgaex1', 'so4_a2_sfnnuc1', - 'so4_c1AQH2SO4', 'so4_c2AQH2SO4', 'so4_c3AQH2SO4', 'so4_c1AQSO4', 'so4_c2AQSO4', 'so4_c3AQSO4', 'SFdst_a1', 'SFdst_a2', 'SFdst_a3', - 'SFncl_a1', 'SFncl_a2', 'SFncl_a3', 'soa1_a1_CHML', 'soa2_a1_CHML', 'soa3_a1_CHML', 'soa4_a1_CHML', 'soa5_a1_CHML', 'soa1_a2_CHML', - 'soa2_a2_CHML', 'soa3_a2_CHML', 'soa4_a2_CHML', 'soa5_a2_CHML', 'so4_a1_CHMP', 'so4_a2_CHMP', 'so4_a3_CHMP', 'soa1_a1_CHMP', 'soa2_a1_CHMP', - 'soa3_a1_CHMP', 'soa4_a1_CHMP', 'soa5_a1_CHMP', 'soa1_a2_CHMP', 'soa2_a2_CHMP', 'soa3_a2_CHMP', 'soa4_a2_CHMP', 'soa5_a2_CHMP', 'r_jsoa1_a1', - 'r_jsoa2_a1', 'r_jsoa3_a1', 'r_jsoa4_a1', 'r_jsoa5_a1', 'r_jsoa1_a2', 'r_jsoa2_a2', 'r_jsoa3_a2', 'r_jsoa4_a2', 'r_jsoa5_a2', - 'r_GLYOXAL_aer', 'H2SO4_sfnnuc1', 'num_a2_sfnnuc1', 'TMOCS', 'TMSO2', 'TMDMS', 'TMso4_a1', 'TMso4_a2', 'TMso4_a3', - 'BURDENDUSTdn', 'BURDENPOMdn', 'BURDENSO4dn', 'BURDENSOAdn', 'BURDENSEASALTdn','BURDENBCdn', 'PM25', - 'O3_Prod','O3_Loss','O3S_Loss','RO2_NO_sum','O3_alkenes','RO2_NO3_sum','RO2_HO2_sum','RO2_RO2_sum','RCO2_NO2_sum', - 'OddOx_Ox_Loss','OddOx_HOx_Loss','OddOx_NOx_Loss','OddOx_CLOxBROx_Loss','OddOx_Loss_Tot','OddOx_Prod_Tot', - 'Ox_Prod','Ox_Loss' + 'ACTREL', 'AQ_SO2', 'AREA', 'BROX', 'BROY', 'BRY', 'CLOX', 'CLOY', 'CLY', 'NOX', 'NOY', 'TBRY', 'TCLY', 'CFC11STAR', + 'BTTGWSPEC', 'BTTGWSDF', 'BTTGWSKE', 'CONCLD', 'CME', 'CMFDQ', 'CMFMC', 'CMFMC_DP', + 'CH3CCL3_CHML', 'CH4_CHML', 'CO2_CHML', 'CO_CHML', 'IVOC_CHML', 'N2O_CHML', 'O3_CHML', 'SO2_CHML', + 'CO_CHMP', 'O3_CHMP', 'SO2_CHMP', 'TMDMS', 'TMOCS', 'TMSO2','TMso4_a1', 'TMso4_a2', 'TMso4_a3', + 'soa1_a1_CHML', 'soa1_a2_CHML', 'soa2_a1_CHML', 'soa2_a2_CHML', 'soa3_a1_CHML', 'soa3_a2_CHML', + 'soa4_a1_CHML', 'soa4_a2_CHML', 'soa5_a1_CHML', 'soa5_a2_CHML', 'SVOC_CHML', + 'so4_a1_CHMP','so4_a2_CHMP', 'SOAG0_CHMP', 'SOAG1_CHMP', 'SOAG2_CHMP', 'SOAG3_CHMP', 'SOAG4_CHMP', 'TOTH', 'TOT_CLD_VISTAU', + 'TREFHTMN', 'TREFHTMX', 'TROP_P', 'TROP_T', 'TROP_Z', 'TTEND_TOT', 'TTGWORO', 'TTGWSDF', 'TTGWSDFORO', 'TTGWSKE', 'TTGWSKEORO', + 'BURDENBCdn', 'BURDENDUSTdn', 'BURDENPOMdn', 'BURDENSEASALTdn', 'BURDENSO4dn', 'BURDENSOAdn', + 'ABSORB', 'AODABSdn', 'AODBCdn', 'AODdnDUST01', 'AODdnDUST02', 'AODdnDUST03', 'AODdn_aitken', 'AODdn_accum', 'AODdn_coarse', + 'AODDUST02', 'AODDUST', 'AODNIRstdn', 'AODPOMdn', 'AODSO4dn', 'AODSOAdn', 'AODSSdn', 'AODUVdn', 'AODUVstdn', 'AODVIS', + 'AODVISdn', 'AODVISstdn', 'EXTINCTdn', 'EXTINCTNIRdn', 'EXTINCTUVdn', 'EXTxASYMdn', 'FLDSC', 'FLNR', 'FSNR', + 'CME', 'CMFDQ', 'CMFMC','CMFMC_DP', 'SOLLD', 'SOLSD', 'SSAVIS', 'SST','TAQ', + 'DCOCHM','DH2O2CHM', 'DHNO3CHM', 'DO3CHM', 'Dso4_a1CHM', 'Dso4_a2CHM', 'Dso4_a3CHM', + 'FLASHFRQ', 'LNO_COL_PROD', 'LNO_PROD','KVH_CLUBB','MASS', 'PDELDRY', 'NITROP_PD','PM25', 'PRECT', 'PTEQ', 'PTTEND', + 'QRLC', 'QRSC', 'QSNOW', 'QRAIN','GS_SO2', 'HNO3_GAS', 'HNO3_NAT', 'HNO3_STS','H2SO4M_C', 'H2SO4_sfnnuc1','HCL_GAS', + 'SAD_AERO', 'SAD_ICE', 'SAD_LNAT', 'SAD_SULFC', 'SAD_TROP' 'RAD_ICE', 'RAD_LNAT', 'RAD_SULFC', 'REFF_AERO', 'RHREFHT', + 'EVAPPREC', 'EVAPQZM', 'EVAPTZM', 'FCTL','FREQZM', 'ZMDQ', 'ZMDT', 'ZMMTT', 'ZMMU','VEL_NAT2', + 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'bc_c1DDF', 'bc_c4DDF', 'dst_c1DDF', 'dst_c2DDF', 'dst_c3DDF', + 'ncl_c1DDF', 'ncl_c2DDF', 'ncl_c3DDF', 'pom_c1DDF', 'pom_c4DDF', 'num_c1DDF','num_c2DDF','num_c3DDF','num_c4DDF', + 'so4_a1_sfgaex1', 'so4_c1AQH2SO4', 'so4_c1AQSO4', 'so4_c1DDF', 'so4_a2_sfgaex1', 'so4_c2AQH2SO4', 'so4_c2AQSO4', 'so4_c2DDF', + 'so4_a3_sfgaex1', 'so4_c3AQH2SO4', 'so4_c3AQSO4', 'so4_c3DDF', 'so4_a2_sfnnuc1', 'num_a2_sfnnuc1', + 'soa1_a1_sfgaex1','soa1_c1DDF', 'soa1_a2_sfgaex1','soa1_c2DDF', 'soa2_a1_sfgaex1','soa2_c1DDF', 'soa2_a2_sfgaex1','soa2_c2DDF', + 'soa3_a1_sfgaex1','soa3_c1DDF', 'soa3_a2_sfgaex1','soa3_c2DDF', 'soa4_a1_sfgaex1','soa4_c1DDF', 'soa4_a2_sfgaex1','soa4_c2DDF', + 'soa5_a1_sfgaex1','soa5_c1DDF', 'soa5_a2_sfgaex1','soa5_c2DDF', 'jcl2o2', 'jh2o2', 'jno2', 'jo2_a', 'jo2_b', 'jo3_a', 'jo3_b', 'jpan', + 'r_het1', 'r_het2', 'r_het3', 'r_het4', 'r_het5', 'r_het6', 'r_het7', 'r_het8', 'r_het9', 'r_het10', 'r_het11', 'r_het12', 'r_het13', + 'r_het15', 'r_het16', 'r_het17', 'r_jsoa1_a1', 'r_jsoa1_a2', 'r_jsoa2_a1', 'r_jsoa2_a2', 'r_jsoa3_a1', 'r_jsoa3_a2', 'r_jsoa4_a1', + 'r_jsoa4_a2', 'r_jsoa5_a1', 'r_jsoa5_a2', 'r_GLYOXAL_aer', 'r_HO2_O3', 'r_N2O5_aer', 'r_NO2_aer', 'r_NO3_aer', 'r_O1D_H2O', 'r_OH_O3', 'r_OH_O', + 'O3_Prod','O3_Loss','O3S_Loss','RO2_NO_sum','O3_alkenes','RO2_NO3_sum','RO2_HO2_sum','RO2_RO2_sum','RCO2_NO2_sum', + 'OddOx_Ox_Loss','OddOx_HOx_Loss','OddOx_NOx_Loss','OddOx_CLOxBROx_Loss','OddOx_Loss_Tot','OddOx_Prod_Tot', 'Ox_Prod','Ox_Loss' diff --git a/bld/namelist_files/use_cases/sd_waccm_tsmlt_cam6.xml b/bld/namelist_files/use_cases/sd_waccm_tsmlt_cam6.xml index 4c862f997c..8397165538 100644 --- a/bld/namelist_files/use_cases/sd_waccm_tsmlt_cam6.xml +++ b/bld/namelist_files/use_cases/sd_waccm_tsmlt_cam6.xml @@ -68,8 +68,8 @@ 'AOA1SRC', 'AOA2SRC', 'NO2_CMXF' - 'ABSORB', 'ACBZO2', 'ACTREL', 'ALKNIT', 'ALKO2', 'ALKOOH', 'AOA1', 'AOA_NH', 'AODABSdn', 'AODBCdn', 'AODdnDUST1', 'AODdnDUST2', - 'AODdnDUST3', 'AODdnMODE1', 'AODdnMODE2', 'AODdnMODE3', 'AODDUST2', 'AODDUST', 'AODNIRstdn', 'AODPOMdn', 'AODSO4dn', 'AODSOAdn', 'AODSSdn', + 'ABSORB', 'ACBZO2', 'ACTREL', 'ALKNIT', 'ALKO2', 'ALKOOH', 'AOA1', 'AOA_NH', 'AODABSdn', 'AODBCdn', 'AODdnDUST01', 'AODdnDUST02', + 'AODdnDUST03', 'AODdn_aitken', 'AODdn_accum', 'AODdn_coarse', 'AODDUST02', 'AODDUST', 'AODNIRstdn', 'AODPOMdn', 'AODSO4dn', 'AODSOAdn', 'AODSSdn', 'AODUVdn', 'AODUVstdn', 'AODVIS', 'AODVISdn', 'AODVISstdn', 'AQ_SO2', 'AREA', 'AREI', 'AREL', 'bc_a1', 'bc_a1DDF', 'bc_a1SFWET', 'bc_a4', 'bc_a4_CLXF', 'bc_a4DDF', 'bc_a4SFWET', 'BCARY', 'bc_c1', 'bc_c1DDF', 'bc_c1SFWET', 'bc_c4', 'bc_c4DDF', 'bc_c4SFWET', 'BENZENE', 'BENZO2', 'BENZOOH', 'BEPOMUC', 'BIGALD1', 'BIGALD2', 'BIGALD3', 'BIGALD4', 'BIGALD', 'BIGALK', 'BIGENE', @@ -120,7 +120,7 @@ 'S', 'SAD_AERO', 'SAD_ICE', 'SAD_LNAT', 'SAD_SULFC', 'SAD_TROP', 'SF6', 'SFbc_a4', 'SFBCARY', 'SFBENZENE', 'SFBIGALK', 'SFBIGENE', 'SFC2H2', 'SFC2H4', 'SFC2H5OH', 'SFC2H6', 'SFC3H6', 'SFC3H8', 'SFCH2O', 'SFCH3CHO', 'SFCH3CN', 'SFCH3COCH3', 'SFCH3COCHO', 'SFCH3COOH', 'SFCH3OH', 'SFCO', 'SFDMS', 'SFdst_a1', 'SFdst_a2', 'SFdst_a3', 'SFGLYALD', 'SFHCN', 'SFHCOOH', - 'SFISOP', 'SFIVOC', 'SFMEK', 'SFMTERP', 'SFncl_a1', 'SFncl_a2', 'SFncl_a3', 'SFNH3', 'SFNO2', 'SFNO', 'SFnum_a1', 'SFnum_a2', + 'SFISOP', 'SFIVOC', 'SFMEK', 'SFMTERP', 'SFncl_a1', 'SFncl_a2', 'SFncl_a3', 'SFNH3', 'SFNO', 'SFnum_a1', 'SFnum_a2', 'SFnum_a3', 'SFpom_a4', 'SFSO2', 'SFso4_a1', 'SFso4_a2', 'SFSVOC', 'SFTOLUENE', 'SFXYLENES', 'SHFLX', 'SO2', 'SO2_CHML', 'SO2_CHMP', 'SO2_CLXF', 'SO2_XFRC', 'SO3', 'so4_a1', 'so4_a1_CHMP', 'so4_a1_CLXF', 'so4_a1DDF', 'so4_a1_sfgaex1', 'so4_a1SFWET', 'so4_a2', 'so4_a2_CHMP', 'so4_a2_CLXF', 'so4_a2DDF', 'so4_a2_sfgaex1', 'so4_a2_sfnnuc1', 'so4_a2SFWET', 'so4_a3', diff --git a/bld/namelist_files/use_cases/sd_waccmx_ma_cam6.xml b/bld/namelist_files/use_cases/sd_waccmx_ma_cam6.xml index c67531174b..6b56c46b17 100644 --- a/bld/namelist_files/use_cases/sd_waccmx_ma_cam6.xml +++ b/bld/namelist_files/use_cases/sd_waccmx_ma_cam6.xml @@ -62,11 +62,11 @@ 0, -1, -24, -24, -120, -24, -120, -240 1, 24, 7, 7, 10, 365, 73, 30 - - - 'Z3', 'T', 'TIon', 'TElec', 'e', 'U', 'V', 'OMEGA', 'UI', 'VI', 'WI', 'ElecColDens', 'PHIM2D', 'PS', - 'PED_CONDUCTANCE', 'HALL_CONDUCTANCE', 'ED1', 'ED2' 'O', 'O2', 'H', 'NO', 'CO2', 'N', 'O1D', 'Op2P', 'Op2D', 'Op', - 'Np', 'N2p', 'O2p', 'NOp', 'QJOULE', 'SIGMAHAL', 'SIGMAPED', 'SolIonRate_Tot', 'QRS_TOT', 'QO3', 'QCO2', + + + 'Z3', 'T', 'TIon', 'TElec', 'e', 'U', 'V', 'OMEGA', 'UI', 'VI', 'WI', 'ElecColDens', 'PHIM2D', 'PS', + 'PED_CONDUCTANCE', 'HALL_CONDUCTANCE', 'ED1', 'ED2' 'O', 'O2', 'H', 'NO', 'CO2', 'N', 'O1D', 'Op2P', 'Op2D', 'Op', + 'Np', 'N2p', 'O2p', 'NOp', 'QJOULE', 'SIGMAHAL', 'SIGMAPED', 'SolIonRate_Tot', 'QRS_TOT', 'QO3', 'QCO2', 'QNO', 'QO3P', 'QHC2S', 'QJOULE', 'EKGW', 'TTGW', 'UTGW_TOTAL', 'T_24_COS', 'T_24_SIN', 'T_12_COS', 'T_12_SIN', 'T_08_COS', 'T_08_SIN', 'U_24_COS', 'U_24_SIN', 'U_12_COS', 'U_12_SIN', 'U_08_COS', 'U_08_SIN', @@ -75,49 +75,49 @@ 'ALATM', 'ALONM', 'AOA1', 'AOA2', 'BR', 'BRCL', 'BRO', 'BRONO2', 'CCL4', 'CF2CLBR', 'CF3BR', 'CFC11', 'CFC113', 'CFC12', 'CH2O', 'CH3BR', 'CH3CCL3', 'CH3CL', 'CH3O2', 'CH3OOH', 'CH4', 'CL', 'CL2', 'CL2O2', 'CLDHGH', 'CLDLOW', 'CLDMED', 'CLDTOT', 'CLO', 'CLONO2', 'CLOUD', 'CO', - 'DTCOND', 'DTV', 'DUV', 'DVV', 'FLNS', 'FLNSC', 'FLNT', 'FLNTC','FSDS', 'FSNS', 'FSNSC', 'FSNT', 'FSNTC', - 'H2', 'H2O', 'H2O2', 'HBR', 'HCFC22', 'HCL', 'HNO3', 'HO2', 'HO2NO2', 'HOBR', 'HOCL', 'HORZ', - 'LANDFRAC', 'LHFLX', 'N2O', 'N2O5', 'NO2', 'NO3', 'O3', 'OCLO', 'OCNFRAC', 'OH', 'PHIS', + 'DTCOND', 'DTV', 'DUV', 'DVV', 'FLNS', 'FLNSC', 'FLNT', 'FLNTC','FSDS', 'FSNS', 'FSNSC', 'FSNT', 'FSNTC', + 'H2', 'H2O', 'H2O2', 'HBR', 'HCFC22', 'HCL', 'HNO3', 'HO2', 'HO2NO2', 'HOBR', 'HOCL', 'HORZ', + 'LANDFRAC', 'LHFLX', 'N2O', 'N2O5', 'NO2', 'NO3', 'O3', 'OCLO', 'OCNFRAC', 'OH', 'PHIS', 'PRECC', 'PRECL', 'Q', 'QFLX', 'QRL', 'QRS', 'RELHUM', 'SHFLX', 'SOLIN', 'SWCF', 'QCP', 'QTHERMAL', 'QRL_TOT', 'PSL', 'HNO3_STS', 'HNO3_NAT', 'HNO3_GAS', 'NO_Aircraft', 'NO_Lightning', 'QRS_AUR', 'QRS_CO2NIR', 'QRS_EUV', 'SAD_ICE', 'SAD_LNAT', 'SAD_SULFC', 'TREFHT', - 'VERT', 'VTGWORO', 'VTGWSPEC', 'O2_1S', 'O2_1D', 'NOX', 'NOY', 'CLOX', 'CLOY', 'BROX', 'BROY', - 'TCLY', 'TOTH', 'UIONTEND', 'VIONTEND', 'DTCORE', 'CLDLIQ', 'CLDICE', 'CONCLD', 'FRONTGF:I', - 'BTAUE', 'BTAUW', 'BTAUN', 'BTAUS', 'TAUE', 'TAUW', 'TAUN', 'TAUS', 'TAUGWX', 'TAUGWY', 'TAUX', 'TAUY', + 'VERT', 'VTGWORO', 'VTGWSPEC', 'O2_1S', 'O2_1D', 'NOX', 'NOY', 'CLOX', 'CLOY', 'BROX', 'BROY', + 'TCLY', 'TOTH', 'UIONTEND', 'VIONTEND', 'DTCORE', 'CLDLIQ', 'CLDICE', 'CONCLD', 'FRONTGF:I', + 'BTAUE', 'BTAUW', 'BTAUN', 'BTAUS', 'TAUE', 'TAUW', 'TAUN', 'TAUS', 'TAUGWX', 'TAUGWY', 'TAUX', 'TAUY', 'SNOWHLND', 'SNOWHICE', 'ICEFRAC', 'FSDSC', 'SFNO', 'SFCO', 'SFCH2O', 'CFC11STAR', 'TROPP_FD', 'KVH', 'KVM', 'KVT', 'Qbkgndtot', 'Z3GM', 'OpDens', 'EDens' - - - 'Z3', 'T', 'TIon', 'TElec', 'e', 'U', 'V', 'OMEGA', 'UI', 'VI', 'WI', 'ElecColDens', 'PHIM2D', 'PS', + + + 'Z3', 'T', 'TIon', 'TElec', 'e', 'U', 'V', 'OMEGA', 'UI', 'VI', 'WI', 'ElecColDens', 'PHIM2D', 'PS', 'PED_CONDUCTANCE', 'HALL_CONDUCTANCE', 'ED1', 'ED2', 'O', 'O2', 'H' - - - 'Z3', 'T', 'TIon', 'TElec', 'e', 'U', 'V', 'OMEGA', 'UI', 'VI', 'WI', 'ElecColDens', 'PHIM2D', 'PS', - 'PED_CONDUCTANCE', 'HALL_CONDUCTANCE', 'ED1', 'ED2', 'O', 'O2', 'H', 'NO', 'CO2', 'N', 'O1D', + + + 'Z3', 'T', 'TIon', 'TElec', 'e', 'U', 'V', 'OMEGA', 'UI', 'VI', 'WI', 'ElecColDens', 'PHIM2D', 'PS', + 'PED_CONDUCTANCE', 'HALL_CONDUCTANCE', 'ED1', 'ED2', 'O', 'O2', 'H', 'NO', 'CO2', 'N', 'O1D', 'Op2P', 'Op2D', 'Op', 'Np', 'N2p', 'O2p', 'NOp', 'QJOULE', 'SIGMAHAL', 'SIGMAPED', 'SolIonRate_Tot', 'Z3GM', 'OpDens', 'EDens' - - - 'Z3', 'T', 'TIon', 'TElec', 'e', 'U', 'V', 'OMEGA', 'UI', 'VI', 'WI', 'ElecColDens', 'PHIM2D', 'PS', - 'PED_CONDUCTANCE', 'HALL_CONDUCTANCE', 'ED1', 'ED2', 'O', 'O2', 'H', 'NO', 'CO2', 'N', 'QRS_TOT', - 'QO3', 'QCO2', 'QNO', 'QO3P', 'QHC2S', 'QJOULE', 'EKGW', 'TTGW', 'UTGW_TOTAL', + + + 'Z3', 'T', 'TIon', 'TElec', 'e', 'U', 'V', 'OMEGA', 'UI', 'VI', 'WI', 'ElecColDens', 'PHIM2D', 'PS', + 'PED_CONDUCTANCE', 'HALL_CONDUCTANCE', 'ED1', 'ED2', 'O', 'O2', 'H', 'NO', 'CO2', 'N', 'QRS_TOT', + 'QO3', 'QCO2', 'QNO', 'QO3P', 'QHC2S', 'QJOULE', 'EKGW', 'TTGW', 'UTGW_TOTAL', 'SolIonRate_Tot', 'Z3GM', 'OpDens', 'EDens' - - + + 'T_24_COS', 'T_24_SIN', 'T_12_COS', 'T_12_SIN', 'T_08_COS', 'T_08_SIN', 'U_24_COS', 'U_24_SIN', 'U_12_COS', 'U_12_SIN', 'U_08_COS', 'U_08_SIN', 'V_24_COS', 'V_24_SIN', 'V_12_COS', 'V_12_SIN', 'V_08_COS', 'V_08_SIN', 'OMEGA_24_COS', 'OMEGA_24_SIN', 'OMEGA_12_COS', 'OMEGA_12_SIN', 'OMEGA_08_COS', 'OMEGA_08_SIN' - + 'MSKtem','PS','PSL','VTHzm','UVzm','UWzm','Uzm','Vzm','THzm','Wzm','PHIS' - + 'PS', 'PSL', 'U', 'V', 'T', 'Z3', 'PHIS', 'FRONTGF:I', 'OMEGA', 'O3', 'REFF_AERO', 'SAD_AERO', 'so4_a1', 'so4_a2', 'so4_a3', 'AODVISstdn', 'NITROP_PD', @@ -135,9 +135,4 @@ .false. .false. - - 'SolIonRate_Tot = jeuv_1 + jeuv_2 + jeuv_3 + jeuv_4 + jeuv_5 + jeuv_6 + jeuv_7 + jeuv_8 + jeuv_9 + jeuv_10 + jeuv_11 + jeuv_14 + jeuv_15 + jeuv_16 +', - 'jeuv_17 + jeuv_18 + jeuv_19 + jeuv_20 + jeuv_21 + jeuv_22 + jeuv_23', - - diff --git a/bld/namelist_files/use_cases/waccm_sc_2000_cam6.xml b/bld/namelist_files/use_cases/waccm_sc_2000_cam6.xml index 8625224f69..cdb217a987 100644 --- a/bld/namelist_files/use_cases/waccm_sc_2000_cam6.xml +++ b/bld/namelist_files/use_cases/waccm_sc_2000_cam6.xml @@ -84,18 +84,18 @@ 'so4_a1 -> $INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_so4_a1_anthro-ag-ship_surface_2000climo_0.9x1.25_c20170616.nc', 'so4_a1 -> $INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_so4_a1_bb_surface_2000climo_0.9x1.25_c20170322.nc', 'so4_a2 -> $INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_so4_a2_anthro-res_surface_2000climo_0.9x1.25_c20170616.nc', - 'SOAE -> 4.4323D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_BENZENE_anthro_surface_2000climo_0.9x1.25_c20170608.nc', - 'SOAE -> 4.4323D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_BENZENE_bb_surface_2000climo_0.9x1.25_c20170322.nc', - 'SOAE -> 1.2021D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_ISOP_bb_surface_2000climo_0.9x1.25_c20170322.nc', - 'SOAE -> 6.6625D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_MTERP_bb_surface_2000climo_0.9x1.25_c20170322.nc', - 'SOAE -> 9.9042D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_TOLUENE_anthro_surface_2000climo_0.9x1.25_c20170608.nc', - 'SOAE -> 9.9042D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_TOLUENE_bb_surface_2000climo_0.9x1.25_c20170322.nc', - 'SOAE -> 8.3792D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_XYLENES_anthro_surface_2000climo_0.9x1.25_c20170608.nc', - 'SOAE -> 8.3792D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_XYLENES_bb_surface_2000climo_0.9x1.25_c20170322.nc', - 'SOAE -> 8.6865D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_IVOC_anthro_surface_2000climo_0.9x1.25_c20170608.nc', - 'SOAE -> 8.6865D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_IVOC_bb_surface_2000climo_0.9x1.25_c20170322.nc', - 'SOAE -> 16.8188D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_SVOC_anthro_surface_2000climo_0.9x1.25_c20170608.nc', - 'SOAE -> 16.8188D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_SVOC_bb_surface_2000climo_0.9x1.25_c20170322.nc' + 'SOAE -> 2.5592D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_BENZENE_anthro_surface_2000climo_0.9x1.25_c20170608.nc', + 'SOAE -> 2.5592D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_BENZENE_bb_surface_2000climo_0.9x1.25_c20170322.nc', + 'SOAE -> 0.5954D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_ISOP_bb_surface_2000climo_0.9x1.25_c20170322.nc', + 'SOAE -> 5.1004D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_MTERP_bb_surface_2000climo_0.9x1.25_c20170322.nc', + 'SOAE -> 8.2367D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_TOLUENE_anthro_surface_2000climo_0.9x1.25_c20170608.nc', + 'SOAE -> 8.2367D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_TOLUENE_bb_surface_2000climo_0.9x1.25_c20170322.nc', + 'SOAE -> 6.5013D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_XYLENES_anthro_surface_2000climo_0.9x1.25_c20170608.nc', + 'SOAE -> 6.5013D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_XYLENES_bb_surface_2000climo_0.9x1.25_c20170322.nc', + 'SOAE -> 8.5371D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_IVOC_anthro_surface_2000climo_0.9x1.25_c20170608.nc', + 'SOAE -> 8.5371D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_IVOC_bb_surface_2000climo_0.9x1.25_c20170322.nc', + 'SOAE -> 16.650D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_SVOC_anthro_surface_2000climo_0.9x1.25_c20170608.nc', + 'SOAE -> 16.650D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_SVOC_bb_surface_2000climo_0.9x1.25_c20170322.nc' diff --git a/bld/namelist_files/use_cases/waccm_sc_2010_cam6.xml b/bld/namelist_files/use_cases/waccm_sc_2010_cam6.xml index d24823caab..d878ba8f6d 100644 --- a/bld/namelist_files/use_cases/waccm_sc_2010_cam6.xml +++ b/bld/namelist_files/use_cases/waccm_sc_2010_cam6.xml @@ -84,18 +84,18 @@ 'so4_a1 -> $INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_so4_a1_anthro-ag-ship_surface_2010climo_0.9x1.25_c20180918.nc', 'so4_a1 -> $INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_so4_a1_bb_surface_2010climo_0.9x1.25_c20180918.nc', 'so4_a2 -> $INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_so4_a2_anthro-res_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 4.4323D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_BENZENE_anthro_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 4.4323D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_BENZENE_bb_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 1.2021D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_ISOP_bb_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 6.6625D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_MTERP_bb_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 9.9042D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_TOLUENE_anthro_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 9.9042D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_TOLUENE_bb_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 8.3792D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_XYLENES_anthro_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 8.3792D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_XYLENES_bb_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 8.6865D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_IVOC_anthro_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 8.6865D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_IVOC_bb_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 16.8188D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_SVOC_anthro_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 16.8188D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_SVOC_bb_surface_2010climo_0.9x1.25_c20180918.nc' + 'SOAE -> 2.5592D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_BENZENE_anthro_surface_2010climo_0.9x1.25_c20180918.nc', + 'SOAE -> 2.5592D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_BENZENE_bb_surface_2010climo_0.9x1.25_c20180918.nc', + 'SOAE -> 0.5954D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_ISOP_bb_surface_2010climo_0.9x1.25_c20180918.nc', + 'SOAE -> 5.1004D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_MTERP_bb_surface_2010climo_0.9x1.25_c20180918.nc', + 'SOAE -> 8.2367D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_TOLUENE_anthro_surface_2010climo_0.9x1.25_c20180918.nc', + 'SOAE -> 8.2367D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_TOLUENE_bb_surface_2010climo_0.9x1.25_c20180918.nc', + 'SOAE -> 6.5013D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_XYLENES_anthro_surface_2010climo_0.9x1.25_c20180918.nc', + 'SOAE -> 6.5013D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_XYLENES_bb_surface_2010climo_0.9x1.25_c20180918.nc', + 'SOAE -> 8.5371D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_IVOC_anthro_surface_2010climo_0.9x1.25_c20180918.nc', + 'SOAE -> 8.5371D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_IVOC_bb_surface_2010climo_0.9x1.25_c20180918.nc', + 'SOAE -> 16.650D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_SVOC_anthro_surface_2010climo_0.9x1.25_c20180918.nc', + 'SOAE -> 16.650D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_SVOC_bb_surface_2010climo_0.9x1.25_c20180918.nc' CYCLICAL diff --git a/bld/namelist_files/use_cases/waccm_tsmlt_1850_cam6.xml b/bld/namelist_files/use_cases/waccm_tsmlt_1850_cam6.xml index cf01e5431a..800b9b228a 100644 --- a/bld/namelist_files/use_cases/waccm_tsmlt_1850_cam6.xml +++ b/bld/namelist_files/use_cases/waccm_tsmlt_1850_cam6.xml @@ -66,85 +66,36 @@ 'AOA1SRC', 'AOA2SRC', 'NO2_CMXF', 'NO2_CLXF' - 'ABSORB', 'ACBZO2', 'ACTREL', 'ALKNIT', 'ALKO2', 'ALKOOH', 'AOA1', 'AOA_NH', 'AODABSdn', 'AODBCdn', 'AODdnDUST1', 'AODdnDUST2', - 'AODdnDUST3', 'AODdnMODE1', 'AODdnMODE2', 'AODdnMODE3', 'AODDUST2', 'AODDUST', 'AODNIRstdn', 'AODPOMdn', 'AODSO4dn', 'AODSOAdn', 'AODSSdn', - 'AODUVdn', 'AODUVstdn', 'AODVIS', 'AODVISdn', 'AODVISstdn', 'AQ_SO2', 'AREA', 'AREI', 'AREL', 'bc_a1', 'bc_a1DDF', - 'bc_a1SFWET', 'bc_a4', 'bc_a4_CLXF', 'bc_a4DDF', 'bc_a4SFWET', 'BCARY', 'bc_c1', 'bc_c1DDF', 'bc_c1SFWET', 'bc_c4', 'bc_c4DDF', - 'bc_c4SFWET', 'BENZENE', 'BENZO2', 'BENZOOH', 'BEPOMUC', 'BIGALD1', 'BIGALD2', 'BIGALD3', 'BIGALD4', 'BIGALD', 'BIGALK', 'BIGENE', - 'BR', 'BRCL', 'BRO', 'BRONO2', 'BROX', 'BROY', 'BRY', 'BTTGWSPEC', 'BTTGWSDF', 'BTTGWSKE', - 'BURDENBCdn', 'BURDENDUSTdn', 'BURDENPOMdn', 'BURDENSEASALTdn', 'BURDENSO4dn', - 'BURDENSOAdn', 'BUTGWSPEC', 'BZALD', 'BZOO', 'BZOOH', 'C2H2', 'C2H4', 'C2H5O2', 'C2H5OH', 'C2H5OOH', 'C2H6', 'C3H6', 'C3H7O2', - 'C3H7OOH', 'C3H8', 'C6H5O2', 'C6H5OOH', 'CCL4', 'CDNUMC', 'CF2CLBR', 'CF3BR', 'CFC113', 'CFC114', 'CFC115', 'CFC11', 'CFC11STAR', - 'CFC12', 'CH2BR2', 'CH2O', 'CH3BR', 'CH3CCL3', 'CH3CCL3_CHML', 'CH3CHO', 'CH3CL', 'CH3CN', 'CH3CO3', 'CH3COCH3', 'CH3COCHO', - 'CH3COOH', 'CH3COOOH', 'CH3O2', 'CH3OH', 'CH3OOH', 'CH4', 'CH4_CHML', 'CHBR3', 'CL2', 'CL2O2', 'CL', - 'CLDICE', 'CLDLIQ', 'CLDTOT', 'CLO', 'CLONO2', 'CLOUD', 'CLOX', 'CLOY', 'CLY', 'CME', 'CMFDQ', 'CMFMC', - 'CMFMC_DP', 'CO2', 'CO2_CHML', 'CO', 'CO_CHML', 'CO_CHMP', 'COF2', 'COFCL', 'CONCLD', 'CRESOL', - 'DCOCHM', 'DF_ALKNIT', 'DF_ALKOOH', 'DF_BENZOOH', 'DF_BZOOH', 'DF_C2H5OH', 'DF_C2H5OOH', 'DF_C3H7OOH', 'DF_C6H5OOH', 'DF_CH2O', - 'DF_CH3CHO', 'DF_CH3CN', 'DF_CH3COCH3', 'DF_CH3COCHO', 'DF_CH3COOH', 'DF_CH3COOOH', 'DF_CH3OH', 'DF_CH3OOH', 'DF_CO', 'DF_EOOH', - 'DF_GLYALD', 'DF_H2O2', 'DF_H2SO4', 'DF_HCN', 'DF_HCOOH', 'DF_HNO3', 'DF_HO2NO2', 'DF_HONITR', 'DF_HPALD', 'DF_HYAC', 'DF_HYDRALD', - 'DF_IEPOX', 'DF_ISOPNITA', 'DF_ISOPNITB', 'DF_ISOPNO3', 'DF_ISOPNOOH', 'DF_ISOPOOH', 'DF_IVOC', 'DF_MACROOH', 'DF_MEKOOH', - 'DF_MPAN', 'DF_NC4CH2OH', 'DF_NC4CHO', 'DF_NH3', 'DF_NH4', 'DF_NO2', 'DF_NO', 'DF_NOA', 'DF_NTERPOOH', 'DF_O3', - 'DF_ONITR', 'DF_PAN', 'DF_PHENOOH', 'DF_POOH', 'DF_ROOH', 'DF_SO2', 'DF_SOAG0', 'DF_SOAG1', 'DF_SOAG2', 'DF_SOAG3', - 'DF_SOAG4', 'DF_SVOC', 'DF_TERP2OOH', 'DF_TERPNIT', 'DF_TERPOOH', 'DF_TERPROD1', 'DF_TERPROD2', 'DF_TOLOOH', 'DF_XOOH', 'DF_XYLENOOH', - 'DF_XYLOLOOH', 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'DH2O2CHM', 'DHNO3CHM', 'DICARBO2', 'DMS', 'DO3CHM', 'dry_deposition_NHx_as_N', - 'dry_deposition_NOy_as_N', 'Dso4_a1CHM', 'Dso4_a2CHM', 'Dso4_a3CHM', 'dst_a1', 'dst_a1DDF', 'dst_a1SFWET', 'dst_a2', 'dst_a2DDF', - 'dst_a2SFWET', 'dst_a3', 'dst_a3DDF', 'dst_a3SFWET', 'dst_c1', 'dst_c1DDF', 'dst_c1SFWET', 'dst_c2', 'dst_c2DDF', 'dst_c2SFWET', - 'dst_c3', 'dst_c3DDF', 'dst_c3SFWET', 'DTCORE', 'E90', 'e', 'ENEO2', 'EO2', 'EO', 'EOOH', 'EVAPPREC', - 'EVAPQZM', 'EVAPTZM', 'EXTINCTdn', 'EXTINCTNIRdn', 'EXTINCTUVdn', 'EXTxASYMdn', 'F', 'FCTL', - 'FLASHFRQ', 'FLDS', 'FLDSC', 'FLNR', 'FLNS', 'FLNSC', 'FLNT', 'FLNTC', 'FLUT', 'FLUTC', 'FREQI', 'FREQL', 'FREQZM', 'FSDS', - 'FSDSC', 'FSNR', 'FSNS', 'FSNSC', 'FSNT', 'FSNTC', 'FSNTOAC', 'FSUTOA', 'GLYALD', 'GLYOXAL', - 'GS_SO2', 'H2402', 'H2', 'H2O2', 'H2O', 'H2SO4', 'H2SO4M_C', 'H2SO4_sfnnuc1', 'H', 'HBR', 'HCFC141B', 'HCFC142B', 'HCFC22', 'HCL', - 'HCL_GAS', 'HCN', 'HCOOH', 'HF', 'HNO3', 'HNO3_GAS', 'HNO3_NAT', 'HNO3_STS', 'HO2', 'HO2NO2', 'HOBR', 'HOCH2OO', 'HOCL', 'HONITR', - 'HPALD', 'HYAC', 'HYDRALD', 'ICEFRAC', 'IEPOX', 'ISOP', 'ISOPAO2', 'ISOPBO2', 'ISOPNITA', 'ISOPNITB', 'ISOPNO3', - 'ISOPNOOH', 'ISOPOOH', 'IVOC', 'IVOC_CHML', 'jcl2o2', 'jh2o2', 'jno2', 'jo2_a', 'jo2_b', 'jo3_a', 'jo3_b', 'jpan', 'KVH_CLUBB', - 'LANDFRAC', 'LHFLX', 'LNO_COL_PROD', 'LNO_PROD', 'MACR', 'MACRO2', 'MACROOH', 'MALO2', 'MASS', 'MCO3', 'MDIALO2', - 'MEG_BCARY', 'MEG_BIGALK', 'MEG_BIGENE', 'MEG_C2H4', 'MEG_C2H5OH', 'MEG_C2H6', 'MEG_C3H6', 'MEG_C3H8', 'MEG_CH2O', - 'MEG_CH3CHO', 'MEG_CH3COCH3', 'MEG_CH3COOH', 'MEG_CH3OH', 'MEG_CO', 'MEG_HCN', 'MEG_HCOOH', 'MEG_ISOP', 'MEG_MTERP', 'MEG_TOLUENE', - 'MEK', 'MEKO2', 'MEKOOH', 'MPAN', 'MTERP', 'MVK', 'N2D', 'N2O5', 'N2O', 'N2O_CHML', 'N2p', 'N', 'NC4CH2OH', - 'NC4CHO', 'ncl_a1', 'ncl_a1DDF', 'ncl_a1SFWET', 'ncl_a2', 'ncl_a2DDF', 'ncl_a2SFWET', 'ncl_a3', 'ncl_a3DDF', 'ncl_a3SFWET', 'ncl_c1', - 'ncl_c1DDF', 'ncl_c1SFWET', 'ncl_c2', 'ncl_c2DDF', 'ncl_c2SFWET', 'ncl_c3', 'ncl_c3DDF', 'ncl_c3SFWET', 'NDEP', 'NH3', 'NH4', 'NH_50', - 'NH_5', 'NHDEP', 'NITROP_PD', 'NO2', 'NO2_CLXF', 'NO3', 'NO', 'NOA', 'NOp', 'NOX', 'NOY', 'Np', 'NTERPO2', 'NTERPOOH', - 'num_a1', 'num_a1_CLXF', 'num_a1DDF', 'num_a2', 'num_a2_CLXF', 'num_a2DDF', 'num_a2_sfnnuc1', 'num_a3', 'num_a3DDF', 'num_a4', - 'num_a4DDF', 'num_c1', 'num_c1DDF', 'num_c2', 'num_c2DDF', 'num_c3', 'num_c3DDF', 'num_c4', 'num_c4DDF', 'NUMLIQ', 'O1D', 'O2_1D', - 'O2_1S', 'O2', 'O2p', 'O3', 'O3S', 'O3_CHML', 'O3_CHMP', 'O', 'OCLO', 'OCS', 'OH', 'OMEGA', 'OMEGAT', 'ONITR', 'Op', - 'PAN', 'PBLH', 'PBZNIT', 'PDELDRY', 'PHENO2', 'PHENO', 'PHENOL', 'PHENOOH', 'PHIS', 'PM25', 'PO2', 'pom_a1', 'pom_a1DDF', 'pom_a1SFWET', - 'pom_a4', 'pom_a4DDF', 'pom_a4SFWET', 'pom_c1', 'pom_c1DDF', 'pom_c1SFWET', 'pom_c4', 'pom_c4DDF', 'pom_c4SFWET', - 'POOH', 'PRECC', 'PRECT', 'PS', 'PSL', 'PTEQ', 'PTTEND', 'Q', 'QFLX', 'QRAIN', 'QREFHT', 'QRL', 'QRLC', 'QRS', - 'QRSC', 'QSNOW', 'RAD_ICE', 'RAD_LNAT', 'RAD_SULFC', 'REFF_AERO', 'RELHUM', 'r_GLYOXAL_aer', - 'r_het10', 'r_het11', 'r_het12', 'r_het13', 'r_het15', 'r_het16', 'r_het17', 'r_het1', 'r_het2', 'r_het3', 'r_het4', 'r_het5', - 'r_het6', 'r_het7', 'r_het8', 'r_het9', 'r_HO2_O3', 'RHREFHT', 'r_jsoa1_a1', 'r_jsoa1_a2', 'r_jsoa2_a1', 'r_jsoa2_a2', - 'r_jsoa3_a1', 'r_jsoa3_a2', 'r_jsoa4_a1', 'r_jsoa4_a2', 'r_jsoa5_a1', 'r_jsoa5_a2', 'r_N2O5_aer', 'r_NO2_aer', 'r_NO3_aer', 'r_O1D_H2O', - 'r_OH_O3', 'r_OH_O', 'ROOH', 'RO2', - 'S', 'SAD_AERO', 'SAD_ICE', 'SAD_LNAT', 'SAD_SULFC', 'SAD_TROP', 'SF6', 'SFbc_a4', 'SFBCARY', - 'SFBENZENE', 'SFBIGALK', 'SFBIGENE', 'SFC2H2', 'SFC2H4', 'SFC2H5OH', 'SFC2H6', 'SFC3H6', 'SFC3H8', 'SFCH2O', 'SFCH3CHO', 'SFCH3CN', - 'SFCH3COCH3', 'SFCH3COCHO', 'SFCH3COOH', 'SFCH3OH', 'SFCO', 'SFDMS', 'SFdst_a1', 'SFdst_a2', 'SFdst_a3', 'SFGLYALD', 'SFHCN', 'SFHCOOH', - 'SFISOP', 'SFIVOC', 'SFMEK', 'SFMTERP', 'SFncl_a1', 'SFncl_a2', 'SFncl_a3', 'SFNH3', 'SFNO2', 'SFNO', 'SFnum_a1', 'SFnum_a2', - 'SFnum_a3', 'SFpom_a4', 'SFSO2', 'SFso4_a1', 'SFso4_a2', 'SFSVOC', 'SFTOLUENE', 'SFXYLENES', 'SHFLX', 'SO2', - 'SO2_CHML', 'SO2_CHMP', 'SO2_CLXF', 'SO2_XFRC', 'SO3', 'so4_a1', 'so4_a1_CHMP', 'so4_a1_CLXF', 'so4_a1DDF', 'so4_a1_sfgaex1', 'so4_a1SFWET', - 'so4_a2', 'so4_a2_CHMP', 'so4_a2_CLXF', 'so4_a2DDF', 'so4_a2_sfgaex1', 'so4_a2_sfnnuc1', 'so4_a2SFWET', 'so4_a3', - 'so4_a3DDF', 'so4_a3_sfgaex1', 'so4_a3SFWET', 'so4_c1', 'so4_c1AQH2SO4', 'so4_c1AQSO4', 'so4_c1DDF', 'so4_c1SFWET', 'so4_c2', 'so4_c2AQH2SO4', - 'so4_c2AQSO4', 'so4_c2DDF', 'so4_c2SFWET', 'so4_c3', 'so4_c3AQH2SO4', 'so4_c3AQSO4', 'so4_c3DDF', 'so4_c3SFWET', 'SO', 'soa1_a1', - 'soa1_a1_CHML', 'soa1_a1DDF', 'soa1_a1_sfgaex1', 'soa1_a1SFWET', 'soa1_a2', 'soa1_a2_CHML', 'soa1_a2DDF', - 'soa1_a2_sfgaex1', 'soa1_a2SFWET', 'soa1_c1', 'soa1_c1DDF', 'soa1_c1SFWET', 'soa1_c2', 'soa1_c2DDF', 'soa1_c2SFWET', 'soa2_a1', 'soa2_a1_CHML', - 'soa2_a1DDF', 'soa2_a1_sfgaex1', 'soa2_a1SFWET', 'soa2_a2', 'soa2_a2_CHML', 'soa2_a2DDF', 'soa2_a2_sfgaex1', - 'soa2_a2SFWET', 'soa2_c1', 'soa2_c1DDF', 'soa2_c1SFWET', 'soa2_c2', 'soa2_c2DDF', 'soa2_c2SFWET', 'soa3_a1', 'soa3_a1_CHML', - 'soa3_a1DDF', 'soa3_a1_sfgaex1', 'soa3_a1SFWET', 'soa3_a2', 'soa3_a2_CHML', 'soa3_a2DDF', 'soa3_a2_sfgaex1', 'soa3_a2SFWET', - 'soa3_c1', 'soa3_c1DDF', 'soa3_c1SFWET', 'soa3_c2', 'soa3_c2DDF', 'soa3_c2SFWET', 'soa4_a1', 'soa4_a1_CHML', 'soa4_a1DDF', - 'soa4_a1_sfgaex1', 'soa4_a1SFWET', 'soa4_a2', 'soa4_a2_CHML', 'soa4_a2DDF', 'soa4_a2_sfgaex1', 'soa4_a2SFWET', 'soa4_c1', - 'soa4_c1DDF', 'soa4_c1SFWET', 'soa4_c2', 'soa4_c2DDF', 'soa4_c2SFWET', 'soa5_a1', 'soa5_a1_CHML', 'soa5_a1DDF', 'soa5_a1_sfgaex1', - 'soa5_a1SFWET', 'soa5_a2', 'soa5_a2_CHML', 'soa5_a2DDF', 'soa5_a2_sfgaex1', 'soa5_a2SFWET', 'soa5_c1', 'soa5_c1DDF', - 'soa5_c1SFWET', 'soa5_c2', 'soa5_c2DDF', 'soa5_c2SFWET', 'SOAG0', 'SOAG0_CHMP', 'SOAG1', 'SOAG1_CHMP', 'SOAG2', 'SOAG2_CHMP', - 'SOAG3', 'SOAG3_CHMP', 'SOAG4', 'SOAG4_CHMP', 'SOLIN', 'SOLLD', 'SOLSD', 'SSAVIS', 'SST', 'ST80_25', 'SVOC', 'SVOC_CHML', - 'T', 'TAQ', 'TAUBLJX', 'TAUBLJY', 'TAUGWX', 'TAUGWY', 'TAUX', 'TAUY', 'TBRY', 'TCLY', 'TEPOMUC', 'TERP2O2', 'TERP2OOH', - 'TERPNIT', 'TERPO2', 'TERPOOH', 'TERPROD1', 'TERPROD2', 'TGCLDIWP', 'TGCLDLWP', 'TMDMS', 'TMOCS', 'TMQ', 'TMSO2', - 'TMso4_a1', 'TMso4_a2', 'TMso4_a3', 'TOLO2', 'TOLOOH', 'TOLUENE', 'TOT_CLD_VISTAU', 'TOTH', 'TREFHT', 'TREFHTMN', 'TREFHTMX', 'TROP_P', - 'TROP_T', 'TROP_Z', 'TS', 'TSMN:M', 'TSMX:X', 'TTEND_TOT', 'TTGWORO', 'TTGWSDF', 'TTGWSDFORO', 'TTGWSKE', 'TTGWSKEORO', 'TTGWSPEC', - 'U10', 'U', 'UTGWORO', 'UTGWSPEC', 'UU', 'V', 'VD01', 'VEL_NAT2', 'VV', - 'wet_deposition_NHx_as_N', 'wet_deposition_NOy_as_N', 'XO2', 'XOOH', 'XYLENES', 'XYLENO2', 'XYLENOOH', 'XYLOL', 'XYLOLO2', - 'XYLOLOOH', 'Z3', 'ZMDQ', 'ZMDT', 'ZMMTT', 'ZMMU', + 'ACTREL', 'AQ_SO2', 'AREA', 'BROX', 'BROY', 'BRY', 'CLOX', 'CLOY', 'CLY', 'NOX', 'NOY', 'TBRY', 'TCLY', 'CFC11STAR', + 'BTTGWSPEC', 'BTTGWSDF', 'BTTGWSKE', 'CONCLD', 'CME', 'CMFDQ', 'CMFMC', 'CMFMC_DP', + 'CH3CCL3_CHML', 'CH4_CHML', 'CO2_CHML', 'CO_CHML', 'IVOC_CHML', 'N2O_CHML', 'O3_CHML', 'SO2_CHML', + 'CO_CHMP', 'O3_CHMP', 'SO2_CHMP', 'TMDMS', 'TMOCS', 'TMSO2','TMso4_a1', 'TMso4_a2', 'TMso4_a3', + 'soa1_a1_CHML', 'soa1_a2_CHML', 'soa2_a1_CHML', 'soa2_a2_CHML', 'soa3_a1_CHML', 'soa3_a2_CHML', + 'soa4_a1_CHML', 'soa4_a2_CHML', 'soa5_a1_CHML', 'soa5_a2_CHML', 'SVOC_CHML', + 'so4_a1_CHMP','so4_a2_CHMP', 'SOAG0_CHMP', 'SOAG1_CHMP', 'SOAG2_CHMP', 'SOAG3_CHMP', 'SOAG4_CHMP', 'TOTH', 'TOT_CLD_VISTAU', + 'TREFHTMN', 'TREFHTMX', 'TROP_P', 'TROP_T', 'TROP_Z', 'TTEND_TOT', 'TTGWORO', 'TTGWSDF', 'TTGWSDFORO', 'TTGWSKE', 'TTGWSKEORO', + 'TS', 'TSMN:M', 'TSMX:X', 'BURDENBCdn', 'BURDENDUSTdn', 'BURDENPOMdn', 'BURDENSEASALTdn', 'BURDENSO4dn', 'BURDENSOAdn', + 'ABSORB', 'AODABSdn', 'AODBCdn', 'AODdnDUST01', 'AODdnDUST02', 'AODdnDUST03', 'AODdn_aitken', 'AODdn_accum', 'AODdn_coarse', + 'AODDUST02', 'AODDUST', 'AODNIRstdn', 'AODPOMdn', 'AODSO4dn', 'AODSOAdn', 'AODSSdn', 'AODUVdn', 'AODUVstdn', 'AODVIS', + 'AODVISdn', 'AODVISstdn', 'EXTINCTdn', 'EXTINCTNIRdn', 'EXTINCTUVdn', 'EXTxASYMdn', 'FLDSC', 'FLNR', 'FSNR', + 'CME', 'CMFDQ', 'CMFMC','CMFMC_DP', 'SOLLD', 'SOLSD', 'SSAVIS', 'SST','TAQ', + 'DCOCHM','DH2O2CHM', 'DHNO3CHM', 'DO3CHM', 'Dso4_a1CHM', 'Dso4_a2CHM', 'Dso4_a3CHM', + 'FLASHFRQ', 'LNO_COL_PROD', 'LNO_PROD','KVH_CLUBB','MASS', 'PDELDRY', 'NITROP_PD','PM25', 'PRECT', 'PTEQ', 'PTTEND', + 'QRLC', 'QRSC', 'QSNOW', 'QRAIN','GS_SO2', 'HNO3_GAS', 'HNO3_NAT', 'HNO3_STS','H2SO4M_C', 'H2SO4_sfnnuc1','HCL_GAS', + 'SAD_AERO', 'SAD_ICE', 'SAD_LNAT', 'SAD_SULFC', 'SAD_TROP' 'RAD_ICE', 'RAD_LNAT', 'RAD_SULFC', 'REFF_AERO', 'RHREFHT', + 'EVAPPREC', 'EVAPQZM', 'EVAPTZM', 'FCTL','FREQZM', 'ZMDQ', 'ZMDT', 'ZMMTT', 'ZMMU','VEL_NAT2', + 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'bc_c1DDF', 'bc_c4DDF', 'dst_c1DDF', 'dst_c2DDF', 'dst_c3DDF', + 'ncl_c1DDF', 'ncl_c2DDF', 'ncl_c3DDF', 'pom_c1DDF', 'pom_c4DDF', 'num_c1DDF','num_c2DDF','num_c3DDF','num_c4DDF', + 'so4_a1_sfgaex1', 'so4_c1AQH2SO4', 'so4_c1AQSO4', 'so4_c1DDF', 'so4_a2_sfgaex1', 'so4_c2AQH2SO4', 'so4_c2AQSO4', 'so4_c2DDF', + 'so4_a3_sfgaex1', 'so4_c3AQH2SO4', 'so4_c3AQSO4', 'so4_c3DDF', 'so4_a2_sfnnuc1', 'num_a2_sfnnuc1', + 'soa1_a1_sfgaex1','soa1_c1DDF', 'soa1_a2_sfgaex1','soa1_c2DDF', 'soa2_a1_sfgaex1','soa2_c1DDF', 'soa2_a2_sfgaex1','soa2_c2DDF', + 'soa3_a1_sfgaex1','soa3_c1DDF', 'soa3_a2_sfgaex1','soa3_c2DDF', 'soa4_a1_sfgaex1','soa4_c1DDF', 'soa4_a2_sfgaex1','soa4_c2DDF', + 'soa5_a1_sfgaex1','soa5_c1DDF', 'soa5_a2_sfgaex1','soa5_c2DDF', 'jcl2o2', 'jh2o2', 'jno2', 'jo2_a', 'jo2_b', 'jo3_a', 'jo3_b', 'jpan', + 'r_het1', 'r_het2', 'r_het3', 'r_het4', 'r_het5', 'r_het6', 'r_het7', 'r_het8', 'r_het9', 'r_het10', 'r_het11', 'r_het12', 'r_het13', + 'r_het15', 'r_het16', 'r_het17', 'r_jsoa1_a1', 'r_jsoa1_a2', 'r_jsoa2_a1', 'r_jsoa2_a2', 'r_jsoa3_a1', 'r_jsoa3_a2', 'r_jsoa4_a1', + 'r_jsoa4_a2', 'r_jsoa5_a1', 'r_jsoa5_a2', 'r_GLYOXAL_aer', 'r_HO2_O3', 'r_N2O5_aer', 'r_NO2_aer', 'r_NO3_aer', 'r_O1D_H2O', 'r_OH_O3', 'r_OH_O', 'O3_Prod','O3_Loss','O3S_Loss','RO2_NO_sum','O3_alkenes','RO2_NO3_sum','RO2_HO2_sum','RO2_RO2_sum','RCO2_NO2_sum', - 'OddOx_Ox_Loss','OddOx_HOx_Loss','OddOx_NOx_Loss','OddOx_CLOxBROx_Loss','OddOx_Loss_Tot','OddOx_Prod_Tot', - 'Ox_Prod','Ox_Loss' + 'OddOx_Ox_Loss','OddOx_HOx_Loss','OddOx_NOx_Loss','OddOx_CLOxBROx_Loss','OddOx_Loss_Tot','OddOx_Prod_Tot', 'Ox_Prod','Ox_Loss' diff --git a/bld/namelist_files/use_cases/waccm_tsmlt_2000_cam6.xml b/bld/namelist_files/use_cases/waccm_tsmlt_2000_cam6.xml index 564cfaf660..3ad0c7db31 100644 --- a/bld/namelist_files/use_cases/waccm_tsmlt_2000_cam6.xml +++ b/bld/namelist_files/use_cases/waccm_tsmlt_2000_cam6.xml @@ -263,85 +263,36 @@ 'AOA1SRC', 'AOA2SRC', 'NO2_CMXF' - 'ABSORB', 'ACBZO2', 'ACTREL', 'ALKNIT', 'ALKO2', 'ALKOOH', 'AOA1', 'AOA_NH', 'AODABSdn', 'AODBCdn', 'AODdnDUST1', 'AODdnDUST2', - 'AODdnDUST3', 'AODdnMODE1', 'AODdnMODE2', 'AODdnMODE3', 'AODDUST2', 'AODDUST', 'AODNIRstdn', 'AODPOMdn', 'AODSO4dn', 'AODSOAdn', 'AODSSdn', - 'AODUVdn', 'AODUVstdn', 'AODVIS', 'AODVISdn', 'AODVISstdn', 'AQ_SO2', 'AREA', 'AREI', 'AREL', 'bc_a1', 'bc_a1DDF', - 'bc_a1SFWET', 'bc_a4', 'bc_a4_CLXF', 'bc_a4DDF', 'bc_a4SFWET', 'BCARY', 'bc_c1', 'bc_c1DDF', 'bc_c1SFWET', 'bc_c4', 'bc_c4DDF', - 'bc_c4SFWET', 'BENZENE', 'BENZO2', 'BENZOOH', 'BEPOMUC', 'BIGALD1', 'BIGALD2', 'BIGALD3', 'BIGALD4', 'BIGALD', 'BIGALK', 'BIGENE', - 'BR', 'BRCL', 'BRO', 'BRONO2', 'BROX', 'BROY', 'BRY', 'BTTGWSPEC', 'BTTGWSDF', 'BTTGWSKE', - 'BURDENBCdn', 'BURDENDUSTdn', 'BURDENPOMdn', 'BURDENSEASALTdn', 'BURDENSO4dn', - 'BURDENSOAdn', 'BUTGWSPEC', 'BZALD', 'BZOO', 'BZOOH', 'C2H2', 'C2H4', 'C2H5O2', 'C2H5OH', 'C2H5OOH', 'C2H6', 'C3H6', 'C3H7O2', - 'C3H7OOH', 'C3H8', 'C6H5O2', 'C6H5OOH', 'CCL4', 'CDNUMC', 'CF2CLBR', 'CF3BR', 'CFC113', 'CFC114', 'CFC115', 'CFC11', 'CFC11STAR', - 'CFC12', 'CH2BR2', 'CH2O', 'CH3BR', 'CH3CCL3', 'CH3CCL3_CHML', 'CH3CHO', 'CH3CL', 'CH3CN', 'CH3CO3', 'CH3COCH3', 'CH3COCHO', - 'CH3COOH', 'CH3COOOH', 'CH3O2', 'CH3OH', 'CH3OOH', 'CH4', 'CH4_CHML', 'CHBR3', 'CL2', 'CL2O2', 'CL', - 'CLDICE', 'CLDLIQ', 'CLDTOT', 'CLO', 'CLONO2', 'CLOUD', 'CLOX', 'CLOY', 'CLY', 'CME', 'CMFDQ', 'CMFMC', - 'CMFMC_DP', 'CO2', 'CO2_CHML', 'CO', 'CO_CHML', 'CO_CHMP', 'COF2', 'COFCL', 'CONCLD', 'CRESOL', - 'DCOCHM', 'DF_ALKNIT', 'DF_ALKOOH', 'DF_BENZOOH', 'DF_BZOOH', 'DF_C2H5OH', 'DF_C2H5OOH', 'DF_C3H7OOH', 'DF_C6H5OOH', 'DF_CH2O', - 'DF_CH3CHO', 'DF_CH3CN', 'DF_CH3COCH3', 'DF_CH3COCHO', 'DF_CH3COOH', 'DF_CH3COOOH', 'DF_CH3OH', 'DF_CH3OOH', 'DF_CO', 'DF_EOOH', - 'DF_GLYALD', 'DF_H2O2', 'DF_H2SO4', 'DF_HCN', 'DF_HCOOH', 'DF_HNO3', 'DF_HO2NO2', 'DF_HONITR', 'DF_HPALD', 'DF_HYAC', 'DF_HYDRALD', - 'DF_IEPOX', 'DF_ISOPNITA', 'DF_ISOPNITB', 'DF_ISOPNO3', 'DF_ISOPNOOH', 'DF_ISOPOOH', 'DF_IVOC', 'DF_MACROOH', 'DF_MEKOOH', - 'DF_MPAN', 'DF_NC4CH2OH', 'DF_NC4CHO', 'DF_NH3', 'DF_NH4', 'DF_NO2', 'DF_NO', 'DF_NOA', 'DF_NTERPOOH', 'DF_O3', - 'DF_ONITR', 'DF_PAN', 'DF_PHENOOH', 'DF_POOH', 'DF_ROOH', 'DF_SO2', 'DF_SOAG0', 'DF_SOAG1', 'DF_SOAG2', 'DF_SOAG3', - 'DF_SOAG4', 'DF_SVOC', 'DF_TERP2OOH', 'DF_TERPNIT', 'DF_TERPOOH', 'DF_TERPROD1', 'DF_TERPROD2', 'DF_TOLOOH', 'DF_XOOH', 'DF_XYLENOOH', - 'DF_XYLOLOOH', 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'DH2O2CHM', 'DHNO3CHM', 'DICARBO2', 'DMS', 'DO3CHM', 'dry_deposition_NHx_as_N', - 'dry_deposition_NOy_as_N', 'Dso4_a1CHM', 'Dso4_a2CHM', 'Dso4_a3CHM', 'dst_a1', 'dst_a1DDF', 'dst_a1SFWET', 'dst_a2', 'dst_a2DDF', - 'dst_a2SFWET', 'dst_a3', 'dst_a3DDF', 'dst_a3SFWET', 'dst_c1', 'dst_c1DDF', 'dst_c1SFWET', 'dst_c2', 'dst_c2DDF', 'dst_c2SFWET', - 'dst_c3', 'dst_c3DDF', 'dst_c3SFWET', 'DTCORE', 'E90', 'e', 'ENEO2', 'EO2', 'EO', 'EOOH', 'EVAPPREC', - 'EVAPQZM', 'EVAPTZM', 'EXTINCTdn', 'EXTINCTNIRdn', 'EXTINCTUVdn', 'EXTxASYMdn', 'F', 'FCTL', - 'FLASHFRQ', 'FLDS', 'FLDSC', 'FLNR', 'FLNS', 'FLNSC', 'FLNT', 'FLNTC', 'FLUT', 'FLUTC', 'FREQI', 'FREQL', 'FREQZM', 'FSDS', - 'FSDSC', 'FSNR', 'FSNS', 'FSNSC', 'FSNT', 'FSNTC', 'FSNTOAC', 'FSUTOA', 'GLYALD', 'GLYOXAL', - 'GS_SO2', 'H2402', 'H2', 'H2O2', 'H2O', 'H2SO4', 'H2SO4M_C', 'H2SO4_sfnnuc1', 'H', 'HBR', 'HCFC141B', 'HCFC142B', 'HCFC22', 'HCL', - 'HCL_GAS', 'HCN', 'HCOOH', 'HF', 'HNO3', 'HNO3_GAS', 'HNO3_NAT', 'HNO3_STS', 'HO2', 'HO2NO2', 'HOBR', 'HOCH2OO', 'HOCL', 'HONITR', - 'HPALD', 'HYAC', 'HYDRALD', 'ICEFRAC', 'IEPOX', 'ISOP', 'ISOPAO2', 'ISOPBO2', 'ISOPNITA', 'ISOPNITB', 'ISOPNO3', - 'ISOPNOOH', 'ISOPOOH', 'IVOC', 'IVOC_CHML', 'jcl2o2', 'jh2o2', 'jno2', 'jo2_a', 'jo2_b', 'jo3_a', 'jo3_b', 'jpan', 'KVH_CLUBB', - 'LANDFRAC', 'LHFLX', 'LNO_COL_PROD', 'LNO_PROD', 'MACR', 'MACRO2', 'MACROOH', 'MALO2', 'MASS', 'MCO3', 'MDIALO2', - 'MEG_BCARY', 'MEG_BIGALK', 'MEG_BIGENE', 'MEG_C2H4', 'MEG_C2H5OH', 'MEG_C2H6', 'MEG_C3H6', 'MEG_C3H8', 'MEG_CH2O', - 'MEG_CH3CHO', 'MEG_CH3COCH3', 'MEG_CH3COOH', 'MEG_CH3OH', 'MEG_CO', 'MEG_HCN', 'MEG_HCOOH', 'MEG_ISOP', 'MEG_MTERP', 'MEG_TOLUENE', - 'MEK', 'MEKO2', 'MEKOOH', 'MPAN', 'MTERP', 'MVK', 'N2D', 'N2O5', 'N2O', 'N2O_CHML', 'N2p', 'N', 'NC4CH2OH', - 'NC4CHO', 'ncl_a1', 'ncl_a1DDF', 'ncl_a1SFWET', 'ncl_a2', 'ncl_a2DDF', 'ncl_a2SFWET', 'ncl_a3', 'ncl_a3DDF', 'ncl_a3SFWET', 'ncl_c1', - 'ncl_c1DDF', 'ncl_c1SFWET', 'ncl_c2', 'ncl_c2DDF', 'ncl_c2SFWET', 'ncl_c3', 'ncl_c3DDF', 'ncl_c3SFWET', 'NDEP', 'NH3', 'NH4', 'NH_50', - 'NH_5', 'NHDEP', 'NITROP_PD', 'NO2', 'NO2_CLXF', 'NO3', 'NO', 'NOA', 'NOp', 'NOX', 'NOY', 'Np', 'NTERPO2', 'NTERPOOH', - 'num_a1', 'num_a1_CLXF', 'num_a1DDF', 'num_a2', 'num_a2_CLXF', 'num_a2DDF', 'num_a2_sfnnuc1', 'num_a3', 'num_a3DDF', 'num_a4', - 'num_a4DDF', 'num_c1', 'num_c1DDF', 'num_c2', 'num_c2DDF', 'num_c3', 'num_c3DDF', 'num_c4', 'num_c4DDF', 'NUMLIQ', 'O1D', 'O2_1D', - 'O2_1S', 'O2', 'O2p', 'O3', 'O3S', 'O3_CHML', 'O3_CHMP', 'O', 'OCLO', 'OCS', 'OH', 'OMEGA', 'OMEGAT', 'ONITR', 'Op', - 'PAN', 'PBLH', 'PBZNIT', 'PDELDRY', 'PHENO2', 'PHENO', 'PHENOL', 'PHENOOH', 'PHIS', 'PM25', 'PO2', 'pom_a1', 'pom_a1DDF', 'pom_a1SFWET', - 'pom_a4', 'pom_a4DDF', 'pom_a4SFWET', 'pom_c1', 'pom_c1DDF', 'pom_c1SFWET', 'pom_c4', 'pom_c4DDF', 'pom_c4SFWET', - 'POOH', 'PRECC', 'PRECT', 'PS', 'PSL', 'PTEQ', 'PTTEND', 'Q', 'QFLX', 'QRAIN', 'QREFHT', 'QRL', 'QRLC', 'QRS', - 'QRSC', 'QSNOW', 'RAD_ICE', 'RAD_LNAT', 'RAD_SULFC', 'REFF_AERO', 'RELHUM', 'r_GLYOXAL_aer', - 'r_het10', 'r_het11', 'r_het12', 'r_het13', 'r_het15', 'r_het16', 'r_het17', 'r_het1', 'r_het2', 'r_het3', 'r_het4', 'r_het5', - 'r_het6', 'r_het7', 'r_het8', 'r_het9', 'r_HO2_O3', 'RHREFHT', 'r_jsoa1_a1', 'r_jsoa1_a2', 'r_jsoa2_a1', 'r_jsoa2_a2', - 'r_jsoa3_a1', 'r_jsoa3_a2', 'r_jsoa4_a1', 'r_jsoa4_a2', 'r_jsoa5_a1', 'r_jsoa5_a2', 'r_N2O5_aer', 'r_NO2_aer', 'r_NO3_aer', 'r_O1D_H2O', - 'r_OH_O3', 'r_OH_O', 'ROOH', 'RO2', - 'S', 'SAD_AERO', 'SAD_ICE', 'SAD_LNAT', 'SAD_SULFC', 'SAD_TROP', 'SF6', 'SFbc_a4', 'SFBCARY', - 'SFBENZENE', 'SFBIGALK', 'SFBIGENE', 'SFC2H2', 'SFC2H4', 'SFC2H5OH', 'SFC2H6', 'SFC3H6', 'SFC3H8', 'SFCH2O', 'SFCH3CHO', 'SFCH3CN', - 'SFCH3COCH3', 'SFCH3COCHO', 'SFCH3COOH', 'SFCH3OH', 'SFCO', 'SFDMS', 'SFdst_a1', 'SFdst_a2', 'SFdst_a3', 'SFGLYALD', 'SFHCN', 'SFHCOOH', - 'SFISOP', 'SFIVOC', 'SFMEK', 'SFMTERP', 'SFncl_a1', 'SFncl_a2', 'SFncl_a3', 'SFNH3', 'SFNO2', 'SFNO', 'SFnum_a1', 'SFnum_a2', - 'SFnum_a3', 'SFpom_a4', 'SFSO2', 'SFso4_a1', 'SFso4_a2', 'SFSVOC', 'SFTOLUENE', 'SFXYLENES', 'SHFLX', 'SO2', - 'SO2_CHML', 'SO2_CHMP', 'SO2_CLXF', 'SO2_XFRC', 'SO3', 'so4_a1', 'so4_a1_CHMP', 'so4_a1_CLXF', 'so4_a1DDF', 'so4_a1_sfgaex1', 'so4_a1SFWET', - 'so4_a2', 'so4_a2_CHMP', 'so4_a2_CLXF', 'so4_a2DDF', 'so4_a2_sfgaex1', 'so4_a2_sfnnuc1', 'so4_a2SFWET', 'so4_a3', - 'so4_a3DDF', 'so4_a3_sfgaex1', 'so4_a3SFWET', 'so4_c1', 'so4_c1AQH2SO4', 'so4_c1AQSO4', 'so4_c1DDF', 'so4_c1SFWET', 'so4_c2', 'so4_c2AQH2SO4', - 'so4_c2AQSO4', 'so4_c2DDF', 'so4_c2SFWET', 'so4_c3', 'so4_c3AQH2SO4', 'so4_c3AQSO4', 'so4_c3DDF', 'so4_c3SFWET', 'SO', 'soa1_a1', - 'soa1_a1_CHML', 'soa1_a1DDF', 'soa1_a1_sfgaex1', 'soa1_a1SFWET', 'soa1_a2', 'soa1_a2_CHML', 'soa1_a2DDF', - 'soa1_a2_sfgaex1', 'soa1_a2SFWET', 'soa1_c1', 'soa1_c1DDF', 'soa1_c1SFWET', 'soa1_c2', 'soa1_c2DDF', 'soa1_c2SFWET', 'soa2_a1', 'soa2_a1_CHML', - 'soa2_a1DDF', 'soa2_a1_sfgaex1', 'soa2_a1SFWET', 'soa2_a2', 'soa2_a2_CHML', 'soa2_a2DDF', 'soa2_a2_sfgaex1', - 'soa2_a2SFWET', 'soa2_c1', 'soa2_c1DDF', 'soa2_c1SFWET', 'soa2_c2', 'soa2_c2DDF', 'soa2_c2SFWET', 'soa3_a1', 'soa3_a1_CHML', - 'soa3_a1DDF', 'soa3_a1_sfgaex1', 'soa3_a1SFWET', 'soa3_a2', 'soa3_a2_CHML', 'soa3_a2DDF', 'soa3_a2_sfgaex1', 'soa3_a2SFWET', - 'soa3_c1', 'soa3_c1DDF', 'soa3_c1SFWET', 'soa3_c2', 'soa3_c2DDF', 'soa3_c2SFWET', 'soa4_a1', 'soa4_a1_CHML', 'soa4_a1DDF', - 'soa4_a1_sfgaex1', 'soa4_a1SFWET', 'soa4_a2', 'soa4_a2_CHML', 'soa4_a2DDF', 'soa4_a2_sfgaex1', 'soa4_a2SFWET', 'soa4_c1', - 'soa4_c1DDF', 'soa4_c1SFWET', 'soa4_c2', 'soa4_c2DDF', 'soa4_c2SFWET', 'soa5_a1', 'soa5_a1_CHML', 'soa5_a1DDF', 'soa5_a1_sfgaex1', - 'soa5_a1SFWET', 'soa5_a2', 'soa5_a2_CHML', 'soa5_a2DDF', 'soa5_a2_sfgaex1', 'soa5_a2SFWET', 'soa5_c1', 'soa5_c1DDF', - 'soa5_c1SFWET', 'soa5_c2', 'soa5_c2DDF', 'soa5_c2SFWET', 'SOAG0', 'SOAG0_CHMP', 'SOAG1', 'SOAG1_CHMP', 'SOAG2', 'SOAG2_CHMP', - 'SOAG3', 'SOAG3_CHMP', 'SOAG4', 'SOAG4_CHMP', 'SOLIN', 'SOLLD', 'SOLSD', 'SSAVIS', 'SST', 'ST80_25', 'SVOC', 'SVOC_CHML', - 'T', 'TAQ', 'TAUBLJX', 'TAUBLJY', 'TAUGWX', 'TAUGWY', 'TAUX', 'TAUY', 'TBRY', 'TCLY', 'TEPOMUC', 'TERP2O2', 'TERP2OOH', - 'TERPNIT', 'TERPO2', 'TERPOOH', 'TERPROD1', 'TERPROD2', 'TGCLDIWP', 'TGCLDLWP', 'TMDMS', 'TMOCS', 'TMQ', 'TMSO2', - 'TMso4_a1', 'TMso4_a2', 'TMso4_a3', 'TOLO2', 'TOLOOH', 'TOLUENE', 'TOT_CLD_VISTAU', 'TOTH', 'TREFHT', 'TREFHTMN', 'TREFHTMX', 'TROP_P', - 'TROP_T', 'TROP_Z', 'TS', 'TSMN:M', 'TSMX:X', 'TTEND_TOT', 'TTGWORO', 'TTGWSDF', 'TTGWSDFORO', 'TTGWSKE', 'TTGWSKEORO', 'TTGWSPEC', - 'U10', 'U', 'UTGWORO', 'UTGWSPEC', 'UU', 'V', 'VD01', 'VEL_NAT2', 'VV', - 'wet_deposition_NHx_as_N', 'wet_deposition_NOy_as_N', 'XO2', 'XOOH', 'XYLENES', 'XYLENO2', 'XYLENOOH', 'XYLOL', 'XYLOLO2', - 'XYLOLOOH', 'Z3', 'ZMDQ', 'ZMDT', 'ZMMTT', 'ZMMU', + 'ACTREL', 'AQ_SO2', 'AREA', 'BROX', 'BROY', 'BRY', 'CLOX', 'CLOY', 'CLY', 'NOX', 'NOY', 'TBRY', 'TCLY', 'CFC11STAR', + 'BTTGWSPEC', 'BTTGWSDF', 'BTTGWSKE', 'CONCLD', 'CME', 'CMFDQ', 'CMFMC', 'CMFMC_DP', + 'CH3CCL3_CHML', 'CH4_CHML', 'CO2_CHML', 'CO_CHML', 'IVOC_CHML', 'N2O_CHML', 'O3_CHML', 'SO2_CHML', + 'CO_CHMP', 'O3_CHMP', 'SO2_CHMP', 'TMDMS', 'TMOCS', 'TMSO2','TMso4_a1', 'TMso4_a2', 'TMso4_a3', + 'soa1_a1_CHML', 'soa1_a2_CHML', 'soa2_a1_CHML', 'soa2_a2_CHML', 'soa3_a1_CHML', 'soa3_a2_CHML', + 'soa4_a1_CHML', 'soa4_a2_CHML', 'soa5_a1_CHML', 'soa5_a2_CHML', 'SVOC_CHML', + 'so4_a1_CHMP','so4_a2_CHMP', 'SOAG0_CHMP', 'SOAG1_CHMP', 'SOAG2_CHMP', 'SOAG3_CHMP', 'SOAG4_CHMP', 'TOTH', 'TOT_CLD_VISTAU', + 'TREFHTMN', 'TREFHTMX', 'TROP_P', 'TROP_T', 'TROP_Z', 'TTEND_TOT', 'TTGWORO', 'TTGWSDF', 'TTGWSDFORO', 'TTGWSKE', 'TTGWSKEORO', + 'TS', 'TSMN:M', 'TSMX:X', 'BURDENBCdn', 'BURDENDUSTdn', 'BURDENPOMdn', 'BURDENSEASALTdn', 'BURDENSO4dn', 'BURDENSOAdn', + 'ABSORB', 'AODABSdn', 'AODBCdn', 'AODdnDUST01', 'AODdnDUST02', 'AODdnDUST03', 'AODdn_aitken', 'AODdn_accum', 'AODdn_coarse', + 'AODDUST02', 'AODDUST', 'AODNIRstdn', 'AODPOMdn', 'AODSO4dn', 'AODSOAdn', 'AODSSdn', 'AODUVdn', 'AODUVstdn', 'AODVIS', + 'AODVISdn', 'AODVISstdn', 'EXTINCTdn', 'EXTINCTNIRdn', 'EXTINCTUVdn', 'EXTxASYMdn', 'FLDSC', 'FLNR', 'FSNR', + 'CME', 'CMFDQ', 'CMFMC','CMFMC_DP', 'SOLLD', 'SOLSD', 'SSAVIS', 'SST','TAQ', + 'DCOCHM','DH2O2CHM', 'DHNO3CHM', 'DO3CHM', 'Dso4_a1CHM', 'Dso4_a2CHM', 'Dso4_a3CHM', + 'FLASHFRQ', 'LNO_COL_PROD', 'LNO_PROD','KVH_CLUBB','MASS', 'PDELDRY', 'NITROP_PD','PM25', 'PRECT', 'PTEQ', 'PTTEND', + 'QRLC', 'QRSC', 'QSNOW', 'QRAIN','GS_SO2', 'HNO3_GAS', 'HNO3_NAT', 'HNO3_STS','H2SO4M_C', 'H2SO4_sfnnuc1','HCL_GAS', + 'SAD_AERO', 'SAD_ICE', 'SAD_LNAT', 'SAD_SULFC', 'SAD_TROP' 'RAD_ICE', 'RAD_LNAT', 'RAD_SULFC', 'REFF_AERO', 'RHREFHT', + 'EVAPPREC', 'EVAPQZM', 'EVAPTZM', 'FCTL','FREQZM', 'ZMDQ', 'ZMDT', 'ZMMTT', 'ZMMU','VEL_NAT2', + 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'bc_c1DDF', 'bc_c4DDF', 'dst_c1DDF', 'dst_c2DDF', 'dst_c3DDF', + 'ncl_c1DDF', 'ncl_c2DDF', 'ncl_c3DDF', 'pom_c1DDF', 'pom_c4DDF', 'num_c1DDF','num_c2DDF','num_c3DDF','num_c4DDF', + 'so4_a1_sfgaex1', 'so4_c1AQH2SO4', 'so4_c1AQSO4', 'so4_c1DDF', 'so4_a2_sfgaex1', 'so4_c2AQH2SO4', 'so4_c2AQSO4', 'so4_c2DDF', + 'so4_a3_sfgaex1', 'so4_c3AQH2SO4', 'so4_c3AQSO4', 'so4_c3DDF', 'so4_a2_sfnnuc1', 'num_a2_sfnnuc1', + 'soa1_a1_sfgaex1','soa1_c1DDF', 'soa1_a2_sfgaex1','soa1_c2DDF', 'soa2_a1_sfgaex1','soa2_c1DDF', 'soa2_a2_sfgaex1','soa2_c2DDF', + 'soa3_a1_sfgaex1','soa3_c1DDF', 'soa3_a2_sfgaex1','soa3_c2DDF', 'soa4_a1_sfgaex1','soa4_c1DDF', 'soa4_a2_sfgaex1','soa4_c2DDF', + 'soa5_a1_sfgaex1','soa5_c1DDF', 'soa5_a2_sfgaex1','soa5_c2DDF', 'jcl2o2', 'jh2o2', 'jno2', 'jo2_a', 'jo2_b', 'jo3_a', 'jo3_b', 'jpan', + 'r_het1', 'r_het2', 'r_het3', 'r_het4', 'r_het5', 'r_het6', 'r_het7', 'r_het8', 'r_het9', 'r_het10', 'r_het11', 'r_het12', 'r_het13', + 'r_het15', 'r_het16', 'r_het17', 'r_jsoa1_a1', 'r_jsoa1_a2', 'r_jsoa2_a1', 'r_jsoa2_a2', 'r_jsoa3_a1', 'r_jsoa3_a2', 'r_jsoa4_a1', + 'r_jsoa4_a2', 'r_jsoa5_a1', 'r_jsoa5_a2', 'r_GLYOXAL_aer', 'r_HO2_O3', 'r_N2O5_aer', 'r_NO2_aer', 'r_NO3_aer', 'r_O1D_H2O', 'r_OH_O3', 'r_OH_O', 'O3_Prod','O3_Loss','O3S_Loss','RO2_NO_sum','O3_alkenes','RO2_NO3_sum','RO2_HO2_sum','RO2_RO2_sum','RCO2_NO2_sum', - 'OddOx_Ox_Loss','OddOx_HOx_Loss','OddOx_NOx_Loss','OddOx_CLOxBROx_Loss','OddOx_Loss_Tot','OddOx_Prod_Tot', - 'Ox_Prod','Ox_Loss' + 'OddOx_Ox_Loss','OddOx_HOx_Loss','OddOx_NOx_Loss','OddOx_CLOxBROx_Loss','OddOx_Loss_Tot','OddOx_Prod_Tot', 'Ox_Prod','Ox_Loss' diff --git a/bld/namelist_files/use_cases/waccm_tsmlt_2010_cam6.xml b/bld/namelist_files/use_cases/waccm_tsmlt_2010_cam6.xml index 70a9f99e37..219083b1a4 100644 --- a/bld/namelist_files/use_cases/waccm_tsmlt_2010_cam6.xml +++ b/bld/namelist_files/use_cases/waccm_tsmlt_2010_cam6.xml @@ -163,85 +163,36 @@ 'AOA1SRC', 'AOA2SRC', 'NO2_CMXF' - 'ABSORB', 'ACBZO2', 'ACTREL', 'ALKNIT', 'ALKO2', 'ALKOOH', 'AOA1', 'AOA_NH', 'AODABSdn', 'AODBCdn', 'AODdnDUST1', 'AODdnDUST2', - 'AODdnDUST3', 'AODdnMODE1', 'AODdnMODE2', 'AODdnMODE3', 'AODDUST2', 'AODDUST', 'AODNIRstdn', 'AODPOMdn', 'AODSO4dn', 'AODSOAdn', 'AODSSdn', - 'AODUVdn', 'AODUVstdn', 'AODVIS', 'AODVISdn', 'AODVISstdn', 'AQ_SO2', 'AREA', 'AREI', 'AREL', 'bc_a1', 'bc_a1DDF', - 'bc_a1SFWET', 'bc_a4', 'bc_a4_CLXF', 'bc_a4DDF', 'bc_a4SFWET', 'BCARY', 'bc_c1', 'bc_c1DDF', 'bc_c1SFWET', 'bc_c4', 'bc_c4DDF', - 'bc_c4SFWET', 'BENZENE', 'BENZO2', 'BENZOOH', 'BEPOMUC', 'BIGALD1', 'BIGALD2', 'BIGALD3', 'BIGALD4', 'BIGALD', 'BIGALK', 'BIGENE', - 'BR', 'BRCL', 'BRO', 'BRONO2', 'BROX', 'BROY', 'BRY', 'BTTGWSPEC', 'BTTGWSDF', 'BTTGWSKE', - 'BURDENBCdn', 'BURDENDUSTdn', 'BURDENPOMdn', 'BURDENSEASALTdn', 'BURDENSO4dn', - 'BURDENSOAdn', 'BUTGWSPEC', 'BZALD', 'BZOO', 'BZOOH', 'C2H2', 'C2H4', 'C2H5O2', 'C2H5OH', 'C2H5OOH', 'C2H6', 'C3H6', 'C3H7O2', - 'C3H7OOH', 'C3H8', 'C6H5O2', 'C6H5OOH', 'CCL4', 'CDNUMC', 'CF2CLBR', 'CF3BR', 'CFC113', 'CFC114', 'CFC115', 'CFC11', 'CFC11STAR', - 'CFC12', 'CH2BR2', 'CH2O', 'CH3BR', 'CH3CCL3', 'CH3CCL3_CHML', 'CH3CHO', 'CH3CL', 'CH3CN', 'CH3CO3', 'CH3COCH3', 'CH3COCHO', - 'CH3COOH', 'CH3COOOH', 'CH3O2', 'CH3OH', 'CH3OOH', 'CH4', 'CH4_CHML', 'CHBR3', 'CL2', 'CL2O2', 'CL', - 'CLDICE', 'CLDLIQ', 'CLDTOT', 'CLO', 'CLONO2', 'CLOUD', 'CLOX', 'CLOY', 'CLY', 'CME', 'CMFDQ', 'CMFMC', - 'CMFMC_DP', 'CO2', 'CO2_CHML', 'CO', 'CO_CHML', 'CO_CHMP', 'COF2', 'COFCL', 'CONCLD', 'CRESOL', - 'DCOCHM', 'DF_ALKNIT', 'DF_ALKOOH', 'DF_BENZOOH', 'DF_BZOOH', 'DF_C2H5OH', 'DF_C2H5OOH', 'DF_C3H7OOH', 'DF_C6H5OOH', 'DF_CH2O', - 'DF_CH3CHO', 'DF_CH3CN', 'DF_CH3COCH3', 'DF_CH3COCHO', 'DF_CH3COOH', 'DF_CH3COOOH', 'DF_CH3OH', 'DF_CH3OOH', 'DF_CO', 'DF_EOOH', - 'DF_GLYALD', 'DF_H2O2', 'DF_H2SO4', 'DF_HCN', 'DF_HCOOH', 'DF_HNO3', 'DF_HO2NO2', 'DF_HONITR', 'DF_HPALD', 'DF_HYAC', 'DF_HYDRALD', - 'DF_IEPOX', 'DF_ISOPNITA', 'DF_ISOPNITB', 'DF_ISOPNO3', 'DF_ISOPNOOH', 'DF_ISOPOOH', 'DF_IVOC', 'DF_MACROOH', 'DF_MEKOOH', - 'DF_MPAN', 'DF_NC4CH2OH', 'DF_NC4CHO', 'DF_NH3', 'DF_NH4', 'DF_NO2', 'DF_NO', 'DF_NOA', 'DF_NTERPOOH', 'DF_O3', - 'DF_ONITR', 'DF_PAN', 'DF_PHENOOH', 'DF_POOH', 'DF_ROOH', 'DF_SO2', 'DF_SOAG0', 'DF_SOAG1', 'DF_SOAG2', 'DF_SOAG3', - 'DF_SOAG4', 'DF_SVOC', 'DF_TERP2OOH', 'DF_TERPNIT', 'DF_TERPOOH', 'DF_TERPROD1', 'DF_TERPROD2', 'DF_TOLOOH', 'DF_XOOH', 'DF_XYLENOOH', - 'DF_XYLOLOOH', 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'DH2O2CHM', 'DHNO3CHM', 'DICARBO2', 'DMS', 'DO3CHM', 'dry_deposition_NHx_as_N', - 'dry_deposition_NOy_as_N', 'Dso4_a1CHM', 'Dso4_a2CHM', 'Dso4_a3CHM', 'dst_a1', 'dst_a1DDF', 'dst_a1SFWET', 'dst_a2', 'dst_a2DDF', - 'dst_a2SFWET', 'dst_a3', 'dst_a3DDF', 'dst_a3SFWET', 'dst_c1', 'dst_c1DDF', 'dst_c1SFWET', 'dst_c2', 'dst_c2DDF', 'dst_c2SFWET', - 'dst_c3', 'dst_c3DDF', 'dst_c3SFWET', 'DTCORE', 'E90', 'e', 'ENEO2', 'EO2', 'EO', 'EOOH', 'EVAPPREC', - 'EVAPQZM', 'EVAPTZM', 'EXTINCTdn', 'EXTINCTNIRdn', 'EXTINCTUVdn', 'EXTxASYMdn', 'F', 'FCTL', - 'FLASHFRQ', 'FLDS', 'FLDSC', 'FLNR', 'FLNS', 'FLNSC', 'FLNT', 'FLNTC', 'FLUT', 'FLUTC', 'FREQI', 'FREQL', 'FREQZM', 'FSDS', - 'FSDSC', 'FSNR', 'FSNS', 'FSNSC', 'FSNT', 'FSNTC', 'FSNTOAC', 'FSUTOA', 'GLYALD', 'GLYOXAL', - 'GS_SO2', 'H2402', 'H2', 'H2O2', 'H2O', 'H2SO4', 'H2SO4M_C', 'H2SO4_sfnnuc1', 'H', 'HBR', 'HCFC141B', 'HCFC142B', 'HCFC22', 'HCL', - 'HCL_GAS', 'HCN', 'HCOOH', 'HF', 'HNO3', 'HNO3_GAS', 'HNO3_NAT', 'HNO3_STS', 'HO2', 'HO2NO2', 'HOBR', 'HOCH2OO', 'HOCL', 'HONITR', - 'HPALD', 'HYAC', 'HYDRALD', 'ICEFRAC', 'IEPOX', 'ISOP', 'ISOPAO2', 'ISOPBO2', 'ISOPNITA', 'ISOPNITB', 'ISOPNO3', - 'ISOPNOOH', 'ISOPOOH', 'IVOC', 'IVOC_CHML', 'jcl2o2', 'jh2o2', 'jno2', 'jo2_a', 'jo2_b', 'jo3_a', 'jo3_b', 'jpan', 'KVH_CLUBB', - 'LANDFRAC', 'LHFLX', 'LNO_COL_PROD', 'LNO_PROD', 'MACR', 'MACRO2', 'MACROOH', 'MALO2', 'MASS', 'MCO3', 'MDIALO2', - 'MEG_BCARY', 'MEG_BIGALK', 'MEG_BIGENE', 'MEG_C2H4', 'MEG_C2H5OH', 'MEG_C2H6', 'MEG_C3H6', 'MEG_C3H8', 'MEG_CH2O', - 'MEG_CH3CHO', 'MEG_CH3COCH3', 'MEG_CH3COOH', 'MEG_CH3OH', 'MEG_CO', 'MEG_HCN', 'MEG_HCOOH', 'MEG_ISOP', 'MEG_MTERP', 'MEG_TOLUENE', - 'MEK', 'MEKO2', 'MEKOOH', 'MPAN', 'MTERP', 'MVK', 'N2D', 'N2O5', 'N2O', 'N2O_CHML', 'N2p', 'N', 'NC4CH2OH', - 'NC4CHO', 'ncl_a1', 'ncl_a1DDF', 'ncl_a1SFWET', 'ncl_a2', 'ncl_a2DDF', 'ncl_a2SFWET', 'ncl_a3', 'ncl_a3DDF', 'ncl_a3SFWET', 'ncl_c1', - 'ncl_c1DDF', 'ncl_c1SFWET', 'ncl_c2', 'ncl_c2DDF', 'ncl_c2SFWET', 'ncl_c3', 'ncl_c3DDF', 'ncl_c3SFWET', 'NDEP', 'NH3', 'NH4', 'NH_50', - 'NH_5', 'NHDEP', 'NITROP_PD', 'NO2', 'NO2_CLXF', 'NO3', 'NO', 'NOA', 'NOp', 'NOX', 'NOY', 'Np', 'NTERPO2', 'NTERPOOH', - 'num_a1', 'num_a1_CLXF', 'num_a1DDF', 'num_a2', 'num_a2_CLXF', 'num_a2DDF', 'num_a2_sfnnuc1', 'num_a3', 'num_a3DDF', 'num_a4', - 'num_a4DDF', 'num_c1', 'num_c1DDF', 'num_c2', 'num_c2DDF', 'num_c3', 'num_c3DDF', 'num_c4', 'num_c4DDF', 'NUMLIQ', 'O1D', 'O2_1D', - 'O2_1S', 'O2', 'O2p', 'O3', 'O3S', 'O3_CHML', 'O3_CHMP', 'O', 'OCLO', 'OCS', 'OH', 'OMEGA', 'OMEGAT', 'ONITR', 'Op', - 'PAN', 'PBLH', 'PBZNIT', 'PDELDRY', 'PHENO2', 'PHENO', 'PHENOL', 'PHENOOH', 'PHIS', 'PM25', 'PO2', 'pom_a1', 'pom_a1DDF', 'pom_a1SFWET', - 'pom_a4', 'pom_a4DDF', 'pom_a4SFWET', 'pom_c1', 'pom_c1DDF', 'pom_c1SFWET', 'pom_c4', 'pom_c4DDF', 'pom_c4SFWET', - 'POOH', 'PRECC', 'PRECT', 'PS', 'PSL', 'PTEQ', 'PTTEND', 'Q', 'QFLX', 'QRAIN', 'QREFHT', 'QRL', 'QRLC', 'QRS', - 'QRSC', 'QSNOW', 'RAD_ICE', 'RAD_LNAT', 'RAD_SULFC', 'REFF_AERO', 'RELHUM', 'r_GLYOXAL_aer', - 'r_het10', 'r_het11', 'r_het12', 'r_het13', 'r_het15', 'r_het16', 'r_het17', 'r_het1', 'r_het2', 'r_het3', 'r_het4', 'r_het5', - 'r_het6', 'r_het7', 'r_het8', 'r_het9', 'r_HO2_O3', 'RHREFHT', 'r_jsoa1_a1', 'r_jsoa1_a2', 'r_jsoa2_a1', 'r_jsoa2_a2', - 'r_jsoa3_a1', 'r_jsoa3_a2', 'r_jsoa4_a1', 'r_jsoa4_a2', 'r_jsoa5_a1', 'r_jsoa5_a2', 'r_N2O5_aer', 'r_NO2_aer', 'r_NO3_aer', 'r_O1D_H2O', - 'r_OH_O3', 'r_OH_O', 'ROOH', 'RO2', - 'S', 'SAD_AERO', 'SAD_ICE', 'SAD_LNAT', 'SAD_SULFC', 'SAD_TROP', 'SF6', 'SFbc_a4', 'SFBCARY', - 'SFBENZENE', 'SFBIGALK', 'SFBIGENE', 'SFC2H2', 'SFC2H4', 'SFC2H5OH', 'SFC2H6', 'SFC3H6', 'SFC3H8', 'SFCH2O', 'SFCH3CHO', 'SFCH3CN', - 'SFCH3COCH3', 'SFCH3COCHO', 'SFCH3COOH', 'SFCH3OH', 'SFCO', 'SFDMS', 'SFdst_a1', 'SFdst_a2', 'SFdst_a3', 'SFGLYALD', 'SFHCN', 'SFHCOOH', - 'SFISOP', 'SFIVOC', 'SFMEK', 'SFMTERP', 'SFncl_a1', 'SFncl_a2', 'SFncl_a3', 'SFNH3', 'SFNO2', 'SFNO', 'SFnum_a1', 'SFnum_a2', - 'SFnum_a3', 'SFpom_a4', 'SFSO2', 'SFso4_a1', 'SFso4_a2', 'SFSVOC', 'SFTOLUENE', 'SFXYLENES', 'SHFLX', 'SO2', - 'SO2_CHML', 'SO2_CHMP', 'SO2_CLXF', 'SO2_XFRC', 'SO3', 'so4_a1', 'so4_a1_CHMP', 'so4_a1_CLXF', 'so4_a1DDF', 'so4_a1_sfgaex1', 'so4_a1SFWET', - 'so4_a2', 'so4_a2_CHMP', 'so4_a2_CLXF', 'so4_a2DDF', 'so4_a2_sfgaex1', 'so4_a2_sfnnuc1', 'so4_a2SFWET', 'so4_a3', - 'so4_a3DDF', 'so4_a3_sfgaex1', 'so4_a3SFWET', 'so4_c1', 'so4_c1AQH2SO4', 'so4_c1AQSO4', 'so4_c1DDF', 'so4_c1SFWET', 'so4_c2', 'so4_c2AQH2SO4', - 'so4_c2AQSO4', 'so4_c2DDF', 'so4_c2SFWET', 'so4_c3', 'so4_c3AQH2SO4', 'so4_c3AQSO4', 'so4_c3DDF', 'so4_c3SFWET', 'SO', 'soa1_a1', - 'soa1_a1_CHML', 'soa1_a1DDF', 'soa1_a1_sfgaex1', 'soa1_a1SFWET', 'soa1_a2', 'soa1_a2_CHML', 'soa1_a2DDF', - 'soa1_a2_sfgaex1', 'soa1_a2SFWET', 'soa1_c1', 'soa1_c1DDF', 'soa1_c1SFWET', 'soa1_c2', 'soa1_c2DDF', 'soa1_c2SFWET', 'soa2_a1', 'soa2_a1_CHML', - 'soa2_a1DDF', 'soa2_a1_sfgaex1', 'soa2_a1SFWET', 'soa2_a2', 'soa2_a2_CHML', 'soa2_a2DDF', 'soa2_a2_sfgaex1', - 'soa2_a2SFWET', 'soa2_c1', 'soa2_c1DDF', 'soa2_c1SFWET', 'soa2_c2', 'soa2_c2DDF', 'soa2_c2SFWET', 'soa3_a1', 'soa3_a1_CHML', - 'soa3_a1DDF', 'soa3_a1_sfgaex1', 'soa3_a1SFWET', 'soa3_a2', 'soa3_a2_CHML', 'soa3_a2DDF', 'soa3_a2_sfgaex1', 'soa3_a2SFWET', - 'soa3_c1', 'soa3_c1DDF', 'soa3_c1SFWET', 'soa3_c2', 'soa3_c2DDF', 'soa3_c2SFWET', 'soa4_a1', 'soa4_a1_CHML', 'soa4_a1DDF', - 'soa4_a1_sfgaex1', 'soa4_a1SFWET', 'soa4_a2', 'soa4_a2_CHML', 'soa4_a2DDF', 'soa4_a2_sfgaex1', 'soa4_a2SFWET', 'soa4_c1', - 'soa4_c1DDF', 'soa4_c1SFWET', 'soa4_c2', 'soa4_c2DDF', 'soa4_c2SFWET', 'soa5_a1', 'soa5_a1_CHML', 'soa5_a1DDF', 'soa5_a1_sfgaex1', - 'soa5_a1SFWET', 'soa5_a2', 'soa5_a2_CHML', 'soa5_a2DDF', 'soa5_a2_sfgaex1', 'soa5_a2SFWET', 'soa5_c1', 'soa5_c1DDF', - 'soa5_c1SFWET', 'soa5_c2', 'soa5_c2DDF', 'soa5_c2SFWET', 'SOAG0', 'SOAG0_CHMP', 'SOAG1', 'SOAG1_CHMP', 'SOAG2', 'SOAG2_CHMP', - 'SOAG3', 'SOAG3_CHMP', 'SOAG4', 'SOAG4_CHMP', 'SOLIN', 'SOLLD', 'SOLSD', 'SSAVIS', 'SST', 'ST80_25', 'SVOC', 'SVOC_CHML', - 'T', 'TAQ', 'TAUBLJX', 'TAUBLJY', 'TAUGWX', 'TAUGWY', 'TAUX', 'TAUY', 'TBRY', 'TCLY', 'TEPOMUC', 'TERP2O2', 'TERP2OOH', - 'TERPNIT', 'TERPO2', 'TERPOOH', 'TERPROD1', 'TERPROD2', 'TGCLDIWP', 'TGCLDLWP', 'TMDMS', 'TMOCS', 'TMQ', 'TMSO2', - 'TMso4_a1', 'TMso4_a2', 'TMso4_a3', 'TOLO2', 'TOLOOH', 'TOLUENE', 'TOT_CLD_VISTAU', 'TOTH', 'TREFHT', 'TREFHTMN', 'TREFHTMX', 'TROP_P', - 'TROP_T', 'TROP_Z', 'TS', 'TSMN:M', 'TSMX:X', 'TTEND_TOT', 'TTGWORO', 'TTGWSDF', 'TTGWSDFORO', 'TTGWSKE', 'TTGWSKEORO', 'TTGWSPEC', - 'U10', 'U', 'UTGWORO', 'UTGWSPEC', 'UU', 'V', 'VD01', 'VEL_NAT2', 'VV', - 'wet_deposition_NHx_as_N', 'wet_deposition_NOy_as_N', 'XO2', 'XOOH', 'XYLENES', 'XYLENO2', 'XYLENOOH', 'XYLOL', 'XYLOLO2', - 'XYLOLOOH', 'Z3', 'ZMDQ', 'ZMDT', 'ZMMTT', 'ZMMU', + 'ACTREL', 'AQ_SO2', 'AREA', 'BROX', 'BROY', 'BRY', 'CLOX', 'CLOY', 'CLY', 'NOX', 'NOY', 'TBRY', 'TCLY', 'CFC11STAR', + 'BTTGWSPEC', 'BTTGWSDF', 'BTTGWSKE', 'CONCLD', 'CME', 'CMFDQ', 'CMFMC', 'CMFMC_DP', + 'CH3CCL3_CHML', 'CH4_CHML', 'CO2_CHML', 'CO_CHML', 'IVOC_CHML', 'N2O_CHML', 'O3_CHML', 'SO2_CHML', + 'CO_CHMP', 'O3_CHMP', 'SO2_CHMP', 'TMDMS', 'TMOCS', 'TMSO2','TMso4_a1', 'TMso4_a2', 'TMso4_a3', + 'soa1_a1_CHML', 'soa1_a2_CHML', 'soa2_a1_CHML', 'soa2_a2_CHML', 'soa3_a1_CHML', 'soa3_a2_CHML', + 'soa4_a1_CHML', 'soa4_a2_CHML', 'soa5_a1_CHML', 'soa5_a2_CHML', 'SVOC_CHML', + 'so4_a1_CHMP','so4_a2_CHMP', 'SOAG0_CHMP', 'SOAG1_CHMP', 'SOAG2_CHMP', 'SOAG3_CHMP', 'SOAG4_CHMP', 'TOTH', 'TOT_CLD_VISTAU', + 'TREFHTMN', 'TREFHTMX', 'TROP_P', 'TROP_T', 'TROP_Z', 'TTEND_TOT', 'TTGWORO', 'TTGWSDF', 'TTGWSDFORO', 'TTGWSKE', 'TTGWSKEORO', + 'TS', 'TSMN:M', 'TSMX:X', 'BURDENBCdn', 'BURDENDUSTdn', 'BURDENPOMdn', 'BURDENSEASALTdn', 'BURDENSO4dn', 'BURDENSOAdn', + 'ABSORB', 'AODABSdn', 'AODBCdn', 'AODdnDUST01', 'AODdnDUST02', 'AODdnDUST03', 'AODdn_aitken', 'AODdn_accum', 'AODdn_coarse', + 'AODDUST02', 'AODDUST', 'AODNIRstdn', 'AODPOMdn', 'AODSO4dn', 'AODSOAdn', 'AODSSdn', 'AODUVdn', 'AODUVstdn', 'AODVIS', + 'AODVISdn', 'AODVISstdn', 'EXTINCTdn', 'EXTINCTNIRdn', 'EXTINCTUVdn', 'EXTxASYMdn', 'FLDSC', 'FLNR', 'FSNR', + 'CME', 'CMFDQ', 'CMFMC','CMFMC_DP', 'SOLLD', 'SOLSD', 'SSAVIS', 'SST','TAQ', + 'DCOCHM','DH2O2CHM', 'DHNO3CHM', 'DO3CHM', 'Dso4_a1CHM', 'Dso4_a2CHM', 'Dso4_a3CHM', + 'FLASHFRQ', 'LNO_COL_PROD', 'LNO_PROD','KVH_CLUBB','MASS', 'PDELDRY', 'NITROP_PD','PM25', 'PRECT', 'PTEQ', 'PTTEND', + 'QRLC', 'QRSC', 'QSNOW', 'QRAIN','GS_SO2', 'HNO3_GAS', 'HNO3_NAT', 'HNO3_STS','H2SO4M_C', 'H2SO4_sfnnuc1','HCL_GAS', + 'SAD_AERO', 'SAD_ICE', 'SAD_LNAT', 'SAD_SULFC', 'SAD_TROP' 'RAD_ICE', 'RAD_LNAT', 'RAD_SULFC', 'REFF_AERO', 'RHREFHT', + 'EVAPPREC', 'EVAPQZM', 'EVAPTZM', 'FCTL','FREQZM', 'ZMDQ', 'ZMDT', 'ZMMTT', 'ZMMU','VEL_NAT2', + 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'bc_c1DDF', 'bc_c4DDF', 'dst_c1DDF', 'dst_c2DDF', 'dst_c3DDF', + 'ncl_c1DDF', 'ncl_c2DDF', 'ncl_c3DDF', 'pom_c1DDF', 'pom_c4DDF', 'num_c1DDF','num_c2DDF','num_c3DDF','num_c4DDF', + 'so4_a1_sfgaex1', 'so4_c1AQH2SO4', 'so4_c1AQSO4', 'so4_c1DDF', 'so4_a2_sfgaex1', 'so4_c2AQH2SO4', 'so4_c2AQSO4', 'so4_c2DDF', + 'so4_a3_sfgaex1', 'so4_c3AQH2SO4', 'so4_c3AQSO4', 'so4_c3DDF', 'so4_a2_sfnnuc1', 'num_a2_sfnnuc1', + 'soa1_a1_sfgaex1','soa1_c1DDF', 'soa1_a2_sfgaex1','soa1_c2DDF', 'soa2_a1_sfgaex1','soa2_c1DDF', 'soa2_a2_sfgaex1','soa2_c2DDF', + 'soa3_a1_sfgaex1','soa3_c1DDF', 'soa3_a2_sfgaex1','soa3_c2DDF', 'soa4_a1_sfgaex1','soa4_c1DDF', 'soa4_a2_sfgaex1','soa4_c2DDF', + 'soa5_a1_sfgaex1','soa5_c1DDF', 'soa5_a2_sfgaex1','soa5_c2DDF', 'jcl2o2', 'jh2o2', 'jno2', 'jo2_a', 'jo2_b', 'jo3_a', 'jo3_b', 'jpan', + 'r_het1', 'r_het2', 'r_het3', 'r_het4', 'r_het5', 'r_het6', 'r_het7', 'r_het8', 'r_het9', 'r_het10', 'r_het11', 'r_het12', 'r_het13', + 'r_het15', 'r_het16', 'r_het17', 'r_jsoa1_a1', 'r_jsoa1_a2', 'r_jsoa2_a1', 'r_jsoa2_a2', 'r_jsoa3_a1', 'r_jsoa3_a2', 'r_jsoa4_a1', + 'r_jsoa4_a2', 'r_jsoa5_a1', 'r_jsoa5_a2', 'r_GLYOXAL_aer', 'r_HO2_O3', 'r_N2O5_aer', 'r_NO2_aer', 'r_NO3_aer', 'r_O1D_H2O', 'r_OH_O3', 'r_OH_O', 'O3_Prod','O3_Loss','O3S_Loss','RO2_NO_sum','O3_alkenes','RO2_NO3_sum','RO2_HO2_sum','RO2_RO2_sum','RCO2_NO2_sum', - 'OddOx_Ox_Loss','OddOx_HOx_Loss','OddOx_NOx_Loss','OddOx_CLOxBROx_Loss','OddOx_Loss_Tot','OddOx_Prod_Tot', - 'Ox_Prod','Ox_Loss' + 'OddOx_Ox_Loss','OddOx_HOx_Loss','OddOx_NOx_Loss','OddOx_CLOxBROx_Loss','OddOx_Loss_Tot','OddOx_Prod_Tot', 'Ox_Prod','Ox_Loss' diff --git a/bld/namelist_files/use_cases/waccm_tsmlt_hist_cam6.xml b/bld/namelist_files/use_cases/waccm_tsmlt_hist_cam6.xml index 12628e4412..6ad0b14145 100644 --- a/bld/namelist_files/use_cases/waccm_tsmlt_hist_cam6.xml +++ b/bld/namelist_files/use_cases/waccm_tsmlt_hist_cam6.xml @@ -59,85 +59,36 @@ 'AOA1SRC', 'AOA2SRC', 'NO2_CMXF' - 'ABSORB', 'ACBZO2', 'ACTREL', 'ALKNIT', 'ALKO2', 'ALKOOH', 'AOA1', 'AOA_NH', 'AODABSdn', 'AODBCdn', 'AODdnDUST1', 'AODdnDUST2', - 'AODdnDUST3', 'AODdnMODE1', 'AODdnMODE2', 'AODdnMODE3', 'AODDUST2', 'AODDUST', 'AODNIRstdn', 'AODPOMdn', 'AODSO4dn', 'AODSOAdn', 'AODSSdn', - 'AODUVdn', 'AODUVstdn', 'AODVIS', 'AODVISdn', 'AODVISstdn', 'AQ_SO2', 'AREA', 'AREI', 'AREL', 'bc_a1', 'bc_a1DDF', - 'bc_a1SFWET', 'bc_a4', 'bc_a4_CLXF', 'bc_a4DDF', 'bc_a4SFWET', 'BCARY', 'bc_c1', 'bc_c1DDF', 'bc_c1SFWET', 'bc_c4', 'bc_c4DDF', - 'bc_c4SFWET', 'BENZENE', 'BENZO2', 'BENZOOH', 'BEPOMUC', 'BIGALD1', 'BIGALD2', 'BIGALD3', 'BIGALD4', 'BIGALD', 'BIGALK', 'BIGENE', - 'BR', 'BRCL', 'BRO', 'BRONO2', 'BROX', 'BROY', 'BRY', 'BTTGWSPEC', 'BTTGWSDF', 'BTTGWSKE', - 'BURDENBCdn', 'BURDENDUSTdn', 'BURDENPOMdn', 'BURDENSEASALTdn', 'BURDENSO4dn', - 'BURDENSOAdn', 'BUTGWSPEC', 'BZALD', 'BZOO', 'BZOOH', 'C2H2', 'C2H4', 'C2H5O2', 'C2H5OH', 'C2H5OOH', 'C2H6', 'C3H6', 'C3H7O2', - 'C3H7OOH', 'C3H8', 'C6H5O2', 'C6H5OOH', 'CCL4', 'CDNUMC', 'CF2CLBR', 'CF3BR', 'CFC113', 'CFC114', 'CFC115', 'CFC11', 'CFC11STAR', - 'CFC12', 'CH2BR2', 'CH2O', 'CH3BR', 'CH3CCL3', 'CH3CCL3_CHML', 'CH3CHO', 'CH3CL', 'CH3CN', 'CH3CO3', 'CH3COCH3', 'CH3COCHO', - 'CH3COOH', 'CH3COOOH', 'CH3O2', 'CH3OH', 'CH3OOH', 'CH4', 'CH4_CHML', 'CHBR3', 'CL2', 'CL2O2', 'CL', - 'CLDICE', 'CLDLIQ', 'CLDTOT', 'CLO', 'CLONO2', 'CLOUD', 'CLOX', 'CLOY', 'CLY', 'CME', 'CMFDQ', 'CMFMC', - 'CMFMC_DP', 'CO2', 'CO2_CHML', 'CO', 'CO_CHML', 'CO_CHMP', 'COF2', 'COFCL', 'CONCLD', 'CRESOL', - 'DCOCHM', 'DF_ALKNIT', 'DF_ALKOOH', 'DF_BENZOOH', 'DF_BZOOH', 'DF_C2H5OH', 'DF_C2H5OOH', 'DF_C3H7OOH', 'DF_C6H5OOH', 'DF_CH2O', - 'DF_CH3CHO', 'DF_CH3CN', 'DF_CH3COCH3', 'DF_CH3COCHO', 'DF_CH3COOH', 'DF_CH3COOOH', 'DF_CH3OH', 'DF_CH3OOH', 'DF_CO', 'DF_EOOH', - 'DF_GLYALD', 'DF_H2O2', 'DF_H2SO4', 'DF_HCN', 'DF_HCOOH', 'DF_HNO3', 'DF_HO2NO2', 'DF_HONITR', 'DF_HPALD', 'DF_HYAC', 'DF_HYDRALD', - 'DF_IEPOX', 'DF_ISOPNITA', 'DF_ISOPNITB', 'DF_ISOPNO3', 'DF_ISOPNOOH', 'DF_ISOPOOH', 'DF_IVOC', 'DF_MACROOH', 'DF_MEKOOH', - 'DF_MPAN', 'DF_NC4CH2OH', 'DF_NC4CHO', 'DF_NH3', 'DF_NH4', 'DF_NO2', 'DF_NO', 'DF_NOA', 'DF_NTERPOOH', 'DF_O3', - 'DF_ONITR', 'DF_PAN', 'DF_PHENOOH', 'DF_POOH', 'DF_ROOH', 'DF_SO2', 'DF_SOAG0', 'DF_SOAG1', 'DF_SOAG2', 'DF_SOAG3', - 'DF_SOAG4', 'DF_SVOC', 'DF_TERP2OOH', 'DF_TERPNIT', 'DF_TERPOOH', 'DF_TERPROD1', 'DF_TERPROD2', 'DF_TOLOOH', 'DF_XOOH', 'DF_XYLENOOH', - 'DF_XYLOLOOH', 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'DH2O2CHM', 'DHNO3CHM', 'DICARBO2', 'DMS', 'DO3CHM', 'dry_deposition_NHx_as_N', - 'dry_deposition_NOy_as_N', 'Dso4_a1CHM', 'Dso4_a2CHM', 'Dso4_a3CHM', 'dst_a1', 'dst_a1DDF', 'dst_a1SFWET', 'dst_a2', 'dst_a2DDF', - 'dst_a2SFWET', 'dst_a3', 'dst_a3DDF', 'dst_a3SFWET', 'dst_c1', 'dst_c1DDF', 'dst_c1SFWET', 'dst_c2', 'dst_c2DDF', 'dst_c2SFWET', - 'dst_c3', 'dst_c3DDF', 'dst_c3SFWET', 'DTCORE', 'E90', 'e', 'ENEO2', 'EO2', 'EO', 'EOOH', 'EVAPPREC', - 'EVAPQZM', 'EVAPTZM', 'EXTINCTdn', 'EXTINCTNIRdn', 'EXTINCTUVdn', 'EXTxASYMdn', 'F', 'FCTL', - 'FLASHFRQ', 'FLDS', 'FLDSC', 'FLNR', 'FLNS', 'FLNSC', 'FLNT', 'FLNTC', 'FLUT', 'FLUTC', 'FREQI', 'FREQL', 'FREQZM', 'FSDS', - 'FSDSC', 'FSNR', 'FSNS', 'FSNSC', 'FSNT', 'FSNTC', 'FSNTOAC', 'FSUTOA', 'GLYALD', 'GLYOXAL', - 'GS_SO2', 'H2402', 'H2', 'H2O2', 'H2O', 'H2SO4', 'H2SO4M_C', 'H2SO4_sfnnuc1', 'H', 'HBR', 'HCFC141B', 'HCFC142B', 'HCFC22', 'HCL', - 'HCL_GAS', 'HCN', 'HCOOH', 'HF', 'HNO3', 'HNO3_GAS', 'HNO3_NAT', 'HNO3_STS', 'HO2', 'HO2NO2', 'HOBR', 'HOCH2OO', 'HOCL', 'HONITR', - 'HPALD', 'HYAC', 'HYDRALD', 'ICEFRAC', 'IEPOX', 'ISOP', 'ISOPAO2', 'ISOPBO2', 'ISOPNITA', 'ISOPNITB', 'ISOPNO3', - 'ISOPNOOH', 'ISOPOOH', 'IVOC', 'IVOC_CHML', 'jcl2o2', 'jh2o2', 'jno2', 'jo2_a', 'jo2_b', 'jo3_a', 'jo3_b', 'jpan', 'KVH_CLUBB', - 'LANDFRAC', 'LHFLX', 'LNO_COL_PROD', 'LNO_PROD', 'MACR', 'MACRO2', 'MACROOH', 'MALO2', 'MASS', 'MCO3', 'MDIALO2', - 'MEG_BCARY', 'MEG_BIGALK', 'MEG_BIGENE', 'MEG_C2H4', 'MEG_C2H5OH', 'MEG_C2H6', 'MEG_C3H6', 'MEG_C3H8', 'MEG_CH2O', - 'MEG_CH3CHO', 'MEG_CH3COCH3', 'MEG_CH3COOH', 'MEG_CH3OH', 'MEG_CO', 'MEG_HCN', 'MEG_HCOOH', 'MEG_ISOP', 'MEG_MTERP', 'MEG_TOLUENE', - 'MEK', 'MEKO2', 'MEKOOH', 'MPAN', 'MTERP', 'MVK', 'N2D', 'N2O5', 'N2O', 'N2O_CHML', 'N2p', 'N', 'NC4CH2OH', - 'NC4CHO', 'ncl_a1', 'ncl_a1DDF', 'ncl_a1SFWET', 'ncl_a2', 'ncl_a2DDF', 'ncl_a2SFWET', 'ncl_a3', 'ncl_a3DDF', 'ncl_a3SFWET', 'ncl_c1', - 'ncl_c1DDF', 'ncl_c1SFWET', 'ncl_c2', 'ncl_c2DDF', 'ncl_c2SFWET', 'ncl_c3', 'ncl_c3DDF', 'ncl_c3SFWET', 'NDEP', 'NH3', 'NH4', 'NH_50', - 'NH_5', 'NHDEP', 'NITROP_PD', 'NO2', 'NO2_CLXF', 'NO3', 'NO', 'NOA', 'NOp', 'NOX', 'NOY', 'Np', 'NTERPO2', 'NTERPOOH', - 'num_a1', 'num_a1_CLXF', 'num_a1DDF', 'num_a2', 'num_a2_CLXF', 'num_a2DDF', 'num_a2_sfnnuc1', 'num_a3', 'num_a3DDF', 'num_a4', - 'num_a4DDF', 'num_c1', 'num_c1DDF', 'num_c2', 'num_c2DDF', 'num_c3', 'num_c3DDF', 'num_c4', 'num_c4DDF', 'NUMLIQ', 'O1D', 'O2_1D', - 'O2_1S', 'O2', 'O2p', 'O3', 'O3S', 'O3_CHML', 'O3_CHMP', 'O', 'OCLO', 'OCS', 'OH', 'OMEGA', 'OMEGAT', 'ONITR', 'Op', - 'PAN', 'PBLH', 'PBZNIT', 'PDELDRY', 'PHENO2', 'PHENO', 'PHENOL', 'PHENOOH', 'PHIS', 'PM25', 'PO2', 'pom_a1', 'pom_a1DDF', 'pom_a1SFWET', - 'pom_a4', 'pom_a4DDF', 'pom_a4SFWET', 'pom_c1', 'pom_c1DDF', 'pom_c1SFWET', 'pom_c4', 'pom_c4DDF', 'pom_c4SFWET', - 'POOH', 'PRECC', 'PRECT', 'PS', 'PSL', 'PTEQ', 'PTTEND', 'Q', 'QFLX', 'QRAIN', 'QREFHT', 'QRL', 'QRLC', 'QRS', - 'QRSC', 'QSNOW', 'RAD_ICE', 'RAD_LNAT', 'RAD_SULFC', 'REFF_AERO', 'RELHUM', 'r_GLYOXAL_aer', - 'r_het10', 'r_het11', 'r_het12', 'r_het13', 'r_het15', 'r_het16', 'r_het17', 'r_het1', 'r_het2', 'r_het3', 'r_het4', 'r_het5', - 'r_het6', 'r_het7', 'r_het8', 'r_het9', 'r_HO2_O3', 'RHREFHT', 'r_jsoa1_a1', 'r_jsoa1_a2', 'r_jsoa2_a1', 'r_jsoa2_a2', - 'r_jsoa3_a1', 'r_jsoa3_a2', 'r_jsoa4_a1', 'r_jsoa4_a2', 'r_jsoa5_a1', 'r_jsoa5_a2', 'r_N2O5_aer', 'r_NO2_aer', 'r_NO3_aer', 'r_O1D_H2O', - 'r_OH_O3', 'r_OH_O', 'ROOH', 'RO2', - 'S', 'SAD_AERO', 'SAD_ICE', 'SAD_LNAT', 'SAD_SULFC', 'SAD_TROP', 'SF6', 'SFbc_a4', 'SFBCARY', - 'SFBENZENE', 'SFBIGALK', 'SFBIGENE', 'SFC2H2', 'SFC2H4', 'SFC2H5OH', 'SFC2H6', 'SFC3H6', 'SFC3H8', 'SFCH2O', 'SFCH3CHO', 'SFCH3CN', - 'SFCH3COCH3', 'SFCH3COCHO', 'SFCH3COOH', 'SFCH3OH', 'SFCO', 'SFDMS', 'SFdst_a1', 'SFdst_a2', 'SFdst_a3', 'SFGLYALD', 'SFHCN', 'SFHCOOH', - 'SFISOP', 'SFIVOC', 'SFMEK', 'SFMTERP', 'SFncl_a1', 'SFncl_a2', 'SFncl_a3', 'SFNH3', 'SFNO2', 'SFNO', 'SFnum_a1', 'SFnum_a2', - 'SFnum_a3', 'SFpom_a4', 'SFSO2', 'SFso4_a1', 'SFso4_a2', 'SFSVOC', 'SFTOLUENE', 'SFXYLENES', 'SHFLX', 'SO2', - 'SO2_CHML', 'SO2_CHMP', 'SO2_CLXF', 'SO2_XFRC', 'SO3', 'so4_a1', 'so4_a1_CHMP', 'so4_a1_CLXF', 'so4_a1DDF', 'so4_a1_sfgaex1', 'so4_a1SFWET', - 'so4_a2', 'so4_a2_CHMP', 'so4_a2_CLXF', 'so4_a2DDF', 'so4_a2_sfgaex1', 'so4_a2_sfnnuc1', 'so4_a2SFWET', 'so4_a3', - 'so4_a3DDF', 'so4_a3_sfgaex1', 'so4_a3SFWET', 'so4_c1', 'so4_c1AQH2SO4', 'so4_c1AQSO4', 'so4_c1DDF', 'so4_c1SFWET', 'so4_c2', 'so4_c2AQH2SO4', - 'so4_c2AQSO4', 'so4_c2DDF', 'so4_c2SFWET', 'so4_c3', 'so4_c3AQH2SO4', 'so4_c3AQSO4', 'so4_c3DDF', 'so4_c3SFWET', 'SO', 'soa1_a1', - 'soa1_a1_CHML', 'soa1_a1DDF', 'soa1_a1_sfgaex1', 'soa1_a1SFWET', 'soa1_a2', 'soa1_a2_CHML', 'soa1_a2DDF', - 'soa1_a2_sfgaex1', 'soa1_a2SFWET', 'soa1_c1', 'soa1_c1DDF', 'soa1_c1SFWET', 'soa1_c2', 'soa1_c2DDF', 'soa1_c2SFWET', 'soa2_a1', 'soa2_a1_CHML', - 'soa2_a1DDF', 'soa2_a1_sfgaex1', 'soa2_a1SFWET', 'soa2_a2', 'soa2_a2_CHML', 'soa2_a2DDF', 'soa2_a2_sfgaex1', - 'soa2_a2SFWET', 'soa2_c1', 'soa2_c1DDF', 'soa2_c1SFWET', 'soa2_c2', 'soa2_c2DDF', 'soa2_c2SFWET', 'soa3_a1', 'soa3_a1_CHML', - 'soa3_a1DDF', 'soa3_a1_sfgaex1', 'soa3_a1SFWET', 'soa3_a2', 'soa3_a2_CHML', 'soa3_a2DDF', 'soa3_a2_sfgaex1', 'soa3_a2SFWET', - 'soa3_c1', 'soa3_c1DDF', 'soa3_c1SFWET', 'soa3_c2', 'soa3_c2DDF', 'soa3_c2SFWET', 'soa4_a1', 'soa4_a1_CHML', 'soa4_a1DDF', - 'soa4_a1_sfgaex1', 'soa4_a1SFWET', 'soa4_a2', 'soa4_a2_CHML', 'soa4_a2DDF', 'soa4_a2_sfgaex1', 'soa4_a2SFWET', 'soa4_c1', - 'soa4_c1DDF', 'soa4_c1SFWET', 'soa4_c2', 'soa4_c2DDF', 'soa4_c2SFWET', 'soa5_a1', 'soa5_a1_CHML', 'soa5_a1DDF', 'soa5_a1_sfgaex1', - 'soa5_a1SFWET', 'soa5_a2', 'soa5_a2_CHML', 'soa5_a2DDF', 'soa5_a2_sfgaex1', 'soa5_a2SFWET', 'soa5_c1', 'soa5_c1DDF', - 'soa5_c1SFWET', 'soa5_c2', 'soa5_c2DDF', 'soa5_c2SFWET', 'SOAG0', 'SOAG0_CHMP', 'SOAG1', 'SOAG1_CHMP', 'SOAG2', 'SOAG2_CHMP', - 'SOAG3', 'SOAG3_CHMP', 'SOAG4', 'SOAG4_CHMP', 'SOLIN', 'SOLLD', 'SOLSD', 'SSAVIS', 'SST', 'ST80_25', 'SVOC', 'SVOC_CHML', - 'T', 'TAQ', 'TAUBLJX', 'TAUBLJY', 'TAUGWX', 'TAUGWY', 'TAUX', 'TAUY', 'TBRY', 'TCLY', 'TEPOMUC', 'TERP2O2', 'TERP2OOH', - 'TERPNIT', 'TERPO2', 'TERPOOH', 'TERPROD1', 'TERPROD2', 'TGCLDIWP', 'TGCLDLWP', 'TMDMS', 'TMOCS', 'TMQ', 'TMSO2', - 'TMso4_a1', 'TMso4_a2', 'TMso4_a3', 'TOLO2', 'TOLOOH', 'TOLUENE', 'TOT_CLD_VISTAU', 'TOTH', 'TREFHT', 'TREFHTMN', 'TREFHTMX', 'TROP_P', - 'TROP_T', 'TROP_Z', 'TS', 'TSMN:M', 'TSMX:X', 'TTEND_TOT', 'TTGWORO', 'TTGWSDF', 'TTGWSDFORO', 'TTGWSKE', 'TTGWSKEORO', 'TTGWSPEC', - 'U10', 'U', 'UTGWORO', 'UTGWSPEC', 'UU', 'V', 'VD01', 'VEL_NAT2', 'VV', - 'wet_deposition_NHx_as_N', 'wet_deposition_NOy_as_N', 'XO2', 'XOOH', 'XYLENES', 'XYLENO2', 'XYLENOOH', 'XYLOL', 'XYLOLO2', - 'XYLOLOOH', 'Z3', 'ZMDQ', 'ZMDT', 'ZMMTT', 'ZMMU', + 'ACTREL', 'AQ_SO2', 'AREA', 'BROX', 'BROY', 'BRY', 'CLOX', 'CLOY', 'CLY', 'NOX', 'NOY', 'TBRY', 'TCLY', 'CFC11STAR', + 'BTTGWSPEC', 'BTTGWSDF', 'BTTGWSKE', 'CONCLD', 'CME', 'CMFDQ', 'CMFMC', 'CMFMC_DP', + 'CH3CCL3_CHML', 'CH4_CHML', 'CO2_CHML', 'CO_CHML', 'IVOC_CHML', 'N2O_CHML', 'O3_CHML', 'SO2_CHML', + 'CO_CHMP', 'O3_CHMP', 'SO2_CHMP', 'TMDMS', 'TMOCS', 'TMSO2','TMso4_a1', 'TMso4_a2', 'TMso4_a3', + 'soa1_a1_CHML', 'soa1_a2_CHML', 'soa2_a1_CHML', 'soa2_a2_CHML', 'soa3_a1_CHML', 'soa3_a2_CHML', + 'soa4_a1_CHML', 'soa4_a2_CHML', 'soa5_a1_CHML', 'soa5_a2_CHML', 'SVOC_CHML', + 'so4_a1_CHMP','so4_a2_CHMP', 'SOAG0_CHMP', 'SOAG1_CHMP', 'SOAG2_CHMP', 'SOAG3_CHMP', 'SOAG4_CHMP', 'TOTH', 'TOT_CLD_VISTAU', + 'TREFHTMN', 'TREFHTMX', 'TROP_P', 'TROP_T', 'TROP_Z', 'TTEND_TOT', 'TTGWORO', 'TTGWSDF', 'TTGWSDFORO', 'TTGWSKE', 'TTGWSKEORO', + 'TS', 'TSMN:M', 'TSMX:X', 'BURDENBCdn', 'BURDENDUSTdn', 'BURDENPOMdn', 'BURDENSEASALTdn', 'BURDENSO4dn', 'BURDENSOAdn', + 'ABSORB', 'AODABSdn', 'AODBCdn', 'AODdnDUST01', 'AODdnDUST02', 'AODdnDUST03', 'AODdn_aitken', 'AODdn_accum', 'AODdn_coarse', + 'AODDUST02', 'AODDUST', 'AODNIRstdn', 'AODPOMdn', 'AODSO4dn', 'AODSOAdn', 'AODSSdn', 'AODUVdn', 'AODUVstdn', 'AODVIS', + 'AODVISdn', 'AODVISstdn', 'EXTINCTdn', 'EXTINCTNIRdn', 'EXTINCTUVdn', 'EXTxASYMdn', 'FLDSC', 'FLNR', 'FSNR', + 'CME', 'CMFDQ', 'CMFMC','CMFMC_DP', 'SOLLD', 'SOLSD', 'SSAVIS', 'SST','TAQ', + 'DCOCHM','DH2O2CHM', 'DHNO3CHM', 'DO3CHM', 'Dso4_a1CHM', 'Dso4_a2CHM', 'Dso4_a3CHM', + 'FLASHFRQ', 'LNO_COL_PROD', 'LNO_PROD','KVH_CLUBB','MASS', 'PDELDRY', 'NITROP_PD','PM25', 'PRECT', 'PTEQ', 'PTTEND', + 'QRLC', 'QRSC', 'QSNOW', 'QRAIN','GS_SO2', 'HNO3_GAS', 'HNO3_NAT', 'HNO3_STS','H2SO4M_C', 'H2SO4_sfnnuc1','HCL_GAS', + 'SAD_AERO', 'SAD_ICE', 'SAD_LNAT', 'SAD_SULFC', 'SAD_TROP' 'RAD_ICE', 'RAD_LNAT', 'RAD_SULFC', 'REFF_AERO', 'RHREFHT', + 'EVAPPREC', 'EVAPQZM', 'EVAPTZM', 'FCTL','FREQZM', 'ZMDQ', 'ZMDT', 'ZMMTT', 'ZMMU','VEL_NAT2', + 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'bc_c1DDF', 'bc_c4DDF', 'dst_c1DDF', 'dst_c2DDF', 'dst_c3DDF', + 'ncl_c1DDF', 'ncl_c2DDF', 'ncl_c3DDF', 'pom_c1DDF', 'pom_c4DDF', 'num_c1DDF','num_c2DDF','num_c3DDF','num_c4DDF', + 'so4_a1_sfgaex1', 'so4_c1AQH2SO4', 'so4_c1AQSO4', 'so4_c1DDF', 'so4_a2_sfgaex1', 'so4_c2AQH2SO4', 'so4_c2AQSO4', 'so4_c2DDF', + 'so4_a3_sfgaex1', 'so4_c3AQH2SO4', 'so4_c3AQSO4', 'so4_c3DDF', 'so4_a2_sfnnuc1', 'num_a2_sfnnuc1', + 'soa1_a1_sfgaex1','soa1_c1DDF', 'soa1_a2_sfgaex1','soa1_c2DDF', 'soa2_a1_sfgaex1','soa2_c1DDF', 'soa2_a2_sfgaex1','soa2_c2DDF', + 'soa3_a1_sfgaex1','soa3_c1DDF', 'soa3_a2_sfgaex1','soa3_c2DDF', 'soa4_a1_sfgaex1','soa4_c1DDF', 'soa4_a2_sfgaex1','soa4_c2DDF', + 'soa5_a1_sfgaex1','soa5_c1DDF', 'soa5_a2_sfgaex1','soa5_c2DDF', 'jcl2o2', 'jh2o2', 'jno2', 'jo2_a', 'jo2_b', 'jo3_a', 'jo3_b', 'jpan', + 'r_het1', 'r_het2', 'r_het3', 'r_het4', 'r_het5', 'r_het6', 'r_het7', 'r_het8', 'r_het9', 'r_het10', 'r_het11', 'r_het12', 'r_het13', + 'r_het15', 'r_het16', 'r_het17', 'r_jsoa1_a1', 'r_jsoa1_a2', 'r_jsoa2_a1', 'r_jsoa2_a2', 'r_jsoa3_a1', 'r_jsoa3_a2', 'r_jsoa4_a1', + 'r_jsoa4_a2', 'r_jsoa5_a1', 'r_jsoa5_a2', 'r_GLYOXAL_aer', 'r_HO2_O3', 'r_N2O5_aer', 'r_NO2_aer', 'r_NO3_aer', 'r_O1D_H2O', 'r_OH_O3', 'r_OH_O', 'O3_Prod','O3_Loss','O3S_Loss','RO2_NO_sum','O3_alkenes','RO2_NO3_sum','RO2_HO2_sum','RO2_RO2_sum','RCO2_NO2_sum', - 'OddOx_Ox_Loss','OddOx_HOx_Loss','OddOx_NOx_Loss','OddOx_CLOxBROx_Loss','OddOx_Loss_Tot','OddOx_Prod_Tot', - 'Ox_Prod','Ox_Loss' + 'OddOx_Ox_Loss','OddOx_HOx_Loss','OddOx_NOx_Loss','OddOx_CLOxBROx_Loss','OddOx_Loss_Tot','OddOx_Prod_Tot', 'Ox_Prod','Ox_Loss' diff --git a/bld/namelist_files/use_cases/waccmx_ma_2000_cam6.xml b/bld/namelist_files/use_cases/waccmx_ma_2000_cam6.xml index cb86bc0f9c..7052ac83bb 100644 --- a/bld/namelist_files/use_cases/waccmx_ma_2000_cam6.xml +++ b/bld/namelist_files/use_cases/waccmx_ma_2000_cam6.xml @@ -101,9 +101,4 @@ 42 - - 'SolIonRate_Tot = jeuv_1 + jeuv_2 + jeuv_3 + jeuv_4 + jeuv_5 + jeuv_6 + jeuv_7 + jeuv_8 + jeuv_9 + jeuv_10 + jeuv_11 + jeuv_14 + jeuv_15 + jeuv_16 +', - 'jeuv_17 + jeuv_18 + jeuv_19 + jeuv_20 + jeuv_21 + jeuv_22 + jeuv_23', - - diff --git a/bld/namelist_files/use_cases/waccmx_ma_hist_cam6.xml b/bld/namelist_files/use_cases/waccmx_ma_hist_cam6.xml index 7075565589..c928b43f28 100644 --- a/bld/namelist_files/use_cases/waccmx_ma_hist_cam6.xml +++ b/bld/namelist_files/use_cases/waccmx_ma_hist_cam6.xml @@ -99,9 +99,4 @@ 42 - - 'SolIonRate_Tot = jeuv_1 + jeuv_2 + jeuv_3 + jeuv_4 + jeuv_5 + jeuv_6 + jeuv_7 + jeuv_8 + jeuv_9 + jeuv_10 + jeuv_11 + jeuv_14 + jeuv_15 + jeuv_16 +', - 'jeuv_17 + jeuv_18 + jeuv_19 + jeuv_20 + jeuv_21 + jeuv_22 + jeuv_23', - - diff --git a/cime_config/config_component.xml b/cime_config/config_component.xml index be98795548..6326bd3c8a 100644 --- a/cime_config/config_component.xml +++ b/cime_config/config_component.xml @@ -8,11 +8,11 @@ CAM =============== --> - CAM cam6 physics: + CAM cam6 physics: CAM cam5 physics: CAM cam4 physics: CAM cam3 physics: - CAM simplified and non-versioned physics : + CAM simplified and non-versioned physics : CAM7 development physics: + With Harmonized Emissions Component (HEMCO) for chemistry: + -phys adiabatic -phys adiabatic -phys tj2016 -analytic_ic + -phys grayrad -analytic_ic -phys held_suarez -analytic_ic -phys kessler -chem terminator -analytic_ic -nadv_tt=6 @@ -295,6 +303,7 @@ dabi_p2004 held_suarez_1994 dctest_tj2016 + dctest_frierson dctest_baro_kessler @@ -334,6 +343,8 @@ flbc_file='$DIN_LOC_ROOT/atm/waccm/lb/LBC_CMIP6_1pctCO2ramp_y1-165_0p5degLat_c180930.nc' nlte_limit_co2=.true. co2_cycle_rad_passive=.true. + + use_hemco=.true. rearth = 6.37122D6 diff --git a/cime_config/config_compsets.xml b/cime_config/config_compsets.xml index ba14ff840e..264cde524f 100644 --- a/cime_config/config_compsets.xml +++ b/cime_config/config_compsets.xml @@ -56,12 +56,7 @@ - NFLT1850_TESTINGONLY_v0c - 1850_CAM%DEV%NORESM%LT%GHGMAM4_CLM51%SP_CICE%PRES_DOCN%DOM_MOSART_SGLC_SWAV - - - - NFLTHIST_v0c + NFLTHIST_v0d HIST_CAM%DEV%LT%NORESM%GHGMAM4_CLM51%SP_CICE%PRES_DOCN%DOM_MOSART_SGLC_SWAV @@ -90,12 +85,12 @@ - FLTHIST_v0c - HIST_CAM%DEV%GHGMAM4_CLM51%SP_CICE%PRES_DOCN%DOM_MOSART_SGLC_SWAV + FLTHIST_v0d + HIST_CAM%DEV%LT%GHGMAM4_CLM51%SP_CICE%PRES_DOCN%DOM_MOSART_SGLC_SWAV - FMTHIST_v0c + FMTHIST_v0d HIST_CAM%DEV%MT%GHGMAM4_CLM51%SP_CICE%PRES_DOCN%DOM_MOSART_SGLC_SWAV @@ -339,11 +334,19 @@ FC2000climo 2000_CAM60%CCTS1_CLM50%SP_CICE%PRES_DOCN%DOM_MOSART_SGLC_SWAV + + FC2000climo_HCO + 2000_CAM60%CCTS1%HEMCO_CLM50%SP_CICE%PRES_DOCN%DOM_MOSART_SGLC_SWAV + FC2010climo 2010_CAM60%CCTS1_CLM50%SP_CICE%PRES_DOCN%DOM_MOSART_SGLC_SWAV + + FC2010climo_HCO + 2010_CAM60%CCTS1%HEMCO_CLM50%SP_CICE%PRES_DOCN%DOM_MOSART_SGLC_SWAV + FCHIST @@ -365,6 +368,10 @@ FCfireHIST HIST_CAM60%CFIRE_CLM50%BGC-CROP_CICE%PRES_DOCN%DOM_MOSART_SGLC_SWAV + + FCHIST_HCO + HIST_CAM60%CCTS1%HEMCO_CLM50%SP_CICE%PRES_DOCN%DOM_MOSART_SGLC_SWAV + FCnudged @@ -374,6 +381,14 @@ FCts2nudged HIST_CAM60%CCTS2%NUDG_CLM50%SP_CICE%PRES_DOCN%DOM_MOSART_SGLC_SWAV + + FCnudged_HCO + HIST_CAM60%CCTS1%NUDG%HEMCO_CLM50%SP_CICE%PRES_DOCN%DOM_MOSART_SGLC_SWAV + + + FCts2nudged_HCO + HIST_CAM60%CCTS2%NUDG%HEMCO_CLM50%SP_CICE%PRES_DOCN%DOM_MOSART_SGLC_SWAV + FCSD @@ -383,6 +398,10 @@ FCts2SD HIST_CAM60%CCTS2%SDYN_CLM50%SP_CICE%PRES_DOCN%DOM_MOSART_SGLC_SWAV + + FCSD_HCO + HIST_CAM60%CCTS1%SDYN%HEMCO_CLM50%SP_CICE%PRES_DOCN%DOM_MOSART_SGLC_SWAV + FSD @@ -404,6 +423,10 @@ HIST_CAM60_CLM50%SP_CICE%PRES_DOCN%DOM_SROF_SGLC_SWAV + + FGRAYRAD + 2000_CAM%GRAYRAD_SLND_SICE_SOCN_SROF_SGLC_SWAV + diff --git a/cime_config/testdefs/testlist_cam.xml b/cime_config/testdefs/testlist_cam.xml index d1f05ea1e2..3149a3f9d4 100644 --- a/cime_config/testdefs/testlist_cam.xml +++ b/cime_config/testdefs/testlist_cam.xml @@ -10,7 +10,7 @@ - + @@ -100,7 +100,7 @@ - + diff --git a/cime_config/testdefs/testmods_dirs/cam/scmarm/shell_commands b/cime_config/testdefs/testmods_dirs/cam/scmarm/shell_commands index 31a36fb678..2898a75de3 100644 --- a/cime_config/testdefs/testmods_dirs/cam/scmarm/shell_commands +++ b/cime_config/testdefs/testmods_dirs/cam/scmarm/shell_commands @@ -3,7 +3,6 @@ ./xmlchange GLC_NCPL=\$ATM_NCPL ./xmlchange EPS_AAREA=9.0e-4 ./xmlchange EPS_AGRID=9.0e-5 -./xmlchange MPILIB=mpi-serial ./xmlchange REST_OPTION=never ./xmlchange CAM_NML_USE_CASE=UNSET ./xmlchange PTS_LAT=36.6 diff --git a/cime_config/usermods_dirs/CMIP6_B1850/user_nl_cam b/cime_config/usermods_dirs/CMIP6_B1850/user_nl_cam index 45e18d1a6a..7958c8cd03 100644 --- a/cime_config/usermods_dirs/CMIP6_B1850/user_nl_cam +++ b/cime_config/usermods_dirs/CMIP6_B1850/user_nl_cam @@ -1,64 +1,62 @@ -nhtfrq = 0, -24, -6, -3, -1, 1, -24,-120,-240 +nhtfrq = 0, -24, -6, -3, -1, 1, -24,-120,-240 -mfilt = 1, 5, 20, 40, 120, 240, 365, 73, 365 +mfilt = 1, 5, 20, 40, 120, 240, 365, 73, 365 ndens = 2, 2, 2, 2, 2, 2, 1, 1, 1 -fincl1 = 'ABSORB:A', 'ACTREL:A', 'AODABSdn:A', 'AODBCdn:A', 'AODdnDUST1:A', 'AODdnDUST2:A', - 'AODdnDUST3:A', 'AODdnMODE1:A', 'AODdnMODE2:A', 'AODdnMODE3:A', 'AODDUST2:A', 'AODDUST:A', 'AODNIRstdn:A', 'AODPOMdn:A', 'AODSO4dn:A', 'AODSOAdn:A', 'AODSSdn:A', - 'AODUVdn:A', 'AODUVstdn:A', 'AODVIS:A', 'AODVISdn:A', 'AODVISstdn:A', 'AQ_SO2:A', 'AREA:A', 'AREI:A', 'AREL:A', 'bc_a1:A', 'bc_a1DDF:A', - 'bc_a1SFWET:A', 'bc_a4:A', 'bc_a4DDF:A', 'bc_a4SFWET:A', 'bc_c1:A', 'bc_c1DDF:A', 'bc_c1SFWET:A', 'bc_c4:A', 'bc_c4DDF:A', - 'bc_c4SFWET:A', 'BROX:A', 'BROY:A', 'BURDENBCdn', 'BURDENDUSTdn:A', 'BURDENPOMdn:A', 'BURDENSEASALTdn:A', 'BURDENSO4dn:A', - 'BURDENSOAdn:A', 'CDNUMC:A', 'CLDICE:A', 'CLDLIQ:A', 'CLDTOT:A', 'CLOUD:A', 'CLOX:A', 'CLOY:A', 'CME:A', 'CMFDQ:A', 'CMFMC:A', - 'CMFMC_DP:A', 'CO2:A', 'CONCLD:A', 'DF_H2O2:A', 'DF_H2SO4:A', - 'DF_SO2:A', 'dgnumwet1:A', 'dgnumwet2:A', 'dgnumwet3:A', 'DH2O2CHM:A', 'DMS:A', 'dry_deposition_NHx_as_N:A', - 'dry_deposition_NOy_as_N:A', 'Dso4_a1CHM:A', 'Dso4_a2CHM:A', 'Dso4_a3CHM:A', 'dst_a1:A', 'dst_a1DDF:A', 'dst_a1SFWET:A', 'dst_a2:A', 'dst_a2DDF:A', - 'dst_a2SFWET:A', 'dst_a3:A', 'dst_a3DDF:A', 'dst_a3SFWET:A', 'dst_c1:A', 'dst_c1DDF:A', 'dst_c1SFWET:A', 'dst_c2:A', 'dst_c2DDF:A', 'dst_c2SFWET:A', - 'dst_c3:A', 'dst_c3DDF:A', 'dst_c3SFWET:A', 'DTCORE:A', 'EVAPPREC:A', - 'EVAPQZM:A', 'EVAPTZM:A', 'EXTINCTdn:A', 'EXTINCTNIRdn:A', 'EXTINCTUVdn:A', 'EXTxASYMdn:A', 'FCTL:A', - 'FLDS:A', 'FLDSC:A', 'FLNR:A', 'FLNS:A', 'FLNSC:A', 'FLNT:A', 'FLNTC:A', 'FLUT:A', 'FLUTC:A', 'FREQI:A', 'FREQL:A', 'FREQZM:A', 'FSDS:A', - 'FSDSC:A', 'FSNR:A', 'FSNS:A', 'FSNSC:A', 'FSNT:A', 'FSNTC:A', 'FSNTOAC:A', 'FSUTOA:A', - 'GS_SO2:A', 'H2O2:A', 'H2O:A', 'H2SO4:A', 'H2SO4M_C:A', 'H2SO4_sfnnuc1:A', +fincl1 = 'ABSORB:A', 'ACTREL:A', 'AODABSdn:A', 'AODBCdn:A', 'AODdnDUST01:A', 'AODdnDUST02:A', + 'AODdnDUST03:A', 'AODdn_aitken:A', 'AODdn_accum:A', 'AODdn_coarse:A', 'AODDUST02:A', 'AODDUST:A', 'AODNIRstdn:A', 'AODPOMdn:A', 'AODSO4dn:A', 'AODSOAdn:A', 'AODSSdn:A', + 'AODUVdn:A', 'AODUVstdn:A', 'AODVIS:A', 'AODVISdn:A', 'AODVISstdn:A', 'AQ_SO2:A', 'AREA:A', 'AREI:A', 'AREL:A', 'bc_a1:A', 'bc_a1DDF:A', + 'bc_a1SFWET:A', 'bc_a4:A', 'bc_a4DDF:A', 'bc_a4SFWET:A', 'bc_c1:A', 'bc_c1DDF:A', 'bc_c1SFWET:A', 'bc_c4:A', 'bc_c4DDF:A', + 'bc_c4SFWET:A', 'BROX:A', 'BROY:A', 'BURDENBCdn', 'BURDENDUSTdn:A', 'BURDENPOMdn:A', 'BURDENSEASALTdn:A', 'BURDENSO4dn:A', + 'BURDENSOAdn:A', 'CDNUMC:A', 'CLDICE:A', 'CLDLIQ:A', 'CLDTOT:A', 'CLOUD:A', 'CLOX:A', 'CLOY:A', 'CME:A', 'CMFDQ:A', 'CMFMC:A', + 'CMFMC_DP:A', 'CO2:A', 'CONCLD:A', 'DF_H2O2:A', 'DF_H2SO4:A', + 'DF_SO2:A', 'dgnumwet1:A', 'dgnumwet2:A', 'dgnumwet3:A', 'DH2O2CHM:A', 'DMS:A', 'dry_deposition_NHx_as_N:A', + 'dry_deposition_NOy_as_N:A', 'Dso4_a1CHM:A', 'Dso4_a2CHM:A', 'Dso4_a3CHM:A', 'dst_a1:A', 'dst_a1DDF:A', 'dst_a1SFWET:A', 'dst_a2:A', 'dst_a2DDF:A', + 'dst_a2SFWET:A', 'dst_a3:A', 'dst_a3DDF:A', 'dst_a3SFWET:A', 'dst_c1:A', 'dst_c1DDF:A', 'dst_c1SFWET:A', 'dst_c2:A', 'dst_c2DDF:A', 'dst_c2SFWET:A', + 'dst_c3:A', 'dst_c3DDF:A', 'dst_c3SFWET:A', 'DTCORE:A', 'EVAPPREC:A', + 'EVAPQZM:A', 'EVAPTZM:A', 'EXTINCTdn:A', 'EXTINCTNIRdn:A', 'EXTINCTUVdn:A', 'EXTxASYMdn:A', 'FCTL:A', + 'FLDS:A', 'FLDSC:A', 'FLNR:A', 'FLNS:A', 'FLNSC:A', 'FLNT:A', 'FLNTC:A', 'FLUT:A', 'FLUTC:A', 'FREQI:A', 'FREQL:A', 'FREQZM:A', 'FSDS:A', + 'FSDSC:A', 'FSNR:A', 'FSNS:A', 'FSNSC:A', 'FSNT:A', 'FSNTC:A', 'FSNTOAC:A', 'FSUTOA:A', + 'GS_SO2:A', 'H2O2:A', 'H2O:A', 'H2SO4:A', 'H2SO4M_C:A', 'H2SO4_sfnnuc1:A', 'HCL_GAS:A', 'HNO3_GAS:A', 'HNO3_NAT:A', 'HNO3_STS:A', 'HO2:A', 'ICEFRAC:A','jh2o2:A','KVH_CLUBB:A', 'LANDFRAC:A', 'LHFLX:A', 'MASS:A', - 'ncl_a1:A', 'ncl_a1DDF:A', 'ncl_a1SFWET:A', 'ncl_a2:A', 'ncl_a2DDF:A', 'ncl_a2SFWET:A', 'ncl_a3:A', 'ncl_a3DDF:A', 'ncl_a3SFWET:A', 'ncl_c1:A', + 'ncl_a1:A', 'ncl_a1DDF:A', 'ncl_a1SFWET:A', 'ncl_a2:A', 'ncl_a2DDF:A', 'ncl_a2SFWET:A', 'ncl_a3:A', 'ncl_a3DDF:A', 'ncl_a3SFWET:A', 'ncl_c1:A', 'ncl_c1DDF:A', 'ncl_c1SFWET:A', 'ncl_c2:A', 'ncl_c2DDF:A', 'ncl_c2SFWET:A', 'ncl_c3:A', 'ncl_c3DDF:A', 'ncl_c3SFWET:A', 'NITROP_PD:A', 'NO3:A', 'NOX:A', 'NOY:A', - 'num_a1:A', 'num_a1_CLXF:A', 'num_a1DDF:A', 'num_a2:A', 'num_a2_CLXF:A', 'num_a2DDF:A', 'num_a2_sfnnuc1:A', 'num_a3:A', 'num_a3DDF:A', 'num_a4:A', + 'num_a1:A', 'num_a1_CLXF:A', 'num_a1DDF:A', 'num_a2:A', 'num_a2_CLXF:A', 'num_a2DDF:A', 'num_a2_sfnnuc1:A', 'num_a3:A', 'num_a3DDF:A', 'num_a4:A', 'num_a4DDF:A', 'num_c1:A', 'num_c1DDF:A', 'num_c2:A', 'num_c2DDF:A', 'num_c3:A', 'num_c3DDF:A', 'num_c4:A', 'num_c4DDF:A', 'NUMLIQ:A', 'O3:A', - 'OH:A', 'OMEGA:A', 'OMEGAT:A', 'PBLH:A', 'PDELDRY:A', 'PHIS:A', 'pom_a1:A', 'pom_a1DDF:A', 'pom_a1SFWET:A', - 'pom_a4:A', 'pom_a4DDF:A', 'pom_a4SFWET:A', 'pom_c1:A', 'pom_c1DDF:A', 'pom_c1SFWET:A', 'pom_c4:A', 'pom_c4DDF:A', 'pom_c4SFWET:A', - 'PRECC:A', 'PRECT:A', 'PS:A', 'PSL:A', 'PTEQ:A', 'PTTEND:A', 'Q:A', 'QFLX:A', 'QRAIN:A', 'QREFHT:A', 'QRL:A', 'QRLC:A', 'QRS:A', + 'OH:A', 'OMEGA:A', 'OMEGAT:A', 'PBLH:A', 'PDELDRY:A', 'PHIS:A', 'pom_a1:A', 'pom_a1DDF:A', 'pom_a1SFWET:A', + 'pom_a4:A', 'pom_a4DDF:A', 'pom_a4SFWET:A', 'pom_c1:A', 'pom_c1DDF:A', 'pom_c1SFWET:A', 'pom_c4:A', 'pom_c4DDF:A', 'pom_c4SFWET:A', + 'PRECC:A', 'PRECT:A', 'PS:A', 'PSL:A', 'PTEQ:A', 'PTTEND:A', 'Q:A', 'QFLX:A', 'QRAIN:A', 'QREFHT:A', 'QRL:A', 'QRLC:A', 'QRS:A', 'QRSC:A', 'QSNOW:A', 'RAD_ICE:A', 'RAD_LNAT:A', 'RAD_SULFC:A', 'REFF_AERO:A', 'RELHUM:A', 'RHREFHT:A', 'SAD_AERO:A', 'SAD_ICE:A', 'SAD_LNAT:A', 'SAD_SULFC:A', 'SAD_TROP:A', 'SFbc_a4:A', - 'SFDMS:A', 'SFdst_a1:A', 'SFdst_a2:A', 'SFdst_a3:A', - 'SFncl_a1:A', 'SFncl_a2:A', 'SFncl_a3:A', 'SFnum_a1:A', 'SFnum_a2:A', - 'SFnum_a3:A', 'SFpom_a4:A', 'SFSO2:A', 'SFso4_a1:A', 'SFso4_a2:A', 'SHFLX:A', 'SO2:A', - 'SO2_CHML:A', 'SO2_CHMP:A', 'SO2_CLXF:A', 'SO2_XFRC:A', 'so4_a1:A', 'so4_a1_CHMP:A', 'so4_a1_CLXF:A', 'so4_a1DDF:A', 'so4_a1_sfgaex1:A', 'so4_a1SFWET:A', - 'so4_a2:A', 'so4_a2_CHMP:A', 'so4_a2_CLXF:A', 'so4_a2DDF:A', 'so4_a2_sfgaex1:A', 'so4_a2_sfnnuc1:A', 'so4_a2SFWET:A', 'so4_a3:A', - 'so4_a3DDF:A', 'so4_a3_sfgaex1:A', 'so4_a3SFWET:A', 'so4_c1:A', 'so4_c1AQH2SO4:A', 'so4_c1AQSO4:A', 'so4_c1DDF:A', 'so4_c1SFWET:A', 'so4_c2:A', 'so4_c2AQH2SO4:A', - 'so4_c2AQSO4:A', 'so4_c2DDF:A', 'so4_c2SFWET:A', 'so4_c3:A', 'so4_c3AQH2SO4:A', 'so4_c3AQSO4:A', 'so4_c3DDF:A', 'so4_c3SFWET:A', + 'SFDMS:A', 'SFdst_a1:A', 'SFdst_a2:A', 'SFdst_a3:A', + 'SFncl_a1:A', 'SFncl_a2:A', 'SFncl_a3:A', 'SFnum_a1:A', 'SFnum_a2:A', + 'SFnum_a3:A', 'SFpom_a4:A', 'SFSO2:A', 'SFso4_a1:A', 'SFso4_a2:A', 'SHFLX:A', 'SO2:A', + 'SO2_CHML:A', 'SO2_CHMP:A', 'SO2_CLXF:A', 'SO2_XFRC:A', 'so4_a1:A', 'so4_a1_CHMP:A', 'so4_a1_CLXF:A', 'so4_a1DDF:A', 'so4_a1_sfgaex1:A', 'so4_a1SFWET:A', + 'so4_a2:A', 'so4_a2_CHMP:A', 'so4_a2_CLXF:A', 'so4_a2DDF:A', 'so4_a2_sfgaex1:A', 'so4_a2_sfnnuc1:A', 'so4_a2SFWET:A', 'so4_a3:A', + 'so4_a3DDF:A', 'so4_a3_sfgaex1:A', 'so4_a3SFWET:A', 'so4_c1:A', 'so4_c1AQH2SO4:A', 'so4_c1AQSO4:A', 'so4_c1DDF:A', 'so4_c1SFWET:A', 'so4_c2:A', 'so4_c2AQH2SO4:A', + 'so4_c2AQSO4:A', 'so4_c2DDF:A', 'so4_c2SFWET:A', 'so4_c3:A', 'so4_c3AQH2SO4:A', 'so4_c3AQSO4:A', 'so4_c3DDF:A', 'so4_c3SFWET:A', 'SOLIN:A', 'SOLLD:A', 'SOLSD:A', 'SSAVIS:A', 'SST:A', 'T:A', 'TAQ:A', 'TAUBLJX:A', 'TAUBLJY:A', 'TAUGWX:A', 'TAUGWY:A', 'TAUX:A', 'TAUY:A', 'TBRY:A', 'TCLY:A', - 'TGCLDIWP:A', 'TGCLDLWP:A', 'TMDMS:A', 'TMQ:A', 'TMSO2:A', - 'TMso4_a1:A', 'TMso4_a2:A', 'TMso4_a3:A', 'TOT_CLD_VISTAU:A', 'TOTH:A', 'TREFHT:A', 'TREFHTMN:A', 'TREFHTMX:A', 'TROP_P:A', + 'TGCLDIWP:A', 'TGCLDLWP:A', 'TMDMS:A', 'TMQ:A', 'TMSO2:A', + 'TMso4_a1:A', 'TMso4_a2:A', 'TMso4_a3:A', 'TOT_CLD_VISTAU:A', 'TOTH:A', 'TREFHT:A', 'TREFHTMN:A', 'TREFHTMX:A', 'TROP_P:A', 'TROP_T:A', 'TROP_Z:A', 'TS:A', 'TSMN:M', 'TSMX:X', 'TTEND_TOT:A', 'TTGWORO:A', 'U10:A', 'U:A', 'UTGWORO:A', 'UU:A', 'V:A', 'VD01:A', 'VV:A', 'WD_H2O2:A', 'WD_H2SO4:A', 'WD_SO2:A', 'wet_deposition_NHx_as_N:A', 'wet_deposition_NOy_as_N:A', 'Z3:A', 'ZMDQ:A', 'ZMDT:A', 'ZMMTT:A', 'ZMMU:A' - ! 'dst_a1_SRF:A', 'dst_a3_SRF:A', 'AODABS:A', 'soa_a1:A', 'soa_a2:A', 'soa_c1:A', 'soa_c2:A', + ! 'dst_a1_SRF:A', 'dst_a3_SRF:A', 'AODABS:A', 'soa_a1:A', 'soa_a2:A', 'soa_c1:A', 'soa_c2:A', ! 'soa_a1SFWET:A', 'soa_a2SFWET:A', 'soa_c1SFWET:A', 'soa_c2SFWET:A', 'soa_a1DDF:A', 'soa_a2DDF:A', 'soa_c1DDF:A', 'soa_c2DDF:A', 'bc_a4_CLXF:A', ! 'pom_a4_CLXF:A', 'soa_a1_sfgaex1:A', 'soa_a2_sfgaex1:A', 'ADRAIN:A', 'ADSNOW:A', 'ANRAIN:A', 'ANSNOW:A', 'AQRAIN:A', 'AQSNOW:A', 'AQSO4_H2O2:A', - ! 'AQSO4_O3:A', 'AWNC:A', 'AWNI:A', 'CCN3:A', 'CLDHGH:A', 'CLDLOW:A', 'CLDMED:A', 'FICE:A', 'FREQR:A', 'FREQS:A', 'FSNTOA:A', 'FSNTOA:A', 'H2SO4_sfgaex1:A', - ! 'ICIMR:A', 'ICWMR:A', 'IWC:A', 'LWCF:A', 'PRECL:A', 'PRECSC:A', 'PRECSL:A', 'QT:A', 'RAINQM:A', 'RCM_CLUBB:A', 'RELVAR:A', 'RTP2_CLUBB:A', 'RTPTHLP_CLUBB:A', - ! 'SFSOAG:A', 'SNOWQM:A', 'SWCF:A', 'TGCLDCWP:A', 'UP2_CLUBB:A', 'UPWP_CLUBB:A', 'VP2_CLUBB:A', 'VPWP_CLUBB:A', 'VQ:A', 'VU:A', 'WP2_CLUBB:A', 'WP3_CLUBB:A', + ! 'AQSO4_O3:A', 'AWNC:A', 'AWNI:A', 'CCN3:A', 'CLDHGH:A', 'CLDLOW:A', 'CLDMED:A', 'FICE:A', 'FREQR:A', 'FREQS:A', 'FSNTOA:A', 'FSNTOA:A', 'H2SO4_sfgaex1:A', + ! 'ICIMR:A', 'ICWMR:A', 'IWC:A', 'LWCF:A', 'PRECL:A', 'PRECSC:A', 'PRECSL:A', 'QT:A', 'RAINQM:A', 'RCM_CLUBB:A', 'RELVAR:A', 'RTP2_CLUBB:A', 'RTPTHLP_CLUBB:A', + ! 'SFSOAG:A', 'SNOWQM:A', 'SWCF:A', 'TGCLDCWP:A', 'UP2_CLUBB:A', 'UPWP_CLUBB:A', 'VP2_CLUBB:A', 'VPWP_CLUBB:A', 'VQ:A', 'VU:A', 'WP2_CLUBB:A', 'WP3_CLUBB:A', ! 'WPRCP_CLUBB:A', 'WPRTP_CLUBB:A', 'WPTHLP_CLUBB:A', 'WPTHVP_CLUBB:A', 'WSUB:A', 'bc_a1_SRF:A', 'bc_a4_SRF:A', 'O3colAbove:A' fincl2 = 'ACTNL:A', 'ACTREL:A', 'BURDENBCdn:A', 'BURDENDUSTdn:A', 'BURDENPOMdn:A', 'BURDENSEASALTdn:A', 'BURDENSO4dn:A', 'BURDENSOAdn:A', - 'CDNUMC:A', 'CLDICE:A', 'CLDLIQ:A', 'CLDTOT:A', 'CLOUD:A', 'CMFMC:A', 'CMFMC_DP:A', 'FCTL:A', 'FLDS:A', 'FLDSC:A', 'FLNR:A', 'FLNS:A', 'FLNSC:A', - 'FLNT:A', 'FLNTC:A', 'FLUT:A', 'FLUTC:A', 'FSDS:A', 'FSDSC:A', 'FSNR:A', 'FSNS:A', 'FSNSC:A', 'FSNTOA:A', 'FSNTOAC:A', 'LHFLX:A', 'MASS:A', 'OMEGA:A', - 'OMEGA500:A', 'PBLH:A', 'PDELDRY:A', 'PRECC:A', 'PRECT:A', 'PS:A', 'PSL:A', 'Q:A', 'QREFHT:A', 'QSNOW:A', 'RELHUM:A', 'RHREFHT:A', 'SHFLX:A', - 'SOLIN:A', 'SOLLD:A', 'SOLSD:A', 'T:A', 'T500:A', 'T700:A', 'T850:A', 'TAUBLJX:A', 'TAUBLJY:A', 'TAUGWX:A', 'TAUGWY:A', 'TAUX:A', 'TAUY:A', + 'CDNUMC:A', 'CLDICE:A', 'CLDLIQ:A', 'CLDTOT:A', 'CLOUD:A', 'CMFMC:A', 'CMFMC_DP:A', 'FCTL:A', 'FLDS:A', 'FLDSC:A', 'FLNR:A', 'FLNS:A', 'FLNSC:A', + 'FLNT:A', 'FLNTC:A', 'FLUT:A', 'FLUTC:A', 'FSDS:A', 'FSDSC:A', 'FSNR:A', 'FSNS:A', 'FSNSC:A', 'FSNTOA:A', 'FSNTOAC:A', 'LHFLX:A', 'MASS:A', 'OMEGA:A', + 'OMEGA500:A', 'PBLH:A', 'PDELDRY:A', 'PRECC:A', 'PRECT:A', 'PS:A', 'PSL:A', 'Q:A', 'QREFHT:A', 'QSNOW:A', 'RELHUM:A', 'RHREFHT:A', 'SHFLX:A', + 'SOLIN:A', 'SOLLD:A', 'SOLSD:A', 'T:A', 'T500:A', 'T700:A', 'T850:A', 'TAUBLJX:A', 'TAUBLJY:A', 'TAUGWX:A', 'TAUGWY:A', 'TAUX:A', 'TAUY:A', 'TGCLDIWP:A', 'TGCLDLWP:A', 'TMQ:A', 'TREFHT:A', 'TREFHTMN:A', 'TREFHTMX:A', 'TS:A', 'TSMN:M', 'TSMX:X', 'U:A', 'U10:A', 'UTGWORO:A', 'V:A', 'Z3:A', 'Z500:A' - - diff --git a/cime_config/usermods_dirs/CMIP6_B1850_WACCM/user_nl_cam b/cime_config/usermods_dirs/CMIP6_B1850_WACCM/user_nl_cam index 1b78d3bd33..033ae322f8 100644 --- a/cime_config/usermods_dirs/CMIP6_B1850_WACCM/user_nl_cam +++ b/cime_config/usermods_dirs/CMIP6_B1850_WACCM/user_nl_cam @@ -2,7 +2,7 @@ nhtfrq = 0,-24,-6,-3,-1,1,-24,-120,-240 fincl1 = 'ABSORB', 'ACBZO2', 'ACTREL', 'ALKNIT', 'ALKO2', 'ALKOOH', 'AOA1', 'AOA_NH', 'AODABSdn', - 'AODBCdn', 'AODdnDUST1', 'AODdnDUST2', 'AODdnDUST3', 'AODdnMODE1', 'AODdnMODE2', 'AODdnMODE3', 'AODDUST2', 'AODDUST', + 'AODBCdn', 'AODdnDUST01', 'AODdnDUST02', 'AODdnDUST03', 'AODdn_aitken', 'AODdn_accum', 'AODdn_coarse', 'AODDUST02', 'AODDUST', 'AODNIRstdn', 'AODPOMdn', 'AODSO4dn', 'AODSOAdn', 'AODSSdn', 'AODUVdn', 'AODUVstdn', 'AODVIS', 'AODVISdn', 'AODVISstdn', 'AQ_SO2', 'AREA', 'AREI', 'AREL', 'bc_a1', 'bc_a1DDF', 'bc_a1SFWET', 'bc_a4', 'bc_a4_CLXF', 'bc_a4DDF', 'bc_a4SFWET', 'BCARY', 'bc_c1', 'bc_c1DDF', 'bc_c1SFWET', 'bc_c4', 'bc_c4DDF', @@ -20,7 +20,7 @@ fincl1 = 'ABSORB', 'ACBZO2', 'ACTREL', 'ALKNIT', 'ALKO2', 'ALKOOH', 'AOA1', 'AO 'DF_ALKNIT', 'DF_ALKOOH', 'DF_BENZOOH', 'DF_BZOOH', 'DF_C2H5OH', 'DF_C2H5OOH', 'DF_C3H7OOH', 'DF_C6H5OOH', 'DF_CH2O', 'DF_CH3CHO', 'DF_CH3CN', 'DF_CH3COCH3', 'DF_CH3COCHO', 'DF_CH3COOH', 'DF_CH3COOOH', 'DF_CH3OH', 'DF_CH3OOH', 'DF_CO', 'DF_EOOH', 'DF_GLYALD', 'DF_H2O2', 'DF_H2SO4', 'DF_HCN', 'DF_HCOOH', 'DF_HNO3', 'DF_HO2NO2', 'DF_HONITR', - 'DF_HPALD', 'DF_HYAC', 'DF_HYDRALD', 'DF_IEPOX', 'DF_ISOPNITA', 'DF_ISOPNITB', 'DF_ISOPNO3', 'DF_ISOPNOOH', 'DF_ISOPOOH', + 'DF_HPALD', 'DF_HYAC', 'DF_HYDRALD', 'DF_IEPOX', 'DF_ISOPNITA', 'DF_ISOPNITB', 'DF_ISOP', 'DF_ISOPNOOH', 'DF_ISOPOOH', 'DF_IVOC', 'DF_MACROOH', 'DF_MEKOOH', 'DF_MPAN', 'DF_NC4CH2OH', 'DF_NC4CHO', 'DF_NH3', 'DF_NH4', 'DF_NO2', 'DF_NO', 'DF_NOA', 'DF_NTERPOOH', 'DF_O3', 'DF_ONITR', 'DF_PAN', 'DF_PHENOOH', 'DF_POOH', 'DF_ROOH', 'DF_SO2', 'DF_SOAG0', 'DF_SOAG1', 'DF_SOAG2', 'DF_SOAG3', 'DF_SOAG4', 'DF_SVOC', 'DF_TERP2OOH', 'DF_TERPNIT', @@ -66,7 +66,7 @@ fincl1 = 'ABSORB', 'ACBZO2', 'ACTREL', 'ALKNIT', 'ALKO2', 'ALKOOH', 'AOA1', 'AO 'SFBIGENE', 'SFC2H2', 'SFC2H4', 'SFC2H5OH', 'SFC2H6', 'SFC3H6', 'SFC3H8', 'SFCH2O', 'SFCH3CHO', 'SFCH3CN', 'SFCH3COCH3', 'SFCH3COCHO', 'SFCH3COOH', 'SFCH3OH', 'SFCO', 'SFDMS', 'SFdst_a1', 'SFdst_a2', 'SFdst_a3', 'SFGLYALD', 'SFHCN', 'SFHCOOH', 'SFISOP', 'SFIVOC', 'SFMEK', 'SFMTERP', 'SFncl_a1', - 'SFncl_a2', 'SFncl_a3', 'SFNH3', 'SFNO2', 'SFNO', 'SFnum_a1', 'SFnum_a2', 'SFnum_a3', 'SFpom_a4', + 'SFncl_a2', 'SFncl_a3', 'SFNH3', 'SFNO', 'SFnum_a1', 'SFnum_a2', 'SFnum_a3', 'SFpom_a4', 'SFSO2', 'SFso4_a1', 'SFso4_a2', 'SFSVOC', 'SFTOLUENE', 'SFXYLENES', 'SHFLX', 'SO2', 'SO2_CHML', 'SO2_CHMP', 'SO2_CLXF', 'SO2_XFRC', 'SO3', 'so4_a1', 'so4_a1_CHMP', 'so4_a1_CLXF', 'so4_a1DDF', 'so4_a1_sfgaex1', 'so4_a1SFWET', 'so4_a2', 'so4_a2_CHMP', 'so4_a2_CLXF', 'so4_a2DDF', 'so4_a2_sfgaex1', 'so4_a2_sfnnuc1', 'so4_a2SFWET', 'so4_a3', @@ -94,7 +94,7 @@ fincl1 = 'ABSORB', 'ACBZO2', 'ACTREL', 'ALKNIT', 'ALKO2', 'ALKOOH', 'AOA1', 'AO 'WD_CH2O', 'WD_CH3CHO', 'WD_CH3CN', 'WD_CH3COCH3', 'WD_CH3COCHO', 'WD_CH3COOH', 'WD_CH3COOOH', 'WD_CH3OH', 'WD_CH3OOH', 'WD_CLONO2', 'WD_COF2', 'WD_COFCL', 'WD_EOOH', 'WD_GLYALD', 'WD_H2O2', 'WD_H2SO4', 'WD_HBR', 'WD_HCL', 'WD_HCN', 'WD_HCOOH', 'WD_HF', 'WD_HNO3', 'WD_HO2NO2', 'WD_HOBR', 'WD_HOCL', 'WD_HONITR', 'WD_HPALD', - 'WD_HYAC', 'WD_HYDRALD', 'WD_IEPOX', 'WD_ISOPNITA', 'WD_ISOPNITB', 'WD_ISOPNO3', 'WD_ISOPNOOH', 'WD_ISOPOOH', 'WD_IVOC', + 'WD_HYAC', 'WD_HYDRALD', 'WD_IEPOX', 'WD_ISOPNITA', 'WD_ISOPNITB', 'WD_ISOP', 'WD_ISOPNOOH', 'WD_ISOPOOH', 'WD_IVOC', 'WD_MACR', 'WD_MACROOH', 'WD_MEKOOH', 'WD_MVK', 'WD_NC4CH2OH', 'WD_NC4CHO', 'WD_NDEP', 'WD_NH3', 'WD_NH4', 'WD_NHDEP', 'WD_NOA', 'WD_NTERPOOH', 'WD_ONITR', 'WD_PHENOOH', 'WD_POOH', 'WD_ROOH', 'WD_SO2', 'WD_SOAG0', 'WD_SOAG1', 'WD_SOAG2', 'WD_SOAG3', 'WD_SOAG4', 'WD_SVOC', 'WD_TERP2OOH', 'WD_TERPNIT', 'WD_TERPOOH', 'WD_TERPROD1', diff --git a/cime_config/usermods_dirs/CMIP6_BHIST/user_nl_cam b/cime_config/usermods_dirs/CMIP6_BHIST/user_nl_cam index e9b1c0c5b0..9918e4e878 100644 --- a/cime_config/usermods_dirs/CMIP6_BHIST/user_nl_cam +++ b/cime_config/usermods_dirs/CMIP6_BHIST/user_nl_cam @@ -5,8 +5,8 @@ mfilt = 1, 5, 20, 40, 120, 240, 365, 73, 365 ndens = 2, 2, 2, 2, 2, 2, 1, 1, 1 -fincl1 = 'ABSORB:A', 'ACTREL:A', 'AODABSdn:A', 'AODBCdn:A', 'AODdnDUST1:A', 'AODdnDUST2:A', - 'AODdnDUST3:A', 'AODdnMODE1:A', 'AODdnMODE2:A', 'AODdnMODE3:A', 'AODDUST2:A', 'AODDUST:A', 'AODNIRstdn:A', 'AODPOMdn:A', 'AODSO4dn:A', 'AODSOAdn:A', 'AODSSdn:A', +fincl1 = 'ABSORB:A', 'ACTREL:A', 'AODABSdn:A', 'AODBCdn:A', 'AODdnDUST01:A', 'AODdnDUST02:A', + 'AODdnDUST03:A', 'AODdn_aitken:A', 'AODdn_accum:A', 'AODdn_coarse:A', 'AODDUST02:A', 'AODDUST:A', 'AODNIRstdn:A', 'AODPOMdn:A', 'AODSO4dn:A', 'AODSOAdn:A', 'AODSSdn:A', 'AODUVdn:A', 'AODUVstdn:A', 'AODVIS:A', 'AODVISdn:A', 'AODVISstdn:A', 'AQ_SO2:A', 'AREA:A', 'AREI:A', 'AREL:A', 'bc_a1:A', 'bc_a1DDF:A', 'bc_a1SFWET:A', 'bc_a4:A', 'bc_a4DDF:A', 'bc_a4SFWET:A', 'bc_c1:A', 'bc_c1DDF:A', 'bc_c1SFWET:A', 'bc_c4:A', 'bc_c4DDF:A', 'bc_c4SFWET:A', 'BROX:A', 'BROY:A', 'BURDENBCdn', 'BURDENDUSTdn:A', 'BURDENPOMdn:A', 'BURDENSEASALTdn:A', 'BURDENSO4dn:A', diff --git a/cime_config/usermods_dirs/CMIP6_BHIST_WACCM/user_nl_cam b/cime_config/usermods_dirs/CMIP6_BHIST_WACCM/user_nl_cam index 9a68109bc3..36485414c6 100644 --- a/cime_config/usermods_dirs/CMIP6_BHIST_WACCM/user_nl_cam +++ b/cime_config/usermods_dirs/CMIP6_BHIST_WACCM/user_nl_cam @@ -1,8 +1,8 @@ - mfilt = 1, 5, 20, 40, 120, 240, 365, 73, 365 + mfilt = 1, 5, 20, 40, 120, 240, 365, 73, 365 nhtfrq = 0,-24,-6,-3,-1,1,-24,-120,-240 fincl1 = 'ABSORB', 'ACBZO2', 'ACTREL', 'ALKNIT', 'ALKO2', 'ALKOOH', 'AOA1', 'AOA_NH', 'AODABSdn', - 'AODBCdn', 'AODdnDUST1', 'AODdnDUST2', 'AODdnDUST3', 'AODdnMODE1', 'AODdnMODE2', 'AODdnMODE3', 'AODDUST2', 'AODDUST', + 'AODBCdn', 'AODdnDUST01', 'AODdnDUST02', 'AODdnDUST03', 'AODdn_aitken', 'AODdn_accum', 'AODdn_coarse', 'AODDUST02', 'AODDUST', 'AODNIRstdn', 'AODPOMdn', 'AODSO4dn', 'AODSOAdn', 'AODSSdn', 'AODUVdn', 'AODUVstdn', 'AODVIS', 'AODVISdn', 'AODVISstdn', 'AQ_SO2', 'AREA', 'AREI', 'AREL', 'bc_a1', 'bc_a1DDF', 'bc_a1SFWET', 'bc_a4', 'bc_a4_CLXF', 'bc_a4DDF', 'bc_a4SFWET', 'BCARY', 'bc_c1', 'bc_c1DDF', 'bc_c1SFWET', 'bc_c4', 'bc_c4DDF', @@ -20,7 +20,7 @@ 'DF_ALKNIT', 'DF_ALKOOH', 'DF_BENZOOH', 'DF_BZOOH', 'DF_C2H5OH', 'DF_C2H5OOH', 'DF_C3H7OOH', 'DF_C6H5OOH', 'DF_CH2O', 'DF_CH3CHO', 'DF_CH3CN', 'DF_CH3COCH3', 'DF_CH3COCHO', 'DF_CH3COOH', 'DF_CH3COOOH', 'DF_CH3OH', 'DF_CH3OOH', 'DF_CO', 'DF_EOOH', 'DF_GLYALD', 'DF_H2O2', 'DF_H2SO4', 'DF_HCN', 'DF_HCOOH', 'DF_HNO3', 'DF_HO2NO2', 'DF_HONITR', - 'DF_HPALD', 'DF_HYAC', 'DF_HYDRALD', 'DF_IEPOX', 'DF_ISOPNITA', 'DF_ISOPNITB', 'DF_ISOPNO3', 'DF_ISOPNOOH', 'DF_ISOPOOH', + 'DF_HPALD', 'DF_HYAC', 'DF_HYDRALD', 'DF_IEPOX', 'DF_ISOPNITA', 'DF_ISOPNITB', 'DF_ISOP', 'DF_ISOPNOOH', 'DF_ISOPOOH', 'DF_IVOC', 'DF_MACROOH', 'DF_MEKOOH', 'DF_MPAN', 'DF_NC4CH2OH', 'DF_NC4CHO', 'DF_NH3', 'DF_NH4', 'DF_NO2', 'DF_NO', 'DF_NOA', 'DF_NTERPOOH', 'DF_O3', 'DF_ONITR', 'DF_PAN', 'DF_PHENOOH', 'DF_POOH', 'DF_ROOH', 'DF_SO2', 'DF_SOAG0', 'DF_SOAG1', 'DF_SOAG2', 'DF_SOAG3', 'DF_SOAG4', 'DF_SVOC', 'DF_TERP2OOH', 'DF_TERPNIT', @@ -66,7 +66,7 @@ 'SFBIGENE', 'SFC2H2', 'SFC2H4', 'SFC2H5OH', 'SFC2H6', 'SFC3H6', 'SFC3H8', 'SFCH2O', 'SFCH3CHO', 'SFCH3CN', 'SFCH3COCH3', 'SFCH3COCHO', 'SFCH3COOH', 'SFCH3OH', 'SFCO', 'SFDMS', 'SFdst_a1', 'SFdst_a2', 'SFdst_a3', 'SFGLYALD', 'SFHCN', 'SFHCOOH', 'SFISOP', 'SFIVOC', 'SFMEK', 'SFMTERP', 'SFncl_a1', - 'SFncl_a2', 'SFncl_a3', 'SFNH3', 'SFNO2', 'SFNO', 'SFnum_a1', 'SFnum_a2', 'SFnum_a3', 'SFpom_a4', + 'SFncl_a2', 'SFncl_a3', 'SFNH3', 'SFNO', 'SFnum_a1', 'SFnum_a2', 'SFnum_a3', 'SFpom_a4', 'SFSO2', 'SFso4_a1', 'SFso4_a2', 'SFSVOC', 'SFTOLUENE', 'SFXYLENES', 'SHFLX', 'SO2', 'SO2_CHML', 'SO2_CHMP', 'SO2_CLXF', 'SO2_XFRC', 'SO3', 'so4_a1', 'so4_a1_CHMP', 'so4_a1_CLXF', 'so4_a1DDF', 'so4_a1_sfgaex1', 'so4_a1SFWET', 'so4_a2', 'so4_a2_CHMP', 'so4_a2_CLXF', 'so4_a2DDF', 'so4_a2_sfgaex1', 'so4_a2_sfnnuc1', 'so4_a2SFWET', 'so4_a3', @@ -94,7 +94,7 @@ 'WD_CH2O', 'WD_CH3CHO', 'WD_CH3CN', 'WD_CH3COCH3', 'WD_CH3COCHO', 'WD_CH3COOH', 'WD_CH3COOOH', 'WD_CH3OH', 'WD_CH3OOH', 'WD_CLONO2', 'WD_COF2', 'WD_COFCL', 'WD_EOOH', 'WD_GLYALD', 'WD_H2O2', 'WD_H2SO4', 'WD_HBR', 'WD_HCL', 'WD_HCN', 'WD_HCOOH', 'WD_HF', 'WD_HNO3', 'WD_HO2NO2', 'WD_HOBR', 'WD_HOCL', 'WD_HONITR', 'WD_HPALD', - 'WD_HYAC', 'WD_HYDRALD', 'WD_IEPOX', 'WD_ISOPNITA', 'WD_ISOPNITB', 'WD_ISOPNO3', 'WD_ISOPNOOH', 'WD_ISOPOOH', 'WD_IVOC', + 'WD_HYAC', 'WD_HYDRALD', 'WD_IEPOX', 'WD_ISOPNITA', 'WD_ISOPNITB', 'WD_ISOP', 'WD_ISOPNOOH', 'WD_ISOPOOH', 'WD_IVOC', 'WD_MACR', 'WD_MACROOH', 'WD_MEKOOH', 'WD_MVK', 'WD_NC4CH2OH', 'WD_NC4CHO', 'WD_NDEP', 'WD_NH3', 'WD_NH4', 'WD_NHDEP', 'WD_NOA', 'WD_NTERPOOH', 'WD_ONITR', 'WD_PHENOOH', 'WD_POOH', 'WD_ROOH', 'WD_SO2', 'WD_SOAG0', 'WD_SOAG1', 'WD_SOAG2', 'WD_SOAG3', 'WD_SOAG4', 'WD_SVOC', 'WD_TERP2OOH', 'WD_TERPNIT', 'WD_TERPOOH', 'WD_TERPROD1', diff --git a/cime_config/usermods_dirs/CMIP6_GENERIC/user_nl_cam b/cime_config/usermods_dirs/CMIP6_GENERIC/user_nl_cam index 45e18d1a6a..9ae154c7bb 100644 --- a/cime_config/usermods_dirs/CMIP6_GENERIC/user_nl_cam +++ b/cime_config/usermods_dirs/CMIP6_GENERIC/user_nl_cam @@ -4,8 +4,8 @@ mfilt = 1, 5, 20, 40, 120, 240, 365, 73, 365 ndens = 2, 2, 2, 2, 2, 2, 1, 1, 1 -fincl1 = 'ABSORB:A', 'ACTREL:A', 'AODABSdn:A', 'AODBCdn:A', 'AODdnDUST1:A', 'AODdnDUST2:A', - 'AODdnDUST3:A', 'AODdnMODE1:A', 'AODdnMODE2:A', 'AODdnMODE3:A', 'AODDUST2:A', 'AODDUST:A', 'AODNIRstdn:A', 'AODPOMdn:A', 'AODSO4dn:A', 'AODSOAdn:A', 'AODSSdn:A', +fincl1 = 'ABSORB:A', 'ACTREL:A', 'AODABSdn:A', 'AODBCdn:A', 'AODdnDUST01:A', 'AODdnDUST02:A', + 'AODdnDUST03:A', 'AODdn_aitken:A', 'AODdn_accum:A', 'AODdn_coarse:A', 'AODDUST02:A', 'AODDUST:A', 'AODNIRstdn:A', 'AODPOMdn:A', 'AODSO4dn:A', 'AODSOAdn:A', 'AODSSdn:A', 'AODUVdn:A', 'AODUVstdn:A', 'AODVIS:A', 'AODVISdn:A', 'AODVISstdn:A', 'AQ_SO2:A', 'AREA:A', 'AREI:A', 'AREL:A', 'bc_a1:A', 'bc_a1DDF:A', 'bc_a1SFWET:A', 'bc_a4:A', 'bc_a4DDF:A', 'bc_a4SFWET:A', 'bc_c1:A', 'bc_c1DDF:A', 'bc_c1SFWET:A', 'bc_c4:A', 'bc_c4DDF:A', 'bc_c4SFWET:A', 'BROX:A', 'BROY:A', 'BURDENBCdn', 'BURDENDUSTdn:A', 'BURDENPOMdn:A', 'BURDENSEASALTdn:A', 'BURDENSO4dn:A', diff --git a/cime_config/usermods_dirs/scam_mandatory/shell_commands b/cime_config/usermods_dirs/scam_mandatory/shell_commands index 0772ae5f3c..5230507d8a 100755 --- a/cime_config/usermods_dirs/scam_mandatory/shell_commands +++ b/cime_config/usermods_dirs/scam_mandatory/shell_commands @@ -2,8 +2,8 @@ # these are necessary for scam runs. #======================================== # -# SCAM works in SPMD mode with a single task, but the default is to run serially. -./xmlchange MPILIB=mpi-serial +# SCAM works in SPMD mode with a single task. +./xmlchange NTASKS=1 # SCAM doesn't have restart functionality yet. ./xmlchange REST_OPTION=never diff --git a/doc/ChangeLog b/doc/ChangeLog index 7ca1e7b6ac..bf2db678b4 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -1,5 +1,1478 @@ =============================================================== +Tag name: cam6_3_123 +Originator(s): cacraig, jedwards, fvitt +Date: August 16, 2023 +One-line Summary: Fix Derecho bugs +Github PR URL: https://github.com/ESCOMP/CAM/pull/878 + +Purpose of changes (include the issue number and title text for each relevant GitHub issue): + - cam_history field order: https://github.com/ESCOMP/CAM/issues/876 + - build failure on derecho: https://github.com/ESCOMP/ALI-ARMS/issues/2 + +Describe any changes made to build system: N/A + +Describe any changes made to the namelist: N/A + +List any changes to the defaults for the boundary datasets: N/A + +Describe any substantial timing or memory changes: N/A + +Code reviewed by: nusbaume + +List all files eliminated: N/A + +List all files added and what they do: N/A + +List all existing files that have been modified, and describe the changes: +M Externals_CAM.cfg + - Update ALI-ARMS external + +M src/control/cam_history.F90 + - Improve history writing for derecho + +If there were any failures reported from running test_driver.sh on any test +platform, and checkin with these failures has been OK'd by the gatekeeper, +then copy the lines from the td.*.status files for the failed tests to the +appropriate machine below. All failed tests must be justified. + +cheyenne/intel/aux_cam: all BFB except: + ERP_Ln9_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq9s (Overall: FAIL) details: + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq9s COMPARE_base_rest + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_122: DIFF + ERP_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.FW2000climo.cheyenne_intel.cam-outfrq9s_wcm_ne30 (Overall: FAIL) details: + FAIL ERP_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.FW2000climo.cheyenne_intel.cam-outfrq9s_wcm_ne30 RUN time=272 + PEND ERP_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.FW2000climo.cheyenne_intel.cam-outfrq9s_wcm_ne30 COMPARE_base_rest + SMS_Lh12_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq3h (Overall: DIFF) details: + FAIL SMS_Lh12_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq3h BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_122: DIFF + - pre-existing failures + +izumi/nag/aux_cam: all BFB + +izumi/gnu/aux_cam: all BFB + +=============================================================== +=============================================================== + +Tag name: cam6_3_122 +Originator(s): fvitt +Date: 11 Aug 2023 +One-line Summary: Aerosol optics updates +Github PR URL: https://github.com/ESCOMP/CAM/pull/868 + +Purpose of changes (include the issue number and title text for each relevant GitHub issue): + + Issue #865 -- Aerosol optics answer changes + + Generalization of the aerosol optics has resulted in answer changes. Here these answer changing + code modifications (in modal_aer_opt) are merged in separately which are as follows: + - use table_interp_mod utility rather than binterp subroutine -- answer changing (roundoff) + - use rh2odens parameter -- answer changing (roundoff) + - use model_size_parameters subroutine in modal_aero_lw rather than using separate + code block to compute the chebychev parameters -- answer changing (roundoff) + + Updates to aerosol optics diagnostics: + - generalize history field names that will accumulate multiple bins of a sectional aerosol model + - add short wave diagnostic AODTOT + - add long wave diagnostics AODABSLW (at 10 microns) and TOTABSLW + + Change in results are near roundoff level + +Describe any changes made to build system: N/A + +Describe any changes made to the namelist: N/A + +List any changes to the defaults for the boundary datasets: N/A + +Describe any substantial timing or memory changes: N/A + +Code reviewed by: cacraigucar nusbaume + +List all files eliminated: N/A + +List all files added and what they do: +A src/utils/table_interp_mod.F90 + - utility module for interpolation of aerosol optics tables + +List all existing files that have been modified, and describe the changes: + +M src/physics/cam/modal_aer_opt.F90 + - use table_interp_mod utility rather than binterp subroutine -- answer changing (roundoff) + - use rh2odens parameter -- answer changing (roundoff) + - use model_size_parameters subroutine in modal_aero_lw rather than + using separate code block to compute the chebychev parameters -- answer changing (roundoff) + - generalize history field names that will accumulate multiple bins of a sectional aerosol model + - add AODTOT SW diagnostic + - add AODABSLW (at 10 microns) and TOTABSLW diagnostics + +M src/physics/simple/radconstants.F90 + - add stub subroutine get_lw_spectral_boundaries for building simple models + +M bld/namelist_files/use_cases/2000_trop_strat_vbs_cam6.xml +M bld/namelist_files/use_cases/2010_trop_strat_vbs_cam6.xml +M bld/namelist_files/use_cases/hist_trop_strat_nudged_cam6.xml +M bld/namelist_files/use_cases/hist_trop_strat_vbs_cam6.xml +M bld/namelist_files/use_cases/hist_trop_strat_vbsext_cam6.xml +M bld/namelist_files/use_cases/hist_trop_strat_vbsfire_cam6.xml +M bld/namelist_files/use_cases/sd_trop_strat2_cam6.xml +M bld/namelist_files/use_cases/sd_trop_strat_vbs_cam6.xml +M bld/namelist_files/use_cases/sd_waccm_tsmlt_cam6.xml +M bld/namelist_files/use_cases/waccm_tsmlt_1850_cam6.xml +M bld/namelist_files/use_cases/waccm_tsmlt_2000_cam6.xml +M bld/namelist_files/use_cases/waccm_tsmlt_2010_cam6.xml +M bld/namelist_files/use_cases/waccm_tsmlt_hist_cam6.xml +M cime_config/usermods_dirs/CMIP6_B1850/user_nl_cam +M cime_config/usermods_dirs/CMIP6_B1850_WACCM/user_nl_cam +M cime_config/usermods_dirs/CMIP6_BHIST/user_nl_cam +M cime_config/usermods_dirs/CMIP6_BHIST_WACCM/user_nl_cam +M cime_config/usermods_dirs/CMIP6_GENERIC/user_nl_cam + - adjust history field names + +If there were any failures reported from running test_driver.sh on any test +platform, and checkin with these failures has been OK'd by the gatekeeper, +then copy the lines from the td.*.status files for the failed tests to the +appropriate machine below. All failed tests must be justified. + +cheyenne/intel/aux_cam: + ERP_Ln9_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq9s (Overall: FAIL) details: + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq9s COMPARE_base_rest + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SMS_Lh12_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq3h (Overall: DIFF) details: + FAIL SMS_Lh12_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq3h NLCOMP + FAIL SMS_Lh12_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq3h BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + ERP_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.FW2000climo.cheyenne_intel.cam-outfrq9s_wcm_ne30 (Overall: PEND) details: + FAIL ERP_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.FW2000climo.cheyenne_intel.cam-outfrq9s_wcm_ne30 NLCOMP + - pre-existing failures + + ERC_D_Ln9_P144x1_Vnuopc.ne16pg3_ne16pg3_mg17.QPC6HIST.cheyenne_intel.cam-outfrq3s_ttrac_usecase (Overall: DIFF) details: + FAIL ERC_D_Ln9_P144x1_Vnuopc.ne16pg3_ne16pg3_mg17.QPC6HIST.cheyenne_intel.cam-outfrq3s_ttrac_usecase BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + ERC_D_Ln9_Vnuopc.f19_f19_mg17.QPC6.cheyenne_intel.cam-outfrq3s_cosp (Overall: DIFF) details: + FAIL ERC_D_Ln9_Vnuopc.f19_f19_mg17.QPC6.cheyenne_intel.cam-outfrq3s_cosp BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + ERC_D_Ln9_Vnuopc.ne16_ne16_mg17.QPC5HIST.cheyenne_intel.cam-outfrq3s_usecase (Overall: DIFF) details: + FAIL ERC_D_Ln9_Vnuopc.ne16_ne16_mg17.QPC5HIST.cheyenne_intel.cam-outfrq3s_usecase BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + ERP_D_Ln9_Vnuopc.f09_f09_mg17.QSC6.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL ERP_D_Ln9_Vnuopc.f09_f09_mg17.QSC6.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + ERP_D_Ln9_Vnuopc.f19_f19_mg17.QPC6.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL ERP_D_Ln9_Vnuopc.f19_f19_mg17.QPC6.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + ERP_D_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.F2000dev.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL ERP_D_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.F2000dev.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + ERP_Ld3_Vnuopc.f09_f09_mg17.FWHIST.cheyenne_intel.cam-reduced_hist1d (Overall: DIFF) details: + FAIL ERP_Ld3_Vnuopc.f09_f09_mg17.FWHIST.cheyenne_intel.cam-reduced_hist1d BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + ERP_Ln9_P24x3_Vnuopc.f45_f45_mg37.QPWmaC6.cheyenne_intel.cam-outfrq9s_mee_fluxes (Overall: DIFF) details: + FAIL ERP_Ln9_P24x3_Vnuopc.f45_f45_mg37.QPWmaC6.cheyenne_intel.cam-outfrq9s_mee_fluxes BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + ERP_Ln9_Vnuopc.C96_C96_mg17.F2000climo.cheyenne_intel.cam-outfrq9s_mg3 (Overall: DIFF) details: + FAIL ERP_Ln9_Vnuopc.C96_C96_mg17.F2000climo.cheyenne_intel.cam-outfrq9s_mg3 BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + ERP_Ln9_Vnuopc.f09_f09_mg17.F1850.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.F1850.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + ERP_Ln9_Vnuopc.f09_f09_mg17.F2000climo.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.F2000climo.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + ERP_Ln9_Vnuopc.f09_f09_mg17.F2000dev.cheyenne_intel.cam-outfrq9s_mg3 (Overall: DIFF) details: + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.F2000dev.cheyenne_intel.cam-outfrq9s_mg3 BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + ERP_Ln9_Vnuopc.f09_f09_mg17.F2010climo.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.F2010climo.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + ERP_Ln9_Vnuopc.f09_f09_mg17.FHIST_BDRD.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.FHIST_BDRD.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + ERP_Ln9_Vnuopc.f19_f19_mg17.FWsc1850.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL ERP_Ln9_Vnuopc.f19_f19_mg17.FWsc1850.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + ERP_Ln9_Vnuopc.ne30_ne30_mg17.FCnudged.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL ERP_Ln9_Vnuopc.ne30_ne30_mg17.FCnudged.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL ERP_Ln9_Vnuopc.ne30_ne30_mg17.FCnudged.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + ERS_Ld3_Vnuopc.f10_f10_mg37.F1850.cheyenne_intel.cam-outfrq1d_14dec_ghg_cam_dev (Overall: DIFF) details: + FAIL ERS_Ld3_Vnuopc.f10_f10_mg37.F1850.cheyenne_intel.cam-outfrq1d_14dec_ghg_cam_dev BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + ERS_Ln9_P288x1_Vnuopc.mpasa120_mpasa120.F2000climo.cheyenne_intel.cam-outfrq9s_mpasa120 (Overall: DIFF) details: + FAIL ERS_Ln9_P288x1_Vnuopc.mpasa120_mpasa120.F2000climo.cheyenne_intel.cam-outfrq9s_mpasa120 BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + ERS_Ln9_P36x1_Vnuopc.mpasa480_mpasa480.F2000climo.cheyenne_intel.cam-outfrq9s_mpasa480 (Overall: DIFF) details: + FAIL ERS_Ln9_P36x1_Vnuopc.mpasa480_mpasa480.F2000climo.cheyenne_intel.cam-outfrq9s_mpasa480 BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + ERS_Ln9_Vnuopc.f09_f09_mg17.FX2000.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL ERS_Ln9_Vnuopc.f09_f09_mg17.FX2000.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + ERS_Ln9_Vnuopc.f19_f19_mg17.FXSD.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL ERS_Ln9_Vnuopc.f19_f19_mg17.FXSD.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SCT_D_Ln7_Vnuopc.T42_T42_mg17.QPC5.cheyenne_intel.cam-scm_prep (Overall: DIFF) details: + FAIL SCT_D_Ln7_Vnuopc.T42_T42_mg17.QPC5.cheyenne_intel.cam-scm_prep BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SMS_D_Ld2_Vnuopc.f19_f19_mg17.QPC5HIST.cheyenne_intel.cam-volc_usecase (Overall: DIFF) details: + FAIL SMS_D_Ld2_Vnuopc.f19_f19_mg17.QPC5HIST.cheyenne_intel.cam-volc_usecase BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SMS_D_Ln9_Vnuopc.f09_f09_mg17.FCts2nudged.cheyenne_intel.cam-outfrq9s_leapday (Overall: DIFF) details: + FAIL SMS_D_Ln9_Vnuopc.f09_f09_mg17.FCts2nudged.cheyenne_intel.cam-outfrq9s_leapday NLCOMP + FAIL SMS_D_Ln9_Vnuopc.f09_f09_mg17.FCts2nudged.cheyenne_intel.cam-outfrq9s_leapday BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SMS_D_Ln9_Vnuopc.f09_f09_mg17.FCvbsxHIST.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL SMS_D_Ln9_Vnuopc.f09_f09_mg17.FCvbsxHIST.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL SMS_D_Ln9_Vnuopc.f09_f09_mg17.FCvbsxHIST.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SMS_D_Ln9_Vnuopc.f09_f09_mg17.FSD.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL SMS_D_Ln9_Vnuopc.f09_f09_mg17.FSD.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SMS_D_Ln9_Vnuopc.f19_f19_mg17.FWma2000climo.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL SMS_D_Ln9_Vnuopc.f19_f19_mg17.FWma2000climo.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SMS_D_Ln9_Vnuopc.f19_f19_mg17.FWma2000climo.cheyenne_intel.cam-outfrq9s_waccm_ma_mam4 (Overall: DIFF) details: + FAIL SMS_D_Ln9_Vnuopc.f19_f19_mg17.FWma2000climo.cheyenne_intel.cam-outfrq9s_waccm_ma_mam4 BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SMS_D_Ln9_Vnuopc.f19_f19_mg17.FXHIST.cheyenne_intel.cam-outfrq9s_amie (Overall: DIFF) details: + FAIL SMS_D_Ln9_Vnuopc.f19_f19_mg17.FXHIST.cheyenne_intel.cam-outfrq9s_amie BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SMS_D_Ln9_Vnuopc.f19_f19_mg17.QPC2000climo.cheyenne_intel.cam-outfrq3s_usecase (Overall: DIFF) details: + FAIL SMS_D_Ln9_Vnuopc.f19_f19_mg17.QPC2000climo.cheyenne_intel.cam-outfrq3s_usecase NLCOMP + FAIL SMS_D_Ln9_Vnuopc.f19_f19_mg17.QPC2000climo.cheyenne_intel.cam-outfrq3s_usecase BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SMS_D_Ln9_Vnuopc.f19_f19_mg17.QPC5M7.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL SMS_D_Ln9_Vnuopc.f19_f19_mg17.QPC5M7.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SMS_D_Ln9_Vnuopc.ne16_ne16_mg17.FX2000.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL SMS_D_Ln9_Vnuopc.ne16_ne16_mg17.FX2000.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SMS_D_Ln9_Vnuopc_P720x1.ne0ARCTICne30x4_ne0ARCTICne30x4_mt12.FHIST.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL SMS_D_Ln9_Vnuopc_P720x1.ne0ARCTICne30x4_ne0ARCTICne30x4_mt12.FHIST.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SMS_D_Ln9_Vnuopc_P720x1.ne0CONUSne30x8_ne0CONUSne30x8_mt12.FCHIST.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL SMS_D_Ln9_Vnuopc_P720x1.ne0CONUSne30x8_ne0CONUSne30x8_mt12.FCHIST.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL SMS_D_Ln9_Vnuopc_P720x1.ne0CONUSne30x8_ne0CONUSne30x8_mt12.FCHIST.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SMS_D_Ln9_Vnuopc_P720x1.ne30pg3_ne30pg3_mg17.FCLTHIST.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL SMS_D_Ln9_Vnuopc_P720x1.ne30pg3_ne30pg3_mg17.FCLTHIST.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL SMS_D_Ln9_Vnuopc_P720x1.ne30pg3_ne30pg3_mg17.FCLTHIST.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SMS_D_Ln9_Vnuopc.T42_T42.FSCAM.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL SMS_D_Ln9_Vnuopc.T42_T42.FSCAM.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SMS_Ld1_Vnuopc.f09_f09_mg17.FW2000climo.cheyenne_intel.cam-outfrq1d (Overall: DIFF) details: + FAIL SMS_Ld1_Vnuopc.f09_f09_mg17.FW2000climo.cheyenne_intel.cam-outfrq1d NLCOMP + FAIL SMS_Ld1_Vnuopc.f09_f09_mg17.FW2000climo.cheyenne_intel.cam-outfrq1d BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SMS_Ld1_Vnuopc.f19_f19.F2000dev.cheyenne_intel.cam-outfrq1d (Overall: DIFF) details: + FAIL SMS_Ld1_Vnuopc.f19_f19.F2000dev.cheyenne_intel.cam-outfrq1d BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SMS_Ld1_Vnuopc.ne30pg3_ne30pg3_mg17.FC2010climo.cheyenne_intel.cam-outfrq1d (Overall: DIFF) details: + FAIL SMS_Ld1_Vnuopc.ne30pg3_ne30pg3_mg17.FC2010climo.cheyenne_intel.cam-outfrq1d NLCOMP + FAIL SMS_Ld1_Vnuopc.ne30pg3_ne30pg3_mg17.FC2010climo.cheyenne_intel.cam-outfrq1d BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SMS_Ld5_Vnuopc.f09_f09_mg17.PC6.cheyenne_intel.cam-cam6_port_f09 (Overall: DIFF) details: + FAIL SMS_Ld5_Vnuopc.f09_f09_mg17.PC6.cheyenne_intel.cam-cam6_port_f09 BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SMS_Lm13_Vnuopc.f10_f10_mg37.F2000climo.cheyenne_intel.cam-outfrq1m (Overall: DIFF) details: + FAIL SMS_Lm13_Vnuopc.f10_f10_mg37.F2000climo.cheyenne_intel.cam-outfrq1m BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SMS_Ln9_Vnuopc.f09_f09_mg17.F2010climo.cheyenne_intel.cam-nudging (Overall: DIFF) details: + FAIL SMS_Ln9_Vnuopc.f09_f09_mg17.F2010climo.cheyenne_intel.cam-nudging BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SMS_Ln9_Vnuopc.f09_f09_mg17.FW1850.cheyenne_intel.cam-reduced_hist3s (Overall: DIFF) details: + FAIL SMS_Ln9_Vnuopc.f09_f09_mg17.FW1850.cheyenne_intel.cam-reduced_hist3s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SMS_Ln9_Vnuopc.f19_f19.F2000climo.cheyenne_intel.cam-silhs (Overall: DIFF) details: + FAIL SMS_Ln9_Vnuopc.f19_f19.F2000climo.cheyenne_intel.cam-silhs BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + - expected baseline failures due to changes in aerosol optics + - namelist compare failures due changes in aerosol optics diagnostics field names + +izumi/nag/aux_cam: + DAE_Vnuopc.f45_f45_mg37.FHS94.izumi_nag.cam-dae (Overall: FAIL) details: + FAIL DAE_Vnuopc.f45_f45_mg37.FHS94.izumi_nag.cam-dae RUN time=10 + - pre-existing failures + + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-carma_sea_salt (Overall: DIFF) details: + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-carma_sea_salt BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: DIFF + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-outfrq3s_cosp (Overall: DIFF) details: + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-outfrq3s_cosp BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: DIFF + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-outfrq3s_subcol (Overall: DIFF) details: + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-outfrq3s_subcol BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: DIFF + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s_am (Overall: DIFF) details: + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s_am BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: DIFF + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s_convmic (Overall: DIFF) details: + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s_convmic BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: DIFF + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s_cospsathist (Overall: DIFF) details: + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s_cospsathist BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: DIFF + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s (Overall: DIFF) details: + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: DIFF + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPWmaC6.izumi_nag.cam-outfrq3s (Overall: DIFF) details: + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPWmaC6.izumi_nag.cam-outfrq3s BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: DIFF + ERC_D_Ln9_Vnuopc.ne5_ne5_mg37.QPC5.izumi_nag.cam-outfrq3s_ttrac (Overall: DIFF) details: + FAIL ERC_D_Ln9_Vnuopc.ne5_ne5_mg37.QPC5.izumi_nag.cam-outfrq3s_ttrac BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: DIFF + ERI_D_Ln18_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-outfrq3s_eoyttrac (Overall: DIFF) details: + FAIL ERI_D_Ln18_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-outfrq3s_eoyttrac BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: DIFF + ERI_D_Ln18_Vnuopc.f19_f19_mg17.QPC6.izumi_nag.cam-ghgrmp_e8 (Overall: DIFF) details: + FAIL ERI_D_Ln18_Vnuopc.f19_f19_mg17.QPC6.izumi_nag.cam-ghgrmp_e8 BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: DIFF + ERP_Ln9_Vnuopc.ne5pg3_ne5pg3_mg37.QPC6.izumi_nag.cam-outfrq9s_clubbmf (Overall: DIFF) details: + FAIL ERP_Ln9_Vnuopc.ne5pg3_ne5pg3_mg37.QPC6.izumi_nag.cam-outfrq9s_clubbmf BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: DIFF + PLB_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-ttrac_loadbal0 (Overall: DIFF) details: + FAIL PLB_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-ttrac_loadbal0 BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: DIFF + PLB_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-ttrac_loadbal1 (Overall: DIFF) details: + FAIL PLB_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-ttrac_loadbal1 BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: DIFF + PLB_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-ttrac_loadbal3 (Overall: DIFF) details: + FAIL PLB_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-ttrac_loadbal3 BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: DIFF + PLB_D_Ln9_Vnuopc.ne5_ne5_mg37.QPC5.izumi_nag.cam-ttrac_loadbal0 (Overall: DIFF) details: + FAIL PLB_D_Ln9_Vnuopc.ne5_ne5_mg37.QPC5.izumi_nag.cam-ttrac_loadbal0 BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: DIFF + PLB_D_Ln9_Vnuopc.ne5_ne5_mg37.QPC5.izumi_nag.cam-ttrac_loadbal1 (Overall: DIFF) details: + FAIL PLB_D_Ln9_Vnuopc.ne5_ne5_mg37.QPC5.izumi_nag.cam-ttrac_loadbal1 BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: DIFF + PLB_D_Ln9_Vnuopc.ne5_ne5_mg37.QPC5.izumi_nag.cam-ttrac_loadbal3 (Overall: DIFF) details: + FAIL PLB_D_Ln9_Vnuopc.ne5_ne5_mg37.QPC5.izumi_nag.cam-ttrac_loadbal3 BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: DIFF + SMS_D_Ln7_Vnuopc.T42_T42_mg17.QPSCAMC5.izumi_nag.cam-scmarm (Overall: DIFF) details: + FAIL SMS_D_Ln7_Vnuopc.T42_T42_mg17.QPSCAMC5.izumi_nag.cam-scmarm BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: FIELDLIST field lists differ (otherwise bit-for-bit) + SMS_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-rad_diag_mam (Overall: DIFF) details: + FAIL SMS_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-rad_diag_mam BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: DIFF + SMS_P48x1_D_Ln3_Vnuopc.f09_f09_mg17.QPC6HIST.izumi_nag.cam-outfrq3s_co2cycle_usecase (Overall: DIFF) details: + FAIL SMS_P48x1_D_Ln3_Vnuopc.f09_f09_mg17.QPC6HIST.izumi_nag.cam-outfrq3s_co2cycle_usecase BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: DIFF + SUB_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-outfrq3s (Overall: DIFF) details: + FAIL SUB_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-outfrq3s BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: DIFF + TMC_D_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-outfrq3s_eoyttrac (Overall: DIFF) details: + FAIL TMC_D_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-outfrq3s_eoyttrac BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: DIFF + TMC_D_Vnuopc.T5_T5_mg37.QPC5.izumi_nag.cam-ghgrmp_e8 (Overall: DIFF) details: + FAIL TMC_D_Vnuopc.T5_T5_mg37.QPC5.izumi_nag.cam-ghgrmp_e8 BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: DIFF + - expected baseline failures due to changes in aerosol optics + +izumi/gnu/aux_cam: + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_gnu.cam-outfrq3s_unicon (Overall: DIFF) details: + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_gnu.cam-outfrq3s_unicon BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_gnu: DIFF + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPSPCAMM.izumi_gnu.cam-outfrq3s (Overall: DIFF) details: + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPSPCAMM.izumi_gnu.cam-outfrq3s BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_gnu: DIFF + ERP_Ln9_Vnuopc.ne5_ne5_mg37.QPC5.izumi_gnu.cam-outfrq9s (Overall: DIFF) details: + FAIL ERP_Ln9_Vnuopc.ne5_ne5_mg37.QPC5.izumi_gnu.cam-outfrq9s BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_gnu: DIFF + PLB_D_Ln9_Vnuopc.ne5pg3_ne5pg3_mg37.QPC5.izumi_gnu.cam-ttrac_loadbal0 (Overall: DIFF) details: + FAIL PLB_D_Ln9_Vnuopc.ne5pg3_ne5pg3_mg37.QPC5.izumi_gnu.cam-ttrac_loadbal0 BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_gnu: DIFF + PLB_D_Ln9_Vnuopc.ne5pg3_ne5pg3_mg37.QPC5.izumi_gnu.cam-ttrac_loadbal1 (Overall: DIFF) details: + FAIL PLB_D_Ln9_Vnuopc.ne5pg3_ne5pg3_mg37.QPC5.izumi_gnu.cam-ttrac_loadbal1 BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_gnu: DIFF + PLB_D_Ln9_Vnuopc.ne5pg3_ne5pg3_mg37.QPC5.izumi_gnu.cam-ttrac_loadbal3 (Overall: DIFF) details: + FAIL PLB_D_Ln9_Vnuopc.ne5pg3_ne5pg3_mg37.QPC5.izumi_gnu.cam-ttrac_loadbal3 BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_gnu: DIFF + SCT_D_Ln7_Vnuopc.T42_T42_mg17.QPC6.izumi_gnu.cam-scm_prep_c6 (Overall: DIFF) details: + FAIL SCT_D_Ln7_Vnuopc.T42_T42_mg17.QPC6.izumi_gnu.cam-scm_prep_c6 BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_gnu: DIFF + SMS_D_Ln9.f10_f10_mg37.2000_CAM%DEV%GHGMAM4_CLM50%SP_CICE%PRES_DOCN%DOM_MOSART_SGLC_SWAV_SESP.izumi_gnu.cam-outfrq9s (Overall: DIFF) details: + FAIL SMS_D_Ln9.f10_f10_mg37.2000_CAM%DEV%GHGMAM4_CLM50%SP_CICE%PRES_DOCN%DOM_MOSART_SGLC_SWAV_SESP.izumi_gnu.cam-outfrq9s BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_gnu: DIFF + SMS_D_Ln9_Vnuopc.ne5pg3_ne5pg3_mg37.QPC5.izumi_gnu.cam-outfrq3s_ttrac (Overall: DIFF) details: + FAIL SMS_D_Ln9_Vnuopc.ne5pg3_ne5pg3_mg37.QPC5.izumi_gnu.cam-outfrq3s_ttrac BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_gnu: DIFF + - expected baseline failures due to changes in aerosol optics + - namelist compare failures due changes in aerosol optics diagnostics field names + + NOTE: Independent testing showed that the combination of round-off level changes + to modal_aer_opt (listed above) results in near round-off level changes in the + aerosol optics (~12-16 significant digits of agreement). + +Summarize any changes to answers: near roundoff + +=============================================================== +=============================================================== + +Tag name: cam6_3_121 +Originator(s): fvitt +Date: 8 Aug 2023 +One-line Summary: Update SOAE emissions factors +Github PR URL: https://github.com/ESCOMP/CAM/pull/870 + +Purpose of changes (include the issue number and title text for each relevant GitHub issue): + + Corrections to default namelist settings for: + - SAOE emissions factors (issue: Need to adjust SAOE emissions factors #860) + - 10x15 CAMChem IC file (issue: Unusable namelist default? #867) + +Describe any changes made to build system: N/A + +Describe any changes made to the namelist: N/A + +List any changes to the defaults for the boundary datasets: N/A + +Describe any substantial timing or memory changes: N/A + +Code reviewed by: cacraigucar nusbaume + +List all files eliminated: N/A + +List all files added and what they do: N/A + +List all existing files that have been modified, and describe the changes: +M bld/build-namelist +M bld/namelist_files/use_cases/2000_cam6.xml +M bld/namelist_files/use_cases/2010_cam6.xml +M bld/namelist_files/use_cases/waccm_sc_2000_cam6.xml +M bld/namelist_files/use_cases/waccm_sc_2010_cam6.xml + - update SAOE emissions factors + +M bld/namelist_files/namelist_defaults_cam.xml + - correction to default 10x15 CAMChem IC file + +If there were any failures reported from running test_driver.sh on any test +platform, and checkin with these failures has been OK'd by the gatekeeper, +then copy the lines from the td.*.status files for the failed tests to the +appropriate machine below. All failed tests must be justified. + +cheyenne/intel/aux_cam: + SMS_Lh12_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq3h (Overall: DIFF) details: + FAIL SMS_Lh12_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq3h BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_120: DIFF + ERP_Ln9_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq9s (Overall: FAIL) details: + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq9s COMPARE_base_rest + ERP_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.FW2000climo.cheyenne_intel.cam-outfrq9s_wcm_ne30 (Overall: FAIL) details: + FAIL ERP_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.FW2000climo.cheyenne_intel.cam-outfrq9s_wcm_ne30 RUN time=284 + PEND ERP_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.FW2000climo.cheyenne_intel.cam-outfrq9s_wcm_ne30 COMPARE_base_rest + - pre-existing failures + + ERC_D_Ln9_P144x1_Vnuopc.ne16pg3_ne16pg3_mg17.QPC6HIST.cheyenne_intel.cam-outfrq3s_ttrac_usecase (Overall: DIFF) details: + FAIL ERC_D_Ln9_P144x1_Vnuopc.ne16pg3_ne16pg3_mg17.QPC6HIST.cheyenne_intel.cam-outfrq3s_ttrac_usecase NLCOMP + FAIL ERC_D_Ln9_P144x1_Vnuopc.ne16pg3_ne16pg3_mg17.QPC6HIST.cheyenne_intel.cam-outfrq3s_ttrac_usecase BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_120: DIFF + ERC_D_Ln9_Vnuopc.f19_f19_mg17.QPC6.cheyenne_intel.cam-outfrq3s_cosp (Overall: DIFF) details: + FAIL ERC_D_Ln9_Vnuopc.f19_f19_mg17.QPC6.cheyenne_intel.cam-outfrq3s_cosp NLCOMP + FAIL ERC_D_Ln9_Vnuopc.f19_f19_mg17.QPC6.cheyenne_intel.cam-outfrq3s_cosp BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_120: DIFF + ERP_D_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.F2000dev.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL ERP_D_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.F2000dev.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL ERP_D_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.F2000dev.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_120: DIFF + ERP_Ln9_Vnuopc.C96_C96_mg17.F2000climo.cheyenne_intel.cam-outfrq9s_mg3 (Overall: DIFF) details: + FAIL ERP_Ln9_Vnuopc.C96_C96_mg17.F2000climo.cheyenne_intel.cam-outfrq9s_mg3 NLCOMP + FAIL ERP_Ln9_Vnuopc.C96_C96_mg17.F2000climo.cheyenne_intel.cam-outfrq9s_mg3 BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_120: DIFF + ERP_Ln9_Vnuopc.f09_f09_mg17.F1850.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.F1850.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.F1850.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_120: DIFF + ERP_Ln9_Vnuopc.f09_f09_mg17.F2000climo.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.F2000climo.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.F2000climo.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_120: DIFF + ERP_Ln9_Vnuopc.f09_f09_mg17.F2000dev.cheyenne_intel.cam-outfrq9s_mg3 (Overall: DIFF) details: + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.F2000dev.cheyenne_intel.cam-outfrq9s_mg3 NLCOMP + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.F2000dev.cheyenne_intel.cam-outfrq9s_mg3 BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_120: DIFF + ERP_Ln9_Vnuopc.f09_f09_mg17.F2010climo.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.F2010climo.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.F2010climo.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_120: DIFF + ERP_Ln9_Vnuopc.f09_f09_mg17.FHIST_BDRD.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.FHIST_BDRD.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.FHIST_BDRD.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_120: DIFF + ERP_Ln9_Vnuopc.f19_f19_mg17.FWsc1850.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL ERP_Ln9_Vnuopc.f19_f19_mg17.FWsc1850.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL ERP_Ln9_Vnuopc.f19_f19_mg17.FWsc1850.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_120: DIFF + ERS_Ld3_Vnuopc.f10_f10_mg37.F1850.cheyenne_intel.cam-outfrq1d_14dec_ghg_cam_dev (Overall: DIFF) details: + FAIL ERS_Ld3_Vnuopc.f10_f10_mg37.F1850.cheyenne_intel.cam-outfrq1d_14dec_ghg_cam_dev NLCOMP + FAIL ERS_Ld3_Vnuopc.f10_f10_mg37.F1850.cheyenne_intel.cam-outfrq1d_14dec_ghg_cam_dev BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_120: DIFF + ERS_Ln9_P288x1_Vnuopc.mpasa120_mpasa120.F2000climo.cheyenne_intel.cam-outfrq9s_mpasa120 (Overall: DIFF) details: + FAIL ERS_Ln9_P288x1_Vnuopc.mpasa120_mpasa120.F2000climo.cheyenne_intel.cam-outfrq9s_mpasa120 NLCOMP + FAIL ERS_Ln9_P288x1_Vnuopc.mpasa120_mpasa120.F2000climo.cheyenne_intel.cam-outfrq9s_mpasa120 BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_120: DIFF + ERS_Ln9_P36x1_Vnuopc.mpasa480_mpasa480.F2000climo.cheyenne_intel.cam-outfrq9s_mpasa480 (Overall: DIFF) details: + FAIL ERS_Ln9_P36x1_Vnuopc.mpasa480_mpasa480.F2000climo.cheyenne_intel.cam-outfrq9s_mpasa480 NLCOMP + FAIL ERS_Ln9_P36x1_Vnuopc.mpasa480_mpasa480.F2000climo.cheyenne_intel.cam-outfrq9s_mpasa480 BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_120: DIFF + SMS_D_Ln9_Vnuopc.f09_f09_mg17.FSD.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL SMS_D_Ln9_Vnuopc.f09_f09_mg17.FSD.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL SMS_D_Ln9_Vnuopc.f09_f09_mg17.FSD.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_120: DIFF + SMS_D_Ln9_Vnuopc_P720x1.ne0ARCTICne30x4_ne0ARCTICne30x4_mt12.FHIST.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL SMS_D_Ln9_Vnuopc_P720x1.ne0ARCTICne30x4_ne0ARCTICne30x4_mt12.FHIST.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL SMS_D_Ln9_Vnuopc_P720x1.ne0ARCTICne30x4_ne0ARCTICne30x4_mt12.FHIST.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_120: DIFF + SMS_D_Ln9_Vnuopc.T42_T42.FSCAM.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL SMS_D_Ln9_Vnuopc.T42_T42.FSCAM.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL SMS_D_Ln9_Vnuopc.T42_T42.FSCAM.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_120: DIFF + SMS_Ld1_Vnuopc.f19_f19.F2000dev.cheyenne_intel.cam-outfrq1d (Overall: DIFF) details: + FAIL SMS_Ld1_Vnuopc.f19_f19.F2000dev.cheyenne_intel.cam-outfrq1d NLCOMP + FAIL SMS_Ld1_Vnuopc.f19_f19.F2000dev.cheyenne_intel.cam-outfrq1d BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_120: DIFF + SMS_Lm13_Vnuopc.f10_f10_mg37.F2000climo.cheyenne_intel.cam-outfrq1m (Overall: DIFF) details: + FAIL SMS_Lm13_Vnuopc.f10_f10_mg37.F2000climo.cheyenne_intel.cam-outfrq1m NLCOMP + FAIL SMS_Lm13_Vnuopc.f10_f10_mg37.F2000climo.cheyenne_intel.cam-outfrq1m BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_120: DIFF + SMS_Ln9_Vnuopc.f09_f09_mg17.F2010climo.cheyenne_intel.cam-nudging (Overall: DIFF) details: + FAIL SMS_Ln9_Vnuopc.f09_f09_mg17.F2010climo.cheyenne_intel.cam-nudging NLCOMP + FAIL SMS_Ln9_Vnuopc.f09_f09_mg17.F2010climo.cheyenne_intel.cam-nudging BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_120: DIFF + SMS_Ln9_Vnuopc.f19_f19.F2000climo.cheyenne_intel.cam-silhs (Overall: DIFF) details: + FAIL SMS_Ln9_Vnuopc.f19_f19.F2000climo.cheyenne_intel.cam-silhs NLCOMP + FAIL SMS_Ln9_Vnuopc.f19_f19.F2000climo.cheyenne_intel.cam-silhs BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_120: DIFF + - expected baseline failures due to update SAOE emissions factors + + SMS_Ld5_Vnuopc.f09_f09_mg17.PC6.cheyenne_intel.cam-cam6_port_f09 (Overall: NLFAIL) details: + FAIL SMS_Ld5_Vnuopc.f09_f09_mg17.PC6.cheyenne_intel.cam-cam6_port_f09 NLCOMP + - expected namelist compare failures due to update SAOE emissions factors + +izumi/nag/aux_cam: + DAE_Vnuopc.f45_f45_mg37.FHS94.izumi_nag.cam-dae (Overall: FAIL) details: + FAIL DAE_Vnuopc.f45_f45_mg37.FHS94.izumi_nag.cam-dae RUN time=16 + PEND DAE_Vnuopc.f45_f45_mg37.FHS94.izumi_nag.cam-dae COMPARE_base_da + - pre-existing failure + + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s_am (Overall: DIFF) details: + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s_am NLCOMP + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s_am BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_120_nag: DIFF + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s_convmic (Overall: DIFF) details: + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s_convmic NLCOMP + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s_convmic BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_120_nag: DIFF + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s_cospsathist (Overall: DIFF) details: + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s_cospsathist NLCOMP + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s_cospsathist BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_120_nag: DIFF + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s (Overall: DIFF) details: + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s NLCOMP + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_120_nag: DIFF + ERI_D_Ln18_Vnuopc.f19_f19_mg17.QPC6.izumi_nag.cam-ghgrmp_e8 (Overall: DIFF) details: + FAIL ERI_D_Ln18_Vnuopc.f19_f19_mg17.QPC6.izumi_nag.cam-ghgrmp_e8 NLCOMP + FAIL ERI_D_Ln18_Vnuopc.f19_f19_mg17.QPC6.izumi_nag.cam-ghgrmp_e8 BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_120_nag: DIFF + SMS_P48x1_D_Ln3_Vnuopc.f09_f09_mg17.QPC6HIST.izumi_nag.cam-outfrq3s_co2cycle_usecase (Overall: DIFF) details: + FAIL SMS_P48x1_D_Ln3_Vnuopc.f09_f09_mg17.QPC6HIST.izumi_nag.cam-outfrq3s_co2cycle_usecase NLCOMP + FAIL SMS_P48x1_D_Ln3_Vnuopc.f09_f09_mg17.QPC6HIST.izumi_nag.cam-outfrq3s_co2cycle_usecase BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_120_nag: DIFF + - expected baseline failures due to update SAOE emissions factors + +izumi/gnu/aux_cam: + SCT_D_Ln7_Vnuopc.T42_T42_mg17.QPC6.izumi_gnu.cam-scm_prep_c6 (Overall: DIFF) details: + FAIL SCT_D_Ln7_Vnuopc.T42_T42_mg17.QPC6.izumi_gnu.cam-scm_prep_c6 NLCOMP + FAIL SCT_D_Ln7_Vnuopc.T42_T42_mg17.QPC6.izumi_gnu.cam-scm_prep_c6 BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_120_gnu: DIFF + SMS_D_Ln9.f10_f10_mg37.2000_CAM%DEV%GHGMAM4_CLM50%SP_CICE%PRES_DOCN%DOM_MOSART_SGLC_SWAV_SESP.izumi_gnu.cam-outfrq9s (Overall: DIFF) details: + FAIL SMS_D_Ln9.f10_f10_mg37.2000_CAM%DEV%GHGMAM4_CLM50%SP_CICE%PRES_DOCN%DOM_MOSART_SGLC_SWAV_SESP.izumi_gnu.cam-outfrq9s NLCOMP + FAIL SMS_D_Ln9.f10_f10_mg37.2000_CAM%DEV%GHGMAM4_CLM50%SP_CICE%PRES_DOCN%DOM_MOSART_SGLC_SWAV_SESP.izumi_gnu.cam-outfrq9s BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_120_gnu: DIFF + - expected baseline failures due to update SAOE emissions factors + +Summarize any changes to answers: larger than roundoff + +=============================================================== +=============================================================== + +Tag name: cam6_3_120 +Originator(s): fvitt +Date: 28 Jul 2023 +One-line Summary: Add O3S diagnostic tracer to WACCM-MA; move gravity wave parameter to namelist +Github PR URL: https://github.com/ESCOMP/CAM/pull/851 + +Purpose of changes (include the issue number and title text for each relevant GitHub issue): + + Make frontal gravity wave spectrum half-width a namelist variable (issue #839) + MA chemistry scheme (waccm_ma_mam4) needs O3S (issue #793) + +Describe any changes made to build system: N/A + +Describe any changes made to the namelist: + + New namelist parameter: + front_gaussian_width + Width of gaussian used to create frontogenesis tau profile [m/s]. + Defaults to 30 m/s + +List any changes to the defaults for the boundary datasets: N/A + +Describe any substantial timing or memory changes: N/A + +Code reviewed by: cacraigucar nusbaume + +List all files eliminated: none + +List all files added and what they do: none + +List all existing files that have been modified, and describe the changes: + +M bld/namelist_files/namelist_definition.xml + - new front_gaussian_width namelist parameter + +M bld/build-namelist + - set default front_gaussian_width + +M bld/namelist_files/namelist_defaults_cam.xml + - namelist defaults: + front_gaussian_width + O3S_Loss for WACCM-MA and SolIonRate_Tot for WACCM-X + +M bld/namelist_files/use_cases/sd_waccmx_ma_cam6.xml +M bld/namelist_files/use_cases/waccmx_ma_2000_cam6.xml +M bld/namelist_files/use_cases/waccmx_ma_hist_cam6.xml + - SolIonRate_Tot set by namelist_defaults_cam.xml + +M src/chemistry/pp_waccm_ma_mam5/chem_mech.doc +M src/chemistry/pp_waccm_ma_mam5/chem_mech.in +M src/chemistry/pp_waccm_ma_mam5/chem_mods.F90 +M src/chemistry/pp_waccm_ma_mam5/m_spc_id.F90 +M src/chemistry/pp_waccm_ma_mam5/mo_indprd.F90 +M src/chemistry/pp_waccm_ma_mam5/mo_lin_matrix.F90 +M src/chemistry/pp_waccm_ma_mam5/mo_nln_matrix.F90 +M src/chemistry/pp_waccm_ma_mam5/mo_prod_loss.F90 +M src/chemistry/pp_waccm_ma_mam5/mo_rxt_rates_conv.F90 +M src/chemistry/pp_waccm_ma_mam5/mo_sim_dat.F90 + - add diagnostic tracer O3S (explicit solver) + +M src/physics/cam/gw_drag.F90 + - move hard-wired parameter front_gaussian_width to namelist + +If there were any failures reported from running test_driver.sh on any test +platform, and checkin with these failures has been OK'd by the gatekeeper, +then copy the lines from the td.*.status files for the failed tests to the +appropriate machine below. All failed tests must be justified. + +cheyenne/intel/aux_cam: + + ERP_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.FW2000climo.cheyenne_intel.cam-outfrq9s_wcm_ne30 (Overall: FAIL) details: + FAIL ERP_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.FW2000climo.cheyenne_intel.cam-outfrq9s_wcm_ne30 NLCOMP + FAIL ERP_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.FW2000climo.cheyenne_intel.cam-outfrq9s_wcm_ne30 RUN time=291 + - pre-existing failure + + ERP_Ln9_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq9s (Overall: FAIL) details: + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq9s COMPARE_base_rest + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_119: DIFF + SMS_Lh12_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq3h (Overall: DIFF) details: + FAIL SMS_Lh12_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq3h NLCOMP + FAIL SMS_Lh12_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq3h BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_119: DIFF + - HEMCO baseline failures due to known issue with HEMCO external + + ERP_Ln9_P24x3_Vnuopc.f45_f45_mg37.QPWmaC6.cheyenne_intel.cam-outfrq9s_mee_fluxes (Overall: DIFF) details: + FAIL ERP_Ln9_P24x3_Vnuopc.f45_f45_mg37.QPWmaC6.cheyenne_intel.cam-outfrq9s_mee_fluxes NLCOMP + FAIL ERP_Ln9_P24x3_Vnuopc.f45_f45_mg37.QPWmaC6.cheyenne_intel.cam-outfrq9s_mee_fluxes BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_119: FIELDLIST field lists differ (otherwise bit-for-bit) + - new O3S tracer field + + ERS_Ln9_Vnuopc.f09_f09_mg17.FX2000.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL ERS_Ln9_Vnuopc.f09_f09_mg17.FX2000.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL ERS_Ln9_Vnuopc.f09_f09_mg17.FX2000.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_119: DIFF + ERS_Ln9_Vnuopc.f19_f19_mg17.FXSD.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL ERS_Ln9_Vnuopc.f19_f19_mg17.FXSD.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL ERS_Ln9_Vnuopc.f19_f19_mg17.FXSD.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_119: DIFF + SMS_D_Ln9_Vnuopc.f19_f19_mg17.FWma2000climo.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL SMS_D_Ln9_Vnuopc.f19_f19_mg17.FWma2000climo.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL SMS_D_Ln9_Vnuopc.f19_f19_mg17.FWma2000climo.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_119: DIFF + SMS_D_Ln9_Vnuopc.f19_f19_mg17.FXHIST.cheyenne_intel.cam-outfrq9s_amie (Overall: DIFF) details: + FAIL SMS_D_Ln9_Vnuopc.f19_f19_mg17.FXHIST.cheyenne_intel.cam-outfrq9s_amie NLCOMP + FAIL SMS_D_Ln9_Vnuopc.f19_f19_mg17.FXHIST.cheyenne_intel.cam-outfrq9s_amie BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_119: DIFF + SMS_D_Ln9_Vnuopc.ne16_ne16_mg17.FX2000.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL SMS_D_Ln9_Vnuopc.ne16_ne16_mg17.FX2000.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL SMS_D_Ln9_Vnuopc.ne16_ne16_mg17.FX2000.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_119: DIFF + - difference are due to O3S dry dep velocity surface fields, otherwise bit-for-bit + + ERC_D_Ln9_Vnuopc.f19_f19_mg17.QPX2000.cheyenne_intel.cam-outfrq3s (Overall: NLFAIL) details: + ERP_D_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.F2000dev.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + ERP_Ld3_Vnuopc.f09_f09_mg17.FWHIST.cheyenne_intel.cam-reduced_hist1d (Overall: NLFAIL) details: + ERP_Lh12_Vnuopc.f19_f19_mg17.FW4madSD.cheyenne_intel.cam-outfrq3h (Overall: NLFAIL) details: + ERP_Ln9_Vnuopc.f09_f09_mg17.F2000dev.cheyenne_intel.cam-outfrq9s_mg3 (Overall: NLFAIL) details: + ERP_Ln9_Vnuopc.f19_f19_mg17.FWsc1850.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + ERP_Ln9_Vnuopc.ne30_ne30_mg17.FCnudged.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + ERS_Ld3_Vnuopc.f10_f10_mg37.F1850.cheyenne_intel.cam-outfrq1d_14dec_ghg_cam_dev (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc.f09_f09_mg17.FCts2nudged.cheyenne_intel.cam-outfrq9s_leapday (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc.f09_f09_mg17.FCvbsxHIST.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc.f19_f19_mg17.FWma2000climo.cheyenne_intel.cam-outfrq9s_waccm_ma_mam4 (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc.f19_f19_mg17.QPC2000climo.cheyenne_intel.cam-outfrq3s_usecase (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc.ne16_ne16_mg17.QPX2000.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc_P720x1.ne0CONUSne30x8_ne0CONUSne30x8_mt12.FCHIST.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc_P720x1.ne30pg3_ne30pg3_mg17.FCLTHIST.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + SMS_Ld1_Vnuopc.f09_f09_mg17.FW2000climo.cheyenne_intel.cam-outfrq1d (Overall: NLFAIL) details: + SMS_Ld1_Vnuopc.f19_f19.F2000dev.cheyenne_intel.cam-outfrq1d (Overall: NLFAIL) details: + SMS_Ld1_Vnuopc.ne30pg3_ne30pg3_mg17.FC2010climo.cheyenne_intel.cam-outfrq1d (Overall: NLFAIL) details: + SMS_Ln9_Vnuopc.f09_f09_mg17.FW1850.cheyenne_intel.cam-reduced_hist3s (Overall: NLFAIL) details: + - namelist compare failures due to new front_gaussian_width namelist parameter + +izumi/nag/aux_cam: + DAE_Vnuopc.f45_f45_mg37.FHS94.izumi_nag.cam-dae (Overall: FAIL) details: + FAIL DAE_Vnuopc.f45_f45_mg37.FHS94.izumi_nag.cam-dae RUN time=10 + - pre-existing failure + + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPWmaC6.izumi_nag.cam-outfrq3s (Overall: DIFF) details: + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPWmaC6.izumi_nag.cam-outfrq3s NLCOMP + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPWmaC6.izumi_nag.cam-outfrq3s BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_119_nag: FIELDLIST field lists differ (otherwise bit-for-bit) + - new O3S tracer field + + SMS_D_Ln3_Vnuopc.ne5pg3_ne5pg3_mg37.QPX2000.izumi_nag.cam-outfrq3s (Overall: NLFAIL) details: + SMS_D_Ln6_Vnuopc.ne5_ne5_mg37.QPWmaC4.izumi_nag.cam-outfrq3s_physgrid_tem (Overall: NLFAIL) details: + - namelist compare failures due to new front_gaussian_width namelist parameter + +izumi/gnu/aux_cam: + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC4.izumi_gnu.cam-outfrq3s_diags (Overall: NLFAIL) details: + SMS_D_Ln9.f10_f10_mg37.2000_CAM%DEV%GHGMAM4_CLM50%SP_CICE%PRES_DOCN%DOM_MOSART_SGLC_SWAV_SESP.izumi_gnu.cam-outfrq9s (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc.f10_f10_mg37.QPWmaC4.izumi_gnu.cam-outfrq9s_apmee (Overall: NLFAIL) details: + SMS_P48x1_D_Ln9_Vnuopc.f19_f19_mg17.FW4madSD.izumi_gnu.cam-outfrq9s (Overall: NLFAIL) details: + - namelist compare failures due to new front_gaussian_width namelist parameter + +Summarize any changes to answers: bit-for-bit unchanged + +=============================================================== +=============================================================== + +Tag name: cam6_3_119 +Originator(s): fvitt +Date: 19 Jul 2023 +One-line Summary: CAM-Chem namelist updates and fix issue with maximum number of chemical emissions files +Github PR URL: https://github.com/ESCOMP/CAM/pull/850 + +Purpose of changes (include the issue number and title text for each relevant GitHub issue): + + - Updates to FCHIST and FCnudged compsets #771 + - Issue with maximum number of chemical emissions files #538 + -- fixes bug in SOAE emissions in cam6 configurations + +Describe any changes made to build system: N/A + +Describe any changes made to the namelist: N/A + +List any changes to the defaults for the boundary datasets: + + FCHIST and FCnudged compsets use SPS585 boundary conditions for FV 0.9x1.25 grid + +Describe any substantial timing or memory changes: N/A + +Code reviewed by: cacraigucar nusbaume + +List all files eliminated: N/A + +List all files added and what they do: N/A + +List all existing files that have been modified, and describe the changes: + +M bld/namelist_files/use_cases/hist_trop_strat_nudged_cam6.xml +M bld/namelist_files/use_cases/hist_trop_strat_vbs_cam6.xml + - use SPS585 boundary conditions for FV 0.9x1.25 grid + - history_chemitry=.true. enables shortening of the fincl1 list + +M bld/namelist_files/use_cases/2000_cam4_trop_chem.xml +M bld/namelist_files/use_cases/sd_waccm_tsmlt_cam6.xml + - remove SFNO2 from fincl list -- NO2 does not have surface emissions + +M bld/namelist_files/use_cases/sd_trop_strat_vbs_cam6.xml +M bld/namelist_files/use_cases/hist_trop_strat_vbsfire_cam6.xml +M bld/namelist_files/use_cases/waccm_tsmlt_1850_cam6.xml +M bld/namelist_files/use_cases/waccm_tsmlt_2000_cam6.xml +M bld/namelist_files/use_cases/waccm_tsmlt_2010_cam6.xml +M bld/namelist_files/use_cases/waccm_tsmlt_hist_cam6.xml + - history_chemitry=.true. enables shortening of the fincl1 list + +M src/chemistry/mozart/chemistry.F90 + - changes for longer lists of emissions files + - add SF* history fields only if species has surface emissions + +M src/chemistry/mozart/mo_chm_diags.F90 + - add DV_* and DF_* history fields only if species has dry deposition + +M src/chemistry/mozart/mo_srf_emissions.F90 +M src/chemistry/mozart/mo_extfrc.F90 + - changes for longer lists of emissions files + +M src/chemistry/mozart/mo_neu_wetdep.F90 + - remove add_default for DTWR_* history fields + +M src/chemistry/mozart/ocean_emis.F90 + - add ocean_emis_species function + - add_default for OCN_FLUX_* fields if history_chemistry is .true. + +If there were any failures reported from running test_driver.sh on any test +platform, and checkin with these failures has been OK'd by the gatekeeper, +then copy the lines from the td.*.status files for the failed tests to the +appropriate machine below. All failed tests must be justified. + +cheyenne/intel/aux_cam: + + FAIL ERP_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.FW2000climo.cheyenne_intel.cam-outfrq9s_wcm_ne30 RUN time=2420 + - pre-existing failure + + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq9s COMPARE_base_rest + - expected failures in HEMCO tests due to known restart/reprocibility issues with HECMO + + FAIL ERC_D_Ln9_P144x1_Vnuopc.ne16pg3_ne16pg3_mg17.QPC6HIST.cheyenne_intel.cam-outfrq3s_ttrac_usecase BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_118: DIFF + FAIL ERC_D_Ln9_Vnuopc.f19_f19_mg17.QPC6.cheyenne_intel.cam-outfrq3s_cosp BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_118: DIFF + FAIL ERP_D_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.F2000dev.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_118: DIFF + FAIL ERP_Ln9_Vnuopc.C96_C96_mg17.F2000climo.cheyenne_intel.cam-outfrq9s_mg3 BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_118: DIFF + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.F1850.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_118: DIFF + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.F2000climo.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_118: DIFF + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.F2000dev.cheyenne_intel.cam-outfrq9s_mg3 BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_118: DIFF + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.F2010climo.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_118: DIFF + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.FHIST_BDRD.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_118: DIFF + FAIL ERS_Ln9_P288x1_Vnuopc.mpasa120_mpasa120.F2000climo.cheyenne_intel.cam-outfrq9s_mpasa120 BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_118: DIFF + FAIL ERS_Ln9_P36x1_Vnuopc.mpasa480_mpasa480.F2000climo.cheyenne_intel.cam-outfrq9s_mpasa480 BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_118: DIFF + FAIL SMS_D_Ln9_Vnuopc.f09_f09_mg17.FSD.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_118: DIFF + FAIL SMS_D_Ln9_Vnuopc.T42_T42.FSCAM.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_118: DIFF + FAIL SMS_Ld1_Vnuopc.f19_f19.F2000dev.cheyenne_intel.cam-outfrq1d BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_118: DIFF + FAIL SMS_Lm13_Vnuopc.f10_f10_mg37.F2000climo.cheyenne_intel.cam-outfrq1m BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_118: DIFF + FAIL SMS_Ln9_Vnuopc.f09_f09_mg17.F2010climo.cheyenne_intel.cam-nudging BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_118: DIFF + FAIL SMS_Ln9_Vnuopc.f19_f19.F2000climo.cheyenne_intel.cam-silhs BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_118: DIFF + - expected baseline differences due to bug fix for SOAE emissions used in cam6 (trop_mam4 chem) + + FAIL SMS_D_Ln9_Vnuopc_P720x1.ne0ARCTICne30x4_ne0ARCTICne30x4_mt12.FHIST.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_118: DIFF + FAIL SMS_D_Ln9_Vnuopc_P720x1.ne0CONUSne30x8_ne0CONUSne30x8_mt12.FCHIST.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_118: DIFF + FAIL SMS_D_Ln9_Vnuopc_P720x1.ne30pg3_ne30pg3_mg17.FCLTHIST.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_118: DIFF + FAIL ERP_Ln9_Vnuopc.ne30_ne30_mg17.FCnudged.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_118: DIFF + FAIL SMS_D_Ln9_Vnuopc.f09_f09_mg17.FCts2nudged.cheyenne_intel.cam-outfrq9s_leapday BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_118: DIFF + - expected baseline differences due to change in namelist settings + + FAIL ERC_D_Ln9_Vnuopc.f19_f19_mg17.QPMOZ.cheyenne_intel.cam-outfrq3s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_118: FIELDLIST field lists differ (otherwise bit-for-bit) + FAIL ERC_D_Ln9_Vnuopc.f19_f19_mg17.QPX2000.cheyenne_intel.cam-outfrq3s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_118: FIELDLIST field lists differ (otherwise bit-for-bit) + FAIL ERC_D_Ln9_Vnuopc.ne16_ne16_mg17.QPC5HIST.cheyenne_intel.cam-outfrq3s_usecase BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_118: FIELDLIST field lists differ (otherwise bit-for-bit) + FAIL ERP_D_Ln9_Vnuopc.f09_f09_mg17.QSC6.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_118: FIELDLIST field lists differ (otherwise bit-for-bit) + FAIL ERP_D_Ln9_Vnuopc.f19_f19_mg17.QPC6.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_118: FIELDLIST field lists differ (otherwise bit-for-bit) + FAIL ERP_Ln9_Vnuopc.f19_f19_mg17.FWsc1850.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_118: FIELDLIST field lists differ (otherwise bit-for-bit) + FAIL ERS_Ld3_Vnuopc.f10_f10_mg37.F1850.cheyenne_intel.cam-outfrq1d_14dec_ghg_cam_dev BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_118: FIELDLIST field lists differ (otherwise bit-for-bit) + FAIL ERS_Ln9_Vnuopc.f09_f09_mg17.FX2000.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_118: FIELDLIST field lists differ (otherwise bit-for-bit) + FAIL SMS_D_Ld2_Vnuopc.f19_f19_mg17.QPC5HIST.cheyenne_intel.cam-volc_usecase BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_118: FIELDLIST field lists differ (otherwise bit-for-bit) + FAIL SMS_D_Ln9_Vnuopc.f19_f19_mg17.FXHIST.cheyenne_intel.cam-outfrq9s_amie BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_118: FIELDLIST field lists differ (otherwise bit-for-bit) + FAIL SMS_D_Ln9_Vnuopc.f19_f19_mg17.QPC5M7.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_118: FIELDLIST field lists differ (otherwise bit-for-bit) + FAIL SMS_D_Ln9_Vnuopc.ne16_ne16_mg17.FX2000.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_118: FIELDLIST field lists differ (otherwise bit-for-bit) + FAIL SMS_D_Ln9_Vnuopc.ne16_ne16_mg17.QPX2000.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_118: FIELDLIST field lists differ (otherwise bit-for-bit) + FAIL SMS_Ld1_Vnuopc.f09_f09_mg17.FW2000climo.cheyenne_intel.cam-outfrq1d BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_118: FIELDLIST field lists differ (otherwise bit-for-bit) + FAIL SMS_Lh12_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq3h BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_118: FIELDLIST field lists differ (otherwise bit-for-bit) + - change in default history fields, otherwise bit-for-bit + +izumi/nag/aux_cam: + + DAE_Vnuopc.f45_f45_mg37.FHS94.izumi_nag.cam-dae (Overall: FAIL) details: + - pre-existing failure + + FAIL SMS_P48x1_D_Ln3_Vnuopc.f09_f09_mg17.QPC6HIST.izumi_nag.cam-outfrq3s_co2cycle_usecase BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_118_nag: DIFF + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_118_nag: DIFF + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s_am BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_118_nag: DIFF + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s_convmic BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_118_nag: DIFF + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s_cospsathist BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_118_nag: DIFF + FAIL ERI_D_Ln18_Vnuopc.f19_f19_mg17.QPC6.izumi_nag.cam-ghgrmp_e8 BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_118_nag: DIFF + - expected baseline differences due to bug fix for SOAE emissions used in cam6 (trop_mam4 chem) + + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-carma_sea_salt BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_118_nag: FIELDLIST field lists differ (otherwise bit-for-bit) + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-outfrq3s_cosp BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_118_nag: FIELDLIST field lists differ (otherwise bit-for-bit) + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-outfrq3s_subcol BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_118_nag: FIELDLIST field lists differ (otherwise bit-for-bit) + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPWmaC6.izumi_nag.cam-outfrq3s BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_118_nag: FIELDLIST field lists differ (otherwise bit-for-bit) + FAIL ERC_D_Ln9_Vnuopc.ne5_ne5_mg37.QPC5.izumi_nag.cam-outfrq3s_ttrac BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_118_nag: FIELDLIST field lists differ (otherwise bit-for-bit) + FAIL ERI_D_Ln18_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-outfrq3s_eoyttrac BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_118_nag: FIELDLIST field lists differ (otherwise bit-for-bit) + FAIL ERP_Ln9_Vnuopc.ne5pg3_ne5pg3_mg37.QPC6.izumi_nag.cam-outfrq9s_clubbmf BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_118_nag: FIELDLIST field lists differ (otherwise bit-for-bit) + FAIL PLB_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-ttrac_loadbal0 BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_118_nag: FIELDLIST field lists differ (otherwise bit-for-bit) + FAIL PLB_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-ttrac_loadbal1 BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_118_nag: FIELDLIST field lists differ (otherwise bit-for-bit) + FAIL PLB_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-ttrac_loadbal3 BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_118_nag: FIELDLIST field lists differ (otherwise bit-for-bit) + FAIL PLB_D_Ln9_Vnuopc.ne5_ne5_mg37.QPC5.izumi_nag.cam-ttrac_loadbal0 BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_118_nag: FIELDLIST field lists differ (otherwise bit-for-bit) + FAIL PLB_D_Ln9_Vnuopc.ne5_ne5_mg37.QPC5.izumi_nag.cam-ttrac_loadbal1 BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_118_nag: FIELDLIST field lists differ (otherwise bit-for-bit) + FAIL PLB_D_Ln9_Vnuopc.ne5_ne5_mg37.QPC5.izumi_nag.cam-ttrac_loadbal3 BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_118_nag: FIELDLIST field lists differ (otherwise bit-for-bit) + FAIL SMS_D_Ln3_Vnuopc.ne5pg3_ne5pg3_mg37.QPX2000.izumi_nag.cam-outfrq3s BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_118_nag: FIELDLIST field lists differ (otherwise bit-for-bit) + FAIL SMS_D_Ln7_Vnuopc.T42_T42_mg17.QPSCAMC5.izumi_nag.cam-scmarm BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_118_nag: FIELDLIST field lists differ (otherwise bit-for-bit) + FAIL SMS_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-rad_diag_mam BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_118_nag: FIELDLIST field lists differ (otherwise bit-for-bit) + FAIL SUB_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-outfrq3s BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_118_nag: FIELDLIST field lists differ (otherwise bit-for-bit) + FAIL TMC_D_Vnuopc.T5_T5_mg37.QPC5.izumi_nag.cam-ghgrmp_e8 BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_118_nag: FIELDLIST field lists differ (otherwise bit-for-bit) + FAIL TMC_D_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-outfrq3s_eoyttrac BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_118_nag: FIELDLIST field lists differ (otherwise bit-for-bit) + - change in default history fields, otherwise bit-for-bit + +izumi/gnu/aux_cam: + + FAIL SCT_D_Ln7_Vnuopc.T42_T42_mg17.QPC6.izumi_gnu.cam-scm_prep_c6 BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_118_gnu: DIFF + - expected baseline differences due to bug fix for SOAE emissions used in cam6 (trop_mam4 chem) + + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC4.izumi_gnu.cam-outfrq3s_diags BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_118_gnu: FIELDLIST field lists differ (otherwise bit-for-bit) + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_gnu.cam-outfrq3s_unicon BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_118_gnu: FIELDLIST field lists differ (otherwise bit-for-bit) + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPSPCAMM.izumi_gnu.cam-outfrq3s BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_118_gnu: FIELDLIST field lists differ (otherwise bit-for-bit) + FAIL ERP_Ln9_Vnuopc.ne5_ne5_mg37.QPC5.izumi_gnu.cam-outfrq9s BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_118_gnu: FIELDLIST field lists differ (otherwise bit-for-bit) + FAIL PLB_D_Ln9_Vnuopc.ne5pg3_ne5pg3_mg37.QPC5.izumi_gnu.cam-ttrac_loadbal0 BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_118_gnu: FIELDLIST field lists differ (otherwise bit-for-bit) + FAIL PLB_D_Ln9_Vnuopc.ne5pg3_ne5pg3_mg37.QPC5.izumi_gnu.cam-ttrac_loadbal1 BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_118_gnu: FIELDLIST field lists differ (otherwise bit-for-bit) + FAIL PLB_D_Ln9_Vnuopc.ne5pg3_ne5pg3_mg37.QPC5.izumi_gnu.cam-ttrac_loadbal3 BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_118_gnu: FIELDLIST field lists differ (otherwise bit-for-bit) + FAIL SMS_D_Ln3_Vnuopc.f10_f10_mg37.QPMOZ.izumi_gnu.cam-outfrq3s_chemproc BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_118_gnu: FIELDLIST field lists differ (otherwise bit-for-bit) + FAIL SMS_D_Ln9.f10_f10_mg37.2000_CAM%DEV%GHGMAM4_CLM50%SP_CICE%PRES_DOCN%DOM_MOSART_SGLC_SWAV_SESP.izumi_gnu.cam-outfrq9s BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_118_gnu: FIELDLIST field lists differ (otherwise bit-for-bit) + FAIL SMS_D_Ln9_Vnuopc.ne5pg3_ne5pg3_mg37.QPC5.izumi_gnu.cam-outfrq3s_ttrac BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_118_gnu: FIELDLIST field lists differ (otherwise bit-for-bit) + - change in default history fields, otherwise bit-for-bit + +Summarize any changes to answers: larger than round off for cam6 + +=============================================================== +=============================================================== + +Tag name: cam6_3_118 +Originator(s): Haipeng Lin (jimmielin hplin@seas.harvard.edu), fvitt +Date: 17 Jul 2023 +One-line Summary: Integration of Harmonized Emissions Component (HEMCO) as emissions infrastructure +Github PR URL: https://github.com/ESCOMP/CAM/pull/560 + +Purpose of changes (include the issue number and title text for each relevant GitHub issue): + - Add HEMCO_CESM as interface between CAM to the Harmonized Emissions Component (HEMCO): + https://github.com/ESCOMP/CAM/issues/504 + - Remove MCT test -- MCT coupling is no longer supported + - Remove mpi-serial MPILIB setting for SCAM + +Describe any changes made to build system: + - Adds HEMCO build paths under src/hemco + - Adds pre-processor constants MODEL_, MODEL_CESM, HEMCO_CESM, USE_REAL8 for use + by HEMCO to identify it is running in the CESM model environment and requires + 8-bit precision + +Describe any changes made to the namelist: + - cam_physics_mesh now is defined for all compsets instead of only for WACCMX + ionosphere-enabled compsets + - added %HEMCO component sets FC2000climo_HCO, FC2010climo_HCO, FCHIST_HCO, + FCnudged_HCO, FCts2nudged_HCO, and FCSD_HCO that enable HEMCO by default + - added use_hemco, hemco_config_file, hemco_emission_year, hemco_grid_xdim, + hemco_grid_ydim for configuring HEMCO + - ext_frc_specifier and srf_emis_specifier are ignored if use_hemco is true. + +List any changes to the defaults for the boundary datasets: N/A + +Describe any substantial timing or memory changes: N/A + +Code reviewed by: brian-eaton, cacragucar, nusbaume, fvitt, adamrher, lkemmons + +List all files eliminated: N/A + +List all files added and what they do: +A src/chemistry/mozart/hco_cc_emissions.F90 + - Provides surface emissions and external forcing when HEMCO is enabled + +List all existing files that have been modified, and describe the changes: +M .gitignore +M Externals_CAM.cfg + - Adds HEMCO-CESM external + +M bld/build-namelist +M bld/config_files/definition.xml +M bld/namelist_files/namelist_defaults_cam.xml +M bld/namelist_files/namelist_definition.xml +M bld/namelist_files/use_cases/2000_cam6.xml +M bld/namelist_files/use_cases/2000_trop_strat_vbs_cam6.xml +M bld/namelist_files/use_cases/2010_cam6.xml +M bld/namelist_files/use_cases/2010_trop_strat_vbs_cam6.xml + - Refer to namelist changes + +M bld/configure + - Refer to build changes + +M cime_config/config_component.xml +M cime_config/config_compsets.xml + - Adds %HEMCO compset modifier and _HCO compsets for CAM-chem compsets + to enable HEMCO by default + +M cime_config/testdefs/testlist_cam.xml + - Adds test for HEMCO on f09 in aux_cam and camchem_hco test sets, ne30 + in prealpha and camchem_hco test sets to test CAM with HEMCO + - Remove MCT tests + +M cime_config/testdefs/testmods_dirs/cam/scmarm/shell_commands +M cime_config/usermods_dirs/scam_mandatory/shell_commands + - Remove mpi-serial MPILIB setting for SCAM + +M src/chemistry/mozart/chemistry.F90 +M src/chemistry/mozart/mo_chemini.F90 +M src/chemistry/mozart/mo_gas_phase_chemdr.F90 +M src/chemistry/mozart/mo_setext.F90 + - Calls HEMCO-provided routines in hco_cc_emissions instead of existing + set_srf_emissions and extfrc_set when HEMCO is enabled + - Adds pbuf argument to chem_emissions subroutine as necessary for + HEMCO-CESM interface to access pbuf to retrieve emissions computed by HEMCO + +M src/chemistry/pp_none/chemistry.F90 +M src/chemistry/pp_terminator/chemistry.F90 + - Subroutine arguments added pbuf for consistent definition as mozart/chemistry.F90 + +M src/control/runtime_opts.F90 + - Read HEMCO namelist + +M src/physics/cam/phys_control.F90 + - Read use_hemco variable from physics namelist + +M src/physics/cam/physpkg.F90 +M src/physics/cam_dev/physpkg.F90 + - Call HEMCO routines in physics phase 2 + +If there were any failures reported from running test_driver.sh on any test +platform, and checkin with these failures has been OK'd by the gatekeeper, +then copy the lines from the td.*.status files for the failed tests to the +appropriate machine below. All failed tests must be justified. + +cheyenne/intel/aux_cam: B4B + ERP_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.FW2000climo.cheyenne_intel.cam-outfrq9s_wcm_ne30 (Overall: FAIL) details: + - pre-existing failure + + ERC_D_Ln9_P144x1_Vnuopc.ne16pg3_ne16pg3_mg17.QPC6HIST.cheyenne_intel.cam-outfrq3s_ttrac_usecase (Overall: NLFAIL) details: + ERC_D_Ln9_Vnuopc.f19_f19_mg17.QPC6.cheyenne_intel.cam-outfrq3s_cosp (Overall: NLFAIL) details: + ERC_D_Ln9_Vnuopc.f19_f19_mg17.QPMOZ.cheyenne_intel.cam-outfrq3s (Overall: NLFAIL) details: + ERC_D_Ln9_Vnuopc.f19_f19_mg17.QPX2000.cheyenne_intel.cam-outfrq3s (Overall: NLFAIL) details: + ERC_D_Ln9_Vnuopc.ne16_ne16_mg17.FADIAB.cheyenne_intel.cam-terminator (Overall: NLFAIL) details: + ERC_D_Ln9_Vnuopc.ne16_ne16_mg17.QPC5HIST.cheyenne_intel.cam-outfrq3s_usecase (Overall: NLFAIL) details: + ERC_D_Ln9_Vnuopc.T42_T42_mg17.FDABIP04.cheyenne_intel.cam-outfrq3s_usecase (Overall: NLFAIL) details: + ERC_D_Ln9_Vnuopc.T42_T42_mg17.FHS94.cheyenne_intel.cam-outfrq3s_usecase (Overall: NLFAIL) details: + ERI_D_Ln18_Vnuopc.f45_f45_mg37.QPC41850.cheyenne_intel.cam-co2rmp_usecase (Overall: NLFAIL) details: + ERP_D_Ln9_Vnuopc.f09_f09_mg17.QSC6.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + ERP_D_Ln9_Vnuopc.f19_f19_mg17.QPC6.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + ERP_D_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.F2000dev.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + ERP_Ld3_Vnuopc.f09_f09_mg17.FWHIST.cheyenne_intel.cam-reduced_hist1d (Overall: NLFAIL) details: + ERP_Lh12_Vnuopc.f19_f19_mg17.FW4madSD.cheyenne_intel.cam-outfrq3h (Overall: NLFAIL) details: + ERP_Ln9_P24x3_Vnuopc.f45_f45_mg37.QPWmaC6.cheyenne_intel.cam-outfrq9s_mee_fluxes (Overall: NLFAIL) details: + ERP_Ln9_Vnuopc.C96_C96_mg17.F2000climo.cheyenne_intel.cam-outfrq9s_mg3 (Overall: NLFAIL) details: + ERP_Ln9_Vnuopc.f09_f09_mg17.F1850.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + ERP_Ln9_Vnuopc.f09_f09_mg17.F2000climo.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + ERP_Ln9_Vnuopc.f09_f09_mg17.F2000dev.cheyenne_intel.cam-outfrq9s_mg3 (Overall: NLFAIL) details: + ERP_Ln9_Vnuopc.f09_f09_mg17.F2010climo.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + ERP_Ln9_Vnuopc.f09_f09_mg17.FHIST_BDRD.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + ERP_Ln9_Vnuopc.f19_f19_mg17.FWsc1850.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + ERP_Ln9_Vnuopc.ne30_ne30_mg17.FCnudged.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + ERS_Ld3_Vnuopc.f10_f10_mg37.F1850.cheyenne_intel.cam-outfrq1d_14dec_ghg_cam_dev (Overall: NLFAIL) details: + ERS_Ln9_P288x1_Vnuopc.mpasa120_mpasa120.F2000climo.cheyenne_intel.cam-outfrq9s_mpasa120 (Overall: NLFAIL) details: + ERS_Ln9_P36x1_Vnuopc.mpasa480_mpasa480.F2000climo.cheyenne_intel.cam-outfrq9s_mpasa480 (Overall: NLFAIL) details: + ERS_Ln9_Vnuopc.f09_f09_mg17.FX2000.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + ERS_Ln9_Vnuopc.f19_f19_mg17.FSPCAMS.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + ERS_Ln9_Vnuopc.f19_f19_mg17.FXSD.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + ERS_Ln9_Vnuopc.ne0TESTONLYne5x4_ne0TESTONLYne5x4_mg37.FADIAB.cheyenne_intel.cam-outfrq3s_refined (Overall: NLFAIL) details: + SCT_D_Ln7_Vnuopc.T42_T42_mg17.QPC5.cheyenne_intel.cam-scm_prep (Overall: NLFAIL) details: + SMS_D_Ld2_Vnuopc.f19_f19_mg17.QPC5HIST.cheyenne_intel.cam-volc_usecase (Overall: NLFAIL) details: + SMS_D_Ld5_Vnuopc.f19_f19_mg17.PC4.cheyenne_intel.cam-cam4_port5d (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc.f09_f09_mg17.FCts2nudged.cheyenne_intel.cam-outfrq9s_leapday (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc.f09_f09_mg17.FCvbsxHIST.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc.f09_f09_mg17.FSD.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc.f19_f19_mg17.FWma2000climo.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc.f19_f19_mg17.FWma2000climo.cheyenne_intel.cam-outfrq9s_waccm_ma_mam4 (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc.f19_f19_mg17.FXHIST.cheyenne_intel.cam-outfrq9s_amie (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc.f19_f19_mg17.QPC2000climo.cheyenne_intel.cam-outfrq3s_usecase (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc.f19_f19_mg17.QPC5M7.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc.ne16_ne16_mg17.FX2000.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc.ne16_ne16_mg17.QPX2000.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc_P720x1.ne0ARCTICne30x4_ne0ARCTICne30x4_mt12.FHIST.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc_P720x1.ne0CONUSne30x8_ne0CONUSne30x8_mt12.FCHIST.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc_P720x1.ne30pg3_ne30pg3_mg17.FCLTHIST.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc.T42_T42.FSCAM.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + SMS_Ld1_Vnuopc.f09_f09_mg17.FW2000climo.cheyenne_intel.cam-outfrq1d (Overall: NLFAIL) details: + SMS_Ld1_Vnuopc.f19_f19.F2000dev.cheyenne_intel.cam-outfrq1d (Overall: NLFAIL) details: + SMS_Ld1_Vnuopc.ne30pg3_ne30pg3_mg17.FC2010climo.cheyenne_intel.cam-outfrq1d (Overall: NLFAIL) details: + SMS_Ld5_Vnuopc.f09_f09_mg17.PC6.cheyenne_intel.cam-cam6_port_f09 (Overall: NLFAIL) details: + SMS_Lm13_Vnuopc.f10_f10_mg37.F2000climo.cheyenne_intel.cam-outfrq1m (Overall: NLFAIL) details: + SMS_Ln9_Vnuopc.f09_f09_mg17.F2010climo.cheyenne_intel.cam-nudging (Overall: NLFAIL) details: + SMS_Ln9_Vnuopc.f09_f09_mg17.FW1850.cheyenne_intel.cam-reduced_hist3s (Overall: NLFAIL) details: + SMS_Ln9_Vnuopc.f19_f19.F2000climo.cheyenne_intel.cam-silhs (Overall: NLFAIL) details: + SMS_Ln9_Vnuopc.f19_f19_mg17.FHIST.cheyenne_intel.cam-outfrq9s_nochem (Overall: NLFAIL) details: + - namelist compare failures due to use_hemco new namelist switch + + ERP_Ln9_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq9s (Overall: FAIL) details: + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq9s COMPARE_base_rest + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_117: ERROR BFAIL baseline directory '/glade/p/cesm/amwg/cesm_baselines/cam6_3_117/ERP_Ln9_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq9s' does not exist + SMS_Lh12_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq3h (Overall: DIFF) details: + FAIL SMS_Lh12_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq3h NLCOMP + FAIL SMS_Lh12_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq3h BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_117: ERROR BFAIL baseline directory '/glade/p/cesm/amwg/cesm_baselines/cam6_3_117/SMS_Lh12_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq3h' does not exist + - new tests + - HEMCO tests are expected for fail due to known issue with reproducibility and restarts + +izumi/nag/aux_cam: B4B + DAE_Vnuopc.f45_f45_mg37.FHS94.izumi_nag.cam-dae (Overall: FAIL) details: + - pre-existing failure + + ERC_D_Ln9_Vnuopc.T5_T5_mg37.QPC4.izumi_nag.cam-outfrq3s_usecase (Overall: NLFAIL) details: + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-carma_sea_salt (Overall: NLFAIL) details: + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-outfrq3s_cosp (Overall: NLFAIL) details: + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-outfrq3s_subcol (Overall: NLFAIL) details: + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s (Overall: NLFAIL) details: + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s_am (Overall: NLFAIL) details: + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s_convmic (Overall: NLFAIL) details: + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s_cospsathist (Overall: NLFAIL) details: + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPWmaC6.izumi_nag.cam-outfrq3s (Overall: NLFAIL) details: + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QSPCAMS.izumi_nag.cam-outfrq3s (Overall: NLFAIL) details: + ERC_D_Ln9_Vnuopc.mpasa480z32_mpasa480.FHS94.izumi_nag.cam-outfrq3s_usecase (Overall: NLFAIL) details: + ERC_D_Ln9_Vnuopc.ne16_ne16_mg17.QPC4.izumi_nag.cam-outfrq3s_usecase (Overall: NLFAIL) details: + ERC_D_Ln9_Vnuopc.ne16pg3_ne16pg3_mg17.QPC4.izumi_nag.cam-outfrq3s_usecase (Overall: NLFAIL) details: + ERC_D_Ln9_Vnuopc.ne5_ne5_mg37.QPC5.izumi_nag.cam-outfrq3s_ttrac (Overall: NLFAIL) details: + ERI_D_Ln18_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-outfrq3s_eoyttrac (Overall: NLFAIL) details: + ERI_D_Ln18_Vnuopc.f19_f19_mg17.QPC6.izumi_nag.cam-ghgrmp_e8 (Overall: NLFAIL) details: + ERI_D_Ln18_Vnuopc.ne5_ne5_mg37.FADIAB.izumi_nag.cam-outfrq3s_bwic (Overall: NLFAIL) details: + ERI_D_Ln18_Vnuopc.ne5pg3_ne5pg3_mg37.FADIAB.izumi_nag.cam-outfrq3s_bwic (Overall: NLFAIL) details: + ERP_Ln9_Vnuopc.ne5pg3_ne5pg3_mg37.QPC6.izumi_nag.cam-outfrq9s_clubbmf (Overall: NLFAIL) details: + ERS_Ln27_Vnuopc.ne5pg3_ne5pg3_mg37.FKESSLER.izumi_nag.cam-outfrq9s (Overall: NLFAIL) details: + ERS_Ln9_Vnuopc.ne5_ne5_mg37.FADIAB.izumi_nag.cam-outfrq9s (Overall: NLFAIL) details: + PEM_D_Ln9_Vnuopc.ne5_ne5_mg37.FADIAB.izumi_nag.cam-outfrq3s (Overall: NLFAIL) details: + PLB_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-ttrac_loadbal0 (Overall: NLFAIL) details: + PLB_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-ttrac_loadbal1 (Overall: NLFAIL) details: + PLB_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-ttrac_loadbal3 (Overall: NLFAIL) details: + PLB_D_Ln9_Vnuopc.ne5_ne5_mg37.QPC5.izumi_nag.cam-ttrac_loadbal0 (Overall: NLFAIL) details: + PLB_D_Ln9_Vnuopc.ne5_ne5_mg37.QPC5.izumi_nag.cam-ttrac_loadbal1 (Overall: NLFAIL) details: + PLB_D_Ln9_Vnuopc.ne5_ne5_mg37.QPC5.izumi_nag.cam-ttrac_loadbal3 (Overall: NLFAIL) details: + SMS_D_Ld2_Vnuopc.f45_f45_mg37.PC5.izumi_nag.cam-outfrq24h_port (Overall: NLFAIL) details: + SMS_D_Ln3_Vnuopc.ne5pg3_ne5pg3_mg37.QPX2000.izumi_nag.cam-outfrq3s (Overall: NLFAIL) details: + SMS_D_Ln6_Vnuopc.ne5_ne5_mg37.QPWmaC4.izumi_nag.cam-outfrq3s_physgrid_tem (Overall: NLFAIL) details: + SMS_D_Ln7_Vnuopc.T42_T42_mg17.QPSCAMC5.izumi_nag.cam-scmarm (Overall: NLFAIL) details: + SMS_D_Ln9_P1x1_Vnuopc.ne5_ne5_mg37.FADIAB.izumi_nag.cam-outfrq3s (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-rad_diag_mam (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s_ba (Overall: NLFAIL) details: + SMS_P48x1_D_Ln3_Vnuopc.f09_f09_mg17.QPC6HIST.izumi_nag.cam-outfrq3s_co2cycle_usecase (Overall: NLFAIL) details: + SUB_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-outfrq3s (Overall: NLFAIL) details: + TMC_D_Vnuopc.T5_T5_mg37.QPC5.izumi_nag.cam-ghgrmp_e8 (Overall: NLFAIL) details: + TMC_D_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-outfrq3s_eoyttrac (Overall: NLFAIL) details: + - namelist compare failures due to use_hemco new namelist switch + +izumi/gnu/aux_cam: B4B + ERC_D_Ln9_Vnuopc.T5_T5_mg37.QPC3.izumi_gnu.cam-outfrq3s_usecase (Overall: NLFAIL) details: + ERC_D_Ln9_Vnuopc.f10_f10_mg37.FADIAB.izumi_gnu.cam-terminator (Overall: NLFAIL) details: + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC4.izumi_gnu.cam-outfrq3s_diags (Overall: NLFAIL) details: + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_gnu.cam-outfrq3s_unicon (Overall: NLFAIL) details: + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_gnu.cam-rad_diag (Overall: NLFAIL) details: + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPSPCAMM.izumi_gnu.cam-outfrq3s (Overall: NLFAIL) details: + ERC_D_Ln9_Vnuopc.ne5_ne5_mg37.QPC4.izumi_gnu.cam-outfrq3s_nudging_ne5_L26 (Overall: NLFAIL) details: + ERC_D_Ln9_Vnuopc.ne5_ne5_mg37.QPC5.izumi_gnu.cam-outfrq3s_ba (Overall: NLFAIL) details: + ERC_D_Ln9_Vnuopc.ne5pg2_ne5pg2_mg37.FADIAB.izumi_gnu.cam-outfrq3s (Overall: NLFAIL) details: + ERC_D_Ln9_Vnuopc.ne5pg4_ne5pg4_mg37.FADIAB.izumi_gnu.cam-outfrq3s (Overall: NLFAIL) details: + ERI_D_Ln18_Vnuopc.T5_T5_mg37.QPC4.izumi_gnu.cam-co2rmp (Overall: NLFAIL) details: + ERP_Ln9_Vnuopc.ne5_ne5_mg37.FHS94.izumi_gnu.cam-outfrq9s (Overall: NLFAIL) details: + ERP_Ln9_Vnuopc.ne5_ne5_mg37.QPC5.izumi_gnu.cam-outfrq9s (Overall: NLFAIL) details: + PEM_D_Ln9_Vnuopc.ne5pg3_ne5pg3_mg37.FADIAB.izumi_gnu.cam-outfrq3s (Overall: NLFAIL) details: + PLB_D_Ln9_Vnuopc.ne5pg3_ne5pg3_mg37.QPC5.izumi_gnu.cam-ttrac_loadbal0 (Overall: NLFAIL) details: + PLB_D_Ln9_Vnuopc.ne5pg3_ne5pg3_mg37.QPC5.izumi_gnu.cam-ttrac_loadbal1 (Overall: NLFAIL) details: + PLB_D_Ln9_Vnuopc.ne5pg3_ne5pg3_mg37.QPC5.izumi_gnu.cam-ttrac_loadbal3 (Overall: NLFAIL) details: + SCT_D_Ln7_Vnuopc.T42_T42_mg17.QPC4.izumi_gnu.cam-scm_prep (Overall: NLFAIL) details: + SCT_D_Ln7_Vnuopc.T42_T42_mg17.QPC6.izumi_gnu.cam-scm_prep_c6 (Overall: NLFAIL) details: + SMS_D_Ln3_Vnuopc.f10_f10_mg37.QPMOZ.izumi_gnu.cam-outfrq3s_chemproc (Overall: NLFAIL) details: + SMS_D_Ln9.f10_f10_mg37.2000_CAM%DEV%GHGMAM4_CLM50%SP_CICE%PRES_DOCN%DOM_MOSART_SGLC_SWAV_SESP.izumi_gnu.cam-outfrq9s (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc.f10_f10_mg37.QPWmaC4.izumi_gnu.cam-outfrq9s_apmee (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc.ne5pg3_ne5pg3_mg37.QPC5.izumi_gnu.cam-outfrq3s_ttrac (Overall: NLFAIL) details: + SMS_P48x1_D_Ln9_Vnuopc.f19_f19_mg17.FW4madSD.izumi_gnu.cam-outfrq9s (Overall: NLFAIL) details: + - namelist compare failures due to use_hemco new namelist switch + +Summarize any changes to answers: bit-for-bit unchanged + +=============================================================== +=============================================================== + +Tag name: cam6_3_117 +Originator(s): cacraig, patc, islas +Date: June 28, 2023 +One-line Summary: Bring in Frierson Simple Model (gray radiation) +Github PR URL: https://github.com/ESCOMP/CAM/pull/537 + +Purpose of changes (include the issue number and title text for each relevant GitHub issue): + - Frierson gray radiation: https://github.com/ESCOMP/CAM/issues/8 + +Describe any changes made to build system: + - Add physics option "grayrad" + +Describe any changes made to the namelist: + - Introduced namelist settings for Frierson Gray radiation (all prepended with "frierson") + +List any changes to the defaults for the boundary datasets: N/A + +Describe any substantial timing or memory changes: N/A + +Code reviewed by: fvitt, peverwhee, nusbaume + +List all files eliminated: N/A + +List all files added and what they do: +A bld/namelist_files/use_cases/dctest_frierson.xml + - Add use_case for Gray radiation model + +A src/physics/simple/frierson.F90 +A src/physics/simple/frierson_cam.F90 + - Bring in Frierson code along with the CAM interface code to it + +List all existing files that have been modified, and describe the changes: +M bld/build-namelist + - introduce grayrad physics option and accompanying namelist values + +M bld/config_files/definition.xml +M bld/configure + - introduce grayrad physics option + +M bld/namelist_files/namelist_defaults_cam.xml +M bld/namelist_files/namelist_definition.xml + - introduce grayrad namelist values + +M cime_config/config_component.xml + - introduce %GRAYRAD compset qualifier + +M cime_config/config_compsets.xml + - introduce FGRAYRAD compset + +M cime_config/testdefs/testlist_cam.xml + - introduce prebeta test for FGRAYRAD compset + +M src/control/cam_control_mod.F90 +M src/control/runtime_opts.F90 +M src/physics/simple/physpkg.F90 +M src/physics/simple/restart_physics.F90 + - mods to support gray radiation + +If there were any failures reported from running test_driver.sh on any test +platform, and checkin with these failures has been OK'd by the gatekeeper, +then copy the lines from the td.*.status files for the failed tests to the +appropriate machine below. All failed tests must be justified. + +cheyenne/intel/aux_cam: all BFB except: + ERP_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.FW2000climo.cheyenne_intel.cam-outfrq9s_wcm_ne30 (Overall: FAIL) details: + - pre-existing failure + +izumi/nag/aux_cam: all BFB except: + DAE_Vnuopc.f45_f45_mg37.FHS94.izumi_nag.cam-dae (Overall: FAIL) details: + - pre-existing failure + +izumi/gnu/aux_cam: all BFB + +Isla Simpson analyzed the results from these code mods and approved the release of the Gray Radiation option. + +=============================================================== +=============================================================== + +Tag name:cam6_3_116 +Originator(s): cacraig, hannay, jedwards, eaton +Date: June 23, 2023 +One-line Summary: CAM Tuning "F" and fix derecho CSLAM performance +Github PR URL: https://github.com/ESCOMP/CAM/pull/820 + +Purpose of changes (include the issue number and title text for each relevant GitHub issue): + - Update tunings for LT and MT based on the "Tuning F": https://github.com/ESCOMP/CAM/issues/818 + - New gw tuning to add to the trunk: https://github.com/ESCOMP/CAM/issues/829 + - More tuning for LT and MT: https://github.com/ESCOMP/CAM/issues/838 + - Derecho CSLAM performance issue: https://github.com/ESCOMP/CAM/discussions/827 + - add pointers for intel performance, remove unused PI variable for nvhpc: https://github.com/ESCOMP/CAM/pull/845 + - Introduce configure options "lt" and "mt" + - Use new ncdata file with required metadata for LT and MT ne30pg3 runs + +Describe any changes made to build system: N/A + +Describe any changes made to the namelist: + - micro_mg_dcs is now set inside build-namelist + - Default settings were changed for: micro_mg_dcs, use_gw_front, use_gw_convect_dp, + eff_rdg_beta, eff_rdg_beta_max, tau_0_ubc, effgw_beres_dp, clubb_C7, clubb_C_uu_shr, + clubb_l_mono_flux_lim_um, clubb_l_mono_flux_lim_vm, clubb_l_predict_upwp_vpwp, + microp_aero_wsubi_scale, micro_mg_vtrmi_factor, dust_emis_fact, seasalt_emis_scale + +List any changes to the defaults for the boundary datasets: N/A + +Describe any substantial timing or memory changes: N/A + +Code reviewed by: fvitt, nusbaume, eaton, adamrher (jtruedal, nusbaume and Peter Lauritzen reveiwed PR#845) + +List all files eliminated: N/A + +List all files added and what they do: N/A + +List all existing files that have been modified, and describe the changes: +M bld/build-namelist + - Add selection for micro_mg_dcs + - Additional settings for tuning "F" + +M bld/config_files/definition.xml +M bld/configure +M cime_config/config_component.xml + - Introduce model_top qualifier with lt and mt options + +M bld/namelist_files/namelist_defaults_cam.xml + - Tuning "F" namelist settings + - Update files to include LT and MT input files which contain metadata + +M bld/namelist_files/use_cases/1850_cam_lt.xml +M bld/namelist_files/use_cases/1850_cam_mt.xml +M bld/namelist_files/use_cases/hist_cam_lt.xml +M bld/namelist_files/use_cases/hist_cam_mt.xml + - Remove ncdata files and use ones from namelist_defaults_cam.xml + +M cime_config/config_compsets.xml + - Update to FLTHIST_v0d and FMTHIST_v0d + +M src/control/cam_history.F90 + - remove unused pi + +M src/dynamics/se/dycore/fvm_consistent_se_cslam.F90 + - Fix derecho performance issue + + +If there were any failures reported from running test_driver.sh on any test +platform, and checkin with these failures has been OK'd by the gatekeeper, +then copy the lines from the td.*.status files for the failed tests to the +appropriate machine below. All failed tests must be justified. + +Most tests had namelist differences + +cheyenne/intel/aux_cam: all BFB except: + + Ran FLTHIST and FMTHIST with old and new ncdata file and the results were BFB + + ERP_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.FW2000climo.cheyenne_intel.cam-outfrq9s_wcm_ne30 (Overall: FAIL) details: + - pre-existing failure + + ERP_D_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.F2000dev.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + ERP_Ln9_Vnuopc.f09_f09_mg17.F2000dev.cheyenne_intel.cam-outfrq9s_mg3 (Overall: DIFF) details: + ERS_Ld3_Vnuopc.f10_f10_mg37.F1850.cheyenne_intel.cam-outfrq1d_14dec_ghg_cam_dev (Overall: DIFF) details: + SMS_D_Ln9_Vnuopc_P720x1.ne30pg3_ne30pg3_mg17.FCLTHIST.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + SMS_Ld1_Vnuopc.f19_f19.F2000dev.cheyenne_intel.cam-outfrq1d (Overall: DIFF) details: + - cam_dev tests have answer changes due to namelist changes + + SMS_Ln9_Vnuopc.f19_f19.F2000climo.cheyenne_intel.cam-silhs (Overall: DIFF) details: + - SILHS has answer changes due to namelist changes. Adam Herrington approved changing answers for this configuration + +izumi/nag/aux_cam: all BFB except: + DAE_Vnuopc.f45_f45_mg37.FHS94.izumi_nag.cam-dae (Overall: FAIL) details: + - pre-existing failure + +izumi/gnu/aux_cam: all BFB except: + SMS_D_Ln9.f10_f10_mg37.2000_CAM%DEV%GHGMAM4_CLM50%SP_CICE%PRES_DOCN%DOM_MOSART_SGLC_SWAV_SESP.izumi_gnu.cam-outfrq9s (Overall: DIFF) details: + - cam_dev tests have answer changes due to namelist changes +CAM tag used for the baseline comparison tests if different than previous +tag: + +Summarize any changes to answers, i.e., +- what code configurations: +- what platforms/compilers: +- nature of change (roundoff; larger than roundoff but same climate; new + climate): + +If bitwise differences were observed, how did you show they were no worse +than roundoff? + +If this tag changes climate describe the run(s) done to evaluate the new +climate in enough detail that it(they) could be reproduced, i.e., +- source tag (all code used must be in the repository): +- platform/compilers: +- configure commandline: +- build-namelist command (or complete namelist): +- MSS location of output: + +MSS location of control simulations used to validate new climate: + +URL for AMWG diagnostics output used to validate new climate: + +=============================================================== +=============================================================== +Tag name: cam6_3_115 +Originator(s): aherring, jet +Date: June 21, 2023 +One-line Summary: Add support for coarse se grid ne3np4 and additional support for ne5 and ne16 grids +Github PR URL: https://github.com/ESCOMP/CAM/pull/815 + +Purpose of changes (include the issue number and title text for each relevant GitHub issue): + - Create coarser grids for SE dycore and use for regression testing: https://github.com/ESCOMP/CAM/issues/726 + +Describe any changes made to build system: N/A + +Describe any changes made to the namelist: N/A + +List any changes to the defaults for the boundary datasets: New coarse grid SE boundary data. + /glade/p/cesmdata/inputdata/atm/cam/inic/se/cam6_QPC6_aqua_ne3pg3_mg37_L32_01-01-31_c221214.nc + /glade/p/cesmdata/inputdata/atm/cam/inic/se/cam6_QPC6_aqua_ne3pg3_mg37_L58_01-01-31_c221214.nc + /glade/p/cesmdata/inputdata/atm/cam/inic/se/cam6_QPC6_aqua_ne3pg3_mg37_L93_01-01-31_c221214.nc + /glade/p/cesmdata/inputdata/atm/cam/inic/se/cam6_QPC6_topo_ne3pg3_mg37_L32_01-01-31_c221214.nc + /glade/p/cesmdata/inputdata/atm/cam/inic/se/cam6_QPC6_topo_ne3pg3_mg37_L58_01-01-31_c221214.nc + /glade/p/cesmdata/inputdata/atm/cam/inic/se/cam6_QPC6_topo_ne3pg3_mg37_L93_01-01-31_c221214.nc + /glade/p/cesmdata/inputdata/atm/cam/inic/se/F2000climo_ne5pg3_mg37_L32_01-01-31_c230520.nc + /glade/p/cesmdata/inputdata/atm/cam/inic/se/F2000climo_ne5pg3_mg37_L58_01-01-31_c230520.nc + /glade/p/cesmdata/inputdata/atm/cam/topo/se/ne3pg3_gmted2010_modis_bedmachine_nc0540_Laplace1000_noleak_20230209.nc + /glade/p/cesmdata/inputdata/atm/cam/chem/trop_mam/atmsrf_ne3np4.pg3_c221214.nc + /glade/p/cesmdata/inputdata/atm/cam/chem/trop_mam/atmsrf_ne5pg3_201105.nc + /glade/p/cesmdata/inputdata/atm/cam/chem/trop_mam/atmsrf_ne16pg3_c230520.nc + +Describe any substantial timing or memory changes: N/A + +Code reviewed by: cacraig + +List all files eliminated: N/A + +List all files added and what they do: N/A + +List all existing files that have been modified, and describe the changes: + M bld/namelist_files/namelist_defaults_cam.xml + - New defaults for ne3 ne5 and ne16 boundary data + M cime_config/tsetdefs/testlist_cam.xml + - New test for ne3pg3 grid + M Changelog + +If there were any failures reported from running test_driver.sh on any test +platform, and checkin with these failures has been OK'd by the gatekeeper, +then copy the lines from the td.*.status files for the failed tests to the +appropriate machine below. All failed tests must be justified. + +cheyenne/intel/aux_cam: + ERS_Ln9_P36x1_Vnuopc.mpasa480_mpasa480.F2000climo.cheyenne_intel.cam-outfrq9s_mpasa480 (Overall: FAIL) details: + ERP_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.FW2000climo.cheyenne_intel.cam-outfrq9s_wcm_ne30 (Overall: FAIL) details: + - pre-existing failures - mpasa480 failure due to corrupted initial condition file. + + ERC_D_Ln9_P144x1_Vnuopc.ne16pg3_ne16pg3_mg17.QPC6HIST.cheyenne_intel.cam-outfrq3s_ttrac_usecase (Overall: DIFF) details: + - Expected Difference due to update dry dep surface data file + +izumi/nag/aux_cam: + DAE_Vnuopc.f45_f45_mg37.FHS94.izumi_nag.cam-dae (Overall: FAIL) details: + - Pre-existing failure + + ERP_Ln9_Vmct.ne5pg3_ne5pg3_mg37.QPC6.izumi_nag.cam-outfrq9s_clubbmf (Overall: DIFF) details: + ERP_Ln9_Vnuopc.ne5pg3_ne5pg3_mg37.QPC6.izumi_nag.cam-outfrq9s_clubbmf (Overall: DIFF) details: + - expected failures due to updated initial condition file. + + ERP_Ln9_Vnuopc.ne3pg3_ne3pg3_mg37.QPC6.izumi_nag.cam-outfrq9s_clubbmf (Overall: DIFF) details: + - expected failure against Baseline because this is a new test + +izumi/gnu/aux_cam: + PLB_D_Ln9_Vnuopc.ne5pg3_ne5pg3_mg37.QPC5.izumi_gnu.cam-ttrac_loadbal0 (Overall: DIFF) details: + PLB_D_Ln9_Vnuopc.ne5pg3_ne5pg3_mg37.QPC5.izumi_gnu.cam-ttrac_loadbal1 (Overall: DIFF) details: + PLB_D_Ln9_Vnuopc.ne5pg3_ne5pg3_mg37.QPC5.izumi_gnu.cam-ttrac_loadbal3 (Overall: DIFF) details: + SMS_D_Ln9_Vnuopc.ne5pg3_ne5pg3_mg37.QPC5.izumi_gnu.cam-outfrq3s_ttrac (Overall: DIFF) details: + - expected failures due to updated initial condition file. +=============================================================== +=============================================================== + +Tag name: cam6_3_114 +Originator(s): cacraig +Date: June 8, 2023 +One-line Summary: Update externals to match cesm2_3_beta14 + +Github PR URL: https://github.com/ESCOMP/CAM/pull/836 + +Purpose of changes (include the issue number and title text for each relevant GitHub issue): +Update externals to cesm2_3_beta14 + : https://github.com/ESCOMP/CAM/issues/835 +Update to ccs_config_cesm0.0.72: https://github.com/ESCOMP/CAM/issues/834 +Brings in CTSM external needed by https://github.com/ESCOMP/CAM/pull/815 + +Describe any changes made to build system: N/A + +Describe any changes made to the namelist: N/A + +List any changes to the defaults for the boundary datasets: N/A + +Describe any substantial timing or memory changes: N/A + +Code reviewed by: nusbaume + +List all files eliminated: N/A + +List all files added and what they do: N/A + +List all existing files that have been modified, and describe the changes: +M Externals.cfg + Update externals to match cesm2_3_beta14 (plus more recent CTSM and ccs_config as described above) + +If there were any failures reported from running test_driver.sh on any test +platform, and checkin with these failures has been OK'd by the gatekeeper, +then copy the lines from the td.*.status files for the failed tests to the +appropriate machine below. All failed tests must be justified. + +cheyenne/intel/aux_cam: all NL changes + - NUOPC introduces namelist changes + + ERP_Ld3_Vnuopc.f09_f09_mg17.FWHIST.cheyenne_intel.cam-reduced_hist1d (Overall: DIFF) details: + ERP_Ln9_Vnuopc.f09_f09_mg17.F2000dev.cheyenne_intel.cam-outfrq9s_mg3 (Overall: DIFF) details: + ERS_Ld3_Vnuopc.f10_f10_mg37.F1850.cheyenne_intel.cam-outfrq1d_14dec_ghg_cam_dev (Overall: DIFF) details: + ERS_Ln9_P288x1_Vnuopc.mpasa120_mpasa120.F2000climo.cheyenne_intel.cam-outfrq9s_mpasa120 (Overall: DIFF) details: + SMS_D_Ln9_Vnuopc.f09_f09_mg17.FSD.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + SMS_Ld1_Vnuopc.f19_f19.F2000dev.cheyenne_intel.cam-outfrq1d (Overall: DIFF) details: + - Answer changes due to CTSM + + ERP_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.FW2000climo.cheyenne_intel.cam-outfrq9s_wcm_ne30 (Overall: FAIL) details: + ERS_Ln9_P36x1_Vnuopc.mpasa480_mpasa480.F2000climo.cheyenne_intel.cam-outfrq9s_mpasa480 (Overall: FAIL) details: + - preexisting failure + +izumi/nag/aux_cam: all BFB, all NL changes + - NUOPC introduces namelist changes + + FAIL DAE_Vnuopc.f45_f45_mg37.FHS94.izumi_nag.cam-dae RUN time=10 + - preexisting failure + + +izumi/gnu/aux_cam: all BFB, all NL changes + - NUOPC introduces namelist changes + +CAM tag used for the baseline comparison tests if different than previous +tag: cam6_3_112 as cam6_3_113 did not have regression tests run for it + +=============================================================== +=============================================================== + +Tag name: cam6_3_113 +Originator(s): cacraig +Date: June 5, 2023 +One-line Summary: Update manage_externals to manic-1.2.22 +Github PR URL: https://github.com/ESCOMP/CAM/pull/833 + +Purpose of changes (include the issue number and title text for each relevant GitHub issue): + - Update manage_externals to latest version: https://github.com/ESCOMP/CAM/issues/740 + +Describe any changes made to build system: N/A + +Describe any changes made to the namelist: N/A + +List any changes to the defaults for the boundary datasets: N/A + +Describe any substantial timing or memory changes: N/A + +Code reviewed by: nusbaume + +List all files eliminated: N/A + +List all files added and what they do: N/A +A manage_externals/.github/workflows/bumpversion.yml +A manage_externals/.github/workflows/tests.yml +A manage_externals/test/repos/README.md + - Updates for manage_externals + +List all existing files that have been modified, and describe the changes: +M manage_externals/.gitignore +M manage_externals/.travis.yml +M manage_externals/README.md +M manage_externals/checkout_externals +M manage_externals/manic/checkout.py +M manage_externals/manic/externals_description.py +M manage_externals/manic/externals_status.py +M manage_externals/manic/repository_factory.py +M manage_externals/manic/repository_git.py +M manage_externals/manic/repository_svn.py +M manage_externals/manic/sourcetree.py +M manage_externals/manic/utils.py +M manage_externals/test/README.md +M manage_externals/test/test_sys_checkout.py +M manage_externals/test/test_sys_repository_git.py +M manage_externals/test/test_unit_externals_description.py +M manage_externals/test/test_unit_externals_status.py +M manage_externals/test/test_unit_repository.py +M manage_externals/test/test_unit_repository_git.py +M manage_externals/test/test_unit_repository_svn.py +M manage_externals/test/test_unit_utils.py + - Updates for manage_externals + + +If there were any failures reported from running test_driver.sh on any test +platform, and checkin with these failures has been OK'd by the gatekeeper, +then copy the lines from the td.*.status files for the failed tests to the +appropriate machine below. All failed tests must be justified. + +cheyenne/intel/aux_cam: None run + +izumi/nag/aux_cam: None run + +izumi/gnu/aux_cam: None run + +Ran manage_externals/checkout_externals on cheyenne and izumi and it worked fine + +=============================================================== +=============================================================== + Tag name: cam6_3_112 Originator(s): fvitt Date: 18 May 2023 diff --git a/manage_externals/.github/workflows/bumpversion.yml b/manage_externals/.github/workflows/bumpversion.yml new file mode 100644 index 0000000000..f4dc9b7ca5 --- /dev/null +++ b/manage_externals/.github/workflows/bumpversion.yml @@ -0,0 +1,19 @@ +name: Bump version +on: + push: + branches: + - main +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Bump version and push tag + id: tag_version + uses: mathieudutour/github-tag-action@v5.5 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + create_annotated_tag: true + default_bump: patch + dry_run: false + tag_prefix: manic- diff --git a/manage_externals/.github/workflows/tests.yml b/manage_externals/.github/workflows/tests.yml new file mode 100644 index 0000000000..dd75b91b49 --- /dev/null +++ b/manage_externals/.github/workflows/tests.yml @@ -0,0 +1,30 @@ +# This is a workflow to compile the cmeps source without cime +name: Test Manic + +# Controls when the action will run. Triggers the workflow on push or pull request +# events but only for the master branch +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + test-manic: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Test Manic + run: | + pushd test + git config --global user.email "devnull@example.com" + git config --global user.name "GITHUB tester" + git config --global protocol.file.allow always + make utest + make stest + popd + + - name: Setup tmate session + if: ${{ failure() }} + uses: mxschmitt/action-tmate@v3 diff --git a/manage_externals/.gitignore b/manage_externals/.gitignore index 411de5d96e..a71ac0cd75 100644 --- a/manage_externals/.gitignore +++ b/manage_externals/.gitignore @@ -12,3 +12,6 @@ components/ # generated python files *.pyc + +# test tmp file +test/tmp diff --git a/manage_externals/.travis.yml b/manage_externals/.travis.yml index 1990cb9604..d9b24c584d 100644 --- a/manage_externals/.travis.yml +++ b/manage_externals/.travis.yml @@ -1,7 +1,6 @@ language: python os: linux -python: - - "2.7" +python: - "3.4" - "3.5" - "3.6" diff --git a/manage_externals/README.md b/manage_externals/README.md index c931c8e213..9475301b5d 100644 --- a/manage_externals/README.md +++ b/manage_externals/README.md @@ -201,6 +201,11 @@ The root of the source tree will be referred to as `${SRC_ROOT}` below. externals description file pointed 'useful_library/sub-xternals.cfg', Then the main 'externals' field in the top level repo should point to 'sub-externals.cfg'. + Note that by default, `checkout_externals` will clone an external's + submodules. As a special case, the entry, `externals = None`, will + prevent this behavior. For more control over which externals are + checked out, create an externals file (and see the `from_submodule` + configuration entry below). * from_submodule (True / False) : used to pull the repo_url, local_path, and hash properties for this external from the .gitmodules file in diff --git a/manage_externals/checkout_externals b/manage_externals/checkout_externals index a0698baef0..48bce24010 100755 --- a/manage_externals/checkout_externals +++ b/manage_externals/checkout_externals @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """Main driver wrapper around the manic/checkout utility. diff --git a/manage_externals/manic/checkout.py b/manage_externals/manic/checkout.py index edc5655954..3f5537adce 100755 --- a/manage_externals/manic/checkout.py +++ b/manage_externals/manic/checkout.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Tool to assemble repositories represented in a model-description file. @@ -227,6 +227,12 @@ def commandline_arguments(args=None): Now, %(prog)s will process Externals.cfg and also process Externals_LIBX.cfg as if it was a sub-external. + Note that by default, checkout_externals will clone an external's + submodules. As a special case, the entry, "externals = None", will + prevent this behavior. For more control over which externals are + checked out, create an externals file (and see the from_submodule + configuration entry below). + * from_submodule (True / False) : used to pull the repo_url, local_path, and hash properties for this external from the .gitmodules file in this repository. Note that the section name (the entry in square @@ -279,6 +285,9 @@ def commandline_arguments(args=None): help='The externals description filename. ' 'Default: %(default)s.') + parser.add_argument('-x', '--exclude', nargs='*', + help='Component(s) listed in the externals file which should be ignored.') + parser.add_argument('-o', '--optional', action='store_true', default=False, help='By default only the required externals ' 'are checked out. This flag will also checkout the ' @@ -329,7 +338,34 @@ def commandline_arguments(args=None): options = parser.parse_args() return options - +def _dirty_local_repo_msg(program_name, config_file): + return """The external repositories labeled with 'M' above are not in a clean state. +The following are four options for how to proceed: +(1) Go into each external that is not in a clean state and issue either a 'git status' or + an 'svn status' command (depending on whether the external is managed by git or + svn). Either revert or commit your changes so that all externals are in a clean + state. (To revert changes in git, follow the instructions given when you run 'git + status'.) (Note, though, that it is okay to have untracked files in your working + directory.) Then rerun {program_name}. +(2) Alternatively, you do not have to rely on {program_name}. Instead, you can manually + update out-of-sync externals (labeled with 's' above) as described in the + configuration file {config_file}. (For example, run 'git fetch' and 'git checkout' + commands to checkout the appropriate tags for each external, as given in + {config_file}.) +(3) You can also use {program_name} to manage most, but not all externals: You can specify + one or more externals to ignore using the '-x' or '--exclude' argument to + {program_name}. Excluding externals labeled with 'M' will allow {program_name} to + update the other, non-excluded externals. +(4) As a last resort, if you are confident that there is no work that needs to be saved + from a given external, you can remove that external (via "rm -rf [directory]") and + then rerun the {program_name} tool. This option is mainly useful as a workaround for + issues with this tool (such as https://github.com/ESMCI/manage_externals/issues/157). +The external repositories labeled with '?' above are not under version +control using the expected protocol. If you are sure you want to switch +protocols, and you don't have any work you need to save from this +directory, then run "rm -rf [directory]" before rerunning the +{program_name} tool. +""".format(program_name=program_name, config_file=config_file) # --------------------------------------------------------------------- # # main @@ -342,9 +378,9 @@ def main(args): the --all option is passed. Returns a tuple (overall_status, tree_status). overall_status is 0 - on success, non-zero on failure. tree_status gives the full status - *before* executing the checkout command - i.e., the status that it - used to determine if it's safe to proceed with the checkout. + on success, non-zero on failure. tree_status is a dict mapping local path + to ExternalStatus -- if no checkout is happening. If checkout is happening, tree_status + is None. """ if args.do_logging: logging.basicConfig(filename=LOG_FILE_NAME, @@ -360,57 +396,41 @@ def main(args): load_all = True root_dir = os.path.abspath(os.getcwd()) - external_data = read_externals_description_file(root_dir, args.externals) - external = create_externals_description( - external_data, components=args.components) + model_data = read_externals_description_file(root_dir, args.externals) + ext_description = create_externals_description( + model_data, components=args.components, exclude=args.exclude) for comp in args.components: - if comp not in external.keys(): + if comp not in ext_description.keys(): + # Note we can't print out the list of found externals because + # they were filtered in create_externals_description above. fatal_error( "No component {} found in {}".format( comp, args.externals)) - source_tree = SourceTree(root_dir, external, svn_ignore_ancestry=args.svn_ignore_ancestry) - printlog('Checking status of externals: ', end='') - tree_status = source_tree.status() + source_tree = SourceTree(root_dir, ext_description, svn_ignore_ancestry=args.svn_ignore_ancestry) + if args.components: + components_str = 'specified components' + else: + components_str = 'required & optional components' + printlog('Checking local status of ' + components_str + ': ', end='') + tree_status = source_tree.status(print_progress=True) printlog('') if args.status: # user requested status-only - for comp in sorted(tree_status.keys()): + for comp in sorted(tree_status): tree_status[comp].log_status_message(args.verbose) else: # checkout / update the external repositories. safe_to_update = check_safe_to_update_repos(tree_status) if not safe_to_update: # print status - for comp in sorted(tree_status.keys()): + for comp in sorted(tree_status): tree_status[comp].log_status_message(args.verbose) # exit gracefully - msg = """The external repositories labeled with 'M' above are not in a clean state. - -The following are two options for how to proceed: - -(1) Go into each external that is not in a clean state and issue either - an 'svn status' or a 'git status' command. Either revert or commit - your changes so that all externals are in a clean state. (Note, - though, that it is okay to have untracked files in your working - directory.) Then rerun {program_name}. - -(2) Alternatively, you do not have to rely on {program_name}. Instead, you - can manually update out-of-sync externals (labeled with 's' above) - as described in the configuration file {config_file}. - - -The external repositories labeled with '?' above are not under version -control using the expected protocol. If you are sure you want to switch -protocols, and you don't have any work you need to save from this -directory, then run "rm -rf [directory]" before re-running the -checkout_externals tool. -""".format(program_name=program_name, config_file=args.externals) - printlog('-' * 70) - printlog(msg) + printlog(_dirty_local_repo_msg(program_name, args.externals)) printlog('-' * 70) else: if not args.components: @@ -418,6 +438,8 @@ def main(args): for comp in args.components: source_tree.checkout(args.verbose, load_all, load_comp=comp) printlog('') + # New tree status is unknown, don't return anything. + tree_status = None logging.info('%s completed without exceptions.', program_name) # NOTE(bja, 2017-11) tree status is used by the systems tests diff --git a/manage_externals/manic/externals_description.py b/manage_externals/manic/externals_description.py index b0c4f736a7..546e7fdcb4 100644 --- a/manage_externals/manic/externals_description.py +++ b/manage_externals/manic/externals_description.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """Model description @@ -71,7 +71,8 @@ def read_externals_description_file(root_dir, file_name): root_dir = os.path.abspath(root_dir) msg = 'In directory : {0}'.format(root_dir) logging.info(msg) - printlog('Processing externals description file : {0}'.format(file_name)) + printlog('Processing externals description file : {0} ({1})'.format(file_name, + root_dir)) file_path = os.path.join(root_dir, file_name) if not os.path.exists(file_name): @@ -87,7 +88,7 @@ def read_externals_description_file(root_dir, file_name): externals_description = None if file_name == ExternalsDescription.GIT_SUBMODULES_FILENAME: - externals_description = read_gitmodules_file(root_dir, file_name) + externals_description = _read_gitmodules_file(root_dir, file_name) else: try: config = config_parser() @@ -150,9 +151,8 @@ def git_submodule_status(repo_dir): """Run the git submodule status command to obtain submodule hashes. """ # This function is here instead of GitRepository to avoid a dependency loop - cwd = os.getcwd() - os.chdir(repo_dir) - cmd = ['git', 'submodule', 'status'] + cmd = 'git -C {repo_dir} submodule status'.format( + repo_dir=repo_dir).split() git_output = execute_subprocess(cmd, output_to_caller=True) submodules = {} submods = git_output.split('\n') @@ -167,7 +167,6 @@ def git_submodule_status(repo_dir): submodules[items[1]] = {'hash':items[0], 'status':status, 'tag':tag} - os.chdir(cwd) return submodules def parse_submodules_desc_section(section_items, file_path): @@ -180,6 +179,9 @@ def parse_submodules_desc_section(section_items, file_path): path = item[1].strip() elif name == 'url': url = item[1].strip() + elif name == 'branch': + # We do not care about branch since we have a hash - silently ignore + pass else: msg = 'WARNING: Ignoring unknown {} property, in {}' msg = msg.format(item[0], file_path) # fool pylint @@ -187,21 +189,23 @@ def parse_submodules_desc_section(section_items, file_path): return path, url -def read_gitmodules_file(root_dir, file_name): +def _read_gitmodules_file(root_dir, file_name): # pylint: disable=deprecated-method # Disabling this check because the method is only used for python2 + # pylint: disable=too-many-locals + # pylint: disable=too-many-branches + # pylint: disable=too-many-statements """Read a .gitmodules file and convert it to be compatible with an externals description. """ root_dir = os.path.abspath(root_dir) msg = 'In directory : {0}'.format(root_dir) logging.info(msg) - printlog('Processing submodules description file : {0}'.format(file_name)) file_path = os.path.join(root_dir, file_name) if not os.path.exists(file_name): msg = ('ERROR: submodules description file, "{0}", does not ' - 'exist at path:\n {1}'.format(file_name, file_path)) + 'exist in dir:\n {1}'.format(file_name, root_dir)) fatal_error(msg) submodules_description = None @@ -250,9 +254,21 @@ def read_gitmodules_file(root_dir, file_name): ExternalsDescription.REPO_URL, url) externals_description.set(sec_name, ExternalsDescription.REQUIRED, 'True') - git_hash = submods[sec_name]['hash'] - externals_description.set(sec_name, - ExternalsDescription.HASH, git_hash) + if sec_name in submods: + submod_name = sec_name + else: + # The section name does not have to match the path + submod_name = path + + if submod_name in submods: + git_hash = submods[submod_name]['hash'] + externals_description.set(sec_name, + ExternalsDescription.HASH, + git_hash) + else: + emsg = "submodule status has no section, '{}'" + emsg += "\nCheck section names in externals config file" + fatal_error(emsg.format(submod_name)) # Required items externals_description.add_section(DESCRIPTION_SECTION) @@ -261,18 +277,22 @@ def read_gitmodules_file(root_dir, file_name): return externals_description def create_externals_description( - model_data, model_format='cfg', components=None, parent_repo=None): + model_data, model_format='cfg', components=None, exclude=None, parent_repo=None): """Create the a externals description object from the provided data + + components: list of component names to include, None to include all. If a + name isn't found, it is silently omitted from the return value. + exclude: list of component names to skip. """ externals_description = None if model_format == 'dict': externals_description = ExternalsDescriptionDict( - model_data, components=components) + model_data, components=components, exclude=exclude) elif model_format == 'cfg': major, _, _ = get_cfg_schema_version(model_data) if major == 1: externals_description = ExternalsDescriptionConfigV1( - model_data, components=components, parent_repo=parent_repo) + model_data, components=components, exclude=exclude, parent_repo=parent_repo) else: msg = ('Externals description file has unsupported schema ' 'version "{0}".'.format(major)) @@ -339,8 +359,9 @@ class ExternalsDescription(dict): input value. """ - # keywords defining the interface into the externals description data - EXTERNALS = 'externals' + # keywords defining the interface into the externals description data; these + # are brought together by the schema below. + EXTERNALS = 'externals' # path to externals file. BRANCH = 'branch' SUBMODULE = 'from_submodule' HASH = 'hash' @@ -366,6 +387,8 @@ class ExternalsDescription(dict): _V1_BRANCH = 'BRANCH' _V1_REQ_SOURCE = 'REQ_SOURCE' + # Dictionary keys are component names. The corresponding values are laid out + # according to this schema. _source_schema = {REQUIRED: True, PATH: 'string', EXTERNALS: 'string', @@ -614,8 +637,11 @@ def _repo_config_from_submodule(self, field, submod_desc): ' Parent repo, "{1}" does not have submodules') fatal_error(msg.format(field, self._parent_repo.name())) - submod_file = read_gitmodules_file(repo_path, submod_file) - submod_desc = create_externals_description(submod_file) + printlog( + 'Processing submodules description file : {0} ({1})'.format( + submod_file, repo_path)) + submod_model_data= _read_gitmodules_file(repo_path, submod_file) + submod_desc = create_externals_description(submod_model_data) # Can we find our external? repo_url = None @@ -707,7 +733,7 @@ class ExternalsDescriptionDict(ExternalsDescription): """ - def __init__(self, model_data, components=None): + def __init__(self, model_data, components=None, exclude=None): """Parse a native dictionary into a externals description. """ ExternalsDescription.__init__(self) @@ -719,10 +745,15 @@ def __init__(self, model_data, components=None): self._input_patch = 0 self._verify_schema_version() if components: - for key in model_data.items(): + for key in list(model_data.keys()): if key not in components: del model_data[key] + if exclude: + for key in list(model_data.keys()): + if key in exclude: + del model_data[key] + self.update(model_data) self._check_user_input() @@ -733,10 +764,12 @@ class ExternalsDescriptionConfigV1(ExternalsDescription): """ - def __init__(self, model_data, components=None, parent_repo=None): + def __init__(self, model_data, components=None, exclude=None, parent_repo=None): """Convert the config data into a standardized dict that can be used to construct the source objects + components: list of component names to include, None to include all. + exclude: list of component names to skip. """ ExternalsDescription.__init__(self, parent_repo=parent_repo) self._schema_major = 1 @@ -746,7 +779,7 @@ def __init__(self, model_data, components=None, parent_repo=None): get_cfg_schema_version(model_data) self._verify_schema_version() self._remove_metadata(model_data) - self._parse_cfg(model_data, components=components) + self._parse_cfg(model_data, components=components, exclude=exclude) self._check_user_input() @staticmethod @@ -758,8 +791,11 @@ def _remove_metadata(model_data): """ model_data.remove_section(DESCRIPTION_SECTION) - def _parse_cfg(self, cfg_data, components=None): + def _parse_cfg(self, cfg_data, components=None, exclude=None): """Parse a config_parser object into a externals description. + + components: list of component names to include, None to include all. + exclude: list of component names to skip. """ def list_to_dict(input_list, convert_to_lower_case=True): """Convert a list of key-value pairs into a dictionary. @@ -775,7 +811,7 @@ def list_to_dict(input_list, convert_to_lower_case=True): for section in cfg_data.sections(): name = config_string_cleaner(section.lower().strip()) - if components and name not in components: + if (components and name not in components) or (exclude and name in exclude): continue self[name] = {} self[name].update(list_to_dict(cfg_data.items(section))) diff --git a/manage_externals/manic/externals_status.py b/manage_externals/manic/externals_status.py index d3d238f289..6bc29e9732 100644 --- a/manage_externals/manic/externals_status.py +++ b/manage_externals/manic/externals_status.py @@ -29,16 +29,16 @@ class ExternalStatus(object): transactions (e.g. add, remove, rename, untracked files). """ - DEFAULT = '-' + # sync_state and clean_state can be one of the following: + DEFAULT = '-' # not set yet (sync_state). clean_state can be this if sync_state is EMPTY. UNKNOWN = '?' EMPTY = 'e' - MODEL_MODIFIED = 's' # a.k.a. out-of-sync - DIRTY = 'M' - - STATUS_OK = ' ' + MODEL_MODIFIED = 's' # repo version != externals (sync_state only) + DIRTY = 'M' # repo is dirty (clean_state only) + STATUS_OK = ' ' # repo is clean (clean_state) or matches externals version (sync_state) STATUS_ERROR = '!' - # source types + # source_type can be one of the following: OPTIONAL = 'o' STANDALONE = 's' MANAGED = ' ' @@ -55,19 +55,21 @@ def __init__(self): def log_status_message(self, verbosity): """Write status message to the screen and log file """ - self._default_status_message() + printlog(self._default_status_message()) if verbosity >= VERBOSITY_VERBOSE: - self._verbose_status_message() + printlog(self._verbose_status_message()) if verbosity >= VERBOSITY_DUMP: - self._dump_status_message() + printlog(self._dump_status_message()) + + def __repr__(self): + return self._default_status_message() def _default_status_message(self): """Return the default terse status message string """ - msg = '{sync}{clean}{src_type} {path}'.format( + return '{sync}{clean}{src_type} {path}'.format( sync=self.sync_state, clean=self.clean_state, src_type=self.source_type, path=self.path) - printlog(msg) def _verbose_status_message(self): """Return the verbose status message string @@ -82,14 +84,12 @@ def _verbose_status_message(self): if self.sync_state != self.STATUS_OK: sync_str = '{current} --> {expected}'.format( current=self.current_version, expected=self.expected_version) - msg = ' {clean}, {sync}'.format(clean=clean_str, sync=sync_str) - printlog(msg) + return ' {clean}, {sync}'.format(clean=clean_str, sync=sync_str) def _dump_status_message(self): """Return the dump status message string """ - msg = indent_string(self.status_output, 12) - printlog(msg) + return indent_string(self.status_output, 12) def safe_to_update(self): """Report if it is safe to update a repository. Safe is defined as: diff --git a/manage_externals/manic/repository_factory.py b/manage_externals/manic/repository_factory.py index 80a92a9d8a..18c73ffc4b 100644 --- a/manage_externals/manic/repository_factory.py +++ b/manage_externals/manic/repository_factory.py @@ -15,6 +15,7 @@ def create_repository(component_name, repo_info, svn_ignore_ancestry=False): """Determine what type of repository we have, i.e. git or svn, and create the appropriate object. + Can return None (e.g. if protocol is 'externals_only'). """ protocol = repo_info[ExternalsDescription.PROTOCOL].lower() if protocol == 'git': diff --git a/manage_externals/manic/repository_git.py b/manage_externals/manic/repository_git.py index f986051001..adc666cc57 100644 --- a/manage_externals/manic/repository_git.py +++ b/manage_externals/manic/repository_git.py @@ -25,7 +25,7 @@ class GitRepository(Repository): * be isolated in separate functions with no application logic * of the form: - - cmd = ['git', ...] + - cmd = 'git -C {dirname} ...'.format(dirname=dirname).split() - value = execute_subprocess(cmd, output_to_caller={T|F}, status_to_caller={T|F}) - return value @@ -39,7 +39,7 @@ class GitRepository(Repository): def __init__(self, component_name, repo): """ - Parse repo (a XML element). + repo: ExternalsDescription. """ Repository.__init__(self, component_name, repo) self._gitmodules = None @@ -99,45 +99,42 @@ def submodules_file(self, repo_path=None): # # ---------------------------------------------------------------- def _clone_repo(self, base_dir_path, repo_dir_name, verbosity): - """Prepare to execute the clone by managing directory location + """Clones repo_dir_name into base_dir_path. """ - cwd = os.getcwd() - os.chdir(base_dir_path) - self._git_clone(self._url, repo_dir_name, verbosity) - os.chdir(cwd) + self._git_clone(self._url, os.path.join(base_dir_path, repo_dir_name), + verbosity=verbosity) - def _current_ref(self): - """Determine the *name* associated with HEAD. + def _current_ref(self, dirname): + """Determine the *name* associated with HEAD at dirname. - If we're on a branch, then returns the branch name; otherwise, - if we're on a tag, then returns the tag name; otherwise, returns + If we're on a tag, then returns the tag name; otherwise, returns the current hash. Returns an empty string if no reference can be determined (e.g., if we're not actually in a git repository). + + If we're on a branch, then the branch name is also included in + the returned string (in addition to the tag / hash). """ ref_found = False - # If we're on a branch, then use that as the current ref - branch_found, branch_name = self._git_current_branch() - if branch_found: - current_ref = branch_name + # If we're exactly at a tag, use that as the current ref + tag_found, tag_name = self._git_current_tag(dirname) + if tag_found: + current_ref = tag_name ref_found = True - if not ref_found: - # Otherwise, if we're exactly at a tag, use that as the - # current ref - tag_found, tag_name = self._git_current_tag() - if tag_found: - current_ref = tag_name - ref_found = True - if not ref_found: # Otherwise, use current hash as the current ref - hash_found, hash_name = self._git_current_hash() + hash_found, hash_name = self._git_current_hash(dirname) if hash_found: current_ref = hash_name ref_found = True - if not ref_found: + if ref_found: + # If we're on a branch, include branch name in current ref + branch_found, branch_name = self._git_current_branch(dirname) + if branch_found: + current_ref = "{} (branch {})".format(current_ref, branch_name) + else: # If we still can't find a ref, return empty string. This # can happen if we're not actually in a git repo current_ref = '' @@ -185,17 +182,15 @@ def compare_refs(current_ref, expected_ref): status = ExternalStatus.MODEL_MODIFIED return status - cwd = os.getcwd() - os.chdir(repo_dir_path) - # get the full hash of the current commit - _, current_ref = self._git_current_hash() + _, current_ref = self._git_current_hash(repo_dir_path) if self._branch: if self._url == LOCAL_PATH_INDICATOR: expected_ref = self._branch else: - remote_name = self._determine_remote_name() + remote_name = self._remote_name_for_url(self._url, + repo_dir_path) if not remote_name: # git doesn't know about this remote. by definition # this is a modified state. @@ -212,7 +207,7 @@ def compare_refs(current_ref, expected_ref): fatal_error(msg) # record the *names* of the current and expected branches - stat.current_version = self._current_ref() + stat.current_version = self._current_ref(repo_dir_path) stat.expected_version = copy.deepcopy(expected_ref) if current_ref == EMPTY_STR: @@ -220,7 +215,7 @@ def compare_refs(current_ref, expected_ref): else: # get the underlying hash of the expected ref revparse_status, expected_ref_hash = self._git_revparse_commit( - expected_ref) + expected_ref, repo_dir_path) if revparse_status: # We failed to get the hash associated with # expected_ref. Maybe we should assign this to some special @@ -231,18 +226,13 @@ def compare_refs(current_ref, expected_ref): # compare the underlying hashes stat.sync_state = compare_refs(current_ref, expected_ref_hash) - os.chdir(cwd) - - def _determine_remote_name(self): - """Return the remote name. - - Note that this is for the *future* repo url and branch, not - the current working copy! + @classmethod + def _remote_name_for_url(cls, remote_url, dirname): + """Return the remote name matching remote_url (or None) """ - git_output = self._git_remote_verbose() + git_output = cls._git_remote_verbose(dirname) git_output = git_output.splitlines() - remote_name = '' for line in git_output: data = line.strip() if not data: @@ -250,10 +240,9 @@ def _determine_remote_name(self): data = data.split() name = data[0].strip() url = data[1].strip() - if self._url == url: - remote_name = name - break - return remote_name + if remote_url == url: + return name + return None def _create_remote_name(self): """The url specified in the externals description file was not known @@ -309,19 +298,16 @@ def _checkout_ref(self, repo_dir, verbosity, submodules): the repo's submodules """ # import pdb; pdb.set_trace() - cwd = os.getcwd() - os.chdir(repo_dir) if self._url.strip() == LOCAL_PATH_INDICATOR: - self._checkout_local_ref(verbosity, submodules) + self._checkout_local_ref(verbosity, submodules, repo_dir) else: - self._checkout_external_ref(verbosity, submodules) + self._checkout_external_ref(verbosity, submodules, repo_dir) if self._sparse: self._sparse_checkout(repo_dir, verbosity) - os.chdir(cwd) - def _checkout_local_ref(self, verbosity, submodules): + def _checkout_local_ref(self, verbosity, submodules, dirname): """Checkout the reference considering the local repo only. Do not fetch any additional remotes or specify the remote when checkout out the ref. @@ -335,13 +321,18 @@ def _checkout_local_ref(self, verbosity, submodules): else: ref = self._hash - self._check_for_valid_ref(ref) - self._git_checkout_ref(ref, verbosity, submodules) + self._check_for_valid_ref(ref, remote_name=None, + dirname=dirname) + self._git_checkout_ref(ref, verbosity, submodules, dirname) - def _checkout_external_ref(self, verbosity, submodules): - """Checkout the reference from a remote repository + def _checkout_external_ref(self, verbosity, submodules, dirname): + """Checkout the reference from a remote repository into dirname. if is True, recursively initialize and update - the repo's submodules + the repo's submodules. + Note that this results in a 'detached HEAD' state if checking out + a branch, because we check out the remote branch rather than the + local. See https://github.com/ESMCI/manage_externals/issues/34 for + more discussion. """ if self._tag: ref = self._tag @@ -350,44 +341,45 @@ def _checkout_external_ref(self, verbosity, submodules): else: ref = self._hash - remote_name = self._determine_remote_name() + remote_name = self._remote_name_for_url(self._url, dirname) if not remote_name: remote_name = self._create_remote_name() - self._git_remote_add(remote_name, self._url) - self._git_fetch(remote_name) + self._git_remote_add(remote_name, self._url, dirname) + self._git_fetch(remote_name, dirname) # NOTE(bja, 2018-03) we need to send separate ref and remote # name to check_for_vaild_ref, but the combined name to # checkout_ref! - self._check_for_valid_ref(ref, remote_name) + self._check_for_valid_ref(ref, remote_name, dirname) if self._branch: + # Prepend remote name to branch. This means we avoid various + # special cases if the local branch is not tracking the remote or + # cannot be trivially fast-forwarded to match; but, it also + # means we end up in a 'detached HEAD' state. ref = '{0}/{1}'.format(remote_name, ref) - self._git_checkout_ref(ref, verbosity, submodules) + self._git_checkout_ref(ref, verbosity, submodules, dirname) def _sparse_checkout(self, repo_dir, verbosity): """Use git read-tree to thin the working tree.""" - cwd = os.getcwd() - - cmd = ['cp', self._sparse, os.path.join(repo_dir, - '.git/info/sparse-checkout')] + cmd = ['cp', os.path.join(repo_dir, self._sparse), + os.path.join(repo_dir, + '.git/info/sparse-checkout')] if verbosity >= VERBOSITY_VERBOSE: printlog(' {0}'.format(' '.join(cmd))) execute_subprocess(cmd) - os.chdir(repo_dir) - self._git_sparse_checkout(verbosity) - - os.chdir(cwd) + self._git_sparse_checkout(verbosity, repo_dir) - def _check_for_valid_ref(self, ref, remote_name=None): + def _check_for_valid_ref(self, ref, remote_name, dirname): """Try some basic sanity checks on the user supplied reference so we can provide a more useful error message than calledprocess error... + remote_name can be NOne """ - is_tag = self._ref_is_tag(ref) - is_branch = self._ref_is_branch(ref, remote_name) - is_hash = self._ref_is_hash(ref) + is_tag = self._ref_is_tag(ref, dirname) + is_branch = self._ref_is_branch(ref, remote_name, dirname) + is_hash = self._ref_is_hash(ref, dirname) is_valid = is_tag or is_branch or is_hash if not is_valid: @@ -398,7 +390,8 @@ def _check_for_valid_ref(self, ref, remote_name=None): fatal_error(msg) if is_tag: - is_unique_tag, msg = self._is_unique_tag(ref, remote_name) + is_unique_tag, msg = self._is_unique_tag(ref, remote_name, + dirname) if not is_unique_tag: msg = ('In repo "{0}": tag "{1}" {2}'.format( self._name, self._tag, msg)) @@ -406,7 +399,7 @@ def _check_for_valid_ref(self, ref, remote_name=None): return is_valid - def _is_unique_tag(self, ref, remote_name): + def _is_unique_tag(self, ref, remote_name, dirname): """Verify that a reference is a valid tag and is unique (not a branch) Tags may be tag names, or SHA id's. It is also possible that a @@ -417,9 +410,9 @@ def _is_unique_tag(self, ref, remote_name): error! """ - is_tag = self._ref_is_tag(ref) - is_branch = self._ref_is_branch(ref, remote_name) - is_hash = self._ref_is_hash(ref) + is_tag = self._ref_is_tag(ref, dirname) + is_branch = self._ref_is_branch(ref, remote_name, dirname) + is_hash = self._ref_is_hash(ref, dirname) msg = '' is_unique_tag = False @@ -450,7 +443,7 @@ def _is_unique_tag(self, ref, remote_name): return is_unique_tag, msg - def _ref_is_tag(self, ref): + def _ref_is_tag(self, ref, dirname): """Verify that a reference is a valid tag according to git. Note: values returned by git_showref_* and git_revparse are @@ -458,28 +451,30 @@ def _ref_is_tag(self, ref): error! """ is_tag = False - value = self._git_showref_tag(ref) + value = self._git_showref_tag(ref, dirname) if value == 0: is_tag = True return is_tag - def _ref_is_branch(self, ref, remote_name=None): + def _ref_is_branch(self, ref, remote_name, dirname): """Verify if a ref is any kind of branch (local, tracked remote, untracked remote). + remote_name can be None. """ local_branch = False remote_branch = False if remote_name: - remote_branch = self._ref_is_remote_branch(ref, remote_name) - local_branch = self._ref_is_local_branch(ref) + remote_branch = self._ref_is_remote_branch(ref, remote_name, + dirname) + local_branch = self._ref_is_local_branch(ref, dirname) is_branch = False if local_branch or remote_branch: is_branch = True return is_branch - def _ref_is_local_branch(self, ref): + def _ref_is_local_branch(self, ref, dirname): """Verify that a reference is a valid branch according to git. show-ref branch returns local branches that have been @@ -492,12 +487,12 @@ def _ref_is_local_branch(self, ref): """ is_branch = False - value = self._git_showref_branch(ref) + value = self._git_showref_branch(ref, dirname) if value == 0: is_branch = True return is_branch - def _ref_is_remote_branch(self, ref, remote_name): + def _ref_is_remote_branch(self, ref, remote_name, dirname): """Verify that a reference is a valid branch according to git. show-ref branch returns local branches that have been @@ -510,12 +505,12 @@ def _ref_is_remote_branch(self, ref, remote_name): """ is_branch = False - value = self._git_lsremote_branch(ref, remote_name) + value = self._git_lsremote_branch(ref, remote_name, dirname) if value == 0: is_branch = True return is_branch - def _ref_is_commit(self, ref): + def _ref_is_commit(self, ref, dirname): """Verify that a reference is a valid commit according to git. This could be a tag, branch, sha1 id, HEAD and potentially others... @@ -525,12 +520,12 @@ def _ref_is_commit(self, ref): error! """ is_commit = False - value, _ = self._git_revparse_commit(ref) + value, _ = self._git_revparse_commit(ref, dirname) if value == 0: is_commit = True return is_commit - def _ref_is_hash(self, ref): + def _ref_is_hash(self, ref, dirname): """Verify that a reference is a valid hash according to git. Git doesn't seem to provide an exact way to determine if user @@ -545,7 +540,7 @@ def _ref_is_hash(self, ref): """ is_hash = False - status, git_output = self._git_revparse_commit(ref) + status, git_output = self._git_revparse_commit(ref, dirname) if status == 0: if git_output.strip().startswith(ref): is_hash = True @@ -555,9 +550,7 @@ def _status_summary(self, stat, repo_dir_path): """Determine the clean/dirty status of a git repository """ - cwd = os.getcwd() - os.chdir(repo_dir_path) - git_output = self._git_status_porcelain_v1z() + git_output = self._git_status_porcelain_v1z(repo_dir_path) is_dirty = self._status_v1z_is_dirty(git_output) if is_dirty: stat.clean_state = ExternalStatus.DIRTY @@ -566,8 +559,7 @@ def _status_summary(self, stat, repo_dir_path): # Now save the verbose status output incase the user wants to # see it. - stat.status_output = self._git_status_verbose() - os.chdir(cwd) + stat.status_output = self._git_status_verbose(repo_dir_path) @staticmethod def _status_v1z_is_dirty(git_output): @@ -602,7 +594,7 @@ def _status_v1z_is_dirty(git_output): # # ---------------------------------------------------------------- @staticmethod - def _git_current_hash(): + def _git_current_hash(dirname): """Return the full hash of the currently checked-out version. Returns a tuple, (hash_found, hash), where hash_found is a @@ -610,21 +602,51 @@ def _git_current_hash(): could mean we're not in a git repository at all). (If hash_found is False, then hash is ''.) """ - status, git_output = GitRepository._git_revparse_commit("HEAD") + status, git_output = GitRepository._git_revparse_commit("HEAD", + dirname) hash_found = not status if not hash_found: git_output = '' return hash_found, git_output @staticmethod - def _git_current_branch(): - """Determines the name of the current branch. + def _git_current_remote_branch(dirname): + """Determines the name of the current remote branch, if any. + + if dir is None, uses the cwd. + + Returns a tuple, (branch_found, branch_name), where branch_found + is a bool specifying whether a branch name was found for + HEAD. (If branch_found is False, then branch_name is ''). + branch_name is in the format '$remote/$branch', e.g. 'origin/foo'. + """ + branch_found = False + branch_name = '' + + cmd = 'git -C {dirname} log -n 1 --pretty=%d HEAD'.format( + dirname=dirname).split() + status, git_output = execute_subprocess(cmd, + output_to_caller=True, + status_to_caller=True) + branch_found = 'HEAD,' in git_output + if branch_found: + # git_output is of the form " (HEAD, origin/blah)" + branch_name = git_output.split(',')[1].strip()[:-1] + return branch_found, branch_name + + @staticmethod + def _git_current_branch(dirname): + """Determines the name of the current local branch. Returns a tuple, (branch_found, branch_name), where branch_found - is a logical specifying whether a branch name was found for + is a bool specifying whether a branch name was found for HEAD. (If branch_found is False, then branch_name is ''.) + Note that currently we check out the remote branch rather than + the local, so this command does not return the just-checked-out + branch. See _git_current_remote_branch. """ - cmd = ['git', 'symbolic-ref', '--short', '-q', 'HEAD'] + cmd = 'git -C {dirname} symbolic-ref --short -q HEAD'.format( + dirname=dirname).split() status, git_output = execute_subprocess(cmd, output_to_caller=True, status_to_caller=True) @@ -636,15 +658,17 @@ def _git_current_branch(): return branch_found, git_output @staticmethod - def _git_current_tag(): + def _git_current_tag(dirname): """Determines the name tag corresponding to HEAD (if any). + if dirname is None, uses the cwd. + Returns a tuple, (tag_found, tag_name), where tag_found is a - logical specifying whether we found a tag name corresponding to + bool specifying whether we found a tag name corresponding to HEAD. (If tag_found is False, then tag_name is ''.) """ - # git describe --exact-match --tags HEAD - cmd = ['git', 'describe', '--exact-match', '--tags', 'HEAD'] + cmd = 'git -C {dirname} describe --exact-match --tags HEAD'.format( + dirname=dirname).split() status, git_output = execute_subprocess(cmd, output_to_caller=True, status_to_caller=True) @@ -656,53 +680,54 @@ def _git_current_tag(): return tag_found, git_output @staticmethod - def _git_showref_tag(ref): + def _git_showref_tag(ref, dirname): """Run git show-ref check if the user supplied ref is a tag. could also use git rev-parse --quiet --verify tagname^{tag} """ - cmd = ['git', 'show-ref', '--quiet', '--verify', - 'refs/tags/{0}'.format(ref), ] + cmd = ('git -C {dirname} show-ref --quiet --verify refs/tags/{ref}' + .format(dirname=dirname, ref=ref).split()) status = execute_subprocess(cmd, status_to_caller=True) return status @staticmethod - def _git_showref_branch(ref): + def _git_showref_branch(ref, dirname): """Run git show-ref check if the user supplied ref is a local or tracked remote branch. """ - cmd = ['git', 'show-ref', '--quiet', '--verify', - 'refs/heads/{0}'.format(ref), ] + cmd = ('git -C {dirname} show-ref --quiet --verify refs/heads/{ref}' + .format(dirname=dirname, ref=ref).split()) status = execute_subprocess(cmd, status_to_caller=True) return status @staticmethod - def _git_lsremote_branch(ref, remote_name): + def _git_lsremote_branch(ref, remote_name, dirname): """Run git ls-remote to check if the user supplied ref is a remote branch that is not being tracked """ - cmd = ['git', 'ls-remote', '--exit-code', '--heads', - remote_name, ref, ] + cmd = ('git -C {dirname} ls-remote --exit-code --heads ' + '{remote_name} {ref}').format( + dirname=dirname, remote_name=remote_name, ref=ref).split() status = execute_subprocess(cmd, status_to_caller=True) return status @staticmethod - def _git_revparse_commit(ref): + def _git_revparse_commit(ref, dirname): """Run git rev-parse to detect if a reference is a SHA, HEAD or other valid commit. """ - cmd = ['git', 'rev-parse', '--quiet', '--verify', - '{0}^{1}'.format(ref, '{commit}'), ] + cmd = ('git -C {dirname} rev-parse --quiet --verify {ref}^{commit}' + .format(dirname=dirname, ref=ref, commit='{commit}').split()) status, git_output = execute_subprocess(cmd, status_to_caller=True, output_to_caller=True) git_output = git_output.strip() return status, git_output @staticmethod - def _git_status_porcelain_v1z(): + def _git_status_porcelain_v1z(dirname): """Run git status to obtain repository information. This is run with '--untracked=no' to ignore untracked files. @@ -711,36 +736,38 @@ def _git_status_porcelain_v1z(): between git versions or *user configuration*. """ - cmd = ['git', 'status', '--untracked-files=no', '--porcelain', '-z'] + cmd = ('git -C {dirname} status --untracked-files=no --porcelain -z' + .format(dirname=dirname)).split() git_output = execute_subprocess(cmd, output_to_caller=True) return git_output @staticmethod - def _git_status_verbose(): + def _git_status_verbose(dirname): """Run the git status command to obtain repository information. """ - cmd = ['git', 'status'] + cmd = 'git -C {dirname} status'.format(dirname=dirname).split() git_output = execute_subprocess(cmd, output_to_caller=True) return git_output @staticmethod - def _git_remote_verbose(): + def _git_remote_verbose(dirname): """Run the git remote command to obtain repository information. + + Returned string is of the form: + myfork git@github.com:johnpaulalex/manage_externals_jp.git (fetch) + myfork git@github.com:johnpaulalex/manage_externals_jp.git (push) """ - cmd = ['git', 'remote', '--verbose'] - git_output = execute_subprocess(cmd, output_to_caller=True) - return git_output + cmd = 'git -C {dirname} remote --verbose'.format( + dirname=dirname).split() + return execute_subprocess(cmd, output_to_caller=True) @staticmethod - def has_submodules(repo_dir_path=None): - """Return True iff the repository at (or the current - directory if is None) has a '.gitmodules' file + def has_submodules(repo_dir_path): + """Return True iff the repository at has a + '.gitmodules' file """ - if repo_dir_path is None: - fname = ExternalsDescription.GIT_SUBMODULES_FILENAME - else: - fname = os.path.join(repo_dir_path, - ExternalsDescription.GIT_SUBMODULES_FILENAME) + fname = os.path.join(repo_dir_path, + ExternalsDescription.GIT_SUBMODULES_FILENAME) return os.path.exists(fname) @@ -751,68 +778,71 @@ def has_submodules(repo_dir_path=None): # ---------------------------------------------------------------- @staticmethod def _git_clone(url, repo_dir_name, verbosity): - """Run git clone for the side effect of creating a repository. + """Clones url into repo_dir_name. """ - cmd = ['git', 'clone', '--quiet'] - subcmd = None - - cmd.extend([url, repo_dir_name]) + cmd = 'git clone --quiet {url} {repo_dir_name}'.format( + url=url, repo_dir_name=repo_dir_name).split() if verbosity >= VERBOSITY_VERBOSE: printlog(' {0}'.format(' '.join(cmd))) execute_subprocess(cmd) - if subcmd is not None: - os.chdir(repo_dir_name) - execute_subprocess(subcmd) @staticmethod - def _git_remote_add(name, url): + def _git_remote_add(name, url, dirname): """Run the git remote command for the side effect of adding a remote """ - cmd = ['git', 'remote', 'add', name, url] + cmd = 'git -C {dirname} remote add {name} {url}'.format( + dirname=dirname, name=name, url=url).split() execute_subprocess(cmd) @staticmethod - def _git_fetch(remote_name): + def _git_fetch(remote_name, dirname): """Run the git fetch command for the side effect of updating the repo """ - cmd = ['git', 'fetch', '--quiet', '--tags', remote_name] + cmd = 'git -C {dirname} fetch --quiet --tags {remote_name}'.format( + dirname=dirname, remote_name=remote_name).split() execute_subprocess(cmd) @staticmethod - def _git_checkout_ref(ref, verbosity, submodules): + def _git_checkout_ref(ref, verbosity, submodules, dirname): """Run the git checkout command for the side effect of updating the repo Param: ref is a reference to a local or remote object in the form 'origin/my_feature', or 'tag1'. """ - cmd = ['git', 'checkout', '--quiet', ref] + cmd = 'git -C {dirname} checkout --quiet {ref}'.format( + dirname=dirname, ref=ref).split() if verbosity >= VERBOSITY_VERBOSE: printlog(' {0}'.format(' '.join(cmd))) execute_subprocess(cmd) if submodules: - GitRepository._git_update_submodules(verbosity) + GitRepository._git_update_submodules(verbosity, dirname) @staticmethod - def _git_sparse_checkout(verbosity): + def _git_sparse_checkout(verbosity, dirname): """Configure repo via read-tree.""" - cmd = ['git', 'config', 'core.sparsecheckout', 'true'] + cmd = 'git -C {dirname} config core.sparsecheckout true'.format( + dirname=dirname).split() if verbosity >= VERBOSITY_VERBOSE: printlog(' {0}'.format(' '.join(cmd))) execute_subprocess(cmd) - cmd = ['git', 'read-tree', '-mu', 'HEAD'] + cmd = 'git -C {dirname} read-tree -mu HEAD'.format( + dirname=dirname).split() if verbosity >= VERBOSITY_VERBOSE: printlog(' {0}'.format(' '.join(cmd))) execute_subprocess(cmd) @staticmethod - def _git_update_submodules(verbosity): + def _git_update_submodules(verbosity, dirname): """Run git submodule update for the side effect of updating this repo's submodules. """ # First, verify that we have a .gitmodules file - if os.path.exists(ExternalsDescription.GIT_SUBMODULES_FILENAME): - cmd = ['git', 'submodule', 'update', '--init', '--recursive'] + if os.path.exists( + os.path.join(dirname, + ExternalsDescription.GIT_SUBMODULES_FILENAME)): + cmd = ('git -C {dirname} submodule update --init --recursive' + .format(dirname=dirname)).split() if verbosity >= VERBOSITY_VERBOSE: printlog(' {0}'.format(' '.join(cmd))) diff --git a/manage_externals/manic/repository_svn.py b/manage_externals/manic/repository_svn.py index 408ed84676..922855d34e 100644 --- a/manage_externals/manic/repository_svn.py +++ b/manage_externals/manic/repository_svn.py @@ -43,10 +43,15 @@ def __init__(self, component_name, repo, ignore_ancestry=False): """ Repository.__init__(self, component_name, repo) self._ignore_ancestry = ignore_ancestry + if self._url.endswith('/'): + # there is already a '/' separator in the URL; no need to add another + url_sep = '' + else: + url_sep = '/' if self._branch: - self._url = os.path.join(self._url, self._branch) + self._url = self._url + url_sep + self._branch elif self._tag: - self._url = os.path.join(self._url, self._tag) + self._url = self._url + url_sep + self._tag else: msg = "DEV_ERROR in svn repository. Shouldn't be here!" fatal_error(msg) diff --git a/manage_externals/manic/sourcetree.py b/manage_externals/manic/sourcetree.py index b9c9c21082..cf2a5b7569 100644 --- a/manage_externals/manic/sourcetree.py +++ b/manage_externals/manic/sourcetree.py @@ -1,6 +1,6 @@ """ - -FIXME(bja, 2017-11) External and SourceTree have a circular dependancy! +Classes to represent an externals config file (SourceTree) and the components +within it (_External). """ import errno @@ -19,62 +19,54 @@ class _External(object): """ - _External represents an external object inside a SourceTree - """ + A single component hosted in an external repository (and any children). + The component may or may not be checked-out upon construction. + """ # pylint: disable=R0902 - def __init__(self, root_dir, name, ext_description, svn_ignore_ancestry): - """Parse an external description file into a dictionary of externals. + def __init__(self, root_dir, name, local_path, required, subexternals_path, + repo, svn_ignore_ancestry, subexternal_sourcetree): + """Create a single external component (checked out or not). Input: + root_dir : string - the (checked-out) parent repo's root dir. + local_path : string - this external's (checked-out) subdir relative + to root_dir, e.g. "components/mom" + repo: Repository - the repo object for this external. Can be None (e.g. if this external just refers to another external file). - root_dir : string - the root directory path where - 'local_path' is relative to. - - name : string - name of the ext_description object. may or may not - correspond to something in the path. + name : string - name of this external (as named by the parent + reference). May or may not correspond to something in the path. ext_description : dict - source ExternalsDescription object svn_ignore_ancestry : bool - use --ignore-externals with svn switch + subexternals_path: string - path to sub-externals config file, if any. Relative to local_path, or special value 'none'. + subexternal_sourcetree: SourceTree - corresponding to subexternals_path, if subexternals_path exists (it might not, if it is not checked out yet). """ self._name = name - self._repo = None - self._externals = EMPTY_STR - self._externals_sourcetree = None - self._stat = ExternalStatus() - self._sparse = None - # Parse the sub-elements - - # _path : local path relative to the containing source tree - self._local_path = ext_description[ExternalsDescription.PATH] - # _repo_dir : full repository directory - repo_dir = os.path.join(root_dir, self._local_path) + self._required = required + + self._stat = None # Populated in status() + + self._local_path = local_path + # _repo_dir_path : full repository directory, e.g. + # "/components/mom" + repo_dir = os.path.join(root_dir, local_path) self._repo_dir_path = os.path.abspath(repo_dir) - # _base_dir : base directory *containing* the repository + # _base_dir_path : base directory *containing* the repository, e.g. + # "/components" self._base_dir_path = os.path.dirname(self._repo_dir_path) - # repo_dir_name : base_dir_path + repo_dir_name = rep_dir_path + # _repo_dir_name : base_dir_path + repo_dir_name = repo_dir_path + # e.g., "mom" self._repo_dir_name = os.path.basename(self._repo_dir_path) - assert(os.path.join(self._base_dir_path, self._repo_dir_name) - == self._repo_dir_path) + self._repo = repo - self._required = ext_description[ExternalsDescription.REQUIRED] - self._externals = ext_description[ExternalsDescription.EXTERNALS] - # Treat a .gitmodules file as a backup externals config - if not self._externals: - if GitRepository.has_submodules(self._repo_dir_path): - self._externals = ExternalsDescription.GIT_SUBMODULES_FILENAME - - repo = create_repository( - name, ext_description[ExternalsDescription.REPO], - svn_ignore_ancestry=svn_ignore_ancestry) - if repo: - self._repo = repo - - if self._externals and (self._externals.lower() != 'none'): - self._create_externals_sourcetree() + # Does this component have subcomponents aka an externals config? + self._subexternals_path = subexternals_path + self._subexternal_sourcetree = subexternal_sourcetree + def get_name(self): """ @@ -88,81 +80,97 @@ def get_local_path(self): """ return self._local_path - def status(self): - """ - If the repo destination directory exists, ensure it is correct (from - correct URL, correct branch or tag), and possibly update the external. - If the repo destination directory does not exist, checkout the correce - branch or tag. - If load_all is True, also load all of the the externals sub-externals. + def get_repo_dir_path(self): + return self._repo_dir_path + + def get_subexternals_path(self): + return self._subexternals_path + + def get_repo(self): + return self._repo + + def status(self, force=False, print_progress=False): """ + Returns status of this component and all subcomponents. - self._stat.path = self.get_local_path() - if not self._required: - self._stat.source_type = ExternalStatus.OPTIONAL - elif self._local_path == LOCAL_PATH_INDICATOR: - # LOCAL_PATH_INDICATOR, '.' paths, are standalone - # component directories that are not managed by - # checkout_externals. - self._stat.source_type = ExternalStatus.STANDALONE - else: - # managed by checkout_externals - self._stat.source_type = ExternalStatus.MANAGED + Returns a dict mapping our local path (not component name!) to an + ExternalStatus dict. Any subcomponents will have their own top-level + path keys. Note the return value includes entries for this and all + subcomponents regardless of whether they are locally installed or not. - ext_stats = {} + Side-effect: If self._stat is empty or force is True, calculates _stat. + """ + calc_stat = force or not self._stat + + if calc_stat: + self._stat = ExternalStatus() + self._stat.path = self.get_local_path() + if not self._required: + self._stat.source_type = ExternalStatus.OPTIONAL + elif self._local_path == LOCAL_PATH_INDICATOR: + # LOCAL_PATH_INDICATOR, '.' paths, are standalone + # component directories that are not managed by + # checkout_subexternals. + self._stat.source_type = ExternalStatus.STANDALONE + else: + # managed by checkout_subexternals + self._stat.source_type = ExternalStatus.MANAGED + subcomponent_stats = {} if not os.path.exists(self._repo_dir_path): - self._stat.sync_state = ExternalStatus.EMPTY - msg = ('status check: repository directory for "{0}" does not ' - 'exist.'.format(self._name)) - logging.info(msg) - self._stat.current_version = 'not checked out' - # NOTE(bja, 2018-01) directory doesn't exist, so we cannot - # use repo to determine the expected version. We just take - # a best-guess based on the assumption that only tag or - # branch should be set, but not both. - if not self._repo: - self._stat.expected_version = 'unknown' - else: - self._stat.expected_version = self._repo.tag() + self._repo.branch() + if calc_stat: + # No local repository. + self._stat.sync_state = ExternalStatus.EMPTY + msg = ('status check: repository directory for "{0}" does not ' + 'exist.'.format(self._name)) + logging.info(msg) + self._stat.current_version = 'not checked out' + # NOTE(bja, 2018-01) directory doesn't exist, so we cannot + # use repo to determine the expected version. We just take + # a best-guess based on the assumption that only tag or + # branch should be set, but not both. + if not self._repo: + self._stat.expected_version = 'unknown' + else: + self._stat.expected_version = self._repo.tag() + self._repo.branch() else: - if self._repo: + # Merge local repository state (e.g. clean/dirty) into self._stat. + if calc_stat and self._repo: self._repo.status(self._stat, self._repo_dir_path) - if self._externals and self._externals_sourcetree: - # we expect externals and they exist + # Status of subcomponents, if any. + if self._subexternals_path and self._subexternal_sourcetree: cwd = os.getcwd() - # SourceTree expects to be called from the correct + # SourceTree.status() expects to be called from the correct # root directory. os.chdir(self._repo_dir_path) - ext_stats = self._externals_sourcetree.status(self._local_path) + subcomponent_stats = self._subexternal_sourcetree.status(self._local_path, force=force, print_progress=print_progress) os.chdir(cwd) + # Merge our status + subcomponent statuses into one return dict keyed + # by component path. all_stats = {} # don't add the root component because we don't manage it # and can't provide useful info about it. if self._local_path != LOCAL_PATH_INDICATOR: - # store the stats under tha local_path, not comp name so + # store the stats under the local_path, not comp name so # it will be sorted correctly all_stats[self._stat.path] = self._stat - if ext_stats: - all_stats.update(ext_stats) + if subcomponent_stats: + all_stats.update(subcomponent_stats) return all_stats - def checkout(self, verbosity, load_all): + def checkout(self, verbosity): """ If the repo destination directory exists, ensure it is correct (from - correct URL, correct branch or tag), and possibly update the external. + correct URL, correct branch or tag), and possibly updateit. If the repo destination directory does not exist, checkout the correct branch or tag. - If load_all is True, also load all of the the externals sub-externals. + Does not check out sub-externals, see SourceTree.checkout(). """ - if load_all: - pass # Make sure we are in correct location - if not os.path.exists(self._repo_dir_path): # repository directory doesn't exist. Need to check it # out, and for that we need the base_dir_path to exist @@ -174,6 +182,10 @@ def checkout(self, verbosity, load_all): self._base_dir_path) fatal_error(msg) + if not self._stat: + self.status() + assert self._stat + if self._stat.source_type != ExternalStatus.STANDALONE: if verbosity >= VERBOSITY_VERBOSE: # NOTE(bja, 2018-01) probably do not want to pass @@ -194,120 +206,147 @@ def checkout(self, verbosity, load_all): self._repo.checkout(self._base_dir_path, self._repo_dir_name, checkout_verbosity, self.clone_recursive()) - def checkout_externals(self, verbosity, load_all): - """Checkout the sub-externals for this object - """ - if self.load_externals(): - if self._externals_sourcetree: - # NOTE(bja, 2018-02): the subtree externals objects - # were created during initial status check. Updating - # the external may have changed which sub-externals - # are needed. We need to delete those objects and - # re-read the potentially modified externals - # description file. - self._externals_sourcetree = None - self._create_externals_sourcetree() - self._externals_sourcetree.checkout(verbosity, load_all) - - def load_externals(self): - 'Return True iff an externals file should be loaded' - load_ex = False - if os.path.exists(self._repo_dir_path): - if self._externals: - if self._externals.lower() != 'none': - load_ex = os.path.exists(os.path.join(self._repo_dir_path, - self._externals)) - - return load_ex + def replace_subexternal_sourcetree(self, sourcetree): + self._subexternal_sourcetree = sourcetree def clone_recursive(self): 'Return True iff any .gitmodules files should be processed' - # Try recursive unless there is an externals entry - recursive = not self._externals + # Try recursive .gitmodules unless there is an externals entry + recursive = not self._subexternals_path return recursive - def _create_externals_sourcetree(self): - """ + +class SourceTree(object): + """ + SourceTree represents a group of managed externals. + + Those externals may not be checked out locally yet, they might only + have Repository objects pointing to their respective repositories. + """ + + @classmethod + def from_externals_file(cls, parent_repo_dir_path, parent_repo, + externals_path): + """Creates a SourceTree representing the given externals file. + + Looks up a git submodules file as an optional backup if there is no + externals file specified. + + Returns None if there is no externals file (i.e. it's None or 'none'), + or if the externals file hasn't been checked out yet. + + parent_repo_dir_path: parent repo root dir + parent_repo: parent repo. + externals_path: path to externals file, relative to parent_repo_dir_path. """ - if not os.path.exists(self._repo_dir_path): + if not os.path.exists(parent_repo_dir_path): # NOTE(bja, 2017-10) repository has not been checked out # yet, can't process the externals file. Assume we are # checking status before code is checkoud out and this # will be handled correctly later. - return + return None - cwd = os.getcwd() - os.chdir(self._repo_dir_path) - if self._externals.lower() == 'none': - msg = ('Internal: Attempt to create source tree for ' - 'externals = none in {}'.format(self._repo_dir_path)) - fatal_error(msg) + if externals_path.lower() == 'none': + # With explicit 'none', do not look for git submodules file. + return None - if not os.path.exists(self._externals): - if GitRepository.has_submodules(): - self._externals = ExternalsDescription.GIT_SUBMODULES_FILENAME + cwd = os.getcwd() + os.chdir(parent_repo_dir_path) + + if not externals_path: + if GitRepository.has_submodules(parent_repo_dir_path): + externals_path = ExternalsDescription.GIT_SUBMODULES_FILENAME + else: + return None - if not os.path.exists(self._externals): - # NOTE(bja, 2017-10) this check is redundent with the one + if not os.path.exists(externals_path): + # NOTE(bja, 2017-10) this check is redundant with the one # in read_externals_description_file! - msg = ('External externals description file "{0}" ' + msg = ('Externals description file "{0}" ' 'does not exist! In directory: {1}'.format( - self._externals, self._repo_dir_path)) + externals_path, parent_repo_dir_path)) fatal_error(msg) - externals_root = self._repo_dir_path + externals_root = parent_repo_dir_path + # model_data is a dict-like object which mirrors the file format. model_data = read_externals_description_file(externals_root, - self._externals) - externals = create_externals_description(model_data, - parent_repo=self._repo) - self._externals_sourcetree = SourceTree(externals_root, externals) + externals_path) + # ext_description is another dict-like object (see ExternalsDescription) + ext_description = create_externals_description(model_data, + parent_repo=parent_repo) + externals_sourcetree = SourceTree(externals_root, ext_description) os.chdir(cwd) - -class SourceTree(object): - """ - SourceTree represents a group of managed externals - """ - - def __init__(self, root_dir, model, svn_ignore_ancestry=False): + return externals_sourcetree + + def __init__(self, root_dir, ext_description, svn_ignore_ancestry=False): """ - Build a SourceTree object from a model description + Build a SourceTree object from an ExternalDescription. + + root_dir: the (checked-out) parent repo root dir. """ self._root_dir = os.path.abspath(root_dir) - self._all_components = {} + self._all_components = {} # component_name -> _External self._required_compnames = [] - for comp in model: - src = _External(self._root_dir, comp, model[comp], svn_ignore_ancestry) + for comp, desc in ext_description.items(): + local_path = desc[ExternalsDescription.PATH] + required = desc[ExternalsDescription.REQUIRED] + repo_info = desc[ExternalsDescription.REPO] + subexternals_path = desc[ExternalsDescription.EXTERNALS] + + repo = create_repository(comp, + repo_info, + svn_ignore_ancestry=svn_ignore_ancestry) + + sourcetree = None + # Treat a .gitmodules file as a backup externals config + if not subexternals_path: + parent_repo_dir_path = os.path.abspath(os.path.join(root_dir, + local_path)) + if GitRepository.has_submodules(parent_repo_dir_path): + subexternals_path = ExternalsDescription.GIT_SUBMODULES_FILENAME + + # Might return None (if the subexternal isn't checked out yet, or subexternal is None or 'none') + subexternal_sourcetree = SourceTree.from_externals_file( + os.path.join(self._root_dir, local_path), + repo, + subexternals_path) + src = _External(self._root_dir, comp, local_path, required, + subexternals_path, repo, svn_ignore_ancestry, + subexternal_sourcetree) + self._all_components[comp] = src - if model[comp][ExternalsDescription.REQUIRED]: + if required: self._required_compnames.append(comp) - def status(self, relative_path_base=LOCAL_PATH_INDICATOR): - """Report the status components - - FIXME(bja, 2017-10) what do we do about situations where the - user checked out the optional components, but didn't add - optional for running status? What do we do where the user - didn't add optional to the checkout but did add it to the - status. -- For now, we run status on all components, and try - to do the right thing based on the results.... - - """ + def status(self, relative_path_base=LOCAL_PATH_INDICATOR, + force=False, print_progress=False): + """Return a dictionary of local path->ExternalStatus. + + Notes about the returned dictionary: + * It is keyed by local path (e.g. 'components/mom'), not by + component name (e.g. 'mom'). + * It contains top-level keys for all traversed components, whether + discovered by recursion or top-level. + * It contains entries for all components regardless of whether they + are locally installed or not, or required or optional. +x """ load_comps = self._all_components.keys() - summary = {} + summary = {} # Holds merged statuses from all components. for comp in load_comps: - printlog('{0}, '.format(comp), end='') - stat = self._all_components[comp].status() + if print_progress: + printlog('{0}, '.format(comp), end='') + stat = self._all_components[comp].status(force=force, + print_progress=print_progress) + + # Returned status dictionary is keyed by local path; prepend + # relative_path_base if not already there. stat_final = {} for name in stat.keys(): - # check if we need to append the relative_path_base to - # the path so it will be sorted in the correct order. if stat[name].path.startswith(relative_path_base): - # use as is, without any changes to path stat_final[name] = stat[name] else: - # append relative_path_base to path and store under key = updated path modified_path = os.path.join(relative_path_base, stat[name].path) stat_final[modified_path] = stat[name] @@ -316,38 +355,71 @@ def status(self, relative_path_base=LOCAL_PATH_INDICATOR): return summary + def _find_installed_optional_components(self): + """Returns a list of installed optional component names, if any.""" + installed_comps = [] + for comp_name, ext in self._all_components.items(): + if comp_name in self._required_compnames: + continue + # Note that in practice we expect this status to be cached. + path_to_stat = ext.status() + + # If any part of this component exists locally, consider it + # installed and therefore eligible for updating. + if any(s.sync_state != ExternalStatus.EMPTY + for s in path_to_stat.values()): + installed_comps.append(comp_name) + return installed_comps + def checkout(self, verbosity, load_all, load_comp=None): """ - Checkout or update indicated components into the the configured - subdirs. + Checkout or update indicated components into the configured subdirs. - If load_all is True, recursively checkout all externals. - If load_all is False, load_comp is an optional set of components to load. - If load_all is True and load_comp is None, only load the required externals. + If load_all is True, checkout all externals (required + optional), recursively. + If load_all is False and load_comp is set, checkout load_comp (and any required subexternals, plus any optional subexternals that are already checked out, recursively) + If load_all is False and load_comp is None, checkout all required externals, plus any optionals that are already checked out, recursively. """ + if load_all: + tmp_comps = self._all_components.keys() + elif load_comp is not None: + tmp_comps = [load_comp] + else: + local_optional_compnames = self._find_installed_optional_components() + tmp_comps = self._required_compnames + local_optional_compnames + if local_optional_compnames: + printlog('Found locally installed optional components: ' + + ', '.join(local_optional_compnames)) + bad_compnames = set(local_optional_compnames) - set(self._all_components.keys()) + if bad_compnames: + printlog('Internal error: found locally installed components that are not in the global list of all components: ' + ','.join(bad_compnames)) + if verbosity >= VERBOSITY_VERBOSE: printlog('Checking out externals: ') else: printlog('Checking out externals: ', end='') - if load_all: - load_comps = self._all_components.keys() - elif load_comp is not None: - load_comps = [load_comp] - else: - load_comps = self._required_compnames + # Sort by path so that if paths are nested the + # parent repo is checked out first. + load_comps = sorted(tmp_comps, key=lambda comp: self._all_components[comp].get_local_path()) - # checkout the primary externals - for comp in load_comps: + # checkout. + for comp_name in load_comps: if verbosity < VERBOSITY_VERBOSE: - printlog('{0}, '.format(comp), end='') + printlog('{0}, '.format(comp_name), end='') else: # verbose output handled by the _External object, just # output a newline printlog(EMPTY_STR) - self._all_components[comp].checkout(verbosity, load_all) + c = self._all_components[comp_name] + # Does not recurse. + c.checkout(verbosity) + # Recursively check out subexternals, if any. Returns None + # if there's no subexternals path. + component_subexternal_sourcetree = SourceTree.from_externals_file( + c.get_repo_dir_path(), + c.get_repo(), + c.get_subexternals_path()) + c.replace_subexternal_sourcetree(component_subexternal_sourcetree) + if component_subexternal_sourcetree: + component_subexternal_sourcetree.checkout(verbosity, load_all) printlog('') - - # now give each external an opportunitity to checkout it's externals. - for comp in load_comps: - self._all_components[comp].checkout_externals(verbosity, load_all) diff --git a/manage_externals/manic/utils.py b/manage_externals/manic/utils.py index f57f43930c..9c63ffe65e 100644 --- a/manage_externals/manic/utils.py +++ b/manage_externals/manic/utils.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Common public utilities for manic package diff --git a/manage_externals/test/README.md b/manage_externals/test/README.md index 938a900eec..1e8f2eaa77 100644 --- a/manage_externals/test/README.md +++ b/manage_externals/test/README.md @@ -1,45 +1,25 @@ # Testing for checkout_externals -NOTE: Python2 is the supported runtime environment. Python3 compatibility is -in progress, complicated by the different proposed input methods -(yaml, xml, cfg/ini, json) and their different handling of strings -(unicode vs byte) in python2. Full python3 compatibility will be -possible once the number of possible input formats has been narrowed. - -## Setup development environment - -Development environments should be setup for python2 and python3: +## Unit tests ```SH cd checkout_externals/test - make python=python2 env - make python=python3 env + make utest ``` -## Unit tests - -Tests should be run for both python2 and python3. It is recommended -that you have seperate terminal windows open python2 and python3 -testing to avoid errors activating and deactivating environments. +## System tests ```SH cd checkout_externals/test - . env_python2/bin/activate - make utest - deactivate + make stest ``` +Example to run a single test: ```SH - cd checkout_externals/test - . env_python2/bin/activate - make utest - deactivate + cd checkout_externals + python -m unittest test.test_sys_checkout.TestSysCheckout.test_container_simple_required ``` -## System tests - -Not yet implemented. - ## Static analysis checkout_externals is difficult to test thoroughly because it relies @@ -51,9 +31,7 @@ regularly for automatic code formatting and linting. ```SH cd checkout_externals/test - . env_python2/bin/activate make lint - deactivate ``` The canonical formatting for the code is whatever autopep8 @@ -68,10 +46,8 @@ coverage, run the code coverage tool: ```SH cd checkout_externals/test - . env_python2/bin/activate make coverage open -a Firefox.app htmlcov/index.html - deactivate ``` diff --git a/manage_externals/test/repos/README.md b/manage_externals/test/repos/README.md new file mode 100644 index 0000000000..8a3502c35f --- /dev/null +++ b/manage_externals/test/repos/README.md @@ -0,0 +1,33 @@ +Git repositories for testing git-related behavior. For usage and terminology notes, see test/test_sys_checkout.py. + +To list files and view file contents at HEAD: +``` +cd +git ls-tree --full-tree -r --name-only HEAD +git cat-file -p HEAD: +``` + +File contents at a glance: +``` +container.git/ + readme.txt + +simple-ext.git/ + (has branches: feature2, feature3) + (has tags: tag1, tag2) + readme.txt + simple_subdir/subdir_file.txt + +simple-ext-fork.git/ + (has tags: abandoned-feature, forked-feature-v1, tag1) + (has branch: feature2) + readme.txt + +mixed-cont-ext.git/ + (has branch: new-feature) + readme.txt + sub-externals.cfg ('simp_branch' section refers to 'feature2' branch in simple-ext.git/ repo) + +error/ + (no git repo here, just a readme.txt in the clear) +``` diff --git a/manage_externals/test/test_sys_checkout.py b/manage_externals/test/test_sys_checkout.py index df726f2b70..ab4f77e88f 100644 --- a/manage_externals/test/test_sys_checkout.py +++ b/manage_externals/test/test_sys_checkout.py @@ -1,7 +1,15 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """Unit test driver for checkout_externals +Terminology: + * 'container': a repo that has externals + * 'simple': a repo that has no externals, but is referenced as an external by another repo. + * 'mixed': a repo that both has externals and is referenced as an external by another repo. + + * 'clean': the local repo matches the version in the externals and has no local modifications. + * 'empty': the external isn't checked out at all. + Note: this script assume the path to the manic and checkout_externals module is already in the python path. This is usually handled by the makefile. If you call it directly, you may need @@ -21,7 +29,6 @@ * Erase any existing repos at the begining of the module in setUpModule. - """ # NOTE(bja, 2017-11) pylint complains that the module is too big, but @@ -66,24 +73,51 @@ # # --------------------------------------------------------------------- -# environment variable names -MANIC_TEST_BARE_REPO_ROOT = 'MANIC_TEST_BARE_REPO_ROOT' -MANIC_TEST_TMP_REPO_ROOT = 'MANIC_TEST_TMP_REPO_ROOT' -# directory names -TMP_REPO_DIR_NAME = 'tmp' +# Module-wide root directory for all the per-test subdirs we'll create on +# the fly (which are placed under wherever $CWD is when the test runs). +# Set by setupModule(). +module_tmp_root_dir = None +TMP_REPO_DIR_NAME = 'tmp' # subdir under $CWD + +# subdir under test/ that holds all of our checked-in repositories (which we +# will clone for these tests). BARE_REPO_ROOT_NAME = 'repos' -CONTAINER_REPO_NAME = 'container.git' -MIXED_REPO_NAME = 'mixed-cont-ext.git' -SIMPLE_REPO_NAME = 'simple-ext.git' -SIMPLE_FORK_NAME = 'simple-ext-fork.git' + +# Environment var referenced by checked-in externals file in mixed-cont-ext.git, +# which should be pointed to the fully-resolved BARE_REPO_ROOT_NAME directory. +# We explicitly clear this after every test, via tearDown(). +MIXED_CONT_EXT_ROOT_ENV_VAR = 'MANIC_TEST_BARE_REPO_ROOT' + +# Subdirs under bare repo root, each holding a repository. For more info +# on the contents of these repositories, see test/repos/README.md. In these +# tests the 'parent' repos are cloned as a starting point, whereas the 'child' +# repos are checked out when the tests run checkout_externals. +CONTAINER_REPO = 'container.git' # Parent repo +SIMPLE_REPO = 'simple-ext.git' # Child repo +SIMPLE_FORK_REPO = 'simple-ext-fork.git' # Child repo +MIXED_REPO = 'mixed-cont-ext.git' # Both parent and child + +# Standard (arbitrary) external names for test configs +TAG_SECTION = 'simp_tag' +BRANCH_SECTION = 'simp_branch' +HASH_SECTION = 'simp_hash' + +# All the configs we construct check out their externals into these local paths. +EXTERNALS_PATH = 'externals' +SUB_EXTERNALS_PATH = 'src' # For mixed test repos, + +# For testing behavior with '.' instead of an explicit paths. SIMPLE_LOCAL_ONLY_NAME = '.' -ERROR_REPO_NAME = 'error' -EXTERNALS_NAME = 'externals' -SUB_EXTERNALS_PATH = 'src' -CFG_NAME = 'externals.cfg' -CFG_SUB_NAME = 'sub-externals.cfg' -README_NAME = 'readme.txt' + +# Externals files. +CFG_NAME = 'externals.cfg' # We construct this on a per-test basis. +CFG_SUB_NAME = 'sub-externals.cfg' # Already exists in mixed-cont-ext repo. + +# Arbitrary text file in all the test repos. +README_NAME = 'readme.txt' + +# Branch that exists in both the simple and simple-fork repos. REMOTE_BRANCH_FEATURE2 = 'feature2' SVN_TEST_REPO = 'https://github.com/escomp/cesm' @@ -107,136 +141,113 @@ def setUpModule(): # pylint: disable=C0103 pass # create clean dir for this run os.mkdir(repo_root) - # set into the environment so var will be expanded in externals - # filess when executables are run - os.environ[MANIC_TEST_TMP_REPO_ROOT] = repo_root - - -class GenerateExternalsDescriptionCfgV1(object): - """Class to provide building blocks to create - ExternalsDescriptionCfgV1 files. - - Includes predefined files used in tests. - """ + # Make available to all tests in this file. + global module_tmp_root_dir + assert module_tmp_root_dir == None, module_tmp_root_dir + module_tmp_root_dir = repo_root - def __init__(self): - self._schema_version = '1.1.0' - self._config = None - - def container_full(self, dest_dir): - """Create the full container config file with simple and mixed use - externals - - """ - self.create_config() - self.create_section(SIMPLE_REPO_NAME, 'simp_tag', - tag='tag1') - - self.create_section(SIMPLE_REPO_NAME, 'simp_branch', - branch=REMOTE_BRANCH_FEATURE2) - - self.create_section(SIMPLE_REPO_NAME, 'simp_opt', - tag='tag1', required=False) - - self.create_section(MIXED_REPO_NAME, 'mixed_req', - branch='master', externals=CFG_SUB_NAME) - - self.write_config(dest_dir) - - def container_simple_required(self, dest_dir): - """Create a container externals file with only simple externals. - - """ - self.create_config() - self.create_section(SIMPLE_REPO_NAME, 'simp_tag', - tag='tag1') - - self.create_section(SIMPLE_REPO_NAME, 'simp_branch', - branch=REMOTE_BRANCH_FEATURE2) - - self.create_section(SIMPLE_REPO_NAME, 'simp_hash', - ref_hash='60b1cc1a38d63') - - self.write_config(dest_dir) - - def container_simple_optional(self, dest_dir): - """Create a container externals file with optional simple externals +class RepoUtils(object): + """Convenience methods for interacting with git repos.""" + @staticmethod + def create_branch(repo_base_dir, external_name, branch, with_commit=False): + """Create branch and optionally (with_commit) add a single commit. """ - self.create_config() - self.create_section(SIMPLE_REPO_NAME, 'simp_req', - tag='tag1') - - self.create_section(SIMPLE_REPO_NAME, 'simp_opt', - tag='tag1', required=False) - - self.write_config(dest_dir) - - def container_simple_svn(self, dest_dir): - """Create a container externals file with only simple externals. + # pylint: disable=R0913 + cwd = os.getcwd() + repo_root = os.path.join(repo_base_dir, EXTERNALS_PATH, external_name) + os.chdir(repo_root) + cmd = ['git', 'checkout', '-b', branch, ] + execute_subprocess(cmd) + if with_commit: + msg = 'start work on {0}'.format(branch) + with open(README_NAME, 'a') as handle: + handle.write(msg) + cmd = ['git', 'add', README_NAME, ] + execute_subprocess(cmd) + cmd = ['git', 'commit', '-m', msg, ] + execute_subprocess(cmd) + os.chdir(cwd) + @staticmethod + def create_commit(repo_base_dir, external_name): + """Make a commit to the given external. + + This is used to test sync state changes from local commits on + detached heads and tracking branches. """ - self.create_config() - self.create_section(SIMPLE_REPO_NAME, 'simp_tag', tag='tag1') - - self.create_svn_external('svn_branch', branch='trunk') - self.create_svn_external('svn_tag', tag='tags/cesm2.0.beta07') + cwd = os.getcwd() + repo_root = os.path.join(repo_base_dir, EXTERNALS_PATH, external_name) + os.chdir(repo_root) - self.write_config(dest_dir) + msg = 'work on great new feature!' + with open(README_NAME, 'a') as handle: + handle.write(msg) + cmd = ['git', 'add', README_NAME, ] + execute_subprocess(cmd) + cmd = ['git', 'commit', '-m', msg, ] + execute_subprocess(cmd) + os.chdir(cwd) - def container_sparse(self, dest_dir): - """Create a container with a full external and a sparse external + @staticmethod + def clone_test_repo(bare_root, test_id, parent_repo_name, dest_dir_in): + """Clone repo at / into dest_dir_in or local per-test-subdir. + Returns output dir. """ - # Create a file for a sparse pattern match - sparse_filename = 'sparse_checkout' - with open(os.path.join(dest_dir, sparse_filename), 'w') as sfile: - sfile.write('readme.txt') - - self.create_config() - self.create_section(SIMPLE_REPO_NAME, 'simp_tag', - tag='tag2') - - sparse_relpath = '../../{}'.format(sparse_filename) - self.create_section(SIMPLE_REPO_NAME, 'simp_sparse', - tag='tag2', sparse=sparse_relpath) + parent_repo_dir = os.path.join(bare_root, parent_repo_name) + if dest_dir_in is None: + # create unique subdir for this test + test_dir_name = test_id + print("Test repository name: {0}".format(test_dir_name)) + dest_dir = os.path.join(module_tmp_root_dir, test_dir_name) + else: + dest_dir = dest_dir_in - self.write_config(dest_dir) + # pylint: disable=W0212 + GitRepository._git_clone(parent_repo_dir, dest_dir, VERBOSITY_DEFAULT) + return dest_dir - def mixed_simple_base(self, dest_dir): - """Create a mixed-use base externals file with only simple externals. + @staticmethod + def add_file_to_repo(under_test_dir, filename, tracked): + """Add a file to the repository so we can put it into a dirty state """ - self.create_config() - self.create_section_ext_only('mixed_base') - self.create_section(SIMPLE_REPO_NAME, 'simp_tag', - tag='tag1') - - self.create_section(SIMPLE_REPO_NAME, 'simp_branch', - branch=REMOTE_BRANCH_FEATURE2) + cwd = os.getcwd() + os.chdir(under_test_dir) + with open(filename, 'w') as tmp: + tmp.write('Hello, world!') - self.create_section(SIMPLE_REPO_NAME, 'simp_hash', - ref_hash='60b1cc1a38d63') + if tracked: + # NOTE(bja, 2018-01) brittle hack to obtain repo dir and + # file name + path_data = filename.split('/') + repo_dir = os.path.join(path_data[0], path_data[1]) + os.chdir(repo_dir) + tracked_file = path_data[2] + cmd = ['git', 'add', tracked_file] + execute_subprocess(cmd) - self.write_config(dest_dir) + os.chdir(cwd) - def mixed_simple_sub(self, dest_dir): - """Create a mixed-use sub externals file with only simple externals. +class GenerateExternalsDescriptionCfgV1(object): + """Building blocks to create ExternalsDescriptionCfgV1 files. - """ - self.create_config() - self.create_section(SIMPLE_REPO_NAME, 'simp_tag', - tag='tag1', path=SUB_EXTERNALS_PATH) + Basic usage: create_config() multiple create_*(), then write_config(). + Optionally after that: write_with_*(). + """ - self.create_section(SIMPLE_REPO_NAME, 'simp_branch', - branch=REMOTE_BRANCH_FEATURE2, - path=SUB_EXTERNALS_PATH) + def __init__(self, bare_root): + self._schema_version = '1.1.0' + self._config = None - self.write_config(dest_dir, filename=CFG_SUB_NAME) + # directory where we have test repositories (which we will clone for + # tests) + self._bare_root = bare_root def write_config(self, dest_dir, filename=CFG_NAME): - """Write the configuration file to disk + """Write self._config to disk """ dest_path = os.path.join(dest_dir, filename) @@ -258,27 +269,39 @@ def create_metadata(self): self._config.set(DESCRIPTION_SECTION, VERSION_ITEM, self._schema_version) - def create_section(self, repo_type, name, tag='', branch='', - ref_hash='', required=True, path=EXTERNALS_NAME, - externals='', repo_path=None, from_submodule=False, - sparse=''): + def url_for_repo_path(self, repo_path, repo_path_abs=None): + if repo_path_abs is not None: + return repo_path_abs + else: + return os.path.join(self._bare_root, repo_path) + + def create_section(self, repo_path, name, tag='', branch='', + ref_hash='', required=True, path=EXTERNALS_PATH, + sub_externals='', repo_path_abs=None, from_submodule=False, + sparse='', nested=False): # pylint: disable=too-many-branches - """Create a config section with autofilling some items and handling - optional items. + """Create a config ExternalsDescription section with the given name. + Autofills some items and handles some optional items. + + repo_path_abs overrides repo_path (which is relative to the bare repo) + path is a subdir under repo_path to check out to. """ # pylint: disable=R0913 self._config.add_section(name) if not from_submodule: - self._config.set(name, ExternalsDescription.PATH, - os.path.join(path, name)) + if nested: + self._config.set(name, ExternalsDescription.PATH, path) + else: + self._config.set(name, ExternalsDescription.PATH, + os.path.join(path, name)) self._config.set(name, ExternalsDescription.PROTOCOL, ExternalsDescription.PROTOCOL_GIT) # from_submodules is incompatible with some other options, turn them off if (from_submodule and - ((repo_path is not None) or tag or ref_hash or branch)): + ((repo_path_abs is not None) or tag or ref_hash or branch)): printlog('create_section: "from_submodule" is incompatible with ' '"repo_url", "tag", "hash", and "branch" options;\n' 'Ignoring those options for {}'.format(name)) @@ -287,10 +310,7 @@ def create_section(self, repo_type, name, tag='', branch='', ref_hash = '' branch = '' - if repo_path is not None: - repo_url = repo_path - else: - repo_url = os.path.join('${MANIC_TEST_BARE_REPO_ROOT}', repo_type) + repo_url = self.url_for_repo_path(repo_path, repo_path_abs) if not from_submodule: self._config.set(name, ExternalsDescription.REPO_URL, repo_url) @@ -306,8 +326,9 @@ def create_section(self, repo_type, name, tag='', branch='', if ref_hash: self._config.set(name, ExternalsDescription.HASH, ref_hash) - if externals: - self._config.set(name, ExternalsDescription.EXTERNALS, externals) + if sub_externals: + self._config.set(name, ExternalsDescription.EXTERNALS, + sub_externals) if sparse: self._config.set(name, ExternalsDescription.SPARSE, sparse) @@ -315,10 +336,8 @@ def create_section(self, repo_type, name, tag='', branch='', if from_submodule: self._config.set(name, ExternalsDescription.SUBMODULE, "True") - def create_section_ext_only(self, name, - required=True, externals=CFG_SUB_NAME): - """Create a config section with autofilling some items and handling - optional items. + def create_section_reference_to_subexternal(self, name): + """Just a reference to another externals file. """ # pylint: disable=R0913 @@ -331,10 +350,9 @@ def create_section_ext_only(self, name, self._config.set(name, ExternalsDescription.REPO_URL, LOCAL_PATH_INDICATOR) - self._config.set(name, ExternalsDescription.REQUIRED, str(required)) + self._config.set(name, ExternalsDescription.REQUIRED, str(True)) - if externals: - self._config.set(name, ExternalsDescription.EXTERNALS, externals) + self._config.set(name, ExternalsDescription.EXTERNALS, CFG_SUB_NAME) def create_svn_external(self, name, tag='', branch=''): """Create a config section for an svn repository. @@ -342,7 +360,7 @@ def create_svn_external(self, name, tag='', branch=''): """ self._config.add_section(name) self._config.set(name, ExternalsDescription.PATH, - os.path.join(EXTERNALS_NAME, name)) + os.path.join(EXTERNALS_PATH, name)) self._config.set(name, ExternalsDescription.PROTOCOL, ExternalsDescription.PROTOCOL_SVN) @@ -357,65 +375,19 @@ def create_svn_external(self, name, tag='', branch=''): if branch: self._config.set(name, ExternalsDescription.BRANCH, branch) - @staticmethod - def create_branch(dest_dir, repo_name, branch, with_commit=False): - """Update a repository branch, and potentially the remote. - """ - # pylint: disable=R0913 - cwd = os.getcwd() - repo_root = os.path.join(dest_dir, EXTERNALS_NAME) - repo_root = os.path.join(repo_root, repo_name) - os.chdir(repo_root) - cmd = ['git', 'checkout', '-b', branch, ] - execute_subprocess(cmd) - if with_commit: - msg = 'start work on {0}'.format(branch) - with open(README_NAME, 'a') as handle: - handle.write(msg) - cmd = ['git', 'add', README_NAME, ] - execute_subprocess(cmd) - cmd = ['git', 'commit', '-m', msg, ] - execute_subprocess(cmd) - os.chdir(cwd) - - @staticmethod - def create_commit(dest_dir, repo_name, local_tracking_branch=None): - """Make a commit on whatever is currently checked out. - - This is used to test sync state changes from local commits on - detached heads and tracking branches. + def write_with_git_branch(self, dest_dir, name, branch, new_remote_repo_path=None): + """Update fields in our config and write it to disk. - """ - cwd = os.getcwd() - repo_root = os.path.join(dest_dir, EXTERNALS_NAME) - repo_root = os.path.join(repo_root, repo_name) - os.chdir(repo_root) - if local_tracking_branch: - cmd = ['git', 'checkout', '-b', local_tracking_branch, ] - execute_subprocess(cmd) - - msg = 'work on great new feature!' - with open(README_NAME, 'a') as handle: - handle.write(msg) - cmd = ['git', 'add', README_NAME, ] - execute_subprocess(cmd) - cmd = ['git', 'commit', '-m', msg, ] - execute_subprocess(cmd) - os.chdir(cwd) - - def update_branch(self, dest_dir, name, branch, repo_type=None, - filename=CFG_NAME): - """Update a repository branch, and potentially the remote. + name is the key of the ExternalsDescription in self._config to update. """ # pylint: disable=R0913 self._config.set(name, ExternalsDescription.BRANCH, branch) - if repo_type: - if repo_type == SIMPLE_LOCAL_ONLY_NAME: + if new_remote_repo_path: + if new_remote_repo_path == SIMPLE_LOCAL_ONLY_NAME: repo_url = SIMPLE_LOCAL_ONLY_NAME else: - repo_url = os.path.join('${MANIC_TEST_BARE_REPO_ROOT}', - repo_type) + repo_url = os.path.join(self._bare_root, new_remote_repo_path) self._config.set(name, ExternalsDescription.REPO_URL, repo_url) try: @@ -424,9 +396,9 @@ def update_branch(self, dest_dir, name, branch, repo_type=None, except BaseException: pass - self.write_config(dest_dir, filename) + self.write_config(dest_dir) - def update_svn_branch(self, dest_dir, name, branch, filename=CFG_NAME): + def write_with_svn_branch(self, dest_dir, name, branch): """Update a repository branch, and potentially the remote. """ # pylint: disable=R0913 @@ -438,11 +410,11 @@ def update_svn_branch(self, dest_dir, name, branch, filename=CFG_NAME): except BaseException: pass - self.write_config(dest_dir, filename) + self.write_config(dest_dir) - def update_tag(self, dest_dir, name, tag, repo_type=None, - filename=CFG_NAME, remove_branch=True): - """Update a repository tag, and potentially the remote + def write_with_tag_and_remote_repo(self, dest_dir, name, tag, new_remote_repo_path, + remove_branch=True): + """Update a repository tag and the remote. NOTE(bja, 2017-11) remove_branch=False should result in an overspecified external with both a branch and tag. This is @@ -452,8 +424,8 @@ def update_tag(self, dest_dir, name, tag, repo_type=None, # pylint: disable=R0913 self._config.set(name, ExternalsDescription.TAG, tag) - if repo_type: - repo_url = os.path.join('${MANIC_TEST_BARE_REPO_ROOT}', repo_type) + if new_remote_repo_path: + repo_url = os.path.join(self._bare_root, new_remote_repo_path) self._config.set(name, ExternalsDescription.REPO_URL, repo_url) try: @@ -463,10 +435,9 @@ def update_tag(self, dest_dir, name, tag, repo_type=None, except BaseException: pass - self.write_config(dest_dir, filename) + self.write_config(dest_dir) - def update_underspecify_branch_tag(self, dest_dir, name, - filename=CFG_NAME): + def write_without_branch_tag(self, dest_dir, name): """Update a repository protocol, and potentially the remote """ # pylint: disable=R0913 @@ -482,10 +453,9 @@ def update_underspecify_branch_tag(self, dest_dir, name, except BaseException: pass - self.write_config(dest_dir, filename) + self.write_config(dest_dir) - def update_underspecify_remove_url(self, dest_dir, name, - filename=CFG_NAME): + def write_without_repo_url(self, dest_dir, name): """Update a repository protocol, and potentially the remote """ # pylint: disable=R0913 @@ -495,22 +465,59 @@ def update_underspecify_remove_url(self, dest_dir, name, except BaseException: pass - self.write_config(dest_dir, filename) + self.write_config(dest_dir) - def update_protocol(self, dest_dir, name, protocol, repo_type=None, - filename=CFG_NAME): + def write_with_protocol(self, dest_dir, name, protocol, repo_path=None): """Update a repository protocol, and potentially the remote """ # pylint: disable=R0913 self._config.set(name, ExternalsDescription.PROTOCOL, protocol) - if repo_type: - repo_url = os.path.join('${MANIC_TEST_BARE_REPO_ROOT}', repo_type) + if repo_path: + repo_url = os.path.join(self._bare_root, repo_path) self._config.set(name, ExternalsDescription.REPO_URL, repo_url) - self.write_config(dest_dir, filename) + self.write_config(dest_dir) + + +def _execute_checkout_in_dir(dirname, args, debug_env=''): + """Execute the checkout command in the appropriate repo dir with the + specified additional args. + + args should be a list of strings. + debug_env shuld be a string of the form 'FOO=bar' or the empty string. + Note that we are calling the command line processing and main + routines and not using a subprocess call so that we get code + coverage results! Note this means that environment variables are passed + to checkout_externals via os.environ; debug_env is just used to aid + manual reproducibility of a given call. + Returns (overall_status, tree_status) + where overall_status is 0 for success, nonzero otherwise. + and tree_status is set if --status was passed in, None otherwise. + + Note this command executes the checkout command, it doesn't + necessarily do any checking out (e.g. if --status is passed in). + """ + cwd = os.getcwd() + + # Construct a command line for reproducibility; this command is not + # actually executed in the test. + os.chdir(dirname) + cmdline = ['--externals', CFG_NAME, ] + cmdline += args + manual_cmd = ('Running equivalent of:\n' + 'pushd {dirname}; ' + '{debug_env} /path/to/checkout_externals {args}'.format( + dirname=dirname, debug_env=debug_env, + args=' '.join(cmdline))) + printlog(manual_cmd) + options = checkout.commandline_arguments(cmdline) + overall_status, tree_status = checkout.main(options) + os.chdir(cwd) + return overall_status, tree_status + class BaseTestSysCheckout(unittest.TestCase): """Base class of reusable systems level test setup for checkout_externals @@ -521,6 +528,7 @@ class BaseTestSysCheckout(unittest.TestCase): # cryptic. # pylint: disable=invalid-name + # Command-line args for checkout_externals, used in execute_checkout_in_dir() status_args = ['--status'] checkout_args = [] optional_args = ['--optional'] @@ -535,384 +543,74 @@ def setUp(self): self._test_id = self.id().split('.')[-1] - # path to the executable - self._checkout = os.path.join('../checkout_externals') - self._checkout = os.path.abspath(self._checkout) + # find root + if os.path.exists(os.path.join(os.getcwd(), 'checkout_externals')): + root_dir = os.path.abspath(os.getcwd()) + else: + # maybe we are in a subdir, search up + root_dir = os.path.abspath(os.path.join(os.getcwd(), os.pardir)) + while os.path.basename(root_dir): + if os.path.exists(os.path.join(root_dir, 'checkout_externals')): + break + root_dir = os.path.dirname(root_dir) + + if not os.path.exists(os.path.join(root_dir, 'checkout_externals')): + raise RuntimeError('Cannot find checkout_externals') - # directory where we have test repositories - self._bare_root = os.path.join(os.getcwd(), BARE_REPO_ROOT_NAME) - self._bare_root = os.path.abspath(self._bare_root) + # path to the executable + self._checkout = os.path.join(root_dir, 'checkout_externals') - # set into the environment so var will be expanded in externals files - os.environ[MANIC_TEST_BARE_REPO_ROOT] = self._bare_root + # directory where we have test repositories (which we will clone for + # tests) + self._bare_root = os.path.abspath( + os.path.join(root_dir, 'test', BARE_REPO_ROOT_NAME)) # set the input file generator - self._generator = GenerateExternalsDescriptionCfgV1() + self._generator = GenerateExternalsDescriptionCfgV1(self._bare_root) # set the input file generator for secondary externals - self._sub_generator = GenerateExternalsDescriptionCfgV1() + self._sub_generator = GenerateExternalsDescriptionCfgV1(self._bare_root) def tearDown(self): """Tear down for individual tests """ - # remove the env var we added in setup - del os.environ[MANIC_TEST_BARE_REPO_ROOT] - # return to our common starting point os.chdir(self._return_dir) - - def setup_test_repo(self, parent_repo_name, dest_dir_in=None): - """Setup the paths and clone the base test repo - - """ - # unique repo for this test - test_dir_name = self._test_id - print("Test repository name: {0}".format(test_dir_name)) - - parent_repo_dir = os.path.join(self._bare_root, parent_repo_name) - if dest_dir_in is None: - dest_dir = os.path.join(os.environ[MANIC_TEST_TMP_REPO_ROOT], - test_dir_name) - else: - dest_dir = dest_dir_in - - # pylint: disable=W0212 - GitRepository._git_clone(parent_repo_dir, dest_dir, VERBOSITY_DEFAULT) - return dest_dir - - @staticmethod - def _add_file_to_repo(under_test_dir, filename, tracked): - """Add a file to the repository so we can put it into a dirty state - - """ - cwd = os.getcwd() - os.chdir(under_test_dir) - with open(filename, 'w') as tmp: - tmp.write('Hello, world!') - - if tracked: - # NOTE(bja, 2018-01) brittle hack to obtain repo dir and - # file name - path_data = filename.split('/') - repo_dir = os.path.join(path_data[0], path_data[1]) - os.chdir(repo_dir) - tracked_file = path_data[2] - cmd = ['git', 'add', tracked_file] - execute_subprocess(cmd) - - os.chdir(cwd) + + # (in case this was set) Don't pollute environment of other tests. + os.environ.pop(MIXED_CONT_EXT_ROOT_ENV_VAR, + None) # Don't care if key wasn't set. + + def clone_test_repo(self, parent_repo_name, dest_dir_in=None): + """Clones repo under self._bare_root""" + return RepoUtils.clone_test_repo(self._bare_root, self._test_id, + parent_repo_name, dest_dir_in) + + def execute_checkout_in_dir(self, dirname, args, debug_env=''): + overall_status, tree_status = _execute_checkout_in_dir(dirname, args, + debug_env=debug_env) + self.assertEqual(overall_status, 0) + return tree_status + + def execute_checkout_with_status(self, dirname, args, debug_env=''): + """Calls checkout a second time to get status if needed.""" + tree_status = self.execute_checkout_in_dir( + dirname, args, debug_env=debug_env) + if tree_status is None: + tree_status = self.execute_checkout_in_dir(dirname, + self.status_args, + debug_env=debug_env) + self.assertNotEqual(tree_status, None) + return tree_status + + def _check_sync_clean(self, ext_status, expected_sync_state, + expected_clean_state): + self.assertEqual(ext_status.sync_state, expected_sync_state) + self.assertEqual(ext_status.clean_state, expected_clean_state) @staticmethod - def execute_cmd_in_dir(under_test_dir, args): - """Extecute the checkout command in the appropriate repo dir with the - specified additional args - - Note that we are calling the command line processing and main - routines and not using a subprocess call so that we get code - coverage results! - - """ - cwd = os.getcwd() - checkout_path = os.path.abspath('{0}/../../checkout_externals') - os.chdir(under_test_dir) - cmdline = ['--externals', CFG_NAME, ] - cmdline += args - repo_root = 'MANIC_TEST_BARE_REPO_ROOT={root}'.format( - root=os.environ[MANIC_TEST_BARE_REPO_ROOT]) - manual_cmd = ('Test cmd:\npushd {cwd}; {env} {checkout} {args}'.format( - cwd=under_test_dir, env=repo_root, checkout=checkout_path, - args=' '.join(cmdline))) - printlog(manual_cmd) - options = checkout.commandline_arguments(cmdline) - overall_status, tree_status = checkout.main(options) - os.chdir(cwd) - return overall_status, tree_status - - # ---------------------------------------------------------------- - # - # Check results for generic perturbation of states - # - # ---------------------------------------------------------------- - def _check_generic_empty_default_required(self, tree, name): - self.assertEqual(tree[name].sync_state, ExternalStatus.EMPTY) - self.assertEqual(tree[name].clean_state, ExternalStatus.DEFAULT) - self.assertEqual(tree[name].source_type, ExternalStatus.MANAGED) - - def _check_generic_ok_clean_required(self, tree, name): - self.assertEqual(tree[name].sync_state, ExternalStatus.STATUS_OK) - self.assertEqual(tree[name].clean_state, ExternalStatus.STATUS_OK) - self.assertEqual(tree[name].source_type, ExternalStatus.MANAGED) - - def _check_generic_ok_dirty_required(self, tree, name): - self.assertEqual(tree[name].sync_state, ExternalStatus.STATUS_OK) - self.assertEqual(tree[name].clean_state, ExternalStatus.DIRTY) - self.assertEqual(tree[name].source_type, ExternalStatus.MANAGED) - - def _check_generic_modified_ok_required(self, tree, name): - self.assertEqual(tree[name].sync_state, ExternalStatus.MODEL_MODIFIED) - self.assertEqual(tree[name].clean_state, ExternalStatus.STATUS_OK) - self.assertEqual(tree[name].source_type, ExternalStatus.MANAGED) - - def _check_generic_empty_default_optional(self, tree, name): - self.assertEqual(tree[name].sync_state, ExternalStatus.EMPTY) - self.assertEqual(tree[name].clean_state, ExternalStatus.DEFAULT) - self.assertEqual(tree[name].source_type, ExternalStatus.OPTIONAL) - - def _check_generic_ok_clean_optional(self, tree, name): - self.assertEqual(tree[name].sync_state, ExternalStatus.STATUS_OK) - self.assertEqual(tree[name].clean_state, ExternalStatus.STATUS_OK) - self.assertEqual(tree[name].source_type, ExternalStatus.OPTIONAL) - - # ---------------------------------------------------------------- - # - # Check results for individual named externals - # - # ---------------------------------------------------------------- - def _check_simple_tag_empty(self, tree, directory=EXTERNALS_NAME): - name = './{0}/simp_tag'.format(directory) - self._check_generic_empty_default_required(tree, name) - - def _check_simple_tag_ok(self, tree, directory=EXTERNALS_NAME): - name = './{0}/simp_tag'.format(directory) - self._check_generic_ok_clean_required(tree, name) - - def _check_simple_tag_dirty(self, tree, directory=EXTERNALS_NAME): - name = './{0}/simp_tag'.format(directory) - self._check_generic_ok_dirty_required(tree, name) - - def _check_simple_tag_modified(self, tree, directory=EXTERNALS_NAME): - name = './{0}/simp_tag'.format(directory) - self._check_generic_modified_ok_required(tree, name) - - def _check_simple_branch_empty(self, tree, directory=EXTERNALS_NAME): - name = './{0}/simp_branch'.format(directory) - self._check_generic_empty_default_required(tree, name) - - def _check_simple_branch_ok(self, tree, directory=EXTERNALS_NAME): - name = './{0}/simp_branch'.format(directory) - self._check_generic_ok_clean_required(tree, name) - - def _check_simple_branch_modified(self, tree, directory=EXTERNALS_NAME): - name = './{0}/simp_branch'.format(directory) - self._check_generic_modified_ok_required(tree, name) - - def _check_simple_hash_empty(self, tree, directory=EXTERNALS_NAME): - name = './{0}/simp_hash'.format(directory) - self._check_generic_empty_default_required(tree, name) - - def _check_simple_hash_ok(self, tree, directory=EXTERNALS_NAME): - name = './{0}/simp_hash'.format(directory) - self._check_generic_ok_clean_required(tree, name) - - def _check_simple_hash_modified(self, tree, directory=EXTERNALS_NAME): - name = './{0}/simp_hash'.format(directory) - self._check_generic_modified_ok_required(tree, name) - - def _check_simple_req_empty(self, tree, directory=EXTERNALS_NAME): - name = './{0}/simp_req'.format(directory) - self._check_generic_empty_default_required(tree, name) - - def _check_simple_req_ok(self, tree, directory=EXTERNALS_NAME): - name = './{0}/simp_req'.format(directory) - self._check_generic_ok_clean_required(tree, name) - - def _check_simple_opt_empty(self, tree, directory=EXTERNALS_NAME): - name = './{0}/simp_opt'.format(directory) - self._check_generic_empty_default_optional(tree, name) - - def _check_simple_opt_ok(self, tree, directory=EXTERNALS_NAME): - name = './{0}/simp_opt'.format(directory) - self._check_generic_ok_clean_optional(tree, name) - - def _check_mixed_ext_branch_empty(self, tree, directory=EXTERNALS_NAME): - name = './{0}/mixed_req'.format(directory) - self._check_generic_empty_default_required(tree, name) - - def _check_mixed_ext_branch_ok(self, tree, directory=EXTERNALS_NAME): - name = './{0}/mixed_req'.format(directory) - self._check_generic_ok_clean_required(tree, name) - - def _check_mixed_ext_branch_modified(self, tree, directory=EXTERNALS_NAME): - name = './{0}/mixed_req'.format(directory) - self._check_generic_modified_ok_required(tree, name) - - def _check_simple_sparse_empty(self, tree, directory=EXTERNALS_NAME): - name = './{0}/simp_sparse'.format(directory) - self._check_generic_empty_default_required(tree, name) - - def _check_simple_sparse_ok(self, tree, directory=EXTERNALS_NAME): - name = './{0}/simp_sparse'.format(directory) - self._check_generic_ok_clean_required(tree, name) - - # ---------------------------------------------------------------- - # - # Check results for groups of externals under specific conditions - # - # ---------------------------------------------------------------- - def _check_container_simple_required_pre_checkout(self, overall, tree): - self.assertEqual(overall, 0) - self._check_simple_tag_empty(tree) - self._check_simple_branch_empty(tree) - self._check_simple_hash_empty(tree) - - def _check_container_simple_required_checkout(self, overall, tree): - # Note, this is the internal tree status just before checkout - self.assertEqual(overall, 0) - self._check_simple_tag_empty(tree) - self._check_simple_branch_empty(tree) - self._check_simple_hash_empty(tree) - - def _check_container_simple_required_post_checkout(self, overall, tree): - self.assertEqual(overall, 0) - self._check_simple_tag_ok(tree) - self._check_simple_branch_ok(tree) - self._check_simple_hash_ok(tree) - - def _check_container_simple_required_out_of_sync(self, overall, tree): - self.assertEqual(overall, 0) - self._check_simple_tag_modified(tree) - self._check_simple_branch_modified(tree) - self._check_simple_hash_modified(tree) - - def _check_container_simple_optional_pre_checkout(self, overall, tree): - self.assertEqual(overall, 0) - self._check_simple_req_empty(tree) - self._check_simple_opt_empty(tree) - - def _check_container_simple_optional_checkout(self, overall, tree): - self.assertEqual(overall, 0) - self._check_simple_req_empty(tree) - self._check_simple_opt_empty(tree) - - def _check_container_simple_optional_post_checkout(self, overall, tree): - self.assertEqual(overall, 0) - self._check_simple_req_ok(tree) - self._check_simple_opt_empty(tree) - - def _check_container_simple_optional_post_optional(self, overall, tree): - self.assertEqual(overall, 0) - self._check_simple_req_ok(tree) - self._check_simple_opt_ok(tree) - - def _check_container_simple_required_sb_modified(self, overall, tree): - self.assertEqual(overall, 0) - self._check_simple_tag_ok(tree) - self._check_simple_branch_modified(tree) - self._check_simple_hash_ok(tree) - - def _check_container_simple_optional_st_dirty(self, overall, tree): - self.assertEqual(overall, 0) - self._check_simple_tag_dirty(tree) - self._check_simple_branch_ok(tree) - - def _check_container_full_pre_checkout(self, overall, tree): - self.assertEqual(overall, 0) - self._check_simple_tag_empty(tree) - self._check_simple_branch_empty(tree) - self._check_simple_opt_empty(tree) - self._check_mixed_ext_branch_required_pre_checkout(overall, tree) - - def _check_container_component_post_checkout(self, overall, tree): - self.assertEqual(overall, 0) - self._check_simple_opt_ok(tree) - self._check_simple_tag_empty(tree) - self._check_simple_branch_empty(tree) - - def _check_container_component_post_checkout2(self, overall, tree): - self.assertEqual(overall, 0) - self._check_simple_opt_ok(tree) - self._check_simple_tag_empty(tree) - self._check_simple_branch_ok(tree) - - def _check_container_full_post_checkout(self, overall, tree): - self.assertEqual(overall, 0) - self._check_simple_tag_ok(tree) - self._check_simple_branch_ok(tree) - self._check_simple_opt_empty(tree) - self._check_mixed_ext_branch_required_post_checkout(overall, tree) - - def _check_container_full_pre_checkout_ext_change(self, overall, tree): - self.assertEqual(overall, 0) - self._check_simple_tag_ok(tree) - self._check_simple_branch_ok(tree) - self._check_simple_opt_empty(tree) - self._check_mixed_ext_branch_required_pre_checkout_ext_change( - overall, tree) - - def _check_container_full_post_checkout_subext_modified( - self, overall, tree): - self.assertEqual(overall, 0) - self._check_simple_tag_ok(tree) - self._check_simple_branch_ok(tree) - self._check_simple_opt_empty(tree) - self._check_mixed_ext_branch_required_post_checkout_subext_modified( - overall, tree) - - def _check_mixed_ext_branch_required_pre_checkout(self, overall, tree): - # Note, this is the internal tree status just before checkout - self.assertEqual(overall, 0) - self._check_mixed_ext_branch_empty(tree, directory=EXTERNALS_NAME) - # NOTE: externals/mixed_req/src should not exist in the tree - # since this is the status before checkout of mixed_req. - - def _check_mixed_ext_branch_required_post_checkout(self, overall, tree): - # Note, this is the internal tree status just before checkout - self.assertEqual(overall, 0) - self._check_mixed_ext_branch_ok(tree, directory=EXTERNALS_NAME) - check_dir = "{0}/{1}/{2}".format(EXTERNALS_NAME, "mixed_req", - SUB_EXTERNALS_PATH) - self._check_simple_branch_ok(tree, directory=check_dir) - - def _check_mixed_ext_branch_required_pre_checkout_ext_change( - self, overall, tree): - # Note, this is the internal tree status just after change the - # externals description file, but before checkout - self.assertEqual(overall, 0) - self._check_mixed_ext_branch_modified(tree, directory=EXTERNALS_NAME) - check_dir = "{0}/{1}/{2}".format(EXTERNALS_NAME, "mixed_req", - SUB_EXTERNALS_PATH) - self._check_simple_branch_ok(tree, directory=check_dir) - - def _check_mixed_ext_branch_required_post_checkout_subext_modified( - self, overall, tree): - # Note, this is the internal tree status just after change the - # externals description file, but before checkout - self.assertEqual(overall, 0) - self._check_mixed_ext_branch_ok(tree, directory=EXTERNALS_NAME) - check_dir = "{0}/{1}/{2}".format(EXTERNALS_NAME, "mixed_req", - SUB_EXTERNALS_PATH) - self._check_simple_branch_modified(tree, directory=check_dir) - - def _check_mixed_cont_simple_required_pre_checkout(self, overall, tree): - # Note, this is the internal tree status just before checkout - self.assertEqual(overall, 0) - self._check_simple_tag_empty(tree, directory=EXTERNALS_NAME) - self._check_simple_branch_empty(tree, directory=EXTERNALS_NAME) - self._check_simple_branch_empty(tree, directory=SUB_EXTERNALS_PATH) - - def _check_mixed_cont_simple_required_checkout(self, overall, tree): - # Note, this is the internal tree status just before checkout - self.assertEqual(overall, 0) - self._check_simple_tag_empty(tree, directory=EXTERNALS_NAME) - self._check_simple_branch_empty(tree, directory=EXTERNALS_NAME) - self._check_simple_branch_empty(tree, directory=SUB_EXTERNALS_PATH) - - def _check_mixed_cont_simple_required_post_checkout(self, overall, tree): - # Note, this is the internal tree status just before checkout - self.assertEqual(overall, 0) - self._check_simple_tag_ok(tree, directory=EXTERNALS_NAME) - self._check_simple_branch_ok(tree, directory=EXTERNALS_NAME) - self._check_simple_branch_ok(tree, directory=SUB_EXTERNALS_PATH) - - def _check_container_sparse_pre_checkout(self, overall, tree): - self.assertEqual(overall, 0) - self._check_simple_tag_empty(tree) - self._check_simple_sparse_empty(tree) - - def _check_container_sparse_post_checkout(self, overall, tree): - self.assertEqual(overall, 0) - self._check_simple_tag_ok(tree) - self._check_simple_sparse_ok(tree) - + def _external_path(section_name, base_path=EXTERNALS_PATH): + return './{0}/{1}'.format(base_path, section_name) + def _check_file_exists(self, repo_dir, pathname): "Check that exists in " self.assertTrue(os.path.exists(os.path.join(repo_dir, pathname))) @@ -921,9 +619,9 @@ def _check_file_absent(self, repo_dir, pathname): "Check that does not exist in " self.assertFalse(os.path.exists(os.path.join(repo_dir, pathname))) + class TestSysCheckout(BaseTestSysCheckout): """Run systems level tests of checkout_externals - """ # NOTE(bja, 2017-11) pylint complains about long method names, but # it is hard to differentiate tests without making them more @@ -935,214 +633,431 @@ class TestSysCheckout(BaseTestSysCheckout): # Run systems tests # # ---------------------------------------------------------------- - def test_container_simple_required(self): - """Verify that a container with simple subrepos - generates the correct initial status. - + def test_required_bytag(self): + """Check out a required external pointing to a git tag.""" + cloned_repo_dir = self.clone_test_repo(CONTAINER_REPO) + self._generator.create_config() + self._generator.create_section(SIMPLE_REPO, TAG_SECTION, + tag='tag1') + self._generator.write_config(cloned_repo_dir) + + # externals start out 'empty' aka not checked out. + tree = self.execute_checkout_in_dir(cloned_repo_dir, + self.status_args) + local_path_rel = self._external_path(TAG_SECTION) + self._check_sync_clean(tree[local_path_rel], + ExternalStatus.EMPTY, + ExternalStatus.DEFAULT) + local_path_abs = os.path.join(cloned_repo_dir, local_path_rel) + self.assertFalse(os.path.exists(local_path_abs)) + + # after checkout, the external is 'clean' aka at the correct version. + tree = self.execute_checkout_with_status(cloned_repo_dir, + self.checkout_args) + self._check_sync_clean(tree[local_path_rel], + ExternalStatus.STATUS_OK, + ExternalStatus.STATUS_OK) + + # Actually checked out the desired repo. + self.assertEqual('origin', GitRepository._remote_name_for_url( + # Which url to look up + self._generator.url_for_repo_path(SIMPLE_REPO), + # Which directory has the local checked-out repo. + dirname=local_path_abs)) + + # Actually checked out the desired tag. + (tag_found, tag_name) = GitRepository._git_current_tag(local_path_abs) + self.assertEqual(tag_name, 'tag1') + + # Check existence of some simp_tag files + tag_path = os.path.join('externals', TAG_SECTION) + self._check_file_exists(cloned_repo_dir, + os.path.join(tag_path, README_NAME)) + # Subrepo should not exist (not referenced by configs). + self._check_file_absent(cloned_repo_dir, os.path.join(tag_path, + 'simple_subdir', + 'subdir_file.txt')) + + def test_required_bybranch(self): + """Check out a required external pointing to a git branch.""" + cloned_repo_dir = self.clone_test_repo(CONTAINER_REPO) + self._generator.create_config() + self._generator.create_section(SIMPLE_REPO, BRANCH_SECTION, + branch=REMOTE_BRANCH_FEATURE2) + self._generator.write_config(cloned_repo_dir) + + # externals start out 'empty' aka not checked out. + tree = self.execute_checkout_in_dir(cloned_repo_dir, + self.status_args) + local_path_rel = self._external_path(BRANCH_SECTION) + self._check_sync_clean(tree[local_path_rel], + ExternalStatus.EMPTY, + ExternalStatus.DEFAULT) + local_path_abs = os.path.join(cloned_repo_dir, local_path_rel) + self.assertFalse(os.path.exists(local_path_abs)) + + # after checkout, the external is 'clean' aka at the correct version. + tree = self.execute_checkout_with_status(cloned_repo_dir, + self.checkout_args) + self._check_sync_clean(tree[local_path_rel], + ExternalStatus.STATUS_OK, + ExternalStatus.STATUS_OK) + self.assertTrue(os.path.exists(local_path_abs)) + + # Actually checked out the desired repo. + self.assertEqual('origin', GitRepository._remote_name_for_url( + # Which url to look up + self._generator.url_for_repo_path(SIMPLE_REPO), + # Which directory has the local checked-out repo. + dirname=local_path_abs)) + + # Actually checked out the desired branch. + (branch_found, branch_name) = GitRepository._git_current_remote_branch( + local_path_abs) + self.assertEquals(branch_name, 'origin/' + REMOTE_BRANCH_FEATURE2) + + def test_required_byhash(self): + """Check out a required external pointing to a git hash.""" + cloned_repo_dir = self.clone_test_repo(CONTAINER_REPO) + self._generator.create_config() + self._generator.create_section(SIMPLE_REPO, HASH_SECTION, + ref_hash='60b1cc1a38d63') + self._generator.write_config(cloned_repo_dir) + + # externals start out 'empty' aka not checked out. + tree = self.execute_checkout_in_dir(cloned_repo_dir, + self.status_args) + local_path_rel = self._external_path(HASH_SECTION) + self._check_sync_clean(tree[local_path_rel], + ExternalStatus.EMPTY, + ExternalStatus.DEFAULT) + local_path_abs = os.path.join(cloned_repo_dir, local_path_rel) + self.assertFalse(os.path.exists(local_path_abs)) + + # after checkout, the externals are 'clean' aka at their correct version. + tree = self.execute_checkout_with_status(cloned_repo_dir, + self.checkout_args) + self._check_sync_clean(tree[local_path_rel], + ExternalStatus.STATUS_OK, + ExternalStatus.STATUS_OK) + + # Actually checked out the desired repo. + self.assertEqual('origin', GitRepository._remote_name_for_url( + # Which url to look up + self._generator.url_for_repo_path(SIMPLE_REPO), + # Which directory has the local checked-out repo. + dirname=local_path_abs)) + + # Actually checked out the desired hash. + (hash_found, hash_name) = GitRepository._git_current_hash( + local_path_abs) + self.assertTrue(hash_name.startswith('60b1cc1a38d63'), + msg=hash_name) + + def test_container_nested_required(self): + """Verify that a container with nested subrepos generates the correct initial status. + Tests over all possible permutations """ - # create repo - under_test_dir = self.setup_test_repo(CONTAINER_REPO_NAME) - self._generator.container_simple_required(under_test_dir) - - # status of empty repo - overall, tree = self.execute_cmd_in_dir(under_test_dir, + # Output subdirs for each of the externals, to test that one external can be + # checked out in a subdir of another. + NESTED_SUBDIR = ['./fred', './fred/wilma', './fred/wilma/barney'] + + # Assert that each type of external (e.g. tag vs branch) can be at any parent level + # (e.g. child/parent/grandparent). + orders = [[0, 1, 2], [1, 2, 0], [2, 0, 1], + [0, 2, 1], [2, 1, 0], [1, 0, 2]] + for n, order in enumerate(orders): + dest_dir = os.path.join(module_tmp_root_dir, self._test_id, + "test"+str(n)) + cloned_repo_dir = self.clone_test_repo(CONTAINER_REPO, + dest_dir_in=dest_dir) + self._generator.create_config() + # We happen to check out each section via a different reference (tag/branch/hash) but + # those don't really matter, we just need to check out three repos into a nested set of + # directories. + self._generator.create_section( + SIMPLE_REPO, TAG_SECTION, nested=True, + tag='tag1', path=NESTED_SUBDIR[order[0]]) + self._generator.create_section( + SIMPLE_REPO, BRANCH_SECTION, nested=True, + branch=REMOTE_BRANCH_FEATURE2, path=NESTED_SUBDIR[order[1]]) + self._generator.create_section( + SIMPLE_REPO, HASH_SECTION, nested=True, + ref_hash='60b1cc1a38d63', path=NESTED_SUBDIR[order[2]]) + self._generator.write_config(cloned_repo_dir) + + # all externals start out 'empty' aka not checked out. + tree = self.execute_checkout_in_dir(cloned_repo_dir, self.status_args) - self._check_container_simple_required_pre_checkout(overall, tree) - - # checkout - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.checkout_args) - self._check_container_simple_required_checkout(overall, tree) - - # status clean checked out - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.status_args) - self._check_container_simple_required_post_checkout(overall, tree) - + self._check_sync_clean(tree[NESTED_SUBDIR[order[0]]], + ExternalStatus.EMPTY, + ExternalStatus.DEFAULT) + self._check_sync_clean(tree[NESTED_SUBDIR[order[1]]], + ExternalStatus.EMPTY, + ExternalStatus.DEFAULT) + self._check_sync_clean(tree[NESTED_SUBDIR[order[2]]], + ExternalStatus.EMPTY, + ExternalStatus.DEFAULT) + + # after checkout, all the repos are 'clean'. + tree = self.execute_checkout_with_status(cloned_repo_dir, + self.checkout_args) + self._check_sync_clean(tree[NESTED_SUBDIR[order[0]]], + ExternalStatus.STATUS_OK, + ExternalStatus.STATUS_OK) + self._check_sync_clean(tree[NESTED_SUBDIR[order[1]]], + ExternalStatus.STATUS_OK, + ExternalStatus.STATUS_OK) + self._check_sync_clean(tree[NESTED_SUBDIR[order[2]]], + ExternalStatus.STATUS_OK, + ExternalStatus.STATUS_OK) + def test_container_simple_optional(self): - """Verify that container with an optional simple subrepos - generates the correct initial status. + """Verify that container with an optional simple subrepos generates + the correct initial status. """ - # create repo - under_test_dir = self.setup_test_repo(CONTAINER_REPO_NAME) - self._generator.container_simple_optional(under_test_dir) - - # check status of empty repo - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.status_args) - self._check_container_simple_optional_pre_checkout(overall, tree) - - # checkout required - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.checkout_args) - self._check_container_simple_optional_checkout(overall, tree) - - # status - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.status_args) - self._check_container_simple_optional_post_checkout(overall, tree) + # create repo and externals config. + cloned_repo_dir = self.clone_test_repo(CONTAINER_REPO) + self._generator.create_config() + self._generator.create_section(SIMPLE_REPO, 'simp_req', + tag='tag1') - # checkout optional - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.optional_args) - self._check_container_simple_optional_post_checkout(overall, tree) + self._generator.create_section(SIMPLE_REPO, 'simp_opt', + tag='tag1', required=False) - # status - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.status_args) - self._check_container_simple_optional_post_optional(overall, tree) + self._generator.write_config(cloned_repo_dir) + + # all externals start out 'empty' aka not checked out. + tree = self.execute_checkout_in_dir(cloned_repo_dir, + self.status_args) + req_status = tree[self._external_path('simp_req')] + self._check_sync_clean(req_status, + ExternalStatus.EMPTY, + ExternalStatus.DEFAULT) + self.assertEqual(req_status.source_type, ExternalStatus.MANAGED) + + opt_status = tree[self._external_path('simp_opt')] + self._check_sync_clean(opt_status, + ExternalStatus.EMPTY, + ExternalStatus.DEFAULT) + self.assertEqual(opt_status.source_type, ExternalStatus.OPTIONAL) + + # after checkout, required external is clean, optional is still empty. + tree = self.execute_checkout_with_status(cloned_repo_dir, + self.checkout_args) + req_status = tree[self._external_path('simp_req')] + self._check_sync_clean(req_status, + ExternalStatus.STATUS_OK, + ExternalStatus.STATUS_OK) + self.assertEqual(req_status.source_type, ExternalStatus.MANAGED) + + opt_status = tree[self._external_path('simp_opt')] + self._check_sync_clean(opt_status, + ExternalStatus.EMPTY, + ExternalStatus.DEFAULT) + self.assertEqual(opt_status.source_type, ExternalStatus.OPTIONAL) + + # after checking out optionals, the optional external is also clean. + tree = self.execute_checkout_with_status(cloned_repo_dir, + self.optional_args) + req_status = tree[self._external_path('simp_req')] + self._check_sync_clean(req_status, + ExternalStatus.STATUS_OK, + ExternalStatus.STATUS_OK) + self.assertEqual(req_status.source_type, ExternalStatus.MANAGED) + + opt_status = tree[self._external_path('simp_opt')] + self._check_sync_clean(opt_status, + ExternalStatus.STATUS_OK, + ExternalStatus.STATUS_OK) + self.assertEqual(opt_status.source_type, ExternalStatus.OPTIONAL) def test_container_simple_verbose(self): - """Verify that container with simple subrepos runs with verbose status - output and generates the correct initial status. - + """Verify that verbose status matches non-verbose. """ - # create repo - under_test_dir = self.setup_test_repo(CONTAINER_REPO_NAME) - self._generator.container_simple_required(under_test_dir) - - # checkout - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.checkout_args) - self._check_container_simple_required_checkout(overall, tree) - - # check verbose status - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.verbose_args) - self._check_container_simple_required_post_checkout(overall, tree) + cloned_repo_dir = self.clone_test_repo(CONTAINER_REPO) + self._generator.create_config() + self._generator.create_section(SIMPLE_REPO, TAG_SECTION, + tag='tag1') + self._generator.write_config(cloned_repo_dir) + + # after checkout, all externals should be 'clean'. + tree = self.execute_checkout_with_status(cloned_repo_dir, + self.checkout_args) + self._check_sync_clean(tree[self._external_path(TAG_SECTION)], + ExternalStatus.STATUS_OK, + ExternalStatus.STATUS_OK) + + # 'Verbose' status should tell the same story. + tree = self.execute_checkout_in_dir(cloned_repo_dir, + self.verbose_args) + self._check_sync_clean(tree[self._external_path(TAG_SECTION)], + ExternalStatus.STATUS_OK, + ExternalStatus.STATUS_OK) def test_container_simple_dirty(self): - """Verify that a container with simple subrepos - and a dirty status exits gracefully. - + """Verify that a container with a new tracked file is marked dirty. """ - under_test_dir = self.setup_test_repo(CONTAINER_REPO_NAME) - self._generator.container_simple_required(under_test_dir) - - # checkout - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.checkout_args) - self._check_container_simple_required_checkout(overall, tree) - - # add a file to the repo - tracked = True - self._add_file_to_repo(under_test_dir, 'externals/simp_tag/tmp.txt', - tracked) - - # checkout: pre-checkout status should be dirty, did not - # modify working copy. - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.checkout_args) - self._check_container_simple_optional_st_dirty(overall, tree) - - # verify status is still dirty - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.status_args) - self._check_container_simple_optional_st_dirty(overall, tree) + cloned_repo_dir = self.clone_test_repo(CONTAINER_REPO) + self._generator.create_config() + self._generator.create_section(SIMPLE_REPO, TAG_SECTION, + tag='tag1') + self._generator.write_config(cloned_repo_dir) + + # checkout, should start out clean. + tree = self.execute_checkout_with_status(cloned_repo_dir, self.checkout_args) + self._check_sync_clean(tree[self._external_path(TAG_SECTION)], + ExternalStatus.STATUS_OK, + ExternalStatus.STATUS_OK) + + # add a tracked file to the simp_tag external, should be dirty. + RepoUtils.add_file_to_repo(cloned_repo_dir, + 'externals/{0}/tmp.txt'.format(TAG_SECTION), + tracked=True) + tree = self.execute_checkout_in_dir(cloned_repo_dir, self.status_args) + self._check_sync_clean(tree[self._external_path(TAG_SECTION)], + ExternalStatus.STATUS_OK, + ExternalStatus.DIRTY) + + # Re-checkout; simp_tag should still be dirty. + tree = self.execute_checkout_with_status(cloned_repo_dir, + self.checkout_args) + self._check_sync_clean(tree[self._external_path(TAG_SECTION)], + ExternalStatus.STATUS_OK, + ExternalStatus.DIRTY) def test_container_simple_untracked(self): """Verify that a container with simple subrepos and a untracked files is not considered 'dirty' and will attempt an update. """ - under_test_dir = self.setup_test_repo(CONTAINER_REPO_NAME) - self._generator.container_simple_required(under_test_dir) - - # checkout - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.checkout_args) - self._check_container_simple_required_checkout(overall, tree) - - # add a file to the repo - tracked = False - self._add_file_to_repo(under_test_dir, 'externals/simp_tag/tmp.txt', - tracked) - - # checkout: pre-checkout status should be clean, ignoring the - # untracked file. - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.checkout_args) - self._check_container_simple_required_post_checkout(overall, tree) - - # verify status is still clean - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.status_args) - self._check_container_simple_required_post_checkout(overall, tree) + cloned_repo_dir = self.clone_test_repo(CONTAINER_REPO) + self._generator.create_config() + self._generator.create_section(SIMPLE_REPO, TAG_SECTION, + tag='tag1') + self._generator.write_config(cloned_repo_dir) + + # checkout, should start out clean. + tree = self.execute_checkout_with_status(cloned_repo_dir, + self.checkout_args) + self._check_sync_clean(tree[self._external_path(TAG_SECTION)], + ExternalStatus.STATUS_OK, + ExternalStatus.STATUS_OK) + + # add an untracked file to the simp_tag external, should stay clean. + RepoUtils.add_file_to_repo(cloned_repo_dir, + 'externals/{0}/tmp.txt'.format(TAG_SECTION), + tracked=False) + tree = self.execute_checkout_in_dir(cloned_repo_dir, self.status_args) + self._check_sync_clean(tree[self._external_path(TAG_SECTION)], + ExternalStatus.STATUS_OK, + ExternalStatus.STATUS_OK) + + # After checkout, the external should still be 'clean'. + tree = self.execute_checkout_with_status(cloned_repo_dir, + self.checkout_args) + self._check_sync_clean(tree[self._external_path(TAG_SECTION)], + ExternalStatus.STATUS_OK, + ExternalStatus.STATUS_OK) def test_container_simple_detached_sync(self): """Verify that a container with simple subrepos generates the correct out of sync status when making commits from a detached head - state. + state. + For more info about 'detached head' state: https://www.cloudbees.com/blog/git-detached-head """ - # create repo - under_test_dir = self.setup_test_repo(CONTAINER_REPO_NAME) - self._generator.container_simple_required(under_test_dir) - - # status of empty repo - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.status_args) - self._check_container_simple_required_pre_checkout(overall, tree) - - # checkout - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.checkout_args) - self._check_container_simple_required_checkout(overall, tree) - - # make a commit on the detached head of the tag and hash externals - self._generator.create_commit(under_test_dir, 'simp_tag') - self._generator.create_commit(under_test_dir, 'simp_hash') - self._generator.create_commit(under_test_dir, 'simp_branch') - - # status of repo, branch, tag and hash should all be out of sync! - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.status_args) - self._check_container_simple_required_out_of_sync(overall, tree) + cloned_repo_dir = self.clone_test_repo(CONTAINER_REPO) + self._generator.create_config() + self._generator.create_section(SIMPLE_REPO, TAG_SECTION, + tag='tag1') + + self._generator.create_section(SIMPLE_REPO, BRANCH_SECTION, + branch=REMOTE_BRANCH_FEATURE2) + + self._generator.create_section(SIMPLE_REPO, 'simp_hash', + ref_hash='60b1cc1a38d63') + + self._generator.write_config(cloned_repo_dir) + + # externals start out 'empty' aka not checked out. + tree = self.execute_checkout_in_dir(cloned_repo_dir, self.status_args) + self._check_sync_clean(tree[self._external_path(TAG_SECTION)], + ExternalStatus.EMPTY, + ExternalStatus.DEFAULT) + self._check_sync_clean(tree[self._external_path(BRANCH_SECTION)], + ExternalStatus.EMPTY, + ExternalStatus.DEFAULT) + self._check_sync_clean(tree[self._external_path(HASH_SECTION)], + ExternalStatus.EMPTY, + ExternalStatus.DEFAULT) # checkout - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.checkout_args) - # same pre-checkout out of sync status - self._check_container_simple_required_out_of_sync(overall, tree) - - # now status should be in-sync - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.status_args) - self._check_container_simple_required_post_checkout(overall, tree) + self.execute_checkout_in_dir(cloned_repo_dir, self.checkout_args) + + # Commit on top of the tag and hash (creating the detached head state in those two + # externals' repos) + # The branch commit does not create the detached head state, but here for completeness. + RepoUtils.create_commit(cloned_repo_dir, TAG_SECTION) + RepoUtils.create_commit(cloned_repo_dir, HASH_SECTION) + RepoUtils.create_commit(cloned_repo_dir, BRANCH_SECTION) + + # sync status of all three should be 'modified' (uncommitted changes) + # clean status is 'ok' (matches externals version) + tree = self.execute_checkout_in_dir(cloned_repo_dir, self.status_args) + self._check_sync_clean(tree[self._external_path(TAG_SECTION)], + ExternalStatus.MODEL_MODIFIED, + ExternalStatus.STATUS_OK) + self._check_sync_clean(tree[self._external_path(BRANCH_SECTION)], + ExternalStatus.MODEL_MODIFIED, + ExternalStatus.STATUS_OK) + self._check_sync_clean(tree[self._external_path(HASH_SECTION)], + ExternalStatus.MODEL_MODIFIED, + ExternalStatus.STATUS_OK) + + # after checkout, all externals should be totally clean (no uncommitted changes, + # and matches externals version). + tree = self.execute_checkout_with_status(cloned_repo_dir, self.checkout_args) + self._check_sync_clean(tree[self._external_path(TAG_SECTION)], + ExternalStatus.STATUS_OK, + ExternalStatus.STATUS_OK) + self._check_sync_clean(tree[self._external_path(BRANCH_SECTION)], + ExternalStatus.STATUS_OK, + ExternalStatus.STATUS_OK) + self._check_sync_clean(tree[self._external_path(HASH_SECTION)], + ExternalStatus.STATUS_OK, + ExternalStatus.STATUS_OK) def test_container_remote_branch(self): """Verify that a container with remote branch change works """ - # create repo - under_test_dir = self.setup_test_repo(CONTAINER_REPO_NAME) - self._generator.container_simple_required(under_test_dir) - - # checkout - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.checkout_args) - self._check_container_simple_required_checkout(overall, tree) - - # update the config file to point to a different remote with - # the same branch - self._generator.update_branch(under_test_dir, 'simp_branch', - REMOTE_BRANCH_FEATURE2, SIMPLE_FORK_NAME) - - # status of simp_branch should be out of sync - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.status_args) - self._check_container_simple_required_sb_modified(overall, tree) - - # checkout new externals - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.checkout_args) - self._check_container_simple_required_sb_modified(overall, tree) - - # status should be synced - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.status_args) - self._check_container_simple_required_post_checkout(overall, tree) + cloned_repo_dir = self.clone_test_repo(CONTAINER_REPO) + self._generator.create_config() + self._generator.create_section(SIMPLE_REPO, BRANCH_SECTION, + branch=REMOTE_BRANCH_FEATURE2) + self._generator.write_config(cloned_repo_dir) + + # initial checkout + self.execute_checkout_in_dir(cloned_repo_dir, self.checkout_args) + + # update the branch external to point to a different remote with the same branch, + # then simp_branch should be out of sync + self._generator.write_with_git_branch(cloned_repo_dir, + name=BRANCH_SECTION, + branch=REMOTE_BRANCH_FEATURE2, + new_remote_repo_path=SIMPLE_FORK_REPO) + tree = self.execute_checkout_in_dir(cloned_repo_dir, self.status_args) + self._check_sync_clean(tree[self._external_path(BRANCH_SECTION)], + ExternalStatus.MODEL_MODIFIED, + ExternalStatus.STATUS_OK) + + # checkout new externals, now simp_branch should be clean. + tree = self.execute_checkout_with_status(cloned_repo_dir, self.checkout_args) + self._check_sync_clean(tree[self._external_path(BRANCH_SECTION)], + ExternalStatus.STATUS_OK, + ExternalStatus.STATUS_OK) def test_container_remote_tag_same_branch(self): """Verify that a container with remote tag change works. The new tag @@ -1151,258 +1066,324 @@ def test_container_remote_tag_same_branch(self): the branch. """ - # create repo - under_test_dir = self.setup_test_repo(CONTAINER_REPO_NAME) - self._generator.container_simple_required(under_test_dir) + cloned_repo_dir = self.clone_test_repo(CONTAINER_REPO) + self._generator.create_config() + self._generator.create_section(SIMPLE_REPO, BRANCH_SECTION, + branch=REMOTE_BRANCH_FEATURE2) + self._generator.write_config(cloned_repo_dir) - # checkout - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.checkout_args) - self._check_container_simple_required_checkout(overall, tree) + # initial checkout + self.execute_checkout_in_dir(cloned_repo_dir, self.checkout_args) # update the config file to point to a different remote with - # the tag instead of branch. Tag MUST NOT be in the original - # repo! - self._generator.update_tag(under_test_dir, 'simp_branch', - 'forked-feature-v1', SIMPLE_FORK_NAME) - - # status of simp_branch should be out of sync - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.status_args) - self._check_container_simple_required_sb_modified(overall, tree) - - # checkout new externals - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.checkout_args) - self._check_container_simple_required_sb_modified(overall, tree) - - # status should be synced - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.status_args) - self._check_container_simple_required_post_checkout(overall, tree) + # the new tag replacing the old branch. Tag MUST NOT be in the original + # repo! status of simp_branch should then be out of sync + self._generator.write_with_tag_and_remote_repo(cloned_repo_dir, BRANCH_SECTION, + tag='forked-feature-v1', + new_remote_repo_path=SIMPLE_FORK_REPO) + tree = self.execute_checkout_in_dir(cloned_repo_dir, + self.status_args) + self._check_sync_clean(tree[self._external_path(BRANCH_SECTION)], + ExternalStatus.MODEL_MODIFIED, + ExternalStatus.STATUS_OK) + + # checkout new externals, then should be synced. + tree = self.execute_checkout_with_status(cloned_repo_dir, + self.checkout_args) + self._check_sync_clean(tree[self._external_path(BRANCH_SECTION)], + ExternalStatus.STATUS_OK, + ExternalStatus.STATUS_OK) def test_container_remote_tag_fetch_all(self): """Verify that a container with remote tag change works. The new tag should not be in the original repo, only the new remote - fork. It should also not be on a branch that will be fetch, + fork. It should also not be on a branch that will be fetched, and therefore not fetched by default with 'git fetch'. It will - only be retreived by 'git fetch --tags' - + only be retrieved by 'git fetch --tags' """ - # create repo - under_test_dir = self.setup_test_repo(CONTAINER_REPO_NAME) - self._generator.container_simple_required(under_test_dir) + cloned_repo_dir = self.clone_test_repo(CONTAINER_REPO) + self._generator.create_config() + self._generator.create_section(SIMPLE_REPO, BRANCH_SECTION, + branch=REMOTE_BRANCH_FEATURE2) + self._generator.write_config(cloned_repo_dir) - # checkout - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.checkout_args) - self._check_container_simple_required_checkout(overall, tree) + # initial checkout + self.execute_checkout_in_dir(cloned_repo_dir, self.checkout_args) # update the config file to point to a different remote with - # the tag instead of branch. Tag MUST NOT be in the original - # repo! - self._generator.update_tag(under_test_dir, 'simp_branch', - 'abandoned-feature', SIMPLE_FORK_NAME) - - # status of simp_branch should be out of sync - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.status_args) - self._check_container_simple_required_sb_modified(overall, tree) - - # checkout new externals - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.checkout_args) - self._check_container_simple_required_sb_modified(overall, tree) - - # status should be synced - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.status_args) - self._check_container_simple_required_post_checkout(overall, tree) + # the new tag instead of the old branch. Tag MUST NOT be in the original + # repo! status of simp_branch should then be out of sync. + self._generator.write_with_tag_and_remote_repo(cloned_repo_dir, BRANCH_SECTION, + tag='abandoned-feature', + new_remote_repo_path=SIMPLE_FORK_REPO) + tree = self.execute_checkout_in_dir(cloned_repo_dir, self.status_args) + self._check_sync_clean(tree[self._external_path(BRANCH_SECTION)], + ExternalStatus.MODEL_MODIFIED, + ExternalStatus.STATUS_OK) + + # checkout new externals, should be clean again. + tree = self.execute_checkout_with_status(cloned_repo_dir, + self.checkout_args) + self._check_sync_clean(tree[self._external_path(BRANCH_SECTION)], + ExternalStatus.STATUS_OK, + ExternalStatus.STATUS_OK) def test_container_preserve_dot(self): """Verify that after inital checkout, modifying an external git repo url to '.' and the current branch will leave it unchanged. """ - # create repo - under_test_dir = self.setup_test_repo(CONTAINER_REPO_NAME) - self._generator.container_simple_required(under_test_dir) + cloned_repo_dir = self.clone_test_repo(CONTAINER_REPO) + self._generator.create_config() + self._generator.create_section(SIMPLE_REPO, BRANCH_SECTION, + branch=REMOTE_BRANCH_FEATURE2) + self._generator.write_config(cloned_repo_dir) - # checkout - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.checkout_args) - self._check_container_simple_required_checkout(overall, tree) + # initial checkout + self.execute_checkout_in_dir(cloned_repo_dir, self.checkout_args) # update the config file to point to a different remote with - # the same branch - self._generator.update_branch(under_test_dir, 'simp_branch', - REMOTE_BRANCH_FEATURE2, SIMPLE_FORK_NAME) - # checkout - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.checkout_args) - - # verify status is clean and unmodified - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.status_args) - self._check_container_simple_required_post_checkout(overall, tree) + # the same branch. + self._generator.write_with_git_branch(cloned_repo_dir, name=BRANCH_SECTION, + branch=REMOTE_BRANCH_FEATURE2, + new_remote_repo_path=SIMPLE_FORK_REPO) + # after checkout, should be clean again. + tree = self.execute_checkout_with_status(cloned_repo_dir, self.checkout_args) + self._check_sync_clean(tree[self._external_path(BRANCH_SECTION)], + ExternalStatus.STATUS_OK, + ExternalStatus.STATUS_OK) # update branch to point to a new branch that only exists in # the local fork - self._generator.create_branch(under_test_dir, 'simp_branch', - 'private-feature', with_commit=True) - self._generator.update_branch(under_test_dir, 'simp_branch', - 'private-feature', - SIMPLE_LOCAL_ONLY_NAME) - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.checkout_args) - - # verify status is clean and unmodified - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.status_args) - self._check_container_simple_required_post_checkout(overall, tree) - - def test_container_full(self): - """Verify that 'full' container with simple and mixed subrepos - generates the correct initial status. + RepoUtils.create_branch(cloned_repo_dir, external_name=BRANCH_SECTION, + branch='private-feature', with_commit=True) + self._generator.write_with_git_branch(cloned_repo_dir, name=BRANCH_SECTION, + branch='private-feature', + new_remote_repo_path=SIMPLE_LOCAL_ONLY_NAME) + # after checkout, should be clean again. + tree = self.execute_checkout_with_status(cloned_repo_dir, self.checkout_args) + self._check_sync_clean(tree[self._external_path(BRANCH_SECTION)], + ExternalStatus.STATUS_OK, + ExternalStatus.STATUS_OK) + + def test_container_mixed_subrepo(self): + """Verify container with mixed subrepo. The mixed subrepo has a sub-externals file with different sub-externals on different branches. """ - # create the test repository - under_test_dir = self.setup_test_repo(CONTAINER_REPO_NAME) - - # create the top level externals file - self._generator.container_full(under_test_dir) - - # inital checkout - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.checkout_args) - self._check_container_full_pre_checkout(overall, tree) - - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.status_args) - self._check_container_full_post_checkout(overall, tree) - - # Check existance of some files - subrepo_path = os.path.join('externals', 'simp_tag') - self._check_file_exists(under_test_dir, - os.path.join(subrepo_path, 'readme.txt')) - self._check_file_absent(under_test_dir, os.path.join(subrepo_path, - 'simple_subdir', - 'subdir_file.txt')) - - # update the mixed-use repo to point to different branch - self._generator.update_branch(under_test_dir, 'mixed_req', - 'new-feature', MIXED_REPO_NAME) + cloned_repo_dir = self.clone_test_repo(CONTAINER_REPO) - # check status out of sync for mixed_req, but sub-externals + self._generator.create_config() + self._generator.create_section(MIXED_REPO, 'mixed_req', + branch='master', sub_externals=CFG_SUB_NAME) + self._generator.write_config(cloned_repo_dir) + + # The subrepo has a repo_url that uses this environment variable. + # It'll be cleared in tearDown(). + os.environ[MIXED_CONT_EXT_ROOT_ENV_VAR] = self._bare_root + debug_env = MIXED_CONT_EXT_ROOT_ENV_VAR + '=' + self._bare_root + + # inital checkout: all requireds are clean, and optional is empty. + tree = self.execute_checkout_with_status(cloned_repo_dir, + self.checkout_args, + debug_env=debug_env) + mixed_req_path = self._external_path('mixed_req') + self._check_sync_clean(tree[mixed_req_path], + ExternalStatus.STATUS_OK, + ExternalStatus.STATUS_OK) + sub_ext_base_path = "{0}/{1}/{2}".format(EXTERNALS_PATH, 'mixed_req', SUB_EXTERNALS_PATH) + # The already-checked-in subexternals file has a 'simp_branch' section + self._check_sync_clean(tree[self._external_path('simp_branch', base_path=sub_ext_base_path)], + ExternalStatus.STATUS_OK, + ExternalStatus.STATUS_OK) + + # update the mixed-use external to point to different branch + # status should become out of sync for mixed_req, but sub-externals # are still in sync - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.status_args) - self._check_container_full_pre_checkout_ext_change(overall, tree) - - # run the checkout. Now the mixed use external and it's - # sub-exterals should be changed. Returned status is - # pre-checkout! - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.checkout_args) - self._check_container_full_pre_checkout_ext_change(overall, tree) - - # check status out of sync for mixed_req, and sub-externals - # are in sync. - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.status_args) - self._check_container_full_post_checkout(overall, tree) - + self._generator.write_with_git_branch(cloned_repo_dir, name='mixed_req', + branch='new-feature', + new_remote_repo_path=MIXED_REPO) + tree = self.execute_checkout_in_dir(cloned_repo_dir, self.status_args, + debug_env=debug_env) + self._check_sync_clean(tree[mixed_req_path], + ExternalStatus.MODEL_MODIFIED, + ExternalStatus.STATUS_OK) + self._check_sync_clean(tree[self._external_path('simp_branch', base_path=sub_ext_base_path)], + ExternalStatus.STATUS_OK, + ExternalStatus.STATUS_OK) + + # run the checkout. Now the mixed use external and its sub-externals should be clean. + tree = self.execute_checkout_with_status(cloned_repo_dir, self.checkout_args, + debug_env=debug_env) + self._check_sync_clean(tree[mixed_req_path], + ExternalStatus.STATUS_OK, + ExternalStatus.STATUS_OK) + self._check_sync_clean(tree[self._external_path('simp_branch', base_path=sub_ext_base_path)], + ExternalStatus.STATUS_OK, + ExternalStatus.STATUS_OK) + def test_container_component(self): """Verify that optional component checkout works """ - # create the test repository - under_test_dir = self.setup_test_repo(CONTAINER_REPO_NAME) + cloned_repo_dir = self.clone_test_repo(CONTAINER_REPO) # create the top level externals file - self._generator.container_full(under_test_dir) - - # inital checkout, first try a nonexistant component argument noref + self._generator.create_config() + # Optional external, by tag. + self._generator.create_section(SIMPLE_REPO, 'simp_opt', + tag='tag1', required=False) + + # Required external, by branch. + self._generator.create_section(SIMPLE_REPO, BRANCH_SECTION, + branch=REMOTE_BRANCH_FEATURE2) + + # Required external, by hash. + self._generator.create_section(SIMPLE_REPO, HASH_SECTION, + ref_hash='60b1cc1a38d63') + self._generator.write_config(cloned_repo_dir) + + # inital checkout, first try a nonexistent component argument noref checkout_args = ['simp_opt', 'noref'] checkout_args.extend(self.checkout_args) with self.assertRaises(RuntimeError): - self.execute_cmd_in_dir(under_test_dir, checkout_args) + self.execute_checkout_in_dir(cloned_repo_dir, checkout_args) + # Now explicitly check out one optional component.. + # Explicitly listed component (opt) should be present, the other two not. checkout_args = ['simp_opt'] checkout_args.extend(self.checkout_args) - - overall, tree = self.execute_cmd_in_dir(under_test_dir, - checkout_args) - - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.status_args) - self._check_container_component_post_checkout(overall, tree) - checkout_args.append('simp_branch') - overall, tree = self.execute_cmd_in_dir(under_test_dir, - checkout_args) - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.status_args) - self._check_container_component_post_checkout2(overall, tree) - - def test_mixed_simple(self): - """Verify that a mixed use repo can serve as a 'full' container, - pulling in a set of externals and a seperate set of sub-externals. - + tree = self.execute_checkout_with_status(cloned_repo_dir, + checkout_args) + self._check_sync_clean(tree[self._external_path('simp_opt')], + ExternalStatus.STATUS_OK, + ExternalStatus.STATUS_OK) + self._check_sync_clean(tree[self._external_path(BRANCH_SECTION)], + ExternalStatus.EMPTY, + ExternalStatus.DEFAULT) + self._check_sync_clean(tree[self._external_path(HASH_SECTION)], + ExternalStatus.EMPTY, + ExternalStatus.DEFAULT) + + # Check out a second component, this one required. + # Explicitly listed component (branch) should be present, the still-unlisted one (tag) not. + checkout_args.append(BRANCH_SECTION) + tree = self.execute_checkout_with_status(cloned_repo_dir, + checkout_args) + self._check_sync_clean(tree[self._external_path('simp_opt')], + ExternalStatus.STATUS_OK, + ExternalStatus.STATUS_OK) + self._check_sync_clean(tree[self._external_path(BRANCH_SECTION)], + ExternalStatus.STATUS_OK, + ExternalStatus.STATUS_OK) + self._check_sync_clean(tree[self._external_path(HASH_SECTION)], + ExternalStatus.EMPTY, + ExternalStatus.DEFAULT) + + + def test_container_exclude_component(self): + """Verify that exclude component checkout works """ - #import pdb; pdb.set_trace() - # create repository - under_test_dir = self.setup_test_repo(MIXED_REPO_NAME) - # create top level externals file - self._generator.mixed_simple_base(under_test_dir) - # NOTE: sub-externals file is already in the repo so we can - # switch branches during testing. Since this is a mixed-repo - # serving as the top level container repo, we can't switch - # during this test. + cloned_repo_dir = self.clone_test_repo(CONTAINER_REPO) + self._generator.create_config() + self._generator.create_section(SIMPLE_REPO, TAG_SECTION, + tag='tag1') + + self._generator.create_section(SIMPLE_REPO, BRANCH_SECTION, + branch=REMOTE_BRANCH_FEATURE2) + + self._generator.create_section(SIMPLE_REPO, 'simp_hash', + ref_hash='60b1cc1a38d63') + + self._generator.write_config(cloned_repo_dir) + + # inital checkout should result in all externals being clean except excluded TAG_SECTION. + checkout_args = ['--exclude', TAG_SECTION] + checkout_args.extend(self.checkout_args) + tree = self.execute_checkout_with_status(cloned_repo_dir, checkout_args) + self._check_sync_clean(tree[self._external_path(TAG_SECTION)], + ExternalStatus.EMPTY, + ExternalStatus.DEFAULT) + self._check_sync_clean(tree[self._external_path(BRANCH_SECTION)], + ExternalStatus.STATUS_OK, + ExternalStatus.STATUS_OK) + self._check_sync_clean(tree[self._external_path(HASH_SECTION)], + ExternalStatus.STATUS_OK, + ExternalStatus.STATUS_OK) + + def test_subexternal(self): + """Verify that an externals file can be brought in as a reference. - # checkout - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.checkout_args) - self._check_mixed_cont_simple_required_checkout(overall, tree) + """ + cloned_repo_dir = self.clone_test_repo(MIXED_REPO) - # verify status is clean and unmodified - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.status_args) - self._check_mixed_cont_simple_required_post_checkout(overall, tree) + self._generator.create_config() + self._generator.create_section_reference_to_subexternal('mixed_base') + self._generator.write_config(cloned_repo_dir) + + # The subrepo has a repo_url that uses this environment variable. + # It'll be cleared in tearDown(). + os.environ[MIXED_CONT_EXT_ROOT_ENV_VAR] = self._bare_root + debug_env = MIXED_CONT_EXT_ROOT_ENV_VAR + '=' + self._bare_root + + # After checkout, confirm required's are clean and the referenced + # subexternal's contents are also clean. + tree = self.execute_checkout_with_status(cloned_repo_dir, + self.checkout_args, + debug_env=debug_env) + + self._check_sync_clean( + tree[self._external_path(BRANCH_SECTION, base_path=SUB_EXTERNALS_PATH)], + ExternalStatus.STATUS_OK, + ExternalStatus.STATUS_OK) def test_container_sparse(self): """Verify that 'full' container with simple subrepo can run a sparse checkout and generate the correct initial status. """ - # create the test repository - under_test_dir = self.setup_test_repo(CONTAINER_REPO_NAME) + cloned_repo_dir = self.clone_test_repo(CONTAINER_REPO) - # create the top level externals file - self._generator.container_sparse(under_test_dir) - - # inital checkout - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.checkout_args) - self._check_container_sparse_pre_checkout(overall, tree) - - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.status_args) - self._check_container_sparse_post_checkout(overall, tree) + # Create a file to list filenames to checkout. + sparse_filename = 'sparse_checkout' + with open(os.path.join(cloned_repo_dir, sparse_filename), 'w') as sfile: + sfile.write(README_NAME) - # Check existance of some files - subrepo_path = os.path.join('externals', 'simp_tag') - self._check_file_exists(under_test_dir, - os.path.join(subrepo_path, 'readme.txt')) - self._check_file_exists(under_test_dir, os.path.join(subrepo_path, + self._generator.create_config() + self._generator.create_section(SIMPLE_REPO, TAG_SECTION, + tag='tag2') + + # Same tag as above, but with a sparse file too. + sparse_relpath = '../../' + sparse_filename + self._generator.create_section(SIMPLE_REPO, 'simp_sparse', + tag='tag2', sparse=sparse_relpath) + + self._generator.write_config(cloned_repo_dir) + + # inital checkout, confirm required's are clean. + tree = self.execute_checkout_with_status(cloned_repo_dir, + self.checkout_args) + self._check_sync_clean(tree[self._external_path(TAG_SECTION)], + ExternalStatus.STATUS_OK, + ExternalStatus.STATUS_OK) + self._check_sync_clean(tree[self._external_path('simp_sparse')], + ExternalStatus.STATUS_OK, + ExternalStatus.STATUS_OK) + + # Check existence of some files - full set in TAG_SECTION, and sparse set + # in 'simp_sparse'. + subrepo_path = os.path.join('externals', TAG_SECTION) + self._check_file_exists(cloned_repo_dir, + os.path.join(subrepo_path, README_NAME)) + self._check_file_exists(cloned_repo_dir, os.path.join(subrepo_path, 'simple_subdir', 'subdir_file.txt')) subrepo_path = os.path.join('externals', 'simp_sparse') - self._check_file_exists(under_test_dir, - os.path.join(subrepo_path, 'readme.txt')) - self._check_file_absent(under_test_dir, os.path.join(subrepo_path, + self._check_file_exists(cloned_repo_dir, + os.path.join(subrepo_path, README_NAME)) + self._check_file_absent(cloned_repo_dir, os.path.join(subrepo_path, 'simple_subdir', 'subdir_file.txt')) @@ -1438,42 +1419,27 @@ class TestSysCheckoutSVN(BaseTestSysCheckout): """ - def _check_svn_branch_ok(self, tree, directory=EXTERNALS_NAME): - name = './{0}/svn_branch'.format(directory) - self._check_generic_ok_clean_required(tree, name) - - def _check_svn_branch_dirty(self, tree, directory=EXTERNALS_NAME): - name = './{0}/svn_branch'.format(directory) - self._check_generic_ok_dirty_required(tree, name) - - def _check_svn_tag_ok(self, tree, directory=EXTERNALS_NAME): - name = './{0}/svn_tag'.format(directory) - self._check_generic_ok_clean_required(tree, name) - - def _check_svn_tag_modified(self, tree, directory=EXTERNALS_NAME): - name = './{0}/svn_tag'.format(directory) - self._check_generic_modified_ok_required(tree, name) - - def _check_container_simple_svn_post_checkout(self, overall, tree): - self.assertEqual(overall, 0) - self._check_simple_tag_ok(tree) - self._check_svn_branch_ok(tree) - self._check_svn_tag_ok(tree) - - def _check_container_simple_svn_sb_dirty_st_mod(self, overall, tree): - self.assertEqual(overall, 0) - self._check_simple_tag_ok(tree) - self._check_svn_tag_modified(tree) - self._check_svn_branch_dirty(tree) + @staticmethod + def _svn_branch_name(): + return './{0}/svn_branch'.format(EXTERNALS_PATH) - def _check_container_simple_svn_sb_clean_st_mod(self, overall, tree): - self.assertEqual(overall, 0) - self._check_simple_tag_ok(tree) - self._check_svn_tag_modified(tree) - self._check_svn_branch_ok(tree) + @staticmethod + def _svn_tag_name(): + return './{0}/svn_tag'.format(EXTERNALS_PATH) + + def _check_tag_branch_svn_tag_clean(self, tree): + self._check_sync_clean(tree[self._external_path(TAG_SECTION)], + ExternalStatus.STATUS_OK, + ExternalStatus.STATUS_OK) + self._check_sync_clean(tree[self._svn_branch_name()], + ExternalStatus.STATUS_OK, + ExternalStatus.STATUS_OK) + self._check_sync_clean(tree[self._svn_tag_name()], + ExternalStatus.STATUS_OK, + ExternalStatus.STATUS_OK) @staticmethod - def have_svn_access(): + def _have_svn_access(): """Check if we have svn access so we can enable tests that use svn. """ @@ -1486,10 +1452,10 @@ def have_svn_access(): pass return have_svn - def skip_if_no_svn_access(self): + def _skip_if_no_svn_access(self): """Function decorator to disable svn tests when svn isn't available """ - have_svn = self.have_svn_access() + have_svn = self._have_svn_access() if not have_svn: raise unittest.SkipTest("No svn access") @@ -1497,60 +1463,55 @@ def test_container_simple_svn(self): """Verify that a container repo can pull in an svn branch and svn tag. """ - self.skip_if_no_svn_access() + self._skip_if_no_svn_access() # create repo - under_test_dir = self.setup_test_repo(CONTAINER_REPO_NAME) - self._generator.container_simple_svn(under_test_dir) + cloned_repo_dir = self.clone_test_repo(CONTAINER_REPO) - # checkout - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.checkout_args) + self._generator.create_config() + # Git repo. + self._generator.create_section(SIMPLE_REPO, TAG_SECTION, tag='tag1') - # verify status is clean and unmodified - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.status_args) - self._check_container_simple_svn_post_checkout(overall, tree) + # Svn repos. + self._generator.create_svn_external('svn_branch', branch='trunk') + self._generator.create_svn_external('svn_tag', tag='tags/cesm2.0.beta07') + + self._generator.write_config(cloned_repo_dir) + + # checkout, make sure all sections are clean. + tree = self.execute_checkout_with_status(cloned_repo_dir, + self.checkout_args) + self._check_tag_branch_svn_tag_clean(tree) # update description file to make the tag into a branch and # trigger a switch - self._generator.update_svn_branch(under_test_dir, 'svn_tag', 'trunk') + self._generator.write_with_svn_branch(cloned_repo_dir, 'svn_tag', + 'trunk') - # checkout - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.checkout_args) - - # verify status is clean and unmodified - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.status_args) - self._check_container_simple_svn_post_checkout(overall, tree) + # checkout, again the results should be clean. + tree = self.execute_checkout_with_status(cloned_repo_dir, + self.checkout_args) + self._check_tag_branch_svn_tag_clean(tree) # add an untracked file to the repo tracked = False - self._add_file_to_repo(under_test_dir, - 'externals/svn_branch/tmp.txt', tracked) + RepoUtils.add_file_to_repo(cloned_repo_dir, + 'externals/svn_branch/tmp.txt', tracked) - # run a no-op checkout: pre-checkout status should be clean, - # ignoring the untracked file. - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.checkout_args) - self._check_container_simple_svn_post_checkout(overall, tree) + # run a no-op checkout. + self.execute_checkout_in_dir(cloned_repo_dir, self.checkout_args) # update description file to make the branch into a tag and # trigger a modified sync status - self._generator.update_svn_branch(under_test_dir, 'svn_tag', - 'tags/cesm2.0.beta07') + self._generator.write_with_svn_branch(cloned_repo_dir, 'svn_tag', + 'tags/cesm2.0.beta07') - # checkout: pre-checkout status should be clean and modified, - # will modify working copy. - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.checkout_args) - self._check_container_simple_svn_sb_clean_st_mod(overall, tree) + self.execute_checkout_in_dir(cloned_repo_dir,self.checkout_args) # verify status is still clean and unmodified, last # checkout modified the working dir state. - overall, tree = self.execute_cmd_in_dir(under_test_dir, - self.verbose_args) - self._check_container_simple_svn_post_checkout(overall, tree) + tree = self.execute_checkout_in_dir(cloned_repo_dir, + self.verbose_args) + self._check_tag_branch_svn_tag_clean(tree) class TestSubrepoCheckout(BaseTestSysCheckout): # Need to store information at setUp time for checking @@ -1569,7 +1530,7 @@ def setUp(self): """ # Run the basic setup - super(TestSubrepoCheckout, self).setUp() + super().setUp() # create test repo # We need to do this here (rather than have a static repo) because # git submodules do not allow for variables in .gitmodules files @@ -1577,19 +1538,19 @@ def setUp(self): self._bare_branch_name = 'subrepo_branch' self._config_branch_name = 'subrepo_config_branch' self._container_extern_name = 'externals_container.cfg' - self._my_test_dir = os.path.join(os.environ[MANIC_TEST_TMP_REPO_ROOT], - self._test_id) + self._my_test_dir = os.path.join(module_tmp_root_dir, self._test_id) self._repo_dir = os.path.join(self._my_test_dir, self._test_repo_name) self._checkout_dir = 'repo_with_submodules' - check_dir = self.setup_test_repo(CONTAINER_REPO_NAME, + check_dir = self.clone_test_repo(CONTAINER_REPO, dest_dir_in=self._repo_dir) self.assertTrue(self._repo_dir == check_dir) # Add the submodules cwd = os.getcwd() - fork_repo_dir = os.path.join(self._bare_root, SIMPLE_FORK_NAME) - simple_repo_dir = os.path.join(self._bare_root, SIMPLE_REPO_NAME) - self._simple_ext_fork_name = SIMPLE_FORK_NAME.split('.')[0] - self._simple_ext_name = SIMPLE_REPO_NAME.split('.')[0] + fork_repo_dir = os.path.join(self._bare_root, SIMPLE_FORK_REPO) + simple_repo_dir = os.path.join(self._bare_root, SIMPLE_REPO) + self._simple_ext_fork_name = os.path.splitext(SIMPLE_FORK_REPO)[0] + self._simple_ext_name = os.path.join('sourc', + os.path.splitext(SIMPLE_REPO)[0]) os.chdir(self._repo_dir) # Add a branch with a subrepo cmd = ['git', 'branch', self._bare_branch_name, 'master'] @@ -1610,7 +1571,8 @@ def setUp(self): execute_subprocess(cmd) cmd = ['git', 'checkout', self._config_branch_name] execute_subprocess(cmd) - cmd = ['git', 'submodule', 'add', simple_repo_dir] + cmd = ['git', 'submodule', 'add', '--name', SIMPLE_REPO, + simple_repo_dir, self._simple_ext_name] execute_subprocess(cmd) # Checkout feature2 os.chdir(self._simple_ext_name) @@ -1621,8 +1583,8 @@ def setUp(self): # Save the fork repo hash for comparison self._simple_hash_check = self.get_git_hash() os.chdir(self._repo_dir) - self.create_externals_file(filename=self._container_extern_name, - dest_dir=self._repo_dir, from_submodule=True) + self.write_externals_config(filename=self._container_extern_name, + dest_dir=self._repo_dir, from_submodule=True) cmd = ['git', 'add', self._container_extern_name] execute_subprocess(cmd) cmd = ['git', 'commit', '-am', "'Added simple-ext as a submodule'"] @@ -1639,9 +1601,10 @@ def get_git_hash(revision="HEAD"): git_out = execute_subprocess(cmd, output_to_caller=True) return git_out.strip() - def create_externals_file(self, name='', filename=CFG_NAME, dest_dir=None, - branch_name=None, sub_externals=None, - from_submodule=False): + def write_externals_config(self, name='', dest_dir=None, + filename=CFG_NAME, + branch_name=None, sub_externals=None, + from_submodule=False): # pylint: disable=too-many-arguments """Create a container externals file with only simple externals. @@ -1652,10 +1615,10 @@ def create_externals_file(self, name='', filename=CFG_NAME, dest_dir=None, dest_dir = self._my_test_dir if from_submodule: - self._generator.create_section(SIMPLE_FORK_NAME, + self._generator.create_section(SIMPLE_FORK_REPO, self._simple_ext_fork_name, from_submodule=True) - self._generator.create_section(SIMPLE_REPO_NAME, + self._generator.create_section(SIMPLE_REPO, self._simple_ext_name, branch='feature3', path='', from_submodule=False) @@ -1666,8 +1629,8 @@ def create_externals_file(self, name='', filename=CFG_NAME, dest_dir=None, self._generator.create_section(self._test_repo_name, self._checkout_dir, branch=branch_name, - path=name, externals=sub_externals, - repo_path=self._repo_dir) + path=name, sub_externals=sub_externals, + repo_path_abs=self._repo_dir) self._generator.write_config(dest_dir, filename=filename) @@ -1676,12 +1639,10 @@ def idempotence_check(self, checkout_dir): checkout_externals --status does not cause errors""" cwd = os.getcwd() os.chdir(checkout_dir) - overall, _ = self.execute_cmd_in_dir(self._my_test_dir, - self.checkout_args) - self.assertTrue(overall == 0) - overall, _ = self.execute_cmd_in_dir(self._my_test_dir, - self.status_args) - self.assertTrue(overall == 0) + self.execute_checkout_in_dir(self._my_test_dir, + self.checkout_args) + self.execute_checkout_in_dir(self._my_test_dir, + self.status_args) os.chdir(cwd) def test_submodule_checkout_bare(self): @@ -1693,17 +1654,17 @@ def test_submodule_checkout_bare(self): """ simple_ext_fork_tag = "(tag1)" simple_ext_fork_status = " " - self.create_externals_file(branch_name=self._bare_branch_name) - overall, _ = self.execute_cmd_in_dir(self._my_test_dir, - self.checkout_args) - self.assertTrue(overall == 0) + self.write_externals_config(branch_name=self._bare_branch_name) + self.execute_checkout_in_dir(self._my_test_dir, + self.checkout_args) cwd = os.getcwd() checkout_dir = os.path.join(self._my_test_dir, self._checkout_dir) fork_file = os.path.join(checkout_dir, self._simple_ext_fork_name, "readme.txt") self.assertTrue(os.path.exists(fork_file)) - os.chdir(checkout_dir) + submods = git_submodule_status(checkout_dir) + print('checking status of', checkout_dir, ':', submods) self.assertEqual(len(submods.keys()), 1) self.assertTrue(self._simple_ext_fork_name in submods) submod = submods[self._simple_ext_fork_name] @@ -1713,7 +1674,6 @@ def test_submodule_checkout_bare(self): self.assertEqual(submod['status'], simple_ext_fork_status) self.assertTrue('tag' in submod) self.assertEqual(submod['tag'], simple_ext_fork_tag) - os.chdir(cwd) self.idempotence_check(checkout_dir) def test_submodule_checkout_none(self): @@ -1722,11 +1682,10 @@ def test_submodule_checkout_none(self): externals cfg file. Correct behavior is the submodle is not checked out. """ - self.create_externals_file(branch_name=self._bare_branch_name, - sub_externals="none") - overall, _ = self.execute_cmd_in_dir(self._my_test_dir, - self.checkout_args) - self.assertTrue(overall == 0) + self.write_externals_config(branch_name=self._bare_branch_name, + sub_externals="none") + self.execute_checkout_in_dir(self._my_test_dir, + self.checkout_args) cwd = os.getcwd() checkout_dir = os.path.join(self._my_test_dir, self._checkout_dir) fork_file = os.path.join(checkout_dir, @@ -1744,11 +1703,10 @@ def test_submodule_checkout_config(self): # pylint: disable=too-many-locals """ tag_check = None # Not checked out as submodule status_check = "-" # Not checked out as submodule - self.create_externals_file(branch_name=self._config_branch_name, - sub_externals=self._container_extern_name) - overall, _ = self.execute_cmd_in_dir(self._my_test_dir, - self.checkout_args) - self.assertTrue(overall == 0) + self.write_externals_config(branch_name=self._config_branch_name, + sub_externals=self._container_extern_name) + self.execute_checkout_in_dir(self._my_test_dir, + self.checkout_args) cwd = os.getcwd() checkout_dir = os.path.join(self._my_test_dir, self._checkout_dir) fork_file = os.path.join(checkout_dir, @@ -1810,17 +1768,20 @@ def test_error_unknown_protocol(self): """ # create repo - under_test_dir = self.setup_test_repo(CONTAINER_REPO_NAME) - self._generator.container_simple_required(under_test_dir) + cloned_repo_dir = self.clone_test_repo(CONTAINER_REPO) + self._generator.create_config() + self._generator.create_section(SIMPLE_REPO, BRANCH_SECTION, + branch=REMOTE_BRANCH_FEATURE2) + self._generator.write_config(cloned_repo_dir) # update the config file to point to a different remote with # the tag instead of branch. Tag MUST NOT be in the original # repo! - self._generator.update_protocol(under_test_dir, 'simp_branch', - 'this-protocol-does-not-exist') + self._generator.write_with_protocol(cloned_repo_dir, BRANCH_SECTION, + 'this-protocol-does-not-exist') with self.assertRaises(RuntimeError): - self.execute_cmd_in_dir(under_test_dir, self.checkout_args) + self.execute_checkout_in_dir(cloned_repo_dir, self.checkout_args) def test_error_switch_protocol(self): """Verify that a runtime error is raised when the user switches @@ -1831,15 +1792,18 @@ def test_error_switch_protocol(self): """ # create repo - under_test_dir = self.setup_test_repo(CONTAINER_REPO_NAME) - self._generator.container_simple_required(under_test_dir) + cloned_repo_dir = self.clone_test_repo(CONTAINER_REPO) + self._generator.create_config() + self._generator.create_section(SIMPLE_REPO, BRANCH_SECTION, + branch=REMOTE_BRANCH_FEATURE2) + self._generator.write_config(cloned_repo_dir) # update the config file to point to a different remote with # the tag instead of branch. Tag MUST NOT be in the original # repo! - self._generator.update_protocol(under_test_dir, 'simp_branch', 'svn') + self._generator.write_with_protocol(cloned_repo_dir, BRANCH_SECTION, 'svn') with self.assertRaises(RuntimeError): - self.execute_cmd_in_dir(under_test_dir, self.checkout_args) + self.execute_checkout_in_dir(cloned_repo_dir, self.checkout_args) def test_error_unknown_tag(self): """Verify that a runtime error is raised when the user specified tag @@ -1847,17 +1811,21 @@ def test_error_unknown_tag(self): """ # create repo - under_test_dir = self.setup_test_repo(CONTAINER_REPO_NAME) - self._generator.container_simple_required(under_test_dir) + cloned_repo_dir = self.clone_test_repo(CONTAINER_REPO) + self._generator.create_config() + self._generator.create_section(SIMPLE_REPO, BRANCH_SECTION, + branch=REMOTE_BRANCH_FEATURE2) + self._generator.write_config(cloned_repo_dir) # update the config file to point to a different remote with # the tag instead of branch. Tag MUST NOT be in the original # repo! - self._generator.update_tag(under_test_dir, 'simp_branch', - 'this-tag-does-not-exist', SIMPLE_REPO_NAME) + self._generator.write_with_tag_and_remote_repo(cloned_repo_dir, BRANCH_SECTION, + tag='this-tag-does-not-exist', + new_remote_repo_path=SIMPLE_REPO) with self.assertRaises(RuntimeError): - self.execute_cmd_in_dir(under_test_dir, self.checkout_args) + self.execute_checkout_in_dir(cloned_repo_dir, self.checkout_args) def test_error_overspecify_tag_branch(self): """Verify that a runtime error is raised when the user specified both @@ -1865,18 +1833,22 @@ def test_error_overspecify_tag_branch(self): """ # create repo - under_test_dir = self.setup_test_repo(CONTAINER_REPO_NAME) - self._generator.container_simple_required(under_test_dir) + cloned_repo_dir = self.clone_test_repo(CONTAINER_REPO) + self._generator.create_config() + self._generator.create_section(SIMPLE_REPO, BRANCH_SECTION, + branch=REMOTE_BRANCH_FEATURE2) + self._generator.write_config(cloned_repo_dir) # update the config file to point to a different remote with # the tag instead of branch. Tag MUST NOT be in the original # repo! - self._generator.update_tag(under_test_dir, 'simp_branch', - 'this-tag-does-not-exist', SIMPLE_REPO_NAME, - remove_branch=False) + self._generator.write_with_tag_and_remote_repo(cloned_repo_dir, BRANCH_SECTION, + tag='this-tag-does-not-exist', + new_remote_repo_path=SIMPLE_REPO, + remove_branch=False) with self.assertRaises(RuntimeError): - self.execute_cmd_in_dir(under_test_dir, self.checkout_args) + self.execute_checkout_in_dir(cloned_repo_dir, self.checkout_args) def test_error_underspecify_tag_branch(self): """Verify that a runtime error is raised when the user specified @@ -1884,17 +1856,19 @@ def test_error_underspecify_tag_branch(self): """ # create repo - under_test_dir = self.setup_test_repo(CONTAINER_REPO_NAME) - self._generator.container_simple_required(under_test_dir) + cloned_repo_dir = self.clone_test_repo(CONTAINER_REPO) + self._generator.create_config() + self._generator.create_section(SIMPLE_REPO, BRANCH_SECTION, + branch=REMOTE_BRANCH_FEATURE2) + self._generator.write_config(cloned_repo_dir) # update the config file to point to a different remote with # the tag instead of branch. Tag MUST NOT be in the original # repo! - self._generator.update_underspecify_branch_tag(under_test_dir, - 'simp_branch') + self._generator.write_without_branch_tag(cloned_repo_dir, BRANCH_SECTION) with self.assertRaises(RuntimeError): - self.execute_cmd_in_dir(under_test_dir, self.checkout_args) + self.execute_checkout_in_dir(cloned_repo_dir, self.checkout_args) def test_error_missing_url(self): """Verify that a runtime error is raised when the user specified @@ -1902,17 +1876,20 @@ def test_error_missing_url(self): """ # create repo - under_test_dir = self.setup_test_repo(CONTAINER_REPO_NAME) - self._generator.container_simple_required(under_test_dir) + cloned_repo_dir = self.clone_test_repo(CONTAINER_REPO) + self._generator.create_config() + self._generator.create_section(SIMPLE_REPO, BRANCH_SECTION, + branch=REMOTE_BRANCH_FEATURE2) + self._generator.write_config(cloned_repo_dir) # update the config file to point to a different remote with # the tag instead of branch. Tag MUST NOT be in the original # repo! - self._generator.update_underspecify_remove_url(under_test_dir, - 'simp_branch') + self._generator.write_without_repo_url(cloned_repo_dir, + BRANCH_SECTION) with self.assertRaises(RuntimeError): - self.execute_cmd_in_dir(under_test_dir, self.checkout_args) + self.execute_checkout_in_dir(cloned_repo_dir, self.checkout_args) if __name__ == '__main__': diff --git a/manage_externals/test/test_sys_repository_git.py b/manage_externals/test/test_sys_repository_git.py index f6dbf84284..7e5fb5020d 100644 --- a/manage_externals/test/test_sys_repository_git.py +++ b/manage_externals/test/test_sys_repository_git.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """Tests of some of the functionality in repository_git.py that actually interacts with git repositories. @@ -131,12 +131,12 @@ def tearDown(self): shutil.rmtree(self._tmpdir, ignore_errors=True) @staticmethod - def make_git_repo(): + def make_cwd_git_repo(): """Turn the current directory into an empty git repository""" execute_subprocess(['git', 'init']) @staticmethod - def add_git_commit(): + def add_cwd_git_commit(): """Add a git commit in the current directory""" with open('README', 'a') as myfile: myfile.write('more info') @@ -144,17 +144,17 @@ def add_git_commit(): execute_subprocess(['git', 'commit', '-m', 'my commit message']) @staticmethod - def checkout_git_branch(branchname): + def checkout_cwd_git_branch(branchname): """Checkout a new branch in the current directory""" execute_subprocess(['git', 'checkout', '-b', branchname]) @staticmethod - def make_git_tag(tagname): + def make_cwd_git_tag(tagname): """Make a lightweight tag at the current commit""" execute_subprocess(['git', 'tag', '-m', 'making a tag', tagname]) @staticmethod - def checkout_ref(refname): + def checkout_cwd_ref(refname): """Checkout the given refname in the current directory""" execute_subprocess(['git', 'checkout', refname]) @@ -164,72 +164,72 @@ def checkout_ref(refname): def test_currentHash_returnsHash(self): """Ensure that the _git_current_hash function returns a hash""" - self.make_git_repo() - self.add_git_commit() - hash_found, myhash = self._repo._git_current_hash() + self.make_cwd_git_repo() + self.add_cwd_git_commit() + hash_found, myhash = self._repo._git_current_hash(os.getcwd()) self.assertTrue(hash_found) self.assertIsHash(myhash) def test_currentHash_outsideGitRepo(self): """Ensure that the _git_current_hash function returns False when outside a git repository""" - hash_found, myhash = self._repo._git_current_hash() + hash_found, myhash = self._repo._git_current_hash(os.getcwd()) self.assertFalse(hash_found) self.assertEqual('', myhash) def test_currentBranch_onBranch(self): """Ensure that the _git_current_branch function returns the name of the branch""" - self.make_git_repo() - self.add_git_commit() - self.checkout_git_branch('foo') - branch_found, mybranch = self._repo._git_current_branch() + self.make_cwd_git_repo() + self.add_cwd_git_commit() + self.checkout_cwd_git_branch('foo') + branch_found, mybranch = self._repo._git_current_branch(os.getcwd()) self.assertTrue(branch_found) self.assertEqual('foo', mybranch) def test_currentBranch_notOnBranch(self): """Ensure that the _git_current_branch function returns False when not on a branch""" - self.make_git_repo() - self.add_git_commit() - self.make_git_tag('mytag') - self.checkout_ref('mytag') - branch_found, mybranch = self._repo._git_current_branch() + self.make_cwd_git_repo() + self.add_cwd_git_commit() + self.make_cwd_git_tag('mytag') + self.checkout_cwd_ref('mytag') + branch_found, mybranch = self._repo._git_current_branch(os.getcwd()) self.assertFalse(branch_found) self.assertEqual('', mybranch) def test_currentBranch_outsideGitRepo(self): """Ensure that the _git_current_branch function returns False when outside a git repository""" - branch_found, mybranch = self._repo._git_current_branch() + branch_found, mybranch = self._repo._git_current_branch(os.getcwd()) self.assertFalse(branch_found) self.assertEqual('', mybranch) def test_currentTag_onTag(self): """Ensure that the _git_current_tag function returns the name of the tag""" - self.make_git_repo() - self.add_git_commit() - self.make_git_tag('some_tag') - tag_found, mytag = self._repo._git_current_tag() + self.make_cwd_git_repo() + self.add_cwd_git_commit() + self.make_cwd_git_tag('some_tag') + tag_found, mytag = self._repo._git_current_tag(os.getcwd()) self.assertTrue(tag_found) self.assertEqual('some_tag', mytag) def test_currentTag_notOnTag(self): """Ensure tha the _git_current_tag function returns False when not on a tag""" - self.make_git_repo() - self.add_git_commit() - self.make_git_tag('some_tag') - self.add_git_commit() - tag_found, mytag = self._repo._git_current_tag() + self.make_cwd_git_repo() + self.add_cwd_git_commit() + self.make_cwd_git_tag('some_tag') + self.add_cwd_git_commit() + tag_found, mytag = self._repo._git_current_tag(os.getcwd()) self.assertFalse(tag_found) self.assertEqual('', mytag) def test_currentTag_outsideGitRepo(self): """Ensure that the _git_current_tag function returns False when outside a git repository""" - tag_found, mytag = self._repo._git_current_tag() + tag_found, mytag = self._repo._git_current_tag(os.getcwd()) self.assertFalse(tag_found) self.assertEqual('', mytag) diff --git a/manage_externals/test/test_unit_externals_description.py b/manage_externals/test/test_unit_externals_description.py index 637f760ee5..30e5288499 100644 --- a/manage_externals/test/test_unit_externals_description.py +++ b/manage_externals/test/test_unit_externals_description.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """Unit test driver for checkout_externals @@ -342,6 +342,40 @@ def setup_config(self): # NOTE(goldy, 2019-03) Should test other possible keywords such as # fetchRecurseSubmodules, ignore, and shallow + @staticmethod + def setup_dict_config(): + """Create the full container dictionary with simple and mixed use + externals + + """ + rdatat = {ExternalsDescription.PROTOCOL: 'git', + ExternalsDescription.REPO_URL: 'simple-ext.git', + ExternalsDescription.TAG: 'tag1'} + rdatab = {ExternalsDescription.PROTOCOL: 'git', + ExternalsDescription.REPO_URL: 'simple-ext.git', + ExternalsDescription.BRANCH: 'feature2'} + rdatam = {ExternalsDescription.PROTOCOL: 'git', + ExternalsDescription.REPO_URL: 'mixed-cont-ext.git', + ExternalsDescription.BRANCH: 'master'} + desc = {'simp_tag': {ExternalsDescription.REQUIRED: True, + ExternalsDescription.PATH: 'simp_tag', + ExternalsDescription.EXTERNALS: EMPTY_STR, + ExternalsDescription.REPO: rdatat}, + 'simp_branch' : {ExternalsDescription.REQUIRED: True, + ExternalsDescription.PATH: 'simp_branch', + ExternalsDescription.EXTERNALS: EMPTY_STR, + ExternalsDescription.REPO: rdatab}, + 'simp_opt': {ExternalsDescription.REQUIRED: False, + ExternalsDescription.PATH: 'simp_opt', + ExternalsDescription.EXTERNALS: EMPTY_STR, + ExternalsDescription.REPO: rdatat}, + 'mixed_req': {ExternalsDescription.REQUIRED: True, + ExternalsDescription.PATH: 'mixed_req', + ExternalsDescription.EXTERNALS: 'sub-ext.cfg', + ExternalsDescription.REPO: rdatam}} + + return desc + def test_cfg_v1_ok(self): """Test that a correct cfg v1 object is created by create_externals_description @@ -379,6 +413,49 @@ def test_dict(self): ext = create_externals_description(desc, model_format='dict') self.assertIsInstance(ext, ExternalsDescriptionDict) + def test_cfg_component_dict(self): + """Verify that create_externals_description works with a dictionary + """ + # create the top level externals file + desc = self.setup_dict_config() + # Check external with all repos + external = create_externals_description(desc, model_format='dict') + self.assertIsInstance(external, ExternalsDescriptionDict) + self.assertTrue('simp_tag' in external) + self.assertTrue('simp_branch' in external) + self.assertTrue('simp_opt' in external) + self.assertTrue('mixed_req' in external) + + def test_cfg_exclude_component_dict(self): + """Verify that exclude component checkout works with a dictionary + """ + # create the top level externals file + desc = self.setup_dict_config() + # Test an excluded repo + external = create_externals_description(desc, model_format='dict', + exclude=['simp_tag', + 'simp_opt']) + self.assertIsInstance(external, ExternalsDescriptionDict) + self.assertFalse('simp_tag' in external) + self.assertTrue('simp_branch' in external) + self.assertFalse('simp_opt' in external) + self.assertTrue('mixed_req' in external) + + def test_cfg_opt_component_dict(self): + """Verify that exclude component checkout works with a dictionary + """ + # create the top level externals file + desc = self.setup_dict_config() + # Test an excluded repo + external = create_externals_description(desc, model_format='dict', + components=['simp_tag', + 'simp_opt']) + self.assertIsInstance(external, ExternalsDescriptionDict) + self.assertTrue('simp_tag' in external) + self.assertFalse('simp_branch' in external) + self.assertTrue('simp_opt' in external) + self.assertFalse('mixed_req' in external) + def test_cfg_unknown_version(self): """Test that a runtime error is raised when an unknown file version is received diff --git a/manage_externals/test/test_unit_externals_status.py b/manage_externals/test/test_unit_externals_status.py index f8e953f756..f019514e9e 100644 --- a/manage_externals/test/test_unit_externals_status.py +++ b/manage_externals/test/test_unit_externals_status.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """Unit test driver for the manic external status reporting module. diff --git a/manage_externals/test/test_unit_repository.py b/manage_externals/test/test_unit_repository.py index 5b9c242fd3..1b93861834 100644 --- a/manage_externals/test/test_unit_repository.py +++ b/manage_externals/test/test_unit_repository.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """Unit test driver for checkout_externals diff --git a/manage_externals/test/test_unit_repository_git.py b/manage_externals/test/test_unit_repository_git.py index 4a0a334bb1..1c01098acf 100644 --- a/manage_externals/test/test_unit_repository_git.py +++ b/manage_externals/test/test_unit_repository_git.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """Unit test driver for checkout_externals @@ -67,7 +67,7 @@ def setUp(self): def _git_current_branch(branch_found, branch_name): """Return a function that takes the place of repo._git_current_branch, which returns the given output.""" - def my_git_current_branch(): + def my_git_current_branch(dirname): """mock function that can take the place of repo._git_current_branch""" return branch_found, branch_name return my_git_current_branch @@ -76,7 +76,7 @@ def my_git_current_branch(): def _git_current_tag(tag_found, tag_name): """Return a function that takes the place of repo._git_current_tag, which returns the given output.""" - def my_git_current_tag(): + def my_git_current_tag(dirname): """mock function that can take the place of repo._git_current_tag""" return tag_found, tag_name return my_git_current_tag @@ -85,7 +85,7 @@ def my_git_current_tag(): def _git_current_hash(hash_found, hash_name): """Return a function that takes the place of repo._git_current_hash, which returns the given output.""" - def my_git_current_hash(): + def my_git_current_hash(dirname): """mock function that can take the place of repo._git_current_hash""" return hash_found, hash_name return my_git_current_hash @@ -101,8 +101,8 @@ def test_ref_branch(self): True, 'feature3') self._repo._git_current_tag = self._git_current_tag(True, 'foo_tag') self._repo._git_current_hash = self._git_current_hash(True, 'abc123') - expected = 'feature3' - result = self._repo._current_ref() + expected = 'foo_tag (branch feature3)' + result = self._repo._current_ref(os.getcwd()) self.assertEqual(result, expected) def test_ref_detached_tag(self): @@ -112,7 +112,7 @@ def test_ref_detached_tag(self): self._repo._git_current_tag = self._git_current_tag(True, 'foo_tag') self._repo._git_current_hash = self._git_current_hash(True, 'abc123') expected = 'foo_tag' - result = self._repo._current_ref() + result = self._repo._current_ref(os.getcwd()) self.assertEqual(result, expected) def test_ref_detached_hash(self): @@ -123,7 +123,7 @@ def test_ref_detached_hash(self): self._repo._git_current_tag = self._git_current_tag(False, '') self._repo._git_current_hash = self._git_current_hash(True, 'abc123') expected = 'abc123' - result = self._repo._current_ref() + result = self._repo._current_ref(os.getcwd()) self.assertEqual(result, expected) def test_ref_none(self): @@ -132,7 +132,7 @@ def test_ref_none(self): self._repo._git_current_branch = self._git_current_branch(False, '') self._repo._git_current_tag = self._git_current_tag(False, '') self._repo._git_current_hash = self._git_current_hash(False, '') - result = self._repo._current_ref() + result = self._repo._current_ref(os.getcwd()) self.assertEqual(result, EMPTY_STR) @@ -206,11 +206,19 @@ def setUp(self): self._repo._current_ref = self._current_ref_empty self._create_tmp_git_dir() + # We have to override this class method rather than the self._repo + # instance method because it is called via + # GitRepository._remote_name_for_url, which is itself a @classmethod + # calls cls._git_remote_verbose(). + self._orignal_git_remote_verbose = GitRepository._git_remote_verbose + GitRepository._git_remote_verbose = self._git_remote_origin_upstream def tearDown(self): """Cleanup tmp stuff on the file system """ self._remove_tmp_git_dir() + GitRepository._git_remote_verbose = self._orignal_git_remote_verbose + def _create_tmp_git_dir(self): """Create a temporary fake git directory for testing purposes. """ @@ -227,29 +235,27 @@ def _remove_tmp_git_dir(self): # mock methods replacing git system calls # @staticmethod - def _current_ref_empty(): + def _current_ref_empty(dirname): """Return an empty string. + + Drop-in for GitRepository._current_ref """ return EMPTY_STR @staticmethod - def _git_remote_origin_upstream(): - """Return an info string that is a checkout hash - """ - return GIT_REMOTE_OUTPUT_ORIGIN_UPSTREAM + def _git_remote_origin_upstream(dirname): + """Return an info string that is a checkout hash. - @staticmethod - def _git_remote_none(): - """Return an info string that is a checkout hash + Drop-in for GitRepository._git_remote_verbose. """ - return EMPTY_STR + return GIT_REMOTE_OUTPUT_ORIGIN_UPSTREAM @staticmethod def _git_current_hash(myhash): """Return a function that takes the place of repo._git_current_hash, which returns the given hash """ - def my_git_current_hash(): + def my_git_current_hash(dirname): """mock function that can take the place of repo._git_current_hash""" return 0, myhash return my_git_current_hash @@ -263,7 +269,7 @@ def _git_revparse_commit(self, expected_ref, mystatus, myhash): status = 0 implies success, non-zero implies failure """ - def my_git_revparse_commit(ref): + def my_git_revparse_commit(ref, dirname): """mock function that can take the place of repo._git_revparse_commit""" self.assertEqual(expected_ref, ref) return mystatus, myhash @@ -291,9 +297,6 @@ def test_sync_dir_exist_no_git_info(self): """Test that a non-existent git repo returns an unknown status """ stat = ExternalStatus() - # Now we over-ride the _git_remote_verbose method on the repo to return - # a known value without requiring access to git. - self._repo._git_remote_verbose = self._git_remote_origin_upstream self._repo._tag = 'tag1' self._repo._git_current_hash = self._git_current_hash('') self._repo._git_revparse_commit = self._git_revparse_commit( @@ -313,7 +316,6 @@ def test_sync_invalid_reference(self): """Test that an invalid reference returns out-of-sync """ stat = ExternalStatus() - self._repo._git_remote_verbose = self._git_remote_origin_upstream self._repo._tag = 'tag1' self._repo._git_current_hash = self._git_current_hash('abc123') self._repo._git_revparse_commit = self._git_revparse_commit( @@ -333,7 +335,6 @@ def test_sync_tag_on_same_hash(self): """ stat = ExternalStatus() - self._repo._git_remote_verbose = self._git_remote_origin_upstream self._repo._tag = 'tag1' self._repo._git_current_hash = self._git_current_hash('abc123') self._repo._git_revparse_commit = self._git_revparse_commit( @@ -348,7 +349,6 @@ def test_sync_tag_on_different_hash(self): """ stat = ExternalStatus() - self._repo._git_remote_verbose = self._git_remote_origin_upstream self._repo._tag = 'tag1' self._repo._git_current_hash = self._git_current_hash('def456') self._repo._git_revparse_commit = self._git_revparse_commit( @@ -368,7 +368,6 @@ def test_sync_hash_on_same_hash(self): """ stat = ExternalStatus() - self._repo._git_remote_verbose = self._git_remote_origin_upstream self._repo._tag = '' self._repo._hash = 'abc' self._repo._git_current_hash = self._git_current_hash('abc123') @@ -384,7 +383,6 @@ def test_sync_hash_on_different_hash(self): """ stat = ExternalStatus() - self._repo._git_remote_verbose = self._git_remote_origin_upstream self._repo._tag = '' self._repo._hash = 'abc' self._repo._git_current_hash = self._git_current_hash('def456') @@ -405,7 +403,6 @@ def test_sync_branch_on_same_hash(self): """ stat = ExternalStatus() - self._repo._git_remote_verbose = self._git_remote_origin_upstream self._repo._branch = 'feature-2' self._repo._tag = '' self._repo._git_current_hash = self._git_current_hash('abc123') @@ -421,7 +418,6 @@ def test_sync_branch_on_diff_hash(self): """ stat = ExternalStatus() - self._repo._git_remote_verbose = self._git_remote_origin_upstream self._repo._branch = 'feature-2' self._repo._tag = '' self._repo._git_current_hash = self._git_current_hash('abc123') @@ -433,11 +429,10 @@ def test_sync_branch_on_diff_hash(self): self.assertEqual(stat.clean_state, ExternalStatus.DEFAULT) def test_sync_branch_diff_remote(self): - """Test _determine_remote_name with a different remote + """Test _remote_name_for_url with a different remote """ stat = ExternalStatus() - self._repo._git_remote_verbose = self._git_remote_origin_upstream self._repo._branch = 'feature-2' self._repo._tag = '' self._repo._url = '/path/to/other/repo' @@ -449,11 +444,10 @@ def test_sync_branch_diff_remote(self): # expected argument def test_sync_branch_diff_remote2(self): - """Test _determine_remote_name with a different remote + """Test _remote_name_for_url with a different remote """ stat = ExternalStatus() - self._repo._git_remote_verbose = self._git_remote_origin_upstream self._repo._branch = 'feature-2' self._repo._tag = '' self._repo._url = '/path/to/local/repo2' @@ -469,7 +463,6 @@ def test_sync_branch_on_unknown_remote(self): """ stat = ExternalStatus() - self._repo._git_remote_verbose = self._git_remote_origin_upstream self._repo._branch = 'feature-2' self._repo._tag = '' self._repo._url = '/path/to/unknown/repo' @@ -491,7 +484,6 @@ def test_sync_branch_on_untracked_local(self): """ stat = ExternalStatus() - self._repo._git_remote_verbose = self._git_remote_origin_upstream self._repo._branch = 'feature3' self._repo._tag = '' self._repo._url = '.' @@ -611,24 +603,20 @@ def setUp(self): self._repo = GitRepository('test', repo) @staticmethod - def _shell_true(url, remote=None): - _ = url - _ = remote + def _shell_true(*args, **kwargs): return 0 @staticmethod - def _shell_false(url, remote=None): - _ = url - _ = remote + def _shell_false(*args, **kwargs): return 1 @staticmethod - def _mock_function_true(ref): + def _mock_revparse_commit(ref, dirname): _ = ref return (TestValidRef._shell_true, '97ebc0e0deadc0de') @staticmethod - def _mock_function_false(ref): + def _mock_revparse_commit_false(ref, dirname): _ = ref return (TestValidRef._shell_false, '97ebc0e0deadc0de') @@ -638,10 +626,11 @@ def test_tag_not_tag_branch_commit(self): self._repo._git_showref_tag = self._shell_false self._repo._git_showref_branch = self._shell_false self._repo._git_lsremote_branch = self._shell_false - self._repo._git_revparse_commit = self._mock_function_false + self._repo._git_revparse_commit = self._mock_revparse_commit_false self._repo._tag = 'something' remote_name = 'origin' - received, _ = self._repo._is_unique_tag(self._repo._tag, remote_name) + received, _ = self._repo._is_unique_tag(self._repo._tag, remote_name, + os.getcwd()) self.assertFalse(received) def test_tag_not_tag(self): @@ -650,10 +639,11 @@ def test_tag_not_tag(self): self._repo._git_showref_tag = self._shell_false self._repo._git_showref_branch = self._shell_true self._repo._git_lsremote_branch = self._shell_true - self._repo._git_revparse_commit = self._mock_function_false + self._repo._git_revparse_commit = self._mock_revparse_commit_false self._repo._tag = 'tag1' remote_name = 'origin' - received, _ = self._repo._is_unique_tag(self._repo._tag, remote_name) + received, _ = self._repo._is_unique_tag(self._repo._tag, remote_name, + os.getcwd()) self.assertFalse(received) def test_tag_indeterminant(self): @@ -662,10 +652,11 @@ def test_tag_indeterminant(self): self._repo._git_showref_tag = self._shell_true self._repo._git_showref_branch = self._shell_true self._repo._git_lsremote_branch = self._shell_true - self._repo._git_revparse_commit = self._mock_function_true + self._repo._git_revparse_commit = self._mock_revparse_commit self._repo._tag = 'something' remote_name = 'origin' - received, _ = self._repo._is_unique_tag(self._repo._tag, remote_name) + received, _ = self._repo._is_unique_tag(self._repo._tag, remote_name, + os.getcwd()) self.assertFalse(received) def test_tag_is_unique(self): @@ -674,10 +665,11 @@ def test_tag_is_unique(self): self._repo._git_showref_tag = self._shell_true self._repo._git_showref_branch = self._shell_false self._repo._git_lsremote_branch = self._shell_false - self._repo._git_revparse_commit = self._mock_function_true + self._repo._git_revparse_commit = self._mock_revparse_commit self._repo._tag = 'tag1' remote_name = 'origin' - received, _ = self._repo._is_unique_tag(self._repo._tag, remote_name) + received, _ = self._repo._is_unique_tag(self._repo._tag, remote_name, + os.getcwd()) self.assertTrue(received) def test_tag_is_not_hash(self): @@ -686,10 +678,11 @@ def test_tag_is_not_hash(self): self._repo._git_showref_tag = self._shell_false self._repo._git_showref_branch = self._shell_false self._repo._git_lsremote_branch = self._shell_false - self._repo._git_revparse_commit = self._mock_function_true + self._repo._git_revparse_commit = self._mock_revparse_commit self._repo._tag = '97ebc0e0' remote_name = 'origin' - received, _ = self._repo._is_unique_tag(self._repo._tag, remote_name) + received, _ = self._repo._is_unique_tag(self._repo._tag, remote_name, + os.getcwd()) self.assertFalse(received) def test_hash_is_commit(self): @@ -698,10 +691,11 @@ def test_hash_is_commit(self): self._repo._git_showref_tag = self._shell_false self._repo._git_showref_branch = self._shell_false self._repo._git_lsremote_branch = self._shell_false - self._repo._git_revparse_commit = self._mock_function_true + self._repo._git_revparse_commit = self._mock_revparse_commit self._repo._tag = '97ebc0e0' remote_name = 'origin' - received, _ = self._repo._is_unique_tag(self._repo._tag, remote_name) + received, _ = self._repo._is_unique_tag(self._repo._tag, remote_name, + os.getcwd()) self.assertFalse(received) @@ -746,13 +740,14 @@ def _shell_false(url, remote=None): return 1 @staticmethod - def _mock_function_false(ref): + def _mock_revparse_commit_false(ref, dirname): _ = ref return (TestValidRef._shell_false, '') @staticmethod - def _mock_function_true(ref): + def _mock_revparse_commit_true(ref, dirname): _ = ref + _ = dirname return (TestValidRef._shell_true, '') def test_valid_ref_is_invalid(self): @@ -761,10 +756,12 @@ def test_valid_ref_is_invalid(self): self._repo._git_showref_tag = self._shell_false self._repo._git_showref_branch = self._shell_false self._repo._git_lsremote_branch = self._shell_false - self._repo._git_revparse_commit = self._mock_function_false + self._repo._git_revparse_commit = self._mock_revparse_commit_false self._repo._tag = 'invalid_ref' with self.assertRaises(RuntimeError): - self._repo._check_for_valid_ref(self._repo._tag) + self._repo._check_for_valid_ref(self._repo._tag, + remote_name=None, + dirname=os.getcwd()) def test_valid_tag(self): """Verify a valid tag return true @@ -772,9 +769,11 @@ def test_valid_tag(self): self._repo._git_showref_tag = self._shell_true self._repo._git_showref_branch = self._shell_false self._repo._git_lsremote_branch = self._shell_false - self._repo._git_revparse_commit = self._mock_function_true + self._repo._git_revparse_commit = self._mock_revparse_commit_true self._repo._tag = 'tag1' - received = self._repo._check_for_valid_ref(self._repo._tag) + received = self._repo._check_for_valid_ref(self._repo._tag, + remote_name=None, + dirname=os.getcwd()) self.assertTrue(received) def test_valid_branch(self): @@ -783,24 +782,28 @@ def test_valid_branch(self): self._repo._git_showref_tag = self._shell_false self._repo._git_showref_branch = self._shell_true self._repo._git_lsremote_branch = self._shell_false - self._repo._git_revparse_commit = self._mock_function_true + self._repo._git_revparse_commit = self._mock_revparse_commit_true self._repo._tag = 'tag1' - received = self._repo._check_for_valid_ref(self._repo._tag) + received = self._repo._check_for_valid_ref(self._repo._tag, + remote_name=None, + dirname=os.getcwd()) self.assertTrue(received) def test_valid_hash(self): """Verify a valid hash return true """ - def _mock_revparse_commit(ref): + def _mock_revparse_commit_true(ref, dirname): _ = ref return (0, '56cc0b539426eb26810af9e') self._repo._git_showref_tag = self._shell_false self._repo._git_showref_branch = self._shell_false self._repo._git_lsremote_branch = self._shell_false - self._repo._git_revparse_commit = _mock_revparse_commit + self._repo._git_revparse_commit = _mock_revparse_commit_true self._repo._hash = '56cc0b5394' - received = self._repo._check_for_valid_ref(self._repo._hash) + received = self._repo._check_for_valid_ref(self._repo._hash, + remote_name=None, + dirname=os.getcwd()) self.assertTrue(received) diff --git a/manage_externals/test/test_unit_repository_svn.py b/manage_externals/test/test_unit_repository_svn.py old mode 100644 new mode 100755 index 7ff31c4218..d9309df7f6 --- a/manage_externals/test/test_unit_repository_svn.py +++ b/manage_externals/test/test_unit_repository_svn.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """Unit test driver for checkout_externals @@ -60,7 +60,7 @@ def setUp(self): self._name = 'component' rdata = {ExternalsDescription.PROTOCOL: 'svn', ExternalsDescription.REPO_URL: - 'https://svn-ccsm-models.cgd.ucar.edu/', + 'https://svn-ccsm-models.cgd.ucar.edu', ExternalsDescription.TAG: 'mosart/trunk_tags/mosart1_0_26', } diff --git a/manage_externals/test/test_unit_utils.py b/manage_externals/test/test_unit_utils.py index c994e58ebe..80e1636649 100644 --- a/manage_externals/test/test_unit_utils.py +++ b/manage_externals/test/test_unit_utils.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """Unit test driver for checkout_externals diff --git a/src/chemistry/mozart/chemistry.F90 b/src/chemistry/mozart/chemistry.F90 index ddbfd27ce7..ff42e870d9 100644 --- a/src/chemistry/mozart/chemistry.F90 +++ b/src/chemistry/mozart/chemistry.F90 @@ -23,6 +23,7 @@ module chemistry use mo_apex, only : mo_apex_readnl use ref_pres, only : ptop_ref use phys_control, only : waccmx_is ! WACCM-X switch query function + use phys_control, only : use_hemco ! HEMCO switch logical implicit none private @@ -79,10 +80,10 @@ module chemistry character(len=shr_kind_cl) :: depvel_lnd_file = 'depvel_lnd_file' ! emis - + integer, parameter :: max_num_emis_files = max(100,2*pcnst) character(len=shr_kind_cl) :: airpl_emis_file = '' ! airplane emissions - character(len=shr_kind_cl) :: srf_emis_specifier(pcnst) = '' - character(len=shr_kind_cl) :: ext_frc_specifier(pcnst) = '' + character(len=shr_kind_cl) :: srf_emis_specifier(max_num_emis_files) = '' + character(len=shr_kind_cl) :: ext_frc_specifier(max_num_emis_files) = '' character(len=24) :: srf_emis_type = 'CYCLICAL' ! 'CYCLICAL' | 'SERIAL' | 'INTERP_MISSING_MONTHS' integer :: srf_emis_cycle_yr = 0 @@ -131,6 +132,7 @@ module chemistry logical :: chem_use_chemtrop = .false. integer :: srf_ozone_pbf_ndx = -1 + logical :: srf_emis_diag(pcnst) = .false. !================================================================================================ contains @@ -639,7 +641,8 @@ subroutine chem_init(phys_state, pbuf2d) use constituents, only : sflxnam use fire_emissions, only : fire_emissions_init use short_lived_species, only : short_lived_species_initic - use ocean_emis, only : ocean_emis_init + use ocean_emis, only : ocean_emis_init, ocean_emis_species + use mo_srf_emissions, only : has_emis type(physics_buffer_desc), pointer :: pbuf2d(:,:) type(physics_state), intent(in):: phys_state(begchunk:endchunk) @@ -650,7 +653,7 @@ subroutine chem_init(phys_state, pbuf2d) !----------------------------------------------------------------------- integer :: m ! tracer indicies character(len=fieldname_len) :: spc_name - integer :: n, ii + integer :: n, ii, ierr logical :: history_aerosol logical :: history_chemistry logical :: history_cesm_forcing @@ -661,6 +664,8 @@ subroutine chem_init(phys_state, pbuf2d) ! liquid budgets. integer :: history_budget_histfile_num ! output history file number for budget fields + character(len=*), parameter :: prefix = 'chem_init: ' + call phys_getopts( cam_chempkg_out=chem_name, & history_aerosol_out=history_aerosol , & history_chemistry_out=history_chemistry , & @@ -694,42 +699,6 @@ subroutine chem_init(phys_state, pbuf2d) call addfld( 'HEIGHT', (/ 'ilev' /),'A','m', 'geopotential height above surface at interfaces (m)' ) call addfld( 'CT_H2O_GHG', (/ 'lev' /), 'A','kg/kg/s', 'ghg-chem h2o source/sink' ) -!----------------------------------------------------------------------- -! Set names of chemistry variable tendencies and declare them as history variables -!----------------------------------------------------------------------- - do m = 1,gas_pcnst - spc_name = solsym(m) - srcnam(m) = 'CT_' // spc_name ! chem tendancy (source/sink) - - call addfld( srcnam(m), (/ 'lev' /), 'A', 'kg/kg/s', trim(spc_name)//' source/sink' ) - call cnst_get_ind(solsym(m), n, abort=.false. ) - if ( n > 0 ) then - - if (sflxnam(n)(3:5) == 'num') then ! name is in the form of "SF****" - unit_basename = ' 1' - else - unit_basename = 'kg' - endif - - call addfld (sflxnam(n),horiz_only, 'A', unit_basename//'/m2/s',trim(solsym(m))//' surface flux') - if ( history_aerosol .or. history_chemistry ) then - call add_default( sflxnam(n), 1, ' ' ) - endif - - if ( history_cesm_forcing ) then - if ( spc_name == 'NO' .or. spc_name == 'NH3' ) then - call add_default( sflxnam(n), 1, ' ' ) - endif - endif - - endif - end do - - ! Add chemical tendency of water vapor to water budget output - if ( history_budget ) then - call add_default ('CT_H2O' , history_budget_histfile_num, ' ') - endif - !----------------------------------------------------------------------- ! Initialize chemistry modules !----------------------------------------------------------------------- @@ -757,67 +726,129 @@ subroutine chem_init(phys_state, pbuf2d) , ext_frc_fixed_ymd & , ext_frc_fixed_tod & , exo_coldens_file & + , use_hemco & , pbuf2d & ) - if ( ghg_chem ) then - call ghg_chem_init(phys_state, bndtvg, h2orates) - endif + if ( ghg_chem ) then + call ghg_chem_init(phys_state, bndtvg, h2orates) + endif + + call init_cfc11star(pbuf2d) + + ! MEGAN emissions initialize + if (shr_megan_mechcomps_n>0) then + + allocate( megan_indices_map(shr_megan_mechcomps_n), stat=ierr) + if( ierr /= 0 ) then + call endrun(prefix//'failed to allocate megan_indices_map') + end if + allocate( megan_wght_factors(shr_megan_mechcomps_n), stat=ierr) + if( ierr /= 0 ) then + call endrun(prefix//'failed to allocate megan_indices_map') + end if + megan_wght_factors(:) = nan + + do n=1,shr_megan_mechcomps_n + call cnst_get_ind (shr_megan_mechcomps(n)%name, megan_indices_map(n), abort=.false.) + ii = get_spc_ndx(shr_megan_mechcomps(n)%name) + if (ii>0) then + megan_wght_factors(n) = adv_mass(ii)*1.e-3_r8 ! kg/moles (to convert moles/m2/sec to kg/m2/sec) + else + call endrun( 'gas_phase_chemdr_inti: MEGAN compound not in chemistry mechanism : '& + //trim(shr_megan_mechcomps(n)%name)) + endif + + ! MEGAN history fields + call addfld( 'MEG_'//trim(shr_megan_mechcomps(n)%name),horiz_only,'A','kg/m2/sec',& + trim(shr_megan_mechcomps(n)%name)//' MEGAN emissions flux') + if (history_chemistry) then + call add_default('MEG_'//trim(shr_megan_mechcomps(n)%name), 1, ' ') + endif - call init_cfc11star(pbuf2d) + srf_emis_diag(megan_indices_map(n)) = .true. + enddo + endif - ! MEGAN emissions initialize - if (shr_megan_mechcomps_n>0) then + ! Galatic Cosmic Rays ... + call gcr_ionization_init() - allocate( megan_indices_map(shr_megan_mechcomps_n) ) - allocate( megan_wght_factors(shr_megan_mechcomps_n) ) - megan_wght_factors(:) = nan + ! Fire emissions ... + call fire_emissions_init() - do n=1,shr_megan_mechcomps_n - call cnst_get_ind (shr_megan_mechcomps(n)%name, megan_indices_map(n), abort=.false.) - ii = get_spc_ndx(shr_megan_mechcomps(n)%name) - if (ii>0) then - megan_wght_factors(n) = adv_mass(ii)*1.e-3_r8 ! kg/moles (to convert moles/m2/sec to kg/m2/sec) - else - call endrun( 'gas_phase_chemdr_inti: MEGAN compound not in chemistry mechanism : '& - //trim(shr_megan_mechcomps(n)%name)) - endif + call short_lived_species_initic() - ! MEGAN history fields - call addfld( 'MEG_'//trim(shr_megan_mechcomps(n)%name),horiz_only,'A','kg/m2/sec',& - trim(shr_megan_mechcomps(n)%name)//' MEGAN emissions flux') - if (history_chemistry) then - call add_default('MEG_'//trim(shr_megan_mechcomps(n)%name), 1, ' ') - endif + call ocean_emis_init() - enddo - endif + !----------------------------------------------------------------------- + ! Set names of chemistry variable tendencies and declare them as history variables + !----------------------------------------------------------------------- + do m = 1,gas_pcnst + spc_name = solsym(m) + srcnam(m) = 'CT_' // spc_name ! chem tendancy (source/sink) - ! Galatic Cosmic Rays ... - call gcr_ionization_init() + call addfld( srcnam(m), (/ 'lev' /), 'A', 'kg/kg/s', trim(spc_name)//' source/sink' ) + call cnst_get_ind(solsym(m), n, abort=.false.) - ! Fire emissions ... - call fire_emissions_init() + if ( n>0 ) then + if (has_emis(m) .or. aero_has_emis(solsym(m)) .or. ocean_emis_species(solsym(m)) .or. srf_emis_diag(n)) then + srf_emis_diag(n) = .true. - call short_lived_species_initic() + if (sflxnam(n)(3:5) == 'num') then ! name is in the form of "SF****" + unit_basename = ' 1' + else + unit_basename = 'kg' + endif - call ocean_emis_init() + call addfld (sflxnam(n),horiz_only, 'A', unit_basename//'/m2/s',trim(solsym(m))//' surface flux') + if ( history_aerosol .or. history_chemistry ) then + call add_default( sflxnam(n), 1, ' ' ) + endif - ! initialize srf ozone to zero - if (is_first_step() .and. srf_ozone_pbf_ndx>0) then - call pbuf_set_field(pbuf2d, srf_ozone_pbf_ndx, 0._r8) - end if + if ( history_cesm_forcing ) then + if ( spc_name == 'NO' .or. spc_name == 'NH3' ) then + call add_default( sflxnam(n), 1, ' ' ) + endif + endif + + endif + endif + end do + + ! Add chemical tendency of water vapor to water budget output + if ( history_budget ) then + call add_default ('CT_H2O' , history_budget_histfile_num, ' ') + endif + + ! initialize srf ozone to zero + if (is_first_step() .and. srf_ozone_pbf_ndx>0) then + call pbuf_set_field(pbuf2d, srf_ozone_pbf_ndx, 0._r8) + end if + + contains + + pure logical function aero_has_emis(spcname) + use seasalt_model, only: seasalt_names + use dust_model, only: dust_names + + character(len=*),intent(in) :: spcname + + aero_has_emis = any(seasalt_names(:) == spcname).or.any(dust_names(:) == spcname) + + end function aero_has_emis end subroutine chem_init !================================================================================ !================================================================================ - subroutine chem_emissions( state, cam_in ) + subroutine chem_emissions( state, cam_in, pbuf ) + use physics_buffer, only: physics_buffer_desc use aero_model, only: aero_model_emissions use camsrfexch, only: cam_in_t use constituents, only: sflxnam use cam_history, only: outfld use mo_srf_emissions, only: set_srf_emissions + use hco_cc_emissions, only: hco_set_srf_emissions use fire_emissions, only: fire_emissions_srf use ocean_emis, only: ocean_emis_getflux @@ -825,6 +856,7 @@ subroutine chem_emissions( state, cam_in ) type(physics_state), intent(in) :: state ! Physics state variables type(cam_in_t), intent(inout) :: cam_in ! import state + type(physics_buffer_desc), pointer :: pbuf(:) ! Physics buffer in chunk, for HEMCO ! local vars @@ -863,18 +895,29 @@ subroutine chem_emissions( state, cam_in ) endif - ! prescribed emissions from file ... + if ( use_hemco ) then + ! prescribed emissions from HEMCO ... - !----------------------------------------------------------------------- - ! ... Set surface emissions - !----------------------------------------------------------------------- - call set_srf_emissions( lchnk, ncol, sflx(:,:) ) + !----------------------------------------------------------------------- + ! ... Set surface emissions using HEMCO compatibility API + !----------------------------------------------------------------------- + call hco_set_srf_emissions( lchnk, ncol, sflx(:,:), pbuf ) + else + ! prescribed emissions from file ... + + !----------------------------------------------------------------------- + ! ... Set surface emissions + !----------------------------------------------------------------------- + call set_srf_emissions( lchnk, ncol, sflx(:,:) ) + endif do m = 1,pcnst n = map2chm(m) if ( n /= h2o_ndx .and. n > 0 ) then cam_in%cflx(:ncol,m) = cam_in%cflx(:ncol,m) + sflx(:ncol,n) - call outfld( sflxnam(m), cam_in%cflx(:ncol,m), ncol,lchnk ) + if (srf_emis_diag(m)) then + call outfld( sflxnam(m), cam_in%cflx(:ncol,m), ncol,lchnk ) + endif endif enddo @@ -1215,7 +1258,7 @@ subroutine chem_timestep_tend( state, ptend, cam_in, cam_out, dt, pbuf, fh2o) fsds, cam_in%ts, cam_in%asdir, cam_in%ocnfrac, cam_in%icefrac, & cam_out%precc, cam_out%precl, cam_in%snowhland, ghg_chem, state%latmapback, & drydepflx, wetdepflx, cam_in%cflx, cam_in%fireflx, cam_in%fireztop, & - nhx_nitrogen_flx, noy_nitrogen_flx, ptend%q, pbuf ) + nhx_nitrogen_flx, noy_nitrogen_flx, use_hemco, ptend%q, pbuf ) if (associated(cam_out%nhx_nitrogen_flx)) then cam_out%nhx_nitrogen_flx(:ncol) = nhx_nitrogen_flx(:ncol) endif diff --git a/src/chemistry/mozart/hco_cc_emissions.F90 b/src/chemistry/mozart/hco_cc_emissions.F90 new file mode 100644 index 0000000000..5cd98c6ba6 --- /dev/null +++ b/src/chemistry/mozart/hco_cc_emissions.F90 @@ -0,0 +1,384 @@ +!------------------------------------------------------------------------------ +! Harmonized Emissions Component (HEMCO) ! +!------------------------------------------------------------------------------ +!BOP +! +! !MODULE: hco_cc_emissions +! +! !DESCRIPTION: Module hco\_cc\_emissions provides emissions to CAM-chem in CESM. +! This module replaces mo\_extfrc and mo\_srf\_emissions in CAM-chem +! when HEMCO is enabled, otherwise they are not called if HEMCO-CESM is not +! enabled at runtime. +! +! These subroutines emulate the behavior of extfrc\_set (3-D emissions) +! and set\_srf\_emissions in CAM-chem for API compatibility. +!\\ +!\\ +! !INTERFACE: +! +module hco_cc_emissions +! +! !USES: +! + ! CESM types + use shr_kind_mod, only: r8 => shr_kind_r8 + + ! Run control + use spmd_utils, only: masterproc + use cam_abortutils, only: endrun + use cam_logfile, only: iulog + + ! Grid information + use ppgrid, only: pver, pverp + + ! Chemistry mechanism properties + use chem_mods, only: gas_pcnst + use mo_tracname, only: solsym + + ! Physics buffer operations + use physics_buffer, only: physics_buffer_desc + use physics_buffer, only: pbuf_get_field, pbuf_get_index + + ! Compat with XFRC diagn + use cam_history, only: outfld + use cam_history_support, only: max_fieldname_len + + implicit none + private +! +! !PUBLIC MEMBER FUNCTIONS: +! + public :: hco_extfrc_inti + public :: hco_set_srf_emissions, hco_set_extfrc +! +! !REMARKS: +! None +! +! !REVISION HISTORY: +! 08 Aug 2022 - H.P. Lin - Initial version +! 04 Nov 2022 - H.P. Lin - Now initialize extfrc fields in here +!EOP +!------------------------------------------------------------------------------ +!BOC + logical :: pcnst_is_extfrc(gas_pcnst) ! Is external forcing? (3-D data) + integer :: pcnst_extfrc_ndx(gas_pcnst) ! External forcing index from get_extfrc_ndx + integer :: hco_pbuf_idx(gas_pcnst) ! Physics buffer indices for HCO_* fields from HEMCO +contains +!EOC +!------------------------------------------------------------------------------ +! Harmonized Emissions Component (HEMCO) ! +!------------------------------------------------------------------------------ +!BOP +! +! !IROUTINE: hco_set_srf_emissions +! +! !DESCRIPTION: Sets surface level emissions (note, TOA is level 1, so this is level pver) +! for this latitude slice (chunk). +!\\ +!\\ +! !INTERFACE: +! + subroutine hco_set_srf_emissions( lchnk, ncol, sflx, pbuf ) +! +! !USES: +! + implicit none +! +! !INPUT PARAMETERS: +! + integer, intent(in) :: ncol ! columns in chunk + integer, intent(in) :: lchnk ! chunk index + real(r8), intent(out) :: sflx(:,:) ! surface emissions ( kg/m^2/s ) + type(physics_buffer_desc), pointer :: pbuf(:) ! pbuf in chunk +! +! !REVISION HISTORY: +! 08 Aug 2022 - H.P. Lin - Initial version +! 12 Jan 2023 - H.P. Lin - Check if pbuf is 2-D or 3-D first +! 09 Feb 2023 - H.P. Lin - For 3-D pbuf, no longer set cflx and use 3-D forcing only. +!EOP +!------------------------------------------------------------------------------ +!BOC +! +! !LOCAL VARIABLES: +! + integer :: n + + real(r8), pointer :: pbuf_ptr_3d(:,:) ! ptr to pbuf data (/pcols,pver/) + real(r8), pointer :: pbuf_ptr_2d(:) ! ptr to pbuf data (/pcols/) + integer :: tmpIdx ! pbuf field id + + ! reset sflx here. (same as mo_srf_emissions.F90) + ! sflx is defined in chem_emissions (chemistry.F90) but without default values, and is + ! later added to cam_in%cflx. it must be initialized in this subroutine. + sflx(:,:) = 0._r8 + + !-------------------------------------------------------- + ! ... set HEMCO emissions + ! hplin 7/19/20 + !-------------------------------------------------------- + + ! for every species index retrieve the species name, compute the pbuf name, + ! and write it into sflx(col, n) + ! where n is spc_ndx + + ! if the pbuf exists, set has_emis(1:gas_pcnst) to .true. + ! this process is supposed to be set by srf_emissions_inti but it is just + ! used below, so we shunt it here and decide later + + ! ncol: # of columns in chunk + ! lchnk: chunk number + + ! sflx is given in (pcols, gas_pcnst) so it is a in-chunk slice of the + ! srf flux specifier. maybe this loop needs to be done higher up so + ! we loop over the pbuf to prevent inquiries. tbd hplin 7/19/20 + + do n = 1, gas_pcnst + tmpIdx = hco_pbuf_idx(n) + if(tmpIdx > 0) then + if(pcnst_is_extfrc(n)) then ! 3-D data + ! if species is 3-D data, then all forcings set through 3-D. no longer process + ! their emissions here. + else ! 2-D data + call pbuf_get_field(pbuf, tmpIdx, pbuf_ptr_2d) + + ! for each col retrieve data from pbuf_ptr(I, K) + sflx(1:ncol,n) = pbuf_ptr_2d(1:ncol) + + pbuf_ptr_2d => null() + endif + endif + enddo + + end subroutine hco_set_srf_emissions +!EOC +!------------------------------------------------------------------------------ +! Harmonized Emissions Component (HEMCO) ! +!------------------------------------------------------------------------------ +!BOP +! +! !IROUTINE: hco_set_extfrc +! +! !DESCRIPTION: Set 3-D emissions apart from surface level. +!\\ +!\\ +! !INTERFACE: +! + subroutine hco_set_extfrc( lchnk, zint, frcing, ncol, pbuf ) +! +! !USES: +! + use mo_chem_utls, only: get_spc_ndx + + ! Check list whether this species has external forcing from dataset - this is a CAM-chem flag + ! and this is CAM-chem specific. + use chem_mods, only: frc_from_dataset, extfrc_lst + use chem_mods, only: extcnt, adv_mass + + use mo_constants, only: avogadro + implicit none +! +! !INPUT PARAMETERS: +! + integer, intent(in) :: ncol ! columns in chunk + integer, intent(in) :: lchnk ! chunk index + real(r8), intent(in) :: zint(ncol, pverp) ! interface geopot above surface (km) + real(r8), intent(inout) :: frcing(ncol,pver,extcnt) ! insitu forcings (molec/cm^3/s) + type(physics_buffer_desc), pointer :: pbuf(:) ! pbuf in chunk +! +! !REVISION HISTORY: +! 08 Aug 2022 - H.P. Lin - Initial version based on original from 14 Nov 2020 +! 09 Feb 2023 - H.P. Lin - Use full 3-D emissions, including surface, if available +!EOP +!------------------------------------------------------------------------------ +!BOC +! +! !LOCAL VARIABLES: +! + real(r8), parameter :: cm2_to_m2 = 1.e4_r8 + real(r8), parameter :: kg_to_g = 1.e-3_r8 + real(r8), parameter :: km_to_cm = 1.e5_r8 + + ! Loop idxs + integer :: m, n, k + + ! For compatibility with XFRC_ diagnostic in CAM-chem + real(r8) :: frcing_col(1:ncol), frcing_col_kg(1:ncol) + character(len=max_fieldname_len) :: xfcname + real(r8) :: molec_to_kg + integer :: spc_ndx + + + real(r8), pointer :: pbuf_ik(:,:) ! ptr to pbuf data (/pcols,pver/) + integer :: tmpIdx ! pbuf field id + real(r8) :: kg_to_molec + + ! for every species index retrieve the species name, compute the pbuf name, + ! and write it into frcing(col, lev, n) + ! where n is FRC_IDX -- + ! + + !****************************************************************************************************** + ! WARNING: ONLY SPECIES THAT ARE EXTERNALLY FORCED AND SPECIFIED IN mo_sim_dat.F90 + ! CAN HAVE 3-D EMISSIONS, OTHERWISE THEY WILL BE IGNORED!!! + ! + ! the n = frc_idx comes from get_extfrc_ndx( spc_name ). + ! it is too computationally expensive to check all fields to see if they are 3-d emitted + ! + ! so PLEASE verify that all your species are in mo_sim_dat.F90:: extfrc_lst before attempting + ! to have 3-D emissions for them. + ! + ! I will still loop through all species, get its symbol and attempt to inject extfrc emissions + ! for it, but it may not be guaranteed to be done. + !****************************************************************************************************** + + ! if the pbuf exists, set has_emis(1:gas_pcnst) to .true. + ! this process is supposed to be set by srf_emissions_inti but it is just + ! used below, so we shunt it here and decide later + + ! ncol: # of columns in chunk + ! lchnk: chunk number + + ! Zero out frcing to be consistent with mo_extfrc + frcing(:,:,:) = 0._r8 + + do n = 1, gas_pcnst + ! check if extfrc available? + if(pcnst_is_extfrc(n)) then + ! add extfrc + ! "external insitu forcing" (1/cm^3/s) + m = pcnst_extfrc_ndx(n) + tmpIdx = hco_pbuf_idx(n) + if(tmpIdx > 0) then + ! Note: units coming out of HEMCO are in kg/m2/s, so unit conversion must be done + ! + ! using species factor... + ! (kg_to_g is actually kg/g...) + ! + ! 1 / (kg/molec cm2/m2) = molec/kg m2/cm2 + ! + ! kg/m2/s * molec/kg m2/cm2 = molec/cm2/s + ! now divide by z-interface height (in CM!) for each height to get the right answer! + ! (hplin, 11/14/20) + kg_to_molec = 1/(adv_mass(n) / avogadro * cm2_to_m2 * kg_to_g) + + ! this is already in chunk, retrieve it. + ! if the field does not exist, pbuf_get_field will return an error, so sanity check for pbuf_ik is not needed. + call pbuf_get_field(pbuf, tmpIdx, pbuf_ik) + + ! for each col retrieve data from pbuf_ik(I, K) + ! this includes surface layer. + do k = 1, pver + frcing(:ncol,k,m) = frcing(:ncol,k,m) + pbuf_ik(1:ncol,k) * kg_to_molec / ((zint(:ncol,k)-zint(:ncol,k+1)) * km_to_cm) + enddo + + if ( frc_from_dataset(m) ) then + xfcname = trim(extfrc_lst(m))//'_XFRC' + call outfld( xfcname, frcing(:ncol,:,n), ncol, lchnk ) + spc_ndx = get_spc_ndx( extfrc_lst(m) ) + molec_to_kg = adv_mass( spc_ndx ) / avogadro * cm2_to_m2 * kg_to_g + + frcing_col(:ncol) = 0._r8 + frcing_col_kg(:ncol) = 0._r8 + do k = 1, pver + frcing_col(:ncol) = frcing_col(:ncol) + frcing(:ncol,k,m)*(zint(:ncol,k)-zint(:ncol,k+1))*km_to_cm + frcing_col_kg(:ncol) = frcing_col_kg(:ncol) + frcing(:ncol,k,m)*(zint(:ncol,k)-zint(:ncol,k+1))*km_to_cm*molec_to_kg + enddo + + xfcname = trim(extfrc_lst(m))//'_CLXF' + call outfld( xfcname, frcing_col(:ncol), ncol, lchnk ) + xfcname = trim(extfrc_lst(m))//'_CMXF' + call outfld( xfcname, frcing_col_kg(:ncol), ncol, lchnk ) + endif + endif + endif + enddo + + end subroutine hco_set_extfrc +!EOC +!------------------------------------------------------------------------------ +! Harmonized Emissions Component (HEMCO) ! +!------------------------------------------------------------------------------ +!BOP +! +! !IROUTINE: hco_extfrc_inti +! +! !DESCRIPTION: Initialize external forcing related diagnostic fields +!\\ +!\\ +! !INTERFACE: +! + subroutine hco_extfrc_inti( ) +! +! !USES: +! + use chem_mods, only: frc_from_dataset, extcnt, extfrc_lst + use cam_history, only: addfld, add_default, horiz_only + use phys_control, only: phys_getopts + use mo_chem_utls, only: get_extfrc_ndx + implicit none +! +! !REVISION HISTORY: +! 04 Nov 2022 - H.P. Lin - Initial version based on extfrc_inti +! 10 Apr 2023 - H.P. Lin - Now move pcnst_is_extfrc initialization here +!EOP +!------------------------------------------------------------------------------ +!BOC +! +! !LOCAL VARIABLES: +! + logical :: history_aerosol + logical :: history_chemistry + logical :: history_cesm_forcing + character(len=16) :: spc_name + integer :: n + + character(len=255) :: fldname_ns ! field name HCO_NH3 + integer :: RC ! return code (dummy) + + ! for first run, cache results of 3-D or 2-D scan within pcnst_is_extfrc + ! to avoid lengthy lookups in future timesteps. hplin 1/12/23 + do n = 1, gas_pcnst + pcnst_extfrc_ndx(n) = get_extfrc_ndx(trim(solsym(n))) + pcnst_is_extfrc(n) = (pcnst_extfrc_ndx(n) > 0) + + ! construct information about HCO_* corresponding pbuf location + fldname_ns = 'HCO_' // trim(solsym(n)) + hco_pbuf_idx(n) = pbuf_get_index(fldname_ns, RC) + enddo + + if(masterproc) then + write(iulog,*) "hco_set_srf_emissions: first run pcnst_is_extfrc cache, extfrc_ndx:" + do n = 1, gas_pcnst + write(iulog,*) trim(solsym(n)), ' : ', pcnst_is_extfrc(n), pcnst_extfrc_ndx(n) + end do + endif + + ! Replicate functionality in extfrc_inti to create _XFRC... diagnostics + call phys_getopts( & + history_aerosol_out = history_aerosol, & + history_chemistry_out = history_chemistry, & + history_cesm_forcing_out = history_cesm_forcing ) + + do n= 1,extcnt + if (frc_from_dataset(n)) then + spc_name = extfrc_lst(n) + call addfld( trim(spc_name)//'_XFRC', (/ 'lev' /), 'A', 'molec/cm3/s', & + 'external forcing for '//trim(spc_name) ) + call addfld( trim(spc_name)//'_CLXF', horiz_only, 'A', 'molec/cm2/s', & + 'vertically intergrated external forcing for '//trim(spc_name) ) + call addfld( trim(spc_name)//'_CMXF', horiz_only, 'A', 'kg/m2/s', & + 'vertically intergrated external forcing for '//trim(spc_name) ) + if ( history_aerosol .or. history_chemistry ) then + call add_default( trim(spc_name)//'_CLXF', 1, ' ' ) + call add_default( trim(spc_name)//'_CMXF', 1, ' ' ) + endif + if ( history_cesm_forcing .and. spc_name == 'NO2' ) then + call add_default( trim(spc_name)//'_CLXF', 1, ' ' ) + call add_default( trim(spc_name)//'_CMXF', 1, ' ' ) + endif + endif + enddo + + end subroutine hco_extfrc_inti +!EOC +end module hco_cc_emissions diff --git a/src/chemistry/mozart/mo_chemini.F90 b/src/chemistry/mozart/mo_chemini.F90 index 9c31b2ba61..0f4005be96 100644 --- a/src/chemistry/mozart/mo_chemini.F90 +++ b/src/chemistry/mozart/mo_chemini.F90 @@ -36,6 +36,7 @@ subroutine chemini & , ext_frc_fixed_ymd & , ext_frc_fixed_tod & , exo_coldens_file & + , use_hemco & , pbuf2d & ) @@ -54,6 +55,7 @@ subroutine chemini & use mo_fstrat, only : fstrat_inti use mo_sethet, only : sethet_inti use mo_usrrxt, only : usrrxt_inti + use hco_cc_emissions, only : hco_extfrc_inti use mo_extfrc, only : extfrc_inti use mo_setext, only : setext_inti use mo_setinv, only : setinv_inti @@ -100,6 +102,7 @@ subroutine chemini & integer, intent(in) :: srf_emis_cycle_yr integer, intent(in) :: srf_emis_fixed_ymd integer, intent(in) :: srf_emis_fixed_tod + logical, intent(in) :: use_hemco type(physics_buffer_desc), pointer :: pbuf2d(:,:) @@ -146,8 +149,15 @@ subroutine chemini & ! ... initialize external forcings module !----------------------------------------------------------------------- call setext_inti() - call extfrc_inti(ext_frc_specifier, ext_frc_type, ext_frc_cycle_yr, ext_frc_fixed_ymd, ext_frc_fixed_tod) - if (masterproc) write(iulog,*) 'chemini: after extfrc_inti on node ',iam + + if ( use_hemco ) then + ! Initialize HEMCO version of extfrc_inti + call hco_extfrc_inti() + if (masterproc) write(iulog,*) 'chemini: after hco_extfrc_inti on node ',iam + else + call extfrc_inti(ext_frc_specifier, ext_frc_type, ext_frc_cycle_yr, ext_frc_fixed_ymd, ext_frc_fixed_tod) + if (masterproc) write(iulog,*) 'chemini: after extfrc_inti on node ',iam + endif call sulf_inti() if (masterproc) write(iulog,*) 'chemini: after sulf_inti on node ',iam diff --git a/src/chemistry/mozart/mo_chm_diags.F90 b/src/chemistry/mozart/mo_chm_diags.F90 index 8b004048bb..5650403fee 100644 --- a/src/chemistry/mozart/mo_chm_diags.F90 +++ b/src/chemistry/mozart/mo_chm_diags.F90 @@ -10,6 +10,7 @@ module mo_chm_diags use cam_history, only : fieldname_len use mo_jeuv, only : neuv use gas_wetdep_opts,only : gas_wetdep_method + use mo_drydep, only : has_drydep implicit none private @@ -64,13 +65,12 @@ subroutine chm_diags_inti use cam_history, only : addfld, add_default, horiz_only use constituents, only : cnst_get_ind, cnst_longname use phys_control, only : phys_getopts - use mo_drydep, only : has_drydep use species_sums_diags, only : species_sums_init integer :: j, k, m, n character(len=16) :: jname, spc_name, attr character(len=2) :: jchar - character(len=2) :: unit_basename ! Units 'kg' or '1' + character(len=2) :: unit_basename ! Units 'kg' or '1' integer :: id_pan, id_onit, id_mpan, id_isopno3, id_onitr, id_nh4no3 integer :: id_so2, id_so4, id_h2so4 @@ -89,7 +89,7 @@ subroutine chm_diags_inti integer :: id_dst01, id_dst02, id_dst03, id_dst04, id_sslt01, id_sslt02, id_sslt03, id_sslt04 integer :: id_soa, id_oc1, id_oc2, id_cb1, id_cb2 integer :: id_soam,id_soai,id_soat,id_soab,id_soax - integer :: id_bry, id_cly + integer :: id_bry, id_cly integer :: id_isopn2b, id_isopn3b, id_isopn1d, id_isopn4d, id_isopnbno3 integer :: id_isopfnp, id_isopnoohb, id_isopnoohd, id_inheb, id_inhed integer :: id_no3ch2cho, id_macrn, id_mvkn, id_isopfnc, id_terpns @@ -195,17 +195,17 @@ subroutine chm_diags_inti id_onitr = get_spc_ndx( 'ONITR' ) id_nh4no3 = get_spc_ndx( 'NH4NO3' ) - id_honitr = get_spc_ndx( 'HONITR' ) - id_alknit = get_spc_ndx( 'ALKNIT' ) - id_isopnita = get_spc_ndx( 'ISOPNITA' ) - id_isopnitb = get_spc_ndx( 'ISOPNITB' ) - id_isopnooh = get_spc_ndx( 'ISOPNOOH' ) - id_nc4ch2oh = get_spc_ndx( 'NC4CH2OH' ) - id_nc4cho = get_spc_ndx( 'NC4CHO' ) - id_noa = get_spc_ndx( 'NOA' ) - id_nterpooh = get_spc_ndx( 'NTERPOOH' ) + id_honitr = get_spc_ndx( 'HONITR' ) + id_alknit = get_spc_ndx( 'ALKNIT' ) + id_isopnita = get_spc_ndx( 'ISOPNITA' ) + id_isopnitb = get_spc_ndx( 'ISOPNITB' ) + id_isopnooh = get_spc_ndx( 'ISOPNOOH' ) + id_nc4ch2oh = get_spc_ndx( 'NC4CH2OH' ) + id_nc4cho = get_spc_ndx( 'NC4CHO' ) + id_noa = get_spc_ndx( 'NOA' ) + id_nterpooh = get_spc_ndx( 'NTERPOOH' ) id_pbznit = get_spc_ndx( 'PBZNIT' ) - id_terpnit = get_spc_ndx( 'TERPNIT' ) + id_terpnit = get_spc_ndx( 'TERPNIT' ) id_ndep = get_spc_ndx( 'NDEP' ) id_nhdep = get_spc_ndx( 'NHDEP' ) @@ -278,9 +278,9 @@ subroutine chm_diags_inti noy_species = (/ id_n, id_no, id_no2, id_no3, id_n2o5, id_hno3, id_ho2no2, id_clono2, & id_brono2, id_pan, id_onit, id_mpan, id_isopno3, id_onitr, id_nh4no3, & id_honitr, id_alknit, id_isopnita, id_isopnitb, id_isopnooh, id_nc4ch2oh, & - id_nc4cho, id_noa, id_nterpooh, id_pbznit, id_terpnit, & + id_nc4cho, id_noa, id_nterpooh, id_pbznit, id_terpnit, & id_isopn2b, id_isopn3b, id_isopn1d, id_isopn4d, id_isopnbno3, & - id_isopfdn, id_isopfdnc, id_terpfdn, & + id_isopfdn, id_isopfdnc, id_terpfdn, & id_isopfnp, id_isopnoohb, id_isopnoohd, id_inheb, id_inhed, & id_no3ch2cho, id_macrn, id_mvkn, id_isopfnc, id_terpns, & id_terpnt, id_terpnt1, id_terpns1, id_terpnpt, id_terpnps, & @@ -402,16 +402,17 @@ subroutine chm_diags_inti attr = spc_name endif - depvel_name(m) = 'DV_'//trim(spc_name) - depflx_name(m) = 'DF_'//trim(spc_name) dtchem_name(m) = 'D'//trim(spc_name)//'CHM' - - call addfld( depvel_name(m), horiz_only, 'A', 'cm/s', 'deposition velocity ' ) - call addfld( depflx_name(m), horiz_only, 'A', 'kg/m2/s', 'dry deposition flux ' ) call addfld( dtchem_name(m), (/ 'lev' /), 'A', 'kg/s', 'net tendency from chem' ) - if (has_drydep(spc_name).and.history_chemistry) then - call add_default( depflx_name(m), 1, ' ' ) + depvel_name(m) = 'DV_'//trim(spc_name) + depflx_name(m) = 'DF_'//trim(spc_name) + if (has_drydep(spc_name)) then + call addfld( depvel_name(m), horiz_only, 'A', 'cm/s', 'deposition velocity ' ) + call addfld( depflx_name(m), horiz_only, 'A', 'kg/m2/s', 'dry deposition flux ' ) + if (history_chemistry) then + call add_default( depflx_name(m), 1, ' ' ) + endif endif if (gas_wetdep_method=='MOZ') then @@ -439,7 +440,7 @@ subroutine chm_diags_inti if ((m /= id_cly) .and. (m /= id_bry)) then if (history_aerosol.or.history_chemistry) then call add_default( spc_name, 1, ' ' ) - endif + endif if (history_chemspecies_srf) then call add_default( trim(spc_name)//'_SRF', 1, ' ' ) endif @@ -510,7 +511,7 @@ subroutine chm_diags( lchnk, ncol, vmr, mmr, rxt_rates, invariants, depvel, depf !-------------------------------------------------------------------- ! ... utility routine to output chemistry diagnostic variables !-------------------------------------------------------------------- - + use cam_history, only : outfld use phys_grid, only : get_area_all_p use species_sums_diags, only : species_sums_output @@ -546,7 +547,7 @@ subroutine chm_diags( lchnk, ncol, vmr, mmr, rxt_rates, invariants, depvel, depf ! real(r8) :: tmp(ncol,pver) ! real(r8) :: m(ncol,pver) real(r8) :: un2(ncol) - + real(r8), dimension(ncol,pver) :: vmr_nox, vmr_noy, vmr_clox, vmr_cloy, vmr_tcly, vmr_brox, vmr_broy, vmr_toth real(r8), dimension(ncol,pver) :: vmr_tbry, vmr_foy, vmr_tfy real(r8), dimension(ncol,pver) :: mmr_noy, mmr_sox, mmr_nhx, net_chem @@ -673,7 +674,7 @@ subroutine chm_diags( lchnk, ncol, vmr, mmr, rxt_rates, invariants, depvel, depf if ( any( hox_species == m ) ) then vmr_hox(:ncol,:) = vmr_hox(:ncol,:) + wgt * vmr(:ncol,:,m) endif - + if ( any( aer_species == m ) ) then call outfld( solsym(m), mmr(:ncol,:,m), ncol ,lchnk ) call outfld( trim(solsym(m))//'_SRF', mmr(:ncol,pver,m), ncol ,lchnk ) @@ -682,8 +683,10 @@ subroutine chm_diags( lchnk, ncol, vmr, mmr, rxt_rates, invariants, depvel, depf call outfld( trim(solsym(m))//'_SRF', vmr(:ncol,pver,m), ncol ,lchnk ) endif - call outfld( depvel_name(m), depvel(:ncol,m), ncol ,lchnk ) - call outfld( depflx_name(m), depflx(:ncol,m), ncol ,lchnk ) + if (has_drydep(solsym(m))) then + call outfld( depvel_name(m), depvel(:ncol,m), ncol ,lchnk ) + call outfld( depflx_name(m), depflx(:ncol,m), ncol ,lchnk ) + endif if ( any( noy_species == m ) ) then df_noy(:ncol) = df_noy(:ncol) + wgt * depflx(:ncol,m)*N_molwgt/adv_mass(m) @@ -705,15 +708,15 @@ subroutine chm_diags( lchnk, ncol, vmr, mmr, rxt_rates, invariants, depvel, depf ! add contribution from non-conservation tracers ! if ( id_ndep == m ) then - wd_noy(:ncol) = wd_noy(:ncol) + wgt * wetdepflx(:ncol,m)*N_molwgt/adv_mass(m) + wd_noy(:ncol) = wd_noy(:ncol) + wgt * wetdepflx(:ncol,m)*N_molwgt/adv_mass(m) end if if ( id_nhdep == m ) then - wd_nhx(:ncol) = wd_nhx(:ncol) + wgt * wetdepflx(:ncol,m)*N_molwgt/adv_mass(m) + wd_nhx(:ncol) = wd_nhx(:ncol) + wgt * wetdepflx(:ncol,m)*N_molwgt/adv_mass(m) end if do k=1,pver do i=1,ncol - net_chem(i,k) = mmr_tend(i,k,m) * mass(i,k) + net_chem(i,k) = mmr_tend(i,k,m) * mass(i,k) end do end do call outfld( dtchem_name(m), net_chem(:ncol,:), ncol, lchnk ) @@ -769,7 +772,7 @@ subroutine chm_diags( lchnk, ncol, vmr, mmr, rxt_rates, invariants, depvel, depf call outfld( 'DF_SOX', df_sox(:ncol), ncol ,lchnk ) call outfld( 'dry_deposition_NHx_as_N', df_nhx(:ncol), ncol ,lchnk ) if (gas_wetdep_method=='NEU') then - wd_noy(:ncol) = -wd_noy(:ncol) ! downward is possitive + wd_noy(:ncol) = -wd_noy(:ncol) ! downward is possitive wd_nhx(:ncol) = -wd_nhx(:ncol) call outfld( 'wet_deposition_NOy_as_N', wd_noy(:ncol), ncol, lchnk ) call outfld( 'wet_deposition_NHx_as_N', wd_nhx(:ncol), ncol, lchnk ) @@ -903,7 +906,7 @@ subroutine het_diags( het_rates, mmr, pdel, lchnk, ncol ) ! wrk_wd(:ncol) = 0._r8 do k = 1,pver - wrk_wd(:ncol) = wrk_wd(:ncol) + het_rates(:ncol,k,m) * mmr(:ncol,k,m) * pdel(:ncol,k) + wrk_wd(:ncol) = wrk_wd(:ncol) + het_rates(:ncol,k,m) * mmr(:ncol,k,m) * pdel(:ncol,k) end do ! wrk_wd(:ncol) = wrk_wd(:ncol) * rgrav * wght(:ncol) * rearth**2 diff --git a/src/chemistry/mozart/mo_extfrc.F90 b/src/chemistry/mozart/mo_extfrc.F90 index 2438f47414..c1ca05aed3 100644 --- a/src/chemistry/mozart/mo_extfrc.F90 +++ b/src/chemistry/mozart/mo_extfrc.F90 @@ -5,7 +5,7 @@ module mo_extfrc use shr_kind_mod, only : r8 => shr_kind_r8 use ppgrid, only : pver, pverp - use chem_mods, only : gas_pcnst, extcnt, extfrc_lst, frc_from_dataset, adv_mass + use chem_mods, only : extcnt, extfrc_lst, frc_from_dataset, adv_mass use spmd_utils, only : masterproc use cam_abortutils,only : endrun use cam_history, only : addfld, outfld, add_default, horiz_only @@ -78,11 +78,11 @@ subroutine extfrc_inti( extfrc_specifier, extfrc_type_in, extfrc_cycle_yr, extfr integer :: astat integer :: j, l, m, n, i,mm ! Indices character(len=16) :: spc_name - character(len=256) :: frc_fnames(gas_pcnst) - real(r8) :: frc_scalefactor(gas_pcnst) - character(len=16) :: frc_species(gas_pcnst) - integer :: frc_indexes(gas_pcnst) - integer :: indx(gas_pcnst) + character(len=256) :: frc_fnames(size(extfrc_specifier)) + real(r8) :: frc_scalefactor(size(extfrc_specifier)) + character(len=16) :: frc_species(size(extfrc_specifier)) + integer :: frc_indexes(size(extfrc_specifier)) + integer :: indx(size(extfrc_specifier)) integer :: vid, ndims, nvars, isec, ierr, num_dims_xfrc, dimid logical, allocatable :: is_sector(:) @@ -105,7 +105,7 @@ subroutine extfrc_inti( extfrc_specifier, extfrc_type_in, extfrc_cycle_yr, extfr character(len=256) :: locfn !----------------------------------------------------------------------- - + call phys_getopts( & history_aerosol_out = history_aerosol, & history_chemistry_out = history_chemistry, & @@ -119,7 +119,7 @@ subroutine extfrc_inti( extfrc_specifier, extfrc_type_in, extfrc_cycle_yr, extfr mm = 0 indx(:) = 0 - count_emis: do n=1,gas_pcnst + count_emis: do n=1,size(extfrc_specifier) if ( len_trim(extfrc_specifier(n) ) == 0 ) then exit count_emis @@ -127,7 +127,7 @@ subroutine extfrc_inti( extfrc_specifier, extfrc_type_in, extfrc_cycle_yr, extfr i = scan(extfrc_specifier(n),'->') spc_name = trim(adjustl(extfrc_specifier(n)(:i-1))) - + ! need to parse out scalefactor ... tmp_string = adjustl(extfrc_specifier(n)(i+2:)) j = scan( tmp_string, '*' ) @@ -179,7 +179,7 @@ subroutine extfrc_inti( extfrc_specifier, extfrc_type_in, extfrc_cycle_yr, extfr end if !----------------------------------------------------------------------- - ! Sort the input files so that the emissions sources are summed in the + ! Sort the input files so that the emissions sources are summed in the ! same order regardless of the order of the input files in the namelist !----------------------------------------------------------------------- if (n_frc_files > 0) then @@ -189,14 +189,14 @@ subroutine extfrc_inti( extfrc_specifier, extfrc_type_in, extfrc_cycle_yr, extfr !----------------------------------------------------------------------- ! ... setup the forcing type array !----------------------------------------------------------------------- - do m=1,n_frc_files + do m=1,n_frc_files forcings(m)%frc_ndx = frc_indexes(indx(m)) forcings(m)%species = frc_species(indx(m)) forcings(m)%filename = frc_fnames(indx(m)) forcings(m)%scalefactor = frc_scalefactor(indx(m)) enddo - - do n= 1,extcnt + + do n= 1,extcnt if (frc_from_dataset(n)) then spc_name = extfrc_lst(n) call addfld( trim(spc_name)//'_XFRC', (/ 'lev' /), 'A', 'molec/cm3/s', & @@ -205,7 +205,7 @@ subroutine extfrc_inti( extfrc_specifier, extfrc_type_in, extfrc_cycle_yr, extfr 'vertically intergrated external forcing for '//trim(spc_name) ) call addfld( trim(spc_name)//'_CMXF', horiz_only, 'A', 'kg/m2/s', & 'vertically intergrated external forcing for '//trim(spc_name) ) - if ( history_aerosol .or. history_chemistry ) then + if ( history_aerosol .or. history_chemistry ) then call add_default( trim(spc_name)//'_CLXF', 1, ' ' ) call add_default( trim(spc_name)//'_CMXF', 1, ' ' ) endif @@ -250,6 +250,10 @@ subroutine extfrc_inti( extfrc_specifier, extfrc_type_in, extfrc_cycle_yr, extfr forcings(m)%nsectors = 0 + if (masterproc) then + write(iulog,'(a,i3,a)') 'extfrc_inti m: ',m,' init file : '//trim(forcings(m)%filename) + endif + call getfil (forcings(m)%filename, locfn, 0) call cam_pio_openfile ( ncid, trim(locfn), PIO_NOWRITE) ierr = pio_inquire (ncid, nVariables=nvars) @@ -261,7 +265,7 @@ subroutine extfrc_inti( extfrc_specifier, extfrc_type_in, extfrc_cycle_yr, extfr allocate(is_sector(nvars)) is_sector(:) = .false. - + do vid = 1,nvars ierr = pio_inq_varndims (ncid, vid, ndims) @@ -282,7 +286,7 @@ subroutine extfrc_inti( extfrc_specifier, extfrc_type_in, extfrc_cycle_yr, extfr forcings(m)%nsectors = forcings(m)%nsectors+1 is_sector(vid)=.true. - + enddo allocate( forcings(m)%sectors(forcings(m)%nsectors), stat=astat ) @@ -301,7 +305,7 @@ subroutine extfrc_inti( extfrc_specifier, extfrc_type_in, extfrc_cycle_yr, extfr deallocate(is_sector) ! Global attribute 'input_method' overrides the ext_frc_type namelist setting on - ! a file-by-file basis. If the ext_frc file does not contain the 'input_method' + ! a file-by-file basis. If the ext_frc file does not contain the 'input_method' ! attribute then the ext_frc_type namelist setting is used. call pio_seterrorhandling(ncid, PIO_BCAST_ERROR) ierr = pio_get_att(ncid, PIO_GLOBAL, 'input_method', file_interp_type) @@ -341,7 +345,7 @@ subroutine extfrc_timestep_init( pbuf2d, state ) implicit none - type(physics_state), intent(in):: state(begchunk:endchunk) + type(physics_state), intent(in):: state(begchunk:endchunk) type(physics_buffer_desc), pointer :: pbuf2d(:,:) !----------------------------------------------------------------------- diff --git a/src/chemistry/mozart/mo_gas_phase_chemdr.F90 b/src/chemistry/mozart/mo_gas_phase_chemdr.F90 index 9e4e51df1f..68657d0739 100644 --- a/src/chemistry/mozart/mo_gas_phase_chemdr.F90 +++ b/src/chemistry/mozart/mo_gas_phase_chemdr.F90 @@ -48,6 +48,10 @@ module mo_gas_phase_chemdr logical :: convproc_do_aer integer :: ele_temp_ndx, ion_temp_ndx + ! for HEMCO-CESM ... passing J-values to ParaNOx ship plume extension + integer :: hco_jno2_idx, hco_joh_idx + integer :: rxt_jno2_idx, rxt_joh_idx + contains subroutine gas_phase_chemdr_inti() @@ -225,6 +229,23 @@ subroutine gas_phase_chemdr_inti() call chem_prod_loss_diags_init + ! diagnostics for HEMCO ParaNOx extension + hco_jno2_idx = pbuf_get_index('HCO_IN_JNO2',errcode=err) + hco_joh_idx = pbuf_get_index('HCO_IN_JOH',errcode=err) + + !-------------------------- HEMCO_CESM --------------------------------- + ! ... save photo rxn rates for HEMCO ParaNOx, chem_mech rxns: + ! jo3_b ( 8) O3 + hv -> O + O2 + ! jno2 ( 16) NO2 + hv -> NO + O + ! + ! The reactions jo2 and jo3_b exist in the mechanisms that would use + ! the ParaNOx ship plume extension. If they do not exist, then the indices + ! would not be found and the HCO_IN_JNO2 and HCO_IN_JOH fields would not + ! be zero and the extension would have no effect. + !----------------------------------------------------------------------- + rxt_jno2_idx = get_rxt_ndx( 'jno2' ) + rxt_joh_idx = get_rxt_ndx( 'jo3_b' ) + end subroutine gas_phase_chemdr_inti @@ -238,7 +259,8 @@ subroutine gas_phase_chemdr(lchnk, ncol, imozart, q, & delt, ps, & fsds, ts, asdir, ocnfrac, icefrac, & precc, precl, snowhland, ghg_chem, latmapback, & - drydepflx, wetdepflx, cflx, fire_sflx, fire_ztop, nhx_nitrogen_flx, noy_nitrogen_flx, qtend, pbuf) + drydepflx, wetdepflx, cflx, fire_sflx, fire_ztop, nhx_nitrogen_flx, noy_nitrogen_flx, & + use_hemco, qtend, pbuf) !----------------------------------------------------------------------- ! ... Chem_solver advances the volumetric mixing ratio @@ -287,6 +309,7 @@ subroutine gas_phase_chemdr(lchnk, ncol, imozart, q, & use rate_diags, only : rate_diags_calc, rate_diags_o3s_loss use mo_mass_xforms, only : mmr2vmr, vmr2mmr, h2o_to_vmr, mmr2vmri use orbit, only : zenith + ! ! for aqueous chemistry and aerosol growth ! @@ -337,6 +360,7 @@ subroutine gas_phase_chemdr(lchnk, ncol, imozart, q, & real(r8), intent(in) :: wetdepflx(pcols,pcnst) ! wet deposition flux (kg/m^2/s) real(r8), intent(out) :: nhx_nitrogen_flx(pcols) real(r8), intent(out) :: noy_nitrogen_flx(pcols) + logical, intent(in) :: use_hemco ! use Harmonized Emissions Component (HEMCO) type(physics_buffer_desc), pointer :: pbuf(:) @@ -421,6 +445,9 @@ subroutine gas_phase_chemdr(lchnk, ncol, imozart, q, & real(r8) :: del_h2so4_gasprod(ncol,pver) real(r8) :: vmr0(ncol,pver,gas_pcnst) + ! for HEMCO-CESM ... passing J-values to ParaNOx ship plume extension + real(r8), pointer :: hco_j_tmp_fld(:) ! J-value pointer (sfc only) [1/s] + ! ! CCMI ! @@ -800,6 +827,26 @@ subroutine gas_phase_chemdr(lchnk, ncol, imozart, q, & !----------------------------------------------------------------------- call phtadj( reaction_rates, invariants, invariants(:,:,indexm), ncol,pver ) + if ( use_hemco ) then + !-------------------------- HEMCO_CESM --------------------------------- + ! ... save photo rxn rates for HEMCO ParaNOx, chem_mech rxns: + ! jo3_b ( 8) O3 + hv -> O + O2 + ! jno2 ( 16) NO2 + hv -> NO + O + !----------------------------------------------------------------------- + ! get the rxn rate [1/s] and write to pbuf + if(rxt_jno2_idx > 0 .and. hco_jno2_idx > 0) then + call pbuf_get_field(pbuf, hco_jno2_idx, hco_j_tmp_fld) + ! this is already in chunk, write /pcols/ at surface + hco_j_tmp_fld(:ncol) = reaction_rates(:ncol,pver,rxt_jno2_idx) + endif + + if(rxt_joh_idx > 0 .and. hco_joh_idx > 0) then + call pbuf_get_field(pbuf, hco_joh_idx, hco_j_tmp_fld) + ! this is already in chunk, write /pcols/ at surface + hco_j_tmp_fld(:ncol) = reaction_rates(:ncol,pver,rxt_joh_idx) + endif + endif + !----------------------------------------------------------------------- ! ... Compute the extraneous frcing at time = t(n+1) !----------------------------------------------------------------------- diff --git a/src/chemistry/mozart/mo_neu_wetdep.F90 b/src/chemistry/mozart/mo_neu_wetdep.F90 index 0b2d3ff35e..c3974b7e37 100644 --- a/src/chemistry/mozart/mo_neu_wetdep.F90 +++ b/src/chemistry/mozart/mo_neu_wetdep.F90 @@ -188,7 +188,6 @@ subroutine neu_wetdep_init call addfld ('WD_'//trim(gas_wetdep_list(m)),horiz_only, 'A','kg/m2/s','vertical integrated wet deposition flux') call addfld ('HEFF_'//trim(gas_wetdep_list(m)),(/ 'lev' /), 'A','M/atm','Effective Henrys Law coeff.') if (history_chemistry) then - call add_default('DTWR_'//trim(gas_wetdep_list(m)), 1, ' ') call add_default('WD_'//trim(gas_wetdep_list(m)), 1, ' ') end if end do diff --git a/src/chemistry/mozart/mo_setext.F90 b/src/chemistry/mozart/mo_setext.F90 index 241db099f7..a2c6ed7095 100644 --- a/src/chemistry/mozart/mo_setext.F90 +++ b/src/chemistry/mozart/mo_setext.F90 @@ -106,6 +106,7 @@ subroutine setext( extfrc, zint_abs, zint_rel, cldtop, & use mo_lightning, only : prod_no use mo_extfrc, only : extfrc_set + use hco_cc_emissions, only : hco_set_extfrc use chem_mods, only : extcnt use tracer_srcs, only : num_tracer_srcs, tracer_src_flds, get_srcs_data use mo_chem_utls, only : get_extfrc_ndx @@ -118,6 +119,8 @@ subroutine setext( extfrc, zint_abs, zint_rel, cldtop, & use physics_buffer, only : physics_buffer_desc + use phys_control, only : use_hemco ! Use Harmonized Emissions Component (HEMCO) + implicit none !-------------------------------------------------------- @@ -167,10 +170,17 @@ subroutine setext( extfrc, zint_abs, zint_rel, cldtop, & no_lgt(:,:) = 0._r8 - !-------------------------------------------------------- - ! ... set frcing from datasets - !-------------------------------------------------------- - call extfrc_set( lchnk, zint_rel, extfrc, ncol ) + if(use_hemco) then + !-------------------------------------------------------- + ! ... set frcing from datasets (HEMCO) + !-------------------------------------------------------- + call hco_set_extfrc( lchnk, zint_rel, extfrc, ncol, pbuf ) + else + !-------------------------------------------------------- + ! ... set frcing from datasets + !-------------------------------------------------------- + call extfrc_set( lchnk, zint_rel, extfrc, ncol ) + endif !-------------------------------------------------------- ! ... set nox production from lighting diff --git a/src/chemistry/mozart/mo_srf_emissions.F90 b/src/chemistry/mozart/mo_srf_emissions.F90 index e0d80ef1b1..80afe7f474 100644 --- a/src/chemistry/mozart/mo_srf_emissions.F90 +++ b/src/chemistry/mozart/mo_srf_emissions.F90 @@ -28,14 +28,13 @@ module mo_srf_emissions private - public :: srf_emissions_inti, set_srf_emissions, set_srf_emissions_time + public :: srf_emissions_inti, set_srf_emissions, set_srf_emissions_time - save + logical, public, protected :: has_emis(gas_pcnst) = .false. real(r8), parameter :: amufac = 1.65979e-23_r8 ! 1.e4* kg / amu - logical :: has_emis(gas_pcnst) type(emission), allocatable :: emissions(:) - integer :: n_emis_files + integer :: n_emis_files integer :: c10h16_ndx, isop_ndx contains @@ -47,7 +46,7 @@ subroutine srf_emissions_inti( srf_emis_specifier, emis_type_in, emis_cycle_yr, !----------------------------------------------------------------------- use chem_mods, only : adv_mass - use mo_chem_utls, only : get_spc_ndx + use mo_chem_utls, only : get_spc_ndx use tracer_data, only : trcdata_init use cam_pio_utils, only : cam_pio_openfile use pio, only : pio_inquire, pio_nowrite, pio_closefile, pio_inq_varndims @@ -77,11 +76,11 @@ subroutine srf_emissions_inti( srf_emis_specifier, emis_type_in, emis_cycle_yr, character(len=16) :: spc_name character(len=256) :: filename - character(len=16) :: emis_species(gas_pcnst) - character(len=256) :: emis_filenam(gas_pcnst) - integer :: emis_indexes(gas_pcnst) - integer :: indx(gas_pcnst) - real(r8) :: emis_scalefactor(gas_pcnst) + character(len=16) :: emis_species(size(srf_emis_specifier)) + character(len=256) :: emis_filenam(size(srf_emis_specifier)) + integer :: emis_indexes(size(srf_emis_specifier)) + integer :: indx(size(srf_emis_specifier)) + real(r8) :: emis_scalefactor(size(srf_emis_specifier)) integer :: vid, nvars, isec, num_dims_emis integer :: vndims @@ -101,19 +100,19 @@ subroutine srf_emissions_inti( srf_emis_specifier, emis_type_in, emis_cycle_yr, real(r8) :: xdbl integer :: time_dimid, ncol_dimid integer, allocatable :: dimids(:) - + has_emis(:) = .false. nn = 0 indx(:) = 0 - count_emis: do n=1,gas_pcnst + count_emis: do n=1,size(srf_emis_specifier) if ( len_trim(srf_emis_specifier(n) ) == 0 ) then exit count_emis endif i = scan(srf_emis_specifier(n),'->') spc_name = trim(adjustl(srf_emis_specifier(n)(:i-1))) - + ! need to parse out scalefactor ... tmp_string = adjustl(srf_emis_specifier(n)(i+2:)) j = scan( tmp_string, '*' ) @@ -130,7 +129,7 @@ subroutine srf_emissions_inti( srf_emis_specifier, emis_type_in, emis_cycle_yr, if (m > 0) then has_emis(m) = .true. - else + else write(iulog,*) 'srf_emis_inti: spc_name ',spc_name,' is not included in the simulation' call endrun('srf_emis_inti: invalid surface emission specification') endif @@ -161,7 +160,7 @@ subroutine srf_emissions_inti( srf_emis_specifier, emis_type_in, emis_cycle_yr, end if !----------------------------------------------------------------------- - ! Sort the input files so that the emissions sources are summed in the + ! Sort the input files so that the emissions sources are summed in the ! same order regardless of the order of the input files in the namelist !----------------------------------------------------------------------- if (n_emis_files > 0) then @@ -171,7 +170,7 @@ subroutine srf_emissions_inti( srf_emis_specifier, emis_type_in, emis_cycle_yr, !----------------------------------------------------------------------- ! ... setup the emission type array !----------------------------------------------------------------------- - do m=1,n_emis_files + do m=1,n_emis_files emissions(m)%spc_ndx = emis_indexes(indx(m)) emissions(m)%units = 'Tg/y' emissions(m)%species = emis_species(indx(m)) @@ -186,7 +185,11 @@ subroutine srf_emissions_inti( srf_emis_specifier, emis_type_in, emis_cycle_yr, spc_loop: do m = 1, n_emis_files emissions(m)%nsectors = 0 - + + if (masterproc) then + write(iulog,'(a,i3,a)') 'srf_emissions_inti m: ',m,' init file : '//trim(emissions(m)%filename) + endif + call getfil (emissions(m)%filename, locfn, 0) call cam_pio_openfile ( ncid, trim(locfn), PIO_NOWRITE) ierr = pio_inquire (ncid, nVariables=nvars) @@ -198,7 +201,7 @@ subroutine srf_emissions_inti( srf_emis_specifier, emis_type_in, emis_cycle_yr, allocate(is_sector(nvars)) is_sector(:) = .false. - + if (unstructured) then ierr = pio_inq_dimid( ncid, 'time', time_dimid ) end if @@ -254,7 +257,7 @@ subroutine srf_emissions_inti( srf_emis_specifier, emis_type_in, emis_cycle_yr, deallocate(is_sector) ! Global attribute 'input_method' overrides the srf_emis_type namelist setting on - ! a file-by-file basis. If the emis file does not contain the 'input_method' + ! a file-by-file basis. If the emis file does not contain the 'input_method' ! attribute then the srf_emis_type namelist setting is used. call pio_seterrorhandling(ncid, PIO_BCAST_ERROR) ierr = pio_get_att(ncid, PIO_GLOBAL, 'input_method', file_interp_type) @@ -297,7 +300,7 @@ subroutine set_srf_emissions_time( pbuf2d, state ) implicit none - type(physics_state), intent(in):: state(begchunk:endchunk) + type(physics_state), intent(in):: state(begchunk:endchunk) type(physics_buffer_desc), pointer :: pbuf2d(:,:) !----------------------------------------------------------------------- @@ -364,7 +367,7 @@ subroutine set_srf_emissions( lchnk, ncol, sflx ) "kg/m^2/sec " /) character(len=12) :: units - real(r8), dimension(ncol) :: rlats, rlons + real(r8), dimension(ncol) :: rlats, rlons sflx(:,:) = 0._r8 diff --git a/src/chemistry/mozart/ocean_emis.F90 b/src/chemistry/mozart/ocean_emis.F90 index 289cafeb77..d8179d42b8 100644 --- a/src/chemistry/mozart/ocean_emis.F90 +++ b/src/chemistry/mozart/ocean_emis.F90 @@ -28,7 +28,7 @@ module ocean_emis use ppgrid, only : pcols, begchunk,endchunk use spmd_utils, only : masterproc use cam_abortutils, only : endrun - use cam_history, only : addfld, horiz_only, outfld + use cam_history, only : addfld, add_default, horiz_only, outfld use constituents, only : cnst_get_ind use tracer_data, only : trfld,trfile use chem_mods, only : gas_pcnst @@ -42,6 +42,7 @@ module ocean_emis public :: ocean_emis_init public :: ocean_emis_getflux public :: ocean_emis_advance + public :: ocean_emis_species type :: Csw integer :: spc_ndx @@ -57,7 +58,7 @@ module ocean_emis logical :: switch_bubble type(Csw), allocatable :: Csw_nM(:) - integer :: n_Csw_files + integer :: n_Csw_files = 0 real(r8), allocatable :: salinity(:,:) @@ -768,6 +769,7 @@ subroutine cseawater_ini() use pio, only : pio_inq_varname, file_desc_t, pio_get_att, PIO_NOERR, PIO_GLOBAL use pio, only : pio_seterrorhandling, PIO_BCAST_ERROR use string_utils, only : GLC + use phys_control, only : phys_getopts integer :: i, j, l, m, n, nn, astat, vid, ierr, nvars, isec integer :: indx(gas_pcnst) @@ -794,6 +796,9 @@ subroutine cseawater_ini() character(len=*), parameter :: subname = 'cseawater_ini' + logical :: history_chemistry + call phys_getopts(history_chemistry_out=history_chemistry) + ! ======================================================== ! Read sea water concentration specifier from the namelist ! ======================================================== @@ -956,8 +961,30 @@ subroutine cseawater_ini() 'ocean flux ' // trim(Csw_nM(m)%species) ) call addfld('Csw_' // trim(Csw_nM(m)%species), horiz_only, 'A', 'nanomole per liter (nM)', & 'seeawater concentration ' // trim(Csw_nM(m)%species) ) + if (history_chemistry) then + call add_default('OCN_FLUX_' // trim(Csw_nM(m)%species), 1, ' ') + end if end do end subroutine cseawater_ini + !-------------------------------------------------------------------------------- + ! returns TRUE if species has ocean emissions + !-------------------------------------------------------------------------------- + pure logical function ocean_emis_species(name) + character(len=*), intent(in) :: name + + integer :: m + + ocean_emis_species = .false. + + spc_loop: do m = 1, n_Csw_files + if (trim(name) == trim(Csw_nM(m)%species)) then + ocean_emis_species = .true. + exit spc_loop + end if + end do spc_loop + + end function ocean_emis_species + end module ocean_emis diff --git a/src/chemistry/pp_none/chemistry.F90 b/src/chemistry/pp_none/chemistry.F90 index bdb8c9ae0b..7e67fadb6e 100644 --- a/src/chemistry/pp_none/chemistry.F90 +++ b/src/chemistry/pp_none/chemistry.F90 @@ -222,13 +222,15 @@ subroutine chem_reset_fluxes( fptr, cam_in ) end subroutine chem_reset_fluxes !================================================================================ - subroutine chem_emissions( state, cam_in ) + subroutine chem_emissions( state, cam_in, pbuf ) use camsrfexch, only: cam_in_t + use physics_buffer, only: physics_buffer_desc ! Arguments: type(physics_state), intent(in) :: state ! Physics state variables type(cam_in_t), intent(inout) :: cam_in ! import state + type(physics_buffer_desc), pointer :: pbuf(:) ! Physics buffer in chunk, for HEMCO end subroutine chem_emissions end module chemistry diff --git a/src/chemistry/pp_terminator/chemistry.F90 b/src/chemistry/pp_terminator/chemistry.F90 index 20d24047a5..11fbf5e0c9 100644 --- a/src/chemistry/pp_terminator/chemistry.F90 +++ b/src/chemistry/pp_terminator/chemistry.F90 @@ -419,13 +419,15 @@ subroutine chem_reset_fluxes( fptr, cam_in ) end subroutine chem_reset_fluxes !================================================================================ - subroutine chem_emissions( state, cam_in ) + subroutine chem_emissions( state, cam_in, pbuf ) use camsrfexch, only: cam_in_t + use physics_buffer, only: physics_buffer_desc ! Arguments: type(physics_state), intent(in) :: state ! Physics state variables type(cam_in_t), intent(inout) :: cam_in ! import state + type(physics_buffer_desc), pointer :: pbuf(:) ! Physics buffer in chunk, for HEMCO end subroutine chem_emissions diff --git a/src/chemistry/pp_waccm_ma_mam5/chem_mech.doc b/src/chemistry/pp_waccm_ma_mam5/chem_mech.doc index 9a7379e5b2..5712d4ca8a 100644 --- a/src/chemistry/pp_waccm_ma_mam5/chem_mech.doc +++ b/src/chemistry/pp_waccm_ma_mam5/chem_mech.doc @@ -72,37 +72,38 @@ ( 69) O ( 70) O2 ( 71) O3 - ( 72) OCLO (OClO) - ( 73) OCS (OCS) - ( 74) pom_a1 (C) - ( 75) pom_a4 (C) - ( 76) S (S) - ( 77) SF6 - ( 78) SO (SO) - ( 79) SO2 - ( 80) SO3 (SO3) - ( 81) so4_a1 (NH4HSO4) - ( 82) so4_a2 (NH4HSO4) - ( 83) so4_a3 (NH4HSO4) - ( 84) so4_a5 (NH4HSO4) - ( 85) soa_a1 (C) - ( 86) soa_a2 (C) - ( 87) SOAG (C) - ( 88) e (E) - ( 89) HO2 - ( 90) N2D (N) - ( 91) N2p (N2) - ( 92) NOp (NO) - ( 93) Np (N) - ( 94) O1D (O) - ( 95) O2_1D (O2) - ( 96) O2_1S (O2) - ( 97) O2p (O2) - ( 98) OH - ( 99) Op (O) - (100) Op2D (O) - (101) Op2P (O) - (102) H2O + ( 72) O3S (O3) + ( 73) OCLO (OClO) + ( 74) OCS (OCS) + ( 75) pom_a1 (C) + ( 76) pom_a4 (C) + ( 77) S (S) + ( 78) SF6 + ( 79) SO (SO) + ( 80) SO2 + ( 81) SO3 (SO3) + ( 82) so4_a1 (NH4HSO4) + ( 83) so4_a2 (NH4HSO4) + ( 84) so4_a3 (NH4HSO4) + ( 85) so4_a5 (NH4HSO4) + ( 86) soa_a1 (C) + ( 87) soa_a2 (C) + ( 88) SOAG (C) + ( 89) e (E) + ( 90) HO2 + ( 91) N2D (N) + ( 92) N2p (N2) + ( 93) NOp (NO) + ( 94) Np (N) + ( 95) O1D (O) + ( 96) O2_1D (O2) + ( 97) O2_1S (O2) + ( 98) O2p (O2) + ( 99) OH + (100) Op (O) + (101) Op2D (O) + (102) Op2P (O) + (103) H2O Invariant species @@ -116,6 +117,9 @@ Class List ========== + Explicit + -------- + ( 1) O3S Implicit -------- @@ -762,6 +766,7 @@ Extraneous prod/loss species d(O3)/dt = r19*M*O*O2 - j7*O3 - j8*O3 - r8*O1D*O3 - r17*O*O3 - r27*HO2*O3 - r28*H*O3 - r33*OH*O3 - r46*NO2*O3 - r54*NO*O3 - r70*CL*O3 - r102*BR*O3 - r161*S*O3 - r167*SO*O3 + d(O3S)/dt = 0 d(OCLO)/dt = r74*CLO*CLO + r104*BRO*CLO - j59*OCLO - r168*SO*OCLO d(OCS)/dt = - j88*OCS - r157*O*OCS - r158*OH*OCS diff --git a/src/chemistry/pp_waccm_ma_mam5/chem_mech.in b/src/chemistry/pp_waccm_ma_mam5/chem_mech.in index 9d69d3a4f2..8443364166 100644 --- a/src/chemistry/pp_waccm_ma_mam5/chem_mech.in +++ b/src/chemistry/pp_waccm_ma_mam5/chem_mech.in @@ -81,6 +81,7 @@ O, O2, O3, + O3S -> O3, OCLO -> OClO, OCS -> OCS, pom_a1 -> C, @@ -147,7 +148,7 @@ Solution classes Explicit - + O3S End Explicit Implicit @@ -263,398 +264,398 @@ ********************************* *** odd-oxygen ********************************* -[jh2o_b] H2O + hv -> H2 + O1D -[jh2o_c] H2O + hv -> 2*H + O -[jh2o_a] H2O + hv -> OH + H -[jh2o2] H2O2 + hv -> 2*OH -[jo2_b=userdefined,] O2 + hv -> 2*O -[jo2_a=userdefined,] O2 + hv -> O + O1D -[jo3_a] O3 + hv -> O1D + O2_1D -[jo3_b] O3 + hv -> O + O2 +[jh2o_b] H2O + hv -> H2 + O1D +[jh2o_c] H2O + hv -> 2*H + O +[jh2o_a] H2O + hv -> OH + H +[jh2o2] H2O2 + hv -> 2*OH +[jo2_b=userdefined,] O2 + hv -> 2*O +[jo2_a=userdefined,] O2 + hv -> O + O1D +[jo3_a] O3 + hv -> O1D + O2_1D +[jo3_b] O3 + hv -> O + O2 ********************************* *** odd-nitrogen ********************************* -[jhno3] HNO3 + hv -> NO2 + OH -[jho2no2_a] HO2NO2 + hv -> OH + NO3 -[jho2no2_b] HO2NO2 + hv -> NO2 + HO2 -[jn2o] N2O + hv -> O1D + N2 -[jn2o5_a] N2O5 + hv -> NO2 + NO3 -[jn2o5_b] N2O5 + hv -> NO + O + NO3 -[jno=userdefined,] NO + hv -> N + O -[jno_i] NO + hv -> NOp + e -[jno2] NO2 + hv -> NO + O -[jno3_a] NO3 + hv -> NO2 + O -[jno3_b] NO3 + hv -> NO + O2 +[jhno3] HNO3 + hv -> NO2 + OH +[jho2no2_a] HO2NO2 + hv -> OH + NO3 +[jho2no2_b] HO2NO2 + hv -> NO2 + HO2 +[jn2o] N2O + hv -> O1D + N2 +[jn2o5_a] N2O5 + hv -> NO2 + NO3 +[jn2o5_b] N2O5 + hv -> NO + O + NO3 +[jno=userdefined,] NO + hv -> N + O +[jno_i] NO + hv -> NOp + e +[jno2] NO2 + hv -> NO + O +[jno3_a] NO3 + hv -> NO2 + O +[jno3_b] NO3 + hv -> NO + O2 ********************************* *** organics ********************************* -[jch2o_a] CH2O + hv -> CO + 2*H -[jch2o_b] CH2O + hv -> CO + H2 -[jch3ooh] CH3OOH + hv -> CH2O + H + OH -[jch4_a] CH4 + hv -> H + CH3O2 -[jch4_b] CH4 + hv -> 1.44*H2 + 0.18*CH2O + 0.18*O + 0.33*OH + 0.33*H + 0.44*CO2 + 0.38*CO + 0.05*H2O -[jco2] CO2 + hv -> CO + O +[jch2o_a] CH2O + hv -> CO + 2*H +[jch2o_b] CH2O + hv -> CO + H2 +[jch3ooh] CH3OOH + hv -> CH2O + H + OH +[jch4_a] CH4 + hv -> H + CH3O2 +[jch4_b] CH4 + hv -> 1.44*H2 + 0.18*CH2O + 0.18*O + 0.33*OH + 0.33*H + 0.44*CO2 + 0.38*CO + 0.05*H2O +[jco2] CO2 + hv -> CO + O ********************************* *** halogens ********************************* -[jbrcl] BRCL + hv -> BR + CL -[jbro] BRO + hv -> BR + O -[jbrono2_b] BRONO2 + hv -> BRO + NO2 -[jbrono2_a] BRONO2 + hv -> BR + NO3 -[jccl4] CCL4 + hv -> 4*CL -[jcf2clbr] CF2CLBR + hv -> BR + CL + COF2 -[jcf3br] CF3BR + hv -> BR + F + COF2 -[jcfcl3] CFC11 + hv -> 2*CL + COFCL -[jcfc113] CFC113 + hv -> 2*CL + COFCL + COF2 -[jcfc114] CFC114 + hv -> 2*CL + 2*COF2 -[jcfc115] CFC115 + hv -> CL + F + 2*COF2 -[jcf2cl2] CFC12 + hv -> 2*CL + COF2 -[jch2br2] CH2BR2 + hv -> 2*BR -[jch3br] CH3BR + hv -> BR + CH3O2 -[jch3ccl3] CH3CCL3 + hv -> 3*CL -[jch3cl] CH3CL + hv -> CL + CH3O2 -[jchbr3] CHBR3 + hv -> 3*BR -[jcl2] CL2 + hv -> 2*CL -[jcl2o2] CL2O2 + hv -> 2*CL -[jclo] CLO + hv -> CL + O -[jclono2_a] CLONO2 + hv -> CL + NO3 -[jclono2_b] CLONO2 + hv -> CLO + NO2 -[jcof2] COF2 + hv -> 2*F -[jcofcl] COFCL + hv -> F + CL -[jh2402] H2402 + hv -> 2*BR + 2*COF2 -[jhbr] HBR + hv -> BR + H -[jhcfc141b] HCFC141B + hv -> CL + COFCL -[jhcfc142b] HCFC142B + hv -> CL + COF2 -[jhcfc22] HCFC22 + hv -> CL + COF2 -[jhcl] HCL + hv -> H + CL -[jhf] HF + hv -> H + F -[jhobr] HOBR + hv -> BR + OH -[jhocl] HOCL + hv -> OH + CL -[joclo] OCLO + hv -> O + CLO -[jsf6] SF6 + hv -> sink +[jbrcl] BRCL + hv -> BR + CL +[jbro] BRO + hv -> BR + O +[jbrono2_b] BRONO2 + hv -> BRO + NO2 +[jbrono2_a] BRONO2 + hv -> BR + NO3 +[jccl4] CCL4 + hv -> 4*CL +[jcf2clbr] CF2CLBR + hv -> BR + CL + COF2 +[jcf3br] CF3BR + hv -> BR + F + COF2 +[jcfcl3] CFC11 + hv -> 2*CL + COFCL +[jcfc113] CFC113 + hv -> 2*CL + COFCL + COF2 +[jcfc114] CFC114 + hv -> 2*CL + 2*COF2 +[jcfc115] CFC115 + hv -> CL + F + 2*COF2 +[jcf2cl2] CFC12 + hv -> 2*CL + COF2 +[jch2br2] CH2BR2 + hv -> 2*BR +[jch3br] CH3BR + hv -> BR + CH3O2 +[jch3ccl3] CH3CCL3 + hv -> 3*CL +[jch3cl] CH3CL + hv -> CL + CH3O2 +[jchbr3] CHBR3 + hv -> 3*BR +[jcl2] CL2 + hv -> 2*CL +[jcl2o2] CL2O2 + hv -> 2*CL +[jclo] CLO + hv -> CL + O +[jclono2_a] CLONO2 + hv -> CL + NO3 +[jclono2_b] CLONO2 + hv -> CLO + NO2 +[jcof2] COF2 + hv -> 2*F +[jcofcl] COFCL + hv -> F + CL +[jh2402] H2402 + hv -> 2*BR + 2*COF2 +[jhbr] HBR + hv -> BR + H +[jhcfc141b] HCFC141B + hv -> CL + COFCL +[jhcfc142b] HCFC142B + hv -> CL + COF2 +[jhcfc22] HCFC22 + hv -> CL + COF2 +[jhcl] HCL + hv -> H + CL +[jhf] HF + hv -> H + F +[jhobr] HOBR + hv -> BR + OH +[jhocl] HOCL + hv -> OH + CL +[joclo] OCLO + hv -> O + CLO +[jsf6] SF6 + hv -> sink ********************************* *** ions ********************************* -[jeuv_26=userdefined,userdefined] CO2 + hv -> CO + O -[jeuv_4=userdefined,userdefined] N + hv -> Np + e -[jeuv_6=userdefined,userdefined] N2 + hv -> N2p + e -[jeuv_22=userdefined,userdefined] N2 + hv -> N + Np + e -[jeuv_23=userdefined,userdefined] N2 + hv -> N2D + Np + e -[jeuv_25=userdefined,userdefined] N2 + hv -> 1.2*N2D + 0.8*N -[jeuv_18=userdefined,userdefined] N2 + hv -> N2p + e -[jeuv_13=userdefined,userdefined] N2 + hv -> 1.2*N2D + 0.8*N -[jeuv_11=userdefined,userdefined] N2 + hv -> N2D + Np + e -[jeuv_10=userdefined,userdefined] N2 + hv -> N + Np + e -[jeuv_3=userdefined,userdefined] O + hv -> Op2P + e -[jeuv_16=userdefined,userdefined] O + hv -> Op2P + e -[jeuv_1=userdefined,userdefined] O + hv -> Op + e -[jeuv_14=userdefined,userdefined] O + hv -> Op + e -[jeuv_2=userdefined,userdefined] O + hv -> Op2D + e -[jeuv_15=userdefined,userdefined] O + hv -> Op2D + e -[jeuv_21=userdefined,userdefined] O2 + hv -> O + Op2P + e -[jeuv_17=userdefined,userdefined] O2 + hv -> O2p + e -[jeuv_7=userdefined,userdefined] O2 + hv -> O + Op + e -[jeuv_5=userdefined,userdefined] O2 + hv -> O2p + e -[jeuv_19=userdefined,userdefined] O2 + hv -> O + Op + e -[jeuv_24=userdefined,userdefined] O2 + hv -> 2*O -[jeuv_12=userdefined,userdefined] O2 + hv -> 2*O -[jeuv_9=userdefined,userdefined] O2 + hv -> O + Op2P + e -[jeuv_8=userdefined,userdefined] O2 + hv -> O + Op2D + e -[jeuv_20=userdefined,userdefined] O2 + hv -> O + Op2D + e +[jeuv_26=userdefined,userdefined] CO2 + hv -> CO + O +[jeuv_4=userdefined,userdefined] N + hv -> Np + e +[jeuv_6=userdefined,userdefined] N2 + hv -> N2p + e +[jeuv_22=userdefined,userdefined] N2 + hv -> N + Np + e +[jeuv_23=userdefined,userdefined] N2 + hv -> N2D + Np + e +[jeuv_25=userdefined,userdefined] N2 + hv -> 1.2*N2D + 0.8*N +[jeuv_18=userdefined,userdefined] N2 + hv -> N2p + e +[jeuv_13=userdefined,userdefined] N2 + hv -> 1.2*N2D + 0.8*N +[jeuv_11=userdefined,userdefined] N2 + hv -> N2D + Np + e +[jeuv_10=userdefined,userdefined] N2 + hv -> N + Np + e +[jeuv_3=userdefined,userdefined] O + hv -> Op2P + e +[jeuv_16=userdefined,userdefined] O + hv -> Op2P + e +[jeuv_1=userdefined,userdefined] O + hv -> Op + e +[jeuv_14=userdefined,userdefined] O + hv -> Op + e +[jeuv_2=userdefined,userdefined] O + hv -> Op2D + e +[jeuv_15=userdefined,userdefined] O + hv -> Op2D + e +[jeuv_21=userdefined,userdefined] O2 + hv -> O + Op2P + e +[jeuv_17=userdefined,userdefined] O2 + hv -> O2p + e +[jeuv_7=userdefined,userdefined] O2 + hv -> O + Op + e +[jeuv_5=userdefined,userdefined] O2 + hv -> O2p + e +[jeuv_19=userdefined,userdefined] O2 + hv -> O + Op + e +[jeuv_24=userdefined,userdefined] O2 + hv -> 2*O +[jeuv_12=userdefined,userdefined] O2 + hv -> 2*O +[jeuv_9=userdefined,userdefined] O2 + hv -> O + Op2P + e +[jeuv_8=userdefined,userdefined] O2 + hv -> O + Op2D + e +[jeuv_20=userdefined,userdefined] O2 + hv -> O + Op2D + e ********************************* *** sulfur ********************************* -[jh2so4] H2SO4 + hv -> SO3 + H2O -[jocs] OCS + hv -> S + CO -[jso] SO + hv -> S + O -[jso2] SO2 + hv -> SO + O -[jso3] SO3 + hv -> SO2 + O +[jh2so4] H2SO4 + hv -> SO3 + H2O +[jocs] OCS + hv -> S + CO +[jso] SO + hv -> S + O +[jso2] SO2 + hv -> SO + O +[jso3] SO3 + hv -> SO2 + O End Photolysis Reactions ********************************* *** odd-oxygen ********************************* -[ag1] O2_1D -> O2 ; 0.000258 -[ag2] O2_1S -> O2 ; 0.085 -[O1D_H2] O1D + H2 -> H + OH ; 1.2e-10 -[O1D_H2O] O1D + H2O -> 2*OH ; 1.63e-10, 60 -[O1D_N2,cph=189.81] O1D + N2 -> O + N2 ; 2.15e-11, 110 -[O1D_O2,cph=32.91] O1D + O2 -> O + O2_1S ; 2.64e-11, 55 -[O1D_O2b,cph=189.81] O1D + O2 -> O + O2 ; 6.6e-12, 55 -[O1D_O3] O1D + O3 -> O2 + O2 ; 1.2e-10 -[O2_1D_N2,cph=94.3] O2_1D + N2 -> O2 + N2 ; 1e-20 -[O2_1D_O,cph=94.3] O2_1D + O -> O2 + O ; 1.3e-16 -[O2_1D_O2,cph=94.3] O2_1D + O2 -> 2*O2 ; 3.6e-18, -220 -[O2_1S_CO2] O2_1S + CO2 -> O2_1D + CO2 ; 4.2e-13 -[O2_1S_N2,cph=62.6] O2_1S + N2 -> O2_1D + N2 ; 1.8e-15, 45 -[O2_1S_O,cph=62.6] O2_1S + O -> O2_1D + O ; 8e-14 -[O2_1S_O2,cph=62.6] O2_1S + O2 -> O2_1D + O2 ; 3.9e-17 -[O2_1S_O3,cph=62.6] O2_1S + O3 -> O2_1D + O3 ; 3.5e-11, -135 -[O_O3,cph=392.19] O + O3 -> 2*O2 ; 8e-12, -2060 -[usr_O_O,cph=493.58] O + O + M -> O2 + M -[usr_O_O2,cph=101.39] O + O2 + M -> O3 + M +[ag1] O2_1D -> O2 ; 0.000258 +[ag2] O2_1S -> O2 ; 0.085 +[O1D_H2] O1D + H2 -> H + OH ; 1.2e-10 +[O1D_H2O] O1D + H2O -> 2*OH ; 1.63e-10, 60 +[O1D_N2,cph=189.81] O1D + N2 -> O + N2 ; 2.15e-11, 110 +[O1D_O2,cph=32.91] O1D + O2 -> O + O2_1S ; 2.64e-11, 55 +[O1D_O2b,cph=189.81] O1D + O2 -> O + O2 ; 6.6e-12, 55 +[O1D_O3] O1D + O3 -> O2 + O2 ; 1.2e-10 +[O2_1D_N2,cph=94.3] O2_1D + N2 -> O2 + N2 ; 1e-20 +[O2_1D_O,cph=94.3] O2_1D + O -> O2 + O ; 1.3e-16 +[O2_1D_O2,cph=94.3] O2_1D + O2 -> 2*O2 ; 3.6e-18, -220 +[O2_1S_CO2] O2_1S + CO2 -> O2_1D + CO2 ; 4.2e-13 +[O2_1S_N2,cph=62.6] O2_1S + N2 -> O2_1D + N2 ; 1.8e-15, 45 +[O2_1S_O,cph=62.6] O2_1S + O -> O2_1D + O ; 8e-14 +[O2_1S_O2,cph=62.6] O2_1S + O2 -> O2_1D + O2 ; 3.9e-17 +[O2_1S_O3,cph=62.6] O2_1S + O3 -> O2_1D + O3 ; 3.5e-11, -135 +[O_O3,cph=392.19] O + O3 -> 2*O2 ; 8e-12, -2060 +[usr_O_O,cph=493.58] O + O + M -> O2 + M +[usr_O_O2,cph=101.39] O + O2 + M -> O3 + M ********************************* *** odd-hydrogen ********************************* -[H2_O] H2 + O -> OH + H ; 1.6e-11, -4570 -[H2O2_O] H2O2 + O -> OH + HO2 ; 1.4e-12, -2000 -[H_HO2,cph=232.59] H + HO2 -> H2 + O2 ; 6.9e-12 -[H_HO2a] H + HO2 -> 2*OH ; 7.2e-11 -[H_HO2b] H + HO2 -> H2O + O ; 1.6e-12 -[H_O2,cph=203.4] H + O2 + M -> HO2 + M ; 5.3e-32, 1.8, 9.5e-11, -0.4, 0.6 -[HO2_O,cph=226.58] HO2 + O -> OH + O2 ; 3e-11, 200 -[HO2_O3,cph=120.1] HO2 + O3 -> OH + 2*O2 ; 1e-14, -490 -[H_O3,cph=194.71] H + O3 -> OH + O2 ; 1.4e-10, -470 -[OH_H2] OH + H2 -> H2O + H ; 2.8e-12, -1800 -[OH_H2O2] OH + H2O2 -> H2O + HO2 ; 1.8e-12 -[OH_HO2,cph=293.62] OH + HO2 -> H2O + O2 ; 4.8e-11, 250 -[OH_O,cph=67.67] OH + O -> H + O2 ; 1.8e-11, 180 -[OH_O3,cph=165.3] OH + O3 -> HO2 + O2 ; 1.7e-12, -940 -[OH_OH] OH + OH -> H2O + O ; 1.8e-12 -[OH_OH_M] OH + OH + M -> H2O2 + M ; 6.9e-31, 1, 2.6e-11, 0, 0.6 -[usr_HO2_HO2,cph=165.51] HO2 + HO2 -> H2O2 + O2 +[H2_O] H2 + O -> OH + H ; 1.6e-11, -4570 +[H2O2_O] H2O2 + O -> OH + HO2 ; 1.4e-12, -2000 +[H_HO2,cph=232.59] H + HO2 -> H2 + O2 ; 6.9e-12 +[H_HO2a] H + HO2 -> 2*OH ; 7.2e-11 +[H_HO2b] H + HO2 -> H2O + O ; 1.6e-12 +[H_O2,cph=203.4] H + O2 + M -> HO2 + M ; 5.3e-32, 1.8, 9.5e-11, -0.4, 0.6 +[HO2_O,cph=226.58] HO2 + O -> OH + O2 ; 3e-11, 200 +[HO2_O3,cph=120.1] HO2 + O3 -> OH + 2*O2 ; 1e-14, -490 +[H_O3,cph=194.71] H + O3 -> OH + O2 ; 1.4e-10, -470 +[OH_H2] OH + H2 -> H2O + H ; 2.8e-12, -1800 +[OH_H2O2] OH + H2O2 -> H2O + HO2 ; 1.8e-12 +[OH_HO2,cph=293.62] OH + HO2 -> H2O + O2 ; 4.8e-11, 250 +[OH_O,cph=67.67] OH + O -> H + O2 ; 1.8e-11, 180 +[OH_O3,cph=165.3] OH + O3 -> HO2 + O2 ; 1.7e-12, -940 +[OH_OH] OH + OH -> H2O + O ; 1.8e-12 +[OH_OH_M] OH + OH + M -> H2O2 + M ; 6.9e-31, 1, 2.6e-11, 0, 0.6 +[usr_HO2_HO2,cph=165.51] HO2 + HO2 -> H2O2 + O2 ********************************* *** odd-nitrogen ********************************* -[HO2NO2_OH] HO2NO2 + OH -> H2O + NO2 + O2 ; 4.5e-13, 610 -[N2D_O,cph=229.61] N2D + O -> N + O ; 7e-13 -[N2D_O2,cph=177.51] N2D + O2 -> NO + O1D ; 5e-12 -[N_NO,cph=313.75] N + NO -> N2 + O ; 2.1e-11, 100 -[N_NO2a] N + NO2 -> N2O + O ; 2.9e-12, 220 -[N_NO2b] N + NO2 -> 2*NO ; 1.45e-12, 220 -[N_NO2c] N + NO2 -> N2 + O2 ; 1.45e-12, 220 -[N_O2,cph=133.75] N + O2 -> NO + O ; 3.3e-12, -3150 -[NO2_O,cph=193.02] NO2 + O -> NO + O2 ; 5.1e-12, 210 -[NO2_O3] NO2 + O3 -> NO3 + O2 ; 1.2e-13, -2450 -[NO2_O_M] NO2 + O + M -> NO3 + M ; 2.5e-31, 1.8, 2.2e-11, 0.7, 0.6 -[NO3_HO2] NO3 + HO2 -> OH + NO2 + O2 ; 3.5e-12 -[NO3_NO] NO3 + NO -> 2*NO2 ; 1.7e-11, 125 -[NO3_O] NO3 + O -> NO2 + O2 ; 1.3e-11 -[NO3_OH] NO3 + OH -> HO2 + NO2 ; 2.2e-11 -[N_OH] N + OH -> NO + H ; 5e-11 -[NO_HO2,cph=34.47] NO + HO2 -> NO2 + OH ; 3.44e-12, 260 -[NO_O3,cph=199.17] NO + O3 -> NO2 + O2 ; 3e-12, -1500 -[NO_O_M] NO + O + M -> NO2 + M ; 9e-32, 1.5, 3e-11, 0, 0.6 -[O1D_N2Oa] O1D + N2O -> 2*NO ; 7.26e-11, 20 -[O1D_N2Ob] O1D + N2O -> N2 + O2 ; 4.64e-11, 20 -[tag_NO2_HO2] NO2 + HO2 + M -> HO2NO2 + M ; 1.9e-31, 3.4, 4e-12, 0.3, 0.6 -[tag_NO2_NO3] NO2 + NO3 + M -> N2O5 + M ; 2.4e-30, 3, 1.6e-12, -0.1, 0.6 -[tag_NO2_OH] NO2 + OH + M -> HNO3 + M ; 1.8e-30, 3, 2.8e-11, 0, 0.6 -[usr_HNO3_OH] HNO3 + OH -> NO3 + H2O -[usr_HO2NO2_M] HO2NO2 + M -> HO2 + NO2 + M -[usr_N2O5_M] N2O5 + M -> NO2 + NO3 + M +[HO2NO2_OH] HO2NO2 + OH -> H2O + NO2 + O2 ; 4.5e-13, 610 +[N2D_O,cph=229.61] N2D + O -> N + O ; 7e-13 +[N2D_O2,cph=177.51] N2D + O2 -> NO + O1D ; 5e-12 +[N_NO,cph=313.75] N + NO -> N2 + O ; 2.1e-11, 100 +[N_NO2a] N + NO2 -> N2O + O ; 2.9e-12, 220 +[N_NO2b] N + NO2 -> 2*NO ; 1.45e-12, 220 +[N_NO2c] N + NO2 -> N2 + O2 ; 1.45e-12, 220 +[N_O2,cph=133.75] N + O2 -> NO + O ; 3.3e-12, -3150 +[NO2_O,cph=193.02] NO2 + O -> NO + O2 ; 5.1e-12, 210 +[NO2_O3] NO2 + O3 -> NO3 + O2 ; 1.2e-13, -2450 +[NO2_O_M] NO2 + O + M -> NO3 + M ; 2.5e-31, 1.8, 2.2e-11, 0.7, 0.6 +[NO3_HO2] NO3 + HO2 -> OH + NO2 + O2 ; 3.5e-12 +[NO3_NO] NO3 + NO -> 2*NO2 ; 1.7e-11, 125 +[NO3_O] NO3 + O -> NO2 + O2 ; 1.3e-11 +[NO3_OH] NO3 + OH -> HO2 + NO2 ; 2.2e-11 +[N_OH] N + OH -> NO + H ; 5e-11 +[NO_HO2,cph=34.47] NO + HO2 -> NO2 + OH ; 3.44e-12, 260 +[NO_O3,cph=199.17] NO + O3 -> NO2 + O2 ; 3e-12, -1500 +[NO_O_M] NO + O + M -> NO2 + M ; 9e-32, 1.5, 3e-11, 0, 0.6 +[O1D_N2Oa] O1D + N2O -> 2*NO ; 7.26e-11, 20 +[O1D_N2Ob] O1D + N2O -> N2 + O2 ; 4.64e-11, 20 +[tag_NO2_HO2] NO2 + HO2 + M -> HO2NO2 + M ; 1.9e-31, 3.4, 4e-12, 0.3, 0.6 +[tag_NO2_NO3] NO2 + NO3 + M -> N2O5 + M ; 2.4e-30, 3, 1.6e-12, -0.1, 0.6 +[tag_NO2_OH] NO2 + OH + M -> HNO3 + M ; 1.8e-30, 3, 2.8e-11, 0, 0.6 +[usr_HNO3_OH] HNO3 + OH -> NO3 + H2O +[usr_HO2NO2_M] HO2NO2 + M -> HO2 + NO2 + M +[usr_N2O5_M] N2O5 + M -> NO2 + NO3 + M ********************************* *** odd-chlorine ********************************* -[CL_CH2O] CL + CH2O -> HCL + HO2 + CO ; 8.1e-11, -30 -[CL_CH4] CL + CH4 -> CH3O2 + HCL ; 7.1e-12, -1270 -[CL_H2] CL + H2 -> HCL + H ; 3.05e-11, -2270 -[CL_H2O2] CL + H2O2 -> HCL + HO2 ; 1.1e-11, -980 -[CL_HO2a] CL + HO2 -> HCL + O2 ; 1.4e-11, 270 -[CL_HO2b] CL + HO2 -> OH + CLO ; 3.6e-11, -375 -[CL_O3] CL + O3 -> CLO + O2 ; 2.3e-11, -200 -[CLO_CH3O2] CLO + CH3O2 -> CL + HO2 + CH2O ; 3.3e-12, -115 -[CLO_CLOa] CLO + CLO -> 2*CL + O2 ; 3e-11, -2450 -[CLO_CLOb] CLO + CLO -> CL2 + O2 ; 1e-12, -1590 -[CLO_CLOc] CLO + CLO -> CL + OCLO ; 3.5e-13, -1370 -[CLO_HO2] CLO + HO2 -> O2 + HOCL ; 2.6e-12, 290 -[CLO_NO] CLO + NO -> NO2 + CL ; 6.4e-12, 290 -[CLONO2_CL] CLONO2 + CL -> CL2 + NO3 ; 6.5e-12, 135 -[CLO_NO2_M] CLO + NO2 + M -> CLONO2 + M ; 1.8e-31, 3.4, 1.5e-11, 1.9, 0.6 -[CLONO2_O] CLONO2 + O -> CLO + NO3 ; 3.6e-12, -840 -[CLONO2_OH] CLONO2 + OH -> HOCL + NO3 ; 1.2e-12, -330 -[CLO_O] CLO + O -> CL + O2 ; 2.8e-11, 85 -[CLO_OHa] CLO + OH -> CL + HO2 ; 7.4e-12, 270 -[CLO_OHb] CLO + OH -> HCL + O2 ; 6e-13, 230 -[HCL_O] HCL + O -> CL + OH ; 1e-11, -3300 -[HCL_OH] HCL + OH -> H2O + CL ; 1.8e-12, -250 -[HOCL_CL] HOCL + CL -> HCL + CLO ; 3.4e-12, -130 -[HOCL_O] HOCL + O -> CLO + OH ; 1.7e-13 -[HOCL_OH] HOCL + OH -> H2O + CLO ; 3e-12, -500 -[O1D_CCL4] O1D + CCL4 -> 4*CL ; 2.607e-10 -[O1D_CF2CLBR] O1D + CF2CLBR -> CL + BR + COF2 ; 9.75e-11 -[O1D_CFC11] O1D + CFC11 -> 2*CL + COFCL ; 2.07e-10 -[O1D_CFC113] O1D + CFC113 -> 2*CL + COFCL + COF2 ; 2.088e-10 -[O1D_CFC114] O1D + CFC114 -> 2*CL + 2*COF2 ; 1.17e-10 -[O1D_CFC115] O1D + CFC115 -> CL + F + 2*COF2 ; 4.644e-11 -[O1D_CFC12] O1D + CFC12 -> 2*CL + COF2 ; 1.204e-10 -[O1D_HCLa] O1D + HCL -> CL + OH ; 9.9e-11 -[O1D_HCLb] O1D + HCL -> CLO + H ; 3.3e-12 -[tag_CLO_CLO_M] CLO + CLO + M -> CL2O2 + M ; 1.9e-32, 3.6, 3.7e-12, 1.6, 0.6 -[usr_CL2O2_M] CL2O2 + M -> CLO + CLO + M +[CL_CH2O] CL + CH2O -> HCL + HO2 + CO ; 8.1e-11, -30 +[CL_CH4] CL + CH4 -> CH3O2 + HCL ; 7.1e-12, -1270 +[CL_H2] CL + H2 -> HCL + H ; 3.05e-11, -2270 +[CL_H2O2] CL + H2O2 -> HCL + HO2 ; 1.1e-11, -980 +[CL_HO2a] CL + HO2 -> HCL + O2 ; 1.4e-11, 270 +[CL_HO2b] CL + HO2 -> OH + CLO ; 3.6e-11, -375 +[CL_O3] CL + O3 -> CLO + O2 ; 2.3e-11, -200 +[CLO_CH3O2] CLO + CH3O2 -> CL + HO2 + CH2O ; 3.3e-12, -115 +[CLO_CLOa] CLO + CLO -> 2*CL + O2 ; 3e-11, -2450 +[CLO_CLOb] CLO + CLO -> CL2 + O2 ; 1e-12, -1590 +[CLO_CLOc] CLO + CLO -> CL + OCLO ; 3.5e-13, -1370 +[CLO_HO2] CLO + HO2 -> O2 + HOCL ; 2.6e-12, 290 +[CLO_NO] CLO + NO -> NO2 + CL ; 6.4e-12, 290 +[CLONO2_CL] CLONO2 + CL -> CL2 + NO3 ; 6.5e-12, 135 +[CLO_NO2_M] CLO + NO2 + M -> CLONO2 + M ; 1.8e-31, 3.4, 1.5e-11, 1.9, 0.6 +[CLONO2_O] CLONO2 + O -> CLO + NO3 ; 3.6e-12, -840 +[CLONO2_OH] CLONO2 + OH -> HOCL + NO3 ; 1.2e-12, -330 +[CLO_O] CLO + O -> CL + O2 ; 2.8e-11, 85 +[CLO_OHa] CLO + OH -> CL + HO2 ; 7.4e-12, 270 +[CLO_OHb] CLO + OH -> HCL + O2 ; 6e-13, 230 +[HCL_O] HCL + O -> CL + OH ; 1e-11, -3300 +[HCL_OH] HCL + OH -> H2O + CL ; 1.8e-12, -250 +[HOCL_CL] HOCL + CL -> HCL + CLO ; 3.4e-12, -130 +[HOCL_O] HOCL + O -> CLO + OH ; 1.7e-13 +[HOCL_OH] HOCL + OH -> H2O + CLO ; 3e-12, -500 +[O1D_CCL4] O1D + CCL4 -> 4*CL ; 2.607e-10 +[O1D_CF2CLBR] O1D + CF2CLBR -> CL + BR + COF2 ; 9.75e-11 +[O1D_CFC11] O1D + CFC11 -> 2*CL + COFCL ; 2.07e-10 +[O1D_CFC113] O1D + CFC113 -> 2*CL + COFCL + COF2 ; 2.088e-10 +[O1D_CFC114] O1D + CFC114 -> 2*CL + 2*COF2 ; 1.17e-10 +[O1D_CFC115] O1D + CFC115 -> CL + F + 2*COF2 ; 4.644e-11 +[O1D_CFC12] O1D + CFC12 -> 2*CL + COF2 ; 1.204e-10 +[O1D_HCLa] O1D + HCL -> CL + OH ; 9.9e-11 +[O1D_HCLb] O1D + HCL -> CLO + H ; 3.3e-12 +[tag_CLO_CLO_M] CLO + CLO + M -> CL2O2 + M ; 1.9e-32, 3.6, 3.7e-12, 1.6, 0.6 +[usr_CL2O2_M] CL2O2 + M -> CLO + CLO + M ********************************* *** odd-bromine ********************************* -[BR_CH2O] BR + CH2O -> HBR + HO2 + CO ; 1.7e-11, -800 -[BR_HO2] BR + HO2 -> HBR + O2 ; 4.8e-12, -310 -[BR_O3] BR + O3 -> BRO + O2 ; 1.6e-11, -780 -[BRO_BRO] BRO + BRO -> 2*BR + O2 ; 1.5e-12, 230 -[BRO_CLOa] BRO + CLO -> BR + OCLO ; 9.5e-13, 550 -[BRO_CLOb] BRO + CLO -> BR + CL + O2 ; 2.3e-12, 260 -[BRO_CLOc] BRO + CLO -> BRCL + O2 ; 4.1e-13, 290 -[BRO_HO2] BRO + HO2 -> HOBR + O2 ; 4.5e-12, 460 -[BRO_NO] BRO + NO -> BR + NO2 ; 8.8e-12, 260 -[BRO_NO2_M] BRO + NO2 + M -> BRONO2 + M ; 5.2e-31, 3.2, 6.9e-12, 2.9, 0.6 -[BRONO2_O] BRONO2 + O -> BRO + NO3 ; 1.9e-11, 215 -[BRO_O] BRO + O -> BR + O2 ; 1.9e-11, 230 -[BRO_OH] BRO + OH -> BR + HO2 ; 1.7e-11, 250 -[HBR_O] HBR + O -> BR + OH ; 5.8e-12, -1500 -[HBR_OH] HBR + OH -> BR + H2O ; 5.5e-12, 200 -[HOBR_O] HOBR + O -> BRO + OH ; 1.2e-10, -430 -[O1D_CF3BR] O1D + CF3BR -> BR + F + COF2 ; 4.5e-11 -[O1D_CHBR3] O1D + CHBR3 -> 3*BR ; 4.62e-10 -[O1D_H2402] O1D + H2402 -> 2*BR + 2*COF2 ; 1.2e-10 -[O1D_HBRa] O1D + HBR -> BR + OH ; 9e-11 -[O1D_HBRb] O1D + HBR -> BRO + H ; 3e-11 +[BR_CH2O] BR + CH2O -> HBR + HO2 + CO ; 1.7e-11, -800 +[BR_HO2] BR + HO2 -> HBR + O2 ; 4.8e-12, -310 +[BR_O3] BR + O3 -> BRO + O2 ; 1.6e-11, -780 +[BRO_BRO] BRO + BRO -> 2*BR + O2 ; 1.5e-12, 230 +[BRO_CLOa] BRO + CLO -> BR + OCLO ; 9.5e-13, 550 +[BRO_CLOb] BRO + CLO -> BR + CL + O2 ; 2.3e-12, 260 +[BRO_CLOc] BRO + CLO -> BRCL + O2 ; 4.1e-13, 290 +[BRO_HO2] BRO + HO2 -> HOBR + O2 ; 4.5e-12, 460 +[BRO_NO] BRO + NO -> BR + NO2 ; 8.8e-12, 260 +[BRO_NO2_M] BRO + NO2 + M -> BRONO2 + M ; 5.2e-31, 3.2, 6.9e-12, 2.9, 0.6 +[BRONO2_O] BRONO2 + O -> BRO + NO3 ; 1.9e-11, 215 +[BRO_O] BRO + O -> BR + O2 ; 1.9e-11, 230 +[BRO_OH] BRO + OH -> BR + HO2 ; 1.7e-11, 250 +[HBR_O] HBR + O -> BR + OH ; 5.8e-12, -1500 +[HBR_OH] HBR + OH -> BR + H2O ; 5.5e-12, 200 +[HOBR_O] HOBR + O -> BRO + OH ; 1.2e-10, -430 +[O1D_CF3BR] O1D + CF3BR -> BR + F + COF2 ; 4.5e-11 +[O1D_CHBR3] O1D + CHBR3 -> 3*BR ; 4.62e-10 +[O1D_H2402] O1D + H2402 -> 2*BR + 2*COF2 ; 1.2e-10 +[O1D_HBRa] O1D + HBR -> BR + OH ; 9e-11 +[O1D_HBRb] O1D + HBR -> BRO + H ; 3e-11 ********************************* *** odd-fluorine ********************************* -[F_CH4] F + CH4 -> HF + CH3O2 ; 1.6e-10, -260 -[F_H2] F + H2 -> HF + H ; 1.4e-10, -500 -[F_H2O] F + H2O -> HF + OH ; 1.4e-11, 0 -[F_HNO3] F + HNO3 -> HF + NO3 ; 6e-12, 400 -[O1D_COF2] O1D + COF2 -> 2*F ; 2.14e-11 -[O1D_COFCL] O1D + COFCL -> F + CL ; 1.9e-10 +[F_CH4] F + CH4 -> HF + CH3O2 ; 1.6e-10, -260 +[F_H2] F + H2 -> HF + H ; 1.4e-10, -500 +[F_H2O] F + H2O -> HF + OH ; 1.4e-11, 0 +[F_HNO3] F + HNO3 -> HF + NO3 ; 6e-12, 400 +[O1D_COF2] O1D + COF2 -> 2*F ; 2.14e-11 +[O1D_COFCL] O1D + COFCL -> F + CL ; 1.9e-10 ********************************* *** organic-halogens ********************************* -[CH2BR2_CL] CH2BR2 + CL -> 2*BR + HCL ; 6.3e-12, -800 -[CH2BR2_OH] CH2BR2 + OH -> 2*BR + H2O ; 2e-12, -840 -[CH3BR_CL] CH3BR + CL -> HCL + HO2 + BR ; 1.46e-11, -1040 -[CH3BR_OH] CH3BR + OH -> BR + H2O + HO2 ; 1.42e-12, -1150 -[CH3CCL3_OH] CH3CCL3 + OH -> H2O + 3*CL ; 1.64e-12, -1520 -[CH3CL_CL] CH3CL + CL -> HO2 + CO + 2*HCL ; 2.03e-11, -1110 -[CH3CL_OH] CH3CL + OH -> CL + H2O + HO2 ; 1.96e-12, -1200 -[CHBR3_CL] CHBR3 + CL -> 3*BR + HCL ; 4.85e-12, -850 -[CHBR3_OH] CHBR3 + OH -> 3*BR ; 9e-13, -360 -[HCFC141B_OH] HCFC141B + OH -> CL + COFCL ; 1.25e-12, -1600 -[HCFC142B_OH] HCFC142B + OH -> CL + COF2 ; 1.3e-12, -1770 -[HCFC22_OH] HCFC22 + OH -> H2O + CL + COF2 ; 9.2e-13, -1560 -[O1D_CH2BR2] O1D + CH2BR2 -> 2*BR ; 2.57e-10 -[O1D_CH3BR] O1D + CH3BR -> BR ; 1.8e-10 -[O1D_HCFC141B] O1D + HCFC141B -> CL + COFCL ; 1.794e-10 -[O1D_HCFC142B] O1D + HCFC142B -> CL + COF2 ; 1.3e-10 -[O1D_HCFC22] O1D + HCFC22 -> CL + COF2 ; 7.65e-11 +[CH2BR2_CL] CH2BR2 + CL -> 2*BR + HCL ; 6.3e-12, -800 +[CH2BR2_OH] CH2BR2 + OH -> 2*BR + H2O ; 2e-12, -840 +[CH3BR_CL] CH3BR + CL -> HCL + HO2 + BR ; 1.46e-11, -1040 +[CH3BR_OH] CH3BR + OH -> BR + H2O + HO2 ; 1.42e-12, -1150 +[CH3CCL3_OH] CH3CCL3 + OH -> H2O + 3*CL ; 1.64e-12, -1520 +[CH3CL_CL] CH3CL + CL -> HO2 + CO + 2*HCL ; 2.03e-11, -1110 +[CH3CL_OH] CH3CL + OH -> CL + H2O + HO2 ; 1.96e-12, -1200 +[CHBR3_CL] CHBR3 + CL -> 3*BR + HCL ; 4.85e-12, -850 +[CHBR3_OH] CHBR3 + OH -> 3*BR ; 9e-13, -360 +[HCFC141B_OH] HCFC141B + OH -> CL + COFCL ; 1.25e-12, -1600 +[HCFC142B_OH] HCFC142B + OH -> CL + COF2 ; 1.3e-12, -1770 +[HCFC22_OH] HCFC22 + OH -> H2O + CL + COF2 ; 9.2e-13, -1560 +[O1D_CH2BR2] O1D + CH2BR2 -> 2*BR ; 2.57e-10 +[O1D_CH3BR] O1D + CH3BR -> BR ; 1.8e-10 +[O1D_HCFC141B] O1D + HCFC141B -> CL + COFCL ; 1.794e-10 +[O1D_HCFC142B] O1D + HCFC142B -> CL + COF2 ; 1.3e-10 +[O1D_HCFC22] O1D + HCFC22 -> CL + COF2 ; 7.65e-11 ********************************* *** C1 ********************************* -[CH2O_NO3] CH2O + NO3 -> CO + HO2 + HNO3 ; 6e-13, -2058 -[CH2O_O] CH2O + O -> HO2 + OH + CO ; 3.4e-11, -1600 -[CH2O_OH] CH2O + OH -> CO + H2O + H ; 5.5e-12, 125 -[CH3O2_HO2] CH3O2 + HO2 -> CH3OOH + O2 ; 4.1e-13, 750 -[CH3O2_NO] CH3O2 + NO -> CH2O + NO2 + HO2 ; 2.8e-12, 300 -[CH3OOH_OH] CH3OOH + OH -> 0.7*CH3O2 + 0.3*OH + 0.3*CH2O + H2O ; 3.8e-12, 200 -[CH4_OH] CH4 + OH -> CH3O2 + H2O ; 2.45e-12, -1775 -[O1D_CH4a] O1D + CH4 -> CH3O2 + OH ; 1.31e-10 -[O1D_CH4b] O1D + CH4 -> CH2O + H + HO2 ; 3.5e-11 -[O1D_CH4c] O1D + CH4 -> CH2O + H2 ; 9e-12 -[usr_CO_OH] CO + OH -> CO2 + HO2 +[CH2O_NO3] CH2O + NO3 -> CO + HO2 + HNO3 ; 6e-13, -2058 +[CH2O_O] CH2O + O -> HO2 + OH + CO ; 3.4e-11, -1600 +[CH2O_OH] CH2O + OH -> CO + H2O + H ; 5.5e-12, 125 +[CH3O2_HO2] CH3O2 + HO2 -> CH3OOH + O2 ; 4.1e-13, 750 +[CH3O2_NO] CH3O2 + NO -> CH2O + NO2 + HO2 ; 2.8e-12, 300 +[CH3OOH_OH] CH3OOH + OH -> 0.7*CH3O2 + 0.3*OH + 0.3*CH2O + H2O ; 3.8e-12, 200 +[CH4_OH] CH4 + OH -> CH3O2 + H2O ; 2.45e-12, -1775 +[O1D_CH4a] O1D + CH4 -> CH3O2 + OH ; 1.31e-10 +[O1D_CH4b] O1D + CH4 -> CH2O + H + HO2 ; 3.5e-11 +[O1D_CH4c] O1D + CH4 -> CH2O + H2 ; 9e-12 +[usr_CO_OH] CO + OH -> CO2 + HO2 ********************************* *** Sulfur ********************************* -[DMS_NO3] DMS + NO3 -> SO2 + HNO3 ; 1.9e-13, 520 -[DMS_OHa] DMS + OH -> SO2 ; 1.1e-11, -280 -[OCS_O] OCS + O -> SO + CO ; 2.1e-11, -2200 -[OCS_OH] OCS + OH -> SO2 + CO + H ; 7.2e-14, -1070 -[S_O2] S + O2 -> SO + O ; 2.3e-12 -[SO2_OH_M] SO2 + OH + M -> SO3 + HO2 ; 2.9e-31, 4.1, 1.7e-12, -0.2, 0.6 -[S_O3] S + O3 -> SO + O2 ; 1.2e-11 -[SO_BRO] SO + BRO -> SO2 + BR ; 5.7e-11 -[SO_CLO] SO + CLO -> SO2 + CL ; 2.8e-11 -[S_OH] S + OH -> SO + H ; 6.6e-11 -[SO_NO2] SO + NO2 -> SO2 + NO ; 1.4e-11 -[SO_O2] SO + O2 -> SO2 + O ; 1.6e-13, -2280 -[SO_O3] SO + O3 -> SO2 + O2 ; 3.4e-12, -1100 -[SO_OCLO] SO + OCLO -> SO2 + CLO ; 1.9e-12 -[SO_OH] SO + OH -> SO2 + H ; 2.6e-11, 330 -[usr_DMS_OH] DMS + OH -> 0.5*SO2 + 0.5*HO2 -[usr_SO3_H2O] SO3 + H2O -> H2SO4 +[DMS_NO3] DMS + NO3 -> SO2 + HNO3 ; 1.9e-13, 520 +[DMS_OHa] DMS + OH -> SO2 ; 1.1e-11, -280 +[OCS_O] OCS + O -> SO + CO ; 2.1e-11, -2200 +[OCS_OH] OCS + OH -> SO2 + CO + H ; 7.2e-14, -1070 +[S_O2] S + O2 -> SO + O ; 2.3e-12 +[SO2_OH_M] SO2 + OH + M -> SO3 + HO2 ; 2.9e-31, 4.1, 1.7e-12, -0.2, 0.6 +[S_O3] S + O3 -> SO + O2 ; 1.2e-11 +[SO_BRO] SO + BRO -> SO2 + BR ; 5.7e-11 +[SO_CLO] SO + CLO -> SO2 + CL ; 2.8e-11 +[S_OH] S + OH -> SO + H ; 6.6e-11 +[SO_NO2] SO + NO2 -> SO2 + NO ; 1.4e-11 +[SO_O2] SO + O2 -> SO2 + O ; 1.6e-13, -2280 +[SO_O3] SO + O3 -> SO2 + O2 ; 3.4e-12, -1100 +[SO_OCLO] SO + OCLO -> SO2 + CLO ; 1.9e-12 +[SO_OH] SO + OH -> SO2 + H ; 2.6e-11, 330 +[usr_DMS_OH] DMS + OH -> 0.5*SO2 + 0.5*HO2 +[usr_SO3_H2O] SO3 + H2O -> H2SO4 ********************************* *** Tropospheric Aerosol ********************************* -[usr_HO2_aer] HO2 -> 0.5*H2O2 -[usr_N2O5_aer] N2O5 -> 2*HNO3 -[usr_NO2_aer] NO2 -> 0.5*OH + 0.5*NO + 0.5*HNO3 -[usr_NO3_aer] NO3 -> HNO3 +[usr_HO2_aer] HO2 -> 0.5*H2O2 +[usr_N2O5_aer] N2O5 -> 2*HNO3 +[usr_NO2_aer] NO2 -> 0.5*OH + 0.5*NO + 0.5*HNO3 +[usr_NO3_aer] NO3 -> HNO3 ********************************* *** Stratospheric Aerosol ********************************* -[het1] N2O5 -> 2*HNO3 -[het10] HOCL + HCL -> CL2 + H2O -[het11] BRONO2 -> HOBR + HNO3 -[het12] N2O5 -> 2*HNO3 -[het13] CLONO2 -> HOCL + HNO3 -[het14] BRONO2 -> HOBR + HNO3 -[het15] CLONO2 + HCL -> CL2 + HNO3 -[het16] HOCL + HCL -> CL2 + H2O -[het17] HOBR + HCL -> BRCL + H2O -[het2] CLONO2 -> HOCL + HNO3 -[het3] BRONO2 -> HOBR + HNO3 -[het4] CLONO2 + HCL -> CL2 + HNO3 -[het5] HOCL + HCL -> CL2 + H2O -[het6] HOBR + HCL -> BRCL + H2O -[het7] N2O5 -> 2*HNO3 -[het8] CLONO2 -> HOCL + HNO3 -[het9] CLONO2 + HCL -> CL2 + HNO3 +[het1] N2O5 -> 2*HNO3 +[het10] HOCL + HCL -> CL2 + H2O +[het11] BRONO2 -> HOBR + HNO3 +[het12] N2O5 -> 2*HNO3 +[het13] CLONO2 -> HOCL + HNO3 +[het14] BRONO2 -> HOBR + HNO3 +[het15] CLONO2 + HCL -> CL2 + HNO3 +[het16] HOCL + HCL -> CL2 + H2O +[het17] HOBR + HCL -> BRCL + H2O +[het2] CLONO2 -> HOCL + HNO3 +[het3] BRONO2 -> HOBR + HNO3 +[het4] CLONO2 + HCL -> CL2 + HNO3 +[het5] HOCL + HCL -> CL2 + H2O +[het6] HOBR + HCL -> BRCL + H2O +[het7] N2O5 -> 2*HNO3 +[het8] CLONO2 -> HOCL + HNO3 +[het9] CLONO2 + HCL -> CL2 + HNO3 ********************************* *** Ions ********************************* -[ag247nm,cph=483.39] Op2P -> Op ; 0.047 -[ag373nm,cph=321.3] Op2D -> Op ; 7.7e-05 -[ag732nm,cph=163.06] Op2P -> Op2D ; 0.171 -[elec1,cph=82.389] NOp + e -> 0.2*N + 0.8*N2D + O -[elec2,cph=508.95] O2p + e -> 1.15*O + 0.85*O1D -[elec3,cph=354.83] N2p + e -> 1.1*N + 0.9*N2D -[ion_N2p_O2,cph=339.59] N2p + O2 -> O2p + N2 ; 6e-11 -[ion_N2p_Oa,cph=67.53] N2p + O -> NOp + N2D -[ion_N2p_Ob] N2p + O -> Op + N2 -[ion_Np_O,cph=95.55] Np + O -> Op + N ; 1e-12 -[ion_Np_O2a,cph=239.84] Np + O2 -> O2p + N ; 4e-10 -[ion_Np_O2b,cph=646.28] Np + O2 -> NOp + O ; 2e-10 -[ion_O2p_N,cph=406.16] O2p + N -> NOp + O ; 1e-10 -[ion_O2p_N2] O2p + N2 -> NOp + NO ; 5e-16 -[ion_O2p_NO,cph=271.38] O2p + NO -> NOp + O2 ; 4.4e-10 -[ion_Op_CO2] Op + CO2 -> O2p + CO ; 9e-10 -[ion_Op_N2,cph=105.04] Op + N2 -> NOp + N -[ion_Op_N2D,cph=139.9] Op + N2D -> Np + O ; 1.3e-10 -[ion_Op_O2,cph=150.11] Op + O2 -> O2p + O -[Op2D_e,cph=319.37] Op2D + e -> Op + e -[Op2D_N2,cph=128.32] Op2D + N2 -> N2p + O ; 8e-10 -[Op2D_O,cph=319.36] Op2D + O -> Op + O ; 5e-12 -[Op2D_O2,cph=469.4] Op2D + O2 -> O2p + O ; 7e-10 -[Op2P_ea,cph=163.06] Op2P + e -> Op2D + e -[Op2P_eb,cph=482.43] Op2P + e -> Op + e -[Op2P_N2a,cph=291.38] Op2P + N2 -> N2p + O ; 4.8e-10 -[Op2P_N2b,cph=67.54] Op2P + N2 -> Np + NO ; 1e-10 -[Op2P_O,cph=501.72] Op2P + O -> Op + O ; 4e-10 +[ag247nm,cph=483.39] Op2P -> Op ; 0.047 +[ag373nm,cph=321.3] Op2D -> Op ; 7.7e-05 +[ag732nm,cph=163.06] Op2P -> Op2D ; 0.171 +[elec1,cph=82.389] NOp + e -> 0.2*N + 0.8*N2D + O +[elec2,cph=508.95] O2p + e -> 1.15*O + 0.85*O1D +[elec3,cph=354.83] N2p + e -> 1.1*N + 0.9*N2D +[ion_N2p_O2,cph=339.59] N2p + O2 -> O2p + N2 ; 6e-11 +[ion_N2p_Oa,cph=67.53] N2p + O -> NOp + N2D +[ion_N2p_Ob] N2p + O -> Op + N2 +[ion_Np_O,cph=95.55] Np + O -> Op + N ; 1e-12 +[ion_Np_O2a,cph=239.84] Np + O2 -> O2p + N ; 4e-10 +[ion_Np_O2b,cph=646.28] Np + O2 -> NOp + O ; 2e-10 +[ion_O2p_N,cph=406.16] O2p + N -> NOp + O ; 1e-10 +[ion_O2p_N2] O2p + N2 -> NOp + NO ; 5e-16 +[ion_O2p_NO,cph=271.38] O2p + NO -> NOp + O2 ; 4.4e-10 +[ion_Op_CO2] Op + CO2 -> O2p + CO ; 9e-10 +[ion_Op_N2,cph=105.04] Op + N2 -> NOp + N +[ion_Op_N2D,cph=139.9] Op + N2D -> Np + O ; 1.3e-10 +[ion_Op_O2,cph=150.11] Op + O2 -> O2p + O +[Op2D_e,cph=319.37] Op2D + e -> Op + e +[Op2D_N2,cph=128.32] Op2D + N2 -> N2p + O ; 8e-10 +[Op2D_O,cph=319.36] Op2D + O -> Op + O ; 5e-12 +[Op2D_O2,cph=469.4] Op2D + O2 -> O2p + O ; 7e-10 +[Op2P_ea,cph=163.06] Op2P + e -> Op2D + e +[Op2P_eb,cph=482.43] Op2P + e -> Op + e +[Op2P_N2a,cph=291.38] Op2P + N2 -> N2p + O ; 4.8e-10 +[Op2P_N2b,cph=67.54] Op2P + N2 -> Np + NO ; 1e-10 +[Op2P_O,cph=501.72] Op2P + O -> Op + O ; 4e-10 End Reactions Ext Forcing - so4_a2 <- dataset - DMS <- dataset - bc_a4 <- dataset - num_a1 <- dataset - num_a2 <- dataset - num_a4 <- dataset + so4_a2 <- dataset + DMS <- dataset + bc_a4 <- dataset + num_a1 <- dataset + num_a2 <- dataset + num_a4 <- dataset num_a5 <- dataset - pom_a1 <- dataset - pom_a4 <- dataset - so4_a1 <- dataset + pom_a1 <- dataset + pom_a4 <- dataset + so4_a1 <- dataset so4_a5 <- dataset - CO <- dataset - NO <- dataset - NO2 <- dataset - SO2 <- dataset - bc_a1 <- dataset - N - N2D - N2p - Op - e - Np - O2p - OH + CO <- dataset + NO <- dataset + NO2 <- dataset + SO2 <- dataset + bc_a1 <- dataset + N + N2D + N2p + Op + e + Np + O2p + OH End Ext Forcing End Chemistry diff --git a/src/chemistry/pp_waccm_ma_mam5/chem_mods.F90 b/src/chemistry/pp_waccm_ma_mam5/chem_mods.F90 index f579d54563..3c74c4fd26 100644 --- a/src/chemistry/pp_waccm_ma_mam5/chem_mods.F90 +++ b/src/chemistry/pp_waccm_ma_mam5/chem_mods.F90 @@ -9,13 +9,13 @@ module chem_mods rxntot = 311, & ! number of total reactions gascnt = 220, & ! number of gas phase reactions nabscol = 2, & ! number of absorbing column densities - gas_pcnst = 102, & ! number of "gas phase" species + gas_pcnst = 103, & ! number of "gas phase" species nfs = 2, & ! number of "fixed" species relcnt = 0, & ! number of relationship species grpcnt = 0, & ! number of group members nzcnt = 959, & ! number of non-zero matrix entries extcnt = 24, & ! number of species with external forcing - clscnt1 = 0, & ! number of species in explicit class + clscnt1 = 1, & ! number of species in explicit class clscnt2 = 0, & ! number of species in hov class clscnt3 = 0, & ! number of species in ebi class clscnt4 = 102, & ! number of species in implicit class diff --git a/src/chemistry/pp_waccm_ma_mam5/m_spc_id.F90 b/src/chemistry/pp_waccm_ma_mam5/m_spc_id.F90 index d596a4e593..6c5ec22920 100644 --- a/src/chemistry/pp_waccm_ma_mam5/m_spc_id.F90 +++ b/src/chemistry/pp_waccm_ma_mam5/m_spc_id.F90 @@ -71,35 +71,36 @@ module m_spc_id integer, parameter :: id_O = 69 integer, parameter :: id_O2 = 70 integer, parameter :: id_O3 = 71 - integer, parameter :: id_OCLO = 72 - integer, parameter :: id_OCS = 73 - integer, parameter :: id_pom_a1 = 74 - integer, parameter :: id_pom_a4 = 75 - integer, parameter :: id_S = 76 - integer, parameter :: id_SF6 = 77 - integer, parameter :: id_SO = 78 - integer, parameter :: id_SO2 = 79 - integer, parameter :: id_SO3 = 80 - integer, parameter :: id_so4_a1 = 81 - integer, parameter :: id_so4_a2 = 82 - integer, parameter :: id_so4_a3 = 83 - integer, parameter :: id_so4_a5 = 84 - integer, parameter :: id_soa_a1 = 85 - integer, parameter :: id_soa_a2 = 86 - integer, parameter :: id_SOAG = 87 - integer, parameter :: id_e = 88 - integer, parameter :: id_HO2 = 89 - integer, parameter :: id_N2D = 90 - integer, parameter :: id_N2p = 91 - integer, parameter :: id_NOp = 92 - integer, parameter :: id_Np = 93 - integer, parameter :: id_O1D = 94 - integer, parameter :: id_O2_1D = 95 - integer, parameter :: id_O2_1S = 96 - integer, parameter :: id_O2p = 97 - integer, parameter :: id_OH = 98 - integer, parameter :: id_Op = 99 - integer, parameter :: id_Op2D = 100 - integer, parameter :: id_Op2P = 101 - integer, parameter :: id_H2O = 102 + integer, parameter :: id_O3S = 72 + integer, parameter :: id_OCLO = 73 + integer, parameter :: id_OCS = 74 + integer, parameter :: id_pom_a1 = 75 + integer, parameter :: id_pom_a4 = 76 + integer, parameter :: id_S = 77 + integer, parameter :: id_SF6 = 78 + integer, parameter :: id_SO = 79 + integer, parameter :: id_SO2 = 80 + integer, parameter :: id_SO3 = 81 + integer, parameter :: id_so4_a1 = 82 + integer, parameter :: id_so4_a2 = 83 + integer, parameter :: id_so4_a3 = 84 + integer, parameter :: id_so4_a5 = 85 + integer, parameter :: id_soa_a1 = 86 + integer, parameter :: id_soa_a2 = 87 + integer, parameter :: id_SOAG = 88 + integer, parameter :: id_e = 89 + integer, parameter :: id_HO2 = 90 + integer, parameter :: id_N2D = 91 + integer, parameter :: id_N2p = 92 + integer, parameter :: id_NOp = 93 + integer, parameter :: id_Np = 94 + integer, parameter :: id_O1D = 95 + integer, parameter :: id_O2_1D = 96 + integer, parameter :: id_O2_1S = 97 + integer, parameter :: id_O2p = 98 + integer, parameter :: id_OH = 99 + integer, parameter :: id_Op = 100 + integer, parameter :: id_Op2D = 101 + integer, parameter :: id_Op2P = 102 + integer, parameter :: id_H2O = 103 end module m_spc_id diff --git a/src/chemistry/pp_waccm_ma_mam5/mo_indprd.F90 b/src/chemistry/pp_waccm_ma_mam5/mo_indprd.F90 index 125c4a75b8..59b51ae306 100644 --- a/src/chemistry/pp_waccm_ma_mam5/mo_indprd.F90 +++ b/src/chemistry/pp_waccm_ma_mam5/mo_indprd.F90 @@ -17,9 +17,14 @@ subroutine indprd( class, prod, nprod, y, extfrc, rxt, chnkpnts ) real(r8), intent(in) :: extfrc(chnkpnts,extcnt) real(r8), intent(inout) :: prod(chnkpnts,nprod) !-------------------------------------------------------------------- +! ... "independent" production for Explicit species +!-------------------------------------------------------------------- + if( class == 1 ) then + prod(:,1) = 0._r8 +!-------------------------------------------------------------------- ! ... "independent" production for Implicit species !-------------------------------------------------------------------- - if( class == 4 ) then + else if( class == 4 ) then prod(:,1) = + extfrc(:,16) prod(:,2) = + extfrc(:,3) prod(:,97) = 0._r8 diff --git a/src/chemistry/pp_waccm_ma_mam5/mo_lin_matrix.F90 b/src/chemistry/pp_waccm_ma_mam5/mo_lin_matrix.F90 index 8e8cfedba7..14f1d2a1ef 100644 --- a/src/chemistry/pp_waccm_ma_mam5/mo_lin_matrix.F90 +++ b/src/chemistry/pp_waccm_ma_mam5/mo_lin_matrix.F90 @@ -222,8 +222,8 @@ subroutine linmat01( avec_len, mat, y, rxt, het_rates ) mat(k,78) = rxt(k,92) + rxt(k,100) mat(k,81) = rxt(k,93) mat(k,529) = -( rxt(k,7) + rxt(k,8) + het_rates(k,71) ) - mat(k,134) = -( rxt(k,59) + het_rates(k,72) ) - mat(k,139) = -( rxt(k,88) + het_rates(k,73) ) + mat(k,134) = -( rxt(k,59) + het_rates(k,73) ) + mat(k,139) = -( rxt(k,88) + het_rates(k,74) ) end do end subroutine linmat01 subroutine linmat02( avec_len, mat, y, rxt, het_rates ) @@ -246,57 +246,57 @@ subroutine linmat02( avec_len, mat, y, rxt, het_rates ) !---------------------------------------------- integer :: k do k = 1,avec_len - mat(k,16) = -( het_rates(k,74) ) - mat(k,17) = -( het_rates(k,75) ) - mat(k,235) = -( het_rates(k,76) ) + mat(k,16) = -( het_rates(k,75) ) + mat(k,17) = -( het_rates(k,76) ) + mat(k,235) = -( het_rates(k,77) ) mat(k,140) = rxt(k,88) mat(k,423) = rxt(k,89) - mat(k,18) = -( rxt(k,60) + het_rates(k,77) ) - mat(k,425) = -( rxt(k,89) + het_rates(k,78) ) + mat(k,18) = -( rxt(k,60) + het_rates(k,78) ) + mat(k,425) = -( rxt(k,89) + het_rates(k,79) ) mat(k,301) = rxt(k,90) - mat(k,300) = -( rxt(k,90) + het_rates(k,79) ) + mat(k,300) = -( rxt(k,90) + het_rates(k,80) ) mat(k,109) = rxt(k,91) - mat(k,108) = -( rxt(k,91) + het_rates(k,80) ) + mat(k,108) = -( rxt(k,91) + het_rates(k,81) ) mat(k,53) = rxt(k,87) - mat(k,19) = -( het_rates(k,81) ) - mat(k,20) = -( het_rates(k,82) ) - mat(k,21) = -( het_rates(k,83) ) - mat(k,22) = -( het_rates(k,84) ) - mat(k,23) = -( het_rates(k,85) ) - mat(k,24) = -( het_rates(k,86) ) - mat(k,25) = -( het_rates(k,87) ) - mat(k,323) = -( het_rates(k,88) ) + mat(k,19) = -( het_rates(k,82) ) + mat(k,20) = -( het_rates(k,83) ) + mat(k,21) = -( het_rates(k,84) ) + mat(k,22) = -( het_rates(k,85) ) + mat(k,23) = -( het_rates(k,86) ) + mat(k,24) = -( het_rates(k,87) ) + mat(k,25) = -( het_rates(k,88) ) + mat(k,323) = -( het_rates(k,89) ) mat(k,736) = rxt(k,16) mat(k,345) = rxt(k,62) mat(k,668) = rxt(k,71) + rxt(k,72) + rxt(k,73) + rxt(k,74) + rxt(k,75) & + rxt(k,76) mat(k,501) = rxt(k,77) + rxt(k,78) + rxt(k,79) + rxt(k,80) + rxt(k,81) & + rxt(k,84) + rxt(k,85) + rxt(k,86) - mat(k,555) = -( rxt(k,263) + het_rates(k,89) ) + mat(k,555) = -( rxt(k,263) + het_rates(k,90) ) mat(k,169) = rxt(k,11) + rxt(k,153) - mat(k,334) = -( het_rates(k,90) ) - mat(k,219) = -( het_rates(k,91) ) + mat(k,334) = -( het_rates(k,91) ) + mat(k,219) = -( het_rates(k,92) ) mat(k,189) = rxt(k,304) mat(k,183) = rxt(k,309) - mat(k,242) = -( het_rates(k,92) ) + mat(k,242) = -( het_rates(k,93) ) mat(k,735) = rxt(k,16) mat(k,357) = rxt(k,297) mat(k,371) = rxt(k,300) - mat(k,273) = -( het_rates(k,93) ) + mat(k,273) = -( het_rates(k,94) ) mat(k,344) = rxt(k,62) mat(k,184) = rxt(k,310) - mat(k,726) = -( rxt(k,96) + het_rates(k,94) ) + mat(k,726) = -( rxt(k,96) + het_rates(k,95) ) mat(k,951) = rxt(k,1) mat(k,514) = rxt(k,6) mat(k,535) = rxt(k,7) mat(k,105) = rxt(k,12) - mat(k,77) = -( rxt(k,92) + rxt(k,100) + het_rates(k,95) ) + mat(k,77) = -( rxt(k,92) + rxt(k,100) + het_rates(k,96) ) mat(k,522) = rxt(k,7) mat(k,79) = rxt(k,104) - mat(k,80) = -( rxt(k,93) + rxt(k,104) + het_rates(k,96) ) - mat(k,361) = -( rxt(k,297) + het_rates(k,97) ) + mat(k,80) = -( rxt(k,93) + rxt(k,104) + het_rates(k,97) ) + mat(k,361) = -( rxt(k,297) + het_rates(k,98) ) mat(k,504) = rxt(k,78) + rxt(k,80) - mat(k,858) = -( het_rates(k,98) ) + mat(k,858) = -( het_rates(k,99) ) mat(k,955) = rxt(k,3) mat(k,233) = 2.000_r8*rxt(k,4) mat(k,904) = rxt(k,9) @@ -306,20 +306,20 @@ subroutine linmat02( avec_len, mat, y, rxt, het_rates ) mat(k,253) = rxt(k,57) mat(k,270) = rxt(k,58) mat(k,646) = .500_r8*rxt(k,265) - mat(k,378) = -( rxt(k,300) + het_rates(k,99) ) + mat(k,378) = -( rxt(k,300) + het_rates(k,100) ) mat(k,672) = rxt(k,73) + rxt(k,74) mat(k,505) = rxt(k,79) + rxt(k,81) mat(k,185) = rxt(k,284) mat(k,191) = rxt(k,285) - mat(k,188) = -( rxt(k,285) + rxt(k,304) + het_rates(k,100) ) + mat(k,188) = -( rxt(k,285) + rxt(k,304) + het_rates(k,101) ) mat(k,655) = rxt(k,75) + rxt(k,76) mat(k,495) = rxt(k,85) + rxt(k,86) mat(k,182) = rxt(k,286) mat(k,181) = -( rxt(k,284) + rxt(k,286) + rxt(k,309) + rxt(k,310) & - + het_rates(k,101) ) + + het_rates(k,102) ) mat(k,654) = rxt(k,71) + rxt(k,72) mat(k,494) = rxt(k,77) + rxt(k,84) - mat(k,959) = -( rxt(k,1) + rxt(k,2) + rxt(k,3) + het_rates(k,102) ) + mat(k,959) = -( rxt(k,1) + rxt(k,2) + rxt(k,3) + het_rates(k,103) ) mat(k,409) = .050_r8*rxt(k,24) mat(k,54) = rxt(k,87) end do diff --git a/src/chemistry/pp_waccm_ma_mam5/mo_nln_matrix.F90 b/src/chemistry/pp_waccm_ma_mam5/mo_nln_matrix.F90 index 60c42e2b51..fcd1810f01 100644 --- a/src/chemistry/pp_waccm_ma_mam5/mo_nln_matrix.F90 +++ b/src/chemistry/pp_waccm_ma_mam5/mo_nln_matrix.F90 @@ -22,25 +22,25 @@ subroutine nlnmat01( avec_len, mat, y, rxt ) ! ... complete matrix entries implicit species !---------------------------------------------- do k = 1,avec_len - mat(k,808) = -(rxt(k,191)*y(k,17) + rxt(k,192)*y(k,89) + rxt(k,193)*y(k,71)) + mat(k,808) = -(rxt(k,191)*y(k,17) + rxt(k,192)*y(k,90) + rxt(k,193)*y(k,71)) mat(k,486) = -rxt(k,191)*y(k,3) mat(k,563) = -rxt(k,192)*y(k,3) mat(k,538) = -rxt(k,193)*y(k,3) mat(k,927) = 4.000_r8*rxt(k,194)*y(k,5) + (rxt(k,195)+rxt(k,196))*y(k,28) & - + rxt(k,199)*y(k,61) + rxt(k,202)*y(k,69) + rxt(k,253)*y(k,78) & - + rxt(k,203)*y(k,98) - mat(k,59) = rxt(k,181)*y(k,94) - mat(k,64) = rxt(k,207)*y(k,94) - mat(k,178) = 2.000_r8*rxt(k,218)*y(k,25) + 2.000_r8*rxt(k,230)*y(k,94) & - + 2.000_r8*rxt(k,219)*y(k,98) - mat(k,216) = rxt(k,220)*y(k,25) + rxt(k,231)*y(k,94) + rxt(k,221)*y(k,98) - mat(k,165) = 3.000_r8*rxt(k,225)*y(k,25) + 3.000_r8*rxt(k,208)*y(k,94) & - + 3.000_r8*rxt(k,226)*y(k,98) + + rxt(k,199)*y(k,61) + rxt(k,202)*y(k,69) + rxt(k,253)*y(k,79) & + + rxt(k,203)*y(k,99) + mat(k,59) = rxt(k,181)*y(k,95) + mat(k,64) = rxt(k,207)*y(k,95) + mat(k,178) = 2.000_r8*rxt(k,218)*y(k,25) + 2.000_r8*rxt(k,230)*y(k,95) & + + 2.000_r8*rxt(k,219)*y(k,99) + mat(k,216) = rxt(k,220)*y(k,25) + rxt(k,231)*y(k,95) + rxt(k,221)*y(k,99) + mat(k,165) = 3.000_r8*rxt(k,225)*y(k,25) + 3.000_r8*rxt(k,208)*y(k,95) & + + 3.000_r8*rxt(k,226)*y(k,99) mat(k,786) = 2.000_r8*rxt(k,218)*y(k,16) + rxt(k,220)*y(k,18) & + 3.000_r8*rxt(k,225)*y(k,24) mat(k,616) = (rxt(k,195)+rxt(k,196))*y(k,5) - mat(k,35) = 2.000_r8*rxt(k,209)*y(k,94) - mat(k,260) = rxt(k,204)*y(k,69) + rxt(k,210)*y(k,94) + rxt(k,205)*y(k,98) + mat(k,35) = 2.000_r8*rxt(k,209)*y(k,95) + mat(k,260) = rxt(k,204)*y(k,69) + rxt(k,210)*y(k,95) + rxt(k,205)*y(k,99) mat(k,754) = rxt(k,199)*y(k,5) mat(k,687) = rxt(k,202)*y(k,5) + rxt(k,204)*y(k,45) mat(k,435) = rxt(k,253)*y(k,5) @@ -54,9 +54,9 @@ subroutine nlnmat01( avec_len, mat, y, rxt ) mat(k,448) = (rxt(k,275)+rxt(k,280))*y(k,53) mat(k,247) = (rxt(k,275)+rxt(k,280))*y(k,49) mat(k,931) = -(4._r8*rxt(k,194)*y(k,5) + (rxt(k,195) + rxt(k,196) + rxt(k,197) & - ) * y(k,28) + rxt(k,198)*y(k,89) + rxt(k,199)*y(k,61) + rxt(k,200) & - *y(k,62) + rxt(k,202)*y(k,69) + rxt(k,203)*y(k,98) + rxt(k,253) & - *y(k,78)) + ) * y(k,28) + rxt(k,198)*y(k,90) + rxt(k,199)*y(k,61) + rxt(k,200) & + *y(k,62) + rxt(k,202)*y(k,69) + rxt(k,203)*y(k,99) + rxt(k,253) & + *y(k,79)) mat(k,620) = -(rxt(k,195) + rxt(k,196) + rxt(k,197)) * y(k,5) mat(k,567) = -rxt(k,198)*y(k,5) mat(k,758) = -rxt(k,199)*y(k,5) @@ -66,7 +66,7 @@ subroutine nlnmat01( avec_len, mat, y, rxt ) mat(k,437) = -rxt(k,253)*y(k,5) mat(k,812) = rxt(k,193)*y(k,71) mat(k,209) = rxt(k,201)*y(k,69) - mat(k,262) = rxt(k,211)*y(k,94) + mat(k,262) = rxt(k,211)*y(k,95) mat(k,254) = rxt(k,206)*y(k,69) mat(k,691) = mat(k,691) + rxt(k,201)*y(k,6) + rxt(k,206)*y(k,53) mat(k,541) = rxt(k,193)*y(k,3) @@ -75,76 +75,76 @@ subroutine nlnmat01( avec_len, mat, y, rxt ) mat(k,656) = -rxt(k,201)*y(k,6) mat(k,911) = rxt(k,200)*y(k,62) mat(k,625) = rxt(k,200)*y(k,5) - mat(k,29) = -(rxt(k,180)*y(k,94)) + mat(k,29) = -(rxt(k,180)*y(k,95)) mat(k,693) = -rxt(k,180)*y(k,8) - mat(k,55) = -(rxt(k,181)*y(k,94)) + mat(k,55) = -(rxt(k,181)*y(k,95)) mat(k,698) = -rxt(k,181)*y(k,9) - mat(k,60) = -(rxt(k,207)*y(k,94)) + mat(k,60) = -(rxt(k,207)*y(k,95)) mat(k,699) = -rxt(k,207)*y(k,10) - mat(k,36) = -(rxt(k,182)*y(k,94)) + mat(k,36) = -(rxt(k,182)*y(k,95)) mat(k,695) = -rxt(k,182)*y(k,11) - mat(k,65) = -(rxt(k,183)*y(k,94)) + mat(k,65) = -(rxt(k,183)*y(k,95)) mat(k,700) = -rxt(k,183)*y(k,12) - mat(k,40) = -(rxt(k,184)*y(k,94)) + mat(k,40) = -(rxt(k,184)*y(k,95)) mat(k,696) = -rxt(k,184)*y(k,13) - mat(k,70) = -(rxt(k,185)*y(k,94)) + mat(k,70) = -(rxt(k,185)*y(k,95)) mat(k,701) = -rxt(k,185)*y(k,14) - mat(k,44) = -(rxt(k,186)*y(k,94)) + mat(k,44) = -(rxt(k,186)*y(k,95)) mat(k,697) = -rxt(k,186)*y(k,15) - mat(k,174) = -(rxt(k,218)*y(k,25) + rxt(k,219)*y(k,98) + rxt(k,230)*y(k,94)) + mat(k,174) = -(rxt(k,218)*y(k,25) + rxt(k,219)*y(k,99) + rxt(k,230)*y(k,95)) mat(k,763) = -rxt(k,218)*y(k,16) mat(k,827) = -rxt(k,219)*y(k,16) mat(k,710) = -rxt(k,230)*y(k,16) mat(k,475) = -(rxt(k,155)*y(k,25) + rxt(k,191)*y(k,3) + rxt(k,235)*y(k,63) & - + rxt(k,236)*y(k,69) + rxt(k,237)*y(k,98)) + + rxt(k,236)*y(k,69) + rxt(k,237)*y(k,99)) mat(k,775) = -rxt(k,155)*y(k,17) mat(k,797) = -rxt(k,191)*y(k,17) mat(k,577) = -rxt(k,235)*y(k,17) mat(k,676) = -rxt(k,236)*y(k,17) mat(k,846) = -rxt(k,237)*y(k,17) mat(k,413) = rxt(k,162)*y(k,28) + rxt(k,239)*y(k,61) - mat(k,158) = .300_r8*rxt(k,240)*y(k,98) - mat(k,397) = (rxt(k,243)+rxt(k,244))*y(k,94) + mat(k,158) = .300_r8*rxt(k,240)*y(k,99) + mat(k,397) = (rxt(k,243)+rxt(k,244))*y(k,95) mat(k,605) = rxt(k,162)*y(k,21) mat(k,743) = rxt(k,239)*y(k,21) mat(k,718) = (rxt(k,243)+rxt(k,244))*y(k,23) mat(k,846) = mat(k,846) + .300_r8*rxt(k,240)*y(k,22) - mat(k,210) = -(rxt(k,220)*y(k,25) + rxt(k,221)*y(k,98) + rxt(k,231)*y(k,94)) + mat(k,210) = -(rxt(k,220)*y(k,25) + rxt(k,221)*y(k,99) + rxt(k,231)*y(k,95)) mat(k,764) = -rxt(k,220)*y(k,18) mat(k,829) = -rxt(k,221)*y(k,18) mat(k,711) = -rxt(k,231)*y(k,18) - mat(k,48) = -(rxt(k,222)*y(k,98)) + mat(k,48) = -(rxt(k,222)*y(k,99)) mat(k,814) = -rxt(k,222)*y(k,19) - mat(k,147) = -(rxt(k,223)*y(k,25) + rxt(k,224)*y(k,98)) + mat(k,147) = -(rxt(k,223)*y(k,25) + rxt(k,224)*y(k,99)) mat(k,761) = -rxt(k,223)*y(k,20) mat(k,823) = -rxt(k,224)*y(k,20) - mat(k,411) = -(rxt(k,162)*y(k,28) + rxt(k,238)*y(k,89) + rxt(k,239)*y(k,61)) + mat(k,411) = -(rxt(k,162)*y(k,28) + rxt(k,238)*y(k,90) + rxt(k,239)*y(k,61)) mat(k,601) = -rxt(k,162)*y(k,21) mat(k,549) = -rxt(k,238)*y(k,21) mat(k,741) = -rxt(k,239)*y(k,21) - mat(k,156) = .700_r8*rxt(k,240)*y(k,98) - mat(k,394) = rxt(k,156)*y(k,25) + rxt(k,212)*y(k,39) + rxt(k,242)*y(k,94) & - + rxt(k,241)*y(k,98) + mat(k,156) = .700_r8*rxt(k,240)*y(k,99) + mat(k,394) = rxt(k,156)*y(k,25) + rxt(k,212)*y(k,39) + rxt(k,242)*y(k,95) & + + rxt(k,241)*y(k,99) mat(k,772) = rxt(k,156)*y(k,23) mat(k,292) = rxt(k,212)*y(k,23) mat(k,715) = rxt(k,242)*y(k,23) mat(k,842) = .700_r8*rxt(k,240)*y(k,22) + rxt(k,241)*y(k,23) - mat(k,155) = -(rxt(k,240)*y(k,98)) + mat(k,155) = -(rxt(k,240)*y(k,99)) mat(k,824) = -rxt(k,240)*y(k,22) - mat(k,410) = rxt(k,238)*y(k,89) + mat(k,410) = rxt(k,238)*y(k,90) mat(k,543) = rxt(k,238)*y(k,21) - mat(k,393) = -(rxt(k,156)*y(k,25) + rxt(k,212)*y(k,39) + rxt(k,241)*y(k,98) & - + (rxt(k,242) + rxt(k,243) + rxt(k,244)) * y(k,94)) + mat(k,393) = -(rxt(k,156)*y(k,25) + rxt(k,212)*y(k,39) + rxt(k,241)*y(k,99) & + + (rxt(k,242) + rxt(k,243) + rxt(k,244)) * y(k,95)) mat(k,771) = -rxt(k,156)*y(k,23) mat(k,291) = -rxt(k,212)*y(k,23) mat(k,841) = -rxt(k,241)*y(k,23) mat(k,714) = -(rxt(k,242) + rxt(k,243) + rxt(k,244)) * y(k,23) - mat(k,161) = -(rxt(k,208)*y(k,94) + rxt(k,225)*y(k,25) + rxt(k,226)*y(k,98)) + mat(k,161) = -(rxt(k,208)*y(k,95) + rxt(k,225)*y(k,25) + rxt(k,226)*y(k,99)) mat(k,709) = -rxt(k,208)*y(k,24) mat(k,762) = -rxt(k,225)*y(k,24) mat(k,825) = -rxt(k,226)*y(k,24) mat(k,785) = -(rxt(k,155)*y(k,17) + rxt(k,156)*y(k,23) + rxt(k,157)*y(k,41) & - + rxt(k,158)*y(k,43) + (rxt(k,159) + rxt(k,160)) * y(k,89) & + + rxt(k,158)*y(k,43) + (rxt(k,159) + rxt(k,160)) * y(k,90) & + rxt(k,161)*y(k,71) + rxt(k,168)*y(k,29) + rxt(k,177)*y(k,54) & + rxt(k,218)*y(k,16) + rxt(k,220)*y(k,18) + rxt(k,223)*y(k,20) & + rxt(k,225)*y(k,24)) @@ -161,24 +161,24 @@ subroutine nlnmat01( avec_len, mat, y, rxt ) mat(k,152) = -rxt(k,223)*y(k,25) mat(k,164) = -rxt(k,225)*y(k,25) mat(k,926) = rxt(k,196)*y(k,28) - mat(k,31) = 4.000_r8*rxt(k,180)*y(k,94) - mat(k,58) = rxt(k,181)*y(k,94) - mat(k,39) = 2.000_r8*rxt(k,182)*y(k,94) - mat(k,69) = 2.000_r8*rxt(k,183)*y(k,94) - mat(k,43) = 2.000_r8*rxt(k,184)*y(k,94) - mat(k,74) = rxt(k,185)*y(k,94) - mat(k,47) = 2.000_r8*rxt(k,186)*y(k,94) - mat(k,49) = 3.000_r8*rxt(k,222)*y(k,98) - mat(k,152) = mat(k,152) + rxt(k,224)*y(k,98) + mat(k,31) = 4.000_r8*rxt(k,180)*y(k,95) + mat(k,58) = rxt(k,181)*y(k,95) + mat(k,39) = 2.000_r8*rxt(k,182)*y(k,95) + mat(k,69) = 2.000_r8*rxt(k,183)*y(k,95) + mat(k,43) = 2.000_r8*rxt(k,184)*y(k,95) + mat(k,74) = rxt(k,185)*y(k,95) + mat(k,47) = 2.000_r8*rxt(k,186)*y(k,95) + mat(k,49) = 3.000_r8*rxt(k,222)*y(k,99) + mat(k,152) = mat(k,152) + rxt(k,224)*y(k,99) mat(k,419) = rxt(k,162)*y(k,28) mat(k,615) = rxt(k,196)*y(k,5) + rxt(k,162)*y(k,21) + (4.000_r8*rxt(k,163) & +2.000_r8*rxt(k,165))*y(k,28) + rxt(k,167)*y(k,61) + rxt(k,172) & - *y(k,69) + rxt(k,254)*y(k,78) + rxt(k,173)*y(k,98) - mat(k,93) = rxt(k,217)*y(k,94) - mat(k,88) = rxt(k,232)*y(k,94) + rxt(k,227)*y(k,98) - mat(k,98) = rxt(k,233)*y(k,94) + rxt(k,228)*y(k,98) - mat(k,116) = rxt(k,234)*y(k,94) + rxt(k,229)*y(k,98) - mat(k,462) = rxt(k,175)*y(k,69) + rxt(k,187)*y(k,94) + rxt(k,176)*y(k,98) + *y(k,69) + rxt(k,254)*y(k,79) + rxt(k,173)*y(k,99) + mat(k,93) = rxt(k,217)*y(k,95) + mat(k,88) = rxt(k,232)*y(k,95) + rxt(k,227)*y(k,99) + mat(k,98) = rxt(k,233)*y(k,95) + rxt(k,228)*y(k,99) + mat(k,116) = rxt(k,234)*y(k,95) + rxt(k,229)*y(k,99) + mat(k,462) = rxt(k,175)*y(k,69) + rxt(k,187)*y(k,95) + rxt(k,176)*y(k,99) mat(k,753) = rxt(k,167)*y(k,28) mat(k,686) = rxt(k,172)*y(k,28) + rxt(k,175)*y(k,49) mat(k,434) = rxt(k,254)*y(k,28) @@ -200,9 +200,9 @@ subroutine nlnmat01( avec_len, mat, y, rxt ) mat(k,594) = 2.000_r8*rxt(k,189)*y(k,28) mat(k,610) = -(rxt(k,162)*y(k,21) + (4._r8*rxt(k,163) + 4._r8*rxt(k,164) & + 4._r8*rxt(k,165) + 4._r8*rxt(k,189)) * y(k,28) + rxt(k,166) & - *y(k,89) + rxt(k,167)*y(k,61) + rxt(k,169)*y(k,62) + rxt(k,172) & - *y(k,69) + (rxt(k,173) + rxt(k,174)) * y(k,98) + (rxt(k,195) & - + rxt(k,196) + rxt(k,197)) * y(k,5) + rxt(k,254)*y(k,78)) + *y(k,90) + rxt(k,167)*y(k,61) + rxt(k,169)*y(k,62) + rxt(k,172) & + *y(k,69) + (rxt(k,173) + rxt(k,174)) * y(k,99) + (rxt(k,195) & + + rxt(k,196) + rxt(k,197)) * y(k,5) + rxt(k,254)*y(k,79)) mat(k,416) = -rxt(k,162)*y(k,28) mat(k,557) = -rxt(k,166)*y(k,28) mat(k,748) = -rxt(k,167)*y(k,28) @@ -211,18 +211,18 @@ subroutine nlnmat01( avec_len, mat, y, rxt ) mat(k,851) = -(rxt(k,173) + rxt(k,174)) * y(k,28) mat(k,921) = -(rxt(k,195) + rxt(k,196) + rxt(k,197)) * y(k,28) mat(k,430) = -rxt(k,254)*y(k,28) - mat(k,780) = rxt(k,177)*y(k,54) + rxt(k,161)*y(k,71) + rxt(k,160)*y(k,89) + mat(k,780) = rxt(k,177)*y(k,54) + rxt(k,161)*y(k,71) + rxt(k,160)*y(k,90) mat(k,311) = rxt(k,170)*y(k,69) - mat(k,458) = rxt(k,188)*y(k,94) - mat(k,267) = rxt(k,177)*y(k,25) + rxt(k,178)*y(k,69) + rxt(k,179)*y(k,98) + mat(k,458) = rxt(k,188)*y(k,95) + mat(k,267) = rxt(k,177)*y(k,25) + rxt(k,178)*y(k,69) + rxt(k,179)*y(k,99) mat(k,681) = mat(k,681) + rxt(k,170)*y(k,29) + rxt(k,178)*y(k,54) mat(k,532) = rxt(k,161)*y(k,25) - mat(k,137) = rxt(k,259)*y(k,78) - mat(k,430) = mat(k,430) + rxt(k,259)*y(k,72) + mat(k,137) = rxt(k,259)*y(k,79) + mat(k,430) = mat(k,430) + rxt(k,259)*y(k,73) mat(k,557) = mat(k,557) + rxt(k,160)*y(k,25) mat(k,723) = rxt(k,188)*y(k,49) mat(k,851) = mat(k,851) + rxt(k,179)*y(k,54) - mat(k,308) = -(rxt(k,168)*y(k,25) + rxt(k,170)*y(k,69) + rxt(k,171)*y(k,98) & + mat(k,308) = -(rxt(k,168)*y(k,25) + rxt(k,170)*y(k,69) + rxt(k,171)*y(k,99) & + (rxt(k,273) + rxt(k,278) + rxt(k,283)) * y(k,49)) mat(k,768) = -rxt(k,168)*y(k,29) mat(k,667) = -rxt(k,170)*y(k,29) @@ -250,125 +250,125 @@ subroutine nlnmat02( avec_len, mat, y, rxt ) ! ... complete matrix entries implicit species !---------------------------------------------- do k = 1,avec_len - mat(k,282) = -(rxt(k,245)*y(k,98)) + mat(k,282) = -(rxt(k,245)*y(k,99)) mat(k,834) = -rxt(k,245)*y(k,31) mat(k,793) = rxt(k,191)*y(k,17) mat(k,470) = rxt(k,191)*y(k,3) + rxt(k,155)*y(k,25) + rxt(k,235)*y(k,63) & - + rxt(k,236)*y(k,69) + rxt(k,237)*y(k,98) + + rxt(k,236)*y(k,69) + rxt(k,237)*y(k,99) mat(k,148) = rxt(k,223)*y(k,25) mat(k,767) = rxt(k,155)*y(k,17) + rxt(k,223)*y(k,20) - mat(k,197) = rxt(k,299)*y(k,99) + mat(k,197) = rxt(k,299)*y(k,100) mat(k,571) = rxt(k,235)*y(k,17) - mat(k,665) = rxt(k,236)*y(k,17) + rxt(k,248)*y(k,73) - mat(k,141) = rxt(k,248)*y(k,69) + rxt(k,249)*y(k,98) - mat(k,834) = mat(k,834) + rxt(k,237)*y(k,17) + rxt(k,249)*y(k,73) + mat(k,665) = rxt(k,236)*y(k,17) + rxt(k,248)*y(k,74) + mat(k,141) = rxt(k,248)*y(k,69) + rxt(k,249)*y(k,99) + mat(k,834) = mat(k,834) + rxt(k,237)*y(k,17) + rxt(k,249)*y(k,74) mat(k,373) = rxt(k,299)*y(k,32) - mat(k,196) = -(rxt(k,299)*y(k,99)) + mat(k,196) = -(rxt(k,299)*y(k,100)) mat(k,370) = -rxt(k,299)*y(k,32) - mat(k,281) = rxt(k,245)*y(k,98) + mat(k,281) = rxt(k,245)*y(k,99) mat(k,828) = rxt(k,245)*y(k,31) - mat(k,82) = -(rxt(k,216)*y(k,94)) + mat(k,82) = -(rxt(k,216)*y(k,95)) mat(k,703) = -rxt(k,216)*y(k,33) - mat(k,56) = rxt(k,181)*y(k,94) - mat(k,61) = rxt(k,207)*y(k,94) - mat(k,66) = rxt(k,183)*y(k,94) - mat(k,41) = 2.000_r8*rxt(k,184)*y(k,94) - mat(k,71) = 2.000_r8*rxt(k,185)*y(k,94) - mat(k,45) = rxt(k,186)*y(k,94) - mat(k,33) = 2.000_r8*rxt(k,209)*y(k,94) - mat(k,94) = rxt(k,233)*y(k,94) + rxt(k,228)*y(k,98) - mat(k,112) = rxt(k,234)*y(k,94) + rxt(k,229)*y(k,98) + mat(k,56) = rxt(k,181)*y(k,95) + mat(k,61) = rxt(k,207)*y(k,95) + mat(k,66) = rxt(k,183)*y(k,95) + mat(k,41) = 2.000_r8*rxt(k,184)*y(k,95) + mat(k,71) = 2.000_r8*rxt(k,185)*y(k,95) + mat(k,45) = rxt(k,186)*y(k,95) + mat(k,33) = 2.000_r8*rxt(k,209)*y(k,95) + mat(k,94) = rxt(k,233)*y(k,95) + rxt(k,228)*y(k,99) + mat(k,112) = rxt(k,234)*y(k,95) + rxt(k,229)*y(k,99) mat(k,703) = mat(k,703) + rxt(k,181)*y(k,9) + rxt(k,207)*y(k,10) + rxt(k,183) & *y(k,12) + 2.000_r8*rxt(k,184)*y(k,13) + 2.000_r8*rxt(k,185) & *y(k,14) + rxt(k,186)*y(k,15) + 2.000_r8*rxt(k,209)*y(k,42) & + rxt(k,233)*y(k,47) + rxt(k,234)*y(k,48) mat(k,815) = rxt(k,228)*y(k,47) + rxt(k,229)*y(k,48) - mat(k,90) = -(rxt(k,217)*y(k,94)) + mat(k,90) = -(rxt(k,217)*y(k,95)) mat(k,705) = -rxt(k,217)*y(k,34) - mat(k,37) = rxt(k,182)*y(k,94) - mat(k,67) = rxt(k,183)*y(k,94) - mat(k,86) = rxt(k,232)*y(k,94) + rxt(k,227)*y(k,98) + mat(k,37) = rxt(k,182)*y(k,95) + mat(k,67) = rxt(k,183)*y(k,95) + mat(k,86) = rxt(k,232)*y(k,95) + rxt(k,227)*y(k,99) mat(k,705) = mat(k,705) + rxt(k,182)*y(k,11) + rxt(k,183)*y(k,12) & + rxt(k,232)*y(k,46) mat(k,817) = rxt(k,227)*y(k,46) - mat(k,128) = -(rxt(k,246)*y(k,63) + (rxt(k,247) + rxt(k,261)) * y(k,98)) + mat(k,128) = -(rxt(k,246)*y(k,63) + (rxt(k,247) + rxt(k,261)) * y(k,99)) mat(k,570) = -rxt(k,246)*y(k,35) mat(k,821) = -(rxt(k,247) + rxt(k,261)) * y(k,35) - mat(k,290) = -(rxt(k,212)*y(k,23) + rxt(k,213)*y(k,41) + rxt(k,214)*y(k,102) & + mat(k,290) = -(rxt(k,212)*y(k,23) + rxt(k,213)*y(k,41) + rxt(k,214)*y(k,103) & + rxt(k,215)*y(k,51)) mat(k,390) = -rxt(k,212)*y(k,39) mat(k,864) = -rxt(k,213)*y(k,39) mat(k,936) = -rxt(k,214)*y(k,39) mat(k,887) = -rxt(k,215)*y(k,39) - mat(k,62) = rxt(k,207)*y(k,94) - mat(k,72) = rxt(k,185)*y(k,94) - mat(k,83) = 2.000_r8*rxt(k,216)*y(k,94) - mat(k,91) = rxt(k,217)*y(k,94) + mat(k,62) = rxt(k,207)*y(k,95) + mat(k,72) = rxt(k,185)*y(k,95) + mat(k,83) = 2.000_r8*rxt(k,216)*y(k,95) + mat(k,91) = rxt(k,217)*y(k,95) mat(k,713) = rxt(k,207)*y(k,10) + rxt(k,185)*y(k,14) + 2.000_r8*rxt(k,216) & *y(k,33) + rxt(k,217)*y(k,34) - mat(k,439) = -((rxt(k,113) + rxt(k,114) + rxt(k,115)) * y(k,89) + rxt(k,116) & + mat(k,439) = -((rxt(k,113) + rxt(k,114) + rxt(k,115)) * y(k,90) + rxt(k,116) & *y(k,70) + rxt(k,119)*y(k,71)) mat(k,550) = -(rxt(k,113) + rxt(k,114) + rxt(k,115)) * y(k,40) mat(k,507) = -rxt(k,116)*y(k,40) mat(k,527) = -rxt(k,119)*y(k,40) - mat(k,473) = rxt(k,237)*y(k,98) - mat(k,395) = rxt(k,243)*y(k,94) + mat(k,473) = rxt(k,237)*y(k,99) + mat(k,395) = rxt(k,243)*y(k,95) mat(k,773) = rxt(k,157)*y(k,41) mat(k,293) = rxt(k,213)*y(k,41) mat(k,867) = rxt(k,157)*y(k,25) + rxt(k,213)*y(k,39) + rxt(k,111)*y(k,69) & - + rxt(k,94)*y(k,94) + rxt(k,120)*y(k,98) - mat(k,257) = rxt(k,211)*y(k,94) - mat(k,452) = rxt(k,188)*y(k,94) - mat(k,350) = rxt(k,143)*y(k,98) - mat(k,674) = rxt(k,111)*y(k,41) + rxt(k,123)*y(k,98) - mat(k,144) = rxt(k,249)*y(k,98) - mat(k,237) = rxt(k,255)*y(k,98) - mat(k,426) = rxt(k,260)*y(k,98) + + rxt(k,94)*y(k,95) + rxt(k,120)*y(k,99) + mat(k,257) = rxt(k,211)*y(k,95) + mat(k,452) = rxt(k,188)*y(k,95) + mat(k,350) = rxt(k,143)*y(k,99) + mat(k,674) = rxt(k,111)*y(k,41) + rxt(k,123)*y(k,99) + mat(k,144) = rxt(k,249)*y(k,99) + mat(k,237) = rxt(k,255)*y(k,99) + mat(k,426) = rxt(k,260)*y(k,99) mat(k,716) = rxt(k,243)*y(k,23) + rxt(k,94)*y(k,41) + rxt(k,211)*y(k,45) & + rxt(k,188)*y(k,49) mat(k,844) = rxt(k,237)*y(k,17) + rxt(k,120)*y(k,41) + rxt(k,143)*y(k,55) & - + rxt(k,123)*y(k,69) + rxt(k,249)*y(k,73) + rxt(k,255)*y(k,76) & - + rxt(k,260)*y(k,78) - mat(k,882) = -(rxt(k,94)*y(k,94) + rxt(k,111)*y(k,69) + rxt(k,120)*y(k,98) & + + rxt(k,123)*y(k,69) + rxt(k,249)*y(k,74) + rxt(k,255)*y(k,77) & + + rxt(k,260)*y(k,79) + mat(k,882) = -(rxt(k,94)*y(k,95) + rxt(k,111)*y(k,69) + rxt(k,120)*y(k,99) & + rxt(k,157)*y(k,25) + rxt(k,213)*y(k,39)) mat(k,731) = -rxt(k,94)*y(k,41) mat(k,689) = -rxt(k,111)*y(k,41) mat(k,859) = -rxt(k,120)*y(k,41) mat(k,788) = -rxt(k,157)*y(k,41) mat(k,296) = -rxt(k,213)*y(k,41) - mat(k,407) = rxt(k,244)*y(k,94) - mat(k,445) = rxt(k,113)*y(k,89) + mat(k,407) = rxt(k,244)*y(k,95) + mat(k,445) = rxt(k,113)*y(k,90) mat(k,565) = rxt(k,113)*y(k,40) mat(k,731) = mat(k,731) + rxt(k,244)*y(k,23) - mat(k,32) = -(rxt(k,209)*y(k,94)) + mat(k,32) = -(rxt(k,209)*y(k,95)) mat(k,694) = -rxt(k,209)*y(k,42) - mat(k,228) = -(rxt(k,112)*y(k,69) + rxt(k,121)*y(k,98) + rxt(k,158)*y(k,25)) + mat(k,228) = -(rxt(k,112)*y(k,69) + rxt(k,121)*y(k,99) + rxt(k,158)*y(k,25)) mat(k,658) = -rxt(k,112)*y(k,43) mat(k,830) = -rxt(k,121)*y(k,43) mat(k,765) = -rxt(k,158)*y(k,43) - mat(k,545) = 2.000_r8*rxt(k,127)*y(k,89) - mat(k,830) = mat(k,830) + 2.000_r8*rxt(k,126)*y(k,98) - mat(k,107) = rxt(k,262)*y(k,102) - mat(k,933) = rxt(k,262)*y(k,80) - mat(k,256) = -(rxt(k,204)*y(k,69) + rxt(k,205)*y(k,98) + (rxt(k,210) & - + rxt(k,211)) * y(k,94)) + mat(k,545) = 2.000_r8*rxt(k,127)*y(k,90) + mat(k,830) = mat(k,830) + 2.000_r8*rxt(k,126)*y(k,99) + mat(k,107) = rxt(k,262)*y(k,103) + mat(k,933) = rxt(k,262)*y(k,81) + mat(k,256) = -(rxt(k,204)*y(k,69) + rxt(k,205)*y(k,99) + (rxt(k,210) & + + rxt(k,211)) * y(k,95)) mat(k,662) = -rxt(k,204)*y(k,45) mat(k,832) = -rxt(k,205)*y(k,45) mat(k,712) = -(rxt(k,210) + rxt(k,211)) * y(k,45) - mat(k,792) = rxt(k,191)*y(k,17) + rxt(k,192)*y(k,89) + mat(k,792) = rxt(k,191)*y(k,17) + rxt(k,192)*y(k,90) mat(k,469) = rxt(k,191)*y(k,3) mat(k,547) = rxt(k,192)*y(k,3) - mat(k,85) = -(rxt(k,227)*y(k,98) + rxt(k,232)*y(k,94)) + mat(k,85) = -(rxt(k,227)*y(k,99) + rxt(k,232)*y(k,95)) mat(k,816) = -rxt(k,227)*y(k,46) mat(k,704) = -rxt(k,232)*y(k,46) - mat(k,95) = -(rxt(k,228)*y(k,98) + rxt(k,233)*y(k,94)) + mat(k,95) = -(rxt(k,228)*y(k,99) + rxt(k,233)*y(k,95)) mat(k,818) = -rxt(k,228)*y(k,47) mat(k,706) = -rxt(k,233)*y(k,47) - mat(k,113) = -(rxt(k,229)*y(k,98) + rxt(k,234)*y(k,94)) + mat(k,113) = -(rxt(k,229)*y(k,99) + rxt(k,234)*y(k,95)) mat(k,820) = -rxt(k,229)*y(k,48) mat(k,708) = -rxt(k,234)*y(k,48) - mat(k,453) = -(rxt(k,175)*y(k,69) + rxt(k,176)*y(k,98) + (rxt(k,187) & - + rxt(k,188)) * y(k,94) + (rxt(k,268) + rxt(k,274) + rxt(k,279) & + mat(k,453) = -(rxt(k,175)*y(k,69) + rxt(k,176)*y(k,99) + (rxt(k,187) & + + rxt(k,188)) * y(k,95) + (rxt(k,268) + rxt(k,274) + rxt(k,279) & ) * y(k,54) + (rxt(k,273) + rxt(k,278) + rxt(k,283)) * y(k,29) & + (rxt(k,275) + rxt(k,280)) * y(k,53)) mat(k,675) = -rxt(k,175)*y(k,49) @@ -386,8 +386,8 @@ subroutine nlnmat02( avec_len, mat, y, rxt ) mat(k,774) = rxt(k,218)*y(k,16) + rxt(k,155)*y(k,17) + rxt(k,220)*y(k,18) & + 2.000_r8*rxt(k,223)*y(k,20) + rxt(k,156)*y(k,23) + rxt(k,225) & *y(k,24) + rxt(k,157)*y(k,41) + rxt(k,158)*y(k,43) + rxt(k,177) & - *y(k,54) + rxt(k,159)*y(k,89) - mat(k,604) = rxt(k,174)*y(k,98) + *y(k,54) + rxt(k,159)*y(k,90) + mat(k,604) = rxt(k,174)*y(k,99) mat(k,868) = rxt(k,157)*y(k,25) mat(k,229) = rxt(k,158)*y(k,25) mat(k,266) = mat(k,266) + rxt(k,177)*y(k,25) @@ -395,63 +395,63 @@ subroutine nlnmat02( avec_len, mat, y, rxt ) mat(k,845) = mat(k,845) + rxt(k,174)*y(k,28) mat(k,387) = rxt(k,212)*y(k,39) mat(k,289) = rxt(k,212)*y(k,23) + rxt(k,213)*y(k,41) + rxt(k,215)*y(k,51) & - + rxt(k,214)*y(k,102) + + rxt(k,214)*y(k,103) mat(k,863) = rxt(k,213)*y(k,39) mat(k,886) = rxt(k,215)*y(k,39) mat(k,935) = rxt(k,214)*y(k,39) - mat(k,906) = -(rxt(k,152)*y(k,98) + rxt(k,215)*y(k,39)) + mat(k,906) = -(rxt(k,152)*y(k,99) + rxt(k,215)*y(k,39)) mat(k,860) = -rxt(k,152)*y(k,51) mat(k,297) = -rxt(k,215)*y(k,51) mat(k,489) = rxt(k,235)*y(k,63) mat(k,316) = (rxt(k,273)+rxt(k,278)+rxt(k,283))*y(k,49) mat(k,133) = rxt(k,246)*y(k,63) mat(k,466) = (rxt(k,273)+rxt(k,278)+rxt(k,283))*y(k,29) - mat(k,648) = rxt(k,151)*y(k,98) + mat(k,648) = rxt(k,151)*y(k,99) mat(k,591) = rxt(k,235)*y(k,17) + rxt(k,246)*y(k,35) mat(k,860) = mat(k,860) + rxt(k,151)*y(k,62) - mat(k,167) = -(rxt(k,128)*y(k,98)) + mat(k,167) = -(rxt(k,128)*y(k,99)) mat(k,826) = -rxt(k,128)*y(k,52) - mat(k,624) = rxt(k,149)*y(k,89) + mat(k,624) = rxt(k,149)*y(k,90) mat(k,544) = rxt(k,149)*y(k,62) mat(k,248) = -(rxt(k,206)*y(k,69) + (rxt(k,275) + rxt(k,280)) * y(k,49)) mat(k,661) = -rxt(k,206)*y(k,53) mat(k,449) = -(rxt(k,275) + rxt(k,280)) * y(k,53) - mat(k,912) = rxt(k,198)*y(k,89) + mat(k,912) = rxt(k,198)*y(k,90) mat(k,546) = rxt(k,198)*y(k,5) - mat(k,265) = -(rxt(k,177)*y(k,25) + rxt(k,178)*y(k,69) + rxt(k,179)*y(k,98) & + mat(k,265) = -(rxt(k,177)*y(k,25) + rxt(k,178)*y(k,69) + rxt(k,179)*y(k,99) & + (rxt(k,268) + rxt(k,274) + rxt(k,279)) * y(k,49)) mat(k,766) = -rxt(k,177)*y(k,54) mat(k,663) = -rxt(k,178)*y(k,54) mat(k,833) = -rxt(k,179)*y(k,54) mat(k,450) = -(rxt(k,268) + rxt(k,274) + rxt(k,279)) * y(k,54) - mat(k,598) = rxt(k,166)*y(k,89) - mat(k,307) = rxt(k,171)*y(k,98) + mat(k,598) = rxt(k,166)*y(k,90) + mat(k,307) = rxt(k,171)*y(k,99) mat(k,548) = rxt(k,166)*y(k,28) mat(k,833) = mat(k,833) + rxt(k,171)*y(k,29) mat(k,347) = -(rxt(k,131)*y(k,61) + (rxt(k,132) + rxt(k,133) + rxt(k,134) & - ) * y(k,62) + rxt(k,135)*y(k,70) + rxt(k,143)*y(k,98) + rxt(k,296) & - *y(k,97)) + ) * y(k,62) + rxt(k,135)*y(k,70) + rxt(k,143)*y(k,99) + rxt(k,296) & + *y(k,98)) mat(k,738) = -rxt(k,131)*y(k,55) mat(k,629) = -(rxt(k,132) + rxt(k,133) + rxt(k,134)) * y(k,55) mat(k,503) = -rxt(k,135)*y(k,55) mat(k,838) = -rxt(k,143)*y(k,55) mat(k,360) = -rxt(k,296)*y(k,55) - mat(k,670) = rxt(k,129)*y(k,90) + rxt(k,293)*y(k,93) - mat(k,503) = mat(k,503) + rxt(k,294)*y(k,93) - mat(k,325) = 1.100_r8*rxt(k,289)*y(k,91) + .200_r8*rxt(k,287)*y(k,92) + mat(k,670) = rxt(k,129)*y(k,91) + rxt(k,293)*y(k,94) + mat(k,503) = mat(k,503) + rxt(k,294)*y(k,94) + mat(k,325) = 1.100_r8*rxt(k,289)*y(k,92) + .200_r8*rxt(k,287)*y(k,93) mat(k,335) = rxt(k,129)*y(k,69) - mat(k,223) = 1.100_r8*rxt(k,289)*y(k,88) - mat(k,245) = .200_r8*rxt(k,287)*y(k,88) + mat(k,223) = 1.100_r8*rxt(k,289)*y(k,89) + mat(k,245) = .200_r8*rxt(k,287)*y(k,89) mat(k,276) = rxt(k,293)*y(k,69) + rxt(k,294)*y(k,70) - mat(k,103) = -((rxt(k,147) + rxt(k,148)) * y(k,94)) + mat(k,103) = -((rxt(k,147) + rxt(k,148)) * y(k,95)) mat(k,707) = -(rxt(k,147) + rxt(k,148)) * y(k,56) mat(k,342) = rxt(k,132)*y(k,62) mat(k,622) = rxt(k,132)*y(k,55) mat(k,623) = rxt(k,150)*y(k,63) mat(k,569) = rxt(k,150)*y(k,62) - mat(k,752) = -(rxt(k,131)*y(k,55) + rxt(k,140)*y(k,63) + rxt(k,144)*y(k,89) & + mat(k,752) = -(rxt(k,131)*y(k,55) + rxt(k,140)*y(k,63) + rxt(k,144)*y(k,90) & + rxt(k,145)*y(k,71) + rxt(k,146)*y(k,69) + rxt(k,167)*y(k,28) & - + rxt(k,199)*y(k,5) + rxt(k,239)*y(k,21) + rxt(k,298)*y(k,97)) + + rxt(k,199)*y(k,5) + rxt(k,239)*y(k,21) + rxt(k,298)*y(k,98)) mat(k,355) = -rxt(k,131)*y(k,61) mat(k,586) = -rxt(k,140)*y(k,61) mat(k,561) = -rxt(k,144)*y(k,61) @@ -462,12 +462,12 @@ subroutine nlnmat02( avec_len, mat, y, rxt ) mat(k,418) = -rxt(k,239)*y(k,61) mat(k,368) = -rxt(k,298)*y(k,61) mat(k,355) = mat(k,355) + 2.000_r8*rxt(k,133)*y(k,62) + rxt(k,135)*y(k,70) & - + rxt(k,143)*y(k,98) - mat(k,106) = 2.000_r8*rxt(k,147)*y(k,94) + + rxt(k,143)*y(k,99) + mat(k,106) = 2.000_r8*rxt(k,147)*y(k,95) mat(k,643) = 2.000_r8*rxt(k,133)*y(k,55) + rxt(k,136)*y(k,69) + rxt(k,256) & - *y(k,78) + *y(k,79) mat(k,685) = mat(k,685) + rxt(k,136)*y(k,62) - mat(k,515) = rxt(k,135)*y(k,55) + rxt(k,130)*y(k,90) + mat(k,515) = rxt(k,135)*y(k,55) + rxt(k,130)*y(k,91) mat(k,433) = rxt(k,256)*y(k,62) mat(k,341) = rxt(k,130)*y(k,70) mat(k,727) = 2.000_r8*rxt(k,147)*y(k,56) @@ -494,8 +494,8 @@ subroutine nlnmat03( avec_len, mat, y, rxt ) do k = 1,avec_len mat(k,640) = -((rxt(k,132) + rxt(k,133) + rxt(k,134)) * y(k,55) + (rxt(k,136) & + rxt(k,138)) * y(k,69) + rxt(k,137)*y(k,71) + rxt(k,149) & - *y(k,89) + rxt(k,150)*y(k,63) + rxt(k,151)*y(k,98) + rxt(k,169) & - *y(k,28) + rxt(k,200)*y(k,5) + rxt(k,256)*y(k,78)) + *y(k,90) + rxt(k,150)*y(k,63) + rxt(k,151)*y(k,99) + rxt(k,169) & + *y(k,28) + rxt(k,200)*y(k,5) + rxt(k,256)*y(k,79)) mat(k,352) = -(rxt(k,132) + rxt(k,133) + rxt(k,134)) * y(k,62) mat(k,682) = -(rxt(k,136) + rxt(k,138)) * y(k,62) mat(k,533) = -rxt(k,137)*y(k,62) @@ -508,18 +508,18 @@ subroutine nlnmat03( avec_len, mat, y, rxt ) mat(k,922) = mat(k,922) + rxt(k,199)*y(k,61) mat(k,417) = rxt(k,239)*y(k,61) mat(k,611) = mat(k,611) + rxt(k,167)*y(k,61) - mat(k,171) = rxt(k,128)*y(k,98) + mat(k,171) = rxt(k,128)*y(k,99) mat(k,749) = rxt(k,199)*y(k,5) + rxt(k,239)*y(k,21) + rxt(k,167)*y(k,28) & + 2.000_r8*rxt(k,140)*y(k,63) + rxt(k,146)*y(k,69) + rxt(k,145) & - *y(k,71) + rxt(k,144)*y(k,89) + *y(k,71) + rxt(k,144)*y(k,90) mat(k,583) = mat(k,583) + 2.000_r8*rxt(k,140)*y(k,61) + rxt(k,141)*y(k,69) & - + rxt(k,139)*y(k,89) + rxt(k,142)*y(k,98) + + rxt(k,139)*y(k,90) + rxt(k,142)*y(k,99) mat(k,682) = mat(k,682) + rxt(k,146)*y(k,61) + rxt(k,141)*y(k,63) mat(k,533) = mat(k,533) + rxt(k,145)*y(k,61) mat(k,558) = mat(k,558) + rxt(k,144)*y(k,61) + rxt(k,139)*y(k,63) mat(k,852) = mat(k,852) + rxt(k,128)*y(k,52) + rxt(k,142)*y(k,63) - mat(k,581) = -(rxt(k,139)*y(k,89) + rxt(k,140)*y(k,61) + rxt(k,141)*y(k,69) & - + rxt(k,142)*y(k,98) + rxt(k,150)*y(k,62) + rxt(k,235)*y(k,17) & + mat(k,581) = -(rxt(k,139)*y(k,90) + rxt(k,140)*y(k,61) + rxt(k,141)*y(k,69) & + + rxt(k,142)*y(k,99) + rxt(k,150)*y(k,62) + rxt(k,235)*y(k,17) & + rxt(k,246)*y(k,35)) mat(k,556) = -rxt(k,139)*y(k,63) mat(k,747) = -rxt(k,140)*y(k,63) @@ -530,9 +530,9 @@ subroutine nlnmat03( avec_len, mat, y, rxt ) mat(k,131) = -rxt(k,246)*y(k,63) mat(k,204) = rxt(k,201)*y(k,69) mat(k,779) = rxt(k,168)*y(k,29) - mat(k,310) = rxt(k,168)*y(k,25) + rxt(k,170)*y(k,69) + rxt(k,171)*y(k,98) + mat(k,310) = rxt(k,168)*y(k,25) + rxt(k,170)*y(k,69) + rxt(k,171)*y(k,99) mat(k,294) = rxt(k,215)*y(k,51) - mat(k,896) = rxt(k,215)*y(k,39) + rxt(k,152)*y(k,98) + mat(k,896) = rxt(k,215)*y(k,39) + rxt(k,152)*y(k,99) mat(k,638) = mat(k,638) + rxt(k,138)*y(k,69) + rxt(k,137)*y(k,71) mat(k,680) = mat(k,680) + rxt(k,201)*y(k,6) + rxt(k,170)*y(k,29) + rxt(k,138) & *y(k,62) @@ -540,13 +540,13 @@ subroutine nlnmat03( avec_len, mat, y, rxt ) mat(k,850) = mat(k,850) + rxt(k,171)*y(k,29) + rxt(k,152)*y(k,51) mat(k,683) = -(rxt(k,108)*y(k,71) + 4._r8*rxt(k,109)*y(k,69) + rxt(k,110) & *y(k,70) + rxt(k,111)*y(k,41) + rxt(k,112)*y(k,43) + rxt(k,117) & - *y(k,89) + rxt(k,123)*y(k,98) + (rxt(k,136) + rxt(k,138) & + *y(k,90) + rxt(k,123)*y(k,99) + (rxt(k,136) + rxt(k,138) & ) * y(k,62) + rxt(k,141)*y(k,63) + rxt(k,146)*y(k,61) + rxt(k,170) & *y(k,29) + rxt(k,172)*y(k,28) + rxt(k,175)*y(k,49) + rxt(k,178) & *y(k,54) + rxt(k,201)*y(k,6) + rxt(k,202)*y(k,5) + rxt(k,204) & *y(k,45) + rxt(k,206)*y(k,53) + rxt(k,236)*y(k,17) + rxt(k,248) & - *y(k,73) + (rxt(k,291) + rxt(k,292)) * y(k,91) + rxt(k,293) & - *y(k,93)) + *y(k,74) + (rxt(k,291) + rxt(k,292)) * y(k,92) + rxt(k,293) & + *y(k,94)) mat(k,534) = -rxt(k,108)*y(k,69) mat(k,513) = -rxt(k,110)*y(k,69) mat(k,876) = -rxt(k,111)*y(k,69) @@ -568,31 +568,31 @@ subroutine nlnmat03( avec_len, mat, y, rxt ) mat(k,145) = -rxt(k,248)*y(k,69) mat(k,227) = -(rxt(k,291) + rxt(k,292)) * y(k,69) mat(k,280) = -rxt(k,293)*y(k,69) - mat(k,443) = rxt(k,115)*y(k,89) + mat(k,443) = rxt(k,115)*y(k,90) mat(k,353) = rxt(k,131)*y(k,61) + rxt(k,132)*y(k,62) + rxt(k,135)*y(k,70) & - + rxt(k,296)*y(k,97) + + rxt(k,296)*y(k,98) mat(k,750) = mat(k,750) + rxt(k,131)*y(k,55) mat(k,641) = mat(k,641) + rxt(k,132)*y(k,55) - mat(k,513) = mat(k,513) + rxt(k,135)*y(k,55) + rxt(k,250)*y(k,76) & - + rxt(k,257)*y(k,78) + rxt(k,295)*y(k,93) + (rxt(k,97)+rxt(k,98)) & - *y(k,94) + rxt(k,302)*y(k,99) + rxt(k,306)*y(k,100) + mat(k,513) = mat(k,513) + rxt(k,135)*y(k,55) + rxt(k,250)*y(k,77) & + + rxt(k,257)*y(k,79) + rxt(k,295)*y(k,94) + (rxt(k,97)+rxt(k,98)) & + *y(k,95) + rxt(k,302)*y(k,100) + rxt(k,306)*y(k,101) mat(k,240) = rxt(k,250)*y(k,70) mat(k,432) = rxt(k,257)*y(k,70) - mat(k,329) = rxt(k,287)*y(k,92) + 1.150_r8*rxt(k,288)*y(k,97) + mat(k,329) = rxt(k,287)*y(k,93) + 1.150_r8*rxt(k,288)*y(k,98) mat(k,559) = mat(k,559) + rxt(k,115)*y(k,40) - mat(k,339) = rxt(k,301)*y(k,99) - mat(k,246) = rxt(k,287)*y(k,88) + mat(k,339) = rxt(k,301)*y(k,100) + mat(k,246) = rxt(k,287)*y(k,89) mat(k,280) = mat(k,280) + rxt(k,295)*y(k,70) mat(k,725) = (rxt(k,97)+rxt(k,98))*y(k,70) - mat(k,366) = rxt(k,296)*y(k,55) + 1.150_r8*rxt(k,288)*y(k,88) - mat(k,853) = mat(k,853) + 2.000_r8*rxt(k,125)*y(k,98) - mat(k,383) = rxt(k,302)*y(k,70) + rxt(k,301)*y(k,90) + mat(k,366) = rxt(k,296)*y(k,55) + 1.150_r8*rxt(k,288)*y(k,89) + mat(k,853) = mat(k,853) + 2.000_r8*rxt(k,125)*y(k,99) + mat(k,383) = rxt(k,302)*y(k,70) + rxt(k,301)*y(k,91) mat(k,193) = rxt(k,306)*y(k,70) - mat(k,508) = -(rxt(k,97)*y(k,94) + rxt(k,102)*y(k,95) + rxt(k,110)*y(k,69) & - + rxt(k,116)*y(k,40) + rxt(k,130)*y(k,90) + rxt(k,135)*y(k,55) & - + rxt(k,250)*y(k,76) + rxt(k,257)*y(k,78) + rxt(k,290)*y(k,91) & - + (rxt(k,294) + rxt(k,295)) * y(k,93) + rxt(k,302)*y(k,99) & - + rxt(k,306)*y(k,100)) + mat(k,508) = -(rxt(k,97)*y(k,95) + rxt(k,102)*y(k,96) + rxt(k,110)*y(k,69) & + + rxt(k,116)*y(k,40) + rxt(k,130)*y(k,91) + rxt(k,135)*y(k,55) & + + rxt(k,250)*y(k,77) + rxt(k,257)*y(k,79) + rxt(k,290)*y(k,92) & + + (rxt(k,294) + rxt(k,295)) * y(k,94) + rxt(k,302)*y(k,100) & + + rxt(k,306)*y(k,101)) mat(k,719) = -rxt(k,97)*y(k,70) mat(k,78) = -rxt(k,102)*y(k,70) mat(k,677) = -rxt(k,110)*y(k,70) @@ -605,46 +605,46 @@ subroutine nlnmat03( avec_len, mat, y, rxt ) mat(k,279) = -(rxt(k,294) + rxt(k,295)) * y(k,70) mat(k,380) = -rxt(k,302)*y(k,70) mat(k,192) = -rxt(k,306)*y(k,70) - mat(k,798) = rxt(k,193)*y(k,71) + rxt(k,192)*y(k,89) + mat(k,798) = rxt(k,193)*y(k,71) + rxt(k,192)*y(k,90) mat(k,917) = 2.000_r8*rxt(k,194)*y(k,5) + (rxt(k,196)+rxt(k,197))*y(k,28) & - + rxt(k,202)*y(k,69) + rxt(k,198)*y(k,89) - mat(k,414) = rxt(k,238)*y(k,89) - mat(k,776) = rxt(k,161)*y(k,71) + rxt(k,159)*y(k,89) + + rxt(k,202)*y(k,69) + rxt(k,198)*y(k,90) + mat(k,414) = rxt(k,238)*y(k,90) + mat(k,776) = rxt(k,161)*y(k,71) + rxt(k,159)*y(k,90) mat(k,606) = (rxt(k,196)+rxt(k,197))*y(k,5) + (2.000_r8*rxt(k,163) & +2.000_r8*rxt(k,164))*y(k,28) + rxt(k,172)*y(k,69) + rxt(k,166) & - *y(k,89) + rxt(k,174)*y(k,98) - mat(k,440) = mat(k,440) + rxt(k,119)*y(k,71) + rxt(k,113)*y(k,89) - mat(k,168) = rxt(k,128)*y(k,98) + *y(k,90) + rxt(k,174)*y(k,99) + mat(k,440) = mat(k,440) + rxt(k,119)*y(k,71) + rxt(k,113)*y(k,90) + mat(k,168) = rxt(k,128)*y(k,99) mat(k,351) = mat(k,351) + rxt(k,134)*y(k,62) - mat(k,104) = rxt(k,148)*y(k,94) - mat(k,744) = rxt(k,145)*y(k,71) + rxt(k,298)*y(k,97) + mat(k,104) = rxt(k,148)*y(k,95) + mat(k,744) = rxt(k,145)*y(k,71) + rxt(k,298)*y(k,98) mat(k,635) = rxt(k,134)*y(k,55) + rxt(k,136)*y(k,69) + rxt(k,137)*y(k,71) - mat(k,578) = rxt(k,141)*y(k,69) + rxt(k,139)*y(k,89) + mat(k,578) = rxt(k,141)*y(k,69) + rxt(k,139)*y(k,90) mat(k,677) = mat(k,677) + rxt(k,202)*y(k,5) + rxt(k,172)*y(k,28) + rxt(k,136) & *y(k,62) + rxt(k,141)*y(k,63) + 2.000_r8*rxt(k,109)*y(k,69) & - + 2.000_r8*rxt(k,108)*y(k,71) + rxt(k,117)*y(k,89) + rxt(k,101) & - *y(k,95) + rxt(k,123)*y(k,98) - mat(k,508) = mat(k,508) + 2.000_r8*rxt(k,102)*y(k,95) + + 2.000_r8*rxt(k,108)*y(k,71) + rxt(k,117)*y(k,90) + rxt(k,101) & + *y(k,96) + rxt(k,123)*y(k,99) + mat(k,508) = mat(k,508) + 2.000_r8*rxt(k,102)*y(k,96) mat(k,528) = rxt(k,193)*y(k,3) + rxt(k,161)*y(k,25) + rxt(k,119)*y(k,40) & + rxt(k,145)*y(k,61) + rxt(k,137)*y(k,62) + 2.000_r8*rxt(k,108) & - *y(k,69) + rxt(k,252)*y(k,76) + rxt(k,258)*y(k,78) & - + 2.000_r8*rxt(k,118)*y(k,89) + 2.000_r8*rxt(k,99)*y(k,94) & - + rxt(k,124)*y(k,98) + *y(k,69) + rxt(k,252)*y(k,77) + rxt(k,258)*y(k,79) & + + 2.000_r8*rxt(k,118)*y(k,90) + 2.000_r8*rxt(k,99)*y(k,95) & + + rxt(k,124)*y(k,99) mat(k,238) = mat(k,238) + rxt(k,252)*y(k,71) mat(k,427) = mat(k,427) + rxt(k,258)*y(k,71) mat(k,553) = rxt(k,192)*y(k,3) + rxt(k,198)*y(k,5) + rxt(k,238)*y(k,21) & + rxt(k,159)*y(k,25) + rxt(k,166)*y(k,28) + rxt(k,113)*y(k,40) & + rxt(k,139)*y(k,63) + rxt(k,117)*y(k,69) + 2.000_r8*rxt(k,118) & - *y(k,71) + 2.000_r8*rxt(k,127)*y(k,89) + rxt(k,122)*y(k,98) + *y(k,71) + 2.000_r8*rxt(k,127)*y(k,90) + rxt(k,122)*y(k,99) mat(k,719) = mat(k,719) + rxt(k,148)*y(k,56) + 2.000_r8*rxt(k,99)*y(k,71) mat(k,78) = mat(k,78) + rxt(k,101)*y(k,69) + 2.000_r8*rxt(k,102)*y(k,70) mat(k,364) = rxt(k,298)*y(k,61) mat(k,847) = rxt(k,174)*y(k,28) + rxt(k,128)*y(k,52) + rxt(k,123)*y(k,69) & - + rxt(k,124)*y(k,71) + rxt(k,122)*y(k,89) - mat(k,529) = -(rxt(k,99)*y(k,94) + rxt(k,108)*y(k,69) + rxt(k,118)*y(k,89) & - + rxt(k,119)*y(k,40) + rxt(k,124)*y(k,98) + rxt(k,137)*y(k,62) & + + rxt(k,124)*y(k,71) + rxt(k,122)*y(k,90) + mat(k,529) = -(rxt(k,99)*y(k,95) + rxt(k,108)*y(k,69) + rxt(k,118)*y(k,90) & + + rxt(k,119)*y(k,40) + rxt(k,124)*y(k,99) + rxt(k,137)*y(k,62) & + rxt(k,145)*y(k,61) + rxt(k,161)*y(k,25) + rxt(k,193)*y(k,3) & - + rxt(k,252)*y(k,76) + rxt(k,258)*y(k,78)) + + rxt(k,252)*y(k,77) + rxt(k,258)*y(k,79)) mat(k,720) = -rxt(k,99)*y(k,71) mat(k,678) = -rxt(k,108)*y(k,71) mat(k,554) = -rxt(k,118)*y(k,71) @@ -658,49 +658,49 @@ subroutine nlnmat03( avec_len, mat, y, rxt ) mat(k,428) = -rxt(k,258)*y(k,71) mat(k,678) = mat(k,678) + rxt(k,110)*y(k,70) mat(k,509) = rxt(k,110)*y(k,69) - mat(k,134) = -(rxt(k,259)*y(k,78)) - mat(k,422) = -rxt(k,259)*y(k,72) + mat(k,134) = -(rxt(k,259)*y(k,79)) + mat(k,422) = -rxt(k,259)*y(k,73) mat(k,910) = rxt(k,195)*y(k,28) mat(k,597) = rxt(k,195)*y(k,5) + 2.000_r8*rxt(k,165)*y(k,28) - mat(k,139) = -(rxt(k,248)*y(k,69) + rxt(k,249)*y(k,98)) - mat(k,653) = -rxt(k,248)*y(k,73) - mat(k,822) = -rxt(k,249)*y(k,73) - mat(k,235) = -(rxt(k,250)*y(k,70) + rxt(k,252)*y(k,71) + rxt(k,255)*y(k,98)) - mat(k,497) = -rxt(k,250)*y(k,76) - mat(k,524) = -rxt(k,252)*y(k,76) - mat(k,831) = -rxt(k,255)*y(k,76) + mat(k,139) = -(rxt(k,248)*y(k,69) + rxt(k,249)*y(k,99)) + mat(k,653) = -rxt(k,248)*y(k,74) + mat(k,822) = -rxt(k,249)*y(k,74) + mat(k,235) = -(rxt(k,250)*y(k,70) + rxt(k,252)*y(k,71) + rxt(k,255)*y(k,99)) + mat(k,497) = -rxt(k,250)*y(k,77) + mat(k,524) = -rxt(k,252)*y(k,77) + mat(k,831) = -rxt(k,255)*y(k,77) mat(k,425) = -(rxt(k,253)*y(k,5) + rxt(k,254)*y(k,28) + rxt(k,256)*y(k,62) & - + rxt(k,257)*y(k,70) + rxt(k,258)*y(k,71) + rxt(k,259)*y(k,72) & - + rxt(k,260)*y(k,98)) - mat(k,914) = -rxt(k,253)*y(k,78) - mat(k,602) = -rxt(k,254)*y(k,78) - mat(k,632) = -rxt(k,256)*y(k,78) - mat(k,506) = -rxt(k,257)*y(k,78) - mat(k,526) = -rxt(k,258)*y(k,78) - mat(k,136) = -rxt(k,259)*y(k,78) - mat(k,843) = -rxt(k,260)*y(k,78) - mat(k,673) = rxt(k,248)*y(k,73) - mat(k,506) = mat(k,506) + rxt(k,250)*y(k,76) - mat(k,526) = mat(k,526) + rxt(k,252)*y(k,76) + + rxt(k,257)*y(k,70) + rxt(k,258)*y(k,71) + rxt(k,259)*y(k,73) & + + rxt(k,260)*y(k,99)) + mat(k,914) = -rxt(k,253)*y(k,79) + mat(k,602) = -rxt(k,254)*y(k,79) + mat(k,632) = -rxt(k,256)*y(k,79) + mat(k,506) = -rxt(k,257)*y(k,79) + mat(k,526) = -rxt(k,258)*y(k,79) + mat(k,136) = -rxt(k,259)*y(k,79) + mat(k,843) = -rxt(k,260)*y(k,79) + mat(k,673) = rxt(k,248)*y(k,74) + mat(k,506) = mat(k,506) + rxt(k,250)*y(k,77) + mat(k,526) = mat(k,526) + rxt(k,252)*y(k,77) mat(k,143) = rxt(k,248)*y(k,69) - mat(k,236) = rxt(k,250)*y(k,70) + rxt(k,252)*y(k,71) + rxt(k,255)*y(k,98) - mat(k,843) = mat(k,843) + rxt(k,255)*y(k,76) - mat(k,300) = -(rxt(k,251)*y(k,98)) - mat(k,836) = -rxt(k,251)*y(k,79) - mat(k,913) = rxt(k,253)*y(k,78) - mat(k,599) = rxt(k,254)*y(k,78) - mat(k,129) = rxt(k,246)*y(k,63) + (rxt(k,247)+.500_r8*rxt(k,261))*y(k,98) - mat(k,627) = rxt(k,256)*y(k,78) + mat(k,236) = rxt(k,250)*y(k,70) + rxt(k,252)*y(k,71) + rxt(k,255)*y(k,99) + mat(k,843) = mat(k,843) + rxt(k,255)*y(k,77) + mat(k,300) = -(rxt(k,251)*y(k,99)) + mat(k,836) = -rxt(k,251)*y(k,80) + mat(k,913) = rxt(k,253)*y(k,79) + mat(k,599) = rxt(k,254)*y(k,79) + mat(k,129) = rxt(k,246)*y(k,63) + (rxt(k,247)+.500_r8*rxt(k,261))*y(k,99) + mat(k,627) = rxt(k,256)*y(k,79) mat(k,572) = rxt(k,246)*y(k,35) - mat(k,500) = rxt(k,257)*y(k,78) - mat(k,525) = rxt(k,258)*y(k,78) - mat(k,135) = rxt(k,259)*y(k,78) - mat(k,142) = rxt(k,249)*y(k,98) + mat(k,500) = rxt(k,257)*y(k,79) + mat(k,525) = rxt(k,258)*y(k,79) + mat(k,135) = rxt(k,259)*y(k,79) + mat(k,142) = rxt(k,249)*y(k,99) mat(k,424) = rxt(k,253)*y(k,5) + rxt(k,254)*y(k,28) + rxt(k,256)*y(k,62) & - + rxt(k,257)*y(k,70) + rxt(k,258)*y(k,71) + rxt(k,259)*y(k,72) & - + rxt(k,260)*y(k,98) + + rxt(k,257)*y(k,70) + rxt(k,258)*y(k,71) + rxt(k,259)*y(k,73) & + + rxt(k,260)*y(k,99) mat(k,836) = mat(k,836) + (rxt(k,247)+.500_r8*rxt(k,261))*y(k,35) & - + rxt(k,249)*y(k,73) + rxt(k,260)*y(k,78) + + rxt(k,249)*y(k,74) + rxt(k,260)*y(k,79) end do end subroutine nlnmat03 subroutine nlnmat04( avec_len, mat, y, rxt ) @@ -721,86 +721,86 @@ subroutine nlnmat04( avec_len, mat, y, rxt ) ! ... complete matrix entries implicit species !---------------------------------------------- do k = 1,avec_len - mat(k,108) = -(rxt(k,262)*y(k,102)) - mat(k,934) = -rxt(k,262)*y(k,80) - mat(k,299) = rxt(k,251)*y(k,98) - mat(k,819) = rxt(k,251)*y(k,79) - mat(k,323) = -(rxt(k,287)*y(k,92) + rxt(k,288)*y(k,97) + rxt(k,289)*y(k,91)) - mat(k,243) = -rxt(k,287)*y(k,88) - mat(k,358) = -rxt(k,288)*y(k,88) - mat(k,221) = -rxt(k,289)*y(k,88) + mat(k,108) = -(rxt(k,262)*y(k,103)) + mat(k,934) = -rxt(k,262)*y(k,81) + mat(k,299) = rxt(k,251)*y(k,99) + mat(k,819) = rxt(k,251)*y(k,80) + mat(k,323) = -(rxt(k,287)*y(k,93) + rxt(k,288)*y(k,98) + rxt(k,289)*y(k,92)) + mat(k,243) = -rxt(k,287)*y(k,89) + mat(k,358) = -rxt(k,288)*y(k,89) + mat(k,221) = -rxt(k,289)*y(k,89) mat(k,555) = -((rxt(k,113) + rxt(k,114) + rxt(k,115)) * y(k,40) + rxt(k,117) & - *y(k,69) + rxt(k,118)*y(k,71) + rxt(k,122)*y(k,98) & - + 4._r8*rxt(k,127)*y(k,89) + rxt(k,139)*y(k,63) + rxt(k,144) & + *y(k,69) + rxt(k,118)*y(k,71) + rxt(k,122)*y(k,99) & + + 4._r8*rxt(k,127)*y(k,90) + rxt(k,139)*y(k,63) + rxt(k,144) & *y(k,61) + rxt(k,149)*y(k,62) + (rxt(k,159) + rxt(k,160) & ) * y(k,25) + rxt(k,166)*y(k,28) + rxt(k,192)*y(k,3) + rxt(k,198) & *y(k,5) + rxt(k,238)*y(k,21)) - mat(k,442) = -(rxt(k,113) + rxt(k,114) + rxt(k,115)) * y(k,89) - mat(k,679) = -rxt(k,117)*y(k,89) - mat(k,530) = -rxt(k,118)*y(k,89) - mat(k,849) = -rxt(k,122)*y(k,89) - mat(k,580) = -rxt(k,139)*y(k,89) - mat(k,746) = -rxt(k,144)*y(k,89) - mat(k,637) = -rxt(k,149)*y(k,89) - mat(k,778) = -(rxt(k,159) + rxt(k,160)) * y(k,89) - mat(k,608) = -rxt(k,166)*y(k,89) - mat(k,800) = -rxt(k,192)*y(k,89) - mat(k,919) = -rxt(k,198)*y(k,89) - mat(k,415) = -rxt(k,238)*y(k,89) + mat(k,442) = -(rxt(k,113) + rxt(k,114) + rxt(k,115)) * y(k,90) + mat(k,679) = -rxt(k,117)*y(k,90) + mat(k,530) = -rxt(k,118)*y(k,90) + mat(k,849) = -rxt(k,122)*y(k,90) + mat(k,580) = -rxt(k,139)*y(k,90) + mat(k,746) = -rxt(k,144)*y(k,90) + mat(k,637) = -rxt(k,149)*y(k,90) + mat(k,778) = -(rxt(k,159) + rxt(k,160)) * y(k,90) + mat(k,608) = -rxt(k,166)*y(k,90) + mat(k,800) = -rxt(k,192)*y(k,90) + mat(k,919) = -rxt(k,198)*y(k,90) + mat(k,415) = -rxt(k,238)*y(k,90) mat(k,800) = mat(k,800) + rxt(k,191)*y(k,17) - mat(k,919) = mat(k,919) + rxt(k,203)*y(k,98) + mat(k,919) = mat(k,919) + rxt(k,203)*y(k,99) mat(k,478) = rxt(k,191)*y(k,3) + rxt(k,155)*y(k,25) + rxt(k,235)*y(k,63) & + rxt(k,236)*y(k,69) - mat(k,213) = rxt(k,220)*y(k,25) + rxt(k,221)*y(k,98) - mat(k,151) = rxt(k,223)*y(k,25) + rxt(k,224)*y(k,98) + mat(k,213) = rxt(k,220)*y(k,25) + rxt(k,221)*y(k,99) + mat(k,151) = rxt(k,223)*y(k,25) + rxt(k,224)*y(k,99) mat(k,415) = mat(k,415) + rxt(k,162)*y(k,28) + rxt(k,239)*y(k,61) - mat(k,399) = rxt(k,243)*y(k,94) + mat(k,399) = rxt(k,243)*y(k,95) mat(k,778) = mat(k,778) + rxt(k,155)*y(k,17) + rxt(k,220)*y(k,18) & + rxt(k,223)*y(k,20) + rxt(k,158)*y(k,43) - mat(k,608) = mat(k,608) + rxt(k,162)*y(k,21) + rxt(k,173)*y(k,98) - mat(k,286) = rxt(k,245)*y(k,98) - mat(k,130) = .500_r8*rxt(k,261)*y(k,98) + mat(k,608) = mat(k,608) + rxt(k,162)*y(k,21) + rxt(k,173)*y(k,99) + mat(k,286) = rxt(k,245)*y(k,99) + mat(k,130) = .500_r8*rxt(k,261)*y(k,99) mat(k,442) = mat(k,442) + rxt(k,116)*y(k,70) - mat(k,230) = rxt(k,158)*y(k,25) + rxt(k,112)*y(k,69) + rxt(k,121)*y(k,98) + mat(k,230) = rxt(k,158)*y(k,25) + rxt(k,112)*y(k,69) + rxt(k,121)*y(k,99) mat(k,746) = mat(k,746) + rxt(k,239)*y(k,21) - mat(k,580) = mat(k,580) + rxt(k,235)*y(k,17) + rxt(k,142)*y(k,98) + mat(k,580) = mat(k,580) + rxt(k,235)*y(k,17) + rxt(k,142)*y(k,99) mat(k,679) = mat(k,679) + rxt(k,236)*y(k,17) + rxt(k,112)*y(k,43) mat(k,510) = rxt(k,116)*y(k,40) - mat(k,530) = mat(k,530) + rxt(k,124)*y(k,98) - mat(k,302) = rxt(k,251)*y(k,98) + mat(k,530) = mat(k,530) + rxt(k,124)*y(k,99) + mat(k,302) = rxt(k,251)*y(k,99) mat(k,721) = rxt(k,243)*y(k,23) mat(k,849) = mat(k,849) + rxt(k,203)*y(k,5) + rxt(k,221)*y(k,18) + rxt(k,224) & *y(k,20) + rxt(k,173)*y(k,28) + rxt(k,245)*y(k,31) & + .500_r8*rxt(k,261)*y(k,35) + rxt(k,121)*y(k,43) + rxt(k,142) & - *y(k,63) + rxt(k,124)*y(k,71) + rxt(k,251)*y(k,79) - mat(k,334) = -(rxt(k,129)*y(k,69) + rxt(k,130)*y(k,70) + rxt(k,301)*y(k,99)) - mat(k,669) = -rxt(k,129)*y(k,90) - mat(k,502) = -rxt(k,130)*y(k,90) - mat(k,375) = -rxt(k,301)*y(k,90) - mat(k,669) = mat(k,669) + rxt(k,291)*y(k,91) - mat(k,324) = .900_r8*rxt(k,289)*y(k,91) + .800_r8*rxt(k,287)*y(k,92) - mat(k,222) = rxt(k,291)*y(k,69) + .900_r8*rxt(k,289)*y(k,88) - mat(k,244) = .800_r8*rxt(k,287)*y(k,88) - mat(k,219) = -(rxt(k,289)*y(k,88) + rxt(k,290)*y(k,70) + (rxt(k,291) & + *y(k,63) + rxt(k,124)*y(k,71) + rxt(k,251)*y(k,80) + mat(k,334) = -(rxt(k,129)*y(k,69) + rxt(k,130)*y(k,70) + rxt(k,301)*y(k,100)) + mat(k,669) = -rxt(k,129)*y(k,91) + mat(k,502) = -rxt(k,130)*y(k,91) + mat(k,375) = -rxt(k,301)*y(k,91) + mat(k,669) = mat(k,669) + rxt(k,291)*y(k,92) + mat(k,324) = .900_r8*rxt(k,289)*y(k,92) + .800_r8*rxt(k,287)*y(k,93) + mat(k,222) = rxt(k,291)*y(k,69) + .900_r8*rxt(k,289)*y(k,89) + mat(k,244) = .800_r8*rxt(k,287)*y(k,89) + mat(k,219) = -(rxt(k,289)*y(k,89) + rxt(k,290)*y(k,70) + (rxt(k,291) & + rxt(k,292)) * y(k,69)) - mat(k,320) = -rxt(k,289)*y(k,91) - mat(k,496) = -rxt(k,290)*y(k,91) - mat(k,657) = -(rxt(k,291) + rxt(k,292)) * y(k,91) - mat(k,242) = -(rxt(k,287)*y(k,88)) - mat(k,321) = -rxt(k,287)*y(k,92) - mat(k,343) = rxt(k,296)*y(k,97) - mat(k,735) = rxt(k,298)*y(k,97) - mat(k,660) = rxt(k,291)*y(k,91) - mat(k,498) = rxt(k,295)*y(k,93) + mat(k,320) = -rxt(k,289)*y(k,92) + mat(k,496) = -rxt(k,290)*y(k,92) + mat(k,657) = -(rxt(k,291) + rxt(k,292)) * y(k,92) + mat(k,242) = -(rxt(k,287)*y(k,89)) + mat(k,321) = -rxt(k,287)*y(k,93) + mat(k,343) = rxt(k,296)*y(k,98) + mat(k,735) = rxt(k,298)*y(k,98) + mat(k,660) = rxt(k,291)*y(k,92) + mat(k,498) = rxt(k,295)*y(k,94) mat(k,220) = rxt(k,291)*y(k,69) mat(k,272) = rxt(k,295)*y(k,70) mat(k,357) = rxt(k,296)*y(k,55) + rxt(k,298)*y(k,61) mat(k,273) = -(rxt(k,293)*y(k,69) + (rxt(k,294) + rxt(k,295)) * y(k,70)) - mat(k,664) = -rxt(k,293)*y(k,93) - mat(k,499) = -(rxt(k,294) + rxt(k,295)) * y(k,93) - mat(k,332) = rxt(k,301)*y(k,99) - mat(k,372) = rxt(k,301)*y(k,90) - mat(k,726) = -(rxt(k,94)*y(k,41) + rxt(k,95)*y(k,102) + (rxt(k,97) + rxt(k,98) & + mat(k,664) = -rxt(k,293)*y(k,94) + mat(k,499) = -(rxt(k,294) + rxt(k,295)) * y(k,94) + mat(k,332) = rxt(k,301)*y(k,100) + mat(k,372) = rxt(k,301)*y(k,91) + mat(k,726) = -(rxt(k,94)*y(k,41) + rxt(k,95)*y(k,103) + (rxt(k,97) + rxt(k,98) & ) * y(k,70) + rxt(k,99)*y(k,71) + (rxt(k,147) + rxt(k,148) & ) * y(k,56) + rxt(k,180)*y(k,8) + rxt(k,181)*y(k,9) + rxt(k,182) & *y(k,11) + rxt(k,183)*y(k,12) + rxt(k,184)*y(k,13) + rxt(k,185) & @@ -810,66 +810,66 @@ subroutine nlnmat04( avec_len, mat, y, rxt ) *y(k,33) + rxt(k,217)*y(k,34) + rxt(k,230)*y(k,16) + rxt(k,231) & *y(k,18) + rxt(k,232)*y(k,46) + rxt(k,233)*y(k,47) + rxt(k,234) & *y(k,48) + (rxt(k,242) + rxt(k,243) + rxt(k,244)) * y(k,23)) - mat(k,877) = -rxt(k,94)*y(k,94) - mat(k,951) = -rxt(k,95)*y(k,94) - mat(k,514) = -(rxt(k,97) + rxt(k,98)) * y(k,94) - mat(k,535) = -rxt(k,99)*y(k,94) - mat(k,105) = -(rxt(k,147) + rxt(k,148)) * y(k,94) - mat(k,30) = -rxt(k,180)*y(k,94) - mat(k,57) = -rxt(k,181)*y(k,94) - mat(k,38) = -rxt(k,182)*y(k,94) - mat(k,68) = -rxt(k,183)*y(k,94) - mat(k,42) = -rxt(k,184)*y(k,94) - mat(k,73) = -rxt(k,185)*y(k,94) - mat(k,46) = -rxt(k,186)*y(k,94) - mat(k,461) = -(rxt(k,187) + rxt(k,188)) * y(k,94) - mat(k,63) = -rxt(k,207)*y(k,94) - mat(k,163) = -rxt(k,208)*y(k,94) - mat(k,34) = -rxt(k,209)*y(k,94) - mat(k,259) = -(rxt(k,210) + rxt(k,211)) * y(k,94) - mat(k,84) = -rxt(k,216)*y(k,94) - mat(k,92) = -rxt(k,217)*y(k,94) - mat(k,176) = -rxt(k,230)*y(k,94) - mat(k,214) = -rxt(k,231)*y(k,94) - mat(k,87) = -rxt(k,232)*y(k,94) - mat(k,97) = -rxt(k,233)*y(k,94) - mat(k,115) = -rxt(k,234)*y(k,94) - mat(k,403) = -(rxt(k,242) + rxt(k,243) + rxt(k,244)) * y(k,94) - mat(k,514) = mat(k,514) + rxt(k,130)*y(k,90) - mat(k,330) = .850_r8*rxt(k,288)*y(k,97) + mat(k,877) = -rxt(k,94)*y(k,95) + mat(k,951) = -rxt(k,95)*y(k,95) + mat(k,514) = -(rxt(k,97) + rxt(k,98)) * y(k,95) + mat(k,535) = -rxt(k,99)*y(k,95) + mat(k,105) = -(rxt(k,147) + rxt(k,148)) * y(k,95) + mat(k,30) = -rxt(k,180)*y(k,95) + mat(k,57) = -rxt(k,181)*y(k,95) + mat(k,38) = -rxt(k,182)*y(k,95) + mat(k,68) = -rxt(k,183)*y(k,95) + mat(k,42) = -rxt(k,184)*y(k,95) + mat(k,73) = -rxt(k,185)*y(k,95) + mat(k,46) = -rxt(k,186)*y(k,95) + mat(k,461) = -(rxt(k,187) + rxt(k,188)) * y(k,95) + mat(k,63) = -rxt(k,207)*y(k,95) + mat(k,163) = -rxt(k,208)*y(k,95) + mat(k,34) = -rxt(k,209)*y(k,95) + mat(k,259) = -(rxt(k,210) + rxt(k,211)) * y(k,95) + mat(k,84) = -rxt(k,216)*y(k,95) + mat(k,92) = -rxt(k,217)*y(k,95) + mat(k,176) = -rxt(k,230)*y(k,95) + mat(k,214) = -rxt(k,231)*y(k,95) + mat(k,87) = -rxt(k,232)*y(k,95) + mat(k,97) = -rxt(k,233)*y(k,95) + mat(k,115) = -rxt(k,234)*y(k,95) + mat(k,403) = -(rxt(k,242) + rxt(k,243) + rxt(k,244)) * y(k,95) + mat(k,514) = mat(k,514) + rxt(k,130)*y(k,91) + mat(k,330) = .850_r8*rxt(k,288)*y(k,98) mat(k,340) = rxt(k,130)*y(k,70) - mat(k,367) = .850_r8*rxt(k,288)*y(k,88) + mat(k,367) = .850_r8*rxt(k,288)*y(k,89) mat(k,77) = -(rxt(k,101)*y(k,69) + rxt(k,102)*y(k,70)) - mat(k,651) = -rxt(k,101)*y(k,95) - mat(k,492) = -rxt(k,102)*y(k,95) - mat(k,194) = rxt(k,103)*y(k,96) - mat(k,651) = mat(k,651) + rxt(k,105)*y(k,96) - mat(k,492) = mat(k,492) + rxt(k,106)*y(k,96) - mat(k,522) = rxt(k,107)*y(k,96) + mat(k,651) = -rxt(k,101)*y(k,96) + mat(k,492) = -rxt(k,102)*y(k,96) + mat(k,194) = rxt(k,103)*y(k,97) + mat(k,651) = mat(k,651) + rxt(k,105)*y(k,97) + mat(k,492) = mat(k,492) + rxt(k,106)*y(k,97) + mat(k,522) = rxt(k,107)*y(k,97) mat(k,79) = rxt(k,103)*y(k,32) + rxt(k,105)*y(k,69) + rxt(k,106)*y(k,70) & + rxt(k,107)*y(k,71) mat(k,80) = -(rxt(k,103)*y(k,32) + rxt(k,105)*y(k,69) + rxt(k,106)*y(k,70) & + rxt(k,107)*y(k,71)) - mat(k,195) = -rxt(k,103)*y(k,96) - mat(k,652) = -rxt(k,105)*y(k,96) - mat(k,493) = -rxt(k,106)*y(k,96) - mat(k,523) = -rxt(k,107)*y(k,96) - mat(k,493) = mat(k,493) + rxt(k,97)*y(k,94) + mat(k,195) = -rxt(k,103)*y(k,97) + mat(k,652) = -rxt(k,105)*y(k,97) + mat(k,493) = -rxt(k,106)*y(k,97) + mat(k,523) = -rxt(k,107)*y(k,97) + mat(k,493) = mat(k,493) + rxt(k,97)*y(k,95) mat(k,702) = rxt(k,97)*y(k,70) - mat(k,361) = -(rxt(k,288)*y(k,88) + rxt(k,296)*y(k,55) + rxt(k,298)*y(k,61)) - mat(k,326) = -rxt(k,288)*y(k,97) - mat(k,348) = -rxt(k,296)*y(k,97) - mat(k,739) = -rxt(k,298)*y(k,97) - mat(k,198) = rxt(k,299)*y(k,99) - mat(k,504) = rxt(k,290)*y(k,91) + rxt(k,294)*y(k,93) + rxt(k,302)*y(k,99) & - + rxt(k,306)*y(k,100) + mat(k,361) = -(rxt(k,288)*y(k,89) + rxt(k,296)*y(k,55) + rxt(k,298)*y(k,61)) + mat(k,326) = -rxt(k,288)*y(k,98) + mat(k,348) = -rxt(k,296)*y(k,98) + mat(k,739) = -rxt(k,298)*y(k,98) + mat(k,198) = rxt(k,299)*y(k,100) + mat(k,504) = rxt(k,290)*y(k,92) + rxt(k,294)*y(k,94) + rxt(k,302)*y(k,100) & + + rxt(k,306)*y(k,101) mat(k,224) = rxt(k,290)*y(k,70) mat(k,277) = rxt(k,294)*y(k,70) mat(k,377) = rxt(k,299)*y(k,32) + rxt(k,302)*y(k,70) mat(k,190) = rxt(k,306)*y(k,70) - mat(k,858) = -(rxt(k,120)*y(k,41) + rxt(k,121)*y(k,43) + rxt(k,122)*y(k,89) & + mat(k,858) = -(rxt(k,120)*y(k,41) + rxt(k,121)*y(k,43) + rxt(k,122)*y(k,90) & + rxt(k,123)*y(k,69) + rxt(k,124)*y(k,71) + (4._r8*rxt(k,125) & - + 4._r8*rxt(k,126)) * y(k,98) + rxt(k,128)*y(k,52) + rxt(k,142) & + + 4._r8*rxt(k,126)) * y(k,99) + rxt(k,128)*y(k,52) + rxt(k,142) & *y(k,63) + rxt(k,143)*y(k,55) + rxt(k,151)*y(k,62) + rxt(k,152) & *y(k,51) + rxt(k,171)*y(k,29) + (rxt(k,173) + rxt(k,174) & ) * y(k,28) + rxt(k,176)*y(k,49) + rxt(k,179)*y(k,54) + rxt(k,203) & @@ -878,66 +878,66 @@ subroutine nlnmat04( avec_len, mat, y, rxt ) *y(k,24) + rxt(k,227)*y(k,46) + rxt(k,228)*y(k,47) + rxt(k,229) & *y(k,48) + rxt(k,237)*y(k,17) + rxt(k,240)*y(k,22) + rxt(k,241) & *y(k,23) + rxt(k,245)*y(k,31) + (rxt(k,247) + rxt(k,261) & - ) * y(k,35) + rxt(k,249)*y(k,73) + rxt(k,251)*y(k,79) + rxt(k,255) & - *y(k,76) + rxt(k,260)*y(k,78)) - mat(k,881) = -rxt(k,120)*y(k,98) - mat(k,233) = -rxt(k,121)*y(k,98) - mat(k,564) = -rxt(k,122)*y(k,98) - mat(k,688) = -rxt(k,123)*y(k,98) - mat(k,539) = -rxt(k,124)*y(k,98) - mat(k,172) = -rxt(k,128)*y(k,98) - mat(k,589) = -rxt(k,142)*y(k,98) - mat(k,356) = -rxt(k,143)*y(k,98) - mat(k,646) = -rxt(k,151)*y(k,98) - mat(k,904) = -rxt(k,152)*y(k,98) - mat(k,315) = -rxt(k,171)*y(k,98) - mat(k,617) = -(rxt(k,173) + rxt(k,174)) * y(k,98) - mat(k,464) = -rxt(k,176)*y(k,98) - mat(k,270) = -rxt(k,179)*y(k,98) - mat(k,928) = -rxt(k,203)*y(k,98) - mat(k,261) = -rxt(k,205)*y(k,98) - mat(k,179) = -rxt(k,219)*y(k,98) - mat(k,217) = -rxt(k,221)*y(k,98) - mat(k,50) = -rxt(k,222)*y(k,98) - mat(k,153) = -rxt(k,224)*y(k,98) - mat(k,166) = -rxt(k,226)*y(k,98) - mat(k,89) = -rxt(k,227)*y(k,98) - mat(k,99) = -rxt(k,228)*y(k,98) - mat(k,117) = -rxt(k,229)*y(k,98) - mat(k,487) = -rxt(k,237)*y(k,98) - mat(k,159) = -rxt(k,240)*y(k,98) - mat(k,406) = -rxt(k,241)*y(k,98) - mat(k,288) = -rxt(k,245)*y(k,98) - mat(k,132) = -(rxt(k,247) + rxt(k,261)) * y(k,98) - mat(k,146) = -rxt(k,249)*y(k,98) - mat(k,304) = -rxt(k,251)*y(k,98) - mat(k,241) = -rxt(k,255)*y(k,98) - mat(k,436) = -rxt(k,260)*y(k,98) + ) * y(k,35) + rxt(k,249)*y(k,74) + rxt(k,251)*y(k,80) + rxt(k,255) & + *y(k,77) + rxt(k,260)*y(k,79)) + mat(k,881) = -rxt(k,120)*y(k,99) + mat(k,233) = -rxt(k,121)*y(k,99) + mat(k,564) = -rxt(k,122)*y(k,99) + mat(k,688) = -rxt(k,123)*y(k,99) + mat(k,539) = -rxt(k,124)*y(k,99) + mat(k,172) = -rxt(k,128)*y(k,99) + mat(k,589) = -rxt(k,142)*y(k,99) + mat(k,356) = -rxt(k,143)*y(k,99) + mat(k,646) = -rxt(k,151)*y(k,99) + mat(k,904) = -rxt(k,152)*y(k,99) + mat(k,315) = -rxt(k,171)*y(k,99) + mat(k,617) = -(rxt(k,173) + rxt(k,174)) * y(k,99) + mat(k,464) = -rxt(k,176)*y(k,99) + mat(k,270) = -rxt(k,179)*y(k,99) + mat(k,928) = -rxt(k,203)*y(k,99) + mat(k,261) = -rxt(k,205)*y(k,99) + mat(k,179) = -rxt(k,219)*y(k,99) + mat(k,217) = -rxt(k,221)*y(k,99) + mat(k,50) = -rxt(k,222)*y(k,99) + mat(k,153) = -rxt(k,224)*y(k,99) + mat(k,166) = -rxt(k,226)*y(k,99) + mat(k,89) = -rxt(k,227)*y(k,99) + mat(k,99) = -rxt(k,228)*y(k,99) + mat(k,117) = -rxt(k,229)*y(k,99) + mat(k,487) = -rxt(k,237)*y(k,99) + mat(k,159) = -rxt(k,240)*y(k,99) + mat(k,406) = -rxt(k,241)*y(k,99) + mat(k,288) = -rxt(k,245)*y(k,99) + mat(k,132) = -(rxt(k,247) + rxt(k,261)) * y(k,99) + mat(k,146) = -rxt(k,249)*y(k,99) + mat(k,304) = -rxt(k,251)*y(k,99) + mat(k,241) = -rxt(k,255)*y(k,99) + mat(k,436) = -rxt(k,260)*y(k,99) mat(k,487) = mat(k,487) + rxt(k,236)*y(k,69) - mat(k,159) = mat(k,159) + .300_r8*rxt(k,240)*y(k,98) - mat(k,406) = mat(k,406) + rxt(k,242)*y(k,94) - mat(k,787) = rxt(k,160)*y(k,89) - mat(k,295) = rxt(k,214)*y(k,102) - mat(k,444) = rxt(k,119)*y(k,71) + 2.000_r8*rxt(k,114)*y(k,89) - mat(k,881) = mat(k,881) + rxt(k,111)*y(k,69) + rxt(k,94)*y(k,94) + mat(k,159) = mat(k,159) + .300_r8*rxt(k,240)*y(k,99) + mat(k,406) = mat(k,406) + rxt(k,242)*y(k,95) + mat(k,787) = rxt(k,160)*y(k,90) + mat(k,295) = rxt(k,214)*y(k,103) + mat(k,444) = rxt(k,119)*y(k,71) + 2.000_r8*rxt(k,114)*y(k,90) + mat(k,881) = mat(k,881) + rxt(k,111)*y(k,69) + rxt(k,94)*y(k,95) mat(k,233) = mat(k,233) + rxt(k,112)*y(k,69) - mat(k,261) = mat(k,261) + rxt(k,204)*y(k,69) + rxt(k,210)*y(k,94) - mat(k,464) = mat(k,464) + rxt(k,175)*y(k,69) + rxt(k,187)*y(k,94) + mat(k,261) = mat(k,261) + rxt(k,204)*y(k,69) + rxt(k,210)*y(k,95) + mat(k,464) = mat(k,464) + rxt(k,175)*y(k,69) + rxt(k,187)*y(k,95) mat(k,253) = rxt(k,206)*y(k,69) mat(k,270) = mat(k,270) + rxt(k,178)*y(k,69) - mat(k,755) = rxt(k,144)*y(k,89) - mat(k,589) = mat(k,589) + rxt(k,139)*y(k,89) + mat(k,755) = rxt(k,144)*y(k,90) + mat(k,589) = mat(k,589) + rxt(k,139)*y(k,90) mat(k,688) = mat(k,688) + rxt(k,236)*y(k,17) + rxt(k,111)*y(k,41) & + rxt(k,112)*y(k,43) + rxt(k,204)*y(k,45) + rxt(k,175)*y(k,49) & - + rxt(k,206)*y(k,53) + rxt(k,178)*y(k,54) + rxt(k,117)*y(k,89) - mat(k,539) = mat(k,539) + rxt(k,119)*y(k,40) + rxt(k,118)*y(k,89) + + rxt(k,206)*y(k,53) + rxt(k,178)*y(k,54) + rxt(k,117)*y(k,90) + mat(k,539) = mat(k,539) + rxt(k,119)*y(k,40) + rxt(k,118)*y(k,90) mat(k,564) = mat(k,564) + rxt(k,160)*y(k,25) + 2.000_r8*rxt(k,114)*y(k,40) & + rxt(k,144)*y(k,61) + rxt(k,139)*y(k,63) + rxt(k,117)*y(k,69) & + rxt(k,118)*y(k,71) mat(k,730) = rxt(k,242)*y(k,23) + rxt(k,94)*y(k,41) + rxt(k,210)*y(k,45) & - + rxt(k,187)*y(k,49) + 2.000_r8*rxt(k,95)*y(k,102) + + rxt(k,187)*y(k,49) + 2.000_r8*rxt(k,95)*y(k,103) mat(k,858) = mat(k,858) + .300_r8*rxt(k,240)*y(k,22) - mat(k,955) = rxt(k,214)*y(k,39) + 2.000_r8*rxt(k,95)*y(k,94) + mat(k,955) = rxt(k,214)*y(k,39) + 2.000_r8*rxt(k,95)*y(k,95) end do end subroutine nlnmat04 subroutine nlnmat05( avec_len, mat, y, rxt ) @@ -958,55 +958,55 @@ subroutine nlnmat05( avec_len, mat, y, rxt ) ! ... complete matrix entries implicit species !---------------------------------------------- do k = 1,avec_len - mat(k,378) = -(rxt(k,299)*y(k,32) + rxt(k,301)*y(k,90) + rxt(k,302)*y(k,70)) - mat(k,199) = -rxt(k,299)*y(k,99) - mat(k,337) = -rxt(k,301)*y(k,99) - mat(k,505) = -rxt(k,302)*y(k,99) - mat(k,672) = rxt(k,292)*y(k,91) + rxt(k,293)*y(k,93) + rxt(k,305)*y(k,100) & - + rxt(k,311)*y(k,101) - mat(k,327) = rxt(k,303)*y(k,100) + rxt(k,308)*y(k,101) + mat(k,378) = -(rxt(k,299)*y(k,32) + rxt(k,301)*y(k,91) + rxt(k,302)*y(k,70)) + mat(k,199) = -rxt(k,299)*y(k,100) + mat(k,337) = -rxt(k,301)*y(k,100) + mat(k,505) = -rxt(k,302)*y(k,100) + mat(k,672) = rxt(k,292)*y(k,92) + rxt(k,293)*y(k,94) + rxt(k,305)*y(k,101) & + + rxt(k,311)*y(k,102) + mat(k,327) = rxt(k,303)*y(k,101) + rxt(k,308)*y(k,102) mat(k,225) = rxt(k,292)*y(k,69) mat(k,278) = rxt(k,293)*y(k,69) - mat(k,191) = rxt(k,305)*y(k,69) + rxt(k,303)*y(k,88) - mat(k,185) = rxt(k,311)*y(k,69) + rxt(k,308)*y(k,88) - mat(k,188) = -(rxt(k,303)*y(k,88) + rxt(k,305)*y(k,69) + rxt(k,306)*y(k,70)) - mat(k,319) = -rxt(k,303)*y(k,100) - mat(k,655) = -rxt(k,305)*y(k,100) - mat(k,495) = -rxt(k,306)*y(k,100) - mat(k,319) = mat(k,319) + rxt(k,307)*y(k,101) - mat(k,182) = rxt(k,307)*y(k,88) - mat(k,181) = -((rxt(k,307) + rxt(k,308)) * y(k,88) + rxt(k,311)*y(k,69)) - mat(k,318) = -(rxt(k,307) + rxt(k,308)) * y(k,101) - mat(k,654) = -rxt(k,311)*y(k,101) - mat(k,959) = -(rxt(k,95)*y(k,94) + rxt(k,214)*y(k,39) + rxt(k,262)*y(k,80)) - mat(k,734) = -rxt(k,95)*y(k,102) - mat(k,298) = -rxt(k,214)*y(k,102) - mat(k,111) = -rxt(k,262)*y(k,102) - mat(k,180) = rxt(k,219)*y(k,98) - mat(k,491) = rxt(k,237)*y(k,98) - mat(k,218) = rxt(k,221)*y(k,98) - mat(k,51) = rxt(k,222)*y(k,98) - mat(k,154) = rxt(k,224)*y(k,98) - mat(k,160) = rxt(k,240)*y(k,98) - mat(k,409) = rxt(k,241)*y(k,98) - mat(k,446) = rxt(k,115)*y(k,89) - mat(k,885) = rxt(k,120)*y(k,98) - mat(k,234) = rxt(k,121)*y(k,98) - mat(k,263) = rxt(k,205)*y(k,98) - mat(k,118) = rxt(k,229)*y(k,98) + mat(k,191) = rxt(k,305)*y(k,69) + rxt(k,303)*y(k,89) + mat(k,185) = rxt(k,311)*y(k,69) + rxt(k,308)*y(k,89) + mat(k,188) = -(rxt(k,303)*y(k,89) + rxt(k,305)*y(k,69) + rxt(k,306)*y(k,70)) + mat(k,319) = -rxt(k,303)*y(k,101) + mat(k,655) = -rxt(k,305)*y(k,101) + mat(k,495) = -rxt(k,306)*y(k,101) + mat(k,319) = mat(k,319) + rxt(k,307)*y(k,102) + mat(k,182) = rxt(k,307)*y(k,89) + mat(k,181) = -((rxt(k,307) + rxt(k,308)) * y(k,89) + rxt(k,311)*y(k,69)) + mat(k,318) = -(rxt(k,307) + rxt(k,308)) * y(k,102) + mat(k,654) = -rxt(k,311)*y(k,102) + mat(k,959) = -(rxt(k,95)*y(k,95) + rxt(k,214)*y(k,39) + rxt(k,262)*y(k,81)) + mat(k,734) = -rxt(k,95)*y(k,103) + mat(k,298) = -rxt(k,214)*y(k,103) + mat(k,111) = -rxt(k,262)*y(k,103) + mat(k,180) = rxt(k,219)*y(k,99) + mat(k,491) = rxt(k,237)*y(k,99) + mat(k,218) = rxt(k,221)*y(k,99) + mat(k,51) = rxt(k,222)*y(k,99) + mat(k,154) = rxt(k,224)*y(k,99) + mat(k,160) = rxt(k,240)*y(k,99) + mat(k,409) = rxt(k,241)*y(k,99) + mat(k,446) = rxt(k,115)*y(k,90) + mat(k,885) = rxt(k,120)*y(k,99) + mat(k,234) = rxt(k,121)*y(k,99) + mat(k,263) = rxt(k,205)*y(k,99) + mat(k,118) = rxt(k,229)*y(k,99) mat(k,468) = (rxt(k,275)+rxt(k,280))*y(k,53) + (rxt(k,268)+rxt(k,274) & - +rxt(k,279))*y(k,54) + rxt(k,176)*y(k,98) - mat(k,908) = rxt(k,152)*y(k,98) - mat(k,173) = rxt(k,128)*y(k,98) + +rxt(k,279))*y(k,54) + rxt(k,176)*y(k,99) + mat(k,908) = rxt(k,152)*y(k,99) + mat(k,173) = rxt(k,128)*y(k,99) mat(k,255) = (rxt(k,275)+rxt(k,280))*y(k,49) - mat(k,271) = (rxt(k,268)+rxt(k,274)+rxt(k,279))*y(k,49) + rxt(k,179)*y(k,98) - mat(k,568) = rxt(k,115)*y(k,40) + rxt(k,122)*y(k,98) + mat(k,271) = (rxt(k,268)+rxt(k,274)+rxt(k,279))*y(k,49) + rxt(k,179)*y(k,99) + mat(k,568) = rxt(k,115)*y(k,40) + rxt(k,122)*y(k,99) mat(k,862) = rxt(k,219)*y(k,16) + rxt(k,237)*y(k,17) + rxt(k,221)*y(k,18) & + rxt(k,222)*y(k,19) + rxt(k,224)*y(k,20) + rxt(k,240)*y(k,22) & + rxt(k,241)*y(k,23) + rxt(k,120)*y(k,41) + rxt(k,121)*y(k,43) & + rxt(k,205)*y(k,45) + rxt(k,229)*y(k,48) + rxt(k,176)*y(k,49) & + rxt(k,152)*y(k,51) + rxt(k,128)*y(k,52) + rxt(k,179)*y(k,54) & - + rxt(k,122)*y(k,89) + 2.000_r8*rxt(k,125)*y(k,98) + + rxt(k,122)*y(k,90) + 2.000_r8*rxt(k,125)*y(k,99) end do end subroutine nlnmat05 subroutine nlnmat_finit( avec_len, mat, lmat, dti ) diff --git a/src/chemistry/pp_waccm_ma_mam5/mo_prod_loss.F90 b/src/chemistry/pp_waccm_ma_mam5/mo_prod_loss.F90 index 10c37c4a5d..4b90d14e1f 100644 --- a/src/chemistry/pp_waccm_ma_mam5/mo_prod_loss.F90 +++ b/src/chemistry/pp_waccm_ma_mam5/mo_prod_loss.F90 @@ -19,6 +19,17 @@ subroutine exp_prod_loss( ofl, ofu, prod, loss, y, & real(r8), intent(in) :: y(chnkpnts,gas_pcnst) real(r8), intent(in) :: rxt(chnkpnts,rxntot) real(r8), intent(in) :: het_rates(chnkpnts,gas_pcnst) +!-------------------------------------------------------------------- +! ... local variables +!-------------------------------------------------------------------- + integer :: k +!-------------------------------------------------------------------- +! ... loss and production for Explicit method +!-------------------------------------------------------------------- + do k = ofl,ofu + loss(k,1) = ( + het_rates(k,72))* y(k,72) + prod(k,1) = 0._r8 + end do end subroutine exp_prod_loss subroutine imp_prod_loss( avec_len, prod, loss, y, & rxt, het_rates ) @@ -46,16 +57,16 @@ subroutine imp_prod_loss( avec_len, prod, loss, y, & prod(k,1) = 0._r8 loss(k,2) = ( + het_rates(k,2))* y(k,2) prod(k,2) = 0._r8 - loss(k,97) = (rxt(k,191)* y(k,17) +rxt(k,193)* y(k,71) +rxt(k,192)* y(k,89) & + loss(k,97) = (rxt(k,191)* y(k,17) +rxt(k,193)* y(k,71) +rxt(k,192)* y(k,90) & + het_rates(k,3))* y(k,3) prod(k,97) = (rxt(k,27) +2.000_r8*rxt(k,194)*y(k,5) +rxt(k,195)*y(k,28) + & rxt(k,196)*y(k,28) +rxt(k,199)*y(k,61) +rxt(k,202)*y(k,69) + & - rxt(k,203)*y(k,98) +rxt(k,253)*y(k,78))*y(k,5) + (rxt(k,181)*y(k,9) + & + rxt(k,203)*y(k,99) +rxt(k,253)*y(k,79))*y(k,5) + (rxt(k,181)*y(k,9) + & rxt(k,207)*y(k,10) +3.000_r8*rxt(k,208)*y(k,24) + & 2.000_r8*rxt(k,209)*y(k,42) +rxt(k,210)*y(k,45) + & - 2.000_r8*rxt(k,230)*y(k,16) +rxt(k,231)*y(k,18))*y(k,94) & + 2.000_r8*rxt(k,230)*y(k,16) +rxt(k,231)*y(k,18))*y(k,95) & + (rxt(k,205)*y(k,45) +2.000_r8*rxt(k,219)*y(k,16) + & - rxt(k,221)*y(k,18) +3.000_r8*rxt(k,226)*y(k,24))*y(k,98) & + rxt(k,221)*y(k,18) +3.000_r8*rxt(k,226)*y(k,24))*y(k,99) & + (2.000_r8*rxt(k,218)*y(k,16) +rxt(k,220)*y(k,18) + & 3.000_r8*rxt(k,225)*y(k,24))*y(k,25) + (rxt(k,51) + & rxt(k,204)*y(k,69))*y(k,45) +rxt(k,26)*y(k,4) +rxt(k,29)*y(k,6) & @@ -67,78 +78,78 @@ subroutine imp_prod_loss( avec_len, prod, loss, y, & +rxt(k,197)*y(k,28)*y(k,5) loss(k,101) = (2._r8*rxt(k,194)* y(k,5) + (rxt(k,195) +rxt(k,196) + & rxt(k,197))* y(k,28) +rxt(k,199)* y(k,61) +rxt(k,200)* y(k,62) & - +rxt(k,202)* y(k,69) +rxt(k,253)* y(k,78) +rxt(k,198)* y(k,89) & - +rxt(k,203)* y(k,98) + rxt(k,27) + het_rates(k,5))* y(k,5) + +rxt(k,202)* y(k,69) +rxt(k,253)* y(k,79) +rxt(k,198)* y(k,90) & + +rxt(k,203)* y(k,99) + rxt(k,27) + het_rates(k,5))* y(k,5) prod(k,101) = (rxt(k,28) +rxt(k,201)*y(k,69))*y(k,6) +rxt(k,193)*y(k,71) & - *y(k,3) +rxt(k,211)*y(k,94)*y(k,45) +rxt(k,206)*y(k,69)*y(k,53) + *y(k,3) +rxt(k,211)*y(k,95)*y(k,45) +rxt(k,206)*y(k,69)*y(k,53) loss(k,62) = (rxt(k,201)* y(k,69) + rxt(k,28) + rxt(k,29) + rxt(k,269) & + rxt(k,272) + rxt(k,277) + het_rates(k,6))* y(k,6) prod(k,62) =rxt(k,200)*y(k,62)*y(k,5) loss(k,3) = ( + het_rates(k,7))* y(k,7) prod(k,3) = 0._r8 - loss(k,27) = (rxt(k,180)* y(k,94) + rxt(k,30) + het_rates(k,8))* y(k,8) + loss(k,27) = (rxt(k,180)* y(k,95) + rxt(k,30) + het_rates(k,8))* y(k,8) prod(k,27) = 0._r8 - loss(k,34) = (rxt(k,181)* y(k,94) + rxt(k,31) + het_rates(k,9))* y(k,9) + loss(k,34) = (rxt(k,181)* y(k,95) + rxt(k,31) + het_rates(k,9))* y(k,9) prod(k,34) = 0._r8 - loss(k,35) = (rxt(k,207)* y(k,94) + rxt(k,32) + het_rates(k,10))* y(k,10) + loss(k,35) = (rxt(k,207)* y(k,95) + rxt(k,32) + het_rates(k,10))* y(k,10) prod(k,35) = 0._r8 - loss(k,29) = (rxt(k,182)* y(k,94) + rxt(k,33) + het_rates(k,11))* y(k,11) + loss(k,29) = (rxt(k,182)* y(k,95) + rxt(k,33) + het_rates(k,11))* y(k,11) prod(k,29) = 0._r8 - loss(k,36) = (rxt(k,183)* y(k,94) + rxt(k,34) + het_rates(k,12))* y(k,12) + loss(k,36) = (rxt(k,183)* y(k,95) + rxt(k,34) + het_rates(k,12))* y(k,12) prod(k,36) = 0._r8 - loss(k,30) = (rxt(k,184)* y(k,94) + rxt(k,35) + het_rates(k,13))* y(k,13) + loss(k,30) = (rxt(k,184)* y(k,95) + rxt(k,35) + het_rates(k,13))* y(k,13) prod(k,30) = 0._r8 - loss(k,37) = (rxt(k,185)* y(k,94) + rxt(k,36) + het_rates(k,14))* y(k,14) + loss(k,37) = (rxt(k,185)* y(k,95) + rxt(k,36) + het_rates(k,14))* y(k,14) prod(k,37) = 0._r8 - loss(k,31) = (rxt(k,186)* y(k,94) + rxt(k,37) + het_rates(k,15))* y(k,15) + loss(k,31) = (rxt(k,186)* y(k,95) + rxt(k,37) + het_rates(k,15))* y(k,15) prod(k,31) = 0._r8 - loss(k,58) = (rxt(k,218)* y(k,25) +rxt(k,230)* y(k,94) +rxt(k,219)* y(k,98) & + loss(k,58) = (rxt(k,218)* y(k,25) +rxt(k,230)* y(k,95) +rxt(k,219)* y(k,99) & + rxt(k,38) + het_rates(k,16))* y(k,16) prod(k,58) = 0._r8 loss(k,86) = (rxt(k,191)* y(k,3) +rxt(k,155)* y(k,25) +rxt(k,235)* y(k,63) & - +rxt(k,236)* y(k,69) +rxt(k,237)* y(k,98) + rxt(k,20) + rxt(k,21) & + +rxt(k,236)* y(k,69) +rxt(k,237)* y(k,99) + rxt(k,20) + rxt(k,21) & + het_rates(k,17))* y(k,17) - prod(k,86) = (.180_r8*rxt(k,24) +rxt(k,243)*y(k,94) +rxt(k,244)*y(k,94)) & + prod(k,86) = (.180_r8*rxt(k,24) +rxt(k,243)*y(k,95) +rxt(k,244)*y(k,95)) & *y(k,23) + (rxt(k,162)*y(k,28) +rxt(k,239)*y(k,61))*y(k,21) & - + (rxt(k,22) +.300_r8*rxt(k,240)*y(k,98))*y(k,22) - loss(k,63) = (rxt(k,220)* y(k,25) +rxt(k,231)* y(k,94) +rxt(k,221)* y(k,98) & + + (rxt(k,22) +.300_r8*rxt(k,240)*y(k,99))*y(k,22) + loss(k,63) = (rxt(k,220)* y(k,25) +rxt(k,231)* y(k,95) +rxt(k,221)* y(k,99) & + rxt(k,39) + het_rates(k,18))* y(k,18) prod(k,63) = 0._r8 - loss(k,32) = (rxt(k,222)* y(k,98) + rxt(k,40) + het_rates(k,19))* y(k,19) + loss(k,32) = (rxt(k,222)* y(k,99) + rxt(k,40) + het_rates(k,19))* y(k,19) prod(k,32) = 0._r8 - loss(k,54) = (rxt(k,223)* y(k,25) +rxt(k,224)* y(k,98) + rxt(k,41) & + loss(k,54) = (rxt(k,223)* y(k,25) +rxt(k,224)* y(k,99) + rxt(k,41) & + het_rates(k,20))* y(k,20) prod(k,54) = 0._r8 - loss(k,82) = (rxt(k,162)* y(k,28) +rxt(k,239)* y(k,61) +rxt(k,238)* y(k,89) & + loss(k,82) = (rxt(k,162)* y(k,28) +rxt(k,239)* y(k,61) +rxt(k,238)* y(k,90) & + het_rates(k,21))* y(k,21) prod(k,82) = (rxt(k,23) +rxt(k,156)*y(k,25) +rxt(k,212)*y(k,39) + & - rxt(k,241)*y(k,98) +rxt(k,242)*y(k,94))*y(k,23) +rxt(k,39)*y(k,18) & - +rxt(k,41)*y(k,20) +.700_r8*rxt(k,240)*y(k,98)*y(k,22) - loss(k,55) = (rxt(k,240)* y(k,98) + rxt(k,22) + het_rates(k,22))* y(k,22) - prod(k,55) =rxt(k,238)*y(k,89)*y(k,21) + rxt(k,241)*y(k,99) +rxt(k,242)*y(k,95))*y(k,23) +rxt(k,39)*y(k,18) & + +rxt(k,41)*y(k,20) +.700_r8*rxt(k,240)*y(k,99)*y(k,22) + loss(k,55) = (rxt(k,240)* y(k,99) + rxt(k,22) + het_rates(k,22))* y(k,22) + prod(k,55) =rxt(k,238)*y(k,90)*y(k,21) loss(k,81) = (rxt(k,156)* y(k,25) +rxt(k,212)* y(k,39) + (rxt(k,242) + & - rxt(k,243) +rxt(k,244))* y(k,94) +rxt(k,241)* y(k,98) + rxt(k,23) & + rxt(k,243) +rxt(k,244))* y(k,95) +rxt(k,241)* y(k,99) + rxt(k,23) & + rxt(k,24) + het_rates(k,23))* y(k,23) prod(k,81) = 0._r8 - loss(k,56) = (rxt(k,225)* y(k,25) +rxt(k,208)* y(k,94) +rxt(k,226)* y(k,98) & + loss(k,56) = (rxt(k,225)* y(k,25) +rxt(k,208)* y(k,95) +rxt(k,226)* y(k,99) & + rxt(k,42) + het_rates(k,24))* y(k,24) prod(k,56) = 0._r8 loss(k,96) = (rxt(k,218)* y(k,16) +rxt(k,155)* y(k,17) +rxt(k,220)* y(k,18) & +rxt(k,223)* y(k,20) +rxt(k,156)* y(k,23) +rxt(k,225)* y(k,24) & +rxt(k,168)* y(k,29) +rxt(k,157)* y(k,41) +rxt(k,158)* y(k,43) & +rxt(k,177)* y(k,54) +rxt(k,161)* y(k,71) + (rxt(k,159) +rxt(k,160)) & - * y(k,89) + het_rates(k,25))* y(k,25) + * y(k,90) + het_rates(k,25))* y(k,25) prod(k,96) = (4.000_r8*rxt(k,180)*y(k,8) +rxt(k,181)*y(k,9) + & 2.000_r8*rxt(k,182)*y(k,11) +2.000_r8*rxt(k,183)*y(k,12) + & 2.000_r8*rxt(k,184)*y(k,13) +rxt(k,185)*y(k,14) + & 2.000_r8*rxt(k,186)*y(k,15) +rxt(k,187)*y(k,49) +rxt(k,217)*y(k,34) + & - rxt(k,232)*y(k,46) +rxt(k,233)*y(k,47) +rxt(k,234)*y(k,48))*y(k,94) & + rxt(k,232)*y(k,46) +rxt(k,233)*y(k,47) +rxt(k,234)*y(k,48))*y(k,95) & + (rxt(k,45) +rxt(k,162)*y(k,21) +2.000_r8*rxt(k,163)*y(k,28) + & rxt(k,165)*y(k,28) +rxt(k,167)*y(k,61) +rxt(k,172)*y(k,69) + & - rxt(k,173)*y(k,98) +rxt(k,196)*y(k,5) +rxt(k,254)*y(k,78))*y(k,28) & + rxt(k,173)*y(k,99) +rxt(k,196)*y(k,5) +rxt(k,254)*y(k,79))*y(k,28) & + (rxt(k,176)*y(k,49) +3.000_r8*rxt(k,222)*y(k,19) + & rxt(k,224)*y(k,20) +rxt(k,227)*y(k,46) +rxt(k,228)*y(k,47) + & - rxt(k,229)*y(k,48))*y(k,98) + (rxt(k,55) +rxt(k,175)*y(k,69))*y(k,49) & + rxt(k,229)*y(k,48))*y(k,99) + (rxt(k,55) +rxt(k,175)*y(k,69))*y(k,49) & +rxt(k,26)*y(k,4) +4.000_r8*rxt(k,30)*y(k,8) +rxt(k,31)*y(k,9) & +2.000_r8*rxt(k,33)*y(k,11) +2.000_r8*rxt(k,34)*y(k,12) & +2.000_r8*rxt(k,35)*y(k,13) +rxt(k,36)*y(k,14) +2.000_r8*rxt(k,37) & @@ -155,43 +166,43 @@ subroutine imp_prod_loss( avec_len, prod, loss, y, & loss(k,91) = ((rxt(k,195) +rxt(k,196) +rxt(k,197))* y(k,5) +rxt(k,162) & * y(k,21) + 2._r8*(rxt(k,163) +rxt(k,164) +rxt(k,165) +rxt(k,189)) & * y(k,28) +rxt(k,167)* y(k,61) +rxt(k,169)* y(k,62) +rxt(k,172) & - * y(k,69) +rxt(k,254)* y(k,78) +rxt(k,166)* y(k,89) + (rxt(k,173) + & - rxt(k,174))* y(k,98) + rxt(k,45) + het_rates(k,28))* y(k,28) - prod(k,91) = (rxt(k,160)*y(k,89) +rxt(k,161)*y(k,71) +rxt(k,177)*y(k,54)) & + * y(k,69) +rxt(k,254)* y(k,79) +rxt(k,166)* y(k,90) + (rxt(k,173) + & + rxt(k,174))* y(k,99) + rxt(k,45) + het_rates(k,28))* y(k,28) + prod(k,91) = (rxt(k,160)*y(k,90) +rxt(k,161)*y(k,71) +rxt(k,177)*y(k,54)) & *y(k,25) + (rxt(k,47) +rxt(k,170)*y(k,69))*y(k,29) & - + (rxt(k,178)*y(k,69) +rxt(k,179)*y(k,98))*y(k,54) + (rxt(k,59) + & - rxt(k,259)*y(k,78))*y(k,72) +2.000_r8*rxt(k,190)*y(k,27) & - +rxt(k,188)*y(k,94)*y(k,49) + + (rxt(k,178)*y(k,69) +rxt(k,179)*y(k,99))*y(k,54) + (rxt(k,59) + & + rxt(k,259)*y(k,79))*y(k,73) +2.000_r8*rxt(k,190)*y(k,27) & + +rxt(k,188)*y(k,95)*y(k,49) loss(k,75) = (rxt(k,168)* y(k,25) + (rxt(k,273) +rxt(k,278) +rxt(k,283)) & - * y(k,49) +rxt(k,170)* y(k,69) +rxt(k,171)* y(k,98) + rxt(k,46) & + * y(k,49) +rxt(k,170)* y(k,69) +rxt(k,171)* y(k,99) + rxt(k,46) & + rxt(k,47) + rxt(k,271) + rxt(k,276) + rxt(k,282) & + het_rates(k,29))* y(k,29) prod(k,75) =rxt(k,169)*y(k,62)*y(k,28) loss(k,4) = ( + het_rates(k,30))* y(k,30) prod(k,4) = 0._r8 - loss(k,72) = (rxt(k,245)* y(k,98) + het_rates(k,31))* y(k,31) + loss(k,72) = (rxt(k,245)* y(k,99) + het_rates(k,31))* y(k,31) prod(k,72) = (rxt(k,20) +rxt(k,21) +rxt(k,155)*y(k,25) +rxt(k,191)*y(k,3) + & - rxt(k,235)*y(k,63) +rxt(k,236)*y(k,69) +rxt(k,237)*y(k,98))*y(k,17) & - + (rxt(k,25) +rxt(k,61) +rxt(k,299)*y(k,99))*y(k,32) + (rxt(k,88) + & - rxt(k,248)*y(k,69) +rxt(k,249)*y(k,98))*y(k,73) +rxt(k,223)*y(k,25) & + rxt(k,235)*y(k,63) +rxt(k,236)*y(k,69) +rxt(k,237)*y(k,99))*y(k,17) & + + (rxt(k,25) +rxt(k,61) +rxt(k,299)*y(k,100))*y(k,32) + (rxt(k,88) + & + rxt(k,248)*y(k,69) +rxt(k,249)*y(k,99))*y(k,74) +rxt(k,223)*y(k,25) & *y(k,20) +.380_r8*rxt(k,24)*y(k,23) - loss(k,61) = (rxt(k,299)* y(k,99) + rxt(k,25) + rxt(k,61) + het_rates(k,32)) & + loss(k,61) = (rxt(k,299)* y(k,100) + rxt(k,25) + rxt(k,61) + het_rates(k,32)) & * y(k,32) - prod(k,61) =.440_r8*rxt(k,24)*y(k,23) +rxt(k,245)*y(k,98)*y(k,31) - loss(k,41) = (rxt(k,216)* y(k,94) + rxt(k,48) + het_rates(k,33))* y(k,33) + prod(k,61) =.440_r8*rxt(k,24)*y(k,23) +rxt(k,245)*y(k,99)*y(k,31) + loss(k,41) = (rxt(k,216)* y(k,95) + rxt(k,48) + het_rates(k,33))* y(k,33) prod(k,41) = (rxt(k,181)*y(k,9) +rxt(k,183)*y(k,12) + & 2.000_r8*rxt(k,184)*y(k,13) +2.000_r8*rxt(k,185)*y(k,14) + & rxt(k,186)*y(k,15) +rxt(k,207)*y(k,10) +2.000_r8*rxt(k,209)*y(k,42) + & - rxt(k,233)*y(k,47) +rxt(k,234)*y(k,48))*y(k,94) + (rxt(k,53) + & - rxt(k,228)*y(k,98))*y(k,47) + (rxt(k,54) +rxt(k,229)*y(k,98))*y(k,48) & + rxt(k,233)*y(k,47) +rxt(k,234)*y(k,48))*y(k,95) + (rxt(k,53) + & + rxt(k,228)*y(k,99))*y(k,47) + (rxt(k,54) +rxt(k,229)*y(k,99))*y(k,48) & +rxt(k,31)*y(k,9) +rxt(k,32)*y(k,10) +rxt(k,34)*y(k,12) & +2.000_r8*rxt(k,35)*y(k,13) +2.000_r8*rxt(k,36)*y(k,14) +rxt(k,37) & *y(k,15) +2.000_r8*rxt(k,50)*y(k,42) - loss(k,43) = (rxt(k,217)* y(k,94) + rxt(k,49) + het_rates(k,34))* y(k,34) - prod(k,43) = (rxt(k,52) +rxt(k,227)*y(k,98) +rxt(k,232)*y(k,94))*y(k,46) & - + (rxt(k,33) +rxt(k,182)*y(k,94))*y(k,11) + (rxt(k,34) + & - rxt(k,183)*y(k,94))*y(k,12) - loss(k,51) = (rxt(k,246)* y(k,63) + (rxt(k,247) +rxt(k,261))* y(k,98) & + loss(k,43) = (rxt(k,217)* y(k,95) + rxt(k,49) + het_rates(k,34))* y(k,34) + prod(k,43) = (rxt(k,52) +rxt(k,227)*y(k,99) +rxt(k,232)*y(k,95))*y(k,46) & + + (rxt(k,33) +rxt(k,182)*y(k,95))*y(k,11) + (rxt(k,34) + & + rxt(k,183)*y(k,95))*y(k,12) + loss(k,51) = (rxt(k,246)* y(k,63) + (rxt(k,247) +rxt(k,261))* y(k,99) & + het_rates(k,35))* y(k,35) prod(k,51) = 0._r8 loss(k,5) = ( + het_rates(k,36))* y(k,36) @@ -201,83 +212,83 @@ subroutine imp_prod_loss( avec_len, prod, loss, y, & loss(k,7) = ( + het_rates(k,38))* y(k,38) prod(k,7) = 0._r8 loss(k,73) = (rxt(k,212)* y(k,23) +rxt(k,213)* y(k,41) +rxt(k,215)* y(k,51) & - +rxt(k,214)* y(k,102) + het_rates(k,39))* y(k,39) + +rxt(k,214)* y(k,103) + het_rates(k,39))* y(k,39) prod(k,73) = (rxt(k,185)*y(k,14) +rxt(k,207)*y(k,10) + & - 2.000_r8*rxt(k,216)*y(k,33) +rxt(k,217)*y(k,34))*y(k,94) +rxt(k,32) & + 2.000_r8*rxt(k,216)*y(k,33) +rxt(k,217)*y(k,34))*y(k,95) +rxt(k,32) & *y(k,10) +rxt(k,36)*y(k,14) +2.000_r8*rxt(k,48)*y(k,33) +rxt(k,49) & *y(k,34) +rxt(k,56)*y(k,50) loss(k,84) = (rxt(k,116)* y(k,70) +rxt(k,119)* y(k,71) + (rxt(k,113) + & - rxt(k,114) +rxt(k,115))* y(k,89) + het_rates(k,40))* y(k,40) + rxt(k,114) +rxt(k,115))* y(k,90) + het_rates(k,40))* y(k,40) prod(k,84) = (rxt(k,120)*y(k,41) +rxt(k,123)*y(k,69) +rxt(k,143)*y(k,55) + & - rxt(k,237)*y(k,17) +rxt(k,249)*y(k,73) +rxt(k,255)*y(k,76) + & - rxt(k,260)*y(k,78))*y(k,98) + (rxt(k,94)*y(k,94) + & + rxt(k,237)*y(k,17) +rxt(k,249)*y(k,74) +rxt(k,255)*y(k,77) + & + rxt(k,260)*y(k,79))*y(k,99) + (rxt(k,94)*y(k,95) + & rxt(k,111)*y(k,69) +rxt(k,157)*y(k,25) +rxt(k,213)*y(k,39))*y(k,41) & - + (rxt(k,23) +.330_r8*rxt(k,24) +rxt(k,243)*y(k,94))*y(k,23) & - + (rxt(k,51) +rxt(k,211)*y(k,94))*y(k,45) + (rxt(k,55) + & - rxt(k,188)*y(k,94))*y(k,49) + (2.000_r8*rxt(k,2) +rxt(k,3))*y(k,102) & + + (rxt(k,23) +.330_r8*rxt(k,24) +rxt(k,243)*y(k,95))*y(k,23) & + + (rxt(k,51) +rxt(k,211)*y(k,95))*y(k,45) + (rxt(k,55) + & + rxt(k,188)*y(k,95))*y(k,49) + (2.000_r8*rxt(k,2) +rxt(k,3))*y(k,103) & +2.000_r8*rxt(k,20)*y(k,17) +rxt(k,22)*y(k,22) +rxt(k,56)*y(k,50) loss(k,99) = (rxt(k,157)* y(k,25) +rxt(k,213)* y(k,39) +rxt(k,111)* y(k,69) & - +rxt(k,94)* y(k,94) +rxt(k,120)* y(k,98) + het_rates(k,41))* y(k,41) - prod(k,99) = (1.440_r8*rxt(k,24) +rxt(k,244)*y(k,94))*y(k,23) +rxt(k,21) & - *y(k,17) +rxt(k,113)*y(k,89)*y(k,40) +rxt(k,1)*y(k,102) - loss(k,28) = (rxt(k,209)* y(k,94) + rxt(k,50) + het_rates(k,42))* y(k,42) + +rxt(k,94)* y(k,95) +rxt(k,120)* y(k,99) + het_rates(k,41))* y(k,41) + prod(k,99) = (1.440_r8*rxt(k,24) +rxt(k,244)*y(k,95))*y(k,23) +rxt(k,21) & + *y(k,17) +rxt(k,113)*y(k,90)*y(k,40) +rxt(k,1)*y(k,103) + loss(k,28) = (rxt(k,209)* y(k,95) + rxt(k,50) + het_rates(k,42))* y(k,42) prod(k,28) = 0._r8 - loss(k,65) = (rxt(k,158)* y(k,25) +rxt(k,112)* y(k,69) +rxt(k,121)* y(k,98) & + loss(k,65) = (rxt(k,158)* y(k,25) +rxt(k,112)* y(k,69) +rxt(k,121)* y(k,99) & + rxt(k,4) + het_rates(k,43))* y(k,43) - prod(k,65) = (.500_r8*rxt(k,263) +rxt(k,127)*y(k,89))*y(k,89) & - +rxt(k,126)*y(k,98)*y(k,98) + prod(k,65) = (.500_r8*rxt(k,263) +rxt(k,127)*y(k,90))*y(k,90) & + +rxt(k,126)*y(k,99)*y(k,99) loss(k,33) = ( + rxt(k,87) + het_rates(k,44))* y(k,44) - prod(k,33) =rxt(k,262)*y(k,102)*y(k,80) - loss(k,69) = (rxt(k,204)* y(k,69) + (rxt(k,210) +rxt(k,211))* y(k,94) & - +rxt(k,205)* y(k,98) + rxt(k,51) + het_rates(k,45))* y(k,45) - prod(k,69) = (rxt(k,191)*y(k,17) +rxt(k,192)*y(k,89))*y(k,3) - loss(k,42) = (rxt(k,232)* y(k,94) +rxt(k,227)* y(k,98) + rxt(k,52) & + prod(k,33) =rxt(k,262)*y(k,103)*y(k,81) + loss(k,69) = (rxt(k,204)* y(k,69) + (rxt(k,210) +rxt(k,211))* y(k,95) & + +rxt(k,205)* y(k,99) + rxt(k,51) + het_rates(k,45))* y(k,45) + prod(k,69) = (rxt(k,191)*y(k,17) +rxt(k,192)*y(k,90))*y(k,3) + loss(k,42) = (rxt(k,232)* y(k,95) +rxt(k,227)* y(k,99) + rxt(k,52) & + het_rates(k,46))* y(k,46) prod(k,42) = 0._r8 - loss(k,44) = (rxt(k,233)* y(k,94) +rxt(k,228)* y(k,98) + rxt(k,53) & + loss(k,44) = (rxt(k,233)* y(k,95) +rxt(k,228)* y(k,99) + rxt(k,53) & + het_rates(k,47))* y(k,47) prod(k,44) = 0._r8 - loss(k,48) = (rxt(k,234)* y(k,94) +rxt(k,229)* y(k,98) + rxt(k,54) & + loss(k,48) = (rxt(k,234)* y(k,95) +rxt(k,229)* y(k,99) + rxt(k,54) & + het_rates(k,48))* y(k,48) prod(k,48) = 0._r8 loss(k,85) = ((rxt(k,273) +rxt(k,278) +rxt(k,283))* y(k,29) + (rxt(k,275) + & rxt(k,280))* y(k,53) + (rxt(k,268) +rxt(k,274) +rxt(k,279))* y(k,54) & - +rxt(k,175)* y(k,69) + (rxt(k,187) +rxt(k,188))* y(k,94) +rxt(k,176) & - * y(k,98) + rxt(k,55) + het_rates(k,49))* y(k,49) + +rxt(k,175)* y(k,69) + (rxt(k,187) +rxt(k,188))* y(k,95) +rxt(k,176) & + * y(k,99) + rxt(k,55) + het_rates(k,49))* y(k,49) prod(k,85) = (rxt(k,155)*y(k,17) +rxt(k,156)*y(k,23) +rxt(k,157)*y(k,41) + & - rxt(k,158)*y(k,43) +rxt(k,159)*y(k,89) +rxt(k,177)*y(k,54) + & + rxt(k,158)*y(k,43) +rxt(k,159)*y(k,90) +rxt(k,177)*y(k,54) + & rxt(k,218)*y(k,16) +rxt(k,220)*y(k,18) +2.000_r8*rxt(k,223)*y(k,20) + & - rxt(k,225)*y(k,24))*y(k,25) +rxt(k,174)*y(k,98)*y(k,28) + rxt(k,225)*y(k,24))*y(k,25) +rxt(k,174)*y(k,99)*y(k,28) loss(k,49) = ( + rxt(k,56) + het_rates(k,50))* y(k,50) - prod(k,49) = (rxt(k,212)*y(k,23) +rxt(k,213)*y(k,41) +rxt(k,214)*y(k,102) + & + prod(k,49) = (rxt(k,212)*y(k,23) +rxt(k,213)*y(k,41) +rxt(k,214)*y(k,103) + & rxt(k,215)*y(k,51))*y(k,39) - loss(k,100) = (rxt(k,215)* y(k,39) +rxt(k,152)* y(k,98) + rxt(k,9) & + loss(k,100) = (rxt(k,215)* y(k,39) +rxt(k,152)* y(k,99) + rxt(k,9) & + het_rates(k,51))* y(k,51) prod(k,100) = (rxt(k,271) +rxt(k,276) +rxt(k,282) +rxt(k,273)*y(k,49) + & rxt(k,278)*y(k,49) +rxt(k,283)*y(k,49))*y(k,29) & + (2.000_r8*rxt(k,264) +2.000_r8*rxt(k,267) +2.000_r8*rxt(k,270) + & 2.000_r8*rxt(k,281))*y(k,57) + (rxt(k,269) +rxt(k,272) +rxt(k,277)) & *y(k,6) + (rxt(k,266) +rxt(k,235)*y(k,17) +rxt(k,246)*y(k,35)) & - *y(k,63) + (.500_r8*rxt(k,265) +rxt(k,151)*y(k,98))*y(k,62) - loss(k,57) = (rxt(k,128)* y(k,98) + rxt(k,10) + rxt(k,11) + rxt(k,153) & + *y(k,63) + (.500_r8*rxt(k,265) +rxt(k,151)*y(k,99))*y(k,62) + loss(k,57) = (rxt(k,128)* y(k,99) + rxt(k,10) + rxt(k,11) + rxt(k,153) & + het_rates(k,52))* y(k,52) - prod(k,57) =rxt(k,149)*y(k,89)*y(k,62) + prod(k,57) =rxt(k,149)*y(k,90)*y(k,62) loss(k,68) = ((rxt(k,275) +rxt(k,280))* y(k,49) +rxt(k,206)* y(k,69) & + rxt(k,57) + het_rates(k,53))* y(k,53) - prod(k,68) = (rxt(k,269) +rxt(k,272) +rxt(k,277))*y(k,6) +rxt(k,198)*y(k,89) & + prod(k,68) = (rxt(k,269) +rxt(k,272) +rxt(k,277))*y(k,6) +rxt(k,198)*y(k,90) & *y(k,5) loss(k,70) = (rxt(k,177)* y(k,25) + (rxt(k,268) +rxt(k,274) +rxt(k,279)) & - * y(k,49) +rxt(k,178)* y(k,69) +rxt(k,179)* y(k,98) + rxt(k,58) & + * y(k,49) +rxt(k,178)* y(k,69) +rxt(k,179)* y(k,99) + rxt(k,58) & + het_rates(k,54))* y(k,54) - prod(k,70) = (rxt(k,271) +rxt(k,276) +rxt(k,282) +rxt(k,171)*y(k,98))*y(k,29) & - +rxt(k,166)*y(k,89)*y(k,28) + prod(k,70) = (rxt(k,271) +rxt(k,276) +rxt(k,282) +rxt(k,171)*y(k,99))*y(k,29) & + +rxt(k,166)*y(k,90)*y(k,28) loss(k,78) = (rxt(k,131)* y(k,61) + (rxt(k,132) +rxt(k,133) +rxt(k,134)) & - * y(k,62) +rxt(k,135)* y(k,70) +rxt(k,296)* y(k,97) +rxt(k,143) & - * y(k,98) + rxt(k,62) + het_rates(k,55))* y(k,55) - prod(k,78) = (rxt(k,129)*y(k,90) +rxt(k,293)*y(k,93))*y(k,69) & - + (.200_r8*rxt(k,287)*y(k,92) +1.100_r8*rxt(k,289)*y(k,91))*y(k,88) & - +rxt(k,15)*y(k,61) +rxt(k,294)*y(k,93)*y(k,70) +rxt(k,300)*y(k,99) - loss(k,46) = ((rxt(k,147) +rxt(k,148))* y(k,94) + rxt(k,12) & + * y(k,62) +rxt(k,135)* y(k,70) +rxt(k,296)* y(k,98) +rxt(k,143) & + * y(k,99) + rxt(k,62) + het_rates(k,55))* y(k,55) + prod(k,78) = (rxt(k,129)*y(k,91) +rxt(k,293)*y(k,94))*y(k,69) & + + (.200_r8*rxt(k,287)*y(k,93) +1.100_r8*rxt(k,289)*y(k,92))*y(k,89) & + +rxt(k,15)*y(k,61) +rxt(k,294)*y(k,94)*y(k,70) +rxt(k,300)*y(k,100) + loss(k,46) = ((rxt(k,147) +rxt(k,148))* y(k,95) + rxt(k,12) & + het_rates(k,56))* y(k,56) prod(k,46) =rxt(k,132)*y(k,62)*y(k,55) loss(k,50) = ( + rxt(k,13) + rxt(k,14) + rxt(k,154) + rxt(k,264) + rxt(k,267) & @@ -291,34 +302,34 @@ subroutine imp_prod_loss( avec_len, prod, loss, y, & prod(k,10) = 0._r8 loss(k,95) = (rxt(k,199)* y(k,5) +rxt(k,239)* y(k,21) +rxt(k,167)* y(k,28) & +rxt(k,131)* y(k,55) +rxt(k,140)* y(k,63) +rxt(k,146)* y(k,69) & - +rxt(k,145)* y(k,71) +rxt(k,144)* y(k,89) +rxt(k,298)* y(k,97) & + +rxt(k,145)* y(k,71) +rxt(k,144)* y(k,90) +rxt(k,298)* y(k,98) & + rxt(k,15) + rxt(k,16) + het_rates(k,61))* y(k,61) prod(k,95) = (rxt(k,17) +.500_r8*rxt(k,265) +2.000_r8*rxt(k,133)*y(k,55) + & - rxt(k,136)*y(k,69) +rxt(k,256)*y(k,78))*y(k,62) & - + (rxt(k,135)*y(k,70) +rxt(k,143)*y(k,98))*y(k,55) & - +2.000_r8*rxt(k,147)*y(k,94)*y(k,56) +rxt(k,14)*y(k,57) +rxt(k,19) & - *y(k,63) +rxt(k,130)*y(k,90)*y(k,70) +rxt(k,297)*y(k,97) +rxt(k,310) & - *y(k,101) + rxt(k,136)*y(k,69) +rxt(k,256)*y(k,79))*y(k,62) & + + (rxt(k,135)*y(k,70) +rxt(k,143)*y(k,99))*y(k,55) & + +2.000_r8*rxt(k,147)*y(k,95)*y(k,56) +rxt(k,14)*y(k,57) +rxt(k,19) & + *y(k,63) +rxt(k,130)*y(k,91)*y(k,70) +rxt(k,297)*y(k,98) +rxt(k,310) & + *y(k,102) loss(k,92) = (rxt(k,200)* y(k,5) +rxt(k,169)* y(k,28) + (rxt(k,132) + & rxt(k,133) +rxt(k,134))* y(k,55) +rxt(k,150)* y(k,63) + (rxt(k,136) + & - rxt(k,138))* y(k,69) +rxt(k,137)* y(k,71) +rxt(k,256)* y(k,78) & - +rxt(k,149)* y(k,89) +rxt(k,151)* y(k,98) + rxt(k,17) + rxt(k,265) & + rxt(k,138))* y(k,69) +rxt(k,137)* y(k,71) +rxt(k,256)* y(k,79) & + +rxt(k,149)* y(k,90) +rxt(k,151)* y(k,99) + rxt(k,17) + rxt(k,265) & + het_rates(k,62))* y(k,62) - prod(k,92) = (2.000_r8*rxt(k,140)*y(k,63) +rxt(k,144)*y(k,89) + & + prod(k,92) = (2.000_r8*rxt(k,140)*y(k,63) +rxt(k,144)*y(k,90) + & rxt(k,145)*y(k,71) +rxt(k,146)*y(k,69) +rxt(k,167)*y(k,28) + & rxt(k,199)*y(k,5) +rxt(k,239)*y(k,21))*y(k,61) + (rxt(k,18) + & - rxt(k,139)*y(k,89) +rxt(k,141)*y(k,69) +rxt(k,142)*y(k,98))*y(k,63) & - + (rxt(k,11) +rxt(k,153) +rxt(k,128)*y(k,98))*y(k,52) + (rxt(k,13) + & + rxt(k,139)*y(k,90) +rxt(k,141)*y(k,69) +rxt(k,142)*y(k,99))*y(k,63) & + + (rxt(k,11) +rxt(k,153) +rxt(k,128)*y(k,99))*y(k,52) + (rxt(k,13) + & rxt(k,154))*y(k,57) +rxt(k,28)*y(k,6) +rxt(k,47)*y(k,29) +rxt(k,9) & *y(k,51) loss(k,90) = (rxt(k,235)* y(k,17) +rxt(k,246)* y(k,35) +rxt(k,140)* y(k,61) & - +rxt(k,150)* y(k,62) +rxt(k,141)* y(k,69) +rxt(k,139)* y(k,89) & - +rxt(k,142)* y(k,98) + rxt(k,18) + rxt(k,19) + rxt(k,266) & + +rxt(k,150)* y(k,62) +rxt(k,141)* y(k,69) +rxt(k,139)* y(k,90) & + +rxt(k,142)* y(k,99) + rxt(k,18) + rxt(k,19) + rxt(k,266) & + het_rates(k,63))* y(k,63) prod(k,90) = (rxt(k,46) +rxt(k,168)*y(k,25) +rxt(k,170)*y(k,69) + & - rxt(k,171)*y(k,98))*y(k,29) + (rxt(k,13) +rxt(k,14) +rxt(k,154)) & + rxt(k,171)*y(k,99))*y(k,29) + (rxt(k,13) +rxt(k,14) +rxt(k,154)) & *y(k,57) + (rxt(k,29) +rxt(k,201)*y(k,69))*y(k,6) & - + (rxt(k,152)*y(k,98) +rxt(k,215)*y(k,39))*y(k,51) & + + (rxt(k,152)*y(k,99) +rxt(k,215)*y(k,39))*y(k,51) & + (rxt(k,137)*y(k,71) +rxt(k,138)*y(k,69))*y(k,62) +rxt(k,10) & *y(k,52) loss(k,11) = ( + het_rates(k,64))* y(k,64) @@ -337,97 +348,97 @@ subroutine imp_prod_loss( avec_len, prod, loss, y, & +rxt(k,206)* y(k,53) +rxt(k,178)* y(k,54) +rxt(k,146)* y(k,61) & + (rxt(k,136) +rxt(k,138))* y(k,62) +rxt(k,141)* y(k,63) & + 2._r8*rxt(k,109)* y(k,69) +rxt(k,110)* y(k,70) +rxt(k,108) & - * y(k,71) +rxt(k,248)* y(k,73) +rxt(k,117)* y(k,89) + (rxt(k,291) + & - rxt(k,292))* y(k,91) +rxt(k,293)* y(k,93) +rxt(k,123)* y(k,98) & + * y(k,71) +rxt(k,248)* y(k,74) +rxt(k,117)* y(k,90) + (rxt(k,291) + & + rxt(k,292))* y(k,92) +rxt(k,293)* y(k,94) +rxt(k,123)* y(k,99) & + rxt(k,71) + rxt(k,72) + rxt(k,73) + rxt(k,74) + rxt(k,75) & + rxt(k,76) + het_rates(k,69))* y(k,69) prod(k,93) = (2.000_r8*rxt(k,5) +rxt(k,6) +rxt(k,77) +rxt(k,79) +rxt(k,81) + & 2.000_r8*rxt(k,82) +2.000_r8*rxt(k,83) +rxt(k,84) +rxt(k,85) + & - rxt(k,86) +rxt(k,97)*y(k,94) +rxt(k,98)*y(k,94) +rxt(k,135)*y(k,55) + & - rxt(k,250)*y(k,76) +rxt(k,257)*y(k,78) +rxt(k,295)*y(k,93) + & - rxt(k,302)*y(k,99) +rxt(k,306)*y(k,100))*y(k,70) & - + (rxt(k,131)*y(k,61) +rxt(k,132)*y(k,62) +rxt(k,296)*y(k,97)) & - *y(k,55) + (rxt(k,25) +rxt(k,61))*y(k,32) + (rxt(k,287)*y(k,92) + & - 1.150_r8*rxt(k,288)*y(k,97))*y(k,88) +rxt(k,27)*y(k,5) & - +.180_r8*rxt(k,24)*y(k,23) +rxt(k,45)*y(k,28) +rxt(k,115)*y(k,89) & + rxt(k,86) +rxt(k,97)*y(k,95) +rxt(k,98)*y(k,95) +rxt(k,135)*y(k,55) + & + rxt(k,250)*y(k,77) +rxt(k,257)*y(k,79) +rxt(k,295)*y(k,94) + & + rxt(k,302)*y(k,100) +rxt(k,306)*y(k,101))*y(k,70) & + + (rxt(k,131)*y(k,61) +rxt(k,132)*y(k,62) +rxt(k,296)*y(k,98)) & + *y(k,55) + (rxt(k,25) +rxt(k,61))*y(k,32) + (rxt(k,287)*y(k,93) + & + 1.150_r8*rxt(k,288)*y(k,98))*y(k,89) +rxt(k,27)*y(k,5) & + +.180_r8*rxt(k,24)*y(k,23) +rxt(k,45)*y(k,28) +rxt(k,115)*y(k,90) & *y(k,40) +rxt(k,14)*y(k,57) +rxt(k,15)*y(k,61) +rxt(k,17)*y(k,62) & - +rxt(k,18)*y(k,63) +rxt(k,8)*y(k,71) +rxt(k,59)*y(k,72) +rxt(k,89) & - *y(k,78) +rxt(k,90)*y(k,79) +rxt(k,91)*y(k,80) +rxt(k,301)*y(k,99) & - *y(k,90) +rxt(k,96)*y(k,94) +rxt(k,125)*y(k,98)*y(k,98) +rxt(k,304) & - *y(k,100) +rxt(k,309)*y(k,101) +rxt(k,2)*y(k,102) + +rxt(k,18)*y(k,63) +rxt(k,8)*y(k,71) +rxt(k,59)*y(k,73) +rxt(k,89) & + *y(k,79) +rxt(k,90)*y(k,80) +rxt(k,91)*y(k,81) +rxt(k,301)*y(k,100) & + *y(k,91) +rxt(k,96)*y(k,95) +rxt(k,125)*y(k,99)*y(k,99) +rxt(k,304) & + *y(k,101) +rxt(k,309)*y(k,102) +rxt(k,2)*y(k,103) loss(k,87) = (rxt(k,116)* y(k,40) +rxt(k,135)* y(k,55) +rxt(k,110)* y(k,69) & - +rxt(k,250)* y(k,76) +rxt(k,257)* y(k,78) +rxt(k,130)* y(k,90) & - +rxt(k,290)* y(k,91) + (rxt(k,294) +rxt(k,295))* y(k,93) +rxt(k,97) & - * y(k,94) +rxt(k,102)* y(k,95) +rxt(k,302)* y(k,99) +rxt(k,306) & - * y(k,100) + rxt(k,5) + rxt(k,6) + rxt(k,77) + rxt(k,78) + rxt(k,79) & + +rxt(k,250)* y(k,77) +rxt(k,257)* y(k,79) +rxt(k,130)* y(k,91) & + +rxt(k,290)* y(k,92) + (rxt(k,294) +rxt(k,295))* y(k,94) +rxt(k,97) & + * y(k,95) +rxt(k,102)* y(k,96) +rxt(k,302)* y(k,100) +rxt(k,306) & + * y(k,101) + rxt(k,5) + rxt(k,6) + rxt(k,77) + rxt(k,78) + rxt(k,79) & + rxt(k,80) + rxt(k,81) + rxt(k,82) + rxt(k,83) + rxt(k,84) & + rxt(k,85) + rxt(k,86) + het_rates(k,70))* y(k,70) - prod(k,87) = (rxt(k,8) +2.000_r8*rxt(k,99)*y(k,94) + & - 2.000_r8*rxt(k,108)*y(k,69) +2.000_r8*rxt(k,118)*y(k,89) + & - rxt(k,119)*y(k,40) +rxt(k,124)*y(k,98) +rxt(k,137)*y(k,62) + & + prod(k,87) = (rxt(k,8) +2.000_r8*rxt(k,99)*y(k,95) + & + 2.000_r8*rxt(k,108)*y(k,69) +2.000_r8*rxt(k,118)*y(k,90) + & + rxt(k,119)*y(k,40) +rxt(k,124)*y(k,99) +rxt(k,137)*y(k,62) + & rxt(k,145)*y(k,61) +rxt(k,161)*y(k,25) +rxt(k,193)*y(k,3) + & - rxt(k,252)*y(k,76) +rxt(k,258)*y(k,78))*y(k,71) & - + (rxt(k,113)*y(k,40) +rxt(k,117)*y(k,69) +rxt(k,122)*y(k,98) + & - rxt(k,127)*y(k,89) +rxt(k,139)*y(k,63) +rxt(k,159)*y(k,25) + & + rxt(k,252)*y(k,77) +rxt(k,258)*y(k,79))*y(k,71) & + + (rxt(k,113)*y(k,40) +rxt(k,117)*y(k,69) +rxt(k,122)*y(k,99) + & + rxt(k,127)*y(k,90) +rxt(k,139)*y(k,63) +rxt(k,159)*y(k,25) + & rxt(k,166)*y(k,28) +rxt(k,192)*y(k,3) +rxt(k,198)*y(k,5) + & - rxt(k,238)*y(k,21))*y(k,89) + (rxt(k,101)*y(k,95) + & - rxt(k,109)*y(k,69) +rxt(k,123)*y(k,98) +rxt(k,136)*y(k,62) + & + rxt(k,238)*y(k,21))*y(k,90) + (rxt(k,101)*y(k,96) + & + rxt(k,109)*y(k,69) +rxt(k,123)*y(k,99) +rxt(k,136)*y(k,62) + & rxt(k,141)*y(k,63) +rxt(k,172)*y(k,28) +rxt(k,202)*y(k,5))*y(k,69) & - + (rxt(k,163)*y(k,28) +rxt(k,164)*y(k,28) +rxt(k,174)*y(k,98) + & + + (rxt(k,163)*y(k,28) +rxt(k,164)*y(k,28) +rxt(k,174)*y(k,99) + & rxt(k,196)*y(k,5) +rxt(k,197)*y(k,5))*y(k,28) + (rxt(k,92) + & - rxt(k,100) +2.000_r8*rxt(k,102)*y(k,70))*y(k,95) +rxt(k,194)*y(k,5) & - *y(k,5) +rxt(k,128)*y(k,98)*y(k,52) +rxt(k,134)*y(k,62)*y(k,55) & - +rxt(k,148)*y(k,94)*y(k,56) +rxt(k,298)*y(k,97)*y(k,61) +rxt(k,19) & - *y(k,63) +rxt(k,93)*y(k,96) + rxt(k,100) +2.000_r8*rxt(k,102)*y(k,70))*y(k,96) +rxt(k,194)*y(k,5) & + *y(k,5) +rxt(k,128)*y(k,99)*y(k,52) +rxt(k,134)*y(k,62)*y(k,55) & + +rxt(k,148)*y(k,95)*y(k,56) +rxt(k,298)*y(k,98)*y(k,61) +rxt(k,19) & + *y(k,63) +rxt(k,93)*y(k,97) loss(k,88) = (rxt(k,193)* y(k,3) +rxt(k,161)* y(k,25) +rxt(k,119)* y(k,40) & +rxt(k,145)* y(k,61) +rxt(k,137)* y(k,62) +rxt(k,108)* y(k,69) & - +rxt(k,252)* y(k,76) +rxt(k,258)* y(k,78) +rxt(k,118)* y(k,89) & - +rxt(k,99)* y(k,94) +rxt(k,124)* y(k,98) + rxt(k,7) + rxt(k,8) & + +rxt(k,252)* y(k,77) +rxt(k,258)* y(k,79) +rxt(k,118)* y(k,90) & + +rxt(k,99)* y(k,95) +rxt(k,124)* y(k,99) + rxt(k,7) + rxt(k,8) & + het_rates(k,71))* y(k,71) prod(k,88) =rxt(k,110)*y(k,70)*y(k,69) - loss(k,52) = (rxt(k,259)* y(k,78) + rxt(k,59) + het_rates(k,72))* y(k,72) + loss(k,52) = (rxt(k,259)* y(k,79) + rxt(k,59) + het_rates(k,73))* y(k,73) prod(k,52) = (rxt(k,165)*y(k,28) +rxt(k,195)*y(k,5))*y(k,28) - loss(k,53) = (rxt(k,248)* y(k,69) +rxt(k,249)* y(k,98) + rxt(k,88) & - + het_rates(k,73))* y(k,73) + loss(k,53) = (rxt(k,248)* y(k,69) +rxt(k,249)* y(k,99) + rxt(k,88) & + + het_rates(k,74))* y(k,74) prod(k,53) = 0._r8 - loss(k,16) = ( + het_rates(k,74))* y(k,74) + loss(k,16) = ( + het_rates(k,75))* y(k,75) prod(k,16) = 0._r8 - loss(k,17) = ( + het_rates(k,75))* y(k,75) + loss(k,17) = ( + het_rates(k,76))* y(k,76) prod(k,17) = 0._r8 - loss(k,66) = (rxt(k,250)* y(k,70) +rxt(k,252)* y(k,71) +rxt(k,255)* y(k,98) & - + het_rates(k,76))* y(k,76) - prod(k,66) =rxt(k,88)*y(k,73) +rxt(k,89)*y(k,78) - loss(k,18) = ( + rxt(k,60) + het_rates(k,77))* y(k,77) + loss(k,66) = (rxt(k,250)* y(k,70) +rxt(k,252)* y(k,71) +rxt(k,255)* y(k,99) & + + het_rates(k,77))* y(k,77) + prod(k,66) =rxt(k,88)*y(k,74) +rxt(k,89)*y(k,79) + loss(k,18) = ( + rxt(k,60) + het_rates(k,78))* y(k,78) prod(k,18) = 0._r8 loss(k,83) = (rxt(k,253)* y(k,5) +rxt(k,254)* y(k,28) +rxt(k,256)* y(k,62) & - +rxt(k,257)* y(k,70) +rxt(k,258)* y(k,71) +rxt(k,259)* y(k,72) & - +rxt(k,260)* y(k,98) + rxt(k,89) + het_rates(k,78))* y(k,78) - prod(k,83) = (rxt(k,250)*y(k,70) +rxt(k,252)*y(k,71) +rxt(k,255)*y(k,98)) & - *y(k,76) +rxt(k,248)*y(k,73)*y(k,69) +rxt(k,90)*y(k,79) - loss(k,74) = (rxt(k,251)* y(k,98) + rxt(k,90) + het_rates(k,79))* y(k,79) + +rxt(k,257)* y(k,70) +rxt(k,258)* y(k,71) +rxt(k,259)* y(k,73) & + +rxt(k,260)* y(k,99) + rxt(k,89) + het_rates(k,79))* y(k,79) + prod(k,83) = (rxt(k,250)*y(k,70) +rxt(k,252)*y(k,71) +rxt(k,255)*y(k,99)) & + *y(k,77) +rxt(k,248)*y(k,74)*y(k,69) +rxt(k,90)*y(k,80) + loss(k,74) = (rxt(k,251)* y(k,99) + rxt(k,90) + het_rates(k,80))* y(k,80) prod(k,74) = (rxt(k,253)*y(k,5) +rxt(k,254)*y(k,28) +rxt(k,256)*y(k,62) + & - rxt(k,257)*y(k,70) +rxt(k,258)*y(k,71) +rxt(k,259)*y(k,72) + & - rxt(k,260)*y(k,98))*y(k,78) + (rxt(k,246)*y(k,63) + & - rxt(k,247)*y(k,98) +.500_r8*rxt(k,261)*y(k,98))*y(k,35) & - +rxt(k,249)*y(k,98)*y(k,73) +rxt(k,91)*y(k,80) - loss(k,47) = (rxt(k,262)* y(k,102) + rxt(k,91) + het_rates(k,80))* y(k,80) - prod(k,47) =rxt(k,87)*y(k,44) +rxt(k,251)*y(k,98)*y(k,79) - loss(k,19) = ( + het_rates(k,81))* y(k,81) + rxt(k,257)*y(k,70) +rxt(k,258)*y(k,71) +rxt(k,259)*y(k,73) + & + rxt(k,260)*y(k,99))*y(k,79) + (rxt(k,246)*y(k,63) + & + rxt(k,247)*y(k,99) +.500_r8*rxt(k,261)*y(k,99))*y(k,35) & + +rxt(k,249)*y(k,99)*y(k,74) +rxt(k,91)*y(k,81) + loss(k,47) = (rxt(k,262)* y(k,103) + rxt(k,91) + het_rates(k,81))* y(k,81) + prod(k,47) =rxt(k,87)*y(k,44) +rxt(k,251)*y(k,99)*y(k,80) + loss(k,19) = ( + het_rates(k,82))* y(k,82) prod(k,19) = 0._r8 - loss(k,20) = ( + het_rates(k,82))* y(k,82) + loss(k,20) = ( + het_rates(k,83))* y(k,83) prod(k,20) = 0._r8 - loss(k,21) = ( + het_rates(k,83))* y(k,83) + loss(k,21) = ( + het_rates(k,84))* y(k,84) prod(k,21) = 0._r8 - loss(k,22) = ( + het_rates(k,84))* y(k,84) + loss(k,22) = ( + het_rates(k,85))* y(k,85) prod(k,22) = 0._r8 - loss(k,23) = ( + het_rates(k,85))* y(k,85) + loss(k,23) = ( + het_rates(k,86))* y(k,86) prod(k,23) = 0._r8 - loss(k,24) = ( + het_rates(k,86))* y(k,86) + loss(k,24) = ( + het_rates(k,87))* y(k,87) prod(k,24) = 0._r8 - loss(k,25) = ( + het_rates(k,87))* y(k,87) + loss(k,25) = ( + het_rates(k,88))* y(k,88) prod(k,25) = 0._r8 - loss(k,76) = (rxt(k,289)* y(k,91) +rxt(k,287)* y(k,92) +rxt(k,288)* y(k,97) & - + het_rates(k,88))* y(k,88) + loss(k,76) = (rxt(k,289)* y(k,92) +rxt(k,287)* y(k,93) +rxt(k,288)* y(k,98) & + + het_rates(k,89))* y(k,89) prod(k,76) = (rxt(k,77) +rxt(k,78) +rxt(k,79) +rxt(k,80) +rxt(k,81) + & rxt(k,84) +rxt(k,85) +rxt(k,86))*y(k,70) + (rxt(k,71) +rxt(k,72) + & rxt(k,73) +rxt(k,74) +rxt(k,75) +rxt(k,76))*y(k,69) +rxt(k,62) & @@ -436,32 +447,32 @@ subroutine imp_prod_loss( avec_len, prod, loss, y, & + (rxt(k,159) +rxt(k,160))* y(k,25) +rxt(k,166)* y(k,28) & + (rxt(k,113) +rxt(k,114) +rxt(k,115))* y(k,40) +rxt(k,144)* y(k,61) & +rxt(k,149)* y(k,62) +rxt(k,139)* y(k,63) +rxt(k,117)* y(k,69) & - +rxt(k,118)* y(k,71) + 2._r8*rxt(k,127)* y(k,89) +rxt(k,122) & - * y(k,98) + rxt(k,263) + het_rates(k,89))* y(k,89) + +rxt(k,118)* y(k,71) + 2._r8*rxt(k,127)* y(k,90) +rxt(k,122) & + * y(k,99) + rxt(k,263) + het_rates(k,90))* y(k,90) prod(k,89) = (rxt(k,121)*y(k,43) +rxt(k,124)*y(k,71) +rxt(k,142)*y(k,63) + & rxt(k,173)*y(k,28) +rxt(k,203)*y(k,5) +rxt(k,221)*y(k,18) + & - rxt(k,224)*y(k,20) +rxt(k,245)*y(k,31) +rxt(k,251)*y(k,79) + & - .500_r8*rxt(k,261)*y(k,35))*y(k,98) + (rxt(k,155)*y(k,25) + & + rxt(k,224)*y(k,20) +rxt(k,245)*y(k,31) +rxt(k,251)*y(k,80) + & + .500_r8*rxt(k,261)*y(k,35))*y(k,99) + (rxt(k,155)*y(k,25) + & rxt(k,191)*y(k,3) +rxt(k,235)*y(k,63) +rxt(k,236)*y(k,69))*y(k,17) & + (rxt(k,158)*y(k,43) +rxt(k,220)*y(k,18) +rxt(k,223)*y(k,20)) & *y(k,25) + (rxt(k,162)*y(k,28) +rxt(k,239)*y(k,61))*y(k,21) & - + (rxt(k,11) +rxt(k,153))*y(k,52) +rxt(k,243)*y(k,94)*y(k,23) & + + (rxt(k,11) +rxt(k,153))*y(k,52) +rxt(k,243)*y(k,95)*y(k,23) & +rxt(k,116)*y(k,70)*y(k,40) +rxt(k,112)*y(k,69)*y(k,43) - loss(k,77) = (rxt(k,129)* y(k,69) +rxt(k,130)* y(k,70) +rxt(k,301)* y(k,99) & - + het_rates(k,90))* y(k,90) - prod(k,77) = (.800_r8*rxt(k,287)*y(k,92) +.900_r8*rxt(k,289)*y(k,91))*y(k,88) & - +rxt(k,291)*y(k,91)*y(k,69) + loss(k,77) = (rxt(k,129)* y(k,69) +rxt(k,130)* y(k,70) +rxt(k,301)* y(k,100) & + + het_rates(k,91))* y(k,91) + prod(k,77) = (.800_r8*rxt(k,287)*y(k,93) +.900_r8*rxt(k,289)*y(k,92))*y(k,89) & + +rxt(k,291)*y(k,92)*y(k,69) loss(k,64) = ((rxt(k,291) +rxt(k,292))* y(k,69) +rxt(k,290)* y(k,70) & - +rxt(k,289)* y(k,88) + het_rates(k,91))* y(k,91) - prod(k,64) =rxt(k,304)*y(k,100) +rxt(k,309)*y(k,101) - loss(k,67) = (rxt(k,287)* y(k,88) + het_rates(k,92))* y(k,92) - prod(k,67) = (rxt(k,297) +rxt(k,296)*y(k,55) +rxt(k,298)*y(k,61))*y(k,97) & - +rxt(k,16)*y(k,61) +rxt(k,291)*y(k,91)*y(k,69) +rxt(k,295)*y(k,93) & - *y(k,70) +rxt(k,300)*y(k,99) + +rxt(k,289)* y(k,89) + het_rates(k,92))* y(k,92) + prod(k,64) =rxt(k,304)*y(k,101) +rxt(k,309)*y(k,102) + loss(k,67) = (rxt(k,287)* y(k,89) + het_rates(k,93))* y(k,93) + prod(k,67) = (rxt(k,297) +rxt(k,296)*y(k,55) +rxt(k,298)*y(k,61))*y(k,98) & + +rxt(k,16)*y(k,61) +rxt(k,291)*y(k,92)*y(k,69) +rxt(k,295)*y(k,94) & + *y(k,70) +rxt(k,300)*y(k,100) loss(k,71) = (rxt(k,293)* y(k,69) + (rxt(k,294) +rxt(k,295))* y(k,70) & - + het_rates(k,93))* y(k,93) - prod(k,71) =rxt(k,62)*y(k,55) +rxt(k,301)*y(k,99)*y(k,90) +rxt(k,310) & - *y(k,101) + + het_rates(k,94))* y(k,94) + prod(k,71) =rxt(k,62)*y(k,55) +rxt(k,301)*y(k,100)*y(k,91) +rxt(k,310) & + *y(k,102) loss(k,94) = (rxt(k,180)* y(k,8) +rxt(k,181)* y(k,9) +rxt(k,207)* y(k,10) & +rxt(k,182)* y(k,11) +rxt(k,183)* y(k,12) +rxt(k,184)* y(k,13) & +rxt(k,185)* y(k,14) +rxt(k,186)* y(k,15) +rxt(k,230)* y(k,16) & @@ -471,24 +482,24 @@ subroutine imp_prod_loss( avec_len, prod, loss, y, & * y(k,45) +rxt(k,232)* y(k,46) +rxt(k,233)* y(k,47) +rxt(k,234) & * y(k,48) + (rxt(k,187) +rxt(k,188))* y(k,49) + (rxt(k,147) + & rxt(k,148))* y(k,56) + (rxt(k,97) +rxt(k,98))* y(k,70) +rxt(k,99) & - * y(k,71) +rxt(k,95)* y(k,102) + rxt(k,96) + het_rates(k,94)) & - * y(k,94) - prod(k,94) = (rxt(k,6) +rxt(k,130)*y(k,90))*y(k,70) +rxt(k,12)*y(k,56) & - +rxt(k,7)*y(k,71) +.850_r8*rxt(k,288)*y(k,97)*y(k,88) +rxt(k,1) & - *y(k,102) + * y(k,71) +rxt(k,95)* y(k,103) + rxt(k,96) + het_rates(k,95)) & + * y(k,95) + prod(k,94) = (rxt(k,6) +rxt(k,130)*y(k,91))*y(k,70) +rxt(k,12)*y(k,56) & + +rxt(k,7)*y(k,71) +.850_r8*rxt(k,288)*y(k,98)*y(k,89) +rxt(k,1) & + *y(k,103) loss(k,39) = (rxt(k,101)* y(k,69) +rxt(k,102)* y(k,70) + rxt(k,92) & - + rxt(k,100) + het_rates(k,95))* y(k,95) + + rxt(k,100) + het_rates(k,96))* y(k,96) prod(k,39) = (rxt(k,104) +rxt(k,103)*y(k,32) +rxt(k,105)*y(k,69) + & - rxt(k,106)*y(k,70) +rxt(k,107)*y(k,71))*y(k,96) +rxt(k,7)*y(k,71) + rxt(k,106)*y(k,70) +rxt(k,107)*y(k,71))*y(k,97) +rxt(k,7)*y(k,71) loss(k,40) = (rxt(k,103)* y(k,32) +rxt(k,105)* y(k,69) +rxt(k,106)* y(k,70) & - +rxt(k,107)* y(k,71) + rxt(k,93) + rxt(k,104) + het_rates(k,96)) & - * y(k,96) - prod(k,40) =rxt(k,97)*y(k,94)*y(k,70) - loss(k,79) = (rxt(k,296)* y(k,55) +rxt(k,298)* y(k,61) +rxt(k,288)* y(k,88) & - + rxt(k,297) + het_rates(k,97))* y(k,97) - prod(k,79) = (rxt(k,78) +rxt(k,80) +rxt(k,290)*y(k,91) +rxt(k,294)*y(k,93) + & - rxt(k,302)*y(k,99) +rxt(k,306)*y(k,100))*y(k,70) +rxt(k,299)*y(k,99) & - *y(k,32) + +rxt(k,107)* y(k,71) + rxt(k,93) + rxt(k,104) + het_rates(k,97)) & + * y(k,97) + prod(k,40) =rxt(k,97)*y(k,95)*y(k,70) + loss(k,79) = (rxt(k,296)* y(k,55) +rxt(k,298)* y(k,61) +rxt(k,288)* y(k,89) & + + rxt(k,297) + het_rates(k,98))* y(k,98) + prod(k,79) = (rxt(k,78) +rxt(k,80) +rxt(k,290)*y(k,92) +rxt(k,294)*y(k,94) + & + rxt(k,302)*y(k,100) +rxt(k,306)*y(k,101))*y(k,70) & + +rxt(k,299)*y(k,100)*y(k,32) loss(k,98) = (rxt(k,203)* y(k,5) +rxt(k,219)* y(k,16) +rxt(k,237)* y(k,17) & +rxt(k,221)* y(k,18) +rxt(k,222)* y(k,19) +rxt(k,224)* y(k,20) & +rxt(k,240)* y(k,22) +rxt(k,241)* y(k,23) +rxt(k,226)* y(k,24) & @@ -498,47 +509,47 @@ subroutine imp_prod_loss( avec_len, prod, loss, y, & +rxt(k,228)* y(k,47) +rxt(k,229)* y(k,48) +rxt(k,176)* y(k,49) & +rxt(k,152)* y(k,51) +rxt(k,128)* y(k,52) +rxt(k,179)* y(k,54) & +rxt(k,143)* y(k,55) +rxt(k,151)* y(k,62) +rxt(k,142)* y(k,63) & - +rxt(k,123)* y(k,69) +rxt(k,124)* y(k,71) +rxt(k,249)* y(k,73) & - +rxt(k,255)* y(k,76) +rxt(k,260)* y(k,78) +rxt(k,251)* y(k,79) & - +rxt(k,122)* y(k,89) + 2._r8*(rxt(k,125) +rxt(k,126))* y(k,98) & - + het_rates(k,98))* y(k,98) - prod(k,98) = (rxt(k,111)*y(k,41) +rxt(k,112)*y(k,43) +rxt(k,117)*y(k,89) + & + +rxt(k,123)* y(k,69) +rxt(k,124)* y(k,71) +rxt(k,249)* y(k,74) & + +rxt(k,255)* y(k,77) +rxt(k,260)* y(k,79) +rxt(k,251)* y(k,80) & + +rxt(k,122)* y(k,90) + 2._r8*(rxt(k,125) +rxt(k,126))* y(k,99) & + + het_rates(k,99))* y(k,99) + prod(k,98) = (rxt(k,111)*y(k,41) +rxt(k,112)*y(k,43) +rxt(k,117)*y(k,90) + & rxt(k,175)*y(k,49) +rxt(k,178)*y(k,54) +rxt(k,204)*y(k,45) + & rxt(k,206)*y(k,53) +rxt(k,236)*y(k,17))*y(k,69) & + (2.000_r8*rxt(k,114)*y(k,40) +rxt(k,118)*y(k,71) + & - rxt(k,139)*y(k,63) +rxt(k,144)*y(k,61) +rxt(k,160)*y(k,25))*y(k,89) & - + (rxt(k,94)*y(k,41) +2.000_r8*rxt(k,95)*y(k,102) + & - rxt(k,187)*y(k,49) +rxt(k,210)*y(k,45) +rxt(k,242)*y(k,23))*y(k,94) & - + (rxt(k,22) +.300_r8*rxt(k,240)*y(k,98))*y(k,22) + (rxt(k,3) + & - rxt(k,214)*y(k,39))*y(k,102) +.330_r8*rxt(k,24)*y(k,23) & + rxt(k,139)*y(k,63) +rxt(k,144)*y(k,61) +rxt(k,160)*y(k,25))*y(k,90) & + + (rxt(k,94)*y(k,41) +2.000_r8*rxt(k,95)*y(k,103) + & + rxt(k,187)*y(k,49) +rxt(k,210)*y(k,45) +rxt(k,242)*y(k,23))*y(k,95) & + + (rxt(k,22) +.300_r8*rxt(k,240)*y(k,99))*y(k,22) + (rxt(k,3) + & + rxt(k,214)*y(k,39))*y(k,103) +.330_r8*rxt(k,24)*y(k,23) & +rxt(k,119)*y(k,71)*y(k,40) +2.000_r8*rxt(k,4)*y(k,43) +rxt(k,9) & *y(k,51) +rxt(k,10)*y(k,52) +rxt(k,57)*y(k,53) +rxt(k,58)*y(k,54) & +.500_r8*rxt(k,265)*y(k,62) - loss(k,80) = (rxt(k,299)* y(k,32) +rxt(k,302)* y(k,70) +rxt(k,301)* y(k,90) & - + rxt(k,300) + het_rates(k,99))* y(k,99) - prod(k,80) = (rxt(k,73) +rxt(k,74) +rxt(k,292)*y(k,91) +rxt(k,293)*y(k,93) + & - rxt(k,305)*y(k,100) +rxt(k,311)*y(k,101))*y(k,69) + (rxt(k,79) + & - rxt(k,81))*y(k,70) + (rxt(k,303)*y(k,100) +rxt(k,308)*y(k,101)) & - *y(k,88) +rxt(k,285)*y(k,100) +rxt(k,284)*y(k,101) - loss(k,60) = (rxt(k,305)* y(k,69) +rxt(k,306)* y(k,70) +rxt(k,303)* y(k,88) & - + rxt(k,285) + rxt(k,304) + het_rates(k,100))* y(k,100) + loss(k,80) = (rxt(k,299)* y(k,32) +rxt(k,302)* y(k,70) +rxt(k,301)* y(k,91) & + + rxt(k,300) + het_rates(k,100))* y(k,100) + prod(k,80) = (rxt(k,73) +rxt(k,74) +rxt(k,292)*y(k,92) +rxt(k,293)*y(k,94) + & + rxt(k,305)*y(k,101) +rxt(k,311)*y(k,102))*y(k,69) + (rxt(k,79) + & + rxt(k,81))*y(k,70) + (rxt(k,303)*y(k,101) +rxt(k,308)*y(k,102)) & + *y(k,89) +rxt(k,285)*y(k,101) +rxt(k,284)*y(k,102) + loss(k,60) = (rxt(k,305)* y(k,69) +rxt(k,306)* y(k,70) +rxt(k,303)* y(k,89) & + + rxt(k,285) + rxt(k,304) + het_rates(k,101))* y(k,101) prod(k,60) = (rxt(k,75) +rxt(k,76))*y(k,69) + (rxt(k,85) +rxt(k,86))*y(k,70) & - + (rxt(k,286) +rxt(k,307)*y(k,88))*y(k,101) - loss(k,59) = (rxt(k,311)* y(k,69) + (rxt(k,307) +rxt(k,308))* y(k,88) & + + (rxt(k,286) +rxt(k,307)*y(k,89))*y(k,102) + loss(k,59) = (rxt(k,311)* y(k,69) + (rxt(k,307) +rxt(k,308))* y(k,89) & + rxt(k,284) + rxt(k,286) + rxt(k,309) + rxt(k,310) & - + het_rates(k,101))* y(k,101) + + het_rates(k,102))* y(k,102) prod(k,59) = (rxt(k,71) +rxt(k,72))*y(k,69) + (rxt(k,77) +rxt(k,84))*y(k,70) - loss(k,102) = (rxt(k,214)* y(k,39) +rxt(k,262)* y(k,80) +rxt(k,95)* y(k,94) & - + rxt(k,1) + rxt(k,2) + rxt(k,3) + het_rates(k,102))* y(k,102) - prod(k,102) = (rxt(k,120)*y(k,41) +rxt(k,121)*y(k,43) +rxt(k,122)*y(k,89) + & - rxt(k,125)*y(k,98) +rxt(k,128)*y(k,52) +rxt(k,152)*y(k,51) + & + loss(k,102) = (rxt(k,214)* y(k,39) +rxt(k,262)* y(k,81) +rxt(k,95)* y(k,95) & + + rxt(k,1) + rxt(k,2) + rxt(k,3) + het_rates(k,103))* y(k,103) + prod(k,102) = (rxt(k,120)*y(k,41) +rxt(k,121)*y(k,43) +rxt(k,122)*y(k,90) + & + rxt(k,125)*y(k,99) +rxt(k,128)*y(k,52) +rxt(k,152)*y(k,51) + & rxt(k,176)*y(k,49) +rxt(k,179)*y(k,54) +rxt(k,205)*y(k,45) + & rxt(k,219)*y(k,16) +rxt(k,221)*y(k,18) +rxt(k,222)*y(k,19) + & rxt(k,224)*y(k,20) +rxt(k,229)*y(k,48) +rxt(k,237)*y(k,17) + & - rxt(k,240)*y(k,22) +rxt(k,241)*y(k,23))*y(k,98) & + rxt(k,240)*y(k,22) +rxt(k,241)*y(k,23))*y(k,99) & + (rxt(k,268)*y(k,54) +rxt(k,274)*y(k,54) +rxt(k,275)*y(k,53) + & rxt(k,279)*y(k,54) +rxt(k,280)*y(k,53))*y(k,49) +.050_r8*rxt(k,24) & - *y(k,23) +rxt(k,115)*y(k,89)*y(k,40) +rxt(k,87)*y(k,44) + *y(k,23) +rxt(k,115)*y(k,90)*y(k,40) +rxt(k,87)*y(k,44) end do end subroutine imp_prod_loss end module mo_prod_loss diff --git a/src/chemistry/pp_waccm_ma_mam5/mo_rxt_rates_conv.F90 b/src/chemistry/pp_waccm_ma_mam5/mo_rxt_rates_conv.F90 index d8f52c4676..bbe9d4d986 100644 --- a/src/chemistry/pp_waccm_ma_mam5/mo_rxt_rates_conv.F90 +++ b/src/chemistry/pp_waccm_ma_mam5/mo_rxt_rates_conv.F90 @@ -8,9 +8,9 @@ subroutine set_rates( rxt_rates, sol, ncol ) real(r8), intent(inout) :: rxt_rates(:,:,:) real(r8), intent(in) :: sol(:,:,:) integer, intent(in) :: ncol - rxt_rates(:ncol,:, 1) = rxt_rates(:ncol,:, 1)*sol(:ncol,:, 102) ! rate_const*H2O - rxt_rates(:ncol,:, 2) = rxt_rates(:ncol,:, 2)*sol(:ncol,:, 102) ! rate_const*H2O - rxt_rates(:ncol,:, 3) = rxt_rates(:ncol,:, 3)*sol(:ncol,:, 102) ! rate_const*H2O + rxt_rates(:ncol,:, 1) = rxt_rates(:ncol,:, 1)*sol(:ncol,:, 103) ! rate_const*H2O + rxt_rates(:ncol,:, 2) = rxt_rates(:ncol,:, 2)*sol(:ncol,:, 103) ! rate_const*H2O + rxt_rates(:ncol,:, 3) = rxt_rates(:ncol,:, 3)*sol(:ncol,:, 103) ! rate_const*H2O rxt_rates(:ncol,:, 4) = rxt_rates(:ncol,:, 4)*sol(:ncol,:, 43) ! rate_const*H2O2 rxt_rates(:ncol,:, 5) = rxt_rates(:ncol,:, 5)*sol(:ncol,:, 70) ! rate_const*O2 rxt_rates(:ncol,:, 6) = rxt_rates(:ncol,:, 6)*sol(:ncol,:, 70) ! rate_const*O2 @@ -66,8 +66,8 @@ subroutine set_rates( rxt_rates, sol, ncol ) rxt_rates(:ncol,:, 56) = rxt_rates(:ncol,:, 56)*sol(:ncol,:, 50) ! rate_const*HF rxt_rates(:ncol,:, 57) = rxt_rates(:ncol,:, 57)*sol(:ncol,:, 53) ! rate_const*HOBR rxt_rates(:ncol,:, 58) = rxt_rates(:ncol,:, 58)*sol(:ncol,:, 54) ! rate_const*HOCL - rxt_rates(:ncol,:, 59) = rxt_rates(:ncol,:, 59)*sol(:ncol,:, 72) ! rate_const*OCLO - rxt_rates(:ncol,:, 60) = rxt_rates(:ncol,:, 60)*sol(:ncol,:, 77) ! rate_const*SF6 + rxt_rates(:ncol,:, 59) = rxt_rates(:ncol,:, 59)*sol(:ncol,:, 73) ! rate_const*OCLO + rxt_rates(:ncol,:, 60) = rxt_rates(:ncol,:, 60)*sol(:ncol,:, 78) ! rate_const*SF6 rxt_rates(:ncol,:, 61) = rxt_rates(:ncol,:, 61)*sol(:ncol,:, 32) ! rate_const*CO2 rxt_rates(:ncol,:, 62) = rxt_rates(:ncol,:, 62)*sol(:ncol,:, 55) ! rate_const*N ! rate_const*N2 @@ -95,49 +95,49 @@ subroutine set_rates( rxt_rates, sol, ncol ) rxt_rates(:ncol,:, 85) = rxt_rates(:ncol,:, 85)*sol(:ncol,:, 70) ! rate_const*O2 rxt_rates(:ncol,:, 86) = rxt_rates(:ncol,:, 86)*sol(:ncol,:, 70) ! rate_const*O2 rxt_rates(:ncol,:, 87) = rxt_rates(:ncol,:, 87)*sol(:ncol,:, 44) ! rate_const*H2SO4 - rxt_rates(:ncol,:, 88) = rxt_rates(:ncol,:, 88)*sol(:ncol,:, 73) ! rate_const*OCS - rxt_rates(:ncol,:, 89) = rxt_rates(:ncol,:, 89)*sol(:ncol,:, 78) ! rate_const*SO - rxt_rates(:ncol,:, 90) = rxt_rates(:ncol,:, 90)*sol(:ncol,:, 79) ! rate_const*SO2 - rxt_rates(:ncol,:, 91) = rxt_rates(:ncol,:, 91)*sol(:ncol,:, 80) ! rate_const*SO3 - rxt_rates(:ncol,:, 92) = rxt_rates(:ncol,:, 92)*sol(:ncol,:, 95) ! rate_const*O2_1D - rxt_rates(:ncol,:, 93) = rxt_rates(:ncol,:, 93)*sol(:ncol,:, 96) ! rate_const*O2_1S - rxt_rates(:ncol,:, 94) = rxt_rates(:ncol,:, 94)*sol(:ncol,:, 94)*sol(:ncol,:, 41) ! rate_const*O1D*H2 - rxt_rates(:ncol,:, 95) = rxt_rates(:ncol,:, 95)*sol(:ncol,:, 94)*sol(:ncol,:, 102) ! rate_const*O1D*H2O - rxt_rates(:ncol,:, 96) = rxt_rates(:ncol,:, 96)*sol(:ncol,:, 94) ! rate_const*N2*O1D - rxt_rates(:ncol,:, 97) = rxt_rates(:ncol,:, 97)*sol(:ncol,:, 94)*sol(:ncol,:, 70) ! rate_const*O1D*O2 - rxt_rates(:ncol,:, 98) = rxt_rates(:ncol,:, 98)*sol(:ncol,:, 94)*sol(:ncol,:, 70) ! rate_const*O1D*O2 - rxt_rates(:ncol,:, 99) = rxt_rates(:ncol,:, 99)*sol(:ncol,:, 94)*sol(:ncol,:, 71) ! rate_const*O1D*O3 - rxt_rates(:ncol,:, 100) = rxt_rates(:ncol,:, 100)*sol(:ncol,:, 95) ! rate_const*N2*O2_1D - rxt_rates(:ncol,:, 101) = rxt_rates(:ncol,:, 101)*sol(:ncol,:, 95)*sol(:ncol,:, 69) ! rate_const*O2_1D*O - rxt_rates(:ncol,:, 102) = rxt_rates(:ncol,:, 102)*sol(:ncol,:, 95)*sol(:ncol,:, 70) ! rate_const*O2_1D*O2 - rxt_rates(:ncol,:, 103) = rxt_rates(:ncol,:, 103)*sol(:ncol,:, 96)*sol(:ncol,:, 32) ! rate_const*O2_1S*CO2 - rxt_rates(:ncol,:, 104) = rxt_rates(:ncol,:, 104)*sol(:ncol,:, 96) ! rate_const*N2*O2_1S - rxt_rates(:ncol,:, 105) = rxt_rates(:ncol,:, 105)*sol(:ncol,:, 96)*sol(:ncol,:, 69) ! rate_const*O2_1S*O - rxt_rates(:ncol,:, 106) = rxt_rates(:ncol,:, 106)*sol(:ncol,:, 96)*sol(:ncol,:, 70) ! rate_const*O2_1S*O2 - rxt_rates(:ncol,:, 107) = rxt_rates(:ncol,:, 107)*sol(:ncol,:, 96)*sol(:ncol,:, 71) ! rate_const*O2_1S*O3 + rxt_rates(:ncol,:, 88) = rxt_rates(:ncol,:, 88)*sol(:ncol,:, 74) ! rate_const*OCS + rxt_rates(:ncol,:, 89) = rxt_rates(:ncol,:, 89)*sol(:ncol,:, 79) ! rate_const*SO + rxt_rates(:ncol,:, 90) = rxt_rates(:ncol,:, 90)*sol(:ncol,:, 80) ! rate_const*SO2 + rxt_rates(:ncol,:, 91) = rxt_rates(:ncol,:, 91)*sol(:ncol,:, 81) ! rate_const*SO3 + rxt_rates(:ncol,:, 92) = rxt_rates(:ncol,:, 92)*sol(:ncol,:, 96) ! rate_const*O2_1D + rxt_rates(:ncol,:, 93) = rxt_rates(:ncol,:, 93)*sol(:ncol,:, 97) ! rate_const*O2_1S + rxt_rates(:ncol,:, 94) = rxt_rates(:ncol,:, 94)*sol(:ncol,:, 95)*sol(:ncol,:, 41) ! rate_const*O1D*H2 + rxt_rates(:ncol,:, 95) = rxt_rates(:ncol,:, 95)*sol(:ncol,:, 95)*sol(:ncol,:, 103) ! rate_const*O1D*H2O + rxt_rates(:ncol,:, 96) = rxt_rates(:ncol,:, 96)*sol(:ncol,:, 95) ! rate_const*N2*O1D + rxt_rates(:ncol,:, 97) = rxt_rates(:ncol,:, 97)*sol(:ncol,:, 95)*sol(:ncol,:, 70) ! rate_const*O1D*O2 + rxt_rates(:ncol,:, 98) = rxt_rates(:ncol,:, 98)*sol(:ncol,:, 95)*sol(:ncol,:, 70) ! rate_const*O1D*O2 + rxt_rates(:ncol,:, 99) = rxt_rates(:ncol,:, 99)*sol(:ncol,:, 95)*sol(:ncol,:, 71) ! rate_const*O1D*O3 + rxt_rates(:ncol,:, 100) = rxt_rates(:ncol,:, 100)*sol(:ncol,:, 96) ! rate_const*N2*O2_1D + rxt_rates(:ncol,:, 101) = rxt_rates(:ncol,:, 101)*sol(:ncol,:, 96)*sol(:ncol,:, 69) ! rate_const*O2_1D*O + rxt_rates(:ncol,:, 102) = rxt_rates(:ncol,:, 102)*sol(:ncol,:, 96)*sol(:ncol,:, 70) ! rate_const*O2_1D*O2 + rxt_rates(:ncol,:, 103) = rxt_rates(:ncol,:, 103)*sol(:ncol,:, 97)*sol(:ncol,:, 32) ! rate_const*O2_1S*CO2 + rxt_rates(:ncol,:, 104) = rxt_rates(:ncol,:, 104)*sol(:ncol,:, 97) ! rate_const*N2*O2_1S + rxt_rates(:ncol,:, 105) = rxt_rates(:ncol,:, 105)*sol(:ncol,:, 97)*sol(:ncol,:, 69) ! rate_const*O2_1S*O + rxt_rates(:ncol,:, 106) = rxt_rates(:ncol,:, 106)*sol(:ncol,:, 97)*sol(:ncol,:, 70) ! rate_const*O2_1S*O2 + rxt_rates(:ncol,:, 107) = rxt_rates(:ncol,:, 107)*sol(:ncol,:, 97)*sol(:ncol,:, 71) ! rate_const*O2_1S*O3 rxt_rates(:ncol,:, 108) = rxt_rates(:ncol,:, 108)*sol(:ncol,:, 69)*sol(:ncol,:, 71) ! rate_const*O*O3 rxt_rates(:ncol,:, 109) = rxt_rates(:ncol,:, 109)*sol(:ncol,:, 69)*sol(:ncol,:, 69) ! rate_const*M*O*O rxt_rates(:ncol,:, 110) = rxt_rates(:ncol,:, 110)*sol(:ncol,:, 69)*sol(:ncol,:, 70) ! rate_const*M*O*O2 rxt_rates(:ncol,:, 111) = rxt_rates(:ncol,:, 111)*sol(:ncol,:, 41)*sol(:ncol,:, 69) ! rate_const*H2*O rxt_rates(:ncol,:, 112) = rxt_rates(:ncol,:, 112)*sol(:ncol,:, 43)*sol(:ncol,:, 69) ! rate_const*H2O2*O - rxt_rates(:ncol,:, 113) = rxt_rates(:ncol,:, 113)*sol(:ncol,:, 40)*sol(:ncol,:, 89) ! rate_const*H*HO2 - rxt_rates(:ncol,:, 114) = rxt_rates(:ncol,:, 114)*sol(:ncol,:, 40)*sol(:ncol,:, 89) ! rate_const*H*HO2 - rxt_rates(:ncol,:, 115) = rxt_rates(:ncol,:, 115)*sol(:ncol,:, 40)*sol(:ncol,:, 89) ! rate_const*H*HO2 + rxt_rates(:ncol,:, 113) = rxt_rates(:ncol,:, 113)*sol(:ncol,:, 40)*sol(:ncol,:, 90) ! rate_const*H*HO2 + rxt_rates(:ncol,:, 114) = rxt_rates(:ncol,:, 114)*sol(:ncol,:, 40)*sol(:ncol,:, 90) ! rate_const*H*HO2 + rxt_rates(:ncol,:, 115) = rxt_rates(:ncol,:, 115)*sol(:ncol,:, 40)*sol(:ncol,:, 90) ! rate_const*H*HO2 rxt_rates(:ncol,:, 116) = rxt_rates(:ncol,:, 116)*sol(:ncol,:, 40)*sol(:ncol,:, 70) ! rate_const*M*H*O2 - rxt_rates(:ncol,:, 117) = rxt_rates(:ncol,:, 117)*sol(:ncol,:, 89)*sol(:ncol,:, 69) ! rate_const*HO2*O - rxt_rates(:ncol,:, 118) = rxt_rates(:ncol,:, 118)*sol(:ncol,:, 89)*sol(:ncol,:, 71) ! rate_const*HO2*O3 + rxt_rates(:ncol,:, 117) = rxt_rates(:ncol,:, 117)*sol(:ncol,:, 90)*sol(:ncol,:, 69) ! rate_const*HO2*O + rxt_rates(:ncol,:, 118) = rxt_rates(:ncol,:, 118)*sol(:ncol,:, 90)*sol(:ncol,:, 71) ! rate_const*HO2*O3 rxt_rates(:ncol,:, 119) = rxt_rates(:ncol,:, 119)*sol(:ncol,:, 40)*sol(:ncol,:, 71) ! rate_const*H*O3 - rxt_rates(:ncol,:, 120) = rxt_rates(:ncol,:, 120)*sol(:ncol,:, 98)*sol(:ncol,:, 41) ! rate_const*OH*H2 - rxt_rates(:ncol,:, 121) = rxt_rates(:ncol,:, 121)*sol(:ncol,:, 98)*sol(:ncol,:, 43) ! rate_const*OH*H2O2 - rxt_rates(:ncol,:, 122) = rxt_rates(:ncol,:, 122)*sol(:ncol,:, 98)*sol(:ncol,:, 89) ! rate_const*OH*HO2 - rxt_rates(:ncol,:, 123) = rxt_rates(:ncol,:, 123)*sol(:ncol,:, 98)*sol(:ncol,:, 69) ! rate_const*OH*O - rxt_rates(:ncol,:, 124) = rxt_rates(:ncol,:, 124)*sol(:ncol,:, 98)*sol(:ncol,:, 71) ! rate_const*OH*O3 - rxt_rates(:ncol,:, 125) = rxt_rates(:ncol,:, 125)*sol(:ncol,:, 98)*sol(:ncol,:, 98) ! rate_const*OH*OH - rxt_rates(:ncol,:, 126) = rxt_rates(:ncol,:, 126)*sol(:ncol,:, 98)*sol(:ncol,:, 98) ! rate_const*M*OH*OH - rxt_rates(:ncol,:, 127) = rxt_rates(:ncol,:, 127)*sol(:ncol,:, 89)*sol(:ncol,:, 89) ! rate_const*HO2*HO2 - rxt_rates(:ncol,:, 128) = rxt_rates(:ncol,:, 128)*sol(:ncol,:, 52)*sol(:ncol,:, 98) ! rate_const*HO2NO2*OH - rxt_rates(:ncol,:, 129) = rxt_rates(:ncol,:, 129)*sol(:ncol,:, 90)*sol(:ncol,:, 69) ! rate_const*N2D*O - rxt_rates(:ncol,:, 130) = rxt_rates(:ncol,:, 130)*sol(:ncol,:, 90)*sol(:ncol,:, 70) ! rate_const*N2D*O2 + rxt_rates(:ncol,:, 120) = rxt_rates(:ncol,:, 120)*sol(:ncol,:, 99)*sol(:ncol,:, 41) ! rate_const*OH*H2 + rxt_rates(:ncol,:, 121) = rxt_rates(:ncol,:, 121)*sol(:ncol,:, 99)*sol(:ncol,:, 43) ! rate_const*OH*H2O2 + rxt_rates(:ncol,:, 122) = rxt_rates(:ncol,:, 122)*sol(:ncol,:, 99)*sol(:ncol,:, 90) ! rate_const*OH*HO2 + rxt_rates(:ncol,:, 123) = rxt_rates(:ncol,:, 123)*sol(:ncol,:, 99)*sol(:ncol,:, 69) ! rate_const*OH*O + rxt_rates(:ncol,:, 124) = rxt_rates(:ncol,:, 124)*sol(:ncol,:, 99)*sol(:ncol,:, 71) ! rate_const*OH*O3 + rxt_rates(:ncol,:, 125) = rxt_rates(:ncol,:, 125)*sol(:ncol,:, 99)*sol(:ncol,:, 99) ! rate_const*OH*OH + rxt_rates(:ncol,:, 126) = rxt_rates(:ncol,:, 126)*sol(:ncol,:, 99)*sol(:ncol,:, 99) ! rate_const*M*OH*OH + rxt_rates(:ncol,:, 127) = rxt_rates(:ncol,:, 127)*sol(:ncol,:, 90)*sol(:ncol,:, 90) ! rate_const*HO2*HO2 + rxt_rates(:ncol,:, 128) = rxt_rates(:ncol,:, 128)*sol(:ncol,:, 52)*sol(:ncol,:, 99) ! rate_const*HO2NO2*OH + rxt_rates(:ncol,:, 129) = rxt_rates(:ncol,:, 129)*sol(:ncol,:, 91)*sol(:ncol,:, 69) ! rate_const*N2D*O + rxt_rates(:ncol,:, 130) = rxt_rates(:ncol,:, 130)*sol(:ncol,:, 91)*sol(:ncol,:, 70) ! rate_const*N2D*O2 rxt_rates(:ncol,:, 131) = rxt_rates(:ncol,:, 131)*sol(:ncol,:, 55)*sol(:ncol,:, 61) ! rate_const*N*NO rxt_rates(:ncol,:, 132) = rxt_rates(:ncol,:, 132)*sol(:ncol,:, 55)*sol(:ncol,:, 62) ! rate_const*N*NO2 rxt_rates(:ncol,:, 133) = rxt_rates(:ncol,:, 133)*sol(:ncol,:, 55)*sol(:ncol,:, 62) ! rate_const*N*NO2 @@ -146,131 +146,131 @@ subroutine set_rates( rxt_rates, sol, ncol ) rxt_rates(:ncol,:, 136) = rxt_rates(:ncol,:, 136)*sol(:ncol,:, 62)*sol(:ncol,:, 69) ! rate_const*NO2*O rxt_rates(:ncol,:, 137) = rxt_rates(:ncol,:, 137)*sol(:ncol,:, 62)*sol(:ncol,:, 71) ! rate_const*NO2*O3 rxt_rates(:ncol,:, 138) = rxt_rates(:ncol,:, 138)*sol(:ncol,:, 62)*sol(:ncol,:, 69) ! rate_const*M*NO2*O - rxt_rates(:ncol,:, 139) = rxt_rates(:ncol,:, 139)*sol(:ncol,:, 63)*sol(:ncol,:, 89) ! rate_const*NO3*HO2 + rxt_rates(:ncol,:, 139) = rxt_rates(:ncol,:, 139)*sol(:ncol,:, 63)*sol(:ncol,:, 90) ! rate_const*NO3*HO2 rxt_rates(:ncol,:, 140) = rxt_rates(:ncol,:, 140)*sol(:ncol,:, 63)*sol(:ncol,:, 61) ! rate_const*NO3*NO rxt_rates(:ncol,:, 141) = rxt_rates(:ncol,:, 141)*sol(:ncol,:, 63)*sol(:ncol,:, 69) ! rate_const*NO3*O - rxt_rates(:ncol,:, 142) = rxt_rates(:ncol,:, 142)*sol(:ncol,:, 63)*sol(:ncol,:, 98) ! rate_const*NO3*OH - rxt_rates(:ncol,:, 143) = rxt_rates(:ncol,:, 143)*sol(:ncol,:, 55)*sol(:ncol,:, 98) ! rate_const*N*OH - rxt_rates(:ncol,:, 144) = rxt_rates(:ncol,:, 144)*sol(:ncol,:, 61)*sol(:ncol,:, 89) ! rate_const*NO*HO2 + rxt_rates(:ncol,:, 142) = rxt_rates(:ncol,:, 142)*sol(:ncol,:, 63)*sol(:ncol,:, 99) ! rate_const*NO3*OH + rxt_rates(:ncol,:, 143) = rxt_rates(:ncol,:, 143)*sol(:ncol,:, 55)*sol(:ncol,:, 99) ! rate_const*N*OH + rxt_rates(:ncol,:, 144) = rxt_rates(:ncol,:, 144)*sol(:ncol,:, 61)*sol(:ncol,:, 90) ! rate_const*NO*HO2 rxt_rates(:ncol,:, 145) = rxt_rates(:ncol,:, 145)*sol(:ncol,:, 61)*sol(:ncol,:, 71) ! rate_const*NO*O3 rxt_rates(:ncol,:, 146) = rxt_rates(:ncol,:, 146)*sol(:ncol,:, 61)*sol(:ncol,:, 69) ! rate_const*M*NO*O - rxt_rates(:ncol,:, 147) = rxt_rates(:ncol,:, 147)*sol(:ncol,:, 94)*sol(:ncol,:, 56) ! rate_const*O1D*N2O - rxt_rates(:ncol,:, 148) = rxt_rates(:ncol,:, 148)*sol(:ncol,:, 94)*sol(:ncol,:, 56) ! rate_const*O1D*N2O - rxt_rates(:ncol,:, 149) = rxt_rates(:ncol,:, 149)*sol(:ncol,:, 62)*sol(:ncol,:, 89) ! rate_const*M*NO2*HO2 + rxt_rates(:ncol,:, 147) = rxt_rates(:ncol,:, 147)*sol(:ncol,:, 95)*sol(:ncol,:, 56) ! rate_const*O1D*N2O + rxt_rates(:ncol,:, 148) = rxt_rates(:ncol,:, 148)*sol(:ncol,:, 95)*sol(:ncol,:, 56) ! rate_const*O1D*N2O + rxt_rates(:ncol,:, 149) = rxt_rates(:ncol,:, 149)*sol(:ncol,:, 62)*sol(:ncol,:, 90) ! rate_const*M*NO2*HO2 rxt_rates(:ncol,:, 150) = rxt_rates(:ncol,:, 150)*sol(:ncol,:, 62)*sol(:ncol,:, 63) ! rate_const*M*NO2*NO3 - rxt_rates(:ncol,:, 151) = rxt_rates(:ncol,:, 151)*sol(:ncol,:, 62)*sol(:ncol,:, 98) ! rate_const*M*NO2*OH - rxt_rates(:ncol,:, 152) = rxt_rates(:ncol,:, 152)*sol(:ncol,:, 51)*sol(:ncol,:, 98) ! rate_const*HNO3*OH + rxt_rates(:ncol,:, 151) = rxt_rates(:ncol,:, 151)*sol(:ncol,:, 62)*sol(:ncol,:, 99) ! rate_const*M*NO2*OH + rxt_rates(:ncol,:, 152) = rxt_rates(:ncol,:, 152)*sol(:ncol,:, 51)*sol(:ncol,:, 99) ! rate_const*HNO3*OH rxt_rates(:ncol,:, 153) = rxt_rates(:ncol,:, 153)*sol(:ncol,:, 52) ! rate_const*M*HO2NO2 rxt_rates(:ncol,:, 154) = rxt_rates(:ncol,:, 154)*sol(:ncol,:, 57) ! rate_const*M*N2O5 rxt_rates(:ncol,:, 155) = rxt_rates(:ncol,:, 155)*sol(:ncol,:, 25)*sol(:ncol,:, 17) ! rate_const*CL*CH2O rxt_rates(:ncol,:, 156) = rxt_rates(:ncol,:, 156)*sol(:ncol,:, 25)*sol(:ncol,:, 23) ! rate_const*CL*CH4 rxt_rates(:ncol,:, 157) = rxt_rates(:ncol,:, 157)*sol(:ncol,:, 25)*sol(:ncol,:, 41) ! rate_const*CL*H2 rxt_rates(:ncol,:, 158) = rxt_rates(:ncol,:, 158)*sol(:ncol,:, 25)*sol(:ncol,:, 43) ! rate_const*CL*H2O2 - rxt_rates(:ncol,:, 159) = rxt_rates(:ncol,:, 159)*sol(:ncol,:, 25)*sol(:ncol,:, 89) ! rate_const*CL*HO2 - rxt_rates(:ncol,:, 160) = rxt_rates(:ncol,:, 160)*sol(:ncol,:, 25)*sol(:ncol,:, 89) ! rate_const*CL*HO2 + rxt_rates(:ncol,:, 159) = rxt_rates(:ncol,:, 159)*sol(:ncol,:, 25)*sol(:ncol,:, 90) ! rate_const*CL*HO2 + rxt_rates(:ncol,:, 160) = rxt_rates(:ncol,:, 160)*sol(:ncol,:, 25)*sol(:ncol,:, 90) ! rate_const*CL*HO2 rxt_rates(:ncol,:, 161) = rxt_rates(:ncol,:, 161)*sol(:ncol,:, 25)*sol(:ncol,:, 71) ! rate_const*CL*O3 rxt_rates(:ncol,:, 162) = rxt_rates(:ncol,:, 162)*sol(:ncol,:, 28)*sol(:ncol,:, 21) ! rate_const*CLO*CH3O2 rxt_rates(:ncol,:, 163) = rxt_rates(:ncol,:, 163)*sol(:ncol,:, 28)*sol(:ncol,:, 28) ! rate_const*CLO*CLO rxt_rates(:ncol,:, 164) = rxt_rates(:ncol,:, 164)*sol(:ncol,:, 28)*sol(:ncol,:, 28) ! rate_const*CLO*CLO rxt_rates(:ncol,:, 165) = rxt_rates(:ncol,:, 165)*sol(:ncol,:, 28)*sol(:ncol,:, 28) ! rate_const*CLO*CLO - rxt_rates(:ncol,:, 166) = rxt_rates(:ncol,:, 166)*sol(:ncol,:, 28)*sol(:ncol,:, 89) ! rate_const*CLO*HO2 + rxt_rates(:ncol,:, 166) = rxt_rates(:ncol,:, 166)*sol(:ncol,:, 28)*sol(:ncol,:, 90) ! rate_const*CLO*HO2 rxt_rates(:ncol,:, 167) = rxt_rates(:ncol,:, 167)*sol(:ncol,:, 28)*sol(:ncol,:, 61) ! rate_const*CLO*NO rxt_rates(:ncol,:, 168) = rxt_rates(:ncol,:, 168)*sol(:ncol,:, 29)*sol(:ncol,:, 25) ! rate_const*CLONO2*CL rxt_rates(:ncol,:, 169) = rxt_rates(:ncol,:, 169)*sol(:ncol,:, 28)*sol(:ncol,:, 62) ! rate_const*M*CLO*NO2 rxt_rates(:ncol,:, 170) = rxt_rates(:ncol,:, 170)*sol(:ncol,:, 29)*sol(:ncol,:, 69) ! rate_const*CLONO2*O - rxt_rates(:ncol,:, 171) = rxt_rates(:ncol,:, 171)*sol(:ncol,:, 29)*sol(:ncol,:, 98) ! rate_const*CLONO2*OH + rxt_rates(:ncol,:, 171) = rxt_rates(:ncol,:, 171)*sol(:ncol,:, 29)*sol(:ncol,:, 99) ! rate_const*CLONO2*OH rxt_rates(:ncol,:, 172) = rxt_rates(:ncol,:, 172)*sol(:ncol,:, 28)*sol(:ncol,:, 69) ! rate_const*CLO*O - rxt_rates(:ncol,:, 173) = rxt_rates(:ncol,:, 173)*sol(:ncol,:, 28)*sol(:ncol,:, 98) ! rate_const*CLO*OH - rxt_rates(:ncol,:, 174) = rxt_rates(:ncol,:, 174)*sol(:ncol,:, 28)*sol(:ncol,:, 98) ! rate_const*CLO*OH + rxt_rates(:ncol,:, 173) = rxt_rates(:ncol,:, 173)*sol(:ncol,:, 28)*sol(:ncol,:, 99) ! rate_const*CLO*OH + rxt_rates(:ncol,:, 174) = rxt_rates(:ncol,:, 174)*sol(:ncol,:, 28)*sol(:ncol,:, 99) ! rate_const*CLO*OH rxt_rates(:ncol,:, 175) = rxt_rates(:ncol,:, 175)*sol(:ncol,:, 49)*sol(:ncol,:, 69) ! rate_const*HCL*O - rxt_rates(:ncol,:, 176) = rxt_rates(:ncol,:, 176)*sol(:ncol,:, 49)*sol(:ncol,:, 98) ! rate_const*HCL*OH + rxt_rates(:ncol,:, 176) = rxt_rates(:ncol,:, 176)*sol(:ncol,:, 49)*sol(:ncol,:, 99) ! rate_const*HCL*OH rxt_rates(:ncol,:, 177) = rxt_rates(:ncol,:, 177)*sol(:ncol,:, 54)*sol(:ncol,:, 25) ! rate_const*HOCL*CL rxt_rates(:ncol,:, 178) = rxt_rates(:ncol,:, 178)*sol(:ncol,:, 54)*sol(:ncol,:, 69) ! rate_const*HOCL*O - rxt_rates(:ncol,:, 179) = rxt_rates(:ncol,:, 179)*sol(:ncol,:, 54)*sol(:ncol,:, 98) ! rate_const*HOCL*OH - rxt_rates(:ncol,:, 180) = rxt_rates(:ncol,:, 180)*sol(:ncol,:, 94)*sol(:ncol,:, 8) ! rate_const*O1D*CCL4 - rxt_rates(:ncol,:, 181) = rxt_rates(:ncol,:, 181)*sol(:ncol,:, 94)*sol(:ncol,:, 9) ! rate_const*O1D*CF2CLBR - rxt_rates(:ncol,:, 182) = rxt_rates(:ncol,:, 182)*sol(:ncol,:, 94)*sol(:ncol,:, 11) ! rate_const*O1D*CFC11 - rxt_rates(:ncol,:, 183) = rxt_rates(:ncol,:, 183)*sol(:ncol,:, 94)*sol(:ncol,:, 12) ! rate_const*O1D*CFC113 - rxt_rates(:ncol,:, 184) = rxt_rates(:ncol,:, 184)*sol(:ncol,:, 94)*sol(:ncol,:, 13) ! rate_const*O1D*CFC114 - rxt_rates(:ncol,:, 185) = rxt_rates(:ncol,:, 185)*sol(:ncol,:, 94)*sol(:ncol,:, 14) ! rate_const*O1D*CFC115 - rxt_rates(:ncol,:, 186) = rxt_rates(:ncol,:, 186)*sol(:ncol,:, 94)*sol(:ncol,:, 15) ! rate_const*O1D*CFC12 - rxt_rates(:ncol,:, 187) = rxt_rates(:ncol,:, 187)*sol(:ncol,:, 94)*sol(:ncol,:, 49) ! rate_const*O1D*HCL - rxt_rates(:ncol,:, 188) = rxt_rates(:ncol,:, 188)*sol(:ncol,:, 94)*sol(:ncol,:, 49) ! rate_const*O1D*HCL + rxt_rates(:ncol,:, 179) = rxt_rates(:ncol,:, 179)*sol(:ncol,:, 54)*sol(:ncol,:, 99) ! rate_const*HOCL*OH + rxt_rates(:ncol,:, 180) = rxt_rates(:ncol,:, 180)*sol(:ncol,:, 95)*sol(:ncol,:, 8) ! rate_const*O1D*CCL4 + rxt_rates(:ncol,:, 181) = rxt_rates(:ncol,:, 181)*sol(:ncol,:, 95)*sol(:ncol,:, 9) ! rate_const*O1D*CF2CLBR + rxt_rates(:ncol,:, 182) = rxt_rates(:ncol,:, 182)*sol(:ncol,:, 95)*sol(:ncol,:, 11) ! rate_const*O1D*CFC11 + rxt_rates(:ncol,:, 183) = rxt_rates(:ncol,:, 183)*sol(:ncol,:, 95)*sol(:ncol,:, 12) ! rate_const*O1D*CFC113 + rxt_rates(:ncol,:, 184) = rxt_rates(:ncol,:, 184)*sol(:ncol,:, 95)*sol(:ncol,:, 13) ! rate_const*O1D*CFC114 + rxt_rates(:ncol,:, 185) = rxt_rates(:ncol,:, 185)*sol(:ncol,:, 95)*sol(:ncol,:, 14) ! rate_const*O1D*CFC115 + rxt_rates(:ncol,:, 186) = rxt_rates(:ncol,:, 186)*sol(:ncol,:, 95)*sol(:ncol,:, 15) ! rate_const*O1D*CFC12 + rxt_rates(:ncol,:, 187) = rxt_rates(:ncol,:, 187)*sol(:ncol,:, 95)*sol(:ncol,:, 49) ! rate_const*O1D*HCL + rxt_rates(:ncol,:, 188) = rxt_rates(:ncol,:, 188)*sol(:ncol,:, 95)*sol(:ncol,:, 49) ! rate_const*O1D*HCL rxt_rates(:ncol,:, 189) = rxt_rates(:ncol,:, 189)*sol(:ncol,:, 28)*sol(:ncol,:, 28) ! rate_const*M*CLO*CLO rxt_rates(:ncol,:, 190) = rxt_rates(:ncol,:, 190)*sol(:ncol,:, 27) ! rate_const*M*CL2O2 rxt_rates(:ncol,:, 191) = rxt_rates(:ncol,:, 191)*sol(:ncol,:, 3)*sol(:ncol,:, 17) ! rate_const*BR*CH2O - rxt_rates(:ncol,:, 192) = rxt_rates(:ncol,:, 192)*sol(:ncol,:, 3)*sol(:ncol,:, 89) ! rate_const*BR*HO2 + rxt_rates(:ncol,:, 192) = rxt_rates(:ncol,:, 192)*sol(:ncol,:, 3)*sol(:ncol,:, 90) ! rate_const*BR*HO2 rxt_rates(:ncol,:, 193) = rxt_rates(:ncol,:, 193)*sol(:ncol,:, 3)*sol(:ncol,:, 71) ! rate_const*BR*O3 rxt_rates(:ncol,:, 194) = rxt_rates(:ncol,:, 194)*sol(:ncol,:, 5)*sol(:ncol,:, 5) ! rate_const*BRO*BRO rxt_rates(:ncol,:, 195) = rxt_rates(:ncol,:, 195)*sol(:ncol,:, 5)*sol(:ncol,:, 28) ! rate_const*BRO*CLO rxt_rates(:ncol,:, 196) = rxt_rates(:ncol,:, 196)*sol(:ncol,:, 5)*sol(:ncol,:, 28) ! rate_const*BRO*CLO rxt_rates(:ncol,:, 197) = rxt_rates(:ncol,:, 197)*sol(:ncol,:, 5)*sol(:ncol,:, 28) ! rate_const*BRO*CLO - rxt_rates(:ncol,:, 198) = rxt_rates(:ncol,:, 198)*sol(:ncol,:, 5)*sol(:ncol,:, 89) ! rate_const*BRO*HO2 + rxt_rates(:ncol,:, 198) = rxt_rates(:ncol,:, 198)*sol(:ncol,:, 5)*sol(:ncol,:, 90) ! rate_const*BRO*HO2 rxt_rates(:ncol,:, 199) = rxt_rates(:ncol,:, 199)*sol(:ncol,:, 5)*sol(:ncol,:, 61) ! rate_const*BRO*NO rxt_rates(:ncol,:, 200) = rxt_rates(:ncol,:, 200)*sol(:ncol,:, 5)*sol(:ncol,:, 62) ! rate_const*M*BRO*NO2 rxt_rates(:ncol,:, 201) = rxt_rates(:ncol,:, 201)*sol(:ncol,:, 6)*sol(:ncol,:, 69) ! rate_const*BRONO2*O rxt_rates(:ncol,:, 202) = rxt_rates(:ncol,:, 202)*sol(:ncol,:, 5)*sol(:ncol,:, 69) ! rate_const*BRO*O - rxt_rates(:ncol,:, 203) = rxt_rates(:ncol,:, 203)*sol(:ncol,:, 5)*sol(:ncol,:, 98) ! rate_const*BRO*OH + rxt_rates(:ncol,:, 203) = rxt_rates(:ncol,:, 203)*sol(:ncol,:, 5)*sol(:ncol,:, 99) ! rate_const*BRO*OH rxt_rates(:ncol,:, 204) = rxt_rates(:ncol,:, 204)*sol(:ncol,:, 45)*sol(:ncol,:, 69) ! rate_const*HBR*O - rxt_rates(:ncol,:, 205) = rxt_rates(:ncol,:, 205)*sol(:ncol,:, 45)*sol(:ncol,:, 98) ! rate_const*HBR*OH + rxt_rates(:ncol,:, 205) = rxt_rates(:ncol,:, 205)*sol(:ncol,:, 45)*sol(:ncol,:, 99) ! rate_const*HBR*OH rxt_rates(:ncol,:, 206) = rxt_rates(:ncol,:, 206)*sol(:ncol,:, 53)*sol(:ncol,:, 69) ! rate_const*HOBR*O - rxt_rates(:ncol,:, 207) = rxt_rates(:ncol,:, 207)*sol(:ncol,:, 94)*sol(:ncol,:, 10) ! rate_const*O1D*CF3BR - rxt_rates(:ncol,:, 208) = rxt_rates(:ncol,:, 208)*sol(:ncol,:, 94)*sol(:ncol,:, 24) ! rate_const*O1D*CHBR3 - rxt_rates(:ncol,:, 209) = rxt_rates(:ncol,:, 209)*sol(:ncol,:, 94)*sol(:ncol,:, 42) ! rate_const*O1D*H2402 - rxt_rates(:ncol,:, 210) = rxt_rates(:ncol,:, 210)*sol(:ncol,:, 94)*sol(:ncol,:, 45) ! rate_const*O1D*HBR - rxt_rates(:ncol,:, 211) = rxt_rates(:ncol,:, 211)*sol(:ncol,:, 94)*sol(:ncol,:, 45) ! rate_const*O1D*HBR + rxt_rates(:ncol,:, 207) = rxt_rates(:ncol,:, 207)*sol(:ncol,:, 95)*sol(:ncol,:, 10) ! rate_const*O1D*CF3BR + rxt_rates(:ncol,:, 208) = rxt_rates(:ncol,:, 208)*sol(:ncol,:, 95)*sol(:ncol,:, 24) ! rate_const*O1D*CHBR3 + rxt_rates(:ncol,:, 209) = rxt_rates(:ncol,:, 209)*sol(:ncol,:, 95)*sol(:ncol,:, 42) ! rate_const*O1D*H2402 + rxt_rates(:ncol,:, 210) = rxt_rates(:ncol,:, 210)*sol(:ncol,:, 95)*sol(:ncol,:, 45) ! rate_const*O1D*HBR + rxt_rates(:ncol,:, 211) = rxt_rates(:ncol,:, 211)*sol(:ncol,:, 95)*sol(:ncol,:, 45) ! rate_const*O1D*HBR rxt_rates(:ncol,:, 212) = rxt_rates(:ncol,:, 212)*sol(:ncol,:, 39)*sol(:ncol,:, 23) ! rate_const*F*CH4 rxt_rates(:ncol,:, 213) = rxt_rates(:ncol,:, 213)*sol(:ncol,:, 39)*sol(:ncol,:, 41) ! rate_const*F*H2 - rxt_rates(:ncol,:, 214) = rxt_rates(:ncol,:, 214)*sol(:ncol,:, 39)*sol(:ncol,:, 102) ! rate_const*F*H2O + rxt_rates(:ncol,:, 214) = rxt_rates(:ncol,:, 214)*sol(:ncol,:, 39)*sol(:ncol,:, 103) ! rate_const*F*H2O rxt_rates(:ncol,:, 215) = rxt_rates(:ncol,:, 215)*sol(:ncol,:, 39)*sol(:ncol,:, 51) ! rate_const*F*HNO3 - rxt_rates(:ncol,:, 216) = rxt_rates(:ncol,:, 216)*sol(:ncol,:, 94)*sol(:ncol,:, 33) ! rate_const*O1D*COF2 - rxt_rates(:ncol,:, 217) = rxt_rates(:ncol,:, 217)*sol(:ncol,:, 94)*sol(:ncol,:, 34) ! rate_const*O1D*COFCL + rxt_rates(:ncol,:, 216) = rxt_rates(:ncol,:, 216)*sol(:ncol,:, 95)*sol(:ncol,:, 33) ! rate_const*O1D*COF2 + rxt_rates(:ncol,:, 217) = rxt_rates(:ncol,:, 217)*sol(:ncol,:, 95)*sol(:ncol,:, 34) ! rate_const*O1D*COFCL rxt_rates(:ncol,:, 218) = rxt_rates(:ncol,:, 218)*sol(:ncol,:, 16)*sol(:ncol,:, 25) ! rate_const*CH2BR2*CL - rxt_rates(:ncol,:, 219) = rxt_rates(:ncol,:, 219)*sol(:ncol,:, 16)*sol(:ncol,:, 98) ! rate_const*CH2BR2*OH + rxt_rates(:ncol,:, 219) = rxt_rates(:ncol,:, 219)*sol(:ncol,:, 16)*sol(:ncol,:, 99) ! rate_const*CH2BR2*OH rxt_rates(:ncol,:, 220) = rxt_rates(:ncol,:, 220)*sol(:ncol,:, 18)*sol(:ncol,:, 25) ! rate_const*CH3BR*CL - rxt_rates(:ncol,:, 221) = rxt_rates(:ncol,:, 221)*sol(:ncol,:, 18)*sol(:ncol,:, 98) ! rate_const*CH3BR*OH - rxt_rates(:ncol,:, 222) = rxt_rates(:ncol,:, 222)*sol(:ncol,:, 19)*sol(:ncol,:, 98) ! rate_const*CH3CCL3*OH + rxt_rates(:ncol,:, 221) = rxt_rates(:ncol,:, 221)*sol(:ncol,:, 18)*sol(:ncol,:, 99) ! rate_const*CH3BR*OH + rxt_rates(:ncol,:, 222) = rxt_rates(:ncol,:, 222)*sol(:ncol,:, 19)*sol(:ncol,:, 99) ! rate_const*CH3CCL3*OH rxt_rates(:ncol,:, 223) = rxt_rates(:ncol,:, 223)*sol(:ncol,:, 20)*sol(:ncol,:, 25) ! rate_const*CH3CL*CL - rxt_rates(:ncol,:, 224) = rxt_rates(:ncol,:, 224)*sol(:ncol,:, 20)*sol(:ncol,:, 98) ! rate_const*CH3CL*OH + rxt_rates(:ncol,:, 224) = rxt_rates(:ncol,:, 224)*sol(:ncol,:, 20)*sol(:ncol,:, 99) ! rate_const*CH3CL*OH rxt_rates(:ncol,:, 225) = rxt_rates(:ncol,:, 225)*sol(:ncol,:, 24)*sol(:ncol,:, 25) ! rate_const*CHBR3*CL - rxt_rates(:ncol,:, 226) = rxt_rates(:ncol,:, 226)*sol(:ncol,:, 24)*sol(:ncol,:, 98) ! rate_const*CHBR3*OH - rxt_rates(:ncol,:, 227) = rxt_rates(:ncol,:, 227)*sol(:ncol,:, 46)*sol(:ncol,:, 98) ! rate_const*HCFC141B*OH - rxt_rates(:ncol,:, 228) = rxt_rates(:ncol,:, 228)*sol(:ncol,:, 47)*sol(:ncol,:, 98) ! rate_const*HCFC142B*OH - rxt_rates(:ncol,:, 229) = rxt_rates(:ncol,:, 229)*sol(:ncol,:, 48)*sol(:ncol,:, 98) ! rate_const*HCFC22*OH - rxt_rates(:ncol,:, 230) = rxt_rates(:ncol,:, 230)*sol(:ncol,:, 94)*sol(:ncol,:, 16) ! rate_const*O1D*CH2BR2 - rxt_rates(:ncol,:, 231) = rxt_rates(:ncol,:, 231)*sol(:ncol,:, 94)*sol(:ncol,:, 18) ! rate_const*O1D*CH3BR - rxt_rates(:ncol,:, 232) = rxt_rates(:ncol,:, 232)*sol(:ncol,:, 94)*sol(:ncol,:, 46) ! rate_const*O1D*HCFC141B - rxt_rates(:ncol,:, 233) = rxt_rates(:ncol,:, 233)*sol(:ncol,:, 94)*sol(:ncol,:, 47) ! rate_const*O1D*HCFC142B - rxt_rates(:ncol,:, 234) = rxt_rates(:ncol,:, 234)*sol(:ncol,:, 94)*sol(:ncol,:, 48) ! rate_const*O1D*HCFC22 + rxt_rates(:ncol,:, 226) = rxt_rates(:ncol,:, 226)*sol(:ncol,:, 24)*sol(:ncol,:, 99) ! rate_const*CHBR3*OH + rxt_rates(:ncol,:, 227) = rxt_rates(:ncol,:, 227)*sol(:ncol,:, 46)*sol(:ncol,:, 99) ! rate_const*HCFC141B*OH + rxt_rates(:ncol,:, 228) = rxt_rates(:ncol,:, 228)*sol(:ncol,:, 47)*sol(:ncol,:, 99) ! rate_const*HCFC142B*OH + rxt_rates(:ncol,:, 229) = rxt_rates(:ncol,:, 229)*sol(:ncol,:, 48)*sol(:ncol,:, 99) ! rate_const*HCFC22*OH + rxt_rates(:ncol,:, 230) = rxt_rates(:ncol,:, 230)*sol(:ncol,:, 95)*sol(:ncol,:, 16) ! rate_const*O1D*CH2BR2 + rxt_rates(:ncol,:, 231) = rxt_rates(:ncol,:, 231)*sol(:ncol,:, 95)*sol(:ncol,:, 18) ! rate_const*O1D*CH3BR + rxt_rates(:ncol,:, 232) = rxt_rates(:ncol,:, 232)*sol(:ncol,:, 95)*sol(:ncol,:, 46) ! rate_const*O1D*HCFC141B + rxt_rates(:ncol,:, 233) = rxt_rates(:ncol,:, 233)*sol(:ncol,:, 95)*sol(:ncol,:, 47) ! rate_const*O1D*HCFC142B + rxt_rates(:ncol,:, 234) = rxt_rates(:ncol,:, 234)*sol(:ncol,:, 95)*sol(:ncol,:, 48) ! rate_const*O1D*HCFC22 rxt_rates(:ncol,:, 235) = rxt_rates(:ncol,:, 235)*sol(:ncol,:, 17)*sol(:ncol,:, 63) ! rate_const*CH2O*NO3 rxt_rates(:ncol,:, 236) = rxt_rates(:ncol,:, 236)*sol(:ncol,:, 17)*sol(:ncol,:, 69) ! rate_const*CH2O*O - rxt_rates(:ncol,:, 237) = rxt_rates(:ncol,:, 237)*sol(:ncol,:, 17)*sol(:ncol,:, 98) ! rate_const*CH2O*OH - rxt_rates(:ncol,:, 238) = rxt_rates(:ncol,:, 238)*sol(:ncol,:, 21)*sol(:ncol,:, 89) ! rate_const*CH3O2*HO2 + rxt_rates(:ncol,:, 237) = rxt_rates(:ncol,:, 237)*sol(:ncol,:, 17)*sol(:ncol,:, 99) ! rate_const*CH2O*OH + rxt_rates(:ncol,:, 238) = rxt_rates(:ncol,:, 238)*sol(:ncol,:, 21)*sol(:ncol,:, 90) ! rate_const*CH3O2*HO2 rxt_rates(:ncol,:, 239) = rxt_rates(:ncol,:, 239)*sol(:ncol,:, 21)*sol(:ncol,:, 61) ! rate_const*CH3O2*NO - rxt_rates(:ncol,:, 240) = rxt_rates(:ncol,:, 240)*sol(:ncol,:, 22)*sol(:ncol,:, 98) ! rate_const*CH3OOH*OH - rxt_rates(:ncol,:, 241) = rxt_rates(:ncol,:, 241)*sol(:ncol,:, 23)*sol(:ncol,:, 98) ! rate_const*CH4*OH - rxt_rates(:ncol,:, 242) = rxt_rates(:ncol,:, 242)*sol(:ncol,:, 94)*sol(:ncol,:, 23) ! rate_const*O1D*CH4 - rxt_rates(:ncol,:, 243) = rxt_rates(:ncol,:, 243)*sol(:ncol,:, 94)*sol(:ncol,:, 23) ! rate_const*O1D*CH4 - rxt_rates(:ncol,:, 244) = rxt_rates(:ncol,:, 244)*sol(:ncol,:, 94)*sol(:ncol,:, 23) ! rate_const*O1D*CH4 - rxt_rates(:ncol,:, 245) = rxt_rates(:ncol,:, 245)*sol(:ncol,:, 31)*sol(:ncol,:, 98) ! rate_const*CO*OH + rxt_rates(:ncol,:, 240) = rxt_rates(:ncol,:, 240)*sol(:ncol,:, 22)*sol(:ncol,:, 99) ! rate_const*CH3OOH*OH + rxt_rates(:ncol,:, 241) = rxt_rates(:ncol,:, 241)*sol(:ncol,:, 23)*sol(:ncol,:, 99) ! rate_const*CH4*OH + rxt_rates(:ncol,:, 242) = rxt_rates(:ncol,:, 242)*sol(:ncol,:, 95)*sol(:ncol,:, 23) ! rate_const*O1D*CH4 + rxt_rates(:ncol,:, 243) = rxt_rates(:ncol,:, 243)*sol(:ncol,:, 95)*sol(:ncol,:, 23) ! rate_const*O1D*CH4 + rxt_rates(:ncol,:, 244) = rxt_rates(:ncol,:, 244)*sol(:ncol,:, 95)*sol(:ncol,:, 23) ! rate_const*O1D*CH4 + rxt_rates(:ncol,:, 245) = rxt_rates(:ncol,:, 245)*sol(:ncol,:, 31)*sol(:ncol,:, 99) ! rate_const*CO*OH rxt_rates(:ncol,:, 246) = rxt_rates(:ncol,:, 246)*sol(:ncol,:, 35)*sol(:ncol,:, 63) ! rate_const*DMS*NO3 - rxt_rates(:ncol,:, 247) = rxt_rates(:ncol,:, 247)*sol(:ncol,:, 35)*sol(:ncol,:, 98) ! rate_const*DMS*OH - rxt_rates(:ncol,:, 248) = rxt_rates(:ncol,:, 248)*sol(:ncol,:, 73)*sol(:ncol,:, 69) ! rate_const*OCS*O - rxt_rates(:ncol,:, 249) = rxt_rates(:ncol,:, 249)*sol(:ncol,:, 73)*sol(:ncol,:, 98) ! rate_const*OCS*OH - rxt_rates(:ncol,:, 250) = rxt_rates(:ncol,:, 250)*sol(:ncol,:, 76)*sol(:ncol,:, 70) ! rate_const*S*O2 - rxt_rates(:ncol,:, 251) = rxt_rates(:ncol,:, 251)*sol(:ncol,:, 79)*sol(:ncol,:, 98) ! rate_const*M*SO2*OH - rxt_rates(:ncol,:, 252) = rxt_rates(:ncol,:, 252)*sol(:ncol,:, 76)*sol(:ncol,:, 71) ! rate_const*S*O3 - rxt_rates(:ncol,:, 253) = rxt_rates(:ncol,:, 253)*sol(:ncol,:, 78)*sol(:ncol,:, 5) ! rate_const*SO*BRO - rxt_rates(:ncol,:, 254) = rxt_rates(:ncol,:, 254)*sol(:ncol,:, 78)*sol(:ncol,:, 28) ! rate_const*SO*CLO - rxt_rates(:ncol,:, 255) = rxt_rates(:ncol,:, 255)*sol(:ncol,:, 76)*sol(:ncol,:, 98) ! rate_const*S*OH - rxt_rates(:ncol,:, 256) = rxt_rates(:ncol,:, 256)*sol(:ncol,:, 78)*sol(:ncol,:, 62) ! rate_const*SO*NO2 - rxt_rates(:ncol,:, 257) = rxt_rates(:ncol,:, 257)*sol(:ncol,:, 78)*sol(:ncol,:, 70) ! rate_const*SO*O2 - rxt_rates(:ncol,:, 258) = rxt_rates(:ncol,:, 258)*sol(:ncol,:, 78)*sol(:ncol,:, 71) ! rate_const*SO*O3 - rxt_rates(:ncol,:, 259) = rxt_rates(:ncol,:, 259)*sol(:ncol,:, 78)*sol(:ncol,:, 72) ! rate_const*SO*OCLO - rxt_rates(:ncol,:, 260) = rxt_rates(:ncol,:, 260)*sol(:ncol,:, 78)*sol(:ncol,:, 98) ! rate_const*SO*OH - rxt_rates(:ncol,:, 261) = rxt_rates(:ncol,:, 261)*sol(:ncol,:, 35)*sol(:ncol,:, 98) ! rate_const*DMS*OH - rxt_rates(:ncol,:, 262) = rxt_rates(:ncol,:, 262)*sol(:ncol,:, 80)*sol(:ncol,:, 102) ! rate_const*SO3*H2O - rxt_rates(:ncol,:, 263) = rxt_rates(:ncol,:, 263)*sol(:ncol,:, 89) ! rate_const*HO2 + rxt_rates(:ncol,:, 247) = rxt_rates(:ncol,:, 247)*sol(:ncol,:, 35)*sol(:ncol,:, 99) ! rate_const*DMS*OH + rxt_rates(:ncol,:, 248) = rxt_rates(:ncol,:, 248)*sol(:ncol,:, 74)*sol(:ncol,:, 69) ! rate_const*OCS*O + rxt_rates(:ncol,:, 249) = rxt_rates(:ncol,:, 249)*sol(:ncol,:, 74)*sol(:ncol,:, 99) ! rate_const*OCS*OH + rxt_rates(:ncol,:, 250) = rxt_rates(:ncol,:, 250)*sol(:ncol,:, 77)*sol(:ncol,:, 70) ! rate_const*S*O2 + rxt_rates(:ncol,:, 251) = rxt_rates(:ncol,:, 251)*sol(:ncol,:, 80)*sol(:ncol,:, 99) ! rate_const*M*SO2*OH + rxt_rates(:ncol,:, 252) = rxt_rates(:ncol,:, 252)*sol(:ncol,:, 77)*sol(:ncol,:, 71) ! rate_const*S*O3 + rxt_rates(:ncol,:, 253) = rxt_rates(:ncol,:, 253)*sol(:ncol,:, 79)*sol(:ncol,:, 5) ! rate_const*SO*BRO + rxt_rates(:ncol,:, 254) = rxt_rates(:ncol,:, 254)*sol(:ncol,:, 79)*sol(:ncol,:, 28) ! rate_const*SO*CLO + rxt_rates(:ncol,:, 255) = rxt_rates(:ncol,:, 255)*sol(:ncol,:, 77)*sol(:ncol,:, 99) ! rate_const*S*OH + rxt_rates(:ncol,:, 256) = rxt_rates(:ncol,:, 256)*sol(:ncol,:, 79)*sol(:ncol,:, 62) ! rate_const*SO*NO2 + rxt_rates(:ncol,:, 257) = rxt_rates(:ncol,:, 257)*sol(:ncol,:, 79)*sol(:ncol,:, 70) ! rate_const*SO*O2 + rxt_rates(:ncol,:, 258) = rxt_rates(:ncol,:, 258)*sol(:ncol,:, 79)*sol(:ncol,:, 71) ! rate_const*SO*O3 + rxt_rates(:ncol,:, 259) = rxt_rates(:ncol,:, 259)*sol(:ncol,:, 79)*sol(:ncol,:, 73) ! rate_const*SO*OCLO + rxt_rates(:ncol,:, 260) = rxt_rates(:ncol,:, 260)*sol(:ncol,:, 79)*sol(:ncol,:, 99) ! rate_const*SO*OH + rxt_rates(:ncol,:, 261) = rxt_rates(:ncol,:, 261)*sol(:ncol,:, 35)*sol(:ncol,:, 99) ! rate_const*DMS*OH + rxt_rates(:ncol,:, 262) = rxt_rates(:ncol,:, 262)*sol(:ncol,:, 81)*sol(:ncol,:, 103) ! rate_const*SO3*H2O + rxt_rates(:ncol,:, 263) = rxt_rates(:ncol,:, 263)*sol(:ncol,:, 90) ! rate_const*HO2 rxt_rates(:ncol,:, 264) = rxt_rates(:ncol,:, 264)*sol(:ncol,:, 57) ! rate_const*N2O5 rxt_rates(:ncol,:, 265) = rxt_rates(:ncol,:, 265)*sol(:ncol,:, 62) ! rate_const*NO2 rxt_rates(:ncol,:, 266) = rxt_rates(:ncol,:, 266)*sol(:ncol,:, 63) ! rate_const*NO3 @@ -291,33 +291,33 @@ subroutine set_rates( rxt_rates, sol, ncol ) rxt_rates(:ncol,:, 281) = rxt_rates(:ncol,:, 281)*sol(:ncol,:, 57) ! rate_const*N2O5 rxt_rates(:ncol,:, 282) = rxt_rates(:ncol,:, 282)*sol(:ncol,:, 29) ! rate_const*CLONO2 rxt_rates(:ncol,:, 283) = rxt_rates(:ncol,:, 283)*sol(:ncol,:, 29)*sol(:ncol,:, 49) ! rate_const*CLONO2*HCL - rxt_rates(:ncol,:, 284) = rxt_rates(:ncol,:, 284)*sol(:ncol,:, 101) ! rate_const*Op2P - rxt_rates(:ncol,:, 285) = rxt_rates(:ncol,:, 285)*sol(:ncol,:, 100) ! rate_const*Op2D - rxt_rates(:ncol,:, 286) = rxt_rates(:ncol,:, 286)*sol(:ncol,:, 101) ! rate_const*Op2P - rxt_rates(:ncol,:, 287) = rxt_rates(:ncol,:, 287)*sol(:ncol,:, 92)*sol(:ncol,:, 88) ! rate_const*NOp*e - rxt_rates(:ncol,:, 288) = rxt_rates(:ncol,:, 288)*sol(:ncol,:, 97)*sol(:ncol,:, 88) ! rate_const*O2p*e - rxt_rates(:ncol,:, 289) = rxt_rates(:ncol,:, 289)*sol(:ncol,:, 91)*sol(:ncol,:, 88) ! rate_const*N2p*e - rxt_rates(:ncol,:, 290) = rxt_rates(:ncol,:, 290)*sol(:ncol,:, 91)*sol(:ncol,:, 70) ! rate_const*N2p*O2 - rxt_rates(:ncol,:, 291) = rxt_rates(:ncol,:, 291)*sol(:ncol,:, 91)*sol(:ncol,:, 69) ! rate_const*N2p*O - rxt_rates(:ncol,:, 292) = rxt_rates(:ncol,:, 292)*sol(:ncol,:, 91)*sol(:ncol,:, 69) ! rate_const*N2p*O - rxt_rates(:ncol,:, 293) = rxt_rates(:ncol,:, 293)*sol(:ncol,:, 93)*sol(:ncol,:, 69) ! rate_const*Np*O - rxt_rates(:ncol,:, 294) = rxt_rates(:ncol,:, 294)*sol(:ncol,:, 93)*sol(:ncol,:, 70) ! rate_const*Np*O2 - rxt_rates(:ncol,:, 295) = rxt_rates(:ncol,:, 295)*sol(:ncol,:, 93)*sol(:ncol,:, 70) ! rate_const*Np*O2 - rxt_rates(:ncol,:, 296) = rxt_rates(:ncol,:, 296)*sol(:ncol,:, 97)*sol(:ncol,:, 55) ! rate_const*O2p*N - rxt_rates(:ncol,:, 297) = rxt_rates(:ncol,:, 297)*sol(:ncol,:, 97) ! rate_const*N2*O2p - rxt_rates(:ncol,:, 298) = rxt_rates(:ncol,:, 298)*sol(:ncol,:, 97)*sol(:ncol,:, 61) ! rate_const*O2p*NO - rxt_rates(:ncol,:, 299) = rxt_rates(:ncol,:, 299)*sol(:ncol,:, 99)*sol(:ncol,:, 32) ! rate_const*Op*CO2 - rxt_rates(:ncol,:, 300) = rxt_rates(:ncol,:, 300)*sol(:ncol,:, 99) ! rate_const*N2*Op - rxt_rates(:ncol,:, 301) = rxt_rates(:ncol,:, 301)*sol(:ncol,:, 99)*sol(:ncol,:, 90) ! rate_const*Op*N2D - rxt_rates(:ncol,:, 302) = rxt_rates(:ncol,:, 302)*sol(:ncol,:, 99)*sol(:ncol,:, 70) ! rate_const*Op*O2 - rxt_rates(:ncol,:, 303) = rxt_rates(:ncol,:, 303)*sol(:ncol,:, 100)*sol(:ncol,:, 88) ! rate_const*Op2D*e - rxt_rates(:ncol,:, 304) = rxt_rates(:ncol,:, 304)*sol(:ncol,:, 100) ! rate_const*N2*Op2D - rxt_rates(:ncol,:, 305) = rxt_rates(:ncol,:, 305)*sol(:ncol,:, 100)*sol(:ncol,:, 69) ! rate_const*Op2D*O - rxt_rates(:ncol,:, 306) = rxt_rates(:ncol,:, 306)*sol(:ncol,:, 100)*sol(:ncol,:, 70) ! rate_const*Op2D*O2 - rxt_rates(:ncol,:, 307) = rxt_rates(:ncol,:, 307)*sol(:ncol,:, 101)*sol(:ncol,:, 88) ! rate_const*Op2P*e - rxt_rates(:ncol,:, 308) = rxt_rates(:ncol,:, 308)*sol(:ncol,:, 101)*sol(:ncol,:, 88) ! rate_const*Op2P*e - rxt_rates(:ncol,:, 309) = rxt_rates(:ncol,:, 309)*sol(:ncol,:, 101) ! rate_const*N2*Op2P - rxt_rates(:ncol,:, 310) = rxt_rates(:ncol,:, 310)*sol(:ncol,:, 101) ! rate_const*N2*Op2P - rxt_rates(:ncol,:, 311) = rxt_rates(:ncol,:, 311)*sol(:ncol,:, 101)*sol(:ncol,:, 69) ! rate_const*Op2P*O + rxt_rates(:ncol,:, 284) = rxt_rates(:ncol,:, 284)*sol(:ncol,:, 102) ! rate_const*Op2P + rxt_rates(:ncol,:, 285) = rxt_rates(:ncol,:, 285)*sol(:ncol,:, 101) ! rate_const*Op2D + rxt_rates(:ncol,:, 286) = rxt_rates(:ncol,:, 286)*sol(:ncol,:, 102) ! rate_const*Op2P + rxt_rates(:ncol,:, 287) = rxt_rates(:ncol,:, 287)*sol(:ncol,:, 93)*sol(:ncol,:, 89) ! rate_const*NOp*e + rxt_rates(:ncol,:, 288) = rxt_rates(:ncol,:, 288)*sol(:ncol,:, 98)*sol(:ncol,:, 89) ! rate_const*O2p*e + rxt_rates(:ncol,:, 289) = rxt_rates(:ncol,:, 289)*sol(:ncol,:, 92)*sol(:ncol,:, 89) ! rate_const*N2p*e + rxt_rates(:ncol,:, 290) = rxt_rates(:ncol,:, 290)*sol(:ncol,:, 92)*sol(:ncol,:, 70) ! rate_const*N2p*O2 + rxt_rates(:ncol,:, 291) = rxt_rates(:ncol,:, 291)*sol(:ncol,:, 92)*sol(:ncol,:, 69) ! rate_const*N2p*O + rxt_rates(:ncol,:, 292) = rxt_rates(:ncol,:, 292)*sol(:ncol,:, 92)*sol(:ncol,:, 69) ! rate_const*N2p*O + rxt_rates(:ncol,:, 293) = rxt_rates(:ncol,:, 293)*sol(:ncol,:, 94)*sol(:ncol,:, 69) ! rate_const*Np*O + rxt_rates(:ncol,:, 294) = rxt_rates(:ncol,:, 294)*sol(:ncol,:, 94)*sol(:ncol,:, 70) ! rate_const*Np*O2 + rxt_rates(:ncol,:, 295) = rxt_rates(:ncol,:, 295)*sol(:ncol,:, 94)*sol(:ncol,:, 70) ! rate_const*Np*O2 + rxt_rates(:ncol,:, 296) = rxt_rates(:ncol,:, 296)*sol(:ncol,:, 98)*sol(:ncol,:, 55) ! rate_const*O2p*N + rxt_rates(:ncol,:, 297) = rxt_rates(:ncol,:, 297)*sol(:ncol,:, 98) ! rate_const*N2*O2p + rxt_rates(:ncol,:, 298) = rxt_rates(:ncol,:, 298)*sol(:ncol,:, 98)*sol(:ncol,:, 61) ! rate_const*O2p*NO + rxt_rates(:ncol,:, 299) = rxt_rates(:ncol,:, 299)*sol(:ncol,:, 100)*sol(:ncol,:, 32) ! rate_const*Op*CO2 + rxt_rates(:ncol,:, 300) = rxt_rates(:ncol,:, 300)*sol(:ncol,:, 100) ! rate_const*N2*Op + rxt_rates(:ncol,:, 301) = rxt_rates(:ncol,:, 301)*sol(:ncol,:, 100)*sol(:ncol,:, 91) ! rate_const*Op*N2D + rxt_rates(:ncol,:, 302) = rxt_rates(:ncol,:, 302)*sol(:ncol,:, 100)*sol(:ncol,:, 70) ! rate_const*Op*O2 + rxt_rates(:ncol,:, 303) = rxt_rates(:ncol,:, 303)*sol(:ncol,:, 101)*sol(:ncol,:, 89) ! rate_const*Op2D*e + rxt_rates(:ncol,:, 304) = rxt_rates(:ncol,:, 304)*sol(:ncol,:, 101) ! rate_const*N2*Op2D + rxt_rates(:ncol,:, 305) = rxt_rates(:ncol,:, 305)*sol(:ncol,:, 101)*sol(:ncol,:, 69) ! rate_const*Op2D*O + rxt_rates(:ncol,:, 306) = rxt_rates(:ncol,:, 306)*sol(:ncol,:, 101)*sol(:ncol,:, 70) ! rate_const*Op2D*O2 + rxt_rates(:ncol,:, 307) = rxt_rates(:ncol,:, 307)*sol(:ncol,:, 102)*sol(:ncol,:, 89) ! rate_const*Op2P*e + rxt_rates(:ncol,:, 308) = rxt_rates(:ncol,:, 308)*sol(:ncol,:, 102)*sol(:ncol,:, 89) ! rate_const*Op2P*e + rxt_rates(:ncol,:, 309) = rxt_rates(:ncol,:, 309)*sol(:ncol,:, 102) ! rate_const*N2*Op2P + rxt_rates(:ncol,:, 310) = rxt_rates(:ncol,:, 310)*sol(:ncol,:, 102) ! rate_const*N2*Op2P + rxt_rates(:ncol,:, 311) = rxt_rates(:ncol,:, 311)*sol(:ncol,:, 102)*sol(:ncol,:, 69) ! rate_const*Op2P*O end subroutine set_rates end module mo_rxt_rates_conv diff --git a/src/chemistry/pp_waccm_ma_mam5/mo_sim_dat.F90 b/src/chemistry/pp_waccm_ma_mam5/mo_sim_dat.F90 index 4b884922d5..adb157e52e 100644 --- a/src/chemistry/pp_waccm_ma_mam5/mo_sim_dat.F90 +++ b/src/chemistry/pp_waccm_ma_mam5/mo_sim_dat.F90 @@ -31,11 +31,12 @@ subroutine set_sim_dat is_scalar = .false. is_vector = .true. - clscnt(:) = (/ 0, 0, 0, 102, 0 /) + clscnt(:) = (/ 1, 0, 0, 102, 0 /) + cls_rxt_cnt(:,1) = (/ 0, 0, 0, 1 /) cls_rxt_cnt(:,4) = (/ 8, 112, 191, 102 /) - solsym(:102) = (/ 'bc_a1 ','bc_a4 ','BR ','BRCL ','BRO ', & + solsym(:103) = (/ 'bc_a1 ','bc_a4 ','BR ','BRCL ','BRO ', & 'BRONO2 ','BRY ','CCL4 ','CF2CLBR ','CF3BR ', & 'CFC11 ','CFC113 ','CFC114 ','CFC115 ','CFC12 ', & 'CH2BR2 ','CH2O ','CH3BR ','CH3CCL3 ','CH3CL ', & @@ -49,15 +50,15 @@ subroutine set_sim_dat 'N2O ','N2O5 ','ncl_a1 ','ncl_a2 ','ncl_a3 ', & 'NO ','NO2 ','NO3 ','num_a1 ','num_a2 ', & 'num_a3 ','num_a4 ','num_a5 ','O ','O2 ', & - 'O3 ','OCLO ','OCS ','pom_a1 ','pom_a4 ', & - 'S ','SF6 ','SO ','SO2 ','SO3 ', & - 'so4_a1 ','so4_a2 ','so4_a3 ','so4_a5 ','soa_a1 ', & - 'soa_a2 ','SOAG ','e ','HO2 ','N2D ', & - 'N2p ','NOp ','Np ','O1D ','O2_1D ', & - 'O2_1S ','O2p ','OH ','Op ','Op2D ', & - 'Op2P ','H2O ' /) + 'O3 ','O3S ','OCLO ','OCS ','pom_a1 ', & + 'pom_a4 ','S ','SF6 ','SO ','SO2 ', & + 'SO3 ','so4_a1 ','so4_a2 ','so4_a3 ','so4_a5 ', & + 'soa_a1 ','soa_a2 ','SOAG ','e ','HO2 ', & + 'N2D ','N2p ','NOp ','Np ','O1D ', & + 'O2_1D ','O2_1S ','O2p ','OH ','Op ', & + 'Op2D ','Op2P ','H2O ' /) - adv_mass(:102) = (/ 12.011000_r8, 12.011000_r8, 79.904000_r8, 115.356700_r8, 95.903400_r8, & + adv_mass(:103) = (/ 12.011000_r8, 12.011000_r8, 79.904000_r8, 115.356700_r8, 95.903400_r8, & 141.908940_r8, 99.716850_r8, 153.821800_r8, 165.364506_r8, 148.910210_r8, & 137.367503_r8, 187.375310_r8, 170.921013_r8, 154.466716_r8, 120.913206_r8, & 173.833800_r8, 30.025200_r8, 94.937200_r8, 133.402300_r8, 50.485900_r8, & @@ -71,15 +72,15 @@ subroutine set_sim_dat 44.012880_r8, 108.010480_r8, 58.442468_r8, 58.442468_r8, 58.442468_r8, & 30.006140_r8, 46.005540_r8, 62.004940_r8, 1.007400_r8, 1.007400_r8, & 1.007400_r8, 1.007400_r8, 1.007400_r8, 15.999400_r8, 31.998800_r8, & - 47.998200_r8, 67.451500_r8, 60.076400_r8, 12.011000_r8, 12.011000_r8, & - 32.066000_r8, 146.056419_r8, 48.065400_r8, 64.064800_r8, 80.064200_r8, & - 115.107340_r8, 115.107340_r8, 115.107340_r8, 115.107340_r8, 12.011000_r8, & - 12.011000_r8, 12.011000_r8, 0.548567E-03_r8, 33.006200_r8, 14.006740_r8, & - 28.013480_r8, 30.006140_r8, 14.006740_r8, 15.999400_r8, 31.998800_r8, & - 31.998800_r8, 31.998800_r8, 17.006800_r8, 15.999400_r8, 15.999400_r8, & - 15.999400_r8, 18.014200_r8 /) + 47.998200_r8, 47.998200_r8, 67.451500_r8, 60.076400_r8, 12.011000_r8, & + 12.011000_r8, 32.066000_r8, 146.056419_r8, 48.065400_r8, 64.064800_r8, & + 80.064200_r8, 115.107340_r8, 115.107340_r8, 115.107340_r8, 115.107340_r8, & + 12.011000_r8, 12.011000_r8, 12.011000_r8, 0.548567E-03_r8, 33.006200_r8, & + 14.006740_r8, 28.013480_r8, 30.006140_r8, 14.006740_r8, 15.999400_r8, & + 31.998800_r8, 31.998800_r8, 31.998800_r8, 17.006800_r8, 15.999400_r8, & + 15.999400_r8, 15.999400_r8, 18.014200_r8 /) - crb_mass(:102) = (/ 12.011000_r8, 12.011000_r8, 0.000000_r8, 0.000000_r8, 0.000000_r8, & + crb_mass(:103) = (/ 12.011000_r8, 12.011000_r8, 0.000000_r8, 0.000000_r8, 0.000000_r8, & 0.000000_r8, 0.000000_r8, 12.011000_r8, 12.011000_r8, 12.011000_r8, & 12.011000_r8, 24.022000_r8, 24.022000_r8, 24.022000_r8, 12.011000_r8, & 12.011000_r8, 12.011000_r8, 12.011000_r8, 24.022000_r8, 12.011000_r8, & @@ -93,16 +94,17 @@ subroutine set_sim_dat 0.000000_r8, 0.000000_r8, 0.000000_r8, 0.000000_r8, 0.000000_r8, & 0.000000_r8, 0.000000_r8, 0.000000_r8, 0.000000_r8, 0.000000_r8, & 0.000000_r8, 0.000000_r8, 0.000000_r8, 0.000000_r8, 0.000000_r8, & - 0.000000_r8, 0.000000_r8, 12.011000_r8, 12.011000_r8, 12.011000_r8, & + 0.000000_r8, 0.000000_r8, 0.000000_r8, 12.011000_r8, 12.011000_r8, & + 12.011000_r8, 0.000000_r8, 0.000000_r8, 0.000000_r8, 0.000000_r8, & 0.000000_r8, 0.000000_r8, 0.000000_r8, 0.000000_r8, 0.000000_r8, & - 0.000000_r8, 0.000000_r8, 0.000000_r8, 0.000000_r8, 12.011000_r8, & - 12.011000_r8, 12.011000_r8, 0.000000_r8, 0.000000_r8, 0.000000_r8, & + 12.011000_r8, 12.011000_r8, 12.011000_r8, 0.000000_r8, 0.000000_r8, & 0.000000_r8, 0.000000_r8, 0.000000_r8, 0.000000_r8, 0.000000_r8, & 0.000000_r8, 0.000000_r8, 0.000000_r8, 0.000000_r8, 0.000000_r8, & - 0.000000_r8, 0.000000_r8 /) + 0.000000_r8, 0.000000_r8, 0.000000_r8 /) fix_mass(: 2) = (/ 0.00000000_r8, 28.0134800_r8 /) + clsmap(: 1,1) = (/ 72 /) clsmap(:102,4) = (/ 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, & @@ -110,10 +112,10 @@ subroutine set_sim_dat 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 /) + 71, 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 /) permute(:102,4) = (/ 1, 2, 97, 45, 101, 62, 3, 27, 34, 35, & 29, 36, 30, 37, 31, 58, 86, 63, 32, 54, & diff --git a/src/control/cam_control_mod.F90 b/src/control/cam_control_mod.F90 index ce6b3deaad..3d954f68ce 100644 --- a/src/control/cam_control_mod.F90 +++ b/src/control/cam_control_mod.F90 @@ -33,8 +33,9 @@ module cam_control_mod logical, protected :: ideal_phys ! true => run Held-Suarez (1994) physics logical, protected :: kessler_phys ! true => run Kessler physics logical, protected :: tj2016_phys ! true => run tj2016 physics +logical, protected :: frierson_phys ! true => run frierson physics logical, protected :: simple_phys ! true => adiabatic or ideal_phys or kessler_phys - ! or tj2016 + ! or tj2016 or frierson logical, protected :: aqua_planet ! Flag to run model in "aqua planet" mode logical, protected :: moist_physics ! true => moist physics enabled, i.e., ! (.not. ideal_phys) .and. (.not. adiabatic) @@ -135,8 +136,9 @@ subroutine cam_ctrl_set_physics_type(phys_package) ideal_phys = trim(phys_package) == 'held_suarez' kessler_phys = trim(phys_package) == 'kessler' tj2016_phys = trim(phys_package) == 'tj2016' + frierson_phys = trim(phys_package) == 'grayrad' - simple_phys = adiabatic .or. ideal_phys .or. kessler_phys .or. tj2016_phys + simple_phys = adiabatic .or. ideal_phys .or. kessler_phys .or. tj2016_phys .or. frierson_phys moist_physics = .not. (adiabatic .or. ideal_phys) @@ -154,6 +156,8 @@ subroutine cam_ctrl_set_physics_type(phys_package) write(iulog,*) 'Run model with Kessler warm-rain physics forcing' else if (tj2016_phys) then write(iulog,*) 'Run model with Thatcher-Jablonowski (2016) physics forcing (moist Held-Suarez)' + else if (frierson_phys) then + write(iulog,*) 'Run model with Frierson (2006) physics' end if end if diff --git a/src/control/cam_history.F90 b/src/control/cam_history.F90 index 677544bdc3..4cafd3d6c1 100644 --- a/src/control/cam_history.F90 +++ b/src/control/cam_history.F90 @@ -2818,7 +2818,18 @@ subroutine fldlst () do f=nflds(t)-1,1,-1 do ff=1,f - if (tape(t)%hlist(ff)%field%name > tape(t)%hlist(ff+1)%field%name) then + if (tape(t)%hlist(ff)%field%numlev > tape(t)%hlist(ff+1)%field%numlev) then + tmp = tape(t)%hlist(ff) + tape(t)%hlist(ff ) = tape(t)%hlist(ff+1) + tape(t)%hlist(ff+1) = tmp + end if + + end do + + do ff=1,f + + if ((tape(t)%hlist(ff)%field%numlev == tape(t)%hlist(ff+1)%field%numlev) .and. & + (tape(t)%hlist(ff)%field%name > tape(t)%hlist(ff+1)%field%name)) then tmp = tape(t)%hlist(ff) tape(t)%hlist(ff ) = tape(t)%hlist(ff+1) @@ -4992,7 +5003,6 @@ subroutine h_global (f, t) use cam_history_support, only: dim_index_2d use shr_reprosum_mod, only: shr_reprosum_calc use spmd_utils, only: mpicom - use shr_const_mod, only: PI => SHR_CONST_PI ! !----------------------------------------------------------------------- ! diff --git a/src/control/runtime_opts.F90 b/src/control/runtime_opts.F90 index f09554244d..3d4cb35c95 100644 --- a/src/control/runtime_opts.F90 +++ b/src/control/runtime_opts.F90 @@ -91,11 +91,15 @@ subroutine read_namelist(nlfilename, single_column, scmlat, scmlon) use rate_diags, only: rate_diags_readnl use tracers, only: tracers_readnl use nudging, only: nudging_readnl +#if ( defined SIMPLE ) + use frierson_cam, only: frierson_readnl +#endif use dyn_comp, only: dyn_readnl use ionosphere_interface,only: ionosphere_readnl use qneg_module, only: qneg_readnl use lunar_tides, only: lunar_tides_readnl + use hemco_interface, only: hemco_readnl use upper_bc, only: ubc_readnl use cam_budget, only: cam_budget_readnl use phys_grid_ctem, only: phys_grid_ctem_readnl @@ -195,10 +199,14 @@ subroutine read_namelist(nlfilename, single_column, scmlat, scmlon) call rate_diags_readnl(nlfilename) call scam_readnl(nlfilename, single_column, scmlat, scmlon) call nudging_readnl(nlfilename) +#if ( defined SIMPLE ) + call frierson_readnl(nlfilename) +#endif call dyn_readnl(nlfilename) call ionosphere_readnl(nlfilename) call qneg_readnl(nlfilename) + call hemco_readnl(nlfilename) call cam_budget_readnl(nlfilename) call phys_grid_ctem_readnl(nlfilename) diff --git a/src/dynamics/se/dycore/fvm_consistent_se_cslam.F90 b/src/dynamics/se/dycore/fvm_consistent_se_cslam.F90 index ede1f44059..b5bcebd845 100644 --- a/src/dynamics/se/dycore/fvm_consistent_se_cslam.F90 +++ b/src/dynamics/se/dycore/fvm_consistent_se_cslam.F90 @@ -44,7 +44,7 @@ subroutine run_consistent_se_cslam(elem,fvm,hybrid,dt_fvm,tl,nets,nete,hvcoord,& use thread_mod , only: vert_num_threads, omp_set_nested implicit none type (element_t) , intent(inout) :: elem(:) - type (fvm_struct) , intent(inout) :: fvm(:) + type (fvm_struct), target , intent(inout) :: fvm(:) type (hybrid_t) , intent(in) :: hybrid ! distributed parallel structure (shared) type (TimeLevel_t) , intent(in) :: tl ! time level struct type (hvcoord_t) , intent(in) :: hvcoord @@ -71,7 +71,9 @@ subroutine run_consistent_se_cslam(elem,fvm,hybrid,dt_fvm,tl,nets,nete,hvcoord,& integer :: region_num_threads logical :: inJetCall logical :: ActiveJetThread - + + real(r8), pointer :: fcube(:,:,:,:) + real(r8), pointer :: spherecentroid(:,:,:) llimiter = .true. @@ -152,22 +154,26 @@ subroutine run_consistent_se_cslam(elem,fvm,hybrid,dt_fvm,tl,nets,nete,hvcoord,& !call t_stopf('fvm:orthogonal_swept_areas') do ie=nets,nete + ! Intel compiler version 2023.0.0 on derecho had significant slowdown on subroutine interface without + ! these pointers. + fcube => fvm(ie)%c(:,:,:,:) + spherecentroid => fvm(ie)%spherecentroid(:,1-nhe:nc+nhe,1-nhe:nc+nhe) do k=kmin,kmax - !call t_startf('fvm:tracers_reconstruct') - call reconstruction(fvm(ie)%c(:,:,:,:),nlev,k,& + !call t_startf('FVM:tracers_reconstruct') + call reconstruction(fcube,nlev,k,& ctracer(:,:,:,:),irecons_tracer,llimiter,ntrac,& nc,nhe,nhr,nhc,nht,ns,nhr+(nhe-1),& fvm(ie)%jx_min,fvm(ie)%jx_max,fvm(ie)%jy_min,fvm(ie)%jy_max,& fvm(ie)%cubeboundary,fvm(ie)%halo_interp_weight,fvm(ie)%ibase,& - fvm(ie)%spherecentroid(:,1-nhe:nc+nhe,1-nhe:nc+nhe),& + spherecentroid,& fvm(ie)%recons_metrics,fvm(ie)%recons_metrics_integral,& fvm(ie)%rot_matrix,fvm(ie)%centroid_stretch,& fvm(ie)%vertex_recons_weights,fvm(ie)%vtx_cart,& irecons_tracer_lev(k)) - !call t_stopf('fvm:tracers_reconstruct') - !call t_startf('fvm:swept_flux') - call swept_flux(elem(ie),fvm(ie),k,ctracer,irecons_tracer_lev(k),gsweights,gspts) - !call t_stopf('fvm:swept_flux') + !call t_stopf('FVM:tracers_reconstruct') + !call t_startf('fvm:swept_flux') + call swept_flux(elem(ie),fvm(ie),k,ctracer,irecons_tracer_lev(k),gsweights,gspts) + !call t_stopf('fvm:swept_flux') end do end do ! diff --git a/src/physics/cam/gw_drag.F90 b/src/physics/cam/gw_drag.F90 index 9788ef79ab..0f48e661af 100644 --- a/src/physics/cam/gw_drag.F90 +++ b/src/physics/cam/gw_drag.F90 @@ -72,7 +72,7 @@ module gw_drag ! Factor for SH orographic waves. real(r8) :: gw_oro_south_fac = 1._r8 - + ! Frontogenesis function critical threshold. real(r8) :: frontgfc = unset_r8 @@ -136,9 +136,6 @@ module gw_drag type(BeresSourceDesc) :: beres_dp_desc type(BeresSourceDesc) :: beres_sh_desc - ! Width of gaussian used to create frontogenesis tau profile [m/s]. - real(r8), parameter :: front_gaussian_width = 30._r8 - ! Frontogenesis wave settings. type(CMSourceDesc) :: cm_desc type(CMSourceDesc) :: cm_igw_desc @@ -183,12 +180,15 @@ module gw_drag character(len=1), parameter :: beres_dp_pf = "B" character(len=1), parameter :: beres_sh_pf = "S" - ! namelist + ! namelist logical :: history_amwg ! output the variables used by the AMWG diag package logical :: gw_lndscl_sgh = .true. ! scale SGH by land frac real(r8) :: gw_prndl = 0.25_r8 real(r8) :: gw_qbo_hdepth_scaling = 1._r8 ! heating depth scaling factor + ! Width of gaussian used to create frontogenesis tau profile [m/s]. + real(r8) :: front_gaussian_width = -huge(1._r8) + logical :: gw_top_taper=.false. real(r8), pointer :: vramp(:)=>null() @@ -232,7 +232,7 @@ subroutine gw_drag_readnl(nlfile) rdg_gamma_cd_llb, trpd_leewv_rdg_gamma, bnd_rdggm, & gw_oro_south_fac, gw_limit_tau_without_eff, & gw_lndscl_sgh, gw_prndl, gw_apply_tndmax, gw_qbo_hdepth_scaling, & - gw_top_taper + gw_top_taper, front_gaussian_width !---------------------------------------------------------------------- if (use_simple_phys) return @@ -333,6 +333,8 @@ subroutine gw_drag_readnl(nlfile) call mpi_bcast(gw_drag_file_sh, len(gw_drag_file_sh), mpi_character, mstrid, mpicom, ierr) if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: gw_drag_file_sh") + call mpi_bcast(front_gaussian_width, 1, mpi_real8, mstrid, mpicom, ierr) + if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: front_gaussian_width") ! Check if fcrit2 was set. call shr_assert(fcrit2 /= unset_r8, & @@ -379,7 +381,7 @@ subroutine gw_init() ! temporary for restart with ridge scheme use cam_initfiles, only: bnd_topo - + use cam_pio_utils, only: cam_pio_openfile use cam_grid_support, only: cam_grid_check, cam_grid_id use cam_grid_support, only: cam_grid_get_dim_names @@ -539,7 +541,7 @@ subroutine gw_init() ! Initialize subordinate modules. call gw_common_init(pver,& - tau_0_ubc, ktop, gravit, rair, alpha, gw_prndl, & + tau_0_ubc, ktop, gravit, rair, alpha, gw_prndl, & gw_qbo_hdepth_scaling, errstring ) call shr_assert(trim(errstring) == "", "gw_common_init: "//errstring// & errMsg(__FILE__, __LINE__)) @@ -551,7 +553,7 @@ subroutine gw_init() &but effgw_oro was not set.") end if end if - + if (use_gw_oro .or. use_gw_rdg_beta .or. use_gw_rdg_gamma) then sgh_idx = pbuf_get_index('SGH') @@ -611,7 +613,7 @@ subroutine gw_init() ! Try to open topo file here. This workaround will not be needed ! once the refactored initialization sequence is on trunk. - + allocate(fh_topo) ! Error exit is from getfil if file not found. call getfil(bnd_topo, bnd_topo_loc) @@ -627,12 +629,12 @@ subroutine gw_init() rdg_mxdis(pcols,prdg,begchunk:endchunk), & rdg_anixy(pcols,prdg,begchunk:endchunk), & rdg_angll(pcols,prdg,begchunk:endchunk) ) - + call infld('GBXAR', fh_topo, dim1name, dim2name, 1, pcols, & begchunk, endchunk, rdg_gbxar, found, gridname='physgrid') if (.not. found) call endrun(sub//': ERROR: GBXAR not found on topo file') rdg_gbxar = rdg_gbxar * (rearth/1000._r8)*(rearth/1000._r8) ! transform to km^2 - + call infld('HWDTH', fh_topo, dim1name, 'nrdg', dim2name, 1, pcols, & 1, prdg, begchunk, endchunk, rdg_hwdth, found, gridname='physgrid') if (.not. found) call endrun(sub//': ERROR: HWDTH not found on topo file') @@ -707,7 +709,7 @@ subroutine gw_init() 'interface geopotential heights in GW code ' ) call addfld('ZMGW', (/ 'lev' /) , 'A' ,'m' , & 'midlayer geopotential heights in GW code ' ) - + call addfld('TAUM1_DIAG' , (/ 'ilev' /) , 'I' ,'N/m2' , & 'Ridge based momentum flux profile') call addfld('TAU1RDGBETAM' , (/ 'ilev' /) , 'I' ,'N/m2' , & @@ -749,7 +751,7 @@ subroutine gw_init() if (effgw_rdg_gamma == unset_r8) then call endrun(sub//": ERROR: Anisotropic OGW enabled, but effgw_rdg_gamma was not set.") end if - + call getfil(bnd_rdggm, bnd_rdggm_loc, iflag=1, lexist=found) if (found) then call cam_pio_openfile(fh_rdggm, bnd_rdggm_loc, PIO_NOWRITE) @@ -793,7 +795,7 @@ subroutine gw_init() call infld('ANGLL', fh_rdggm, dim1name, 'nrdg', dim2name, 1, pcols, & 1, prdg, begchunk, endchunk, rdg_angllg, found, gridname='physgrid') if (.not. found) call endrun(sub//': ERROR: ANGLL not found on bnd_rdggm') - + call pio_closefile(fh_rdggm) call addfld ('TAU1RDGGAMMAM' , (/ 'ilev' /) , 'I' ,'N/m2' , & @@ -1365,7 +1367,7 @@ subroutine gw_tend(state, pbuf, dt, ptend, cam_in, flx_heat) real(r8), parameter :: degree2radian = pi/180._r8 real(r8), parameter :: al0 = 82.5_r8 * degree2radian real(r8), parameter :: dlat0 = 5.0_r8 * degree2radian - + ! effective gw diffusivity at interfaces needed for output real(r8) :: egwdffi(state%ncol,pver+1) ! sum from the two types of spectral GW @@ -1451,7 +1453,7 @@ subroutine gw_tend(state, pbuf, dt, ptend, cam_in, flx_heat) ! Totals that accumulate over different sources. egwdffi_tot = 0._r8 flx_heat = 0._r8 - + if (use_gw_convect_dp) then !------------------------------------------------------------------ ! Convective gravity waves (Beres scheme, deep). @@ -1802,7 +1804,7 @@ subroutine gw_tend(state, pbuf, dt, ptend, cam_in, flx_heat) ! Efficiency of gravity wave momentum transfer. ! Take into account that wave sources are only over land. call pbuf_get_field(pbuf, sgh_idx, sgh) - + if (gw_lndscl_sgh) then where (cam_in%landfrac(:ncol) >= epsilon(1._r8)) effgw = effgw_oro * cam_in%landfrac(:ncol) @@ -1969,7 +1971,7 @@ subroutine gw_tend(state, pbuf, dt, ptend, cam_in, flx_heat) ! Write totals to history file. call outfld('EKGW', egwdffi_tot , ncol, lchnk) call outfld('TTGW', ptend%s/cpairv(:,:,lchnk), pcols, lchnk) - + call outfld('UTGW_TOTAL', ptend%u, pcols, lchnk) call outfld('VTGW_TOTAL', ptend%v, pcols, lchnk) @@ -2143,7 +2145,7 @@ subroutine gw_rdg_calc( & ! initialize accumulated momentum fluxes and tendencies taurx = 0._r8 - taury = 0._r8 + taury = 0._r8 ttrdg = 0._r8 utrdg = 0._r8 vtrdg = 0._r8 @@ -2151,36 +2153,36 @@ subroutine gw_rdg_calc( & do nn = 1, n_rdg kwvrdg = 0.001_r8 / ( hwdth(:,nn) + 0.001_r8 ) ! this cant be done every time step !!! - isoflag = 0 + isoflag = 0 effgw = effgw_rdg * ( hwdth(1:ncol,nn)* clngt(1:ncol,nn) ) / gbxar(1:ncol) effgw = min( effgw_rdg_max , effgw ) call gw_rdg_src(ncol, band_oro, p, & u, v, t, mxdis(:,nn), angll(:,nn), anixy(:,nn), kwvrdg, isoflag, zi, nm, & - src_level, tend_level, bwv_level, tlb_level, tau, ubm, ubi, xv, yv, & + src_level, tend_level, bwv_level, tlb_level, tau, ubm, ubi, xv, yv, & ubmsrc, usrc, vsrc, nsrc, rsrc, m2src, tlb, bwv, Fr1, Fr2, Frx, c) call gw_rdg_belowpeak(ncol, band_oro, rdg_cd_llb, & - t, mxdis(:,nn), anixy(:,nn), kwvrdg, & + t, mxdis(:,nn), anixy(:,nn), kwvrdg, & zi, nm, ni, rhoi, & - src_level, tau, & - ubmsrc, nsrc, rsrc, m2src, tlb, bwv, Fr1, Fr2, Frx, & + src_level, tau, & + ubmsrc, nsrc, rsrc, m2src, tlb, bwv, Fr1, Fr2, Frx, & tauoro, taudsw, hdspwv, hdspdw) call gw_rdg_break_trap(ncol, band_oro, & - zi, nm, ni, ubm, ubi, rhoi, kwvrdg , bwv, tlb, wbr, & - src_level, tlb_level, hdspwv, hdspdw, mxdis(:,nn), & - tauoro, taudsw, tau, & + zi, nm, ni, ubm, ubi, rhoi, kwvrdg , bwv, tlb, wbr, & + src_level, tlb_level, hdspwv, hdspdw, mxdis(:,nn), & + tauoro, taudsw, tau, & ldo_trapped_waves=trpd_leewv) - + call gw_drag_prof(ncol, band_oro, p, src_level, tend_level, dt, & t, vramp, & piln, rhoi, nm, ni, ubm, ubi, xv, yv, & effgw, c, kvtt, q, dse, tau, utgw, vtgw, & ttgw, qtgw, egwdffi, gwut, dttdf, dttke, & - kwvrdg=kwvrdg, & + kwvrdg=kwvrdg, & satfac_in = 1._r8, lapply_vdiff=gw_rdg_do_vdiff , tau_diag=tau_diag ) ! Add the tendencies from each ridge to the totals. diff --git a/src/physics/cam/modal_aer_opt.F90 b/src/physics/cam/modal_aer_opt.F90 index 5c95c17840..136c188a1e 100644 --- a/src/physics/cam/modal_aer_opt.F90 +++ b/src/physics/cam/modal_aer_opt.F90 @@ -15,7 +15,7 @@ module modal_aer_opt use spmd_utils, only: masterproc use ref_pres, only: top_lev => clim_modal_aero_top_lev use physconst, only: rhoh2o, rga, rair -use radconstants, only: nswbands, nlwbands, idx_sw_diag, idx_uv_diag, idx_nir_diag +use radconstants, only: nswbands, nlwbands, idx_sw_diag, idx_uv_diag, idx_nir_diag, get_lw_spectral_boundaries use rad_constituents, only: n_diag, rad_cnst_get_call_list, rad_cnst_get_info, rad_cnst_get_aer_mmr, & rad_cnst_get_aer_props, rad_cnst_get_mode_props use physics_types, only: physics_state @@ -33,13 +33,15 @@ module modal_aer_opt use modal_aero_wateruptake, only: modal_aero_wateruptake_dr use modal_aero_calcsize, only: modal_aero_calcsize_diag +use table_interp_mod, only: table_interp, table_interp_wghts, table_interp_calcwghts + implicit none private save public :: modal_aer_opt_readnl, modal_aer_opt_init, modal_aero_sw, modal_aero_lw - +real(r8), parameter :: rh2odens = 1._r8/rhoh2o character(len=*), parameter :: unset_str = 'UNSET' ! Namelist variables: @@ -59,6 +61,7 @@ module modal_aer_opt ! physics buffer indices integer :: dgnumwet_idx = -1 integer :: qaerwat_idx = -1 +integer :: lw10um_indx = -1 character(len=4) :: diag(0:n_diag) = (/' ','_d1 ','_d2 ','_d3 ','_d4 ','_d5 ', & '_d6 ','_d7 ','_d8 ','_d9 ','_d10'/) @@ -115,7 +118,7 @@ subroutine modal_aer_opt_init() integer :: i, m real(r8) :: rmmin, rmmax ! min, max aerosol surface mode radius treated (m) character(len=256) :: locfile - + logical :: history_amwg ! output the variables used by the AMWG diag package logical :: history_aero_optics ! output aerosol optics diagnostics logical :: history_dust ! output dust diagnostics @@ -125,8 +128,11 @@ subroutine modal_aer_opt_init() integer :: errcode character(len=*), parameter :: routine='modal_aer_opt_init' - character(len=10) :: fldname + character(len=32) :: fldname character(len=128) :: lngname + character(len=32) :: modename + + real(r8) :: lwavlen_lo(nlwbands), lwavlen_hi(nlwbands) !---------------------------------------------------------------------------- @@ -231,47 +237,54 @@ subroutine modal_aer_opt_init() call addfld ('EXTxASYMdn', (/ 'lev' /), 'A',' ','extinction 550 * asymmetry factor, day night', & flag_xyfill=.true.) + call addfld ('AODTOT', horiz_only, 'A','1','Aerosol optical depth summed over all sw wavelengths ', & + flag_xyfill=.true.) + call addfld ('AODTOTdn', horiz_only, 'A','1','Aerosol optical depth summed over all sw wavelengths, day night', & + flag_xyfill=.true.) + call rad_cnst_get_info(0, nmodes=nmodes) do m = 1, nmodes - write(fldname,'(a,i1)') 'BURDEN', m - write(lngname,'(a,i1)') 'Aerosol burden, day only, mode ', m + call rad_cnst_get_info(0,m, mode_type=modename) + + write(fldname,'(a,i2.2)') 'BURDEN', m + write(lngname,'(a,i2.2)') 'Aerosol burden, day only, mode ', m call addfld (fldname, horiz_only, 'A', 'kg/m2', lngname, flag_xyfill=.true.) if (m>3 .and. history_aero_optics) then call add_default (fldname, 1, ' ') endif - write(fldname,'(a,i1)') 'AODMODE', m - write(lngname,'(a,i1)') 'Aerosol optical depth, day only, 550 nm mode ', m + fldname = 'AOD_'//trim(modename) + write(lngname,'(a,i2.2)') 'Aerosol optical depth, day only, 550 nm mode ', m call addfld (fldname, horiz_only, 'A', ' ', lngname, flag_xyfill=.true.) - if (m>3 .and. history_aero_optics) then + if (history_aero_optics) then call add_default (fldname, 1, ' ') endif - write(fldname,'(a,i1)') 'AODDUST', m - write(lngname,'(a,i1,a)') 'Aerosol optical depth, day only, 550 nm mode ',m,' from dust' + write(fldname,'(a,i2.2)') 'AODDUST', m + write(lngname,'(a,i2.2,a)') 'Aerosol optical depth, day only, 550 nm mode ',m,' from dust' call addfld (fldname, horiz_only, 'A', ' ', lngname, flag_xyfill=.true.) if (m>3 .and. history_aero_optics) then call add_default (fldname, 1, ' ') endif - write(fldname,'(a,i1)') 'BURDENdn', m - write(lngname,'(a,i1)') 'Aerosol burden, day night, mode ', m + write(fldname,'(a,i2.2)') 'BURDENdn', m + write(lngname,'(a,i2.2)') 'Aerosol burden, day night, mode ', m call addfld (fldname, horiz_only, 'A', 'kg/m2', lngname, flag_xyfill=.true.) if (m>3 .and. history_aero_optics) then call add_default (fldname, 1, ' ') endif - write(fldname,'(a,i1)') 'AODdnMODE', m - write(lngname,'(a,i1)') 'Aerosol optical depth 550 nm, day night, mode ', m + fldname = 'AODdn_'//trim(modename) + write(lngname,'(a,i2.2)') 'Aerosol optical depth 550 nm, day night, mode ', m call addfld (fldname, horiz_only, 'A', ' ', lngname, flag_xyfill=.true.) - if (m>3 .and. history_aero_optics) then + if (history_aero_optics) then call add_default (fldname, 1, ' ') endif - write(fldname,'(a,i1)') 'AODdnDUST', m - write(lngname,'(a,i1,a)') 'Aerosol optical depth 550 nm, day night, mode ',m,' from dust' + write(fldname,'(a,i2.2)') 'AODdnDUST', m + write(lngname,'(a,i2.2,a)') 'Aerosol optical depth 550 nm, day night, mode ',m,' from dust' call addfld (fldname, horiz_only, 'A', ' ', lngname, flag_xyfill=.true.) if (m>3 .and. history_aero_optics) then call add_default (fldname, 1, ' ') @@ -337,27 +350,23 @@ subroutine modal_aer_opt_init() call addfld ('SSAVISdn', horiz_only, 'A',' ', 'Aerosol single-scatter albedo, day night', & flag_xyfill=.true.) - - if (history_amwg) then - call add_default ('AODDUST1' , 1, ' ') - call add_default ('AODDUST3' , 1, ' ') + if (history_amwg) then + call add_default ('AODDUST01' , 1, ' ') + call add_default ('AODDUST03' , 1, ' ') call add_default ('AODDUST' , 1, ' ') call add_default ('AODVIS' , 1, ' ') end if - if (history_dust) then - call add_default ('AODDUST1' , 1, ' ') - call add_default ('AODDUST2' , 1, ' ') - call add_default ('AODDUST3' , 1, ' ') + if (history_dust) then + call add_default ('AODDUST01' , 1, ' ') + call add_default ('AODDUST02' , 1, ' ') + call add_default ('AODDUST03' , 1, ' ') end if - if (history_aero_optics) then - call add_default ('AODDUST1' , 1, ' ') - call add_default ('AODDUST3' , 1, ' ') + if (history_aero_optics) then + call add_default ('AODDUST01' , 1, ' ') + call add_default ('AODDUST03' , 1, ' ') call add_default ('ABSORB' , 1, ' ') - call add_default ('AODMODE1' , 1, ' ') - call add_default ('AODMODE2' , 1, ' ') - call add_default ('AODMODE3' , 1, ' ') call add_default ('AODVIS' , 1, ' ') call add_default ('AODUV' , 1, ' ') call add_default ('AODNIR' , 1, ' ') @@ -369,9 +378,9 @@ subroutine modal_aer_opt_init() call add_default ('AODSOA' , 1, ' ') call add_default ('AODBC' , 1, ' ') call add_default ('AODSS' , 1, ' ') - call add_default ('BURDEN1' , 1, ' ') - call add_default ('BURDEN2' , 1, ' ') - call add_default ('BURDEN3' , 1, ' ') + call add_default ('BURDEN01' , 1, ' ') + call add_default ('BURDEN02' , 1, ' ') + call add_default ('BURDEN03' , 1, ' ') call add_default ('BURDENDUST' , 1, ' ') call add_default ('BURDENSO4' , 1, ' ') call add_default ('BURDENPOM' , 1, ' ') @@ -382,13 +391,10 @@ subroutine modal_aer_opt_init() call add_default ('EXTINCT' , 1, ' ') call add_default ('AODxASYM' , 1, ' ') call add_default ('EXTxASYM' , 1, ' ') - - call add_default ('AODdnDUST1' , 1, ' ') - call add_default ('AODdnDUST3' , 1, ' ') + + call add_default ('AODdnDUST01' , 1, ' ') + call add_default ('AODdnDUST03' , 1, ' ') call add_default ('ABSORBdn' , 1, ' ') - call add_default ('AODdnMODE1' , 1, ' ') - call add_default ('AODdnMODE2' , 1, ' ') - call add_default ('AODdnMODE3' , 1, ' ') call add_default ('AODVISdn' , 1, ' ') call add_default ('AODUVdn' , 1, ' ') call add_default ('AODNIRdn' , 1, ' ') @@ -400,9 +406,9 @@ subroutine modal_aer_opt_init() call add_default ('AODSOAdn' , 1, ' ') call add_default ('AODBCdn' , 1, ' ') call add_default ('AODSSdn' , 1, ' ') - call add_default ('BURDENdn1' , 1, ' ') - call add_default ('BURDENdn2' , 1, ' ') - call add_default ('BURDENdn3' , 1, ' ') + call add_default ('BURDENdn01' , 1, ' ') + call add_default ('BURDENdn02' , 1, ' ') + call add_default ('BURDENdn03' , 1, ' ') call add_default ('BURDENDUSTdn' , 1, ' ') call add_default ('BURDENSO4dn' , 1, ' ') call add_default ('BURDENPOMdn' , 1, ' ') @@ -413,11 +419,11 @@ subroutine modal_aer_opt_init() call add_default ('EXTINCTdn' , 1, ' ') call add_default ('AODxASYMdn' , 1, ' ') call add_default ('EXTxASYMdn' , 1, ' ') - end if + end if do ilist = 1, n_diag if (call_list(ilist)) then - + call addfld ('EXTINCT'//diag(ilist), (/ 'lev' /), 'A','/m', & 'Aerosol extinction', flag_xyfill=.true.) call addfld ('ABSORB'//diag(ilist), (/ 'lev' /), 'A','/m', & @@ -429,6 +435,11 @@ subroutine modal_aer_opt_init() call addfld ('AODABS'//diag(ilist), horiz_only, 'A',' ', & 'Aerosol absorption optical depth 550 nm', flag_xyfill=.true.) + call addfld ('AODTOT'//diag(ilist), horiz_only, 'A','1', & + 'Aerosol optical depth summed over all sw wavelengths', flag_xyfill=.true.) + call addfld ('AODTOTdn'//diag(ilist), horiz_only, 'A','1', & + 'Aerosol optical depth summed over all sw wavelengths, day night', flag_xyfill=.true.) + call addfld ('EXTINCTdn'//diag(ilist), (/ 'lev' /), 'A','/m',& 'Aerosol extinction 550 nm, day night', flag_xyfill=.true.) call addfld ('ABSORBdn'//diag(ilist), (/ 'lev' /), 'A','/m',& @@ -455,6 +466,17 @@ subroutine modal_aer_opt_init() end if end do + call get_lw_spectral_boundaries(lwavlen_lo, lwavlen_hi, units='um') + do i = 1,nlwbands + if ((lwavlen_lo(i)<=10._r8) .and. (lwavlen_hi(i)>=10._r8)) then + lw10um_indx = i + end if + end do + if (lw10um_indx>0) then + call addfld('AODABSLW', (/ 'lev' /), 'A','/m','Aerosol long-wave absorption optical depth at 10 microns') + end if + call addfld ('TOTABSLW', (/ 'lev' /), 'A',' ', 'LW Aero total abs') + end subroutine modal_aer_opt_init !=============================================================================== @@ -463,12 +485,12 @@ subroutine modal_aero_sw(list_idx, state, pbuf, nnite, idxnite, & tauxar, wa, ga, fa) ! calculates aerosol sw radiative properties - + use tropopause, only : tropopause_findChemTrop integer, intent(in) :: list_idx ! index of the climate or a diagnostic list type(physics_state), intent(in), target :: state ! state variables - + type(physics_buffer_desc), pointer :: pbuf(:) integer, intent(in) :: nnite ! number of night columns integer, intent(in) :: idxnite(nnite) ! local column indices of night columns @@ -494,7 +516,7 @@ subroutine modal_aero_sw(list_idx, state, pbuf, nnite, idxnite, & real(r8) :: specdens ! species density (kg/m3) complex(r8), pointer :: specrefindex(:) ! species refractive index character*32 :: spectype ! species type - real(r8) :: hygro_aer ! + real(r8) :: hygro_aer ! real(r8), pointer :: dgnumwet(:,:) ! number mode wet diameter real(r8), pointer :: qaerwat(:,:) ! aerosol water (g/g) @@ -502,13 +524,13 @@ subroutine modal_aero_sw(list_idx, state, pbuf, nnite, idxnite, & real(r8), pointer :: dgnumdry_m(:,:,:) ! number mode dry diameter for all modes real(r8), pointer :: dgnumwet_m(:,:,:) ! number mode wet diameter for all modes real(r8), pointer :: qaerwat_m(:,:,:) ! aerosol water (g/g) for all modes - real(r8), pointer :: wetdens_m(:,:,:) ! - real(r8), pointer :: hygro_m(:,:,:) ! - real(r8), pointer :: dryvol_m(:,:,:) ! - real(r8), pointer :: dryrad_m(:,:,:) ! - real(r8), pointer :: drymass_m(:,:,:) ! - real(r8), pointer :: so4dryvol_m(:,:,:) ! - real(r8), pointer :: naer_m(:,:,:) ! + real(r8), pointer :: wetdens_m(:,:,:) ! + real(r8), pointer :: hygro_m(:,:,:) ! + real(r8), pointer :: dryvol_m(:,:,:) ! + real(r8), pointer :: dryrad_m(:,:,:) ! + real(r8), pointer :: drymass_m(:,:,:) ! + real(r8), pointer :: so4dryvol_m(:,:,:) ! + real(r8), pointer :: naer_m(:,:,:) ! real(r8) :: sigma_logr_aer ! geometric standard deviation of number distribution real(r8) :: radsurf(pcols,pver) ! aerosol surface mode radius @@ -529,9 +551,7 @@ subroutine modal_aero_sw(list_idx, state, pbuf, nnite, idxnite, & real(r8) :: watervol(pcols) ! volume concentration of water in each mode (m3/kg) real(r8) :: wetvol(pcols) ! volume concentration of wet mode (m3/kg) - integer :: itab(pcols), jtab(pcols) - real(r8) :: ttab(pcols), utab(pcols) - real(r8) :: cext(pcols,ncoef), cabs(pcols,ncoef), casm(pcols,ncoef) + real(r8) :: cext(ncoef,pcols), cabs(ncoef,pcols), casm(ncoef,pcols) real(r8) :: pext(pcols) ! parameterized specific extinction (m2/kg) real(r8) :: specpext(pcols) ! specific extinction (m2/kg) real(r8) :: dopaer(pcols) ! aerosol optical depth in layer @@ -545,6 +565,7 @@ subroutine modal_aero_sw(list_idx, state, pbuf, nnite, idxnite, & real(r8) :: extinctuv(pcols,pver) real(r8) :: absorb(pcols,pver) real(r8) :: aodvis(pcols) ! extinction optical depth + real(r8) :: aodtot(pcols) ! extinction optical depth real(r8) :: aodvisst(pcols) ! stratospheric extinction optical depth real(r8) :: aodabs(pcols) ! absorption optical depth real(r8) :: asymvis(pcols) ! asymmetry factor * optical depth @@ -591,12 +612,17 @@ subroutine modal_aero_sw(list_idx, state, pbuf, nnite, idxnite, & character(len=32) :: outname + character(len=32) :: modename ! debug output integer, parameter :: nerrmax_dopaer=1000 integer :: nerr_dopaer = 0 real(r8) :: volf ! volume fraction of insoluble aerosol character(len=*), parameter :: subname = 'modal_aero_sw' + + type(table_interp_wghts) :: wghtsr(state%ncol) + type(table_interp_wghts) :: wghtsi(state%ncol) + !---------------------------------------------------------------------------- lchnk = state%lchnk @@ -621,6 +647,7 @@ subroutine modal_aero_sw(list_idx, state, pbuf, nnite, idxnite, & extinct(1:ncol,:) = 0.0_r8 absorb(1:ncol,:) = 0.0_r8 aodvis(1:ncol) = 0.0_r8 + aodtot(1:ncol) = 0.0_r8 aodvisst(1:ncol) = 0.0_r8 aodabs(1:ncol) = 0.0_r8 burdendust(:ncol) = 0.0_r8 @@ -633,7 +660,7 @@ subroutine modal_aero_sw(list_idx, state, pbuf, nnite, idxnite, & asymvis(1:ncol) = 0.0_r8 asymext(1:ncol,:) = 0.0_r8 - aodabsbc(:ncol) = 0.0_r8 + aodabsbc(:ncol) = 0.0_r8 dustaod(:ncol) = 0.0_r8 so4aod(:ncol) = 0.0_r8 pomaod(:ncol) = 0.0_r8 @@ -669,7 +696,7 @@ subroutine modal_aero_sw(list_idx, state, pbuf, nnite, idxnite, & call endrun('modal_aero_sw: allocation FAILURE: arrays for diagnostic calcs') end if call modal_aero_calcsize_diag(state, pbuf, list_idx, dgnumdry_m, hygro_m, & - dryvol_m, dryrad_m, drymass_m, so4dryvol_m, naer_m) + dryvol_m, dryrad_m, drymass_m, so4dryvol_m, naer_m) call modal_aero_wateruptake_dr(state, pbuf, list_idx, dgnumdry_m, dgnumwet_m, & qaerwat_m, wetdens_m, hygro_m, dryvol_m, dryrad_m, & drymass_m, so4dryvol_m, naer_m) @@ -804,7 +831,7 @@ subroutine modal_aero_sw(list_idx, state, pbuf, nnite, idxnite, & end do ! species loop do i = 1, ncol - watervol(i) = qaerwat(i,k)/rhoh2o + watervol(i) = qaerwat(i,k)*rh2odens wetvol(i) = watervol(i) + dryvol(i) if (watervol(i) < 0._r8) then if (abs(watervol(i)) .gt. 1.e-1_r8*wetvol(i)) then @@ -825,17 +852,13 @@ subroutine modal_aero_sw(list_idx, state, pbuf, nnite, idxnite, & ! call t_startf('binterp') ! interpolate coefficients linear in refractive index - ! first call calcs itab,jtab,ttab,utab - itab(:ncol) = 0 - call binterp(extpsw(:,:,:,isw), ncol, ncoef, prefr, prefi, & - refr, refi, refrtabsw(:,isw), refitabsw(:,isw), & - itab, jtab, ttab, utab, cext) - call binterp(abspsw(:,:,:,isw), ncol, ncoef, prefr, prefi, & - refr, refi, refrtabsw(:,isw), refitabsw(:,isw), & - itab, jtab, ttab, utab, cabs) - call binterp(asmpsw(:,:,:,isw), ncol, ncoef, prefr, prefi, & - refr, refi, refrtabsw(:,isw), refitabsw(:,isw), & - itab, jtab, ttab, utab, casm) + + wghtsr = table_interp_calcwghts( prefr, refrtabsw(:,isw), ncol, refr(:ncol) ) + wghtsi = table_interp_calcwghts( prefi, refitabsw(:,isw), ncol, refi(:ncol) ) + + cext(:,:ncol)= table_interp( ncoef,ncol, prefr,prefi, wghtsr,wghtsi, extpsw(:,:,:,isw)) + cabs(:,:ncol)= table_interp( ncoef,ncol, prefr,prefi, wghtsr,wghtsi, abspsw(:,:,:,isw)) + casm(:,:ncol)= table_interp( ncoef,ncol, prefr,prefi, wghtsr,wghtsi, asmpsw(:,:,:,isw)) ! call t_stopf('binterp') @@ -843,9 +866,9 @@ subroutine modal_aero_sw(list_idx, state, pbuf, nnite, idxnite, & do i=1,ncol if (logradsurf(i,k) .le. xrmax) then - pext(i) = 0.5_r8*cext(i,1) + pext(i) = 0.5_r8*cext(1,i) do nc = 2, ncoef - pext(i) = pext(i) + cheb(nc,i,k)*cext(i,nc) + pext(i) = pext(i) + cheb(nc,i,k)*cext(nc,i) enddo pext(i) = exp(pext(i)) else @@ -855,20 +878,21 @@ subroutine modal_aero_sw(list_idx, state, pbuf, nnite, idxnite, & ! convert from m2/kg water to m2/kg aerosol specpext(i) = pext(i) pext(i) = pext(i)*wetvol(i)*rhoh2o - pabs(i) = 0.5_r8*cabs(i,1) - pasm(i) = 0.5_r8*casm(i,1) + pabs(i) = 0.5_r8*cabs(1,i) + pasm(i) = 0.5_r8*casm(1,i) do nc = 2, ncoef - pabs(i) = pabs(i) + cheb(nc,i,k)*cabs(i,nc) - pasm(i) = pasm(i) + cheb(nc,i,k)*casm(i,nc) + pabs(i) = pabs(i) + cheb(nc,i,k)*cabs(nc,i) + pasm(i) = pasm(i) + cheb(nc,i,k)*casm(nc,i) enddo pabs(i) = pabs(i)*wetvol(i)*rhoh2o pabs(i) = max(0._r8,pabs(i)) pabs(i) = min(pext(i),pabs(i)) - palb(i) = 1._r8-pabs(i)/max(pext(i),1.e-40_r8) palb(i) = 1._r8-pabs(i)/max(pext(i),1.e-40_r8) dopaer(i) = pext(i)*mass(i,k) + + aodtot(i) = aodtot(i) + dopaer(i) end do if (savaeruv) then @@ -941,7 +965,7 @@ subroutine modal_aero_sw(list_idx, state, pbuf, nnite, idxnite, & scatseasalt(i) = (scatseasalt(i) + scath2o*hygroseasalt(i)/sumhygro)/sumscat absseasalt(i) = (absseasalt(i) + absh2o*hygroseasalt(i)/sumhygro)/sumabs - + aodabsbc(i) = aodabsbc(i) + absbc(i)*dopaer(i)*(1.0_r8-palb(i)) aodc = (absdust(i)*(1.0_r8 - palb(i)) + palb(i)*scatdust(i))*dopaer(i) @@ -972,21 +996,16 @@ subroutine modal_aero_sw(list_idx, state, pbuf, nnite, idxnite, & if ((dopaer(i) <= -1.e-10_r8) .or. (dopaer(i) >= 30._r8)) then if (dopaer(i) <= -1.e-10_r8) then - write(iulog,*) "ERROR: Negative aerosol optical depth & - &in this layer." + write(iulog,*) "ERROR: Negative aerosol optical depth in this layer." else - write(iulog,*) "WARNING: Aerosol optical depth is & - &unreasonably high in this layer." + write(iulog,*) "WARNING: Aerosol optical depth is unreasonably high in this layer." end if write(iulog,*) 'dopaer(', i, ',', k, ',', m, ',', lchnk, ')=', dopaer(i) - ! write(iulog,*) 'itab,jtab,ttab,utab=',itab(i),jtab(i),ttab(i),utab(i) write(iulog,*) 'k=', k, ' pext=', pext(i), ' specext=', specpext(i) write(iulog,*) 'wetvol=', wetvol(i), ' dryvol=', dryvol(i), ' watervol=', watervol(i) - ! write(iulog,*) 'cext=',(cext(i,l),l=1,ncoef) - ! write(iulog,*) 'crefin=',crefin(i) write(iulog,*) 'nspec=', nspec - ! write(iulog,*) 'cheb=', (cheb(nc,m,i,k),nc=2,ncoef) + do l = 1, nspec call rad_cnst_get_aer_mmr(list_idx, m, l, 'a', state, pbuf, specmmr) call rad_cnst_get_aer_props(list_idx, m, l, density_aer=specdens, & @@ -998,7 +1017,7 @@ subroutine modal_aero_sw(list_idx, state, pbuf, nnite, idxnite, & end do nerr_dopaer = nerr_dopaer + 1 -! if (nerr_dopaer >= nerrmax_dopaer) then + if (dopaer(i) < -1.e-10_r8) then write(iulog,*) '*** halting in '//subname//' after nerr_dopaer =', nerr_dopaer call endrun('exit from '//subname) @@ -1023,28 +1042,30 @@ subroutine modal_aero_sw(list_idx, state, pbuf, nnite, idxnite, & ! be necessary to provide output for the rad_diag lists. if (list_idx == 0) then - write(outname,'(a,i1)') 'BURDENdn', m + call rad_cnst_get_info(0,m, mode_type=modename) + + write(outname,'(a,i2.2)') 'BURDENdn', m call outfld(trim(outname), burden, pcols, lchnk) - write(outname,'(a,i1)') 'AODdnMODE', m + outname = 'AODdn_'//trim(modename) call outfld(trim(outname), aodmode, pcols, lchnk) - write(outname,'(a,i1)') 'AODdnDUST', m + write(outname,'(a,i2.2)') 'AODdnDUST', m call outfld(trim(outname), dustaodmode, pcols, lchnk) - + do i = 1, nnite burden(idxnite(i)) = fillvalue aodmode(idxnite(i)) = fillvalue dustaodmode(idxnite(i)) = fillvalue end do - write(outname,'(a,i1)') 'BURDEN', m + write(outname,'(a,i2.2)') 'BURDEN', m call outfld(trim(outname), burden, pcols, lchnk) - write(outname,'(a,i1)') 'AODMODE', m + outname = 'AOD_'//trim(modename) call outfld(trim(outname), aodmode, pcols, lchnk) - write(outname,'(a,i1)') 'AODDUST', m + write(outname,'(a,i2.2)') 'AODDUST', m call outfld(trim(outname), dustaodmode, pcols, lchnk) end if @@ -1071,12 +1092,14 @@ subroutine modal_aero_sw(list_idx, state, pbuf, nnite, idxnite, & call outfld('ABSORBdn'//diag(list_idx), absorb, pcols, lchnk) call outfld('AODVISdn'//diag(list_idx), aodvis, pcols, lchnk) call outfld('AODABSdn'//diag(list_idx), aodabs, pcols, lchnk) + call outfld('AODTOTdn'//diag(list_idx), aodtot, pcols, lchnk) call outfld('AODVISstdn'//diag(list_idx), aodvisst,pcols, lchnk) call outfld('EXTxASYMdn'//diag(list_idx), asymext, pcols, lchnk) - + do i = 1, nnite extinct(idxnite(i),:) = fillvalue absorb(idxnite(i),:) = fillvalue + aodtot(idxnite(i)) = fillvalue aodvis(idxnite(i)) = fillvalue aodabs(idxnite(i)) = fillvalue aodvisst(idxnite(i)) = fillvalue @@ -1086,6 +1109,7 @@ subroutine modal_aero_sw(list_idx, state, pbuf, nnite, idxnite, & call outfld('EXTINCT'//diag(list_idx), extinct, pcols, lchnk) call outfld('ABSORB'//diag(list_idx), absorb, pcols, lchnk) call outfld('AODVIS'//diag(list_idx), aodvis, pcols, lchnk) + call outfld('AODTOT'//diag(list_idx), aodtot, pcols, lchnk) call outfld('AODABS'//diag(list_idx), aodabs, pcols, lchnk) call outfld('AODVISst'//diag(list_idx), aodvisst,pcols, lchnk) call outfld('EXTxASYM'//diag(list_idx), asymext, pcols, lchnk) @@ -1099,7 +1123,7 @@ subroutine modal_aero_sw(list_idx, state, pbuf, nnite, idxnite, & ssavis(i) = 0.925_r8 endif end do - + call outfld('SSAVISdn', ssavis, pcols, lchnk) call outfld('AODxASYMdn', asymvis, pcols, lchnk) @@ -1192,7 +1216,7 @@ subroutine modal_aero_lw(list_idx, state, pbuf, tauxar) integer, intent(in) :: list_idx ! index of the climate or a diagnostic list type(physics_state), intent(in), target :: state ! state variables - + type(physics_buffer_desc), pointer :: pbuf(:) real(r8), intent(out) :: tauxar(pcols,pver,nlwbands) ! layer absorption optical depth @@ -1211,7 +1235,7 @@ subroutine modal_aero_lw(list_idx, state, pbuf, tauxar) real(r8), pointer :: dgnumdry_m(:,:,:) ! number mode dry diameter for all modes real(r8), pointer :: dgnumwet_m(:,:,:) ! number mode wet diameter for all modes real(r8), pointer :: qaerwat_m(:,:,:) ! aerosol water (g/g) for all modes - real(r8), pointer :: wetdens_m(:,:,:) ! + real(r8), pointer :: wetdens_m(:,:,:) ! real(r8), pointer :: hygro_m(:,:,:) ! real(r8), pointer :: dryvol_m(:,:,:) ! real(r8), pointer :: dryrad_m(:,:,:) ! @@ -1241,9 +1265,7 @@ subroutine modal_aero_lw(list_idx, state, pbuf, tauxar) real(r8), pointer :: refitablw(:,:) ! table of imag refractive indices for aerosols real(r8), pointer :: absplw(:,:,:,:) ! specific absorption - integer :: itab(pcols), jtab(pcols) - real(r8) :: ttab(pcols), utab(pcols) - real(r8) :: cabs(pcols,ncoef) + real(r8) :: cabs(ncoef,pcols) real(r8) :: pabs(pcols) ! parameterized specific absorption (m2/kg) real(r8) :: dopaer(pcols) ! aerosol optical depth in layer @@ -1252,8 +1274,19 @@ subroutine modal_aero_lw(list_idx, state, pbuf, tauxar) real(r8) :: volf ! volume fraction of insoluble aerosol character(len=*), parameter :: subname = 'modal_aero_lw' + + real(r8) :: radsurf(pcols,pver) ! aerosol surface mode radius + real(r8) :: logradsurf(pcols,pver) ! log(aerosol surface mode radius) + + real(r8) :: lwabs(pcols,pver) + + type(table_interp_wghts) :: wghtsr(state%ncol) + type(table_interp_wghts) :: wghtsi(state%ncol) + !---------------------------------------------------------------------------- + lwabs = 0.0_r8 + lchnk = state%lchnk ncol = state%ncol @@ -1283,7 +1316,7 @@ subroutine modal_aero_lw(list_idx, state, pbuf, tauxar) call endrun('modal_aero_lw: allocation FAILURE: arrays for diagnostic calcs') end if call modal_aero_calcsize_diag(state, pbuf, list_idx, dgnumdry_m, hygro_m, & - dryvol_m, dryrad_m, drymass_m, so4dryvol_m, naer_m) + dryvol_m, dryrad_m, drymass_m, so4dryvol_m, naer_m) call modal_aero_wateruptake_dr(state, pbuf, list_idx, dgnumdry_m, dgnumwet_m, & qaerwat_m, wetdens_m, hygro_m, dryvol_m, dryrad_m, & drymass_m, so4dryvol_m, naer_m) @@ -1302,26 +1335,7 @@ subroutine modal_aero_lw(list_idx, state, pbuf, tauxar) call rad_cnst_get_info(list_idx, m, nspec=nspec) ! calc size parameter for all columns - ! this is the same calculation that's done in modal_size_parameters, but there - ! some intermediate results are saved and the chebyshev polynomials are stored - ! in a array with different index order. Could be unified. - do k = top_lev, pver - do i = 1, ncol - alnsg_amode = log( sigma_logr_aer ) - ! convert from number diameter to surface area - xrad(i) = log(0.5_r8*dgnumwet(i,k)) + 2.0_r8*alnsg_amode*alnsg_amode - ! normalize size parameter - xrad(i) = max(xrad(i), xrmin) - xrad(i) = min(xrad(i), xrmax) - xrad(i) = (2*xrad(i)-xrmax-xrmin)/(xrmax-xrmin) - ! chebyshev polynomials - cheby(1,i,k) = 1.0_r8 - cheby(2,i,k) = xrad(i) - do nc = 3, ncoef - cheby(nc,i,k) = 2.0_r8*xrad(i)*cheby(nc-1,i,k)-cheby(nc-2,i,k) - end do - end do - end do + call modal_size_parameters(ncol, sigma_logr_aer, dgnumwet, radsurf, logradsurf, cheby) do ilw = 1, nlwbands @@ -1345,7 +1359,7 @@ subroutine modal_aero_lw(list_idx, state, pbuf, tauxar) end do do i = 1, ncol - watervol(i) = qaerwat(i,k)/rhoh2o + watervol(i) = qaerwat(i,k)*rh2odens wetvol(i) = watervol(i) + dryvol(i) if (watervol(i) < 0.0_r8) then if (abs(watervol(i)) .gt. 1.e-1_r8*wetvol(i)) then @@ -1362,21 +1376,22 @@ subroutine modal_aero_lw(list_idx, state, pbuf, tauxar) end do ! interpolate coefficients linear in refractive index - ! first call calcs itab,jtab,ttab,utab - itab(:ncol) = 0 - call binterp(absplw(:,:,:,ilw), ncol, ncoef, prefr, prefi, & - refr, refi, refrtablw(:,ilw), refitablw(:,ilw), & - itab, jtab, ttab, utab, cabs) + + wghtsr = table_interp_calcwghts( prefr, refrtablw(:,ilw), ncol, refr(:ncol) ) + wghtsi = table_interp_calcwghts( prefi, refitablw(:,ilw), ncol, refi(:ncol) ) + + cabs(:,:ncol)= table_interp( ncoef,ncol, prefr,prefi, wghtsr,wghtsi, absplw(:,:,:,ilw)) ! parameterized optical properties do i = 1, ncol - pabs(i) = 0.5_r8*cabs(i,1) + pabs(i) = 0.5_r8*cabs(1,i) do nc = 2, ncoef - pabs(i) = pabs(i) + cheby(nc,i,k)*cabs(i,nc) + pabs(i) = pabs(i) + cheby(nc,i,k)*cabs(nc,i) end do pabs(i) = pabs(i)*wetvol(i)*rhoh2o pabs(i) = max(0._r8,pabs(i)) dopaer(i) = pabs(i)*mass(i,k) + lwabs(i,k) = lwabs(i,k) + pabs(i) end do do i = 1, ncol @@ -1395,7 +1410,7 @@ subroutine modal_aero_lw(list_idx, state, pbuf, tauxar) write(iulog,*) 'k=',k,' pabs=', pabs(i) write(iulog,*) 'wetvol=',wetvol(i),' dryvol=',dryvol(i), & ' watervol=',watervol(i) - write(iulog,*) 'cabs=', (cabs(i,l),l=1,ncoef) + write(iulog,*) 'cabs=', (cabs(l,i),l=1,ncoef) write(iulog,*) 'crefin=', crefin(i) write(iulog,*) 'nspec=', nspec do l = 1,nspec @@ -1440,6 +1455,12 @@ subroutine modal_aero_lw(list_idx, state, pbuf, tauxar) deallocate(naer_m) end if + call outfld('TOTABSLW', lwabs(:,:), pcols, lchnk) + + if (lw10um_indx>0) then + call outfld('AODABSLW', tauxar(:,:,lw10um_indx), pcols, lchnk) + end if + end subroutine modal_aero_lw !=============================================================================== @@ -1547,75 +1568,4 @@ subroutine modal_size_parameters(ncol, sigma_logr_aer, dgnumwet, radsurf, lograd end subroutine modal_size_parameters -!=============================================================================== - - subroutine binterp(table,ncol,km,im,jm,x,y,xtab,ytab,ix,jy,t,u,out) - - ! bilinear interpolation of table - ! - implicit none - integer im,jm,km,ncol - real(r8) table(km,im,jm),xtab(im),ytab(jm),out(pcols,km) - integer i,ix(pcols),ip1,j,jy(pcols),jp1,k,ic,ip1m(pcols),jp1m(pcols),ixc,jyc - real(r8) x(pcols),dx,t(pcols),y(pcols),dy,u(pcols),tu(pcols),tuc(pcols),tcu(pcols),tcuc(pcols) - - if(ix(1).gt.0) go to 30 - if(im.gt.1)then - do ic=1,ncol - do i=1,im - if(x(ic).lt.xtab(i))go to 10 - enddo - 10 ix(ic)=max0(i-1,1) - ip1=min(ix(ic)+1,im) - dx=(xtab(ip1)-xtab(ix(ic))) - if(abs(dx).gt.1.e-20_r8)then - t(ic)=(x(ic)-xtab(ix(ic)))/dx - else - t(ic)=0._r8 - endif - end do - else - ix(:ncol)=1 - t(:ncol)=0._r8 - endif - if(jm.gt.1)then - do ic=1,ncol - do j=1,jm - if(y(ic).lt.ytab(j))go to 20 - enddo - 20 jy(ic)=max0(j-1,1) - jp1=min(jy(ic)+1,jm) - dy=(ytab(jp1)-ytab(jy(ic))) - if(abs(dy).gt.1.e-20_r8)then - u(ic)=(y(ic)-ytab(jy(ic)))/dy - else - u(ic)=0._r8 - endif - end do - else - jy(:ncol)=1 - u(:ncol)=0._r8 - endif - 30 continue - do ic=1,ncol - tu(ic)=t(ic)*u(ic) - tuc(ic)=t(ic)-tu(ic) - tcuc(ic)=1._r8-tuc(ic)-u(ic) - tcu(ic)=u(ic)-tu(ic) - jp1m(ic)=min(jy(ic)+1,jm) - ip1m(ic)=min(ix(ic)+1,im) - enddo - do ic=1,ncol - jyc=jy(ic) - ixc=ix(ic) - jp1=jp1m(ic) - ip1=ip1m(ic) - do k=1,km - out(ic,k) = tcuc(ic) * table(k,ixc,jyc) + tuc(ic) * table(k,ip1,jyc) + & - tu(ic) * table(k,ip1,jp1) + tcu(ic) * table(k,ixc,jp1) - end do - end do - return - end subroutine binterp - end module modal_aer_opt diff --git a/src/physics/cam/phys_control.F90 b/src/physics/cam/phys_control.F90 index 8d0cad7ee3..d301c39948 100644 --- a/src/physics/cam/phys_control.F90 +++ b/src/physics/cam/phys_control.F90 @@ -100,6 +100,9 @@ module phys_control ! FV dycore angular momentum correction logical, public, protected :: fv_am_correction = .false. +! Option for Harmonized Emissions Component (HEMCO) +logical, public, protected :: use_hemco = .false. + ! CAM snapshot before/after file numbers and control character(len=32) :: cam_take_snapshot_before = '' ! Physics routine to take a snopshot "before" character(len=32) :: cam_take_snapshot_after = '' ! Physics routine to take a snopshot "after" @@ -133,7 +136,7 @@ subroutine phys_ctl_readnl(nlfile) do_clubb_sgs, state_debug_checks, use_hetfrz_classnuc, use_gw_oro, use_gw_front, & use_gw_front_igw, use_gw_convect_dp, use_gw_convect_sh, cld_macmic_num_steps, & offline_driver, convproc_do_aer, cam_snapshot_before_num, cam_snapshot_after_num, & - cam_take_snapshot_before, cam_take_snapshot_after, cam_physics_mesh + cam_take_snapshot_before, cam_take_snapshot_after, cam_physics_mesh, use_hemco !----------------------------------------------------------------------------- if (masterproc) then @@ -196,6 +199,7 @@ subroutine phys_ctl_readnl(nlfile) call mpi_bcast(cam_take_snapshot_before, len(cam_take_snapshot_before), mpi_character, masterprocid, mpicom, ierr) call mpi_bcast(cam_take_snapshot_after, len(cam_take_snapshot_after), mpi_character, masterprocid, mpicom, ierr) call mpi_bcast(cam_physics_mesh, len(cam_physics_mesh), mpi_character, masterprocid, mpicom, ierr) + call mpi_bcast(use_hemco, 1, mpi_logical, masterprocid, mpicom, ierr) use_spcam = ( cam_physpkg_is('spcam_sam1mom') & .or. cam_physpkg_is('spcam_m2005')) diff --git a/src/physics/cam/physpkg.F90 b/src/physics/cam/physpkg.F90 index 371cab1c13..706b9dcdee 100644 --- a/src/physics/cam/physpkg.F90 +++ b/src/physics/cam/physpkg.F90 @@ -32,6 +32,8 @@ module physpkg use cam_logfile, only: iulog use camsrfexch, only: cam_export + use phys_control, only: use_hemco ! Use Harmonized Emissions Component (HEMCO) + use modal_aero_calcsize, only: modal_aero_calcsize_init, modal_aero_calcsize_diag, modal_aero_calcsize_reg use modal_aero_wateruptake, only: modal_aero_wateruptake_init, modal_aero_wateruptake_dr, modal_aero_wateruptake_reg @@ -156,6 +158,7 @@ subroutine phys_register use dyn_comp, only: dyn_register use spcam_drivers, only: spcam_register use offline_driver, only: offline_driver_reg + use hemco_interface, only: HCOI_Chunk_Init use upper_bc, only: ubc_fixed_conc !---------------------------Local variables----------------------------- @@ -351,6 +354,11 @@ subroutine phys_register call offline_driver_reg() + if (use_hemco) then + ! initialize harmonized emissions component (HEMCO) + call HCOI_Chunk_Init() + endif + ! This needs to be last as it requires all pbuf fields to be added if (cam_snapshot_before_num > 0 .or. cam_snapshot_after_num > 0) then call pbuf_cam_snapshot_register() @@ -1210,6 +1218,7 @@ subroutine phys_run2(phys_state, ztodt, phys_tend, pbuf2d, cam_out, & #if ( defined OFFLINE_DYN ) use metdata, only: get_met_srf2 #endif + use hemco_interface, only: HCOI_Chunk_Run ! ! Input arguments ! @@ -1243,6 +1252,15 @@ subroutine phys_run2(phys_state, ztodt, phys_tend, pbuf2d, cam_out, & !----------------------------------------------------------------------- if (single_column) call scam_use_iop_srf(cam_in) + + if(use_hemco) then + !---------------------------------------------------------- + ! run hemco (phase 2 before chemistry) + ! only phase 2 is used currently for HEMCO-CESM + !---------------------------------------------------------- + call HCOI_Chunk_Run(cam_in, phys_state, pbuf2d, phase=2) + endif + !----------------------------------------------------------------------- ! Tendency physics after coupler ! Not necessary at terminal timestep. @@ -1309,6 +1327,7 @@ subroutine phys_final( phys_state, phys_tend, pbuf2d ) use chemistry, only : chem_final use carma_intr, only : carma_final use wv_saturation, only : wv_sat_final + use hemco_interface, only: HCOI_Chunk_Final use microp_aero, only : microp_aero_final use phys_grid_ctem, only : phys_grid_ctem_final use nudging, only: Nudge_Model, nudging_final @@ -1337,6 +1356,11 @@ subroutine phys_final( phys_state, phys_tend, pbuf2d ) call phys_grid_ctem_final() if(Nudge_Model) call nudging_final() + if(use_hemco) then + ! cleanup hemco + call HCOI_Chunk_Final + endif + end subroutine phys_final @@ -1510,7 +1534,7 @@ subroutine tphysac (ztodt, cam_in, & call cam_snapshot_all_outfld_tphysac(cam_snapshot_before_num, state, tend, cam_in, cam_out, pbuf,& fh2o, surfric, obklen, flx_heat) end if - call chem_emissions( state, cam_in ) + call chem_emissions( state, cam_in, pbuf ) if (trim(cam_take_snapshot_after) == "chem_emissions") then call cam_snapshot_all_outfld_tphysac(cam_snapshot_after_num, state, tend, cam_in, cam_out, pbuf,& fh2o, surfric, obklen, flx_heat) diff --git a/src/physics/cam_dev/physpkg.F90 b/src/physics/cam_dev/physpkg.F90 index 7452f9e115..b288a17177 100644 --- a/src/physics/cam_dev/physpkg.F90 +++ b/src/physics/cam_dev/physpkg.F90 @@ -21,6 +21,8 @@ module physpkg use constituents, only: pcnst, cnst_name, cnst_get_ind use camsrfexch, only: cam_out_t, cam_in_t + use phys_control, only: use_hemco ! Use Harmonized Emissions Component (HEMCO) + use cam_control_mod, only: ideal_phys, adiabatic use phys_control, only: phys_do_flux_avg, phys_getopts, waccmx_is use scamMod, only: single_column, scm_crm_mode @@ -148,6 +150,7 @@ subroutine phys_register use subcol_utils, only: is_subcol_on, subcol_get_scheme use dyn_comp, only: dyn_register use offline_driver, only: offline_driver_reg + use hemco_interface, only: HCOI_Chunk_Init !---------------------------Local variables----------------------------- ! @@ -327,6 +330,11 @@ subroutine phys_register call offline_driver_reg() + if (use_hemco) then + ! initialize harmonized emissions component (HEMCO) + call HCOI_Chunk_Init() + endif + ! This needs to be last as it requires all pbuf fields to be added if (cam_snapshot_before_num > 0 .or. cam_snapshot_after_num > 0) then call pbuf_cam_snapshot_register() @@ -950,7 +958,7 @@ subroutine phys_init( phys_state, phys_tend, pbuf2d, cam_in, cam_out ) ! Initialize the budget capability call cam_budget_init() - + ! addfld calls for U, V tendency budget variables that are output in ! tphysac, tphysbc call addfld ( 'UTEND_DCONV', (/ 'lev' /), 'A', 'm/s2', 'Zonal wind tendency by deep convection') @@ -1168,6 +1176,7 @@ subroutine phys_run2(phys_state, ztodt, phys_tend, pbuf2d, cam_out, & #if ( defined OFFLINE_DYN ) use metdata, only: get_met_srf2 #endif + use hemco_interface, only: HCOI_Chunk_Run ! ! Input arguments ! @@ -1201,6 +1210,14 @@ subroutine phys_run2(phys_state, ztodt, phys_tend, pbuf2d, cam_out, & !----------------------------------------------------------------------- if (single_column) call scam_use_iop_srf(cam_in) + if(use_hemco) then + !---------------------------------------------------------- + ! run hemco (phase 2 before chemistry) + ! only phase 2 is used currently for HEMCO-CESM + !---------------------------------------------------------- + call HCOI_Chunk_Run(cam_in, phys_state, pbuf2d, phase=2) + endif + !----------------------------------------------------------------------- ! Tendency physics after coupler ! Not necessary at terminal timestep. @@ -1270,6 +1287,7 @@ subroutine phys_final( phys_state, phys_tend, pbuf2d ) use microp_aero, only: microp_aero_final use phys_grid_ctem, only: phys_grid_ctem_final use nudging, only: Nudge_Model, nudging_final + use hemco_interface, only: HCOI_Chunk_Final !----------------------------------------------------------------------- ! @@ -1295,6 +1313,11 @@ subroutine phys_final( phys_state, phys_tend, pbuf2d ) call phys_grid_ctem_final() if(Nudge_Model) call nudging_final() + if(use_hemco) then + ! cleanup hemco + call HCOI_Chunk_Final + endif + end subroutine phys_final @@ -1573,7 +1596,7 @@ subroutine tphysac (ztodt, cam_in, & call cam_snapshot_all_outfld_tphysac(cam_snapshot_before_num, state, tend, cam_in, cam_out, pbuf,& fh2o, surfric, obklen, flx_heat, cmfmc, dlf, det_s, det_ice, net_flx) end if - call chem_emissions( state, cam_in ) + call chem_emissions( state, cam_in, pbuf ) if (trim(cam_take_snapshot_after) == "chem_emissions") then call cam_snapshot_all_outfld_tphysac(cam_snapshot_after_num, state, tend, cam_in, cam_out, pbuf,& fh2o, surfric, obklen, flx_heat, cmfmc, dlf, det_s, det_ice, net_flx) @@ -2362,7 +2385,7 @@ subroutine tphysac (ztodt, cam_in, & else ! ! for moist-mixing ratio based dycores - ! + ! ! Note: this operation will NOT be reverted with set_wet_to_dry after set_dry_to_wet call ! call set_dry_to_wet(state) @@ -2384,7 +2407,7 @@ subroutine tphysac (ztodt, cam_in, & if (vc_dycore == vc_height.or.vc_dycore == vc_dry_pressure) then ! ! MPAS and SE specific scaling of temperature for enforcing energy consistency - ! (and to make sure that temperature dependent diagnostic tendencies + ! (and to make sure that temperature dependent diagnostic tendencies ! are computed correctly; e.g. dtcore) ! scaling(1:ncol,:) = cpairv(:ncol,:,lchnk)/cp_or_cv_dycore(:ncol,:,lchnk) diff --git a/src/physics/simple/frierson.F90 b/src/physics/simple/frierson.F90 new file mode 100644 index 0000000000..08e524bbdc --- /dev/null +++ b/src/physics/simple/frierson.F90 @@ -0,0 +1,1174 @@ +module frierson +!------------------------------------------------------------------------------------ +! +! Purpose: Implement idealized forcings described in +! Frierson, et al. (2006), "A Gray-Radiation +! Aquaplanet Moist GCM. Part I. Static Stability and Eddy Scale" +! J. Atmos. Sci., Vol. 63, 2548-2566. +! +! DOI: https://doi.org/10.1175/JAS3753.1 +! +!==================================================================================== + ! + ! The only modules that are permitted + !-------------------------------------- + use shr_kind_mod, only: r8 => shr_kind_r8 + use shr_const_mod, only: pi => shr_const_pi + + ! Set all Global values and routine to private by default + ! and then explicitly set their exposure + !--------------------------------------------------------- + implicit none + private + save + + public:: frierson_set_const + public:: frierson_condensate_NONE + public:: frierson_condensate + public:: frierson_condensate_TJ16 + public:: frierson_condensate_USER + public:: frierson_pbl + public:: frierson_pbl_USER + public:: frierson_radiation + public:: frierson_radiation_USER + + ! Global Tuning Parameters: + ! T0 and E0 are the temperature and saturation vapor pressure used + ! to calculate qsat values, the saturation value for Q (kg/kg) + !-------------------------------------------------------------------- + real(r8):: T0 + real(r8):: E0 + real(r8):: Erad + real(r8):: Wind_min + real(r8):: Z0 + real(r8):: Ri_c + real(r8):: Karman + real(r8):: Fb + real(r8):: Rs0 + real(r8):: DeltaS + real(r8):: Tau_eqtr + real(r8):: Tau_pole + real(r8):: LinFrac + real(r8):: Boltz + real(r8):: C_ocn + + ! Private data + !---------------------- + real(r8),private :: gravit ! g: gravitational acceleration (m/s2) + real(r8),private :: cappa ! Rd/cp + real(r8),private :: rair ! Rd: dry air gas constant (J/K/kg) + real(r8),private :: cpair ! cp: specific heat of dry air (J/K/kg) + real(r8),private :: latvap ! L: latent heat of vaporization (J/kg) + real(r8),private :: rh2o ! Rv: water vapor gas constant (J/K/kg) + real(r8),private :: epsilo ! Rd/Rv: ratio of h2o to dry air molecular weights + real(r8),private :: rhoh2o ! density of liquid water (kg/m3) + real(r8),private :: zvir ! (rh2o/rair) - 1, needed for virtual temperature + real(r8),private :: ps0 ! Base state surface pressure (Pa) + + real(r8),private :: latvap_div_cpair ! latvap/cpair + real(r8),private :: latvap_div_rh2o ! latvap/rh2o + + real(r8),private,allocatable:: etamid(:) ! hybrid coordinate - midpoints + + +contains + !======================================================================= + subroutine frierson_set_const(I_gravit,I_cappa ,I_rair ,I_cpair ,I_latvap , & + I_rh2o ,I_epsilo ,I_rhoh2o ,I_zvir ,I_ps0 , & + I_etamid,I_T0 ,I_E0 ,I_Erad ,I_Wind_min, & + I_Z0 ,I_Ri_c ,I_Karman ,I_Fb ,I_Rs0 , & + I_DeltaS,I_Tau_eqtr,I_Tau_pole,I_LinFrac,I_Boltz , & + I_Cocn ) + ! + ! frierson_set_const: Set parameters and constants for the Frierson + ! Model fomulation. Optional inputs can be provided + ! to over-ride the model defaults. + !===================================================================== + + use cam_abortutils, only: handle_allocate_error + + ! + ! Passed Variables + !------------------- + real(r8),intent(in):: I_gravit + real(r8),intent(in):: I_cappa + real(r8),intent(in):: I_rair + real(r8),intent(in):: I_cpair + real(r8),intent(in):: I_latvap + real(r8),intent(in):: I_rh2o + real(r8),intent(in):: I_epsilo + real(r8),intent(in):: I_rhoh2o + real(r8),intent(in):: I_zvir + real(r8),intent(in):: I_ps0 + real(r8),intent(in):: I_etamid(:) + + real(r8),intent(in) :: I_T0 + real(r8),intent(in) :: I_E0 + real(r8),intent(in) :: I_Erad + real(r8),intent(in) :: I_Wind_min + real(r8),intent(in) :: I_Z0 + real(r8),intent(in) :: I_Ri_c + real(r8),intent(in) :: I_Karman + real(r8),intent(in) :: I_Fb + real(r8),intent(in) :: I_Rs0 + real(r8),intent(in) :: I_DeltaS + real(r8),intent(in) :: I_Tau_eqtr + real(r8),intent(in) :: I_Tau_pole + real(r8),intent(in) :: I_LinFrac + real(r8),intent(in) :: I_Boltz + real(r8),intent(in) :: I_Cocn + + integer :: ierr + + ! Set global constants for later use + !------------------------------------ + gravit = I_gravit + cappa = I_cappa + rair = I_rair + cpair = I_cpair + latvap = I_latvap + rh2o = I_rh2o + epsilo = I_epsilo + rhoh2o = I_rhoh2o + zvir = I_zvir + ps0 = I_ps0 + T0 = I_T0 + E0 = I_E0 + Erad = I_Erad + Wind_min = I_Wind_min + Z0 = I_Z0 + Ri_c = I_Ri_c + Karman = I_Karman + Fb = I_Fb + Rs0 = I_Rs0 + DeltaS = I_DeltaS + Tau_eqtr = I_Tau_eqtr + Tau_pole = I_Tau_pole + LinFrac = I_LinFrac + Boltz = I_Boltz + C_ocn = I_Cocn + + latvap_div_cpair = latvap/cpair + latvap_div_rh2o = latvap/rh2o + + ! allocate space and set the level information + !---------------------------------------------- + allocate(etamid(size(I_etamid)),stat=ierr) + if (ierr /= 0) then + call handle_allocate_error(ierr, 'frierson_set_const', 'etamid') + end if + + etamid = I_etamid + + end subroutine frierson_set_const + !======================================================================= + + + !======================================================================= + subroutine frierson_condensate_NONE(ncol,pver,pmid,T,qv,relhum,precl) + ! + ! Precip_process: Implement NO large-scale condensation/precipitation + !======================================================================= + ! + ! Passed Variables + !--------------------- + integer ,intent(in) :: ncol ! number of columns + integer ,intent(in) :: pver ! number of vertical levels + real(r8),intent(in) :: pmid (ncol,pver) ! mid-point pressure (Pa) + real(r8),intent(inout):: T (ncol,pver) ! temperature (K) + real(r8),intent(inout):: qv (ncol,pver) ! specific humidity Q (kg/kg) + real(r8),intent(out) :: relhum(ncol,pver) ! relative humidity + real(r8),intent(out) :: precl (ncol) ! large-scale precipitation rate (m/s) + ! + ! Local Values + !------------- + real(r8):: qsat + integer :: i, k + + ! Set large scale precipitation rates to zero + !-------------------------------------------------------------------------- + precl(:) = 0.0_r8 + + ! Large-Scale Condensation and Precipitation without cloud stage + !--------------------------------------------------------------- + do k = 1, pver + do i = 1, ncol + ! calculate saturation value for Q + !---------------------------------- + qsat = epsilo*E0/pmid(i,k)*exp(-latvap_div_rh2o*((1._r8/T(i,k))-1._r8/T0)) + + ! Set percent relative humidity + !------------------------------- + relhum(i,k) = (qv(i,k)/qsat)*100._r8 + end do + end do + + end subroutine frierson_condensate_NONE + !======================================================================= + + + !======================================================================= + subroutine frierson_condensate(ncol,pver,dtime,pmid,pdel,T,qv,relhum,precl,evapdt,evapdq) + ! + ! Precip_process: Implement large-scale condensation/precipitation + ! from Frierson 2006. + ! + !======================================================================= + ! + ! Passed Variables + !--------------------- + integer ,intent(in) :: ncol ! number of columns + integer ,intent(in) :: pver ! number of vertical levels + real(r8),intent(in) :: dtime ! time step (s) + real(r8),intent(in) :: pmid (ncol,pver) ! mid-point pressure (Pa) + real(r8),intent(in) :: pdel (ncol,pver) ! layer thickness (Pa) + real(r8),intent(inout):: T (ncol,pver) ! temperature (K) + real(r8),intent(inout):: qv (ncol,pver) ! specific humidity Q (kg/kg) + real(r8),intent(out) :: relhum(ncol,pver) ! relative humidity + real(r8),intent(out) :: precl (ncol) ! large-scale precipitation rate (m/s) + real(r8),intent(out) :: evapdt(ncol,pver) ! T tendency due to re-evaporation + real(r8),intent(out) :: evapdq(ncol,pver) ! Q tendency due to re-evaporation + ! + ! Local Values + !------------- + logical,parameter :: do_evap = .true. + + real(r8):: esat (ncol,pver) + real(r8):: qsat (ncol,pver) + real(r8):: dqsat(ncol,pver) + real(r8):: qdel (ncol,pver) + real(r8):: tdel (ncol,pver) + real(r8):: qnew (ncol,pver) + real(r8):: tnew (ncol,pver) + real(r8):: qext (ncol) + real(r8):: qdef (ncol) + + integer :: i, k + + ! Large-Scale Condensation and Precipitation + !-------------------------------------------- + do k = 1,pver + + ! calculate saturation vapor pressure + !------------------------------------- + esat(:,k) = E0*exp(-(latvap_div_rh2o)*((1._r8/T(:,k))-1._r8/T0)) + + ! calculate saturation value for Q + !---------------------------------- + do i = 1,ncol + if(pmid(i,k) > (1._r8-epsilo)*esat(i,k)) then + qsat (i,k) = epsilo*esat(i,k)/pmid(i,k) + dqsat(i,k) = (latvap_div_rh2o)*qsat(i,k)/(T(i,k)**2) + else + qsat (i,k) = 0._r8 + dqsat(i,k) = 0._r8 + endif + end do + + ! if > 100% relative humidity, rain falls out + !--------------------------------------------- + where(((qv(:,k)-qsat(:,k))*qsat(:,k)) > 0._r8) + qdel (:,k) = (qsat(:,k)-qv(:,k))/(1._r8+(latvap_div_cpair)*dqsat(:,k)) + tdel (:,k) = -(latvap_div_cpair)*qdel(:,k) + else where + qdel (:,k) = 0._r8 + tdel (:,k) = 0._r8 + end where + + ! Update temperature and water vapor + !----------------------------------- + qnew(:,k) = qv(:,k) + qdel(:,k) + tnew(:,k) = T(:,k) + tdel(:,k) + end do + + ! optionally allow for re-evaporation of falling precip + !------------------------------------------------------- + if(do_evap) then + ! Initialize work array for excess Q + !-------------------------------------- + qext(:) = 0._r8 + + ! Loop down thru the model levels + !--------------------------------- + do k = 1, pver + + ! Add qdel for the current level to the excess + !---------------------------------------------- + where(qdel(:,k) < 0._r8) qext(:) = qext(:) - qdel(:,k)*pdel(:,k)/gravit + + ! Evaporate excess Q where needed + !---------------------------------- + qdef(:) = 0._r8 + where((qdel(:,k) >= 0._r8).and.(qext(:) > 0._r8)) + qext(:) = qext(:)*gravit/pdel(:,k) + qdef(:) = (qsat(:,k)-qv(:,k))/(1._r8+(latvap_div_cpair)*dqsat(:,k)) + qdef(:) = min(qext(:),max(qdef(:),0._r8)) + qdel(:,k) = qdel(:,k) + qdef(:) + tdel(:,k) = tdel(:,k) -(latvap_div_cpair)*qdef(:) + qext(:) = (qext(:)-qdef(:))*pdel(:,k)/gravit + + ! Update temperature and water vapor + !----------------------------------- + qnew(:,k) = qv(:,k) + qdel(:,k) + tnew(:,k) = T(:,k) + tdel(:,k) + end where + + ! Save T/Q tendencies due to re-evaporation + !-------------------------------------------- + evapdq(:,k) = qdef(:)/dtime + evapdt(:,k) = -qdef(:)*latvap_div_cpair/dtime + end do ! k = 1, pver + else + ! Set T/Q re-evaporation tendencies to 0 + !-------------------------------------------- + evapdt(:,:) = 0._r8 + evapdq(:,:) = 0._r8 + endif + + ! Set large scale precipitation rates to zero + !-------------------------------------------------------------------------- + precl(:) = 0.0_r8 + + ! Calculate resulting precip value and relative humidity + !-------------------------------------------------------- + do k = 1, pver + precl (:) = precl(:) - (qdel(:,k)*pdel(:,k))/(gravit*rhoh2o) + qsat (:,k) = (epsilo/pmid(:,k))*E0*exp(-latvap_div_rh2o*((1._r8/tnew(:,k))-1._r8/T0)) + relhum(:,k) = (qnew(:,k)/qsat (:,k))*100._r8 + end do + precl(:) = max(precl(:),0._r8)/dtime + + ! Update T and qv values due to precipitation + !-------------------------------------------- + qv(:,:) = qnew(:,:) + T (:,:) = tnew(:,:) + + end subroutine frierson_condensate + !======================================================================= + + + !======================================================================= + subroutine frierson_condensate_TJ16(ncol,pver,dtime,pmid,pdel,T,qv,relhum,precl) + ! + ! Precip_process: Implement large-scale condensation/precipitation + ! from TJ16. + ! + !======================================================================= + ! + ! Passed Variables + !--------------------- + integer ,intent(in) :: ncol ! number of columns + integer ,intent(in) :: pver ! number of vertical levels + real(r8),intent(in) :: dtime ! time step (s) + real(r8),intent(in) :: pmid (ncol,pver) ! mid-point pressure (Pa) + real(r8),intent(in) :: pdel (ncol,pver) ! layer thickness (Pa) + real(r8),intent(inout):: T (ncol,pver) ! temperature (K) + real(r8),intent(inout):: qv (ncol,pver) ! specific humidity Q (kg/kg) + real(r8),intent(out) :: relhum(ncol,pver) ! relative humidity + real(r8),intent(out) :: precl (ncol) ! large-scale precipitation rate (m/s) + ! + ! Local Values + !------------- + real(r8):: qsat + real(r8):: Crate + integer :: i, k + + ! Set large scale precipitation rates to zero + !-------------------------------------------------------------------------- + precl(:) = 0.0_r8 + + ! Large-Scale Condensation and Precipitation without cloud stage + !--------------------------------------------------------------- + do k = 1, pver + do i = 1, ncol + ! calculate saturation value for Q + !---------------------------------- + qsat = epsilo*E0/pmid(i,k)*exp(-latvap_div_rh2o*((1._r8/T(i,k))-1._r8/T0)) + + ! if > 100% relative humidity rain falls out + !------------------------------------------- + if(qv(i,k) > qsat) then + ! calc the condensation and large-scale precipitation(m/s) rates + !------------------------------------------------------------------- + Crate = ((qv(i,k)-qsat)/dtime) & + /(1._r8+(latvap_div_cpair)*(epsilo*latvap*qsat/(rair*T(i,k)**2))) + precl(i) = precl(i) + (Crate*pdel(i,k))/(gravit*rhoh2o) + + ! Update T and qv values due to precipitation + !-------------------------------------------- + T (i,k) = T (i,k) + Crate*(latvap_div_cpair)*dtime + qv(i,k) = qv(i,k) - Crate*dtime + + ! recompute qsat with updated T + !------------------------------- + qsat = epsilo*E0/pmid(i,k)*exp(-latvap_div_rh2o*((1._r8/T(i,k))-1._r8/T0)) + endif + + ! Set percent relative humidity + !------------------------------- + relhum(i,k) = (qv(i,k)/qsat)*100._r8 + end do + end do + + end subroutine frierson_condensate_TJ16 + !======================================================================= + + + !======================================================================= + subroutine frierson_condensate_USER(ncol,pver,dtime,pmid,pdel,T,qv,relhum,precl) + ! + ! frierson_condensate_USER: This routine is a stub which users can use + ! to develop and test their own large scale + ! condensation scheme + !======================================================================= + ! + ! Passed Variables + !--------------------- + integer ,intent(in) :: ncol ! number of columns + integer ,intent(in) :: pver ! number of vertical levels + real(r8),intent(in) :: dtime ! time step (s) + real(r8),intent(in) :: pmid (ncol,pver) ! mid-point pressure (Pa) + real(r8),intent(in) :: pdel (ncol,pver) ! layer thickness (Pa) + real(r8),intent(inout):: T (ncol,pver) ! temperature (K) + real(r8),intent(inout):: qv (ncol,pver) ! specific humidity Q (kg/kg) + real(r8),intent(out) :: relhum(ncol,pver) ! relative humidity + real(r8),intent(out) :: precl (ncol) ! large-scale precipitation rate (m/s) + ! + ! Local Values + !------------- + real(r8):: qsat + integer :: i, k + + ! Set large scale precipitation rates to zero + !-------------------------------------------------------------------------- + precl(:) = 0.0_r8 + + ! Large-Scale Condensation and Precipitation without cloud stage + !--------------------------------------------------------------- + do k = 1, pver + do i = 1, ncol + ! calculate saturation value for Q + !---------------------------------- + qsat = epsilo*E0/pmid(i,k)*exp(-latvap_div_rh2o*((1._r8/T(i,k))-1._r8/T0)) + + ! Set percent relative humidity + !------------------------------- + relhum(i,k) = (qv(i,k)/qsat)*100._r8 + end do + end do + + end subroutine frierson_condensate_USER + !======================================================================= + + + !======================================================================= + subroutine frierson_pbl(ncol, pver, dtime, pmid, pint, Zm, Zi, & + Psfc, Tsfc, Qsfc, T, U, V, Q, Fsw, Fdn, & + Cdrag, Km, Ke, VSE, Z_pbl, Rf, dQa, dTa, dUa, dVa, & + LHflux, SHflux, TUflux, TVflux ) + ! + ! The implicit PBL parameterization based on Frierson, et al. 2006. + ! + ! frierson_pbl: This is an implementation of the implicit computation + ! derived from the code of the Frierson model. The + ! calculations are roughly divided up into sections of + ! the model where they should be carried out. + ! + !========================================================================== + ! + ! Passed Variables + !------------------ + integer ,intent(in) :: ncol ! Number of columns + integer ,intent(in) :: pver ! Number of levels + real(r8),intent(in) :: dtime ! Time Step + real(r8),intent(in) :: pmid (ncol,pver) ! Pressure at model levels + real(r8),intent(in) :: pint (ncol,pver+1) ! Pressure at interface levels. + real(r8),intent(in) :: Zm (ncol,pver) ! Height at model levels. + real(r8),intent(in) :: Zi (ncol,pver) ! Height at interface levels. + real(r8),intent(in) :: Psfc (ncol) ! Surface Pressure. + real(r8),intent(inout):: Tsfc (ncol) ! SST temperature K + real(r8),intent(inout):: Qsfc (ncol) ! sea surface water vapor (kg/kg) + real(r8),intent(inout):: T (ncol,pver) ! ATM Temperature values. + real(r8),intent(inout):: U (ncol,pver) ! ATM Zonal Wind values. + real(r8),intent(inout):: V (ncol,pver) ! ATM Meridional Wind values. + real(r8),intent(inout):: Q (ncol,pver) ! ATM Water vapor values. + real(r8),intent(in) :: Fdn (ncol) ! Downward LW flux at surface + real(r8),intent(in) :: Fsw (ncol) ! Net SW flux at surface from gray radiation + real(r8),intent(out) :: Cdrag (ncol) ! Surface drage coef. + real(r8),intent(out) :: Km (ncol,pver+1) ! Eddy diffusivity for PBL (momentum) + real(r8),intent(out) :: Ke (ncol,pver+1) ! Eddy diffusivity for PBL + real(r8),intent(out) :: VSE (ncol,pver) ! Virtual-Dry Static energy + real(r8),intent(out) :: Z_pbl (ncol) ! Height of PBL layer. + real(r8),intent(out) :: Rf (ncol,pver) + real(r8),intent(out) :: dTa (ncol,pver) + real(r8),intent(out) :: dQa (ncol,pver) + real(r8),intent(out) :: dUa (ncol,pver) + real(r8),intent(out) :: dVa (ncol,pver) + real(r8),intent(out) :: LHflux(ncol) ! Latent Heat Flux + real(r8),intent(out) :: SHflux(ncol) ! Sensible Heat Flux + real(r8),intent(out) :: TUflux(ncol) ! U Surface stress + real(r8),intent(out) :: TVflux(ncol) ! V Surface stress + ! + ! Local Values + !--------------- + real(r8):: Tv (ncol,pver) + real(r8):: Thv (ncol,pver) + real(r8):: Ws (ncol,pver) + real(r8):: rho (ncol) ! Air density near the ground (kg/m3) + real(r8):: Z_sfc (ncol) + real(r8):: Rf_sfc(ncol) + real(r8):: Ri_a (ncol) + real(r8):: Ri (ncol,pver) + integer :: K_sfc (ncol) + integer :: K_pbl (ncol) + real(r8):: Ke_pbl(ncol) + real(r8):: Km_pbl(ncol) + real(r8):: Z_a (ncol) ! Height at midpoint of the lowest model level (m) + real(r8):: Ws_a (ncol) ! wind speed at the lowest model level (m/s) + real(r8):: Thv_a (ncol) + real(r8):: Thv_s (ncol) + real(r8):: Ustar (ncol) + real(r8):: Bstar (ncol) + real(r8):: ZETA,PHI + + real(r8):: MU (ncol,pver) + real(r8):: NUe(ncol,pver) + real(r8):: NUm(ncol,pver) + real(r8):: Am (ncol,pver) + real(r8):: Bm (ncol,pver) + real(r8):: Cm (ncol,pver) + real(r8):: Ae (ncol,pver) + real(r8):: Be (ncol,pver) + real(r8):: Ce (ncol,pver) + real(r8):: FLu(ncol,pver) + real(r8):: FLv(ncol,pver) + real(r8):: FLq(ncol,pver) + real(r8):: FLt(ncol,pver) + real(r8):: Et (ncol,pver) + real(r8):: Eq (ncol,pver) + real(r8):: Eu (ncol,pver) + real(r8):: Ev (ncol,pver) + + real(r8):: Fval_t(ncol,pver) + real(r8):: Fval_q(ncol,pver) + real(r8):: Fval_u(ncol,pver) + real(r8):: Fval_v(ncol,pver) + real(r8):: Eval_m(ncol,pver) + real(r8):: Eval_e(ncol,pver) + integer :: i, k + + real(r8):: Su(ncol,pver) + real(r8):: Sv(ncol,pver) + real(r8):: St(ncol,pver) + real(r8):: Sq(ncol,pver) + + real(r8):: Estar_u(ncol) + real(r8):: Estar_v(ncol) + real(r8):: Estar_q(ncol) + real(r8):: Estar_t(ncol) + real(r8):: dFa_dTa(ncol) + real(r8):: dFa_dQa(ncol) + real(r8):: dFa_dUa(ncol) + real(r8):: dFa_dVa(ncol) + + real(r8):: Th_a (ncol) + real(r8):: Th_s (ncol) + real(r8):: Ft (ncol) + real(r8):: dFt_dTa (ncol) + real(r8):: dFt_dTs (ncol) + real(r8):: Fq (ncol) + real(r8):: dFq_dQa (ncol) + real(r8):: dFq_dTs (ncol) + real(r8):: Fu (ncol) + real(r8):: dFu_dUa (ncol) + real(r8):: Fv (ncol) + real(r8):: dFv_dVa (ncol) + real(r8):: Fup (ncol) + real(r8):: dFup_dTs(ncol) + + real(r8):: FN_u (ncol) + real(r8):: FN_v (ncol) + real(r8):: EN_t (ncol) + real(r8):: FN_t (ncol) + real(r8):: EN_q (ncol) + real(r8):: FN_q (ncol) + real(r8):: Flux (ncol) + real(r8):: dFlux(ncol) + real(r8):: dTs (ncol) + + real(r8):: Tsfc_bc(ncol) + + !============================================================================ + ! tphysbc(): + ! + ! Required Values: + ! T(:,:),Q(:,:),U(:,:),V(:,:) + ! Pmid(:,:),Pint(:,:),Zm(:,:),Zi(:,:) + ! Tsfc(:),Qsfc(:),Psfc(:) + !============================================================================ + + ! Sx() values allow for explicit source tendencies to be passed to + ! implicit PBL calculation. Set all values to 0. for now. + !------------------------------------------------------------------------- + Su(:,:) = 0._r8 + Sv(:,:) = 0._r8 + St(:,:) = 0._r8 + Sq(:,:) = 0._r8 + + ! Calc some values we will need later on + !------------------------------------------ + do k = 1, pver + Ws (:,k) = sqrt(U(:,k)**2 + V(:,k)**2 + Wind_min) + Tv (:,k) = T (:,k)*(1._r8+zvir*Q(:,k)) + Thv(:,k) = Tv(:,k)*((ps0/pmid(:,k))**cappa) + VSE(:,k) = Tv(:,k)+gravit*Zm(:,k)/cpair + end do + + ! Calculate Drag Coef and related values + !----------------------------------------- + do i = 1,ncol + Z_a (i) = Zm (i,pver) + Ws_a (i) = Ws (i,pver) + Thv_a(i) = Thv(i,pver) + Thv_s(i) = Tsfc(i)*(1._r8+zvir*Qsfc(i) )*((ps0/Psfc(i))**cappa) + Ri_a (i) = (gravit*Z_a(i)/(Ws_a(i)**2))*(Thv_a(i)-Thv_s(i))/Thv_s(i) + if(Ri_a(i) <= 0._r8) then + Cdrag(i) = (Karman/log((Z_a(i)/Z0)))**2 + elseif(Ri_a(i) >= Ri_c) then + Cdrag(i) = 0._r8 + else + Cdrag(i) = ((1._r8-(Ri_a(i)/Ri_c))*Karman/log((Z_a(i)/Z0)))**2 + endif + Ustar(i) = sqrt(Cdrag(i))*Ws_a(i) + Bstar(i) = sqrt(Cdrag(i))*(gravit*(Thv_a(i)-Thv_s(i))/Thv_s(i)) + end do + + ! Calculate a bulk Richardson number and determine + ! depths of boundary/surface layers. + !---------------------------------------------------- + do k = 1,pver + Ri(:,k) = (gravit*Zm(:,k)/(Ws(:,k)**2))*(VSE(:,k)-VSE(:,pver))/VSE(:,pver) + Rf(:,k) = Ri(:,k)/Ri_c + end do + + do i =1,ncol + Z_pbl(i) = Zm(i,pver) + K_pbl(i) = pver + do k = (pver-1),1,-1 + if(Rf(i,k) > 1._r8) then + K_pbl(i) = k + 1 + Z_pbl(i) = (Zm(i,k+1)*(Rf(i,k)- 1._r8 ) & + +Zm(i,k )*( 1._r8 - Rf(i,k+1)))/(Rf(i,k)-Rf(i,k+1)) + exit + endif + end do + + ! surface layer height is a fixed fraction of the PBL + ! determine the corresponding level index and Rf value + !----------------------------------------------------- + Z_sfc(i) = Fb*Z_pbl(i) + K_sfc(i) = pver + do k = (pver-1),1,-1 + if(Zm(i,k) > Z_sfc(i)) then + K_sfc (i) = k + 1 + Rf_sfc(i) = (Rf(i,k+1)*(Zm(i,k) - Z_sfc(i) ) & + + Rf(i,k )*(Z_sfc(i) - Zm(i,k+1)))/(Zm(i,k)-Zm(i,k+1)) + exit + endif + end do + end do ! i =1,ncol + + ! Compute diffusion coefs + !------------------------- + Ke(:,:) = 0._r8 + Ke_pbl(:) = 0._r8 + do i = 1,ncol + if (Cdrag(i) /= 0._r8) then + do k = pver,K_pbl(i),-1 + ZETA = Zi(i,k)*Karman*Bstar(i)/(Ustar(i)*Ustar(i)) + if(ZETA < 0._r8) then + if(k >= K_sfc(i)) then + Ke(i,k) = Karman*Ustar(i)*Zi(i,k) + else + Ke(i,k) = Karman*Ustar(i)*Zi(i,k) & + *(((Z_pbl(i)-Zi(i,k))/(Z_pbl(i)-Z_sfc(i)))**2) + endif + elseif (ZETA < Ri_c) then + PHI = 1._r8 + ZETA + if(k >= K_sfc(i)) then + Ke(i,k) = Karman*Ustar(i)*Zi(i,k)/PHI + else + Ke(i,k) = Karman*Ustar(i)*Zi(i,k) & + *(((Z_pbl(i)-Zi(i,k))/(Z_pbl(i)-Z_sfc(i)))**2)/PHI + endif + endif + end do + Ke_pbl(i) = Ke(i,K_sfc(i))*Z_sfc(i)/Zi(i,K_sfc(i)) + endif + end do + + ! The Same coefs used for momentum + !----------------------------------- + Km(:,:) = Ke(:,:) + Km_pbl(:) = Ke_pbl(:) + + ! Compute downward values for the implicit PBL scheme + !----------------------------------------------------- + do k = 1,pver + MU (:,k) = gravit*dtime/(Pint(:,k+1) - Pint(:,k)) + end do + + NUe(:,:) = 0._r8 + NUm(:,:) = 0._r8 + do k = 2,pver + rho(:) = 2._r8*Pint(:,k)/(rair*(Tv(:,k)+Tv(:,k-1))) + NUe(:,k) = rho(:)*Ke(:,k)/(Zm(:,k)-Zm(:,k-1)) + NUm(:,k) = rho(:)*Km(:,k)/(Zm(:,k)-Zm(:,k-1)) + end do + + Am(:,1 ) = MU(:,1)*NUm(:,2) + Cm(:,1 ) = 0._r8 + Am(:,pver) = 0._r8 + Cm(:,pver) = MU(:,pver)*NUm(:,pver) + Ae(:,1 ) = MU(:,1 )*NUe(:,2) + Ce(:,1 ) = 0._r8 + Ae(:,pver) = 0._r8 + Ce(:,pver) = MU(:,pver)*NUe(:,pver) + do k = 2,(pver-1) + Am(:,k) = MU(:,k)*NUm(:,k+1) + Cm(:,k) = MU(:,k)*NUm(:,k ) + Ae(:,k) = MU(:,k)*NUe(:,k+1) + Ce(:,k) = MU(:,k)*NUe(:,k ) + end do + Bm(:,:) = 1._r8 - Am(:,:) - Cm(:,:) + Be(:,:) = 1._r8 - Ae(:,:) - Ce(:,:) + + FLu(:,1) = 0._r8 + FLv(:,1) = 0._r8 + FLq(:,1) = 0._r8 + FLt(:,1) = 0._r8 + do k = 2,pver + FLu(:,k) = NUm(:,k)*(U (:,k)-U (:,k-1)) + FLv(:,k) = NUm(:,k)*(V (:,k)-V (:,k-1)) + FLq(:,k) = NUe(:,k)*(Q (:,k)-Q (:,k-1)) + FLt(:,k) = NUe(:,k)*(VSE(:,k)-VSE(:,k-1)) + end do + do k = 1,(pver-1) + Eu(:,k) = Su(:,k) + MU(:,k)*(FLu(:,k)-FLu(:,k+1)) + Ev(:,k) = Sv(:,k) + MU(:,k)*(FLv(:,k)-FLv(:,k+1)) + Eq(:,k) = Sq(:,k) + MU(:,k)*(FLq(:,k)-FLq(:,k+1)) + Et(:,k) = St(:,k) + MU(:,k)*(FLt(:,k)-FLt(:,k+1)) + end do + Eu(:,pver) = Su(:,pver) + MU(:,pver)*FLu(:,pver) + Ev(:,pver) = Sv(:,pver) + MU(:,pver)*FLv(:,pver) + Eq(:,pver) = Sq(:,pver) + MU(:,pver)*FLq(:,pver) + Et(:,pver) = St(:,pver) + MU(:,pver)*FLt(:,pver) + + Eval_m(:,1) = -Am(:,1)/Bm(:,1) + Eval_e(:,1) = -Ae(:,1)/Be(:,1) + Fval_u(:,1) = Eu(:,1)/Bm(:,1) + Fval_v(:,1) = Ev(:,1)/Bm(:,1) + Fval_q(:,1) = Eq(:,1)/Be(:,1) + Fval_t(:,1) = Et(:,1)/Be(:,1) + do k = 2,(pver-1) + Eval_m(:,k) = -Am(:,k)/(Bm(:,k)+Cm(:,k)*Eval_m(:,k-1)) + Eval_e(:,k) = -Ae(:,k)/(Be(:,k)+Ce(:,k)*Eval_e(:,k-1)) + Fval_u(:,k) = (Eu(:,k)-Cm(:,k)*Fval_u(:,k-1)) & + /(Bm(:,k)+Cm(:,k)*Eval_m(:,k-1)) + Fval_v(:,k) = (Ev(:,k)-Cm(:,k)*Fval_v(:,k-1)) & + /(Bm(:,k)+Cm(:,k)*Eval_m(:,k-1)) + Fval_q(:,k) = (Eq(:,k)-Ce(:,k)*Fval_q(:,k-1)) & + /(Be(:,k)+Ce(:,k)*Eval_e(:,k-1)) + Fval_t(:,k) = (Et(:,k)-Ce(:,k)*Fval_t(:,k-1)) & + /(Be(:,k)+Ce(:,k)*Eval_e(:,k-1)) + end do + Eval_m(:,pver) = 0._r8 + Eval_e(:,pver) = 0._r8 + Fval_u(:,pver) = 0._r8 + Fval_v(:,pver) = 0._r8 + Fval_q(:,pver) = 0._r8 + Fval_t(:,pver) = 0._r8 + + Estar_u(:) = (Eu(:,pver)-Cm(:,pver)*Fval_u(:,pver-1)) + Estar_v(:) = (Ev(:,pver)-Cm(:,pver)*Fval_v(:,pver-1)) + Estar_q(:) = (Eq(:,pver)-Ce(:,pver)*Fval_q(:,pver-1)) + Estar_t(:) = (Et(:,pver)-Ce(:,pver)*Fval_t(:,pver-1)) + + dFa_dTa(:) = NUe(:,pver)*(1._r8-Eval_e(:,pver-1)) + dFa_dQa(:) = NUe(:,pver)*(1._r8-Eval_e(:,pver-1)) + dFa_dUa(:) = NUm(:,pver)*(1._r8-Eval_m(:,pver-1)) + dFa_dVa(:) = NUm(:,pver)*(1._r8-Eval_m(:,pver-1)) + + !============================================================================ + ! flux calculation(): + ! + ! Required Values: + ! Passed from : + ! T(:,pver),Q(:,pver),U(:,pver),V(:,pver),Cdrag(:),Pmid(:,pver) + ! MU(:,pver),dFa_dTa(:),dFa_dQa(:),dFa_dUa(:),dFa_dVa(:) + ! Estar_t(:),Estar_q(:),Estar_u(:),Estar_v(:) + ! Passed from : + ! Tsfc(:),Qsfc(:),Psfc(:) + ! + !============================================================================ + + ! Calculate Surface flux values and their derivatives + !-------------------------------------------------------- + do i = 1, ncol + Th_a(i) = T (i,pver)*((ps0/pmid(i,pver))**cappa) + Th_s(i) = Tsfc(i) *((ps0/Psfc (i) )**cappa) + rho (i) = pmid (i,pver)/(rair*Tv(i,pver)) + + Ft (i) = rho(i)*Cdrag(i)*Ws_a(i)*(Th_s (i) - Th_a(i)) + Fq (i) = rho(i)*Cdrag(i)*Ws_a(i)*(Qsfc(i) - Q(i,pver)) + Fu (i) = -rho(i)*Cdrag(i)*Ws_a(i)*U(i,pver) + Fv (i) = -rho(i)*Cdrag(i)*Ws_a(i)*V(i,pver) + Fup (i) = Boltz*Tsfc(i)**4 + + dFt_dTa(i) = -rho(i)*Cdrag(i)*Ws_a(i)*((ps0/pmid(i,pver))**cappa) + dFq_dQa(i) = -rho(i)*Cdrag(i)*Ws_a(i) + dFu_dUa(i) = -rho(i)*Cdrag(i)*Ws_a(i) + dFv_dVa(i) = -rho(i)*Cdrag(i)*Ws_a(i) + + dFt_dTs(i) = rho(i)*Cdrag(i)*Ws_a(i)*((ps0/Psfc (i) )**cappa) + dFq_dTs(i) = rho(i)*Cdrag(i)*Ws_a(i)*Qsfc(i)*latvap/(rh2o*(Tsfc(i)**2)) + dFup_dTs(i) = 4._r8*Boltz*Tsfc(i)**3 + end do + + ! Incorporate surface fluxes into implicit scheme, then + ! update flux values and derivatives + !------------------------------------------ + FN_u (:) = (Estar_u(:) + MU(:,pver)*Fu(:)) & + /(1._r8-MU(:,pver)*(dFa_dUa(:)+dFu_dUa(:))) + FN_v (:) = (Estar_v(:) + MU(:,pver)*Fv(:)) & + /(1._r8-MU(:,pver)*(dFa_dVa(:)+dFv_dVa(:))) + FN_t (:) = (Estar_t(:) + MU(:,pver)*Ft(:)) & + /(1._r8-MU(:,pver)*(dFa_dTa(:)+dFt_dTa(:))) + FN_q (:) = (Estar_q(:) + MU(:,pver)*Fq(:)) & + /(1._r8-MU(:,pver)*(dFa_dQa(:)+dFq_dQa(:))) + + EN_t (:) = ( MU(:,pver)*dFt_dTs(:) ) & + /(1._r8-MU(:,pver)*(dFa_dTa(:)+dFt_dTa(:))) + EN_q (:) = ( MU(:,pver)*dFq_dTs(:) ) & + /(1._r8-MU(:,pver)*(dFa_dQa(:)+dFq_dQa(:))) + + Ft (:) = Ft(:) + dFt_dTa(:)*FN_t(:) + Fq (:) = Fq(:) + dFq_dQa(:)*FN_q(:) + + dFt_dTs(:) = dFt_dTs(:) + dFt_dTa(:)*EN_t(:) + dFq_dTs(:) = dFq_dTs(:) + dFq_dQa(:)*EN_q(:) + + !============================================================================ + ! surface calculation(): + ! + ! Required Values: + ! Passed from : + ! Fup(:),Ft(:),Fq(:) + ! dFup_dTs(:),dFt_dTs(:),dFq_dTs(:) + ! Fsw(:) + ! Passed from : + ! Fdn(:) + ! + !============================================================================ + + ! Update surface values + !----------------------- + Tsfc_bc(:) = Tsfc(:) + + Flux (:) = (dtime/C_ocn)*(Fdn(:) - Fup(:) + Fsw(:) & + -cpair*Ft(:) -latvap*Fq(:) ) + dFlux(:) = (dtime/C_ocn)*(-dFup_dTs(:) -cpair*dFt_dTs(:) -latvap*dFq_dTs(:)) + Tsfc (:) = Tsfc(:) + (Flux(:)/(1._r8-dFlux(:))) + Qsfc (:) = epsilo*E0/Psfc(:)*exp(-latvap_div_rh2o*((1._r8/Tsfc(:))-1._r8/T0)) + dTs (:) = Tsfc(:) - Tsfc_bc(:) + + LHflux(:) = latvap*Fq(:) + SHflux(:) = cpair *Ft(:) + TUflux(:) = Fu(:) + TVflux(:) = Fv(:) + + !============================================================================ + ! tphysac(): + ! + ! Required Values: + ! Passed from : + ! FN_t(:),FN_q(:),FN_u(:),FN_v(:) + ! EN_t(:),EN_q(:),dTs(:) + ! Passed from : + ! Fval_t(:),Fval_q(:),Fval_u(:),Fval_v(:) + ! Eval_e(:),Eval_m(:) + ! + !============================================================================ + + ! Compute upward values for the implicit PBL scheme + !----------------------------------------------------- + dTa(:,pver) = FN_t(:) + EN_t(:)*dTs(:) + dQa(:,pver) = FN_q(:) + EN_q(:)*dTs(:) + dUa(:,pver) = FN_u(:) + dVa(:,pver) = FN_v(:) + do k=(pver-1),1,-1 + dTa(:,k) = Fval_t(:,k) + Eval_e(:,k)*dTa(:,k+1) + dQa(:,k) = Fval_q(:,k) + Eval_e(:,k)*dQa(:,k+1) + dUa(:,k) = Fval_u(:,k) + Eval_m(:,k)*dUa(:,k+1) + dVa(:,k) = Fval_v(:,k) + Eval_m(:,k)*dVa(:,k+1) + end do + + ! Update atmosphere values + !-------------------------- + U(:,:) = U(:,:) + dUa(:,:) + V(:,:) = V(:,:) + dVa(:,:) + Q(:,:) = Q(:,:) + dQa(:,:) + T(:,:) = T(:,:) + dTa(:,:) + + ! Return resulting Tendency values + !---------------------------------- + dUa(:,:) = dUa(:,:)/dtime + dVa(:,:) = dVa(:,:)/dtime + dQa(:,:) = dQa(:,:)/dtime + dTa(:,:) = dTa(:,:)/dtime + + end subroutine frierson_pbl + !======================================================================= + + + !======================================================================= + subroutine frierson_pbl_USER(ncol, pver, dtime, pmid, pint, Zm, Zi, & + Psfc, Tsfc, Qsfc, T, U, V, Q, Fsw, Fdn, & + Cdrag, Km, Ke, VSE, Z_pbl, Rf, dQa, dTa, dUa, dVa, & + LHflux, SHflux, TUflux, TVflux ) + ! + ! frierson_pbl_USER: This routine is a stub which users can use + ! to develop and test their own PBL scheme + !========================================================================== + ! + ! Passed Variables + !------------------ + integer ,intent(in) :: ncol ! Number of columns + integer ,intent(in) :: pver ! Number of levels + real(r8),intent(in) :: dtime ! Time Step + real(r8),intent(in) :: pmid (ncol,pver) ! Pressure at model levels + real(r8),intent(in) :: pint (ncol,pver+1) ! Pressure at interface levels. + real(r8),intent(in) :: Zm (ncol,pver) ! Height at model levels. + real(r8),intent(in) :: Zi (ncol,pver) ! Height at interface levels. + real(r8),intent(in) :: Psfc (ncol) ! Surface Pressure. + real(r8),intent(inout):: Tsfc (ncol) ! SST temperature K + real(r8),intent(inout):: Qsfc (ncol) ! sea surface water vapor (kg/kg) + real(r8),intent(inout):: T (ncol,pver) ! ATM Temperature values. + real(r8),intent(inout):: U (ncol,pver) ! ATM Zonal Wind values. + real(r8),intent(inout):: V (ncol,pver) ! ATM Meridional Wind values. + real(r8),intent(inout):: Q (ncol,pver) ! ATM Water vapor values. + real(r8),intent(in) :: Fdn (ncol) ! Downward LW flux at surface + real(r8),intent(in) :: Fsw (ncol) ! Net SW flux at surface from gray radiation + real(r8),intent(out) :: Cdrag (ncol) ! Surface drage coef. + real(r8),intent(out) :: Km (ncol,pver+1) ! Eddy diffusivity for PBL + real(r8),intent(out) :: Ke (ncol,pver+1) ! Eddy diffusivity for PBL + real(r8),intent(out) :: VSE (ncol,pver) ! Virtual-Dry Static energy.(huh?) + real(r8),intent(out) :: Z_pbl (ncol) ! Height of PBL layer. + real(r8),intent(out) :: Rf (ncol,pver) + real(r8),intent(out) :: dTa (ncol,pver) + real(r8),intent(out) :: dQa (ncol,pver) + real(r8),intent(out) :: dUa (ncol,pver) + real(r8),intent(out) :: dVa (ncol,pver) + real(r8),intent(out) :: LHflux(ncol) ! Latent Heat Flux + real(r8),intent(out) :: SHflux(ncol) ! Sensible Heat Flux + real(r8),intent(out) :: TUflux(ncol) ! U Surface stress + real(r8),intent(out) :: TVflux(ncol) ! V Surface stress + ! + ! Local Values + !--------------- + + + Cdrag = 0._r8 + Km = 0._r8 + Ke = 0._r8 + VSE = 0._r8 + Z_pbl = 0._r8 + Rf = 0._r8 + dTa = 0._r8 + dQa = 0._r8 + dUa = 0._r8 + dVa = 0._r8 + LHflux = 0._r8 + SHflux = 0._r8 + TUflux = 0._r8 + TVflux = 0._r8 + + end subroutine frierson_pbl_USER + !======================================================================= + + + !======================================================================= + subroutine frierson_radiation(ncol,pver,dtime,clat,pint,pmid, & + Psfc,Tsfc,Qsfc,T,qv,dtdt_rad, & + Fsolar,Fup_s,Fdown_s,Fup_toa,Fdown_toa) + ! + ! The gray radiation parameterization based on Frierson, et al. 2006. + ! + ! frierson_radiation: This is an implementation of the gray radiation + ! scheme used in the Frierson model. + !========================================================================== + ! + ! Passed Variables + !------------------- + integer ,intent(in) :: ncol ! number of columns + integer ,intent(in) :: pver ! number of vertical levels + real(r8),intent(in) :: dtime ! time step (s) + real(r8),intent(in) :: clat (ncol) ! latitude + real(r8),intent(in) :: pint (ncol,pver+1) ! mid-point pressure (Pa) + real(r8),intent(in) :: pmid (ncol,pver) ! mid-point pressure (Pa) + real(r8),intent(in) :: Psfc (ncol) ! surface pressure + real(r8),intent(in) :: Tsfc (ncol) ! surface temperature (K) + real(r8),intent(in) :: Qsfc (ncol) + real(r8),intent(inout):: T (ncol,pver) ! temperature (K) + real(r8),intent(in) :: qv (ncol,pver) ! Q (kg/kg) + real(r8),intent(out) :: dtdt_rad(ncol,pver) ! temperature tendency in K/s from relaxation + real(r8),intent(out) :: Fsolar (ncol) ! + real(r8),intent(out) :: Fup_s (ncol) ! + real(r8),intent(out) :: Fdown_toa(ncol) ! + real(r8),intent(out) :: Fup_toa (ncol) ! + real(r8),intent(out) :: Fdown_s (ncol) ! + ! + ! Local Values + !------------- + real(r8):: sinsq (ncol) ! sinlat**2 + real(r8):: Tv_srf (ncol) + real(r8):: Tv (ncol,pver ) + real(r8):: Zm (ncol,pver ) + real(r8):: Zscl (ncol) + real(r8):: Tbar (ncol) + real(r8):: Tdif (ncol) + real(r8):: Zfrac (ncol) + real(r8):: Pfrac (ncol) + real(r8):: Tau_lat(ncol) + real(r8):: Tau (ncol,pver+1) + real(r8):: Zi (ncol,pver+1) + real(r8):: Fup (ncol,pver+1) + real(r8):: Fdown (ncol,pver+1) + real(r8):: Bval (ncol,pver) + real(r8):: Etau (ncol,pver) + integer :: k + + ! Calc current Tv values + !--------------------------------- + Tv_srf(:) = Tsfc(:)*(1._r8+zvir*Qsfc(:)) + do k = 1, pver + Tv(:,k) = T(:,k)*(1._r8+zvir*qv(:,k)) + end do + + ! Calc Geopotential Heights at model interface + ! levels and at model layer levels + !---------------------------------------------- + Zi(:,pver+1) = 0._r8 + Zm(:,pver ) = rair*((Tv(:,pver)+Tv_srf(:))/2._r8)*log(Psfc(:)/pmid(:,pver))/gravit + do k = pver-1,1,-1 + Zscl (:) = rair*log(pmid(:,k+1)/pmid(:,k))/gravit + Tbar (:) = (Tv(:,k)+Tv(:,k+1))/2._r8 + Tdif (:) = (Tv(:,k)-Tv(:,k+1))/2._r8 + Zfrac (:) = log(pint(:,k+1)/pmid(:,k+1))/log(pmid(:,k)/pmid(:,k+1)) + Zm(:,k ) = Zm(:,k+1) + Zscl(:)*Tbar(:) + Zi(:,k+1) = Zm(:,k+1) + Zscl(:)*((Tv(:,k+1)-2._r8*Tdif(:))*Zfrac(:) & + + Tdif(:) *Zfrac(:)**2) + end do + Zfrac(:) = log(pint(:,1)/pmid(:,2))/log(pmid(:,1)/pmid(:,2)) + Zi(:,1) = Zm(:,2) + Zscl(:)*((Tv(:,2)-2._r8*Tdif(:))*Zfrac(:) & + + Tdif(:) *Zfrac(:)**2) + + ! Set Solar flux + !------------------------ + sinsq (:) = sin(clat(:))*sin(clat(:)) + Fsolar(:) = (Rs0/4._r8)*(1._r8 + DeltaS*(1._r8 - 3._r8*sinsq(:))/4._r8) + + ! Calc optical depths + !------------------------ + Tau_lat(:) = Tau_eqtr + (Tau_pole-Tau_eqtr)*sinsq(:) + do k = 1,pver+1 + Pfrac(:) = pint(:,k)/Psfc(:) + Tau(:,k) = Tau_lat(:)*(LinFrac*Pfrac(:) + (1._r8-LinFrac)*Pfrac(:)**4) + end do + + ! Lowest order solution for up/down flux assumes B is constant for the layer + !---------------------------------------------------------------------------- + do k=1,pver + Bval(:,k) = Boltz*T(:,k)**4 + Etau(:,k) = exp(Tau(:,k)-Tau(:,k+1)) + end do + + Fup(:,pver+1) = Boltz*Tsfc(:)**4 + do k=pver,1,-1 + Fup(:,k) = Fup(:,k+1)*Etau(:,k) + Bval(:,k)*(1._r8-Etau(:,k)) + end do + + Fdown(:,1) = 0._r8 + do k=1,pver + Fdown(:,k+1) = Fdown(:,k)*Etau(:,k) + Bval(:,k)*(1._r8-Etau(:,k)) + end do + + ! Calc Radiative heating + !------------------------- + do k=1,pver + dtdt_rad(:,k) = -(cappa*Tv(:,k)/pmid(:,k)) & + *((Fup(:,k+1)-Fdown(:,k+1)) - (Fup(:,k)-Fdown(:,k))) & + /( Zi(:,k+1) - Zi(:,k) ) + end do + + ! Return Upward/Downward long wave radiation at Surface and TOA + !---------------------------------------------------------- + Fup_s (:) = Fup (:,pver+1) + Fdown_s(:) = Fdown(:,pver+1) + Fup_toa (:) = Fup (:,1) + Fdown_toa(:) = Fdown(:,1) + + ! Update T values + !------------------- + do k=1,pver + T(:,k) = T(:,k) + dtdt_rad(:,k)*dtime + end do + + end subroutine frierson_radiation + !======================================================================= + + + !======================================================================= + subroutine frierson_radiation_USER(ncol,pver,dtime,clat,pint,pmid, & + Psfc,Tsfc,Qsfc,T,qv,dtdt_rad, & + Fsolar,Fup_s,Fdown_s,Fup_toa,Fdown_toa) + ! + ! frierson_radiation_USER: This routine is a stub which users can use + ! to develop and test their own radiation scheme + !========================================================================== + ! + ! Passed Variables + !------------------- + integer ,intent(in) :: ncol ! number of columns + integer ,intent(in) :: pver ! number of vertical levels + real(r8),intent(in) :: dtime ! time step (s) + real(r8),intent(in) :: clat (ncol) ! latitude + real(r8),intent(in) :: pint (ncol,pver+1) ! mid-point pressure (Pa) + real(r8),intent(in) :: pmid (ncol,pver) ! mid-point pressure (Pa) + real(r8),intent(in) :: Psfc (ncol) ! surface pressure + real(r8),intent(in) :: Tsfc (ncol) ! surface temperature (K) + real(r8),intent(in) :: Qsfc (ncol) + real(r8),intent(inout):: T (ncol,pver) ! temperature (K) + real(r8),intent(in) :: qv (ncol,pver) ! Q (kg/kg) + real(r8),intent(out) :: dtdt_rad(ncol,pver) ! temperature tendency in K/s from relaxation + real(r8),intent(out) :: Fsolar (ncol) ! + real(r8),intent(out) :: Fup_s (ncol) ! + real(r8),intent(out) :: Fdown_s (ncol) ! + real(r8),intent(out) :: Fup_toa (ncol) ! + real(r8),intent(out) :: Fdown_toa(ncol) ! + ! + ! Local Values + !------------- + + dtdt_rad = 0._r8 + Fsolar = 0._r8 + Fup_s = 0._r8 + Fdown_s = 0._r8 + Fup_toa = 0._r8 + Fdown_toa = 0._r8 + + + end subroutine frierson_radiation_USER + !======================================================================= + +end module frierson diff --git a/src/physics/simple/frierson_cam.F90 b/src/physics/simple/frierson_cam.F90 new file mode 100644 index 0000000000..0fe9d824bb --- /dev/null +++ b/src/physics/simple/frierson_cam.F90 @@ -0,0 +1,1046 @@ +module frierson_cam +!----------------------------------------------------------------------- +! +! Purpose: Implement idealized forcings described in +! Frierson, et al. (2006), " A Gray-Radiation Aquaplanet +! Moist GCM, Part I. Static Stability and Eddy Scale" +! J. Atmos. Sci, Vol 63, 2548-2566. +! doi: 10.1175/JAS3753.1 +! +!============================================================================ + ! Useful modules + !------------------- + use shr_kind_mod, only: r8 => shr_kind_r8 + use shr_const_mod, only: pi => shr_const_pi + use physconst, only: gravit, cappa, rair, cpair, latvap, rh2o, epsilo, rhoh2o, zvir + use ppgrid, only: pcols, pver, pverp, begchunk, endchunk + use constituents, only: pcnst + use physics_buffer, only: dtype_r8, pbuf_add_field, physics_buffer_desc, & + pbuf_set_field, pbuf_get_field + use camsrfexch, only: cam_in_t,cam_out_t + use cam_history, only: outfld + use time_manager, only: is_first_step + use cam_abortutils, only: endrun + use spmd_utils, only: masterproc + use cam_logfile, only: iulog + use hycoef, only: ps0, etamid + use spmd_utils, only: mpicom, mstrid=>masterprocid, mpi_real8 + + use pio ,only: file_desc_t, var_desc_t, io_desc_t, pio_double, pio_def_var + use pio ,only: pio_write_darray, pio_read_darray, pio_inq_varid + use cam_grid_support,only: cam_grid_id, cam_grid_dimensions, cam_grid_get_decomp + use shr_const_mod, only: SHR_CONST_STEBOL, SHR_CONST_REARTH, SHR_CONST_KARMAN, SHR_CONST_TKTRIP + + ! Set all Global values and routines to private by default + ! and then explicitly set their exposure. + !--------------------------------------------------------- + implicit none + private + save + + public :: frierson_register + public :: frierson_readnl + public :: frierson_init + public :: frierson_condensate_tend + public :: frierson_pbl_tend + public :: frierson_radiative_tend + public :: frierson_restart_init + public :: frierson_restart_write + public :: frierson_restart_read + + private :: frierson_surface_init + + ! PBL Configuatons + !------------------ + integer,parameter :: PBL_FRIERSON = 0 ! Implementation of Frierson PBL + integer,parameter :: PBL_USER = 1 ! Optional call for user defined PBL + + ! Tags to identify optional model formulations + !------------------------------------------------ + integer,parameter :: CONDENSATE_NONE = 0 ! No Condensation, PRECL=0 + integer,parameter :: CONDENSATE_FRIERSON = 1 ! Frierson condensation w/ re-evaporation + integer,parameter :: CONDENSATE_TJ16 = 2 ! Condensation from TJ2016 model. + integer,parameter :: CONDENSATE_USER = 3 ! Optional user defined Condensation scheme + + integer,parameter :: RADIATION_FRIERSON = 0 ! Frierson Gray radiation. + integer,parameter :: RADIATION_USER = 1 ! Optional user defined Radiation scheme + + ! Options selecting which PRECIP, PBL, RADIATION, etc.. formulations to use. + !--------------------------------------------------------------------------------- + integer,parameter :: PBL_OPT = PBL_FRIERSON + integer,parameter :: CONDENSATE_OPT = CONDENSATE_FRIERSON + integer,parameter :: RADIATION_OPT = RADIATION_FRIERSON + + ! Global Constants + !--------------------- + real(r8),parameter :: frierson_T0 = SHR_CONST_TKTRIP ! Reference Temperature for E0 + real(r8),parameter :: frierson_E0 = 610.78_r8 ! Saturation Vapor pressure @ T0 + real(r8),parameter :: frierson_Rs0 = 1360.0_r8 ! Solar Constant + real(r8),parameter :: frierson_Erad = SHR_CONST_REARTH ! Earth Radius + real(r8),parameter :: frierson_Karman = SHR_CONST_KARMAN ! Von Karman constant + real(r8),parameter :: frierson_Boltz = SHR_CONST_STEBOL ! Stefan-Boltzmann constant + + ! Some Physics buffer indices + !------------------------------- + integer :: prec_pcw_idx = 0 + integer :: prec_dp_idx = 0 + integer :: relhum_idx = 0 + + ! Global values for Surface Temp, surface fluxes, and radiative heating + !---------------------------------------------------------------------- + type(var_desc_t) :: Tsurf_desc ! Vardesc for restarts + type(var_desc_t) :: Qsurf_desc ! Vardesc for restarts + real(r8),allocatable :: Tsurf (:,:) ! Surface Temp + real(r8),allocatable :: Qsurf (:,:) ! Surface Q + real(r8),allocatable :: Fsolar(:,:) ! Net Solar Heating + real(r8),allocatable :: Fup (:,:) ! Upward Longwave flux + real(r8),allocatable :: Fdown (:,:) ! Downward Longwave flux + real(r8),allocatable :: Fup_toa (:,:) ! Upward Longwave flux at TOA + real(r8),allocatable :: Fdown_toa(:,:) ! Downward Longwave flux at TOA + real(r8),allocatable :: SHflux(:,:) ! Sensible Heat flux + real(r8),allocatable :: LHflux(:,:) ! Latent Heat Flux + real(r8),allocatable :: TUflux(:,:) ! U stress momentum flux + real(r8),allocatable :: TVflux(:,:) ! V stress momentum flux + real(r8),allocatable :: Cd (:,:) ! Surface Drag + real(r8),allocatable :: clat (:,:) ! latitudes(radians) for columns + real(r8),allocatable :: Fnet (:,:) ! Net Radiative Surface Heating + real(r8),allocatable :: Fnet_toa(:,:) ! Net Radiative Surface Heating at TOA + + real(r8), parameter :: unset_r8 = huge(1.0_r8) + + ! Global Tuning values + !------------------------ + real(r8) :: frierson_Wind_min = unset_r8 ! Minimum wind threshold + real(r8) :: frierson_Z0 = unset_r8 ! Roughness Length + real(r8) :: frierson_Ri_c = unset_r8 ! Crit. Richardson # for stable mixing + real(r8) :: frierson_Fb = unset_r8 ! Surface layer Fraction + real(r8) :: frierson_Albedo = unset_r8 ! Frierson Albedo + real(r8) :: frierson_DeltaS = unset_r8 ! Lat variation of shortwave radiation + real(r8) :: frierson_Tau_eqtr = unset_r8 ! Longwave optical depth at Equator + real(r8) :: frierson_Tau_pole = unset_r8 ! Longwave optical depth at poles. + real(r8) :: frierson_LinFrac = unset_r8 ! Stratosphere Linear optical depth param + real(r8) :: frierson_C0 = unset_r8 ! Ocean mixed layer heat capacity + real(r8) :: frierson_WetDryCoef = unset_r8 ! E0 Scale factor to control moisture + real(r8) :: frierson_Tmin = unset_r8 ! IC: Minimum sst (K) + real(r8) :: frierson_Tdlt = unset_r8 ! IC: eq-polar difference sst (K) + real(r8) :: frierson_Twidth = unset_r8 ! IC: Latitudinal width parameter for sst (degrees latitude) + +contains + !============================================================================== + subroutine frierson_register() + ! + ! frierson_register: Register physics buffer values + !===================================================================== + + call pbuf_add_field('PREC_PCW','physpkg',dtype_r8, (/pcols/), prec_pcw_idx) + call pbuf_add_field('PREC_DP' ,'physpkg',dtype_r8, (/pcols/), prec_dp_idx ) + call pbuf_add_field('RELHUM' ,'physpkg',dtype_r8, (/pcols,pver/),relhum_idx ) + + end subroutine frierson_register + !============================================================================== + + + !============================================================================== + subroutine frierson_readnl(nlfile) + ! + ! frierson_readnl: Read in parameters controlling Frierson parameterizations. + !===================================================================== + use namelist_utils,only: find_group_name + use units ,only: getunit, freeunit + ! + ! Passed Variables + !------------------ + character(len=*),intent(in):: nlfile + ! + ! Local Values + !-------------- + integer:: ierr,unitn + + character(len=*), parameter :: sub = 'frierson_readnl' + + namelist /frierson_nl/ frierson_Wind_min, frierson_Z0 , frierson_Ri_c , & + frierson_Fb , frierson_Albedo , frierson_DeltaS , & + frierson_Tau_eqtr, frierson_Tau_pole , frierson_LinFrac, & + frierson_C0 , frierson_WetDryCoef, frierson_Tmin , & + frierson_Tdlt , frierson_Twidth + + ! Read in namelist values + !------------------------- + if(masterproc) then + unitn = getunit() + open(unitn,file=trim(nlfile),status='old') + call find_group_name(unitn,'frierson_nl',status=ierr) + if(ierr == 0) then + read(unitn,frierson_nl,iostat=ierr) + if(ierr /= 0) then + call endrun(sub//': ERROR reading namelist') + endif + endif + close(unitn) + call freeunit(unitn) + endif + + ! Broadcast namelist values + !--------------------------- + call mpi_bcast(frierson_Wind_min , 1, mpi_real8 , mstrid, mpicom, ierr) + if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: frierson_Wind_min") + call mpi_bcast(frierson_Z0 , 1, mpi_real8 , mstrid, mpicom, ierr) + if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: frierson_Z0") + call mpi_bcast(frierson_Ri_c , 1, mpi_real8 , mstrid, mpicom, ierr) + if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: frierson_Ri_c") + call mpi_bcast(frierson_Fb , 1, mpi_real8 , mstrid, mpicom, ierr) + if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: frierson_Fb") + call mpi_bcast(frierson_Albedo , 1, mpi_real8 , mstrid, mpicom, ierr) + if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: frierson_Albedo") + call mpi_bcast(frierson_DeltaS , 1, mpi_real8 , mstrid, mpicom, ierr) + if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: frierson_DeltaS") + call mpi_bcast(frierson_Tau_eqtr , 1, mpi_real8 , mstrid, mpicom, ierr) + if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: frierson_Tau_eqtr") + call mpi_bcast(frierson_Tau_pole , 1, mpi_real8 , mstrid, mpicom, ierr) + if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: frierson_Tau_pole") + call mpi_bcast(frierson_LinFrac , 1, mpi_real8 , mstrid, mpicom, ierr) + if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: frierson_LinFrac") + call mpi_bcast(frierson_C0 , 1, mpi_real8 , mstrid, mpicom, ierr) + if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: frierson_C0") + call mpi_bcast(frierson_Tmin , 1, mpi_real8 , mstrid, mpicom, ierr) + if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: frierson_Tmin") + call mpi_bcast(frierson_Tdlt , 1, mpi_real8 , mstrid, mpicom, ierr) + if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: frierson_Tdlt") + call mpi_bcast(frierson_Twidth , 1, mpi_real8 , mstrid, mpicom, ierr) + if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: frierson_Twidth") + call mpi_bcast(frierson_WetDryCoef, 1, mpi_real8 , mstrid, mpicom, ierr) + if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: frierson_WetDryCoef") + + end subroutine frierson_readnl + !============================================================================== + + + !============================================================================== + subroutine frierson_init(phys_state,pbuf2d) + ! + ! frierson_init: allocate space for global arrays and initialize values. + ! Add variables to history outputs + !===================================================================== + use physics_types, only: physics_state + use error_messages,only: alloc_err + use cam_history, only: addfld, add_default,horiz_only + use phys_grid, only: get_ncols_p, get_rlat_p + use frierson, only: frierson_set_const + ! + ! Passed Variables + !------------------ + type(physics_state) ,pointer:: phys_state(:) + type(physics_buffer_desc),pointer:: pbuf2d (:,:) + ! + ! Local Values + !--------------- + integer :: istat,lchnk,icol,ncol + real(r8):: adjusted_E0 + real(r8):: frierson_Rs + + ! Initialize constants in Frierson module + !------------------------------------------ + adjusted_E0 = frierson_WetDryCoef*frierson_E0 + frierson_Rs = frierson_Rs0*(1._r8-frierson_Albedo) + call frierson_set_const(gravit,cappa,rair,cpair,latvap,rh2o,epsilo,rhoh2o,zvir,ps0,etamid, & + frierson_T0 ,adjusted_E0 ,frierson_Erad ,frierson_Wind_min, & + frierson_Z0 ,frierson_Ri_c ,frierson_Karman ,frierson_Fb , & + frierson_Rs ,frierson_DeltaS,frierson_Tau_eqtr,frierson_Tau_pole, & + frierson_LinFrac,frierson_Boltz ,frierson_C0 ) + + ! Add values for history output + !--------------------------------- + call addfld('gray_QRL' ,(/'lev' /),'A','K/s' ,'Longwave heating rate for gray atmosphere' ) + call addfld('gray_QRS' ,(/'lev' /),'A','K/s' ,'Solar heating rate for gray atmosphere' ) + call addfld('gray_DTCOND',(/'lev' /),'A','K/s' ,'T tendency - gray atmosphere moist process' ) + call addfld('gray_DQCOND',(/'lev' /),'A','kg/kg/s','Q tendency - gray atmosphere moist process' ) + call addfld('gray_EVAPDT',(/'lev' /),'A','K/s' ,'T tendency due to re-evaporation' ) + call addfld('gray_EVAPDQ',(/'lev' /),'A','kg/kg/s','Q tendency due to re-evaporation' ) + call addfld('gray_KVH' ,(/'ilev'/),'A','m2/s' ,'Vertical diffusion diffusivities (heat/moisture)') + call addfld('gray_KVM' ,(/'ilev'/),'A','m2/s' ,'Vertical diffusion diffusivities (momentum)' ) + call addfld('gray_VSE' ,(/'lev' /),'A','K' ,'VSE: (Tv + gZ/Cp)' ) + call addfld('gray_Zm' ,(/'lev' /),'A','m' ,'Geopotential height' ) + call addfld('gray_Rf' ,(/'lev' /),'A','1' ,'Bulk Richardson number (Frierson et al 2006, eq 16) / Ri_c' ) + call addfld('gray_DTV' ,(/'lev' /),'A','K/s' ,'T tendency due to vertical diffusion' ) + call addfld('gray_DUV' ,(/'lev' /),'A','m/s2' ,'U tendency due to vertical diffusion' ) + call addfld('gray_DVV' ,(/'lev' /),'A','m/s2' ,'V tendency due to vertical diffusion' ) + call addfld('gray_VD01' ,(/'lev' /),'A','kg/kg/s','Q tendency (vertical diffusion)' ) + call addfld('gray_PRECL' ,horiz_only,'A','m/s' ,'Large-scale precipitation rate' ) + call addfld('gray_PRECC' ,horiz_only,'A','m/s' ,'Convective precipitation rate' ) + call addfld('gray_Tsurf ',horiz_only,'I','K' ,'Surface Temperature' ) + call addfld('gray_Qsurf ',horiz_only,'I','kg/kg' ,'Surface Water Vapor' ) + call addfld('gray_Cdrag' ,horiz_only,'A','1' ,'Surface Drag Coefficient' ) + call addfld('gray_Zpbl' ,horiz_only,'I','m' ,'PBL Height' ) + call addfld('gray_SWflux',horiz_only,'I','W/m2' ,'SW Solar Flux' ) + call addfld('gray_LUflux',horiz_only,'I','W/m2' ,'LW Upward Radiative Flux at Surface' ) + call addfld('gray_LDflux',horiz_only,'I','W/m2' ,'LW Downward Radiative Flux at Surface' ) + call addfld('gray_LWflux',horiz_only,'I','W/m2' ,'LW Net Radiative Flux at Surface' ) + call addfld('gray_LUflux_TOA',horiz_only,'I','W/m2' ,'LW Upward Radiative Flux at TOA' ) + call addfld('gray_LDflux_TOA',horiz_only,'I','W/m2' ,'LW Downward Radiative Flux at TOA' ) + call addfld('gray_LWflux_TOA',horiz_only,'I','W/m2' ,'LW Net Radiative Flux at TOA' ) + call addfld('gray_SHflux',horiz_only,'I','W/m2' , 'Sensible Heat Flux' ) + call addfld('gray_LHflux',horiz_only,'I','W/m2' , 'Latent Heat Flux' ) + call addfld('gray_TauU' ,horiz_only,'I','N/m2' , 'U Surface Stress' ) + call addfld('gray_TauV' ,horiz_only,'I','N/m2' , 'V Surface Stress' ) + + call add_default('gray_QRL' ,1,' ') + call add_default('gray_QRS' ,1,' ') + call add_default('gray_DTCOND',1,' ') + call add_default('gray_DQCOND',1,' ') + call add_default('gray_EVAPDT',1,' ') + call add_default('gray_EVAPDQ',1,' ') + call add_default('gray_KVH' ,1,' ') + call add_default('gray_KVM' ,1,' ') + call add_default('gray_VSE' ,1,' ') + call add_default('gray_Zm' ,1,' ') + call add_default('gray_Rf' ,1,' ') + call add_default('gray_DTV' ,1,' ') + call add_default('gray_DUV' ,1,' ') + call add_default('gray_DVV' ,1,' ') + call add_default('gray_VD01' ,1,' ') + call add_default('gray_PRECC' ,1,' ') + call add_default('gray_PRECL' ,1,' ') + call add_default('gray_Tsurf' ,1,' ') + call add_default('gray_Qsurf' ,1,' ') + call add_default('gray_Cdrag' ,1,' ') + call add_default('gray_Zpbl' ,1,' ') + call add_default('gray_SWflux',1,' ') + call add_default('gray_LUflux',1,' ') + call add_default('gray_LDflux',1,' ') + call add_default('gray_LWflux',1,' ') + call add_default('gray_LUflux_TOA',1,' ') + call add_default('gray_LDflux_TOA',1,' ') + call add_default('gray_LWflux_TOA',1,' ') + call add_default('gray_SHflux',1,' ') + call add_default('gray_LHflux',1,' ') + call add_default('gray_TauU' ,1,' ') + call add_default('gray_TauV' ,1,' ') + + ! Allocate Global arrays + !------------------------- + allocate(Fsolar(pcols,begchunk:endchunk) ,stat=istat) + call alloc_err(istat,'Frierson INIT','Fsolar',pcols*(endchunk-begchunk+1)) + allocate(Fup (pcols,begchunk:endchunk) ,stat=istat) + call alloc_err(istat,'Frierson INIT','Fup' ,pcols*(endchunk-begchunk+1)) + allocate(Fdown (pcols,begchunk:endchunk) ,stat=istat) + call alloc_err(istat,'Frierson INIT','Fdown' ,pcols*(endchunk-begchunk+1)) + allocate(Fup_toa (pcols,begchunk:endchunk) ,stat=istat) + call alloc_err(istat,'Frierson INIT','Fup_toa' ,pcols*(endchunk-begchunk+1)) + allocate(Fdown_toa (pcols,begchunk:endchunk) ,stat=istat) + call alloc_err(istat,'Frierson INIT','Fdown_toa' ,pcols*(endchunk-begchunk+1)) + allocate(Fnet(pcols,begchunk:endchunk) ,stat=istat) + call alloc_err(istat,'Frierson INIT','Fnet',pcols*(endchunk-begchunk+1)) + allocate(Fnet_toa(pcols,begchunk:endchunk) ,stat=istat) + call alloc_err(istat,'Frierson INIT','Fnet_toa' ,pcols*(endchunk-begchunk+1)) + + allocate(SHflux(pcols,begchunk:endchunk) ,stat=istat) + call alloc_err(istat,'Frierson INIT','SHflux',pcols*(endchunk-begchunk+1)) + allocate(LHflux(pcols,begchunk:endchunk) ,stat=istat) + call alloc_err(istat,'Frierson INIT','LHflux',pcols*(endchunk-begchunk+1)) + allocate(TUflux(pcols,begchunk:endchunk) ,stat=istat) + call alloc_err(istat,'Frierson INIT','TUflux',pcols*(endchunk-begchunk+1)) + allocate(TVflux(pcols,begchunk:endchunk) ,stat=istat) + call alloc_err(istat,'Frierson INIT','TVflux',pcols*(endchunk-begchunk+1)) + allocate(Cd (pcols,begchunk:endchunk) ,stat=istat) + call alloc_err(istat,'Frierson INIT','Cd' ,pcols*(endchunk-begchunk+1)) + allocate(clat (pcols,begchunk:endchunk) ,stat=istat) + call alloc_err(istat,'Frierson INIT','clat' ,pcols*(endchunk-begchunk+1)) + + ! Initialize time indices and latitudes + !---------------------------------------- + do lchnk = begchunk,endchunk + ncol = get_ncols_p(lchnk) + do icol = 1,ncol + clat(icol,lchnk) = get_rlat_p(lchnk,icol) + end do + end do + + ! At first model step, initialize some values + !----------------------------------------------- + if(is_first_step()) then + ! Initialize physics buffer values + !---------------------------------- + call pbuf_set_field(pbuf2d, prec_pcw_idx, 0._r8) + call pbuf_set_field(pbuf2d, prec_dp_idx , 0._r8) + + ! Allocate Surface fields + !------------------------- + allocate(Tsurf (pcols,begchunk:endchunk),stat=istat) + call alloc_err(istat,'Frierson INIT','Tsurf' ,pcols*(endchunk-begchunk+1)) + allocate(Qsurf (pcols,begchunk:endchunk) ,stat=istat) + call alloc_err(istat,'Frierson INIT','Qsurf' ,pcols*(endchunk-begchunk+1)) + + ! Initialize Surface temperatures and Q + !----------------------------------------------------------------------- + do lchnk = begchunk,endchunk + ncol = get_ncols_p(lchnk) + + ! Set to reference values for initialization + !------------------------------------------------------------ + phys_state(lchnk)%ps(:ncol) = ps0 + + call frierson_surface_init(ncol, clat(:ncol,lchnk), & + phys_state(lchnk)%ps(:ncol), & + Tsurf(:ncol,lchnk), & + Qsurf(:ncol,lchnk) ) + end do + endif + + ! Initialize radiation and flux values to 0.0 + !--------------------------------------------------------------------------- + do lchnk = begchunk,endchunk + Fsolar(:,lchnk) = 0._r8 + Fup (:,lchnk) = 0._r8 + Fdown (:,lchnk) = 0._r8 + Fup_toa (:,lchnk) = 0._r8 + Fdown_toa (:,lchnk) = 0._r8 + SHflux(:,lchnk) = 0._r8 + LHflux(:,lchnk) = 0._r8 + TUflux(:,lchnk) = 0._r8 + TVflux(:,lchnk) = 0._r8 + Cd (:,lchnk) = 0._r8 + Fnet (:,lchnk) = 0._r8 + end do + + ! Informational Output + !---------------------- + if(masterproc) then + write(iulog,*) ' ' + write(iulog,*) '-----------------------------------------------------------' + write(iulog,*) ' FRIERSON MODULE INITIALIZED WITH THE FOLLOWING SETTINGS: ' + write(iulog,*) '-----------------------------------------------------------' + write(iulog,*) 'FRIERSON: gravit=' , gravit + write(iulog,*) 'FRIERSON: cappa=' , cappa + write(iulog,*) 'FRIERSON: rair =' , rair + write(iulog,*) 'FRIERSON: cpair=' , cpair + write(iulog,*) 'FRIERSON: latvap=' , latvap + write(iulog,*) 'FRIERSON: rh2o=' , rh2o + write(iulog,*) 'FRIERSON: epsilo=' , epsilo + write(iulog,*) 'FRIERSON: rhoh2o=' , rhoh2o + write(iulog,*) 'FRIERSON: zvir=' , zvir + write(iulog,*) 'FRIERSON: ps0=' , ps0 + write(iulog,*) 'FRIERSON: etamid=' , etamid + write(iulog,*) 'FRIERSON: T0=' , frierson_T0 + write(iulog,*) 'FRIERSON: E0=' , frierson_E0 + write(iulog,*) 'FRIERSON: Erad=' , frierson_Erad + write(iulog,*) 'FRIERSON: Wind_min=' , frierson_Wind_min + write(iulog,*) 'FRIERSON: Z0=' , frierson_Z0 + write(iulog,*) 'FRIERSON: Ri_c=' , frierson_Ri_c + write(iulog,*) 'FRIERSON: Karman=' , frierson_Karman + write(iulog,*) 'FRIERSON: Fb=' , frierson_Fb + write(iulog,*) 'FRIERSON: Rs0=' , frierson_Rs0 + write(iulog,*) 'FRIERSON: Albedo=' , frierson_Albedo + write(iulog,*) 'FRIERSON: Rs=' , frierson_Rs + write(iulog,*) 'FRIERSON: DeltaS=' , frierson_DeltaS + write(iulog,*) 'FRIERSON: Tau_eqtr=' , frierson_Tau_eqtr + write(iulog,*) 'FRIERSON: Tau_pole=' , frierson_Tau_pole + write(iulog,*) 'FRIERSON: LinFrac=' , frierson_LinFrac + write(iulog,*) 'FRIERSON: Boltz=' , frierson_Boltz + write(iulog,*) 'FRIERSON: C0=' , frierson_C0 + write(iulog,*) 'FRIERSON: Tmin=' , frierson_Tmin + write(iulog,*) 'FRIERSON: Tdlt=' , frierson_Tdlt + write(iulog,*) 'FRIERSON: Twidth=' , frierson_Twidth + write(iulog,*) 'FRIERSON: WetDryCoef=', frierson_WetDryCoef + write(iulog,*) ' ' + endif + + end subroutine frierson_init + !============================================================================== + + + !============================================================================== + + + !============================================================================== + subroutine frierson_condensate_tend(state, ptend, ztodt, pbuf) + ! + ! frierson_condensate_tend: Run the selected process to compute precipitation + ! due to large scale condensation. + !===================================================================== + use physics_types,only: physics_state, physics_ptend + use physics_types,only: physics_ptend_init + use frierson, only: frierson_condensate_NONE,frierson_condensate + use frierson, only: frierson_condensate_USER,frierson_condensate_TJ16 + ! + ! Passed Variables + !------------------ + type(physics_state) ,intent(inout):: state + real(r8) ,intent(in) :: ztodt + type(physics_ptend) ,intent(out) :: ptend + type(physics_buffer_desc),pointer :: pbuf(:) + ! + ! Local Values + !----------------- + real(r8),pointer:: relhum (:,:) + real(r8),pointer:: prec_pcw(:) ! large scale precip + real(r8) :: prec_cnv(state%ncol) ! Convective Precip + real(r8) :: evapdt(state%ncol, pver) ! T tendency due to re-evaporation of condensation + real(r8) :: evapdq(state%ncol, pver) ! Q tendency due to re-evaporation of condensation + real(r8) :: dtcond(state%ncol, pver) ! Temperature tendency due to condensation + real(r8) :: dqcond(state%ncol, pver) ! Q tendency due to condensation + real(r8) :: T (state%ncol, pver) ! T temporary + real(r8) :: qv (state%ncol, pver) ! Q temporary + logical :: lq(pcnst) ! Calc tendencies? + integer :: lchnk ! chunk identifier + integer :: ncol ! number of atmospheric columns + integer :: k + + ! Set local copies of values + !--------------------------------- + lchnk = state%lchnk + ncol = state%ncol + T (:ncol,:) = state%T(:ncol,:) + qv(:ncol,:) = state%Q(:ncol,:,1) + + ! initialize individual parameterization tendencies + !--------------------------------------------------- + lq = .false. + lq(1) = .true. + call physics_ptend_init(ptend, state%psetcols, 'Frierson condensate', & + ls=.true., lu=.true., lv=.true., lq=lq) + + ! Get values from the physics buffer + !------------------------------------ + call pbuf_get_field(pbuf,prec_pcw_idx,prec_pcw) + call pbuf_get_field(pbuf, relhum_idx,relhum ) + + ! Initialize values for condensate tendencies + !--------------------------------------------- + do k = 1, pver + dtcond(:ncol,k) = state%T(:ncol,k) + dqcond(:ncol,k) = state%q(:ncol,k,1) + end do + + ! Call the Selected condensation routine ~~DEVO style~~ + !-------------------------------------------------------- + if(CONDENSATE_OPT == CONDENSATE_NONE) then + prec_cnv(:ncol) = 0._r8 + evapdt (:ncol,:) = 0._r8 + evapdq (:ncol,:) = 0._r8 + call frierson_condensate_NONE(ncol,pver,state%pmid(:ncol,:), & + T(:ncol,:), & + qv(:ncol,:), & + relhum(:ncol,:), & + prec_pcw(:ncol) ) + elseif(CONDENSATE_OPT == CONDENSATE_FRIERSON) then + prec_cnv(:ncol) = 0._r8 + call frierson_condensate(ncol,pver,ztodt,state%pmid(:ncol,:), & + state%pdel(:ncol,:), & + T(:ncol,:), & + qv(:ncol,:), & + relhum(:ncol,:), & + prec_pcw(:ncol) , & + evapdt(:ncol,:), & + evapdq(:ncol,:) ) + elseif(CONDENSATE_OPT == CONDENSATE_TJ16) then + prec_cnv(:ncol) = 0._r8 + evapdt (:ncol,:) = 0._r8 + evapdq (:ncol,:) = 0._r8 + call frierson_condensate_TJ16(ncol,pver,ztodt,state%pmid(:ncol,:), & + state%pdel(:ncol,:), & + T(:ncol,:), & + qv(:ncol,:), & + relhum(:ncol,:), & + prec_pcw(:ncol) ) + elseif(CONDENSATE_OPT == CONDENSATE_USER) then + prec_cnv(:ncol) = 0._r8 + evapdt (:ncol,:) = 0._r8 + evapdq (:ncol,:) = 0._r8 + call frierson_condensate_USER(ncol,pver,ztodt,state%pmid(:ncol,:), & + state%pdel(:ncol,:), & + T(:ncol,:), & + qv(:ncol,:), & + relhum(:ncol,:), & + prec_pcw(:ncol) ) + else + ! ERROR: Unknown CONDENSATE_OPT value + !------------------------------------- + write(iulog,*) 'ERROR: unknown CONDENSATE_OPT=',CONDENSATE_OPT + call endrun('frierson_condensate_tend() CONDENSATE_OPT ERROR') + endif + + ! Back out temperature and specific humidity + ! tendencies from updated fields + !-------------------------------------------- + do k = 1, pver + ptend%s(:ncol,k) = (T (:,k)-state%T(:ncol,k) )/ztodt*cpair + ptend%q(:ncol,k,1) = (qv(:,k)-state%q(:ncol,k,1))/ztodt + end do + + ! Output condensate tendencies + !------------------------------ + do k = 1, pver + dtcond(:ncol,k) = (T (:ncol,k) - dtcond(:ncol,k))/ztodt + dqcond(:ncol,k) = (qv(:ncol,k) - dqcond(:ncol,k))/ztodt + end do + call outfld('gray_EVAPDT',evapdt ,ncol,lchnk) + call outfld('gray_EVAPDQ',evapdq ,ncol,lchnk) + call outfld('gray_DTCOND',dtcond ,ncol,lchnk) + call outfld('gray_DQCOND',dqcond ,ncol,lchnk) + call outfld('gray_PRECL' ,prec_pcw,ncol,lchnk) + call outfld('gray_PRECC' ,prec_cnv,ncol,lchnk) + + end subroutine frierson_condensate_tend + !============================================================================== + + + !============================================================================ + subroutine frierson_pbl_tend(state, ptend, ztodt, cam_in) + ! + ! frierson_pbl_tend: Run the selected PBL process. + !========================================================================= + use physics_types,only: physics_state, physics_ptend + use physics_types,only: physics_ptend_init + use phys_grid, only: get_rlat_all_p + use frierson, only: frierson_pbl,frierson_pbl_USER + ! + ! Passed Variables + !------------------- + type(physics_state),intent(in) :: state + real(r8), intent(in) :: ztodt + type(physics_ptend),intent(out) :: ptend + type(cam_in_t), intent(inout):: cam_in + ! + ! Local Values + !---------------- + real(r8) :: T (state%ncol,pver) ! T temporary + real(r8) :: qv (state%ncol,pver) ! Q temporary (specific humidity) + real(r8) :: U (state%ncol,pver) ! U temporary + real(r8) :: V (state%ncol,pver) ! V temporary + real(r8) :: dqdt_vdiff(state%ncol,pver) ! PBL Q vertical diffusion tend kg/kg/s + real(r8) :: dtdt_vdiff(state%ncol,pver) ! PBL T vertical diffusion tend K/s + real(r8) :: dudt_vdiff(state%ncol,pver) ! PBL U vertical diffusion tend m/s/s + real(r8) :: dvdt_vdiff(state%ncol,pver) ! PBL V vertical diffusion tend m/s/s + real(r8) :: Km (state%ncol,pverp) ! Eddy diffusivity at layer interfaces (m2/s) + real(r8) :: Ke (state%ncol,pverp) ! Eddy diffusivity at layer interfaces (m2/s) + real(r8) :: VSE (state%ncol,pver) ! Dry Static Energy divided by Cp (K) + real(r8) :: Zm (state%ncol,pver) ! + real(r8) :: Zi (state%ncol,pver) ! + real(r8) :: Z_pbl (state%ncol) ! + real(r8) :: Rf (state%ncol,pver) ! + real(r8) :: Tsfc (state%ncol) ! Surface T + real(r8) :: Qsfc (state%ncol) ! Surface Q (saturated) + real(r8) :: Cdrag (state%ncol) ! Cdrag coef from surface calculation + + logical :: lq (pcnst) ! Calc tendencies? + real(r8) :: dTs (state%ncol) + real(r8) :: dUa (state%ncol,pver) + real(r8) :: dVa (state%ncol,pver) + real(r8) :: dTa (state%ncol,pver) + real(r8) :: dQa (state%ncol,pver) + integer :: lchnk ! chunk identifier + integer :: ncol ! number of atmospheric columns + integer :: kk ! loop index + + ! Set local copies of values + !--------------------------------- + lchnk = state%lchnk + ncol = state%ncol + Zm (:ncol,:) = state%zm (:ncol,:) + Zi (:ncol,1:pver) = state%zi (:ncol,1:pver) + T (:ncol,:) = state%T (:ncol,:) + U (:ncol,:) = state%U (:ncol,:) + V (:ncol,:) = state%V (:ncol,:) + qv (:ncol,:) = state%Q (:ncol,:,1) + + ! Initialize individual parameterization tendencies + !----------------------------------------------------- + lq = .false. + lq(1) = .true. + call physics_ptend_init(ptend,state%psetcols,'Frierson pbl_tend', & + ls=.true., lu=.true., lv=.true., lq=lq) + + ! Call the Selected PBL routine + !-------------------------------------------------------- + Tsfc(:ncol) = Tsurf(:ncol,lchnk) + Qsfc(:ncol) = Qsurf(:ncol,lchnk) + if(PBL_OPT == PBL_FRIERSON) then + ! Call Frierson PBL scheme + !-------------------------------------------------- + call frierson_pbl(ncol, pver, ztodt,state%pmid (:ncol,:), & + state%pint (:ncol,:), & + Zm(:ncol,:), & + Zi(:ncol,:), & + state%ps(:ncol) , & + Tsfc(:ncol) , & + Qsfc(:ncol) , & + T(:ncol,:), & + U(:ncol,:), & + V(:ncol,:), & + qv(:ncol,:), & + Fsolar(:ncol,lchnk), & + Fdown(:ncol,lchnk), & + Cdrag(:ncol) , & + Km(:ncol,:), & + Ke(:ncol,:), & + VSE(:ncol,:), & + Z_pbl(:ncol) , & + Rf(:ncol,:), & + dqdt_vdiff(:ncol,:), & + dtdt_vdiff(:ncol,:), & + dudt_vdiff(:ncol,:), & + dvdt_vdiff(:ncol,:), & + LHflux(:ncol,lchnk), & + SHflux(:ncol,lchnk), & + TUflux(:ncol,lchnk), & + TVflux(:ncol,lchnk) ) + elseif(PBL_OPT == PBL_USER) then + ! Call USER implemented routine in frierson module + !-------------------------------------------------- + call frierson_pbl_USER(ncol, pver, ztodt,state%pmid (:ncol,:), & + state%pint (:ncol,:), & + Zm(:ncol,:), & + Zi(:ncol,:), & + state%ps(:ncol) , & + Tsfc(:ncol) , & + Qsfc(:ncol) , & + T(:ncol,:), & + U(:ncol,:), & + V(:ncol,:), & + qv(:ncol,:), & + Fsolar(:ncol,lchnk), & + Fdown(:ncol,lchnk), & + Cdrag(:ncol) , & + Km(:ncol,:), & + Ke(:ncol,:), & + VSE(:ncol,:), & + Z_pbl(:ncol) , & + Rf(:ncol,:), & + dqdt_vdiff(:ncol,:), & + dtdt_vdiff(:ncol,:), & + dudt_vdiff(:ncol,:), & + dvdt_vdiff(:ncol,:), & + LHflux(:ncol,lchnk), & + SHflux(:ncol,lchnk), & + TUflux(:ncol,lchnk), & + TVflux(:ncol,lchnk) ) + else + ! ERROR: Unknown PBL_OPT value + !------------------------------------- + write(iulog,*) 'ERROR: unknown PBL_OPT=',PBL_OPT + call endrun('frierson_pbl_tend() PBL_OPT ERROR') + endif + Tsurf(:ncol,lchnk) = Tsfc (:ncol) + Qsurf(:ncol,lchnk) = Qsfc (:ncol) + Cd (:ncol,lchnk) = Cdrag(:ncol) + + ! Back out tendencies from updated fields + !----------------------------------------- + do kk = 1, pver + ptend%s(:ncol,kk ) = (T (:,kk)-state%T(:ncol,kk ))/ztodt*cpair + ptend%u(:ncol,kk ) = (U (:,kk)-state%U(:ncol,kk ))/ztodt + ptend%v(:ncol,kk ) = (V (:,kk)-state%V(:ncol,kk ))/ztodt + ptend%q(:ncol,kk,1) = (qv(:,kk)-state%q(:ncol,kk,1))/ztodt + end do + + ! Archive diagnostic fields + !---------------------------- + call outfld('gray_Tsurf' ,Tsurf(:ncol,lchnk) ,ncol,lchnk) + call outfld('gray_Qsurf' ,Qsurf(:ncol,lchnk) ,ncol,lchnk) + call outfld('gray_Cdrag' ,Cd (:ncol,lchnk) ,ncol,lchnk) + call outfld('gray_Zpbl' ,Z_pbl ,ncol,lchnk) ! + call outfld('gray_KVH' ,Ke ,ncol,lchnk) ! Eddy diffusivity (heat and moisture,m2/s) + call outfld('gray_KVM' ,Km ,ncol,lchnk) ! Eddy diffusivity (momentum, m2/s) + call outfld('gray_VSE' ,VSE ,ncol,lchnk) ! Virtual Dry Static Energy divided by Cp (K) + call outfld('gray_Zm' ,Zm ,ncol,lchnk) ! + call outfld('gray_Rf' ,Rf ,ncol,lchnk) ! + call outfld('gray_DTV' ,dtdt_vdiff ,ncol,lchnk) ! PBL + surface flux T tendency (K/s) + call outfld('gray_DUV' ,dudt_vdiff ,ncol,lchnk) ! PBL u tendency (m/s2) + call outfld('gray_DVV' ,dvdt_vdiff ,ncol,lchnk) ! PBL v tendency (m/s2) + call outfld('gray_VD01' ,dqdt_vdiff ,ncol,lchnk) ! PBL + surface flux Q tendency (kg/kg/s) + call outfld('gray_SHflux',SHflux(:ncol,lchnk),ncol,lchnk) ! Sensible Heat Flux + call outfld('gray_LHflux',LHflux(:ncol,lchnk),ncol,lchnk) ! Latent Heat Flux + call outfld('gray_TauU' ,TUflux(:ncol,lchnk),ncol,lchnk) ! U Surface Stress + call outfld('gray_TauV' ,TVflux(:ncol,lchnk),ncol,lchnk) ! V Surface Stress + + end subroutine frierson_pbl_tend + !============================================================================ + + + !============================================================================ + subroutine frierson_radiative_tend(state, ptend, ztodt,cam_in,cam_out) + ! + ! frierson_radiative_tend: Run the radiative process + !========================================================================= + use physics_types,only: physics_state, physics_ptend + use physics_types,only: physics_ptend_init + use phys_grid, only: get_rlat_all_p + use frierson, only: frierson_radiation,frierson_radiation_USER + ! + ! Passed Variables + !------------------ + type(physics_state),intent(in) :: state + real(r8) ,intent(in) :: ztodt + type(physics_ptend),intent(out) :: ptend + type(cam_in_t), intent(inout):: cam_in + type(cam_out_t), intent(inout):: cam_out + ! + ! Local Values + !--------------- + real(r8):: T (state%ncol,pver) ! T temporary + real(r8):: qv (state%ncol,pver) ! Q temporary + real(r8):: dtdt_heating(state%ncol,pver) ! Longwave heating tendency K/s + real(r8):: dtdt_solar (state%ncol,pver) ! Shortwave heating tendency K/s + real(r8):: Tsfc (state%ncol) ! Surface T + real(r8):: Qsfc (state%ncol) ! Surface Q (saturated) + logical :: lq(pcnst) ! Calc tendencies? + integer :: lchnk ! chunk identifier + integer :: ncol ! number of atmospheric columns + integer :: k ! loop index + + ! Copy to local values + !------------------------------------------------- + lchnk = state%lchnk + ncol = state%ncol + T (:ncol,:) = state%T(:ncol,:) + qv (:ncol,:) = state%Q(:ncol,:,1) + + !-------------------------------------- + Tsfc(:ncol) = Tsurf(:ncol,lchnk) + Qsfc(:ncol) = Qsurf(:ncol,lchnk) + + ! initialize individual parameterization tendencies + !--------------------------------------------------- + lq(:) = .false. + call physics_ptend_init(ptend, state%psetcols, 'Frierson radiative_tend', & + ls=.true., lu=.false., lv=.false., lq=lq) + + ! Call the Selected radiative routine + !-------------------------------------------------------- + if(RADIATION_OPT == RADIATION_FRIERSON) then + call frierson_radiation(ncol,pver,ztodt,clat(:ncol,lchnk), & + state%pint(:ncol,:), & + state%pmid(:ncol,:), & + state%ps(:ncol), & + Tsfc(:ncol), & + Qsfc(:ncol), & + T(:ncol,:), & + qv(:ncol,:), & + dtdt_heating(:ncol,:), & + Fsolar(:ncol,lchnk), & + Fup(:ncol,lchnk), & + Fdown(:ncol,lchnk), & + Fup_toa(:ncol,lchnk), & + Fdown_toa(:ncol,lchnk) ) + dtdt_solar(:ncol,:) = 0._r8 + elseif(RADIATION_OPT == RADIATION_USER) then + call frierson_radiation_USER(ncol,pver,ztodt,clat(:ncol,lchnk), & + state%pint(:ncol,:), & + state%pmid(:ncol,:), & + state%ps(:ncol), & + Tsfc(:ncol), & + Qsfc(:ncol), & + T(:ncol,:), & + qv(:ncol,:), & + dtdt_heating(:ncol,:), & + Fsolar(:ncol,lchnk), & + Fup(:ncol,lchnk), & + Fdown(:ncol,lchnk), & + Fup_toa(:ncol,lchnk), & + Fdown_toa(:ncol,lchnk) ) + dtdt_solar(:ncol,:) = 0._r8 + else + ! ERROR: Unknown RADIATION_OPT value + !------------------------------------- + write(iulog,*) 'ERROR: unknown RADIATION_OPT=',RADIATION_OPT + call endrun('frierson_pbl_tend() RADIATION_OPT ERROR') + endif + + Fnet (:ncol,lchnk) = Fup(:ncol,lchnk) - Fdown (:ncol,lchnk) + Fnet_toa (:ncol,lchnk) = Fup_toa(:ncol,lchnk) - Fdown_toa (:ncol,lchnk) + + ! Copy downward LW radiative heating values to cam_out% + !--------------------------------------------------------- + cam_out%flwds(:ncol) = Fdown (:ncol,lchnk) + cam_out%netsw(:ncol) = Fsolar(:ncol,lchnk) + cam_out%sols (:ncol) = Fsolar(:ncol,lchnk) + cam_out%solsd(:ncol) = Fsolar(:ncol,lchnk) + cam_out%soll (:ncol) = Fsolar(:ncol,lchnk) + cam_out%solld(:ncol) = Fsolar(:ncol,lchnk) + + ! Back out tendencies from updated T field + !-------------------------------------------- + do k = 1, pver + ptend%s(:ncol,k) = (T(:,k)-state%T(:ncol,k))/ztodt*cpair + end do + + ! Archive T tendency from temperature relaxation (mimics radiation, K/s) + !----------------------------------------------------------------------- + call outfld('gray_QRL' ,dtdt_heating, ncol,lchnk) + call outfld('gray_QRS' ,dtdt_solar , ncol,lchnk) + call outfld('gray_SWflux',Fsolar(:ncol,lchnk) , ncol,lchnk) + call outfld('gray_LUflux',Fup(:ncol,lchnk) , ncol,lchnk) + call outfld('gray_LDflux',Fdown(:ncol,lchnk) , ncol,lchnk) + call outfld('gray_LWflux',Fnet(:ncol,lchnk) , ncol,lchnk) + call outfld('gray_LUflux_TOA',Fup_toa(:ncol,lchnk) , ncol,lchnk) + call outfld('gray_LDflux_TOA',Fdown_toa(:ncol,lchnk) , ncol,lchnk) + call outfld('gray_LWflux_TOA',Fnet_toa(:ncol,lchnk) , ncol,lchnk) + + end subroutine frierson_radiative_tend + !============================================================================ + + + !======================================================================= + subroutine frierson_surface_init(ncol, clat, PS, Tsfc, Qsfc) + ! + ! + !========================================================================== + ! + ! Passed variables + !-------------------- + integer ,intent(in) :: ncol + real(r8),intent(in) :: clat (ncol) + real(r8),intent(in) :: PS (ncol) + real(r8),intent(out):: Tsfc(ncol) + real(r8),intent(out):: Qsfc(ncol) + ! + ! Local values + !-------------- + integer :: ii + real(r8):: T_width + + ! set SST profile + !------------------ + T_width = frierson_Twidth*pi/180.0_r8 + do ii = 1, ncol + Tsfc(ii) = frierson_Tmin + frierson_Tdlt*exp(-((clat(ii)/T_width)**2)/2.0_r8) + Qsfc(ii) = epsilo*frierson_E0/PS(ii) & + *exp(-latvap/rh2o*((1._r8/Tsfc(ii))-1._r8/frierson_T0)) + end do + + end subroutine frierson_surface_init + !======================================================================= + + + !======================================================================= + subroutine frierson_restart_init(File,hdimids,hdimcnt) + ! + ! frierson_restart_init: + !========================================================================== + ! + ! Passed variables + !-------------------- + type(file_desc_t),intent(inout):: File + integer ,intent(in) :: hdimcnt + integer ,intent(in) :: hdimids(1:hdimcnt) + ! + ! Local values + !-------------- + integer:: ierr + + ierr = pio_def_var(File,'Frierson_Tsfc',pio_double, hdimids, Tsurf_desc) + if (ierr /= 0) then + call endrun('frierson_restart_init: ERROR defining Frierson_Tsfc') + end if + + ierr = pio_def_var(File,'Frierson_Qsfc',pio_double, hdimids, Qsurf_desc) + if (ierr /= 0) then + call endrun('frierson_restart_init: ERROR defining Frierson_Qsfc') + end if + + end subroutine frierson_restart_init + !======================================================================= + + + !======================================================================= + subroutine frierson_restart_write(File) + ! + ! frierson_restart_write: + !========================================================================== + ! + ! Passed variables + !-------------------- + type(file_desc_t),intent(inout):: File + ! + ! Local values + !-------------- + type(io_desc_t),pointer:: iodesc + integer:: dims(3),gdims(3),nhdims + integer:: physgrid + integer:: ierr + + ! Get the iodesc for write calls + !--------------------------------- + dims(1) = pcols + dims(2) = endchunk - begchunk + 1 + physgrid = cam_grid_id('physgrid') + call cam_grid_dimensions(physgrid, gdims(1:2), nhdims) + call cam_grid_get_decomp(physgrid, dims(1:2), gdims(1:nhdims), pio_double, iodesc) + + ! Write Surface values + !--------------------- + call pio_write_darray(File, Tsurf_desc, iodesc, Tsurf, ierr) + if (ierr /= 0) then + call endrun('frierson_restart_write: ERROR writing Tsurf') + end if + + call pio_write_darray(File, Qsurf_desc, iodesc, Qsurf, ierr) + if (ierr /= 0) then + call endrun('frierson_restart_write: ERROR writing Qsurf') + end if + + end subroutine frierson_restart_write + !======================================================================= + + + !======================================================================= + subroutine frierson_restart_read(File) + ! + ! frierson_restart_read: + !========================================================================== + use error_messages,only: alloc_err + ! + ! Passed variables + !-------------------- + type(file_desc_t),intent(inout):: File + ! + ! Local values + !-------------- + type( io_desc_t),pointer:: iodesc + type(var_desc_t) :: vardesc + integer:: dims(3),gdims(3),nhdims + integer:: physgrid + integer:: ierr + + ! Allocate space for the restart fields + !----------------------------------------- + allocate(Tsurf (pcols,begchunk:endchunk),stat=ierr) + call alloc_err(ierr,'Frierson RESTART','Tsurf' ,pcols*(endchunk-begchunk+1)) + allocate(Qsurf (pcols,begchunk:endchunk) ,stat=ierr) + call alloc_err(ierr,'Frierson RESTART','Qsurf' ,pcols*(endchunk-begchunk+1)) + + ! Get the iodesc for read calls + !--------------------------------- + dims(1) = pcols + dims(2) = endchunk - begchunk + 1 + physgrid = cam_grid_id('physgrid') + call cam_grid_dimensions(physgrid, gdims(1:2), nhdims) + call cam_grid_get_decomp(physgrid, dims(1:2), gdims(1:nhdims), pio_double, iodesc) + + ! Read Surface values + !--------------------- + ierr = pio_inq_varid(File,'Frierson_Tsfc',vardesc) + if (ierr /= 0) then + call endrun('frierson_restart_read: ERROR PIO unable to find variable Frierson_Tsfc') + end if + + call pio_read_darray(File, vardesc, iodesc, Tsurf, ierr) + if (ierr /= 0) then + call endrun('frierson_restart_read: ERROR PIO unable to read variable Tsurf') + end if + + ierr = pio_inq_varid(File,'Frierson_Qsfc',vardesc) + if (ierr /= 0) then + call endrun('frierson_restart_read: ERROR PIO unable to find variable Frierson_Qsfc') + end if + + call pio_read_darray(File, vardesc, iodesc, Qsurf, ierr) + if (ierr /= 0) then + call endrun('frierson_restart_read: ERROR PIO unable to read variable Qsurf') + end if + + end subroutine frierson_restart_read + !======================================================================= + +end module frierson_cam + diff --git a/src/physics/simple/physpkg.F90 b/src/physics/simple/physpkg.F90 index 9c1e4c61bf..31c41def58 100644 --- a/src/physics/simple/physpkg.F90 +++ b/src/physics/simple/physpkg.F90 @@ -19,7 +19,7 @@ module physpkg use camsrfexch, only: cam_out_t, cam_in_t, cam_export ! Note: ideal_phys is true for Held-Suarez (1994) physics - use cam_control_mod, only: moist_physics, adiabatic, ideal_phys, kessler_phys, tj2016_phys + use cam_control_mod, only: moist_physics, adiabatic, ideal_phys, kessler_phys, tj2016_phys, frierson_phys use phys_control, only: phys_getopts use perf_mod, only: t_barrierf, t_startf, t_stopf, t_adj_detailf use cam_logfile, only: iulog @@ -80,6 +80,7 @@ subroutine phys_register use check_energy, only: check_energy_register use kessler_cam, only: kessler_register use tj2016_cam, only: thatcher_jablonowski_register + use frierson_cam, only: frierson_register !---------------------------Local variables----------------------------- ! @@ -111,6 +112,8 @@ subroutine phys_register call kessler_register() else if (tj2016_phys) then call thatcher_jablonowski_register() + else if (frierson_phys) then + call frierson_register() end if ! Fields for physics package diagnostics @@ -197,10 +200,12 @@ subroutine phys_init( phys_state, phys_tend, pbuf2d, cam_in, cam_out ) use held_suarez_cam, only: held_suarez_init use kessler_cam, only: kessler_cam_init use tj2016_cam, only: thatcher_jablonowski_init + use frierson_cam, only: frierson_init use tracers, only: tracers_init use wv_saturation, only: wv_sat_init use phys_debug_util, only: phys_debug_init use qneg_module, only: qneg_init + use nudging, only: Nudge_Model, nudging_init use cam_snapshot, only: cam_snapshot_init use cam_budget, only: cam_budget_init @@ -243,7 +248,7 @@ subroutine phys_init( phys_state, phys_tend, pbuf2d, cam_in, cam_out ) ! wv_saturation is relatively independent of everything else and ! low level, so init it early. Must at least do this before radiation. - if (kessler_phys .or. tj2016_phys) then + if (kessler_phys .or. tj2016_phys .or. frierson_phys) then call wv_sat_init() end if @@ -259,8 +264,14 @@ subroutine phys_init( phys_state, phys_tend, pbuf2d, cam_in, cam_out ) call kessler_cam_init(pbuf2d) else if (tj2016_phys) then call thatcher_jablonowski_init(pbuf2d) + else if (frierson_phys) then + call frierson_init(phys_state,pbuf2d) end if + ! Initialize Nudging Parameters + !-------------------------------- + if(Nudge_Model) call nudging_init + if (chem_is_active()) then ! Prognostic chemistry. call chem_init(phys_state,pbuf2d) @@ -476,6 +487,7 @@ subroutine tphysac (ztodt, cam_in, cam_out, state, tend, pbuf) use constituents, only: cnst_get_ind, pcnst use cam_diagnostics, only: diag_phys_tend_writeout, diag_surf use tj2016_cam, only: thatcher_jablonowski_sfc_pbl_hs_tend + use frierson_cam, only: frierson_pbl_tend use dycore, only: dycore_is use check_energy, only: tot_energy_phys use cam_history, only: hist_fld_active @@ -483,6 +495,10 @@ subroutine tphysac (ztodt, cam_in, cam_out, state, tend, pbuf) use cam_budget, only: thermo_budget_history use dyn_tests_utils, only: vc_dycore, vc_height, vc_dry_pressure use air_composition, only: cpairv, cp_or_cv_dycore + use time_manager, only: get_nstep + use nudging, only: Nudge_Model, Nudge_ON, nudging_timestep_tend + use check_energy, only: check_energy_chng + ! Arguments ! real(r8), intent(in) :: ztodt ! Two times model timestep (2 delta-t) @@ -495,6 +511,9 @@ subroutine tphysac (ztodt, cam_in, cam_out, state, tend, pbuf) !---------------------------Local workspace----------------------------- + integer :: nstep ! current timestep number + real(r8):: zero(pcols) ! array of zeros + type(physics_ptend) :: ptend ! indivdual parameterization tendencies real(r8) :: tmp_q(pcols, pver) real(r8) :: tmp_cldliq(pcols, pver) @@ -518,6 +537,10 @@ subroutine tphysac (ztodt, cam_in, cam_out, state, tend, pbuf) real(r8) :: scaling(pcols,pver) !-------------------------------------------------------------------------- + ! get nstep and zero array for energy checker + zero = 0._r8 + nstep = get_nstep() + ! number of active atmospheric columns ncol = state%ncol lchnk = state%lchnk @@ -555,14 +578,28 @@ subroutine tphysac (ztodt, cam_in, cam_out, state, tend, pbuf) call physics_update(state, ptend, ztodt, tend) end if + if (frierson_phys) then + ! Update surface, PBL + call frierson_pbl_tend(state, ptend, ztodt, cam_in) + call physics_update(state, ptend, ztodt, tend) + end if + + ! Update Nudging values, if needed + !---------------------------------- + if (Nudge_Model .and. Nudge_ON) then + call nudging_timestep_tend(state,ptend) + call physics_update(state, ptend, ztodt, tend) + call check_energy_chng(state, tend, "nudging", nstep, ztodt, zero, zero, zero, zero) + endif + call tot_energy_phys(state, 'phAP') call tot_energy_phys(state, 'dyAP',vc=vc_dycore) - + ! FV: convert dry-type mixing ratios to moist here because ! physics_dme_adjust assumes moist. This is done in p_d_coupling for ! other dynamics. Bundy, Feb 2004. ! - moist_mixing_ratio_dycore = dycore_is('LR').or. dycore_is('FV3') + moist_mixing_ratio_dycore = dycore_is('LR').or. dycore_is('FV3') ! ! update cp/cv for energy computation based in updated water variables ! @@ -608,7 +645,7 @@ subroutine tphysac (ztodt, cam_in, cam_out, state, tend, pbuf) else ! ! for moist-mixing ratio based dycores - ! + ! ! Note: this operation will NOT be reverted with set_wet_to_dry after set_dry_to_wet call ! call set_dry_to_wet(state) @@ -619,7 +656,7 @@ subroutine tphysac (ztodt, cam_in, cam_out, state, tend, pbuf) if (vc_dycore == vc_height.or.vc_dycore == vc_dry_pressure) then ! ! MPAS and SE specific scaling of temperature for enforcing energy consistency - ! (and to make sure that temperature dependent diagnostic tendencies + ! (and to make sure that temperature dependent diagnostic tendencies ! are computed correctly; e.g. dtcore) ! scaling(1:ncol,:) = cpairv(:ncol,:,lchnk)/cp_or_cv_dycore(:ncol,:,lchnk) @@ -630,7 +667,7 @@ subroutine tphysac (ztodt, cam_in, cam_out, state, tend, pbuf) ! else: do nothing for dycores with energy consistent with CAM physics ! end if - + else tmp_q (:ncol,:pver) = 0.0_r8 tmp_cldliq(:ncol,:pver) = 0.0_r8 @@ -692,6 +729,8 @@ subroutine tphysbc (ztodt, state, tend, pbuf, cam_out, cam_in ) use held_suarez_cam, only: held_suarez_tend use kessler_cam, only: kessler_tend use tj2016_cam, only: thatcher_jablonowski_precip_tend + use frierson_cam, only: frierson_condensate_tend + use frierson_cam, only: frierson_radiative_tend use dycore, only: dycore_is use cam_snapshot_common,only: cam_snapshot_all_outfld use cam_snapshot_common,only: cam_snapshot_ptend_outfld @@ -886,6 +925,37 @@ subroutine tphysbc (ztodt, state, tend, pbuf, cam_out, cam_in ) if (trim(cam_take_snapshot_after) == "thatcher_jablonowski_precip_tend") then call cam_snapshot_all_outfld(cam_snapshot_after_num, state, tend, cam_in, cam_out, pbuf) end if + else if (frierson_phys) then + ! Compute the large-scale precipitation + !---------------------------------------- + if (trim(cam_take_snapshot_before) == "frierson_condensate_tend") then + call cam_snapshot_all_outfld(cam_snapshot_before_num, state, tend, cam_in, cam_out, pbuf) + end if + call frierson_condensate_tend(state, ptend, ztodt, pbuf) + if ( (trim(cam_take_snapshot_after) == "frierson_condensate_tend") .and. & + (trim(cam_take_snapshot_before) == trim(cam_take_snapshot_after))) then + call cam_snapshot_ptend_outfld(ptend, lchnk) + end if + call physics_update(state, ptend, ztodt, tend) + if (trim(cam_take_snapshot_after) == "frierson_condensate_tend") then + call cam_snapshot_all_outfld(cam_snapshot_after_num, state, tend, cam_in, cam_out, pbuf) + end if + + ! Compute the radiative tendencies + !----------------------------------- + if (trim(cam_take_snapshot_before) == "frierson_radiative_tend") then + call cam_snapshot_all_outfld(cam_snapshot_before_num, state, tend, cam_in, cam_out, pbuf) + end if + call frierson_radiative_tend(state, ptend, ztodt, cam_in, cam_out) + if ( (trim(cam_take_snapshot_after) == "frierson_radiative_tend") .and. & + (trim(cam_take_snapshot_before) == trim(cam_take_snapshot_after))) then + call cam_snapshot_ptend_outfld(ptend, lchnk) + end if + call physics_update(state, ptend, ztodt, tend) + if (trim(cam_take_snapshot_after) == "frierson_radiative_tend") then + call cam_snapshot_all_outfld(cam_snapshot_after_num, state, tend, cam_in, cam_out, pbuf) + end if + end if ! Can't turn on conservation error messages unless the appropriate heat @@ -945,6 +1015,7 @@ subroutine phys_timestep_init(phys_state, cam_in, cam_out, pbuf2d) !-------------------------------------------------------------------------- use physics_types, only: physics_state use physics_buffer, only: physics_buffer_desc + use nudging, only: Nudge_Model, nudging_timestep_init implicit none @@ -956,6 +1027,10 @@ subroutine phys_timestep_init(phys_state, cam_in, cam_out, pbuf2d) !-------------------------------------------------------------------------- + ! Update Nudging values, if needed + !---------------------------------- + if(Nudge_Model) call nudging_timestep_init(phys_state) + end subroutine phys_timestep_init !====================================================================================== diff --git a/src/physics/simple/radconstants.F90 b/src/physics/simple/radconstants.F90 index 0649a6f730..b69fac1552 100644 --- a/src/physics/simple/radconstants.F90 +++ b/src/physics/simple/radconstants.F90 @@ -19,6 +19,7 @@ module radconstants integer, parameter, public :: ot_length = 32 public :: rad_gas_index +public :: get_lw_spectral_boundaries integer, public, parameter :: gasnamelength = 1 integer, public, parameter :: nradgas = 1 @@ -37,4 +38,15 @@ integer function rad_gas_index(gasname) end function rad_gas_index +!------------------------------------------------------------------------------ +subroutine get_lw_spectral_boundaries(low_boundaries, high_boundaries, units) + ! stub should not be called + + real(r8), intent(out) :: low_boundaries(nlwbands), high_boundaries(nlwbands) + character(*), intent(in) :: units ! requested units + + call endrun('get_lw_spectral_boundaries: ERROR: this is a stub') + +end subroutine get_lw_spectral_boundaries + end module radconstants diff --git a/src/physics/simple/restart_physics.F90 b/src/physics/simple/restart_physics.F90 index ef8f8795ef..fb40c5921b 100644 --- a/src/physics/simple/restart_physics.F90 +++ b/src/physics/simple/restart_physics.F90 @@ -13,6 +13,9 @@ module restart_physics pio_inq_varid, pio_def_var, pio_def_dim, & pio_put_var, pio_get_var + use cam_control_mod, only: frierson_phys + use frierson_cam,only: frierson_restart_init, frierson_restart_write, frierson_restart_read + implicit none private save @@ -59,6 +62,10 @@ subroutine init_restart_physics ( File, pbuf2d) call pbuf_init_restart(File, pbuf2d) + if (frierson_phys) then + call frierson_restart_init(File,hdimids,hdimcnt) + end if + end subroutine init_restart_physics subroutine write_restart_physics (File, cam_in, cam_out, pbuf2d) @@ -85,6 +92,10 @@ subroutine write_restart_physics (File, cam_in, cam_out, pbuf2d) ! Physics buffer call pbuf_write_restart(File, pbuf2d) + if (frierson_phys) then + call frierson_restart_write(File) + end if + end subroutine write_restart_physics !####################################################################### @@ -110,6 +121,9 @@ subroutine read_restart_physics(File, cam_in, cam_out, pbuf2d) call pbuf_read_restart(File, pbuf2d) + if (frierson_phys) then + call frierson_restart_read(File) + end if end subroutine read_restart_physics end module restart_physics diff --git a/src/utils/table_interp_mod.F90 b/src/utils/table_interp_mod.F90 new file mode 100644 index 0000000000..9daac52b51 --- /dev/null +++ b/src/utils/table_interp_mod.F90 @@ -0,0 +1,214 @@ +!---------------------------------------------------------------------------- +! Utility module used for interpolation of aerosol optics table +! NOTE: Results will be set to table edges for interpolations beyond +! the edges -- no extropolations +!---------------------------------------------------------------------------- +module table_interp_mod + use shr_kind_mod, only: r8=>shr_kind_r8 + + implicit none + + private + public :: table_interp + public :: table_interp_wghts + public :: table_interp_calcwghts + + ! overload the interpolation routines + interface table_interp + module procedure interp1d + module procedure interp2d + module procedure interp4d + end interface table_interp + + ! interpolation weights and indices + type :: table_interp_wghts + real(r8) :: wt1 + real(r8) :: wt2 + integer :: ix1 + integer :: ix2 + end type table_interp_wghts + +contains + + !-------------------------------------------------------------------------- + ! 1-D interpolation + !-------------------------------------------------------------------------- + pure function interp1d( ncol, nxs, xwghts, tbl ) result(res) + + integer, intent(in) :: ncol ! number of model columns + integer, intent(in) :: nxs ! table size + real(r8), intent(in) :: tbl(nxs) ! table values to be interpolated + type(table_interp_wghts), intent(in) :: xwghts(ncol) ! interpolation weights and indices + + real(r8) :: res(ncol) + + integer :: i + + do i = 1,ncol + + res(i) = xwghts(i)%wt1*tbl(xwghts(i)%ix1) & + + xwghts(i)%wt2*tbl(xwghts(i)%ix2) + + end do + + end function interp1d + + !-------------------------------------------------------------------------- + ! 2-D interpolation + !-------------------------------------------------------------------------- + pure function interp2d( ncoef, ncol, nxs, nys, xwghts, ywghts, tbl ) result(res) + + integer, intent(in) :: ncoef ! number chebyshev coefficients + integer, intent(in) :: ncol ! number of model columns + integer, intent(in) :: nxs ! table x-dimension size + integer, intent(in) :: nys ! table y-dimension size + real(r8), intent(in) :: tbl(ncoef,nxs,nys) ! table values to be interpolated + type(table_interp_wghts), intent(in) :: xwghts(ncol) ! x interpolation weights and indices + type(table_interp_wghts), intent(in) :: ywghts(ncol) ! y interpolation weights and indices + + real(r8) :: res(ncoef,ncol) + + real(r8) :: fx(ncoef,2) + + integer :: i + + do i = 1,ncol + + ! interp x dir + fx(:,1) = xwghts(i)%wt1*tbl(:,xwghts(i)%ix1,ywghts(i)%ix1) & ! @ y1 + + xwghts(i)%wt2*tbl(:,xwghts(i)%ix2,ywghts(i)%ix1) + fx(:,2) = xwghts(i)%wt1*tbl(:,xwghts(i)%ix1,ywghts(i)%ix2) & ! @ y2 + + xwghts(i)%wt2*tbl(:,xwghts(i)%ix2,ywghts(i)%ix2) + + ! interp y dir + res(:,i) = ywghts(i)%wt1*fx(:,1) + ywghts(i)%wt2*fx(:,2) + + end do + + end function interp2d + + !-------------------------------------------------------------------------- + ! 4-D interpolation + !-------------------------------------------------------------------------- + pure function interp4d( ncol, nxs, nys, nzs, nts, xwghts, ywghts, zwghts, twghts, tbl ) result(res) + + integer, intent(in) :: ncol ! number of model columns + integer, intent(in) :: nxs ! table x-dimension size + integer, intent(in) :: nys ! table y-dimension size + integer, intent(in) :: nzs ! table z-dimension size + integer, intent(in) :: nts ! table t-dimension size + real(r8), intent(in) :: tbl(nxs,nys,nzs,nts) ! table values to be interpolated + type(table_interp_wghts), intent(in) :: xwghts(ncol) ! x interpolation weights and indices + type(table_interp_wghts), intent(in) :: ywghts(ncol) ! y interpolation weights and indices + type(table_interp_wghts), intent(in) :: zwghts(ncol) ! z interpolation weights and indices + type(table_interp_wghts), intent(in) :: twghts(ncol) ! t interpolation weights and indices + + real(r8) :: res(ncol) + + real(r8) :: fx(8) + real(r8) :: fy(4) + real(r8) :: fz(2) + + integer :: i + + do i = 1,ncol + + ! interp x dir + fx(1) = xwghts(i)%wt1*tbl(xwghts(i)%ix1,ywghts(i)%ix1,zwghts(i)%ix1,twghts(i)%ix1) & ! @ y1, z1, t1 + + xwghts(i)%wt2*tbl(xwghts(i)%ix2,ywghts(i)%ix1,zwghts(i)%ix1,twghts(i)%ix1) + fx(2) = xwghts(i)%wt1*tbl(xwghts(i)%ix1,ywghts(i)%ix2,zwghts(i)%ix1,twghts(i)%ix1) & ! @ y2, z1, t1 + + xwghts(i)%wt2*tbl(xwghts(i)%ix2,ywghts(i)%ix2,zwghts(i)%ix1,twghts(i)%ix1) + + fx(3) = xwghts(i)%wt1*tbl(xwghts(i)%ix1,ywghts(i)%ix1,zwghts(i)%ix2,twghts(i)%ix1) & ! @ y1, z2, t1 + + xwghts(i)%wt2*tbl(xwghts(i)%ix2,ywghts(i)%ix1,zwghts(i)%ix2,twghts(i)%ix1) + fx(4) = xwghts(i)%wt1*tbl(xwghts(i)%ix1,ywghts(i)%ix2,zwghts(i)%ix2,twghts(i)%ix1) & ! @ y2, z2, t1 + + xwghts(i)%wt2*tbl(xwghts(i)%ix2,ywghts(i)%ix2,zwghts(i)%ix2,twghts(i)%ix1) + + fx(5) = xwghts(i)%wt1*tbl(xwghts(i)%ix1,ywghts(i)%ix1,zwghts(i)%ix1,twghts(i)%ix2) & ! @ y1, z1, t2 + + xwghts(i)%wt2*tbl(xwghts(i)%ix2,ywghts(i)%ix1,zwghts(i)%ix1,twghts(i)%ix2) + fx(6) = xwghts(i)%wt1*tbl(xwghts(i)%ix1,ywghts(i)%ix2,zwghts(i)%ix1,twghts(i)%ix2) & ! @ y2, z1, t2 + + xwghts(i)%wt2*tbl(xwghts(i)%ix2,ywghts(i)%ix2,zwghts(i)%ix1,twghts(i)%ix2) + + fx(7) = xwghts(i)%wt1*tbl(xwghts(i)%ix1,ywghts(i)%ix1,zwghts(i)%ix2,twghts(i)%ix2) & ! @ y1, z2, t2 + + xwghts(i)%wt2*tbl(xwghts(i)%ix2,ywghts(i)%ix1,zwghts(i)%ix2,twghts(i)%ix2) + fx(8) = xwghts(i)%wt1*tbl(xwghts(i)%ix1,ywghts(i)%ix2,zwghts(i)%ix2,twghts(i)%ix2) & ! @ y2, z2, t2 + + xwghts(i)%wt2*tbl(xwghts(i)%ix2,ywghts(i)%ix2,zwghts(i)%ix2,twghts(i)%ix2) + + ! interp y dir + fy(1) = ywghts(i)%wt1*fx(1) + ywghts(i)%wt2*fx(2) ! @ z1, t1 + fy(2) = ywghts(i)%wt1*fx(3) + ywghts(i)%wt2*fx(4) ! @ z2, t1 + fy(3) = ywghts(i)%wt1*fx(5) + ywghts(i)%wt2*fx(6) ! @ z1, t2 + fy(4) = ywghts(i)%wt1*fx(7) + ywghts(i)%wt2*fx(8) ! @ z2, t2 + + ! interp z dir + fz(1) = zwghts(i)%wt1*fy(1) + zwghts(i)%wt2*fy(2) ! @ t1 + fz(2) = zwghts(i)%wt1*fy(3) + zwghts(i)%wt2*fy(4) ! @ t2 + + ! interp t dir + res(i) = twghts(i)%wt1*fz(1) + twghts(i)%wt2*fz(2) + + end do + + end function interp4d + + !-------------------------------------------------------------------------- + ! determines interpolation weights and indices for given values at the model columns + !-------------------------------------------------------------------------- + pure function table_interp_calcwghts( ngrid, xgrid, ncols, xcols ) result(wghts) + + integer, intent(in) :: ngrid ! number of grid point values + real(r8), intent(in) :: xgrid(ngrid) ! grid point values + integer, intent(in) :: ncols ! number of model columns + real(r8), intent(in) :: xcols(ncols) ! values at the model columns + + type(table_interp_wghts) :: wghts(ncols) ! interpolations weights at the model columns + + integer :: i + real(r8) :: xs(ncols) + + xs(:) = xcols(:) + + ! do not extrapolate beyond the edges of the table + where(xs < xgrid(1)) + xs = xgrid(1) + end where + where(xs > xgrid(ngrid)) + xs = xgrid(ngrid) + end where + + do i = 1,ncols + wghts(i)%ix2 = find_index(ngrid,xgrid,xs(i)) + wghts(i)%ix1 = wghts(i)%ix2 - 1 + wghts(i)%wt1 = (xgrid(wghts(i)%ix2)-xs(i)) & + /(xgrid(wghts(i)%ix2)-xgrid(wghts(i)%ix1)) + wghts(i)%wt2 = 1._r8 - wghts(i)%wt1 + end do + + end function table_interp_calcwghts + + ! private methods + !-------------------------------------------------------------------------- + !-------------------------------------------------------------------------- + ! determines last index of grid vals of which is greater then or equal to + ! value vx + !-------------------------------------------------------------------------- + pure function find_index( nvals, vals, vx ) result(res) + integer, intent(in) :: nvals + real(r8), intent(in) :: vals(nvals) + real(r8), intent(in) :: vx + integer :: res + + integer :: ndx + + res = -1 + + find_ndx: do ndx = 2, nvals + if (vals(ndx)>=vx) then + res = ndx + exit find_ndx + end if + end do find_ndx + + end function find_index + +end module table_interp_mod