# autogenerated file, do not modify

from os import PathLike, curdir
from typing import Union

from flopy.mf6.data.mfdatautil import ArrayTemplateGenerator, ListTemplateGenerator
from flopy.mf6.mfpackage import MFChildPackages, MFPackage


class ModflowGwfsfr(MFPackage):
    """
    ModflowGwfsfr defines a SFR package.

    Parameters
    ----------
    model
        Model that this package is a part of. Package is automatically
        added to model when it is initialized.
    loading_package : bool, default False
        Do not set this parameter. It is intended for debugging and internal
        processing purposes only.
    storage : keyword
        keyword that activates storage contributions to the stream-flow routing package
        continuity equation.
    auxiliary : [string]
        defines an array of one or more auxiliary variable names.  there is no limit on
        the number of auxiliary variables that can be provided on this line; however,
        lists of information provided in subsequent blocks must have a column of data
        for each auxiliary variable name defined here.   the number of auxiliary
        variables detected on this line determines the value for naux.  comments cannot
        be provided anywhere on this line as they will be interpreted as auxiliary
        variable names.  auxiliary variables may not be used by the package, but they
        will be available for use by other parts of the program.  the program will
        terminate with an error if auxiliary variables are specified on more than one
        line in the options block.
    boundnames : keyword
        keyword to indicate that boundary names may be provided with the list of stream
        reach cells.
    print_input : keyword
        keyword to indicate that the list of stream reach information will be written
        to the listing file immediately after it is read.
    print_stage : keyword
        keyword to indicate that the list of stream reach {#2} will be printed to the
        listing file for every stress period in which 'head print' is specified in
        output control.  if there is no output control option and print_{#3} is
        specified, then {#2} are printed for the last time step of each stress period.
    print_flows : keyword
        keyword to indicate that the list of stream reach flow rates will be printed to
        the listing file for every stress period time step in which 'budget print' is
        specified in output control.  if there is no output control option and
        'print_flows' is specified, then flow rates are printed for the last time step
        of each stress period.
    save_flows : keyword
        keyword to indicate that stream reach flow terms will be written to the file
        specified with 'budget fileout' in output control.
    stage_filerecord : (stagefile)
        * stagefile : string
                name of the binary output file to write stage information.

    budget_filerecord : (budgetfile)
        * budgetfile : string
                name of the binary output file to write budget information.

    budgetcsv_filerecord : (budgetcsvfile)
        * budgetcsvfile : string
                name of the comma-separated value (CSV) output file to write budget summary
                information.  A budget summary record will be written to this file for each
                time step of the simulation.

    package_convergence_filerecord : (package_convergence_filename)
        * package_convergence_filename : string
                name of the comma spaced values output file to write package convergence
                information.

    timeseries : record ts6 filein ts6_filename
        Contains data for the ts package. Data can be passed as a dictionary to the ts
        package with variable names as keys and package data as values. Data for the
        timeseries variable is also acceptable. See ts package documentation for more
        information.
    observations : record obs6 filein obs6_filename
        Contains data for the obs package. Data can be passed as a dictionary to the
        obs package with variable names as keys and package data as values. Data for
        the observations variable is also acceptable. See obs package documentation for
        more information.
    mover : keyword
        keyword to indicate that this instance of the sfr package can be used with the
        water mover (mvr) package.  when the mover option is specified, additional
        memory is allocated within the package to store the available, provided, and
        received water.
    maximum_picard_iterations : integer
        integer value that defines the maximum number of streamflow routing picard
        iterations allowed when solving for reach stages and flows as part of the gwf
        formulate step. picard iterations are used to minimize differences in sfr
        package results between subsequent gwf picard (non-linear) iterations as a
        result of non-optimal reach numbering. if reaches are numbered in order, from
        upstream to downstream, maximum_picard_iterations can be set to 1 to reduce
        model run time. by default, maximum_picard_iterations is equal to 100.
    maximum_iterations : integer
        integer value that defines the maximum number of streamflow routing newton-
        raphson iterations allowed for a reach. by default, maximum_iterations is equal
        to 100. maximum_iterations would only need to be increased from the default
        value if one or more reach in a simulation has a large water budget error.
    maximum_depth_change : double precision
        real value that defines the depth closure tolerance. by default,
        maximum_depth_change is equal to :math:`1 times 10^{-5}`. the
        maximum_stage_change would only need to be increased or decreased from the
        default value if the water budget error for one or more reach is too small or
        too large, respectively.
    unit_conversion : double precision
        real value that is used to convert user-specified manning's roughness
        coefficients from seconds per meters:math:`^{1/3}` to model length and time
        units. a constant of 1.486 is used for flow units of cubic feet per second, and
        a constant of 1.0 is used for units of cubic meters per second. the constant
        must be multiplied by 86,400 when using time units of days in the simulation.
    length_conversion : double precision
        real value that is used to convert user-specified manning's roughness
        coefficients from meters to model length units. length_conversion should be set
        to 3.28081, 1.0, and 100.0 when using length units (length_units) of feet,
        meters, or centimeters in the simulation, respectively. length_conversion does
        not need to be specified if length_units are meters.
    time_conversion : double precision
        real value that is used to convert user-specified manning's roughness
        coefficients from seconds to model time units. time_conversion should be set to
        1.0, 60.0, 3,600.0, 86,400.0, and 31,557,600.0 when using time units
        (time_units) of seconds, minutes, hours, days, or years in the simulation,
        respectively. time_conversion does not need to be specified if time_units are
        seconds.
    dev_storage_weight : double precision
        real number value that defines the time weighting factor used to calculate the
        change in channel storage. storage_weight must have a value between 0.5 and 1.
        default storage_weight value is 1.
    nreaches : integer
        integer value specifying the number of stream reaches.  there must be nreaches
        entries in the packagedata block.
    packagedata : [(ifno, cellid, rlen, rwid, rgrd, rtp, rbth, rhk, man, ncon, ustrf, ndv, aux, boundname)]
        * ifno : integer
                integer value that defines the feature (reach) number associated with the
                specified PERIOD data on the line. IFNO must be greater than zero and less than
                or equal to NREACHES.
        * cellid : [integer]
                is the cell identifier, and depends on the type of grid that is used for the
                simulation. For a structured grid that uses the DIS input file, CELLID is the
                layer, row, and column. For a grid that uses the DISV input file, CELLID is the
                layer and CELL2D number. If the model uses the unstructured discretization
                (DISU) input file, CELLID is the node number for the cell. For reaches that are
                not connected to an underlying GWF cell, a zero should be specified for each
                grid dimension. For example, for a DIS grid a CELLID of 0 0 0 should be
                specified. Reach-aquifer flow is not calculated for unconnected reaches. The
                keyword NONE can be still be specified to identify unconnected reaches for
                backward compatibility with previous versions of MODFLOW 6 but eventually NONE
                will be deprecated and will cause MODFLOW 6 to terminate with an error.
        * rlen : double precision
                real value that defines the reach length. RLEN must be greater than zero.
        * rwid : double precision
                real value that defines the reach width. RWID must be greater than zero.
        * rgrd : double precision
                real value that defines the stream gradient (slope) across the reach. RGRD must
                be greater than zero.
        * rtp : double precision
                real value that defines the top elevation of the streambed of a reach.
        * rbth : double precision
                real value that defines the thickness of the reach streambed. RBTH can be any
                value if the reach is not connected to an underlying GWF cell. Otherwise, RBTH
                must be greater than zero.
        * rhk : double precision
                real or character value that defines the hydraulic conductivity of the reach
                streambed. RHK can be any positive value if the reach is not connected to an
                underlying GWF cell. Otherwise, RHK must be greater than zero. If the Options
                block includes a TIMESERIESFILE entry (see the 'Time-Variable Input' section),
                values can be obtained from a time series by entering the time-series name in
                place of a numeric value.
        * man : string
                real or character value that defines the Manning's roughness coefficient for
                the reach. MAN must be greater than zero.  If the Options block includes a
                TIMESERIESFILE entry (see the 'Time-Variable Input' section), values can be
                obtained from a time series by entering the time-series name in place of a
                numeric value.
        * ncon : integer
                integer value that defines the number of reaches connected to the reach.  If a
                value of zero is specified for NCON an entry for IFNO is still required in the
                subsequent CONNECTIONDATA block.
        * ustrf : double precision
                real value that defines the fraction of upstream flow from each upstream reach
                that is applied as upstream inflow to the reach. The sum of all USTRF values
                for all reaches connected to the same upstream reach must be equal to one and
                USTRF must be greater than or equal to zero. If the Options block includes a
                TIMESERIESFILE entry (see the 'Time-Variable Input' section), values can be
                obtained from a time series by entering the time-series name in place of a
                numeric value.
        * ndv : integer
                integer value that defines the number of downstream diversions for the reach.
        * aux : [double precision]
                represents the values of the auxiliary variables for each stream reach. The
                values of auxiliary variables must be present for each stream reach. The values
                must be specified in the order of the auxiliary variables specified in the
                OPTIONS block.  If the package supports time series and the Options block
                includes a TIMESERIESFILE entry (see the 'Time-Variable Input' section), values
                can be obtained from a time series by entering the time-series name in place of
                a numeric value.
        * boundname : string
                name of the stream reach cell.  BOUNDNAME is an ASCII character variable that
                can contain as many as 40 characters.  If BOUNDNAME contains spaces in it, then
                the entire name must be enclosed within single quotes.

    crosssections : [(ifno, tab6, filein, tab6_filename)]
        * ifno : integer
                integer value that defines the feature (reach) number associated with the
                specified PERIOD data on the line. IFNO must be greater than zero and less than
                or equal to NREACHES.
        * tab6 : keyword
                keyword to specify that record corresponds to a cross-section table file.
        * filein : keyword
                keyword to specify that an input filename is expected next.
        * tab6_filename : string
                character string that defines the path and filename for the file containing
                cross-section table data for the reach. The TAB6_FILENAME file includes the
                number of entries in the file and the station elevation data in terms of the
                fractional width and the reach depth. Instructions for creating the
                TAB6_FILENAME input file are provided in SFR Reach Cross-Section Table Input
                File section.

    connectiondata : [(ifno, ic)]
        * ifno : integer
                integer value that defines the feature (reach) number associated with the
                specified PERIOD data on the line. IFNO must be greater than zero and less than
                or equal to NREACHES.
        * ic : [integer]
                integer value that defines the reach number of the reach connected to the
                current reach and whether it is connected to the upstream or downstream end of
                the reach. Negative IC numbers indicate connected reaches are connected to the
                downstream end of the current reach. Positive IC numbers indicate connected
                reaches are connected to the upstream end of the current reach. The absolute
                value of IC must be greater than zero and less than or equal to NREACHES. IC
                should not be specified when NCON is zero but must be specified otherwise.

    diversions : [(ifno, idv, iconr, cprior)]
        * ifno : integer
                integer value that defines the feature (reach) number associated with the
                specified PERIOD data on the line. IFNO must be greater than zero and less than
                or equal to NREACHES.
        * idv : integer
                an integer value specifying which diversion of reach IFNO that DIVFLOW is being
                specified for.  Must be less or equal to ndv for the current reach (IFNO).
        * iconr : integer
                integer value that defines the downstream reach that will receive the diverted
                water. IDV must be greater than zero and less than or equal to NREACHES.
                Furthermore, reach  ICONR must be a downstream connection for reach IFNO.
        * cprior : string
                character string value that defines the the prioritization system for the
                diversion, such as when insufficient water is available to meet all diversion
                stipulations, and is used in conjunction with the value of FLOW value specified
                in the STRESS_PERIOD_DATA section. Available diversion options include:  (1)
                CPRIOR = 'FRACTION', then the amount of the diversion is computed as a fraction
                of the streamflow leaving reach IFNO (:math:`Q_{DS}`); in this case, 0.0
                :math:`le` DIVFLOW :math:`le` 1.0.  (2) CPRIOR = 'EXCESS', a diversion is made
                only if :math:`Q_{DS}` for reach IFNO exceeds the value of DIVFLOW. If this
                occurs, then the quantity of water diverted is the excess flow (:math:`Q_{DS}
                -` DIVFLOW) and :math:`Q_{DS}` from reach IFNO is set equal to DIVFLOW. This
                represents a flood-control type of diversion, as described by Danskin and
                Hanson (2002). (3) CPRIOR = 'THRESHOLD', then if :math:`Q_{DS}` in reach IFNO
                is less than the specified diversion flow DIVFLOW, no water is diverted from
                reach IFNO. If :math:`Q_{DS}` in reach IFNO is greater than or equal to
                DIVFLOW, DIVFLOW is diverted and :math:`Q_{DS}` is set to the remainder
                (:math:`Q_{DS} -` DIVFLOW)). This approach assumes that once flow in the stream
                is sufficiently low, diversions from the stream cease, and is the 'priority'
                algorithm that originally was programmed into the STR1 Package (Prudic, 1989).
                (4) CPRIOR = 'UPTO' -- if :math:`Q_{DS}` in reach IFNO is greater than or equal
                to the specified diversion flow DIVFLOW, :math:`Q_{DS}` is reduced by DIVFLOW.
                If :math:`Q_{DS}` in reach IFNO is less than DIVFLOW, DIVFLOW is set to
                :math:`Q_{DS}` and there will be no flow available for reaches connected to
                downstream end of reach IFNO.

    initialstages : [(ifno, initialstage)]
        * ifno : integer
                integer value that defines the feature (reach) number associated with the
                specified PERIOD data on the line. IFNO must be greater than zero and less than
                or equal to NREACHES.
        * initialstage : double precision
                real value that defines the initial stage for the reach. The program will
                terminate with an error if INITIALSTAGE is less than the RTP value for reach
                IFNO defined in the PACKAGEDATA block.  INITIALSTAGE data are used only if
                STORAGE is specified in the Options block and the first stress period is
                transient or for reaches defined to use the SIMPLE STATUS in the Period block.

    perioddata : [(ifno, sfrsetting)]
        * ifno : integer
                integer value that defines the feature (reach) number associated with the
                specified period data on the line. ifno must be greater than zero and less than
                or equal to nreaches.
        * sfrsetting : stage | status | bedk | manning | inflow | rainfall | evaporation | runoff | diversionrecord | upstream_fraction | cross_sectionrecord | auxiliaryrecord
                line of information that is parsed into a keyword and values.  keyword values
                that can be used to start the sfrsetting string include: status, bedk, manning,
                stage, inflow, rainfall, evaporation, runoff, diversion, upstream_fraction, and
                auxiliary.
                * stage : string
                            real or character value that defines the stage for the reach. the specified
                            stage is only applied if the reach uses the simple routing option. if stage is
                            not specified for reaches that use the simple routing option, the specified
                            stage is set to the top of the reach. if the options block includes a
                            timeseriesfile entry (see the 'time-variable input' section), values can be
                            obtained from a time series by entering the time-series name in place of a
                            numeric value.
                * status : string
                            keyword option to define stream reach status.  status can be active, inactive,
                            or simple. the simple status option simulates streamflow using a user-specified
                            stage for a reach or a stage set to the top of the reach (depth = 0). in cases
                            where the simulated leakage calculated using the specified stage exceeds the
                            sum of inflows to the reach, the stage is set to the top of the reach and
                            leakage is set equal to the sum of inflows. upstream fractions should be
                            changed using the upstream_fraction sfrsetting if the status for one or more
                            reaches is changed to active or inactive. for example, if one of two downstream
                            connections for a reach is inactivated, the upstream fraction for the active
                            and inactive downstream reach should be changed to 1.0 and 0.0, respectively,
                            to ensure that the active reach receives all of the downstream outflow from the
                            upstream reach. by default, status is active.
                * bedk : string
                            real or character value that defines the hydraulic conductivity of the reach
                            streambed. bedk can be any positive value if the reach is not connected to an
                            underlying gwf cell. otherwise, bedk must be greater than zero. if the options
                            block includes a timeseriesfile entry (see the 'time-variable input' section),
                            values can be obtained from a time series by entering the time-series name in
                            place of a numeric value.
                * manning : string
                            real or character value that defines the manning's roughness coefficient for
                            the reach. manning must be greater than zero.  if the options block includes a
                            timeseriesfile entry (see the 'time-variable input' section), values can be
                            obtained from a time series by entering the time-series name in place of a
                            numeric value.
                * inflow : string
                            real or character value that defines the volumetric inflow rate for the
                            streamflow routing reach. if the options block includes a timeseriesfile entry
                            (see the 'time-variable input' section), values can be obtained from a time
                            series by entering the time-series name in place of a numeric value. by
                            default, inflow rates are zero for each reach.
                * rainfall : string
                            real or character value that defines the  volumetric rate per unit area of
                            water added by precipitation directly on the streamflow routing reach. if the
                            options block includes a timeseriesfile entry (see the 'time-variable input'
                            section), values can be obtained from a time series by entering the time-series
                            name in place of a numeric value. by default, rainfall  rates are zero for each
                            reach.
                * evaporation : string
                            real or character value that defines the volumetric rate per unit area of water
                            subtracted by evaporation from the streamflow routing reach. a positive
                            evaporation rate should be provided. if the options block includes a
                            timeseriesfile entry (see the 'time-variable input' section), values can be
                            obtained from a time series by entering the time-series name in place of a
                            numeric value. if the volumetric evaporation rate for a reach exceeds the
                            sources of water to the reach (upstream and specified inflows, rainfall, and
                            runoff but excluding groundwater leakage into the reach) the volumetric
                            evaporation rate is limited to the sources of water to the reach. by default,
                            evaporation rates are zero for each reach.
                * runoff : string
                            real or character value that defines the volumetric rate of diffuse overland
                            runoff that enters the streamflow routing reach. if the options block includes
                            a timeseriesfile entry (see the 'time-variable input' section), values can be
                            obtained from a time series by entering the time-series name in place of a
                            numeric value. if the volumetric runoff rate for a reach is negative and
                            exceeds inflows to the reach (upstream and specified inflows, and rainfall but
                            excluding groundwater leakage into the reach) the volumetric runoff rate is
                            limited to inflows to the reach and the volumetric evaporation rate for the
                            reach is set to zero. by default, runoff rates are zero for each reach.
                * diversionrecord : (diversion, idv, divflow)
                            * diversion : keyword
                                            keyword to indicate diversion record.
                            * idv : integer
                                            an integer value specifying which diversion of reach IFNO that DIVFLOW is being
                                            specified for.  Must be less or equal to ndv for the current reach (IFNO).
                            * divflow : double precision
                                            real or character value that defines the volumetric diversion (DIVFLOW) rate
                                            for the streamflow routing reach. If the Options block includes a
                                            TIMESERIESFILE entry (see the 'Time-Variable Input' section), values can be
                                            obtained from a time series by entering the time-series name in place of a
                                            numeric value.

                * upstream_fraction : double precision
                            real value that defines the fraction of upstream flow (ustrf) from each
                            upstream reach that is applied as upstream inflow to the reach. the sum of all
                            ustrf values for all reaches connected to the same upstream reach must be equal
                            to one.
                * cross_sectionrecord : (cross_section, tab6, filein, tab6_filename)
                            * cross_section : keyword
                                            keyword to specify that record corresponds to a reach cross-section.
                            * tab6 : keyword
                                            keyword to specify that record corresponds to a cross-section table file.
                            * filein : keyword
                                            keyword to specify that an input filename is expected next.
                            * tab6_filename : string
                                            character string that defines the path and filename for the file containing
                                            cross-section table data for the reach. The TAB6_FILENAME file includes the
                                            number of entries in the file and the station elevation data in terms of the
                                            fractional width and the reach depth. Instructions for creating the
                                            TAB6_FILENAME input file are provided in SFR Reach Cross-Section Table Input
                                            File section.

                * auxiliaryrecord : (auxiliary, auxname, auxval)
                            * auxiliary : keyword
                                            keyword for specifying auxiliary variable.
                            * auxname : string
                                            name for the auxiliary variable to be assigned AUXVAL.  AUXNAME must match one
                                            of the auxiliary variable names defined in the OPTIONS block. If AUXNAME does
                                            not match one of the auxiliary variable names defined in the OPTIONS block the
                                            data are ignored.
                            * auxval : double precision
                                            value for the auxiliary variable.  If the Options block includes a
                                            TIMESERIESFILE entry (see the 'Time-Variable Input' section), values can be
                                            obtained from a time series by entering the time-series name in place of a
                                            numeric value.




    filename : str or PathLike, optional
        Name or path of file where this package is stored.
    pname : str, optional
        Package name.
    **kwargs
        Extra keywords for :class:`flopy.mf6.mfpackage.MFPackage`.

    """

    auxiliary = ArrayTemplateGenerator(("gwf6", "sfr", "options", "auxiliary"))
    stage_filerecord = ListTemplateGenerator(
        ("gwf6", "sfr", "options", "stage_filerecord")
    )
    budget_filerecord = ListTemplateGenerator(
        ("gwf6", "sfr", "options", "budget_filerecord")
    )
    budgetcsv_filerecord = ListTemplateGenerator(
        ("gwf6", "sfr", "options", "budgetcsv_filerecord")
    )
    package_convergence_filerecord = ListTemplateGenerator(
        ("gwf6", "sfr", "options", "package_convergence_filerecord")
    )
    ts_filerecord = ListTemplateGenerator(("gwf6", "sfr", "options", "ts_filerecord"))
    obs_filerecord = ListTemplateGenerator(("gwf6", "sfr", "options", "obs_filerecord"))
    packagedata = ListTemplateGenerator(("gwf6", "sfr", "packagedata", "packagedata"))
    crosssections = ListTemplateGenerator(
        ("gwf6", "sfr", "crosssections", "crosssections")
    )
    connectiondata = ListTemplateGenerator(
        ("gwf6", "sfr", "connectiondata", "connectiondata")
    )
    diversions = ListTemplateGenerator(("gwf6", "sfr", "diversions", "diversions"))
    initialstages = ListTemplateGenerator(
        ("gwf6", "sfr", "initialstages", "initialstages")
    )
    perioddata = ListTemplateGenerator(("gwf6", "sfr", "period", "perioddata"))
    package_abbr = "gwfsfr"
    _package_type = "sfr"
    dfn_file_name = "gwf-sfr.dfn"
    dfn = [
        ["header", "multi-package", "package-type advanced-stress-package"],
        [
            "block options",
            "name storage",
            "type keyword",
            "reader urword",
            "optional true",
        ],
        [
            "block options",
            "name auxiliary",
            "type string",
            "shape (naux)",
            "reader urword",
            "optional true",
        ],
        [
            "block options",
            "name boundnames",
            "type keyword",
            "shape",
            "reader urword",
            "optional true",
        ],
        [
            "block options",
            "name print_input",
            "type keyword",
            "reader urword",
            "optional true",
        ],
        [
            "block options",
            "name print_stage",
            "type keyword",
            "reader urword",
            "optional true",
        ],
        [
            "block options",
            "name print_flows",
            "type keyword",
            "reader urword",
            "optional true",
        ],
        [
            "block options",
            "name save_flows",
            "type keyword",
            "reader urword",
            "optional true",
        ],
        [
            "block options",
            "name stage_filerecord",
            "type record stage fileout stagefile",
            "shape",
            "reader urword",
            "tagged true",
            "optional true",
        ],
        [
            "block options",
            "name stage",
            "type keyword",
            "shape",
            "in_record true",
            "reader urword",
            "tagged true",
            "optional false",
        ],
        [
            "block options",
            "name stagefile",
            "type string",
            "preserve_case true",
            "shape",
            "in_record true",
            "reader urword",
            "tagged false",
            "optional false",
        ],
        [
            "block options",
            "name budget_filerecord",
            "type record budget fileout budgetfile",
            "shape",
            "reader urword",
            "tagged true",
            "optional true",
        ],
        [
            "block options",
            "name budget",
            "type keyword",
            "shape",
            "in_record true",
            "reader urword",
            "tagged true",
            "optional false",
        ],
        [
            "block options",
            "name fileout",
            "type keyword",
            "shape",
            "in_record true",
            "reader urword",
            "tagged true",
            "optional false",
        ],
        [
            "block options",
            "name budgetfile",
            "type string",
            "preserve_case true",
            "shape",
            "in_record true",
            "reader urword",
            "tagged false",
            "optional false",
        ],
        [
            "block options",
            "name budgetcsv_filerecord",
            "type record budgetcsv fileout budgetcsvfile",
            "shape",
            "reader urword",
            "tagged true",
            "optional true",
        ],
        [
            "block options",
            "name budgetcsv",
            "type keyword",
            "shape",
            "in_record true",
            "reader urword",
            "tagged true",
            "optional false",
        ],
        [
            "block options",
            "name budgetcsvfile",
            "type string",
            "preserve_case true",
            "shape",
            "in_record true",
            "reader urword",
            "tagged false",
            "optional false",
        ],
        [
            "block options",
            "name package_convergence_filerecord",
            "type record package_convergence fileout package_convergence_filename",
            "shape",
            "reader urword",
            "tagged true",
            "optional true",
        ],
        [
            "block options",
            "name package_convergence",
            "type keyword",
            "shape",
            "in_record true",
            "reader urword",
            "tagged true",
            "optional false",
        ],
        [
            "block options",
            "name package_convergence_filename",
            "type string",
            "shape",
            "in_record true",
            "reader urword",
            "tagged false",
            "optional false",
        ],
        [
            "block options",
            "name ts_filerecord",
            "type record ts6 filein ts6_filename",
            "shape",
            "reader urword",
            "tagged true",
            "optional true",
            "construct_package ts",
            "construct_data timeseries",
            "parameter_name timeseries",
        ],
        [
            "block options",
            "name ts6",
            "type keyword",
            "shape",
            "in_record true",
            "reader urword",
            "tagged true",
            "optional false",
        ],
        [
            "block options",
            "name filein",
            "type keyword",
            "shape",
            "in_record true",
            "reader urword",
            "tagged true",
            "optional false",
        ],
        [
            "block options",
            "name ts6_filename",
            "type string",
            "preserve_case true",
            "in_record true",
            "reader urword",
            "optional false",
            "tagged false",
        ],
        [
            "block options",
            "name obs_filerecord",
            "type record obs6 filein obs6_filename",
            "shape",
            "reader urword",
            "tagged true",
            "optional true",
            "construct_package obs",
            "construct_data observations",
            "parameter_name continuous",
        ],
        [
            "block options",
            "name obs6",
            "type keyword",
            "shape",
            "in_record true",
            "reader urword",
            "tagged true",
            "optional false",
        ],
        [
            "block options",
            "name obs6_filename",
            "type string",
            "preserve_case true",
            "in_record true",
            "tagged false",
            "reader urword",
            "optional false",
        ],
        [
            "block options",
            "name mover",
            "type keyword",
            "tagged true",
            "reader urword",
            "optional true",
        ],
        [
            "block options",
            "name maximum_picard_iterations",
            "type integer",
            "reader urword",
            "optional true",
        ],
        [
            "block options",
            "name maximum_iterations",
            "type integer",
            "reader urword",
            "optional true",
        ],
        [
            "block options",
            "name maximum_depth_change",
            "type double precision",
            "reader urword",
            "optional true",
        ],
        [
            "block options",
            "name unit_conversion",
            "type double precision",
            "reader urword",
            "optional true",
            "deprecated 6.4.2",
        ],
        [
            "block options",
            "name length_conversion",
            "type double precision",
            "reader urword",
            "optional true",
        ],
        [
            "block options",
            "name time_conversion",
            "type double precision",
            "reader urword",
            "optional true",
        ],
        [
            "block options",
            "name dev_storage_weight",
            "type double precision",
            "reader urword",
            "optional true",
        ],
        [
            "block dimensions",
            "name nreaches",
            "type integer",
            "reader urword",
            "optional false",
        ],
        [
            "block packagedata",
            "name packagedata",
            "type recarray ifno cellid rlen rwid rgrd rtp rbth rhk man ncon ustrf ndv aux boundname",
            "shape (maxbound)",
            "reader urword",
        ],
        [
            "block packagedata",
            "name ifno",
            "type integer",
            "shape",
            "tagged false",
            "in_record true",
            "reader urword",
            "numeric_index true",
        ],
        [
            "block packagedata",
            "name cellid",
            "type integer",
            "shape (ncelldim)",
            "tagged false",
            "in_record true",
            "reader urword",
        ],
        [
            "block packagedata",
            "name rlen",
            "type double precision",
            "shape",
            "tagged false",
            "in_record true",
            "reader urword",
        ],
        [
            "block packagedata",
            "name rwid",
            "type double precision",
            "shape",
            "tagged false",
            "in_record true",
            "reader urword",
        ],
        [
            "block packagedata",
            "name rgrd",
            "type double precision",
            "shape",
            "tagged false",
            "in_record true",
            "reader urword",
        ],
        [
            "block packagedata",
            "name rtp",
            "type double precision",
            "shape",
            "tagged false",
            "in_record true",
            "reader urword",
        ],
        [
            "block packagedata",
            "name rbth",
            "type double precision",
            "shape",
            "tagged false",
            "in_record true",
            "reader urword",
        ],
        [
            "block packagedata",
            "name rhk",
            "type double precision",
            "shape",
            "tagged false",
            "in_record true",
            "reader urword",
            "time_series true",
        ],
        [
            "block packagedata",
            "name man",
            "type string",
            "shape",
            "tagged false",
            "in_record true",
            "reader urword",
            "time_series true",
        ],
        [
            "block packagedata",
            "name ncon",
            "type integer",
            "shape",
            "tagged false",
            "in_record true",
            "reader urword",
        ],
        [
            "block packagedata",
            "name ustrf",
            "type double precision",
            "shape",
            "tagged false",
            "in_record true",
            "reader urword",
            "time_series true",
        ],
        [
            "block packagedata",
            "name ndv",
            "type integer",
            "shape",
            "tagged false",
            "in_record true",
            "reader urword",
        ],
        [
            "block packagedata",
            "name aux",
            "type double precision",
            "in_record true",
            "tagged false",
            "shape (naux)",
            "reader urword",
            "time_series true",
            "optional true",
        ],
        [
            "block packagedata",
            "name boundname",
            "type string",
            "shape",
            "tagged false",
            "in_record true",
            "reader urword",
            "optional true",
        ],
        [
            "block crosssections",
            "name crosssections",
            "type recarray ifno tab6 filein tab6_filename",
            "shape",
            "valid",
            "optional false",
            "reader urword",
        ],
        [
            "block crosssections",
            "name ifno",
            "type integer",
            "shape",
            "tagged false",
            "in_record true",
            "reader urword",
            "numeric_index true",
        ],
        [
            "block crosssections",
            "name tab6",
            "type keyword",
            "shape",
            "in_record true",
            "reader urword",
            "tagged true",
            "optional false",
        ],
        [
            "block crosssections",
            "name filein",
            "type keyword",
            "shape",
            "in_record true",
            "reader urword",
            "tagged true",
            "optional false",
        ],
        [
            "block crosssections",
            "name tab6_filename",
            "type string",
            "preserve_case true",
            "in_record true",
            "reader urword",
            "optional false",
            "tagged false",
        ],
        [
            "block connectiondata",
            "name connectiondata",
            "type recarray ifno ic",
            "shape (maxbound)",
            "reader urword",
        ],
        [
            "block connectiondata",
            "name ifno",
            "type integer",
            "shape",
            "tagged false",
            "in_record true",
            "reader urword",
            "numeric_index true",
        ],
        [
            "block connectiondata",
            "name ic",
            "type integer",
            "shape (ncon(ifno))",
            "tagged false",
            "in_record true",
            "reader urword",
            "optional true",
            "numeric_index true",
            "support_negative_index true",
        ],
        [
            "block diversions",
            "name diversions",
            "type recarray ifno idv iconr cprior",
            "shape (maxbound)",
            "reader urword",
        ],
        [
            "block diversions",
            "name ifno",
            "type integer",
            "shape",
            "tagged false",
            "in_record true",
            "reader urword",
            "numeric_index true",
        ],
        [
            "block diversions",
            "name idv",
            "type integer",
            "shape",
            "tagged false",
            "in_record true",
            "reader urword",
            "numeric_index true",
        ],
        [
            "block diversions",
            "name iconr",
            "type integer",
            "shape",
            "tagged false",
            "in_record true",
            "reader urword",
            "numeric_index true",
        ],
        [
            "block diversions",
            "name cprior",
            "type string",
            "shape",
            "tagged false",
            "in_record true",
            "reader urword",
        ],
        [
            "block initialstages",
            "name initialstages",
            "type recarray ifno initialstage",
            "shape (maxbound)",
            "valid",
            "optional false",
            "reader urword",
        ],
        [
            "block initialstages",
            "name ifno",
            "type integer",
            "shape",
            "tagged false",
            "in_record true",
            "optional false",
            "reader urword",
            "numeric_index true",
        ],
        [
            "block initialstages",
            "name initialstage",
            "type double precision",
            "shape",
            "tagged false",
            "in_record true",
            "optional false",
            "reader urword",
        ],
        [
            "block period",
            "name iper",
            "type integer",
            "block_variable true",
            "in_record true",
            "tagged false",
            "shape",
            "valid",
            "reader urword",
            "optional false",
        ],
        [
            "block period",
            "name perioddata",
            "type recarray ifno sfrsetting",
            "shape",
            "reader urword",
        ],
        [
            "block period",
            "name ifno",
            "type integer",
            "shape",
            "tagged false",
            "in_record true",
            "reader urword",
            "numeric_index true",
        ],
        [
            "block period",
            "name sfrsetting",
            "type keystring status bedk manning stage inflow rainfall evaporation runoff diversionrecord upstream_fraction cross_sectionrecord auxiliaryrecord",
            "shape",
            "tagged false",
            "in_record true",
            "reader urword",
        ],
        [
            "block period",
            "name status",
            "type string",
            "shape",
            "tagged true",
            "in_record true",
            "reader urword",
        ],
        [
            "block period",
            "name bedk",
            "type string",
            "shape",
            "tagged true",
            "in_record true",
            "reader urword",
            "time_series true",
        ],
        [
            "block period",
            "name manning",
            "type string",
            "shape",
            "tagged true",
            "in_record true",
            "reader urword",
            "time_series true",
        ],
        [
            "block period",
            "name stage",
            "type string",
            "shape",
            "tagged true",
            "in_record true",
            "reader urword",
            "time_series true",
        ],
        [
            "block period",
            "name inflow",
            "type string",
            "shape",
            "tagged true",
            "in_record true",
            "reader urword",
            "time_series true",
        ],
        [
            "block period",
            "name rainfall",
            "type string",
            "shape",
            "tagged true",
            "in_record true",
            "reader urword",
            "time_series true",
        ],
        [
            "block period",
            "name evaporation",
            "type string",
            "shape",
            "tagged true",
            "in_record true",
            "reader urword",
            "time_series true",
        ],
        [
            "block period",
            "name runoff",
            "type string",
            "shape",
            "tagged true",
            "in_record true",
            "reader urword",
            "time_series true",
        ],
        [
            "block period",
            "name diversionrecord",
            "type record diversion idv divflow",
            "shape",
            "tagged",
            "in_record true",
            "reader urword",
        ],
        [
            "block period",
            "name diversion",
            "type keyword",
            "shape",
            "in_record true",
            "reader urword",
        ],
        [
            "block period",
            "name idv",
            "type integer",
            "shape",
            "tagged false",
            "in_record true",
            "reader urword",
            "numeric_index true",
        ],
        [
            "block period",
            "name divflow",
            "type double precision",
            "shape",
            "tagged false",
            "in_record true",
            "reader urword",
            "time_series true",
        ],
        [
            "block period",
            "name upstream_fraction",
            "type double precision",
            "shape",
            "tagged true",
            "in_record true",
            "reader urword",
        ],
        [
            "block period",
            "name cross_sectionrecord",
            "type record cross_section tab6 filein tab6_filename",
            "shape",
            "tagged",
            "in_record true",
            "reader urword",
        ],
        [
            "block period",
            "name cross_section",
            "type keyword",
            "shape",
            "in_record true",
            "reader urword",
            "tagged true",
            "optional false",
        ],
        [
            "block period",
            "name tab6",
            "type keyword",
            "shape",
            "in_record true",
            "reader urword",
            "tagged true",
            "optional false",
        ],
        [
            "block period",
            "name filein",
            "type keyword",
            "shape",
            "in_record true",
            "reader urword",
            "tagged true",
            "optional false",
        ],
        [
            "block period",
            "name tab6_filename",
            "type string",
            "preserve_case true",
            "in_record true",
            "reader urword",
            "optional false",
            "tagged false",
        ],
        [
            "block period",
            "name auxiliaryrecord",
            "type record auxiliary auxname auxval",
            "shape",
            "tagged",
            "in_record true",
            "reader urword",
        ],
        [
            "block period",
            "name auxiliary",
            "type keyword",
            "shape",
            "in_record true",
            "reader urword",
        ],
        [
            "block period",
            "name auxname",
            "type string",
            "shape",
            "tagged false",
            "in_record true",
            "reader urword",
        ],
        [
            "block period",
            "name auxval",
            "type double precision",
            "shape",
            "tagged false",
            "in_record true",
            "reader urword",
            "time_series true",
        ],
    ]

    def __init__(
        self,
        model,
        loading_package=False,
        storage=None,
        auxiliary=None,
        boundnames=None,
        print_input=None,
        print_stage=None,
        print_flows=None,
        save_flows=None,
        stage_filerecord=None,
        budget_filerecord=None,
        budgetcsv_filerecord=None,
        package_convergence_filerecord=None,
        timeseries=None,
        observations=None,
        mover=None,
        maximum_picard_iterations=None,
        maximum_iterations=None,
        maximum_depth_change=None,
        unit_conversion=None,
        length_conversion=None,
        time_conversion=None,
        dev_storage_weight=None,
        nreaches=None,
        packagedata=None,
        crosssections=None,
        connectiondata=None,
        diversions=None,
        initialstages=None,
        perioddata=None,
        filename=None,
        pname=None,
        **kwargs,
    ):
        """Initialize ModflowGwfsfr."""
        super().__init__(
            parent=model,
            package_type="sfr",
            filename=filename,
            pname=pname,
            loading_package=loading_package,
            **kwargs,
        )

        self.storage = self.build_mfdata("storage", storage)
        self.auxiliary = self.build_mfdata("auxiliary", auxiliary)
        self.boundnames = self.build_mfdata("boundnames", boundnames)
        self.print_input = self.build_mfdata("print_input", print_input)
        self.print_stage = self.build_mfdata("print_stage", print_stage)
        self.print_flows = self.build_mfdata("print_flows", print_flows)
        self.save_flows = self.build_mfdata("save_flows", save_flows)
        self.stage_filerecord = self.build_mfdata("stage_filerecord", stage_filerecord)
        self.budget_filerecord = self.build_mfdata(
            "budget_filerecord", budget_filerecord
        )
        self.budgetcsv_filerecord = self.build_mfdata(
            "budgetcsv_filerecord", budgetcsv_filerecord
        )
        self.package_convergence_filerecord = self.build_mfdata(
            "package_convergence_filerecord", package_convergence_filerecord
        )
        self._ts_filerecord = self.build_mfdata("ts_filerecord", None)
        self._ts_package = self.build_child_package(
            "ts", timeseries, "timeseries", self._ts_filerecord
        )
        self._obs_filerecord = self.build_mfdata("obs_filerecord", None)
        self._obs_package = self.build_child_package(
            "obs", observations, "continuous", self._obs_filerecord
        )
        self.mover = self.build_mfdata("mover", mover)
        self.maximum_picard_iterations = self.build_mfdata(
            "maximum_picard_iterations", maximum_picard_iterations
        )
        self.maximum_iterations = self.build_mfdata(
            "maximum_iterations", maximum_iterations
        )
        self.maximum_depth_change = self.build_mfdata(
            "maximum_depth_change", maximum_depth_change
        )
        self.unit_conversion = self.build_mfdata("unit_conversion", unit_conversion)
        self.length_conversion = self.build_mfdata(
            "length_conversion", length_conversion
        )
        self.time_conversion = self.build_mfdata("time_conversion", time_conversion)
        self.dev_storage_weight = self.build_mfdata(
            "dev_storage_weight", dev_storage_weight
        )
        self.nreaches = self.build_mfdata("nreaches", nreaches)
        self.packagedata = self.build_mfdata("packagedata", packagedata)
        self.crosssections = self.build_mfdata("crosssections", crosssections)
        self.connectiondata = self.build_mfdata("connectiondata", connectiondata)
        self.diversions = self.build_mfdata("diversions", diversions)
        self.initialstages = self.build_mfdata("initialstages", initialstages)
        self.perioddata = self.build_mfdata("perioddata", perioddata)

        self._init_complete = True
