Benchmark loading efficiency#

Comparison to results of Bakker (2016)#

import matplotlib.pyplot as plt
import numpy as np

import timflow.transient as tft
k = 20  # m/d
H = 10  # m
Ss = 1e-4  # 1/m
Sp = 0.1  # -
c = 500  # d
tsandhstar = [(0, 1)]

Figure 3#

def model(zland, leffaq=0, cland=1e12, Sland=Ss, land_top="conf"):
    ml = tft.ModelXsection(naq=1, tmin=1e-4, tmax=1e2)

    tft.XsectionMaq(
        model=ml,
        x1=-np.inf,  # river extends to infinitiy
        x2=0,
        z=[1, 0, -H],
        kaq=k,
        Saq=Ss,
        c=c,
        leffaq=leffaq,
        topboundary="semi",
        tsandhstar=tsandhstar,
        name="river",
    )

    tft.XsectionMaq(
        model=ml,
        x1=0,
        x2=np.inf,  # hinterland extends to infinity
        kaq=k,
        z=zland,
        Saq=Sland,
        c=cland,
        topboundary=land_top,
        name="land",
    )

    ml.solve()
    return ml
ml_leff = []
ml_noleff = []
# land is confined
ml_leff.append(model([0, -H], leffaq=1, Sland=Ss, land_top="conf"))
ml_noleff.append(model([0, -H], leffaq=0, Sland=Ss, land_top="conf"))
# land is semi-confined
ml_leff.append(model([1, 0, -H], leffaq=1, cland=c, Sland=Ss, land_top="semi"))
ml_noleff.append(model([1, 0, -H], leffaq=0, cland=c, Sland=Ss, land_top="semi"))
# land is phreatic
ml_leff.append(model([0, -H], leffaq=1, Sland=Sp, land_top="phre"))
ml_noleff.append(model([0, -H], leffaq=0, Sland=Sp, land_top="phre"))
self.neq  2
solution complete
self.neq  2
solution complete
self.neq  2
solution complete
self.neq  2
solution complete
self.neq  2
solution complete
self.neq  2
solution complete
x = np.linspace(-300, 300, 100)
t = [1 / 24, 1, 24]
plt.figure(figsize=(6, 6))
title = ["confined", "semi-confined", "unconfined"]
for i in range(len(ml_leff)):
    ha = ml_leff[i].headalongline(x, 0, t).squeeze()
    hb = ml_noleff[i].headalongline(x, 0, t).squeeze()
    ax = plt.subplot(3, 1, i + 1)
    legendtext = ["1 hr", "1 d", "24 d"]
    for it in range(len(t)):
        plt.plot(x, ha[it], color="C" + str(it), label=legendtext[it])
        plt.plot(x, hb[it], "--", color="C" + str(it))
    plt.axvline(0, linestyle=":", color="k")
    plt.xlim(-300, 300)
    plt.ylim(0, 1)
    plt.legend(loc="lower left", bbox_to_anchor=(1, 0.2), frameon=False)
    plt.ylabel("head (m)")
    plt.text(0.6, 0.7, title[i], transform=ax.transAxes)
    plt.text(1.05, 0.9, "loading eff = 1 (solid)", transform=ax.transAxes)
    plt.text(1.05, 0.75, "no loading eff (dashed)", transform=ax.transAxes)
    plt.grid()
plt.xlabel("x (m)")
plt.tight_layout()
../../_images/9e532e617c508385314aade80cf658b701e2d5fa509061fa8d1ea0c2b5eb9cb5.png

Figure 4#

t = np.logspace(-2, 2, 100)
x = [0, 100, 200]
plt.figure(figsize=(5.5, 6))
for i in range(len(x)):
    ax = plt.subplot(3, 1, i + 1)
    legendtext = ["confined", "semi-confined", "phreatic"]
    for im in range(len(ml_leff)):
        ha = ml_leff[im].head(x[i], 0, t).squeeze()
        hb = ml_noleff[im].head(x[i], 0, t).squeeze()
        plt.semilogx(t, ha, color="C" + str(im), label=legendtext[im])
        plt.semilogx(t, hb, "--", color="C" + str(im))
    plt.axvline(0, linestyle=":")
    plt.xlim(0.01, 100)
    plt.ylim(0, 1)
    plt.legend(loc="lower left", bbox_to_anchor=(1, 0.2), frameon=False)
    plt.ylabel("head (m)")
    plt.text(0.1, 0.85, f"at x={x[i]} m", transform=ax.transAxes)
    plt.text(1.05, 0.9, "loading eff = 1 (solid)", transform=ax.transAxes)
    plt.text(1.05, 0.75, "no loading eff (dashed)", transform=ax.transAxes)
    plt.grid()
plt.xlabel("time (d)")
plt.tight_layout()
../../_images/3f1d86df9f4b2e64c76d46b4916206fdcc68a9edf3b418a56539497d8712f4e7.png

Figure 6#

k = 20  # m/d
H = 10  # m
Ss = 1e-4  # 1/m
Sp = 0.1  # -
c = 100  # d
tsandhstar = [(0, 1)]
def model(zland, leffaq=0, cland=1e12, Sland=Ss, land_top="conf", W=20):
    ml = tft.ModelXsection(naq=1, tmin=1e-4, tmax=1e2)

    tft.XsectionMaq(
        model=ml,
        x1=-W / 2,  # river extends to infinitiy
        x2=W / 2,
        z=[1, 0, -H],
        kaq=k,
        Saq=Ss,
        c=c,
        leffaq=leffaq,
        topboundary="semi",
        tsandhstar=tsandhstar,
        name="river",
    )

    tft.XsectionMaq(
        model=ml,
        x1=-np.inf,
        x2=-W / 2,  # hinterland extends to infinity
        kaq=k,
        z=zland,
        Saq=Sland,
        c=cland,
        topboundary=land_top,
        name="left",
    )

    tft.XsectionMaq(
        model=ml,
        x1=W / 2,
        x2=np.inf,  # hinterland extends to infinity
        kaq=k,
        z=zland,
        Saq=Sland,
        c=cland,
        topboundary=land_top,
        name="right",
    )

    ml.solve()
    return ml
def create_models(W=20):
    ml_leff = []
    ml_noleff = []
    # land is confined
    ml_leff.append(model([0, -H], leffaq=1, Sland=Ss, land_top="conf", W=W))
    ml_noleff.append(model([0, -H], leffaq=0, Sland=Ss, land_top="conf", W=W))
    # land is semi-confined
    ml_leff.append(
        model(
            [1, 0, -H],
            leffaq=1,
            cland=c,
            Sland=Ss,
            land_top="semi",
            W=W,
        )
    )
    ml_noleff.append(
        model(
            [1, 0, -H],
            leffaq=0,
            cland=c,
            Sland=Ss,
            land_top="semi",
            W=W,
        )
    )
    # land is phreatic
    ml_leff.append(model([0, -H], leffaq=1, Sland=Sp, land_top="phreatic", W=W))
    ml_noleff.append(model([0, -H], leffaq=0, Sland=Sp, land_top="phreatic", W=W))
    return ml_leff, ml_noleff
W = [100, 50, 20]
t = np.logspace(-2, 2, 100)
plt.figure(figsize=(5.5, 6))
for i in range(len(W)):
    ml_leff, ml_noleff = create_models(W[i])
    ax = plt.subplot(3, 1, i + 1)
    legendtext = ["confined", "semi-confined", "phreatic"]
    for im in range(len(ml_leff)):
        ha = ml_leff[im].head(W[i] / 2, 0, t).squeeze()
        hb = ml_noleff[im].head(W[i] / 2, 0, t).squeeze()
        plt.semilogx(t, ha, color="C" + str(im), label=legendtext[im])
        plt.semilogx(t, hb, "--", color="C" + str(im))
    plt.axvline(0, linestyle=":")
    plt.xlim(0.01, 100)
    plt.ylim(0, 1)
    plt.legend(loc="lower left", bbox_to_anchor=(1, 0.2), frameon=False)
    plt.ylabel("head (m)")
    plt.text(0.1, 0.85, f"W={W[i]} m", transform=ax.transAxes)
    plt.text(1.05, 0.9, "loading eff = 1 (solid)", transform=ax.transAxes)
    plt.text(1.05, 0.75, "no loading eff (dashed)", transform=ax.transAxes)
    plt.grid()
plt.xlabel("time (d)")
plt.tight_layout()
self.neq  4
solution complete
self.neq  4
solution complete
self.neq  4
solution complete
self.neq  4
solution complete
self.neq  4
solution complete
self.neq  4
solution complete
self.neq  4
solution complete
self.neq  4
solution complete
self.neq  4
solution complete
self.neq  4
solution complete
self.neq  4
solution complete
self.neq  4
solution complete
self.neq  4
solution complete
self.neq  4
solution complete
self.neq  4
solution complete
self.neq  4
solution complete
self.neq  4
solution complete
self.neq  4
solution complete
../../_images/ae884dc81fc908ff44525b772ab3ab7f515a5b4b37d614d98424ff3d576a27ad.png

Reference#

Bakker, M., 2016. The effect of loading efficiency on the groundwater response to water level changes in shallow lakes and streams. Water Resources Research, 52(3), pp.1705-1715, https://doi.org/10.1002/2015WR017977.