#!/usr/bin/env python3

"""
Namelist creator for E3SM's MPAS OCEAN component
"""

import os, sys

_CIMEROOT = os.path.join(os.path.dirname(os.path.abspath(__file__)), "..","..","..","cime")
sys.path.append(os.path.join(_CIMEROOT, "scripts", "Tools"))

from standard_script_setup import *
from CIME.case import Case
from CIME.utils import expect, run_cmd_no_fail, safe_copy
from CIME.buildnml import create_namelist_infile, parse_input

logger = logging.getLogger(__name__)

###############################################################################
def buildnml(case, caseroot, compname):
###############################################################################
    expect(compname == "mpaso", compname)

    os.chdir(caseroot)

    cimeroot          = case.get_value("CIMEROOT")
    caseroot          = case.get_value("CASEROOT")
    casebuild         = case.get_value("CASEBUILD")
    casename          = case.get_value("CASE")
    srcroot           = case.get_value("SRCROOT")
    din_loc_root      = case.get_value("DIN_LOC_ROOT")
    compset           = case.get_value("COMPSET")
    ocn_grid          = case.get_value("OCN_GRID")
    ocn_mask          = case.get_value("MASK_GRID")
    ocn_forcing       = case.get_value("MPASO_FORCING")
    ocn_iceberg       = case.get_value("MPASO_ICEBERG")
    ocn_ismf          = case.get_value("MPASO_ISMF")
    ocn_bgc           = case.get_value("MPASO_BGC")
    ocn_wave          = case.get_value("MPASO_WAVE")
    ocn_co2_type      = case.get_value("OCN_CO2_TYPE")
    atm_co2_const_val = case.get_value("CCSM_CO2_PPMV")
    ice_bgc           = case.get_value("MPASI_BGC")
    ocn_pio_typename  = case.get_value("OCN_PIO_TYPENAME")
    ninst_ocn         = case.get_value("NINST_OCN")
    nthrds_ocn        = case.get_value("NTHRDS_OCN")
    ntasks_ocn        = case.get_value("NTASKS_PER_INST_OCN")
    rundir            = case.get_value("RUNDIR")
    run_type          = case.get_value("RUN_TYPE")
    run_refcase       = case.get_value("RUN_REFCASE")
    run_refdate       = case.get_value("RUN_REFDATE")
    run_reftod        = case.get_value("RUN_REFTOD")
    stream_name       = 'streams.ocean'

    mpasoconf_dir = os.path.join(casebuild, "mpasoconf")

    if not os.path.isdir(mpasoconf_dir): os.mkdir(mpasoconf_dir)

    #--------------------------------------------------------------------
    # Determine if initial conditions are spunup, from compset
    #--------------------------------------------------------------------
    ocn_ic_mode = 'default'
    if "SOI" in compset:
        ocn_ic_mode = 'spunup'

    #--------------------------------------------------------------------
    # Determine date stamp, from grid names
    #--------------------------------------------------------------------

    decomp_date = ''
    decomp_prefix = ''
    ic_date = ''
    ic_prefix = ''
    restoring_file = ''
    data_ismf_file = ''
    analysis_mask_file = ''
    eco_forcing_file = ''

    if ocn_grid == 'oEC60to30v3':
        decomp_date = '230424'
        decomp_prefix = 'partitions/mpas-o.graph.info.'
        restoring_file = 'sss.monthlyClimatology.PHC2_salx_040803.oEC60to30v3.nc'
        analysis_mask_file = 'oEC60to30v3_Atlantic_region_and_southern_transect.nc'
        ic_date = '170905'
        ic_prefix = 'oEC60to30v3_60layer'
        if ocn_ic_mode == 'spunup':
            ic_date = '200927'
            ic_prefix = 'oEC60to30v3.restartFrom_anvilG'

    elif ocn_grid == 'oEC60to30v3wLI':
        decomp_date = '170328'
        decomp_prefix = 'mpas-o.graph.info.'
        restoring_file = 'sss.monthlyClimatology.PHC2_salx_040803.oEC60to30v3wLI.nc'
        analysis_mask_file = 'masks_SingleRegionAtlanticWTransportTransects_EC60to30v3wLI_171116.nc'
        ic_date = '230220'
        ic_prefix = 'oEC60to30v3wLI60lev'
        if ocn_ic_mode == 'spunup':
            ic_date = '230220'
            ic_prefix = 'oEC60to30v3wLI60lev.restart_theta_year26'

    elif ocn_grid == 'ECwISC30to60E1r2':
        decomp_date = '230314'
        decomp_prefix = 'partitions/mpas-o.graph.info.'
        restoring_file = 'sss.PHC2_monthlyClimatology.ECwISC30to60E1r02.200408.nc'
        analysis_mask_file = 'ECwISC30to60E1r02_transportTransects.nc'
        ic_date = '230220'
        ic_prefix = 'ocean.ECwISC30to60E1r2'
        if ocn_ic_mode == 'spunup':
            logger.warning("WARNING: The specified compset is requesting ocean ICs spunup from a G-case")
            logger.warning("         But no file available for this grid.")

    elif ocn_grid == 'oQU480':
        decomp_date = '230422'
        decomp_prefix = 'partitions/mpas-o.graph.info.'
        ic_date = '151209'
        ic_prefix = 'ocean.QU.480km'
        if ocn_ic_mode == 'spunup':
            logger.warning("WARNING: The specified compset is requesting ocean ICs spunup from a G-case")
            logger.warning("         But no file available for this grid.")

    elif ocn_grid == 'oQU240':
        decomp_date = '230422'
        decomp_prefix = 'partitions/mpas-o.graph.info.'
        ic_date = '151209'
        ic_prefix = 'ocean.QU.240km'
        if ocn_ic_mode == 'spunup':
            logger.warning("WARNING: The specified compset is requesting ocean ICs spunup from a G-case")
            logger.warning("         But no file available for this grid.")

    elif ocn_grid == 'oQU240wLI':
        decomp_date = '230422'
        decomp_prefix = 'partitions/mpas-o.graph.info.'
        ic_date = '230220'
        ic_prefix = 'ocean.QU.240wLI'
        if ocn_ic_mode == 'spunup':
            logger.warning("WARNING: The specified compset is requesting ocean ICs spunup from a G-case")
            logger.warning("         But no file available for this grid.")

    elif ocn_grid == 'oQU120':
        decomp_date = '230424'
        decomp_prefix = 'partitions/mpas-o.graph.info.'
        ic_date = '160318'
        ic_prefix = 'ocean.QU.120km'
        if ocn_ic_mode == 'spunup':
            logger.warning("WARNING: The specified compset is requesting ocean ICs spunup from a G-case")
            logger.warning("         But no file available for this grid.")

    elif ocn_grid == 'oRRS30to10v3':
        decomp_date = '171128'
        decomp_prefix = 'mpas-o.graph.info.'
        restoring_file = 'sss.monthlyClimatology.PHC2_salx_040803.oRRS30to10v3.nc'
        analysis_mask_file = 'oRRS30to10v3_mocBasinsAndTransects20210623.nc'
        ic_date = '171128'
        ic_prefix = 'oRRS30to10v3'
        if ocn_ic_mode == 'spunup':
            logger.warning("WARNING: The specified compset is requesting ocean ICs spunup from a G-case")
            logger.warning("         But no file available for this grid.")

    elif ocn_grid == 'oRRS30to10v3wLI':
        decomp_date = '171109'
        decomp_prefix = 'mpas-o.graph.info.'
        restoring_file = 'sss.monthlyClimatology.PHC2_salx.2004_08_03.180503.nc'
        analysis_mask_file = 'masks_SingleRegionAtlanticWTransportTransects_RRS30to10v3wLI.nc'
        ic_date = '230220'
        ic_prefix = 'oRRS30to10v3wLI'
        if ocn_ic_mode == 'spunup':
            logger.warning("WARNING: The specified compset is requesting ocean ICs spunup from a G-case")
            logger.warning("         But no file available for this grid.")

    elif ocn_grid == 'oRRS18to6v3':
        decomp_date = '230424'
        decomp_prefix = 'partitions/mpas-o.graph.info.'
        restoring_file = 'sss.monthlyClimatology.PHC2_salx_040803.oRRS18to6v3.nc'
        analysis_mask_file = 'oRRS18to6v3_mocBasinsAndTransects20210623.nc'
        ic_date = '171116'
        ic_prefix = 'oRRS18to6v3'
        if ocn_ic_mode == 'spunup':
            ic_date = '210321'
            ic_prefix = 'oRRS18to6v3_80Layer.restartFromChrysalis'

    elif ocn_grid == 'oRRS15to5':
        decomp_date = '151209'
        decomp_prefix = 'mpas-o.graph.info.'
        ic_date = '151209'
        ic_prefix = 'ocean.RRS.15-5km'
        if ocn_ic_mode == 'spunup':
            logger.warning("WARNING: The specified compset is requesting ocean ICs spunup from a G-case")
            logger.warning("         But no file available for this grid.")

    elif ocn_grid == 'oARRM60to10':
        decomp_date = '180723'
        decomp_prefix = 'mpas-o.graph.info.'
        restoring_file = 'sss.monthlyClimatology.PHC2_salx.2004_08_03.ARRM60to10.190129.nc'
        analysis_mask_file = 'ARRM60to10_mocBasinsAndTransects20210623.nc'
        ic_date = '180715'
        ic_prefix = 'ocean.ARRM60to10'
        if ocn_ic_mode == 'spunup':
            ic_date = '210204'
            ic_prefix = 'mpaso.oARRM60to10.rstFromG-cori'

    elif ocn_grid == 'oARRM60to6':
        decomp_date = '180820'
        decomp_prefix = 'mpas-o.graph.info.'
        restoring_file = 'sss.monthlyClimatology.PHC2_salx.2004_08_03.ARRM60to6.190214.nc'
        analysis_mask_file = 'ARRM60to6_SingleRegionAtlanticWTransportTransects_masks.nc'
        ic_date = '180803'
        ic_prefix = 'ocean.ARRM60to6'
        if ocn_ic_mode == 'spunup':
            logger.warning("WARNING: The specified compset is requesting ocean ICs spunup from a G-case")
            logger.warning("         But no file available for this grid.")

    elif ocn_grid == 'ARRM10to60E2r1':
        decomp_date = '220730'
        decomp_prefix = 'mpas-o.graph.info.'
        restoring_file = 'sss.PHC3.0_monthlyClimatology.ARRM10to60E2r1.220802.nc'
        analysis_mask_file = 'ARRM10to60E2r1_mocBasinsAndTransects20210623.nc'
        ic_date = '220730'
        ic_prefix = 'mpaso.ARRM10to60E2r1'
        if ocn_ic_mode == 'spunup':
            ic_date = '220802'
            ic_prefix = 'mpaso.ARRM10to60E2r1.rstFrom1monthG-chrys'

    elif ocn_grid == 'EC30to60E2r2':
        decomp_date = '230313'
        decomp_prefix = 'partitions/mpas-o.graph.info.'
        restoring_file = 'sss.PHC2_monthlyClimatology.EC30to60E2r2.200910.nc'
        analysis_mask_file = 'EC30to60E2r2_mocBasinsAndTransects20210623.nc'
        ic_date = '210210'
        ic_prefix = 'ocean.EC30to60E2r2'
        if ocn_ic_mode == 'spunup':
            ic_date = '201001'
            ic_prefix = 'mpaso.EC30to60E2r2.rstFromG-anvil'
        #  modify initial condition file if ocean BGC is turned on
        if ocn_bgc in ['eco_only', 'eco_and_dms', 'eco_and_macromolecules', 'eco_and_dms_and_macromolecules']:
            ic_date = '211030'
            ic_prefix = 'ocean.EC30to60E2r2.210210+MARBL_ICfromOMIP+ecoAux+5xFESED'
            eco_forcing_file = 'ecoForcingSurfaceMonthly.EC30to60E2r2.20201221.nc'

    elif ocn_grid == 'WC14to60E2r3':
        decomp_date = '230313'
        decomp_prefix = 'partitions/mpas-o.graph.info.'
        restoring_file = 'sss.PHC2_monthlyClimatology.WC14to60E2r3.200715.nc'
        analysis_mask_file = 'WC14to60E2r3_mocBasinsAndTransects20210623.nc'
        ic_date = '210210'
        ic_prefix = 'ocean.WC14to60E2r3'
        if ocn_ic_mode == 'spunup':
            ic_date = '210226'
            ic_prefix = 'mpaso.WC14to60E2r3.rstFromG-anvil'

    elif ocn_grid == 'WCAtl12to45E2r4':
        decomp_date = '210318'
        decomp_prefix = 'mpas-o.graph.info.'
        restoring_file = 'sss.PHC2_monthlyClimatology.WCAtl12to45E2r4.210325.nc'
        analysis_mask_file = 'WCAtl12to45E2r4_moc_masks_and_transects.nc'
        ic_date = '210318'
        ic_prefix = 'ocean.WCAtl12to45E2r4'
        if ocn_ic_mode == 'spunup':
            ic_date = '210318'
            ic_prefix = 'mpaso.WCAtl12to45E2r4.rstFromG-anvil'

    elif ocn_grid == 'SOwISC12to60E2r4':
        decomp_date = '230314'
        decomp_prefix = 'partitions/mpas-o.graph.info.'
        restoring_file = 'sss.PHC2_monthlyClimatology.SOwISC12to60E2r4_nomask.210120.nc'
        analysis_mask_file = 'SOwISC12to60E2r4_mocBasinsAndTransects20210623.nc'
        ic_date = '230220'
        ic_prefix = 'ocean.SOwISC12to60E2r4'
        if ocn_ic_mode == 'spunup':
            ic_date = '230220'
            ic_prefix = 'mpaso.SOwISC12to60E2r4.rstFromG-anvil'
        if ocn_ismf == 'data':
            data_ismf_file = 'prescribed_ismf_adusumilli2020.SOwISC12to60E2r4.230516.nc'

    elif ocn_grid == 'ECwISC30to60E2r1':
        decomp_date = '200915'
        decomp_prefix = 'mpas-o.graph.info.'
        restoring_file = 'sss.PHC2_monthlyClimatology.ECwISC30to60E2r1_nomask.201221.nc'
        analysis_mask_file = 'ECwISC30to60E2r1_mocBasinsAndTransects20210623.nc'
        ic_date = '230220'
        ic_prefix = 'ocean.ECwISC30to60E2r1'
        if ocn_ic_mode == 'spunup':
            ic_date = '230220'
            ic_prefix = 'mpaso.ECwISC30to60E2r1.rstFromG-anvil'
        if ocn_ismf == 'data':
            data_ismf_file = 'prescribed_ismf_adusumilli2020.ECwISC30to60E2r1.230429.nc'

    #--------------------------------------------------------------------
    # Set OCN_FORCING = datm_forced_restoring if restoring file is available
    #--------------------------------------------------------------------
    if ocn_forcing == 'datm_forced':
        if restoring_file != '':
            ocn_forcing = 'datm_forced_restoring'
        else:
            logger.warning("WARNING: Should be running with salinity restoring on!")
            logger.warning("         But no file available for this grid.")

    #--------------------------------------------------------------------
    # Set the initial file
    #--------------------------------------------------------------------

    input_file = "{}/ocn/mpas-o/{}/{}.{}.nc".format(din_loc_root, ocn_mask, ic_prefix, ic_date)

    #--------------------------------------------------------------------
    # Generate input data file with stream-specified files
    #--------------------------------------------------------------------

    with open(os.path.join(casebuild, "mpaso.input_data_list"), "w") as input_list:

        input_list.write("mesh = {}/ocn/mpas-o/{}/{}.{}.nc\n".format(din_loc_root, ocn_mask, ic_prefix, ic_date))
        input_list.write("ic = {}\n".format(input_file))
        if analysis_mask_file != '':
            input_list.write("moc = {}/ocn/mpas-o/{}/{}\n".format(din_loc_root, ocn_mask, analysis_mask_file))

        if ocn_forcing == 'datm_forced_restoring':
            input_list.write("sss = {}/ocn/mpas-o/{}/{}\n".format(din_loc_root, ocn_mask, restoring_file))

        if eco_forcing_file != '':
            input_list.write("eco_forcing = {}/ocn/mpas-o/{}/{}\n".format(din_loc_root, ocn_mask, eco_forcing_file))

        if data_ismf_file != '':
            input_list.write("data_ismf = {}/ocn/mpas-o/{}/{}\n".format(din_loc_root, ocn_mask, data_ismf_file))

    #--------------------------------------------------------------------
    # Invoke mpas build-namelist - output will go in $CASEBUILD/mpasoconf
    #--------------------------------------------------------------------

    inst_string = ""
    for inst_counter in range(1, ninst_ocn + 1):

        # -----------------------------------------------------
        # determine instance string
        # -----------------------------------------------------

        inst_string = ""
        if ninst_ocn > 1:
            inst_string = "_{0:04d}".format(inst_counter)

            # If multi-instance case does not have restart file, use single-case restart
            # for each instance
            if not os.path.exists(os.path.join(rundir, "rpointer.ocn{}".format(inst_string))) and \
                   os.path.exists(os.path.join(rundir, "rpointer.ocn")):
                safe_copy(os.path.join(rundir, "rpointer.ocn"),
                          os.path.join(rundir, "rpointer.ocn{}".format(inst_string)))

        stream_name_inst = f"{stream_name}{inst_string}"

        #--------------------------------------------------------------------
        # Change the initial file to a restart file for branch and hybrid runs
        #--------------------------------------------------------------------

        if run_type == 'hybrid' or run_type == 'branch':
            input_file = "{}/{}.mpaso{}.rst.{}_{}.nc".format(rundir, run_refcase, inst_string, run_refdate, run_reftod)
            expect(os.path.exists(input_file), "ERROR mpaso buildnml: missing specified restart file for branch or hybrid run: " + input_file)
            restart_file = "{}/{}.mpaso{}.rst.{}_{}.nc".format(rundir, casename, inst_string, run_refdate, run_reftod)
            if not os.path.exists(restart_file):
                safe_copy(input_file, restart_file)

        # -----------------------------------------------------
        # create mpasoconf/cesm_namelist
        # -----------------------------------------------------

        create_namelist_infile(case,
                               "{}/user_nl_mpaso{}".format(caseroot, inst_string),
                               "{}/cesm_namelist".format(mpasoconf_dir))

        # -----------------------------------------------------
        # call build-namelist- output will go in $CASEBUILD/mpasoconf/mpaso_in
        # -----------------------------------------------------

        sysmod =  "{}/components/mpas-ocean/bld/build-namelist".format(srcroot)
        sysmod += " -infile {}/cesm_namelist".format(mpasoconf_dir)
        sysmod += " -caseroot {}".format(caseroot)
        sysmod += " -casebuild {}".format(casebuild)
        sysmod += " -cimeroot {}".format(cimeroot)
        sysmod += " -inst_string '{}'".format(inst_string)
        sysmod += " -decomp_prefix '{}'".format(decomp_prefix)
        sysmod += " -date_stamp '{}'".format(decomp_date)
        sysmod += " -ocn_grid '{}'".format(ocn_mask)
        sysmod += " -ocn_forcing '{}'".format(ocn_forcing)
        sysmod += " -ocn_iceberg '{}'".format(ocn_iceberg)
        sysmod += " -ocn_ismf '{}'".format(ocn_ismf)
        sysmod += " -ocn_bgc '{}'".format(ocn_bgc)
        sysmod += " -ocn_wave '{}'".format(ocn_wave)
        sysmod += " -ocn_co2_type '{}'".format(ocn_co2_type)
        sysmod += " -atm_co2_const_val '{}'".format(atm_co2_const_val)
        sysmod += " -ice_bgc '{}'".format(ice_bgc)
        sysmod += " -ntasks_ocn '{}'".format(ntasks_ocn)
        sysmod += " -ninst_ocn '{}'".format(ninst_ocn)
        # pass in OCN_MASK for now as a short-cut for the grid
        # at some point, we may want to pass both -- but for now this is simpler

        run_cmd_no_fail(sysmod, from_dir=mpasoconf_dir)

        # -----------------------------------------------------
        # Copy resolved namelist to $RUNDIR
        # -----------------------------------------------------

        default_in_filename = "mpaso_in"
        in_filename = "{}{}".format(default_in_filename, inst_string)
        if os.path.isdir(rundir):
            safe_copy(os.path.join(mpasoconf_dir, "mpaso_in"), os.path.join(rundir, in_filename))

        # Write streams file if there isn't one in SourceMods

        if os.path.exists(os.path.join(caseroot, "SourceMods/src.mpaso", stream_name_inst)):
            safe_copy(os.path.join(caseroot, "SourceMods/src.mpaso", stream_name_inst), os.path.join(rundir, stream_name_inst))
        else:
            lines = []
            lines.append('<streams>')
            lines.append('')
            lines.append('<immutable_stream name="mesh"')
            lines.append('                  type="none"')
            if ocn_grid.startswith("oRRS1"):
                lines.append('                  io_type="pnetcdf,cdf5"')
            else:
                lines.append('                  io_type="{}"'.format(ocn_pio_typename))

            lines.append('                  filename_template="{}/ocn/mpas-o/{}/{}.{}.nc"'.format(din_loc_root, ocn_mask, ic_prefix, ic_date))
            lines.append('/>')
            lines.append('<immutable_stream name="input"')
            lines.append('                  type="input"')
            if ocn_grid.startswith("oRRS1"):
                lines.append('                  io_type="pnetcdf,cdf5"')
            else:
                lines.append('                  io_type="{}"'.format(ocn_pio_typename))

            lines.append('                  input_interval="initial_only"')
            lines.append('                  filename_template="{}"'.format(input_file))
            lines.append('/>')
            lines.append('')
            lines.append('<!--')
            lines.append('The restart stream is actually controlled via the coupler.')
            lines.append('Changing output_interval here will not have any affect on')
            lines.append('the frequency restart files are written.')
            lines.append('')
            lines.append('Changing the output_interval could cause loss of data.')
            lines.append('')
            lines.append('The output_interval is set to 1 second to ensure each restart frame has a')
            lines.append('unique file.')
            lines.append('-->')
            lines.append('<immutable_stream name="restart"')
            lines.append('                  type="input;output"')
            if ocn_grid.startswith("oRRS1"):
                lines.append('                  io_type="pnetcdf,cdf5"')
            else:
                lines.append('                  io_type="{}"'.format(ocn_pio_typename))

            lines.append('                  filename_template="{}.mpaso{}.rst.$Y-$M-$D_$S.nc"'.format(casename, inst_string))
            lines.append('                  filename_interval="output_interval"')
            lines.append('                  clobber_mode="truncate"')
            lines.append('                  input_interval="initial_only"')
            lines.append('                  reference_time="01-01-01_00:00:00"')
            lines.append('                  output_interval="00-00-00_00:00:01"/>')
            lines.append('')
            lines.append('<!--')
            lines.append('output is the main history output stream. You can add auxiliary streams to')
            lines.append('this stream to include more fields.')
            lines.append('-->')
            lines.append('')
            lines.append('<stream name="output"')
            lines.append('        type="output"')
            if ocn_grid.startswith("oRRS1"):
                lines.append('        io_type="pnetcdf,cdf5"')
            else:
                lines.append('        io_type="{}"'.format(ocn_pio_typename))

            lines.append('        filename_template="{}.mpaso{}.hist.$Y-$M-$D_$S.nc"'.format(casename, inst_string))
            lines.append('        filename_interval="00-01-00_00:00:00"')
            lines.append('        clobber_mode="truncate"')
            lines.append('        reference_time="01-01-01_00:00:00"')
            lines.append('        output_interval="none">')
            lines.append('')
            lines.append('    <var_array name="activeTracerHorizontalAdvectionTendency"/>')
            lines.append('    <var_array name="activeTracerVerticalAdvectionTendency"/>')
            lines.append('    <var_array name="activeTracerVertMixTendency"/>')
            lines.append('    <var_array name="activeTracerSurfaceFluxTendency"/>')
            lines.append('    <var_array name="temperatureShortWaveTendency"/>')
            lines.append('    <var_array name="activeTracerNonLocalTendency"/>')
            lines.append('    <var name="salinitySurfaceRestoringTendency"/>')
            lines.append('    <var name="vertTransportVelocityTop"/>')
            lines.append('    <var name="vertGMBolusVelocityTop"/>')
            lines.append('    <var name="vertAleTransportTop"/>')
            lines.append('    <var name="tendSSH"/>')
            lines.append('    <var_array name="activeTracers"/>')
            lines.append('    <var name="layerThickness"/>')
            lines.append('    <var name="normalVelocity"/>')
            lines.append('    <var name="ssh"/>')
            lines.append('    <var name="maxLevelEdgeTop"/>')
            lines.append('    <var name="vertCoordMovementWeights"/>')
            lines.append('    <var name="edgeMask"/>')
            lines.append('    <var name="cellMask"/>')
            lines.append('    <var name="vertexMask"/>')
            lines.append('    <var name="refZMid"/>')
            lines.append('    <var name="refLayerThickness"/>')
            lines.append('    <var name="xtime"/>')
            lines.append('    <var name="kineticEnergyCell"/>')
            lines.append('    <var name="relativeVorticityCell"/>')
            lines.append('    <var name="relativeVorticity"/>')
            lines.append('    <var name="divergence"/>')
            lines.append('    <var name="areaCellGlobal"/>')
            lines.append('    <var name="areaEdgeGlobal"/>')
            lines.append('    <var name="areaTriangleGlobal"/>')
            lines.append('    <var name="volumeCellGlobal"/>')
            lines.append('    <var name="volumeEdgeGlobal"/>')
            lines.append('    <var name="CFLNumberGlobal"/>')
            lines.append('    <var name="BruntVaisalaFreqTop"/>')
            lines.append('    <var name="vertVelocityTop"/>')
            lines.append('    <var name="velocityZonal"/>')
            lines.append('    <var name="velocityMeridional"/>')
            lines.append('    <var name="displacedDensity"/>')
            lines.append('    <var name="potentialDensity"/>')
            lines.append('    <var name="pressure"/>')
            lines.append('    <var name="refBottomDepth"/>')
            lines.append('    <var name="zMid"/>')
            lines.append('    <var name="bottomDepth"/>')
            lines.append('    <var name="maxLevelCell"/>')
            lines.append('    <var name="maxLevelEdgeTop"/>')
            lines.append('    <var name="maxLevelEdgeBot"/>')
            lines.append('    <var name="columnIntegratedSpeed"/>')
            lines.append('    <var name="landIceFreshwaterFlux"/>')
            lines.append('    <var name="landIceHeatFlux"/>')
            lines.append('    <var name="heatFluxToLandIce"/>')
            if ocn_bgc in ['eco_only', 'eco_and_dms', 'eco_and_macromolecules', 'eco_and_dms_and_macromolecules']:
                lines.append('    <var_struct name="ecosysDiagFieldsLevel1"/>')
                lines.append('    <var_struct name="ecosysAuxiliary"/>')

            lines.append('</stream>')
            lines.append('')
            lines.append('<!--')
            lines.append('Block debugging stream produces a file per core where errors have occured.')
            lines.append('-->')
            lines.append('')
            lines.append('<stream name="block_debug_output"')
            lines.append('        type="output"')
            lines.append('        io_type="{}"'.format(ocn_pio_typename))
            lines.append('        filename_template="{}.mpaso{}.output_debug_block_$B.nc"'.format(casename, inst_string))
            lines.append('        reference_time="01-01-01_00:00:00"')
            lines.append('        filename_interval="1000-00-00_00:00:00"')
            lines.append('        clobber_mode="truncate"')
            lines.append('        output_interval="1000-00-00_00:00:00">')
            lines.append('')
            lines.append('    <stream name="mesh"/>')
            lines.append('    <var name="xtime"/>')
            lines.append('    <var_struct name="tracers"/>')
            lines.append('    <var name="layerThickness"/>')
            lines.append('    <var name="normalVelocity"/>')
            lines.append('    <var name="ssh"/>')
            lines.append('')
            lines.append('</stream>')
            lines.append('')
            lines.append('<!--')
            lines.append('Streams between this line and the auxiliary stream line below are analysis member streams.')
            lines.append('They can be used to perform online analysis of the simulation and control the output of')
            lines.append('the analysis data.')
            lines.append('-->')
            lines.append('')
            if ocn_forcing == 'datm_forced_restoring':
                lines.append('<stream name="surface_salinity_monthly_data"')
                lines.append('       type="input"')
                lines.append('       io_type="{}"'.format(ocn_pio_typename))
                lines.append('       filename_template="{}/ocn/mpas-o/{}/{}"'.format(din_loc_root, ocn_mask, restoring_file))
                lines.append('       input_interval="none"')
                lines.append('       packages="activeTracersSurfaceRestoringPKG">')
                lines.append('')
                lines.append('       <var name="xtime"/>')
                lines.append('       <var name="surfaceSalinityMonthlyClimatologyValue"/>')
                lines.append('</stream>')
                lines.append('')

            if analysis_mask_file != '':
                lines.append('<stream name="transectMasksInput"')
                lines.append('        type="input"')
                lines.append('        io_type="{}"'.format(ocn_pio_typename))
                lines.append('        filename_template="{}/ocn/mpas-o/{}/{}"'.format(din_loc_root, ocn_mask, analysis_mask_file))
                lines.append('        input_interval="initial_only">')
                lines.append('')
                lines.append('        <var name="transectEdgeMasks"/>')
                lines.append('        <var name="transectNames"/>')
                lines.append('        <var name="nTransectsInGroup"/>')
                lines.append('        <var name="transectsInGroup"/>')
                lines.append('        <var name="transectGroupNames"/>')
                lines.append('        <var name="transectEdgeMaskSigns"/>')
                lines.append('</stream>')
                lines.append('')
                lines.append('<stream name="regionalMasksInput"')
                lines.append('        type="input"')
                lines.append('        io_type="{}"'.format(ocn_pio_typename))
                lines.append('        filename_template="{}/ocn/mpas-o/{}/{}"'.format(din_loc_root, ocn_mask, analysis_mask_file))
                lines.append('        input_interval="initial_only">')
                lines.append('')
                lines.append('        <var name="regionCellMasks"/>')
                lines.append('        <var name="regionNames"/>')
                lines.append('        <var name="nRegionsInGroup"/>')
                lines.append('        <var name="regionsInGroup"/>')
                lines.append('        <var name="regionGroupNames"/>')
                lines.append('</stream>')
                lines.append('')

            lines.append('<stream name="mocStreamfunctionOutput"')
            lines.append('        type="output"')
            lines.append('        io_type="{}"'.format(ocn_pio_typename))
            lines.append('        filename_template="{}.mpaso{}.hist.am.mocStreamfunctionOutput.$Y-$M-$D.nc"'.format(casename, inst_string))
            lines.append('        filename_interval="01-00-00_00:00:00"')
            lines.append('        clobber_mode="truncate"')
            lines.append('        reference_time="01-01-01_00:00:00"')
            lines.append('        output_interval="none"')
            lines.append('        packages="mocStreamfunctionAMPKG">')
            lines.append('')
            lines.append('        <var name="xtime"/>')
            lines.append('        <var name="mocStreamvalLatAndDepth"/>')
            lines.append('        <var name="mocStreamvalLatAndDepthRegion"/>')
            lines.append('        <var name="binBoundaryMocStreamfunction"/>')
            lines.append('        <var name="refBottomDepth"/>')
            lines.append('        <var name="regionGroupNames"/>')
            lines.append('        <var name="minMaxLatRegion"/>')
            lines.append('        <var name="regionNames"/>')
            lines.append('        <var name="nRegionsInGroup"/>')
            lines.append('        <var name="regionsInGroup"/>')
            lines.append('</stream>')
            lines.append('')
            lines.append('<stream name="globalStatsOutput"')
            lines.append('        type="output"')
            lines.append('        io_type="netcdf"')
            lines.append('        filename_template="{}.mpaso{}.hist.am.globalStats.$Y-$M-$D.nc"'.format(casename, inst_string))
            lines.append('        filename_interval="00-01-00_00:00:00"')
            lines.append('        reference_time="01-01-01_00:00:00"')
            lines.append('        output_interval="00-00-01_00:00:00"')
            lines.append('        clobber_mode="truncate"')
            lines.append('        packages="globalStatsAMPKG">')
            lines.append('')
            lines.append('    <var name="xtime"/>')
            lines.append('    <var name="daysSinceStartOfSim"/>')
            lines.append('    <var name="totalVolumeChange"/>')
            lines.append('    <var name="absoluteFreshWaterConservation"/>')
            lines.append('    <var name="netFreshwaterInput"/>')
            lines.append('    <var_array name="minGlobalStats"/>')
            lines.append('    <var_array name="maxGlobalStats"/>')
            lines.append('    <var_array name="sumGlobalStats"/>')
            lines.append('    <var_array name="rmsGlobalStats"/>')
            lines.append('    <var_array name="avgGlobalStats"/>')
            lines.append('    <var_array name="vertSumMinGlobalStats"/>')
            lines.append('    <var_array name="vertSumMaxGlobalStats"/>')
            lines.append('    <var name="volumeCellGlobal"/>')
            lines.append('    <var name="CFLNumberGlobal"/>')
            lines.append('</stream>')
            lines.append('')
            lines.append('<stream name="surfaceAreaWeightedAveragesOutput"')
            lines.append('        type="output"')
            lines.append('        io_type="netcdf"')
            lines.append('        filename_template="{}.mpaso{}.hist.am.surfaceAreaWeightedAverages.$Y-$M-$D.nc"'.format(casename, inst_string))
            lines.append('        filename_interval="00-01-00_00:00:00"')
            lines.append('        reference_time="01-01-01_00:00:00"')
            lines.append('        output_interval="none"')
            lines.append('        clobber_mode="truncate"')
            lines.append('        packages="surfaceAreaWeightedAveragesAMPKG">')
            lines.append('')
            lines.append('    <var name="xtime"/>')
            lines.append('    <var name="daysSinceStartOfSim"/>')
            lines.append('    <var_array name="minValueWithinOceanRegion"/>')
            lines.append('    <var_array name="maxValueWithinOceanRegion"/>')
            lines.append('    <var_array name="avgValueWithinOceanRegion"/>')
            lines.append('</stream>')
            lines.append('')
            lines.append('<stream name="waterMassCensusOutput"')
            lines.append('        type="output"')
            lines.append('        io_type="{}"'.format(ocn_pio_typename))
            lines.append('        filename_template="{}.mpaso{}.hist.am.waterMassCensus.$Y-$M-$D.nc"'.format(casename, inst_string))
            lines.append('        filename_interval="00-01-00_00:00:00"')
            lines.append('        reference_time="01-01-01_00:00:00"')
            lines.append('        output_interval="none"')
            lines.append('        clobber_mode="truncate"')
            lines.append('        packages="waterMassCensusAMPKG">')
            lines.append('')
            lines.append('    <var name="xtime"/>')
            lines.append('    <var name="daysSinceStartOfSim"/>')
            lines.append('    <var_array name="waterMassCensusTemperatureValues"/>')
            lines.append('    <var_array name="waterMassCensusSalinityValues"/>')
            lines.append('    <var_array name="waterMassFractionalDistribution"/>')
            lines.append('    <var_array name="potentialDensityOfTSDiagram"/>')
            lines.append('    <var_array name="zPositionOfTSDiagram"/>')
            lines.append('</stream>')
            lines.append('')
            lines.append('<stream name="layerVolumeWeightedAverageOutput"')
            lines.append('        type="output"')
            lines.append('        io_type="{}"'.format(ocn_pio_typename))
            lines.append('        filename_template="{}.mpaso{}.hist.am.layerVolumeWeightedAverage.$Y-$M-$D.nc"'.format(casename, inst_string))
            lines.append('        filename_interval="00-01-00_00:00:00"')
            lines.append('        reference_time="01-01-01_00:00:00"')
            lines.append('        output_interval="none"')
            lines.append('        clobber_mode="truncate"')
            lines.append('        packages="layerVolumeWeightedAverageAMPKG">')
            lines.append('')
            lines.append('    <var name="xtime"/>')
            lines.append('    <var name="daysSinceStartOfSim"/>')
            lines.append('    <var_array name="minValueWithinOceanLayerRegion"/>')
            lines.append('    <var_array name="maxValueWithinOceanLayerRegion"/>')
            lines.append('    <var_array name="avgValueWithinOceanLayerRegion"/>')
            lines.append('    <var_array name="minValueWithinOceanVolumeRegion"/>')
            lines.append('    <var_array name="maxValueWithinOceanVolumeRegion"/>')
            lines.append('    <var_array name="avgValueWithinOceanVolumeRegion"/>')
            lines.append('</stream>')
            lines.append('')
            lines.append('<stream name="zonalMeanOutput"')
            lines.append('        type="output"')
            lines.append('        io_type="{}"'.format(ocn_pio_typename))
            lines.append('        filename_template="{}.mpaso{}.hist.am.zonalMeans.$Y-$M-$D.nc"'.format(casename, inst_string))
            lines.append('        filename_interval="00-01-00_00:00:00"')
            lines.append('        reference_time="01-01-01_00:00:00"')
            lines.append('        output_interval="none"')
            lines.append('        ulobber_mode="truncate"')
            lines.append('        packages="zonalMeanAMPKG">')
            lines.append('')
            lines.append('    <var name="xtime"/>')
            lines.append('    <var name="daysSinceStartOfSim"/>')
            lines.append('    <var_array name="tracersZonalMean"/>')
            lines.append('    <var name="binCenterZonalMean"/>')
            lines.append('    <var name="binBoundaryZonalMean"/>')
            lines.append('    <var name="velocityZonalZonalMean"/>')
            lines.append('    <var name="velocityMeridionalZonalMean"/>')
            lines.append('    <var name="refZMid"/>')
            lines.append('    <var name="refBottomDepth"/>')
            lines.append('</stream>')
            lines.append('')
            lines.append('<stream name="meridionalHeatTransportOutput"')
            lines.append('        type="output"')
            lines.append('        io_type="{}"'.format(ocn_pio_typename))
            lines.append('        filename_template="{}.mpaso{}.hist.am.meridionalHeatTransport.$Y-$M-$D.nc"'.format(casename, inst_string))
            lines.append('        filename_interval="00-01-00_00:00:00"')
            lines.append('        reference_time="01-01-01_00:00:00"')
            lines.append('        output_interval="00-01-00_00:00:00"')
            lines.append('        clobber_mode="truncate"')
            lines.append('        packages="meridionalHeatTransportAMPKG">')
            lines.append('')
            lines.append('    <var name="xtime"/>')
            lines.append('    <var name="daysSinceStartOfSim"/>')
            lines.append('    <var name="binBoundaryMerHeatTrans"/>')
            lines.append('    <var name="meridionalHeatTransportLatZ"/>')
            lines.append('    <var name="meridionalHeatTransportLat"/>')
            lines.append('    <var name="refZMid"/>')
            lines.append('    <var name="refBottomDepth"/>')
            lines.append('</stream>')
            lines.append('')
            lines.append('<stream name="eddyProductVariablesOutput"')
            lines.append('        type="output"')
            lines.append('        precision="single"')
            if ocn_grid.startswith("oRRS1"):
                lines.append('        io_type="pnetcdf,cdf5"')
            else:
                lines.append('        io_type="{}"'.format(ocn_pio_typename))

            lines.append('        filename_template="{}.mpaso{}.hist.am.eddyProductVariables.$Y-$M-$D.nc"'.format(casename, inst_string))
            lines.append('        filename_interval="00-01-00_00:00:00"')
            lines.append('        reference_time="01-01-01_00:00:00"')
            lines.append('        output_interval="00-01-00_00:00:00"')
            lines.append('        clobber_mode="truncate"')
            lines.append('        packages="eddyProductVariablesAMPKG">')
            lines.append('')
            lines.append('    <var name="xtime"/>')
            lines.append('    <var name="SSHSquared"/>')
            lines.append('    <var name="velocityZonalSquared"/>')
            lines.append('    <var name="velocityMeridionalSquared"/>')
            lines.append('    <var name="normalVelocitySquared"/>')
            lines.append('    <var name="velocityZonalTimesTemperature"/>')
            lines.append('    <var name="velocityMeridionalTimesTemperature"/>')
            lines.append('    <var name="normalVelocityTimesTemperature"/>')
            lines.append('    <var name="velocityZonalTimesSalinity"/>')
            lines.append('    <var name="velocityMeridionalTimesSalinity"/>')
            lines.append('    <var name="normalVelocityTimesSalinity"/>')
            lines.append('</stream>')
            lines.append('')
            lines.append('<stream name="highFrequencyOutput"')
            lines.append('        type="output"')
            lines.append('        precision="single"')
            lines.append('        io_type="{}"'.format(ocn_pio_typename))
            lines.append('        filename_template="{}.mpaso{}.hist.am.highFrequencyOutput.$Y-$M-$D_$h.$m.$s.nc"'.format(casename, inst_string))
            lines.append('        filename_interval="00-01-00_00:00:00"')
            lines.append('        reference_time="01-01-01_00:00:00"')
            lines.append('        output_interval="00-00-05_00:00:00"')
            lines.append('        clobber_mode="truncate"')
            lines.append('        packages="highFrequencyOutputAMPKG">')
            lines.append('')
            lines.append('    <var name="xtime"/>')
            lines.append('    <var name="daysSinceStartOfSim"/>')
            lines.append('    <var_array name="activeTracersAtSurface"/>')
            lines.append('    <var_array name="activeTracersAt250m"/>')
            lines.append('    <var_array name="activeTracersAtBottom"/>')
            lines.append('    <var name="kineticEnergyAtSurface"/>')
            lines.append('    <var name="kineticEnergyAt250m"/>')
            lines.append('    <var name="relativeVorticityAt250m"/>')
            lines.append('    <var name="ssh"/>')
            lines.append('    <var name="pressureAdjustedSSH"/>')
            lines.append('    <var name="boundaryLayerDepth"/>')
            lines.append('    <var name="dThreshMLD"/>')
            lines.append('    <var name="tThreshMLD"/>')
            lines.append('    <var name="columnIntegratedSpeed"/>')
            lines.append('    <var name="barotropicSpeed"/>')
            lines.append('    <var name="landIceFreshwaterFlux"/>')
            lines.append('    <var name="pressureAdjustedSSH"/>')
            lines.append('    <var name="atmosphericPressure"/>')
            if ocn_bgc in ['eco_only', 'eco_and_dms', 'eco_and_macromolecules', 'eco_and_dms_and_macromolecules']:
                lines.append('    <var name="CO2_gas_flux"/>')
                lines.append('    <var name="CO2_alt_gas_flux"/>')
                lines.append('    <var name="avgOceanSurfacePhytoC"/>')
                lines.append('    <var name="avgOceanSurfaceDIC"/>')
                lines.append('    <var name="avgOceanSurfaceNO3"/>')
                lines.append('    <var name="avgOceanSurfaceSiO3"/>')
                lines.append('    <var name="avgOceanSurfaceNH4"/>')
                lines.append('    <var name="avgOceanSurfaceDOCr"/>')
                lines.append('    <var name="avgOceanSurfaceFeDissolved"/>')
                lines.append('    <var name="iceFluxPhytoC"/>')
                lines.append('    <var name="iceFluxNO3"/>')
                lines.append('    <var name="iceFluxSiO3"/>')
                lines.append('    <var name="iceFluxNH4"/>')
                lines.append('    <var name="iceFluxFeDissolved"/>')
                lines.append('    <var name="iceFluxDOC"/>')
                lines.append('    <var name="ecosys_diag_photoC_TOT_zint"/>')
            lines.append('</stream>')
            lines.append('')
            if ocn_wave == 'true':
                lines.append('<stream name="waveOutput"')
                lines.append('        type="output"')
                lines.append('        precision="single"')
                lines.append('        io_type="pnetcdf"')
                lines.append('        filename_template="{}.mpaso{}.waveOutput.$Y-$M-$D_$h.$m.$s.nc"'.format(casename, inst_string))
                lines.append('        filename_interval="00-01-00_00:00:00"')
                lines.append('        reference_time="01-01-01_00:00:00"')
                lines.append('        output_interval="00-00-00_6:00:00"')
                lines.append('        clobber_mode="truncate"')
                lines.append('        packages="highFrequencyOutputAMPKG">')
                lines.append('')
                lines.append('    <stream name="mesh"/>')
                lines.append('    <var name="peakWaveFrequency"/>')
                lines.append('    <var name="peakWaveDirection"/>')
                lines.append('    <var name="significantWaveHeight"/>')
                lines.append('    <var name="iceFraction"/>')
                lines.append('    <var name="stokesDriftSurfaceZonal"/>')
                lines.append('    <var name="stokesDriftSurfaceMeridional"/>')
                lines.append('</stream>')
                lines.append('')
            lines.append('<stream name="mixedLayerDepthsOutput"')
            lines.append('        type="output"')
            lines.append('        precision="single"')
            lines.append('        io_type="{}"'.format(ocn_pio_typename))
            lines.append('        filename_template="{}.mpaso{}.hist.am.mixedLayerDepths.$Y-$M-$D.nc"'.format(casename, inst_string))
            lines.append('        filename_interval="00-01-00_00:00:00"')
            lines.append('        reference_time="01-01-01_00:00:00"')
            lines.append('        output_interval="none"')
            lines.append('        clobber_mode="truncate"')
            lines.append('        packages="mixedLayerDepthsAMPKG">')
            lines.append('')
            lines.append('    <var name="xtime"/>')
            lines.append('    <var name="daysSinceStartOfSim"/>')
            lines.append('    <var name="tThreshMLD"/>')
            lines.append('    <var name="dThreshMLD"/>')
            lines.append('</stream>')
            lines.append('')
            lines.append('<stream name="oceanHeatContentOutput"')
            lines.append('        type="output"')
            lines.append('        precision="single"')
            lines.append('        io_type="{}"'.format(ocn_pio_typename))
            lines.append('        filename_template="{}.mpaso{}.hist.am.oceanHeatContent.$Y-$M-$D.nc"'.format(casename, inst_string))
            lines.append('        filename_interval="00-01-00_00:00:00"')
            lines.append('        reference_time="01-01-01_00:00:00"')
            lines.append('        output_interval="00-01-00_00:00:00"')
            lines.append('        clobber_mode="truncate"')
            lines.append('        packages="oceanHeatContentAMPKG">')
            lines.append('')
            lines.append('    <var name="xtime"/>')
            lines.append('    <var name="oceanHeatContentSfcToBot"/>')
            lines.append('    <var name="oceanHeatContentSfcTo700m"/>')
            lines.append('    <var name="oceanHeatContent700mTo2000m"/>')
            lines.append('    <var name="oceanHeatContent2000mToBot"/>')
            lines.append('</stream>')
            lines.append('')
            lines.append('<stream name="mixedLayerHeatBudgetOutput"')
            lines.append('        type="output"')
            lines.append('        precision="single"')
            lines.append('        io_type="{}"'.format(ocn_pio_typename))
            lines.append('        filename_template="{}.mpaso{}.hist.am.mixedLayerHeatBudget.$Y-$M-$D.nc"'.format(casename, inst_string))
            lines.append('        filename_interval="00-01-00_00:00:00"')
            lines.append('        reference_time="01-01-01_00:00:00"')
            lines.append('        output_interval="none"')
            lines.append('        clobber_mode="truncate"')
            lines.append('        packages="mixedLayerHeatBudgetAMPKG">')
            lines.append('')
            lines.append('    <var name="xtime"/>')
            lines.append('    <var name="activeTracerForcingMLTend"/>')
            lines.append('    <var name="activeTracerHorMixMLTend"/>')
            lines.append('    <var name="activeTracerNonLocalMLTend"/>')
            lines.append('    <var name="activeTracerVertAdvectionMLTend"/>')
            lines.append('    <var name="activeTracerHorAdvectionMLTend"/>')
            lines.append('    <var name="activeTracerVertMixMLTend"/>')
            lines.append('    <var name="activeTracersML"/>')
            lines.append('    <var name="bruntVaisalaFreqML"/>')
            lines.append('    <var name="activeTracersTendML"/>')
            lines.append('</stream>')
            lines.append('')
            lines.append('<stream name="sedimentFluxIndexOutput"')
            lines.append('        type="output"')
            lines.append('        precision="single"')
            lines.append('        io_type="{}"'.format(ocn_pio_typename))
            lines.append('        filename_template="{}.mpaso{}.hist.am.sedimentFluxIndex.$Y-$M-$D.nc"'.format(casename, inst_string))
            lines.append('        filename_interval="00-01-00_00:00:00"')
            lines.append('        reference_time="01-01-01_00:00:00"')
            lines.append('        output_interval="none"')
            lines.append('        clobber_mode="truncate"')
            lines.append('        packages="sedimentFluxIndexAMPKG">')
            lines.append('')
            lines.append('    <var name="xtime"/>')
            lines.append('    <var name="sedimentFluxIndexVAX"/>')
            lines.append('    <var name="sedimentFluxIndexVAY"/>')
            lines.append('    <var name="sedimentFluxIndexBX"/>')
            lines.append('    <var name="sedimentFluxIndexBY"/>')
            lines.append('</stream>')
            lines.append('')
            lines.append('<stream name="sedimentTransportOutput"')
            lines.append('        type="output"')
            lines.append('        precision="single"')
            lines.append('        io_type="{}"'.format(ocn_pio_typename))
            lines.append('        filename_template="{}.mpaso{}.hist.am.sedimentTransport.$Y-$M-$D.nc"'.format(casename, inst_string))
            lines.append('        filename_interval="00-01-00_00:00:00"')
            lines.append('        reference_time="01-01-01_00:00:00"')
            lines.append('        output_interval="none"')
            lines.append('        clobber_mode="truncate"')
            lines.append('        packages="sedimentTransportAMPKG">')
            lines.append('')
            lines.append('    <var name="xtime"/>')
            lines.append('    <var name="ssh"/>')
            lines.append('    <var name="velocityZonal"/>')
            lines.append('    <var name="velocityMeridional"/>')
            lines.append('    <var name="sedimentErosionFlux"/>')
            lines.append('    <var name="sedimentFallVelocity"/>')
            lines.append('    <var name="sedimentDepositionFlux"/>')
            lines.append('    <var name="sedimentFluxVAX"/>')
            lines.append('    <var name="sedimentFluxVAY"/>')
            lines.append('    <var name="sedimentFluxBX"/>')
            lines.append('    <var name="sedimentFluxBY"/>')
            lines.append('    <var name="sedimentBedloadX"/>')
            lines.append('    <var name="sedimentBedloadY"/>')
            lines.append('    <var name="sedimentBottomReferenceConcentration"/>')
            lines.append('    <var name="sedimentConcentration"/>')
            lines.append('</stream>')
            lines.append('')
            lines.append('<stream name="harmonicAnalysisOutput"')
            lines.append('        type="output"')
            lines.append('        precision="single"')
            lines.append('        io_type="{}"'.format(ocn_pio_typename))
            lines.append('        filename_template="{}.mpaso{}.hist.am.harmonicAnalysis.$Y-$M-$D.nc"'.format(casename, inst_string))
            lines.append('        filename_interval="00-01-00_00:00:00"')
            lines.append('        reference_time="01-01-01_00:00:00"')
            lines.append('        output_interval="none"')
            lines.append('        clobber_mode="truncate"')
            lines.append('        packages="harmonicAnalysisAMPKG">')
            lines.append('')
            lines.append('    <var name="xtime"/>')
            lines.append('    <var name="M2Amplitude"/>')
            lines.append('    <var name="M2Phase"/>')
            lines.append('    <var name="S2Amplitude"/>')
            lines.append('    <var name="S2Phase"/>')
            lines.append('    <var name="N2Amplitude"/>')
            lines.append('    <var name="N2Phase"/>')
            lines.append('    <var name="K2Amplitude"/>')
            lines.append('    <var name="K2Phase"/>')
            lines.append('    <var name="K1Amplitude"/>')
            lines.append('    <var name="K1Phase"/>')
            lines.append('    <var name="O1Amplitude"/>')
            lines.append('    <var name="O1Phase"/>')
            lines.append('    <var name="Q1Amplitude"/>')
            lines.append('    <var name="Q1Phase"/>')
            lines.append('    <var name="P1Amplitude"/>')
            lines.append('    <var name="P1Phase"/>')
            lines.append('</stream>')
            lines.append('')
            lines.append('<stream name="harmonicAnalysisRestart"')
            lines.append('        type="input;output"')
            lines.append('        io_type="{}"'.format(ocn_pio_typename))
            lines.append('        filename_template="{}.mpaso{}.rst.am.harmonicAnalysis.$Y-$M-$D_$S.nc"'.format(casename, inst_string))
            lines.append('        filename_interval="output_interval"')
            lines.append('        clobber_mode="truncate"')
            lines.append('        input_interval="none"')
            lines.append('        packages="harmonicAnalysisAMPKG"')
            lines.append('        reference_time="01-01-01_00:00:00"')
            lines.append('        output_interval="none">')
            lines.append('')
            lines.append('    <var name="xtime"/>')
            lines.append('    <var name="leastSquaresLHSMatrix"/>')
            lines.append('    <var name="leastSquaresRHSVector"/>')
            lines.append('</stream>')
            lines.append('')
            lines.append('<stream name="conservationCheckOutput"')
            lines.append('        type="output"')
            lines.append('        io_type="{}"'.format(ocn_pio_typename))
            lines.append('        filename_template="{}.mpaso{}.hist.am.conservationCheck.$Y-$M-$D.nc"'.format(casename, inst_string))
            lines.append('        filename_interval="00-01-00_00:00:00"')
            lines.append('        reference_time="01-01-01_00:00:00"')
            lines.append('        output_interval="00-01-00_00:00:00"')
            lines.append('        clobber_mode="append"')
            lines.append('        packages="conservationCheckAMPKG">')
            lines.append('')
            lines.append('<var name="xtime"/>')
            lines.append('<var name="initialEnergy"/>')
            lines.append('<var name="finalEnergy"/>')
            lines.append('<var name="energyChange"/>')
            lines.append('<var name="netEnergyFlux"/>')
            lines.append('<var name="absoluteEnergyError"/>')
            lines.append('<var name="relativeEnergyError"/>')
            lines.append('<var name="initialMass"/>')
            lines.append('<var name="finalMass"/>')
            lines.append('<var name="massChange"/>')
            lines.append('<var name="netMassFlux"/>')
            lines.append('<var name="absoluteMassError"/>')
            lines.append('<var name="relativeMassError"/>')
            lines.append('<var name="initialSalt"/>')
            lines.append('<var name="finalSalt"/>')
            lines.append('<var name="saltChange"/>')
            lines.append('<var name="netSaltFlux"/>')
            lines.append('<var name="absoluteSaltError"/>')
            lines.append('<var name="relativeSaltError"/>')
            lines.append('<var name="accumulatedLatentHeatFlux"/>')
            lines.append('<var name="accumulatedSensibleHeatFlux"/>')
            lines.append('<var name="accumulatedLongWaveHeatFluxUp"/>')
            lines.append('<var name="accumulatedLongWaveHeatFluxDown"/>')
            lines.append('<var name="accumulatedShortWaveHeatFlux"/>')
            lines.append('<var name="accumulatedSeaIceHeatFlux"/>')
            lines.append('<var name="accumulatedMeltingSnowHeatFlux"/>')
            lines.append('<var name="accumulatedMeltingIceRunoffHeatFlux"/>')
            lines.append('<var name="accumulatedRemovedIceRunoffHeatFlux"/>')
            lines.append('<var name="accumulatedIcebergHeatFlux"/>')
            lines.append('<var name="accumulatedFrazilHeatFlux"/>')
            lines.append('<var name="accumulatedLandIceHeatFlux"/>')
            lines.append('<var name="accumulatedLandIceFrazilHeatFlux"/>')
            lines.append('<var name="accumulatedRainTemperatureFlux"/>')
            lines.append('<var name="accumulatedEvapTemperatureFlux"/>')
            lines.append('<var name="accumulatedSeaIceTemperatureFlux"/>')
            lines.append('<var name="accumulatedRiverRunoffTemperatureFlux"/>')
            lines.append('<var name="accumulatedIcebergTemperatureFlux"/>')
            lines.append('<var name="accumulatedRainFlux"/>')
            lines.append('<var name="accumulatedSnowFlux"/>')
            lines.append('<var name="accumulatedEvaporationFlux"/>')
            lines.append('<var name="accumulatedSeaIceFlux"/>')
            lines.append('<var name="accumulatedRiverRunoffFlux"/>')
            lines.append('<var name="accumulatedIceRunoffFlux"/>')
            lines.append('<var name="accumulatedRemovedRiverRunoffFlux"/>')
            lines.append('<var name="accumulatedRemovedIceRunoffFlux"/>')
            lines.append('<var name="accumulatedIcebergFlux"/>')
            lines.append('<var name="accumulatedFrazilFlux"/>')
            lines.append('<var name="accumulatedLandIceFlux"/>')
            lines.append('<var name="accumulatedLandIceFrazilFlux"/>')
            lines.append('<var name="accumulatedSeaIceSalinityFlux"/>')
            lines.append('<var name="initialCarbon"/>')
            lines.append('<var name="finalCarbon"/>')
            lines.append('<var name="carbonChange"/>')
            lines.append('<var name="netCarbonFlux"/>')
            lines.append('<var name="absoluteCarbonError"/>')
            lines.append('<var name="relativeCarbonError"/>')
            lines.append('<var name="accumulatedAbsoluteCarbonError"/>')
            lines.append('<var name="accumulatedRelativeCarbonError"/>')
            lines.append('</stream>')
            lines.append('')
            lines.append('<immutable_stream name="conservationCheckRestart"')
            lines.append('        type="input;output"')
            lines.append('        io_type="{}"'.format(ocn_pio_typename))
            lines.append('        filename_template="{}.mpaso{}.rst.am.conservationCheck.$Y-$M-$D_$S.nc"'.format(casename, inst_string))
            lines.append('        filename_interval="output_interval"')
            lines.append('        clobber_mode="truncate"')
            lines.append('        packages="conservationCheckAMPKG"')
            lines.append('        input_interval="none"')
            lines.append('        reference_time="01-01-01_00:00:00"')
            lines.append('        output_interval="none">')
            lines.append('</immutable_stream>')
            lines.append('')
            lines.append('<stream name="timeSeriesStatsDailyOutput"')
            lines.append('        type="output"')
            lines.append('        precision="single"')
            lines.append('        io_type="{}"'.format(ocn_pio_typename))
            lines.append('        useMissingValMask="true"')
            lines.append('        filename_template="{}.mpaso{}.hist.am.timeSeriesStatsDaily.$Y-$M-$D.nc"'.format(casename, inst_string))
            lines.append('        filename_interval="00-01-00_00:00:00"')
            lines.append('        reference_time="01-01-01_00:00:00"')
            lines.append('        output_interval="00-00-01_00:00:00"')
            lines.append('        clobber_mode="truncate"')
            lines.append('        packages="timeSeriesStatsDailyAMPKG"')
            lines.append('        runtime_format="single_file">')
            lines.append('')
            lines.append('    <var_array name="tracersSurfaceValue"/>')
            lines.append('    <var_array name="surfaceVelocity"/>')
            lines.append('    <var_array name="SSHGradient"/>')
            lines.append('    <var name="xtime"/>')
            lines.append('    <var name="pressureAdjustedSSH"/>')
            lines.append('    <var name="normalVelocity"/>')
            lines.append('    <var name="velocityZonal"/>')
            lines.append('    <var name="velocityMeridional"/>')
            lines.append('    <var name="vertVelocityTop"/>')
            lines.append('    <var name="normalTransportVelocity"/>')
            lines.append('    <var name="transportVelocityZonal"/>')
            lines.append('    <var name="transportVelocityMeridional"/>')
            lines.append('    <var name="vertTransportVelocityTop"/>')
            lines.append('    <var_array name="activeTracerHorizontalAdvectionTendency"/>')
            lines.append('    <var_array name="activeTracerVerticalAdvectionTendency"/>')
            lines.append('    <var_array name="activeTracerVertMixTendency"/>')
            lines.append('    <var_array name="avgValueWithinOceanLayerRegion"/>')
            lines.append('    <var_array name="avgValueWithinOceanVolumeRegion"/>')
            if ocn_bgc in ['eco_only', 'eco_and_dms', 'eco_and_macromolecules', 'eco_and_dms_and_macromolecules']:
                lines.append('    <var name="CO2_gas_flux"/>')
                lines.append('    <var name="CO2_alt_gas_flux"/>')
                lines.append('    <var name="avgOceanSurfacePhytoC"/>')
                lines.append('    <var name="avgOceanSurfaceDIC"/>')
                lines.append('    <var name="avgOceanSurfaceNO3"/>')
                lines.append('    <var name="avgOceanSurfaceSiO3"/>')
                lines.append('    <var name="avgOceanSurfaceNH4"/>')
                lines.append('    <var name="avgOceanSurfaceDOCr"/>')
                lines.append('    <var name="avgOceanSurfaceFeDissolved"/>')
                lines.append('    <var name="iceFluxPhytoC"/>')
                lines.append('    <var name="iceFluxNO3"/>')
                lines.append('    <var name="iceFluxSiO3"/>')
                lines.append('    <var name="iceFluxNH4"/>')
                lines.append('    <var name="iceFluxFeDissolved"/>')
                lines.append('    <var name="iceFluxDOC"/>')
                lines.append('    <var name="ecosys_diag_photoC_TOT_zint"/>')

            lines.append('</stream>')
            lines.append('')
            lines.append('<stream name="timeSeriesStatsMonthlyOutput"')
            lines.append('        type="output"')
            lines.append('        precision="single"')
            if ocn_grid.startswith("oRRS1"):
                lines.append('        io_type="pnetcdf,cdf5"')
            else:
                lines.append('        io_type="{}"'.format(ocn_pio_typename))

            lines.append('        useMissingValMask="true"')
            lines.append('        filename_template="{}.mpaso{}.hist.am.timeSeriesStatsMonthly.$Y-$M-$D.nc"'.format(casename, inst_string))
            lines.append('        filename_interval="00-01-00_00:00:00"')
            lines.append('        reference_time="01-01-01_00:00:00"')
            lines.append('        output_interval="00-01-00_00:00:00"')
            lines.append('        clobber_mode="truncate"')
            lines.append('        packages="timeSeriesStatsMonthlyAMPKG"')
            lines.append('        runtime_format="single_file">')
            lines.append('')
            lines.append('    <var name="daysSinceStartOfSim"/>')
            lines.append('    <var name="binBoundaryMerHeatTrans"/>')
            lines.append('    <var name="binBoundaryZonalMean"/>')
            lines.append('    <var name="ssh"/>')
            lines.append('    <var_struct name="tracers"/>')
            lines.append('    <var name="velocityMeridional"/>')
            lines.append('    <var name="velocityZonal"/>')
            lines.append('    <var name="layerThickness"/>')
            lines.append('    <var name="density"/>')
            lines.append('    <var name="potentialDensity"/>')
            lines.append('    <var name="windStressZonal"/>')
            lines.append('    <var name="windStressMeridional"/>')
            lines.append('    <var name="frazilLayerThicknessTendency"/>')
            lines.append('    <var_array name="avgValueWithinOceanRegion"/>')
            lines.append('    <var_array name="avgValueWithinOceanLayerRegion"/>')
            lines.append('    <var_array name="avgValueWithinOceanVolumeRegion"/>')
            lines.append('    <var name="meridionalHeatTransportLatZ"/>')
            lines.append('    <var name="meridionalHeatTransportLat"/>')
            lines.append('    <var_array name="minGlobalStats"/>')
            lines.append('    <var_array name="maxGlobalStats"/>')
            lines.append('    <var_array name="sumGlobalStats"/>')
            lines.append('    <var_array name="rmsGlobalStats"/>')
            lines.append('    <var_array name="avgGlobalStats"/>')
            lines.append('    <var_array name="vertSumMinGlobalStats"/>')
            lines.append('    <var_array name="vertSumMaxGlobalStats"/>')
            lines.append('    <var name="tThreshMLD"/>')
            lines.append('    <var name="dThreshMLD"/>')
            lines.append('    <var name="normalVelocity"/>')
            lines.append('    <var name="vertVelocityTop"/>')
            lines.append('    <var name="zMid"/>')
            lines.append('    <var name="atmosphericPressure"/>')
            lines.append('    <var name="normalMLEvelocity"/>')
            lines.append('    <var name="vertMLEBolusVelocityTop"/>')
            lines.append('    <var name="velocityZonalTimesTemperature_MLE"/>')
            lines.append('    <var name="velocityMeridionalTimesTemperature_MLE"/>')
            lines.append('    <var name="velocityZonalTimesSalinity_MLE"/>')
            lines.append('    <var name="velocityMeridionalTimesSalinity_MLE"/>')
            if not ocn_grid.startswith("oRRS1"):
                lines.append('    <var name="normalGMBolusVelocity"/>')
                lines.append('    <var name="vertGMBolusVelocityTop"/>')
                lines.append('    <var name="GMBolusVelocityZonal"/>')
                lines.append('    <var name="GMBolusVelocityMeridional"/>')
                lines.append('    <var name="cGMphaseSpeed"/>')
                lines.append('    <var name="velocityZonalTimesTemperature_GM"/>')
                lines.append('    <var name="velocityMeridionalTimesTemperature_GM"/>')
                lines.append('    <var name="normalGMBolusVelocityTimesTemperature"/>')
                lines.append('    <var name="normalGMBolusVelocitySquared"/>')
                lines.append('    <var name="velocityZonalTimesSalinity_GM"/>')
                lines.append('    <var name="velocityMeridionalTimesSalinity_GM"/>')
                lines.append('    <var name="normalGMBolusVelocityTimesSalinity"/>')
                lines.append('    <var name="gmKappaScaling"/>')
                lines.append('    <var name="gmBolusKappa"/>')
                lines.append('    <var name="mocStreamvalLatAndDepthGM"/>')
                lines.append('    <var name="mocStreamvalLatAndDepthRegionGM"/>')

            lines.append('    <var name="mocStreamvalLatAndDepthMLE"/>')
            lines.append('    <var name="mocStreamvalLatAndDepthRegionMLE"/>')
            lines.append('    <var_struct name="tracersSurfaceFlux"/>')
            lines.append('    <var name="penetrativeTemperatureFlux"/>')
            lines.append('    <var name="latentHeatFlux"/>')
            lines.append('    <var name="sensibleHeatFlux"/>')
            lines.append('    <var name="longWaveHeatFluxUp"/>')
            lines.append('    <var name="longWaveHeatFluxDown"/>')
            lines.append('    <var name="seaIceHeatFlux"/>')
            lines.append('    <var name="shortWaveHeatFlux"/>')
            lines.append('    <var name="frazilTemperatureTendency"/>')
            lines.append('    <var name="evaporationFlux"/>')
            lines.append('    <var name="seaIceSalinityFlux"/>')
            lines.append('    <var name="seaIceFreshWaterFlux"/>')
            lines.append('    <var name="riverRunoffFlux"/>')
            lines.append('    <var name="iceRunoffFlux"/>')
            lines.append('    <var name="rainFlux"/>')
            lines.append('    <var name="snowFlux"/>')
            lines.append('    <var name="vertNonLocalFlux"/>')
            lines.append('    <var name="bottomLayerShortwaveTemperatureFlux"/>')
            lines.append('    <var_array name="activeTracersTend"/>')
            lines.append('    <var name="salinitySurfaceRestoringTendency"/>')
            lines.append('    <var_array name="activeTracerHorizontalAdvectionTendency"/>')
            lines.append('    <var_array name="activeTracerVerticalAdvectionTendency"/>')
            lines.append('    <var_array name="activeTracerVertMixTendency"/>')
            lines.append('    <var_array name="activeTracerHorMixTendency"/>')
            lines.append('    <var_array name="activeTracerSurfaceFluxTendency"/>')
            lines.append('    <var_array name="temperatureShortWaveTendency"/>')
            lines.append('    <var_array name="activeTracerNonLocalTendency"/>')
            lines.append('    <var name="areaCellGlobal"/>')
            lines.append('    <var name="areaEdgeGlobal"/>')
            lines.append('    <var name="areaTriangleGlobal"/>')
            lines.append('    <var name="volumeCellGlobal"/>')
            lines.append('    <var name="volumeEdgeGlobal"/>')
            lines.append('    <var name="CFLNumberGlobal"/>')
            lines.append('    <var name="vertDiffTopOfCell"/>')
            lines.append('    <var name="vertViscTopOfCell"/>')
            lines.append('    <var name="bulkRichardsonNumber"/>')
            lines.append('    <var name="boundaryLayerDepth"/>')
            lines.append('    <var name="columnIntegratedSpeed"/>')
            lines.append('    <var name="landIceFreshwaterFlux"/>')
            lines.append('    <var name="landIceHeatFlux"/>')
            lines.append('    <var name="heatFluxToLandIce"/>')
            lines.append('    <var name="landIceFrictionVelocity"/>')
            lines.append('    <var_array name="landIceBoundaryLayerTracers"/>')
            lines.append('    <var_array name="landIceInterfaceTracers"/>')
            lines.append('    <var name="mocStreamvalLatAndDepth"/>')
            lines.append('    <var name="mocStreamvalLatAndDepthRegion"/>')
            lines.append('    <var name="binBoundaryMocStreamfunction"/>')
            lines.append('    <var name="surfaceBuoyancyForcing"/>')
            lines.append('    <var name="tendLayerThickness"/>')
            lines.append('    <var name="boundaryLayerDepthSmooth"/>')
            lines.append('    <var name="pressureAdjustedSSH"/>')
            lines.append('    <var name="SSHSquared"/>')
            lines.append('    <var name="velocityZonalSquared"/>')
            lines.append('    <var name="velocityMeridionalSquared"/>')
            lines.append('    <var name="normalVelocitySquared"/>')
            lines.append('    <var name="velocityZonalTimesTemperature"/>')
            lines.append('    <var name="velocityMeridionalTimesTemperature"/>')
            lines.append('    <var name="normalVelocityTimesTemperature"/>')
            lines.append('    <var name="velocityZonalTimesSalinity"/>')
            lines.append('    <var name="velocityMeridionalTimesSalinity"/>')
            lines.append('    <var name="normalVelocityTimesSalinity"/>')
            lines.append('    <var name="oceanHeatContentSfcToBot"/>')
            lines.append('    <var name="oceanHeatContentSfcTo700m"/>')
            lines.append('    <var name="oceanHeatContent700mTo2000m"/>')
            lines.append('    <var name="oceanHeatContent2000mToBot"/>')
            lines.append('    <var name="activeTracerForcingMLTend"/>')
            lines.append('    <var name="activeTracerHorMixMLTend"/>')
            lines.append('    <var name="activeTracerNonLocalMLTend"/>')
            lines.append('    <var name="activeTracerVertAdvectionMLTend"/>')
            lines.append('    <var name="activeTracerHorAdvectionMLTend"/>')
            lines.append('    <var name="activeTracerVertMixMLTend"/>')
            lines.append('    <var name="activeTracersML"/>')
            lines.append('    <var name="BruntVaisalaFreqTop"/>')
            lines.append('    <var name="bruntVaisalaFreqML"/>')
            lines.append('    <var name="activeTracersTendML"/>')
            lines.append('    <var_array name="activeTracerVerticalAdvectionTopFlux"/>')
            lines.append('    <var_array name="activeTracerHorizontalAdvectionEdgeFlux"/>')
            lines.append('    <var_array name="totalFreshWaterTemperatureFlux"/>')
            if ocn_iceberg == 'true':
                lines.append('    <var name="icebergHeatFlux"/>')
                lines.append('    <var name="icebergFreshWaterFlux"/>')

            if ocn_bgc in ['eco_only', 'eco_and_dms', 'eco_and_macromolecules', 'eco_and_dms_and_macromolecules']:
                lines.append('    <var name="PH_PREV_ALT_CO2_3D"/>')
                lines.append('    <var name="dust_FLUX_IN"/>')
                lines.append('    <var name="IRON_FLUX_IN"/>')
                lines.append('    <var name="PAR_surface"/>')
                lines.append('    <var name="windSpeedSquared10m"/>')
                lines.append('    <var name="atmosphericCO2"/>')
                lines.append('    <var name="atmosphericCO2_ALT_CO2"/>')
                lines.append('    <var name="CO2_gas_flux"/>')
                lines.append('    <var name="CO2_alt_gas_flux"/>')
                lines.append('    <var name="iceFluxPhytoC"/>')
                lines.append('    <var name="iceFluxNO3"/>')
                lines.append('    <var name="iceFluxSiO3"/>')
                lines.append('    <var name="iceFluxNH4"/>')
                lines.append('    <var name="iceFluxFeDissolved"/>')
                lines.append('    <var name="iceFluxDOC"/>')
                lines.append('    <var name="ecosys_diag_photoC_TOT_zint"/>')
                lines.append('    <var name="ecosys_diag_O2_ZMIN"/>')
                lines.append('    <var name="ecosys_diag_O2_ZMIN_DEPTH"/>')
                lines.append('    <var name="ecosys_diag_Jint_Ctot"/>')
                lines.append('    <var name="ecosys_diag_Jint_Ntot"/>')
                lines.append('    <var name="ecosys_diag_Jint_Ptot"/>')
                lines.append('    <var name="ecosys_diag_Jint_Sitot"/>')
                lines.append('    <var name="ecosys_diag_photoC_zint"/>')
                lines.append('    <var name="ecosys_diag_photoC_NO3_zint"/>')
                lines.append('    <var name="ecosys_diag_PAR_avg"/>')
                lines.append('    <var name="ecosys_diag_POC_FLUX_IN"/>')
                lines.append('    <var name="ecosys_diag_CaCO3_FLUX_IN"/>')
                lines.append('    <var name="ecosys_diag_zoo_loss"/>')
                lines.append('    <var name="ecosys_diag_photoC_TOT"/>')
                lines.append('    <var name="ecosys_diag_photoC_NO3_TOT"/>')
                lines.append('    <var name="ecosys_diag_NITRIF"/>')
                lines.append('    <var name="ecosys_diag_DENITRIF"/>')
                lines.append('    <var name="ecosys_diag_calcToSed"/>')
                lines.append('    <var name="ecosys_diag_pocToSed"/>')
                lines.append('    <var name="ecosys_diag_SedDenitrif"/>')
                lines.append('    <var name="ecosys_diag_tot_Nfix"/>')
                lines.append('    <var name="ecosys_diag_O2_PRODUCTION"/>')
                lines.append('    <var name="ecosys_diag_O2_CONSUMPTION"/>')
                lines.append('    <var name="ecosys_diag_pH_3D"/>')
                lines.append('    <var name="ecosys_diag_POC_PROD"/>')
                lines.append('    <var name="ecosys_diag_POC_REMIN_DOCr"/>')
                lines.append('    <var name="ecosys_diag_POC_ACCUM"/>')
                lines.append('    <var name="ecosys_diag_N_lim_surf"/>')
                lines.append('    <var name="ecosys_diag_P_lim_surf"/>')
                lines.append('    <var name="ecosys_diag_Fe_lim_surf"/>')
                lines.append('    <var name="ecosys_diag_SiO3_lim_surf"/>')
                lines.append('    <var name="ecosys_diag_light_lim_surf"/>')
                lines.append('    <var name="ecosys_diag_photoC"/>')
                lines.append('    <var name="ecosys_diag_photoC_NO3"/>')
                lines.append('    <var name="ecosys_diag_photoFe"/>')
                lines.append('    <var name="ecosys_diag_photoNO3"/>')
                lines.append('    <var name="ecosys_diag_photoNH4"/>')
                lines.append('    <var name="ecosys_diag_DOP_uptake"/>')
                lines.append('    <var name="ecosys_diag_PO4_uptake"/>')
                lines.append('    <var name="ecosys_diag_auto_graze"/>')
                lines.append('    <var name="ecosys_diag_auto_loss"/>')
                lines.append('    <var name="ecosys_diag_auto_agg"/>')
                lines.append('    <var name="ecosys_diag_CO2star"/>')
                lines.append('    <var name="ecosys_diag_dCO2star"/>')
                lines.append('    <var name="ecosys_diag_pCO2surface"/>')
                lines.append('    <var name="ecosys_diag_dpCO2"/>')
                lines.append('    <var name="ecosys_diag_pistonVel_CO2"/>')
                lines.append('    <var name="ecosys_diag_Schmidt_CO2"/>')
                lines.append('    <var name="ecosys_diag_xkw"/>')
                lines.append('    <var name="ecosys_diag_pistonVel_O2"/>')
                lines.append('    <var name="ecosys_diag_O2_saturation"/>')
                lines.append('    <var name="ecosys_diag_Schmidt_O2"/>')
                lines.append('    <var name="ecosys_diag_CO2star_ALT_CO2"/>')
                lines.append('    <var name="ecosys_diag_dCO2star_ALT_CO2"/>')
                lines.append('    <var name="ecosys_diag_pCO2surface_ALT_CO2"/>')
                lines.append('    <var name="ecosys_diag_dpCO2_ALT_CO2"/>')
                lines.append('    <var name="ecosys_diag_tot_bSi_form"/>')
                lines.append('    <var name="ecosys_diag_DOC_prod"/>')
                lines.append('    <var name="ecosys_diag_DOC_remin"/>')
                lines.append('    <var name="ecosys_diag_CaCO3_form_zint"/>')
                lines.append('    <var name="ecosys_diag_CaCO3_PROD"/>')
                lines.append('    <var name="ecosys_diag_CaCO3_REMIN"/>')
                lines.append('    <var name="ecosys_diag_tot_CaCO3_form"/>')
                lines.append('    <var name="ecosys_diag_CO3"/>')
                lines.append('    <var name="ecosys_diag_co3_sat_calc"/>')
                lines.append('    <var name="ecosys_diag_co3_sat_arag"/>')
            if ocn_wave == 'true':
                lines.append('    <var name="peakWaveFrequency"/>')
                lines.append('    <var name="peakWaveDirection"/>')
                lines.append('    <var name="significantWaveHeight"/>')
                lines.append('    <var name="langmuirNumber"/>')

            lines.append('</stream>')
            lines.append('')
            lines.append('<stream name="timeSeriesStatsMonthlyMaxOutput"')
            lines.append('        type="output"')
            lines.append('        precision="single"')
            if ocn_grid.startswith("oRRS1"):
                lines.append('        io_type="pnetcdf,cdf5"')
            else:
                lines.append('        io_type="{}"'.format(ocn_pio_typename))

            lines.append('        useMissingValMask="true"')
            lines.append('        filename_template="{}.mpaso{}.hist.am.timeSeriesStatsMonthlyMax.$Y-$M-$D.nc"'.format(casename, inst_string))
            lines.append('        filename_interval="00-01-00_00:00:00"')
            lines.append('        reference_time="01-01-01_00:00:00"')
            lines.append('        output_interval="00-01-00_00:00:00"')
            lines.append('        clobber_mode="truncate"')
            lines.append('        packages="timeSeriesStatsMonthlyMaxAMPKG"')
            lines.append('        runtime_format="single_file">')
            lines.append('')
            lines.append('    <var name="daysSinceStartOfSim"/>')
            lines.append('    <var name="ssh"/>')
            lines.append('    <var name="windStressZonal"/>')
            lines.append('    <var name="windStressMeridional"/>')
            lines.append('    <var name="tThreshMLD"/>')
            lines.append('    <var name="dThreshMLD"/>')
            lines.append('    <var_struct name="tracersSurfaceFlux"/>')
            lines.append('    <var name="penetrativeTemperatureFlux"/>')
            lines.append('    <var name="latentHeatFlux"/>')
            lines.append('    <var name="sensibleHeatFlux"/>')
            lines.append('    <var name="longWaveHeatFluxUp"/>')
            lines.append('    <var name="longWaveHeatFluxDown"/>')
            lines.append('    <var name="seaIceHeatFlux"/>')
            if ocn_iceberg == 'true':
                lines.append('    <var name="icebergHeatFlux"/>')

            lines.append('    <var name="shortWaveHeatFlux"/>')
            lines.append('    <var name="evaporationFlux"/>')
            lines.append('    <var name="seaIceSalinityFlux"/>')
            lines.append('    <var name="seaIceFreshWaterFlux"/>')
            if ocn_iceberg == 'true':
                lines.append('    <var name="icebergFreshWaterFlux"/>')

            lines.append('    <var name="riverRunoffFlux"/>')
            lines.append('    <var name="iceRunoffFlux"/>')
            lines.append('    <var name="rainFlux"/>')
            lines.append('    <var name="snowFlux"/>')
            lines.append('    <var name="boundaryLayerDepth"/>')
            lines.append('    <var name="landIceFreshwaterFlux"/>')
            lines.append('    <var name="landIceHeatFlux"/>')
            lines.append('    <var name="heatFluxToLandIce"/>')
            lines.append('    <var name="surfaceBuoyancyForcing"/>')
            lines.append('    <var name="boundaryLayerDepthSmooth"/>')
            lines.append('    <var name="SSHSquared"/>')
            lines.append('    <var name="activeTracerForcingMLTend"/>')
            lines.append('    <var name="activeTracerHorMixMLTend"/>')
            lines.append('    <var name="activeTracerNonLocalMLTend"/>')
            lines.append('    <var name="activeTracerVertAdvectionMLTend"/>')
            lines.append('    <var name="activeTracerHorAdvectionMLTend"/>')
            lines.append('    <var name="activeTracerVertMixMLTend"/>')
            lines.append('    <var name="activeTracersML"/>')
            lines.append('    <var name="bruntVaisalaFreqML"/>')
            lines.append('    <var name="activeTracersTendML"/>')
            lines.append('</stream>')
            lines.append('')
            lines.append('<stream name="timeSeriesStatsMonthlyMinOutput"')
            lines.append('        type="output"')
            lines.append('        precision="single"')
            if ocn_grid.startswith("oRRS1"):
                lines.append('        io_type="pnetcdf,cdf5"')
            else:
                lines.append('        io_type="{}"'.format(ocn_pio_typename))

            lines.append('        useMissingValMask="true"')
            lines.append('        filename_template="{}.mpaso{}.hist.am.timeSeriesStatsMonthlyMin.$Y-$M-$D.nc"'.format(casename, inst_string))
            lines.append('        filename_interval="00-01-00_00:00:00"')
            lines.append('        reference_time="01-01-01_00:00:00"')
            lines.append('        output_interval="00-01-00_00:00:00"')
            lines.append('        clobber_mode="truncate"')
            lines.append('        packages="timeSeriesStatsMonthlyMinAMPKG"')
            lines.append('        runtime_format="single_file">')
            lines.append('')
            lines.append('    <var name="daysSinceStartOfSim"/>')
            lines.append('    <var name="ssh"/>')
            lines.append('    <var name="windStressZonal"/>')
            lines.append('    <var name="windStressMeridional"/>')
            lines.append('    <var name="tThreshMLD"/>')
            lines.append('    <var name="dThreshMLD"/>')
            lines.append('    <var_struct name="tracersSurfaceFlux"/>')
            lines.append('    <var name="penetrativeTemperatureFlux"/>')
            lines.append('    <var name="latentHeatFlux"/>')
            lines.append('    <var name="sensibleHeatFlux"/>')
            lines.append('    <var name="longWaveHeatFluxUp"/>')
            lines.append('    <var name="longWaveHeatFluxDown"/>')
            lines.append('    <var name="seaIceHeatFlux"/>')
            if ocn_iceberg == 'true':
                lines.append('    <var name="icebergHeatFlux"/>')

            lines.append('    <var name="shortWaveHeatFlux"/>')
            lines.append('    <var name="evaporationFlux"/>')
            lines.append('    <var name="seaIceSalinityFlux"/>')
            lines.append('    <var name="seaIceFreshWaterFlux"/>')
            if ocn_iceberg == 'true':
                lines.append('    <var name="icebergFreshWaterFlux"/>')

            lines.append('    <var name="riverRunoffFlux"/>')
            lines.append('    <var name="iceRunoffFlux"/>')
            lines.append('    <var name="rainFlux"/>')
            lines.append('    <var name="snowFlux"/>')
            lines.append('    <var name="boundaryLayerDepth"/>')
            lines.append('    <var name="landIceFreshwaterFlux"/>')
            lines.append('    <var name="landIceHeatFlux"/>')
            lines.append('    <var name="heatFluxToLandIce"/>')
            lines.append('    <var name="surfaceBuoyancyForcing"/>')
            lines.append('    <var name="boundaryLayerDepthSmooth"/>')
            lines.append('    <var name="SSHSquared"/>')
            lines.append('    <var name="activeTracerForcingMLTend"/>')
            lines.append('    <var name="activeTracerHorMixMLTend"/>')
            lines.append('    <var name="activeTracerNonLocalMLTend"/>')
            lines.append('    <var name="activeTracerVertAdvectionMLTend"/>')
            lines.append('    <var name="activeTracerHorAdvectionMLTend"/>')
            lines.append('    <var name="activeTracerVertMixMLTend"/>')
            lines.append('    <var name="activeTracersML"/>')
            lines.append('    <var name="bruntVaisalaFreqML"/>')
            lines.append('    <var name="activeTracersTendML"/>')
            lines.append('</stream>')
            lines.append('')
            lines.append('<stream name="timeSeriesStatsClimatologyOutput"')
            lines.append('        type="output"')
            lines.append('        precision="single"')
            lines.append('        io_type="{}"'.format(ocn_pio_typename))
            lines.append('        useMissingValMask="true"')
            lines.append('        filename_template="{}.mpaso{}.hist.am.timeSeriesStatsClimatology.$Y-$M-$D.nc"'.format(casename, inst_string))
            lines.append('        filename_interval="00-01-00_00:00:00"')
            lines.append('        reference_time="01-01-01_00:00:00"')
            lines.append('        output_interval="00-03-00_00:00:00"')
            lines.append('        clobber_mode="truncate"')
            lines.append('        packages="timeSeriesStatsClimatologyAMPKG"')
            lines.append('        runtime_format="single_file">')
            lines.append('')
            lines.append('</stream>')
            lines.append('')
            lines.append('<stream name="timeSeriesStatsCustomOutput"')
            lines.append('        type="output"')
            lines.append('        precision="single"')
            lines.append('        io_type="{}"'.format(ocn_pio_typename))
            lines.append('        useMissingValMask="true"')
            lines.append('        filename_template="{}.mpaso{}.hist.am.timeSeriesStatsCustom.$Y-$M-$D.nc"'.format(casename, inst_string))
            lines.append('        filename_interval="00-01-00_00:00:00"')
            lines.append('        reference_time="01-01-01_00:00:00"')
            lines.append('        output_interval="00-01-00_00:00:00"')
            lines.append('        clobber_mode="truncate"')
            lines.append('        packages="timeSeriesStatsCustomAMPKG"')
            lines.append('        runtime_format="single_file">')
            lines.append('')
            lines.append('</stream>')
            lines.append('')
            lines.append('<stream name="timeSeriesStatsDailyRestart"')
            lines.append('        type="input;output"')
            lines.append('        io_type="{}"'.format(ocn_pio_typename))
            lines.append('        filename_template="{}.mpaso{}.rst.am.timeSeriesStatsDaily.$Y-$M-$D_$S.nc"'.format(casename, inst_string))
            lines.append('        filename_interval="output_interval"')
            lines.append('        clobber_mode="truncate"')
            lines.append('        input_interval="none"')
            lines.append('        packages="timeSeriesStatsDailyAMPKG"')
            lines.append('        reference_time="01-01-01_00:00:00"')
            lines.append('        output_interval="none">')
            lines.append('</stream>')
            lines.append('')
            lines.append('<stream name="timeSeriesStatsMonthlyRestart"')
            lines.append('        type="input;output"')
            if ocn_grid.startswith("oRRS1"):
                lines.append('        io_type="pnetcdf,cdf5"')
            else:
                lines.append('        io_type="{}"'.format(ocn_pio_typename))

            lines.append('        filename_template="{}.mpaso{}.rst.am.timeSeriesStatsMonthly.$Y-$M-$D_$S.nc"'.format(casename, inst_string))
            lines.append('        filename_interval="output_interval"')
            lines.append('        clobber_mode="truncate"')
            lines.append('        input_interval="none"')
            lines.append('        packages="timeSeriesStatsMonthlyAMPKG"')
            lines.append('        reference_time="01-01-01_00:00:00"')
            lines.append('        output_interval="none">')
            lines.append('</stream>')
            lines.append('')
            lines.append('<stream name="timeSeriesStatsMonthlyMaxRestart"')
            lines.append('        type="input;output"')
            if ocn_grid.startswith("oRRS1"):
                lines.append('        io_type="pnetcdf,cdf5"')
            else:
                lines.append('        io_type="{}"'.format(ocn_pio_typename))

            lines.append('        filename_template="{}.mpaso{}.rst.am.timeSeriesStatsMonthlyMax.$Y-$M-$D_$S.nc"'.format(casename, inst_string))
            lines.append('        filename_interval="output_interval"')
            lines.append('        clobber_mode="truncate"')
            lines.append('        input_interval="none"')
            lines.append('        packages="timeSeriesStatsMonthlyMaxAMPKG"')
            lines.append('        reference_time="01-01-01_00:00:00"')
            lines.append('        output_interval="none">')
            lines.append('</stream>')
            lines.append('')
            lines.append('<stream name="timeSeriesStatsMonthlyMinRestart"')
            lines.append('        type="input;output"')
            if ocn_grid.startswith("oRRS1"):
                lines.append('        io_type="pnetcdf,cdf5"')
            else:
                lines.append('        io_type="{}"'.format(ocn_pio_typename))

            lines.append('        filename_template="{}.mpaso{}.rst.am.timeSeriesStatsMonthlyMin.$Y-$M-$D_$S.nc"'.format(casename, inst_string))
            lines.append('        filename_interval="output_interval"')
            lines.append('        clobber_mode="truncate"')
            lines.append('        input_interval="none"')
            lines.append('        packages="timeSeriesStatsMonthlyMinAMPKG"')
            lines.append('        reference_time="01-01-01_00:00:00"')
            lines.append('        output_interval="none">')
            lines.append('</stream>')
            lines.append('')
            lines.append('<stream name="timeSeriesStatsClimatologyRestart"')
            lines.append('        type="input;output"')
            lines.append('        io_type="{}"'.format(ocn_pio_typename))
            lines.append('        filename_template="{}.mpaso{}.rst.am.timeSeriesStatsClimatology.$Y-$M-$D_$S.nc"'.format(casename, inst_string))
            lines.append('        filename_interval="output_interval"')
            lines.append('        clobber_mode="truncate"')
            lines.append('        input_interval="initial_only"')
            lines.append('        packages="timeSeriesStatsClimatologyAMPKG"')
            lines.append('        reference_time="01-01-01_00:00:00"')
            lines.append('        output_interval="stream:restart:output_interval">')
            lines.append('</stream>')
            lines.append('')
            lines.append('<stream name="timeSeriesStatsCustomRestart"')
            lines.append('        type="input;output"')
            lines.append('        io_type="{}"'.format(ocn_pio_typename))
            lines.append('        filename_template="{}.mpaso{}.rst.am.timeSeriesStatsCustom.$Y-$M-$D_$S.nc"'.format(casename, inst_string))
            lines.append('        filename_interval="output_interval"')
            lines.append('        clobber_mode="truncate"')
            lines.append('        input_interval="initial_only"')
            lines.append('        packages="timeSeriesStatsCustomAMPKG"')
            lines.append('        reference_time="01-01-01_00:00:00"')
            lines.append('        output_interval="stream:restart:output_interval">')
            lines.append('</stream>')
            lines.append('')
            if eco_forcing_file != '':
                lines.append('<stream name="ecosys_monthly_flux"')
                lines.append('        type="input"')
                lines.append('        io_type="{}"'.format(ocn_pio_typename))
                lines.append('        filename_template="{}/ocn/mpas-o/{}/{}"'.format(din_loc_root, ocn_mask, eco_forcing_file))
                lines.append('        input_interval="none"')
                lines.append('        packages="ecosysTracersPKG">')
                lines.append('    <var name="xtime"/>')
                lines.append('    <var name="depositionFluzNO3"/>')
                lines.append('    <var name="depositionFluzNH4"/>')
                lines.append('    <var name="IRON_FLUZ_IN"/>')
                lines.append('    <var name="dust_FLUZ_IN"/>')
                lines.append('    <var name="riverFluzNO3"/>')
                lines.append('    <var name="riverFluzPO4"/>')
                lines.append('    <var name="riverFluzDON"/>')
                lines.append('    <var name="riverFluzDOP"/>')
                lines.append('    <var name="riverFluzSiO3"/>')
                lines.append('    <var name="riverFluzFe"/>')
                lines.append('    <var name="riverFluzDIC"/>')
                lines.append('    <var name="riverFluzALK"/>')
                lines.append('    <var name="riverFluzDOC"/>')
                lines.append('</stream>')
                lines.append('')

            if data_ismf_file != '':
                lines.append('<stream name="data_land_ice_fluxes"')
                lines.append('        type="input"')
                lines.append('        io_type="{}"'.format(ocn_pio_typename))
                lines.append('        filename_template="{}/ocn/mpas-o/{}/{}"'.format(din_loc_root, ocn_mask, data_ismf_file))
                lines.append('        input_interval="initial_only"')
                lines.append('        packages="dataLandIceFluxesPKG">')
                lines.append('    <var name="dataLandIceFreshwaterFlux"/>')
                lines.append('    <var name="dataLandIceHeatFlux"/>')
                lines.append('</stream>')
                lines.append('')

            lines.append('<!--')
            lines.append('All streams below this line are auxiliary streams. They are provided as')
            lines.append('groupings of fields that one might be interested in. You can either enable the')
            lines.append('stream to write a file for the fileds, or add the stream to another stream that')
            lines.append('will already be written.  ')
            lines.append('-->')
            lines.append('')
            lines.append('<stream name="forcing"')
            lines.append('        type="none"')
            lines.append('        io_type="{}"'.format(ocn_pio_typename))
            lines.append('        filename_template="{}.mpaso{}.hist.forcing_variables.$Y-$M-$D_$S.nc"'.format(casename, inst_string))
            lines.append('        filename_interval="00-01-00_00:00:00"')
            lines.append('        clobber_mode="truncate">')
            lines.append('')
            lines.append('    <stream name="mesh"/>')
            lines.append('    <var_struct name="tracersSurfaceFlux"/>')
            lines.append('    <var_array name="tracersSurfaceValue"/>')
            lines.append('    <var_array name="surfaceVelocity"/>')
            lines.append('    <var_array name="SSHGradient"/>')
            lines.append('    <var_array name="vertNonLocalFlux"/>')
            lines.append('    <var name="surfaceStressMagnitude"/>')
            lines.append('    <var name="surfaceStress"/>')
            lines.append('    <var name="surfaceThicknessFlux"/>')
            lines.append('    <var name="seaIceEnergy"/>')
            lines.append('    <var name="penetrativeTemperatureFlux"/>')
            lines.append('    <var name="fractionAbsorbed"/>')
            lines.append('    <var name="windStressZonal"/>')
            lines.append('    <var name="windStressMeridional"/>')
            lines.append('    <var name="latentHeatFlux"/>')
            lines.append('    <var name="sensibleHeatFlux"/>')
            lines.append('    <var name="longWaveHeatFluxUp"/>')
            lines.append('    <var name="longWaveHeatFluxDown"/>')
            lines.append('    <var name="seaIceHeatFlux"/>')
            lines.append('    <var name="shortWaveHeatFlux"/>')
            lines.append('    <var name="evaporationFlux"/>')
            lines.append('    <var name="seaIceSalinityFlux"/>')
            lines.append('    <var name="seaIceFreshWaterFlux"/>')
            lines.append('    <var name="riverRunoffFlux"/>')
            lines.append('    <var name="iceRunoffFlux"/>')
            lines.append('    <var name="rainFlux"/>')
            lines.append('    <var name="snowFlux"/>')
            lines.append('    <var name="iceFraction"/>')
            lines.append('    <var name="nAccumulatedCoupled"/>')
            lines.append('</stream>')
            lines.append('')
            lines.append('</streams>')
            lines.append('')

            with open(os.path.join(rundir, stream_name_inst), "w") as fd:
                fd.write("\n".join(lines))

###############################################################################
def _main_func():
###############################################################################
    caseroot = parse_input(sys.argv)
    with Case(caseroot) as case:
        buildnml(case, caseroot, "mpaso")

if __name__ == "__main__":
    _main_func()
