Chapter 5 - Material properties¶
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import csv
The dihedral angle¶
An equation for dihedral angle Θ is
Theta = 30.0 # the dihedral angle
Interfaces oriented according to angles Θk and interfacial tensions σk, as shown in Figure 5.2a.
We can represent the upper liquid–solid interface y(x) as a circular arc-segment with its centre at (0,y0) and a radius r1,
where the sign (±) is determined by whether the liquid–solid interfaces are concave (Θ<60∘) or convex (Θ>60∘).
Values for r1 and y0 are obtained by matching the boundary conditions at the pore corners where the interfaces meet at the dihedral angle,
xΛ is the positive x-position at which the liquid–solid boundary terminates at the solid–solid boundary. Assuming a dihedral angle Θ≠60∘ and using equations (3) and (5) we find that
Then, by geometry, y0=yΛ+sgn(y′Λ)√r21−x2Λ. These values and equation (2) are used to plot the upper interface in Figure 5.2b. The other two interfaces are obtained by rotating the upper interface by ±120∘ about the origin.
fig, ax = plt.subplots(1, 2)
fig.set_size_inches(12.0, 6.0)
# Figure 5.2 a
theta_3_rad = Theta * np.pi / 180. / 2.0
thre5_rad = (5. + Theta) * np.pi / 180. / 2.0
thre10_rad = (12. + Theta) * np.pi / 180. / 2.0
factor = lambda t: 0.05 + (0.0 if t > 80. else 0.5*(80. - t)/80.)
ct = np.cos(theta_3_rad)
st = np.sin(theta_3_rad)
x = [-1.0, 0.0, ct, 0.0, ct]
y = [0.0, 0.0, st, 0.0, -st]
ax[0].plot(x, y, '-k', linewidth=2)
ax[0].plot(x, y, 'bo')
ax[0].set_xlim(-1.01, 1.01)
ax[0].set_ylim(-1.01, 1.01)
ax[0].annotate(r'$\Theta_1$', xy=[-0.01, 0.08], fontsize=20)
ax[0].annotate(r'$\Theta_2$', xy=[-0.01, -0.1], fontsize=20)
ax[0].annotate(r'$\Theta_3$', xy=[factor(Theta), -0.02], fontsize=20)
ax[0].text(
np.cos(thre10_rad), -np.sin(thre10_rad), r'$\sigma_1$',
horizontalalignment='center', verticalalignment='center',
fontsize=20
)
ax[0].text(
np.cos(thre5_rad), -np.sin(thre5_rad), r'$\Longrightarrow$',
fontsize=20, rotation=-0.5*Theta,
horizontalalignment='center', verticalalignment='center'
)
ax[0].text(
np.cos(thre10_rad), np.sin(thre10_rad), r'$\sigma_2$', fontsize=20,
horizontalalignment='center', verticalalignment='center'
)
ax[0].text(
np.cos(thre5_rad), np.sin(thre5_rad), r'$\Longrightarrow$',
fontsize=20, rotation=0.5*Theta,
horizontalalignment='center', verticalalignment='center'
)
ax[0].text(
0.0, -1.0, '(a)', fontsize=18,
verticalalignment='bottom', horizontalalignment='left'
)
ax[0].annotate(r'$\sigma_3$', xy=(-1.0, 0.1), fontsize=20, rotation=0.0)
ax[0].annotate(r'$\Longleftarrow$', xy=(-1.0, 0.01), fontsize=20, rotation=0.0)
ax[0].set_axis_off()
# Figure 5.2 b
theta_rad = Theta * np.pi / 180.
beta = 120.*np.pi/180./2.
ysh = 0.2
xI = 0.3
x = np.linspace(0.0, xI, 100)
y = 0.5 * xI * (
(x**2/xI**2 - 1.)*np.tan(np.pi/6. - 0.5*theta_rad)
+ 2.0*np.tan(np.pi/6.)
)
X = np.zeros(x.shape[0] * 2 * 2).reshape(2, 2*x.shape[0])
X[0, :] = np.concatenate((-x[::-1], x), axis=0)
X[1, :] = np.concatenate((y[::-1], y), axis=0)
R = np.array(
(
(np.cos(beta*2.), -np.sin(beta*2)),
(np.sin(beta*2), np.cos(beta*2))
)
)
RX = np.fliplr(np.dot(R, X))
RRX = np.fliplr(np.dot(np.linalg.inv(R), X))
x = np.concatenate(
(np.fliplr(RX)[0, :], X[0,:], np.fliplr(RRX)[0, :]),
axis=0
)
y = np.concatenate(
(np.fliplr(RX)[1, :], X[1,:], np.fliplr(RRX)[1, :]),
axis=0
)
ax[1].plot(x, y+ysh, '--k', linewidth=2)
cT = np.cos(beta)
sT = np.sin(beta)
ss = np.array(((0.0, 0.0), (-1.0, np.amin(y))))
ax[1].plot(ss[0, :], ss[1, :]+ysh, '-k', linewidth=2)
ss = np.dot(np.linalg.inv(R), ss)
ax[1].plot(ss[0, :], ss[1, :]+ysh, '-k', linewidth=2)
ss = np.dot(np.linalg.inv(R), ss)
ax[1].plot(ss[0, :], ss[1, :]+ysh, '-k', linewidth=2)
ax[1].plot([0, 0.5], [ysh, ysh], '-b', linewidth=0.5)
ax[1].plot([0, 0], [ysh, 0.5+ysh], '-b', linewidth=0.5)
ax[1].annotate(
r'$x$', xy=(0.65, ysh), fontsize=20,
verticalalignment='top', horizontalalignment='left'
)
ax[1].annotate(
r'$y$', xy=(0.0, 0.65+ysh), fontsize=20,
verticalalignment='bottom', horizontalalignment='left'
)
f = 0.25
vx = [-f*np.sin(theta_rad/2), 0.0, f*np.sin(theta_rad/2)]
vy = [
f*np.cos(theta_rad/2) + np.amin(y) +ysh, np.amin(y) + ysh,
f*np.cos(theta_rad/2) + np.amin(y) + ysh
]
ax[1].plot(vx, vy, '-r', linewidth=0.6)
ax[1].annotate(
r'$\Theta$', xy=[0.001, np.amin(y)+ysh+0.09], fontsize=20,
verticalalignment='bottom', horizontalalignment='center'
)
ax[1].annotate(
r'$\ell s$', xy=(-0.2, ysh), fontsize=20, rotation=-55.,
verticalalignment='center', horizontalalignment='right'
)
ax[1].annotate(
r'$ss$', xy=(0.5, 0.33+ysh), fontsize=20, rotation=30.,
verticalalignment='center', horizontalalignment='right'
)
ax[1].annotate(
r'$ss$', xy=(-0.5, 0.33+ysh), fontsize=20, rotation=-30.,
verticalalignment='center', horizontalalignment='left'
)
ax[1].annotate(
r'$ss$', xy=(-0.01, -0.5+ysh), fontsize=20, rotation=90.,
verticalalignment='bottom', horizontalalignment='right'
)
ax[1].text(
0.0, -1.0, '(b)', fontsize=18,
verticalalignment='bottom', horizontalalignment='left'
)
ax[1].set_xlim(-1.01, 1.01)
ax[1].set_ylim(-1.01, 1.01)
ax[1].set_axis_off()
fig.supxlabel("Figure 5.2", fontsize=20)
plt.show()

Permeability¶
A simple model which represents the permeability at some reference value of porosity ϕ0 is
Equation (7) is plotted in Figure 5.3 below for two values of n. Also shown are permeabilities computed on the basis of simulation of ow through pores of a measured pore geometry.
phi = np.logspace(-3.0, 0.0, 1000, endpoint=False)
phid = 0.25
phi0 = 0.01
K0 = 1e-12
f = phi/phi0
K2 = K0 * (f ** 2.7)
K3 = K0 * (f ** 3.0)
Kkc = K0 * (f ** 3.0) / ((1. - phi)/(1. - phi0)) ** 2
# data and data fit
grainsize = 35e-6
C = 58
permexp = 2.7
dmphi = np.asarray([0.01, 0.3])
dmk = grainsize ** 2 / C * (dmphi ** 2.7)
with open('Data_Permeability_Miller2015.csv', mode='r') as csv_file:
data = csv.reader(csv_file)
lst = [row for row in data]
data = np.asarray([[float(l) for l in l_] for l_ in lst[1:]])
fig, ax = plt.subplots()
fig.set_size_inches(9.0, 9.0)
ax.loglog(
phi, K2, '-k', label=r'$k_0(\phi/\phi_0)^{2.7}$', linewidth=2
)
ax.loglog(
phi, K3, '--k', label=r'$k_0(\phi/\phi_0)^3$', linewidth=2
)
ax.loglog(
phi, Kkc, '-.k', linewidth=2,
label=r'$k_0(\phi/\phi_0)^3[(1-\phi)/(1-\phi_0)]^{-2}$'
)
# data and data fit
ax.loglog(
dmphi, dmk, '-', color=[0.5, 0.5, 0.5],
linewidth=2, label=r'$d^2\phi^{2.7}/C$'
)
ax.loglog(data[:, 0], data[:, -1], 'ok', label=r'Miller et al. 2015')
for d in data:
ax.plot([d[0]+d[1], d[0]+d[2]], [d[3], d[3]], '-k', linewidth=1)
ax.plot([phid, phid], [1e-16, 1.0], ':k', label=r'$\phi_\Xi$')
ax.set_xlim(1e-3, 1.0)
ax.set_ylim(1e-16, 1.0)
ax.tick_params(axis='both', which='major', labelsize=13)
ax.set_xlabel(r'$\phi$', fontsize=20)
ax.set_ylabel(r'$k_\phi$, $m^2$', fontsize=20)
ax.legend(loc='upper left', fontsize=15)
fig.supxlabel("Figure 5.3", fontsize=20)
plt.show()
