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);
../../_images/edd614a264ea267ad05c968a5108b6bdc58f0d523bdadaf62a0d041a0d0aec1c.png
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()
../../_images/2df76cfb9f767c333ac23b1af5f81d425c6b69076bdba3b34edea150c10640ef.png
# 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",
)
../../_images/9e38629029c5b67710b99ad7295213eb43b2c9b5b3999efae5bf27a7e8c01fb8.png
# 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",
)
../../_images/e14b462d70b9318da2290d7dfda39d7cb045e6e3b5c103cf671c0ee89d6af5b4.png