1. Confined Aquifer Test - Oude Korendijk#

Import packages#

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

import timflow.transient as tft

plt.rcParams["figure.figsize"] = (5, 3)  # default figure size

Introduction and Conceptual Model#

In this example, we will use the pumping test data from Oude Korendijk (Kruseman et al. 1970).

Oude Korendijk is a polder area South of Rotterdam, the Netherlands. The stratigraphy can be summarized by:

  • the first 18 m consist of almost impermeable material,

  • the next 7 m is succession of coarse gravel and sands, which are considered as the aquifer layer,

  • a layer of fine sands and clayey sediments that are deemed impermeable.

The well screens the whole thickness of the confined aquifer. Drawdowns were measured in two piezometers located at distances of 30 m and 90 m from the well. The pumping well discharge was constant at 788 m\(^3\)/d for almost 14 hours. The objective of the pumping test was to estimate the hydraulic conductivity and the specific storage of the aquifer layer.

../../_images/oude_korendijk.png

Load data#

# time and drawdown of piezometer 30m away from pumping well
data1 = np.loadtxt("data/piezometer_h30.txt", skiprows=1)
to1 = data1[:, 0] / 60 / 24  # convert min to days
ho1 = data1[:, 1]
ro1 = 30
# time and drawdown of piezometer 90m away from pumping well
data2 = np.loadtxt("data/piezometer_h90.txt", skiprows=1)
to2 = data2[:, 0] / 60 / 24  # convert min to days
ho2 = data2[:, 1]
ro2 = 90

Parameters and model#

# known parameters
H = 7  # aquifer thickness in meters, m
zt = -18  # top boundary of aquifer, m
zb = zt - H  # bottom boundary of aquifer, m
Q = 788  # constant discharge, m3/d
# timflow model
ml = tft.ModelMaq(kaq=60, z=[zt, zb], Saq=1e-4, tmin=1e-5, tmax=1)
w = tft.Well(model=ml, xw=0, yw=0, rw=0.2, tsandQ=[(0, Q)], layers=0)
ml.solve()
self.neq  1
solution complete

Estimate aquifer parameters#

The aquifer parameters are estimated using head observations at both piezometers.

# unknown parameters: kaq, Saq
cal = tft.Calibrate(ml)
cal.set_parameter(name="kaq", initial=10, layers=0)
cal.set_parameter(name="Saq", initial=1e-4, layers=0)
cal.series(name="obs1", x=ro1, y=0, t=to1, h=ho1, layer=0)  # Adding well 1
cal.series(name="obs2", x=ro2, y=0, t=to2, h=ho2, layer=0)  # Adding well 2
cal.fit(report=False)
.........................
...
Fit succeeded.
display(cal.parameters.loc[:, ["optimal"]])
print(f"RMSE: {cal.rmse():.3f} m")
optimal
kaq_0_0 66.088700
Saq_0_0 0.000025
RMSE: 0.050 m
hm1 = ml.head(ro1, 0, to1)
hm2 = ml.head(ro2, 0, to2)
plt.semilogx(to1, ho1, "C0.", label="obs at 30m")
plt.semilogx(to1, hm1[0], "C0", label="timflow at 30 m")
plt.semilogx(to2, ho2, "C1.", label="obs at 90m")
plt.semilogx(to2, hm2[0], "C1", label="timflow at 90m")
plt.title("Model Results")
plt.xlabel("time (d)")
plt.ylabel("head change (m)")
plt.legend()
plt.grid()
../../_images/c4a6842d96d9a0dbaf573585bff91c9554db254272d8617da914e700932db727.png

Comparison of results#

The performance of timflow was compared with MLU (Hemker & Post, 2014), and Kruseman and de Ridder (1970), here abbreviated to K&dR.

MLU included, compared to timflow, three observation wells in the calibration, located at 30, 90, and 215 m from the pumping well. The fit remains poor for the observations at 215 m, which explains the relatively large RMSE. The late-time drawdowns increase more slowly than the computed Theis drawdowns, which is likely caused by leakage (Kruseman and de Ridder, 1970; Hemker & Post, 2014).

Since timflow only includes the first two observation wells (30 and 90 m), the fit to the data is better. However, the estimated parameters are quite similar to those obtained with MLU, while the solution reported by K&dR shows differences.

Hide code cell source

t = pd.DataFrame(
    columns=["k [m/d]", "Ss [1/m]", "RMSE [m]"],
    index=["timflow", "MLU", "K&dR"],
)

t.loc["timflow"] = np.append(cal.parameters["optimal"].values, cal.rmse())
t.loc["MLU"] = [63.51428571, 3.58e-5, 0.832886547]
t.loc["K&dR"] = [55.71429, 1.7e-4, 1.292710331]

t_formatted = t.style.format(
    {
        "k [m/d]": "{:.2f}",
        "Ss [1/m]": "{:.2e}",
        "RMSE [m]": lambda x: "-" if x == "-" else f"{float(x):.3f}",
    }
)
t_formatted
  k [m/d] Ss [1/m] RMSE [m]
timflow 66.09 2.54e-05 0.050
MLU 63.51 3.58e-05 0.833
K&dR 55.71 1.70e-04 1.293

References#

  • Bakker, M. (2013), Semi-analytic modeling of transient multi-layer flow with TTim, Hydrogeol J 21, 935–943, https://doi.org/10.1007/s10040-013-0975-2

  • Duffield, G.M. (2007), AQTESOLV for Windows Version 4.5 User’s Guide, HydroSOLVE, Inc., Reston, VA.

  • Hemker, K. en Post V. (2014) MLU for Windows: well flow modeling in multilayer aquifer systems; MLU User’s guide. https://eur03.safelinks.protection.outlook.com/?url=https%3A%2F%2Fmicrofem.com%2Fdownload%2Fmlu-user.pdf&data=05%7C02%7CMark.Bakker%40tudelft.nl%7Cad7f16364d2d4fd55dbf08de73832eaa%7C096e524d692940308cd38ab42de0887b%7C0%7C0%7C639075204580287861%7CUnknown%7CTWFpbGZsb3d8eyJFbXB0eU1hcGkiOnRydWUsIlYiOiIwLjAuMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTWFpbCIsIldUIjoyfQ%3D%3D%7C0%7C%7C%7C&sdata=OBoe8seXZUfoat89Dfr4g6lF%2Bn1FdtXqtp%2F18BMXCn0%3D&reserved=0

  • Kruseman, G.P., De Ridder, N.A. and Verweij, J.M. (1970), Analysis and evaluationof pumping test data, volume 11, International institute for land reclamation and improvement The Netherlands.