chore(요구): 요구 390 요구서 · 분석 셋 — 안정성평가 한 번에 해석 · 바로 저장 · 측점 표기 · 보고서 맨 뒤 · 계산 점검
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,225 @@
|
||||
# 분석 390-A — 안정성평가 흐름 · 저장 · 3D 구간 · 보고서 순서 · 해석 단추 (요구 390 1 · 3 · 4 · 5)
|
||||
|
||||
범위 = 요구 390 항목 1(공용) · 3(3D 구간) · 4(보고서) · 5(해석 단추). 2 · 6 · 7 은 다른 분석 몫.
|
||||
근거 줄 번호 = 랩탑 main_laptop_1 `4dc32fc6c` 기준.
|
||||
|
||||
---
|
||||
|
||||
## 1a. 한 번에 다 돌리기 — E02 [해석 시작]
|
||||
|
||||
### 지금
|
||||
|
||||
단계 차례(화면) = E02 지반 → E03 2D → E04 3D → **E05 보고서** → E06 암반 → E07 광역 (E01 생성은 단계 밖).
|
||||
|
||||
- 주소 차례 `config/config_frontend.ts:144-152` · 막대 이름 · 아이콘 `A00_Common/group_workflow.ts:33-42`
|
||||
- 대시보드 단계 이름 `B01_Dashboard/B01_Dashboard_Summary.py:29` · 단계 수 6 `B01_Dashboard/B01_Dashboard_Router_Overview.py:25`
|
||||
- DB 단계 행 = 5 개뿐(STAB_AREA 없음) `common_util/common_util_workflow_state.py:23-27` — E 페이지는 단계 상태를 한 번도 안 바꿈(E0x 안 `mark_stage` · `start_stage` 부름 없음) → 대시보드 막대는 늘 「시작 전」
|
||||
|
||||
페이지별 해석 단추 · 길 · 시간 · 저장 자리:
|
||||
|
||||
| 페이지 | 단추 → 길 | 도는 꼴 · 진행률 | 실측 시간 | 저장 자리 |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| E02 | [저장] PUT `/stab/ground` `E02_StabGround_Router.py:133-146` · [초기화] `:149-154` | 해석 없음 | — | `E02_StabGround/ground.json` (`E02_StabGround_Model.py:62`) |
|
||||
| E03 | [해석] POST `/stab/analyze2d` `E03_StabSection_Router.py:310-339` | 뒤에서 · 일꾼 프로세스 병렬 `:205-228` · `GET /stab/progress` `:342-346` · 화면 잠금판 `E03_StabSection_UI_Page.ts:455-475` | 63 측점 182.6 s(534-4) · 속도 개선 뒤 59 측점 44.9 s(532-2) | `_derived/stab2d_station/<측점 지문>` · `_derived/stab2d_summary/<전체 지문>` `:12-13 · 231-281` |
|
||||
| E04 | [해석] · [다시 해석] POST `/stab/analyze3d` `E04_Stab3D_Router.py:122-161` — **한 구간씩** | 뒤에서 · 엔진 안 프로세스 풀 `E04_Stab3D_Engine_Search.py:419-423` · `GET /stab/progress3d` `:174-176` · [끊기] `:164-171` | 100 m 구간 하나 66 s(533-3) | `E04_Stab3D/results/<시작_끝>.json` `E04_Stab3D_Run.py:47-52 · 340-345` |
|
||||
| E05 | GET 첫 열기 = 자동 생성 `E05_StabReport_Router.py:100-107` · [보고서 갱신] POST `/refresh` `:147-166` | 바로 | 수 초(그림 PNG) | `E05_StabReport/report.json · report_meta.json · fig/ · _지난/` · `initial_snapshot/E05_StabReport/` (`E05_StabReport_Store.py:1-9`) |
|
||||
| E06 | [해석] POST `/stab/rock/analyze` `E06_StabRock_Router.py:177-181` | 바로(진행률 없음) | 1 s 안쪽 | `_derived/stab_rock/<지문>` `:160-174` |
|
||||
| E07 | [해석] · [다시 해석] POST `/stab/area/analyze` `E07_StabArea_Router.py:271-303` | 뒤에서 · `GET /stab/area/progress` `:306-308` | 2 m 격자 0.3 s(536-2) | `E07_StabArea/_derived/area.json` `:50 · 239` |
|
||||
|
||||
이미 있는 것:
|
||||
|
||||
- 일감 진행 = 페이지마다 따로 만든 메모리 표 `_JOBS`(E03 `:80` · E04 `:35` · E07 `:57` · E03 확률 `Router_Prob.py:61`) — 공용 일감 관리자 없음 · 서버 다시 켜면 진행 표시만 사라지고 결과 파일은 남음
|
||||
- 체인 견본 = B03 자동 설계 체인 `B03_FileInput/B03_FileInput_Service_Chain.py:1-16 · 157` (라우터 함수 직접 부름 · 단계별 실패 격리) · D03 `_start_job` `D03_PlanAnalysis_Router.py:143-166`
|
||||
- `design_pipeline.ts` = B05 · B06 화면 조작 응답용(브라우저 쪽) — 서버 일괄 해석과 무관
|
||||
- 입력 지문(같으면 안 셈) — 모두 있음
|
||||
- E03 측점 지문 = 엔진 코드 · 복사 지문 · 물성 · 조건 · 하중 · 지하수 · 지층 · 벽 `E03_StabSection_Router.py:120-169` · 바뀐 측점만 셈 `:234`
|
||||
- E04 지문 = 복사 지문 · E02 전체 · 탐색 설정 · 엔진 판(손으로 올리는 `"e04-4"`) `E04_Stab3D_Run.py:37 · 80-93`
|
||||
- E06 지문 = 엔진 코드 · 복사 지문 · 절리 · 설정(투영 뺌) · E02 물성 `E06_StabRock_Router.py:73-85`
|
||||
- E07 지문 = 복사 지문 · 설정 · 엔진 판 `E07_StabArea_Router.py:125-128` — **E02 는 안 들어감**(물성 값을 설정에 복사해 씀 `:105-122`)
|
||||
- E05 보고서 지문 = 2D 요약 · 대표 단면 · E02 · 3D 파일 · 광역 · 보강 · 암반 · 확률 · 양식 `E05_StabReport_Build.py:157-182` → 「[보고서 갱신]」 띠
|
||||
|
||||
뒤 페이지 입력이 바꾸는 해석:
|
||||
|
||||
| 바꾼 것 | 다시 셀 것 |
|
||||
| --- | --- |
|
||||
| E02 지반 조건 | 2D(지문 바뀐 측점) · 3D 전 구간 · 암반 · 보고서 (광역은 지문 빈틈으로 안 바뀜) |
|
||||
| E03 대표 단면 켬/끔 | 보고서만 |
|
||||
| E03 보강 · 확률(측점 하나 가정) | 그 저장본만 · 보고서 |
|
||||
| E04 구간 · 조건 · 탐색 설정 | 그 구간 3D · 보고서 |
|
||||
| E06 절리 · 설정 | 암반 · 보고서 |
|
||||
| E07 물성 · 시나리오 · 띠 · 문턱 | 광역 · 보고서 |
|
||||
|
||||
### 바꿀 곳
|
||||
|
||||
E02 [저장] 자리에 **[해석 시작]** 하나 — 누르면 서버가 ① 입력 검사 · 작업본 쓰기(지금 PUT 그대로) ② 일감 하나로 아래 차례를 돌림 ③ 단계 이름 · 비율을 내려 줌.
|
||||
|
||||
| 차례 | 단계 이름 | 부를 함수(고침 없이 그대로) | 비율 몫(대략) |
|
||||
| --- | --- | --- | --- |
|
||||
| 1 | 2D 측점 해석 | `E03_StabSection_Router.plan_run` + `run_all` | 0~30 % |
|
||||
| 2 | 3D 구간 해석 | `E04_Stab3D_Run.auto_sections` 차례로 `analyze`(지문 같으면 건너뜀) | 30~90 % |
|
||||
| 3 | 암반 해석 | `E06_StabRock_Router._run` (절리 없으면 「없음」 결과) | 90~92 % |
|
||||
| 4 | 광역 위험 | `E07_StabArea_Router.run` (설정 = 지난 저장본 설정 · 없으면 `defaults`) | 92~95 % |
|
||||
| 5 | 보고서 | `E05_StabReport_Store.refresh` (없으면 처음 만듦 · 사용자 시트 그대로) | 95~100 % |
|
||||
|
||||
- 새 파일 `E02_StabGround/E02_StabGround_Chain.py` · 길 셋 `E02_StabGround_Router.py`(154 줄 · 여유) — `POST /stab/run` · `GET /stab/run/progress` · `POST /stab/run/cancel`
|
||||
- 진행 꼴 = `{running, percent, stage, stage_name, steps:[{name, state}], message, error}`
|
||||
- 체인이 단계 도는 동안 그 페이지 `_JOBS[pid]` 에 같은 일감을 꽂음 → E03 · E04 · E07 화면이 고침 없이 「해석 중 n %」 를 보이고 페이지 [해석] 은 409 로 막힘
|
||||
- 결과는 지금 자리 그대로(영구 저장 = 프로젝트 storage) · 페이지는 열면 저장본만 읽음(지금도 그럼)
|
||||
- 다시 누름 = 지문 같은 조각은 0 초로 건너뜀 → 서버가 꺼져 끊겨도 [해석 시작] 한 번으로 이어 감
|
||||
- 화면 = E02 좌측에 진행 막대(`ui_template_progress`) + 단계 줄 다섯(`ui_template_list_row` · 끝남 · 도는 중 · 기다림) + [끊기] · 잠금판은 저장 순간만(분 단위 잠금 안 함 · 5장 잠금판 규칙)
|
||||
- 예상 시간 = 2D 1~3 분 + 3D 「100 m 구간 × 조건 수 × 약 1 분」(1.2 km · 건기만 ≈ 12 분 · 우기까지 ≈ 25 분) + 나머지 수 초 — **3D 가 거의 전부**
|
||||
|
||||
### 위험 · 물음
|
||||
|
||||
- E04 저장 열쇠에 조건이 없음 — `section_key(start, end)` `E04_Stab3D_Run.py:51-52` · 화면 `E04_Stab3D_UI_Page.ts:70` → 건기 · 우기를 차례로 돌리면 뒤 것이 앞 것을 덮음. 체인이 두 조건을 다 돌리려면 열쇠에 조건을 넣어야 함(열쇠 검사 `E04_Stab3D_Router.py:232` 도 글자 허용)
|
||||
- E07 지문에 E02 빠짐 — E02 붕적토 값을 고쳐도 광역은 옛 물성 그대로 「최신」 표시. 체인에서 광역 물성을 E02 에서 다시 받을지(사용자가 E07 에서 고친 값은?) 정할 거리
|
||||
- 체인 안 3D 설정 = 지난 저장본 설정 · 없으면 기본값. 사용자가 E04 에서 고친 탐색 설정이 화면 sessionStorage 에만 있으면 체인이 모름(1b 와 같이 풂)
|
||||
- 보고서 만들기 잠금 = E05 `_LOCKS`(asyncio) `E05_StabReport_Router.py:43 · 59-60` — 체인 5 단계도 같은 잠금을 써야 E05 첫 열기와 안 부딪힘
|
||||
- 서버 다시 켜짐(백엔드 파일 바뀜 · 싱크) = 체인 끊김 · 진행 표시 사라짐 — 결과 조각은 남아 다시 누르면 이어짐
|
||||
- DB 단계 행 5 개 · 막대 6 개 어긋남 — 체인이 단계 상태를 적을지(대시보드 막대 색) 정할 거리 · 안 적으면 지금처럼 늘 「시작 전」
|
||||
- 확률 · 보강 가정(E03 탭)은 측점 하나씩 사용자가 고르는 일이라 체인에서 뺌
|
||||
|
||||
---
|
||||
|
||||
## 1b. [저장] 단추 없애기 — 「해석 = 저장」
|
||||
|
||||
### 지금 — 페이지별 저장이 필요한 입력
|
||||
|
||||
| 페이지 | 입력 | 지금 단추 | 다음 열 때 |
|
||||
| --- | --- | --- | --- |
|
||||
| E02 | 물성 · 구간 · 지하수 · 지진 · 하중 · 기준안전율 | [저장] · [초기화] `E02_StabGround_UI_Page.ts:79-91` | 작업본 |
|
||||
| E03 | 대표 단면 켬/끔 | [대표 단면 저장] `E03_StabSection_UI_Page.ts:161-165 · 491-506` | 작업본 `representative.json` |
|
||||
| E03 | 확률 탭 입력 · 보강 가정 | 없음 — 돌리면 결과 저장본에 요청까지 남음 `UI_Prob.ts:82-85` | 캐시 |
|
||||
| E04 | 구간 · 조건 · 탐색 설정 | 없음 — 결과 파일에 설정이 남음 | **캐시 아니면 기본값**(저장된 설정 안 되살림) `E04_Stab3D_UI_Page.ts:440-451` |
|
||||
| E05 | 보고서 칸 고침(표지 · 개요 등) | [저장] · [초기화] · [보고서 갱신] | 작업본 |
|
||||
| E06 | 절리군 · 해석 설정 | [저장] · [초기화] · [해석] — [해석] 이 고친 것 먼저 저장 `E06_StabRock_UI_Page.ts:337` | 작업본 |
|
||||
| E07 | 물성 · 시나리오 · 띠 · 문턱 | 없음 — 결과 파일에 설정이 남음 | 캐시 아니면 지난 결과 설정 `E07_StabArea_UI_Page.ts:478-482` |
|
||||
|
||||
### 지침 5장과 맞추기
|
||||
|
||||
- 5장 = 조작은 캐시 · [저장] · [확정] 에서 작업본 · **자동저장(디바운스 PUT) 금지** · [저장] 때 서버가 다시 셈 · 잠금판은 [저장] · [확정] · [초기화] · 추천 노선 [적용] 만
|
||||
- 맞는 읽기 = **[해석] 이 곧 [저장]** — 사용자가 누르는 단추 하나에서 서버가 입력 검사 → 작업본 쓰기 → 서버 계산 → 결과 영구 저장. 칸을 바꿀 때마다 쓰는 것이 아니므로 자동저장 아님 · 서버가 다시 셈하므로 「브라우저 값 받아 적기」 아님
|
||||
- E06 이 이미 이 꼴(저장 뒤 해석) — [저장] 만 빼면 됨
|
||||
- 해석 전 고친 칸 = 지금처럼 캐시 + 「저장 안 됨(해석 전)」 글
|
||||
- 사용자가 「단추 없이 칸 바꾸면 바로 저장」 을 뜻했다면 = 5장 위반 → 되물음 거리
|
||||
|
||||
### 바꿀 곳
|
||||
|
||||
- E02 — [저장] → [해석 시작](1a) · [초기화] 남김
|
||||
- E06 — [저장] 뺌 · [해석] = 저장 + 해석(지금 코드 그대로) · 안내 글 `ui_template_locale_e06.ts:14` 고침
|
||||
- E04 — [해석] 때 설정을 결과에 남기는 것은 이미 함 → 열 때 **고른 구간 저장본 설정으로 되살림**(E07 꼴) · 체인도 그 설정을 씀
|
||||
- E07 — 그대로(이미 「해석 = 저장」)
|
||||
- E03 대표 단면 · E05 보고서 칸 = 해석 입력이 아님 → 갈래(아래)
|
||||
|
||||
### 위험 · 물음
|
||||
|
||||
- E04 · E07 설정을 작업본 파일로 따로 둘지(`E04_Stab3D/settings.json` 등) vs 결과 파일 안 설정만 쓸지 — 결과 파일만으로 충분(새 파일 안 만듦)이 가벼움
|
||||
- E02 [해석 시작] 하나로 묶으면 「저장만 하고 해석은 나중」 길이 없어짐(3D 수십 분) — [저장] 을 작은 보조 단추로 남길지
|
||||
|
||||
---
|
||||
|
||||
## 3. 3D 구간 나눔
|
||||
|
||||
### 지금
|
||||
|
||||
- 자동 구간 = 측점을 앞부터 100 m 넘게 묶음 · 짧은 꼬리는 앞 구간에 붙임 `E04_Stab3D_Run.py:39 · 55-69`
|
||||
- 한 번에 셀 상한 500 m — 주석 「시간 · 메모리」 `E04_Stab3D_Run.py:40` · 검사 `E04_Stab3D_Router.py:101-104`
|
||||
- 나눈 까닭 = 격자가 **구간 측점을 감싼 축 맞춤 직사각형**(± 탐색 폭 + 깊이 + 10 m) `E04_Stab3D_Run.py:100-110 · 196-206` — 굽은 노선을 통째로 넣으면 노선 띠가 아닌 큰 사각형 전체(1 m 칸)를 만들어 메모리 · 시간이 폭증. 구간 끝은 앞뒤 이웃 측점 하나씩 붙여 합성 지형을 이음 `:383-386`
|
||||
- 요구 근거 = 「선택 구간 3D」 · 「구간별 3D 안전율」 (요구서 345 L110 · 분석 345-D L82 · 117)
|
||||
- 화면 = 구간 고름 → [해석] 한 구간 → 결과 열기 `E04_Stab3D_UI_Page.ts:267-296 · 408-428`
|
||||
|
||||
### 바꿀 곳
|
||||
|
||||
- 나눔은 그대로 두고 **체인이 자동 구간을 차례로 다 돎**(1a 2 단계) — 사용자 쪽에서는 「구간」 을 고를 일이 사라지고 목록은 열면 다 칠해져 있음
|
||||
- E04 [해석] 은 사용자 지정 구간 · 설정용으로 남김
|
||||
- 열쇠에 조건 넣기(1a 위험) — `E04_Stab3D_Run.section_key` · `E04_Stab3D_Router.py:129 · 232` · `E04_Stab3D_UI_Page.ts:70 · 270-295 · 367-379` · 옛 열쇠(조건 없는 파일)는 「건기」 로 읽음
|
||||
|
||||
### 위험 · 물음
|
||||
|
||||
- 체인 3D 조건 = 건기만 · 우기만 · 둘 다 — 둘 다면 시간 두 배(1.2 km ≈ 25 분)
|
||||
- 구간 경계 바로 위 활동면은 두 구간 모두 반쯤만 봄 — 지금도 같은 한계(이웃 측점 붙임으로 지형만 이음) · 겹침 구간은 범위 밖
|
||||
|
||||
---
|
||||
|
||||
## 4. 보고서 — 맨 뒤로 · 전체 담기
|
||||
|
||||
### 지금
|
||||
|
||||
- 보고서가 암반 · 광역 앞에 있는 까닭 = **만든 차례 그대로** — 1차(E02 · E03 · E04 · E05 보고서) 뒤 2차(E06 암반 · E07 광역)를 뒤에 붙임 (요구서 345 L96 「E05 보고서 · 2차 E06 · E07」 · `config_frontend.ts:144` 주석 「E02 → E06 · 광역 E07」 · DB 단계 5 개 `common_util_workflow_state.py:23-27`)
|
||||
- 담는 것(빌더 `E05_StabReport_Build.py:1-17 · 436-465`) — 양식 시트 차례 `stab_report.json`: 표지 · 목차 · 개요 · 입력조건 · 측점표(2D) · 대표단면(2D 그림) · 3D요약 · 광역요약 · 보강검토 · 암반검토 · 확률해석 · 부록_절편
|
||||
- 3D요약 · 광역요약 = 늘 있음 · 결과 없으면 「3D 해석 전」 · 「광역 해석 전」 `:410-411` · `E05_StabReport_Area.py:85-87`
|
||||
- 보강 · 암반 · 확률 = 결과 없으면 시트를 뺌 `:451-462`
|
||||
- 그림 = 2D 대표 단면 · 평면 위험 띠(2D 판정 + 3D 구간) 뿐 — 3D 안전율 지도 · 스테레오넷 · 광역 위험 지도 그림 없음 (`E05_StabReport_Figure.py` 함수 = `section_svg` · `band_svg` 뿐)
|
||||
- 문제 = 보고서가 **처음 열 때 그 순간 있는 결과로 만들어짐** `E05_StabReport_Router.py:100-107` — 차례상 암반 · 광역 전에 열게 되어 「… 전」 로 박히고, 뒤에 해석하면 「[보고서 갱신]」 띠로만 알림
|
||||
|
||||
### 바꿀 곳(차례만 · 폴더 이름 E05 그대로)
|
||||
|
||||
| 파일 | 고칠 것 |
|
||||
| --- | --- |
|
||||
| `config/config_frontend.ts:144-152` | `STAB_STEP_ROUTES` = E02 · E03 · E04 · E06 · E07 · E05 + 주석 |
|
||||
| `A00_Common/group_workflow.ts:34-42` | 막대 이름 · 아이콘 같은 차례 |
|
||||
| `B01_Dashboard/B01_Dashboard_Summary.py:29` | 단계 이름 같은 차례 |
|
||||
| `common_util/common_util_workflow_state.py:23-27` | STABILITY 단계 = GROUND · SECTION · 3D · ROCK · AREA · REPORT (6) — 옛 프로젝트 행은 상태를 안 써서 그대로 두거나 새 SQL 로 다시 깖(갈래) |
|
||||
| `B01_Dashboard/B01_Dashboard_UI_Projects.ts:69` | 주석 |
|
||||
| `E05_StabReport/E05_StabReport_Build.py:197` | 빈 상태 글 「E03 에서 [해석]」 → 「E02 [해석 시작]」 |
|
||||
| `ui_template/ui_template_locale_e05.ts:13` | 안내 글에 암반 · 확률 더함 |
|
||||
| 가이드 `A05_EduDetail/guide/E05/00_설명서.md:17 · 41` · `E06/00_설명서.md:16` · `E07/00_설명서.md:16 · 35` | 단계 차례 글 · 「보고서에서 갱신」 길 · 장면 `E05/_scenes.json` |
|
||||
| 시험 `resources/tester/test_528_project_groups.py:262`(STABILITY 5 → 6) · `test_548_project_overview.py:66-75`(수만 봄 · 그대로 통과 예상) · `test_280_2_step_nav.py:39-45` + `helper_280_2_step_nav.cjs:122 · 204-205`(가짜 차례 넷 — E05 가 끝인 꼴이라 그대로 맞음) | |
|
||||
|
||||
- 담기 = 체인 끝에서 늘 갱신(1a 5 단계) → 보고서 페이지는 열기만 · 지금 「없으면 시트 뺌」 규칙 그대로면 전체가 담김
|
||||
|
||||
### 위험 · 물음
|
||||
|
||||
- 그림 더 넣을지(3D 안전율 지도 · 스테레오넷 · 광역 지도) — 「전체 보고서화」 의 범위 · 넣으면 `E05_StabReport_Figure.py` 에 그림 셋 · 양식 칸 더함(별도 일감)
|
||||
- 페이지 [해석](E04 · E06 · E07 단독) 뒤에도 보고서를 자동 갱신할지 — 갱신은 프로그램 시트를 덮음(사용자 고침은 `_지난/` 에 남기고 알림 `E05_StabReport_Store.py:124-166`) · 안 하면 지금처럼 띠
|
||||
- 폴더 이름(E05 = 맨 뒤)과 번호 어긋남 — 폴더 · 주소 이름까지 바꾸면 storage 폴더 · 시험 · 가이드 수십 곳(권하지 않음)
|
||||
|
||||
---
|
||||
|
||||
## 5. [다시 해석] · [해석] 차이
|
||||
|
||||
### 지금
|
||||
|
||||
- **E06 암반 화면에는 [다시 해석] 이 없음** — 단추 = [초기화] · [저장] · [해석] `E06_StabRock_UI_Page.ts:91-108` (임시 배포 데스크탑 판도 같음). [다시 해석] · [해석] 짝은 **E04 3D** `E04_Stab3D_UI_Page.ts:218-227` · **E07 광역** `E07_StabArea_UI_Page.ts:239-247` 에 있음
|
||||
- [해석] = 입력 지문이 저장본과 같으면 **안 세고** 저장된 결과를 엶(「같은 조건의 결과가 있습니다」) · 다르면 셈 — E04 `E04_Stab3D_Router.py:132-133` · E07 `E07_StabArea_Router.py:280-281`
|
||||
- [다시 해석] = 같은 요청에 `force: true` — 지문이 같아도 **처음부터 다시 셈** (E04 `:132` · E07 `:280`). 엔진이 같으면 결과도 같음
|
||||
- E06 [해석] = 고친 절리가 있으면 먼저 저장 → 지문 같으면 「입력이 같아 지난 결과를 씁니다」 `E06_StabRock_UI_Page.ts:332-350` · `E06_StabRock_Router.py:160-164`
|
||||
- 쉬운 말 = [해석] 은 「바뀐 게 있을 때만 계산」 · [다시 해석] 은 「안 바뀌어도 억지로 다시 계산」
|
||||
- [다시 해석] 이 쓸모 있는 때 = 엔진 코드가 바뀌었는데 판 글자(`ENGINE_VERSION` E04 `"e04-4"` · E07 `"e07-3"`)를 안 올렸을 때뿐. 판을 올렸으면 [해석] 도 다시 셈(가이드 「엔진이 바뀌면 [다시 해석]」 `guide/E07/04_해석_실행.md:21` 은 [해석] 으로도 됨)
|
||||
|
||||
### 바꿀 곳
|
||||
|
||||
- 합침 — [다시 해석] 뺌 · [해석] 하나 (`E04_Stab3D_UI_Page.ts:223-230` · `E07_StabArea_UI_Page.ts:244-248` · 로캘 `E04_Reanalyze` · `E07_Reanalyze` · 가이드 `E04/03_해석_돌리기.md:13` · `E07/04_해석_실행.md:7 · 16 · 21-22` · `E07/00_설명서.md:20`)
|
||||
- 엔진 판 = E03 · E06 처럼 엔진 파일 해시로(`E03_StabSection_Router.py:88-94` 꼴) → 판 올리기 잊음 걱정 없음 · 서버 `force` 칸은 남겨도 무방(시험 · 관리용)
|
||||
- 체인이 생기면 「전부 다시」 는 E02 [해석 시작] 몫
|
||||
|
||||
### 위험 · 물음
|
||||
|
||||
- 사용자가 본 「암반 해석 미리 계산」 화면이 어느 것인지 — E06 에는 짝 단추가 없음 · E04 또는 E07 을 본 것으로 읽음(확인 거리)
|
||||
|
||||
---
|
||||
|
||||
## 갈래 갈리는 결정
|
||||
|
||||
1. **체인 3D 조건** — 건기만 · 우기만 · 둘 다(둘 다 = 열쇠에 조건 · 시간 두 배)
|
||||
2. **E02 [저장] 남김** — [해석 시작] 하나만 vs [저장](작게) + [해석 시작]
|
||||
3. **E03 [대표 단면 저장]** — 그대로(해석 입력 아님) vs 누를 때 바로 PUT(5장 「조작 = 캐시」 와 어긋남) vs E05 [보고서 갱신] 때 함께 반영
|
||||
4. **광역 물성 출처** — 체인이 E02 붕적토를 다시 받음(E07 지문에 E02 넣음) vs 지난 E07 설정 그대로
|
||||
5. **페이지 단독 [해석] 뒤 보고서 자동 갱신** — 함 vs 지금처럼 띠
|
||||
6. **DB 단계 행** — 6 개로 다시 깔고 체인이 상태 적음(대시보드 막대 색) vs 그대로(늘 「시작 전」)
|
||||
7. **보고서 그림 더함** — 3D 지도 · 스테레오넷 · 광역 지도(별도 일감) vs 지금 그림만
|
||||
8. **[다시 해석] 뺌** — 뺌 + 엔진 판 = 파일 해시 vs 남김
|
||||
|
||||
## 나눔 — 창별 파일 경계
|
||||
|
||||
| 묶음 | 일 | 파일(이 묶음만 만짐) | 시험 | 앞뒤 |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| A 서버 체인 | 1a 일감 · 길 셋 · 페이지 `_JOBS` 꽂기 · 보고서 잠금 | 새 `E02_StabGround/E02_StabGround_Chain.py` · `E02_StabGround_Router.py` | 새 `resources/tester/test_<번호>_e02_chain.py`(가짜 단계 다섯 · 차례 · 비율 · 건너뜀 · 끊기) | B 의 `section_key(start, end, condition)` 꼴만 미리 맞춤 |
|
||||
| B E04 조건 열쇠 · 설정 되살림 · [다시 해석] 뺌 | 3 · 1b · 5 | `E04_Stab3D/E04_Stab3D_Run.py` · `E04_Stab3D_Router.py` · `E04_Stab3D_UI_Page.ts` · `E04_Stab3D_UI_Settings.ts` · `ui_template/ui_template_locale_e04.ts` | `test_533_3_e04_router.py` · `test_533_3_e04_engine.py` · `test_534_3_e05_report.py`(3D 견본 파일 이름) | — |
|
||||
| C E02 화면 | [해석 시작] · 진행 막대 · 단계 줄 · [끊기] | `E02_StabGround/E02_StabGround_UI_Page.ts` · `E02_StabGround_UI_Style.css` · `ui_template/ui_template_locale_e.ts` | `test_532_3_e02_ground.py` + ORCA | A 길 꼴 확정 뒤 |
|
||||
| D 단계 차례 | 4 보고서 맨 뒤 · DB 단계 | `config/config_frontend.ts` · `A00_Common/group_workflow.ts` · `B01_Dashboard/B01_Dashboard_Summary.py` · `B01_Dashboard/B01_Dashboard_UI_Projects.ts` · `common_util/common_util_workflow_state.py` · (갈래 6 이면 새 `db_management/*.sql`) · `E05_StabReport/E05_StabReport_Build.py:197` · `ui_template/ui_template_locale_e05.ts` | `test_528_project_groups.py` · `test_548_project_overview.py` · `test_280_2_step_nav.py` · `helper_280_2_step_nav.cjs` | — |
|
||||
| E E06 · E07 단추 | 1b E06 [저장] 뺌 · 5 E07 [다시 해석] 뺌 · 엔진 판 해시 | `E06_StabRock/E06_StabRock_UI_Page.ts` · `ui_template/ui_template_locale_e06.ts` · `E07_StabArea/E07_StabArea_UI_Page.ts` · `E07_StabArea/E07_StabArea_Router.py`(판 해시 · 갈래 4) · `ui_template/ui_template_locale_e07.ts` | `test_536_1_e06_rock.py` · `test_536_2_e07_area.py` | — |
|
||||
| F 가이드 | 차례 · 단추 글 · 장면 | `A05_EduDetail/guide/E02` · `E04` · `E05` · `E06` · `E07` | — | 맨 끝(B~E 뒤 한 창) |
|
||||
|
||||
- 같은 파일을 두 묶음이 안 만짐 · A 와 B 는 `E04_Stab3D_Run` 함수 꼴 하나만 약속
|
||||
- E03 화면(대표 단면 갈래 3)은 결정 뒤 따로 — 지금 묶음에 없음
|
||||
@@ -0,0 +1,193 @@
|
||||
# 분석 390-B — E03 측점 표기 · 3D 지형 · 평면 위험 띠 · E07 측점 (요구 390 · 2 · 6)
|
||||
|
||||
읽기 전용 분석 · 코드 고침 없음 · 줄 번호 = 10-27 main_laptop_1(4dc32fc6c) 기준.
|
||||
|
||||
---
|
||||
|
||||
## 2a. E03 측점 표기(누가 → No.+거리)
|
||||
|
||||
지금
|
||||
|
||||
- 좌측 목록 측점 칸 = 서버 `label` 에서 `STA.` · `.000` 만 뗀 글(「0+061」 = km+m 누가) — `E03_StabSection/E03_StabSection_UI_List.ts:84`
|
||||
- `label` 출처 = 복사본 횡단 파일 `label`(B05 `format_station` 「STA.k+mmm.mmm」 `B05_Profile/B05_Profile_Engine_Sections_Core.py:70-75`) → `E01_StabRegister/E01_StabRegister_Source.py:95 · 130` → `E03_StabSection_Router.py:152 · 196`(plan · `_meta`) → 해석 저장본 행에 굳음 → `GET …/stab/result2d` 가 저장본 행 그대로 냄(`Router.py:375-385`)
|
||||
- 가운데 횡단 카드 제목 = `view.label ?? view.key` — `E03_StabSection_UI_Page.ts:289`(section 응답 `E03_StabSection_View.py:74`)
|
||||
- 위험 띠 · 3D · 횡단 툴팁 = 측점 글 없음
|
||||
- 빠진 측점 띠 = 「61.5 m」 꼴 — `E01_StabRegister/E01_StabRegister_UI_Missing.ts:19`(E02 · E03 위 공용)
|
||||
|
||||
공용 도구
|
||||
|
||||
- TS `common_util/common_util_station.ts:11 stationLabel(chainage, interval, decimals)` · `:34 inferStationInterval(stations)`(최빈 간격) — E02 가 이미 씀(`E02_StabGround/E02_StabGround_UI_Tables.ts:21 · 309 · 322`) · D01 · D03 · D04 · B05 · B08 씀
|
||||
- 파이썬 짝 = `D04_PlanConfirm/D04_PlanConfirm_Export.py:58-68 station_label`(소수 한 자리 고정 · 모듈이 geopandas · pyproj 끌고 옴 → E05 가 import 하기 무거움) · 거울 시험 `resources/tester/test_545_1_station_label_mirror.py`
|
||||
- 다른 파이썬 표기는 꼴이 다름 — `B07_DesignDetail_Engine_Cad_Development.py:60`(`No.04+08`) · `M02_Table_Fill.py:297`(`NO.12+5`) → 안 씀
|
||||
- 측점 간격 정본 = B 최신 종단 `longitudinal_sections.data.options.station_interval_m`(`B06_Section/B06_Section_Repository.py:86-108`) · E 복사본 db.json 에 그 행 있음(`common_util/common_util_project_copy.py:5-12 · 359-387`) · 없으면 20(B08 꼴 `B08_Quantity_Summary_Table.ts:45`)
|
||||
|
||||
측점 글을 찍는 곳(E03 · E05 · E07 전수)
|
||||
|
||||
| 자리 | 줄 | 지금 꼴 |
|
||||
| --- | --- | --- |
|
||||
| E03 좌측 목록 | `E03_StabSection_UI_List.ts:84` | `0+061` |
|
||||
| E03 횡단 카드 제목 | `E03_StabSection_UI_Page.ts:289` | `STA.0+061.000` |
|
||||
| E03 위험 띠 · 3D | `UI_Plan.ts` · `UI_View3D.ts` | 없음 |
|
||||
| E01 빠진 측점 띠(E02 · E03) | `E01_StabRegister_UI_Missing.ts:19` | `61.5 m` |
|
||||
| E05 이름 사전(전 시트 공용) | `E05_StabReport_Cells.py:90-98 _labels · _label_at` | 복사본 label |
|
||||
| E05 s4 측점표 A 칸 | `E05_StabReport_Build.py:360`(B 칸 = 누가 m `:361`) | 〃 |
|
||||
| E05 s6 3D 구간 시점 · 종점 | `Build.py:399-400` | 〃 |
|
||||
| E05 평면 띠 그림 첫 · 끝 측점 | `Build.py:423` → `E05_StabReport_Figure.py:355-357` | 〃 |
|
||||
| E05 대표 단면 · 부록 절편표 제목 | `E05_StabReport_Section.py:112 · 126 · 132 · 141 · 256 · 271 · 276` | 〃 |
|
||||
| E05 s7 광역 위험 측점 | `E05_StabReport_Area.py:124` | 기록 label 먼저 |
|
||||
| E05 s8 보강 | `E05_StabReport_Reinforce.py:122` | 기록 label 먼저 |
|
||||
| E05 s11 암반 | `E05_StabReport_Rock.py:177 · 183` | 기록 label 먼저(183) |
|
||||
| E05 s12 확률 | `E05_StabReport_Prob.py:87` | 기록 label 먼저 |
|
||||
| E07 | 6장 | — |
|
||||
|
||||
바꿀 곳
|
||||
|
||||
- 화면 = 서버 label 을 안 읽고 `stationLabel(row.chainage_m, interval, 1)` · interval = `inferStationInterval(result.stations)`(E02 꼴) — `UI_List.ts:84` · `UI_Page.ts:289`
|
||||
- 까닭: 지문에 label 이 없음(`Router.py:147`) → 서버 label 을 고쳐도 옛 저장본은 「fresh」 로 남아 다시 해석도 안 됨 · 화면에서 누가로 셈하면 저장본 그대로 바로 바뀜
|
||||
- 보고서 = 새 `common_util/common_util_station.py` — `station_label(chainage, interval, decimals=1)` · `infer_station_interval(stations)` = TS 짝(두 파일 머리 짝 표시 · `test_545_1` 넓힘 또는 새 거울 시험)
|
||||
- `E05_StabReport_Cells.py:90-98 _labels` = 누가 → `station_label` 로(복사본 label 안 씀) — 한 곳 고치면 s4 · s5 · s6 · 부록 · s11 `_station_text` 따라옴
|
||||
- 기록 label 을 먼저 쓰는 넷 = 순서 뒤집음(누가 → 사전 먼저): `Area.py:124` · `Reinforce.py:122` · `Rock.py:183` · `Prob.py:87` — 기록 label 은 해석 때 굳은 `STA.` 꼴
|
||||
- 띠 그림 `Build.py:423 at.get("label")` → `_label_at`
|
||||
- s4 B 칸 누가(m) 숫자는 그대로(D04 545 꼴 = 측점 칸 + m 칸)
|
||||
- 시험 = `test_534_3_e05_report.py:243 · 349 · 390`(「No.3」 기대 → 「3+0」 꼴 · 견본 label 칸은 안 읽힘) · `test_532_3_e03_section.py`(TS 부분) + ORCA
|
||||
|
||||
위험 · 물음
|
||||
|
||||
- 자릿수 — B 목록 = 정수(`common_util_station.ts:9` 사용자 확정) · D = 소수 한 자리(`61+14.5`). 정수면 39.6 m → 「1+20」(잔여만 반올림 · 다음 측점으로 안 올림 `:15-19`) · 구조물 보조 측점이 섞인 E 엔 소수 한 자리 권함 → 갈래 1
|
||||
- 간격 출처 — 최빈 추정이면 서버 안 고침 · 정본(종단 옵션)이면 result2d · E07 개요 · E05 inputs 에 칸 덧 → 갈래 2
|
||||
- 요청 밖 같은 꼴 — E01 빠진 측점 띠 · E04 `E04_Stab3D_UI_Map.ts:46 · 155 · 314` · `E04_Stab3D_UI_Page.ts:121 · 332` · E06 `E06_StabRock_UI_Result.ts:106 · 133 · 157` · `E06_StabRock_UI_Page.ts:220` → 갈래 7
|
||||
|
||||
---
|
||||
|
||||
## 2b. 3D 보기에 설계 지형
|
||||
|
||||
지금
|
||||
|
||||
- [3D 보기] = 모달 · 복사본 노선면 리본(노면 · 측구 · 깎기 · 쌓기 비탈)만 · 리본 줄마다 가장 가까운 측점 안전율 띠 색 · 지형 없음 — `E03_StabSection_UI_View3D.ts:1-6 · 115-146`
|
||||
- 길 = `GET …/stab/corridor3d` · 복사본 corridor JSON 1 m 솎음 · 원점 = 첫 리본 첫 점 — `E03_StabSection_Router.py:438-476`
|
||||
- B05 `createRouteViewer` 를 안 쓴 까닭 = DB 지표면 · 색 고리 없음(`UI_View3D.ts:5`)
|
||||
|
||||
E 에 설계 지형이 있나
|
||||
|
||||
- 있음 — E01 생성 때 「설계가 쓴 DTM 하나」 복사(`common_util_project_copy.py:398-406` · `dtm_<source_filter>[_smooth].npz` = `build_surface_sampler` 가 연 그것) → `E01_StabRegister_Source.py:139-144 terrain_grid_path`
|
||||
- 없는 것 = 라이다 LAS · 수치지형도 도엽 · B04 미리보기 GLB · 지표면 모델 파일(`project_copy.py:11-12`) → 「라이다냐 지형도냐」 = 그 DTM 이 어느 쪽에서 왔느냐 뿐(db.json `surface_params`)
|
||||
- 이미 E 가 씀 — E03 지반선 넓힘 `Router.py:187-192` · E04 `E04_Stab3D_Run.py:198` · E07 `E07_StabArea_Router.py:163-165`
|
||||
|
||||
지형 메쉬를 짓는 길(B · D · E04)
|
||||
|
||||
| 화면 | 길 | E 에서 |
|
||||
| --- | --- | --- |
|
||||
| B04 | `createSurfaceTerrainViewer`(`B04_PreProcess_UI_TerrainViewer.ts:54`) · 미리보기 GLB | 막힘(GLB 없음) |
|
||||
| B05 | `createRouteViewer().loadSurface`(`B05_Profile_UI_Viewer.ts:427-480`) → `GET /surface/models/{id}/preview`(`B04_PreProcess_Router_Status.py:153-199` · 미리 만든 GLB 파일) + 지형 잘림 `TerrainBandSplit`(`B05_Profile_UI_Corridor_Split.ts:47`) | 막힘(모델 id · GLB 없음) |
|
||||
| D03 | B05 뷰어 그대로 + `buildCorridor`(`D03_PlanAnalysis_UI_3D.ts:16 · 85 · 111-116`) | 막힘(같음) |
|
||||
| E04 | 해석 격자 → `terrainMesh(grid, z)` 순수(`E04_Stab3D/logic/E04_Stab3D_Mesh.ts:20-59`) · three 직접(`E04_Stab3D_UI_View3D.ts:5-6 · 143-153`) | 씀 |
|
||||
| 공용 | DTM 원시 이진 `dtm_grid_bytes` / `parseDtmGrid`(`common_util_surface_sampler.py:144-166` · `.ts:29`) | 축이 고르지 않음 → E04 Grid(고른 dx) 꼴과 안 맞음 |
|
||||
|
||||
제안(가장 짧은 길)
|
||||
|
||||
- 서버 = 새 길 없이 `corridor3d` 응답에 `terrain` 칸 덧(같은 lru 캐시 · 열쇠에 npz mtime 덧) — `Router.py:438-476`
|
||||
1. npz → 리본 상자 + 여유(B05 `BAND_MARGIN_M` 80 m `UI_Corridor_Split.ts:14`)로 자름 → k 칸 건너 뽑음(2 m · 보간 없음 · 또는 E07 `resample_dem` `E07_StabArea_Engine.py:71-82`)
|
||||
2. 노선면 발자국 = 리본마다 첫 열 + 끝 열(거꾸로) 다각형 · 합집합 → `shapely.contains_xy` 안 셀 = null(지형 구멍 — 깎기 구간 지형이 노면을 덮지 않게 · shapely 2.1.2 있음)
|
||||
3. 꼴 = `{grid: {x0, y0, dx, nx, ny}, z: [… | null]}` · 리본과 같은 원점을 뺌
|
||||
- 화면 = `E03_StabSection_UI_View3D.ts` — `terrainMesh(grid, z)`(E04 logic import) → `[x, z, −y]`(리본과 같은 변환 `:127`) · Lambert 한 색 · 「지형」 켬끔(부품 `createCheckbox` · E04 꼴 `E04_Stab3D_UI_View3D.ts:51-56`) · 카메라 맞춤은 지금처럼 리본 기준(`:148-156`)
|
||||
- `UI_Page.ts` 안 만짐(응답 칸만 늘어남)
|
||||
- 시험 = `test_532_3_e03_section.py:264`(corridor3d) 에 terrain 칸 · 발자국 안 null · 원점 맞음 + ORCA(`__e03View3d` 에 지형 꼭짓점 수 덧)
|
||||
|
||||
위험 · 물음
|
||||
|
||||
- 크기 — 긴 노선(6 km) 상자 = 수백만 칸 → 상자 대신 띠(E07 `band_cells` `Engine.py:257-266` · 중심선 ± 100 m)로 자르고 2~3 m · 응답 크기 실측 필요
|
||||
- 이음매 — 2 m 구멍 가장자리와 비탈 끝(daylight) 사이 1~2 m 틈 · B05 처럼 매끈히 잇기(TerrainBandSplit + 트림)는 무거움 → 갈래 3
|
||||
- 지형 색 — E03 그림 토큰 없음(`--draw-*` 에 지형 없음) → `--e03-terrain` 덧(`UI_Style.css` · 창 2 몫) vs E04 꼴 상수(`E04_Stab3D_UI_View3D.ts:41-44`)
|
||||
- 복사본 불변 — `dtm_grid_file` 처럼 npz 곁에 `.bin` 을 쓰는 길(`common_util_surface_sampler.py:169-177`)은 복사본 폴더에 파일을 남김 → 안 씀
|
||||
|
||||
---
|
||||
|
||||
## 2c. 평면 위험 띠 — 줌 · 옮김 · 측점 글
|
||||
|
||||
지금
|
||||
|
||||
- SVG 한 장 · 높이 96 px 고정(`E03_StabSection_UI_Plan.ts:22` · `UI_Style.css:199-205`) · 전체 한 번 맞춤(북 위 · 같은 축척 `logic/E03_StabSection_Logic.ts:177-191 planFit`) · 판정 색 꺾은선(`:153-174 bandSegments`) · 고른 측점 동그라미 · 누르면 30 px 안 가까운 측점(`UI_Plan.ts:77-89`)
|
||||
- 줌 · 옮김 · 측점 글 = 처음부터 없음(PLAN 532-3 꼴 그대로)
|
||||
- 측점 고름 · 조건 바꿈마다 띠를 통째로 새로 지음(`UI_Page.ts:400-404`) → 줌 상태를 쥘 자리 없음 · ResizeObserver 도 매번 새로(`UI_Plan.ts:93`)
|
||||
- 남북으로 긴 노선 = 96 px 높이에 같은 축척으로 맞춰 가늘고 작음
|
||||
|
||||
높이 900 겹침 · 띠 아래 빈 칸 — 까닭 찾음
|
||||
|
||||
- `.e03-page` 행 = `auto minmax(0, 1fr)` 둘(`UI_Style.css:79-87`) · 자식은 셋(빠진 측점 띠 · 위험 띠 · 본문 — `UI_Page.ts:173-186`)
|
||||
- → 위험 띠가 1fr 칸 · 본문이 암묵 auto 칸 — 창이 크면 띠 아래 빈 칸(BRAIN_MEM 「띠와 횡단 사이 빈 칸」) · 900 이면 본문 auto 높이가 넘쳐 1fr 칸 = 0 → 띠가 본문과 겹치고 아래가 잘림(BRAIN_MEM 「900 에서 겹쳐 잘림」)
|
||||
- 고침 = `grid-template-rows: auto auto minmax(0, 1fr)` 한 줄
|
||||
|
||||
B05 평면 제어 — 있는 것
|
||||
|
||||
- 휠 확대(방향 = 설정 `aislo:pref:input-prefs` `wheelZoom` · `A00_Common/input_prefs.ts:21 · 63 wheelEventIn` · `touch_bridge.ts:37`) · 계수 1.15 / 0.87 · 가운데 끌기 = 옮김 · 왼쪽 = 고르기 — `B05_Profile_UI_RouteEdit_Input.ts:47-128 bindRouteEditNavigation`(ViewState · VWorldMeta 캔버스 꼴)
|
||||
- 회전 = 단추 15° · Ctrl+휠 5° · 글자 세움 — `B05_Profile_UI_RouteEdit_Rotate.ts:52-97 createMapRotation`(단추 `[data-act="rotate-ccw|cw"]` · 부품 상자 `ui_template_icons.ts` 에 회전 아이콘 없음)
|
||||
- 측점 눈금 + 이름 + 겹침 비킴 + 솎음(1 · 2 · 5) = `B04_PreProcess_UI_MapOverlays.ts:230- drawStationTicks`(안에서 `stationLabel`)
|
||||
- 캔버스 꼴 재사용 견본 = D03 — 위성 없으면 가짜 도엽 `D03_PlanAnalysis_UI_Map.ts:99-121 fakeMeta` · 눈금 `:233-243` · 탐색 `:358-365`
|
||||
- 같은 규칙의 SVG 판 = A00 공용 `attachSvgZoomPan`(`A00_Common/b_svg_zoom_pan.ts:1-16 · 82-86` — B05 노선 편집과 같은 계수 · 가운데 끌기 · 두 번 누름 원배율 · 휠 방향 설정 `:18 · 222`) · E03 횡단이 이미 씀(`UI_Section.ts:16 · 399-416` · 선 `non-scaling-stroke :134` · 글자 크기 고정 `--e03-label-k` CSS `:333-340`)
|
||||
|
||||
제안(가장 짧은 길 = SVG 유지 + 공용 줌)
|
||||
|
||||
- `UI_Plan.ts` — 꺾은선 · 동그라미를 `<g>` 한 겹에 넣고 `attachSvgZoomPan({ wheelZoom: true, initial, onChange })` · 선 `non-scaling-stroke`
|
||||
- 측점 글 — 측점 중심점마다 `stationLabel(ch, interval, 1)` · 화면 간격 따라 솎음(1 · 2 · 5 · 10 · 25 · 50 측점마다 · E07 꼴 `E07_StabArea_UI_Map.ts:115-116`) · 솎음 수 고르기 = logic 순수 함수 · 배율 바뀌면(onChange) 글만 다시 · 글자 크기 고정 = 횡단 `--e03-label-k` 꼴 · 고른 측점은 늘 글
|
||||
- 줌 상태 = Page 가 쥠(횡단 `zoom` 꼴 `UI_Section.ts:399-401`) → `buildPlan(…, zoom, onZoom)`
|
||||
- 누름 판정 = 줌 상태를 되돌려 셈(횡단 `UI_Section.ts:386-391` 꼴) — 지금 `scr()` 는 원배율 전제(`UI_Plan.ts:78-86`)
|
||||
- 높이 — 위 grid 고침 + 높이 키움(갈래 6)
|
||||
- 시험 = logic 솎음 함수 TS 시험(`test_532_3_e03_section.py:408` bandSegments 꼴) + ORCA(휠 두 방향 설정 · 가운데 끌기 · 두 번 누름 · 측점 누름 · 창 높이 900 · 1080)
|
||||
|
||||
다른 길(B05 부품 그대로 · 캔버스)
|
||||
|
||||
- D03 꼴 = `fakeMeta` + `computeRouteView` + `createMetricProjector` + `bindRouteEditNavigation` + `drawStationTicks` + `createMapRotation` — 회전 · 글 비킴까지 B05 와 같음
|
||||
- 대신 `UI_Plan.ts` 통째 캔버스로 다시(≈ 200 줄) · 노선 중심선(db.json `route_points`) 필요(측점 중심을 이은 줄 길이 ≠ 누가 → 눈금 밀림) · 회전 단추 아이콘 부품 상자 덧 · B05 RouteEdit 파일 셋이 `B05_Profile/CLAUDE.md` 「남의 페이지가 부르는 파일」 밖(분석 389-B 지적)
|
||||
|
||||
위험 · 물음
|
||||
|
||||
- 회전 — `attachSvgZoomPan` 에 회전 없음 · 필요하면 안쪽 회전 겹 + 글 세움 + 아이콘 덧(389 D03 일과 `ui_template_icons.ts` 겹칠 수 있음) → 갈래 5
|
||||
- 왼쪽 끌기 옮김 — B05 규칙 = 가운데만 · 띠에서 왼쪽 = 측점 고름 · 빈 곳 왼쪽 끌기를 더하려면 `panStart`(`b_svg_zoom_pan.ts:78-79 · 170`)
|
||||
- 남북 노선 — 회전 없이는 줌으로만 키움
|
||||
|
||||
---
|
||||
|
||||
## 6. E07 광역 위험 측점 표기
|
||||
|
||||
지금
|
||||
|
||||
- 서버 — 해석 때 복사본 label(`STA.` 꼴)을 측점 행에 굳혀 저장(`E07_StabArea_Router.py:195-197`) · 개요 측점도 같은 label(`:320-328`)
|
||||
- 화면 — 측점 표 칸 `E07_StabArea_UI_Page.ts:89-90 shortLabel · :379`(「0+061」) · 지도 측점 글 `E07_StabArea_UI_Map.ts:37 · 127` · 셀 툴팁 「측점」 `:230`(label 없으면 누가 소수 한 자리)
|
||||
- 지도 글 솎음 = 측점 간격 20 m 고정 전제(`UI_Map.ts:115`)
|
||||
- 보고서 s7 = `E05_StabReport_Area.py:124`(2a 와 함께)
|
||||
|
||||
바꿀 곳
|
||||
|
||||
- 화면만 — `stationLabel(ch, interval, 1)` · interval = `inferStationInterval(overview.stations)`: `UI_Page.ts:89-90 · 379` · `UI_Map.ts:37 · 115 · 127 · 230`(지도는 `setRoute` 때 받은 stations 로 추정 `:265-270`)
|
||||
- 서버 label 칸은 그대로(`test_536_2_e07_area.py:260` 이 label 통과를 봄 · 다시 해석 없이 바뀜)
|
||||
- 시험 = E07 화면 TS 시험 없음 → ORCA(표 · 지도 글 · 툴팁)
|
||||
|
||||
위험 · 물음
|
||||
|
||||
- `E07_StabArea_UI_Page.ts` · `E07_StabArea_Router.py` = 분석 390-A 나눔 E 묶음([다시 해석] 뺌)이 쥔 파일 → 그 창에 붙이거나 그 뒤
|
||||
- E07 지도 휠 · 왼쪽 끌기 = 자체 꼴(`UI_Map.ts:186-212` · 설정 휠 방향 안 따름) — 요청 밖 · 메모만
|
||||
|
||||
---
|
||||
|
||||
## 갈래 갈리는 결정
|
||||
|
||||
1. **측점 거리 자릿수** — 정수(B 목록 그대로 · 39.6 → 「1+20」) vs 소수 한 자리(D 와 같음 · `61+14.5`) · 권함 = 소수 한 자리
|
||||
2. **측점 간격 출처** — 측점 목록 최빈 추정(E02 꼴 · 서버 안 고침 · 파이썬 짝 같은 셈) vs 복사본 B 종단 옵션 값(정본 · 응답 칸 덧) · 권함 = 추정
|
||||
3. **3D 지형** — (가) 띠 격자 + 노선면 발자국 구멍 · 틈 1~2 m 허용(권함) · (나) 구멍 없이 반투명 · (다) E04 합성 DEM(설계 반영 · 구간 단위 · 무거움)
|
||||
4. **위험 띠 방식** — (가) SVG + 공용 `attachSvgZoomPan` + 측점 글(권함 · 회전 없음) · (나) D03 꼴 캔버스로 B05 부품 그대로(회전 · 글 비킴 · 중심선 필요)
|
||||
5. **위험 띠 회전** — 없음 vs B05 단추 · Ctrl+휠(아이콘 부품 덧)
|
||||
6. **위험 띠 높이** — 96 px 그대로 vs 키움(예 160 px) vs 끌어 늘이기
|
||||
7. **함께 바꿀지** — E01 빠진 측점 띠(m) · E04 · E06 측점 글(요구 3 창과 한 벌)
|
||||
|
||||
## 나눔 — 창별 파일 경계
|
||||
|
||||
| 창 | 일 | 파일(이 창만 만짐) | 시험 | 앞뒤 |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| 1 보고서 측점 | 파이썬 짝 · E05 이름 사전 · 기록 label 순서 · 띠 그림 | 새 `common_util/common_util_station.py` · `common_util/common_util_station.ts`(머리 짝 줄만) · `E05_StabReport_Cells.py` · `_Build.py`(`:218` 입력 · `:423`) · `_Area.py` · `_Reinforce.py` · `_Rock.py` · `_Prob.py` | `test_545_1_station_label_mirror.py`(넓힘) · `test_534_3_e05_report.py` | 갈래 1 · 2 뒤 · `_Build.py` 는 390-A 나눔 D(`:197`)와 같은 파일 → 차례로 |
|
||||
| 2 E03 화면 측점 · 위험 띠 · 높이 흠 | 2a 화면 · 2c 전부 · grid 한 줄 | `E03_StabSection_UI_List.ts` · `_UI_Page.ts` · `_UI_Plan.ts` · `_UI_Style.css` · `logic/E03_StabSection_Logic.ts` · `ui_template/ui_template_locale_e03.ts` | `test_532_3_e03_section.py`(TS) · `test_553_4_de_parts.py` + ORCA | 갈래 1 · 4 · 5 · 6 뒤 |
|
||||
| 3 E03 3D 지형 | 2b 전부 | `E03_StabSection_Router.py`(`_corridor3d` · `corridor3d` 만) · `E03_StabSection_UI_View3D.ts` | `test_532_3_e03_section.py`(corridor3d 시험만) + ORCA | 갈래 3 뒤 · 지형 색 토큰이면 창 2 가 CSS 한 줄 먼저 |
|
||||
| 4 E07 측점 | 6 화면 | `E07_StabArea_UI_Map.ts` · `E07_StabArea_UI_Page.ts`(`:89-90 · 379`) | ORCA | 390-A 나눔 E 창에 붙임 권함(같은 파일) |
|
||||
|
||||
- 창 2 · 창 3 = E03 안에서 파일이 갈림(창 3 은 Router.py · UI_View3D.ts 만 · `UI_Page.ts` 안 만짐)
|
||||
- 창 2 · 창 3 이 같은 시험 파일 — 서로 다른 시험 함수만 덧
|
||||
- 창 1 이 TS `common_util_station.ts` 는 머리 짝 줄만 — 함수 몸통 안 만짐(B · D 시험 영향 없음)
|
||||
@@ -0,0 +1,162 @@
|
||||
# 390-C 안정성평가 계산 점검 · 상용 SW · 문헌 대조 (요구 390-7)
|
||||
|
||||
> 물음 — 「해석이 생각보다 빠름 · 상용 프로그램 대비 계산 로직이 괜찮은지」
|
||||
> 방법 — 코드 읽기(file:line) + 탐색 밀도 · 시드 수렴 실측(벤치 문제 · 합성 단면 · 검증 사본 57 측점 저장본 읽기) + 상용 SW 문서 · 문헌 대조
|
||||
> 소스 고침 없음 · 실측은 표준입력 스크립트(파일 안 만듦)
|
||||
|
||||
## 0 한눈 요약
|
||||
|
||||
- 빠른 까닭 = **덜 찾아서가 아님** — 면 수는 Slide2 기본의 4~5 배. 수천 면을 한 번에 넘파이로 셈(벡터화) + 측점 병렬(코어 − 2) + 지문 저장(같은 입력 다시 안 셈).
|
||||
- **판정 값(Bishop 원호)은 수렴** — 격자 4 배 · 반복 3 배 · 시드 바꿔도 차 ≤ 0.04 %.
|
||||
- 흠 셋 — ① **비원호 탐색이 시드에 따라 ±2~4 % 흔들림**(미수렴) ② **판정이 Bishop 원호만** → 비원호가 더 낮은 측점을 놓침(검증 사본 228 경우 중 6 경우 판정 뒤집힘) ③ **탐색 한계가 비탈 끝 + 2H** → 깎기 위 자연 비탈을 지나는 큰 면 제외(합성 단면 우기 1.861 → 1.526 · −18 %).
|
||||
- 3D — 기본 설정 그대로 Scoops3D 검증 문제 셋 ±0.1 % · 조밀해도 차 ≤ 0.4 %(§3.3) → 탐색 충분. 암반 · 광역은 닫힌 꼴이라 빠른 것이 정상.
|
||||
|
||||
## 1 우리 계산
|
||||
|
||||
### 1.1 E03 2D 한계평형(측점 단면)
|
||||
|
||||
| 항목 | 값 | 자리 |
|
||||
|---|---|---|
|
||||
| 해석 측점 | 복사본 전 측점(대표 단면은 보고서 표시만) | `E03_StabSection_Router.py:143` |
|
||||
| 경우 | 좌 · 우 비탈 × 건기 · 우기(+지진) | `Engine_Station.py:24,46-62` · `Router.py:129` |
|
||||
| 탐색 한계 | 노면 반대쪽 끝 ~ 비탈 끝 바깥 max(5 m, 2H) · 진입 · 진출 모두 그 안 | `Engine_Model.py:183-225` · `Engine_Search.py:83` |
|
||||
| 해석 폭 · 바닥 | 지형 ±40 m · 바닥 = 최저 − max(5 m, 0.5 고저차) | `Engine_Model.py:38,94,165` |
|
||||
| 원호 거친 탐색 ① 진입 · 진출 | 25 점 쌍 × 중심각 8 = 2,400 원 | `Engine_Search.py:48-57` |
|
||||
| 원호 거친 탐색 ② 격자 · 반지름 | 중심 15 × 15 × 반지름 10 = 2,250 원(한계 밖 버림) | `Engine_Search.py:60-84,411` |
|
||||
| 거친 탐색 절편 · 방법 | 30 절편 · Fellenius · Bishop · Janbu(Spencer 는 상위 300 원만) | `Engine_Search.py:409,435-466` |
|
||||
| 원호 다듬기 | 방법마다 차분진화(무리 35 · 최대 60 세대 · 12 세대 무개선 멈춤) · 50 절편 | `Engine_Search.py:36-37,99-125,408` |
|
||||
| 교차 재평가 | 방법마다 찾은 원 + 상위 10 을 모든 방법으로 다시 셈 | `Engine_Search.py:487-493` |
|
||||
| 비원호 씨앗 | 임계 원 → 꺾은선 + 블록 씨앗(12 점 쌍 × 쐐기각 2 × 지층) → Janbu 로 상위 40 | `Engine_Search.py:370-396,514-524` |
|
||||
| 비원호 최적화 | 꼭짓점 6(안쪽 4) · 출발점 8 × 후보 24 × 30 걸음(Spencer 60) + Nelder-Mead 120 | `Engine_Search.py:31-34,172-195,299-332` |
|
||||
| 비원호 방법 | Janbu · Spencer 만 최적화 · Fellenius · Bishop 비원호 = 참고 칸 | `Engine_Search.py:529-544` |
|
||||
| 수렴 | 상대 1e-6 · 최대 100 회(뉴턴 + 반쯤 섞기) | `Engine_LEM.py:33,36,402-433` |
|
||||
| 거름 | m_α < 0.2 면 버림 · 활동면 최소 깊이 0.3 m | `Engine_LEM.py:23` · `Engine_Station.py:14` |
|
||||
| **판정** | **Bishop 의 원호 · 비원호 중 작은 값 — 비원호 Bishop 은 참고라 사실상 Bishop 원호만** | `E03_StabSection_View.py:4,14,37-39` · `Engine_Search.py:543-550` |
|
||||
| 병렬 · 저장 | 측점 프로세스 병렬(코어 − 2) · 측점 지문 같으면 안 셈 | `Router.py:232-245` |
|
||||
|
||||
면 수(실측 · 합성 단면 · 한 경우) — 원호 6,300~8,800 + 비원호 11,100~17,100 = **약 1.8~2.6 만 면** · 측점(4 경우) 약 9 만 면 · 1 km(20 m 간격 50 측점) 약 450 만 면.
|
||||
시간(실측) — 측점 하나 직렬 4.9 s(합성) · 12 s 중앙(검증 사본 57 측점 저장본) · 그중 **비원호가 76 %** · 원호만 1.2 s.
|
||||
|
||||
### 1.2 E04 3D(Hungr 3D Bishop + Scoops3D 꼴 구 · 타원체)
|
||||
|
||||
| 항목 | 기본값 | 자리 |
|
||||
|---|---|---|
|
||||
| 구간 | 자동 100 m · 한 번 최대 500 m · 노선 ±30 m 띠 안 노드만 | `E04_Stab3D_Run.py:39-40,131-157` · `Router.py:54` |
|
||||
| 기둥 | 1 m 셀 · 셀 안 2 × 2 점(부분 기둥) | `Router.py:55` · `Engine_Search.py:68` |
|
||||
| 노드 | 가장 고운 2 m · 거친 = 4 배(8 m) · 높이 지표 위 2~30 m · 2 m 간격 | `Router.py:56-59` · `Engine_Search.py:60,486-499` |
|
||||
| 반지름 | 0.5h ~ h + 15 m · 1 m 증분 · 덩이가 10,000 m³ 넘으면 그 노드 멈춤 | `Engine_Search.py:438-445,459` |
|
||||
| 부피 | 10 ~ 10,000 m³ · 격자 끝 닿은 덩이 버림 | `Router.py:62-63` · `Engine_Search.py:223` |
|
||||
| 다듬기 | 셀 최소를 고친 노드 둘레(F < max(2.0, 1.2 × 전역 최소))만 반씩 · 가장 고운 간격에서 4 번 더 | `Engine_Search.py:71-72,457,502-525` |
|
||||
| 타원체 | 비 2.0 한 가지 · 구 임계 노드에서만 · 방향 = 노드 지표 낙하(5 × 5 평활) | `Engine_Search.py:67,527-533,372-377` |
|
||||
| 전역 최소 다듬기 | 중심 · 반지름 Nelder-Mead(한 눈금 안) | `Engine_Search.py:581-645` |
|
||||
| 수렴 | 절대 1e-4 · 최대 50 회 | `Engine_Column.py:32-33` |
|
||||
| 판정 | Hungr Bishop · 못 뚫는 층 잘림 ≥ 10 % 면 Janbu 보정(작은 쪽) | `Engine_Search.py:42,341-347` |
|
||||
| 조건 | 건기 · 우기만(지진 없음) | `Router.py:70` |
|
||||
|
||||
실측 기록 — 1 km 띠 9.7 만 셀 287 s(직렬) → 45 s(12 프로세스)(`docs/raw/plans/2026-10-26_plan_531-537.md:58-60`).
|
||||
|
||||
### 1.3 E06 암반 · E07 광역
|
||||
|
||||
| 엔진 | 계산 | 자리 | 빠른 까닭 |
|
||||
|---|---|---|---|
|
||||
| E06 | Markland 평사투영 판정(절리군 평균 방향 · 쌍 교선) · Hoek-Bray 평면 · 쐐기 닫힌 꼴 · 임계 인장균열 = 구간 Brent | `E06_StabRock_Engine.py:84-120,150-264` | 닫힌 꼴 — 반복 탐색 없음(RocPlane · SWedge 결정론 해석과 같음) |
|
||||
| E07 | 무한사면 Fs + SINMAP 안정 지수 · Horn 경사 · **D8** 집수면적 · 2 m 격자 · 노선 ±100 m | `E07_StabArea_Engine.py:85-120,190-216` · `Router.py:63-64` | 셀마다 닫힌 꼴(SI 는 x 20 마디 적분) — 2 m 격자 0.3 s 정상 |
|
||||
|
||||
## 2 상용 · 문헌 기준
|
||||
|
||||
| 항목 | 상용 · 문헌 | 우리 |
|
||||
|---|---|---|
|
||||
| 원호 격자 | Slide2 기본 20 × 20 간격 = 21 × 21 중심 × 반지름 11 = **4,851 원** · 기본 Slope Limits = 모형 전체(가장 넓게) | 진입 · 진출 2,400 + 격자 2,250 + 차분진화 다듬기(방법당 ~2,000) |
|
||||
| 원호 적응 탐색 | Slide2 Auto Refine 10 · 10 · 10 = **4,500 원** | 차분진화 다듬기가 같은 몫 |
|
||||
| 절편 수 | Slide2 기본 50(100 넘게 권하지 않음) | 거친 30 · 마지막 50 |
|
||||
| 수렴 | Slide2 허용 0.005 · 최대 75 회(보통 3~4 회면 수렴) | 1e-6 · 100 회(더 엄격) |
|
||||
| 비원호 | Slide2 Cuckoo 꼭짓점 기본 8 · Optimize Surfaces 기본 켬 · SLOPE/W 꼭짓점 Monte-Carlo 이동 최적화 | 꼭짓점 6 · 국부 탐색 + Nelder-Mead |
|
||||
| 최적화 결과 신뢰 | SLOPE/W — 최적화 F 가 원래 면보다 **15 % 넘게 낮으면 비현실 면일 가능성** | 거름 없음 |
|
||||
| 전역 최적화 | Cheng 외(2007) — 여섯 휴리스틱 중 늘 이기는 방법 없음 · 불연속 목적함수(해 없는 면)에서 흔들림 | 같은 꼴 흔들림 실측(§3.2) |
|
||||
| 해석법 조합 | 지식DB 06 — 토사 · 복합 비탈 = Bishop(원호) + Janbu 보정 · Spencer/M-P(비원호) 조합이 실무 표준 | 판정은 Bishop 원호만 |
|
||||
| 3D 탐색 | Scoops3D 기본 거친 배수 **8** · 다듬기 허용 0.01 % · Bishop 반복 허용 1e-4 · 방향 1 개(낙하 방향) | 거친 배수 4 · 고친 노드만 다듬기 · 1e-4 · 방향 1 개 |
|
||||
| 3D 기둥 수 | Scoops3D — 활동체 기둥 **≥ 200 개면 F 1 % 안** · 100 개도 대개 괜찮음 · 급경사 · 점착만 · 복잡 층은 300~500 · 경고 기본 limcol 100 | 하한 부피 10 m³ · 1 m 셀 → 작은 덩이는 수십 기둥 · 경고 없음 |
|
||||
| 3D 가장자리 | Scoops3D — DEM 버퍼 최소 10 셀 | 띠 + 최대 깊이 + 10 m 여유 · 끝 닿은 덩이 버림 |
|
||||
| 광역 흐름 | SINMAP/TauDEM 집수면적 = **D∞(다방향)** · T/R 기본 2000~3000 | **D8(단방향)** · T/R 2000~3000 |
|
||||
|
||||
## 3 판정
|
||||
|
||||
### 3.1 빠름 = 정당한 효율
|
||||
|
||||
- 면 수가 상용 기본보다 많음(원호만 한 경우 6~9 천 · 비원호 포함 2 만 안팎 vs Slide2 원 4,851).
|
||||
- 시간은 넘파이 묶음 계산(면 4,000 개 × 절편 50 을 배열 한 번) · 측점 병렬 · 지문 저장에서 나옴.
|
||||
- 수렴 허용치도 Slide2 보다 엄격(1e-6 vs 0.005).
|
||||
|
||||
### 3.2 실측 — 탐색 밀도 · 시드
|
||||
|
||||
| 문제 | 기본 | 조밀(격자 30 × 30 × 20 · 진입진출 50 · 반복 3 배) | 시드 1 · 2 |
|
||||
|---|---|---|---|
|
||||
| ACADS 1a 원호 5 방법 | Bishop 0.9851 · 0.2 s | 차 0.00 % · 0.8 s | 0.00 % |
|
||||
| ACADS 1c 원호 5 방법 | Bishop 1.3938 · 0.3 s | ≤ 0.09 % · 1.1 s | ≤ 0.09 % |
|
||||
| ACADS 3a 비원호 | Janbu 1.2715 · Spencer 1.2386 | −0.15 % · +0.06 % | **−1.6 % · −1.8 %** |
|
||||
| ACADS 4 비원호 | Janbu 0.6935 · Spencer 0.7014 | +1.2 % · +0.7 % | **−2.0 % ~ +2.1 %** |
|
||||
| 합성 임도 단면(편절편성 · 4 경우 · 20 값) | 4.6 s | Bishop 차 0.00 % · 13.5 s | Bishop 0.00 % · **우기 우 깎기 Spencer 비원호 1.846 ↔ 1.765 ↔ 1.892(6 시드 ±3.5 %)** |
|
||||
|
||||
- 원호(판정 값) = 수렴 · 시드 무관 → 원호 탐색 촘촘함 충분.
|
||||
- 비원호 = 시드마다 다른 국부 최소 → 미수렴. 반복만 늘려도 안 줄어듦(조밀 판도 1.765 못 찾음) — 출발점이 모자란 꼴.
|
||||
|
||||
### 3.3 3D 기본 설정 확인
|
||||
|
||||
시험 파일은 문헌 임계 중심 둘레로 좁힌 상자(`test_533_2_stab3d_search.py:8`) — 여기서는 **기본 설정 그대로**(노드 2 m · 거친 4 배 · 높이 2~30 m · dr 1 m · 부피 10~10,000 m³) 45 × 20 m 상자로 다시 셈 · 8 프로세스.
|
||||
|
||||
| 문제(Scoops3D 표 6.8 · 6.11) | 기준 | 기본 · 구 | 기본 · 구 + 타원체 | 조밀(노드 1 m · 높이 1 m · dr 0.5 · 거친 8 배) |
|
||||
|---|---|---|---|---|
|
||||
| 제방 30° | 1.32 | **1.3203(+0.0 %)** · 2.2 만 면 · 4.6 s | 1.2811(−2.9 %) · 5.6 s | 1.3197 · 15 만 면 · 23.7 s |
|
||||
| Donald & Giam 1a | 1.04 | **1.0385(−0.1 %)** · 2.7 만 면 · 5.5 s | 1.0221(−1.7 %) · 6.3 s | 1.0385 · 15 만 면 · 24.7 s |
|
||||
| 제방 60°(발끝 면) | 0.75 | **0.7510(+0.1 %)** · 2.9 만 면 · 5.7 s | 0.7544 · 6.8 s | 0.7540 · 25 만 면 · 37.0 s |
|
||||
|
||||
- 기본 설정 = 문헌값 ±0.1 % · 조밀하게 해도 차 ≤ 0.4 % → 3D 탐색 촘촘함 충분.
|
||||
- 타원체가 구보다 낮은 것은 정상(길쭉한 면이 2D 에 가까움 · 기준값은 구 기준).
|
||||
- 면 수 환산 — 100 m × ±30 m 구간 약 15~20 만 면 · 1 km 약 150~200 만 면(Scoops3D 「수십만~수백만」 범위).
|
||||
- 남는 흠 — 작은 덩이 기둥 수(10 m³ · 1 m 셀 = 수십 기둥 < Scoops3D 권장 100~200) · 타원체 비 2.0 한 가지 · 방향 낙하 방향 한 가지.
|
||||
|
||||
### 3.4 판정 범위 · 탐색 한계 — 검증 사본 57 측점 228 경우(저장본 읽기)
|
||||
|
||||
- 비원호 대 Bishop 원호 — Spencer 비원호 하위 10 % 가 **−10 %** · Janbu 비원호 −7 % · Spencer 원호는 −1.0 ~ +2.0 %(원호끼리는 잘 맞음).
|
||||
- Bishop 은 기준 넘고 비원호 · 다른 방법이 기준 아래 = **6 경우**(0+020 · 0+220 · 0+700 · 1+000 깎기 · 0+240 · 0+520 쌓기) — 판정이 Bishop 원호만이라 N.G 를 놓침.
|
||||
- 0+860 우기 쌓기(H 27.5 m) — Bishop 0.682 · Spencer 비원호 0.548(−20 %) · 비탈 높이 ≈ 0 측점은 −45 % — SLOPE/W 15 % 기준 넘음 = 비원호 면 모양 점검 필요(비현실 면 또는 진짜 약층 활동).
|
||||
- 탐색 한계 — 합성 단면 우기 우 깎기(자연 비탈 31°) 한계를 모형 끝까지 넓히면 Bishop **1.861 → 1.526(−18 %)**. 지금 한계는 「설계 비탈을 지나는 면만」(의도 · `Engine_Model.py:186-187`) — 깎기 위 자연 비탈 큰 활동은 E07 광역 · E04 3D 몫. Slide2 기본은 모형 전체.
|
||||
- E07 — D8 은 흐름을 한 줄로 모아 습윤지수가 줄무늬로 갈림 · 지형 격자 끝 밖 상류를 모름(`E07_StabArea_Engine.py:104-105`) → 띠 위쪽 끝 셀 위험 과소.
|
||||
- E06 — 절리군 평균 방향만 봄(Dips 의 극점 밀도 · 분산 없음) · 얇은 쐐기 최소 크기 거름 미정(`plan_531-537.md:69`).
|
||||
|
||||
### 3.5 결론
|
||||
|
||||
- 「빨라서 틀렸다」는 아님 — 원호 탐색 · 솔버 · 수렴은 상용 이상.
|
||||
- 고칠 곳은 속도가 아니라 **비원호 출발점 · 판정 방법 범위 · 탐색 한계 정책** 셋.
|
||||
|
||||
## 4 권함
|
||||
|
||||
| # | 할 일 | 효과 | 시간 |
|
||||
|---|---|---|---|
|
||||
| 1 | 비원호 다출발 — 시드 3 개(또는 출발점 8 → 24)로 돌려 최소 · 상위 면 모아 Nelder-Mead | 시드 흔들림 ±3.5 % → ≤ 0.5 % 목표 | 비원호 몫 × 3 → 측점 4.9 → 약 13 s(직렬) · 57 측점 병렬 약 45 → 120 s |
|
||||
| 2 | 판정 방법 사용자 협의 — 「Bishop 원호」 대 「Bishop 원호 + 비원호(Spencer · Janbu 보정) 최소」 · 비원호가 원호보다 15 % 넘게 낮으면 「면 점검」 표시 | 검증 사본 6 경우 판정 바뀜 · 비현실 면 걸러 냄 | 계산 시간 0(이미 셈) |
|
||||
| 3 | 탐색 한계 정책 협의 — 깎기 쪽 진입 한계를 2H → 산마루 · 모형 끝(또는 4H)으로 넓힌 대조 칸 | 큰 자연 비탈 면(−18 % 사례) 드러남 | 원호만 넓히면 측점 +0.5~1 s |
|
||||
| 4 | 수렴 지킴 시험 추가 — ACADS 1a · 1c · 3a · 4 + 합성 단면을 기본 대 조밀 · 시드 0~4 로 · 원호 ≤ 0.5 % · 비원호 ≤ 1 % | 다음 고침에서 미수렴 되살아남 막음 | 시험 1 회 약 30 s |
|
||||
| 5 | 3D 임계 덩이 기둥 수 기록 · 100 미만 경고(Scoops3D limcol) · 작은 덩이 많으면 셀 0.5 m 선택 | 작은 덩이 F 오차 표시 | 기록만 0 · 0.5 m 셀은 구간 × 약 4 |
|
||||
| 6 | 3D 기본 설정 그대로 Scoops3D 제방 30° · D&G 1a 재현을 지킴 시험에 더함(지금 시험은 좁힌 상자) | 실사용 탐색 설정이 바뀌어도 잡힘(§3.3 ±0.1 %) | 시험 약 12 s(8 프로세스) |
|
||||
| 7 | E07 집수면적 — 복사 DTM 밖 상류(B04 유역) 붙이기 · D∞ 검토 | 띠 위쪽 끝 위험 과소 막음 | 0.3 s → 수 s |
|
||||
|
||||
## 출처
|
||||
|
||||
- Rocscience Slide2 — Methods(절편 50 · 허용 0.005 · 최대 75 회): https://www.rocscience.com/help/slide2/documentation/slide-model/project-settings/methods
|
||||
- Rocscience Slide2 — Grid Search(21 × 21 × 11 = 4,851): https://www.rocscience.com/help/slide2/documentation/slide-model/slip-surfaces/circular-surfaces/grid-search
|
||||
- Rocscience Slide2 — Auto Refine Search(10 · 10 · 10 = 4,500): https://www.rocscience.com/help/slide2/documentation/slide-model/slip-surfaces/circular-surfaces/auto-refine-search
|
||||
- Rocscience Slide2 — Cuckoo Search(꼭짓점 8 · Optimize 기본 켬): https://www.rocscience.com/help/slide2/documentation/slide-model/slip-surfaces/non-circular-surfaces/cuckoo-search
|
||||
- Rocscience Slide3 — Cuckoo Search(구 · 타원체 · 스플라인): https://www.rocscience.com/help/slide3/documentation/slip-surfaces/slip-surface-options-2/slip-surface-search-method/cuckoo-search
|
||||
- Rocscience Slide2 Slope Stability Verification Manual(ACADS 1a~4 · Arai & Tagyo · Yamagami & Ueta) — 지식DB `original/안정성평가/참고문헌/Rocscience_Slide2_SlopeStabilityVerification.pdf`
|
||||
- Seequent GeoStudio — Slip Surface Optimization(15 % 기준): https://files.seequent.com/GeoStudio/SlopeW/Slip%20Surface%20Optimization.pdf
|
||||
- Seequent GeoStudio — Search Techniques Entry and Exit: https://files.seequent.com/GeoStudio/SlopeW/Search%20Techniques%20Entry%20Exit.pdf
|
||||
- Reid 외(2015) Scoops3D, USGS TM 14-A1 — §3.2.2(거친 배수 8 · 0.01 %) · §4.4.1.1.7(1e-4) · §5.3.3(버퍼 10 셀) · §5.3.4(기둥 200 개 1 %) · DOI 10.3133/tm14A1 · 지식DB 참고문헌 사본
|
||||
- Pack · Tarboton · Goodwin, SINMAP 2 User's Manual: https://hydrology.usu.edu/sinmap2/sinmap2.PDF · TauDEM Stability Index(D∞): https://hydrology.usu.edu/taudem/taudem5/help53/StabilityIndex.html · Tarboton(1997) WRR 33(2) 309–319, DOI 10.1029/96WR03137
|
||||
- Cheng · Li · Chi(2007) Performance studies on six heuristic global optimization methods in the location of critical slip surface, Computers and Geotechnics 34(6) 462–484, DOI 10.1016/j.compgeo.2007.01.004
|
||||
- Malkawi · Hassan · Sarma(2001) Global search method for locating general slip surface using Monte Carlo techniques, JGGE 127(8) 688–698, DOI 10.1061/(ASCE)1090-0241(2001)127:8(688)
|
||||
- Greco(1996) Efficient Monte Carlo technique for locating critical slip surface, J. Geotech. Eng. 122(7) 517–525
|
||||
- Zolfaghari · Heath · McCombie(2005) Simple genetic algorithm search for critical non-circular failure surface, Computers and Geotechnics: https://researchportal.bath.ac.uk/en/publications/simple-genetic-algorithm-search-for-critical-non-circular-failure/
|
||||
- Itasca FLAC3D — Cheng 외(2007) 복합 비탈 국부 최소 다섯 · 임계 1.383 · 1.3848 대조: https://docs.itascacg.com/pfc700/flac3d/zone/test3d/TheoryAndBackground/FactorOfSafety/ComplexSlope/ComplexSlope.html
|
||||
- Hungr · Salgado · Byrne(1989) Evaluation of a three-dimensional method of slope stability analysis, Can. Geotech. J. 26(4) 679–686, DOI 10.1139/t89-079
|
||||
- Cheng · Lau(2008) Slope Stability Analysis and Stabilization, Routledge — 임계면 탐색 · 수렴 장(원문 미열람)
|
||||
@@ -0,0 +1,43 @@
|
||||
# 요구서 390 — 안정성평가 한 번에 해석 · 바로 저장 · 측점 표기 · 보고서 맨 뒤 · 계산 점검
|
||||
|
||||
원문 = `사용자요구_1025.md` 요구 390(7 항목) · 근거 = `_분석_390-A_흐름_저장_보고서.md`(1 · 3 · 4 · 5) · `_분석_390-B_측점_3D_위험띠.md`(2 · 6) · `_분석_390-C_계산점검_문헌.md`(7) · 계획 = `PLAN.md` 564~567.
|
||||
|
||||
## 1. 지금
|
||||
|
||||
- 해석은 페이지마다 따로(2D · 3D · 암반 · 광역) · 함께 돌리는 서버 일감 없음 · 입력이 같으면 다시 안 셈(지문)은 이미 있음.
|
||||
- 3D 는 100 m 구간마다(지형 격자가 구간 둘레 직사각형이라 통째면 메모리 · 시간 넘침) · 1.2 km 건기만 약 12 분 · 건기 + 우기 약 25 분.
|
||||
- ⚠ 3D 결과 파일 이름에 조건이 없음 — 같은 구간을 건기 → 우기로 돌리면 앞 결과가 덮임.
|
||||
- 보고서가 암반 · 광역 앞에 있는 까닭 = 두 페이지를 나중에 만들어 뒤에 붙임 · 보고서는 처음 열 때 만들어져 암반 · 광역이 「해석 전」으로 남음.
|
||||
- [다시 해석] 은 E04 · E07 에 있음(E06 아님) — [해석] = 입력이 같으면 저장된 결과를 보여 줌 · [다시 해석] = 입력이 같아도 다시 셈(답은 같음).
|
||||
- E03 측점 칸 = 누가거리 꼴 · 위험 띠 = 처음부터 확대 · 측점 글 없이 만든 꼴 · 화면 높이 900 겹침 = 칸 수 어긋남(CSS 한 줄).
|
||||
- E 복사본에 설계가 쓴 지형 격자 하나 있음 → E03 3D 에 지형을 얹을 수 있음(라이다 원본은 없음).
|
||||
- 계산 점검 — 빠른 까닭 = 덜 찾아서가 아니라 묶어 셈 · 측점 나눠 돌림 · 같은 입력 안 다시 셈 · 원호 판정 값은 격자 4 배 · 반복 3 배에도 차 0.09 % 이하 · 3D 는 Scoops3D 검증 셋과 ±0.1 % · 흠 셋 = ① 비원호 탐색이 출발점에 따라 ±2~4 % 흔들림 ② 판정이 Bishop 원호만 봄(검증 사본 228 경우 중 6 경우가 비원호로는 미달인데 O.K) ③ 탐색 범위가 비탈 끝 + 2H 까지(모형 끝까지 넓히면 한 단면 1.861 → 1.526) · 광역은 물 흐름 한 방향(D8)이라 띠 위 끝 위험이 낮게 나올 수 있음.
|
||||
|
||||
## 2. 바뀌는 흐름
|
||||
|
||||
```
|
||||
E02 지반조건 값 고침 → [해석 시작] = 지반 저장 → 2D → 3D(모든 구간 · 건기 · 우기) → 암반 → 광역 → 보고서
|
||||
단계 이름 · 진행률 · [끊기] · 결과는 모두 영구 저장 · 떠날 때 바뀐 값은 저장 뒤 이동
|
||||
뒤 페이지 저장된 결과를 열어 봄 · 옵션 고치고 [해석] = 저장 + 다시 셈(저장 단추 없음) · 보고서 저절로 갱신
|
||||
보고서 맨 뒤 페이지 · 2D · 3D · 암반 · 광역 전부 + 그림(3D 지도 · 스테레오넷 · 광역 지도)
|
||||
```
|
||||
|
||||
## 3. 정함(브레인) — 바꿀 수 있음
|
||||
|
||||
1. 한 번에 해석의 3D = 건기 · 우기 둘 다(판정이 두 조건을 다 봄) · 결과 파일 이름에 조건을 넣음.
|
||||
2. E02 = [해석 시작] 하나(저장 단추 없음) · 해석 없이 떠나면 바뀐 값만 저장 뒤 이동.
|
||||
3. [해석] 단추 = 그 자체가 저장(누를 때 서버가 입력 저장 → 셈 → 결과 저장 · CLAUDE.md 5장의 「자동저장 금지」는 말없이 도는 저장이라 어긋나지 않음) · E06 [저장] · E04 · E07 [다시 해석] 뺌(엔진이 바뀌면 지문이 바뀌어 저절로 다시 셈).
|
||||
4. E03 대표 단면 = 고르는 즉시 저장 · 광역 물성 = E02 붕적토 값을 받음 · 페이지에서 따로 [해석] 하면 보고서도 저절로 갱신.
|
||||
5. 단계 차례 = 보고서 맨 뒤 · 대시보드 단계 막대 여섯(체인이 상태를 적음) · 보고서 그림 셋 더함.
|
||||
6. 측점 = 「No.+거리」 소수 한 자리(예 `61+14.5` · D 와 같음) · 간격 = 측점 목록에서 추정 · E03 · E07 · E05 보고서 · E01 · E04 · E06 모두 한 벌(파이썬 짝 파일 새로).
|
||||
7. 위험 띠 = 지금 그림에 공용 확대 · 이동(B05 와 같은 설정 · 휠 방향 · 가운데 끌기 · 두 번 누름 원배율) + 측점 글 · 회전 없음 · 높이 그대로 · 900 겹침 CSS 한 줄 고침.
|
||||
8. E03 3D = 설계 지형 격자 + 노면 자리는 지형에 구멍(깎기 지형이 노면을 덮지 않게).
|
||||
9. 계산 — 비원호 출발점 셋 중 최솟값(측점당 약 5 → 13 s) · 판정 = 원호 Bishop 과 비원호 Spencer · M-P 중 작은 값(지식DB 06 「원호 Bishop + 비원호 Spencer/M-P 조합이 실무 표준」) · 비원호가 원호보다 15 % 넘게 낮으면 「면 확인」 표시(SLOPE/W 기준) · 수렴 시험(기본 대 촘촘) · 3D 기본 설정 재현 시험 · 3D 기둥 100 개 미만 경고(Scoops3D 권장) · 광역 흐름 = 다방향(D∞ · SINMAP 원본).
|
||||
|
||||
## 4. 사용자 확정 필요
|
||||
|
||||
1. **2D 탐색 범위** — (가) 지금처럼 비탈 끝 + 2H(깎기 위 자연 비탈 큰 면은 광역 · 3D 몫) / (나) 모형 끝까지 넓힘(Slide2 기본 · 깎기 위 큰 면까지 2D 판정에 듦 · 판정이 더 엄해짐 · 권함).
|
||||
|
||||
## 5. 시간
|
||||
|
||||
- 한 번에 해석 = 1.2 km 기준 약 25~30 분(3D 가 거의 전부) · 2D 비원호 출발점 셋으로 2D 가 약 2.5 배.
|
||||
Reference in New Issue
Block a user