Test line-sinks with image wells#

import matplotlib.pyplot as plt
import numpy as np

import timflow.transient as tft

plt.rcParams["figure.figsize"] = (6, 4)

Consider a well pumping in a phreatic aquifer with \(S_y=0.1\). The hydraulic conductivity of the aquifer is 10 m/d and the saturated thickness may be approximated as constant and equal to 20 m. The well is located at \((x,y)=(0,0)\). The discharge of the well is 1000 m\(^3\)/d and the radius is 0.3 m. there is a very long river with a fixed head located along the line \(x=50\) m. The head is computed at \((x,y)=(20,0)\) for the first 20 days after the well starts pumping. The solution for an image well is compared to the solution using a RiverString element of different lengths.

ml1 = tft.ModelMaq(
    kaq=10, z=[20, 0], Saq=[0.1], topboundary="phreatic", tmin=0.001, tmax=100
)
w1 = tft.Well(ml1, 0, 0, rw=0.3, tsandQ=[(0, 1000)])
w2 = tft.Well(ml1, 100, 0, rw=0.3, tsandQ=[(0, -1000)])
ml1.solve()
t = np.linspace(0.1, 20, 100)
h1 = ml1.head(20, 0, t)
plt.plot(t, h1[0], label="river modeled with image well")
plt.xlabel("time (d)")
plt.ylabel("head (m)")
plt.grid()
self.neq  2
solution complete
../../_images/c962996d3728e49ef39c25ea6864641c833f61ffc3fd81a56d31596f70d628e7.png
plt.plot(t, h1[0], label="river modeled with image well")
for ystart in [-50, -100]:
    ml2 = tft.ModelMaq(
        kaq=10, z=[20, 0], Saq=[0.1], topboundary="phreatic", tmin=0.001, tmax=100
    )
    w = tft.Well(ml2, 0, 0, rw=0.3, tsandQ=[(0, 1000)])
    yls = np.arange(ystart, -ystart + 1, 20)
    xls = 50 * np.ones(len(yls))
    lss = tft.RiverString(ml2, xy=list(zip(xls, yls, strict=False)), tsandh="fixed")
    ml2.solve()
    h2 = ml2.head(20, 0, t)
    plt.plot(t, h2[0], "--", label=f"line-sink string from {ystart} to {-ystart}")
plt.title("head at (x,y)=(20,0)")
plt.xlabel("time (d)")
plt.ylabel("head (m)")
plt.legend()
plt.grid()
self.neq  6
solution complete
self.neq  11
solution complete
../../_images/4e8128f6db9d876a7842074d7a91f088986c0b89997a9f11c1d8248f15c5f115.png

The solution is repeated for the case where there is a long impermeable wall along \(x=50\) m rather than a river.

ml1 = tft.ModelMaq(
    kaq=10, z=[20, 0], Saq=[0.1], topboundary="phreatic", tmin=0.001, tmax=100
)
w1 = tft.Well(ml1, 0, 0, rw=0.3, tsandQ=[(0, 1000)])
w2 = tft.Well(ml1, 100, 0, rw=0.3, tsandQ=[(0, 1000)])
ml1.solve()
t = np.linspace(0.1, 20, 100)
h1 = ml1.head(20, 0, t)
plt.plot(t, h1[0], label="impermeable wall modeled with image well")
plt.xlabel("time (d)")
plt.ylabel("head (m)")
plt.grid()
self.neq  2
solution complete
../../_images/a9f8f66a908eabca46044418c040d036e9f0d87cfbb24857ba015cefd7af0f63.png
plt.plot(t, h1[0], label="river modeled with image well")
for ystart in [-100, -200, -400]:
    ml2 = tft.ModelMaq(
        kaq=10, z=[20, 0], Saq=[0.1], topboundary="phreatic", tmin=0.001, tmax=100
    )
    w = tft.Well(ml2, 0, 0, rw=0.3, tsandQ=[(0, 1000)])
    yls = np.arange(ystart, -ystart + 1, 20)
    xls = 50 * np.ones(len(yls))
    lss = tft.LeakyWallString(ml2, xy=list(zip(xls, yls, strict=False)), res="imp")
    ml2.solve()
    h2 = ml2.head(20, 0, t)
    plt.plot(t, h2[0], "--", label=f"line-doublet string from {ystart} to {-ystart}")
plt.title("head at (x,y)=(20,0)")
plt.xlabel("time (d)")
plt.ylabel("head (m)")
plt.legend()
plt.grid()
self.neq  11
solution complete
self.neq  21
solution complete
self.neq  41
solution complete
../../_images/e15eada5f66696178db42bdb521c5bd4a10dc979b63402bdeebf8101e6b30a5e.png