# wall_sdof.py -- Patlamaya karsi betonarme duvar: Biggs esdeger SDOF (elasto-plastik)
# Kaynak: Biggs (1964); UFC 3-340-02 (2008) Bolum 3-4. Hasar siniri: PDC TR-06-08 (GIRDI)
import math

# Duvar (birim genislik, basit mesnet)
t, L, cover = 0.30, 3.0, 0.04          # m
rho_s, fy, fc = 0.005, 420e6, 30e6     # -, Pa, Pa
Pr, ir = 830e3, 1800.0                 # Pa, Pa.s  (yansiyan basinc, impuls)

Ec  = 4700e6 * math.sqrt(fc/1e6)       # Pa (ACI yaklasimi)
d   = t - cover
As  = rho_s * d
fdy = 1.10 * 1.17 * fy                 # SIF*DIF (UFC)
fdc = 1.19 * fc
a   = As * fdy / (0.85 * fdc)
Mp  = As * fdy * (d - a/2)             # N.m/m
n   = 200e9 / Ec; rn = n * rho_s
k   = math.sqrt(rn**2 + 2*rn) - rn
Ic  = d**3 * (k**3/3 + rn*(1-k)**2)
Ia  = (t**3/12 + Ic) / 2
ru  = 8 * Mp / L**2                    # Pa
KE  = 384 * Ec * Ia / (5 * L**4)       # Pa/m
ye  = ru / KE
m   = 2400 * t                         # kg/m2
td  = 2 * ir / Pr                      # impulsu koruyan ucgen darbe

def solve(KLM):
    Me = KLM * m; T = 2*math.pi*math.sqrt(Me/KE)
    dt = min(T, td)/2000; tEnd = td + 3*T
    y = v = yp = 0.0; ymax = tmax = 0.0; tt = 0.0
    while tt <= tEnd:
        p = Pr*(1 - tt/td) if tt <= td else 0.0
        r = KE*(y - yp)
        if r > ru:  yp = y - ru/KE; r = ru
        elif r < -ru: yp = y + ru/KE; r = -ru
        v += (p - r)/Me*dt; y += v*dt
        if y > ymax: ymax, tmax = y, tt
        if tt > td and v < 0 and tt > tmax + T/4: break
        tt += dt
    return ymax, T

KLM = 0.78
ym, T = solve(KLM)
if ym > ye:                            # plastiklesti: UFC -> K_LM ortalamasi
    KLM = (0.78 + 0.66) / 2
    ym, T = solve(KLM)

mu    = ym / ye
theta = math.degrees(math.atan(2*ym/L))
print(f"Mp = {Mp/1e3:.2f} kN.m/m   ru = {ru/1e3:.2f} kPa   ye = {ye*1e3:.3f} mm")
print(f"T  = {T*1e3:.3f} ms   td = {td*1e3:.3f} ms   K_LM = {KLM:.2f}")
print(f"ymax = {ym*1e3:.3f} mm   mu = {mu:.3f}   theta = {theta:.3f} derece")
