fix(E03): 보강 있어도 탐색 한계 그대로 — 진입 넓힘 걷음(긴 네일이 Fs 를 낮춘 흠 · 536-3 · 요구 351)
- 원인: 보강 때 진입 한계를 보강재 끝 뒤까지 넓혀 보강 없는 해석이 안 본 위쪽 자연 비탈 면이 들어옴 (사본 E 0+720 우 깎기 우기 L 25 m — 그 면 보강 없음 0.722 · 보강 0.845 → 보강 없음 임계 1.027 보다 낮아 보임) - 같은 면에서는 보강이 늘 F 를 올림(힘 방향 · 부호 · 능동/수동 · 교점은 흠 없음) - 고침: 넓힘 · _exit_lo 걷음(보강 없는 해석과 같은 면 무리) · 0+720 L 3/6/9/12/25 = 1.049/1.148/1.289/1.421/1.487 - 시험: 같은 면 보강 F ≥ 보강 없음(네일 · 앵커 · 길이 셋 · 다섯 방법 · 면 9) · 측점 꼴 길이 늘려도 안 낮아짐 · 탐색 한계 그대로(옛 넓힘 시험 갈음) · Slide2 #47 · #85 · #86 그대로 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""536-3 뒷부분 보강재(네일 · 앵커) 2D 한계평형 — 힘 크기 · 능동/수동 · 탐색 넓힘 · 보강 없을 때 불변.
|
||||
"""536-3 뒷부분 보강재(네일 · 앵커) 2D 한계평형 — 힘 크기 · 능동/수동 · 탐색 한계 그대로 · 보강이 F 를 낮추지 않음 · 보강 없을 때 불변.
|
||||
|
||||
- 손계산: 평면 쐐기 닫힌 꼴(능동 F = (cL + (W cosα + T sin(α+δ)) tanφ) / (W sinα − T cos(α+δ)) · 수동 T → T/F)
|
||||
· 교점 · 인발 · 벗겨짐 · 정착장 · 프리스트레스.
|
||||
@@ -205,17 +205,64 @@ def test_slide2_86_five_rows():
|
||||
near(a["methods"]["spencer"]["min"]["F"], 1.620, 0.03)
|
||||
|
||||
|
||||
def test_search_moves_behind_strong_supports():
|
||||
"""아주 센 보강 — 진입 쪽 한계가 보강재 끝 뒤까지 넓어지고 임계면이 보강재를 안 지나는 깊은 면으로 감."""
|
||||
def test_search_keeps_limits_with_strong_supports():
|
||||
"""아주 센 보강 — 탐색 한계 그대로(보강 없는 해석과 같은 면 무리) · 임계 F 가 보강 없음 이상."""
|
||||
bare = {k: v for k, v in _p86().items() if k != "supports"}
|
||||
lim = [0, 45]
|
||||
a0 = analyze(bare, direction=-1, methods=("bishop",), min_depth=3.0, limits=lim)
|
||||
a = analyze(_p86(1e5), direction=-1, methods=("bishop",), min_depth=3.0, limits=lim)
|
||||
assert a0["limits"] == [0, 45] and a["limits"][1] > 45 # 끝 x 45 + 여유 5
|
||||
gov = a["methods"]["bishop"]["min"]
|
||||
assert gov["entry"][0] > 45 and a["support_forces_method"] == "bishop"
|
||||
assert all(f["mode"] == "not_crossing" for f in a["support_forces"])
|
||||
assert gov["F"] > a0["methods"]["bishop"]["min"]["F"]
|
||||
assert a0["limits"] == a["limits"] == [0, 45]
|
||||
assert a["support_forces_method"] == "bishop"
|
||||
assert a["methods"]["bishop"]["min"]["F"] >= a0["methods"]["bishop"]["min"]["F"]
|
||||
|
||||
|
||||
# ---- 보강은 F 를 낮추지 않음(요구 351 · sub2 실측 0+720 흠) ---------------------------------
|
||||
ALL = ("ordinary", "bishop", "janbu", "spencer", MP)
|
||||
#: 쐐기 비탈 (10, 10) → (20, 0) 위 면 — 얕은 · 깊은 평면 · 두 마디 · 원호(중심 · 반지름)
|
||||
PLANES = [[[x0, 10.0], [20.0, 0.0]] for x0 in (3.0, 5.0, 7.0, 9.0)] + [
|
||||
[[2.0, 10.0], [12.0, 3.0], [20.0, 0.0]],
|
||||
[[4.0, 10.0], [14.0, -1.0], [22.0, 0.0]],
|
||||
]
|
||||
CIRCLES = [[21.0, 19.45, 19.45], [19.0, 13.338, 13.422], [24.0, 27.0, 27.019]]
|
||||
|
||||
|
||||
def _sups(kind, L):
|
||||
heads = [(12.0, 8.0), (15.0, 5.0), (18.0, 2.0)]
|
||||
if kind == "nail":
|
||||
return [nail(x, z, 15, L, 1.5, 120, 40) for x, z in heads]
|
||||
return [anchor(x, z, 15, L, 1.5, 300, 60, min(4.0, L), 80) for x, z in heads]
|
||||
|
||||
|
||||
@pytest.mark.parametrize("kind", ["nail", "anchor"])
|
||||
@pytest.mark.parametrize("L", [3.0, 8.0, 25.0])
|
||||
def test_supports_never_lower_same_surface(kind, L):
|
||||
"""같은 면 — 네일(수동) · 앵커(능동) · 길이 셋 · 다섯 방법 · 면 깊이 여럿: 보강 F ≥ 보강 없음 F."""
|
||||
with_s = {**WEDGE, "supports": _sups(kind, L)}
|
||||
checked = 0
|
||||
for spec in [{"polyline": p} for p in PLANES] + [{"circle": c} for c in CIRCLES]:
|
||||
r0 = evaluate_specified(WEDGE, methods=ALL, **spec)
|
||||
r1 = evaluate_specified(with_s, methods=ALL, **spec)
|
||||
for m in ALL:
|
||||
f0, f1 = r0[m]["F"], r1[m]["F"]
|
||||
if f0 is None or f1 is None:
|
||||
continue
|
||||
assert f1 >= f0 - 1e-9, (kind, L, spec, m, f0, f1)
|
||||
checked += 1
|
||||
assert checked >= 40
|
||||
|
||||
|
||||
def test_station_longer_nails_never_lower():
|
||||
"""측점 꼴(우 깎기) — 네일을 길게 해도 임계 F 가 보강 없음 아래로 안 감(탐색 한계 그대로)."""
|
||||
base = {c["side"]: c for c in _station(None)["cases"]}["right"]
|
||||
f0 = base["min_F"]["bishop"]
|
||||
prev = f0
|
||||
for L in (3.0, 8.0, 15.0, 25.0):
|
||||
case = {c["side"]: c for c in _station([nail(-4.0, 11.48, 15, L, 1.5, 200, 30)])["cases"]}
|
||||
right = case["right"]
|
||||
assert right["result"]["limits"] == base["result"]["limits"]
|
||||
f = right["min_F"]["bishop"]
|
||||
assert f >= f0 - 1e-9 and f >= prev - 0.02 * prev, (L, f0, prev, f)
|
||||
prev = f
|
||||
|
||||
|
||||
# ---- 보강 없을 때 불변 · 측점 꼴 ------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user