Пример #1
0
 def test_constant(self):
     assert_allclose(mu_constant(np.array([5,10,20,50,100]),
                                 np.array([1.5, 2, 1, 4, 8]),
                                 np.array([1.6, 1, 5, 0.4, 4])),
                     [1.159679143, 1.578343528,
                      2.253865374, 2.335174298,
                      10.07573309])
Пример #2
0
 def test_ideal(self):
     assert_allclose(mu_constant(np.array([5,10,20,50,100]),
                                 np.array([1,1,1,1,1]),
                                 np.array([5,10,20,50,100])),
                     [0.936497825, 1.578343528,
                      2.253865374, 3.163688441,
                      3.855655749])
Пример #3
0
def luetal2010(z,
               t,
               rc,
               re,
               H=1,
               rs=None,
               ks=None,
               kv=1.0,
               kvc=1.0,
               kh=1.0,
               khc=1.0,
               mvs=0.1,
               mvc=0.1,
               gamw=10,
               utop=1,
               ubot=1,
               nterms=100):
    """Composite foundation considering radial and vert flows in the column

    An implementation of [1]_.

    Features:

     - Single layer, soil properties constant over time.
     - Instant load linear with depth.
     - Vertical and radial flow in in soil
     - Vertical and radial flow in drain/column
     - Different stiffness in column and soil
     - Pore pressure in soil, column and averaged at depth
     - Average pore pressure over whole profile vs time
     - Settlement of whole profile vs time


    Parameters
    ----------
    z : float or 1d array/list of float
        Depth.
    t : float or 1d array/list of float
        Time.
    rc : float
        Drain radius
    re : float
        Drain influence radius.
    H : float, optional
        Drainage path length.  Default H=1.
    rs : float, optional
        Drain influence radius.  Default rs=None i.e. no smear zone.
    ks : float, optional
        Smear zone permeability. Default ks=None, i.e. no smear zone.
    kv, kvc : float, optional
        Vertical coefficient of permeability in soil and column.
        Default kv= kvc = 1
    kh, khc : float, optional
        Horizontal coefficient of permeability in soil and column.
        default kh = khc = 1
    mvs, mvc : float, optional
        Volume compressibility in soil and column. default mvs=mvc=0.1.
    gamw : float, optional
        Unit weight of water.  Default gamw=10.
    utop, ubot : float, optional
        Initial pore water pressure at top and bottom of soil.
        Default utop=ubot=1.
    nterms : int, optional
        Number of terms to use in solution. Default=100.

    Returns
    -------
    por, pors, porc : 2d array of float
        Pore pressure at depth and time overall, in soil, in column.
        por is an array of size (len(z), len(t)).
    avp : 2d array of float
        Average overall pore pressure of whole soil profile.
    settle : 2d array of float
        Settlement of whole layer.

    References
    ----------
    .. [1] Lu, Meng-Meng, Kang-He Xie, and Biao Guo. 2010. 'Consolidation
           Theory for a Composite Foundation Considering Radial and Vertical
           Flows within the Column and the Variation of Soil Permeability
           within the Disturbed Soil Zone'. Canadian Geotechnical
           Journal 47 (2): 207-17. doi:10.1139/T09-086.

    """

    t = np.atleast_1d(t)
    z = np.atleast_1d(z)

    #    ch = kh / mv / gamw
    n = re / rc
    Y = mvs / mvc

    #    Th = ch * t / 4 / re**2

    if ks is None or rs is None:
        mu0 = smear_zones.mu_ideal(n)
    else:
        s = rs / rc
        kap = kh / ks
        mu0 = smear_zones.mu_constant(n, s, kap)

    M = ((2 * np.arange(nterms) + 1) / 2 * np.pi)
    betm_numer = n**2 * mu0 / 2 * kvc / kh
    betm_numer += (n**2 - 1) / 8 * kvc / khc
    betm_numer *= (rc / H)**2 * M**2
    betm_numer += n**2 - 1 + kvc / kv
    betm_numer *= kv / mvs * (n**2 - 1 + Y)

    betm_denom = n**2 * mu0 / 2 * kv / kh
    betm_denom += (n**2 - 1) / 8 * kv / khc
    betm_denom *= (n**2 - 1) * kvc / kv + 1
    betm_denom += n**4 / M**2 * (H / rc)**2
    betm_denom *= gamw * rc**2

    betm = betm_numer / betm_denom

    C = re**2 * mu0 / 2 / kh
    C += rc**2 * (n**2 - 1) / 8 / khc
    C *= gamw * ((n**2 - 1) * kvc + kv) * mvs
    C /= (n**2 - 1 + Y) * (kvc - kv)

    D = re**2 * mu0 / 2 / kh
    D += rc**2 * (n**2 - 1) / 8 / khc
    D *= kv * kvc / (kvc - kv)

    minus1 = np.ones_like(M)
    minus1[1::2] = -1

    por = (2 / M[None, None, :] * (utop - minus1[None, None, :] *
                                   (utop - ubot) / M[None, None, :]) *
           np.sin(M[None, None, :] * z[:, None, None] / H) *
           np.exp(-betm[None, None, :] * t[None, :, None]))

    pors = por * (1 +
                  (C * H**2 * betm[None, None, :] - D * M[None, None, :]**2) /
                  (H**2 * (n**2 - 1)))

    porc = por * (1 - C * betm[None, None, :] + D * M[None, None, :]**2 / H**2)

    por = np.sum(por, axis=2)
    pors = np.sum(pors, axis=2)
    porc = np.sum(porc, axis=2)

    avp = (2 / M[None, :]**2 * (utop - minus1[None, :] *
                                (utop - ubot) / M[None, :]) *
           np.exp(-betm[None, :] * t[:, None]))
    avp = np.sum(avp, axis=1)

    settle = (utop + ubot) / 2 - avp
    settle *= H * mvs * n**2 / (n**2 - 1 + Y)

    return por, pors, porc, avp, settle
Пример #4
0
    #    mvs=0.1
    #    mvc=mvs/200
    #    gamw=10
    #    utop=1
    #    ubot=1
    #    nterms=100
    #    z= np.linspace(0,H,50)
    #    t = np.array([0.1, 0.8, 2.0])
    #    t = np.logspace(-2,0.5, 30)

    por, pors, porc, avp, settle = luetal2010(z, t, rc, re, H, rs, ks, kv, kvc,
                                              kh, khc, mvs, mvc, gamw, utop,
                                              ubot, nterms)

    if 1:
        mu = smear_zones.mu_constant(re / rc, rs / rc, kh / ks)
        print('mu', mu)
        print('\npor', repr(por))
        print('\npors', repr(pors))
        print('\nporc', repr(porc))
        print('\navp', repr(avp))
        print('\nset', repr(settle))

    labels = [
        'Overall pore pressure', 'column pore pressure', 'Soil pore pressure'
    ]
    for p, lab in zip([por, porc, pors], labels):
        fig = plt.figure()
        ax = fig.add_subplot(1, 1, 1)
        for j, t_ in enumerate(t):
            ax.plot(p[:, j], z, marker='o', label="t={0:.3g}".format(t[j]))
Пример #5
0
def luetal2010(z, t, rc, re, H=1, rs=None, ks=None,
               kv=1.0, kvc=1.0, kh=1.0, khc=1.0,
               mvs=0.1, mvc=0.1, gamw=10, utop=1, ubot=1, nterms=100):
    """Composite foundation considering radial and vert flows in the column

    An implementation of [1]_.

    Features:

     - Single layer, soil properties constant over time.
     - Instant load linear with depth.
     - Vertical and radial flow in in soil
     - Vertical and radial flow in drain/column
     - Different stiffness in column and soil
     - Pore pressure in soil, column and averaged at depth
     - Average pore pressure over whole profile vs time
     - Settlement of whole profile vs time


    Parameters
    ----------
    z : float or 1d array/list of float
        Depth.
    t : float or 1d array/list of float
        Time.
    rc : float
        Drain radius
    re : float
        Drain influence radius.
    H : float, optional
        Drainage path length.  Default H=1.
    rs : float, optional
        Drain influence radius.  Default rs=None i.e. no smear zone.
    ks : float, optional
        Smear zone permeability. Default ks=None, i.e. no smear zone.
    kv, kvc : float, optional
        Vertical coefficient of permeability in soil and column.
        Default kv= kvc = 1
    kh, khc : float, optional
        Horizontal coefficient of permeability in soil and column.
        default kh = khc = 1
    mvs, mvc : float, optional
        Volume compressibility in soil and column. default mvs=mvc=0.1.
    gamw : float, optional
        Unit weight of water.  Default gamw=10.
    utop, ubot : float, optional
        Initial pore water pressure at top and bottom of soil.
        Default utop=ubot=1.
    nterms : int, optional
        Number of terms to use in solution. Default=100.

    Returns
    -------
    por, pors, porc : 2d array of float
        Pore pressure at depth and time overall, in soil, in column.
        por is an array of size (len(z), len(t)).
    avp : 2d array of float
        Average overall pore pressure of whole soil profile.
    settle : 2d array of float
        Settlement of whole layer.

    References
    ----------
    .. [1] Lu, Meng-Meng, Kang-He Xie, and Biao Guo. 2010. 'Consolidation
           Theory for a Composite Foundation Considering Radial and Vertical
           Flows within the Column and the Variation of Soil Permeability
           within the Disturbed Soil Zone'. Canadian Geotechnical
           Journal 47 (2): 207-17. doi:10.1139/T09-086.

    """


    t = np.atleast_1d(t)
    z = np.atleast_1d(z)

#    ch = kh / mv / gamw
    n = re / rc
    Y = mvs / mvc


#    Th = ch * t / 4 / re**2

    if ks is None or rs is None:
        mu0 = smear_zones.mu_ideal(n)
    else:
        s = rs / rc
        kap = kh / ks
        mu0 = smear_zones.mu_constant(n, s, kap)

    M = ((2 * np.arange(nterms) + 1) / 2 * np.pi)
    betm_numer = n**2 * mu0 / 2 * kvc / kh
    betm_numer += (n**2 - 1) / 8 *kvc / khc
    betm_numer *= (rc / H) ** 2 * M**2
    betm_numer += n**2 - 1 + kvc/kv
    betm_numer *= kv / mvs * (n**2 - 1 + Y)

    betm_denom = n**2 * mu0 / 2 * kv / kh
    betm_denom += (n**2 - 1) / 8 * kv / khc
    betm_denom *= (n**2 - 1) * kvc / kv + 1
    betm_denom += n**4 / M**2 * (H / rc)**2
    betm_denom *= gamw * rc**2

    betm = betm_numer / betm_denom

    C = re**2 * mu0 / 2 / kh
    C += rc**2 * (n**2 - 1)/ 8 / khc
    C *= gamw * ((n**2 - 1)*kvc + kv) * mvs
    C /= (n**2 - 1 + Y) * (kvc - kv)

    D = re**2 * mu0 / 2 / kh
    D += rc**2 * (n**2 - 1)/ 8 / khc
    D *= kv * kvc / (kvc - kv)

    minus1 = np.ones_like(M)
    minus1[1::2] = -1

    por = (2 / M[None, None, :] *
            (utop - minus1[None, None, :] * (utop - ubot)/ M[None, None, :]) *
            np.sin(M[None, None, :] * z[:, None, None]/H) *
            np.exp(-betm[None, None, :] * t[None, :, None]))

    pors = por * (1 + (C * H**2 * betm[None, None, :] - D * M[None, None, :]**2) /
            (H**2 * (n**2 - 1)))

    porc = por * (1 - C * betm[None, None, :]
                    + D * M[None, None, :]**2 / H**2)

    por = np.sum(por, axis=2)
    pors = np.sum(pors, axis=2)
    porc = np.sum(porc, axis=2)

    avp = (2 / M[None, :]**2 *
            (utop - minus1[None, :] * (utop-ubot)/ M[None, :]) *
            np.exp(-betm[None, :] * t[:, None]))
    avp = np.sum(avp, axis=1)

    settle = (utop + ubot)/2 - avp
    settle *= H * mvs * n**2 / (n**2 - 1 + Y)

    return por, pors, porc, avp, settle
Пример #6
0
def dengetal2013(z, t, rw, re, A1=1, A2=0, A3=0, H=1, rs=None, ks=None,
                 kw0=1e10, kh=1, mv=0.1, gamw=10, ui=1):
    """Radial consolidation with depth and time dependent well resistance

    Implementation of [1]_.

    Features:

     - Radial flow to drain (no vertical flow in soil)
     - Vertical flow in drain.
     - Linear depth variation of drain permeability in time.
     - Exponential decrease in drain peremability with time.
     - Uses approximate (like Hansbo) method to solve pore pressure in drain.
     - Radially averaged pore pressure at depth and time in soil.



    Drain pereability is kw = kw0 * (A1 - A2 * z / H) * exp(-A3 * t)


    Parameters
    ----------
    z : float or 1d array/list of float
        Depth.
    t : float or 1d array/list of float
        Time.
    rw : float
        Drain radius.
    re : float
        Drain influence radius.
    A1 : float, optional
        Parameter controlling depth dependance of well resistance.
        Default A1=1.
    A2 : float, optional
        Parameter controlling depth dependance of well resistance.
        Default A2=0.
    A3 : float, optional
        Parameter controlling time dependance of well resistance.
        Default A3=0.
    H : float, optional
        Drainage path length.  Default H=1.
    rs : float, optional
        Drain influence radius. Default rs=None i.e. no smear zone.
    ks : float, optional
        Smear zone permeability. Default ks=None, i.e. no smear zone.
    kw0 : float, optional
        Initial well permeability.  Default kw0=1e10 i.e. ideal drain.
    kh : float, optional
        Horizontal coefficient of permeability.  Default kh=1.
    mv : float, optional
        Volume compressibility.  Default mv=0.1.
    gamw : float, optional
        Unit weight of water.  Default gamw=10.
    ui : float, optional
        Initial uniform pore water pressure.  Default ui=1.

    Returns
    -------
    por : 2d array of float
        Pore pressure at depth and time.  `por` is an array of size
        (len(z), len(t)).

    References
    ----------
    .. [1] Deng, Yue-Bao, Kang-He Xie, and Meng-Meng Lu. 2013. 'Consolidation
           by Vertical Drains When the Discharge Capacity Varies
           with Depth and Time'. Computers and Geotechnics 48 (March): 1-8.
           doi:10.1016/j.compgeo.2012.09.012.

    """


    if A1 < 0:
        raise ValueError("A1 must be greater than 0.  "
                         "You have A1={}".format(A1))
    if A2 > A1:
        raise ValueError("A2 must be less than A1.  "
                         "You have A1={}, A2={}".format(A1, A2))
    if A3 < 0:
        raise ValueError("A3 must be greater than or equal to 0.  "
                         "You have A3={}".format(A3))
    t = np.atleast_1d(t)
    z = np.atleast_1d(z)

    ch = kh / mv / gamw
    n = re / rw

    qw0 = kw0 * np.pi * rw**2

    Th = ch * t / 4 / re**2

    if ks is None or rs is None:
        mu0 = smear_zones.mu_ideal(n)
    else:
        s = rs / rw
        kap = kh / ks
        mu0 = smear_zones.mu_constant(n, s, kap)

    if A3 == 0 and A2 == 0:
        # qw is constant
        mus = mu0 + np.pi * kh / (qw0 * A1) * (2 * H * z - z ** 2)
        por = ui * np.exp(-8 * Th[None, :] / mus[:, None])
        return por

    if A3 == 0 and A2 > 0:
        # qw varies with depth
        mu1 = A2 * z / H + (A1 - A2)*np.log(1 - A2 / A1 * z / H)
        mu1 *= 2 * np.pi * kh * H**2 / (qw0 * A2**2)
        mu1 += mu0
        por = ui * np.exp(-8 * Th[None, :] / mu1[:, None])
        return por

    if A3 > 0 and A2 == 0:
        # qw varies with time
        a3 = A3 * 4 * re**2 / ch
        alp0 = qw0 * A1 * mu0 / (np.pi * kh * (2*H*z - z**2))
        por = (ui * ((1+alp0[:, None] * np.exp(-a3 * Th[None, :])) /
              (1+alp0[:, None])) ** (8/(a3 * mu0)))
        return por

    if A3 > 0 and A2 > 0:
        # qw varies with depth and time:
        a3 = A3 * 4 * re**2 / ch
        alp = mu0 * qw0 * A2**2 / (2 * np.pi * H**2 * kh)
        alp /= A2* z / H + (A1 - A2) * np.log(1 - A2 / A1 * z / H)
        por = (ui * ((1+alp[:, None] * np.exp(-a3 * Th[None, :])) /
              (1+alp[:, None])) ** (8/(a3 * mu0)))
        return por
Пример #7
0
#    gamw=10
#    utop=1
#    ubot=1
#    nterms=100
#    z= np.linspace(0,H,50)
#    t = np.array([0.1, 0.8, 2.0])
#    t = np.logspace(-2,0.5, 30)


    por, pors, porc, avp, settle = luetal2010(
                z,t, rc, re, H, rs, ks,
                 kv, kvc, kh, khc,
                 mvs, mvc, gamw, utop, ubot, nterms)

    if 1:
        mu = smear_zones.mu_constant(re/rc, rs/rc, kh/ks)
        print('mu', mu)
        print('\npor', repr(por))
        print('\npors', repr(pors))
        print('\nporc', repr(porc))
        print('\navp', repr(avp))
        print('\nset', repr(settle))

    labels = ['Overall pore pressure', 'column pore pressure', 'Soil pore pressure']
    for p, lab in zip([por, porc, pors], labels):
        fig=plt.figure()
        ax = fig.add_subplot(1,1,1)
        for j, t_ in enumerate(t):
            ax.plot(p[:,j], z, marker='o', label="t={0:.3g}".format(t[j]))

        ax.set_xlabel(lab)
Пример #8
0
def dengetal2014(z, t, rw, re, A3=0, H=1, rs=None, ks=None,
                 kw0=1e10, kh=1, mv=0.1, gamw=10, ui=1, nterms=100):
    """Radial consolidation with time dependent well resistance

    An implementation of [1]_

    Features:

     - Single layer, soil properties constant over time.
     - Instant load uniform with depth.
     - Radial flow to drain (no vertical flow in soil)
     - Vertical flow in drain.
     - Exponential decrease in drain peremability with time.
     - Uses rigorous (infintite sum ) method to solve pore pressure in drain.
     - Radially averaged pore pressure at depth and time in soil.


    Drain permeability is kw = kw0 * exp(-A3 * t)


    Parameters
    ----------
    z : float or 1d array/list of float
        Depth.
    t : float or 1d array/list of float
        Time.
    rw : float
        Drain radius.
    re : float
        Drain influence radius.
    A3 : float, optional
        Parameter controlling time dependance of well resistance.
        Default A3=0.
    H : float, optional
        Drainage path length.  Default H=1.
    rs : float, optional
        Drain influence radius. Default rs=None i.e. no smear zone.
    ks : float, optional
        Smear zone permeability. Default ks=None, i.e. no smear zone.
    kw0 : float, optional
        Initial well permeability.  Default kw0=1e10 i.e. ideal drain.
    kh : float, optional
        Horizontal coefficient of permeability.  Default kh=1.
    mv : float, optional
        Volume compressibility.  Default mv=0.1.
    gamw : float, optional
        Unit weight of water.  Default gamw=10.
    ui : float, optional
        Initial uniform pore water pressure.  Default ui=1.
    nterms : int, optional
        number of summation terms, default = 100.

    Returns
    -------
    por : 2d array of float
        Pore pressure at depth and time.  `por` is an array of size
        (len(z), len(t)).

    References
    ----------
    .. [1] Deng, Yue-Bao, Gan-Bin Liu, Meng-Meng Lu,
           and Kang-he Xie. 'Consolidation Behavior of Soft Deposits
           Considering the Variation of Prefabricated Vertical Drain
           Discharge Capacity'. Computers and Geotechnics 62
           (October 2014): 310-16. doi:10.1016/j.compgeo.2014.08.006.
    """


    if A3 < 0:
        raise ValueError("A3 must be greater than or equal to 0.  "
                         "You have A3={}".format(A3))
    t = np.atleast_1d(t)
    z = np.atleast_1d(z)

    ch = kh / mv / gamw
    n = re / rw

    qw0 = kw0 * np.pi * rw**2

    Th = ch * t / 4 / re**2



    if ks is None or rs is None:
        mu0 = smear_zones.mu_ideal(n)
    else:
        s = rs / rw
        kap = kh / ks
        mu0 = smear_zones.mu_constant(n, s, kap)


    a3 = A3 * 4 * re**2 / ch

    G0 = np.pi * kh * H**2 / 4 / qw0
    M = ((2 * np.arange(nterms) + 1) / 2 * np.pi)
    C0 = M**2*mu0/8/G0 * n**2/ (n**2-1)
    alp0 = qw0 * mu0 / (np.pi * kh * (2*H*z - z**2))

    Th = Th[np.newaxis, :, np.newaxis]

    M = M[np.newaxis, np.newaxis, :]
    C0 = C0[np.newaxis, np.newaxis, :]
    Z = (z / H)[:, np.newaxis, np.newaxis]

    por = (2 / M * np.sin(M * Z) * ((1+C0 * np.exp(-a3 * Th))/
          (1 + C0))**(8 / (a3 * mu0)))
    por = ui * np.sum(por, axis=2)

    return por
Пример #9
0
        z = np.linspace(0, 20, 100)
        Th = np.array([0.1, 1.0])
        rw=0.035
        rs = 0.175

        re=0.525
        gamw = 10
        mv=0.2e-3
        kh=2e-8
        ks = kh/1.8
        kw0 = 1e-3
        ch = kh / mv / gamw
        t = Th * 4 * re**2 / ch


        mu0 = smear_zones.mu_constant(re/rw, rs/rw, kh/ks)
        print('mu0', mu0)
        print('et', 2/mu0/re**2)
        for A2 in [0.1,1.0]:
            por = dengetal2013(z, t, rw=rw, re=re, A1=1, A2=A2, A3=0, H=20,
                          rs=rs, ks=ks, kw0=kw0, kh=kh, mv=mv, gamw=10, ui=1)
            for j, t_ in enumerate(t):
                uz0 = np.exp(-8*Th[j]/mu0)
                plt.plot(por[:,j], z, label="m Th={0:.3g}, A2={1:.3g}".format(Th[j], A2))
                plt.plot(uz0,0, marker='o', ms=14)

        for key, val in res.items():
            x = val[:,0]
            y = val[:,1]*20
            plt.plot(x,y, label=key, marker='s', linestyle='None')
Пример #10
0
def dengetal2013(z,
                 t,
                 rw,
                 re,
                 A1=1,
                 A2=0,
                 A3=0,
                 H=1,
                 rs=None,
                 ks=None,
                 kw0=1e10,
                 kh=1,
                 mv=0.1,
                 gamw=10,
                 ui=1):
    """Radial consolidation with depth and time dependent well resistance

    Implementation of [1]_.

    Features:

     - Radial flow to drain (no vertical flow in soil)
     - Vertical flow in drain.
     - Linear depth variation of drain permeability in time.
     - Exponential decrease in drain peremability with time.
     - Uses approximate (like Hansbo) method to solve pore pressure in drain.
     - Radially averaged pore pressure at depth and time in soil.



    Drain pereability is kw = kw0 * (A1 - A2 * z / H) * exp(-A3 * t)


    Parameters
    ----------
    z : float or 1d array/list of float
        Depth.
    t : float or 1d array/list of float
        Time.
    rw : float
        Drain radius.
    re : float
        Drain influence radius.
    A1 : float, optional
        Parameter controlling depth dependance of well resistance.
        Default A1=1.
    A2 : float, optional
        Parameter controlling depth dependance of well resistance.
        Default A2=0.
    A3 : float, optional
        Parameter controlling time dependance of well resistance.
        Default A3=0.
    H : float, optional
        Drainage path length.  Default H=1.
    rs : float, optional
        Drain influence radius. Default rs=None i.e. no smear zone.
    ks : float, optional
        Smear zone permeability. Default ks=None, i.e. no smear zone.
    kw0 : float, optional
        Initial well permeability.  Default kw0=1e10 i.e. ideal drain.
    kh : float, optional
        Horizontal coefficient of permeability.  Default kh=1.
    mv : float, optional
        Volume compressibility.  Default mv=0.1.
    gamw : float, optional
        Unit weight of water.  Default gamw=10.
    ui : float, optional
        Initial uniform pore water pressure.  Default ui=1.

    Returns
    -------
    por : 2d array of float
        Pore pressure at depth and time.  `por` is an array of size
        (len(z), len(t)).

    References
    ----------
    .. [1] Deng, Yue-Bao, Kang-He Xie, and Meng-Meng Lu. 2013. 'Consolidation
           by Vertical Drains When the Discharge Capacity Varies
           with Depth and Time'. Computers and Geotechnics 48 (March): 1-8.
           doi:10.1016/j.compgeo.2012.09.012.

    """

    if A1 < 0:
        raise ValueError("A1 must be greater than 0.  "
                         "You have A1={}".format(A1))
    if A2 > A1:
        raise ValueError("A2 must be less than A1.  "
                         "You have A1={}, A2={}".format(A1, A2))
    if A3 < 0:
        raise ValueError("A3 must be greater than or equal to 0.  "
                         "You have A3={}".format(A3))
    t = np.atleast_1d(t)
    z = np.atleast_1d(z)

    ch = kh / mv / gamw
    n = re / rw

    qw0 = kw0 * np.pi * rw**2

    Th = ch * t / 4 / re**2

    if ks is None or rs is None:
        mu0 = smear_zones.mu_ideal(n)
    else:
        s = rs / rw
        kap = kh / ks
        mu0 = smear_zones.mu_constant(n, s, kap)

    if A3 == 0 and A2 == 0:
        # qw is constant
        mus = mu0 + np.pi * kh / (qw0 * A1) * (2 * H * z - z**2)
        por = ui * np.exp(-8 * Th[None, :] / mus[:, None])
        return por

    if A3 == 0 and A2 > 0:
        # qw varies with depth
        mu1 = A2 * z / H + (A1 - A2) * np.log(1 - A2 / A1 * z / H)
        mu1 *= 2 * np.pi * kh * H**2 / (qw0 * A2**2)
        mu1 += mu0
        por = ui * np.exp(-8 * Th[None, :] / mu1[:, None])
        return por

    if A3 > 0 and A2 == 0:
        # qw varies with time
        a3 = A3 * 4 * re**2 / ch
        alp0 = qw0 * A1 * mu0 / (np.pi * kh * (2 * H * z - z**2))
        por = (ui * ((1 + alp0[:, None] * np.exp(-a3 * Th[None, :])) /
                     (1 + alp0[:, None]))**(8 / (a3 * mu0)))
        return por

    if A3 > 0 and A2 > 0:
        # qw varies with depth and time:
        a3 = A3 * 4 * re**2 / ch
        alp = mu0 * qw0 * A2**2 / (2 * np.pi * H**2 * kh)
        alp /= A2 * z / H + (A1 - A2) * np.log(1 - A2 / A1 * z / H)
        por = (ui * ((1 + alp[:, None] * np.exp(-a3 * Th[None, :])) /
                     (1 + alp[:, None]))**(8 / (a3 * mu0)))
        return por
Пример #11
0
def dengetal2014(z,
                 t,
                 rw,
                 re,
                 A3=0,
                 H=1,
                 rs=None,
                 ks=None,
                 kw0=1e10,
                 kh=1,
                 mv=0.1,
                 gamw=10,
                 ui=1,
                 nterms=100):
    """Radial consolidation with time dependent well resistance

    An implementation of [1]_

    Features:

     - Single layer, soil properties constant over time.
     - Instant load uniform with depth.
     - Radial flow to drain (no vertical flow in soil)
     - Vertical flow in drain.
     - Exponential decrease in drain peremability with time.
     - Uses rigorous (infintite sum ) method to solve pore pressure in drain.
     - Radially averaged pore pressure at depth and time in soil.


    Drain permeability is kw = kw0 * exp(-A3 * t)


    Parameters
    ----------
    z : float or 1d array/list of float
        Depth.
    t : float or 1d array/list of float
        Time.
    rw : float
        Drain radius.
    re : float
        Drain influence radius.
    A3 : float, optional
        Parameter controlling time dependance of well resistance.
        Default A3=0.
    H : float, optional
        Drainage path length.  Default H=1.
    rs : float, optional
        Drain influence radius. Default rs=None i.e. no smear zone.
    ks : float, optional
        Smear zone permeability. Default ks=None, i.e. no smear zone.
    kw0 : float, optional
        Initial well permeability.  Default kw0=1e10 i.e. ideal drain.
    kh : float, optional
        Horizontal coefficient of permeability.  Default kh=1.
    mv : float, optional
        Volume compressibility.  Default mv=0.1.
    gamw : float, optional
        Unit weight of water.  Default gamw=10.
    ui : float, optional
        Initial uniform pore water pressure.  Default ui=1.
    nterms : int, optional
        number of summation terms, default = 100.

    Returns
    -------
    por : 2d array of float
        Pore pressure at depth and time.  `por` is an array of size
        (len(z), len(t)).

    References
    ----------
    .. [1] Deng, Yue-Bao, Gan-Bin Liu, Meng-Meng Lu,
           and Kang-he Xie. 'Consolidation Behavior of Soft Deposits
           Considering the Variation of Prefabricated Vertical Drain
           Discharge Capacity'. Computers and Geotechnics 62
           (October 2014): 310-16. doi:10.1016/j.compgeo.2014.08.006.
    """

    if A3 < 0:
        raise ValueError("A3 must be greater than or equal to 0.  "
                         "You have A3={}".format(A3))
    t = np.atleast_1d(t)
    z = np.atleast_1d(z)

    ch = kh / mv / gamw
    n = re / rw

    qw0 = kw0 * np.pi * rw**2

    Th = ch * t / 4 / re**2

    if ks is None or rs is None:
        mu0 = smear_zones.mu_ideal(n)
    else:
        s = rs / rw
        kap = kh / ks
        mu0 = smear_zones.mu_constant(n, s, kap)

    a3 = A3 * 4 * re**2 / ch

    G0 = np.pi * kh * H**2 / 4 / qw0
    M = ((2 * np.arange(nterms) + 1) / 2 * np.pi)
    C0 = M**2 * mu0 / 8 / G0 * n**2 / (n**2 - 1)
    alp0 = qw0 * mu0 / (np.pi * kh * (2 * H * z - z**2))

    Th = Th[np.newaxis, :, np.newaxis]

    M = M[np.newaxis, np.newaxis, :]
    C0 = C0[np.newaxis, np.newaxis, :]
    Z = (z / H)[:, np.newaxis, np.newaxis]

    por = (2 / M * np.sin(M * Z) * ((1 + C0 * np.exp(-a3 * Th)) /
                                    (1 + C0))**(8 / (a3 * mu0)))
    por = ui * np.sum(por, axis=2)

    return por
Пример #12
0
        z = np.linspace(0, 20, 100)
        Th = np.array([0.1, 1.0])
        rw = 0.035
        rs = 0.175

        re = 0.525
        gamw = 10
        mv = 0.2e-3
        kh = 2e-8
        ks = kh / 1.8
        kw0 = 1e-3
        ch = kh / mv / gamw
        t = Th * 4 * re**2 / ch

        mu0 = smear_zones.mu_constant(re / rw, rs / rw, kh / ks)
        print('mu0', mu0)
        print('et', 2 / mu0 / re**2)
        for A2 in [0.1, 1.0]:
            por = dengetal2013(z,
                               t,
                               rw=rw,
                               re=re,
                               A1=1,
                               A2=A2,
                               A3=0,
                               H=20,
                               rs=rs,
                               ks=ks,
                               kw0=kw0,
                               kh=kh,