4.8. Desenează tu liniile#
Codul de mai jos desenează cele două proiecții ale stării critice din cei cinci parametri și pune pe ele o probă oarecare \((p', v)\), spunându-ți dacă este „udă” sau „uscată”. Schimbă valorile din prima celulă și rulează din nou: ce se întâmplă cu \(\psi\) dacă mărești \(p'_0\)? Dacă micșorezi \(\kappa\)? Dacă pui \(\lambda = \kappa\)?
# --- Parametrii materialului (Weald Clay, Schofield & Wroth 1968) ---
lam = 0.093 # λ panta NCL/CSL
kappa = 0.035 # κ panta URL
M = 0.95 # panta CSL în q-p'
Gamma = 2.060 # Γ v pe CSL la p'=1 kPa
N = 2.100 # N v pe NCL la p'=1 kPa (în MCC: N = Γ + (λ−κ) ln 2)
# --- Starea probei ---
p0_max = 800.0 # p'_0: cea mai mare presiune izotropă din istorie [kPa]
p_now = 200.0 # p' actual [kPa]
import numpy as np
import matplotlib.pyplot as plt
def v_ncl(p): return N - lam*np.log(p)
def v_csl(p): return Gamma - lam*np.log(p)
def v_url(p, p0): return v_ncl(p0) + kappa*np.log(p0/p) # URL care pleacă din NCL la p0
v_now = v_url(p_now, p0_max)
psi = v_now - v_csl(p_now)
Rp = p0_max / p_now
print(f"v actual = {v_now:.3f} v_cs(p') = {v_csl(p_now):.3f} ψ = {psi:+.3f} R_p = {Rp:.1f}")
print("→ 'UDĂ' (se va contracta, Δu>0)" if psi > 0 else "→ 'USCATĂ' (se va dilata, Δu<0)")
v actual = 1.527 v_cs(p') = 1.567 ψ = -0.040 R_p = 4.0
→ 'USCATĂ' (se va dilata, Δu<0)
p = np.linspace(10, 1200, 400)
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(11, 4.2))
# --- planul eforturilor ---
ax1.plot(p, M*p, 'k', lw=2, label=f'CSL: q = {M} p\'')
ax1.plot([p_now, p_now], [0, 0], 'o', color='C3')
# drum drenat 3:1 din (p_now, 0) până la CSL
p_end = 3*p_now/(3-M)
ax1.plot([p_now, p_end], [0, 3*(p_end-p_now)], 'C0--', label='drum drenat 3:1')
ax1.plot(p_end, M*p_end, 's', color='C0')
ax1.set_xlabel("p' [kPa]"); ax1.set_ylabel("q [kPa]")
ax1.set_xlim(0, 1200); ax1.set_ylim(0, 1200); ax1.set_aspect('equal'); ax1.legend(); ax1.grid(alpha=.3)
ax1.set_title("planul eforturilor")
# --- planul de compresiune ---
ax2.plot(p, v_ncl(p), 'C1', lw=2, label=f'NCL: v = {N} − {lam} ln p\'')
ax2.plot(p, v_csl(p), 'k', lw=2, label=f'CSL: v = {Gamma} − {lam} ln p\'')
pu = np.linspace(10, p0_max, 100)
ax2.plot(pu, v_url(pu, p0_max), 'C2', lw=1.5, label=f'URL (p\'₀ = {p0_max:.0f})')
ax2.plot(p_now, v_now, 'o', color='C3', ms=8, label=f'proba: ψ = {psi:+.3f}')
ax2.plot([p_now, p_now], [v_now, v_csl(p_now)], 'C3:', lw=1)
ax2.set_xscale('log'); ax2.set_xlabel("p' [kPa] (scară log)"); ax2.set_ylabel("v")
ax2.set_xlim(10, 1200); ax2.legend(fontsize=8); ax2.grid(alpha=.3, which='both')
ax2.set_title("planul de compresiune")
plt.tight_layout()
Încearcă
Pune
p0_max = p_now(probă NC). \(\psi\) trebuie să fie \((\lambda-\kappa)\ln 2 \approx +0{,}04\) — exact distanța NCL–CSL.Găsește \(p'_0\) pentru care \(\psi = 0\) (proba este exact pe CSL înainte de forfecare). Raportul \(p'_0/p'\) pe care îl obții este granița „ud/uscat” în Cam-Clay modificat: 2. De ce 2? Răspunsul este în Suprafața completă și peretele elastic.
Pune \(\kappa = \lambda\). Ce se întâmplă cu URL? Ce fel de material ar fi acesta?