diff --git a/.gitignore b/.gitignore index ca3a7df6c0..91477520df 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,9 @@ buildnmlc buildcppc +# Ignore ide configs +.vscode + # Ignore editor temporaries and backups *~ .#* diff --git a/.gitmodules b/.gitmodules index b85216f992..8235f520d7 100644 --- a/.gitmodules +++ b/.gitmodules @@ -205,3 +205,10 @@ url = https://github.com/NCAR/CUPiD.git fxtag = v0.4.0 fxrequired = ToplevelRequired fxDONOTUSEurl = https://github.com/NCAR/CUPiD.git + +[submodule "tuv-x"] +path = libraries/tuv-x +url = https://github.com/NCAR/tuv-x.git +fxtag = ecf768a2b66 +fxrequired = ToplevelRequired +fxDONOTUSEurl = https://github.com/NCAR/tuv-x.git diff --git a/bld/namelist_files/namelist_definition.xml b/bld/namelist_files/namelist_definition.xml index 40f300d725..9077c9a2df 100644 --- a/bld/namelist_files/namelist_definition.xml +++ b/bld/namelist_files/namelist_definition.xml @@ -7672,6 +7672,17 @@ Maximum zenith angle (degrees) used for photolysis. Default: set by build-namelist. + +Filepath of TUV-X configuration specification. +Default: NONE + + + +Switch to turn on TUV-X photolysis. +Default: FALSE + diff --git a/cime_config/buildlib b/cime_config/buildlib index 0328e84f2f..7f0e6a0105 100755 --- a/cime_config/buildlib +++ b/cime_config/buildlib @@ -7,7 +7,7 @@ create the cam library # pylint: disable=unused-wildcard-import, bad-whitespace, too-many-locals # pylint: disable=invalid-name import sys, os, filecmp, shutil - +from glob import glob _CIMEROOT = os.environ.get("CIMEROOT") if _CIMEROOT is None: @@ -27,7 +27,7 @@ logger = logging.getLogger(__name__) ############################################################################### def _build_fms(caseroot, libroot, bldroot): - ############################################################################### +############################################################################### with Case(caseroot) as case: @@ -71,7 +71,7 @@ def _build_fms(caseroot, libroot, bldroot): ############################################################################### def _build_cam(caseroot, libroot, bldroot): - ############################################################################### +############################################################################### with Case(caseroot, read_only=False) as case: @@ -157,12 +157,160 @@ def _build_cam(caseroot, libroot, bldroot): logger.info("%s: \n\n output:\n %s \n\n err:\n\n%s\n", cmd, out, err) expect(rc == 0, "Command %s failed with rc=%s" % (cmd, rc)) +############################################################################### +def _run_cmd(command, working_dir): +############################################################################### + + rc, out, err = run_cmd(command, from_dir=working_dir, verbose=True) + expect(rc == 0, f"Command {command} failed with rc={rc} out={out} err={err}") + +############################################################################### +def _cmake_default_args(caseroot): +############################################################################### +# Returns a dictionary of CMake variables based on the Macros.cmake file for +# the build. + + with Case(caseroot) as case: + macro_path = os.path.abspath(os.path.join(caseroot, "cmake_macros", "")) + args = "-DCONVERT_TO_MAKE=ON " + args += f"-DCASEROOT={caseroot} " + args += f"-DCOMPILER={case.get_value('COMPILER')} " + args += f"-DOS={case.get_value('OS')} " + args += f"-DMACH={case.get_value('MACH')} " + args += "-DCMAKE_C_COMPILER_WORKS=1 " + args += "-DCMAKE_Fortran_COMPILER_WORKS=1 " + args += "-DCMAKE_CXX_COMPILER_WORKS=1 " + args += f"-DDEBUG={case.get_value('DEBUG')} " + cmd = f"cmake {args} ." + rc, out, err = run_cmd(cmd, combine_output=True, from_dir=macro_path) + expect(rc == 0, f"Command {cmd} failed with rc={rc} out={out} err={err}") + + arg_dict = {} + for line in out.splitlines(): + if ":=" in line: + key, val = line.split(":=") + arg_dict[key.replace('CIME_SET_MAKEFILE_VAR','').strip()] = val.strip() + + return arg_dict + +############################################################################### +def _build_tuvx(caseroot, libroot, bldroot): +############################################################################### +# Builds the TUV-x library and updates the case variables used to set the +# include paths and linked libraries + + with Case(caseroot) as case: + bldpath = os.path.join(bldroot, "tuv-x") + if not os.path.exists(bldpath): + os.makedirs(bldpath) + srcpath = os.path.abspath(os.path.join(case.get_value("COMP_ROOT_DIR_ATM"), \ + "libraries", "tuv-x", "")) + logger.info("Building TUV-x in {} from source in {}\n".format(bldpath, srcpath)) + + arg_dict = _cmake_default_args(caseroot) + cmake_args = "-DCMAKE_VERBOSE_MAKEFILE=ON " + if case.get_value("MPILIB") != "mpi-serial": + cmake_args += "-DTUVX_ENABLE_MPI:BOOL=TRUE " + if case.get_value("DEBUG"): + cmake_args += "-DCMAKE_BUILD_TYPE=Debug " + else: + cmake_args += "-DCMAKE_BUILD_TYPE=Release " + cmake_args += "-DCMAKE_Fortran_COMPILER=mpif90 " + cmake_args += "-DCMAKE_C_COMPILER=mpicc " + cmake_args += "-DCMAKE_CXX_COMPILER=mpicxx " + cmake_args += "-DCMAKE_Fortran_COMPILER_WORKS=1 " + cmake_args += "-DCMAKE_C_COMPILER_WORKS=1 " + cmake_args += "-DCMAKE_CXX_COMPILER_WORKS=1 " + if (case.get_value("MACH") == "izumi") : + cmake_args += f"-DCMAKE_PREFIX_PATH={arg_dict['NETCDF_PATH']} " + cmake_args += f"-DCMAKE_IGNORE_PATH={os.environ.get('PYTHONHOME')} " + if (case.get_value("MACH") == "izumi") and (case.get_value('COMPILER') == "nag") : + cmake_args += "-DCMAKE_Fortran_FLAGS='-C=all -g ' " + else : + cmake_args += f"-DCMAKE_Fortran_FLAGS='{arg_dict['FFLAGS']}' " + cmake_args += f"-DCMAKE_INSTALL_PREFIX='{libroot}' " + cmake_args += "-DTUVX_ENABLE_TESTS=OFF " + cmake_args += "-DTUVX_ENABLE_COVERAGE=OFF " + cmake_args += "-DTUVX_BUILD_CLI=OFF " + cmake_args += f"-DTUVX_INSTALL_INCLUDE_DIR='{_tuvx_include_dir(libroot)}' " + cmake_args += f"-DTUVX_INSTALL_MOD_DIR='{_tuvx_include_dir(libroot)}' " + cmake_args += srcpath + + _run_cmd(f"cmake {cmake_args}", bldpath) + _run_cmd(case.get_value('GMAKE'), bldpath) + _run_cmd(f"{case.get_value('GMAKE')} install", bldpath) + + # add TUV-x to include paths + incldir = os.environ.get('USER_INCLDIR') + if incldir is None: + incldir = '' + os.environ['USER_INCLDIR'] = incldir + \ + f" -I{_tuvx_include_dir(libroot)} " + + # create symlink to library in folder CIME expects libraries to be in + dst = os.path.join(libroot, "libtuvx.a") + if os.path.isfile(dst): + os.remove(dst) + os.symlink(_tuvx_lib_path(libroot), dst) + dst = os.path.join(libroot, "libyaml-cpp.a") + if os.path.isfile(dst): + os.remove(dst) + os.symlink(_yaml_cpp_lib_path(libroot), dst) + +############################################################################### +def _tuvx_include_dir(libroot): +############################################################################### +# Returns the path to the TUV-x include directory + + coreinc = os.path.join(libroot, "include") + expect(os.path.exists(coreinc), f"TUV-x include directory not found at {coreinc}") + + return coreinc + +############################################################################### +def _yaml_cpp_lib_path(libroot): +############################################################################### +# Returns the path to the yaml-cpp library + + corelib = os.path.join(libroot, "lib64", "libyaml-cpp.a") + if not os.path.exists(corelib): + corelib = os.path.join(libroot, "lib64", "libyaml-cppd.a") + if not os.path.exists(corelib): + corelib = os.path.join(libroot, "lib", "libyaml-cpp.a") + expect(os.path.exists(corelib), f"yaml-cpp library not found at {corelib}") + + return corelib + +############################################################################### +def _tuvx_lib_path(libroot): +############################################################################### +# Returns the path to the TUV-x library + + corelib = os.path.join(_tuvx_install_dir(libroot), "lib64", "libtuvx.a") + if not os.path.exists(corelib): + corelib = os.path.join(_tuvx_install_dir(libroot), "lib", "libtuvx.a") + expect(os.path.exists(corelib), f"TUV-x library not found at {corelib}") + + return corelib + +############################################################################### +def _tuvx_install_dir(libroot): +############################################################################### +# Returns the path to the TUV-x install directory + + corepaths = glob(os.path.join(libroot, "tuvx*")) + expect(len(corepaths)>0, f"TUV-x not found at {libroot}") + expect(len(corepaths)<2, f"Multiple TUV-x versions found at {libroot}") + expect(os.path.exists(corepaths[0]), f"TUV-x install directory not found at {corepaths[0]}") + + return corepaths[0] ############################################################################### def _main_func(): caseroot, libroot, bldroot = parse_input(sys.argv) + _build_tuvx(caseroot, libroot, bldroot) _build_fms(caseroot, libroot, bldroot) _build_cam(caseroot, libroot, bldroot) diff --git a/cime_config/buildnml b/cime_config/buildnml index 674d1a29ea..e5382882cc 100755 --- a/cime_config/buildnml +++ b/cime_config/buildnml @@ -214,6 +214,13 @@ def buildnml(case, caseroot, compname): logger.info("GEOS-Chem config file copy: file1 %s file2 %s ", file1, file2) shutil.copy(file1,file2) + # Copy TUV-x data to rundir + dest_data = os.path.join(rundir, "data") + if os.path.exists(dest_data): + shutil.rmtree(dest_data) + shutil.copytree(os.path.join(srcroot, "libraries", "tuv-x", "data"), \ + dest_data) + ############################################################################### def _main_func(): diff --git a/cime_config/config_component.xml b/cime_config/config_component.xml index 0a0b851b54..4fb2b20be8 100644 --- a/cime_config/config_component.xml +++ b/cime_config/config_component.xml @@ -221,6 +221,18 @@ + + char + + -ltuvx -lyaml-cpp -lstdc++ + build_component_cam + env_build.xml + + CAM linked libraries. The libraries are built by CAM's buildlib script and should be included + during linking of the model executable. + + + char diff --git a/cime_config/testdefs/testmods_dirs/cam/carma_mixed_sulfate/user_nl_cam b/cime_config/testdefs/testmods_dirs/cam/carma_mixed_sulfate/user_nl_cam index d292329b4c..d2a51c8d3e 100644 --- a/cime_config/testdefs/testmods_dirs/cam/carma_mixed_sulfate/user_nl_cam +++ b/cime_config/testdefs/testmods_dirs/cam/carma_mixed_sulfate/user_nl_cam @@ -1,6 +1,6 @@ -mfilt=1,1,1,1,1,1 -ndens=1,1,1,1,1,1 -nhtfrq=3,3,3,3,3,3 +mfilt=1,1,1,1,1,1,1,1,1,1 +ndens=1,1,1,1,1,1,1,1,1,1 +nhtfrq=3,3,3,3,3,3,3,3,3,3 inithist='ENDOFRUN' pbuf_global_allocate=.false. history_carma=.true. @@ -11,3 +11,5 @@ solar_data_type='FIXED' solar_data_ymd=20000101 carma_maxretries = 40 ubc_specifier = 'T->MSIS', 'Q->2.d-8vmr', 'CH4->2.d-10vmr', 'H->MSIS', 'N->MSIS', 'O->MSIS', 'O2->MSIS', 'H2->TGCM', 'NO->SNOE' +tuvx_active = .true. +tuvx_config_path = '$COMP_ROOT_DIR_ATM/src/chemistry/pp_waccm_ma_sulfur/tuvx_config.json' diff --git a/cime_config/testdefs/testmods_dirs/cam/outfrq9s_tuvx_waccm_ma_mam5/shell_commands b/cime_config/testdefs/testmods_dirs/cam/outfrq9s_tuvx_waccm_ma_mam5/shell_commands new file mode 100644 index 0000000000..eb40ad83e0 --- /dev/null +++ b/cime_config/testdefs/testmods_dirs/cam/outfrq9s_tuvx_waccm_ma_mam5/shell_commands @@ -0,0 +1,2 @@ +./xmlchange ROF_NCPL=\$ATM_NCPL +./xmlchange GLC_NCPL=\$ATM_NCPL diff --git a/cime_config/testdefs/testmods_dirs/cam/outfrq9s_tuvx_waccm_ma_mam5/user_nl_cam b/cime_config/testdefs/testmods_dirs/cam/outfrq9s_tuvx_waccm_ma_mam5/user_nl_cam new file mode 100644 index 0000000000..5ce03f91d0 --- /dev/null +++ b/cime_config/testdefs/testmods_dirs/cam/outfrq9s_tuvx_waccm_ma_mam5/user_nl_cam @@ -0,0 +1,15 @@ +mfilt=1,1,1,1,1,1,1,1,1 +ndens=1,1,1,1,1,1,1,1,1 +nhtfrq=9,9,9,9,9,9,9,9,9 +write_nstep0=.true. +inithist='ENDOFRUN' + +tuvx_active = .true. +tuvx_config_path = '$COMP_ROOT_DIR_ATM/src/chemistry/pp_waccm_ma_mam5/tuvx_config.json' + +fincl2 = 'TUVX_DOSE_RATE_01','TUVX_DOSE_RATE_02','TUVX_DOSE_RATE_03','TUVX_DOSE_RATE_04','TUVX_DOSE_RATE_05', + 'TUVX_DOSE_RATE_06','TUVX_DOSE_RATE_07','TUVX_DOSE_RATE_08','TUVX_DOSE_RATE_09','TUVX_DOSE_RATE_10', + 'TUVX_DOSE_RATE_11','TUVX_DOSE_RATE_12','TUVX_DOSE_RATE_13','TUVX_DOSE_RATE_14','TUVX_DOSE_RATE_15', + 'TUVX_DOSE_RATE_16','TUVX_DOSE_RATE_17','TUVX_DOSE_RATE_18','TUVX_DOSE_RATE_19','TUVX_DOSE_RATE_20', + 'TUVX_DOSE_RATE_21','TUVX_DOSE_RATE_22','TUVX_DOSE_RATE_23','TUVX_DOSE_RATE_24', + 'TUVX_DOSE_RATE_25','TUVX_DOSE_RATE_26','TUVX_DOSE_RATE_27','TUVX_DOSE_RATE_28' diff --git a/cime_config/testdefs/testmods_dirs/cam/outfrq9s_tuvx_waccm_ma_mam5/user_nl_clm b/cime_config/testdefs/testmods_dirs/cam/outfrq9s_tuvx_waccm_ma_mam5/user_nl_clm new file mode 100644 index 0000000000..0d83b5367b --- /dev/null +++ b/cime_config/testdefs/testmods_dirs/cam/outfrq9s_tuvx_waccm_ma_mam5/user_nl_clm @@ -0,0 +1,27 @@ +!---------------------------------------------------------------------------------- +! Users should add all user specific namelist changes below in the form of +! namelist_var = new_namelist_value +! +! Include namelist variables for drv_flds_in ONLY if -megan and/or -drydep options +! are set in the CLM_NAMELIST_OPTS env variable. +! +! EXCEPTIONS: +! Set use_cndv by the compset you use and the CLM_BLDNML_OPTS -dynamic_vegetation setting +! Set use_vichydro by the compset you use and the CLM_BLDNML_OPTS -vichydro setting +! Set use_cn by the compset you use and CLM_BLDNML_OPTS -bgc setting +! Set use_crop by the compset you use and CLM_BLDNML_OPTS -crop setting +! Set spinup_state by the CLM_BLDNML_OPTS -bgc_spinup setting +! Set irrigate by the CLM_BLDNML_OPTS -irrig setting +! Set dtime with L_NCPL option +! Set fatmlndfrc with LND_DOMAIN_PATH/LND_DOMAIN_FILE options +! Set finidat with RUN_REFCASE/RUN_REFDATE/RUN_REFTOD options for hybrid or branch cases +! (includes $inst_string for multi-ensemble cases) +! Set glc_grid with CISM_GRID option +! Set glc_smb with GLC_SMB option +! Set maxpatch_glcmec with GLC_NEC option +! Set glc_do_dynglacier with GLC_TWO_WAY_COUPLING env variable +!---------------------------------------------------------------------------------- +hist_nhtfrq = 9 +hist_mfilt = 1 +hist_ndens = 1 + diff --git a/cime_config/testdefs/testmods_dirs/cam/outfrq9s_waccm_ma_mam4/user_nl_cam b/cime_config/testdefs/testmods_dirs/cam/outfrq9s_waccm_ma_mam4/user_nl_cam index e66ce6abab..41c34cb195 100644 --- a/cime_config/testdefs/testmods_dirs/cam/outfrq9s_waccm_ma_mam4/user_nl_cam +++ b/cime_config/testdefs/testmods_dirs/cam/outfrq9s_waccm_ma_mam4/user_nl_cam @@ -5,3 +5,6 @@ inithist='ENDOFRUN' nlte_use_extco2 = .true. fincl2 = 'QRL_TOT','QRLNLTE','QCO2','QO3','QHC2S','QNO','QO3P', 'QCO2ext','TCO2ext','PCO2ext','CO2_ext','N2_ext','O_ext','O2_ext' + +tuvx_active = .true. +tuvx_config_path = '$COMP_ROOT_DIR_ATM/src/chemistry/pp_waccm_ma_mam5/tuvx_config.json' diff --git a/cime_config/tuvx_MOZART.json b/cime_config/tuvx_MOZART.json new file mode 100644 index 0000000000..8129266467 --- /dev/null +++ b/cime_config/tuvx_MOZART.json @@ -0,0 +1,540 @@ +{ + "__description": "TUV-x configuration for the MOZART chemical mechanism", + "O2 absorption" : { + "cross section parameters file": "data/cross_sections/O2_parameters.txt" + }, + "grids": [ + ], + "profiles": [ + ], + "radiative transfer": { + "solver": { + "type": "discrete ordinate", + "number of streams": 4 + }, + "cross sections": [ + { + "name": "air", + "type": "air" + }, + { + "name": "O3", + "netcdf files": [ + { "file path": "data/cross_sections/O3_1.nc" }, + { "file path": "data/cross_sections/O3_2.nc" }, + { "file path": "data/cross_sections/O3_3.nc" }, + { "file path": "data/cross_sections/O3_4.nc" } + ], + "type": "O3" + }, + { + "name": "O2", + "netcdf files": [ + { + "file path": "data/cross_sections/O2_1.nc", + "lower extrapolation": { "type": "boundary" }, + "interpolator": { "type": "fractional target" } + } + ], + "type": "base" + } + ], + "radiators": [ + { + "name": "air", + "type": "base", + "treat as air": true, + "cross section": "air", + "vertical profile": "air", + "vertical profile units": "molecule cm-3" + }, + { + "name": "O2", + "type": "base", + "cross section": "O2", + "vertical profile": "O2", + "vertical profile units": "molecule cm-3" + }, + { + "name": "O3", + "type": "base", + "cross section": "O3", + "vertical profile": "O3", + "vertical profile units": "molecule cm-3" + } + ] + }, + "photolysis": { + "reactions": [ + { + "name": "jo2", + "__reaction": "O2 + hv -> O + O", + "cross section": { + "netcdf files": [ + { + "file path": "data/cross_sections/O2_1.nc", + "lower extrapolation": { "type": "boundary" }, + "interpolator": { "type": "fractional target" } + } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jo1d", + "__reaction": "O3 + hv -> O2 + O(1D)", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/O3_1.nc" }, + { "file path": "data/cross_sections/O3_2.nc" }, + { "file path": "data/cross_sections/O3_3.nc" }, + { "file path": "data/cross_sections/O3_4.nc" } + ], + "type": "O3" + }, + "quantum yield": { + "type": "O3+hv->O2+O(1D)" + } + }, + { + "name": "jo3p", + "__reaction": "O3 + hv -> O2 + O(3P)", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/O3_1.nc" }, + { "file path": "data/cross_sections/O3_2.nc" }, + { "file path": "data/cross_sections/O3_3.nc" }, + { "file path": "data/cross_sections/O3_4.nc" } + ], + "type": "O3" + }, + "quantum yield": { + "type": "O3+hv->O2+O(3P)" + } + }, + { + "name": "jn2o", + "__reaction": "N2O + hv -> N2 + O(1D)", + "cross section": { + "type": "N2O+hv->N2+O(1D)" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jno2", + "__reaction": "NO2 + hv -> NO + O(3P)", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/NO2_1.nc" } + ], + "type": "NO2 tint" + }, + "quantum yield": { + "netcdf files": ["data/quantum_yields/NO2_1.nc"], + "type": "NO2 tint", + "lower extrapolation": { "type": "boundary" } + } + }, + { + "name": "jn2o5", + "__reaction": "N2O5 + hv -> NO2 + NO3", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/N2O5_1.nc" }, + { "file path": "data/cross_sections/N2O5_2.nc" } + ], + "type": "N2O5+hv->NO2+NO3" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhno3", + "__reaction": "HNO3 + hv -> OH + NO2", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/HNO3_1.nc" } + ], + "type": "HNO3+hv->OH+NO2" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jno3_a", + "__reaction": "NO3 + hv -> NO2 + O(3P)", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/NO3_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "netcdf files": [ + "data/quantum_yields/NO3-NO2+O(3P)_1.nc" + ], + "type": "tint", + "lower extrapolation": { + "type": "constant", + "value": 1.0 + } + } + }, + { + "name": "jno3_b", + "__reaction": "NO3 + hv -> NO + O2", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/NO3_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "netcdf files": [ + "data/quantum_yields/NO3-NO+O2_1.nc" + ], + "type": "tint" + } + }, + { + "name": "jch3ooh", + "__reaction": "CH3OOH + hv -> CH3O + OH", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CH3OOH_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jch2o_a", + "__reaction": "CH2O + hv -> H + HCO", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CH2O_1.nc" } + ], + "type": "CH2O" + }, + "quantum yield": { + "netcdf files": [ + "data/quantum_yields/CH2O_1.nc" + ], + "type": "base", + "lower extrapolation": { + "type": "boundary" + } + } + }, + { + "name": "jch2o_b", + "__reaction": "CH2O + hv -> H2 + CO", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CH2O_1.nc" } + ], + "type": "CH2O" + }, + "quantum yield": { + "netcdf files": [ + "data/quantum_yields/CH2O_1.nc" + ], + "type": "CH2O", + "lower extrapolation": { + "type": "boundary" + } + } + }, + { + "name": "jh2o2", + "__reaction": "H2O2 + hv -> OH + OH", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/H2O2_1.nc" } + ], + "type": "H2O2+hv->OH+OH" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jch3cho", + "__reaction": "CH3CHO + hv -> CH3 + HCO", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CH3CHO_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "netcdf files": [ + "data/quantum_yields/CH3CHO_1.nc" + ], + "type": "CH3CHO+hv->CH3+HCO" + } + }, + { + "name": "jpan", + "__reaction": "PAN + hv -> 0.6*CH3CO3 + 0.6*NO2 + 0.4*CH3O2 + 0.4*NO3 + 0.4*CO2", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/PAN_1.nc" } + ], + "type": "CH3ONO2+hv->CH3O+NO2" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jmvk", + "__reaction": "MVK + hv -> 0.7*C3H6 + 0.7*CO + 0.3*CH3O2 + 0.3*CH3CO3", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/MVK_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "MVK+hv->Products" + } + }, + { + "name": "jacet", + "__reaction": "CH3COCH3 + hv -> CH3CO + CH3", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CH3COCH3_1.nc" } + ], + "type": "CH3COCH3+hv->CH3CO+CH3" + }, + "quantum yield": { + "type": "CH3COCH3+hv->CH3CO+CH3" + } + }, + { + "name": "jmgly", + "__reaction": "CH3COCHO + hv -> CH3CO3 + CO + HO2", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CH3COCHO_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "CH3COCHO+hv->CH3CO+HCO" + } + }, + { + "name": "jglyald", + "__reaction": "GLYALD + hv -> 2*HO2 + CO + CH2O", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/HOCH2CHO_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jglyoxal", + "__reaction": "GLYOXAL + hv -> 2*CO + 2*HO2", + "__comments": "TODO the products of this reaction don't exactly match", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CHOCHO_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "netcdf files": [ + "data/quantum_yields/CHOCHO-H2_CO_CO_1.nc" + ], + "type": "base", + "lower extrapolation": { + "type": "boundary" + } + } + }, + { + "name": "jho2no2_a", + "__reaction": "HNO4 + hv -> OH + NO3", + "__comments": "TODO Doug's data sets have special temperature dependence - need new type?", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/HNO4_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 0.2 + } + }, + { + "name": "jho2no2_b", + "__reaction": "HNO4 + hv -> HO2 + NO2", + "__comments": "TODO Doug's data sets have special temperature dependence - need new type?", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/HNO4_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 0.8 + } + }, + { + "name": "jmacr_a", + "__reaction": "CH2=C(CH3)CHO->1.34HO2+0.66MCO3+1.34CH2O+CH3CO3", + "__comments": "Methacrolein photolysis channel 1", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/Methacrolein_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 0.005 + } + }, + { + "name": "jmacr_b", + "__reaction": "CH2=C(CH3)CHO->0.66OH+1.34CO", + "__comments": "Methacrolein photolysis channel 2", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/Methacrolein_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 0.005 + } + }, + { + "name": "jhyac", + "__reaction": "CH2(OH)COCH3->CH3CO3+HO2+CH2O", + "__comments": "hydroxy acetone", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/Hydroxyacetone_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 0.65 + } + } + ] + }, + "__CAM options": { + "aliasing": { + "default matching": "backup", + "pairs": [ + { + "to": "jpooh", + "__reaction": "POOH (C3H6OHOOH) + hv -> CH3CHO + CH2O + HO2 + OH", + "from": "jch3ooh" + }, + { + "to": "jch3co3h", + "__reaction": "CH3COOOH + hv -> CH3O2 + OH + CO2", + "from": "jh2o2", + "scale by": 0.28 + }, + { + "to": "jmpan", + "__reaction": "MPAN + hv -> MCO3 + NO2", + "from": "jpan" + }, + { + "to": "jc2h5ooh", + "__reaction": "C2H5OOH + hv -> CH3CHO + HO2 + OH", + "from": "jch3ooh" + }, + { + "to": "jc3h7ooh", + "__reaction": "C3H7OOH + hv -> 0.82*CH3COCH3 + OH + HO2", + "from": "jch3ooh" + }, + { + "to": "jrooh", + "__reaction": "ROOH + hv -> CH3CO3 + CH2O + OH", + "from": "jch3ooh" + }, + { + "to": "jxooh", + "__reaction": "XOOH + hv -> OH", + "from": "jch3ooh" + }, + { + "to": "jonitr", + "__reaction": "ONITR + hv -> NO2", + "from": "jch3cho" + }, + { + "to": "jisopooh", + "__reaction": "ISOPOOH + hv -> 0.402*MVK + 0.288*MACR + 0.69*CH2O + HO2", + "from": "jch3ooh" + }, + { + "to": "jmek", + "__reaction": "MEK + hv -> CH3CO3 + C2H5O2", + "from": "jacet" + }, + { + "to": "jbigald", + "__reaction": "BIGALD + hv -> .45*CO + .13*GLYOXAL + .56*HO2 + .13*CH3CO3 + .18*CH3COCHO", + "from": "jno2", + "scale by": 0.2 + }, + { + "to": "jalkooh", + "__reaction": "ALKOOH + hv -> .4*CH3CHO + .1*CH2O + .25*CH3COCH3 + .9*HO2 + .8*MEK + OH", + "from": "jch3ooh" + }, + { + "to": "jmekooh", + "__reaction": "MEKOOH + hv -> OH + CH3CO3 + CH3CHO", + "from": "jch3ooh" + }, + { + "to": "jtolooh", + "__reaction": "TOLOOH + hv -> OH + .45*GLYOXAL + .45*CH3COCHO + .9*BIGALD", + "from": "jch3ooh" + }, + { + "to": "jterpooh", + "__reaction": "TERPOOH + hv -> OH + .1*CH3COCH3 + HO2 + MVK + MACR", + "from": "jch3ooh" + } + ] + } + } +} diff --git a/cime_config/tuvx_MOZART_TS1.json b/cime_config/tuvx_MOZART_TS1.json new file mode 100644 index 0000000000..82b5d0175c --- /dev/null +++ b/cime_config/tuvx_MOZART_TS1.json @@ -0,0 +1,2006 @@ +{ + "__description": "TUV-x configuration for the MOZART-TS1 and MOZART-TSMLT chemical mechanisms", + "O2 absorption" : { + "cross section parameters file": "data/cross_sections/O2_parameters.txt" + }, + "grids": [ + ], + "profiles": [ + ], + "radiative transfer": { + "solver": { + "type": "discrete ordinate", + "number of streams": 4 + }, + "cross sections": [ + { + "name": "air", + "type": "air" + }, + { + "name": "O3", + "netcdf files": [ + { "file path": "data/cross_sections/O3_1.nc" }, + { "file path": "data/cross_sections/O3_2.nc" }, + { "file path": "data/cross_sections/O3_3.nc" }, + { "file path": "data/cross_sections/O3_4.nc" } + ], + "type": "O3" + }, + { + "name": "O2", + "netcdf files": [ + { + "file path": "data/cross_sections/O2_1.nc", + "lower extrapolation": { "type": "boundary" }, + "interpolator": { "type": "fractional target" } + } + ], + "type": "base" + } + ], + "radiators": [ + { + "name": "air", + "type": "base", + "treat as air": true, + "cross section": "air", + "vertical profile": "air", + "vertical profile units": "molecule cm-3" + }, + { + "name": "O2", + "type": "base", + "cross section": "O2", + "vertical profile": "O2", + "vertical profile units": "molecule cm-3" + }, + { + "name": "O3", + "type": "base", + "cross section": "O3", + "vertical profile": "O3", + "vertical profile units": "molecule cm-3" + } + ] + }, + "photolysis": { + "reactions": [ + { + "name": "jo2_a", + "__reaction": "O2 + hv -> O + O1D", + "cross section": { + "apply O2 bands": true, + "netcdf files": [ + { + "file path": "data/cross_sections/O2_1.nc", + "lower extrapolation": { "type": "boundary" }, + "interpolator": { "type": "fractional target" } + } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 0, + "override bands": [ + { + "band": "lyman-alpha", + "value": 0.53 + }, + { + "band": "schumann-runge continuum", + "value": 1.0 + } + ] + }, + "heating" : { + "energy term": 175.05 + } + }, + { + "name": "jo2_b", + "__reaction": "O2 + hv -> O + O", + "cross section": { + "apply O2 bands": true, + "netcdf files": [ + { + "file path": "data/cross_sections/O2_1.nc", + "lower extrapolation": { "type": "boundary" }, + "interpolator": { "type": "fractional target" } + } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0, + "override bands": [ + { + "band": "lyman-alpha", + "value": 0.47 + }, + { + "band": "schumann-runge continuum", + "value": 0.0 + } + ] + }, + "heating" : { + "energy term": 242.37 + } + }, + { + "name": "jo3_a", + "__reaction": "O3 + hv -> O2 + O(1D)", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/O3_1.nc" }, + { "file path": "data/cross_sections/O3_2.nc" }, + { "file path": "data/cross_sections/O3_3.nc" }, + { "file path": "data/cross_sections/O3_4.nc" } + ], + "type": "O3" + }, + "quantum yield": { + "type": "O3+hv->O2+O(1D)" + }, + "heating" : { + "energy term": 310.32 + } + }, + { + "name": "jo3_b", + "__reaction": "O3 + hv -> O2 + O(3P)", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/O3_1.nc" }, + { "file path": "data/cross_sections/O3_2.nc" }, + { "file path": "data/cross_sections/O3_3.nc" }, + { "file path": "data/cross_sections/O3_4.nc" } + ], + "type": "O3" + }, + "quantum yield": { + "type": "O3+hv->O2+O(3P)" + }, + "heating" : { + "energy term": 1179.87 + } + }, + { + "name": "jn2o", + "__reaction": "N2O + hv -> N2 + O(1D)", + "cross section": { + "type": "N2O+hv->N2+O(1D)" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jno2", + "__reaction": "NO2 + hv -> NO + O(3P)", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/NO2_1.nc" } + ], + "type": "NO2 tint" + }, + "quantum yield": { + "netcdf files": ["data/quantum_yields/NO2_1.nc"], + "type": "NO2 tint", + "lower extrapolation": { "type": "boundary" } + } + }, + { + "name": "jn2o5_a", + "__reaction": "N2O5 + hv -> NO2 + NO3", + "cross section": { + "type":"temperature based", + "netcdf file": "data/cross_sections/N2O5_JPL06.nc", + "parameterization": { + "type": "HARWOOD", + "aa": [ -18.27, -18.42, -18.59, -18.72, -18.84, + -18.90, -18.93, -18.87, -18.77, -18.71, + -18.31, -18.14, -18.01, -18.42, -18.59, + -18.13 ], + "bb": [ -91.0, -104.0, -112.0, -135.0, -170.0, + -226.0, -294.0, -388.0, -492.0, -583.0, + -770.0, -885.0, -992.0, -949.0, -966.0, + -1160.0 ], + "base temperature": 0.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "minimum wavelength": 260.0, + "maximum wavelength": 410.0, + "temperature ranges": [ + { + "maximum": 199.999999999999, + "fixed value": 200 + }, + { + "minimum": 200, + "maximum": 295 + }, + { + "minimum": 295.00000000001, + "fixed value": 295.0 + } + ] + }, + "parameterization wavelength grid": { + "name": "custom wavelengths", + "type": "from config file", + "units": "nm", + "values": [ + 255.0, 265.0, 275.0, 285.0, 295.0, 305.0, + 315.0, 325.0, 335.0, 345.0, 355.0, 365.0, + 375.0, 385.0, 395.0, 405.0, 415.0 + ] + } + }, + "quantum yield": { + "type": "Taylor series", + "constant value": 0.0, + "coefficients": [ -2.832441, 0.012809638 ], + "override bands": [ + { + "band": "range", + "minimum wavelength": 300.0, + "value": 1.0 + } + ] + } + }, + { + "name": "jn2o5_b", + "__reaction": "N2O5 + hv -> NO + O + NO3", + "cross section": { + "type":"temperature based", + "netcdf file": "data/cross_sections/N2O5_JPL06.nc", + "parameterization": { + "type": "HARWOOD", + "aa": [ -18.27, -18.42, -18.59, -18.72, -18.84, + -18.90, -18.93, -18.87, -18.77, -18.71, + -18.31, -18.14, -18.01, -18.42, -18.59, + -18.13 ], + "bb": [ -91.0, -104.0, -112.0, -135.0, -170.0, + -226.0, -294.0, -388.0, -492.0, -583.0, + -770.0, -885.0, -992.0, -949.0, -966.0, + -1160.0 ], + "base temperature": 0.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "minimum wavelength": 260.0, + "maximum wavelength": 410.0, + "temperature ranges": [ + { + "maximum": 199.999999999999, + "fixed value": 200 + }, + { + "minimum": 200, + "maximum": 295 + }, + { + "minimum": 295.00000000001, + "fixed value": 295.0 + } + ] + }, + "parameterization wavelength grid": { + "name": "custom wavelengths", + "type": "from config file", + "units": "nm", + "values": [ + 255.0, 265.0, 275.0, 285.0, 295.0, 305.0, + 315.0, 325.0, 335.0, 345.0, 355.0, 365.0, + 375.0, 385.0, 395.0, 405.0, 415.0 + ] + } + }, + "quantum yield": { + "type": "Taylor series", + "constant value": 0.0, + "coefficients": [ 3.832441, -0.012809638 ], + "override bands": [ + { + "band": "range", + "minimum wavelength": 300.0, + "value": 0.0 + } + ] + } + }, + { + "name": "jhno3", + "__reaction": "HNO3 + hv -> OH + NO2", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/HNO3_JPL06.nc" } + ], + "type": "HNO3+hv->OH+NO2" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jno3_a", + "__reaction": "NO3 + hv -> NO2 + O(3P)", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/NO3_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "netcdf files": [ + "data/quantum_yields/NO3-NO2+O(3P)_1.nc" + ], + "type": "tint", + "lower extrapolation": { + "type": "constant", + "value": 1.0 + } + } + }, + { + "name": "jno3_b", + "__reaction": "NO3 + hv -> NO + O2", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/NO3_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "netcdf files": [ + "data/quantum_yields/NO3-NO+O2_1.nc" + ], + "type": "tint" + } + }, + { + "name": "jch3ooh", + "__reaction": "CH3OOH + hv -> CH3O + OH", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CH3OOH_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jch2o_a", + "__reaction": "CH2O + hv -> H + HCO", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CH2O_1.nc" } + ], + "type": "CH2O" + }, + "quantum yield": { + "netcdf files": [ + "data/quantum_yields/CH2O_1.nc" + ], + "type": "base", + "lower extrapolation": { + "type": "boundary" + } + } + }, + { + "name": "jch2o_b", + "__reaction": "CH2O + hv -> H2 + CO", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CH2O_1.nc" } + ], + "type": "CH2O" + }, + "quantum yield": { + "netcdf files": [ + "data/quantum_yields/CH2O_1.nc" + ], + "type": "CH2O", + "lower extrapolation": { + "type": "boundary" + } + } + }, + { + "name": "jh2o2", + "__reaction": "H2O2 + hv -> OH + OH", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/H2O2_1.nc" } + ], + "type": "H2O2+hv->OH+OH" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jch3cho", + "__reaction": "CH3CHO + hv -> CH3 + HCO", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CH3CHO_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "netcdf files": [ + "data/quantum_yields/CH3CHO_1.nc" + ], + "type": "CH3CHO+hv->CH3+HCO" + } + }, + { + "name": "jpan", + "__reaction": "PAN + hv -> 0.6*CH3CO3 + 0.6*NO2 + 0.4*CH3O2 + 0.4*NO3 + 0.4*CO2", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/PAN_1.nc" } + ], + "type": "CH3ONO2+hv->CH3O+NO2" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jmvk", + "__reaction": "MVK + hv -> 0.7*C3H6 + 0.7*CO + 0.3*CH3O2 + 0.3*CH3CO3", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/MVK_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "MVK+hv->Products" + } + }, + { + "name": "jacet", + "__reaction": "CH3COCH3 + hv -> CH3CO + CH3", + "cross section": { + "type": "temperature based", + "parameterization": { + "type": "TAYLOR_SERIES", + "netcdf file": { + "file path": "data/cross_sections/ACETONE_JPL06.nc" + }, + "base temperature": 0.0, + "temperature ranges": [ + { + "maximum": 234.999999999999, + "fixed value": 235.0 + }, + { + "minimum": 235.0, + "maximum": 298.0 + }, + { + "minimum": 298.00000000001, + "fixed value": 298.0 + } + ] + } + }, + "quantum yield": { + "type": "CH3COCH3+hv->CH3CO+CH3", + "branch": "CO+CH3CO", + "low wavelength value": 1, + "minimum temperature": 218, + "maximum temperature": 295 + } + }, + { + "name": "jmgly", + "__reaction": "CH3COCHO + hv -> CH3CO3 + CO + HO2", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CH3COCHO_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "CH3COCHO+hv->CH3CO+HCO" + } + }, + { + "name": "jglyald", + "__reaction": "GLYALD + hv -> 2*HO2 + CO + CH2O", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/HOCH2CHO_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 0.5 + } + }, +{ + "name": "jglyoxal", + "__reaction": "GLYOXAL + hv -> 2*CO + 2*HO2", + "__comments": "TODO the products of this reaction don't exactly match", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CHOCHO_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "netcdf files": [ + "data/quantum_yields/CHOCHO-H2_CO_CO_1.nc" + ], + "type": "base", + "lower extrapolation": { + "type": "boundary" + } + } + }, + { + "name": "jbrcl", + "__reaction": "BrCl + hv -> Br + Cl", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/BrCl_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jbro", + "__reaction": "BrO + hv -> Br + O", + "cross section": { + "netcdf files": [ + { + "file path": "data/cross_sections/BRO_JPL06.nc" + } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jbrono2_a", + "__reaction": "BrONO2 + hv -> Br + NO3", + "cross section": { + "type": "temperature based", + "parameterization": { + "type": "TAYLOR_SERIES", + "netcdf file": { + "file path": "data/cross_sections/BRONO2_JPL06.nc" + }, + "base temperature": 296.0, + "temperature ranges": [ + { + "maximum": 199.999999999999, + "fixed value": 200.0 + }, + { + "minimum": 200.0, + "maximum": 296.0 + }, + { + "minimum": 296.00000000001, + "fixed value": 296.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 0.85 + } + }, + { + "name": "jbrono2_b", + "__reaction": "BrONO2 + hv -> BrO + NO2", + "cross section": { + "type": "temperature based", + "parameterization": { + "type": "TAYLOR_SERIES", + "netcdf file": { + "file path": "data/cross_sections/BRONO2_JPL06.nc" + }, + "base temperature": 296.0, + "temperature ranges": [ + { + "maximum": 199.999999999999, + "fixed value": 200.0 + }, + { + "minimum": 200.0, + "maximum": 296.0 + }, + { + "minimum": 296.00000000001, + "fixed value": 296.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 0.15 + } + }, + { + "name": "jccl4", + "__reaction": "CCl4 + hv -> Products", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CCl4_1.nc" } + ], + "type": "CCl4+hv->Products" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcf2clbr", + "__reaction": "CF2BrCl + hv -> Products", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CF2BrCl_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcf3br", + "__reaction": "CF3Br + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/H1301_JPL06.nc", + "parameterization": { + "AA": [ 62.563, -2.0068, 1.6592e-2, -5.6465e-5, 6.7459e-8 ], + "BB": [ -9.1755e-1, 1.8575e-2, -1.3857e-4, 4.5066e-7, -5.3803e-10 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 178.0, + "maximum wavelength": 280.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210.0, + "maximum": 300.0 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcfcl3", + "__reaction": "CCl3F + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CFCL3_JPL06.nc", + "parameterization": { + "AA": [ -84.611, 7.9551e-1, -2.0550e-3, -4.4812e-6, 1.5838e-8 ], + "BB": [ -5.7912, 1.1689e-1, -8.8069e-4, 2.9335e-6, -3.6421e-9 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 174.1, + "maximum wavelength": 230.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210, + "maximum": 300 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcfc113", + "__reaction": "CFC-113 + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CFC113_JPL06.nc", + "parameterization": { + "AA": [ -1087.9, 20.004, -1.3920e-1, 4.2828e-4, -4.9384e-7 ], + "BB": [ 12.493, -2.3937e-1, 1.7142e-3, -5.4393e-6, 6.4548e-9 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 182.0, + "maximum wavelength": 230.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210, + "maximum": 300 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcfc114", + "__reaction": "CFC-114 + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CFC114_JPL10.nc", + "parameterization": { + "AA": [ -160.50, 2.4807, -1.5202e-2, 3.8412e-5, -3.4373e-8 ], + "BB": [ -1.5296, 3.5248e-2, -2.9951e-4, 1.1129e-6, -1.5259e-9 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 172.0, + "maximum wavelength": 220.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210, + "maximum": 300 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcfc115", + "__reaction": "CFC-115 + hv -> Products", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/CFC115_JPL10.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcf2cl2", + "__reaction": "CCl2F2 + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CF2CL2_JPL06.nc", + "parameterization": { + "AA": [ -43.8954569, -2.403597e-1, -4.2619e-4, 9.8743e-6, 0.0 ], + "BB": [ 4.8438e-3, 4.96145e-4, -5.6953e-6, 0.0, 0.0 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 200.0, + "maximum wavelength": 231.0, + "base temperature": 296.0, + "base wavelength": 200.0, + "logarithm": "natural", + "temperature ranges": [ + { + "maximum": 219.999999999999, + "fixed value": 220.0 + }, + { + "minimum": 220, + "maximum": 296 + }, + { + "minimum": 296.00000000001, + "fixed value": 296.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jch2br2", + "__reaction": "CH2BR2 + hv -> 2*BR", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CH2BR2_1.nc", + "parameterization": { + "AA": [ -70.211776, 1.940326e-1, 2.726152e-3, -1.695472e-5, 2.500066e-8 ], + "BB": [ 2.899280, -4.327724e-2, 2.391599e-4, -5.807506e-7, 5.244883e-10 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 210.0, + "maximum wavelength": 290.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210, + "maximum": 300 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jch3br", + "__reaction": "CH3Br + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CH3BR_JPL06.nc", + "parameterization": { + "AA": [ 46.520, -1.4580, 1.1469e-2, -3.7627e-5, 4.3264e-8 ], + "BB": [ 9.3408e-1, -1.6887e-2, 1.1487e-4, -3.4881e-7, 3.9945e-10 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 200.0, + "maximum wavelength": 280.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210, + "maximum": 300 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jch3ccl3", + "__reaction": "CH3CCl3+hv->Products", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CH3CCl3_1.nc" } + ], + "type": "tint" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jch3cl", + "__reaction": "CH3Cl + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CH3CL_JPL06.nc", + "parameterization": { + "AA": [ -299.80, 5.1047, -3.3630e-2, 9.5805e-5, -1.0135e-7 ], + "BB": [ -7.1727, 1.4837e-1, -1.1463e-3, 3.9188e-6, -4.9994e-9 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 174.1, + "maximum wavelength": 216.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210, + "maximum": 300 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jchbr3", + "__reaction": "CHBr3 + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CHBR3_JPL10.nc", + "parameterization": { + "AA": [ -32.6067, 0.10308, 6.39e-5, -7.7392e-7, -2.2513e-9, 6.1376e-12 ], + "BB": [ 0.1582, -0.0014758, 3.8058e-6, 9.187e-10, -1.0772e-11, 0.0 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0, 5.0 ], + "minimum wavelength": 260.0, + "maximum wavelength": 362.0, + "base temperature": 296.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "invert temperature offset": true, + "temperature ranges": [ + { + "maximum": 259.999999999999, + "fixed value": 260.0 + }, + { + "minimum": 260.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcl2", + "__reaction": "Cl2 + hv -> Cl + Cl", + "cross section": { + "type": "Cl2+hv->Cl+Cl" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcl2o2", + "__reaction": "ClOOCl + hv -> Cl + ClOO", + "__comments": "TODO - this doesn't exactly match the products in TS1", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CL2O2_JPL10.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jclo", + "__reaction": "ClO + hv -> Cl + O", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CLO_JPL06.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jclono2_a", + "__reaction": "ClONO2 + hv -> Cl + NO3", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/ClONO2_1.nc" } + ], + "type": "ClONO2" + }, + "quantum yield": { + "type": "ClONO2+hv->Cl+NO3" + } + }, + { + "name": "jclono2_b", + "__reaction": "ClONO2 + hv -> ClO + NO2", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/ClONO2_1.nc" } + ], + "type": "ClONO2" + }, + "quantum yield": { + "type": "ClONO2+hv->ClO+NO2" + } + }, + { + "name": "jcof2", + "__reaction": "CF2O + hv -> Products", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CF2O_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcofcl", + "__reaction": "CClFO + hv -> Products", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CClFO_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jh2402", + "__reaction": "H2402 + hv -> 2*BR + 2*COF2", + "__comments": "TUV data set name CF2BrCF2Br", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/H2402_JPL06.nc", + "parameterization": { + "AA": [ 34.026, -1.152616, 8.959798e-3, -2.9089e-5, 3.307212e-8 ], + "BB": [ 4.010664e-1, -8.358968e-3, 6.415741e-5, -2.157554e-7, 2.691871e-10 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 190.0, + "maximum wavelength": 290.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210.0, + "maximum": 300.0 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhcfc141b", + "__reaction": "HCFC-141b + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/HCFC141b_JPL10.nc", + "parameterization": { + "AA": [ -682.913042, 12.122290, -8.187699e-2, 2.437244e-4, -2.719103e-7 ], + "BB": [ 4.074747, -8.053899e-2, 5.946552e-4, -1.945048e-6, 2.380143e-9 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 172.0, + "maximum wavelength": 240.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210.0, + "maximum": 300.0 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhcfc142b", + "__reaction": "HCFC-142b + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/HCFC142b_JPL10.nc", + "parameterization": { + "AA": [ -328.092008, 6.342799, -4.810362e-2, 1.611991e-4, -2.042613e-7 ], + "BB": [ 4.289533e-1, -9.042817e-3, 7.018009e-5, -2.389064e-7, 3.039799e-10 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 172.0, + "maximum wavelength": 230.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210.0, + "maximum": 300.0 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhcfc22", + "__reaction": "HCFC-22 + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/HCFC22_JPL06.nc", + "parameterization wavelength grid": { + "name": "custom wavelengths", + "type": "from config file", + "units": "nm", + "values": [ + 169.0, 171.0, 173.0, 175.0, 177.0, 179.0, 181.0, 183.0, 185.0, + 187.0, 189.0, 191.0, 193.0, 195.0, 197.0, 199.0, 201.0, 203.0, + 205.0, 207.0, 209.0, 211.0, 213.0, 215.0, 217.0, 219.0, 221.0 + ] + }, + "parameterization": { + "AA": [ -106.029, 1.5038, -8.2476e-3, 1.4206e-5 ], + "BB": [ -1.3399e-1, 2.7405e-3, -1.8028e-5, 3.8504e-8 ], + "lp": [ 0.0, 1.0, 2.0, 3.0 ], + "minimum wavelength": 174.0, + "maximum wavelength": 204.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210.0, + "maximum": 300.0 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhcl", + "__reaction": "HCl + hv -> H + Cl", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/HCl_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhobr", + "__reaction": "HOBr + hv -> OH + Br", + "cross section": { + "type": "HOBr+hv->OH+Br" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhocl", + "__reaction": "HOCl + hv -> HO + Cl", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/HOCl_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "joclo", + "__reaction": "OClO + hv -> Products", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/OClO_1.nc" }, + { "file path": "data/cross_sections/OClO_2.nc" }, + { "file path": "data/cross_sections/OClO_3.nc" } + ], + "type": "OClO+hv->Products" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jho2no2_a", + "__reaction": "HNO4 + hv -> OH + NO3", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/HO2NO2_JPL06.nc", + "parameterization": { + "type": "BURKHOLDER", + "netcdf file": { + "file path": "data/cross_sections/HO2NO2_temp_JPL06.nc" + }, + "A": -988.0, + "B": 0.69, + "temperature ranges": [ + { + "maximum": 279.999999999999, + "fixed value": 280.0 + }, + { + "minimum": 280.0, + "maximum": 350.0 + }, + { + "minimum": 350.00000000001, + "fixed value": 350.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 0.30, + "override bands": [ + { + "band": "range", + "minimum wavelength": 200.0, + "value": 0.20 + } + ] + } + }, + { + "name": "jho2no2_b", + "__reaction": "HNO4 + hv -> HO2 + NO2", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/HO2NO2_JPL06.nc", + "parameterization": { + "type": "BURKHOLDER", + "netcdf file": { + "file path": "data/cross_sections/HO2NO2_temp_JPL06.nc" + }, + "A": -988.0, + "B": 0.69, + "temperature ranges": [ + { + "maximum": 279.999999999999, + "fixed value": 280.0 + }, + { + "minimum": 280.0, + "maximum": 350.0 + }, + { + "minimum": 350.00000000001, + "fixed value": 350.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 0.70, + "override bands": [ + { + "band": "range", + "minimum wavelength": 200.0, + "value": 0.80 + } + ] + } + }, + { + "name": "jmacr_a", + "__reaction": "CH2=C(CH3)CHO->1.34HO2+0.66MCO3+1.34CH2O+CH3CO3", + "__comments": "Methacrolein photolysis channel 1", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/Methacrolein_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 0.005 + } + }, + { + "name": "jmacr_b", + "__reaction": "CH2=C(CH3)CHO->0.66OH+1.34CO", + "__comments": "Methacrolein photolysis channel 2", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/Methacrolein_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 0.005 + } + }, + { + "name": "jhyac", + "__reaction": "CH2(OH)COCH3->CH3CO3+HO2+CH2O", + "__comments": "hydroxy acetone TODO: the products of this reaction differ from standalone TUV-x", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/Hydroxyacetone_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 0.65 + } + }, + { + "name": "jh2o_a", + "__reaction": "H2O + hv -> OH + H", + "cross section": { + "type": "base", + "merge data": true, + "netcdf files": [ + { + "file path": "data/cross_sections/H2O_1.nc", + "zero above": 183.0 + }, + { + "file path": "data/cross_sections/H2O_2.nc", + "zero below": 183.00000000001, + "zero above": 190.0 + }, + { + "file path": "data/cross_sections/H2O_3.nc", + "zero below": 190.00000000001 + } + ] + }, + "quantum yield" : { + "type": "base", + "netcdf files": [ "data/quantum_yields/H2O_H_OH.nc" ] + } + }, + { + "name": "jh2o_b", + "__reaction": "H2O + hv -> H2 + O1D", + "cross section": { + "type": "base", + "merge data": true, + "netcdf files": [ + { + "file path": "data/cross_sections/H2O_1.nc", + "zero above": 183.0 + }, + { + "file path": "data/cross_sections/H2O_2.nc", + "zero below": 183.00000000001, + "zero above": 190.0 + }, + { + "file path": "data/cross_sections/H2O_3.nc", + "zero below": 190.00000000001 + } + ] + }, + "quantum yield" : { + "type": "base", + "netcdf files": [ "data/quantum_yields/H2O_H2_O1D.nc" ] + } + }, + { + "name": "jh2o_c", + "__reaction": "H2O + hv -> 2*H + O", + "cross section": { + "type": "base", + "merge data": true, + "netcdf files": [ + { + "file path": "data/cross_sections/H2O_1.nc", + "zero above": 183.0 + }, + { + "file path": "data/cross_sections/H2O_2.nc", + "zero below": 183.00000000001, + "zero above": 190.0 + }, + { + "file path": "data/cross_sections/H2O_3.nc", + "zero below": 190.00000000001 + } + ] + }, + "quantum yield" : { + "type": "base", + "netcdf files": [ "data/quantum_yields/H2O_2H_O3P.nc" ] + } + }, + { + "name": "jch4_a", + "__reaction": "CH4 + hv -> H + CH3O2", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/CH4_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 0.45 + } + }, + { + "name": "jch4_b", + "__reaction": "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", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/CH4_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 0.55 + } + }, + { + "name": "jco2", + "__reaction": "CO2 + hv -> CO + O", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/CO2_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhbr", + "__reaction": "HBR + hv -> BR + H", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/HBr_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhf", + "__reaction": "HF + hv -> H + F", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/HF_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jsf6", + "__reaction": "SF6 + hv -> sink", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/SF6_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jh2so4", + "__reaction": "H2SO4 + hv -> SO3 + H2O", + "cross section": { + "type": "base", + "data": { + "default value": 0.0, + "point values": [ + { "wavelength": 121.65, "value": 6.3e-17 }, + { "wavelength": 525.0, "value": 1.43e-26 }, + { "wavelength": 625.0, "value": 1.8564e-25 }, + { "wavelength": 725.0, "value": 3.086999e-24 } + ] + } + }, + "quantum yield": { + "type": "H2SO4 Mills", + "netcdf files": [ + "data/quantum_yields/H2SO4_mills.nc" + ], + "parameterized wavelengths": [ + 525, + 625, + 725 + ], + "collision interval s": [ + 1.1e-9, + 8.9e-9, + 1.7e-7 + ], + "molecular diameter m": 4.18e-10, + "molecular weight kg mol-1": 98.078479e-3 + } + }, + { + "name": "jocs", + "__reaction": "OCS + hv -> S + CO", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/OCS_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jso", + "__reaction": "SO + hv -> S + O", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/SO_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jso2", + "__reaction": "SO2 + hv -> SO + O", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/SO2_Mills.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jso3", + "__reaction": "SO3 + hv -> SO2 + O", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/SO3_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jno_i", + "__reaction": "NO + hv -> NOp + e", + "cross section": { + "type": "base", + "data": { + "default value": 0.0, + "point values": [ + { "wavelength": 121.65, "value": 2.0e-18 } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + } + ] + }, + "__CAM options": { + "disable clouds": true, + "disable aerosols": true, + "aliasing": { + "default matching": "backup", + "pairs": [ + { + "to": "jalknit", + "__reaction": "ALKNIT + hv -> NO2 + 0.4*CH3CHO + 0.1*CH2O + 0.25*CH3COCH3 + HO2 + 0.8*MEK", + "from": "jch3ooh" + }, + { + "to": "jpooh", + "__reaction": "POOH (C3H6OHOOH) + hv -> CH3CHO + CH2O + HO2 + OH", + "from": "jch3ooh" + }, + { + "to": "jch3co3h", + "__reaction": "CH3COOOH + hv -> CH3O2 + OH + CO2", + "from": "jh2o2", + "scale by": 0.28 + }, + { + "to": "jmpan", + "__reaction": "MPAN + hv -> MCO3 + NO2", + "from": "jpan" + }, + { + "to": "jc2h5ooh", + "__reaction": "C2H5OOH + hv -> CH3CHO + HO2 + OH", + "from": "jch3ooh" + }, + { + "to": "jc3h7ooh", + "__reaction": "C3H7OOH + hv -> 0.82*CH3COCH3 + OH + HO2", + "from": "jch3ooh" + }, + { + "to": "jc6h5ooh", + "__reaction": "C6H5OOH + hv -> PHENO + OH", + "from": "jch3ooh" + }, + { + "to": "jeooh", + "__reaction": "EOOH + hv -> EO + OH", + "from": "jch3ooh" + }, + { + "to": "jrooh", + "__reaction": "ROOH + hv -> CH3CO3 + CH2O + OH", + "from": "jch3ooh" + }, + { + "to": "jxooh", + "__reaction": "XOOH + hv -> OH", + "from": "jch3ooh" + }, + { + "to": "jonitr", + "__reaction": "ONITR + hv -> NO2", + "from": "jch3cho" + }, + { + "to": "jisopooh", + "__reaction": "ISOPOOH + hv -> 0.402*MVK + 0.288*MACR + 0.69*CH2O + HO2", + "from": "jch3ooh" + }, + { + "to": "jmek", + "__reaction": "MEK + hv -> CH3CO3 + C2H5O2", + "from": "jacet" + }, + { + "to": "jalkooh", + "__reaction": "ALKOOH + hv -> .4*CH3CHO + .1*CH2O + .25*CH3COCH3 + .9*HO2 + .8*MEK + OH", + "from": "jch3ooh" + }, + { + "to": "jbenzooh", + "__reaction": "BENZOOH + hv -> OH + GLYOXAL + 0.5*BIGALD1 + HO2", + "from": "jch3ooh" + }, + { + "to": "jbepomuc", + "__reaction": "BEPOMUC + hv -> BIGALD1 + 1.5*HO2 + 1.5*CO", + "from": "jno2", + "scale by": 0.1 + }, + { + "to": "jbigald", + "__reaction": "BIGALD + hv -> 0.45*CO + 0.13*GLYOXAL + 0.56*HO2 + 0.13*CH3CO3 + 0.18*CH3COCHO", + "from": "jno2", + "scale by": 0.2 + }, + { + "to": "jbigald1", + "__reaction": "BIGALD1 + hv -> 0.6*MALO2 + HO2", + "from": "jno2", + "scale by": 0.14 + }, + { + "to": "jbigald2", + "__reaction": "BIGALD2 + hv -> 0.6*HO2 + 0.6*DICARBO2", + "from": "jno2", + "scale by": 0.2 + }, + { + "to": "jbigald3", + "__reaction": "BIGALD3 + hv -> 0.6*HO2 + 0.6*CO + 0.6*MDIALO2", + "from": "jno2", + "scale by": 0.2 + }, + { + "to": "jbigald4", + "__reaction": "BIGALD4 + hv -> HO2 + CO + CH3COCHO + CH3CO3", + "from": "jno2", + "scale by": 0.006 + }, + { + "to": "jbzooh", + "__reaction": "BZOOH + hv -> BZALD + OH + HO2", + "from": "jch3ooh" + }, + { + "to": "jmekooh", + "__reaction": "MEKOOH + hv -> OH + CH3CO3 + CH3CHO", + "from": "jch3ooh" + }, + { + "to": "jtolooh", + "__reaction": "TOLOOH + hv -> OH + .45*GLYOXAL + .45*CH3COCHO + .9*BIGALD", + "from": "jch3ooh" + }, + { + "to": "jterpooh", + "__reaction": "TERPOOH + hv -> OH + .1*CH3COCH3 + HO2 + MVK + MACR", + "from": "jch3ooh" + }, + { + "to": "jhonitr", + "__reaction": "HONITR + hv -> NO2 + 0.67*HO2 + 0.33*CH3CHO + 0.33*CH2O + 0.33*CO + 0.33*GLYALD + 0.33*CH3CO3 + 0.17*HYAC + 0.17*CH3COCH3", + "from": "jch2o_a" + }, + { + "to": "jhpald", + "__reaction": "HPALD + hv -> BIGALD3 + OH + HO2", + "from": "jno2", + "scale by": 0.006 + }, + { + "to": "jisopnooh", + "__reaction": "ISOPNOOH + hv -> NO2 + HO2 + ISOPOOH", + "from": "jch3ooh" + }, + { + "to": "jnc4cho", + "__reaction": "NC4CHO + hv -> BIGALD3 + NO2 + HO2", + "from": "jch2o_a" + }, + { + "to": "jnoa", + "__reaction": "NOA + hv -> NO2 + CH2O + CH3CO3", + "from": "jch2o_a" + }, + { + "to": "jnterpooh", + "__reaction": "NTERPOOH + hv -> TERPROD1 + NO2 + OH", + "from": "jch3ooh" + }, + { + "to": "jphenooh", + "__reaction": "PHENOOH + hv -> OH + HO2 + 0.7*GLYOXAL", + "from": "jch3ooh" + }, + { + "to": "jtepomuc", + "__reaction": "TEPOMUC + hv -> 0.5*CH3CO3 + HO2 + 1.5*CO", + "from": "jno2", + "scale by": 0.1 + }, + { + "to": "jterp2ooh", + "__reaction": "TERP2OOH + hv -> OH + 0.375*CH2O + 0.3*CH3COCH3 + 0.25*CO + CO2 + TERPROD2 + HO2 + 0.25*GLYALD", + "from": "jch3ooh" + }, + { + "to": "jterpnit", + "__reaction": "TERPNIT + hv -> TERPROD1 + NO2 + HO2", + "from": "jch3ooh" + }, + { + "to": "jterprd1", + "__reaction": "TERPROD1 + hv -> HO2 + CO + TERPROD2", + "from": "jch3cho" + }, + { + "to": "jterprd2", + "__reaction": "TERPROD2 + hv -> 0.15*RO2 + 0.68*CH2O + 0.8*CO2 + 0.5*CH3COCH3 + 0.65*CH3CO3 + 1.2*HO2 + 1.7*CO", + "from": "jch3cho" + }, + { + "to": "jxylenooh", + "__reaction": "XYLENOOH + hv -> OH + HO2 + 0.34*GLYOXAL + 0.54*CH3COCHO + 0.06*BIGALD1 + 0.2*BIGALD2 + 0.15*BIGALD3 + 0.21*BIGALD4", + "from": "jch3ooh" + }, + { + "to": "jxylolooh", + "__reaction": "XYLOLOOH + hv -> OH + 0.17*GLYOXAL + 0.51*CH3COCHO + HO2", + "from": "jch3ooh" + }, + { + "to": "jsoa1_a1", + "__reaction": "soa1_a1 + hv -> Products", + "from": "jno2", + "scale by": 0.0004 + }, + { + "to": "jsoa1_a2", + "__reaction": "soa1_a2 + hv -> Products", + "from": "jno2", + "scale by": 0.0004 + }, + { + "to": "jsoa2_a1", + "__reaction": "soa2_a1 + hv -> Products", + "from": "jno2", + "scale by": 0.0004 + }, + { + "to": "jsoa2_a2", + "__reaction": "soa2_a2 + hv -> Products", + "from": "jno2", + "scale by": 0.0004 + }, + { + "to": "jsoa3_a1", + "__reaction": "soa3_a1 + hv -> Products", + "from": "jno2", + "scale by": 0.0004 + }, + { + "to": "jsoa3_a2", + "__reaction": "soa3_a2 + hv -> Products", + "from": "jno2", + "scale by": 0.0004 + }, + { + "to": "jsoa4_a1", + "__reaction": "soa4_a1 + hv -> Products", + "from": "jno2", + "scale by": 0.0004 + }, + { + "to": "jsoa4_a2", + "__reaction": "soa4_a2 + hv -> Products", + "from": "jno2", + "scale by": 0.0004 + }, + { + "to": "jsoa5_a1", + "__reaction": "soa5_a1 + hv -> Products", + "from": "jno2", + "scale by": 0.0004 + }, + { + "to": "jsoa5_a2", + "__reaction": "soa5_a2 + hv -> Products", + "from": "jno2", + "scale by": 0.0004 + } + ] + } + } +} diff --git a/libraries/tuv-x b/libraries/tuv-x new file mode 160000 index 0000000000..ecf768a2b6 --- /dev/null +++ b/libraries/tuv-x @@ -0,0 +1 @@ +Subproject commit ecf768a2b66bcd3411e1fcf7baa3119e7446c97c diff --git a/src/chemistry/mozart/chemistry.F90 b/src/chemistry/mozart/chemistry.F90 index bc706c647e..95d5538b95 100644 --- a/src/chemistry/mozart/chemistry.F90 +++ b/src/chemistry/mozart/chemistry.F90 @@ -164,6 +164,7 @@ subroutine chem_register use short_lived_species, only : slvd_index, short_lived_map=>map, register_short_lived_species use cfc11star, only : register_cfc11star use mo_photo, only : photo_register + use mo_tuvx, only : tuvx_register, tuvx_active use mo_aurora, only : aurora_register use aero_model, only : aero_model_register use physics_buffer, only : pbuf_add_field, dtype_r8 @@ -320,9 +321,14 @@ subroutine chem_register call register_cfc11star() if ( waccmx_is('ionosphere') ) then - call photo_register() + if( .not. tuvx_active ) then + call photo_register( ) + end if call aurora_register() endif + if (tuvx_active) then + call tuvx_register( ) + endif ! add fields to pbuf needed by aerosol models call aero_model_register() @@ -348,6 +354,7 @@ subroutine chem_readnl(nlfile) use mo_sulf, only: sulf_readnl use species_sums_diags,only: species_sums_readnl use ocean_emis, only: ocean_emis_readnl + use mo_tuvx, only: tuvx_readnl ! args @@ -560,6 +567,7 @@ subroutine chem_readnl(nlfile) call sulf_readnl(nlfile) call species_sums_readnl(nlfile) call ocean_emis_readnl(nlfile) + call tuvx_readnl(nlfile) end subroutine chem_readnl @@ -1040,6 +1048,7 @@ subroutine chem_timestep_init(phys_state,pbuf2d) use mo_aurora, only : aurora_timestep_init use mo_photo, only : photo_timestep_init + use mo_tuvx, only : tuvx_active, tuvx_timestep_init use cfc11star, only : update_cfc11star use physics_buffer, only : physics_buffer_desc @@ -1111,6 +1120,11 @@ subroutine chem_timestep_init(phys_state,pbuf2d) !----------------------------------------------------------------------------- call photo_timestep_init( calday ) + !----------------------------------------------------------------------------- + ! ... setup the TUV-x profiles for this timestep + !----------------------------------------------------------------------------- + if( tuvx_active ) call tuvx_timestep_init( ) + call update_cfc11star( pbuf2d, phys_state ) ! Galatic Cosmic Rays ... @@ -1345,11 +1359,15 @@ subroutine chem_final() use mee_ionization, only: mee_ion_final use rate_diags, only: rate_diags_final use species_sums_diags, only: species_sums_final + use mo_tuvx, only: tuvx_finalize, tuvx_active use short_lived_species, only: short_lived_species_final call mee_ion_final() call rate_diags_final() call species_sums_final() + if (tuvx_active) then + call tuvx_finalize() + end if call short_lived_species_final() end subroutine chem_final diff --git a/src/chemistry/mozart/mo_chemini.F90 b/src/chemistry/mozart/mo_chemini.F90 index 0f4005be96..a13de223b9 100644 --- a/src/chemistry/mozart/mo_chemini.F90 +++ b/src/chemistry/mozart/mo_chemini.F90 @@ -48,6 +48,7 @@ subroutine chemini & use mo_srf_emissions, only : srf_emissions_inti use mo_sulf, only : sulf_inti use mo_photo, only : photo_inti + use mo_tuvx, only : tuvx_init, tuvx_active use mo_drydep, only : drydep_inti use mo_imp_sol, only : imp_slv_inti use mo_exp_sol, only : exp_sol_inti @@ -196,11 +197,17 @@ subroutine chemini & call euvac_init (euvac_file) call photo_inti( xs_coef_file, xs_short_file, xs_long_file, rsf_file, & - photon_file, electron_file, & - exo_coldens_file, photo_max_zen ) - + photon_file, electron_file, exo_coldens_file, photo_max_zen ) if (masterproc) write(iulog,*) 'chemini: after photo_inti on node ',iam + !----------------------------------------------------------------------- + ! ... initialize the TUV-x photolysis rate constant calculator + !----------------------------------------------------------------------- + if( tuvx_active ) then + call tuvx_init( photon_file, electron_file, photo_max_zen, pbuf2d ) + if (masterproc) write(iulog,*) 'chemini: after tuvx_init on node ',iam + end if + !----------------------------------------------------------------------- ! ... initialize ion production !----------------------------------------------------------------------- diff --git a/src/chemistry/mozart/mo_gas_phase_chemdr.F90 b/src/chemistry/mozart/mo_gas_phase_chemdr.F90 index cbda47aa8d..0a16bda18f 100644 --- a/src/chemistry/mozart/mo_gas_phase_chemdr.F90 +++ b/src/chemistry/mozart/mo_gas_phase_chemdr.F90 @@ -279,6 +279,7 @@ subroutine gas_phase_chemdr(state, lchnk, ncol, imozart, q, & use chem_mods, only : nabscol, nfs, indexm, clscnt4 use physconst, only : rga, gravit use mo_photo, only : set_ub_col, setcol, table_photo + use mo_tuvx, only : tuvx_get_photo_rates, tuvx_active use mo_exp_sol, only : exp_sol use mo_imp_sol, only : imp_sol use mo_setrxt, only : setrxt @@ -827,12 +828,22 @@ subroutine gas_phase_chemdr(state, lchnk, ncol, imozart, q, & call shr_orb_decl( calday, eccen, mvelpp, lambm0, obliqr , & delta, esfact ) - !----------------------------------------------------------------- - ! ... lookup the photolysis rates from table - !----------------------------------------------------------------- - call table_photo( reaction_rates, pmid, pdel, tfld, zmid, zint, & - col_dens, zen_angle, asdir, cwat, cldfr, & - esfact, vmr, invariants, ncol, lchnk, pbuf ) + if (tuvx_active) then + !----------------------------------------------------------------- + ! ... get calculated photolysis rates from TUV-x + !----------------------------------------------------------------- + call tuvx_get_photo_rates( pbuf, ncol, lchnk, zmid, zint, & + tfld, ts, invariants, vmr, col_delta, & + asdir, zen_angle, esfact, pdel, cldfr,& + cwat, reaction_rates(:,:,1:phtcnt) ) + else + !----------------------------------------------------------------- + ! ... lookup the photolysis rates from table + !----------------------------------------------------------------- + call table_photo( reaction_rates, pmid, pdel, tfld, zmid, zint, & + col_dens, zen_angle, asdir, cwat, cldfr, & + esfact, vmr, invariants, ncol, lchnk, pbuf ) + endif do i = 1,phtcnt call outfld( tag_names(i), reaction_rates(:ncol,:,rxt_tag_map(i)), ncol, lchnk ) diff --git a/src/chemistry/mozart/mo_jeuv.F90 b/src/chemistry/mozart/mo_jeuv.F90 index c13255250e..9ad12d4187 100644 --- a/src/chemistry/mozart/mo_jeuv.F90 +++ b/src/chemistry/mozart/mo_jeuv.F90 @@ -40,6 +40,7 @@ module mo_jeuv real(r8), pointer :: solar_etf(:) logical :: do_heating(13) + logical :: is_initialized = .false. contains @@ -97,6 +98,11 @@ subroutine jeuv_init (photon_file, electron_file, indexer) endif enddo + ! If the module has already been initialized, return after + ! computing index map + if( is_initialized ) return + is_initialized = .true. + if (.not.do_jeuv) return if (solar_euv_data_active) then diff --git a/src/chemistry/mozart/mo_jshort.F90 b/src/chemistry/mozart/mo_jshort.F90 index 97ec5f1375..6d16867e80 100644 --- a/src/chemistry/mozart/mo_jshort.F90 +++ b/src/chemistry/mozart/mo_jshort.F90 @@ -27,6 +27,7 @@ module mo_jshort public :: jshort public :: sphers public :: slant_col + public :: calc_jno public :: nj save diff --git a/src/chemistry/mozart/mo_setz.F90 b/src/chemistry/mozart/mo_setz.F90 deleted file mode 100644 index e750338ca2..0000000000 --- a/src/chemistry/mozart/mo_setz.F90 +++ /dev/null @@ -1,160 +0,0 @@ - - module mo_setz - - use shr_kind_mod, only : r8 => shr_kind_r8 - use cam_abortutils, only : endrun - use cam_logfile, only : iulog - - private - public :: setz - - contains - - subroutine setz( cz, tlev, c, zen, adjcoe, pht_tag ) -!----------------------------------------------------------------------------- -! adjcoe - adjust cross section coefficients -!----------------------------------------------------------------------------- - - use mo_params, only : kj - use mo_calcoe, only : calcoe - use ppgrid, only : pverp - use chem_mods, only : phtcnt - use mo_tuv_inti, only : nlng, ncof - - implicit none - -!----------------------------------------------------------------------------- -! ... dummy arguments -!----------------------------------------------------------------------------- - real(r8), intent(in) :: zen ! zenith angle (degrees) - real(r8), intent(in) :: cz(pverp) - real(r8), intent(in) :: tlev(pverp) - real(r8), intent(in) :: c(:,:,:) - real(r8), intent(out) :: adjcoe(:,:) - character(len=32), intent(in) :: pht_tag(:) - -!----------------------------------------------------------------------------- -! ... local variables -!----------------------------------------------------------------------------- - integer, parameter :: nzen = 4 - real(r8), parameter :: zen_angles(nzen) = (/ 20.5_r8, 40.5_r8, 60.5_r8, 80._r8 /) - - integer :: astat - integer :: ndx - integer :: m - real(r8) :: tt - real(r8) :: adj_fac - real(r8) :: interp_factor - real(r8) :: c0, c1, c2 - real(r8) :: xz(pverp) - real(r8), allocatable :: wrk(:,:) - character(len=32) :: jname - -!----------------------------------------------------------------------------- -! 1 o2 + hv -> o + o -! 2 o3 -> o2 + o(1d) -! 3 o3 -> o2 + o(3p) -! 4 no2 -> no + o(3p) -! 5 no3 -> no + o2 -! 6 no3 -> no2 + o(3p) -! 7 n2o5 -> no3 + no + o(3p) -! 8 n2o5 -> no3 + no2 -! 9 n2o + hv -> n2 + o(1d) -! 10 ho2 + hv -> oh + o -! 11 h2o2 -> 2 oh -! 12 hno2 -> oh + no -! 13 hno3 -> oh + no2 -! 14 hno4 -> ho2 + no2 -! 15 ch2o -> h + hco -! 16 ch2o -> h2 + co -! 17 ch3cho -> ch3 + hco -! 18 ch3cho -> ch4 + co -! 19 ch3cho -> ch3co + h -! 20 c2h5cho -> c2h5 + hco -! 21 chocho -> products -! 22 ch3cocho -> products -! 23 ch3coch3 -! 24 ch3ooh -> ch3o + oh -! 25 ch3ono2 -> ch3o+no2 -! 26 pan + hv -> products -!----------------------------------------------------------------------------- - - xz(1:pverp) = cz(1:pverp)*1.e-18_r8 - do m = 1,nlng - adjcoe(1:pverp,m) = 1._r8 - end do - if( zen < zen_angles(1) ) then - ndx = 1 - interp_factor = 0._r8 - else if( zen >= zen_angles(nzen) ) then - ndx = nzen - interp_factor = 0._r8 - else - do ndx = 1,nzen-1 - if( zen >= zen_angles(ndx) .and. zen < zen_angles(ndx+1) ) then -!!$ interp_factor = (zen - zen_angles(ndx-1))/(zen_angles(ndx) - zen_angles(ndx-1)) - interp_factor = (zen - zen_angles(ndx))/(zen_angles(ndx+1) - zen_angles(ndx)) - exit - end if - end do - end if - - allocate( wrk(pverp,2), stat=astat ) - if( astat /= 0 ) then - write(iulog,*) 'setz: failed to all wrk; error = ',astat - call endrun - end if - - tt = tlev(1)/281._r8 -rate_loop : & - do m = 1,nlng - jname = trim(pht_tag(m)) - if( jname /= 'jo1d' .and. jname /= 'j2oh' .and. jname /= 'jh2o2' ) then - adj_fac = 1._r8 - else if( (jname == 'jo1d') .or. (jname == 'j2oh') ) then -!---------------------------------------------------------------------- -! ... temperature modification -! t0.9 (1.05) t0.95(1.025) t1.0(1.0) t1.15(1.02) t1.1(1.04) -!---------------------------------------------------------------------- - select case( ndx ) - case( 1 ) - c0 = 4.52372_r8 ; c1 = -5.94317_r8 ; c2 = 2.63156_r8 - case( 2 ) - c0 = 4.99378_r8 ; c1 = -7.92752_r8 ; c2 = 3.94715_r8 - case( 3 ) - c0 = .969867_r8 ; c1 = -.841035_r8 ; c2 = .878835_r8 - case( 4 ) - c0 = 1.07801_r8 ; c1 = -2.39580_r8 ; c2 = 2.32632_r8 - end select - adj_fac = c0 + tt*(c1 + c2*tt) - else if( jname == 'jh2o2' ) then -!---------------------------------------------------------------------- -! ... temperature modification -! t0.9 (1.05) t0.95(1.025) t1.0(1.0) t1.15(1.02) t1.1(1.04) -!---------------------------------------------------------------------- - select case( ndx ) - case( 1 ) - c0 = 2.43360_r8 ; c1 = -3.61363_r8 ; c2 = 2.19018_r8 - case( 2 ) - c0 = 3.98265_r8 ; c1 = -6.90516_r8 ; c2 = 3.93602_r8 - case( 3 ) - c0 = 3.49843_r8 ; c1 = -5.98839_r8 ; c2 = 3.50262_r8 - case( 4 ) - c0 = 3.06312_r8 ; c1 = -5.26281_r8 ; c2 = 3.20980_r8 - end select - adj_fac = c0 + tt*(c1 + c2*tt) - end if - call calcoe( c(:,m,ndx), xz, tt, adj_fac, wrk(:,1) ) - if( interp_factor /= 0._r8 ) then - call calcoe( c(:,m,ndx+1), xz, tt, adj_fac, wrk(:,2) ) - adjcoe(:,m) = wrk(:,1) + interp_factor * (wrk(:,2) - wrk(:,1)) - else - adjcoe(:,m) = wrk(:,1) - end if - end do rate_loop - - deallocate( wrk ) - - end subroutine setz - - end module mo_setz diff --git a/src/chemistry/mozart/mo_tuv_inti.F90 b/src/chemistry/mozart/mo_tuv_inti.F90 deleted file mode 100644 index e6ccde0ecc..0000000000 --- a/src/chemistry/mozart/mo_tuv_inti.F90 +++ /dev/null @@ -1,341 +0,0 @@ - -module mo_tuv_inti - - use shr_kind_mod, only : r8 => shr_kind_r8 - - implicit none - - private - public :: nj - public :: nlng, nzen, ncof - public :: tuv_inti - - save - - integer :: nj - integer :: nlng - integer :: nzen, ncof - -contains - - subroutine tuv_inti( nz, tuv_xsect_file, lng_indexer ) - !----------------------------------------------------------------------------- - ! purpose: - ! read 17 bins data outputed from tuv - !----------------------------------------------------------------------------- - ! parameters: - ! nw - integer, number of specified intervals + 1 in working - ! wavelength grid - ! wl - real(r8), vector of lower limits of wavelength intervals in - ! working wavelength grid - ! wc - real(r8), vector of center of wavelength intervals in - ! working wavelength grid - ! wu - real(r8), vector of upper limits of wavelength intervals in - ! working wavelength grid - ! f - real(r8), spectral irradiance at the top of the atmosphere at - ! each specified wavelength - !----------------------------------------------------------------------------- - ! edit history: - ! 10/2000 similified by xuexi - !----------------------------------------------------------------------------- - - use spmd_utils, only : masterproc - use cam_logfile, only : iulog - use cam_abortutils, only : endrun - use mo_params, only : kj, kw, smallest, largest - use mo_waveall, only : r01g1, r01g2, r01g3, r01g4, & - r04g, r08g, r06g1, r06g2, & - r10g1, r10g2, r10g3, r10g4, r10g5, & - r11g, r11g1, r11g2, r11g3, r11g4, & - r14g, r14g1, r14g2, & - r15g, r15g1, r15g2, r15g3, & - r17g, r17g1, & - r18g, r18g2 - use mo_wavelab, only : sj - use mo_wavelen, only : nw, deltaw, delw_bin, sflx, wc, wl, wu - use mo_waveo3, only : xso3, s226, s263, s298 - use mo_zadj, only : adj_coeffs - use mo_schu, only : schu_inti - use mo_xsections, only : r44_inti, r08_inti - use chem_mods, only : phtcnt, pht_alias_lst, rxt_tag_lst - use ioFileMod, only : getfil - use cam_pio_utils, only : cam_pio_openfile - use pio, only : file_desc_t, pio_nowrite, pio_closefile, & - pio_inq_dimid, pio_inq_varid, pio_inq_dimlen, pio_get_var, & - pio_seterrorhandling, pio_bcast_error, pio_internal_error, pio_noerr - implicit none - - !----------------------------------------------------------------------------- - ! ... dummy arguments - !----------------------------------------------------------------------------- - integer, intent(in) :: nz - integer, intent(inout) :: lng_indexer(phtcnt) - character(len=*), intent(in) :: tuv_xsect_file - - !----------------------------------------------------------------------------- - ! ... local variables - !----------------------------------------------------------------------------- - type(file_desc_t) :: ncid - integer :: ndx - integer :: dimid, vid - integer :: iw, ios, iret - integer :: k, m - integer :: ind_wrk(4) - integer :: wrk_ndx(phtcnt) - real(r8), allocatable :: coeff_adj(:,:) - character(len=256) :: filespec - character(len=256) :: locfn - character(len=20) :: coeff_tag - - !------------------------------------------------------------------------ - ! for wl(iw) .lt. 150.01 susim_hi.flx - ! for wl(iw) .ge. 150.01 and wl(iw) .le. 400 atlas3.flx - ! for wl(iw) .gt. 400 neckel & labs - !------------------------------------------------------------------------ - - !------------------------------------------------------------------------ - ! input data files including: - ! (0) wavelength nw,wl,wc,wu - ! (1) solar flux - ! (2) o3 cross sections - ! (3) other cross - ! (4) t dependence parameter of cross section - !------------------------------------------------------------------------ - - !--------------------------------------------------------------------------- - ! ... open netcdf file - !--------------------------------------------------------------------------- - filespec = trim( tuv_xsect_file ) - call getfil( filespec, locfn, 0 ) - call cam_pio_openfile( ncid, trim(locfn), PIO_NOWRITE) - !--------------------------------------------------------------------------- - ! ... get the dimensions - !--------------------------------------------------------------------------- - iret = pio_inq_dimid( ncid, 'nw', dimid ) - iret = pio_inq_dimlen( ncid, dimid, nw ) - iret = pio_inq_dimid( ncid, 'nzen', dimid ) - iret = pio_inq_dimlen( ncid, dimid, nzen ) - iret = pio_inq_dimid( ncid, 'ncof', dimid ) - iret = pio_inq_dimlen( ncid, dimid, ncof ) - !--------------------------------------------------------------------------- - ! ... read the wave bin coordinates - !--------------------------------------------------------------------------- - iret = pio_inq_varid( ncid, 'wl', vid ) - iret = pio_get_var( ncid, vid, wl(1:nw) ) - iret = pio_inq_varid( ncid, 'wc', vid ) - iret = pio_get_var( ncid, vid, wc(1:nw) ) - iret = pio_inq_varid( ncid, 'wu', vid ) - iret = pio_get_var( ncid, vid, wu(1:nw) ) - wl(nw+1) = wu(nw) - write(iulog,*) ' ' - write(iulog,*) 'tuv_inti: wl(nw+1) = ',wl(nw+1) - !------------------------------------------------------------------------ - ! ... solar flux - !------------------------------------------------------------------------ - iret = pio_inq_varid( ncid, 'sflx', vid ) - iret = pio_get_var( ncid, vid, sflx(1:nw) ) - !------------------------------------------------------------------------ - ! ... o3 cross (t dependence) - !------------------------------------------------------------------------ - iret = pio_inq_varid( ncid, 'xso3', vid ) - iret = pio_get_var( ncid, vid, xso3(1:nw) ) - iret = pio_inq_varid( ncid, 's226', vid ) - iret = pio_get_var( ncid, vid, s226(1:nw) ) - iret = pio_inq_varid( ncid, 's263', vid ) - iret = pio_get_var( ncid, vid, s263(1:nw) ) - iret = pio_inq_varid( ncid, 's298', vid ) - iret = pio_get_var( ncid, vid, s298(1:nw) ) - !--------------------------------------------------------------------------- - ! ... temperature dependent cross section parameters - !--------------------------------------------------------------------------- - iret = pio_inq_varid( ncid, 'r01g1', vid ) - iret = pio_get_var( ncid, vid, r01g1(1:nw) ) - iret = pio_inq_varid( ncid, 'r01g2', vid ) - iret = pio_get_var( ncid, vid, r01g2(1:nw) ) - iret = pio_inq_varid( ncid, 'r01g3', vid ) - iret = pio_get_var( ncid, vid, r01g3(1:nw) ) - iret = pio_inq_varid( ncid, 'r01g4', vid ) - iret = pio_get_var( ncid, vid, r01g4(1:nw) ) - - iret = pio_inq_varid( ncid, 'r04g', vid ) - iret = pio_get_var( ncid, vid, r04g(1:nw) ) - - iret = pio_inq_varid( ncid, 'r08g', vid ) - iret = pio_get_var( ncid, vid, r08g(1:nw) ) - - iret = pio_inq_varid( ncid, 'r06g1', vid ) - iret = pio_get_var( ncid, vid, r06g1(1:nw) ) - iret = pio_inq_varid( ncid, 'r06g2', vid ) - iret = pio_get_var( ncid, vid, r06g2(1:nw) ) - - iret = pio_inq_varid( ncid, 'r10g1', vid ) - iret = pio_get_var( ncid, vid, r10g1(1:nw) ) - iret = pio_inq_varid( ncid, 'r10g2', vid ) - iret = pio_get_var( ncid, vid, r10g2(1:nw) ) - iret = pio_inq_varid( ncid, 'r10g3', vid ) - iret = pio_get_var( ncid, vid, r10g3(1:nw) ) - iret = pio_inq_varid( ncid, 'r10g4', vid ) - iret = pio_get_var( ncid, vid, r10g4(1:nw) ) - iret = pio_inq_varid( ncid, 'r10g5', vid ) - iret = pio_get_var( ncid, vid, r10g5(1:nw) ) - - iret = pio_inq_varid( ncid, 'r11g', vid ) - iret = pio_get_var( ncid, vid, r11g(1:nw) ) - iret = pio_inq_varid( ncid, 'r11g1', vid ) - iret = pio_get_var( ncid, vid, r11g1(1:nw) ) - iret = pio_inq_varid( ncid, 'r11g2', vid ) - iret = pio_get_var( ncid, vid, r11g2(1:nw) ) - iret = pio_inq_varid( ncid, 'r11g3', vid ) - iret = pio_get_var( ncid, vid, r11g3(1:nw) ) - iret = pio_inq_varid( ncid, 'r11g4', vid ) - iret = pio_get_var( ncid, vid, r11g4(1:nw) ) - - iret = pio_inq_varid( ncid, 'r14g', vid ) - iret = pio_get_var( ncid, vid, r14g(1:nw) ) - iret = pio_inq_varid( ncid, 'r14g1', vid ) - iret = pio_get_var( ncid, vid, r14g1(1:nw) ) - iret = pio_inq_varid( ncid, 'r14g2', vid ) - iret = pio_get_var( ncid, vid, r14g2(1:nw) ) - - iret = pio_inq_varid( ncid, 'r15g', vid ) - iret = pio_get_var( ncid, vid, r15g(1:nw) ) - iret = pio_inq_varid( ncid, 'r15g1', vid ) - iret = pio_get_var( ncid, vid, r15g1(1:nw) ) - iret = pio_inq_varid( ncid, 'r15g2', vid ) - iret = pio_get_var( ncid, vid, r15g2(1:nw) ) - iret = pio_inq_varid( ncid, 'r15g3', vid ) - iret = pio_get_var( ncid, vid, r15g3(1:nw) ) - - iret = pio_inq_varid( ncid, 'r17g', vid ) - iret = pio_get_var( ncid, vid, r17g(1:nw) ) - iret = pio_inq_varid( ncid, 'r17g1', vid ) - iret = pio_get_var( ncid, vid, r17g1(1:nw) ) - - iret = pio_inq_varid( ncid, 'r18g', vid ) - iret = pio_get_var( ncid, vid, r18g(1:nw) ) - iret = pio_inq_varid( ncid, 'r18g2', vid ) - iret = pio_get_var( ncid, vid, r18g2(1:nw) ) - !------------------------------------------------------------------------------ - ! ... check for cross section in dataset - !------------------------------------------------------------------------------ - call pio_seterrorhandling(ncid, pio_bcast_error) - do m = 1,phtcnt - if( pht_alias_lst(m,2) == ' ' ) then - iret = pio_inq_varid( ncid, rxt_tag_lst(m), vid ) - if( iret == pio_noerr ) then - lng_indexer(m) = vid - end if - else if( pht_alias_lst(m,2) == 'userdefined' ) then - lng_indexer(m) = -1 - else - iret = pio_inq_varid( ncid, trim(pht_alias_lst(m,2)), vid ) - if( iret == pio_noerr ) then - lng_indexer(m) = vid - else - write(iulog,*) 'tuv_inti : ',rxt_tag_lst(m)(:len_trim(rxt_tag_lst(m))),' alias ', & - pht_alias_lst(m,2)(:len_trim(pht_alias_lst(m,2))),' not in dataset' - call endrun - end if - end if - end do - call pio_seterrorhandling(ncid, pio_internal_error) - nlng = 0 - do m = 1,phtcnt - if( lng_indexer(m) > 0 ) then - if( any( lng_indexer(:m-1) == lng_indexer(m) ) ) then - cycle - end if - nlng = nlng + 1 - end if - end do - !--------------------------------------------------------------------------- - ! ... allocate the cross section array - !--------------------------------------------------------------------------- - allocate( sj(nw,nz,nlng), adj_coeffs(ncof,nlng,nzen), coeff_adj(ncof,nzen), stat=ios ) - if( ios /= 0 ) then - write(iulog,*) 'tuv_inti: failed to allocate sj ... coeff_adj; error = ',ios - call endrun - end if - sj(:,:,:) = 0._r8 - adj_coeffs(:,:,:) = 0._r8 - write(iulog,*) 'tuv_inti: nlng = ',nlng - write(iulog,*) 'tuv_inti: lng_indexer' - write(iulog,'(10i5)') lng_indexer(:) - if( nlng > 0 ) then - write(iulog,*) ' ' - write(iulog,*) 'tuv_inti: photo xsect analysis' - do m = 1,phtcnt - if( lng_indexer(m) > 0 ) then - write(iulog,*) trim(rxt_tag_lst(m)),lng_indexer(m) - end if - end do - end if - ndx = 0 - do m = 1,phtcnt - if( lng_indexer(m) > 0 ) then - if( any( lng_indexer(:m-1) == lng_indexer(m) ) ) then - cycle - end if - ndx = ndx + 1 - iret = pio_get_var( ncid, lng_indexer(m), sj(1:nw,1,ndx) ) - - do k = 2,nz - sj(:,k,ndx) = sj(:,1,ndx) - end do - coeff_tag = trim(rxt_tag_lst(m)) // '_adj' - iret = pio_inq_varid( ncid, trim(coeff_tag), vid ) - iret = pio_get_var( ncid, vid, coeff_adj ) - - adj_coeffs(:,ndx,1:nzen) = coeff_adj(:,1:nzen) - end if - end do - if( ndx /= nlng ) then - write(iulog,*) 'tuv_inti : ndx count /= cross section count' - call endrun - end if - !------------------------------------------------------------------------------ - ! ... setup final lng_indexer - !------------------------------------------------------------------------------ - ndx = 0 - wrk_ndx(:) = lng_indexer(:) - do m = 1,phtcnt - if( wrk_ndx(m) > 0 ) then - ndx = ndx + 1 - k = wrk_ndx(m) - where( wrk_ndx(:) == k ) - lng_indexer(:) = ndx - wrk_ndx(:) = -100000 - end where - end if - end do - if( nlng > 0 ) then - write(iulog,*) ' ' - write(iulog,*) 'tuv_inti: photo xsect analysis' - do m = 1,phtcnt - if( lng_indexer(m) > 0 ) then - write(iulog,*) trim(rxt_tag_lst(m)),lng_indexer(m) - end if - end do - end if - !--------------------------------------------------------------------------- - ! ... close netcdf file - !--------------------------------------------------------------------------- - call pio_closefile( ncid ) - deallocate( coeff_adj ) - - - delw_bin(:nw) = wu(:nw) - wl(:nw) - deltaw(:nw) = delw_bin(:nw) * wc(:nw) * 5.039e11_r8 - delw_bin(:nw) = 1._r8/delw_bin(:nw) - largest = huge( largest ) - smallest = tiny( largest ) - - write(iulog,'(''tuv_inti: smallest,largest = '',1p,2e21.13)') smallest,largest - - call schu_inti - call r44_inti( nw, wc ) - call r08_inti( nw, wl, wc ) - - end subroutine tuv_inti - -end module mo_tuv_inti diff --git a/src/chemistry/mozart/mo_tuvx.F90 b/src/chemistry/mozart/mo_tuvx.F90 new file mode 100644 index 0000000000..ca1879af33 --- /dev/null +++ b/src/chemistry/mozart/mo_tuvx.F90 @@ -0,0 +1,2042 @@ +!---------------------------------------------------------------------- +! Wrapper for TUV-x photolysis rate constant calculator +!---------------------------------------------------------------------- +module mo_tuvx + + use musica_map, only : map_t + use musica_string, only : string_t + use ppgrid, only : pver, & ! number of vertical layers + pverp ! number of vertical interfaces (pver + 1) + use shr_kind_mod, only : r8 => shr_kind_r8, cl=>shr_kind_cl + use tuvx_core, only : core_t + use tuvx_grid_from_host, only : grid_updater_t + use tuvx_profile_from_host, only : profile_updater_t + use tuvx_radiator_from_host, only : radiator_updater_t + + use interpolate_data, only : lininterp_init, lininterp, interp_type + use physics_buffer, only : pbuf_get_field, pbuf_get_index, physics_buffer_desc + use radconstants, only : nswbands + use ppgrid, only : pcols ! maximum number of columns + use radconstants, only : get_sw_spectral_boundaries + use cam_history, only : fieldname_len, horiz_only, addfld, outfld !, add_default + use spmd_utils, only : is_main_task => masterproc + use spmd_utils, only : main_task_id => masterprocid + use spmd_utils, only : mpicom, mpi_character, mpi_integer, mpi_logical, mpi_success + use cam_abortutils, only : endrun + + implicit none + + private + + public :: tuvx_readnl + public :: tuvx_register + public :: tuvx_init + public :: tuvx_timestep_init + public :: tuvx_get_photo_rates + public :: tuvx_finalize + public :: tuvx_active + + ! Inidices for grid updaters + integer, parameter :: NUM_GRIDS = 2 ! number of grids that CAM will update at runtime + integer, parameter :: GRID_INDEX_HEIGHT = 1 ! Height grid index + integer, parameter :: GRID_INDEX_WAVELENGTH = 2 ! Wavelength grid index + + ! Indices for profile updaters + integer, parameter :: NUM_PROFILES = 8 ! number of profiles that CAM will update at runtime + integer, parameter :: PROFILE_INDEX_TEMPERATURE = 1 ! Temperature profile index + integer, parameter :: PROFILE_INDEX_ALBEDO = 2 ! Surface albedo profile index + integer, parameter :: PROFILE_INDEX_ET_FLUX = 3 ! Extraterrestrial flux profile index + integer, parameter :: PROFILE_INDEX_AIR = 4 ! Air density profile index + integer, parameter :: PROFILE_INDEX_O3 = 5 ! Ozone profile index + integer, parameter :: PROFILE_INDEX_O2 = 6 ! Molecular oxygen profile index + + ! Indices for radiator updaters + integer, parameter :: NUM_RADIATORS = 2 ! number of radiators that CAM will update at runtime + integer, parameter :: RADIATOR_INDEX_AEROSOL = 1 ! Aerosol radiator index + integer, parameter :: RADIATOR_INDEX_CLOUDS = 2 ! Cloud radiator index + + ! Definition of the MS93 wavelength grid for use with jno calculations + integer, parameter :: NUM_BINS_MS93 = 4 + real(kind=r8), parameter :: WAVELENGTH_EDGES_MS93(NUM_BINS_MS93+1) = & + (/ 181.6_r8, 183.1_r8, 184.6_r8, 190.2_r8, 192.5_r8 /) + + ! Heating rate indices + integer :: number_of_heating_rates = 0 ! number of heating rates in TUV-x + integer :: number_of_dose_rates = 0 ! number of dose rates in TUV-x + character(len=fieldname_len), allocatable :: dose_rate_hist_name(:) + integer :: index_cpe_jo2_a = -1 ! index for jo2_a in heating rate array + integer :: index_cpe_jo2_b = -1 ! index for jo2_b in heating rate array + integer :: index_cpe_jo3_a = -1 ! index for jo3_a in heating rate array + integer :: index_cpe_jo3_b = -1 ! index for jo3_b in heating rate array + integer :: cpe_jo2_a_pbuf_index = -1 ! index in physics buffer for jo2_a heating rate + integer :: cpe_jo2_b_pbuf_index = -1 ! index in physics buffer for jo2_b heating rate + integer :: cpe_jo3_a_pbuf_index = -1 ! index in physics buffer for jo3_a heating rate + integer :: cpe_jo3_b_pbuf_index = -1 ! index in physics buffer for jo3_b heating rate + + ! Information needed to access CAM species state data + logical :: is_fixed_N2 = .false. ! indicates whether N2 concentrations are fixed + logical :: is_fixed_O = .false. ! indicates whether O concentrations are fixed + logical :: is_fixed_O2 = .false. ! indicates whether O2 concentrations are fixed + logical :: is_fixed_O3 = .false. ! indicates whether O3 concentrations are fixed + logical :: is_fixed_NO = .false. ! indicates whether NO concentrations are fixed + integer :: index_N2 = 0 ! index for N2 in concentration array + integer :: index_O = 0 ! index for O in concentration array + integer :: index_O2 = 0 ! index for O2 in concentration array + integer :: index_O3 = 0 ! index for O3 in concentration array + integer :: index_NO = 0 ! index for NO in concentration array + + ! Information needed to access aerosol and cloud optical properties + logical :: do_aerosols = .false. ! indicates whether aerosol optical properties + ! are available and should be used in radiative + ! transfer calculations + logical :: do_clouds = .false. ! indicates whether cloud optical properties + ! should be calculated and used in radiative + ! transfer calculations + + ! Information needed to set extended-UV photo rates + logical :: do_euv = .false. ! Indicates whether to calculate + ! extended-UV photo rates + integer :: ion_rates_pbuf_index = 0 ! Index in physics buffer for + ! ionization rates + + ! Information needed to do special NO photolysis rate calculation + logical :: do_jno = .false. ! Indicates whether to calculate jno + integer :: jno_index = 0 ! Index in tuvx_ptr::photo_rates_ array for jno + + ! Cutoff solar zenith angle for doing photolysis rate calculations [degrees] + real(r8) :: max_sza = 0.0_r8 + + ! TODO how should these paths be set and communicated to this wrapper? + character(len=*), parameter :: wavelength_config_path = & + "data/grids/wavelength/cam.csv" + logical, parameter :: enable_diagnostics = .true. + + ! TUV-x calculator for each OMP thread + type :: tuvx_ptr + type(core_t), pointer :: core_ => null( ) ! TUV-x calculator + integer :: n_photo_rates_ = 0 ! number of photo reactions in TUV-x + integer :: n_euv_rates_ = 0 ! number of extreme-UV rates + integer :: n_special_rates_ = 0 ! number of special photo rates + integer :: n_wavelength_bins_ = 0 ! number of wavelength bins in TUV-x + type(map_t) :: photo_rate_map_ ! map between TUV-x and CAM + ! photo rate constant arrays + type(grid_updater_t) :: grids_(NUM_GRIDS) ! grid updaters + type(profile_updater_t) :: profiles_(NUM_PROFILES) ! profile updaters + type(radiator_updater_t) :: radiators_(NUM_RADIATORS) ! radiator updaters + real(r8) :: height_delta_(pver+1) ! change in height in each + ! vertical layer (km) + real(r8), allocatable :: wavelength_edges_(:) ! TUV-x wavelength bin edges (nm) + ! on the TUV-x wavelength grid + real(r8) :: et_flux_ms93_(NUM_BINS_MS93) ! extraterrestrial flux on the MS93 grid + ! [photon cm-2 nm-1 s-1] + end type tuvx_ptr + type(tuvx_ptr), allocatable :: tuvx_ptrs(:) + + ! Diagnostic photolysis rate constant output + type :: diagnostic_t + character(len=:), allocatable :: name_ ! Name of the output field + integer :: index_ ! index of the photolysis rate constant from TUV-x + end type diagnostic_t + type(diagnostic_t), allocatable :: diagnostics(:) + + ! namelist options + character(len=cl) :: tuvx_config_path = 'NONE' ! absolute path to TUVX configuration file + logical, protected :: tuvx_active = .false. + + integer :: swaertau_idx = -1 ! shortwave aerosol extinction optical depth. tau + integer :: swaertauw_idx = -1 ! shortwave aerosol extinction optical depth * single scattering albedo. tau*w + integer :: swaertauwg_idx = -1 ! shortwave aerosol extinction optical depth * single scattering albedo * asymmetry parameter. tau*w*g + integer :: swcldtau_idx = -1 ! shortwave cloud extinction optical depth. tau + integer :: swcldtauw_idx = -1 ! shortwave cloud extinction optical depth * single scattering albedo. tau*w + integer :: swcldtauwg_idx = -1 ! shortwave cloud extinction optical depth * single scattering albedo * asymmetry parameter. tau*w*g + type (interp_type) :: interp_wgts + real(r8) :: rrtmg_wavelength(nswbands-1) + integer :: nwave + +!================================================================================================ +contains +!================================================================================================ + + !----------------------------------------------------------------------- + ! registers fields in the physics buffer + !----------------------------------------------------------------------- + subroutine tuvx_register( ) + + use mo_jeuv, only : nIonRates + use physics_buffer, only : pbuf_add_field, dtype_r8 + use ppgrid, only : pcols ! maximum number of columns + + if( .not. tuvx_active ) return + + ! add photo-ionization rates to physics buffer for WACCMX Ionosphere module + call pbuf_add_field( 'IonRates', 'physpkg', dtype_r8, (/ pcols, pver, nIonRates /), & + ion_rates_pbuf_index ) ! Ionization rates for O+, O2+, N+, N2+, NO+ + + call pbuf_add_field( 'CPE_jO2a', 'global', dtype_r8, (/ pcols, pver /), cpe_jo2_a_pbuf_index ) + call pbuf_add_field( 'CPE_jO2b', 'global', dtype_r8, (/ pcols, pver /), cpe_jo2_b_pbuf_index ) + call pbuf_add_field( 'CPE_jO3a', 'global', dtype_r8, (/ pcols, pver /), cpe_jo3_a_pbuf_index ) + call pbuf_add_field( 'CPE_jO3b', 'global', dtype_r8, (/ pcols, pver /), cpe_jo3_b_pbuf_index ) + + ! Put the shortwave aerosol optical properties into the physics buffer so + ! that they can be used in the photolysis code. + call pbuf_add_field('SWAERTAU', 'global',dtype_r8,(/pcols,pver,nswbands/), swaertau_idx) ! shortwave tau + call pbuf_add_field('SWAERTAUW', 'global',dtype_r8,(/pcols,pver,nswbands/), swaertauw_idx) ! shortwave tau * w + call pbuf_add_field('SWAERTAUWG', 'global',dtype_r8,(/pcols,pver,nswbands/), swaertauwg_idx) ! shortwave tau * w * g + + ! Put the shortwave cloud optical properties into the physics buffer so + ! that they can be used in the photolysis code. + call pbuf_add_field('SWCLDTAU', 'global',dtype_r8,(/pcols,pver,nswbands/), swcldtau_idx) ! shortwave tau + call pbuf_add_field('SWCLDTAUW', 'global',dtype_r8,(/pcols,pver,nswbands/), swcldtauw_idx) ! shortwave tau * w + call pbuf_add_field('SWCLDTAUWG', 'global',dtype_r8,(/pcols,pver,nswbands/), swcldtauwg_idx) ! shortwave tau * w * g + + end subroutine tuvx_register + +!================================================================================================ + + !----------------------------------------------------------------------- + ! read namelist options + !----------------------------------------------------------------------- + subroutine tuvx_readnl(nlfile) + + use cam_abortutils, only : endrun + use cam_logfile, only : iulog ! log file output unit + use namelist_utils, only : find_group_name + + character(len=*), intent(in) :: nlfile ! filepath for file containing namelist input + + integer :: unitn, ierr + character(len=*), parameter :: subname = 'tuvx_readnl' + + ! =================== + ! Namelist definition + ! =================== + namelist /tuvx_opts/ tuvx_active, tuvx_config_path + + ! ============= + ! Read namelist + ! ============= + if (is_main_task) then + open( newunit=unitn, file=trim(nlfile), status='old' ) + call find_group_name(unitn, 'tuvx_opts', status=ierr) + if (ierr == 0) then + read(unitn, tuvx_opts, iostat=ierr) + if (ierr /= 0) then + call endrun(subname // ':: ERROR reading namelist') + end if + end if + close(unitn) + end if + + ! ============================ + ! Broadcast namelist variables + ! ============================ + call mpi_bcast(tuvx_config_path, len(tuvx_config_path), mpi_character, main_task_id, mpicom, ierr) + if (ierr /= mpi_success) call endrun(subname//': mpi_bcast error : tuvx_config_path') + call mpi_bcast(tuvx_active, 1, mpi_logical, main_task_id, mpicom, ierr) + if (ierr /= mpi_success) call endrun(subname//': mpi_bcast error : tuvx_active') + + if (tuvx_active .and. tuvx_config_path == 'NONE') then + call endrun(subname // ' : must set tuvx_config_path when TUV-X is active') + end if + + if (is_main_task) then + write(iulog,*) 'tuvx_readnl: tuvx_config_path = ', trim(tuvx_config_path) + write(iulog,*) 'tuvx_readnl: tuvx_active = ', tuvx_active + end if + + end subroutine tuvx_readnl + +!================================================================================================ + + !----------------------------------------------------------------------- + ! Initializes TUV-x for photolysis calculations + !----------------------------------------------------------------------- + subroutine tuvx_init( photon_file, electron_file, max_solar_zenith_angle, pbuf2d ) + + use cam_logfile, only : iulog ! log file output unit + use infnan, only : nan, assignment(=) + use mo_chem_utls, only : get_spc_ndx, get_inv_ndx + use mo_jeuv, only : neuv ! number of extreme-UV rates + use musica_assert, only : assert_msg, die_msg + use musica_config, only : config_t + use musica_mpi, only : musica_mpi_rank, & + musica_mpi_pack_size, & + musica_mpi_pack, & + musica_mpi_unpack + use musica_string, only : string_t, to_char + use physics_buffer, only : physics_buffer_desc + use physics_buffer, only : pbuf_set_field + use ppgrid, only : pcols ! maximum number of columns + use shr_const_mod, only : pi => shr_const_pi + use solar_irrad_data, only : has_spectrum + use tuvx_grid, only : grid_t + use tuvx_grid_warehouse, only : grid_warehouse_t + use tuvx_profile_warehouse, only : profile_warehouse_t + use tuvx_radiator_warehouse, only : radiator_warehouse_t + use time_manager, only : is_first_step + + use physics_buffer, only: pbuf_get_index + + character(len=*), intent(in) :: photon_file ! photon file used in extended-UV module setup + character(len=*), intent(in) :: electron_file ! electron file used in extended-UV module setup + real(r8), intent(in) :: max_solar_zenith_angle ! cutoff solar zenith angle for + ! photo rate calculations [degrees] + type(physics_buffer_desc), pointer :: pbuf2d(:,:) ! Physics buffer + + character(len=*), parameter :: my_name = "TUV-x wrapper initialization" + class(core_t), pointer :: core + character, allocatable :: buffer(:) + type(string_t) :: config_path + type(config_t) :: tuvx_config, cam_config, map_config + type(map_t) :: map + class(grid_t), pointer :: height + class(grid_t), pointer :: wavelength + class(grid_warehouse_t), pointer :: cam_grids + class(profile_warehouse_t), pointer :: cam_profiles + class(radiator_warehouse_t), pointer :: cam_radiators + integer :: pack_size, pos, i_core, i_err + logical :: disable_aerosols, disable_clouds + type(string_t) :: required_keys(1), optional_keys(2) + logical, save :: is_initialized = .false. + + type(string_t), allocatable :: labels(:) + type(string_t), allocatable :: dose_labels(:) + character(len=16) :: label + integer :: i + real(r8) :: nanval + + real(r8) :: wavelength_low(nswbands) !RRTMG wavenumber low edge + real(r8) :: wavelength_high(nswbands) !RRTMG wavenumber high edge + real(r8), allocatable :: wc(:) ! TUVx wavelengths at bin centers + + character(len=2) :: numchar + character(len=*), parameter :: subname = 'tuvx_init' + + if( .not. tuvx_active ) return + if( is_initialized ) return + is_initialized = .true. + + nanval=nan + + call pbuf_set_field( pbuf2d, ion_rates_pbuf_index, nanval ) + + if( is_first_step( ) ) then + call pbuf_set_field( pbuf2d, cpe_jo2_a_pbuf_index, 0.0_r8 ) + call pbuf_set_field( pbuf2d, cpe_jo2_b_pbuf_index, 0.0_r8 ) + call pbuf_set_field( pbuf2d, cpe_jo3_a_pbuf_index, 0.0_r8 ) + call pbuf_set_field( pbuf2d, cpe_jo3_b_pbuf_index, 0.0_r8 ) + end if + + if( is_main_task ) write(iulog,*) "Beginning TUV-x Initialization" + + config_path = trim(tuvx_config_path) + + ! =============================== + ! CAM TUV-x configuration options + ! =============================== + required_keys(1) = "aliasing" + optional_keys(1) = "disable aerosols" + optional_keys(2) = "disable clouds" + + ! =============================================================== + ! set the maximum solar zenith angle to calculate photo rates for + ! =============================================================== + max_sza = max_solar_zenith_angle + if( max_sza <= 0.0_r8 .or. max_sza > 180.0_r8 ) then + call die_msg( 723815691, "TUV-x max solar zenith angle must be between 0 and 180 degress" ) + end if + + ! ================================= + ! initialize the extended-UV module + ! ================================= + call initialize_euv( photon_file, electron_file, do_euv ) + + ! ========================================================================== + ! create the set of TUV-x grids and profiles that CAM will update at runtime + ! ========================================================================== + cam_grids => get_cam_grids( wavelength_config_path ) + cam_profiles => get_cam_profiles( cam_grids ) + cam_radiators => get_cam_radiators( cam_grids ) + + ! ================================================================== + ! construct a core and a map between TUV-x and CAM photolysis arrays + ! on the primary process and pack them onto an MPI buffer + ! ================================================================== + if( is_main_task ) then + call tuvx_config%from_file( config_path%to_char( ) ) + call tuvx_config%get( "__CAM options", cam_config, my_name ) + call assert_msg( 973680295, & ! random error number consistent with how MUSICA error handling + cam_config%validate( required_keys, optional_keys ), & + "Bad configuration for CAM TUV-x options." ) + call cam_config%get( "disable aerosols", disable_aerosols, my_name, & + default = .false. ) + call cam_config%get( "disable clouds", disable_clouds, my_name, & + default = .false. ) + call cam_config%get( "aliasing", map_config, my_name ) + core => core_t( config_path, cam_grids, cam_profiles, cam_radiators ) + call set_photo_rate_map( core, map_config, do_euv, do_jno, jno_index, map ) + pack_size = core%pack_size( mpicom ) + & + map%pack_size( mpicom ) + & + musica_mpi_pack_size( do_jno, mpicom ) + & + musica_mpi_pack_size( jno_index, mpicom ) + & + musica_mpi_pack_size( disable_aerosols, mpicom ) + & + musica_mpi_pack_size( disable_clouds, mpicom ) + allocate( buffer( pack_size ), stat=i_err ) + if( i_err /= 0 ) call endrun(subname//': allocation error : buffer') + pos = 0 + call core%mpi_pack( buffer, pos, mpicom ) + call map%mpi_pack( buffer, pos, mpicom ) + call musica_mpi_pack( buffer, pos, do_jno, mpicom ) + call musica_mpi_pack( buffer, pos, jno_index, mpicom ) + call musica_mpi_pack( buffer, pos, disable_aerosols, mpicom ) + call musica_mpi_pack( buffer, pos, disable_clouds, mpicom ) + deallocate( core ) + end if + + ! ==================================================== + ! broadcast the core and map data to all MPI processes + ! ==================================================== + call mpi_bcast( pack_size, 1, mpi_integer, main_task_id, mpicom, i_err ) + if (i_err/=mpi_success) call endrun(subname//': mpi_bcast error : pack_size') + + if( .not. is_main_task ) then + allocate( buffer( pack_size ), stat=i_err ) + if( i_err /= 0 ) call endrun(subname//': allocation error : buffer') + end if + + call mpi_bcast( buffer, pack_size, mpi_character, main_task_id, mpicom, i_err ) + if (i_err/=mpi_success) call endrun(subname//': mpi_bcast error : buffer') + + ! ================================================================ + ! unpack the core and map for each OMP thread on every MPI process + ! ================================================================ + allocate( tuvx_ptrs( max_threads( ) ) ) + do i_core = 1, size( tuvx_ptrs ) + associate( tuvx => tuvx_ptrs( i_core ) ) + allocate( tuvx%core_ ) + pos = 0 + call tuvx%core_%mpi_unpack( buffer, pos, mpicom ) + call tuvx%photo_rate_map_%mpi_unpack( buffer, pos, mpicom ) + call musica_mpi_unpack( buffer, pos, do_jno, mpicom ) + call musica_mpi_unpack( buffer, pos, jno_index, mpicom ) + call musica_mpi_unpack( buffer, pos, disable_aerosols, mpicom ) + call musica_mpi_unpack( buffer, pos, disable_clouds, mpicom ) + + ! =================================================================== + ! Set up connections between CAM and TUV-x input data for each thread + ! =================================================================== + call create_updaters( tuvx, cam_grids, cam_profiles, cam_radiators, & + disable_aerosols, disable_clouds ) + + ! ============================================ + ! Save the number of photolysis rate constants + ! ============================================ + tuvx%n_photo_rates_ = tuvx%core_%number_of_photolysis_reactions( ) + if( do_euv ) tuvx%n_euv_rates_ = neuv + if( do_jno ) tuvx%n_special_rates_ = tuvx%n_special_rates_ + 1 + + end associate + end do + + ! get number of TUVx wave bins + wavelength => cam_grids%get_grid( "wavelength", "nm" ) + nwave = wavelength%size() + + ! get TUVx wavelengths at bin centers + allocate(wc(nwave)) + wc(1:nwave) = (wavelength%edge_(1:nwave) + wavelength%edge_(2:nwave+1))*0.5_r8 + + deallocate( wavelength ) + deallocate( cam_grids ) + deallocate( cam_profiles ) + deallocate( cam_radiators ) + deallocate( buffer ) + + ! ============================================= + ! Get index info for CAM species concentrations + ! ============================================= + index_N2 = get_inv_ndx( 'N2' ) + is_fixed_N2 = index_N2 > 0 + if( .not. is_fixed_N2 ) index_N2 = get_spc_ndx( 'N2' ) + index_O = get_inv_ndx( 'O' ) + is_fixed_O = index_O > 0 + if( .not. is_fixed_O ) index_O = get_spc_ndx( 'O' ) + index_O2 = get_inv_ndx( 'O2' ) + is_fixed_O2 = index_O2 > 0 + if( .not. is_fixed_O2 ) index_O2 = get_spc_ndx( 'O2' ) + index_O3 = get_inv_ndx( 'O3' ) + is_fixed_O3 = index_O3 > 0 + if( .not. is_fixed_O3 ) index_O3 = get_spc_ndx( 'O3' ) + index_NO = get_inv_ndx( 'NO' ) + is_fixed_NO = index_NO > 0 + if( .not. is_fixed_NO ) index_NO = get_spc_ndx( 'NO' ) + + ! ==================================================== + ! make sure extraterrestrial flux values are available + ! ==================================================== + ! the random error number is consistent with how MUSICA + ! handles errors and don't have any particular meaning + call assert_msg( 170693514, has_spectrum, & + "Solar irradiance spectrum needed for TUV-x" ) + + ! ============================================ + ! set up diagnostic output of photolysis rates + ! ============================================ + call initialize_diagnostics( tuvx_ptrs( 1 ) ) + + ! =============================== + ! set up map to CAM heating rates + ! =============================== + labels = tuvx_ptrs(1)%core_%heating_rate_labels( ) + do i = 1, size( labels ) + label = trim( labels( i )%to_char( ) ) + select case( label ) + case( 'jo2_a' ) + index_cpe_jo2_a = i + number_of_heating_rates = number_of_heating_rates + 1 + call addfld('CPE_jO2a',(/ 'lev' /), 'A', 'joules sec-1', & + trim(label)//' chemical potential energy') + case( 'jo2_b' ) + index_cpe_jo2_b = i + number_of_heating_rates = number_of_heating_rates + 1 + call addfld('CPE_jO2b',(/ 'lev' /), 'A', 'joules sec-1', & + trim(label)//' chemical potential energy') + case( 'jo3_a' ) + index_cpe_jo3_a = i + number_of_heating_rates = number_of_heating_rates + 1 + call addfld('CPE_jO3a',(/ 'lev' /), 'A', 'joules sec-1', & + trim(label)//' chemical potential energy') + case( 'jo3_b' ) + index_cpe_jo3_b = i + number_of_heating_rates = number_of_heating_rates + 1 + call addfld('CPE_jO3b',(/ 'lev' /), 'A', 'joules sec-1', & + trim(label)//' chemical potential energy') + end select + end do + call assert_msg( 398372957, & + number_of_heating_rates == size( labels ), & + "TUV-x heating rate mismatch. Expected "// & + trim( to_char( size( labels ) )// & + " rates, but only matched "// & + trim( to_char( number_of_heating_rates ) )//"." ) ) + + if( is_first_step( ) ) then + call pbuf_set_field( pbuf2d, swaertau_idx, 0.0_r8 ) + call pbuf_set_field( pbuf2d, swaertauw_idx, 0.0_r8 ) + call pbuf_set_field( pbuf2d, swaertauwg_idx, 0.0_r8 ) + call pbuf_set_field( pbuf2d, swcldtau_idx, 0.0_r8 ) + call pbuf_set_field( pbuf2d, swcldtauw_idx, 0.0_r8 ) + call pbuf_set_field( pbuf2d, swcldtauwg_idx, 0.0_r8 ) + end if + + ! Radiation dose rates diagnostics + number_of_dose_rates = tuvx_ptrs(1)%core_%number_of_dose_rates() + allocate(dose_rate_hist_name(number_of_dose_rates)) + + dose_labels = tuvx_ptrs(1)%core_%dose_rate_labels() + + do i = 1, size(dose_labels) + write(numchar,'(I2.2)') i + dose_rate_hist_name(i) = 'TUVX_DOSE_RATE_'//numchar + call addfld( dose_rate_hist_name(i), horiz_only, 'A', 'watts m-2', & + 'TUVX dose rate: '//trim(dose_labels(i)%to_char()), flag_xyfill=.true. ) + !call add_default(dose_rate_hist_name(i), 3, ' ') + end do + + ! Get the RRTMG wavenumber edges and convert to a wavelength center. + ! + ! NOTE: Last band is a broadband that overlaps the other bands, so skip it. + call get_sw_spectral_boundaries(wavelength_low, wavelength_high, "nm") + rrtmg_wavelength = (wavelength_low(1:nswbands-1) + wavelength_high(1:nswbands-1)) / 2._r8 + + ! Calculate weights needed to interpolate from the RRTMG wavelengths to the + ! radxfr wavelengths. + call lininterp_init(rrtmg_wavelength, nswbands-1, wc, nwave, 1, interp_wgts) + + deallocate(wc) + + if( is_main_task ) call log_initialization( labels ) + + end subroutine tuvx_init + +!================================================================================================ + + !----------------------------------------------------------------------- + ! Updates TUV-x profiles that depend on time but not space + !----------------------------------------------------------------------- + subroutine tuvx_timestep_init( ) + + integer :: i_thread + + if( .not. tuvx_active ) return + + do i_thread = 1, size( tuvx_ptrs ) + associate( tuvx => tuvx_ptrs( i_thread ) ) + call set_et_flux( tuvx ) + end associate + end do + + end subroutine tuvx_timestep_init + +!================================================================================================ + + !----------------------------------------------------------------------- + ! Calculates and returns photolysis rate constants + !----------------------------------------------------------------------- + subroutine tuvx_get_photo_rates( pbuf, ncol, lchnk, height_mid, & + height_int, temperature_mid, surface_temperature, fixed_species_conc, & + species_vmr, exo_column_conc, surface_albedo, solar_zenith_angle, & + earth_sun_distance, pressure_delta, cloud_fraction, liquid_water_content, & + photolysis_rates ) + + use cam_logfile, only : iulog ! log info output unit + use chem_mods, only : phtcnt, & ! number of photolysis reactions + gas_pcnst, & ! number of non-fixed species + nfs, & ! number of fixed species + nabscol, & ! number of absorbing species (radiators) + rxt_tag_lst ! labels for all chemical reactions + use physics_buffer, only : physics_buffer_desc + use physics_buffer, only : pbuf_get_field + use ppgrid, only : pcols ! maximum number of columns + use shr_const_mod, only : pi => shr_const_pi + + type(physics_buffer_desc), pointer, intent(inout) :: pbuf(:) + integer, intent(in) :: ncol ! number of active columns on this thread + integer, intent(in) :: lchnk ! identifier for this thread + real(r8), intent(in) :: height_mid(ncol,pver) ! height at mid-points (km) + real(r8), intent(in) :: height_int(ncol,pver+1) ! height at interfaces (km) + real(r8), intent(in) :: temperature_mid(pcols,pver) ! midpoint temperature (K) + real(r8), intent(in) :: surface_temperature(pcols) ! surface temperature (K) + real(r8), intent(in) :: fixed_species_conc(ncol,pver,max(1,nfs)) ! fixed species densities + ! (molecule cm-3) + real(r8), intent(in) :: species_vmr(ncol,pver,max(1,gas_pcnst)) ! species volume mixing + ! ratios (mol mol-1) + real(r8), intent(in) :: exo_column_conc(ncol,0:pver,max(1,nabscol)) ! layer column densities + ! (molecule cm-2) + real(r8), intent(in) :: surface_albedo(pcols) ! surface albedo (unitless) + real(r8), intent(in) :: solar_zenith_angle(ncol) ! solar zenith angle (radians) + real(r8), intent(in) :: earth_sun_distance ! Earth-Sun distance (AU) + real(r8), intent(in) :: pressure_delta(pcols,pver) ! pressure delta about midpoints (Pa) + real(r8), intent(in) :: cloud_fraction(ncol,pver) ! cloud fraction (unitless) + real(r8), intent(in) :: liquid_water_content(ncol,pver) ! liquid water content (kg/kg) + real(r8), intent(inout) :: photolysis_rates(ncol,pver,phtcnt) ! photolysis rate + ! constants (1/s) + integer :: ipht, k, idose + integer :: i_col ! column index + integer :: i_level ! vertical level index + real(r8) :: sza ! solar zenith angle [degrees] + real(r8) :: cpe_rates(ncol,pverp+1,number_of_heating_rates) ! heating rates from TUV-x + real(r8), pointer :: cpe_jo2_a(:,:) ! heating rate for jo2_a in physics buffer + real(r8), pointer :: cpe_jo2_b(:,:) ! heating rate for jo2_b in physics buffer + real(r8), pointer :: cpe_jo3_a(:,:) ! heating rate for jo3_a in physics buffer + real(r8), pointer :: cpe_jo3_b(:,:) ! heating rate for jo3_b in physics buffer + + real(r8) :: dose_rates(ncol,pverp+1,number_of_dose_rates) + + ! working arrays + real(r8), allocatable :: photo_rates(:,:,:) ! calculated photo rate constants (column, level, reaction) [s-1] + real(r8), allocatable :: optical_depth(:,:,:) ! aerosol optical depth (column, level, wavelength) [unitless] + real(r8), allocatable :: single_scattering_albedo(:,:,:) ! aerosol single scattering albedo (column, level, wavelength) [unitless] + real(r8), allocatable :: asymmetry_factor(:,:,:) ! aerosol asymmetry factor (column, level, wavelength) [unitless] + + real(r8), allocatable :: optical_depth_cld(:,:,:) ! aerosol optical depth (column, level, wavelength) [unitless] + real(r8), allocatable :: single_scattering_albedo_cld(:,:,:) ! aerosol single scattering albedo (column, level, wavelength) [unitless] + real(r8), allocatable :: asymmetry_factor_cld(:,:,:) ! aerosol asymmetry factor (column, level, wavelength) [unitless] + + if( .not. tuvx_active ) return + + call pbuf_get_field(pbuf, cpe_jo2_a_pbuf_index, cpe_jo2_a) + call pbuf_get_field(pbuf, cpe_jo2_b_pbuf_index, cpe_jo2_b) + call pbuf_get_field(pbuf, cpe_jo3_a_pbuf_index, cpe_jo3_a) + call pbuf_get_field(pbuf, cpe_jo3_b_pbuf_index, cpe_jo3_b) + + cpe_rates(:,:,:) = 0.0_r8 + cpe_jo2_a(:,:) = 0.0_r8 + cpe_jo2_b(:,:) = 0.0_r8 + cpe_jo3_a(:,:) = 0.0_r8 + cpe_jo3_b(:,:) = 0.0_r8 + + associate( tuvx => tuvx_ptrs( thread_id( ) ) ) + + allocate( photo_rates( pcols, pver+2, tuvx%n_photo_rates_ + tuvx%n_euv_rates_ & + + tuvx%n_special_rates_ ) ) + allocate( optical_depth( pcols, pver+1, tuvx%n_wavelength_bins_ ) ) + allocate( single_scattering_albedo( pcols, pver+1, tuvx%n_wavelength_bins_ ) ) + allocate( asymmetry_factor( pcols, pver+1, tuvx%n_wavelength_bins_ ) ) + allocate( optical_depth_cld( pcols, pver+1, tuvx%n_wavelength_bins_ ) ) + allocate( single_scattering_albedo_cld( pcols, pver+1, tuvx%n_wavelength_bins_ ) ) + allocate( asymmetry_factor_cld( pcols, pver+1, tuvx%n_wavelength_bins_ ) ) + photo_rates(:,:,:) = 0.0_r8 + dose_rates(:,:,:) = 0.0_r8 + + ! ============================================== + ! set aerosol optical properties for all columns + ! ============================================== + + + call get_aerosol_optical_properties( tuvx, pbuf, ncol, & + optical_depth, single_scattering_albedo, asymmetry_factor, & + optical_depth_cld, single_scattering_albedo_cld, asymmetry_factor_cld ) + + do i_col = 1, ncol + + ! =================================== + ! skip columns in near total darkness + ! =================================== + sza = solar_zenith_angle(i_col) * 180.0_r8 / pi + if( sza < 0.0_r8 .or. sza > max_sza ) cycle + + ! =================== + ! update grid heights + ! =================== + call set_heights( tuvx, i_col, ncol, height_mid, height_int ) + + ! ======================================= + ! set conditions for this column in TUV-x + ! ======================================= + call set_temperatures( tuvx, i_col, temperature_mid, surface_temperature ) + call set_surface_albedo( tuvx, i_col, surface_albedo ) + call set_radiator_profiles( tuvx, i_col, ncol, fixed_species_conc, & + species_vmr, exo_column_conc, & + pressure_delta(1:ncol,:), cloud_fraction, & + liquid_water_content, optical_depth, & + single_scattering_albedo, asymmetry_factor, & + optical_depth_cld, single_scattering_albedo_cld, asymmetry_factor_cld ) + + ! =================================================== + ! Calculate photolysis rate constants for this column + ! =================================================== + call tuvx%core_%run( & + solar_zenith_angle = sza, & + earth_sun_distance = earth_sun_distance, & + photolysis_rate_constants = photo_rates(i_col,:,1:tuvx%n_photo_rates_), & + heating_rates = cpe_rates(i_col,:,:), & + dose_rates = dose_rates(i_col,:,:) ) + + ! ============================== + ! Calculate the extreme-UV rates + ! ============================== + if( do_euv ) then + associate( euv_begin => tuvx%n_photo_rates_ + 1, & + euv_end => tuvx%n_photo_rates_ + tuvx%n_euv_rates_ ) + call calculate_euv_rates( sza, & + fixed_species_conc(i_col,:,:), & + species_vmr(i_col,:,:), & + height_mid(i_col,:), & + height_int(i_col,:), & + photo_rates(i_col,2:pver+1,euv_begin:euv_end) ) + end associate + end if + + ! ============================= + ! Calculate special photo rates + ! ============================= + if( do_jno ) then + call calculate_jno( sza, & + tuvx%et_flux_ms93_, & + fixed_species_conc(i_col,:,:), & + species_vmr(i_col,:,:), & + height_int(i_col,:), & + photo_rates(i_col,2:pver+1,jno_index) ) + end if + end do + + ! ===================== + ! Filter negative rates + ! ===================== + photo_rates(:,:,:) = max( 0.0_r8, photo_rates(:,:,:) ) + + ! ============================================ + ! Return the photolysis rates on the CAM grids + ! ============================================ + do i_col = 1, ncol + do i_level = 1, pver + call tuvx%photo_rate_map_%apply( photo_rates(i_col,pver-i_level+2,:), & + photolysis_rates(i_col,i_level,:) ) + end do + end do + + call output_diagnostics( tuvx, ncol, lchnk, photo_rates ) + + ! output radiaion dose rates at surface + do idose = 1, number_of_dose_rates + call outfld( dose_rate_hist_name(idose), dose_rates(:ncol, 1, idose), ncol, lchnk ) + end do + + do ipht = 1, phtcnt + call outfld( 'tuvcam_'//trim(rxt_tag_lst(ipht)), photolysis_rates(:ncol,:,ipht), ncol, lchnk ) + end do + + end associate + + if (index_cpe_jo2_a>0) then + do i_level = 1, pver + cpe_jo2_a(:ncol,i_level) = & + 0.5_r8 * ( cpe_rates(:ncol,pver-i_level+2,index_cpe_jo2_a) & + + cpe_rates(:ncol,pver-i_level+1,index_cpe_jo2_a) ) + end do + call outfld('CPE_jO2a', cpe_jo2_a(:ncol,:), ncol, lchnk ) + end if + if (index_cpe_jo2_b>0) then + do i_level = 1, pver + cpe_jo2_b(:ncol,i_level) = & + 0.5_r8 * ( cpe_rates(:ncol,pver-i_level+2,index_cpe_jo2_b) & + + cpe_rates(:ncol,pver-i_level+1,index_cpe_jo2_b) ) + end do + call outfld('CPE_jO2b', cpe_jo2_b(:ncol,:), ncol, lchnk ) + end if + + if (index_cpe_jo3_a>0) then + do i_level = 1, pver + cpe_jo3_a(:ncol,i_level) = & + 0.5_r8 * ( cpe_rates(:ncol,pver-i_level+2,index_cpe_jo3_a) & + + cpe_rates(:ncol,pver-i_level+1,index_cpe_jo3_a) ) + end do + call outfld('CPE_jO3a', cpe_jo3_a(:ncol,:), ncol, lchnk ) + end if + if (index_cpe_jo3_b>0) then + do i_level = 1, pver + cpe_jo3_b(:ncol,i_level) = & + 0.5_r8 * ( cpe_rates(:ncol,pver-i_level+2,index_cpe_jo3_b) & + + cpe_rates(:ncol,pver-i_level+1,index_cpe_jo3_b) ) + end do + call outfld('CPE_jO3b', cpe_jo3_b(:ncol,:), ncol, lchnk ) + end if + + end subroutine tuvx_get_photo_rates + +!================================================================================================ + + !----------------------------------------------------------------------- + ! Cleans up memory associated with TUV-x calculators + !----------------------------------------------------------------------- + subroutine tuvx_finalize( ) + + integer :: i_core, i_diag + + if( allocated( tuvx_ptrs ) ) then + do i_core = 1, size( tuvx_ptrs ) + associate( tuvx => tuvx_ptrs( i_core ) ) + if( associated( tuvx%core_ ) ) deallocate( tuvx%core_ ) + if( allocated(tuvx%wavelength_edges_) ) deallocate(tuvx%wavelength_edges_) + end associate + end do + end if + + if (allocated(diagnostics)) then + do i_diag = 1,size(diagnostics) + deallocate(diagnostics(i_diag)%name_) + end do + deallocate(diagnostics) + end if + + if (allocated(dose_rate_hist_name)) then + deallocate(dose_rate_hist_name) + end if + + end subroutine tuvx_finalize + +!================================================================================================ +!================================================================================================ +! +! Support functions +! +!================================================================================================ +!================================================================================================ + + !----------------------------------------------------------------------- + ! Returns the id of the current OpenMP thread, or 1 if not + ! using OpenMP (1 <= id <= max_threads()) + !----------------------------------------------------------------------- + integer function thread_id( ) +#ifdef _OPENMP + use omp_lib, only : omp_get_thread_num +#endif + +#ifdef _OPENMP + thread_id = 1 + omp_get_thread_num( ) +#else + thread_id = 1 +#endif + + end function thread_id + +!================================================================================================ + + !----------------------------------------------------------------------- + ! Returns the number of threads available for calculations at + ! runtime + !----------------------------------------------------------------------- + integer function max_threads( ) +#ifdef _OPENMP + use omp_lib, only : omp_get_max_threads +#endif + +#ifdef _OPENMP + max_threads = omp_get_max_threads( ) +#else + max_threads = 1 +#endif + + end function max_threads + +!================================================================================================ + + !----------------------------------------------------------------------- + ! Prints initialization conditions to the log file + !----------------------------------------------------------------------- + subroutine log_initialization( heating_rate_labels ) + + use cam_logfile, only : iulog ! log info output unit + use musica_string, only : to_char + + type(string_t), intent(in) :: heating_rate_labels(:) ! heating rate labels + + integer :: i + + if( is_main_task ) then + write(iulog,*) "Initialized TUV-x" +#ifdef HAVE_MPI + write(iulog,*) " - with MPI support on task "//trim( to_char( main_task_id ) ) +#else + write(iulog,*) " - without MPI support" +#endif +#ifdef _OPENMP + write(iulog,*) " - with OpenMP support for "// & + trim( to_char( max_threads( ) ) )//" threads, on thread " & + //trim( to_char( thread_id( ) ) ) +#else + write(iulog,*) " - without OpenMP support" +#endif + write(iulog,*) " - with configuration file: '"//trim( tuvx_config_path )//"'" + if( do_aerosols ) then + write(iulog,*) " - with on-line aerosols" + else + write(iulog,*) " - without on-line aerosols" + end if + if( do_clouds ) then + write(iulog,*) " - with on-line clouds" + else + write(iulog,*) " - without on-line clouds" + end if + if( index_N2 > 0 ) write(iulog,*) " - including N2" + if( index_O > 0 ) write(iulog,*) " - including O" + if( index_O2 > 0 ) write(iulog,*) " - including O2" + if( index_O3 > 0 ) write(iulog,*) " - including O3" + if( index_NO > 0 ) write(iulog,*) " - including NO" + if( do_euv ) write(iulog,*) " - doing Extreme-UV calculations" + if( do_jno ) write(iulog,*) " - including special jno rate calculation" + write(iulog,*) " - max solar zenith angle [degrees]:", max_sza + if( size( heating_rate_labels ) > 0 ) then + write(iulog,*) " - with heating rates:" + do i = 1, size( heating_rate_labels ) + write(iulog,*) " - "//trim( heating_rate_labels( i )%to_char( ) ) + end do + end if + end if + + end subroutine log_initialization + +!================================================================================================ + + !----------------------------------------------------------------------- + ! initializes the external extreme-UV module + !----------------------------------------------------------------------- + subroutine initialize_euv( photon_file, electron_file, do_euv ) + + use chem_mods, only : phtcnt ! number of CAM-Chem photolysis reactions + use mo_jeuv, only : jeuv_init ! extreme-UV initialization + + character(len=*), intent(in) :: photon_file ! photon file used in extended-UV module + ! setup + character(len=*), intent(in) :: electron_file ! electron file used in extended-UV + ! module setup + logical, intent(out) :: do_euv ! indicates whether extreme-UV + ! calculations are needed + + integer, allocatable :: euv_index_map(:) + + allocate( euv_index_map( phtcnt ) ) + euv_index_map(:) = 0 + call jeuv_init( photon_file, electron_file, euv_index_map ) + do_euv = any( euv_index_map(:) > 0 ) + + end subroutine initialize_euv + +!================================================================================================ + + !----------------------------------------------------------------------- + ! Registers fields for diagnostic output + !----------------------------------------------------------------------- + subroutine initialize_diagnostics( this ) + + use musica_assert, only : assert + use musica_string, only : string_t + use chem_mods, only : phtcnt, & ! number of photolysis reactions + rxt_tag_lst ! labels for all chemical reactions + + type(tuvx_ptr), intent(in) :: this + + type(string_t), allocatable :: labels(:), all_labels(:) + integer :: i_label, i_euv + integer :: ipht + + character(len=2) :: numstr + + if( .not. enable_diagnostics ) then + allocate( diagnostics( 0 ) ) + return + end if + + ! ========================================================== + ! add output for specific photolysis reaction rate constants + ! ========================================================== + labels = this%core_%photolysis_reaction_labels( ) + allocate( all_labels( size( labels ) + this%n_euv_rates_ + this%n_special_rates_ ) ) + + all_labels( 1 : size( labels ) ) = labels(:) + i_label = size( labels ) + + if( do_euv ) then + do i_euv = 1,this%n_euv_rates_ + i_label = i_label + 1 + write(numstr,fmt='(I2)') i_euv + all_labels( i_label ) = "jeuv_"//trim(adjustl(numstr)) + end do + end if + + i_label = i_label + 1 + + if( do_jno ) then + all_labels( i_label ) = "jno" + i_label = i_label + 1 + end if + + call assert( 522515214, i_label == size( all_labels ) + 1 ) + allocate( diagnostics( size( all_labels ) ) ) + do i_label = 1, size( all_labels ) + diagnostics( i_label )%name_ = trim( all_labels( i_label )%to_char( ) ) + diagnostics( i_label )%index_ = i_label + call addfld( "tuvx_"//diagnostics( i_label )%name_, (/ 'lev' /), 'A', 'sec-1', & + trim(diagnostics( i_label )%name_)//' photolysis rate constant' ) + !call add_default("tuvx_"//diagnostics( i_label )%name_, 3, ' ') + end do + + do ipht = 1, phtcnt + call addfld('tuvcam_'//trim(rxt_tag_lst(ipht)), (/ 'lev' /), 'A', 'sec-1', 'photolysis rate constant' ) + end do + + end subroutine initialize_diagnostics + +!================================================================================================ + + !----------------------------------------------------------------------- + ! Sets up a map between the TUV-x and CAM photolysis rate arrays + !----------------------------------------------------------------------- + subroutine set_photo_rate_map( core, config, do_euv, do_jno, jno_index, map ) + + use cam_logfile, only : iulog ! log info output unit + use chem_mods, only : phtcnt, & ! number of photolysis reactions + rxt_tag_lst ! labels for all chemical reactions + ! NOTE photolysis reactions are + ! expected to appear first + use mo_jeuv, only : neuv ! number of extreme-UV rates + use musica_config, only : config_t + use musica_string, only : string_t + + type(core_t), intent(in) :: core ! TUV-x core + type(config_t), intent(inout) :: config ! CAM<->TUV-x map configuration + logical, intent(in) :: do_euv ! indicates whether to include + ! extreme-UV rates in the mapping + logical, intent(out) :: do_jno ! indicates whether jno should be + ! calculated + integer, intent(out) :: jno_index ! index for jno in source photo + ! rate array + type(map_t), intent(out) :: map + + integer :: i_label, i_start, i_end + type(string_t) :: str_label + type(string_t), allocatable :: tuvx_labels(:), euv_labels(:), special_labels(:), & + all_labels(:), cam_labels(:) + + ! ================== + ! MOZART photo rates + ! ================== + allocate( cam_labels( phtcnt ) ) + do i_label = 1, phtcnt + cam_labels( i_label ) = trim( rxt_tag_lst( i_label ) ) + end do + + ! ================= + ! TUV-x photo rates + ! ================= + tuvx_labels = core%photolysis_reaction_labels( ) + + ! ====================== + ! Extreme-UV photo rates + ! ====================== + if( do_euv ) then + allocate( euv_labels( neuv ) ) + do i_label = 1, neuv + str_label = i_label + euv_labels( i_label ) = "jeuv_"//str_label + end do + else + allocate( euv_labels(0) ) + end if + + ! =============================== + ! Special photo rate calculations + ! =============================== + do_jno = .false. + jno_index = 0 + do i_label = 1, size( cam_labels ) + if( cam_labels( i_label ) == "jno" ) then + do_jno = .true. + exit + end if + end do + if( do_jno ) then + allocate( special_labels(1) ) + special_labels(1) = "jno" + else + allocate( special_labels(0) ) + end if + + ! ========================== + ! Combine photo rate sources + ! ========================== + allocate( all_labels( size( tuvx_labels ) + size( euv_labels ) + & + size( special_labels ) ) ) + i_end = 0 + if( size( tuvx_labels ) > 0 ) then + i_start = i_end + 1 + i_end = i_start + size( tuvx_labels ) - 1 + all_labels( i_start : i_end ) = tuvx_labels(:) + end if + if( size( euv_labels ) > 0 ) then + i_start = i_end + 1 + i_end = i_start + size( euv_labels ) - 1 + all_labels( i_start : i_end ) = euv_labels(:) + end if + if( size( special_labels ) > 0 ) then + i_start = i_end + 1 + i_end = i_start + size( special_labels ) - 1 + all_labels( i_start : i_end ) = special_labels(:) + jno_index = i_start + end if + + ! ========== + ! Create map + ! ========== + map = map_t( config, all_labels, cam_labels ) + write(iulog,*) + write(iulog,*) "TUV-x --> CAM-Chem photolysis rate constant map" + call map%print( all_labels, cam_labels, iulog ) + + end subroutine set_photo_rate_map + +!================================================================================================ + + !----------------------------------------------------------------------- + ! Outputs diagnostic information for the current time step + !----------------------------------------------------------------------- + subroutine output_diagnostics( this, ncol, lchnk, photo_rates ) + + type(tuvx_ptr), intent(in) :: this + integer, intent(in) :: ncol ! number of active columns on this thread + integer, intent(in) :: lchnk ! identifier for this thread + real(r8), intent(in) :: photo_rates(:,:,:) ! photo rate constants + ! (column, level, reaction) [s-1] + + integer :: i_diag + + if( .not. enable_diagnostics ) return + + do i_diag = 1, size( diagnostics ) + associate( diag => diagnostics( i_diag ) ) + call outfld( "tuvx_"//diag%name_, photo_rates(:ncol,pver+1:2:-1,diag%index_), & + ncol, lchnk ) + end associate + end do + + end subroutine output_diagnostics + +!================================================================================================ + + !----------------------------------------------------------------------- + ! Creates and loads a grid warehouse with grids that CAM will + ! update at runtime + !----------------------------------------------------------------------- + function get_cam_grids( wavelength_path ) result( grids ) + + use musica_assert, only : assert_msg + use musica_config, only : config_t + use tuvx_grid, only : grid_t + use tuvx_grid_factory, only : grid_builder + use tuvx_grid_from_host, only : grid_from_host_t + use tuvx_grid_warehouse, only : grid_warehouse_t + + character(len=*), intent(in) :: wavelength_path ! path to the wavelength data file + class(grid_warehouse_t), pointer :: grids ! collection of grids to be updated by CAM + + character(len=*), parameter :: my_name = "CAM grid creator" + class(grid_t), pointer :: host_grid + type(config_t) :: config + + grids => grid_warehouse_t( ) + + ! ========================= + ! heights above the surface + ! ========================= + host_grid => grid_from_host_t( "height", "km", pver+1 ) + call grids%add( host_grid ) + deallocate( host_grid ) + + ! ============================================ + ! wavelengths (will not be updated at runtime) + ! ============================================ + call config%empty( ) + call config%add( "type", "from csv file", my_name ) + call config%add( "name", "wavelength", my_name ) + call config%add( "units", "nm", my_name ) + call config%add( "file path", wavelength_path, my_name ) + host_grid => grid_builder( config ) + call grids%add( host_grid ) + deallocate( host_grid ) + + end function get_cam_grids + +!================================================================================================ + + !----------------------------------------------------------------------- + ! Creates and loads a profile warehouse with profiles that CAM + ! will update at runtime + !----------------------------------------------------------------------- + function get_cam_profiles( grids ) result( profiles ) + + use tuvx_grid, only : grid_t + use tuvx_grid_warehouse, only : grid_warehouse_t + use tuvx_profile_from_host, only : profile_from_host_t + use tuvx_profile_warehouse, only : profile_warehouse_t + + class(grid_warehouse_t), intent(in) :: grids ! CAM grids used in TUV-x + class(profile_warehouse_t), pointer :: profiles ! collection of profiles to be updated by CAM + + class(profile_from_host_t), pointer :: host_profile + class(grid_t), pointer :: height, wavelength + + profiles => profile_warehouse_t( ) + height => grids%get_grid( "height", "km" ) + wavelength => grids%get_grid( "wavelength", "nm" ) + + ! ================================== + ! Temperature profile on height grid + ! ================================== + host_profile => profile_from_host_t( "temperature", "K", height%size( ) ) + call profiles%add( host_profile ) + deallocate( host_profile ) + + ! ================================= + ! Surface albedo on wavelength grid + ! ================================= + host_profile => profile_from_host_t( "surface albedo", "none", wavelength%size( ) ) + call profiles%add( host_profile ) + deallocate( host_profile ) + + ! ======================================== + ! Extraterrestrial flux on wavelength grid + ! ======================================== + host_profile => profile_from_host_t( "extraterrestrial flux", "photon cm-2 s-1", & + wavelength%size( ) ) + call profiles%add( host_profile ) + deallocate( host_profile ) + + ! =========== + ! Air profile + ! =========== + host_profile => profile_from_host_t( "air", "molecule cm-3", height%size( ) ) + call profiles%add( host_profile ) + deallocate( host_profile ) + + ! ========== + ! O3 profile + ! ========== + host_profile => profile_from_host_t( "O3", "molecule cm-3", height%size( ) ) + call profiles%add( host_profile ) + deallocate( host_profile ) + + ! ========== + ! O2 profile + ! ========== + host_profile => profile_from_host_t( "O2", "molecule cm-3", height%size( ) ) + call profiles%add( host_profile ) + deallocate( host_profile ) + + deallocate( height ) + deallocate( wavelength ) + + end function get_cam_profiles + +!================================================================================================ + + !----------------------------------------------------------------------- + ! Creates and loads a radiator warehouse with radiators that CAM will + ! update at runtime + !----------------------------------------------------------------------- + function get_cam_radiators( grids ) result( radiators ) + + use tuvx_grid, only : grid_t + use tuvx_grid_warehouse, only : grid_warehouse_t + use tuvx_radiator_from_host, only : radiator_from_host_t + use tuvx_radiator_warehouse, only : radiator_warehouse_t + + type(grid_warehouse_t), intent(in) :: grids ! CAM grids used in TUV-x + class(radiator_warehouse_t), pointer :: radiators ! collection of radiators to be updated by CAM + + class(radiator_from_host_t), pointer :: host_radiator + class(grid_t), pointer :: height, wavelength + + radiators => radiator_warehouse_t( ) + height => grids%get_grid( "height", "km" ) + wavelength => grids%get_grid( "wavelength", "nm" ) + + ! ================ + ! Aerosol radiator + ! ================ + host_radiator => radiator_from_host_t( "aerosol", height, wavelength ) + call radiators%add( host_radiator ) + deallocate( host_radiator ) + + ! ============== + ! Cloud radiator + ! ============== + host_radiator => radiator_from_host_t( "clouds", height, wavelength ) + call radiators%add( host_radiator ) + deallocate( host_radiator ) + + deallocate( height ) + deallocate( wavelength ) + + end function get_cam_radiators + +!================================================================================================ + + !----------------------------------------------------------------------- + ! Forms connections between CAM and TUV-x data structures + ! + ! - creates updaters for each grid and profile that CAM will use + ! to update TUV-x at each timestep. + ! - allocates working arrays when needed for interpolation between + ! grids + ! - initializes CAM modules if necessary and sets parameters needed + ! for runtime access of CAM data + ! + !----------------------------------------------------------------------- + subroutine create_updaters( this, grids, profiles, radiators, disable_aerosols, & + disable_clouds ) + + use ppgrid, only : pcols ! maximum number of columns + use rad_constituents, only : rad_cnst_get_info + use musica_assert, only : assert + use tuvx_grid, only : grid_t + use tuvx_grid_from_host, only : grid_updater_t + use tuvx_grid_warehouse, only : grid_warehouse_t + use tuvx_profile, only : profile_t + use tuvx_profile_from_host, only : profile_updater_t + use tuvx_profile_warehouse, only : profile_warehouse_t + use tuvx_radiator, only : radiator_t + use tuvx_radiator_from_host, only : radiator_updater_t + use tuvx_radiator_warehouse, only : radiator_warehouse_t + + class(tuvx_ptr), intent(inout) :: this + class(grid_warehouse_t), intent(in) :: grids + class(profile_warehouse_t), intent(in) :: profiles + class(radiator_warehouse_t), intent(in) :: radiators + logical, intent(in) :: disable_aerosols + logical, intent(in) :: disable_clouds + + class(grid_t), pointer :: height, wavelength + class(profile_t), pointer :: host_profile + class(radiator_t), pointer :: host_radiator + integer :: n_modes + logical :: found + + ! ============= + ! Grid updaters + ! ============= + + height => grids%get_grid( "height", "km" ) + this%grids_( GRID_INDEX_HEIGHT ) = this%core_%get_updater( height, found ) + call assert( 213798815, found ) + + ! ============================================ + ! wavelength grid cannot be updated at runtime + ! ============================================ + wavelength => grids%get_grid( "wavelength", "nm" ) + this%n_wavelength_bins_ = wavelength%size( ) + allocate( this%wavelength_edges_( this%n_wavelength_bins_ + 1 ) ) + this%wavelength_edges_(:) = wavelength%edge_(:) + + deallocate( height ) + deallocate( wavelength ) + + ! ================ + ! Profile updaters + ! ================ + + host_profile => profiles%get_profile( "temperature", "K" ) + this%profiles_( PROFILE_INDEX_TEMPERATURE ) = this%core_%get_updater( host_profile, found ) + call assert( 418735162, found ) + deallocate( host_profile ) + + host_profile => profiles%get_profile( "surface albedo", "none" ) + this%profiles_( PROFILE_INDEX_ALBEDO ) = this%core_%get_updater( host_profile, found ) + call assert( 720785186, found ) + deallocate( host_profile ) + + host_profile => profiles%get_profile( "extraterrestrial flux", "photon cm-2 s-1" ) + this%profiles_( PROFILE_INDEX_ET_FLUX ) = this%core_%get_updater( host_profile, found ) + call assert( 550628282, found ) + deallocate( host_profile ) + + host_profile => profiles%get_profile( "air", "molecule cm-3" ) + this%profiles_( PROFILE_INDEX_AIR ) = this%core_%get_updater( host_profile, found ) + call assert( 380471378, found ) + deallocate( host_profile ) + + host_profile => profiles%get_profile( "O3", "molecule cm-3" ) + this%profiles_( PROFILE_INDEX_O3 ) = this%core_%get_updater( host_profile, found ) + call assert( 210314474, found ) + deallocate( host_profile ) + + host_profile => profiles%get_profile( "O2", "molecule cm-3" ) + this%profiles_( PROFILE_INDEX_O2 ) = this%core_%get_updater( host_profile, found ) + call assert( 105165970, found ) + deallocate( host_profile ) + + ! ================= + ! radiator updaters + ! ================= + + ! ==================================================================== + ! get an updater for the aerosols + ! ==================================================================== + do_aerosols = .not. disable_aerosols + + host_radiator => radiators%get_radiator( "aerosol" ) + this%radiators_( RADIATOR_INDEX_AEROSOL ) = this%core_%get_updater( host_radiator, found ) + call assert( 675200430, found ) + nullify( host_radiator ) + + ! ===================================== + ! get an updater for the clouds + ! ===================================== + do_clouds = .not. disable_clouds + + host_radiator => radiators%get_radiator( "clouds" ) + this%radiators_( RADIATOR_INDEX_CLOUDS ) = this%core_%get_updater( host_radiator, found ) + call assert( 993715720, found ) + nullify( host_radiator ) + + end subroutine create_updaters + +!================================================================================================ + + !----------------------------------------------------------------------- + ! Sets the height values in TUV-x for the given column + ! + ! NOTE: This function must be called before updating any profile data. + ! + ! CAM to TUV-x height grid mapping + ! + ! TUV-x heights are "bottom-up" and require atmospheric constituent + ! concentrations at interfaces. Therefore, CAM mid-points are used as + ! TUV-x grid interfaces, with an additional layer introduced between + ! the surface and the lowest CAM mid-point, and a layer at the + ! top of the TUV-x grid to hold species densities above the top CAM + ! mid-point. + ! + ! ---- (interface) ===== (mid-point) + ! + ! CAM TUV-x + ! ------(top)------ i_int = 1 -------(top)------ i_int = pver + 2 + ! ************************ (exo values) ***************************** + ! ================== i_mid = pver + 1 + ! ================= i_mid = 1 ------------------ i_int = pver + 1 + ! ----------------- i_int = 2 ================== i_mid = pver + ! ------------------ i_int = pver + ! || + ! || || + ! || + ! ----------------- i_int = pver + ! ================= i_mid = pver ------------------ i_int = 2 + ! ================== i_mid = 1 + ! -----(ground)---- i_int = pver+1 -----(ground)----- i_int = 1 + ! + !----------------------------------------------------------------------- + subroutine set_heights( this, i_col, ncol, height_mid, height_int ) + + use ppgrid, only : pcols ! maximum number of columns + + class(tuvx_ptr), intent(inout) :: this ! TUV-x calculator + integer, intent(in) :: i_col ! column to set conditions for + integer, intent(in) :: ncol ! number of colums to calculated photolysis for + real(r8), intent(in) :: height_mid(ncol,pver) ! height above the surface at mid-points (km) + real(r8), intent(in) :: height_int(ncol,pver+1) ! height above the surface at interfaces (km) + + integer :: i_level + real(r8) :: edges(pver+2) + real(r8) :: mid_points(pver+1) + + edges(1) = height_int(i_col,pver+1) + edges(2:pver+1) = height_mid(i_col,pver:1:-1) + edges(pver+2) = height_int(i_col,1) + mid_points(1) = ( height_mid(i_col,pver) - height_int(i_col,pver+1) ) * 0.5_r8 & + + height_int(i_col,pver+1) + mid_points(2:pver) = height_int(i_col,pver:2:-1) + mid_points(pver+1) = 0.5_r8 * ( edges(pver+1) + edges(pver+2) ) + call this%grids_( GRID_INDEX_HEIGHT )%update( edges = edges, mid_points = mid_points ) + this%height_delta_(1:pver+1) = edges(2:pver+2) - edges(1:pver+1) + + end subroutine set_heights + +!================================================================================================ + + !----------------------------------------------------------------------- + ! Sets the temperatures in TUV-x for the given column + ! + ! See description of `set_heights` for CAM <-> TUV-x vertical grid + ! mapping. + !----------------------------------------------------------------------- + subroutine set_temperatures( this, i_col, temperature_mid, surface_temperature ) + + use ppgrid, only : pcols ! maximum number of columns + + class(tuvx_ptr), intent(inout) :: this ! TUV-x calculator + integer, intent(in) :: i_col ! column to set conditions for + real(r8), intent(in) :: temperature_mid(pcols,pver) ! midpoint temperature (K) + real(r8), intent(in) :: surface_temperature(pcols) ! surface temperature (K) + + real(r8) :: edges(pver+2) + + edges(1) = surface_temperature(i_col) + edges(2:pver+1) = temperature_mid(i_col,pver:1:-1) + edges(pver+2) = temperature_mid(i_col,1) ! Use upper mid-point temperature for top edge + call this%profiles_( PROFILE_INDEX_TEMPERATURE )%update( edge_values = edges ) + + end subroutine set_temperatures + +!================================================================================================ + + !----------------------------------------------------------------------- + ! Sets the surface albedo in TUV-x for the given column + ! + ! CAM uses a single value for surface albedo at all wavelengths + !----------------------------------------------------------------------- + subroutine set_surface_albedo( this, i_col, surface_albedo ) + + use ppgrid, only : pcols ! maximum number of columns + + class(tuvx_ptr), intent(inout) :: this ! TUV-x calculator + integer, intent(in) :: i_col ! column to set conditions for + real(r8), intent(in) :: surface_albedo(pcols) ! surface albedo (unitless) + + real(r8) :: albedos(this%n_wavelength_bins_ + 1) + + albedos(:) = surface_albedo( i_col ) + call this%profiles_( PROFILE_INDEX_ALBEDO )%update( & + edge_values = albedos(:) ) + + end subroutine set_surface_albedo + +!================================================================================================ + + !----------------------------------------------------------------------- + ! Sets the extraterrestrial flux in TUV-x for the given column + ! + ! Extraterrestrial flux is read from data files and interpolated to the + ! TUV-x wavelength grid. CAM ET Flux values are multiplied by the + ! width of the wavelength bins to get the TUV-x units of photon cm-2 s-1 + ! + ! NOTE: TUV-x only uses mid-point values for ET Flux + !----------------------------------------------------------------------- + subroutine set_et_flux( this ) + + use mo_util, only : rebin + use solar_irrad_data, only : nbins, & ! number of wavelength bins + we, & ! wavelength bin edges + sol_etf ! extraterrestrial flux + ! (photon cm-2 nm-1 s-1) + + class(tuvx_ptr), intent(inout) :: this ! TUV-x calculator + + real(r8) :: et_flux_orig(nbins), tuv_mid_values(this%n_wavelength_bins_), & + tuv_edge_values(this%n_wavelength_bins_ + 1) + integer :: i_bin + + ! =============================================== + ! regrid normalized flux to TUV-x wavelength grid + !================================================ + et_flux_orig(:) = sol_etf(:) + call rebin( nbins, this%n_wavelength_bins_, we, this%wavelength_edges_, & + et_flux_orig, tuv_mid_values ) + + ! ======================================================== + ! convert normalized flux to flux on TUV-x wavelength grid + ! ======================================================== + tuv_mid_values(:) = tuv_mid_values(:) * & + ( this%wavelength_edges_(2:this%n_wavelength_bins_+1) - & + this%wavelength_edges_(1:this%n_wavelength_bins_) ) + + ! ==================================== + ! estimate unused edge values for flux + ! ==================================== + tuv_edge_values(1) = tuv_mid_values(1) - & + ( tuv_mid_values(2) - tuv_mid_values(1) ) * 0.5_r8 + do i_bin = 2, this%n_wavelength_bins_ + tuv_edge_values(i_bin) = tuv_mid_values(i_bin-1) + & + ( tuv_mid_values(i_bin) - tuv_mid_values(i_bin-1) ) * 0.5_r8 + end do + tuv_edge_values(this%n_wavelength_bins_+1) = & + tuv_mid_values(this%n_wavelength_bins_) + & + ( tuv_mid_values(this%n_wavelength_bins_) - & + tuv_mid_values(this%n_wavelength_bins_-1) ) * 0.5_r8 + + ! ============================ + ! update TUV-x ET flux profile + ! ============================ + call this%profiles_( PROFILE_INDEX_ET_FLUX )%update( & + mid_point_values = tuv_mid_values, & + edge_values = tuv_edge_values) + + ! ====================================================================== + ! rebin extraterrestrial flux to MS93 grid for use with jno calculations + ! ====================================================================== + call rebin( nbins, NUM_BINS_MS93, we, WAVELENGTH_EDGES_MS93, et_flux_orig, & + this%et_flux_ms93_ ) + + end subroutine set_et_flux + +!================================================================================================ + + !----------------------------------------------------------------------- + ! Sets the profiles of optically active atmospheric constituents + ! in TUV-x for the given column + ! + ! See `set_height` for a description of the CAM <-> TUV-x vertical grid + ! mapping. + ! + ! Above layer densities are calculated using a scale height for air + ! and pre-calculated values for O2 and O3 + !----------------------------------------------------------------------- + subroutine set_radiator_profiles( this, i_col, ncol, fixed_species_conc, species_vmr, & + exo_column_conc, delta_pressure, cloud_fraction, liquid_water_content, & + optical_depth, single_scattering_albedo, asymmetry_factor, & + optical_depth_cld, single_scattering_albedo_cld, asymmetry_factor_cld) + + use chem_mods, only : gas_pcnst, & ! number of non-fixed species + nfs, & ! number of fixed species + nabscol, & ! number of absorbing species (radiators) + indexm ! index for air density in fixed species array + use ppgrid, only : pcols ! maximum number of columns + + class(tuvx_ptr), intent(inout) :: this ! TUV-x calculator + integer, intent(in) :: i_col ! column to set conditions for + integer, intent(in) :: ncol ! number of columns + real(r8), intent(in) :: fixed_species_conc(ncol,pver,max(1,nfs)) ! fixed species densities + ! (molecule cm-3) + real(r8), intent(in) :: species_vmr(ncol,pver,max(1,gas_pcnst)) ! species volume mixing + ! ratios (mol mol-1) + real(r8), intent(in) :: exo_column_conc(ncol,0:pver,max(1,nabscol)) ! above column densities + ! (molecule cm-2) + real(r8), intent(in) :: delta_pressure(ncol,pver) ! pressure delta about midpoints (Pa) + real(r8), intent(in) :: cloud_fraction(ncol,pver) ! cloud fraction (unitless) + real(r8), intent(in) :: liquid_water_content(ncol,pver) ! liquid water content (kg/kg) + real(r8), intent(in) :: optical_depth(pcols, pver+1, this%n_wavelength_bins_) ! aerosol optical depth [unitless] + real(r8), intent(in) :: single_scattering_albedo(pcols, pver+1, this%n_wavelength_bins_) ! single scattering albedo [unitless] + real(r8), intent(in) :: asymmetry_factor(pcols, pver+1, this%n_wavelength_bins_) ! asymmetry factor [unitless] + + real(r8), intent(in) :: optical_depth_cld(pcols, pver+1, this%n_wavelength_bins_) ! aerosol optical depth [unitless] + real(r8), intent(in) :: single_scattering_albedo_cld(pcols, pver+1, this%n_wavelength_bins_) ! single scattering albedo [unitless] + real(r8), intent(in) :: asymmetry_factor_cld(pcols, pver+1, this%n_wavelength_bins_) ! asymmetry factor [unitless] + + integer :: i_level + real(r8) :: tmp(pver) + real(r8) :: tau(pver+1, this%n_wavelength_bins_) + real(r8) :: edges(pver+2), densities(pver+1) + real(r8) :: exo_val + real(r8), parameter :: km2cm = 1.0e5_r8 ! conversion from km to cm + real(r8), parameter :: SCALE_HEIGHT_AIR = 8.01_r8 ! tropopause scale height (km) + real(r8), parameter :: SCALE_HEIGHT_OX = 7._r8 ! ozone and O2 scale height (km) + + ! =========== + ! air profile + ! =========== + edges(1) = fixed_species_conc(i_col,pver,indexm) + edges(2:pver+1) = fixed_species_conc(i_col,pver:1:-1,indexm) + edges(pver+2) = fixed_species_conc(i_col,1,indexm) ! use upper mid-point value for top edge + densities(1:pver+1) = this%height_delta_(1:pver+1) * km2cm * & + sqrt(edges(1:pver+1)) * sqrt(edges(2:pver+2)) + call this%profiles_( PROFILE_INDEX_AIR )%update( & + edge_values = edges, layer_densities = densities, & + scale_height = SCALE_HEIGHT_AIR ) + + ! ========== + ! O2 profile + ! ========== + if( is_fixed_O2 ) then + edges(1) = fixed_species_conc(i_col,pver,index_O2) + edges(2:pver+1) = fixed_species_conc(i_col,pver:1:-1,index_O2) + edges(pver+2) = fixed_species_conc(i_col,1,index_O2) + else if( index_O2 > 0 ) then + edges(1) = species_vmr(i_col,pver,index_O2) * & + fixed_species_conc(i_col,pver,indexm) + edges(2:pver+1) = species_vmr(i_col,pver:1:-1,index_O2) * & + fixed_species_conc(i_col,pver:1:-1,indexm) + edges(pver+2) = species_vmr(i_col,1,index_O2) * & + fixed_species_conc(i_col,1,indexm) + else + edges(:) = 0.0_r8 + end if + densities(1:pver+1) = this%height_delta_(1:pver+1) * km2cm * & + sqrt(edges(1:pver+1)) * sqrt(edges(2:pver+2)) + call this%profiles_( PROFILE_INDEX_O2 )%update( & + edge_values = edges, layer_densities = densities, & + scale_height = SCALE_HEIGHT_OX ) + + ! ========== + ! O3 profile + ! ========== + if( is_fixed_O3 ) then + edges(1) = fixed_species_conc(i_col,pver,index_O3) + edges(2:pver+1) = fixed_species_conc(i_col,pver:1:-1,index_O3) + edges(pver+2) = fixed_species_conc(i_col,1,index_O3) + else if( index_O3 > 0 ) then + edges(1) = species_vmr(i_col,pver,index_O3) * & + fixed_species_conc(i_col,pver,indexm) + edges(2:pver+1) = species_vmr(i_col,pver:1:-1,index_O3) * & + fixed_species_conc(i_col,pver:1:-1,indexm) + edges(pver+2) = species_vmr(i_col,1,index_O3) * & + fixed_species_conc(i_col,1,indexm) + else + edges(:) = 0.0_r8 + end if + if( nabscol >= 1 ) then + densities(1) = 0.5_r8 * exo_column_conc(i_col,pver,1) + densities(2:pver) = 0.5_r8 * ( exo_column_conc(i_col,pver-1:1:-1,1) & + + exo_column_conc(i_col,pver:2:-1,1) ) + densities(pver+1) = exo_column_conc(i_col,0,1) & + + 0.5_r8 * exo_column_conc(i_col,1,1) + call this%profiles_( PROFILE_INDEX_O3 )%update( & + edge_values = edges, layer_densities = densities, & + exo_density = exo_column_conc(i_col,0,1) ) + else + densities(1:pver+1) = this%height_delta_(1:pver+1) * km2cm * & + ( edges(1:pver+1) + edges(2:pver+2) ) * 0.5_r8 + call this%profiles_( PROFILE_INDEX_O3 )%update( & + edge_values = edges, layer_densities = densities, & + scale_height = SCALE_HEIGHT_OX ) + end if + + ! =============== + ! aerosol profile + ! =============== + if( do_aerosols ) then + call this%radiators_( RADIATOR_INDEX_AEROSOL )%update( & + optical_depths = optical_depth(i_col,:,:), & + single_scattering_albedos = single_scattering_albedo(i_col,:,:), & + asymmetry_factors = asymmetry_factor(i_col,:,:) ) + end if + + ! ============= + ! cloud profile + ! ============= + if( do_clouds ) then + call this%radiators_( RADIATOR_INDEX_CLOUDS )%update( & + optical_depths = optical_depth_cld(i_col,:,:), & + single_scattering_albedos = single_scattering_albedo_cld(i_col,:,:), & + asymmetry_factors = asymmetry_factor_cld(i_col,:,:) ) + end if + + end subroutine set_radiator_profiles + +!================================================================================================ + + !----------------------------------------------------------------------- + ! Updates working arrays of aerosol optical properties for all + ! columns from the aerosol package + !----------------------------------------------------------------------- + + subroutine get_aerosol_optical_properties(this, pbuf, ncol, & + optical_depth, single_scattering_albedo, asymmetry_factor, & + optical_depth_cld, single_scattering_albedo_cld, asymmetry_factor_cld) + + class(tuvx_ptr), intent(in) :: this ! TUV-x calculator + type(physics_buffer_desc), pointer :: pbuf(:) + integer, intent(in) :: ncol + + real(r8), intent(out) :: optical_depth(pcols,pver+1,this%n_wavelength_bins_) ! aerosol optical depth [unitless] + real(r8), intent(out) :: single_scattering_albedo(pcols,pver+1,this%n_wavelength_bins_) ! aerosol single scattering albedo [unitless] + real(r8), intent(out) :: asymmetry_factor(pcols,pver+1,this%n_wavelength_bins_) ! aerosol asymmetry factor [unitless] + + real(r8), intent(out) :: optical_depth_cld(pcols,pver+1,this%n_wavelength_bins_) ! aerosol optical depth [unitless] + real(r8), intent(out) :: single_scattering_albedo_cld(pcols,pver+1,this%n_wavelength_bins_) ! aerosol single scattering albedo [unitless] + real(r8), intent(out) :: asymmetry_factor_cld(pcols,pver+1,this%n_wavelength_bins_) ! aerosol asymmetry factor [unitless] + + real(r8), pointer, dimension(:,:,:) :: swaertau ! shortwave aerosol tau (extinction optical depth) + real(r8), pointer, dimension(:,:,:) :: swaertauw ! shortwave aerosol tau * w (extinction optical depth * single scattering albedo) + real(r8), pointer, dimension(:,:,:) :: swaertauwg ! shortwave aerosol tau * w * g (extinction optical depth * single scattering albedo * asymmetry parameter) + + real(r8), pointer, dimension(:,:,:) :: swcldtau ! shortwave cloud tau (extinction optical depth) + real(r8), pointer, dimension(:,:,:) :: swcldtauw ! shortwave cloud tau * w (extinction optical depth * single scattering albedo) + real(r8), pointer, dimension(:,:,:) :: swcldtauwg ! shortwave cloud tau * w * g (extinction optical depth * single scattering albedo * asymmetry parameter) + + real(r8) :: tauaer(pcols, pver, nwave) ! aerosol optical depth on tuvx wavelength band + real(r8) :: waer(pcols, pver, nwave) ! aerosol single scattering albedo on tuvx wavelength band + real(r8) :: gaer(pcols, pver, nwave) ! aerosol asymmetry factor on tuvx wavelength band + + real(r8) :: swaerw(pcols, pver, nswbands) ! aerosol single scattering albedo on radiation wavelength band + real(r8) :: swaerg(pcols, pver, nswbands) ! aerosol asymmetry factor on radiation wavelength band + + real(r8) :: taucld(pcols, pver, nwave) ! cloud optical depth on tuvx wavelength band + real(r8) :: wcld(pcols, pver, nwave) ! cloud single scattering albedo on tuvx wavelength band + real(r8) :: gcld(pcols, pver, nwave) ! cloud asymmetry factor on tuvx wavelength band + + real(r8) :: swcldw(pcols, pver, nswbands) ! cloud single scattering albedo on radiation wavelength band + real(r8) :: swcldg(pcols, pver, nswbands) ! cloud asymmetry factor on radiation wavelength band + + integer :: i,k, kk + + call pbuf_get_field(pbuf, swaertau_idx, swaertau) + call pbuf_get_field(pbuf, swaertauw_idx, swaertauw) + call pbuf_get_field(pbuf, swaertauwg_idx, swaertauwg) + + call pbuf_get_field(pbuf, swcldtau_idx, swcldtau) + call pbuf_get_field(pbuf, swcldtauw_idx, swcldtauw) + call pbuf_get_field(pbuf, swcldtauwg_idx, swcldtauwg) + + ! derive three individual parameters. Need to convert tau*w to w and tau*w*g to g for the radiation code. + where(swaertau .ne. 0._r8) + swaerw = swaertauw / swaertau + elsewhere + swaerw = 1._r8 + end where + + where(swaertauw .ne. 0._r8) + swaerg = swaertauwg / swaertauw + elsewhere + swaerg = 0._r8 + end where + + + where(swcldtau .ne. 0._r8) + swcldw = swcldtauw / swcldtau + elsewhere + swcldw = 1._r8 + end where + + where(swcldtauw .ne. 0._r8) + swcldg = swcldtauwg / swcldtauw + elsewhere + swcldg = 0._r8 + end where + + optical_depth = 0._r8 + single_scattering_albedo = 0._r8 + asymmetry_factor = 0._r8 + + optical_depth_cld = 0._r8 + single_scattering_albedo_cld = 0._r8 + asymmetry_factor_cld = 0._r8 + + ! The CESM wavelengths to the wavelength grid used by TUV. + ! The code linearly interpolate the aerosol properties from the RRTMG band to the TUVx wavelength grid. + ! For wavelength < 200nm, the code copies the aerosol properties at the lowest edge of the RRTMG grid (~200nm) into all the TUV-x bins below 200 nm. + ! This technique is called constant extrapolation or nearest-neighbor fill. + ! The physical assumption is that the optical properties of aerosols don't change dramatically at these very short wavelengths. + do i = 1, ncol + do k = 1, pver + call lininterp(swaertau(i,k,1:nswbands-1), nswbands-1, tauaer(i,k,:), nwave, interp_wgts) + call lininterp(swaerw(i,k,1:nswbands-1), nswbands-1, waer(i,k,:), nwave, interp_wgts) + call lininterp(swaerg(i,k,1:nswbands-1), nswbands-1, gaer(i,k,:), nwave, interp_wgts) + + call lininterp(swcldtau(i,k,1:nswbands-1), nswbands-1, taucld(i,k,:), nwave, interp_wgts) + call lininterp(swcldw(i,k,1:nswbands-1), nswbands-1, wcld(i,k,:), nwave, interp_wgts) + call lininterp(swcldg(i,k,1:nswbands-1), nswbands-1, gcld(i,k,:), nwave, interp_wgts) + + ! invert the vertical dimension to match with TUVx (TUV-x heights are "bottom-up") + kk = pver+1 - k + optical_depth(i,kk,:) = tauaer(i,k,:) + single_scattering_albedo(i,kk,:) = waer(i,k,:) + asymmetry_factor(i,kk,:) = gaer(i,k,:) + + optical_depth_cld(i,kk,:) = taucld(i,k,:) + single_scattering_albedo_cld(i,kk,:) = wcld(i,k,:) + asymmetry_factor_cld(i,kk,:) = gcld(i,k,:) + end do + end do + + end subroutine get_aerosol_optical_properties + +!================================================================================================ + + !----------------------------------------------------------------------- + ! Calculates extreme-UV ionization rates + ! + ! NOTE This never includes an above-column layer + !----------------------------------------------------------------------- + subroutine calculate_euv_rates( solar_zenith_angle, fixed_species_conc, & + species_vmr, height_mid, height_int, euv_rates ) + + use chem_mods, only : gas_pcnst, & ! number of non-fixed species + nfs, & ! number of fixed species + indexm ! index for air density in fixed species array + use mo_jeuv, only : jeuv, neuv ! number of extreme-UV rates + use ref_pres, only : ptop_ref ! pressure at the top of the column (Pa) + + real(r8), intent(in) :: solar_zenith_angle ! degrees + real(r8), intent(in) :: fixed_species_conc(pver,max(1,nfs)) ! fixed species densities + ! (molecule cm-3) + real(r8), intent(in) :: species_vmr(pver,max(1,gas_pcnst)) ! species volume mixing + ! ratios (mol mol-1) + real(r8), intent(in) :: height_mid(pver) ! height at mid-points (km) + real(r8), intent(in) :: height_int(pver+1) ! height at interfaces (km) + real(r8), intent(out) :: euv_rates(pver,neuv) ! calculated extreme-UV rates + + real(r8) :: o_dens(pver), o2_dens(pver), n2_dens(pver) + + ! ========== + ! N2 density + ! ========== + if( is_fixed_N2 ) then + n2_dens(:) = fixed_species_conc(:pver,index_N2) + else + n2_dens(:) = species_vmr(:pver,index_N2) * fixed_species_conc(:pver,indexm) + end if + + ! ========= + ! O density + ! ========= + if( is_fixed_O ) then + o_dens(:) = fixed_species_conc(:pver,index_O) + else + o_dens(:) = species_vmr(:pver,index_O) * fixed_species_conc(:pver,indexm) + end if + + ! ========== + ! O2 density + ! ========== + if( is_fixed_O2 ) then + o2_dens(:) = fixed_species_conc(:pver,index_O2) + else + o2_dens(:) = species_vmr(:pver,index_O2) * fixed_species_conc(:pver,indexm) + end if + + call jeuv( pver, solar_zenith_angle, o_dens, o2_dens, n2_dens, height_mid, & + euv_rates(pver:1:-1,:) ) + + end subroutine calculate_euv_rates + +!================================================================================================ + + !----------------------------------------------------------------------- + ! Calculates NO photolysis rates + ! + ! NOTE: Always includes an above-column layer + !----------------------------------------------------------------------- + subroutine calculate_jno( solar_zenith_angle, et_flux, fixed_species_conc, species_vmr, & + height_int, jno ) + + use chem_mods, only : gas_pcnst, & ! number of non-fixed species + nfs, & ! number of fixed species + indexm ! index for air density in fixed species array + use mo_jshort, only : sphers, slant_col, calc_jno + use ref_pres, only : ptop_ref ! pressure at the top of the column (Pa) + + real(r8), intent(in) :: solar_zenith_angle ! degrees + real(r8), intent(in) :: et_flux(NUM_BINS_MS93) ! extraterrestrial flux MS93 grid + ! (photon cm-2 nm-1 s-1) + real(r8), intent(in) :: fixed_species_conc(pver,max(1,nfs)) ! fixed species densities + ! (molecule cm-3) + real(r8), intent(in) :: species_vmr(pver,max(1,gas_pcnst)) ! species volume mixing + ! ratios (mol mol-1) + real(r8), intent(in) :: height_int(pver+1) ! height at interfaces (km) + real(r8), intent(out) :: jno(pver) ! calculated NO rate + + ! species column densities (molecule cm-3) + real(kind=r8) :: n2_dens(pver+1), o2_dens(pver+1), o3_dens(pver+1), no_dens(pver+1) + ! species slant column densities (molecule cm-2) + real(kind=r8) :: o2_slant(pver+1), o3_slant(pver+1), no_slant(pver+1) + ! working photo rate array + real(kind=r8) :: work_jno(pver+1) + ! parameters needed to calculate slant column densities + ! (see sphers routine description for details) + integer :: nid(pver+1) + real(kind=r8) :: dsdh(0:pver+1,pver+1) + ! layer thickness (cm) + real(kind=r8) :: delz(pver+1) + ! conversion from km to cm + real(kind=r8), parameter :: km2cm = 1.0e5_r8 + + ! ========== + ! N2 density + ! ========== + if( is_fixed_N2 ) then + n2_dens(2:) = fixed_species_conc(:pver,index_N2) + else + n2_dens(2:) = species_vmr(:pver,index_N2) * fixed_species_conc(:pver,indexm) + end if + n2_dens(1) = n2_dens(2) * 0.9_r8 + + ! ========== + ! O2 density + ! ========== + if( is_fixed_O2 ) then + o2_dens(2:) = fixed_species_conc(:pver,index_O2) + else + o2_dens(2:) = species_vmr(:pver,index_O2) * fixed_species_conc(:pver,indexm) + end if + o2_dens(1) = o2_dens(2) * 7.0_r8 / ( height_int(1) - height_int(2) ) + + ! ========== + ! O3 density + ! ========== + if( is_fixed_O3 ) then + o3_dens(2:) = fixed_species_conc(:pver,index_O3) + else + o3_dens(2:) = species_vmr(:pver,index_O3) * fixed_species_conc(:pver,indexm) + end if + o3_dens(1) = o3_dens(2) * 7.0_r8 / ( height_int(1) - height_int(2) ) + + ! ========== + ! NO density + ! ========== + if( is_fixed_NO ) then + no_dens(2:) = fixed_species_conc(:pver,index_NO) + else + no_dens(2:) = species_vmr(:pver,index_NO) * fixed_species_conc(:pver,indexm) + end if + no_dens(1) = no_dens(2) * 0.9_r8 + + ! ================================ + ! calculate slant column densities + ! ================================ + call sphers( pver+1, height_int, solar_zenith_angle, dsdh, nid ) + delz(1:pver) = km2cm * ( height_int(1:pver) - height_int(2:pver+1) ) + call slant_col( pver+1, delz, dsdh, nid, o2_dens, o2_slant ) + call slant_col( pver+1, delz, dsdh, nid, o3_dens, o3_slant ) + call slant_col( pver+1, delz, dsdh, nid, no_dens, no_slant ) + + ! ========================================= + ! calculate the NO photolysis rate constant + ! ========================================= + call calc_jno( pver+1, et_flux, n2_dens, o2_slant, o3_slant, no_slant, work_jno ) + + jno(:pver) = work_jno(:pver) + + end subroutine calculate_jno + +!================================================================================================ + +end module mo_tuvx diff --git a/src/chemistry/mozart/mo_waccm_hrates.F90 b/src/chemistry/mozart/mo_waccm_hrates.F90 index 4f368c749f..322360d94c 100644 --- a/src/chemistry/mozart/mo_waccm_hrates.F90 +++ b/src/chemistry/mozart/mo_waccm_hrates.F90 @@ -25,6 +25,11 @@ module mo_waccm_hrates logical :: has_hrates integer :: ele_temp_ndx, ion_temp_ndx + integer :: cpe_jo2a_ndx = -1 + integer :: cpe_jo2b_ndx = -1 + integer :: cpe_jo3a_ndx = -1 + integer :: cpe_jo3b_ndx = -1 + contains subroutine init_hrates( ) @@ -81,9 +86,34 @@ subroutine init_hrates( ) attr = 'total jo2 euv photolysis rate' call addfld( 'JO2_EUV', (/ 'lev' /), 'I', '/s', trim(attr) ) + attr = 'O2 + hv -> O1D + O3P tuvx photo-chem heating rate' + call addfld( 'QRS_O2A_tuvx', (/ 'lev' /), 'I', 'K/s', trim(attr) ) + attr = 'O2 + hv -> O3P + O3P tuvx photo-chem heating rate' + call addfld( 'QRS_O2B_tuvx', (/ 'lev' /), 'I', 'K/s', trim(attr) ) + attr = 'O3 + hv -> O1D + O2_1S tuvx photo-chem heating rate' + call addfld( 'QRS_O3A_tuvx', (/ 'lev' /), 'I', 'K/s', trim(attr) ) + attr = 'O3 + hv -> O3P + O2 tuvx photo-chem heating rate' + call addfld( 'QRS_O3B_tuvx', (/ 'lev' /), 'I', 'K/s', trim(attr) ) + + + attr = 'O2 + hv -> O1D + O3P table photo-chem heating rate' + call addfld( 'QRS_O2A_tabl', (/ 'lev' /), 'I', 'K/s', trim(attr) ) + attr = 'O2 + hv -> O3P + O3P table photo-chem heating rate' + call addfld( 'QRS_O2B_tabl', (/ 'lev' /), 'I', 'K/s', trim(attr) ) + attr = 'O3 + hv -> O1D + O2_1S table photo-chem heating rate' + call addfld( 'QRS_O3A_tabl', (/ 'lev' /), 'I', 'K/s', trim(attr) ) + attr = 'O3 + hv -> O3P + O2 table photo-chem heating rate' + call addfld( 'QRS_O3B_tabl', (/ 'lev' /), 'I', 'K/s', trim(attr) ) + + ele_temp_ndx = pbuf_get_index('TElec',errcode=err)! electron temperature index ion_temp_ndx = pbuf_get_index('TIon',errcode=err) ! ion temperature index + cpe_jo2a_ndx = pbuf_get_index('CPE_jO2a',errcode=err) + cpe_jo2b_ndx = pbuf_get_index('CPE_jO2b',errcode=err) + cpe_jo3a_ndx = pbuf_get_index('CPE_jO3a',errcode=err) + cpe_jo3b_ndx = pbuf_get_index('CPE_jO3b',errcode=err) + end subroutine init_hrates subroutine waccm_hrates(ncol, state, asdir, bot_mlt_lev, qrs_tot, pbuf ) @@ -124,6 +154,9 @@ subroutine waccm_hrates(ncol, state, asdir, bot_mlt_lev, qrs_tot, pbuf ) use phys_control, only : waccmx_is use orbit, only : zenith + use physconst, only : avogad + use mo_tuvx, only : tuvx_active + !----------------------------------------------------------------------- ! ... dummy arguments !----------------------------------------------------------------------- @@ -161,6 +194,14 @@ subroutine waccm_hrates(ncol, state, asdir, bot_mlt_lev, qrs_tot, pbuf ) real(r8) :: qrl_col(pver,4) ! column thermal heating > 200nm real(r8) :: qrs(ncol,pver,4) ! chunk thermal heating < 200nm real(r8) :: qrl(ncol,pver,4) ! chunk thermal heating > 200nm + + real(r8) :: qr_jo2a_tuvx(ncol,pver) ! heating rates (K/s) + real(r8) :: qr_jo2b_tuvx(ncol,pver) ! heating rates (K/s) + real(r8) :: qr_jo3a_tuvx(ncol,pver) ! heating rates (K/s) + real(r8) :: qr_jo3b_tuvx(ncol,pver) ! heating rates (K/s) + + real(r8) :: hfactor(pver) + real(r8) :: euv_hrate_col(pver) ! column euv thermal heating rate real(r8) :: co2_hrate_col(pver) ! column co2 nir heating rate real(r8) :: euv_hrate(ncol,pver) ! chunk euv thermal heating rate @@ -196,6 +237,11 @@ subroutine waccm_hrates(ncol, state, asdir, bot_mlt_lev, qrs_tot, pbuf ) real(r8), pointer :: ele_temp_fld(:,:) ! electron temperature pointer real(r8), pointer :: ion_temp_fld(:,:) ! ion temperature pointer + real(r8), pointer :: cpe_jo2a(:,:) ! chemical potential energy + real(r8), pointer :: cpe_jo2b(:,:) ! chemical potential energy + real(r8), pointer :: cpe_jo3a(:,:) ! chemical potential energy + real(r8), pointer :: cpe_jo3b(:,:) ! chemical potential energy + if ( ele_temp_ndx>0 .and. ion_temp_ndx>0 ) then call pbuf_get_field(pbuf, ele_temp_ndx, ele_temp_fld) call pbuf_get_field(pbuf, ion_temp_ndx, ion_temp_fld) @@ -204,6 +250,11 @@ subroutine waccm_hrates(ncol, state, asdir, bot_mlt_lev, qrs_tot, pbuf ) ion_temp_fld => state%t endif + if (cpe_jo2a_ndx > 0) call pbuf_get_field(pbuf, cpe_jo2a_ndx, cpe_jo2a) + if (cpe_jo2b_ndx > 0) call pbuf_get_field(pbuf, cpe_jo2b_ndx, cpe_jo2b) + if (cpe_jo3a_ndx > 0) call pbuf_get_field(pbuf, cpe_jo3a_ndx, cpe_jo3a) + if (cpe_jo3b_ndx > 0) call pbuf_get_field(pbuf, cpe_jo3b_ndx, cpe_jo3b) + qrs_tot(:ncol,:) = 0._r8 if (.not. has_hrates) return @@ -343,6 +394,12 @@ subroutine waccm_hrates(ncol, state, asdir, bot_mlt_lev, qrs_tot, pbuf ) qrl(:,k,m) = 0._r8 end do end do + + qr_jo2a_tuvx = 0._r8 + qr_jo2b_tuvx = 0._r8 + qr_jo3a_tuvx = 0._r8 + qr_jo3b_tuvx = 0._r8 + do k = 1,pver euv_hrate(:,k) = 0._r8 co2_hrate(:,k) = 0._r8 @@ -372,18 +429,29 @@ subroutine waccm_hrates(ncol, state, asdir, bot_mlt_lev, qrs_tot, pbuf ) mw(:) = mbar(i,:) cparg(:) = cpair(i,:) do_diag = .false. + call jshort( pver, sza, o2_line, o3_line, o2cc, & o3cc, tline, zarg, mw, qrs_col, & cparg, lchnk, i, co2cc, scco2, do_diag ) - call jlong( pver, sza, eff_alb, parg, tline, & - mw, o2_line, o3_line, colo3, qrl_col, & - cparg, kbot_hrates ) - do m = 1,4 - qrs(i,pver:1:-1,m) = qrs_col(:,m) * esfact - end do - do m = 2,4 - qrl(i,:,m) = qrl_col(:,m) * esfact - end do + + if (tuvx_active) then + hfactor(:) = avogad/(cparg(:)*mw(:)) + qr_jo2a_tuvx(i,:) = cpe_jo2a(i,:) * hfactor(:) * o2_line(:) * esfact + qr_jo2b_tuvx(i,:) = cpe_jo2b(i,:) * hfactor(:) * o2_line(:) * esfact + qr_jo3a_tuvx(i,:kbot_hrates) = cpe_jo3a(i,:kbot_hrates) * hfactor(:kbot_hrates) * o3_line(:kbot_hrates) * esfact + qr_jo3b_tuvx(i,:kbot_hrates) = cpe_jo3b(i,:kbot_hrates) * hfactor(:kbot_hrates) * o3_line(:kbot_hrates) * esfact + else + call jlong( pver, sza, eff_alb, parg, tline, & + mw, o2_line, o3_line, colo3, qrl_col, & + cparg, kbot_hrates ) + do m = 1,4 + qrs(i,pver:1:-1,m) = qrs_col(:,m) * esfact + end do + do m = 2,4 + qrl(i,:,m) = qrl_col(:,m) * esfact + end do + end if + call heuv( pver, sza, occ, o2cc, n2cc, & o_line, o2_line, n2_line, cparg, mw, & zarg, euv_hrate_col, kbot_hrates ) @@ -403,6 +471,8 @@ subroutine waccm_hrates(ncol, state, asdir, bot_mlt_lev, qrs_tot, pbuf ) write(iulog,*) '===================================' #endif co2_hrate(i,:kbot_hrates) = co2_hrate_col(:kbot_hrates) * esfact * daypsec + + end if end do column_loop @@ -414,10 +484,23 @@ subroutine waccm_hrates(ncol, state, asdir, bot_mlt_lev, qrs_tot, pbuf ) call outfld( 'QRS_LO2B', qrl(:,:,2), ncol, lchnk ) call outfld( 'QRS_LO3A', qrl(:,:,3), ncol, lchnk ) call outfld( 'QRS_LO3B', qrl(:,:,4), ncol, lchnk ) + call outfld( 'QRS_LO3', qrl(:,:,3)+qrl(:,:,4), ncol, lchnk ) call outfld( 'QRS_EUV', euv_hrate(:,:), ncol, lchnk ) call outfld( 'QRS_CO2NIR', co2_hrate(:,:), ncol, lchnk ) + if (tuvx_active) then + call outfld( 'QRS_O2A_tuvx', qr_jo2a_tuvx(:ncol,:), ncol, lchnk ) + call outfld( 'QRS_O2B_tuvx', qr_jo2b_tuvx(:ncol,:), ncol, lchnk ) + call outfld( 'QRS_O3A_tuvx', qr_jo3a_tuvx(:ncol,:), ncol, lchnk ) + call outfld( 'QRS_O3B_tuvx', qr_jo3b_tuvx(:ncol,:), ncol, lchnk ) + else + call outfld( 'QRS_O2A_tabl', qrs(:,:,1)+qrl(:,:,1), ncol, lchnk ) + call outfld( 'QRS_O2B_tabl', qrs(:,:,2)+qrl(:,:,2), ncol, lchnk ) + call outfld( 'QRS_O3A_tabl', qrs(:,:,3)+qrl(:,:,3), ncol, lchnk ) + call outfld( 'QRS_O3B_tabl', qrs(:,:,4)+qrl(:,:,4), ncol, lchnk ) + endif + !----------------------------------------------------------------------- ! ... chemical pot heating rate !----------------------------------------------------------------------- @@ -436,7 +519,7 @@ subroutine waccm_hrates(ncol, state, asdir, bot_mlt_lev, qrs_tot, pbuf ) call outfld( 'QRS_AUR', aur_hrate(:,:), ncol, lchnk ) !----------------------------------------------------------------------- -! ... airglow heating rate +! ... airglow heating rate -- for diagnostic output only within airglow !----------------------------------------------------------------------- call airglow( aghrate, vmr(1,1,id_o2_1s), vmr(1,1,id_o2_1d), vmr(1,1,id_o1d), reaction_rates, cpair, & ncol, lchnk ) @@ -444,11 +527,17 @@ subroutine waccm_hrates(ncol, state, asdir, bot_mlt_lev, qrs_tot, pbuf ) !----------------------------------------------------------------------- ! ... form total heating rate !----------------------------------------------------------------------- - do k = 1,kbot_hrates - qrs_tot(:ncol,k) = qrs(:,k,1) + qrs(:,k,2) + qrs(:,k,3) + qrs(:,k,4) & - + qrl(:,k,1) + qrl(:,k,2) + qrl(:,k,3) + qrl(:,k,4) - end do + if (tuvx_active) then + qrs_tot(:ncol,:kbot_hrates) = qr_jo2a_tuvx(:ncol,:kbot_hrates) + qr_jo2b_tuvx(:ncol,:kbot_hrates) & + + qr_jo3a_tuvx(:ncol,:kbot_hrates) + qr_jo3b_tuvx(:ncol,:kbot_hrates) + else + do k = 1,kbot_hrates + qrs_tot(:ncol,k) = qrs(:,k,1) + qrs(:,k,2) + qrs(:,k,3) + qrs(:,k,4) & + + qrl(:,k,1) + qrl(:,k,2) + qrl(:,k,3) + qrl(:,k,4) + end do + end if call outfld( 'QTHERMAL', qrs_tot, pcols, lchnk ) + do k = 1,kbot_hrates qrs_tot(:ncol,k) = qrs_tot(:ncol,k) & + cphrate(:,k) + euv_hrate(:,k) + aur_hrate(:,k) + co2_hrate(:,k) diff --git a/src/chemistry/pp_trop_strat_mam5_ts4/tuvx_config.json b/src/chemistry/pp_trop_strat_mam5_ts4/tuvx_config.json new file mode 100644 index 0000000000..562a1017b3 --- /dev/null +++ b/src/chemistry/pp_trop_strat_mam5_ts4/tuvx_config.json @@ -0,0 +1,1807 @@ +{ + "__description": "TUV-x configuration for the T4S chemical mechanism", + "O2 absorption" : { + "cross section parameters file": "data/cross_sections/O2_parameters.txt" + }, + "grids": [ + ], + "profiles": [ + ], + "radiative transfer": { + "solver": { + "type": "discrete ordinate", + "number of streams": 4 + }, + "cross sections": [ + { + "name": "air", + "type": "air" + }, + { + "name": "O3", + "netcdf files": [ + { "file path": "data/cross_sections/O3_1.nc" }, + { "file path": "data/cross_sections/O3_2.nc" }, + { "file path": "data/cross_sections/O3_3.nc" }, + { "file path": "data/cross_sections/O3_4.nc" } + ], + "type": "O3" + }, + { + "name": "O2", + "netcdf files": [ + { + "file path": "data/cross_sections/O2_1.nc", + "lower extrapolation": { "type": "boundary" }, + "interpolator": { "type": "fractional target" } + } + ], + "type": "base" + } + ], + "radiators": [ + { + "name": "air", + "type": "base", + "treat as air": true, + "cross section": "air", + "vertical profile": "air", + "vertical profile units": "molecule cm-3" + }, + { + "name": "O2", + "type": "base", + "cross section": "O2", + "vertical profile": "O2", + "vertical profile units": "molecule cm-3" + }, + { + "name": "O3", + "type": "base", + "cross section": "O3", + "vertical profile": "O3", + "vertical profile units": "molecule cm-3" + } + ] + }, + "photolysis": { + "reactions": [ + { + "name": "jo2_a", + "__reaction": "O2 + hv -> O + O1D", + "cross section": { + "apply O2 bands": true, + "netcdf files": [ + { + "file path": "data/cross_sections/O2_1.nc", + "lower extrapolation": { "type": "boundary" }, + "interpolator": { "type": "fractional target" } + } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 0, + "override bands": [ + { + "band": "lyman-alpha", + "value": 0.53 + }, + { + "band": "schumann-runge continuum", + "value": 1.0 + } + ] + }, + "heating" : { + "energy term": 175.05 + } + }, + { + "name": "jo2_b", + "__reaction": "O2 + hv -> O + O", + "cross section": { + "apply O2 bands": true, + "netcdf files": [ + { + "file path": "data/cross_sections/O2_1.nc", + "lower extrapolation": { "type": "boundary" }, + "interpolator": { "type": "fractional target" } + } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0, + "override bands": [ + { + "band": "lyman-alpha", + "value": 0.47 + }, + { + "band": "schumann-runge continuum", + "value": 0.0 + } + ] + }, + "heating" : { + "energy term": 242.37 + } + }, + { + "name": "jo3_a", + "__reaction": "O3 + hv -> O2 + O(1D)", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/O3_1.nc" }, + { "file path": "data/cross_sections/O3_2.nc" }, + { "file path": "data/cross_sections/O3_3.nc" }, + { "file path": "data/cross_sections/O3_4.nc" } + ], + "type": "O3" + }, + "quantum yield": { + "type": "O3+hv->O2+O(1D)" + }, + "heating" : { + "energy term": 310.32 + } + }, + { + "name": "jo3_b", + "__reaction": "O3 + hv -> O2 + O(3P)", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/O3_1.nc" }, + { "file path": "data/cross_sections/O3_2.nc" }, + { "file path": "data/cross_sections/O3_3.nc" }, + { "file path": "data/cross_sections/O3_4.nc" } + ], + "type": "O3" + }, + "quantum yield": { + "type": "O3+hv->O2+O(3P)" + }, + "heating" : { + "energy term": 1179.87 + } + }, + { + "name": "jn2o", + "__reaction": "N2O + hv -> N2 + O(1D)", + "cross section": { + "type": "N2O+hv->N2+O(1D)" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jno2", + "__reaction": "NO2 + hv -> NO + O(3P)", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/NO2_1.nc" } + ], + "type": "NO2 tint" + }, + "quantum yield": { + "netcdf files": ["data/quantum_yields/NO2_1.nc"], + "type": "NO2 tint", + "lower extrapolation": { "type": "boundary" } + } + }, + { + "name": "jn2o5_a", + "__reaction": "N2O5 + hv -> NO2 + NO3", + "cross section": { + "type":"temperature based", + "netcdf file": "data/cross_sections/N2O5_JPL06.nc", + "parameterization": { + "type": "HARWOOD", + "aa": [ -18.27, -18.42, -18.59, -18.72, -18.84, + -18.90, -18.93, -18.87, -18.77, -18.71, + -18.31, -18.14, -18.01, -18.42, -18.59, + -18.13 ], + "bb": [ -91.0, -104.0, -112.0, -135.0, -170.0, + -226.0, -294.0, -388.0, -492.0, -583.0, + -770.0, -885.0, -992.0, -949.0, -966.0, + -1160.0 ], + "base temperature": 0.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "minimum wavelength": 260.0, + "maximum wavelength": 410.0, + "temperature ranges": [ + { + "maximum": 199.999999999999, + "fixed value": 200 + }, + { + "minimum": 200, + "maximum": 295 + }, + { + "minimum": 295.00000000001, + "fixed value": 295.0 + } + ] + }, + "parameterization wavelength grid": { + "name": "custom wavelengths", + "type": "from config file", + "units": "nm", + "values": [ + 255.0, 265.0, 275.0, 285.0, 295.0, 305.0, + 315.0, 325.0, 335.0, 345.0, 355.0, 365.0, + 375.0, 385.0, 395.0, 405.0, 415.0 + ] + } + }, + "quantum yield": { + "type": "Taylor series", + "constant value": 0.0, + "coefficients": [ -2.832441, 0.012809638 ], + "override bands": [ + { + "band": "range", + "minimum wavelength": 300.0, + "value": 1.0 + } + ] + } + }, + { + "name": "jn2o5_b", + "__reaction": "N2O5 + hv -> NO + O + NO3", + "cross section": { + "type":"temperature based", + "netcdf file": "data/cross_sections/N2O5_JPL06.nc", + "parameterization": { + "type": "HARWOOD", + "aa": [ -18.27, -18.42, -18.59, -18.72, -18.84, + -18.90, -18.93, -18.87, -18.77, -18.71, + -18.31, -18.14, -18.01, -18.42, -18.59, + -18.13 ], + "bb": [ -91.0, -104.0, -112.0, -135.0, -170.0, + -226.0, -294.0, -388.0, -492.0, -583.0, + -770.0, -885.0, -992.0, -949.0, -966.0, + -1160.0 ], + "base temperature": 0.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "minimum wavelength": 260.0, + "maximum wavelength": 410.0, + "temperature ranges": [ + { + "maximum": 199.999999999999, + "fixed value": 200 + }, + { + "minimum": 200, + "maximum": 295 + }, + { + "minimum": 295.00000000001, + "fixed value": 295.0 + } + ] + }, + "parameterization wavelength grid": { + "name": "custom wavelengths", + "type": "from config file", + "units": "nm", + "values": [ + 255.0, 265.0, 275.0, 285.0, 295.0, 305.0, + 315.0, 325.0, 335.0, 345.0, 355.0, 365.0, + 375.0, 385.0, 395.0, 405.0, 415.0 + ] + } + }, + "quantum yield": { + "type": "Taylor series", + "constant value": 0.0, + "coefficients": [ 3.832441, -0.012809638 ], + "override bands": [ + { + "band": "range", + "minimum wavelength": 300.0, + "value": 0.0 + } + ] + } + }, + { + "name": "jhno3", + "__reaction": "HNO3 + hv -> OH + NO2", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/HNO3_JPL06.nc" } + ], + "type": "HNO3+hv->OH+NO2" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jno3_a", + "__reaction": "NO3 + hv -> NO2 + O(3P)", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/NO3_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "netcdf files": [ + "data/quantum_yields/NO3-NO2+O(3P)_1.nc" + ], + "type": "tint", + "lower extrapolation": { + "type": "constant", + "value": 1.0 + } + } + }, + { + "name": "jno3_b", + "__reaction": "NO3 + hv -> NO + O2", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/NO3_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "netcdf files": [ + "data/quantum_yields/NO3-NO+O2_1.nc" + ], + "type": "tint" + } + }, + { + "name": "jch3ooh", + "__reaction": "CH3OOH + hv -> CH3O + OH", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CH3OOH_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jch2o_a", + "__reaction": "CH2O + hv -> H + HCO", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CH2O_JPL19.nc" } + ], + "type": "CH2O" + }, + "quantum yield": { + "netcdf files": [ + "data/quantum_yields/CH2O_1.nc" + ], + "type": "base", + "lower extrapolation": { + "type": "boundary" + } + } + }, + { + "name": "jch2o_b", + "__reaction": "CH2O + hv -> H2 + CO", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CH2O_JPL19.nc" } + ], + "type": "CH2O" + }, + "quantum yield": { + "netcdf files": [ + "data/quantum_yields/CH2O_1.nc" + ], + "type": "CH2O", + "lower extrapolation": { + "type": "boundary" + } + } + }, + { + "name": "jh2o2", + "__reaction": "H2O2 + hv -> OH + OH", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/H2O2_JPL19.nc" } + ], + "type": "H2O2+hv->OH+OH" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jch3cho", + "__reaction": "CH3CHO + hv -> CH3 + HCO", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CH3CHO_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "netcdf files": [ + "data/quantum_yields/CH3CHO_1.nc" + ], + "type": "CH3CHO+hv->CH3+HCO" + } + }, + { + "name": "jpan", + "__reaction": "PAN + hv -> 0.6*CH3CO3 + 0.6*NO2 + 0.4*CH3O2 + 0.4*NO3 + 0.4*CO2", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/PAN_1.nc" } + ], + "type": "CH3ONO2+hv->CH3O+NO2" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jmvk", + "__reaction": "MVK + hv -> 0.7*C3H6 + 0.7*CO + 0.3*CH3O2 + 0.3*CH3CO3", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/MVK_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "MVK+hv->Products" + } + }, + { + "name": "jacet", + "__reaction": "CH3COCH3 + hv -> CH3CO + CH3", + "cross section": { + "type": "temperature based", + "parameterization": { + "type": "TAYLOR_SERIES", + "netcdf file": { + "file path": "data/cross_sections/ACETONE_JPL06.nc" + }, + "base temperature": 0.0, + "temperature ranges": [ + { + "maximum": 234.999999999999, + "fixed value": 235.0 + }, + { + "minimum": 235.0, + "maximum": 298.0 + }, + { + "minimum": 298.00000000001, + "fixed value": 298.0 + } + ] + } + }, + "quantum yield": { + "type": "CH3COCH3+hv->CH3CO+CH3", + "branch": "CO+CH3CO", + "low wavelength value": 1, + "minimum temperature": 218, + "maximum temperature": 295 + } + }, + { + "name": "jmgly", + "__reaction": "CH3COCHO + hv -> CH3CO3 + CO + HO2", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CH3COCHO_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "CH3COCHO+hv->CH3CO+HCO" + } + }, + { + "name": "jglyald", + "__reaction": "GLYALD + hv -> 2*HO2 + CO + CH2O", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/HOCH2CHO_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 0.5 + } + }, +{ + "name": "jglyoxal", + "__reaction": "GLYOXAL + hv -> 2*CO + 2*HO2", + "__comments": "TODO the products of this reaction don't exactly match", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CHOCHO_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "netcdf files": [ + "data/quantum_yields/CHOCHO-H2_CO_CO_1.nc" + ], + "type": "base", + "lower extrapolation": { + "type": "boundary" + } + } + }, + { + "name": "jbrcl", + "__reaction": "BrCl + hv -> Br + Cl", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/BrCl_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jbro", + "__reaction": "BrO + hv -> Br + O", + "cross section": { + "netcdf files": [ + { + "file path": "data/cross_sections/BRO_JPL06.nc" + } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jbrono2_a", + "__reaction": "BrONO2 + hv -> Br + NO3", + "cross section": { + "type": "temperature based", + "parameterization": { + "type": "TAYLOR_SERIES", + "netcdf file": { + "file path": "data/cross_sections/BRONO2_JPL06.nc" + }, + "base temperature": 296.0, + "temperature ranges": [ + { + "maximum": 199.999999999999, + "fixed value": 200.0 + }, + { + "minimum": 200.0, + "maximum": 296.0 + }, + { + "minimum": 296.00000000001, + "fixed value": 296.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 0.85 + } + }, + { + "name": "jbrono2_b", + "__reaction": "BrONO2 + hv -> BrO + NO2", + "cross section": { + "type": "temperature based", + "parameterization": { + "type": "TAYLOR_SERIES", + "netcdf file": { + "file path": "data/cross_sections/BRONO2_JPL06.nc" + }, + "base temperature": 296.0, + "temperature ranges": [ + { + "maximum": 199.999999999999, + "fixed value": 200.0 + }, + { + "minimum": 200.0, + "maximum": 296.0 + }, + { + "minimum": 296.00000000001, + "fixed value": 296.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 0.15 + } + }, + { + "name": "jccl4", + "__reaction": "CCl4 + hv -> Products", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CCl4_1.nc" } + ], + "type": "CCl4+hv->Products" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcf2clbr", + "__reaction": "CF2BrCl + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CF2BrCl_JPL19.nc", + "parameterization": { + "AA": [ -134.80, 1.7084, -9.1540e-3, 2.1644e-5, -1.9863e-8 ], + "BB": [3.3070e-1, -5.0957e-3, 2.9361e-5, -7.6198e-8, 7.6825e-11 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 200.0, + "maximum wavelength": 302.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210, + "maximum": 300 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcf3br", + "__reaction": "CF3Br + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/H1301_JPL06.nc", + "parameterization": { + "AA": [ 62.563, -2.0068, 1.6592e-2, -5.6465e-5, 6.7459e-8 ], + "BB": [ -9.1755e-1, 1.8575e-2, -1.3857e-4, 4.5066e-7, -5.3803e-10 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 178.0, + "maximum wavelength": 280.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210.0, + "maximum": 300.0 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcfcl3", + "__reaction": "CCl3F + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CFCL3_JPL06.nc", + "parameterization": { + "AA": [ -84.611, 7.9551e-1, -2.0550e-3, -4.4812e-6, 1.5838e-8 ], + "BB": [ -5.7912, 1.1689e-1, -8.8069e-4, 2.9335e-6, -3.6421e-9 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 174.1, + "maximum wavelength": 230.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210, + "maximum": 300 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcfc113", + "__reaction": "CFC-113 + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CFC113_JPL06.nc", + "parameterization": { + "AA": [ -1087.9, 20.004, -1.3920e-1, 4.2828e-4, -4.9384e-7 ], + "BB": [ 12.493, -2.3937e-1, 1.7142e-3, -5.4393e-6, 6.4548e-9 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 182.0, + "maximum wavelength": 230.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210, + "maximum": 300 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcfc114", + "__reaction": "CFC-114 + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CFC114_JPL10.nc", + "parameterization": { + "AA": [ -160.50, 2.4807, -1.5202e-2, 3.8412e-5, -3.4373e-8 ], + "BB": [ -1.5296, 3.5248e-2, -2.9951e-4, 1.1129e-6, -1.5259e-9 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 172.0, + "maximum wavelength": 220.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210, + "maximum": 300 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcfc115", + "__reaction": "CFC-115 + hv -> Products", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/CFC115_JPL10.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcf2cl2", + "__reaction": "CCl2F2 + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CF2CL2_JPL06.nc", + "parameterization": { + "AA": [ -43.8954569, -2.403597e-1, -4.2619e-4, 9.8743e-6, 0.0 ], + "BB": [ 4.8438e-3, 4.96145e-4, -5.6953e-6, 0.0, 0.0 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 200.0, + "maximum wavelength": 231.0, + "base temperature": 296.0, + "base wavelength": 200.0, + "logarithm": "natural", + "temperature ranges": [ + { + "maximum": 219.999999999999, + "fixed value": 220.0 + }, + { + "minimum": 220, + "maximum": 296 + }, + { + "minimum": 296.00000000001, + "fixed value": 296.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jch2br2", + "__reaction": "CH2BR2 + hv -> 2*BR", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CH2BR2_1.nc", + "parameterization": { + "AA": [ -70.211776, 1.940326e-1, 2.726152e-3, -1.695472e-5, 2.500066e-8 ], + "BB": [ 2.899280, -4.327724e-2, 2.391599e-4, -5.807506e-7, 5.244883e-10 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 210.0, + "maximum wavelength": 290.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210, + "maximum": 300 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jch3br", + "__reaction": "CH3Br + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CH3BR_JPL06.nc", + "parameterization": { + "AA": [ 46.520, -1.4580, 1.1469e-2, -3.7627e-5, 4.3264e-8 ], + "BB": [ 9.3408e-1, -1.6887e-2, 1.1487e-4, -3.4881e-7, 3.9945e-10 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 200.0, + "maximum wavelength": 280.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210, + "maximum": 300 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jch3ccl3", + "__reaction": "CH3CCl3+hv->Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CH3CCl3_JPL19.nc", + "parameterization": { + "AA": [ 341.085191, -7.273362, 5.498387e-2, -1.827552e-4, 2.238640e-7 ], + "BB": [ -1.660090, 3.079969e-2, -2.106719e-4, 6.264984e-7, -6.781342e-10 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 182.0, + "maximum wavelength": 240.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210, + "maximum": 300 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jch3cl", + "__reaction": "CH3Cl + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CH3CL_JPL06.nc", + "parameterization": { + "AA": [ -299.80, 5.1047, -3.3630e-2, 9.5805e-5, -1.0135e-7 ], + "BB": [ -7.1727, 1.4837e-1, -1.1463e-3, 3.9188e-6, -4.9994e-9 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 174.1, + "maximum wavelength": 216.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210, + "maximum": 300 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jchbr3", + "__reaction": "CHBr3 + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CHBR3_JPL10.nc", + "parameterization": { + "AA": [ -32.6067, 0.10308, 6.39e-5, -7.7392e-7, -2.2513e-9, 6.1376e-12 ], + "BB": [ 0.1582, -0.0014758, 3.8058e-6, 9.187e-10, -1.0772e-11, 0.0 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0, 5.0 ], + "minimum wavelength": 260.0, + "maximum wavelength": 362.0, + "base temperature": 296.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "invert temperature offset": true, + "temperature ranges": [ + { + "maximum": 259.999999999999, + "fixed value": 260.0 + }, + { + "minimum": 260.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcl2", + "__reaction": "Cl2 + hv -> Cl + Cl", + "cross section": { + "type": "Cl2+hv->Cl+Cl" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcl2o2", + "__reaction": "ClOOCl + hv -> Cl + ClOO", + "__comments": "TODO - this doesn't exactly match the products in TS1", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CL2O2_JPL10.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jclo", + "__reaction": "ClO + hv -> Cl + O", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CLO_JPL06.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jclono2_a", + "__reaction": "ClONO2 + hv -> Cl + NO3", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/ClONO2_1.nc" } + ], + "type": "ClONO2" + }, + "quantum yield": { + "type": "ClONO2+hv->Cl+NO3" + } + }, + { + "name": "jclono2_b", + "__reaction": "ClONO2 + hv -> ClO + NO2", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/ClONO2_1.nc" } + ], + "type": "ClONO2" + }, + "quantum yield": { + "type": "ClONO2+hv->ClO+NO2" + } + }, + { + "name": "jh2402", + "__reaction": "H2402 + hv -> 2*BR + 2*COF2", + "__comments": "TUV data set name CF2BrCF2Br", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/H2402_JPL06.nc", + "parameterization": { + "AA": [ 34.026, -1.152616, 8.959798e-3, -2.9089e-5, 3.307212e-8 ], + "BB": [ 4.010664e-1, -8.358968e-3, 6.415741e-5, -2.157554e-7, 2.691871e-10 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 190.0, + "maximum wavelength": 290.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210.0, + "maximum": 300.0 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhcfc141b", + "__reaction": "HCFC-141b + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/HCFC141b_JPL10.nc", + "parameterization": { + "AA": [ -682.913042, 12.122290, -8.187699e-2, 2.437244e-4, -2.719103e-7 ], + "BB": [ 4.074747, -8.053899e-2, 5.946552e-4, -1.945048e-6, 2.380143e-9 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 172.0, + "maximum wavelength": 240.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210.0, + "maximum": 300.0 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhcfc142b", + "__reaction": "HCFC-142b + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/HCFC142b_JPL10.nc", + "parameterization": { + "AA": [ -328.092008, 6.342799, -4.810362e-2, 1.611991e-4, -2.042613e-7 ], + "BB": [ 4.289533e-1, -9.042817e-3, 7.018009e-5, -2.389064e-7, 3.039799e-10 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 172.0, + "maximum wavelength": 230.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210.0, + "maximum": 300.0 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhcfc22", + "__reaction": "HCFC-22 + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/HCFC22_JPL06.nc", + "parameterization wavelength grid": { + "name": "custom wavelengths", + "type": "from config file", + "units": "nm", + "values": [ + 169.0, 171.0, 173.0, 175.0, 177.0, 179.0, 181.0, 183.0, 185.0, + 187.0, 189.0, 191.0, 193.0, 195.0, 197.0, 199.0, 201.0, 203.0, + 205.0, 207.0, 209.0, 211.0, 213.0, 215.0, 217.0, 219.0, 221.0 + ] + }, + "parameterization": { + "AA": [ -106.029, 1.5038, -8.2476e-3, 1.4206e-5 ], + "BB": [ -1.3399e-1, 2.7405e-3, -1.8028e-5, 3.8504e-8 ], + "lp": [ 0.0, 1.0, 2.0, 3.0 ], + "minimum wavelength": 174.0, + "maximum wavelength": 204.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210.0, + "maximum": 300.0 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhcl", + "__reaction": "HCl + hv -> H + Cl", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/HCl_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhobr", + "__reaction": "HOBr + hv -> OH + Br", + "cross section": { + "type": "HOBr+hv->OH+Br" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhocl", + "__reaction": "HOCl + hv -> HO + Cl", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/HOCl_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "joclo", + "__reaction": "OClO + hv -> Products", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/OClO_1.nc" }, + { "file path": "data/cross_sections/OClO_2.nc" }, + { "file path": "data/cross_sections/OClO_3.nc" } + ], + "type": "OClO+hv->Products" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jho2no2_a", + "__reaction": "HNO4 + hv -> OH + NO3", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/HO2NO2_JPL06.nc", + "parameterization": { + "type": "BURKHOLDER", + "netcdf file": { + "file path": "data/cross_sections/HO2NO2_temp_JPL06.nc" + }, + "A": -988.0, + "B": 0.69, + "temperature ranges": [ + { + "maximum": 279.999999999999, + "fixed value": 280.0 + }, + { + "minimum": 280.0, + "maximum": 350.0 + }, + { + "minimum": 350.00000000001, + "fixed value": 350.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 0.30, + "override bands": [ + { + "band": "range", + "minimum wavelength": 200.0, + "value": 0.20 + } + ] + } + }, + { + "name": "jho2no2_b", + "__reaction": "HNO4 + hv -> HO2 + NO2", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/HO2NO2_JPL06.nc", + "parameterization": { + "type": "BURKHOLDER", + "netcdf file": { + "file path": "data/cross_sections/HO2NO2_temp_JPL06.nc" + }, + "A": -988.0, + "B": 0.69, + "temperature ranges": [ + { + "maximum": 279.999999999999, + "fixed value": 280.0 + }, + { + "minimum": 280.0, + "maximum": 350.0 + }, + { + "minimum": 350.00000000001, + "fixed value": 350.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 0.70, + "override bands": [ + { + "band": "range", + "minimum wavelength": 200.0, + "value": 0.80 + } + ] + } + }, + { + "name": "jmacr_a", + "__reaction": "CH2=C(CH3)CHO->1.34HO2+0.66MCO3+1.34CH2O+CH3CO3", + "__comments": "Methacrolein photolysis channel 1", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/Methacrolein_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 0.005 + } + }, + { + "name": "jmacr_b", + "__reaction": "CH2=C(CH3)CHO->0.66OH+1.34CO", + "__comments": "Methacrolein photolysis channel 2", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/Methacrolein_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 0.005 + } + }, + { + "name": "jhyac", + "__reaction": "CH2(OH)COCH3->CH3CO3+HO2+CH2O", + "__comments": "hydroxy acetone TODO: the products of this reaction differ from standalone TUV-x", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/Hydroxyacetone_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 0.65 + } + }, + { + "name": "jh2o_a", + "__reaction": "H2O + hv -> OH + H", + "cross section": { + "type": "base", + "merge data": true, + "netcdf files": [ + { + "file path": "data/cross_sections/H2O_1.nc", + "zero above": 183.0 + }, + { + "file path": "data/cross_sections/H2O_2.nc", + "zero below": 183.00000000001, + "zero above": 190.0 + }, + { + "file path": "data/cross_sections/H2O_3.nc", + "zero below": 190.00000000001 + } + ] + }, + "quantum yield" : { + "type": "base", + "netcdf files": [ "data/quantum_yields/H2O_H_OH.nc" ] + } + }, + { + "name": "jh2o_b", + "__reaction": "H2O + hv -> H2 + O1D", + "cross section": { + "type": "base", + "merge data": true, + "netcdf files": [ + { + "file path": "data/cross_sections/H2O_1.nc", + "zero above": 183.0 + }, + { + "file path": "data/cross_sections/H2O_2.nc", + "zero below": 183.00000000001, + "zero above": 190.0 + }, + { + "file path": "data/cross_sections/H2O_3.nc", + "zero below": 190.00000000001 + } + ] + }, + "quantum yield" : { + "type": "base", + "netcdf files": [ "data/quantum_yields/H2O_H2_O1D.nc" ] + } + }, + { + "name": "jh2o_c", + "__reaction": "H2O + hv -> 2*H + O", + "cross section": { + "type": "base", + "merge data": true, + "netcdf files": [ + { + "file path": "data/cross_sections/H2O_1.nc", + "zero above": 183.0 + }, + { + "file path": "data/cross_sections/H2O_2.nc", + "zero below": 183.00000000001, + "zero above": 190.0 + }, + { + "file path": "data/cross_sections/H2O_3.nc", + "zero below": 190.00000000001 + } + ] + }, + "quantum yield" : { + "type": "base", + "netcdf files": [ "data/quantum_yields/H2O_2H_O3P.nc" ] + } + }, + { + "name": "jch4_a", + "__reaction": "CH4 + hv -> H + CH3O2", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/CH4_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 0.45 + } + }, + { + "name": "jch4_b", + "__reaction": "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", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/CH4_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 0.55 + } + }, + { + "name": "jco2", + "__reaction": "CO2 + hv -> CO + O", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/CO2_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhbr", + "__reaction": "HBR + hv -> BR + H", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/HBr_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhf", + "__reaction": "HF + hv -> H + F", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/HF_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jsf6", + "__reaction": "SF6 + hv -> sink", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/SF6_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jh2so4", + "__reaction": "H2SO4 + hv -> SO3 + H2O", + "cross section": { + "type": "base", + "data": { + "default value": 0.0, + "point values": [ + { "wavelength": 121.65, "value": 6.3e-17 }, + { "wavelength": 525.0, "value": 1.43e-26 }, + { "wavelength": 625.0, "value": 1.8564e-25 }, + { "wavelength": 725.0, "value": 3.086999e-24 } + ] + } + }, + "quantum yield": { + "type": "H2SO4 Mills", + "netcdf files": [ + "data/quantum_yields/H2SO4_mills.nc" + ], + "parameterized wavelengths": [ + 525, + 625, + 725 + ], + "collision interval s": [ + 1.1e-9, + 8.9e-9, + 1.7e-7 + ], + "molecular diameter m": 4.18e-10, + "molecular weight kg mol-1": 98.078479e-3 + } + }, + { + "name": "jocs", + "__reaction": "OCS + hv -> S + CO", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/OCS_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jso", + "__reaction": "SO + hv -> S + O", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/SO_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jso2", + "__reaction": "SO2 + hv -> SO + O", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/SO2_Mills.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jso3", + "__reaction": "SO3 + hv -> SO2 + O", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/SO3_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + } + ] + }, + "__CAM options": { + "aliasing": { + "default matching": "backup", + "pairs": [ + { + "to": "jpooh", + "__reaction": "POOH (C3H6OHOOH) + hv -> CH3CHO + CH2O + HO2 + OH", + "from": "jch3ooh" + }, + { + "to": "jch3co3h", + "__reaction": "CH3COOOH + hv -> CH3O2 + OH + CO2", + "from": "jh2o2", + "scale by": 0.28 + }, + { + "to": "jmpan", + "__reaction": "MPAN + hv -> MCO3 + NO2", + "from": "jpan" + }, + { + "to": "jc2h5ooh", + "__reaction": "C2H5OOH + hv -> CH3CHO + HO2 + OH", + "from": "jch3ooh" + }, + { + "to": "jc3h7ooh", + "__reaction": "C3H7OOH + hv -> 0.82*CH3COCH3 + OH + HO2", + "from": "jch3ooh" + }, + { + "to": "jeooh", + "__reaction": "EOOH + hv -> EO + OH", + "from": "jch3ooh" + }, + { + "to": "jrooh", + "__reaction": "ROOH + hv -> CH3CO3 + CH2O + OH", + "from": "jch3ooh" + }, + { + "to": "jxooh", + "__reaction": "XOOH + hv -> OH", + "from": "jch3ooh" + }, + { + "to": "jonitr", + "__reaction": "ONITR + hv -> NO2", + "from": "jch3cho" + }, + { + "to": "jisopooh", + "__reaction": "ISOPOOH + hv -> 0.402*MVK + 0.288*MACR + 0.69*CH2O + HO2", + "from": "jch3ooh" + }, + { + "to": "jnoa", + "__reaction": "NOA + hv -> NO2 + CH2O + CH3CO3", + "from": "jch2o_a" + }, + { + "to": "jsoa_a1", + "__reaction": "soa_a1 + hv -> Products", + "from": "jno2", + "scale by": 0.0004 + }, + { + "to": "jsoa_a2", + "__reaction": "soa_a2 + hv -> Products", + "from": "jno2", + "scale by": 0.0004 + } + ] + } + } +} diff --git a/src/chemistry/pp_waccm_ma/tuvx_config.json b/src/chemistry/pp_waccm_ma/tuvx_config.json new file mode 100644 index 0000000000..63afc2f9c5 --- /dev/null +++ b/src/chemistry/pp_waccm_ma/tuvx_config.json @@ -0,0 +1,1482 @@ +{ + "__description": "TUV-x configuration for waccm_ma chemical mechanism", + "O2 absorption" : { + "cross section parameters file": "data/cross_sections/O2_parameters.txt" + }, + "grids": [ + ], + "profiles": [ + ], + "radiative transfer": { + "solver": { + "type": "discrete ordinate", + "number of streams": 4 + }, + "cross sections": [ + { + "name": "air", + "type": "air" + }, + { + "name": "O3", + "netcdf files": [ + { "file path": "data/cross_sections/O3_1.nc" }, + { "file path": "data/cross_sections/O3_2.nc" }, + { "file path": "data/cross_sections/O3_3.nc" }, + { "file path": "data/cross_sections/O3_4.nc" } + ], + "type": "O3" + }, + { + "name": "O2", + "netcdf files": [ + { + "file path": "data/cross_sections/O2_1.nc", + "lower extrapolation": { "type": "boundary" }, + "interpolator": { "type": "fractional target" } + } + ], + "type": "base" + } + ], + "radiators": [ + { + "name": "air", + "type": "base", + "treat as air": true, + "cross section": "air", + "vertical profile": "air", + "vertical profile units": "molecule cm-3" + }, + { + "name": "O2", + "type": "base", + "cross section": "O2", + "vertical profile": "O2", + "vertical profile units": "molecule cm-3" + }, + { + "name": "O3", + "type": "base", + "cross section": "O3", + "vertical profile": "O3", + "vertical profile units": "molecule cm-3" + } + ] + }, + "photolysis": { + "reactions": [ + { + "name": "jo2_a", + "__reaction": "O2 + hv -> O + O1D", + "cross section": { + "apply O2 bands": true, + "netcdf files": [ + { + "file path": "data/cross_sections/O2_1.nc", + "lower extrapolation": { "type": "boundary" }, + "interpolator": { "type": "fractional target" } + } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 0, + "override bands": [ + { + "band": "lyman-alpha", + "value": 0.53 + }, + { + "band": "schumann-runge continuum", + "value": 1.0 + } + ] + }, + "heating" : { + "energy term": 175.05 + } + }, + { + "name": "jo2_b", + "__reaction": "O2 + hv -> O + O", + "cross section": { + "apply O2 bands": true, + "netcdf files": [ + { + "file path": "data/cross_sections/O2_1.nc", + "lower extrapolation": { "type": "boundary" }, + "interpolator": { "type": "fractional target" } + } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0, + "override bands": [ + { + "band": "lyman-alpha", + "value": 0.47 + }, + { + "band": "schumann-runge continuum", + "value": 0.0 + } + ] + }, + "heating" : { + "energy term": 242.37 + } + }, + { + "name": "jo3_a", + "__reaction": "O3 + hv -> O2 + O(1D)", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/O3_1.nc" }, + { "file path": "data/cross_sections/O3_2.nc" }, + { "file path": "data/cross_sections/O3_3.nc" }, + { "file path": "data/cross_sections/O3_4.nc" } + ], + "type": "O3" + }, + "quantum yield": { + "type": "O3+hv->O2+O(1D)" + }, + "heating" : { + "energy term": 310.32 + } + }, + { + "name": "jo3_b", + "__reaction": "O3 + hv -> O2 + O(3P)", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/O3_1.nc" }, + { "file path": "data/cross_sections/O3_2.nc" }, + { "file path": "data/cross_sections/O3_3.nc" }, + { "file path": "data/cross_sections/O3_4.nc" } + ], + "type": "O3" + }, + "quantum yield": { + "type": "O3+hv->O2+O(3P)" + }, + "heating" : { + "energy term": 1179.87 + } + }, + { + "name": "jn2o", + "__reaction": "N2O + hv -> N2 + O(1D)", + "cross section": { + "type": "N2O+hv->N2+O(1D)" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jno2", + "__reaction": "NO2 + hv -> NO + O(3P)", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/NO2_1.nc" } + ], + "type": "NO2 tint" + }, + "quantum yield": { + "netcdf files": ["data/quantum_yields/NO2_1.nc"], + "type": "NO2 tint", + "lower extrapolation": { "type": "boundary" } + } + }, + { + "name": "jn2o5_a", + "__reaction": "N2O5 + hv -> NO2 + NO3", + "cross section": { + "type":"temperature based", + "netcdf file": "data/cross_sections/N2O5_JPL06.nc", + "parameterization": { + "type": "HARWOOD", + "aa": [ -18.27, -18.42, -18.59, -18.72, -18.84, + -18.90, -18.93, -18.87, -18.77, -18.71, + -18.31, -18.14, -18.01, -18.42, -18.59, + -18.13 ], + "bb": [ -91.0, -104.0, -112.0, -135.0, -170.0, + -226.0, -294.0, -388.0, -492.0, -583.0, + -770.0, -885.0, -992.0, -949.0, -966.0, + -1160.0 ], + "base temperature": 0.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "minimum wavelength": 260.0, + "maximum wavelength": 410.0, + "temperature ranges": [ + { + "maximum": 199.999999999999, + "fixed value": 200 + }, + { + "minimum": 200, + "maximum": 295 + }, + { + "minimum": 295.00000000001, + "fixed value": 295.0 + } + ] + }, + "parameterization wavelength grid": { + "name": "custom wavelengths", + "type": "from config file", + "units": "nm", + "values": [ + 255.0, 265.0, 275.0, 285.0, 295.0, 305.0, + 315.0, 325.0, 335.0, 345.0, 355.0, 365.0, + 375.0, 385.0, 395.0, 405.0, 415.0 + ] + } + }, + "quantum yield": { + "type": "Taylor series", + "constant value": 0.0, + "coefficients": [ -2.832441, 0.012809638 ], + "override bands": [ + { + "band": "range", + "minimum wavelength": 300.0, + "value": 1.0 + } + ] + } + }, + { + "name": "jn2o5_b", + "__reaction": "N2O5 + hv -> NO + O + NO3", + "cross section": { + "type":"temperature based", + "netcdf file": "data/cross_sections/N2O5_JPL06.nc", + "parameterization": { + "type": "HARWOOD", + "aa": [ -18.27, -18.42, -18.59, -18.72, -18.84, + -18.90, -18.93, -18.87, -18.77, -18.71, + -18.31, -18.14, -18.01, -18.42, -18.59, + -18.13 ], + "bb": [ -91.0, -104.0, -112.0, -135.0, -170.0, + -226.0, -294.0, -388.0, -492.0, -583.0, + -770.0, -885.0, -992.0, -949.0, -966.0, + -1160.0 ], + "base temperature": 0.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "minimum wavelength": 260.0, + "maximum wavelength": 410.0, + "temperature ranges": [ + { + "maximum": 199.999999999999, + "fixed value": 200 + }, + { + "minimum": 200, + "maximum": 295 + }, + { + "minimum": 295.00000000001, + "fixed value": 295.0 + } + ] + }, + "parameterization wavelength grid": { + "name": "custom wavelengths", + "type": "from config file", + "units": "nm", + "values": [ + 255.0, 265.0, 275.0, 285.0, 295.0, 305.0, + 315.0, 325.0, 335.0, 345.0, 355.0, 365.0, + 375.0, 385.0, 395.0, 405.0, 415.0 + ] + } + }, + "quantum yield": { + "type": "Taylor series", + "constant value": 0.0, + "coefficients": [ 3.832441, -0.012809638 ], + "override bands": [ + { + "band": "range", + "minimum wavelength": 300.0, + "value": 0.0 + } + ] + } + }, + { + "name": "jhno3", + "__reaction": "HNO3 + hv -> OH + NO2", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/HNO3_JPL06.nc" } + ], + "type": "HNO3+hv->OH+NO2" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jno3_a", + "__reaction": "NO3 + hv -> NO2 + O(3P)", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/NO3_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "netcdf files": [ + "data/quantum_yields/NO3-NO2+O(3P)_1.nc" + ], + "type": "tint", + "lower extrapolation": { + "type": "constant", + "value": 1.0 + } + } + }, + { + "name": "jno3_b", + "__reaction": "NO3 + hv -> NO + O2", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/NO3_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "netcdf files": [ + "data/quantum_yields/NO3-NO+O2_1.nc" + ], + "type": "tint" + } + }, + { + "name": "jch3ooh", + "__reaction": "CH3OOH + hv -> CH3O + OH", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CH3OOH_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jch2o_a", + "__reaction": "CH2O + hv -> H + HCO", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CH2O_1.nc" } + ], + "type": "CH2O" + }, + "quantum yield": { + "netcdf files": [ + "data/quantum_yields/CH2O_1.nc" + ], + "type": "base", + "lower extrapolation": { + "type": "boundary" + } + } + }, + { + "name": "jch2o_b", + "__reaction": "CH2O + hv -> H2 + CO", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CH2O_1.nc" } + ], + "type": "CH2O" + }, + "quantum yield": { + "netcdf files": [ + "data/quantum_yields/CH2O_1.nc" + ], + "type": "CH2O", + "lower extrapolation": { + "type": "boundary" + } + } + }, + { + "name": "jh2o2", + "__reaction": "H2O2 + hv -> OH + OH", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/H2O2_1.nc" } + ], + "type": "H2O2+hv->OH+OH" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jbrcl", + "__reaction": "BrCl + hv -> Br + Cl", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/BrCl_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jbro", + "__reaction": "BrO + hv -> Br + O", + "cross section": { + "netcdf files": [ + { + "file path": "data/cross_sections/BRO_JPL06.nc" + } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jbrono2_a", + "__reaction": "BrONO2 + hv -> Br + NO3", + "cross section": { + "type": "temperature based", + "parameterization": { + "type": "TAYLOR_SERIES", + "netcdf file": { + "file path": "data/cross_sections/BRONO2_JPL06.nc" + }, + "base temperature": 296.0, + "temperature ranges": [ + { + "maximum": 199.999999999999, + "fixed value": 200.0 + }, + { + "minimum": 200.0, + "maximum": 296.0 + }, + { + "minimum": 296.00000000001, + "fixed value": 296.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 0.85 + } + }, + { + "name": "jbrono2_b", + "__reaction": "BrONO2 + hv -> BrO + NO2", + "cross section": { + "type": "temperature based", + "parameterization": { + "type": "TAYLOR_SERIES", + "netcdf file": { + "file path": "data/cross_sections/BRONO2_JPL06.nc" + }, + "base temperature": 296.0, + "temperature ranges": [ + { + "maximum": 199.999999999999, + "fixed value": 200.0 + }, + { + "minimum": 200.0, + "maximum": 296.0 + }, + { + "minimum": 296.00000000001, + "fixed value": 296.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 0.15 + } + }, + { + "name": "jccl4", + "__reaction": "CCl4 + hv -> Products", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CCl4_1.nc" } + ], + "type": "CCl4+hv->Products" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcf2clbr", + "__reaction": "CF2BrCl + hv -> Products", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CF2BrCl_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcf3br", + "__reaction": "CF3Br + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/H1301_JPL06.nc", + "parameterization": { + "AA": [ 62.563, -2.0068, 1.6592e-2, -5.6465e-5, 6.7459e-8 ], + "BB": [ -9.1755e-1, 1.8575e-2, -1.3857e-4, 4.5066e-7, -5.3803e-10 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 178.0, + "maximum wavelength": 280.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210.0, + "maximum": 300.0 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcfcl3", + "__reaction": "CCl3F + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CFCL3_JPL06.nc", + "parameterization": { + "AA": [ -84.611, 7.9551e-1, -2.0550e-3, -4.4812e-6, 1.5838e-8 ], + "BB": [ -5.7912, 1.1689e-1, -8.8069e-4, 2.9335e-6, -3.6421e-9 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 174.1, + "maximum wavelength": 230.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210, + "maximum": 300 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcfc113", + "__reaction": "CFC-113 + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CFC113_JPL06.nc", + "parameterization": { + "AA": [ -1087.9, 20.004, -1.3920e-1, 4.2828e-4, -4.9384e-7 ], + "BB": [ 12.493, -2.3937e-1, 1.7142e-3, -5.4393e-6, 6.4548e-9 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 182.0, + "maximum wavelength": 230.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210, + "maximum": 300 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcfc114", + "__reaction": "CFC-114 + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CFC114_JPL10.nc", + "parameterization": { + "AA": [ -160.50, 2.4807, -1.5202e-2, 3.8412e-5, -3.4373e-8 ], + "BB": [ -1.5296, 3.5248e-2, -2.9951e-4, 1.1129e-6, -1.5259e-9 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 172.0, + "maximum wavelength": 220.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210, + "maximum": 300 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcfc115", + "__reaction": "CFC-115 + hv -> Products", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/CFC115_JPL10.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcf2cl2", + "__reaction": "CCl2F2 + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CF2CL2_JPL06.nc", + "parameterization": { + "AA": [ -43.8954569, -2.403597e-1, -4.2619e-4, 9.8743e-6, 0.0 ], + "BB": [ 4.8438e-3, 4.96145e-4, -5.6953e-6, 0.0, 0.0 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 200.0, + "maximum wavelength": 231.0, + "base temperature": 296.0, + "base wavelength": 200.0, + "logarithm": "natural", + "temperature ranges": [ + { + "maximum": 219.999999999999, + "fixed value": 220.0 + }, + { + "minimum": 220, + "maximum": 296 + }, + { + "minimum": 296.00000000001, + "fixed value": 296.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jch2br2", + "__reaction": "CH2BR2 + hv -> 2*BR", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CH2BR2_1.nc", + "parameterization": { + "AA": [ -70.211776, 1.940326e-1, 2.726152e-3, -1.695472e-5, 2.500066e-8 ], + "BB": [ 2.899280, -4.327724e-2, 2.391599e-4, -5.807506e-7, 5.244883e-10 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 210.0, + "maximum wavelength": 290.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210, + "maximum": 300 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jch3br", + "__reaction": "CH3Br + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CH3BR_JPL06.nc", + "parameterization": { + "AA": [ 46.520, -1.4580, 1.1469e-2, -3.7627e-5, 4.3264e-8 ], + "BB": [ 9.3408e-1, -1.6887e-2, 1.1487e-4, -3.4881e-7, 3.9945e-10 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 200.0, + "maximum wavelength": 280.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210, + "maximum": 300 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jch3ccl3", + "__reaction": "CH3CCl3+hv->Products", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CH3CCl3_1.nc" } + ], + "type": "tint" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jch3cl", + "__reaction": "CH3Cl + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CH3CL_JPL06.nc", + "parameterization": { + "AA": [ -299.80, 5.1047, -3.3630e-2, 9.5805e-5, -1.0135e-7 ], + "BB": [ -7.1727, 1.4837e-1, -1.1463e-3, 3.9188e-6, -4.9994e-9 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 174.1, + "maximum wavelength": 216.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210, + "maximum": 300 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jchbr3", + "__reaction": "CHBr3 + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CHBR3_JPL10.nc", + "parameterization": { + "AA": [ -32.6067, 0.10308, 6.39e-5, -7.7392e-7, -2.2513e-9, 6.1376e-12 ], + "BB": [ 0.1582, -0.0014758, 3.8058e-6, 9.187e-10, -1.0772e-11, 0.0 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0, 5.0 ], + "minimum wavelength": 260.0, + "maximum wavelength": 362.0, + "base temperature": 296.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "invert temperature offset": true, + "temperature ranges": [ + { + "maximum": 259.999999999999, + "fixed value": 260.0 + }, + { + "minimum": 260.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcl2", + "__reaction": "Cl2 + hv -> Cl + Cl", + "cross section": { + "type": "Cl2+hv->Cl+Cl" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcl2o2", + "__reaction": "ClOOCl + hv -> Cl + ClOO", + "__comments": "TODO - this doesn't exactly match the products in TS1", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CL2O2_JPL10.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jclo", + "__reaction": "ClO + hv -> Cl + O", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CLO_JPL06.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jclono2_a", + "__reaction": "ClONO2 + hv -> Cl + NO3", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/ClONO2_1.nc" } + ], + "type": "ClONO2" + }, + "quantum yield": { + "type": "ClONO2+hv->Cl+NO3" + } + }, + { + "name": "jclono2_b", + "__reaction": "ClONO2 + hv -> ClO + NO2", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/ClONO2_1.nc" } + ], + "type": "ClONO2" + }, + "quantum yield": { + "type": "ClONO2+hv->ClO+NO2" + } + }, + { + "name": "jcof2", + "__reaction": "CF2O + hv -> Products", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CF2O_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcofcl", + "__reaction": "CClFO + hv -> Products", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CClFO_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jh2402", + "__reaction": "H2402 + hv -> 2*BR + 2*COF2", + "__comments": "TUV data set name CF2BrCF2Br", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/H2402_JPL06.nc", + "parameterization": { + "AA": [ 34.026, -1.152616, 8.959798e-3, -2.9089e-5, 3.307212e-8 ], + "BB": [ 4.010664e-1, -8.358968e-3, 6.415741e-5, -2.157554e-7, 2.691871e-10 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 190.0, + "maximum wavelength": 290.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210.0, + "maximum": 300.0 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhcfc141b", + "__reaction": "HCFC-141b + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/HCFC141b_JPL10.nc", + "parameterization": { + "AA": [ -682.913042, 12.122290, -8.187699e-2, 2.437244e-4, -2.719103e-7 ], + "BB": [ 4.074747, -8.053899e-2, 5.946552e-4, -1.945048e-6, 2.380143e-9 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 172.0, + "maximum wavelength": 240.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210.0, + "maximum": 300.0 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhcfc142b", + "__reaction": "HCFC-142b + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/HCFC142b_JPL10.nc", + "parameterization": { + "AA": [ -328.092008, 6.342799, -4.810362e-2, 1.611991e-4, -2.042613e-7 ], + "BB": [ 4.289533e-1, -9.042817e-3, 7.018009e-5, -2.389064e-7, 3.039799e-10 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 172.0, + "maximum wavelength": 230.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210.0, + "maximum": 300.0 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhcfc22", + "__reaction": "HCFC-22 + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/HCFC22_JPL06.nc", + "parameterization wavelength grid": { + "name": "custom wavelengths", + "type": "from config file", + "units": "nm", + "values": [ + 169.0, 171.0, 173.0, 175.0, 177.0, 179.0, 181.0, 183.0, 185.0, + 187.0, 189.0, 191.0, 193.0, 195.0, 197.0, 199.0, 201.0, 203.0, + 205.0, 207.0, 209.0, 211.0, 213.0, 215.0, 217.0, 219.0, 221.0 + ] + }, + "parameterization": { + "AA": [ -106.029, 1.5038, -8.2476e-3, 1.4206e-5 ], + "BB": [ -1.3399e-1, 2.7405e-3, -1.8028e-5, 3.8504e-8 ], + "lp": [ 0.0, 1.0, 2.0, 3.0 ], + "minimum wavelength": 174.0, + "maximum wavelength": 204.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210.0, + "maximum": 300.0 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhcl", + "__reaction": "HCl + hv -> H + Cl", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/HCl_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhobr", + "__reaction": "HOBr + hv -> OH + Br", + "cross section": { + "type": "HOBr+hv->OH+Br" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhocl", + "__reaction": "HOCl + hv -> HO + Cl", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/HOCl_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "joclo", + "__reaction": "OClO + hv -> Products", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/OClO_1.nc" }, + { "file path": "data/cross_sections/OClO_2.nc" }, + { "file path": "data/cross_sections/OClO_3.nc" } + ], + "type": "OClO+hv->Products" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jho2no2_a", + "__reaction": "HNO4 + hv -> OH + NO3", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/HO2NO2_JPL06.nc", + "parameterization": { + "type": "BURKHOLDER", + "netcdf file": { + "file path": "data/cross_sections/HO2NO2_temp_JPL06.nc" + }, + "A": -988.0, + "B": 0.69, + "temperature ranges": [ + { + "maximum": 279.999999999999, + "fixed value": 280.0 + }, + { + "minimum": 280.0, + "maximum": 350.0 + }, + { + "minimum": 350.00000000001, + "fixed value": 350.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 0.30, + "override bands": [ + { + "band": "range", + "minimum wavelength": 200.0, + "value": 0.20 + } + ] + } + }, + { + "name": "jho2no2_b", + "__reaction": "HNO4 + hv -> HO2 + NO2", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/HO2NO2_JPL06.nc", + "parameterization": { + "type": "BURKHOLDER", + "netcdf file": { + "file path": "data/cross_sections/HO2NO2_temp_JPL06.nc" + }, + "A": -988.0, + "B": 0.69, + "temperature ranges": [ + { + "maximum": 279.999999999999, + "fixed value": 280.0 + }, + { + "minimum": 280.0, + "maximum": 350.0 + }, + { + "minimum": 350.00000000001, + "fixed value": 350.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 0.70, + "override bands": [ + { + "band": "range", + "minimum wavelength": 200.0, + "value": 0.80 + } + ] + } + }, + { + "name": "jh2o_a", + "__reaction": "H2O + hv -> OH + H", + "cross section": { + "type": "base", + "merge data": true, + "netcdf files": [ + { + "file path": "data/cross_sections/H2O_1.nc", + "zero above": 183.0 + }, + { + "file path": "data/cross_sections/H2O_2.nc", + "zero below": 183.00000000001, + "zero above": 190.0 + }, + { + "file path": "data/cross_sections/H2O_3.nc", + "zero below": 190.00000000001 + } + ] + }, + "quantum yield" : { + "type": "base", + "netcdf files": [ "data/quantum_yields/H2O_H_OH.nc" ] + } + }, + { + "name": "jh2o_b", + "__reaction": "H2O + hv -> H2 + O1D", + "cross section": { + "type": "base", + "merge data": true, + "netcdf files": [ + { + "file path": "data/cross_sections/H2O_1.nc", + "zero above": 183.0 + }, + { + "file path": "data/cross_sections/H2O_2.nc", + "zero below": 183.00000000001, + "zero above": 190.0 + }, + { + "file path": "data/cross_sections/H2O_3.nc", + "zero below": 190.00000000001 + } + ] + }, + "quantum yield" : { + "type": "base", + "netcdf files": [ "data/quantum_yields/H2O_H2_O1D.nc" ] + } + }, + { + "name": "jh2o_c", + "__reaction": "H2O + hv -> 2*H + O", + "cross section": { + "type": "base", + "merge data": true, + "netcdf files": [ + { + "file path": "data/cross_sections/H2O_1.nc", + "zero above": 183.0 + }, + { + "file path": "data/cross_sections/H2O_2.nc", + "zero below": 183.00000000001, + "zero above": 190.0 + }, + { + "file path": "data/cross_sections/H2O_3.nc", + "zero below": 190.00000000001 + } + ] + }, + "quantum yield" : { + "type": "base", + "netcdf files": [ "data/quantum_yields/H2O_2H_O3P.nc" ] + } + }, + { + "name": "jch4_a", + "__reaction": "CH4 + hv -> H + CH3O2", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/CH4_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 0.45 + } + }, + { + "name": "jch4_b", + "__reaction": "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", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/CH4_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 0.55 + } + }, + { + "name": "jco2", + "__reaction": "CO2 + hv -> CO + O", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/CO2_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhbr", + "__reaction": "HBR + hv -> BR + H", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/HBr_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhf", + "__reaction": "HF + hv -> H + F", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/HF_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jsf6", + "__reaction": "SF6 + hv -> sink", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/SF6_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jno_i", + "__reaction": "NO + hv -> NOp + e", + "cross section": { + "type": "base", + "data": { + "default value": 0.0, + "point values": [ + { "wavelength": 121.65, "value": 2.0e-18 } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + } + ] + }, + "__CAM options": { + "disable clouds": false, + "disable aerosols": false, + "aliasing": { + "default matching": "backup", + "pairs": [ + ] + } + } +} diff --git a/src/chemistry/pp_waccm_ma/tuvx_config.json_121.65 b/src/chemistry/pp_waccm_ma/tuvx_config.json_121.65 new file mode 100644 index 0000000000..3ec3958fbf --- /dev/null +++ b/src/chemistry/pp_waccm_ma/tuvx_config.json_121.65 @@ -0,0 +1,1480 @@ +{ + "__description": "TUV-x configuration for the MOZART-TS1 and MOZART-TSMLT chemical mechanisms", + "O2 absorption" : { + "cross section parameters file": "data/cross_sections/O2_parameters.txt" + }, + "grids": [ + ], + "profiles": [ + ], + "radiative transfer": { + "solver": { + "type": "discrete ordinate", + "number of streams": 4 + }, + "cross sections": [ + { + "name": "air", + "type": "air" + }, + { + "name": "O3", + "netcdf files": [ + { "file path": "data/cross_sections/O3_1.nc" }, + { "file path": "data/cross_sections/O3_2.nc" }, + { "file path": "data/cross_sections/O3_3.nc" }, + { "file path": "data/cross_sections/O3_4.nc" } + ], + "type": "O3" + }, + { + "name": "O2", + "netcdf files": [ + { + "file path": "data/cross_sections/O2_1.nc", + "lower extrapolation": { "type": "boundary" }, + "interpolator": { "type": "fractional target" } + } + ], + "type": "base" + } + ], + "radiators": [ + { + "name": "air", + "type": "base", + "treat as air": true, + "cross section": "air", + "vertical profile": "air", + "vertical profile units": "molecule cm-3" + }, + { + "name": "O2", + "type": "base", + "cross section": "O2", + "vertical profile": "O2", + "vertical profile units": "molecule cm-3" + }, + { + "name": "O3", + "type": "base", + "cross section": "O3", + "vertical profile": "O3", + "vertical profile units": "molecule cm-3" + } + ] + }, + "photolysis": { + "reactions": [ + { + "name": "jo2_a", + "__reaction": "O2 + hv -> O + O1D", + "cross section": { + "apply O2 bands": true, + "netcdf files": [ + { + "file path": "data/cross_sections/O2_1.nc", + "lower extrapolation": { "type": "boundary" }, + "interpolator": { "type": "fractional target" } + } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 0, + "override bands": [ + { + "band": "lyman-alpha", + "value": 0.53 + }, + { + "band": "schumann-runge continuum", + "value": 1.0 + } + ] + }, + "heating" : { + "energy term": 175.05 + } + }, + { + "name": "jo2_b", + "__reaction": "O2 + hv -> O + O", + "cross section": { + "apply O2 bands": true, + "netcdf files": [ + { + "file path": "data/cross_sections/O2_1.nc", + "lower extrapolation": { "type": "boundary" }, + "interpolator": { "type": "fractional target" } + } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0, + "override bands": [ + { + "band": "lyman-alpha", + "value": 0.47 + }, + { + "band": "schumann-runge continuum", + "value": 0.0 + } + ] + }, + "heating" : { + "energy term": 242.37 + } + }, + { + "name": "jo3_a", + "__reaction": "O3 + hv -> O2 + O(1D)", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/O3_1.nc" }, + { "file path": "data/cross_sections/O3_2.nc" }, + { "file path": "data/cross_sections/O3_3.nc" }, + { "file path": "data/cross_sections/O3_4.nc" } + ], + "type": "O3" + }, + "quantum yield": { + "type": "O3+hv->O2+O(1D)" + }, + "heating" : { + "energy term": 310.32 + } + }, + { + "name": "jo3_b", + "__reaction": "O3 + hv -> O2 + O(3P)", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/O3_1.nc" }, + { "file path": "data/cross_sections/O3_2.nc" }, + { "file path": "data/cross_sections/O3_3.nc" }, + { "file path": "data/cross_sections/O3_4.nc" } + ], + "type": "O3" + }, + "quantum yield": { + "type": "O3+hv->O2+O(3P)" + }, + "heating" : { + "energy term": 1179.87 + } + }, + { + "name": "jn2o", + "__reaction": "N2O + hv -> N2 + O(1D)", + "cross section": { + "type": "N2O+hv->N2+O(1D)" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jno2", + "__reaction": "NO2 + hv -> NO + O(3P)", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/NO2_1.nc" } + ], + "type": "NO2 tint" + }, + "quantum yield": { + "netcdf files": ["data/quantum_yields/NO2_1.nc"], + "type": "NO2 tint", + "lower extrapolation": { "type": "boundary" } + } + }, + { + "name": "jn2o5_a", + "__reaction": "N2O5 + hv -> NO2 + NO3", + "cross section": { + "type":"temperature based", + "netcdf file": "data/cross_sections/N2O5_JPL06.nc", + "parameterization": { + "type": "HARWOOD", + "aa": [ -18.27, -18.42, -18.59, -18.72, -18.84, + -18.90, -18.93, -18.87, -18.77, -18.71, + -18.31, -18.14, -18.01, -18.42, -18.59, + -18.13 ], + "bb": [ -91.0, -104.0, -112.0, -135.0, -170.0, + -226.0, -294.0, -388.0, -492.0, -583.0, + -770.0, -885.0, -992.0, -949.0, -966.0, + -1160.0 ], + "base temperature": 0.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "minimum wavelength": 260.0, + "maximum wavelength": 410.0, + "temperature ranges": [ + { + "maximum": 199.999999999999, + "fixed value": 200 + }, + { + "minimum": 200, + "maximum": 295 + }, + { + "minimum": 295.00000000001, + "fixed value": 295.0 + } + ] + }, + "parameterization wavelength grid": { + "name": "custom wavelengths", + "type": "from config file", + "units": "nm", + "values": [ + 255.0, 265.0, 275.0, 285.0, 295.0, 305.0, + 315.0, 325.0, 335.0, 345.0, 355.0, 365.0, + 375.0, 385.0, 395.0, 405.0, 415.0 + ] + } + }, + "quantum yield": { + "type": "Taylor series", + "constant value": 0.0, + "coefficients": [ -2.832441, 0.012809638 ], + "override bands": [ + { + "band": "range", + "minimum wavelength": 300.0, + "value": 1.0 + } + ] + } + }, + { + "name": "jn2o5_b", + "__reaction": "N2O5 + hv -> NO + O + NO3", + "cross section": { + "type":"temperature based", + "netcdf file": "data/cross_sections/N2O5_JPL06.nc", + "parameterization": { + "type": "HARWOOD", + "aa": [ -18.27, -18.42, -18.59, -18.72, -18.84, + -18.90, -18.93, -18.87, -18.77, -18.71, + -18.31, -18.14, -18.01, -18.42, -18.59, + -18.13 ], + "bb": [ -91.0, -104.0, -112.0, -135.0, -170.0, + -226.0, -294.0, -388.0, -492.0, -583.0, + -770.0, -885.0, -992.0, -949.0, -966.0, + -1160.0 ], + "base temperature": 0.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "minimum wavelength": 260.0, + "maximum wavelength": 410.0, + "temperature ranges": [ + { + "maximum": 199.999999999999, + "fixed value": 200 + }, + { + "minimum": 200, + "maximum": 295 + }, + { + "minimum": 295.00000000001, + "fixed value": 295.0 + } + ] + }, + "parameterization wavelength grid": { + "name": "custom wavelengths", + "type": "from config file", + "units": "nm", + "values": [ + 255.0, 265.0, 275.0, 285.0, 295.0, 305.0, + 315.0, 325.0, 335.0, 345.0, 355.0, 365.0, + 375.0, 385.0, 395.0, 405.0, 415.0 + ] + } + }, + "quantum yield": { + "type": "Taylor series", + "constant value": 0.0, + "coefficients": [ 3.832441, -0.012809638 ], + "override bands": [ + { + "band": "range", + "minimum wavelength": 300.0, + "value": 0.0 + } + ] + } + }, + { + "name": "jhno3", + "__reaction": "HNO3 + hv -> OH + NO2", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/HNO3_JPL06.nc" } + ], + "type": "HNO3+hv->OH+NO2" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jno3_a", + "__reaction": "NO3 + hv -> NO2 + O(3P)", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/NO3_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "netcdf files": [ + "data/quantum_yields/NO3-NO2+O(3P)_1.nc" + ], + "type": "tint", + "lower extrapolation": { + "type": "constant", + "value": 1.0 + } + } + }, + { + "name": "jno3_b", + "__reaction": "NO3 + hv -> NO + O2", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/NO3_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "netcdf files": [ + "data/quantum_yields/NO3-NO+O2_1.nc" + ], + "type": "tint" + } + }, + { + "name": "jch3ooh", + "__reaction": "CH3OOH + hv -> CH3O + OH", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CH3OOH_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jch2o_a", + "__reaction": "CH2O + hv -> H + HCO", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CH2O_1.nc" } + ], + "type": "CH2O" + }, + "quantum yield": { + "netcdf files": [ + "data/quantum_yields/CH2O_1.nc" + ], + "type": "base", + "lower extrapolation": { + "type": "boundary" + } + } + }, + { + "name": "jch2o_b", + "__reaction": "CH2O + hv -> H2 + CO", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CH2O_1.nc" } + ], + "type": "CH2O" + }, + "quantum yield": { + "netcdf files": [ + "data/quantum_yields/CH2O_1.nc" + ], + "type": "CH2O", + "lower extrapolation": { + "type": "boundary" + } + } + }, + { + "name": "jh2o2", + "__reaction": "H2O2 + hv -> OH + OH", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/H2O2_1.nc" } + ], + "type": "H2O2+hv->OH+OH" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jbrcl", + "__reaction": "BrCl + hv -> Br + Cl", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/BrCl_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jbro", + "__reaction": "BrO + hv -> Br + O", + "cross section": { + "netcdf files": [ + { + "file path": "data/cross_sections/BRO_JPL06.nc" + } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jbrono2_a", + "__reaction": "BrONO2 + hv -> Br + NO3", + "cross section": { + "type": "temperature based", + "parameterization": { + "type": "TAYLOR_SERIES", + "netcdf file": { + "file path": "data/cross_sections/BRONO2_JPL06.nc" + }, + "base temperature": 296.0, + "temperature ranges": [ + { + "maximum": 199.999999999999, + "fixed value": 200.0 + }, + { + "minimum": 200.0, + "maximum": 296.0 + }, + { + "minimum": 296.00000000001, + "fixed value": 296.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 0.85 + } + }, + { + "name": "jbrono2_b", + "__reaction": "BrONO2 + hv -> BrO + NO2", + "cross section": { + "type": "temperature based", + "parameterization": { + "type": "TAYLOR_SERIES", + "netcdf file": { + "file path": "data/cross_sections/BRONO2_JPL06.nc" + }, + "base temperature": 296.0, + "temperature ranges": [ + { + "maximum": 199.999999999999, + "fixed value": 200.0 + }, + { + "minimum": 200.0, + "maximum": 296.0 + }, + { + "minimum": 296.00000000001, + "fixed value": 296.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 0.15 + } + }, + { + "name": "jccl4", + "__reaction": "CCl4 + hv -> Products", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CCl4_1.nc" } + ], + "type": "CCl4+hv->Products" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcf2clbr", + "__reaction": "CF2BrCl + hv -> Products", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CF2BrCl_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcf3br", + "__reaction": "CF3Br + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/H1301_JPL06.nc", + "parameterization": { + "AA": [ 62.563, -2.0068, 1.6592e-2, -5.6465e-5, 6.7459e-8 ], + "BB": [ -9.1755e-1, 1.8575e-2, -1.3857e-4, 4.5066e-7, -5.3803e-10 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 178.0, + "maximum wavelength": 280.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210.0, + "maximum": 300.0 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcfcl3", + "__reaction": "CCl3F + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CFCL3_JPL06.nc", + "parameterization": { + "AA": [ -84.611, 7.9551e-1, -2.0550e-3, -4.4812e-6, 1.5838e-8 ], + "BB": [ -5.7912, 1.1689e-1, -8.8069e-4, 2.9335e-6, -3.6421e-9 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 174.1, + "maximum wavelength": 230.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210, + "maximum": 300 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcfc113", + "__reaction": "CFC-113 + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CFC113_JPL06.nc", + "parameterization": { + "AA": [ -1087.9, 20.004, -1.3920e-1, 4.2828e-4, -4.9384e-7 ], + "BB": [ 12.493, -2.3937e-1, 1.7142e-3, -5.4393e-6, 6.4548e-9 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 182.0, + "maximum wavelength": 230.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210, + "maximum": 300 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcfc114", + "__reaction": "CFC-114 + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CFC114_JPL10.nc", + "parameterization": { + "AA": [ -160.50, 2.4807, -1.5202e-2, 3.8412e-5, -3.4373e-8 ], + "BB": [ -1.5296, 3.5248e-2, -2.9951e-4, 1.1129e-6, -1.5259e-9 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 172.0, + "maximum wavelength": 220.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210, + "maximum": 300 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcfc115", + "__reaction": "CFC-115 + hv -> Products", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/CFC115_JPL10.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcf2cl2", + "__reaction": "CCl2F2 + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CF2CL2_JPL06.nc", + "parameterization": { + "AA": [ -43.8954569, -2.403597e-1, -4.2619e-4, 9.8743e-6, 0.0 ], + "BB": [ 4.8438e-3, 4.96145e-4, -5.6953e-6, 0.0, 0.0 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 200.0, + "maximum wavelength": 231.0, + "base temperature": 296.0, + "base wavelength": 200.0, + "logarithm": "natural", + "temperature ranges": [ + { + "maximum": 219.999999999999, + "fixed value": 220.0 + }, + { + "minimum": 220, + "maximum": 296 + }, + { + "minimum": 296.00000000001, + "fixed value": 296.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jch2br2", + "__reaction": "CH2BR2 + hv -> 2*BR", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CH2BR2_1.nc", + "parameterization": { + "AA": [ -70.211776, 1.940326e-1, 2.726152e-3, -1.695472e-5, 2.500066e-8 ], + "BB": [ 2.899280, -4.327724e-2, 2.391599e-4, -5.807506e-7, 5.244883e-10 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 210.0, + "maximum wavelength": 290.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210, + "maximum": 300 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jch3br", + "__reaction": "CH3Br + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CH3BR_JPL06.nc", + "parameterization": { + "AA": [ 46.520, -1.4580, 1.1469e-2, -3.7627e-5, 4.3264e-8 ], + "BB": [ 9.3408e-1, -1.6887e-2, 1.1487e-4, -3.4881e-7, 3.9945e-10 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 200.0, + "maximum wavelength": 280.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210, + "maximum": 300 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jch3ccl3", + "__reaction": "CH3CCl3+hv->Products", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CH3CCl3_1.nc" } + ], + "type": "tint" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jch3cl", + "__reaction": "CH3Cl + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CH3CL_JPL06.nc", + "parameterization": { + "AA": [ -299.80, 5.1047, -3.3630e-2, 9.5805e-5, -1.0135e-7 ], + "BB": [ -7.1727, 1.4837e-1, -1.1463e-3, 3.9188e-6, -4.9994e-9 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 174.1, + "maximum wavelength": 216.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210, + "maximum": 300 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jchbr3", + "__reaction": "CHBr3 + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CHBR3_JPL10.nc", + "parameterization": { + "AA": [ -32.6067, 0.10308, 6.39e-5, -7.7392e-7, -2.2513e-9, 6.1376e-12 ], + "BB": [ 0.1582, -0.0014758, 3.8058e-6, 9.187e-10, -1.0772e-11, 0.0 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0, 5.0 ], + "minimum wavelength": 260.0, + "maximum wavelength": 362.0, + "base temperature": 296.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "invert temperature offset": true, + "temperature ranges": [ + { + "maximum": 259.999999999999, + "fixed value": 260.0 + }, + { + "minimum": 260.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcl2", + "__reaction": "Cl2 + hv -> Cl + Cl", + "cross section": { + "type": "Cl2+hv->Cl+Cl" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcl2o2", + "__reaction": "ClOOCl + hv -> Cl + ClOO", + "__comments": "TODO - this doesn't exactly match the products in TS1", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CL2O2_JPL10.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jclo", + "__reaction": "ClO + hv -> Cl + O", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CLO_JPL06.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jclono2_a", + "__reaction": "ClONO2 + hv -> Cl + NO3", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/ClONO2_1.nc" } + ], + "type": "ClONO2" + }, + "quantum yield": { + "type": "ClONO2+hv->Cl+NO3" + } + }, + { + "name": "jclono2_b", + "__reaction": "ClONO2 + hv -> ClO + NO2", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/ClONO2_1.nc" } + ], + "type": "ClONO2" + }, + "quantum yield": { + "type": "ClONO2+hv->ClO+NO2" + } + }, + { + "name": "jcof2", + "__reaction": "CF2O + hv -> Products", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CF2O_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcofcl", + "__reaction": "CClFO + hv -> Products", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CClFO_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jh2402", + "__reaction": "H2402 + hv -> 2*BR + 2*COF2", + "__comments": "TUV data set name CF2BrCF2Br", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/H2402_JPL06.nc", + "parameterization": { + "AA": [ 34.026, -1.152616, 8.959798e-3, -2.9089e-5, 3.307212e-8 ], + "BB": [ 4.010664e-1, -8.358968e-3, 6.415741e-5, -2.157554e-7, 2.691871e-10 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 190.0, + "maximum wavelength": 290.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210.0, + "maximum": 300.0 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhcfc141b", + "__reaction": "HCFC-141b + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/HCFC141b_JPL10.nc", + "parameterization": { + "AA": [ -682.913042, 12.122290, -8.187699e-2, 2.437244e-4, -2.719103e-7 ], + "BB": [ 4.074747, -8.053899e-2, 5.946552e-4, -1.945048e-6, 2.380143e-9 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 172.0, + "maximum wavelength": 240.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210.0, + "maximum": 300.0 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhcfc142b", + "__reaction": "HCFC-142b + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/HCFC142b_JPL10.nc", + "parameterization": { + "AA": [ -328.092008, 6.342799, -4.810362e-2, 1.611991e-4, -2.042613e-7 ], + "BB": [ 4.289533e-1, -9.042817e-3, 7.018009e-5, -2.389064e-7, 3.039799e-10 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 172.0, + "maximum wavelength": 230.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210.0, + "maximum": 300.0 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhcfc22", + "__reaction": "HCFC-22 + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/HCFC22_JPL06.nc", + "parameterization wavelength grid": { + "name": "custom wavelengths", + "type": "from config file", + "units": "nm", + "values": [ + 169.0, 171.0, 173.0, 175.0, 177.0, 179.0, 181.0, 183.0, 185.0, + 187.0, 189.0, 191.0, 193.0, 195.0, 197.0, 199.0, 201.0, 203.0, + 205.0, 207.0, 209.0, 211.0, 213.0, 215.0, 217.0, 219.0, 221.0 + ] + }, + "parameterization": { + "AA": [ -106.029, 1.5038, -8.2476e-3, 1.4206e-5 ], + "BB": [ -1.3399e-1, 2.7405e-3, -1.8028e-5, 3.8504e-8 ], + "lp": [ 0.0, 1.0, 2.0, 3.0 ], + "minimum wavelength": 174.0, + "maximum wavelength": 204.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210.0, + "maximum": 300.0 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhcl", + "__reaction": "HCl + hv -> H + Cl", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/HCl_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhobr", + "__reaction": "HOBr + hv -> OH + Br", + "cross section": { + "type": "HOBr+hv->OH+Br" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhocl", + "__reaction": "HOCl + hv -> HO + Cl", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/HOCl_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "joclo", + "__reaction": "OClO + hv -> Products", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/OClO_1.nc" }, + { "file path": "data/cross_sections/OClO_2.nc" }, + { "file path": "data/cross_sections/OClO_3.nc" } + ], + "type": "OClO+hv->Products" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jho2no2_a", + "__reaction": "HNO4 + hv -> OH + NO3", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/HO2NO2_JPL06.nc", + "parameterization": { + "type": "BURKHOLDER", + "netcdf file": { + "file path": "data/cross_sections/HO2NO2_temp_JPL06.nc" + }, + "A": -988.0, + "B": 0.69, + "temperature ranges": [ + { + "maximum": 279.999999999999, + "fixed value": 280.0 + }, + { + "minimum": 280.0, + "maximum": 350.0 + }, + { + "minimum": 350.00000000001, + "fixed value": 350.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 0.30, + "override bands": [ + { + "band": "range", + "minimum wavelength": 200.0, + "value": 0.20 + } + ] + } + }, + { + "name": "jho2no2_b", + "__reaction": "HNO4 + hv -> HO2 + NO2", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/HO2NO2_JPL06.nc", + "parameterization": { + "type": "BURKHOLDER", + "netcdf file": { + "file path": "data/cross_sections/HO2NO2_temp_JPL06.nc" + }, + "A": -988.0, + "B": 0.69, + "temperature ranges": [ + { + "maximum": 279.999999999999, + "fixed value": 280.0 + }, + { + "minimum": 280.0, + "maximum": 350.0 + }, + { + "minimum": 350.00000000001, + "fixed value": 350.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 0.70, + "override bands": [ + { + "band": "range", + "minimum wavelength": 200.0, + "value": 0.80 + } + ] + } + }, + { + "name": "jh2o_a", + "__reaction": "H2O + hv -> OH + H", + "cross section": { + "type": "base", + "merge data": true, + "netcdf files": [ + { + "file path": "data/cross_sections/H2O_1.nc", + "zero above": 183.0 + }, + { + "file path": "data/cross_sections/H2O_2.nc", + "zero below": 183.00000000001, + "zero above": 190.0 + }, + { + "file path": "data/cross_sections/H2O_3.nc", + "zero below": 190.00000000001 + } + ] + }, + "quantum yield" : { + "type": "base", + "netcdf files": [ "data/quantum_yields/H2O_H_OH.nc" ] + } + }, + { + "name": "jh2o_b", + "__reaction": "H2O + hv -> H2 + O1D", + "cross section": { + "type": "base", + "merge data": true, + "netcdf files": [ + { + "file path": "data/cross_sections/H2O_1.nc", + "zero above": 183.0 + }, + { + "file path": "data/cross_sections/H2O_2.nc", + "zero below": 183.00000000001, + "zero above": 190.0 + }, + { + "file path": "data/cross_sections/H2O_3.nc", + "zero below": 190.00000000001 + } + ] + }, + "quantum yield" : { + "type": "base", + "netcdf files": [ "data/quantum_yields/H2O_H2_O1D.nc" ] + } + }, + { + "name": "jh2o_c", + "__reaction": "H2O + hv -> 2*H + O", + "cross section": { + "type": "base", + "merge data": true, + "netcdf files": [ + { + "file path": "data/cross_sections/H2O_1.nc", + "zero above": 183.0 + }, + { + "file path": "data/cross_sections/H2O_2.nc", + "zero below": 183.00000000001, + "zero above": 190.0 + }, + { + "file path": "data/cross_sections/H2O_3.nc", + "zero below": 190.00000000001 + } + ] + }, + "quantum yield" : { + "type": "base", + "netcdf files": [ "data/quantum_yields/H2O_2H_O3P.nc" ] + } + }, + { + "name": "jch4_a", + "__reaction": "CH4 + hv -> H + CH3O2", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/CH4_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 0.45 + } + }, + { + "name": "jch4_b", + "__reaction": "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", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/CH4_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 0.55 + } + }, + { + "name": "jco2", + "__reaction": "CO2 + hv -> CO + O", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/CO2_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhbr", + "__reaction": "HBR + hv -> BR + H", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/HBr_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhf", + "__reaction": "HF + hv -> H + F", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/HF_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jsf6", + "__reaction": "SF6 + hv -> sink", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/SF6_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jno_i", + "__reaction": "NO + hv -> NOp + e", + "cross section": { + "type": "base", + "data": { + "default value": 0.0, + "point values": [ + { "wavelength": 121.65, "value": 2.0e-18 } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + } + ] + }, + "__CAM options": { + "aliasing": { + "default matching": "backup", + "pairs": [ + ] + } + } +} diff --git a/src/chemistry/pp_waccm_ma_mam5/tuvx_config.json b/src/chemistry/pp_waccm_ma_mam5/tuvx_config.json new file mode 100644 index 0000000000..5d2353af0b --- /dev/null +++ b/src/chemistry/pp_waccm_ma_mam5/tuvx_config.json @@ -0,0 +1,1779 @@ +{ + "__description": "TUV-x configuration for the waccm_ma_mam5 chemical mechanism", + "O2 absorption" : { + "cross section parameters file": "data/cross_sections/O2_parameters.txt" + }, + "grids": [ + ], + "profiles": [ + ], + "radiative transfer": { + "solver": { + "type": "discrete ordinate", + "number of streams": 4 + }, + "cross sections": [ + { + "name": "air", + "type": "air" + }, + { + "name": "O3", + "netcdf files": [ + { "file path": "data/cross_sections/O3_1.nc" }, + { "file path": "data/cross_sections/O3_2.nc" }, + { "file path": "data/cross_sections/O3_3.nc" }, + { "file path": "data/cross_sections/O3_4.nc" } + ], + "type": "O3" + }, + { + "name": "O2", + "netcdf files": [ + { + "file path": "data/cross_sections/O2_1.nc", + "lower extrapolation": { "type": "boundary" }, + "interpolator": { "type": "fractional target" } + } + ], + "type": "base" + } + ], + "radiators": [ + { + "name": "air", + "type": "base", + "treat as air": true, + "cross section": "air", + "vertical profile": "air", + "vertical profile units": "molecule cm-3" + }, + { + "name": "O2", + "type": "base", + "cross section": "O2", + "vertical profile": "O2", + "vertical profile units": "molecule cm-3" + }, + { + "name": "O3", + "type": "base", + "cross section": "O3", + "vertical profile": "O3", + "vertical profile units": "molecule cm-3" + } + ] + }, + "photolysis": { + "reactions": [ + { + "name": "jo2_a", + "__reaction": "O2 + hv -> O + O1D", + "cross section": { + "apply O2 bands": true, + "netcdf files": [ + { + "file path": "data/cross_sections/O2_1.nc", + "lower extrapolation": { "type": "boundary" }, + "interpolator": { "type": "fractional target" } + } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 0, + "override bands": [ + { + "band": "lyman-alpha", + "value": 0.53 + }, + { + "band": "schumann-runge continuum", + "value": 1.0 + } + ] + }, + "heating" : { + "energy term": 175.05 + } + }, + { + "name": "jo2_b", + "__reaction": "O2 + hv -> O + O", + "cross section": { + "apply O2 bands": true, + "netcdf files": [ + { + "file path": "data/cross_sections/O2_1.nc", + "lower extrapolation": { "type": "boundary" }, + "interpolator": { "type": "fractional target" } + } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0, + "override bands": [ + { + "band": "lyman-alpha", + "value": 0.47 + }, + { + "band": "schumann-runge continuum", + "value": 0.0 + } + ] + }, + "heating" : { + "energy term": 242.37 + } + }, + { + "name": "jo3_a", + "__reaction": "O3 + hv -> O2 + O(1D)", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/O3_1.nc" }, + { "file path": "data/cross_sections/O3_2.nc" }, + { "file path": "data/cross_sections/O3_3.nc" }, + { "file path": "data/cross_sections/O3_4.nc" } + ], + "type": "O3" + }, + "quantum yield": { + "type": "O3+hv->O2+O(1D)" + }, + "heating" : { + "energy term": 310.32 + } + }, + { + "name": "jo3_b", + "__reaction": "O3 + hv -> O2 + O(3P)", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/O3_1.nc" }, + { "file path": "data/cross_sections/O3_2.nc" }, + { "file path": "data/cross_sections/O3_3.nc" }, + { "file path": "data/cross_sections/O3_4.nc" } + ], + "type": "O3" + }, + "quantum yield": { + "type": "O3+hv->O2+O(3P)" + }, + "heating" : { + "energy term": 1179.87 + } + }, + { + "name": "jn2o", + "__reaction": "N2O + hv -> N2 + O(1D)", + "cross section": { + "type": "N2O+hv->N2+O(1D)" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jno2", + "__reaction": "NO2 + hv -> NO + O(3P)", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/NO2_1.nc" } + ], + "type": "NO2 tint" + }, + "quantum yield": { + "netcdf files": ["data/quantum_yields/NO2_1.nc"], + "type": "NO2 tint", + "lower extrapolation": { "type": "boundary" } + } + }, + { + "name": "jn2o5_a", + "__reaction": "N2O5 + hv -> NO2 + NO3", + "cross section": { + "type":"temperature based", + "netcdf file": "data/cross_sections/N2O5_JPL06.nc", + "parameterization": { + "type": "HARWOOD", + "aa": [ -18.27, -18.42, -18.59, -18.72, -18.84, + -18.90, -18.93, -18.87, -18.77, -18.71, + -18.31, -18.14, -18.01, -18.42, -18.59, + -18.13 ], + "bb": [ -91.0, -104.0, -112.0, -135.0, -170.0, + -226.0, -294.0, -388.0, -492.0, -583.0, + -770.0, -885.0, -992.0, -949.0, -966.0, + -1160.0 ], + "base temperature": 0.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "minimum wavelength": 260.0, + "maximum wavelength": 410.0, + "temperature ranges": [ + { + "maximum": 199.999999999999, + "fixed value": 200 + }, + { + "minimum": 200, + "maximum": 295 + }, + { + "minimum": 295.00000000001, + "fixed value": 295.0 + } + ] + }, + "parameterization wavelength grid": { + "name": "custom wavelengths", + "type": "from config file", + "units": "nm", + "values": [ + 255.0, 265.0, 275.0, 285.0, 295.0, 305.0, + 315.0, 325.0, 335.0, 345.0, 355.0, 365.0, + 375.0, 385.0, 395.0, 405.0, 415.0 + ] + } + }, + "quantum yield": { + "type": "Taylor series", + "constant value": 0.0, + "coefficients": [ -2.832441, 0.012809638 ], + "override bands": [ + { + "band": "range", + "minimum wavelength": 300.0, + "value": 1.0 + } + ] + } + }, + { + "name": "jn2o5_b", + "__reaction": "N2O5 + hv -> NO + O + NO3", + "cross section": { + "type":"temperature based", + "netcdf file": "data/cross_sections/N2O5_JPL06.nc", + "parameterization": { + "type": "HARWOOD", + "aa": [ -18.27, -18.42, -18.59, -18.72, -18.84, + -18.90, -18.93, -18.87, -18.77, -18.71, + -18.31, -18.14, -18.01, -18.42, -18.59, + -18.13 ], + "bb": [ -91.0, -104.0, -112.0, -135.0, -170.0, + -226.0, -294.0, -388.0, -492.0, -583.0, + -770.0, -885.0, -992.0, -949.0, -966.0, + -1160.0 ], + "base temperature": 0.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "minimum wavelength": 260.0, + "maximum wavelength": 410.0, + "temperature ranges": [ + { + "maximum": 199.999999999999, + "fixed value": 200 + }, + { + "minimum": 200, + "maximum": 295 + }, + { + "minimum": 295.00000000001, + "fixed value": 295.0 + } + ] + }, + "parameterization wavelength grid": { + "name": "custom wavelengths", + "type": "from config file", + "units": "nm", + "values": [ + 255.0, 265.0, 275.0, 285.0, 295.0, 305.0, + 315.0, 325.0, 335.0, 345.0, 355.0, 365.0, + 375.0, 385.0, 395.0, 405.0, 415.0 + ] + } + }, + "quantum yield": { + "type": "Taylor series", + "constant value": 0.0, + "coefficients": [ 3.832441, -0.012809638 ], + "override bands": [ + { + "band": "range", + "minimum wavelength": 300.0, + "value": 0.0 + } + ] + } + }, + { + "name": "jhno3", + "__reaction": "HNO3 + hv -> OH + NO2", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/HNO3_JPL06.nc" } + ], + "type": "HNO3+hv->OH+NO2" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jno3_a", + "__reaction": "NO3 + hv -> NO2 + O(3P)", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/NO3_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "netcdf files": [ + "data/quantum_yields/NO3-NO2+O(3P)_1.nc" + ], + "type": "tint", + "lower extrapolation": { + "type": "constant", + "value": 1.0 + } + } + }, + { + "name": "jno3_b", + "__reaction": "NO3 + hv -> NO + O2", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/NO3_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "netcdf files": [ + "data/quantum_yields/NO3-NO+O2_1.nc" + ], + "type": "tint" + } + }, + { + "name": "jch3ooh", + "__reaction": "CH3OOH + hv -> CH3O + OH", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CH3OOH_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jch2o_a", + "__reaction": "CH2O + hv -> H + HCO", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CH2O_1.nc" } + ], + "type": "CH2O" + }, + "quantum yield": { + "netcdf files": [ + "data/quantum_yields/CH2O_1.nc" + ], + "type": "base", + "lower extrapolation": { + "type": "boundary" + } + } + }, + { + "name": "jch2o_b", + "__reaction": "CH2O + hv -> H2 + CO", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CH2O_1.nc" } + ], + "type": "CH2O" + }, + "quantum yield": { + "netcdf files": [ + "data/quantum_yields/CH2O_1.nc" + ], + "type": "CH2O", + "lower extrapolation": { + "type": "boundary" + } + } + }, + { + "name": "jh2o2", + "__reaction": "H2O2 + hv -> OH + OH", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/H2O2_1.nc" } + ], + "type": "H2O2+hv->OH+OH" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jbrcl", + "__reaction": "BrCl + hv -> Br + Cl", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/BrCl_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jbro", + "__reaction": "BrO + hv -> Br + O", + "cross section": { + "netcdf files": [ + { + "file path": "data/cross_sections/BRO_JPL06.nc" + } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jbrono2_a", + "__reaction": "BrONO2 + hv -> Br + NO3", + "cross section": { + "type": "temperature based", + "parameterization": { + "type": "TAYLOR_SERIES", + "netcdf file": { + "file path": "data/cross_sections/BRONO2_JPL06.nc" + }, + "base temperature": 296.0, + "temperature ranges": [ + { + "maximum": 199.999999999999, + "fixed value": 200.0 + }, + { + "minimum": 200.0, + "maximum": 296.0 + }, + { + "minimum": 296.00000000001, + "fixed value": 296.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 0.85 + } + }, + { + "name": "jbrono2_b", + "__reaction": "BrONO2 + hv -> BrO + NO2", + "cross section": { + "type": "temperature based", + "parameterization": { + "type": "TAYLOR_SERIES", + "netcdf file": { + "file path": "data/cross_sections/BRONO2_JPL06.nc" + }, + "base temperature": 296.0, + "temperature ranges": [ + { + "maximum": 199.999999999999, + "fixed value": 200.0 + }, + { + "minimum": 200.0, + "maximum": 296.0 + }, + { + "minimum": 296.00000000001, + "fixed value": 296.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 0.15 + } + }, + { + "name": "jccl4", + "__reaction": "CCl4 + hv -> Products", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CCl4_1.nc" } + ], + "type": "CCl4+hv->Products" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcf2clbr", + "__reaction": "CF2BrCl + hv -> Products", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CF2BrCl_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcf3br", + "__reaction": "CF3Br + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/H1301_JPL06.nc", + "parameterization": { + "AA": [ 62.563, -2.0068, 1.6592e-2, -5.6465e-5, 6.7459e-8 ], + "BB": [ -9.1755e-1, 1.8575e-2, -1.3857e-4, 4.5066e-7, -5.3803e-10 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 178.0, + "maximum wavelength": 280.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210.0, + "maximum": 300.0 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcfcl3", + "__reaction": "CCl3F + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CFCL3_JPL06.nc", + "parameterization": { + "AA": [ -84.611, 7.9551e-1, -2.0550e-3, -4.4812e-6, 1.5838e-8 ], + "BB": [ -5.7912, 1.1689e-1, -8.8069e-4, 2.9335e-6, -3.6421e-9 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 174.1, + "maximum wavelength": 230.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210, + "maximum": 300 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcfc113", + "__reaction": "CFC-113 + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CFC113_JPL06.nc", + "parameterization": { + "AA": [ -1087.9, 20.004, -1.3920e-1, 4.2828e-4, -4.9384e-7 ], + "BB": [ 12.493, -2.3937e-1, 1.7142e-3, -5.4393e-6, 6.4548e-9 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 182.0, + "maximum wavelength": 230.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210, + "maximum": 300 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcfc114", + "__reaction": "CFC-114 + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CFC114_JPL10.nc", + "parameterization": { + "AA": [ -160.50, 2.4807, -1.5202e-2, 3.8412e-5, -3.4373e-8 ], + "BB": [ -1.5296, 3.5248e-2, -2.9951e-4, 1.1129e-6, -1.5259e-9 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 172.0, + "maximum wavelength": 220.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210, + "maximum": 300 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcfc115", + "__reaction": "CFC-115 + hv -> Products", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/CFC115_JPL10.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcf2cl2", + "__reaction": "CCl2F2 + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CF2CL2_JPL06.nc", + "parameterization": { + "AA": [ -43.8954569, -2.403597e-1, -4.2619e-4, 9.8743e-6, 0.0 ], + "BB": [ 4.8438e-3, 4.96145e-4, -5.6953e-6, 0.0, 0.0 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 200.0, + "maximum wavelength": 231.0, + "base temperature": 296.0, + "base wavelength": 200.0, + "logarithm": "natural", + "temperature ranges": [ + { + "maximum": 219.999999999999, + "fixed value": 220.0 + }, + { + "minimum": 220, + "maximum": 296 + }, + { + "minimum": 296.00000000001, + "fixed value": 296.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jch2br2", + "__reaction": "CH2BR2 + hv -> 2*BR", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CH2BR2_1.nc", + "parameterization": { + "AA": [ -70.211776, 1.940326e-1, 2.726152e-3, -1.695472e-5, 2.500066e-8 ], + "BB": [ 2.899280, -4.327724e-2, 2.391599e-4, -5.807506e-7, 5.244883e-10 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 210.0, + "maximum wavelength": 290.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210, + "maximum": 300 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jch3br", + "__reaction": "CH3Br + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CH3BR_JPL06.nc", + "parameterization": { + "AA": [ 46.520, -1.4580, 1.1469e-2, -3.7627e-5, 4.3264e-8 ], + "BB": [ 9.3408e-1, -1.6887e-2, 1.1487e-4, -3.4881e-7, 3.9945e-10 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 200.0, + "maximum wavelength": 280.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210, + "maximum": 300 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jch3ccl3", + "__reaction": "CH3CCl3+hv->Products", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CH3CCl3_1.nc" } + ], + "type": "tint" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jch3cl", + "__reaction": "CH3Cl + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CH3CL_JPL06.nc", + "parameterization": { + "AA": [ -299.80, 5.1047, -3.3630e-2, 9.5805e-5, -1.0135e-7 ], + "BB": [ -7.1727, 1.4837e-1, -1.1463e-3, 3.9188e-6, -4.9994e-9 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 174.1, + "maximum wavelength": 216.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210, + "maximum": 300 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jchbr3", + "__reaction": "CHBr3 + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CHBR3_JPL10.nc", + "parameterization": { + "AA": [ -32.6067, 0.10308, 6.39e-5, -7.7392e-7, -2.2513e-9, 6.1376e-12 ], + "BB": [ 0.1582, -0.0014758, 3.8058e-6, 9.187e-10, -1.0772e-11, 0.0 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0, 5.0 ], + "minimum wavelength": 260.0, + "maximum wavelength": 362.0, + "base temperature": 296.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "invert temperature offset": true, + "temperature ranges": [ + { + "maximum": 259.999999999999, + "fixed value": 260.0 + }, + { + "minimum": 260.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcl2", + "__reaction": "Cl2 + hv -> Cl + Cl", + "cross section": { + "type": "Cl2+hv->Cl+Cl" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcl2o2", + "__reaction": "ClOOCl + hv -> Cl + ClOO", + "__comments": "TODO - this doesn't exactly match the products in TS1", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CL2O2_JPL10.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jclo", + "__reaction": "ClO + hv -> Cl + O", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CLO_JPL06.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jclono2_a", + "__reaction": "ClONO2 + hv -> Cl + NO3", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/ClONO2_1.nc" } + ], + "type": "ClONO2" + }, + "quantum yield": { + "type": "ClONO2+hv->Cl+NO3" + } + }, + { + "name": "jclono2_b", + "__reaction": "ClONO2 + hv -> ClO + NO2", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/ClONO2_1.nc" } + ], + "type": "ClONO2" + }, + "quantum yield": { + "type": "ClONO2+hv->ClO+NO2" + } + }, + { + "name": "jcof2", + "__reaction": "CF2O + hv -> Products", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CF2O_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcofcl", + "__reaction": "CClFO + hv -> Products", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CClFO_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jh2402", + "__reaction": "H2402 + hv -> 2*BR + 2*COF2", + "__comments": "TUV data set name CF2BrCF2Br", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/H2402_JPL06.nc", + "parameterization": { + "AA": [ 34.026, -1.152616, 8.959798e-3, -2.9089e-5, 3.307212e-8 ], + "BB": [ 4.010664e-1, -8.358968e-3, 6.415741e-5, -2.157554e-7, 2.691871e-10 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 190.0, + "maximum wavelength": 290.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210.0, + "maximum": 300.0 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhcfc141b", + "__reaction": "HCFC-141b + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/HCFC141b_JPL10.nc", + "parameterization": { + "AA": [ -682.913042, 12.122290, -8.187699e-2, 2.437244e-4, -2.719103e-7 ], + "BB": [ 4.074747, -8.053899e-2, 5.946552e-4, -1.945048e-6, 2.380143e-9 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 172.0, + "maximum wavelength": 240.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210.0, + "maximum": 300.0 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhcfc142b", + "__reaction": "HCFC-142b + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/HCFC142b_JPL10.nc", + "parameterization": { + "AA": [ -328.092008, 6.342799, -4.810362e-2, 1.611991e-4, -2.042613e-7 ], + "BB": [ 4.289533e-1, -9.042817e-3, 7.018009e-5, -2.389064e-7, 3.039799e-10 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 172.0, + "maximum wavelength": 230.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210.0, + "maximum": 300.0 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhcfc22", + "__reaction": "HCFC-22 + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/HCFC22_JPL06.nc", + "parameterization wavelength grid": { + "name": "custom wavelengths", + "type": "from config file", + "units": "nm", + "values": [ + 169.0, 171.0, 173.0, 175.0, 177.0, 179.0, 181.0, 183.0, 185.0, + 187.0, 189.0, 191.0, 193.0, 195.0, 197.0, 199.0, 201.0, 203.0, + 205.0, 207.0, 209.0, 211.0, 213.0, 215.0, 217.0, 219.0, 221.0 + ] + }, + "parameterization": { + "AA": [ -106.029, 1.5038, -8.2476e-3, 1.4206e-5 ], + "BB": [ -1.3399e-1, 2.7405e-3, -1.8028e-5, 3.8504e-8 ], + "lp": [ 0.0, 1.0, 2.0, 3.0 ], + "minimum wavelength": 174.0, + "maximum wavelength": 204.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210.0, + "maximum": 300.0 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhcl", + "__reaction": "HCl + hv -> H + Cl", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/HCl_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhobr", + "__reaction": "HOBr + hv -> OH + Br", + "cross section": { + "type": "HOBr+hv->OH+Br" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhocl", + "__reaction": "HOCl + hv -> HO + Cl", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/HOCl_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "joclo", + "__reaction": "OClO + hv -> Products", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/OClO_1.nc" }, + { "file path": "data/cross_sections/OClO_2.nc" }, + { "file path": "data/cross_sections/OClO_3.nc" } + ], + "type": "OClO+hv->Products" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jho2no2_a", + "__reaction": "HNO4 + hv -> OH + NO3", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/HO2NO2_JPL06.nc", + "parameterization": { + "type": "BURKHOLDER", + "netcdf file": { + "file path": "data/cross_sections/HO2NO2_temp_JPL06.nc" + }, + "A": -988.0, + "B": 0.69, + "temperature ranges": [ + { + "maximum": 279.999999999999, + "fixed value": 280.0 + }, + { + "minimum": 280.0, + "maximum": 350.0 + }, + { + "minimum": 350.00000000001, + "fixed value": 350.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 0.30, + "override bands": [ + { + "band": "range", + "minimum wavelength": 200.0, + "value": 0.20 + } + ] + } + }, + { + "name": "jho2no2_b", + "__reaction": "HNO4 + hv -> HO2 + NO2", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/HO2NO2_JPL06.nc", + "parameterization": { + "type": "BURKHOLDER", + "netcdf file": { + "file path": "data/cross_sections/HO2NO2_temp_JPL06.nc" + }, + "A": -988.0, + "B": 0.69, + "temperature ranges": [ + { + "maximum": 279.999999999999, + "fixed value": 280.0 + }, + { + "minimum": 280.0, + "maximum": 350.0 + }, + { + "minimum": 350.00000000001, + "fixed value": 350.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 0.70, + "override bands": [ + { + "band": "range", + "minimum wavelength": 200.0, + "value": 0.80 + } + ] + } + }, + { + "name": "jh2o_a", + "__reaction": "H2O + hv -> OH + H", + "cross section": { + "type": "base", + "merge data": true, + "netcdf files": [ + { + "file path": "data/cross_sections/H2O_1.nc", + "zero above": 183.0 + }, + { + "file path": "data/cross_sections/H2O_2.nc", + "zero below": 183.00000000001, + "zero above": 190.0 + }, + { + "file path": "data/cross_sections/H2O_3.nc", + "zero below": 190.00000000001 + } + ] + }, + "quantum yield" : { + "type": "base", + "netcdf files": [ "data/quantum_yields/H2O_H_OH.nc" ] + } + }, + { + "name": "jh2o_b", + "__reaction": "H2O + hv -> H2 + O1D", + "cross section": { + "type": "base", + "merge data": true, + "netcdf files": [ + { + "file path": "data/cross_sections/H2O_1.nc", + "zero above": 183.0 + }, + { + "file path": "data/cross_sections/H2O_2.nc", + "zero below": 183.00000000001, + "zero above": 190.0 + }, + { + "file path": "data/cross_sections/H2O_3.nc", + "zero below": 190.00000000001 + } + ] + }, + "quantum yield" : { + "type": "base", + "netcdf files": [ "data/quantum_yields/H2O_H2_O1D.nc" ] + } + }, + { + "name": "jh2o_c", + "__reaction": "H2O + hv -> 2*H + O", + "cross section": { + "type": "base", + "merge data": true, + "netcdf files": [ + { + "file path": "data/cross_sections/H2O_1.nc", + "zero above": 183.0 + }, + { + "file path": "data/cross_sections/H2O_2.nc", + "zero below": 183.00000000001, + "zero above": 190.0 + }, + { + "file path": "data/cross_sections/H2O_3.nc", + "zero below": 190.00000000001 + } + ] + }, + "quantum yield" : { + "type": "base", + "netcdf files": [ "data/quantum_yields/H2O_2H_O3P.nc" ] + } + }, + { + "name": "jch4_a", + "__reaction": "CH4 + hv -> H + CH3O2", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/CH4_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 0.45 + } + }, + { + "name": "jch4_b", + "__reaction": "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", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/CH4_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 0.55 + } + }, + { + "name": "jco2", + "__reaction": "CO2 + hv -> CO + O", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/CO2_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhbr", + "__reaction": "HBR + hv -> BR + H", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/HBr_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhf", + "__reaction": "HF + hv -> H + F", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/HF_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jsf6", + "__reaction": "SF6 + hv -> sink", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/SF6_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jh2so4", + "__reaction": "H2SO4 + hv -> SO3 + H2O", + "cross section": { + "type": "base", + "data": { + "default value": 0.0, + "point values": [ + { "wavelength": 121.65, "value": 6.3e-17 }, + { "wavelength": 525.0, "value": 1.43e-26 }, + { "wavelength": 625.0, "value": 1.8564e-25 }, + { "wavelength": 725.0, "value": 3.086999e-24 } + ] + } + }, + "quantum yield": { + "type": "H2SO4 Mills", + "netcdf files": [ + "data/quantum_yields/H2SO4_mills.nc" + ], + "parameterized wavelengths": [ + 525, + 625, + 725 + ], + "collision interval s": [ + 1.1e-9, + 8.9e-9, + 1.7e-7 + ], + "molecular diameter m": 4.18e-10, + "molecular weight kg mol-1": 98.078479e-3 + } + }, + { + "name": "jocs", + "__reaction": "OCS + hv -> S + CO", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/OCS_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jso", + "__reaction": "SO + hv -> S + O", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/SO_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jso2", + "__reaction": "SO2 + hv -> SO + O", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/SO2_Mills.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jso3", + "__reaction": "SO3 + hv -> SO2 + O", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/SO3_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jno_i", + "__reaction": "NO + hv -> NOp + e", + "cross section": { + "type": "base", + "data": { + "default value": 0.0, + "point values": [ + { "wavelength": 121.65, "value": 2.0e-18 } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + } + ] + }, + "__CAM options": { + "disable clouds": false, + "disable aerosols": false, + "aliasing": { + "default matching": "backup", + "pairs": [ + ] + } + }, + "dose rates": { + "enable diagnostics": true, + "rates": [ + { + "name": "RB Meter, model 501", + "weights": { + "netcdf files": ["data/spectral_weights/RB-Meter,model_501_spectral_wght_1.nc"], + "type": "base", + "lower extrapolation": { "type": "boundary" } + } + }, + { + "name": "Eppley UV Photometer", + "weights": { + "netcdf files": ["data/spectral_weights/Eppley-UV-Photometer_spectral_wght_1.nc"], + "type": "Eppley UV Photometer", + "lower extrapolation": { "type": "boundary" } + } + }, + { + "name": "UV-A, 315-400 nm", + "weights": { + "type": "Notch Filter", + "notch filter begin": 315.0, + "notch filter end": 400.0 + } + }, + { + "name": "UV-B, 280-315 nm", + "weights": { + "type": "Notch Filter", + "notch filter begin": 280.0, + "notch filter end": 315.0 + } + }, + { + "name": "UV-B*, 280-320 nm", + "weights": { + "type": "Notch Filter", + "notch filter begin": 280.0, + "notch filter end": 320.0 + } + }, + { + "name": "vis+, > 400 nm", + "weights": { + "type": "Notch Filter", + "notch filter begin": 400.0, + "notch filter end": 700.0 + } + }, + { + "name": "Gaussian, 305 nm, 10 nm FWHM", + "weights": { + "type": "Gaussian", + "centroid": 305.0 + } + }, + { + "name": "Gaussian, 320 nm, 10 nm FWHM", + "weights": { + "type": "Gaussian", + "centroid": 320.0 + } + }, + { + "name": "Gaussian, 340 nm, 10 nm FWHM", + "weights": { + "type": "Gaussian", + "centroid": 340.0 + } + }, + { + "name": "Gaussian, 380 nm, 10 nm FWHM", + "weights": { + "type": "Gaussian", + "centroid": 380.0 + } + }, + { + "name": "SCUP-human (de Gruijl and van der Leun, 1994)", + "weights": { + "netcdf files": ["data/spectral_weights/SCUP-human(de Gruijl and van der Leun,1994)_spectral_wght_1.nc"], + "type": "base", + "lower extrapolation": { "type": "boundary" } + } + }, + { + "name": "PAR, 400-700 nm, umol m-2 s-1", + "weights": { + "type": "PAR, 400-700 nm, umol m-2 s-1" + } + }, + { + "name": "Exponential decay, 14 nm/10", + "weights": { + "type": "Exponential decay, 14 nm/10" + } + }, + { + "name": "SCUP-mice (de Gruijl et al., 1993)", + "weights": { + "type": "SCUP-mice (de Gruijl et al., 1993)" + } + }, + { + "name": "Standard human erythema (Webb et al., 2011)", + "weights": { + "type": "Standard human erythema (Webb et al., 2011)" + } + }, + { + "name": "UV index (WMO, 1994; Webb et al., 2011)", + "weights": { + "type": "UV index (WMO, 1994; Webb et al., 2011)" + } + }, + { + "name": "Phytoplankton (Boucher et al., 1994)", + "weights": { + "type": "Phytoplankton (Boucher et al., 1994)" + } + }, + { + "name": "Plant damage (Caldwell, 1971)", + "weights": { + "type": "Plant damage (Caldwell, 1971)" + } + }, + { + "name": "Plant damage,Flint&Caldwell,2003,orig.", + "weights": { + "type": "Plant damage,Flint&Caldwell,2003,orig." + } + }, + { + "name": "Plant damage,Flint&Caldwell,2003,ext390", + "weights": { + "type": "Plant damage,Flint&Caldwell,2003,ext390" + } + }, + { + "name": "Occupational TLV (ACGIH, 1992)", + "weights": { + "netcdf files": ["data/spectral_weights/Occupational TLV (ACGIH,1992)_spectral_wght_1.nc"], + "type": "base", + "lower extrapolation": { "type": "boundary" } + } + }, + { + "name": "Phytoplankton, phaeo (Cullen et al., 1992)", + "weights": { + "netcdf files": ["data/spectral_weights/Phytoplankton, phaeo(Cullen et al. 1992)_spectral_wght_1.nc"], + "type": "base", + "lower extrapolation": { "type": "boundary" } + } + }, + { + "name": "Phytoplankton, proro (Cullen et al., 1992)", + "weights": { + "netcdf files": ["data/spectral_weights/Phytoplankton, proro(Cullen et al. 1992)_spectral_wght_1.nc"], + "type": "base", + "lower extrapolation": { "type": "boundary" } + } + }, + { + "name": "Cataract, pig (Oriowo et al., 2001)", + "weights": { + "netcdf files": ["data/spectral_weights/Cataract, pig(Oriowo et al.,2001)_spectral_wght_1.nc"], + "type": "base", + "lower extrapolation": { "type": "boundary" } + } + }, + { + "name": "Previtamin-D3 (CIE 2006)", + "weights": { + "netcdf files": ["data/spectral_weights/Previtamin-D3 (CIE 2006)_spectral_wght_1.nc"], + "type": "base", + "lower extrapolation": { "type": "boundary" } + } + }, + { + "name": "NMSC (CIE 2006)", + "weights": { + "netcdf files": ["data/spectral_weights/NMSC (CIE 2006)_spectral_wght_1.nc"], + "type": "base", + "lower extrapolation": { "type": "boundary" } + } + }, + { + "name": "DNA damage, in vitro (Setlow, 1974)", + "weights": { + "netcdf files": ["data/spectral_weights/DNA_damage_in_vitro(Setlow,1974)_spectral_wght_1.nc"], + "type": "base", + "lower extrapolation": { "type": "boundary" } + } + }, + { + "name": "Erythema, humans (Anders et al., 1995)", + "weights": { + "netcdf files": ["data/spectral_weights/Erythema,humans(Anders et al.,1995)_spectral_wght_1.nc"], + "type": "base", + "lower extrapolation": { "type": "boundary" } + } + } + ] + } +} diff --git a/src/chemistry/pp_waccm_ma_sulfur/tuvx_config.json b/src/chemistry/pp_waccm_ma_sulfur/tuvx_config.json new file mode 100644 index 0000000000..752691cd73 --- /dev/null +++ b/src/chemistry/pp_waccm_ma_sulfur/tuvx_config.json @@ -0,0 +1,1275 @@ +{ + "__description": "TUV-x configuration for waccm_ma_sulfur chemical mechanism", + "O2 absorption" : { + "cross section parameters file": "data/cross_sections/O2_parameters.txt" + }, + "grids": [ + ], + "profiles": [ + ], + "radiative transfer": { + "solver": { + "type": "discrete ordinate", + "number of streams": 4 + }, + "cross sections": [ + { + "name": "air", + "type": "air" + }, + { + "name": "O3", + "netcdf files": [ + { "file path": "data/cross_sections/O3_1.nc" }, + { "file path": "data/cross_sections/O3_2.nc" }, + { "file path": "data/cross_sections/O3_3.nc" }, + { "file path": "data/cross_sections/O3_4.nc" } + ], + "type": "O3" + }, + { + "name": "O2", + "netcdf files": [ + { + "file path": "data/cross_sections/O2_1.nc", + "lower extrapolation": { "type": "boundary" }, + "interpolator": { "type": "fractional target" } + } + ], + "type": "base" + } + ], + "radiators": [ + { + "name": "air", + "type": "base", + "treat as air": true, + "cross section": "air", + "vertical profile": "air", + "vertical profile units": "molecule cm-3" + }, + { + "name": "O2", + "type": "base", + "cross section": "O2", + "vertical profile": "O2", + "vertical profile units": "molecule cm-3" + }, + { + "name": "O3", + "type": "base", + "cross section": "O3", + "vertical profile": "O3", + "vertical profile units": "molecule cm-3" + } + ] + }, + "photolysis": { + "reactions": [ + { + "name": "jo2_a", + "__reaction": "O2 + hv -> O + O1D", + "cross section": { + "apply O2 bands": true, + "netcdf files": [ + { + "file path": "data/cross_sections/O2_1.nc", + "lower extrapolation": { "type": "boundary" }, + "interpolator": { "type": "fractional target" } + } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 0, + "override bands": [ + { + "band": "lyman-alpha", + "value": 0.53 + }, + { + "band": "schumann-runge continuum", + "value": 1.0 + } + ] + }, + "heating" : { + "energy term": 175.05 + } + }, + { + "name": "jo2_b", + "__reaction": "O2 + hv -> O + O", + "cross section": { + "apply O2 bands": true, + "netcdf files": [ + { + "file path": "data/cross_sections/O2_1.nc", + "lower extrapolation": { "type": "boundary" }, + "interpolator": { "type": "fractional target" } + } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0, + "override bands": [ + { + "band": "lyman-alpha", + "value": 0.47 + }, + { + "band": "schumann-runge continuum", + "value": 0.0 + } + ] + }, + "heating" : { + "energy term": 242.37 + } + }, + { + "name": "jo3_a", + "__reaction": "O3 + hv -> O2 + O(1D)", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/O3_1.nc" }, + { "file path": "data/cross_sections/O3_2.nc" }, + { "file path": "data/cross_sections/O3_3.nc" }, + { "file path": "data/cross_sections/O3_4.nc" } + ], + "type": "O3" + }, + "quantum yield": { + "type": "O3+hv->O2+O(1D)" + }, + "heating" : { + "energy term": 310.32 + } + }, + { + "name": "jo3_b", + "__reaction": "O3 + hv -> O2 + O(3P)", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/O3_1.nc" }, + { "file path": "data/cross_sections/O3_2.nc" }, + { "file path": "data/cross_sections/O3_3.nc" }, + { "file path": "data/cross_sections/O3_4.nc" } + ], + "type": "O3" + }, + "quantum yield": { + "type": "O3+hv->O2+O(3P)" + }, + "heating" : { + "energy term": 1179.87 + } + }, + { + "name": "jn2o", + "__reaction": "N2O + hv -> N2 + O(1D)", + "cross section": { + "type": "N2O+hv->N2+O(1D)" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jno2", + "__reaction": "NO2 + hv -> NO + O(3P)", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/NO2_1.nc" } + ], + "type": "NO2 tint" + }, + "quantum yield": { + "netcdf files": ["data/quantum_yields/NO2_1.nc"], + "type": "NO2 tint", + "lower extrapolation": { "type": "boundary" } + } + }, + { + "name": "jn2o5_a", + "__reaction": "N2O5 + hv -> NO2 + NO3", + "cross section": { + "type":"temperature based", + "netcdf file": "data/cross_sections/N2O5_JPL06.nc", + "parameterization": { + "type": "HARWOOD", + "aa": [ -18.27, -18.42, -18.59, -18.72, -18.84, + -18.90, -18.93, -18.87, -18.77, -18.71, + -18.31, -18.14, -18.01, -18.42, -18.59, + -18.13 ], + "bb": [ -91.0, -104.0, -112.0, -135.0, -170.0, + -226.0, -294.0, -388.0, -492.0, -583.0, + -770.0, -885.0, -992.0, -949.0, -966.0, + -1160.0 ], + "base temperature": 0.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "minimum wavelength": 260.0, + "maximum wavelength": 410.0, + "temperature ranges": [ + { + "maximum": 199.999999999999, + "fixed value": 200 + }, + { + "minimum": 200, + "maximum": 295 + }, + { + "minimum": 295.00000000001, + "fixed value": 295.0 + } + ] + }, + "parameterization wavelength grid": { + "name": "custom wavelengths", + "type": "from config file", + "units": "nm", + "values": [ + 255.0, 265.0, 275.0, 285.0, 295.0, 305.0, + 315.0, 325.0, 335.0, 345.0, 355.0, 365.0, + 375.0, 385.0, 395.0, 405.0, 415.0 + ] + } + }, + "quantum yield": { + "type": "Taylor series", + "constant value": 0.0, + "coefficients": [ -2.832441, 0.012809638 ], + "override bands": [ + { + "band": "range", + "minimum wavelength": 300.0, + "value": 1.0 + } + ] + } + }, + { + "name": "jn2o5_b", + "__reaction": "N2O5 + hv -> NO + O + NO3", + "cross section": { + "type":"temperature based", + "netcdf file": "data/cross_sections/N2O5_JPL06.nc", + "parameterization": { + "type": "HARWOOD", + "aa": [ -18.27, -18.42, -18.59, -18.72, -18.84, + -18.90, -18.93, -18.87, -18.77, -18.71, + -18.31, -18.14, -18.01, -18.42, -18.59, + -18.13 ], + "bb": [ -91.0, -104.0, -112.0, -135.0, -170.0, + -226.0, -294.0, -388.0, -492.0, -583.0, + -770.0, -885.0, -992.0, -949.0, -966.0, + -1160.0 ], + "base temperature": 0.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "minimum wavelength": 260.0, + "maximum wavelength": 410.0, + "temperature ranges": [ + { + "maximum": 199.999999999999, + "fixed value": 200 + }, + { + "minimum": 200, + "maximum": 295 + }, + { + "minimum": 295.00000000001, + "fixed value": 295.0 + } + ] + }, + "parameterization wavelength grid": { + "name": "custom wavelengths", + "type": "from config file", + "units": "nm", + "values": [ + 255.0, 265.0, 275.0, 285.0, 295.0, 305.0, + 315.0, 325.0, 335.0, 345.0, 355.0, 365.0, + 375.0, 385.0, 395.0, 405.0, 415.0 + ] + } + }, + "quantum yield": { + "type": "Taylor series", + "constant value": 0.0, + "coefficients": [ 3.832441, -0.012809638 ], + "override bands": [ + { + "band": "range", + "minimum wavelength": 300.0, + "value": 0.0 + } + ] + } + }, + { + "name": "jhno3", + "__reaction": "HNO3 + hv -> OH + NO2", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/HNO3_JPL06.nc" } + ], + "type": "HNO3+hv->OH+NO2" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jno3_a", + "__reaction": "NO3 + hv -> NO2 + O(3P)", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/NO3_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "netcdf files": [ + "data/quantum_yields/NO3-NO2+O(3P)_1.nc" + ], + "type": "tint", + "lower extrapolation": { + "type": "constant", + "value": 1.0 + } + } + }, + { + "name": "jno3_b", + "__reaction": "NO3 + hv -> NO + O2", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/NO3_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "netcdf files": [ + "data/quantum_yields/NO3-NO+O2_1.nc" + ], + "type": "tint" + } + }, + { + "name": "jch3ooh", + "__reaction": "CH3OOH + hv -> CH3O + OH", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CH3OOH_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jch2o_a", + "__reaction": "CH2O + hv -> H + HCO", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CH2O_1.nc" } + ], + "type": "CH2O" + }, + "quantum yield": { + "netcdf files": [ + "data/quantum_yields/CH2O_1.nc" + ], + "type": "base", + "lower extrapolation": { + "type": "boundary" + } + } + }, + { + "name": "jch2o_b", + "__reaction": "CH2O + hv -> H2 + CO", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CH2O_1.nc" } + ], + "type": "CH2O" + }, + "quantum yield": { + "netcdf files": [ + "data/quantum_yields/CH2O_1.nc" + ], + "type": "CH2O", + "lower extrapolation": { + "type": "boundary" + } + } + }, + { + "name": "jh2o2", + "__reaction": "H2O2 + hv -> OH + OH", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/H2O2_1.nc" } + ], + "type": "H2O2+hv->OH+OH" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jbrcl", + "__reaction": "BrCl + hv -> Br + Cl", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/BrCl_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jbro", + "__reaction": "BrO + hv -> Br + O", + "cross section": { + "netcdf files": [ + { + "file path": "data/cross_sections/BRO_JPL06.nc" + } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jbrono2_a", + "__reaction": "BrONO2 + hv -> Br + NO3", + "cross section": { + "type": "temperature based", + "parameterization": { + "type": "TAYLOR_SERIES", + "netcdf file": { + "file path": "data/cross_sections/BRONO2_JPL06.nc" + }, + "base temperature": 296.0, + "temperature ranges": [ + { + "maximum": 199.999999999999, + "fixed value": 200.0 + }, + { + "minimum": 200.0, + "maximum": 296.0 + }, + { + "minimum": 296.00000000001, + "fixed value": 296.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 0.85 + } + }, + { + "name": "jbrono2_b", + "__reaction": "BrONO2 + hv -> BrO + NO2", + "cross section": { + "type": "temperature based", + "parameterization": { + "type": "TAYLOR_SERIES", + "netcdf file": { + "file path": "data/cross_sections/BRONO2_JPL06.nc" + }, + "base temperature": 296.0, + "temperature ranges": [ + { + "maximum": 199.999999999999, + "fixed value": 200.0 + }, + { + "minimum": 200.0, + "maximum": 296.0 + }, + { + "minimum": 296.00000000001, + "fixed value": 296.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 0.15 + } + }, + { + "name": "jccl4", + "__reaction": "CCl4 + hv -> Products", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CCl4_1.nc" } + ], + "type": "CCl4+hv->Products" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcf2clbr", + "__reaction": "CF2BrCl + hv -> Products", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CF2BrCl_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcf3br", + "__reaction": "CF3Br + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/H1301_JPL06.nc", + "parameterization": { + "AA": [ 62.563, -2.0068, 1.6592e-2, -5.6465e-5, 6.7459e-8 ], + "BB": [ -9.1755e-1, 1.8575e-2, -1.3857e-4, 4.5066e-7, -5.3803e-10 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 178.0, + "maximum wavelength": 280.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210.0, + "maximum": 300.0 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcfcl3", + "__reaction": "CCl3F + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CFCL3_JPL06.nc", + "parameterization": { + "AA": [ -84.611, 7.9551e-1, -2.0550e-3, -4.4812e-6, 1.5838e-8 ], + "BB": [ -5.7912, 1.1689e-1, -8.8069e-4, 2.9335e-6, -3.6421e-9 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 174.1, + "maximum wavelength": 230.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210, + "maximum": 300 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcfc113", + "__reaction": "CFC-113 + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CFC113_JPL06.nc", + "parameterization": { + "AA": [ -1087.9, 20.004, -1.3920e-1, 4.2828e-4, -4.9384e-7 ], + "BB": [ 12.493, -2.3937e-1, 1.7142e-3, -5.4393e-6, 6.4548e-9 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 182.0, + "maximum wavelength": 230.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210, + "maximum": 300 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcf2cl2", + "__reaction": "CCl2F2 + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CF2CL2_JPL06.nc", + "parameterization": { + "AA": [ -43.8954569, -2.403597e-1, -4.2619e-4, 9.8743e-6, 0.0 ], + "BB": [ 4.8438e-3, 4.96145e-4, -5.6953e-6, 0.0, 0.0 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 200.0, + "maximum wavelength": 231.0, + "base temperature": 296.0, + "base wavelength": 200.0, + "logarithm": "natural", + "temperature ranges": [ + { + "maximum": 219.999999999999, + "fixed value": 220.0 + }, + { + "minimum": 220, + "maximum": 296 + }, + { + "minimum": 296.00000000001, + "fixed value": 296.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jch3br", + "__reaction": "CH3Br + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CH3BR_JPL06.nc", + "parameterization": { + "AA": [ 46.520, -1.4580, 1.1469e-2, -3.7627e-5, 4.3264e-8 ], + "BB": [ 9.3408e-1, -1.6887e-2, 1.1487e-4, -3.4881e-7, 3.9945e-10 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 200.0, + "maximum wavelength": 280.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210, + "maximum": 300 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jch3ccl3", + "__reaction": "CH3CCl3+hv->Products", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CH3CCl3_1.nc" } + ], + "type": "tint" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jch3cl", + "__reaction": "CH3Cl + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CH3CL_JPL06.nc", + "parameterization": { + "AA": [ -299.80, 5.1047, -3.3630e-2, 9.5805e-5, -1.0135e-7 ], + "BB": [ -7.1727, 1.4837e-1, -1.1463e-3, 3.9188e-6, -4.9994e-9 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 174.1, + "maximum wavelength": 216.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210, + "maximum": 300 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcl2", + "__reaction": "Cl2 + hv -> Cl + Cl", + "cross section": { + "type": "Cl2+hv->Cl+Cl" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcl2o2", + "__reaction": "ClOOCl + hv -> Cl + ClOO", + "__comments": "TODO - this doesn't exactly match the products in TS1", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CL2O2_JPL10.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jclo", + "__reaction": "ClO + hv -> Cl + O", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CLO_JPL06.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jclono2_a", + "__reaction": "ClONO2 + hv -> Cl + NO3", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/ClONO2_1.nc" } + ], + "type": "ClONO2" + }, + "quantum yield": { + "type": "ClONO2+hv->Cl+NO3" + } + }, + { + "name": "jclono2_b", + "__reaction": "ClONO2 + hv -> ClO + NO2", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/ClONO2_1.nc" } + ], + "type": "ClONO2" + }, + "quantum yield": { + "type": "ClONO2+hv->ClO+NO2" + } + }, + { + "name": "jhcfc22", + "__reaction": "HCFC-22 + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/HCFC22_JPL06.nc", + "parameterization wavelength grid": { + "name": "custom wavelengths", + "type": "from config file", + "units": "nm", + "values": [ + 169.0, 171.0, 173.0, 175.0, 177.0, 179.0, 181.0, 183.0, 185.0, + 187.0, 189.0, 191.0, 193.0, 195.0, 197.0, 199.0, 201.0, 203.0, + 205.0, 207.0, 209.0, 211.0, 213.0, 215.0, 217.0, 219.0, 221.0 + ] + }, + "parameterization": { + "AA": [ -106.029, 1.5038, -8.2476e-3, 1.4206e-5 ], + "BB": [ -1.3399e-1, 2.7405e-3, -1.8028e-5, 3.8504e-8 ], + "lp": [ 0.0, 1.0, 2.0, 3.0 ], + "minimum wavelength": 174.0, + "maximum wavelength": 204.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210.0, + "maximum": 300.0 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhcl", + "__reaction": "HCl + hv -> H + Cl", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/HCl_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhobr", + "__reaction": "HOBr + hv -> OH + Br", + "cross section": { + "type": "HOBr+hv->OH+Br" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhocl", + "__reaction": "HOCl + hv -> HO + Cl", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/HOCl_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "joclo", + "__reaction": "OClO + hv -> Products", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/OClO_1.nc" }, + { "file path": "data/cross_sections/OClO_2.nc" }, + { "file path": "data/cross_sections/OClO_3.nc" } + ], + "type": "OClO+hv->Products" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jho2no2_a", + "__reaction": "HNO4 + hv -> OH + NO3", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/HO2NO2_JPL06.nc", + "parameterization": { + "type": "BURKHOLDER", + "netcdf file": { + "file path": "data/cross_sections/HO2NO2_temp_JPL06.nc" + }, + "A": -988.0, + "B": 0.69, + "temperature ranges": [ + { + "maximum": 279.999999999999, + "fixed value": 280.0 + }, + { + "minimum": 280.0, + "maximum": 350.0 + }, + { + "minimum": 350.00000000001, + "fixed value": 350.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 0.30, + "override bands": [ + { + "band": "range", + "minimum wavelength": 200.0, + "value": 0.20 + } + ] + } + }, + { + "name": "jho2no2_b", + "__reaction": "HNO4 + hv -> HO2 + NO2", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/HO2NO2_JPL06.nc", + "parameterization": { + "type": "BURKHOLDER", + "netcdf file": { + "file path": "data/cross_sections/HO2NO2_temp_JPL06.nc" + }, + "A": -988.0, + "B": 0.69, + "temperature ranges": [ + { + "maximum": 279.999999999999, + "fixed value": 280.0 + }, + { + "minimum": 280.0, + "maximum": 350.0 + }, + { + "minimum": 350.00000000001, + "fixed value": 350.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 0.70, + "override bands": [ + { + "band": "range", + "minimum wavelength": 200.0, + "value": 0.80 + } + ] + } + }, + { + "name": "jh2o_a", + "__reaction": "H2O + hv -> OH + H", + "cross section": { + "type": "base", + "merge data": true, + "netcdf files": [ + { + "file path": "data/cross_sections/H2O_1.nc", + "zero above": 183.0 + }, + { + "file path": "data/cross_sections/H2O_2.nc", + "zero below": 183.00000000001, + "zero above": 190.0 + }, + { + "file path": "data/cross_sections/H2O_3.nc", + "zero below": 190.00000000001 + } + ] + }, + "quantum yield" : { + "type": "base", + "netcdf files": [ "data/quantum_yields/H2O_H_OH.nc" ] + } + }, + { + "name": "jh2o_b", + "__reaction": "H2O + hv -> H2 + O1D", + "cross section": { + "type": "base", + "merge data": true, + "netcdf files": [ + { + "file path": "data/cross_sections/H2O_1.nc", + "zero above": 183.0 + }, + { + "file path": "data/cross_sections/H2O_2.nc", + "zero below": 183.00000000001, + "zero above": 190.0 + }, + { + "file path": "data/cross_sections/H2O_3.nc", + "zero below": 190.00000000001 + } + ] + }, + "quantum yield" : { + "type": "base", + "netcdf files": [ "data/quantum_yields/H2O_H2_O1D.nc" ] + } + }, + { + "name": "jh2o_c", + "__reaction": "H2O + hv -> 2*H + O", + "cross section": { + "type": "base", + "merge data": true, + "netcdf files": [ + { + "file path": "data/cross_sections/H2O_1.nc", + "zero above": 183.0 + }, + { + "file path": "data/cross_sections/H2O_2.nc", + "zero below": 183.00000000001, + "zero above": 190.0 + }, + { + "file path": "data/cross_sections/H2O_3.nc", + "zero below": 190.00000000001 + } + ] + }, + "quantum yield" : { + "type": "base", + "netcdf files": [ "data/quantum_yields/H2O_2H_O3P.nc" ] + } + }, + { + "name": "jch4_a", + "__reaction": "CH4 + hv -> H + CH3O2", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/CH4_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 0.45 + } + }, + { + "name": "jch4_b", + "__reaction": "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", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/CH4_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 0.55 + } + }, + { + "name": "jco2", + "__reaction": "CO2 + hv -> CO + O", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/CO2_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jno_i", + "__reaction": "NO + hv -> NOp + e", + "cross section": { + "type": "base", + "data": { + "default value": 0.0, + "point values": [ + { "wavelength": 121.65, "value": 2.0e-18 } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jso", + "__reaction": "SO + hv -> S + O", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/SO_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jso2", + "__reaction": "SO2 + hv -> SO + O", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/SO2_Mills.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jso3", + "__reaction": "SO3 + hv -> SO2 + O", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/SO3_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jocs", + "__reaction": "OCS + hv -> S + CO", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/OCS_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jh2so4", + "__reaction": "H2SO4 + hv -> SO3 + H2O", + "cross section": { + "type": "base", + "data": { + "default value": 0.0, + "point values": [ + { "wavelength": 121.65, "value": 6.3e-17 }, + { "wavelength": 525.0, "value": 1.43e-26 }, + { "wavelength": 625.0, "value": 1.8564e-25 }, + { "wavelength": 725.0, "value": 3.086999e-24 } + ] + } + }, + "quantum yield": { + "type": "H2SO4 Mills", + "netcdf files": [ + "data/quantum_yields/H2SO4_mills.nc" + ], + "parameterized wavelengths": [ + 525, + 625, + 725 + ], + "collision interval s": [ + 1.1e-9, + 8.9e-9, + 1.7e-7 + ], + "molecular diameter m": 4.18e-10, + "molecular weight kg mol-1": 98.078479e-3 + } + } + ] + }, + "__CAM options": { + "disable clouds": false, + "disable aerosols": false, + "aliasing": { + "default matching": "backup", + "pairs": [ + ] + } + } +} diff --git a/src/chemistry/pp_waccm_tsmlt_mam5/tuvx_config.json b/src/chemistry/pp_waccm_tsmlt_mam5/tuvx_config.json new file mode 100644 index 0000000000..e30b476a75 --- /dev/null +++ b/src/chemistry/pp_waccm_tsmlt_mam5/tuvx_config.json @@ -0,0 +1,2257 @@ +{ + "__description": "TUV-x configuration for the MOZART-TS1 and MOZART-TSMLT chemical mechanisms", + "O2 absorption" : { + "cross section parameters file": "data/cross_sections/O2_parameters.txt" + }, + "grids": [ + ], + "profiles": [ + ], + "radiative transfer": { + "solver": { + "type": "discrete ordinate", + "number of streams": 4 + }, + "cross sections": [ + { + "name": "air", + "type": "air" + }, + { + "name": "O3", + "netcdf files": [ + { "file path": "data/cross_sections/O3_1.nc" }, + { "file path": "data/cross_sections/O3_2.nc" }, + { "file path": "data/cross_sections/O3_3.nc" }, + { "file path": "data/cross_sections/O3_4.nc" } + ], + "type": "O3" + }, + { + "name": "O2", + "netcdf files": [ + { + "file path": "data/cross_sections/O2_1.nc", + "lower extrapolation": { "type": "boundary" }, + "interpolator": { "type": "fractional target" } + } + ], + "type": "base" + } + ], + "radiators": [ + { + "name": "air", + "type": "base", + "treat as air": true, + "cross section": "air", + "vertical profile": "air", + "vertical profile units": "molecule cm-3" + }, + { + "name": "O2", + "type": "base", + "cross section": "O2", + "vertical profile": "O2", + "vertical profile units": "molecule cm-3" + }, + { + "name": "O3", + "type": "base", + "cross section": "O3", + "vertical profile": "O3", + "vertical profile units": "molecule cm-3" + } + ] + }, + "photolysis": { + "reactions": [ + { + "name": "jo2_a", + "__reaction": "O2 + hv -> O + O1D", + "cross section": { + "apply O2 bands": true, + "netcdf files": [ + { + "file path": "data/cross_sections/O2_1.nc", + "lower extrapolation": { "type": "boundary" }, + "interpolator": { "type": "fractional target" } + } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 0, + "override bands": [ + { + "band": "lyman-alpha", + "value": 0.53 + }, + { + "band": "schumann-runge continuum", + "value": 1.0 + } + ] + }, + "heating" : { + "energy term": 175.05 + } + }, + { + "name": "jo2_b", + "__reaction": "O2 + hv -> O + O", + "cross section": { + "apply O2 bands": true, + "netcdf files": [ + { + "file path": "data/cross_sections/O2_1.nc", + "lower extrapolation": { "type": "boundary" }, + "interpolator": { "type": "fractional target" } + } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0, + "override bands": [ + { + "band": "lyman-alpha", + "value": 0.47 + }, + { + "band": "schumann-runge continuum", + "value": 0.0 + } + ] + }, + "heating" : { + "energy term": 242.37 + } + }, + { + "name": "jo3_a", + "__reaction": "O3 + hv -> O2 + O(1D)", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/O3_1.nc" }, + { "file path": "data/cross_sections/O3_2.nc" }, + { "file path": "data/cross_sections/O3_3.nc" }, + { "file path": "data/cross_sections/O3_4.nc" } + ], + "type": "O3" + }, + "quantum yield": { + "type": "O3+hv->O2+O(1D)" + }, + "heating" : { + "energy term": 310.32 + } + }, + { + "name": "jo3_b", + "__reaction": "O3 + hv -> O2 + O(3P)", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/O3_1.nc" }, + { "file path": "data/cross_sections/O3_2.nc" }, + { "file path": "data/cross_sections/O3_3.nc" }, + { "file path": "data/cross_sections/O3_4.nc" } + ], + "type": "O3" + }, + "quantum yield": { + "type": "O3+hv->O2+O(3P)" + }, + "heating" : { + "energy term": 1179.87 + } + }, + { + "name": "jn2o", + "__reaction": "N2O + hv -> N2 + O(1D)", + "cross section": { + "type": "N2O+hv->N2+O(1D)" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jno2", + "__reaction": "NO2 + hv -> NO + O(3P)", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/NO2_1.nc" } + ], + "type": "NO2 tint" + }, + "quantum yield": { + "netcdf files": ["data/quantum_yields/NO2_1.nc"], + "type": "NO2 tint", + "lower extrapolation": { "type": "boundary" } + } + }, + { + "name": "jn2o5_a", + "__reaction": "N2O5 + hv -> NO2 + NO3", + "cross section": { + "type":"temperature based", + "netcdf file": "data/cross_sections/N2O5_JPL06.nc", + "parameterization": { + "type": "HARWOOD", + "aa": [ -18.27, -18.42, -18.59, -18.72, -18.84, + -18.90, -18.93, -18.87, -18.77, -18.71, + -18.31, -18.14, -18.01, -18.42, -18.59, + -18.13 ], + "bb": [ -91.0, -104.0, -112.0, -135.0, -170.0, + -226.0, -294.0, -388.0, -492.0, -583.0, + -770.0, -885.0, -992.0, -949.0, -966.0, + -1160.0 ], + "base temperature": 0.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "minimum wavelength": 260.0, + "maximum wavelength": 410.0, + "temperature ranges": [ + { + "maximum": 199.999999999999, + "fixed value": 200 + }, + { + "minimum": 200, + "maximum": 295 + }, + { + "minimum": 295.00000000001, + "fixed value": 295.0 + } + ] + }, + "parameterization wavelength grid": { + "name": "custom wavelengths", + "type": "from config file", + "units": "nm", + "values": [ + 255.0, 265.0, 275.0, 285.0, 295.0, 305.0, + 315.0, 325.0, 335.0, 345.0, 355.0, 365.0, + 375.0, 385.0, 395.0, 405.0, 415.0 + ] + } + }, + "quantum yield": { + "type": "Taylor series", + "constant value": 0.0, + "coefficients": [ -2.832441, 0.012809638 ], + "override bands": [ + { + "band": "range", + "minimum wavelength": 300.0, + "value": 1.0 + } + ] + } + }, + { + "name": "jn2o5_b", + "__reaction": "N2O5 + hv -> NO + O + NO3", + "cross section": { + "type":"temperature based", + "netcdf file": "data/cross_sections/N2O5_JPL06.nc", + "parameterization": { + "type": "HARWOOD", + "aa": [ -18.27, -18.42, -18.59, -18.72, -18.84, + -18.90, -18.93, -18.87, -18.77, -18.71, + -18.31, -18.14, -18.01, -18.42, -18.59, + -18.13 ], + "bb": [ -91.0, -104.0, -112.0, -135.0, -170.0, + -226.0, -294.0, -388.0, -492.0, -583.0, + -770.0, -885.0, -992.0, -949.0, -966.0, + -1160.0 ], + "base temperature": 0.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "minimum wavelength": 260.0, + "maximum wavelength": 410.0, + "temperature ranges": [ + { + "maximum": 199.999999999999, + "fixed value": 200 + }, + { + "minimum": 200, + "maximum": 295 + }, + { + "minimum": 295.00000000001, + "fixed value": 295.0 + } + ] + }, + "parameterization wavelength grid": { + "name": "custom wavelengths", + "type": "from config file", + "units": "nm", + "values": [ + 255.0, 265.0, 275.0, 285.0, 295.0, 305.0, + 315.0, 325.0, 335.0, 345.0, 355.0, 365.0, + 375.0, 385.0, 395.0, 405.0, 415.0 + ] + } + }, + "quantum yield": { + "type": "Taylor series", + "constant value": 0.0, + "coefficients": [ 3.832441, -0.012809638 ], + "override bands": [ + { + "band": "range", + "minimum wavelength": 300.0, + "value": 0.0 + } + ] + } + }, + { + "name": "jhno3", + "__reaction": "HNO3 + hv -> OH + NO2", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/HNO3_JPL06.nc" } + ], + "type": "HNO3+hv->OH+NO2" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jno3_a", + "__reaction": "NO3 + hv -> NO2 + O(3P)", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/NO3_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "netcdf files": [ + "data/quantum_yields/NO3-NO2+O(3P)_1.nc" + ], + "type": "tint", + "lower extrapolation": { + "type": "constant", + "value": 1.0 + } + } + }, + { + "name": "jno3_b", + "__reaction": "NO3 + hv -> NO + O2", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/NO3_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "netcdf files": [ + "data/quantum_yields/NO3-NO+O2_1.nc" + ], + "type": "tint" + } + }, + { + "name": "jch3ooh", + "__reaction": "CH3OOH + hv -> CH3O + OH", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CH3OOH_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jch2o_a", + "__reaction": "CH2O + hv -> H + HCO", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CH2O_JPL19.nc" } + ], + "type": "CH2O" + }, + "quantum yield": { + "netcdf files": [ + "data/quantum_yields/CH2O_1.nc" + ], + "type": "base", + "lower extrapolation": { + "type": "boundary" + } + } + }, + { + "name": "jch2o_b", + "__reaction": "CH2O + hv -> H2 + CO", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CH2O_JPL19.nc" } + ], + "type": "CH2O" + }, + "quantum yield": { + "netcdf files": [ + "data/quantum_yields/CH2O_1.nc" + ], + "type": "CH2O", + "lower extrapolation": { + "type": "boundary" + } + } + }, + { + "name": "jh2o2", + "__reaction": "H2O2 + hv -> OH + OH", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/H2O2_JPL19.nc" } + ], + "type": "H2O2+hv->OH+OH" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jch3cho", + "__reaction": "CH3CHO + hv -> CH3 + HCO", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CH3CHO_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "netcdf files": [ + "data/quantum_yields/CH3CHO_1.nc" + ], + "type": "CH3CHO+hv->CH3+HCO" + } + }, + { + "name": "jpan", + "__reaction": "PAN + hv -> 0.6*CH3CO3 + 0.6*NO2 + 0.4*CH3O2 + 0.4*NO3 + 0.4*CO2", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/PAN_1.nc" } + ], + "type": "CH3ONO2+hv->CH3O+NO2" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jmvk", + "__reaction": "MVK + hv -> 0.7*C3H6 + 0.7*CO + 0.3*CH3O2 + 0.3*CH3CO3", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/MVK_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "MVK+hv->Products" + } + }, + { + "name": "jacet", + "__reaction": "CH3COCH3 + hv -> CH3CO + CH3", + "cross section": { + "type": "temperature based", + "parameterization": { + "type": "TAYLOR_SERIES", + "netcdf file": { + "file path": "data/cross_sections/ACETONE_JPL06.nc" + }, + "base temperature": 0.0, + "temperature ranges": [ + { + "maximum": 234.999999999999, + "fixed value": 235.0 + }, + { + "minimum": 235.0, + "maximum": 298.0 + }, + { + "minimum": 298.00000000001, + "fixed value": 298.0 + } + ] + } + }, + "quantum yield": { + "type": "CH3COCH3+hv->CH3CO+CH3", + "branch": "CO+CH3CO", + "low wavelength value": 1, + "minimum temperature": 218, + "maximum temperature": 295 + } + }, + { + "name": "jmgly", + "__reaction": "CH3COCHO + hv -> CH3CO3 + CO + HO2", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CH3COCHO_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "CH3COCHO+hv->CH3CO+HCO" + } + }, + { + "name": "jglyald", + "__reaction": "GLYALD + hv -> 2*HO2 + CO + CH2O", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/HOCH2CHO_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 0.5 + } + }, +{ + "name": "jglyoxal", + "__reaction": "GLYOXAL + hv -> 2*CO + 2*HO2", + "__comments": "TODO the products of this reaction don't exactly match", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CHOCHO_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "netcdf files": [ + "data/quantum_yields/CHOCHO-H2_CO_CO_1.nc" + ], + "type": "base", + "lower extrapolation": { + "type": "boundary" + } + } + }, + { + "name": "jbrcl", + "__reaction": "BrCl + hv -> Br + Cl", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/BrCl_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jbro", + "__reaction": "BrO + hv -> Br + O", + "cross section": { + "netcdf files": [ + { + "file path": "data/cross_sections/BRO_JPL06.nc" + } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jbrono2_a", + "__reaction": "BrONO2 + hv -> Br + NO3", + "cross section": { + "type": "temperature based", + "parameterization": { + "type": "TAYLOR_SERIES", + "netcdf file": { + "file path": "data/cross_sections/BRONO2_JPL06.nc" + }, + "base temperature": 296.0, + "temperature ranges": [ + { + "maximum": 199.999999999999, + "fixed value": 200.0 + }, + { + "minimum": 200.0, + "maximum": 296.0 + }, + { + "minimum": 296.00000000001, + "fixed value": 296.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 0.85 + } + }, + { + "name": "jbrono2_b", + "__reaction": "BrONO2 + hv -> BrO + NO2", + "cross section": { + "type": "temperature based", + "parameterization": { + "type": "TAYLOR_SERIES", + "netcdf file": { + "file path": "data/cross_sections/BRONO2_JPL06.nc" + }, + "base temperature": 296.0, + "temperature ranges": [ + { + "maximum": 199.999999999999, + "fixed value": 200.0 + }, + { + "minimum": 200.0, + "maximum": 296.0 + }, + { + "minimum": 296.00000000001, + "fixed value": 296.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 0.15 + } + }, + { + "name": "jccl4", + "__reaction": "CCl4 + hv -> Products", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CCl4_1.nc" } + ], + "type": "CCl4+hv->Products" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcf2clbr", + "__reaction": "CF2BrCl + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CF2BrCl_JPL19.nc", + "parameterization": { + "AA": [ -134.80, 1.7084, -9.1540e-3, 2.1644e-5, -1.9863e-8 ], + "BB": [3.3070e-1, -5.0957e-3, 2.9361e-5, -7.6198e-8, 7.6825e-11 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 200.0, + "maximum wavelength": 302.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210, + "maximum": 300 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcf3br", + "__reaction": "CF3Br + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/H1301_JPL06.nc", + "parameterization": { + "AA": [ 62.563, -2.0068, 1.6592e-2, -5.6465e-5, 6.7459e-8 ], + "BB": [ -9.1755e-1, 1.8575e-2, -1.3857e-4, 4.5066e-7, -5.3803e-10 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 178.0, + "maximum wavelength": 280.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210.0, + "maximum": 300.0 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcfcl3", + "__reaction": "CCl3F + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CFCL3_JPL06.nc", + "parameterization": { + "AA": [ -84.611, 7.9551e-1, -2.0550e-3, -4.4812e-6, 1.5838e-8 ], + "BB": [ -5.7912, 1.1689e-1, -8.8069e-4, 2.9335e-6, -3.6421e-9 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 174.1, + "maximum wavelength": 230.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210, + "maximum": 300 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcfc113", + "__reaction": "CFC-113 + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CFC113_JPL06.nc", + "parameterization": { + "AA": [ -1087.9, 20.004, -1.3920e-1, 4.2828e-4, -4.9384e-7 ], + "BB": [ 12.493, -2.3937e-1, 1.7142e-3, -5.4393e-6, 6.4548e-9 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 182.0, + "maximum wavelength": 230.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210, + "maximum": 300 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcfc114", + "__reaction": "CFC-114 + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CFC114_JPL10.nc", + "parameterization": { + "AA": [ -160.50, 2.4807, -1.5202e-2, 3.8412e-5, -3.4373e-8 ], + "BB": [ -1.5296, 3.5248e-2, -2.9951e-4, 1.1129e-6, -1.5259e-9 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 172.0, + "maximum wavelength": 220.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210, + "maximum": 300 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcfc115", + "__reaction": "CFC-115 + hv -> Products", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/CFC115_JPL10.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcf2cl2", + "__reaction": "CCl2F2 + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CF2CL2_JPL06.nc", + "parameterization": { + "AA": [ -43.8954569, -2.403597e-1, -4.2619e-4, 9.8743e-6, 0.0 ], + "BB": [ 4.8438e-3, 4.96145e-4, -5.6953e-6, 0.0, 0.0 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 200.0, + "maximum wavelength": 231.0, + "base temperature": 296.0, + "base wavelength": 200.0, + "logarithm": "natural", + "temperature ranges": [ + { + "maximum": 219.999999999999, + "fixed value": 220.0 + }, + { + "minimum": 220, + "maximum": 296 + }, + { + "minimum": 296.00000000001, + "fixed value": 296.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jch2br2", + "__reaction": "CH2BR2 + hv -> 2*BR", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CH2BR2_1.nc", + "parameterization": { + "AA": [ -70.211776, 1.940326e-1, 2.726152e-3, -1.695472e-5, 2.500066e-8 ], + "BB": [ 2.899280, -4.327724e-2, 2.391599e-4, -5.807506e-7, 5.244883e-10 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 210.0, + "maximum wavelength": 290.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210, + "maximum": 300 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jch3br", + "__reaction": "CH3Br + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CH3BR_JPL06.nc", + "parameterization": { + "AA": [ 46.520, -1.4580, 1.1469e-2, -3.7627e-5, 4.3264e-8 ], + "BB": [ 9.3408e-1, -1.6887e-2, 1.1487e-4, -3.4881e-7, 3.9945e-10 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 200.0, + "maximum wavelength": 280.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210, + "maximum": 300 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jch3ccl3", + "__reaction": "CH3CCl3+hv->Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CH3CCl3_JPL19.nc", + "parameterization": { + "AA": [ 341.085191, -7.273362, 5.498387e-2, -1.827552e-4, 2.238640e-7 ], + "BB": [ -1.660090, 3.079969e-2, -2.106719e-4, 6.264984e-7, -6.781342e-10 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 182.0, + "maximum wavelength": 240.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210, + "maximum": 300 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jch3cl", + "__reaction": "CH3Cl + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CH3CL_JPL06.nc", + "parameterization": { + "AA": [ -299.80, 5.1047, -3.3630e-2, 9.5805e-5, -1.0135e-7 ], + "BB": [ -7.1727, 1.4837e-1, -1.1463e-3, 3.9188e-6, -4.9994e-9 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 174.1, + "maximum wavelength": 216.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210, + "maximum": 300 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jchbr3", + "__reaction": "CHBr3 + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/CHBR3_JPL10.nc", + "parameterization": { + "AA": [ -32.6067, 0.10308, 6.39e-5, -7.7392e-7, -2.2513e-9, 6.1376e-12 ], + "BB": [ 0.1582, -0.0014758, 3.8058e-6, 9.187e-10, -1.0772e-11, 0.0 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0, 5.0 ], + "minimum wavelength": 260.0, + "maximum wavelength": 362.0, + "base temperature": 296.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "invert temperature offset": true, + "temperature ranges": [ + { + "maximum": 259.999999999999, + "fixed value": 260.0 + }, + { + "minimum": 260.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcl2", + "__reaction": "Cl2 + hv -> Cl + Cl", + "cross section": { + "type": "Cl2+hv->Cl+Cl" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcl2o2", + "__reaction": "ClOOCl + hv -> Cl + ClOO", + "__comments": "TODO - this doesn't exactly match the products in TS1", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CL2O2_JPL10.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jclo", + "__reaction": "ClO + hv -> Cl + O", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CLO_JPL06.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jclono2_a", + "__reaction": "ClONO2 + hv -> Cl + NO3", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/ClONO2_1.nc" } + ], + "type": "ClONO2" + }, + "quantum yield": { + "type": "ClONO2+hv->Cl+NO3" + } + }, + { + "name": "jclono2_b", + "__reaction": "ClONO2 + hv -> ClO + NO2", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/ClONO2_1.nc" } + ], + "type": "ClONO2" + }, + "quantum yield": { + "type": "ClONO2+hv->ClO+NO2" + } + }, + { + "name": "jcof2", + "__reaction": "CF2O + hv -> Products", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CF2O_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jcofcl", + "__reaction": "CClFO + hv -> Products", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/CClFO_JPL19.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jh2402", + "__reaction": "H2402 + hv -> 2*BR + 2*COF2", + "__comments": "TUV data set name CF2BrCF2Br", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/H2402_JPL06.nc", + "parameterization": { + "AA": [ 34.026, -1.152616, 8.959798e-3, -2.9089e-5, 3.307212e-8 ], + "BB": [ 4.010664e-1, -8.358968e-3, 6.415741e-5, -2.157554e-7, 2.691871e-10 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 190.0, + "maximum wavelength": 290.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210.0, + "maximum": 300.0 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhcfc141b", + "__reaction": "HCFC-141b + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/HCFC141b_JPL10.nc", + "parameterization": { + "AA": [ -682.913042, 12.122290, -8.187699e-2, 2.437244e-4, -2.719103e-7 ], + "BB": [ 4.074747, -8.053899e-2, 5.946552e-4, -1.945048e-6, 2.380143e-9 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 172.0, + "maximum wavelength": 240.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210.0, + "maximum": 300.0 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhcfc142b", + "__reaction": "HCFC-142b + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/HCFC142b_JPL10.nc", + "parameterization": { + "AA": [ -328.092008, 6.342799, -4.810362e-2, 1.611991e-4, -2.042613e-7 ], + "BB": [ 4.289533e-1, -9.042817e-3, 7.018009e-5, -2.389064e-7, 3.039799e-10 ], + "lp": [ 0.0, 1.0, 2.0, 3.0, 4.0 ], + "minimum wavelength": 172.0, + "maximum wavelength": 230.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210.0, + "maximum": 300.0 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhcfc22", + "__reaction": "HCFC-22 + hv -> Products", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/HCFC22_JPL06.nc", + "parameterization wavelength grid": { + "name": "custom wavelengths", + "type": "from config file", + "units": "nm", + "values": [ + 169.0, 171.0, 173.0, 175.0, 177.0, 179.0, 181.0, 183.0, 185.0, + 187.0, 189.0, 191.0, 193.0, 195.0, 197.0, 199.0, 201.0, 203.0, + 205.0, 207.0, 209.0, 211.0, 213.0, 215.0, 217.0, 219.0, 221.0 + ] + }, + "parameterization": { + "AA": [ -106.029, 1.5038, -8.2476e-3, 1.4206e-5 ], + "BB": [ -1.3399e-1, 2.7405e-3, -1.8028e-5, 3.8504e-8 ], + "lp": [ 0.0, 1.0, 2.0, 3.0 ], + "minimum wavelength": 174.0, + "maximum wavelength": 204.0, + "base temperature": 273.0, + "base wavelength": 0.0, + "logarithm": "base 10", + "temperature ranges": [ + { + "maximum": 209.999999999999, + "fixed value": 210.0 + }, + { + "minimum": 210.0, + "maximum": 300.0 + }, + { + "minimum": 300.00000000001, + "fixed value": 300.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhcl", + "__reaction": "HCl + hv -> H + Cl", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/HCl_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhobr", + "__reaction": "HOBr + hv -> OH + Br", + "cross section": { + "type": "HOBr+hv->OH+Br" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhocl", + "__reaction": "HOCl + hv -> HO + Cl", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/HOCl_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "joclo", + "__reaction": "OClO + hv -> Products", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/OClO_1.nc" }, + { "file path": "data/cross_sections/OClO_2.nc" }, + { "file path": "data/cross_sections/OClO_3.nc" } + ], + "type": "OClO+hv->Products" + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jho2no2_a", + "__reaction": "HNO4 + hv -> OH + NO3", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/HO2NO2_JPL06.nc", + "parameterization": { + "type": "BURKHOLDER", + "netcdf file": { + "file path": "data/cross_sections/HO2NO2_temp_JPL06.nc" + }, + "A": -988.0, + "B": 0.69, + "temperature ranges": [ + { + "maximum": 279.999999999999, + "fixed value": 280.0 + }, + { + "minimum": 280.0, + "maximum": 350.0 + }, + { + "minimum": 350.00000000001, + "fixed value": 350.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 0.30, + "override bands": [ + { + "band": "range", + "minimum wavelength": 200.0, + "value": 0.20 + } + ] + } + }, + { + "name": "jho2no2_b", + "__reaction": "HNO4 + hv -> HO2 + NO2", + "cross section": { + "type": "temperature based", + "netcdf file": "data/cross_sections/HO2NO2_JPL06.nc", + "parameterization": { + "type": "BURKHOLDER", + "netcdf file": { + "file path": "data/cross_sections/HO2NO2_temp_JPL06.nc" + }, + "A": -988.0, + "B": 0.69, + "temperature ranges": [ + { + "maximum": 279.999999999999, + "fixed value": 280.0 + }, + { + "minimum": 280.0, + "maximum": 350.0 + }, + { + "minimum": 350.00000000001, + "fixed value": 350.0 + } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 0.70, + "override bands": [ + { + "band": "range", + "minimum wavelength": 200.0, + "value": 0.80 + } + ] + } + }, + { + "name": "jmacr_a", + "__reaction": "CH2=C(CH3)CHO->1.34HO2+0.66MCO3+1.34CH2O+CH3CO3", + "__comments": "Methacrolein photolysis channel 1", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/Methacrolein_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 0.005 + } + }, + { + "name": "jmacr_b", + "__reaction": "CH2=C(CH3)CHO->0.66OH+1.34CO", + "__comments": "Methacrolein photolysis channel 2", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/Methacrolein_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 0.005 + } + }, + { + "name": "jhyac", + "__reaction": "CH2(OH)COCH3->CH3CO3+HO2+CH2O", + "__comments": "hydroxy acetone TODO: the products of this reaction differ from standalone TUV-x", + "cross section": { + "netcdf files": [ + { "file path": "data/cross_sections/Hydroxyacetone_1.nc" } + ], + "type": "base" + }, + "quantum yield": { + "type": "base", + "constant value": 0.65 + } + }, + { + "name": "jh2o_a", + "__reaction": "H2O + hv -> OH + H", + "cross section": { + "type": "base", + "merge data": true, + "netcdf files": [ + { + "file path": "data/cross_sections/H2O_1.nc", + "zero above": 183.0 + }, + { + "file path": "data/cross_sections/H2O_2.nc", + "zero below": 183.00000000001, + "zero above": 190.0 + }, + { + "file path": "data/cross_sections/H2O_3.nc", + "zero below": 190.00000000001 + } + ] + }, + "quantum yield" : { + "type": "base", + "netcdf files": [ "data/quantum_yields/H2O_H_OH.nc" ] + } + }, + { + "name": "jh2o_b", + "__reaction": "H2O + hv -> H2 + O1D", + "cross section": { + "type": "base", + "merge data": true, + "netcdf files": [ + { + "file path": "data/cross_sections/H2O_1.nc", + "zero above": 183.0 + }, + { + "file path": "data/cross_sections/H2O_2.nc", + "zero below": 183.00000000001, + "zero above": 190.0 + }, + { + "file path": "data/cross_sections/H2O_3.nc", + "zero below": 190.00000000001 + } + ] + }, + "quantum yield" : { + "type": "base", + "netcdf files": [ "data/quantum_yields/H2O_H2_O1D.nc" ] + } + }, + { + "name": "jh2o_c", + "__reaction": "H2O + hv -> 2*H + O", + "cross section": { + "type": "base", + "merge data": true, + "netcdf files": [ + { + "file path": "data/cross_sections/H2O_1.nc", + "zero above": 183.0 + }, + { + "file path": "data/cross_sections/H2O_2.nc", + "zero below": 183.00000000001, + "zero above": 190.0 + }, + { + "file path": "data/cross_sections/H2O_3.nc", + "zero below": 190.00000000001 + } + ] + }, + "quantum yield" : { + "type": "base", + "netcdf files": [ "data/quantum_yields/H2O_2H_O3P.nc" ] + } + }, + { + "name": "jch4_a", + "__reaction": "CH4 + hv -> H + CH3O2", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/CH4_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 0.45 + } + }, + { + "name": "jch4_b", + "__reaction": "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", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/CH4_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 0.55 + } + }, + { + "name": "jco2", + "__reaction": "CO2 + hv -> CO + O", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/CO2_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhbr", + "__reaction": "HBR + hv -> BR + H", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/HBr_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jhf", + "__reaction": "HF + hv -> H + F", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/HF_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jsf6", + "__reaction": "SF6 + hv -> sink", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/SF6_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jh2so4", + "__reaction": "H2SO4 + hv -> SO3 + H2O", + "cross section": { + "type": "base", + "data": { + "default value": 0.0, + "point values": [ + { "wavelength": 121.65, "value": 6.3e-17 }, + { "wavelength": 525.0, "value": 1.43e-26 }, + { "wavelength": 625.0, "value": 1.8564e-25 }, + { "wavelength": 725.0, "value": 3.086999e-24 } + ] + } + }, + "quantum yield": { + "type": "H2SO4 Mills", + "netcdf files": [ + "data/quantum_yields/H2SO4_mills.nc" + ], + "parameterized wavelengths": [ + 525, + 625, + 725 + ], + "collision interval s": [ + 1.1e-9, + 8.9e-9, + 1.7e-7 + ], + "molecular diameter m": 4.18e-10, + "molecular weight kg mol-1": 98.078479e-3 + } + }, + { + "name": "jocs", + "__reaction": "OCS + hv -> S + CO", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/OCS_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jso", + "__reaction": "SO + hv -> S + O", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/SO_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jso2", + "__reaction": "SO2 + hv -> SO + O", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/SO2_Mills.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jso3", + "__reaction": "SO3 + hv -> SO2 + O", + "cross section": { + "type": "base", + "netcdf files": [ + { "file path": "data/cross_sections/SO3_1.nc" } + ] + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + }, + { + "name": "jno_i", + "__reaction": "NO + hv -> NOp + e", + "cross section": { + "type": "base", + "data": { + "default value": 0.0, + "point values": [ + { "wavelength": 121.65, "value": 2.0e-18 } + ] + } + }, + "quantum yield": { + "type": "base", + "constant value": 1.0 + } + } + ] + }, + "__CAM options": { + "disable clouds": false, + "disable aerosols": false, + "aliasing": { + "default matching": "backup", + "pairs": [ + { + "to": "jalknit", + "__reaction": "ALKNIT + hv -> NO2 + 0.4*CH3CHO + 0.1*CH2O + 0.25*CH3COCH3 + HO2 + 0.8*MEK", + "from": "jch3ooh" + }, + { + "to": "jpooh", + "__reaction": "POOH (C3H6OHOOH) + hv -> CH3CHO + CH2O + HO2 + OH", + "from": "jch3ooh" + }, + { + "to": "jch3co3h", + "__reaction": "CH3COOOH + hv -> CH3O2 + OH + CO2", + "from": "jh2o2", + "scale by": 0.28 + }, + { + "to": "jmpan", + "__reaction": "MPAN + hv -> MCO3 + NO2", + "from": "jpan" + }, + { + "to": "jc2h5ooh", + "__reaction": "C2H5OOH + hv -> CH3CHO + HO2 + OH", + "from": "jch3ooh" + }, + { + "to": "jc3h7ooh", + "__reaction": "C3H7OOH + hv -> 0.82*CH3COCH3 + OH + HO2", + "from": "jch3ooh" + }, + { + "to": "jc6h5ooh", + "__reaction": "C6H5OOH + hv -> PHENO + OH", + "from": "jch3ooh" + }, + { + "to": "jeooh", + "__reaction": "EOOH + hv -> EO + OH", + "from": "jch3ooh" + }, + { + "to": "jrooh", + "__reaction": "ROOH + hv -> CH3CO3 + CH2O + OH", + "from": "jch3ooh" + }, + { + "to": "jxooh", + "__reaction": "XOOH + hv -> OH", + "from": "jch3ooh" + }, + { + "to": "jonitr", + "__reaction": "ONITR + hv -> NO2", + "from": "jch3cho" + }, + { + "to": "jisopooh", + "__reaction": "ISOPOOH + hv -> 0.402*MVK + 0.288*MACR + 0.69*CH2O + HO2", + "from": "jch3ooh" + }, + { + "to": "jmek", + "__reaction": "MEK + hv -> CH3CO3 + C2H5O2", + "from": "jacet" + }, + { + "to": "jalkooh", + "__reaction": "ALKOOH + hv -> .4*CH3CHO + .1*CH2O + .25*CH3COCH3 + .9*HO2 + .8*MEK + OH", + "from": "jch3ooh" + }, + { + "to": "jbenzooh", + "__reaction": "BENZOOH + hv -> OH + GLYOXAL + 0.5*BIGALD1 + HO2", + "from": "jch3ooh" + }, + { + "to": "jbepomuc", + "__reaction": "BEPOMUC + hv -> BIGALD1 + 1.5*HO2 + 1.5*CO", + "from": "jno2", + "scale by": 0.1 + }, + { + "to": "jbigald", + "__reaction": "BIGALD + hv -> 0.45*CO + 0.13*GLYOXAL + 0.56*HO2 + 0.13*CH3CO3 + 0.18*CH3COCHO", + "from": "jno2", + "scale by": 0.2 + }, + { + "to": "jbigald1", + "__reaction": "BIGALD1 + hv -> 0.6*MALO2 + HO2", + "from": "jno2", + "scale by": 0.14 + }, + { + "to": "jbigald2", + "__reaction": "BIGALD2 + hv -> 0.6*HO2 + 0.6*DICARBO2", + "from": "jno2", + "scale by": 0.2 + }, + { + "to": "jbigald3", + "__reaction": "BIGALD3 + hv -> 0.6*HO2 + 0.6*CO + 0.6*MDIALO2", + "from": "jno2", + "scale by": 0.2 + }, + { + "to": "jbigald4", + "__reaction": "BIGALD4 + hv -> HO2 + CO + CH3COCHO + CH3CO3", + "from": "jno2", + "scale by": 0.006 + }, + { + "to": "jbzooh", + "__reaction": "BZOOH + hv -> BZALD + OH + HO2", + "from": "jch3ooh" + }, + { + "to": "jmekooh", + "__reaction": "MEKOOH + hv -> OH + CH3CO3 + CH3CHO", + "from": "jch3ooh" + }, + { + "to": "jtolooh", + "__reaction": "TOLOOH + hv -> OH + .45*GLYOXAL + .45*CH3COCHO + .9*BIGALD", + "from": "jch3ooh" + }, + { + "to": "jterpooh", + "__reaction": "TERPOOH + hv -> OH + .1*CH3COCH3 + HO2 + MVK + MACR", + "from": "jch3ooh" + }, + { + "to": "jhonitr", + "__reaction": "HONITR + hv -> NO2 + 0.67*HO2 + 0.33*CH3CHO + 0.33*CH2O + 0.33*CO + 0.33*GLYALD + 0.33*CH3CO3 + 0.17*HYAC + 0.17*CH3COCH3", + "from": "jch2o_a" + }, + { + "to": "jhpald", + "__reaction": "HPALD + hv -> BIGALD3 + OH + HO2", + "from": "jno2", + "scale by": 0.006 + }, + { + "to": "jisopnooh", + "__reaction": "ISOPNOOH + hv -> NO2 + HO2 + ISOPOOH", + "from": "jch3ooh" + }, + { + "to": "jnc4cho", + "__reaction": "NC4CHO + hv -> BIGALD3 + NO2 + HO2", + "from": "jch2o_a" + }, + { + "to": "jnoa", + "__reaction": "NOA + hv -> NO2 + CH2O + CH3CO3", + "from": "jch2o_a" + }, + { + "to": "jnterpooh", + "__reaction": "NTERPOOH + hv -> TERPROD1 + NO2 + OH", + "from": "jch3ooh" + }, + { + "to": "jphenooh", + "__reaction": "PHENOOH + hv -> OH + HO2 + 0.7*GLYOXAL", + "from": "jch3ooh" + }, + { + "to": "jtepomuc", + "__reaction": "TEPOMUC + hv -> 0.5*CH3CO3 + HO2 + 1.5*CO", + "from": "jno2", + "scale by": 0.1 + }, + { + "to": "jterp2ooh", + "__reaction": "TERP2OOH + hv -> OH + 0.375*CH2O + 0.3*CH3COCH3 + 0.25*CO + CO2 + TERPROD2 + HO2 + 0.25*GLYALD", + "from": "jch3ooh" + }, + { + "to": "jterpnit", + "__reaction": "TERPNIT + hv -> TERPROD1 + NO2 + HO2", + "from": "jch3ooh" + }, + { + "to": "jterprd1", + "__reaction": "TERPROD1 + hv -> HO2 + CO + TERPROD2", + "from": "jch3cho" + }, + { + "to": "jterprd2", + "__reaction": "TERPROD2 + hv -> 0.15*RO2 + 0.68*CH2O + 0.8*CO2 + 0.5*CH3COCH3 + 0.65*CH3CO3 + 1.2*HO2 + 1.7*CO", + "from": "jch3cho" + }, + { + "to": "jxylenooh", + "__reaction": "XYLENOOH + hv -> OH + HO2 + 0.34*GLYOXAL + 0.54*CH3COCHO + 0.06*BIGALD1 + 0.2*BIGALD2 + 0.15*BIGALD3 + 0.21*BIGALD4", + "from": "jch3ooh" + }, + { + "to": "jxylolooh", + "__reaction": "XYLOLOOH + hv -> OH + 0.17*GLYOXAL + 0.51*CH3COCHO + HO2", + "from": "jch3ooh" + }, + { + "to": "jsoa1_a1", + "__reaction": "soa1_a1 + hv -> Products", + "from": "jno2", + "scale by": 0.0004 + }, + { + "to": "jsoa1_a2", + "__reaction": "soa1_a2 + hv -> Products", + "from": "jno2", + "scale by": 0.0004 + }, + { + "to": "jsoa2_a1", + "__reaction": "soa2_a1 + hv -> Products", + "from": "jno2", + "scale by": 0.0004 + }, + { + "to": "jsoa2_a2", + "__reaction": "soa2_a2 + hv -> Products", + "from": "jno2", + "scale by": 0.0004 + }, + { + "to": "jsoa3_a1", + "__reaction": "soa3_a1 + hv -> Products", + "from": "jno2", + "scale by": 0.0004 + }, + { + "to": "jsoa3_a2", + "__reaction": "soa3_a2 + hv -> Products", + "from": "jno2", + "scale by": 0.0004 + }, + { + "to": "jsoa4_a1", + "__reaction": "soa4_a1 + hv -> Products", + "from": "jno2", + "scale by": 0.0004 + }, + { + "to": "jsoa4_a2", + "__reaction": "soa4_a2 + hv -> Products", + "from": "jno2", + "scale by": 0.0004 + }, + { + "to": "jsoa5_a1", + "__reaction": "soa5_a1 + hv -> Products", + "from": "jno2", + "scale by": 0.0004 + }, + { + "to": "jsoa5_a2", + "__reaction": "soa5_a2 + hv -> Products", + "from": "jno2", + "scale by": 0.0004 + } + ] + } + }, + "dose rates": { + "enable diagnostics": true, + "rates": [ + { + "name": "RB Meter, model 501", + "weights": { + "netcdf files": ["data/spectral_weights/RB-Meter,model_501_spectral_wght_1.nc"], + "type": "base", + "lower extrapolation": { "type": "boundary" } + } + }, + { + "name": "Eppley UV Photometer", + "weights": { + "netcdf files": ["data/spectral_weights/Eppley-UV-Photometer_spectral_wght_1.nc"], + "type": "Eppley UV Photometer", + "lower extrapolation": { "type": "boundary" } + } + }, + { + "name": "UV-A, 315-400 nm", + "weights": { + "type": "Notch Filter", + "notch filter begin": 315.0, + "notch filter end": 400.0 + } + }, + { + "name": "UV-B, 280-315 nm", + "weights": { + "type": "Notch Filter", + "notch filter begin": 280.0, + "notch filter end": 315.0 + } + }, + { + "name": "UV-B*, 280-320 nm", + "weights": { + "type": "Notch Filter", + "notch filter begin": 280.0, + "notch filter end": 320.0 + } + }, + { + "name": "vis+, > 400 nm", + "weights": { + "type": "Notch Filter", + "notch filter begin": 400.0, + "notch filter end": 700.0 + } + }, + { + "name": "Gaussian, 305 nm, 10 nm FWHM", + "weights": { + "type": "Gaussian", + "centroid": 305.0 + } + }, + { + "name": "Gaussian, 320 nm, 10 nm FWHM", + "weights": { + "type": "Gaussian", + "centroid": 320.0 + } + }, + { + "name": "Gaussian, 340 nm, 10 nm FWHM", + "weights": { + "type": "Gaussian", + "centroid": 340.0 + } + }, + { + "name": "Gaussian, 380 nm, 10 nm FWHM", + "weights": { + "type": "Gaussian", + "centroid": 380.0 + } + }, + { + "name": "SCUP-human (de Gruijl and van der Leun, 1994)", + "weights": { + "netcdf files": ["data/spectral_weights/SCUP-human(de Gruijl and van der Leun,1994)_spectral_wght_1.nc"], + "type": "base", + "lower extrapolation": { "type": "boundary" } + } + }, + { + "name": "PAR, 400-700 nm, umol m-2 s-1", + "weights": { + "type": "PAR, 400-700 nm, umol m-2 s-1" + } + }, + { + "name": "Exponential decay, 14 nm/10", + "weights": { + "type": "Exponential decay, 14 nm/10" + } + }, + { + "name": "SCUP-mice (de Gruijl et al., 1993)", + "weights": { + "type": "SCUP-mice (de Gruijl et al., 1993)" + } + }, + { + "name": "Standard human erythema (Webb et al., 2011)", + "weights": { + "type": "Standard human erythema (Webb et al., 2011)" + } + }, + { + "name": "UV index (WMO, 1994; Webb et al., 2011)", + "weights": { + "type": "UV index (WMO, 1994; Webb et al., 2011)" + } + }, + { + "name": "Phytoplankton (Boucher et al., 1994)", + "weights": { + "type": "Phytoplankton (Boucher et al., 1994)" + } + }, + { + "name": "Plant damage (Caldwell, 1971)", + "weights": { + "type": "Plant damage (Caldwell, 1971)" + } + }, + { + "name": "Plant damage,Flint&Caldwell,2003,orig.", + "weights": { + "type": "Plant damage,Flint&Caldwell,2003,orig." + } + }, + { + "name": "Plant damage,Flint&Caldwell,2003,ext390", + "weights": { + "type": "Plant damage,Flint&Caldwell,2003,ext390" + } + }, + { + "name": "Occupational TLV (ACGIH, 1992)", + "weights": { + "netcdf files": ["data/spectral_weights/Occupational TLV (ACGIH,1992)_spectral_wght_1.nc"], + "type": "base", + "lower extrapolation": { "type": "boundary" } + } + }, + { + "name": "Phytoplankton, phaeo (Cullen et al., 1992)", + "weights": { + "netcdf files": ["data/spectral_weights/Phytoplankton, phaeo(Cullen et al. 1992)_spectral_wght_1.nc"], + "type": "base", + "lower extrapolation": { "type": "boundary" } + } + }, + { + "name": "Phytoplankton, proro (Cullen et al., 1992)", + "weights": { + "netcdf files": ["data/spectral_weights/Phytoplankton, proro(Cullen et al. 1992)_spectral_wght_1.nc"], + "type": "base", + "lower extrapolation": { "type": "boundary" } + } + }, + { + "name": "Cataract, pig (Oriowo et al., 2001)", + "weights": { + "netcdf files": ["data/spectral_weights/Cataract, pig(Oriowo et al.,2001)_spectral_wght_1.nc"], + "type": "base", + "lower extrapolation": { "type": "boundary" } + } + }, + { + "name": "Previtamin-D3 (CIE 2006)", + "weights": { + "netcdf files": ["data/spectral_weights/Previtamin-D3 (CIE 2006)_spectral_wght_1.nc"], + "type": "base", + "lower extrapolation": { "type": "boundary" } + } + }, + { + "name": "NMSC (CIE 2006)", + "weights": { + "netcdf files": ["data/spectral_weights/NMSC (CIE 2006)_spectral_wght_1.nc"], + "type": "base", + "lower extrapolation": { "type": "boundary" } + } + }, + { + "name": "DNA damage, in vitro (Setlow, 1974)", + "weights": { + "netcdf files": ["data/spectral_weights/DNA_damage_in_vitro(Setlow,1974)_spectral_wght_1.nc"], + "type": "base", + "lower extrapolation": { "type": "boundary" } + } + }, + { + "name": "Erythema, humans (Anders et al., 1995)", + "weights": { + "netcdf files": ["data/spectral_weights/Erythema,humans(Anders et al.,1995)_spectral_wght_1.nc"], + "type": "base", + "lower extrapolation": { "type": "boundary" } + } + } + ] + } +} diff --git a/src/physics/rrtmg/radiation.F90 b/src/physics/rrtmg/radiation.F90 index efc271b70d..ef41075845 100644 --- a/src/physics/rrtmg/radiation.F90 +++ b/src/physics/rrtmg/radiation.F90 @@ -145,6 +145,14 @@ module radiation integer :: cld_idx = 0 integer :: cldfgrau_idx = 0 +integer :: swaertau_idx = -1 +integer :: swaertauw_idx = -1 +integer :: swaertauwg_idx = -1 + +integer :: swcldtau_idx = -1 +integer :: swcldtauw_idx = -1 +integer :: swcldtauwg_idx = -1 + character(len=4) :: diag(0:N_DIAG) =(/' ','_d1 ','_d2 ','_d3 ','_d4 ','_d5 ','_d6 ','_d7 ','_d8 ','_d9 ','_d10'/) ! averaging time interval for zenith angle @@ -248,6 +256,7 @@ subroutine radiation_register use physics_buffer, only: pbuf_add_field, dtype_r8 use radiation_data, only: rad_data_register + use radconstants, only: nswbands call pbuf_add_field('QRS' , 'global',dtype_r8,(/pcols,pver/), qrs_idx) ! shortwave radiative heating rate call pbuf_add_field('QRL' , 'global',dtype_r8,(/pcols,pver/), qrl_idx) ! longwave radiative heating rate @@ -626,6 +635,21 @@ subroutine radiation_init(pbuf2d) call add_default('FLUT', 3, ' ') end if + ! physic buffer fields for aerosol optical properties. + ! Get the aerosol optical properties from radiation code. + ! The optical properties from radiation code is in the form of tau*w*g + ! (extinction optical depth * single scattering albedo * asymmetry parameter) + ! Individual parameters (extinction optical depth, single scattering albedo, + ! asymmetry parameter) need to be derived to be used in TUVx + swaertau_idx = pbuf_get_index('SWAERTAU', errcode=err) ! optical depth + swaertauw_idx = pbuf_get_index('SWAERTAUW', errcode=err) ! optical depth * single scattering albedo + swaertauwg_idx = pbuf_get_index('SWAERTAUWG', errcode=err) ! optical depth * single scattering albedo * asymmetry parameter + + ! get the clouds optical properties from radiation code + swcldtau_idx = pbuf_get_index('SWCLDTAU', errcode=err) + swcldtauw_idx = pbuf_get_index('SWCLDTAUW', errcode=err) + swcldtauwg_idx = pbuf_get_index('SWCLDTAUWG', errcode=err) + end subroutine radiation_init !=============================================================================== @@ -861,6 +885,14 @@ subroutine radiation_tend( & real(r8) :: aer_tau_w_f(pcols,0:pver,nswbands) ! aerosol forward scattered fraction * w * tau real(r8) :: aer_lw_abs (pcols,pver,nlwbands) ! aerosol absorption optics depth (LW) + real(r8), pointer, dimension(:,:,:) :: swaertau ! shortwave aerosol tau + real(r8), pointer, dimension(:,:,:) :: swaertauw ! shortwave aerosol tau * w + real(r8), pointer, dimension(:,:,:) :: swaertauwg ! shortwave aerosol tau * w * g + + real(r8), pointer, dimension(:,:,:) :: swcldtau ! shortwave cloud tau + real(r8), pointer, dimension(:,:,:) :: swcldtauw ! shortwave cloud tau * w + real(r8), pointer, dimension(:,:,:) :: swcldtauwg ! shortwave cloud tau * w * g + real(r8) :: fns(pcols,pverp) ! net shortwave flux real(r8) :: fcns(pcols,pverp) ! net clear-sky shortwave flux real(r8) :: fnl(pcols,pverp) ! net longwave flux @@ -1215,6 +1247,29 @@ subroutine radiation_tend( & rd%aer_tau400(:ncol,:) = aer_tau(:ncol,:,idx_sw_diag+1) rd%aer_tau700(:ncol,:) = aer_tau(:ncol,:,idx_sw_diag-1) + ! Save aerosol optical properties in the physics buffer for + ! photolysis, but only for the climate call. + if (icall==0 .and. swcldtau_idx>0) then + call pbuf_get_field(pbuf, swaertau_idx, swaertau) + call pbuf_get_field(pbuf, swaertauw_idx, swaertauw) + call pbuf_get_field(pbuf, swaertauwg_idx, swaertauwg) + + swaertau(:ncol,1:pver,:) = aer_tau(:ncol,1:pver,:) + swaertauw(:ncol,1:pver,:) = aer_tau_w(:ncol,1:pver,:) + swaertauwg(:ncol,1:pver,:) = aer_tau_w_g(:ncol,1:pver,:) + + call pbuf_get_field(pbuf, swcldtau_idx, swcldtau) + call pbuf_get_field(pbuf, swcldtauw_idx, swcldtauw) + call pbuf_get_field(pbuf, swcldtauwg_idx, swcldtauwg) + + do i = 1,nswbands + swcldtau(:ncol,1:pver,i) = c_cld_tau(i,:ncol,1:pver) + swcldtauw(:ncol,1:pver,i) = c_cld_tau_w(i,:ncol,1:pver) + swcldtauwg(:ncol,1:pver,i) = c_cld_tau_w_g(i,:ncol,1:pver) + end do + + end if + call rad_rrtmg_sw( & lchnk, ncol, num_rrtmg_levs, r_state, state%pmid, & cldfprime, aer_tau, aer_tau_w, aer_tau_w_g, aer_tau_w_f, & diff --git a/src/physics/rrtmgp/radiation.F90 b/src/physics/rrtmgp/radiation.F90 index d4793223f3..75d4ddfe26 100644 --- a/src/physics/rrtmgp/radiation.F90 +++ b/src/physics/rrtmgp/radiation.F90 @@ -85,7 +85,7 @@ module radiation real(r8) :: fsnsc(pcols) ! Clear sky surface abs solar flux real(r8) :: fsntc(pcols) ! Clear sky total column abs solar flux real(r8) :: fsdsc(pcols) ! Clear sky surface downwelling solar flux - + real(r8) :: fsntoa(pcols) ! Net solar flux at TOA real(r8) :: fsntoac(pcols) ! Clear sky net solar flux at TOA real(r8) :: fsutoa(pcols) ! upwelling solar flux at TOA @@ -97,7 +97,7 @@ module radiation real(r8) :: fsn200(pcols) ! Net SW flux interpolated to 200 mb real(r8) :: fsn200c(pcols) ! Net clear-sky SW flux interpolated to 200 mb real(r8) :: fsnr(pcols) ! Net SW flux interpolated to tropopause - + real(r8) :: flux_sw_up(pcols,pverp) ! upward shortwave flux on interfaces real(r8) :: flux_sw_clr_up(pcols,pverp) ! upward shortwave clearsky flux real(r8) :: flux_sw_dn(pcols,pverp) ! downward flux @@ -148,7 +148,7 @@ module radiation logical :: graupel_in_rad = .false. ! graupel in radiation code logical :: use_rad_uniform_angle = .false. ! if true, use the namelist rad_uniform_angle for the coszrs calculation -! Gathered indices of day and night columns +! Gathered indices of day and night columns integer :: nday ! Number of daylight columns integer :: nnite ! Number of night columns integer :: idxday(pcols) ! chunk indices of daylight columns @@ -163,20 +163,20 @@ module radiation logical :: active_calls(0:N_DIAG) ! Physics buffer indices -integer :: qrs_idx = 0 -integer :: qrl_idx = 0 -integer :: su_idx = 0 -integer :: sd_idx = 0 -integer :: lu_idx = 0 -integer :: ld_idx = 0 +integer :: qrs_idx = 0 +integer :: qrl_idx = 0 +integer :: su_idx = 0 +integer :: sd_idx = 0 +integer :: lu_idx = 0 +integer :: ld_idx = 0 integer :: fsds_idx = 0 integer :: fsns_idx = 0 integer :: fsnt_idx = 0 integer :: flns_idx = 0 integer :: flnt_idx = 0 -integer :: cld_idx = 0 -integer :: cldfsnow_idx = 0 -integer :: cldfgrau_idx = 0 +integer :: cld_idx = 0 +integer :: cldfsnow_idx = 0 +integer :: cldfgrau_idx = 0 integer :: dei_idx integer :: mu_idx integer :: lambda_idx @@ -250,6 +250,11 @@ module radiation type(var_desc_t) :: cospcnt_desc ! cosp type(var_desc_t) :: nextsw_cday_desc +! Cloud optical properties TUV-x +integer :: swcldtau_idx = -1 ! shortwave cloud extinction optical depth. tau +integer :: swcldtauw_idx = -1 ! shortwave cloud extinction optical depth * single scattering albedo. tau*w +integer :: swcldtauwg_idx = -1 ! shortwave cloud extinction optical depth * single scattering albedo * asymmetry parameter. tau*w*g + !========================================================================================= contains !========================================================================================= @@ -308,7 +313,7 @@ subroutine radiation_readnl(nlfile) call mpi_bcast(use_rad_uniform_angle, 1, mpi_logical, mstrid, mpicom, ierr) if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: use_rad_uniform_angle") call mpi_bcast(rad_uniform_angle, 1, mpi_real8, mstrid, mpicom, ierr) - if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: rad_uniform_angle") + if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: rad_uniform_angle") call mpi_bcast(graupel_in_rad, 1, mpi_logical, mstrid, mpicom, ierr) if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: graupel_in_rad") @@ -327,7 +332,7 @@ subroutine radiation_readnl(nlfile) if (iradlw < 0) iradlw = nint((-iradlw *3600._r8)/dtime) if (irad_always < 0) irad_always = nint((-irad_always*3600._r8)/dtime) - !----------------------------------------------------------------------- + !----------------------------------------------------------------------- ! Print runtime options to log. !----------------------------------------------------------------------- @@ -356,8 +361,8 @@ subroutine radiation_register ! Register radiation fields in the physics buffer - call pbuf_add_field('QRS' , 'global',dtype_r8,(/pcols,pver/), qrs_idx) ! shortwave radiative heating rate - call pbuf_add_field('QRL' , 'global',dtype_r8,(/pcols,pver/), qrl_idx) ! longwave radiative heating rate + call pbuf_add_field('QRS' , 'global',dtype_r8,(/pcols,pver/), qrs_idx) ! shortwave radiative heating rate + call pbuf_add_field('QRL' , 'global',dtype_r8,(/pcols,pver/), qrl_idx) ! longwave radiative heating rate call pbuf_add_field('FSDS' , 'global',dtype_r8,(/pcols/), fsds_idx) ! Surface solar downward flux call pbuf_add_field('FSNS' , 'global',dtype_r8,(/pcols/), fsns_idx) ! Surface net shortwave flux @@ -432,8 +437,8 @@ subroutine radiation_init(pbuf2d) ! local variables character(len=512) :: errmsg - ! names of gases that are available in the model - ! -- needed for the kdist initialization routines + ! names of gases that are available in the model + ! -- needed for the kdist initialization routines type(ty_gas_concs_ccpp) :: available_gases real(r8) :: qrl_unused(1,1) @@ -453,7 +458,7 @@ subroutine radiation_init(pbuf2d) character(len=*), parameter :: sub = 'radiation_init' !----------------------------------------------------------------------- - + ! Initialize available_gases object call rrtmgp_pre_init(nradgas, available_gases, gaslist, gaslist_lc, errmsg, errflg) if (errflg /= 0) then @@ -525,7 +530,7 @@ subroutine radiation_init(pbuf2d) if (is_first_restart_step()) then cosp_cnt(begchunk:endchunk) = cosp_cnt_init else - cosp_cnt(begchunk:endchunk) = 0 + cosp_cnt(begchunk:endchunk) = 0 end if ! Add fields to history buffer @@ -719,7 +724,12 @@ subroutine radiation_init(pbuf2d) call add_default('FLUT', 2, ' ') call add_default('FLUT', 3, ' ') end if - + + ! get the clouds optical properties from radiation code + swcldtau_idx = pbuf_get_index('SWCLDTAU', errcode=ierr) + swcldtauw_idx = pbuf_get_index('SWCLDTAUW', errcode=ierr) + swcldtauwg_idx = pbuf_get_index('SWCLDTAUWG', errcode=ierr) + end subroutine radiation_init !=============================================================================== @@ -744,7 +754,7 @@ subroutine radiation_define_restart(file) end if end subroutine radiation_define_restart - + !=============================================================================== subroutine radiation_write_restart(file) @@ -763,7 +773,7 @@ subroutine radiation_write_restart(file) end if end subroutine radiation_write_restart - + !=============================================================================== subroutine radiation_read_restart(file) @@ -795,23 +805,23 @@ subroutine radiation_read_restart(file) end subroutine radiation_read_restart - + !=============================================================================== subroutine radiation_tend( & state, ptend, pbuf, cam_out, cam_in, net_flx, rd_out) - !----------------------------------------------------------------------- - ! + !----------------------------------------------------------------------- + ! ! CAM driver for radiation computation. - ! + ! !----------------------------------------------------------------------- ! Location/Orbital Parameters for cosine zenith angle use phys_grid, only: get_rlat_all_p, get_rlon_all_p use cam_control_mod, only: eccen, mvelpp, lambm0, obliqr use shr_orb_mod, only: shr_orb_decl, shr_orb_cosz - + ! CCPPized schemes use rrtmgp_inputs, only: rrtmgp_inputs_run use rrtmgp_pre, only: rrtmgp_pre_run, rrtmgp_pre_timestep_init @@ -863,7 +873,7 @@ subroutine radiation_tend( & type(rad_out_t), pointer :: rd ! allow rd_out to be optional by allocating a local object ! if the argument is not present logical :: write_output - + integer :: i, k, gas_idx, istat integer :: lchnk, ncol logical :: dosw, dolw @@ -959,7 +969,7 @@ subroutine radiation_tend( & real(r8), allocatable :: toa_flux(:,:) ! Scale factors based on spectral distribution from input irradiance dataset real(r8), allocatable :: sfac(:,:) - + ! Planck sources for LW. type(ty_source_func_lw_ccpp) :: sources_lw @@ -1017,6 +1027,11 @@ subroutine radiation_tend( & character(len=512) :: errmsg integer :: errflg, err character(len=*), parameter :: sub = 'radiation_tend' + + ! cloud optical properties for TUV-x + real(r8), pointer, dimension(:,:,:) :: swcldtau ! shortwave cloud tau + real(r8), pointer, dimension(:,:,:) :: swcldtauw ! shortwave cloud tau * w + real(r8), pointer, dimension(:,:,:) :: swcldtauwg ! shortwave cloud tau * w * g !-------------------------------------------------------------------------------------- lchnk = state%lchnk @@ -1234,6 +1249,19 @@ subroutine radiation_tend( & snow_tau_cloudsim(:ncol,:) = snow_tau(idx_sw_cloudsim,:,:) grau_tau_cloudsim(:ncol,:) = grau_tau(idx_sw_cloudsim,:,:) + ! cloud optical properties for TUV-x + if (swcldtau_idx>0) then + call pbuf_get_field(pbuf, swcldtau_idx, swcldtau) + call pbuf_get_field(pbuf, swcldtauw_idx, swcldtauw) + call pbuf_get_field(pbuf, swcldtauwg_idx, swcldtauwg) + + do i = 1,nswbands + swcldtau(:ncol,1:pver,i) = c_cld_tau(i,:ncol,1:pver) + swcldtauw(:ncol,1:pver,i) = c_cld_tau_w(i,:ncol,1:pver) + swcldtauwg(:ncol,1:pver,i) = c_cld_tau_w_g(i,:ncol,1:pver) + end do + endif + call rrtmgp_sw_mcica_subcol_gen_run(dosw, kdist_sw, nswbands, nswgpts, nday, nlay, & pver, tiny, idxday, ktopcam, ktoprad, cldfprime, c_cld_tau, & c_cld_tau_w, c_cld_tau_w_g, pmid_day, cloud_sw, errmsg, errflg) @@ -1287,7 +1315,7 @@ subroutine radiation_tend( & ! diagnostic aerosol output. call rrtmgp_set_aer_sw( & icall, state, pbuf, nday, idxday, nnite, idxnite, aer_sw) - + if (nday > 0) then ! Increment the gas optics (in atm_optics_sw) by the aerosol optics in aer_sw. @@ -1403,7 +1431,7 @@ subroutine radiation_tend( & call endrun(sub//': '//errmsg) end if !$acc end data - + ! Transform RRTMGP outputs to CAM outputs and compute heating rates. call set_lw_diags() @@ -1617,7 +1645,7 @@ subroutine set_sw_diags() cam_out%solld(idxday(i)) = sum(flux_dn_diffuse(i,nlay+1,1:9)) & + 0.5_r8 * flux_dn_diffuse(i,nlay+1,10) - + cam_out%solsd(idxday(i)) = 0.5_r8 * flux_dn_diffuse(i, nlay+1, 10) & + sum(flux_dn_diffuse(i,nlay+1,11:14)) end do @@ -1630,7 +1658,7 @@ subroutine set_lw_diags() ! Set CAM LW diagnostics !---------------------------------------------------------------------------- - + fnl = 0._r8 fcnl = 0._r8 @@ -1681,7 +1709,7 @@ end subroutine set_lw_diags subroutine heating_rate(type, ncol, flux_net, hrate) ! Compute heating rate as a dry static energy tendency - + ! arguments character(2), intent(in) :: type ! either LW or SW integer, intent(in) :: ncol @@ -1842,7 +1870,7 @@ subroutine radiation_output_lw(lchnk, ncol, icall, rd, pbuf, cam_out) call outfld('FLUT'//diag(icall), rd%flut, pcols, lchnk) call outfld('FLUTC'//diag(icall), rd%flutc, pcols, lchnk) - + ftem(:ncol) = rd%flutc(:ncol) - rd%flut(:ncol) call outfld('LWCF'//diag(icall), ftem, pcols, lchnk) @@ -1883,4 +1911,3 @@ end subroutine stop_on_err !========================================================================================= end module radiation - diff --git a/src/physics/rrtmgp/rrtmgp_inputs_cam.F90 b/src/physics/rrtmgp/rrtmgp_inputs_cam.F90 index af1b6fca3e..f582edf2a5 100644 --- a/src/physics/rrtmgp/rrtmgp_inputs_cam.F90 +++ b/src/physics/rrtmgp/rrtmgp_inputs_cam.F90 @@ -5,7 +5,7 @@ module rrtmgp_inputs_cam ! RRTMGP. Subset the number of model levels if CAM's top exceeds RRTMGP's ! valid domain. Add an extra layer if CAM's top is below 1 Pa. ! The vertical indexing increases from top to bottom of atmosphere in both -! CAM and RRTMGP arrays. +! CAM and RRTMGP arrays. !-------------------------------------------------------------------------------- use shr_kind_mod, only: r8=>shr_kind_r8 @@ -14,7 +14,7 @@ module rrtmgp_inputs_cam use physconst, only: stebol, pi use physics_types, only: physics_state -use physics_buffer, only: physics_buffer_desc +use physics_buffer, only: physics_buffer_desc, pbuf_get_index, pbuf_get_field use camsrfexch, only: cam_in_t use radconstants, only: nradgas, gaslist, nswbands, nlwbands @@ -25,7 +25,7 @@ module rrtmgp_inputs_cam get_ice_optics_sw, ice_cloud_get_rad_props_lw, & get_snow_optics_sw, snow_cloud_get_rad_props_lw, & get_grau_optics_sw, grau_cloud_get_rad_props_lw - + use mcica_subcol_gen, only: mcica_subcol_sw use aer_rad_props, only: aer_rad_props_sw, aer_rad_props_lw @@ -68,7 +68,12 @@ module rrtmgp_inputs_cam ! the SW optics datasets from RRTMG (even thought there is a slight mismatch in the ! band boundaries of the 2 bands that overlap with the LW bands). integer, parameter, dimension(14) :: rrtmg_to_rrtmgp_swbands = & - [ 14, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 ] + [ 14, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 ] + +! aerosol optical properties TUV-x +integer :: swaertau_idx = -1 ! shortwave aerosol extinction optical depth. tau +integer :: swaertauw_idx = -1 ! shortwave aerosol extinction optical depth * single scattering albedo. tau*w +integer :: swaertauwg_idx = -1 ! shortwave aerosol extinction optical depth * single scattering albedo * asymmetry parameter. tau*w*g !================================================================================================== contains @@ -77,7 +82,7 @@ module rrtmgp_inputs_cam !================================================================================================== subroutine rrtmgp_inputs_cam_init(ktcam, ktrad, idx_sw_diag_in, idx_nir_diag_in, idx_uv_diag_in, & idx_sw_cloudsim_in, idx_lw_diag_in, idx_lw_cloudsim_in) - + ! Note that this routine must be called after the calls to set_wavenumber_bands which set ! the sw/lw band boundaries in the radconstants module. @@ -107,6 +112,16 @@ subroutine rrtmgp_inputs_cam_init(ktcam, ktrad, idx_sw_diag_in, idx_nir_diag_in, call endrun('rrtmgp_inputs_cam_init: error during get_sw_spectral_boundaries_ccpp - message: '//errmsg) end if + ! physic buffer fields for aerosol optical properties. + ! Get the aerosol optical properties from radiation code. + ! The optical properties from radiation code is in the form of tau*w*g + ! (extinction optical depth * single scattering albedo * asymmetry parameter) + ! Individual parameters (extinction optical depth, single scattering albedo, + ! asymmetry parameter) need to be derived to be used in TUVx + swaertau_idx = pbuf_get_index('SWAERTAU', errcode=errflg) ! optical depth + swaertauw_idx = pbuf_get_index('SWAERTAUW', errcode=errflg) ! optical depth * single scattering albedo + swaertauwg_idx = pbuf_get_index('SWAERTAUWG', errcode=errflg) ! optical depth * single scattering albedo * asymmetry parameter + end subroutine rrtmgp_inputs_cam_init !========================================================================================= @@ -194,7 +209,7 @@ subroutine rrtmgp_set_aer_sw( & type(ty_optical_props_2str_ccpp), intent(inout) :: aer_sw ! local variables - integer :: i + integer :: i, ncol ! The optical arrays dimensioned in the vertical as 0:pver. ! The index 0 is for the extra layer used in the radiation @@ -207,6 +222,12 @@ subroutine rrtmgp_set_aer_sw( & real(r8) :: aer_tau_w_g(pcols,0:pver,nswbands) ! asymmetry parameter * w * tau real(r8) :: aer_tau_w_f(pcols,0:pver,nswbands) ! forward scattered fraction * w * tau ! aer_tau_w_f is not used by RRTMGP. + + ! for TUV-x + real(r8), pointer, dimension(:,:,:) :: swaertau ! shortwave aerosol tau (extinction optical depth) + real(r8), pointer, dimension(:,:,:) :: swaertauw ! shortwave aerosol tau * w (extinction optical depth * single scattering albedo) + real(r8), pointer, dimension(:,:,:) :: swaertauwg ! shortwave aerosol tau * w * g (extinction optical depth * single scattering albedo * asymmetry parameter) + character(len=*), parameter :: sub = 'rrtmgp_set_aer_sw' !-------------------------------------------------------------------------------- @@ -216,6 +237,20 @@ subroutine rrtmgp_set_aer_sw( & icall, state, pbuf, nnite, idxnite, & aer_tau, aer_tau_w, aer_tau_w_g, aer_tau_w_f) + ! Save aerosol optical properties in the physics buffer for + ! photolysis, but only for the climate call. + if (icall==0.and.swaertau_idx>0) then + call pbuf_get_field(pbuf, swaertau_idx, swaertau) + call pbuf_get_field(pbuf, swaertauw_idx, swaertauw) + call pbuf_get_field(pbuf, swaertauwg_idx, swaertauwg) + + ncol = state%ncol + + swaertau(:ncol,1:pver,:) = aer_tau(:ncol,1:pver,:) + swaertauw(:ncol,1:pver,:) = aer_tau_w(:ncol,1:pver,:) + swaertauwg(:ncol,1:pver,:) = aer_tau_w_g(:ncol,1:pver,:) + endif + ! The aer_sw object is only initialized if nday > 0. if (nday > 0) then @@ -224,7 +259,7 @@ subroutine rrtmgp_set_aer_sw( & aer_tau(:,:,:) = aer_tau( :,:,rrtmg_to_rrtmgp_swbands) aer_tau_w(:,:,:) = aer_tau_w( :,:,rrtmg_to_rrtmgp_swbands) aer_tau_w_g(:,:,:) = aer_tau_w_g(:,:,rrtmg_to_rrtmgp_swbands) - + ! If there is an extra layer in the radiation then this initialization ! will provide default values. aer_sw%optical_props%tau = 0.0_r8