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:
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()