# -*- coding: utf-8 -*-
"""
welltestpy subpackage providing classes for parameter estimation.
.. currentmodule:: welltestpy.estimate.estimators
The following classes are provided
.. autosummary::
ExtTheis3D
ExtTheis2D
Neuman2004
Theis
ExtThiem3D
ExtThiem2D
Neuman2004Steady
Thiem
"""
import anaflow as ana
from . import steady_lib, transient_lib
__all__ = [
"ExtTheis3D",
"ExtTheis2D",
"Neuman2004",
"Theis",
"ExtThiem3D",
"ExtThiem2D",
"Neuman2004Steady",
"Thiem",
]
# ext_theis_3D
[docs]class ExtTheis3D(transient_lib.TransientPumping):
"""Class for an estimation of stochastic subsurface parameters.
With this class you can run an estimation of statistical subsurface
parameters. It utilizes the extended theis solution in 3D which assumes
a log-normal distributed transmissivity field with a gaussian correlation
function and an anisotropy ratio 0 < e <= 1.
Parameters
----------
name : :class:`str`
Name of the Estimation.
campaign : :class:`welltestpy.data.Campaign`
The pumping test campaign which should be used to estimate the
paramters
val_ranges : :class:`dict`
Dictionary containing the fit-ranges for each value in the type-curve.
Names should be as in the type-curve signiture
or replaced in val_kw_names.
Ranges should be a tuple containing min and max value.
val_fix : :class:`dict` or :any:`None`
Dictionary containing fixed values for the type-curve.
Names should be as in the type-curve signiture
or replaced in val_kw_names.
Default: None
testinclude : :class:`dict`, optional
dictonary of which tests should be included. If ``None`` is given,
all available tests are included.
Default: ``None``
generate : :class:`bool`, optional
State if time stepping, processed observation data and estimation
setup should be generated with default values.
Default: ``False``
"""
def __init__(
self,
name,
campaign,
val_ranges=None,
val_fix=None,
testinclude=None,
generate=False,
):
def_ranges = {
"mu": (-16, -2),
"var": (0, 10),
"len_scale": (1, 50),
"lnS": (-13, -1),
"anis": (0, 1),
}
val_ranges = {} if val_ranges is None else val_ranges
val_fix = {"lat_ext": 1.0} if val_fix is None else val_fix
for def_name, def_val in def_ranges.items():
val_ranges.setdefault(def_name, def_val)
fit_type = {"mu": "log", "lnS": "log"}
val_kw_names = {"mu": "cond_gmean", "lnS": "storage"}
val_plot_names = {
"mu": r"$\mu$",
"var": r"$\sigma^2$",
"len_scale": r"$\ell$",
"lnS": r"$\ln(S)$",
"anis": "$e$",
}
super().__init__(
name=name,
campaign=campaign,
type_curve=ana.ext_theis_3d,
val_ranges=val_ranges,
val_fix=val_fix,
fit_type=fit_type,
val_kw_names=val_kw_names,
val_plot_names=val_plot_names,
testinclude=testinclude,
generate=generate,
)
# ext_theis_2D
[docs]class ExtTheis2D(transient_lib.TransientPumping):
"""Class for an estimation of stochastic subsurface parameters.
With this class you can run an estimation of statistical subsurface
parameters. It utilizes the extended theis solution in 2D which assumes
a log-normal distributed transmissivity field with a gaussian correlation
function.
Parameters
----------
name : :class:`str`
Name of the Estimation.
campaign : :class:`welltestpy.data.Campaign`
The pumping test campaign which should be used to estimate the
paramters
val_ranges : :class:`dict`
Dictionary containing the fit-ranges for each value in the type-curve.
Names should be as in the type-curve signiture
or replaced in val_kw_names.
Ranges should be a tuple containing min and max value.
val_fix : :class:`dict` or :any:`None`
Dictionary containing fixed values for the type-curve.
Names should be as in the type-curve signiture
or replaced in val_kw_names.
Default: None
testinclude : :class:`dict`, optional
dictonary of which tests should be included. If ``None`` is given,
all available tests are included.
Default: ``None``
generate : :class:`bool`, optional
State if time stepping, processed observation data and estimation
setup should be generated with default values.
Default: ``False``
"""
def __init__(
self,
name,
campaign,
val_ranges=None,
val_fix=None,
testinclude=None,
generate=False,
):
def_ranges = {
"mu": (-16, -2),
"var": (0, 10),
"len_scale": (1, 50),
"lnS": (-13, -1),
}
val_ranges = {} if val_ranges is None else val_ranges
for def_name, def_val in def_ranges.items():
val_ranges.setdefault(def_name, def_val)
fit_type = {"mu": "log", "lnS": "log"}
val_kw_names = {"mu": "trans_gmean", "lnS": "storage"}
val_plot_names = {
"mu": r"$\mu$",
"var": r"$\sigma^2$",
"len_scale": r"$\ell$",
"lnS": r"$\ln(S)$",
}
super().__init__(
name=name,
campaign=campaign,
type_curve=ana.ext_theis_2d,
val_ranges=val_ranges,
val_fix=val_fix,
fit_type=fit_type,
val_kw_names=val_kw_names,
val_plot_names=val_plot_names,
testinclude=testinclude,
generate=generate,
)
# neuman 2004
[docs]class Neuman2004(transient_lib.TransientPumping):
"""Class for an estimation of stochastic subsurface parameters.
With this class you can run an estimation of statistical subsurface
parameters. It utilizes the apparent Transmissivity from Neuman 2004
which assumes a log-normal distributed transmissivity field
with an exponential correlation function.
Parameters
----------
name : :class:`str`
Name of the Estimation.
campaign : :class:`welltestpy.data.Campaign`
The pumping test campaign which should be used to estimate the
paramters
val_ranges : :class:`dict`
Dictionary containing the fit-ranges for each value in the type-curve.
Names should be as in the type-curve signiture
or replaced in val_kw_names.
Ranges should be a tuple containing min and max value.
val_fix : :class:`dict` or :any:`None`
Dictionary containing fixed values for the type-curve.
Names should be as in the type-curve signiture
or replaced in val_kw_names.
Default: None
testinclude : :class:`dict`, optional
dictonary of which tests should be included. If ``None`` is given,
all available tests are included.
Default: ``None``
generate : :class:`bool`, optional
State if time stepping, processed observation data and estimation
setup should be generated with default values.
Default: ``False``
"""
def __init__(
self,
name,
campaign,
val_ranges=None,
val_fix=None,
testinclude=None,
generate=False,
):
def_ranges = {
"mu": (-16, -2),
"var": (0, 10),
"len_scale": (1, 50),
"lnS": (-13, -1),
}
val_ranges = {} if val_ranges is None else val_ranges
for def_name, def_val in def_ranges.items():
val_ranges.setdefault(def_name, def_val)
fit_type = {"mu": "log", "lnS": "log"}
val_kw_names = {"mu": "trans_gmean", "lnS": "storage"}
val_plot_names = {
"mu": r"$\mu$",
"var": r"$\sigma^2$",
"len_scale": r"$\ell$",
"lnS": r"$\ln(S)$",
}
super().__init__(
name=name,
campaign=campaign,
type_curve=ana.neuman2004,
val_ranges=val_ranges,
val_fix=val_fix,
fit_type=fit_type,
val_kw_names=val_kw_names,
val_plot_names=val_plot_names,
testinclude=testinclude,
generate=generate,
)
# theis
[docs]class Theis(transient_lib.TransientPumping):
"""Class for an estimation of homogeneous subsurface parameters.
With this class you can run an estimation of homogeneous subsurface
parameters. It utilizes the theis solution.
Parameters
----------
name : :class:`str`
Name of the Estimation.
campaign : :class:`welltestpy.data.Campaign`
The pumping test campaign which should be used to estimate the
paramters
val_ranges : :class:`dict`
Dictionary containing the fit-ranges for each value in the type-curve.
Names should be as in the type-curve signiture
or replaced in val_kw_names.
Ranges should be a tuple containing min and max value.
val_fix : :class:`dict` or :any:`None`
Dictionary containing fixed values for the type-curve.
Names should be as in the type-curve signiture
or replaced in val_kw_names.
Default: None
testinclude : :class:`dict`, optional
dictonary of which tests should be included. If ``None`` is given,
all available tests are included.
Default: ``None``
generate : :class:`bool`, optional
State if time stepping, processed observation data and estimation
setup should be generated with default values.
Default: ``False``
"""
def __init__(
self,
name,
campaign,
val_ranges=None,
val_fix=None,
testinclude=None,
generate=False,
):
def_ranges = {"mu": (-16, -2), "lnS": (-13, -1)}
val_ranges = {} if val_ranges is None else val_ranges
for def_name, def_val in def_ranges.items():
val_ranges.setdefault(def_name, def_val)
fit_type = {"mu": "log", "lnS": "log"}
val_kw_names = {"mu": "transmissivity", "lnS": "storage"}
val_plot_names = {"mu": r"$\ln(T)$", "lnS": r"$\ln(S)$"}
super().__init__(
name=name,
campaign=campaign,
type_curve=ana.theis,
val_ranges=val_ranges,
val_fix=val_fix,
fit_type=fit_type,
val_kw_names=val_kw_names,
val_plot_names=val_plot_names,
testinclude=testinclude,
generate=generate,
)
# ext_thiem_3d
[docs]class ExtThiem3D(steady_lib.SteadyPumping):
"""Class for an estimation of stochastic subsurface parameters.
With this class you can run an estimation of statistical subsurface
parameters. It utilizes the extended thiem solution in 3D which assumes
a log-normal distributed transmissivity field with a gaussian correlation
function and an anisotropy ratio 0 < e <= 1.
Parameters
----------
name : :class:`str`
Name of the Estimation.
campaign : :class:`welltestpy.data.Campaign`
The pumping test campaign which should be used to estimate the
paramters
make_steady : :class:`bool`, optional
State if the tests should be converted to steady observations.
See: :any:`PumpingTest.make_steady`.
Default: True
val_ranges : :class:`dict`
Dictionary containing the fit-ranges for each value in the type-curve.
Names should be as in the type-curve signiture
or replaced in val_kw_names.
Ranges should be a tuple containing min and max value.
val_fix : :class:`dict` or :any:`None`
Dictionary containing fixed values for the type-curve.
Names should be as in the type-curve signiture
or replaced in val_kw_names.
Default: None
testinclude : :class:`dict`, optional
dictonary of which tests should be included. If ``None`` is given,
all available tests are included.
Default: ``None``
generate : :class:`bool`, optional
State if time stepping, processed observation data and estimation
setup should be generated with default values.
Default: ``False``
"""
def __init__(
self,
name,
campaign,
make_steady=True,
val_ranges=None,
val_fix=None,
testinclude=None,
generate=False,
):
def_ranges = {
"mu": (-16, -2),
"var": (0, 10),
"len_scale": (1, 50),
"anis": (0, 1),
}
val_ranges = {} if val_ranges is None else val_ranges
val_fix = {"lat_ext": 1.0} if val_fix is None else val_fix
for def_name, def_val in def_ranges.items():
val_ranges.setdefault(def_name, def_val)
fit_type = {"mu": "log"}
val_kw_names = {"mu": "cond_gmean"}
val_plot_names = {
"mu": r"$\mu$",
"var": r"$\sigma^2$",
"len_scale": r"$\ell$",
"anis": "$e$",
}
super().__init__(
name=name,
campaign=campaign,
type_curve=ana.ext_thiem_3d,
val_ranges=val_ranges,
make_steady=make_steady,
val_fix=val_fix,
fit_type=fit_type,
val_kw_names=val_kw_names,
val_plot_names=val_plot_names,
testinclude=testinclude,
generate=generate,
)
# ext_thiem_2D
[docs]class ExtThiem2D(steady_lib.SteadyPumping):
"""Class for an estimation of stochastic subsurface parameters.
With this class you can run an estimation of statistical subsurface
parameters. It utilizes the extended thiem solution in 2D which assumes
a log-normal distributed transmissivity field with a gaussian correlation
function.
Parameters
----------
name : :class:`str`
Name of the Estimation.
campaign : :class:`welltestpy.data.Campaign`
The pumping test campaign which should be used to estimate the
paramters
make_steady : :class:`bool`, optional
State if the tests should be converted to steady observations.
See: :any:`PumpingTest.make_steady`.
Default: True
val_ranges : :class:`dict`
Dictionary containing the fit-ranges for each value in the type-curve.
Names should be as in the type-curve signiture
or replaced in val_kw_names.
Ranges should be a tuple containing min and max value.
val_fix : :class:`dict` or :any:`None`
Dictionary containing fixed values for the type-curve.
Names should be as in the type-curve signiture
or replaced in val_kw_names.
Default: None
testinclude : :class:`dict`, optional
dictonary of which tests should be included. If ``None`` is given,
all available tests are included.
Default: ``None``
generate : :class:`bool`, optional
State if time stepping, processed observation data and estimation
setup should be generated with default values.
Default: ``False``
"""
def __init__(
self,
name,
campaign,
make_steady=True,
val_ranges=None,
val_fix=None,
testinclude=None,
generate=False,
):
def_ranges = {"mu": (-16, -2), "var": (0, 10), "len_scale": (1, 50)}
val_ranges = {} if val_ranges is None else val_ranges
for def_name, def_val in def_ranges.items():
val_ranges.setdefault(def_name, def_val)
fit_type = {"mu": "log"}
val_kw_names = {"mu": "trans_gmean"}
val_plot_names = {
"mu": r"$\mu$",
"var": r"$\sigma^2$",
"len_scale": r"$\ell$",
}
super().__init__(
name=name,
campaign=campaign,
make_steady=make_steady,
type_curve=ana.ext_thiem_2d,
val_ranges=val_ranges,
val_fix=val_fix,
fit_type=fit_type,
val_kw_names=val_kw_names,
val_plot_names=val_plot_names,
testinclude=testinclude,
generate=generate,
)
# neuman 2004 steady
[docs]class Neuman2004Steady(steady_lib.SteadyPumping):
"""Class for an estimation of stochastic subsurface parameters.
With this class you can run an estimation of statistical subsurface
parameters from steady drawdown.
It utilizes the apparent Transmissivity from Neuman 2004
which assumes a log-normal distributed transmissivity field
with an exponential correlation function.
Parameters
----------
name : :class:`str`
Name of the Estimation.
campaign : :class:`welltestpy.data.Campaign`
The pumping test campaign which should be used to estimate the
paramters
make_steady : :class:`bool`, optional
State if the tests should be converted to steady observations.
See: :any:`PumpingTest.make_steady`.
Default: True
val_ranges : :class:`dict`
Dictionary containing the fit-ranges for each value in the type-curve.
Names should be as in the type-curve signiture
or replaced in val_kw_names.
Ranges should be a tuple containing min and max value.
val_fix : :class:`dict` or :any:`None`
Dictionary containing fixed values for the type-curve.
Names should be as in the type-curve signiture
or replaced in val_kw_names.
Default: None
testinclude : :class:`dict`, optional
dictonary of which tests should be included. If ``None`` is given,
all available tests are included.
Default: ``None``
generate : :class:`bool`, optional
State if time stepping, processed observation data and estimation
setup should be generated with default values.
Default: ``False``
"""
def __init__(
self,
name,
campaign,
make_steady=True,
val_ranges=None,
val_fix=None,
testinclude=None,
generate=False,
):
def_ranges = {"mu": (-16, -2), "var": (0, 10), "len_scale": (1, 50)}
val_ranges = {} if val_ranges is None else val_ranges
for def_name, def_val in def_ranges.items():
val_ranges.setdefault(def_name, def_val)
fit_type = {"mu": "log"}
val_kw_names = {"mu": "trans_gmean"}
val_plot_names = {
"mu": r"$\mu$",
"var": r"$\sigma^2$",
"len_scale": r"$\ell$",
}
super().__init__(
name=name,
campaign=campaign,
make_steady=make_steady,
type_curve=ana.neuman2004_steady,
val_ranges=val_ranges,
val_fix=val_fix,
fit_type=fit_type,
val_kw_names=val_kw_names,
val_plot_names=val_plot_names,
testinclude=testinclude,
generate=generate,
)
# thiem
[docs]class Thiem(steady_lib.SteadyPumping):
"""Class for an estimation of homogeneous subsurface parameters.
With this class you can run an estimation of homogeneous subsurface
parameters. It utilizes the thiem solution.
Parameters
----------
name : :class:`str`
Name of the Estimation.
campaign : :class:`welltestpy.data.Campaign`
The pumping test campaign which should be used to estimate the
paramters
make_steady : :class:`bool`, optional
State if the tests should be converted to steady observations.
See: :any:`PumpingTest.make_steady`.
Default: True
val_ranges : :class:`dict`
Dictionary containing the fit-ranges for each value in the type-curve.
Names should be as in the type-curve signiture
or replaced in val_kw_names.
Ranges should be a tuple containing min and max value.
val_fix : :class:`dict` or :any:`None`
Dictionary containing fixed values for the type-curve.
Names should be as in the type-curve signiture
or replaced in val_kw_names.
Default: None
testinclude : :class:`dict`, optional
dictonary of which tests should be included. If ``None`` is given,
all available tests are included.
Default: ``None``
generate : :class:`bool`, optional
State if time stepping, processed observation data and estimation
setup should be generated with default values.
Default: ``False``
"""
def __init__(
self,
name,
campaign,
make_steady=True,
val_ranges=None,
val_fix=None,
testinclude=None,
generate=False,
):
def_ranges = {"mu": (-16, -2)}
val_ranges = {} if val_ranges is None else val_ranges
for def_name, def_val in def_ranges.items():
val_ranges.setdefault(def_name, def_val)
fit_type = {"mu": "log"}
val_kw_names = {"mu": "transmissivity"}
val_plot_names = {"mu": r"$\ln(T)$"}
super().__init__(
name=name,
campaign=campaign,
type_curve=ana.thiem,
val_ranges=val_ranges,
make_steady=make_steady,
val_fix=val_fix,
fit_type=fit_type,
val_kw_names=val_kw_names,
val_plot_names=val_plot_names,
testinclude=testinclude,
generate=generate,
)