#!/usr/bin/env python3

"""
Namelist creator for E3SM's MPAS SEAICE 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 == "mpassi", 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")
    ice_grid         = case.get_value("ICE_GRID")
    ice_mask         = case.get_value("MASK_GRID")
    ice_bgc          = case.get_value("MPASSI_BGC")
    surface_mode     = case.get_value("MPASSI_SURFACE_MODE")
    iceberg_mode     = case.get_value("MPASSI_ICEBERG_MODE")
    prognostic_mode  = case.get_value("MPASSI_PROGNOSTIC_MODE")
    column_mode      = case.get_value("MPASSI_COLUMN_MODE")
    ice_pio_typename = case.get_value("ICE_PIO_TYPENAME")
    ninst_ice        = case.get_value("NINST_ICE")
    ntasks_ice       = case.get_value("NTASKS_PER_INST_ICE")
    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")
    ncpl_base_period = case.get_value("NCPL_BASE_PERIOD")
    atm_ncpl         = case.get_value("ATM_NCPL")
    stream_name      = 'streams.seaice'

    mpassiconf_dir = os.path.join(casebuild, "mpassiconf")

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

    #--------------------------------------------------------------------
    # Determine if initial conditions are spunup, from compset
    #--------------------------------------------------------------------
    ice_ic_mode = 'cold_start'
    if "SOI" in compset:
        ice_ic_mode = 'spunup'
    if ice_bgc == 'ice_bgc':
        ice_ic_mode = 'spunup'

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

    grid_date = ''
    grid_prefix = ''
    decomp_date = ''
    decomp_prefix = ''
    data_iceberg_file = ''
    points_file = ''
    dust_iron_file = ''

    if ice_grid == 'oEC60to30v3':
        decomp_date = '230424'
        decomp_prefix = 'partitions/mpas-seaice.graph.info.'
        grid_date = '161222'
        grid_prefix = 'seaice.EC60to30v3'
        if ice_ic_mode == 'spunup':
            grid_date = '200927'
            grid_prefix = 'seaice.EC60to30v3.restartFrom_anvilG'
        if ice_bgc == 'ice_bgc':
            grid_date = '180418'
            grid_prefix = 'mpassi.rst.BCRC_CNPECACNT_1850_anvil02.0066-01-01.no-xtime'
            points_file = 'seaice_points_EC.60to30v3_netcdf3_05152018.nc'

    elif ice_grid == 'oEC60to30v3wLI':
        decomp_date = '170905'
        decomp_prefix = 'mpas-cice.graph.info.'
        data_iceberg_file = 'data_iceberg_181022.EC60to30v3wLI.nc'
        grid_date = '170913'
        grid_prefix = 'seaice.EC60to30v3wLI'
        if ice_ic_mode == 'spunup':
            grid_date = '171116'
            grid_prefix = 'seaiceEC60to30v3wLI60lev.restart_theta_year26'

    elif ice_grid == 'ECwISC30to60E1r2':
        decomp_date = '200408'
        decomp_prefix = 'mpas-o.graph.info.'
        data_iceberg_file = 'Iceberg_Interannual_Merino_ECwISC30to60E1r2.nc'
        grid_date = '200408'
        grid_prefix = 'seaice.ECwISC30to60E1r2'
        if ice_ic_mode == 'spunup':
            logger.warning("WARNING: The specified compset is requesting seaice ICs spunup from a G-case")
            logger.warning("         But no file available for this grid.")

    elif ice_grid == 'oQU120':
        decomp_date = '230424'
        decomp_prefix = 'partitions/mpas-seaice.graph.info.'
        grid_date = '151209'
        grid_prefix = 'seaice.oQU120km'
        if ice_ic_mode == 'spunup':
            logger.warning("WARNING: The specified compset is requesting seaice ICs spunup from a G-case")
            logger.warning("         But no file available for this grid.")

    elif ice_grid == 'oQU240':
        decomp_date = '230422'
        decomp_prefix = 'partitions/mpas-seaice.graph.info.'
        grid_date = '151209'
        grid_prefix = 'seaice.oQU240km'
        if ice_ic_mode == 'spunup':
            logger.warning("WARNING: The specified compset is requesting seaice ICs spunup from a G-case")
            logger.warning("         But no file available for this grid.")

    elif ice_grid == 'oQU240wLI':
        decomp_date = '230422'
        decomp_prefix = 'partitions/mpas-seaice.graph.info.'
        grid_date = '160929'
        grid_prefix = 'cice.QU240wLI'
        data_iceberg_file = 'Iceberg_Climatology_Merino.oQU240wLI.20240404.nc'
        if ice_ic_mode == 'spunup':
            logger.warning("WARNING: The specified compset is requesting seaice ICs spunup from a G-case")
            logger.warning("         But no file available for this grid.")

    elif ice_grid == 'oQU480':
        decomp_date = '230422'
        decomp_prefix = 'partitions/mpas-seaice.graph.info.'
        grid_date = '180705'
        grid_prefix = 'seaice.oQU480'
        if ice_ic_mode == 'spunup':
            logger.warning("WARNING: The specified compset is requesting seaice ICs spunup from a G-case")
            logger.warning("         But no file available for this grid.")

    elif ice_grid == 'oRRS30to10v3':
        decomp_date = '171128'
        decomp_prefix = 'mpas-cice.graph.info.'
        grid_date = '171128'
        grid_prefix = 'seaice.RRS30to10v3'
        if ice_ic_mode == 'spunup':
            logger.warning("WARNING: The specified compset is requesting seaice ICs spunup from a G-case")
            logger.warning("         But no file available for this grid.")

    elif ice_grid == 'oRRS30to10v3wLI':
        decomp_date = '171109'
        decomp_prefix = 'mpas-cice.graph.info.'
        data_iceberg_file = 'data_iceberg_181022.RRS30to10v3wLI.nc'
        grid_date = '171109'
        grid_prefix = 'seaice.RRS30to10v3wLI'
        if ice_ic_mode == 'spunup':
            logger.warning("WARNING: The specified compset is requesting seaice ICs spunup from a G-case")
            logger.warning("         But no file available for this grid.")

    elif ice_grid == 'oRRS18to6v3':
        decomp_date = '230424'
        decomp_prefix = 'partitions/mpas-seaice.graph.info.'
        grid_date = '170111'
        grid_prefix = 'seaice.RRS18to6v3'
        if ice_ic_mode == 'spunup':
            grid_date = '210321'
            grid_prefix = 'seaice.RRS18to6v3_80Layer.restartFromChrysalis'

    elif ice_grid == 'oRRS15to5':
        decomp_date = '151209'
        decomp_prefix = 'mpas-cice.graph.info.'
        grid_date = '151209'
        grid_prefix = 'seaice.RRS.15to5km'
        if ice_ic_mode == 'spunup':
            logger.warning("WARNING: The specified compset is requesting seaice ICs spunup from a G-case")
            logger.warning("         But no file available for this grid.")

    elif ice_grid == 'oARRM60to10':
        decomp_date = '190129'
        decomp_prefix = 'mpas-seaice.graph.v2.'
        grid_date = '180715'
        grid_prefix = 'seaice.ARRM60to10'
        if ice_ic_mode == 'spunup':
            grid_date = '210204'
            grid_prefix = 'mpassi.oARRM60to10.rstFromG-cori'

    elif ice_grid == 'oARRM60to6':
        decomp_date = '180820'
        decomp_prefix = 'mpas-cice.graph.info.'
        grid_date = '180803'
        grid_prefix = 'seaice.ARRM60to6'
        if ice_ic_mode == 'spunup':
            logger.warning("WARNING: The specified compset is requesting seaice ICs spunup from a G-case")
            logger.warning("         But no file available for this grid.")

    elif ice_grid == 'ARRM10to60E2r1':
        decomp_date = '220802'
        decomp_prefix = 'mpas-seaice.v2.'
        grid_date = '220730'
        grid_prefix = 'mpassi.ARRM10to60E2r1'
        if ice_ic_mode == 'spunup':
            grid_date = '220802'
            grid_prefix = 'mpassi.ARRM10to60E2r1.rstFrom1monthG-chrys'

    elif ice_grid == 'EC30to60E2r2':
        decomp_date = '230313'
        decomp_prefix = 'partitions/mpas-seaice.graph.info.'
        grid_date = '210210'
        grid_prefix = 'seaice.EC30to60E2r2'
        if ice_ic_mode == 'spunup':
            grid_date = '201001'
            grid_prefix = 'mpassi.EC30to60E2r2.rstFromG-anvil'

    elif ice_grid == 'WC14to60E2r3':
        decomp_date = '230313'
        decomp_prefix = 'partitions/mpas-seaice.graph.info.'
        grid_date = '210210'
        grid_prefix = 'seaice.WC14to60E2r3'
        if ice_ic_mode == 'spunup':
            grid_date = '210226'
            grid_prefix = 'mpassi.WC14to60E2r3.rstFromG-anvil'

    elif ice_grid == 'WCAtl12to45E2r4':
        decomp_date = '210318'
        decomp_prefix = 'mpas-seaice.graph.info.'
        grid_date = '210318'
        grid_prefix = 'seaice.WCAtl12to45E2r4'
        if ice_ic_mode == 'spunup':
            grid_date = '210318'
            grid_prefix = 'mpassi.WCAtl12to45E2r4.rstFromG-anvil'

    elif ice_grid == 'SOwISC12to60E2r4':
        decomp_date = '230314'
        decomp_prefix = 'partitions/mpas-seaice.graph.info.'
        grid_date = '210107'
        grid_prefix = 'seaice.SOwISC12to60E2r4'
        data_iceberg_file += 'Iceberg_Interannual_Merino_SOwISC12to60E2r4.nc'
        if ice_ic_mode == 'spunup':
            grid_date = '210203'
            grid_prefix = 'mpassi.SOwISC12to60E2r4.rstFromG-anvil'

    elif ice_grid == 'FRISwISC08to60E3r1':
        decomp_date = '20230913'  # changed to date of partiotions in ../files_for_e3sm/assembled_files/inputdata/ocn/mpas-seaice/FRISwISC08to60E3r1/partitions
        decomp_prefix = 'partitions/mpas-seaice.graph.info.'
        grid_date = '20230913'  # changed to same as decomp_date
        grid_prefix = 'mpassi.FRISwISC08to60E3r1'  # name from ../files_for_e3sm/assembled_files/inputdata/ice/mpas-seaice/FRISwISC08to60E3r1/mpassi.FRISwISC08to60E3r1.20230913.nc
        data_iceberg_file += 'Iceberg_Climatology_Merino.FRISwISC08to60E3r1.20230913.nc'
        if ice_ic_mode == 'spunup':
            grid_date = '20230913'  # changed to same as decomp_date, but the spun up file does not yet exist
            grid_prefix = 'mpassi.FRISwISC08to60E3r1.rstFromG-anvil'  #the spun up file does not yet exist

    elif ice_grid == 'FRISwISC04to60E3r1':
        decomp_date = '20230913'  # changed to date of partiotions in ../files_for_e3sm/assembled_files/inputdata/ocn/mpas-seaice/FRISwISC04to60E3r1/partitions
        decomp_prefix = 'partitions/mpas-seaice.graph.info.'
        grid_date = '20230913'  # changed to same as decomp_date
        grid_prefix = 'mpassi.FRISwISC04to60E3r1'  # name from ../files_for_e3sm/assembled_files/inputdata/ice/mpas-seaice/FRISwISC04to60E3r1/mpassi.FRISwISC04to60E3r1.20230913.nc
        data_iceberg_file += 'Iceberg_Climatology_Merino.FRISwISC04to60E3r1.20230913.nc'
        if ice_ic_mode == 'spunup':
            grid_date = '20230913'  # changed to same as decomp_date, but the spun up file does not yet exist
            grid_prefix = 'mpassi.FRISwISC04to60E3r1.rstFromG-anvil'  #the spun up file does not yet exist

    elif ice_grid == 'FRISwISC02to60E3r1':
        decomp_date = '20230914'  # changed to date of partiotions in ../files_for_e3sm/assembled_files/inputdata/ocn/mpas-seaice/FRISwISC02to60E3r1/partitions
        decomp_prefix = 'partitions/mpas-seaice.graph.info.'
        grid_date = '20230914'  # changed to same as decomp_date
        grid_prefix = 'mpassi.FRISwISC02to60E3r1'  # name from ../files_for_e3sm/assembled_files/inputdata/ice/mpas-seaice/FRISwISC02to60E3r1/mpassi.FRISwISC02to60E3r1.20230914.nc
        data_iceberg_file += 'Iceberg_Climatology_Merino.FRISwISC02to60E3r1.20230914.nc'
        if ice_ic_mode == 'spunup':
            grid_date = '20230914'  # changed to same as decomp_date, but the spun up file does not yet exist
            grid_prefix = 'mpassi.FRISwISC02to60E3r1.rstFromG-anvil'  #the spun up file does not yet exist

    elif ice_grid == 'FRISwISC01to60E3r1':
        decomp_date = '20230915'  # changed to date of partiotions in ../files_for_e3sm/assembled_files/inputdata/ocn/mpas-seaice/FRISwISC01to60E3r1/partitions
        decomp_prefix = 'partitions/mpas-seaice.graph.info.'
        grid_date = '20230915'  # changed to same as decomp_date
        grid_prefix = 'mpassi.FRISwISC01to60E3r1'  # name from ../files_for_e3sm/assembled_files/inputdata/ice/mpas-seaice/FRISwISC01to60E3r1/mpassi.FRISwISC01to60E3r1.20230915.nc
        data_iceberg_file += 'Iceberg_Climatology_Merino.FRISwISC01to60E3r1.20230915.nc'
        if ice_ic_mode == 'spunup':
            grid_date = '20230915'  # changed to same as decomp_date, but the spun up file does not yet exist
            grid_prefix = 'mpassi.FRISwISC01to60E3r1.rstFromG-anvil'  #the spun up file does not yet exist

    elif ice_grid == 'ECwISC30to60E2r1':
        grid_date = '210413'
        grid_prefix = 'seaice.ECwISC30to60E2r1'
        decomp_date = '230314'
        decomp_prefix = 'partitions/mpas-seaice.graph.info.'
        data_iceberg_file += 'Iceberg_Interannual_Merino_ECwISC30to60E2r1.nc'
        if ice_ic_mode == 'spunup':
            grid_date = '210414'
            grid_prefix = 'mpassi.ECwISC30to60E2r1.rstFromG-anvil'

    elif ice_grid == 'IcoswISC30E3r5':
        grid_date = '20231120'
        grid_prefix = 'mpassi.IcoswISC30E3r5'
        decomp_date = '20231120'
        decomp_prefix = 'partitions/mpas-seaice.graph.info.'
        data_iceberg_file = 'Iceberg_Climatology_Merino.IcoswISC30E3r5.20231120.nc'
        dust_iron_file = 'ecoForcingSurfaceMonthly+WetDryDustSolFrac.IcoswISC30E3r5.20240511.nc'
        if ice_ic_mode == 'spunup':
            if iceberg_mode == 'data':
                grid_date = '20240207'
                grid_prefix = 'mpassi.IcoswISC30E3r5.rstFromG-DIB-chrysalis'
            else:
                grid_date = '20231121'
                grid_prefix = 'mpassi.IcoswISC30E3r5.rstFromG-chrysalis'

    elif ice_grid == 'IcosXISC30E3r7':
        grid_date = '20240314'
        grid_prefix = 'mpassi.IcosXISC30E3r7'
        decomp_date = '20240314'
        decomp_prefix = 'partitions/mpas-seaice.graph.info.'
        data_iceberg_file = 'Iceberg_Climatology_Merino.IcosXISC30E3r7.20240314.nc'
        if ice_ic_mode == 'spunup':
            grid_date = '20240314'
            grid_prefix = 'mpassi.IcosXISC30E3r7.rstFromPiControlSpinup-chrysalis'

    elif ice_grid == 'RRSwISC6to18E3r5':
        decomp_date = '20240404'
        decomp_prefix = 'partitions/mpas-seaice.graph.info.'
        grid_date = '20240327'
        grid_prefix = 'mpassi.RRSwISC6to18E3r5'
        data_iceberg_file = 'Iceberg_Climatology_Merino.RRSwISC6to18E3r5.20240327.nc'
        if ice_ic_mode == 'spunup':
            logger.warning("WARNING: The specified compset is requesting seaice ICs spunup from a G-case")
            logger.warning("         But no file available for this grid.")

    elif ice_grid == 'SOwISC12to30E3r3':
        grid_date = '20240829'
        grid_prefix = 'mpassi.SOwISC12to30E3r3'
        decomp_date = '20240829'
        decomp_prefix = 'partitions/mpas-seaice.graph.info.'
        data_iceberg_file = 'Iceberg_Climatology_Merino.SOwISC12to30E3r3.20240829.nc'
        if ice_ic_mode == 'spunup':
            grid_date = '20240829'
            grid_prefix = 'mpassi.SOwISC12to30E3r3.rstFromG-chrysalis'

    elif ice_grid == 'ICOS10':
        grid_date = '211015'
        grid_prefix = 'seaice.ICOS10'
        decomp_date = '220110'
        decomp_prefix = 'mpas-seaice.graph.info.'
        if ice_ic_mode == 'spunup':
            grid_date = '211015'
            # Below is just a placeholder
            grid_prefix = 'seaice.ICOS10_80Layer.restartFromChrysalis'


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

    input_file = "{}/ice/mpas-seaice/{}/{}.{}.nc".format(din_loc_root, ice_mask, grid_prefix, grid_date)

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

    with open(os.path.join(casebuild, "mpassi.input_data_list"), "w") as input_list:
        input_list.write("mesh = {}\n".format(input_file))
        input_list.write("snow_data = {}/ice/mpas-seaice/general/snicar_drdt_bst_fit_60_c04262019.nc\n".format(din_loc_root))
        input_list.write("snicar_data = {}/ice/mpas-seaice/general/snicar_optics_5bnd_snow_and_aerosols.nc\n".format(din_loc_root))
        if points_file != '':
            input_list.write("points = {}/ice/mpas-seaice/{}/{}\n".format(din_loc_root, ice_mask, points_file))
        if iceberg_mode == 'data':
            input_list.write("data_iceberg = {}/ice/mpas-seaice/{}/{}\n".format(din_loc_root, ice_mask, data_iceberg_file))
        if dust_iron_file != '':
            input_list.write("dust_iron = {}/ocn/mpas-o/{}/{}\n".format(din_loc_root, ice_mask, dust_iron_file))

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

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

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

        inst_string = ""
        if ninst_ice > 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.ice{}".format(inst_string))) and \
                   os.path.exists(os.path.join(rundir, "rpointer.ice")):
                safe_copy(os.path.join(rundir, "rpointer.ice"),
                          os.path.join(rundir, "rpointer.ice{}".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 = "{}/{}.mpassi{}.rst.{}_{}.nc".format(rundir, run_refcase, inst_string, run_refdate, run_reftod)
            expect(os.path.exists(input_file), " ERROR mpassi buildnml: missing specified restart file for branch or hybrid run: {}".format(input_file))
            restart_file = "{}/{}.mpassi{}.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 mpassiconf/cesm_namelist
        # -----------------------------------------------------

        if ncpl_base_period == 'year':
            config_dt = ( 3600 * 24 * 365 ) // atm_ncpl
        elif ncpl_base_period == 'day':
            config_dt = ( 3600 * 24 ) // atm_ncpl
        elif ncpl_base_period == 'hour':
            config_dt = ( 3600 ) // atm_ncpl
        else:
            logger.warning("WARNING: {} is being used".format(ncpl_base_period))

        config_dt = float(config_dt)
        infile_text = ""
        infile_text += " config_dt = {} \n".format(config_dt)

        create_namelist_infile(case,
                               "{}/user_nl_mpassi{}".format(caseroot, inst_string),
                               "{}/cesm_namelist".format(mpassiconf_dir),
                               infile_text=infile_text)

        # -----------------------------------------------------
        # call build-namelist- output will go in $CASEBUILD/mpassiconf/mpassi_in
        # -----------------------------------------------------

        sysmod =  os.path.join(srcroot, "components/mpas-seaice/bld/build-namelist")
        sysmod += " -infile {}/cesm_namelist".format(mpassiconf_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 += " -ice_grid '{}'".format(ice_mask)
        sysmod += " -ice_ic_mode '{}'".format(ice_ic_mode)
        sysmod += " -ice_bgc '{}'".format(ice_bgc)
        sysmod += " -surface_mode '{}'".format(surface_mode)
        sysmod += " -iceberg_mode '{}'".format(iceberg_mode)
        sysmod += " -prognostic_mode '{}'".format(prognostic_mode)
        sysmod += " -column_mode '{}'".format(column_mode)
        sysmod += " -ntasks_ice '{}'".format(ntasks_ice)
        sysmod += " -ninst_ice '{}'".format(ninst_ice)

        # pass in ICE_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
        # also, pass in decomp_date for date_stamp, since that's the one required by the scripts

        run_cmd_no_fail(sysmod, from_dir=mpassiconf_dir)

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

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

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

        if os.path.exists("{}/SourceMods/src.mpassi/{}".format(caseroot, stream_name_inst)):
            safe_copy("{}/SourceMods/src.mpassi/{}".format(caseroot, stream_name_inst), rundir)

        else:
            lines = []
            lines.append('<streams>')
            lines.append('<immutable_stream name="mesh"')
            lines.append('                  type="none"')
            if ice_grid.startswith("oRRS1") or ice_grid.startswith("FRIS") \
                    or ice_grid.startswith("RRSwISC6"):
                lines.append('                  io_type="pnetcdf,cdf5"')
            else:
                lines.append('                  io_type="{}"'.format(ice_pio_typename))

            lines.append('                  filename_template="mesh_variables.nc" />')
            lines.append('')
            lines.append('<immutable_stream name="input"')
            lines.append('                  type="input"')
            if ice_grid.startswith("oRRS1") or ice_grid.startswith("FRIS") \
                    or ice_grid.startswith("RRSwISC6"):
                lines.append('                  io_type="pnetcdf,cdf5"')
            else:
                lines.append('                  io_type="{}"'.format(ice_pio_typename))

            lines.append('                  filename_interval="none"')
            lines.append('                  filename_template="{}"'.format(input_file))
            lines.append('                  input_interval="initial_only" />')
            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('')
            lines.append('<immutable_stream name="restart"')
            lines.append('                  type="input;output"')
            if ice_grid.startswith("oRRS1") or ice_grid.startswith("FRIS") \
                    or ice_grid.startswith("RRSwISC6"):
                lines.append('                  io_type="pnetcdf,cdf5"')
            else:
                lines.append('                  io_type="{}"'.format(ice_pio_typename))

            lines.append('                  filename_template="{}.mpassi{}.rst.$Y-$M-$D_$S.nc"'.format(casename, inst_string))
            lines.append('                  filename_interval="output_interval"')
            lines.append('                  input_interval="initial_only"')
            lines.append('                  clobber_mode="truncate"')
            lines.append('                  reference_time="01-01-01_00:00:00"')
            lines.append('                  output_interval="00-00-00_00:00:01" />')
            lines.append('')

            if ice_ic_mode == 'spunup':
                lines.append('<immutable_stream name="restart_ic"')
                lines.append('                  type="input"')
                if ice_grid.startswith("oRRS1") or ice_grid.startswith("FRIS") \
                        or ice_grid.startswith("RRSwISC6"):
                        lines.append('                  io_type="pnetcdf,cdf5"')
                else:
                    lines.append('                  io_type="{}"'.format(ice_pio_typename))

                lines.append('                  filename_template="{}"'.format(input_file))
                lines.append('                  filename_interval="none"')
                lines.append('                  input_interval="initial_only" />')
                lines.append('')

            lines.append('<stream name="output"')
            lines.append('        type="output"')
            lines.append('        io_type="{}"'.format(ice_pio_typename))
            lines.append('        filename_template="{}.mpassi{}.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('    <stream name="mesh"/>')
            lines.append('    <var name="xtime"/>')
            lines.append('    <var name="daysSinceStartOfSim"/>')
            lines.append('    <var name="iceAreaCell"/>')
            lines.append('    <var name="iceVolumeCell"/>')
            lines.append('    <var name="snowVolumeCell"/>')
            lines.append('    <var name="uVelocityGeo"/>')
            lines.append('    <var name="vVelocityGeo"/>')
            lines.append('')
            lines.append('</stream>')
            lines.append('')
            lines.append('<immutable_stream name="LYqSixHourlyForcing"')
            lines.append('                  type="input"')
            lines.append('                  io_type="{}"'.format(ice_pio_typename))
            lines.append('                  filename_template="forcing/atmosphere_forcing_six_hourly.$Y.nc"')
            lines.append('                  filename_interval="0001-00-00_00:00:00"')
            lines.append('                  reference_time="2000-01-01_03:00:00"')
            lines.append('                  input_interval="none" />')
            lines.append('')
            lines.append('<immutable_stream name="LYqMonthlyForcing"')
            lines.append('                  type="input"')
            lines.append('                  io_type="{}"'.format(ice_pio_typename))
            lines.append('                  filename_template="forcing/atmosphere_forcing_monthly.nc"')
            lines.append('                  filename_interval="none"')
            lines.append('                  input_interval="none" />')
            lines.append('')
            lines.append('<immutable_stream name="NCARMonthlySSTForcing"')
            lines.append('                  type="input"')
            lines.append('                  io_type="{}"'.format(ice_pio_typename))
            lines.append('                  filename_template="forcing/ocean_forcing_monthly.nc"')
            lines.append('                  filename_interval="none"')
            lines.append('                  input_interval="none" />')
            lines.append('')
            lines.append('<immutable_stream name="NCARMonthlyForcing"')
            lines.append('                  type="input"')
            lines.append('                  io_type="{}"'.format(ice_pio_typename))
            lines.append('                  filename_template="forcing/ocean_forcing_monthly.nc"')
            lines.append('                  filename_interval="none"')
            lines.append('                  input_interval="none" />')
            lines.append('')
            lines.append('<immutable_stream name="StandardAerosolsInput"')
            lines.append('                  type="input"')
            lines.append('                  io_type="{}"'.format(ice_pio_typename))
            lines.append('                  filename_template="standard_optics_mpas_cice.nc"')
            lines.append('                  filename_interval="none"')
            lines.append('                  input_interval="none" />')
            lines.append('')
            lines.append('<immutable_stream name="ModalAerosolsInput"')
            lines.append('                  type="input"')
            lines.append('                  io_type="{}"'.format(ice_pio_typename))
            lines.append('                  filename_template="snicar_optics_5bnd_mam_c140303_mpas_cice.nc"')
            lines.append('                  filename_interval="none"')
            lines.append('                  input_interval="none" />')
            lines.append('')
            lines.append('<immutable_stream name="SnowAgingPropertiesInput"')
            lines.append('                  type="input"')
            lines.append('                  io_type="{}"'.format(ice_pio_typename))
            lines.append('                  filename_template="{}/ice/mpas-seaice/general/snicar_drdt_bst_fit_60_c04262019.nc"'.format(din_loc_root))
            lines.append('                  filename_interval="none"')
            lines.append('                  input_interval="initial_only" />')
            lines.append('')
            lines.append('<immutable_stream name="SnicarInput"')
            lines.append('                  type="input"')
            lines.append('                  io_type="{}"'.format(ice_pio_typename))
            lines.append('                  filename_template="{}/ice/mpas-seaice/general/snicar_optics_5bnd_snow_and_aerosols.nc"'.format(din_loc_root))
            lines.append('                  filename_interval="none"')
            lines.append('                  input_interval="initial_only" />')
            lines.append('')
            lines.append('<immutable_stream name="ISPOLDailyWOAForcing"')
            lines.append('                  type="input"')
            lines.append('                  io_type="{}"'.format(ice_pio_typename))
            lines.append('                  filename_template="{}/ice/mpas-cice/general/ISPOLDailyWOAForcing_10132022.nc"'.format(din_loc_root))
            lines.append('                  filename_interval="none"')
            lines.append('                  input_interval="none" />')
            lines.append('')
            if dust_iron_file != '':
                lines.append('<immutable_stream name="DustIronMonthlyForcing"')
                lines.append('                  type="input"')
                lines.append('                  io_type="{}"'.format(ice_pio_typename))
                lines.append('                  filename_template="{}/ocn/mpas-o/{}/{}"'.format(din_loc_root, ice_mask, dust_iron_file))
                lines.append('                  filename_interval="none"')
                lines.append('                  input_interval="none" />')
                lines.append('')

            lines.append('<immutable_stream name="abort_contents"')
            lines.append('                  type="none"')
            lines.append('                  filename_template="abort_variables.nc" />')
            lines.append('')
            lines.append('<stream name="abort_block"')
            lines.append('                  type="output"')
            lines.append('                  filename_template="abort_seaice_$Y-$M-$D_$h.$m.$s_block_$B.nc"')
            lines.append('                  filename_interval="none"')
            lines.append('                  clobber_mode="truncate"')
            lines.append('                  output_interval="none" >')
            lines.append('')
            lines.append('    <stream name="mesh"/>')
            lines.append('    <stream name="abort_contents"/>')
            lines.append('    <var name="daysSinceStartOfSim"/>')
            lines.append('    <var name="xtime"/>')
            lines.append('</stream>')
            lines.append('')
            lines.append('<stream name="abort"')
            lines.append('                  type="output"')
            lines.append('                  filename_template="abort_seaice_$Y-$M-$D_$h.$m.$s.nc"')
            lines.append('                  filename_interval="none"')
            lines.append('                  clobber_mode="truncate"')
            lines.append('                  output_interval="none" >')
            lines.append('')
            lines.append('    <stream name="mesh"/>')
            lines.append('    <stream name="abort_contents"/>')
            lines.append('    <var name="daysSinceStartOfSim"/>')
            lines.append('    <var name="xtime"/>')
            lines.append('</stream>')
            lines.append('')
            if iceberg_mode == 'data':
                lines.append('<stream name="dataIcebergForcing"')
                lines.append('                  type="input"')
                lines.append('                  io_type="{}"'.format(ice_pio_typename))
                lines.append('                  filename_template="{}/ice/mpas-seaice/{}/{}"'.format(din_loc_root, ice_mask, data_iceberg_file))
                lines.append('                  filename_interval="none"')
                lines.append('                  input_interval="none" >')
                lines.append('')
                lines.append('    <var name="bergFreshwaterFluxData"/>')
                lines.append('    <var name="xtime"/>')
                lines.append('</stream>')
                lines.append('')

            lines.append('<stream name="highFrequencyOutput"')
            lines.append('        type="output"')
            lines.append('        io_type="{}"'.format(ice_pio_typename))
            lines.append('        filename_template="{}.mpassi{}.hist.am.highFrequencyOutput.$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="highFrequencyOutputAMPKG">')
            lines.append('')
            lines.append('    <var name="xtime"/>')
            lines.append('    <stream name="mesh"/>')
            lines.append('    <var name="iceAreaCellCategory1"/>')
            lines.append('</stream>')
            lines.append('')
            lines.append('<stream name="regionalStatisticsOutput"')
            lines.append('        type="output"')
            lines.append('        io_type="{}"'.format(ice_pio_typename))
            lines.append('        filename_template="{}.mpassi{}.hist.am.regionalStatistics.$Y.$M.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="regionalStatisticsAMPKG">')
            lines.append('')
            lines.append('    <var name="xtime"/>')
            lines.append('    <var name="daysSinceStartOfSim"/>')
            lines.append('    <var name="totalIceArea"/>')
            lines.append('    <var name="totalIceExtent"/>')
            lines.append('    <var name="totalIceVolume"/>')
            lines.append('    <var name="totalSnowVolume"/>')
            lines.append('    <var name="totalKineticEnergy"/>')
            lines.append('    <var name="rmsIceSpeed"/>')
            lines.append('    <var name="averageAlbedo"/>')
            lines.append('    <var name="maximumIceVolume"/>')
            lines.append('    <var name="maximumIcePressure"/>')
            lines.append('</stream>')
            lines.append('')
            lines.append('<stream name="conservationCheckOutput"')
            lines.append('        type="output"')
            lines.append('        io_type="{}"'.format(ice_pio_typename))
            lines.append('        filename_template="{}.mpassi{}.hist.am.conservationCheck.$Y.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="daysSinceStartOfSim"/>')
            lines.append('    <var name="earthArea"/>')
            lines.append('    <var name="domainArea"/>')
            lines.append('    <var name="accumulatedSeaIceArea"/>')
            lines.append('    <var name="initialEnergy"/>')
            lines.append('    <var name="finalEnergy"/>')
            lines.append('    <var name="energyChange"/>')
            lines.append('    <var name="energyChangeFlux"/>')
            lines.append('    <var name="energyConsSurfaceHeatFlux"/>')
            lines.append('    <var name="energyConsAbsorbedShortwaveFlux"/>')
            lines.append('    <var name="energyConsOceanShortwaveFlux"/>')
            lines.append('    <var name="energyConsSensibleHeatFlux"/>')
            lines.append('    <var name="energyConsLongwaveUp"/>')
            lines.append('    <var name="energyConsLongwaveDown"/>')
            lines.append('    <var name="energyConsOceanHeatFlux"/>')
            lines.append('    <var name="energyConsFreezingPotential"/>')
            lines.append('    <var name="energyConsSnowfallHeat"/>')
            lines.append('    <var name="energyConsLatentHeat"/>')
            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="massChangeFlux"/>')
            lines.append('    <var name="massConsRainfallRate"/>')
            lines.append('    <var name="massConsSnowfallRate"/>')
            lines.append('    <var name="massConsEvaporation"/>')
            lines.append('    <var name="massConsFreshWater"/>')
            lines.append('    <var name="massConsFrazilWater"/>')
            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="saltChangeFlux"/>')
            lines.append('    <var name="saltConsOceanSaltFlux"/>')
            lines.append('    <var name="saltConsFrazilSaltFlux"/>')
            lines.append('    <var name="netSaltFlux"/>')
            lines.append('    <var name="absoluteSaltError"/>')
            lines.append('    <var name="relativeSaltError"/>')
            lines.append('    <var name="initialCarbon"/>')
            lines.append('    <var name="finalCarbon"/>')
            lines.append('    <var name="carbonChange"/>')
            lines.append('    <var name="carbonChangeFlux"/>')
            lines.append('    <var name="carbonConsOceanCarbonFlux"/>')
            lines.append('    <var name="netCarbonFlux"/>')
            lines.append('    <var name="absoluteCarbonError"/>')
            lines.append('    <var name="relativeCarbonError"/>')
            lines.append('    <var name="initialBlackCarbon"/>')
            lines.append('    <var name="finalBlackCarbon"/>')
            lines.append('    <var name="blackCarbonChange"/>')
            lines.append('    <var name="blackCarbonChangeFlux"/>')
            lines.append('    <var name="blackCarbonConsAtmBlackCarbonFlux"/>')
            lines.append('    <var name="blackCarbonConsOceanBlackCarbonFlux"/>')
            lines.append('    <var name="netBlackCarbonFlux"/>')
            lines.append('    <var name="absoluteBlackCarbonError"/>')
            lines.append('    <var name="relativeBlackCarbonError"/>')
            lines.append('</stream>')
            lines.append('')
            lines.append('<immutable_stream name="conservationCheckRestart"')
            lines.append('        type="input;output"')
            lines.append('        io_type="{}"'.format(ice_pio_typename))
            lines.append('        filename_template="{}.mpassi{}.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="initial_only"')
            lines.append('        reference_time="01-01-01_00:00:00"')
            lines.append('        output_interval="stream:restart:output_interval">')
            lines.append('</immutable_stream>')
            lines.append('')
            lines.append('<stream name="loadBalanceOutput"')
            lines.append('        type="output"')
            lines.append('        io_type="{}"'.format(ice_pio_typename))
            lines.append('        filename_template="{}.mpassi{}.hist.am.cice_loadBalance.$Y.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_01:00:00"')
            lines.append('        clobber_mode="truncate"')
            lines.append('        packages="loadBalanceAMPKG">')
            lines.append('')
            lines.append('    <var name="xtime"/>')
            lines.append('    <var name="nCellsProcWithSeaIce"/>')
            lines.append('    <var name="nCellsProc"/>')
            lines.append('</stream>')
            lines.append('')
            lines.append('<stream name="maximumIcePresenceOutput"')
            lines.append('        type="output"')
            lines.append('        io_type="{}"'.format(ice_pio_typename))
            lines.append('        filename_template="{}.mpassi{}.hist.am.cice_maximumIcePresence.$Y.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="01-00-00_00:00:00"')
            lines.append('        clobber_mode="truncate"')
            lines.append('        packages="maximumIcePresenceAMPKG">')
            lines.append('')
            lines.append('    <var name="xtime"/>')
            lines.append('    <stream name="mesh"/>')
            lines.append('    <var name="maximumIcePresence"/>')
            lines.append('</stream>')
            lines.append('')
            lines.append('<stream name="timeSeriesStatsDailyOutput"')
            lines.append('        type="output"')
            lines.append('        precision="single"')
            lines.append('        io_type="{}"'.format(ice_pio_typename))
            lines.append('        filename_template="{}.mpassi{}.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('')
            lines.append('    <var name="iceAreaCell"/>')
            lines.append('    <var name="iceVolumeCell"/>')
            lines.append('    <var name="snowVolumeCell"/>')
            lines.append('    <var name="uVelocityGeo"/>')
            lines.append('    <var name="vVelocityGeo"/>')
            lines.append('</stream>')
            lines.append('')
            lines.append('<stream name="timeSeriesStatsDailyRestart"')
            lines.append('        type="input;output"')
            lines.append('        io_type="{}"'.format(ice_pio_typename))
            lines.append('        filename_template="{}.mpassi{}.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('        packages="timeSeriesStatsDailyAMPKG"')
            lines.append('        input_interval="none"')
            lines.append('        reference_time="01-01-01_00:00:00"')
            lines.append('        output_interval="none">')
            lines.append('</stream>')
            lines.append('')
            lines.append('<stream name="timeSeriesStatsMonthlyOutput"')
            lines.append('        type="output"')
            lines.append('        precision="single"')
            lines.append('        io_type="{}"'.format(ice_pio_typename))
            lines.append('        filename_template="{}.mpassi{}.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('')
            lines.append('    <var name="daysSinceStartOfSim"/>')
            lines.append('    <var name="icePresent"/>')
            lines.append('    <var name="iceAreaCategory"/>')
            lines.append('    <var name="iceVolumeCategory"/>')
            lines.append('    <var name="snowVolumeCategory"/>')
            lines.append('    <var name="iceAreaCell"/>')
            lines.append('    <var name="iceVolumeCell"/>')
            lines.append('    <var name="snowVolumeCell"/>')
            lines.append('    <var name="surfaceTemperatureCell"/>')
            lines.append('    <var name="uVelocityGeo"/>')
            lines.append('    <var name="vVelocityGeo"/>')
            lines.append('    <var name="shortwaveDown"/>')
            lines.append('    <var name="longwaveDown"/>')
            lines.append('    <var name="seaSurfaceTemperature"/>')
            lines.append('    <var name="seaSurfaceSalinity"/>')
            lines.append('    <var name="uOceanVelocityVertexGeo"/>')
            lines.append('    <var name="vOceanVelocityVertexGeo"/>')
            lines.append('    <var name="freezingMeltingPotential"/>')
            lines.append('    <var name="shortwaveScalingFactor"/>')
            lines.append('    <var name="airTemperature"/>')
            lines.append('    <var name="congelation"/>')
            lines.append('    <var name="frazilFormation"/>')
            lines.append('    <var name="snowiceFormation"/>')
            lines.append('    <var name="snowMelt"/>')
            lines.append('    <var name="surfaceIceMelt"/>')
            lines.append('    <var name="basalIceMelt"/>')
            lines.append('    <var name="lateralIceMelt"/>')
            lines.append('    <var name="airStressVertexUGeo"/>')
            lines.append('    <var name="airStressVertexVGeo"/>')
            lines.append('    <var name="icePressure"/>')
            lines.append('    <var name="divergence"/>')
            lines.append('    <var name="shear"/>')
            lines.append('    <var name="principalStress1Var"/>')
            lines.append('    <var name="principalStress2Var"/>')
            lines.append('    <var name="iceVolumeTendencyThermodynamics"/>')
            lines.append('    <var name="iceVolumeTendencyTransport"/>')
            lines.append('    <var name="iceAreaTendencyThermodynamics"/>')
            lines.append('    <var name="iceAreaTendencyTransport"/>')
            lines.append('    <var name="ridgedIceAreaAverage"/>')
            lines.append('    <var name="ridgedIceVolumeAverage"/>')
            lines.append('    <var name="bulkSalinity"/>')
            lines.append('    <var name="broadbandAlbedo"/>')
            lines.append('    <var name="absorbedShortwaveFluxInitialArea"/>')
            lines.append('    <var name="latentHeatFluxInitialArea"/>')
            lines.append('    <var name="sensibleHeatFluxInitialArea"/>')
            lines.append('    <var name="longwaveUpInitialArea"/>')
            lines.append('    <var name="evaporativeWaterFluxInitialArea"/>')
            lines.append('    <var name="meltPondAreaFinalArea"/>')
            lines.append('    <var name="meltPondDepthFinalArea"/>')
            lines.append('    <var name="meltPondLidThicknessFinalArea"/>')
            lines.append('    <var name="oceanHeatFlux"/>')
            lines.append('    <var name="oceanShortwaveFlux"/>')
            lines.append('    <var name="oceanFreshWaterFlux"/>')
            lines.append('    <var name="oceanSaltFlux"/>')
            lines.append('    <var name="uAirVelocity"/>')
            lines.append('    <var name="vAirVelocity"/>')
            lines.append('    <var name="snowGrainRadiusCell"/>')
            lines.append('    <var name="snowIceMassCell"/>')
            lines.append('    <var name="snowLiquidMassCell"/>')
            lines.append('    <var name="snowDensityCell"/>')
            lines.append('    <var name="snowAlbedoCell"/>')
            lines.append('    <var name="pondAlbedoCell"/>')
            lines.append('    <var name="bareIceAlbedoCell"/>')
            lines.append('    <var name="pondAreaCell"/>')
            if iceberg_mode != 'none':
                lines.append('    <var name="bergFreshwaterFlux"/>')
                lines.append('    <var name="bergLatentHeatFlux"/>')

            if ice_bgc == 'ice_bgc':
                lines.append('    <var name="totalChlorophyll"/>')
                lines.append('    <var name="primaryProduction"/>')
                lines.append('    <var name="bioShortwaveFlux"/>')
                lines.append('    <var name="netBrineHeight"/>')
                lines.append('    <var name="newlyFormedIce"/>')
                lines.append('    <var name="snowThicknessChange"/>')
                lines.append('    <var name="totalVerticalDiatomIce"/>')
                lines.append('    <var name="totalVerticalSmallPlanktonIce"/>')
                lines.append('    <var name="totalVerticalAlgaeCarbonIce"/>')
                lines.append('    <var name="totalVerticalNitrateIce"/>')
                lines.append('    <var name="totalVerticalAmmoniumIce"/>')
                lines.append('    <var name="totalVerticalSilicateIce"/>')
                lines.append('    <var name="totalVerticalProteinsIce"/>')
                lines.append('    <var name="totalVerticalDOCLabileIce"/>')
                lines.append('    <var name="totalVerticalHumicsIce"/>')
                lines.append('    <var name="totalVerticalDissolvedIronIce"/>')
                lines.append('    <var name="totalVerticalParticulateIronIce"/>')
                lines.append('    <var name="totalVerticalBCIce"/>')
                lines.append('    <var name="totalVerticalBCSnow"/>')
                lines.append('    <var name="totalVerticalDustIce"/>')
                lines.append('    <var name="totalVerticalDustSnow"/>')
                lines.append('    <var name="totalVerticalDissolvedIronSnow"/>')
                lines.append('    <var name="verticalAlgaeTotalCarbonIceCell"/>')
                lines.append('    <var name="verticalDOCLabileIceCell"/>')
                lines.append('    <var name="verticalDONIceCell"/>')
                lines.append('    <var name="verticalDICIceCell"/>')
                lines.append('    <var name="verticalNitrateIceCell"/>')
                lines.append('    <var name="verticalSilicateIceCell"/>')
                lines.append('    <var name="verticalAmmoniumIceCell"/>')
                lines.append('    <var name="verticalHumicsIceCell"/>')
                lines.append('    <var name="verticalDissolvedIronIceCell"/>')
                lines.append('    <var name="verticalBCTotalIceCell"/>')
                lines.append('    <var name="verticalDustTotalIceCell"/>')
                lines.append('    <var name="verticalBCTotalSnowCell"/>')
                lines.append('    <var name="verticalDustTotalSnowCell"/>')
                lines.append('    <var name="iceEnthalpyCell"/>')
                lines.append('    <var name="iceSalinityCell"/>')
                lines.append('    <var name="oceanBioFluxes"/>')
                lines.append('    <var name="oceanBioConcentrations"/>')
                lines.append('    <var name="netNitrateUptake"/>')
                lines.append('    <var name="netAmmoniumUptake"/>')
                lines.append('    <var name="netSpecificAlgalGrowthRate"/>')

            lines.append('</stream>')
            lines.append('')

            if ice_bgc == 'ice_bgc':
                if points_file != '':
                    lines.append('<immutable_stream name="pointLocationsInput"')
                    lines.append('                  type="input"')
                    lines.append('                  filename_template="{}/ice/mpas-seaice/{}/{}"'.format(din_loc_root, ice_mask, points_file))
                    lines.append('                  input_interval="initial_only"')
                    lines.append('                  runtime_format="single_file" />')

                lines.append('')

                lines.append('<stream name="pointwiseStatsOutput"')
                lines.append('        type="output"')
                lines.append('        io_type="netcdf"')
                lines.append('        filename_template="pointwiseStats.$Y-$M-$D.nc"')
                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="pointwiseStatsAMPKG"')
                lines.append('        runtime_format="single_file">')

                lines.append('')

                lines.append('    <var name="pointNames"/>')
                lines.append('    <var name="pointCellGlobalID"/>')
                lines.append('    <var name="xtime"/>')
                lines.append('    <var name="latCell"/>')
                lines.append('    <var name="lonCell"/>')
                lines.append('    <var name="latPoint"/>')
                lines.append('    <var name="lonPoint"/>')
                lines.append('    <var name="xPoint"/>')
                lines.append('    <var name="yPoint"/>')
                lines.append('    <var name="zPoint"/>')
                lines.append('    <var name="totalVerticalBiologyIce"/>')
                lines.append('    <var name="brineFractionCell"/>')
                lines.append('    <var name="netBrineHeight"/>')
                lines.append('    <var name="levelIceAreaCell"/>')
                lines.append('    <var name="pondAreaCell"/>')
                lines.append('    <var name="surfaceIceMelt"/>')
                lines.append('    <var name="basalIceMelt"/>')
                lines.append('    <var name="lateralIceMelt"/>')
                lines.append('    <var name="congelation"/>')
                lines.append('    <var name="snowiceFormation"/>')
                lines.append('    <var name="frazilFormation"/>')
                lines.append('    <var name="snowThicknessChange"/>')
                lines.append('    <var name="snowAlbedoCell"/>')
                lines.append('    <var name="bareIceAlbedoCell"/>')
                lines.append('    <var name="pondAlbedoCell"/>')
                lines.append('    <var name="totalVerticalDiatomIce"/>')
                lines.append('    <var name="totalVerticalSmallPlanktonIce"/>')
                lines.append('    <var name="totalVerticalAlgaeCarbonIce"/>')
                lines.append('    <var name="totalVerticalNitrateIce"/>')
                lines.append('    <var name="totalVerticalAmmoniumIce"/>')
                lines.append('    <var name="totalVerticalSilicateIce"/>')
                lines.append('    <var name="totalVerticalProteinsIce"/>')
                lines.append('    <var name="totalVerticalDOCLabileIce"/>')
                lines.append('    <var name="totalVerticalHumicsIce"/>')
                lines.append('    <var name="totalVerticalDissolvedIronIce"/>')
                lines.append('    <var name="totalVerticalParticulateIronIce"/>')
                lines.append('    <var name="totalVerticalBCIce"/>')
                lines.append('    <var name="totalVerticalBCSnow"/>')
                lines.append('    <var name="totalVerticalDustIce"/>')
                lines.append('    <var name="totalVerticalDustSnow"/>')
                lines.append('    <var name="totalVerticalDissolvedIronSnow"/>')
                lines.append('    <var name="verticalAlgaeTotalCarbonIceCell"/>')
                lines.append('    <var name="verticalDOCLabileIceCell"/>')
                lines.append('    <var name="verticalDONIceCell"/>')
                lines.append('    <var name="verticalDICIceCell"/>')
                lines.append('    <var name="verticalNitrateIceCell"/>')
                lines.append('    <var name="verticalSilicateIceCell"/>')
                lines.append('    <var name="verticalAmmoniumIceCell"/>')
                lines.append('    <var name="verticalHumicsIceCell"/>')
                lines.append('    <var name="verticalDissolvedIronIceCell"/>')
                lines.append('    <var name="verticalBCTotalIceCell"/>')
                lines.append('    <var name="verticalDustTotalIceCell"/>')
                lines.append('    <var name="verticalBCTotalSnowCell"/>')
                lines.append('    <var name="verticalDustTotalSnowCell"/>')
                lines.append('    <var name="iceEnthalpyCell"/>')
                lines.append('    <var name="iceSalinityCell"/>')
                lines.append('    <var name="oceanBioFluxes"/>')
                lines.append('    <var name="oceanBioConcentrations"/>')
                lines.append('    <var name="primaryProduction"/>')
                lines.append('    <var name="netNitrateUptake"/>')
                lines.append('    <var name="netAmmoniumUptake"/>')
                lines.append('    <var name="netSpecificAlgalGrowthRate"/>')
                lines.append('    <var name="totalChlorophyll"/>')
                lines.append('    <var name="iceAreaCell"/>')
                lines.append('    <var name="iceVolumeCell"/>')
                lines.append('    <var name="snowVolumeCell"/>')
                lines.append('    <var name="iceVolumeRidged"/>')
                lines.append('    <var name="oceanShortwaveFlux"/>')
                lines.append('    <var name="shortwaveDown"/>')
                lines.append('    <var name="bioShortwaveFlux"/>')
                lines.append('    <var name="daysSinceStartOfSim"/>')
                lines.append('    <var name="seaSurfaceSalinity"/>')
                lines.append('</stream>')

            lines.append('')

            lines.append('<stream name="timeSeriesStatsMonthlyRestart"')
            lines.append('        type="input;output"')
            lines.append('        io_type="{}"'.format(ice_pio_typename))
            lines.append('        filename_template="{}.mpassi{}.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('        packages="timeSeriesStatsMonthlyAMPKG"')
            lines.append('        input_interval="none"')
            lines.append('        reference_time="01-01-01_00:00:00"')
            lines.append('        output_interval="none">')
            lines.append('</stream>')
            lines.append('')
            lines.append('<stream name="timeSeriesStatsClimatologyOutput"')
            lines.append('        type="output"')
            lines.append('        io_type="{}"'.format(ice_pio_typename))
            lines.append('        filename_template="{}.mpassi{}.hist.am.timeSeriesStatsClimatology.$Y.nc"'.format(casename, inst_string))
            lines.append('        filename_interval="00-01-00_00:00:00"')
            lines.append('        clobber_mode="truncate"')
            lines.append('        packages="timeSeriesStatsClimatologyAMPKG"')
            lines.append('        reference_time="01-01-01_00:00:00"')
            lines.append('        output_interval="10-00-00_00:00:00" >')
            lines.append('')
            lines.append('    <var name="daysSinceStartOfSim"/>')
            lines.append('    <var name="icePresent"/>')
            lines.append('    <var name="iceAreaCell"/>')
            lines.append('    <var name="iceVolumeCell"/>')
            lines.append('</stream>')
            lines.append('')
            lines.append('<stream name="timeSeriesStatsClimatologyRestart"')
            lines.append('        type="input;output"')
            lines.append('        io_type="{}"'.format(ice_pio_typename))
            lines.append('        filename_template="{}.mpassi{}.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('        packages="timeSeriesStatsClimatologyAMPKG"')
            lines.append('        input_interval="initial_only"')
            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="landIceMasks"')
            lines.append('        type="input"')
            lines.append('        io_type="{}"'.format(ice_pio_typename))
            lines.append('        input_interval="initial_only"')
            lines.append('        filename_template="{}/ice/mpas-seaice/{}/{}.{}.nc">'.format(din_loc_root, ice_mask, grid_prefix, grid_date))
            lines.append('')
            lines.append('       <var name="landIceMask"/>')
            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, "mpassi")

if __name__ == "__main__":
    _main_func()
