Example #1
0
def shanetal2014_3_layers_instant():
    """Test speccon1d_unsat against 3laye eg from Shan et al. (2014)

    Shan et al (2014) 'Analytical solution for the 1D
        consolidation of unsaturated multi-layered soil'

    test data is digitized from article

    dsig=?kPa instantly


    other data:
    h = [3,4,3] (m)
    n = [0.45, 0.5, 0.4] (Porosity)
    S = [0.8, 0.6, 0.7] (Saturation)
    kw = [1e-10, 1e-9, 1e-10] (m/s)
    ka = [1e-9, 1e-8, 1e-9] (m/s)
    m1s = -2.5e-4 (1/kPa)
    m2s / m1s = 0.4
    m1w / m1s = 0.2
    m2w/m1w = 4
    #m1s = m1a + m1w
    #m2s = m2a + m2w
    gamw = 10,000 N/m3
    uatm = ua_ = 101kPa
    T = 293.16 K
    R = 8.31432J/molK
    wa = 29x10**3 kg/mol

    """

    t_for_z_vs_uw = np.array([1e1, 1e3, 1e4, 1e6, 1e8, 1e9])
    #uw is uw/q0
    uw_for_z_vs_uw = [
        [
            0.001, 0.288, 0.386, 0.401, 0.401, 0.401, 0.401, 0.38, 0.354,
            0.341, 0.331, 0.327, 0.326, 0.327, 0.328, 0.327, 0.335, 0.356,
            0.368, 0.368, 0.369, 0.37
        ],
        [
            0.001, 0.191, 0.249, 0.279, 0.33, 0.38, 0.395, 0.401, 0.401, 0.401,
            0.396, 0.381, 0.364, 0.35, 0.339, 0.333, 0.328, 0.328, 0.328,
            0.331, 0.334, 0.336, 0.351, 0.363, 0.37, 0.37, 0.37, 0.369
        ],
        [
            0.001, 0.234, 0.251, 0.285, 0.319, 0.339, 0.357, 0.361, 0.354,
            0.345, 0.341, 0.34, 0.339, 0.337, 0.336, 0.337, 0.338, 0.339,
            0.347, 0.357, 0.361, 0.368, 0.37
        ],
        [
            0., 0.06, 0.118, 0.168, 0.214, 0.246, 0.255, 0.258, 0.264, 0.265,
            0.266, 0.267, 0.267, 0.267, 0.268, 0.269, 0.269
        ],
        [
            0., 0.046, 0.087, 0.121, 0.159, 0.201, 0.208, 0.213, 0.216, 0.229,
            0.236, 0.24, 0.242
        ],
        [
            0.003, 0.01, 0.018, 0.028, 0.036, 0.038, 0.039, 0.039, 0.04, 0.045,
            0.046, 0.047
        ],
    ]
    #z is z/H
    z_for_z_vs_uw = [
        [
            0., 0.002, 0.004, 0.013, 0.125, 0.205, 0.29, 0.297, 0.299, 0.299,
            0.31, 0.319, 0.407, 0.523, 0.655, 0.69, 0.7, 0.702, 0.71, 0.755,
            0.877, 0.976
        ],
        [
            0.002, 0.002, 0.006, 0.007, 0.028, 0.058, 0.078, 0.105, 0.147,
            0.202, 0.237, 0.26, 0.279, 0.29, 0.3, 0.37, 0.429, 0.478, 0.576,
            0.625, 0.677, 0.707, 0.725, 0.745, 0.779, 0.832, 0.919, 0.986
        ],
        [
            0.002, 0.006, 0.007, 0.038, 0.078, 0.11, 0.158, 0.202, 0.25, 0.289,
            0.305, 0.36, 0.437, 0.508, 0.563, 0.625, 0.682, 0.703, 0.743, 0.79,
            0.832, 0.882, 0.944
        ],
        [
            0.002, 0.009, 0.017, 0.029, 0.046, 0.064, 0.086, 0.148, 0.257,
            0.303, 0.466, 0.566, 0.67, 0.703, 0.81, 0.894, 0.999
        ],
        [
            0.003, 0.067, 0.121, 0.174, 0.235, 0.298, 0.435, 0.564, 0.7, 0.792,
            0.855, 0.947, 1.001
        ],
        [
            0.002, 0.072, 0.149, 0.219, 0.299, 0.437, 0.572, 0.667, 0.704,
            0.815, 0.893, 0.997
        ],
    ]

    t_for_z_vs_ua = np.array([1e1, 1e3, 1e4, 1e5, 1e6])
    ua_for_z_vs_ua = [
        [
            0., 0.119, 0.183, 0.2, 0.201, 0.201, 0.202, 0.189, 0.153, 0.119,
            0.108, 0.102, 0.102, 0.102, 0.105, 0.113, 0.129, 0.143, 0.154,
            0.159, 0.159, 0.159, 0.159, 0.159
        ],
        [
            0., 0.027, 0.065, 0.094, 0.128, 0.157, 0.179, 0.191, 0.197, 0.201,
            0.201, 0.201, 0.202, 0.201, 0.198, 0.189, 0.179, 0.166, 0.15,
            0.135, 0.123, 0.117, 0.11, 0.107, 0.104, 0.103, 0.102, 0.103,
            0.104, 0.106, 0.108, 0.11, 0.114, 0.122, 0.13, 0.138, 0.147, 0.154,
            0.158, 0.16, 0.16, 0.16
        ],
        [
            0., 0.016, 0.04, 0.057, 0.086, 0.114, 0.132, 0.142, 0.147, 0.148,
            0.146, 0.139, 0.127, 0.122, 0.119, 0.118, 0.116, 0.116, 0.116,
            0.117, 0.117, 0.125, 0.137, 0.144, 0.152, 0.156, 0.158, 0.159,
            0.159
        ],
        [
            0., 0.021, 0.048, 0.063, 0.075, 0.089, 0.103, 0.105, 0.108, 0.11,
            0.111, 0.113, 0.114, 0.118, 0.122, 0.125, 0.129, 0.129
        ],
        [
            0., 0.006, 0.012, 0.02, 0.021, 0.022, 0.022, 0.022, 0.024, 0.025,
            0.025
        ],
    ]

    z_for_z_vs_ua = [
        [
            0., 0.003, 0.008, 0.012, 0.023, 0.161, 0.283, 0.295, 0.298, 0.303,
            0.31, 0.318, 0.396, 0.676, 0.693, 0.699, 0.702, 0.702, 0.707,
            0.716, 0.772, 0.853, 0.914, 0.969
        ],
        [
            0., 0.005, 0.016, 0.024, 0.035, 0.047, 0.061, 0.078, 0.086, 0.107,
            0.12, 0.154, 0.178, 0.198, 0.225, 0.246, 0.261, 0.269, 0.283,
            0.295, 0.3, 0.323, 0.367, 0.4, 0.446, 0.491, 0.515, 0.546, 0.583,
            0.617, 0.648, 0.67, 0.7, 0.709, 0.716, 0.728, 0.74, 0.757, 0.779,
            0.816, 0.887, 0.976
        ],
        [
            0.003, 0.01, 0.031, 0.048, 0.074, 0.103, 0.135, 0.155, 0.181,
            0.201, 0.228, 0.251, 0.284, 0.3, 0.369, 0.42, 0.48, 0.542, 0.605,
            0.665, 0.704, 0.731, 0.772, 0.802, 0.853, 0.899, 0.938, 0.971,
            0.998
        ],
        [
            0., 0.061, 0.136, 0.175, 0.214, 0.26, 0.298, 0.357, 0.464, 0.542,
            0.626, 0.702, 0.727, 0.761, 0.806, 0.858, 0.933, 1.001
        ],
        [
            0.002, 0.082, 0.177, 0.297, 0.418, 0.554, 0.661, 0.701, 0.812,
            0.914, 0.995
        ],
    ]

    z_for_uw_vs_t = np.array([1.5, 4.5, 8.5])
    t_for_uw_vs_t = [
        [
            1.42100000e+00, 4.12800000e+00, 1.23410000e+01, 5.68400000e+01,
            7.17913000e+02, 1.43367000e+03, 2.27363000e+03, 3.30788000e+03,
            4.81306000e+03, 6.06455000e+03, 7.00754000e+03, 9.08780000e+03,
            1.11271000e+04, 1.66725000e+04, 2.35847000e+04, 3.14819000e+04,
            4.32394000e+04, 6.85894000e+04, 1.08791000e+05, 1.88155000e+05,
            3.25448000e+05, 5.16347000e+05, 8.19144000e+05, 1.83676000e+06,
            3.46322000e+06, 4.89594000e+06, 6.72573000e+06, 8.72317000e+06,
            1.26974000e+07, 1.55475000e+07, 1.90345000e+07, 2.33071000e+07,
            2.93759000e+07, 3.70178000e+07, 4.66387000e+07, 6.22643000e+07,
            8.55306000e+07, 1.14164000e+08, 1.91904000e+08, 2.71400000e+08,
            3.41985000e+08, 4.56585000e+08, 5.58882000e+08, 7.46091000e+08,
            9.96106000e+08, 1.40839000e+09, 2.04896000e+09, 2.89590000e+09
        ],
        [
            1.23600000e+00, 3.50792000e+02, 7.20940000e+02, 1.66261000e+03,
            3.22543000e+03, 6.43960000e+03, 1.24921000e+04, 2.42368000e+04,
            3.52516000e+04, 6.09651000e+04, 9.95393000e+04, 1.53433000e+05,
            2.04749000e+05, 2.81271000e+05, 3.54390000e+05, 5.01146000e+05,
            6.68853000e+05, 9.45692000e+05, 1.37634000e+06, 1.94554000e+06,
            3.66834000e+06, 1.30371000e+07, 1.89620000e+07, 2.67987000e+07,
            3.78852000e+07, 5.05610000e+07, 7.35855000e+07, 9.82439000e+07,
            1.27409000e+08, 1.56007000e+08, 2.08305000e+08, 2.55124000e+08,
            3.21570000e+08, 3.93884000e+08, 4.82343000e+08, 5.90696000e+08,
            6.82810000e+08, 8.12285000e+08, 9.66359000e+08, 1.21822000e+09,
            1.58001000e+09, 2.10846000e+09, 2.89576000e+09
        ],
        [
            1.23300000e+00, 1.39543000e+03, 2.95200000e+03, 5.56549000e+03,
            1.24764000e+04, 2.87852000e+04, 6.83609000e+04, 1.36602000e+05,
            2.29677000e+05, 4.59284000e+05, 7.08468000e+05, 1.26217000e+06,
            2.00252000e+06, 3.46288000e+06, 1.16165000e+07, 3.00701000e+07,
            5.35142000e+07, 8.24844000e+07, 1.16636000e+08, 1.51268000e+08,
            1.90647000e+08, 2.47362000e+08, 3.02988000e+08, 3.71159000e+08,
            4.54668000e+08, 6.25380000e+08, 8.11854000e+08, 1.05378000e+09,
            1.29031000e+09, 1.77332000e+09, 2.65580000e+09, 3.64678000e+09
        ],
    ]
    #uw is uw/q0
    uw_for_uw_vs_t = [
        [
            0.401, 0.402, 0.401, 0.402, 0.4, 0.4, 0.399, 0.394, 0.387, 0.377,
            0.37, 0.36, 0.347, 0.331, 0.313, 0.302, 0.297, 0.292, 0.288, 0.283,
            0.276, 0.268, 0.261, 0.251, 0.248, 0.241, 0.232, 0.22, 0.207,
            0.193, 0.182, 0.169, 0.154, 0.142, 0.134, 0.12, 0.112, 0.102,
            0.091, 0.077, 0.066, 0.052, 0.045, 0.032, 0.018, 0.008, 0.004,
            0.002
        ],
        [
            0.325, 0.325, 0.327, 0.329, 0.332, 0.336, 0.339, 0.34, 0.34, 0.336,
            0.33, 0.323, 0.317, 0.307, 0.298, 0.286, 0.278, 0.269, 0.258,
            0.253, 0.249, 0.249, 0.249, 0.247, 0.24, 0.233, 0.222, 0.207,
            0.197, 0.184, 0.168, 0.15, 0.134, 0.115, 0.1, 0.084, 0.07, 0.057,
            0.044, 0.025, 0.013, 0.008, 0.003
        ],
        [
            0.369, 0.369, 0.369, 0.367, 0.361, 0.356, 0.349, 0.338, 0.323, 0.3,
            0.28, 0.26, 0.252, 0.249, 0.25, 0.249, 0.248, 0.241, 0.23, 0.219,
            0.205, 0.186, 0.167, 0.146, 0.125, 0.094, 0.066, 0.041, 0.028,
            0.011, 0.003, 0.002
        ],
    ]

    z_for_ua_vs_t = z_for_uw_vs_t
    t_for_ua_vs_t = [
        [
            1.12200000e+00, 2.66400000e+00, 1.09350000e+01, 3.08580000e+01,
            1.59497000e+02, 6.93508000e+02, 1.55414000e+03, 2.53662000e+03,
            3.48279000e+03, 4.51407000e+03, 5.68451000e+03, 6.95509000e+03,
            8.50966000e+03, 9.82858000e+03, 1.16838000e+04, 1.34947000e+04,
            1.69937000e+04, 2.07921000e+04, 2.40146000e+04, 3.20355000e+04,
            4.39850000e+04, 7.17910000e+04, 1.04418000e+05, 1.47557000e+05,
            2.02597000e+05, 2.62588000e+05, 3.30673000e+05, 4.54016000e+05,
            5.39716000e+05, 6.41592000e+05, 8.31572000e+05, 1.17513000e+06,
            1.56763000e+06, 2.21530000e+06, 3.04161000e+06
        ],
        [
            1.22400000e+00, 4.87900000e+00, 2.74980000e+01, 2.18991000e+02,
            5.35070000e+02, 9.80029000e+02, 1.79501000e+03, 3.19434000e+03,
            5.36614000e+03, 8.50966000e+03, 1.31113000e+04, 2.02014000e+04,
            3.29722000e+04, 5.38163000e+04, 8.29179000e+04, 1.20601000e+05,
            1.56312000e+05, 2.14617000e+05, 2.78167000e+05, 3.71075000e+05,
            4.67291000e+05, 5.55496000e+05, 7.19982000e+05, 9.88539000e+05,
            1.17513000e+06, 1.52310000e+06, 2.09122000e+06, 2.78970000e+06
        ],
        [
            1.18900000e+00, 3.76500000e+00, 1.41720000e+01, 7.11730000e+01,
            3.47277000e+02, 1.50999000e+03, 2.92977000e+03, 5.52303000e+03,
            9.01454000e+03, 1.51435000e+04, 2.69487000e+04, 5.38163000e+04,
            9.30488000e+04, 1.47557000e+05, 1.91250000e+05, 2.47881000e+05,
            3.21280000e+05, 4.04584000e+05, 4.80953000e+05, 6.05658000e+05,
            7.62699000e+05, 9.06665000e+05, 1.14175000e+06, 1.39695000e+06,
            1.81060000e+06, 2.55864000e+06, 3.51303000e+06
        ]
    ]
    #ua is ua/q0
    ua_for_ua_vs_t = [
        [
            0.201, 0.201, 0.202, 0.201, 0.201, 0.201, 0.201, 0.197, 0.191,
            0.184, 0.173, 0.163, 0.152, 0.142, 0.131, 0.12, 0.108, 0.096,
            0.085, 0.073, 0.063, 0.056, 0.053, 0.048, 0.044, 0.04, 0.035,
            0.029, 0.025, 0.02, 0.014, 0.009, 0.004, 0.002, 0.
        ],
        [
            0.102, 0.102, 0.102, 0.102, 0.101, 0.103, 0.105, 0.109, 0.112,
            0.116, 0.119, 0.121, 0.12, 0.117, 0.111, 0.104, 0.097, 0.088,
            0.077, 0.066, 0.058, 0.049, 0.036, 0.024, 0.016, 0.009, 0.003,
            0.001
        ],
        [
            0.159, 0.159, 0.158, 0.159, 0.159, 0.159, 0.158, 0.156, 0.153,
            0.148, 0.142, 0.137, 0.127, 0.116, 0.107, 0.097, 0.085, 0.074,
            0.064, 0.052, 0.039, 0.031, 0.021, 0.013, 0.007, 0.002, 0.001
        ],
    ]

    z = np.linspace(0, 1, 101)

    t = np.logspace(0, 10, 101)  #these should include the t for z vs u values.

    dq = 1.0
    reader = textwrap.dedent("""\
    #from geotecha.piecewise.piecewise_linear_1d import PolyLine
    #import numpy as np
    # shan et al,
    H = 10 #m
    drn = 1
    neig = 200

    mvref = 1e-4 #1/kPa
    kwref = 1.0e-9 #m/s

    karef = 1e-8 #m/s
    Daref = karef / 10 # from equation ka=Da*g

    wa = 29.0e-3 #kg / mol
    R = 8.31432 #J/(mol.K)
    ua_= 101 #kPa
    T = 273.16 + 20
    dTa = Daref /(mvref) / (wa*ua_/(R*T))/ H ** 2
    dTw = kwref / mvref/ 10 / H**2
    dT = max(dTw,dTa)

    kw = PolyLine([0,0.3,0.7], [0.3,0.7,1.0], [0.1,1,0.1], [0.1,1,0.1])
    Da = PolyLine([0,0.3,0.7], [0.3,0.7,1.0], [0.1,1,0.1], [0.1,1,0.1])
    S = PolyLine([0,0.3,0.7], [0.3,0.7,1.0], [0.8,0.6,0.7], [0.8,0.6,0.7])
    n = PolyLine([0,0.3,0.7], [0.3,0.7,1.0], [0.45,0.5,0.4], [0.45,0.5,0.4])

    m1s = -2.5
    m2s = 0.4*m1s
    m1w = 0.2*m1s
    m2w = 4*m1w
    m1a = m1s-m1w
    m2a = m2s-m2w

    #print(m1w,m2w,m1a,m2a)
    m1kw = PolyLine([0,1], [m1w]*2)
    m2w =  PolyLine([0,1], [m2w]*2)
    m1ka = PolyLine([0,1], [m1a]*2)
    m2a =  PolyLine([0,1], [m2a]*2)


    surcharge_vs_depth = PolyLine([0,1], [1,1])
    surcharge_vs_time = PolyLine([0,0,10000], [0, {dq}, {dq}])

    ppress_z = np.{z}
    #avg_ppress_z_pairs = [[0,1]]
    #settlement_z_pairs = [[0,1]]
    tvals = np.{t}


    #ppress_z_tval_indexes = slice(None, len(tua)+len(tuw))
    #avg_ppress_z_pairs_tval_indexes = slice(None, None)#[0,4,6]
    #settlement_z_pairs_tval_indexes = slice(len(tua)+len(tuw),len(tua)+len(tuw)+len(tset))

    save_data_to_file= False
    save_figures_to_file= False
    show_figures= False
    """.format(t=repr(t), z=repr(z), dq=dq))

    i_for_uw_vs_t = np.searchsorted(z, z_for_uw_vs_t / 10.0)
    i_for_ua_vs_t = np.searchsorted(z, z_for_ua_vs_t / 10.0)

    i_for_z_vs_uw = np.searchsorted(t, t_for_z_vs_uw)
    i_for_z_vs_ua = np.searchsorted(t, t_for_z_vs_ua)

    a = Speccon1dUnsat(reader)

    a.make_all()

    #calculated values to plot
    calc_uw_vs_t = [a.porw[v, :] / dq for v in i_for_uw_vs_t]
    calc_ua_vs_t = [a.pora[v, :] / dq for v in i_for_ua_vs_t]
    calc_z_vs_uw = [a.porw[:, v] / dq for v in i_for_z_vs_uw]
    calc_z_vs_ua = [a.pora[:, v] / dq for v in i_for_z_vs_ua]

    #The remainder of this sub is for plotting with matplotlib

    matplotlib.rcParams['font.size'] = 10

    fig = plt.figure(figsize=(3.54, 3.54))
    ax = fig.add_subplot(1, 1, 1)

    ax.set_xlabel('Time (s)')
    ax.set_ylabel('Water pressure $u_w/q_0$')
    ax.set_xscale('log')

    styles = [
        dict(dashes=[4, 1], color='black'),
        dict(dashes=[8, 2], color='black'),
        dict(dashes=[5, 2, 2, 2], color='black')
    ]

    for jj, zz in enumerate(z_for_uw_vs_t):
        label_calc = "$z={}m$".format(zz)
        if jj == len(z_for_uw_vs_t) - 1:
            label_expect = "Shan et al.\n2014"
        else:
            label_expect = None

        ax.plot(t, calc_uw_vs_t[jj], label=label_calc, **styles[jj])
        ax.plot(t_for_uw_vs_t[jj],
                uw_for_uw_vs_t[jj],
                marker='o',
                markersize=3,
                color='black',
                markerfacecolor='none',
                ls="None",
                label=label_expect)

    leg = ax.legend(loc=3, labelspacing=0.0)
    plt.setp(leg.get_title(), fontsize=8)
    leg.get_frame().set_edgecolor('white')
    leg.draggable()
    fig.subplots_adjust(top=0.97, bottom=0.15, left=0.2, right=0.94)

    fig2 = plt.figure(figsize=(3.54, 3.54))
    ax = fig2.add_subplot(1, 1, 1)

    ax.set_xlabel('Time (s)')
    ax.set_ylabel('Air pressure $u_a/q_0$')
    ax.set_xscale('log')
    ax.set_ylim([0, 0.25])

    for jj, zz in enumerate(z_for_ua_vs_t):
        label_calc = "$z={}m$".format(zz)
        if jj == len(z_for_ua_vs_t) - 1:
            label_expect = "Shan et \nal.(2014)"
        else:
            label_expect = None

        ax.plot(t, calc_ua_vs_t[jj], label=label_calc, **styles[jj])
        ax.plot(t_for_ua_vs_t[jj],
                ua_for_ua_vs_t[jj],
                marker='o',
                markersize=3,
                color='black',
                markerfacecolor='none',
                ls='None',
                label=label_expect)

    leg = ax.legend(loc=1, labelspacing=0.0)
    plt.setp(leg.get_title(), fontsize=8)
    leg.get_frame().set_edgecolor('white')
    leg.draggable()
    fig2.subplots_adjust(top=0.97, bottom=0.15, left=0.2, right=0.94)

    return fig, fig2
#settlement_z_pairs = [[0,1]]

tvals = np.{t}

#ppress_z_tval_indexes = slice(None, len(tua)+len(tuw))
#avg_ppress_z_pairs_tval_indexes = slice(None, None)#[0,4,6]
#settlement_z_pairs_tval_indexes = slice(len(tua)+len(tuw),len(tua)+len(tuw)+len(tset))

save_data_to_file= False
save_figures_to_file= False
show_figures= False

""".format(t=repr(t), z = repr(z)))


a = Speccon1dUnsat(reader)
a.make_all()


# custom plots
title = ("Shan et al. (2012) Unsaturated soil. instant surcharge + \nsinusoidal top water pressure boundary consdition.")
fig = plt.figure(figsize=(9,6))
fig.suptitle(title)
#z vs ua
ax1 = fig.add_subplot("121")
ax1.set_xlabel('Excess pore pressure in air, kPa')
ax1.set_ylabel('Depth')
ax1.invert_yaxis()
ax1.plot(pora, z,
         ls="None", color='Blue', marker="+", ms=5,
         label='expected')
directory= r"C:\\Users\\Rohan Walker\\Documents\\temp" #may always need the r
save_data_to_file= False
save_figures_to_file= False
show_figures= False
overwrite=True

#prefix="silly"

#create_directory=True
#data_ext = '.csv'
#input_ext='.py'
figure_ext='.png'

    """)

    a = Speccon1dUnsat(my_code)

    a.make_all()

    #    a.print_eigs()

    if 1:
        #only use this if there is one z interval
        fig = plt.figure()
        ax = fig.add_subplot('111')
        ax.plot(a.tvals, a.set[0], 'ro', ls='-', label='combined')
        ax.plot(a.tvals, a.setw[0], 'bs', ls='-', label='water')
        ax.plot(a.tvals, a.seta[0], 'g*', ls='-', label='air')
        ax.set_xlabel('Time')
        ax.set_ylabel('Settlement')
        ax.set_xscale('log')