def test_constant(self): assert_allclose(mu_constant(np.array([5,10,20,50,100]), np.array([1.5, 2, 1, 4, 8]), np.array([1.6, 1, 5, 0.4, 4])), [1.159679143, 1.578343528, 2.253865374, 2.335174298, 10.07573309])
def test_ideal(self): assert_allclose(mu_constant(np.array([5,10,20,50,100]), np.array([1,1,1,1,1]), np.array([5,10,20,50,100])), [0.936497825, 1.578343528, 2.253865374, 3.163688441, 3.855655749])
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
# 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]))
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
def dengetal2013(z, t, rw, re, A1=1, A2=0, A3=0, H=1, rs=None, ks=None, kw0=1e10, kh=1, mv=0.1, gamw=10, ui=1): """Radial consolidation with depth and time dependent well resistance Implementation of [1]_. Features: - Radial flow to drain (no vertical flow in soil) - Vertical flow in drain. - Linear depth variation of drain permeability in time. - Exponential decrease in drain peremability with time. - Uses approximate (like Hansbo) method to solve pore pressure in drain. - Radially averaged pore pressure at depth and time in soil. Drain pereability is kw = kw0 * (A1 - A2 * z / H) * exp(-A3 * t) Parameters ---------- z : float or 1d array/list of float Depth. t : float or 1d array/list of float Time. rw : float Drain radius. re : float Drain influence radius. A1 : float, optional Parameter controlling depth dependance of well resistance. Default A1=1. A2 : float, optional Parameter controlling depth dependance of well resistance. Default A2=0. A3 : float, optional Parameter controlling time dependance of well resistance. Default A3=0. 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. kw0 : float, optional Initial well permeability. Default kw0=1e10 i.e. ideal drain. kh : float, optional Horizontal coefficient of permeability. Default kh=1. mv : float, optional Volume compressibility. Default mv=0.1. gamw : float, optional Unit weight of water. Default gamw=10. ui : float, optional Initial uniform pore water pressure. Default ui=1. Returns ------- por : 2d array of float Pore pressure at depth and time. `por` is an array of size (len(z), len(t)). References ---------- .. [1] Deng, Yue-Bao, Kang-He Xie, and Meng-Meng Lu. 2013. 'Consolidation by Vertical Drains When the Discharge Capacity Varies with Depth and Time'. Computers and Geotechnics 48 (March): 1-8. doi:10.1016/j.compgeo.2012.09.012. """ if A1 < 0: raise ValueError("A1 must be greater than 0. " "You have A1={}".format(A1)) if A2 > A1: raise ValueError("A2 must be less than A1. " "You have A1={}, A2={}".format(A1, A2)) if A3 < 0: raise ValueError("A3 must be greater than or equal to 0. " "You have A3={}".format(A3)) t = np.atleast_1d(t) z = np.atleast_1d(z) ch = kh / mv / gamw n = re / rw qw0 = kw0 * np.pi * rw**2 Th = ch * t / 4 / re**2 if ks is None or rs is None: mu0 = smear_zones.mu_ideal(n) else: s = rs / rw kap = kh / ks mu0 = smear_zones.mu_constant(n, s, kap) if A3 == 0 and A2 == 0: # qw is constant mus = mu0 + np.pi * kh / (qw0 * A1) * (2 * H * z - z ** 2) por = ui * np.exp(-8 * Th[None, :] / mus[:, None]) return por if A3 == 0 and A2 > 0: # qw varies with depth mu1 = A2 * z / H + (A1 - A2)*np.log(1 - A2 / A1 * z / H) mu1 *= 2 * np.pi * kh * H**2 / (qw0 * A2**2) mu1 += mu0 por = ui * np.exp(-8 * Th[None, :] / mu1[:, None]) return por if A3 > 0 and A2 == 0: # qw varies with time a3 = A3 * 4 * re**2 / ch alp0 = qw0 * A1 * mu0 / (np.pi * kh * (2*H*z - z**2)) por = (ui * ((1+alp0[:, None] * np.exp(-a3 * Th[None, :])) / (1+alp0[:, None])) ** (8/(a3 * mu0))) return por if A3 > 0 and A2 > 0: # qw varies with depth and time: a3 = A3 * 4 * re**2 / ch alp = mu0 * qw0 * A2**2 / (2 * np.pi * H**2 * kh) alp /= A2* z / H + (A1 - A2) * np.log(1 - A2 / A1 * z / H) por = (ui * ((1+alp[:, None] * np.exp(-a3 * Th[None, :])) / (1+alp[:, None])) ** (8/(a3 * mu0))) return por
# 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)
def dengetal2014(z, t, rw, re, A3=0, H=1, rs=None, ks=None, kw0=1e10, kh=1, mv=0.1, gamw=10, ui=1, nterms=100): """Radial consolidation with time dependent well resistance An implementation of [1]_ Features: - Single layer, soil properties constant over time. - Instant load uniform with depth. - Radial flow to drain (no vertical flow in soil) - Vertical flow in drain. - Exponential decrease in drain peremability with time. - Uses rigorous (infintite sum ) method to solve pore pressure in drain. - Radially averaged pore pressure at depth and time in soil. Drain permeability is kw = kw0 * exp(-A3 * t) Parameters ---------- z : float or 1d array/list of float Depth. t : float or 1d array/list of float Time. rw : float Drain radius. re : float Drain influence radius. A3 : float, optional Parameter controlling time dependance of well resistance. Default A3=0. 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. kw0 : float, optional Initial well permeability. Default kw0=1e10 i.e. ideal drain. kh : float, optional Horizontal coefficient of permeability. Default kh=1. mv : float, optional Volume compressibility. Default mv=0.1. gamw : float, optional Unit weight of water. Default gamw=10. ui : float, optional Initial uniform pore water pressure. Default ui=1. nterms : int, optional number of summation terms, default = 100. Returns ------- por : 2d array of float Pore pressure at depth and time. `por` is an array of size (len(z), len(t)). References ---------- .. [1] Deng, Yue-Bao, Gan-Bin Liu, Meng-Meng Lu, and Kang-he Xie. 'Consolidation Behavior of Soft Deposits Considering the Variation of Prefabricated Vertical Drain Discharge Capacity'. Computers and Geotechnics 62 (October 2014): 310-16. doi:10.1016/j.compgeo.2014.08.006. """ if A3 < 0: raise ValueError("A3 must be greater than or equal to 0. " "You have A3={}".format(A3)) t = np.atleast_1d(t) z = np.atleast_1d(z) ch = kh / mv / gamw n = re / rw qw0 = kw0 * np.pi * rw**2 Th = ch * t / 4 / re**2 if ks is None or rs is None: mu0 = smear_zones.mu_ideal(n) else: s = rs / rw kap = kh / ks mu0 = smear_zones.mu_constant(n, s, kap) a3 = A3 * 4 * re**2 / ch G0 = np.pi * kh * H**2 / 4 / qw0 M = ((2 * np.arange(nterms) + 1) / 2 * np.pi) C0 = M**2*mu0/8/G0 * n**2/ (n**2-1) alp0 = qw0 * mu0 / (np.pi * kh * (2*H*z - z**2)) Th = Th[np.newaxis, :, np.newaxis] M = M[np.newaxis, np.newaxis, :] C0 = C0[np.newaxis, np.newaxis, :] Z = (z / H)[:, np.newaxis, np.newaxis] por = (2 / M * np.sin(M * Z) * ((1+C0 * np.exp(-a3 * Th))/ (1 + C0))**(8 / (a3 * mu0))) por = ui * np.sum(por, axis=2) return por
z = np.linspace(0, 20, 100) Th = np.array([0.1, 1.0]) rw=0.035 rs = 0.175 re=0.525 gamw = 10 mv=0.2e-3 kh=2e-8 ks = kh/1.8 kw0 = 1e-3 ch = kh / mv / gamw t = Th * 4 * re**2 / ch mu0 = smear_zones.mu_constant(re/rw, rs/rw, kh/ks) print('mu0', mu0) print('et', 2/mu0/re**2) for A2 in [0.1,1.0]: por = dengetal2013(z, t, rw=rw, re=re, A1=1, A2=A2, A3=0, H=20, rs=rs, ks=ks, kw0=kw0, kh=kh, mv=mv, gamw=10, ui=1) for j, t_ in enumerate(t): uz0 = np.exp(-8*Th[j]/mu0) plt.plot(por[:,j], z, label="m Th={0:.3g}, A2={1:.3g}".format(Th[j], A2)) plt.plot(uz0,0, marker='o', ms=14) for key, val in res.items(): x = val[:,0] y = val[:,1]*20 plt.plot(x,y, label=key, marker='s', linestyle='None')
def dengetal2013(z, t, rw, re, A1=1, A2=0, A3=0, H=1, rs=None, ks=None, kw0=1e10, kh=1, mv=0.1, gamw=10, ui=1): """Radial consolidation with depth and time dependent well resistance Implementation of [1]_. Features: - Radial flow to drain (no vertical flow in soil) - Vertical flow in drain. - Linear depth variation of drain permeability in time. - Exponential decrease in drain peremability with time. - Uses approximate (like Hansbo) method to solve pore pressure in drain. - Radially averaged pore pressure at depth and time in soil. Drain pereability is kw = kw0 * (A1 - A2 * z / H) * exp(-A3 * t) Parameters ---------- z : float or 1d array/list of float Depth. t : float or 1d array/list of float Time. rw : float Drain radius. re : float Drain influence radius. A1 : float, optional Parameter controlling depth dependance of well resistance. Default A1=1. A2 : float, optional Parameter controlling depth dependance of well resistance. Default A2=0. A3 : float, optional Parameter controlling time dependance of well resistance. Default A3=0. 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. kw0 : float, optional Initial well permeability. Default kw0=1e10 i.e. ideal drain. kh : float, optional Horizontal coefficient of permeability. Default kh=1. mv : float, optional Volume compressibility. Default mv=0.1. gamw : float, optional Unit weight of water. Default gamw=10. ui : float, optional Initial uniform pore water pressure. Default ui=1. Returns ------- por : 2d array of float Pore pressure at depth and time. `por` is an array of size (len(z), len(t)). References ---------- .. [1] Deng, Yue-Bao, Kang-He Xie, and Meng-Meng Lu. 2013. 'Consolidation by Vertical Drains When the Discharge Capacity Varies with Depth and Time'. Computers and Geotechnics 48 (March): 1-8. doi:10.1016/j.compgeo.2012.09.012. """ if A1 < 0: raise ValueError("A1 must be greater than 0. " "You have A1={}".format(A1)) if A2 > A1: raise ValueError("A2 must be less than A1. " "You have A1={}, A2={}".format(A1, A2)) if A3 < 0: raise ValueError("A3 must be greater than or equal to 0. " "You have A3={}".format(A3)) t = np.atleast_1d(t) z = np.atleast_1d(z) ch = kh / mv / gamw n = re / rw qw0 = kw0 * np.pi * rw**2 Th = ch * t / 4 / re**2 if ks is None or rs is None: mu0 = smear_zones.mu_ideal(n) else: s = rs / rw kap = kh / ks mu0 = smear_zones.mu_constant(n, s, kap) if A3 == 0 and A2 == 0: # qw is constant mus = mu0 + np.pi * kh / (qw0 * A1) * (2 * H * z - z**2) por = ui * np.exp(-8 * Th[None, :] / mus[:, None]) return por if A3 == 0 and A2 > 0: # qw varies with depth mu1 = A2 * z / H + (A1 - A2) * np.log(1 - A2 / A1 * z / H) mu1 *= 2 * np.pi * kh * H**2 / (qw0 * A2**2) mu1 += mu0 por = ui * np.exp(-8 * Th[None, :] / mu1[:, None]) return por if A3 > 0 and A2 == 0: # qw varies with time a3 = A3 * 4 * re**2 / ch alp0 = qw0 * A1 * mu0 / (np.pi * kh * (2 * H * z - z**2)) por = (ui * ((1 + alp0[:, None] * np.exp(-a3 * Th[None, :])) / (1 + alp0[:, None]))**(8 / (a3 * mu0))) return por if A3 > 0 and A2 > 0: # qw varies with depth and time: a3 = A3 * 4 * re**2 / ch alp = mu0 * qw0 * A2**2 / (2 * np.pi * H**2 * kh) alp /= A2 * z / H + (A1 - A2) * np.log(1 - A2 / A1 * z / H) por = (ui * ((1 + alp[:, None] * np.exp(-a3 * Th[None, :])) / (1 + alp[:, None]))**(8 / (a3 * mu0))) return por
def dengetal2014(z, t, rw, re, A3=0, H=1, rs=None, ks=None, kw0=1e10, kh=1, mv=0.1, gamw=10, ui=1, nterms=100): """Radial consolidation with time dependent well resistance An implementation of [1]_ Features: - Single layer, soil properties constant over time. - Instant load uniform with depth. - Radial flow to drain (no vertical flow in soil) - Vertical flow in drain. - Exponential decrease in drain peremability with time. - Uses rigorous (infintite sum ) method to solve pore pressure in drain. - Radially averaged pore pressure at depth and time in soil. Drain permeability is kw = kw0 * exp(-A3 * t) Parameters ---------- z : float or 1d array/list of float Depth. t : float or 1d array/list of float Time. rw : float Drain radius. re : float Drain influence radius. A3 : float, optional Parameter controlling time dependance of well resistance. Default A3=0. 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. kw0 : float, optional Initial well permeability. Default kw0=1e10 i.e. ideal drain. kh : float, optional Horizontal coefficient of permeability. Default kh=1. mv : float, optional Volume compressibility. Default mv=0.1. gamw : float, optional Unit weight of water. Default gamw=10. ui : float, optional Initial uniform pore water pressure. Default ui=1. nterms : int, optional number of summation terms, default = 100. Returns ------- por : 2d array of float Pore pressure at depth and time. `por` is an array of size (len(z), len(t)). References ---------- .. [1] Deng, Yue-Bao, Gan-Bin Liu, Meng-Meng Lu, and Kang-he Xie. 'Consolidation Behavior of Soft Deposits Considering the Variation of Prefabricated Vertical Drain Discharge Capacity'. Computers and Geotechnics 62 (October 2014): 310-16. doi:10.1016/j.compgeo.2014.08.006. """ if A3 < 0: raise ValueError("A3 must be greater than or equal to 0. " "You have A3={}".format(A3)) t = np.atleast_1d(t) z = np.atleast_1d(z) ch = kh / mv / gamw n = re / rw qw0 = kw0 * np.pi * rw**2 Th = ch * t / 4 / re**2 if ks is None or rs is None: mu0 = smear_zones.mu_ideal(n) else: s = rs / rw kap = kh / ks mu0 = smear_zones.mu_constant(n, s, kap) a3 = A3 * 4 * re**2 / ch G0 = np.pi * kh * H**2 / 4 / qw0 M = ((2 * np.arange(nterms) + 1) / 2 * np.pi) C0 = M**2 * mu0 / 8 / G0 * n**2 / (n**2 - 1) alp0 = qw0 * mu0 / (np.pi * kh * (2 * H * z - z**2)) Th = Th[np.newaxis, :, np.newaxis] M = M[np.newaxis, np.newaxis, :] C0 = C0[np.newaxis, np.newaxis, :] Z = (z / H)[:, np.newaxis, np.newaxis] por = (2 / M * np.sin(M * Z) * ((1 + C0 * np.exp(-a3 * Th)) / (1 + C0))**(8 / (a3 * mu0))) por = ui * np.sum(por, axis=2) return por
z = np.linspace(0, 20, 100) Th = np.array([0.1, 1.0]) rw = 0.035 rs = 0.175 re = 0.525 gamw = 10 mv = 0.2e-3 kh = 2e-8 ks = kh / 1.8 kw0 = 1e-3 ch = kh / mv / gamw t = Th * 4 * re**2 / ch mu0 = smear_zones.mu_constant(re / rw, rs / rw, kh / ks) print('mu0', mu0) print('et', 2 / mu0 / re**2) for A2 in [0.1, 1.0]: por = dengetal2013(z, t, rw=rw, re=re, A1=1, A2=A2, A3=0, H=20, rs=rs, ks=ks, kw0=kw0, kh=kh,