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 DispersionRegridMethod
from imod.mf6.validation import PKG_DIMS_SCHEMA
from imod.schemata import (
CompatibleSettingsSchema,
DimsSchema,
DTypeSchema,
IdentityNoDataSchema,
IndexesSchema,
)
[docs]
class Dispersion(Package, IRegridPackage):
"""
Molecular Diffusion and Dispersion.
Parameters
----------
diffusion_coefficient: xr.DataArray
effective molecular diffusion coefficient. (DIFFC)
longitudinal_horizontal: xr.DataArray
longitudinal dispersivity in horizontal direction. If flow is strictly
horizontal, then this is the longitudinal dispersivity that will be
used. If flow is not strictly horizontal or strictly vertical, then the
longitudinal dispersivity is a function of both ALH and ALV. If
mechanical dispersion is represented (by specifying any dispersivity
values) then this array is required. (ALH)
transverse_horizontal1: xr.DataArray
transverse dispersivity in horizontal direction. This is the transverse
dispersivity value for the second ellipsoid axis. If flow is strictly
horizontal and directed in the x direction (along a row for a regular
grid), then this value controls spreading in the y direction.
If mechanical dispersion is represented (by specifying any dispersivity
values) then this array is required. (ATH1)
longitudinal_vertical: xr.DataArray, optional
longitudinal dispersivity in vertical direction. If flow is strictly
vertical, then this is the longitudinal dispsersivity value that will be
used. If flow is not strictly horizontal or strictly vertical, then the
longitudinal dispersivity is a function of both ALH and ALV. If this
value is not specified and mechanical dispersion is represented, then
this array is set equal to ALH. (ALV)
transverse_horizontal2: xr.DataArray, optional
transverse dispersivity in horizontal direction. This is the transverse
dispersivity value for the third ellipsoid axis. If flow is strictly
horizontal and directed in the x direction (along a row for a regular
grid), then this value controls spreading in the z direction. If this
value is not specified and mechanical dispersion is represented, then
this array is set equal to ATH1. (ATH2)
tranverse_vertical: xr.DataArray, optional
transverse dispersivity when flow is in vertical direction. If flow is
strictly vertical and directed in the z direction, then this value
controls spreading in the x and y directions. If this value is not
specified and mechanical dispersion is represented, then this array is
set equal to ATH2. (ATV)
xt3d_off: bool, optional
deactivate the xt3d method and use the faster and less accurate
approximation. (XT3D_OFF)
xt3d_rhs: bool, optional
add xt3d terms to right-hand side, when possible. This option uses less
memory, but may require more iterations. (XT3D_RHS)
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.
"""
_pkg_id = "dsp"
_template = Package._initialize_template(_pkg_id)
_grid_data = {
"diffusion_coefficient": np.float64,
"longitudinal_horizontal": np.float64,
"transversal_horizontal1": np.float64,
"longitudinal_vertical": np.float64,
"transversal_horizontal2": np.float64,
"transversal_vertical": np.float64,
}
_keyword_map = {
"diffusion_coefficient": "diffc",
"longitudinal_horizontal": "alh",
"transversal_horizontal1": "ath1",
"longitudinal_vertical": "alv",
"transversal_horizontal2": "ath2",
"transversal_vertical": "atv",
}
_init_schemata = {
"diffusion_coefficient": [
DTypeSchema(np.floating),
IndexesSchema(),
PKG_DIMS_SCHEMA,
],
"longitudinal_horizontal": [
DTypeSchema(np.floating),
IndexesSchema(),
PKG_DIMS_SCHEMA,
],
"transversal_horizontal1": [
DTypeSchema(np.floating),
IndexesSchema(),
PKG_DIMS_SCHEMA,
],
"longitudinal_vertical": [
DTypeSchema(np.floating),
IndexesSchema(),
PKG_DIMS_SCHEMA,
],
"transversal_horizontal2": [
DTypeSchema(np.floating),
IndexesSchema(),
PKG_DIMS_SCHEMA,
],
"transversal_vertical": [
DTypeSchema(np.floating),
IndexesSchema(),
PKG_DIMS_SCHEMA,
],
"xt3d_off": [DTypeSchema(np.bool_), DimsSchema()],
"xt3d_rhs": [
DTypeSchema(np.bool_),
DimsSchema(),
CompatibleSettingsSchema(other="xt3d_off", other_value=False),
],
}
_write_schemata = {
"diffusion_coefficient": (
IdentityNoDataSchema(other="idomain", is_other_notnull=(">", 0)),
),
"longitudinal_horizontal": (
IdentityNoDataSchema(other="idomain", is_other_notnull=(">", 0)),
),
"transversal_horizontal1": (
IdentityNoDataSchema(other="idomain", is_other_notnull=(">", 0)),
),
"longitudinal_vertical": (
IdentityNoDataSchema(other="idomain", is_other_notnull=(">", 0)),
),
"transversal_horizontal2": (
IdentityNoDataSchema(other="idomain", is_other_notnull=(">", 0)),
),
"transversal_vertical": (
IdentityNoDataSchema(other="idomain", is_other_notnull=(">", 0)),
),
}
_regrid_method = DispersionRegridMethod()
[docs]
@init_log_decorator()
def __init__(
self,
diffusion_coefficient,
longitudinal_horizontal,
transversal_horizontal1,
longitudinal_vertical=None,
transversal_horizontal2=None,
transversal_vertical=None,
xt3d_off=False,
xt3d_rhs=False,
validate: bool = True,
):
dict_dataset = {
"xt3d_off": xt3d_off,
"xt3d_rhs": xt3d_rhs,
"diffusion_coefficient": diffusion_coefficient,
"longitudinal_horizontal": longitudinal_horizontal,
"transversal_horizontal1": transversal_horizontal1,
"longitudinal_vertical": longitudinal_vertical,
"transversal_horizontal2": transversal_horizontal2,
"transversal_vertical": transversal_vertical,
}
super().__init__(dict_dataset)
self._validate_init_schemata(validate)
def _validate(self, schemata, **kwargs):
# Insert additional kwargs
kwargs["xt3d_off"] = self["xt3d_off"]
errors = super()._validate(schemata, **kwargs)
return errors