# 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.
"""Smear zones associated with vertical drain installation.
Smear zone permeability distributions etc.
"""
from __future__ import print_function, division
import numpy as np
from matplotlib import pyplot as plt
#import cmath
from numpy import log, sqrt
import scipy.special as special
[docs]def mu_ideal(n, *args):
"""Smear zone permeability/geometry parameter for ideal drain (no smear)
mu parameter in equal strain radial consolidation equations e.g.
u = u0 * exp(-8*Th/mu)
Parameters
----------
n : float or ndarray of float
Ratio of drain influence radius to drain radius (re/rw).
args : anything
`args` does not contribute to any calculations it is merely so you
can have other arguments such as s and kappa which are used in other
smear zone formulations.
Returns
-------
mu : float
Smear zone permeability/geometry parameter.
Notes
-----
The :math:`\\mu` parameter is given by:
.. math:: \\mu=\\frac{n^2}{\\left({n^2-1}\\right)}
\\left({\\ln\\left({n}\\right)-\\frac{3}{4}}\\right)+
\\frac{1}{\\left({n^2-1}\\right)}\\left({1-\\frac{1}{4n^2}}
\\right)
where:
.. math:: n = \\frac{r_e}{r_w}
:math:`r_w` is the drain radius, :math:`r_e` is the drain influence radius
References
----------
.. [1] Hansbo, S. 1981. "Consolidation of Fine-Grained Soils by
Prefabricated Drains". In 10th ICSMFE, 3:677-82.
Rotterdam-Boston: A.A. Balkema.
"""
n = np.asarray(n)
if np.any(n <= 1):
raise ValueError('n must be greater than 1. You have n = {}'.format(
', '.join([str(v) for v in np.atleast_1d(n)])))
term1 = n**2 / (n**2 - 1) * (log(n) - 0.75)
term2 = 1 / (n**2 - 1) * (1 - 1/(4 * n**2))
mu = term1 + term2
return mu
[docs]def mu_constant(n, s, kap):
"""Smear zone parameter for smear zone with constant permeability
mu parameter in equal strain radial consolidation equations e.g.
u = u0 * exp(-8*Th/mu)
Parameters
----------
n : float or ndarray of float
Ratio of drain influence radius to drain radius (re/rw).
s : float or ndarray of float
Ratio of smear zone radius to drain radius (rs/rw)
kap : float or ndarray of float.
Ratio of undisturbed horizontal permeability to smear zone
horizontal permeanility (kh / ks).
Returns
-------
mu : float
smear zone permeability/geometry parameter
Notes
-----
The :math:`\\mu` parameter is given by:
.. math:: \\mu=\\frac{n^2}{\\left({n^2-1}\\right)}
\\left({\\ln\\left({\\frac{n}{s}}\\right)
+\\kappa\\ln\\left({s}\\right)
-\\frac{3}{4}}\\right)+
\\frac{s^2}{\\left({n^2-1}\\right)}\\left({1-\\frac{s^2}{4n^2}}
\\right)
+\\frac{\\kappa}{\\left({n^2-1}\\right)}\\left({\\frac{s^4-1}{4n^2}}
-s^2+1
\\right)
where:
.. math:: n = \\frac{r_e}{r_w}
.. math:: s = \\frac{r_s}{r_w}
.. math:: \\kappa = \\frac{k_h}{k_s}
:math:`r_w` is the drain radius, :math:`r_e` is the drain influence radius,
:math:`r_s` is the smear zone radius, :math:`k_h` is the undisturbed
horizontal permeability, :math:`k_s` is the smear zone horizontal
permeability.
References
----------
.. [1] Hansbo, S. 1981. 'Consolidation of Fine-Grained Soils by
Prefabricated Drains'. In 10th ICSMFE, 3:677-82.
Rotterdam-Boston: A.A. Balkema.
"""
n = np.asarray(n)
s = np.asarray(s)
kap = np.asarray(kap)
if np.any(n <= 1.0):
raise ValueError('n must be greater than 1. You have n = {}'.format(
', '.join([str(v) for v in np.atleast_1d(n)])))
if np.any(s < 1.0):
raise ValueError('s must be greater than 1. You have s = {}'.format(
', '.join([str(v) for v in np.atleast_1d(s)])))
if np.any(kap <= 0.0):
raise ValueError('kap must be greater than 0. You have kap = '
'{}'.format(', '.join([str(v) for v in
np.atleast_1d(kap)])))
if np.any(s > n):
raise ValueError('s must be less than n. You have s = '
'{} and n = {}'.format(
', '.join([str(v) for v in np.atleast_1d(s)]),
', '.join([str(v) for v in np.atleast_1d(n)])))
term1 = n**2 / (n**2 - 1) * (log(n/s) + kap * log(s) - 0.75)
term2 = s**2 / (n**2 - 1) * (1 - s**2 /(4 * n**2))
term3 = kap / (n**2 - 1) * ((s**4 - 1) / (4 * n**2) - s**2 +1)
mu = term1 + term2 + term3
return mu
def _sx(n, s):
"""Value of s=r/rw marking the start of overlapping linear smear zones
`s` is usually larger than `n` when considering overlapping smear zones
Parameters
----------
n : float or ndarray of float
Ratio of drain influence radius to drain radius (re/rw).
s : float or ndarray of float
Ratio of smear zone radius to drain radius (rs/rw).
Returns
-------
sx : float or ndarray of float
Value of s=r/rw marking the start of the overlapping zone
Notes
-----
.. math:: \\kappa_X= 1+\\frac{\\kappa-1}{s-1}\\left({s_X-1}\\right)
.. math:: s_X = 2n-s
See Also
--------
mu_overlapping_linear : uses _sx
_kapx : used in mu_overlapping_linear
"""
sx = 2 * n - s
return sx
def _kapx(n, s, kap):
"""Value of kap=kh/ks for overlap part of intersecting linear smear zones
Assumes `s` is greater than `n`.
Parameters
----------
n : float or ndarray of float
Ratio of drain influence radius to drain radius (re/rw).
s : float or ndarray of float
Ratio of smear zone radius to drain radius (rs/rw)
kap : float or ndarray of float.
Ratio of undisturbed horizontal permeability to smear zone
horizontal permeanility (kh / ks).
Returns
-------
kapx : float
Value of kap=kh/ks for overlap part of intersecting linear smear zones
Notes
-----
.. math:: \\kappa_X= 1+\\frac{\\kappa-1}{s-1}\\left({s_X-1}\\right)
.. math:: s_X = 2n-s
See Also
--------
mu_overlapping_linear : uses _kapx
_sx : used in mu_overlapping_linear
"""
sx = _sx(n, s)
kapx = 1 + (kap - 1) / (s - 1) * (sx - 1)
return kapx
[docs]def mu_overlapping_linear(n, s, kap):
"""\
Smear zone parameter for smear zone with overlapping linear permeability
mu parameter in equal strain radial consolidation equations e.g.
u = u0 * exp(-8*Th/mu)
Parameters
----------
n : float or ndarray of float
Ratio of drain influence radius to drain radius (re/rw).
s : float or ndarray of float
Ratio of smear zone radius to drain radius (rs/rw).
kap : float or ndarray of float
Ratio of undisturbed horizontal permeability to permeability at
the drain-soil interface (kh / ks).
Returns
-------
mu : float
Smear zone permeability/geometry parameter.
Notes
-----
The smear zone parameter :math:`\\mu` is given by:
.. math::
\\mu_X =
\\left\\{\\begin{array}{lr}
\\mu_L\\left({n,s,\\kappa}\\right) & n\\geq s \\\\
\\frac{\\kappa}{\\kappa_X}\\mu_L
\\left({n, s_X,\\kappa_x}\\right)
& \\frac{s+1}{2}<n<s \\\\
\\frac{\\kappa}{\\kappa_X}\\mu_I
\\left({n}\\right) & n\\leq \\frac{s+1}{2}
\\end{array}\\right.
where :math:`\\mu_L` is the :math:`\\mu` parameter for non_overlapping
smear zones with linear permeability, :math:`\\mu_I` is the :math:`\\mu`
parameter for no smear zone, and:
.. math:: \\kappa_X= 1+\\frac{\\kappa-1}{s-1}\\left({s_X-1}\\right)
.. math:: s_X = 2n-s
and:
.. math:: n = \\frac{r_e}{r_w}
.. math:: s = \\frac{r_s}{r_w}
.. math:: \\kappa = \\frac{k_h}{k_s}
:math:`r_w` is the drain radius, :math:`r_e` is the drain influence radius,
:math:`r_s` is the smear zone radius, :math:`k_h` is the undisturbed
horizontal permeability, :math:`k_s` is the smear zone horizontal
permeability
See Also
--------
mu_linear : :math:`\\mu` for non-overlapping smear zones
mu_ideal : :math:`\\mu` for ideal drain with no smear zone
References
----------
.. [1] Walker, R., and B. Indraratna. 2007. 'Vertical Drain Consolidation
with Overlapping Smear Zones'. Geotechnique 57 (5): 463-67.
doi:10.1680/geot.2007.57.5.463.
"""
def mu_intersecting(n, s, kap):
"""mu for intersecting smear zones that do not completely overlap"""
sx = _sx(n, s)
kapx = _kapx(n, s, kap)
mu = mu_linear(n, sx, kapx) * kap / kapx
return mu
n = np.asarray(n)
s = np.asarray(s)
kap = np.asarray(kap)
if np.any(n <= 1.0):
raise ValueError('n must be greater than 1. You have n = {}'.format(
', '.join([str(v) for v in np.atleast_1d(n)])))
if np.any(s < 1.0):
raise ValueError('s must be greater than 1. You have s = {}'.format(
', '.join([str(v) for v in np.atleast_1d(s)])))
if np.any(kap <= 0.0):
raise ValueError('kap must be greater than 0. You have kap = '
'{}'.format(', '.join([str(v) for v in
np.atleast_1d(kap)])))
is_array = any([isinstance(v, np.ndarray) for v in [n, s, kap]])
n = np.atleast_1d(n)
s = np.atleast_1d(s)
kap = np.atleast_1d(kap)
if len([v for v in [n, s] if v.shape == kap.shape]) != 2:
raise ValueError('n, s, and kap must have the same shape. You have '
'lengths for n, s, kap of {}, {}, {}.'.format(
len(n), len(s), len(kap)))
ideal = np.isclose(s, 1) | np.isclose(kap, 1)
normal = (n >= s) & (~ideal)
all_disturbed = (2 * n - s <= 1) & (~ideal)
intersecting = ~(ideal | normal | all_disturbed)
mu = np.empty_like(n, dtype=float)
mu[ideal] = mu_ideal(n[ideal])
mu[normal] = mu_linear(n[normal], s[normal], kap[normal])
mu[all_disturbed] = kap[all_disturbed] * mu_ideal(n[all_disturbed])
mu[intersecting] = mu_intersecting(n[intersecting], s[intersecting],
kap[intersecting])
if is_array:
return mu
else:
return mu[0]
[docs]def mu_linear(n, s, kap):
"""Smear zone parameter for smear zone linear variation of permeability
mu parameter in equal strain radial consolidation equations e.g.
u = u0 * exp(-8*Th/mu)
Parameters
----------
n : float or ndarray of float
Ratio of drain influence radius to drain radius (re/rw).
s : float or ndarray of float
Ratio of smear zone radius to drain radius (rs/rw).
kap : float or ndarray of float
Ratio of undisturbed horizontal permeability to permeability at
the drain-soil interface (kh / ks).
Returns
-------
mu : float
Smear zone permeability/geometry parameter.
Notes
-----
For :math:`s\\neq\\kappa`, :math:`\\mu` is given by:
.. math:: \\mu=\\frac{n^2}{\\left({n^2-1}\\right)}
\\left[{
\\ln\\left({\\frac{n}{s}}\\right)
-\\frac{3}{4}
+\\frac{s^2}{n^2}\\left({1-\\frac{s^2}{4n^2}}\\right)
-\\frac{\\kappa}{B}\\ln\\left({\\frac{\\kappa}{s}}\\right)
+\\frac{\\kappa B}{A^2 n^2}\\left({2-\\frac{B^2}{A^2 n^2}}
\\right)\\ln\\left({\\kappa}\\right)
-\\frac{\\kappa\\left({s-1}\\right)}{A n^2}
\\left\\{
2
+\\frac{1}{n^2}
\\left[
{\\frac{A-B}{A}\\left({\\frac{1}{A}}-\\frac{s+1}{2}
\\right)}
-\\frac{s+1}{2}
-\\frac{\\left({s-1}\\right)^2}{3}
\\right]
\\right\\}
}\\right]
and for the special case :math:`s=\\kappa`, :math:`\\mu` is given by:
.. math:: \\mu=\\frac{n^2}{\\left({n^2-1}\\right)}
\\left[{
\\ln\\left({\\frac{n}{s}}\\right)
-\\frac{3}{4}
+s-1
-\\frac{s^2}{n^2}\\left({1-\\frac{s^2}{12n^2}}\\right)
-\\frac{s}{n^2}\\left({2-\\frac{1}{3n^2}}\\right)
}\\right]
where :math:`A` and :math:`B` are:
.. math:: A=\\frac{\\kappa-1}{s-1}
.. math:: B=\\frac{s-\\kappa}{s-1}
and:
.. math:: n = \\frac{r_e}{r_w}
.. math:: s = \\frac{r_s}{r_w}
.. math:: \\kappa = \\frac{k_h}{k_s}
:math:`r_w` is the drain radius, :math:`r_e` is the drain influence radius,
:math:`r_s` is the smear zone radius, :math:`k_h` is the undisturbed
horizontal permeability, :math:`k_s` is the smear zone horizontal
permeability
References
----------
.. [1] Walker, R., and B. Indraratna. 2007. 'Vertical Drain Consolidation
with Overlapping Smear Zones'. Geotechnique 57 (5): 463-67.
doi:10.1680/geot.2007.57.5.463.
"""
def mu_s_neq_kap(n, s, kap):
"""mu for when s != kap"""
A = (kap - 1) / (s - 1)
B = (s - kap) / (s - 1)
term1 = n**2 / (n**2 - 1)
term2 = (log(n / s) + s ** 2 / (n ** 2) *
(1 - s ** 2 / (4 * n ** 2)) - 3 / 4)
term3 = kap * (1 - s ** 2 / n ** 2)
term4 = (1 / B * log(s / kap)
- 1 / (n ** 2 * A ** 2) * (kap - 1 - B * log(kap)))
term5 = term2 + term3 * term4
term6 = 1 / (n ** 2 * B)
term7 = (s ** 2 * log(s) - (s ** 2 - 1) / 2
+ 1 / A ** 2 * ((kap ** 2 - 1) / 2 - kap ** 2 * log(kap) + 2 * B * (kap * log(kap) - (kap - 1))))
term8 = -1 / (n ** 4 * A ** 2)
term9 = (B / 3 * (s ** 2 - 1) + 2 / 3 * (s ** 2 * kap - 1) - (s ** 2 - 1)
+ B / A ** 2 * ((kap ** 2 - 1) / 2 - kap ** 2 * log(kap) + 2 * B * (kap * log(kap) - (kap - 1))))
term10 = kap * (term6 * term7 + term8 * term9)
mu = term1 * (term5 + term10)
return mu
def mu_s_eq_kap(n, s):
"""mu for s == kap"""
term1 = n ** 2 / (n ** 2 - 1)
term2 = (log(n / s)
+ s ** 2 / (n ** 2) * (1 - s ** 2 / (4 * n ** 2)) - 3 / 4)
term3 = (-s / n ** 2 * (1 - s ** 2 / n ** 2) * (s - 1)
+ (1 - s ** 2 / n ** 2) * (s - 1))
term4 = (s / n ** 4 * (s ** 2 - 1)
- 2 * s / (3 * n ** 4) * (s ** 3 - 1)
- (s / n ** 2 - s ** 2 / n ** 2) * (s - 1))
mu = term1 * (term2 + term3 + term4)
return mu
n = np.asarray(n)
s = np.asarray(s)
kap = np.asarray(kap)
if np.any(n<=1.0):
raise ValueError('n must be greater than 1. You have n = {}'.format(
', '.join([str(v) for v in np.atleast_1d(n)])))
if np.any(s<1.0):
raise ValueError('s must be greater than 1. You have s = {}'.format(
', '.join([str(v) for v in np.atleast_1d(s)])))
if np.any(kap<=0.0):
raise ValueError('kap must be greater than 0. You have kap = '
'{}'.format(', '.join([str(v) for v in np.atleast_1d(kap)])))
if np.any(s>=n):
raise ValueError('s must be less than n. You have s = '
'{} and n = {}'.format(
', '.join([str(v) for v in np.atleast_1d(s)]),
', '.join([str(v) for v in np.atleast_1d(n)])))
is_array = any([isinstance(v, np.ndarray) for v in [n, s, kap]])
n = np.atleast_1d(n)
s = np.atleast_1d(s)
kap = np.atleast_1d(kap)
if len([v for v in [n, s] if v.shape==kap.shape])!=2:
raise ValueError('n, s, and kap must have the same shape. You have '
'lengths for n, s, kap of {}, {}, {}.'.format(
len(n), len(s), len(kap)))
mu = np.empty_like(n, dtype=float)
ideal = np.isclose(s, 1) | np.isclose(kap, 1)
s_eq_kap = np.isclose(s, kap) & ~ideal
s_neq_kap = ~np.isclose(s, kap) & ~ideal
mu[ideal] = mu_ideal(n[ideal])
mu[s_eq_kap] = mu_s_eq_kap(n[s_eq_kap], s[s_eq_kap])
mu[s_neq_kap] = mu_s_neq_kap(n[s_neq_kap], s[s_neq_kap], kap[s_neq_kap])
if is_array:
return mu
else:
return mu[0]
[docs]def mu_parabolic(n, s, kap):
"""Smear zone parameter for parabolic variation of permeability
mu parameter in equal strain radial consolidation equations e.g.
u = u0 * exp(-8*Th/mu)
Parameters
----------
n : float or ndarray of float
Ratio of drain influence radius to drain radius (re/rw).
s : float or ndarray of float
Ratio of smear zone radius to drain radius (rs/rw).
kap : float or ndarray of float
Ratio of undisturbed horizontal permeability to permeability at
the drain-soil interface (kh/ks).
Returns
-------
mu : float
Smear zone permeability/geometry parameter
Notes
-----
The smear zone parameter :math:`\\mu` is given by:
.. math:: \\mu = \\frac{n^2}{\\left({n^2-1}\\right)}
\\left({
\\frac{A^2}{n^2}\\mu_1+\\mu_2
}\\right)
where,
.. math:: \\mu_1=
\\frac{1}{A^2-B^2}
\\left({
s^2\\ln\\left({s}\\right)
-\\frac{1}{2}\\left({s^2-1}\\right)
}\\right)
-\\frac{1}{\\left({A^2-B^2}\\right)C^2}
\\left({
\\frac{A^2}{2}\\ln\\left({\\kappa}\\right)
+\\frac{ABE}{2}+\\frac{1}{2}-B
-\\left({A^2-B^2}\\right)\\ln\\left({\\kappa}\\right)
}\\right)
+\\frac{1}{n^2C^4}
\\left({
-\\left({\\frac{A^2}{2}+B^2}\\right)
\\ln\\left({\\kappa}\\right)
+\\frac{3ABE}{2}+\\frac{1}{2}-3B
}\\right)
.. math:: \\mu_2=
\\ln\\left({\\frac{n}{s}}\\right)
-\\frac{3}{4}
+\\frac{s^2}{n^2}\\left({1-\\frac{s^2}{4n^2}}\\right)
+A^2\\left({1-\\frac{s^2}{n^2}}\\right)
\\left[{
\\frac{1}{A^2-B^2}
\\left({
\\ln\\left({\\frac{s}{\\sqrt{\\kappa}}}\\right)
-\\frac{BE}{2A}
}\\right)
+\\frac{1}{n^2C^2}
\\left({
\\ln\\left({\\sqrt{\\kappa}}\\right)
-\\frac{BE}{2A}
}\\right)
}\\right]
where :math:`A`, :math:`B`, :math:`C` and :math:`E` are:
.. math:: A=\\sqrt{\\frac{\\kappa}{\\kappa-1}}
.. math:: B=\\frac{s}{s-1}
.. math:: C=\\frac{1}{s-1}
.. math:: E=\\ln\\left({\\frac{A+1}{A-1}}\\right)
and:
.. math:: n = \\frac{r_e}{r_w}
.. math:: s = \\frac{r_s}{r_w}
.. math:: \\kappa = \\frac{k_h}{k_s}
:math:`r_w` is the drain radius, :math:`r_e` is the drain influence radius,
:math:`r_s` is the smear zone radius, :math:`k_h` is the undisturbed
horizontal permeability, :math:`k_s` is the smear zone horizontal
permeability
References
----------
.. [1] Walker, Rohan, and Buddhima Indraratna. 2006. 'Vertical Drain
Consolidation with Parabolic Distribution of Permeability in
Smear Zone'. Journal of Geotechnical and Geoenvironmental
Engineering 132 (7): 937-41.
doi:10.1061/(ASCE)1090-0241(2006)132:7(937).
"""
def mu_p(n, s, kap):
"""mu for parabolic smear"""
A = sqrt((kap / (kap - 1)))
B = s / (s - 1)
C = 1 / (s - 1)
term1 = (log(n / s) - 3 / 4 +
s ** 2 / n ** 2 * (1 - s ** 2 / (4 * n ** 2)))
term2 = (1 - s ** 2 / n ** 2) * A ** 2
term3 = 1 / (A ** 2 - B ** 2)
term4 = (log(s / sqrt(kap))) - (B / (2 * A) * log((A + 1) / (A - 1)))
term5 = 1 / (n ** 2 * C ** 2)
term6 = (log(sqrt(kap))) - (B / (2 * A) * log((A + 1) / (A - 1)))
mu2 = term1 + term2 * ((term3 * term4) + (term5 * term6))
term7 = (A ** 2 / n ** 2 * (1 / (A ** 2 - B ** 2)) * (s ** 2 * log(s)
- 1 / 2 * (s ** 2 - 1)))
term8 = -1 / (n ** 2 * C ** 2) * A ** 2 * (1 / (A ** 2 - B ** 2))
term9 = (A ** 2 / 2 * log(kap) + B * A / 2 * log((A + 1) / (A - 1))
+ 1 / 2 - B - (A ** 2 - B ** 2) * log(kap))
term12 = A ** 2 / 2 * log(kap)
term13 = (B * A / 2 * log((A + 1) / (A - 1)))
term14 = 1 / 2 - B
term15 = -(A ** 2 - B ** 2) * log(kap)
term10 = A ** 2 / (n ** 4 * C ** 4)
term11 = (-(A ** 2 / 2 + B ** 2) * (log(kap)) +
3 / 2 * A * B * log((A + 1) / (A - 1)) + 1 / 2 - 3 * B)
mu1 = term7 + (term8 * term9) + (term10 * term11)
mu = n ** 2 / (n ** 2 - 1) * (mu1 + mu2)
return mu
n = np.asarray(n)
s = np.asarray(s)
kap = np.asarray(kap)
if np.any(n<=1.0):
raise ValueError('n must be greater than 1. You have n = {}'.format(
', '.join([str(v) for v in np.atleast_1d(n)])))
if np.any(s<1.0):
raise ValueError('s must be greater than 1. You have s = {}'.format(
', '.join([str(v) for v in np.atleast_1d(s)])))
if np.any(kap<=0.0):
raise ValueError('kap must be greater than 0. You have kap = '
'{}'.format(', '.join([str(v) for v in np.atleast_1d(kap)])))
if np.any(s>n):
raise ValueError('s must be less than n. You have s = '
'{} and n = {}'.format(
', '.join([str(v) for v in np.atleast_1d(s)]),
', '.join([str(v) for v in np.atleast_1d(n)])))
is_array = any([isinstance(v, np.ndarray) for v in [n, s, kap]])
n = np.atleast_1d(n)
s = np.atleast_1d(s)
kap = np.atleast_1d(kap)
if len([v for v in [n, s] if v.shape==kap.shape])!=2:
raise ValueError('n, s, and kap must have the same shape. You have '
'lengths for n, s, kap of {}, {}, {}.'.format(
len(n), len(s), len(kap)))
mu = np.empty_like(n, dtype=float)
ideal = np.isclose(s, 1) | np.isclose(kap, 1)
mu[ideal] = mu_ideal(n[ideal])
mu[~ideal] = mu_p(n[~ideal], s[~ideal], kap[~ideal])
if is_array:
return mu
else:
return mu[0]
[docs]def mu_piecewise_constant(s, kap, n=None, kap_m=None):
"""Smear zone parameter for piecewise constant permeability distribution
mu parameter in equal strain radial consolidation equations e.g.
u = u0 * exp(-8*Th/mu)
Parameters
----------
s : list or 1d ndarray of float
Ratio of segment outer radii to drain radius (r_i/r_0). The first value
of s should be greater than 1, i.e. the first value should be s_1;
s_0=1 at the drain soil interface is implied.
kap : list or ndarray of float
Ratio of undisturbed horizontal permeability to permeability in each
segment kh/khi.
n, kap_m : float, optional
If `n` and `kap_m` are given then they will each be appended to `s` and
`kap`. This allows the specification of a smear zone separate to the
specification of the drain influence radius.
Default n=kap_m=None, i.e. soilpermeability is completely described
by `s` and `kap`. If n is given but kap_m is None then the last
kappa value in kap will be used.
Returns
-------
mu : float
Smear zone permeability/geometry parameter
Notes
-----
The smear zone parameter :math:`\\mu` is given by:
.. math:: \\mu = \\frac{n^2}{\\left({n^2-1}\\right)}
\\sum\\limits_{i=1}^{m} \\kappa_i
\\left[{
\\frac{s_i^2}{n^2}\\ln
\\left({
\\frac{s_i}{s_{i-1}}
}\\right)
-\\frac{s_i^2-s_{i-1}^2}{2n^2}
-\\frac{\\left({s_i^2-s_{i-1}^2}\\right)^2}{4n^4}
}\\right]
+\\psi_i\\frac{s_i^2-s_{i-1}^2}{n^2}
where,
.. math:: \\psi_{i} = \\sum\\limits_{j=1}^{i-1}\\kappa_j
\\left[{
\\ln
\\left({
\\frac{s_j}{s_{j-1}}
}\\right)
-\\frac{s_j^2-s_{j-1}^2}{2n^2}
}\\right]
and:
.. math:: n = \\frac{r_m}{r_0}
.. math:: s_i = \\frac{r_i}{r_0}
.. math:: \\kappa_i = \\frac{k_h}{k_{hi}}
:math:`r_0` is the drain radius, :math:`r_m` is the drain influence radius,
:math:`r_i` is the outer radius of the ith segment,
:math:`k_h` is the undisturbed
horizontal permeability in the ith segment,
:math:`k_{hi}` is the horizontal
permeability in the ith segment
References
----------
.. [1] Walker, Rohan. 2006. 'Analytical Solutions for Modeling Soft Soil
Consolidation by Vertical Drains'. PhD Thesis, Wollongong, NSW,
Australia: University of Wollongong. http://ro.uow.edu.au/theses/501
.. [2] Walker, Rohan T. 2011. 'Vertical Drain Consolidation Analysis in
One, Two and Three Dimensions'. Computers and
Geotechnics 38 (8): 1069-77. doi:10.1016/j.compgeo.2011.07.006.
"""
s = np.atleast_1d(s)
kap = np.atleast_1d(kap)
if not n is None:
s_temp = np.empty(len(s) + 1, dtype=float)
s_temp[:-1] = s
s_temp[-1] = n
kap_temp = np.empty(len(kap) + 1, dtype=float)
kap_temp[:-1] = kap
if kap_m is None:
kap_temp[-1] = kap[-1]
else:
kap_temp[-1] = kap_m
s = s_temp
kap = kap_temp
n = np.asarray(n)
s = np.asarray(s)
kap = np.asarray(kap)
if len(s)!=len(kap):
raise ValueError('s and kap must have the same shape. You have '
'lengths for s, kap of {}, {}.'.format(
len(s), len(kap)))
if np.any(s<=1.0):
raise ValueError('must have all s>=1. You have s = {}'.format(
', '.join([str(v) for v in np.atleast_1d(s)])))
if np.any(kap<=0.0):
raise ValueError('all kap must be greater than 0. You have kap = '
'{}'.format(', '.join([str(v) for v in np.atleast_1d(kap)])))
if np.any(np.diff(s) <= 0):
raise ValueError('s must increase left to right you have s = '
'{}'.format(', '.join([str(v) for v in np.atleast_1d(s)])))
n = s[-1]
s_ = np.ones_like(s , dtype=float)
s_[1:] = s[:-1]
sumi = 0
for i in range(len(s)):
psi = 0
for j in range(i):
psi += kap[j] * (log(s[j] / s_[j])
- 0.5 * (s[j] ** 2 / n ** 2 - s_[j] ** 2 / n ** 2))
psi /= kap[i]
sumi += kap[i] * (
s[i] ** 2 / n ** 2 * log(s[i] / s_[i])
+ (psi - 0.5) * (s[i] ** 2 / n ** 2 - s_[i] ** 2 / n ** 2)
- 0.25 * (s[i] ** 2 - s_[i] ** 2) ** 2 / n ** 4
)
mu = sumi * n ** 2 / (n ** 2 - 1)
return mu
[docs]def mu_piecewise_linear(s, kap, n=None, kap_m=None):
"""Smear zone parameter for piecewise linear permeability distribution
mu parameter in equal strain radial consolidation equations e.g.
u = u0 * exp(-8*Th/mu)
Parameters
----------
s : list or 1d ndarray of float
Ratio of radii to drain radius (r_i/r_0). The first value
of s should be 1, i.e. at the drain soil interface.
kap : list or ndarray of float
Ratio of undisturbed horizontal permeability to permeability at each
value of s.
n, kap_m : float, optional
If `n` and `kap_m` are given then they will each be appended to `s` and
`kap`. This allows the specification of a smear zone separate to the
specification of the drain influence radius.
Default n=kap_m=None, i.e. soilpermeability is completely described
by `s` and `kap`. If n is given but kap_m is None then the last
kappa value in kap will be used.
Returns
-------
mu : float
Smear zone permeability/geometry parameter.
Notes
-----
With permeability in the ith segment defined by:
.. math:: \\frac{k_i}{k_{ref}}= \\frac{1}{\\kappa_{i-1}}
\\left({A_ir/r_w+B_i}\\right)
.. math:: A_i = \\frac{\\kappa_{i-1}/\\kappa_i-1}{s_i-s_{i-1}}
.. math:: B_i = \\frac{s_i-s_{i-1}\\kappa_{i-1}/\\kappa_i}{s_i-s_{i-1}}
the smear zone :math:`\\mu` parameter is given by:
.. math:: \\mu = \\frac{n^2}{n^2-1}
\\left[{
\\sum\\limits_{i=1}^{m}\\kappa_{i-1}\\theta_i
+ \\Psi_i
\\left({
\\frac{s_i^2-s_{i-1}^2}{n^2}
}\\right)
+\\mu_w
}\\right]
where,
.. math:: \\theta_i = \\left\\{
\\begin{array}{lr}
\\frac{s_i^2}{n^2}\\ln
\\left[{\\frac{s_i}{s_{i-1}}}\\right]
-\\frac{s_i^2-s_{i-1}^2}{2n^2}
-\\frac{\\left({s_i^2-s_{i-1}^2}\\right)^2}{4n^4}
& \\textrm{for } \\frac{\\kappa_{i-1}}{\\kappa_i}=1 \\\\
\\frac{\\left({s_i^2-s_{i-1}^2}\\right)}{3n^4}
\\left({3n^2-s_{i-1}^2-2s_{i-1}s_i}\\right)
& \\textrm{for }\\frac{\\kappa_{i-1}}{\\kappa_i}=
\\frac{s_i}{s_{i-1}} \\\\
\\begin{multline}
\\frac{s_i}{B_i n^2}\\ln\\left[{
\\frac{\\kappa_i s_i}{\\kappa_{i-1}s_{i-1}}}\\right]
-\\frac{s_i-s_{i-1}}{A_in^2}
\\left({1-\\frac{B_i^2}{A_i^2n^4}}\\right)
\\\\-\\frac{\\left({s_i-s_{i-1}}\\right)^2}{3A_in^2}
\\left({2s_i+s_{i-1}}\\right)
\\\\+\\frac{B_i}{A_i^2 n^4}\\ln\\left[{
\\frac{\\kappa_{i-1}}{\\kappa_i}}\\right]
\\left({1-\\frac{B_i^2}{A_i^2n^2}}\\right)
\\\\+\\frac{B_i}{2A_i^2 n^4}
\\left({
2s_i^2\\ln\\left[{
\\frac{\\kappa_{i-1}}{\\kappa_i}}\\right]
-s_i^2 + s_{i-1}^2
}\\right)
\\end{multline}
& \\textrm{otherwise}
\\end{array}\\right.
.. math:: \\Psi_i = \\sum\\limits_{j=1}^{i-1}\\kappa_{j-1}\\psi_j
.. math:: \\psi_i = \\left\\{
\\begin{array}{lr}
\\ln\\left[{\\frac{s_j}{s_{j-1}}}\\right]
- \\frac{s_j^2- s_{j-1}^2}{2n^2}
& \\textrm{for } \\frac{\\kappa_{j-1}}{\\kappa_j}=1 \\\\
\\frac{\\left({s_j - s_{j-1}}\\right)
\\left({n^2-s_js_{j-1}}\\right)}{s_jn^2}
& \\textrm{for }\\frac{\\kappa_{j-1}}{\\kappa_j}=
\\frac{s_j}{s_{j-1}} \\\\
\\begin{multline}
\\frac{1}{B_i}\\ln\\left[{\\frac{s_j}{s_{j-1}}}\\right]
+\\ln\\left[{\\frac{\\kappa_{j-1}}{\\kappa_j}}\\right]
\\left({\\frac{B_j}{A_j^2n^2}-\\frac{1}{B_j}}\\right)
\\\\-\\frac{s_j-s_{j-1}}{A_j^2n^2}
\\end{multline}
& \\textrm{otherwise}
\\end{array}\\right.
and:
.. math:: n = \\frac{r_m}{r_0}
.. math:: s_i = \\frac{r_i}{r_0}
.. math:: \\kappa_i = \\frac{k_h}{k_{ref}}
:math:`r_0` is the drain radius, :math:`r_m` is the drain influence radius,
:math:`r_i` is the radius of the ith radial point,
:math:`k_{ref}` is a convienient refernce permeability, usually
the undisturbed
horizontal permeability,
:math:`k_{hi}` is the horizontal
permeability at the ith radial point
References
----------
Derived by Rohan Walker in 2011 and 2014.
Derivation steps are the same as for mu_piecewise_constant in appendix of
[1]_ but permeability is linear in a segemetn as in [2]_.
.. [1] Walker, Rohan. 2006. 'Analytical Solutions for Modeling Soft Soil
Consolidation by Vertical Drains'. PhD Thesis, Wollongong, NSW,
Australia: University of Wollongong. http://ro.uow.edu.au/theses/501
.. [2] Walker, R., and B. Indraratna. 2007. 'Vertical Drain Consolidation
with Overlapping Smear Zones'. Geotechnique 57 (5): 463-67.
doi:10.1680/geot.2007.57.5.463.
"""
s = np.atleast_1d(s)
kap = np.atleast_1d(kap)
if not n is None:
s_temp = np.empty(len(s) + 1, dtype=float)
s_temp[:-1] = s
s_temp[-1] = n
kap_temp = np.empty(len(kap) + 1, dtype=float)
kap_temp[:-1] = kap
if kap_m is None:
kap_temp[-1] = kap[-1]
else:
kap_temp[-1] = kap_m
s = s_temp
kap = kap_temp
n = np.asarray(n)
s = np.asarray(s)
kap = np.asarray(kap)
if len(s)!=len(kap):
raise ValueError('s and kap must have the same shape. You have '
'lengths for s, kap of {}, {}.'.format(
len(s), len(kap)))
if np.any(s < 1.0):
raise ValueError('must have all s>=1. You have s = {}'.format(
', '.join([str(v) for v in np.atleast_1d(s)])))
if np.any(kap<=0.0):
raise ValueError('all kap must be greater than 0. You have kap = '
'{}'.format(', '.join([str(v) for v in np.atleast_1d(kap)])))
if np.any(np.diff(s) < 0):
raise ValueError('All s must satisfy s[i]>s[i-1]. You have s = '
'{}'.format(', '.join([str(v) for v in np.atleast_1d(s)])))
if not np.isclose(s[0], 1):
raise ValueError('First value of s should be 1. You '
'have s[0]={}'.format(s[0]))
n = s[-1]
sumi = 0
for i in range(1, len(s)):
sumj = 0
for j in range(1, i):
# term1 = 0
if np.isclose(s[j - 1], s[j]):
term1=0
elif np.isclose(kap[j - 1], kap[j]):
term1 = (log(s[j] / s[j - 1])
- (s[j] ** 2 - s[j - 1] ** 2) / 2 / n ** 2)
elif np.isclose(kap[j-1] / kap[j], s[j] / s[j - 1]):
term1 = (s[j] - s[j - 1]) * (n ** 2 -
s[j - 1] * s[j]) / s[j] / n ** 2
else:
A = (kap[j-1] / kap[j] - 1) / (s[j] - s[j - 1])
B = (s[j] - kap[j-1] / kap[j] * s[j - 1]) / (s[j] - s[j - 1])
term1 = (1 / B * log(s[j] / s[j - 1])
+ (B / A ** 2 / n ** 2 - 1 / B) * log(kap[j-1] / kap[j])
- (s[j] - s[j - 1]) / A / n ** 2)
sumj += kap[j-1] * term1
# term1 = 0
if np.isclose(s[i - 1], s[i]):
term1=0
elif np.isclose(kap[i - 1], kap[i]):
term1 = (s[i] ** 2 / n ** 2 * log(s[i] / s[i - 1])
- (s[i] ** 2 - s[i - 1] ** 2) / 2 / n ** 2
- (s[i] ** 2 - s[i - 1] ** 2) ** 2 / 4 / n ** 4)
elif np.isclose(kap[i-1] / kap[i], s[i] / s[i - 1]):
term1 = ((s[i] - s[i - 1]) ** 2 / 3 / n ** 4 * (3 * n ** 2 -
s[i - 1] ** 2 - 2 * s[i - 1] * s[i]))
else:
A = (kap[i-1] / kap[i] - 1) / (s[i] - s[i - 1])
B = (s[i] - kap[i-1] / kap[i] * s[i - 1]) / (s[i] - s[i - 1])
term1 = (s[i] ** 2 / B / n ** 2 * log(kap[i] * s[i] /
kap[i-1] / s[i - 1])
- (s[i] - s[i - 1]) / A / n ** 2 *
(1 - B ** 2 / A ** 2 / n ** 2)
- (s[i] - s[i - 1]) ** 2 / 3 / A / n ** 4 *
(s[i - 1] + 2 * s[i])
+ B / A ** 2 / n ** 2 * log(kap[i-1] / kap[i]) *
(1 - B ** 2 / A ** 2 / n ** 2)
+ B / 2 / A ** 2 / n ** 4 * (s[i] ** 2 * (2 * log(kap[i-1] /
kap[i]) - 1) + s[i - 1] ** 2))
sumi += kap[i-1] * term1 + sumj * (s[i] ** 2 - s[i - 1] ** 2) / n ** 2
mu = sumi * n ** 2 / (n ** 2 - 1)
return mu
[docs]def mu_well_resistance(kh, qw, n, H, z=None):
"""Additional smear zone parameter for well resistance
Parameters
----------
kh : float
The normalising permeability used in calculating kappa for smear zone
calcs. Usually the undisturbed permeability i.e. the kh in
kappa = kh/ks
qw : float
Drain discharge capacity. qw = kw * pi * rw**2. Make sure
the kw used has the same units as kh.
n : float
Ratio of drain influence radius to drain radius (re/rw).
H : float
Length of drainage path.
z : float, optional
Evaluation depth. Default = None, in which case the well resistance
factor will be averaged.
Returns
-------
mu : float
mu parameter for well resistance
Notes
-----
The smear zone parameter :math:`\\mu_w` is given by:
.. math:: \\mu_w = \\frac{k_h}{q_w}\\pi z
\\left({2H-z}\\right)
\\left({1-\\frac{1}{n^2}}\\right)
when :math:`z` is None then the average :math:`\\mu_w` is given by:
.. math:: \\mu_{w\\textrm{average}} = \\frac{2k_h H^2}{3q_w}\\pi
\\left({1-\\frac{1}{n^2}}\\right)
where,
.. math:: n = \\frac{r_e}{r_w}
.. math:: q_w = k_w \\pi r_w^2
:math:`r_w` is the drain radius, :math:`r_e` is the drain influence radius,
:math:`k_h` is the undisturbed horizontal permeability,
:math:`k_w` is the drain permeability
References
----------
.. [1] Hansbo, S. 1981. 'Consolidation of Fine-Grained Soils by
Prefabricated Drains'. In 10th ICSMFE, 3:677-82.
Rotterdam-Boston: A.A. Balkema.
"""
n = np.asarray(n)
if n<=1.0:
raise ValueError('n must be greater than 1. You have n = {}'.format(
n))
if z is None:
mu = 2 * kh * H**2 / 3 / qw * np.pi * (1 - 1 / n**2)
else:
mu = kh / qw * np.pi * z * (2 * H - z) * (1 - 1 / n**2)
return mu
[docs]def k_parabolic(n, s, kap, si):
"""Permeability distribution for smear zone with parabolic permeability
Normalised with respect to undisturbed permeability. i.e. if you want the
actual permeability then multiply by whatever you used to determine kap.
Permeability is parabolic with value 1/kap at the drain soil interface
i.e. at s=1 k=k0=1/kap. for si>s, permeability=1.
Parameters
----------
n : float
Ratio of drain influence radius to drain radius (re/rw).
s : float
Ratio of smear zone radius to drain radius (rs/rw).
kap : float
Ratio of undisturbed horizontal permeability to permeability at
the drain-soil interface (kh / ks).
si : float of ndarray of float
Normalised radial coordinate(s) at which to calc the permeability
i.e. si=ri/rw
Returns
-------
permeability : float or ndarray of float
Normalised permeability (i.e. ki/kh) at the si values.
Notes
-----
Parabolic distribution of permeability in smear zone is given by:
.. math:: \\frac{k_h^\\prime\\left({r}\\right)}{k_h}=
\\frac{\\kappa-1}{\\kappa}
\\left({A-B+C\\frac{r}{r_w}}\\right)
\\left({A+B-C\\frac{r}{r_w}}\\right)
where :math:`A`, :math:`B`, :math:`C` are:
.. math:: A=\\sqrt{\\frac{\\kappa}{\\kappa-1}}
.. math:: B=\\frac{s}{s-1}
.. math:: C=\\frac{1}{s-1}
and:
.. math:: n = \\frac{r_e}{r_w}
.. math:: s = \\frac{r_s}{r_w}
.. math:: \\kappa = \\frac{k_h}{k_s}
:math:`r_w` is the drain radius, :math:`r_e` is the drain influence radius,
:math:`r_s` is the smear zone radius, :math:`k_h` is the undisturbed
horizontal permeability, :math:`k_s` is the smear zone horizontal
permeability
References
----------
.. [1] Walker, Rohan, and Buddhima Indraratna. 2006. 'Vertical Drain
Consolidation with Parabolic Distribution of Permeability in
Smear Zone'. Journal of Geotechnical and Geoenvironmental
Engineering 132 (7): 937-41.
doi:10.1061/(ASCE)1090-0241(2006)132:7(937).
"""
n = np.asarray(n)
s = np.asarray(s)
kap = np.asarray(kap)
if n<=1.0:
raise ValueError('n must be greater than 1. You have n = {}'.format(
n))
if s<1.0:
raise ValueError('s must be greater than 1. You have s = {}'.format(
s))
if kap<=0.0:
raise ValueError('kap must be greater than 0. You have kap = '
'{}'.format(kap))
if s>n:
raise ValueError('s must be less than n. You have s = '
'{} and n = {}'.format(s, n))
si = np.atleast_1d(si)
if np.any((si < 1) | (si > n)):
raise ValueError('si must satisfy 1 >= si >= n)')
def parabolic_part(n,s, kap, si):
"""Parbolic smear zone part i.e from si=1 to si=s"""
A = sqrt((kap / (kap - 1)))
B = s / (s - 1)
C = 1 / (s - 1)
k0 = 1 / kap
return k0*(kap-1)*(A - B + C * si)*(A + B - C * si)
if np.isclose(s,1) or np.isclose(kap, 1):
return np.ones_like(si, dtype=float)
smear = (si < s)
permeability = np.ones_like(si, dtype=float)
permeability[smear] = parabolic_part(n, s, kap, si[smear])
return permeability
[docs]def k_linear(n, s, kap, si):
"""Permeability distribution for smear zone with linear permeability
Normalised with respect to undisturbed permeability. i.e. if you want the
actual permeability then multiply by whatever you used to determine kap.
Permeability is linear with value 1/kap at the drain soil interface
i.e. at s=1 k=k0=1/kap. for si>s, permeability=1.
Parameters
----------
n : float
Ratio of drain influence radius to drain radius (re/rw).
s : float
Ratio of smear zone radius to drain radius (rs/rw).
kap : float
Ratio of undisturbed horizontal permeability to permeability at
the drain-soil interface (kh / ks).
si : float of ndarray of float
Normalised radial coordinate(s) at which to calc the permeability
i.e. si=ri/rw.
Returns
-------
permeability : float or ndarray of float
Normalised permeability (i.e. ki/kh) at the si values.
Notes
-----
Linear distribution of permeability in smear zone is given by:
.. math::
\\frac{k_h^\\prime\\left({r}\\right)}{k_h}=
\\left\\{\\begin{array}{lr}
\\frac{1}{\\kappa}
\\left({A\\frac{r}{r_w}+B}\\right)
& s\\neq\\kappa \\\\
\\frac{r}{\\kappa r_w}
& s=\\kappa \\end{array}\\right.
where :math:`A` and :math:`B` are:
.. math:: A=\\frac{\\kappa-1}{s-1}
.. math:: B=\\frac{s-\\kappa}{s-1}
and:
.. math:: n = \\frac{r_e}{r_w}
.. math:: s = \\frac{r_s}{r_w}
.. math:: \\kappa = \\frac{k_h}{k_s}
:math:`r_w` is the drain radius, :math:`r_e` is the drain influence radius,
:math:`r_s` is the smear zone radius, :math:`k_h` is the undisturbed
horizontal permeability, :math:`k_s` is the smear zone horizontal
permeability
References
----------
.. [1] Walker, R., and B. Indraratna. 2007. 'Vertical Drain Consolidation
with Overlapping Smear Zones'. Geotechnique 57 (5): 463-67.
doi:10.1680/geot.2007.57.5.463.
"""
def s_neq_kap_part(n, s, kap, si):
"""Linear permeability in smear zome when s!=kap"""
A = (kap - 1) / (s - 1)
B = (s - kap) / (s - 1)
k0 = 1 / kap
return k0*(A*si+B)
def s_eq_kap_part(n, s, si):
"""Linear permeability in smear zome when s!=kap"""
k0 = 1 / kap
return k0 * si
if n<=1.0:
raise ValueError('n must be greater than 1. You have n = {}'.format(
n))
if s<1.0:
raise ValueError('s must be greater than 1. You have s = {}'.format(
s))
if kap<=0.0:
raise ValueError('kap must be greater than 0. You have kap = '
'{}'.format(kap))
if s>n:
raise ValueError('s must be less than n. You have s = '
'{} and n = {}'.format(s, n))
si = np.atleast_1d(si)
if np.any((si < 1) | (si > n)):
raise ValueError('si must satisfy 1 >= si >= n)')
if np.isclose(s,1) or np.isclose(kap, 1):
return np.ones_like(si, dtype=float)
smear = (si < s)
permeability = np.ones_like(si, dtype=float)
if np.isclose(s, kap):
permeability[smear] = s_eq_kap_part(n, s, si[smear])
else:
permeability[smear] = s_neq_kap_part(n, s, kap, si[smear])
return permeability
[docs]def k_overlapping_linear(n, s, kap, si):
"""Permeability smear zone with overlapping linear permeability
Normalised with respect to undisturbed permeability. i.e. if you want the
actual permeability then multiply by whatever you used to determine kap.
mu parameter in equal strain radial consolidation equations e.g.
u = u0 * exp(-8*Th/mu)
Parameters
----------
n : float
Ratio of drain influence radius to drain radius (re/rw).
s : float
Ratio of smear zone radius to drain radius (rs/rw).
kap : float
Ratio of undisturbed horizontal permeability to permeability at
the drain-soil interface (kh / ks).
si : float of ndarray of float
Normalised radial coordinate(s) at which to calc the permeability
i.e. si=ri/rw
Returns
-------
permeability : float or ndarray of float
Normalised permeability (i.e. ki/kh) at the si values.
Notes
-----
When :math:`n>s` the permeability is no different from the linear case.
When :math:`n\\leq (s+1)/2` then all the soil is disturbed
and the permeability everywhere is equal to :math:`1/\\kappa`.
When :math:`(s+1)/2<n<s` then the smear zones overlap.
the permeability for :math:`r/r_w<s_X` is given by:
.. math:: \\frac{k_h^\\prime\\left({r}\\right)}{k_h}=
\\left\\{\\begin{array}{lr}
\\frac{1}{\\kappa}
\\left({A\\frac{r}{r_w}+B}\\right)
& s\\neq\\kappa \\\\
\\frac{r}{\\kappa r_w}
& s=\\kappa \\end{array}\\right.
In the overlapping part, :math:`r/r_w>s_X`, the permeability is given by:
.. math:: k_h(r)=\\kappa_X/\\kappa
where :math:`A` and :math:`B` are:
.. math:: A=\\frac{\\kappa-1}{s-1}
.. math:: B=\\frac{s-\\kappa}{s-1}
.. math:: \\kappa_X= 1+\\frac{\\kappa-1}{s-1}\\left({s_X-1}\\right)
.. math:: s_X = 2n-s
and:
.. math:: n = \\frac{r_e}{r_w}
.. math:: s = \\frac{r_s}{r_w}
.. math:: \\kappa = \\frac{k_h}{k_s}
:math:`r_w` is the drain radius, :math:`r_e` is the drain influence radius,
:math:`r_s` is the smear zone radius, :math:`k_h` is the undisturbed
horizontal permeability, :math:`k_s` is the smear zone horizontal
permeability
References
----------
.. [1] Walker, R., and B. Indraratna. 2007. 'Vertical Drain Consolidation
with Overlapping Smear Zones'. Geotechnique 57 (5): 463-67.
doi:10.1680/geot.2007.57.5.463.
"""
def mu_intersecting(n, s, kap):
"""mu for intersecting smear zones that do not completely overlap"""
sx = _sx(n, s)
kapx = _kapx(n, s, kap)
mu = mu_linear(n, sx, kapx) * kap / kapx
return mu
n = np.asarray(n)
s = np.asarray(s)
kap = np.asarray(kap)
if n<=1.0:
raise ValueError('n must be greater than 1. You have n = {}'.format(
n))
if s<1.0:
raise ValueError('s must be greater than 1. You have s = {}'.format(
s))
if kap<=0.0:
raise ValueError('kap must be greater than 0. You have kap = '
'{}'.format(kap))
si = np.atleast_1d(si)
if np.any((si < 1) | (si > n)):
raise ValueError('si must satisfy 1 >= si >= n)')
if np.isclose(s,1) or np.isclose(kap, 1):
permeability = np.ones_like(si, dtype=float)
elif (2*n-s <=1):
permeability = np.ones_like(si, dtype=float) / kap
elif (n>=s):
permeability = k_linear(n, s, kap, si)
else:
sx = _sx(n, s)
kapx = _kapx(n, s, kap)
smear = (si < sx)
permeability = np.ones_like(si, dtype=float)
A = (kap - 1) / (s - 1)
B = (s - kap) / (s - 1)
permeability[smear] = 1/kap*(A*si[smear] + B)
permeability[~smear] = 1/kap*kapx#1 / kapx
return permeability
[docs]def u_ideal(n, si, uavg=1, uw=0, muw=0):
"""Pore pressure at radius for ideal drain with no smear zone
Parameters
----------
n : float
Ratio of drain influence radius to drain radius (re/rw).
si : float of ndarray of float
Normalised radial coordinate(s) at which to calc the pore pressure
i.e. si=ri/rw.
uavg : float, optional = 1
Average pore pressure in soil. default = 1. when `uw`=0 , then if
uavg=1.
uw : float, optional
Pore pressure in drain, default = 0.
muw : float, optional
Well resistance mu parameter
Returns
-------
u : float or ndarray of float
Pore pressure at specified si
Notes
-----
The uavg is calculated from the eta method. It is not the uavg used when
considering the vacuum as an equivalent surcharge. You would have to do
other manipulations for that.
Noteing that :math:`s_i=r_i/r_w`, the radial pore pressure distribution is given by:
.. math:: u(r) = \\frac{u_{avg}-u_w}{\\mu+\\mu_w}
\\left[{
\\ln\\left({\\frac{r}{r_w}}\\right)
-\\frac{(r/r_w)^2-1}{2n^2}
+\\mu_w
}\\right]+u_w
where:
.. math:: n = \\frac{r_e}{r_w}
:math:`r_w` is the drain radius, :math:`r_e` is the drain influence radius.
References
----------
.. [1] Hansbo, S. 1981. 'Consolidation of Fine-Grained Soils by
Prefabricated Drains'. In 10th ICSMFE, 3:677-82.
Rotterdam-Boston: A.A. Balkema.
"""
n = np.asarray(n)
if n<=1.0:
raise ValueError('n must be greater than 1. You have n = {}'.format(
n))
si = np.atleast_1d(si)
if np.any((si < 1) | (si > n)):
raise ValueError('si must satisfy 1 >= si >= n)')
mu = mu_ideal(n)
term1 = (uavg - uw) / (mu + muw)
term2 = log(si) - 1 / (2 * n**2) * (si**2 - 1) + muw
u = term1 * term2 + uw
return u
[docs]def u_constant(n, s, kap, si, uavg=1, uw=0, muw=0):
"""Pore pressure at radius for constant permeability smear zone
Parameters
----------
n : float
Ratio of drain influence radius to drain radius (re/rw).
s : float
Ratio of smear zone radius to drain radius (rs/rw).
kap : float
Ratio of undisturbed horizontal permeability to permeability at
the drain-soil interface (kh / ks).
si : float of ndarray of float
Normalised radial coordinate(s) at which to calc the pore pressure
i.e. si=ri/rw.
uavg : float, optional = 1
Average pore pressure in soil. default = 1. when `uw`=0 , then if
uavg=1.
uw : float, optional
Pore pressure in drain, default = 0.
muw : float, optional
Well resistance mu parameter.
Returns
-------
u : float or ndarray of float
Pore pressure at specified si
Notes
-----
The uavg is calculated from the eta method. It is not the uavg used when
considering the vacuum as an equivalent surcharge. You would have to do
other manipulations for that.
Noteing that :math:`s_i=r_i/r_w`, the radial pore pressure distribution
in the smear zone is given by:
.. math:: u^\\prime(r) = \\frac{u_{avg}-u_w}{\\mu+\\mu_w}
\\left[{
\\kappa\\left({
\\ln\\left({s_i}\\right)
-\\frac{1}{2n^2}\\left({s_i^2-1}\\right)
}\\right)
+\\mu_w
}\\right]+u_w
The pore pressure in the undisturbed zone is:
.. math:: u(r) = \\frac{u_{avg}-u_w}{\\mu+\\mu_w}
\\left[{
\\ln\\left({\\frac{s_i}{s}}\\right)
-\\frac{1}{2n^2}\\left({s_i^2-s^2}\\right)
+\\kappa\\left[{
\\ln\\left({s}\\right)
-\\frac{1}{2n^2}\\left({s^2-1}\\right)
}\\right]
+\\mu_w
}\\right]+u_w
where:
.. math:: n = \\frac{r_e}{r_w}
.. math:: s = \\frac{r_s}{r_w}
.. math:: \\kappa = \\frac{k_h}{k_s}
:math:`r_w` is the drain radius, :math:`r_e` is the drain influence radius,
:math:`r_s` is the smear zone radius, :math:`k_h` is the undisturbed
horizontal permeability, :math:`k_s` is the smear zone horizontal
permeability
References
----------
.. [1] Hansbo, S. 1981. 'Consolidation of Fine-Grained Soils by
Prefabricated Drains'. In 10th ICSMFE, 3:677-82.
Rotterdam-Boston: A.A. Balkema.
"""
def constant_part(n, s, kap, si):
"""u in smear zone with constant permeability i.e from si=1 to si=s"""
term2 = log(si) - 1 / (2 * n ** 2) * (si ** 2 - 1)
u = kap * term2
return u
def undisturbed_part(n, s, kap, si):
"""u outside of smear zone with constant permeability i.e from si=1 to si=s"""
term4 = (log(si / s) - 1 / (2 * n ** 2) * (si ** 2 - s ** 2)
+ kap * (log(s) - 1 / (2 * n ** 2) * (s ** 2 - 1)))
u = term4
return u
n = np.asarray(n)
s = np.asarray(s)
kap = np.asarray(kap)
if n<=1.0:
raise ValueError('n must be greater than 1. You have n = {}'.format(
n))
if s<1.0:
raise ValueError('s must be greater than 1. You have s = {}'.format(
s))
if kap<=0.0:
raise ValueError('kap must be greater than 0. You have kap = '
'{}'.format(kap))
if s>n:
raise ValueError('s must be less than n. You have s = '
'{} and n = {}'.format(s, n))
si = np.atleast_1d(si)
if np.any((si < 1) | (si > n)):
raise ValueError('si must satisfy 1 >= si >= n)')
if np.isclose(s, 1) or np.isclose(kap, 1):
return u_ideal(n, si, uavg, uw, muw)
mu = mu_constant(n, s, kap)
term1 = (uavg - uw) / (mu + muw)
term2 = np.empty_like(si, dtype=float)
smear = (si < s)
term2[smear] = constant_part(n, s, kap, si[smear])
term2[~smear] = undisturbed_part(n, s, kap, si[~smear])
u = term1 * (term2 + muw) + uw
return u
[docs]def u_linear(n, s, kap, si, uavg=1, uw=0, muw=0):
"""Pore pressure at radius for linear smear zone
Parameters
----------
n : float
Ratio of drain influence radius to drain radius (re/rw).
s : float
Ratio of smear zone radius to drain radius (rs/rw).
kap : float
Ratio of undisturbed horizontal permeability to permeability at
the drain-soil interface (kh / ks).
si : float of ndarray of float
Normalised radial coordinate(s) at which to calc the pore pressure
i.e. si=ri/rw.
uavg : float, optional = 1
Average pore pressure in soil. default = 1. when `uw`=0 , then if
uavg=1.
uw : float, optional
Pore pressure in drain, default = 0.
muw : float, optional
Well resistance mu parameter.
Returns
-------
u : float or ndarray of float
Pore pressure at specified si.
Notes
-----
The uavg is calculated from the eta method. It is not the uavg used when
considering the vacuum as an equivalent surcharge. You would have to do
other manipulations for that.
Noteing that :math:`s_i=r_i/r_w`, the radial pore pressure distribution
in the smear zone is given by:
.. math:: u^\\prime(r) = \\frac{u_{avg}-u_w}{\\mu+\\mu_w}
\\left[{
\\kappa\\left({\\frac{1}{B}\\ln\\left({s_i}\\right)
+\\left({\\frac{B}{A^2n^2}-\\frac{1}{B}}\\right)
\\ln\\left({B+As_i}\\right)
+\\frac{1-s_i}{An^2}
}\\right)
+\\mu_w
}\\right]+u_w
The pore pressure in the undisturbed zone is:
.. math:: u(r) = \\frac{u_{avg}-u_w}{\\mu+\\mu_w}
\\left[{
\\ln\\left({\\frac{s_i}{s}}\\right)
-\\frac{s_i^2-s^2}{2n^2}
+\\kappa
\\left[{
\\frac{1}{B}\\ln\\left({s}\\right)
+\\left({\\frac{B}{A^2n^2}-\\frac{1}{B}}\\right)
\\ln\\left({\\kappa}\\right)
+\\frac{1-s}{An^2}
}\\right]
+\\mu_w
}\\right]+u_w
for the special case where :math:`s=\\kappa` the pore pressure
in the undisturbed zone is:
.. math:: u^\\prime(r) = \\frac{u_{avg}-u_w}{\\mu+\\mu_w}
\\left[{
s\\frac{\\left({n^2-s_i}\\right)
\\left({s_i-1}\\right)}{n^2s_i}
+\\mu_w
}\\right]+u_w
The pore pressure in the undisturbed zone is:
.. math:: u(r) = \\frac{u_{avg}-u_w}{\\mu+\\mu_w}
\\left[{
\\ln\\left({\\frac{s_i}{s}}\\right)
+s-1+\\frac{s}{n^2}
-\\frac{s_i^2-s^2}{2n^2}
+\\mu_w
}\\right]+u_w
where:
.. math:: n = \\frac{r_e}{r_w}
.. math:: s = \\frac{r_s}{r_w}
.. math:: \\kappa = \\frac{k_h}{k_s}
:math:`r_w` is the drain radius, :math:`r_e` is the drain influence radius,
:math:`r_s` is the smear zone radius, :math:`k_h` is the undisturbed
horizontal permeability, :math:`k_s` is the smear zone horizontal
permeability
If :math:`s=1` or :math:`\\kappa=1` then u_ideal will be used.
References
----------
.. [1] Walker, R., and B. Indraratna. 2007. 'Vertical Drain Consolidation
with Overlapping Smear Zones'. Geotechnique 57 (5): 463-67.
doi:10.1680/geot.2007.57.5.463.
"""
def linear_part(n, s, kap, si):
"""u in smear zone with linear permeability i.e from si=1 to si=s"""
if np.isclose(s, kap):
term2 = -1 / si - 1 / n ** 2 * (si - 1) + 1
u = kap * term2
return u
else:
A = (kap - 1) / (s - 1)
B = (s - kap) / (s - 1)
term2 = log(si) - log(A * si + B)
term3 = A * si + B - 1 - B * log(A * si + B)
u = (1 / B * term2 - 1 / (n ** 2 * A ** 2) * term3)
return kap * u
return u
def undisturbed_part(n, s, kap, si):
"""u outside of smear zone with linear permeability i.e from si=1 to si=s"""
if np.isclose(s, kap):
term2 = log(si / s) - 1 / (2 * n ** 2) * (si ** 2 - s ** 2)
term3 = -1 / s - 1 / n ** 2 * (s - 1) + 1
u = (term2 + kap * term3)
return u
else:
A = (kap - 1) / (s - 1)
B = (s - kap) / (s - 1)
term2 = log(si / s) - 1 / (2 * n ** 2) * (si ** 2 - s ** 2)
term3 = (1 / B * log(s / kap) - 1 / (n ** 2 * A ** 2) *
(kap - 1 - B * log(kap)))
u = (term2 + kap * term3)
return u
n = np.asarray(n)
s = np.asarray(s)
kap = np.asarray(kap)
if n<=1.0:
raise ValueError('n must be greater than 1. You have n = {}'.format(
n))
if s<1.0:
raise ValueError('s must be greater than 1. You have s = {}'.format(
s))
if kap<=0.0:
raise ValueError('kap must be greater than 0. You have kap = '
'{}'.format(kap))
if s>n:
raise ValueError('s must be less than n. You have s = '
'{} and n = {}'.format(s, n))
si = np.atleast_1d(si)
if np.any((si < 1) | (si > n)):
raise ValueError('si must satisfy 1 >= si >= n)')
if np.isclose(s, 1) or np.isclose(kap, 1):
return u_ideal(n, si, uavg, uw, muw)
mu = mu_linear(n, s, kap)
term1 = (uavg - uw) / (mu + muw)
term2 = np.empty_like(si, dtype=float)
smear = (si < s)
term2[smear] = linear_part(n, s, kap, si[smear])
term2[~smear] = undisturbed_part(n, s, kap, si[~smear])
u = term1 * (term2 + muw) + uw
return u
[docs]def u_parabolic(n, s, kap, si, uavg=1, uw=0, muw=0):
"""Pore pressure at radius for parabolic smear zone
Parameters
----------
n : float
Ratio of drain influence radius to drain radius (re/rw).
s : float
Ratio of smear zone radius to drain radius (rs/rw).
kap : float
Ratio of undisturbed horizontal permeability to permeability at
the drain-soil interface (kh / ks).
si : float of ndarray of float
Normalised radial coordinate(s) at which to calc the pore pressure
i.e. si=ri/rw.
uavg : float, optional = 1
Average pore pressure in soil. default = 1. when `uw`=0 , then if
uavg=1.
uw : float, optional
Pore pressure in drain, default = 0.
muw : float, optional
Well resistance mu parameter.
Returns
-------
u : float of ndarray of float
Pore pressure at specified si.
Notes
-----
The uavg is calculated from the eta method. It is not the uavg used when
considering the vacuum as an equivalent surcharge. You would have to do
other manipulations for that.
Noteing that :math:`s_i=r_i/r_w`, the radial pore pressure distribution
in the smear zone is given by:
.. math:: u^\\prime(r) = \\frac{u_{avg}-u_w}{\\mu+\\mu_w}
\\left[{
\\frac{\\kappa}{\\kappa-1}\\left\\{{
\\frac{1}{A^2-B^2}
\\left({
\\ln\\left({s_i}\\right)
-\\frac{1}{2A}
\\left[{
\\left({A-B}\\right)F
+\\left({A+B}\\right)G
}\\right]
}\\right)
+\\frac{1}{2n^2AC}
\\left[{
\\left({A+B}\\right)F
+\\left({A-B}\\right)G
}\\right]
}\\right\\}
+\\mu_w
}\\right]+u_w
The pore pressure in the undisturbed zone is:
.. math:: u(r) = \\frac{u_{avg}-u_w}{\\mu+\\mu_w}
\\left[{
\\ln\\left({\\frac{s_i}{s}}\\right)
-\\frac{s_i^2-s^2}{2n^2}
+A^2
\\left[{
\\frac{1}{A^2-B^2}
\\left({
\\ln\\left({s}\\right)
-\\frac{1}{2}\\left[{
\\ln\\left({\\kappa}\\right)
+\\frac{BE}{A}}\\right]
}\\right)
+\\frac{1}{2n^2C^2}
\\left({\\ln\\left({\\kappa}\\right)
-\\frac{BE}{A}}\\right)
}\\right]
+\\mu_w
}\\right]+u_w
where :math:`A`, :math:`B`, :math:`C`, :math:`E`, :math:`F`, and
:math:`G` are:
.. math:: A=\\sqrt{\\frac{\\kappa}{\\kappa-1}}
.. math:: B=\\frac{s}{s-1}
.. math:: C=\\frac{1}{s-1}
.. math:: E=\\ln\\left({\\frac{A+1}{A-1}}\\right)
.. math:: F(r/r_w) = \\ln\\left({\\frac{A+B-Cs_i}{A+1}}\\right)
.. math:: G(r/r_w) = \\ln\\left({\\frac{A-B+Cs_i}{A-1}}\\right)
and:
.. math:: n = \\frac{r_e}{r_w}
.. math:: s = \\frac{r_s}{r_w}
.. math:: \\kappa = \\frac{k_h}{k_s}
:math:`r_w` is the drain radius, :math:`r_e` is the drain influence radius,
:math:`r_s` is the smear zone radius, :math:`k_h` is the undisturbed
horizontal permeability, :math:`k_s` is the smear zone horizontal
permeability
References
----------
.. [1] Walker, Rohan, and Buddhima Indraratna. 2006. 'Vertical Drain
Consolidation with Parabolic Distribution of Permeability in
Smear Zone'. Journal of Geotechnical and Geoenvironmental
Engineering 132 (7): 937-41.
doi:10.1061/(ASCE)1090-0241(2006)132:7(937).
"""
def parabolic_part(n, s, kap, si):
"""u in smear zone with parabolic permeability i.e from si=1 to si=s"""
A = sqrt((kap / (kap - 1)))
B = s / (s - 1)
C = 1 / (s - 1)
E = log((A + 1)/(A - 1))
F = log((A + B - C * si) / (A + 1))
G = log((A - B + C * si) / (A - 1))
term1 = kap / (kap - 1)
term2 = 1 / (A ** 2 - B ** 2)
term3 = log(si)
term4 = -1 / (2 * A)
term5 = (A - B) * F + (A + B) * G
term6 = term2 * (term3 + term4 * term5)
term7 = 1 / (2 * n ** 2 * A * C ** 2)
term8 = (A + B) * F + (A - B) * G
term9 = term7 * term8
u = term1 * (term6 + term9)
return u
def undisturbed_part(n, s, kap, si):
"""u outside of smear zone with parabolic permeability i.e from si=1 to si=s"""
A = sqrt((kap / (kap - 1)))
B = s / (s - 1)
C = 1 / (s - 1)
E = log((A + 1)/(A - 1))
term1 = 1
term2 = log(si / s) - 1 / (2 * n ** 2) * (si ** 2 - s ** 2)
term3 = 1 / (A ** 2 - B ** 2)
term4 = log(s) - 1 / 2 * (log(kap) + B / A * E)
term5 = 1 / (2 * n ** 2 * C ** 2)
term6 = (log(kap) - B / A * E)
term7 = kap / (kap - 1) * (term3 * term4 + term5 * term6)
u = term1 * (term2 + term7)
return u
n = np.asarray(n)
s = np.asarray(s)
kap = np.asarray(kap)
if n<=1.0:
raise ValueError('n must be greater than 1. You have n = {}'.format(
n))
if s<1.0:
raise ValueError('s must be greater than 1. You have s = {}'.format(
s))
if kap<=0.0:
raise ValueError('kap must be greater than 0. You have kap = '
'{}'.format(kap))
if s>n:
raise ValueError('s must be less than n. You have s = '
'{} and n = {}'.format(s, n))
si = np.atleast_1d(si)
if np.any((si < 1) | (si > n)):
raise ValueError('si must satisfy 1 >= si >= n)')
if np.isclose(s, 1) or np.isclose(kap, 1):
return u_ideal(n, si, uavg, uw, muw)
mu = mu_parabolic(n, s, kap)
term1 = (uavg - uw) / (mu + muw)
term2 = np.empty_like(si, dtype=float)
smear = (si < s)
term2[smear] = parabolic_part(n, s, kap, si[smear])
term2[~smear] = undisturbed_part(n, s, kap, si[~smear])
u = term1 * (term2 + muw) + uw
return u
[docs]def u_piecewise_constant(s, kap, si, uavg=1, uw=0, muw=0, n=None, kap_m=None):
"""Pore pressure at radius for piecewise constant permeability distribution
Parameters
----------
s : list or 1d ndarray of float
Ratio of segment outer radii to drain radius (r_i/r_0). The first value
of s should be greater than 1, i.e. the first value should be s_1;
s_0=1 at the drain soil interface is implied.
kap : list or ndarray of float
Ratio of undisturbed horizontal permeability to permeability in each
segment kh/khi.
si : float of ndarray of float
Normalised radial coordinate(s) at which to calc the pore pressure
i.e. si=ri/rw.
uavg : float, optional = 1
Average pore pressure in soil. default = 1. when `uw`=0 , then if
uavg=1.
uw : float, optional
Pore pressure in drain, default = 0.
muw : float, optional
Well resistance mu parameter
n, kap_m : float, optional
If `n` and `kap_m` are given then they will each be appended to `s` and
`kap`. This allows the specification of a smear zone separate to the
specification of the drain influence radius.
Default n=kap_m=None, i.e. soilpermeability is completely described
by `s` and `kap`. If n is given but kap_m is None then the last
kappa value in kap will be used.
Returns
-------
u : float of ndarray of float
Pore pressure at specified si.
Notes
-----
The pore pressure in the ith segment is given by:
.. math:: u_i(r) = \\frac{u_{avg}-u_w}{\\mu+\\mu_w}
\\left[{
\\kappa_i\\left({\\ln\\left({\\frac{r}{r_{i-1}}}\\right)
-\\frac{r^2/r_0^2-s_{i-1}^2}{2n^2}}\\right)
+\\psi_i+\\mu_w
}\\right]+u_w
where,
.. math:: \\psi_{i} = \\sum\\limits_{j=1}^{i-1}\\kappa_j
\\left[{
\\ln
\\left({
\\frac{s_j}{s_{j-1}}
}\\right)
-\\frac{s_j^2-s_{j-1}^2}{2n^2}
}\\right]
and:
.. math:: n = \\frac{r_m}{r_0}
.. math:: s_i = \\frac{r_i}{r_0}
.. math:: \\kappa_i = \\frac{k_h}{k_{hi}}
:math:`r_0` is the drain radius, :math:`r_m` is the drain influence radius,
:math:`r_i` is the outer radius of the ith segment,
:math:`k_h` is the undisturbed
horizontal permeability in the ith segment,
:math:`k_{hi}` is the horizontal
permeability in the ith segment
References
----------
.. [1] Walker, Rohan. 2006. 'Analytical Solutions for Modeling Soft Soil
Consolidation by Vertical Drains'. PhD Thesis, Wollongong, NSW,
Australia: University of Wollongong. http://ro.uow.edu.au/theses/501
.. [2] Walker, Rohan T. 2011. 'Vertical Drain Consolidation Analysis in
One, Two and Three Dimensions'. Computers and
Geotechnics 38 (8): 1069-77. doi:10.1016/j.compgeo.2011.07.006.
"""
s = np.atleast_1d(s)
kap = np.atleast_1d(kap)
if not n is None:
s_temp = np.empty(len(s) + 1, dtype=float)
s_temp[:-1] = s
s_temp[-1] = n
kap_temp = np.empty(len(kap) + 1, dtype=float)
kap_temp[:-1] = kap
if kap_m is None:
kap_temp[-1] = kap[-1]
else:
kap_temp[-1] = kap_m
s = s_temp
kap = kap_temp
if len(s)!=len(kap):
raise ValueError('s and kap must have the same shape. You have '
'lengths for s, kap of {}, {}.'.format(
len(s), len(kap)))
if np.any(s<=1.0):
raise ValueError('must have all s>=1. You have s = {}'.format(
', '.join([str(v) for v in np.atleast_1d(s)])))
if np.any(kap<=0.0):
raise ValueError('all kap must be greater than 0. You have kap = '
'{}'.format(', '.join([str(v) for v in np.atleast_1d(kap)])))
if np.any(np.diff(s) <= 0):
raise ValueError('s must increase left to right you have s = '
'{}'.format(', '.join([str(v) for v in np.atleast_1d(s)])))
n = s[-1]
si = np.atleast_1d(si)
if np.any((si < 1) | (si > n)):
raise ValueError('si must satisfy 1 >= si >= s[-1])')
s_ = np.ones_like(s)
s_[1:] = s[:-1]
u = np.empty_like(si, dtype=float )
segment = np.searchsorted(s, si)
mu = mu_piecewise_constant(s, kap)
term1 = (uavg - uw) / (mu + muw)
for ii, i in enumerate(segment):
sumj = 0
for j in range(i):
sumj += (kap[j] * (log(s[j] / s_[j])
- 0.5 * (s[j] ** 2 / n ** 2 - s_[j] ** 2 / n ** 2)))
sumj = sumj / kap[i]
u[ii] = kap[i] * (
log(si[ii] / s_[i])
- 0.5 * (si[ii] ** 2 / n ** 2 - s_[i] ** 2 / n ** 2)
+ sumj
) + muw
u *= term1
u += uw
return u
[docs]def u_piecewise_linear(s, kap, si, uavg=1, uw=0, muw=0, n=None, kap_m=None):
"""Pore pressure at radius for piecewise constant permeability distribution
Parameters
----------
s : list or 1d ndarray of float
Ratio of radii to drain radius (r_i/r_0). The first value
of s should be 1, i.e. at the drain soil interface.
kap : list or ndarray of float
Ratio of undisturbed horizontal permeability to permeability at each
value of s.
si : float of ndarray of float
Normalised radial coordinate(s) at which to calc the pore pressure
i.e. si=ri/rw.
uavg : float, optional = 1
Average pore pressure in soil. default = 1. when `uw`=0 , then if
uavg=1.
uw : float, optional
Pore pressure in drain, default = 0.
muw : float, optional
Well resistance mu parameter.
n, kap_m : float, optional
If `n` and `kap_m` are given then they will each be appended to `s` and
`kap`. This allows the specification of a smear zone separate to the
specification of the drain influence radius.
Default n=kap_m=None, i.e. soilpermeability is completely described
by `s` and `kap`. If n is given but kap_m is None then the last
kappa value in kap will be used.
Returns
-------
u : float or ndarray of float
Pore pressure at specified si.
Notes
-----
With permeability in the ith segment defined by:
.. math:: \\frac{k_i}{k_{ref}}= \\frac{1}{\\kappa_{i-1}}
\\left({A_ir/r_w+B_i}\\right)
.. math:: A_i = \\frac{\\kappa_{i-1}/\\kappa_i-1}{s_i-s_{i-1}}
.. math:: B_i = \\frac{s_i-s_{i-1}\\kappa_{i-1}/\\kappa_i}{s_i-s_{i-1}}
The pore pressure in the ith segment is given by:
.. math:: u_i(s) = \\frac{u_{avg}-u_w}{\\mu+\\mu_w}
\\left[{
\\sum\\limits_{i=1}^{m}\\kappa_{i-1}\\phi_i
+ \\Psi_i
+\\mu_w
}\\right]+u_w
where,
.. math:: \\phi_i = \\left\\{
\\begin{array}{lr}
\\ln\\left[{\\frac{s}{s_{i-1}}}\\right]
- \\frac{s^2- s_{i-1}^2}{2n^2}
& \\textrm{for } \\frac{\\kappa_{i-1}}{\\kappa_i}=1 \\\\
\\frac{\\left({s - s_{i-1}}\\right)
\\left({n^2-ss_{i-1}}\\right)}{sn^2}
& \\textrm{for }\\frac{\\kappa_{i-1}}{\\kappa_i}=
\\frac{s_i}{s_{i-1}} \\\\
\\begin{multline}
\\frac{1}{B_i}\\ln\\left[{\\frac{s}{s_{i-1}}}\\right]
+\\ln\\left[{A_is+B_i}\\right]
\\left({\\frac{B_i}{A_i^2n^2}-\\frac{1}{B_i}}\\right)
\\\\-\\frac{s-s_{i-1}}{A_i^2n^2}
\\end{multline}
& \\textrm{otherwise}
\\end{array}\\right.
.. math:: \\Psi_i = \\sum\\limits_{j=1}^{i-1}\\kappa_{j-1}\\psi_j
.. math:: \\psi_i = \\left\\{
\\begin{array}{lr}
\\ln\\left[{\\frac{s_j}{s_{j-1}}}\\right]
- \\frac{s_j^2- s_{j-1}^2}{2n^2}
& \\textrm{for } \\frac{\\kappa_{j-1}}{\\kappa_j}=1 \\\\
\\frac{\\left({s_j - s_{j-1}}\\right)
\\left({n^2-s_js_{j-1}}\\right)}{s_jn^2}
& \\textrm{for }\\frac{\\kappa_{j-1}}{\\kappa_j}=
\\frac{s_j}{s_{j-1}} \\\\
\\begin{multline}
\\frac{1}{B_i}\\ln\\left[{\\frac{s_j}{s_{j-1}}}\\right]
+\\ln\\left[{\\frac{\\kappa_{j-1}}{\\kappa_j}}\\right]
\\left({\\frac{B_j}{A_j^2n^2}-\\frac{1}{B_j}}\\right)
\\\\-\\frac{s_j-s_{j-1}}{A_j^2n^2}
\\end{multline}
& \\textrm{otherwise}
\\end{array}\\right.
and:
.. math:: n = \\frac{r_m}{r_0}
.. math:: s_i = \\frac{r_i}{r_0}
.. math:: \\kappa_i = \\frac{k_h}{k_{ref}}
:math:`r_0` is the drain radius, :math:`r_m` is the drain influence radius,
:math:`r_i` is the radius of the ith radial point,
:math:`k_{ref}` is a convienient refernce permeability, usually
the undisturbed
horizontal permeability,
:math:`k_{hi}` is the horizontal
permeability at the ith radial point
References
----------
Derived by Rohan Walker in 2011 and 2014.
Derivation steps are the same as for mu_piecewise_constant in appendix of
[1]_ but permeability is linear in a segemetn as in [2]_.
.. [1] Walker, Rohan. 2006. 'Analytical Solutions for Modeling Soft Soil
Consolidation by Vertical Drains'. PhD Thesis, Wollongong, NSW,
Australia: University of Wollongong. http://ro.uow.edu.au/theses/501
.. [2] Walker, R., and B. Indraratna. 2007. 'Vertical Drain Consolidation
with Overlapping Smear Zones'. Geotechnique 57 (5): 463-67.
doi:10.1680/geot.2007.57.5.463.
"""
s = np.atleast_1d(s)
kap = np.atleast_1d(kap)
if not n is None:
s_temp = np.empty(len(s) + 1, dtype=float)
s_temp[:-1] = s
s_temp[-1] = n
kap_temp = np.empty(len(kap) + 1, dtype=float)
kap_temp[:-1] = kap
if kap_m is None:
kap_temp[-1] = kap[-1]
else:
kap_temp[-1] = kap_m
s = s_temp
kap = kap_temp
if len(s)!=len(kap):
raise ValueError('s and kap must have the same shape. You have '
'lengths for s, kap of {}, {}.'.format(
len(s), len(kap)))
if np.any(s<1.0):
raise ValueError('must have all s>=1. You have s = {}'.format(
', '.join([str(v) for v in np.atleast_1d(s)])))
if np.any(kap<=0.0):
raise ValueError('all kap must be greater than 0. You have kap = '
'{}'.format(', '.join([str(v) for v in np.atleast_1d(kap)])))
if np.any(np.diff(s) < 0):
raise ValueError('s must increase left to right. you have s = '
'{}'.format(', '.join([str(v) for v in np.atleast_1d(s)])))
n = s[-1]
si = np.atleast_1d(si)
if np.any((si < 1) | (si > n)):
raise ValueError('si must satisfy 1 >= si >= s[-1])')
s_ = np.ones_like(s)
s_[1:] = s[:-1]
u = np.empty_like(si, dtype=float)
segment = np.searchsorted(s, si)
segment[segment==0] = 1 # put si=1 in first segment
mu = mu_piecewise_linear(s, kap)
term1 = (uavg - uw) / (mu + muw)
for ii, i in enumerate(segment):
#phi
if np.isclose(kap[i-1]/kap[i], 1.0):
phi = log(si[ii]/s[i-1]) - (si[ii]**2 - s[i-1]**2)/(2 * n**2)
elif np.isclose(kap[i-1]/kap[i], s[i]/s[i-1]):
phi = (si[ii]-s[i-1]) * (n**2 - s[i-1]*si[ii]) / (si[ii] * n**2)
else:
A = (kap[i-1] / kap[i] - 1) / (s[i] - s[i-1])
B = (s[i] - s[i-1] * kap[i-1] / kap[i])/ (s[i] - s[i-1])
phi = (1/B * log(si[ii]/s[i-1])
+ (B/A**2/n**2 - 1/B) * log(A*si[ii] + B)
- (si[ii]-s[i-1])/A/n**2)
psi = 0
for j in range(1, i):
if np.isclose(s[j - 1], s[j]):
pass
elif np.isclose(kap[j-1]/kap[j], 1.0):
psi += kap[j-1]*(log(s[j]/s[j-1]) - (s[j]**2 - s[j-1]**2)/(2 * n**2))
elif np.isclose(kap[j-1]/kap[j], s[j]/s[j-1]):
psi += kap[j-1]*((s[j]-s[j-1]) * (n**2 - s[j-1]*s[j]) / (s[j] * n**2))
else:
A = (kap[j-1] / kap[j]-1) / (s[j] - s[j-1])
B = (s[j] - s[j-1] * kap[j-1] / kap[j])/ (s[j] - s[j-1])
psi += kap[j-1]*((1/B * log(s[j]/s[j-1])
+ (B/A**2/n**2 - 1/B) * log(A*s[j] + B)
- (s[j]-s[j-1])/A/n**2))
u[ii]=kap[i-1] * phi + psi + muw
u *= term1
u += uw
return u
[docs]def re_from_drain_spacing(sp, pattern = 'Triangle'):
"""Calculate drain influence radius from drain spacing
Parameters
----------
sp : float
Distance between drain centers.
pattern : ['Triangle', 'Square'], optional
Drain installation pattern. default = 'Triangle'.
Returns
-------
re : float
drain influence radius
Notes
-----
The influence radius, :math:`r_e`, is given by:
.. math:: r_e =
\\left\\{\\begin{array}{lr}
S_p \\frac{1}{\\sqrt{\\pi}}=S_p\\times 0.564189583
& \\textrm{square pattern}\\\\
S_p \\sqrt{\\frac{\\sqrt{3}}{2\\pi}}=S_p\\times 0.525037567
& \\textrm{triangular pattern}
\\end{array}\\right.
References
----------
Eta method is described in [1]_.
.. [1] Walker, Rohan T. 2011. 'Vertical Drain Consolidation Analysis in
One, Two and Three Dimensions'. Computers and
Geotechnics 38 (8): 1069-77. doi:10.1016/j.compgeo.2011.07.006.
"""
if np.any(np.atleast_1d(sp) <= 0):
raise ValueError('sp must be greater than zero. '
'You have sp={}'.format(sp))
if pattern[0].upper()=='T':
re = 0.525037567904332 * sp # factor = (3**0.5/2/np.pi)**0.5
elif pattern[0].upper()=='S':
re = 0.5641895835477563 * sp #factor = 1 / np.pi**0.5
else:
raise ValueError("pattern must begin with 'T' for triangular "
" or 'S' for square. You have pattern="
"{}".format(pattern))
return re
[docs]def drain_eta(re, mu_function, *args, **kwargs):
"""Calculate the vertical drain eta parameter for a specific smear zone
eta = 2 / re**2 / (mu+muw)
eta is used in radial consolidation equations u= u0 * exp(-eta*kh/gamw*t)
Parameters
----------
re : float
Drain influence radius.
mu_function : obj or string
The mu_funtion to use. e.g. mu_ideal, mu_constant, mu_linear,
mu_overlapping_linear, mu_parabolic, mu_piecewise_constant,
mu_piecewise_linear. This can either be the function object itself
or the name of the function e.g. 'mu_ideal'.
muw : float, optional
Well resistance mu term, default=0.
*args, **kwargs : various
The arguments to pass to the mu_function.
Returns
-------
eta : float
Value of eta parameter
Examples
--------
>>> drain_eta(1.5, mu_ideal, 10)
0.563178340433...
>>> drain_eta(1.5, 'mu_ideal', 10)
0.5631783404334...
>>> drain_eta(1.5, mu_constant, 5, 1.5, 1.6, muw=1)
0.4115837724144...
"""
try:
mu_fn = globals()[mu_function]
except KeyError:
mu_fn = mu_function
muw = kwargs.pop('muw', 0)
eta = 2 / re**2 / (mu_fn(*args, **kwargs)+muw)
return eta
[docs]def back_calc_drain_spacing_from_eta(eta, pattern, mu_function, rw, s, kap, muw=0):
"""Back calculate the required drain spacing to achieve a given eta
eta = 2 / re**2 / (mu + muw)
eta is used in radial consolidation equations u= u0 * exp(-eta*kh/gamw*t)
Parameters
----------
eta : float
eta value.
pattern : ['Triangle', 'Square']
Drain installation pattern.
mu_function : obj
The mu_funtion to use. e.g. mu_ideal, mu_constant, mu_linear,
mu_overlapping_linear, mu_parabolic, mu_piecewise_constant,
mu_piecewise_linear.
rw : float
Drain/well radius.
s : float or 1d array_like of float
Ratio of smear zone radius to drain radius (rs/rw). s can only be
a 1d array is using a mu_piecewise function
kap : float or 1d array_like of float
Ratio of undisturbed horizontal permeability to permeability at
in smear zone (kh / ks) (often at the drain-soil interface). Be
careful when defining s and kap for mu_piecewise_constant, and
mu_piecewise_linear because the last value of kap will be used at
the influence drain periphery. In general the last value of kap
should be one, representing the start of the undisturbed zone.
muw : float, optional
Well resistance mu term, default=0.
Returns
-------
sp : float
Drain spacing to get the required eta value
re : float
Drain influence radius
n : float
Ratio of drain influence radius to drain radius, re/rw
Notes
-----
When using mu_piecewise_linear or mu_piecewise_constant only define s and
kap up to the start of the undisturbed zone. re will be varied.
For anyting other than mu_overlapping_linear do not trust any returned
spacing that gives an n value less than the extent of the smear zone.
"""
def calc_eta(sp, eta, rw, s, kap, mu_function, pattern, muw=0):
"""eta from a given spacing value
used in root finding
"""
re = re_from_drain_spacing(sp, pattern)
n = re/rw
if mu_function != mu_ideal:
if n < np.max(s):
if mu_function != mu_overlapping_linear:
raise ValueError('In determining required drain '
'spacing, n has fallen '
'below s. s={}, n={}'.format(np.max(s), n))
if mu_function in [mu_piecewise_constant, mu_piecewise_linear]:
eta_ = drain_eta(re, mu_function, s, kap, n = n, muw = muw)
else:
eta_ = drain_eta(re, mu_function, n, s, kap, muw=muw)
return eta_ - eta
from scipy.optimize import fsolve
if not mu_function in [mu_piecewise_constant, mu_piecewise_linear]:
if len(np.atleast_1d(s))>1:
raise ValueError('for mu_function={}, you cannot have multiple '
'values for s. s={}'.format(mu_function.__name__, s))
if len(np.atleast_1d(kap))>1:
raise ValueError('for mu_function={}, you cannot have multiple '
'values for kap. kap={}'.format(mu_function.__name__, kap))
x0 = rw * np.max(s) / 0.5 * 2 # this ensures guess is beyond smear zone
calc_eta(x0, eta, rw, s, kap, mu_function, pattern, muw )
sp = fsolve(calc_eta, x0,
args=(eta, rw, s, kap, mu_function, pattern, muw))
re = re_from_drain_spacing(sp[0], pattern)
n = re/rw
if mu_function != mu_ideal:
if n < np.max(s):
if mu_function != mu_overlapping_linear:
raise ValueError('calculated spacing results in n<s. s={}, n={}'.format(np.max(s), n))
return sp[0], re, n
def _g(r_rw, re_rw, nflow=1.0001, nterms=20):
"""Non-darcian equal strain radial consolidation term
Parameters
----------
r_rw : float
Ratio of radial coordinate to drain radius (r/rw).
re_rw : float
Ratio of drain influence radius to drain readius (re/rw).
You will often see this ratio expressed as re/re=n. However, this is
confusing with the non-darcian flow exponent.
nflow : float, optional
Non-Darcian flow exponent. Default nflow=1.0001 i.e. darcian flow.
Using nflow=1 will result in an error.
nterms : int, optional
Number of summation terms. Default nterms=20.
Returns
-------
g : float
Non-darcian equal strain radial consolidation term.
Notes
-----
The 'g' function arises in the derivation of equal strain radial
consolidation equations under non-Darcian flow.
We only concern ourselves with the exponential part of Hansbo's
Non-darcian flow relationship:
.. math::
v=k^{\\ast}i^{n}
where,
:math:`k^{\\ast}` is a peremability, :math:`i` is hydraulic gradient and
:math:`n` is the flow exponent.
The expression :math:`g\\left({y}\\right)` is given below. :math:`y` is
the ratio of radial coordinate :math:`r` to drain radius :math:`r_w`,
:math:`y=r/r_w`. :math:`N` is the ratio of influence radius :math:`r_e`
to drain radius :math:`r_w`, :math:`N=r_e/r_w`.
.. math::
g\\left({y}\\right)=
ny^{1-1/n}\sum\limits_{j=0}^\\infty
\\frac{\\left\\{{-1/n}\\right\\}_j}
{j!\\left({\\left({2j+1}\\right)n-1}\\right)}
\\left({\\frac{y}{N}}\\right)^{2j}
:math:`\\left\\{x\\right\\}_m` is the Pochhammer symbol or rising
factorial given by:
.. math::
\\left\\{x\\right\\}_m = x
\\left({x+1}\\right)
\\left({x+2}\\right)
\\dots
\\left({x+m-1}\\right)
.. math::
\\left\\{x\\right\\}_0=1
Alterantely a recurrance relatoin can be formed:
.. math::
g\\left({y}\\right)=
\sum\limits_{j=0}^{\\infty} a_j
where,
.. math::
a_0=\\frac{n}{n-1}y^{1-1/n}
.. math::
a_j = a_{j-1}
\\frac{\\left({jn-n-1}\\right)\\left({2jn-n-1}\\right)}
{nj\\left({2jn+n-1}\\right)}
\\left({\\frac{y}{N}}\\right)^{2}
Examples
--------
>>> _g(10.0, 50.0, nflow=1.2)
8.7841...
>>> _g(10.0, 20.0, nflow=1.2)
8.664...
>>> _g(2, 50.0, nflow=1.01)
101.694...
>>> _g(5, 5, nflow=1.01)
102.120...
>>> _g(10.0, np.array([50.0,20]), nflow=1.2)
array([8.7841..., 8.664...])
See Also
--------
_gbar : multiply _g by y and integrate w.r.t y
"""
r_rw = np.asarray(r_rw)
re_rw = np.asarray(re_rw)
nflow = np.asarray(nflow)
if np.any(r_rw < 1):
raise ValueError('r_rw must be greater or equal to 1. '
'You have r_rw = {}'.format(
', '.join([str(v) for v in np.atleast_1d(r_rw)])))
if np.any(re_rw <= 1):
raise ValueError('re_rw must be greater than 1. '
'You have re_rw = {}'.format(
', '.join([str(v) for v in np.atleast_1d(re_rw)])))
if np.any(nflow <= 1):
raise ValueError('nflow must be greater than 1. '
'You have nflow = {}'.format(
', '.join([str(v) for v in np.atleast_1d(nflow)])))
if np.any([len(np.asarray(v).shape)>0 for v in
[r_rw, re_rw, nflow, nterms]]):
#array inputs, use series loop
g = 0
term1 = nflow * r_rw**(1-1.0/nflow)
for j in range(nterms):
term2 = special.poch(-1.0 / nflow, j)
term3 = np.math.factorial(j)
term4 = (2 * j + 1) * nflow - 1
term5 = (r_rw / re_rw)**(2 * j)
g += term2 / term3 / term4 * term5
g *= term1
return g
else:
#scalar inputs, use recursion relationship
a = np.zeros(nterms)
a[0] = nflow / (nflow - 1.0) * r_rw**(1.0 - 1.0 / nflow)
j = np.arange(1, nterms)
a[1:] = (r_rw / re_rw)**2
a[1:] *= (j * nflow - nflow - 1)
a[1:] *= (2* j * nflow - nflow - 1)
a[1:] /= nflow * j * (2 * j * nflow + nflow - 1)
np.cumprod(a, out=a)
g=np.sum(a)
return g
def _gbar(r_rw, re_rw, nflow=1.0001, nterms=20):
"""Non-darcian equal strain radial consolidation term
_g expression multiplied by y and integrated w.r.t. y
Parameters
----------
r_rw : float
Ratio of radial coordinate to drain radius (r/rw).
re_rw : float
Ratio of drain influence radius to drain readius (re/rw).
You will often see this ratio expressed as re/re=n. However, this is
confusing with the non-darcian flow exponent.
nflow : int, optional
Non-Darcian flow exponent. Default nflow=1.0001 i.e. darcian flow.
Using nflow=1 will result in an error.
nterms : float, optional
Number of summation terms. Default nterms=20.
Returns
-------
gbar : float
Non-darcian equal strain radial consolidation term.
Notes
-----
The 'gbar' (bar stands for overbar) function arises in the derivation
of equal strain radial consolidation equations under non-Darcian flow.
We only concern ourselves with the exponential part of Hansbo's
Non-darcian flow relationship:
.. math::
v=k^{\\ast}i^{n}
where,
:math:`k^{\\ast}` is a peremability, :math:`i` is hydraulic gradient and
:math:`n` is the flow exponent.
The expression :math:`g\\left({y}\\right)` is given below. :math:`y` is
the ratio of radial coordinate :math:`r` to drain radius :math:`r_w`,
:math:`y=r/r_w`. :math:`N` is the ratio of influence radius :math:`r_e`
to drain radius :math:`r_w`, :math:`N=r_e/r_w`.
.. math::
\\overline{g}\\left({y}\\right)=
n^2y^{3-1/n}\sum\limits_{j=0}^\\infty
\\frac{\\left\\{{-1/n}\\right\\}_j}
{j!\\left({\\left({2j+1}\\right)n-1}\\right)
\\left({\\left({2j+3}\\right)n-1}\\right)}
\\left({\\frac{y}{N}}\\right)^{2j}
:math:`\\left\\{x\\right\\}_m` is the Pochhammer symbol or rising
factorial given by:
.. math::
\\left\\{x\\right\\}_m = x
\\left({x+1}\\right)
\\left({x+2}\\right)
\\dots
\\left({x+m-1}\\right)
.. math::
\\left\\{x\\right\\}_0=1
Alterantely a recurrance relatoin can be formed:
.. math::
\\overline{g}\\left({y}\\right)=
\sum\limits_{j=0}^{\\infty} a_j
where,
.. math::
a_0=\\frac{n^2}{\\left({n-1}\\right)\\left({3n-1}\\right)}y^{3-1/n}
.. math::
a_j = a_{j-1}
\\frac{\\left({jn-n-1}\\right)\\left({2jn-n-1}\\right)}
{nj\\left({2jn+3n-1}\\right)}
\\left({\\frac{y}{N}}\\right)^{2}
Examples
--------
>>> _gbar(10.0, 50.0, nflow=1.2)
405.924...
>>> _gbar(10.0, 20.0, nflow=1.2)
403.0541...
>>> _gbar(2, 50.0, nflow=1.01)
202.3883...
>>> _gbar(5, 5, nflow=1.01)
1273.3329...
>>> _gbar(10.0, np.array([50.0,20]), nflow=1.2)
array([405.924..., 403.0541...])
See Also
--------
_g : earlier step in derivation of `_gbar`.
"""
r_rw = np.asarray(r_rw)
re_rw = np.asarray(re_rw)
nflow = np.asarray(nflow)
if np.any(r_rw < 1):
raise ValueError('r_rw must be greater or equal to 1. '
'You have r_rw = {}'.format(
', '.join([str(v) for v in np.atleast_1d(r_rw)])))
if np.any(re_rw <= 1):
raise ValueError('re_rw must be greater than 1. '
'You have re_rw = {}'.format(
', '.join([str(v) for v in np.atleast_1d(re_rw)])))
if np.any(nflow <= 1):
raise ValueError('nflow must be greater than 1. '
'You have nflow = {}'.format(
', '.join([str(v) for v in np.atleast_1d(nflow)])))
if np.any([len(np.asarray(v).shape)>0 for v in
[r_rw, re_rw, nflow, nterms]]):
#array inputs, use series loop
gbar = 0
term1 = nflow**2 * r_rw**(3 - 1.0/nflow)
for j in range(nterms):
term2 = special.poch(-1.0 / nflow, j)
term3 = np.math.factorial(j)
term4 = (2 * j + 1) * nflow - 1
term4a = (2 * j + 3) * nflow - 1
term5 = (r_rw/re_rw)**(2*j)
gbar += term2/term3/term4/term4a*term5
gbar *= term1
return gbar
else:
a = np.zeros(nterms)
a[0] = nflow**2 / (nflow - 1.0)/(3 * nflow - 1.0) * r_rw**(3.0 - 1.0 / nflow)
j = np.arange(1, nterms)
a[1:] = (r_rw / re_rw)**2
a[1:] *= (j * nflow - nflow - 1)
a[1:] *= (2* j * nflow - nflow - 1)
a[1:] /= nflow * j * (2 * j * nflow + 3 * nflow - 1)
np.cumprod(a, out=a)
gbar=np.sum(a)
return gbar
[docs]def non_darcy_beta_ideal(n, nflow=1.0001, nterms=20, *args):
"""Non-darcian flow smear zone permeability/geometry parameter for
ideal drain (no smear).
beta parameter is in equal strain radial consolidation equations with
non-Darcian flow.
Parameters
----------
n : float or ndarray of float
Ratio of drain influence radius to drain radius (re/rw).
nflow : float, optional
non_darcian flow exponent
nterms : int, optional
Number of terms to use in series
args : anything
`args` does not contribute to any calculations it is merely so you
can have other arguments such as s and kappa which are used in other
smear zone formulations.
Returns
-------
beta : float
Smear zone permeability/geometry parameter.
Notes
-----
.. math::
\\beta = \\frac{1}{N^2-1}
\\left({
2\\overline{g}\\left({N}\\right)
-2\\overline{g}\\left({1}\\right)
-g\\left({1}\\right) \\left({N^2-1}\\right)
}\\right)
:math:`g\\left({y}\\right)` and :math:`\\overline{g}\\left({y}\\right)`
are described in the `_g` and `_gbar` functions respectively.
.. math:: n = \\frac{r_e}{r_w}
:math:`r_w` is the drain radius, :math:`r_e` is the drain influence radius.
Examples
--------
>>> non_darcy_beta_ideal(20, 1.000001, nterms=20)
2.2538...
>>> non_darcy_beta_ideal(np.array([20, 10]), 1.000001, nterms=20)
array([2.253..., 1.578...])
>>> non_darcy_beta_ideal(15, 1.3)
2.618...
>>> non_darcy_beta_ideal(np.array([20, 15]), np.array([1.000001,1.3]), nterms=20)
array([2.253..., 2.618...])
See Also
--------
_g : used in this function.
_gbar : used in this function.
References
----------
.. [1] Hansbo, S. 1981. "Consolidation of Fine-Grained Soils by
Prefabricated Drains". In 10th ICSMFE, 3:677-82.
Rotterdam-Boston: A.A. Balkema.
.. [2] Walker, R., B. Indraratna, and C. Rujikiatkamjorn.
"Vertical Drain Consolidation with Non-Darcian Flow and
Void-Ratio-Dependent Compressibility and Permeability."
Geotechnique 62, no. 11 (November 1, 2012): 985-97.
doi:10.1680/geot.10.P.084.
"""
n = np.asarray(n)
nflow = np.asarray(nflow)
if np.any(n <= 1):
raise ValueError('n must be greater than 1. '
'You have n = {}'.format(
', '.join([str(v) for v in np.atleast_1d(n)])))
if np.any(nflow <= 1):
raise ValueError('nflow must be greater than 1. '
'You have nflow = {}'.format(
', '.join([str(v) for v in np.atleast_1d(nflow)])))
# if nflow==1:
# raise ValueError('nflow must not be 1.')
## if n <= 1:
## raise ValueError('n must be greater than 1. You have n = {}'.format(
## n))
# if np.any(n <= 1):
# raise ValueError('n must be greater than 1. You have n = {}'.format(
# ', '.join([str(v) for v in np.atleast_1d(n)])))
# beta = _g(1, n, nflow, nterms)
# beta *= n**2 - 1
# beta += 2 * _gbar(n, n, nflow, nterms)
# beta -= 2 * _gbar(1, n, nflow, nterms)
# beta /= n**2 - 1
# g = _g2
# gbar = _gbar2
beta = -_g(1, n, nflow, nterms)
beta *= n**2 - 1
beta += 2 * _gbar(n, n, nflow, nterms)
beta -= 2 * _gbar(1, n, nflow, nterms)
beta /= n**2 - 1
return beta
[docs]def non_darcy_beta_constant(n, s, kap, nflow=1.0001, nterms=20, *args):
"""Non-darcian flow smear zone permeability/geometry parameter for
smear zone with constant permeability.
beta parameter is in equal strain radial consolidation equations with
non-Darcian flow.
Parameters
----------
n : float or ndarray of float
Ratio of drain influence radius to drain radius (re/rw).
s : float or ndarray of float
Ratio of smear zone radius to drain radius (rs/rw)
kap : float or ndarray of float.
Ratio of undisturbed horizontal permeability to smear zone
horizontal permeanility (kh / ks).
nflow : float, optional
non_darcian flow exponent
nterms : int, optional
Number of terms to use in series
args : anything
`args` does not contribute to any calculations it is merely so you
can have other arguments such as s and kappa which are used in other
smear zone formulations.
Returns
-------
beta : float
Smear zone permeability/geometry parameter.
Notes
-----
.. math::
\\beta = \\frac{1}{N^2-1}
\\left({
\\begin{multline}
2\\overline{g}\\left({N}\\right)
-\\kappa^{1/n}\\left({
2\\overline{g}\\left({1}\\right)
+ g\\left({1}\\right) \\left({N^2-1}\\right)
}\\right) \\\\
+\\left({\\kappa^{1/n}-1}\\right)\\left({
2\\overline{g}\\left({s}\\right)
+ g\\left({s}\\right) \\left({N^2-s^2}\\right)
}\\right)
\\end{multline}
}\\right)
:math:`g\\left({y}\\right)` and :math:`\\overline{g}\\left({y}\\right)`
are described in the `_g` and `_gbar` functions respectively.
.. math:: n = \\frac{r_e}{r_w}
.. math:: s = \\frac{r_s}{r_w}
.. math:: \\kappa = \\frac{k_h}{k_s}
:math:`r_w` is the drain radius, :math:`r_e` is the drain influence radius,
:math:`r_s` is the smear zone radius, :math:`k_h` is the undisturbed
horizontal permeability, :math:`k_s` is the smear zone horizontal
permeability.
Examples
--------
>>> non_darcy_beta_constant(20,1,1, 1.000001, nterms=20)
2.2538...
>>> non_darcy_beta_constant(20,5,5, 1.000001, nterms=20)
8.4710...
>>> non_darcy_beta_constant(15, 5, 4, 1.3, nterms=20)
6.1150...
>>> non_darcy_beta_constant(np.array([20, 15]), 5,
... np.array([5,4]), np.array([1.000001, 1.3]), nterms=20)
array([8.471..., 6.1150...])
See Also
--------
_g : used in this function.
_gbar : used in this function.
References
----------
.. [1] Hansbo, S. 1981. "Consolidation of Fine-Grained Soils by
Prefabricated Drains". In 10th ICSMFE, 3:677-82.
Rotterdam-Boston: A.A. Balkema.
.. [2] Walker, R., B. Indraratna, and C. Rujikiatkamjorn.
"Vertical Drain Consolidation with Non-Darcian Flow and
Void-Ratio-Dependent Compressibility and Permeability."
Geotechnique 62, no. 11 (November 1, 2012): 985-97.
doi:10.1680/geot.10.P.084.
"""
n = np.asarray(n)
s = np.asarray(s)
kap = np.asarray(kap)
nflow = np.asarray(nflow)
if np.any(n <= 1):
raise ValueError('n must be greater than 1. '
'You have n = {}'.format(
', '.join([str(v) for v in np.atleast_1d(n)])))
if np.any(s < 1):
raise ValueError('s must be greater or equal to 1. '
'You have n = {}'.format(
', '.join([str(v) for v in np.atleast_1d(s)])))
if np.any(kap < 1):
raise ValueError('kap must be greater or equal to 1. '
'You have kap = {}'.format(
', '.join([str(v) for v in np.atleast_1d(kap)])))
if np.any(nflow <= 1):
raise ValueError('nflow must be greater than 1. '
'You have nflow = {}'.format(
', '.join([str(v) for v in np.atleast_1d(nflow)])))
beta = 2 * _gbar(n, n, nflow, nterms)
beta -= kap**(1 / nflow) * (
2 * _gbar(1, n, nflow, nterms)
+ _g(1, n, nflow, nterms) * (n**2 - 1))
beta += (kap**(1 / nflow) - 1) * (
2 * _gbar(s, n, nflow, nterms)
+ _g(s, n, nflow, nterms) * (n**2 - s**2))
beta /= n**2 - 1
return beta
[docs]def non_darcy_beta_piecewise_constant(s, kap, n=None, kap_m=None,
nflow=1.0001, nterms=20, *args):
"""Non-darcian flow smear zone permeability/geometry parameter for
smear zone with piecewise constant permeability.
beta parameter is in equal strain radial consolidation equations with
non-Darcian flow.
Parameters
----------
s : list or 1d ndarray of float
Ratio of segment outer radii to drain radius (r_i/r_0). The first value
of s should be greater than 1, i.e. the first value should be s_1;
s_0=1 at the drain soil interface is implied.
kap : list or ndarray of float
Ratio of undisturbed horizontal permeability to permeability in each
segment kh/khi.
n, kap_m : float, optional
If `n` and `kap_m` are given then they will each be appended to `s` and
`kap`. This allows the specification of a smear zone separate to the
specification of the drain influence radius.
Default n=kap_m=None, i.e. soil permeability is completely described
by `s` and `kap`. If n is given but kap_m is None then the last
kappa value in kap will be used.
nflow : float, optional
non_darcian flow exponent
nterms : int, optional
Number of terms to use in series
Returns
-------
beta : float
Smear zone permeability/geometry parameter.
Notes
-----
The non-darcian smear zone parameter :math:`\\beta` is given by:
.. math:: \\beta = \\frac{1}{\\left({n^2-1}\\right)}
\\sum\\limits_{i=1}^{m} \\kappa^{1/n}_i
\\left[{
2\\overline{g}\\left({s_i}\\right)
-2\\overline{g}\\left({s_{i-1}}\\right)
}\\right]
+\\psi_i \\left({s_i^2-s_{i-1}^2}\\right)
where,
.. math:: \\psi_{i} = \\sum\\limits_{j=1}^{i-1}\\kappa^{1/n}_j
\\left[{
g\\left({s_j}\\right)
-g\\left({s_{j-1}}\\right)
}\\right]
and:
.. math:: n = \\frac{r_m}{r_0}
.. math:: s_i = \\frac{r_i}{r_0}
.. math:: \\kappa_i = \\frac{k_h}{k_{hi}}
:math:`r_0` is the drain radius, :math:`r_m` is the drain influence radius,
:math:`r_i` is the outer radius of the ith segment,
:math:`k_h` is the undisturbed
horizontal permeability in the ith segment,
:math:`k_{hi}` is the horizontal
permeability in the ith segment
Examples
--------
>>> mu_piecewise_constant([1.5, 3, 4],[2, 3, 1], n=5)
2.2533...
>>> non_darcy_beta_piecewise_constant(s=np.array([1.5, 3, 4]),
... kap=np.array([2, 3, 1]), n=5, nflow=1.000001)
2.2533...
References
----------
None because it is new.
"""
s = np.atleast_1d(s)
kap = np.atleast_1d(kap)
if not n is None:
s_temp = np.empty(len(s) + 1, dtype=float)
s_temp[:-1] = s
s_temp[-1] = n
kap_temp = np.empty(len(kap) + 1, dtype=float)
kap_temp[:-1] = kap
if kap_m is None:
kap_temp[-1] = kap[-1]
else:
kap_temp[-1] = kap_m
s = s_temp
kap = kap_temp
if len(s)!=len(kap):
raise ValueError('s and kap must have the same shape. You have '
'lengths for s, kap of {}, {}.'.format(
len(s), len(kap)))
if np.any(s<=1.0):
raise ValueError('must have all s>=1. You have s = {}'.format(
', '.join([str(v) for v in np.atleast_1d(s)])))
if np.any(kap<=0.0):
raise ValueError('all kap must be greater than 0. You have kap = '
'{}'.format(', '.join([str(v) for v in np.atleast_1d(kap)])))
if np.any(np.diff(s) <= 0):
raise ValueError('s must increase left to right you have s = '
'{}'.format(', '.join([str(v) for v in np.atleast_1d(s)])))
if np.any(nflow <= 1):
raise ValueError('nflow must be greater than 1. '
'You have nflow = {}'.format(
', '.join([str(v) for v in np.atleast_1d(nflow)])))
n = s[-1]
s_ = np.ones_like(s , dtype=float)
s_[1:] = s[:-1]
sumi = 0
for i in range(len(s)):
psi = 0
for j in range(i):
psi+= kap[j]**(1 / nflow) *(
_g(s[j], n, nflow, nterms)
- _g(s_[j], n, nflow, nterms)
)
psi /= kap[i]**(1 / nflow)
sumi += kap[i]**(1 / nflow) * (
2 * _gbar(s[i], n, nflow, nterms)
- 2 * _gbar(s_[i], n, nflow, nterms)
+(psi - _g(s_[i], n, nflow, nterms) )* (s[i]**2 - s_[i]**2)
)
beta = sumi / (n**2 - 1)
return beta
[docs]def non_darcy_u_piecewise_constant(s, kap, si, uavg=1, uw=0, muw=0,
n=None, kap_m=None,
nflow=1.0001, nterms=20):
"""Pore pressure at radius for piecewise constant permeability distribution
.. warning::
`muw` must always be zero. i.e. no well resistance (It exists to have
the same inputs as `u_piecewise_constant`.
Parameters
----------
s : list or 1d ndarray of float
Ratio of segment outer radii to drain radius (r_i/r_0). The first value
of s should be greater than 1, i.e. the first value should be s_1;
s_0=1 at the drain soil interface is implied.
kap : list or ndarray of float
Ratio of undisturbed horizontal permeability to permeability in each
segment kh/khi.
si : float of ndarray of float
Normalised radial coordinate(s) at which to calc the pore pressure
i.e. si=ri/rw.
uavg : float, optional = 1
Average pore pressure in soil. default = 1. when `uw`=0 , then if
uavg=1.
uw : float, optional
Pore pressure in drain, default = 0.
muw : float, optional
Well resistance mu parameter. Default = 0
n, kap_m : float, optional
If `n` and `kap_m` are given then they will each be appended to `s` and
`kap`. This allows the specification of a smear zone separate to the
specification of the drain influence radius.
Default n=kap_m=None, i.e. soilpermeability is completely described
by `s` and `kap`. If n is given but kap_m is None then the last
kappa value in kap will be used.
nflow : float, optional
non_darcian flow exponent
nterms : int, optional
Number of terms to use in series
Returns
-------
u : float of ndarray of float
Pore pressure at specified si.
Notes
-----
non_darcy_u_piecewise_constant()
The pore pressure in the ith segment is given by:
.. math:: u_i(y) = \\frac{u_{avg}-u_w}{\\mu+\\mu_w}
\\left[{
\\kappa^{1/n}_i
\\left({
g\\left({y}\\right)
-g\\left({s_{i-1}}\\right)
}\\right)
+\\psi_i
}\\right]+u_w
where,
.. math:: \\psi_{i} = \\sum\\limits_{j=1}^{i-1}\\kappa^{1/n}_j
\\left[{
g\\left({s_j}\\right)
-g\\left({s_{j-1}}\\right)
}\\right]
and:
:math:`g\\left({y}\\right)` is described in the `_g` function
.. math:: y = \\frac{r}{r_0}
.. math:: n = \\frac{r_m}{r_0}
.. math:: s_i = \\frac{r_i}{r_0}
.. math:: \\kappa_i = \\frac{k_h}{k_{hi}}
:math:`r_0` is the drain radius, :math:`r_m` is the drain influence radius,
:math:`r_i` is the outer radius of the ith segment,
:math:`k_h` is the undisturbed
horizontal permeability in the ith segment,
:math:`k_{hi}` is the horizontal
permeability in the ith segment
Examples
--------
>>> u_piecewise_constant([1.5, 3,], [2, 3], 1.6, n=5, kap_m=1)
array([0.4153...])
>>> non_darcy_u_piecewise_constant([1.5, 3,], [2, 3], 1.6, n=5, kap_m=1,
... nflow=1.0000001)
array([0.4153...])
>>> non_darcy_u_piecewise_constant([1.5, 3,], [2, 3], 1.6, n=5, kap_m=1,
... nflow=1.3)
array([0.3865...])
References
----------
none because it is new.
"""
s = np.atleast_1d(s)
kap = np.atleast_1d(kap)
if not n is None:
s_temp = np.empty(len(s) + 1, dtype=float)
s_temp[:-1] = s
s_temp[-1] = n
kap_temp = np.empty(len(kap) + 1, dtype=float)
kap_temp[:-1] = kap
if kap_m is None:
kap_temp[-1] = kap[-1]
else:
kap_temp[-1] = kap_m
s = s_temp
kap = kap_temp
if len(s)!=len(kap):
raise ValueError('s and kap must have the same shape. You have '
'lengths for s, kap of {}, {}.'.format(
len(s), len(kap)))
if np.any(s<=1.0):
raise ValueError('must have all s>=1. You have s = {}'.format(
', '.join([str(v) for v in np.atleast_1d(s)])))
if np.any(kap<=0.0):
raise ValueError('all kap must be greater than 0. You have kap = '
'{}'.format(', '.join([str(v) for v in np.atleast_1d(kap)])))
if np.any(np.diff(s) <= 0):
raise ValueError('s must increase left to right you have s = '
'{}'.format(', '.join([str(v) for v in np.atleast_1d(s)])))
if np.any(nflow <= 1):
raise ValueError('nflow must be greater than 1. '
'You have nflow = {}'.format(
', '.join([str(v) for v in np.atleast_1d(nflow)])))
n = s[-1]
si = np.atleast_1d(si)
if np.any((si < 1) | (si > n)):
raise ValueError('si must satisfy 1 >= si >= s[-1])')
s_ = np.ones_like(s)
s_[1:] = s[:-1]
u = np.empty_like(si, dtype=float )
segment = np.searchsorted(s, si)
beta = non_darcy_beta_piecewise_constant(s, kap,
nflow=nflow, nterms=nterms)
term1 = (uavg - uw) / (beta + muw)
for ii, i in enumerate(segment):
psi = 0
for j in range(i):
psi+= kap[j]**(1 / nflow) *(
_g(s[j], n, nflow, nterms)
- _g(s_[j], n, nflow, nterms)
)
psi /= kap[i]**(1 / nflow)
# sumj += (kap[j] * (log(s[j] / s_[j])
# - 0.5 * (s[j] ** 2 / n ** 2 - s_[j] ** 2 / n ** 2)))
# sumj = sumj / kap[i]
u[ii] = kap[i]**(1 / nflow) * (
_g(si[ii], n, nflow, nterms)
-_g(s_[i], n, nflow, nterms)
+ psi
) + muw
# u[ii] = kap[i] * (
# log(si[ii] / s_[i])
# - 0.5 * (si[ii] ** 2 / n ** 2 - s_[i] ** 2 / n ** 2)
# + sumj
# ) + muw
u *= term1
u += uw
return u
[docs]def non_darcy_drain_eta(re, iL, gamw, beta_function, *args, **kwargs):
"""For non-Darcy flow calculate the vertical drain eta parameter
eta = 2 / (re**2 * beta**nflow * (rw * gamw)**(nflow-1) * nflow * iL**(nflow-1))
nflow will be obtained from the **kwargs. rw will be back calculated
from the n parameter (n=re/rw) which is usually the first of the *arg parameters
or one of the **kwargs
Note that eta is used in radial consolidation equations:
[strain rate] = (u - uw)**n * k / gamw * eta
Compare with the Darcian case of (eta terms are calculated differerntly
for Darcy and non-Darcy cases):
[strain rate] = (u - uw) * k / gamw * eta
Note that `non_darcy_drain_eta` only uses the exponential portion of the
Non-Darcian flow relationship. If hydraulic gradients are greater than
iL then the flow rates will be overestimated.
Parameters
----------
re : float
Drain influence radius.
iL : float
Limiting hydraulic gradient beyond which flow follows Darcy's law.
gamw : float
Unit weight of water. Usually gamw=10 kN/m**3 or gamw=9.807 kN/m**3.
beta_function : obj or string
The non_darcy_beta function to use. e.g. non_darcy_beta_ideal
non_darcy_beat_constant, non_darcy_piecewise_constant.
This can either be the function object itself
or the name of the function e.g. 'non_darcy_beta_ideal'.
*args, **kwargs : various
The arguments to pass to the beta_function.
Returns
-------
eta : float
Value of eta parameter for non-Darcian flow
Examples
--------
>>> non_darcy_drain_eta(re=1.5, iL=10, gamw=10,
... beta_function='non_darcy_beta_ideal', n=15, nflow=1.3, nterms=20)
0.09807...
>>> non_darcy_drain_eta(1.5, 10, 10,
... 'non_darcy_beta_ideal', 15, nflow=1.3, nterms=20)
0.09807...
>>> non_darcy_drain_eta(re=1.5, iL=10, gamw=10,
... beta_function='non_darcy_beta_ideal', n=np.array([20.0, 15.0]),
... nflow=np.array([1.000001, 1.3]), nterms=20)
array([0.3943..., 0.0980...])
"""
# beta_function is object or string
try:
beta_fn = globals()[beta_function]
except KeyError:
beta_fn = beta_function
# extract n=re/rw from the **kwargs dict or 1st element of the *arg list
try:
n = kwargs['n']
except:
n = args[0]
rw = re / n
nflow = kwargs['nflow']
beta = beta_fn(*args, **kwargs)
eta = 2 / (re**2 * beta**nflow * (rw * gamw)**(nflow - 1)
* nflow * iL**(nflow - 1))
return eta
########################################################################
#scratch()
[docs]def scratch():
"""scratch pad for testing latex markup for docstrings
"""
#scratch()
pass
if __name__ == '__main__':
# watch()
import nose
nose.runmodule(argv=['nose', '--verbosity=3', '--with-doctest', '--doctest-options=+ELLIPSIS'])
eta = 5
pattern = 't'
mu_function = mu_overlapping_linear
rw = 0.05
s = 5#[5,6]
kap = 2#[2,1]
muw = 1
print(back_calc_drain_spacing_from_eta(eta, pattern, mu_function, rw, s, kap, muw))
#u_constant()
#k_overlapping_linear(()
scratch()
# print('lin',u_linear(5,2,3,[1.5,4]))
# print('pwise', u_piecewise_linear([1,2,5],[3,1,1],[1.5,4]))
# x = np.array(
# [1., 1.06779661, 1.13559322, 1.20338983, 1.27118644,
# 1.33898305, 1.40677966, 1.47457627, 1.54237288, 1.61016949,
# 1.6779661 , 1.74576271, 1.81355932, 1.88135593, 1.94915254,
# 2.01694915, 2.08474576, 2.15254237, 2.22033898, 2.28813559,
# 2.3559322 , 2.42372881, 2.49152542, 2.55932203, 2.62711864,
# 2.69491525, 2.76271186, 2.83050847, 2.89830508, 2.96610169,
# 3.03389831, 3.10169492, 3.16949153, 3.23728814, 3.30508475,
# 3.37288136, 3.44067797, 3.50847458, 3.57627119, 3.6440678 ,
# 3.71186441, 3.77966102, 3.84745763, 3.91525424, 3.98305085,
# 4.05084746, 4.11864407, 4.18644068, 4.25423729, 4.3220339 ,
# 4.38983051, 4.45762712, 4.52542373, 4.59322034, 4.66101695,
# 4.72881356, 4.79661017, 4.86440678, 4.93220339, 5., 30 ])
#
# y = 1.0/np.array(
# [0.5 , 0.50847458, 0.51694915, 0.52542373, 0.53389831,
# 0.54237288, 0.55084746, 0.55932203, 0.56779661, 0.57627119,
# 0.58474576, 0.59322034, 0.60169492, 0.61016949, 0.61864407,
# 0.62711864, 0.63559322, 0.6440678 , 0.65254237, 0.66101695,
# 0.66949153, 0.6779661 , 0.68644068, 0.69491525, 0.70338983,
# 0.71186441, 0.72033898, 0.72881356, 0.73728814, 0.74576271,
# 0.75423729, 0.76271186, 0.77118644, 0.77966102, 0.78813559,
# 0.79661017, 0.80508475, 0.81355932, 0.8220339 , 0.83050847,
# 0.83898305, 0.84745763, 0.8559322 , 0.86440678, 0.87288136,
# 0.88135593, 0.88983051, 0.89830508, 0.90677966, 0.91525424,
# 0.92372881, 0.93220339, 0.94067797, 0.94915254, 0.95762712,
# 0.96610169, 0.97457627, 0.98305085, 0.99152542, 1., 1. ])
#
# mu_piecewise_linear(x,y)
# mu_overlapping_linear(np.array([5,10]),
# np.array([7, 12]),
# np.array([1.6, 1.5,]))
# mu_piecewise_linear([1, 5],
# [1, 1])
#
# s=80
# n=18
# kap=8
# x = np.linspace(1,n,50)
# y = k_overlapping_linear(n,s, kap, x)
# plt.plot(x,y)
# plt.gca().grid()
# plt.show()
#
# xp = np.array(
# [1., 1.06779661, 1.13559322, 1.20338983, 1.27118644,
# 1.33898305, 1.40677966, 1.47457627, 1.54237288, 1.61016949,
# 1.6779661 , 1.74576271, 1.81355932, 1.88135593, 1.94915254,
# 2.01694915, 2.08474576, 2.15254237, 2.22033898, 2.28813559,
# 2.3559322 , 2.42372881, 2.49152542, 2.55932203, 2.62711864,
# 2.69491525, 2.76271186, 2.83050847, 2.89830508, 2.96610169,
# 3.03389831, 3.10169492, 3.16949153, 3.23728814, 3.30508475,
# 3.37288136, 3.44067797, 3.50847458, 3.57627119, 3.6440678 ,
# 3.71186441, 3.77966102, 3.84745763, 3.91525424, 3.98305085,
# 4.05084746, 4.11864407, 4.18644068, 4.25423729, 4.3220339 ,
# 4.38983051, 4.45762712, 4.52542373, 4.59322034, 4.66101695,
# 4.72881356, 4.79661017, 4.86440678, 4.93220339, 5., 30 ])
#
# yp = 1.0/np.array(
# [ 0.5 , 0.51680552, 0.53332376, 0.54955473, 0.56549842,
# 0.58115484, 0.59652399, 0.61160586, 0.62640046, 0.64090779,
# 0.65512784, 0.66906061, 0.68270612, 0.69606435, 0.70913531,
# 0.72191899, 0.7344154 , 0.74662453, 0.75854639, 0.77018098,
# 0.7815283 , 0.79258834, 0.8033611 , 0.8138466 , 0.82404481,
# 0.83395576, 0.84357943, 0.85291583, 0.86196495, 0.8707268 ,
# 0.87920138, 0.88738868, 0.89528871, 0.90290147, 0.91022695,
# 0.91726515, 0.92401609, 0.93047975, 0.93665613, 0.94254525,
# 0.94814708, 0.95346165, 0.95848894, 0.96322896, 0.9676817 ,
# 0.97184717, 0.97572537, 0.97931629, 0.98261994, 0.98563631,
# 0.98836541, 0.99080724, 0.99296179, 0.99482907, 0.99640908,
# 0.99770181, 0.99870727, 0.99942545, 0.99985636, 1., 1. ])
#
#
#
# n=30
# s=5
# kap=2
# muw=0
# uw=-0.2
# x = np.linspace(1, s, 60)
# y = k_linear(n, s, kap, x)
#
# x = np.linspace(1, n, 400)
# y = u_ideal(n,x, uw=uw,muw=muw)
# y2 = u_parabolic(n,s,kap,x, uw=uw,muw=muw)
# y3 = u_linear(n,s,kap,x, uw=uw,muw=muw)
# y4 = u_constant(n,s,kap,x, uw=uw,muw=muw)
# y5 = u_piecewise_constant([s,n], [kap,1],x, uw=uw,muw=muw)
## y6 = u_piecewise_linear([1,s,s,n], [kap,kap,1,1], x, uw=uw,muw=muw)
##
## y7 = u_piecewise_linear([1,s,n], [kap,1,1], x, uw=uw,muw=muw)
## y8 = u_piecewise_linear(xp, yp, x, uw=uw,muw=muw)
## print(repr(x))
## print(repr(y))
# plt.plot(x,y, '-',label='ideal')
# plt.plot(x, y2, '--',label='para')
# plt.plot(x, y3, dashes=[5,2,2,2],label='lin')
# plt.plot(x, y4, dashes=[8,2],label='const')
# plt.plot(x, y5,'+',ms=2, label='pwisec')
## plt.plot(x, y6,'o',ms=3, label='pwisel')
## plt.plot(x, y7,'^',ms=3, label='pwisel_lin')
## plt.plot(x, y8,'^',ms=3, label='pwisel_para')
# leg=plt.gca().legend(loc=4)
# plt.gca().grid()
# plt.show()
mu_piecewise_constant([1.5,5],
[1.6,1])
scratch()
print(mu_parabolic(30,5,2))
print(k_parabolic(30, 5, 2, [1, 1.13559322]))
k_parabolic(20,1,2,[4,6,7])
# mu_linear()
# nose.runmodule(argv=['nose', '--verbosity=3'])
# print(mu_ideal(0.5))
# print(mu_linear(np.array([50,100]),
# np.array([10,20]),
# np.array([5,3])))