Model3D#

class timflow.steady.model.Model3D(kaq=1, z=None, kzoverkh=1, npor=0.3, topboundary='conf', topres=0, topthick=0, hstar=0)#

Bases: Model

Create a multi-layer model object consisting of stacked aquifer layers.

The resistance between the layers is computed from the vertical hydraulic conductivity of the layers.

Parameters:
  • kaq (float, array or list) – hydraulic conductivity of each layer from the top down if float, hydraulic conductivity is the same in all aquifers

  • z (array or list) – elevation of top of system followed by bottoms of all layers from the top down bottom of layer is automatically equal to top of layer below it length is number of aquifer layers + 1

  • kzoverkh (float) – vertical anisotropy ratio vertical k divided by horizontal k if float, value is the same for all layers length is number of layers

  • npor (float, array or list) – porosity of all aquifer layers from the top down if float, porosity is the same for all layers if topboundary=’conf’: length is number of layers if topboundary=’semi’: length is number of layers + 1

  • topboundary (string, 'conf' or 'semi' (default is 'conf')) – indicating whether the top is confined (‘conf’) or semi-confined (‘semi’)

  • topres (float) – resistance of top semi-confining layer (read if topboundary=’semi’)

  • topthick (float) – thickness of top semi-confining layer (read if topboundary=’semi’)

  • hstar (float or None (default is None)) – head value above semi-confining top (read if topboundary=’semi’)

Notes

For semi-confined aquifers, set top equal to ‘semi’ and provide:
  • topres: resistance of top

  • tophick: thickness of top

  • hstar: head above top

Examples

Create a 3D model with 10 layers:

ml = Model3D(kaq=10, z=np.arange(20, -1, -2), kzoverkh=0.1)
remove_element(e)#

Remove element e from model.

disvec(x, y, aq=None)#

Discharge vector at x, y.

Returns:

qxqy – first row is Qx in each aquifer layer, second row is Qy

Return type:

array size (2, naq)

normflux(x, y, theta)#

Flux at point x, y in direction of angle theta.

Parameters:
  • x (float)

  • y (float)

  • theta (float) – angle for which to calculate flux, defined relative to positive x-axis.

Returns:

flux in direction theta

Return type:

flux

intnormflux_segment(x1, y1, x2, y2, method='legendre', ndeg=10)#

Integrated normal (perpendicular) flux over specified line segment.

Flux to the left is positive when going from (x1, y1) to (x2, y2).

Parameters:
  • x1 (float)

  • y1 (float)

  • x2 (float)

  • y2 (float)

  • method (str, optional) – integration method, either “quad” (numerical integration using scipy) or “legendre” (approximate integral using Gauss-Legendre quadrature), by default “legendre”.

  • ndeg (int, optional) – degree for legendre polynomial, by default 10, only used when method=”legendre”

Returns:

Qn – integrated normal flux along specified line

Return type:

np.array

intnormflux(xy, method='legendre', ndeg=10)#

Integrated normal (perpendicular) flux over polyline.

Computes the flux per segment and per aquifer. Flux to the left is positive when going from (x1, y1) to (x2, y2).

Parameters:
  • xy (list [(x0, y0), (x1, y1),... , (xn, yn)] or 2D array) – if 2D-array, x in first column and y in second column

  • method (str, optional) – integration method, either “quad” (numerical integration using scipy) or “legendre” (approximate integral using Gauss-Legendre quadrature), by default “legendre”.

  • ndeg (int, optional) – degree for legendre polynomial, by default 10, only used when method=”legendre”

Returns:

Qn – integrated normal flux along specified polyline

Return type:

np.array of shape (naq, nsegments)

Examples

Total flow across polyline can be obtained using:

>>> np.sum(Qn)

Total flow across segments summed over aquifers using

>>> np.sum(Qn, axis=0)
head(x, y, layers=None, aq=None)#

Head at x, y.

Returns:

h – head in all layers (if not None), or all layers of aquifer (otherwise)

Return type:

array length naq or len(layers)

head_array(x, y, layers=None, show_progress=False, parallel=False)#

Head for array of points.

Parameters:
  • x (1D array or list) – x values of points

  • y (1D array or list) – y values of points

  • layers (integer, list or array, optional) – layers for which grid is returned

  • show_progress (bool) – show computation progress, by printing dots per row or with tqdm progressbar when parallel is True. Default is False.

  • parallel (bool or int, optional) – if True, computes head_array in parallel using multiprocessing, by default False. If an integer is provided, it is interpreted as the number of processes to use.

Returns:

h – heads array with size (nlayers, npoints)

Return type:

array

headgrid(xg, yg, layers=None, printrow=False, show_progress=False, parallel=False)#

Grid of heads.

Parameters:
  • xg (1d-array) – x values of grid

  • yg (1d-array) – y values of grid

  • layers (integer, list or array, optional) – layers for which grid is returned

  • show_progress (bool) – show computation progress, by printing dots per row or with tqdm progressbar when parallel is True. Default is False.

  • parallel (bool or int, optional) – if True, computes headgrid in parallel using multiprocessing, by default False. If an integer is provided, it is interpreted as the number of processes to use.

  • printrow (bool, optional) –

    Deprecated since version 0.2.0: prints dot to screen for each row of grid if set to True

Returns:

h

Return type:

array size nlayers, ny, nx

See also

head_array(), headgrid2()

headgrid2(x1, x2, nx, y1, y2, ny, layers=None, show_progress=False, printrow=False, parallel=False)#

Grid of heads.

Parameters:
  • x1 – x values are generated as linspace(x1, x2, nx)

  • x2 – x values are generated as linspace(x1, x2, nx)

  • nx – x values are generated as linspace(x1, x2, nx)

  • y1 – y values are generated as linspace(y1, y2, ny)

  • y2 – y values are generated as linspace(y1, y2, ny)

  • ny – y values are generated as linspace(y1, y2, ny)

  • layers (integer, list or array, optional) – layers for which grid is returned

  • show_progress (bool) – show computation progress, by printing dots per row or with tqdm progressbar when parallel is True. Default is False.

  • parallel (bool or int, optional) – if True, computes headgrid in parallel using multiprocessing, by default False. If an integer is provided, it is interpreted as the number of processes to use.

  • printrow (boolean, optional) –

    Deprecated since version 0.2.0: prints dot to screen for each row of grid if set to True

Returns:

h

Return type:

array size nlayers, ny, nx

See also

head_array(), headgrid()

headalongline(x, y, layers=None)#

Head along line or curve.

Parameters:
  • x (array) – x values of line

  • y (array) – y values of line

  • layers (integer, list or array, optional) – layers for which grid is returned

Returns:

h

Return type:

array size nlayers, nx

disvecgrid(xg, yg, layers=None, show_progress=True, parallel=False)#

Compute grid of discharge vectors.

Parameters:
  • xg (1d-array) – x values of grid

  • yg (1d-array) – y values of grid

  • layers (integer, list or array, optional) – layers for which grid is returned

  • show_progress (bool) – show computation progress, by printing dots per row or with tqdm progressbar when parallel is True. Default is True.

  • parallel (bool, optional) – if True, computes discharge vector grid in parallel using multiprocessing, by default False

Returns:

  • qx (array size (Nlayers, ny, nx)) – x component of discharge vector at each point in grid

  • qy (array size (Nlayers, ny, nx)) – y component of discharge vector at each point in grid

disvecalongline(x, y, layers=None)#

Compute discharge vector along line.

Notes

Assumes same number of layers for each x and y. Layers may be None or list of layers for which head is computed.

Returns:

  • Qx – [Nlayers,len(x)]

  • Qy – [Nlayers,len(x)]

stream_function(x, radial=False)#

Stream function along line x (or r).

Only applicable to models where flow is 1D (along a line), e.g. flow in a vertical cross-section or flow in a radially symmetric model.

Parameters:
  • x (array) – x values of line

  • radial (bool, optional) – if True, assumes that flow is radially symmetric and multiplies result by x, by default False

Returns:

  • stream_function (array) – stream function along line, size (2*naq, len(x))

  • zflow (array) – z values of flow grid, size (2*naq,)

velocity(x, y, z)#

Compute velocity at point x, y, z.

Parameters:
  • x (float)

  • y (float)

  • z (float)

Returns:

velocity – velocity vector (vx, vy, vz) at point x, y, z

Return type:

array

velocity_array(x, y, z, show_progress=True, parallel=False)#

Compute velocity grid.

Parameters:
  • x (1d-array) – x values

  • y (1d-array) – y values

  • z (1d-array) – z values

  • show_progress (bool) – show computation progress with tqdm progressbar if tqdm is installed. Default is True.

  • parallel (bool or int, optional) – if True, computes velocity grid in parallel using multi processing, by default False. If an integer is provided, it is interpreted as the number of processes to use.

Returns:

velocity – velocity vector (vx, vy, vz) at each point in grid, size (3, len(x))

Return type:

array

velocity_grid(xg, yg, zg, show_progress=True, parallel=False)#

Compute velocities for an array of points.

Parameters:
  • xg (1d-array) – x values of grid

  • yg (1d-array) – y values of grid

  • zg (1d-array) – z values of grid

  • show_progress (bool, optional) – if True, shows progress bar when computing velocity grid, by default True

  • parallel (bool or int, optional) – if True, computes velocity grid in parallel using multiprocessing, by default False. If an integer is provided, it specifies the number of processes to use.

Returns:

velocity – velocity vector (vx, vy, vz) at each point in grid, size (3, len(zg), len(yg), len(xg))

Return type:

array

solve(printmat=0, sendback=0, silent=False)#

Compute solution.

solve_mp(nproc=4, printmat=0, sendback=0, silent=False)#

Compute solution, multiprocessing implementation.

Notes

Estimated speedup approximately by factor of number of physical cores (virtual cores do not improve calculation time).

aquifer_summary()#

Return DataFrame with summary of aquifer(s) parameters in model.

Returns:

dataframe with summary of aquifer(s) parameters

Return type:

pandas.DataFrame