Source code for geotecha.consolidation.luetal2010

# geotecha - A software suite for geotechncial engineering
# Copyright (C) 2018  Rohan T. Walker (rtrwalker@gmail.com)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see http://www.gnu.org/licenses/gpl.html.

"""Lu et al (2010) "Composite foundation considering radial and vertical flows
within the column and the variation of soil permeability within the
disturbed soil zone".

"""
from __future__ import print_function, division

import numpy as np
from matplotlib import pyplot as plt
import geotecha.consolidation.smear_zones as smear_zones

[docs]def luetal2010(z, t, rc, re, H=1, rs=None, ks=None, kv=1.0, kvc=1.0, kh=1.0, khc=1.0, mvs=0.1, mvc=0.1, gamw=10, utop=1, ubot=1, nterms=100): """Composite foundation considering radial and vert flows in the column An implementation of [1]_. Features: - Single layer, soil properties constant over time. - Instant load linear with depth. - Vertical and radial flow in in soil - Vertical and radial flow in drain/column - Different stiffness in column and soil - Pore pressure in soil, column and averaged at depth - Average pore pressure over whole profile vs time - Settlement of whole profile vs time Parameters ---------- z : float or 1d array/list of float Depth. t : float or 1d array/list of float Time. rc : float Drain radius re : float Drain influence radius. H : float, optional Drainage path length. Default H=1. rs : float, optional Drain influence radius. Default rs=None i.e. no smear zone. ks : float, optional Smear zone permeability. Default ks=None, i.e. no smear zone. kv, kvc : float, optional Vertical coefficient of permeability in soil and column. Default kv= kvc = 1 kh, khc : float, optional Horizontal coefficient of permeability in soil and column. default kh = khc = 1 mvs, mvc : float, optional Volume compressibility in soil and column. default mvs=mvc=0.1. gamw : float, optional Unit weight of water. Default gamw=10. utop, ubot : float, optional Initial pore water pressure at top and bottom of soil. Default utop=ubot=1. nterms : int, optional Number of terms to use in solution. Default=100. Returns ------- por, pors, porc : 2d array of float Pore pressure at depth and time overall, in soil, in column. por is an array of size (len(z), len(t)). avp : 2d array of float Average overall pore pressure of whole soil profile. settle : 2d array of float Settlement of whole layer. References ---------- .. [1] Lu, Meng-Meng, Kang-He Xie, and Biao Guo. 2010. 'Consolidation Theory for a Composite Foundation Considering Radial and Vertical Flows within the Column and the Variation of Soil Permeability within the Disturbed Soil Zone'. Canadian Geotechnical Journal 47 (2): 207-17. doi:10.1139/T09-086. """ t = np.atleast_1d(t) z = np.atleast_1d(z) # ch = kh / mv / gamw n = re / rc Y = mvs / mvc # Th = ch * t / 4 / re**2 if ks is None or rs is None: mu0 = smear_zones.mu_ideal(n) else: s = rs / rc kap = kh / ks mu0 = smear_zones.mu_constant(n, s, kap) M = ((2 * np.arange(nterms) + 1) / 2 * np.pi) betm_numer = n**2 * mu0 / 2 * kvc / kh betm_numer += (n**2 - 1) / 8 *kvc / khc betm_numer *= (rc / H) ** 2 * M**2 betm_numer += n**2 - 1 + kvc/kv betm_numer *= kv / mvs * (n**2 - 1 + Y) betm_denom = n**2 * mu0 / 2 * kv / kh betm_denom += (n**2 - 1) / 8 * kv / khc betm_denom *= (n**2 - 1) * kvc / kv + 1 betm_denom += n**4 / M**2 * (H / rc)**2 betm_denom *= gamw * rc**2 betm = betm_numer / betm_denom C = re**2 * mu0 / 2 / kh C += rc**2 * (n**2 - 1)/ 8 / khc C *= gamw * ((n**2 - 1)*kvc + kv) * mvs C /= (n**2 - 1 + Y) * (kvc - kv) D = re**2 * mu0 / 2 / kh D += rc**2 * (n**2 - 1)/ 8 / khc D *= kv * kvc / (kvc - kv) minus1 = np.ones_like(M) minus1[1::2] = -1 por = (2 / M[None, None, :] * (utop - minus1[None, None, :] * (utop - ubot)/ M[None, None, :]) * np.sin(M[None, None, :] * z[:, None, None]/H) * np.exp(-betm[None, None, :] * t[None, :, None])) pors = por * (1 + (C * H**2 * betm[None, None, :] - D * M[None, None, :]**2) / (H**2 * (n**2 - 1))) porc = por * (1 - C * betm[None, None, :] + D * M[None, None, :]**2 / H**2) por = np.sum(por, axis=2) pors = np.sum(pors, axis=2) porc = np.sum(porc, axis=2) avp = (2 / M[None, :]**2 * (utop - minus1[None, :] * (utop-ubot)/ M[None, :]) * np.exp(-betm[None, :] * t[:, None])) avp = np.sum(avp, axis=1) settle = (utop + ubot)/2 - avp settle *= H * mvs * n**2 / (n**2 - 1 + Y) return por, pors, porc, avp, settle
if __name__ == '__main__': rc=0.1 re=0.9 H=10 rs=0.15 ks=0.5 kv=1.0 kvc=2000 kh=1.0 khc=2 mvs=0.1 mvc=0.0005 gamw=10 utop=0.9 ubot=0.2 nterms=100 z = np.array([0, 3.0, 6.0, 9.0, 10.0]) t = np.array([0.1, 0.8, 2.0]) # z= np.linspace(0,H,50) # t = np.logspace(-2,0.5, 30) # rc=0.1 # re=1 # H=10 # rs=0.15 # ks=0.5 # kv=1.0 # kvc=2000 # kh=1.0 # khc=2000 # mvs=0.1 # mvc=mvs/200 # gamw=10 # utop=1 # ubot=1 # nterms=100 # z= np.linspace(0,H,50) # t = np.array([0.1, 0.8, 2.0]) # t = np.logspace(-2,0.5, 30) por, pors, porc, avp, settle = luetal2010( z,t, rc, re, H, rs, ks, kv, kvc, kh, khc, mvs, mvc, gamw, utop, ubot, nterms) if 1: mu = smear_zones.mu_constant(re/rc, rs/rc, kh/ks) print('mu', mu) print('\npor', repr(por)) print('\npors', repr(pors)) print('\nporc', repr(porc)) print('\navp', repr(avp)) print('\nset', repr(settle)) labels = ['Overall pore pressure', 'column pore pressure', 'Soil pore pressure'] for p, lab in zip([por, porc, pors], labels): fig=plt.figure() ax = fig.add_subplot(1,1,1) for j, t_ in enumerate(t): ax.plot(p[:,j], z, marker='o', label="t={0:.3g}".format(t[j])) ax.set_xlabel(lab) ax.set_ylabel('Depth') ax.invert_yaxis() ax.set_xlim(0,1) ax.grid() leg = plt.legend(loc=3 ) leg.draggable() fig=plt.figure() ax = fig.add_subplot(1,1,1) ax.plot(t, avp, marker='o',) ax.set_xlabel('time') ax.set_ylabel('Overall average pore pressure') ax.invert_yaxis() # ax.set_xlim(0,1) ax.grid() fig=plt.figure() ax = fig.add_subplot(1,1,1) ax.plot(t, settle, marker='o',) ax.set_xlabel('time') ax.set_ylabel('settlement') ax.invert_yaxis() # ax.set_xlim(0,1) ax.grid() plt.show()