---
jupytext:
  formats: md:myst
  text_representation:
    extension: .md
    format_name: myst
kernelspec:
  display_name: Python 3
  language: python
  name: python3
---

(joaca_te)=
# {fa}`rocket` 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$?

```{code-cell} ipython3
# --- 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]
```

```{code-cell} ipython3
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)")
```

```{code-cell} ipython3
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()
```

```{admonition} Încearcă
:class: tip
1. Pune `p0_max = p_now` (probă NC). $\psi$ trebuie să fie $(\lambda-\kappa)\ln 2 \approx +0{,}04$ — exact distanța NCL–CSL.
2. 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 {ref}`suprafata_completa`.
3. Pune $\kappa = \lambda$. Ce se întâmplă cu URL? Ce fel de material ar fi acesta?
```
