Convergence Confinement Method: Part 2

505 words

Introduction

The Convergence-Confinement Method (CCM) is a widely used analytical approach in
tunnel engineering that helps in understanding the interaction between the
surrounding ground and the tunnel support system during excavation. This method
is particularly useful in the design and construction of tunnels in rock masses,
where the behavior of the ground and the effectiveness of the support systems
need to be carefully evaluated to ensure stability and safety.

In this series of articles, we are going to discuss these following concepts in CCM:

  1. Basic Concept
  2. Ground Reaction Curve
  3. Support Characteristic Curve
  4. Stress - Displacement Interactions

Ground Reaction Curve (CCM)

%reset -f
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
def displacement_ratio(lamb,lambda_e,sigma_0,Kp,Kpsi,G,nu):
    F1 = -(1 - 2*nu) * (Kp + 1) / (Kp - 1)
    F2 = 2*(1 + Kp*Kpsi - nu*(Kp + 1)*(Kpsi + 1))/(Kp - 1)/(Kp + Kpsi)
    F3 = 2*(1 - nu)*(Kp + 1)/(Kp + Kpsi)
    Rp_R = ( (2*lambda_e) / ((Kp + 1)*lambda_e - (Kp - 1)*lamb) )**(1/(Kp - 1))

    if(lamb < lambda_e): # Elastic Zone
        return lamb*sigma_0/(2*G)
    else: # Plastic Zone
        return (lambda_e*sigma_0/(2*G))*(F1 + F2/(Rp_R**(Kp-1)) + F3*(Rp_R)**(Kpsi + 1))
def find_lambda(f,xl=0,xr=1,max_error=0.00001,max_iter=100):
    error = 1
    iters = 1
    while error > max_error and iters < max_iter:
        iters += 1
        xc = (xl + xr) / 2
        if f(xc)*f(xr) > 0:
            error = abs((xr-xc)/xc)
            xr = xc
        else:
            error = abs((xl-xc)/xc)
            xl = xc
    if (error > max_error):
        raise RuntimeWarning(
            f"""converging results for 'find_lambda' with error < {max_error*100}% 
              not found. Adjust iteration parameters!"""
        )
    return xc

def f(lamb):
    nu = .3
    Kp = 1.352
    Kpsi = 1.212
    lambda_e = .37
    sigma_0 = 4400.0 #kpa
    G = 12919.0 #kpa

    y1 = displacement_ratio(lamb,lambda_e,sigma_0,Kp,Kpsi,G,nu)*2*G/sigma_0
    y2 = 1-lamb

    return y1 - y2

lambda_cross = find_lambda(f, max_error=.0001)
nu = .3
Kp = 1.352
Kpsi = 1.212
lambda_e = .37
σ0 = 4400.0 #kpa
G = 12919.0 #kpa

x = np.linspace(0, 1, 1000) # Variable Bebas
displacement_norm = np.array([
    displacement_ratio(lamb,lambda_e,σ0,Kp,Kpsi,G,nu) for lamb in x])*2*G/σ0
displacement_norm_1 = np.array([
    displacement_ratio(lamb,lambda_e,σ0,Kp,0.5*Kpsi,G,nu) for lamb in x])*2*G/σ0
displacement_norm_2 = np.array([
    displacement_ratio(lamb,lambda_e,σ0,Kp,1.5*Kpsi,G,nu) for lamb in x])*2*G/σ0

plt.plot(displacement_norm, 1-x, label="1.0 $K_{\psi}$")
plt.plot(displacement_norm_1, 1-x, label="0.5 $K_{\psi}$")
plt.plot(displacement_norm_2, 1-x, label="1.5 $K_{\psi}$")
plt.plot(1-x, 1-x, ls="--", label="Support Pressure", lw=.9)
plt.xlabel(r"$\frac{2G}{\sigma_0}$ $\frac{u}{R}$")
plt.ylabel("1 - λ")
plt.axhline(1-lambda_e, ls="-.", c="k", lw=.5, label="$λ_e$")
plt.axhline(1-lambda_cross, ls="-.", c="c", lw=.5, label="λ Support Pressure")
plt.title("$K_\psi$ Influence on Ground Response Curve")
plt.legend()
plt.show()