diff --git a/MARBL_tools/MARBL_diagnostics_file_class.py b/MARBL_tools/MARBL_diagnostics_file_class.py index 1eadde4f..a1ad460e 100644 --- a/MARBL_tools/MARBL_diagnostics_file_class.py +++ b/MARBL_tools/MARBL_diagnostics_file_class.py @@ -15,7 +15,7 @@ class MARBL_diagnostics_class(object): # CONSTRUCTOR # ############### - def __init__(self, default_diagnostics_file, MARBL_settings): + def __init__(self, default_diagnostics_file, MARBL_settings, unit_system): """ Class constructor: read the JSON file and then construct self.diagnostics_dict """ @@ -44,7 +44,7 @@ def __init__(self, default_diagnostics_file, MARBL_settings): self.diagnostics_dict[diag_name] = dict(self._diagnostics[diag_name]) else: # (Also determine correct frequency if 'frequency' is a dict) - self.diagnostics_dict.update(MARBL_tools.expand_template_value(diag_name, MARBL_settings, self._diagnostics[diag_name], check_freq=True)) + self.diagnostics_dict.update(MARBL_tools.expand_template_value(diag_name, MARBL_settings, unit_system, self._diagnostics[diag_name], check_freq=True)) # ii. Delete diagnostics where dependencies are not met # (Some diagnostics have already been removed via expand_template_value()) @@ -58,5 +58,20 @@ def __init__(self, default_diagnostics_file, MARBL_settings): self.diagnostics_dict[diag_name]['frequency'] = [self.diagnostics_dict[diag_name]['frequency']] self.diagnostics_dict[diag_name]['operator'] = [self.diagnostics_dict[diag_name]['operator']] + # iv. update units + fix_units = {} + if unit_system == 'cgs': + fix_units["mmol/m^3 cm"] = "nmol/cm^2" + fix_units["mmol/m^3"] = "nmol/cm^3" + fix_units["meq/m^3"] = "neq/cm^3" + else: + fix_units["mmol/m^3 cm"] = "mmol/m^2" + fix_units["nmol/cm^2"] = "mmol/m^2" + fix_units["g/cm"] = "kg/m" + fix_units["cm"] = "m" + + for key, value in fix_units.items(): + self.diagnostics_dict[diag_name]["units"] = str(self.diagnostics_dict[diag_name]["units"]).replace(key, value) + for diag_name in diags_to_delete: del self.diagnostics_dict[diag_name] diff --git a/MARBL_tools/MARBL_generate_diagnostics_file.py b/MARBL_tools/MARBL_generate_diagnostics_file.py index cf1564e3..4b66b8a7 100755 --- a/MARBL_tools/MARBL_generate_diagnostics_file.py +++ b/MARBL_tools/MARBL_generate_diagnostics_file.py @@ -40,7 +40,9 @@ (default: None) -o DIAGNOSTICS_FILE_OUT, --diagnostics_file_out DIAGNOSTICS_FILE_OUT Name of file to be written (default: marbl.diags) - + -u {cgs,mks}, --unit_system {cgs,mks} + Unit system for parameter values (default: cgs) + -a, --append Append to existing diagnostics file (default: False) """ ####################################### @@ -129,9 +131,14 @@ def _parse_args(marbl_root): parser.add_argument('-o', '--diagnostics_file_out', action='store', dest='diagnostics_file_out', default='marbl.diags', help='Name of file to be written') + # Command line argument to where to write the settings file being generated + parser.add_argument('-u', '--unit_system', action='store', dest='unit_system', default='cgs', + choices=['cgs', 'mks'], help='Unit system for parameter values') + # Append to existing diagnostics file? parser.add_argument('-a', '--append', action='store_true', dest='append', help='Append to existing diagnostics file') + return parser.parse_args() ####################################### @@ -151,8 +158,8 @@ def _parse_args(marbl_root): from MARBL_tools import MARBL_settings_class from MARBL_tools import MARBL_diagnostics_class - DefaultSettings = MARBL_settings_class(args.default_settings_file, args.saved_state_vars_source, args.grid, args.settings_file_in) - MARBL_diagnostics = MARBL_diagnostics_class(args.default_diagnostics_file, DefaultSettings) + DefaultSettings = MARBL_settings_class(args.default_settings_file, args.saved_state_vars_source, args.grid, args.settings_file_in, args.unit_system) + MARBL_diagnostics = MARBL_diagnostics_class(args.default_diagnostics_file, DefaultSettings, args.unit_system) # Write the diagnostic file generate_diagnostics_file(MARBL_diagnostics, args.diagnostics_file_out, args.append) diff --git a/MARBL_tools/MARBL_generate_settings_file.py b/MARBL_tools/MARBL_generate_settings_file.py index 6be2b25f..7c691e27 100755 --- a/MARBL_tools/MARBL_generate_settings_file.py +++ b/MARBL_tools/MARBL_generate_settings_file.py @@ -45,12 +45,19 @@ def generate_settings_file(MARBL_settings, settings_file_out): fout = open(settings_file_out,"w") # Sort variables by subcategory + written_any = False for subcat_name in MARBL_settings.get_subcategory_names(): - fout.write("! %s\n" % subcat_name.split('. ')[1]) + header = "! %s\n" % subcat_name.split('. ')[1] + var_values = [] for varname in MARBL_settings.get_settings_dict_variable_names(subcat_name): - fout.write("%s = %s\n" % (varname, MARBL_settings.settings_dict[varname]['value'])) - if subcat_name != MARBL_settings.get_subcategory_names()[-1]: - fout.write("\n") + var_values.append("%s = %s\n" % (varname, MARBL_settings.settings_dict[varname]['value'])) + if len(var_values) > 0: + if written_any: + fout.write("\n") + written_any = True + fout.write(header) + for line in var_values: + fout.write(line) fout.close() ####################################### diff --git a/MARBL_tools/MARBL_settings_file_class.py b/MARBL_tools/MARBL_settings_file_class.py index beada5ce..b1bb2c99 100644 --- a/MARBL_tools/MARBL_settings_file_class.py +++ b/MARBL_tools/MARBL_settings_file_class.py @@ -51,7 +51,7 @@ def __init__(self, default_settings_file, saved_state_vars_source="settings_file # 5b. Need tracer count after determining PFT_derived_types, which means # determining which tracers are active if cat_name == "PFT_derived_types": - self.tracers_dict = self._get_tracers() + self.tracers_dict = self._get_tracers(unit_system) # 6. Abort if not all values from input file were processed # (That implies at least one variable from input file was not recognized) @@ -180,7 +180,7 @@ def get_settings_dict_variable_names(self, subcategory): ################################################################################ - def _get_tracers(self): + def _get_tracers(self, unit_system): """ Parses self._settings['_tracer_list'] to determine what tracers are enabled given other MARBL settings """ @@ -196,7 +196,7 @@ def _get_tracers(self): if re.search('\(\(.*\)\)', tracer_name) == None: tracer_dict[tracer_name] = dict(self._settings['_tracer_list'][tracer_name]) else: - tracer_dict.update(MARBL_tools.expand_template_value(tracer_name, self, self._settings['_tracer_list'][tracer_name])) + tracer_dict.update(MARBL_tools.expand_template_value(tracer_name, self, unit_system, self._settings['_tracer_list'][tracer_name])) # 2. Delete tracers where dependencies are not met # (Some tracers have already been removed via expand_template_value()) @@ -207,7 +207,10 @@ def _get_tracers(self): # 3. Add tend_units and flux_units to dictionary tracer_dict[tracer_name][u'tend_units'] = tracer_dict[tracer_name]['units'] + '/s' - tracer_dict[tracer_name][u'flux_units'] = tracer_dict[tracer_name]['units'] + ' cm/s' + if unit_system == 'cgs': + tracer_dict[tracer_name][u'flux_units'] = tracer_dict[tracer_name]['units'] + ' cm/s' + else: + tracer_dict[tracer_name][u'flux_units'] = tracer_dict[tracer_name]['units'] + ' m/s' for tracer_name in tracers_to_delete: del tracer_dict[tracer_name] @@ -270,6 +273,12 @@ def _process_variable_value(self, category_name, variable_name, unit_system): # Remove PFT-specific key del self._config_keyword[-1] + # If array is length 0, remove it from settings dictionary + if len(_get_array_info(this_var["_array_shape"], self.settings_dict, self.tracers_dict)) == 0: + for key in self.get_category_names(): + if variable_name in self._settings[key]: + del self._settings[key][variable_name] + ################################################################################ def _update_settings_dict(self, this_var, var_name, unit_system, base_name=''): @@ -282,6 +291,11 @@ def _update_settings_dict(self, this_var, var_name, unit_system, base_name=''): (just varname for scalars, but multiple keys for arrays) """ + # Return immediately if variable should not be in settings file + if 'dependencies' in this_var: + if this_var['dependencies'] not in self._config_keyword: + return + # Keys copied out of the settings file into settings_dict[varname]['attrs'] settings_dict_attrs = ['longname', 'units'] @@ -342,6 +356,7 @@ def _get_var_value(varname, var_dict, provided_keys, input_dict, units, unit_sys # (Fortran vars are case-insensitive) if varname.lower() in input_dict.keys(): # Ignore ' and " from strings + from_input_dict = True def_value = input_dict[varname.lower()].strip('"').strip("'") # Remove from input file dictionary; if dictionary is not empty after processing # all input file lines, then it included a bad variable in it @@ -349,11 +364,13 @@ def _get_var_value(varname, var_dict, provided_keys, input_dict, units, unit_sys # Note that if variable foo is an array, then foo = bar in the input file # should be treated as foo(1) = bar elif varname[-3:] == "(1)" and varname.lower()[:-3] in input_dict.keys(): + from_input_dict = True def_value = input_dict[varname.lower()[:-3]].strip('"').strip("'") # Remove from input file dictionary; if dictionary is not empty after processing # all input file lines, then it included a bad variable in it del input_dict[varname.lower()[:-3]] else: + from_input_dict = False # is default value a dictionary? If so, it depends on self._config_keyword # Otherwise we're interested in default value if isinstance(var_dict["default_value"], dict): @@ -378,7 +395,7 @@ def _get_var_value(varname, var_dict, provided_keys, input_dict, units, unit_sys def_value = var_dict["default_value"] # call translate value from JSON file to format F90 expects - value = _translate_JSON_value(def_value, var_dict["datatype"], units, unit_system) + value = _translate_JSON_value(def_value, var_dict["datatype"], units, unit_system, from_input_dict=from_input_dict) # Append to config keywords if JSON wants it if "_append_to_config_keywords" in var_dict.keys(): @@ -395,7 +412,7 @@ def _get_var_value(varname, var_dict, provided_keys, input_dict, units, unit_sys ################################################################################ -def _translate_JSON_value(value, datatype, units, unit_system): +def _translate_JSON_value(value, datatype, units, unit_system, from_input_dict=False): """ The value provided in the JSON file needs to be adjusted depending on the datatype of the variable. Strings need to be wrapped in "", and numbers written in scientific notation need to be formatted consistently. @@ -414,9 +431,9 @@ def _translate_JSON_value(value, datatype, units, unit_system): # if variable is a real but value is unicode evaluate it if datatype == "real": if isinstance(value, str): - return "%24.16e" % (eval(value)*_get_scale_factor(units, unit_system)) + return "%24.16e" % (eval(value)*_get_scale_factor(units, unit_system, from_input_dict)) else: - return value*_get_scale_factor(units, unit_system) + return value*_get_scale_factor(units, unit_system, from_input_dict) # if variable is an integer but value is unicode convert it if datatype == "integer" and isinstance(value, str): return int(value) @@ -439,7 +456,10 @@ def _unit_conv_dict(): new_dict['cgs']['m^2/mg s/yr'] = {'new_units': 'cm^2/ng s/yr', 'scale_factor': 0.01} return new_dict -def _get_scale_factor(units, unit_system): +def _get_scale_factor(units, unit_system, from_input_dict=False): + if from_input_dict: + # Do not apply scale factor to user-specified values + return 1. try: return _unit_conv_dict()[unit_system][units]['scale_factor'] except: @@ -494,7 +514,7 @@ def _sort_with_specific_suffix_first(list_in, suffix=None, sort_key=lambda s: s. ################################################################################ -def _get_value(val_in, settings_dict, tracers_dict, dict_prefix=''): +def _get_value(val_in, settings_dict, tracers_dict, dict_prefix='', return_zero_for_unfound=False): """ Translate val_in (which may be a variable name) to an integer value """ @@ -520,6 +540,8 @@ def _get_value(val_in, settings_dict, tracers_dict, dict_prefix=''): try: val_out = settings_dict[val_in]['value'] except: + if return_zero_for_unfound: + return 0 logger.error('Unknown variable name in _get_value: %s' % val_in) MARBL_tools.abort(1) return val_out @@ -551,13 +573,13 @@ def _get_array_info(array_size_in, settings_dict, tracers_dict, dict_prefix=''): logger.error("_get_array_info() only supports 1D and 2D arrays") MARBL_tools.abort(1) - for i in range(0, _get_value(array_size_in[0], settings_dict, tracers_dict, dict_prefix)): - for j in range(0, _get_value(array_size_in[1], settings_dict, tracers_dict, dict_prefix)): + for i in range(0, _get_value(array_size_in[0], settings_dict, tracers_dict, dict_prefix, return_zero_for_unfound=True)): + for j in range(0, _get_value(array_size_in[1], settings_dict, tracers_dict, dict_prefix, return_zero_for_unfound=True)): str_index.append("(%d,%d)" % (i+1,j+1)) return str_index # How many elements? May be an integer or an entry in self.settings_dict - for i in range(0, _get_value(array_size_in, settings_dict, tracers_dict, dict_prefix)): + for i in range(0, _get_value(array_size_in, settings_dict, tracers_dict, dict_prefix, return_zero_for_unfound=True)): str_index.append("(%d)" % (i+1)) return str_index diff --git a/MARBL_tools/MARBL_share.py b/MARBL_tools/MARBL_share.py index 6891baeb..18fd623a 100644 --- a/MARBL_tools/MARBL_share.py +++ b/MARBL_tools/MARBL_share.py @@ -2,6 +2,8 @@ and MARBL_diagnostics_file_class.py """ +import logging + ################################################################################ # PUBLIC MODULE METHODS # ################################################################################ @@ -14,6 +16,15 @@ def abort(err_code=0): ################################################################################ +class LogFormatter(logging.Formatter): + def format(self, record): + if record.levelno == logging.ERROR: + self._style._fmt = '%(levelname)s: %(message)s' + else: + self._style._fmt = '%(message)s' + return super().format(record) +################################################################################ + def sort(list_in, sort_key=lambda s: s.lower()): """ Sort a list; default is alphabetical (case-insensitive), but that can be overridden with the sort_key argument @@ -30,7 +41,7 @@ def natural_sort_key(string_): ################################################################################ -def expand_template_value(key_name, MARBL_settings, unprocessed_dict, check_freq=False): +def expand_template_value(key_name, MARBL_settings, unit_system, unprocessed_dict, check_freq=False): """ unprocessed_dict is a dictionary whose keys / values have templated strings (e.g. strings that depend on tracer name or PFT name). This subroutine replaces the templated values and adds the appropriate entry / entries to processed_dict @@ -47,27 +58,45 @@ def expand_template_value(key_name, MARBL_settings, unprocessed_dict, check_freq template = re.search('\(\(.*\)\)', key_name).group() template_fill_dict = dict() + + # Find counts + try: + autotroph_cnt = MARBL_settings.settings_dict['autotroph_cnt']['value'] + except: + autotroph_cnt = 0 + try: + zooplankton_cnt = MARBL_settings.settings_dict['zooplankton_cnt']['value'] + except: + zooplankton_cnt = 0 + if template == '((tracer_short_name))': fill_source = 'tracers' # diag name will replace template with key_fill_vals loop_for_replacement = MARBL_settings.tracers_dict.keys() elif template == '((autotroph_sname))': fill_source = 'autotrophs' - loop_for_replacement = range(1,MARBL_settings.settings_dict['autotroph_cnt']['value']+1) + loop_for_replacement = range(1,autotroph_cnt+1) elif template == '((zooplankton_sname))': fill_source = 'zooplankton' - loop_for_replacement = range(1,MARBL_settings.settings_dict['zooplankton_cnt']['value']+1) + loop_for_replacement = range(1,zooplankton_cnt+1) elif '_((zooplankton_sname))' in template: first_half = re.search('\(\(.*\)\)_', template).group()[:-1] if first_half == '((autotroph_sname))': - loop_for_replacement = range(1,(MARBL_settings.settings_dict['autotroph_cnt']['value'] * MARBL_settings.settings_dict['zooplankton_cnt']['value'])+1) + loop_for_replacement = range(1,(autotroph_cnt * zooplankton_cnt)+1) fill_source = 'phyto_graze_zoo' elif first_half == '((zooplankton_sname))': - loop_for_replacement = range(1, (MARBL_settings.settings_dict['zooplankton_cnt']['value'] * MARBL_settings.settings_dict['zooplankton_cnt']['value'])+1) + loop_for_replacement = range(1, (zooplankton_cnt * zooplankton_cnt)+1) fill_source = 'zoo_graze_zoo' elif template == '((particulate_flux_ref_depth_str))': fill_source = 'strings' - particulate_flux_ref_depth_str = '%dm' % MARBL_settings.settings_dict['particulate_flux_ref_depth']['value'] + try: + particulate_flux_ref_depth = float(MARBL_settings.settings_dict['particulate_flux_ref_depth']['value']) + if MARBL_settings.settings_dict['particulate_flux_ref_depth']['attrs']['units'] == 'cm': + particulate_flux_ref_depth = particulate_flux_ref_depth / 100. + except: + # If base_biotic_on is False, we don't need particulate_flux_ref_depth + particulate_flux_ref_depth = 0 + particulate_flux_ref_depth_str = '%dm' % particulate_flux_ref_depth loop_for_replacement = [ particulate_flux_ref_depth_str ] else: logger.error("%s is not a valid template value" % template) @@ -109,21 +138,21 @@ def expand_template_value(key_name, MARBL_settings, unprocessed_dict, check_freq key_fill_val = MARBL_settings.settings_dict[zoo_prefix + "sname"]['value'].strip('"') template_fill_dict['((zooplankton_lname))'] = MARBL_settings.settings_dict[zoo_prefix + "lname"]['value'].strip('"') elif fill_source == 'phyto_graze_zoo': - auto_ind = (item-1) % MARBL_settings.settings_dict['autotroph_cnt']['value'] + 1 + auto_ind = (item-1) % autotroph_cnt + 1 auto_prefix = "autotroph_settings(%d)%%" % auto_ind - zoo_ind = (item-1) // MARBL_settings.settings_dict['autotroph_cnt']['value'] + 1 + zoo_ind = (item-1) // autotroph_cnt + 1 zoo_prefix = "zooplankton_settings(%d)%%" % zoo_ind key_fill_val = MARBL_settings.settings_dict[auto_prefix + "sname"]['value'].strip('"') + '_' + MARBL_settings.settings_dict[zoo_prefix + "sname"]['value'].strip('"') template_fill_dict['((autotroph_lname))'] = MARBL_settings.settings_dict[auto_prefix + "lname"]['value'].strip('"') template_fill_dict['((zooplankton_lname))'] = MARBL_settings.settings_dict[zoo_prefix + "lname"]['value'].strip('"') elif fill_source == 'zoo_graze_zoo': - zoo_ind1 = (item-1) % MARBL_settings.settings_dict['zooplankton_cnt']['value'] + 1 + zoo_ind1 = (item-1) % zooplankton_cnt + 1 zoo_prefix1 = "zooplankton_settings(%d)%%" % zoo_ind1 - zoo_ind2 = (item-1) // MARBL_settings.settings_dict['zooplankton_cnt']['value'] + 1 + zoo_ind2 = (item-1) // zooplankton_cnt + 1 zoo_prefix2 = "zooplankton_settings(%d)%%" % zoo_ind2 key_fill_val = MARBL_settings.settings_dict[zoo_prefix1 + "sname"]['value'].strip('"') + '_' + MARBL_settings.settings_dict[zoo_prefix2 + "sname"]['value'].strip('"') - template_fill_dict['((zooplankton_lname))1'] = MARBL_settings.settings_dict[zoo_prefix1 + "lname"]['value'].strip('"') - template_fill_dict['((zooplankton_lname))2'] = MARBL_settings.settings_dict[zoo_prefix2 + "lname"]['value'].strip('"') + template_fill_dict['((zooplankton_lname1))'] = MARBL_settings.settings_dict[zoo_prefix1 + "lname"]['value'].strip('"') + template_fill_dict['((zooplankton_lname2))'] = MARBL_settings.settings_dict[zoo_prefix2 + "lname"]['value'].strip('"') elif fill_source == 'strings': key_fill_val = item template_fill_dict[template] = item @@ -144,9 +173,6 @@ def expand_template_value(key_name, MARBL_settings, unprocessed_dict, check_freq else: template2 = re.findall('\(\(.*?\)\)', unprocessed_dict[key]) try: - if (len(template2)==2) and (template2[0] == template2[1]): - template2[0] = template2[0]+'1' - template2[1] = template2[1]+'2' replacement_text = [template_fill_dict[i] for i in template2] except: logger.error("Can not replace '%s'" % template2) @@ -195,11 +221,22 @@ def expand_template_value(key_name, MARBL_settings, unprocessed_dict, check_freq ################################################################################ def meet_dependencies(input_dict, MARBL_settings): + import logging + logger = logging.getLogger(__name__) + + dependencies_or = input_dict.get('dependencies_or', False) if "dependencies" in input_dict.keys(): - for dependency in input_dict["dependencies"].keys(): - if dependency not in MARBL_settings.settings_dict.keys(): - logger.error("'%s' is not a valid dependency" % dependency) - abort(1) - if input_dict["dependencies"][dependency] != MARBL_settings.settings_dict[dependency]['value']: - return False + if dependencies_or: + for dependency in input_dict["dependencies"].keys(): + if dependency in MARBL_settings.settings_dict.keys(): + if input_dict["dependencies"][dependency] == MARBL_settings.settings_dict[dependency]['value']: + return True + return False + else: + for dependency in input_dict["dependencies"].keys(): + if dependency not in MARBL_settings.settings_dict.keys(): + logger.error("'%s' is not a valid dependency" % dependency) + abort(1) + if input_dict["dependencies"][dependency] != MARBL_settings.settings_dict[dependency]['value']: + return False return True diff --git a/MARBL_tools/__init__.py b/MARBL_tools/__init__.py index 67cb9547..a52c42c4 100644 --- a/MARBL_tools/__init__.py +++ b/MARBL_tools/__init__.py @@ -5,6 +5,7 @@ from .MARBL_utils import settings_dictionary_is_consistent from .MARBL_utils import diagnostics_dictionary_is_consistent from .MARBL_share import abort +from .MARBL_share import LogFormatter from .MARBL_share import sort from .MARBL_share import natural_sort_key from .MARBL_share import expand_template_value diff --git a/MARBL_tools/netcdf_metadata_check.py b/MARBL_tools/netcdf_metadata_check.py new file mode 100755 index 00000000..8bbdd5ce --- /dev/null +++ b/MARBL_tools/netcdf_metadata_check.py @@ -0,0 +1,173 @@ +#!/usr/bin/env python + +""" +Compare the units, longname and vertical grid for each variable in a MARBL history file to what is +defined in the diagnostics YAML file. + +usage: netcdf_metadata_check.py [-h] [-n NETCDF_FILE] [-j DEFAULT_DIAGNOSTICS_FILE] + [-f DEFAULT_SETTINGS_FILE] [-s SETTINGS_FILE_IN] [-u {cgs,mks}] + +Compare metadata in netCDF file to a JSON file + +optional arguments: + -h, --help show this help message and exit + -n NETCDF_FILE, --netcdf-file NETCDF_FILE + netCDF file to read metadata from (default: /Users/mlevy/NO_BACKUP/codes/MAR + BL/tests/regression_tests/call_compute_subroutines/history_1inst.nc) + -j DEFAULT_DIAGNOSTICS_FILE, --default_diagnostics_file DEFAULT_DIAGNOSTICS_FILE + Location of JSON-formatted MARBL diagnostics configuration file (default: + /Users/mlevy/NO_BACKUP/codes/MARBL/defaults/json/diagnostics_latest.json) + -f DEFAULT_SETTINGS_FILE, --default_settings_file DEFAULT_SETTINGS_FILE + Location of JSON-formatted MARBL settings configuration file (default: + /Users/mlevy/NO_BACKUP/codes/MARBL/defaults/json/settings_latest.json) + -s SETTINGS_FILE_IN, --settings_file_in SETTINGS_FILE_IN + A file that overrides values in settings JSON file (default: /Users/mlevy/NO + _BACKUP/codes/MARBL/tests/input_files/settings/marbl_with_o2_consumption_sca + lef.settings) + -u {cgs,mks}, --unit_system {cgs,mks} + Unit system for parameter values (default: cgs) +""" + +################## + +def _parse_args(): + """ Parse command line arguments + """ + + import argparse + + parser = argparse.ArgumentParser(description="Compare metadata in netCDF file to a JSON file", + formatter_class=argparse.ArgumentDefaultsHelpFormatter) + + # File to compare to baseline + # (default is $MARBLROOT/tests/regression_tests/call_compute_subroutines/history_1inst.nc) + default = os.path.join(marbl_root, + "tests", + "regression_tests", + "call_compute_subroutines", + "history_1inst.nc" + ) + parser.add_argument("-n", "--netcdf-file", action="store", dest="netcdf_file", + default=default, help="netCDF file to read metadata from") + + # Command line argument to point to JSON diagnostics file + # (default is $MARBLROOT/defaults/json/diagnostics_latest.json) + default=os.path.join(marbl_root, "defaults", "json", "diagnostics_latest.json") + parser.add_argument("-j", "--default_diagnostics_file", action="store", + dest="default_diagnostics_file", default=default, + help="Location of JSON-formatted MARBL diagnostics configuration file") + + # Command line argument to point to JSON settings file + # (default is $MARBLROOT/defaults/json/settings_latest.json) + default=os.path.join(marbl_root, "defaults", "json", "settings_latest.json") + parser.add_argument("-f", "--default_settings_file", action="store", + dest="default_settings_file", default=default, + help="Location of JSON-formatted MARBL settings configuration file") + + # Command line argument to specify a settings file which would override the JSON + # (default matches that used my call_compute_subroutines test) + default = os.path.join(marbl_root, + "tests", + "input_files", + "settings", + "marbl_with_o2_consumption_scalef.settings" + ) + parser.add_argument("-s", "--settings_file_in", action="store", dest="settings_file_in", + default=default, help="A file that overrides values in settings JSON file") + + # Command line argument to where to write the settings file being generated + parser.add_argument("-u", "--unit_system", action="store", dest="unit_system", default="cgs", + choices=["cgs", "mks"], help="Unit system for parameter values") + + return parser.parse_args() + +################## + +if __name__ == "__main__": + import logging + import os + import sys + import xarray as xr + + # We need marbl_root in python path so we can import MARBL_tools from generate_settings_file() + marbl_root = os.path.abspath(os.path.join(os.path.dirname(sys.argv[0]), "..")) + sys.path.append(marbl_root) + from MARBL_tools import MARBL_settings_class, MARBL_diagnostics_class, abort, LogFormatter + + # Set up logging + logger = logging.getLogger("__name__") + handler = logging.StreamHandler() + handler.setFormatter(LogFormatter()) + logger.setLevel(logging.DEBUG) + logger.addHandler(handler) + + # Parse command line arguments + args = _parse_args() + if args.settings_file_in == "None": + args.settings_file_in = None + + # Read netcdf file and generate diagnostics object + ds = xr.open_dataset(args.netcdf_file) + DefaultSettings = MARBL_settings_class(args.default_settings_file, + "settings_file", + None, + args.settings_file_in, + args.unit_system + ) + MARBL_diagnostics = MARBL_diagnostics_class(args.default_diagnostics_file, + DefaultSettings, + args.unit_system + ) + json_in = MARBL_diagnostics.diagnostics_dict + + # construct list of diagnostics generated by the driver + driver_vars = ["zt", "zw"] + for tracer in DefaultSettings.tracers_dict: + driver_vars.append(tracer) + driver_vars.append(f"STF_{tracer}") + driver_vars.append(f"J_{tracer}") + + diff_found = False + for var in ds.variables: + # skip diagnostics generated by the driver + if var in driver_vars or var.startswith("output_for_GCM"): + continue + + # Note difference if variable is in netcdf file but not JSON + if var not in json_in: + logger.info("Can not find %s in %s!", var, args.default_diagnostics_file) + diff_found = True + continue + + # Construct dictionaries to compare units, long_name, and vertical grid + netcdf_dict = {} + netcdf_dict["units"] = str(ds[var].attrs["units"]) + netcdf_dict["longname"] = ds[var].attrs["long_name"] + if "num_levels" in ds[var].dims: + netcdf_dict["vertical_grid"] = "layer_avg" + else: + netcdf_dict["vertical_grid"] = "none" + json_dict = {key: str(json_in[var][key]) for key in ["units", "longname", "vertical_grid"]} + + # Construct dictionary comparing each of the elements of the above dicts + differences = {key: netcdf_dict[key] != value for (key, value) in json_dict.items()} + + # Report any differences + if any(differences.values()): + diff_found = True + logger.info("Differences in %s:", var) + if differences["units"]: + logger.info("* JSON units: %s", json_dict["units"]) + logger.info("* netcdf units: %s", netcdf_dict["units"]) + if differences["longname"]: + logger.info("* JSON long name: %s", json_dict["longname"]) + logger.info("* netcdf long name: %s", netcdf_dict["longname"]) + if differences["vertical_grid"]: + logger.info("* JSON vertical grid: %s", json_dict["vertical_grid"]) + logger.info("* netcdf dimensions: %s", ds[var].dims) + +if diff_found: + logger.error("Differences found between JSON and netCDF metadata!") + abort(1) +else: + logger.info("No differences found between JSON and netCDF metadata") diff --git a/MARBL_tools/run_test_suite.sh b/MARBL_tools/run_test_suite.sh index e654117a..9711701d 100755 --- a/MARBL_tools/run_test_suite.sh +++ b/MARBL_tools/run_test_suite.sh @@ -52,7 +52,7 @@ print_status "CodeConsistency.py" >> ${RESULTS_CACHE} command -v pylint 2>&1 > /dev/null if [ $? -eq 0 ]; then cd ${MARBL_ROOT}/MARBL_tools - (set -x ; pylint --rcfile=pylintrc code_consistency.py netcdf_comparison.py) + (set -x ; pylint --rcfile=pylintrc code_consistency.py netcdf_comparison.py netcdf_metadata_check.py) STATUS=$(check_return $?) print_status "pylint" >> ${RESULTS_CACHE} fi @@ -160,11 +160,17 @@ if [ "${STATUS}" == "PASS" ]; then if [ "${STATUS}" == "PASS" ]; then cd ${MARBL_ROOT}/MARBL_tools + # Compare netCDF output to baseline BASE_ROOT=${MARBL_ROOT}/tests/input_files/baselines HIST_ROOT=${MARBL_ROOT}/tests/regression_tests/call_compute_subroutines (set -x ; ./netcdf_comparison.py -b ${BASE_ROOT}/call_compute_subroutines.history.nc -n ${HIST_ROOT}/history_1inst.nc --strict loose) STATUS=$(check_return $?) print_status "netCDF Comparison (1 inst (cgs) vs baseline (cgs))" >> ${RESULTS_CACHE} + + # Compare netCDF metadata to JSON file + (set -x ; ./netcdf_metadata_check.py) + STATUS=$(check_return $?) + print_status "netCDF metadata check" >> ${RESULTS_CACHE} fi # Initialize MARBL (with 4p2z), compute surface fluxes and interior tendencies @@ -174,12 +180,18 @@ if [ "${STATUS}" == "PASS" ]; then print_status "call_compute_subroutines.py -s ../../input_files/settings/marbl_with_4p2z_cgs.settings" >> ${RESULTS_CACHE} if [ "${STATUS}" == "PASS" ]; then + # Compare netCDF output to baseline cd ${MARBL_ROOT}/MARBL_tools BASE_ROOT=${MARBL_ROOT}/tests/input_files/baselines HIST_ROOT=${MARBL_ROOT}/tests/regression_tests/call_compute_subroutines (set -x ; ./netcdf_comparison.py -b ${BASE_ROOT}/call_compute_subroutines.history_4p2z.nc -n ${HIST_ROOT}/history_1inst.nc --strict loose) STATUS=$(check_return $?) print_status "netCDF Comparison (1 inst (cgs, 4p2z) vs baseline (cgs, 4p2z))" >> ${RESULTS_CACHE} + + # Compare netCDF metadata to JSON file + (set -x ; ./netcdf_metadata_check.py -s ../tests/input_files/settings/marbl_with_4p2z_cgs.settings -f ../defaults/json/settings_latest+4p2z.json) + STATUS=$(check_return $?) + print_status "netCDF metadata check (4p2z)" >> ${RESULTS_CACHE} fi # Initialize MARBL (with 4p2z), compute surface fluxes and interior tendencies in mks instead of cgs @@ -197,6 +209,42 @@ if [ "${STATUS}" == "PASS" ]; then print_status "netCDF Comparison (1 inst (mks, 4p2z) vs baseline (cgs, 4p2z))" >> ${RESULTS_CACHE} fi + # Initialize MARBL (with abio tracers), compute surface fluxes and interior tendencies + cd ${MARBL_ROOT}/tests/regression_tests/call_compute_subroutines + (set -x ; ./call_compute_subroutines.py -s ../../input_files/settings/marbl_with_abio_only.settings) + STATUS=$(check_return $?) + print_status "call_compute_subroutines.py -s ../../input_files/settings/marbl_with_abio_only.settings" >> ${RESULTS_CACHE} + + if [ "${STATUS}" == "PASS" ]; then + # Compare netCDF output to baseline + cd ${MARBL_ROOT}/MARBL_tools + BASE_ROOT=${MARBL_ROOT}/tests/input_files/baselines + HIST_ROOT=${MARBL_ROOT}/tests/regression_tests/call_compute_subroutines + (set -x ; ./netcdf_comparison.py -b ${BASE_ROOT}/call_compute_subroutines.history_with_abio_only.nc -n ${HIST_ROOT}/history_1inst.nc --strict loose) + STATUS=$(check_return $?) + print_status "netCDF Comparison (1 inst (cgs, with abio) vs baseline (cgs, with abio))" >> ${RESULTS_CACHE} + + # Compare netCDF metadata to JSON file + (set -x ; ./netcdf_metadata_check.py -s ../tests/input_files/settings/marbl_with_abio_only.settings) + STATUS=$(check_return $?) + print_status "netCDF metadata check (abio only)" >> ${RESULTS_CACHE} + fi + + # Initialize MARBL (with abio tracers), compute surface fluxes and interior tendencies in mks instead of cgs + cd ${MARBL_ROOT}/tests/regression_tests/call_compute_subroutines + (set -x ; ./call_compute_subroutines.py -s ../../input_files/settings/marbl_with_abio_only.settings -u mks) + STATUS=$(check_return $?) + print_status "call_compute_subroutines.py -s ../../input_files/settings/marbl_with_abio_only.settings -u mks" >> ${RESULTS_CACHE} + + if [ "${STATUS}" == "PASS" ]; then + cd ${MARBL_ROOT}/MARBL_tools + BASE_ROOT=${MARBL_ROOT}/tests/input_files/baselines + HIST_ROOT=${MARBL_ROOT}/tests/regression_tests/call_compute_subroutines + (set -x ; ./netcdf_comparison.py -b ${BASE_ROOT}/call_compute_subroutines.history_with_abio_only.nc -n ${HIST_ROOT}/history_1inst.nc --strict loose) + STATUS=$(check_return $?) + print_status "netCDF Comparison (1 inst (mks, with abio) vs baseline (cgs, with abio))" >> ${RESULTS_CACHE} + fi + # Initialize MARBL (with ciso tracers), compute surface fluxes and interior tendencies cd ${MARBL_ROOT}/tests/regression_tests/call_compute_subroutines (set -x ; ./call_compute_subroutines.py -s ../../input_files/settings/marbl_with_ciso.settings) @@ -204,12 +252,18 @@ if [ "${STATUS}" == "PASS" ]; then print_status "call_compute_subroutines.py -s ../../input_files/settings/marbl_with_ciso.settings" >> ${RESULTS_CACHE} if [ "${STATUS}" == "PASS" ]; then + # Compare netCDF output to baseline cd ${MARBL_ROOT}/MARBL_tools BASE_ROOT=${MARBL_ROOT}/tests/input_files/baselines HIST_ROOT=${MARBL_ROOT}/tests/regression_tests/call_compute_subroutines (set -x ; ./netcdf_comparison.py -b ${BASE_ROOT}/call_compute_subroutines.history_with_ciso.nc -n ${HIST_ROOT}/history_1inst.nc --strict loose) STATUS=$(check_return $?) print_status "netCDF Comparison (1 inst (cgs, with ciso) vs baseline (cgs, with ciso))" >> ${RESULTS_CACHE} + + # Compare netCDF metadata to JSON file + (set -x ; ./netcdf_metadata_check.py -s ../tests/input_files/settings/marbl_with_ciso.settings) + STATUS=$(check_return $?) + print_status "netCDF metadata check (ciso)" >> ${RESULTS_CACHE} fi # Initialize MARBL (with ciso tracers), compute surface fluxes and interior tendencies in mks instead of cgs diff --git a/defaults/diagnostics_latest.yaml b/defaults/diagnostics_latest.yaml index a30f3322..e9d17506 100644 --- a/defaults/diagnostics_latest.yaml +++ b/defaults/diagnostics_latest.yaml @@ -17,12 +17,16 @@ # Surface forcing diagnostics # ################################################################################ -############### -# Base module # -############### +#################### +# Always Available # +#################### ECOSYS_IFRAC : - longname : Ice Fraction for ecosys fluxes # Want more consistent capitalization + dependencies : + lflux_gas_o2 : .true. + lflux_gas_co2 : .true. + dependencies_or : true + longname : Ice Fraction units : fraction vertical_grid : none frequency : @@ -32,7 +36,11 @@ ECOSYS_IFRAC : - average - average ECOSYS_XKW : - longname : XKW for ecosys fluxes # Want more consistent capitalization + dependencies : + lflux_gas_o2 : .true. + lflux_gas_co2 : .true. + dependencies_or : true + longname : XKW units : cm/s vertical_grid : none frequency : @@ -42,30 +50,63 @@ ECOSYS_XKW : - average - average ECOSYS_ATM_PRESS : - longname : Atmospheric Pressure for ecosys fluxes # Want more consistent capitalization + dependencies : + lflux_gas_o2 : .true. + lflux_gas_co2 : .true. + dependencies_or : true + longname : Atmospheric Pressure units : atmospheres vertical_grid : none frequency : medium operator : average +PV_CO2 : + dependencies : + lflux_gas_co2 : .true. + longname : CO2 Piston Velocity + units : cm/s + vertical_grid : none + frequency : never + operator : average +SCHMIDT_CO2 : + dependencies : + lflux_gas_co2 : .true. + longname : CO2 Schmidt Number for base biotic tracers fluxes + units : 1 + vertical_grid : none + frequency : medium + operator : average + +############### +# Base module # +############### + PV_O2 : - longname : PV_O2 # Should be "O2 Piston Velocity" to match PV_CO2? + dependencies : + base_bio_on : .true. + longname : O2 Piston Velocity units : cm/s vertical_grid : none frequency : never operator : average SCHMIDT_O2 : + dependencies : + base_bio_on : .true. longname : O2 Schmidt Number units : 1 vertical_grid : none frequency : medium operator : average O2SAT : + dependencies : + base_bio_on : .true. longname : O2 Saturation units : mmol/m^3 vertical_grid : none frequency : medium operator : average CO2STAR : &CO2STAR + dependencies : + base_bio_on : .true. longname : CO2 Star units : mmol/m^3 vertical_grid : none @@ -73,8 +114,10 @@ CO2STAR : &CO2STAR operator : average CO2STAR_ALT_CO2 : << : *CO2STAR - longname : CO2 Star, Alternate CO2 + longname : CO2 Star, Alternative CO2 DCO2STAR : &DCO2STAR + dependencies : + base_bio_on : .true. longname : D CO2 Star units : mmol/m^3 vertical_grid : none @@ -84,6 +127,8 @@ DCO2STAR_ALT_CO2 : << : *DCO2STAR longname : D CO2 Star, Alternative CO2 pCO2SURF : &pCO2SURF + dependencies : + base_bio_on : .true. longname : surface pCO2 units : ppmv vertical_grid : none @@ -95,6 +140,8 @@ pCO2SURF_ALT_CO2 : frequency : never operator : average DpCO2 : &DpCO2 + dependencies : + base_bio_on : .true. longname : D pCO2 units : ppmv vertical_grid : none @@ -109,19 +156,9 @@ DpCO2_ALT_CO2 : longname : D pCO2, Alternative CO2 frequency : medium operator : average -PV_CO2 : - longname : CO2 Piston Velocity - units : cm/s - vertical_grid : none - frequency : never - operator : average -SCHMIDT_CO2 : - longname : CO2 Schmidt Number - units : 1 - vertical_grid : none - frequency : medium - operator : average FG_CO2 : &FG_CO2 # rename ind%DIC_GAS_FLUX -> ind%FG_CO2 + dependencies : + base_bio_on : .true. longname : DIC Surface Gas Flux units : mmol/m^3 cm/s vertical_grid : none @@ -137,6 +174,8 @@ FG_ALT_CO2 : # rename ind%DIC_GAS_FLUX_ALT_CO2 -> ind%FG_ALT_CO2 frequency : medium operator : average PH : &PH + dependencies : + base_bio_on : .true. longname : Surface pH units : 1 vertical_grid : none @@ -146,45 +185,182 @@ PH_ALT_CO2 : << : *PH longname : Surface pH, Alternative CO2 ATM_CO2 : &ATM_CO2 - longname : Atomspheric CO2 + dependencies : + base_bio_on : .true. + longname : Atmospheric CO2 units : ppmv vertical_grid : none frequency : medium operator : average ATM_ALT_CO2 : << : *ATM_CO2 - longname : Atomspheric CO2 + longname : Atmospheric Alternative CO2 IRON_FLUX : + dependencies : + base_bio_on : .true. longname : Atmospheric Iron Flux units : mmol/m^2/s vertical_grid : none frequency : medium operator : average DUST_FLUX : - longname : Dust Flux # Should be "Atmospheric Dust Flux?" + dependencies : + base_bio_on : .true. + longname : Atmospheric Dust Flux units : g/cm^2/s vertical_grid : none frequency : never operator : average NOx_FLUX : + dependencies : + base_bio_on : .true. longname : Flux of NOx from Atmosphere units : nmol/cm^2/s vertical_grid : none frequency : medium operator : average NHy_FLUX : + dependencies : + base_bio_on : .true. longname : Flux of NHy from Atmosphere units : nmol/cm^2/s vertical_grid : none frequency : medium operator : average NHx_SURFACE_EMIS : + dependencies : + base_bio_on : .true. longname : Emission of NHx to Atmosphere units : nmol/cm^2/s vertical_grid : none frequency : medium operator : average +############### +# abio module # +############### + +ABIO_pCO2 : + dependencies : + abio_dic_on : .true. + lflux_gas_co2 : .true. + longname : CO2 Atmospheric Partial Pressure for Abiotic DIC Tracer Fluxes + units : ppm + vertical_grid : none + frequency : medium + operator : average +ABIO_D14C_atm : + dependencies : + abio_dic_on : .true. + lflux_gas_co2 : .true. + longname : Atmospheric Delta 14C for Abiotic DIC Tracer Fluxes + units : permil + vertical_grid : none + frequency : medium + operator : average +ABIO_CO2STAR : + dependencies : + abio_dic_on : .true. + lflux_gas_co2 : .true. + longname : CO2 Star for Abiotic DIC Tracer Fluxes + units : mmol/m^3 + vertical_grid : none + frequency : medium + operator : average +ABIO_DCO2STAR : + dependencies : + abio_dic_on : .true. + lflux_gas_co2 : .true. + longname : D CO2 Star for Abiotic DIC Tracer Fluxes + units : mmol/m^3 + vertical_grid : none + frequency : medium + operator : average +ABIO_pCO2SURF : + dependencies : + abio_dic_on : .true. + lflux_gas_co2 : .true. + longname : Surface pCO2 for Abiotic DIC Tracer Fluxes + units : ppmv + vertical_grid : none + frequency : medium + operator : average +ABIO_DpCO2 : + dependencies : + abio_dic_on : .true. + lflux_gas_co2 : .true. + longname : D pCO2 for Abiotic DIC Tracer Fluxes + units : ppmv + vertical_grid : none + frequency : medium + operator : average +ABIO_PH : + dependencies : + abio_dic_on : .true. + lflux_gas_co2 : .true. + longname : Surface pH for Abiotic DIC Tracer Fluxes + units : 1 + vertical_grid : none + frequency : medium + operator : average +ABIO_ALK_SURF : + dependencies : + abio_dic_on : .true. + lflux_gas_co2 : .true. + longname : Surface Alkalinity for Abiotic DIC Tracer Fluxes + units : meq/m^3 + vertical_grid : none + frequency : medium + operator : average +ABIO_FG_DIC : + dependencies : + abio_dic_on : .true. + lflux_gas_co2 : .true. + longname : Surface Gas Flux of Abiotic DIC + units : mmol/m^3 cm/s + vertical_grid : none + frequency : medium + operator : average +ABIO_FG_DI14C : + dependencies : + abio_dic_on : .true. + lflux_gas_co2 : .true. + longname : Surface Gas Flux of Abiotic DI14C + units : mmol/m^3 cm/s + vertical_grid : none + frequency : medium + operator : average +d_SF_ABIO_DIC_d_ABIO_DIC : + dependencies : + abio_dic_on : .true. + labio_derivative_diags : .true. + lflux_gas_co2 : .true. + longname : Derivative of ABIO_FG_DIC wrt ABIO_DIC + units : cm/s + vertical_grid : none + frequency : never + operator : average +d_SF_ABIO_DI14C_d_ABIO_DIC : + dependencies : + abio_dic_on : .true. + labio_derivative_diags : .true. + lflux_gas_co2 : .true. + longname : Derivative of ABIO_FG_DI14C wrt ABIO_DIC + units : cm/s + vertical_grid : none + frequency : never + operator : average +d_SF_ABIO_DI14C_d_ABIO_DI14C : + dependencies : + abio_dic_on : .true. + labio_derivative_diags : .true. + lflux_gas_co2 : .true. + longname : Derivative of ABIO_FG_DI14C wrt ABIO_DI14C + units : cm/s + vertical_grid : none + frequency : never + operator : average + ############### # ciso module # ############### @@ -224,7 +400,7 @@ CISO_FG_d13C : CISO_D13C_atm : dependencies : ciso_on : .true. - longname : Atmospheric Delta 13C in permil + longname : Atmospheric Delta 13C units : permil vertical_grid : none frequency : medium @@ -296,7 +472,7 @@ CISO_FG_d14C : CISO_D14C_atm : dependencies : ciso_on : .true. - longname : Atmospheric Delta 14C in permil + longname : Atmospheric Delta 14C units : permil vertical_grid : none frequency : medium @@ -327,114 +503,152 @@ CISO_R14C_atm : ############### zsatcalc : + dependencies : + base_bio_on : .true. longname : Calcite Saturation Depth units : cm vertical_grid : none frequency : medium operator : average zsatarag : + dependencies : + base_bio_on : .true. longname : Aragonite Saturation Depth units : cm vertical_grid : none frequency : medium operator : average O2_ZMIN : + dependencies : + base_bio_on : .true. longname : Vertical Minimum of O2 units : mmol/m^3 vertical_grid : none frequency : medium operator : average O2_ZMIN_DEPTH : - longname : Vertical Minimum of O2 + dependencies : + base_bio_on : .true. + longname : Depth of Vertical Minimum of O2 units : cm vertical_grid : none frequency : medium operator : average photoC_TOT_zint : + dependencies : + base_bio_on : .true. longname : Total C Fixation Vertical Integral units : mmol/m^3 cm/s vertical_grid : none frequency : medium operator : average photoC_TOT_zint_100m : + dependencies : + base_bio_on : .true. longname : Total C Fixation Vertical Integral, 0-100m units : mmol/m^3 cm/s vertical_grid : none frequency : medium operator : average photoC_NO3_TOT_zint : + dependencies : + base_bio_on : .true. longname : Total C Fixation from NO3 Vertical Integral units : mmol/m^3 cm/s vertical_grid : none frequency : medium operator : average photoC_NO3_TOT_zint_100m : + dependencies : + base_bio_on : .true. longname : Total C Fixation from NO3 Vertical Integral, 0-100m units : mmol/m^3 cm/s vertical_grid : none frequency : medium operator : average DOC_prod_zint : + dependencies : + base_bio_on : .true. longname : Vertical Integral of DOC Production units : mmol/m^3 cm/s vertical_grid : none frequency : medium operator : average DOC_prod_zint_100m : + dependencies : + base_bio_on : .true. longname : Vertical Integral of DOC Production, 0-100m units : mmol/m^3 cm/s vertical_grid : none frequency : medium operator : average DOC_remin_zint : + dependencies : + base_bio_on : .true. longname : Vertical Integral of DOC Remineralization units : mmol/m^3 cm/s vertical_grid : none frequency : medium operator : average DOC_remin_zint_100m : + dependencies : + base_bio_on : .true. longname : Vertical Integral of DOC Remineralization, 0-100m units : mmol/m^3 cm/s vertical_grid : none frequency : medium operator : average DOCr_remin_zint : + dependencies : + base_bio_on : .true. longname : Vertical Integral of DOCr Remineralization units : mmol/m^3 cm/s vertical_grid : none frequency : medium operator : average DOCr_remin_zint_100m : + dependencies : + base_bio_on : .true. longname : Vertical Integral of DOCr Remineralization, 0-100m units : mmol/m^3 cm/s vertical_grid : none frequency : medium operator : average Jint_Ctot : + dependencies : + base_bio_on : .true. longname : Vertical Integral of Conservative Subterms of Source Sink Term for Ctot units : mmol/m^3 cm/s vertical_grid : none frequency : never operator : average Jint_Ntot : + dependencies : + base_bio_on : .true. longname : Vertical Integral of Conservative Subterms of Source Sink Term for Ntot units : mmol/m^3 cm/s vertical_grid : none frequency : never operator : average Jint_Ptot : + dependencies : + base_bio_on : .true. longname : Vertical Integral of Conservative Subterms of Source Sink Term for Ptot units : mmol/m^3 cm/s vertical_grid : none frequency : never operator : average Jint_Sitot : + dependencies : + base_bio_on : .true. longname : Vertical Integral of Conservative Subterms of Source Sink Term for Sitot units : mmol/m^3 cm/s vertical_grid : none frequency : never operator : average Jint_Fetot : + dependencies : + base_bio_on : .true. longname : Vertical Integral of Conservative Subterms of Source Sink Term for Fetot units : mmol/m^3 cm/s vertical_grid : none @@ -443,24 +657,32 @@ Jint_Fetot : # Particulate 2D diags calcToFloor : + dependencies : + base_bio_on : .true. longname : CaCO3 Flux Hitting Sea Floor units : nmol/cm^2/s vertical_grid : none frequency : never operator : average calcToSed : + dependencies : + base_bio_on : .true. longname : CaCO3 Flux to Sediments units : nmol/cm^2/s vertical_grid : none frequency : medium operator : average calcToSed_ALT_CO2 : + dependencies : + base_bio_on : .true. longname : CaCO3 Flux to Sediments, Alternative CO2 units : nmol/cm^2/s vertical_grid : none frequency : medium operator : average pocToFloor : + dependencies : + base_bio_on : .true. longname : POC Flux Hitting Sea Floor units : nmol/cm^2/s vertical_grid : none @@ -471,54 +693,72 @@ pocToFloor : - average - average pocToSed : + dependencies : + base_bio_on : .true. longname : POC Flux to Sediments units : nmol/cm^2/s vertical_grid : none frequency : medium operator : average ponToSed : + dependencies : + base_bio_on : .true. longname : nitrogen burial Flux to Sediments units : nmol/cm^2/s vertical_grid : none frequency : medium operator : average SedDenitrif : + dependencies : + base_bio_on : .true. longname : nitrogen loss in Sediments units : nmol/cm^2/s vertical_grid : none frequency : medium operator : average OtherRemin : + dependencies : + base_bio_on : .true. longname : non-oxic,non-dentr remin in Sediments units : nmol/cm^2/s vertical_grid : none frequency : never operator : average popToSed : + dependencies : + base_bio_on : .true. longname : phosphorus Flux to Sediments units : nmol/cm^2/s vertical_grid : none frequency : medium operator : average bsiToSed : + dependencies : + base_bio_on : .true. longname : biogenic Si Flux to Sediments units : nmol/cm^2/s vertical_grid : none frequency : medium operator : average dustToSed : + dependencies : + base_bio_on : .true. longname : dust Flux to Sediments units : g/cm^2/s vertical_grid : none frequency : medium operator : average pfeToSed : + dependencies : + base_bio_on : .true. longname : pFe Flux to Sediments units : nmol/cm^2/s vertical_grid : none frequency : medium operator : average CaCO3_form_zint : + dependencies : + base_bio_on : .true. longname : Total CaCO3 Formation Vertical Integral units : mmol/m^3 cm/s vertical_grid : none @@ -529,6 +769,8 @@ CaCO3_form_zint : - average - average CaCO3_form_zint_100m : + dependencies : + base_bio_on : .true. longname : Total CaCO3 Formation Vertical Integral, 0-100m units : mmol/m^3 cm/s vertical_grid : none @@ -537,84 +779,112 @@ CaCO3_form_zint_100m : # General 3D diags insitu_temp : + dependencies : + base_bio_on : .true. longname : in situ temperature units : degC vertical_grid : layer_avg frequency : medium operator : average CO3 : + dependencies : + base_bio_on : .true. longname : Carbonate Ion Concentration units : mmol/m^3 vertical_grid : layer_avg frequency : medium operator : average HCO3 : + dependencies : + base_bio_on : .true. longname : Bicarbonate Ion Concentration units : mmol/m^3 vertical_grid : layer_avg frequency : medium operator : average H2CO3 : + dependencies : + base_bio_on : .true. longname : Carbonic Acid Concentration units : mmol/m^3 vertical_grid : layer_avg frequency : medium operator : average pH_3D : + dependencies : + base_bio_on : .true. longname : pH units : 1 vertical_grid : layer_avg frequency : medium operator : average CO3_ALT_CO2 : + dependencies : + base_bio_on : .true. longname : Carbonate Ion Concentration, Alternative CO2 units : mmol/m^3 vertical_grid : layer_avg frequency : never operator : average HCO3_ALT_CO2 : + dependencies : + base_bio_on : .true. longname : Bicarbonate Ion Concentration, Alternative CO2 units : mmol/m^3 vertical_grid : layer_avg frequency : never operator : average H2CO3_ALT_CO2 : + dependencies : + base_bio_on : .true. longname : Carbonic Acid Concentration, Alternative CO2 units : mmol/m^3 vertical_grid : layer_avg frequency : never operator : average pH_3D_ALT_CO2 : + dependencies : + base_bio_on : .true. longname : pH, Alternative CO2 units : 1 vertical_grid : layer_avg frequency : never operator : average co3_sat_calc : + dependencies : + base_bio_on : .true. longname : CO3 concentration at calcite saturation units : mmol/m^3 vertical_grid : layer_avg frequency : medium operator : average co3_sat_arag : + dependencies : + base_bio_on : .true. longname : CO3 concentration at aragonite saturation units : mmol/m^3 vertical_grid : layer_avg frequency : medium operator : average NITRIF : + dependencies : + base_bio_on : .true. longname : Nitrification units : mmol/m^3/s vertical_grid : layer_avg frequency : medium operator : average DENITRIF : + dependencies : + base_bio_on : .true. longname : Denitrification units : mmol/m^3/s vertical_grid : layer_avg frequency : medium operator : average O2_PRODUCTION : + dependencies : + base_bio_on : .true. longname : O2 Production units : mmol/m^3/s vertical_grid : layer_avg @@ -622,6 +892,7 @@ O2_PRODUCTION : operator : average O2_CONSUMPTION_SCALEF : dependencies : + base_bio_on : .true. lo2_consumption_scalef : .true. longname : O2 Consumption Scale Factor units : 1 @@ -629,150 +900,200 @@ O2_CONSUMPTION_SCALEF : frequency : never operator : average O2_CONSUMPTION : + dependencies : + base_bio_on : .true. longname : O2 Consumption units : mmol/m^3/s vertical_grid : layer_avg frequency : medium operator : average AOU : + dependencies : + base_bio_on : .true. longname : Apparent O2 Utilization units : mmol/m^3 vertical_grid : layer_avg frequency : medium operator : average PAR_avg : + dependencies : + base_bio_on : .true. longname : PAR Average over Model Cell units : W/m^2 vertical_grid : layer_avg frequency : medium operator : average graze_auto_TOT : + dependencies : + base_bio_on : .true. longname : Total Autotroph Grazing units : mmol/m^3/s vertical_grid : layer_avg frequency : low operator : average photoC_TOT : + dependencies : + base_bio_on : .true. longname : Total C Fixation units : mmol/m^3/s vertical_grid : layer_avg frequency : medium operator : average photoC_NO3_TOT : + dependencies : + base_bio_on : .true. longname : Total C Fixation from NO3 units : mmol/m^3/s vertical_grid : layer_avg frequency : medium operator : average DOC_prod : + dependencies : + base_bio_on : .true. longname : DOC Production units : mmol/m^3/s vertical_grid : layer_avg frequency : medium operator : average DOC_remin : + dependencies : + base_bio_on : .true. longname : DOC Remineralization units : mmol/m^3/s vertical_grid : layer_avg frequency : low operator : average DOCr_remin : + dependencies : + base_bio_on : .true. longname : DOCr Remineralization units : mmol/m^3/s vertical_grid : layer_avg frequency : low operator : average DON_prod : + dependencies : + base_bio_on : .true. longname : DON Production units : mmol/m^3/s vertical_grid : layer_avg frequency : medium operator : average DON_remin : + dependencies : + base_bio_on : .true. longname : DON Remineralization units : mmol/m^3/s vertical_grid : layer_avg frequency : low operator : average DONr_remin : + dependencies : + base_bio_on : .true. longname : DONr Remineralization units : mmol/m^3/s vertical_grid : layer_avg frequency : low operator : average DOP_prod : + dependencies : + base_bio_on : .true. longname : DOP Production units : mmol/m^3/s vertical_grid : layer_avg frequency : medium operator : average DOP_remin : + dependencies : + base_bio_on : .true. longname : DOP Remineralization units : mmol/m^3/s vertical_grid : layer_avg frequency : low operator : average DOPr_remin : + dependencies : + base_bio_on : .true. longname : DOPr Remineralization units : mmol/m^3/s vertical_grid : layer_avg frequency : low operator : average DOP_loss_P_bal : + dependencies : + base_bio_on : .true. longname : DOP loss, due to P budget balancing units : mmol/m^3/s vertical_grid : layer_avg frequency : never operator : average Fe_scavenge : + dependencies : + base_bio_on : .true. longname : Iron Scavenging units : mmol/m^3/s vertical_grid : layer_avg frequency : medium operator : average Fe_scavenge_rate : + dependencies : + base_bio_on : .true. longname : Iron Scavenging Rate units : 1/y vertical_grid : layer_avg frequency : medium operator : average Lig_prod : + dependencies : + base_bio_on : .true. longname : Production of Fe-binding Ligand units : mmol/m^3/s vertical_grid : layer_avg frequency : medium operator : average Lig_loss : + dependencies : + base_bio_on : .true. longname : Loss of Fe-binding Ligand units : mmol/m^3/s vertical_grid : layer_avg frequency : medium operator : average Lig_scavenge : - longname : Fe not bound to Ligand - units : mmol/m^3 + dependencies : + base_bio_on : .true. + longname : Loss of Fe-binding Ligand from Scavenging + units : mmol/m^3/s vertical_grid : layer_avg frequency : medium operator : average Fefree : + dependencies : + base_bio_on : .true. longname : Fe not bound to Ligand units : mmol/m^3 vertical_grid : layer_avg frequency : medium operator : average Lig_photochem : + dependencies : + base_bio_on : .true. longname : Loss of Fe-binding Ligand from UV radiation units : mmol/m^3/s vertical_grid : layer_avg frequency : medium operator : average Lig_deg : + dependencies : + base_bio_on : .true. longname : Loss of Fe-binding Ligand from Bacterial Degradation units : mmol/m^3/s vertical_grid : layer_avg frequency : medium operator : average FESEDFLUX : + dependencies : + base_bio_on : .true. longname : Iron Sediment Flux units : nmol/cm^2/s vertical_grid : layer_avg @@ -781,90 +1102,120 @@ FESEDFLUX : # Particulate 2D diags POC_FLUX_((particulate_flux_ref_depth_str)) : + dependencies : + base_bio_on : .true. longname : POC Flux at ((particulate_flux_ref_depth_str)) units : mmol/m^3 cm/s vertical_grid : none frequency : medium operator : average POP_FLUX_((particulate_flux_ref_depth_str)) : + dependencies : + base_bio_on : .true. longname : POP Flux at ((particulate_flux_ref_depth_str)) units : mmol/m^3 cm/s vertical_grid : none frequency : medium operator : average CaCO3_FLUX_((particulate_flux_ref_depth_str)) : + dependencies : + base_bio_on : .true. longname : CaCO3 Flux at ((particulate_flux_ref_depth_str)) units : mmol/m^3 cm/s vertical_grid : none frequency : medium operator : average SiO2_FLUX_((particulate_flux_ref_depth_str)) : + dependencies : + base_bio_on : .true. longname : SiO2 Flux at ((particulate_flux_ref_depth_str)) units : mmol/m^3 cm/s vertical_grid : none frequency : medium operator : average P_iron_FLUX_((particulate_flux_ref_depth_str)) : + dependencies : + base_bio_on : .true. longname : P_iron Flux at ((particulate_flux_ref_depth_str)) units : mmol/m^3 cm/s vertical_grid : none frequency : medium operator : average POC_PROD_zint : + dependencies : + base_bio_on : .true. longname : Vertical Integral of POC Production units : mmol/m^3 cm/s vertical_grid : none frequency : medium operator : average POC_PROD_zint_100m : + dependencies : + base_bio_on : .true. longname : Vertical Integral of POC Production, 0-100m units : mmol/m^3 cm/s vertical_grid : none frequency : medium operator : average POC_REMIN_DOCr_zint : + dependencies : + base_bio_on : .true. longname : Vertical Integral of POC Remineralization routed to DOCr units : mmol/m^3 cm/s vertical_grid : none frequency : medium operator : average POC_REMIN_DOCr_zint_100m : + dependencies : + base_bio_on : .true. longname : Vertical Integral of POC Remineralization routed to DOCr, 0-100m units : mmol/m^3 cm/s vertical_grid : none frequency : medium operator : average POC_REMIN_DIC_zint : + dependencies : + base_bio_on : .true. longname : Vertical Integral of POC Remineralization routed to DIC units : mmol/m^3 cm/s vertical_grid : none frequency : medium operator : average POC_REMIN_DIC_zint_100m : + dependencies : + base_bio_on : .true. longname : Vertical Integral of POC Remineralization routed to DIC, 0-100m units : mmol/m^3 cm/s vertical_grid : none frequency : medium operator : average CaCO3_PROD_zint : + dependencies : + base_bio_on : .true. longname : Vertical Integral of CaCO3 Production units : mmol/m^3 cm/s vertical_grid : none frequency : medium operator : average CaCO3_PROD_zint_100m : + dependencies : + base_bio_on : .true. longname : Vertical Integral of CaCO3 Production, 0-100m units : mmol/m^3 cm/s vertical_grid : none frequency : medium operator : average CaCO3_REMIN_zint : + dependencies : + base_bio_on : .true. longname : Vertical Integral of CaCO3 Remineralization units : mmol/m^3 cm/s vertical_grid : none frequency : medium operator : average CaCO3_REMIN_zint_100m : + dependencies : + base_bio_on : .true. longname : Vertical Integral of CaCO3 Remineralization, 0-100m units : mmol/m^3 cm/s vertical_grid : none @@ -874,6 +1225,7 @@ CaCO3_REMIN_zint_100m : # Particulate 3D diags P_REMIN_SCALEF : dependencies : + base_bio_on : .true. lp_remin_scalef : .true. longname : Particulate Remin Scale Factor units : 1 @@ -881,180 +1233,251 @@ P_REMIN_SCALEF : frequency : never operator : average POC_FLUX_IN : + dependencies : + base_bio_on : .true. longname : POC Flux into Cell units : mmol/m^3 cm/s vertical_grid : layer_avg frequency : medium operator : average POC_sFLUX_IN : + dependencies : + base_bio_on : .true. longname : POC sFlux into Cell units : mmol/m^3 cm/s vertical_grid : layer_avg frequency : never operator : average POC_hFLUX_IN : + dependencies : + base_bio_on : .true. longname : POC hFlux into Cell units : mmol/m^3 cm/s vertical_grid : layer_avg frequency : never operator : average POC_PROD : + dependencies : + base_bio_on : .true. longname : POC Production units : mmol/m^3/s vertical_grid : layer_avg frequency : medium operator : average POC_REMIN_DOCr : + dependencies : + base_bio_on : .true. longname : POC Remineralization routed to DOCr units : mmol/m^3/s vertical_grid : layer_avg frequency : low operator : average POC_REMIN_DIC : + dependencies : + base_bio_on : .true. longname : POC Remineralization routed to DIC units : mmol/m^3/s vertical_grid : layer_avg frequency : low operator : average POP_FLUX_IN : + dependencies : + base_bio_on : .true. longname : POP Flux into Cell units : mmol/m^3 cm/s vertical_grid : layer_avg frequency : medium operator : average POP_PROD : + dependencies : + base_bio_on : .true. longname : POP Production units : mmol/m^3/s vertical_grid : layer_avg frequency : medium operator : average POP_REMIN_DOPr : + dependencies : + base_bio_on : .true. longname : POP Remineralization routed to DOPr units : mmol/m^3/s vertical_grid : layer_avg frequency : low operator : average POP_REMIN_PO4 : + dependencies : + base_bio_on : .true. longname : POP Remineralization routed to PO4 units : mmol/m^3/s vertical_grid : layer_avg frequency : low operator : average PON_REMIN_DONr : + dependencies : + base_bio_on : .true. longname : PON Remineralization routed to DONr units : mmol/m^3/s vertical_grid : layer_avg frequency : low operator : average PON_REMIN_NH4 : + dependencies : + base_bio_on : .true. longname : PON Remineralization routed to NH4 units : mmol/m^3/s vertical_grid : layer_avg frequency : low operator : average CaCO3_FLUX_IN : + dependencies : + base_bio_on : .true. longname : CaCO3 Flux into Cell units : mmol/m^3 cm/s vertical_grid : layer_avg frequency : low operator : average CaCO3_PROD : + dependencies : + base_bio_on : .true. longname : CaCO3 Production units : mmol/m^3/s vertical_grid : layer_avg frequency : low operator : average CaCO3_REMIN : + dependencies : + base_bio_on : .true. longname : CaCO3 Remineralization units : mmol/m^3/s vertical_grid : layer_avg frequency : low operator : average CaCO3_ALT_CO2_FLUX_IN : + dependencies : + base_bio_on : .true. longname : CaCO3 Flux into Cell, Alternative CO2 units : mmol/m^3 cm/s vertical_grid : layer_avg frequency : low operator : average CaCO3_ALT_CO2_PROD : + dependencies : + base_bio_on : .true. longname : CaCO3 Production, Alternative CO2 units : mmol/m^3/s vertical_grid : layer_avg frequency : never operator : average CaCO3_ALT_CO2_REMIN : + dependencies : + base_bio_on : .true. longname : CaCO3 Remineralization, Alternative CO2 units : mmol/m^3/s vertical_grid : layer_avg frequency : low operator : average SiO2_FLUX_IN : + dependencies : + base_bio_on : .true. longname : SiO2 Flux into Cell units : mmol/m^3 cm/s vertical_grid : layer_avg frequency : medium operator : average SiO2_PROD : + dependencies : + base_bio_on : .true. longname : SiO2 Production units : mmol/m^3/s vertical_grid : layer_avg frequency : medium operator : average SiO2_REMIN : + dependencies : + base_bio_on : .true. longname : SiO2 Remineralization units : mmol/m^3/s vertical_grid : layer_avg frequency : never operator : average dust_FLUX_IN : + dependencies : + base_bio_on : .true. longname : Dust Flux into Cell units : g/cm^2/s vertical_grid : layer_avg frequency : medium operator : average dust_REMIN : + dependencies : + base_bio_on : .true. longname : Dust Remineralization units : g/cm^3/s vertical_grid : layer_avg frequency : medium operator : average P_iron_FLUX_IN : + dependencies : + base_bio_on : .true. longname : P_iron Flux into Cell units : mmol/m^3 cm/s vertical_grid : layer_avg frequency : medium operator : average P_iron_PROD : + dependencies : + base_bio_on : .true. longname : P_iron Production units : mmol/m^3/s vertical_grid : layer_avg frequency : medium operator : average P_iron_REMIN : + dependencies : + base_bio_on : .true. longname : P_iron Remineralization units : mmol/m^3/s vertical_grid : layer_avg frequency : medium operator : average bSi_form : + dependencies : + base_bio_on : .true. longname : Total Si Uptake units : mmol/m^3/s vertical_grid : layer_avg frequency : medium operator : average CaCO3_form : + dependencies : + base_bio_on : .true. longname : Total CaCO3 Formation units : mmol/m^3/s vertical_grid : layer_avg frequency : low operator : average Nfix : + dependencies : + base_bio_on : .true. longname : Total N Fixation units : mmol/m^3/s vertical_grid : layer_avg frequency : never operator : average +############### +# abio module # +############### + +ABIO_D14C_ocn : + dependencies : + abio_dic_on : .true. + longname : Oceanic Delta 14C for Abiotic DIC Tracer Fluxes + units : permil + vertical_grid : layer_avg + frequency : medium + operator : average + ############### # ciso module # ############### @@ -1576,7 +1999,7 @@ graze_((autotroph_sname))_((zooplankton_sname))_zint_100m : # thought is that we don't need these diagnostics with # fixed P:C so I'd like to update the fortran as well lvariable_PtoC : .true. - longname : ((autotroph_lname)) + longname : ((autotroph_lname)) P:C ratio units : 1 vertical_grid : layer_avg truncate : true @@ -1688,7 +2111,7 @@ graze_((autotroph_sname))_((zooplankton_sname)) : frequency : never operator : average ((autotroph_sname))_agg : - longname : ((autotroph_lname)) Aggregate + longname : ((autotroph_lname)) Aggregation units : mmol/m^3/s vertical_grid : layer_avg truncate : true @@ -1841,7 +2264,7 @@ CISO_mui_to_co2star_((autotroph_sname)) : dependencies : ciso_on : .true. longname : ((autotroph_lname)) instanteous growth rate over [CO2*] - units : m^3/mmol/s + units : (mmol/m^3)^-1 s^-1 vertical_grid : layer_avg frequency : medium operator : average @@ -1942,13 +2365,13 @@ graze_((zooplankton_sname))_doc_zint_100m : frequency : never operator : average graze_((zooplankton_sname))_((zooplankton_sname))_zint : - longname : ((zooplankton_lname)) Grazing to ((zooplankton_lname)) Vertical Integral + longname : ((zooplankton_lname1)) Grazing to ((zooplankton_lname2)) Vertical Integral units : mmol/m^3 cm/s vertical_grid : none frequency : never operator : average graze_((zooplankton_sname))_((zooplankton_sname))_zint_100m : - longname : ((zooplankton_lname)) Grazing to ((zooplankton_lname)) Vertical Integral, 0-100m + longname : ((zooplankton_lname1)) Grazing to ((zooplankton_lname2)) Vertical Integral, 0-100m units : mmol/m^3 cm/s vertical_grid : none frequency : never @@ -2022,7 +2445,7 @@ graze_((zooplankton_sname))_zootot : frequency : never operator : average graze_((zooplankton_sname))_((zooplankton_sname)) : - longname : ((zooplankton_lname)) grazing loss to ((zooplankton_lname)) + longname : ((zooplankton_lname1)) grazing loss to ((zooplankton_lname2)) units : mmol/m^3/s vertical_grid : layer_avg truncate : true diff --git a/defaults/json/diagnostics_latest.json b/defaults/json/diagnostics_latest.json index 33cac2cf..42242873 100644 --- a/defaults/json/diagnostics_latest.json +++ b/defaults/json/diagnostics_latest.json @@ -114,7 +114,7 @@ "lvariable_PtoC": ".true." }, "frequency": "medium", - "longname": "((autotroph_lname))", + "longname": "((autotroph_lname)) P:C ratio", "operator": "average", "truncate": true, "units": 1, @@ -142,7 +142,7 @@ }, "((autotroph_sname))_agg": { "frequency": "medium", - "longname": "((autotroph_lname)) Aggregate", + "longname": "((autotroph_lname)) Aggregation", "operator": "average", "truncate": true, "units": "mmol/m^3/s", @@ -358,7 +358,130 @@ "units": "mmol/m^3 cm/s", "vertical_grid": "none" }, + "ABIO_ALK_SURF": { + "dependencies": { + "abio_dic_on": ".true.", + "lflux_gas_co2": ".true." + }, + "frequency": "medium", + "longname": "Surface Alkalinity for Abiotic DIC Tracer Fluxes", + "operator": "average", + "units": "meq/m^3", + "vertical_grid": "none" + }, + "ABIO_CO2STAR": { + "dependencies": { + "abio_dic_on": ".true.", + "lflux_gas_co2": ".true." + }, + "frequency": "medium", + "longname": "CO2 Star for Abiotic DIC Tracer Fluxes", + "operator": "average", + "units": "mmol/m^3", + "vertical_grid": "none" + }, + "ABIO_D14C_atm": { + "dependencies": { + "abio_dic_on": ".true.", + "lflux_gas_co2": ".true." + }, + "frequency": "medium", + "longname": "Atmospheric Delta 14C for Abiotic DIC Tracer Fluxes", + "operator": "average", + "units": "permil", + "vertical_grid": "none" + }, + "ABIO_D14C_ocn": { + "dependencies": { + "abio_dic_on": ".true." + }, + "frequency": "medium", + "longname": "Oceanic Delta 14C for Abiotic DIC Tracer Fluxes", + "operator": "average", + "units": "permil", + "vertical_grid": "layer_avg" + }, + "ABIO_DCO2STAR": { + "dependencies": { + "abio_dic_on": ".true.", + "lflux_gas_co2": ".true." + }, + "frequency": "medium", + "longname": "D CO2 Star for Abiotic DIC Tracer Fluxes", + "operator": "average", + "units": "mmol/m^3", + "vertical_grid": "none" + }, + "ABIO_DpCO2": { + "dependencies": { + "abio_dic_on": ".true.", + "lflux_gas_co2": ".true." + }, + "frequency": "medium", + "longname": "D pCO2 for Abiotic DIC Tracer Fluxes", + "operator": "average", + "units": "ppmv", + "vertical_grid": "none" + }, + "ABIO_FG_DI14C": { + "dependencies": { + "abio_dic_on": ".true.", + "lflux_gas_co2": ".true." + }, + "frequency": "medium", + "longname": "Surface Gas Flux of Abiotic DI14C", + "operator": "average", + "units": "mmol/m^3 cm/s", + "vertical_grid": "none" + }, + "ABIO_FG_DIC": { + "dependencies": { + "abio_dic_on": ".true.", + "lflux_gas_co2": ".true." + }, + "frequency": "medium", + "longname": "Surface Gas Flux of Abiotic DIC", + "operator": "average", + "units": "mmol/m^3 cm/s", + "vertical_grid": "none" + }, + "ABIO_PH": { + "dependencies": { + "abio_dic_on": ".true.", + "lflux_gas_co2": ".true." + }, + "frequency": "medium", + "longname": "Surface pH for Abiotic DIC Tracer Fluxes", + "operator": "average", + "units": 1, + "vertical_grid": "none" + }, + "ABIO_pCO2": { + "dependencies": { + "abio_dic_on": ".true.", + "lflux_gas_co2": ".true." + }, + "frequency": "medium", + "longname": "CO2 Atmospheric Partial Pressure for Abiotic DIC Tracer Fluxes", + "operator": "average", + "units": "ppm", + "vertical_grid": "none" + }, + "ABIO_pCO2SURF": { + "dependencies": { + "abio_dic_on": ".true.", + "lflux_gas_co2": ".true." + }, + "frequency": "medium", + "longname": "Surface pCO2 for Abiotic DIC Tracer Fluxes", + "operator": "average", + "units": "ppmv", + "vertical_grid": "none" + }, "AOU": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Apparent O2 Utilization", "operator": "average", @@ -366,15 +489,21 @@ "vertical_grid": "layer_avg" }, "ATM_ALT_CO2": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", - "longname": "Atomspheric CO2", + "longname": "Atmospheric Alternative CO2", "operator": "average", "units": "ppmv", "vertical_grid": "none" }, "ATM_CO2": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", - "longname": "Atomspheric CO2", + "longname": "Atmospheric CO2", "operator": "average", "units": "ppmv", "vertical_grid": "none" @@ -490,7 +619,7 @@ "ciso_on": ".true." }, "frequency": "medium", - "longname": "Atmospheric Delta 13C in permil", + "longname": "Atmospheric Delta 13C", "operator": "average", "units": "permil", "vertical_grid": "none" @@ -500,7 +629,7 @@ "ciso_on": ".true." }, "frequency": "medium", - "longname": "Atmospheric Delta 14C in permil", + "longname": "Atmospheric Delta 14C", "operator": "average", "units": "permil", "vertical_grid": "none" @@ -884,7 +1013,7 @@ "frequency": "medium", "longname": "((autotroph_lname)) instanteous growth rate over [CO2*]", "operator": "average", - "units": "m^3/mmol/s", + "units": "(mmol/m^3)^-1 s^-1", "vertical_grid": "layer_avg" }, "CISO_photo13C_((autotroph_sname))": { @@ -990,6 +1119,9 @@ "vertical_grid": "layer_avg" }, "CO2STAR": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "CO2 Star", "operator": "average", @@ -997,13 +1129,19 @@ "vertical_grid": "none" }, "CO2STAR_ALT_CO2": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", - "longname": "CO2 Star, Alternate CO2", + "longname": "CO2 Star, Alternative CO2", "operator": "average", "units": "mmol/m^3", "vertical_grid": "none" }, "CO3": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Carbonate Ion Concentration", "operator": "average", @@ -1011,6 +1149,9 @@ "vertical_grid": "layer_avg" }, "CO3_ALT_CO2": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "never", "longname": "Carbonate Ion Concentration, Alternative CO2", "operator": "average", @@ -1018,6 +1159,9 @@ "vertical_grid": "layer_avg" }, "CaCO3_ALT_CO2_FLUX_IN": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "low", "longname": "CaCO3 Flux into Cell, Alternative CO2", "operator": "average", @@ -1025,6 +1169,9 @@ "vertical_grid": "layer_avg" }, "CaCO3_ALT_CO2_PROD": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "never", "longname": "CaCO3 Production, Alternative CO2", "operator": "average", @@ -1032,6 +1179,9 @@ "vertical_grid": "layer_avg" }, "CaCO3_ALT_CO2_REMIN": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "low", "longname": "CaCO3 Remineralization, Alternative CO2", "operator": "average", @@ -1039,6 +1189,9 @@ "vertical_grid": "layer_avg" }, "CaCO3_FLUX_((particulate_flux_ref_depth_str))": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "CaCO3 Flux at ((particulate_flux_ref_depth_str))", "operator": "average", @@ -1046,6 +1199,9 @@ "vertical_grid": "none" }, "CaCO3_FLUX_IN": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "low", "longname": "CaCO3 Flux into Cell", "operator": "average", @@ -1053,6 +1209,9 @@ "vertical_grid": "layer_avg" }, "CaCO3_PROD": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "low", "longname": "CaCO3 Production", "operator": "average", @@ -1060,6 +1219,9 @@ "vertical_grid": "layer_avg" }, "CaCO3_PROD_zint": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Vertical Integral of CaCO3 Production", "operator": "average", @@ -1067,6 +1229,9 @@ "vertical_grid": "none" }, "CaCO3_PROD_zint_100m": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Vertical Integral of CaCO3 Production, 0-100m", "operator": "average", @@ -1074,6 +1239,9 @@ "vertical_grid": "none" }, "CaCO3_REMIN": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "low", "longname": "CaCO3 Remineralization", "operator": "average", @@ -1081,6 +1249,9 @@ "vertical_grid": "layer_avg" }, "CaCO3_REMIN_zint": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Vertical Integral of CaCO3 Remineralization", "operator": "average", @@ -1088,6 +1259,9 @@ "vertical_grid": "none" }, "CaCO3_REMIN_zint_100m": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Vertical Integral of CaCO3 Remineralization, 0-100m", "operator": "average", @@ -1095,6 +1269,9 @@ "vertical_grid": "none" }, "CaCO3_form": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "low", "longname": "Total CaCO3 Formation", "operator": "average", @@ -1102,6 +1279,9 @@ "vertical_grid": "layer_avg" }, "CaCO3_form_zint": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": [ "medium", "high" @@ -1115,6 +1295,9 @@ "vertical_grid": "none" }, "CaCO3_form_zint_100m": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Total CaCO3 Formation Vertical Integral, 0-100m", "operator": "average", @@ -1122,6 +1305,9 @@ "vertical_grid": "none" }, "DCO2STAR": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "D CO2 Star", "operator": "average", @@ -1129,6 +1315,9 @@ "vertical_grid": "none" }, "DCO2STAR_ALT_CO2": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "D CO2 Star, Alternative CO2", "operator": "average", @@ -1136,6 +1325,9 @@ "vertical_grid": "none" }, "DENITRIF": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Denitrification", "operator": "average", @@ -1143,6 +1335,9 @@ "vertical_grid": "layer_avg" }, "DOC_prod": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "DOC Production", "operator": "average", @@ -1150,6 +1345,9 @@ "vertical_grid": "layer_avg" }, "DOC_prod_zint": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Vertical Integral of DOC Production", "operator": "average", @@ -1157,6 +1355,9 @@ "vertical_grid": "none" }, "DOC_prod_zint_100m": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Vertical Integral of DOC Production, 0-100m", "operator": "average", @@ -1164,6 +1365,9 @@ "vertical_grid": "none" }, "DOC_remin": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "low", "longname": "DOC Remineralization", "operator": "average", @@ -1171,6 +1375,9 @@ "vertical_grid": "layer_avg" }, "DOC_remin_zint": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Vertical Integral of DOC Remineralization", "operator": "average", @@ -1178,6 +1385,9 @@ "vertical_grid": "none" }, "DOC_remin_zint_100m": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Vertical Integral of DOC Remineralization, 0-100m", "operator": "average", @@ -1185,6 +1395,9 @@ "vertical_grid": "none" }, "DOCr_remin": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "low", "longname": "DOCr Remineralization", "operator": "average", @@ -1192,6 +1405,9 @@ "vertical_grid": "layer_avg" }, "DOCr_remin_zint": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Vertical Integral of DOCr Remineralization", "operator": "average", @@ -1199,6 +1415,9 @@ "vertical_grid": "none" }, "DOCr_remin_zint_100m": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Vertical Integral of DOCr Remineralization, 0-100m", "operator": "average", @@ -1206,6 +1425,9 @@ "vertical_grid": "none" }, "DON_prod": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "DON Production", "operator": "average", @@ -1213,6 +1435,9 @@ "vertical_grid": "layer_avg" }, "DON_remin": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "low", "longname": "DON Remineralization", "operator": "average", @@ -1220,6 +1445,9 @@ "vertical_grid": "layer_avg" }, "DONr_remin": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "low", "longname": "DONr Remineralization", "operator": "average", @@ -1235,6 +1463,9 @@ "vertical_grid": "layer_avg" }, "DOP_loss_P_bal": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "never", "longname": "DOP loss, due to P budget balancing", "operator": "average", @@ -1242,6 +1473,9 @@ "vertical_grid": "layer_avg" }, "DOP_prod": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "DOP Production", "operator": "average", @@ -1249,6 +1483,9 @@ "vertical_grid": "layer_avg" }, "DOP_remin": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "low", "longname": "DOP Remineralization", "operator": "average", @@ -1256,6 +1493,9 @@ "vertical_grid": "layer_avg" }, "DOPr_remin": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "low", "longname": "DOPr Remineralization", "operator": "average", @@ -1263,13 +1503,19 @@ "vertical_grid": "layer_avg" }, "DUST_FLUX": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "never", - "longname": "Dust Flux", + "longname": "Atmospheric Dust Flux", "operator": "average", "units": "g/cm^2/s", "vertical_grid": "none" }, "DpCO2": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": [ "medium", "high" @@ -1283,6 +1529,9 @@ "vertical_grid": "none" }, "DpCO2_ALT_CO2": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "D pCO2, Alternative CO2", "operator": "average", @@ -1290,18 +1539,28 @@ "vertical_grid": "none" }, "ECOSYS_ATM_PRESS": { + "dependencies": { + "lflux_gas_co2": ".true.", + "lflux_gas_o2": ".true." + }, + "dependencies_or": true, "frequency": "medium", - "longname": "Atmospheric Pressure for ecosys fluxes", + "longname": "Atmospheric Pressure", "operator": "average", "units": "atmospheres", "vertical_grid": "none" }, "ECOSYS_IFRAC": { + "dependencies": { + "lflux_gas_co2": ".true.", + "lflux_gas_o2": ".true." + }, + "dependencies_or": true, "frequency": [ "medium", "high" ], - "longname": "Ice Fraction for ecosys fluxes", + "longname": "Ice Fraction", "operator": [ "average", "average" @@ -1310,11 +1569,16 @@ "vertical_grid": "none" }, "ECOSYS_XKW": { + "dependencies": { + "lflux_gas_co2": ".true.", + "lflux_gas_o2": ".true." + }, + "dependencies_or": true, "frequency": [ "medium", "high" ], - "longname": "XKW for ecosys fluxes", + "longname": "XKW", "operator": [ "average", "average" @@ -1323,6 +1587,9 @@ "vertical_grid": "none" }, "FESEDFLUX": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "never", "longname": "Iron Sediment Flux", "operator": "average", @@ -1330,6 +1597,9 @@ "vertical_grid": "layer_avg" }, "FG_ALT_CO2": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "DIC Surface Gas Flux, Alternative CO2", "operator": "average", @@ -1337,6 +1607,9 @@ "vertical_grid": "none" }, "FG_CO2": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": [ "medium", "high" @@ -1350,6 +1623,9 @@ "vertical_grid": "none" }, "Fe_scavenge": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Iron Scavenging", "operator": "average", @@ -1357,6 +1633,9 @@ "vertical_grid": "layer_avg" }, "Fe_scavenge_rate": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Iron Scavenging Rate", "operator": "average", @@ -1364,6 +1643,9 @@ "vertical_grid": "layer_avg" }, "Fefree": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Fe not bound to Ligand", "operator": "average", @@ -1371,6 +1653,9 @@ "vertical_grid": "layer_avg" }, "H2CO3": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Carbonic Acid Concentration", "operator": "average", @@ -1378,6 +1663,9 @@ "vertical_grid": "layer_avg" }, "H2CO3_ALT_CO2": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "never", "longname": "Carbonic Acid Concentration, Alternative CO2", "operator": "average", @@ -1385,6 +1673,9 @@ "vertical_grid": "layer_avg" }, "HCO3": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Bicarbonate Ion Concentration", "operator": "average", @@ -1392,6 +1683,9 @@ "vertical_grid": "layer_avg" }, "HCO3_ALT_CO2": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "never", "longname": "Bicarbonate Ion Concentration, Alternative CO2", "operator": "average", @@ -1399,6 +1693,9 @@ "vertical_grid": "layer_avg" }, "IRON_FLUX": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Atmospheric Iron Flux", "operator": "average", @@ -1406,6 +1703,9 @@ "vertical_grid": "none" }, "Jint_Ctot": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "never", "longname": "Vertical Integral of Conservative Subterms of Source Sink Term for Ctot", "operator": "average", @@ -1413,6 +1713,9 @@ "vertical_grid": "none" }, "Jint_Fetot": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "never", "longname": "Vertical Integral of Conservative Subterms of Source Sink Term for Fetot", "operator": "average", @@ -1420,6 +1723,9 @@ "vertical_grid": "none" }, "Jint_Ntot": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "never", "longname": "Vertical Integral of Conservative Subterms of Source Sink Term for Ntot", "operator": "average", @@ -1427,6 +1733,9 @@ "vertical_grid": "none" }, "Jint_Ptot": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "never", "longname": "Vertical Integral of Conservative Subterms of Source Sink Term for Ptot", "operator": "average", @@ -1434,6 +1743,9 @@ "vertical_grid": "none" }, "Jint_Sitot": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "never", "longname": "Vertical Integral of Conservative Subterms of Source Sink Term for Sitot", "operator": "average", @@ -1441,6 +1753,9 @@ "vertical_grid": "none" }, "Lig_deg": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Loss of Fe-binding Ligand from Bacterial Degradation", "operator": "average", @@ -1448,6 +1763,9 @@ "vertical_grid": "layer_avg" }, "Lig_loss": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Loss of Fe-binding Ligand", "operator": "average", @@ -1455,6 +1773,9 @@ "vertical_grid": "layer_avg" }, "Lig_photochem": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Loss of Fe-binding Ligand from UV radiation", "operator": "average", @@ -1462,6 +1783,9 @@ "vertical_grid": "layer_avg" }, "Lig_prod": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Production of Fe-binding Ligand", "operator": "average", @@ -1469,13 +1793,19 @@ "vertical_grid": "layer_avg" }, "Lig_scavenge": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", - "longname": "Fe not bound to Ligand", + "longname": "Loss of Fe-binding Ligand from Scavenging", "operator": "average", - "units": "mmol/m^3", + "units": "mmol/m^3/s", "vertical_grid": "layer_avg" }, "NHx_SURFACE_EMIS": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Emission of NHx to Atmosphere", "operator": "average", @@ -1483,6 +1813,9 @@ "vertical_grid": "none" }, "NHy_FLUX": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Flux of NHy from Atmosphere", "operator": "average", @@ -1490,6 +1823,9 @@ "vertical_grid": "none" }, "NITRIF": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Nitrification", "operator": "average", @@ -1497,6 +1833,9 @@ "vertical_grid": "layer_avg" }, "NOx_FLUX": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Flux of NOx from Atmosphere", "operator": "average", @@ -1504,6 +1843,9 @@ "vertical_grid": "none" }, "Nfix": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "never", "longname": "Total N Fixation", "operator": "average", @@ -1511,6 +1853,9 @@ "vertical_grid": "layer_avg" }, "O2SAT": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "O2 Saturation", "operator": "average", @@ -1518,6 +1863,9 @@ "vertical_grid": "none" }, "O2_CONSUMPTION": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "O2 Consumption", "operator": "average", @@ -1526,6 +1874,7 @@ }, "O2_CONSUMPTION_SCALEF": { "dependencies": { + "base_bio_on": ".true.", "lo2_consumption_scalef": ".true." }, "frequency": "never", @@ -1535,6 +1884,9 @@ "vertical_grid": "layer_avg" }, "O2_PRODUCTION": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "O2 Production", "operator": "average", @@ -1542,6 +1894,9 @@ "vertical_grid": "layer_avg" }, "O2_ZMIN": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Vertical Minimum of O2", "operator": "average", @@ -1549,13 +1904,19 @@ "vertical_grid": "none" }, "O2_ZMIN_DEPTH": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", - "longname": "Vertical Minimum of O2", + "longname": "Depth of Vertical Minimum of O2", "operator": "average", "units": "cm", "vertical_grid": "none" }, "OtherRemin": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "never", "longname": "non-oxic,non-dentr remin in Sediments", "operator": "average", @@ -1563,6 +1924,9 @@ "vertical_grid": "none" }, "PAR_avg": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "PAR Average over Model Cell", "operator": "average", @@ -1570,6 +1934,9 @@ "vertical_grid": "layer_avg" }, "PH": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Surface pH", "operator": "average", @@ -1577,6 +1944,9 @@ "vertical_grid": "none" }, "PH_ALT_CO2": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Surface pH, Alternative CO2", "operator": "average", @@ -1592,6 +1962,9 @@ "vertical_grid": "layer_avg" }, "POC_FLUX_((particulate_flux_ref_depth_str))": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "POC Flux at ((particulate_flux_ref_depth_str))", "operator": "average", @@ -1599,6 +1972,9 @@ "vertical_grid": "none" }, "POC_FLUX_IN": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "POC Flux into Cell", "operator": "average", @@ -1606,6 +1982,9 @@ "vertical_grid": "layer_avg" }, "POC_PROD": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "POC Production", "operator": "average", @@ -1613,6 +1992,9 @@ "vertical_grid": "layer_avg" }, "POC_PROD_zint": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Vertical Integral of POC Production", "operator": "average", @@ -1620,6 +2002,9 @@ "vertical_grid": "none" }, "POC_PROD_zint_100m": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Vertical Integral of POC Production, 0-100m", "operator": "average", @@ -1627,6 +2012,9 @@ "vertical_grid": "none" }, "POC_REMIN_DIC": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "low", "longname": "POC Remineralization routed to DIC", "operator": "average", @@ -1634,6 +2022,9 @@ "vertical_grid": "layer_avg" }, "POC_REMIN_DIC_zint": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Vertical Integral of POC Remineralization routed to DIC", "operator": "average", @@ -1641,6 +2032,9 @@ "vertical_grid": "none" }, "POC_REMIN_DIC_zint_100m": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Vertical Integral of POC Remineralization routed to DIC, 0-100m", "operator": "average", @@ -1648,6 +2042,9 @@ "vertical_grid": "none" }, "POC_REMIN_DOCr": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "low", "longname": "POC Remineralization routed to DOCr", "operator": "average", @@ -1655,6 +2052,9 @@ "vertical_grid": "layer_avg" }, "POC_REMIN_DOCr_zint": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Vertical Integral of POC Remineralization routed to DOCr", "operator": "average", @@ -1662,6 +2062,9 @@ "vertical_grid": "none" }, "POC_REMIN_DOCr_zint_100m": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Vertical Integral of POC Remineralization routed to DOCr, 0-100m", "operator": "average", @@ -1669,6 +2072,9 @@ "vertical_grid": "none" }, "POC_hFLUX_IN": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "never", "longname": "POC hFlux into Cell", "operator": "average", @@ -1676,6 +2082,9 @@ "vertical_grid": "layer_avg" }, "POC_sFLUX_IN": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "never", "longname": "POC sFlux into Cell", "operator": "average", @@ -1683,6 +2092,9 @@ "vertical_grid": "layer_avg" }, "PON_REMIN_DONr": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "low", "longname": "PON Remineralization routed to DONr", "operator": "average", @@ -1690,6 +2102,9 @@ "vertical_grid": "layer_avg" }, "PON_REMIN_NH4": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "low", "longname": "PON Remineralization routed to NH4", "operator": "average", @@ -1697,6 +2112,9 @@ "vertical_grid": "layer_avg" }, "POP_FLUX_((particulate_flux_ref_depth_str))": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "POP Flux at ((particulate_flux_ref_depth_str))", "operator": "average", @@ -1704,6 +2122,9 @@ "vertical_grid": "none" }, "POP_FLUX_IN": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "POP Flux into Cell", "operator": "average", @@ -1711,6 +2132,9 @@ "vertical_grid": "layer_avg" }, "POP_PROD": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "POP Production", "operator": "average", @@ -1718,6 +2142,9 @@ "vertical_grid": "layer_avg" }, "POP_REMIN_DOPr": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "low", "longname": "POP Remineralization routed to DOPr", "operator": "average", @@ -1725,6 +2152,9 @@ "vertical_grid": "layer_avg" }, "POP_REMIN_PO4": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "low", "longname": "POP Remineralization routed to PO4", "operator": "average", @@ -1732,6 +2162,9 @@ "vertical_grid": "layer_avg" }, "PV_CO2": { + "dependencies": { + "lflux_gas_co2": ".true." + }, "frequency": "never", "longname": "CO2 Piston Velocity", "operator": "average", @@ -1739,14 +2172,18 @@ "vertical_grid": "none" }, "PV_O2": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "never", - "longname": "PV_O2", + "longname": "O2 Piston Velocity", "operator": "average", "units": "cm/s", "vertical_grid": "none" }, "P_REMIN_SCALEF": { "dependencies": { + "base_bio_on": ".true.", "lp_remin_scalef": ".true." }, "frequency": "never", @@ -1756,6 +2193,9 @@ "vertical_grid": "layer_avg" }, "P_iron_FLUX_((particulate_flux_ref_depth_str))": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "P_iron Flux at ((particulate_flux_ref_depth_str))", "operator": "average", @@ -1763,6 +2203,9 @@ "vertical_grid": "none" }, "P_iron_FLUX_IN": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "P_iron Flux into Cell", "operator": "average", @@ -1770,6 +2213,9 @@ "vertical_grid": "layer_avg" }, "P_iron_PROD": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "P_iron Production", "operator": "average", @@ -1777,6 +2223,9 @@ "vertical_grid": "layer_avg" }, "P_iron_REMIN": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "P_iron Remineralization", "operator": "average", @@ -1784,13 +2233,19 @@ "vertical_grid": "layer_avg" }, "SCHMIDT_CO2": { + "dependencies": { + "lflux_gas_co2": ".true." + }, "frequency": "medium", - "longname": "CO2 Schmidt Number", + "longname": "CO2 Schmidt Number for base biotic tracers fluxes", "operator": "average", "units": 1, "vertical_grid": "none" }, "SCHMIDT_O2": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "O2 Schmidt Number", "operator": "average", @@ -1798,6 +2253,9 @@ "vertical_grid": "none" }, "SedDenitrif": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "nitrogen loss in Sediments", "operator": "average", @@ -1805,6 +2263,9 @@ "vertical_grid": "none" }, "SiO2_FLUX_((particulate_flux_ref_depth_str))": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "SiO2 Flux at ((particulate_flux_ref_depth_str))", "operator": "average", @@ -1812,6 +2273,9 @@ "vertical_grid": "none" }, "SiO2_FLUX_IN": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "SiO2 Flux into Cell", "operator": "average", @@ -1819,6 +2283,9 @@ "vertical_grid": "layer_avg" }, "SiO2_PROD": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "SiO2 Production", "operator": "average", @@ -1826,6 +2293,9 @@ "vertical_grid": "layer_avg" }, "SiO2_REMIN": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "never", "longname": "SiO2 Remineralization", "operator": "average", @@ -1833,6 +2303,9 @@ "vertical_grid": "layer_avg" }, "bSi_form": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Total Si Uptake", "operator": "average", @@ -1840,6 +2313,9 @@ "vertical_grid": "layer_avg" }, "bsiToSed": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "biogenic Si Flux to Sediments", "operator": "average", @@ -1847,6 +2323,9 @@ "vertical_grid": "none" }, "calcToFloor": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "never", "longname": "CaCO3 Flux Hitting Sea Floor", "operator": "average", @@ -1854,6 +2333,9 @@ "vertical_grid": "none" }, "calcToSed": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "CaCO3 Flux to Sediments", "operator": "average", @@ -1881,6 +2363,9 @@ "vertical_grid": "none" }, "calcToSed_ALT_CO2": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "CaCO3 Flux to Sediments, Alternative CO2", "operator": "average", @@ -1888,6 +2373,9 @@ "vertical_grid": "none" }, "co3_sat_arag": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "CO3 concentration at aragonite saturation", "operator": "average", @@ -1895,13 +2383,55 @@ "vertical_grid": "layer_avg" }, "co3_sat_calc": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "CO3 concentration at calcite saturation", "operator": "average", "units": "mmol/m^3", "vertical_grid": "layer_avg" }, + "d_SF_ABIO_DI14C_d_ABIO_DI14C": { + "dependencies": { + "abio_dic_on": ".true.", + "labio_derivative_diags": ".true.", + "lflux_gas_co2": ".true." + }, + "frequency": "never", + "longname": "Derivative of ABIO_FG_DI14C wrt ABIO_DI14C", + "operator": "average", + "units": "cm/s", + "vertical_grid": "none" + }, + "d_SF_ABIO_DI14C_d_ABIO_DIC": { + "dependencies": { + "abio_dic_on": ".true.", + "labio_derivative_diags": ".true.", + "lflux_gas_co2": ".true." + }, + "frequency": "never", + "longname": "Derivative of ABIO_FG_DI14C wrt ABIO_DIC", + "operator": "average", + "units": "cm/s", + "vertical_grid": "none" + }, + "d_SF_ABIO_DIC_d_ABIO_DIC": { + "dependencies": { + "abio_dic_on": ".true.", + "labio_derivative_diags": ".true.", + "lflux_gas_co2": ".true." + }, + "frequency": "never", + "longname": "Derivative of ABIO_FG_DIC wrt ABIO_DIC", + "operator": "average", + "units": "cm/s", + "vertical_grid": "none" + }, "dustToSed": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "dust Flux to Sediments", "operator": "average", @@ -1909,6 +2439,9 @@ "vertical_grid": "none" }, "dust_FLUX_IN": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Dust Flux into Cell", "operator": "average", @@ -1916,6 +2449,9 @@ "vertical_grid": "layer_avg" }, "dust_REMIN": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Dust Remineralization", "operator": "average", @@ -2028,7 +2564,7 @@ }, "graze_((zooplankton_sname))_((zooplankton_sname))": { "frequency": "never", - "longname": "((zooplankton_lname)) grazing loss to ((zooplankton_lname))", + "longname": "((zooplankton_lname1)) grazing loss to ((zooplankton_lname2))", "operator": "average", "truncate": true, "units": "mmol/m^3/s", @@ -2036,14 +2572,14 @@ }, "graze_((zooplankton_sname))_((zooplankton_sname))_zint": { "frequency": "never", - "longname": "((zooplankton_lname)) Grazing to ((zooplankton_lname)) Vertical Integral", + "longname": "((zooplankton_lname1)) Grazing to ((zooplankton_lname2)) Vertical Integral", "operator": "average", "units": "mmol/m^3 cm/s", "vertical_grid": "none" }, "graze_((zooplankton_sname))_((zooplankton_sname))_zint_100m": { "frequency": "never", - "longname": "((zooplankton_lname)) Grazing to ((zooplankton_lname)) Vertical Integral, 0-100m", + "longname": "((zooplankton_lname1)) Grazing to ((zooplankton_lname2)) Vertical Integral, 0-100m", "operator": "average", "units": "mmol/m^3 cm/s", "vertical_grid": "none" @@ -2115,6 +2651,9 @@ "vertical_grid": "layer_avg" }, "graze_auto_TOT": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "low", "longname": "Total Autotroph Grazing", "operator": "average", @@ -2122,6 +2661,9 @@ "vertical_grid": "layer_avg" }, "insitu_temp": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "in situ temperature", "operator": "average", @@ -2129,6 +2671,9 @@ "vertical_grid": "layer_avg" }, "pCO2SURF": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "surface pCO2", "operator": "average", @@ -2136,6 +2681,9 @@ "vertical_grid": "none" }, "pCO2SURF_ALT_CO2": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "never", "longname": "surface pCO2, Alternative CO2", "operator": "average", @@ -2143,6 +2691,9 @@ "vertical_grid": "none" }, "pH_3D": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "pH", "operator": "average", @@ -2150,6 +2701,9 @@ "vertical_grid": "layer_avg" }, "pH_3D_ALT_CO2": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "never", "longname": "pH, Alternative CO2", "operator": "average", @@ -2157,6 +2711,9 @@ "vertical_grid": "layer_avg" }, "pfeToSed": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "pFe Flux to Sediments", "operator": "average", @@ -2207,6 +2764,9 @@ "vertical_grid": "none" }, "photoC_NO3_TOT": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Total C Fixation from NO3", "operator": "average", @@ -2214,6 +2774,9 @@ "vertical_grid": "layer_avg" }, "photoC_NO3_TOT_zint": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Total C Fixation from NO3 Vertical Integral", "operator": "average", @@ -2221,6 +2784,9 @@ "vertical_grid": "none" }, "photoC_NO3_TOT_zint_100m": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Total C Fixation from NO3 Vertical Integral, 0-100m", "operator": "average", @@ -2228,6 +2794,9 @@ "vertical_grid": "none" }, "photoC_TOT": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Total C Fixation", "operator": "average", @@ -2235,6 +2804,9 @@ "vertical_grid": "layer_avg" }, "photoC_TOT_zint": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Total C Fixation Vertical Integral", "operator": "average", @@ -2242,6 +2814,9 @@ "vertical_grid": "none" }, "photoC_TOT_zint_100m": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Total C Fixation Vertical Integral, 0-100m", "operator": "average", @@ -2273,6 +2848,9 @@ "vertical_grid": "layer_avg" }, "pocToFloor": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": [ "medium", "high" @@ -2286,6 +2864,9 @@ "vertical_grid": "none" }, "pocToSed": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "POC Flux to Sediments", "operator": "average", @@ -2313,6 +2894,9 @@ "vertical_grid": "none" }, "ponToSed": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "nitrogen burial Flux to Sediments", "operator": "average", @@ -2320,6 +2904,9 @@ "vertical_grid": "none" }, "popToSed": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "phosphorus Flux to Sediments", "operator": "average", @@ -2349,6 +2936,9 @@ "vertical_grid": "none" }, "zsatarag": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Aragonite Saturation Depth", "operator": "average", @@ -2356,6 +2946,9 @@ "vertical_grid": "none" }, "zsatcalc": { + "dependencies": { + "base_bio_on": ".true." + }, "frequency": "medium", "longname": "Calcite Saturation Depth", "operator": "average", diff --git a/defaults/json/settings_cesm2.0.json b/defaults/json/settings_cesm2.0.json index cbe2b2c8..fe00827a 100644 --- a/defaults/json/settings_cesm2.0.json +++ b/defaults/json/settings_cesm2.0.json @@ -7,9 +7,10 @@ "PFT_defaults == \"CESM2\"": 3, "default": 1 }, + "dependencies": "base_bio_on", "longname": "Number of autotroph classes", "must set": "PFT_defaults == 'user-specified'", - "subcategory": "1. config PFTs", + "subcategory": "2. config PFTs", "units": "unitless" }, "max_grazer_prey_cnt": { @@ -18,8 +19,9 @@ "PFT_defaults == \"CESM2\"": 3, "default": 1 }, + "dependencies": "base_bio_on", "longname": "Number of grazer prey classes", - "subcategory": "1. config PFTs", + "subcategory": "2. config PFTs", "units": "unitless" }, "zooplankton_cnt": { @@ -28,8 +30,9 @@ "PFT_defaults == \"CESM2\"": 1, "default": 1 }, + "dependencies": "base_bio_on", "longname": "Number of zooplankton classes", - "subcategory": "1. config PFTs", + "subcategory": "2. config PFTs", "units": "unitless" } }, @@ -643,6 +646,7 @@ } }, "_order": [ + "tracer_modules", "general_parms", "general_parms2", "PFT_counts", @@ -665,6 +669,9 @@ "units": "mmol/m^3" }, "((autotroph_sname))C": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "((autotroph_lname)) Carbon", "units": "mmol/m^3" }, @@ -686,21 +693,29 @@ }, "((autotroph_sname))CaCO3": { "dependencies": { - "((autotroph_calcifier))": true + "((autotroph_calcifier))": true, + "base_bio_on": ".true." }, "long_name": "((autotroph_lname)) CaCO3", "units": "mmol/m^3" }, "((autotroph_sname))Chl": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "((autotroph_lname)) Chlorophyll", - "units": "mmol/m^3" + "units": "mg/m^3" }, "((autotroph_sname))Fe": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "((autotroph_lname)) Iron", "units": "mmol/m^3" }, "((autotroph_sname))P": { "dependencies": { + "base_bio_on": ".true.", "lvariable_PtoC": ".true." }, "long_name": "((autotroph_lname)) Phosphorus", @@ -708,20 +723,44 @@ }, "((autotroph_sname))Si": { "dependencies": { - "((autotroph_silicifier))": true + "((autotroph_silicifier))": true, + "base_bio_on": ".true." }, "long_name": "((autotroph_lname)) Silicon", "units": "mmol/m^3" }, "((zooplankton_sname))C": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "((zooplankton_lname)) Carbon", "units": "mmol/m^3" }, + "ABIO_DI14C": { + "dependencies": { + "abio_dic_on": ".true." + }, + "long_name": "Abiotic Dissolved Inorganic Carbon-14", + "units": "mmol/m^3" + }, + "ABIO_DIC": { + "dependencies": { + "abio_dic_on": ".true." + }, + "long_name": "Abiotic Dissolved Inorganic Carbon", + "units": "mmol/m^3" + }, "ALK": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Alkalinity", "units": "meq/m^3" }, "ALK_ALT_CO2": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Alkalinity, Alternative CO2", "units": "meq/m^3" }, @@ -740,10 +779,16 @@ "units": "mmol/m^3" }, "DIC": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Inorganic Carbon", "units": "mmol/m^3" }, "DIC_ALT_CO2": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Inorganic Carbon, Alternative CO2", "units": "mmol/m^3" }, @@ -751,65 +796,104 @@ "dependencies": { "ciso_on": ".true." }, - "long_name": "Dissolved Organic Carbon-13 (semi-labile+refractoy)", + "long_name": "Dissolved Organic Carbon-13 (semi-labile+refractory)", "units": "mmol/m^3" }, "DO14Ctot": { "dependencies": { "ciso_on": ".true." }, - "long_name": "Dissolved Organic Carbon-14 (semi-labile+refractoy)", + "long_name": "Dissolved Organic Carbon-14 (semi-labile+refractory)", "units": "mmol/m^3" }, "DOC": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Organic Carbon", "units": "mmol/m^3" }, "DOCr": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Refractory DOC", "units": "mmol/m^3" }, "DON": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Organic Nitrogen", "units": "mmol/m^3" }, "DONr": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Refractory DON", "units": "mmol/m^3" }, "DOP": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Organic Phosphorus", "units": "mmol/m^3" }, "DOPr": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Refractory DOP", "units": "mmol/m^3" }, "Fe": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Inorganic Iron", "units": "mmol/m^3" }, "Lig": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Iron Binding Ligand", "units": "mmol/m^3" }, "NH4": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Ammonia", "units": "mmol/m^3" }, "NO3": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Inorganic Nitrate", "units": "mmol/m^3" }, "O2": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Oxygen", "units": "mmol/m^3" }, "PO4": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Inorganic Phosphate", "units": "mmol/m^3" }, "SiO3": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Inorganic Silicate", "units": "mmol/m^3" }, @@ -832,8 +916,9 @@ "Jint_Ctot_thres_molpm2pyr": { "datatype": "real", "default_value": 1e-09, + "dependencies": "base_bio_on", "longname": "MARBL will abort if abs(Jint_Ctot) exceeds this threshold", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "mol m-2 yr-1" }, "PFT_defaults": { @@ -855,8 +940,9 @@ "_append_to_config_keywords": true, "datatype": "string", "default_value": "CESM2", + "dependencies": "base_bio_on", "longname": "Define how PFTs are initialized", - "subcategory": "1. config PFTs", + "subcategory": "2. config PFTs", "units": "unitless", "valid_values": [ "CESM2", @@ -866,71 +952,81 @@ "POM_bury_frac_max": { "datatype": "real", "default_value": 0.8, + "dependencies": "base_bio_on", "longname": "maximum bury fraction for POM", - "subcategory": "4. general parameters (bury coeffs)", + "subcategory": "5. general parameters (bury coeffs)", "units": "unitless" }, "PON_bury_coeff": { "datatype": "real", "default_value": 0.5, + "dependencies": "base_bio_on", "longname": "Scale factor for burial of PON", - "subcategory": "4. general parameters (bury coeffs)", + "subcategory": "5. general parameters (bury coeffs)", "units": "unitless" }, "QCaCO3_max": { "datatype": "real", "default_value": 0.4, + "dependencies": "base_bio_on", "longname": "Max CaCO3/C ratio for calcifiers", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "mmol CaCO3/mmol C" }, "auto_mort2_exp": { "datatype": "real", "default_value": 1.75, + "dependencies": "base_bio_on", "longname": "Value of power loss exponent for autotrophs", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "bSi_bury_frac_max": { "datatype": "real", "default_value": 1.0, + "dependencies": "base_bio_on", "longname": "maximum bury fraction for bSi", - "subcategory": "4. general parameters (bury coeffs)", + "subcategory": "5. general parameters (bury coeffs)", "units": "unitless" }, "bftt_dz_sum_thres": { "datatype": "real", "default_value": 1e-14, + "dependencies": "base_bio_on", "longname": "MARBL will abort if abs(1 - sum(bot_flux_to_tend)) exceeds this threshold", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "bury_coeff_rmean_timescale_years": { "datatype": "real", "default_value": 10, + "dependencies": "base_bio_on", "longname": "Running mean time scale for bury coefficients", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "years" }, "caco3_bury_thres_depth": { "datatype": "real", "default_value": "3000e2", + "dependencies": "base_bio_on", "longname": "Threshold depth for CaCO3 burial when opt = 'fixed_depth'", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "cm" }, "caco3_bury_thres_omega_calc": { "datatype": "real", "default_value": 1.0, + "dependencies": "base_bio_on", "longname": "omega calcite threshold for CaCO3 burial when opt = 'omega_calc'", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "caco3_bury_thres_opt": { "datatype": "string", "default_value": "omega_calc", + "dependencies": "base_bio_on", "longname": "Option of threshold of CaCO3 burial", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "non-numeric", "valid_values": [ "fixed_depth", @@ -940,233 +1036,262 @@ "ciso_fract_factors": { "datatype": "string", "default_value": "Laws", + "dependencies": "ciso_on", "longname": "Option for which biological fractionation calculation to use", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "non-numeric" }, "ciso_lsource_sink": { "datatype": "logical", "default_value": ".true.", + "dependencies": "ciso_on", "longname": "Control which portions of the carbon isotope code are executed (useful for debugging)", - "subcategory": "2. config flags", - "units": "unitless" - }, - "ciso_on": { - "datatype": "logical", - "default_value": ".false.", - "longname": "Control whether CISO tracer module is active", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "f_graze_CaCO3_remin": { "datatype": "real", "default_value": 0.33, + "dependencies": "base_bio_on", "longname": "Fraction of spCaCO3 grazing which is remineralized in zooplankton guts", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "gQ_Fe_kFe_thres": { "datatype": "real", "default_value": 10.0, + "dependencies": "base_bio_on", "longname": "Fe:kFe ratio threshold in uptake ratio computations", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "gQ_Si_kSi_thres": { "datatype": "real", "default_value": 5.0, + "dependencies": "base_bio_on", "longname": "Si:kSi ratio threshold in uptake ratio computations", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "gQsi_0": { "datatype": "real", "default_value": 0.137, + "dependencies": "base_bio_on", "longname": "initial Si/C ratio for growth", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "gQsi_max": { "datatype": "real", "default_value": 0.685, + "dependencies": "base_bio_on", "longname": "max Si/C ratio for growth", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "gQsi_min": { "datatype": "real", "default_value": 0.0457, + "dependencies": "base_bio_on", "longname": "min Si/C ratio for growth", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, + "labio_derivative_diags": { + "datatype": "logical", + "default_value": ".false.", + "dependencies": "abio_dic_on", + "longname": "Control whether derivative diagnostics are computed in abiotic surface flux (useful for Newton-Krylov)", + "subcategory": "3. config flags", + "units": "unitless" + }, "ladjust_bury_coeff": { "_append_to_config_keywords": true, "datatype": "logical", "default_value": ".false.", + "dependencies": "base_bio_on", "longname": "Control if bury coefficients are adjusted (rather than constant)", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lcheck_forcing": { "datatype": "logical", "default_value": ".false.", "longname": "Control whether consistency checks are performed on forcing input (useful for debugging)", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lcompute_nhx_surface_emis": { "datatype": "logical", "default_value": ".true.", + "dependencies": "base_bio_on", "longname": "Control if NHx emissions are computed", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lecovars_full_depth_tavg": { "datatype": "logical", "default_value": ".false.", "longname": "If .false., MARBL will recommend truncating the column for some diagnostics", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lflux_gas_co2": { "datatype": "logical", "default_value": ".true.", "longname": "Control which portions of code are executed (useful for debugging)", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lflux_gas_o2": { "datatype": "logical", "default_value": ".true.", + "dependencies": "base_bio_on", "longname": "Control which portions of code are executed (useful for debugging)", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lo2_consumption_scalef": { "datatype": "logical", "default_value": ".false.", + "dependencies": "base_bio_on", "longname": "Apply o2_consumption_scalef to o2 consumption (and request it as a forcing)", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lp_remin_scalef": { "datatype": "logical", "default_value": ".false.", + "dependencies": "base_bio_on", "longname": "Apply p_remin_scalef to particulate remin (and request it as a forcing)", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lsource_sink": { "datatype": "logical", "default_value": ".true.", "longname": "Control which portions of code are executed (useful for debugging)", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lvariable_PtoC": { "datatype": "logical", "default_value": ".true.", + "dependencies": "base_bio_on", "longname": "Control if PtoC ratios in autotrophs vary", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "o2_sf_o2_range_hi": { "datatype": "real", "default_value": 45.0, + "dependencies": "base_bio_on", "longname": "o2_scalefactor is applied to diss length scales for O2 less than this", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "mmol/m^3" }, "o2_sf_o2_range_lo": { "datatype": "real", "default_value": 5.0, + "dependencies": "base_bio_on", "longname": "o2_scalefactor is constant for O2 less than this", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "mmol/m^3" }, "o2_sf_val_lo_o2": { "datatype": "real", "default_value": 3.0, + "dependencies": "base_bio_on", "longname": "o2_scalefactor constant for O2 less than o2_sf_o2_range_lo", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "parm_CaCO3_diss": { "datatype": "real", "default_value": "500e2", + "dependencies": "base_bio_on", "longname": "Base CaCO3 dissolution length scale", - "subcategory": "4. general parameters (dissolution)", + "subcategory": "5. general parameters (dissolution)", "units": "cm" }, "parm_CaCO3_gamma": { "datatype": "real", "default_value": 0.1, + "dependencies": "base_bio_on", "longname": "CaCO3 gamma (fraction of production -> hard subclass)", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "parm_FeLig_scavenge_rate0": { "datatype": "real", "default_value": 1.4, + "dependencies": "base_bio_on", "longname": "Scavenging base rate for bound iron", - "subcategory": "4. general parameters (scavenging)", + "subcategory": "5. general parameters (scavenging)", "units": "cm^2/ng s/yr" }, "parm_Fe_bioavail": { "datatype": "real", "default_value": 1.0, + "dependencies": "base_bio_on", "longname": "Fraction of Fe flux that is bioavailable", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "parm_Fe_desorption_rate0": { "datatype": "real", "default_value": "1e-6", + "dependencies": "base_bio_on", "longname": "Desorption rate for scavenged Fe from particles", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "1/cm" }, "parm_Fe_scavenge_rate0": { "datatype": "real", "default_value": 18.0, + "dependencies": "base_bio_on", "longname": "Scavenging base rate for Fe", - "subcategory": "4. general parameters (scavenging)", + "subcategory": "5. general parameters (scavenging)", "units": "cm^2/ng s/yr" }, "parm_Lig_degrade_rate0": { "datatype": "real", "default_value": 9.4e-05, + "dependencies": "base_bio_on", "longname": "Fe-binding ligand bacterial degradation base rate coefficient", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "parm_Lig_scavenge_rate0": { "datatype": "real", "default_value": 0.015, + "dependencies": "base_bio_on", "longname": "Scavenging base rate for bound ligand", - "subcategory": "4. general parameters (scavenging)", + "subcategory": "5. general parameters (scavenging)", "units": "cm^2/ng s/yr" }, "parm_POC_diss": { "datatype": "real", "default_value": "100e2", + "dependencies": "base_bio_on", "longname": "Base POC dissolution length scale", - "subcategory": "4. general parameters (dissolution)", + "subcategory": "5. general parameters (dissolution)", "units": "cm" }, "parm_SiO2_diss": { "datatype": "real", "default_value": "770e2", + "dependencies": "base_bio_on", "longname": "Base SiO2 dissolution length scale", - "subcategory": "4. general parameters (dissolution)", + "subcategory": "5. general parameters (dissolution)", "units": "cm" }, "parm_SiO2_gamma": { "datatype": "real", "default_value": 0.1, + "dependencies": "base_bio_on", "longname": "SiO2 gamma (fraction of production -> hard subclass)", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "parm_f_prod_sp_CaCO3": { @@ -1175,29 +1300,33 @@ "GRID == \"CESM_x3\"": 0.075, "default": 0.07 }, + "dependencies": "base_bio_on", "longname": "Fraction of sp production as CaCO3 production", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "parm_hPOC_CaCO3_ratio": { "datatype": "real", "default_value": 0.05, + "dependencies": "base_bio_on", "longname": "hPOC to CaCO3 ratio", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "parm_hPOC_SiO2_ratio": { "datatype": "real", "default_value": 0.05, + "dependencies": "base_bio_on", "longname": "hPOC to SiO2 ratio", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "parm_hPOC_dust_ratio": { "datatype": "real", "default_value": 0.05, + "dependencies": "base_bio_on", "longname": "hPOC to dust ratio", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "parm_init_POC_bury_coeff": { @@ -1206,8 +1335,9 @@ "GRID == \"CESM_x3\"": 5.0, "default": 1.1 }, + "dependencies": "base_bio_on", "longname": "Initial scale factor for burial of POC, PON", - "subcategory": "4. general parameters (bury coeffs)", + "subcategory": "5. general parameters (bury coeffs)", "units": "unitless" }, "parm_init_POP_bury_coeff": { @@ -1216,8 +1346,9 @@ "GRID == \"CESM_x3\"": 5.0, "default": 1.1 }, + "dependencies": "base_bio_on", "longname": "Initial scale factor for burial of POP", - "subcategory": "4. general parameters (bury coeffs)", + "subcategory": "5. general parameters (bury coeffs)", "units": "unitless" }, "parm_init_bSi_bury_coeff": { @@ -1226,43 +1357,49 @@ "GRID == \"CESM_x3\"": 1.1, "default": 1.0 }, + "dependencies": "base_bio_on", "longname": "Initial scale factor for burial of bSi", - "subcategory": "4. general parameters (bury coeffs)", + "subcategory": "5. general parameters (bury coeffs)", "units": "unitless" }, "parm_kappa_nitrif_per_day": { "datatype": "real", "default_value": 0.06, + "dependencies": "base_bio_on", "longname": "Nitrification inverse time constant", - "subcategory": "4. general parameters (nitrification)", + "subcategory": "5. general parameters (nitrification)", "units": "1/day" }, "parm_labile_ratio": { "datatype": "real", "default_value": 0.94, + "dependencies": "base_bio_on", "longname": "Fraction of loss to DOC that routed directly to DIC", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "parm_nitrif_par_lim": { "datatype": "real", "default_value": 1.0, + "dependencies": "base_bio_on", "longname": "PAR limit for nitrification", - "subcategory": "4. general parameters (nitrification)", + "subcategory": "5. general parameters (nitrification)", "units": "W/m^2" }, "parm_o2_min": { "datatype": "real", "default_value": 5.0, + "dependencies": "base_bio_on", "longname": "Minimum O2 needed for production & consumption", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "nmol/cm^3" }, "parm_o2_min_delta": { "datatype": "real", "default_value": 5.0, + "dependencies": "base_bio_on", "longname": "Width of min O2 range", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "nmol/cm^3" }, "parm_scalelen_vals": { @@ -1282,8 +1419,9 @@ 5.5 ] }, + "dependencies": "base_bio_on", "longname": "Prescribed scalelen values", - "subcategory": "5. Scale lengths", + "subcategory": "6. Scale lengths", "units": "unitless" }, "parm_scalelen_z": { @@ -1295,8 +1433,9 @@ "500.0e2", "1000.0e2" ], + "dependencies": "base_bio_on", "longname": "Depths of prescribed scalelen values", - "subcategory": "5. Scale lengths", + "subcategory": "6. Scale lengths", "units": "cm" }, "parm_sed_denitrif_coeff": { @@ -1305,22 +1444,25 @@ "GRID == \"CESM_x3\"": 1.4, "default": 1 }, + "dependencies": "base_bio_on", "longname": "Global scaling factor for sed_denitrif", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "particulate_flux_ref_depth": { "datatype": "real", "default_value": 100.0, + "dependencies": "base_bio_on", "longname": "reference depth for particulate flux diagnostics", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "m" }, "zoo_mort2_exp": { "datatype": "real", "default_value": 1.5, + "dependencies": "base_bio_on", "longname": "Value of power loss exponent for zooplankton", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" } }, @@ -1332,8 +1474,9 @@ "default": "settings_file", "not ladjust_bury_coeff": "settings_file" }, + "dependencies": "base_bio_on", "longname": "Source of initial burial coefficient", - "subcategory": "3. config strings", + "subcategory": "4. config strings", "units": "unitless" } }, @@ -1364,11 +1507,38 @@ "ALK", "ALK_ALT_CO2" ], - "default": "" + "default": "", + "not base_bio_on": "" }, "longname": "Tracer names for tracers that are restored", "subcategory": "20. tracer restoring", "units": "non-numeric" } + }, + "tracer_modules": { + "abio_dic_on": { + "_append_to_config_keywords": true, + "datatype": "logical", + "default_value": ".false.", + "longname": "Control whether abiotic carbon tracer module is active", + "subcategory": "1. tracer modules", + "units": "unitless" + }, + "base_bio_on": { + "_append_to_config_keywords": true, + "datatype": "logical", + "default_value": ".true.", + "longname": "Control whether the base ecosystem tracer module is active", + "subcategory": "1. tracer modules", + "units": "unitless" + }, + "ciso_on": { + "_append_to_config_keywords": true, + "datatype": "logical", + "default_value": ".false.", + "longname": "Control whether CISO tracer module is active", + "subcategory": "1. tracer modules", + "units": "unitless" + } } } \ No newline at end of file diff --git a/defaults/json/settings_cesm2.1+cocco.json b/defaults/json/settings_cesm2.1+cocco.json index 9bdd30a3..31e40282 100644 --- a/defaults/json/settings_cesm2.1+cocco.json +++ b/defaults/json/settings_cesm2.1+cocco.json @@ -7,9 +7,10 @@ "PFT_defaults == \"CESM2+cocco\"": 4, "default": 1 }, + "dependencies": "base_bio_on", "longname": "Number of autotroph classes", "must set": "PFT_defaults == 'user-specified'", - "subcategory": "1. config PFTs", + "subcategory": "2. config PFTs", "units": "unitless" }, "max_grazer_prey_cnt": { @@ -18,8 +19,9 @@ "PFT_defaults == \"CESM2+cocco\"": 4, "default": 1 }, + "dependencies": "base_bio_on", "longname": "Number of grazer prey classes", - "subcategory": "1. config PFTs", + "subcategory": "2. config PFTs", "units": "unitless" }, "zooplankton_cnt": { @@ -28,8 +30,9 @@ "PFT_defaults == \"CESM2+cocco\"": 1, "default": 1 }, + "dependencies": "base_bio_on", "longname": "Number of zooplankton classes", - "subcategory": "1. config PFTs", + "subcategory": "2. config PFTs", "units": "unitless" } }, @@ -683,6 +686,7 @@ } }, "_order": [ + "tracer_modules", "general_parms", "general_parms2", "PFT_counts", @@ -705,6 +709,9 @@ "units": "mmol/m^3" }, "((autotroph_sname))C": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "((autotroph_lname)) Carbon", "units": "mmol/m^3" }, @@ -726,21 +733,29 @@ }, "((autotroph_sname))CaCO3": { "dependencies": { - "((autotroph_calcifier))": true + "((autotroph_calcifier))": true, + "base_bio_on": ".true." }, "long_name": "((autotroph_lname)) CaCO3", "units": "mmol/m^3" }, "((autotroph_sname))Chl": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "((autotroph_lname)) Chlorophyll", - "units": "mmol/m^3" + "units": "mg/m^3" }, "((autotroph_sname))Fe": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "((autotroph_lname)) Iron", "units": "mmol/m^3" }, "((autotroph_sname))P": { "dependencies": { + "base_bio_on": ".true.", "lvariable_PtoC": ".true." }, "long_name": "((autotroph_lname)) Phosphorus", @@ -748,20 +763,44 @@ }, "((autotroph_sname))Si": { "dependencies": { - "((autotroph_silicifier))": true + "((autotroph_silicifier))": true, + "base_bio_on": ".true." }, "long_name": "((autotroph_lname)) Silicon", "units": "mmol/m^3" }, "((zooplankton_sname))C": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "((zooplankton_lname)) Carbon", "units": "mmol/m^3" }, + "ABIO_DI14C": { + "dependencies": { + "abio_dic_on": ".true." + }, + "long_name": "Abiotic Dissolved Inorganic Carbon-14", + "units": "mmol/m^3" + }, + "ABIO_DIC": { + "dependencies": { + "abio_dic_on": ".true." + }, + "long_name": "Abiotic Dissolved Inorganic Carbon", + "units": "mmol/m^3" + }, "ALK": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Alkalinity", "units": "meq/m^3" }, "ALK_ALT_CO2": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Alkalinity, Alternative CO2", "units": "meq/m^3" }, @@ -780,10 +819,16 @@ "units": "mmol/m^3" }, "DIC": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Inorganic Carbon", "units": "mmol/m^3" }, "DIC_ALT_CO2": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Inorganic Carbon, Alternative CO2", "units": "mmol/m^3" }, @@ -791,65 +836,104 @@ "dependencies": { "ciso_on": ".true." }, - "long_name": "Dissolved Organic Carbon-13 (semi-labile+refractoy)", + "long_name": "Dissolved Organic Carbon-13 (semi-labile+refractory)", "units": "mmol/m^3" }, "DO14Ctot": { "dependencies": { "ciso_on": ".true." }, - "long_name": "Dissolved Organic Carbon-14 (semi-labile+refractoy)", + "long_name": "Dissolved Organic Carbon-14 (semi-labile+refractory)", "units": "mmol/m^3" }, "DOC": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Organic Carbon", "units": "mmol/m^3" }, "DOCr": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Refractory DOC", "units": "mmol/m^3" }, "DON": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Organic Nitrogen", "units": "mmol/m^3" }, "DONr": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Refractory DON", "units": "mmol/m^3" }, "DOP": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Organic Phosphorus", "units": "mmol/m^3" }, "DOPr": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Refractory DOP", "units": "mmol/m^3" }, "Fe": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Inorganic Iron", "units": "mmol/m^3" }, "Lig": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Iron Binding Ligand", "units": "mmol/m^3" }, "NH4": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Ammonia", "units": "mmol/m^3" }, "NO3": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Inorganic Nitrate", "units": "mmol/m^3" }, "O2": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Oxygen", "units": "mmol/m^3" }, "PO4": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Inorganic Phosphate", "units": "mmol/m^3" }, "SiO3": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Inorganic Silicate", "units": "mmol/m^3" }, @@ -872,8 +956,9 @@ "Jint_Ctot_thres_molpm2pyr": { "datatype": "real", "default_value": 1e-09, + "dependencies": "base_bio_on", "longname": "MARBL will abort if abs(Jint_Ctot) exceeds this threshold", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "mol m-2 yr-1" }, "PFT_defaults": { @@ -897,8 +982,9 @@ "_append_to_config_keywords": true, "datatype": "string", "default_value": "CESM2+cocco", + "dependencies": "base_bio_on", "longname": "Define how PFTs are initialized", - "subcategory": "1. config PFTs", + "subcategory": "2. config PFTs", "units": "unitless", "valid_values": [ "CESM2+cocco", @@ -908,71 +994,81 @@ "POM_bury_frac_max": { "datatype": "real", "default_value": 0.8, + "dependencies": "base_bio_on", "longname": "maximum bury fraction for POM", - "subcategory": "4. general parameters (bury coeffs)", + "subcategory": "5. general parameters (bury coeffs)", "units": "unitless" }, "PON_bury_coeff": { "datatype": "real", "default_value": 0.5, + "dependencies": "base_bio_on", "longname": "Scale factor for burial of PON", - "subcategory": "4. general parameters (bury coeffs)", + "subcategory": "5. general parameters (bury coeffs)", "units": "unitless" }, "QCaCO3_max": { "datatype": "real", "default_value": 2.0, + "dependencies": "base_bio_on", "longname": "Max CaCO3/C ratio for calcifiers", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "mmol CaCO3/mmol C" }, "auto_mort2_exp": { "datatype": "real", "default_value": 1.75, + "dependencies": "base_bio_on", "longname": "Value of power loss exponent for autotrophs", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "bSi_bury_frac_max": { "datatype": "real", "default_value": 1.0, + "dependencies": "base_bio_on", "longname": "maximum bury fraction for bSi", - "subcategory": "4. general parameters (bury coeffs)", + "subcategory": "5. general parameters (bury coeffs)", "units": "unitless" }, "bftt_dz_sum_thres": { "datatype": "real", "default_value": 1e-14, + "dependencies": "base_bio_on", "longname": "MARBL will abort if abs(1 - sum(bot_flux_to_tend)) exceeds this threshold", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "bury_coeff_rmean_timescale_years": { "datatype": "real", "default_value": 10, + "dependencies": "base_bio_on", "longname": "Running mean time scale for bury coefficients", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "years" }, "caco3_bury_thres_depth": { "datatype": "real", "default_value": "3000e2", + "dependencies": "base_bio_on", "longname": "Threshold depth for CaCO3 burial when opt = 'fixed_depth'", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "cm" }, "caco3_bury_thres_omega_calc": { "datatype": "real", "default_value": 0.89, + "dependencies": "base_bio_on", "longname": "omega calcite threshold for CaCO3 burial when opt = 'omega_calc'", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "caco3_bury_thres_opt": { "datatype": "string", "default_value": "omega_calc", + "dependencies": "base_bio_on", "longname": "Option of threshold of CaCO3 burial", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "non-numeric", "valid_values": [ "fixed_depth", @@ -982,107 +1078,119 @@ "ciso_fract_factors": { "datatype": "string", "default_value": "Laws", + "dependencies": "ciso_on", "longname": "Option for which biological fractionation calculation to use", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "non-numeric" }, "ciso_lsource_sink": { "datatype": "logical", "default_value": ".true.", + "dependencies": "ciso_on", "longname": "Control which portions of the carbon isotope code are executed (useful for debugging)", - "subcategory": "2. config flags", - "units": "unitless" - }, - "ciso_on": { - "datatype": "logical", - "default_value": ".false.", - "longname": "Control whether CISO tracer module is active", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "f_graze_CaCO3_remin": { "datatype": "real", "default_value": 0.7, + "dependencies": "base_bio_on", "longname": "Fraction of spCaCO3 grazing which is remineralized in zooplankton guts", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "gQ_Fe_kFe_thres": { "datatype": "real", "default_value": 10.0, + "dependencies": "base_bio_on", "longname": "Fe:kFe ratio threshold in uptake ratio computations", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "gQ_Si_kSi_thres": { "datatype": "real", "default_value": 6.0, + "dependencies": "base_bio_on", "longname": "Si:kSi ratio threshold in uptake ratio computations", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "gQsi_0": { "datatype": "real", "default_value": 0.137, + "dependencies": "base_bio_on", "longname": "initial Si/C ratio for growth", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "gQsi_max": { "datatype": "real", "default_value": 0.822, + "dependencies": "base_bio_on", "longname": "max Si/C ratio for growth", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "gQsi_min": { "datatype": "real", "default_value": 0.0457, + "dependencies": "base_bio_on", "longname": "min Si/C ratio for growth", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, + "labio_derivative_diags": { + "datatype": "logical", + "default_value": ".false.", + "dependencies": "abio_dic_on", + "longname": "Control whether derivative diagnostics are computed in abiotic surface flux (useful for Newton-Krylov)", + "subcategory": "3. config flags", + "units": "unitless" + }, "ladjust_bury_coeff": { "_append_to_config_keywords": true, "datatype": "logical", "default_value": ".false.", + "dependencies": "base_bio_on", "longname": "Control if bury coefficients are adjusted (rather than constant)", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lcheck_forcing": { "datatype": "logical", "default_value": ".false.", "longname": "Control whether consistency checks are performed on forcing input (useful for debugging)", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lcompute_nhx_surface_emis": { "datatype": "logical", "default_value": ".true.", + "dependencies": "base_bio_on", "longname": "Control if NHx emissions are computed", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lecovars_full_depth_tavg": { "datatype": "logical", "default_value": ".false.", "longname": "If .false., MARBL will recommend truncating the column for some diagnostics", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lflux_gas_co2": { "datatype": "logical", "default_value": ".true.", "longname": "Control which portions of code are executed (useful for debugging)", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lflux_gas_o2": { "datatype": "logical", "default_value": ".true.", + "dependencies": "base_bio_on", "longname": "Control which portions of code are executed (useful for debugging)", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lo2_consumption_scalef": { @@ -1091,127 +1199,144 @@ "GRID == \"CESM_x1\"": ".true.", "default": ".false." }, + "dependencies": "base_bio_on", "longname": "Apply o2_consumption_scalef to o2 consumption (and request it as a forcing)", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lp_remin_scalef": { "datatype": "logical", "default_value": ".false.", + "dependencies": "base_bio_on", "longname": "Apply p_remin_scalef to particulate remin (and request it as a forcing)", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lsource_sink": { "datatype": "logical", "default_value": ".true.", "longname": "Control which portions of code are executed (useful for debugging)", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lvariable_PtoC": { "datatype": "logical", "default_value": ".true.", + "dependencies": "base_bio_on", "longname": "Control if PtoC ratios in autotrophs vary", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "o2_sf_o2_range_hi": { "datatype": "real", "default_value": 45.0, + "dependencies": "base_bio_on", "longname": "o2_scalefactor is applied to diss length scales for O2 less than this", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "mmol/m^3" }, "o2_sf_o2_range_lo": { "datatype": "real", "default_value": 5.0, + "dependencies": "base_bio_on", "longname": "o2_scalefactor is constant for O2 less than this", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "mmol/m^3" }, "o2_sf_val_lo_o2": { "datatype": "real", "default_value": 2.6, + "dependencies": "base_bio_on", "longname": "o2_scalefactor constant for O2 less than o2_sf_o2_range_lo", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "parm_CaCO3_diss": { "datatype": "real", "default_value": "500e2", + "dependencies": "base_bio_on", "longname": "Base CaCO3 dissolution length scale", - "subcategory": "4. general parameters (dissolution)", + "subcategory": "5. general parameters (dissolution)", "units": "cm" }, "parm_CaCO3_gamma": { "datatype": "real", "default_value": 0.02, + "dependencies": "base_bio_on", "longname": "CaCO3 gamma (fraction of production -> hard subclass)", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "parm_FeLig_scavenge_rate0": { "datatype": "real", "default_value": 1.2, + "dependencies": "base_bio_on", "longname": "Scavenging base rate for bound iron", - "subcategory": "4. general parameters (scavenging)", + "subcategory": "5. general parameters (scavenging)", "units": "cm^2/ng s/yr" }, "parm_Fe_bioavail": { "datatype": "real", "default_value": 1.0, + "dependencies": "base_bio_on", "longname": "Fraction of Fe flux that is bioavailable", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "parm_Fe_desorption_rate0": { "datatype": "real", "default_value": "1e-6", + "dependencies": "base_bio_on", "longname": "Desorption rate for scavenged Fe from particles", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "1/cm" }, "parm_Fe_scavenge_rate0": { "datatype": "real", "default_value": 22.0, + "dependencies": "base_bio_on", "longname": "Scavenging base rate for Fe", - "subcategory": "4. general parameters (scavenging)", + "subcategory": "5. general parameters (scavenging)", "units": "cm^2/ng s/yr" }, "parm_Lig_degrade_rate0": { "datatype": "real", "default_value": 9.4e-05, + "dependencies": "base_bio_on", "longname": "Fe-binding ligand bacterial degradation base rate coefficient", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "parm_Lig_scavenge_rate0": { "datatype": "real", "default_value": 0.015, + "dependencies": "base_bio_on", "longname": "Scavenging base rate for bound ligand", - "subcategory": "4. general parameters (scavenging)", + "subcategory": "5. general parameters (scavenging)", "units": "cm^2/ng s/yr" }, "parm_POC_diss": { "datatype": "real", "default_value": "100e2", + "dependencies": "base_bio_on", "longname": "Base POC dissolution length scale", - "subcategory": "4. general parameters (dissolution)", + "subcategory": "5. general parameters (dissolution)", "units": "cm" }, "parm_SiO2_diss": { "datatype": "real", "default_value": "650e2", + "dependencies": "base_bio_on", "longname": "Base SiO2 dissolution length scale", - "subcategory": "4. general parameters (dissolution)", + "subcategory": "5. general parameters (dissolution)", "units": "cm" }, "parm_SiO2_gamma": { "datatype": "real", "default_value": 0.0, + "dependencies": "base_bio_on", "longname": "SiO2 gamma (fraction of production -> hard subclass)", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "parm_f_prod_sp_CaCO3": { @@ -1220,29 +1345,33 @@ "GRID == \"CESM_x3\"": 0.075, "default": 0.07 }, + "dependencies": "base_bio_on", "longname": "Fraction of sp production as CaCO3 production", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "parm_hPOC_CaCO3_ratio": { "datatype": "real", "default_value": 0.01, + "dependencies": "base_bio_on", "longname": "hPOC to CaCO3 ratio", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "parm_hPOC_SiO2_ratio": { "datatype": "real", "default_value": 0.01, + "dependencies": "base_bio_on", "longname": "hPOC to SiO2 ratio", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "parm_hPOC_dust_ratio": { "datatype": "real", "default_value": 0.01, + "dependencies": "base_bio_on", "longname": "hPOC to dust ratio", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "parm_init_POC_bury_coeff": { @@ -1251,8 +1380,9 @@ "GRID == \"CESM_x3\"": 5.0, "default": 2.54 }, + "dependencies": "base_bio_on", "longname": "Initial scale factor for burial of POC, PON", - "subcategory": "4. general parameters (bury coeffs)", + "subcategory": "5. general parameters (bury coeffs)", "units": "unitless" }, "parm_init_POP_bury_coeff": { @@ -1261,8 +1391,9 @@ "GRID == \"CESM_x3\"": 5.0, "default": 0.36 }, + "dependencies": "base_bio_on", "longname": "Initial scale factor for burial of POP", - "subcategory": "4. general parameters (bury coeffs)", + "subcategory": "5. general parameters (bury coeffs)", "units": "unitless" }, "parm_init_bSi_bury_coeff": { @@ -1271,43 +1402,49 @@ "GRID == \"CESM_x3\"": 1.1, "default": 1.53 }, + "dependencies": "base_bio_on", "longname": "Initial scale factor for burial of bSi", - "subcategory": "4. general parameters (bury coeffs)", + "subcategory": "5. general parameters (bury coeffs)", "units": "unitless" }, "parm_kappa_nitrif_per_day": { "datatype": "real", "default_value": 0.06, + "dependencies": "base_bio_on", "longname": "Nitrification inverse time constant", - "subcategory": "4. general parameters (nitrification)", + "subcategory": "5. general parameters (nitrification)", "units": "1/day" }, "parm_labile_ratio": { "datatype": "real", "default_value": 0.94, + "dependencies": "base_bio_on", "longname": "Fraction of loss to DOC that routed directly to DIC", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "parm_nitrif_par_lim": { "datatype": "real", "default_value": 1.0, + "dependencies": "base_bio_on", "longname": "PAR limit for nitrification", - "subcategory": "4. general parameters (nitrification)", + "subcategory": "5. general parameters (nitrification)", "units": "W/m^2" }, "parm_o2_min": { "datatype": "real", "default_value": 5.0, + "dependencies": "base_bio_on", "longname": "Minimum O2 needed for production & consumption", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "nmol/cm^3" }, "parm_o2_min_delta": { "datatype": "real", "default_value": 5.0, + "dependencies": "base_bio_on", "longname": "Width of min O2 range", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "nmol/cm^3" }, "parm_scalelen_vals": { @@ -1327,8 +1464,9 @@ 4.8 ] }, + "dependencies": "base_bio_on", "longname": "Prescribed scalelen values", - "subcategory": "5. Scale lengths", + "subcategory": "6. Scale lengths", "units": "unitless" }, "parm_scalelen_z": { @@ -1340,8 +1478,9 @@ "500.0e2", "1000.0e2" ], + "dependencies": "base_bio_on", "longname": "Depths of prescribed scalelen values", - "subcategory": "5. Scale lengths", + "subcategory": "6. Scale lengths", "units": "cm" }, "parm_sed_denitrif_coeff": { @@ -1350,22 +1489,25 @@ "GRID == \"CESM_x3\"": 1.4, "default": 1 }, + "dependencies": "base_bio_on", "longname": "Global scaling factor for sed_denitrif", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "particulate_flux_ref_depth": { "datatype": "real", "default_value": 100.0, + "dependencies": "base_bio_on", "longname": "reference depth for particulate flux diagnostics", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "m" }, "zoo_mort2_exp": { "datatype": "real", "default_value": 1.5, + "dependencies": "base_bio_on", "longname": "Value of power loss exponent for zooplankton", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" } }, @@ -1377,8 +1519,9 @@ "default": "settings_file", "not ladjust_bury_coeff": "settings_file" }, + "dependencies": "base_bio_on", "longname": "Source of initial burial coefficient", - "subcategory": "3. config strings", + "subcategory": "4. config strings", "units": "unitless" } }, @@ -1409,11 +1552,38 @@ "ALK", "ALK_ALT_CO2" ], - "default": "" + "default": "", + "not base_bio_on": "" }, "longname": "Tracer names for tracers that are restored", "subcategory": "20. tracer restoring", "units": "non-numeric" } + }, + "tracer_modules": { + "abio_dic_on": { + "_append_to_config_keywords": true, + "datatype": "logical", + "default_value": ".false.", + "longname": "Control whether abiotic carbon tracer module is active", + "subcategory": "1. tracer modules", + "units": "unitless" + }, + "base_bio_on": { + "_append_to_config_keywords": true, + "datatype": "logical", + "default_value": ".true.", + "longname": "Control whether the base ecosystem tracer module is active", + "subcategory": "1. tracer modules", + "units": "unitless" + }, + "ciso_on": { + "_append_to_config_keywords": true, + "datatype": "logical", + "default_value": ".false.", + "longname": "Control whether CISO tracer module is active", + "subcategory": "1. tracer modules", + "units": "unitless" + } } } \ No newline at end of file diff --git a/defaults/json/settings_cesm2.1.json b/defaults/json/settings_cesm2.1.json index 16b395a7..5bda7925 100644 --- a/defaults/json/settings_cesm2.1.json +++ b/defaults/json/settings_cesm2.1.json @@ -7,9 +7,10 @@ "PFT_defaults == \"CESM2\"": 3, "default": 1 }, + "dependencies": "base_bio_on", "longname": "Number of autotroph classes", "must set": "PFT_defaults == 'user-specified'", - "subcategory": "1. config PFTs", + "subcategory": "2. config PFTs", "units": "unitless" }, "max_grazer_prey_cnt": { @@ -18,8 +19,9 @@ "PFT_defaults == \"CESM2\"": 3, "default": 1 }, + "dependencies": "base_bio_on", "longname": "Number of grazer prey classes", - "subcategory": "1. config PFTs", + "subcategory": "2. config PFTs", "units": "unitless" }, "zooplankton_cnt": { @@ -28,8 +30,9 @@ "PFT_defaults == \"CESM2\"": 1, "default": 1 }, + "dependencies": "base_bio_on", "longname": "Number of zooplankton classes", - "subcategory": "1. config PFTs", + "subcategory": "2. config PFTs", "units": "unitless" } }, @@ -643,6 +646,7 @@ } }, "_order": [ + "tracer_modules", "general_parms", "general_parms2", "PFT_counts", @@ -665,6 +669,9 @@ "units": "mmol/m^3" }, "((autotroph_sname))C": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "((autotroph_lname)) Carbon", "units": "mmol/m^3" }, @@ -686,21 +693,29 @@ }, "((autotroph_sname))CaCO3": { "dependencies": { - "((autotroph_calcifier))": true + "((autotroph_calcifier))": true, + "base_bio_on": ".true." }, "long_name": "((autotroph_lname)) CaCO3", "units": "mmol/m^3" }, "((autotroph_sname))Chl": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "((autotroph_lname)) Chlorophyll", - "units": "mmol/m^3" + "units": "mg/m^3" }, "((autotroph_sname))Fe": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "((autotroph_lname)) Iron", "units": "mmol/m^3" }, "((autotroph_sname))P": { "dependencies": { + "base_bio_on": ".true.", "lvariable_PtoC": ".true." }, "long_name": "((autotroph_lname)) Phosphorus", @@ -708,20 +723,44 @@ }, "((autotroph_sname))Si": { "dependencies": { - "((autotroph_silicifier))": true + "((autotroph_silicifier))": true, + "base_bio_on": ".true." }, "long_name": "((autotroph_lname)) Silicon", "units": "mmol/m^3" }, "((zooplankton_sname))C": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "((zooplankton_lname)) Carbon", "units": "mmol/m^3" }, + "ABIO_DI14C": { + "dependencies": { + "abio_dic_on": ".true." + }, + "long_name": "Abiotic Dissolved Inorganic Carbon-14", + "units": "mmol/m^3" + }, + "ABIO_DIC": { + "dependencies": { + "abio_dic_on": ".true." + }, + "long_name": "Abiotic Dissolved Inorganic Carbon", + "units": "mmol/m^3" + }, "ALK": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Alkalinity", "units": "meq/m^3" }, "ALK_ALT_CO2": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Alkalinity, Alternative CO2", "units": "meq/m^3" }, @@ -740,10 +779,16 @@ "units": "mmol/m^3" }, "DIC": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Inorganic Carbon", "units": "mmol/m^3" }, "DIC_ALT_CO2": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Inorganic Carbon, Alternative CO2", "units": "mmol/m^3" }, @@ -751,65 +796,104 @@ "dependencies": { "ciso_on": ".true." }, - "long_name": "Dissolved Organic Carbon-13 (semi-labile+refractoy)", + "long_name": "Dissolved Organic Carbon-13 (semi-labile+refractory)", "units": "mmol/m^3" }, "DO14Ctot": { "dependencies": { "ciso_on": ".true." }, - "long_name": "Dissolved Organic Carbon-14 (semi-labile+refractoy)", + "long_name": "Dissolved Organic Carbon-14 (semi-labile+refractory)", "units": "mmol/m^3" }, "DOC": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Organic Carbon", "units": "mmol/m^3" }, "DOCr": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Refractory DOC", "units": "mmol/m^3" }, "DON": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Organic Nitrogen", "units": "mmol/m^3" }, "DONr": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Refractory DON", "units": "mmol/m^3" }, "DOP": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Organic Phosphorus", "units": "mmol/m^3" }, "DOPr": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Refractory DOP", "units": "mmol/m^3" }, "Fe": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Inorganic Iron", "units": "mmol/m^3" }, "Lig": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Iron Binding Ligand", "units": "mmol/m^3" }, "NH4": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Ammonia", "units": "mmol/m^3" }, "NO3": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Inorganic Nitrate", "units": "mmol/m^3" }, "O2": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Oxygen", "units": "mmol/m^3" }, "PO4": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Inorganic Phosphate", "units": "mmol/m^3" }, "SiO3": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Inorganic Silicate", "units": "mmol/m^3" }, @@ -832,8 +916,9 @@ "Jint_Ctot_thres_molpm2pyr": { "datatype": "real", "default_value": 1e-09, + "dependencies": "base_bio_on", "longname": "MARBL will abort if abs(Jint_Ctot) exceeds this threshold", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "mol m-2 yr-1" }, "PFT_defaults": { @@ -855,8 +940,9 @@ "_append_to_config_keywords": true, "datatype": "string", "default_value": "CESM2", + "dependencies": "base_bio_on", "longname": "Define how PFTs are initialized", - "subcategory": "1. config PFTs", + "subcategory": "2. config PFTs", "units": "unitless", "valid_values": [ "CESM2", @@ -866,71 +952,81 @@ "POM_bury_frac_max": { "datatype": "real", "default_value": 0.8, + "dependencies": "base_bio_on", "longname": "maximum bury fraction for POM", - "subcategory": "4. general parameters (bury coeffs)", + "subcategory": "5. general parameters (bury coeffs)", "units": "unitless" }, "PON_bury_coeff": { "datatype": "real", "default_value": 0.5, + "dependencies": "base_bio_on", "longname": "Scale factor for burial of PON", - "subcategory": "4. general parameters (bury coeffs)", + "subcategory": "5. general parameters (bury coeffs)", "units": "unitless" }, "QCaCO3_max": { "datatype": "real", "default_value": 0.4, + "dependencies": "base_bio_on", "longname": "Max CaCO3/C ratio for calcifiers", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "mmol CaCO3/mmol C" }, "auto_mort2_exp": { "datatype": "real", "default_value": 1.75, + "dependencies": "base_bio_on", "longname": "Value of power loss exponent for autotrophs", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "bSi_bury_frac_max": { "datatype": "real", "default_value": 1.0, + "dependencies": "base_bio_on", "longname": "maximum bury fraction for bSi", - "subcategory": "4. general parameters (bury coeffs)", + "subcategory": "5. general parameters (bury coeffs)", "units": "unitless" }, "bftt_dz_sum_thres": { "datatype": "real", "default_value": 1e-14, + "dependencies": "base_bio_on", "longname": "MARBL will abort if abs(1 - sum(bot_flux_to_tend)) exceeds this threshold", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "bury_coeff_rmean_timescale_years": { "datatype": "real", "default_value": 10, + "dependencies": "base_bio_on", "longname": "Running mean time scale for bury coefficients", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "years" }, "caco3_bury_thres_depth": { "datatype": "real", "default_value": "3000e2", + "dependencies": "base_bio_on", "longname": "Threshold depth for CaCO3 burial when opt = 'fixed_depth'", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "cm" }, "caco3_bury_thres_omega_calc": { "datatype": "real", "default_value": 0.89, + "dependencies": "base_bio_on", "longname": "omega calcite threshold for CaCO3 burial when opt = 'omega_calc'", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "caco3_bury_thres_opt": { "datatype": "string", "default_value": "omega_calc", + "dependencies": "base_bio_on", "longname": "Option of threshold of CaCO3 burial", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "non-numeric", "valid_values": [ "fixed_depth", @@ -940,107 +1036,119 @@ "ciso_fract_factors": { "datatype": "string", "default_value": "Laws", + "dependencies": "ciso_on", "longname": "Option for which biological fractionation calculation to use", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "non-numeric" }, "ciso_lsource_sink": { "datatype": "logical", "default_value": ".true.", + "dependencies": "ciso_on", "longname": "Control which portions of the carbon isotope code are executed (useful for debugging)", - "subcategory": "2. config flags", - "units": "unitless" - }, - "ciso_on": { - "datatype": "logical", - "default_value": ".false.", - "longname": "Control whether CISO tracer module is active", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "f_graze_CaCO3_remin": { "datatype": "real", "default_value": 0.33, + "dependencies": "base_bio_on", "longname": "Fraction of spCaCO3 grazing which is remineralized in zooplankton guts", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "gQ_Fe_kFe_thres": { "datatype": "real", "default_value": 10.0, + "dependencies": "base_bio_on", "longname": "Fe:kFe ratio threshold in uptake ratio computations", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "gQ_Si_kSi_thres": { "datatype": "real", "default_value": 6.0, + "dependencies": "base_bio_on", "longname": "Si:kSi ratio threshold in uptake ratio computations", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "gQsi_0": { "datatype": "real", "default_value": 0.137, + "dependencies": "base_bio_on", "longname": "initial Si/C ratio for growth", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "gQsi_max": { "datatype": "real", "default_value": 0.822, + "dependencies": "base_bio_on", "longname": "max Si/C ratio for growth", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "gQsi_min": { "datatype": "real", "default_value": 0.0457, + "dependencies": "base_bio_on", "longname": "min Si/C ratio for growth", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, + "labio_derivative_diags": { + "datatype": "logical", + "default_value": ".false.", + "dependencies": "abio_dic_on", + "longname": "Control whether derivative diagnostics are computed in abiotic surface flux (useful for Newton-Krylov)", + "subcategory": "3. config flags", + "units": "unitless" + }, "ladjust_bury_coeff": { "_append_to_config_keywords": true, "datatype": "logical", "default_value": ".false.", + "dependencies": "base_bio_on", "longname": "Control if bury coefficients are adjusted (rather than constant)", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lcheck_forcing": { "datatype": "logical", "default_value": ".false.", "longname": "Control whether consistency checks are performed on forcing input (useful for debugging)", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lcompute_nhx_surface_emis": { "datatype": "logical", "default_value": ".true.", + "dependencies": "base_bio_on", "longname": "Control if NHx emissions are computed", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lecovars_full_depth_tavg": { "datatype": "logical", "default_value": ".false.", "longname": "If .false., MARBL will recommend truncating the column for some diagnostics", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lflux_gas_co2": { "datatype": "logical", "default_value": ".true.", "longname": "Control which portions of code are executed (useful for debugging)", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lflux_gas_o2": { "datatype": "logical", "default_value": ".true.", + "dependencies": "base_bio_on", "longname": "Control which portions of code are executed (useful for debugging)", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lo2_consumption_scalef": { @@ -1049,127 +1157,144 @@ "GRID == \"CESM_x1\"": ".true.", "default": ".false." }, + "dependencies": "base_bio_on", "longname": "Apply o2_consumption_scalef to o2 consumption (and request it as a forcing)", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lp_remin_scalef": { "datatype": "logical", "default_value": ".false.", + "dependencies": "base_bio_on", "longname": "Apply p_remin_scalef to particulate remin (and request it as a forcing)", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lsource_sink": { "datatype": "logical", "default_value": ".true.", "longname": "Control which portions of code are executed (useful for debugging)", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lvariable_PtoC": { "datatype": "logical", "default_value": ".true.", + "dependencies": "base_bio_on", "longname": "Control if PtoC ratios in autotrophs vary", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "o2_sf_o2_range_hi": { "datatype": "real", "default_value": 45.0, + "dependencies": "base_bio_on", "longname": "o2_scalefactor is applied to diss length scales for O2 less than this", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "mmol/m^3" }, "o2_sf_o2_range_lo": { "datatype": "real", "default_value": 5.0, + "dependencies": "base_bio_on", "longname": "o2_scalefactor is constant for O2 less than this", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "mmol/m^3" }, "o2_sf_val_lo_o2": { "datatype": "real", "default_value": 2.6, + "dependencies": "base_bio_on", "longname": "o2_scalefactor constant for O2 less than o2_sf_o2_range_lo", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "parm_CaCO3_diss": { "datatype": "real", "default_value": "500e2", + "dependencies": "base_bio_on", "longname": "Base CaCO3 dissolution length scale", - "subcategory": "4. general parameters (dissolution)", + "subcategory": "5. general parameters (dissolution)", "units": "cm" }, "parm_CaCO3_gamma": { "datatype": "real", "default_value": 0.02, + "dependencies": "base_bio_on", "longname": "CaCO3 gamma (fraction of production -> hard subclass)", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "parm_FeLig_scavenge_rate0": { "datatype": "real", "default_value": 1.2, + "dependencies": "base_bio_on", "longname": "Scavenging base rate for bound iron", - "subcategory": "4. general parameters (scavenging)", + "subcategory": "5. general parameters (scavenging)", "units": "cm^2/ng s/yr" }, "parm_Fe_bioavail": { "datatype": "real", "default_value": 1.0, + "dependencies": "base_bio_on", "longname": "Fraction of Fe flux that is bioavailable", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "parm_Fe_desorption_rate0": { "datatype": "real", "default_value": "1e-6", + "dependencies": "base_bio_on", "longname": "Desorption rate for scavenged Fe from particles", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "1/cm" }, "parm_Fe_scavenge_rate0": { "datatype": "real", "default_value": 22.0, + "dependencies": "base_bio_on", "longname": "Scavenging base rate for Fe", - "subcategory": "4. general parameters (scavenging)", + "subcategory": "5. general parameters (scavenging)", "units": "cm^2/ng s/yr" }, "parm_Lig_degrade_rate0": { "datatype": "real", "default_value": 9.4e-05, + "dependencies": "base_bio_on", "longname": "Fe-binding ligand bacterial degradation base rate coefficient", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "parm_Lig_scavenge_rate0": { "datatype": "real", "default_value": 0.015, + "dependencies": "base_bio_on", "longname": "Scavenging base rate for bound ligand", - "subcategory": "4. general parameters (scavenging)", + "subcategory": "5. general parameters (scavenging)", "units": "cm^2/ng s/yr" }, "parm_POC_diss": { "datatype": "real", "default_value": "100e2", + "dependencies": "base_bio_on", "longname": "Base POC dissolution length scale", - "subcategory": "4. general parameters (dissolution)", + "subcategory": "5. general parameters (dissolution)", "units": "cm" }, "parm_SiO2_diss": { "datatype": "real", "default_value": "650e2", + "dependencies": "base_bio_on", "longname": "Base SiO2 dissolution length scale", - "subcategory": "4. general parameters (dissolution)", + "subcategory": "5. general parameters (dissolution)", "units": "cm" }, "parm_SiO2_gamma": { "datatype": "real", "default_value": 0.0, + "dependencies": "base_bio_on", "longname": "SiO2 gamma (fraction of production -> hard subclass)", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "parm_f_prod_sp_CaCO3": { @@ -1178,29 +1303,33 @@ "GRID == \"CESM_x3\"": 0.075, "default": 0.07 }, + "dependencies": "base_bio_on", "longname": "Fraction of sp production as CaCO3 production", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "parm_hPOC_CaCO3_ratio": { "datatype": "real", "default_value": 0.01, + "dependencies": "base_bio_on", "longname": "hPOC to CaCO3 ratio", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "parm_hPOC_SiO2_ratio": { "datatype": "real", "default_value": 0.01, + "dependencies": "base_bio_on", "longname": "hPOC to SiO2 ratio", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "parm_hPOC_dust_ratio": { "datatype": "real", "default_value": 0.01, + "dependencies": "base_bio_on", "longname": "hPOC to dust ratio", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "parm_init_POC_bury_coeff": { @@ -1209,8 +1338,9 @@ "GRID == \"CESM_x3\"": 5.0, "default": 2.54 }, + "dependencies": "base_bio_on", "longname": "Initial scale factor for burial of POC, PON", - "subcategory": "4. general parameters (bury coeffs)", + "subcategory": "5. general parameters (bury coeffs)", "units": "unitless" }, "parm_init_POP_bury_coeff": { @@ -1219,8 +1349,9 @@ "GRID == \"CESM_x3\"": 5.0, "default": 0.36 }, + "dependencies": "base_bio_on", "longname": "Initial scale factor for burial of POP", - "subcategory": "4. general parameters (bury coeffs)", + "subcategory": "5. general parameters (bury coeffs)", "units": "unitless" }, "parm_init_bSi_bury_coeff": { @@ -1229,43 +1360,49 @@ "GRID == \"CESM_x3\"": 1.1, "default": 1.53 }, + "dependencies": "base_bio_on", "longname": "Initial scale factor for burial of bSi", - "subcategory": "4. general parameters (bury coeffs)", + "subcategory": "5. general parameters (bury coeffs)", "units": "unitless" }, "parm_kappa_nitrif_per_day": { "datatype": "real", "default_value": 0.06, + "dependencies": "base_bio_on", "longname": "Nitrification inverse time constant", - "subcategory": "4. general parameters (nitrification)", + "subcategory": "5. general parameters (nitrification)", "units": "1/day" }, "parm_labile_ratio": { "datatype": "real", "default_value": 0.94, + "dependencies": "base_bio_on", "longname": "Fraction of loss to DOC that routed directly to DIC", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "parm_nitrif_par_lim": { "datatype": "real", "default_value": 1.0, + "dependencies": "base_bio_on", "longname": "PAR limit for nitrification", - "subcategory": "4. general parameters (nitrification)", + "subcategory": "5. general parameters (nitrification)", "units": "W/m^2" }, "parm_o2_min": { "datatype": "real", "default_value": 5.0, + "dependencies": "base_bio_on", "longname": "Minimum O2 needed for production & consumption", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "nmol/cm^3" }, "parm_o2_min_delta": { "datatype": "real", "default_value": 5.0, + "dependencies": "base_bio_on", "longname": "Width of min O2 range", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "nmol/cm^3" }, "parm_scalelen_vals": { @@ -1285,8 +1422,9 @@ 4.8 ] }, + "dependencies": "base_bio_on", "longname": "Prescribed scalelen values", - "subcategory": "5. Scale lengths", + "subcategory": "6. Scale lengths", "units": "unitless" }, "parm_scalelen_z": { @@ -1298,8 +1436,9 @@ "500.0e2", "1000.0e2" ], + "dependencies": "base_bio_on", "longname": "Depths of prescribed scalelen values", - "subcategory": "5. Scale lengths", + "subcategory": "6. Scale lengths", "units": "cm" }, "parm_sed_denitrif_coeff": { @@ -1308,22 +1447,25 @@ "GRID == \"CESM_x3\"": 1.4, "default": 1 }, + "dependencies": "base_bio_on", "longname": "Global scaling factor for sed_denitrif", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "particulate_flux_ref_depth": { "datatype": "real", "default_value": 100.0, + "dependencies": "base_bio_on", "longname": "reference depth for particulate flux diagnostics", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "m" }, "zoo_mort2_exp": { "datatype": "real", "default_value": 1.5, + "dependencies": "base_bio_on", "longname": "Value of power loss exponent for zooplankton", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" } }, @@ -1335,8 +1477,9 @@ "default": "settings_file", "not ladjust_bury_coeff": "settings_file" }, + "dependencies": "base_bio_on", "longname": "Source of initial burial coefficient", - "subcategory": "3. config strings", + "subcategory": "4. config strings", "units": "unitless" } }, @@ -1367,11 +1510,38 @@ "ALK", "ALK_ALT_CO2" ], - "default": "" + "default": "", + "not base_bio_on": "" }, "longname": "Tracer names for tracers that are restored", "subcategory": "20. tracer restoring", "units": "non-numeric" } + }, + "tracer_modules": { + "abio_dic_on": { + "_append_to_config_keywords": true, + "datatype": "logical", + "default_value": ".false.", + "longname": "Control whether abiotic carbon tracer module is active", + "subcategory": "1. tracer modules", + "units": "unitless" + }, + "base_bio_on": { + "_append_to_config_keywords": true, + "datatype": "logical", + "default_value": ".true.", + "longname": "Control whether the base ecosystem tracer module is active", + "subcategory": "1. tracer modules", + "units": "unitless" + }, + "ciso_on": { + "_append_to_config_keywords": true, + "datatype": "logical", + "default_value": ".false.", + "longname": "Control whether CISO tracer module is active", + "subcategory": "1. tracer modules", + "units": "unitless" + } } } \ No newline at end of file diff --git a/defaults/json/settings_latest+4p2z.json b/defaults/json/settings_latest+4p2z.json index 747e184d..0d1c0888 100644 --- a/defaults/json/settings_latest+4p2z.json +++ b/defaults/json/settings_latest+4p2z.json @@ -7,9 +7,10 @@ "PFT_defaults == \"4p2z\"": 4, "default": 1 }, + "dependencies": "base_bio_on", "longname": "Number of autotroph classes", "must set": "PFT_defaults == 'user-specified'", - "subcategory": "1. config PFTs", + "subcategory": "2. config PFTs", "units": "unitless" }, "max_grazer_prey_cnt": { @@ -18,8 +19,9 @@ "PFT_defaults == \"4p2z\"": 4, "default": 1 }, + "dependencies": "base_bio_on", "longname": "Number of grazer prey classes", - "subcategory": "1. config PFTs", + "subcategory": "2. config PFTs", "units": "unitless" }, "zooplankton_cnt": { @@ -28,8 +30,9 @@ "PFT_defaults == \"4p2z\"": 2, "default": 1 }, + "dependencies": "base_bio_on", "longname": "Number of zooplankton classes", - "subcategory": "1. config PFTs", + "subcategory": "2. config PFTs", "units": "unitless" } }, @@ -731,6 +734,7 @@ } }, "_order": [ + "tracer_modules", "general_parms", "general_parms2", "PFT_counts", @@ -753,6 +757,9 @@ "units": "mmol/m^3" }, "((autotroph_sname))C": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "((autotroph_lname)) Carbon", "units": "mmol/m^3" }, @@ -774,21 +781,29 @@ }, "((autotroph_sname))CaCO3": { "dependencies": { - "((autotroph_calcifier))": true + "((autotroph_calcifier))": true, + "base_bio_on": ".true." }, "long_name": "((autotroph_lname)) CaCO3", "units": "mmol/m^3" }, "((autotroph_sname))Chl": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "((autotroph_lname)) Chlorophyll", - "units": "mmol/m^3" + "units": "mg/m^3" }, "((autotroph_sname))Fe": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "((autotroph_lname)) Iron", "units": "mmol/m^3" }, "((autotroph_sname))P": { "dependencies": { + "base_bio_on": ".true.", "lvariable_PtoC": ".true." }, "long_name": "((autotroph_lname)) Phosphorus", @@ -796,20 +811,44 @@ }, "((autotroph_sname))Si": { "dependencies": { - "((autotroph_silicifier))": true + "((autotroph_silicifier))": true, + "base_bio_on": ".true." }, "long_name": "((autotroph_lname)) Silicon", "units": "mmol/m^3" }, "((zooplankton_sname))C": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "((zooplankton_lname)) Carbon", "units": "mmol/m^3" }, + "ABIO_DI14C": { + "dependencies": { + "abio_dic_on": ".true." + }, + "long_name": "Abiotic Dissolved Inorganic Carbon-14", + "units": "mmol/m^3" + }, + "ABIO_DIC": { + "dependencies": { + "abio_dic_on": ".true." + }, + "long_name": "Abiotic Dissolved Inorganic Carbon", + "units": "mmol/m^3" + }, "ALK": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Alkalinity", "units": "meq/m^3" }, "ALK_ALT_CO2": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Alkalinity, Alternative CO2", "units": "meq/m^3" }, @@ -828,10 +867,16 @@ "units": "mmol/m^3" }, "DIC": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Inorganic Carbon", "units": "mmol/m^3" }, "DIC_ALT_CO2": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Inorganic Carbon, Alternative CO2", "units": "mmol/m^3" }, @@ -839,65 +884,104 @@ "dependencies": { "ciso_on": ".true." }, - "long_name": "Dissolved Organic Carbon-13 (semi-labile+refractoy)", + "long_name": "Dissolved Organic Carbon-13 (semi-labile+refractory)", "units": "mmol/m^3" }, "DO14Ctot": { "dependencies": { "ciso_on": ".true." }, - "long_name": "Dissolved Organic Carbon-14 (semi-labile+refractoy)", + "long_name": "Dissolved Organic Carbon-14 (semi-labile+refractory)", "units": "mmol/m^3" }, "DOC": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Organic Carbon", "units": "mmol/m^3" }, "DOCr": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Refractory DOC", "units": "mmol/m^3" }, "DON": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Organic Nitrogen", "units": "mmol/m^3" }, "DONr": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Refractory DON", "units": "mmol/m^3" }, "DOP": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Organic Phosphorus", "units": "mmol/m^3" }, "DOPr": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Refractory DOP", "units": "mmol/m^3" }, "Fe": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Inorganic Iron", "units": "mmol/m^3" }, "Lig": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Iron Binding Ligand", "units": "mmol/m^3" }, "NH4": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Ammonia", "units": "mmol/m^3" }, "NO3": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Inorganic Nitrate", "units": "mmol/m^3" }, "O2": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Oxygen", "units": "mmol/m^3" }, "PO4": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Inorganic Phosphate", "units": "mmol/m^3" }, "SiO3": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Inorganic Silicate", "units": "mmol/m^3" }, @@ -920,8 +1004,9 @@ "Jint_Ctot_thres_molpm2pyr": { "datatype": "real", "default_value": 1e-09, + "dependencies": "base_bio_on", "longname": "MARBL will abort if abs(Jint_Ctot) exceeds this threshold", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "mol m-2 yr-1" }, "PFT_defaults": { @@ -950,8 +1035,9 @@ "_append_to_config_keywords": true, "datatype": "string", "default_value": "4p2z", + "dependencies": "base_bio_on", "longname": "Define how PFTs are initialized", - "subcategory": "1. config PFTs", + "subcategory": "2. config PFTs", "units": "unitless", "valid_values": [ "4p2z", @@ -961,71 +1047,81 @@ "POM_bury_frac_max": { "datatype": "real", "default_value": 0.8, + "dependencies": "base_bio_on", "longname": "maximum bury fraction for POM", - "subcategory": "4. general parameters (bury coeffs)", + "subcategory": "5. general parameters (bury coeffs)", "units": "unitless" }, "PON_bury_coeff": { "datatype": "real", "default_value": 0.5, + "dependencies": "base_bio_on", "longname": "Scale factor for burial of PON", - "subcategory": "4. general parameters (bury coeffs)", + "subcategory": "5. general parameters (bury coeffs)", "units": "unitless" }, "QCaCO3_max": { "datatype": "real", "default_value": 1.0, + "dependencies": "base_bio_on", "longname": "Max CaCO3/C ratio for calcifiers", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "mmol CaCO3/mmol C" }, "auto_mort2_exp": { "datatype": "real", "default_value": 1.75, + "dependencies": "base_bio_on", "longname": "Value of power loss exponent for autotrophs", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "bSi_bury_frac_max": { "datatype": "real", "default_value": 1.0, + "dependencies": "base_bio_on", "longname": "maximum bury fraction for bSi", - "subcategory": "4. general parameters (bury coeffs)", + "subcategory": "5. general parameters (bury coeffs)", "units": "unitless" }, "bftt_dz_sum_thres": { "datatype": "real", "default_value": 1e-14, + "dependencies": "base_bio_on", "longname": "MARBL will abort if abs(1 - sum(bot_flux_to_tend)) exceeds this threshold", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "bury_coeff_rmean_timescale_years": { "datatype": "real", "default_value": 10, + "dependencies": "base_bio_on", "longname": "Running mean time scale for bury coefficients", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "years" }, "caco3_bury_thres_depth": { "datatype": "real", "default_value": "3000e2", + "dependencies": "base_bio_on", "longname": "Threshold depth for CaCO3 burial when opt = 'fixed_depth'", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "cm" }, "caco3_bury_thres_omega_calc": { "datatype": "real", "default_value": 1.0, + "dependencies": "base_bio_on", "longname": "omega calcite threshold for CaCO3 burial when opt = 'omega_calc'", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "caco3_bury_thres_opt": { "datatype": "string", "default_value": "omega_calc", + "dependencies": "base_bio_on", "longname": "Option of threshold of CaCO3 burial", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "non-numeric", "valid_values": [ "fixed_depth", @@ -1035,107 +1131,119 @@ "ciso_fract_factors": { "datatype": "string", "default_value": "Laws", + "dependencies": "ciso_on", "longname": "Option for which biological fractionation calculation to use", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "non-numeric" }, "ciso_lsource_sink": { "datatype": "logical", "default_value": ".true.", + "dependencies": "ciso_on", "longname": "Control which portions of the carbon isotope code are executed (useful for debugging)", - "subcategory": "2. config flags", - "units": "unitless" - }, - "ciso_on": { - "datatype": "logical", - "default_value": ".false.", - "longname": "Control whether CISO tracer module is active", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "f_graze_CaCO3_remin": { "datatype": "real", "default_value": 0.5, + "dependencies": "base_bio_on", "longname": "Fraction of spCaCO3 grazing which is remineralized in zooplankton guts", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "gQ_Fe_kFe_thres": { "datatype": "real", "default_value": 10.0, + "dependencies": "base_bio_on", "longname": "Fe:kFe ratio threshold in uptake ratio computations", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "gQ_Si_kSi_thres": { "datatype": "real", "default_value": 5.0, + "dependencies": "base_bio_on", "longname": "Si:kSi ratio threshold in uptake ratio computations", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "gQsi_0": { "datatype": "real", "default_value": 0.137, + "dependencies": "base_bio_on", "longname": "initial Si/C ratio for growth", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "gQsi_max": { "datatype": "real", "default_value": 0.685, + "dependencies": "base_bio_on", "longname": "max Si/C ratio for growth", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "gQsi_min": { "datatype": "real", "default_value": 0.0457, + "dependencies": "base_bio_on", "longname": "min Si/C ratio for growth", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, + "labio_derivative_diags": { + "datatype": "logical", + "default_value": ".false.", + "dependencies": "abio_dic_on", + "longname": "Control whether derivative diagnostics are computed in abiotic surface flux (useful for Newton-Krylov)", + "subcategory": "3. config flags", + "units": "unitless" + }, "ladjust_bury_coeff": { "_append_to_config_keywords": true, "datatype": "logical", "default_value": ".false.", + "dependencies": "base_bio_on", "longname": "Control if bury coefficients are adjusted (rather than constant)", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lcheck_forcing": { "datatype": "logical", "default_value": ".false.", "longname": "Control whether consistency checks are performed on forcing input (useful for debugging)", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lcompute_nhx_surface_emis": { "datatype": "logical", "default_value": ".true.", + "dependencies": "base_bio_on", "longname": "Control if NHx emissions are computed", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lecovars_full_depth_tavg": { "datatype": "logical", "default_value": ".false.", "longname": "If .false., MARBL will recommend truncating the column for some diagnostics", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lflux_gas_co2": { "datatype": "logical", "default_value": ".true.", "longname": "Control which portions of code are executed (useful for debugging)", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lflux_gas_o2": { "datatype": "logical", "default_value": ".true.", + "dependencies": "base_bio_on", "longname": "Control which portions of code are executed (useful for debugging)", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lo2_consumption_scalef": { @@ -1144,127 +1252,144 @@ "GRID == \"CESM_x1\"": ".true.", "default": ".false." }, + "dependencies": "base_bio_on", "longname": "Apply o2_consumption_scalef to o2 consumption (and request it as a forcing)", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lp_remin_scalef": { "datatype": "logical", "default_value": ".false.", + "dependencies": "base_bio_on", "longname": "Apply p_remin_scalef to particulate remin (and request it as a forcing)", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lsource_sink": { "datatype": "logical", "default_value": ".true.", "longname": "Control which portions of code are executed (useful for debugging)", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lvariable_PtoC": { "datatype": "logical", "default_value": ".true.", + "dependencies": "base_bio_on", "longname": "Control if PtoC ratios in autotrophs vary", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "o2_sf_o2_range_hi": { "datatype": "real", "default_value": 45.0, + "dependencies": "base_bio_on", "longname": "o2_scalefactor is applied to diss length scales for O2 less than this", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "mmol/m^3" }, "o2_sf_o2_range_lo": { "datatype": "real", "default_value": 5.0, + "dependencies": "base_bio_on", "longname": "o2_scalefactor is constant for O2 less than this", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "mmol/m^3" }, "o2_sf_val_lo_o2": { "datatype": "real", "default_value": 3.0, + "dependencies": "base_bio_on", "longname": "o2_scalefactor constant for O2 less than o2_sf_o2_range_lo", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "parm_CaCO3_diss": { "datatype": "real", "default_value": "500e2", + "dependencies": "base_bio_on", "longname": "Base CaCO3 dissolution length scale", - "subcategory": "4. general parameters (dissolution)", + "subcategory": "5. general parameters (dissolution)", "units": "cm" }, "parm_CaCO3_gamma": { "datatype": "real", "default_value": 0.1, + "dependencies": "base_bio_on", "longname": "CaCO3 gamma (fraction of production -> hard subclass)", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "parm_FeLig_scavenge_rate0": { "datatype": "real", "default_value": 1.3, + "dependencies": "base_bio_on", "longname": "Scavenging base rate for bound iron", - "subcategory": "4. general parameters (scavenging)", + "subcategory": "5. general parameters (scavenging)", "units": "cm^2/ng s/yr" }, "parm_Fe_bioavail": { "datatype": "real", "default_value": 1.0, + "dependencies": "base_bio_on", "longname": "Fraction of Fe flux that is bioavailable", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "parm_Fe_desorption_rate0": { "datatype": "real", "default_value": "1e-6", + "dependencies": "base_bio_on", "longname": "Desorption rate for scavenged Fe from particles", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "1/cm" }, "parm_Fe_scavenge_rate0": { "datatype": "real", "default_value": 24.0, + "dependencies": "base_bio_on", "longname": "Scavenging base rate for Fe", - "subcategory": "4. general parameters (scavenging)", + "subcategory": "5. general parameters (scavenging)", "units": "cm^2/ng s/yr" }, "parm_Lig_degrade_rate0": { "datatype": "real", "default_value": 9.4e-05, + "dependencies": "base_bio_on", "longname": "Fe-binding ligand bacterial degradation base rate coefficient", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "parm_Lig_scavenge_rate0": { "datatype": "real", "default_value": 0.015, + "dependencies": "base_bio_on", "longname": "Scavenging base rate for bound ligand", - "subcategory": "4. general parameters (scavenging)", + "subcategory": "5. general parameters (scavenging)", "units": "cm^2/ng s/yr" }, "parm_POC_diss": { "datatype": "real", "default_value": "100e2", + "dependencies": "base_bio_on", "longname": "Base POC dissolution length scale", - "subcategory": "4. general parameters (dissolution)", + "subcategory": "5. general parameters (dissolution)", "units": "cm" }, "parm_SiO2_diss": { "datatype": "real", "default_value": "650e2", + "dependencies": "base_bio_on", "longname": "Base SiO2 dissolution length scale", - "subcategory": "4. general parameters (dissolution)", + "subcategory": "5. general parameters (dissolution)", "units": "cm" }, "parm_SiO2_gamma": { "datatype": "real", "default_value": 0.1, + "dependencies": "base_bio_on", "longname": "SiO2 gamma (fraction of production -> hard subclass)", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "parm_f_prod_sp_CaCO3": { @@ -1273,29 +1398,33 @@ "GRID == \"CESM_x3\"": 0.075, "default": 0.07 }, + "dependencies": "base_bio_on", "longname": "Fraction of sp production as CaCO3 production", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "parm_hPOC_CaCO3_ratio": { "datatype": "real", "default_value": 0.05, + "dependencies": "base_bio_on", "longname": "hPOC to CaCO3 ratio", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "parm_hPOC_SiO2_ratio": { "datatype": "real", "default_value": 0.05, + "dependencies": "base_bio_on", "longname": "hPOC to SiO2 ratio", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "parm_hPOC_dust_ratio": { "datatype": "real", "default_value": 0.05, + "dependencies": "base_bio_on", "longname": "hPOC to dust ratio", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "parm_init_POC_bury_coeff": { @@ -1304,8 +1433,9 @@ "GRID == \"CESM_x3\"": 5.0, "default": 1.1 }, + "dependencies": "base_bio_on", "longname": "Initial scale factor for burial of POC, PON", - "subcategory": "4. general parameters (bury coeffs)", + "subcategory": "5. general parameters (bury coeffs)", "units": "unitless" }, "parm_init_POP_bury_coeff": { @@ -1314,8 +1444,9 @@ "GRID == \"CESM_x3\"": 5.0, "default": 1.1 }, + "dependencies": "base_bio_on", "longname": "Initial scale factor for burial of POP", - "subcategory": "4. general parameters (bury coeffs)", + "subcategory": "5. general parameters (bury coeffs)", "units": "unitless" }, "parm_init_bSi_bury_coeff": { @@ -1324,43 +1455,49 @@ "GRID == \"CESM_x3\"": 1.1, "default": 1.0 }, + "dependencies": "base_bio_on", "longname": "Initial scale factor for burial of bSi", - "subcategory": "4. general parameters (bury coeffs)", + "subcategory": "5. general parameters (bury coeffs)", "units": "unitless" }, "parm_kappa_nitrif_per_day": { "datatype": "real", "default_value": 0.06, + "dependencies": "base_bio_on", "longname": "Nitrification inverse time constant", - "subcategory": "4. general parameters (nitrification)", + "subcategory": "5. general parameters (nitrification)", "units": "1/day" }, "parm_labile_ratio": { "datatype": "real", "default_value": 0.94, + "dependencies": "base_bio_on", "longname": "Fraction of loss to DOC that routed directly to DIC", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "parm_nitrif_par_lim": { "datatype": "real", "default_value": 1.0, + "dependencies": "base_bio_on", "longname": "PAR limit for nitrification", - "subcategory": "4. general parameters (nitrification)", + "subcategory": "5. general parameters (nitrification)", "units": "W/m^2" }, "parm_o2_min": { "datatype": "real", "default_value": 5.0, + "dependencies": "base_bio_on", "longname": "Minimum O2 needed for production & consumption", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "nmol/cm^3" }, "parm_o2_min_delta": { "datatype": "real", "default_value": 5.0, + "dependencies": "base_bio_on", "longname": "Width of min O2 range", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "nmol/cm^3" }, "parm_scalelen_vals": { @@ -1380,8 +1517,9 @@ 5.3 ] }, + "dependencies": "base_bio_on", "longname": "Prescribed scalelen values", - "subcategory": "5. Scale lengths", + "subcategory": "6. Scale lengths", "units": "unitless" }, "parm_scalelen_z": { @@ -1393,8 +1531,9 @@ "500.0e2", "1000.0e2" ], + "dependencies": "base_bio_on", "longname": "Depths of prescribed scalelen values", - "subcategory": "5. Scale lengths", + "subcategory": "6. Scale lengths", "units": "cm" }, "parm_sed_denitrif_coeff": { @@ -1403,22 +1542,25 @@ "GRID == \"CESM_x3\"": 1.4, "default": 1 }, + "dependencies": "base_bio_on", "longname": "Global scaling factor for sed_denitrif", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "particulate_flux_ref_depth": { "datatype": "real", "default_value": 100.0, + "dependencies": "base_bio_on", "longname": "reference depth for particulate flux diagnostics", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "m" }, "zoo_mort2_exp": { "datatype": "real", "default_value": 2.0, + "dependencies": "base_bio_on", "longname": "Value of power loss exponent for zooplankton", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" } }, @@ -1430,8 +1572,9 @@ "default": "settings_file", "not ladjust_bury_coeff": "settings_file" }, + "dependencies": "base_bio_on", "longname": "Source of initial burial coefficient", - "subcategory": "3. config strings", + "subcategory": "4. config strings", "units": "unitless" } }, @@ -1462,11 +1605,38 @@ "ALK", "ALK_ALT_CO2" ], - "default": "" + "default": "", + "not base_bio_on": "" }, "longname": "Tracer names for tracers that are restored", "subcategory": "20. tracer restoring", "units": "non-numeric" } + }, + "tracer_modules": { + "abio_dic_on": { + "_append_to_config_keywords": true, + "datatype": "logical", + "default_value": ".false.", + "longname": "Control whether abiotic carbon tracer module is active", + "subcategory": "1. tracer modules", + "units": "unitless" + }, + "base_bio_on": { + "_append_to_config_keywords": true, + "datatype": "logical", + "default_value": ".true.", + "longname": "Control whether the base ecosystem tracer module is active", + "subcategory": "1. tracer modules", + "units": "unitless" + }, + "ciso_on": { + "_append_to_config_keywords": true, + "datatype": "logical", + "default_value": ".false.", + "longname": "Control whether CISO tracer module is active", + "subcategory": "1. tracer modules", + "units": "unitless" + } } } \ No newline at end of file diff --git a/defaults/json/settings_latest+cocco.json b/defaults/json/settings_latest+cocco.json index 18f900d2..e3935275 100644 --- a/defaults/json/settings_latest+cocco.json +++ b/defaults/json/settings_latest+cocco.json @@ -7,9 +7,10 @@ "PFT_defaults == \"CESM2+cocco\"": 4, "default": 1 }, + "dependencies": "base_bio_on", "longname": "Number of autotroph classes", "must set": "PFT_defaults == 'user-specified'", - "subcategory": "1. config PFTs", + "subcategory": "2. config PFTs", "units": "unitless" }, "max_grazer_prey_cnt": { @@ -18,8 +19,9 @@ "PFT_defaults == \"CESM2+cocco\"": 4, "default": 1 }, + "dependencies": "base_bio_on", "longname": "Number of grazer prey classes", - "subcategory": "1. config PFTs", + "subcategory": "2. config PFTs", "units": "unitless" }, "zooplankton_cnt": { @@ -28,8 +30,9 @@ "PFT_defaults == \"CESM2+cocco\"": 1, "default": 1 }, + "dependencies": "base_bio_on", "longname": "Number of zooplankton classes", - "subcategory": "1. config PFTs", + "subcategory": "2. config PFTs", "units": "unitless" } }, @@ -683,6 +686,7 @@ } }, "_order": [ + "tracer_modules", "general_parms", "general_parms2", "PFT_counts", @@ -705,6 +709,9 @@ "units": "mmol/m^3" }, "((autotroph_sname))C": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "((autotroph_lname)) Carbon", "units": "mmol/m^3" }, @@ -726,21 +733,29 @@ }, "((autotroph_sname))CaCO3": { "dependencies": { - "((autotroph_calcifier))": true + "((autotroph_calcifier))": true, + "base_bio_on": ".true." }, "long_name": "((autotroph_lname)) CaCO3", "units": "mmol/m^3" }, "((autotroph_sname))Chl": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "((autotroph_lname)) Chlorophyll", - "units": "mmol/m^3" + "units": "mg/m^3" }, "((autotroph_sname))Fe": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "((autotroph_lname)) Iron", "units": "mmol/m^3" }, "((autotroph_sname))P": { "dependencies": { + "base_bio_on": ".true.", "lvariable_PtoC": ".true." }, "long_name": "((autotroph_lname)) Phosphorus", @@ -748,20 +763,44 @@ }, "((autotroph_sname))Si": { "dependencies": { - "((autotroph_silicifier))": true + "((autotroph_silicifier))": true, + "base_bio_on": ".true." }, "long_name": "((autotroph_lname)) Silicon", "units": "mmol/m^3" }, "((zooplankton_sname))C": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "((zooplankton_lname)) Carbon", "units": "mmol/m^3" }, + "ABIO_DI14C": { + "dependencies": { + "abio_dic_on": ".true." + }, + "long_name": "Abiotic Dissolved Inorganic Carbon-14", + "units": "mmol/m^3" + }, + "ABIO_DIC": { + "dependencies": { + "abio_dic_on": ".true." + }, + "long_name": "Abiotic Dissolved Inorganic Carbon", + "units": "mmol/m^3" + }, "ALK": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Alkalinity", "units": "meq/m^3" }, "ALK_ALT_CO2": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Alkalinity, Alternative CO2", "units": "meq/m^3" }, @@ -780,10 +819,16 @@ "units": "mmol/m^3" }, "DIC": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Inorganic Carbon", "units": "mmol/m^3" }, "DIC_ALT_CO2": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Inorganic Carbon, Alternative CO2", "units": "mmol/m^3" }, @@ -791,65 +836,104 @@ "dependencies": { "ciso_on": ".true." }, - "long_name": "Dissolved Organic Carbon-13 (semi-labile+refractoy)", + "long_name": "Dissolved Organic Carbon-13 (semi-labile+refractory)", "units": "mmol/m^3" }, "DO14Ctot": { "dependencies": { "ciso_on": ".true." }, - "long_name": "Dissolved Organic Carbon-14 (semi-labile+refractoy)", + "long_name": "Dissolved Organic Carbon-14 (semi-labile+refractory)", "units": "mmol/m^3" }, "DOC": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Organic Carbon", "units": "mmol/m^3" }, "DOCr": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Refractory DOC", "units": "mmol/m^3" }, "DON": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Organic Nitrogen", "units": "mmol/m^3" }, "DONr": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Refractory DON", "units": "mmol/m^3" }, "DOP": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Organic Phosphorus", "units": "mmol/m^3" }, "DOPr": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Refractory DOP", "units": "mmol/m^3" }, "Fe": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Inorganic Iron", "units": "mmol/m^3" }, "Lig": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Iron Binding Ligand", "units": "mmol/m^3" }, "NH4": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Ammonia", "units": "mmol/m^3" }, "NO3": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Inorganic Nitrate", "units": "mmol/m^3" }, "O2": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Oxygen", "units": "mmol/m^3" }, "PO4": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Inorganic Phosphate", "units": "mmol/m^3" }, "SiO3": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Inorganic Silicate", "units": "mmol/m^3" }, @@ -872,8 +956,9 @@ "Jint_Ctot_thres_molpm2pyr": { "datatype": "real", "default_value": 1e-09, + "dependencies": "base_bio_on", "longname": "MARBL will abort if abs(Jint_Ctot) exceeds this threshold", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "mol m-2 yr-1" }, "PFT_defaults": { @@ -897,8 +982,9 @@ "_append_to_config_keywords": true, "datatype": "string", "default_value": "CESM2+cocco", + "dependencies": "base_bio_on", "longname": "Define how PFTs are initialized", - "subcategory": "1. config PFTs", + "subcategory": "2. config PFTs", "units": "unitless", "valid_values": [ "CESM2+cocco", @@ -908,71 +994,81 @@ "POM_bury_frac_max": { "datatype": "real", "default_value": 0.8, + "dependencies": "base_bio_on", "longname": "maximum bury fraction for POM", - "subcategory": "4. general parameters (bury coeffs)", + "subcategory": "5. general parameters (bury coeffs)", "units": "unitless" }, "PON_bury_coeff": { "datatype": "real", "default_value": 0.5, + "dependencies": "base_bio_on", "longname": "Scale factor for burial of PON", - "subcategory": "4. general parameters (bury coeffs)", + "subcategory": "5. general parameters (bury coeffs)", "units": "unitless" }, "QCaCO3_max": { "datatype": "real", "default_value": 2.0, + "dependencies": "base_bio_on", "longname": "Max CaCO3/C ratio for calcifiers", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "mmol CaCO3/mmol C" }, "auto_mort2_exp": { "datatype": "real", "default_value": 1.75, + "dependencies": "base_bio_on", "longname": "Value of power loss exponent for autotrophs", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "bSi_bury_frac_max": { "datatype": "real", "default_value": 1.0, + "dependencies": "base_bio_on", "longname": "maximum bury fraction for bSi", - "subcategory": "4. general parameters (bury coeffs)", + "subcategory": "5. general parameters (bury coeffs)", "units": "unitless" }, "bftt_dz_sum_thres": { "datatype": "real", "default_value": 1e-14, + "dependencies": "base_bio_on", "longname": "MARBL will abort if abs(1 - sum(bot_flux_to_tend)) exceeds this threshold", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "bury_coeff_rmean_timescale_years": { "datatype": "real", "default_value": 10, + "dependencies": "base_bio_on", "longname": "Running mean time scale for bury coefficients", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "years" }, "caco3_bury_thres_depth": { "datatype": "real", "default_value": "3000e2", + "dependencies": "base_bio_on", "longname": "Threshold depth for CaCO3 burial when opt = 'fixed_depth'", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "cm" }, "caco3_bury_thres_omega_calc": { "datatype": "real", "default_value": 1.0, + "dependencies": "base_bio_on", "longname": "omega calcite threshold for CaCO3 burial when opt = 'omega_calc'", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "caco3_bury_thres_opt": { "datatype": "string", "default_value": "omega_calc", + "dependencies": "base_bio_on", "longname": "Option of threshold of CaCO3 burial", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "non-numeric", "valid_values": [ "fixed_depth", @@ -982,100 +1078,119 @@ "ciso_fract_factors": { "datatype": "string", "default_value": "Laws", + "dependencies": "ciso_on", "longname": "Option for which biological fractionation calculation to use", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "non-numeric" }, "ciso_lsource_sink": { "datatype": "logical", "default_value": ".true.", + "dependencies": "ciso_on", "longname": "Control which portions of the carbon isotope code are executed (useful for debugging)", - "subcategory": "2. config flags", - "units": "unitless" - }, - "ciso_on": { - "datatype": "logical", - "default_value": ".false.", - "longname": "Control whether CISO tracer module is active", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "f_graze_CaCO3_remin": { "datatype": "real", "default_value": 0.7, + "dependencies": "base_bio_on", "longname": "Fraction of spCaCO3 grazing which is remineralized in zooplankton guts", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "gQ_Fe_kFe_thres": { "datatype": "real", "default_value": 10.0, + "dependencies": "base_bio_on", "longname": "Fe:kFe ratio threshold in uptake ratio computations", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "gQ_Si_kSi_thres": { "datatype": "real", "default_value": 5.0, + "dependencies": "base_bio_on", "longname": "Si:kSi ratio threshold in uptake ratio computations", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "gQsi_0": { "datatype": "real", "default_value": 0.137, + "dependencies": "base_bio_on", "longname": "initial Si/C ratio for growth", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "gQsi_max": { "datatype": "real", "default_value": 0.685, + "dependencies": "base_bio_on", "longname": "max Si/C ratio for growth", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "gQsi_min": { "datatype": "real", "default_value": 0.0457, + "dependencies": "base_bio_on", "longname": "min Si/C ratio for growth", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, + "labio_derivative_diags": { + "datatype": "logical", + "default_value": ".false.", + "dependencies": "abio_dic_on", + "longname": "Control whether derivative diagnostics are computed in abiotic surface flux (useful for Newton-Krylov)", + "subcategory": "3. config flags", + "units": "unitless" + }, "ladjust_bury_coeff": { "_append_to_config_keywords": true, "datatype": "logical", "default_value": ".false.", + "dependencies": "base_bio_on", "longname": "Control if bury coefficients are adjusted (rather than constant)", - "subcategory": "2. config flags", + "subcategory": "3. config flags", + "units": "unitless" + }, + "lcheck_forcing": { + "datatype": "logical", + "default_value": ".false.", + "longname": "Control whether consistency checks are performed on forcing input (useful for debugging)", + "subcategory": "3. config flags", "units": "unitless" }, "lcompute_nhx_surface_emis": { "datatype": "logical", "default_value": ".true.", + "dependencies": "base_bio_on", "longname": "Control if NHx emissions are computed", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lecovars_full_depth_tavg": { "datatype": "logical", "default_value": ".false.", "longname": "If .false., MARBL will recommend truncating the column for some diagnostics", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lflux_gas_co2": { "datatype": "logical", "default_value": ".true.", "longname": "Control which portions of code are executed (useful for debugging)", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lflux_gas_o2": { "datatype": "logical", "default_value": ".true.", + "dependencies": "base_bio_on", "longname": "Control which portions of code are executed (useful for debugging)", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lo2_consumption_scalef": { @@ -1084,127 +1199,144 @@ "GRID == \"CESM_x1\"": ".true.", "default": ".false." }, + "dependencies": "base_bio_on", "longname": "Apply o2_consumption_scalef to o2 consumption (and request it as a forcing)", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lp_remin_scalef": { "datatype": "logical", "default_value": ".false.", + "dependencies": "base_bio_on", "longname": "Apply p_remin_scalef to particulate remin (and request it as a forcing)", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lsource_sink": { "datatype": "logical", "default_value": ".true.", "longname": "Control which portions of code are executed (useful for debugging)", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lvariable_PtoC": { "datatype": "logical", "default_value": ".true.", + "dependencies": "base_bio_on", "longname": "Control if PtoC ratios in autotrophs vary", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "o2_sf_o2_range_hi": { "datatype": "real", "default_value": 45.0, + "dependencies": "base_bio_on", "longname": "o2_scalefactor is applied to diss length scales for O2 less than this", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "mmol/m^3" }, "o2_sf_o2_range_lo": { "datatype": "real", "default_value": 5.0, + "dependencies": "base_bio_on", "longname": "o2_scalefactor is constant for O2 less than this", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "mmol/m^3" }, "o2_sf_val_lo_o2": { "datatype": "real", "default_value": 3.0, + "dependencies": "base_bio_on", "longname": "o2_scalefactor constant for O2 less than o2_sf_o2_range_lo", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "parm_CaCO3_diss": { "datatype": "real", "default_value": "500e2", + "dependencies": "base_bio_on", "longname": "Base CaCO3 dissolution length scale", - "subcategory": "4. general parameters (dissolution)", + "subcategory": "5. general parameters (dissolution)", "units": "cm" }, "parm_CaCO3_gamma": { "datatype": "real", "default_value": 0.1, + "dependencies": "base_bio_on", "longname": "CaCO3 gamma (fraction of production -> hard subclass)", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "parm_FeLig_scavenge_rate0": { "datatype": "real", "default_value": 1.3, + "dependencies": "base_bio_on", "longname": "Scavenging base rate for bound iron", - "subcategory": "4. general parameters (scavenging)", + "subcategory": "5. general parameters (scavenging)", "units": "cm^2/ng s/yr" }, "parm_Fe_bioavail": { "datatype": "real", "default_value": 1.0, + "dependencies": "base_bio_on", "longname": "Fraction of Fe flux that is bioavailable", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "parm_Fe_desorption_rate0": { "datatype": "real", "default_value": "1e-6", + "dependencies": "base_bio_on", "longname": "Desorption rate for scavenged Fe from particles", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "1/cm" }, "parm_Fe_scavenge_rate0": { "datatype": "real", "default_value": 24.0, + "dependencies": "base_bio_on", "longname": "Scavenging base rate for Fe", - "subcategory": "4. general parameters (scavenging)", + "subcategory": "5. general parameters (scavenging)", "units": "cm^2/ng s/yr" }, "parm_Lig_degrade_rate0": { "datatype": "real", "default_value": 9.4e-05, + "dependencies": "base_bio_on", "longname": "Fe-binding ligand bacterial degradation base rate coefficient", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "parm_Lig_scavenge_rate0": { "datatype": "real", "default_value": 0.015, + "dependencies": "base_bio_on", "longname": "Scavenging base rate for bound ligand", - "subcategory": "4. general parameters (scavenging)", + "subcategory": "5. general parameters (scavenging)", "units": "cm^2/ng s/yr" }, "parm_POC_diss": { "datatype": "real", "default_value": "100e2", + "dependencies": "base_bio_on", "longname": "Base POC dissolution length scale", - "subcategory": "4. general parameters (dissolution)", + "subcategory": "5. general parameters (dissolution)", "units": "cm" }, "parm_SiO2_diss": { "datatype": "real", "default_value": "700e2", + "dependencies": "base_bio_on", "longname": "Base SiO2 dissolution length scale", - "subcategory": "4. general parameters (dissolution)", + "subcategory": "5. general parameters (dissolution)", "units": "cm" }, "parm_SiO2_gamma": { "datatype": "real", "default_value": 0.1, + "dependencies": "base_bio_on", "longname": "SiO2 gamma (fraction of production -> hard subclass)", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "parm_f_prod_sp_CaCO3": { @@ -1213,29 +1345,33 @@ "GRID == \"CESM_x3\"": 0.075, "default": 0.07 }, + "dependencies": "base_bio_on", "longname": "Fraction of sp production as CaCO3 production", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "parm_hPOC_CaCO3_ratio": { "datatype": "real", "default_value": 0.05, + "dependencies": "base_bio_on", "longname": "hPOC to CaCO3 ratio", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "parm_hPOC_SiO2_ratio": { "datatype": "real", "default_value": 0.05, + "dependencies": "base_bio_on", "longname": "hPOC to SiO2 ratio", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "parm_hPOC_dust_ratio": { "datatype": "real", "default_value": 0.05, + "dependencies": "base_bio_on", "longname": "hPOC to dust ratio", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "parm_init_POC_bury_coeff": { @@ -1244,8 +1380,9 @@ "GRID == \"CESM_x3\"": 5.0, "default": 1.1 }, + "dependencies": "base_bio_on", "longname": "Initial scale factor for burial of POC, PON", - "subcategory": "4. general parameters (bury coeffs)", + "subcategory": "5. general parameters (bury coeffs)", "units": "unitless" }, "parm_init_POP_bury_coeff": { @@ -1254,8 +1391,9 @@ "GRID == \"CESM_x3\"": 5.0, "default": 1.1 }, + "dependencies": "base_bio_on", "longname": "Initial scale factor for burial of POP", - "subcategory": "4. general parameters (bury coeffs)", + "subcategory": "5. general parameters (bury coeffs)", "units": "unitless" }, "parm_init_bSi_bury_coeff": { @@ -1264,43 +1402,49 @@ "GRID == \"CESM_x3\"": 1.1, "default": 1.0 }, + "dependencies": "base_bio_on", "longname": "Initial scale factor for burial of bSi", - "subcategory": "4. general parameters (bury coeffs)", + "subcategory": "5. general parameters (bury coeffs)", "units": "unitless" }, "parm_kappa_nitrif_per_day": { "datatype": "real", "default_value": 0.06, + "dependencies": "base_bio_on", "longname": "Nitrification inverse time constant", - "subcategory": "4. general parameters (nitrification)", + "subcategory": "5. general parameters (nitrification)", "units": "1/day" }, "parm_labile_ratio": { "datatype": "real", "default_value": 0.94, + "dependencies": "base_bio_on", "longname": "Fraction of loss to DOC that routed directly to DIC", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "parm_nitrif_par_lim": { "datatype": "real", "default_value": 1.0, + "dependencies": "base_bio_on", "longname": "PAR limit for nitrification", - "subcategory": "4. general parameters (nitrification)", + "subcategory": "5. general parameters (nitrification)", "units": "W/m^2" }, "parm_o2_min": { "datatype": "real", "default_value": 5.0, + "dependencies": "base_bio_on", "longname": "Minimum O2 needed for production & consumption", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "nmol/cm^3" }, "parm_o2_min_delta": { "datatype": "real", "default_value": 5.0, + "dependencies": "base_bio_on", "longname": "Width of min O2 range", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "nmol/cm^3" }, "parm_scalelen_vals": { @@ -1320,8 +1464,9 @@ 5.3 ] }, + "dependencies": "base_bio_on", "longname": "Prescribed scalelen values", - "subcategory": "5. Scale lengths", + "subcategory": "6. Scale lengths", "units": "unitless" }, "parm_scalelen_z": { @@ -1333,8 +1478,9 @@ "500.0e2", "2000.0e2" ], + "dependencies": "base_bio_on", "longname": "Depths of prescribed scalelen values", - "subcategory": "5. Scale lengths", + "subcategory": "6. Scale lengths", "units": "cm" }, "parm_sed_denitrif_coeff": { @@ -1343,22 +1489,25 @@ "GRID == \"CESM_x3\"": 1.4, "default": 1 }, + "dependencies": "base_bio_on", "longname": "Global scaling factor for sed_denitrif", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "particulate_flux_ref_depth": { "datatype": "real", "default_value": 100.0, + "dependencies": "base_bio_on", "longname": "reference depth for particulate flux diagnostics", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "m" }, "zoo_mort2_exp": { "datatype": "real", "default_value": 1.5, + "dependencies": "base_bio_on", "longname": "Value of power loss exponent for zooplankton", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" } }, @@ -1370,8 +1519,9 @@ "default": "settings_file", "not ladjust_bury_coeff": "settings_file" }, + "dependencies": "base_bio_on", "longname": "Source of initial burial coefficient", - "subcategory": "3. config strings", + "subcategory": "4. config strings", "units": "unitless" } }, @@ -1402,11 +1552,38 @@ "ALK", "ALK_ALT_CO2" ], - "default": "" + "default": "", + "not base_bio_on": "" }, "longname": "Tracer names for tracers that are restored", "subcategory": "20. tracer restoring", "units": "non-numeric" } + }, + "tracer_modules": { + "abio_dic_on": { + "_append_to_config_keywords": true, + "datatype": "logical", + "default_value": ".false.", + "longname": "Control whether abiotic carbon tracer module is active", + "subcategory": "1. tracer modules", + "units": "unitless" + }, + "base_bio_on": { + "_append_to_config_keywords": true, + "datatype": "logical", + "default_value": ".true.", + "longname": "Control whether the base ecosystem tracer module is active", + "subcategory": "1. tracer modules", + "units": "unitless" + }, + "ciso_on": { + "_append_to_config_keywords": true, + "datatype": "logical", + "default_value": ".false.", + "longname": "Control whether CISO tracer module is active", + "subcategory": "1. tracer modules", + "units": "unitless" + } } } \ No newline at end of file diff --git a/defaults/json/settings_latest.json b/defaults/json/settings_latest.json index 4794d1dd..cb09cf79 100644 --- a/defaults/json/settings_latest.json +++ b/defaults/json/settings_latest.json @@ -5,31 +5,37 @@ "datatype": "integer", "default_value": { "PFT_defaults == \"CESM2\"": 3, + "PFT_defaults == \"None\"": 0, "default": 1 }, + "dependencies": "base_bio_on", "longname": "Number of autotroph classes", "must set": "PFT_defaults == 'user-specified'", - "subcategory": "1. config PFTs", + "subcategory": "2. config PFTs", "units": "unitless" }, "max_grazer_prey_cnt": { "datatype": "integer", "default_value": { "PFT_defaults == \"CESM2\"": 3, + "PFT_defaults == \"None\"": 0, "default": 1 }, + "dependencies": "base_bio_on", "longname": "Number of grazer prey classes", - "subcategory": "1. config PFTs", + "subcategory": "2. config PFTs", "units": "unitless" }, "zooplankton_cnt": { "datatype": "integer", "default_value": { "PFT_defaults == \"CESM2\"": 1, + "PFT_defaults == \"None\"": 0, "default": 1 }, + "dependencies": "base_bio_on", "longname": "Number of zooplankton classes", - "subcategory": "1. config PFTs", + "subcategory": "2. config PFTs", "units": "unitless" } }, @@ -643,6 +649,7 @@ } }, "_order": [ + "tracer_modules", "general_parms", "general_parms2", "PFT_counts", @@ -665,6 +672,9 @@ "units": "mmol/m^3" }, "((autotroph_sname))C": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "((autotroph_lname)) Carbon", "units": "mmol/m^3" }, @@ -686,21 +696,29 @@ }, "((autotroph_sname))CaCO3": { "dependencies": { - "((autotroph_calcifier))": true + "((autotroph_calcifier))": true, + "base_bio_on": ".true." }, "long_name": "((autotroph_lname)) CaCO3", "units": "mmol/m^3" }, "((autotroph_sname))Chl": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "((autotroph_lname)) Chlorophyll", - "units": "mmol/m^3" + "units": "mg/m^3" }, "((autotroph_sname))Fe": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "((autotroph_lname)) Iron", "units": "mmol/m^3" }, "((autotroph_sname))P": { "dependencies": { + "base_bio_on": ".true.", "lvariable_PtoC": ".true." }, "long_name": "((autotroph_lname)) Phosphorus", @@ -708,20 +726,44 @@ }, "((autotroph_sname))Si": { "dependencies": { - "((autotroph_silicifier))": true + "((autotroph_silicifier))": true, + "base_bio_on": ".true." }, "long_name": "((autotroph_lname)) Silicon", "units": "mmol/m^3" }, "((zooplankton_sname))C": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "((zooplankton_lname)) Carbon", "units": "mmol/m^3" }, + "ABIO_DI14C": { + "dependencies": { + "abio_dic_on": ".true." + }, + "long_name": "Abiotic Dissolved Inorganic Carbon-14", + "units": "mmol/m^3" + }, + "ABIO_DIC": { + "dependencies": { + "abio_dic_on": ".true." + }, + "long_name": "Abiotic Dissolved Inorganic Carbon", + "units": "mmol/m^3" + }, "ALK": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Alkalinity", "units": "meq/m^3" }, "ALK_ALT_CO2": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Alkalinity, Alternative CO2", "units": "meq/m^3" }, @@ -740,10 +782,16 @@ "units": "mmol/m^3" }, "DIC": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Inorganic Carbon", "units": "mmol/m^3" }, "DIC_ALT_CO2": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Inorganic Carbon, Alternative CO2", "units": "mmol/m^3" }, @@ -751,65 +799,104 @@ "dependencies": { "ciso_on": ".true." }, - "long_name": "Dissolved Organic Carbon-13 (semi-labile+refractoy)", + "long_name": "Dissolved Organic Carbon-13 (semi-labile+refractory)", "units": "mmol/m^3" }, "DO14Ctot": { "dependencies": { "ciso_on": ".true." }, - "long_name": "Dissolved Organic Carbon-14 (semi-labile+refractoy)", + "long_name": "Dissolved Organic Carbon-14 (semi-labile+refractory)", "units": "mmol/m^3" }, "DOC": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Organic Carbon", "units": "mmol/m^3" }, "DOCr": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Refractory DOC", "units": "mmol/m^3" }, "DON": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Organic Nitrogen", "units": "mmol/m^3" }, "DONr": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Refractory DON", "units": "mmol/m^3" }, "DOP": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Organic Phosphorus", "units": "mmol/m^3" }, "DOPr": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Refractory DOP", "units": "mmol/m^3" }, "Fe": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Inorganic Iron", "units": "mmol/m^3" }, "Lig": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Iron Binding Ligand", "units": "mmol/m^3" }, "NH4": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Ammonia", "units": "mmol/m^3" }, "NO3": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Inorganic Nitrate", "units": "mmol/m^3" }, "O2": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Oxygen", "units": "mmol/m^3" }, "PO4": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Inorganic Phosphate", "units": "mmol/m^3" }, "SiO3": { + "dependencies": { + "base_bio_on": ".true." + }, "long_name": "Dissolved Inorganic Silicate", "units": "mmol/m^3" }, @@ -832,8 +919,9 @@ "Jint_Ctot_thres_molpm2pyr": { "datatype": "real", "default_value": 1e-09, + "dependencies": "base_bio_on", "longname": "MARBL will abort if abs(Jint_Ctot) exceeds this threshold", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "mol m-2 yr-1" }, "PFT_defaults": { @@ -854,83 +942,97 @@ }, "_append_to_config_keywords": true, "datatype": "string", - "default_value": "CESM2", + "default_value": { + "default": "CESM2" + }, + "dependencies": "base_bio_on", "longname": "Define how PFTs are initialized", - "subcategory": "1. config PFTs", + "subcategory": "2. config PFTs", "units": "unitless", "valid_values": [ "CESM2", + "None", "user-specified" ] }, "POM_bury_frac_max": { "datatype": "real", "default_value": 0.8, + "dependencies": "base_bio_on", "longname": "maximum bury fraction for POM", - "subcategory": "4. general parameters (bury coeffs)", + "subcategory": "5. general parameters (bury coeffs)", "units": "unitless" }, "PON_bury_coeff": { "datatype": "real", "default_value": 0.5, + "dependencies": "base_bio_on", "longname": "Scale factor for burial of PON", - "subcategory": "4. general parameters (bury coeffs)", + "subcategory": "5. general parameters (bury coeffs)", "units": "unitless" }, "QCaCO3_max": { "datatype": "real", "default_value": 0.4, + "dependencies": "base_bio_on", "longname": "Max CaCO3/C ratio for calcifiers", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "mmol CaCO3/mmol C" }, "auto_mort2_exp": { "datatype": "real", "default_value": 1.75, + "dependencies": "base_bio_on", "longname": "Value of power loss exponent for autotrophs", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "bSi_bury_frac_max": { "datatype": "real", "default_value": 1.0, + "dependencies": "base_bio_on", "longname": "maximum bury fraction for bSi", - "subcategory": "4. general parameters (bury coeffs)", + "subcategory": "5. general parameters (bury coeffs)", "units": "unitless" }, "bftt_dz_sum_thres": { "datatype": "real", "default_value": 1e-14, + "dependencies": "base_bio_on", "longname": "MARBL will abort if abs(1 - sum(bot_flux_to_tend)) exceeds this threshold", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "bury_coeff_rmean_timescale_years": { "datatype": "real", "default_value": 10, + "dependencies": "base_bio_on", "longname": "Running mean time scale for bury coefficients", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "years" }, "caco3_bury_thres_depth": { "datatype": "real", "default_value": "3000e2", + "dependencies": "base_bio_on", "longname": "Threshold depth for CaCO3 burial when opt = 'fixed_depth'", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "cm" }, "caco3_bury_thres_omega_calc": { "datatype": "real", "default_value": 1.0, + "dependencies": "base_bio_on", "longname": "omega calcite threshold for CaCO3 burial when opt = 'omega_calc'", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "caco3_bury_thres_opt": { "datatype": "string", "default_value": "omega_calc", + "dependencies": "base_bio_on", "longname": "Option of threshold of CaCO3 burial", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "non-numeric", "valid_values": [ "fixed_depth", @@ -940,107 +1042,119 @@ "ciso_fract_factors": { "datatype": "string", "default_value": "Laws", + "dependencies": "ciso_on", "longname": "Option for which biological fractionation calculation to use", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "non-numeric" }, "ciso_lsource_sink": { "datatype": "logical", "default_value": ".true.", + "dependencies": "ciso_on", "longname": "Control which portions of the carbon isotope code are executed (useful for debugging)", - "subcategory": "2. config flags", - "units": "unitless" - }, - "ciso_on": { - "datatype": "logical", - "default_value": ".false.", - "longname": "Control whether CISO tracer module is active", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "f_graze_CaCO3_remin": { "datatype": "real", "default_value": 0.33, + "dependencies": "base_bio_on", "longname": "Fraction of spCaCO3 grazing which is remineralized in zooplankton guts", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "gQ_Fe_kFe_thres": { "datatype": "real", "default_value": 10.0, + "dependencies": "base_bio_on", "longname": "Fe:kFe ratio threshold in uptake ratio computations", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "gQ_Si_kSi_thres": { "datatype": "real", "default_value": 5.0, + "dependencies": "base_bio_on", "longname": "Si:kSi ratio threshold in uptake ratio computations", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "gQsi_0": { "datatype": "real", "default_value": 0.137, + "dependencies": "base_bio_on", "longname": "initial Si/C ratio for growth", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "gQsi_max": { "datatype": "real", "default_value": 0.685, + "dependencies": "base_bio_on", "longname": "max Si/C ratio for growth", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "gQsi_min": { "datatype": "real", "default_value": 0.0457, + "dependencies": "base_bio_on", "longname": "min Si/C ratio for growth", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, + "labio_derivative_diags": { + "datatype": "logical", + "default_value": ".false.", + "dependencies": "abio_dic_on", + "longname": "Control whether derivative diagnostics are computed in abiotic surface flux (useful for Newton-Krylov)", + "subcategory": "3. config flags", + "units": "unitless" + }, "ladjust_bury_coeff": { "_append_to_config_keywords": true, "datatype": "logical", "default_value": ".false.", + "dependencies": "base_bio_on", "longname": "Control if bury coefficients are adjusted (rather than constant)", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lcheck_forcing": { "datatype": "logical", "default_value": ".false.", "longname": "Control whether consistency checks are performed on forcing input (useful for debugging)", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lcompute_nhx_surface_emis": { "datatype": "logical", "default_value": ".true.", + "dependencies": "base_bio_on", "longname": "Control if NHx emissions are computed", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lecovars_full_depth_tavg": { "datatype": "logical", "default_value": ".false.", "longname": "If .false., MARBL will recommend truncating the column for some diagnostics", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lflux_gas_co2": { "datatype": "logical", "default_value": ".true.", "longname": "Control which portions of code are executed (useful for debugging)", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lflux_gas_o2": { "datatype": "logical", "default_value": ".true.", + "dependencies": "base_bio_on", "longname": "Control which portions of code are executed (useful for debugging)", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lo2_consumption_scalef": { @@ -1049,127 +1163,144 @@ "GRID == \"CESM_x1\"": ".true.", "default": ".false." }, + "dependencies": "base_bio_on", "longname": "Apply o2_consumption_scalef to o2 consumption (and request it as a forcing)", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lp_remin_scalef": { "datatype": "logical", "default_value": ".false.", + "dependencies": "base_bio_on", "longname": "Apply p_remin_scalef to particulate remin (and request it as a forcing)", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lsource_sink": { "datatype": "logical", "default_value": ".true.", "longname": "Control which portions of code are executed (useful for debugging)", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "lvariable_PtoC": { "datatype": "logical", "default_value": ".true.", + "dependencies": "base_bio_on", "longname": "Control if PtoC ratios in autotrophs vary", - "subcategory": "2. config flags", + "subcategory": "3. config flags", "units": "unitless" }, "o2_sf_o2_range_hi": { "datatype": "real", "default_value": 45.0, + "dependencies": "base_bio_on", "longname": "o2_scalefactor is applied to diss length scales for O2 less than this", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "mmol/m^3" }, "o2_sf_o2_range_lo": { "datatype": "real", "default_value": 5.0, + "dependencies": "base_bio_on", "longname": "o2_scalefactor is constant for O2 less than this", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "mmol/m^3" }, "o2_sf_val_lo_o2": { "datatype": "real", "default_value": 3.0, + "dependencies": "base_bio_on", "longname": "o2_scalefactor constant for O2 less than o2_sf_o2_range_lo", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "parm_CaCO3_diss": { "datatype": "real", "default_value": "500e2", + "dependencies": "base_bio_on", "longname": "Base CaCO3 dissolution length scale", - "subcategory": "4. general parameters (dissolution)", + "subcategory": "5. general parameters (dissolution)", "units": "cm" }, "parm_CaCO3_gamma": { "datatype": "real", "default_value": 0.1, + "dependencies": "base_bio_on", "longname": "CaCO3 gamma (fraction of production -> hard subclass)", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "parm_FeLig_scavenge_rate0": { "datatype": "real", "default_value": 1.3, + "dependencies": "base_bio_on", "longname": "Scavenging base rate for bound iron", - "subcategory": "4. general parameters (scavenging)", + "subcategory": "5. general parameters (scavenging)", "units": "cm^2/ng s/yr" }, "parm_Fe_bioavail": { "datatype": "real", "default_value": 1.0, + "dependencies": "base_bio_on", "longname": "Fraction of Fe flux that is bioavailable", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "parm_Fe_desorption_rate0": { "datatype": "real", "default_value": "1e-6", + "dependencies": "base_bio_on", "longname": "Desorption rate for scavenged Fe from particles", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "1/cm" }, "parm_Fe_scavenge_rate0": { "datatype": "real", "default_value": 24.0, + "dependencies": "base_bio_on", "longname": "Scavenging base rate for Fe", - "subcategory": "4. general parameters (scavenging)", + "subcategory": "5. general parameters (scavenging)", "units": "cm^2/ng s/yr" }, "parm_Lig_degrade_rate0": { "datatype": "real", "default_value": 9.4e-05, + "dependencies": "base_bio_on", "longname": "Fe-binding ligand bacterial degradation base rate coefficient", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "parm_Lig_scavenge_rate0": { "datatype": "real", "default_value": 0.015, + "dependencies": "base_bio_on", "longname": "Scavenging base rate for bound ligand", - "subcategory": "4. general parameters (scavenging)", + "subcategory": "5. general parameters (scavenging)", "units": "cm^2/ng s/yr" }, "parm_POC_diss": { "datatype": "real", "default_value": "100e2", + "dependencies": "base_bio_on", "longname": "Base POC dissolution length scale", - "subcategory": "4. general parameters (dissolution)", + "subcategory": "5. general parameters (dissolution)", "units": "cm" }, "parm_SiO2_diss": { "datatype": "real", "default_value": "650e2", + "dependencies": "base_bio_on", "longname": "Base SiO2 dissolution length scale", - "subcategory": "4. general parameters (dissolution)", + "subcategory": "5. general parameters (dissolution)", "units": "cm" }, "parm_SiO2_gamma": { "datatype": "real", "default_value": 0.1, + "dependencies": "base_bio_on", "longname": "SiO2 gamma (fraction of production -> hard subclass)", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "parm_f_prod_sp_CaCO3": { @@ -1178,29 +1309,33 @@ "GRID == \"CESM_x3\"": 0.075, "default": 0.07 }, + "dependencies": "base_bio_on", "longname": "Fraction of sp production as CaCO3 production", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "parm_hPOC_CaCO3_ratio": { "datatype": "real", "default_value": 0.05, + "dependencies": "base_bio_on", "longname": "hPOC to CaCO3 ratio", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "parm_hPOC_SiO2_ratio": { "datatype": "real", "default_value": 0.05, + "dependencies": "base_bio_on", "longname": "hPOC to SiO2 ratio", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "parm_hPOC_dust_ratio": { "datatype": "real", "default_value": 0.05, + "dependencies": "base_bio_on", "longname": "hPOC to dust ratio", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": 1 }, "parm_init_POC_bury_coeff": { @@ -1209,8 +1344,9 @@ "GRID == \"CESM_x3\"": 5.0, "default": 1.1 }, + "dependencies": "base_bio_on", "longname": "Initial scale factor for burial of POC, PON", - "subcategory": "4. general parameters (bury coeffs)", + "subcategory": "5. general parameters (bury coeffs)", "units": "unitless" }, "parm_init_POP_bury_coeff": { @@ -1219,8 +1355,9 @@ "GRID == \"CESM_x3\"": 5.0, "default": 1.1 }, + "dependencies": "base_bio_on", "longname": "Initial scale factor for burial of POP", - "subcategory": "4. general parameters (bury coeffs)", + "subcategory": "5. general parameters (bury coeffs)", "units": "unitless" }, "parm_init_bSi_bury_coeff": { @@ -1229,43 +1366,49 @@ "GRID == \"CESM_x3\"": 1.1, "default": 1.0 }, + "dependencies": "base_bio_on", "longname": "Initial scale factor for burial of bSi", - "subcategory": "4. general parameters (bury coeffs)", + "subcategory": "5. general parameters (bury coeffs)", "units": "unitless" }, "parm_kappa_nitrif_per_day": { "datatype": "real", "default_value": 0.06, + "dependencies": "base_bio_on", "longname": "Nitrification inverse time constant", - "subcategory": "4. general parameters (nitrification)", + "subcategory": "5. general parameters (nitrification)", "units": "1/day" }, "parm_labile_ratio": { "datatype": "real", "default_value": 0.94, + "dependencies": "base_bio_on", "longname": "Fraction of loss to DOC that routed directly to DIC", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "parm_nitrif_par_lim": { "datatype": "real", "default_value": 1.0, + "dependencies": "base_bio_on", "longname": "PAR limit for nitrification", - "subcategory": "4. general parameters (nitrification)", + "subcategory": "5. general parameters (nitrification)", "units": "W/m^2" }, "parm_o2_min": { "datatype": "real", "default_value": 5.0, + "dependencies": "base_bio_on", "longname": "Minimum O2 needed for production & consumption", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "nmol/cm^3" }, "parm_o2_min_delta": { "datatype": "real", "default_value": 5.0, + "dependencies": "base_bio_on", "longname": "Width of min O2 range", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "nmol/cm^3" }, "parm_scalelen_vals": { @@ -1285,8 +1428,9 @@ 5.3 ] }, + "dependencies": "base_bio_on", "longname": "Prescribed scalelen values", - "subcategory": "5. Scale lengths", + "subcategory": "6. Scale lengths", "units": "unitless" }, "parm_scalelen_z": { @@ -1298,8 +1442,9 @@ "500.0e2", "1000.0e2" ], + "dependencies": "base_bio_on", "longname": "Depths of prescribed scalelen values", - "subcategory": "5. Scale lengths", + "subcategory": "6. Scale lengths", "units": "cm" }, "parm_sed_denitrif_coeff": { @@ -1308,22 +1453,25 @@ "GRID == \"CESM_x3\"": 1.4, "default": 1 }, + "dependencies": "base_bio_on", "longname": "Global scaling factor for sed_denitrif", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" }, "particulate_flux_ref_depth": { "datatype": "real", "default_value": 100.0, + "dependencies": "base_bio_on", "longname": "reference depth for particulate flux diagnostics", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "m" }, "zoo_mort2_exp": { "datatype": "real", "default_value": 1.5, + "dependencies": "base_bio_on", "longname": "Value of power loss exponent for zooplankton", - "subcategory": "4. general parameters", + "subcategory": "5. general parameters", "units": "unitless" } }, @@ -1335,8 +1483,9 @@ "default": "settings_file", "not ladjust_bury_coeff": "settings_file" }, + "dependencies": "base_bio_on", "longname": "Source of initial burial coefficient", - "subcategory": "3. config strings", + "subcategory": "4. config strings", "units": "unitless" } }, @@ -1367,11 +1516,38 @@ "ALK", "ALK_ALT_CO2" ], - "default": "" + "default": "", + "not base_bio_on": "" }, "longname": "Tracer names for tracers that are restored", "subcategory": "20. tracer restoring", "units": "non-numeric" } + }, + "tracer_modules": { + "abio_dic_on": { + "_append_to_config_keywords": true, + "datatype": "logical", + "default_value": ".false.", + "longname": "Control whether abiotic carbon tracer module is active", + "subcategory": "1. tracer modules", + "units": "unitless" + }, + "base_bio_on": { + "_append_to_config_keywords": true, + "datatype": "logical", + "default_value": ".true.", + "longname": "Control whether the base ecosystem tracer module is active", + "subcategory": "1. tracer modules", + "units": "unitless" + }, + "ciso_on": { + "_append_to_config_keywords": true, + "datatype": "logical", + "default_value": ".false.", + "longname": "Control whether CISO tracer module is active", + "subcategory": "1. tracer modules", + "units": "unitless" + } } } \ No newline at end of file diff --git a/defaults/settings_cesm2.0.yaml b/defaults/settings_cesm2.0.yaml index 070428db..d7c4c826 100644 --- a/defaults/settings_cesm2.0.yaml +++ b/defaults/settings_cesm2.0.yaml @@ -41,6 +41,7 @@ # Order in which the categories are parsed _order : + - tracer_modules - general_parms - general_parms2 - PFT_counts @@ -51,56 +52,101 @@ _order : _tracer_list : # Non-living tracers PO4 : + dependencies : + base_bio_on : .true. long_name : Dissolved Inorganic Phosphate units : mmol/m^3 NO3 : + dependencies : + base_bio_on : .true. long_name : Dissolved Inorganic Nitrate units : mmol/m^3 SiO3 : + dependencies : + base_bio_on : .true. long_name : Dissolved Inorganic Silicate units : mmol/m^3 NH4 : + dependencies : + base_bio_on : .true. long_name : Dissolved Ammonia units : mmol/m^3 Fe : + dependencies : + base_bio_on : .true. long_name : Dissolved Inorganic Iron units : mmol/m^3 Lig : + dependencies : + base_bio_on : .true. long_name : Iron Binding Ligand units : mmol/m^3 O2 : + dependencies : + base_bio_on : .true. long_name : Dissolved Oxygen units : mmol/m^3 DIC : + dependencies : + base_bio_on : .true. long_name : Dissolved Inorganic Carbon units : mmol/m^3 DIC_ALT_CO2 : + dependencies : + base_bio_on : .true. long_name : Dissolved Inorganic Carbon, Alternative CO2 units : mmol/m^3 ALK : + dependencies : + base_bio_on : .true. long_name : Alkalinity units : meq/m^3 ALK_ALT_CO2 : + dependencies : + base_bio_on : .true. long_name : Alkalinity, Alternative CO2 units : meq/m^3 DOC : + dependencies : + base_bio_on : .true. long_name : Dissolved Organic Carbon units : mmol/m^3 DON : + dependencies : + base_bio_on : .true. long_name : Dissolved Organic Nitrogen units : mmol/m^3 DOP : + dependencies : + base_bio_on : .true. long_name : Dissolved Organic Phosphorus units : mmol/m^3 DOPr : + dependencies : + base_bio_on : .true. long_name : Refractory DOP units : mmol/m^3 DONr : + dependencies : + base_bio_on : .true. long_name : Refractory DON units : mmol/m^3 DOCr : + dependencies : + base_bio_on : .true. long_name : Refractory DOC units : mmol/m^3 + # Non-living (abiotic only) + ABIO_DIC : + dependencies : + abio_dic_on : .true. + long_name : Abiotic Dissolved Inorganic Carbon + units : mmol/m^3 + ABIO_DI14C : + dependencies : + abio_dic_on : .true. + long_name : Abiotic Dissolved Inorganic Carbon-14 + units : mmol/m^3 # Non-living (ciso only) DI13C : dependencies : @@ -110,7 +156,7 @@ _tracer_list : DO13Ctot : dependencies : ciso_on : .true. - long_name : Dissolved Organic Carbon-13 (semi-labile+refractoy) + long_name : Dissolved Organic Carbon-13 (semi-labile+refractory) units : mmol/m^3 DI14C : dependencies : @@ -120,31 +166,40 @@ _tracer_list : DO14Ctot : dependencies : ciso_on : .true. - long_name : Dissolved Organic Carbon-14 (semi-labile+refractoy) + long_name : Dissolved Organic Carbon-14 (semi-labile+refractory) units : mmol/m^3 # Per-autotroph tracers ((autotroph_sname))Chl : + dependencies : + base_bio_on : .true. long_name : ((autotroph_lname)) Chlorophyll - units : mmol/m^3 + units : mg/m^3 ((autotroph_sname))C : + dependencies : + base_bio_on : .true. long_name : ((autotroph_lname)) Carbon units : mmol/m^3 ((autotroph_sname))Fe : + dependencies : + base_bio_on : .true. long_name : ((autotroph_lname)) Iron units : mmol/m^3 ((autotroph_sname))Si : dependencies : + base_bio_on : .true. ((autotroph_silicifier)) : True long_name : ((autotroph_lname)) Silicon units : mmol/m^3 ((autotroph_sname))CaCO3 : dependencies : + base_bio_on : .true. ((autotroph_calcifier)) : True long_name : ((autotroph_lname)) CaCO3 units : mmol/m^3 ((autotroph_sname))P : dependencies : + base_bio_on : .true. lvariable_PtoC : .true. long_name : ((autotroph_lname)) Phosphorus units : mmol/m^3 @@ -174,6 +229,8 @@ _tracer_list : # Per-zooplankton tracers ((zooplankton_sname))C : + dependencies : + base_bio_on : .true. long_name : ((zooplankton_lname)) Carbon units : mmol/m^3 # Total zooplankton tracers (ciso only) @@ -188,14 +245,42 @@ _tracer_list : long_name : Zooplankton Carbon-14 (sum over all zooplankton) units : mmol/m^3 +################################################################################ +# Category 0: Tracer Modules # +################################################################################ + +tracer_modules : + base_bio_on : + longname : Control whether the base ecosystem tracer module is active + subcategory : 1. tracer modules + units : unitless + datatype : logical + default_value : .true. + _append_to_config_keywords : true + abio_dic_on : + longname : Control whether abiotic carbon tracer module is active + subcategory : 1. tracer modules + units : unitless + datatype : logical + default_value : .false. + _append_to_config_keywords : true + ciso_on : + longname : Control whether CISO tracer module is active + subcategory : 1. tracer modules + units : unitless + datatype : logical + default_value : .false. + _append_to_config_keywords : true + ################################################################################ # Category 1: General Parameters # ################################################################################ general_parms : PFT_defaults : + dependencies : base_bio_on longname : Define how PFTs are initialized - subcategory : 1. config PFTs + subcategory : 2. config PFTs units : unitless datatype : string default_value : CESM2 @@ -214,308 +299,353 @@ general_parms : - diat_zoo - diaz_zoo _append_to_config_keywords : true - ciso_on : - longname : Control whether CISO tracer module is active - subcategory : 2. config flags - units : unitless - datatype : logical - default_value : .false. lsource_sink : longname : Control which portions of code are executed (useful for debugging) - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .true. ciso_lsource_sink : + dependencies : ciso_on longname : Control which portions of the carbon isotope code are executed (useful for debugging) - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .true. lcheck_forcing : longname : Control whether consistency checks are performed on forcing input (useful for debugging) - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .false. lecovars_full_depth_tavg : longname : If .false., MARBL will recommend truncating the column for some diagnostics - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .false. lflux_gas_o2 : + dependencies : base_bio_on longname : Control which portions of code are executed (useful for debugging) - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .true. lflux_gas_co2 : longname : Control which portions of code are executed (useful for debugging) - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .true. lcompute_nhx_surface_emis : + dependencies : base_bio_on longname : Control if NHx emissions are computed - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .true. lvariable_PtoC : + dependencies : base_bio_on longname : Control if PtoC ratios in autotrophs vary - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .true. ladjust_bury_coeff : + dependencies : base_bio_on longname : Control if bury coefficients are adjusted (rather than constant) - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .false. _append_to_config_keywords : true lo2_consumption_scalef : + dependencies : base_bio_on longname : Apply o2_consumption_scalef to o2 consumption (and request it as a forcing) - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .false. lp_remin_scalef : + dependencies : base_bio_on longname : Apply p_remin_scalef to particulate remin (and request it as a forcing) - subcategory : 2. config flags + subcategory : 3. config flags + units : unitless + datatype : logical + default_value : .false. + labio_derivative_diags : + dependencies : abio_dic_on + longname : Control whether derivative diagnostics are computed in abiotic surface flux (useful for Newton-Krylov) + subcategory : 3. config flags units : unitless datatype : logical default_value : .false. bftt_dz_sum_thres: + dependencies : base_bio_on longname : MARBL will abort if abs(1 - sum(bot_flux_to_tend)) exceeds this threshold - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : 1.0e-14 Jint_Ctot_thres_molpm2pyr : + dependencies : base_bio_on longname : MARBL will abort if abs(Jint_Ctot) exceeds this threshold - subcategory : 4. general parameters + subcategory : 5. general parameters units : mol m-2 yr-1 datatype : real default_value : 1.0e-9 gQsi_0 : + dependencies : base_bio_on longname : initial Si/C ratio for growth - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.137 gQsi_max : + dependencies : base_bio_on longname : max Si/C ratio for growth - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.685 gQsi_min : + dependencies : base_bio_on longname : min Si/C ratio for growth - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.0457 gQ_Fe_kFe_thres : + dependencies : base_bio_on longname : Fe:kFe ratio threshold in uptake ratio computations - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 10.0 gQ_Si_kSi_thres : + dependencies : base_bio_on longname : Si:kSi ratio threshold in uptake ratio computations - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 5.0 parm_Fe_bioavail : + dependencies : base_bio_on longname : Fraction of Fe flux that is bioavailable - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : 1.0 particulate_flux_ref_depth : + dependencies : base_bio_on longname : reference depth for particulate flux diagnostics - subcategory : 4. general parameters + subcategory : 5. general parameters units : m datatype : real default_value : 100.0 parm_o2_min : + dependencies : base_bio_on longname : Minimum O2 needed for production & consumption - subcategory : 4. general parameters + subcategory : 5. general parameters units : nmol/cm^3 datatype : real default_value : 5.0 parm_o2_min_delta : + dependencies : base_bio_on longname : Width of min O2 range - subcategory : 4. general parameters + subcategory : 5. general parameters units : nmol/cm^3 datatype : real default_value : 5.0 parm_kappa_nitrif_per_day : + dependencies : base_bio_on longname : Nitrification inverse time constant - subcategory : 4. general parameters (nitrification) + subcategory : 5. general parameters (nitrification) units : 1/day datatype : real default_value : 0.06 parm_nitrif_par_lim : + dependencies : base_bio_on longname : PAR limit for nitrification - subcategory : 4. general parameters (nitrification) + subcategory : 5. general parameters (nitrification) units : W/m^2 datatype : real default_value : 1.0 parm_labile_ratio : + dependencies : base_bio_on longname : Fraction of loss to DOC that routed directly to DIC - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : 0.94 parm_init_POC_bury_coeff : + dependencies : base_bio_on longname : Initial scale factor for burial of POC, PON - subcategory : 4. general parameters (bury coeffs) + subcategory : 5. general parameters (bury coeffs) units : unitless datatype : real default_value : # default value is resolution dependent! default : 1.1 GRID == "CESM_x3" : 5.0 parm_init_POP_bury_coeff : + dependencies : base_bio_on longname : Initial scale factor for burial of POP - subcategory : 4. general parameters (bury coeffs) + subcategory : 5. general parameters (bury coeffs) units : unitless datatype : real default_value : # default value is resolution dependent! default : 1.1 GRID == "CESM_x3" : 5.0 parm_init_bSi_bury_coeff : + dependencies : base_bio_on longname : Initial scale factor for burial of bSi - subcategory : 4. general parameters (bury coeffs) + subcategory : 5. general parameters (bury coeffs) units : unitless datatype : real default_value : # default value is resolution dependent! default : 1.0 GRID == "CESM_x3" : 1.1 parm_Fe_scavenge_rate0 : + dependencies : base_bio_on longname : Scavenging base rate for Fe - subcategory : 4. general parameters (scavenging) + subcategory : 5. general parameters (scavenging) units : cm^2/ng s/yr datatype : real default_value : 18.0 parm_Lig_scavenge_rate0 : + dependencies : base_bio_on longname : Scavenging base rate for bound ligand - subcategory : 4. general parameters (scavenging) + subcategory : 5. general parameters (scavenging) units : cm^2/ng s/yr datatype : real default_value : 0.015 parm_FeLig_scavenge_rate0 : + dependencies : base_bio_on longname : Scavenging base rate for bound iron - subcategory : 4. general parameters (scavenging) + subcategory : 5. general parameters (scavenging) units : cm^2/ng s/yr datatype : real default_value : 1.4 parm_Lig_degrade_rate0 : + dependencies : base_bio_on longname : Fe-binding ligand bacterial degradation base rate coefficient - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : 0.000094 parm_Fe_desorption_rate0 : + dependencies : base_bio_on longname : Desorption rate for scavenged Fe from particles - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1/cm datatype : real default_value : 1e-6 parm_f_prod_sp_CaCO3 : + dependencies : base_bio_on longname : Fraction of sp production as CaCO3 production - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : # default value is resolution dependent! default : 0.07 GRID == "CESM_x3" : 0.075 parm_POC_diss : + dependencies : base_bio_on longname : Base POC dissolution length scale - subcategory : 4. general parameters (dissolution) + subcategory : 5. general parameters (dissolution) units : cm datatype : real default_value : 100e2 parm_SiO2_diss : + dependencies : base_bio_on longname : Base SiO2 dissolution length scale - subcategory : 4. general parameters (dissolution) + subcategory : 5. general parameters (dissolution) units : cm datatype : real default_value : 770e2 parm_SiO2_gamma : + dependencies : base_bio_on longname : SiO2 gamma (fraction of production -> hard subclass) - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.1 parm_hPOC_SiO2_ratio : + dependencies : base_bio_on longname : hPOC to SiO2 ratio - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.05 parm_CaCO3_diss : + dependencies : base_bio_on longname : Base CaCO3 dissolution length scale - subcategory : 4. general parameters (dissolution) + subcategory : 5. general parameters (dissolution) units : cm datatype : real default_value : 500e2 parm_CaCO3_gamma : + dependencies : base_bio_on longname : CaCO3 gamma (fraction of production -> hard subclass) - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.1 parm_hPOC_CaCO3_ratio : + dependencies : base_bio_on longname : hPOC to CaCO3 ratio - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.05 parm_hPOC_dust_ratio : + dependencies : base_bio_on longname : hPOC to dust ratio - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.05 o2_sf_o2_range_hi : + dependencies : base_bio_on longname : o2_scalefactor is applied to diss length scales for O2 less than this - subcategory : 4. general parameters + subcategory : 5. general parameters units : mmol/m^3 datatype : real default_value : 45.0 o2_sf_o2_range_lo : + dependencies : base_bio_on longname : o2_scalefactor is constant for O2 less than this - subcategory : 4. general parameters + subcategory : 5. general parameters units : mmol/m^3 datatype : real default_value : 5.0 o2_sf_val_lo_o2 : + dependencies : base_bio_on longname : o2_scalefactor constant for O2 less than o2_sf_o2_range_lo - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 3.0 parm_sed_denitrif_coeff : + dependencies : base_bio_on longname : Global scaling factor for sed_denitrif - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : default : 1 GRID == "CESM_x3" : 1.4 bury_coeff_rmean_timescale_years : + dependencies : base_bio_on longname : Running mean time scale for bury coefficients - subcategory : 4. general parameters + subcategory : 5. general parameters units : years datatype : real default_value : 10 parm_scalelen_z : + dependencies : base_bio_on longname : Depths of prescribed scalelen values - subcategory : 5. Scale lengths + subcategory : 6. Scale lengths units : cm datatype : real _array_shape : 4 @@ -525,8 +655,9 @@ general_parms : - 500.0e2 - 1000.0e2 parm_scalelen_vals : + dependencies : base_bio_on longname : Prescribed scalelen values - subcategory : 5. Scale lengths + subcategory : 6. Scale lengths units : unitless datatype : real _array_shape : 4 @@ -542,8 +673,9 @@ general_parms : - 4.2 - 4.4 caco3_bury_thres_opt : + dependencies : base_bio_on longname : Option of threshold of CaCO3 burial - subcategory : 4. general parameters + subcategory : 5. general parameters units : non-numeric datatype : string default_value : omega_calc @@ -551,75 +683,85 @@ general_parms : - fixed_depth - omega_calc caco3_bury_thres_depth : + dependencies : base_bio_on longname : Threshold depth for CaCO3 burial when opt = 'fixed_depth' - subcategory : 4. general parameters + subcategory : 5. general parameters units : cm datatype : real default_value : 3000e2 caco3_bury_thres_omega_calc : + dependencies : base_bio_on longname : omega calcite threshold for CaCO3 burial when opt = 'omega_calc' - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 1.0 PON_bury_coeff : + dependencies : base_bio_on longname : Scale factor for burial of PON - subcategory : 4. general parameters (bury coeffs) + subcategory : 5. general parameters (bury coeffs) units : unitless datatype : real default_value : 0.5 POM_bury_frac_max : + dependencies : base_bio_on longname : maximum bury fraction for POM - subcategory : 4. general parameters (bury coeffs) + subcategory : 5. general parameters (bury coeffs) units : unitless datatype : real default_value : 0.8 bSi_bury_frac_max : + dependencies : base_bio_on longname : maximum bury fraction for bSi - subcategory : 4. general parameters (bury coeffs) + subcategory : 5. general parameters (bury coeffs) units : unitless datatype : real default_value : 1.0 ciso_fract_factors : + dependencies : ciso_on longname : Option for which biological fractionation calculation to use - subcategory : 4. general parameters + subcategory : 5. general parameters units : non-numeric datatype : string default_value : Laws auto_mort2_exp : + dependencies : base_bio_on longname : Value of power loss exponent for autotrophs - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : 1.75 zoo_mort2_exp : + dependencies : base_bio_on longname : Value of power loss exponent for zooplankton - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : 1.5 QCaCO3_max : + dependencies : base_bio_on longname : Max CaCO3/C ratio for calcifiers - subcategory : 4. general parameters + subcategory : 5. general parameters units : mmol CaCO3/mmol C datatype : real default_value : 0.40 f_graze_CaCO3_remin : + dependencies : base_bio_on longname : Fraction of spCaCO3 grazing which is remineralized in zooplankton guts - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : 0.33 - ################################################################################ # Category 1.5: General Parameters (cont) # ################################################################################ general_parms2 : init_bury_coeff_opt : + dependencies : base_bio_on longname : Source of initial burial coefficient - subcategory : 3. config strings + subcategory : 4. config strings units : unitless datatype : string default_value : @@ -639,8 +781,9 @@ general_parms2 : PFT_counts : autotroph_cnt : + dependencies : base_bio_on longname : Number of autotroph classes - subcategory : 1. config PFTs + subcategory : 2. config PFTs units : unitless datatype : integer default_value : @@ -649,16 +792,18 @@ PFT_counts : cannot change : PFT_defaults == 'CESM2' must set : PFT_defaults == 'user-specified' zooplankton_cnt : + dependencies : base_bio_on longname : Number of zooplankton classes - subcategory : 1. config PFTs + subcategory : 2. config PFTs units : unitless datatype : integer default_value : default : 1 PFT_defaults == "CESM2" : 1 max_grazer_prey_cnt : + dependencies : base_bio_on longname : Number of grazer prey classes - subcategory : 1. config PFTs + subcategory : 2. config PFTs units : unitless datatype : integer default_value : @@ -1196,3 +1341,4 @@ tracer_dependent : - 'ALK_ALT_CO2' GRID == "CESM_x3" : *CESM_TRACER_RESTORE GRID == "CESM_x1" : *CESM_TRACER_RESTORE + not base_bio_on : '' diff --git a/defaults/settings_cesm2.1+cocco.yaml b/defaults/settings_cesm2.1+cocco.yaml index e8c93f2f..ff5fb1a5 100644 --- a/defaults/settings_cesm2.1+cocco.yaml +++ b/defaults/settings_cesm2.1+cocco.yaml @@ -41,6 +41,7 @@ # Order in which the categories are parsed _order : + - tracer_modules - general_parms - general_parms2 - PFT_counts @@ -51,56 +52,101 @@ _order : _tracer_list : # Non-living tracers PO4 : + dependencies : + base_bio_on : .true. long_name : Dissolved Inorganic Phosphate units : mmol/m^3 NO3 : + dependencies : + base_bio_on : .true. long_name : Dissolved Inorganic Nitrate units : mmol/m^3 SiO3 : + dependencies : + base_bio_on : .true. long_name : Dissolved Inorganic Silicate units : mmol/m^3 NH4 : + dependencies : + base_bio_on : .true. long_name : Dissolved Ammonia units : mmol/m^3 Fe : + dependencies : + base_bio_on : .true. long_name : Dissolved Inorganic Iron units : mmol/m^3 Lig : + dependencies : + base_bio_on : .true. long_name : Iron Binding Ligand units : mmol/m^3 O2 : + dependencies : + base_bio_on : .true. long_name : Dissolved Oxygen units : mmol/m^3 DIC : + dependencies : + base_bio_on : .true. long_name : Dissolved Inorganic Carbon units : mmol/m^3 DIC_ALT_CO2 : + dependencies : + base_bio_on : .true. long_name : Dissolved Inorganic Carbon, Alternative CO2 units : mmol/m^3 ALK : + dependencies : + base_bio_on : .true. long_name : Alkalinity units : meq/m^3 ALK_ALT_CO2 : + dependencies : + base_bio_on : .true. long_name : Alkalinity, Alternative CO2 units : meq/m^3 DOC : + dependencies : + base_bio_on : .true. long_name : Dissolved Organic Carbon units : mmol/m^3 DON : + dependencies : + base_bio_on : .true. long_name : Dissolved Organic Nitrogen units : mmol/m^3 DOP : + dependencies : + base_bio_on : .true. long_name : Dissolved Organic Phosphorus units : mmol/m^3 DOPr : + dependencies : + base_bio_on : .true. long_name : Refractory DOP units : mmol/m^3 DONr : + dependencies : + base_bio_on : .true. long_name : Refractory DON units : mmol/m^3 DOCr : + dependencies : + base_bio_on : .true. long_name : Refractory DOC units : mmol/m^3 + # Non-living (abiotic only) + ABIO_DIC : + dependencies : + abio_dic_on : .true. + long_name : Abiotic Dissolved Inorganic Carbon + units : mmol/m^3 + ABIO_DI14C : + dependencies : + abio_dic_on : .true. + long_name : Abiotic Dissolved Inorganic Carbon-14 + units : mmol/m^3 # Non-living (ciso only) DI13C : dependencies : @@ -110,7 +156,7 @@ _tracer_list : DO13Ctot : dependencies : ciso_on : .true. - long_name : Dissolved Organic Carbon-13 (semi-labile+refractoy) + long_name : Dissolved Organic Carbon-13 (semi-labile+refractory) units : mmol/m^3 DI14C : dependencies : @@ -120,31 +166,40 @@ _tracer_list : DO14Ctot : dependencies : ciso_on : .true. - long_name : Dissolved Organic Carbon-14 (semi-labile+refractoy) + long_name : Dissolved Organic Carbon-14 (semi-labile+refractory) units : mmol/m^3 # Per-autotroph tracers ((autotroph_sname))Chl : + dependencies : + base_bio_on : .true. long_name : ((autotroph_lname)) Chlorophyll - units : mmol/m^3 + units : mg/m^3 ((autotroph_sname))C : + dependencies : + base_bio_on : .true. long_name : ((autotroph_lname)) Carbon units : mmol/m^3 ((autotroph_sname))Fe : + dependencies : + base_bio_on : .true. long_name : ((autotroph_lname)) Iron units : mmol/m^3 ((autotroph_sname))Si : dependencies : + base_bio_on : .true. ((autotroph_silicifier)) : True long_name : ((autotroph_lname)) Silicon units : mmol/m^3 ((autotroph_sname))CaCO3 : dependencies : + base_bio_on : .true. ((autotroph_calcifier)) : True long_name : ((autotroph_lname)) CaCO3 units : mmol/m^3 ((autotroph_sname))P : dependencies : + base_bio_on : .true. lvariable_PtoC : .true. long_name : ((autotroph_lname)) Phosphorus units : mmol/m^3 @@ -174,6 +229,8 @@ _tracer_list : # Per-zooplankton tracers ((zooplankton_sname))C : + dependencies : + base_bio_on : .true. long_name : ((zooplankton_lname)) Carbon units : mmol/m^3 # Total zooplankton tracers (ciso only) @@ -188,14 +245,42 @@ _tracer_list : long_name : Zooplankton Carbon-14 (sum over all zooplankton) units : mmol/m^3 +################################################################################ +# Category 0: Tracer Modules # +################################################################################ + +tracer_modules : + base_bio_on : + longname : Control whether the base ecosystem tracer module is active + subcategory : 1. tracer modules + units : unitless + datatype : logical + default_value : .true. + _append_to_config_keywords : true + abio_dic_on : + longname : Control whether abiotic carbon tracer module is active + subcategory : 1. tracer modules + units : unitless + datatype : logical + default_value : .false. + _append_to_config_keywords : true + ciso_on : + longname : Control whether CISO tracer module is active + subcategory : 1. tracer modules + units : unitless + datatype : logical + default_value : .false. + _append_to_config_keywords : true + ################################################################################ # Category 1: General Parameters # ################################################################################ general_parms : PFT_defaults : + dependencies : base_bio_on longname : Define how PFTs are initialized - subcategory : 1. config PFTs + subcategory : 2. config PFTs units : unitless datatype : string default_value : CESM2+cocco @@ -216,310 +301,355 @@ general_parms : - diaz_zoo - cocco_zoo _append_to_config_keywords : true - ciso_on : - longname : Control whether CISO tracer module is active - subcategory : 2. config flags - units : unitless - datatype : logical - default_value : .false. lsource_sink : longname : Control which portions of code are executed (useful for debugging) - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .true. ciso_lsource_sink : + dependencies : ciso_on longname : Control which portions of the carbon isotope code are executed (useful for debugging) - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .true. lcheck_forcing : longname : Control whether consistency checks are performed on forcing input (useful for debugging) - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .false. lecovars_full_depth_tavg : longname : If .false., MARBL will recommend truncating the column for some diagnostics - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .false. lflux_gas_o2 : + dependencies : base_bio_on longname : Control which portions of code are executed (useful for debugging) - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .true. lflux_gas_co2 : longname : Control which portions of code are executed (useful for debugging) - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .true. lcompute_nhx_surface_emis : + dependencies : base_bio_on longname : Control if NHx emissions are computed - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .true. lvariable_PtoC : + dependencies : base_bio_on longname : Control if PtoC ratios in autotrophs vary - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .true. ladjust_bury_coeff : + dependencies : base_bio_on longname : Control if bury coefficients are adjusted (rather than constant) - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .false. _append_to_config_keywords : true lo2_consumption_scalef : + dependencies : base_bio_on longname : Apply o2_consumption_scalef to o2 consumption (and request it as a forcing) - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : # default value is resolution dependent! default : .false. GRID == "CESM_x1" : .true. lp_remin_scalef : + dependencies : base_bio_on longname : Apply p_remin_scalef to particulate remin (and request it as a forcing) - subcategory : 2. config flags + subcategory : 3. config flags + units : unitless + datatype : logical + default_value : .false. + labio_derivative_diags : + dependencies : abio_dic_on + longname : Control whether derivative diagnostics are computed in abiotic surface flux (useful for Newton-Krylov) + subcategory : 3. config flags units : unitless datatype : logical default_value : .false. bftt_dz_sum_thres: + dependencies : base_bio_on longname : MARBL will abort if abs(1 - sum(bot_flux_to_tend)) exceeds this threshold - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : 1.0e-14 Jint_Ctot_thres_molpm2pyr : + dependencies : base_bio_on longname : MARBL will abort if abs(Jint_Ctot) exceeds this threshold - subcategory : 4. general parameters + subcategory : 5. general parameters units : mol m-2 yr-1 datatype : real default_value : 1.0e-9 gQsi_0 : + dependencies : base_bio_on longname : initial Si/C ratio for growth - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.137 gQsi_max : + dependencies : base_bio_on longname : max Si/C ratio for growth - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.822 gQsi_min : + dependencies : base_bio_on longname : min Si/C ratio for growth - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.0457 gQ_Fe_kFe_thres : + dependencies : base_bio_on longname : Fe:kFe ratio threshold in uptake ratio computations - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 10.0 gQ_Si_kSi_thres : + dependencies : base_bio_on longname : Si:kSi ratio threshold in uptake ratio computations - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 6.0 parm_Fe_bioavail : + dependencies : base_bio_on longname : Fraction of Fe flux that is bioavailable - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : 1.0 particulate_flux_ref_depth : + dependencies : base_bio_on longname : reference depth for particulate flux diagnostics - subcategory : 4. general parameters + subcategory : 5. general parameters units : m datatype : real default_value : 100.0 parm_o2_min : + dependencies : base_bio_on longname : Minimum O2 needed for production & consumption - subcategory : 4. general parameters + subcategory : 5. general parameters units : nmol/cm^3 datatype : real default_value : 5.0 parm_o2_min_delta : + dependencies : base_bio_on longname : Width of min O2 range - subcategory : 4. general parameters + subcategory : 5. general parameters units : nmol/cm^3 datatype : real default_value : 5.0 parm_kappa_nitrif_per_day : + dependencies : base_bio_on longname : Nitrification inverse time constant - subcategory : 4. general parameters (nitrification) + subcategory : 5. general parameters (nitrification) units : 1/day datatype : real default_value : 0.06 parm_nitrif_par_lim : + dependencies : base_bio_on longname : PAR limit for nitrification - subcategory : 4. general parameters (nitrification) + subcategory : 5. general parameters (nitrification) units : W/m^2 datatype : real default_value : 1.0 parm_labile_ratio : + dependencies : base_bio_on longname : Fraction of loss to DOC that routed directly to DIC - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : 0.94 parm_init_POC_bury_coeff : + dependencies : base_bio_on longname : Initial scale factor for burial of POC, PON - subcategory : 4. general parameters (bury coeffs) + subcategory : 5. general parameters (bury coeffs) units : unitless datatype : real default_value : # default value is resolution dependent! default : 2.54 GRID == "CESM_x3" : 5.0 parm_init_POP_bury_coeff : + dependencies : base_bio_on longname : Initial scale factor for burial of POP - subcategory : 4. general parameters (bury coeffs) + subcategory : 5. general parameters (bury coeffs) units : unitless datatype : real default_value : # default value is resolution dependent! default : 0.36 GRID == "CESM_x3" : 5.0 parm_init_bSi_bury_coeff : + dependencies : base_bio_on longname : Initial scale factor for burial of bSi - subcategory : 4. general parameters (bury coeffs) + subcategory : 5. general parameters (bury coeffs) units : unitless datatype : real default_value : # default value is resolution dependent! default : 1.53 GRID == "CESM_x3" : 1.1 parm_Fe_scavenge_rate0 : + dependencies : base_bio_on longname : Scavenging base rate for Fe - subcategory : 4. general parameters (scavenging) + subcategory : 5. general parameters (scavenging) units : cm^2/ng s/yr datatype : real default_value : 22.0 parm_Lig_scavenge_rate0 : + dependencies : base_bio_on longname : Scavenging base rate for bound ligand - subcategory : 4. general parameters (scavenging) + subcategory : 5. general parameters (scavenging) units : cm^2/ng s/yr datatype : real default_value : 0.015 parm_FeLig_scavenge_rate0 : + dependencies : base_bio_on longname : Scavenging base rate for bound iron - subcategory : 4. general parameters (scavenging) + subcategory : 5. general parameters (scavenging) units : cm^2/ng s/yr datatype : real default_value : 1.2 parm_Lig_degrade_rate0 : + dependencies : base_bio_on longname : Fe-binding ligand bacterial degradation base rate coefficient - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : 0.000094 parm_Fe_desorption_rate0 : + dependencies : base_bio_on longname : Desorption rate for scavenged Fe from particles - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1/cm datatype : real default_value : 1e-6 parm_f_prod_sp_CaCO3 : + dependencies : base_bio_on longname : Fraction of sp production as CaCO3 production - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : # default value is resolution dependent! default : 0.07 GRID == "CESM_x3" : 0.075 parm_POC_diss : + dependencies : base_bio_on longname : Base POC dissolution length scale - subcategory : 4. general parameters (dissolution) + subcategory : 5. general parameters (dissolution) units : cm datatype : real default_value : 100e2 parm_SiO2_diss : + dependencies : base_bio_on longname : Base SiO2 dissolution length scale - subcategory : 4. general parameters (dissolution) + subcategory : 5. general parameters (dissolution) units : cm datatype : real default_value : 650e2 parm_SiO2_gamma : + dependencies : base_bio_on longname : SiO2 gamma (fraction of production -> hard subclass) - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.0 parm_hPOC_SiO2_ratio : + dependencies : base_bio_on longname : hPOC to SiO2 ratio - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.01 parm_CaCO3_diss : + dependencies : base_bio_on longname : Base CaCO3 dissolution length scale - subcategory : 4. general parameters (dissolution) + subcategory : 5. general parameters (dissolution) units : cm datatype : real default_value : 500e2 parm_CaCO3_gamma : + dependencies : base_bio_on longname : CaCO3 gamma (fraction of production -> hard subclass) - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.02 parm_hPOC_CaCO3_ratio : + dependencies : base_bio_on longname : hPOC to CaCO3 ratio - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.01 parm_hPOC_dust_ratio : + dependencies : base_bio_on longname : hPOC to dust ratio - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.01 o2_sf_o2_range_hi : + dependencies : base_bio_on longname : o2_scalefactor is applied to diss length scales for O2 less than this - subcategory : 4. general parameters + subcategory : 5. general parameters units : mmol/m^3 datatype : real default_value : 45.0 o2_sf_o2_range_lo : + dependencies : base_bio_on longname : o2_scalefactor is constant for O2 less than this - subcategory : 4. general parameters + subcategory : 5. general parameters units : mmol/m^3 datatype : real default_value : 5.0 o2_sf_val_lo_o2 : + dependencies : base_bio_on longname : o2_scalefactor constant for O2 less than o2_sf_o2_range_lo - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 2.6 parm_sed_denitrif_coeff : + dependencies : base_bio_on longname : Global scaling factor for sed_denitrif - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : default : 1 GRID == "CESM_x3" : 1.4 bury_coeff_rmean_timescale_years : + dependencies : base_bio_on longname : Running mean time scale for bury coefficients - subcategory : 4. general parameters + subcategory : 5. general parameters units : years datatype : real default_value : 10 parm_scalelen_z : + dependencies : base_bio_on longname : Depths of prescribed scalelen values - subcategory : 5. Scale lengths + subcategory : 6. Scale lengths units : cm datatype : real _array_shape : 4 @@ -529,8 +659,9 @@ general_parms : - 500.0e2 - 1000.0e2 parm_scalelen_vals : + dependencies : base_bio_on longname : Prescribed scalelen values - subcategory : 5. Scale lengths + subcategory : 6. Scale lengths units : unitless datatype : real _array_shape : 4 @@ -546,8 +677,9 @@ general_parms : - 4.2 - 4.4 caco3_bury_thres_opt : + dependencies : base_bio_on longname : Option of threshold of CaCO3 burial - subcategory : 4. general parameters + subcategory : 5. general parameters units : non-numeric datatype : string default_value : omega_calc @@ -555,62 +687,72 @@ general_parms : - fixed_depth - omega_calc caco3_bury_thres_depth : + dependencies : base_bio_on longname : Threshold depth for CaCO3 burial when opt = 'fixed_depth' - subcategory : 4. general parameters + subcategory : 5. general parameters units : cm datatype : real default_value : 3000e2 caco3_bury_thres_omega_calc : + dependencies : base_bio_on longname : omega calcite threshold for CaCO3 burial when opt = 'omega_calc' - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.89 PON_bury_coeff : + dependencies : base_bio_on longname : Scale factor for burial of PON - subcategory : 4. general parameters (bury coeffs) + subcategory : 5. general parameters (bury coeffs) units : unitless datatype : real default_value : 0.5 POM_bury_frac_max : + dependencies : base_bio_on longname : maximum bury fraction for POM - subcategory : 4. general parameters (bury coeffs) + subcategory : 5. general parameters (bury coeffs) units : unitless datatype : real default_value : 0.8 bSi_bury_frac_max : + dependencies : base_bio_on longname : maximum bury fraction for bSi - subcategory : 4. general parameters (bury coeffs) + subcategory : 5. general parameters (bury coeffs) units : unitless datatype : real default_value : 1.0 ciso_fract_factors : + dependencies : ciso_on longname : Option for which biological fractionation calculation to use - subcategory : 4. general parameters + subcategory : 5. general parameters units : non-numeric datatype : string default_value : Laws auto_mort2_exp : + dependencies : base_bio_on longname : Value of power loss exponent for autotrophs - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : 1.75 zoo_mort2_exp : + dependencies : base_bio_on longname : Value of power loss exponent for zooplankton - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : 1.5 QCaCO3_max : + dependencies : base_bio_on longname : Max CaCO3/C ratio for calcifiers - subcategory : 4. general parameters + subcategory : 5. general parameters units : mmol CaCO3/mmol C datatype : real default_value : 2.0 f_graze_CaCO3_remin : + dependencies : base_bio_on longname : Fraction of spCaCO3 grazing which is remineralized in zooplankton guts - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : 0.7 @@ -621,8 +763,9 @@ general_parms : general_parms2 : init_bury_coeff_opt : + dependencies : base_bio_on longname : Source of initial burial coefficient - subcategory : 3. config strings + subcategory : 4. config strings units : unitless datatype : string default_value : @@ -642,8 +785,9 @@ general_parms2 : PFT_counts : autotroph_cnt : + dependencies : base_bio_on longname : Number of autotroph classes - subcategory : 1. config PFTs + subcategory : 2. config PFTs units : unitless datatype : integer default_value : @@ -652,16 +796,18 @@ PFT_counts : cannot change : PFT_defaults == 'CESM2+cocco' must set : PFT_defaults == 'user-specified' zooplankton_cnt : + dependencies : base_bio_on longname : Number of zooplankton classes - subcategory : 1. config PFTs + subcategory : 2. config PFTs units : unitless datatype : integer default_value : default : 1 PFT_defaults == "CESM2+cocco" : 1 max_grazer_prey_cnt : + dependencies : base_bio_on longname : Number of grazer prey classes - subcategory : 1. config PFTs + subcategory : 2. config PFTs units : unitless datatype : integer default_value : @@ -1237,3 +1383,4 @@ tracer_dependent : - 'ALK_ALT_CO2' GRID == "CESM_x3" : *CESM_TRACER_RESTORE GRID == "CESM_x1" : *CESM_TRACER_RESTORE + not base_bio_on : '' diff --git a/defaults/settings_cesm2.1.yaml b/defaults/settings_cesm2.1.yaml index 39e8de1e..824271c9 100644 --- a/defaults/settings_cesm2.1.yaml +++ b/defaults/settings_cesm2.1.yaml @@ -41,6 +41,7 @@ # Order in which the categories are parsed _order : + - tracer_modules - general_parms - general_parms2 - PFT_counts @@ -51,56 +52,101 @@ _order : _tracer_list : # Non-living tracers PO4 : + dependencies : + base_bio_on : .true. long_name : Dissolved Inorganic Phosphate units : mmol/m^3 NO3 : + dependencies : + base_bio_on : .true. long_name : Dissolved Inorganic Nitrate units : mmol/m^3 SiO3 : + dependencies : + base_bio_on : .true. long_name : Dissolved Inorganic Silicate units : mmol/m^3 NH4 : + dependencies : + base_bio_on : .true. long_name : Dissolved Ammonia units : mmol/m^3 Fe : + dependencies : + base_bio_on : .true. long_name : Dissolved Inorganic Iron units : mmol/m^3 Lig : + dependencies : + base_bio_on : .true. long_name : Iron Binding Ligand units : mmol/m^3 O2 : + dependencies : + base_bio_on : .true. long_name : Dissolved Oxygen units : mmol/m^3 DIC : + dependencies : + base_bio_on : .true. long_name : Dissolved Inorganic Carbon units : mmol/m^3 DIC_ALT_CO2 : + dependencies : + base_bio_on : .true. long_name : Dissolved Inorganic Carbon, Alternative CO2 units : mmol/m^3 ALK : + dependencies : + base_bio_on : .true. long_name : Alkalinity units : meq/m^3 ALK_ALT_CO2 : + dependencies : + base_bio_on : .true. long_name : Alkalinity, Alternative CO2 units : meq/m^3 DOC : + dependencies : + base_bio_on : .true. long_name : Dissolved Organic Carbon units : mmol/m^3 DON : + dependencies : + base_bio_on : .true. long_name : Dissolved Organic Nitrogen units : mmol/m^3 DOP : + dependencies : + base_bio_on : .true. long_name : Dissolved Organic Phosphorus units : mmol/m^3 DOPr : + dependencies : + base_bio_on : .true. long_name : Refractory DOP units : mmol/m^3 DONr : + dependencies : + base_bio_on : .true. long_name : Refractory DON units : mmol/m^3 DOCr : + dependencies : + base_bio_on : .true. long_name : Refractory DOC units : mmol/m^3 + # Non-living (abiotic only) + ABIO_DIC : + dependencies : + abio_dic_on : .true. + long_name : Abiotic Dissolved Inorganic Carbon + units : mmol/m^3 + ABIO_DI14C : + dependencies : + abio_dic_on : .true. + long_name : Abiotic Dissolved Inorganic Carbon-14 + units : mmol/m^3 # Non-living (ciso only) DI13C : dependencies : @@ -110,7 +156,7 @@ _tracer_list : DO13Ctot : dependencies : ciso_on : .true. - long_name : Dissolved Organic Carbon-13 (semi-labile+refractoy) + long_name : Dissolved Organic Carbon-13 (semi-labile+refractory) units : mmol/m^3 DI14C : dependencies : @@ -120,31 +166,40 @@ _tracer_list : DO14Ctot : dependencies : ciso_on : .true. - long_name : Dissolved Organic Carbon-14 (semi-labile+refractoy) + long_name : Dissolved Organic Carbon-14 (semi-labile+refractory) units : mmol/m^3 # Per-autotroph tracers ((autotroph_sname))Chl : + dependencies : + base_bio_on : .true. long_name : ((autotroph_lname)) Chlorophyll - units : mmol/m^3 + units : mg/m^3 ((autotroph_sname))C : + dependencies : + base_bio_on : .true. long_name : ((autotroph_lname)) Carbon units : mmol/m^3 ((autotroph_sname))Fe : + dependencies : + base_bio_on : .true. long_name : ((autotroph_lname)) Iron units : mmol/m^3 ((autotroph_sname))Si : dependencies : + base_bio_on : .true. ((autotroph_silicifier)) : True long_name : ((autotroph_lname)) Silicon units : mmol/m^3 ((autotroph_sname))CaCO3 : dependencies : + base_bio_on : .true. ((autotroph_calcifier)) : True long_name : ((autotroph_lname)) CaCO3 units : mmol/m^3 ((autotroph_sname))P : dependencies : + base_bio_on : .true. lvariable_PtoC : .true. long_name : ((autotroph_lname)) Phosphorus units : mmol/m^3 @@ -174,6 +229,8 @@ _tracer_list : # Per-zooplankton tracers ((zooplankton_sname))C : + dependencies : + base_bio_on : .true. long_name : ((zooplankton_lname)) Carbon units : mmol/m^3 # Total zooplankton tracers (ciso only) @@ -188,14 +245,42 @@ _tracer_list : long_name : Zooplankton Carbon-14 (sum over all zooplankton) units : mmol/m^3 +################################################################################ +# Category 0: Tracer Modules # +################################################################################ + +tracer_modules : + base_bio_on : + longname : Control whether the base ecosystem tracer module is active + subcategory : 1. tracer modules + units : unitless + datatype : logical + default_value : .true. + _append_to_config_keywords : true + abio_dic_on : + longname : Control whether abiotic carbon tracer module is active + subcategory : 1. tracer modules + units : unitless + datatype : logical + default_value : .false. + _append_to_config_keywords : true + ciso_on : + longname : Control whether CISO tracer module is active + subcategory : 1. tracer modules + units : unitless + datatype : logical + default_value : .false. + _append_to_config_keywords : true + ################################################################################ # Category 1: General Parameters # ################################################################################ general_parms : PFT_defaults : + dependencies : base_bio_on longname : Define how PFTs are initialized - subcategory : 1. config PFTs + subcategory : 2. config PFTs units : unitless datatype : string default_value : CESM2 @@ -214,310 +299,355 @@ general_parms : - diat_zoo - diaz_zoo _append_to_config_keywords : true - ciso_on : - longname : Control whether CISO tracer module is active - subcategory : 2. config flags - units : unitless - datatype : logical - default_value : .false. lsource_sink : longname : Control which portions of code are executed (useful for debugging) - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .true. ciso_lsource_sink : + dependencies : ciso_on longname : Control which portions of the carbon isotope code are executed (useful for debugging) - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .true. lcheck_forcing : longname : Control whether consistency checks are performed on forcing input (useful for debugging) - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .false. lecovars_full_depth_tavg : longname : If .false., MARBL will recommend truncating the column for some diagnostics - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .false. lflux_gas_o2 : + dependencies : base_bio_on longname : Control which portions of code are executed (useful for debugging) - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .true. lflux_gas_co2 : longname : Control which portions of code are executed (useful for debugging) - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .true. lcompute_nhx_surface_emis : + dependencies : base_bio_on longname : Control if NHx emissions are computed - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .true. lvariable_PtoC : + dependencies : base_bio_on longname : Control if PtoC ratios in autotrophs vary - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .true. ladjust_bury_coeff : + dependencies : base_bio_on longname : Control if bury coefficients are adjusted (rather than constant) - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .false. _append_to_config_keywords : true lo2_consumption_scalef : + dependencies : base_bio_on longname : Apply o2_consumption_scalef to o2 consumption (and request it as a forcing) - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : # default value is resolution dependent! default : .false. GRID == "CESM_x1" : .true. lp_remin_scalef : + dependencies : base_bio_on longname : Apply p_remin_scalef to particulate remin (and request it as a forcing) - subcategory : 2. config flags + subcategory : 3. config flags + units : unitless + datatype : logical + default_value : .false. + labio_derivative_diags : + dependencies : abio_dic_on + longname : Control whether derivative diagnostics are computed in abiotic surface flux (useful for Newton-Krylov) + subcategory : 3. config flags units : unitless datatype : logical default_value : .false. bftt_dz_sum_thres: + dependencies : base_bio_on longname : MARBL will abort if abs(1 - sum(bot_flux_to_tend)) exceeds this threshold - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : 1.0e-14 Jint_Ctot_thres_molpm2pyr : + dependencies : base_bio_on longname : MARBL will abort if abs(Jint_Ctot) exceeds this threshold - subcategory : 4. general parameters + subcategory : 5. general parameters units : mol m-2 yr-1 datatype : real default_value : 1.0e-9 gQsi_0 : + dependencies : base_bio_on longname : initial Si/C ratio for growth - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.137 gQsi_max : + dependencies : base_bio_on longname : max Si/C ratio for growth - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.822 gQsi_min : + dependencies : base_bio_on longname : min Si/C ratio for growth - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.0457 gQ_Fe_kFe_thres : + dependencies : base_bio_on longname : Fe:kFe ratio threshold in uptake ratio computations - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 10.0 gQ_Si_kSi_thres : + dependencies : base_bio_on longname : Si:kSi ratio threshold in uptake ratio computations - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 6.0 parm_Fe_bioavail : + dependencies : base_bio_on longname : Fraction of Fe flux that is bioavailable - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : 1.0 particulate_flux_ref_depth : + dependencies : base_bio_on longname : reference depth for particulate flux diagnostics - subcategory : 4. general parameters + subcategory : 5. general parameters units : m datatype : real default_value : 100.0 parm_o2_min : + dependencies : base_bio_on longname : Minimum O2 needed for production & consumption - subcategory : 4. general parameters + subcategory : 5. general parameters units : nmol/cm^3 datatype : real default_value : 5.0 parm_o2_min_delta : + dependencies : base_bio_on longname : Width of min O2 range - subcategory : 4. general parameters + subcategory : 5. general parameters units : nmol/cm^3 datatype : real default_value : 5.0 parm_kappa_nitrif_per_day : + dependencies : base_bio_on longname : Nitrification inverse time constant - subcategory : 4. general parameters (nitrification) + subcategory : 5. general parameters (nitrification) units : 1/day datatype : real default_value : 0.06 parm_nitrif_par_lim : + dependencies : base_bio_on longname : PAR limit for nitrification - subcategory : 4. general parameters (nitrification) + subcategory : 5. general parameters (nitrification) units : W/m^2 datatype : real default_value : 1.0 parm_labile_ratio : + dependencies : base_bio_on longname : Fraction of loss to DOC that routed directly to DIC - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : 0.94 parm_init_POC_bury_coeff : + dependencies : base_bio_on longname : Initial scale factor for burial of POC, PON - subcategory : 4. general parameters (bury coeffs) + subcategory : 5. general parameters (bury coeffs) units : unitless datatype : real default_value : # default value is resolution dependent! default : 2.54 GRID == "CESM_x3" : 5.0 parm_init_POP_bury_coeff : + dependencies : base_bio_on longname : Initial scale factor for burial of POP - subcategory : 4. general parameters (bury coeffs) + subcategory : 5. general parameters (bury coeffs) units : unitless datatype : real default_value : # default value is resolution dependent! default : 0.36 GRID == "CESM_x3" : 5.0 parm_init_bSi_bury_coeff : + dependencies : base_bio_on longname : Initial scale factor for burial of bSi - subcategory : 4. general parameters (bury coeffs) + subcategory : 5. general parameters (bury coeffs) units : unitless datatype : real default_value : # default value is resolution dependent! default : 1.53 GRID == "CESM_x3" : 1.1 parm_Fe_scavenge_rate0 : + dependencies : base_bio_on longname : Scavenging base rate for Fe - subcategory : 4. general parameters (scavenging) + subcategory : 5. general parameters (scavenging) units : cm^2/ng s/yr datatype : real default_value : 22.0 parm_Lig_scavenge_rate0 : + dependencies : base_bio_on longname : Scavenging base rate for bound ligand - subcategory : 4. general parameters (scavenging) + subcategory : 5. general parameters (scavenging) units : cm^2/ng s/yr datatype : real default_value : 0.015 parm_FeLig_scavenge_rate0 : + dependencies : base_bio_on longname : Scavenging base rate for bound iron - subcategory : 4. general parameters (scavenging) + subcategory : 5. general parameters (scavenging) units : cm^2/ng s/yr datatype : real default_value : 1.2 parm_Lig_degrade_rate0 : + dependencies : base_bio_on longname : Fe-binding ligand bacterial degradation base rate coefficient - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : 0.000094 parm_Fe_desorption_rate0 : + dependencies : base_bio_on longname : Desorption rate for scavenged Fe from particles - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1/cm datatype : real default_value : 1e-6 parm_f_prod_sp_CaCO3 : + dependencies : base_bio_on longname : Fraction of sp production as CaCO3 production - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : # default value is resolution dependent! default : 0.07 GRID == "CESM_x3" : 0.075 parm_POC_diss : + dependencies : base_bio_on longname : Base POC dissolution length scale - subcategory : 4. general parameters (dissolution) + subcategory : 5. general parameters (dissolution) units : cm datatype : real default_value : 100e2 parm_SiO2_diss : + dependencies : base_bio_on longname : Base SiO2 dissolution length scale - subcategory : 4. general parameters (dissolution) + subcategory : 5. general parameters (dissolution) units : cm datatype : real default_value : 650e2 parm_SiO2_gamma : + dependencies : base_bio_on longname : SiO2 gamma (fraction of production -> hard subclass) - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.0 parm_hPOC_SiO2_ratio : + dependencies : base_bio_on longname : hPOC to SiO2 ratio - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.01 parm_CaCO3_diss : + dependencies : base_bio_on longname : Base CaCO3 dissolution length scale - subcategory : 4. general parameters (dissolution) + subcategory : 5. general parameters (dissolution) units : cm datatype : real default_value : 500e2 parm_CaCO3_gamma : + dependencies : base_bio_on longname : CaCO3 gamma (fraction of production -> hard subclass) - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.02 parm_hPOC_CaCO3_ratio : + dependencies : base_bio_on longname : hPOC to CaCO3 ratio - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.01 parm_hPOC_dust_ratio : + dependencies : base_bio_on longname : hPOC to dust ratio - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.01 o2_sf_o2_range_hi : + dependencies : base_bio_on longname : o2_scalefactor is applied to diss length scales for O2 less than this - subcategory : 4. general parameters + subcategory : 5. general parameters units : mmol/m^3 datatype : real default_value : 45.0 o2_sf_o2_range_lo : + dependencies : base_bio_on longname : o2_scalefactor is constant for O2 less than this - subcategory : 4. general parameters + subcategory : 5. general parameters units : mmol/m^3 datatype : real default_value : 5.0 o2_sf_val_lo_o2 : + dependencies : base_bio_on longname : o2_scalefactor constant for O2 less than o2_sf_o2_range_lo - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 2.6 parm_sed_denitrif_coeff : + dependencies : base_bio_on longname : Global scaling factor for sed_denitrif - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : default : 1 GRID == "CESM_x3" : 1.4 bury_coeff_rmean_timescale_years : + dependencies : base_bio_on longname : Running mean time scale for bury coefficients - subcategory : 4. general parameters + subcategory : 5. general parameters units : years datatype : real default_value : 10 parm_scalelen_z : + dependencies : base_bio_on longname : Depths of prescribed scalelen values - subcategory : 5. Scale lengths + subcategory : 6. Scale lengths units : cm datatype : real _array_shape : 4 @@ -527,8 +657,9 @@ general_parms : - 500.0e2 - 1000.0e2 parm_scalelen_vals : + dependencies : base_bio_on longname : Prescribed scalelen values - subcategory : 5. Scale lengths + subcategory : 6. Scale lengths units : unitless datatype : real _array_shape : 4 @@ -544,8 +675,9 @@ general_parms : - 4.2 - 4.4 caco3_bury_thres_opt : + dependencies : base_bio_on longname : Option of threshold of CaCO3 burial - subcategory : 4. general parameters + subcategory : 5. general parameters units : non-numeric datatype : string default_value : omega_calc @@ -553,62 +685,72 @@ general_parms : - fixed_depth - omega_calc caco3_bury_thres_depth : + dependencies : base_bio_on longname : Threshold depth for CaCO3 burial when opt = 'fixed_depth' - subcategory : 4. general parameters + subcategory : 5. general parameters units : cm datatype : real default_value : 3000e2 caco3_bury_thres_omega_calc : + dependencies : base_bio_on longname : omega calcite threshold for CaCO3 burial when opt = 'omega_calc' - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.89 PON_bury_coeff : + dependencies : base_bio_on longname : Scale factor for burial of PON - subcategory : 4. general parameters (bury coeffs) + subcategory : 5. general parameters (bury coeffs) units : unitless datatype : real default_value : 0.5 POM_bury_frac_max : + dependencies : base_bio_on longname : maximum bury fraction for POM - subcategory : 4. general parameters (bury coeffs) + subcategory : 5. general parameters (bury coeffs) units : unitless datatype : real default_value : 0.8 bSi_bury_frac_max : + dependencies : base_bio_on longname : maximum bury fraction for bSi - subcategory : 4. general parameters (bury coeffs) + subcategory : 5. general parameters (bury coeffs) units : unitless datatype : real default_value : 1.0 ciso_fract_factors : + dependencies : ciso_on longname : Option for which biological fractionation calculation to use - subcategory : 4. general parameters + subcategory : 5. general parameters units : non-numeric datatype : string default_value : Laws auto_mort2_exp : + dependencies : base_bio_on longname : Value of power loss exponent for autotrophs - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : 1.75 zoo_mort2_exp : + dependencies : base_bio_on longname : Value of power loss exponent for zooplankton - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : 1.5 QCaCO3_max : + dependencies : base_bio_on longname : Max CaCO3/C ratio for calcifiers - subcategory : 4. general parameters + subcategory : 5. general parameters units : mmol CaCO3/mmol C datatype : real default_value : 0.40 f_graze_CaCO3_remin : + dependencies : base_bio_on longname : Fraction of spCaCO3 grazing which is remineralized in zooplankton guts - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : 0.33 @@ -619,8 +761,9 @@ general_parms : general_parms2 : init_bury_coeff_opt : + dependencies : base_bio_on longname : Source of initial burial coefficient - subcategory : 3. config strings + subcategory : 4. config strings units : unitless datatype : string default_value : @@ -640,8 +783,9 @@ general_parms2 : PFT_counts : autotroph_cnt : + dependencies : base_bio_on longname : Number of autotroph classes - subcategory : 1. config PFTs + subcategory : 2. config PFTs units : unitless datatype : integer default_value : @@ -650,16 +794,18 @@ PFT_counts : cannot change : PFT_defaults == 'CESM2' must set : PFT_defaults == 'user-specified' zooplankton_cnt : + dependencies : base_bio_on longname : Number of zooplankton classes - subcategory : 1. config PFTs + subcategory : 2. config PFTs units : unitless datatype : integer default_value : default : 1 PFT_defaults == "CESM2" : 1 max_grazer_prey_cnt : + dependencies : base_bio_on longname : Number of grazer prey classes - subcategory : 1. config PFTs + subcategory : 2. config PFTs units : unitless datatype : integer default_value : @@ -1197,3 +1343,4 @@ tracer_dependent : - 'ALK_ALT_CO2' GRID == "CESM_x3" : *CESM_TRACER_RESTORE GRID == "CESM_x1" : *CESM_TRACER_RESTORE + not base_bio_on : '' diff --git a/defaults/settings_latest+4p2z.yaml b/defaults/settings_latest+4p2z.yaml index 9b167289..875ba595 100644 --- a/defaults/settings_latest+4p2z.yaml +++ b/defaults/settings_latest+4p2z.yaml @@ -41,6 +41,7 @@ # Order in which the categories are parsed _order : + - tracer_modules - general_parms - general_parms2 - PFT_counts @@ -51,56 +52,112 @@ _order : _tracer_list : # Non-living tracers PO4 : + dependencies : + base_bio_on : .true. long_name : Dissolved Inorganic Phosphate units : mmol/m^3 NO3 : + dependencies : + base_bio_on : .true. long_name : Dissolved Inorganic Nitrate units : mmol/m^3 SiO3 : + dependencies : + base_bio_on : .true. long_name : Dissolved Inorganic Silicate units : mmol/m^3 NH4 : + dependencies : + base_bio_on : .true. long_name : Dissolved Ammonia units : mmol/m^3 Fe : + dependencies : + base_bio_on : .true. long_name : Dissolved Inorganic Iron units : mmol/m^3 Lig : + dependencies : + base_bio_on : .true. long_name : Iron Binding Ligand units : mmol/m^3 O2 : + dependencies : + base_bio_on : .true. long_name : Dissolved Oxygen units : mmol/m^3 DIC : + dependencies : + base_bio_on : .true. long_name : Dissolved Inorganic Carbon units : mmol/m^3 DIC_ALT_CO2 : + dependencies : + base_bio_on : .true. long_name : Dissolved Inorganic Carbon, Alternative CO2 units : mmol/m^3 ALK : + dependencies : + base_bio_on : .true. long_name : Alkalinity units : meq/m^3 ALK_ALT_CO2 : + dependencies : + base_bio_on : .true. long_name : Alkalinity, Alternative CO2 units : meq/m^3 DOC : + dependencies : + base_bio_on : .true. long_name : Dissolved Organic Carbon units : mmol/m^3 DON : + dependencies : + base_bio_on : .true. long_name : Dissolved Organic Nitrogen units : mmol/m^3 DOP : + dependencies : + base_bio_on : .true. long_name : Dissolved Organic Phosphorus units : mmol/m^3 DOPr : + dependencies : + base_bio_on : .true. long_name : Refractory DOP units : mmol/m^3 DONr : + dependencies : + base_bio_on : .true. long_name : Refractory DON units : mmol/m^3 DOCr : + dependencies : + base_bio_on : .true. long_name : Refractory DOC units : mmol/m^3 + # Non-living (abiotic only) + ABIO_DIC : + dependencies : + abio_dic_on : .true. + long_name : Abiotic Dissolved Inorganic Carbon + units : mmol/m^3 + ABIO_DI14C : + dependencies : + abio_dic_on : .true. + long_name : Abiotic Dissolved Inorganic Carbon-14 + units : mmol/m^3 + # Non-living (abiotic only) + ABIO_DIC : + dependencies : + abio_dic_on : .true. + long_name : Abiotic Dissolved Inorganic Carbon + units : mmol/m^3 + ABIO_DI14C : + dependencies : + abio_dic_on : .true. + long_name : Abiotic Dissolved Inorganic Carbon-14 + units : mmol/m^3 # Non-living (ciso only) DI13C : dependencies : @@ -110,7 +167,7 @@ _tracer_list : DO13Ctot : dependencies : ciso_on : .true. - long_name : Dissolved Organic Carbon-13 (semi-labile+refractoy) + long_name : Dissolved Organic Carbon-13 (semi-labile+refractory) units : mmol/m^3 DI14C : dependencies : @@ -120,31 +177,40 @@ _tracer_list : DO14Ctot : dependencies : ciso_on : .true. - long_name : Dissolved Organic Carbon-14 (semi-labile+refractoy) + long_name : Dissolved Organic Carbon-14 (semi-labile+refractory) units : mmol/m^3 # Per-autotroph tracers ((autotroph_sname))Chl : + dependencies : + base_bio_on : .true. long_name : ((autotroph_lname)) Chlorophyll - units : mmol/m^3 + units : mg/m^3 ((autotroph_sname))C : + dependencies : + base_bio_on : .true. long_name : ((autotroph_lname)) Carbon units : mmol/m^3 ((autotroph_sname))Fe : + dependencies : + base_bio_on : .true. long_name : ((autotroph_lname)) Iron units : mmol/m^3 ((autotroph_sname))Si : dependencies : + base_bio_on : .true. ((autotroph_silicifier)) : True long_name : ((autotroph_lname)) Silicon units : mmol/m^3 ((autotroph_sname))CaCO3 : dependencies : + base_bio_on : .true. ((autotroph_calcifier)) : True long_name : ((autotroph_lname)) CaCO3 units : mmol/m^3 ((autotroph_sname))P : dependencies : + base_bio_on : .true. lvariable_PtoC : .true. long_name : ((autotroph_lname)) Phosphorus units : mmol/m^3 @@ -174,6 +240,8 @@ _tracer_list : # Per-zooplankton tracers ((zooplankton_sname))C : + dependencies : + base_bio_on : .true. long_name : ((zooplankton_lname)) Carbon units : mmol/m^3 # Total zooplankton tracers (ciso only) @@ -188,14 +256,42 @@ _tracer_list : long_name : Zooplankton Carbon-14 (sum over all zooplankton) units : mmol/m^3 +################################################################################ +# Category 0: Tracer Modules # +################################################################################ + +tracer_modules : + base_bio_on : + longname : Control whether the base ecosystem tracer module is active + subcategory : 1. tracer modules + units : unitless + datatype : logical + default_value : .true. + _append_to_config_keywords : true + abio_dic_on : + longname : Control whether abiotic carbon tracer module is active + subcategory : 1. tracer modules + units : unitless + datatype : logical + default_value : .false. + _append_to_config_keywords : true + ciso_on : + longname : Control whether CISO tracer module is active + subcategory : 1. tracer modules + units : unitless + datatype : logical + default_value : .false. + _append_to_config_keywords : true + ################################################################################ # Category 1: General Parameters # ################################################################################ general_parms : PFT_defaults : + dependencies : base_bio_on longname : Define how PFTs are initialized - subcategory : 1. config PFTs + subcategory : 2. config PFTs units : unitless datatype : string default_value : 4p2z @@ -221,310 +317,355 @@ general_parms : - "null" - microzoo_mesozoo _append_to_config_keywords : true - ciso_on : - longname : Control whether CISO tracer module is active - subcategory : 2. config flags - units : unitless - datatype : logical - default_value : .false. lsource_sink : longname : Control which portions of code are executed (useful for debugging) - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .true. ciso_lsource_sink : + dependencies : ciso_on longname : Control which portions of the carbon isotope code are executed (useful for debugging) - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .true. lcheck_forcing : longname : Control whether consistency checks are performed on forcing input (useful for debugging) - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .false. lecovars_full_depth_tavg : longname : If .false., MARBL will recommend truncating the column for some diagnostics - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .false. lflux_gas_o2 : + dependencies : base_bio_on longname : Control which portions of code are executed (useful for debugging) - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .true. lflux_gas_co2 : longname : Control which portions of code are executed (useful for debugging) - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .true. lcompute_nhx_surface_emis : + dependencies : base_bio_on longname : Control if NHx emissions are computed - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .true. lvariable_PtoC : + dependencies : base_bio_on longname : Control if PtoC ratios in autotrophs vary - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .true. ladjust_bury_coeff : + dependencies : base_bio_on longname : Control if bury coefficients are adjusted (rather than constant) - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .false. _append_to_config_keywords : true lo2_consumption_scalef : + dependencies : base_bio_on longname : Apply o2_consumption_scalef to o2 consumption (and request it as a forcing) - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : # default value is resolution dependent! default : .false. GRID == "CESM_x1" : .true. lp_remin_scalef : + dependencies : base_bio_on longname : Apply p_remin_scalef to particulate remin (and request it as a forcing) - subcategory : 2. config flags + subcategory : 3. config flags + units : unitless + datatype : logical + default_value : .false. + labio_derivative_diags : + dependencies : abio_dic_on + longname : Control whether derivative diagnostics are computed in abiotic surface flux (useful for Newton-Krylov) + subcategory : 3. config flags units : unitless datatype : logical default_value : .false. bftt_dz_sum_thres: + dependencies : base_bio_on longname : MARBL will abort if abs(1 - sum(bot_flux_to_tend)) exceeds this threshold - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : 1.0e-14 Jint_Ctot_thres_molpm2pyr : + dependencies : base_bio_on longname : MARBL will abort if abs(Jint_Ctot) exceeds this threshold - subcategory : 4. general parameters + subcategory : 5. general parameters units : mol m-2 yr-1 datatype : real default_value : 1.0e-9 gQsi_0 : + dependencies : base_bio_on longname : initial Si/C ratio for growth - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.137 gQsi_max : + dependencies : base_bio_on longname : max Si/C ratio for growth - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.685 gQsi_min : + dependencies : base_bio_on longname : min Si/C ratio for growth - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.0457 gQ_Fe_kFe_thres : + dependencies : base_bio_on longname : Fe:kFe ratio threshold in uptake ratio computations - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 10.0 gQ_Si_kSi_thres : + dependencies : base_bio_on longname : Si:kSi ratio threshold in uptake ratio computations - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 5.0 parm_Fe_bioavail : + dependencies : base_bio_on longname : Fraction of Fe flux that is bioavailable - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : 1.0 particulate_flux_ref_depth : + dependencies : base_bio_on longname : reference depth for particulate flux diagnostics - subcategory : 4. general parameters + subcategory : 5. general parameters units : m datatype : real default_value : 100.0 parm_o2_min : + dependencies : base_bio_on longname : Minimum O2 needed for production & consumption - subcategory : 4. general parameters + subcategory : 5. general parameters units : nmol/cm^3 datatype : real default_value : 5.0 parm_o2_min_delta : + dependencies : base_bio_on longname : Width of min O2 range - subcategory : 4. general parameters + subcategory : 5. general parameters units : nmol/cm^3 datatype : real default_value : 5.0 parm_kappa_nitrif_per_day : + dependencies : base_bio_on longname : Nitrification inverse time constant - subcategory : 4. general parameters (nitrification) + subcategory : 5. general parameters (nitrification) units : 1/day datatype : real default_value : 0.06 parm_nitrif_par_lim : + dependencies : base_bio_on longname : PAR limit for nitrification - subcategory : 4. general parameters (nitrification) + subcategory : 5. general parameters (nitrification) units : W/m^2 datatype : real default_value : 1.0 parm_labile_ratio : + dependencies : base_bio_on longname : Fraction of loss to DOC that routed directly to DIC - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : 0.94 parm_init_POC_bury_coeff : + dependencies : base_bio_on longname : Initial scale factor for burial of POC, PON - subcategory : 4. general parameters (bury coeffs) + subcategory : 5. general parameters (bury coeffs) units : unitless datatype : real default_value : # default value is resolution dependent! default : 1.1 GRID == "CESM_x3" : 5.0 parm_init_POP_bury_coeff : + dependencies : base_bio_on longname : Initial scale factor for burial of POP - subcategory : 4. general parameters (bury coeffs) + subcategory : 5. general parameters (bury coeffs) units : unitless datatype : real default_value : # default value is resolution dependent! default : 1.1 GRID == "CESM_x3" : 5.0 parm_init_bSi_bury_coeff : + dependencies : base_bio_on longname : Initial scale factor for burial of bSi - subcategory : 4. general parameters (bury coeffs) + subcategory : 5. general parameters (bury coeffs) units : unitless datatype : real default_value : # default value is resolution dependent! default : 1.0 GRID == "CESM_x3" : 1.1 parm_Fe_scavenge_rate0 : + dependencies : base_bio_on longname : Scavenging base rate for Fe - subcategory : 4. general parameters (scavenging) + subcategory : 5. general parameters (scavenging) units : cm^2/ng s/yr datatype : real default_value : 24.0 parm_Lig_scavenge_rate0 : + dependencies : base_bio_on longname : Scavenging base rate for bound ligand - subcategory : 4. general parameters (scavenging) + subcategory : 5. general parameters (scavenging) units : cm^2/ng s/yr datatype : real default_value : 0.015 parm_FeLig_scavenge_rate0 : + dependencies : base_bio_on longname : Scavenging base rate for bound iron - subcategory : 4. general parameters (scavenging) + subcategory : 5. general parameters (scavenging) units : cm^2/ng s/yr datatype : real default_value : 1.3 parm_Lig_degrade_rate0 : + dependencies : base_bio_on longname : Fe-binding ligand bacterial degradation base rate coefficient - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : 0.000094 parm_Fe_desorption_rate0 : + dependencies : base_bio_on longname : Desorption rate for scavenged Fe from particles - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1/cm datatype : real default_value : 1e-6 parm_f_prod_sp_CaCO3 : + dependencies : base_bio_on longname : Fraction of sp production as CaCO3 production - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : # default value is resolution dependent! default : 0.07 GRID == "CESM_x3" : 0.075 parm_POC_diss : + dependencies : base_bio_on longname : Base POC dissolution length scale - subcategory : 4. general parameters (dissolution) + subcategory : 5. general parameters (dissolution) units : cm datatype : real default_value : 100e2 parm_SiO2_diss : + dependencies : base_bio_on longname : Base SiO2 dissolution length scale - subcategory : 4. general parameters (dissolution) + subcategory : 5. general parameters (dissolution) units : cm datatype : real default_value : 650e2 parm_SiO2_gamma : + dependencies : base_bio_on longname : SiO2 gamma (fraction of production -> hard subclass) - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.1 parm_hPOC_SiO2_ratio : + dependencies : base_bio_on longname : hPOC to SiO2 ratio - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.05 parm_CaCO3_diss : + dependencies : base_bio_on longname : Base CaCO3 dissolution length scale - subcategory : 4. general parameters (dissolution) + subcategory : 5. general parameters (dissolution) units : cm datatype : real default_value : 500e2 parm_CaCO3_gamma : + dependencies : base_bio_on longname : CaCO3 gamma (fraction of production -> hard subclass) - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.1 parm_hPOC_CaCO3_ratio : + dependencies : base_bio_on longname : hPOC to CaCO3 ratio - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.05 parm_hPOC_dust_ratio : + dependencies : base_bio_on longname : hPOC to dust ratio - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.05 o2_sf_o2_range_hi : + dependencies : base_bio_on longname : o2_scalefactor is applied to diss length scales for O2 less than this - subcategory : 4. general parameters + subcategory : 5. general parameters units : mmol/m^3 datatype : real default_value : 45.0 o2_sf_o2_range_lo : + dependencies : base_bio_on longname : o2_scalefactor is constant for O2 less than this - subcategory : 4. general parameters + subcategory : 5. general parameters units : mmol/m^3 datatype : real default_value : 5.0 o2_sf_val_lo_o2 : + dependencies : base_bio_on longname : o2_scalefactor constant for O2 less than o2_sf_o2_range_lo - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 3.0 parm_sed_denitrif_coeff : + dependencies : base_bio_on longname : Global scaling factor for sed_denitrif - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : default : 1 GRID == "CESM_x3" : 1.4 bury_coeff_rmean_timescale_years : + dependencies : base_bio_on longname : Running mean time scale for bury coefficients - subcategory : 4. general parameters + subcategory : 5. general parameters units : years datatype : real default_value : 10 parm_scalelen_z : + dependencies : base_bio_on longname : Depths of prescribed scalelen values - subcategory : 5. Scale lengths + subcategory : 6. Scale lengths units : cm datatype : real _array_shape : 4 @@ -534,8 +675,9 @@ general_parms : - 500.0e2 - 1000.0e2 parm_scalelen_vals : + dependencies : base_bio_on longname : Prescribed scalelen values - subcategory : 5. Scale lengths + subcategory : 6. Scale lengths units : unitless datatype : real _array_shape : 4 @@ -551,8 +693,9 @@ general_parms : - 4.2 - 4.4 caco3_bury_thres_opt : + dependencies : base_bio_on longname : Option of threshold of CaCO3 burial - subcategory : 4. general parameters + subcategory : 5. general parameters units : non-numeric datatype : string default_value : omega_calc @@ -560,62 +703,72 @@ general_parms : - fixed_depth - omega_calc caco3_bury_thres_depth : + dependencies : base_bio_on longname : Threshold depth for CaCO3 burial when opt = 'fixed_depth' - subcategory : 4. general parameters + subcategory : 5. general parameters units : cm datatype : real default_value : 3000e2 caco3_bury_thres_omega_calc : + dependencies : base_bio_on longname : omega calcite threshold for CaCO3 burial when opt = 'omega_calc' - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 1.0 PON_bury_coeff : + dependencies : base_bio_on longname : Scale factor for burial of PON - subcategory : 4. general parameters (bury coeffs) + subcategory : 5. general parameters (bury coeffs) units : unitless datatype : real default_value : 0.5 POM_bury_frac_max : + dependencies : base_bio_on longname : maximum bury fraction for POM - subcategory : 4. general parameters (bury coeffs) + subcategory : 5. general parameters (bury coeffs) units : unitless datatype : real default_value : 0.8 bSi_bury_frac_max : + dependencies : base_bio_on longname : maximum bury fraction for bSi - subcategory : 4. general parameters (bury coeffs) + subcategory : 5. general parameters (bury coeffs) units : unitless datatype : real default_value : 1.0 ciso_fract_factors : + dependencies : ciso_on longname : Option for which biological fractionation calculation to use - subcategory : 4. general parameters + subcategory : 5. general parameters units : non-numeric datatype : string default_value : Laws auto_mort2_exp : + dependencies : base_bio_on longname : Value of power loss exponent for autotrophs - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : 1.75 zoo_mort2_exp : + dependencies : base_bio_on longname : Value of power loss exponent for zooplankton - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : 2.0 QCaCO3_max : + dependencies : base_bio_on longname : Max CaCO3/C ratio for calcifiers - subcategory : 4. general parameters + subcategory : 5. general parameters units : mmol CaCO3/mmol C datatype : real default_value : 1.0 f_graze_CaCO3_remin : + dependencies : base_bio_on longname : Fraction of spCaCO3 grazing which is remineralized in zooplankton guts - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : 0.5 @@ -626,8 +779,9 @@ general_parms : general_parms2 : init_bury_coeff_opt : + dependencies : base_bio_on longname : Source of initial burial coefficient - subcategory : 3. config strings + subcategory : 4. config strings units : unitless datatype : string default_value : @@ -647,8 +801,9 @@ general_parms2 : PFT_counts : autotroph_cnt : + dependencies : base_bio_on longname : Number of autotroph classes - subcategory : 1. config PFTs + subcategory : 2. config PFTs units : unitless datatype : integer default_value : @@ -657,16 +812,18 @@ PFT_counts : cannot change : PFT_defaults == '4p2z' must set : PFT_defaults == 'user-specified' zooplankton_cnt : + dependencies : base_bio_on longname : Number of zooplankton classes - subcategory : 1. config PFTs + subcategory : 2. config PFTs units : unitless datatype : integer default_value : default : 1 PFT_defaults == "4p2z" : 2 max_grazer_prey_cnt : + dependencies : base_bio_on longname : Number of grazer prey classes - subcategory : 1. config PFTs + subcategory : 2. config PFTs units : unitless datatype : integer default_value : @@ -1289,3 +1446,4 @@ tracer_dependent : - 'ALK_ALT_CO2' GRID == "CESM_x3" : *CESM_TRACER_RESTORE GRID == "CESM_x1" : *CESM_TRACER_RESTORE + not base_bio_on : '' diff --git a/defaults/settings_latest+cocco.yaml b/defaults/settings_latest+cocco.yaml index 967ec968..b27afe40 100644 --- a/defaults/settings_latest+cocco.yaml +++ b/defaults/settings_latest+cocco.yaml @@ -41,6 +41,7 @@ # Order in which the categories are parsed _order : + - tracer_modules - general_parms - general_parms2 - PFT_counts @@ -51,56 +52,101 @@ _order : _tracer_list : # Non-living tracers PO4 : + dependencies : + base_bio_on : .true. long_name : Dissolved Inorganic Phosphate units : mmol/m^3 NO3 : + dependencies : + base_bio_on : .true. long_name : Dissolved Inorganic Nitrate units : mmol/m^3 SiO3 : + dependencies : + base_bio_on : .true. long_name : Dissolved Inorganic Silicate units : mmol/m^3 NH4 : + dependencies : + base_bio_on : .true. long_name : Dissolved Ammonia units : mmol/m^3 Fe : + dependencies : + base_bio_on : .true. long_name : Dissolved Inorganic Iron units : mmol/m^3 Lig : + dependencies : + base_bio_on : .true. long_name : Iron Binding Ligand units : mmol/m^3 O2 : + dependencies : + base_bio_on : .true. long_name : Dissolved Oxygen units : mmol/m^3 DIC : + dependencies : + base_bio_on : .true. long_name : Dissolved Inorganic Carbon units : mmol/m^3 DIC_ALT_CO2 : + dependencies : + base_bio_on : .true. long_name : Dissolved Inorganic Carbon, Alternative CO2 units : mmol/m^3 ALK : + dependencies : + base_bio_on : .true. long_name : Alkalinity units : meq/m^3 ALK_ALT_CO2 : + dependencies : + base_bio_on : .true. long_name : Alkalinity, Alternative CO2 units : meq/m^3 DOC : + dependencies : + base_bio_on : .true. long_name : Dissolved Organic Carbon units : mmol/m^3 DON : + dependencies : + base_bio_on : .true. long_name : Dissolved Organic Nitrogen units : mmol/m^3 DOP : + dependencies : + base_bio_on : .true. long_name : Dissolved Organic Phosphorus units : mmol/m^3 DOPr : + dependencies : + base_bio_on : .true. long_name : Refractory DOP units : mmol/m^3 DONr : + dependencies : + base_bio_on : .true. long_name : Refractory DON units : mmol/m^3 DOCr : + dependencies : + base_bio_on : .true. long_name : Refractory DOC units : mmol/m^3 + # Non-living (abiotic only) + ABIO_DIC : + dependencies : + abio_dic_on : .true. + long_name : Abiotic Dissolved Inorganic Carbon + units : mmol/m^3 + ABIO_DI14C : + dependencies : + abio_dic_on : .true. + long_name : Abiotic Dissolved Inorganic Carbon-14 + units : mmol/m^3 # Non-living (ciso only) DI13C : dependencies : @@ -110,7 +156,7 @@ _tracer_list : DO13Ctot : dependencies : ciso_on : .true. - long_name : Dissolved Organic Carbon-13 (semi-labile+refractoy) + long_name : Dissolved Organic Carbon-13 (semi-labile+refractory) units : mmol/m^3 DI14C : dependencies : @@ -120,31 +166,40 @@ _tracer_list : DO14Ctot : dependencies : ciso_on : .true. - long_name : Dissolved Organic Carbon-14 (semi-labile+refractoy) + long_name : Dissolved Organic Carbon-14 (semi-labile+refractory) units : mmol/m^3 # Per-autotroph tracers ((autotroph_sname))Chl : + dependencies : + base_bio_on : .true. long_name : ((autotroph_lname)) Chlorophyll - units : mmol/m^3 + units : mg/m^3 ((autotroph_sname))C : + dependencies : + base_bio_on : .true. long_name : ((autotroph_lname)) Carbon units : mmol/m^3 ((autotroph_sname))Fe : + dependencies : + base_bio_on : .true. long_name : ((autotroph_lname)) Iron units : mmol/m^3 ((autotroph_sname))Si : dependencies : + base_bio_on : .true. ((autotroph_silicifier)) : True long_name : ((autotroph_lname)) Silicon units : mmol/m^3 ((autotroph_sname))CaCO3 : dependencies : + base_bio_on : .true. ((autotroph_calcifier)) : True long_name : ((autotroph_lname)) CaCO3 units : mmol/m^3 ((autotroph_sname))P : dependencies : + base_bio_on : .true. lvariable_PtoC : .true. long_name : ((autotroph_lname)) Phosphorus units : mmol/m^3 @@ -174,6 +229,8 @@ _tracer_list : # Per-zooplankton tracers ((zooplankton_sname))C : + dependencies : + base_bio_on : .true. long_name : ((zooplankton_lname)) Carbon units : mmol/m^3 # Total zooplankton tracers (ciso only) @@ -188,14 +245,42 @@ _tracer_list : long_name : Zooplankton Carbon-14 (sum over all zooplankton) units : mmol/m^3 +################################################################################ +# Category 0: Tracer Modules # +################################################################################ + +tracer_modules : + base_bio_on : + longname : Control whether the base ecosystem tracer module is active + subcategory : 1. tracer modules + units : unitless + datatype : logical + default_value : .true. + _append_to_config_keywords : true + abio_dic_on : + longname : Control whether abiotic carbon tracer module is active + subcategory : 1. tracer modules + units : unitless + datatype : logical + default_value : .false. + _append_to_config_keywords : true + ciso_on : + longname : Control whether CISO tracer module is active + subcategory : 1. tracer modules + units : unitless + datatype : logical + default_value : .false. + _append_to_config_keywords : true + ################################################################################ # Category 1: General Parameters # ################################################################################ general_parms : PFT_defaults : + dependencies : base_bio_on longname : Define how PFTs are initialized - subcategory : 1. config PFTs + subcategory : 2. config PFTs units : unitless datatype : string default_value : CESM2+cocco @@ -216,304 +301,355 @@ general_parms : - diaz_zoo - cocco_zoo _append_to_config_keywords : true - ciso_on : - longname : Control whether CISO tracer module is active - subcategory : 2. config flags - units : unitless - datatype : logical - default_value : .false. lsource_sink : longname : Control which portions of code are executed (useful for debugging) - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .true. ciso_lsource_sink : + dependencies : ciso_on longname : Control which portions of the carbon isotope code are executed (useful for debugging) - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .true. + lcheck_forcing : + longname : Control whether consistency checks are performed on forcing input (useful for debugging) + subcategory : 3. config flags + units : unitless + datatype : logical + default_value : .false. lecovars_full_depth_tavg : longname : If .false., MARBL will recommend truncating the column for some diagnostics - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .false. lflux_gas_o2 : + dependencies : base_bio_on longname : Control which portions of code are executed (useful for debugging) - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .true. lflux_gas_co2 : longname : Control which portions of code are executed (useful for debugging) - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .true. lcompute_nhx_surface_emis : + dependencies : base_bio_on longname : Control if NHx emissions are computed - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .true. lvariable_PtoC : + dependencies : base_bio_on longname : Control if PtoC ratios in autotrophs vary - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .true. ladjust_bury_coeff : + dependencies : base_bio_on longname : Control if bury coefficients are adjusted (rather than constant) - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .false. _append_to_config_keywords : true lo2_consumption_scalef : + dependencies : base_bio_on longname : Apply o2_consumption_scalef to o2 consumption (and request it as a forcing) - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : # default value is resolution dependent! default : .false. GRID == "CESM_x1" : .true. lp_remin_scalef : + dependencies : base_bio_on longname : Apply p_remin_scalef to particulate remin (and request it as a forcing) - subcategory : 2. config flags + subcategory : 3. config flags + units : unitless + datatype : logical + default_value : .false. + labio_derivative_diags : + dependencies : abio_dic_on + longname : Control whether derivative diagnostics are computed in abiotic surface flux (useful for Newton-Krylov) + subcategory : 3. config flags units : unitless datatype : logical default_value : .false. bftt_dz_sum_thres: + dependencies : base_bio_on longname : MARBL will abort if abs(1 - sum(bot_flux_to_tend)) exceeds this threshold - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : 1.0e-14 Jint_Ctot_thres_molpm2pyr : + dependencies : base_bio_on longname : MARBL will abort if abs(Jint_Ctot) exceeds this threshold - subcategory : 4. general parameters + subcategory : 5. general parameters units : mol m-2 yr-1 datatype : real default_value : 1.0e-9 gQsi_0 : + dependencies : base_bio_on longname : initial Si/C ratio for growth - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.137 gQsi_max : + dependencies : base_bio_on longname : max Si/C ratio for growth - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.685 gQsi_min : + dependencies : base_bio_on longname : min Si/C ratio for growth - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.0457 gQ_Fe_kFe_thres : + dependencies : base_bio_on longname : Fe:kFe ratio threshold in uptake ratio computations - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 10.0 gQ_Si_kSi_thres : + dependencies : base_bio_on longname : Si:kSi ratio threshold in uptake ratio computations - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 5.0 parm_Fe_bioavail : + dependencies : base_bio_on longname : Fraction of Fe flux that is bioavailable - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : 1.0 particulate_flux_ref_depth : + dependencies : base_bio_on longname : reference depth for particulate flux diagnostics - subcategory : 4. general parameters + subcategory : 5. general parameters units : m datatype : real default_value : 100.0 parm_o2_min : + dependencies : base_bio_on longname : Minimum O2 needed for production & consumption - subcategory : 4. general parameters + subcategory : 5. general parameters units : nmol/cm^3 datatype : real default_value : 5.0 parm_o2_min_delta : + dependencies : base_bio_on longname : Width of min O2 range - subcategory : 4. general parameters + subcategory : 5. general parameters units : nmol/cm^3 datatype : real default_value : 5.0 parm_kappa_nitrif_per_day : + dependencies : base_bio_on longname : Nitrification inverse time constant - subcategory : 4. general parameters (nitrification) + subcategory : 5. general parameters (nitrification) units : 1/day datatype : real default_value : 0.06 parm_nitrif_par_lim : + dependencies : base_bio_on longname : PAR limit for nitrification - subcategory : 4. general parameters (nitrification) + subcategory : 5. general parameters (nitrification) units : W/m^2 datatype : real default_value : 1.0 parm_labile_ratio : + dependencies : base_bio_on longname : Fraction of loss to DOC that routed directly to DIC - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : 0.94 parm_init_POC_bury_coeff : + dependencies : base_bio_on longname : Initial scale factor for burial of POC, PON - subcategory : 4. general parameters (bury coeffs) + subcategory : 5. general parameters (bury coeffs) units : unitless datatype : real default_value : # default value is resolution dependent! default : 1.1 GRID == "CESM_x3" : 5.0 parm_init_POP_bury_coeff : + dependencies : base_bio_on longname : Initial scale factor for burial of POP - subcategory : 4. general parameters (bury coeffs) + subcategory : 5. general parameters (bury coeffs) units : unitless datatype : real default_value : # default value is resolution dependent! default : 1.1 GRID == "CESM_x3" : 5.0 parm_init_bSi_bury_coeff : + dependencies : base_bio_on longname : Initial scale factor for burial of bSi - subcategory : 4. general parameters (bury coeffs) + subcategory : 5. general parameters (bury coeffs) units : unitless datatype : real default_value : # default value is resolution dependent! default : 1.0 GRID == "CESM_x3" : 1.1 parm_Fe_scavenge_rate0 : + dependencies : base_bio_on longname : Scavenging base rate for Fe - subcategory : 4. general parameters (scavenging) + subcategory : 5. general parameters (scavenging) units : cm^2/ng s/yr datatype : real default_value : 24.0 parm_Lig_scavenge_rate0 : + dependencies : base_bio_on longname : Scavenging base rate for bound ligand - subcategory : 4. general parameters (scavenging) + subcategory : 5. general parameters (scavenging) units : cm^2/ng s/yr datatype : real default_value : 0.015 parm_FeLig_scavenge_rate0 : + dependencies : base_bio_on longname : Scavenging base rate for bound iron - subcategory : 4. general parameters (scavenging) + subcategory : 5. general parameters (scavenging) units : cm^2/ng s/yr datatype : real default_value : 1.3 parm_Lig_degrade_rate0 : + dependencies : base_bio_on longname : Fe-binding ligand bacterial degradation base rate coefficient - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : 0.000094 parm_Fe_desorption_rate0 : + dependencies : base_bio_on longname : Desorption rate for scavenged Fe from particles - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1/cm datatype : real default_value : 1e-6 parm_f_prod_sp_CaCO3 : + dependencies : base_bio_on longname : Fraction of sp production as CaCO3 production - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : # default value is resolution dependent! default : 0.07 GRID == "CESM_x3" : 0.075 parm_POC_diss : + dependencies : base_bio_on longname : Base POC dissolution length scale - subcategory : 4. general parameters (dissolution) + subcategory : 5. general parameters (dissolution) units : cm datatype : real default_value : 100e2 parm_SiO2_diss : + dependencies : base_bio_on longname : Base SiO2 dissolution length scale - subcategory : 4. general parameters (dissolution) + subcategory : 5. general parameters (dissolution) units : cm datatype : real default_value : 700e2 parm_SiO2_gamma : + dependencies : base_bio_on longname : SiO2 gamma (fraction of production -> hard subclass) - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.1 parm_hPOC_SiO2_ratio : + dependencies : base_bio_on longname : hPOC to SiO2 ratio - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.05 parm_CaCO3_diss : + dependencies : base_bio_on longname : Base CaCO3 dissolution length scale - subcategory : 4. general parameters (dissolution) + subcategory : 5. general parameters (dissolution) units : cm datatype : real default_value : 500e2 parm_CaCO3_gamma : + dependencies : base_bio_on longname : CaCO3 gamma (fraction of production -> hard subclass) - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.1 parm_hPOC_CaCO3_ratio : + dependencies : base_bio_on longname : hPOC to CaCO3 ratio - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.05 parm_hPOC_dust_ratio : + dependencies : base_bio_on longname : hPOC to dust ratio - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.05 o2_sf_o2_range_hi : + dependencies : base_bio_on longname : o2_scalefactor is applied to diss length scales for O2 less than this - subcategory : 4. general parameters + subcategory : 5. general parameters units : mmol/m^3 datatype : real default_value : 45.0 o2_sf_o2_range_lo : + dependencies : base_bio_on longname : o2_scalefactor is constant for O2 less than this - subcategory : 4. general parameters + subcategory : 5. general parameters units : mmol/m^3 datatype : real default_value : 5.0 o2_sf_val_lo_o2 : + dependencies : base_bio_on longname : o2_scalefactor constant for O2 less than o2_sf_o2_range_lo - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 3.0 parm_sed_denitrif_coeff : + dependencies : base_bio_on longname : Global scaling factor for sed_denitrif - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : default : 1 GRID == "CESM_x3" : 1.4 bury_coeff_rmean_timescale_years : + dependencies : base_bio_on longname : Running mean time scale for bury coefficients - subcategory : 4. general parameters + subcategory : 5. general parameters units : years datatype : real default_value : 10 parm_scalelen_z : + dependencies : base_bio_on longname : Depths of prescribed scalelen values - subcategory : 5. Scale lengths + subcategory : 6. Scale lengths units : cm datatype : real _array_shape : 4 @@ -523,8 +659,9 @@ general_parms : - 500.0e2 - 2000.0e2 parm_scalelen_vals : + dependencies : base_bio_on longname : Prescribed scalelen values - subcategory : 5. Scale lengths + subcategory : 6. Scale lengths units : unitless datatype : real _array_shape : 4 @@ -540,8 +677,9 @@ general_parms : - 4.2 - 4.4 caco3_bury_thres_opt : + dependencies : base_bio_on longname : Option of threshold of CaCO3 burial - subcategory : 4. general parameters + subcategory : 5. general parameters units : non-numeric datatype : string default_value : omega_calc @@ -549,62 +687,72 @@ general_parms : - fixed_depth - omega_calc caco3_bury_thres_depth : + dependencies : base_bio_on longname : Threshold depth for CaCO3 burial when opt = 'fixed_depth' - subcategory : 4. general parameters + subcategory : 5. general parameters units : cm datatype : real default_value : 3000e2 caco3_bury_thres_omega_calc : + dependencies : base_bio_on longname : omega calcite threshold for CaCO3 burial when opt = 'omega_calc' - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 1.0 PON_bury_coeff : + dependencies : base_bio_on longname : Scale factor for burial of PON - subcategory : 4. general parameters (bury coeffs) + subcategory : 5. general parameters (bury coeffs) units : unitless datatype : real default_value : 0.5 POM_bury_frac_max : + dependencies : base_bio_on longname : maximum bury fraction for POM - subcategory : 4. general parameters (bury coeffs) + subcategory : 5. general parameters (bury coeffs) units : unitless datatype : real default_value : 0.8 bSi_bury_frac_max : + dependencies : base_bio_on longname : maximum bury fraction for bSi - subcategory : 4. general parameters (bury coeffs) + subcategory : 5. general parameters (bury coeffs) units : unitless datatype : real default_value : 1.0 ciso_fract_factors : + dependencies : ciso_on longname : Option for which biological fractionation calculation to use - subcategory : 4. general parameters + subcategory : 5. general parameters units : non-numeric datatype : string default_value : Laws auto_mort2_exp : + dependencies : base_bio_on longname : Value of power loss exponent for autotrophs - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : 1.75 zoo_mort2_exp : + dependencies : base_bio_on longname : Value of power loss exponent for zooplankton - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : 1.5 QCaCO3_max : + dependencies : base_bio_on longname : Max CaCO3/C ratio for calcifiers - subcategory : 4. general parameters + subcategory : 5. general parameters units : mmol CaCO3/mmol C datatype : real default_value : 2.0 f_graze_CaCO3_remin : + dependencies : base_bio_on longname : Fraction of spCaCO3 grazing which is remineralized in zooplankton guts - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : 0.7 @@ -615,8 +763,9 @@ general_parms : general_parms2 : init_bury_coeff_opt : + dependencies : base_bio_on longname : Source of initial burial coefficient - subcategory : 3. config strings + subcategory : 4. config strings units : unitless datatype : string default_value : @@ -636,8 +785,9 @@ general_parms2 : PFT_counts : autotroph_cnt : + dependencies : base_bio_on longname : Number of autotroph classes - subcategory : 1. config PFTs + subcategory : 2. config PFTs units : unitless datatype : integer default_value : @@ -646,16 +796,18 @@ PFT_counts : cannot change : PFT_defaults == 'CESM2+cocco' must set : PFT_defaults == 'user-specified' zooplankton_cnt : + dependencies : base_bio_on longname : Number of zooplankton classes - subcategory : 1. config PFTs + subcategory : 2. config PFTs units : unitless datatype : integer default_value : default : 1 PFT_defaults == "CESM2+cocco" : 1 max_grazer_prey_cnt : + dependencies : base_bio_on longname : Number of grazer prey classes - subcategory : 1. config PFTs + subcategory : 2. config PFTs units : unitless datatype : integer default_value : @@ -1231,3 +1383,4 @@ tracer_dependent : - 'ALK_ALT_CO2' GRID == "CESM_x3" : *CESM_TRACER_RESTORE GRID == "CESM_x1" : *CESM_TRACER_RESTORE + not base_bio_on : '' diff --git a/defaults/settings_latest.yaml b/defaults/settings_latest.yaml index 377839d4..67b178b7 100644 --- a/defaults/settings_latest.yaml +++ b/defaults/settings_latest.yaml @@ -41,6 +41,7 @@ # Order in which the categories are parsed _order : + - tracer_modules - general_parms - general_parms2 - PFT_counts @@ -51,56 +52,101 @@ _order : _tracer_list : # Non-living tracers PO4 : + dependencies : + base_bio_on : .true. long_name : Dissolved Inorganic Phosphate units : mmol/m^3 NO3 : + dependencies : + base_bio_on : .true. long_name : Dissolved Inorganic Nitrate units : mmol/m^3 SiO3 : + dependencies : + base_bio_on : .true. long_name : Dissolved Inorganic Silicate units : mmol/m^3 NH4 : + dependencies : + base_bio_on : .true. long_name : Dissolved Ammonia units : mmol/m^3 Fe : + dependencies : + base_bio_on : .true. long_name : Dissolved Inorganic Iron units : mmol/m^3 Lig : + dependencies : + base_bio_on : .true. long_name : Iron Binding Ligand units : mmol/m^3 O2 : + dependencies : + base_bio_on : .true. long_name : Dissolved Oxygen units : mmol/m^3 DIC : + dependencies : + base_bio_on : .true. long_name : Dissolved Inorganic Carbon units : mmol/m^3 DIC_ALT_CO2 : + dependencies : + base_bio_on : .true. long_name : Dissolved Inorganic Carbon, Alternative CO2 units : mmol/m^3 ALK : + dependencies : + base_bio_on : .true. long_name : Alkalinity units : meq/m^3 ALK_ALT_CO2 : + dependencies : + base_bio_on : .true. long_name : Alkalinity, Alternative CO2 units : meq/m^3 DOC : + dependencies : + base_bio_on : .true. long_name : Dissolved Organic Carbon units : mmol/m^3 DON : + dependencies : + base_bio_on : .true. long_name : Dissolved Organic Nitrogen units : mmol/m^3 DOP : + dependencies : + base_bio_on : .true. long_name : Dissolved Organic Phosphorus units : mmol/m^3 DOPr : + dependencies : + base_bio_on : .true. long_name : Refractory DOP units : mmol/m^3 DONr : + dependencies : + base_bio_on : .true. long_name : Refractory DON units : mmol/m^3 DOCr : + dependencies : + base_bio_on : .true. long_name : Refractory DOC units : mmol/m^3 + # Non-living (abiotic only) + ABIO_DIC : + dependencies : + abio_dic_on : .true. + long_name : Abiotic Dissolved Inorganic Carbon + units : mmol/m^3 + ABIO_DI14C : + dependencies : + abio_dic_on : .true. + long_name : Abiotic Dissolved Inorganic Carbon-14 + units : mmol/m^3 # Non-living (ciso only) DI13C : dependencies : @@ -110,7 +156,7 @@ _tracer_list : DO13Ctot : dependencies : ciso_on : .true. - long_name : Dissolved Organic Carbon-13 (semi-labile+refractoy) + long_name : Dissolved Organic Carbon-13 (semi-labile+refractory) units : mmol/m^3 DI14C : dependencies : @@ -120,31 +166,40 @@ _tracer_list : DO14Ctot : dependencies : ciso_on : .true. - long_name : Dissolved Organic Carbon-14 (semi-labile+refractoy) + long_name : Dissolved Organic Carbon-14 (semi-labile+refractory) units : mmol/m^3 # Per-autotroph tracers ((autotroph_sname))Chl : + dependencies : + base_bio_on : .true. long_name : ((autotroph_lname)) Chlorophyll - units : mmol/m^3 + units : mg/m^3 ((autotroph_sname))C : + dependencies : + base_bio_on : .true. long_name : ((autotroph_lname)) Carbon units : mmol/m^3 ((autotroph_sname))Fe : + dependencies : + base_bio_on : .true. long_name : ((autotroph_lname)) Iron units : mmol/m^3 ((autotroph_sname))Si : dependencies : + base_bio_on : .true. ((autotroph_silicifier)) : True long_name : ((autotroph_lname)) Silicon units : mmol/m^3 ((autotroph_sname))CaCO3 : dependencies : + base_bio_on : .true. ((autotroph_calcifier)) : True long_name : ((autotroph_lname)) CaCO3 units : mmol/m^3 ((autotroph_sname))P : dependencies : + base_bio_on : .true. lvariable_PtoC : .true. long_name : ((autotroph_lname)) Phosphorus units : mmol/m^3 @@ -174,6 +229,8 @@ _tracer_list : # Per-zooplankton tracers ((zooplankton_sname))C : + dependencies : + base_bio_on : .true. long_name : ((zooplankton_lname)) Carbon units : mmol/m^3 # Total zooplankton tracers (ciso only) @@ -188,19 +245,49 @@ _tracer_list : long_name : Zooplankton Carbon-14 (sum over all zooplankton) units : mmol/m^3 +################################################################################ +# Category 0: Tracer Modules # +################################################################################ + +tracer_modules : + base_bio_on : + longname : Control whether the base ecosystem tracer module is active + subcategory : 1. tracer modules + units : unitless + datatype : logical + default_value : .true. + _append_to_config_keywords : true + abio_dic_on : + longname : Control whether abiotic carbon tracer module is active + subcategory : 1. tracer modules + units : unitless + datatype : logical + default_value : .false. + _append_to_config_keywords : true + ciso_on : + longname : Control whether CISO tracer module is active + subcategory : 1. tracer modules + units : unitless + datatype : logical + default_value : .false. + _append_to_config_keywords : true + ################################################################################ # Category 1: General Parameters # ################################################################################ general_parms : PFT_defaults : + dependencies : base_bio_on longname : Define how PFTs are initialized - subcategory : 1. config PFTs + subcategory : 2. config PFTs units : unitless datatype : string - default_value : CESM2 + default_value : + default : CESM2 valid_values : - CESM2 + - None - user-specified _CESM2_PFT_keys : autotroph_settings : @@ -214,310 +301,355 @@ general_parms : - diat_zoo - diaz_zoo _append_to_config_keywords : true - ciso_on : - longname : Control whether CISO tracer module is active - subcategory : 2. config flags - units : unitless - datatype : logical - default_value : .false. lsource_sink : longname : Control which portions of code are executed (useful for debugging) - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .true. ciso_lsource_sink : + dependencies : ciso_on longname : Control which portions of the carbon isotope code are executed (useful for debugging) - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .true. lcheck_forcing : longname : Control whether consistency checks are performed on forcing input (useful for debugging) - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .false. lecovars_full_depth_tavg : longname : If .false., MARBL will recommend truncating the column for some diagnostics - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .false. lflux_gas_o2 : + dependencies : base_bio_on longname : Control which portions of code are executed (useful for debugging) - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .true. lflux_gas_co2 : longname : Control which portions of code are executed (useful for debugging) - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .true. lcompute_nhx_surface_emis : + dependencies : base_bio_on longname : Control if NHx emissions are computed - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .true. lvariable_PtoC : + dependencies : base_bio_on longname : Control if PtoC ratios in autotrophs vary - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .true. ladjust_bury_coeff : + dependencies : base_bio_on longname : Control if bury coefficients are adjusted (rather than constant) - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : .false. _append_to_config_keywords : true lo2_consumption_scalef : + dependencies : base_bio_on longname : Apply o2_consumption_scalef to o2 consumption (and request it as a forcing) - subcategory : 2. config flags + subcategory : 3. config flags units : unitless datatype : logical default_value : # default value is resolution dependent! default : .false. GRID == "CESM_x1" : .true. lp_remin_scalef : + dependencies : base_bio_on longname : Apply p_remin_scalef to particulate remin (and request it as a forcing) - subcategory : 2. config flags + subcategory : 3. config flags + units : unitless + datatype : logical + default_value : .false. + labio_derivative_diags : + dependencies : abio_dic_on + longname : Control whether derivative diagnostics are computed in abiotic surface flux (useful for Newton-Krylov) + subcategory : 3. config flags units : unitless datatype : logical default_value : .false. bftt_dz_sum_thres: + dependencies : base_bio_on longname : MARBL will abort if abs(1 - sum(bot_flux_to_tend)) exceeds this threshold - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : 1.0e-14 Jint_Ctot_thres_molpm2pyr : + dependencies : base_bio_on longname : MARBL will abort if abs(Jint_Ctot) exceeds this threshold - subcategory : 4. general parameters + subcategory : 5. general parameters units : mol m-2 yr-1 datatype : real default_value : 1.0e-9 gQsi_0 : + dependencies : base_bio_on longname : initial Si/C ratio for growth - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.137 gQsi_max : + dependencies : base_bio_on longname : max Si/C ratio for growth - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.685 gQsi_min : + dependencies : base_bio_on longname : min Si/C ratio for growth - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.0457 gQ_Fe_kFe_thres : + dependencies : base_bio_on longname : Fe:kFe ratio threshold in uptake ratio computations - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 10.0 gQ_Si_kSi_thres : + dependencies : base_bio_on longname : Si:kSi ratio threshold in uptake ratio computations - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 5.0 parm_Fe_bioavail : + dependencies : base_bio_on longname : Fraction of Fe flux that is bioavailable - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : 1.0 particulate_flux_ref_depth : + dependencies : base_bio_on longname : reference depth for particulate flux diagnostics - subcategory : 4. general parameters + subcategory : 5. general parameters units : m datatype : real default_value : 100.0 parm_o2_min : + dependencies : base_bio_on longname : Minimum O2 needed for production & consumption - subcategory : 4. general parameters + subcategory : 5. general parameters units : nmol/cm^3 datatype : real default_value : 5.0 parm_o2_min_delta : + dependencies : base_bio_on longname : Width of min O2 range - subcategory : 4. general parameters + subcategory : 5. general parameters units : nmol/cm^3 datatype : real default_value : 5.0 parm_kappa_nitrif_per_day : + dependencies : base_bio_on longname : Nitrification inverse time constant - subcategory : 4. general parameters (nitrification) + subcategory : 5. general parameters (nitrification) units : 1/day datatype : real default_value : 0.06 parm_nitrif_par_lim : + dependencies : base_bio_on longname : PAR limit for nitrification - subcategory : 4. general parameters (nitrification) + subcategory : 5. general parameters (nitrification) units : W/m^2 datatype : real default_value : 1.0 parm_labile_ratio : + dependencies : base_bio_on longname : Fraction of loss to DOC that routed directly to DIC - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : 0.94 parm_init_POC_bury_coeff : + dependencies : base_bio_on longname : Initial scale factor for burial of POC, PON - subcategory : 4. general parameters (bury coeffs) + subcategory : 5. general parameters (bury coeffs) units : unitless datatype : real default_value : # default value is resolution dependent! default : 1.1 GRID == "CESM_x3" : 5.0 parm_init_POP_bury_coeff : + dependencies : base_bio_on longname : Initial scale factor for burial of POP - subcategory : 4. general parameters (bury coeffs) + subcategory : 5. general parameters (bury coeffs) units : unitless datatype : real default_value : # default value is resolution dependent! default : 1.1 GRID == "CESM_x3" : 5.0 parm_init_bSi_bury_coeff : + dependencies : base_bio_on longname : Initial scale factor for burial of bSi - subcategory : 4. general parameters (bury coeffs) + subcategory : 5. general parameters (bury coeffs) units : unitless datatype : real default_value : # default value is resolution dependent! default : 1.0 GRID == "CESM_x3" : 1.1 parm_Fe_scavenge_rate0 : + dependencies : base_bio_on longname : Scavenging base rate for Fe - subcategory : 4. general parameters (scavenging) + subcategory : 5. general parameters (scavenging) units : cm^2/ng s/yr datatype : real default_value : 24.0 parm_Lig_scavenge_rate0 : + dependencies : base_bio_on longname : Scavenging base rate for bound ligand - subcategory : 4. general parameters (scavenging) + subcategory : 5. general parameters (scavenging) units : cm^2/ng s/yr datatype : real default_value : 0.015 parm_FeLig_scavenge_rate0 : + dependencies : base_bio_on longname : Scavenging base rate for bound iron - subcategory : 4. general parameters (scavenging) + subcategory : 5. general parameters (scavenging) units : cm^2/ng s/yr datatype : real default_value : 1.3 parm_Lig_degrade_rate0 : + dependencies : base_bio_on longname : Fe-binding ligand bacterial degradation base rate coefficient - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : 0.000094 parm_Fe_desorption_rate0 : + dependencies : base_bio_on longname : Desorption rate for scavenged Fe from particles - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1/cm datatype : real default_value : 1e-6 parm_f_prod_sp_CaCO3 : + dependencies : base_bio_on longname : Fraction of sp production as CaCO3 production - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : # default value is resolution dependent! default : 0.07 GRID == "CESM_x3" : 0.075 parm_POC_diss : + dependencies : base_bio_on longname : Base POC dissolution length scale - subcategory : 4. general parameters (dissolution) + subcategory : 5. general parameters (dissolution) units : cm datatype : real default_value : 100e2 parm_SiO2_diss : + dependencies : base_bio_on longname : Base SiO2 dissolution length scale - subcategory : 4. general parameters (dissolution) + subcategory : 5. general parameters (dissolution) units : cm datatype : real default_value : 650e2 parm_SiO2_gamma : + dependencies : base_bio_on longname : SiO2 gamma (fraction of production -> hard subclass) - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.1 parm_hPOC_SiO2_ratio : + dependencies : base_bio_on longname : hPOC to SiO2 ratio - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.05 parm_CaCO3_diss : + dependencies : base_bio_on longname : Base CaCO3 dissolution length scale - subcategory : 4. general parameters (dissolution) + subcategory : 5. general parameters (dissolution) units : cm datatype : real default_value : 500e2 parm_CaCO3_gamma : + dependencies : base_bio_on longname : CaCO3 gamma (fraction of production -> hard subclass) - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.1 parm_hPOC_CaCO3_ratio : + dependencies : base_bio_on longname : hPOC to CaCO3 ratio - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.05 parm_hPOC_dust_ratio : + dependencies : base_bio_on longname : hPOC to dust ratio - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 0.05 o2_sf_o2_range_hi : + dependencies : base_bio_on longname : o2_scalefactor is applied to diss length scales for O2 less than this - subcategory : 4. general parameters + subcategory : 5. general parameters units : mmol/m^3 datatype : real default_value : 45.0 o2_sf_o2_range_lo : + dependencies : base_bio_on longname : o2_scalefactor is constant for O2 less than this - subcategory : 4. general parameters + subcategory : 5. general parameters units : mmol/m^3 datatype : real default_value : 5.0 o2_sf_val_lo_o2 : + dependencies : base_bio_on longname : o2_scalefactor constant for O2 less than o2_sf_o2_range_lo - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 3.0 parm_sed_denitrif_coeff : + dependencies : base_bio_on longname : Global scaling factor for sed_denitrif - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : default : 1 GRID == "CESM_x3" : 1.4 bury_coeff_rmean_timescale_years : + dependencies : base_bio_on longname : Running mean time scale for bury coefficients - subcategory : 4. general parameters + subcategory : 5. general parameters units : years datatype : real default_value : 10 parm_scalelen_z : + dependencies : base_bio_on longname : Depths of prescribed scalelen values - subcategory : 5. Scale lengths + subcategory : 6. Scale lengths units : cm datatype : real _array_shape : 4 @@ -527,8 +659,9 @@ general_parms : - 500.0e2 - 1000.0e2 parm_scalelen_vals : + dependencies : base_bio_on longname : Prescribed scalelen values - subcategory : 5. Scale lengths + subcategory : 6. Scale lengths units : unitless datatype : real _array_shape : 4 @@ -544,8 +677,9 @@ general_parms : - 4.2 - 4.4 caco3_bury_thres_opt : + dependencies : base_bio_on longname : Option of threshold of CaCO3 burial - subcategory : 4. general parameters + subcategory : 5. general parameters units : non-numeric datatype : string default_value : omega_calc @@ -553,62 +687,72 @@ general_parms : - fixed_depth - omega_calc caco3_bury_thres_depth : + dependencies : base_bio_on longname : Threshold depth for CaCO3 burial when opt = 'fixed_depth' - subcategory : 4. general parameters + subcategory : 5. general parameters units : cm datatype : real default_value : 3000e2 caco3_bury_thres_omega_calc : + dependencies : base_bio_on longname : omega calcite threshold for CaCO3 burial when opt = 'omega_calc' - subcategory : 4. general parameters + subcategory : 5. general parameters units : 1 datatype : real default_value : 1.0 PON_bury_coeff : + dependencies : base_bio_on longname : Scale factor for burial of PON - subcategory : 4. general parameters (bury coeffs) + subcategory : 5. general parameters (bury coeffs) units : unitless datatype : real default_value : 0.5 POM_bury_frac_max : + dependencies : base_bio_on longname : maximum bury fraction for POM - subcategory : 4. general parameters (bury coeffs) + subcategory : 5. general parameters (bury coeffs) units : unitless datatype : real default_value : 0.8 bSi_bury_frac_max : + dependencies : base_bio_on longname : maximum bury fraction for bSi - subcategory : 4. general parameters (bury coeffs) + subcategory : 5. general parameters (bury coeffs) units : unitless datatype : real default_value : 1.0 ciso_fract_factors : + dependencies : ciso_on longname : Option for which biological fractionation calculation to use - subcategory : 4. general parameters + subcategory : 5. general parameters units : non-numeric datatype : string default_value : Laws auto_mort2_exp : + dependencies : base_bio_on longname : Value of power loss exponent for autotrophs - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : 1.75 zoo_mort2_exp : + dependencies : base_bio_on longname : Value of power loss exponent for zooplankton - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : 1.5 QCaCO3_max : + dependencies : base_bio_on longname : Max CaCO3/C ratio for calcifiers - subcategory : 4. general parameters + subcategory : 5. general parameters units : mmol CaCO3/mmol C datatype : real default_value : 0.40 f_graze_CaCO3_remin : + dependencies : base_bio_on longname : Fraction of spCaCO3 grazing which is remineralized in zooplankton guts - subcategory : 4. general parameters + subcategory : 5. general parameters units : unitless datatype : real default_value : 0.33 @@ -619,8 +763,9 @@ general_parms : general_parms2 : init_bury_coeff_opt : + dependencies : base_bio_on longname : Source of initial burial coefficient - subcategory : 3. config strings + subcategory : 4. config strings units : unitless datatype : string default_value : @@ -640,31 +785,37 @@ general_parms2 : PFT_counts : autotroph_cnt : + dependencies : base_bio_on longname : Number of autotroph classes - subcategory : 1. config PFTs + subcategory : 2. config PFTs units : unitless datatype : integer default_value : default : 1 PFT_defaults == "CESM2" : 3 + PFT_defaults == "None" : 0 cannot change : PFT_defaults == 'CESM2' must set : PFT_defaults == 'user-specified' zooplankton_cnt : + dependencies : base_bio_on longname : Number of zooplankton classes - subcategory : 1. config PFTs + subcategory : 2. config PFTs units : unitless datatype : integer default_value : default : 1 PFT_defaults == "CESM2" : 1 + PFT_defaults == "None" : 0 max_grazer_prey_cnt : + dependencies : base_bio_on longname : Number of grazer prey classes - subcategory : 1. config PFTs + subcategory : 2. config PFTs units : unitless datatype : integer default_value : default : 1 PFT_defaults == "CESM2" : 3 + PFT_defaults == "None" : 0 ################################################################################ # Category 3: PFT_derived_types # @@ -1197,3 +1348,5 @@ tracer_dependent : - 'ALK_ALT_CO2' GRID == "CESM_x3" : *CESM_TRACER_RESTORE GRID == "CESM_x1" : *CESM_TRACER_RESTORE + not base_bio_on : '' + \ No newline at end of file diff --git a/docs/src/dev-guide/add-tracer.rst b/docs/src/dev-guide/add-tracer.rst index cf66c878..f0e77207 100644 --- a/docs/src/dev-guide/add-tracer.rst +++ b/docs/src/dev-guide/add-tracer.rst @@ -26,15 +26,20 @@ Due to the many ways to introduce tracers (different modules, living tracers, et type, public :: marbl_tracer_index_type ! Book-keeping (tracer count and index ranges) integer (int_kind) :: total_cnt = 0 - type (marbl_tracer_count_type) :: ecosys_base + type (marbl_tracer_count_type) :: base_bio + type (marbl_tracer_count_type) :: abio_dic type (marbl_tracer_count_type) :: ciso - ! General tracers + ! base biotic tracers integer (int_kind) :: po4_ind = 0 ! dissolved inorganic phosphate . . . - ! CISO tracers + ! abiotic dic tracers + integer (int_kind) :: abio_dic_ind = 0 ! abiotic dissolved inorganic carbon + integer (int_kind) :: abio_di14c_ind = 0 ! abiotic dissolved inorganic carbon 14 + + ! carbon isotope tracers integer (int_kind) :: di13c_ind = 0 ! dissolved inorganic carbon 13 . . @@ -66,19 +71,20 @@ For example, here we set in index for the refractory DOC tracer: .. block comes from marbl_interface_private_types .. code-block:: fortran - subroutine tracer_index_constructor(this, ciso_on, lvariable_PtoC, autotroph_settings, & - zooplankton_settings, marbl_status_log) - . - . - . - ! General ecosys tracers - . - . - . - call this%add_tracer_index('docr', 'ecosys_base', this%docr_ind, marbl_status_log) + subroutine tracer_index_constructor(this, base_bio_on, abio_dic_on, ciso_on, lvariable_PtoC, & + autotroph_settings, zooplankton_settings, marbl_status_log) . . . + ! Base biotic tracers + if (base_bio_on) then + . + . + . + call this%add_tracer_index('docr', 'base_bio', this%docr_ind, marbl_status_log) + . + . + . end subroutine tracer_index_constructor .. note:: @@ -106,40 +112,39 @@ MARBL provides the following metadata to describe each tracer: Note that the ``units`` will depend on whether MARBL is running in ``cgs`` or ``mks``, so a ``unit_system_type`` object will be passed around in this step. -There are a few different subroutines in ``marbl_init_mod.F90`` to define the metadata for different classes of tracers. -(Metadata for carbon isotope tracers is handled in ``marbl_ciso_init_mod::marbl_ciso_init_tracer_metadata``.) +There are a few different subroutines in ``marbl_init_tracer_metadata_mod.F90`` to define the metadata for different classes of tracers. -.. block comes from marbl_init_mod +.. block comes from marbl_init_tracer_metadata_mod .. code-block:: fortran subroutine marbl_init_tracer_metadata - subroutine marbl_init_non_autotroph_tracer_metadata - subroutine marbl_init_non_autotroph_tracers_metadata - subroutine marbl_init_zooplankton_tracer_metadata - subroutine marbl_init_autotroph_tracer_metadata + subroutine init_non_autotroph_tracer_metadata + subroutine init_zooplankton_tracer_metadata + subroutine init_autotroph_tracer_metadata -The last three subroutines above are called from ``marbl_init_tracer_metadata()``, and ``marbl_init_non_autotroph_tracer_metadata()`` is called from ``marbl_init_non_autotroph_tracers_metadata()`` -Prior to those calls, ``marbl_init_tracer_metadata()`` sets two attributes in the metadata type: +The last three subroutines above are called from ``marbl_init_tracer_metadata()``. +Prior to those calls, ``marbl_init_tracer_metadata()`` sets the `lfull_depth_tavg` attribute in the metadata type: -.. block from marbl_init_mod +.. block from marbl_init_tracer_metadata_mod .. code-block:: fortran marbl_tracer_metadata(:)%lfull_depth_tavg = .true. - marbl_tracer_metadata(:)%tracer_module_name = 'ecosys' -Metadata for all base ecosystem non-living tracers is set in ``marbl_init_non_autotroph_tracers_metadata()``. +This value may be overwritten by the `lecovars_full_depth_tavg` setting for some tracers. + +Metadata for all non-living tracers is set in ``marbl_init_non_autotroph_tracers_metadata()``. For example, here is where the dissolved inorganic phosphate index is set: -.. block from marbl_init_mod +.. block from marbl_init_tracer_metadata_mod .. code-block:: fortran - subroutine marbl_init_non_autotroph_tracer_metadata(short_name, long_name, unit_system, & - marbl_tracer_metadata) - . - . - . - call marbl_init_non_autotroph_tracer_metadata('PO4', 'Dissolved Inorganic Phosphate', & - unit_system, marbl_tracer_metadata(marbl_tracer_indices%po4_ind)) + subroutine marbl_init_tracer_metadata(unit_system, marbl_tracer_indices, marbl_tracer_metadata) + . + . + . + if (base_bio_on) then + call init_non_autotroph_tracer_metadata('PO4', 'Dissolved Inorganic Phosphate', 'base_bio', & + unit_system, marbl_tracer_metadata(marbl_tracer_indices%po4_ind)) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Step 4. Compute surface flux for new tracer (if necessary) @@ -175,21 +180,17 @@ Surface fluxes are computed in ``marbl_surface_flux_mod::marbl_surface_flux_comp . . !----------------------------------------------------------------------- - ! compute CO2 flux, computing disequilibrium one row at a time + ! compute O2 flux (if necessary) !----------------------------------------------------------------------- - if (lflux_gas_o2 .or. lflux_gas_co2) then - . - . - . - if (lflux_gas_o2) then - . - . - . - pv_o2(:) = xkw_ice(:) * sqrt(660.0_r8 / schmidt_o2(:)) - o2sat(:) = ap_used(:) * o2sat_1atm(:) - flux_o2_loc(:) = pv_o2(:) * (o2sat(:) - tracers_at_surface(:, o2_ind)) - surface_fluxes(:, o2_ind) = surface_fluxes(:, o2_ind) + flux_o2_loc(:) + if (lflux_gas_o2) then + . + . + . + pv_o2(:) = xkw_ice(:) * sqrt(660.0_r8 / schmidt_o2(:)) + o2sat(:) = ap_used(:) * o2sat_1atm(:) + flux_o2_loc(:) = pv_o2(:) * (o2sat(:) - tracers_at_surface(:, o2_ind)) + surface_fluxes(:, o2_ind) = surface_fluxes(:, o2_ind) + flux_o2_loc(:) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Step 5. Compute tracer tendency @@ -207,7 +208,7 @@ This is done in ``marbl_interior_tendency_mod::interior_tendency_compute``: . . call compute_PAR(domain, interior_tendency_forcings, interior_tendency_forcing_indices, & - totalChl_local, unit_system, PAR) + autotroph_local, unit_system, PAR) call compute_autotroph_elemental_ratios(km, autotroph_local, marbl_tracer_indices, tracer_local, & autotroph_derived_terms) @@ -349,9 +350,13 @@ The block of code defining the tracers looks like this: _tracer_list : # Non-living tracers PO4 : + dependencies : + base_bio_on : .true. long_name : Dissolved Inorganic Phosphate units : mmol/m^3 NO3 : + dependencies : + base_bio_on : .true. long_name : Dissolved Inorganic Nitrate units : mmol/m^3 . diff --git a/src/marbl_abio_dic_diagnostics_mod.F90 b/src/marbl_abio_dic_diagnostics_mod.F90 new file mode 100644 index 00000000..20f8f303 --- /dev/null +++ b/src/marbl_abio_dic_diagnostics_mod.F90 @@ -0,0 +1,353 @@ +module marbl_abio_dic_diagnostics_mod + + use marbl_constants_mod, only : c0 + use marbl_constants_mod, only : c1 + + use marbl_kinds_mod, only : r8 + use marbl_kinds_mod, only : int_kind + use marbl_kinds_mod, only : char_len + + use marbl_settings_mod, only : lflux_gas_co2 + use marbl_settings_mod, only : unit_system_type + use marbl_settings_mod, only : labio_derivative_diags + + use marbl_interface_public_types, only : marbl_diagnostics_type + + + use marbl_logging, only : marbl_log_type + use marbl_logging, only : marbl_logging_add_diagnostics_error + + use marbl_diagnostics_share_mod, only : marbl_interior_tendency_diag_ind + use marbl_diagnostics_share_mod, only : marbl_surface_flux_diag_ind + + implicit none + private + + public :: marbl_abio_dic_diagnostics_init + public :: marbl_abio_dic_diagnostics_surface_flux_compute + public :: marbl_abio_dic_diagnostics_interior_tendency_compute + +contains + + !*********************************************************************** + + subroutine marbl_abio_dic_diagnostics_init( & + unit_system, & + marbl_interior_tendency_diags, & + marbl_surface_flux_diags, & + marbl_status_log) + + use marbl_settings_mod, only : abio_dic_on + + type(unit_system_type), intent(in) :: unit_system + type(marbl_diagnostics_type), intent(inout) :: marbl_interior_tendency_diags + type(marbl_diagnostics_type), intent(inout) :: marbl_surface_flux_diags + type(marbl_log_type), intent(inout) :: marbl_status_log + + !----------------------------------------------------------------------- + ! local variables + !----------------------------------------------------------------------- + character(len=*), parameter :: subname = 'marbl_abio_dic_diagnostics_mod:marbl_abio_dic_diagnostics_init' + logical :: truncate + character(len=char_len) :: lname, sname, units, vgrid + character(len=char_len) :: vel_units + + if (.not. abio_dic_on) return + + !----------------------------------------------------------------- + ! Units for some diagnostics depend on unit system + !----------------------------------------------------------------- + write(vel_units, "(2A)") trim(unit_system%L), '/s' + + !----------------------------------------------------------------- + ! Surface forcing diagnostics + !----------------------------------------------------------------- + + associate(& + ind => marbl_surface_flux_diag_ind, & + diags => marbl_surface_flux_diags & + ) + + if (lflux_gas_co2) then + lname = 'CO2 Atmospheric Partial Pressure for Abiotic DIC Tracer Fluxes' + sname = 'ABIO_pCO2' + units = 'ppm' + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%ABIO_pCO2, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = 'Atmospheric Delta 14C for Abiotic DIC Tracer Fluxes' + sname = 'ABIO_D14C_atm' + units = 'permil' + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%ABIO_D14C_atm, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = 'CO2 Star for Abiotic DIC Tracer Fluxes' + sname = 'ABIO_CO2STAR' + units = unit_system%conc_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%ABIO_CO2STAR, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = 'D CO2 Star for Abiotic DIC Tracer Fluxes' + sname = 'ABIO_DCO2STAR' + units = unit_system%conc_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%ABIO_DCO2STAR, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = 'Surface pCO2 for Abiotic DIC Tracer Fluxes' + sname = 'ABIO_pCO2SURF' + units = 'ppmv' + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%ABIO_pCO2SURF, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = 'D pCO2 for Abiotic DIC Tracer Fluxes' + sname = 'ABIO_DpCO2' + units = 'ppmv' + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%ABIO_DpCO2, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = 'Surface pH for Abiotic DIC Tracer Fluxes' + sname = 'ABIO_PH' + units = '1' + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%ABIO_PH, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = 'Surface Alkalinity for Abiotic DIC Tracer Fluxes' + sname = 'ABIO_ALK_SURF' + units = unit_system%alk_conc_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%ABIO_ALK_SURF, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = 'Surface Gas Flux of Abiotic DIC' + sname = 'ABIO_FG_DIC' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%ABIO_FG_DIC, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = 'Surface Gas Flux of Abiotic DI14C' + sname = 'ABIO_FG_DI14C' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%ABIO_FG_DI14C, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + if (labio_derivative_diags) then + lname = 'Derivative of ABIO_FG_DIC wrt ABIO_DIC' + sname = 'd_SF_ABIO_DIC_d_ABIO_DIC' + units = vel_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%d_SF_ABIO_DIC_d_ABIO_DIC, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = 'Derivative of ABIO_FG_DI14C wrt ABIO_DIC' + sname = 'd_SF_ABIO_DI14C_d_ABIO_DIC' + units = vel_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%d_SF_ABIO_DI14C_d_ABIO_DIC, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = 'Derivative of ABIO_FG_DI14C wrt ABIO_DI14C' + sname = 'd_SF_ABIO_DI14C_d_ABIO_DI14C' + units = vel_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%d_SF_ABIO_DI14C_d_ABIO_DI14C, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + end if + + end if + + end associate + + !----------------------------------------------------------------- + ! Interior tendency diagnostics + !----------------------------------------------------------------- + + associate(& + ind => marbl_interior_tendency_diag_ind, & + diags => marbl_interior_tendency_diags & + ) + + lname = 'Oceanic Delta 14C for Abiotic DIC Tracer Fluxes' + sname = 'ABIO_D14C_ocn' + units = 'permil' + vgrid = 'layer_avg' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%ABIO_D14C_ocn, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + end associate + + end subroutine marbl_abio_dic_diagnostics_init + + !*********************************************************************** + + subroutine marbl_abio_dic_diagnostics_surface_flux_compute( & + surface_flux_forcing_ind, & + surface_flux_forcings, & + co2star, & + dco2star, & + pco2surf, & + dpco2, & + ph_surf, & + alk_surf, & + fg_dic, & + fg_di14c, & + derivative_terms, & + marbl_surface_flux_diags) + + ! !DESCRIPTION: + ! Compute surface fluxes for ecosys tracer module. + + use marbl_interface_private_types, only : marbl_surface_flux_forcing_indexing_type + use marbl_interface_public_types, only : marbl_forcing_fields_type + + type(marbl_surface_flux_forcing_indexing_type), intent(in) :: surface_flux_forcing_ind + type(marbl_forcing_fields_type), intent(in) :: surface_flux_forcings(:) + real (r8), dimension(:), intent(in) :: co2star + real (r8), dimension(:), intent(in) :: dco2star + real (r8), dimension(:), intent(in) :: pco2surf + real (r8), dimension(:), intent(in) :: dpco2 + real (r8), dimension(:), intent(in) :: ph_surf + real (r8), dimension(:), intent(in) :: alk_surf + real (r8), dimension(:), intent(in) :: fg_dic + real (r8), dimension(:), intent(in) :: fg_di14c + real (r8), dimension(:,:), intent(in) :: derivative_terms + type(marbl_diagnostics_type), intent(inout) :: marbl_surface_flux_diags + + associate( & + xco2 => surface_flux_forcings(surface_flux_forcing_ind%xco2_id)%field_0d, & + d14c => surface_flux_forcings(surface_flux_forcing_ind%d14c_id)%field_0d, & + diags => marbl_surface_flux_diags%diags, & + ind => marbl_surface_flux_diag_ind & + ) + + if (lflux_gas_co2) then + diags(ind%ABIO_pCO2)%field_2d(:) = xco2(:) + diags(ind%ABIO_D14C_atm)%field_2d(:) = d14c(:) + diags(ind%ABIO_CO2STAR)%field_2d(:) = co2star(:) + diags(ind%ABIO_DCO2STAR)%field_2d(:) = dco2star(:) + diags(ind%ABIO_pCO2SURF)%field_2d(:) = pco2surf(:) + diags(ind%ABIO_DpCO2)%field_2d(:) = dpco2(:) + diags(ind%ABIO_PH)%field_2d(:) = ph_surf(:) + diags(ind%ABIO_ALK_SURF)%field_2d(:) = alk_surf(:) + diags(ind%ABIO_FG_DIC)%field_2d(:) = fg_dic(:) + diags(ind%ABIO_FG_DI14C)%field_2d(:) = fg_di14c(:) + if (labio_derivative_diags) then + diags(ind%d_SF_ABIO_DIC_d_ABIO_DIC)%field_2d(:) = derivative_terms(:,1) + diags(ind%d_SF_ABIO_DI14C_d_ABIO_DIC)%field_2d(:) = derivative_terms(:,2) + diags(ind%d_SF_ABIO_DI14C_d_ABIO_DI14C)%field_2d(:) = derivative_terms(:,3) + end if + end if + + end associate + + end subroutine marbl_abio_dic_diagnostics_surface_flux_compute + + !***************************************************************************** + + subroutine marbl_abio_dic_diagnostics_interior_tendency_compute(dic, di14c, interior_tendency_diags) + + !--------------------------------------------------------------------- + ! !DESCRIPTION: + ! Update marbl_interior_abio_dic_diags data type + !--------------------------------------------------------------------- + + real(r8), intent(in) :: dic(:) + real(r8), intent(in) :: di14c(:) + type(marbl_diagnostics_type), intent(inout) :: interior_tendency_diags + + associate(& + ! diagnostics + diags => interior_tendency_diags%diags, & + ind => marbl_interior_tendency_diag_ind & + ) + + where (dic(:) == c0) + diags(ind%ABIO_D14C_ocn)%field_3d(:,1) = c0 + elsewhere + diags(ind%ABIO_D14C_ocn)%field_3d(:,1) = (di14c(:)/dic(:) - c1) * 1000._r8 + end where + end associate + +end subroutine marbl_abio_dic_diagnostics_interior_tendency_compute + + !*********************************************************************** + +end module marbl_abio_dic_diagnostics_mod diff --git a/src/marbl_abio_dic_interior_tendency_mod.F90 b/src/marbl_abio_dic_interior_tendency_mod.F90 new file mode 100644 index 00000000..7d08cc6a --- /dev/null +++ b/src/marbl_abio_dic_interior_tendency_mod.F90 @@ -0,0 +1,52 @@ +module marbl_abio_dic_interior_tendency_mod + + use marbl_kinds_mod, only : r8 + + use marbl_constants_mod, only : c0 + use marbl_constants_mod, only : c14_lambda + + use marbl_settings_mod, only : abio_dic_on + + use marbl_interface_private_types, only : marbl_tracer_index_type + + use marbl_interface_public_types, only : marbl_diagnostics_type + + use marbl_abio_dic_diagnostics_mod, only : marbl_abio_dic_diagnostics_interior_tendency_compute + + implicit none + private + + public :: marbl_abio_dic_interior_tendency_compute + +contains + + subroutine marbl_abio_dic_interior_tendency_compute(marbl_tracer_indices, & + tracer_local, & + interior_tendency_diags, & + interior_tendencies) + + type(marbl_tracer_index_type), intent(in) :: marbl_tracer_indices + real (r8), intent(in) :: tracer_local(:,:) + type(marbl_diagnostics_type), intent(inout) :: interior_tendency_diags + real(r8), intent(inout) :: interior_tendencies(:,:) ! (tracer_cnt, km) computed source/sink terms + + ! Return immediately if not running with abiotic dic tracer module + if (.not. abio_dic_on) return + + associate(& + ! Tracer + dic => tracer_local(marbl_tracer_indices%abio_dic_ind, :), & + di14c => tracer_local(marbl_tracer_indices%abio_di14c_ind, :), & + ! Tracer indices + di14c_ind => marbl_tracer_indices%abio_di14c_ind & + ) + + interior_tendencies(di14c_ind, :) = -c14_lambda * di14c(:) + + call marbl_abio_dic_diagnostics_interior_tendency_compute(dic, di14c, interior_tendency_diags) + + end associate + + end subroutine marbl_abio_dic_interior_tendency_compute + +end module marbl_abio_dic_interior_tendency_mod diff --git a/src/marbl_abio_dic_surface_flux_mod.F90 b/src/marbl_abio_dic_surface_flux_mod.F90 new file mode 100644 index 00000000..fd9a42e2 --- /dev/null +++ b/src/marbl_abio_dic_surface_flux_mod.F90 @@ -0,0 +1,281 @@ +module marbl_abio_dic_surface_flux_mod + + use marbl_kinds_mod, only : int_kind + use marbl_kinds_mod, only : r8 + + use marbl_constants_mod, only : c0 + use marbl_constants_mod, only : p5 + use marbl_constants_mod, only : c1 + use marbl_constants_mod, only : rho_sw + + use marbl_settings_mod, only : lflux_gas_co2 + use marbl_settings_mod, only : unit_system_type + use marbl_settings_mod, only : xkw_coeff + use marbl_settings_mod, only : del_ph + use marbl_settings_mod, only : phlo_surf_init + use marbl_settings_mod, only : phhi_surf_init + use marbl_settings_mod, only : abio_dic_on + use marbl_settings_mod, only : labio_derivative_diags + + use marbl_interface_private_types, only : marbl_tracer_index_type + use marbl_interface_private_types, only : marbl_surface_flux_saved_state_indexing_type + use marbl_interface_private_types, only : marbl_surface_flux_forcing_indexing_type + use marbl_interface_private_types, only : marbl_surface_flux_internal_type + use marbl_interface_private_types, only : co2calc_coeffs_type + use marbl_interface_private_types, only : co2calc_state_type + + use marbl_interface_public_types, only : marbl_diagnostics_type + use marbl_interface_public_types, only : marbl_saved_state_type + use marbl_interface_public_types, only : marbl_forcing_fields_type + + use marbl_co2calc_mod, only : marbl_co2calc_surface + + use marbl_schmidt_number_mod, only : schmidt_co2_surf + + use marbl_abio_dic_diagnostics_mod, only : marbl_abio_dic_diagnostics_surface_flux_compute + + use marbl_logging, only : marbl_log_type + + implicit none + private + + public :: marbl_abio_dic_surface_flux_compute + +contains + + subroutine marbl_abio_dic_surface_flux_compute(& + num_elements, & + tracers_at_surface, & + marbl_tracer_indices, & + saved_state_ind, & + surface_flux_forcing_ind, & + surface_flux_forcings, & + unit_system, & + saved_state, & + surface_flux_internal, & + surface_flux_diags, & + surface_fluxes, & + co2calc_coeffs, & + co2calc_state, & + marbl_status_log) + + integer(int_kind), intent(in) :: num_elements + real (r8), intent(in) :: tracers_at_surface(:,:) + type(marbl_tracer_index_type), intent(in) :: marbl_tracer_indices + type(marbl_surface_flux_saved_state_indexing_type), intent(in) :: saved_state_ind + type(marbl_surface_flux_forcing_indexing_type), intent(in) :: surface_flux_forcing_ind + type(marbl_forcing_fields_type), intent(in) :: surface_flux_forcings(:) + type(unit_system_type), intent(in) :: unit_system + type(marbl_saved_state_type), intent(inout) :: saved_state + type(marbl_surface_flux_internal_type), intent(inout) :: surface_flux_internal + type(marbl_diagnostics_type), intent(inout) :: surface_flux_diags + real(r8), intent(inout) :: surface_fluxes(:, :) + type(co2calc_coeffs_type), intent(inout) :: co2calc_coeffs + type(co2calc_state_type), intent(inout) :: co2calc_state + type(marbl_log_type), intent(inout) :: marbl_status_log + + real(r8) :: alk_surf(num_elements) ! local alkalinity + real(r8) :: SiO2(num_elements) ! Abiotic silicate + real(r8) :: PO4(num_elements) ! Abiotic phosphate + real(r8) :: R14C_ocn(num_elements) ! Rocn = DIC14/DIC + real(r8) :: R14C_atm(num_elements) ! Ratm = 1+ D14C/1000 + real(r8) :: fg_dic(num_elements) ! Carbon gas flux + real(r8) :: fg_di14c(num_elements) ! Isotopic carbon gas flux + real(r8) :: phlo(num_elements) ! lower bound for ph in solver + real(r8) :: phhi(num_elements) ! upper bound for ph in solver + real(r8) :: co2star(num_elements) + real(r8) :: dco2star(num_elements) + real(r8) :: pco2surf(num_elements) + real(r8) :: dpco2(num_elements) + real(r8) :: co3(num_elements) + ! Terms for computing derivative diagnostics + real(r8) :: ph_surf_pert(num_elements) + real(r8) :: phlo_pert(num_elements) + real(r8) :: phhi_pert(num_elements) + real(r8) :: co2star_pert_p1(num_elements) + real(r8) :: co2star_pert_m1(num_elements) + real(r8) :: dco2star_pert(num_elements) + real(r8) :: pco2surf_pert(num_elements) + real(r8) :: dpco2_pert(num_elements) + real(r8) :: co3_pert(num_elements) + real(r8) :: derivative_terms(num_elements, 3) ! d[SF_ABIO_DIC]/d[ABIO_DIC] + ! d[SF_ABIO_DI14C]/d[ABIO_DIC] + ! d[SF_ABIO_DI14C]/d[ABIO_DI14C] + + ! Return immediately if not running with abiotic dic tracer module + if (.not. abio_dic_on) return + + associate(& + ! Forcing fields from GCM + sst => surface_flux_forcings(surface_flux_forcing_ind%sst_id)%field_0d, & + sss => surface_flux_forcings(surface_flux_forcing_ind%sss_id)%field_0d, & + ! TODO: need to add abio_xco2_id to surface flux forcing inds + xco2 => surface_flux_forcings(surface_flux_forcing_ind%xco2_id)%field_0d, & + ap_used => surface_flux_forcings(surface_flux_forcing_ind%atm_pressure_id)%field_0d, & + d14c => surface_flux_forcings(surface_flux_forcing_ind%d14c_id)%field_0d, & + ! Values computed for abio and bio + pv_co2 => surface_flux_internal%pv_co2(:), & + ! Saved state + ph_surf => saved_state%state(saved_state_ind%abio_dic_ph_surf)%field_2d, & + ! Tracer indices + dic_ind => marbl_tracer_indices%abio_dic_ind, & + di14c_ind => marbl_tracer_indices%abio_di14c_ind & + ) + + !----------------------------------------------------------------------- + ! Set C14 ratios + !----------------------------------------------------------------------- + where (tracers_at_surface(:,dic_ind) > c0) + R14C_ocn = tracers_at_surface(:,di14c_ind) / tracers_at_surface(:,dic_ind) + else where + R14C_ocn = c0 + end where + R14C_atm = c1 + d14c(:) * 1.0e-3_r8 + + !----------------------------------------------------------------------- + ! Use constant concentrations of silicate and phosphate + !----------------------------------------------------------------------- + + ! These come from Orr et al. GMD 2017 + ! 7.5 nmol / g -> mmol/m3 or nmol/cm3 + SiO2 = (7.5_r8 * (unit_system%nmol2mol_prefix * unit_system%mass2g)) * rho_sw + ! 0.5 nmol / g -> mmol/m3 or nmol/cm3 + PO4 = (0.5_r8 * (unit_system%nmol2mol_prefix * unit_system%mass2g)) * rho_sw + + !----------------------------------------------------------------------- + ! Compute CO2 flux + !----------------------------------------------------------------------- + + if (lflux_gas_co2) then + where (ph_surf(:) /= c0) + phlo(:) = ph_surf(:) - del_ph + phhi(:) = ph_surf(:) + del_ph + elsewhere + phlo(:) = phlo_surf_init + phhi(:) = phhi_surf_init + end where + phlo_pert(:) = phlo(:) + phhi_pert(:) = phhi(:) + + ! In POP, ALK_bar_global = 2310._r8 microeq/kg = 2310._r8 neq/g + ! and ocn_ref_salinity comes from shr_const (SHR_CONST_OCN_REF_SAL = 34.7) + ! Orr et al eq (27): + ! 2297 micromol / kg + ! Sbar = "global- and annual- mean salinity" + alk_surf(:) = (2310._r8 * (unit_system%nmol2mol_prefix * unit_system%mass2g)) * rho_sw * sss(:) * (c1 / 34.7_r8) + + ! Note the following computes a new ph_surf + ! pass in sections of surface_flux_forcings instead of associated vars because of problems with intel/15.0.3 + call marbl_co2calc_surface(& + num_elements = num_elements, & + lcomp_co2calc_coeffs = .true., & + dic_in = tracers_at_surface(:,dic_ind), & + xco2_in = xco2(:), & + ta_in = alk_surf(:), & + pt_in = PO4(:), & + sit_in = SiO2(:), & + temp = sst(:), & + salt = sss(:), & + atmpres = ap_used(:), & + unit_system = unit_system, & + co2calc_coeffs = co2calc_coeffs, & + co2calc_state = co2calc_state, & + co3 = co3(:), & + co2star = co2star, & + dco2star = dco2star, & + pco2surf = pco2surf, & + dpco2 = dpco2, & + phlo = phlo, & + phhi = phhi, & + ph = ph_surf, & + marbl_status_log = marbl_status_log) + + fg_dic(:) = pv_co2(:) * dco2star(:) + fg_di14c(:) = pv_co2(:) * ((dco2star(:) + co2star(:)) * R14C_atm(:) - co2star(:) * R14C_ocn(:)) + surface_fluxes(:, dic_ind) = surface_fluxes(:, dic_ind) + fg_dic(:) + surface_fluxes(:, di14c_ind) = surface_fluxes(:, di14c_ind) + fg_di14c(:) + + ! Compute derivative diagnostics + derivative_terms(:,:) = c0 + if (labio_derivative_diags) then + call marbl_co2calc_surface(& + num_elements = num_elements, & + lcomp_co2calc_coeffs = .false., & + dic_in = tracers_at_surface(:,dic_ind) + c1, & + xco2_in = xco2(:), & + ta_in = alk_surf(:), & + pt_in = PO4(:), & + sit_in = SiO2(:), & + temp = sst(:), & + salt = sss(:), & + atmpres = ap_used(:), & + unit_system = unit_system, & + phlo = phlo_pert, & + phhi = phhi_pert, & + ph = ph_surf_pert, & + co3 = co3_pert(:), & + co2calc_coeffs = co2calc_coeffs, & + co2calc_state = co2calc_state, & + co2star = co2star_pert_p1, & + dco2star = dco2star_pert, & + pco2surf = pco2surf_pert, & + dpco2 = dpco2_pert, & + marbl_status_log = marbl_status_log) + call marbl_co2calc_surface(& + num_elements = num_elements, & + lcomp_co2calc_coeffs = .false., & + dic_in = tracers_at_surface(:,dic_ind) - c1, & + xco2_in = xco2(:), & + ta_in = alk_surf(:), & + pt_in = PO4(:), & + sit_in = SiO2(:), & + temp = sst(:), & + salt = sss(:), & + atmpres = ap_used(:), & + unit_system = unit_system, & + phlo = phlo_pert, & + phhi = phhi_pert, & + ph = ph_surf_pert, & + co3 = co3_pert(:), & + co2calc_coeffs = co2calc_coeffs, & + co2calc_state = co2calc_state, & + co2star = co2star_pert_m1, & + dco2star = dco2star_pert, & + pco2surf = pco2surf_pert, & + dpco2 = dpco2_pert, & + marbl_status_log = marbl_status_log) + derivative_terms(:,1) = -p5 * (co2star_pert_p1(:) - co2star_pert_m1(:)) * pv_co2(:) + where (tracers_at_surface(:,dic_ind) > 0) + derivative_terms(:,2) = -p5 * (co2star_pert_p1(:) / (tracers_at_surface(:,dic_ind) + c1) & + - co2star_pert_m1(:) / (tracers_at_surface(:,dic_ind) - c1)) & + * tracers_at_surface(:,di14c_ind) * pv_co2(:) + derivative_terms(:,3) = -pv_co2(:) * co2star(:) / tracers_at_surface(:,dic_ind) + else where + derivative_terms(:,2) = c0 + derivative_terms(:,3) = c0 + end where + end if + + ! update abiotic DIC diagnostics + call marbl_abio_dic_diagnostics_surface_flux_compute( & + surface_flux_forcing_ind, & + surface_flux_forcings, & + co2star, & + dco2star, & + pco2surf, & + dpco2, & + ph_surf, & + alk_surf, & + fg_dic, & + fg_di14c, & + derivative_terms, & + surface_flux_diags) + + end if ! lflux_gas_co2 + + end associate + + + end subroutine marbl_abio_dic_surface_flux_compute + +end module marbl_abio_dic_surface_flux_mod diff --git a/src/marbl_ciso_diagnostics_mod.F90 b/src/marbl_ciso_diagnostics_mod.F90 index 685beb1e..5cb01a71 100644 --- a/src/marbl_ciso_diagnostics_mod.F90 +++ b/src/marbl_ciso_diagnostics_mod.F90 @@ -26,7 +26,7 @@ module marbl_ciso_diagnostics_mod public :: marbl_ciso_diagnostics_init public :: marbl_ciso_diagnostics_surface_flux_compute - public :: store_diagnostics_ciso_interior + public :: marbl_ciso_diagnostics_interior_tendency_compute contains @@ -113,7 +113,7 @@ subroutine marbl_ciso_diagnostics_init( & return end if - lname = 'Atmospheric Delta 13C in permil' + lname = 'Atmospheric Delta 13C' sname = 'CISO_D13C_atm' units = 'permil' vgrid = 'none' @@ -221,7 +221,7 @@ subroutine marbl_ciso_diagnostics_init( & return end if - lname = 'Atmospheric Delta 14C in permil' + lname = 'Atmospheric Delta 14C' sname = 'CISO_D14C_atm' units = 'permil' vgrid = 'none' @@ -608,7 +608,7 @@ subroutine marbl_ciso_diagnostics_init( & end if ! Nonstandard autotroph 2D and 3D fields for each autotroph - if (.not.ind%lconstructed()) then + if (.not.ind%lallocated()) then allocate(ind%CISO_eps_autotroph(autotroph_cnt)) allocate(ind%CISO_mui_to_co2star(autotroph_cnt)) allocate(ind%CISO_Ca13CO3_form(autotroph_cnt)) @@ -969,7 +969,7 @@ end subroutine marbl_ciso_diagnostics_surface_flux_compute !***************************************************************************** - subroutine store_diagnostics_ciso_interior(& + subroutine marbl_ciso_diagnostics_interior_tendency_compute(& marbl_domain, & autotroph_d13C, & autotroph_d14C, & @@ -1063,7 +1063,7 @@ subroutine store_diagnostics_ciso_interior(& !----------------------------------------------------------------------- ! local variables !----------------------------------------------------------------------- - character(len=*), parameter :: subname = 'marbl_ciso_diagnostics_mod:store_diagnostics_ciso_interior' + character(len=*), parameter :: subname = 'marbl_ciso_diagnostics_mod:marbl_ciso_diagnostics_interior_tendency_compute' character(len=char_len) :: log_message integer (int_kind) :: k, n, auto_ind real (r8) :: work(marbl_domain%km) @@ -1222,7 +1222,7 @@ subroutine store_diagnostics_ciso_interior(& end associate - end subroutine store_diagnostics_ciso_interior + end subroutine marbl_ciso_diagnostics_interior_tendency_compute !*********************************************************************** diff --git a/src/marbl_ciso_init_mod.F90 b/src/marbl_ciso_init_mod.F90 deleted file mode 100644 index d569384e..00000000 --- a/src/marbl_ciso_init_mod.F90 +++ /dev/null @@ -1,136 +0,0 @@ -module marbl_ciso_init_mod - - use marbl_kinds_mod, only : int_kind - use marbl_settings_mod, only : ciso_on - use marbl_interface_public_types, only : marbl_tracer_metadata_type - use marbl_interface_private_types, only : marbl_tracer_index_type - - implicit none - private - - public :: marbl_ciso_init_tracer_metadata - -contains - - !***************************************************************************** - - subroutine marbl_ciso_init_tracer_metadata(unit_system, & - marbl_tracer_indices, & - marbl_tracer_metadata) - - ! Set tracer and forcing metadata - use marbl_settings_mod, only : lecovars_full_depth_tavg - use marbl_settings_mod, only : autotroph_cnt - use marbl_settings_mod, only : autotroph_settings - use marbl_settings_mod, only : unit_system_type - - type(unit_system_type), intent(in) :: unit_system - type(marbl_tracer_index_type), intent(in) :: marbl_tracer_indices - type(marbl_tracer_metadata_type), intent(inout) :: marbl_tracer_metadata(:) ! descriptors for each tracer - - !----------------------------------------------------------------------- - ! local variables - !----------------------------------------------------------------------- - integer (int_kind) :: n ! tracer index - integer (int_kind) :: auto_ind ! autotroph functional group index - - if (.not. ciso_on) return - - !----------------------------------------------------------------------- - ! initialize non-autotroph metadata values - !----------------------------------------------------------------------- - - associate(di13c_ind => marbl_tracer_indices%di13c_ind, & - do13ctot_ind => marbl_tracer_indices%do13ctot_ind, & - zootot13C_ind => marbl_tracer_indices%zootot13C_ind, & - di14c_ind => marbl_tracer_indices%di14c_ind, & - do14ctot_ind => marbl_tracer_indices%do14ctot_ind, & - zootot14C_ind => marbl_tracer_indices%zootot14C_ind, & - ciso_ind_beg => marbl_tracer_indices%ciso%ind_beg, & - ciso_ind_end => marbl_tracer_indices%ciso%ind_end & - ) - - ! All CISO tracers share units, tend_units, flux_units, and - ! tracer_module_name - do n=ciso_ind_beg,ciso_ind_end - marbl_tracer_metadata(n)%units = unit_system%conc_units - marbl_tracer_metadata(n)%tend_units = unit_system%conc_tend_units - marbl_tracer_metadata(n)%flux_units = unit_system%conc_flux_units - marbl_tracer_metadata(n)%tracer_module_name = 'ciso' - end do - marbl_tracer_metadata(di13c_ind)%short_name='DI13C' - marbl_tracer_metadata(di13c_ind)%long_name='Dissolved Inorganic Carbon-13' - - marbl_tracer_metadata(do13ctot_ind)%short_name='DO13Ctot' - marbl_tracer_metadata(do13ctot_ind)%long_name='Dissolved Organic Carbon-13 (semi-labile+refractory)' - - marbl_tracer_metadata(zootot13C_ind)%short_name='zootot13C' - marbl_tracer_metadata(zootot13C_ind)%long_name='Zooplankton Carbon-13 (sum over all zooplankton)' - - marbl_tracer_metadata(di14c_ind)%short_name='DI14C' - marbl_tracer_metadata(di14c_ind)%long_name='Dissolved Inorganic Carbon-14' - - marbl_tracer_metadata(do14ctot_ind)%short_name='DO14Ctot' - marbl_tracer_metadata(do14ctot_ind)%long_name='Dissolved Organic Carbon-14 (semi-labile+refractory)' - - marbl_tracer_metadata(zootot14C_ind)%short_name='zootot14C' - marbl_tracer_metadata(zootot14C_ind)%long_name='Zooplankton Carbon-14 (sum over all zooplankton)' - - !----------------------------------------------------------------------- - ! initialize autotroph tracer_d values and tracer indices - !----------------------------------------------------------------------- - - do auto_ind = 1, autotroph_cnt - n = marbl_tracer_indices%auto_inds(auto_ind)%C13_ind - marbl_tracer_metadata(n)%short_name = trim(autotroph_settings(auto_ind)%sname) // '13C' - marbl_tracer_metadata(n)%long_name = trim(autotroph_settings(auto_ind)%lname) // ' Carbon-13' - - n = marbl_tracer_indices%auto_inds(auto_ind)%C14_ind - marbl_tracer_metadata(n)%short_name = trim(autotroph_settings(auto_ind)%sname) // '14C' - marbl_tracer_metadata(n)%long_name = trim(autotroph_settings(auto_ind)%lname) // ' Carbon-14' - - n = marbl_tracer_indices%auto_inds(auto_ind)%Ca13CO3_ind - if (n .gt. 0) then - marbl_tracer_metadata(n)%short_name = trim(autotroph_settings(auto_ind)%sname) // 'Ca13CO3' - marbl_tracer_metadata(n)%long_name = trim(autotroph_settings(auto_ind)%lname) // ' Ca13CO3' - end if - - n = marbl_tracer_indices%auto_inds(auto_ind)%Ca14CO3_ind - if (n .gt. 0) then - marbl_tracer_metadata(n)%short_name = trim(autotroph_settings(auto_ind)%sname) // 'Ca14CO3' - marbl_tracer_metadata(n)%long_name = trim(autotroph_settings(auto_ind)%lname) // ' Ca14CO3' - endif - end do - - !----------------------------------------------------------------------- - ! set lfull_depth_tavg flag for short-lived ecosystem tracers - !----------------------------------------------------------------------- - - marbl_tracer_metadata(zootot13C_ind)%lfull_depth_tavg = lecovars_full_depth_tavg - marbl_tracer_metadata(zootot14C_ind)%lfull_depth_tavg = lecovars_full_depth_tavg - - do auto_ind = 1, autotroph_cnt - n = marbl_tracer_indices%auto_inds(auto_ind)%C13_ind - marbl_tracer_metadata(n)%lfull_depth_tavg = lecovars_full_depth_tavg - - n = marbl_tracer_indices%auto_inds(auto_ind)%C14_ind - marbl_tracer_metadata(n)%lfull_depth_tavg = lecovars_full_depth_tavg - - n = marbl_tracer_indices%auto_inds(auto_ind)%Ca13CO3_ind - if (n > 0) then - marbl_tracer_metadata(n)%lfull_depth_tavg = lecovars_full_depth_tavg - endif - - n = marbl_tracer_indices%auto_inds(auto_ind)%Ca14CO3_ind - if (n > 0) then - marbl_tracer_metadata(n)%lfull_depth_tavg = lecovars_full_depth_tavg - endif - end do - - end associate - - end subroutine marbl_ciso_init_tracer_metadata - - !***************************************************************************** - -end module marbl_ciso_init_mod diff --git a/src/marbl_ciso_interior_tendency_mod.F90 b/src/marbl_ciso_interior_tendency_mod.F90 index d4b8d888..103bb23e 100644 --- a/src/marbl_ciso_interior_tendency_mod.F90 +++ b/src/marbl_ciso_interior_tendency_mod.F90 @@ -9,6 +9,7 @@ module marbl_ciso_interior_tendency_mod use marbl_constants_mod, only : c2 use marbl_constants_mod, only : c1000 use marbl_constants_mod, only : mpercm + use marbl_constants_mod, only : c14_lambda use marbl_settings_mod, only : autotroph_cnt use marbl_settings_mod, only : autotroph_settings @@ -34,13 +35,6 @@ module marbl_ciso_interior_tendency_mod public :: marbl_ciso_interior_tendency_compute public :: marbl_ciso_interior_tendency_autotroph_zero_consistency_enforce - !----------------------------------------------------------------------- - ! scalar constants for 14C decay calculation - !----------------------------------------------------------------------- - - real (r8), parameter :: c14_halflife_years = 5730.0_r8 !C14 half file - real (r8) :: c14_lambda_inv_sec ! Decay variable in seconds - contains !*********************************************************************** @@ -70,8 +64,7 @@ subroutine marbl_ciso_interior_tendency_compute( & use marbl_constants_mod, only : R13C_std use marbl_constants_mod, only : R14C_std use marbl_constants_mod, only : spd - use marbl_constants_mod, only : spy - use marbl_ciso_diagnostics_mod, only : store_diagnostics_ciso_interior + use marbl_ciso_diagnostics_mod, only : marbl_ciso_diagnostics_interior_tendency_compute type(marbl_domain_type), intent(in) :: marbl_domain real (r8), intent(in) :: bot_flux_to_tend(:) @@ -242,13 +235,6 @@ subroutine marbl_ciso_interior_tendency_compute( & call P_Ca13CO3%construct(num_levels=column_km) call P_Ca14CO3%construct(num_levels=column_km) - !----------------------------------------------------------------------- - ! Set module variables - !----------------------------------------------------------------------- - - ! Define decay variable for DI14C, using earlier defined half-life of 14C - c14_lambda_inv_sec = log(c2) / (c14_halflife_years * spy) - !---------------------------------------------------------------------------------------- ! Set cell attributes !---------------------------------------------------------------------------------------- @@ -586,9 +572,9 @@ subroutine marbl_ciso_interior_tendency_compute( & n = marbl_tracer_indices%auto_inds(auto_ind)%C14_ind interior_tendencies(n,k) = photo14C(auto_ind,k) - work1 * R14C_autotroph(auto_ind,k) - & - c14_lambda_inv_sec * autotroph_local%C14(auto_ind,k) + c14_lambda * autotroph_local%C14(auto_ind,k) - decay_14Ctot(k) = decay_14Ctot(k) + c14_lambda_inv_sec * autotroph_local%C14(auto_ind,k) + decay_14Ctot(k) = decay_14Ctot(k) + c14_lambda * autotroph_local%C14(auto_ind,k) n = marbl_tracer_indices%auto_inds(auto_ind)%Ca13CO3_ind if (n > 0) then @@ -600,9 +586,9 @@ subroutine marbl_ciso_interior_tendency_compute( & if (n > 0) then interior_tendencies(n,k) = Ca14CO3_PROD(auto_ind,k) - QCaCO3(auto_ind,k) & * work1 * R14C_autotrophCaCO3(auto_ind,k) & - - c14_lambda_inv_sec * autotroph_local%Ca14CO3(auto_ind,k) + - c14_lambda * autotroph_local%Ca14CO3(auto_ind,k) - decay_14Ctot(k) = decay_14Ctot(k) + c14_lambda_inv_sec * autotroph_local%Ca14CO3(auto_ind,k) + decay_14Ctot(k) = decay_14Ctot(k) + c14_lambda * autotroph_local%Ca14CO3(auto_ind,k) endif end do @@ -618,9 +604,9 @@ subroutine marbl_ciso_interior_tendency_compute( & interior_tendencies(zootot14C_ind,k) = & sum(auto_graze_zoo(:,k) * R14C_autotroph(:,k),dim=1) & + (zootot_graze_zoo(k) - zootot_graze(k) - zootot_loss(k)) & - * R14C_zoototC(k) - c14_lambda_inv_sec * zootot14C_loc(k) + * R14C_zoototC(k) - c14_lambda * zootot14C_loc(k) - decay_14Ctot(k) = decay_14Ctot(k) + c14_lambda_inv_sec * zootot14C_loc(k) + decay_14Ctot(k) = decay_14Ctot(k) + c14_lambda * zootot14C_loc(k) !----------------------------------------------------------------------- ! interior_tendencies: dissolved organic Matter 13C and 14C @@ -628,9 +614,9 @@ subroutine marbl_ciso_interior_tendency_compute( & interior_tendencies(do13ctot_ind,k) = DO13Ctot_prod(k) - DO13Ctot_remin(k) - interior_tendencies(do14ctot_ind,k) = DO14Ctot_prod(k) - DO14Ctot_remin(k) - c14_lambda_inv_sec * DO14Ctot_loc(k) + interior_tendencies(do14ctot_ind,k) = DO14Ctot_prod(k) - DO14Ctot_remin(k) - c14_lambda * DO14Ctot_loc(k) - decay_14Ctot(k) = decay_14Ctot(k) + c14_lambda_inv_sec * DO14Ctot_loc(k) + decay_14Ctot(k) = decay_14Ctot(k) + c14_lambda * DO14Ctot_loc(k) !----------------------------------------------------------------------- ! interior_tendencies: dissolved inorganic Carbon 13 and 14 @@ -649,9 +635,9 @@ subroutine marbl_ciso_interior_tendency_compute( & + DO14Ctot_remin(k) + PO14C%remin(k) & + (zootot_loss_dic(k) + zootot_graze_dic(k)) * R14C_zoototC(k) & + P_Ca14CO3%remin(k) & - - c14_lambda_inv_sec * DI14C_loc(k) + - c14_lambda * DI14C_loc(k) - decay_14Ctot(k) = decay_14Ctot(k) + c14_lambda_inv_sec * DI14C_loc(k) + decay_14Ctot(k) = decay_14Ctot(k) + c14_lambda * DI14C_loc(k) do auto_ind = 1, autotroph_cnt if (marbl_tracer_indices%auto_inds(auto_ind)%Ca13CO3_ind > 0) then @@ -685,7 +671,7 @@ subroutine marbl_ciso_interior_tendency_compute( & ! update carbon isotope diagnostics ! FIXME #18: the following arguments need to be group into a derived type - call store_diagnostics_ciso_interior(& + call marbl_ciso_diagnostics_interior_tendency_compute(& marbl_domain, & autotroph_d13C, & autotroph_d14C, & @@ -721,7 +707,7 @@ subroutine marbl_ciso_interior_tendency_compute( & marbl_status_log) if (marbl_status_log%labort_marbl) then - call marbl_status_log%log_error_trace("store_diagnostics_ciso_interior", subname) + call marbl_status_log%log_error_trace("marbl_ciso_diagnostics_interior_tendency_compute", subname) return end if diff --git a/src/marbl_ciso_surface_flux_mod.F90 b/src/marbl_ciso_surface_flux_mod.F90 index 862de6c3..d990fd09 100644 --- a/src/marbl_ciso_surface_flux_mod.F90 +++ b/src/marbl_ciso_surface_flux_mod.F90 @@ -111,17 +111,9 @@ subroutine marbl_ciso_surface_flux_compute(& di13c_ind => marbl_tracer_indices%di13c_ind , & do13ctot_ind => marbl_tracer_indices%do13ctot_ind , & di14c_ind => marbl_tracer_indices%di14c_ind , & - do14ctot_ind => marbl_tracer_indices%do14ctot_ind , & - ciso_ind_beg => marbl_tracer_indices%ciso%ind_beg , & - ciso_ind_end => marbl_tracer_indices%ciso%ind_end & + do14ctot_ind => marbl_tracer_indices%do14ctot_ind & ) - !----------------------------------------------------------------------- - ! ciso fluxes initially set to 0 - !----------------------------------------------------------------------- - - surface_fluxes(:,ciso_ind_beg:ciso_ind_end) = c0 - !----------------------------------------------------------------------- ! initialize R13C_atm and R14C_atm !----------------------------------------------------------------------- diff --git a/src/marbl_constants_mod.F90 b/src/marbl_constants_mod.F90 index d8c6bcd5..917ddca5 100644 --- a/src/marbl_constants_mod.F90 +++ b/src/marbl_constants_mod.F90 @@ -61,8 +61,8 @@ module marbl_constants_mod molw_P = 30.974_r8, & ! molecular weight of phosphorus (gP / mol P) molw_Si = 28.085_r8, & ! molecular weight of silicon (gSi / mol Si) R13C_std = 1.0_r8, & ! actual 13C/12C PDB standard ratio (Craig, 1957) = 1123.72e-5_r8 - R14C_std = 1.0_r8 ! actual 14C/12C NOSAMS standard ratio = 11.76e-13_r8 - + R14C_std = 1.0_r8, & ! actual 14C/12C NOSAMS standard ratio = 11.76e-13_r8 + c14_lambda = log(c2) / (5730.0_r8 * spy) ! C14 decay factor (1/sec); note halflife of 5730 years !--------------------------------------------------------------------- ! Physical constants that need to be set after unit system ! has been chosen diff --git a/src/marbl_diagnostics_mod.F90 b/src/marbl_diagnostics_mod.F90 index 46a76f2c..8433544f 100644 --- a/src/marbl_diagnostics_mod.F90 +++ b/src/marbl_diagnostics_mod.F90 @@ -7,6 +7,9 @@ module marbl_diagnostics_mod use marbl_kinds_mod, only : int_kind use marbl_kinds_mod, only : char_len + use marbl_settings_mod, only : base_bio_on + use marbl_settings_mod, only : lflux_gas_co2 + use marbl_settings_mod, only : lflux_gas_o2 use marbl_settings_mod, only : unit_system_type use marbl_settings_mod, only : autotroph_cnt use marbl_settings_mod, only : zooplankton_cnt @@ -51,6 +54,7 @@ module marbl_diagnostics_mod public :: marbl_diagnostics_init public :: marbl_diagnostics_interior_tendency_compute public :: marbl_diagnostics_surface_flux_compute + public :: marbl_diagnostics_surface_flux_share private :: store_diagnostics_carbonate private :: store_diagnostics_nitrification @@ -88,6 +92,7 @@ subroutine marbl_diagnostics_init( & use marbl_settings_mod, only : lvariable_PtoC use marbl_settings_mod, only : particulate_flux_ref_depth use marbl_settings_mod, only : lecovars_full_depth_tavg + use marbl_abio_dic_diagnostics_mod, only : marbl_abio_dic_diagnostics_init use marbl_ciso_diagnostics_mod, only : marbl_ciso_diagnostics_init type(marbl_domain_type) , intent(in) :: marbl_domain @@ -127,328 +132,334 @@ subroutine marbl_diagnostics_init( & diags => marbl_surface_flux_diags & ) - lname = 'Ice Fraction for ecosys fluxes' - sname = 'ECOSYS_IFRAC' - units = 'fraction' - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%ECOSYS_IFRAC, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + if (lflux_gas_o2 .or. lflux_gas_co2) then + lname = 'Ice Fraction' + sname = 'ECOSYS_IFRAC' + units = 'fraction' + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%ECOSYS_IFRAC, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'XKW for ecosys fluxes' - sname = 'ECOSYS_XKW' - units = vel_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%ECOSYS_XKW, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = 'XKW' + sname = 'ECOSYS_XKW' + units = vel_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%ECOSYS_XKW, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'Atmospheric Pressure for ecosys fluxes' - sname = 'ECOSYS_ATM_PRESS' - units = 'atmospheres' - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%ECOSYS_ATM_PRESS, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return + lname = 'Atmospheric Pressure' + sname = 'ECOSYS_ATM_PRESS' + units = 'atmospheres' + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%ECOSYS_ATM_PRESS, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if end if - lname = 'PV_O2' - sname = 'PV_O2' - units = vel_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%PV_O2, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + if (lflux_gas_co2) then + lname = 'CO2 Piston Velocity' + sname = 'PV_CO2' + units = vel_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%PV_CO2, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'O2 Schmidt Number' - sname = 'SCHMIDT_O2' - units = '1' - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%SCHMIDT_O2, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return + lname = 'CO2 Schmidt Number for base biotic tracers fluxes' + sname = 'SCHMIDT_CO2' + units = '1' + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%SCHMIDT_CO2, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if end if - lname = 'O2 Saturation' - sname = 'O2SAT' - units = unit_system%conc_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%O2SAT, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + if (base_bio_on) then + lname = 'O2 Piston Velocity' + sname = 'PV_O2' + units = vel_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%PV_O2, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'CO2 Star' - sname = 'CO2STAR' - units = unit_system%conc_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%CO2STAR, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = 'O2 Schmidt Number' + sname = 'SCHMIDT_O2' + units = '1' + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%SCHMIDT_O2, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'D CO2 Star' - sname = 'DCO2STAR' - units = unit_system%conc_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%DCO2STAR, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = 'O2 Saturation' + sname = 'O2SAT' + units = unit_system%conc_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%O2SAT, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'surface pCO2' - sname = 'pCO2SURF' - units = 'ppmv' - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%pCO2SURF, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = 'CO2 Star' + sname = 'CO2STAR' + units = unit_system%conc_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%CO2STAR, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'D pCO2' - sname = 'DpCO2' - units = 'ppmv' - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%DpCO2, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = 'D CO2 Star' + sname = 'DCO2STAR' + units = unit_system%conc_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%DCO2STAR, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'CO2 Piston Velocity' - sname = 'PV_CO2' - units = vel_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%PV_CO2, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = 'surface pCO2' + sname = 'pCO2SURF' + units = 'ppmv' + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%pCO2SURF, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'CO2 Schmidt Number' - sname = 'SCHMIDT_CO2' - units = '1' - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%SCHMIDT_CO2, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = 'D pCO2' + sname = 'DpCO2' + units = 'ppmv' + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%DpCO2, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'DIC Surface Gas Flux' - sname = 'FG_CO2' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%DIC_GAS_FLUX, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = 'DIC Surface Gas Flux' + sname = 'FG_CO2' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%FG_CO2, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'Surface pH' - sname = 'PH' - units = '1' - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%PH, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = 'Surface pH' + sname = 'PH' + units = '1' + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%PH, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'Atmospheric CO2' - sname = 'ATM_CO2' - units = 'ppmv' - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%ATM_CO2, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = 'Atmospheric CO2' + sname = 'ATM_CO2' + units = 'ppmv' + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%ATM_CO2, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'CO2 Star, Alternative CO2' - sname = 'CO2STAR_ALT_CO2' - units = unit_system%conc_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%CO2STAR_ALT_CO2, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = 'CO2 Star, Alternative CO2' + sname = 'CO2STAR_ALT_CO2' + units = unit_system%conc_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%CO2STAR_ALT_CO2, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'D CO2 Star, Alternative CO2' - sname = 'DCO2STAR_ALT_CO2' - units = unit_system%conc_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%DCO2STAR_ALT_CO2, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = 'D CO2 Star, Alternative CO2' + sname = 'DCO2STAR_ALT_CO2' + units = unit_system%conc_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%DCO2STAR_ALT_CO2, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'surface pCO2, Alternative CO2' - sname = 'pCO2SURF_ALT_CO2' - units = 'ppmv' - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%pCO2SURF_ALT_CO2, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = 'surface pCO2, Alternative CO2' + sname = 'pCO2SURF_ALT_CO2' + units = 'ppmv' + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%pCO2SURF_ALT_CO2, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'D pCO2, Alternative CO2' - sname = 'DpCO2_ALT_CO2' - units = 'ppmv' - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%DpCO2_ALT_CO2, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = 'D pCO2, Alternative CO2' + sname = 'DpCO2_ALT_CO2' + units = 'ppmv' + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%DpCO2_ALT_CO2, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'DIC Surface Gas Flux, Alternative CO2' - sname = 'FG_ALT_CO2' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%DIC_GAS_FLUX_ALT_CO2, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = 'DIC Surface Gas Flux, Alternative CO2' + sname = 'FG_ALT_CO2' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%FG_CO2_ALT_CO2, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'Surface pH, Alternative CO2' - sname = 'PH_ALT_CO2' - units = '1' - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%PH_ALT_CO2, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = 'Surface pH, Alternative CO2' + sname = 'PH_ALT_CO2' + units = '1' + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%PH_ALT_CO2, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'Atmospheric Alternative CO2' - sname = 'ATM_ALT_CO2' - units = 'ppmv' - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%ATM_ALT_CO2, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = 'Atmospheric Alternative CO2' + sname = 'ATM_ALT_CO2' + units = 'ppmv' + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%ATM_ALT_CO2, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'Atmospheric Iron Flux' - sname = 'IRON_FLUX' - units = 'mmol/m^2/s' ! output in mks regardless of unit system! - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%IRON_FLUX, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = 'Atmospheric Iron Flux' + sname = 'IRON_FLUX' + units = 'mmol/m^2/s' ! output in mks regardless of unit system! + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%IRON_FLUX, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'Dust Flux' - sname = 'DUST_FLUX' - write(units, "(4A)") trim(unit_system%M), '/', trim(unit_system%L), '^2/s' - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%DUST_FLUX, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = 'Atmospheric Dust Flux' + sname = 'DUST_FLUX' + write(units, "(4A)") trim(unit_system%M), '/', trim(unit_system%L), '^2/s' + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%DUST_FLUX, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'Flux of NOx from Atmosphere' - sname = 'NOx_FLUX' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%NOx_FLUX, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = 'Flux of NOx from Atmosphere' + sname = 'NOx_FLUX' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%NOx_FLUX, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'Flux of NHy from Atmosphere' - sname = 'NHy_FLUX' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%NHy_FLUX, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = 'Flux of NHy from Atmosphere' + sname = 'NHy_FLUX' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%NHy_FLUX, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'Emission of NHx to Atmosphere' - sname = 'NHx_SURFACE_EMIS' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%NHx_SURFACE_EMIS, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return + lname = 'Emission of NHx to Atmosphere' + sname = 'NHx_SURFACE_EMIS' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%NHx_SURFACE_EMIS, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if end if end associate @@ -462,2568 +473,2580 @@ subroutine marbl_diagnostics_init( & diags => marbl_interior_tendency_diags & ) - ! General 2D diags - lname = 'Calcite Saturation Depth' - sname = 'zsatcalc' - units = unit_system%L - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%zsatcalc, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Aragonite Saturation Depth' - sname = 'zsatarag' - units = unit_system%L - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%zsatarag, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + if (base_bio_on) then + ! General 2D diags + lname = 'Calcite Saturation Depth' + sname = 'zsatcalc' + units = unit_system%L + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%zsatcalc, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'Vertical Minimum of O2' - sname = 'O2_ZMIN' - units = unit_system%conc_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%O2_ZMIN, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Depth of Vertical Minimum of O2' - sname = 'O2_ZMIN_DEPTH' - units = unit_system%L - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%O2_ZMIN_DEPTH, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Total C Fixation Vertical Integral' - sname = 'photoC_TOT_zint' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%photoC_TOT_zint, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Total C Fixation Vertical Integral, 0-100m' - sname = 'photoC_TOT_zint_100m' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%photoC_TOT_zint_100m, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Total C Fixation from NO3 Vertical Integral' - sname = 'photoC_NO3_TOT_zint' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%photoC_NO3_TOT_zint, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Total C Fixation from NO3 Vertical Integral, 0-100m' - sname = 'photoC_NO3_TOT_zint_100m' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%photoC_NO3_TOT_zint_100m, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Vertical Integral of DOC Production' - sname = 'DOC_prod_zint' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%DOC_prod_zint, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Vertical Integral of DOC Production, 0-100m' - sname = 'DOC_prod_zint_100m' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%DOC_prod_zint_100m, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Vertical Integral of DOC Remineralization' - sname = 'DOC_remin_zint' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%DOC_remin_zint, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Vertical Integral of DOC Remineralization, 0-100m' - sname = 'DOC_remin_zint_100m' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%DOC_remin_zint_100m, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Vertical Integral of DOCr Remineralization' - sname = 'DOCr_remin_zint' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%DOCr_remin_zint, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Vertical Integral of DOCr Remineralization, 0-100m' - sname = 'DOCr_remin_zint_100m' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%DOCr_remin_zint_100m, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Vertical Integral of Conservative Subterms of Source Sink Term for Ctot' - sname = 'Jint_Ctot' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%Jint_Ctot, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Vertical Integral of Conservative Subterms of Source Sink Term for Ntot' - sname = 'Jint_Ntot' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%Jint_Ntot, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Vertical Integral of Conservative Subterms of Source Sink Term for Ptot' - sname = 'Jint_Ptot' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%Jint_Ptot, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Vertical Integral of Conservative Subterms of Source Sink Term for Sitot' - sname = 'Jint_Sitot' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%Jint_Sitot, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Vertical Integral of Conservative Subterms of Source Sink Term for Fetot' - sname = 'Jint_Fetot' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%Jint_Fetot, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - ! Particulate 2D diags - lname = 'CaCO3 Flux Hitting Sea Floor' - sname = 'calcToFloor' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%calcToFloor, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'CaCO3 Flux to Sediments' - sname = 'calcToSed' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%calcToSed, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'CaCO3 Flux to Sediments, Alternative CO2' - sname = 'calcToSed_ALT_CO2' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%calcToSed_ALT_CO2, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'POC Flux Hitting Sea Floor' - sname = 'pocToFloor' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%pocToFloor, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'POC Flux to Sediments' - sname = 'pocToSed' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%pocToSed, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'nitrogen burial Flux to Sediments' - sname = 'ponToSed' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%ponToSed, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'nitrogen loss in Sediments' - sname = 'SedDenitrif' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%SedDenitrif, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'non-oxic,non-dentr remin in Sediments' - sname = 'OtherRemin' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%OtherRemin, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'phosphorus Flux to Sediments' - sname = 'popToSed' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%popToSed, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'biogenic Si Flux to Sediments' - sname = 'bsiToSed' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%bsiToSed, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'dust Flux to Sediments' - sname = 'dustToSed' - write(units, "(4A)") trim(unit_system%M), '/', trim(unit_system%L), '^2/s' - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%dustToSed, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'pFe Flux to Sediments' - sname = 'pfeToSed' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%pfeToSed, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - ! Autotroph 2D diags - if (.not.ind%lconstructed()) then - allocate(ind%N_lim_surf(autotroph_cnt)) - allocate(ind%N_lim_Cweight_avg_100m(autotroph_cnt)) - allocate(ind%P_lim_surf(autotroph_cnt)) - allocate(ind%P_lim_Cweight_avg_100m(autotroph_cnt)) - allocate(ind%Fe_lim_surf(autotroph_cnt)) - allocate(ind%Fe_lim_Cweight_avg_100m(autotroph_cnt)) - allocate(ind%SiO3_lim_surf(autotroph_cnt)) - allocate(ind%SiO3_lim_Cweight_avg_100m(autotroph_cnt)) - allocate(ind%C_lim_surf(autotroph_cnt)) - allocate(ind%C_lim_Cweight_avg_100m(autotroph_cnt)) - allocate(ind%light_lim_surf(autotroph_cnt)) - allocate(ind%light_lim_Cweight_avg_100m(autotroph_cnt)) - allocate(ind%photoC_zint(autotroph_cnt)) - allocate(ind%photoC_zint_100m(autotroph_cnt)) - allocate(ind%photoC_NO3_zint(autotroph_cnt)) - allocate(ind%CaCO3_form_zint(autotroph_cnt)) - allocate(ind%CaCO3_form_zint_100m(autotroph_cnt)) - allocate(ind%auto_graze_zint(autotroph_cnt)) - allocate(ind%auto_graze_zint_100m(autotroph_cnt)) - allocate(ind%auto_graze_poc_zint(autotroph_cnt)) - allocate(ind%auto_graze_poc_zint_100m(autotroph_cnt)) - allocate(ind%auto_graze_doc_zint(autotroph_cnt)) - allocate(ind%auto_graze_doc_zint_100m(autotroph_cnt)) - allocate(ind%auto_graze_zoo_zint(autotroph_cnt, zooplankton_cnt)) - allocate(ind%auto_graze_zoo_zint_100m(autotroph_cnt, zooplankton_cnt)) - allocate(ind%auto_loss_zint(autotroph_cnt)) - allocate(ind%auto_loss_zint_100m(autotroph_cnt)) - allocate(ind%auto_loss_poc_zint(autotroph_cnt)) - allocate(ind%auto_loss_poc_zint_100m(autotroph_cnt)) - allocate(ind%auto_loss_doc_zint(autotroph_cnt)) - allocate(ind%auto_loss_doc_zint_100m(autotroph_cnt)) - allocate(ind%auto_agg_zint(autotroph_cnt)) - allocate(ind%auto_agg_zint_100m(autotroph_cnt)) - end if - do n=1,autotroph_cnt - lname = trim(autotroph_settings(n)%lname) // ' N Limitation, Surface' - sname = trim(autotroph_settings(n)%sname) // '_N_lim_surf' - units = '1' - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%N_lim_surf(n), marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = trim(autotroph_settings(n)%lname) // ' N Limitation, carbon biomass weighted average over 0-100m' - sname = trim(autotroph_settings(n)%sname) // '_N_lim_Cweight_avg_100m' - units = '1' - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%N_lim_Cweight_avg_100m(n), marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = trim(autotroph_settings(n)%lname) // ' P Limitation, Surface' - sname = trim(autotroph_settings(n)%sname) // '_P_lim_surf' - units = '1' - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%P_lim_surf(n), marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = trim(autotroph_settings(n)%lname) // ' P Limitation, carbon biomass weighted average over 0-100m' - sname = trim(autotroph_settings(n)%sname) // '_P_lim_Cweight_avg_100m' - units = '1' + lname = 'Aragonite Saturation Depth' + sname = 'zsatarag' + units = unit_system%L vgrid = 'none' truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%P_lim_Cweight_avg_100m(n), marbl_status_log) + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%zsatarag, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(autotroph_settings(n)%lname) // ' Fe Limitation, Surface' - sname = trim(autotroph_settings(n)%sname) // '_Fe_lim_surf' - units = '1' + lname = 'Vertical Minimum of O2' + sname = 'O2_ZMIN' + units = unit_system%conc_units vgrid = 'none' truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%Fe_lim_surf(n), marbl_status_log) + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%O2_ZMIN, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(autotroph_settings(n)%lname) // ' Fe Limitation, carbon biomass weighted average over 0-100m' - sname = trim(autotroph_settings(n)%sname) // '_Fe_lim_Cweight_avg_100m' - units = '1' + lname = 'Depth of Vertical Minimum of O2' + sname = 'O2_ZMIN_DEPTH' + units = unit_system%L vgrid = 'none' truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%Fe_lim_Cweight_avg_100m(n), marbl_status_log) + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%O2_ZMIN_DEPTH, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - if (autotroph_settings(n)%silicifier) then - lname = trim(autotroph_settings(n)%lname) // ' SiO3 Limitation, Surface' - sname = trim(autotroph_settings(n)%sname) // '_SiO3_lim_surf' - units = '1' - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%SiO3_lim_surf(n), marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = trim(autotroph_settings(n)%lname) // ' SiO3 Limitation, carbon biomass weighted average over 0-100m' - sname = trim(autotroph_settings(n)%sname) // '_SiO3_lim_Cweight_avg_100m' - units = '1' - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%SiO3_lim_Cweight_avg_100m(n), marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - else - ind%SiO3_lim_surf(n) = -1 - ind%SiO3_lim_Cweight_avg_100m(n) = -1 - end if - - if (autotroph_settings(n)%is_carbon_limited) then - lname = trim(autotroph_settings(n)%lname) // ' C Limitation, Surface' - sname = trim(autotroph_settings(n)%sname) // '_C_lim_surf' - units = '1' - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%C_lim_surf(n), marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = trim(autotroph_settings(n)%lname) // ' C Limitation, carbon biomass weighted average over 0-100m' - sname = trim(autotroph_settings(n)%sname) // '_C_lim_Cweight_avg_100m' - units = '1' - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%C_lim_Cweight_avg_100m(n), marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - end if - - lname = trim(autotroph_settings(n)%lname) // ' Light Limitation, Surface' - sname = trim(autotroph_settings(n)%sname) // '_light_lim_surf' - units = '1' + lname = 'Total C Fixation Vertical Integral' + sname = 'photoC_TOT_zint' + units = unit_system%conc_flux_units vgrid = 'none' truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%light_lim_surf(n), marbl_status_log) + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%photoC_TOT_zint, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(autotroph_settings(n)%lname) // ' Light Limitation, carbon biomass weighted average over 0-100m' - sname = trim(autotroph_settings(n)%sname) // '_light_lim_Cweight_avg_100m' - units = '1' + lname = 'Total C Fixation Vertical Integral, 0-100m' + sname = 'photoC_TOT_zint_100m' + units = unit_system%conc_flux_units vgrid = 'none' truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%light_lim_Cweight_avg_100m(n), marbl_status_log) + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%photoC_TOT_zint_100m, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(autotroph_settings(n)%lname) // ' C Fixation Vertical Integral' - sname = 'photoC_' // trim(autotroph_settings(n)%sname) // '_zint' + lname = 'Total C Fixation from NO3 Vertical Integral' + sname = 'photoC_NO3_TOT_zint' units = unit_system%conc_flux_units vgrid = 'none' truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%photoC_zint(n), marbl_status_log) + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%photoC_NO3_TOT_zint, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(autotroph_settings(n)%lname) // ' C Fixation Vertical Integral, 0-100m' - sname = 'photoC_' // trim(autotroph_settings(n)%sname) // '_zint_100m' + lname = 'Total C Fixation from NO3 Vertical Integral, 0-100m' + sname = 'photoC_NO3_TOT_zint_100m' units = unit_system%conc_flux_units vgrid = 'none' truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%photoC_zint_100m(n), marbl_status_log) + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%photoC_NO3_TOT_zint_100m, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(autotroph_settings(n)%lname) // ' C Fixation from NO3 Vertical Integral' - sname = 'photoC_NO3_' // trim(autotroph_settings(n)%sname) // '_zint' + lname = 'Vertical Integral of DOC Production' + sname = 'DOC_prod_zint' units = unit_system%conc_flux_units vgrid = 'none' truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%photoC_NO3_zint(n), marbl_status_log) + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%DOC_prod_zint, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - if (autotroph_settings(n)%imp_calcifier .or. autotroph_settings(n)%exp_calcifier) then - lname = trim(autotroph_settings(n)%lname) // ' CaCO3 Formation Vertical Integral' - sname = trim(autotroph_settings(n)%sname) // '_CaCO3_form_zint' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%CaCO3_form_zint(n), marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - else - ind%CaCO3_form_zint(n) = -1 - end if - - if (autotroph_settings(n)%imp_calcifier .or. autotroph_settings(n)%exp_calcifier) then - lname = trim(autotroph_settings(n)%lname) // ' CaCO3 Formation Vertical Integral, 0-100m' - sname = trim(autotroph_settings(n)%sname) // '_CaCO3_form_zint_100m' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%CaCO3_form_zint_100m(n), marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - else - ind%CaCO3_form_zint_100m(n) = -1 - end if - - lname = trim(autotroph_settings(n)%lname) // ' Grazing Vertical Integral' - sname = 'graze_' // trim(autotroph_settings(n)%sname) // '_zint' + lname = 'Vertical Integral of DOC Production, 0-100m' + sname = 'DOC_prod_zint_100m' units = unit_system%conc_flux_units vgrid = 'none' truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%auto_graze_zint(n), marbl_status_log) + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%DOC_prod_zint_100m, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(autotroph_settings(n)%lname) // ' Grazing Vertical Integral, 0-100m' - sname = 'graze_' // trim(autotroph_settings(n)%sname) // '_zint_100m' + lname = 'Vertical Integral of DOC Remineralization' + sname = 'DOC_remin_zint' units = unit_system%conc_flux_units vgrid = 'none' truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%auto_graze_zint_100m(n), marbl_status_log) + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%DOC_remin_zint, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(autotroph_settings(n)%lname) // ' Grazing to POC Vertical Integral' - sname = 'graze_' // trim(autotroph_settings(n)%sname) // '_poc_zint' + lname = 'Vertical Integral of DOC Remineralization, 0-100m' + sname = 'DOC_remin_zint_100m' units = unit_system%conc_flux_units vgrid = 'none' truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%auto_graze_poc_zint(n), marbl_status_log) + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%DOC_remin_zint_100m, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(autotroph_settings(n)%lname) // ' Grazing to POC Vertical Integral, 0-100m' - sname = 'graze_' // trim(autotroph_settings(n)%sname) // '_poc_zint_100m' + lname = 'Vertical Integral of DOCr Remineralization' + sname = 'DOCr_remin_zint' units = unit_system%conc_flux_units vgrid = 'none' truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%auto_graze_poc_zint_100m(n), marbl_status_log) + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%DOCr_remin_zint, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(autotroph_settings(n)%lname) // ' Grazing to DOC Vertical Integral' - sname = 'graze_' // trim(autotroph_settings(n)%sname) // '_doc_zint' + lname = 'Vertical Integral of DOCr Remineralization, 0-100m' + sname = 'DOCr_remin_zint_100m' units = unit_system%conc_flux_units vgrid = 'none' truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%auto_graze_doc_zint(n), marbl_status_log) + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%DOCr_remin_zint_100m, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(autotroph_settings(n)%lname) // ' Grazing to DOC Vertical Integral, 0-100m' - sname = 'graze_' // trim(autotroph_settings(n)%sname) // '_doc_zint_100m' + lname = 'Vertical Integral of Conservative Subterms of Source Sink Term for Ctot' + sname = 'Jint_Ctot' units = unit_system%conc_flux_units vgrid = 'none' truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%auto_graze_doc_zint_100m(n), marbl_status_log) + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%Jint_Ctot, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - do m=1, zooplankton_cnt - lname = trim(autotroph_settings(n)%lname) // ' Grazing to ' // & - trim(zooplankton_settings(m)%lname) // ' Vertical Integral' - sname = 'graze_' // trim(autotroph_settings(n)%sname) // '_' // & - trim(zooplankton_settings(m)%sname) // '_zint' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%auto_graze_zoo_zint(n,m), marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = trim(autotroph_settings(n)%lname) // ' Grazing to ' // & - trim(zooplankton_settings(m)%lname) // ' Vertical Integral, 0-100m' - sname = 'graze_' // trim(autotroph_settings(n)%sname) // '_' // & - trim(zooplankton_settings(m)%sname) // '_zint_100m' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%auto_graze_zoo_zint_100m(n,m), marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - end do - - lname = trim(autotroph_settings(n)%lname) // ' Loss Vertical Integral' - sname = trim(autotroph_settings(n)%sname) // '_loss_zint' + lname = 'Vertical Integral of Conservative Subterms of Source Sink Term for Ntot' + sname = 'Jint_Ntot' units = unit_system%conc_flux_units vgrid = 'none' truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%auto_loss_zint(n), marbl_status_log) + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%Jint_Ntot, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(autotroph_settings(n)%lname) // ' Loss Vertical Integral, 0-100m' - sname = trim(autotroph_settings(n)%sname) // '_loss_zint_100m' + lname = 'Vertical Integral of Conservative Subterms of Source Sink Term for Ptot' + sname = 'Jint_Ptot' units = unit_system%conc_flux_units vgrid = 'none' truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%auto_loss_zint_100m(n), marbl_status_log) + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%Jint_Ptot, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(autotroph_settings(n)%lname) // ' Loss to POC Vertical Integral' - sname = trim(autotroph_settings(n)%sname) // '_loss_poc_zint' + lname = 'Vertical Integral of Conservative Subterms of Source Sink Term for Sitot' + sname = 'Jint_Sitot' units = unit_system%conc_flux_units vgrid = 'none' truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%auto_loss_poc_zint(n), marbl_status_log) + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%Jint_Sitot, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(autotroph_settings(n)%lname) // ' Loss to POC Vertical Integral, 0-100m' - sname = trim(autotroph_settings(n)%sname) // '_loss_poc_zint_100m' + lname = 'Vertical Integral of Conservative Subterms of Source Sink Term for Fetot' + sname = 'Jint_Fetot' units = unit_system%conc_flux_units vgrid = 'none' truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%auto_loss_poc_zint_100m(n), marbl_status_log) + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%Jint_Fetot, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(autotroph_settings(n)%lname) // ' Loss to DOC Vertical Integral' - sname = trim(autotroph_settings(n)%sname) // '_loss_doc_zint' + ! Particulate 2D diags + lname = 'CaCO3 Flux Hitting Sea Floor' + sname = 'calcToFloor' units = unit_system%conc_flux_units vgrid = 'none' truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%auto_loss_doc_zint(n), marbl_status_log) + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%calcToFloor, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(autotroph_settings(n)%lname) // ' Loss to DOC Vertical Integral, 0-100m' - sname = trim(autotroph_settings(n)%sname) // '_loss_doc_zint_100m' + lname = 'CaCO3 Flux to Sediments' + sname = 'calcToSed' units = unit_system%conc_flux_units vgrid = 'none' truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%auto_loss_doc_zint_100m(n), marbl_status_log) + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%calcToSed, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(autotroph_settings(n)%lname) // ' Aggregation Vertical Integral' - sname = trim(autotroph_settings(n)%sname) // '_agg_zint' + lname = 'CaCO3 Flux to Sediments, Alternative CO2' + sname = 'calcToSed_ALT_CO2' units = unit_system%conc_flux_units vgrid = 'none' truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%auto_agg_zint(n), marbl_status_log) + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%calcToSed_ALT_CO2, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(autotroph_settings(n)%lname) // ' Aggregation Vertical Integral, 0-100m' - sname = trim(autotroph_settings(n)%sname) // '_agg_zint_100m' + lname = 'POC Flux Hitting Sea Floor' + sname = 'pocToFloor' units = unit_system%conc_flux_units vgrid = 'none' truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%auto_agg_zint_100m(n), marbl_status_log) + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%pocToFloor, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - end do - - lname = 'Total CaCO3 Formation Vertical Integral' - sname = 'CaCO3_form_zint' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%tot_CaCO3_form_zint, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Total CaCO3 Formation Vertical Integral, 0-100m' - sname = 'CaCO3_form_zint_100m' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%tot_CaCO3_form_zint_100m, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - ! Zooplankton 2D diags - if (.not.ind%lconstructed()) then - allocate(ind%zoo_loss_zint(zooplankton_cnt)) - allocate(ind%zoo_loss_zint_100m(zooplankton_cnt)) - allocate(ind%zoo_loss_zint_150m(zooplankton_cnt)) - allocate(ind%zoo_loss_basal_zint(zooplankton_cnt)) - allocate(ind%zoo_loss_basal_zint_100m(zooplankton_cnt)) - allocate(ind%zoo_loss_poc_zint(zooplankton_cnt)) - allocate(ind%zoo_loss_poc_zint_100m(zooplankton_cnt)) - allocate(ind%zoo_loss_doc_zint(zooplankton_cnt)) - allocate(ind%zoo_loss_doc_zint_100m(zooplankton_cnt)) - allocate(ind%zoo_graze_zint(zooplankton_cnt)) - allocate(ind%zoo_graze_zint_100m(zooplankton_cnt)) - allocate(ind%zoo_graze_poc_zint(zooplankton_cnt)) - allocate(ind%zoo_graze_poc_zint_100m(zooplankton_cnt)) - allocate(ind%zoo_graze_doc_zint(zooplankton_cnt)) - allocate(ind%zoo_graze_doc_zint_100m(zooplankton_cnt)) - allocate(ind%zoo_graze_zoo_zint(zooplankton_cnt, zooplankton_cnt)) - allocate(ind%zoo_graze_zoo_zint_100m(zooplankton_cnt, zooplankton_cnt)) - allocate(ind%x_graze_zoo_zint(zooplankton_cnt)) - allocate(ind%x_graze_zoo_zint_100m(zooplankton_cnt)) - end if - do n = 1,zooplankton_cnt - lname = trim(zooplankton_settings(n)%lname) // ' Loss Vertical Integral' - sname = trim(zooplankton_settings(n)%sname) // '_loss_zint' + lname = 'POC Flux to Sediments' + sname = 'pocToSed' units = unit_system%conc_flux_units vgrid = 'none' truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%zoo_loss_zint(n), marbl_status_log) + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%pocToSed, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(zooplankton_settings(n)%lname) // ' Loss Vertical Integral, 0-100m' - sname = trim(zooplankton_settings(n)%sname) // '_loss_zint_100m' + lname = 'nitrogen burial Flux to Sediments' + sname = 'ponToSed' units = unit_system%conc_flux_units vgrid = 'none' truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%zoo_loss_zint_100m(n), marbl_status_log) + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%ponToSed, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(zooplankton_settings(n)%lname) // ' Loss Vertical Integral, 0-150m' - sname = trim(zooplankton_settings(n)%sname) // '_loss_zint_150m' + lname = 'nitrogen loss in Sediments' + sname = 'SedDenitrif' units = unit_system%conc_flux_units vgrid = 'none' truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%zoo_loss_zint_150m(n), marbl_status_log) + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%SedDenitrif, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(zooplankton_settings(n)%lname) // ' Basal Respiration Vertical Integral' - sname = trim(zooplankton_settings(n)%sname) // '_loss_basal_zint' + lname = 'non-oxic,non-dentr remin in Sediments' + sname = 'OtherRemin' units = unit_system%conc_flux_units vgrid = 'none' truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%zoo_loss_basal_zint(n), marbl_status_log) + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%OtherRemin, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(zooplankton_settings(n)%lname) // ' Basal Respiration Vertical Integral, 0-100m' - sname = trim(zooplankton_settings(n)%sname) // '_loss_basal_zint_100m' + lname = 'phosphorus Flux to Sediments' + sname = 'popToSed' units = unit_system%conc_flux_units vgrid = 'none' truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%zoo_loss_basal_zint_100m(n), marbl_status_log) + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%popToSed, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(zooplankton_settings(n)%lname) // ' Loss to POC Vertical Integral' - sname = trim(zooplankton_settings(n)%sname) // '_loss_poc_zint' + lname = 'biogenic Si Flux to Sediments' + sname = 'bsiToSed' units = unit_system%conc_flux_units vgrid = 'none' truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%zoo_loss_poc_zint(n), marbl_status_log) + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%bsiToSed, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(zooplankton_settings(n)%lname) // ' Loss to POC Vertical Integral, 0-100m' - sname = trim(zooplankton_settings(n)%sname) // '_loss_poc_zint_100m' - units = unit_system%conc_flux_units + lname = 'dust Flux to Sediments' + sname = 'dustToSed' + write(units, "(4A)") trim(unit_system%M), '/', trim(unit_system%L), '^2/s' vgrid = 'none' truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%zoo_loss_poc_zint_100m(n), marbl_status_log) + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%dustToSed, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(zooplankton_settings(n)%lname) // ' Loss to DOC Vertical Integral' - sname = trim(zooplankton_settings(n)%sname) // '_loss_doc_zint' + lname = 'pFe Flux to Sediments' + sname = 'pfeToSed' units = unit_system%conc_flux_units vgrid = 'none' truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%zoo_loss_doc_zint(n), marbl_status_log) + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%pfeToSed, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(zooplankton_settings(n)%lname) // ' Loss to DOC Vertical Integral, 0-100m' - sname = trim(zooplankton_settings(n)%sname) // '_loss_doc_zint_100m' + ! Autotroph 2D diags + if (.not.ind%lallocated()) then + allocate(ind%N_lim_surf(autotroph_cnt)) + allocate(ind%N_lim_Cweight_avg_100m(autotroph_cnt)) + allocate(ind%P_lim_surf(autotroph_cnt)) + allocate(ind%P_lim_Cweight_avg_100m(autotroph_cnt)) + allocate(ind%Fe_lim_surf(autotroph_cnt)) + allocate(ind%Fe_lim_Cweight_avg_100m(autotroph_cnt)) + allocate(ind%SiO3_lim_surf(autotroph_cnt)) + allocate(ind%SiO3_lim_Cweight_avg_100m(autotroph_cnt)) + allocate(ind%C_lim_surf(autotroph_cnt)) + allocate(ind%C_lim_Cweight_avg_100m(autotroph_cnt)) + allocate(ind%light_lim_surf(autotroph_cnt)) + allocate(ind%light_lim_Cweight_avg_100m(autotroph_cnt)) + allocate(ind%photoC_zint(autotroph_cnt)) + allocate(ind%photoC_zint_100m(autotroph_cnt)) + allocate(ind%photoC_NO3_zint(autotroph_cnt)) + allocate(ind%CaCO3_form_zint(autotroph_cnt)) + allocate(ind%CaCO3_form_zint_100m(autotroph_cnt)) + allocate(ind%auto_graze_zint(autotroph_cnt)) + allocate(ind%auto_graze_zint_100m(autotroph_cnt)) + allocate(ind%auto_graze_poc_zint(autotroph_cnt)) + allocate(ind%auto_graze_poc_zint_100m(autotroph_cnt)) + allocate(ind%auto_graze_doc_zint(autotroph_cnt)) + allocate(ind%auto_graze_doc_zint_100m(autotroph_cnt)) + allocate(ind%auto_graze_zoo_zint(autotroph_cnt, zooplankton_cnt)) + allocate(ind%auto_graze_zoo_zint_100m(autotroph_cnt, zooplankton_cnt)) + allocate(ind%auto_loss_zint(autotroph_cnt)) + allocate(ind%auto_loss_zint_100m(autotroph_cnt)) + allocate(ind%auto_loss_poc_zint(autotroph_cnt)) + allocate(ind%auto_loss_poc_zint_100m(autotroph_cnt)) + allocate(ind%auto_loss_doc_zint(autotroph_cnt)) + allocate(ind%auto_loss_doc_zint_100m(autotroph_cnt)) + allocate(ind%auto_agg_zint(autotroph_cnt)) + allocate(ind%auto_agg_zint_100m(autotroph_cnt)) + end if + do n=1,autotroph_cnt + lname = trim(autotroph_settings(n)%lname) // ' N Limitation, Surface' + sname = trim(autotroph_settings(n)%sname) // '_N_lim_surf' + units = '1' + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%N_lim_surf(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(autotroph_settings(n)%lname) // ' N Limitation, carbon biomass weighted average over 0-100m' + sname = trim(autotroph_settings(n)%sname) // '_N_lim_Cweight_avg_100m' + units = '1' + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%N_lim_Cweight_avg_100m(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(autotroph_settings(n)%lname) // ' P Limitation, Surface' + sname = trim(autotroph_settings(n)%sname) // '_P_lim_surf' + units = '1' + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%P_lim_surf(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(autotroph_settings(n)%lname) // ' P Limitation, carbon biomass weighted average over 0-100m' + sname = trim(autotroph_settings(n)%sname) // '_P_lim_Cweight_avg_100m' + units = '1' + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%P_lim_Cweight_avg_100m(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(autotroph_settings(n)%lname) // ' Fe Limitation, Surface' + sname = trim(autotroph_settings(n)%sname) // '_Fe_lim_surf' + units = '1' + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%Fe_lim_surf(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(autotroph_settings(n)%lname) // ' Fe Limitation, carbon biomass weighted average over 0-100m' + sname = trim(autotroph_settings(n)%sname) // '_Fe_lim_Cweight_avg_100m' + units = '1' + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%Fe_lim_Cweight_avg_100m(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + if (autotroph_settings(n)%silicifier) then + lname = trim(autotroph_settings(n)%lname) // ' SiO3 Limitation, Surface' + sname = trim(autotroph_settings(n)%sname) // '_SiO3_lim_surf' + units = '1' + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%SiO3_lim_surf(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(autotroph_settings(n)%lname) // ' SiO3 Limitation, carbon biomass weighted average over 0-100m' + sname = trim(autotroph_settings(n)%sname) // '_SiO3_lim_Cweight_avg_100m' + units = '1' + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%SiO3_lim_Cweight_avg_100m(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + else + ind%SiO3_lim_surf(n) = -1 + ind%SiO3_lim_Cweight_avg_100m(n) = -1 + end if + + if (autotroph_settings(n)%is_carbon_limited) then + lname = trim(autotroph_settings(n)%lname) // ' C Limitation, Surface' + sname = trim(autotroph_settings(n)%sname) // '_C_lim_surf' + units = '1' + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%C_lim_surf(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(autotroph_settings(n)%lname) // ' C Limitation, carbon biomass weighted average over 0-100m' + sname = trim(autotroph_settings(n)%sname) // '_C_lim_Cweight_avg_100m' + units = '1' + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%C_lim_Cweight_avg_100m(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + end if + + lname = trim(autotroph_settings(n)%lname) // ' Light Limitation, Surface' + sname = trim(autotroph_settings(n)%sname) // '_light_lim_surf' + units = '1' + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%light_lim_surf(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(autotroph_settings(n)%lname) // ' Light Limitation, carbon biomass weighted average over 0-100m' + sname = trim(autotroph_settings(n)%sname) // '_light_lim_Cweight_avg_100m' + units = '1' + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%light_lim_Cweight_avg_100m(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(autotroph_settings(n)%lname) // ' C Fixation Vertical Integral' + sname = 'photoC_' // trim(autotroph_settings(n)%sname) // '_zint' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%photoC_zint(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(autotroph_settings(n)%lname) // ' C Fixation Vertical Integral, 0-100m' + sname = 'photoC_' // trim(autotroph_settings(n)%sname) // '_zint_100m' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%photoC_zint_100m(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(autotroph_settings(n)%lname) // ' C Fixation from NO3 Vertical Integral' + sname = 'photoC_NO3_' // trim(autotroph_settings(n)%sname) // '_zint' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%photoC_NO3_zint(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + if (autotroph_settings(n)%imp_calcifier .or. autotroph_settings(n)%exp_calcifier) then + lname = trim(autotroph_settings(n)%lname) // ' CaCO3 Formation Vertical Integral' + sname = trim(autotroph_settings(n)%sname) // '_CaCO3_form_zint' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%CaCO3_form_zint(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + else + ind%CaCO3_form_zint(n) = -1 + end if + + if (autotroph_settings(n)%imp_calcifier .or. autotroph_settings(n)%exp_calcifier) then + lname = trim(autotroph_settings(n)%lname) // ' CaCO3 Formation Vertical Integral, 0-100m' + sname = trim(autotroph_settings(n)%sname) // '_CaCO3_form_zint_100m' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%CaCO3_form_zint_100m(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + else + ind%CaCO3_form_zint_100m(n) = -1 + end if + + lname = trim(autotroph_settings(n)%lname) // ' Grazing Vertical Integral' + sname = 'graze_' // trim(autotroph_settings(n)%sname) // '_zint' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%auto_graze_zint(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(autotroph_settings(n)%lname) // ' Grazing Vertical Integral, 0-100m' + sname = 'graze_' // trim(autotroph_settings(n)%sname) // '_zint_100m' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%auto_graze_zint_100m(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(autotroph_settings(n)%lname) // ' Grazing to POC Vertical Integral' + sname = 'graze_' // trim(autotroph_settings(n)%sname) // '_poc_zint' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%auto_graze_poc_zint(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(autotroph_settings(n)%lname) // ' Grazing to POC Vertical Integral, 0-100m' + sname = 'graze_' // trim(autotroph_settings(n)%sname) // '_poc_zint_100m' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%auto_graze_poc_zint_100m(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(autotroph_settings(n)%lname) // ' Grazing to DOC Vertical Integral' + sname = 'graze_' // trim(autotroph_settings(n)%sname) // '_doc_zint' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%auto_graze_doc_zint(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(autotroph_settings(n)%lname) // ' Grazing to DOC Vertical Integral, 0-100m' + sname = 'graze_' // trim(autotroph_settings(n)%sname) // '_doc_zint_100m' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%auto_graze_doc_zint_100m(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + do m=1, zooplankton_cnt + lname = trim(autotroph_settings(n)%lname) // ' Grazing to ' // & + trim(zooplankton_settings(m)%lname) // ' Vertical Integral' + sname = 'graze_' // trim(autotroph_settings(n)%sname) // '_' // & + trim(zooplankton_settings(m)%sname) // '_zint' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%auto_graze_zoo_zint(n,m), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(autotroph_settings(n)%lname) // ' Grazing to ' // & + trim(zooplankton_settings(m)%lname) // ' Vertical Integral, 0-100m' + sname = 'graze_' // trim(autotroph_settings(n)%sname) // '_' // & + trim(zooplankton_settings(m)%sname) // '_zint_100m' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%auto_graze_zoo_zint_100m(n,m), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + end do + + lname = trim(autotroph_settings(n)%lname) // ' Loss Vertical Integral' + sname = trim(autotroph_settings(n)%sname) // '_loss_zint' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%auto_loss_zint(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(autotroph_settings(n)%lname) // ' Loss Vertical Integral, 0-100m' + sname = trim(autotroph_settings(n)%sname) // '_loss_zint_100m' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%auto_loss_zint_100m(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(autotroph_settings(n)%lname) // ' Loss to POC Vertical Integral' + sname = trim(autotroph_settings(n)%sname) // '_loss_poc_zint' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%auto_loss_poc_zint(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(autotroph_settings(n)%lname) // ' Loss to POC Vertical Integral, 0-100m' + sname = trim(autotroph_settings(n)%sname) // '_loss_poc_zint_100m' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%auto_loss_poc_zint_100m(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(autotroph_settings(n)%lname) // ' Loss to DOC Vertical Integral' + sname = trim(autotroph_settings(n)%sname) // '_loss_doc_zint' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%auto_loss_doc_zint(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(autotroph_settings(n)%lname) // ' Loss to DOC Vertical Integral, 0-100m' + sname = trim(autotroph_settings(n)%sname) // '_loss_doc_zint_100m' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%auto_loss_doc_zint_100m(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(autotroph_settings(n)%lname) // ' Aggregation Vertical Integral' + sname = trim(autotroph_settings(n)%sname) // '_agg_zint' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%auto_agg_zint(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(autotroph_settings(n)%lname) // ' Aggregation Vertical Integral, 0-100m' + sname = trim(autotroph_settings(n)%sname) // '_agg_zint_100m' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%auto_agg_zint_100m(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + end do + + lname = 'Total CaCO3 Formation Vertical Integral' + sname = 'CaCO3_form_zint' units = unit_system%conc_flux_units vgrid = 'none' truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%zoo_loss_doc_zint_100m(n), marbl_status_log) + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%tot_CaCO3_form_zint, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = 'Total CaCO3 Formation Vertical Integral, 0-100m' + sname = 'CaCO3_form_zint_100m' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%tot_CaCO3_form_zint_100m, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + ! Zooplankton 2D diags + if (.not.ind%lallocated()) then + allocate(ind%zoo_loss_zint(zooplankton_cnt)) + allocate(ind%zoo_loss_zint_100m(zooplankton_cnt)) + allocate(ind%zoo_loss_zint_150m(zooplankton_cnt)) + allocate(ind%zoo_loss_basal_zint(zooplankton_cnt)) + allocate(ind%zoo_loss_basal_zint_100m(zooplankton_cnt)) + allocate(ind%zoo_loss_poc_zint(zooplankton_cnt)) + allocate(ind%zoo_loss_poc_zint_100m(zooplankton_cnt)) + allocate(ind%zoo_loss_doc_zint(zooplankton_cnt)) + allocate(ind%zoo_loss_doc_zint_100m(zooplankton_cnt)) + allocate(ind%zoo_graze_zint(zooplankton_cnt)) + allocate(ind%zoo_graze_zint_100m(zooplankton_cnt)) + allocate(ind%zoo_graze_poc_zint(zooplankton_cnt)) + allocate(ind%zoo_graze_poc_zint_100m(zooplankton_cnt)) + allocate(ind%zoo_graze_doc_zint(zooplankton_cnt)) + allocate(ind%zoo_graze_doc_zint_100m(zooplankton_cnt)) + allocate(ind%zoo_graze_zoo_zint(zooplankton_cnt, zooplankton_cnt)) + allocate(ind%zoo_graze_zoo_zint_100m(zooplankton_cnt, zooplankton_cnt)) + allocate(ind%x_graze_zoo_zint(zooplankton_cnt)) + allocate(ind%x_graze_zoo_zint_100m(zooplankton_cnt)) + end if + do n = 1,zooplankton_cnt + lname = trim(zooplankton_settings(n)%lname) // ' Loss Vertical Integral' + sname = trim(zooplankton_settings(n)%sname) // '_loss_zint' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%zoo_loss_zint(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(zooplankton_settings(n)%lname) // ' Loss Vertical Integral, 0-100m' + sname = trim(zooplankton_settings(n)%sname) // '_loss_zint_100m' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%zoo_loss_zint_100m(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(zooplankton_settings(n)%lname) // ' Loss Vertical Integral, 0-150m' + sname = trim(zooplankton_settings(n)%sname) // '_loss_zint_150m' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%zoo_loss_zint_150m(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(zooplankton_settings(n)%lname) // ' Basal Respiration Vertical Integral' + sname = trim(zooplankton_settings(n)%sname) // '_loss_basal_zint' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%zoo_loss_basal_zint(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(zooplankton_settings(n)%lname) // ' Basal Respiration Vertical Integral, 0-100m' + sname = trim(zooplankton_settings(n)%sname) // '_loss_basal_zint_100m' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%zoo_loss_basal_zint_100m(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(zooplankton_settings(n)%lname) // ' Loss to POC Vertical Integral' + sname = trim(zooplankton_settings(n)%sname) // '_loss_poc_zint' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%zoo_loss_poc_zint(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(zooplankton_settings(n)%lname) // ' Loss to POC Vertical Integral, 0-100m' + sname = trim(zooplankton_settings(n)%sname) // '_loss_poc_zint_100m' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%zoo_loss_poc_zint_100m(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(zooplankton_settings(n)%lname) // ' Loss to DOC Vertical Integral' + sname = trim(zooplankton_settings(n)%sname) // '_loss_doc_zint' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%zoo_loss_doc_zint(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(zooplankton_settings(n)%lname) // ' Loss to DOC Vertical Integral, 0-100m' + sname = trim(zooplankton_settings(n)%sname) // '_loss_doc_zint_100m' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%zoo_loss_doc_zint_100m(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(zooplankton_settings(n)%lname) // ' Grazing Vertical Integral' + sname = 'graze_' // trim(zooplankton_settings(n)%sname) // '_zint' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%zoo_graze_zint(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(zooplankton_settings(n)%lname) // ' Grazing Vertical Integral, 0-100m' + sname = 'graze_' // trim(zooplankton_settings(n)%sname) // '_zint_100m' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%zoo_graze_zint_100m(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(zooplankton_settings(n)%lname) // ' Grazing to POC Vertical Integral' + sname = 'graze_' // trim(zooplankton_settings(n)%sname) // '_poc_zint' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%zoo_graze_poc_zint(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(zooplankton_settings(n)%lname) // ' Grazing to POC Vertical Integral, 0-100m' + sname = 'graze_' // trim(zooplankton_settings(n)%sname) // '_poc_zint_100m' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%zoo_graze_poc_zint_100m(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(zooplankton_settings(n)%lname) // ' Grazing to DOC Vertical Integral' + sname = 'graze_' // trim(zooplankton_settings(n)%sname) // '_doc_zint' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%zoo_graze_doc_zint(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(zooplankton_settings(n)%lname) // ' Grazing to DOC Vertical Integral, 0-100m' + sname = 'graze_' // trim(zooplankton_settings(n)%sname) // '_doc_zint_100m' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%zoo_graze_doc_zint_100m(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + do m=1, zooplankton_cnt + lname = trim(zooplankton_settings(n)%lname) // ' Grazing to ' // & + trim(zooplankton_settings(m)%lname) // ' Vertical Integral' + sname = 'graze_' // trim(zooplankton_settings(n)%sname) // '_' // & + trim(zooplankton_settings(m)%sname) // '_zint' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%zoo_graze_zoo_zint(n,m), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(zooplankton_settings(n)%lname) // ' Grazing to ' // & + trim(zooplankton_settings(m)%lname) // ' Vertical Integral, 0-100m' + sname = 'graze_' // trim(zooplankton_settings(n)%sname) // '_' // & + trim(zooplankton_settings(m)%sname) // '_zint_100m' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%zoo_graze_zoo_zint_100m(n,m), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + end do + + lname = trim(zooplankton_settings(n)%lname) // ' Grazing Gain Vertical Integral' + sname = 'x_graze_' // trim(zooplankton_settings(n)%sname) // '_zint' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%x_graze_zoo_zint(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(zooplankton_settings(n)%lname) // ' Grazing Gain Vertical Integral, 0-100m' + sname = 'x_graze_' // trim(zooplankton_settings(n)%sname) // '_zint_100m' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%x_graze_zoo_zint_100m(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + end do + + ! General 3D diags + lname = 'in situ temperature' + sname = 'insitu_temp' + units = 'degC' + vgrid = 'layer_avg' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%insitu_temp, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(zooplankton_settings(n)%lname) // ' Grazing Vertical Integral' - sname = 'graze_' // trim(zooplankton_settings(n)%sname) // '_zint' - units = unit_system%conc_flux_units - vgrid = 'none' + lname = 'Carbonate Ion Concentration' + sname = 'CO3' + units = unit_system%conc_units + vgrid = 'layer_avg' truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%zoo_graze_zint(n), marbl_status_log) + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%CO3, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(zooplankton_settings(n)%lname) // ' Grazing Vertical Integral, 0-100m' - sname = 'graze_' // trim(zooplankton_settings(n)%sname) // '_zint_100m' - units = unit_system%conc_flux_units - vgrid = 'none' + lname = 'Bicarbonate Ion Concentration' + sname = 'HCO3' + units = unit_system%conc_units + vgrid = 'layer_avg' truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%zoo_graze_zint_100m(n), marbl_status_log) + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%HCO3, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(zooplankton_settings(n)%lname) // ' Grazing to POC Vertical Integral' - sname = 'graze_' // trim(zooplankton_settings(n)%sname) // '_poc_zint' - units = unit_system%conc_flux_units - vgrid = 'none' + lname = 'Carbonic Acid Concentration' + sname = 'H2CO3' + units = unit_system%conc_units + vgrid = 'layer_avg' truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%zoo_graze_poc_zint(n), marbl_status_log) + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%H2CO3, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(zooplankton_settings(n)%lname) // ' Grazing to POC Vertical Integral, 0-100m' - sname = 'graze_' // trim(zooplankton_settings(n)%sname) // '_poc_zint_100m' - units = unit_system%conc_flux_units - vgrid = 'none' + lname = 'pH' + sname = 'pH_3D' + units = '1' + vgrid = 'layer_avg' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%ph_3D, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = 'Carbonate Ion Concentration, Alternative CO2' + sname = 'CO3_ALT_CO2' + units = unit_system%conc_units + vgrid = 'layer_avg' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%CO3_ALT_CO2, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = 'Bicarbonate Ion Concentration, Alternative CO2' + sname = 'HCO3_ALT_CO2' + units = unit_system%conc_units + vgrid = 'layer_avg' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%HCO3_ALT_CO2, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = 'Carbonic Acid Concentration, Alternative CO2' + sname = 'H2CO3_ALT_CO2' + units = unit_system%conc_units + vgrid = 'layer_avg' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%H2CO3_ALT_CO2, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = 'pH, Alternative CO2' + sname = 'pH_3D_ALT_CO2' + units = '1' + vgrid = 'layer_avg' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%ph_3D_ALT_CO2, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = 'CO3 concentration at calcite saturation' + sname = 'co3_sat_calc' + units = unit_system%conc_units + vgrid = 'layer_avg' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%co3_sat_calc, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = 'CO3 concentration at aragonite saturation' + sname = 'co3_sat_arag' + units = unit_system%conc_units + vgrid = 'layer_avg' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%co3_sat_arag, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = 'Nitrification' + sname = 'NITRIF' + units = unit_system%conc_tend_units + vgrid = 'layer_avg' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%NITRIF, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = 'Denitrification' + sname = 'DENITRIF' + units = unit_system%conc_tend_units + vgrid = 'layer_avg' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%DENITRIF, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = 'O2 Production' + sname = 'O2_PRODUCTION' + units = unit_system%conc_tend_units + vgrid = 'layer_avg' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%O2_PRODUCTION, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + if (lo2_consumption_scalef) then + lname = 'O2 Consumption Scale Factor' + sname = 'O2_CONSUMPTION_SCALEF' + units = '1' + vgrid = 'layer_avg' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%O2_CONSUMPTION_SCALEF, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + end if + + lname = 'O2 Consumption' + sname = 'O2_CONSUMPTION' + units = unit_system%conc_tend_units + vgrid = 'layer_avg' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%O2_CONSUMPTION, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = 'Apparent O2 Utilization' + sname = 'AOU' + units = unit_system%conc_units + vgrid = 'layer_avg' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%AOU, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = 'PAR Average over Model Cell' + sname = 'PAR_avg' + units = 'W/m^2' + vgrid = 'layer_avg' + truncate = .not. lecovars_full_depth_tavg + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%PAR_avg, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = 'Total Autotroph Grazing' + sname = 'graze_auto_TOT' + units = unit_system%conc_tend_units + vgrid = 'layer_avg' + truncate = .not. lecovars_full_depth_tavg + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%auto_graze_TOT, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = 'Total C Fixation' + sname = 'photoC_TOT' + units = unit_system%conc_tend_units + vgrid = 'layer_avg' + truncate = .not. lecovars_full_depth_tavg + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%photoC_TOT, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = 'Total C Fixation from NO3' + sname = 'photoC_NO3_TOT' + units = unit_system%conc_tend_units + vgrid = 'layer_avg' + truncate = .not. lecovars_full_depth_tavg + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%photoC_NO3_TOT, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = 'DOC Production' + sname = 'DOC_prod' + units = unit_system%conc_tend_units + vgrid = 'layer_avg' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%DOC_prod, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = 'DOC Remineralization' + sname = 'DOC_remin' + units = unit_system%conc_tend_units + vgrid = 'layer_avg' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%DOC_remin, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = 'DOCr Remineralization' + sname = 'DOCr_remin' + units = unit_system%conc_tend_units + vgrid = 'layer_avg' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%DOCr_remin, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = 'DON Production' + sname = 'DON_prod' + units = unit_system%conc_tend_units + vgrid = 'layer_avg' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%DON_prod, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = 'DON Remineralization' + sname = 'DON_remin' + units = unit_system%conc_tend_units + vgrid = 'layer_avg' truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%zoo_graze_poc_zint_100m(n), marbl_status_log) + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%DON_remin, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(zooplankton_settings(n)%lname) // ' Grazing to DOC Vertical Integral' - sname = 'graze_' // trim(zooplankton_settings(n)%sname) // '_doc_zint' - units = unit_system%conc_flux_units - vgrid = 'none' + lname = 'DONr Remineralization' + sname = 'DONr_remin' + units = unit_system%conc_tend_units + vgrid = 'layer_avg' truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%zoo_graze_doc_zint(n), marbl_status_log) + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%DONr_remin, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(zooplankton_settings(n)%lname) // ' Grazing to DOC Vertical Integral, 0-100m' - sname = 'graze_' // trim(zooplankton_settings(n)%sname) // '_doc_zint_100m' - units = unit_system%conc_flux_units - vgrid = 'none' + lname = 'DOP Production' + sname = 'DOP_prod' + units = unit_system%conc_tend_units + vgrid = 'layer_avg' truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%zoo_graze_doc_zint_100m(n), marbl_status_log) + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%DOP_prod, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - do m=1, zooplankton_cnt - lname = trim(zooplankton_settings(n)%lname) // ' Grazing to ' // & - trim(zooplankton_settings(m)%lname) // ' Vertical Integral' - sname = 'graze_' // trim(zooplankton_settings(n)%sname) // '_' // & - trim(zooplankton_settings(m)%sname) // '_zint' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%zoo_graze_zoo_zint(n,m), marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = trim(zooplankton_settings(n)%lname) // ' Grazing to ' // & - trim(zooplankton_settings(m)%lname) // ' Vertical Integral, 0-100m' - sname = 'graze_' // trim(zooplankton_settings(n)%sname) // '_' // & - trim(zooplankton_settings(m)%sname) // '_zint_100m' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%zoo_graze_zoo_zint_100m(n,m), marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - end do - - lname = trim(zooplankton_settings(n)%lname) // ' Grazing Gain Vertical Integral' - sname = 'x_graze_' // trim(zooplankton_settings(n)%sname) // '_zint' - units = unit_system%conc_flux_units - vgrid = 'none' + lname = 'DOP Remineralization' + sname = 'DOP_remin' + units = unit_system%conc_tend_units + vgrid = 'layer_avg' truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%x_graze_zoo_zint(n), marbl_status_log) + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%DOP_remin, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(zooplankton_settings(n)%lname) // ' Grazing Gain Vertical Integral, 0-100m' - sname = 'x_graze_' // trim(zooplankton_settings(n)%sname) // '_zint_100m' - units = unit_system%conc_flux_units - vgrid = 'none' + lname = 'DOPr Remineralization' + sname = 'DOPr_remin' + units = unit_system%conc_tend_units + vgrid = 'layer_avg' truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%x_graze_zoo_zint_100m(n), marbl_status_log) + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%DOPr_remin, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - end do - - ! General 3D diags - lname = 'in situ temperature' - sname = 'insitu_temp' - units = 'degC' - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%insitu_temp, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Carbonate Ion Concentration' - sname = 'CO3' - units = unit_system%conc_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%CO3, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Bicarbonate Ion Concentration' - sname = 'HCO3' - units = unit_system%conc_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%HCO3, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Carbonic Acid Concentration' - sname = 'H2CO3' - units = unit_system%conc_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%H2CO3, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'pH' - sname = 'pH_3D' - units = '1' - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%ph_3D, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Carbonate Ion Concentration, Alternative CO2' - sname = 'CO3_ALT_CO2' - units = unit_system%conc_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%CO3_ALT_CO2, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Bicarbonate Ion Concentration, Alternative CO2' - sname = 'HCO3_ALT_CO2' - units = unit_system%conc_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%HCO3_ALT_CO2, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Carbonic Acid Concentration, Alternative CO2' - sname = 'H2CO3_ALT_CO2' - units = unit_system%conc_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%H2CO3_ALT_CO2, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'pH, Alternative CO2' - sname = 'pH_3D_ALT_CO2' - units = '1' - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%ph_3D_ALT_CO2, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'CO3 concentration at calcite saturation' - sname = 'co3_sat_calc' - units = unit_system%conc_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%co3_sat_calc, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'CO3 concentration at aragonite saturation' - sname = 'co3_sat_arag' - units = unit_system%conc_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%co3_sat_arag, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Nitrification' - sname = 'NITRIF' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%NITRIF, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Denitrification' - sname = 'DENITRIF' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%DENITRIF, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'O2 Production' - sname = 'O2_PRODUCTION' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%O2_PRODUCTION, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - if (lo2_consumption_scalef) then - lname = 'O2 Consumption Scale Factor' - sname = 'O2_CONSUMPTION_SCALEF' - units = '1' + lname = 'DOP loss, due to P budget balancing' + sname = 'DOP_loss_P_bal' + units = unit_system%conc_tend_units vgrid = 'layer_avg' truncate = .false. call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%O2_CONSUMPTION_SCALEF, marbl_status_log) + ind%DOP_loss_P_bal, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - end if - - lname = 'O2 Consumption' - sname = 'O2_CONSUMPTION' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%O2_CONSUMPTION, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Apparent O2 Utilization' - sname = 'AOU' - units = unit_system%conc_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%AOU, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'PAR Average over Model Cell' - sname = 'PAR_avg' - units = 'W/m^2' - vgrid = 'layer_avg' - truncate = .not. lecovars_full_depth_tavg - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%PAR_avg, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Total Autotroph Grazing' - sname = 'graze_auto_TOT' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .not. lecovars_full_depth_tavg - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%auto_graze_TOT, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Total C Fixation' - sname = 'photoC_TOT' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .not. lecovars_full_depth_tavg - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%photoC_TOT, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Total C Fixation from NO3' - sname = 'photoC_NO3_TOT' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .not. lecovars_full_depth_tavg - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%photoC_NO3_TOT, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'DOC Production' - sname = 'DOC_prod' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%DOC_prod, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'DOC Remineralization' - sname = 'DOC_remin' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%DOC_remin, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'DOCr Remineralization' - sname = 'DOCr_remin' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%DOCr_remin, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'DON Production' - sname = 'DON_prod' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%DON_prod, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'DON Remineralization' - sname = 'DON_remin' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%DON_remin, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'DONr Remineralization' - sname = 'DONr_remin' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%DONr_remin, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'DOP Production' - sname = 'DOP_prod' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%DOP_prod, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'DOP Remineralization' - sname = 'DOP_remin' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%DOP_remin, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'DOPr Remineralization' - sname = 'DOPr_remin' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%DOPr_remin, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'DOP loss, due to P budget balancing' - sname = 'DOP_loss_P_bal' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%DOP_loss_P_bal, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Iron Scavenging' - sname = 'Fe_scavenge' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%Fe_scavenge, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Iron Scavenging Rate' - sname = 'Fe_scavenge_rate' - units = '1/y' - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%Fe_scavenge_rate, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Production of Fe-binding Ligand' - sname = 'Lig_prod' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%Lig_prod, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Loss of Fe-binding Ligand' - sname = 'Lig_loss' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%Lig_loss, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Loss of Fe-binding Ligand from Scavenging' - sname = 'Lig_scavenge' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%Lig_scavenge, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Fe not bound to Ligand' - sname = 'Fefree' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%Fefree, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Loss of Fe-binding Ligand from UV radiation' - sname = 'Lig_photochem' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%Lig_photochem, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Loss of Fe-binding Ligand from Bacterial Degradation' - sname = 'Lig_deg' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%Lig_deg, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Iron Sediment Flux' - sname = 'FESEDFLUX' - units = unit_system%conc_flux_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%fesedflux, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - ! Particulate 2D diags - - write(particulate_flux_ref_depth_str, "(I0,A)") int(particulate_flux_ref_depth*unit_system%len2m), 'm' - - lname = 'POC Flux at ' // trim(particulate_flux_ref_depth_str) - sname = 'POC_FLUX_' // trim(particulate_flux_ref_depth_str) - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%POC_FLUX_at_ref_depth, marbl_status_log, ref_depth=particulate_flux_ref_depth) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'POP Flux at ' // trim(particulate_flux_ref_depth_str) - sname = 'POP_FLUX_' // trim(particulate_flux_ref_depth_str) - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%POP_FLUX_at_ref_depth, marbl_status_log, ref_depth=particulate_flux_ref_depth) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'CaCO3 Flux at ' // trim(particulate_flux_ref_depth_str) - sname = 'CaCO3_FLUX_' // trim(particulate_flux_ref_depth_str) - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%CaCO3_FLUX_at_ref_depth, marbl_status_log, ref_depth=particulate_flux_ref_depth) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'SiO2 Flux at ' // trim(particulate_flux_ref_depth_str) - sname = 'SiO2_FLUX_' // trim(particulate_flux_ref_depth_str) - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%SiO2_FLUX_at_ref_depth, marbl_status_log, ref_depth=particulate_flux_ref_depth) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'P_iron Flux at ' // trim(particulate_flux_ref_depth_str) - sname = 'P_iron_FLUX_' // trim(particulate_flux_ref_depth_str) - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%P_iron_FLUX_at_ref_depth, marbl_status_log, ref_depth=particulate_flux_ref_depth) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Vertical Integral of POC Production' - sname = 'POC_PROD_zint' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%POC_PROD_zint, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Vertical Integral of POC Production, 0-100m' - sname = 'POC_PROD_zint_100m' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%POC_PROD_zint_100m, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Vertical Integral of POC Remineralization routed to DOCr' - sname = 'POC_REMIN_DOCr_zint' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%POC_REMIN_DOCr_zint, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Vertical Integral of POC Remineralization routed to DOCr, 0-100m' - sname = 'POC_REMIN_DOCr_zint_100m' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%POC_REMIN_DOCr_zint_100m, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Vertical Integral of POC Remineralization routed to DIC' - sname = 'POC_REMIN_DIC_zint' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%POC_REMIN_DIC_zint, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Vertical Integral of POC Remineralization routed to DIC, 0-100m' - sname = 'POC_REMIN_DIC_zint_100m' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%POC_REMIN_DIC_zint_100m, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Vertical Integral of CaCO3 Production' - sname = 'CaCO3_PROD_zint' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%CaCO3_PROD_zint, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Vertical Integral of CaCO3 Production, 0-100m' - sname = 'CaCO3_PROD_zint_100m' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%CaCO3_PROD_zint_100m, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Vertical Integral of CaCO3 Remineralization' - sname = 'CaCO3_REMIN_zint' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%CaCO3_REMIN_zint, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - - lname = 'Vertical Integral of CaCO3 Remineralization, 0-100m' - sname = 'CaCO3_REMIN_zint_100m' - units = unit_system%conc_flux_units - vgrid = 'none' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%CaCO3_REMIN_zint_100m, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - ! Particulate 3D diags - if (lp_remin_scalef) then - lname = 'Particulate Remin Scale Factor' - sname = 'P_REMIN_SCALEF' - units = '1' + lname = 'Iron Scavenging' + sname = 'Fe_scavenge' + units = unit_system%conc_tend_units vgrid = 'layer_avg' truncate = .false. call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%P_REMIN_SCALEF, marbl_status_log) + ind%Fe_scavenge, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - end if - - lname = 'POC Flux into Cell' - sname = 'POC_FLUX_IN' - units = unit_system%conc_flux_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%POC_FLUX_IN, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - lname = 'POC sFlux into Cell' - sname = 'POC_sFLUX_IN' - units = unit_system%conc_flux_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%POC_sFLUX_IN, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = 'Iron Scavenging Rate' + sname = 'Fe_scavenge_rate' + units = '1/y' + vgrid = 'layer_avg' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%Fe_scavenge_rate, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'POC hFlux into Cell' - sname = 'POC_hFLUX_IN' - units = unit_system%conc_flux_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%POC_hFLUX_IN, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = 'Production of Fe-binding Ligand' + sname = 'Lig_prod' + units = unit_system%conc_tend_units + vgrid = 'layer_avg' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%Lig_prod, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'POC Production' - sname = 'POC_PROD' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%POC_PROD, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = 'Loss of Fe-binding Ligand' + sname = 'Lig_loss' + units = unit_system%conc_tend_units + vgrid = 'layer_avg' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%Lig_loss, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'POC Remineralization routed to DOCr' - sname = 'POC_REMIN_DOCr' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%POC_REMIN_DOCr, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = 'Loss of Fe-binding Ligand from Scavenging' + sname = 'Lig_scavenge' + units = unit_system%conc_tend_units + vgrid = 'layer_avg' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%Lig_scavenge, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'POC Remineralization routed to DIC' - sname = 'POC_REMIN_DIC' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%POC_REMIN_DIC, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = 'Fe not bound to Ligand' + sname = 'Fefree' + units = unit_system%conc_units + vgrid = 'layer_avg' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%Fefree, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'POP Flux into Cell' - sname = 'POP_FLUX_IN' - units = unit_system%conc_flux_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%POP_FLUX_IN, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = 'Loss of Fe-binding Ligand from UV radiation' + sname = 'Lig_photochem' + units = unit_system%conc_tend_units + vgrid = 'layer_avg' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%Lig_photochem, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'POP Production' - sname = 'POP_PROD' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%POP_PROD, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = 'Loss of Fe-binding Ligand from Bacterial Degradation' + sname = 'Lig_deg' + units = unit_system%conc_tend_units + vgrid = 'layer_avg' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%Lig_deg, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'POP Remineralization routed to DOPr' - sname = 'POP_REMIN_DOPr' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%POP_REMIN_DOPr, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = 'Iron Sediment Flux' + sname = 'FESEDFLUX' + units = unit_system%conc_flux_units + vgrid = 'layer_avg' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%fesedflux, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'POP Remineralization routed to PO4' - sname = 'POP_REMIN_PO4' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%POP_REMIN_PO4, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + ! Particulate 2D diags - lname = 'PON Remineralization routed to DONr' - sname = 'PON_REMIN_DONr' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%PON_REMIN_DONr, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + write(particulate_flux_ref_depth_str, "(I0,A)") int(particulate_flux_ref_depth*unit_system%len2m), 'm' - lname = 'PON Remineralization routed to NH4' - sname = 'PON_REMIN_NH4' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%PON_REMIN_NH4, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = 'POC Flux at ' // trim(particulate_flux_ref_depth_str) + sname = 'POC_FLUX_' // trim(particulate_flux_ref_depth_str) + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%POC_FLUX_at_ref_depth, marbl_status_log, ref_depth=particulate_flux_ref_depth) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'CaCO3 Flux into Cell' - sname = 'CaCO3_FLUX_IN' - units = unit_system%conc_flux_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%CaCO3_FLUX_IN, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = 'POP Flux at ' // trim(particulate_flux_ref_depth_str) + sname = 'POP_FLUX_' // trim(particulate_flux_ref_depth_str) + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%POP_FLUX_at_ref_depth, marbl_status_log, ref_depth=particulate_flux_ref_depth) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'CaCO3 Production' - sname = 'CaCO3_PROD' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%CaCO3_PROD, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = 'CaCO3 Flux at ' // trim(particulate_flux_ref_depth_str) + sname = 'CaCO3_FLUX_' // trim(particulate_flux_ref_depth_str) + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%CaCO3_FLUX_at_ref_depth, marbl_status_log, ref_depth=particulate_flux_ref_depth) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'CaCO3 Remineralization' - sname = 'CaCO3_REMIN' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%CaCO3_REMIN, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = 'SiO2 Flux at ' // trim(particulate_flux_ref_depth_str) + sname = 'SiO2_FLUX_' // trim(particulate_flux_ref_depth_str) + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%SiO2_FLUX_at_ref_depth, marbl_status_log, ref_depth=particulate_flux_ref_depth) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'CaCO3 Flux into Cell, Alternative CO2' - sname = 'CaCO3_ALT_CO2_FLUX_IN' - units = unit_system%conc_flux_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%CaCO3_ALT_CO2_FLUX_IN, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = 'P_iron Flux at ' // trim(particulate_flux_ref_depth_str) + sname = 'P_iron_FLUX_' // trim(particulate_flux_ref_depth_str) + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%P_iron_FLUX_at_ref_depth, marbl_status_log, ref_depth=particulate_flux_ref_depth) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'CaCO3 Production, Alternative CO2' - sname = 'CaCO3_ALT_CO2_PROD' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%CaCO3_ALT_CO2_PROD, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = 'Vertical Integral of POC Production' + sname = 'POC_PROD_zint' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%POC_PROD_zint, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'CaCO3 Remineralization, Alternative CO2' - sname = 'CaCO3_ALT_CO2_REMIN' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%CaCO3_ALT_CO2_REMIN, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = 'Vertical Integral of POC Production, 0-100m' + sname = 'POC_PROD_zint_100m' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%POC_PROD_zint_100m, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'SiO2 Flux into Cell' - sname = 'SiO2_FLUX_IN' - units = unit_system%conc_flux_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%SiO2_FLUX_IN, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = 'Vertical Integral of POC Remineralization routed to DOCr' + sname = 'POC_REMIN_DOCr_zint' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%POC_REMIN_DOCr_zint, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'SiO2 Production' - sname = 'SiO2_PROD' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%SiO2_PROD, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = 'Vertical Integral of POC Remineralization routed to DOCr, 0-100m' + sname = 'POC_REMIN_DOCr_zint_100m' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%POC_REMIN_DOCr_zint_100m, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'SiO2 Remineralization' - sname = 'SiO2_REMIN' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%SiO2_REMIN, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = 'Vertical Integral of POC Remineralization routed to DIC' + sname = 'POC_REMIN_DIC_zint' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%POC_REMIN_DIC_zint, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'Dust Flux into Cell' - sname = 'dust_FLUX_IN' - write(units, "(4A)") trim(unit_system%M), '/', trim(unit_system%L), '^2/s' - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%dust_FLUX_IN, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = 'Vertical Integral of POC Remineralization routed to DIC, 0-100m' + sname = 'POC_REMIN_DIC_zint_100m' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%POC_REMIN_DIC_zint_100m, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'Dust Remineralization' - sname = 'dust_REMIN' - write(units, "(4A)") trim(unit_system%M), '/', trim(unit_system%L), '^3/s' - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%dust_REMIN, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = 'Vertical Integral of CaCO3 Production' + sname = 'CaCO3_PROD_zint' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%CaCO3_PROD_zint, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'P_iron Flux into Cell' - sname = 'P_iron_FLUX_IN' - units = unit_system%conc_flux_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%P_iron_FLUX_IN, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = 'Vertical Integral of CaCO3 Production, 0-100m' + sname = 'CaCO3_PROD_zint_100m' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%CaCO3_PROD_zint_100m, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'P_iron Production' - sname = 'P_iron_PROD' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%P_iron_PROD, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = 'Vertical Integral of CaCO3 Remineralization' + sname = 'CaCO3_REMIN_zint' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%CaCO3_REMIN_zint, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'P_iron Remineralization' - sname = 'P_iron_REMIN' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .false. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%P_iron_REMIN, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = 'Vertical Integral of CaCO3 Remineralization, 0-100m' + sname = 'CaCO3_REMIN_zint_100m' + units = unit_system%conc_flux_units + vgrid = 'none' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%CaCO3_REMIN_zint_100m, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - ! Autotroph 3D diags - if (.not.ind%lconstructed()) then - allocate(ind%Qp(autotroph_cnt)) - allocate(ind%photoC(autotroph_cnt)) - allocate(ind%photoC_NO3(autotroph_cnt)) - allocate(ind%photoFe(autotroph_cnt)) - allocate(ind%photoNO3(autotroph_cnt)) - allocate(ind%photoNH4(autotroph_cnt)) - allocate(ind%DOP_uptake(autotroph_cnt)) - allocate(ind%PO4_uptake(autotroph_cnt)) - allocate(ind%auto_graze(autotroph_cnt)) - allocate(ind%auto_graze_poc(autotroph_cnt)) - allocate(ind%auto_graze_doc(autotroph_cnt)) - allocate(ind%auto_graze_zootot(autotroph_cnt)) - allocate(ind%auto_graze_zoo(autotroph_cnt, zooplankton_cnt)) - allocate(ind%auto_loss(autotroph_cnt)) - allocate(ind%auto_loss_poc(autotroph_cnt)) - allocate(ind%auto_loss_doc(autotroph_cnt)) - allocate(ind%auto_agg(autotroph_cnt)) - allocate(ind%bSi_form(autotroph_cnt)) - allocate(ind%CaCO3_form(autotroph_cnt)) - allocate(ind%Nfix(autotroph_cnt)) - end if - do n=1,autotroph_cnt - if (lvariable_PtoC) then - lname = trim(autotroph_settings(n)%lname) // ' P:C ratio' - sname = trim(autotroph_settings(n)%sname) // '_Qp' + ! Particulate 3D diags + if (lp_remin_scalef) then + lname = 'Particulate Remin Scale Factor' + sname = 'P_REMIN_SCALEF' units = '1' vgrid = 'layer_avg' - truncate = .not. lecovars_full_depth_tavg - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%Qp(n), marbl_status_log) + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%P_REMIN_SCALEF, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - else - ind%Qp(n) = -1 end if - lname = trim(autotroph_settings(n)%lname) // ' C Fixation' - sname = 'photoC_' // trim(autotroph_settings(n)%sname) + lname = 'POC Flux into Cell' + sname = 'POC_FLUX_IN' + units = unit_system%conc_flux_units + vgrid = 'layer_avg' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%POC_FLUX_IN, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = 'POC sFlux into Cell' + sname = 'POC_sFLUX_IN' + units = unit_system%conc_flux_units + vgrid = 'layer_avg' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%POC_sFLUX_IN, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = 'POC hFlux into Cell' + sname = 'POC_hFLUX_IN' + units = unit_system%conc_flux_units + vgrid = 'layer_avg' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%POC_hFLUX_IN, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = 'POC Production' + sname = 'POC_PROD' units = unit_system%conc_tend_units vgrid = 'layer_avg' - truncate = .not. lecovars_full_depth_tavg - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%photoC(n), marbl_status_log) + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%POC_PROD, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(autotroph_settings(n)%lname) // ' C Fixation from NO3' - sname = 'photoC_NO3_' // trim(autotroph_settings(n)%sname) + lname = 'POC Remineralization routed to DOCr' + sname = 'POC_REMIN_DOCr' units = unit_system%conc_tend_units vgrid = 'layer_avg' - truncate = .not. lecovars_full_depth_tavg - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%photoC_NO3(n), marbl_status_log) + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%POC_REMIN_DOCr, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(autotroph_settings(n)%lname) // ' Fe Uptake' - sname = 'photoFe_' // trim(autotroph_settings(n)%sname) + lname = 'POC Remineralization routed to DIC' + sname = 'POC_REMIN_DIC' units = unit_system%conc_tend_units vgrid = 'layer_avg' - truncate = .not. lecovars_full_depth_tavg - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%photoFe(n), marbl_status_log) + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%POC_REMIN_DIC, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(autotroph_settings(n)%lname) // ' NO3 Uptake' - sname = 'photoNO3_' // trim(autotroph_settings(n)%sname) + lname = 'POP Flux into Cell' + sname = 'POP_FLUX_IN' + units = unit_system%conc_flux_units + vgrid = 'layer_avg' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%POP_FLUX_IN, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = 'POP Production' + sname = 'POP_PROD' units = unit_system%conc_tend_units vgrid = 'layer_avg' - truncate = .not. lecovars_full_depth_tavg - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%photoNO3(n), marbl_status_log) + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%POP_PROD, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(autotroph_settings(n)%lname) // ' NH4 Uptake' - sname = 'photoNH4_' // trim(autotroph_settings(n)%sname) + lname = 'POP Remineralization routed to DOPr' + sname = 'POP_REMIN_DOPr' units = unit_system%conc_tend_units vgrid = 'layer_avg' - truncate = .not. lecovars_full_depth_tavg - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%photoNH4(n), marbl_status_log) + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%POP_REMIN_DOPr, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(autotroph_settings(n)%lname) // ' DOP Uptake' - sname = 'DOP_' // trim(autotroph_settings(n)%sname) // '_uptake' + lname = 'POP Remineralization routed to PO4' + sname = 'POP_REMIN_PO4' units = unit_system%conc_tend_units vgrid = 'layer_avg' - truncate = .not. lecovars_full_depth_tavg - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%DOP_uptake(n), marbl_status_log) + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%POP_REMIN_PO4, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(autotroph_settings(n)%lname) // ' PO4 Uptake' - sname = 'PO4_' // trim(autotroph_settings(n)%sname) // '_uptake' + lname = 'PON Remineralization routed to DONr' + sname = 'PON_REMIN_DONr' units = unit_system%conc_tend_units vgrid = 'layer_avg' - truncate = .not. lecovars_full_depth_tavg - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%PO4_uptake(n), marbl_status_log) + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%PON_REMIN_DONr, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(autotroph_settings(n)%lname) // ' Grazing' - sname = 'graze_' // trim(autotroph_settings(n)%sname) + lname = 'PON Remineralization routed to NH4' + sname = 'PON_REMIN_NH4' units = unit_system%conc_tend_units vgrid = 'layer_avg' - truncate = .not. lecovars_full_depth_tavg - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%auto_graze(n), marbl_status_log) + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%PON_REMIN_NH4, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = 'CaCO3 Flux into Cell' + sname = 'CaCO3_FLUX_IN' + units = unit_system%conc_flux_units + vgrid = 'layer_avg' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%CaCO3_FLUX_IN, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(autotroph_settings(n)%lname) // ' Grazing to POC' - sname = 'graze_' // trim(autotroph_settings(n)%sname) // '_poc' + lname = 'CaCO3 Production' + sname = 'CaCO3_PROD' units = unit_system%conc_tend_units vgrid = 'layer_avg' - truncate = .not. lecovars_full_depth_tavg - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%auto_graze_poc(n), marbl_status_log) + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%CaCO3_PROD, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(autotroph_settings(n)%lname) // ' Grazing to DOC' - sname = 'graze_' // trim(autotroph_settings(n)%sname) // '_doc' + lname = 'CaCO3 Remineralization' + sname = 'CaCO3_REMIN' units = unit_system%conc_tend_units vgrid = 'layer_avg' - truncate = .not. lecovars_full_depth_tavg - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%auto_graze_doc(n), marbl_status_log) + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%CaCO3_REMIN, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = 'CaCO3 Flux into Cell, Alternative CO2' + sname = 'CaCO3_ALT_CO2_FLUX_IN' + units = unit_system%conc_flux_units + vgrid = 'layer_avg' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%CaCO3_ALT_CO2_FLUX_IN, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(autotroph_settings(n)%lname) // ' Grazing to ZOO TOT' - sname = 'graze_' // trim(autotroph_settings(n)%sname) // '_zootot' + lname = 'CaCO3 Production, Alternative CO2' + sname = 'CaCO3_ALT_CO2_PROD' units = unit_system%conc_tend_units vgrid = 'layer_avg' - truncate = .not. lecovars_full_depth_tavg - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%auto_graze_zootot(n), marbl_status_log) + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%CaCO3_ALT_CO2_PROD, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - do m=1, zooplankton_cnt - lname = trim(autotroph_settings(n)%lname) // ' Grazing to ' // trim(zooplankton_settings(m)%lname) - sname = 'graze_' // trim(autotroph_settings(n)%sname) // '_' // trim(zooplankton_settings(m)%sname) - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .not. lecovars_full_depth_tavg - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%auto_graze_zoo(n,m), marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if - end do + lname = 'CaCO3 Remineralization, Alternative CO2' + sname = 'CaCO3_ALT_CO2_REMIN' + units = unit_system%conc_tend_units + vgrid = 'layer_avg' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%CaCO3_ALT_CO2_REMIN, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = 'SiO2 Flux into Cell' + sname = 'SiO2_FLUX_IN' + units = unit_system%conc_flux_units + vgrid = 'layer_avg' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%SiO2_FLUX_IN, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = trim(autotroph_settings(n)%lname) // ' Loss' - sname = trim(autotroph_settings(n)%sname) // '_loss' + lname = 'SiO2 Production' + sname = 'SiO2_PROD' units = unit_system%conc_tend_units vgrid = 'layer_avg' - truncate = .not. lecovars_full_depth_tavg - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%auto_loss(n), marbl_status_log) + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%SiO2_PROD, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(autotroph_settings(n)%lname) // ' Loss to POC' - sname = trim(autotroph_settings(n)%sname) // '_loss_poc' + lname = 'SiO2 Remineralization' + sname = 'SiO2_REMIN' units = unit_system%conc_tend_units vgrid = 'layer_avg' - truncate = .not. lecovars_full_depth_tavg - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%auto_loss_poc(n), marbl_status_log) + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%SiO2_REMIN, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = 'Dust Flux into Cell' + sname = 'dust_FLUX_IN' + write(units, "(4A)") trim(unit_system%M), '/', trim(unit_system%L), '^2/s' + vgrid = 'layer_avg' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%dust_FLUX_IN, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = 'Dust Remineralization' + sname = 'dust_REMIN' + write(units, "(4A)") trim(unit_system%M), '/', trim(unit_system%L), '^3/s' + vgrid = 'layer_avg' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%dust_REMIN, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = 'P_iron Flux into Cell' + sname = 'P_iron_FLUX_IN' + units = unit_system%conc_flux_units + vgrid = 'layer_avg' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%P_iron_FLUX_IN, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(autotroph_settings(n)%lname) // ' Loss to DOC' - sname = trim(autotroph_settings(n)%sname) // '_loss_doc' + lname = 'P_iron Production' + sname = 'P_iron_PROD' units = unit_system%conc_tend_units vgrid = 'layer_avg' - truncate = .not. lecovars_full_depth_tavg - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%auto_loss_doc(n), marbl_status_log) + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%P_iron_PROD, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = 'P_iron Remineralization' + sname = 'P_iron_REMIN' + units = unit_system%conc_tend_units + vgrid = 'layer_avg' + truncate = .false. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%P_iron_REMIN, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(autotroph_settings(n)%lname) // ' Aggregation' - sname = trim(autotroph_settings(n)%sname) // '_agg' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .not. lecovars_full_depth_tavg - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%auto_agg(n), marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + ! Autotroph 3D diags + if (.not.ind%lallocated()) then + allocate(ind%Qp(autotroph_cnt)) + allocate(ind%photoC(autotroph_cnt)) + allocate(ind%photoC_NO3(autotroph_cnt)) + allocate(ind%photoFe(autotroph_cnt)) + allocate(ind%photoNO3(autotroph_cnt)) + allocate(ind%photoNH4(autotroph_cnt)) + allocate(ind%DOP_uptake(autotroph_cnt)) + allocate(ind%PO4_uptake(autotroph_cnt)) + allocate(ind%auto_graze(autotroph_cnt)) + allocate(ind%auto_graze_poc(autotroph_cnt)) + allocate(ind%auto_graze_doc(autotroph_cnt)) + allocate(ind%auto_graze_zootot(autotroph_cnt)) + allocate(ind%auto_graze_zoo(autotroph_cnt, zooplankton_cnt)) + allocate(ind%auto_loss(autotroph_cnt)) + allocate(ind%auto_loss_poc(autotroph_cnt)) + allocate(ind%auto_loss_doc(autotroph_cnt)) + allocate(ind%auto_agg(autotroph_cnt)) + allocate(ind%bSi_form(autotroph_cnt)) + allocate(ind%CaCO3_form(autotroph_cnt)) + allocate(ind%Nfix(autotroph_cnt)) + end if + do n=1,autotroph_cnt + if (lvariable_PtoC) then + lname = trim(autotroph_settings(n)%lname) // ' P:C ratio' + sname = trim(autotroph_settings(n)%sname) // '_Qp' + units = '1' + vgrid = 'layer_avg' + truncate = .not. lecovars_full_depth_tavg + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%Qp(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + else + ind%Qp(n) = -1 + end if + + lname = trim(autotroph_settings(n)%lname) // ' C Fixation' + sname = 'photoC_' // trim(autotroph_settings(n)%sname) + units = unit_system%conc_tend_units + vgrid = 'layer_avg' + truncate = .not. lecovars_full_depth_tavg + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%photoC(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(autotroph_settings(n)%lname) // ' C Fixation from NO3' + sname = 'photoC_NO3_' // trim(autotroph_settings(n)%sname) + units = unit_system%conc_tend_units + vgrid = 'layer_avg' + truncate = .not. lecovars_full_depth_tavg + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%photoC_NO3(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(autotroph_settings(n)%lname) // ' Fe Uptake' + sname = 'photoFe_' // trim(autotroph_settings(n)%sname) + units = unit_system%conc_tend_units + vgrid = 'layer_avg' + truncate = .not. lecovars_full_depth_tavg + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%photoFe(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(autotroph_settings(n)%lname) // ' NO3 Uptake' + sname = 'photoNO3_' // trim(autotroph_settings(n)%sname) + units = unit_system%conc_tend_units + vgrid = 'layer_avg' + truncate = .not. lecovars_full_depth_tavg + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%photoNO3(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(autotroph_settings(n)%lname) // ' NH4 Uptake' + sname = 'photoNH4_' // trim(autotroph_settings(n)%sname) + units = unit_system%conc_tend_units + vgrid = 'layer_avg' + truncate = .not. lecovars_full_depth_tavg + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%photoNH4(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(autotroph_settings(n)%lname) // ' DOP Uptake' + sname = 'DOP_' // trim(autotroph_settings(n)%sname) // '_uptake' + units = unit_system%conc_tend_units + vgrid = 'layer_avg' + truncate = .not. lecovars_full_depth_tavg + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%DOP_uptake(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(autotroph_settings(n)%lname) // ' PO4 Uptake' + sname = 'PO4_' // trim(autotroph_settings(n)%sname) // '_uptake' + units = unit_system%conc_tend_units + vgrid = 'layer_avg' + truncate = .not. lecovars_full_depth_tavg + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%PO4_uptake(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(autotroph_settings(n)%lname) // ' Grazing' + sname = 'graze_' // trim(autotroph_settings(n)%sname) + units = unit_system%conc_tend_units + vgrid = 'layer_avg' + truncate = .not. lecovars_full_depth_tavg + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%auto_graze(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(autotroph_settings(n)%lname) // ' Grazing to POC' + sname = 'graze_' // trim(autotroph_settings(n)%sname) // '_poc' + units = unit_system%conc_tend_units + vgrid = 'layer_avg' + truncate = .not. lecovars_full_depth_tavg + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%auto_graze_poc(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(autotroph_settings(n)%lname) // ' Grazing to DOC' + sname = 'graze_' // trim(autotroph_settings(n)%sname) // '_doc' + units = unit_system%conc_tend_units + vgrid = 'layer_avg' + truncate = .not. lecovars_full_depth_tavg + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%auto_graze_doc(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - if (autotroph_settings(n)%silicifier) then - lname = trim(autotroph_settings(n)%lname) // ' Si Uptake' - sname = trim(autotroph_settings(n)%sname) // '_bSi_form' + lname = trim(autotroph_settings(n)%lname) // ' Grazing to ZOO TOT' + sname = 'graze_' // trim(autotroph_settings(n)%sname) // '_zootot' units = unit_system%conc_tend_units vgrid = 'layer_avg' truncate = .not. lecovars_full_depth_tavg - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%bSi_form(n), marbl_status_log) + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%auto_graze_zootot(n), marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - else - ind%bSi_form(n) = -1 - end if - if (autotroph_settings(n)%imp_calcifier .or. autotroph_settings(n)%exp_calcifier) then - lname = trim(autotroph_settings(n)%lname) // ' CaCO3 Formation' - sname = trim(autotroph_settings(n)%sname) // '_CaCO3_form' + do m=1, zooplankton_cnt + lname = trim(autotroph_settings(n)%lname) // ' Grazing to ' // trim(zooplankton_settings(m)%lname) + sname = 'graze_' // trim(autotroph_settings(n)%sname) // '_' // trim(zooplankton_settings(m)%sname) + units = unit_system%conc_tend_units + vgrid = 'layer_avg' + truncate = .not. lecovars_full_depth_tavg + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%auto_graze_zoo(n,m), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + end do + + lname = trim(autotroph_settings(n)%lname) // ' Loss' + sname = trim(autotroph_settings(n)%sname) // '_loss' units = unit_system%conc_tend_units vgrid = 'layer_avg' truncate = .not. lecovars_full_depth_tavg - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%CaCO3_form(n), marbl_status_log) + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%auto_loss(n), marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - else - ind%CaCO3_form(n) = -1 - end if - if (autotroph_settings(n)%Nfixer) then - lname = trim(autotroph_settings(n)%lname) // ' N Fixation' - sname = trim(autotroph_settings(n)%sname) // '_Nfix' + lname = trim(autotroph_settings(n)%lname) // ' Loss to POC' + sname = trim(autotroph_settings(n)%sname) // '_loss_poc' units = unit_system%conc_tend_units vgrid = 'layer_avg' truncate = .not. lecovars_full_depth_tavg - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%Nfix(n), marbl_status_log) + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%auto_loss_poc(n), marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - else - ind%Nfix(n) = -1 - end if - end do ! end do-loop for autotroph_cnt + lname = trim(autotroph_settings(n)%lname) // ' Loss to DOC' + sname = trim(autotroph_settings(n)%sname) // '_loss_doc' + units = unit_system%conc_tend_units + vgrid = 'layer_avg' + truncate = .not. lecovars_full_depth_tavg + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%auto_loss_doc(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'Total Si Uptake' - sname = 'bSi_form' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .not. lecovars_full_depth_tavg - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%tot_bSi_form, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = trim(autotroph_settings(n)%lname) // ' Aggregation' + sname = trim(autotroph_settings(n)%sname) // '_agg' + units = unit_system%conc_tend_units + vgrid = 'layer_avg' + truncate = .not. lecovars_full_depth_tavg + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%auto_agg(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = 'Total CaCO3 Formation' - sname = 'CaCO3_form' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .not. lecovars_full_depth_tavg - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%tot_CaCO3_form, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + if (autotroph_settings(n)%silicifier) then + lname = trim(autotroph_settings(n)%lname) // ' Si Uptake' + sname = trim(autotroph_settings(n)%sname) // '_bSi_form' + units = unit_system%conc_tend_units + vgrid = 'layer_avg' + truncate = .not. lecovars_full_depth_tavg + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%bSi_form(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + else + ind%bSi_form(n) = -1 + end if - lname = 'Total N Fixation' - sname = 'Nfix' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .not. lecovars_full_depth_tavg - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%tot_Nfix, marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + if (autotroph_settings(n)%imp_calcifier .or. autotroph_settings(n)%exp_calcifier) then + lname = trim(autotroph_settings(n)%lname) // ' CaCO3 Formation' + sname = trim(autotroph_settings(n)%sname) // '_CaCO3_form' + units = unit_system%conc_tend_units + vgrid = 'layer_avg' + truncate = .not. lecovars_full_depth_tavg + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%CaCO3_form(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + else + ind%CaCO3_form(n) = -1 + end if - ! Zooplankton 3D diags - if (.not.ind%lconstructed()) then - allocate(ind%zoo_loss(zooplankton_cnt)) - allocate(ind%zoo_loss_basal(zooplankton_cnt)) - allocate(ind%zoo_loss_poc(zooplankton_cnt)) - allocate(ind%zoo_loss_doc(zooplankton_cnt)) - allocate(ind%zoo_graze(zooplankton_cnt)) - allocate(ind%zoo_graze_poc(zooplankton_cnt)) - allocate(ind%zoo_graze_doc(zooplankton_cnt)) - allocate(ind%zoo_graze_zootot(zooplankton_cnt)) - allocate(ind%zoo_graze_zoo(zooplankton_cnt, zooplankton_cnt)) - allocate(ind%x_graze_zoo(zooplankton_cnt)) - end if - do n = 1,zooplankton_cnt - lname = trim(zooplankton_settings(n)%lname) // ' Loss' - sname = trim(zooplankton_settings(n)%sname) // '_loss' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .not. lecovars_full_depth_tavg - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%zoo_loss(n), marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + if (autotroph_settings(n)%Nfixer) then + lname = trim(autotroph_settings(n)%lname) // ' N Fixation' + sname = trim(autotroph_settings(n)%sname) // '_Nfix' + units = unit_system%conc_tend_units + vgrid = 'layer_avg' + truncate = .not. lecovars_full_depth_tavg + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%Nfix(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + else + ind%Nfix(n) = -1 + end if - lname = trim(zooplankton_settings(n)%lname) // ' Basal Respiration' - sname = trim(zooplankton_settings(n)%sname) // '_loss_basal' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .true. - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%zoo_loss_basal(n), marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + end do ! end do-loop for autotroph_cnt - lname = trim(zooplankton_settings(n)%lname) // ' Loss to POC' - sname = trim(zooplankton_settings(n)%sname) // '_loss_poc' + lname = 'Total Si Uptake' + sname = 'bSi_form' units = unit_system%conc_tend_units vgrid = 'layer_avg' truncate = .not. lecovars_full_depth_tavg - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%zoo_loss_poc(n), marbl_status_log) + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%tot_bSi_form, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(zooplankton_settings(n)%lname) // ' Loss to DOC' - sname = trim(zooplankton_settings(n)%sname) // '_loss_doc' + lname = 'Total CaCO3 Formation' + sname = 'CaCO3_form' units = unit_system%conc_tend_units vgrid = 'layer_avg' truncate = .not. lecovars_full_depth_tavg - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%zoo_loss_doc(n), marbl_status_log) + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%tot_CaCO3_form, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(zooplankton_settings(n)%lname) // ' grazing loss' - sname = 'graze_' // trim(zooplankton_settings(n)%sname) + lname = 'Total N Fixation' + sname = 'Nfix' units = unit_system%conc_tend_units vgrid = 'layer_avg' truncate = .not. lecovars_full_depth_tavg - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%zoo_graze(n), marbl_status_log) + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%tot_Nfix, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) return end if - lname = trim(zooplankton_settings(n)%lname) // ' grazing loss to POC' - sname = 'graze_' // trim(zooplankton_settings(n)%sname) // '_poc' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .not. lecovars_full_depth_tavg - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%zoo_graze_poc(n), marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return + ! Zooplankton 3D diags + if (.not.ind%lallocated()) then + allocate(ind%zoo_loss(zooplankton_cnt)) + allocate(ind%zoo_loss_basal(zooplankton_cnt)) + allocate(ind%zoo_loss_poc(zooplankton_cnt)) + allocate(ind%zoo_loss_doc(zooplankton_cnt)) + allocate(ind%zoo_graze(zooplankton_cnt)) + allocate(ind%zoo_graze_poc(zooplankton_cnt)) + allocate(ind%zoo_graze_doc(zooplankton_cnt)) + allocate(ind%zoo_graze_zootot(zooplankton_cnt)) + allocate(ind%zoo_graze_zoo(zooplankton_cnt, zooplankton_cnt)) + allocate(ind%x_graze_zoo(zooplankton_cnt)) end if + do n = 1,zooplankton_cnt + lname = trim(zooplankton_settings(n)%lname) // ' Loss' + sname = trim(zooplankton_settings(n)%sname) // '_loss' + units = unit_system%conc_tend_units + vgrid = 'layer_avg' + truncate = .not. lecovars_full_depth_tavg + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%zoo_loss(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = trim(zooplankton_settings(n)%lname) // ' grazing loss to DOC' - sname = 'graze_' // trim(zooplankton_settings(n)%sname) // '_doc' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .not. lecovars_full_depth_tavg - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%zoo_graze_doc(n), marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = trim(zooplankton_settings(n)%lname) // ' Basal Respiration' + sname = trim(zooplankton_settings(n)%sname) // '_loss_basal' + units = unit_system%conc_tend_units + vgrid = 'layer_avg' + truncate = .true. + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%zoo_loss_basal(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - lname = trim(zooplankton_settings(n)%lname) // ' grazing loss to ZOO TOT' - sname = 'graze_' // trim(zooplankton_settings(n)%sname) // '_zootot' - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .not. lecovars_full_depth_tavg - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%zoo_graze_zootot(n), marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + lname = trim(zooplankton_settings(n)%lname) // ' Loss to POC' + sname = trim(zooplankton_settings(n)%sname) // '_loss_poc' + units = unit_system%conc_tend_units + vgrid = 'layer_avg' + truncate = .not. lecovars_full_depth_tavg + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%zoo_loss_poc(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(zooplankton_settings(n)%lname) // ' Loss to DOC' + sname = trim(zooplankton_settings(n)%sname) // '_loss_doc' + units = unit_system%conc_tend_units + vgrid = 'layer_avg' + truncate = .not. lecovars_full_depth_tavg + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%zoo_loss_doc(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(zooplankton_settings(n)%lname) // ' grazing loss' + sname = 'graze_' // trim(zooplankton_settings(n)%sname) + units = unit_system%conc_tend_units + vgrid = 'layer_avg' + truncate = .not. lecovars_full_depth_tavg + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%zoo_graze(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(zooplankton_settings(n)%lname) // ' grazing loss to POC' + sname = 'graze_' // trim(zooplankton_settings(n)%sname) // '_poc' + units = unit_system%conc_tend_units + vgrid = 'layer_avg' + truncate = .not. lecovars_full_depth_tavg + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%zoo_graze_poc(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(zooplankton_settings(n)%lname) // ' grazing loss to DOC' + sname = 'graze_' // trim(zooplankton_settings(n)%sname) // '_doc' + units = unit_system%conc_tend_units + vgrid = 'layer_avg' + truncate = .not. lecovars_full_depth_tavg + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%zoo_graze_doc(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + lname = trim(zooplankton_settings(n)%lname) // ' grazing loss to ZOO TOT' + sname = 'graze_' // trim(zooplankton_settings(n)%sname) // '_zootot' + units = unit_system%conc_tend_units + vgrid = 'layer_avg' + truncate = .not. lecovars_full_depth_tavg + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%zoo_graze_zootot(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + + do m=1, zooplankton_cnt + lname = trim(zooplankton_settings(n)%lname) // ' grazing loss to ' // trim(zooplankton_settings(m)%lname) + sname = 'graze_' // trim(zooplankton_settings(n)%sname) // '_' // trim(zooplankton_settings(m)%sname) + units = unit_system%conc_tend_units + vgrid = 'layer_avg' + truncate = .not. lecovars_full_depth_tavg + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%zoo_graze_zoo(n,m), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if + end do + + lname = trim(zooplankton_settings(n)%lname) // ' grazing gain' + sname = 'x_graze_' // trim(zooplankton_settings(n)%sname) + units = unit_system%conc_tend_units + vgrid = 'layer_avg' + truncate = .not. lecovars_full_depth_tavg + call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & + ind%x_graze_zoo(n), marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) + return + end if - do m=1, zooplankton_cnt - lname = trim(zooplankton_settings(n)%lname) // ' grazing loss to ' // trim(zooplankton_settings(m)%lname) - sname = 'graze_' // trim(zooplankton_settings(n)%sname) // '_' // trim(zooplankton_settings(m)%sname) - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .not. lecovars_full_depth_tavg - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%zoo_graze_zoo(n,m), marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if end do + end if - lname = trim(zooplankton_settings(n)%lname) // ' grazing gain' - sname = 'x_graze_' // trim(zooplankton_settings(n)%sname) - units = unit_system%conc_tend_units - vgrid = 'layer_avg' - truncate = .not. lecovars_full_depth_tavg - call diags%add_diagnostic(lname, sname, units, vgrid, truncate, & - ind%x_graze_zoo(n), marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_logging_add_diagnostics_error(marbl_status_log, sname, subname) - return - end if + !----------------------------------------------------------------- + ! Abiotic DIC diagnostics + !----------------------------------------------------------------- - end do + call marbl_abio_dic_diagnostics_init(unit_system, marbl_interior_tendency_diags, marbl_surface_flux_diags, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_status_log%log_error_trace("marbl_abio_dic_diagnostics_init()", subname) + return + end if !----------------------------------------------------------------- ! CISO diagnostics @@ -3045,7 +3068,7 @@ subroutine marbl_diagnostics_init( & ! FIXME #60: this approach is not thread-safe ! i.e. if this is called from 2 threads simulatneously, a race condition ! on the allocation status check and allocation is introduced - if (.not.ind%lconstructed()) then + if (.not. ind%lallocated()) then allocate(ind%restore_tend(marbl_tracer_indices%total_cnt)) end if @@ -3152,13 +3175,6 @@ subroutine marbl_diagnostics_interior_tendency_compute( & !----------------------------------------------------------------- - call marbl_interior_tendency_diags%set_to_zero(marbl_status_log) - if (marbl_status_log%labort_marbl) then - call marbl_status_log%log_error_trace(& - 'marbl_interior_tendency_diags%set_to_zero', subname) - return - end if - associate( & kmt => domain%kmt, & diags => marbl_interior_tendency_diags%diags, & @@ -3271,12 +3287,10 @@ subroutine marbl_diagnostics_surface_flux_compute( & surface_flux_diags) ! !DESCRIPTION: - ! Compute surface fluxes for ecosys tracer module. + ! Compute surface flux diagnostics for base biotic tracer module. - use marbl_interface_private_types , only : marbl_surface_flux_forcing_indexing_type - use marbl_interface_private_types , only : marbl_surface_flux_saved_state_indexing_type - use marbl_settings_mod , only : lflux_gas_o2 - use marbl_settings_mod , only : lflux_gas_co2 + use marbl_interface_private_types, only : marbl_surface_flux_forcing_indexing_type + use marbl_interface_private_types, only : marbl_surface_flux_saved_state_indexing_type type(marbl_surface_flux_forcing_indexing_type), intent(in) :: surface_flux_forcing_ind type(marbl_forcing_fields_type) , intent(in) :: surface_flux_forcings(:) @@ -3293,78 +3307,62 @@ subroutine marbl_diagnostics_surface_flux_compute( & diags => surface_flux_diags%diags(:), & xco2 => surface_flux_forcings(surface_flux_forcing_ind%xco2_id)%field_0d, & xco2_alt_co2 => surface_flux_forcings(surface_flux_forcing_ind%xco2_alt_co2_id)%field_0d, & - ap_used => surface_flux_forcings(surface_flux_forcing_ind%atm_pressure_id)%field_0d, & - ifrac => surface_flux_forcings(surface_flux_forcing_ind%ifrac_id)%field_0d, & dust_flux_in => surface_flux_forcings(surface_flux_forcing_ind%dust_flux_id)%field_0d, & iron_flux_in => surface_flux_forcings(surface_flux_forcing_ind%iron_flux_id)%field_0d, & nox_flux => surface_flux_forcings(surface_flux_forcing_ind%nox_flux_id)%field_0d, & nhy_flux => surface_flux_forcings(surface_flux_forcing_ind%nhy_flux_id)%field_0d, & - piston_velocity => surface_flux_internal%piston_velocity, & - flux_co2 => surface_flux_internal%flux_co2, & - flux_alt_co2 => surface_flux_internal%flux_alt_co2, & - co2star => surface_flux_internal%co2star, & - dco2star => surface_flux_internal%dco2star, & - pco2surf => surface_flux_internal%pco2surf, & - dpco2 => surface_flux_internal%dpco2, & - co2star_alt => surface_flux_internal%co2star_alt, & - dco2star_alt => surface_flux_internal%dco2star_alt, & - pco2surf_alt => surface_flux_internal%pco2surf_alt, & - dpco2_alt => surface_flux_internal%dpco2_alt, & - pv_co2 => surface_flux_internal%pv_co2, & - pv_o2 => surface_flux_internal%pv_o2, & - schmidt_co2 => surface_flux_internal%schmidt_co2, & - schmidt_o2 => surface_flux_internal%schmidt_o2, & - o2sat => surface_flux_internal%o2sat, & - nhx_surface_emis => surface_flux_internal%nhx_surface_emis, & - - - ph_prev => saved_state%state(saved_state_ind%ph_surf)%field_2d, & - ph_prev_alt_co2 => saved_state%state(saved_state_ind%ph_alt_co2_surf)%field_2d, & - - po4_ind => marbl_tracer_indices%po4_ind, & - no3_ind => marbl_tracer_indices%no3_ind, & - sio3_ind => marbl_tracer_indices%sio3_ind, & - nh4_ind => marbl_tracer_indices%nh4_ind, & - fe_ind => marbl_tracer_indices%fe_ind, & - o2_ind => marbl_tracer_indices%o2_ind, & - dic_ind => marbl_tracer_indices%dic_ind, & - dic_alt_co2_ind => marbl_tracer_indices%dic_alt_co2_ind, & - alk_ind => marbl_tracer_indices%alk_ind, & - doc_ind => marbl_tracer_indices%doc_ind, & - don_ind => marbl_tracer_indices%don_ind, & - dop_ind => marbl_tracer_indices%dop_ind, & - dopr_ind => marbl_tracer_indices%dopr_ind, & - donr_ind => marbl_tracer_indices%donr_ind, & - docr_ind => marbl_tracer_indices%docr_ind & + flux_co2 => surface_flux_internal%flux_co2, & + flux_alt_co2 => surface_flux_internal%flux_alt_co2, & + co2star => surface_flux_internal%co2star, & + dco2star => surface_flux_internal%dco2star, & + pco2surf => surface_flux_internal%pco2surf, & + dpco2 => surface_flux_internal%dpco2, & + co2star_alt => surface_flux_internal%co2star_alt, & + dco2star_alt => surface_flux_internal%dco2star_alt, & + pco2surf_alt => surface_flux_internal%pco2surf_alt, & + dpco2_alt => surface_flux_internal%dpco2_alt, & + pv_o2 => surface_flux_internal%pv_o2, & + schmidt_o2 => surface_flux_internal%schmidt_o2, & + o2sat => surface_flux_internal%o2sat, & + nhx_surface_emis => surface_flux_internal%nhx_surface_emis, & + + + ph_prev => saved_state%state(saved_state_ind%base_bio_ph_surf)%field_2d, & + ph_prev_alt_co2 => saved_state%state(saved_state_ind%base_bio_ph_alt_co2_surf)%field_2d, & + + po4_ind => marbl_tracer_indices%po4_ind, & + no3_ind => marbl_tracer_indices%no3_ind, & + sio3_ind => marbl_tracer_indices%sio3_ind, & + nh4_ind => marbl_tracer_indices%nh4_ind, & + fe_ind => marbl_tracer_indices%fe_ind, & + o2_ind => marbl_tracer_indices%o2_ind, & + dic_ind => marbl_tracer_indices%dic_ind, & + dic_alt_co2_ind => marbl_tracer_indices%dic_alt_co2_ind, & + alk_ind => marbl_tracer_indices%alk_ind, & + doc_ind => marbl_tracer_indices%doc_ind, & + don_ind => marbl_tracer_indices%don_ind, & + dop_ind => marbl_tracer_indices%dop_ind, & + dopr_ind => marbl_tracer_indices%dopr_ind, & + donr_ind => marbl_tracer_indices%donr_ind, & + docr_ind => marbl_tracer_indices%docr_ind & ) !----------------------------------------------------------------------- ! calculate gas flux quantities if necessary !----------------------------------------------------------------------- - if (lflux_gas_o2 .or. lflux_gas_co2) then - - diags(ind_diag%ECOSYS_IFRAC)%field_2d(:) = ifrac(:) - diags(ind_diag%ECOSYS_XKW)%field_2d(:) = piston_velocity(:) - diags(ind_diag%ECOSYS_ATM_PRESS)%field_2d(:) = ap_used(:) - - endif ! lflux_gas_o2 .or. lflux_gas_co2 - if (lflux_gas_o2) then - diags(ind_diag%PV_O2)%field_2d(:) = pv_o2(:) diags(ind_diag%SCHMIDT_O2)%field_2d(:) = schmidt_o2(:) diags(ind_diag%O2SAT)%field_2d(:) = o2sat(:) - - endif ! lflux_gas_o2 + endif !----------------------------------------------------------------------- ! compute CO2 flux, computing disequilibrium one row at a time !----------------------------------------------------------------------- if (lflux_gas_co2) then - diags(ind_diag%CO2STAR)%field_2d(:) = co2star(:) diags(ind_diag%DCO2STAR)%field_2d(:) = dco2star(:) diags(ind_diag%pCO2SURF)%field_2d(:) = pco2surf(:) @@ -3375,17 +3373,14 @@ subroutine marbl_diagnostics_surface_flux_compute( & diags(ind_diag%pCO2SURF_ALT_CO2)%field_2d(:) = pco2surf_alt(:) diags(ind_diag%DpCO2_ALT_CO2)%field_2d(:) = dpco2_alt(:) - diags(ind_diag%PV_CO2)%field_2d(:) = pv_co2(:) - diags(ind_diag%SCHMIDT_CO2)%field_2d(:) = schmidt_co2(:) - diags(ind_diag%DIC_GAS_FLUX)%field_2d(:) = flux_co2(:) + diags(ind_diag%FG_CO2)%field_2d(:) = flux_co2(:) diags(ind_diag%PH)%field_2d(:) = ph_prev(:) diags(ind_diag%ATM_CO2)%field_2d(:) = xco2(:) - diags(ind_diag%DIC_GAS_FLUX_ALT_CO2)%field_2d(:) = flux_alt_co2(:) + diags(ind_diag%FG_CO2_ALT_CO2)%field_2d(:) = flux_alt_co2(:) diags(ind_diag%PH_ALT_CO2)%field_2d(:) = ph_prev_alt_co2(:) diags(ind_diag%ATM_ALT_CO2)%field_2d(:) = xco2_alt_co2(:) - - endif ! lflux_gas_co2 + endif !----------------------------------------------------------------------- ! calculate nox and nhy fluxes and nhx emissions @@ -3411,6 +3406,61 @@ end subroutine marbl_diagnostics_surface_flux_compute !*********************************************************************** + subroutine marbl_diagnostics_surface_flux_share( & + surface_flux_forcing_ind, & + surface_flux_forcings, & + surface_flux_internal, & + surface_flux_diags) + + ! !DESCRIPTION: + ! Compute surface flux diagnostics that are shared by + ! abiotic and base biotic tracer modules. + + use marbl_interface_private_types, only : marbl_surface_flux_forcing_indexing_type + use marbl_interface_private_types, only : marbl_surface_flux_saved_state_indexing_type + + type(marbl_surface_flux_forcing_indexing_type), intent(in) :: surface_flux_forcing_ind + type(marbl_forcing_fields_type) , intent(in) :: surface_flux_forcings(:) + type(marbl_surface_flux_internal_type) , intent(in) :: surface_flux_internal + type(marbl_diagnostics_type) , intent(inout) :: surface_flux_diags + + associate( & + ind_diag => marbl_surface_flux_diag_ind, & + diags => surface_flux_diags%diags(:), & + ap_used => surface_flux_forcings(surface_flux_forcing_ind%atm_pressure_id)%field_0d, & + ifrac => surface_flux_forcings(surface_flux_forcing_ind%ifrac_id)%field_0d, & + piston_velocity => surface_flux_internal%piston_velocity, & + pv_co2 => surface_flux_internal%pv_co2, & + schmidt_co2 => surface_flux_internal%schmidt_co2 & + ) + + !----------------------------------------------------------------------- + ! calculate gas flux quantities if necessary + !----------------------------------------------------------------------- + + if (lflux_gas_o2 .or. lflux_gas_co2) then + + diags(ind_diag%ECOSYS_IFRAC)%field_2d(:) = ifrac(:) + diags(ind_diag%ECOSYS_XKW)%field_2d(:) = piston_velocity(:) + diags(ind_diag%ECOSYS_ATM_PRESS)%field_2d(:) = ap_used(:) + + endif + + !----------------------------------------------------------------------- + ! compute CO2 flux, computing disequilibrium one row at a time + !----------------------------------------------------------------------- + + if (lflux_gas_co2) then + diags(ind_diag%PV_CO2)%field_2d(:) = pv_co2(:) + diags(ind_diag%SCHMIDT_CO2)%field_2d(:) = schmidt_co2(:) + endif + + end associate + + end subroutine marbl_diagnostics_surface_flux_share + + !*********************************************************************** + subroutine store_diagnostics_carbonate(marbl_domain, carbonate, & marbl_interior_diags, marbl_status_log) diff --git a/src/marbl_init_mod.F90 b/src/marbl_init_mod.F90 index d1ac9351..35731fed 100644 --- a/src/marbl_init_mod.F90 +++ b/src/marbl_init_mod.F90 @@ -7,12 +7,11 @@ module marbl_init_mod use marbl_interface_public_types, only : marbl_tracer_metadata_type use marbl_interface_public_types, only : marbl_forcing_fields_type - use marbl_interface_private_types, only : marbl_tracer_index_type - use marbl_logging, only : marbl_log_type - use marbl_settings_mod, only : autotroph_cnt - use marbl_settings_mod, only : zooplankton_cnt + use marbl_settings_mod, only : base_bio_on + use marbl_settings_mod, only : abio_dic_on + use marbl_settings_mod, only : ciso_on use marbl_settings_mod, only : unit_system_type implicit none @@ -57,10 +56,13 @@ end subroutine marbl_init_log_and_timers subroutine marbl_init_parameters_pre_tracers(marbl_settings, unit_system, marbl_status_log) use marbl_settings_mod, only : marbl_settings_type + use marbl_settings_mod, only : marbl_settings_set_defaults_tracer_modules + use marbl_settings_mod, only : marbl_settings_define_tracer_modules use marbl_settings_mod, only : marbl_settings_set_defaults_general_parms use marbl_settings_mod, only : marbl_settings_define_general_parms use marbl_settings_mod, only : marbl_settings_set_defaults_PFT_counts use marbl_settings_mod, only : marbl_settings_define_PFT_counts + use marbl_settings_mod, only : marbl_settings_allocate_PFT_types use marbl_settings_mod, only : marbl_settings_set_defaults_PFT_derived_types use marbl_settings_mod, only : marbl_settings_define_PFT_derived_types @@ -71,6 +73,22 @@ subroutine marbl_init_parameters_pre_tracers(marbl_settings, unit_system, marbl_ ! local variables character(len=*), parameter :: subname = 'marbl_init_mod:marbl_init_parameters_pre_tracers' + !--------------------------------------------------------------------------- + ! set default values for logicals controlling active tracer modules + !--------------------------------------------------------------------------- + + call marbl_settings_set_defaults_tracer_modules() + + !--------------------------------------------------------------------------- + ! Add tracer module settings to list of allowable put / get vars + !--------------------------------------------------------------------------- + + call marbl_settings_define_tracer_modules(marbl_settings, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_status_log%log_error_trace("marbl_settings_define_tracer_modules()", subname) + return + end if + !--------------------------------------------------------------------------- ! set default values for basic settings !--------------------------------------------------------------------------- @@ -103,6 +121,12 @@ subroutine marbl_init_parameters_pre_tracers(marbl_settings, unit_system, marbl_ return end if + call marbl_settings_allocate_PFT_types(marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_status_log%log_error_trace("marbl_settings_allocate_PFT_types()", subname) + return + end if + !--------------------------------------------------------------------------- ! Add components of PFT derived types to list of allowable put / get vars !--------------------------------------------------------------------------- @@ -137,12 +161,14 @@ subroutine marbl_init_tracers(num_levels, & tracer_metadata, & marbl_status_log) - use marbl_settings_mod, only : ciso_on use marbl_settings_mod, only : lvariable_PtoC use marbl_settings_mod, only : autotroph_settings use marbl_settings_mod, only : zooplankton_settings use marbl_settings_mod, only : tracer_restore_vars - use marbl_ciso_init_mod, only : marbl_ciso_init_tracer_metadata + + use marbl_interface_private_types, only : marbl_tracer_index_type + + use marbl_init_tracer_metadata_mod, only : marbl_init_tracer_metadata integer(int_kind), intent(in) :: num_levels integer(int_kind), intent(in) :: num_elements_surface_flux @@ -163,8 +189,8 @@ subroutine marbl_init_tracers(num_levels, & ! Construct tracer indices allocate(tracer_indices) - call tracer_indices%construct(ciso_on, lvariable_PtoC, autotroph_settings, zooplankton_settings, & - marbl_status_log) + call tracer_indices%construct(base_bio_on, abio_dic_on, ciso_on, lvariable_PtoC, & + autotroph_settings, zooplankton_settings, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_status_log%log_error_trace("tracer_indices%construct", subname) return @@ -182,7 +208,6 @@ subroutine marbl_init_tracers(num_levels, & ! Set up tracer metadata call marbl_init_tracer_metadata(unit_system, tracer_indices, tracer_metadata) - call marbl_ciso_init_tracer_metadata(unit_system, tracer_indices, tracer_metadata) ! Log what tracers are being used call marbl_status_log%log_header('MARBL Tracer indices', subname) @@ -192,11 +217,18 @@ subroutine marbl_init_tracers(num_levels, & end do 100 format(A, ' tracer module contains ', I0, ' tracers; indices are ', I0, ' to ', I0) - if (tracer_indices%ecosys_base%cnt.gt.0) then - write(log_message, 100) 'ecosys_base', & - tracer_indices%ecosys_base%cnt, & - tracer_indices%ecosys_base%ind_beg, & - tracer_indices%ecosys_base%ind_end + if (tracer_indices%base_bio%cnt.gt.0) then + write(log_message, 100) 'base biotic tracers', & + tracer_indices%base_bio%cnt, & + tracer_indices%base_bio%ind_beg, & + tracer_indices%base_bio%ind_end + call marbl_status_log%log_noerror(log_message, subname) + end if + if (tracer_indices%abio_dic%cnt.gt.0) then + write(log_message, 100) 'abio', & + tracer_indices%abio_dic%cnt, & + tracer_indices%abio_dic%ind_beg, & + tracer_indices%abio_dic%ind_end call marbl_status_log%log_noerror(log_message, subname) end if if (tracer_indices%ciso%cnt.gt.0) then @@ -211,80 +243,6 @@ end subroutine marbl_init_tracers !*********************************************************************** - subroutine marbl_init_tracer_metadata(unit_system, marbl_tracer_indices, marbl_tracer_metadata) - - ! Set tracer and forcing metadata - - use marbl_settings_mod, only : lecovars_full_depth_tavg - - type(unit_system_type), intent(in) :: unit_system - type(marbl_tracer_index_type), intent(in) :: marbl_tracer_indices - type (marbl_tracer_metadata_type), intent(out) :: marbl_tracer_metadata(:) ! descriptors for each tracer - - !----------------------------------------------------------------------- - ! local variables - !----------------------------------------------------------------------- - - integer (int_kind) :: n ! index for looping over tracers - integer (int_kind) :: zoo_ind ! zooplankton functional group index - integer (int_kind) :: auto_ind ! autotroph functional group index - - !----------------------------------------------------------------------- - ! initialize tracer metatdata - !----------------------------------------------------------------------- - - marbl_tracer_metadata(:)%lfull_depth_tavg = .true. - marbl_tracer_metadata(:)%tracer_module_name = 'ecosys' - - call marbl_init_non_autotroph_tracers_metadata(marbl_tracer_metadata, & - marbl_tracer_indices, unit_system) - - call marbl_init_zooplankton_tracer_metadata(marbl_tracer_metadata, & - marbl_tracer_indices, unit_system) - - call marbl_init_autotroph_tracer_metadata(marbl_tracer_metadata, & - marbl_tracer_indices, unit_system) - - !----------------------------------------------------------------------- - ! set lfull_depth_tavg flag for short-lived ecosystem tracers - !----------------------------------------------------------------------- - - ! Should be done in marbl_diagnostics, and without the _tavg name - do zoo_ind = 1, zooplankton_cnt - n = marbl_tracer_indices%zoo_inds(zoo_ind)%C_ind - marbl_tracer_metadata(n)%lfull_depth_tavg = lecovars_full_depth_tavg - end do - - do auto_ind = 1, autotroph_cnt - n = marbl_tracer_indices%auto_inds(auto_ind)%Chl_ind - marbl_tracer_metadata(n)%lfull_depth_tavg = lecovars_full_depth_tavg - - n = marbl_tracer_indices%auto_inds(auto_ind)%C_ind - marbl_tracer_metadata(n)%lfull_depth_tavg = lecovars_full_depth_tavg - - n = marbl_tracer_indices%auto_inds(auto_ind)%P_ind - if (n > 0) then - marbl_tracer_metadata(n)%lfull_depth_tavg = lecovars_full_depth_tavg - endif - - n = marbl_tracer_indices%auto_inds(auto_ind)%Fe_ind - marbl_tracer_metadata(n)%lfull_depth_tavg = lecovars_full_depth_tavg - - n = marbl_tracer_indices%auto_inds(auto_ind)%Si_ind - if (n > 0) then - marbl_tracer_metadata(n)%lfull_depth_tavg = lecovars_full_depth_tavg - endif - - n = marbl_tracer_indices%auto_inds(auto_ind)%CaCO3_ind - if (n > 0) then - marbl_tracer_metadata(n)%lfull_depth_tavg = lecovars_full_depth_tavg - endif - end do - - end subroutine marbl_init_tracer_metadata - - !*********************************************************************** - subroutine marbl_init_parameters_post_tracers(marbl_settings, marbl_status_log) use marbl_settings_mod, only : marbl_settings_type @@ -365,7 +323,6 @@ subroutine marbl_init_forcing_fields(domain, & use marbl_interface_public_types, only : marbl_domain_type use marbl_interface_private_types, only : marbl_surface_flux_forcing_indexing_type use marbl_interface_private_types, only : marbl_interior_tendency_forcing_indexing_type - use marbl_settings_mod, only : ciso_on use marbl_settings_mod, only : lflux_gas_o2 use marbl_settings_mod, only : lflux_gas_co2 use marbl_settings_mod, only : ladjust_bury_coeff @@ -394,12 +351,15 @@ subroutine marbl_init_forcing_fields(domain, & ) ! Construct indices for surface and interior forcing - call surface_flux_forcing_ind%construct(ciso_on, & + call surface_flux_forcing_ind%construct(base_bio_on, & + abio_dic_on, & + ciso_on, & lflux_gas_o2, & lflux_gas_co2, & ladjust_bury_coeff, & num_surface_flux_forcing_fields) - call interior_tendency_forcing_ind%construct(tracer_metadata%short_name, & + call interior_tendency_forcing_ind%construct(base_bio_on, & + tracer_metadata%short_name, & tracer_restore_vars, & domain%num_PAR_subcols, & num_interior_tendency_forcing_fields, & @@ -411,20 +371,20 @@ subroutine marbl_init_forcing_fields(domain, & ! Initialize surface forcing fields allocate(surface_flux_forcings(num_surface_flux_forcing_fields)) - call marbl_init_surface_flux_forcing_fields( & + call init_surface_flux_forcing_fields( & num_elements = num_elements_surface_flux, & surface_flux_forcing_indices = surface_flux_forcing_ind, & unit_system = unit_system, & surface_flux_forcings = surface_flux_forcings, & marbl_status_log = marbl_status_log) if (marbl_status_log%labort_marbl) then - call marbl_status_log%log_error_trace("marbl_init_surface_flux_forcing_fields()", subname) + call marbl_status_log%log_error_trace("init_surface_flux_forcing_fields()", subname) return end if ! Initialize interior forcing fields allocate(interior_tendency_forcings(num_interior_tendency_forcing_fields)) - call marbl_init_interior_tendency_forcing_fields( & + call init_interior_tendency_forcing_fields( & num_elements = domain%num_elements_interior_tendency, & interior_tendency_forcing_indices = interior_tendency_forcing_ind, & tracer_metadata = tracer_metadata, & @@ -434,7 +394,7 @@ subroutine marbl_init_forcing_fields(domain, & interior_tendency_forcings = interior_tendency_forcings, & marbl_status_log = marbl_status_log) if (marbl_status_log%labort_marbl) then - call marbl_status_log%log_error_trace("marbl_init_interior_tendency_forcing_fields()", subname) + call marbl_status_log%log_error_trace("init_interior_tendency_forcing_fields()", subname) return end if @@ -462,198 +422,8 @@ end subroutine marbl_init_forcing_fields !*********************************************************************** - subroutine marbl_init_non_autotroph_tracer_metadata(short_name, long_name, unit_system, & - marbl_tracer_metadata) - - !----------------------------------------------------------------------- - ! initialize non-autotroph tracer_d values and accumulate - ! non_living_biomass_ecosys_tracer_cnt - !----------------------------------------------------------------------- - - character(len=*), intent(in) :: short_name - character(len=*), intent(in) :: long_name - type(unit_system_type), intent(in) :: unit_system - type(marbl_tracer_metadata_type), intent(inout) :: marbl_tracer_metadata - - marbl_tracer_metadata%short_name = short_name - marbl_tracer_metadata%long_name = long_name - if ((trim(short_name) == "ALK") .or. & - (trim(short_name) == "ALK_ALT_CO2")) then - marbl_tracer_metadata%units = unit_system%alk_conc_units - marbl_tracer_metadata%tend_units = unit_system%alk_conc_tend_units - marbl_tracer_metadata%flux_units = unit_system%alk_conc_flux_units - else - marbl_tracer_metadata%units = unit_system%conc_units - marbl_tracer_metadata%tend_units = unit_system%conc_tend_units - marbl_tracer_metadata%flux_units = unit_system%conc_flux_units - endif - - end subroutine marbl_init_non_autotroph_tracer_metadata - - !*********************************************************************** - - subroutine marbl_init_non_autotroph_tracers_metadata(marbl_tracer_metadata, & - marbl_tracer_indices, unit_system) - - !----------------------------------------------------------------------- - ! initialize non-autotroph tracer_d values and accumulate - ! non_living_biomass_ecosys_tracer_cnt - !----------------------------------------------------------------------- - - type(marbl_tracer_metadata_type) , intent(inout) :: marbl_tracer_metadata(:) ! descriptors for each tracer - type(marbl_tracer_index_type) , intent(in) :: marbl_tracer_indices - type(unit_system_type) , intent(in) :: unit_system - - call marbl_init_non_autotroph_tracer_metadata('PO4', 'Dissolved Inorganic Phosphate', & - unit_system, marbl_tracer_metadata(marbl_tracer_indices%po4_ind)) - call marbl_init_non_autotroph_tracer_metadata('NO3', 'Dissolved Inorganic Nitrate', & - unit_system, marbl_tracer_metadata(marbl_tracer_indices%no3_ind)) - call marbl_init_non_autotroph_tracer_metadata('SiO3', 'Dissolved Inorganic Silicate', & - unit_system, marbl_tracer_metadata(marbl_tracer_indices%sio3_ind)) - call marbl_init_non_autotroph_tracer_metadata('NH4', 'Dissolved Ammonia', & - unit_system, marbl_tracer_metadata(marbl_tracer_indices%nh4_ind)) - call marbl_init_non_autotroph_tracer_metadata('Fe', 'Dissolved Inorganic Iron', & - unit_system, marbl_tracer_metadata(marbl_tracer_indices%fe_ind)) - call marbl_init_non_autotroph_tracer_metadata('Lig', 'Iron Binding Ligand', & - unit_system, marbl_tracer_metadata(marbl_tracer_indices%lig_ind)) - call marbl_init_non_autotroph_tracer_metadata('O2', 'Dissolved Oxygen', & - unit_system, marbl_tracer_metadata(marbl_tracer_indices%o2_ind)) - call marbl_init_non_autotroph_tracer_metadata('DIC', 'Dissolved Inorganic Carbon', & - unit_system, marbl_tracer_metadata(marbl_tracer_indices%dic_ind)) - call marbl_init_non_autotroph_tracer_metadata('ALK', 'Alkalinity', & - unit_system, marbl_tracer_metadata(marbl_tracer_indices%alk_ind)) - call marbl_init_non_autotroph_tracer_metadata('DOC', 'Dissolved Organic Carbon', & - unit_system, marbl_tracer_metadata(marbl_tracer_indices%doc_ind)) - call marbl_init_non_autotroph_tracer_metadata('DON', 'Dissolved Organic Nitrogen', & - unit_system, marbl_tracer_metadata(marbl_tracer_indices%don_ind)) - call marbl_init_non_autotroph_tracer_metadata('DOP', 'Dissolved Organic Phosphorus', & - unit_system, marbl_tracer_metadata(marbl_tracer_indices%dop_ind)) - call marbl_init_non_autotroph_tracer_metadata('DOPr', 'Refractory DOP', & - unit_system, marbl_tracer_metadata(marbl_tracer_indices%dopr_ind)) - call marbl_init_non_autotroph_tracer_metadata('DONr', 'Refractory DON', & - unit_system, marbl_tracer_metadata(marbl_tracer_indices%donr_ind)) - call marbl_init_non_autotroph_tracer_metadata('DOCr', 'Refractory DOC', & - unit_system, marbl_tracer_metadata(marbl_tracer_indices%docr_ind)) - - call marbl_init_non_autotroph_tracer_metadata('DIC_ALT_CO2', 'Dissolved Inorganic Carbon, Alternative CO2', & - unit_system, marbl_tracer_metadata(marbl_tracer_indices%dic_alt_co2_ind)) - call marbl_init_non_autotroph_tracer_metadata('ALK_ALT_CO2', 'Alkalinity, Alternative CO2', & - unit_system, marbl_tracer_metadata(marbl_tracer_indices%alk_alt_co2_ind)) - - end subroutine marbl_init_non_autotroph_tracers_metadata - - !*********************************************************************** - - subroutine marbl_init_zooplankton_tracer_metadata(marbl_tracer_metadata, & - marbl_tracer_indices, unit_system) - - !----------------------------------------------------------------------- - ! initialize zooplankton tracer_d values and tracer indices - !----------------------------------------------------------------------- - - use marbl_settings_mod, only : zooplankton_settings - - type (marbl_tracer_metadata_type) , intent(inout) :: marbl_tracer_metadata(:) ! descriptors for each tracer - type (marbl_tracer_index_type) , intent(in) :: marbl_tracer_indices - type(unit_system_type) , intent(in) :: unit_system - - !----------------------------------------------------------------------- - ! local variables - !----------------------------------------------------------------------- - integer (int_kind) :: n, zoo_ind ! zooplankton functional group index - !----------------------------------------------------------------------- - - do zoo_ind = 1, zooplankton_cnt - n = marbl_tracer_indices%zoo_inds(zoo_ind)%C_ind - marbl_tracer_metadata(n)%short_name = trim(zooplankton_settings(zoo_ind)%sname) // 'C' - marbl_tracer_metadata(n)%long_name = trim(zooplankton_settings(zoo_ind)%lname) // ' Carbon' - marbl_tracer_metadata(n)%units = unit_system%conc_units - marbl_tracer_metadata(n)%tend_units = unit_system%conc_tend_units - marbl_tracer_metadata(n)%flux_units = unit_system%conc_flux_units - end do - - end subroutine marbl_init_zooplankton_tracer_metadata - - !*********************************************************************** - - subroutine marbl_init_autotroph_tracer_metadata(marbl_tracer_metadata, & - marbl_tracer_indices, unit_system) - - !----------------------------------------------------------------------- - ! initialize autotroph tracer_d values and tracer indices - !----------------------------------------------------------------------- - - use marbl_settings_mod, only : autotroph_settings - - type (marbl_tracer_metadata_type) , intent(inout) :: marbl_tracer_metadata(:) ! descriptors for each tracer - type (marbl_tracer_index_type) , intent(in) :: marbl_tracer_indices - type(unit_system_type) , intent(in) :: unit_system - - !----------------------------------------------------------------------- - ! local variables - !----------------------------------------------------------------------- - integer (int_kind) :: n, auto_ind - !----------------------------------------------------------------------- - - do auto_ind = 1, autotroph_cnt - n = marbl_tracer_indices%auto_inds(auto_ind)%Chl_ind - marbl_tracer_metadata(n)%short_name = trim(autotroph_settings(auto_ind)%sname) // 'Chl' - marbl_tracer_metadata(n)%long_name = trim(autotroph_settings(auto_ind)%lname) // ' Chlorophyll' - marbl_tracer_metadata(n)%units = 'mg/m^3' - marbl_tracer_metadata(n)%tend_units = 'mg/m^3/s' - if (unit_system%unit_system == 'cgs') then - marbl_tracer_metadata(n)%flux_units = 'mg/m^3 cm/s' - else - marbl_tracer_metadata(n)%flux_units = 'mg/m^2/s' - endif - n = marbl_tracer_indices%auto_inds(auto_ind)%C_ind - marbl_tracer_metadata(n)%short_name = trim(autotroph_settings(auto_ind)%sname) // 'C' - marbl_tracer_metadata(n)%long_name = trim(autotroph_settings(auto_ind)%lname) // ' Carbon' - marbl_tracer_metadata(n)%units = unit_system%conc_units - marbl_tracer_metadata(n)%tend_units = unit_system%conc_tend_units - marbl_tracer_metadata(n)%flux_units = unit_system%conc_flux_units - - n = marbl_tracer_indices%auto_inds(auto_ind)%P_ind - if (n.gt.0) then - marbl_tracer_metadata(n)%short_name = trim(autotroph_settings(auto_ind)%sname) // 'P' - marbl_tracer_metadata(n)%long_name = trim(autotroph_settings(auto_ind)%lname) // ' Phosphorus' - marbl_tracer_metadata(n)%units = unit_system%conc_units - marbl_tracer_metadata(n)%tend_units = unit_system%conc_tend_units - marbl_tracer_metadata(n)%flux_units = unit_system%conc_flux_units - endif - - n = marbl_tracer_indices%auto_inds(auto_ind)%Fe_ind - marbl_tracer_metadata(n)%short_name = trim(autotroph_settings(auto_ind)%sname) // 'Fe' - marbl_tracer_metadata(n)%long_name = trim(autotroph_settings(auto_ind)%lname) // ' Iron' - marbl_tracer_metadata(n)%units = unit_system%conc_units - marbl_tracer_metadata(n)%tend_units = unit_system%conc_tend_units - marbl_tracer_metadata(n)%flux_units = unit_system%conc_flux_units - - n = marbl_tracer_indices%auto_inds(auto_ind)%Si_ind - if (n .gt. 0) then - marbl_tracer_metadata(n)%short_name = trim(autotroph_settings(auto_ind)%sname) // 'Si' - marbl_tracer_metadata(n)%long_name = trim(autotroph_settings(auto_ind)%lname) // ' Silicon' - marbl_tracer_metadata(n)%units = unit_system%conc_units - marbl_tracer_metadata(n)%tend_units = unit_system%conc_tend_units - marbl_tracer_metadata(n)%flux_units = unit_system%conc_flux_units - endif - - n = marbl_tracer_indices%auto_inds(auto_ind)%CaCO3_ind - if (n .gt. 0) then - marbl_tracer_metadata(n)%short_name = trim(autotroph_settings(auto_ind)%sname) // 'CaCO3' - marbl_tracer_metadata(n)%long_name = trim(autotroph_settings(auto_ind)%lname) // ' CaCO3' - marbl_tracer_metadata(n)%units = unit_system%conc_units - marbl_tracer_metadata(n)%tend_units = unit_system%conc_tend_units - marbl_tracer_metadata(n)%flux_units = unit_system%conc_flux_units - endif - end do - - end subroutine marbl_init_autotroph_tracer_metadata - - !*********************************************************************** - - subroutine marbl_init_surface_flux_forcing_fields(num_elements, surface_flux_forcing_indices, & - unit_system, surface_flux_forcings, marbl_status_log) + subroutine init_surface_flux_forcing_fields(num_elements, surface_flux_forcing_indices, unit_system, & + surface_flux_forcings, marbl_status_log) ! Initialize the surface forcing_fields datatype with information from the ! namelist read @@ -670,7 +440,7 @@ subroutine marbl_init_surface_flux_forcing_fields(num_elements, surface_flux_for !----------------------------------------------------------------------- ! local variables !----------------------------------------------------------------------- - character(len=*), parameter :: subname = 'marbl_init_mod:marbl_init_surface_flux_forcing_fields' + character(len=*), parameter :: subname = 'marbl_init_mod:init_surface_flux_forcing_fields' character(len=char_len) :: log_message integer :: id @@ -813,11 +583,11 @@ subroutine marbl_init_surface_flux_forcing_fields(num_elements, surface_flux_for ! FIXME #26: do we have any forcing fields that are required to be set? ! If so, check to make sure those indices are not zero here. - end subroutine marbl_init_surface_flux_forcing_fields + end subroutine init_surface_flux_forcing_fields !***************************************************************************** - subroutine marbl_init_interior_tendency_forcing_fields(& + subroutine init_interior_tendency_forcing_fields(& num_elements, & interior_tendency_forcing_indices, & tracer_metadata, & @@ -844,7 +614,7 @@ subroutine marbl_init_interior_tendency_forcing_fields(& !----------------------------------------------------------------------- ! local variables !----------------------------------------------------------------------- - character(len=*), parameter :: subname = 'marbl_init_mod:marbl_init_interior_tendency_forcing_fields' + character(len=*), parameter :: subname = 'marbl_init_mod:init_interior_tendency_forcing_fields' character(len=char_len) :: log_message ! NAG didn't like associating to tracer_metadata(:)%* @@ -978,7 +748,7 @@ subroutine marbl_init_interior_tendency_forcing_fields(& ! FIXME #26: do we have any forcing fields that are required to be set? ! If so, check to make sure those indices are not zero here. - end subroutine marbl_init_interior_tendency_forcing_fields + end subroutine init_interior_tendency_forcing_fields !***************************************************************************** diff --git a/src/marbl_init_tracer_metadata_mod.F90 b/src/marbl_init_tracer_metadata_mod.F90 new file mode 100644 index 00000000..b5bdec34 --- /dev/null +++ b/src/marbl_init_tracer_metadata_mod.F90 @@ -0,0 +1,335 @@ +module marbl_init_tracer_metadata_mod + + use marbl_kinds_mod, only : int_kind + + use marbl_interface_public_types, only : marbl_tracer_metadata_type + + use marbl_interface_private_types, only : marbl_tracer_index_type + + use marbl_settings_mod, only : base_bio_on + use marbl_settings_mod, only : abio_dic_on + use marbl_settings_mod, only : ciso_on + use marbl_settings_mod, only : autotroph_cnt + use marbl_settings_mod, only : zooplankton_cnt + use marbl_settings_mod, only : unit_system_type + + implicit none + private + + public :: marbl_init_tracer_metadata + + contains + + subroutine marbl_init_tracer_metadata(unit_system, marbl_tracer_indices, marbl_tracer_metadata) + + ! Set tracer and forcing metadata + + use marbl_settings_mod, only : lecovars_full_depth_tavg + + type(unit_system_type), intent(in) :: unit_system + type(marbl_tracer_index_type), intent(in) :: marbl_tracer_indices + type(marbl_tracer_metadata_type), intent(out) :: marbl_tracer_metadata(:) ! descriptors for each tracer + + !----------------------------------------------------------------------- + ! local variables + !----------------------------------------------------------------------- + + integer(int_kind) :: n ! index for looping over tracers + integer(int_kind) :: zoo_ind ! zooplankton functional group index + integer(int_kind) :: auto_ind ! autotroph functional group index + + !----------------------------------------------------------------------- + ! initialize tracer metatdata + !----------------------------------------------------------------------- + + marbl_tracer_metadata(:)%lfull_depth_tavg = .true. + + if (base_bio_on) then + call init_non_autotroph_tracer_metadata('PO4', 'Dissolved Inorganic Phosphate', 'base_bio', & + unit_system, marbl_tracer_metadata(marbl_tracer_indices%po4_ind)) + call init_non_autotroph_tracer_metadata('NO3', 'Dissolved Inorganic Nitrate', 'base_bio', & + unit_system, marbl_tracer_metadata(marbl_tracer_indices%no3_ind)) + call init_non_autotroph_tracer_metadata('SiO3', 'Dissolved Inorganic Silicate', 'base_bio', & + unit_system, marbl_tracer_metadata(marbl_tracer_indices%sio3_ind)) + call init_non_autotroph_tracer_metadata('NH4', 'Dissolved Ammonia', 'base_bio', & + unit_system, marbl_tracer_metadata(marbl_tracer_indices%nh4_ind)) + call init_non_autotroph_tracer_metadata('Fe', 'Dissolved Inorganic Iron', 'base_bio', & + unit_system, marbl_tracer_metadata(marbl_tracer_indices%fe_ind)) + call init_non_autotroph_tracer_metadata('Lig', 'Iron Binding Ligand', 'base_bio', & + unit_system, marbl_tracer_metadata(marbl_tracer_indices%lig_ind)) + call init_non_autotroph_tracer_metadata('O2', 'Dissolved Oxygen', 'base_bio', & + unit_system, marbl_tracer_metadata(marbl_tracer_indices%o2_ind)) + call init_non_autotroph_tracer_metadata('DIC', 'Dissolved Inorganic Carbon', 'base_bio', & + unit_system, marbl_tracer_metadata(marbl_tracer_indices%dic_ind)) + call init_non_autotroph_tracer_metadata('ALK', 'Alkalinity', 'base_bio', & + unit_system, marbl_tracer_metadata(marbl_tracer_indices%alk_ind)) + call init_non_autotroph_tracer_metadata('DOC', 'Dissolved Organic Carbon', 'base_bio', & + unit_system, marbl_tracer_metadata(marbl_tracer_indices%doc_ind)) + call init_non_autotroph_tracer_metadata('DON', 'Dissolved Organic Nitrogen', 'base_bio', & + unit_system, marbl_tracer_metadata(marbl_tracer_indices%don_ind)) + call init_non_autotroph_tracer_metadata('DOP', 'Dissolved Organic Phosphorus', 'base_bio', & + unit_system, marbl_tracer_metadata(marbl_tracer_indices%dop_ind)) + call init_non_autotroph_tracer_metadata('DOPr', 'Refractory DOP', 'base_bio', & + unit_system, marbl_tracer_metadata(marbl_tracer_indices%dopr_ind)) + call init_non_autotroph_tracer_metadata('DONr', 'Refractory DON', 'base_bio', & + unit_system, marbl_tracer_metadata(marbl_tracer_indices%donr_ind)) + call init_non_autotroph_tracer_metadata('DOCr', 'Refractory DOC', 'base_bio', & + unit_system, marbl_tracer_metadata(marbl_tracer_indices%docr_ind)) + call init_non_autotroph_tracer_metadata('DIC_ALT_CO2', 'Dissolved Inorganic Carbon, Alternative CO2', & + 'base_bio', unit_system, marbl_tracer_metadata(marbl_tracer_indices%dic_alt_co2_ind)) + call init_non_autotroph_tracer_metadata('ALK_ALT_CO2', 'Alkalinity, Alternative CO2', & + 'base_bio', unit_system, marbl_tracer_metadata(marbl_tracer_indices%alk_alt_co2_ind)) + + call init_zooplankton_tracer_metadata(marbl_tracer_metadata, & + marbl_tracer_indices, unit_system) + + call init_autotroph_tracer_metadata(marbl_tracer_metadata, & + marbl_tracer_indices, unit_system) + + !----------------------------------------------------------------------- + ! set lfull_depth_tavg flag for short-lived ecosystem tracers + !----------------------------------------------------------------------- + + ! Should be done in marbl_diagnostics, and without the _tavg name + do zoo_ind = 1, zooplankton_cnt + n = marbl_tracer_indices%zoo_inds(zoo_ind)%C_ind + marbl_tracer_metadata(n)%lfull_depth_tavg = lecovars_full_depth_tavg + marbl_tracer_metadata(n)%tracer_module_name = 'base_bio' + end do + + do auto_ind = 1, autotroph_cnt + n = marbl_tracer_indices%auto_inds(auto_ind)%Chl_ind + marbl_tracer_metadata(n)%lfull_depth_tavg = lecovars_full_depth_tavg + marbl_tracer_metadata(n)%tracer_module_name = 'base_bio' + + n = marbl_tracer_indices%auto_inds(auto_ind)%C_ind + marbl_tracer_metadata(n)%lfull_depth_tavg = lecovars_full_depth_tavg + marbl_tracer_metadata(n)%tracer_module_name = 'base_bio' + + n = marbl_tracer_indices%auto_inds(auto_ind)%P_ind + if (n > 0) then + marbl_tracer_metadata(n)%lfull_depth_tavg = lecovars_full_depth_tavg + marbl_tracer_metadata(n)%tracer_module_name = 'base_bio' + endif + + n = marbl_tracer_indices%auto_inds(auto_ind)%Fe_ind + marbl_tracer_metadata(n)%lfull_depth_tavg = lecovars_full_depth_tavg + marbl_tracer_metadata(n)%tracer_module_name = 'base_bio' + + n = marbl_tracer_indices%auto_inds(auto_ind)%Si_ind + if (n > 0) then + marbl_tracer_metadata(n)%lfull_depth_tavg = lecovars_full_depth_tavg + marbl_tracer_metadata(n)%tracer_module_name = 'base_bio' + endif + + n = marbl_tracer_indices%auto_inds(auto_ind)%CaCO3_ind + if (n > 0) then + marbl_tracer_metadata(n)%lfull_depth_tavg = lecovars_full_depth_tavg + marbl_tracer_metadata(n)%tracer_module_name = 'base_bio' + endif + end do + end if + + if (ciso_on) then + call init_non_autotroph_tracer_metadata('DI13C', 'Dissolved Inorganic Carbon-13', 'ciso', & + unit_system, marbl_tracer_metadata(marbl_tracer_indices%di13c_ind)) + call init_non_autotroph_tracer_metadata('DO13Ctot', 'Dissolved Organic Carbon-13 (semi-labile+refractory)', & + 'ciso', unit_system, marbl_tracer_metadata(marbl_tracer_indices%do13ctot_ind)) + call init_non_autotroph_tracer_metadata('zootot13C', 'Zooplankton Carbon-13 (sum over all zooplankton)', & + 'ciso', unit_system, marbl_tracer_metadata(marbl_tracer_indices%zootot13C_ind)) + call init_non_autotroph_tracer_metadata('DI14C', 'Dissolved Inorganic Carbon-14', 'ciso', & + unit_system, marbl_tracer_metadata(marbl_tracer_indices%di14c_ind)) + call init_non_autotroph_tracer_metadata('DO14Ctot', 'Dissolved Organic Carbon-14 (semi-labile+refractory)', & + 'ciso', unit_system, marbl_tracer_metadata(marbl_tracer_indices%do14ctot_ind)) + call init_non_autotroph_tracer_metadata('zootot14C', 'Zooplankton Carbon-14 (sum over all zooplankton)', & + 'ciso', unit_system, marbl_tracer_metadata(marbl_tracer_indices%zootot14C_ind)) + end if + + if (abio_dic_on) then + call init_non_autotroph_tracer_metadata('ABIO_DIC', 'Abiotic Dissolved Inorganic Carbon', 'abio_dic', & + unit_system, marbl_tracer_metadata(marbl_tracer_indices%abio_dic_ind)) + call init_non_autotroph_tracer_metadata('ABIO_DI14C', 'Abiotic Dissolved Inorganic Carbon-14', 'abio_dic', & + unit_system, marbl_tracer_metadata(marbl_tracer_indices%abio_di14c_ind)) + end if + + end subroutine marbl_init_tracer_metadata + + !*********************************************************************** + + subroutine init_non_autotroph_tracer_metadata(short_name, long_name, tracer_module_name, unit_system, & + marbl_tracer_metadata) + + !----------------------------------------------------------------------- + ! initialize non-autotroph tracer_d values and accumulate + ! non_living_biomass_ecosys_tracer_cnt + !----------------------------------------------------------------------- + + character(len=*), intent(in) :: short_name + character(len=*), intent(in) :: long_name + character(len=*), intent(in) :: tracer_module_name + type(unit_system_type), intent(in) :: unit_system + type(marbl_tracer_metadata_type), intent(inout) :: marbl_tracer_metadata + + marbl_tracer_metadata%short_name = short_name + marbl_tracer_metadata%long_name = long_name + marbl_tracer_metadata%tracer_module_name = tracer_module_name + if ((trim(short_name) == "ALK") .or. & + (trim(short_name) == "ALK_ALT_CO2")) then + marbl_tracer_metadata%units = unit_system%alk_conc_units + marbl_tracer_metadata%tend_units = unit_system%alk_conc_tend_units + marbl_tracer_metadata%flux_units = unit_system%alk_conc_flux_units + else + marbl_tracer_metadata%units = unit_system%conc_units + marbl_tracer_metadata%tend_units = unit_system%conc_tend_units + marbl_tracer_metadata%flux_units = unit_system%conc_flux_units + endif + + end subroutine init_non_autotroph_tracer_metadata + + !*********************************************************************** + + subroutine init_zooplankton_tracer_metadata(marbl_tracer_metadata, & + marbl_tracer_indices, unit_system) + + !----------------------------------------------------------------------- + ! initialize zooplankton tracer_d values and tracer indices + !----------------------------------------------------------------------- + + use marbl_settings_mod, only : zooplankton_settings + + type(marbl_tracer_metadata_type), intent(inout) :: marbl_tracer_metadata(:) ! descriptors for each tracer + type(marbl_tracer_index_type), intent(in) :: marbl_tracer_indices + type(unit_system_type), intent(in) :: unit_system + + !----------------------------------------------------------------------- + ! local variables + !----------------------------------------------------------------------- + integer (int_kind) :: n, zoo_ind ! zooplankton functional group index + !----------------------------------------------------------------------- + + do zoo_ind = 1, zooplankton_cnt + n = marbl_tracer_indices%zoo_inds(zoo_ind)%C_ind + marbl_tracer_metadata(n)%short_name = trim(zooplankton_settings(zoo_ind)%sname) // 'C' + marbl_tracer_metadata(n)%long_name = trim(zooplankton_settings(zoo_ind)%lname) // ' Carbon' + marbl_tracer_metadata(n)%units = unit_system%conc_units + marbl_tracer_metadata(n)%tend_units = unit_system%conc_tend_units + marbl_tracer_metadata(n)%flux_units = unit_system%conc_flux_units + end do + + end subroutine init_zooplankton_tracer_metadata + + !*********************************************************************** + + subroutine init_autotroph_tracer_metadata(marbl_tracer_metadata, & + marbl_tracer_indices, unit_system) + + !----------------------------------------------------------------------- + ! initialize autotroph tracer_d values and tracer indices + !----------------------------------------------------------------------- + + use marbl_settings_mod, only : autotroph_settings + + type(marbl_tracer_metadata_type), intent(inout) :: marbl_tracer_metadata(:) ! descriptors for each tracer + type(marbl_tracer_index_type), intent(in) :: marbl_tracer_indices + type(unit_system_type), intent(in) :: unit_system + + !----------------------------------------------------------------------- + ! local variables + !----------------------------------------------------------------------- + integer (int_kind) :: n, auto_ind + !----------------------------------------------------------------------- + + do auto_ind = 1, autotroph_cnt + n = marbl_tracer_indices%auto_inds(auto_ind)%Chl_ind + marbl_tracer_metadata(n)%short_name = trim(autotroph_settings(auto_ind)%sname) // 'Chl' + marbl_tracer_metadata(n)%long_name = trim(autotroph_settings(auto_ind)%lname) // ' Chlorophyll' + marbl_tracer_metadata(n)%units = 'mg/m^3' + marbl_tracer_metadata(n)%tend_units = 'mg/m^3/s' + if (unit_system%unit_system == 'cgs') then + marbl_tracer_metadata(n)%flux_units = 'mg/m^3 cm/s' + else + marbl_tracer_metadata(n)%flux_units = 'mg/m^2/s' + endif + n = marbl_tracer_indices%auto_inds(auto_ind)%C_ind + marbl_tracer_metadata(n)%short_name = trim(autotroph_settings(auto_ind)%sname) // 'C' + marbl_tracer_metadata(n)%long_name = trim(autotroph_settings(auto_ind)%lname) // ' Carbon' + marbl_tracer_metadata(n)%units = unit_system%conc_units + marbl_tracer_metadata(n)%tend_units = unit_system%conc_tend_units + marbl_tracer_metadata(n)%flux_units = unit_system%conc_flux_units + + n = marbl_tracer_indices%auto_inds(auto_ind)%P_ind + if (n.gt.0) then + marbl_tracer_metadata(n)%short_name = trim(autotroph_settings(auto_ind)%sname) // 'P' + marbl_tracer_metadata(n)%long_name = trim(autotroph_settings(auto_ind)%lname) // ' Phosphorus' + marbl_tracer_metadata(n)%units = unit_system%conc_units + marbl_tracer_metadata(n)%tend_units = unit_system%conc_tend_units + marbl_tracer_metadata(n)%flux_units = unit_system%conc_flux_units + endif + + n = marbl_tracer_indices%auto_inds(auto_ind)%Fe_ind + marbl_tracer_metadata(n)%short_name = trim(autotroph_settings(auto_ind)%sname) // 'Fe' + marbl_tracer_metadata(n)%long_name = trim(autotroph_settings(auto_ind)%lname) // ' Iron' + marbl_tracer_metadata(n)%units = unit_system%conc_units + marbl_tracer_metadata(n)%tend_units = unit_system%conc_tend_units + marbl_tracer_metadata(n)%flux_units = unit_system%conc_flux_units + + n = marbl_tracer_indices%auto_inds(auto_ind)%Si_ind + if (n .gt. 0) then + marbl_tracer_metadata(n)%short_name = trim(autotroph_settings(auto_ind)%sname) // 'Si' + marbl_tracer_metadata(n)%long_name = trim(autotroph_settings(auto_ind)%lname) // ' Silicon' + marbl_tracer_metadata(n)%units = unit_system%conc_units + marbl_tracer_metadata(n)%tend_units = unit_system%conc_tend_units + marbl_tracer_metadata(n)%flux_units = unit_system%conc_flux_units + endif + + n = marbl_tracer_indices%auto_inds(auto_ind)%CaCO3_ind + if (n .gt. 0) then + marbl_tracer_metadata(n)%short_name = trim(autotroph_settings(auto_ind)%sname) // 'CaCO3' + marbl_tracer_metadata(n)%long_name = trim(autotroph_settings(auto_ind)%lname) // ' CaCO3' + marbl_tracer_metadata(n)%units = unit_system%conc_units + marbl_tracer_metadata(n)%tend_units = unit_system%conc_tend_units + marbl_tracer_metadata(n)%flux_units = unit_system%conc_flux_units + endif + + ! ciso tracers + if (ciso_on) then + n = marbl_tracer_indices%auto_inds(auto_ind)%C13_ind + marbl_tracer_metadata(n)%short_name = trim(autotroph_settings(auto_ind)%sname) // '13C' + marbl_tracer_metadata(n)%long_name = trim(autotroph_settings(auto_ind)%lname) // ' Carbon-13' + marbl_tracer_metadata(n)%units = unit_system%conc_units + marbl_tracer_metadata(n)%tend_units = unit_system%conc_tend_units + marbl_tracer_metadata(n)%flux_units = unit_system%conc_flux_units + + n = marbl_tracer_indices%auto_inds(auto_ind)%C14_ind + marbl_tracer_metadata(n)%short_name = trim(autotroph_settings(auto_ind)%sname) // '14C' + marbl_tracer_metadata(n)%long_name = trim(autotroph_settings(auto_ind)%lname) // ' Carbon-14' + marbl_tracer_metadata(n)%units = unit_system%conc_units + marbl_tracer_metadata(n)%tend_units = unit_system%conc_tend_units + marbl_tracer_metadata(n)%flux_units = unit_system%conc_flux_units + + n = marbl_tracer_indices%auto_inds(auto_ind)%Ca13CO3_ind + if (n .gt. 0) then + marbl_tracer_metadata(n)%short_name = trim(autotroph_settings(auto_ind)%sname) // 'Ca13CO3' + marbl_tracer_metadata(n)%long_name = trim(autotroph_settings(auto_ind)%lname) // ' Ca13CO3' + marbl_tracer_metadata(n)%units = unit_system%conc_units + marbl_tracer_metadata(n)%tend_units = unit_system%conc_tend_units + marbl_tracer_metadata(n)%flux_units = unit_system%conc_flux_units + end if + + n = marbl_tracer_indices%auto_inds(auto_ind)%Ca14CO3_ind + if (n .gt. 0) then + marbl_tracer_metadata(n)%short_name = trim(autotroph_settings(auto_ind)%sname) // 'Ca14CO3' + marbl_tracer_metadata(n)%long_name = trim(autotroph_settings(auto_ind)%lname) // ' Ca14CO3' + marbl_tracer_metadata(n)%units = unit_system%conc_units + marbl_tracer_metadata(n)%tend_units = unit_system%conc_tend_units + marbl_tracer_metadata(n)%flux_units = unit_system%conc_flux_units + end if + end if + + end do + + end subroutine init_autotroph_tracer_metadata + + !*********************************************************************** + +end module marbl_init_tracer_metadata_mod \ No newline at end of file diff --git a/src/marbl_interface_private_types.F90 b/src/marbl_interface_private_types.F90 index cba7999c..a5e08fe4 100644 --- a/src/marbl_interface_private_types.F90 +++ b/src/marbl_interface_private_types.F90 @@ -332,10 +332,11 @@ module marbl_interface_private_types type, public :: marbl_tracer_index_type ! Book-keeping (tracer count and index ranges) integer (int_kind) :: total_cnt = 0 - type (marbl_tracer_count_type) :: ecosys_base + type (marbl_tracer_count_type) :: base_bio + type (marbl_tracer_count_type) :: abio_dic type (marbl_tracer_count_type) :: ciso - ! General tracers + ! base biotic tracers integer (int_kind) :: po4_ind = 0 ! dissolved inorganic phosphate integer (int_kind) :: no3_ind = 0 ! dissolved inorganic nitrate integer (int_kind) :: sio3_ind = 0 ! dissolved inorganic silicate @@ -354,7 +355,11 @@ module marbl_interface_private_types integer (int_kind) :: donr_ind = 0 ! refractory DON integer (int_kind) :: docr_ind = 0 ! refractory DOC - ! CISO tracers + ! abiotic dic tracers + integer (int_kind) :: abio_dic_ind = 0 ! abiotic dissolved inorganic carbon + integer (int_kind) :: abio_di14c_ind = 0 ! abiotic dissolved inorganic carbon 14 + + ! carbon isotope tracers integer (int_kind) :: di13c_ind = 0 ! dissolved inorganic carbon 13 integer (int_kind) :: do13ctot_ind = 0 ! dissolved organic carbon 13 (semi-labile+refractory) integer (int_kind) :: di14c_ind = 0 ! dissolved inorganic carbon 14 @@ -430,8 +435,9 @@ module marbl_interface_private_types !***************************************************************************** type, public :: marbl_surface_flux_saved_state_indexing_type - integer :: ph_surf = 0 - integer :: ph_alt_co2_surf = 0 + integer :: base_bio_ph_surf = 0 + integer :: base_bio_ph_alt_co2_surf = 0 + integer :: abio_dic_ph_surf = 0 end type marbl_surface_flux_saved_state_indexing_type !***************************************************************************** @@ -456,14 +462,14 @@ module marbl_interface_private_types integer(int_kind) :: DpCO2 integer(int_kind) :: PV_CO2 integer(int_kind) :: SCHMIDT_CO2 - integer(int_kind) :: DIC_GAS_FLUX + integer(int_kind) :: FG_CO2 integer(int_kind) :: PH integer(int_kind) :: ATM_CO2 integer(int_kind) :: CO2STAR_ALT_CO2 integer(int_kind) :: DCO2STAR_ALT_CO2 integer(int_kind) :: pCO2SURF_ALT_CO2 integer(int_kind) :: DpCO2_ALT_CO2 - integer(int_kind) :: DIC_GAS_FLUX_ALT_CO2 + integer(int_kind) :: FG_CO2_ALT_CO2 integer(int_kind) :: PH_ALT_CO2 integer(int_kind) :: ATM_ALT_CO2 integer(int_kind) :: IRON_FLUX @@ -472,6 +478,20 @@ module marbl_interface_private_types integer(int_kind) :: NHy_FLUX integer(int_kind) :: NHx_SURFACE_EMIS + integer(int_kind) :: ABIO_pCO2 + integer(int_kind) :: ABIO_D14C_atm + integer(int_kind) :: ABIO_CO2STAR + integer(int_kind) :: ABIO_DCO2STAR + integer(int_kind) :: ABIO_pCO2SURF + integer(int_kind) :: ABIO_DpCO2 + integer(int_kind) :: ABIO_PH + integer(int_kind) :: ABIO_ALK_SURF + integer(int_kind) :: ABIO_FG_DIC + integer(int_kind) :: ABIO_FG_DI14C + integer(int_kind) :: d_SF_ABIO_DIC_d_ABIO_DIC + integer(int_kind) :: d_SF_ABIO_DI14C_d_ABIO_DIC + integer(int_kind) :: d_SF_ABIO_DI14C_d_ABIO_DI14C + integer(int_kind) :: CISO_DI13C_GAS_FLUX ! di13c flux integer(int_kind) :: CISO_DI14C_GAS_FLUX ! di14c flux integer(int_kind) :: CISO_DI13C_AS_GAS_FLUX ! air-sea di13c flux @@ -711,64 +731,67 @@ module marbl_interface_private_types integer(int_kind), allocatable :: zoo_graze_zoo(:,:) integer(int_kind), allocatable :: x_graze_zoo(:) - ! ciso ids for nonstandard 3d fields - integer (int_kind) :: CISO_PO13C_FLUX_IN ! po13c flux into cell - integer (int_kind) :: CISO_PO14C_FLUX_IN ! po14c flux into cell - integer (int_kind) :: CISO_PO13C_PROD ! po13c production - integer (int_kind) :: CISO_PO14C_PROD ! po14c production - integer (int_kind) :: CISO_PO13C_REMIN ! po13c remineralization - integer (int_kind) :: CISO_PO14C_REMIN ! po14c remineralization - integer (int_kind) :: CISO_Ca13CO3_PROD ! ca13co3 production - integer (int_kind) :: CISO_Ca14CO3_PROD ! ca14co3 production - integer (int_kind) :: CISO_Ca13CO3_REMIN ! ca13co3 remineralization - integer (int_kind) :: CISO_Ca14CO3_REMIN ! ca14co3 remineralization - integer (int_kind) :: CISO_Ca13CO3_FLUX_IN ! ca13co3 flux into cell - integer (int_kind) :: CISO_Ca14CO3_FLUX_IN ! ca14co3 flux into cell - integer (int_kind) :: CISO_photo13C_TOT ! total 13C fixation - integer (int_kind) :: CISO_photo14C_TOT ! total 14C fixation - integer (int_kind) :: CISO_photo13C_TOT_zint ! total 13C fixation vertical integral - integer (int_kind) :: CISO_photo14C_TOT_zint ! total 14C fixation vertical integral - - ! ciso ids for MORE nonstandard 3d fields - integer (int_kind), allocatable :: CISO_eps_autotroph(:) ! epsilon for each autotroph - integer (int_kind), allocatable :: CISO_mui_to_co2star(:) ! mui_to_co2star for each autotroph - integer (int_kind), allocatable :: CISO_Ca13CO3_form(:) ! Ca13CO3 formation - integer (int_kind), allocatable :: CISO_Ca14CO3_form(:) ! Ca14CO3 formation - integer (int_kind), allocatable :: CISO_Ca13CO3_form_zint(:) ! Ca13CO3 formation vertical integral 0-100 m - integer (int_kind), allocatable :: CISO_Ca14CO3_form_zint(:) ! Ca14CO3 formation vertical integral 0-100 m - integer (int_kind), allocatable :: CISO_photo13C(:) ! 13C fixation - integer (int_kind), allocatable :: CISO_photo14C(:) ! 14C fixation - integer (int_kind), allocatable :: CISO_photo13C_zint(:) ! 13C fixation vertical integral - integer (int_kind), allocatable :: CISO_photo14C_zint(:) ! 14C fixation vertical integral - integer (int_kind), allocatable :: CISO_d13C(:) ! d13C of autotroph carbon - integer (int_kind), allocatable :: CISO_d14C(:) ! d14C of autotroph carbon - integer (int_kind), allocatable :: CISO_autotrophCaCO3_d14C(:) ! d14C of autotrophCaCO3 - integer (int_kind), allocatable :: CISO_autotrophCaCO3_d13C(:) ! d13C of autotrophCaCO3 - - integer (int_kind) :: CISO_eps_aq_g ! eps_aq_g - integer (int_kind) :: CISO_eps_dic_g ! eps_dic_g - integer (int_kind) :: CISO_DO13Ctot_prod ! do13ctot production - integer (int_kind) :: CISO_DO14Ctot_prod ! do14ctot production - integer (int_kind) :: CISO_DO13Ctot_remin ! do13ctot remineralization - integer (int_kind) :: CISO_DO14Ctot_remin ! do14ctot remineralization - integer (int_kind) :: CISO_Jint_13Ctot ! vertically integrated source sink term, 13Ctot - integer (int_kind) :: CISO_Jint_14Ctot ! vertically integrated source sink term, 14Ctot - integer (int_kind) :: CISO_zoototC_d13C ! d13C of total zooC - integer (int_kind) :: CISO_zoototC_d14C ! d14C of total zooC - integer (int_kind) :: CISO_DOCtot_d13C ! d13C of DOCtot - integer (int_kind) :: CISO_DOCtot_d14C ! d14C of DOCtot - integer (int_kind) :: CISO_DIC_d13C ! d13C of DIC - integer (int_kind) :: CISO_DIC_d14C ! d14C of DIC - integer (int_kind) :: calcToSed_13C ! calcite flux sedimentary burial - integer (int_kind) :: calcToSed_14C ! calcite flux sedimentary burial - integer (int_kind) :: pocToSed_13C ! poc burial flux to sediments - integer (int_kind) :: pocToSed_14C ! poc burial flux to sediments - - ! restoring 3D diags - integer(int_kind), dimension(:), allocatable :: restore_tend - contains - procedure, public :: lconstructed => interior_diag_ind_constructed - procedure, public :: destruct => interior_diag_ind_destructor + ! abio ids + integer(int_kind) :: ABIO_D14C_ocn + + ! ciso ids for nonstandard 3d fields + integer (int_kind) :: CISO_PO13C_FLUX_IN ! po13c flux into cell + integer (int_kind) :: CISO_PO14C_FLUX_IN ! po14c flux into cell + integer (int_kind) :: CISO_PO13C_PROD ! po13c production + integer (int_kind) :: CISO_PO14C_PROD ! po14c production + integer (int_kind) :: CISO_PO13C_REMIN ! po13c remineralization + integer (int_kind) :: CISO_PO14C_REMIN ! po14c remineralization + integer (int_kind) :: CISO_Ca13CO3_PROD ! ca13co3 production + integer (int_kind) :: CISO_Ca14CO3_PROD ! ca14co3 production + integer (int_kind) :: CISO_Ca13CO3_REMIN ! ca13co3 remineralization + integer (int_kind) :: CISO_Ca14CO3_REMIN ! ca14co3 remineralization + integer (int_kind) :: CISO_Ca13CO3_FLUX_IN ! ca13co3 flux into cell + integer (int_kind) :: CISO_Ca14CO3_FLUX_IN ! ca14co3 flux into cell + integer (int_kind) :: CISO_photo13C_TOT ! total 13C fixation + integer (int_kind) :: CISO_photo14C_TOT ! total 14C fixation + integer (int_kind) :: CISO_photo13C_TOT_zint ! total 13C fixation vertical integral + integer (int_kind) :: CISO_photo14C_TOT_zint ! total 14C fixation vertical integral + + ! ciso ids for MORE nonstandard 3d fields + integer (int_kind), allocatable :: CISO_eps_autotroph(:) ! epsilon for each autotroph + integer (int_kind), allocatable :: CISO_mui_to_co2star(:) ! mui_to_co2star for each autotroph + integer (int_kind), allocatable :: CISO_Ca13CO3_form(:) ! Ca13CO3 formation + integer (int_kind), allocatable :: CISO_Ca14CO3_form(:) ! Ca14CO3 formation + integer (int_kind), allocatable :: CISO_Ca13CO3_form_zint(:) ! Ca13CO3 formation vertical integral 0-100 m + integer (int_kind), allocatable :: CISO_Ca14CO3_form_zint(:) ! Ca14CO3 formation vertical integral 0-100 m + integer (int_kind), allocatable :: CISO_photo13C(:) ! 13C fixation + integer (int_kind), allocatable :: CISO_photo14C(:) ! 14C fixation + integer (int_kind), allocatable :: CISO_photo13C_zint(:) ! 13C fixation vertical integral + integer (int_kind), allocatable :: CISO_photo14C_zint(:) ! 14C fixation vertical integral + integer (int_kind), allocatable :: CISO_d13C(:) ! d13C of autotroph carbon + integer (int_kind), allocatable :: CISO_d14C(:) ! d14C of autotroph carbon + integer (int_kind), allocatable :: CISO_autotrophCaCO3_d14C(:) ! d14C of autotrophCaCO3 + integer (int_kind), allocatable :: CISO_autotrophCaCO3_d13C(:) ! d13C of autotrophCaCO3 + + integer (int_kind) :: CISO_eps_aq_g ! eps_aq_g + integer (int_kind) :: CISO_eps_dic_g ! eps_dic_g + integer (int_kind) :: CISO_DO13Ctot_prod ! do13ctot production + integer (int_kind) :: CISO_DO14Ctot_prod ! do14ctot production + integer (int_kind) :: CISO_DO13Ctot_remin ! do13ctot remineralization + integer (int_kind) :: CISO_DO14Ctot_remin ! do14ctot remineralization + integer (int_kind) :: CISO_Jint_13Ctot ! vertically integrated source sink term, 13Ctot + integer (int_kind) :: CISO_Jint_14Ctot ! vertically integrated source sink term, 14Ctot + integer (int_kind) :: CISO_zoototC_d13C ! d13C of total zooC + integer (int_kind) :: CISO_zoototC_d14C ! d14C of total zooC + integer (int_kind) :: CISO_DOCtot_d13C ! d13C of DOCtot + integer (int_kind) :: CISO_DOCtot_d14C ! d14C of DOCtot + integer (int_kind) :: CISO_DIC_d13C ! d13C of DIC + integer (int_kind) :: CISO_DIC_d14C ! d14C of DIC + integer (int_kind) :: calcToSed_13C ! calcite flux sedimentary burial + integer (int_kind) :: calcToSed_14C ! calcite flux sedimentary burial + integer (int_kind) :: pocToSed_13C ! poc burial flux to sediments + integer (int_kind) :: pocToSed_14C ! poc burial flux to sediments + + ! restoring 3D diags + integer(int_kind), dimension(:), allocatable :: restore_tend + contains + procedure, public :: lallocated => interior_diag_ind_allocated + procedure, public :: destruct => interior_diag_ind_destructor end type marbl_interior_tendency_diagnostics_indexing_type !*********************************************************************** @@ -1319,42 +1342,24 @@ subroutine marbl_surface_flux_internal_constructor(this, num_elements) class(marbl_surface_flux_internal_type), intent(out) :: this integer (int_kind), intent(in) :: num_elements - allocate(this%piston_velocity (num_elements)) - this%piston_velocity = c0 - allocate(this%flux_co2 (num_elements)) - this%flux_co2 = c0 - allocate(this%flux_alt_co2 (num_elements)) - this%flux_alt_co2 = c0 - allocate(this%co2star (num_elements)) - this%co2star = c0 - allocate(this%dco2star (num_elements)) - this%dco2star = c0 - allocate(this%pco2surf (num_elements)) - this%pco2surf = c0 - allocate(this%dpco2 (num_elements)) - this%dpco2 = c0 - allocate(this%co3 (num_elements)) - this%co3 = c0 - allocate(this%co2star_alt (num_elements)) - this%co2star_alt = c0 - allocate(this%dco2star_alt (num_elements)) - this%dco2star_alt = c0 - allocate(this%pco2surf_alt (num_elements)) - this%pco2surf_alt = c0 - allocate(this%dpco2_alt (num_elements)) - this%dpco2_alt = c0 - allocate(this%schmidt_co2 (num_elements)) - this%schmidt_co2 = c0 - allocate(this%schmidt_o2 (num_elements)) - this%schmidt_o2 = c0 - allocate(this%pv_o2 (num_elements)) - this%pv_o2 = c0 - allocate(this%pv_co2 (num_elements)) - this%pv_co2 = c0 - allocate(this%o2sat (num_elements)) - this%o2sat = c0 - allocate(this%nhx_surface_emis(num_elements)) - this%nhx_surface_emis = c0 + allocate(this%piston_velocity(num_elements), source=c0) + allocate(this%flux_co2(num_elements), source=c0) + allocate(this%flux_alt_co2(num_elements), source=c0) + allocate(this%co2star(num_elements), source=c0) + allocate(this%dco2star(num_elements), source=c0) + allocate(this%pco2surf(num_elements), source=c0) + allocate(this%dpco2(num_elements), source=c0) + allocate(this%co3(num_elements), source=c0) + allocate(this%co2star_alt(num_elements), source=c0) + allocate(this%dco2star_alt(num_elements), source=c0) + allocate(this%pco2surf_alt(num_elements), source=c0) + allocate(this%dpco2_alt(num_elements), source=c0) + allocate(this%schmidt_co2(num_elements), source=c0) + allocate(this%schmidt_o2(num_elements), source=c0) + allocate(this%pv_o2(num_elements), source=c0) + allocate(this%pv_co2(num_elements), source=c0) + allocate(this%o2sat(num_elements), source=c0) + allocate(this%nhx_surface_emis(num_elements), source=c0) end subroutine marbl_surface_flux_internal_constructor @@ -1365,23 +1370,23 @@ subroutine marbl_surface_flux_internal_destructor(this) class(marbl_surface_flux_internal_type), intent(inout) :: this if (allocated(this%piston_velocity)) then - deallocate(this%piston_velocity ) - deallocate(this%flux_co2 ) - deallocate(this%flux_alt_co2 ) - deallocate(this%co2star ) - deallocate(this%dco2star ) - deallocate(this%pco2surf ) - deallocate(this%dpco2 ) - deallocate(this%co3 ) - deallocate(this%co2star_alt ) - deallocate(this%dco2star_alt ) - deallocate(this%pco2surf_alt ) - deallocate(this%dpco2_alt ) - deallocate(this%schmidt_co2 ) - deallocate(this%schmidt_o2 ) - deallocate(this%pv_o2 ) - deallocate(this%pv_co2 ) - deallocate(this%o2sat ) + deallocate(this%piston_velocity) + deallocate(this%flux_co2) + deallocate(this%flux_alt_co2) + deallocate(this%co2star) + deallocate(this%dco2star) + deallocate(this%pco2surf) + deallocate(this%dpco2) + deallocate(this%co3) + deallocate(this%co2star_alt) + deallocate(this%dco2star_alt) + deallocate(this%pco2surf_alt) + deallocate(this%dpco2_alt) + deallocate(this%schmidt_co2) + deallocate(this%schmidt_o2) + deallocate(this%pv_o2) + deallocate(this%pv_co2) + deallocate(this%o2sat) deallocate(this%nhx_surface_emis) end if @@ -1422,8 +1427,8 @@ end subroutine marbl_interior_tendency_share_destructor !***************************************************************************** - subroutine tracer_index_constructor(this, ciso_on, lvariable_PtoC, autotroph_settings, & - zooplankton_settings, marbl_status_log) + subroutine tracer_index_constructor(this, base_bio_on, abio_dic_on, ciso_on, lvariable_PtoC, & + autotroph_settings, zooplankton_settings, marbl_status_log) ! This subroutine sets the tracer indices for the non-autotroph tracers. To ! know where to start the indexing for the autotroph tracers, it increments @@ -1434,6 +1439,8 @@ subroutine tracer_index_constructor(this, ciso_on, lvariable_PtoC, autotroph_set use marbl_pft_mod, only : zooplankton_settings_type class(marbl_tracer_index_type), intent(out) :: this + logical, intent(in) :: base_bio_on + logical, intent(in) :: abio_dic_on logical, intent(in) :: ciso_on logical, intent(in) :: lvariable_PtoC type(autotroph_settings_type), intent(in) :: autotroph_settings(:) @@ -1451,57 +1458,60 @@ subroutine tracer_index_constructor(this, ciso_on, lvariable_PtoC, autotroph_set allocate(this%auto_inds(autotroph_cnt)) allocate(this%zoo_inds(zooplankton_cnt)) - ! General ecosys tracers - call this%add_tracer_index('po4', 'ecosys_base', this%po4_ind, marbl_status_log) - call this%add_tracer_index('no3', 'ecosys_base', this%no3_ind, marbl_status_log) - call this%add_tracer_index('sio3', 'ecosys_base', this%sio3_ind, marbl_status_log) - call this%add_tracer_index('nh4', 'ecosys_base', this%nh4_ind, marbl_status_log) - call this%add_tracer_index('fe', 'ecosys_base', this%fe_ind, marbl_status_log) - call this%add_tracer_index('lig', 'ecosys_base', this%lig_ind, marbl_status_log) - call this%add_tracer_index('o2', 'ecosys_base', this%o2_ind, marbl_status_log) - call this%add_tracer_index('dic', 'ecosys_base', this%dic_ind, marbl_status_log) - call this%add_tracer_index('dic_alt_co2', 'ecosys_base', this%dic_alt_co2_ind, marbl_status_log) - call this%add_tracer_index('alk', 'ecosys_base', this%alk_ind, marbl_status_log) - call this%add_tracer_index('alk_alt_co2', 'ecosys_base', this%alk_alt_co2_ind, marbl_status_log) - call this%add_tracer_index('doc', 'ecosys_base', this%doc_ind, marbl_status_log) - call this%add_tracer_index('don', 'ecosys_base', this%don_ind, marbl_status_log) - call this%add_tracer_index('dop', 'ecosys_base', this%dop_ind, marbl_status_log) - call this%add_tracer_index('dopr', 'ecosys_base', this%dopr_ind, marbl_status_log) - call this%add_tracer_index('donr', 'ecosys_base', this%donr_ind, marbl_status_log) - call this%add_tracer_index('docr', 'ecosys_base', this%docr_ind, marbl_status_log) - - do n=1,zooplankton_cnt - write(ind_name, "(2A)") trim(zooplankton_settings(n)%sname), "C" - call this%add_tracer_index(ind_name, 'ecosys_base', this%zoo_inds(n)%C_ind, marbl_status_log) - end do - - do n=1,autotroph_cnt - write(ind_name, "(2A)") trim(autotroph_settings(n)%sname), "Chl" - call this%add_tracer_index(ind_name, 'ecosys_base', this%auto_inds(n)%Chl_ind, marbl_status_log) - - write(ind_name, "(2A)") trim(autotroph_settings(n)%sname), "C" - call this%add_tracer_index(ind_name, 'ecosys_base', this%auto_inds(n)%C_ind, marbl_status_log) - - if (lvariable_PtoC) then - write(ind_name, "(2A)") trim(autotroph_settings(n)%sname), "P" - call this%add_tracer_index(ind_name, 'ecosys_base', this%auto_inds(n)%P_ind, marbl_status_log) - end if + ! Base biotic tracers + if (base_bio_on) then + call this%add_tracer_index('po4', 'base_bio', this%po4_ind, marbl_status_log) + call this%add_tracer_index('no3', 'base_bio', this%no3_ind, marbl_status_log) + call this%add_tracer_index('sio3', 'base_bio', this%sio3_ind, marbl_status_log) + call this%add_tracer_index('nh4', 'base_bio', this%nh4_ind, marbl_status_log) + call this%add_tracer_index('fe', 'base_bio', this%fe_ind, marbl_status_log) + call this%add_tracer_index('lig', 'base_bio', this%lig_ind, marbl_status_log) + call this%add_tracer_index('o2', 'base_bio', this%o2_ind, marbl_status_log) + call this%add_tracer_index('dic', 'base_bio', this%dic_ind, marbl_status_log) + call this%add_tracer_index('dic_alt_co2', 'base_bio', this%dic_alt_co2_ind, marbl_status_log) + call this%add_tracer_index('alk', 'base_bio', this%alk_ind, marbl_status_log) + call this%add_tracer_index('alk_alt_co2', 'base_bio', this%alk_alt_co2_ind, marbl_status_log) + call this%add_tracer_index('doc', 'base_bio', this%doc_ind, marbl_status_log) + call this%add_tracer_index('don', 'base_bio', this%don_ind, marbl_status_log) + call this%add_tracer_index('dop', 'base_bio', this%dop_ind, marbl_status_log) + call this%add_tracer_index('dopr', 'base_bio', this%dopr_ind, marbl_status_log) + call this%add_tracer_index('donr', 'base_bio', this%donr_ind, marbl_status_log) + call this%add_tracer_index('docr', 'base_bio', this%docr_ind, marbl_status_log) + + do n=1,zooplankton_cnt + write(ind_name, "(2A)") trim(zooplankton_settings(n)%sname), "C" + call this%add_tracer_index(ind_name, 'base_bio', this%zoo_inds(n)%C_ind, marbl_status_log) + end do - write(ind_name, "(2A)") trim(autotroph_settings(n)%sname), "Fe" - call this%add_tracer_index(ind_name, 'ecosys_base', this%auto_inds(n)%Fe_ind, marbl_status_log) + do n=1,autotroph_cnt + write(ind_name, "(2A)") trim(autotroph_settings(n)%sname), "Chl" + call this%add_tracer_index(ind_name, 'base_bio', this%auto_inds(n)%Chl_ind, marbl_status_log) - if (autotroph_settings(n)%silicifier) then - write(ind_name, "(2A)") trim(autotroph_settings(n)%sname), "Si" - call this%add_tracer_index(ind_name, 'ecosys_base', this%auto_inds(n)%Si_ind, marbl_status_log) - end if + write(ind_name, "(2A)") trim(autotroph_settings(n)%sname), "C" + call this%add_tracer_index(ind_name, 'base_bio', this%auto_inds(n)%C_ind, marbl_status_log) - if (autotroph_settings(n)%imp_calcifier.or. & - autotroph_settings(n)%exp_calcifier) then - write(ind_name, "(2A)") trim(autotroph_settings(n)%sname), "CaCO3" - call this%add_tracer_index(ind_name, 'ecosys_base', this%auto_inds(n)%CaCO3_ind, marbl_status_log) - end if - end do + if (lvariable_PtoC) then + write(ind_name, "(2A)") trim(autotroph_settings(n)%sname), "P" + call this%add_tracer_index(ind_name, 'base_bio', this%auto_inds(n)%P_ind, marbl_status_log) + end if + write(ind_name, "(2A)") trim(autotroph_settings(n)%sname), "Fe" + call this%add_tracer_index(ind_name, 'base_bio', this%auto_inds(n)%Fe_ind, marbl_status_log) + + if (autotroph_settings(n)%silicifier) then + write(ind_name, "(2A)") trim(autotroph_settings(n)%sname), "Si" + call this%add_tracer_index(ind_name, 'base_bio', this%auto_inds(n)%Si_ind, marbl_status_log) + end if + + if (autotroph_settings(n)%imp_calcifier.or. & + autotroph_settings(n)%exp_calcifier) then + write(ind_name, "(2A)") trim(autotroph_settings(n)%sname), "CaCO3" + call this%add_tracer_index(ind_name, 'base_bio', this%auto_inds(n)%CaCO3_ind, marbl_status_log) + end if + end do + end if + + ! Carbon isotope tracers if (ciso_on) then call this%add_tracer_index('di13c', 'ciso', this%di13c_ind, marbl_status_log) call this%add_tracer_index('do13ctot', 'ciso', this%do13ctot_ind, marbl_status_log) @@ -1528,6 +1538,12 @@ subroutine tracer_index_constructor(this, ciso_on, lvariable_PtoC, autotroph_set end do end if + ! Abiotic tracers + if (abio_dic_on) then + call this%add_tracer_index('abio_dic', 'abio_dic', this%abio_dic_ind, marbl_status_log) + call this%add_tracer_index('abio_di14c', 'abio_dic', this%abio_di14c_ind, marbl_status_log) + end if + if (marbl_status_log%labort_marbl) then call marbl_status_log%log_error_trace("add_tracer_index", subname) return @@ -1543,7 +1559,7 @@ subroutine tracer_index_destructor(this) ! Zero out counts this%total_cnt = 0 - call this%ecosys_base%reset() + call this%base_bio%reset() call this%ciso%reset() ! Deallocate memory @@ -1583,8 +1599,10 @@ subroutine add_tracer_index(this, ind_name, category, ind, marbl_status_log) ind = this%total_cnt+1 select case (trim(category)) - case ('ecosys_base') - call this%ecosys_base%update_count(ind, marbl_status_log) + case ('base_bio') + call this%base_bio%update_count(ind, marbl_status_log) + case ('abio_dic') + call this%abio_dic%update_count(ind, marbl_status_log) case ('ciso') call this%ciso%update_count(ind, marbl_status_log) case DEFAULT @@ -1640,13 +1658,15 @@ end subroutine update_count !***************************************************************************** - subroutine surface_flux_forcing_index_constructor(this, ciso_on, lflux_gas_o2, & - lflux_gas_co2, ladjust_bury_coeff, num_surface_flux_forcing_fields) + subroutine surface_flux_forcing_index_constructor(this, base_bio_on, abio_dic_on, ciso_on, & + lflux_gas_o2, lflux_gas_co2, ladjust_bury_coeff, num_surface_flux_forcing_fields) ! This subroutine sets the surface forcing indices, which are used to ! determine what forcing fields are required from the driver. class(marbl_surface_flux_forcing_indexing_type), intent(out) :: this + logical, intent(in) :: base_bio_on + logical, intent(in) :: abio_dic_on logical, intent(in) :: ciso_on logical, intent(in) :: lflux_gas_o2 logical, intent(in) :: lflux_gas_co2 @@ -1657,94 +1677,107 @@ subroutine surface_flux_forcing_index_constructor(this, ciso_on, lflux_gas_o2, forcing_cnt = 0 - ! ------------------------------- - ! | Always request these fields | - ! ------------------------------- + ! ----------------------------------------------------------------- + ! | Request these fields if abiotic or base biotic tracers are on | + ! ----------------------------------------------------------------- - ! Square of 10m wind - forcing_cnt = forcing_cnt + 1 - this%u10_sqr_id = forcing_cnt + if (base_bio_on .or. abio_dic_on) then + ! Square of 10m wind + forcing_cnt = forcing_cnt + 1 + this%u10_sqr_id = forcing_cnt - ! Sea-surface salinity - forcing_cnt = forcing_cnt + 1 - this%sss_id = forcing_cnt + ! Sea-surface salinity + forcing_cnt = forcing_cnt + 1 + this%sss_id = forcing_cnt - ! Sea-surface temp - forcing_cnt = forcing_cnt + 1 - this%sst_id = forcing_cnt + ! Sea-surface temp + forcing_cnt = forcing_cnt + 1 + this%sst_id = forcing_cnt - ! Ice Fraction - forcing_cnt = forcing_cnt + 1 - this%ifrac_id = forcing_cnt + ! Ice Fraction + forcing_cnt = forcing_cnt + 1 + this%ifrac_id = forcing_cnt - ! Dust Flux - forcing_cnt = forcing_cnt + 1 - this%dust_flux_id = forcing_cnt + ! ------------------------------------------ + ! | Request these if gas fluxes are needed | + ! ------------------------------------------ - ! Iron Flux - forcing_cnt = forcing_cnt + 1 - this%iron_flux_id = forcing_cnt + if (lflux_gas_o2 .or. lflux_gas_co2) then + ! atm pressure + forcing_cnt = forcing_cnt + 1 + this%atm_pressure_id = forcing_cnt + end if - ! NOx Flux - forcing_cnt = forcing_cnt + 1 - this%nox_flux_id = forcing_cnt + if (lflux_gas_co2) then + ! xco2 + forcing_cnt = forcing_cnt + 1 + this%xco2_id = forcing_cnt - ! NHy Flux - forcing_cnt = forcing_cnt + 1 - this%nhy_flux_id = forcing_cnt + ! xco2_alt_co2 + if (base_bio_on) then + forcing_cnt = forcing_cnt + 1 + this%xco2_alt_co2_id = forcing_cnt + end if + end if - ! --------------------------------------------------------- - ! | Request these if bury coefficients are being adjusted | - ! --------------------------------------------------------- + end if - if (ladjust_bury_coeff) then - ! external C Flux - forcing_cnt = forcing_cnt + 1 - this%ext_C_flux_id = forcing_cnt + ! ----------------------------------------------- + ! | Request these fields if base tracers are on | + ! ----------------------------------------------- - ! external P Flux + if (base_bio_on) then + ! Dust Flux forcing_cnt = forcing_cnt + 1 - this%ext_P_flux_id = forcing_cnt + this%dust_flux_id = forcing_cnt - ! external Si Flux + ! Iron Flux forcing_cnt = forcing_cnt + 1 - this%ext_Si_flux_id = forcing_cnt - end if + this%iron_flux_id = forcing_cnt - ! ------------------------------------------ - ! | Request these if gas fluxes are needed | - ! ------------------------------------------ - - if (lflux_gas_o2.or.lflux_gas_co2) then - ! atm pressure + ! NOx Flux forcing_cnt = forcing_cnt + 1 - this%atm_pressure_id = forcing_cnt - end if + this%nox_flux_id = forcing_cnt - if (lflux_gas_co2) then - ! xco2 + ! NHy Flux forcing_cnt = forcing_cnt + 1 - this%xco2_id = forcing_cnt + this%nhy_flux_id = forcing_cnt - ! xco2_alt_co2 - forcing_cnt = forcing_cnt + 1 - this%xco2_alt_co2_id = forcing_cnt - end if + ! --------------------------------------------------------- + ! | Request these if bury coefficients are being adjusted | + ! --------------------------------------------------------- - ! ----------------------------------- - ! | Request these fields if ciso_on | - ! ----------------------------------- + if (ladjust_bury_coeff) then + ! external C Flux + forcing_cnt = forcing_cnt + 1 + this%ext_C_flux_id = forcing_cnt - if (ciso_on) then + ! external P Flux + forcing_cnt = forcing_cnt + 1 + this%ext_P_flux_id = forcing_cnt - ! d13c - forcing_cnt = forcing_cnt + 1 - this%d13c_id = forcing_cnt + ! external Si Flux + forcing_cnt = forcing_cnt + 1 + this%ext_Si_flux_id = forcing_cnt + end if + + ! ----------------------------------- + ! | Request these fields if ciso_on | + ! ----------------------------------- + + if (ciso_on) then + + ! d13c + forcing_cnt = forcing_cnt + 1 + this%d13c_id = forcing_cnt + + end if + end if - ! d14c + if (abio_dic_on .or. ciso_on) then + ! d14c forcing_cnt = forcing_cnt + 1 this%d14c_id = forcing_cnt - end if end associate @@ -1754,6 +1787,7 @@ end subroutine surface_flux_forcing_index_constructor !***************************************************************************** subroutine interior_tendency_forcing_index_constructor(this, & + base_bio_on, & tracer_names, & tracer_restore_vars, & num_PAR_subcols, & @@ -1767,6 +1801,7 @@ subroutine interior_tendency_forcing_index_constructor(this, use marbl_settings_mod, only : lp_remin_scalef class(marbl_interior_tendency_forcing_indexing_type), intent(out) :: this + logical, intent(in) :: base_bio_on character(len=char_len), dimension(:), intent(in) :: tracer_names character(len=char_len), dimension(:), intent(in) :: tracer_restore_vars integer(int_kind), intent(in) :: num_PAR_subcols @@ -1785,47 +1820,49 @@ subroutine interior_tendency_forcing_index_constructor(this, forcing_cnt = 0 - ! Dust Flux - forcing_cnt = forcing_cnt + 1 - this%dustflux_id = forcing_cnt - - ! PAR column fraction (not needed if num_PAR_subcols = 1) - if (num_PAR_subcols .gt. 1) then + if (base_bio_on) then + ! Dust Flux forcing_cnt = forcing_cnt + 1 - this%PAR_col_frac_id = forcing_cnt - end if - - ! PAR column shortwave - forcing_cnt = forcing_cnt + 1 - this%surf_shortwave_id = forcing_cnt + this%dustflux_id = forcing_cnt - ! Potential Temperature - forcing_cnt = forcing_cnt + 1 - this%potemp_id = forcing_cnt + ! PAR column fraction (not needed if num_PAR_subcols = 1) + if (num_PAR_subcols .gt. 1) then + forcing_cnt = forcing_cnt + 1 + this%PAR_col_frac_id = forcing_cnt + end if - ! Salinity - forcing_cnt = forcing_cnt + 1 - this%salinity_id = forcing_cnt + ! PAR column shortwave + forcing_cnt = forcing_cnt + 1 + this%surf_shortwave_id = forcing_cnt - ! Pressure - forcing_cnt = forcing_cnt + 1 - this%pressure_id = forcing_cnt + ! Potential Temperature + forcing_cnt = forcing_cnt + 1 + this%potemp_id = forcing_cnt - ! Iron Sediment Flux - forcing_cnt = forcing_cnt + 1 - this%fesedflux_id = forcing_cnt + ! Salinity + forcing_cnt = forcing_cnt + 1 + this%salinity_id = forcing_cnt - ! O2 Consumption Scale Factor - if (lo2_consumption_scalef) then + ! Pressure forcing_cnt = forcing_cnt + 1 - this%o2_consumption_scalef_id = forcing_cnt - endif + this%pressure_id = forcing_cnt - ! Particulate Remin Scale Factor - if (lp_remin_scalef) then + ! Iron Sediment Flux forcing_cnt = forcing_cnt + 1 - this%p_remin_scalef_id = forcing_cnt - endif + this%fesedflux_id = forcing_cnt + + ! O2 Consumption Scale Factor + if (lo2_consumption_scalef) then + forcing_cnt = forcing_cnt + 1 + this%o2_consumption_scalef_id = forcing_cnt + end if + + ! Particulate Remin Scale Factor + if (lp_remin_scalef) then + forcing_cnt = forcing_cnt + 1 + this%p_remin_scalef_id = forcing_cnt + end if + end if ! Tracer restoring ! Note that this section @@ -1891,121 +1928,124 @@ end subroutine interior_tendency_forcing_index_constructor !***************************************************************************** - function interior_diag_ind_constructed(this) result(constructed) + function interior_diag_ind_allocated(this) result(constructed) class(marbl_interior_tendency_diagnostics_indexing_type), intent(inout) :: this logical(log_kind) :: constructed constructed = allocated(this%restore_tend) - end function interior_diag_ind_constructed + end function interior_diag_ind_allocated !***************************************************************************** subroutine interior_diag_ind_destructor(this) + use marbl_settings_mod, only : base_bio_on use marbl_settings_mod, only : ciso_on class(marbl_interior_tendency_diagnostics_indexing_type), intent(inout) :: this - if (this%lconstructed()) then - deallocate(this%N_lim_surf) - deallocate(this%N_lim_Cweight_avg_100m) - deallocate(this%P_lim_surf) - deallocate(this%P_lim_Cweight_avg_100m) - deallocate(this%Fe_lim_surf) - deallocate(this%Fe_lim_Cweight_avg_100m) - deallocate(this%SiO3_lim_surf) - deallocate(this%SiO3_lim_Cweight_avg_100m) - deallocate(this%C_lim_surf) - deallocate(this%C_lim_Cweight_avg_100m) - deallocate(this%light_lim_surf) - deallocate(this%light_lim_Cweight_avg_100m) - deallocate(this%photoC_zint) - deallocate(this%photoC_zint_100m) - deallocate(this%photoC_NO3_zint) - deallocate(this%CaCO3_form_zint) - deallocate(this%CaCO3_form_zint_100m) - deallocate(this%auto_graze_zint) - deallocate(this%auto_graze_zint_100m) - deallocate(this%auto_graze_poc_zint) - deallocate(this%auto_graze_poc_zint_100m) - deallocate(this%auto_graze_doc_zint) - deallocate(this%auto_graze_doc_zint_100m) - deallocate(this%auto_graze_zoo_zint) - deallocate(this%auto_graze_zoo_zint_100m) - deallocate(this%auto_loss_zint) - deallocate(this%auto_loss_zint_100m) - deallocate(this%auto_loss_poc_zint) - deallocate(this%auto_loss_poc_zint_100m) - deallocate(this%auto_loss_doc_zint) - deallocate(this%auto_loss_doc_zint_100m) - deallocate(this%auto_agg_zint) - deallocate(this%auto_agg_zint_100m) - deallocate(this%zoo_loss_zint) - deallocate(this%zoo_loss_zint_100m) - deallocate(this%zoo_loss_zint_150m) - deallocate(this%zoo_loss_basal_zint) - deallocate(this%zoo_loss_basal_zint_100m) - deallocate(this%zoo_loss_poc_zint) - deallocate(this%zoo_loss_poc_zint_100m) - deallocate(this%zoo_loss_doc_zint) - deallocate(this%zoo_loss_doc_zint_100m) - deallocate(this%zoo_graze_zint) - deallocate(this%zoo_graze_zint_100m) - deallocate(this%zoo_graze_poc_zint) - deallocate(this%zoo_graze_poc_zint_100m) - deallocate(this%zoo_graze_doc_zint) - deallocate(this%zoo_graze_doc_zint_100m) - deallocate(this%zoo_graze_zoo_zint) - deallocate(this%zoo_graze_zoo_zint_100m) - deallocate(this%x_graze_zoo_zint) - deallocate(this%x_graze_zoo_zint_100m) - deallocate(this%Qp) - deallocate(this%photoC) - deallocate(this%photoC_NO3) - deallocate(this%photoFe) - deallocate(this%photoNO3) - deallocate(this%photoNH4) - deallocate(this%DOP_uptake) - deallocate(this%PO4_uptake) - deallocate(this%auto_graze) - deallocate(this%auto_graze_poc) - deallocate(this%auto_graze_doc) - deallocate(this%auto_graze_zootot) - deallocate(this%auto_graze_zoo) - deallocate(this%auto_loss) - deallocate(this%auto_loss_poc) - deallocate(this%auto_loss_doc) - deallocate(this%auto_agg) - deallocate(this%bSi_form) - deallocate(this%CaCO3_form) - deallocate(this%Nfix) - deallocate(this%zoo_loss) - deallocate(this%zoo_loss_basal) - deallocate(this%zoo_loss_poc) - deallocate(this%zoo_loss_doc) - deallocate(this%zoo_graze) - deallocate(this%zoo_graze_poc) - deallocate(this%zoo_graze_doc) - deallocate(this%zoo_graze_zootot) - deallocate(this%zoo_graze_zoo) - deallocate(this%x_graze_zoo) - if (ciso_on) then - deallocate(this%CISO_eps_autotroph) - deallocate(this%CISO_mui_to_co2star) - deallocate(this%CISO_Ca13CO3_form) - deallocate(this%CISO_Ca14CO3_form) - deallocate(this%CISO_Ca13CO3_form_zint) - deallocate(this%CISO_Ca14CO3_form_zint) - deallocate(this%CISO_photo13C) - deallocate(this%CISO_photo14C) - deallocate(this%CISO_photo13C_zint) - deallocate(this%CISO_photo14C_zint) - deallocate(this%CISO_d13C) - deallocate(this%CISO_d14C) - deallocate(this%CISO_autotrophCaCO3_d14C) - deallocate(this%CISO_autotrophCaCO3_d13C) + if (this%lallocated()) then + if (base_bio_on) then + deallocate(this%N_lim_surf) + deallocate(this%N_lim_Cweight_avg_100m) + deallocate(this%P_lim_surf) + deallocate(this%P_lim_Cweight_avg_100m) + deallocate(this%Fe_lim_surf) + deallocate(this%Fe_lim_Cweight_avg_100m) + deallocate(this%SiO3_lim_surf) + deallocate(this%SiO3_lim_Cweight_avg_100m) + deallocate(this%C_lim_surf) + deallocate(this%C_lim_Cweight_avg_100m) + deallocate(this%light_lim_surf) + deallocate(this%light_lim_Cweight_avg_100m) + deallocate(this%photoC_zint) + deallocate(this%photoC_zint_100m) + deallocate(this%photoC_NO3_zint) + deallocate(this%CaCO3_form_zint) + deallocate(this%CaCO3_form_zint_100m) + deallocate(this%auto_graze_zint) + deallocate(this%auto_graze_zint_100m) + deallocate(this%auto_graze_poc_zint) + deallocate(this%auto_graze_poc_zint_100m) + deallocate(this%auto_graze_doc_zint) + deallocate(this%auto_graze_doc_zint_100m) + deallocate(this%auto_graze_zoo_zint) + deallocate(this%auto_graze_zoo_zint_100m) + deallocate(this%auto_loss_zint) + deallocate(this%auto_loss_zint_100m) + deallocate(this%auto_loss_poc_zint) + deallocate(this%auto_loss_poc_zint_100m) + deallocate(this%auto_loss_doc_zint) + deallocate(this%auto_loss_doc_zint_100m) + deallocate(this%auto_agg_zint) + deallocate(this%auto_agg_zint_100m) + deallocate(this%zoo_loss_zint) + deallocate(this%zoo_loss_zint_100m) + deallocate(this%zoo_loss_zint_150m) + deallocate(this%zoo_loss_basal_zint) + deallocate(this%zoo_loss_basal_zint_100m) + deallocate(this%zoo_loss_poc_zint) + deallocate(this%zoo_loss_poc_zint_100m) + deallocate(this%zoo_loss_doc_zint) + deallocate(this%zoo_loss_doc_zint_100m) + deallocate(this%zoo_graze_zint) + deallocate(this%zoo_graze_zint_100m) + deallocate(this%zoo_graze_poc_zint) + deallocate(this%zoo_graze_poc_zint_100m) + deallocate(this%zoo_graze_doc_zint) + deallocate(this%zoo_graze_doc_zint_100m) + deallocate(this%zoo_graze_zoo_zint) + deallocate(this%zoo_graze_zoo_zint_100m) + deallocate(this%x_graze_zoo_zint) + deallocate(this%x_graze_zoo_zint_100m) + deallocate(this%Qp) + deallocate(this%photoC) + deallocate(this%photoC_NO3) + deallocate(this%photoFe) + deallocate(this%photoNO3) + deallocate(this%photoNH4) + deallocate(this%DOP_uptake) + deallocate(this%PO4_uptake) + deallocate(this%auto_graze) + deallocate(this%auto_graze_poc) + deallocate(this%auto_graze_doc) + deallocate(this%auto_graze_zootot) + deallocate(this%auto_graze_zoo) + deallocate(this%auto_loss) + deallocate(this%auto_loss_poc) + deallocate(this%auto_loss_doc) + deallocate(this%auto_agg) + deallocate(this%bSi_form) + deallocate(this%CaCO3_form) + deallocate(this%Nfix) + deallocate(this%zoo_loss) + deallocate(this%zoo_loss_basal) + deallocate(this%zoo_loss_poc) + deallocate(this%zoo_loss_doc) + deallocate(this%zoo_graze) + deallocate(this%zoo_graze_poc) + deallocate(this%zoo_graze_doc) + deallocate(this%zoo_graze_zootot) + deallocate(this%zoo_graze_zoo) + deallocate(this%x_graze_zoo) + if (ciso_on) then + deallocate(this%CISO_eps_autotroph) + deallocate(this%CISO_mui_to_co2star) + deallocate(this%CISO_Ca13CO3_form) + deallocate(this%CISO_Ca14CO3_form) + deallocate(this%CISO_Ca13CO3_form_zint) + deallocate(this%CISO_Ca14CO3_form_zint) + deallocate(this%CISO_photo13C) + deallocate(this%CISO_photo14C) + deallocate(this%CISO_photo13C_zint) + deallocate(this%CISO_photo14C_zint) + deallocate(this%CISO_d13C) + deallocate(this%CISO_d14C) + deallocate(this%CISO_autotrophCaCO3_d14C) + deallocate(this%CISO_autotrophCaCO3_d13C) + end if end if deallocate(this%restore_tend) end if diff --git a/src/marbl_interior_tendency_mod.F90 b/src/marbl_interior_tendency_mod.F90 index 7f7aeec5..8f2f5be2 100644 --- a/src/marbl_interior_tendency_mod.F90 +++ b/src/marbl_interior_tendency_mod.F90 @@ -40,6 +40,7 @@ module marbl_interior_tendency_mod use marbl_logging, only : marbl_log_type + use marbl_settings_mod, only : base_bio_on use marbl_settings_mod, only : autotroph_cnt use marbl_settings_mod, only : zooplankton_cnt use marbl_settings_mod, only : max_grazer_prey_cnt @@ -126,6 +127,7 @@ subroutine marbl_interior_tendency_compute( & ! Compute time derivatives for ecosystem state variables use marbl_temperature, only : marbl_temperature_potemp + use marbl_abio_dic_interior_tendency_mod, only : marbl_abio_dic_interior_tendency_compute use marbl_ciso_interior_tendency_mod, only : marbl_ciso_interior_tendency_compute use marbl_diagnostics_mod , only : marbl_diagnostics_interior_tendency_compute use marbl_interface_private_types, only : marbl_internal_timers_type @@ -202,7 +204,6 @@ subroutine marbl_interior_tendency_compute( & real (r8) :: Lig_photochem(domain%km) ! loss of Fe-binding Ligand from UV radiation real (r8) :: Lig_deg(domain%km) ! loss of Fe-binding Ligand from bacterial degradation real (r8) :: Lig_loss(domain%km) ! loss of Fe-binding Ligand - real (r8) :: totalChl_local(domain%km) ! local value of totalChl ! NOTE(bja, 2015-07) vectorization: arrays that are (n, k, c, i) ! probably can not be vectorized reasonably over c without memory @@ -210,12 +211,11 @@ subroutine marbl_interior_tendency_compute( & ! can probably be vectorized over k and / or c! !----------------------------------------------------------------------- - ! NOTE(bja, 2015-07) interior_tendencies=0 must come before the "not - ! lsource_sink check to ensure correct answer when not doing - ! computations. - interior_tendencies(:, :) = c0 + ! Return with interior_tendencies = 0 if not performing computations + if (.not. lsource_sink) return + if (abs(c1 - sum(domain%delta_z(:) * bot_flux_to_tend(:))) > bftt_dz_sum_thres) then write(log_message, "(A, E11.3, A)") "1 - sum(bot_flux_to_tend * dz) = ", & c1 - sum(domain%delta_z(:) * bot_flux_to_tend(:)), & @@ -229,12 +229,44 @@ subroutine marbl_interior_tendency_compute( & return end if - if (.not. lsource_sink) then - !----------------------------------------------------------------------- - ! exit immediately if computations are not to be performed - !----------------------------------------------------------------------- + !----------------------------------------------------------------------- + ! create local copies of model tracers + !----------------------------------------------------------------------- + + call setup_local_tracers(domain%kmt, marbl_tracer_indices, tracers(:,:), autotroph_local, & + tracer_local(:,:), zooplankton_local) + + !----------------------------------------------------------------------- + ! Set all interior diagnostics to zero + ! This is useful to prevent deep values persisting + ! when computing diagnostics in shallow columns + !----------------------------------------------------------------------- + + call interior_tendency_diags%set_to_zero(marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_status_log%log_error_trace(& + 'interior_tendency_diags%set_to_zero', subname) + return + end if + + !----------------------------------------------------------------------- + ! Compute tendencies for abiotic tracers + !----------------------------------------------------------------------- + + call marbl_abio_dic_interior_tendency_compute(& + marbl_tracer_indices = marbl_tracer_indices, & + tracer_local = tracer_local, & + interior_tendency_diags = interior_tendency_diags, & + interior_tendencies = interior_tendencies) + + if (marbl_status_log%labort_marbl) then + call marbl_status_log%log_error_trace(& + 'marbl_abio_dic_interior_tendency_compute()', subname) return - endif + end if + + ! Return if not using base biotic tracers or not performing computations + if (.not. base_bio_on) return ! Verify forcing is consistent if (lcheck_forcing) & @@ -319,13 +351,6 @@ subroutine marbl_interior_tendency_compute( & interior_tendency_forcing_indices, & interior_restore) - !----------------------------------------------------------------------- - ! create local copies of model tracers - !----------------------------------------------------------------------- - - call setup_local_tracers(kmt, marbl_tracer_indices, tracers(:,:), autotroph_local, & - tracer_local(:,:), zooplankton_local, totalChl_local) - call set_surface_particulate_terms(surface_flux_forcing_indices, unit_system, POC, POP, & P_CaCO3, P_CaCO3_ALT_CO2, P_SiO2, dust, P_iron, QA_dust_def(:), dust_flux_in) @@ -345,7 +370,7 @@ subroutine marbl_interior_tendency_compute( & end if call compute_PAR(domain, interior_tendency_forcings, interior_tendency_forcing_indices, & - totalChl_local, unit_system, PAR) + autotroph_local, unit_system, PAR) call compute_autotroph_elemental_ratios(km, autotroph_local, marbl_tracer_indices, tracer_local, & autotroph_derived_terms) @@ -520,7 +545,7 @@ end subroutine marbl_interior_tendency_compute !*********************************************************************** subroutine compute_PAR(domain, interior_tendency_forcings, interior_tendency_forcing_ind, & - totalChl_local, unit_system, PAR) + autotroph_local, unit_system, PAR) !----------------------------------------------------------------------- ! compute PAR related quantities @@ -532,12 +557,12 @@ subroutine compute_PAR(domain, interior_tendency_forcings, interior_tendency_for ! PAR is intent(inout) because it components, while entirely set here, are allocated elsewhere - type(marbl_domain_type) , intent(in) :: domain - type(marbl_forcing_fields_type) , intent(in) :: interior_tendency_forcings(:) - type(marbl_interior_tendency_forcing_indexing_type), intent(in) :: interior_tendency_forcing_ind - real(r8) , intent(in) :: totalChl_local(:) - type(unit_system_type) , intent(in) :: unit_system - type(marbl_PAR_type) , intent(inout) :: PAR + type(marbl_domain_type), intent(in) :: domain + type(marbl_forcing_fields_type), intent(in) :: interior_tendency_forcings(:) + type(marbl_interior_tendency_forcing_indexing_type), intent(in) :: interior_tendency_forcing_ind + type(autotroph_local_type), intent(in) :: autotroph_local + type(unit_system_type), intent(in) :: unit_system + type(marbl_PAR_type), intent(inout) :: PAR !----------------------------------------------------------------------- ! local variables @@ -548,6 +573,7 @@ subroutine compute_PAR(domain, interior_tendency_forcings, interior_tendency_for real (r8), parameter :: PAR_threshold = 1.0e-19_r8 real (r8) :: WORK1(domain%kmt) + real (r8) :: totalChl_local(domain%kmt) integer(int_kind) :: k, subcol_ind !----------------------------------------------------------------------- @@ -598,7 +624,8 @@ subroutine compute_PAR(domain, interior_tendency_forcings, interior_tendency_for ! compute attenuation coefficient over column !----------------------------------------------------------------------- - WORK1(:) = max(totalChl_local(1:column_kmt), 0.02_r8) + totalChl_local(:) = sum(autotroph_local%Chl(:,1:column_kmt), dim=1) + WORK1(:) = max(totalChl_local(:), 0.02_r8) do k = 1, column_kmt if (WORK1(k) < 0.13224_r8) then PAR%KPARdz(k) = (0.0919_r8*unit_system%len2m)*(WORK1(k)**0.3536_r8) @@ -726,7 +753,7 @@ end subroutine marbl_interior_tendency_adjust_bury_coeff !*********************************************************************** subroutine setup_local_tracers(column_kmt, marbl_tracer_indices, tracers, & - autotroph_local, tracer_local, zooplankton_local, totalChl_local) + autotroph_local, tracer_local, zooplankton_local) !----------------------------------------------------------------------- ! create local copies of model tracers @@ -739,7 +766,6 @@ subroutine setup_local_tracers(column_kmt, marbl_tracer_indices, tracers, & type(autotroph_local_type) , intent(inout) :: autotroph_local real (r8) , intent(out) :: tracer_local(:,:) type(zooplankton_local_type) , intent(inout) :: zooplankton_local - real (r8) , intent(out) :: totalChl_local(:) !----------------------------------------------------------------------- ! local variables @@ -820,9 +846,6 @@ subroutine setup_local_tracers(column_kmt, marbl_tracer_indices, tracers, & ! autotroph consistency check call autotroph_zero_consistency_enforce(column_kmt, marbl_tracer_indices, autotroph_local) - ! set totalChl_local - totalChl_local = sum(autotroph_local%Chl(:,:), dim=1) - end subroutine setup_local_tracers !*********************************************************************** diff --git a/src/marbl_saved_state_mod.F90 b/src/marbl_saved_state_mod.F90 index 222c591f..a3f851f8 100644 --- a/src/marbl_saved_state_mod.F90 +++ b/src/marbl_saved_state_mod.F90 @@ -35,25 +35,37 @@ subroutine marbl_saved_state_init(surface_state, interior_state, surf_ind, & call surface_state%construct(num_elements_surface_flux, num_levels) - lname = 'surface pH' + lname = 'surface pH for base biotic tracers' sname = 'PH_SURF' units = 'pH' vgrid = 'none' rank = 2 call surface_state%add_state(lname, sname, units, vgrid, rank, & - surf_ind%ph_surf, marbl_status_log) + surf_ind%base_bio_ph_surf, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_status_log%log_error_trace("add_state(PH_SURF)", subname) return end if - lname = 'surface pH (alternate CO2)' + lname = 'surface pH for abiotic tracers' + sname = 'ABIO_PH_SURF' + units = 'pH' + vgrid = 'none' + rank = 2 + call surface_state%add_state(lname, sname, units, vgrid, rank, & + surf_ind%abio_dic_ph_surf, marbl_status_log) + if (marbl_status_log%labort_marbl) then + call marbl_status_log%log_error_trace("add_state(ABIO_PH_SURF)", subname) + return + end if + + lname = 'surface pH for base biotic tracers (alternate CO2)' sname = 'PH_SURF_ALT_CO2' units = 'pH' vgrid = 'none' rank = 2 call surface_state%add_state(lname, sname, units, vgrid, rank, & - surf_ind%ph_alt_co2_surf, marbl_status_log) + surf_ind%base_bio_ph_alt_co2_surf, marbl_status_log) if (marbl_status_log%labort_marbl) then call marbl_status_log%log_error_trace("add_state(PH_SURF_ALT_CO2)", subname) return diff --git a/src/marbl_settings_mod.F90 b/src/marbl_settings_mod.F90 index 7d3815d3..33df5aaa 100644 --- a/src/marbl_settings_mod.F90 +++ b/src/marbl_settings_mod.F90 @@ -237,13 +237,15 @@ module marbl_settings_mod character(len=char_len), target :: PFT_defaults ! Set up PFT parameters based on known classes, e.g. 'CESM2' ! (or set to 'user-specified' and use put_setting()) + logical(log_kind), target :: base_bio_on ! control whether base tracer module is active + logical(log_kind), target :: abio_dic_on ! control whether abio tracer module is active logical(log_kind), target :: ciso_on ! control whether ciso tracer module is active logical(log_kind), target :: lsource_sink ! control which portion of code is executed, useful for debugging logical(log_kind), target :: ciso_lsource_sink ! control which portion of carbon isotope code is executed, useful for debugging logical(log_kind), target :: lcheck_forcing ! control whether consistency checks are performed on forcing input logical(log_kind), target :: lecovars_full_depth_tavg ! If .false., MARBL will recommend truncating the column for some diagnostics - logical(log_kind), target :: lflux_gas_o2 ! controls which portion of code are executed usefull for debugging - logical(log_kind), target :: lflux_gas_co2 ! controls which portion of code are executed usefull for debugging + logical(log_kind), target :: lflux_gas_o2 ! controls which portion of code are executed useful for debugging + logical(log_kind), target :: lflux_gas_co2 ! controls which portion of code are executed useful for debugging logical(log_kind), target :: lcompute_nhx_surface_emis ! control if NHx emissions are computed logical(log_kind), target :: lvariable_PtoC ! control if PtoC ratios in autotroph_settings vary logical(log_kind), target :: ladjust_bury_coeff ! control if bury coefficients are adjusted (rather than constant) @@ -254,6 +256,7 @@ module marbl_settings_mod ! (this is done primarily in spinup runs) logical(log_kind), target :: lo2_consumption_scalef ! Apply o2_consumption_scalef to o2 consumption (and request it as a forcing) logical(log_kind), target :: lp_remin_scalef ! Apply p_remin_scalef to particulate remin (and request it as a forcing) + logical(log_kind), target :: labio_derivative_diags ! Compute derivative diagnostic terms in abiotic surface flux module character(len=char_len), target :: init_bury_coeff_opt @@ -397,17 +400,26 @@ module marbl_settings_mod !***************************************************************************** +subroutine marbl_settings_set_defaults_tracer_modules() + + base_bio_on = .true. ! CESM USERS - DO NOT CHANGE HERE! POP calls put_setting() for this var, see CESM NOTE above + abio_dic_on = .false. ! CESM USERS - DO NOT CHANGE HERE! POP calls put_setting() for this var, see CESM NOTE above + ciso_on = .false. ! CESM USERS - DO NOT CHANGE HERE! POP calls put_setting() for this var, see CESM NOTE above + +end subroutine marbl_settings_set_defaults_tracer_modules + +!***************************************************************************** + subroutine marbl_settings_set_defaults_general_parms(unit_system) type(unit_system_type), intent(in) :: unit_system PFT_defaults = 'CESM2' ! CESM USERS - DO NOT CHANGE HERE! POP calls put_setting() for this var, see CESM NOTE above - ciso_on = .false. ! CESM USERS - DO NOT CHANGE HERE! POP calls put_setting() for this var, see CESM NOTE above lsource_sink = .true. ! CESM USERS - DO NOT CHANGE HERE! POP calls put_setting() for this var, see CESM NOTE above ciso_lsource_sink = .true. ! CESM USERS - DO NOT CHANGE HERE! POP calls put_setting() for this var, see CESM NOTE above lcheck_forcing = .false. ! CESM USERS - DO NOT CHANGE HERE! POP calls put_setting() for this var, see CESM NOTE above lecovars_full_depth_tavg = .false. ! CESM USERS - DO NOT CHANGE HERE! POP calls put_setting() for this var, see CESM NOTE above - lflux_gas_o2 = .true. ! CESM USERS - DO NOT CHANGE HERE! POP calls put_setting() for this var, see CESM NOTE above + lflux_gas_o2 = base_bio_on ! CESM USERS - DO NOT CHANGE HERE! POP calls put_setting() for this var, see CESM NOTE above lflux_gas_co2 = .true. ! CESM USERS - DO NOT CHANGE HERE! POP calls put_setting() for this var, see CESM NOTE above lcompute_nhx_surface_emis = .true. ! CESM USERS - DO NOT CHANGE HERE! POP calls put_setting() for this var, see CESM NOTE above lvariable_PtoC = .true. ! CESM USERS - DO NOT CHANGE HERE! POP calls put_setting() for this var, see CESM NOTE above @@ -415,6 +427,7 @@ subroutine marbl_settings_set_defaults_general_parms(unit_system) ladjust_bury_coeff = .false. ! CESM USERS - DO NOT CHANGE HERE! POP calls put_setting() for this var, see CESM NOTE above lo2_consumption_scalef = .false. ! CESM USERS - DO NOT CHANGE HERE! POP calls put_setting() for this var, see CESM NOTE above lp_remin_scalef = .false. ! CESM USERS - DO NOT CHANGE HERE! POP calls put_setting() for this var, see CESM NOTE above + labio_derivative_diags = .false. ! CESM USERS - DO NOT CHANGE HERE! POP calls put_setting() for this var, see CESM NOTE above particulate_flux_ref_depth = 100._r8 ! CESM USERS - DO NOT CHANGE HERE! POP calls put_setting() for this var, see CESM NOTE above bftt_dz_sum_thres = 1.0e-14_r8 ! CESM USERS - DO NOT CHANGE HERE! POP calls put_setting() for this var, see CESM NOTE above Jint_Ctot_thres_molpm2pyr = 1.0e-9_r8 ! CESM USERS - DO NOT CHANGE HERE! POP calls put_setting() for this var, see CESM NOTE above @@ -494,20 +507,27 @@ subroutine marbl_settings_set_defaults_PFT_counts(marbl_status_log) PFT_defaults = 'user-specified' end if - select case (trim(PFT_defaults)) - case ('CESM2') - autotroph_cnt = 3 - zooplankton_cnt = 1 - max_grazer_prey_cnt = 3 - case ('user-specified') - ! User must change these with put_setting() - autotroph_cnt = -1 ! CESM USERS - DO NOT CHANGE HERE! POP calls put_setting() for this var, see CESM NOTE above - zooplankton_cnt = -1 ! CESM USERS - DO NOT CHANGE HERE! POP calls put_setting() for this var, see CESM NOTE above - max_grazer_prey_cnt = -1 ! CESM USERS - DO NOT CHANGE HERE! POP calls put_setting() for this var, see CESM NOTE above - case DEFAULT - write(log_message, "(3A)") "'", trim(PFT_defaults), "' is not a valid value for PFT_defaults" - call marbl_status_log%log_error(log_message, subname) - end select + if (.not. base_bio_on) then + PFT_defaults = 'None' + autotroph_cnt = 0 + zooplankton_cnt = 0 + max_grazer_prey_cnt = 0 + else + select case (trim(PFT_defaults)) + case ('CESM2') + autotroph_cnt = 3 + zooplankton_cnt = 1 + max_grazer_prey_cnt = 3 + case ('user-specified') + ! User must change these with put_setting() + autotroph_cnt = -1 ! CESM USERS - DO NOT CHANGE HERE! POP calls put_setting() for this var, see CESM NOTE above + zooplankton_cnt = -1 ! CESM USERS - DO NOT CHANGE HERE! POP calls put_setting() for this var, see CESM NOTE above + max_grazer_prey_cnt = -1 ! CESM USERS - DO NOT CHANGE HERE! POP calls put_setting() for this var, see CESM NOTE above + case DEFAULT + write(log_message, "(3A)") "'", trim(PFT_defaults), "' is not a valid value for PFT_defaults" + call marbl_status_log%log_error(log_message, subname) + end select + end if end subroutine marbl_settings_set_defaults_PFT_counts @@ -538,6 +558,7 @@ subroutine marbl_settings_set_defaults_PFT_derived_types(marbl_status_log) call grazing_relationship_settings(1,1)%set_to_default('sp_zoo', marbl_status_log) call grazing_relationship_settings(2,1)%set_to_default('diat_zoo', marbl_status_log) call grazing_relationship_settings(3,1)%set_to_default('diaz_zoo', marbl_status_log) + case ('None') case ('user-specified') do m=1,autotroph_cnt call autotroph_settings(m)%set_to_default('unset', marbl_status_log) @@ -582,7 +603,7 @@ end subroutine marbl_settings_set_defaults_tracer_dependent !***************************************************************************** - subroutine marbl_settings_define_general_parms(this, marbl_status_log) + subroutine marbl_settings_define_tracer_modules(this, marbl_status_log) class(marbl_settings_type), intent(inout) :: this type(marbl_log_type), intent(inout) :: marbl_status_log @@ -591,9 +612,7 @@ subroutine marbl_settings_define_general_parms(this, marbl_status_log) character(len=char_len) :: log_message character(len=char_len) :: sname, lname, units, datatype, category - real(r8), pointer :: rptr => NULL() logical(log_kind), pointer :: lptr => NULL() - character(len=char_len), pointer :: sptr => NULL() logical :: labort_marbl_loc if (associated(this%vars)) then @@ -604,73 +623,89 @@ subroutine marbl_settings_define_general_parms(this, marbl_status_log) allocate(this%categories(0)) labort_marbl_loc = .false. - ! ---------------------- - category = 'config PFTs' - ! ---------------------- - - sname = 'PFT_defaults' - lname = 'Define how PFTs are initialized' - units = 'unitless' - datatype = 'string' - sptr => PFT_defaults - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, sptr=sptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - ! ----------------------- - category = 'config flags' + category = 'tracer modules' ! ----------------------- - sname = 'ciso_on' - lname = 'Control whether CISO tracer module is active' + sname = 'base_bio_on' + lname = 'Control whether base tracer module is active' units = 'unitless' datatype = 'logical' - lptr => ciso_on + lptr => base_bio_on call this%add_var(sname, lname, units, datatype, category, & marbl_status_log, lptr=lptr) call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'lsource_sink' - lname = 'Control which portions of code are executed (useful for debugging)' + sname = 'abio_dic_on' + lname = 'Control whether abiotic tracer module is active' units = 'unitless' datatype = 'logical' - lptr => lsource_sink + lptr => abio_dic_on call this%add_var(sname, lname, units, datatype, category, & marbl_status_log, lptr=lptr) call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'lecovars_full_depth_tavg' - lname = 'If .false., MARBL will recommend truncating the column for some diagnostics' + sname = 'ciso_on' + lname = 'Control whether CISO tracer module is active' units = 'unitless' datatype = 'logical' - lptr => lecovars_full_depth_tavg + lptr => ciso_on call this%add_var(sname, lname, units, datatype, category, & marbl_status_log, lptr=lptr) call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'ciso_lsource_sink' - lname = 'Control which portions of carbon isotope code are executed (useful for debugging)' - units = 'unitless' - datatype = 'logical' - lptr => ciso_lsource_sink - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, lptr=lptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + end subroutine marbl_settings_define_tracer_modules - sname = 'lcheck_forcing' - lname = 'Control whether consistency checks are performed on forcing input (useful for debugging)' + !***************************************************************************** + + subroutine marbl_settings_define_general_parms(this, marbl_status_log) + + class(marbl_settings_type), intent(inout) :: this + type(marbl_log_type), intent(inout) :: marbl_status_log + + character(len=*), parameter :: subname = 'marbl_settings_mod:marbl_settings_define_general_parms' + + character(len=char_len) :: sname, lname, units, datatype, category + real(r8), pointer :: rptr => NULL() + logical(log_kind), pointer :: lptr => NULL() + character(len=char_len), pointer :: sptr => NULL() + logical :: labort_marbl_loc + + labort_marbl_loc = .false. + + if (base_bio_on) then + ! ---------------------- + category = 'config PFTs' + ! ---------------------- + + sname = 'PFT_defaults' + lname = 'Define how PFTs are initialized' + units = 'unitless' + datatype = 'string' + sptr => PFT_defaults + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, sptr=sptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + end if + + ! ----------------------- + category = 'config flags' + ! ----------------------- + + sname = 'lsource_sink' + lname = 'Control which portions of code are executed (useful for debugging)' units = 'unitless' datatype = 'logical' - lptr => lcheck_forcing + lptr => lsource_sink call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, lptr=lptr) + marbl_status_log, lptr=lptr) call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'lflux_gas_o2' - lname = 'Run O2 gas flux portion of the code' + sname = 'lecovars_full_depth_tavg' + lname = 'If .false., MARBL will recommend truncating the column for some diagnostics' units = 'unitless' datatype = 'logical' - lptr => lflux_gas_o2 + lptr => lecovars_full_depth_tavg call this%add_var(sname, lname, units, datatype, category, & marbl_status_log, lptr=lptr) call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) @@ -684,511 +719,557 @@ subroutine marbl_settings_define_general_parms(this, marbl_status_log) marbl_status_log, lptr=lptr) call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'lcompute_nhx_surface_emis' - lname = 'control if NHx emissions are computed' - units = 'unitless' - datatype = 'logical' - lptr => lcompute_nhx_surface_emis - call this%add_var(sname, lname, units, datatype, category, & + if (ciso_on) then + sname = 'ciso_lsource_sink' + lname = 'Control which portions of carbon isotope code are executed (useful for debugging)' + units = 'unitless' + datatype = 'logical' + lptr => ciso_lsource_sink + call this%add_var(sname, lname, units, datatype, category, & marbl_status_log, lptr=lptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + end if - sname = 'lvariable_PtoC' - lname = 'control if PtoC ratios in autotrophs vary' - units = 'unitless' - datatype = 'logical' - lptr => lvariable_PtoC - call this%add_var(sname, lname, units, datatype, category, & + if (abio_dic_on) then + sname = 'labio_derivative_diags' + lname = 'Control whether derivative diagnostics are computed in abiotic surface flux (useful for Newton-Krylov)' + units = 'unitless' + datatype = 'logical' + lptr => labio_derivative_diags + call this%add_var(sname, lname, units, datatype, category, & marbl_status_log, lptr=lptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + end if - sname = 'ladjust_bury_coeff' - lname = 'Adjust the bury coefficient to maintain equilibrium' + sname = 'lcheck_forcing' + lname = 'Control whether consistency checks are performed on forcing input (useful for debugging)' units = 'unitless' datatype = 'logical' - lptr => ladjust_bury_coeff + lptr => lcheck_forcing call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, lptr=lptr) + marbl_status_log, lptr=lptr) call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'lo2_consumption_scalef' - lname = 'Apply o2_consumption_scalef to o2 consumption (and request it as a forcing)' - units = 'unitless' - datatype = 'logical' - lptr => lo2_consumption_scalef - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, lptr=lptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + if (base_bio_on) then + sname = 'lflux_gas_o2' + lname = 'Run O2 gas flux portion of the code' + units = 'unitless' + datatype = 'logical' + lptr => lflux_gas_o2 + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, lptr=lptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'lp_remin_scalef' - lname = 'Apply p_remin_scalef to particulate remin (and request it as a forcing)' - units = 'unitless' - datatype = 'logical' - lptr => lp_remin_scalef - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, lptr=lptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + sname = 'lcompute_nhx_surface_emis' + lname = 'control if NHx emissions are computed' + units = 'unitless' + datatype = 'logical' + lptr => lcompute_nhx_surface_emis + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, lptr=lptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - ! -------------------------- - category = 'config strings' - ! -------------------------- + sname = 'lvariable_PtoC' + lname = 'control if PtoC ratios in autotrophs vary' + units = 'unitless' + datatype = 'logical' + lptr => lvariable_PtoC + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, lptr=lptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'init_bury_coeff_opt' - lname = 'How to set initial bury coefficients' - units = 'unitless' - datatype = 'string' - sptr => init_bury_coeff_opt - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, sptr=sptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + sname = 'ladjust_bury_coeff' + lname = 'Adjust the bury coefficient to maintain equilibrium' + units = 'unitless' + datatype = 'logical' + lptr => ladjust_bury_coeff + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, lptr=lptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - ! ----------------------------- - category = 'general parmeters' - ! ----------------------------- + sname = 'lo2_consumption_scalef' + lname = 'Apply o2_consumption_scalef to o2 consumption (and request it as a forcing)' + units = 'unitless' + datatype = 'logical' + lptr => lo2_consumption_scalef + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, lptr=lptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'particulate_flux_ref_depth' - lname = 'reference depth for particulate flux diagnostics' - units = 'm' - datatype = 'real' - rptr => particulate_flux_ref_depth - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, rptr=rptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + sname = 'lp_remin_scalef' + lname = 'Apply p_remin_scalef to particulate remin (and request it as a forcing)' + units = 'unitless' + datatype = 'logical' + lptr => lp_remin_scalef + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, lptr=lptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'bftt_dz_sum_thres' - lname = 'MARBL will abort if abs(1 - sum(bot_flux_to_tend)) exceeds this threshold' - units = 'unitless' - datatype = 'real' - rptr => bftt_dz_sum_thres - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, rptr=rptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + ! -------------------------- + category = 'config strings' + ! -------------------------- - sname = 'Jint_Ctot_thres_molpm2pyr' - lname = 'MARBL will abort if abs(Jint_Ctot) exceeds this threshold' - units = 'mol m-2 yr-1' - datatype = 'real' - rptr => Jint_Ctot_thres_molpm2pyr - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, rptr=rptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + sname = 'init_bury_coeff_opt' + lname = 'How to set initial bury coefficients' + units = 'unitless' + datatype = 'string' + sptr => init_bury_coeff_opt + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, sptr=sptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'gQsi_0' - lname = 'initial Si/C ratio for growth' - units = '1' - datatype = 'real' - rptr => gQsi_0 - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, rptr=rptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + ! ----------------------------- + category = 'general parmeters' + ! ----------------------------- - sname = 'gQsi_max' - lname = 'max Si/C ratio for growth' - units = '1' - datatype = 'real' - rptr => gQsi_max - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, rptr=rptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + sname = 'particulate_flux_ref_depth' + lname = 'reference depth for particulate flux diagnostics' + units = 'm' + datatype = 'real' + rptr => particulate_flux_ref_depth + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, rptr=rptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'gQsi_min' - lname = 'min Si/C ratio for growth' - units = '1' - datatype = 'real' - rptr => gQsi_min - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, rptr=rptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + sname = 'bftt_dz_sum_thres' + lname = 'MARBL will abort if abs(1 - sum(bot_flux_to_tend)) exceeds this threshold' + units = 'unitless' + datatype = 'real' + rptr => bftt_dz_sum_thres + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, rptr=rptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'gQ_Fe_kFe_thres' - lname = 'Fe:kFe ratio threshold in uptake ratio computations' - units = '1' - datatype = 'real' - rptr => gQ_Fe_kFe_thres - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, rptr=rptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + sname = 'Jint_Ctot_thres_molpm2pyr' + lname = 'MARBL will abort if abs(Jint_Ctot) exceeds this threshold' + units = 'mol m-2 yr-1' + datatype = 'real' + rptr => Jint_Ctot_thres_molpm2pyr + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, rptr=rptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'gQ_Si_kSi_thres' - lname = 'Si:kSi ratio threshold in uptake ratio computations' - units = '1' - datatype = 'real' - rptr => gQ_Si_kSi_thres - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, rptr=rptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + sname = 'gQsi_0' + lname = 'initial Si/C ratio for growth' + units = '1' + datatype = 'real' + rptr => gQsi_0 + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, rptr=rptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'parm_Fe_bioavail' - lname = 'Fraction of Fe flux that is bioavailable' - units = 'unitless' - datatype = 'real' - rptr => parm_Fe_bioavail - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, rptr=rptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + sname = 'gQsi_max' + lname = 'max Si/C ratio for growth' + units = '1' + datatype = 'real' + rptr => gQsi_max + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, rptr=rptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'parm_o2_min' - lname = 'Minimum O2 needed for production and consumption' - units = 'nmol/cm^3' - datatype = 'real' - rptr => parm_o2_min - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, rptr=rptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + sname = 'gQsi_min' + lname = 'min Si/C ratio for growth' + units = '1' + datatype = 'real' + rptr => gQsi_min + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, rptr=rptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'parm_o2_min_delta' - lname = 'Width of minimum O2 range' - units = 'nmol/cm^3' - datatype = 'real' - rptr => parm_o2_min_delta - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, rptr=rptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + sname = 'gQ_Fe_kFe_thres' + lname = 'Fe:kFe ratio threshold in uptake ratio computations' + units = '1' + datatype = 'real' + rptr => gQ_Fe_kFe_thres + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, rptr=rptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'parm_kappa_nitrif_per_day' - lname = 'Nitrification inverse time constant' - units = '1/day' - datatype = 'real' - rptr => parm_kappa_nitrif_per_day - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, rptr=rptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + sname = 'gQ_Si_kSi_thres' + lname = 'Si:kSi ratio threshold in uptake ratio computations' + units = '1' + datatype = 'real' + rptr => gQ_Si_kSi_thres + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, rptr=rptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'parm_nitrif_par_lim' - lname = 'PAR limit for nitrification' - units = 'W/m^2' - datatype = 'real' - rptr => parm_nitrif_par_lim - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, rptr=rptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + sname = 'parm_Fe_bioavail' + lname = 'Fraction of Fe flux that is bioavailable' + units = 'unitless' + datatype = 'real' + rptr => parm_Fe_bioavail + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, rptr=rptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'parm_labile_ratio' - lname = 'Fraction of loss to DOC that is routed directly to DIC' - units = 'unitless' - datatype = 'real' - rptr => parm_labile_ratio - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, rptr=rptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + sname = 'parm_o2_min' + lname = 'Minimum O2 needed for production and consumption' + units = 'nmol/cm^3' + datatype = 'real' + rptr => parm_o2_min + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, rptr=rptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'parm_init_POC_bury_coeff' - lname = 'initial scale factor for burial of POC, PON' - units = 'unitless' - datatype = 'real' - rptr => parm_init_POC_bury_coeff - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, rptr=rptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + sname = 'parm_o2_min_delta' + lname = 'Width of minimum O2 range' + units = 'nmol/cm^3' + datatype = 'real' + rptr => parm_o2_min_delta + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, rptr=rptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'parm_init_POP_bury_coeff' - lname = 'initial scale factor for burial of POP' - units = 'unitless' - datatype = 'real' - rptr => parm_init_POP_bury_coeff - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, rptr=rptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + sname = 'parm_kappa_nitrif_per_day' + lname = 'Nitrification inverse time constant' + units = '1/day' + datatype = 'real' + rptr => parm_kappa_nitrif_per_day + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, rptr=rptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'parm_init_bSi_bury_coeff' - lname = 'initial scale factor for burial of bSi' - units = 'unitless' - datatype = 'real' - rptr => parm_init_bSi_bury_coeff - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, rptr=rptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + sname = 'parm_nitrif_par_lim' + lname = 'PAR limit for nitrification' + units = 'W/m^2' + datatype = 'real' + rptr => parm_nitrif_par_lim + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, rptr=rptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'parm_Fe_scavenge_rate0' - lname = 'scavenging base rate for Fe' - units = 'cm^2/ng s/yr' - datatype = 'real' - rptr => parm_Fe_scavenge_rate0 - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, rptr=rptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + sname = 'parm_labile_ratio' + lname = 'Fraction of loss to DOC that is routed directly to DIC' + units = 'unitless' + datatype = 'real' + rptr => parm_labile_ratio + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, rptr=rptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'parm_Lig_scavenge_rate0' - lname = 'scavenging base rate for bound ligand' - units = 'cm^2/ng s/yr' - datatype = 'real' - rptr => parm_Lig_scavenge_rate0 - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, rptr=rptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + sname = 'parm_init_POC_bury_coeff' + lname = 'initial scale factor for burial of POC, PON' + units = 'unitless' + datatype = 'real' + rptr => parm_init_POC_bury_coeff + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, rptr=rptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'parm_FeLig_scavenge_rate0' - lname = 'scavenging base rate for bound iron' - units = 'cm^2/ng s/yr' - datatype = 'real' - rptr => parm_FeLig_scavenge_rate0 - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, rptr=rptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + sname = 'parm_init_POP_bury_coeff' + lname = 'initial scale factor for burial of POP' + units = 'unitless' + datatype = 'real' + rptr => parm_init_POP_bury_coeff + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, rptr=rptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'parm_Lig_degrade_rate0' - lname = 'Fe-binding ligand bacterial degradation rate coefficient' - units = '1' - datatype = 'real' - rptr => parm_Lig_degrade_rate0 - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, rptr=rptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + sname = 'parm_init_bSi_bury_coeff' + lname = 'initial scale factor for burial of bSi' + units = 'unitless' + datatype = 'real' + rptr => parm_init_bSi_bury_coeff + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, rptr=rptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'parm_Fe_desorption_rate0' - lname = 'desorption rate for scavenged Fe from particles' - units = '1/cm' - datatype = 'real' - rptr => parm_Fe_desorption_rate0 - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, rptr=rptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + sname = 'parm_Fe_scavenge_rate0' + lname = 'scavenging base rate for Fe' + units = 'cm^2/ng s/yr' + datatype = 'real' + rptr => parm_Fe_scavenge_rate0 + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, rptr=rptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'parm_f_prod_sp_CaCO3' - lname = 'Fraction of sp production as CaCO3 production' - units = 'unitless' - datatype = 'real' - rptr => parm_f_prod_sp_CaCO3 - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, rptr=rptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + sname = 'parm_Lig_scavenge_rate0' + lname = 'scavenging base rate for bound ligand' + units = 'cm^2/ng s/yr' + datatype = 'real' + rptr => parm_Lig_scavenge_rate0 + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, rptr=rptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'parm_POC_diss' - lname = 'base POC dissolution length scale' - units = 'cm' - datatype = 'real' - rptr => parm_POC_diss - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, rptr=rptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + sname = 'parm_FeLig_scavenge_rate0' + lname = 'scavenging base rate for bound iron' + units = 'cm^2/ng s/yr' + datatype = 'real' + rptr => parm_FeLig_scavenge_rate0 + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, rptr=rptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'parm_SiO2_diss' - lname = 'base SiO2 dissolution length scale' - units = 'cm' - datatype = 'real' - rptr => parm_SiO2_diss - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, rptr=rptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + sname = 'parm_Lig_degrade_rate0' + lname = 'Fe-binding ligand bacterial degradation rate coefficient' + units = '1' + datatype = 'real' + rptr => parm_Lig_degrade_rate0 + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, rptr=rptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'parm_SiO2_gamma' - lname = 'SiO2 gamma (fraction of production -> hard subclass)' - units = '1' - datatype = 'real' - rptr => parm_SiO2_gamma - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, rptr=rptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + sname = 'parm_Fe_desorption_rate0' + lname = 'desorption rate for scavenged Fe from particles' + units = '1/cm' + datatype = 'real' + rptr => parm_Fe_desorption_rate0 + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, rptr=rptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'parm_hPOC_SiO2_ratio' - lname = 'hPOC to SiO2 ratio' - units = '1' - datatype = 'real' - rptr => parm_hPOC_SiO2_ratio - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, rptr=rptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + sname = 'parm_f_prod_sp_CaCO3' + lname = 'Fraction of sp production as CaCO3 production' + units = 'unitless' + datatype = 'real' + rptr => parm_f_prod_sp_CaCO3 + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, rptr=rptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'parm_CaCO3_diss' - lname = 'base CaCO3 dissolution length scale' - units = 'cm' - datatype = 'real' - rptr => parm_CaCO3_diss - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, rptr=rptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + sname = 'parm_POC_diss' + lname = 'base POC dissolution length scale' + units = 'cm' + datatype = 'real' + rptr => parm_POC_diss + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, rptr=rptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'parm_CaCO3_gamma' - lname = 'CaCO3 gamma (fraction of production -> hard subclass)' - units = '1' - datatype = 'real' - rptr => parm_CaCO3_gamma - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, rptr=rptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + sname = 'parm_SiO2_diss' + lname = 'base SiO2 dissolution length scale' + units = 'cm' + datatype = 'real' + rptr => parm_SiO2_diss + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, rptr=rptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'parm_hPOC_CaCO3_ratio' - lname = 'hPOC to CaCO3 ratio' - units = '1' - datatype = 'real' - rptr => parm_hPOC_CaCO3_ratio - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, rptr=rptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + sname = 'parm_SiO2_gamma' + lname = 'SiO2 gamma (fraction of production -> hard subclass)' + units = '1' + datatype = 'real' + rptr => parm_SiO2_gamma + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, rptr=rptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'parm_hPOC_dust_ratio' - lname = 'hPOC to dust ratio' - units = '1' - datatype = 'real' - rptr => parm_hPOC_dust_ratio - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, rptr=rptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + sname = 'parm_hPOC_SiO2_ratio' + lname = 'hPOC to SiO2 ratio' + units = '1' + datatype = 'real' + rptr => parm_hPOC_SiO2_ratio + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, rptr=rptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'o2_sf_o2_range_hi' - lname = 'o2_scalefactor is applied to diss length scales for O2 less than this' - units = 'mmol/m^3' - datatype = 'real' - rptr => o2_sf_o2_range_hi - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, rptr=rptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + sname = 'parm_CaCO3_diss' + lname = 'base CaCO3 dissolution length scale' + units = 'cm' + datatype = 'real' + rptr => parm_CaCO3_diss + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, rptr=rptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'o2_sf_o2_range_lo' - lname = 'o2_scalefactor is constant for O2 less than this' - units = 'mmol/m^3' - datatype = 'real' - rptr => o2_sf_o2_range_lo - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, rptr=rptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + sname = 'parm_CaCO3_gamma' + lname = 'CaCO3 gamma (fraction of production -> hard subclass)' + units = '1' + datatype = 'real' + rptr => parm_CaCO3_gamma + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, rptr=rptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'o2_sf_val_lo_o2' - lname = 'o2_scalefactor constant for O2 less than o2_sf_o2_range_lo' - units = '1' - datatype = 'real' - rptr => o2_sf_val_lo_o2 - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, rptr=rptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + sname = 'parm_hPOC_CaCO3_ratio' + lname = 'hPOC to CaCO3 ratio' + units = '1' + datatype = 'real' + rptr => parm_hPOC_CaCO3_ratio + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, rptr=rptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'parm_sed_denitrif_coeff' - lname = 'global scaling factor for sed_denitrif' - units = '1' - datatype = 'real' - rptr => parm_sed_denitrif_coeff - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, rptr=rptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + sname = 'parm_hPOC_dust_ratio' + lname = 'hPOC to dust ratio' + units = '1' + datatype = 'real' + rptr => parm_hPOC_dust_ratio + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, rptr=rptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'bury_coeff_rmean_timescale_years' - lname = 'Timescale for bury coefficient running means' - units = 'yr' - datatype = 'real' - rptr => bury_coeff_rmean_timescale_years - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, rptr=rptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + sname = 'o2_sf_o2_range_hi' + lname = 'o2_scalefactor is applied to diss length scales for O2 less than this' + units = 'mmol/m^3' + datatype = 'real' + rptr => o2_sf_o2_range_hi + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, rptr=rptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - ! ------------------------- - category = 'Scale lengths' - ! ------------------------- + sname = 'o2_sf_o2_range_lo' + lname = 'o2_scalefactor is constant for O2 less than this' + units = 'mmol/m^3' + datatype = 'real' + rptr => o2_sf_o2_range_lo + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, rptr=rptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'parm_scalelen_z' - lname = 'Depths of prescribed scale length values' - units = 'cm' - call this%add_var_1d_r8(sname, lname, units, category, & - parm_scalelen_z, marbl_status_log) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + sname = 'o2_sf_val_lo_o2' + lname = 'o2_scalefactor constant for O2 less than o2_sf_o2_range_lo' + units = '1' + datatype = 'real' + rptr => o2_sf_val_lo_o2 + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, rptr=rptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'parm_scalelen_vals' - lname = 'Prescribed scale length values' - units = 'cm' - call this%add_var_1d_r8(sname, lname, units, category, & - parm_scalelen_vals, marbl_status_log) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + sname = 'parm_sed_denitrif_coeff' + lname = 'global scaling factor for sed_denitrif' + units = '1' + datatype = 'real' + rptr => parm_sed_denitrif_coeff + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, rptr=rptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - ! ----------------------------- - category = 'general parameters' - ! ----------------------------- + sname = 'bury_coeff_rmean_timescale_years' + lname = 'Timescale for bury coefficient running means' + units = 'yr' + datatype = 'real' + rptr => bury_coeff_rmean_timescale_years + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, rptr=rptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'caco3_bury_thres_opt' - lname = 'Option for CaCO3 burial threshold' - units = 'unitless' - datatype = 'string' - sptr => caco3_bury_thres_opt - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, sptr=sptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + ! ------------------------- + category = 'Scale lengths' + ! ------------------------- - sname = 'caco3_bury_thres_depth' - lname = 'Threshold depth for CaCO3 burial (if using fixed_depth option)' - units = 'cm' - datatype = 'real' - rptr => caco3_bury_thres_depth - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, rptr=rptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + sname = 'parm_scalelen_z' + lname = 'Depths of prescribed scale length values' + units = 'cm' + call this%add_var_1d_r8(sname, lname, units, category, & + parm_scalelen_z, marbl_status_log) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'caco3_bury_thres_omega_calc' - lname = 'omega calcite threshold for CaCO3 burial (if using omega_calc option)' - units = '1' - datatype = 'real' - rptr => caco3_bury_thres_omega_calc - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, rptr=rptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + sname = 'parm_scalelen_vals' + lname = 'Prescribed scale length values' + units = 'cm' + call this%add_var_1d_r8(sname, lname, units, category, & + parm_scalelen_vals, marbl_status_log) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'PON_bury_coeff' - lname = 'scale factor for burial of PON' - units = 'unitless' - datatype = 'real' - rptr => PON_bury_coeff - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, rptr=rptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + ! ----------------------------- + category = 'general parameters' + ! ----------------------------- - sname = 'POM_bury_frac_max' - lname = 'maximum bury fraction for POM' - units = 'unitless' - datatype = 'real' - rptr => POM_bury_frac_max - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, rptr=rptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + sname = 'caco3_bury_thres_opt' + lname = 'Option for CaCO3 burial threshold' + units = 'unitless' + datatype = 'string' + sptr => caco3_bury_thres_opt + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, sptr=sptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'bSi_bury_frac_max' - lname = 'maximum bury fraction for bSi' - units = 'unitless' - datatype = 'real' - rptr => bSi_bury_frac_max - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, rptr=rptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + sname = 'caco3_bury_thres_depth' + lname = 'Threshold depth for CaCO3 burial (if using fixed_depth option)' + units = 'cm' + datatype = 'real' + rptr => caco3_bury_thres_depth + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, rptr=rptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'ciso_fract_factors' - lname = 'Option for which biological fractionation calculation to use' - units = 'unitless' - datatype = 'string' - sptr => ciso_fract_factors - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, sptr=sptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + sname = 'caco3_bury_thres_omega_calc' + lname = 'omega calcite threshold for CaCO3 burial (if using omega_calc option)' + units = '1' + datatype = 'real' + rptr => caco3_bury_thres_omega_calc + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, rptr=rptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'auto_mort2_exp' - lname = 'Value of power loss exponent for autotrophs' - units = 'unitless' - datatype = 'real' - rptr => auto_mort2_exp - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, rptr=rptr) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + sname = 'PON_bury_coeff' + lname = 'scale factor for burial of PON' + units = 'unitless' + datatype = 'real' + rptr => PON_bury_coeff + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, rptr=rptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'zoo_mort2_exp' - lname = 'Value of power loss exponent for zooplankton' - units = 'unitless' - datatype = 'real' - rptr => zoo_mort2_exp - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, rptr=rptr) + sname = 'POM_bury_frac_max' + lname = 'maximum bury fraction for POM' + units = 'unitless' + datatype = 'real' + rptr => POM_bury_frac_max + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, rptr=rptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'QCaCO3_max' - lname = 'Max CaCO3/C ratio for implicit calcifiers' - units = 'mmol CaCO3/mmol C' - datatype = 'real' - rptr => QCaCO3_max - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, rptr=rptr) + sname = 'bSi_bury_frac_max' + lname = 'maximum bury fraction for bSi' + units = 'unitless' + datatype = 'real' + rptr => bSi_bury_frac_max + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, rptr=rptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - sname = 'f_graze_CaCO3_remin' - lname = 'Fraction of spCaCO3 grazing which is remineralized in zooplankton guts' - units = 'unitless' - datatype = 'real' - rptr => f_graze_CaCO3_remin - call this%add_var(sname, lname, units, datatype, category, & - marbl_status_log, rptr=rptr) + sname = 'auto_mort2_exp' + lname = 'Value of power loss exponent for autotrophs' + units = 'unitless' + datatype = 'real' + rptr => auto_mort2_exp + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, rptr=rptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) - call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + sname = 'zoo_mort2_exp' + lname = 'Value of power loss exponent for zooplankton' + units = 'unitless' + datatype = 'real' + rptr => zoo_mort2_exp + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, rptr=rptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + + sname = 'QCaCO3_max' + lname = 'Max CaCO3/C ratio for implicit calcifiers' + units = 'mmol CaCO3/mmol C' + datatype = 'real' + rptr => QCaCO3_max + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, rptr=rptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + + sname = 'f_graze_CaCO3_remin' + lname = 'Fraction of spCaCO3 grazing which is remineralized in zooplankton guts' + units = 'unitless' + datatype = 'real' + rptr => f_graze_CaCO3_remin + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, rptr=rptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + + end if + + if (ciso_on) then + sname = 'ciso_fract_factors' + lname = 'Option for which biological fractionation calculation to use' + units = 'unitless' + datatype = 'string' + sptr => ciso_fract_factors + call this%add_var(sname, lname, units, datatype, category, & + marbl_status_log, sptr=sptr) + call check_and_log_add_var_error(marbl_status_log, sname, subname, labort_marbl_loc) + end if marbl_status_log%labort_marbl = labort_marbl_loc if (marbl_status_log%labort_marbl) return @@ -1203,13 +1284,13 @@ subroutine marbl_settings_define_PFT_counts(this, marbl_status_log) type(marbl_log_type), intent(inout) :: marbl_status_log character(len=*), parameter :: subname = 'marbl_settings_mod:marbl_settings_define_PFT_counts' - character(len=char_len) :: log_message character(len=char_len) :: sname, lname, units, datatype, category integer(int_kind), pointer :: iptr => NULL() - integer :: m,n logical :: labort_marbl_loc + if (.not. base_bio_on) return + labort_marbl_loc = .false. ! ---------------------- @@ -1253,6 +1334,16 @@ subroutine marbl_settings_define_PFT_counts(this, marbl_status_log) marbl_status_log%labort_marbl = labort_marbl_loc if (marbl_status_log%labort_marbl) return + end subroutine marbl_settings_define_PFT_counts + + subroutine marbl_settings_allocate_PFT_types(marbl_status_log) + + type(marbl_log_type), intent(inout) :: marbl_status_log + + character(len=*), parameter :: subname = 'marbl_settings_mod:marbl_settings_allocate_PFT_types' + character(len=char_len) :: log_message + integer :: m, n + ! FIXME #69: this is not ideal for threaded runs if (.not. allocated(autotroph_settings)) & allocate(autotroph_settings(autotroph_cnt)) @@ -1272,7 +1363,7 @@ subroutine marbl_settings_define_PFT_counts(this, marbl_status_log) end do end if - end subroutine marbl_settings_define_PFT_counts + end subroutine marbl_settings_allocate_PFT_types !***************************************************************************** @@ -1293,6 +1384,8 @@ subroutine marbl_settings_define_PFT_derived_types(this, marbl_status_log) integer :: m, n, cnt character(len=char_len) :: prefix + if (.not. base_bio_on) return + labort_marbl_loc = .false. do n=1,autotroph_cnt write(prefix, "(A,I0,A)") 'autotroph_settings(', n, ')%' @@ -2120,12 +2213,23 @@ subroutine marbl_settings_consistency_check(lallow_glo_ops, marbl_status_log) character(len=*), parameter :: subname = 'marbl_settings_mod:marbl_settings_consistency_check' character(len=char_len) :: log_message - ! Abort if GCM doesn't support global ops but configuration requires them - if (ladjust_bury_coeff .and. (.not.lallow_glo_ops)) then + ! Abort if no tracer modules are enabled + if (.not. (base_bio_on .or. abio_dic_on .or. ciso_on)) then + write(log_message, '(A)') 'You must enable at least one tracer package in MARBL' + call marbl_status_log%log_error(log_message, subname) + end if + + ! Abort if ciso is on but base_bio is not + if (ciso_on .and. (.not. base_bio_on)) then + write(log_message, '(A)') 'You can not run with carbon isotopes without the base biotic tracers' + call marbl_status_log%log_error(log_message, subname) + end if + + ! Abort if GCM doesn't support global ops but configuration requires them + if (ladjust_bury_coeff .and. (.not. lallow_glo_ops)) then write(log_message,'(2A)') 'Can not run with ladjust_bury_coeff = ', & '.true. unless GCM can perform global operations' call marbl_status_log%log_error(log_message, subname) - return end if end subroutine marbl_settings_consistency_check @@ -2398,7 +2502,7 @@ subroutine add_var(this, sname, lname, units, datatype, category, & end if ! 4) Append new entry to list - if (.not.associated(this%vars)) then + if (.not. associated(this%vars)) then this%vars => new_entry else ll_prev%next => new_entry @@ -2784,7 +2888,7 @@ subroutine put(this, var, marbl_status_log, rval, ival, lval, sval, uval) new_entry%datatype = 'unknown' end if - if (.not.associated(this%VarsFromPut)) then + if (.not. associated(this%VarsFromPut)) then this%VarsFromPut => new_entry else this%LastVarFromPut%next => new_entry @@ -2829,7 +2933,7 @@ subroutine get(this, var, marbl_status_log, rval, ival, lval, sval) if (case_insensitive_eq((ll_ptr%short_name), trim(var))) exit ll_ptr => ll_ptr%next end do - if (.not.associated(ll_ptr)) then + if (.not. associated(ll_ptr)) then write(log_message, "(2A)") trim(var), 'not found!' call marbl_status_log%log_error(log_message, subname) return diff --git a/src/marbl_surface_flux_mod.F90 b/src/marbl_surface_flux_mod.F90 index 504a2302..dc880840 100644 --- a/src/marbl_surface_flux_mod.F90 +++ b/src/marbl_surface_flux_mod.F90 @@ -36,6 +36,7 @@ module marbl_surface_flux_mod use marbl_interface_public_types, only : marbl_forcing_fields_type use marbl_diagnostics_mod , only : marbl_diagnostics_surface_flux_compute + use marbl_diagnostics_mod , only : marbl_diagnostics_surface_flux_share use marbl_logging , only : marbl_log_type @@ -85,9 +86,11 @@ subroutine marbl_surface_flux_compute( & use marbl_co2calc_mod, only : marbl_co2calc_surface use marbl_oxygen, only : o2sat_surf use marbl_nhx_surface_emis_mod, only : marbl_nhx_surface_emis_compute + use marbl_settings_mod, only : base_bio_on use marbl_settings_mod, only : lcompute_nhx_surface_emis use marbl_settings_mod, only : xkw_coeff use marbl_surface_flux_share_mod, only : marbl_surface_flux_share_export_variables + use marbl_abio_dic_surface_flux_mod, only : marbl_abio_dic_surface_flux_compute use marbl_ciso_surface_flux_mod, only : marbl_ciso_surface_flux_compute use marbl_glo_avg_mod, only : glo_avg_field_ind_surface_flux_C_input use marbl_glo_avg_mod, only : glo_avg_field_ind_surface_flux_P_input @@ -116,13 +119,13 @@ subroutine marbl_surface_flux_compute( & !----------------------------------------------------------------------- character(len=*), parameter :: subname = 'marbl_surface_flux_mod:marbl_surface_flux_compute' - integer (int_kind) :: auto_ind ! autotroph functional group index - real (r8) :: phlo(num_elements) ! lower bound for ph in solver - real (r8) :: phhi(num_elements) ! upper bound for ph in solver - real (r8) :: xkw_ice(num_elements) ! common portion of piston vel., (1-fice)*xkw (L/T) - real (r8) :: o2sat_1atm(num_elements) ! o2 saturation @ 1 atm (conc units) - real (r8) :: totalChl_loc(num_elements) ! local value of totalChl - real (r8) :: flux_o2_loc(num_elements) ! local value of o2 flux + integer(int_kind) :: auto_ind ! autotroph functional group index + real(r8) :: phlo(num_elements) ! lower bound for ph in solver + real(r8) :: phhi(num_elements) ! upper bound for ph in solver + real(r8) :: xkw_ice(num_elements) ! common portion of piston vel., (1-fice)*xkw (cm/s) + real(r8) :: o2sat_1atm(num_elements) ! o2 saturation @ 1 atm (conc units) + real(r8) :: totalChl_loc(num_elements) ! local value of totalChl + real(r8) :: flux_o2_loc(num_elements) ! local value of o2 flux !----------------------------------------------------------------------- associate( & @@ -140,38 +143,38 @@ subroutine marbl_surface_flux_compute( & nox_flux => surface_flux_forcings(surface_flux_forcing_ind%nox_flux_id)%field_0d, & nhy_flux => surface_flux_forcings(surface_flux_forcing_ind%nhy_flux_id)%field_0d, & - piston_velocity => surface_flux_internal%piston_velocity(:), & - flux_co2 => surface_flux_internal%flux_co2(:), & - co2star => surface_flux_internal%co2star(:), & - dco2star => surface_flux_internal%dco2star(:), & - pco2surf => surface_flux_internal%pco2surf(:), & - dpco2 => surface_flux_internal%dpco2(:), & - co3 => surface_flux_internal%co3(:), & - co2star_alt => surface_flux_internal%co2star_alt(:), & - dco2star_alt => surface_flux_internal%dco2star_alt(:), & - pco2surf_alt => surface_flux_internal%pco2surf_alt(:), & - dpco2_alt => surface_flux_internal%dpco2_alt(:), & - schmidt_co2 => surface_flux_internal%schmidt_co2(:), & - schmidt_o2 => surface_flux_internal%schmidt_o2(:), & - pv_o2 => surface_flux_internal%pv_o2(:), & - pv_co2 => surface_flux_internal%pv_co2(:), & - o2sat => surface_flux_internal%o2sat(:), & - flux_alt_co2 => surface_flux_internal%flux_alt_co2(:), & - nhx_surface_emis => surface_flux_internal%nhx_surface_emis(:), & - - ph_prev_surf => saved_state%state(saved_state_ind%ph_surf)%field_2d, & - ph_prev_alt_co2_surf => saved_state%state(saved_state_ind%ph_alt_co2_surf)%field_2d, & - - po4_ind => marbl_tracer_indices%po4_ind, & - no3_ind => marbl_tracer_indices%no3_ind, & - sio3_ind => marbl_tracer_indices%sio3_ind, & - nh4_ind => marbl_tracer_indices%nh4_ind, & - fe_ind => marbl_tracer_indices%fe_ind, & - o2_ind => marbl_tracer_indices%o2_ind, & - dic_ind => marbl_tracer_indices%dic_ind, & - dic_alt_co2_ind => marbl_tracer_indices%dic_alt_co2_ind, & - alk_ind => marbl_tracer_indices%alk_ind, & - alk_alt_co2_ind => marbl_tracer_indices%alk_alt_co2_ind & + piston_velocity => surface_flux_internal%piston_velocity(:), & + flux_co2 => surface_flux_internal%flux_co2(:), & + co2star => surface_flux_internal%co2star(:), & + dco2star => surface_flux_internal%dco2star(:), & + pco2surf => surface_flux_internal%pco2surf(:), & + dpco2 => surface_flux_internal%dpco2(:), & + co3 => surface_flux_internal%co3(:), & + co2star_alt => surface_flux_internal%co2star_alt(:), & + dco2star_alt => surface_flux_internal%dco2star_alt(:), & + pco2surf_alt => surface_flux_internal%pco2surf_alt(:), & + dpco2_alt => surface_flux_internal%dpco2_alt(:), & + schmidt_co2 => surface_flux_internal%schmidt_co2(:), & + schmidt_o2 => surface_flux_internal%schmidt_o2(:), & + pv_o2 => surface_flux_internal%pv_o2(:), & + pv_co2 => surface_flux_internal%pv_co2(:), & + o2sat => surface_flux_internal%o2sat(:), & + flux_alt_co2 => surface_flux_internal%flux_alt_co2(:), & + nhx_surface_emis => surface_flux_internal%nhx_surface_emis(:), & + + ph_prev_surf => saved_state%state(saved_state_ind%base_bio_ph_surf)%field_2d, & + ph_prev_alt_co2_surf => saved_state%state(saved_state_ind%base_bio_ph_alt_co2_surf)%field_2d, & + + po4_ind => marbl_tracer_indices%po4_ind, & + no3_ind => marbl_tracer_indices%no3_ind, & + sio3_ind => marbl_tracer_indices%sio3_ind, & + nh4_ind => marbl_tracer_indices%nh4_ind, & + fe_ind => marbl_tracer_indices%fe_ind, & + o2_ind => marbl_tracer_indices%o2_ind, & + dic_ind => marbl_tracer_indices%dic_ind, & + dic_alt_co2_ind => marbl_tracer_indices%dic_alt_co2_ind, & + alk_ind => marbl_tracer_indices%alk_ind, & + alk_alt_co2_ind => marbl_tracer_indices%alk_alt_co2_ind & ) !----------------------------------------------------------------------- @@ -180,6 +183,58 @@ subroutine marbl_surface_flux_compute( & surface_fluxes(:, :) = c0 + !----------------------------------------------------------------------- + ! fields used for both abiotic and biotic surface flux computation + !----------------------------------------------------------------------- + + if (lflux_gas_o2 .or. lflux_gas_co2) then + piston_velocity = xkw_coeff*u10_sqr(:) + xkw_ice(:) = (c1 - ifrac(:)) * piston_velocity + end if + if (lflux_gas_co2) then + schmidt_co2(:) = schmidt_co2_surf(num_elements, sst) + pv_co2(:) = xkw_ice(:) * sqrt(660.0_r8 / schmidt_co2(:)) + else + schmidt_co2(:) = c0 + pv_co2(:) = c0 + end if + + !----------------------------------------------------------------------- + ! Compute surface flux-related diagnostics for fields used by + ! both abiotic and biotic tracers + !----------------------------------------------------------------------- + + call marbl_diagnostics_surface_flux_share( & + surface_flux_forcing_ind = ind, & + surface_flux_forcings = surface_flux_forcings, & + surface_flux_internal = surface_flux_internal, & + surface_flux_diags = surface_flux_diags) + + !----------------------------------------------------------------------- + ! Compute carbon isotopes surface fluxes + !----------------------------------------------------------------------- + + call marbl_abio_dic_surface_flux_compute(& + num_elements = num_elements, & + tracers_at_surface = tracers_at_surface, & + marbl_tracer_indices = marbl_tracer_indices, & + saved_state_ind = saved_state_ind, & + surface_flux_forcing_ind = surface_flux_forcing_ind, & + surface_flux_forcings = surface_flux_forcings, & + unit_system = unit_system, & + saved_state = saved_state, & + surface_flux_internal = surface_flux_internal, & + surface_flux_diags = surface_flux_diags, & + surface_fluxes = surface_fluxes, & + co2calc_coeffs = co2calc_coeffs, & + co2calc_state = co2calc_state, & + marbl_status_log = marbl_status_log) + + !----------------------------------------------------------------------- + + ! Return if not using base biotic tracers + if (.not. base_bio_on) return + !----------------------------------------------------------------------- ! Compute surface chlorophyll !----------------------------------------------------------------------- @@ -194,172 +249,146 @@ subroutine marbl_surface_flux_compute( & end if !----------------------------------------------------------------------- - ! calculate gas flux quantities if necessary + ! compute O2 flux (if necessary) !----------------------------------------------------------------------- + if (lflux_gas_o2) then + schmidt_o2(:) = schmidt_o2_surf(num_elements, sst) + + o2sat_1atm(:) = o2sat_surf(num_elements, sst, sss) + + pv_o2(:) = xkw_ice(:) * sqrt(660.0_r8 / schmidt_o2(:)) + o2sat(:) = ap_used(:) * o2sat_1atm(:) + flux_o2_loc(:) = pv_o2(:) * (o2sat(:) - tracers_at_surface(:, o2_ind)) + surface_fluxes(:, o2_ind) = surface_fluxes(:, o2_ind) + flux_o2_loc(:) + if (sfo_ind%flux_o2_id.ne.0) then + surface_flux_output%outputs_for_GCM(sfo_ind%flux_o2_id)%forcing_field_0d(:) = flux_o2_loc + end if + else + schmidt_o2(:) = c0 + pv_o2(:) = c0 + o2sat(:) = c0 + endif ! lflux_gas_o2 + !----------------------------------------------------------------------- - ! compute CO2 flux, computing disequilibrium one row at a time + ! compute CO2 flux, computing disequilibrium (if necessary) !----------------------------------------------------------------------- - if (lflux_gas_o2 .or. lflux_gas_co2) then + if (lflux_gas_co2) then + + !----------------------------------------------------------------------- + ! Set flux_co2 + !----------------------------------------------------------------------- + + where (ph_prev_surf(:) /= c0) + phlo(:) = ph_prev_surf(:) - del_ph + phhi(:) = ph_prev_surf(:) + del_ph + elsewhere + phlo(:) = phlo_surf_init + phhi(:) = phhi_surf_init + end where + + ! Note the following computes a new ph_prev_surf + ! pass in sections of surface_flux_forcings instead of associated vars because of problems with intel/15.0.3 + call marbl_co2calc_surface( & + num_elements = num_elements, & + lcomp_co2calc_coeffs = .true., & + dic_in = tracers_at_surface(:,dic_ind), & + xco2_in = xco2(:), & + ta_in = tracers_at_surface(:,alk_ind), & + pt_in = tracers_at_surface(:,po4_ind), & + sit_in = tracers_at_surface(:,sio3_ind), & + temp = surface_flux_forcings(ind%sst_id)%field_0d, & + salt = surface_flux_forcings(ind%sss_id)%field_0d, & + atmpres = surface_flux_forcings(ind%atm_pressure_id)%field_0d, & + unit_system = unit_system, & + co2calc_coeffs = co2calc_coeffs, & + co2calc_state = co2calc_state, & + co3 = co3, & + co2star = co2star, & + dco2star = dco2star, & + pco2surf = pco2surf, & + dpco2 = dpco2, & + phlo = phlo, & + phhi = phhi, & + ph = ph_prev_surf, & + marbl_status_log = marbl_status_log) + + if (marbl_status_log%labort_marbl) then + call marbl_status_log%log_error_trace('marbl_co2calc_surface() with flux_co2', subname) + return + end if + + if (marbl_status_log%lwarning) then + call marbl_status_log%log_warning_trace('marbl_co2calc_surface() with flux_co2', subname) + end if + + flux_co2(:) = pv_co2(:) * dco2star(:) + if (sfo_ind%flux_co2_id.ne.0) then + surface_flux_output%outputs_for_GCM(sfo_ind%flux_co2_id)%forcing_field_0d(:) = flux_co2 + end if + + !------------------------------------------------------------------- + ! The following variables need to be shared with other modules, + ! and are now defined in marbl_share as targets. + !------------------------------------------------------------------- + + call marbl_surface_flux_share_export_variables(surface_flux_internal, tracers_at_surface, & + marbl_tracer_indices, surface_flux_share) + + !----------------------------------------------------------------------- + ! Set flux_alt_co2 + !----------------------------------------------------------------------- + + where (ph_prev_alt_co2_surf(:) /= c0) + phlo(:) = ph_prev_alt_co2_surf(:) - del_ph + phhi(:) = ph_prev_alt_co2_surf(:) + del_ph + elsewhere + phlo(:) = phlo_surf_init + phhi(:) = phhi_surf_init + end where + + ! Note the following computes a new ph_prev_alt_co2 + ! pass in sections of surface_flux_forcings instead of associated vars because of problems with intel/15.0.3 + call marbl_co2calc_surface( & + num_elements = num_elements, & + lcomp_co2calc_coeffs = .false., & + dic_in = tracers_at_surface(:,dic_alt_co2_ind), & + xco2_in = xco2_alt_co2(:), & + ta_in = tracers_at_surface(:,alk_alt_co2_ind), & + pt_in = tracers_at_surface(:,po4_ind), & + sit_in = tracers_at_surface(:,sio3_ind), & + temp = surface_flux_forcings(ind%sst_id)%field_0d, & + salt = surface_flux_forcings(ind%sss_id)%field_0d, & + atmpres = surface_flux_forcings(ind%atm_pressure_id)%field_0d, & + unit_system = unit_system, & + co2calc_coeffs = co2calc_coeffs, & + co2calc_state = co2calc_state, & + co3 = co3, & + co2star = co2star_alt, & + dco2star = dco2star_alt, & + pco2surf = pco2surf_alt, & + dpco2 = dpco2_alt, & + phlo = phlo, & + phhi = phhi, & + ph = ph_prev_alt_co2_surf, & + marbl_status_log = marbl_status_log) + + if (marbl_status_log%labort_marbl) then + call marbl_status_log%log_error_trace('marbl_co2calc_surface() with flux_alt_co2', subname) + return + end if + + if (marbl_status_log%lwarning) then + call marbl_status_log%log_warning_trace('marbl_co2calc_surface() with flux_alt_co2', subname) + end if + + flux_alt_co2(:) = pv_co2(:) * dco2star_alt(:) + + surface_fluxes(:, dic_ind) = surface_fluxes(:, dic_ind) + flux_co2(:) + surface_fluxes(:, dic_alt_co2_ind) = surface_fluxes(:, dic_alt_co2_ind) + flux_alt_co2(:) - !----------------------------------------------------------------------- - ! Compute XKW_ICE. XKW is zero over land, so XKW_ICE is too. - !----------------------------------------------------------------------- - - piston_velocity = xkw_coeff*u10_sqr(:) - xkw_ice(:) = (c1 - ifrac(:)) * piston_velocity - - !----------------------------------------------------------------------- - ! compute O2 flux - !----------------------------------------------------------------------- - - if (lflux_gas_o2) then - schmidt_o2(:) = schmidt_o2_surf(num_elements, sst) - - o2sat_1atm(:) = o2sat_surf(num_elements, sst, sss) - - pv_o2(:) = xkw_ice(:) * sqrt(660.0_r8 / schmidt_o2(:)) - o2sat(:) = ap_used(:) * o2sat_1atm(:) - flux_o2_loc(:) = pv_o2(:) * (o2sat(:) - tracers_at_surface(:, o2_ind)) - surface_fluxes(:, o2_ind) = surface_fluxes(:, o2_ind) + flux_o2_loc(:) - if (sfo_ind%flux_o2_id.ne.0) then - surface_flux_output%outputs_for_GCM(sfo_ind%flux_o2_id)%forcing_field_0d(:) = flux_o2_loc - end if - else - schmidt_o2(:) = c0 - pv_o2(:) = c0 - o2sat(:) = c0 - endif ! lflux_gas_o2 - - !----------------------------------------------------------------------- - ! compute CO2 flux, computing disequilibrium - !----------------------------------------------------------------------- - - if (lflux_gas_co2) then - - schmidt_co2(:) = schmidt_co2_surf(num_elements, sst) - - pv_co2(:) = xkw_ice(:) * sqrt(660.0_r8 / schmidt_co2(:)) - - !----------------------------------------------------------------------- - ! Set flux_co2 - !----------------------------------------------------------------------- - - where (ph_prev_surf(:) /= c0) - phlo(:) = ph_prev_surf(:) - del_ph - phhi(:) = ph_prev_surf(:) + del_ph - elsewhere - phlo(:) = phlo_surf_init - phhi(:) = phhi_surf_init - end where - - ! Note the following computes a new ph_prev_surf - ! pass in sections of surface_flux_forcings instead of associated vars because of problems with intel/15.0.3 - call marbl_co2calc_surface( & - num_elements = num_elements, & - lcomp_co2calc_coeffs = .true., & - dic_in = tracers_at_surface(:,dic_ind), & - xco2_in = surface_flux_forcings(ind%xco2_id)%field_0d, & - ta_in = tracers_at_surface(:,alk_ind), & - pt_in = tracers_at_surface(:,po4_ind), & - sit_in = tracers_at_surface(:,sio3_ind), & - temp = surface_flux_forcings(ind%sst_id)%field_0d, & - salt = surface_flux_forcings(ind%sss_id)%field_0d, & - atmpres = surface_flux_forcings(ind%atm_pressure_id)%field_0d, & - unit_system = unit_system, & - co2calc_coeffs = co2calc_coeffs, & - co2calc_state = co2calc_state, & - co3 = co3, & - co2star = co2star, & - dco2star = dco2star, & - pco2surf = pco2surf, & - dpco2 = dpco2, & - phlo = phlo, & - phhi = phhi, & - ph = ph_prev_surf, & - marbl_status_log = marbl_status_log) - - if (marbl_status_log%labort_marbl) then - call marbl_status_log%log_error_trace('marbl_co2calc_surface() with flux_co2', subname) - return - end if - - if (marbl_status_log%lwarning) then - call marbl_status_log%log_warning_trace('marbl_co2calc_surface() with flux_co2', subname) - end if - - flux_co2(:) = pv_co2(:) * dco2star(:) - if (sfo_ind%flux_co2_id.ne.0) then - surface_flux_output%outputs_for_GCM(sfo_ind%flux_co2_id)%forcing_field_0d(:) = flux_co2 - end if - - !------------------------------------------------------------------- - ! The following variables need to be shared with other modules, - ! and are now defined in marbl_share as targets. - !------------------------------------------------------------------- - - call marbl_surface_flux_share_export_variables(surface_flux_internal, tracers_at_surface, & - marbl_tracer_indices, surface_flux_share) - - !----------------------------------------------------------------------- - ! Set flux_alt_co2 - !----------------------------------------------------------------------- - - where (ph_prev_alt_co2_surf(:) /= c0) - phlo(:) = ph_prev_alt_co2_surf(:) - del_ph - phhi(:) = ph_prev_alt_co2_surf(:) + del_ph - elsewhere - phlo(:) = phlo_surf_init - phhi(:) = phhi_surf_init - end where - - ! Note the following computes a new ph_prev_alt_co2 - ! pass in sections of surface_flux_forcings instead of associated vars because of problems with intel/15.0.3 - call marbl_co2calc_surface( & - num_elements = num_elements, & - lcomp_co2calc_coeffs = .false., & - dic_in = tracers_at_surface(:,dic_alt_co2_ind), & - xco2_in = surface_flux_forcings(ind%xco2_alt_co2_id)%field_0d, & - ta_in = tracers_at_surface(:,alk_alt_co2_ind), & - pt_in = tracers_at_surface(:,po4_ind), & - sit_in = tracers_at_surface(:,sio3_ind), & - temp = surface_flux_forcings(ind%sst_id)%field_0d, & - salt = surface_flux_forcings(ind%sss_id)%field_0d, & - atmpres = surface_flux_forcings(ind%atm_pressure_id)%field_0d, & - unit_system = unit_system, & - co2calc_coeffs = co2calc_coeffs, & - co2calc_state = co2calc_state, & - co3 = co3, & - co2star = co2star_alt, & - dco2star = dco2star_alt, & - pco2surf = pco2surf_alt, & - dpco2 = dpco2_alt, & - phlo = phlo, & - phhi = phhi, & - ph = ph_prev_alt_co2_surf, & - marbl_status_log = marbl_status_log) - - if (marbl_status_log%labort_marbl) then - call marbl_status_log%log_error_trace('marbl_co2calc_surface() with flux_alt_co2', subname) - return - end if - - if (marbl_status_log%lwarning) then - call marbl_status_log%log_warning_trace('marbl_co2calc_surface() with flux_alt_co2', subname) - end if - - flux_alt_co2(:) = pv_co2(:) * dco2star_alt(:) - - surface_fluxes(:, dic_ind) = surface_fluxes(:, dic_ind) + flux_co2(:) - surface_fluxes(:, dic_alt_co2_ind) = surface_fluxes(:, dic_alt_co2_ind) + flux_alt_co2(:) - - else - schmidt_co2(:) = c0 - pv_co2(:) = c0 - endif ! lflux_gas_co2 - - endif ! lflux_gas_o2 .or. lflux_gas_co2 + endif ! lflux_gas_co2 !----------------------------------------------------------------------- ! compute NHx emissions diff --git a/tests/driver_src/marbl.F90 b/tests/driver_src/marbl.F90 index 76916a2e..f61f3000 100644 --- a/tests/driver_src/marbl.F90 +++ b/tests/driver_src/marbl.F90 @@ -396,14 +396,19 @@ Program marbl ' (units: ', trim(marbl_instances(1)%surface_flux_forcings(n)%metadata%field_units),')' call driver_status_log%log_noerror(log_message, subname) end do + ! Log requested interior forcing fields call driver_status_log%log_header('Requested interior forcing fields', subname) + ! Provide message if no itnerior tendency forcings are requested + if (size(marbl_instances(1)%interior_tendency_forcings) == 0) & + call driver_status_log%log_noerror('No forcing fields requested for interior_tendency_compute()!', subname) do n=1,size(marbl_instances(1)%interior_tendency_forcings) write(log_message, "(I0, 5A)") n, '. ', & trim(marbl_instances(1)%interior_tendency_forcings(n)%metadata%varname), & ' (units: ', trim(marbl_instances(1)%interior_tendency_forcings(n)%metadata%field_units),')' call driver_status_log%log_noerror(log_message, subname) end do + call marbl_instances(1)%shutdown() end if @@ -425,6 +430,7 @@ Program marbl call driver_status_log%log_noerror(log_message, subname) end if end do + ! Provide message if no tracers are restored if (cnt.eq.0) then call driver_status_log%log_noerror('No tracers to restore!', subname) end if diff --git a/tests/driver_src/marbl_call_compute_subroutines_drv.F90 b/tests/driver_src/marbl_call_compute_subroutines_drv.F90 index cee14855..37ed82fc 100644 --- a/tests/driver_src/marbl_call_compute_subroutines_drv.F90 +++ b/tests/driver_src/marbl_call_compute_subroutines_drv.F90 @@ -1,5 +1,6 @@ module marbl_call_compute_subroutines_drv + use marbl_constants_mod, only : c0 use marbl_interface, only : marbl_interface_class use marbl_kinds_mod, only : r8, char_len use marbl_logging, only : marbl_log_type @@ -42,7 +43,7 @@ subroutine test(marbl_instances, hist_file, unit_system_opt, driver_status_log) real(r8), allocatable, dimension(:,:) :: surface_flux_output ! num_cols x num_vars real(r8), allocatable, dimension(:,:,:) :: interior_tendencies ! num_tracers x num_levels x num_cols real(r8), allocatable, dimension(:,:) :: total_Chl ! num_levels x num_cols - type(forcing_fields_type), allocatable, dimension(:) :: bot_flux_to_tend ! num_levels + real(r8), allocatable, dimension(:,:) :: bot_flux_to_tend ! num_levels x num_cols real(r8), allocatable, dimension(:,:,:) :: tracer_initial_vals ! num_tracers x num_levels x num_cols real(r8), allocatable, dimension(:) :: lat ! num_cols type(forcing_fields_type), allocatable, dimension(:) :: surface_flux_forcings ! num_forcings @@ -129,7 +130,10 @@ subroutine test(marbl_instances, hist_file, unit_system_opt, driver_status_log) ! as well as fields that driver reads (forcing fields) allocate(surface_fluxes(num_cols, num_tracers)) allocate(interior_tendencies(num_tracers, num_levels, num_cols)) - allocate(bot_flux_to_tend(num_levels)) + allocate(bot_flux_to_tend(num_levels, num_cols), source=c0) + do col_id = 1, num_cols + bot_flux_to_tend(active_level_cnt(col_id),col_id) = 1._r8 / grid_data%delta_z(active_level_cnt(col_id)) + end do allocate(tracer_initial_vals(num_tracers, num_levels, num_cols)) allocate(surface_flux_forcings(size(marbl_instances(1)%surface_flux_forcings))) allocate(interior_tendency_forcings(size(marbl_instances(1)%interior_tendency_forcings))) @@ -213,7 +217,7 @@ subroutine test(marbl_instances, hist_file, unit_system_opt, driver_status_log) ! (d) populate marbl_instances(n)%surface_flux_saved_state (with 0s) do m=1, size(marbl_instances(n)%surface_flux_saved_state%state) - marbl_instances(n)%surface_flux_saved_state%state(m)%field_2d(:) = 0._r8 + marbl_instances(n)%surface_flux_saved_state%state(m)%field_2d(:) = c0 end do ! (e) call surface_flux_compute() @@ -266,15 +270,14 @@ subroutine test(marbl_instances, hist_file, unit_system_opt, driver_status_log) ! (e) populate marbl_instances(n)%interior_tendency_saved_state (with 0s) do m=1, size(marbl_instances(n)%interior_tendency_saved_state%state) if (allocated(marbl_instances(n)%interior_tendency_saved_state%state(m)%field_2d)) then - marbl_instances(n)%interior_tendency_saved_state%state(m)%field_2d(:) = 0._r8 + marbl_instances(n)%interior_tendency_saved_state%state(m)%field_2d(:) = c0 else - marbl_instances(n)%interior_tendency_saved_state%state(m)%field_3d(:,1) = 0._r8 + marbl_instances(n)%interior_tendency_saved_state%state(m)%field_3d(:,1) = c0 end if end do ! (f) set bot_flux_to_tend(:) [1/dz in level kmt, 0 elsewhere] - marbl_instances(n)%bot_flux_to_tend(:) = 0._r8 - marbl_instances(n)%bot_flux_to_tend(active_level_cnt(col_id)) = 1._r8 / grid_data%delta_z(active_level_cnt(col_id)) + marbl_instances(n)%bot_flux_to_tend(:) = bot_flux_to_tend(:,col_id) ! (g) call interior_tendency_compute() call marbl_instances(n)%interior_tendency_compute() diff --git a/tests/driver_src/marbl_get_put_drv.F90 b/tests/driver_src/marbl_get_put_drv.F90 index ca2339a6..b9455b41 100644 --- a/tests/driver_src/marbl_get_put_drv.F90 +++ b/tests/driver_src/marbl_get_put_drv.F90 @@ -46,7 +46,8 @@ subroutine test(marbl_instance, driver_status_log) zt(k) = p5*(zw(k-1)+zw(k)) end do - ! Set ciso_on = .true. for local instance + ! Set abio_dic_on and ciso_on = .true. for local instance + call marbl_instance_loc%put_setting('abio_dic_on', .true.) call marbl_instance_loc%put_setting('ciso_on', .true.) if (marbl_instance_loc%StatusLog%labort_marbl) then call driver_status_log%log_error_trace('marbl_loc%put_setting', subname) diff --git a/tests/driver_src/marbl_io_mod.F90 b/tests/driver_src/marbl_io_mod.F90 index 6a4c74e6..cf806d3b 100644 --- a/tests/driver_src/marbl_io_mod.F90 +++ b/tests/driver_src/marbl_io_mod.F90 @@ -615,6 +615,12 @@ subroutine get_tracer_name_file_and_scale_factor(tracer_name, tracer_name_file, case('diaz14C') tracer_name_file = 'diazC' scale_factor = c1 + case('ABIO_DIC') + tracer_name_file = 'DIC' + scale_factor = 1.025_r8 + case('ABIO_DI14C') + tracer_name_file = 'DIC' + scale_factor = 0.9225_r8 case DEFAULT write(log_message, "(3A)") "Can not read ", trim(tracer_name), " and no fallback field provided!" call driver_status_log%log_error(log_message, subname) @@ -645,6 +651,7 @@ subroutine marbl_io_read_tracers(col_id, tracer_metadata, tracers, driver_status ! Hard-code in mechanism for falling back: ! 1. read 3p1z tracers when 4p2z tracers are not available ! 2. read non-isotopic tracers when CISO tracers are not available + ! 3. read DIC when ABIO tracers are not available call get_tracer_name_file_and_scale_factor(tracer_metadata(n)%short_name, tracer_name_file, & scale_factor, driver_status_log) if (driver_status_log%labort_marbl) then diff --git a/tests/input_files/baselines/call_compute_subroutines.history.nc b/tests/input_files/baselines/call_compute_subroutines.history.nc index 7b9d0803..bbf018e1 100644 Binary files a/tests/input_files/baselines/call_compute_subroutines.history.nc and b/tests/input_files/baselines/call_compute_subroutines.history.nc differ diff --git a/tests/input_files/baselines/call_compute_subroutines.history_4p2z.nc b/tests/input_files/baselines/call_compute_subroutines.history_4p2z.nc index 45d08d5e..930461f7 100644 Binary files a/tests/input_files/baselines/call_compute_subroutines.history_4p2z.nc and b/tests/input_files/baselines/call_compute_subroutines.history_4p2z.nc differ diff --git a/tests/input_files/baselines/call_compute_subroutines.history_with_abio_only.nc b/tests/input_files/baselines/call_compute_subroutines.history_with_abio_only.nc new file mode 100644 index 00000000..b44fecfc Binary files /dev/null and b/tests/input_files/baselines/call_compute_subroutines.history_with_abio_only.nc differ diff --git a/tests/input_files/baselines/call_compute_subroutines.history_with_ciso.nc b/tests/input_files/baselines/call_compute_subroutines.history_with_ciso.nc index 901b52f1..56bdc363 100644 Binary files a/tests/input_files/baselines/call_compute_subroutines.history_with_ciso.nc and b/tests/input_files/baselines/call_compute_subroutines.history_with_ciso.nc differ diff --git a/tests/input_files/settings/marbl_with_4p2z_cgs.settings b/tests/input_files/settings/marbl_with_4p2z_cgs.settings index 96d3f7da..9c3c19b5 100644 --- a/tests/input_files/settings/marbl_with_4p2z_cgs.settings +++ b/tests/input_files/settings/marbl_with_4p2z_cgs.settings @@ -1,3 +1,8 @@ +! tracer modules +abio_dic_on = .false. +base_bio_on = .true. +ciso_on = .false. + ! config PFTs PFT_defaults = "4p2z" autotroph_cnt = 4 @@ -5,8 +10,6 @@ max_grazer_prey_cnt = 4 zooplankton_cnt = 2 ! config flags -ciso_lsource_sink = .true. -ciso_on = .false. ladjust_bury_coeff = .false. lcheck_forcing = .false. lcompute_nhx_surface_emis = .true. @@ -30,7 +33,6 @@ bury_coeff_rmean_timescale_years = 10.0 caco3_bury_thres_depth = 3.0000000000000000e+05 caco3_bury_thres_omega_calc = 1.0 caco3_bury_thres_opt = "omega_calc" -ciso_fract_factors = "Laws" f_graze_CaCO3_remin = 0.5 gQ_Fe_kFe_thres = 10.0 gQ_Si_kSi_thres = 5.0 diff --git a/tests/input_files/settings/marbl_with_4p2z_mks.settings b/tests/input_files/settings/marbl_with_4p2z_mks.settings index 56bcf35c..38a627eb 100644 --- a/tests/input_files/settings/marbl_with_4p2z_mks.settings +++ b/tests/input_files/settings/marbl_with_4p2z_mks.settings @@ -1,3 +1,8 @@ +! tracer modules +abio_dic_on = .false. +base_bio_on = .true. +ciso_on = .false. + ! config PFTs PFT_defaults = "4p2z" autotroph_cnt = 4 @@ -5,8 +10,6 @@ max_grazer_prey_cnt = 4 zooplankton_cnt = 2 ! config flags -ciso_lsource_sink = .true. -ciso_on = .false. ladjust_bury_coeff = .false. lcheck_forcing = .false. lcompute_nhx_surface_emis = .true. @@ -30,7 +33,6 @@ bury_coeff_rmean_timescale_years = 10.0 caco3_bury_thres_depth = 3.0000000000000000e+03 caco3_bury_thres_omega_calc = 1.0 caco3_bury_thres_opt = "omega_calc" -ciso_fract_factors = "Laws" f_graze_CaCO3_remin = 0.5 gQ_Fe_kFe_thres = 10.0 gQ_Si_kSi_thres = 5.0 diff --git a/tests/input_files/settings/marbl_with_abio_only.settings b/tests/input_files/settings/marbl_with_abio_only.settings new file mode 100644 index 00000000..6abdb91d --- /dev/null +++ b/tests/input_files/settings/marbl_with_abio_only.settings @@ -0,0 +1,3 @@ +abio_dic_on = .true. +base_bio_on = .false. +labio_derivative_diags = .true.