{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 2. Leaky Aquifer Test - Hardinxveld " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Import packages" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import pandas as pd\n", "\n", "import timflow.transient as tft\n", "\n", "plt.rcParams[\"figure.figsize\"] = [5, 3]" ] }, { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "### Introduction and Conceptual Model\n", "\n", "This example, taken from MLU examples (Carlson and Randall, 2012), is a pumping test from Hardinxveld-Giessendam, Netherlands, in 1981 to quantify the head-loss at each pumping well by clogging and to assess the transmissivity variation in the area.\n", "\n", "The hydrogeological conceptualization can be described as the following:\n", "* The first ten meters depth is an aquitard\n", "* Followed by the first aquifer from 10 to 37 m depth, this is also the test aquifer.\n", "* A new aquitard is present from 37 m depth to 68 m depth\n", "* A final aquifer is from 68 to 88 m depth.\n", "* Below 88 m depth the formations are considered an aquiclude\n", "\n", "Five pumping wells are screened in the first aquifer. The drawdown of one of them is available in the MLU documentation (Carlson & Randall, 2012). The provided pumping well was operated for 20 minutes at 1848 m3/d. Drawdown was recorded for a total of 50 minutes during and after pumping. The radius of the pumped well is 0.155 m." ] }, { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Load data" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "data = np.loadtxt(\"data/recovery.txt\", skiprows=1)\n", "to = data[:, 0]\n", "ho = data[:, 1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Parameters and model" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "H = 27 # aquifer thickness, m\n", "zt = -10 # upper boundary of aquifer, m\n", "zb = zt - H # lower boundary of the aquifer, m\n", "rw = 0.155 # well screen radius, m\n", "Q = 1848 # constant discharge rate, m^3/d\n", "t0 = 0.013889 # time stop pumping, d" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "ml = tft.ModelMaq(\n", " kaq=[50, 40],\n", " z=[0, zt, zb, -68, -88],\n", " c=[1000, 1000],\n", " Saq=[1e-4, 5e-5],\n", " topboundary=\"semi\",\n", " tmin=1e-4,\n", " tmax=0.04,\n", ")\n", "w = tft.Well(ml, xw=0, yw=0, rw=rw, res=1, tsandQ=[(0, Q), (t0, 0)], layers=0)\n", "ml.solve()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Estimate aquifer parameters\n", "The parameters to be calibrated are the hydraulic conductivity and specific storage of the first layer, and the skin resistance of the well. The parameters of the aquitards and the second aquifer are kept fixed. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "cal = tft.Calibrate(ml)\n", "cal.set_parameter(name=\"kaq\", initial=50, pmin=0, layers=0)\n", "cal.set_parameter(name=\"Saq\", initial=1e-4, pmin=0, layers=0)\n", "\n", "cal.set_parameter_by_reference(name=\"res\", parameter=w.res[:], initial=1, pmin=0)\n", "cal.seriesinwell(name=\"obs\", element=w, t=to, h=ho)\n", "cal.fit(report=True)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "display(cal.parameters)\n", "print(\"RMSE:\", cal.rmse())" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "tm = np.logspace(np.log10(to[0]), np.log10(to[-1]), 100)\n", "hm = w.headinside(tm)\n", "plt.loglog(to, -ho, \".\", label=\"obs - pumping well\")\n", "plt.loglog(tm, -hm[0], label=\"timflow results\")\n", "plt.xlabel(\"time [d]\")\n", "plt.ylabel(\"drawdown [m]\")\n", "plt.legend()\n", "plt.title(\"Model Results\")\n", "plt.grid()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Comparison of results" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The performance of `timflow` was evaluated by comparison with MLU (Carlson and Randall, 2012). The MLU parameters are higher than the ones in `timflow`. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "t = pd.DataFrame(\n", " columns=[\"k [m/d]\", \"Ss [1/m]\", \"res [d]\", \"RMSE [m]\"],\n", " index=[\"timflow\", \"MLU\"],\n", ")\n", "\n", "t.loc[\"timflow\"] = np.append(cal.parameters[\"optimal\"].values, cal.rmse())\n", "t.loc[\"MLU\"] = [51.530, 8.16e-04, 0.022, 0.00756]\n", "\n", "t_formatted = t.style.format(\n", " {\"k [m/d]\": \"{:.2f}\", \"Ss [1/m]\": \"{:.2e}\", \"res [d]\": \"{:.2f}\", \"RMSE [m]\": \"{:.2f}\"}\n", ")\n", "t_formatted" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## References\n", "\n", "* Carlson F. and Randall J. (2012), MLU: a Windows application for the analysis of aquifer tests and the design of well fields in layered systems, Ground Water 50(4):504–510\n", "* Duffield, G.M. (2007), AQTESOLV for Windows Version 4.5 User's Guide, HydroSOLVE, Inc., Reston, VA.\n", "* Newville, M., Stensitzki, T., Allen, D.B. and Ingargiola, A. (2014), LMFIT: Non Linear Least-Squares Minimization and Curve Fitting for Python, https://dx.doi.org/10.5281/zenodo.11813, https://lmfit.github.io/lmfit-py/intro.html (last access: August,2021)." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.13.5" } }, "nbformat": 4, "nbformat_minor": 4 }