Horizontal wells#
A horizontal well is located in a 20 m thick aquifer; the hydraulic conductivity is \(k = 10\) m/d and the vertical anisotropy factor is 0.1. The horizontal well is placed 5 m above the bottom of the aquifer. The well has a discharge of 1000 m\(^3\)/d and radius of \(r=0.2\) m. The well is 200 m long and runs from \((x, y) = (−100, 0)\) to \((x, y) = (100, 0)\).
Three-dimensional flow to the horizontal well is modeled by dividing the aquifer up in
11 layers; the elevations are: [20, 15, 10, 8, 6, 5.5, 5.2, 4.8, 4.4, 4, 2, 0]. At
the depth of the well, the layer thickness is equal to the diameter of the well, and it
increases in the layers above and below the well. A transient timflow model is created with the
Model3D command. The horizontal well is located in layer 6 and is modeled with the
DitchString element.
import matplotlib.pyplot as plt
import numpy as np
import timflow.transient as tft
figsize = (6, 6)
# parameters
k = 10 # hydraulic conductivity, m/d
Ss = 1e-4 # specific storage, 1/m
anisotropy = 0.1 # kz / kh
z = [20, 15, 10, 8, 6, 5.5, 5.2, 4.8, 4.4, 4, 2, 0] # top and bottoms of layers, m
ml = tft.Model3D(kaq=k, z=z, Saq=Ss, kzoverkh=anisotropy, tmin=0.1, tmax=100)
nls = 21
x = np.linspace(-100, 100, nls)
y = np.zeros(nls)
xy = np.vstack((x, y)).T
hw = tft.DitchString(
ml, xy=xy, tsandQ=[(0, 1000)], layers=6
) # horizontal well in layer 6
ml.solve()
self.neq 20
solution complete
h = ml.headgrid(
np.linspace(-200, 200, 20),
np.linspace(-100, 100, 20),
t=[10, 20],
layers=range(7),
parallel=True,
show_progress=True,
)
headgrid: 0%| | 0/400 [00:00<?, ?it/s]
headgrid: 0%| | 1/400 [00:00<00:57, 6.98it/s]
headgrid: 2%|▏ | 7/400 [00:00<00:13, 30.23it/s]
headgrid: 3%|▎ | 13/400 [00:00<00:10, 36.08it/s]
headgrid: 5%|▍ | 19/400 [00:00<00:10, 37.01it/s]
headgrid: 6%|▋ | 25/400 [00:00<00:08, 43.23it/s]
headgrid: 8%|▊ | 31/400 [00:00<00:08, 42.32it/s]
headgrid: 9%|▉ | 37/400 [00:00<00:08, 44.20it/s]
headgrid: 11%|█ | 43/400 [00:01<00:07, 46.35it/s]
headgrid: 12%|█▏ | 49/400 [00:01<00:07, 45.24it/s]
headgrid: 14%|█▎ | 54/400 [00:01<00:07, 46.43it/s]
headgrid: 15%|█▍ | 59/400 [00:01<00:07, 46.53it/s]
headgrid: 16%|█▌ | 64/400 [00:01<00:07, 42.95it/s]
headgrid: 17%|█▋ | 69/400 [00:01<00:07, 42.67it/s]
headgrid: 18%|█▊ | 74/400 [00:01<00:07, 42.97it/s]
headgrid: 20%|█▉ | 79/400 [00:01<00:07, 40.75it/s]
headgrid: 21%|██ | 84/400 [00:02<00:07, 43.10it/s]
headgrid: 22%|██▏ | 89/400 [00:02<00:07, 44.27it/s]
headgrid: 24%|██▍ | 95/400 [00:02<00:07, 41.83it/s]
headgrid: 25%|██▌ | 101/400 [00:02<00:06, 43.41it/s]
headgrid: 27%|██▋ | 107/400 [00:02<00:06, 42.64it/s]
headgrid: 28%|██▊ | 113/400 [00:02<00:06, 42.60it/s]
headgrid: 30%|██▉ | 119/400 [00:02<00:06, 45.19it/s]
headgrid: 31%|███▏ | 125/400 [00:02<00:06, 44.54it/s]
headgrid: 33%|███▎ | 131/400 [00:03<00:06, 44.13it/s]
headgrid: 34%|███▍ | 137/400 [00:03<00:05, 46.08it/s]
headgrid: 36%|███▌ | 142/400 [00:03<00:05, 46.23it/s]
headgrid: 37%|███▋ | 147/400 [00:03<00:06, 41.75it/s]
headgrid: 38%|███▊ | 152/400 [00:03<00:05, 43.74it/s]
headgrid: 39%|███▉ | 157/400 [00:03<00:05, 44.31it/s]
headgrid: 41%|████ | 163/400 [00:03<00:05, 42.77it/s]
headgrid: 42%|████▏ | 169/400 [00:03<00:05, 43.55it/s]
headgrid: 44%|████▍ | 175/400 [00:04<00:05, 43.51it/s]
headgrid: 45%|████▌ | 181/400 [00:04<00:05, 43.51it/s]
headgrid: 47%|████▋ | 187/400 [00:04<00:04, 43.45it/s]
headgrid: 48%|████▊ | 193/400 [00:04<00:05, 40.74it/s]
headgrid: 50%|█████ | 200/400 [00:04<00:04, 46.32it/s]
headgrid: 51%|█████▏ | 205/400 [00:04<00:04, 43.82it/s]
headgrid: 53%|█████▎ | 211/400 [00:04<00:04, 44.11it/s]
headgrid: 54%|█████▍ | 217/400 [00:05<00:04, 43.55it/s]
headgrid: 56%|█████▌ | 223/400 [00:05<00:03, 44.37it/s]
headgrid: 57%|█████▋ | 229/400 [00:05<00:03, 44.71it/s]
headgrid: 59%|█████▉ | 235/400 [00:05<00:03, 44.02it/s]
headgrid: 60%|██████ | 240/400 [00:05<00:03, 44.84it/s]
headgrid: 61%|██████▏ | 245/400 [00:05<00:03, 42.57it/s]
headgrid: 63%|██████▎ | 251/400 [00:05<00:03, 42.18it/s]
headgrid: 64%|██████▍ | 257/400 [00:05<00:03, 45.79it/s]
headgrid: 66%|██████▌ | 262/400 [00:06<00:03, 45.83it/s]
headgrid: 67%|██████▋ | 268/400 [00:06<00:03, 43.79it/s]
headgrid: 68%|██████▊ | 274/400 [00:06<00:02, 42.30it/s]
headgrid: 70%|███████ | 280/400 [00:06<00:02, 43.04it/s]
headgrid: 71%|███████▏ | 285/400 [00:06<00:02, 44.02it/s]
headgrid: 73%|███████▎ | 291/400 [00:06<00:02, 42.79it/s]
headgrid: 74%|███████▍ | 297/400 [00:06<00:02, 43.00it/s]
headgrid: 76%|███████▌ | 303/400 [00:07<00:02, 42.68it/s]
headgrid: 77%|███████▋ | 309/400 [00:07<00:02, 43.03it/s]
headgrid: 79%|███████▉ | 315/400 [00:07<00:02, 41.83it/s]
headgrid: 80%|████████ | 321/400 [00:07<00:01, 43.68it/s]
headgrid: 82%|████████▏ | 327/400 [00:07<00:01, 42.32it/s]
headgrid: 83%|████████▎ | 333/400 [00:07<00:01, 43.71it/s]
headgrid: 85%|████████▍ | 339/400 [00:07<00:01, 45.91it/s]
headgrid: 86%|████████▌ | 344/400 [00:07<00:01, 44.89it/s]
headgrid: 88%|████████▊ | 350/400 [00:08<00:01, 45.63it/s]
headgrid: 89%|████████▉ | 355/400 [00:08<00:00, 45.78it/s]
headgrid: 90%|█████████ | 360/400 [00:08<00:00, 44.83it/s]
headgrid: 91%|█████████▏| 365/400 [00:08<00:00, 44.37it/s]
headgrid: 92%|█████████▎| 370/400 [00:08<00:00, 44.28it/s]
headgrid: 94%|█████████▍| 375/400 [00:08<00:00, 44.05it/s]
headgrid: 95%|█████████▌| 380/400 [00:08<00:00, 42.68it/s]
headgrid: 96%|█████████▋| 386/400 [00:08<00:00, 44.82it/s]
headgrid: 98%|█████████▊| 391/400 [00:09<00:00, 42.95it/s]
headgrid: 99%|█████████▉| 396/400 [00:09<00:00, 44.19it/s]
headgrid: 100%|██████████| 400/400 [00:09<00:00, 43.64it/s]
ml.plots.contour(win=[-200, 200, -100, 100], ngr=20, t=10, layers=6, parallel=True);
hw.headinside(20)[0] # returns heads in each line-sink (but they are all equal)
array([[-4.16010758]])
t = np.linspace(1, 100, 100)
hwinside = hw.headinside(t)
plt.plot(t, hwinside[0, 0])
plt.xlabel("time (d)")
plt.ylabel("head inside well (m)")
plt.grid()
# contours in vertical cross-section. interpolation between cell centers
ax = ml.plots.vcontour(
win=[-400, 400, 0, 0],
n=100,
t=50,
levels=20,
vinterp=True,
figsize=(16, 4),
horizontal_axis="x",
)
# contours in vertical cross-section. no interpolation between cell centers
ax = ml.plots.vcontour(
win=[-400, 400, 0, 0],
n=100,
t=50,
levels=20,
vinterp=False,
figsize=(16, 4),
horizontal_axis="x",
)