Convergence Confinement Method: Part 4

674 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

Stress-Displacement Development along The Radial Axis

%reset -f
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
def displacement_ratio(r_R,R,lamb,lambda_e,sigma_0,Kp,Kpsi,G,nu):
    Rp_R = ((2/(Kp + 1))*((Kp - 1)*sigma_0 + sigma_c)/
            ((1 - lamb)*(Kp - 1)*sigma_0 + sigma_c))**(1/(Kp - 1))
    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)

    u_R_fullelastic = lamb*sigma_0/(2*G)/r_R
    u_R_elastic = lambda_e*sigma_0/(2*G)*(Rp_R/r_R)*Rp_R
    u_R_plastic = (lambda_e*sigma_0/(2*G))*(F1 + F2*((Rp_R/r_R)**(-Kp + 1)) + 
                                            F3*(Rp_R/r_R)**(Kpsi + 1))*r_R

    if lamb < lambda_e: # Full Elastic Zone
        return u_R_fullelastic

    if r_R >= Rp_R: # Elastic Part of Elastic-Plastic Zone
        return u_R_elastic
    else: # Plastic Zone
        return u_R_plastic

# Based on equation 4.
def sigma_rθ(r_R,R,lamb,lambda_e,sigma_0,sigma_c,Kp):
    Rp_R = ((2/(Kp + 1))*((Kp - 1)*sigma_0 + sigma_c)/
            ((1 - lamb)*(Kp - 1)*sigma_0 + sigma_c))**(1/(Kp - 1))
    Rp = Rp_R*R
    r = r_R*R

    sigma_r_plastic = ((sigma_c/(Kp - 1))*((r/R)**(Kp - 1) - 1) + 
                       (1 - lamb)*sigma_0*(r/R)**(Kp - 1))
    sigma_θ_plastic = ((sigma_c/(Kp - 1))*(Kp*(r/R)**(Kp - 1) - 1) + 
                       Kp*(1 - lamb)*sigma_0*(r/R)**(Kp - 1))
    sigma_r_elastic = (1 - lambda_e*(Rp**2)/(r**2))*sigma_0
    sigma_θ_elastic = (1 + lambda_e*(Rp**2)/(r**2))*sigma_0

    # Fully elastic
    if lamb < lambda_e:
        return (1-lamb*r_R**(-2))*sigma_0, (1+lamb*r_R**(-2))*sigma_0, Rp_R

    # Not Fully Elastic
    if r_R >= Rp_R: # elastic
        return sigma_r_elastic, sigma_θ_elastic, Rp_R
    else:           # plastic
        return sigma_r_plastic, sigma_θ_plastic, Rp_R
###############################################################################
# Soil Parameter
gamma = 20.0
ϕ = 30
ψ = 30
cohesion = 974 #kpa
G = 126164.0 #kpa
nu = 0.28

# Lateral Stress Coefficient
Kp = np.tan(np.pi/4 + np.deg2rad(ϕ)/2)**2
Kpsi = np.tan(np.pi/4 + np.deg2rad(ψ)/2)**2

# Mohr Coulomb Parameter
sigma_c = 2*cohesion * np.cos(np.deg2rad(ϕ)) / (1 - np.sin(np.deg2rad(ϕ)))

################################################################################
# CCM Calculation
N = 4 # stability Number
σ0 = N*sigma_c/2
λe = 1/(Kp + 1) * (Kp - 1 + sigma_c/σ0)

R = 5 # radius dinding [meter]
λs = np.linspace(0, 1, 10000)
r_Rs = np.linspace(1.0, 1.5, 5)

σ_r_collect = []
σ_θ_collect = []
for r_R in r_Rs:
    u_R = np.array([
      displacement_ratio(r_R=r_R,R=R,lamb=λ,lambda_e=λe,
                         sigma_0=σ0,Kp=Kp,Kpsi=Kpsi,G=G,nu=nu)
      for λ in λs]) *2*G/σ0
    σ_rθ = np.array([
      sigma_rθ(r_R=r_R,R=R,lamb=λ,lambda_e=λe,sigma_0=σ0,sigma_c=sigma_c,Kp=Kp) 
      for λ in λs])/σ0
    σ_r_collect.append(σ_rθ[:,0])
    σ_θ_collect.append(σ_rθ[:,1])

u_Rs_at_λe = [displacement_ratio(
    r_R=r_R,
    R=R,
    lamb=λe,
    lambda_e=λe,
    sigma_0=σ0,
    Kp=Kp,
    Kpsi=Kpsi,
    G=G,
    nu=nu
)*2*G/σ0 for r_R in r_Rs]
for index, (σ_r, σ_θ) in enumerate(zip(σ_r_collect, σ_θ_collect)):
    cmap = mpl.colormaps["tab20b"].colors
    ls = '-.' if index>0 else '-'
    label_r = "Radial Stress ($σ_r$)" if index==0 else ""
    label_θ = "Tangential Stress ($σ_θ$)" if index==0 else ""
    plt.plot(u_R, σ_r, c=cmap[-index], ls=ls, label=label_r)
    plt.plot(u_R, σ_θ, c=cmap[-index], ls=ls, label=label_θ)

for index, u_R_at_λe in enumerate(u_Rs_at_λe):
    label = "λe" if index==0 else ""
    plt.axvline(u_R_at_λe, label=label, c='k', ls='-.', lw='.7')
plt.xlabel(r"Displacement Ratio $\left(\frac{u}{R}\right)$")
plt.ylabel("Stresses (σ)")
plt.title("Stress - Displacement Curve at Wall ($r = R$)")
plt.xlim(0,1.2)
plt.ylim(0,2)
plt.grid()
plt.legend()
plt.show()