import numpy as np
from imod.logging import init_log_decorator
from imod.mf6.interfaces.iregridpackage import IRegridPackage
from imod.mf6.package import Package
from imod.mf6.regrid.regrid_schemes import MobileStorageTransferRegridMethod
from imod.mf6.validation import PKG_DIMS_SCHEMA
from imod.schemata import (
AllValueSchema,
DTypeSchema,
IdentityNoDataSchema,
IndexesSchema,
)
[docs]
class MobileStorageTransfer(Package, IRegridPackage):
"""
Mobile Storage.
Parameters
----------
porosity: array of floats (xr.DataArray)
volume of interconnected voids per volume of rock (percentage).
decay : array of floats (xr.DataArray, optional)
is the rate coefficient for first or zero-order decay for the aqueous phase of the mobile domain.
A negative value indicates solute production. The dimensions of decay for first-order decay is one
over time. The dimensions of decay for zero-order decay is mass per length cubed per time. decay will
have no effect on simulation results unless either first- or zero-order decay is specified in the
options block.
decay_sorbed : array of floats (xr.DataArray, optional)
is the rate coefficient for first or zero-order decay for the sorbed phase of the mobile domain.
A negative value indicates solute production. The dimensions of decay_sorbed for first-order decay
is one over time. The dimensions of decay_sorbed for zero-order decay is mass of solute per mass of
aquifer per time. If decay_sorbed is not specified and both decay and sorption are active, then the
program will terminate with an error. decay_sorbed will have no effect on simulation results unless
the SORPTION keyword and either first- or zero-order decay are specified in the options block.
bulk_density : array of floats (xr.DataArray, optional)
is the bulk density of the aquifer in mass per length cubed. bulk_density is not required unless
the SORPTION keyword is specified.
distcoef : array of floats (xr.DataArray, optional)
is the distribution coefficient for the equilibrium-controlled linear sorption isotherm in dimensions
of length cubed per mass. distcoef is not required unless the SORPTION keyword is specified.
sp2 : array of floats (xr.DataArray, optional)
is the exponent for the Freundlich isotherm and the sorption capacity for the Langmuir isotherm.
save_flows: ({True, False}, optional)
Indicates that recharge flow terms will be written to the file specified
with "BUDGET FILEOUT" in Output Control.
Default is False.
zero_order_decay: bool, optional
Requires decay to be specified
first_order_decay: bool, optional
Requires decay to be specified
sorption: ({linear, freundlich, langmuir}, optional)
Type of sorption, if any.
validate: {True, False}
Flag to indicate whether the package should be validated upon
initialization. This raises a ValidationError if package input is
provided in the wrong manner. Defaults to True.
"""
_grid_data = {
"porosity": np.float64,
"decay": np.float64,
"decay_sorbed": np.float64,
"bulk_density": np.float64,
"distcoef": np.float64,
"sp2": np.float64,
}
_pkg_id = "mst"
_template = Package._initialize_template(_pkg_id)
_keyword_map = {}
_init_schemata = {
"porosity": [DTypeSchema(np.floating), IndexesSchema(), PKG_DIMS_SCHEMA],
"decay": [DTypeSchema(np.floating), IndexesSchema(), PKG_DIMS_SCHEMA],
"decay_sorbed": [DTypeSchema(np.floating), IndexesSchema(), PKG_DIMS_SCHEMA],
"bulk_density": [DTypeSchema(np.floating), IndexesSchema(), PKG_DIMS_SCHEMA],
"distcoef": [DTypeSchema(np.floating), IndexesSchema(), PKG_DIMS_SCHEMA],
"sp2": [DTypeSchema(np.floating), IndexesSchema(), PKG_DIMS_SCHEMA],
"zero_order_decay": [DTypeSchema(np.bool_)],
"first_order_decay": [DTypeSchema(np.bool_)],
}
_write_schemata = {
"porosity": (
AllValueSchema(">=", 0.0),
AllValueSchema("<", 1.0),
IdentityNoDataSchema(other="idomain", is_other_notnull=(">", 0)),
),
"decay": (IdentityNoDataSchema(other="idomain", is_other_notnull=(">", 0)),),
"decay_sorbed": (
IdentityNoDataSchema(other="idomain", is_other_notnull=(">", 0)),
),
"bulk_density": (
IdentityNoDataSchema(other="idomain", is_other_notnull=(">", 0)),
),
"distcoef": (IdentityNoDataSchema(other="idomain", is_other_notnull=(">", 0)),),
"sp2": (IdentityNoDataSchema(other="idomain", is_other_notnull=(">", 0)),),
}
_regrid_method = MobileStorageTransferRegridMethod()
[docs]
@init_log_decorator()
def __init__(
self,
porosity,
decay=None,
decay_sorbed=None,
bulk_density=None,
distcoef=None,
sp2=None,
save_flows=False,
zero_order_decay: bool = False,
first_order_decay: bool = False,
sorption=None,
validate: bool = True,
):
if zero_order_decay and first_order_decay:
raise ValueError(
"zero_order_decay and first_order_decay may not both be True"
)
dict_dataset = {
"porosity": porosity,
"decay": decay,
"decay_sorbed": decay_sorbed,
"bulk_density": bulk_density,
"distcoef": distcoef,
"sp2": sp2,
"save_flows": save_flows,
"sorption": sorption,
"zero_order_decay": zero_order_decay,
"first_order_decay": first_order_decay,
}
super().__init__(dict_dataset)
self._validate_init_schemata(validate)