133.1x: Confined flow with precipitation#

Transient solution (133.16)#

This notebook shows the Bruggeman solution for:

One dimensional finite flow. Given head or drawdown at x=b and zero flux at x=0.

Steady state (133.17) shown as well.

import matplotlib.pyplot as plt
import numpy as np
import timflow.transient as tft
from numpy import linspace

from bruggeman.flow1d import bruggeman_133_16, bruggeman_133_17
bruggeman_133_16
\[\begin{split} \begin{aligned} \beta &= \sqrt{\frac{S}{D k}} \\ \varphi{\left(x,t,b,S,k,D,p,N \right)} &= - \frac{16 b^{2} p \sum_{n=0}^{N - 1} \frac{\left(-1\right)^{n} e^{- \frac{\pi^{2} t \left(2 n + 1\right)^{2}}{4 b^{2} \beta^{2}}} \cos{\left(\frac{\pi x \left(2 n + 1\right)}{2 b} \right)}}{\left(2 n + 1\right)^{3}}}{\pi^{3} D k} + \frac{p \left(b^{2} - x^{2}\right)}{2 D k} \\ \end{aligned} \end{split}\]
bruggeman_133_16?

Transient graph#

# aquifer parameters
b = 100.0 / 2
S = 0.1
k = 10.0
D = 5.0
p = 1e-3  # constant precipitation flux
t = linspace(0.0, 10.0, 100)
hx0 = bruggeman_133_16(0.0, t, b, S, k, D, p)
hxb2 = bruggeman_133_16(b / 2, t, b, S, k, D, p)

plt.figure(figsize=(8, 3), layout="tight")
plt.plot(t, hx0, label="x=0")
plt.plot(t, hxb2, label="x=L/4")

plt.grid(True)
plt.xlabel("Time (d)")
plt.ylabel("Head (m)")
plt.title("Bruggeman 133.16")
plt.xlim(t[0], t[-1])
plt.ylim(0.0)
plt.legend();
../_images/9caff13f8af7bc0445e241d417edcb3344931d48f6791cff9a2f34d20197a9eb.png

Steady state solution (133.17)#

bruggeman_133_17
\[\begin{split} \begin{aligned} \varphi{\left(x,b,k,D,p \right)} &= \frac{p \left(b^{2} - x^{2}\right)}{2 D k} \\ \end{aligned} \end{split}\]
bruggeman_133_17?

Drainage to canals#

This equation can be used to model drainage to drains and canals.

Results are equal to Krayenhoff van de Leur - Maasland (e.g.: ‘Cultuurtechnisch Vademecum’, 1988, page 523).

mlconf = tft.ModelXsection(naq=1, tmin=1e-3, tmax=1e3)

left = tft.XsectionMaq(
    mlconf,
    -np.inf,
    -b,
    kaq=k,
    z=[0, -D],
    Saq=S,
    topboundary="phreatic",
)
inf = tft.XsectionMaq(
    mlconf,
    -b,
    b,
    kaq=k,
    z=[0, -D],
    Saq=S,
    # c=c,
    topboundary="phreatic",
    tsandN=[(0.0, p)],
)
right = tft.XsectionMaq(
    mlconf,
    b,
    np.inf,
    kaq=k,
    z=[0, -D],
    Saq=S,
    # c=c,
    topboundary="phreatic",
)

d = -1e-3
hls_left = tft.River1D(mlconf, xls=-b + d, tsandh=[(0, 0.0)], layers=[0])
hls_right = tft.River1D(mlconf, xls=b - d, tsandh=[(0, 0.0)], layers=[0])

mlconf.solve()
self.neq  6
solution complete
x = linspace(-b, b, 51)
t_steps = [0, 0.5, 1.0, 2, 5, 10]  # time steps in days

fig, ax = plt.subplots(figsize=(8, 3), layout="tight")
for t in t_steps:
    ht = bruggeman_133_16(x, t, b, S, k, D, p)
    (p0,) = ax.plot(x, ht, label=f"t={t} d")
    ax.plot(
        x,
        mlconf.headalongline(x, np.zeros_like(x), t)[0, 0],
        label="Timflow",
        marker="x",
        linestyle="none",
        markersize=4,
        color=p0.get_color(),
    )

h_ss = bruggeman_133_17(x, b, k, D, p)
ax.plot(x, h_ss, label="Steady state", color="k", linestyle="--")

ax.grid(True)
ax.set_xlabel("Distance (m)")
ax.set_ylabel("Head (m)")
ax.set_title("Bruggeman 133.16 (transient) and 133.17 (steady state)", y=1.45)
ax.set_ylim(0.0)
ax.legend(loc=(0, 1), ncol=7, fontsize="small", frameon=False);
../_images/8c97fe4c81c5127c0f62894c028181415bb7a5c50c5d52a55cf11f071e74ef8a.png