예제 #1
0
def hb_intersection(p0,
                    p1,
                    rtol=0.01,
                    maxit=100,
                    mi=20.0,
                    d=0.5,
                    gsi=85.0,
                    sigma_ci=200.0):
    result = line(p0, p1)
    if result is not None:
        k = result[0]
        b = result[1]
    else:
        x = 0
        y = hoek_brown(x, x, mi=mi, d=d, gsi=gsi, sigma_ci=sigma_ci)
        return x, y
    if k != 1:
        xy = b / (1 - k)
    else:
        xy = 0
    s1min, s2min, s3min = hoek_brown_min_point(mi=mi,
                                               d=d,
                                               gsi=gsi,
                                               sigma_ci=sigma_ci)
    if xy < s3min:
        return xy, xy
    x = s3min
    dx = xy - s3min
    rdy = 1
    i = 0
    while rdy > rtol and i < maxit:
        i += 1
        x += dx
        hb_y = hoek_brown(x, x, mi=mi, d=d, gsi=gsi, sigma_ci=sigma_ci)
        pp_y = k * x + b
        dy = hb_y - pp_y
        if dy > 0:
            x -= dx
            dx *= 0.5
            continue
        length = dist([xy, xy], [pp_y, x])
        rdy = abs(dy) / length
    y = k * x + b
    return x, y
예제 #2
0
def hb_normal(p,
              cos_tol=0.001,
              maxit=1000,
              mi=20.0,
              d=0.5,
              gsi=85.0,
              sigma_ci=200.0):
    s1min, s2min, s3min = hoek_brown_min_point(mi=mi,
                                               d=d,
                                               gsi=gsi,
                                               sigma_ci=sigma_ci)
    x = s3min
    y = s1min
    i = 0
    c = 1
    delta_x = p[1] - s3min
    kdx = 1e-6
    hb1 = hoek_brown(p[0], p[0], mi=mi, d=d, gsi=gsi, sigma_ci=sigma_ci)
    if p[1] <= s1min:
        dx = kdx
        dy = hoek_brown(
            s3min + dx, s3min + dx, mi=mi, d=d, gsi=gsi, sigma_ci=sigma_ci) - y
        p_hb = subs([x, y], p)
        c = cos(p_hb, [dx, dy])
        return [x, y], abs(c), i
    elif hb1 == p[1]:
        x = p[0]
        y = p[1]
        return [x, y], 0, i
    while abs(c) > cos_tol and i < maxit:
        i += 1
        x += delta_x
        y = hoek_brown(x, x, mi=mi, d=d, gsi=gsi, sigma_ci=sigma_ci)
        dx = delta_x * kdx
        dy = hoek_brown(x + dx, x + dx, mi=mi, d=d, gsi=gsi,
                        sigma_ci=sigma_ci) - y
        p_hb = subs([x, y], p)
        c = cos(p_hb, [dx, dy])
        if c < 0:
            x -= delta_x
            delta_x *= 0.5
    return [x, y], abs(c), i
예제 #3
0
def hoek_brown_min_point(mi=20, d=0.5, gsi=85, sigma_ci=200):
    mb = mi * math.exp((gsi - 100) / (28 - 14 * d))
    s = math.exp((gsi - 100) / (9 - 3 * d))
    # a = 0.5 + (math.exp(-gsi / 15) - math.exp(-20 / 3)) / 6
    sigma_3_min = -s * sigma_ci / mb
    sigma_2_min = sigma_3_min
    sigma_1_min = hoek_brown(sigma_2_min, sigma_3_min, mi=20, d=0.5, gsi=85,
                             sigma_ci=200)
    if sigma_1_min >= sigma_2_min >= sigma_3_min:
        sigma_1_min = max(sigma_2_min, sigma_3_min)
    return sigma_1_min, sigma_2_min, sigma_3_min
예제 #4
0
 min_d = 0  # 0
 max_d = 1  # 1
 min_gsi = 5  # 5
 max_gsi = 100  # 100
 mis = np.linspace(min_mi, max_mi, nc)
 sigma_cis = np.linspace(min_sigma_ci, max_sigma_ci, nc)
 ds = np.linspace(min_d, max_d, nc)
 gsis = np.linspace(min_gsi, max_gsi, nc)
 # X, Y
 xs = [min_c, max_c]
 ys = [min_c, max_c]
 cmap = cm.get_cmap('Greys')
 min_color = 0.3
 hb_xs = np.linspace(min_c, max_c, n)
 for i, mi in enumerate(mis):
     hb_ys = [hoek_brown(x, x, mi=mi) for x in hb_xs]
     plt.plot(hb_xs, hb_ys,
              color=cmap(min_color + (1 - min_color) * (i / nc)), label=mi)
     plt.xlim(min_c * 1.05, max_c * 1.05)
     plt.ylim(min_c * 1.05, max_c * 1.05)
 plt.legend(title='mi')
 plot_axes(xs, ys)
 plt.show()
 plt.cla()
 for i, sigma_ci in enumerate(sigma_cis):
     hb_ys = [hoek_brown(x, x, sigma_ci=sigma_ci) for x in hb_xs]
     plt.plot(hb_xs, hb_ys,
              color=cmap(min_color + (1 - min_color) * (i / nc)),
              label=sigma_ci)
     plt.xlim(min_c * 1.05, max_c * 1.05)
     plt.ylim(min_c * 1.05, max_c * 1.05)
예제 #5
0
파일: hb2d.py 프로젝트: romanzes637/fc
from criteria import hoek_brown
import numpy as np

from norm import norm_sigma
from support import distance, angle

if __name__ == '__main__':
    import matplotlib.pyplot as plt

    min_x = -1000
    max_x = 1000
    n = 1001
    hb_xs = np.linspace(min_x, max_x, n)
    hb_ys = [hoek_brown(x, x) for x in hb_xs]

    plt.plot(hb_xs, hb_ys)

    sigma = [-500, -500, -700]
    a = angle([1, 1, 0], [1, 0, 0])
    sigma_max_1 = hoek_brown(sigma[1], sigma[2])
    sigma_max = [sigma_max_1, sigma[1], sigma[2]]
    d = distance(sigma, sigma_max)
    sigma_n = norm_sigma(sigma)
    plt.scatter(sigma[2], sigma[0], c='red')
    plt.scatter(sigma_max[2], sigma_max[0], c='green')
    plt.scatter(sigma_n[2], sigma_n[0], c='blue')
    plt.plot([0, 0], [min_x, max_x], color='black', alpha=1, linewidth=0.5)
    plt.plot([min_x, max_x], [0, 0], color='black', alpha=1, linewidth=0.5)
    plt.xlim(min_x*1.05, max_x*1.05)
    plt.ylim(min_x*1.05, max_x*1.05)
    plt.show()
예제 #6
0
파일: norm.py 프로젝트: romanzes637/fc
def norm_sigma(sigma, atol=0.01, maxit=100):
    from criteria import hoek_brown

    sigma[1] = sigma[2]
    sigma_max_1 = hoek_brown(sigma[1], sigma[2])
    sigma_max_3 = sigma[2]
    sigma_max = [sigma_max_1, sigma[1], sigma[2]]
    if sigma_max_1 < sigma[0]:
        sigma_n = [hoek_brown(0, 0), 0.0, 0.0]
    else:
        sigma_n = sigma_max
    d = distance(sigma, sigma_n)
    dx = 1
    pd = d
    add = 100
    cnt = 0
    a = 1
    while add > atol and cnt < maxit:
        cnt += 1
        # Move pos and neg
        pos_sigma_n = [hoek_brown(sigma_n[1] + dx, sigma_n[2] + dx),
                       sigma_n[1] + dx, sigma_n[2] + dx]
        neg_sigma_n = [hoek_brown(sigma_n[1] - dx, sigma_n[2] - dx),
                       sigma_n[1] - dx, sigma_n[2] - dx]
        if pos_sigma_n[0] <= pos_sigma_n[2] or neg_sigma_n[0] <= neg_sigma_n[
            2]:
            # sigma_n = [0.0, 0.0, 0.0]
            break
        # New distances
        pos_d = distance(sigma, pos_sigma_n)
        neg_d = distance(sigma, neg_sigma_n)
        if pos_d < neg_d:
            sigma_n[1] += dx
            sigma_n[2] += dx
            sigma_n[0] = pos_sigma_n[0]
            d = pos_d
        elif pos_d > neg_d:
            sigma_n[1] -= dx
            sigma_n[2] -= dx
            sigma_n[0] = neg_sigma_n[0]
            d = neg_d
        else:
            break
        k = 1
        # cmap = cm.get_cmap('Set1')
        # c = cmap(random.uniform(0, 1))
        d_sigma_n = [
            hoek_brown(sigma_n[1] + k * dx, sigma_n[2] + k * dx) - sigma_n[0],
            k * dx, k * dx]
        # plt.plot([sigma_n[2], sigma_n[2] + d_sigma_n[2]], [sigma_n[0], sigma_n[0] + d_sigma_n[0]], color=c)
        ds = delta(sigma, sigma_n)
        # plt.plot([sigma[2], sigma[2] + ds[2]], [sigma[0], sigma[0] + ds[0]], color=c)
        a = angle(ds, d_sigma_n)
        dsdydx = ds[0] / ds[1]
        dsb = sigma[0] - dsdydx * sigma[1]
        dsb2 = sigma_n[0] - dsdydx * sigma_n[1]
        sigma_min_3 = dsb / (1 - dsdydx)
        sigma_min_1 = sigma_min_3
        # plt.plot([sigma[2], sigma[2] + ds[2]], [sigma[0], sigma[0] + ds[0]], color=c)
        # plt.plot([sigma_n[2], sigma_min_3], [sigma_n[0], sigma_min_1])
        add = abs(a - math.pi / 2)
        pd = d
    return sigma_n
예제 #7
0
 # HB
 mb = mi * math.exp((gsi - 100) / (28 - 14 * d))
 s = math.exp((gsi - 100) / (9 - 3 * d))
 a = 0.5 + (math.exp(-gsi / 15) - math.exp(-20 / 3)) / 6
 min_c = -500
 max_c = 500
 n = 20001
 xs = [min_c, max_c]
 ys = [min_c, max_c]
 hb1min, hb2min, hb3min = hoek_brown_min_point(mi=mi,
                                               d=d,
                                               gsi=gsi,
                                               sigma_ci=sigma_ci)
 hb_xs = np.linspace(hb3min, max_c, n)
 hb_ys = [
     hoek_brown(x, x, mi=mi, d=d, gsi=gsi, sigma_ci=sigma_ci)
     for x in hb_xs
 ]
 plt.plot(
     hb_xs,
     hb_ys,
     color='black',
     linewidth=2,
     label=
     'HB, mi={:.2f}, D={:.2f}, GSI={:.0f},\nσci={:.0f} МПа,mb={:.2f}, s={:.2f}, a={:.2f}'
     .format(
         mi,
         d,
         gsi,
         sigma_ci,
         mb,