If parameters need to be averaged over a certain interval, equations for the according mean are usually used. The most prominent one is the arithmetic mean. In this notebook, the different averaging methods will be presented and when they will be used (i.e. if the parameter to be averaged is a tensor.)
The different averaging methods presented are:
We will also talk about when to use which averaging method and why.
Imagine a glass body, where one fifth of the body is cloudy. This part of the glass body will have a different influence on the transparency of the whole body, depending on the point of view (arrows in the picture). If we look from below, 20 % of the view are obstructed by the cloudy part of the body.
But what when you look from right? Then, the cloudy part will have a significantly bigger influence on the average light density coming through the body in your eye.
For further calculations, think of the white and gray to represent strongly different thermal conductivities.
The white part has a thermal conductivty of $\lambda_w$ = 4.2 W m$^{-1}$K$^{-1}$, while the gray part has a thermal conductivtiy of $\lambda_g$ = 0.7 W m$^{-1}$K$^{-1}$ (which could be coal for example). In the following, we will increase the portion of the gray body from 0 % to 100 % and have a look at the different means and how they react.
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
sns.set_style('ticks')
sns.set_context('notebook')
# lambda of white part
lw = 4.2
# lambda of gray part
lg = 0.7
# percentage of gray part
phi = np.linspace (0,1,1000)
arithm = (phi*lg + (1-phi)*lw)
harmm = (phi/lg + (1-phi)/lw)**(-1)
geom = lg**phi * lw**(1-phi)
sqrm = (phi*np.sqrt(lg) + (1-phi)*np.sqrt(lw))**2
plt.plot(phi,arithm,'-.',phi,harmm,'-.', phi,geom,'--', phi,sqrm,'--')
plt.xlabel('amount of gray part [-]')
plt.ylabel('av thermal conductivity [W/(mK)]')
plt.legend(['arithmetic', 'harmonic', 'geometric', 'square-root'])
<matplotlib.legend.Legend at 0x7f326b2cb710>
The graph shows that the harmonic mean (green line) strongly reacts to already small proportions of gray, i.e. low thermal conductivity. Looking at the sketch above, this corresponds to a transport perpendicular to the layering, that is from right to left. The arithmetic mean shows a linear decrease in average thermal conductivity with increasing amount of gray part.
We can also call this amount of gray part porosity. Just think of the sketch above as a volume specific representation of porosity. Normally, the pores would be distributed over the whole body, but to visualize that e.g. 20 % of the body are porosity, one could representatively draw it like in the sketch.
If we can substitute amount of gray part with porosity, we can assume that this porosity might be filled with a certain medium, which differs in its properties from the rock matrix. That's the reason, why we have to apply these means in order to assess a representative average property for a porous rock. Now let's further assume that the rock matrix consists just of one rock type. This makes our system a 2 phase system (1: rock matrix, 2: pore filling fluid). Within such a system, we can define the single phases as continuous phase and discontinuous phase. Imagine we have a volume of sand saturated with water. You may agree that in this mixture, the continuous phase is the water, and the discontinuous phase is the sand. Vice versa, we have a porous limestone where its porosity mainly comprises isolated vugs. Here, the continuous phase is the limestone matrix, and the discontinuous phase is the vuggy porosity.
There exist further mixing laws, which build on this concept, namely the upper and lower Hashin-Shtrikman means (HS$^+$ and HS$^-$).
$$ HS^+ = l_c + \frac{\phi}{\frac{1}{l_{dc}-l_c}+ \frac{1-\phi}{3 l_c}}$$$$ HS^- = l_{dc} + \frac{1-\phi}{\frac{1}{l_{c}-l_{dc}}+ \frac{\phi}{3 l_{dc}}}$$# upper Hashin-Shtrikman
hsu = lw + (phi/((1/(lg-lw))+(1-phi)/(3*lw)))
# lower Hashin-Shtrikman
hsl = lg + ((1-phi)/((1/(lw-lg))+phi/(3*lg)))
# mean Hashin-Shtrikman
hsm = 0.5 * (hsu + hsl)
plt.plot(phi,arithm,'-.',phi,harmm,'-.', phi,geom,'--', phi,sqrm,'--',
phi, hsu,'-', phi, hsl, '-', phi, hsm, '-')
plt.xlabel('amount of gray part [-]')
plt.ylabel('av thermal conductivity [W/(mK)]')
plt.legend(['arithmetic', 'harmonic', 'geometric', 'square-root',
'upper HS', 'lower HS', 'middle HS'])
<matplotlib.legend.Legend at 0x7f326993d1d0>
When comparing the HS-laws to other mixing laws, we see that the upper HS approximately equals the square-root mean, whereas the lower HS law approximately corresponds to the geometric mean.
Consider measurements of thermal conductivities of clean sandstone (Brigaud et al., 1992) and marine clay (Ratcliffe, 1960) for samples of different porosities.
Consider measurements of thermal conductivities of clean sandstone (Brigaud et al., 1992) and marine clay (Ratcliffe, 1960) for samples of different porosities.
# poro, thermal conductivity
sandstone = np.array([[0.01,7.12],
[0.08,6.72],
[0.08,6.37],
[0.12,6.20],
[0.15,5.28],
[0.13,4.82],
[0.20,4.47],
[0.17,4.26],
[0.32,3.57],
[0.30,3.34],
[0.33,3.40],
[0.35,3.18],
[0.44,2.53]])
# poro, thermal conductivity
marine_clay = np.array([[0.43, 1.36],
[0.58, 1.14],
[0.60, 1.09],
[0.63, 1.07],
[0.65, 0.99],
[0.67, 0.96],
[0.68, 0.93],
[0.71, 0.91],
[0.72, 0.85]])
We start by visualizing the measured thermal conductivities as a function of porosity and use different colors for the different rock types.
fig, ax = plt.subplots()
ax.plot(sandstone[:,0], sandstone[:,1], "ko", label="Sandstone", zorder=3)
ax.plot(marine_clay[:,0], marine_clay[:,1], "bo", label="Marine clay", zorder=3)
ax.set_xlabel("Porosity $\phi$")
ax.set_ylabel("Thermal conductivity $\lambda$ (W m$^{-1}$K$^{-1}$)")
ax.legend()
<matplotlib.legend.Legend at 0x7f32698c3128>
We visualize the artihmetic mean and harmonic mean as a function of porosity using a thermal conductivity of the rock matrix of 7.5 W / (mK) and 0.6 W / (mK) for the fluid. As we have seen above, harmonic and artihmetic means represent the lower and upper bounds of mixing models.
poro = np.linspace(0,1)
am = (1-poro) * 7.5 + poro * 0.6
hm = ((1-poro) * 1/7.5 + poro * 1/0.6)**-1
ax.plot(poro, am, "k-", label="Arithmetic mean", zorder=2, alpha=0.5)
ax.plot(poro, hm, "k--", label="Harmonic mean", zorder=2, alpha=0.5)
ax.legend()
fig
Lichtenecker and Rother (1931) describe the thermal conductivity of a porous medium by
$$ \lambda=\left[(1-\phi) \cdot\left(\lambda_{\min }^{\alpha}\right)+\phi \cdot\left(\lambda_{\text {fluid }}^{\alpha}\right)\right]^{1 / \alpha} $$where $\phi$ is porosity and $\lambda_\text{min}$ and $\lambda_\text{fluid}$ are the thermal conductivities of the mineral and fluid phase, respectively. $\alpha$ is a textural parameter that can be adjusted to describe the observations. By adjusting alpha, we can find mixing models to describe our observations.
##############################################################
# This part is just for alpha-dependent coloring of the lines
import matplotlib
cmap = matplotlib.cm.get_cmap('RdYlGn_r', 9)
norm = matplotlib.colors.Normalize(vmin=-1, vmax=1)
sm = plt.cm.ScalarMappable(cmap=cmap, norm=norm)
##############################################################
poro = np.linspace(0, 1)
alphas = np.linspace(-1, 1, 8) # Take even number of samples to avoid value at zero
for alpha in alphas:
tc = ((1-poro) * 7.5**alpha + poro * 0.6**alpha)**(1/alpha)
ax.plot(poro, tc, color=cmap(norm(alpha)), zorder=1)
ax.legend()
sm._A = []
cbar = fig.colorbar(sm, label=r"$\alpha$")
cbar.set_ticks([-1, 0, 1])
fig
determined from oil exploration well data. Geophysics 57 (1), 69-88.
1535-1541.