4. Slug Test - Dawsonville confined aquifer example#
This test is taken from example of MLU.
Import packages#
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import ttim as ttm
plt.rcParams["figure.figsize"] = [5, 3]
Introduction and Conceptual Model#
In this notebook, we reproduce the work of Yang (2020) to check the TTim performance in analysing slug-test. We later compare the solution in TTim with the MLU model (Carlson & Randall, 2012).
This Slug Test was reported in Cooper Jr et al. (1967), and it was performed in Dawsonville, Georgia, USA. A fully penetrated well (Ln-2) is screened in a confined aquifer, located between depths 24 and 122 (98 m thick).
The volume of the slug is 10.16 litres. Head change has been recorded at the slug well. Both the well and the casing radii of the slug well is 0.076 m.
The conceptual model can be seen in the figure below:
Set basic parameters#
b = 98 # aquifer thickness, m
zt = -24 # top of aquifer, m
zb = zt - b # bottom of aquifer, m
rw = 0.076 # well radius of Ln-2 Well, m
rc = 0.076 # casing radius of Ln-2 Well, m
Q = 0.01016 # slug volume in m^3, m
Load data#
Data for the Dawsonville test is available in a text file, where the first column is the time data, in days and in the second column is the head displacement in meters
data = np.loadtxt("data/dawsonville_slug.txt")
to = data[:, 0]
ho = data[:, 1]
Create First Model - single layer#
We begin with a single layer model built in ModelMaq. Details on setting up the model can be seen in: Confined 1 - Oude Korendijk.
The slug well is set accordingly. Details on setting up the Well object can be seen in: Slug 1 - Pratt County.
ml = ttm.ModelMaq(kaq=10, z=[zt, zb], Saq=1e-4, tmin=1e-6, tmax=1e-3, topboundary="conf")
w = ttm.Well(ml, xw=0, yw=0, rw=rw, rc=rc, tsandQ=[(0, -Q)], layers=0, wbstype="slug")
ml.solve()
self.neq 1
solution complete
Model calibration both simultaneous wells#
The procedures for calibration can be seen in Unconfined 1 - Vennebulten
We calibrate hydraulic conductivity and specific storage, as in the KGS model (Hyder et al. 1994).
# unknown parameters: kay, Saq
ca = ttm.Calibrate(ml)
ca.set_parameter(name="kaq0", initial=10, pmin=0)
ca.set_parameter(name="Saq0", initial=1e-4)
ca.seriesinwell(name="obs", element=w, t=to, h=ho)
ca.fit()
...............................
Fit succeeded.
/tmp/ipykernel_1376/2690605420.py:3: DeprecationWarning: Setting layers in the parameter name is deprecated. Set the layers= keyword argument for parameter 'kaq0' to silence this warning. The parameter name can still include layer info, but this will be ignored in a future version of TTim.
ca.set_parameter(name="kaq0", initial=10, pmin=0)
/tmp/ipykernel_1376/2690605420.py:4: DeprecationWarning: Setting layers in the parameter name is deprecated. Set the layers= keyword argument for parameter 'Saq0' to silence this warning. The parameter name can still include layer info, but this will be ignored in a future version of TTim.
ca.set_parameter(name="Saq0", initial=1e-4)
display(ca.parameters)
print("rmse:", ca.rmse())
| layers | optimal | std | perc_std | pmin | pmax | initial | inhoms | parray | |
|---|---|---|---|---|---|---|---|---|---|
| kaq0_0_0 | None | 0.420908 | 0.018325 | 4.353689 | 0.0 | inf | 10.0000 | None | [[0.42090788883700814]] |
| Saq0_0_0 | None | 0.000017 | 0.000005 | 31.025816 | -inf | inf | 0.0001 | None | [[1.7004312750679313e-05]] |
rmse: 0.004409616694582213
tm = np.logspace(np.log10(to[0]), np.log10(to[-1]), 100)
hm = ml.head(0, 0, tm)
plt.semilogx(to, ho, ".", label="obs")
plt.semilogx(tm, hm[0], label="ttim")
plt.xlabel("time [d]")
plt.ylabel("displacement [m]")
plt.title("Model Results - Single-layer model")
plt.legend()
plt.grid()
In general, the single-layer model seems to be performing well, with a good visual fit between observations and the model.
Analysis and comparison of simulated values#
We now compare the values in TTim and add the results of the modelling done in MLU by Yang (2020).
ta = pd.DataFrame(
columns=["k [m/d]", "Ss [1/m]"],
index=["MLU", "ttim"],
)
ta.loc["MLU"] = [0.4133, 1.9388e-05]
ta.loc["ttim"] = ca.parameters["optimal"].values
ta["RMSE"] = [0.004264, ca.rmse()]
ta.style.set_caption("Comparison of parameter values and error under different models")
| k [m/d] | Ss [1/m] | RMSE | |
|---|---|---|---|
| MLU | 0.413300 | 0.000019 | 0.004264 |
| ttim | 0.420908 | 0.000017 | 0.004410 |
Results are similar between both models. The RMSE of MLU is slightly better than the one from TTim.
References#
Cooper Jr, H.H., Bredehoeft, J.D., Papadopulos, I.S., 1967. Response of a finite diameter well to an instantaneous charge of water. Water Resources Research 3, 263–269
Hyder, Z., Butler Jr, J.J., McElwee, C.D., Liu, W., 1994. Slug tests in partially penetrating wells. Water Resources Research 30, 2945–2957.
Duffield, G.M., 2007. AQTESOLV for Windows Version 4.5 User’s Guide, HydroSOLVE, Inc., Reston, VA.
Yang, Xinzhu (2020) Application and comparison of different methodsfor aquifer test analysis using TTim. Master Thesis, Delft University of Technology (TUDelft), Delft, The Netherlands.