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/5e380a251c5f1e45b1b816665b3f613849917144edbaa9afa921e62bf11aab19.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/a1761ad6e2f93ea0f021b01788614536f019424c437c928bb2f3b444e477d330.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/8ef1926f79cf4c57b94d1feef81290a85517e2bf5dcfefe293d21edf8bcf31d7.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/eda26d3669f5a1858e8762423eb32c707fe1378e0171d833cc9ad6de31136be4.png