# Source code for imod.wq.vdf

from imod.wq.pkgbase import Package

[docs]class VariableDensityFlow(Package):
"""
Variable Density Flow package.

Parameters
----------
density_species: int
is the MT3DMS species number that will be used in the equation of state
to compute fluid density (mtdnconc).
If density_species = 0, fluid density is specified using items 6 and 7,
and flow will be uncoupled with transport if the IMT Process is active.
If density_species > 0, fluid density is calculated using the MT3DMS
species number that corresponds with density_species. A value for
density_species greater than zero indicates that flow will be coupled
with transport.
If density_species = -1, fluid density is calculated using one or more
MT3DMS species. Items 4a, 4b, and 4c will be read instead of item 4.
density_min: float
is the minimum fluid density (DENSEMIN). If the resulting density value
calculated with the equation of state is less than density_min, the
density value is set to density_min.
If density_min = 0, the computed fluid density is not limited by
density_min (this is the option to use for most simulations).
If density_min > 0, a computed fluid density less than density_min is
automatically reset to density_min.
density_max: float
is the maximum fluid density (DENSEMAX). If the resulting density value
calculated with the equation of state is greater than density_max, the
density value is set to density_max.
If density_max = 0, the computed fluid density is not limited by
density_max (this is the option to use for most simulations).
If density_max > 0, a computed fluid density larger than density_max is
automatically reset to density_max.
density_ref: float
is the fluid density at the reference concentration, temperature, and
pressure (DENSEREF). For most simulations, density_ref is specified as
the density of freshwater at 25 °C and at a reference pressure of zero.
Value of 1000 is often used.
density_concentration_slope: float
is the slope d(rho)/d(C) of the linear equation of state that relates
fluid density to solute concentration (denseslp). Value of 0.7143 is
often used.
density_criterion: float
is the convergence parameter for the coupling between flow and transport
and has units of fluid density (DNSCRIT). If the maximum density
difference between two consecutive coupling iterations is not less than
density_criterion, the program will continue to iterate on the flow and
transport equations or will terminate if 'coupling' is exceeded.
coupling: int
is a flag used to determine the flow and transport coupling procedure
(nswtcpl).
If coupling = 0 or 1, flow and transport will be explicitly coupled
using a one-timestep lag. The explicit coupling option is normally much
faster than the iterative option and is recommended for most
applications.
If coupling > 1, coupling is the maximum number of non-linear coupling
iterations for the flow and transport solutions. SEAWAT-2000 will stop
execution after coupling iterations if convergence between flow and
transport has not occurred.
If coupling = -1, the flow solution will be recalculated only for: The
first transport step of the simulation, or The last transport step of
the MODFLOW timestep, or The maximum density change at a cell is greater
than density_criterion.
correct_water_table: {"True", "False"}
is a flag used to activate the variable-density water-table corrections
(IWTABLE).
If correct_water_table = False, the water-table correction will not be
applied.
If correct_water_table = True, the water-table correction will be
applied.
internodal: {"upstream", "central"}
is a flag that determines the method for calculating the internodal
density values used to conserve fluid mass (MFNADVFD).
If internodal = "central", internodal conductance values used to
conserve fluid mass are calculated using a central-in-space algorithm.
If internodal = "upstream", internodal conductance values used to
conserve fluid mass are calculated using an upstream-weighted algorithm.
"""

__slots__ = (
"density_concentration_slope",
"density_species",
"density_min",
"density_max",
"density_ref",
"density_criterion",
"internodal",
"coupling",
"correct_water_table",
)
_pkg_id = "vdf"

_template = (
"[vdf]\n"
"    mtdnconc = {density_species}\n"
"    densemin = {density_min}\n"
"    densemax = {density_max}\n"
"    denseref = {density_ref}\n"
"    denseslp = {density_concentration_slope}\n"
"    dnscrit = {density_criterion}\n"
"    nswtcpl = {coupling}\n"
"    iwtable = {correct_water_table}\n"
)

_keywords = {
"internodal": {"central": 2, "upstream": 1},
"correct_water_table": {False: 0, True: 1},
}

def __init__(
self,
density_concentration_slope,
density_species=1,
density_min=1000.0,
density_max=1025.0,
density_ref=1000.0,
density_criterion=0.01,
internodal="central",
coupling=1,
correct_water_table=False,
):
super(__class__, self).__init__()
self["density_species"] = density_species
self["density_min"] = density_min
self["density_max"] = density_max
self["density_ref"] = density_ref
self["density_concentration_slope"] = density_concentration_slope
self["density_criterion"] = density_criterion
self["internodal"] = internodal
self["coupling"] = coupling
self["correct_water_table"] = correct_water_table

def _pkgcheck(self, ibound=None):
to_check = [
"density_species",
"density_min",
"density_max",
"density_ref",
"density_concentration_slope",
"density_criterion",
]
self._check_positive(to_check)