DataPDF Available

How to use the heatfuncs Python library to calculate groundwater flow from temperature data

Authors:

Abstract

A user guide for a library of Python functions to calculate groundwater flow from temperature data. Current version (v0.0.1) includes analytical solutions by Bredehoeft and Papadopulos (1965), Mansure and Reiter (1979) and Lu and Ge (1996). This user guide explains the analytical solutions, provides a description of loading data and how to run functions to calculate groundwater flow.
How to use the heatfuncs Python library to calculate
groundwater flow from temperature data
Dylan J. Irvine
dylan.irvine@monash.edu
Last updated: January 15, 2015
Version number: 0.0.1
Introduction
heatfuncs.py is a Python library that contains functions to calculate groundwater flow from
temperature data. Curently heatfuncs.py includes the analytical solutions by Bredehoeft
and Papadopulos (1965), Mansure and Reiter (1979), and Lu and Ge (1996). The goal of
heatfuncs.py is to produce easy to use Python functions to promote the more widespread
use of temperature data in hydrogeology.
The version number 0.0.1 denotes the fact that the library is still in the testing phase, and
may contain errors. If any errors are noticed, please contact me using the email address
above.
Python is a really great programming language. It’s pretty easy to pick up (and if you don’t
code, I have an example of all the coding required to run some of the functions included at
the end of this document). The other key benefit of Python is that it is free, so there are no
license/funding issues.
Before we start
heatfuncs.py is a small library of functions to analyse temperature data using the Python
programming language. The heatfuncs.py library uses some functions which are only
available in relatively recent versions of Python. For example, the library was written using
Python version 2.7.6.
The easiest way to obtain Python, relevant libraries and a nice GUI, is to install Python XY
(which is made for scientific and engineering purposes). To install Python XY, download an
installer, and follow the instructions at:
https://code.google.com/p/pythonxy/wiki/Downloads
As a guide, once you’ve installed Python, you will write scripts, use functions, etc. using the
Spyder GUI.
1
Important! You have to run heatfuncs.py at least once(!)
You may be better at using Python than me. So if there is a better way of using the heat-
funcs.py library than my description below, please let me know.
First, given that you’re reading this, I assume that you’ve downloaded the library. Save the
files in a sensible location on your computer. And by sensible, I mean somewhere that you
will remember. Python scripts to call functions from the heatfuncs.py library will need to
be stored in the same location on your computer.
To have the functions from the heatfuncs.py library available to use, open the heat-
funcs.py file in Spyder (the GUI that comes with the Python XY package), and run in once
(either by pressing the green ’play’ button, or pressing F5). Depending on how your Spyder
GUI is set up, some text may appear on the console window. Either way, nothing much
should happen.
Now create a new python script in the same directory. Python differs from other high level
languages like MATLAB, in that if you want to use a function, you have to import it from
the library where it belongs. I usually just import the entire library, but you can also import
selected functions. e.g. two ways of importing functions from the numpy library (scientific
computing library) are below:
from numpy import *
from numpy import exp, sum
i.e. the first option simply imports all of the numpy functions, and the second only im-
ports the exp and sum functions. This over-thinking things for now. Once you’ve run
the heatfuncs.py script once, the functions contained within it are ready to use. At the
end of this document is a script (that should be saved in the same directory as the heat-
funcs.py script) that will run the BPrun function, and produce an estimate of qzin m s1
Some other Python quirks
I personally find it really annoying, but Python starts counting from 0. So if you had a
column vector of data (let’s say you had a column of data called T). If you want to print the
first value from T, you would type:
print T[0]
The other relevant example, would be if your geothermal data were stored in a file with 2
2
columns. The first column containing depth, and the second containing temperature. You
could load the file (let’s say it was called Tatiara.dat, and that it has 2 header lines) to a
parameter called Tatdata (or whatever you would like to call it) with the following:
Tatdata = loadtxt(’Tatiara.dat’, skiprows=2)
Now your depth data would be stored as Tatdata[:,0], and your temperature data would be
stored as Tatdata[:,1]. i.e. the : means all rows of data, and the 0 or 1, refers to the 1st or
2nd column.
Alternatively, you could use the snippet of text below to load the data straight into arrays
called z and T (to match the nomencalture used here) e.g.:
z = loadtxt(’Tatiara.dat’, skiprows=2, usecols=(0,))
T = loadtxt(’Tatiara.dat’, skiprows=2, usecols=(1,))
One last point. . . Commands in Python are case sensitive. So T and t are different.
There are other quirks, but this will do for now.
3
Parameter shorthand
Below is a list of all of the parameters used in heatfuncs.py. All parameters use the units:
kg, m, s, C, J and W.
Symbol Code symbol Units Explanation
TTC Temperature
zz m Depth
z0z0 m Depth of top of geothermal profile for analysis
zLzL m Depth of bottom of geothermal profile for anal-
ysis
T0T0 C m1Temperature at z0
TLTL C m1Temperature at zL
LL m Distance between z0and zL
qzqest m s1Estimate of qzor value of qz
qxqx m s1Value of qx
ρwpw kg m3Density of water
cwcw J kg1C1Specific heat capacity of water
λ0kb W m1C1Thermal conductivty of solid-fluid matrix
γgam C m1Horizontal thermal gradient (user entered)
ηeta C m1Vertical thermal gradient (calculated inter-
nally from T0,TLand L)
P exPex - Horizontal Peclet number
P ezPez - Vertical Peclet number
δdelta - (γ
η)(P ex
P ez)
4
Analytical solutions included in heatfuncs.py
Note: The explanation for each solution is given in full. There will be repetition. Symbols
used may vary from the original publication for consistency.
Analytical solutions included in heatfuncs.py:
Bredehoeft and Papadopulos (1965)
Mansure and Reiter (1979)
Lu and Ge (1996)
Future plans to add:
Taniguchi (1993)
Functions included in heatfuncs.py
An example of calling a function in Python would be to assign the square root of a number
to a variable. For example, you may want to assign the square root of 27 to the variable b.
To do this, you could type:
b = sqrt(27.0)
In all of the examples below, the heatfuncs.py functions are assigned to the variable a.
However, you can use whatever variable name that you like.
Tzprep,
Normalises Tand zdata. Removes any data above z0and ignores all data after
zL, has been reached. This function deals with the fact that temperature is typically
recorded as a sensor is lowered down, and then raised up through a borehole. Example:
a = Tzprep(T, z, z0, zL)
or:
a = Tzprep(T, z, 10.0,61.0)
e.g. where user has already loaded Tand z, and z0= 10.0m and zL= 61.0 m.
Tzplot,
This function is essentially the Tzprep function, but with plotting capabilities. In
5
addition to T,z,z0,zL, user also enters the output file name (must be a .png file),
the output file destination (e.g. r’C:\this\is\my\folder’), the dpi of the output file,
whether the plots are to be side by side (’row’), or stacked on top of one another
(’col’), the fontsize, and line colour. An example could be (where the path to the
destination folder has been set to the parameter outfolder):
a = Tzplot(T, z, z0, zL, ’Tatiara.png’, outfolder, 300,’row’,10,’#0066FF’)
An example of the output with the ’row’ option is below:
Fig 1:Plot on the left shows the orignal Tzplot from 0 to 80 m. On the right, the
Temperature and data has been normalised to be used in either the Bredehoeft and
Papadopulos (1965) or Lu and Ge (1996) methods.
BPmin,
Not intended to be called directly by the user. Calculates the weighted sum of squared
error (SSE) between observed and modelled normalised Tusing the Bredehoeft and
Papadopulos (1965) method. This function is not intended to be used directly by the
user. It is called by BPq (details below). See Advanced options to change the
weighting of the SSE.
BPq,
Not intended to be called directly by the user. Uses the Python minimize function
to find the qzthat minimises the objective function (in this case, the sum of squared
errors between observed and modelled normalised temperature).
BPrun,
Calls Tzprep,BPmin and BPq. Produces the qzvalue that minimises the sum of
squared errors between observed normalised temperature. Setting the plotswitch op-
tion to 1 also outputs a graph of normalised zagainst normalised T. Example:
a = BPrun(T, z, z0, zL, qest, pw, cw, kb, plotoption)
6
An example of the output figure from the BPrun function:
Fig 2: Example of the normalised T= (TzT0)/(TLT0) and normalised z=z/L
data (blue) and the fitted Bredehoeft and Papadopulos (1965) function (red dash) for
a hyporthetical example
LGmin,
Not intended to be called directly by the user. Like BPmin, but for the Lu and Ge
(1996) method.
LGq,
Not intended to be called directly by the user. Like BPq, but for the Lu and Ge (1996)
method.
LGrun,
Notice the pattern here? Like BPrun, but for the Lu and Ge (1996) method. Example:
a = LGrun(T, z, z0, zL, qest, qx, pw, cw, kb, gam, plotoption)
LGmindelta,
Not intended to be called directly by the user. Like LGmin, but the user enters δ
rather than estimates of qx,γ, η
LGqdetla,
Not intended to be called directly by the user. Like LGq, but where, as above, the
user enters δ.
7
LGrundelta,
Notice the pattern here? Like LGrun, but where, as above, the user enters δ. Example:
a = LGrundelta(T, z, z0, zL, qest, pw, cw, kb, delta, plotoption)
MRrun,
Runs the Mansure and Reiter (1979) derivative method. This function may require to
be run until the appropiate range of data has been determined by the user. This can
be done by selecting an appropriate depth range of data to fit the shallow (linear) part
of the dT/dz vs Tgraph. Example:
a = MRrun(T, z, z0, zL, kb, dzpref, zfitfrom, zfitto, pw, cw)
An example of the output figure from the Mansure and Reiter (1979) method:
Fig 3: Example of the Mansure and Reiter (1979) derivative method. In blue is the
dT/dz vs Tdata, and red dash is the fitted shallow (linear) part of the dT/dz vs T
data. The slope of the red line is mused in Equation 11.
8
Theory
Thermal conductivity
Many of the solutions in heatfuncs.py include bulk (i.e. saturated porous media) thermal
conductivity, which is denoted as λ0, and has units of W m1C m1.λ0is calculated us-
ing the thermal conductivity of the solid (λs), the thermal conductivity of water (λw) and
porosity (θ) using one of the two approaches below:
λ0=λ1θ
sλθ
w,(1)
λ0=λs(1 θ) + λwθ, (2)
Equation 1 is a geometric approach, and Equation 2 is an arithmetic approach to calculating
λ0. The approach that you use is up to you. Typically, the value of λ0is going to be an
estimate anyway.
As a guide, λwis approximately 0.6 W m1C m1. Sand (i.e. solid) has a relatively high
thermal conductivity λs8.0 W m1C m1. A typical range of λ0would range between
1.6 to 4.5 W m1C m1.
Bredehoeft and Papadopulos (1965) solution
The Bredehoeft and Papadopulos (1965) analytical solution is a 1D solution to calculate
vertical fluid flow (Darcy flux, qz). The solution is straightforward to use, and only requires
a geothermal profile, and an estimate of bulk thermal conductivity (λ0, W m1C1). The
Bredehoeft and Papadopulos (1965) solution can be written as:
TzT0
TLT0
=exp(P ez(z/L)1
exp(P ez)1,(3)
where Tzis a temperature (C) at a depth z(m), T0and TLares the temperature boundary
conditions for the top and bottom of the model respectively, and P ezis the thermal Peclet
number:
P ez=ρwcwqzL
λ0
,(4)
where ρwis the density of water (kg m3, e.g. 1000.0), cwis the specific heat capacity of
water (J kg1C1, e.g. 4186.0), qzis the vertical Darcy flux (m s1), Lis the distance
9
between the points for T0and TL(here these points are referred to as z0and zL), and λ0is
the bulk thermal conductivity (W m1C1).
The Bredehoeft and Papadopulos (1965) method obtains a qzestimate by finding the qz
that produces the best fit between the normalised Tdata (i.e. (TzT0)/(TLT0)) from
the measurements, and equation 1. The functions from heatfuncs.py find this qzvalue by
minimising the sum of squared errors between the observed and modelled data.
Lu and Ge (1996) solution
The Lu and Ge (1996) solution is a 2D extension of the Bredehoeft and Papadopulos (1965)
solution. In addition to a geothermal profile and an estimate of bulk thermal conductivity
(λ0, W m1C1), the Lu and Ge (1996) analytical solution also requires a horizontal thermal
gradient (which requires either another geothermal profile, and the gradient is calculated, or
the estimation of a horizontal thermal gradient).
The Lu and Ge (1996) solution can be written as:
TzT0
TLT0
=exp(P ez(z/L)1
exp(P ez)1+γ
η
P ex
P ez exp(P ez(z/L)1
exp(P ez)1z
L!,(5)
where Tzis a temperature (C) at a depth z(m), T0and TLares the temperature boundary
conditions for the top and bottom of the model respectively, and P exand P ezare thermal
Peclet numbers (below), Lis the distance (m) between T0and TL,γis the horizontal thermal
gradient ( positive when heat flow is leftward, C m1, requiring another geothemal profile,
or an estiamte of γ) and ηis the vertical thermal gradient (positive when heat flow is upward,
C m1, which can be determined from the geothermal profile of interest).
The P exand P eznumbers are:
P ex=ρwcwqxL
λ0
,(6)
and,
P ez=ρwcwqzL
λ0
,(7)
Lu and Ge (1996) also suggest that the γ P ex
ηP ezterm can be combined into a single parameter
δthat includes parameters which are often unknown. Following this, the Lu and Ge (1996)
equation can be written as:
TzT0
TLT0
=exp(P ez(z/L)1
exp(P ez)1+δ exp(P ez(z/L)1
exp(P ez)1z
L!,(8)
10
where qxand qzare the Darcy flux (m s1) in the horizontal and vertical directions, and λ0
is bulk thermal conductivity (λ0, W m1C1).
heatfuncs.py provides approaches to use either form of the Lu and Ge (1996) method.
Notice that the first term on the right hand side of either form of the Lu and Ge (1996)
solution is the Bredehoeft and Papadopulos (1965) solution. In cases where there is no hor-
izontal thermal gradient (γ), or no horizontal flow (qx), the solution reduces the Bredehoeft
and Papadopulos (1965) solution. An extension of this point is that the solution is not sen-
sitive to the final term on the right hand side where the γ, or qxare small.
The next point is important, hence it’s in red. The first form of the Lu and Ge (1996)
solultion simultaneously requires the estimation of both qxand qz.The approach taken in
heatfuncs.py is to fix the qxvalue, and estimate qz. This process can be repeated for several
qxvalues to determine the sensitivity of the qzestimate to qx. Alternatively, the user can
run the δbased function, and use several δvalues.
The Lu and Ge (1996)method obtains a qzestimate by finding the qzthat produces the best
fit between the normalised Tdata (i.e. (TzT0)/(TLT0)) from the measurements, and
equation 5. The functions from heatfuncs.py find this qzvalue by minimising the sum of
squared errors between the observed and modelled data. This approach requires both an
initial estimate of qzand a fixed value of qx. As the solution for qzdepends on the value of
qxit is recommended that the function be run with a range of qxvalues and/or horizontal
thermal gradients (γ) if these values are unknown.
Mansure and Reiter (1979) solution
Mansure and Reiter (1979) present a method of determining fluid flow from geotherms us-
ing derivatives of temperautre with depth. This method performs best using high precision
(i.e. 0.0001 C) equipment. Assuming steady state, vertical and uniform flow, Mansure and
Reiter (1979) show that:
d(dT/dz) = cwρw
λ0
qzdT, (9)
and that the slope (m) of the plot dT /dz vs. Tyields:
m=cwρwqz
λ0
,(10)
11
which can be rearranged to obtain:
qz=0
cwρw
.(11)
When purely vertical flow occurs (and the system is thermally homogeneous), the relation-
ship between dT/dz and Twill be linear. When multidimensional flows occurs, typically,
the shallow data will be linear, and deeper data are non-linear. It is recommended to fit the
shallow, linear part of the curve.
To perform calculations of fluid flow using the Mansure and Reiter (1979) method, the
heatfuncs.py library interpolates the geotherm onto a steady depth profile, as typically,
geotherms are measured at a constant time (as the sensor is lowered down the borehole),
rather than at a constant depth.
Avdanced options
heatfuncs.py has a number of advanced settings that can be changed by changing the
options and re-running heatfuncs.py enact changes. The optional changes that can be
made to heatfuncs.py include:
1. Changing the weighting of sum of squared errors (e.g. this is used in the Lu and Ge
(1996) method)
2. Changing the convergence criteria for the minimize function in the BPq, LGq, or
LGqdelta functions
Change SSE weightings
By default, heatfuncs.py applies a weighted sum of square error (SSE). In the BPq, LGq
and LGqdelta functions, w= the weighting array. This array has the same length as the
input data (i.e. z/L), and ranges from some value, to 1. The warray is set up using the
Python linspace function (which linearly spaces values between a user defined start (first
value in function), and end (second value in function). The length of the array is the third
value in the function).
If the user desires to have no weightings, then the first value in the linspace function that
sets up the warray can be set to one. Increasing the weight of the shallow data can be
achieved by increasing the first value. Similarly, weighting the shallow data can be achieved
by increasing the value of the end value (i.e. second number in the linspace function).
Reduce convergence criteria
12
The convergence criteria (xtol) are set to a very small value in the BPq, LGq and LGqdelta
functions (these functions are used to minimize the SSE). By default, the convergence criteria
are set to 1 ×1018 . This value can be increased/decreased by the user by changing the xtol
value.
Detailed description of key functions
In Spyder (a Python GUI), help on all functions can be obtained by typing the function
name, followed by an open bracket. Detailed description of input and output of the function
will appear in the Object inspector. Below are descriptions of two key functions:
Tzprep function
This function is used to prepare raw data to be analysed in the Bredehoeft and Papadopulos
(1965) solution (also used in the Lu and Ge (1996) related functions). The user enters the
temperature data (T), depth data (z), the the depths of the top (z0) and bottom (zL) bound-
ary conditions for the Bredehoeft and Papadopulos (1965) or Lu and Ge (1996) solutions.
Geothermal profiles are recorded as the sensor is lowered down a borehole, and as it is raised
up again. The Tzprep function overcomes this issue by using the first instance of the sensor
equalling or exceeding either z0 or zL values. For zL this means that any data after the
depth zL is ignored.
The user does not necessarily have to call this function (as it is called by other BP related
functions). However, the Tzprep function is a simple way to produce normalised Tand z
data (e.g. TzT0/TLT0, or z/L).
An example of calling Tzprep (where T and z have been read in) would be:
a = Tzprep(T, z, z0, zL)
Tzprep outputs a single variable (in this case ’a’) which contains position 0 = Tnorm, po-
sition 1 = znorm, position 2 = Ttrunc, position 3 = ztrunc, position 4 = T0, postion 5 =
TL, position 6 = L.
i.e. to print the normalised T data, the user could type:
print a[0]
or to plot the normalised T-z profile (i.e. z/L vs. (TzT0/TLT0)), the user could type:
13
plot(a[0], a[1])
gca().invert yaxis() # Inverts the y axis to have 0 at the top.
show() # The show command may or may not be required to actually show the plot
BPrun function
This function calcualtes the qz(m s1) that best fits the observed geothermal profile.
Geothermal logs typically record temperature both as the sensor is lowered down the bore-
hole, and as it is raised back up. This is overcome within the BPrun function, where the
first depth that exceeds zLis used, and data deeper than this depth is ignored.
Input for the function is:
T, 1D column of temperature data (C)
z, 1D column the of depths corresponding to temperature data (m)
z0, Depth for upper boundary condition (m)
zL, Depth for lower boundary condition (m)
pw, Density of water (kg m1)
cw, Specific heat capacity of water (J kg1C1)
kb, Bulk thermal conductivity (W m1C1)
qest, Estimate of Darcy flux (m s1)
plotswitch, 0 = no plot, 1 = graph of fitted and observed (TzT0)/(TLT0)
Output for the function is:
qzin m s1.
14
Example script to call BPrun
Warning: If you cut and paste the text below, you may have to re-type the ”’ symbols. Also,
you’ll have replace the example ’datafolder’ to be the path to your data
# -*- coding: utf-8 -*-
”””
Created on Fri Dec 12 12:47:15 2014
A script to calculate qz from the Bredehoft and Papadopulos (1965)
method using the heatfuncs library ”””
from matplotlib.pyplot import *# plotting library, by the way # is the symbol for comments
from numpy import *# scientific computing library
import os # The opperating system library to change folders
from heatfuncs import *# Finally, the heatfuncs library
#The line below asigns the path to your temperature data to the variable ’datafolder’
#The r out the front is to say that this is in raw format. If the r isn’t used, you will
#have to double all of the backslashes.
datafolder = r’C:\your\path\goes\here’
# Changes the directory to where your data is located
os.chdir(datafolder)
# commands to load your data. Annoying point, Python counts from zero. In this example,
# I have depth (m) in the 1st col of a file, and T (C) in the 2nd col. This example has a
# header row, which is skipped. For more complicated cases with gaps in the data, look up
# the genfromtxt() command. To load csv files, change the delimiter=None to delimiter=’,’
z = loadtxt(’testdata.dat’,skiprows=1, delimiter=None, usecols=(0,))
T = loadtxt(’testdata.dat’,skiprows=1, delimiter=None, usecols=(1,))
# parameter values for functions
z0 = 0.0 # Depth of top of geothermal profile, m
zL = 100.0 # Depth of bot of geothermal profile, m
pw=1000.0 # water density kg m3
cw = 4186.0 # specific heat capcity of water J kg1C1
kb = 3.0 # bulk thermal conductivity W m1C1
qest = 1.0e-7 # estimate of Darcy flux m s1
plotswitch = 1# 0 = no plot, 1 = show fitted data
# Below is the BPrun function which will produce an estimate of q(m s1)
q = BPrun(T,z,z0,zL,qest,pw,cw,kb,plotswitch)
print ’=================’
print ’ end of program’
print ’=================’
15
References
Bredehoeft, J.D., and Papadopulos, I.S. (1965) Rates of vertical groundwater movement es-
timated from the Earth’s thermal profile, Water Resources Research, 1(2), p 325-328.
Lu, N. and Ge., S. (1996) Effect of horizontal heat and fluid flow on the vertical temperature
distribution in a semiconfinig layer, Water Resources Research, 32(5), p 1449-1453.
Mansure, A.J., and Reither, M. (1979) A vertical groundwater movement correction for heat
flow, Journal of Geophysical Research, 84(B7), p 3490-3496.
Taniguchi, M. (1993) Evaluation of vertical groundwater fluxes and thermal properties of
aquifers based on transient temperature-depth profiles, Water Resources Research, 29(7), p
2012-2026.
16

File (1)

Content uploaded by Dylan James Irvine
Author content

Supplementary resource (1)

... Fig. 1a), an estimate of λ 0 , and C w which is known (≈4.2×10 6 J m −3 • C −1 ). Irvine [2015] produced a library of functions in the Python programming language to solve several of the temperature-based analytical solutions for q z , including the BP method. The Python functions use a curve fitting method to determine q z by minimising the difference between the measured and modelled values using a weighted sum of square errors (see Fig. 1b). ...
... The Python functions use a curve fitting method to determine q z by minimising the difference between the measured and modelled values using a weighted sum of square errors (see Fig. 1b). Estimates of q z from the BP method were determined using the Irvine [2015] Python functions, and are denoted as q zBP . Lu and Ge [1996] provided a two-dimensional extension of the BP method. ...
Article
Full-text available
Steady state 1D analytical solutions to estimate groundwater fluxes from temperature profiles are an attractive option because they are simple to apply, with no complex boundary or initial conditions. Steady state solutions have been applied to estimate both aquifer scale fluxes as well as to estimate groundwater discharge to streams. This study explores the sources of uncertainty in flux estimates from regional scale aquifers caused by sensor precision, aquifer heterogeneity, multi-dimensional flow and variations in surface temperature due to climate change. Synthetic temperature profiles were generated using 2D groundwater flow and heat transport models with homogeneous and heterogeneous hydraulic and thermal properties. Temperature profiles were analysed assuming temperature can be determined with a precision between 0.1 °C and 0.001 °C. Analysis of synthetic temperature profiles show that the Bredehoeft and Papadopulos [1965] method can provide good estimates of the mean vertical Darcy flux over the length of the temperature profile. Reliable flux estimates were obtained when the ratio of vertical to horizontal flux was as low as 0.1, and in heterogeneous media, providing that temperature at the upper boundary was constant in time. However, temporal increases in surface temperature led to over-estimation of fluxes. Over-estimates increased with time since the onset of, and with the rate of surface warming. Overall, the Bredehoeft and Papadopulos [1965] method may be more robust for the conditions with constant temperature distributions than previously thought, but that transient methods that account for surface warming should be used to determine fluxes in shallow aquifers.
... Bredehoeft and Papadopulos [1965] derived a solution to the one-dimensional, steady-state, conductionadvection equation that could be applied to estimate rates of groundwater flow from the curvature of temperature-depth (T-z ) profiles. Other steady-state solutions were subsequently developed to accommodate more complex environments [Lu and Ge, 1996;Mansure and Reiter, 1979] and these are included in the heatfuncs library for the Python programming language [Irvine, 2015]. However, these steady-state approaches do not account for the transient subsurface thermal effects of past climate change or land cover disturbances [Kury-lyk et al., 2015]. ...
Article
Full-text available
This study details the derivation and application of a new analytical solution to the one-dimensional, transient conduction-advection equation that is applied to trace vertical subsurface fluid fluxes. The solution employs a flexible initial condition that allows for non-linear temperature-depth profiles, providing a key improvement over most previous solutions. The boundary condition is comprised of any number of superimposed step changes in surface temperature, and thus it accommodates intermittent warming and cooling periods due to long term changes in climate or land cover. The solution is verified using an established numerical model of coupled groundwater flow and heat transport. A new computer program FAST (Flexible Analytical Solution using Temperature) is also presented to facilitate the inversion of this analytical solution to estimate vertical groundwater flow. The program requires surface temperature history (which can be estimated from historic climate data), subsurface thermal properties, a present-day temperature-depth profile, and reasonable initial conditions. FAST is written in the Python computing language and can be run using a free graphical user interface. Herein, we demonstrate the utility of the analytical solution and FAST using measured subsurface temperature and climate data from the Sendia Plain, Japan. Results from these illustrative examples highlight the influence of the chosen initial and boundary conditions on estimated vertical flow rates.
Article
Obtaining reliable estimates of vertical groundwater flows remains a challenge but is of critical importance to the management of groundwater resources. When large scale land clearing or groundwater extraction occurs, methods based on water table fluctuations or water chemistry are unreliable. As an alternative, a number of methods based on temperature-depth (T-z) profiles are available to provide vertical groundwater flow estimates from which recharge rates may be calculated. However, methods that invoke steady state assumptions have been shown to be inappropriate for sites that have experienced land surface warming. Analytical solutions that account for surface warming are available, but they typically include unrealistic or restrictive assumptions (e.g. no flow initial conditions or linear surface warming). Here, we use a new analytical solution and associated computer program (FAST) that provides flexible initial and boundary conditions to estimate fluxes using T-z profiles from the Willunga Super Science Site, a complex, but densely instrumented groundwater catchment in South Australia. T-z profiles from seven wells (ranging from high elevation to near sea level) were utilised, in addition to mean annual air temperatures at nearby weather stations to estimate boundary conditions, and thermal properties were estimated from down borehole geophysics. Temperature based flux estimates were 5 to 23mmy(-1), which are similar to those estimated using chloride mass balance. This study illustrates that T-z profiles can be studied to estimate recharge in environments where more commonly applied methods fail.
Article
Full-text available
By including the constant flow of heat and fluid in the horizontal direction, we develop an analytical solution for the vertical temperature distribution within the semiconfining layer of a typical aquifer system. The solution is an extension of the previous one-dimensional theory by Bredehoeft and Papadopulos [1965]. It provides a quantitative tool for analyzing the uncertainty of the horizontal heat and fluid flow. The analytical results demonstrate that horizontal flow of heat and fluid, if at values much smaller than those of the vertical, has a negligible effect on the vertical temperature distribution but becomes significant when it is comparable to the vertical.
Article
A series of type curves is presented for estimating vertical groundwater fluxes in relatively shallow aquifers by using seasonal changes in groundwater temperature-depth profiles. Vertical groundwater fluxes are estimated by fitting a dimensionless parameter to the type curves when the amplitude of annual variations of groundwater temperature at several depths and the thermal diffusivity of the aquifer are known or measured. Both upward and downward groundwater fluxes are estimated by fitting temperatures observed in Nagaoka plain, Japan to the type curves agree well with the fluxes calculated from hydraulic conductivity and hydraulic gradient data. Measurements of seasonal changes in groundwater temperature and hydraulic gradients were analyzed to estimate the thermal diffusivity of the aquifer in situ that is close to the value reported in the literature.
Article
In the presence of forced convection, there exists an energy flux crhoVT, because of mass-transported heat energy. By plotting temperature gradient versus temperature the significance of convective heat transfer can be determined. Such a plot is useful even when the flow system is not one-dimensional or vertical. As an example of convective heat transfer, a temperature log from the Rio Puerco area of New Mexico shows that downward groundwater movement of 4.7×10-7 cm/s over a 77-m interval can reduce the observed geothermal gradient and heat flow by a factor of 2 from 4.1 to 2.0 HFU (1 HFU=1 mucal cm-2 s-1). Such strong perturbations of heat flow by groundwater indicate the need for deep heat flow measurements to obtain a geothermal heat flux undisturbed by near-surface groundwater. By considering the convective flux one can use the total energy balance at the bounderies of aquifers and a semiconfining medium to obtain information about groundwater seepage within the semiconfining layer.
Article
An analytical solution is developed describing vertical steady flow of groundwater and heat through an isotropic, homogeneous, and fully saturated semiconfining layer. A type-curve method for estimating groundwater velocities from temperature data is presented.
A vertical groundwater movement correction for heat flow
  • A J Mansure
  • M Reither
Mansure, A.J., and Reither, M. (1979) A vertical groundwater movement correction for heat flow, Journal of Geophysical Research, 84(B7), p 3490-3496.