Test line-sinks with image wells#

import matplotlib.pyplot as plt
import numpy as np

import timflow.transient as tft

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], phreatictop=True, 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)");
self.neq  2
solution complete
../../_images/41a476b84a61a3a6361028d076079de3930380627bcb1950c815811cc3dc329f.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], phreatictop=True, 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();
self.neq  6
solution complete
self.neq  11
solution complete
../../_images/8f82e2fbba17088983868fce701c19207111f505b25dd4d043c1aa1aa935f385.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], phreatictop=True, 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)");
self.neq  2
solution complete
../../_images/d36ab2ff8f6e526acfff9edc7e0612450d9874482b9a5e9a8d4cf995717b7b10.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], phreatictop=True, 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();
self.neq  11
solution complete
self.neq  21
solution complete
self.neq  41
solution complete
../../_images/29cb52f1453e9f34938e5bf9b9ab7659de37079857d2f75b3e807c2b482c340d.png