docs: add shell pressure feature workflow
This commit is contained in:
@@ -0,0 +1,223 @@
|
||||
# Shell Surface Pressure Load Coordination Record
|
||||
|
||||
## 1. Metadata and Feature Scope
|
||||
|
||||
- feature_id: `shell-surface-pressure-load`
|
||||
- workflow_state: `needs-implementation`
|
||||
- owner_agent: `coordinator-agent`
|
||||
- request_date: `2026-08-30`
|
||||
- last_updated: `2026-08-31`
|
||||
- process_classification: `architectural`
|
||||
- current_goal: 승인·감사된 Harness Step 1–7을 한 Implementation Agent/Executor 흐름으로 순차 실행하고 Gate 6 implementation/build/reference evidence를 확보한다.
|
||||
- approved_scope: Abaqus subset `*SURFACE, TYPE=ELEMENT`와 `*DSLOAD`의 uniform `P`를 S4/S4R `SPOS|SNEG` surface에 적용한다. Linear static은 reference configuration load를, nonlinear static은 current-configuration follower load와 external tangent를 사용한다.
|
||||
- scope_boundaries: Unsupported surface/load variants는 fail-closed로 거부하고 stable source identity와 deterministic load/reduction order를 보존한다. 기존 authoritative HDF5 output을 우선 유지하되 Stage 5 I/O gate가 evidence로 최종 확정한다.
|
||||
- reference_case: `reference/shellNL-meshfine-pressure/`의 existing `.inp`와 CSV를 exact path/name 그대로 read-only 사용한다.
|
||||
- user_approval: `2026-08-30` approved Abaqus-aligned design; `2026-09-01` approved the 7-Step implementation plan, phase materialization, and Harness implementation/verification execution without push.
|
||||
|
||||
## 2. Eight-Stage Worklist
|
||||
|
||||
| stage | owner | status | output paths | acceptance gate | evidence summary | blockers | attempt count |
|
||||
| --- | --- | --- | --- | --- | --- | --- | --- |
|
||||
| 1. Requirements | `requirement-agent` | `passed` | `docs/shell-surface-pressure-load/requirements.md` | 지원/제외 범위, verifiable acceptance criteria, verification quantities, tolerance baseline과 requirement verification matrix가 승인 설계를 손실 없이 고정함 | `FESA-REQ-SHELL-PRESSURE-001`–`024`; normative 24/matrix 24; orphan 0; exact reference input/displacement paths와 blocking/warning/excluded disposition; owner `passed`; Coordinator audit 통과 | 없음 | 1 |
|
||||
| 2. Research | `research-agent` | `passed` | `docs/shell-surface-pressure-load/research.md` | 이론, benchmark, primary evidence와 applicability limit가 충분함 | Source 15개(Project/Stored 3, Tier 1 official 8, Tier 2 3, Tier 3 navigation 1), key claims 15개, benchmark 8개, normative trace gap 0; owner `passed`; Coordinator audit 통과 | 없음 | 1 |
|
||||
| 3. Formulation | `formulation-agent` | `passed` | `docs/shell-surface-pressure-load/formulation.md` | Pressure virtual work, equivalent nodal load, follower linearization과 numerical integration 계약이 구현 가능함 | `ready-for-numerical-review`; force/residual/tangent sign, common `2x2` rule, `24x1`/`24x24` dimensions, dimensionless geometry contract, deterministic assembly, requirement trace 24/24; owner `passed`; Coordinator audit 통과 | 없음 | 1 |
|
||||
| 4. Numerical/reference review | `numerical-review-agent` | `passed` | `docs/shell-surface-pressure-load/numerical-review.md`; `docs/shell-surface-pressure-load/reference-model.md` | Numerical review와 exact reference contract가 함께 `pass-for-io-definition`임 | Aligned `pass-for-io-definition`; `tau_J=1e-12`, analytical/objectivity `1e-12`, FD `h=1e-5`/error `1e-8`, global balance `1e-8`; exact 729-row reference inventory, U/UR 2,187 logical rows each; owner evidence와 Coordinator audit 통과 | 없음 | 1 |
|
||||
| 5. I/O definition | `io-definition-agent` | `passed` | `docs/shell-surface-pressure-load/io.md` | Abaqus subset, semantic mapping, diagnostics, HDF5 projection과 reference rows가 명확함 | `ready-for-implementation-planning`; exact assembly `SURFACE`/step `DSLOAD P`, Domain/Step/AnalysisModel mapping, ordered fail-closed validation, unchanged schema `0/1`, exact HDF5/reference projection, trace 24/24; owner `passed`; Coordinator audit 통과 | 없음 | 1 |
|
||||
| 6. Implementation | `implementation-planning-agent`; `implementation-agent` | `in-progress` | `docs/shell-surface-pressure-load/implementation-plan.md`; `docs/shell-surface-pressure-load/implementation-report.md`; `docs/shell-surface-pressure-load/build-test.md`; `docs/shell-surface-pressure-load/reference-comparison.md` | 승인 계획, TDD evidence, MSVC/x64/Debug build/CTest와 blocking reference comparison이 모두 통과함 | Planning/phase subgates `passed`; 7 pending Steps와 exact filenames/slugs/order, RED/GREEN/VERIFY, reference immutability를 Coordinator audit함; `GATE6-IMPL-001` execution dispatch 준비 | Implementation Agent evidence 대기 | 1 |
|
||||
| 7. Physics evaluation | `physics-evaluation-agent` | `pending` | `docs/shell-surface-pressure-load/physics-evaluation.md` | Direction, symmetry, resultant, reaction과 equilibrium 검토가 `pass-for-release-agent`임 | Gate 6 evidence 대기 | Gate 6 미통과 | 0 |
|
||||
| 8. Release readiness | `release-agent` | `pending` | `docs/shell-surface-pressure-load/release.md` | Acceptance traceability와 limitation을 포함한 verdict가 `ready-for-release`임 | Gate 7 evidence 대기 | Gate 7 미통과 | 0 |
|
||||
|
||||
## 3. Active Dispatch Package and Latest Sub-Agent Return
|
||||
|
||||
### Completed Dispatch Package
|
||||
|
||||
- dispatch_id: `GATE1-REQ-001`
|
||||
- feature_id: `shell-surface-pressure-load`
|
||||
- target_sub_agent: `requirement-agent`
|
||||
- required_inputs:
|
||||
- `AGENTS.md`
|
||||
- `docs/PRD.md`
|
||||
- `docs/ARCHITECTURE.md`
|
||||
- `docs/ADR.md`
|
||||
- `docs/TOLERANCE.md`
|
||||
- `docs/SOLVER_AGENT_DESIGN.md`
|
||||
- approved design recorded in this file
|
||||
- `reference/shellNL-meshfine-pressure/` read-only inventory
|
||||
- expected_outputs: `docs/shell-surface-pressure-load/requirements.md`
|
||||
- acceptance_gate: Verifiable shall requirements, explicit scope/exclusions, input/output semantics, failure behavior, deterministic identity/order, reference quantities/dispositions, common tolerance baseline and complete requirement verification matrix preserve the approved design without downstream formulation or I/O invention.
|
||||
- stop_condition: `requirements.md`와 return evidence를 제출한 뒤 중지한다. Peer dispatch, Gate 2 work, source/tests/CMake/reference/tolerance 변경은 금지한다.
|
||||
- missing_evidence: 없음
|
||||
|
||||
### Completed Dispatch Package — Gate 2
|
||||
|
||||
- dispatch_id: `GATE2-RES-001`
|
||||
- feature_id: `shell-surface-pressure-load`
|
||||
- target_sub_agent: `research-agent`
|
||||
- required_inputs:
|
||||
- `AGENTS.md`
|
||||
- `docs/SOLVER_AGENT_DESIGN.md`
|
||||
- `docs/shell-surface-pressure-load/requirements.md` binding baseline
|
||||
- `docs/PRD.md`, `docs/ARCHITECTURE.md`, `docs/ADR.md`, `docs/TOLERANCE.md`
|
||||
- exact read-only inventory under `reference/shellNL-meshfine-pressure/`
|
||||
- `fesa-research-evidence`; 필요 시 `fem-theory-query`
|
||||
- expected_outputs: `docs/shell-surface-pressure-load/research.md`
|
||||
- acceptance_gate: Key claims마다 source/reliability tier 또는 inference label이 있고, Abaqus observable input/load semantics와 FESA-owned theory가 분리된다. Pressure virtual work, current-surface follower force, external tangent, S4/S4R applicability와 verification candidates가 target quantity, 한계, exact artifact와 requirement trace를 갖는다.
|
||||
- stop_condition: `research.md`와 return evidence 제출 후 중지한다. Formulation 확정, peer dispatch, Gate 3, source/tests/CMake/reference/tolerance 변경은 금지한다.
|
||||
- missing_evidence: 없음
|
||||
|
||||
### Completed Dispatch Package — Gate 3
|
||||
|
||||
- dispatch_id: `GATE3-FORM-001`
|
||||
- feature_id: `shell-surface-pressure-load`
|
||||
- target_sub_agent: `formulation-agent`
|
||||
- required_inputs:
|
||||
- `AGENTS.md`
|
||||
- `docs/SOLVER_AGENT_DESIGN.md`
|
||||
- binding `docs/shell-surface-pressure-load/requirements.md`
|
||||
- approved `docs/shell-surface-pressure-load/research.md`
|
||||
- applicable project architecture/ADR contracts
|
||||
- `fesa-formulation-spec`; 필요 시 supporting `fem-theory-query`
|
||||
- expected_outputs: `docs/shell-surface-pressure-load/formulation.md`
|
||||
- acceptance_gate: Strong/weak form, S4/S4R interpolation, side/sign map, reference/current geometry, quadrature/Jacobian validity, consistent pressure force, residual sign, exact external tangent, full-space deterministic assembly, units/failures, verification identities와 requirement trace가 implementation-ready이며 Abaqus internal equivalence를 주장하지 않음.
|
||||
- stop_condition: `formulation.md`와 return evidence 제출 후 중지한다. Parser/API/source/test/reference 변경, peer dispatch, Numerical Review/Gate 4 수행은 금지한다.
|
||||
- missing_evidence: 없음
|
||||
|
||||
### Completed Dispatch Package — Gate 4
|
||||
|
||||
- dispatch_id: `GATE4-NR-001`
|
||||
- feature_id: `shell-surface-pressure-load`
|
||||
- target_sub_agent: `numerical-review-agent`
|
||||
- required_inputs:
|
||||
- `AGENTS.md`, `docs/SOLVER_AGENT_DESIGN.md`
|
||||
- binding `requirements.md`, approved `research.md`, `formulation.md`
|
||||
- `docs/TOLERANCE.md`와 applicable architecture/ADR contracts
|
||||
- exact read-only `reference/shellNL-meshfine-pressure/` artifacts
|
||||
- `fesa-numerical-review`
|
||||
- expected_outputs: `docs/shell-surface-pressure-load/numerical-review.md`; `docs/shell-surface-pressure-load/reference-model.md`
|
||||
- acceptance_gate: 독립 sign/force/tangent/residual/integration/geometry/objectivity/equilibrium/determinism review가 blocking flaw 없이 통과하고, `tau_J`와 internal test thresholds가 scale-aware하게 확정된다. Exact input/required CSV identity, component/blocking classification, row prechecks와 unchanged `docs/TOLERANCE.md` policy가 I/O 정의에 충분해야 한다.
|
||||
- stop_condition: 두 report와 owner verdict/return evidence 제출 후 중지한다. Upstream flaw는 문서를 조용히 수정하지 않고 precise rework로 반환한다. Source/tests/CMake/reference/tolerance 변경, peer dispatch, Gate 5 수행은 금지한다.
|
||||
- missing_evidence: 없음
|
||||
|
||||
### Completed Dispatch Package — Gate 5
|
||||
|
||||
- dispatch_id: `GATE5-IO-001`
|
||||
- feature_id: `shell-surface-pressure-load`
|
||||
- target_sub_agent: `io-definition-agent`
|
||||
- required_inputs:
|
||||
- `AGENTS.md`, `docs/SOLVER_AGENT_DESIGN.md`
|
||||
- approved feature `requirements.md`, `research.md`, `formulation.md`, `numerical-review.md`, `reference-model.md`
|
||||
- applicable PRD/architecture/ADR/CODINGSTYLE/TOLERANCE contracts
|
||||
- exact read-only `reference/shellNL-meshfine-pressure/` artifacts
|
||||
- `fesa-io-contract`
|
||||
- expected_outputs: `docs/shell-surface-pressure-load/io.md`
|
||||
- acceptance_gate: Approved `*SURFACE TYPE=ELEMENT`/`*DSLOAD P` grammar, model/history mapping, deterministic target resolution/diagnostics, Domain/Step/AnalysisModel semantic ownership, existing authoritative HDF5 field projection, exact reference CSV identity/prechecks/common tolerance와 compatibility boundary가 구현 계획에 충분하고 upstream contract와 일치함.
|
||||
- stop_condition: `io.md`와 owner return evidence 제출 후 중지한다. Parser/API implementation, source/tests/CMake/phases/reference/tolerance 변경, peer dispatch와 Gate 6 수행은 금지한다.
|
||||
- missing_evidence: 없음
|
||||
|
||||
### Completed Dispatch Package — Gate 6 Planning
|
||||
|
||||
- dispatch_id: `GATE6-PLAN-001`
|
||||
- feature_id: `shell-surface-pressure-load`
|
||||
- target_sub_agent: `implementation-planning-agent`
|
||||
- required_inputs:
|
||||
- `AGENTS.md`, `docs/SOLVER_AGENT_DESIGN.md`, `docs/HARNESS.md`, `docs/HARNESS_WORKFLOW.md`
|
||||
- approved feature `requirements.md`, `research.md`, `formulation.md`, `numerical-review.md`, `reference-model.md`, `io.md`
|
||||
- current source/tests/CMake/`.harness/config.json`/hooks/phase inventory read-only
|
||||
- `fesa-cpp-msvc-tdd`, project-local `harness`, compatible `superpowers:writing-plans`
|
||||
- expected_outputs: `docs/shell-surface-pressure-load/implementation-plan.md`; concise user-approval Step draft in owner return
|
||||
- acceptance_gate: Multiple self-contained Steps가 각자 `RED -> observed failure -> minimal GREEN -> focused/full VERIFY`를 포함하고 exact files/signatures/tests/commands/dependencies/traceability를 지정한다. Parser/model, force/tangent, linear/nonlinear assembly, deterministic failure, HDF5/reference comparison와 final MSVC x64 Debug CTest evidence를 모두 다루며 reference immutability/atomicity를 보존한다.
|
||||
- stop_condition: Plan draft와 return evidence 제출 후 사용자 승인을 기다린다. `phases/index.json`, `phases/<task>/`, source/tests/CMake/reference 수정, Harness execution, Implementation Agent dispatch는 승인 전 금지한다.
|
||||
- missing_evidence: 사용자 plan approval
|
||||
|
||||
### Completed Dispatch Package — Gate 6 Phase Materialization
|
||||
|
||||
- dispatch_id: `GATE6-PHASE-001`
|
||||
- feature_id: `shell-surface-pressure-load`
|
||||
- target_sub_agent: `implementation-planning-agent` (`GATE6-PLAN-001`과 동일 owner instance)
|
||||
- required_inputs:
|
||||
- approved `docs/shell-surface-pressure-load/implementation-plan.md`
|
||||
- `AGENTS.md`, `docs/HARNESS.md`, `docs/HARNESS_WORKFLOW.md`, project-local `harness`
|
||||
- existing `phases/index.json`과 existing task directories
|
||||
- expected_outputs: `phases/index.json`; `phases/shell-surface-pressure-load/index.json`; `phases/shell-surface-pressure-load/step1.md`–`step7.md`
|
||||
- acceptance_gate: Top-level task entry와 task index의 7 pending Steps가 승인 slug/order와 정확히 일치한다. 각 Step은 독립 실행에 필요한 upstream docs, exact files/signatures, RED expected failure, minimal GREEN, focused/full MSVC x64 Debug CMake/CTest commands, dependencies, status ownership, forbidden scope와 reference immutability를 대화 참조 없이 포함한다.
|
||||
- stop_condition: Planning files만 materialize하고 실행·Step selection·status advancement·timestamp·commit·push를 하지 않는다. Source/tests/CMake/docs/reference/tolerance는 변경하지 않는다.
|
||||
- missing_evidence: 없음
|
||||
|
||||
### Active Dispatch — Gate 6 Implementation
|
||||
|
||||
- dispatch_id: `GATE6-IMPL-001`
|
||||
- feature_id: `shell-surface-pressure-load`
|
||||
- target_sub_agent: `implementation-agent`
|
||||
- required_inputs:
|
||||
- `AGENTS.md`, `.codex/hooks.json`, `.agents/skills/harness/SKILL.md`, `docs/HARNESS.md`, `docs/HARNESS_WORKFLOW.md`
|
||||
- approved feature bundle `requirements.md`, `research.md`, `formulation.md`, `numerical-review.md`, `reference-model.md`, `io.md`, `implementation-plan.md`
|
||||
- materialized `phases/index.json`, `phases/shell-surface-pressure-load/index.json`, `step1.md`–`step7.md`
|
||||
- `fesa-cpp-msvc-tdd`; user authorization for `python scripts/execute.py shell-surface-pressure-load` without `--push`
|
||||
- expected_outputs: completed phase Step records; feature production/tests/CMake/comparator changes; `docs/shell-surface-pressure-load/implementation-report.md`; `build-test.md`; `reference-comparison.md`; actual RED/GREEN/VERIFY logs and unchanged reference hashes
|
||||
- acceptance_gate: Step 1–7 executes in order with expected RED before each production behavior, minimal GREEN, focused and full MSVC x64 Debug build/CTest. Final comparison uses exact stored artifacts, deterministic identity/prechecks/common tolerance and records U blocking/UR warning-only while preserving hashes. All Gate 6 reports must support `pass-for-physics-evaluation` with no unresolved blocking failure.
|
||||
- stop_condition: Do not push, run Abaqus/reference solvers, change upstream contracts/tolerance/reference artifacts, advance Gate 7, or revert other agents' docs/coordination changes. Repeated/unclear implementation failure returns to Coordinator for bounded correction routing.
|
||||
- missing_evidence: completed Steps 1–7, three Gate 6 reports, owner return, Coordinator evidence audit
|
||||
|
||||
### Latest Sub-Agent Return
|
||||
|
||||
- target_sub_agent: `implementation-planning-agent`
|
||||
- output_paths: `phases/index.json`; `phases/shell-surface-pressure-load/index.json`; `phases/shell-surface-pressure-load/step1.md`–`step7.md`
|
||||
- status: `passed`; phase materialization complete
|
||||
- evidence_summary: Existing top-level entries/status/timestamps를 보존하고 pending feature entry 하나를 append함. Task index는 승인된 7 slugs를 Step 1–7과 matching files로 등록함. Coordinator audit에서 Executor path resolution, pending statuses, self-contained required/prior files, exact interfaces/tests, expected RED, minimal GREEN, MSVC/x64/Debug focused/full commands, no hidden scope, exact reference hashes/read-only policy와 final literal comparison/report order를 확인함.
|
||||
- blockers: 없음
|
||||
- open_evidence_gaps: Implementation Agent의 actual RED/GREEN/VERIFY, build/CTest, reference comparison과 three reports 대기
|
||||
- critical_user_question: 없음
|
||||
- forbidden_area_assertion: source, tests, CMake, phases, `docs/TOLERANCE.md`, reference artifact 변경 없음
|
||||
|
||||
## 4. Gate Decision Log and Workflow State
|
||||
|
||||
| date | dispatch | gate decision | owner evidence | workflow state |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| 2026-08-30 | `GATE1-REQ-001` | `passed` | Owner `passed`; `requirements.md` 24 normative IDs/24 matrix rows, complete traceability, approved design/reference boundary, blocker 없음. Coordinator 독립 구조 감사에서 orphan 0, matrix-only 0 및 필수 contract field 누락 0 확인 | `needs-research` |
|
||||
| 2026-08-30 | `GATE2-RES-001` | `passed` | Owner `passed`; source 15/key claims 15/benchmark 8/trace gap 0. Coordinator audit에서 undeclared cited source 0, Abaqus observable/FESA formulation 분리, limitation과 nonblocking gap 확인 | `needs-formulation` |
|
||||
| 2026-08-30 | `GATE3-FORM-001` | `passed` | Owner `passed`, document `ready-for-numerical-review`; Coordinator audit에서 required formulation sections 완비, requirement rows 24/24, upstream scope/sign/output 일치와 explicit Numerical Review handoff 확인 | `needs-numerical-review` |
|
||||
| 2026-08-30 | `GATE4-NR-001` | `passed` | Owner reports aligned `pass-for-io-definition`; Coordinator audit에서 두 verdict/required sections, quantitative gates, exact artifact/row/component classification, precheck/common tolerance/immutability와 no final HDF5 projection 확인 | `needs-io-definition` |
|
||||
| 2026-08-31 | `GATE5-IO-001` | `passed` | Owner `passed`, document `ready-for-implementation-planning`; Coordinator audit에서 required sections/grammar/ownership/validation/schema/reference projection 완비, trace 24/24, no new dataset/version와 no critical issue 확인 | `needs-implementation-plan` |
|
||||
| 2026-08-31 | `GATE6-PLAN-001` | `passed` | Owner `passed`, document `draft-awaiting-user-approval`; Coordinator audit에서 7 Steps, TDD/commands/dependencies/24-of-24 trace, no phase/code mutation 확인. Initial `upstream-io-contract-mismatch`는 same-owner follow-up으로 multi-explicit-instance 지원과 committed source identity를 교정함. 이는 planning subgate 판정이며 Stage 6 implementation gate는 미통과 | `needs-user-decision` |
|
||||
| 2026-09-01 | `GATE6-PLAN-APPROVAL` | `passed` | User explicitly approved the 7-Step draft, phase materialization, and implementation/verification execution; `--push` 금지 | `needs-implementation-plan` |
|
||||
| 2026-09-01 | `GATE6-PHASE-001` | `pending` | 동일 Implementation Planning Agent의 phase materialization과 Coordinator audit 대기 | `needs-implementation-plan` |
|
||||
| 2026-09-01 | `GATE6-PHASE-001` | `passed` | Owner `passed`; Coordinator audit에서 existing top index preservation, exact 7 pending slugs/files, Executor-readable paths, self-contained RED/GREEN/VERIFY와 exact reference immutability 확인 | `ready-for-implementation` |
|
||||
| 2026-09-01 | `GATE6-IMPL-001` | `pending` | Exactly one Implementation Agent execution/evidence 대기 | `needs-implementation` |
|
||||
|
||||
## 5. Risk, Blocker, and User-Decision Register
|
||||
|
||||
- active_blockers: 없음
|
||||
- critical_user_questions: 없음
|
||||
- USER-DECISION-001: `resolved 2026-09-01`; 7-Step draft, phase materialization, Harness implementation/verification execution 승인. `--push`는 승인되지 않음.
|
||||
- RISK-001: Element-based `*DLOAD` pressure와 surface-based `*DSLOAD` pressure의 sign/target 의미를 혼합하지 않는다.
|
||||
- RISK-002: Nonlinear follower pressure의 current-surface force와 external tangent를 fixed-global `*CLOAD`와 혼합하지 않는다.
|
||||
- RISK-003: Reference artifact 또는 공통 tolerance를 기능 통과를 위해 수정하지 않는다.
|
||||
- RISK-004: Directly applicable public S4/S4R follower-pressure target 부재는 analytical/tangent/equilibrium suite와 exact stored case를 함께 사용해 보완하며, target을 발명하지 않는다.
|
||||
- RISK-005: External pressure tangent는 generally nonsymmetric이므로 symmetrize하지 않으며 Numerical Review가 global special-case evidence와 `tau_J`/FD acceptance를 확정한다.
|
||||
- RISK-006: Stored case의 S4/SPOS/positive `P` coverage 한계는 S4R, side/sign, objectivity와 tangent blocking internal tests로 보완한다.
|
||||
- RISK-007: Input compatibility는 assembly-level direct/explicit-instance ELSET surface와 parameterless `DSLOAD P` exact subset뿐이며 part-level/implicit qualification/`DLOAD`를 추정 지원하지 않는다.
|
||||
- adopted_default: 승인 범위 내 secondary detail은 Abaqus surface-pressure behavior와 repository convention을 evidence-backed default로 사용한다.
|
||||
|
||||
## 6. Rework-Loop Control and Stop Condition
|
||||
|
||||
- normalized_failure_attempts: `upstream-io-contract-mismatch` 1회, Gate 6 planning same-owner follow-up에서 교정 완료
|
||||
- automatic_rework_limit: 동일 normalized failure classification `2`회
|
||||
- current_attempt: `implementation` 1회 dispatch 준비; `implementation-planning` 1회 완료; phase materialization 1회 완료; `io-definition` 1회 완료; `numerical-reference-review` 1회 완료; `formulation-contract` 1회 완료; `research-evidence` 1회 완료; `requirements-baseline` 1회 완료
|
||||
- stop_condition: 동일 classification이 2회이면 자동 재작업을 중단하고 `needs-user-decision` 또는 `blocked`로 전환한다.
|
||||
|
||||
## 7. Final Workflow Closure
|
||||
|
||||
- closure_status: `pending`
|
||||
- required_evidence: Gates 1–8 owner evidence와 `release.md`의 `ready-for-release` recommendation
|
||||
- current_boundary: Gates 1–5와 Gate 6 planning/phase subgates `passed`; Stage 6 implementation `in-progress`; Gate 6 three-report evidence 전 Gate 7 금지.
|
||||
|
||||
## 8. No-Change Assertion
|
||||
|
||||
- source_code: 변경 없음
|
||||
- tests: 변경 없음
|
||||
- CMake: 변경 없음
|
||||
- reference_artifacts: 변경 없음
|
||||
- tolerance_policies: 변경 없음
|
||||
- phase_planning: `phases/index.json`에 pending entry append; `phases/shell-surface-pressure-load/index.json`과 `step1.md`–`step7.md` 생성
|
||||
- coordinator_change: `docs/shell-surface-pressure-load/coordination.md` 생성 및 Gates 1–5와 Gate 6 planning evidence 기록
|
||||
- specialist_change: Requirement Agent가 `requirements.md`, Research Agent가 `research.md`, Formulation Agent가 `formulation.md`, Numerical Review Agent가 `numerical-review.md`와 `reference-model.md`, I/O Definition Agent가 `io.md`, Implementation Planning Agent가 `implementation-plan.md`를 각각 생성함
|
||||
@@ -0,0 +1,749 @@
|
||||
# Shell Surface Pressure Load Formulation
|
||||
|
||||
## 1. Metadata
|
||||
|
||||
- feature_id: `shell-surface-pressure-load`
|
||||
- source_requirement: `docs/shell-surface-pressure-load/requirements.md`
|
||||
- source_research: `docs/shell-surface-pressure-load/research.md`
|
||||
- source_requirement_range: `FESA-REQ-SHELL-PRESSURE-001`–`FESA-REQ-SHELL-PRESSURE-024`
|
||||
- status: `ready-for-numerical-review`
|
||||
- owner_agent: `formulation-agent`
|
||||
- date: `2026-08-30`
|
||||
- formulation_scope: S4/S4R source element의 `SPOS|SNEG` named element surface에 작용하는 uniform surface-based `DSLOAD P`
|
||||
- evidence_boundary: `research.md`의 `CL-03`–`CL-10`, `CL-12`–`CL-15`와 binding project contracts
|
||||
|
||||
이 문서는 FESA가 소유하는 압력 하중의 수학적·알고리즘 계약이다. Abaqus 문서는 승인된
|
||||
입력과 observable sign/follower behavior의 근거일 뿐이다. 이 문서는 Abaqus의 내부 shell
|
||||
formulation, integration, stabilization, load-vector, pressure-load stiffness 또는 결과 생성
|
||||
절차와 FESA가 동등하다고 주장하지 않는다.
|
||||
|
||||
## 2. Scope and Assumptions
|
||||
|
||||
### 2.1 승인 범위
|
||||
|
||||
| 항목 | 계약 |
|
||||
| --- | --- |
|
||||
| analysis type | 단일 linear static 또는 승인된 full-Newton nonlinear static `NLGEOM=YES` |
|
||||
| source elements | Abaqus source type `S4`, `S4R`; 둘 다 기존 FESA MITC4를 선택하되 source type/label은 보존 |
|
||||
| load | `*SURFACE, TYPE=ELEMENT`의 single-sided `SPOS|SNEG` member에 uniform finite scalar `*DSLOAD P` |
|
||||
| linear geometry | reference configuration |
|
||||
| nonlinear geometry | trial/current configuration `x=X+u`; current-area follower pressure |
|
||||
| material/section | 기존 MITC4 linear isotropic elastic shell material/section 그대로 |
|
||||
| coordinates | geometry, pressure force, reaction, equilibrium은 global Cartesian |
|
||||
| units | model-consistent; `p:[F/L^2]`, `u:[L]`, rotation `[1]`, force `[F]`, physical moment `[F L]` |
|
||||
|
||||
Linear static은 small-displacement/small-rotation 해석이며 pressure geometry를 reference
|
||||
configuration에 고정한다. Nonlinear static은 finite translation/rotation을 허용하는
|
||||
geometrically nonlinear 해석이며 trial/current midsurface geometry를 사용한다. Material
|
||||
nonlinearity는 추가하지 않는다.
|
||||
|
||||
### 2.2 제외와 기존 계약 보존
|
||||
|
||||
- `*DLOAD` element-face pressure, `P n`, spatially varying pressure, amplitude, user load,
|
||||
edge/node/double-sided surface, 다른 element type과 다른 procedure는 이 formulation의
|
||||
대상이 아니다.
|
||||
- Surface offset, shell thickness face arm, thickness-side pressure correction과 distributed
|
||||
pressure couple을 사용하지 않는다. 압력은 midsurface에 작용하는 force resultant만 만든다.
|
||||
- S4/S4R source type은 같은 FESA MITC4 및 같은 pressure quadrature를 사용한다. `S4R`이라는
|
||||
source token은 FESA reduced pressure integration이나 별도 hourglass 경로를 선택하지 않는다.
|
||||
- 기존 MITC4 strain, stress, material tangent, drilling stabilization과 result recovery는
|
||||
변경하지 않는다. 압력은 material-independent external contribution이다.
|
||||
- 새로운 pressure-only HDF5 dataset, integration-point pressure output 또는 nodal
|
||||
extrapolation을 만들지 않는다.
|
||||
|
||||
## 3. Primary Variables, Symbols, and DOFs
|
||||
|
||||
### 3.1 Nodal variables and ordering
|
||||
|
||||
Four-node element의 generalized coordinate는
|
||||
|
||||
\[
|
||||
\mathbf q_e=
|
||||
[\mathbf u_1,\boldsymbol\theta_1,
|
||||
\mathbf u_2,\boldsymbol\theta_2,
|
||||
\mathbf u_3,\boldsymbol\theta_3,
|
||||
\mathbf u_4,\boldsymbol\theta_4]^T\in\mathbb R^{24},
|
||||
\]
|
||||
|
||||
이고 각 절점의 global 순서는
|
||||
|
||||
\[
|
||||
[UX,UY,UZ,URX,URY,URZ]
|
||||
\]
|
||||
|
||||
이다. `\mathbf u_i\in\mathbb R^3`의 단위는 `[L]`,
|
||||
`\boldsymbol\theta_i\in\mathbb R^3`는 dimensionless finite-rotation coordinate다.
|
||||
`\mathbf E_i\in\mathbb R^{3\times24}`를 `\mathbf E_i\mathbf q_e=\mathbf u_i`인
|
||||
translation extractor로 둔다.
|
||||
|
||||
압력 geometry와 pressure generalized force는 오직 `UX/UY/UZ`에 의존한다.
|
||||
`URX/URY/URZ`, shell director와 thickness offset은 pressure geometry에 들어가지 않는다.
|
||||
따라서 pressure force의 rotational entries와 pressure tangent의 rotation row/column은 모두
|
||||
정확히 zero다.
|
||||
|
||||
Global generalized coordinates는 stable full-DOF space에서 free set `q_f`와 prescribed
|
||||
constrained set `q_c`로 분할한다. Pressure contribution은 이 분할 전에 full space에
|
||||
조립한다. 기존 essential-constraint policy가 `q_c`를 정하고, constrained residual은
|
||||
reaction, free residual은 equilibrium evidence다.
|
||||
|
||||
### 3.2 Symbols and sign convention
|
||||
|
||||
| symbol | meaning | dimension |
|
||||
| --- | --- | --- |
|
||||
| `(\xi,\eta)` | natural coordinates on `[-1,1]^2` | `[1]` |
|
||||
| `N_i` | bilinear shape function | `[1]` |
|
||||
| `\mathbf X_i`, `\mathbf x_i` | reference, current nodal position; `x_i=X_i+u_i` | `[L]` |
|
||||
| `\mathbf g_\xi,\mathbf g_\eta` | covariant surface tangents in the chosen configuration | `[L]` |
|
||||
| `\mathbf a=\mathbf g_\xi\times\mathbf g_\eta` | connectivity-positive oriented area vector per `d\xi d\eta` | `[L^2]` |
|
||||
| `J_s=\|\mathbf a\|` | unsigned surface Jacobian | `[L^2]` |
|
||||
| `s` | side multiplier: `+1` for `SPOS`, `-1` for `SNEG` | `[1]` |
|
||||
| `p` | unscaled signed source `DSLOAD P` magnitude | `[F/L^2]` |
|
||||
| `\lambda` | current analysis step load factor | `[1]` |
|
||||
| `[\mathbf v]_\times` | skew matrix satisfying `[v]_\times w=v\times w` | same as `v` |
|
||||
|
||||
Selected-side oriented area vector는 `\mathbf a_s=s\mathbf a`다. Positive `DSLOAD P`는
|
||||
selected normal 반대 방향이므로 natural-area force density는
|
||||
|
||||
\[
|
||||
d\mathbf f_p=-\lambda p\,s\,\mathbf a\,d\xi d\eta. \tag{1}
|
||||
\]
|
||||
|
||||
따라서 exact sign map은 다음과 같다.
|
||||
|
||||
| side | selected normal | `p>0` force | `p<0` force |
|
||||
| --- | --- | --- | --- |
|
||||
| `SPOS` | connectivity-positive | `-\mathbf n` | `+\mathbf n` |
|
||||
| `SNEG` | connectivity-negative | `+\mathbf n` | `-\mathbf n` |
|
||||
|
||||
여기서 `\mathbf n=\mathbf a/\|\mathbf a\|`다. Magnitude에 absolute value를 취하지 않는다.
|
||||
이 sign은 named surface의 surface-based `DSLOAD P` 계약이다. Element/element-set face label을
|
||||
쓰는 `DLOAD` sign rule을 가져오지 않는다.
|
||||
|
||||
## 4. Strong Form and Boundary Conditions
|
||||
|
||||
Reference body `\Omega_0`에 대한 일반적인 equilibrium strong form을
|
||||
|
||||
\[
|
||||
\operatorname{Div}\mathbf P+\mathbf B=\mathbf0
|
||||
\quad\text{in }\Omega_0,
|
||||
\]
|
||||
\[
|
||||
\mathbf u=\bar{\mathbf u}\quad\text{on }\Gamma_u,
|
||||
\qquad
|
||||
\mathbf P\mathbf N=\bar{\mathbf t}\quad\text{on }\Gamma_t
|
||||
\]
|
||||
|
||||
로 둔다. Shell reduction에서 selected shell face pressure는 midsurface external distributed
|
||||
load로 나타낸다. 승인 pressure patch에서 spatial traction은
|
||||
|
||||
\[
|
||||
\mathbf t_p=-\lambda p\,\mathbf n_s,
|
||||
\qquad \mathbf n_s=s\mathbf n. \tag{2}
|
||||
\]
|
||||
|
||||
여기서 `P`는 first Piola stress, `B`는 reference body force density, `N`은 reference outward
|
||||
normal이고 `Gamma_u`, `Gamma_t`는 Dirichlet/Neumann boundary partition이다. Equation `(2)`는
|
||||
current-area spatial traction이다. Reference weak form에서 그 nominal pullback은
|
||||
`\bar t_0 dA=t_p da`를 만족해야 하며, 아래 oriented-area integral이 이 변환을 직접 포함한다.
|
||||
|
||||
Linear path에서는 `(2)`의 direction과 area measure를 reference surface에서 평가한다.
|
||||
Nonlinear path에서는 current surface에서 평가한다. 압력은 edge traction이나 nodal couple을
|
||||
추가하지 않으며, 기존 essential displacement/rotation constraints가 `\Gamma_u`를 정의한다.
|
||||
|
||||
## 5. Weak or Variational Form
|
||||
|
||||
Admissible test field `\delta\mathbf q`는 `\Gamma_u`에서 zero다. Equilibrium functional은
|
||||
|
||||
\[
|
||||
G(\mathbf q;\delta\mathbf q)
|
||||
=\delta W_{int}(\mathbf q;\delta\mathbf q)
|
||||
-\delta W_{ext}(\mathbf q;\delta\mathbf q)=0. \tag{3}
|
||||
\]
|
||||
|
||||
Integration by parts 뒤 body/edge natural terms와 selected pressure term이 external virtual
|
||||
work를 이룬다. 이 feature가 추가하는 element pressure virtual work는
|
||||
|
||||
\[
|
||||
\delta W_{p,e}
|
||||
=-\lambda p s\int_{-1}^{1}\int_{-1}^{1}
|
||||
\delta\mathbf x_h(\xi,\eta)\cdot\mathbf a(\xi,\eta)
|
||||
\,d\xi d\eta, \tag{4}
|
||||
\]
|
||||
|
||||
\[
|
||||
\delta\mathbf x_h=\sum_{i=1}^{4}N_i\,\delta\mathbf u_i.
|
||||
\]
|
||||
|
||||
Equation `(4)`는 같은 interpolation에 대해 work-equivalent nodal force를 정의한다
|
||||
(`research.md` `CL-06`). Rotational virtual coordinates에는 pressure virtual work가 없다.
|
||||
Internal virtual work와 pressure-independent body/edge load는 기존 MITC4/procedure 계약을
|
||||
그대로 사용한다.
|
||||
|
||||
## 6. Discretization
|
||||
|
||||
### 6.1 Nodal layout and shape functions
|
||||
|
||||
Connectivity order와 natural node coordinates는
|
||||
|
||||
| node `i` | `(\xi_i,\eta_i)` |
|
||||
| --- | --- |
|
||||
| 1 | `(-1,-1)` |
|
||||
| 2 | `(+1,-1)` |
|
||||
| 3 | `(+1,+1)` |
|
||||
| 4 | `(-1,+1)` |
|
||||
|
||||
이며
|
||||
|
||||
\[
|
||||
\begin{aligned}
|
||||
N_1&=\tfrac14(1-\xi)(1-\eta),&
|
||||
N_2&=\tfrac14(1+\xi)(1-\eta),\\
|
||||
N_3&=\tfrac14(1+\xi)(1+\eta),&
|
||||
N_4&=\tfrac14(1-\xi)(1+\eta).
|
||||
\end{aligned} \tag{5}
|
||||
\]
|
||||
|
||||
Natural derivatives are fixed as
|
||||
|
||||
\[
|
||||
\begin{aligned}
|
||||
N_{1,\xi}&=-\tfrac14(1-\eta),&N_{1,\eta}&=-\tfrac14(1-\xi),\\
|
||||
N_{2,\xi}&=+\tfrac14(1-\eta),&N_{2,\eta}&=-\tfrac14(1+\xi),\\
|
||||
N_{3,\xi}&=+\tfrac14(1+\eta),&N_{3,\eta}&=+\tfrac14(1+\xi),\\
|
||||
N_{4,\xi}&=-\tfrac14(1+\eta),&N_{4,\eta}&=+\tfrac14(1-\xi).
|
||||
\end{aligned} \tag{5a}
|
||||
\]
|
||||
|
||||
필수 interpolation checks는
|
||||
|
||||
\[
|
||||
\sum_{i=1}^{4}N_i(\xi,\eta)=1,
|
||||
\qquad N_i(\xi_j,\eta_j)=\delta_{ij} \tag{6}
|
||||
\]
|
||||
|
||||
이다. `(6)`은 constant translation과 nodal interpolation을 보장한다.
|
||||
|
||||
### 6.2 Isoparametric surface mapping
|
||||
|
||||
Linear/reference mapping은
|
||||
|
||||
\[
|
||||
\mathbf X_h=\sum_iN_i\mathbf X_i,
|
||||
\quad
|
||||
\mathbf G_\xi=\sum_iN_{i,\xi}\mathbf X_i,
|
||||
\quad
|
||||
\mathbf G_\eta=\sum_iN_{i,\eta}\mathbf X_i,
|
||||
\quad
|
||||
\mathbf A=\mathbf G_\xi\times\mathbf G_\eta. \tag{7}
|
||||
\]
|
||||
|
||||
Nonlinear/current mapping은
|
||||
|
||||
\[
|
||||
\mathbf x_h=\sum_iN_i(\mathbf X_i+\mathbf u_i),
|
||||
\quad
|
||||
\mathbf g_\xi=\sum_iN_{i,\xi}\mathbf x_i,
|
||||
\quad
|
||||
\mathbf g_\eta=\sum_iN_{i,\eta}\mathbf x_i,
|
||||
\quad
|
||||
\mathbf a=\mathbf g_\xi\times\mathbf g_\eta. \tag{8}
|
||||
\]
|
||||
|
||||
Load integration은 natural derivative와 oriented area vector를 직접 사용하므로 physical
|
||||
in-plane derivative transform이나 `2x2` inverse Jacobian이 필요하지 않다. Material strain
|
||||
`B` matrix를 계산하는 기존 MITC4 kernel의 derivative transform은 별도이며 변경하지 않는다.
|
||||
|
||||
## 7. Kinematics
|
||||
|
||||
Pressure load kinematic operator는 `(7)` 또는 `(8)`의 midsurface positional mapping이다.
|
||||
Linear path는 `\mathbf A`를 고정하며 candidate displacement가 pressure direction이나 area를
|
||||
바꾸지 않는다. Nonlinear path는 trial `\mathbf x=\mathbf X+\mathbf u`를 사용한다.
|
||||
|
||||
Current area vector의 directional variation은 임의의 translational direction
|
||||
`\Delta\mathbf u_j`에 대해
|
||||
|
||||
\[
|
||||
D\mathbf a[\Delta\mathbf u]
|
||||
=D\mathbf g_\xi[\Delta\mathbf u]\times\mathbf g_\eta
|
||||
+\mathbf g_\xi\times D\mathbf g_\eta[\Delta\mathbf u], \tag{9}
|
||||
\]
|
||||
|
||||
\[
|
||||
D\mathbf a[\Delta\mathbf u]
|
||||
=\sum_{j=1}^{4}
|
||||
\left(-N_{j,\xi}[\mathbf g_\eta]_\times
|
||||
+N_{j,\eta}[\mathbf g_\xi]_\times\right)
|
||||
\Delta\mathbf u_j. \tag{10}
|
||||
\]
|
||||
|
||||
Pressure는 strain, deformation gradient 또는 director strain을 직접 계산하지 않는다.
|
||||
Geometrically linear/finite-rotation MITC4의 strain-displacement operator, strain measure와
|
||||
internal tangent는 기존 formulation 계약을 따른다. 이 문서가 소유하는 새로운 kinematic
|
||||
derivative는 `(9)`–`(10)`뿐이다.
|
||||
|
||||
Objectivity invariants는 다음과 같다.
|
||||
|
||||
- Uniform translation `x_i'=x_i+c`에서 tangents, area vector, nodal pressure forces는 변하지 않는다.
|
||||
- Proper rigid rotation `x_i'=Qx_i+c`, `Q^TQ=I`, `det Q=+1`에서
|
||||
`a'=Qa`, `f_i'=Qf_i`, `K_{ij}^{uu\prime}=QK_{ij}^{uu}Q^T`다.
|
||||
- Homogeneous in-plane area change는 current vector area를 바꾸므로, 일정 scalar pressure라도
|
||||
nonlinear total resultant magnitude가 current area에 따라 바뀔 수 있다.
|
||||
|
||||
## 8. Constitutive Contract
|
||||
|
||||
Existing MITC4 linear isotropic shell constitutive relation을 추상적으로
|
||||
|
||||
\[
|
||||
\mathbf s=\mathbf D\mathbf e,
|
||||
\qquad \delta\mathbf e=\mathbf B_{MITC4}\delta\mathbf q_e,
|
||||
\qquad
|
||||
\delta W_{int,e}=\int_{\Omega_{0,e}}\delta\mathbf e^T\mathbf s\,d\Omega_0,
|
||||
\qquad
|
||||
\mathbf f_e^{int}=\int_{\Omega_{0,e}}\mathbf B_{MITC4}^T\mathbf s\,d\Omega_0
|
||||
\]
|
||||
|
||||
로 둔다. `\mathbf e`, `\mathbf s`, `\mathbf D`, MITC shear interpolation, drilling
|
||||
stabilization, existing material state와 internal consistent tangent는 이 feature가 변경하지
|
||||
않는다. Pressure force와 external tangent는 `\mathbf D`, thickness, stress와 material state에
|
||||
의존하지 않는다. 새 material state variable, mass 또는 damping contribution은 없다.
|
||||
|
||||
## 9. Element Equations
|
||||
|
||||
### 9.1 Consistent nodal pressure force
|
||||
|
||||
Equation `(4)`와 `(5)`로부터 node `i`의 translational force block은
|
||||
|
||||
\[
|
||||
\mathbf f_{p,i}^{u}
|
||||
=-\lambda p s\int_{-1}^{1}\int_{-1}^{1}
|
||||
N_i\mathbf a_c\,d\xi d\eta\in\mathbb R^3, \tag{11}
|
||||
\]
|
||||
|
||||
여기서 linear path는 `a_c=A`, nonlinear path는 `a_c=a`다. Element generalized vector는
|
||||
|
||||
\[
|
||||
\mathbf f_{p,e}^{ext}
|
||||
=\sum_{i=1}^{4}\mathbf E_i^T\mathbf f_{p,i}^{u}
|
||||
\in\mathbb R^{24}. \tag{12}
|
||||
\]
|
||||
|
||||
각 node block은 `[f_x,f_y,f_z,0,0,0]`이며 translation은 `[F]`, zero rotation entry의
|
||||
generalized unit은 `[F L]`이다. `p=0`이면 force와 tangent는 exact zero지만 surface/model
|
||||
validation을 생략하지 않는다. `\lambda`는 unscaled source `p`에 식 `(11)`에서 정확히 한 번만
|
||||
곱한다.
|
||||
|
||||
### 9.2 Linear path
|
||||
|
||||
Linear static에서는
|
||||
|
||||
\[
|
||||
\mathbf f_{p,e}^{lin}
|
||||
=-\lambda p s\int N_i\mathbf A\,d\xi d\eta,
|
||||
\qquad
|
||||
\mathbf K_{p,e}^{ext,lin}
|
||||
=\frac{\partial\mathbf f_{p,e}^{lin}}{\partial\mathbf q_e}
|
||||
=\mathbf0_{24\times24}. \tag{13}
|
||||
\]
|
||||
|
||||
따라서 pressure는 reference-area/reference-normal constant load이고 candidate displacement와
|
||||
독립이다.
|
||||
|
||||
### 9.3 Nonlinear external tangent
|
||||
|
||||
`[v]_\times w=v\times w` 정의와 `(10)`을 `(11)`에 대입하면 translation-to-translation
|
||||
`3x3` block은
|
||||
|
||||
\[
|
||||
\boxed{
|
||||
\mathbf K_{p,ij}^{ext,uu}
|
||||
=\frac{\partial\mathbf f_{p,i}^{u}}{\partial\mathbf u_j}
|
||||
=\lambda p s\int_{-1}^{1}\int_{-1}^{1}
|
||||
N_i\left(
|
||||
N_{j,\xi}[\mathbf g_\eta]_\times
|
||||
-N_{j,\eta}[\mathbf g_\xi]_\times
|
||||
\right)d\xi d\eta
|
||||
}\in\mathbb R^{3\times3}. \tag{14}
|
||||
\]
|
||||
|
||||
동일 식의 implementable generalized form은
|
||||
|
||||
\[
|
||||
\mathbf K_{p,e}^{ext}
|
||||
=\sum_{i=1}^{4}\sum_{j=1}^{4}
|
||||
\mathbf E_i^T\mathbf K_{p,ij}^{ext,uu}\mathbf E_j
|
||||
\in\mathbb R^{24\times24}. \tag{15}
|
||||
\]
|
||||
|
||||
모든 rotation row와 column은 exact zero다. Nonzero block unit은 `[F/L]`이다.
|
||||
`K_{p,e}^{ext}`는 일반적으로 nonsymmetric이며 조용히 symmetrize하지 않는다. 특정 closed
|
||||
loaded boundary에서 global assembly가 대칭을 보일 수 있으나 element operator나 solver
|
||||
contract의 가정으로 사용하지 않는다.
|
||||
|
||||
### 9.4 Residual and Newton tangent sign
|
||||
|
||||
FESA nonlinear procedure의 binding convention은
|
||||
|
||||
\[
|
||||
\mathbf r=\mathbf f^{int}-\mathbf f^{ext},
|
||||
\qquad
|
||||
\mathbf K=\frac{\partial\mathbf r}{\partial\mathbf q}
|
||||
=\mathbf K^{int}-\mathbf K^{ext},
|
||||
\qquad
|
||||
\mathbf K\Delta\mathbf q=-\mathbf r. \tag{16}
|
||||
\]
|
||||
|
||||
따라서 `(14)`–`(15)`는 `f_ext`의 양의 directional derivative이고 residual tangent에는
|
||||
`-K_ext`로 들어간다. Linear static도 같은 equilibrium sign으로
|
||||
`r=K_int q-f_ext`다. 이 구분은 pressure force와 tangent에 같은 sign 오류를 넣어 finite
|
||||
difference만 통과하는 common-mode failure를 방지한다.
|
||||
|
||||
Mass와 damping은 이 static load feature에 없다.
|
||||
|
||||
## 10. Mapping, Numerical Integration, and Geometry Validity
|
||||
|
||||
### 10.1 Pressure quadrature
|
||||
|
||||
S4와 S4R source type 모두 pressure force와 pressure tangent에 동일한 tensor-product
|
||||
`2x2` Gauss rule을 사용한다.
|
||||
|
||||
\[
|
||||
g=1/\sqrt3,
|
||||
\quad
|
||||
(\xi_q,\eta_q)\in\{(-g,-g),(+g,-g),(+g,+g),(-g,+g)\},
|
||||
\quad w_q=1. \tag{17}
|
||||
\]
|
||||
|
||||
Force와 tangent는 반드시 같은 point order와 weight를 사용한다. 실제 계산식은
|
||||
|
||||
\[
|
||||
\mathbf f_{p,i}^{u}
|
||||
=-\lambda p s\sum_{q=1}^{4}w_qN_i(q)\mathbf a_c(q), \tag{18}
|
||||
\]
|
||||
|
||||
\[
|
||||
\mathbf K_{p,ij}^{ext,uu}
|
||||
=\lambda p s\sum_{q=1}^{4}w_qN_i(q)
|
||||
\left(N_{j,\xi}(q)[\mathbf g_\eta(q)]_\times
|
||||
-N_{j,\eta}(q)[\mathbf g_\xi(q)]_\times\right). \tag{19}
|
||||
\]
|
||||
|
||||
Bilinear mapping에서 `a(\xi,\eta)`는 `\xi,\eta`의 affine vector이고, `(18)`과 `(19)`의
|
||||
각 scalar component는 각 natural coordinate에 대해 차수가 최대 2다. 따라서 `2x2` rule은
|
||||
이 discrete uniform-pressure force와 그 exact derivative를 적분한다. 이 선택은
|
||||
work-equivalence, force/tangent consistency와 단순성을 위한 FESA-owned 결정이며 Abaqus
|
||||
S4/S4R 내부 integration과의 동등성을 뜻하지 않는다.
|
||||
|
||||
### 10.2 Scale-aware surface validity contract
|
||||
|
||||
Reference validation에는 `y_i=X_i`, current trial validation에는 `y_i=x_i`를 사용한다.
|
||||
각 configuration에서
|
||||
|
||||
\[
|
||||
\ell_e=\max_{1\le i<j\le4}\|\mathbf y_i-\mathbf y_j\|,
|
||||
\qquad
|
||||
\bar{\mathbf a}=\frac14\sum_{q=1}^{4}w_q\mathbf a(q),
|
||||
\qquad
|
||||
\bar{\mathbf n}=\frac{\bar{\mathbf a}}{\|\bar{\mathbf a}\|}. \tag{20}
|
||||
\]
|
||||
|
||||
`\ell_e`는 element의 실제 chord scale이고 임의의 `max(1,...)` 또는 absolute length floor를
|
||||
사용하지 않는다. Numerical Review는 단 하나의 dimensionless surface threshold
|
||||
`\tau_J\in(0,1)`의 최종 값을 정해야 한다. 그 전까지 구현에 임시 default를 둘 수 없다.
|
||||
|
||||
Configuration은 다음 조건을 모두 만족해야 유효하다.
|
||||
|
||||
1. 모든 `y_i`, `\ell_e`, covariant tangent, area vector와 `(20)`의 값이 finite여야 한다.
|
||||
2. `\ell_e=0`인 exact collapsed node inventory는 즉시 실패한다.
|
||||
3. Mean signed surface scale은
|
||||
`\|\bar a\|/\ell_e^2>\tau_J`여야 한다.
|
||||
4. Check set
|
||||
`C={(-1,-1),(+1,-1),(+1,+1),(-1,+1)}\cup{four Gauss points}`의 모든 point `z`에서
|
||||
|
||||
\[
|
||||
j_s(z)=\frac{\mathbf a(z)\cdot\bar{\mathbf n}}{\ell_e^2}>\tau_J \tag{21}
|
||||
\]
|
||||
|
||||
이어야 한다.
|
||||
5. Four Gauss points 각각에서 `J_s=\|a\|`, `N_i`, derivatives, force integrand와 nonlinear
|
||||
tangent blocks가 finite여야 한다. Accumulated element vector/matrix도 finite여야 한다.
|
||||
|
||||
Bilinear surface의 area vector는 natural coordinates에 affine이므로, corner에서 `(21)`의
|
||||
signed projection이 양수이면 square 내부 전체에서 같은 orientation을 유지한다. Gauss-point
|
||||
checks는 실제 적분 위치의 scale과 finite 값을 추가로 보장한다. Mean cancellation 또는
|
||||
corner/point sign loss는 fold, local inversion 또는 singular mapping으로 분류해 fail closed한다.
|
||||
|
||||
Connectivity order는 orientation의 유일한 source이며 geometry validation이 node를 reorder,
|
||||
normal flip 또는 absolute-area repair하지 않는다. `SPOS/SNEG`의 `s`도 step 동안 고정한다.
|
||||
Current normal을 reference global normal과 dot-product 비교하지 않는다. 그러한 비교는 valid
|
||||
large rigid rotation을 inversion으로 잘못 거부한다. Coherent proper rigid rotation은 valid이고,
|
||||
local regularity/orientation loss만 `(20)`–`(21)`로 거부한다.
|
||||
|
||||
Reference configuration은 analysis 시작 전에 검사한다. Nonlinear current configuration은
|
||||
매 Newton trial에서 force/tangent 평가 전에 검사한다. 어느 검사든 실패하면 해당 candidate의
|
||||
pressure contribution, state와 final output을 commit하지 않는다.
|
||||
|
||||
## 11. Deterministic Assembly and Failure Contract
|
||||
|
||||
### 11.1 Source/facet identity and exact-once semantics
|
||||
|
||||
- Resolved facet identity는 stable source `(instance, element label, source element type, side)`를
|
||||
보존한다. S4/S4R은 같은 numerical kernel을 선택해도 source identity에서 합치지 않는다.
|
||||
- 한 named surface 안의 동일 facet membership은 unique inventory에 정확히 한 번 존재한다.
|
||||
같은 element의 conflicting side/membership은 ambiguity로 fail closed한다.
|
||||
- 각각의 valid `DSLOAD P` source record는 distinct load identity다. 한 surface를 가리키는
|
||||
여러 valid load record가 있으면 각 record를 source order에서 한 번씩 적용하고 합한다.
|
||||
서로 다른 load record를 deduplicate하지 않는다.
|
||||
- Local contribution identity는 최소한 `(load source order, resolved facet order, instance,
|
||||
element label, side, local row[, local column])`을 포함한다.
|
||||
|
||||
Element-local vector와 tangent contribution을 먼저 완성·검증하고, 위 stable identity 순서로
|
||||
full generalized space에 고정 reduction한다. Parallel producer는 global vector/matrix를 직접
|
||||
갱신하지 않는다. Full-space assembly가 끝난 뒤에만 stable free/constrained projection을
|
||||
적용한다. 이 계약은 surface declaration order, thread schedule과 internal index가 physical
|
||||
source identity나 floating reduction order를 바꾸지 않게 한다.
|
||||
|
||||
### 11.2 Fail-closed conditions
|
||||
|
||||
다음은 pressure contribution 없이 deterministic non-success로 끝나야 한다.
|
||||
|
||||
- unsupported surface/load/side/element/procedure, unresolved·empty·ambiguous target 또는
|
||||
incompatible duplicate;
|
||||
- nonfinite `p`, `\lambda`, nodal coordinate, tangent, area vector, integrand, element/global force
|
||||
또는 tangent;
|
||||
- reference 또는 current geometry가 `(20)`–`(21)`을 위반함;
|
||||
- local/generalized dimension 또는 full-DOF scatter identity 불일치;
|
||||
- stable reduction 결과가 nonfinite임.
|
||||
|
||||
Input/mapping failure는 file/line/keyword/surface/load/facet source identity를 가능한 범위에서
|
||||
보존하고, numerical failure는 configuration, load record와 facet identity를 보존한다. Exact
|
||||
diagnostic schema/code는 Stage 5 I/O가 소유하지만 failure category, source order와 atomicity는
|
||||
여기서 바뀌지 않는다. 실패한 candidate는 accepted state나 정상 final HDF5로 publish하지 않는다.
|
||||
|
||||
## 12. Output Recovery
|
||||
|
||||
압력 효과는 기존 authoritative HDF5 결과에서만 관측한다.
|
||||
|
||||
| quantity | location / identity | pressure contract |
|
||||
| --- | --- | --- |
|
||||
| displacement/rotation | nodal, global `[UX,UY,UZ,URX,URY,URZ]` | 기존 accepted frame output; pressure solution effect 포함 |
|
||||
| full residual/reaction | nodal full DOF, stable source node identity | `r=f_int-f_ext`; constrained entry는 reaction, free entry는 equilibrium residual |
|
||||
| global equilibrium | accepted nonlinear factor-one frame, global origin | applied pressure force와 current `X+u` arm을 사용한 applied-plus-reaction force/moment balance |
|
||||
| element force/resultant | 기존 MITC4 element/output locations | internal recovery unchanged; pressure-only row 없음 |
|
||||
| generalized strain/stress | 기존 MITC4 integration point/section locations | material response를 기존 방식으로 복구; pressure dataset/extrapolation 없음 |
|
||||
|
||||
Pressure generalized vector의 rotational nodal entries는 zero지만 physical global moment는
|
||||
current/reference force arm으로 계산한다. Origin `O`에 대한 applied pressure moment는
|
||||
|
||||
\[
|
||||
\mathbf M_O^p
|
||||
=\sum_i(\mathbf x_i-\mathbf O)\times\mathbf f_{p,i}^{u}
|
||||
=-\lambda p s\sum_qw_q
|
||||
(\mathbf x_h(q)-\mathbf O)\times\mathbf a(q) \tag{22}
|
||||
\]
|
||||
|
||||
이다. Linear check에서는 `x` 대신 `X`, nonlinear accepted equilibrium에서는 current `x`를
|
||||
사용한다. 별도 pressure nodal moment를 더하지 않는다.
|
||||
|
||||
External reference disposition은 변경하지 않는다: stored displacement `U1/U2/U3`는 blocking,
|
||||
`UR1/UR2/UR3`는 warning-only, reaction CSV는 review-only, stress CSV는 excluded다. External
|
||||
comparison만 `docs/TOLERANCE.md`를 사용하며 analytical/tangent/geometry tolerance를 대신하지 않는다.
|
||||
|
||||
## 13. Algorithm Pseudocode
|
||||
|
||||
```text
|
||||
INPUT: approved step load factor lambda, ordered DSLOAD records,
|
||||
ordered unique surface facets, full nodal generalized trial q
|
||||
|
||||
validate procedure, finite lambda, load records, target identity and side
|
||||
|
||||
for load_record in stable source order:
|
||||
p = unscaled signed uniform magnitude
|
||||
validate p is finite
|
||||
|
||||
for facet in stable resolved order:
|
||||
require source type S4 or S4R and side SPOS or SNEG
|
||||
preserve (instance, element label, source type, side)
|
||||
s = +1 for SPOS, -1 for SNEG
|
||||
|
||||
if linear static:
|
||||
y_i = X_i
|
||||
else if nonlinear static:
|
||||
y_i = X_i + u_i from the current trial
|
||||
|
||||
evaluate geometry scale and mean oriented area
|
||||
validate reference/current geometry at four corners and four Gauss points
|
||||
|
||||
initialize f_e[24] = 0
|
||||
initialize K_ext_e[24,24] = 0
|
||||
|
||||
for q in fixed 2x2 Gauss order:
|
||||
evaluate N_i, N_i,xi, N_i,eta
|
||||
evaluate g_xi, g_eta, a = g_xi cross g_eta
|
||||
validate every value and integrand is finite
|
||||
|
||||
for i = 1..4:
|
||||
f_e.translation(i) += -lambda*p*s*w_q*N_i*a
|
||||
|
||||
if nonlinear static:
|
||||
for j = 1..4:
|
||||
block = lambda*p*s*w_q*N_i *
|
||||
(N_j,xi*skew(g_eta)
|
||||
- N_j,eta*skew(g_xi))
|
||||
K_ext_e.translation(i),translation(j) += block
|
||||
|
||||
require all rotation entries/rows/columns remain exact zero
|
||||
validate f_e and K_ext_e finite
|
||||
emit an element-local contribution with stable load/facet identity
|
||||
|
||||
stable-reduce all local pressure contributions into full-space f_ext and K_ext
|
||||
combine with other approved loads in stable source order
|
||||
|
||||
linear:
|
||||
solve existing partitioned linear equilibrium using reference f_ext
|
||||
K_ext_pressure = 0
|
||||
|
||||
nonlinear trial:
|
||||
assemble existing MITC4 f_int and K_int
|
||||
r = f_int - f_ext
|
||||
K = K_int - K_ext
|
||||
partition only after full-space assembly
|
||||
solve K_ff * Delta_q_f = -r_f
|
||||
evaluate existing convergence gates
|
||||
|
||||
on accepted state only:
|
||||
recover displacement, full residual/reaction, global equilibrium,
|
||||
and existing MITC4 results
|
||||
atomically publish existing HDF5 contract
|
||||
```
|
||||
|
||||
## 14. Verification Identities and Oracles
|
||||
|
||||
### 14.1 Analytical and algebraic identities
|
||||
|
||||
1. **Partition/Kronecker:** `(6)` must pass exactly up to the Numerical Review-approved arithmetic
|
||||
check tolerance.
|
||||
2. **Resultant:** consistent assembly gives
|
||||
|
||||
\[
|
||||
\sum_i\mathbf f_{p,i}^{u}
|
||||
=-\lambda p s\sum_qw_q\mathbf a_c(q). \tag{23}
|
||||
\]
|
||||
|
||||
Flat patch에서는 right side가 `-lambda*p*s*A*n`이다.
|
||||
3. **Moment:** equation `(22)` must hold using the same quadrature and declared origin.
|
||||
4. **Sign reversal:** `SPOS↔SNEG` 또는 `p↔-p`는 force, tangent와 applied moment의 부호를
|
||||
각각 정확히 반전한다. 두 번 반전하면 원래 부호다.
|
||||
5. **Load factor:** fixed geometry에서 `lambda={0,0.5,1}` force/tangent는 각각 exact
|
||||
proportional path를 따른다. Factor는 다른 layer에서 다시 곱하지 않는다.
|
||||
6. **Rigid motion:** translation/rotation objectivity와 tangent covariance는 §7을 만족한다.
|
||||
7. **Rotation-only tangent direction:** pressure force가 nodal rotations에 의존하지 않으므로
|
||||
rotation-only direction `d_theta`에 대해 `K_ext d_theta=0` exactly다.
|
||||
|
||||
### 14.2 Directional tangent oracle
|
||||
|
||||
Nondegenerate distorted current patch, both source types, both sides와 positive/negative pressure에
|
||||
대해 translation direction `d`를 사용하여
|
||||
|
||||
\[
|
||||
\mathbf d_{FD}(\varepsilon)
|
||||
=\frac{\mathbf f^{ext}(\mathbf u+\varepsilon\mathbf d)
|
||||
-\mathbf f^{ext}(\mathbf u-\varepsilon\mathbf d)}{2\varepsilon}
|
||||
\quad\text{and}\quad
|
||||
\mathbf d_A=\mathbf K^{ext}(\mathbf u)\mathbf d \tag{24}
|
||||
\]
|
||||
|
||||
를 비교한다. 두 perturbed geometry 모두 §10.2를 만족해야 한다. `epsilon`, direction scaling,
|
||||
force scale와 norm criterion은 Numerical Review가 dimensionless rule로 확정한다. Residual
|
||||
tangent check는 `(16)`에 따라 `-K_ext d`와 비교한다.
|
||||
|
||||
### 14.3 Assembly, solution, and reference oracles
|
||||
|
||||
- Flat/distorted S4와 S4R patch에서 resultant, moment, reaction, side/sign reversal을 검증한다.
|
||||
- 동일 geometry의 single/multi-element mesh와 shuffled declaration/member order에서 force/moment
|
||||
invariant와 stable reduction/diagnostic order를 검증한다.
|
||||
- Fully constrained patch에서 constrained reaction은 applied pressure와 equal-and-opposite이며,
|
||||
mixed constraint에서는 constrained reaction과 free residual을 분리한다.
|
||||
- Nonlinear accepted factor-one에서 applied-plus-constrained-reaction global force와 moment의
|
||||
normalized error는 각각 `<=1e-8`이고 accepted free residual은 기존 convergence gate를 통과한다.
|
||||
- Exact stored input/CSV는 current path/name 그대로 read-only로 사용한다. External displacement
|
||||
agreement는 sign, tangent와 equilibrium unit checks를 대체하지 않는다.
|
||||
|
||||
## 15. Numerical Risks
|
||||
|
||||
| risk | formulation consequence / required evidence |
|
||||
| --- | --- |
|
||||
| rigid body modes | Pressure는 support를 만들지 않는다. Unconstrained linear patch의 six rigid-body modes를 regularization으로 숨기지 않는다. |
|
||||
| patch test | Flat/distorted constant-pressure resultant와 moment, mesh subdivision invariant를 검사한다. |
|
||||
| tangent symmetry | Element `K_ext`는 일반적으로 nonsymmetric이다. Symmetrization 금지; full unsymmetric solver path를 유지한다. |
|
||||
| positive definiteness | `K_int-K_ext`는 follower loading에서 positive definite일 필요가 없다. Unsupported fallback/regularization으로 failure를 숨기지 않는다. |
|
||||
| hourglass | Pressure는 S4/S4R 모두 2x2로 적분하므로 pressure under-integration mode를 만들지 않는다. 기존 MITC4 drilling/hourglass 정책은 변경하지 않는다. |
|
||||
| shear locking | Existing MITC4 internal kinematics의 위험이며 pressure interpolation을 바꾸는 이유가 아니다. Thin-shell verification에서 분리 관찰한다. |
|
||||
| volumetric locking | Shell pressure load kernel에는 volumetric constitutive mode가 없어 직접 해당하지 않는다. 기존 material contract를 확장하지 않는다. |
|
||||
| distortion / warpage | Bilinear tangents와 vector area를 pointwise 사용하고 §10.2의 dimensionless check로 fold/collapse를 거부한다. |
|
||||
| singular Jacobian | `J_s`, signed projected area 또는 mean area scale이 threshold를 통과하지 못하면 force/tangent 계산 전에 실패한다. |
|
||||
| sign/common-mode error | Analytical sign/reaction oracle를 tangent finite difference와 함께 사용한다. FD만으로 force+tangent 공통 sign 오류를 승인하지 않는다. |
|
||||
| source duplication/order | Unique facet와 distinct load-record exact-once semantics, stable full-space reduction을 별도로 검사한다. |
|
||||
| nonfinite propagation | 매 geometry/integration/contribution/reduction boundary에서 finite를 확인하고 accepted state/output을 보존한다. |
|
||||
|
||||
## 16. Requirement Traceability
|
||||
|
||||
| requirement | formulation disposition / verification evidence |
|
||||
| --- | --- |
|
||||
| `FESA-REQ-SHELL-PRESSURE-001` | §2, §3 sign/scope; exact syntax mapping은 Stage 5 I/O, formulation은 `DSLOAD`와 `DLOAD`를 분리 |
|
||||
| `FESA-REQ-SHELL-PRESSURE-002` | §3 `p:[F/L^2]`, signed finite scalar; §9 exact-once scaling |
|
||||
| `FESA-REQ-SHELL-PRESSURE-003` | §11 stable unique facet identity/order |
|
||||
| `FESA-REQ-SHELL-PRESSURE-004` | §2 S4/S4R→existing MITC4, source identity retained, only SPOS/SNEG |
|
||||
| `FESA-REQ-SHELL-PRESSURE-005` | equations `(1)`, `(11)` and §14 sign-reversal oracle |
|
||||
| `FESA-REQ-SHELL-PRESSURE-006` | connectivity-positive `a`, side multiplier `s`, fixed orientation rule §10.2 |
|
||||
| `FESA-REQ-SHELL-PRESSURE-007` | equations `(7)`, `(13)`; reference force and zero pressure tangent |
|
||||
| `FESA-REQ-SHELL-PRESSURE-008` | equations `(8)`, `(11)`; current vector area and §7 objectivity |
|
||||
| `FESA-REQ-SHELL-PRESSURE-009` | exact derivative `(9)`–`(15)`, residual sign `(16)`, FD oracle `(24)` |
|
||||
| `FESA-REQ-SHELL-PRESSURE-010` | `lambda` occurs once in `(11)`, `(14)`; proportional oracle §14.1 |
|
||||
| `FESA-REQ-SHELL-PRESSURE-011` | §11 local contribution then stable full-space assembly before projection |
|
||||
| `FESA-REQ-SHELL-PRESSURE-012` | residual/reaction sign `(16)`, §12 recovery and equilibrium oracle |
|
||||
| `FESA-REQ-SHELL-PRESSURE-013` | §11 stable identity, fixed quadrature/reduction/result/diagnostic order |
|
||||
| `FESA-REQ-SHELL-PRESSURE-014` | §2 exclusions and §11.2 unsupported variant fail-closed handoff |
|
||||
| `FESA-REQ-SHELL-PRESSURE-015` | §11 unique resolution, ambiguity/empty/conflicting membership failure |
|
||||
| `FESA-REQ-SHELL-PRESSURE-016` | §10.2 configuration checks and §11.2 procedure/nonfinite/geometry failure |
|
||||
| `FESA-REQ-SHELL-PRESSURE-017` | §11.2 stable diagnostic identity and no failed state/output commit |
|
||||
| `FESA-REQ-SHELL-PRESSURE-018` | §2.2, §12 existing HDF5 authority; no new pressure dataset |
|
||||
| `FESA-REQ-SHELL-PRESSURE-019` | §12 existing nodal/reaction/equilibrium/element result chain |
|
||||
| `FESA-REQ-SHELL-PRESSURE-020` | §14 flat/distorted S4/S4R sign/resultant/reaction/mesh-order suite |
|
||||
| `FESA-REQ-SHELL-PRESSURE-021` | §7 objectivity, `(14)`/`(24)` tangent, §14.3 residual/global balance |
|
||||
| `FESA-REQ-SHELL-PRESSURE-022` | §14.3 exact stored path/name read-only contract retained |
|
||||
| `FESA-REQ-SHELL-PRESSURE-023` | §12 U blocking/UR warning-only and deterministic source mapping retained |
|
||||
| `FESA-REQ-SHELL-PRESSURE-024` | §12 reaction CSV review-only, stress CSV excluded; internal equilibrium remains blocking |
|
||||
|
||||
Coverage: normative IDs `24`, covered IDs `24`, formulation trace gaps `0`.
|
||||
|
||||
## 17. Open Issues and Downstream Handoff
|
||||
|
||||
### 17.1 Numerical Review-owned open issues
|
||||
|
||||
| issue_id | exact decision required | constraint |
|
||||
| --- | --- | --- |
|
||||
| `FORM-NR-01` | §10.2의 single dimensionless `tau_J` 최종 수치 | chord scale `ell_e`, mean/corner/Gauss rules를 유지; `max(1,...)`, absolute floor, clamp 금지 |
|
||||
| `FORM-NR-02` | `(24)`의 dimensionless perturbation scaling, vector norm와 acceptance tolerance | centered FD, valid perturbed geometry와 both force/residual sign checks 유지 |
|
||||
| `FORM-NR-03` | analytical resultant/moment, rigid-motion objectivity와 shape-function arithmetic tolerance | external `docs/TOLERANCE.md`로 대체하지 않고 model scale을 명시 |
|
||||
| `FORM-NR-04` | element/global pressure tangent symmetry evidence 확인 | `(14)`를 기준으로 검토하며 symmetrization 또는 Abaqus internal assumption 도입 금지 |
|
||||
| `FORM-NR-05` | 직접 적용 가능한 public S4/S4R follower benchmark 부재의 evidence disposition | analytical suite와 exact stored case를 사용하고 target을 발명하지 않음 |
|
||||
|
||||
이 항목들은 승인 physics, sign, supported scope, HDF5 authority, stored reference disposition 또는
|
||||
external tolerance를 바꿀 수 없다. Critical user question은 없다.
|
||||
|
||||
### 17.2 Handoff evidence
|
||||
|
||||
Numerical Review Agent는 Coordinator를 통해 다음을 독립 검토해야 한다.
|
||||
|
||||
- Equation `(11)`의 selected-side/pressure sign과 `(14)`의 skew/cross-product sign;
|
||||
- `r=f_int-f_ext`, `K=K_int-K_ext` residual convention과 nonsymmetric assembly;
|
||||
- S4/S4R 공통 `2x2` quadrature가 force/tangent에 동일하게 쓰이고 discrete integrand를
|
||||
정확히 적분한다는 polynomial-degree argument;
|
||||
- §10.2의 reference/current dimensionless regularity 및 fold/inversion rule;
|
||||
- resultant, moment, rigid-motion, side/sign, FD tangent, reaction/free residual와 global balance
|
||||
oracle;
|
||||
- 24개 requirement trace와 output/reference disposition.
|
||||
|
||||
이 문서는 Numerical Review에 충분한 수학적 계약을 제공하지만 numerical approval을
|
||||
의미하지 않는다. Parser/I/O schema, C++ API/file ownership, implementation, reference solver
|
||||
execution과 Gate 4 decision은 수행하지 않았다.
|
||||
@@ -0,0 +1,818 @@
|
||||
# Shell Surface Pressure Load 구현 계획
|
||||
|
||||
## 1. Metadata
|
||||
|
||||
- `feature_id`: `shell-surface-pressure-load`
|
||||
- `status`: `draft-awaiting-user-approval`
|
||||
- `owner_agent`: `implementation-planning-agent`
|
||||
- `date`: `2026-08-31`
|
||||
- `source_requirement`: `docs/shell-surface-pressure-load/requirements.md`
|
||||
- `source_research`: `docs/shell-surface-pressure-load/research.md`
|
||||
- `source_formulation`: `docs/shell-surface-pressure-load/formulation.md`
|
||||
- `source_numerical_review`: `docs/shell-surface-pressure-load/numerical-review.md`
|
||||
- `source_io_definition`: `docs/shell-surface-pressure-load/io.md`
|
||||
- `source_reference_models`: `docs/shell-surface-pressure-load/reference-model.md`
|
||||
- `source_coordination_gate`: `docs/shell-surface-pressure-load/coordination.md`
|
||||
- `proposed_phase_slug`: `shell-surface-pressure-load`
|
||||
- `proposed_task_name`: `shell-surface-pressure-load`
|
||||
- `authoritative_output`: input lexical sibling `<stem>_results.h5`
|
||||
- `approval_hard_stop`: 이 문서는 승인용 Step 초안이다. 사용자 승인 전에는 `phases/index.json`, `phases/shell-surface-pressure-load/index.json`, `phases/shell-surface-pressure-load/stepN.md`를 생성하거나 수정하지 않는다.
|
||||
- `execution_hard_stop`: Step 초안 또는 향후 phase 파일 승인은 Harness 실행 권한이 아니다. `scripts/execute.py`는 별도의 명시적 사용자 실행 요청이 있을 때만 Harness Executor가 실행한다.
|
||||
- `executor_policy`: 승인 후에도 Step 선택, branch/commit, 상태·시각 기록, Stop 검증과 실행 report는 Harness Executor 소유다. 이 계획은 수동 `git commit`, 일반 sub-agent 실행 또는 대체 executor를 제안하지 않는다.
|
||||
|
||||
## 2. Goal, Architecture, Tech Stack, Spec
|
||||
|
||||
### Goal
|
||||
|
||||
승인된 Abaqus `.inp` subset의 assembly-level `*SURFACE, TYPE=ELEMENT`와 single-static-step `*DSLOAD P`를 Domain semantic model, MITC4 pressure evaluator, 선형/비선형 full-space assembly, 기존 HDF5 결과 경로와 read-only reference comparison까지 끊김 없이 연결한다. 구현은 각 Step에서 반드시 테스트를 먼저 작성하고 실제 실패를 관찰한 뒤 최소 구현과 집중/전체 검증을 수행한다.
|
||||
|
||||
### Architecture
|
||||
|
||||
- `AbaqusInputReader`는 byte-level lexical contract와 `KeywordBlock`/`DataLine` source location을 소유한다.
|
||||
- `DomainMappingContext`, `TopologyMapper`, 새 candidate `SurfaceDefinitionMapper`, `StepDefinitionMapper`, `DomainBuilder`가 raw input을 완전한 semantic candidate로 만든 뒤 한 번만 `Domain::Create`에 commit한다.
|
||||
- `Domain`은 immutable ordered surface/facet inventory를, `StepDefinition`은 additive pressure records를 소유한다. `AnalysisModel`은 이를 복사하지 않는 active-step view만 제공하고 Domain이 더 오래 살아야 한다.
|
||||
- 새 pressure evaluator는 parser, analysis procedure, HDF5, MKL/TBB에 의존하지 않는 solver-core 함수다. element-local `24 x 1` force와 `24 x 24` external tangent candidate를 반환한다.
|
||||
- 새 surface-pressure assembler는 immutable Domain identity, `DofManager`, trial generalized coordinates와 `ParallelFor`를 받아 element-local candidate를 stable source order로 reduction한다. worker는 global vector/CSR을 직접 갱신하지 않는다.
|
||||
- 선형 procedure는 reference-configuration pressure를 기존 CLOAD와 합쳐 full-space external load에 한 번만 반영하고, nonlinear procedure는 current-configuration follower force와 generally nonsymmetric external tangent를 같은 trial에서 평가한다.
|
||||
- `Hdf5ResultsWriter` schema `0`과 `NonlinearHdf5ResultsWriter` schema `1`은 변경하지 않는다. 새 pressure dataset, schema/version/CLI option을 추가하지 않는다.
|
||||
- reference utility는 FESA가 생성한 schema-1 factor-one HDF5와 exact stored displacement CSV만 비교한다. Abaqus를 실행하지 않으며 stored input/CSV를 수정하지 않는다.
|
||||
|
||||
### Tech Stack
|
||||
|
||||
- C++17, MSVC x64 Debug, CMake, CTest, GoogleTest
|
||||
- Intel oneAPI MKL PARDISO: linear SPD path는 기존 `MklPardisoSolver`, nonlinear full-CSR unsymmetric path는 기존 `MklPardisoTangentSolver`와 `mtype=11`
|
||||
- Intel oneAPI TBB behind `ParallelFor`
|
||||
- HDF5 behind existing writers/self-check/atomic-finalization boundaries
|
||||
- Python Harness는 phase orchestration용이며 이 기능이 Harness/Python 코드를 변경하지 않으므로 Python test 추가는 없다.
|
||||
|
||||
### Binding Spec
|
||||
|
||||
- 입력·진단·internal model·HDF5·comparison mapping은 `io.md` §§2–10이 우선한다.
|
||||
- force/tangent, sign, configuration, integration, geometry validity와 deterministic assembly는 `formulation.md` §§6, 9–11, 13–14가 우선한다.
|
||||
- analytical, finite-difference, objectivity, equilibrium, reference acceptance threshold는 `numerical-review.md` §6과 `docs/TOLERANCE.md`가 우선한다.
|
||||
- exact reference paths와 dispositions는 `reference-model.md` §§3–8이 우선한다.
|
||||
- 다른 solver 내부 알고리즘과의 동등성을 주장하지 않는다. Abaqus 결과는 승인된 외부 수치 reference일 뿐이다.
|
||||
|
||||
## 3. Readiness Check
|
||||
|
||||
| input | upstream status / gate evidence | planning disposition |
|
||||
| --- | --- | --- |
|
||||
| `requirements.md` | 문서 자체는 `draft-for-coordinator-gate-review`; Coordinator가 Gate 1을 통과시켰고 normative must IDs `001`–`024`가 완결 | binding |
|
||||
| `research.md` | 문서 자체는 `draft-for-coordinator-gate-review`; Coordinator gate 통과 | binding evidence |
|
||||
| `formulation.md` | `ready-for-numerical-review` | binding math handoff |
|
||||
| `numerical-review.md` | `pass-for-io-definition` | binding numerical/reference readiness |
|
||||
| `reference-model.md` | `pass-for-io-definition` | binding artifact contract |
|
||||
| `io.md` | `ready-for-implementation-planning` | binding parser/model/HDF5/comparator contract |
|
||||
| `coordination.md` | Gate 5 `passed`; document `ready-for-implementation-planning` | planning authorized |
|
||||
|
||||
필수 comparison artifacts는 존재하며 경로·hash·cardinality가 upstream에서 고정되었다. 필수 파일은 `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure.inp`와 `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure displacements.csv` 두 개다. reaction CSV는 존재 여부와 값이 verdict를 바꾸지 않는 review-only inventory이고 stress CSV는 비교 대상에서 제외된다.
|
||||
|
||||
`C:\git\FESADev\.harness\config.json`은 현재 없고 `.harness/config.example.json`만 존재한다. 따라서 Harness Stop의 repository default는 `.harness/build`, CMake/MSVC/CTest다. 현재 `.harness/build/CMakeCache.txt`는 `Visual Studio 18 2026`, `x64`, GoogleTest `C:/git/googletest`, MKL `2026.1`, TBB `2023.1`, HDF5 `2.1.1`로 구성되어 있다. 계획 작성 중 configure/build/test는 실행하지 않았다.
|
||||
|
||||
결론: 구현 계획은 진행 가능하다. blocker는 없으며 유일한 현재 사용자 결정은 아래 7-Step 초안의 승인 또는 수정 요청이다.
|
||||
|
||||
## 4. Implementation Scope
|
||||
|
||||
### Included
|
||||
|
||||
- assembly-level element surface의 direct `instance.element-label` 및 explicit-instance assembly ELSET facet resolution. 하나의 surface가 여러 data line에서 서로 다른 explicit instance의 direct/ELSET member를 함께 포함할 수 있다.
|
||||
- S4/S4R, SPOS/SNEG, one static step의 additive uniform `DSLOAD P`
|
||||
- case/ASCII whitespace/numeric/cardinality/keyword continuation/source provenance contract
|
||||
- exact duplicate normalization warning과 conflicting side를 포함한 deterministic fail-closed diagnostics
|
||||
- bilinear `2 x 2` pressure force와 exact follower external tangent
|
||||
- linear reference configuration, nonlinear current configuration, exact-once load-factor scaling
|
||||
- full-space force/tangent assembly, reaction/free residual/global resultant/moment, deterministic serial/parallel reduction
|
||||
- 기존 schema 0/1 HDF5 및 CLI/atomic finalization 회귀
|
||||
- exact pressure reference input/CSV에 대한 schema-1 factor-one HDF5 comparison과 common tolerance report
|
||||
|
||||
### Excluded
|
||||
|
||||
- `*DLOAD`, `TRVEC`, `PNU`, nonuniform/distribution pressure, nodal surface, part-level surface
|
||||
- implicit-instance ELSET, 하나의 ELSET 자체가 여러 instance를 섞는 mixed-instance set, part ELSET lookup fallback. 서로 다른 explicit instance에 결속된 여러 member/ELSET를 하나의 surface에 두는 것은 포함 범위다.
|
||||
- edges, other face labels, solids/beams, shells other than S4/S4R
|
||||
- multi-step, amplitude, transient, eigen, contact, material/geometric extensions unrelated to pressure
|
||||
- pressure-specific HDF5 dataset, schema bump, CLI option, result filter, CSV product output
|
||||
- Abaqus execution, Abaqus CSV creation/repair/rename, reference input/CSV mutation
|
||||
- reaction or stress external acceptance expansion
|
||||
|
||||
### Non-goals
|
||||
|
||||
- Abaqus internal formulation, integration, stabilization, state or result-generation equivalence
|
||||
- speculative load hierarchy refactor, generalized distributed-load framework, new vendor abstraction
|
||||
- unrelated parser cleanup, element refactor, tolerance policy change, documentation portfolio expansion
|
||||
|
||||
## 5. Candidate Interface and Data Contracts
|
||||
|
||||
아래 이름과 파일은 implementation handoff를 위한 candidate다. public compatibility와 upstream 의미를 고정하지만 최종 API/저장 배치는 Implementation Agent가 기존 style과 compile evidence에 맞춰 최소 범위에서 확정한다.
|
||||
|
||||
### Semantic model candidate
|
||||
|
||||
`include/fesa/model/model_types.h`에 다음 의미를 갖는 value types를 추가한다.
|
||||
|
||||
```cpp
|
||||
enum class ShellSurfaceSide { kSpos, kSneg };
|
||||
enum class SurfaceMemberKind { kDirect, kElset };
|
||||
|
||||
struct ElementSurfaceFacetDefinition {
|
||||
EntityIndex element_index;
|
||||
std::size_t facet_ordinal;
|
||||
std::string part_name_raw;
|
||||
std::string part_name_canonical;
|
||||
std::string instance_name_raw;
|
||||
std::string instance_name_canonical;
|
||||
std::int64_t source_element_label;
|
||||
std::string source_element_label_raw;
|
||||
std::string source_element_type;
|
||||
ShellSurfaceSide side;
|
||||
SourceLocation first_member_location;
|
||||
std::size_t first_member_ordinal;
|
||||
SurfaceMemberKind member_kind;
|
||||
std::string elset_name_raw;
|
||||
std::string elset_name_canonical;
|
||||
};
|
||||
|
||||
struct ElementSurfaceDefinition {
|
||||
std::string surface_name_raw;
|
||||
std::string surface_name_canonical;
|
||||
std::vector<ElementSurfaceFacetDefinition> facets;
|
||||
SourceLocation declaration_location;
|
||||
std::size_t declaration_ordinal;
|
||||
};
|
||||
|
||||
struct SurfacePressureLoadDefinition {
|
||||
std::string step_name_raw;
|
||||
std::string step_name_canonical;
|
||||
EntityIndex surface_index;
|
||||
std::string surface_name_raw;
|
||||
std::string surface_name_canonical;
|
||||
std::string load_type;
|
||||
double magnitude;
|
||||
std::string magnitude_raw;
|
||||
SourceLocation keyword_location;
|
||||
SourceLocation data_location;
|
||||
std::size_t data_ordinal;
|
||||
std::size_t load_ordinal;
|
||||
};
|
||||
```
|
||||
|
||||
`ModelDefinition`은 `std::vector<ElementSurfaceDefinition> element_surfaces`를 소유하고 `StaticStepDefinition`은 `std::vector<SurfacePressureLoadDefinition> surface_pressure_loads`를 소유한다. `ElementSurfaceDefinition`의 scope 의미는 exact `assembly`다. Committed facet은 internal lookup/scatter용 `element_index`와 별도로 part/instance raw+canonical identity, source element numeric label+raw token, exact canonical `S4|S4R` source type, side, `facet_ordinal`, 최초 contributing surface member의 file/line/member ordinal, `direct|elset` kind와 ELSET raw+canonical provenance를 계속 소유한다. 따라서 stable source identity가 internal element/equation index로 대체되지 않는다.
|
||||
|
||||
Committed `SurfacePressureLoadDefinition`은 surface lookup용 `surface_index`만 남기는 record가 아니다. sole step과 referenced surface의 raw+canonical identity, exact canonical `load_type="P"`, unscaled signed finite `magnitude`와 `magnitude_raw`, keyword/data `SourceLocation`, DSLOAD block 안의 `data_ordinal`, 전체 step load data에서의 `load_ordinal`을 보존한다. 동일해 보이는 pressure rows도 distinct records이며 `(load_ordinal, facet_ordinal)` Cartesian product가 active contribution identity다.
|
||||
|
||||
`Domain`/`StepDefinition`/`AnalysisModel` candidate query는 다음 의미를 갖는다.
|
||||
|
||||
```cpp
|
||||
const std::vector<ElementSurfaceDefinition>& Domain::ElementSurfaces() const noexcept;
|
||||
const std::vector<SurfacePressureLoadDefinition>&
|
||||
StepDefinition::SurfacePressureLoads() const noexcept;
|
||||
bool StepDefinition::UsesNonlinearGeometry() const noexcept;
|
||||
const std::vector<SurfacePressureLoadDefinition>&
|
||||
AnalysisModel::ActiveSurfacePressureLoads() const noexcept;
|
||||
```
|
||||
|
||||
모든 반환값은 non-owning immutable reference다. `AnalysisModel`은 surface/facet/load를 복사하지 않고 backing `Domain`이 더 오래 살아야 한다. pressure records는 기존 nodal `Load::ComputeContributions`에 억지로 넣지 않는다. 그 interface는 configuration-independent nodal contributions 전용이고 follower tangent를 표현하지 못하기 때문이다.
|
||||
|
||||
### Local evaluator candidate
|
||||
|
||||
새 `include/fesa/loads/shell_surface_pressure.h`와 `src/fesa/loads/shell_surface_pressure.cpp`는 다음 backend-neutral contract를 제공한다.
|
||||
|
||||
```cpp
|
||||
enum class SurfacePressureConfiguration { kReference, kCurrent };
|
||||
|
||||
struct ShellSurfacePressureInput {
|
||||
std::array<Vector3, 4> reference_coordinates;
|
||||
std::array<Vector3, 4> translational_displacements;
|
||||
ShellSurfaceSide side;
|
||||
double pressure_magnitude;
|
||||
double load_factor;
|
||||
SurfacePressureConfiguration configuration;
|
||||
SourceLocation location;
|
||||
std::string entity_identity;
|
||||
};
|
||||
|
||||
struct ShellSurfacePressureContribution {
|
||||
std::array<double, 24> force;
|
||||
std::array<double, 24 * 24> external_tangent;
|
||||
};
|
||||
|
||||
Result<ShellSurfacePressureContribution> EvaluateShellSurfacePressure(
|
||||
const ShellSurfacePressureInput& input);
|
||||
```
|
||||
|
||||
함수는 fixed node/source order의 row-major tangent를 반환한다. force의 rotational entries와 tangent의 rotational rows/columns는 exact zero다. reference configuration은 `u`를 사용하지 않고 tangent가 exact zero이며, current configuration은 승인된 exact derivative를 반환한다. geometric validation은 pressure 또는 factor가 zero여도 생략하지 않는다.
|
||||
|
||||
### Full-space assembler candidate
|
||||
|
||||
새 `include/fesa/assembly/surface_pressure_assembler.h`와 `src/fesa/assembly/surface_pressure_assembler.cpp`는 다음 contract를 제공한다.
|
||||
|
||||
```cpp
|
||||
struct SurfacePressureAssemblyCandidate {
|
||||
Vector full_external_force;
|
||||
SparseMatrix full_external_tangent;
|
||||
std::vector<Diagnostic> diagnostics;
|
||||
};
|
||||
|
||||
Result<SurfacePressureAssemblyCandidate> AssembleSurfacePressure(
|
||||
const AnalysisModel& model,
|
||||
const DofManager& dofs,
|
||||
const Vector& full_generalized_coordinates,
|
||||
double load_factor,
|
||||
SurfacePressureConfiguration configuration,
|
||||
const ParallelFor& parallel_for);
|
||||
```
|
||||
|
||||
입력 vector는 stable full-DOF `[u1,u2,u3,phi1,phi2,phi3]` order다. assembler는 pressure record source order, 각 surface의 canonical facet order, fixed Gauss order로 local candidates를 만든 뒤 동일 순서로 serial reduction한다. 실패 시 output candidate를 반환하지 않으며 caller-owned `AnalysisState`/`NonlinearTrialState`는 갱신하지 않는다.
|
||||
|
||||
### Procedure composition candidate
|
||||
|
||||
- Linear: `LoadAssembler::AssembleFullNodalLoad(...)` 결과와 `AssembleSurfacePressure(..., 1.0, kReference, ...)`의 full force를 checked finite addition하여 `AnalysisState::ExternalForce()`에 한 번만 assign한다. existing stiffness factorization-before-load order와 `EffectiveFreeRhs(F, Kfc, dc, dofs)`를 보존한다.
|
||||
- Nonlinear: 같은 trial에서 `AssembleInternal(...)`, existing `AssembleGlobalFixedLoadContribution(...)`, `AssembleSurfacePressure(..., increment.load_factor, kCurrent, ...)`를 평가한다. `f_ext=f_fixed+f_pressure`, `K_ext=K_fixed+K_pressure`, `r=f_int-f_ext`, `K=K_int-K_ext` 순서로 candidate를 완성한 뒤 factorization/solve/validation/commit한다. `MklPardisoTangentSolver`의 existing full-CSR unsymmetric path를 유지하며 tangent를 symmetrize하지 않는다.
|
||||
|
||||
## 6. Candidate Files and Ownership
|
||||
|
||||
### Existing files to modify
|
||||
|
||||
| path | responsibility |
|
||||
| --- | --- |
|
||||
| `include/fesa/io/abaqus/input_syntax.h` | continued keyword/source-line representation에 필요한 최소 lexical provenance |
|
||||
| `src/fesa/io/abaqus/input_reader.cpp` | ASCII, 256-byte logical keyword, keyword-only continuation, comma/whitespace contract |
|
||||
| `src/fesa/io/abaqus/domain_mapping_context.h` | raw surface/facet/DSLOAD records와 provenance |
|
||||
| `src/fesa/io/abaqus/domain_mapping_context.cpp` | assembly `SURFACE`, assembly `ELSET INTERNAL`, step `DSLOAD` parsing 및 scope/cardinality diagnostics |
|
||||
| `src/fesa/io/abaqus/domain_mapper.cpp` | surface resolution stage를 topology finalize와 step definition 사이에 호출 |
|
||||
| `src/fesa/io/abaqus/step_definition_mapper.cpp` | DSLOAD target를 resolved surface index에 bind하고 procedure rules 검증 |
|
||||
| `src/fesa/io/abaqus/domain_builder.cpp` | 완전 검증된 surface/load candidate를 ModelDefinition에 commit |
|
||||
| `include/fesa/model/model_types.h` | immutable surface/facet와 Step pressure value definitions |
|
||||
| `include/fesa/model/domain.h`, `src/fesa/model/domain.cpp` | Domain/Step ownership과 immutable views |
|
||||
| `include/fesa/analysis/analysis_model.h`, `src/fesa/analysis/analysis_model.cpp` | active pressure non-owning view |
|
||||
| `src/fesa/analysis/linear_static_procedure.cpp` | reference pressure full-space external force composition |
|
||||
| `include/fesa/analysis/nonlinear_static_control.h`, `src/fesa/analysis/nonlinear_static_control.cpp` | pressure-independent fixed-load contract를 유지하면서 checked external contribution composition helper가 필요할 때만 최소 확장 |
|
||||
| `src/fesa/analysis/nonlinear_static_procedure.cpp` | current follower force/tangent, residual/tangent sign, rollback/commit integration |
|
||||
| `src/fesa/CMakeLists.txt` | 새 production `.cpp` 두 쌍 등록 |
|
||||
| `tests/CMakeLists.txt` | 새 unit/integration/reference test sources를 기존 targets에 등록; raw `add_test` 추가 없음 |
|
||||
| `tests/unit/io/abaqus/input_reader_test.cpp` | ASCII/continuation/length/comma lexical tests |
|
||||
| `tests/unit/io/abaqus/domain_mapper_test.cpp` | 기존 `DLOAD` rejection 및 no-pressure regression 유지/구체화 |
|
||||
| `tests/unit/io/abaqus/domain_mapping_components_test.cpp` | mapper stage atomicity와 surface resolution component tests |
|
||||
| `tests/unit/io/hdf5/hdf5_results_writer_test.cpp` | schema 0 inventory/no-pressure-dataset/atomic final regression |
|
||||
| `tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp` | schema 1 force/residual/reaction/equilibrium projection/no-new-dataset regression |
|
||||
| `tests/reference/nonlinear_static_reference_comparison.h`, `tests/reference/nonlinear_static_reference_comparison.cpp` | pressure case contract, optional review artifacts, factor-one projection/prechecks/report |
|
||||
|
||||
### New files to create during implementation
|
||||
|
||||
| path | responsibility / first owning Step |
|
||||
| --- | --- |
|
||||
| `src/fesa/io/abaqus/surface_definition_mapper.h` | raw-to-resolved assembly surface mapper internal interface / Step 1 |
|
||||
| `src/fesa/io/abaqus/surface_definition_mapper.cpp` | direct/ELSET resolution, canonical sort/duplicate policy / Step 1 |
|
||||
| `tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp` | feature-focused valid and fail-closed semantic mapping / Step 1 |
|
||||
| `include/fesa/loads/shell_surface_pressure.h` | local evaluator input/result contract / Step 3 |
|
||||
| `src/fesa/loads/shell_surface_pressure.cpp` | bilinear integration, geometry checks, force/external tangent / Step 3 |
|
||||
| `tests/unit/loads/shell_surface_pressure_test.cpp` | analytical, objectivity, FD, geometry evaluator tests / Step 3 |
|
||||
| `include/fesa/assembly/surface_pressure_assembler.h` | full-space deterministic assembly candidate / Step 4 |
|
||||
| `src/fesa/assembly/surface_pressure_assembler.cpp` | local scatter and stable reduction / Step 4 |
|
||||
| `tests/unit/assembly/surface_pressure_assembler_test.cpp` | source/facet/load order, additive/exact-once, serial/parallel tests / Step 4 |
|
||||
| `tests/integration/analysis/shell_surface_pressure_linear_test.cpp` | linear procedure/reaction/residual/resultant/HDF5 schema 0 / Step 4 |
|
||||
| `tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp` | follower Newton/tangent/rollback/balance/HDF5 schema 1 / Step 5 |
|
||||
| `tests/integration/app/shell_surface_pressure_application_test.cpp` | CLI exact input syntax, existing output naming/schema/atomic/no-pressure regression / Step 4 then Step 5 additions |
|
||||
| `tests/reference/shell_surface_pressure_reference_test.cpp` | exact artifact and end-to-end comparison gate / Step 6 |
|
||||
| `docs/shell-surface-pressure-load/implementation-report.md` | implementation/task/test/change summary, future Step 7 |
|
||||
| `docs/shell-surface-pressure-load/build-test.md` | command/exit/duration/tail/warning/runtime evidence, future Step 7 |
|
||||
| `docs/shell-surface-pressure-load/reference-comparison.md` | artifact snapshots, comparison metrics/classification, future Step 7 |
|
||||
|
||||
`src/fesa/app/fesa_application.cpp`, HDF5 production writers, PARDISO adapters와 existing tolerance policy는 read-first verification targets이며 원칙적으로 수정하지 않는다. 새 tests가 승인된 contract 결함을 실제로 증명할 때만 해당 Step의 bounded scope 안에서 최소 수정하고 report에 이유를 남긴다.
|
||||
|
||||
## 7. Work Breakdown and Harness Step Draft
|
||||
|
||||
모든 Step은 이전 Step이 green인 상태에서 시작하고 단일 reviewer-rejectable responsibility를 완결한다. 각 Step은 `RED -> observed expected failure -> minimal GREEN -> focused VERIFY -> full/Stop VERIFY`를 같은 세션 안에서 끝낸다. 아래 phase 파일들은 제안일 뿐 아직 materialize하지 않는다.
|
||||
|
||||
### Step 1 — `map-pressure-input-contract`
|
||||
|
||||
**Bounded responsibility:** valid assembly `SURFACE`와 step `DSLOAD P`를 immutable Domain/Step/AnalysisModel contract로 map한다.
|
||||
|
||||
**Dependencies:** 없음.
|
||||
|
||||
**Prerequisites/read first:** `input_syntax.h`, `input_reader.cpp`, `domain_mapping_context.h/.cpp`, `topology_mapper.h/.cpp`, `step_definition_mapper.h/.cpp`, `domain_builder.h/.cpp`, `domain_mapper.cpp`, `model_types.h`, `domain.h/.cpp`, `analysis_model.h/.cpp`, upstream `requirements.md` §§6–8, `io.md` §§2–6, `formulation.md` §3.
|
||||
|
||||
**Exact files:** 위 Candidate Files의 parser/model existing files, 새 `surface_definition_mapper.h/.cpp`, 새 `shell_surface_pressure_domain_test.cpp`, `tests/CMakeLists.txt`, `src/fesa/CMakeLists.txt`.
|
||||
|
||||
**RED:** 먼저 다음 named tests를 작성한다.
|
||||
|
||||
- `InpSyntax.AcceptsAsciiKeywordContinuationAndPreservesPhysicalSourceLines`
|
||||
- `ShellSurfacePressureInput.MapsDirectInstanceFacetsForS4AndS4rCaseInsensitively`
|
||||
- `ShellSurfacePressureInput.MapsExplicitInstanceElsetAndResultNeutralInternalParameter`
|
||||
- `ShellSurfacePressureInput.MapsMixedDirectAndElsetMembersAcrossTwoExplicitInstancesWithStableDataMemberAndElsetOrder`
|
||||
- `ShellSurfacePressureInput.PreservesSposSnegMagnitudeTextLocationsAndSourceOrder`
|
||||
- `ShellSurfacePressureDomain.OwnsCanonicalFacetsAndStepOwnedAdditivePressureRecords`
|
||||
- `ShellSurfacePressureDomain.AnalysisModelBorrowsActivePressureWithoutCopyingDomain`
|
||||
- `ShellSurfacePressureInput.AcceptsWhitespaceSignedZeroAndFiniteScientificNotation`
|
||||
|
||||
`MapsMixedDirectAndElsetMembersAcrossTwoExplicitInstancesWithStableDataMemberAndElsetOrder`의 RED fixture는 declaration order가 다른 `Instance-A`와 `Instance-B`, 서로 다른 casing으로 참조한 direct member와 각 instance에 explicit `INSTANCE=`로 결속된 flat assembly ELSET member를 하나의 surface data inventory에 교차 배치한다. Test는 case-insensitive resolution, raw data/member ordinal과 ELSET expansion provenance, canonical facet order, 두 instance에서 numeric label이 같아도 분리되는 part/instance/source label/source type/side identity, 각 unique facet의 first-member provenance를 exact 비교한다. Implicit-instance ELSET을 같은 test의 valid branch로 허용하지 않는다.
|
||||
|
||||
실행:
|
||||
|
||||
```powershell
|
||||
cmake --build .harness/build --config Debug --target fesa_unit_tests
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^(InpSyntax|ShellSurfacePressureInput|ShellSurfacePressureDomain)\."
|
||||
```
|
||||
|
||||
**Observed expected failure:** 새 mapper/header 또는 semantic accessors가 없어 compile이 실패하거나, 현재 `SURFACE`/`DSLOAD`가 unsupported input diagnostic으로 거부되어 assertions가 실패해야 한다. Multi-instance RED fixture는 한 surface의 두 explicit instance와 mixed direct/ELSET를 resolve하지 못하거나 committed identity/provenance fields가 없어 exact assertions가 실패해야 한다. unrelated failure면 Step을 중지하고 `regression`으로 분류한다.
|
||||
|
||||
**Minimal GREEN:** 위 candidate semantic signatures를 최소 구현한다. reader는 keyword-only `**,` comment-aware continuation만 결합하며 logical keyword 256 bytes, ASCII, comma/cardinality와 physical source line을 보존한다. surface mapper는 topology finalize 뒤 direct `<instance>.<positive-label>` 또는 assembly ELSET의 explicit `INSTANCE`를 case-insensitive하게 resolve한다. 하나의 surface 안에서 direct와 ELSET member를 섞고 서로 다른 두 개 이상의 explicit instance를 참조할 수 있으며, raw data/member order와 flat ELSET expansion provenance를 보존한 뒤 unique facets를 canonical stable order로 만든다. implicit-instance syntax, 하나의 mixed-instance ELSET, part-scope fallback은 허용하지 않는다. step mapper는 parameterless `DSLOAD`, exactly three fields, `P`, finite C-locale scalar를 surface index에 bind하면서 §5 candidate provenance 전부를 보존한다. DomainBuilder는 모든 validation 이후에만 moved ModelDefinition을 commit한다. legacy `StaticStepDefinition` constructors는 empty pressure vector로 delegating하여 existing callers를 깨지 않는다.
|
||||
|
||||
**Focused VERIFY:** 위 RED 명령이 exit `0`이고 모든 named tests가 pass한다. 이어 parser/domain existing suites를 실행한다.
|
||||
|
||||
```powershell
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^(InpDomainMapping|DomainMappingComponents|InpSyntax)\."
|
||||
```
|
||||
|
||||
**Full/Stop VERIFY:** 공통 `V-BUILD`, `V-SHOW`, `V-FULL` 명령을 실행한다.
|
||||
|
||||
**Invariants:** 한 surface 안의 mixed direct/ELSET 및 여러 explicit instance는 지원한다. raw surface data/member ordinal과 각 flat ELSET expansion provenance를 stable하게 보존하되 committed unique facet sort는 `(instance declaration ordinal, numeric element label, SPOS before SNEG)`다. S4/S4R part/instance/source label/type/side와 최초 member provenance를 internal index와 함께 보존한다. DSLOAD rows는 raw+canonical step/surface identity, canonical `P`, signed magnitude/raw token, keyword/data location, data/load ordinal을 가진 distinct/additive records다. lookup은 case-insensitive이고 raw spelling은 보존하며 Domain lifetime > AnalysisModel이다.
|
||||
|
||||
**Failure/atomicity:** parse/map failure는 Domain을 반환하지 않으며 partial surface/load가 visible하지 않다. diagnostics는 backend-independent SourceLocation을 가진다.
|
||||
|
||||
**Forbidden scope:** physics evaluator/assembly, `DLOAD`, general surface framework, HDF5/schema, reference artifacts.
|
||||
|
||||
**Trace:** requirements `001`–`004`, `010`, `013`; `IO §§2–6`; `FORM §3`; numerical-review input readiness.
|
||||
|
||||
**Evidence/report:** exact commands, exit codes, expected RED diagnostic/compile reason, mapped facet/load dumps from tests, modified/new paths, warning count. Handoff은 immutable semantic queries와 stable ordering contract다.
|
||||
|
||||
### Step 2 — `reject-invalid-pressure-input`
|
||||
|
||||
**Bounded responsibility:** pressure input/mapping negative semantics와 deterministic diagnostics를 fail-closed/atomic하게 완결한다.
|
||||
|
||||
**Dependencies:** Step 1 green semantic output.
|
||||
|
||||
**Prerequisites/read first:** Step 1 changed files/tests, `core/ascii.h`, `core/diagnostic.h`, `source_target_resolver.h/.cpp`, `io.md` §§2.5–3.4, 5.2, 9, `requirements.md` `014`–`017` acceptance, `formulation.md` §11.
|
||||
|
||||
**Exact files:** `input_reader.cpp`, `domain_mapping_context.h/.cpp`, `surface_definition_mapper.h/.cpp`, `step_definition_mapper.cpp`, `domain_builder.cpp`, `shell_surface_pressure_domain_test.cpp`, existing `domain_mapper_test.cpp` and `domain_mapping_components_test.cpp`. 새 production type은 만들지 않는다.
|
||||
|
||||
**RED named tests:**
|
||||
|
||||
- `ShellSurfacePressureInput.RejectsNonAsciiOverlengthOrIllegalContinuationAtStableLocation`
|
||||
- `ShellSurfacePressureInput.RejectsUnsupportedSurfaceParametersTypesSidesAndTargetKinds`
|
||||
- `ShellSurfacePressureInput.RejectsDsloadParametersLabelsDistributionsAndCardinality`
|
||||
- `ShellSurfacePressureInput.RejectsEmptyMissingAmbiguousAndCrossScopeSurfaceTargets`
|
||||
- `ShellSurfacePressureInput.RejectsImplicitInstanceNestedCyclicAndMalformedElsets`
|
||||
- `ShellSurfacePressureInput.NormalizesExactSameSideDuplicatesWithOneStableWarning`
|
||||
- `ShellSurfacePressureInput.RejectsConflictingSidesForOneElement`
|
||||
- `ShellSurfacePressureInput.RejectsNonfiniteDExponentAndLocaleDependentMagnitudes`
|
||||
- `ShellSurfacePressureInput.PreservesAdditiveRepeatedPressureRowsWithoutDeduplication`
|
||||
- `ShellSurfacePressureDomain.MappingFailureCommitsNoPartialSemanticCandidate`
|
||||
- `ShellSurfacePressureInput.EmitsDiagnosticsInStableSourceOrderAcrossRepeatedRuns`
|
||||
|
||||
RED/focused command:
|
||||
|
||||
```powershell
|
||||
cmake --build .harness/build --config Debug --target fesa_unit_tests
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^(ShellSurfacePressureInput|ShellSurfacePressureDomain)\."
|
||||
```
|
||||
|
||||
**Observed expected failure:** Step 1의 happy-path mapper가 unsupported fields를 허용하거나 첫 발견/container order로 진단을 내고, duplicate/conflicting normalization을 구분하지 못해 assertions가 실패해야 한다.
|
||||
|
||||
**Minimal GREEN:** allowed parameter/label/cardinality tables를 exact하게 적용한다. recursive/nested/cyclic ELSET expansion을 금지하고 part/implicit scope fallback을 하지 않는다. exact same-side duplicate는 한 facet으로 normalize하고 한 warning을 stable location/order로 emit하며 conflicting side는 error다. 모든 오류를 candidate validation 단계에서 모으고 `SortDiagnostics` contract로 정렬한 뒤 Domain commit 전에 반환한다. silent skip, guess, average, partial commit은 금지한다.
|
||||
|
||||
**Focused VERIFY:** named negative tests와 모든 `InpDomainMapping` tests exit `0`; golden diagnostic fields `(severity,code,file,line,keyword,entity_identity,message)`와 repeated-run order가 exact하다.
|
||||
|
||||
**Full/Stop VERIFY:** `V-BUILD`, `V-SHOW`, `V-FULL`.
|
||||
|
||||
**Invariants:** exact duplicate warning과 incompatible duplicate error 분리; missing/extra/ambiguous/cyclic/cross-scope/nonfinite 모두 tolerance 이전 차단; legacy input without pressure unchanged.
|
||||
|
||||
**Failure/atomicity:** failed candidate는 Domain/AnalysisState/HDF5로 이동하지 않는다. 실패한 input으로 기존 final output을 건드리지 않는 CLI proof는 Step 4/5에서 추가한다.
|
||||
|
||||
**Forbidden scope:** evaluator, tolerance 완화, artifact rewrite, parser-wide refactor.
|
||||
|
||||
**Trace:** requirements `002`–`004`, `013`–`017`; `IO §§2–6,9`; `FORM §11`; `NR §6` invalid-input rows.
|
||||
|
||||
**Evidence/report:** 각 test의 expected code/location/entity, warning normalization count, repeated diagnostic sequence, RED/GREEN exits. Handoff은 fail-closed semantic model이다.
|
||||
|
||||
### Step 3 — `evaluate-shell-pressure-kernel`
|
||||
|
||||
**Bounded responsibility:** one four-node shell facet의 reference/current pressure force와 exact external tangent를 승인된 geometry policy로 계산한다.
|
||||
|
||||
**Dependencies:** Step 1–2 semantic side/magnitude/source identity.
|
||||
|
||||
**Prerequisites/read first:** `mitc4_shell.h/.cpp`, `nonlinear_mitc4_shell.h/.cpp`, `shell_geometry.h/.cpp`, `vector3.h`, `matrix.h`, existing MITC4 unit/tangent tests, `formulation.md` §§6, 9–10, 13–14, `numerical-review.md` §§3–6.
|
||||
|
||||
**Exact files:** 새 `shell_surface_pressure.h/.cpp`, 새 `shell_surface_pressure_test.cpp`, `src/fesa/CMakeLists.txt`, `tests/CMakeLists.txt`.
|
||||
|
||||
**RED named tests:**
|
||||
|
||||
- `ShellSurfacePressureKernel.PartitionsUnityAndIntegratesPlanarResultantAndMoment`
|
||||
- `ShellSurfacePressureKernel.ReversesExactlyForSposSnegAndNegativeMagnitude`
|
||||
- `ShellSurfacePressureKernel.UsesReferenceGeometryWithExactZeroLinearTangent`
|
||||
- `ShellSurfacePressureKernel.UsesCurrentAreaAndNormalForFollowerForce`
|
||||
- `ShellSurfacePressureKernel.HasExactZeroRotationalForceRowsAndTangentBlocks`
|
||||
- `ShellSurfacePressureKernel.IsTranslationAndRigidRotationObjective`
|
||||
- `ShellSurfacePressureKernel.IsCovariantUnderCyclicNodeRelabeling`
|
||||
- `ShellSurfacePressureKernel.MatchesCenteredFiniteDifferenceForForceAndResidualSigns`
|
||||
- `ShellSurfacePressureKernel.PreservesGenerallyNonsymmetricFollowerTangent`
|
||||
- `ShellSurfacePressureKernel.RejectsNonfiniteCollapsedFoldedAndInvertedGeometryAtEveryRequiredPoint`
|
||||
- `ShellSurfacePressureKernel.ValidatesGeometryEvenForZeroPressureOrFactor`
|
||||
|
||||
RED/focused command:
|
||||
|
||||
```powershell
|
||||
cmake --build .harness/build --config Debug --target fesa_unit_tests
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^ShellSurfacePressureKernel\."
|
||||
```
|
||||
|
||||
**Observed expected failure:** new evaluator declaration/definition이 없어 compile/link fail해야 한다. 기존 MITC4 internal-force code를 pressure처럼 재사용하여 GREEN으로 만들지 않는다.
|
||||
|
||||
**Minimal GREEN:** fixed Gauss order `(-1/sqrt(3),-1/sqrt(3))`, `(+,−)`, `(+,+)`, `(−,+)`의 common `2 x 2` rule, bilinear `N_i`, `s=+1/-1`, `f_i=-lambda*p*s*sum(w*N_i*a)`와 approved exact derivative를 직접 구현한다. current coordinates는 `X+u` translation만 사용한다. `tau_J=1e-12`와 mean/corner/Gauss chord-scaled checks, finite/fold/inversion rules를 그대로 적용한다. `max(1,...)`, absolute floor, clamp, connectivity reorder, normal flip, tangent symmetrization은 금지한다.
|
||||
|
||||
**Focused VERIFY acceptance:** shape sum error `<=1e-14`; normalized resultant/moment/sign/objectivity/covariance `<=1e-12`; centered FD `h=1e-5`, normalized tangent error `<=1e-8`; zero rotational blocks exact zero; antisymmetric tangent evidence nonzero; invalid cases exact failure.
|
||||
|
||||
**Full/Stop VERIFY:** focused test 뒤 existing `Mitc4Shell`, `NonlinearMitc4Shell`, `NonlinearMitc4ShellTangent` suites와 `V-BUILD`, `V-SHOW`, `V-FULL`.
|
||||
|
||||
**Invariants:** force/tangent same geometry/Gauss evaluation; sign consistency for both `f_ext` and residual derivative; no state mutation; deterministic fixed loops.
|
||||
|
||||
**Failure/atomicity:** function returns no contribution on any nonfinite/geometry failure; caller arrays/state remain unchanged.
|
||||
|
||||
**Forbidden scope:** element internal stiffness/constitutive changes, pressure stress recovery, integration configurability, vendor dependency.
|
||||
|
||||
**Trace:** requirements `005`–`009`, `016`, `020`–`021`; `FORM §§6,9–10,13–14`; `NR §6` kernel/objectivity/tangent/geometry rows.
|
||||
|
||||
**Evidence/report:** normalized metrics, FD numerator/denominator/h, antisymmetric entries, exact-zero checks, diagnostic identity/location and command exits. Handoff은 pure local evaluator contract다.
|
||||
|
||||
### Step 4 — `integrate-linear-shell-pressure`
|
||||
|
||||
**Bounded responsibility:** reference-configuration pressure를 deterministic full-space linear load path, reaction/free residual/global balance와 existing schema-0 CLI output에 연결한다.
|
||||
|
||||
**Dependencies:** Step 1–3 green.
|
||||
|
||||
**Prerequisites/read first:** Step 3 evaluator, `load_assembler.h/.cpp`, `sparse_assembler.h/.cpp`, `parallel_for.h/.cpp`, `dof_manager.h/.cpp`, `linear_static_procedure.cpp`, `analysis_state.h/.cpp`, `result_recovery.h/.cpp`, `global_equilibrium_recovery.h/.cpp`, HDF5 schema-0 writer/self-check/tests, `fesa_application.cpp`, `io.md` §§7.1, 7.3, 10, `formulation.md` §§9,11–13.
|
||||
|
||||
**Exact files:** 새 `surface_pressure_assembler.h/.cpp`, unit assembler test, new linear integration/app tests, `linear_static_procedure.cpp`, `src/fesa/CMakeLists.txt`, `tests/CMakeLists.txt`, schema-0 writer test only for contract assertions. HDF5 production writer는 expected no-change.
|
||||
|
||||
**RED named tests:**
|
||||
|
||||
- `SurfacePressureAssembly.AssemblesFullDofsInPressureFacetAndRecordOrder`
|
||||
- `SurfacePressureAssembly.AddsRepeatedRecordsAndAppliesUnitFactorExactlyOnce`
|
||||
- `SurfacePressureAssembly.IsBitwiseStableForSerialAndParallelLocalEvaluation`
|
||||
- `LinearShellSurfacePressure.UsesReferenceNormalAndAreaAfterPrescribedDisplacement`
|
||||
- `LinearShellSurfacePressure.AssemblesBeforeProjectionAndIncludesConstrainedReaction`
|
||||
- `LinearShellSurfacePressure.SatisfiesFreeResidualGlobalResultantAndMoment`
|
||||
- `LinearShellSurfacePressure.PreservesS4S4rMeshAndCyclicOrderInvariance`
|
||||
- `LinearShellSurfacePressure.WritesSchemaZeroWithoutPressureDataset`
|
||||
- `ShellSurfacePressureApplication.LinearFailurePreservesExistingFinalAndNoCandidate`
|
||||
- `ShellSurfacePressureApplication.InputWithoutPressureRetainsExistingLinearBehavior`
|
||||
|
||||
RED/focused commands:
|
||||
|
||||
```powershell
|
||||
cmake --build .harness/build --config Debug --target fesa_unit_tests fesa_integration_tests
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^(SurfacePressureAssembly|LinearShellSurfacePressure|ShellSurfacePressureApplication)\."
|
||||
```
|
||||
|
||||
**Observed expected failure:** assembler header/definition이 없거나 linear procedure가 nodal CLOAD만 assembly하여 pressure resultant/reaction가 zero이고 pressure CLI case가 acceptance를 충족하지 못해야 한다.
|
||||
|
||||
**Minimal GREEN:** local pressure candidates를 source/facet/Gauss stable order로 생성하고 worker-local buffers에서 full DOF/scatter COO를 만들며 fixed serial reduction한다. linear procedure는 stiffness partition/factorization 후 existing CLOAD와 reference pressure full force를 checked add하고, projection 전 `state.ExternalForce()`에 한 번만 commit한다. evaluator에는 load factor `1.0`을 정확히 한 번 전달한다. existing `Kff/Kfc`, 0x0 free system, `K*d-F` recovery와 output finalization order는 보존한다.
|
||||
|
||||
**Focused VERIFY acceptance:** analytical normalized force/moment/reaction/mesh/order errors `<=1e-12`; global force/moment balance `<=1e-8`; free residual uses approved existing scale gates; repeated serial/parallel output and diagnostics exact; schema version `0`, existing mandatory datasets만 존재하고 pressure-specific path는 없다; failed candidate가 prior final bytes를 보존한다.
|
||||
|
||||
**Full/Stop VERIFY:** existing `LoadAssembly`, `SparseAssembly`, `LinearStaticCli`, `Mitc4ShellCli`, `Hdf5ResultsWriter` suites와 `V-BUILD`, `V-SHOW`, `V-FULL`.
|
||||
|
||||
**Invariants:** factorization-before-load; full-space before free/constrained projection; linear tangent exact zero; pressure load factor exact once; worker global CSR write 금지; source/internal/equation IDs 분리.
|
||||
|
||||
**Failure/atomicity:** any local/nonfinite/assembly/recovery failure returns before state/result publication; HDF5 existing final preserved by current atomic writer.
|
||||
|
||||
**Forbidden scope:** nonlinear follower path, schema change, linear solver backend change, output dataset addition.
|
||||
|
||||
**Trace:** requirements `005`–`007`, `010`–`013`, `016`–`020`; `IO §§6–7,9–10`; `FORM §§9,11–14`; `NR §6` linear/resultant/balance rows.
|
||||
|
||||
**Evidence/report:** stable contribution order, external vector/reaction/residual/resultants, schema inventory, final-file snapshots, RED/GREEN exits. Handoff은 validated linear pressure path와 reusable full-space assembler다.
|
||||
|
||||
### Step 5 — `integrate-nonlinear-follower-pressure`
|
||||
|
||||
**Bounded responsibility:** current-configuration follower pressure force와 generally nonsymmetric external tangent를 nonlinear full-Newton trial/commit lifecycle 및 schema-1 output에 연결한다.
|
||||
|
||||
**Dependencies:** Step 1–4 green.
|
||||
|
||||
**Prerequisites/read first:** Step 3–4 evaluator/assembler, `nonlinear_static_control.h/.cpp`, `nonlinear_static_procedure.h/.cpp`, `nonlinear_analysis_state.h/.cpp`, `nonlinear_mitc4_shell.h/.cpp`, `tangent_solver.h`, `mkl_pardiso_tangent_solver.h/.cpp`, nonlinear HDF5 writer/self-check/tests, `prepared_analysis.h/.cpp`, `fesa_application.cpp`, `formulation.md` §§9.2–9.4, 11–13, `numerical-review.md` §6 nonlinear suite, `io.md` §§7.2, 7.4.
|
||||
|
||||
**Exact files:** `nonlinear_static_control.h/.cpp` only if checked contribution composition needs a helper, `nonlinear_static_procedure.cpp`, new nonlinear integration/app tests, nonlinear HDF5 writer test. Existing PARDISO/HDF5/app production files are no-change verification targets unless a test exposes a contract gap.
|
||||
|
||||
**RED named tests:**
|
||||
|
||||
- `NonlinearShellSurfacePressure.AssemblesFollowerForceFromCurrentTrialGeometry`
|
||||
- `NonlinearShellSurfacePressure.FormsResidualAndTangentWithApprovedExternalSigns`
|
||||
- `NonlinearShellSurfacePressure.AppliesIncrementFactorExactlyOnce`
|
||||
- `NonlinearShellSurfacePressure.UsesFullUnsymmetricTangentSolverPath`
|
||||
- `NonlinearShellSurfacePressure.ConvergesOpenPatchAndPreservesAntisymmetricEvidence`
|
||||
- `NonlinearShellSurfacePressure.SatisfiesAcceptedFreeResidualAndFactorOneGlobalBalance`
|
||||
- `NonlinearShellSurfacePressure.IsObjectiveUnderRigidMotionAndTracksCurrentArea`
|
||||
- `NonlinearShellSurfacePressure.ReducesSerialAndParallelContributionsDeterministically`
|
||||
- `NonlinearShellSurfacePressure.InvalidTrialRollsBackCommittedFrameAndFinalOutput`
|
||||
- `NonlinearShellSurfacePressure.WritesSchemaOneExternalInternalResidualReactionAndEquilibrium`
|
||||
- `ShellSurfacePressureApplication.InputWithoutPressureRetainsExistingNonlinearBehavior`
|
||||
|
||||
RED/focused commands:
|
||||
|
||||
```powershell
|
||||
cmake --build .harness/build --config Debug --target fesa_unit_tests fesa_integration_tests
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^(NonlinearShellSurfacePressure|ShellSurfacePressureApplication)\."
|
||||
```
|
||||
|
||||
**Observed expected failure:** nonlinear procedure가 existing fixed-global CLOAD만 `f_ext`에 포함하고 pressure force/tangent를 누락하여 follower/objectivity/sign/balance assertions 또는 pressure nonlinear case가 실패해야 한다.
|
||||
|
||||
**Minimal GREEN:** each Newton trial에서 current pressure candidate를 평가하고 fixed/pressure external contributions를 stable checked add한다. internal과 external은 같은 trial이다. `r=f_int-f_ext`, `K=K_int-K_ext`를 full space에서 만든 후 constrained/free extraction한다. existing `FactorizeFresh` full-CSR `mtype=11` path를 사용하고 external tangent를 symmetrize하지 않는다. convergence가 검증된 candidate만 `CommitAcceptedFrame`에 전달하며 invalid geometry/nonfinite/factorization/solve failure는 committed frame/final HDF5를 보존한다.
|
||||
|
||||
**Focused VERIFY acceptance:** local FD `<=1e-8`; objectivity/current-area normalized `<=1e-12`; factor-one global force/moment balance `<=1e-8`; force/moment free residual은 existing nonzero scale relative `<=1e-2`, zero scale absolute `<=1e-3`; exact zero-scale rules 유지; schema version `1`의 unique factor-one accepted frame에 existing generalized external/internal/residual/reaction/equilibrium datasets가 일치한다; serial/parallel report order exact.
|
||||
|
||||
**Full/Stop VERIFY:** existing `NonlinearStaticProcedure`, `NonlinearStaticControl`, `TangentSolver`, `NonlinearHdf5ResultsWriter`, nonlinear reference regression suites와 `V-BUILD`, `V-SHOW`, `V-FULL`.
|
||||
|
||||
**Invariants:** translations only affect pressure kinematics; rotation force/tangent blocks zero; load factor exact once; generally nonsymmetric tangent retained; candidate-before-commit; stable reduction.
|
||||
|
||||
**Failure/atomicity:** failure does not append an accepted frame, does not replace existing final HDF5 and records last completed Newton stage/pressure source identity deterministically.
|
||||
|
||||
**Forbidden scope:** line search/arc length/new procedure, convergence threshold change, PARDISO adapter redesign, new HDF5 fields.
|
||||
|
||||
**Trace:** requirements `008`–`013`, `016`–`019`, `021`; `IO §§6–7,9–10`; `FORM §§9–14`; `NR §6` follower/tangent/objectivity/open-patch/balance rows.
|
||||
|
||||
**Evidence/report:** trial factor, force/tangent signs, nonsymmetry entries, solver spy events, iteration counts, free residual/balance metrics, HDF5 datasets, rollback snapshots, exits/durations/tails.
|
||||
|
||||
### Step 6 — `compare-pressure-reference`
|
||||
|
||||
**Bounded responsibility:** exact stored pressure artifacts와 FESA schema-1 factor-one HDF5의 deterministic displacement comparison을 기존 common tolerance policy에 연결한다.
|
||||
|
||||
**Dependencies:** Step 1–5 green; exact reference files read-only.
|
||||
|
||||
**Prerequisites/read first:** `reference-model.md` 전체, `io.md` §8, `numerical-review.md` §§6.2–6.3, `docs/TOLERANCE.md`, `reference_tolerance_policy.h/.cpp`, nonlinear reference comparison header/source/cases, `tests/CMakeLists.txt`, exact input/CSV. Artifact bytes는 inspection만 하고 수정하지 않는다.
|
||||
|
||||
**Exact files:** `nonlinear_static_reference_comparison.h/.cpp`, new `shell_surface_pressure_reference_test.cpp`, `tests/CMakeLists.txt`. tolerance policy source와 stored reference files는 no-change.
|
||||
|
||||
**RED named tests:**
|
||||
|
||||
- `ShellSurfacePressureReference.AuditsExactRequiredArtifactsAndIgnoresOptionalReviewArtifacts`
|
||||
- `ShellSurfacePressureReference.SelectsUniqueSchemaOneFactorOneAcceptedFrame`
|
||||
- `ShellSurfacePressureReference.Projects729WideRowsTo2187LogicalRowsPerFamily`
|
||||
- `ShellSurfacePressureReference.MatchesByInstanceNodeLabelAndComponentNotRowOrder`
|
||||
- `ShellSurfacePressureReference.RejectsSchemaIdentityCardinalityMissingExtraDuplicateAndNonfiniteBeforeTolerance`
|
||||
- `ShellSurfacePressureReference.ClassifiesTranslationBlockingAndRotationWarningOnly`
|
||||
- `ShellSurfacePressureReference.ExcludesReactionAndStressFamiliesFromVerdict`
|
||||
- `ShellSurfacePressureReference.UsesUnchangedCommonScaleNearZeroRelativeAndRmsPolicy`
|
||||
- `ShellSurfacePressureReference.WritesDeterministicComparisonReport`
|
||||
|
||||
RED/focused commands:
|
||||
|
||||
```powershell
|
||||
cmake --build .harness/build --config Debug --target fesa_reference_tests
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^ShellSurfacePressureReference\."
|
||||
```
|
||||
|
||||
**Observed expected failure:** current nonlinear case registry requires coarse/fine legacy artifact portfolios and has no pressure case identity/disposition, so exact two-file pressure contract 또는 729/2187 cardinality가 지원되지 않아 test가 fail해야 한다.
|
||||
|
||||
**Minimal GREEN:** `NonlinearReferenceCase`에 pressure case의 required/optional/excluded artifact disposition을 explicit value fields로 표현한다. exact path/hash snapshot 뒤 input을 build-tree execution directory에 byte-for-byte copy하고 FESA application만 실행한다. HDF5에서 schema `1`, Step-1, unique accepted `load_factor==1`, `/model/nodes`, nodal displacement를 읽어 `(Part-1-1,node label,component)` key로 project한다. wide CSV 729 rows를 translation 2,187 + rotation 2,187 logical rows로 expand한다. all prechecks 후 기존 `EvaluateReferenceTolerance`만 호출한다. U family blocking, UR warning-only이며 reaction은 comparator family를 만들지 않고 review-only inventory, stress는 excluded다.
|
||||
|
||||
**Focused VERIFY acceptance:** input and displacement CSV exact hash/byte size unchanged; 729 unique node keys; each U/UR family 2,187 rows; missing/extra/duplicate/nonfinite/schema/frame/identity failures precede tolerance; common policy `S=max(abs(reference))`, near-zero band `0.01*S`, relative `0.05`, RMS/S `0.01`, zero-scale exact; report rows/warnings/metrics stable.
|
||||
|
||||
**Full/Stop VERIFY:** all `ShellSurfacePressureReference`, `NonlinearStaticReference`, `ReferenceTolerancePolicy`, `Mitc4Reference` suites와 `V-BUILD`, `V-SHOW`, `V-FULL`.
|
||||
|
||||
**Invariants:** stored input/CSV immutable; Abaqus never run; FESA CSV is not product output; reference row order ignored but source keys exact; tolerance unchanged.
|
||||
|
||||
**Failure/atomicity:** any artifact/precheck failure produces failed classification without tolerance result or artifact mutation. copied execution files and generated HDF5/log remain under build tree only.
|
||||
|
||||
**Forbidden scope:** reference CSV generation/edit, new tolerance, reaction/stress promotion, legacy artifact rename/metadata requirement.
|
||||
|
||||
**Trace:** requirements `017`–`019`, `021`–`024`; `IO §8`; reference-model §§3–8; numerical-review external acceptance.
|
||||
|
||||
**Evidence/report:** before/after snapshots, copied input hash, generated HDF5 path, selected frame identity, family cardinality/scale/row/RMS/worst row, warnings, classification, exits/durations/tails.
|
||||
|
||||
### Step 7 — `verify-and-report-pressure-feature`
|
||||
|
||||
**Bounded responsibility:** all implementation artifacts를 inspect하고 full MSVC/CTest 및 exact pressure reference gate를 실행해 implementation-owned reports를 완결한다. 코드 수정은 이 Step의 기본 scope가 아니다.
|
||||
|
||||
**Dependencies:** Step 1–6 green; clean or isolated executor worktree; no stored reference mutation.
|
||||
|
||||
**Prerequisites/read first:** all prior Step outputs, `AGENTS.md`, `docs/HARNESS.md`, `docs/HARNESS_WORKFLOW.md`, `.codex/hooks.json`, `.harness/config.json` if it exists at execution time, current CMake files, all upstream docs, exact reference bundle.
|
||||
|
||||
**Exact files:** future new `implementation-report.md`, `build-test.md`, `reference-comparison.md`. Test/production/CMake files are read-only in this Step unless a verification failure is classified `implementation` and Coordinator authorizes returning to the owning earlier Step; no silent repair here.
|
||||
|
||||
**RED:** report preflight must first prove the three implementation-owned reports are absent/incomplete and that no final passing classification has been recorded. This is the expected evidence-state failure, not permission to fabricate results. If any source/test/CMake change lacks a first-failing test record, classify `evidence-gap` and stop.
|
||||
|
||||
**Minimal GREEN sequence:** literally execute `ARTIFACT CHECK -> COMPARE -> CLASSIFY -> REPORT` after build/test gates:
|
||||
|
||||
1. **ARTIFACT CHECK:** record exact stored input/displacement CSV path, sha256, size, timestamp before run; reaction review-only and stress excluded disposition; verify source phase never invokes Abaqus.
|
||||
2. **COMPARE:** run FESA on a copied exact `.inp`, locate generated schema-1 `<stem>_results.h5`, execute `ShellSurfacePressureReference` comparison, record 2,187 U and 2,187 UR rows and common tolerance metrics.
|
||||
3. **CLASSIFY:** fail on U/precheck/internal equilibrium; preserve UR-only difference as warning-only; reaction/stress cannot change verdict. Distinguish `implementation`, `test`, `infrastructure`, `environment`, `artifact`, `regression`, `evidence-gap`.
|
||||
4. **REPORT:** write commands, exit codes, durations, meaningful output tails, warning inventory, changed files, requirement coverage and artifact post-check to all three reports.
|
||||
|
||||
**Exact commands:** execute `V-CONFIG`, `V-BUILD`, `V-SHOW`, `V-FOCUSED`, `V-FULL`, `V-REFERENCE` from §12. No Harness Python command because no Harness/Python file changes are planned. If an executor later changes `scripts/` or Harness Python behavior under separate authority, it must additionally run `uv run --with pytest python -m pytest -v -rs` and record why.
|
||||
|
||||
**Observed expected failure:** any configure/build/test/reference nonzero exit, zero discovered tests, new `/W4 /WX` warning, runtime DLL staging failure, artifact mutation, cardinality mismatch or U blocking failure keeps reports non-passing and stops closure.
|
||||
|
||||
**Focused/Full/Stop VERIFY:** every command exit `0`, `ctest --show-only=json-v1` reports nonzero tests including all named feature tests, full CTest passes, no new warnings, runtime execution succeeds, artifacts unchanged, reports internally consistent.
|
||||
|
||||
**Invariants:** evidence before success claims; no release approval; no physics Gate 7 claim; no commit/task selection/manual status/timestamp ownership transfer from Harness Executor.
|
||||
|
||||
**Failure/atomicity:** a failed gate leaves status non-passing, retains outputs for diagnosis, does not alter upstream/tolerance/reference artifacts and returns to Coordinator with precise classification.
|
||||
|
||||
**Forbidden scope:** source fixes, reference generation, tolerance adjustment, phase execution expansion, release readiness.
|
||||
|
||||
**Trace:** all requirements `001`–`024`; all upstream contracts; Harness Stop contract.
|
||||
|
||||
**Evidence/report:** complete three-document handoff with task order, tests first, files, commands, comparison, assumptions, acceptance and open constraints.
|
||||
|
||||
## 8. TDD Test Plan
|
||||
|
||||
| order | test id | layer / named suite | RED cause | GREEN evidence |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| 1 | `T-INPUT-VALID` | `InpSyntax`, `ShellSurfacePressureInput`, `ShellSurfacePressureDomain` valid tests | unsupported SURFACE/DSLOAD or missing semantic API | exact valid mapping/provenance/ownership |
|
||||
| 2 | `T-INPUT-NEG` | pressure input negative tests | unsupported forms accepted or unstable/partial failure | fail-closed deterministic diagnostics and no Domain |
|
||||
| 3 | `T-KERNEL-FORCE` | `ShellSurfacePressureKernel` analytical/sign/resultant/objectivity | evaluator absent | approved force integration and exact zero rotations |
|
||||
| 4 | `T-KERNEL-TANGENT` | kernel FD/nonsymmetry/geometry | external derivative absent | `h=1e-5`, normalized `<=1e-8`, geometry gate exact |
|
||||
| 5 | `T-ASSEMBLY` | `SurfacePressureAssembly` | full-space assembler absent | stable additive exact-once serial/parallel reduction |
|
||||
| 6 | `T-LINEAR` | `LinearShellSurfacePressure` | linear procedure omits pressure | reference force/reaction/residual/resultant and schema 0 |
|
||||
| 7 | `T-NONLINEAR` | `NonlinearShellSurfacePressure` | nonlinear external force/tangent omit pressure | current follower Newton convergence, rollback and schema 1 |
|
||||
| 8 | `T-CLI-HDF5` | `ShellSurfacePressureApplication` plus writer tests | pressure route/output regression not covered | existing naming/schema/projection/atomic/no-pressure behavior |
|
||||
| 9 | `T-REF-PRECHECK` | pressure reference precheck tests | registry/schema/cardinality unsupported | deterministic prechecks before tolerance |
|
||||
| 10 | `T-REF-COMPARE` | pressure reference end-to-end tests | pressure disposition/comparison unsupported | exact U blocking/UR warning-only report |
|
||||
| 11 | `E-FINAL` | full build/test/reference evidence | reports incomplete | verified commands and immutable artifact snapshots |
|
||||
|
||||
모든 production change는 같은 Step에서 먼저 생성/수정되는 관련 C++ test와 연결한다. `src/fesa/CMakeLists.txt` production 등록은 corresponding unit test RED와 함께 들어가며, `tests/CMakeLists.txt` 등록은 test source를 생성한 같은 Step에서 한다.
|
||||
|
||||
## 9. CMake/CTest Plan
|
||||
|
||||
- `src/fesa/CMakeLists.txt`: `surface_definition_mapper.cpp`, `shell_surface_pressure.cpp`, `surface_pressure_assembler.cpp`를 existing `fesa_solver` source inventory에 추가한다. public headers는 existing include tree를 통해 노출하고 별도 library/target을 만들지 않는다.
|
||||
- `tests/CMakeLists.txt`: 새 unit sources는 `fesa_unit_tests`, integration/app sources는 `fesa_integration_tests`, reference source는 `fesa_reference_tests`에 추가한다.
|
||||
- existing `gtest_discover_tests`가 개별 `Suite.Test` CTest entries를 만든다. 새 raw `add_test`는 필요하지 않다.
|
||||
- feature-specific selection은 exact suite-name regex로 한다. existing target-wide legacy labels를 전면 재분류하지 않는다. 필요하면 각 `gtest_discover_tests(... PROPERTIES LABELS ...)`의 existing labels에 `shell-surface-pressure-load`를 append하되 기존 labels를 삭제하지 않는다.
|
||||
- `.harness/config.json`이 execution 전에 생기면 그 설정이 아래 cache-derived command보다 우선한다. 현재는 없으므로 `.harness/build` default와 현재 MSVC x64 Debug cache를 사용한다.
|
||||
- `ctest --show-only=json-v1`에서 discovered test count가 zero면 success로 인정하지 않는다.
|
||||
- runtime staging은 existing `fesa_cli`, integration/reference target의 MKL/TBB/HDF5 DLL copy rules를 그대로 사용하며 새 manual PATH hack을 만들지 않는다.
|
||||
|
||||
## 10. Data Flow Contract
|
||||
|
||||
```text
|
||||
exact/approved Abaqus .inp
|
||||
-> AbaqusInputReader KeywordBlock/DataLine + physical SourceLocation
|
||||
-> DomainMappingContext raw SURFACE/DSLOAD candidate
|
||||
-> topology finalize -> SurfaceDefinitionMapper -> StepDefinitionMapper
|
||||
-> Domain-owned ordered ElementSurfaceDefinition
|
||||
+ Step-owned ordered SurfacePressureLoadDefinition
|
||||
-> AnalysisModel non-owning active view (Domain outlives view)
|
||||
-> ShellSurfacePressureEvaluator local force/tangent candidates
|
||||
-> SurfacePressureAssembler stable full-space reduction
|
||||
-> linear: Fext(ref), Kext=0
|
||||
nonlinear: Fext(current), Kext(current)
|
||||
-> residual/reaction/equilibrium recovery
|
||||
-> existing atomic HDF5 writer
|
||||
-> authoritative <stem>_results.h5
|
||||
-> schema-1 factor-one HDF5 projection keyed by
|
||||
(Step-1, factor=1, Part-1-1, source node label, component)
|
||||
-> exact read-only displacement CSV projection
|
||||
-> prechecks -> unchanged common tolerance -> deterministic report
|
||||
```
|
||||
|
||||
Exact reference flow:
|
||||
|
||||
- Input: `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure.inp`
|
||||
- Required CSV: `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure displacements.csv`
|
||||
- FESA run: input copy under `.harness/build/reference/shell-surface-pressure-load/`; never Abaqus
|
||||
- HDF5: schema `1`, `Step-1`, unique accepted factor-one frame, `/model/nodes`, existing nodal displacement/generalized force/residual/reaction/equilibrium paths
|
||||
- CSV: 729 wide node rows; U1/U2/U3 = 2,187 blocking logical rows; UR1/UR2/UR3 = 2,187 warning-only logical rows
|
||||
- Reaction CSV: optional review-only inventory, no comparison family/verdict effect
|
||||
- Stress CSV: excluded, no comparison family
|
||||
- Prechecks: missing/extra/duplicate/nonfinite/schema/frame/source-id/component/cardinality before tolerance
|
||||
- Tolerance: family-specific Abaqus-only `S=max(abs(reference))`; `abs(ref)<=0.01*S`이면 absolute row error `<=0.01*S`, otherwise relative error `<=0.05`; `RMS(error)/S<=0.01`; zero-scale는 FESA exact zero only.
|
||||
|
||||
## 11. Acceptance Traceability Matrix
|
||||
|
||||
| requirement | Step | task/test evidence | acceptance criterion |
|
||||
| --- | --- | --- | --- |
|
||||
| `FESA-REQ-SHELL-PRESSURE-001` | 1, 7 | `T-INPUT-VALID`; valid direct/ELSET S4/S4R tests | approved SURFACE + DSLOAD sequence exact |
|
||||
| `FESA-REQ-SHELL-PRESSURE-002` | 1, 2 | finite scalar/raw text, nonfinite/D-exponent tests | one uniform finite force/area scalar per row |
|
||||
| `FESA-REQ-SHELL-PRESSURE-003` | 1, 2, 4 | canonical facet/order tests; assembler order | unique deterministic instance/label/side list |
|
||||
| `FESA-REQ-SHELL-PRESSURE-004` | 1, 2 | S4/S4R/SPOS/SNEG valid and unsupported inventory | only approved shell types/sides; source type/label preserved |
|
||||
| `FESA-REQ-SHELL-PRESSURE-005` | 3, 4 | sign reversal and linear analytical tests | positive opposite selected normal; negative reverses |
|
||||
| `FESA-REQ-SHELL-PRESSURE-006` | 3, 4 | connectivity/SPOS/SNEG reversal | SPOS connectivity normal, SNEG inverse exact |
|
||||
| `FESA-REQ-SHELL-PRESSURE-007` | 3, 4 | reference geometry and prescribed-displacement invariant | linear pressure fixed to reference geometry |
|
||||
| `FESA-REQ-SHELL-PRESSURE-008` | 3, 5 | current area/normal/objectivity tests | nonlinear follower uses `X+u` |
|
||||
| `FESA-REQ-SHELL-PRESSURE-009` | 3, 5 | centered FD and Newton tangent sign tests | exact external derivative included |
|
||||
| `FESA-REQ-SHELL-PRESSURE-010` | 1, 4, 5 | additive records/unit factor/increment factor tests | pressure magnitude scaled exactly once |
|
||||
| `FESA-REQ-SHELL-PRESSURE-011` | 4, 5 | full-DOF scatter before projection tests | all pressure assembled full-space first |
|
||||
| `FESA-REQ-SHELL-PRESSURE-012` | 4, 5, 7 | reaction/free residual/global balance | `K*d-F` or `f_int-f_ext` includes pressure |
|
||||
| `FESA-REQ-SHELL-PRESSURE-013` | 1, 2, 4, 5, 6 | repeated serial/parallel/order/report tests | deterministic facets, reductions, rows, diagnostics |
|
||||
| `FESA-REQ-SHELL-PRESSURE-014` | 2 | unsupported params/labels/distribution/type/side tests | fail closed exact |
|
||||
| `FESA-REQ-SHELL-PRESSURE-015` | 2 | missing/empty/ambiguous/cyclic/scope/duplicate tests | fail closed, no guessing/averaging |
|
||||
| `FESA-REQ-SHELL-PRESSURE-016` | 2, 3, 4, 5 | invalid procedure/nonfinite/geometry/rollback | no clamp/fallback/partial result |
|
||||
| `FESA-REQ-SHELL-PRESSURE-017` | 2, 4, 5, 6, 7 | stable diagnostics, no Domain, final snapshots | failed candidate never published |
|
||||
| `FESA-REQ-SHELL-PRESSURE-018` | 4, 5, 7 | schema 0/1 inventory tests | existing HDF5 sole authority; no pressure dataset/version |
|
||||
| `FESA-REQ-SHELL-PRESSURE-019` | 4, 5, 6 | displacement/reaction/residual/equilibrium projections | existing units/coordinates/source IDs finite and observable |
|
||||
| `FESA-REQ-SHELL-PRESSURE-020` | 3, 4 | analytical sign/resultant/reaction/mesh/order suite | normalized analytical checks at approved thresholds |
|
||||
| `FESA-REQ-SHELL-PRESSURE-021` | 3, 5, 7 | objectivity/current-area/FD/residual/balance/open-patch | FD `<=1e-8`, balance `<=1e-8`, other approved gates |
|
||||
| `FESA-REQ-SHELL-PRESSURE-022` | 6, 7 | exact artifact audit and immutable snapshots | exact required input/displacement CSV only |
|
||||
| `FESA-REQ-SHELL-PRESSURE-023` | 6, 7 | 729/2187 key mapping, U/UR disposition, tolerance report | U blocking; UR warning; deterministic factor-one comparison |
|
||||
| `FESA-REQ-SHELL-PRESSURE-024` | 6, 7 | absent reaction/stress families and classification tests | reaction review-only, stress excluded; internal gates retained |
|
||||
|
||||
Coverage: normative IDs `24`, mapped IDs `24`, orphan IDs `0`. Every must requirement has at least one implementation/verification Step and one named test/evidence item.
|
||||
|
||||
## 12. Validation Commands
|
||||
|
||||
현재 execution context는 `.harness/config.json` 부재, existing `.harness/build` cache 존재다. 실행 시 config가 생겼으면 Harness가 그 값을 먼저 resolve하고 reports에 실제 command를 기록한다.
|
||||
|
||||
### `V-CONFIG` — clean/config-resolved MSVC x64 Debug configure
|
||||
|
||||
```powershell
|
||||
cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 `
|
||||
"-DFESA_GTEST_SOURCE_DIR=C:/git/googletest" `
|
||||
"-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" `
|
||||
"-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" `
|
||||
"-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"
|
||||
```
|
||||
|
||||
### `V-BUILD`
|
||||
|
||||
```powershell
|
||||
cmake --build .harness/build --config Debug
|
||||
```
|
||||
|
||||
Acceptance: exit `0`; new MSVC warning `0`; `/W4 /WX` 유지; `fesa_solver`, `fesa_cli`, `fesa_unit_tests`, `fesa_integration_tests`, `fesa_reference_tests` all build; runtime staging errors 없음.
|
||||
|
||||
### `V-SHOW`
|
||||
|
||||
```powershell
|
||||
ctest --test-dir .harness/build -C Debug --show-only=json-v1
|
||||
```
|
||||
|
||||
Acceptance: exit `0`, discovered count `>0`, 모든 새 named suite가 inventory에 존재.
|
||||
|
||||
### `V-FOCUSED`
|
||||
|
||||
```powershell
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^(InpSyntax|ShellSurfacePressureInput|ShellSurfacePressureDomain|ShellSurfacePressureKernel|SurfacePressureAssembly|LinearShellSurfacePressure|NonlinearShellSurfacePressure|ShellSurfacePressureApplication|ShellSurfacePressureReference)\."
|
||||
```
|
||||
|
||||
Acceptance: exit `0`, selected count `>0`, failed `0`.
|
||||
|
||||
### `V-FULL`
|
||||
|
||||
```powershell
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure
|
||||
```
|
||||
|
||||
Acceptance: exit `0`, failed `0`, existing no-pressure/beam/shell/nonlinear/reference regressions pass.
|
||||
|
||||
### `V-REFERENCE`
|
||||
|
||||
```powershell
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^ShellSurfacePressureReference\."
|
||||
```
|
||||
|
||||
Acceptance: exit `0`; exact artifact post-snapshots equal pre-snapshots; U blocking pass; any UR deviations warning-only; internal balance pass; 729 wide/2,187 logical rows per family exact; reaction/stress verdict exclusion exact.
|
||||
|
||||
Harness Python behavior/file은 범위 밖이므로 이 plan에는 Python test 실행을 넣지 않는다. 별도 승인된 Harness/Python 변경이 발생하는 경우에만 다음을 추가한다.
|
||||
|
||||
```powershell
|
||||
uv run --with pytest python -m pytest -v -rs
|
||||
```
|
||||
|
||||
## 13. Risks and Downstream Handoff
|
||||
|
||||
| risk | mitigation / stop condition |
|
||||
| --- | --- |
|
||||
| existing `Load` abstraction에 follower tangent를 강제로 넣어 ownership 왜곡 | 별도 evaluator/assembler candidate 유지; public nodal load contract를 변경하지 않음 |
|
||||
| surface parser와 topology resolution order 혼동 | topology finalize 후 surface, surface 후 step binding 순서 고정 |
|
||||
| duplicate normalization이 additive DSLOAD와 혼동 | facet exact duplicate만 normalize; DSLOAD records는 항상 distinct/additive |
|
||||
| nonlinear sign 또는 factor double application | force and residual FD 두 부호 모두 test; factor at assembler boundary once |
|
||||
| tangent symmetrization 또는 SPD solver 경로 | antisymmetric evidence test; existing `MklPardisoTangentSolver` `mtype=11` spy/adapter tests |
|
||||
| invalid geometry가 zero load에서 bypass | evaluator zero pressure/factor geometry rejection test |
|
||||
| parallel nondeterminism | worker-local candidates + fixed source/facet/Gauss serial reduction; repeated byte/metric order tests |
|
||||
| HDF5 schema creep | no-new-path inventory and version `0`/`1` exact tests |
|
||||
| reference utility가 legacy four-file portfolio를 강요 | per-case required/optional/excluded disposition을 explicit하게 추가; exact pressure two-file gate |
|
||||
| reference comparison으로 implementation bug 은폐 | artifact/row prechecks first, tolerance unchanged, U blocking, internal balance retained |
|
||||
| build environment drift | execution-time `.harness/config.json` precedence; actual commands/cache/toolchain recorded |
|
||||
|
||||
Coordinator를 통한 Implementation Agent 단일 handoff:
|
||||
|
||||
- task order: Step 1 → 7, 각 Step 안의 RED/GREEN/VERIFY 순서
|
||||
- first tests: §7 named tests와 §8 test IDs
|
||||
- candidate files/signatures: §§5–6
|
||||
- validation commands: §12
|
||||
- HDF5/reference mapping: §10
|
||||
- tolerance/identity assumptions: common policy unchanged, factor-one, `(instance,node label,component)`, U blocking/UR warning-only
|
||||
- acceptance criteria: §11 전 24 requirements + each Step metrics
|
||||
- open constraints: phase files는 사용자 승인 이후 Planning Agent가 materialize; Executor는 별도 explicit request 이후만 실행; reference artifacts와 tolerance read-only
|
||||
|
||||
## 14. Open Issues
|
||||
|
||||
Implementation readiness를 막는 requirements/formulation/I/O/tolerance/reference/architecture gap은 없다. 다음은 blocker가 아닌 execution-time checks다.
|
||||
|
||||
- Step execution 직전 `.harness/config.json` 생성 여부를 다시 확인해 config precedence를 적용한다.
|
||||
- current build cache paths가 execution host에서 유효한지 `V-CONFIG`/`V-BUILD` 결과로 증명한다.
|
||||
- 새 feature suite가 `ctest --show-only=json-v1`에 실제 발견되는지 확인한다.
|
||||
- exact reference artifact pre/post snapshot을 같은 run에서 기록한다.
|
||||
|
||||
현재 critical user decision은 이 7-Step draft의 `approve` 또는 구체적인 revision 요청이다. 승인만으로 phase 파일을 실행하거나 `scripts/execute.py`를 호출하지 않는다.
|
||||
|
||||
## 15. Plan Self-Review
|
||||
|
||||
- 실제 존재가 확인된 existing paths만 modify/read 대상으로 기재했다.
|
||||
- 새 paths는 §6의 new-file table에서 first owning Step과 함께 명시했다.
|
||||
- semantic/evaluator/assembler signatures와 linear/nonlinear caller contract를 Steps 사이에 동일하게 유지했다.
|
||||
- requirements `001`–`024` 모두 Step과 named test/evidence에 연결했고 orphan이 없다.
|
||||
- exact reference input/CSV, schema-1 factor-one, 729/2,187 cardinality, dispositions와 tolerance mapping을 포함했다.
|
||||
- 모든 구현 Step에 test-first RED, expected failure, minimal GREEN, focused/full verification, invariants, atomicity, forbidden scope, trace, handoff evidence를 포함했다.
|
||||
- final Step은 `ARTIFACT CHECK -> COMPARE -> CLASSIFY -> REPORT` 순서를 literal하게 보존하고 세 implementation-owned reports를 소유한다.
|
||||
- manual commit, task selection, executor-owned timestamp/status 기록을 계획하지 않았다.
|
||||
- `phases/`, source, tests, CMake, config/hooks, upstream docs, tolerance, reference artifacts는 이 planning turn에서 변경하지 않았다.
|
||||
- `phases/index.json`와 phase task files는 사용자 승인 전 materialize하지 않았으며 Harness Executor 실행도 요청하지 않았다.
|
||||
@@ -0,0 +1,639 @@
|
||||
# Shell Surface Pressure Load I/O Definition
|
||||
|
||||
## 1. Metadata
|
||||
|
||||
- feature_id: `shell-surface-pressure-load`
|
||||
- source_requirement: `docs/shell-surface-pressure-load/requirements.md`
|
||||
- source_research: `docs/shell-surface-pressure-load/research.md`
|
||||
- source_formulation: `docs/shell-surface-pressure-load/formulation.md`
|
||||
- source_numerical_review: `docs/shell-surface-pressure-load/numerical-review.md`
|
||||
- source_reference_model: `docs/shell-surface-pressure-load/reference-model.md`
|
||||
- status: `ready-for-implementation-planning`
|
||||
- owner_agent: `io-definition-agent`
|
||||
- date: `2026-08-31`
|
||||
- authoritative_output: input lexical sibling `<stem>_results.h5`
|
||||
- linear_schema_version: `0`
|
||||
- nonlinear_schema_version: `1`
|
||||
- external_tolerance_authority: `docs/TOLERANCE.md`
|
||||
|
||||
이 문서는 `S4`/`S4R` shell의 named element surface에 작용하는 uniform
|
||||
surface-based pressure의 입력, semantic identity, validation, authoritative HDF5와
|
||||
reference projection만 정의한다. Abaqus 2025 keyword/modeling documentation은
|
||||
`*SURFACE`와 `*DSLOAD`의 외부 입력 의미 근거로만 사용한다. FESA가 Abaqus의 full input
|
||||
compatibility, element 내부 알고리즘, 적분, stabilization, load linearization 또는 output
|
||||
생성 절차와 동등하다는 주장은 하지 않는다.
|
||||
|
||||
## 2. Abaqus Input Scope
|
||||
|
||||
### 2.1 Compatibility boundary
|
||||
|
||||
승인된 추가 입력은 assembly-level
|
||||
`*SURFACE, TYPE=ELEMENT, NAME=<surface-name>`와 step-level `*DSLOAD`의
|
||||
`<surface-name>, P, <uniform-magnitude>`뿐이다. Surface member는 identity instance의
|
||||
`S4` 또는 `S4R` element를 `SPOS` 또는 `SNEG`로 선택한다. Linear static은 reference
|
||||
configuration, `*STEP, NLGEOM=YES` nonlinear static은 current-configuration follower
|
||||
pressure와 external tangent를 사용한다.
|
||||
|
||||
이 문서가 명시하지 않은 `*SURFACE`, `*DSLOAD`, element, load, procedure 또는 scope
|
||||
variant는 지원하지 않는다. Unknown model-affecting keyword도 fail-closed다. 기존 output
|
||||
request allowlist만 결과를 바꿀 수 없다는 전제에서 warning 후 no-op이다.
|
||||
|
||||
### 2.2 Keyword support table
|
||||
|
||||
`supported`는 이 feature의 valid input에서 parse하고 semantic model에 반영한다.
|
||||
`unsupported`는 명확한 non-success diagnostic으로 거부한다.
|
||||
`ignored-with-warning`은 requested result를 바꿀 수 없는 기존 output-control syntax만
|
||||
건너뛴다.
|
||||
|
||||
| keyword | policy | purpose / required subset | unsupported behavior |
|
||||
| --- | --- | --- | --- |
|
||||
| `*HEADING` | `supported` | 기존 heading block; 해석 의미 없음 | parameter 또는 잘못된 keyword line은 `input-syntax` |
|
||||
| `*INCLUDE` | `unsupported` | 이 feature는 single physical input source만 허용 | 모든 parameter/data form을 `unsupported-keyword`로 거부; include를 열지 않음 |
|
||||
| `*PART`, `*END PART` | `supported` | 기존 part topology/material/section wrapper | nested/mismatched wrapper 거부 |
|
||||
| `*NODE` | `supported` | positive source label와 finite global `X,Y,Z` | duplicate/nonfinite/cardinality error 거부 |
|
||||
| `*NSET` | `supported` | 기존 node-set subset 및 `GENERATE` | unresolved/duplicate-incompatible/cross-scope target 거부 |
|
||||
| `*ELEMENT` | `supported` | 이 feature의 pressure target은 `TYPE=S4|S4R`, four-node connectivity | 다른 target type 또는 잘못된 connectivity 거부 |
|
||||
| `*ELSET` | `supported` | 기존 element-set subset 및 `GENERATE`; assembly form은 explicit `INSTANCE=<name>`; CAE의 result-neutral `INTERNAL` flag 허용 | 그 밖의 parameter와 unresolved/cyclic/ambiguous/cross-scope membership 거부 |
|
||||
| `*MATERIAL` | `supported` | 기존 named material | duplicate/empty name 거부 |
|
||||
| `*ELASTIC` | `supported` | 기존 finite linear isotropic `E, nu` | unsupported material form/nonfinite data 거부 |
|
||||
| `*SHELL SECTION` | `supported` | 기존 finite positive thickness, material와 `ELSET` mapping | missing/incompatible reference 거부 |
|
||||
| `*ASSEMBLY`, `*END ASSEMBLY` | `supported` | identity-instance topology와 assembly surface scope | nested assembly 또는 malformed scope 거부 |
|
||||
| `*INSTANCE`, `*END INSTANCE` | `supported` | existing identity instance only | transform data, nested instance 또는 unknown part 거부 |
|
||||
| `*SURFACE` | `supported` | 아래 §2.3의 assembly-level element surface만 지원 | 다른 scope/type/parameter/member form은 fail-closed |
|
||||
| `*BOUNDARY` | `supported` | 기존 essential DOF 1–6 constraint subset | unsupported target/DOF/data form 거부 |
|
||||
| `*CLOAD` | `supported` | 기존 nodal generalized concentrated-load subset | 기존 allowlist 밖 form 거부; pressure alias로 사용하지 않음 |
|
||||
| `*DLOAD` | `unsupported` | 이 feature의 `*DSLOAD P`와 다른 element-face load | 언제나 `unsupported-keyword`; `P n`을 `P`로 변환하지 않음 |
|
||||
| `*DSLOAD` | `supported` | 아래 §2.4의 named-surface uniform `P` | parameter, 다른 load label/distribution/cardinality는 fail-closed |
|
||||
| `*STEP`, `*END STEP` | `supported` | exactly one static step; `NLGEOM`은 §2.5만 | 두 번째 step, propagation/restart 의미 거부 |
|
||||
| `*STATIC` | `supported` | 기존 linear 또는 approved full-Newton static control data | dynamics/contact/thermal/perturbation procedure 거부 |
|
||||
| `*OUTPUT` | `ignored-with-warning` | 기존 `FIELD|HISTORY` allowlist; mandatory HDF5를 변경하지 않음 | allowlist 밖 model-affecting parameter는 거부 |
|
||||
| `*NODE OUTPUT` | `ignored-with-warning` | variable data를 warning 후 no-op | mandatory nodal output을 제거/추가하지 않음 |
|
||||
| `*ELEMENT OUTPUT` | `ignored-with-warning` | variable data를 warning 후 no-op | mandatory MITC4 recovery를 제거/추가하지 않음 |
|
||||
| `*PREPRINT`, `*RESTART`, `*TRANSVERSE SHEAR STIFFNESS`, `*CONTACT OUTPUT` | `ignored-with-warning` | 기존, result-neutral allowlist만 | 해석 의미를 바꾸는 variant는 거부 |
|
||||
|
||||
### 2.3 Exact `*SURFACE` grammar
|
||||
|
||||
지원 keyword line의 EBNF는 다음과 같다. Token 비교는 ASCII case-insensitive다.
|
||||
|
||||
```text
|
||||
surface_keyword := "*SURFACE" "," type_parameter "," name_parameter
|
||||
| "*SURFACE" "," name_parameter "," type_parameter
|
||||
type_parameter := "TYPE" "=" "ELEMENT"
|
||||
name_parameter := "NAME" "=" surface_name
|
||||
surface_name := name_token_without_dot
|
||||
|
||||
surface_member := direct_member "," side
|
||||
| elset_member "," side
|
||||
direct_member := instance_name "." positive_element_label
|
||||
elset_member := assembly_elset_name
|
||||
side := "SPOS" | "SNEG"
|
||||
```
|
||||
|
||||
Normative restrictions:
|
||||
|
||||
1. `*SURFACE`는 `*ASSEMBLY`와 `*END ASSEMBLY` 사이이며 어떤 `*INSTANCE` block 밖에
|
||||
있어야 한다. Part-level 또는 instance-block-level `*SURFACE`는 이번 subset에서
|
||||
`unsupported-surface-scope`다.
|
||||
2. Keyword parameter는 `TYPE=ELEMENT`와 `NAME=<name>` 각각 하나뿐이다. Parameter order는
|
||||
위 두 순서 모두 허용하지만 duplicate, flag parameter와 `TRIM`, `COMBINE`,
|
||||
`PROPERTY`, `REGION TYPE` 등 추가 parameter는 거부한다.
|
||||
3. 각 data line은 정확히 두 개의 nonempty field다. Side는 `SPOS` 또는 `SNEG`뿐이다.
|
||||
4. Direct member는 정확히 `<instance-name>.<positive-decimal-element-label>`이다. Assembly
|
||||
scope의 bare element label, `<part>.<label>`, `<instance>.<elset>`, 두 개 이상의 dot과
|
||||
quoted token은 지원하지 않는다.
|
||||
5. ELSET member는 assembly scope에서 이미 선언되고 `INSTANCE=<instance-name>`으로 하나의
|
||||
identity instance에 결속된 flat `ELSET` 이름이다. Surface가 여러 data line에서 서로
|
||||
다른 instance-bound ELSET 또는 direct member를 사용해 여러 instance를 포함할 수 있다.
|
||||
Reference input에 있는 `INTERNAL` flag는 source provenance에 보존하되 membership 의미를
|
||||
바꾸지 않는다. Mixed-instance set, nested/cyclic set, part-local set의 암묵적 승격은
|
||||
지원하지 않는다.
|
||||
6. Direct member와 ELSET expansion은 모두 최종 stable facet
|
||||
`(part, instance, element label, source type, side)`로 변환된다. Element label은 instance
|
||||
안에서 해석하며 다른 instance의 같은 numeric label과 합치지 않는다.
|
||||
7. Surface name은 assembly namespace에서 case-insensitive unique다. Surface declaration은
|
||||
하나 이상의 valid unique facet으로 resolve되어야 한다.
|
||||
|
||||
지원 예:
|
||||
|
||||
```text
|
||||
*ELSET, ELSET=_Surf-1_SPOS, INTERNAL, INSTANCE=Part-1-1, GENERATE
|
||||
1, 676, 1
|
||||
*SURFACE, TYPE=ELEMENT, NAME=Surf-1
|
||||
_Surf-1_SPOS, SPOS
|
||||
*SURFACE, NAME=Direct-Surface, TYPE=ELEMENT
|
||||
Part-1-1.1, SNEG
|
||||
```
|
||||
|
||||
### 2.4 Exact `*DSLOAD P` grammar
|
||||
|
||||
```text
|
||||
dsload_keyword := "*DSLOAD"
|
||||
dsload_row := surface_name "," "P" "," finite_pressure
|
||||
finite_pressure := sign? decimal (exponent)?
|
||||
sign := "+" | "-"
|
||||
decimal := digits ("." digits?)? | "." digits
|
||||
exponent := ("E" | "e") sign? digits
|
||||
```
|
||||
|
||||
- `*DSLOAD` keyword line에는 parameter를 허용하지 않는다. `AMPLITUDE`, `FOLLOWER`, `OP`,
|
||||
`REF NODE`와 unknown parameter는 모두 `unsupported-dsload-parameter`다.
|
||||
- Data line은 정확히 세 개의 nonempty field다. 첫 field는 assembly-level named surface,
|
||||
두 번째는 `P`, 세 번째는 C-locale decimal/scientific notation의 finite `double`이다.
|
||||
- `NaN`, `Inf`, `Infinity`, hexadecimal, locale comma와 Fortran `D` exponent는 지원하지
|
||||
않는다. Overflow/underflow parse failure도 거부한다. Positive, `+0`, `0`, `-0`, negative
|
||||
finite 값은 허용한다. Signed zero의 raw token은 identity/diagnostic에 보존하지만 physical
|
||||
magnitude는 exact zero이며 validation을 우회하지 않는다.
|
||||
- Magnitude 단위는 model-consistent `force/length^2`다. FESA가 SI 또는 다른 단위계를
|
||||
추론·변환하지 않는다.
|
||||
- 한 `*DSLOAD` 아래 여러 data line을 허용하고, step 안에 여러 `*DSLOAD` keyword를
|
||||
허용한다. 각 valid data line은 서로 distinct하며 동일한 surface/type/magnitude의 완전
|
||||
duplicate도 deduplicate하지 않고 source order에서 additive하게 한 번씩 적용한다.
|
||||
|
||||
### 2.5 Procedure and configuration syntax
|
||||
|
||||
- 정확히 하나의 `*STEP`/`*END STEP`만 허용한다.
|
||||
- `*STEP`에서 `NLGEOM` 생략 또는 `NLGEOM=NO`는 linear static reference-configuration
|
||||
pressure다. `NLGEOM=YES`는 approved nonlinear full-Newton current-configuration follower
|
||||
pressure다. 다른 `NLGEOM` 값과 다른 step parameter는 기존 승인 subset 밖이면 거부한다.
|
||||
- `*STATIC`은 해당 step의 유일한 procedure keyword다. `*DSLOAD`는 이 static procedure의
|
||||
history data이며 step 밖에서는 거부한다.
|
||||
- Linear pressure의 external tangent는 zero다. Nonlinear pressure는 current `X+u`에서
|
||||
force와 exact external tangent를 함께 만든다. Syntax가 이 physics를 override하지 못한다.
|
||||
|
||||
## 3. Syntax Policy
|
||||
|
||||
### 3.1 Lines, commas, comments and whitespace
|
||||
|
||||
- Keyword line은 첫 non-whitespace character가 `*`이고 comment line은 첫
|
||||
non-whitespace characters가 `**`다. Blank line과 whole-line comment는 semantic order에
|
||||
포함하지 않고 건너뛰되 source physical line number는 유지한다.
|
||||
- Inline comment syntax는 지원하지 않는다. Data field 안의 `**`는 comment가 아니라
|
||||
malformed data다.
|
||||
- Keyword parameter와 data field는 comma-separated다. Field 바깥의 leading/trailing space와
|
||||
horizontal tab은 trim한다. 이름/label 내부 공백, quote와 escape는 이번 subset에서
|
||||
허용하지 않는다.
|
||||
- Keyword, parameter name, enum, surface/set/part/instance name lookup은 ASCII
|
||||
case-insensitive이고 canonical lookup key는 uppercase다. Raw trimmed spelling, source file,
|
||||
physical line와 data ordinal은 그대로 보존한다. Numeric source label은 값과 raw digit
|
||||
token을 모두 보존한다.
|
||||
|
||||
### 3.2 Continuation, line length and encoding
|
||||
|
||||
- 각 physical line은 CR/LF를 제외하고 최대 `256` ASCII byte다. Input subset은 printable
|
||||
7-bit ASCII와 horizontal tab만 허용한다. NUL, non-ASCII byte와 invalid control character는
|
||||
`invalid-input-character`다. HDF5에는 보존된 ASCII text를 valid UTF-8로 기록한다.
|
||||
- Keyword parameter continuation만 지원한다. Physical keyword line의 마지막 non-whitespace
|
||||
character가 comma일 때 바로 다음 non-comment/nonblank physical line을 같은 keyword의
|
||||
parameter continuation으로 읽는다. Continuation 도중 새 `*` line, EOF, comment/blank
|
||||
interruption 또는 empty continued parameter는 거부한다.
|
||||
- Data-line continuation은 지원하지 않는다. `S4`/`S4R`, surface member와 DSLOAD row는 한
|
||||
physical line 안에 완결되어야 한다.
|
||||
- `*INCLUDE`는 지원하지 않으므로 recursive source stack, relative include path와 include
|
||||
cycle은 이 feature contract에 없다. 발견 즉시 fail-closed한다.
|
||||
|
||||
### 3.3 Names, labels and empty fields
|
||||
|
||||
- `name_token_without_dot`은 정규식 `[A-Za-z_][A-Za-z0-9_-]{0,79}`를 만족한다.
|
||||
Instance, part, ELSET와 surface name은 이 feature가 새로 소비하는 identity에서 이 bounded
|
||||
form을 사용한다. Dot은 direct-member qualification separator 하나로만 사용한다.
|
||||
- Element/node label은 positive base-10 integer이고 existing internal index/equation index와
|
||||
별개다. Parse 범위 밖, zero, negative와 duplicate source label은 거부한다.
|
||||
- Split 과정은 empty field를 잃지 않는다. 이 feature가 추가한 keyword parameter,
|
||||
`surface_member`와 `dsload_row`에는 empty field가 하나라도 있으면 cardinality failure다.
|
||||
Keyword-line terminal empty field는 §3.2 continuation marker로만 허용한다.
|
||||
- 기존 keyword의 optional data field 의미는 기존 contract를 유지하며 이 feature가 새
|
||||
empty-field default를 추가하지 않는다.
|
||||
|
||||
## 4. Model Data Mapping
|
||||
|
||||
### 4.1 Existing model data
|
||||
|
||||
| input | semantic mapping | validation / units |
|
||||
| --- | --- | --- |
|
||||
| `*NODE` | Domain-owned node; `(instance, source node label)`와 stable internal node index | finite global Cartesian coordinates `[L]`; duplicate source identity 금지 |
|
||||
| `*ELEMENT, TYPE=S4|S4R` | Domain-owned four-node shell definition; part/instance, source label/type/connectivity 보존 | four existing nodes; source type preserved even though both select FESA-MITC4 |
|
||||
| `*NSET`, `*ELSET` | scope-qualified ordered set membership | case-insensitive name, stable source membership, missing/cyclic/cross-scope failure |
|
||||
| `*MATERIAL`, `*ELASTIC` | Domain-owned named linear isotropic elasticity | finite `E:[F/L^2]`, dimensionless `nu`; existing admissibility rules |
|
||||
| `*SHELL SECTION` | Domain-owned shell section and material/ELSET references | finite positive thickness `[L]`; exact references required |
|
||||
| part/assembly/instance wrappers | part definition과 identity-instance relation | instance transform/nested assembly는 unsupported |
|
||||
|
||||
### 4.2 Domain-owned element-surface contract
|
||||
|
||||
Successful mapping 뒤 Domain은 각 named surface를 ordered immutable semantic object로
|
||||
소유한다. C++ type/API를 지정하지 않으며 필요한 semantic fields는 다음과 같다.
|
||||
|
||||
| field | meaning |
|
||||
| --- | --- |
|
||||
| `surface_name_raw`, `surface_name_canonical` | source spelling과 uppercase lookup key |
|
||||
| `declaration_file`, `declaration_line`, `declaration_ordinal` | stable declaration identity |
|
||||
| `scope` | exact value `assembly` |
|
||||
| `facet_ordinal` | resolved unique inventory의 zero-based stable order |
|
||||
| `part_name_raw/canonical`, `instance_name_raw/canonical` | identity instance가 참조하는 part와 source instance identity |
|
||||
| `element_label`, `element_label_raw`, `source_element_type` | positive source label와 exact `S4|S4R`; internal index와 분리 |
|
||||
| `side` | exact canonical `SPOS|SNEG`; side multiplier는 formulation의 `+1|-1` |
|
||||
| `member_file`, `member_line`, `member_ordinal` | 최초 contributing surface data member source |
|
||||
| `member_kind`, `elset_name_raw/canonical` | `direct|elset`와 expansion provenance |
|
||||
|
||||
Resolution은 모든 member target을 검증한 뒤 candidate inventory에 commit한다. Facet order는
|
||||
`(instance declaration ordinal, numeric element label, SPOS before SNEG)`의 stable order다.
|
||||
각 facet은 최초 contributing member identity를 보존하고, set/container/thread iteration
|
||||
order는 facet order를 바꾸지 않는다.
|
||||
|
||||
Duplicate rule은 다음과 같다.
|
||||
|
||||
- 같은 surface에서 exact same `(instance, element label, side)`가 direct/ELSET overlap 또는
|
||||
여러 member로 다시 나타나면 하나의 facet으로 normalize하고 stable
|
||||
`duplicate-surface-member-normalized` warning을 최초 identity 뒤에 기록한다. Pressure를 두
|
||||
번 적용하지 않는다.
|
||||
- 같은 surface에서 같은 `(instance, element label)`가 `SPOS`와 `SNEG` 양쪽으로 나타나면
|
||||
unsupported double-sided/conflicting membership이므로 fail-closed한다.
|
||||
- Case-insensitive duplicate surface name declaration은 merge하지 않고 fail-closed한다.
|
||||
- Empty surface, unsupported source type, missing/ambiguous instance/element/set와 cross-scope
|
||||
target은 fail-closed한다.
|
||||
|
||||
Domain은 parse/map 성공 뒤 가능한 한 immutable하며 surface와 element의 stable source label을
|
||||
internal collection index나 equation index로 대체하지 않는다.
|
||||
|
||||
## 5. History Data Mapping
|
||||
|
||||
### 5.1 Step, constraints and load records
|
||||
|
||||
`*STEP`, `*STATIC`, `*BOUNDARY`, `*CLOAD`, `*DSLOAD`는 history data다. Successful mapping 뒤
|
||||
sole Step은 existing procedure/control/constraint/concentrated-load data와 함께 ordered
|
||||
uniform pressure records를 소유한다.
|
||||
|
||||
각 pressure record의 최소 semantic fields는 다음과 같다.
|
||||
|
||||
| field | meaning |
|
||||
| --- | --- |
|
||||
| `step_name_raw/canonical` | sole source step identity; output path는 `Step-1` |
|
||||
| `load_ordinal` | 전체 step load data의 stable source order에서 zero-based ordinal |
|
||||
| `surface_name_raw/canonical` | assembly surface reference source spelling/lookup key |
|
||||
| `load_type` | exact canonical `P` |
|
||||
| `magnitude`, `magnitude_raw` | unscaled signed finite pressure `[F/L^2]`와 source token |
|
||||
| `source_file`, `keyword_line`, `data_line`, `data_ordinal` | keyword/data provenance |
|
||||
|
||||
Multiple valid pressure records는 같아 보여도 distinct이고 `load_ordinal` 순서에서 additive다.
|
||||
Surface facet과 load record의 Cartesian product가 각 active contribution identity를 만든다.
|
||||
Analysis step load factor `lambda`는 source magnitude에 exactly once 적용한다. `lambda=0` 또는
|
||||
`p=0`도 surface/model/current-geometry validation을 생략하지 않는다.
|
||||
|
||||
### 5.2 Output requests
|
||||
|
||||
`*OUTPUT`, `*NODE OUTPUT`, `*ELEMENT OUTPUT` allowlist는 warning 후 no-op이며 아래 mandatory
|
||||
HDF5를 선택·제거하지 않는다. Pressure-only field request, pressure integration-point output,
|
||||
history output과 CSV writer는 없다. Unknown output request가 해석 결과를 바꿀 가능성이
|
||||
있으면 ignored-with-warning가 아니라 fail-closed다.
|
||||
|
||||
## 6. Internal Model Contract
|
||||
|
||||
이 절은 semantic relation만 정의하고 C++ class/API/file ownership을 정하지 않는다.
|
||||
|
||||
| semantic object | required meaning / ownership |
|
||||
| --- | --- |
|
||||
| node | Domain owns source `(part,instance,node label)`, coordinates, stable internal index |
|
||||
| element | Domain owns source `(part,instance,element label,type)`, ordered four-node connectivity, material/section identities |
|
||||
| node/element set | Domain owns scope-qualified case-insensitive name and deterministic expanded source membership |
|
||||
| material/section | Domain owns named finite linear-elastic material and shell section/material/set linkage |
|
||||
| element surface | Domain owns §4.2 immutable named surface and ordered unique facets |
|
||||
| boundary condition | Step owns existing source target, DOF range/value and source order |
|
||||
| concentrated load | Step owns existing nodal target/component/magnitude and source order |
|
||||
| uniform pressure load | Step owns §5.1 surface reference, signed `P` magnitude and load ordinal |
|
||||
| step/procedure | Domain/Step definition owns sole static procedure and linear/nonlinear configuration identity |
|
||||
| output request | parsed warning/no-op record only; mandatory result set는 procedure가 결정 |
|
||||
|
||||
`AnalysisModel`은 current step에서 active elements, facets, pressure records, other loads,
|
||||
constraints, properties/materials를 Domain/Step lifetime 안에서 참조하는 non-owning view다.
|
||||
Domain 또는 surface inventory를 복사하거나 재정렬하지 않는다.
|
||||
|
||||
각 active `(load_ordinal, facet_ordinal)`은 formulation의 element-local `24x1` pressure force와,
|
||||
nonlinear이면 `24x24` external tangent candidate를 만든다. Candidate의 finite/geometry/dimension
|
||||
검증이 끝난 뒤
|
||||
`(load_ordinal, facet_ordinal, instance declaration ordinal, element label, local row[,column])`
|
||||
순서로 stable full-space external generalized load/tangent에 reduce한다. Parallel producer는
|
||||
global storage를 직접 갱신하지 않는다. Full-space completion 뒤에만 free/constrained projection을
|
||||
수행한다. `r=f_int-f_ext`, nonlinear `K=K_int-K_ext`이며 constrained residual은 reaction,
|
||||
free residual은 accepted-equilibrium evidence다.
|
||||
|
||||
## 7. Authoritative HDF5 Schema
|
||||
|
||||
### 7.1 Version and filename decision
|
||||
|
||||
새 HDF5 dataset 또는 schema version은 추가하지 않는다. Pressure는 새로운 recovery quantity가
|
||||
아니라 existing external load이며 기존 result chain에서 관측 가능하다.
|
||||
|
||||
- Linear static: current schema `0`, `<stem>_results.h5`.
|
||||
- Nonlinear static: current schema `1`, `<stem>_results.h5`.
|
||||
- CLI operand/output derivation과 `<stem>_log.txt` procedure log contract는 변경하지 않는다.
|
||||
- 기존 pressure 없는 input은 동일 schema, row order와 mandatory result를 유지한다.
|
||||
- `/metadata/feature_id`는 기존 writer identity
|
||||
`linear-static-mitc4-shell` 또는 `nonlinear-static-newton-raphson`을 유지한다. Pressure
|
||||
feature를 표시하려고 값을 바꾸거나 새 metadata를 만들지 않는다.
|
||||
- `/metadata/source_input_identity`가 exact input content identity를, `/model/elements`가 source
|
||||
instance/label/type을 보존한다. Surface/load-only model dataset은 추가하지 않는다.
|
||||
|
||||
Successful candidate만 same-directory temporary HDF5에 완성, flush, checked close/reopen/self-
|
||||
check 후 final path에 atomic publish한다. 실패 candidate는 accepted state나 final HDF5로
|
||||
commit하지 않으며 prior valid final을 보존하거나 prior final이 없으면 misleading final을
|
||||
남기지 않는다.
|
||||
|
||||
### 7.2 Common dataset conventions
|
||||
|
||||
- Numeric value dtype는 little-endian IEEE `float64`; identity index는 little-endian
|
||||
`uint64`, mask는 `uint8`, text는 variable-length UTF-8다.
|
||||
- Node row `r`는 `/model/nodes.internal_node_id=r`로 join한다. Source comparison은 그 row의
|
||||
`instance_name`와 numeric `source_label`을 사용하며 HDF5 row order만으로 외부 row를
|
||||
맞추지 않는다.
|
||||
- `N`은 node count, `E`는 shell element count, `F`는 committed accepted frame count다.
|
||||
- Schema-v0 field numeric dataset의 common attributes는 `component_names`,
|
||||
`component_unit_dimensions`, `coordinate_system`, `location`, `step_name=Step-1`,
|
||||
`frame_index=0`이다. Schema version은 `/metadata@schema_version=0`이 authoritative다.
|
||||
- Schema-v1 model/frame numeric dataset은 `schema_version=1`, `component_names`,
|
||||
`component_unit_dimensions`, `coordinate_system`, `location`을 가진다. Frame dataset은
|
||||
`step_name=Step-1`, `frame_index`, `increment_index`, `load_factor`, `is_factor_one`도 가진다.
|
||||
|
||||
### 7.3 Linear static schema `0`
|
||||
|
||||
Sole `/steps/Step-1/frames/0`은 completed linear final state이며 procedure load factor 의미는
|
||||
`1.0`이다. Schema `0`은 별도 `load_factor` attribute/dataset을 저장하지 않으므로 이를
|
||||
새로 발명하지 않는다.
|
||||
|
||||
| path | shape / dtype | components, units, coordinates, location | pressure meaning / requirement |
|
||||
| --- | --- | --- | --- |
|
||||
| `/metadata` | group | attrs: `schema_version=0`, `feature_id=linear-static-mitc4-shell`, `solver_version`, `source_input_identity`, `unit_system_label=user-consistent-unspecified`, `coordinate_convention`, `internal_formulation=FESA-MITC4`, `integration_rule`, `step_name=Step-1`, `frame_index=0` | source/procedure identity; mandatory |
|
||||
| `/model/nodes` | `[N]` compound | `internal_node_id:uint64`, `instance_name:utf8`, `source_label:utf8`, `coordinates:float64[3]`; global Cartesian, length | nodal source identity join; mandatory |
|
||||
| `/model/elements` | `[E]` compound | internal element ID, source instance/label/type, four internal node IDs, section/material IDs; formulation `FESA-MITC4` | S4/S4R source identity unchanged; mandatory |
|
||||
| `/model/shell/materials` | `[M]` compound | material ID/name, `E:[F/L^2]`, `nu:[1]` | unchanged material identity |
|
||||
| `/model/shell/sections` | `[S]` compound | section/source/material IDs, thickness `[L]`; centered single layer | unchanged section identity |
|
||||
| `/model/shell/nodal_director` | `[N,3] float64` | `D1,D2,D3`; `1,1,1`; global Cartesian; initial director | unchanged |
|
||||
| `/model/shell/nodal_frame` | `[N,3,3] float64` | `X,Y,Z`, axes `A,B,D`; dimensionless; global Cartesian | unchanged |
|
||||
| `/model/nodal_constraint_mask` | `[N,6] uint8` | order `[UX,UY,UZ,URX,URY,URZ]`; `0=free,1=constrained` | full/free/constrained identity |
|
||||
| `/model/prescribed_displacement` | `[N,6] float64` | `[UX,UY,UZ,URX,URY,URZ]`; `[L,L,L,1,1,1]`; global Cartesian | existing prescribed target |
|
||||
| `/model/shell/midsurface_locations` | `[4,2] float64` | `XI,ETA`; shell-natural; midsurface location | fixed four Gauss rows |
|
||||
| `/model/shell/section_positions` | `[3] float64` | `ZETA`, `BOTTOM,MIDDLE,TOP`; shell-natural | unchanged recovery positions |
|
||||
| `/steps/Step-1/frames/0/nodal/displacement` | `[N,6] float64` | `UX,UY,UZ,URX,URY,URZ`; `[L,L,L,1,1,1]`; global Cartesian; nodal | pressure solution response; mandatory |
|
||||
| `/steps/Step-1/frames/0/nodal/reaction` | `[N,6] float64` | `RF1,RF2,RF3,RM1,RM2,RM3`; `[F,F,F,F*L,F*L,F*L]`; global Cartesian; nodal | full residual, constrained entries physical reaction; pressure included |
|
||||
| `/steps/Step-1/frames/0/element/shell/local_frame` | `[E,4,3,3] float64` | `X,Y,Z`, axes `E1,E2,E3`; dimensionless; global Cartesian; shell-local-frame | unchanged MITC4 recovery identity |
|
||||
| `/steps/Step-1/frames/0/element/shell/generalized_strain` | `[E,4,8] float64` | `E11,E22,G12,K11,K22,K12,G13,G23`; `[1,1,1,1/L,1/L,1/L,1,1]`; shell-local; midsurface | unchanged |
|
||||
| `/steps/Step-1/frames/0/element/shell/section_resultant` | `[E,4,8] float64` | `N11,N22,N12,M11,M22,M12,Q13,Q23`; `[F/L,F/L,F/L,F,F,F,F/L,F/L]`; shell-local; midsurface | unchanged |
|
||||
| `/steps/Step-1/frames/0/element/shell/stress` | `[E,4,3,3] float64` | `S11,S22,S12`; `[F/L^2,F/L^2,F/L^2]`; shell-local; section-position | unchanged; external stress comparison 없음 |
|
||||
| `/steps/Step-1/frames/0/global/energy` | `[1] float64` | `PHYSICAL_STRAIN_ENERGY`; `F*L`; global/global | existing strain energy; pressure-only energy 없음 |
|
||||
| `/steps/Step-1/frames/0/global/equilibrium` | `[6] float64` | `FORCE_1..3,MOMENT_1..3`; `[F,F,F,F*L,F*L,F*L]`; global Cartesian; `global-origin` | applied pressure와 constrained reaction balance 포함 |
|
||||
| `/steps/Step-1/frames/0/global/verification_metrics` | `[3] float64` | `FREE_RESIDUAL_NORMALIZED,FORCE_BALANCE_NORMALIZED,MOMENT_BALANCE_NORMALIZED`; dimensionless; global/verification | existing linear free residual/force/moment evidence |
|
||||
| `/diagnostics` | `[D]` compound | `severity,code,file,line,keyword,entity_identity,message` | sorted successful warnings; mandatory even when empty |
|
||||
|
||||
Schema `0`은 `external_force`, `internal_force`, full free residual을 별도 nodal dataset으로
|
||||
저장하지 않는다. Pressure를 위해 이를 추가하지 않는다. Full residual-derived reaction,
|
||||
global equilibrium와 verification metrics가 existing authoritative projection이다.
|
||||
|
||||
### 7.4 Nonlinear static schema `1`
|
||||
|
||||
`/steps/Step-1/accepted_frames`의 committed row만 frame group을 가진다. Factor zero는
|
||||
`/metadata@factor_zero_is_frame=0`, `factor_zero_load_factor=0.0`인 baseline metadata이고
|
||||
accepted frame이 아니다. Successful final row는 unique `load_factor=1.0` 및
|
||||
`is_factor_one=1`이다.
|
||||
|
||||
| path | shape / dtype | components, units, coordinates, location | pressure meaning / requirement |
|
||||
| --- | --- | --- | --- |
|
||||
| `/metadata` | group | attrs: `schema_version=1`, `feature_id=nonlinear-static-newton-raphson`, `solver_version`, `source_input_identity`, `unit_system_label=user-consistent-unspecified`, `coordinate_convention`, `analysis_procedure=nonlinear-static-full-newton`, `internal_formulation=FESA-MITC4-total-lagrangian`, `integration_rule`, `step_name=Step-1`, accepted-frame indexing, factor-zero attrs | source/procedure identity; mandatory |
|
||||
| `/model/nodes` | `[N]` compound | `internal_node_id:uint64`, `instance_name:utf8`, `source_label:utf8`, `coordinates:float64[3]`; attrs schema `1`, `X,Y,Z`, length, global Cartesian, nodal-reference | reference identity join |
|
||||
| `/model/elements` | `[E]` compound | internal ID, instance/source label/type/formulation, node IDs, section/material IDs; schema `1` | S4/S4R source identity unchanged |
|
||||
| `/model/shell/materials` | `[M]` compound | material ID/name, `E`, `nu`; schema `1`; `[F/L^2,1]`; model-material | unchanged |
|
||||
| `/model/shell/sections` | `[S]` compound | section/source/material IDs, thickness; schema `1`, length, model-shell-section, centered single layer | unchanged |
|
||||
| `/model/shell/nodal_director` | `[N,3] float64` | `D1,D2,D3`; dimensionless; global Cartesian; nodal-initial-director | unchanged |
|
||||
| `/model/shell/nodal_frame` | `[N,3,3] float64` | `X,Y,Z`, axes `A,B,D`; dimensionless; global Cartesian; nodal-initial-frame | unchanged |
|
||||
| `/model/nodal_constraint_mask` | `[N,6] uint8` | semantic order `[UX,UY,UZ,URX,URY,URZ]`; schema `1`; dimensionless; global Cartesian; nodal-constraint | free/constrained projection identity |
|
||||
| `/model/prescribed_displacement_start` | `[N,6] float64` | `UX..URZ`; `[L,L,L,1,1,1]`; global Cartesian; nodal-prescribed-start; `load_factor=0` | baseline constraint state |
|
||||
| `/model/prescribed_displacement_target` | `[N,6] float64` | same; nodal-prescribed-target; `load_factor=1` | factor-one target |
|
||||
| `/model/shell/midsurface_locations` | `[4,2] float64` | `XI,ETA`; dimensionless; shell-natural; midsurface-location | stable GP identity |
|
||||
| `/model/shell/section_positions` | `[3] float64` | `ZETA`, `BOTTOM,MIDDLE,TOP`; shell-natural; section-position | stable section identity |
|
||||
| `/steps/Step-1/accepted_frames` | `[F]` compound | `frame_index:uint64, increment_index:uint64, load_factor:float64, iteration_count:uint64, is_factor_one:uint8`; schema `1` | accepted frame selector |
|
||||
| `/steps/Step-1/frames/<k>/nodal/displacement` | `[N,6] float64` | `UX,UY,UZ,URX,URY,URZ`; `[L,L,L,1,1,1]`; global Cartesian; nodal | pressure solution response and reference source |
|
||||
| `/steps/Step-1/frames/<k>/nodal/triad` | `[N,3,3] float64` | `X,Y,Z`; dimensionless; global Cartesian; nodal-triad | accepted current orientation |
|
||||
| `/steps/Step-1/frames/<k>/nodal/director` | `[N,3] float64` | `D1,D2,D3`; dimensionless; global Cartesian; nodal-director | accepted current director |
|
||||
| `/steps/Step-1/frames/<k>/nodal/generalized_internal_force` | `[N,6] float64` | `FI1,FI2,FI3,MI_PHI1,MI_PHI2,MI_PHI3`; `[F,F,F,F*L,F*L,F*L]`; global Cartesian; nodal | full-space `f_int` |
|
||||
| `/steps/Step-1/frames/<k>/nodal/generalized_external_force` | `[N,6] float64` | `FE1,FE2,FE3,ME_PHI1,ME_PHI2,ME_PHI3`; same units; global Cartesian; nodal | full-space `f_ext`; pressure contribution의 rotational entries는 exact zero |
|
||||
| `/steps/Step-1/frames/<k>/nodal/generalized_residual` | `[N,6] float64` | `RU1,RU2,RU3,RPHI1,RPHI2,RPHI3`; same units; global Cartesian; nodal | `r=f_int-f_ext`; mask와 함께 accepted free residual을 reconstruct |
|
||||
| `/steps/Step-1/frames/<k>/nodal/reaction` | `[N,6] float64` | `RF1,RF2,RF3,RM1,RM2,RM3`; same units; global Cartesian; nodal | constrained residual; rotational values는 spatial physical moment projection |
|
||||
| `/steps/Step-1/frames/<k>/element/shell/local_frame` | `[E,4,3,3] float64` | `X,Y,Z`, axes `E1,E2,E3`; dimensionless; global Cartesian; shell-local-frame | unchanged MITC4 recovery |
|
||||
| `/steps/Step-1/frames/<k>/element/shell/generalized_strain` | `[E,4,8] float64` | `E11,E22,G12,K11,K22,K12,G13,G23`; `[1,1,1,1/L,1/L,1/L,1,1]`; shell-local; midsurface | unchanged |
|
||||
| `/steps/Step-1/frames/<k>/element/shell/section_resultant` | `[E,4,8] float64` | `N11,N22,N12,M11,M22,M12,Q13,Q23`; `[F/L,F/L,F/L,F,F,F,F/L,F/L]`; shell-local; midsurface | unchanged |
|
||||
| `/steps/Step-1/frames/<k>/element/shell/stress` | `[E,4,3,3] float64` | `S11,S22,S12`; `[F/L^2,F/L^2,F/L^2]`; shell-local; section-position | unchanged; external stress comparison excluded |
|
||||
| `/steps/Step-1/frames/<k>/global/energy` | `[1] float64` | `PHYSICAL_STRAIN_ENERGY`; `F*L`; global/global | existing physical strain energy; pressure-only energy 없음 |
|
||||
| `/steps/Step-1/frames/<k>/global/equilibrium` | `[6] float64` | `FORCE_1..3,MOMENT_1..3`; `[F,F,F,F*L,F*L,F*L]`; global Cartesian; `global-balance-error` | current `X+u` arm과 spatial moment의 applied-plus-constrained-reaction balance error |
|
||||
| `/diagnostics` | `[D]` compound | `severity,code,file,line,keyword,entity_identity,message`; schema `1` | sorted successful warnings; mandatory even when empty |
|
||||
|
||||
모든 frame numeric dataset은 §7.2의 schema-v1 frame attributes를 가진다. Accepted free
|
||||
residual은 새 summary dataset이 아니라 `generalized_residual`을
|
||||
`nodal_constraint_mask==0`으로 project한 finite generalized force/moment channels다. Pressure
|
||||
rotational generalized external contribution이 exact zero여도 reaction의 physical moment와
|
||||
`global/equilibrium` moment는 nodal force arm 때문에 nonzero일 수 있다.
|
||||
|
||||
## 8. FESA HDF5 to Reference CSV Comparison Mapping
|
||||
|
||||
### 8.1 Immutable artifacts and accepted frame
|
||||
|
||||
| role | exact path | disposition |
|
||||
| --- | --- | --- |
|
||||
| input | `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure.inp` | required read-only |
|
||||
| displacement | `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure displacements.csv` | required blocking/warning source |
|
||||
| reaction | `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure reactions.csv` | `review-only`; verdict family 없음 |
|
||||
| stress | `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure stresses.csv` | `excluded`; comparator family 없음 |
|
||||
|
||||
Comparator는 schema `1` HDF5의 `/steps/Step-1/accepted_frames`에서
|
||||
`load_factor==1.0 && is_factor_one==1`인 row가 정확히 하나인지 검사한다. 그 row의 exact
|
||||
`frame_index=k`를 사용해
|
||||
`/steps/Step-1/frames/<k>/nodal/displacement`를 읽는다. Step path는 exact `Step-1`이어야 하며
|
||||
다른 accepted factor-one row, missing frame group 또는 frame attribute/table 불일치는 tolerance
|
||||
전 실패다.
|
||||
|
||||
### 8.2 Deterministic node/component projection
|
||||
|
||||
1. `/model/nodes`는 exactly `729` rows여야 한다. `internal_node_id`는 unique `0..728`이고
|
||||
displacement first dimension과 일치해야 한다. 각 displacement row는 동일 internal ID의
|
||||
model node에 join한다.
|
||||
2. HDF5 source key는 raw `instance_name`, numeric-parsed raw `source_label`이다. Expected
|
||||
instance는 `Part-1-1`, labels는 `1..729` exactly once다.
|
||||
3. CSV parser는 raw header와 raw text cell을 report에 보존한다. Header recognition에서만
|
||||
leading/trailing ASCII whitespace를 trim하며 trimmed header set은 exact
|
||||
`Frame`, `Part Instance Name`, `Node Label`, `U-U1`, `U-U2`, `U-U3`, `UR-UR1`,
|
||||
`UR-UR2`, `UR-UR3`이어야 한다. Duplicate/unknown extra/missing header는 precheck failure다.
|
||||
4. Text identity cell도 comparison key를 만들 때만 ASCII trim한다. Instance는 ASCII
|
||||
case-insensitive하게 canonicalize하되 HDF5/CSV raw spelling을 모두 보존한다. Node Label은
|
||||
positive decimal numeric source label로 parse한다. Frame은 trimmed exact observed text
|
||||
`Increment 10: Step Time = 1.000` 하나뿐이어야 한다.
|
||||
5. Raw wide rows는 exactly `729`이고 key
|
||||
`(Frame, canonical instance, numeric node label)`는 unique다. CSV file order를 HDF5 row
|
||||
order와 맞추지 않는다.
|
||||
6. Wide row를 아래 logical component row로 deterministic하게 expand한다. Order는
|
||||
`(numeric node label ascending, component table order)`이며 matching identity는
|
||||
`(case_id, Step-1, factor-one frame, canonical instance, node label, logical component)`다.
|
||||
|
||||
| HDF5 column index/name | CSV column | logical component | units / coordinates | family / disposition |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| `0 / UX` | `U-U1` | `U1` | length, global Cartesian | `pressure_nodal_translation_blocking` / `blocking` |
|
||||
| `1 / UY` | `U-U2` | `U2` | length, global Cartesian | same / `blocking` |
|
||||
| `2 / UZ` | `U-U3` | `U3` | length, global Cartesian | same / `blocking` |
|
||||
| `3 / URX` | `UR-UR1` | `UR1` | dimensionless radian convention, global component | `pressure_nodal_rotation_warning` / `warning-only` |
|
||||
| `4 / URY` | `UR-UR2` | `UR2` | same | same / `warning-only` |
|
||||
| `5 / URZ` | `UR-UR3` | `UR3` | same | same / `warning-only` |
|
||||
|
||||
Expected translation logical rows are `729*3=2,187`; expected rotation logical rows are
|
||||
`729*3=2,187`. 두 disposition은 같은 family로 합치지 않는다.
|
||||
|
||||
### 8.3 Prechecks and tolerance
|
||||
|
||||
다음 순서의 precheck가 모두 통과한 뒤에만 tolerance를 계산한다.
|
||||
|
||||
1. exact required artifact path/readability와 case/input pairing;
|
||||
2. HDF5 `/metadata@schema_version=1`, source identity, exact `Step-1`, unique factor-one accepted
|
||||
frame와 matching frame attributes;
|
||||
3. required dataset existence, dtype/rank/shape/attribute/component order;
|
||||
4. HDF5 node internal/source identity uniqueness와 exact instance/node inventory;
|
||||
5. CSV trimmed header set, exact factor-one Frame text, instance/node wide-row inventory;
|
||||
6. missing/extra/duplicate HDF5 or CSV source key/component와 cardinality `729/2,187/2,187`;
|
||||
7. every HDF5/CSV required numeric value의 finite C-locale parse.
|
||||
|
||||
Wrong case, step, frame, factor, instance, node 또는 component는 row omission, averaging,
|
||||
duplicate collapse, fallback index와 zero clamp로 보정하지 않는다. Shared identity/schema
|
||||
precheck failure는 warning family만 관련되어도 comparison non-success다. Shared prechecks가
|
||||
통과한 뒤 translation row/RMS failure는 blocking verdict를 실패시키고 rotation row/RMS
|
||||
failure는 deterministic warning만 남긴다.
|
||||
|
||||
각 family는 변경 없이 `docs/TOLERANCE.md`를 사용한다. Reference-only
|
||||
`S=max(abs(reference))`, `B=0.01*S`; `abs(reference)<=B` row는
|
||||
`abs(fesa-reference)<=B`, 나머지는 relative error `<=0.05`; family
|
||||
`RMS(error)/S<=0.01`을 모두 통과해야 한다. Boundary는 inclusive다. Independent absolute
|
||||
gate, `max(1,S)`, floor, clamp와 calibration은 없다. `S=0`이면 FESA family도 exact zero만
|
||||
통과한다.
|
||||
|
||||
Reaction CSV는 local distribution의 optional review-only inventory이며 HDF5
|
||||
`nodal/reaction`과 numerical verdict family를 만들지 않는다. Stress CSV는 excluded이며
|
||||
`element/shell/stress` comparator를 만들지 않는다. Internal reaction/free residual/global
|
||||
equilibrium evidence는 각각 approved internal gate로 유지된다.
|
||||
|
||||
## 9. Validation and Deterministic Diagnostics
|
||||
|
||||
### 9.1 Ordered validation pipeline
|
||||
|
||||
Validation은 다음 순서를 고정한다. 앞 단계 실패 시 뒤 단계의 partial semantic state나
|
||||
pressure contribution을 commit하지 않는다.
|
||||
|
||||
1. ASCII/line-length/keyword continuation, comma split, empty-field, cardinality와 finite numeric
|
||||
lexical validation;
|
||||
2. keyword parameter allowlist, wrapper/scope와 sole-step/static procedure placement;
|
||||
3. case-insensitive part/instance/set/surface name uniqueness와 visibility;
|
||||
4. direct target resolution, flat assembly ELSET expansion, missing/ambiguous/cyclic/cross-scope
|
||||
target rejection;
|
||||
5. source `S4|S4R`, four-node connectivity, `SPOS|SNEG`와 unique/conflicting membership rules;
|
||||
6. nonempty immutable surface candidate commit;
|
||||
7. step-level `DSLOAD` surface reference, `P`, finite signed magnitude, record/source order와
|
||||
approved linear/nonlinear procedure;
|
||||
8. finite model units/configuration prerequisites와 full scatter/dimension identity;
|
||||
9. formulation/numerical-review의 reference/current geometry gate
|
||||
`tau_J=1.0e-12`, finite force/tangent/local contribution;
|
||||
10. stable full-space reduction finite check, free/constrained projection와 accepted state/result
|
||||
recovery;
|
||||
11. complete HDF5 candidate self-check와 atomic finalization.
|
||||
|
||||
### 9.2 Failure categories and stable diagnostic fields
|
||||
|
||||
| category / example code family | stage and disposition | CLI category |
|
||||
| --- | --- | --- |
|
||||
| `input-syntax`, `invalid-cardinality`, `invalid-number`, `invalid-input-character` | lexical/data failure | `3=input` |
|
||||
| `unsupported-keyword`, `unsupported-parameter`, `unsupported-surface-scope`, `unsupported-load-type`, `unsupported-procedure` | approved subset 밖; fail-closed | `3=input` |
|
||||
| `duplicate-name`, `missing-reference`, `ambiguous-reference`, `cyclic-elset`, `cross-scope-target`, `empty-surface` | semantic target failure | `4=model` |
|
||||
| `unsupported-element-type`, `unsupported-surface-side`, `conflicting-surface-membership`, `invalid-connectivity` | facet/model failure | `4=model` |
|
||||
| `nonfinite-model-value`, `invalid-reference-surface-geometry` | pre-analysis model validation | `4=model` |
|
||||
| `invalid-current-surface-geometry`, `nonfinite-pressure-contribution`, `nonfinite-pressure-tangent`, `invalid-scatter`, `invalid-reduction` | trial/assembly failure; candidate 폐기 | `5=solver` |
|
||||
| `hdf5-write-failure`, `hdf5-finalization-failure` | prior final preservation / no partial final | `6=HDF5` |
|
||||
|
||||
각 diagnostic은 existing external fields
|
||||
`severity`, `code`, `file`, `line`, `keyword`, `entity_identity`, `message`를 가진다. Pressure
|
||||
failure의 semantic identity는 가능한 항목을 omission 없이 deterministic field order로
|
||||
`entity_identity`에 보존한다:
|
||||
|
||||
```text
|
||||
surface_raw; surface_canonical; load_type; part_raw; instance_raw;
|
||||
element_label; source_element_type; side; member_ordinal; load_ordinal
|
||||
```
|
||||
|
||||
Lexical failure처럼 아직 알 수 없는 downstream field만 empty다. Keyword line과 data line이
|
||||
다르면 `line`은 실제 failing data line이고 message가 keyword declaration line을 포함한다.
|
||||
Raw spelling과 canonical lookup key를 모두 유지한다. Diagnostics는
|
||||
`(file source order, line, member/load ordinal, code, entity identity)`의 stable order로
|
||||
stderr와 successful-output `/diagnostics`에 기록한다.
|
||||
|
||||
Same-side surface duplicate normalization만 warning이며 unique facet 하나를 만든다. Identical
|
||||
DSLOAD row는 warning/normalization 대상이 아니라 legal distinct additive record다. Conflicting
|
||||
side duplicate, duplicate surface declaration 또는 ambiguous target은 error다. Unsupported
|
||||
variant를 silently ignore하거나 `CLOAD`/`DLOAD`/다른 surface 의미로 변환하지 않는다.
|
||||
|
||||
## 10. Requirement Traceability and Downstream Handoff
|
||||
|
||||
### 10.1 Requirement-to-I/O trace
|
||||
|
||||
| requirement | I/O decision / verification owner |
|
||||
| --- | --- |
|
||||
| `FESA-REQ-SHELL-PRESSURE-001` | §§2.3–2.5 exact `SURFACE`/`DSLOAD P` grammar; Stage 6 parser/semantic tests |
|
||||
| `FESA-REQ-SHELL-PRESSURE-002` | §2.4 signed finite scalar `[F/L^2]`; numeric boundary tests |
|
||||
| `FESA-REQ-SHELL-PRESSURE-003` | §4.2 deterministic direct/ELSET facet identity/order; semantic tests |
|
||||
| `FESA-REQ-SHELL-PRESSURE-004` | §§2.2, 4.2 only source `S4|S4R`, `SPOS|SNEG`; rejection tests |
|
||||
| `FESA-REQ-SHELL-PRESSURE-005` | §§5–6 preserve signed `P`/side without abs/clamp; analytical sign tests |
|
||||
| `FESA-REQ-SHELL-PRESSURE-006` | §4.2 source connectivity/type/side identity; formulation geometry tests |
|
||||
| `FESA-REQ-SHELL-PRESSURE-007` | §2.5 linear reference configuration and schema `0`; linear patch tests |
|
||||
| `FESA-REQ-SHELL-PRESSURE-008` | §2.5 nonlinear current configuration, schema `1`; objectivity tests |
|
||||
| `FESA-REQ-SHELL-PRESSURE-009` | §6 force/tangent semantic path and nonlinear external tangent; FD tests |
|
||||
| `FESA-REQ-SHELL-PRESSURE-010` | §5.1 exact-once load factor; factor `0,0.5,1` tests |
|
||||
| `FESA-REQ-SHELL-PRESSURE-011` | §6 local candidate→stable full-space→projection; assembly tests |
|
||||
| `FESA-REQ-SHELL-PRESSURE-012` | §§6–7 residual/reaction/free projection; reaction/equilibrium tests |
|
||||
| `FESA-REQ-SHELL-PRESSURE-013` | §§4.2, 5.1, 6, 9 deterministic identity/reduction/result/diagnostic order tests |
|
||||
| `FESA-REQ-SHELL-PRESSURE-014` | §2.2 allowlist and §§2.3–2.5 fail-closed matrix |
|
||||
| `FESA-REQ-SHELL-PRESSURE-015` | §§4.2, 9 missing/ambiguous/empty/duplicate/scope rules; negative tests |
|
||||
| `FESA-REQ-SHELL-PRESSURE-016` | §§2.5, 9 procedure/nonfinite/geometry failure; atomicity tests |
|
||||
| `FESA-REQ-SHELL-PRESSURE-017` | §9 stable diagnostic fields/order and §7 atomic HDF5; failure tests |
|
||||
| `FESA-REQ-SHELL-PRESSURE-018` | §7 no new dataset/version; schema-v0/v1 regression tests |
|
||||
| `FESA-REQ-SHELL-PRESSURE-019` | §§7.3–7.4 existing nodal/residual/reaction/equilibrium/MITC4 paths |
|
||||
| `FESA-REQ-SHELL-PRESSURE-020` | §7 linear observable projection plus approved analytical suite; Stage 6 analysis tests |
|
||||
| `FESA-REQ-SHELL-PRESSURE-021` | §7.4 full nonlinear vectors/free residual/global balance; Stage 6 nonlinear tests |
|
||||
| `FESA-REQ-SHELL-PRESSURE-022` | §8.1 exact immutable input/CSV paths and exact stored inventory prechecks |
|
||||
| `FESA-REQ-SHELL-PRESSURE-023` | §§8.1–8.3 exact HDF5 frame/node/component projection, U blocking/UR warning |
|
||||
| `FESA-REQ-SHELL-PRESSURE-024` | §8 reaction review-only, stress excluded, no comparator family |
|
||||
|
||||
Coverage: normative requirements `24`, traced requirements `24`, gaps `0`.
|
||||
|
||||
### 10.2 Implementation Planning handoff through Coordinator
|
||||
|
||||
Stage 6 plan은 API/file design 전에 다음 acceptance items를 자기완결적 TDD Step으로 나눠야
|
||||
한다.
|
||||
|
||||
1. Exact line/ASCII/comma/continuation/name/numeric grammar와 valid reference-style assembly
|
||||
ELSET surface, direct qualified member, S4/S4R, SPOS/SNEG parser acceptance.
|
||||
2. Every table-declared unsupported keyword/parameter/scope/member/load/procedure와 malformed
|
||||
cardinality/numeric failure의 stable category/source diagnostic.
|
||||
3. Direct/ELSET/multi-instance expansion, same-side normalization warning, conflicting-side/name/
|
||||
empty/missing/ambiguous/cyclic/cross-scope failure와 immutable deterministic facet order.
|
||||
4. Distinct additive pressure record/source order, exact-once factor, AnalysisModel non-owning
|
||||
lifetime와 element-local→full-space→projection order.
|
||||
5. Nonfinite/geometry/scatter/reduction failure, deterministic serial/parallel contribution and
|
||||
diagnostic order, failed-state/final-file atomicity.
|
||||
6. Existing schema `0`/`1` writer regression: no pressure-only dataset/version change; exact paths,
|
||||
shapes, dtypes, attributes, source identity, frame/factor and mandatory finite quantities.
|
||||
7. Exact schema-v1 HDF5→wide CSV projection, header/raw identity policy, `729`/`2,187` inventories,
|
||||
all prechecks, family dispositions, boundary/zero-scale common tolerance tests.
|
||||
8. Reaction CSV review-only와 stress CSV excluded; neither creates a numerical verdict family.
|
||||
|
||||
Private data layout, exact diagnostic code spelling within the normative category families and test
|
||||
file ownership are Stage 6 implementation-planning decisions. They may not change supported syntax,
|
||||
public compatibility, physics/sign, source identity, ordering, HDF5 schema, failure category,
|
||||
reference disposition 또는 tolerance.
|
||||
|
||||
### 10.3 Open issues and stop condition
|
||||
|
||||
- Critical user question: 없음.
|
||||
- Blocking I/O gap: 없음.
|
||||
- Accepted limitation: stored external case는 S4/SPOS/positive `P` nonlinear displacement만
|
||||
검증한다. S4R, sign reversal, linear pressure, objectivity와 tangent는 approved blocking
|
||||
internal tests가 담당하며 새로운 reference artifact를 만들지 않는다.
|
||||
- This document stops at I/O definition. Parser/C++ API implementation, implementation plan,
|
||||
reference execution/comparison, physics/release verdict는 수행하지 않았다.
|
||||
@@ -0,0 +1,254 @@
|
||||
# Shell Surface Pressure Load Numerical Review
|
||||
|
||||
## 1. Metadata
|
||||
|
||||
- feature_id: `shell-surface-pressure-load`
|
||||
- source_formulation: `docs/shell-surface-pressure-load/formulation.md`
|
||||
- source_requirements: `docs/shell-surface-pressure-load/requirements.md`
|
||||
- source_research: `docs/shell-surface-pressure-load/research.md`
|
||||
- status: `pass-for-io-definition`
|
||||
- owner_agent: `numerical-review-agent`
|
||||
- date: `2026-08-30`
|
||||
- reviewed_requirement_range: `FESA-REQ-SHELL-PRESSURE-001`–`FESA-REQ-SHELL-PRESSURE-024`
|
||||
- external_tolerance_authority: `docs/TOLERANCE.md`
|
||||
|
||||
## 2. Review Verdict
|
||||
|
||||
**Verdict: `pass-for-io-definition`.**
|
||||
|
||||
Blocking formulation defect, research gap, reference-artifact gap 또는 critical user decision은 없다.
|
||||
Pressure virtual work, discrete force, exact current-area derivative, residual/tangent sign과
|
||||
reference/current geometry 구분은 서로 일관된다. S4/S4R 공통 `2x2` rule은 FESA-owned
|
||||
discrete pressure force와 tangent를 정확히 적분하고, 기존 full unsymmetric nonlinear tangent
|
||||
solver와 호환된다. 이 verdict는 Stage 5가 I/O contract를 정의할 수 있다는 뜻이며 구현,
|
||||
reference agreement 또는 release approval이 아니다.
|
||||
|
||||
## 3. Critical Findings
|
||||
|
||||
### 3.1 Confirmed defects
|
||||
|
||||
없음.
|
||||
|
||||
### 3.2 Independently confirmed findings
|
||||
|
||||
1. Connectivity-positive area vector `a=g_xi x g_eta`, `s=+1` for `SPOS`, `s=-1` for
|
||||
`SNEG`와 `f_i=-lambda*p*s*integral(N_i*a)`의 조합은 positive `P`가 selected normal의
|
||||
반대 방향으로 작용하게 한다. `p` 또는 `s` 하나만 반전하면 force, moment와 nonlinear
|
||||
tangent가 반전하고 둘을 함께 반전하면 원래 부호다.
|
||||
2. `delta W_p=sum(delta u_i dot f_i)`는 식 (4)의 surface virtual work와 동일하다.
|
||||
`sum N_i=1`로 nodal resultant 식 (23)이, `x_h=sum N_i*x_i`로 current/reference arm을
|
||||
쓰는 moment 식 (22)가 직접 따른다. 승인된 midsurface/no-offset 범위에서는 pressure가
|
||||
nodal rotation에 의존하지 않으므로 rotational force entries와 tangent rows/columns가
|
||||
exact zero인 계약이 맞다.
|
||||
3. `Da[d]=sum_j(-N_j,xi*[g_eta]_x+N_j,eta*[g_xi]_x)d_j`의 cross/skew 부호가 맞다.
|
||||
따라서 external derivative 식 (14)는 `df_ext/du`이고, `r=f_int-f_ext`에 대한 pressure
|
||||
residual directional derivative는 `-K_ext*d`, Newton tangent는 `K_int-K_ext`다.
|
||||
4. 식 (14)의 open-facet element operator는 일반적으로 nonsymmetric이다. Silent
|
||||
symmetrization, symmetric-triangle storage 또는 SPD 가정은 금지한다. Existing nonlinear
|
||||
path는 full CSR과 oneMKL PARDISO `mtype=11`을 사용하므로 이 계약을 수용한다.
|
||||
5. Bilinear surface mapping에서 `a`는 `xi,eta`의 affine vector다. `N_i*a`와 식 (19)의
|
||||
scalar component는 각 natural coordinate에서 차수가 최대 2이므로 tensor-product
|
||||
`2x2` Gauss rule은 force와 exact derivative를 적분한다. 이는 Abaqus S4/S4R 내부
|
||||
integration과의 동등성 주장이 아니다.
|
||||
6. Reference geometry는 analysis 시작 전, nonlinear current geometry는 매 trial에서 같은
|
||||
chord/mean/corner/Gauss 규칙으로 검사한다. Connectivity reorder, normal flip, absolute-area
|
||||
repair 또는 reference-normal dot test가 없으므로 proper large rigid rotation을 허용하면서
|
||||
fold, local inversion, collapse와 nonfinite geometry를 fail closed한다.
|
||||
|
||||
### 3.3 Open questions
|
||||
|
||||
Critical open question은 없다. 직접 적용 가능한 public S4/S4R follower-pressure target이
|
||||
없다는 `research.md`의 `OI-01`은 analytical/tangent/internal-equilibrium suite와 exact stored
|
||||
case로 보완되는 disclosed nonblocking limitation이다.
|
||||
|
||||
## 4. Numerical Risk Assessment
|
||||
|
||||
| risk label | assessment | blocking evidence / disposition |
|
||||
| --- | --- | --- |
|
||||
| `rigid_body_modes` | Pressure는 support 또는 artificial stiffness가 아니다. Unconstrained patch의 six rigid modes를 regularization으로 숨기면 안 된다. | supported patch solution과 별도로 unconstrained singular behavior 및 pressure rigid-translation action을 검사한다. |
|
||||
| `patch_test` | Stored case만으로 sign, S4R 또는 exact resultant를 분리할 수 없다. | Flat/distorted S4/S4R의 resultant, moment, side/sign, reaction과 mesh subdivision test가 blocking이다. |
|
||||
| `symmetry` | `K_ext`는 일반적으로 nonsymmetric이고 global closure 조건이 우연히 symmetry를 만들 수 있다. | 독립 식 (14) matrix oracle, nonsymmetric open-patch precondition과 full-matrix assembly가 blocking이다. Symmetrization 금지. |
|
||||
| `positive_definiteness` | `K_int-K_ext`는 follower loading에서 positive definite일 필요가 없다. | Existing unsymmetric tangent solver를 사용하며 pivot perturbation, SPD fallback 또는 hidden regularization을 허용하지 않는다. |
|
||||
| `hourglass` | Pressure force/tangent는 S4/S4R 모두 `2x2`라 pressure under-integration mode를 만들지 않는다. | Existing MITC4 drilling/hourglass policy는 변경하지 않는다. Source `S4R`은 reduced pressure integration을 뜻하지 않는다. |
|
||||
| `shear_locking` | Existing MITC4 internal kinematics의 위험이며 external pressure interpolation의 결함이 아니다. | Existing shell evidence를 보존하고 pressure kernel을 locking correction으로 바꾸지 않는다. |
|
||||
| `volumetric_locking` | Pressure kernel에는 volumetric constitutive mode가 없다. | `N/A`; material/section scope를 확장하지 않는다. |
|
||||
| `distortion` | Warped/distorted bilinear patch는 pointwise vector area와 consistent tangent가 필요하다. | Mean, four corners와 four Gauss points의 dimensionless validity 및 distorted analytical/FD tests가 blocking이다. 추가 calibrated distortion portfolio는 요구하지 않는다. |
|
||||
| `singular_jacobian` | Collapsed, folded, inverted 또는 nonfinite surface에서는 normal/area와 force가 유효하지 않다. | §6.1의 strict `tau_J` gate를 force/tangent 평가 전에 적용하고 failed candidate를 commit하지 않는다. |
|
||||
| `conditioning` | Near-collapse와 extreme aspect ratio는 normalization 및 tangent conditioning을 악화한다. | Chord-relative gate와 finite-first checks를 사용한다. Absolute length floor, `max(1,...)` 또는 clamp는 금지한다. |
|
||||
| `convergence` | Force와 tangent의 common sign error는 FD만 통과할 수 있고, tangent omission은 full Newton 수렴을 악화한다. | Independent sign/resultant oracle, external-force 및 residual FD, accepted free residual과 global balance를 모두 통과해야 한다. |
|
||||
|
||||
## 5. Consistency Checks
|
||||
|
||||
| check | result | independent evidence |
|
||||
| --- | --- | --- |
|
||||
| units and dimensions | pass | `p:[F/L^2]`, `a:[L^2]`, `f:[F]`, translational `K_ext:[F/L]`; generalized rotational force의 단위는 `[F L]`이고 값은 exact zero다. |
|
||||
| matrix/vector dimensions | pass | `q_e,f_e`는 `24x1`, `E_i`는 `3x24`, `K_ij`는 `3x3`, `K_e`는 `24x24`; four translation blocks와 exact-zero rotational blocks가 일치한다. |
|
||||
| signs | pass | `SPOS/SNEG`, positive/negative `p`, external force, reaction, `r=f_int-f_ext`, `K=K_int-K_ext`가 하나의 sign chain을 이룬다. |
|
||||
| DOF ordering and constraints | pass | Global nodal order `[UX,UY,UZ,URX,URY,URZ]`; full-space stable assembly 후 free/constrained projection; constrained residual은 reaction, free residual은 equilibrium evidence다. |
|
||||
| coordinates and transforms | pass | Geometry/force/reaction/balance는 global Cartesian; pressure mapping에는 physical in-plane inverse Jacobian이 필요 없다. 기존 MITC4 local frame, `B`와 recovery transform은 변경하지 않는다. |
|
||||
| kinematic / `B` operator | pass | New load kinematics는 midsurface positional mapping과 식 (9)–(10)뿐이다. `B_MITC4`는 internal strain용이며 pressure force/tangent에 혼합되지 않는다. |
|
||||
| constitutive contract | pass | Pressure는 `D`, stress update, thickness와 material state에 독립이다. Existing linear-isotropic MITC4 internal force/tangent/recovery를 변경하지 않는다. |
|
||||
| Jacobian / geometry | pass with fixed decision | `ell_e`, mean area, corner/Gauss signed projection과 finite checks가 충분하며 final `tau_J=1.0e-12`를 §6.1에서 고정한다. |
|
||||
| integration | pass | S4/S4R force와 tangent 모두 fixed-order four-point `2x2`, `w_q=1`; polynomial exactness와 same-rule consistency 확인. |
|
||||
| tangent symmetry | pass | General nonsymmetry가 예상되며 full unsymmetric solver path와 일치한다. Symmetric storage 또는 averaging은 계약 위반이다. |
|
||||
| output locations | pass | Nodal global displacement/rotation, full residual/reaction, factor-one global balance와 existing MITC4 result locations만 사용한다. Pressure-only recovery row는 없다. |
|
||||
| deterministic identity | pass | Stable `(load source order, facet order, instance, element label, source type, side, local row[,column])`, exact-once local completion, fixed reduction, full-space-before-projection 계약이 완전하다. |
|
||||
|
||||
## 6. Verification Readiness
|
||||
|
||||
### 6.1 Geometry validity decision
|
||||
|
||||
Final single threshold is
|
||||
|
||||
\[
|
||||
\boxed{\tau_J=1.0\times10^{-12}}.
|
||||
\]
|
||||
|
||||
Formulation 식 (20)–(21)의 모든 strict inequality에 동일 값을 사용한다. 즉
|
||||
`||bar(a)||/ell_e^2 > tau_J`와 four corners plus four Gauss points의
|
||||
`a(z) dot bar(n)/ell_e^2 > tau_J`가 모두 필요하다. 값이 threshold와 같으면 fail이다.
|
||||
모든 coordinate, chord, tangent, area, normalized mean, integrand, accumulated vector/matrix는
|
||||
finite여야 하고 `ell_e=0`은 즉시 fail이다. 이 값은 double roundoff보다 약 4,500배 큰
|
||||
dimensionless guard이며 별도 aspect-ratio calibration gate를 만들지 않는 최소 fail-closed
|
||||
선택이다. Stored Abaqus value에 맞춰 조정하지 않았고 absolute length floor도 없다.
|
||||
|
||||
### 6.2 Analytical arithmetic decisions
|
||||
|
||||
Configuration `c`에서 다음 unclamped scales를 쓴다.
|
||||
|
||||
\[
|
||||
A_\Sigma=\sum_qw_q\|a_c(q)\|_2,\qquad
|
||||
F_\Sigma=|\lambda p|A_\Sigma,
|
||||
\]
|
||||
|
||||
\[
|
||||
M_\Sigma=|\lambda p|\sum_qw_q
|
||||
\|x_h(q)-O\|_2\|a_c(q)\|_2,\qquad
|
||||
K_\Sigma=F_\Sigma/\ell_e.
|
||||
\]
|
||||
|
||||
- Natural nodes와 four Gauss points에서 `|sum_i N_i-1|<=1e-14` 및
|
||||
`|sum_i N_i,xi|, |sum_i N_i,eta|<=1e-14`; nodal Kronecker values는 exact `0/1`이다.
|
||||
- 식 (23) resultant error는 `||error||_2/F_Sigma<=1e-12`, 식 (22) moment error는
|
||||
`||error||_2/M_Sigma<=1e-12`다.
|
||||
- Side/sign reversal, double reversal, `lambda={0,0.5,1}` proportionality, flat analytical
|
||||
force/reaction과 mesh/order invariance도 해당 `F_Sigma` 또는 `M_Sigma`로 `<=1e-12`다.
|
||||
- Scale이 exact zero이면 expected와 computed vector가 모두 exact zero여야 한다. `p=0`은
|
||||
force/tangent exact zero지만 geometry/model validation을 우회하지 않는다.
|
||||
- Rotation entries와 tangent rotation rows/columns은 exact zero다. Rigid-translation tangent
|
||||
action은 direction의 maximum nodal translation을 `ell_e`로 scaling한 뒤
|
||||
`||K_ext*d||_2/F_Sigma<=1e-12`; `F_Sigma=0`이면 exact zero다.
|
||||
|
||||
### 6.3 Centered directional tangent decision
|
||||
|
||||
Nonzero deterministic translational direction `d`에 대해
|
||||
`D=max_i||d_i||_2`와 `dhat_i=ell_e*d_i/D`를 사용한다. Dimensionless perturbation is
|
||||
|
||||
\[
|
||||
\boxed{h=1.0\times10^{-5}},\qquad u^\pm=u\pm h\,\hat d.
|
||||
\]
|
||||
|
||||
Both perturbed surfaces must independently pass §6.1. Define
|
||||
|
||||
\[
|
||||
d_{FD}=\frac{f^{ext}(u^+)-f^{ext}(u^-)}{2h},\quad
|
||||
d_A=K^{ext}(u)\hat d,\quad
|
||||
S_D=\max(\|d_{FD}\|_2,\|d_A\|_2).
|
||||
\]
|
||||
|
||||
If `S_D>0`, require `||d_FD-d_A||_2/S_D<=1e-8`; if `S_D=0`, both actions must be
|
||||
exact zero. The pressure-residual check independently compares centered `D(-f_ext)` with
|
||||
`-K_ext*dhat` by the same rule. A nonzero-pressure non-rigid direction must have `S_D>0` so an
|
||||
accidentally zero oracle cannot pass. S4/S4R, SPOS/SNEG와 positive/negative `p`를 각각 다룬다.
|
||||
`p=0`, rigid translation and rotation-only directions use their stated zero rules rather than this
|
||||
relative branch. This fixed centered rule reflects the quadratic current-area mapping and is not
|
||||
selected from stored reference results.
|
||||
|
||||
### 6.4 Objectivity and current-area decisions
|
||||
|
||||
- Translation test uses finite `||c||_2<=10*ell_e`. Force/area invariance and tangent invariance
|
||||
must pass normalized `<=1e-12` using `F_Sigma`, `A_Sigma`, `K_Sigma`; zero scales require exact zero.
|
||||
- Proper rigid rotation uses an independently constructed orthogonal `Q`, `det(Q)=+1`, including a
|
||||
`120 deg` non-coordinate-axis rotation. Require force covariance, vector-area covariance, scalar
|
||||
area invariance and `T K T^T` tangent covariance `<=1e-12` with the same unclamped scales.
|
||||
The rotated geometry must remain valid; reference-global-normal comparison is forbidden.
|
||||
- A planar current patch with homogeneous in-plane scale `gamma=1.25` must produce area and total
|
||||
pressure resultant magnitude factors `gamma^2` within `<=1e-12`; pressure scalar and source
|
||||
identity remain unchanged.
|
||||
- The open distorted-patch tangent oracle must use a case whose independent 식 (14) has nonzero
|
||||
antisymmetric part, compare every full-matrix entry by `K_Sigma` within `<=1e-12`, and demonstrate
|
||||
that no symmetrization occurred.
|
||||
|
||||
### 6.5 Assembly, reaction, residual and global equilibrium
|
||||
|
||||
Blocking assembly tests cover unique facet exact-once application, distinct load-record addition,
|
||||
fixed Gauss/contribution order, serial/parallel stable reduction, shuffled declaration/member order,
|
||||
full-space-before-projection, nonfinite rejection and failed-candidate atomicity.
|
||||
|
||||
Accepted factor-one global equilibrium preserves the existing nonlinear contract. With current
|
||||
`x=X+u` and global origin `0`, form applied/reaction nodal force contributions `a_F,I`, `c_F,I` and
|
||||
current-arm plus spatial physical moment contributions `a_M,I`, `c_M,I`. Pressure has no separate
|
||||
nodal moment. Define
|
||||
|
||||
\[
|
||||
e_F=\sum_I(a_{F,I}+c_{F,I}),\quad
|
||||
S_F=\max(\sum_I\|a_{F,I}\|_2,\sum_I\|c_{F,I}\|_2),
|
||||
\]
|
||||
|
||||
\[
|
||||
e_M=\sum_I(a_{M,I}+c_{M,I}),\quad
|
||||
S_M=\max(\sum_I\|a_{M,I}\|_2,\sum_I\|c_{M,I}\|_2).
|
||||
\]
|
||||
|
||||
Both `||e_F||_2/S_F<=1e-8` and `||e_M||_2/S_M<=1e-8` are blocking. Exact-zero scale
|
||||
requires exact-zero balance; there is no absolute floor, `max(1,S)` or clamp.
|
||||
|
||||
Accepted free translation-force and rotation-moment residual channels remain separate and
|
||||
finite-first. For a nonzero matching external scale, the existing infinity-norm relative gate is
|
||||
`<=1e-2`. For an exact-zero external scale, the existing typed absolute infinity-norm gate is
|
||||
`<=1e-3` force or force-length. Both channels must pass; neither global balance nor local reaction
|
||||
distribution substitutes for this evidence.
|
||||
|
||||
### 6.6 Evidence classes and requirement traceability
|
||||
|
||||
| evidence class | classification | readiness / requirement trace |
|
||||
| --- | --- | --- |
|
||||
| input/surface/source identity | `blocking-internal` | Exact grammar/semantic projection remains Stage 5-owned; stable scope/failure contracts cover `001`–`004`, `013`–`017`. |
|
||||
| sign/resultant/moment/reaction patches | `blocking-internal` | §6.2 and flat/distorted S4/S4R portfolio cover `005`–`007`, `010`–`012`, `020`. |
|
||||
| current geometry/objectivity/tangent | `blocking-internal` | §§6.1, 6.3–6.4 cover `008`–`009`, `016`, `021`. |
|
||||
| deterministic assembly/output preservation | `blocking-internal` | Exact identity/order/atomicity and unchanged existing result meanings cover `011`, `013`, `017`–`019`. |
|
||||
| factor-one free residual/global balance | `blocking-internal` | §6.5 covers `012`, `019`, `021`. |
|
||||
| stored `U1/U2/U3` | `blocking` external | Exact required input/CSV, source rows and common tolerance are ready for `022`–`023`; success remains Implementation-owned. |
|
||||
| stored `UR1/UR2/UR3` | `warning-only` external | Same identity/precheck and common tolerance, deterministic warning disposition for `023`. |
|
||||
| reaction CSV | `review-only` | Optional inventory only; internal reaction/equilibrium remains blocking under `012`, `021`, `024`. |
|
||||
| stress CSV | `excluded` | No comparison family; existing stress recovery remains unchanged under `019`, `024`. |
|
||||
|
||||
Coverage: normative requirements `24`, reviewed requirements `24`, numerical/reference readiness
|
||||
gaps `0`.
|
||||
|
||||
## 7. Required Revisions
|
||||
|
||||
### Formulation Agent
|
||||
|
||||
없음.
|
||||
|
||||
### Research Agent
|
||||
|
||||
없음. Public follower-pressure benchmark absence remains a disclosed nonblocking gap and does not
|
||||
justify an invented target or extra portfolio.
|
||||
|
||||
## 8. Downstream Handoff
|
||||
|
||||
Coordinator를 통해 I/O Definition Agent에 전달한다.
|
||||
|
||||
- Preserve logical source facet `(instance, element label, source element type, side)`, distinct
|
||||
load source order and exact-once semantics; final diagnostic representation is I/O-owned.
|
||||
- Preserve global nodal component order, pressure rotational zero contract, source node identity,
|
||||
`r=f_int-f_ext`, constrained reaction/free residual distinction and current-arm factor-one balance.
|
||||
- Preserve the exact external logical families and row contract in `reference-model.md`; I/O owns
|
||||
the final authoritative dataset projection.
|
||||
- Do not add a pressure-only result quantity unless Stage 5 finds binding evidence; none was found
|
||||
in this review.
|
||||
- Internal thresholds in §6 are test gates only. They do not modify `docs/TOLERANCE.md` and must
|
||||
not be calibrated to Abaqus output.
|
||||
|
||||
@@ -0,0 +1,185 @@
|
||||
# Shell Surface Pressure Load Reference Model Contract
|
||||
|
||||
## 1. Metadata
|
||||
|
||||
- feature_id: `shell-surface-pressure-load`
|
||||
- case_id: `shellnl-meshfine-pressure-s4-follower`
|
||||
- source_requirements: `docs/shell-surface-pressure-load/requirements.md`
|
||||
- source_formulation: `docs/shell-surface-pressure-load/formulation.md`
|
||||
- source_numerical_review: `docs/shell-surface-pressure-load/numerical-review.md`
|
||||
- status: `pass-for-io-definition`
|
||||
- owner_agent: `numerical-review-agent`
|
||||
- date: `2026-08-30`
|
||||
- tolerance_authority: `docs/TOLERANCE.md`
|
||||
- artifact_policy: `read-only-exact-existing-paths`
|
||||
|
||||
## 2. Reference Acceptance Scope
|
||||
|
||||
이 contract의 required acceptance artifacts는 exact stored nonlinear input 하나와 nodal
|
||||
displacement CSV 하나뿐이다. External comparison은 accepted `Step-1` factor-one frame의
|
||||
global nodal translation `U1/U2/U3`를 `blocking`, rotation `UR1/UR2/UR3`를
|
||||
`warning-only`로 분류한다. Abaqus 값은 observable numerical reference이며 FESA pressure
|
||||
formulation, quadrature, tangent 또는 recovery의 내부 동등성 evidence가 아니다.
|
||||
|
||||
Reaction CSV는 존재하는 optional `review-only` inventory이고 stress CSV는 `excluded`다.
|
||||
README, metadata, provenance, Abaqus version, canonical rename 또는 추가 reference case를
|
||||
요구하지 않는다. Final HDF5 dataset projection은 Stage 5 I/O Definition Agent가 소유한다.
|
||||
|
||||
## 3. Reference Case Inventory
|
||||
|
||||
### 3.1 Exact artifacts
|
||||
|
||||
| role | exact path | bytes | SHA-256 | observed inventory | status |
|
||||
| --- | --- | ---: | --- | --- | --- |
|
||||
| required input | `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure.inp` | 56,665 | `53718ccc9b41c23fcc1b509a51d66f1347e87aca43a74f1d6cec4d2085f4b90e` | 1,498 lines; 729 finite unique nodes; 676 unique S4 elements; no bad connectivity reference | `present-readable-required` |
|
||||
| required comparison CSV | `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure displacements.csv` | 111,182 | `2fe53f98eac9f04779100721c3edf8049eb1dbfe733ebcbd819aeeed03b81198` | 729 wide data rows; six displacement/rotation components; zero duplicate node keys; zero nonfinite component values | `present-readable-required` |
|
||||
| optional reaction CSV | `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure reactions.csv` | 108,923 | `a2347f4e88e4b73c75abe7c23e96bcc696c16c1975e2440b3ad9bf7ecda5f2b6` | 729 rows, zero duplicate node keys, zero nonfinite RF/RM values | `present-review-only` |
|
||||
| excluded stress CSV | `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure stresses.csv` | 1,036,876 | `bc06f3324cc5d6655ded2939b3e1cb9d55a0359fa0d272a6958399464218a128` | 5,408 rows, 676 element labels, 729 node labels, zero duplicate full keys, zero nonfinite S values | `present-excluded` |
|
||||
|
||||
Required artifact gaps: `0`. 어떤 artifact도 생성, rename, rewrite 또는 수정하지 않았다.
|
||||
|
||||
### 3.2 Exact input-observed case identity
|
||||
|
||||
| field | exact observed value |
|
||||
| --- | --- |
|
||||
| part / instance | `Part-1` / `Part-1-1`, identity instance |
|
||||
| nodes | labels `1..729`, count `729`, unique and finite |
|
||||
| elements | source type `S4`, labels `1..676`, count `676`, four valid node references each |
|
||||
| section / material | `Set-1`: shell thickness `0.5`, `5` section points; `Material-1`: `E=2.1e+11`, `nu=0.3` |
|
||||
| surface | `Surf-1`, `TYPE=ELEMENT`, internal member set `_Surf-1_SPOS`, elements `1..676`, side `SPOS` |
|
||||
| constraints | assembly `Set-2`, DOFs `1..6` constrained |
|
||||
| step | `Step-1`, `NLGEOM=YES`, one `*STATIC` step; data `0.1, 1.0, 0.001, 0.1` |
|
||||
| load | one `*DSLOAD` record: `Surf-1, P, 1e+06` |
|
||||
|
||||
CSV의 single observed frame text는
|
||||
`Increment 10: Step Time = 1.000`, instance text는 `PART-1-1`이다. 이 case는
|
||||
S4/SPOS/positive uniform pressure/current-configuration nonlinear response만 포함한다. S4R,
|
||||
SNEG, negative/zero pressure, isolated tangent sign, linear reference configuration과 analytical
|
||||
force/moment exactness를 대신하지 않으며, 이 항목들은 `numerical-review.md`의 internal tests가
|
||||
담당한다.
|
||||
|
||||
## 4. Source Identity and Component Contract
|
||||
|
||||
### 4.1 Accepted frame and row identity
|
||||
|
||||
Logical case/frame identity is
|
||||
|
||||
`(case_id, Step-1, unique accepted load_factor=1.0 frame, source instance, source node label)`.
|
||||
|
||||
Reference wide-row key는 raw CSV의
|
||||
`(Frame, Part Instance Name, Node Label)`이다. `Frame`은 위 single factor-one text여야 하고,
|
||||
instance는 source identity `Part-1-1`과 case-insensitive하게 대응하되 양쪽의 원문 identity는
|
||||
보존한다. Node identity는 numeric source label이며 row position 또는 internal index로
|
||||
대응하지 않는다.
|
||||
|
||||
### 4.2 Logical components and disposition
|
||||
|
||||
| logical quantity | reference column | FESA logical component | units / coordinates | expanded row identity | classification |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| nodal translation | `U-U1` | `UX` | length, global Cartesian | accepted frame + instance + node + `U1` | `blocking` |
|
||||
| nodal translation | `U-U2` | `UY` | length, global Cartesian | accepted frame + instance + node + `U2` | `blocking` |
|
||||
| nodal translation | `U-U3` | `UZ` | length, global Cartesian | accepted frame + instance + node + `U3` | `blocking` |
|
||||
| nodal rotation | `UR-UR1` | `URX` | dimensionless radian convention, global component | accepted frame + instance + node + `UR1` | `warning-only` |
|
||||
| nodal rotation | `UR-UR2` | `URY` | dimensionless radian convention, global component | accepted frame + instance + node + `UR2` | `warning-only` |
|
||||
| nodal rotation | `UR-UR3` | `URZ` | dimensionless radian convention, global component | accepted frame + instance + node + `UR3` | `warning-only` |
|
||||
|
||||
Expected raw wide rows: `729`. Expected blocking logical rows: `729*3=2,187`. Expected
|
||||
warning-only logical rows: `729*3=2,187`. Components with different blocking disposition are not
|
||||
placed in one comparison family.
|
||||
|
||||
Reaction values are not a displacement-family source and remain local `review-only`. Stress values
|
||||
have no feature comparator family and are `excluded`.
|
||||
|
||||
## 5. Row Prechecks
|
||||
|
||||
Prechecks run before any numerical tolerance and use the exact existing files.
|
||||
|
||||
1. **Artifact/case:** both required paths must exist, be readable and be paired with case
|
||||
`shellnl-meshfine-pressure-s4-follower`. Wrong input/reference case or substituted filename fails
|
||||
before tolerance.
|
||||
2. **Step/frame/load factor:** FESA must expose exactly one accepted `Step-1` frame at
|
||||
`load_factor=1.0`; the CSV must contain only the exact observed factor-one Frame text. Missing,
|
||||
extra, duplicate or wrong step/frame/factor fails before tolerance.
|
||||
3. **Wide-row inventory:** exact source keys are one row for each
|
||||
`(PART-1-1,node label 1..729)`. Missing, extra or duplicate keys, wrong instance, nonnumeric/out-of-
|
||||
range node labels or row-order-based matching fail before tolerance.
|
||||
4. **Components:** all six logical component columns must be present exactly once. Missing, extra,
|
||||
duplicate or unknown required component identity fails the affected family before value checks.
|
||||
5. **Finite values:** every required U/UR value and matched FESA value must be finite. `NaN`, `Inf`,
|
||||
absent cells and parse failures are precheck failures; they are not zero and cannot be clamped.
|
||||
6. **Cardinality after expansion:** blocking and warning families must each contain exactly 2,187
|
||||
one-to-one rows. Averaging, duplicate collapse, node-station collapse, missing-row omission or
|
||||
component substitution is prohibited.
|
||||
|
||||
Per `docs/TOLERANCE.md`, a required artifact/schema/identity precheck failure makes the comparison
|
||||
non-success before family arithmetic. After successful shared prechecks, a `blocking` family failure
|
||||
changes the blocking verdict; a `warning-only` row or RMS failure records a deterministic warning
|
||||
without changing it. Warning rows are always inventoried and reported; they may not be silently
|
||||
omitted because of their disposition.
|
||||
|
||||
## 6. Tolerance and Blocking/Warning Policy
|
||||
|
||||
The external policy is reproduced unchanged from `docs/TOLERANCE.md`; no threshold is calibrated to
|
||||
this case.
|
||||
|
||||
Comparison families:
|
||||
|
||||
- `pressure_nodal_translation_blocking`: same case, `Step-1` accepted factor-one frame, length,
|
||||
global Cartesian, components `U1/U2/U3`, disposition `blocking`.
|
||||
- `pressure_nodal_rotation_warning`: same case/frame, dimensionless global rotations, components
|
||||
`UR1/UR2/UR3`, disposition `warning-only`.
|
||||
|
||||
For each family, using reference values only,
|
||||
|
||||
\[
|
||||
S=\max_i|r_i|,\qquad B=0.01S,\qquad e_i=|f_i-r_i|.
|
||||
\]
|
||||
|
||||
- If `|r_i|<=B`, row pass requires `e_i<=B`.
|
||||
- If `|r_i|>B`, row pass requires `e_i/|r_i|<=0.05`.
|
||||
- All rows and family RMS must pass:
|
||||
`sqrt(sum_i(e_i^2)/n)/S<=0.01`.
|
||||
- Boundaries are inclusive.
|
||||
- There is no independent absolute-error gate, arbitrary floor, `max(1,S)`, averaging or zero
|
||||
clamp.
|
||||
- If `S=0`, every FESA family value must be exact zero. Otherwise record
|
||||
`zero-reference-scale-nonzero-error`; do not emit a nonfinite metric.
|
||||
- Blocking row/RMS failure fails the blocking comparison. Warning-only row/RMS failure emits a
|
||||
deterministic warning and does not change the blocking numerical verdict.
|
||||
|
||||
Internal analytical, geometry, tangent, free-residual and global-balance checks use
|
||||
`numerical-review.md` §6, not this external policy.
|
||||
|
||||
## 7. Open Issues and I/O Handoff
|
||||
|
||||
### 7.1 Open issues
|
||||
|
||||
- Critical user question: 없음.
|
||||
- Required artifact blocker: 없음.
|
||||
- Accepted limitation: the single stored case supplies S4/SPOS/positive-`P` nonlinear displacement
|
||||
evidence only. S4R, sign reversal, current-area objectivity and tangent consistency remain
|
||||
blocking internal tests rather than invented reference cases.
|
||||
- Optional reaction/stress artifacts remain immutable. Their presence does not expand the approved
|
||||
acceptance boundary.
|
||||
|
||||
### 7.2 I/O handoff through Coordinator
|
||||
|
||||
I/O Definition Agent receives only these logical contracts:
|
||||
|
||||
- accepted `Step-1`, unique factor-one frame identity;
|
||||
- stable source instance `Part-1-1`, source node labels `1..729` and logical component identity;
|
||||
- `U1/U2/U3 -> UX/UY/UZ` blocking and `UR1/UR2/UR3 -> URX/URY/URZ` warning-only;
|
||||
- exact 729-wide-row / 2,187-row-per-family inventory, precheck ordering and common tolerance;
|
||||
- reaction CSV `review-only`, stress CSV `excluded`;
|
||||
- immutable exact artifact paths and hashes.
|
||||
|
||||
Final HDF5 dataset paths, schema projection and comparator serialization remain Stage 5-owned and
|
||||
are intentionally not defined here.
|
||||
|
||||
## 8. Immutable Artifact Rule
|
||||
|
||||
Reference input and CSV files must not be renamed, rewritten, reordered, normalized, regenerated,
|
||||
zero-clamped, repaired or supplemented to obtain a pass. The comparison implementation must adapt
|
||||
deterministically to the exact current filenames, wide CSV layout, padded exported headers and raw
|
||||
source identities while retaining the original artifacts byte-for-byte.
|
||||
|
||||
@@ -0,0 +1,630 @@
|
||||
# Shell Surface Pressure Load Feature Requirement Specification
|
||||
|
||||
## 1. Metadata
|
||||
|
||||
- feature_id: `shell-surface-pressure-load`
|
||||
- title: `S4/S4R Element-Surface Uniform Pressure Load`
|
||||
- status: `draft-for-coordinator-gate-review`
|
||||
- owner_agent: `requirement-agent`
|
||||
- date: `2026-08-30`
|
||||
- requirement_range: `FESA-REQ-SHELL-PRESSURE-001`–`FESA-REQ-SHELL-PRESSURE-024`
|
||||
- parent_need: 승인된 Abaqus `.inp` subset에서 shell element surface pressure를 선형 및 기하비선형 정적 해석에 재현 가능하고 검증 가능하게 적용한다.
|
||||
- tolerance_authority: `docs/TOLERANCE.md`
|
||||
- authoritative_output: input lexical sibling `<stem>_results.h5`
|
||||
- reference_case: `reference/shellNL-meshfine-pressure/`
|
||||
|
||||
## 2. 목적과 기대 동작
|
||||
|
||||
FESA는 `*SURFACE, TYPE=ELEMENT`로 정의한 S4/S4R shell의 `SPOS` 또는 `SNEG`
|
||||
면에 `*DSLOAD`의 uniform pressure load type `P`를 적용한다. 양의 pressure는 선택된
|
||||
surface normal의 반대 방향으로 작용하고 음의 pressure는 그 방향을 반전한다. 선형 정적
|
||||
해석에서는 reference configuration을, `NLGEOM=YES` 비선형 정적 해석에서는 current
|
||||
configuration의 follower load와 그 external-load tangent를 사용한다.
|
||||
|
||||
이 기능은 Abaqus 내부 요소 정식화나 적분 절차의 동등성을 목표로 하지 않는다. Abaqus
|
||||
문서는 입력 의미와 외부 observable behavior의 근거이고, FESA formulation과 구현은 후속
|
||||
gate에서 독립적으로 정의한다. Abaqus 문서상 surface pressure의 단위는 force/area이고,
|
||||
surface-based 양의 pressure는 local surface normal의 반대 방향이다. 또한 pressure는
|
||||
기하비선형 해석에서 surface와 함께 회전하는 follower load이며, deformed surface에 대한
|
||||
load 의존성이 Jacobian contribution을 만든다.
|
||||
|
||||
근거:
|
||||
|
||||
- [Abaqus Distributed Loads](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEPRCRefMap/simaprc-c-loaddistributed.htm)
|
||||
- [Abaqus Pressure Load Stiffness](https://docs.software.vt.edu/abaqusv2025/English/SIMACAETHERefMap/simathe-c-pressloadsolids.htm)
|
||||
- [Abaqus Surface Normal and SPOS/SNEG](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEGSARefMap/simagsa-c-cntsurfaces.htm)
|
||||
|
||||
## 3. In Scope
|
||||
|
||||
- Case-insensitive `*SURFACE, TYPE=ELEMENT, NAME=<surface-name>` syntax와 surface data의
|
||||
`<element-or-elset>, SPOS|SNEG` 조합
|
||||
- Case-insensitive `*DSLOAD` data의 `<surface-name>, P, <uniform-magnitude>` 조합
|
||||
- S4와 S4R source element type, 4절점 shell connectivity, 절점당
|
||||
`[UX, UY, UZ, URX, URY, URZ]`
|
||||
- Part/instance/assembly source identity를 보존하는 named element surface resolution
|
||||
- 양수, zero, 음수의 finite pressure magnitude와 model-consistent force/area 단위
|
||||
- 단일 승인 linear static step의 reference-configuration pressure
|
||||
- 단일 승인 `*STATIC, NLGEOM=YES` step의 current-configuration follower pressure와
|
||||
external-load tangent
|
||||
- Stable full-DOF load assembly, reaction/free residual, global equilibrium과 deterministic order
|
||||
- 기존 HDF5 result quantities와 stored reference displacement comparison
|
||||
|
||||
## 4. Out of Scope
|
||||
|
||||
- `*DLOAD` element/element-set face load와 `P n` label
|
||||
- `PNU`, `HP`, `VP`, `SP`, `TRVEC`, `TRSHR`, nodal pressure, user subroutine 또는
|
||||
spatially varying pressure
|
||||
- `AMPLITUDE`, `FOLLOWER`, `OP`, `REF NODE` 등 이번 subset에서 승인하지 않은
|
||||
`*DSLOAD` parameter
|
||||
- `TYPE=NODE`, analytical surface, edge surface, double-sided surface, surface smoothing 또는
|
||||
contact surface behavior. 서로 다른 member가 각각 `SPOS` 또는 `SNEG`를 선택하는 것은 허용한다.
|
||||
- S3, S8, solid, continuum-shell, membrane, beam과 rigid element pressure
|
||||
- Dynamics, thermal, contact, buckling perturbation, multiple step propagation, cavity/pipe pressure
|
||||
- Surface offset, thickness-side pressure correction, pressure-induced new stress/strain/energy
|
||||
output 또는 새 HDF5 dataset
|
||||
- Abaqus 내부 정식화·적분·stabilization·load linearization과의 동등성 주장
|
||||
- Reference artifact 생성, rename, 보정, zero-clamp 또는 stress reference comparison
|
||||
|
||||
## 5. Analysis Definition
|
||||
|
||||
| 항목 | 승인 계약 |
|
||||
| --- | --- |
|
||||
| analysis type | 단일 linear static 또는 승인된 full-Newton nonlinear static `NLGEOM=YES` |
|
||||
| elements | FESA MITC4가 선택되는 Abaqus source `S4`, `S4R`; source type identity 보존 |
|
||||
| nodal DOFs | global `[UX, UY, UZ, URX, URY, URZ]`; pressure resultant는 shell surface에 작용하는 external generalized load |
|
||||
| material model | 기존 MITC4가 지원하는 linear isotropic elastic shell material/section; 이 기능은 material 범위를 확장하지 않음 |
|
||||
| boundary conditions | 기존 essential displacement/rotation constraint subset; reference case는 `Set-2` DOF 1–6 고정 |
|
||||
| loads | named element surface에 작용하는 uniform scalar pressure `P` |
|
||||
| coordinate system | Surface normal은 source connectivity가 정한 element positive normal에서 파생; nodal/resultant/equilibrium output은 global Cartesian |
|
||||
| units | Pressure `force/length^2`; nodal force `force`; nodal moment `force*length`; translation `length`; rotation dimensionless (radian convention) |
|
||||
| linear configuration | Reference nodal coordinates와 reference surface area/normal |
|
||||
| nonlinear configuration | Accepted/trial current coordinates `X+u`, current area/normal, current-surface follower direction |
|
||||
|
||||
## 6. Normative Requirements
|
||||
|
||||
```yaml
|
||||
id: FESA-REQ-SHELL-PRESSURE-001
|
||||
statement: "The FESA solver shall accept the approved case-insensitive sequence *SURFACE, TYPE=ELEMENT, NAME=<name> with SPOS or SNEG data followed by step-level *DSLOAD data <surface-name>, P, <magnitude>."
|
||||
category: input
|
||||
rationale: "입력 노출 범위를 surface-based pressure로 한정하고 *DLOAD와 구분한다."
|
||||
source: user
|
||||
priority: must
|
||||
verification_method: test
|
||||
acceptance_criteria: "S4와 S4R의 최소 valid input이 각각 syntax와 semantic mapping을 통과하고, surface name, side, source location, DSLOAD source order와 magnitude가 loss 없이 보존된다."
|
||||
tolerance: "Keyword/label/type/cardinality exact; numerical tolerance N/A because this is a discrete input contract."
|
||||
trace_to:
|
||||
parent_need: "Approved surface-based uniform pressure input"
|
||||
downstream_agents: ["I/O Definition Agent", "Implementation Planning Agent"]
|
||||
status: draft
|
||||
```
|
||||
|
||||
```yaml
|
||||
id: FESA-REQ-SHELL-PRESSURE-002
|
||||
statement: "The FESA solver shall represent each approved DSLOAD P entry as one uniform finite scalar pressure with model-consistent force-per-area units."
|
||||
category: input
|
||||
rationale: "Magnitude 의미와 단위를 formulation 및 비교 전에 고정한다."
|
||||
source: standard
|
||||
priority: must
|
||||
verification_method: test
|
||||
acceptance_criteria: "Positive, exact-zero, and negative finite magnitudes are preserved exactly once as scalar load data; NaN and infinity are rejected before analysis."
|
||||
tolerance: "Parsed finite double value exact; pressure dimension force/length^2 exact."
|
||||
trace_to:
|
||||
parent_need: "Uniform pressure magnitude"
|
||||
downstream_agents: ["Research Agent", "I/O Definition Agent"]
|
||||
status: draft
|
||||
```
|
||||
|
||||
```yaml
|
||||
id: FESA-REQ-SHELL-PRESSURE-003
|
||||
statement: "The FESA solver shall resolve a named element surface to a unique deterministic ordered list of source instance, source element label, and selected side identities."
|
||||
category: functional
|
||||
rationale: "Source surface와 internal index의 혼동 및 불안정한 조립을 방지한다."
|
||||
source: docs
|
||||
priority: must
|
||||
verification_method: test
|
||||
acceptance_criteria: "Direct element and ELSET-backed entries resolve to the same stable identity inventory; repeated execution produces byte-identical identity and order evidence."
|
||||
tolerance: "Identity, membership, multiplicity, and order exact."
|
||||
trace_to:
|
||||
parent_need: "Stable semantic target resolution"
|
||||
downstream_agents: ["I/O Definition Agent", "Implementation Planning Agent"]
|
||||
status: draft
|
||||
```
|
||||
|
||||
```yaml
|
||||
id: FESA-REQ-SHELL-PRESSURE-004
|
||||
statement: "The FESA solver shall support only S4 and S4R four-node shell members on SPOS or SNEG within an approved pressure surface while preserving each source element type and label."
|
||||
category: constraint
|
||||
rationale: "승인된 element/face matrix를 명시하고 S4/S4R source identity를 보존한다."
|
||||
source: user
|
||||
priority: must
|
||||
verification_method: test
|
||||
acceptance_criteria: "S4 and S4R valid cases pass; every other element type or face token in the surface fails closed; S4/S4R source types remain distinguishable in model/output identity."
|
||||
tolerance: "Supported inventory and source identity exact."
|
||||
trace_to:
|
||||
parent_need: "Bounded shell pressure scope"
|
||||
downstream_agents: ["Research Agent", "I/O Definition Agent"]
|
||||
status: draft
|
||||
```
|
||||
|
||||
```yaml
|
||||
id: FESA-REQ-SHELL-PRESSURE-005
|
||||
statement: "The FESA solver shall apply positive DSLOAD P opposite the selected surface normal and shall reverse that load direction for a negative magnitude."
|
||||
category: physics
|
||||
rationale: "Pressure sign을 selected surface normal과 명확히 연결한다."
|
||||
source: standard
|
||||
priority: must
|
||||
verification_method: analysis
|
||||
acceptance_criteria: "A flat one-element test demonstrates positive and negative equal-magnitude resultants that are equal and opposite; no magnitude absolute-value conversion or direction clamp occurs."
|
||||
tolerance: "Direction sign exact; resultant comparison uses a Numerical Review-approved scale-aware analytical tolerance in force units."
|
||||
trace_to:
|
||||
parent_need: "Abaqus-aligned pressure sign"
|
||||
downstream_agents: ["Research Agent", "Formulation Agent", "Numerical Review Agent"]
|
||||
status: draft
|
||||
```
|
||||
|
||||
```yaml
|
||||
id: FESA-REQ-SHELL-PRESSURE-006
|
||||
statement: "The FESA solver shall derive the SPOS normal from source connectivity and shall use its inverse for SNEG before applying the pressure sign rule."
|
||||
category: physics
|
||||
rationale: "SPOS/SNEG와 connectivity normal 관계를 고정한다."
|
||||
source: standard
|
||||
priority: must
|
||||
verification_method: test
|
||||
acceptance_criteria: "For unchanged connectivity, switching SPOS to SNEG reverses every pressure resultant component; reversing connectivity changes the positive normal consistently without changing stable source identity."
|
||||
tolerance: "Normal/side orientation sign exact; finite vector comparison uses Numerical Review-approved geometry tolerance."
|
||||
trace_to:
|
||||
parent_need: "Deterministic surface-side semantics"
|
||||
downstream_agents: ["Research Agent", "Formulation Agent", "Numerical Review Agent"]
|
||||
status: draft
|
||||
```
|
||||
|
||||
```yaml
|
||||
id: FESA-REQ-SHELL-PRESSURE-007
|
||||
statement: "The FESA solver shall evaluate linear-static surface pressure from the reference configuration."
|
||||
category: physics
|
||||
rationale: "선형 load가 displacement에 따라 회전하거나 면적이 변하지 않도록 한다."
|
||||
source: user
|
||||
priority: must
|
||||
verification_method: analysis
|
||||
acceptance_criteria: "A linear flat and distorted patch produces the reference-area/reference-normal resultant and remains independent of any candidate displacement supplied only for test instrumentation."
|
||||
tolerance: "Global force units and reference coordinates required; Numerical Review approves the scale-aware analytical tolerance before implementation."
|
||||
trace_to:
|
||||
parent_need: "Reference-configuration linear pressure"
|
||||
downstream_agents: ["Formulation Agent", "Numerical Review Agent"]
|
||||
status: draft
|
||||
```
|
||||
|
||||
```yaml
|
||||
id: FESA-REQ-SHELL-PRESSURE-008
|
||||
statement: "The FESA solver shall evaluate NLGEOM=YES pressure as a follower load normal to the current surface using current coordinates X+u."
|
||||
category: physics
|
||||
rationale: "Large rotation에서 pressure direction과 area가 current configuration을 따르도록 한다."
|
||||
source: standard
|
||||
priority: must
|
||||
verification_method: analysis
|
||||
acceptance_criteria: "Rigidly rotating a loaded patch rotates the global pressure resultant by the same rotation while preserving scalar pressure and source identity; a fixed-global CLOAD-equivalent response is rejected."
|
||||
tolerance: "Global force units/current coordinates required; objectivity and resultant use Numerical Review-approved invariant tolerance."
|
||||
trace_to:
|
||||
parent_need: "Current-configuration follower pressure"
|
||||
downstream_agents: ["Research Agent", "Formulation Agent", "Numerical Review Agent"]
|
||||
status: draft
|
||||
```
|
||||
|
||||
```yaml
|
||||
id: FESA-REQ-SHELL-PRESSURE-009
|
||||
statement: "The FESA solver shall include the displacement derivative of the nonlinear follower pressure in the external-load contribution to the Newton tangent."
|
||||
category: numerical
|
||||
rationale: "Residual과 tangent의 pressure dependence를 일치시킨다."
|
||||
source: standard
|
||||
priority: must
|
||||
verification_method: analysis
|
||||
acceptance_criteria: "Directional finite-difference checks of the external pressure force against the assembled external tangent pass for nondegenerate distorted S4 and S4R patches, including SPOS/SNEG and positive/negative magnitude cases."
|
||||
tolerance: "Force and force/length tangent units in global coordinates; Numerical Review fixes perturbation and norm tolerances before implementation."
|
||||
trace_to:
|
||||
parent_need: "Consistent external follower-load tangent"
|
||||
downstream_agents: ["Formulation Agent", "Numerical Review Agent"]
|
||||
status: draft
|
||||
```
|
||||
|
||||
```yaml
|
||||
id: FESA-REQ-SHELL-PRESSURE-010
|
||||
statement: "The FESA solver shall scale each active pressure magnitude exactly once by the analysis step load factor."
|
||||
category: numerical
|
||||
rationale: "Incremental nonlinear loading의 double scaling과 미적용을 방지한다."
|
||||
source: derived
|
||||
priority: must
|
||||
verification_method: test
|
||||
acceptance_criteria: "At load factors 0, 0.5, and 1.0 with fixed configuration, the external pressure resultant is respectively 0, one-half, and the full reference magnitude, with identical source membership."
|
||||
tolerance: "Load-factor identity exact; force proportionality uses Numerical Review-approved roundoff tolerance."
|
||||
trace_to:
|
||||
parent_need: "Existing static step load lifecycle"
|
||||
downstream_agents: ["Formulation Agent", "Implementation Planning Agent"]
|
||||
status: draft
|
||||
```
|
||||
|
||||
```yaml
|
||||
id: FESA-REQ-SHELL-PRESSURE-011
|
||||
statement: "The FESA solver shall assemble all pressure contributions into the stable full-DOF external generalized load before free/constrained projection."
|
||||
category: functional
|
||||
rationale: "Pressure, constraint elimination, reaction과 free residual의 일관성을 보존한다."
|
||||
source: docs
|
||||
priority: must
|
||||
verification_method: test
|
||||
acceptance_criteria: "Mixed constrained/free patch tests show one full-space contribution per resolved source face, stable reduction order, correct reduced RHS participation, and no direct global sparse or shared-vector writes by parallel producers."
|
||||
tolerance: "Full-DOF indices/order/cardinality exact; finite summed values required."
|
||||
trace_to:
|
||||
parent_need: "End-to-end load assembly"
|
||||
downstream_agents: ["Formulation Agent", "Implementation Planning Agent"]
|
||||
status: draft
|
||||
```
|
||||
|
||||
```yaml
|
||||
id: FESA-REQ-SHELL-PRESSURE-012
|
||||
statement: "The FESA solver shall include assembled pressure loads in the full residual used to distinguish constrained reactions from free-equilibrium residuals."
|
||||
category: physics
|
||||
rationale: "Pressure가 reaction 및 equilibrium evidence에 누락되지 않도록 한다."
|
||||
source: docs
|
||||
priority: must
|
||||
verification_method: analysis
|
||||
acceptance_criteria: "A fully constrained flat patch recovers reactions equal and opposite to the analytical pressure resultant, and mixed-constraint cases retain separate constrained reaction and free residual identities."
|
||||
tolerance: "Force/force-length in global coordinates; linear analytical tolerance and nonlinear accepted-free-residual gate are fixed/confirmed by Numerical Review."
|
||||
trace_to:
|
||||
parent_need: "Reaction and free-equilibrium correctness"
|
||||
downstream_agents: ["Numerical Review Agent", "Physics Evaluation Agent"]
|
||||
status: draft
|
||||
```
|
||||
|
||||
```yaml
|
||||
id: FESA-REQ-SHELL-PRESSURE-013
|
||||
statement: "The FESA solver shall preserve deterministic surface resolution, pressure application, floating reduction, result-row, and diagnostic order for identical input."
|
||||
category: constraint
|
||||
rationale: "Thread scheduling과 container order가 observable evidence를 바꾸지 않게 한다."
|
||||
source: docs
|
||||
priority: must
|
||||
verification_method: test
|
||||
acceptance_criteria: "Repeated serial and approved parallel executions produce identical source order, sparse/load structure, result-row order, diagnostic order, and comparison verdict."
|
||||
tolerance: "Discrete order and identities exact; floating reduction sequence exact."
|
||||
trace_to:
|
||||
parent_need: "Deterministic solver behavior"
|
||||
downstream_agents: ["I/O Definition Agent", "Implementation Planning Agent"]
|
||||
status: draft
|
||||
```
|
||||
|
||||
```yaml
|
||||
id: FESA-REQ-SHELL-PRESSURE-014
|
||||
statement: "The FESA solver shall fail closed on unsupported SURFACE or DSLOAD parameters, load labels, distributions, target kinds, surface sides, or element types."
|
||||
category: input
|
||||
rationale: "승인 subset 밖의 의미를 silent no-op이나 다른 load로 해석하지 않는다."
|
||||
source: user
|
||||
priority: must
|
||||
verification_method: test
|
||||
acceptance_criteria: "Each declared out-of-scope variant returns a structured non-success input/model diagnostic before analysis and produces no pressure contribution."
|
||||
tolerance: "Unsupported inventory and failure category exact."
|
||||
trace_to:
|
||||
parent_need: "Fail-closed unsupported variants"
|
||||
downstream_agents: ["I/O Definition Agent", "Implementation Planning Agent"]
|
||||
status: draft
|
||||
```
|
||||
|
||||
```yaml
|
||||
id: FESA-REQ-SHELL-PRESSURE-015
|
||||
statement: "The FESA solver shall fail closed when a pressure surface or DSLOAD reference is missing, unresolved, ambiguous, empty, duplicated incompatibly, malformed, or inconsistent with its source scope."
|
||||
category: input
|
||||
rationale: "잘못된 target resolution을 평균, 추측 또는 omission으로 숨기지 않는다."
|
||||
source: docs
|
||||
priority: must
|
||||
verification_method: test
|
||||
acceptance_criteria: "Focused negative cases reject unknown names, cross-scope collisions, empty surfaces, duplicate conflicting side membership, malformed data cardinality, and unresolved instance/ELSET members with deterministic source locations."
|
||||
tolerance: "Identity/cardinality/failure exact."
|
||||
trace_to:
|
||||
parent_need: "Valid stable surface identity"
|
||||
downstream_agents: ["I/O Definition Agent", "Implementation Planning Agent"]
|
||||
status: draft
|
||||
```
|
||||
|
||||
```yaml
|
||||
id: FESA-REQ-SHELL-PRESSURE-016
|
||||
statement: "The FESA solver shall fail closed on a pressure load used with an unapproved procedure, nonfinite intermediate contribution, or invalid current surface geometry."
|
||||
category: numerical
|
||||
rationale: "Invalid physics/numerics를 clamp, fallback 또는 partial result로 숨기지 않는다."
|
||||
source: user
|
||||
priority: must
|
||||
verification_method: test
|
||||
acceptance_criteria: "Unsupported procedure, nonfinite magnitude/contribution/tangent, and zero or invalid current surface measure each produce the appropriate deterministic non-success diagnostic before state/output commit."
|
||||
tolerance: "Finite predicate and procedure identity exact; invalid-geometry scale criterion is fixed by Numerical Review."
|
||||
trace_to:
|
||||
parent_need: "Fail-closed invalid procedure and geometry"
|
||||
downstream_agents: ["Numerical Review Agent", "I/O Definition Agent"]
|
||||
status: draft
|
||||
```
|
||||
|
||||
```yaml
|
||||
id: FESA-REQ-SHELL-PRESSURE-017
|
||||
statement: "The FESA solver shall report pressure input, mapping, model, and numerical failures with stable source identity and deterministic diagnostics without publishing a failed candidate as a successful final HDF5 result."
|
||||
category: output
|
||||
rationale: "오류 추적성과 failure atomicity를 유지한다."
|
||||
source: docs
|
||||
priority: must
|
||||
verification_method: test
|
||||
acceptance_criteria: "Diagnostics identify file, line, keyword, surface/load identity and failure category where applicable; a failed run preserves the prior valid final output or leaves no misleading final output."
|
||||
tolerance: "Diagnostic identity/order and final-file state exact."
|
||||
trace_to:
|
||||
parent_need: "Deterministic diagnostics and atomic failure"
|
||||
downstream_agents: ["I/O Definition Agent", "Implementation Planning Agent"]
|
||||
status: draft
|
||||
```
|
||||
|
||||
```yaml
|
||||
id: FESA-REQ-SHELL-PRESSURE-018
|
||||
statement: "The FESA solver shall retain the existing versioned HDF5 results contract as the sole authoritative output for this feature unless the Stage-5 I/O gate proves an additional contract necessary."
|
||||
category: output
|
||||
rationale: "Load 기능만으로 speculative pressure dataset을 추가하지 않는다."
|
||||
source: user
|
||||
priority: must
|
||||
verification_method: inspection
|
||||
acceptance_criteria: "Successful linear and nonlinear pressure runs contain the existing mandatory model, nodal, element, residual/equilibrium, metadata and diagnostic datasets appropriate to their procedure, and no CSV or new pressure-only dataset is treated as authoritative."
|
||||
tolerance: "Dataset/schema identity exact; numerical tolerance N/A for authority classification."
|
||||
trace_to:
|
||||
parent_need: "Preserve authoritative HDF5 output"
|
||||
downstream_agents: ["I/O Definition Agent"]
|
||||
status: draft
|
||||
```
|
||||
|
||||
```yaml
|
||||
id: FESA-REQ-SHELL-PRESSURE-019
|
||||
statement: "The FESA solver shall expose pressure effects through existing nodal displacement, reaction/generalized residual, global equilibrium, and existing element result quantities with their approved units, coordinates, and stable source identities."
|
||||
category: output
|
||||
rationale: "Pressure correctness가 existing observable result chain에서 검증 가능해야 한다."
|
||||
source: docs
|
||||
priority: must
|
||||
verification_method: demonstration
|
||||
acceptance_criteria: "HDF5 inspection confirms global nodal [UX,UY,UZ,URX,URY,URZ], full residual/reaction meaning, factor-one nonlinear global equilibrium identity, and unchanged existing element result identities; all required values are finite."
|
||||
tolerance: "Units/coordinate/component/source identity exact; quantity values use their requirement-specific analytical, internal, or external tolerance."
|
||||
trace_to:
|
||||
parent_need: "Observable end-to-end pressure response"
|
||||
downstream_agents: ["I/O Definition Agent", "Physics Evaluation Agent"]
|
||||
status: draft
|
||||
```
|
||||
|
||||
```yaml
|
||||
id: FESA-REQ-SHELL-PRESSURE-020
|
||||
statement: "The FESA solver shall pass analytical linear pressure checks for magnitude, sign, SPOS/SNEG reversal, negative magnitude reversal, total resultant, reaction, and mesh/order invariance."
|
||||
category: verification
|
||||
rationale: "Stored nonlinear reference가 직접 검증하지 않는 linear 및 sign 경계를 차단한다."
|
||||
source: derived
|
||||
priority: must
|
||||
verification_method: analysis
|
||||
acceptance_criteria: "Numerical Review approves at least one flat S4 and one S4R patch, a distorted patch, and mesh/order variants; every declared invariant passes before reference comparison."
|
||||
tolerance: "Force/force-length/global coordinate analytical tolerances are scale-aware and fixed by Numerical Review; no docs/TOLERANCE.md substitution."
|
||||
trace_to:
|
||||
parent_need: "Independent analytical verification"
|
||||
downstream_agents: ["Numerical Review Agent", "Implementation Planning Agent"]
|
||||
status: draft
|
||||
```
|
||||
|
||||
```yaml
|
||||
id: FESA-REQ-SHELL-PRESSURE-021
|
||||
statement: "The FESA solver shall pass nonlinear pressure checks for follower objectivity, current-area/resultant behavior, external-tangent consistency, accepted free residual, and factor-one global force and moment balance."
|
||||
category: verification
|
||||
rationale: "Reference displacement만으로 검출하기 어려운 follower/load-tangent 공통 오류를 차단한다."
|
||||
source: derived
|
||||
priority: must
|
||||
verification_method: analysis
|
||||
acceptance_criteria: "Approved objectivity and tangent checks pass; factor-one accepted free residual passes the existing nonlinear convergence contract; global applied-plus-constrained-reaction force and moment balance, about global origin using current X+u arms and spatial physical moments, each has normalized error <=1e-8."
|
||||
tolerance: "Global force/moment normalized <=1e-8; tangent/objectivity tolerances fixed by Numerical Review; units and global origin exact."
|
||||
trace_to:
|
||||
parent_need: "Independent nonlinear follower-pressure verification"
|
||||
downstream_agents: ["Numerical Review Agent", "Physics Evaluation Agent"]
|
||||
status: draft
|
||||
```
|
||||
|
||||
```yaml
|
||||
id: FESA-REQ-SHELL-PRESSURE-022
|
||||
statement: "The FESA solver shall use reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure.inp and reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure displacements.csv as the exact read-only required reference input and comparison CSV."
|
||||
category: verification
|
||||
rationale: "기존 pressure model과 실제 acceptance CSV를 최소 exact contract로 고정한다."
|
||||
source: benchmark
|
||||
priority: must
|
||||
verification_method: reference-comparison
|
||||
acceptance_criteria: "The input is read at its existing path and resolves 729 nodes, 676 S4 elements, Part-1-1, Surf-1 covering elements 1–676 on SPOS, NLGEOM=YES, and DSLOAD P=1e6; the required CSV has 729 finite factor-one node rows and remains unmodified."
|
||||
tolerance: "Artifact path/name and inventory exact; Git diff shows no reference modification."
|
||||
trace_to:
|
||||
parent_need: "Stored nonlinear pressure reference"
|
||||
downstream_agents: ["Numerical Review Agent", "Implementation Planning Agent"]
|
||||
status: draft
|
||||
```
|
||||
|
||||
```yaml
|
||||
id: FESA-REQ-SHELL-PRESSURE-023
|
||||
statement: "The FESA solver shall compare factor-one HDF5 nodal displacement to the required CSV by deterministic source node identity and component, treating U1/U2/U3 as blocking and UR1/UR2/UR3 as warning-only."
|
||||
category: verification
|
||||
rationale: "Reference row order나 internal index에 의존하지 않는 observable comparison을 만든다."
|
||||
source: docs
|
||||
priority: must
|
||||
verification_method: reference-comparison
|
||||
acceptance_criteria: "CSV (Frame, Part Instance Name, Node Label, component) maps one-to-one to HDF5 (Step-1, unique accepted load_factor=1.0 frame, source instance, source node label, UX/UY/UZ/URX/URY/URZ); missing, extra, duplicate, nonfinite, wrong-frame or wrong-component required rows fail before tolerance."
|
||||
tolerance: "Translation blocking family and rotation warning-only family each use docs/TOLERANCE.md; identity/component/frame prechecks exact."
|
||||
trace_to:
|
||||
parent_need: "Deterministic external displacement acceptance"
|
||||
downstream_agents: ["Numerical Review Agent", "I/O Definition Agent"]
|
||||
status: draft
|
||||
```
|
||||
|
||||
```yaml
|
||||
id: FESA-REQ-SHELL-PRESSURE-024
|
||||
statement: "The FESA solver shall exclude local reaction and stress CSV values from the blocking or warning-only acceptance boundary for this feature while preserving declared internal equilibrium and existing result obligations."
|
||||
category: constraint
|
||||
rationale: "Review-only reaction distribution과 formulation-dependent stress를 pressure acceptance로 오인하지 않는다."
|
||||
source: docs
|
||||
priority: must
|
||||
verification_method: inspection
|
||||
acceptance_criteria: "reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure reactions.csv is inventoried only as optional review evidence; reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure stresses.csv is excluded; neither missing file nor numerical mismatch changes the feature verdict, and no comparator family is created for stress."
|
||||
tolerance: "Disposition exact; internal equilibrium follows FESA-REQ-SHELL-PRESSURE-012 and -021; external numerical tolerance N/A for excluded quantities."
|
||||
trace_to:
|
||||
parent_need: "Minimal reference acceptance boundary"
|
||||
downstream_agents: ["Numerical Review Agent", "I/O Definition Agent"]
|
||||
status: draft
|
||||
```
|
||||
|
||||
## 7. Input Requirements Summary
|
||||
|
||||
- Required model data: named `TYPE=ELEMENT` surface with S4/S4R `SPOS|SNEG` members.
|
||||
- Required history data: step-level `*DSLOAD` with exactly surface name, `P`, finite uniform scalar.
|
||||
- Keyword and enum tokens are case-insensitive; stable original label/source identity is retained.
|
||||
- Surface definitions resolve before load application; ambiguity, empty membership, incompatible
|
||||
duplicate membership and unsupported variants fail closed.
|
||||
- `*DLOAD` is not an alias for `*DSLOAD` and remains unsupported by this feature.
|
||||
|
||||
## 8. Output Requirements Summary
|
||||
|
||||
- Authoritative result: lexical sibling `<stem>_results.h5`; nonlinear log remains the existing
|
||||
procedure log, not a result substitute.
|
||||
- This feature requires no new authoritative dataset. Pressure effects must be visible in existing
|
||||
nodal displacement, reaction/generalized residual, global equilibrium and element result paths.
|
||||
- Global nodal component order is `[UX,UY,UZ,URX,URY,URZ]`; translations use length, rotations are
|
||||
dimensionless, force uses force, and physical moment uses force-length.
|
||||
- Source instance/node/element labels and deterministic row order remain stable.
|
||||
- CSV is only an external reference/debug view and never official solver output.
|
||||
|
||||
## 9. Verification Quantities
|
||||
|
||||
| quantity | units / coordinates / identity | acceptance role |
|
||||
| --- | --- | --- |
|
||||
| nodal displacement `U1/U2/U3` | length; global Cartesian; factor-one `(instance,node,component)` | external `blocking` |
|
||||
| nodal rotation `UR1/UR2/UR3` | dimensionless radian convention; global components; same identity | external `warning-only` |
|
||||
| constrained reaction | force/force-length; global full-DOF source node identity | internal physics/equilibrium; local CSV optional review only |
|
||||
| accepted free residual | force/force-length generalized channels; stable free mask | nonlinear `blocking-internal` through existing convergence contract |
|
||||
| global equilibrium | force `[3]`, force-length moment `[3]`; global origin `[0,0,0]`, current `X+u` arms | nonlinear factor-one `blocking-internal`, normalized `<=1e-8` |
|
||||
| total applied pressure resultant | force and force-length about declared origin; global | analytical linear/nonlinear invariant |
|
||||
| element internal force/resultant | existing MITC4 result identity, units, coordinates unchanged | preservation/physics evidence; no new external family |
|
||||
| stress | existing MITC4 stress output unchanged | pressure reference comparison excluded |
|
||||
| strain | existing MITC4 generalized strain output unchanged | preservation only; no feature-specific comparison |
|
||||
| energy | N/A | no new authoritative energy quantity; follower behavior is checked by force/tangent/equilibrium evidence |
|
||||
|
||||
## 10. Tolerance Policy
|
||||
|
||||
External displacement/rotation comparison은 `docs/TOLERANCE.md`를 그대로 사용한다.
|
||||
|
||||
- Family `pressure_nodal_translation_blocking`: one model/case, Step-1 factor-one accepted frame,
|
||||
length, global Cartesian, components `U1/U2/U3`, `blocking`.
|
||||
- Family `pressure_nodal_rotation_warning`: same case/frame, dimensionless rotation, global
|
||||
components `UR1/UR2/UR3`, `warning-only`.
|
||||
- 각 family에서 reference-only `S=max(abs(reference))`, near-zero band `0.01*S`, non-near-zero
|
||||
relative error `<=0.05`, family `RMS(error)/S<=0.01`을 함께 적용한다.
|
||||
- 별도 absolute-error gate와 `max(1,S)`를 사용하지 않는다. `S=0`이면 FESA도 exact zero여야 한다.
|
||||
- Required row의 missing, extra, duplicate, nonfinite, identity/component/frame mismatch는 tolerance
|
||||
전에 실패한다.
|
||||
- Internal global force/moment balance는 각각 normalized `<=1e-8`이다. Analytical patch,
|
||||
geometry, objectivity와 tangent finite-difference의 구체적 scale/perturbation tolerance는
|
||||
Numerical Review Agent가 기존 solver practice와 formulation scale을 사용해 구현 전에
|
||||
확정한다. 이는 사용자 결정이 아니며 external family tolerance로 대체하지 않는다.
|
||||
|
||||
## 11. Reference Case Requirements
|
||||
|
||||
### Required acceptance artifacts
|
||||
|
||||
| role | exact path | requirement |
|
||||
| --- | --- | --- |
|
||||
| input | `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure.inp` | required, read-only |
|
||||
| blocking/warning CSV | `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure displacements.csv` | required, read-only, 729 finite factor-one rows |
|
||||
|
||||
Reference input inventory는 S4 676개, node 729개, instance `Part-1-1`, surface `Surf-1`,
|
||||
element 1–676의 `SPOS`, `*STEP, NLGEOM=YES`, `*DSLOAD`의 `Surf-1, P, 1e+06`이다.
|
||||
|
||||
### HDF5 projection and matching
|
||||
|
||||
- FESA source: `/steps/Step-1/frames/<unique-load-factor-1.0>/nodal/displacement`, component
|
||||
order `[UX,UY,UZ,URX,URY,URZ]`, source node rows from `/model/nodes`.
|
||||
- CSV source: `Frame`, `Part Instance Name`, `Node Label`, `U-U1`, `U-U2`, `U-U3`,
|
||||
`UR-UR1`, `UR-UR2`, `UR-UR3`.
|
||||
- Match key: `(factor-one frame, case-insensitive stable source instance identity, numeric source
|
||||
node label, logical component)`; value columns map `U1/U2/U3/UR1/UR2/UR3` to
|
||||
`UX/UY/UZ/URX/URY/URZ`.
|
||||
- Exact one-to-one inventory precheck precedes `docs/TOLERANCE.md`.
|
||||
|
||||
### Non-required inventory artifacts
|
||||
|
||||
- `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure reactions.csv`: 729-row optional
|
||||
local review inventory; not a blocking/warning required CSV.
|
||||
- `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure stresses.csv`: 5,408-row optional
|
||||
inventory; excluded from numerical comparison.
|
||||
|
||||
이 기능은 canonical filename, README, metadata, provenance, Abaqus version 또는 추가 CSV를
|
||||
readiness 조건으로 요구하지 않는다. 모든 reference artifact는 current exact path/name에서
|
||||
read-only로 사용한다.
|
||||
|
||||
## 12. Requirement Verification Matrix
|
||||
|
||||
| id | category | source | priority | verification method | compact acceptance evidence | tolerance | intended gate / owner | status |
|
||||
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
|
||||
| `FESA-REQ-SHELL-PRESSURE-001` | input | user | must | test | valid SURFACE+DSLOAD S4/S4R mapping | discrete exact | Gate 5/6 · I/O, Implementation | draft |
|
||||
| `FESA-REQ-SHELL-PRESSURE-002` | input | standard | must | test | finite uniform scalar and units | parsed/dimension exact | Gate 2/5/6 · Research, I/O, Implementation | draft |
|
||||
| `FESA-REQ-SHELL-PRESSURE-003` | functional | docs | must | test | deterministic source surface inventory | identity/order exact | Gate 5/6 · I/O, Implementation | draft |
|
||||
| `FESA-REQ-SHELL-PRESSURE-004` | constraint | user | must | test | only S4/S4R and SPOS/SNEG | inventory exact | Gate 2/5/6 · Research, I/O, Implementation | draft |
|
||||
| `FESA-REQ-SHELL-PRESSURE-005` | physics | standard | must | analysis | positive/negative direction reversal | sign exact; analytical scale-aware | Gate 2–4/6 · Research, Formulation, Numerical Review, Implementation | draft |
|
||||
| `FESA-REQ-SHELL-PRESSURE-006` | physics | standard | must | test | connectivity/SPOS/SNEG reversal | sign exact; geometry tolerance downstream | Gate 2–4/6 · Research, Formulation, Numerical Review, Implementation | draft |
|
||||
| `FESA-REQ-SHELL-PRESSURE-007` | physics | user | must | analysis | linear reference-area/normal invariant | analytical tolerance downstream | Gate 3/4/6 · Formulation, Numerical Review, Implementation | draft |
|
||||
| `FESA-REQ-SHELL-PRESSURE-008` | physics | standard | must | analysis | current-surface follower objectivity | invariant tolerance downstream | Gate 2–4/6 · Research, Formulation, Numerical Review, Implementation | draft |
|
||||
| `FESA-REQ-SHELL-PRESSURE-009` | numerical | standard | must | analysis | external tangent finite difference | norm/perturbation downstream | Gate 3/4/6 · Formulation, Numerical Review, Implementation | draft |
|
||||
| `FESA-REQ-SHELL-PRESSURE-010` | numerical | derived | must | test | exact-once load-factor scaling | factor exact; roundoff downstream | Gate 3/6 · Formulation, Implementation | draft |
|
||||
| `FESA-REQ-SHELL-PRESSURE-011` | functional | docs | must | test | stable full-DOF assembly/projection | index/order exact | Gate 3/6 · Formulation, Implementation | draft |
|
||||
| `FESA-REQ-SHELL-PRESSURE-012` | physics | docs | must | analysis | reactions and free residual include pressure | internal tolerance downstream | Gate 4/6/7 · Numerical Review, Implementation, Physics | draft |
|
||||
| `FESA-REQ-SHELL-PRESSURE-013` | constraint | docs | must | test | repeated serial/parallel deterministic evidence | discrete/reduction exact | Gate 5/6 · I/O, Implementation | draft |
|
||||
| `FESA-REQ-SHELL-PRESSURE-014` | input | user | must | test | unsupported variant fail-closed | failure exact | Gate 5/6 · I/O, Implementation | draft |
|
||||
| `FESA-REQ-SHELL-PRESSURE-015` | input | docs | must | test | invalid/unresolved/ambiguous surface fail | identity/failure exact | Gate 5/6 · I/O, Implementation | draft |
|
||||
| `FESA-REQ-SHELL-PRESSURE-016` | numerical | user | must | test | invalid procedure/nonfinite/geometry fail | finite/procedure exact; geometry downstream | Gate 4–6 · Numerical Review, I/O, Implementation | draft |
|
||||
| `FESA-REQ-SHELL-PRESSURE-017` | output | docs | must | test | deterministic diagnostic and atomic failure | identity/file-state exact | Gate 5/6 · I/O, Implementation | draft |
|
||||
| `FESA-REQ-SHELL-PRESSURE-018` | output | user | must | inspection | existing HDF5 remains sole authority | schema/authority exact | Gate 5/6 · I/O, Implementation | draft |
|
||||
| `FESA-REQ-SHELL-PRESSURE-019` | output | docs | must | demonstration | existing observable result chain finite | units/coords/id exact | Gate 5–7 · I/O, Implementation, Physics | draft |
|
||||
| `FESA-REQ-SHELL-PRESSURE-020` | verification | derived | must | analysis | S4/S4R linear patch/sign/resultant suite | analytical tolerance downstream | Gate 4/6 · Numerical Review, Implementation | draft |
|
||||
| `FESA-REQ-SHELL-PRESSURE-021` | verification | derived | must | analysis | nonlinear objectivity/tangent/residual/balance | global balance `<=1e-8`; others downstream | Gate 4/6/7 · Numerical Review, Implementation, Physics | draft |
|
||||
| `FESA-REQ-SHELL-PRESSURE-022` | verification | benchmark | must | reference-comparison | exact input/required CSV inventory read-only | path/inventory exact | Gate 4/6 · Numerical Review, Implementation | draft |
|
||||
| `FESA-REQ-SHELL-PRESSURE-023` | verification | docs | must | reference-comparison | one-to-one U blocking/UR warning mapping | `docs/TOLERANCE.md`; precheck exact | Gate 4–6 · Numerical Review, I/O, Implementation | draft |
|
||||
| `FESA-REQ-SHELL-PRESSURE-024` | constraint | docs | must | inspection | reaction review-only, stress excluded | disposition exact | Gate 4–6 · Numerical Review, I/O, Implementation | draft |
|
||||
|
||||
Matrix coverage: normative IDs `24`, matrix rows `24`, orphan normative IDs `0`, matrix-only IDs `0`.
|
||||
|
||||
## 13. Open Questions, Assumptions, and Risks
|
||||
|
||||
### Critical user decisions
|
||||
|
||||
없음. 승인된 physics, supported scope, external tolerance, authoritative output과 reference
|
||||
acceptance boundary를 바꾸는 미결정 사항이 없다.
|
||||
|
||||
### Downstream specialist decisions (사용자 질문 아님)
|
||||
|
||||
- Formulation Agent: surface quadrature, equivalent nodal vector와 follower-load linearization을
|
||||
독립 FESA formulation으로 고정한다.
|
||||
- Numerical Review Agent: analytical patch, degenerate/current geometry, objectivity 및 tangent
|
||||
finite-difference의 scale-aware tolerance와 perturbation을 고정하고, exact reference artifact
|
||||
readiness와 internal gate를 재확인한다.
|
||||
- I/O Definition Agent: 승인 syntax/semantic mapping, diagnostic representation과 existing HDF5
|
||||
projection을 최종 확정한다. 새 authoritative output이 필요하다는 evidence가 없으면 추가하지 않는다.
|
||||
|
||||
### Assumptions and risks
|
||||
|
||||
- ASSUMPTION-001: S4와 S4R은 기존 FESA MITC4 formulation을 선택하되 source type은 보존한다.
|
||||
- ASSUMPTION-002: Zero pressure는 valid no-load scalar이며 surface/model validation을 우회하지 않는다.
|
||||
- RISK-001: Conventional shell의 element-based `*DLOAD P` sign과 surface-based `*DSLOAD P`
|
||||
sign을 혼합하면 방향 오류가 생긴다. 이 기능은 후자만 지원한다.
|
||||
- RISK-002: Follower pressure를 fixed-global nodal load로 근사하면 large rotation과 external
|
||||
tangent가 틀린다.
|
||||
- RISK-003: Reference displacement만 맞추고 global equilibrium/tangent를 생략하면 공통-mode
|
||||
오류를 놓칠 수 있다.
|
||||
|
||||
## 14. Downstream Handoff
|
||||
|
||||
- Research Agent: Abaqus pressure sign/follower evidence, shell-normal convention과 독립 FESA
|
||||
pressure verification sources의 applicability limit를 조사한다. Abaqus 내부 동등성을
|
||||
주장하지 않는다.
|
||||
- Formulation Agent: `FESA-REQ-SHELL-PRESSURE-005`–`012`, `020`–`021`을 구현 가능한
|
||||
pressure virtual-work, load vector 및 external tangent 계약으로 변환한다.
|
||||
- Numerical Review Agent: exact input/displacement artifact, source identity/component/family,
|
||||
common external tolerance와 internal analytical/tangent/equilibrium tolerance를 검토한다.
|
||||
Reaction CSV는 review-only, stress CSV는 excluded로 유지한다.
|
||||
- I/O Definition Agent: `*SURFACE`/`*DSLOAD` subset, fail-closed diagnostics, stable semantic target,
|
||||
existing HDF5 projection과 CSV row mapping을 정의한다.
|
||||
- Coordinator Agent: 이 문서의 Gate 1 evidence를 검토한 뒤에만 다음 owner를 dispatch한다.
|
||||
|
||||
Stage 1 경계에서 code, formulation, C++ API, reference artifact 또는 tolerance policy는 변경하지
|
||||
않았다.
|
||||
@@ -0,0 +1,231 @@
|
||||
# Shell Surface Pressure Load Research Brief
|
||||
|
||||
## 1. Metadata
|
||||
|
||||
- feature_id: `shell-surface-pressure-load`
|
||||
- source_requirement: `docs/shell-surface-pressure-load/requirements.md`
|
||||
- requirement_range: `FESA-REQ-SHELL-PRESSURE-001`–`FESA-REQ-SHELL-PRESSURE-024`
|
||||
- status: `draft-for-coordinator-gate-review`
|
||||
- owner_agent: `research-agent`
|
||||
- date: `2026-08-30`
|
||||
- research_scope: `*SURFACE, TYPE=ELEMENT` + `*DSLOAD` uniform `P` on S4/S4R `SPOS|SNEG`, linear reference-configuration pressure, nonlinear current-configuration follower pressure와 external-load tangent
|
||||
- source_policy: Project contract와 stored artifact가 범위/acceptance를 지배하며, Abaqus 문서는 observable input/behavior만, FEM 문헌은 formulation-neutral theory와 verification risk만 뒷받침한다.
|
||||
- non_equivalence_statement: 이 문서는 Abaqus의 내부 shell formulation, pressure quadrature, stabilization, load-vector 또는 tangent 구현과 FESA의 동등성을 주장하지 않는다.
|
||||
|
||||
## 2. Research Questions
|
||||
|
||||
| id | 질문 | binding requirements |
|
||||
| --- | --- | --- |
|
||||
| `RQ-01` | 승인 syntax에서 element-based named surface와 `DSLOAD P`의 정확한 observable 의미는 무엇인가? | `001`–`004`, `014`–`015` |
|
||||
| `RQ-02` | S4/S4R shell connectivity, `SPOS/SNEG`, selected surface normal과 pressure 부호는 어떻게 연결되는가? | `004`–`006`, `020` |
|
||||
| `RQ-03` | Uniform pressure의 단위, 총 resultant와 work-equivalent nodal generalized force를 뒷받침하는 일반 FEM 원리는 무엇인가? | `002`, `007`, `011`–`012`, `020` |
|
||||
| `RQ-04` | 선형 reference-configuration pressure와 기하비선형 current-configuration follower pressure를 어떤 evidence로 구분하는가? | `007`–`008`, `021` |
|
||||
| `RQ-05` | Configuration-dependent pressure force가 Newton tangent에 기여하는 이유와 symmetry 위험은 무엇인가? | `009`, `016`, `021` |
|
||||
| `RQ-06` | S4/S4R load verification에서 Abaqus element 특성과 generic surface-load theory의 적용 한계는 무엇인가? | `004`, `008`–`009`, `020`–`021` |
|
||||
| `RQ-07` | 어떤 독립/저결합 benchmark 조합이 sign, resultant, objectivity, tangent, equilibrium, determinism과 stored reference를 각각 검증하는가? | `012`–`013`, `016`, `020`–`024` |
|
||||
| `RQ-08` | Exact stored nonlinear case가 직접 증명하는 것과 증명하지 못하는 것은 무엇인가? | `022`–`024` |
|
||||
|
||||
## 3. Source Inventory
|
||||
|
||||
### 3.1 Project and stored evidence
|
||||
|
||||
| source_id | source_type | title | author_or_org | URL_or_path | access_date | reliability_tier | primary_or_secondary | notes / limits |
|
||||
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
|
||||
| `SRC-PRJ-REQ` | approved feature baseline | Shell Surface Pressure Load Feature Requirement Specification | FESA Requirement Agent / Coordinator | `docs/shell-surface-pressure-load/requirements.md` | 2026-08-30 | `Project Primary` | primary | 범위, acceptance, tolerance disposition의 binding source. 이 연구가 변경하지 않는다. |
|
||||
| `SRC-PRJ-CONTRACT` | project contracts | `AGENTS.md`, `PRD.md`, `ARCHITECTURE.md`, `ADR.md`, `TOLERANCE.md`, `SOLVER_AGENT_DESIGN.md` | FESA project | repository paths | 2026-08-30 | `Project Primary` | primary | Independent solver, deterministic full-space load/reaction, unsymmetric nonlinear solver capability, HDF5 authority와 common external tolerance를 고정한다. |
|
||||
| `SRC-LOCAL-REF` | stored reference bundle | `shellNL-meshfine-pressure` | FESA project / existing Abaqus export | `reference/shellNL-meshfine-pressure/` | 2026-08-30 | `Stored Reference` | primary artifact | `.inp`와 CSV가 target/input 값을 제공하지만 formulation derivation이나 Abaqus version/provenance는 제공하지 않는다. Read-only. |
|
||||
|
||||
### 3.2 Tier 1 authoritative manuals
|
||||
|
||||
모든 공식 문서 URL은 Dassault Systèmes SIMULIA Abaqus 2025 online documentation이며 access date는 `2026-08-30`이다.
|
||||
|
||||
| source_id | source_type | exact title / section | author_or_org | URL | reliability_tier | primary_or_secondary | evidence supplied | limitation |
|
||||
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
|
||||
| `SRC-ABA-DSLOAD` | official keyword manual | `*DSLOAD` | Dassault Systèmes SIMULIA | https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-dsload.htm | `Tier 1` | primary | Step-level history data; pressure data line is surface name, `P`, reference magnitude. | Abaqus syntax 전체가 넓으며 FESA allowlist/fail-closed 세부는 `SRC-PRJ-REQ`가 지배한다. |
|
||||
| `SRC-ABA-SURFACE-KEY` | official keyword manual | `*SURFACE` | Dassault Systèmes SIMULIA | https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-surface.htm | `Tier 1` | primary | `NAME`, `TYPE=ELEMENT`, element/ELSET와 face identifier data 형식. | 허용 가능한 전체 surface type을 설명하므로 FESA 승인 subset과 동일하지 않다. |
|
||||
| `SRC-ABA-ELEM-SURFACE` | official modeling manual | Element-Based Surface Definition, especially “Creating Surfaces on Structural, Surface, and Rigid Elements” | Dassault Systèmes SIMULIA | https://docs.software.vt.edu/abaqusv2025/English/SIMACAEMODRefMap/simamod-c-deformablesurf.htm | `Tier 1` | primary | S4 계열의 `SPOS/SNEG`, single-sided surface, orientation consistency와 distributed-load orientation risk. | Contact 등 다른 surface consumer도 포함한다. FESA는 single-sided pressure subset만 승인한다. |
|
||||
| `SRC-ABA-DISTLOAD` | official analysis manual | Distributed Loads, “Surface Tractions and Pressure Loads” and “Follower Surface Loads” | Dassault Systèmes SIMULIA | https://docs.software.vt.edu/abaqusv2025/English/SIMACAEPRCRefMap/simaprc-c-loaddistributed.htm | `Tier 1` | primary | Surface pressure 단위 `force/area`, `DSLOAD surface,P,magnitude`, 양의 pressure는 surface normal 반대, nonlinear follower/current-surface behavior, `DLOAD`와 `DSLOAD` 구분. | 많은 load type/procedure를 다루므로 feature allowlist의 근거가 아니라 observable convention 근거다. |
|
||||
| `SRC-ABA-SHELL-NORMAL` | official element guide | Shell normals and shell surfaces | Dassault Systèmes SIMULIA | https://docs.software.vt.edu/abaqusv2025/English/SIMACAEGSARefMap/simagsa-c-shlnormal.htm | `Tier 1` | primary | 3-D shell positive normal은 connectivity node order의 right-hand rule, top=`SPOS`, bottom=`SNEG`; element-based와 surface-based pressure sign 차이 경고. | Abaqus element-based `DLOAD` sign은 이 feature의 `DSLOAD` sign이 아니다. |
|
||||
| `SRC-ABA-SHELL-CHOICE` | official element guide | Choosing a Shell Element | Dassault Systèmes SIMULIA | https://docs.software.vt.edu/abaqusv2025/English/SIMACAEELMRefMap/simaelm-c-shellelem.htm | `Tier 1` | primary | S4/S4R은 4-node general-purpose finite-membrane-strain shell; large rotation capability; S4 full, S4R reduced integration 및 hourglass risk. | Abaqus element internal formulation 차이는 FESA pressure kernel 또는 quadrature 선택 근거가 아니다. |
|
||||
| `SRC-ABA-PRESSURE-THEORY` | official theory manual | Pressure load stiffness | Dassault Systèmes SIMULIA | https://docs.software.vt.edu/abaqusv2025/English/SIMACAETHERefMap/simathe-c-pressloadsolids.htm | `Tier 1` | primary | Current surface virtual work, current area-vector representation, displacement-dependent equivalent nodal load와 Jacobian contribution. | 3-D solid surface derivation이다. Generic surface kinematics evidence로만 사용하며 S4/S4R 구현 동등성을 뜻하지 않는다. |
|
||||
| `SRC-ABA-SHELL-PRESSURE` | official theory manual | Shear flexible small-strain shell elements, “Pressure load stiffness” | Dassault Systèmes SIMULIA | https://docs.software.vt.edu/abaqusv2025/English/SIMACAETHERefMap/simathe-c-shearflexshells.htm | `Tier 1` | primary | Shell surface virtual work와 load stiffness, uniform magnitude/free-edge 가정 아래 symmetric form을 설명한다. | 대상이 S4R5/S8R5/S9R5/S8R 등 small-strain shell이며 S4/S4R이 아니다. FESA tangent symmetry나 algorithm 선택 근거로 사용할 수 없다. |
|
||||
|
||||
### 3.3 Tier 2 theory sources and Tier 3 navigation
|
||||
|
||||
| source_id | source_type | title | author_or_org | URL_or_DOI_or_ISBN | access_date | reliability_tier | primary_or_secondary | notes / access limits |
|
||||
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
|
||||
| `SRC-FEM-HIBBITT79` | peer-reviewed short communication | Some Follower Forces and Load Stiffness, *International Journal for Numerical Methods in Engineering* 14(6), 937–941 (1979) | H. D. Hibbitt | https://doi.org/10.1002/nme.1620140613 | 2026-08-30 | `Tier 2` | primary | Follower forces depend on displacement and contribute load stiffness needed by Newton/eigenvalue methods. Publisher metadata/abstract accessible; full text may require subscription. |
|
||||
| `SRC-FEM-SR84` | peer-reviewed paper | Displacement Dependent Pressure Loads in Nonlinear Finite Element Analyses, *Computers & Structures* 18(6), 1099–1114 (1984) | K. Schweizerhof, E. Ramm | https://doi.org/10.1016/0045-7949(84)90154-8 | 2026-08-30 | `Tier 2` | primary | Body-/space-attached classification, conservativeness conditions, curved-surface pressure load stiffness와 numerical examples. Publisher full text is access-limited; abstract/metadata used. |
|
||||
| `SRC-FEM-LOGAN` | textbook, stored project reference | A First Course in the Finite Element Method, 4th ed., Sections 3.10, 6.2–6.3, Appendix E | Daryl L. Logan; Nelson/Thomson | ISBN `0-534-55298-6`; vault source `.raw/AFirstCourseInTheFiniteElementMethod/` | 2026-08-30 | `Tier 2` | secondary textbook | 동일 interpolation/work statement로 distributed traction을 consistent nodal force로 바꾸며 resultant/reaction 검증을 연결한다. Copyrighted local reference; 장문 인용하지 않는다. |
|
||||
| `SRC-VAULT-SYNTH` | configured wiki synthesis | `[[Finite Element Load Vector Assembly]]`, `[[Nonlinear Finite Element Analysis]]`, `[[Abaqus Surface and Assembly Modeling]]`, `[[Basic Shell Mathematical Model]]`, `[[Abaqus Loads and Predefined Fields]]` | MultiPhysicsVault | `C:/git/MultiPhysicsVault/wiki/` | 2026-08-30 | `Tier 3` | secondary navigation | Source discovery와 terminology routing에만 사용했다. Core claims는 위 official/publisher/project sources로 재검증했다. Follower-pressure tangent의 S4/S4R-specific coverage는 vault gap이다. |
|
||||
|
||||
Source count: `Project Primary/Stored Reference 3`, public `Tier 1 8`, `Tier 2 3`, vault `Tier 3 1`. Tier 1은 모두 official manual, Tier 2는 peer-reviewed primary 2건과 textbook 1건이다.
|
||||
|
||||
## 4. Extracted Facts and Key-Claim Evidence
|
||||
|
||||
### 4.1 Key-claim evidence table
|
||||
|
||||
| claim_id | verified fact / inference | evidence | direct applicability | limitation | requirement trace |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| `CL-01` | **Verified fact:** `*SURFACE`는 named model region이고 `TYPE=ELEMENT` data line은 element/ELSET와 face identifier를 받는다. `*DSLOAD`는 step history data이고 pressure line은 surface name, `P`, magnitude다. | `SRC-ABA-SURFACE-KEY`, `SRC-ABA-DSLOAD` | 승인 syntax와 model/history 분리 | FESA가 지원할 optional parameters는 requirements allowlist가 제한한다. | `001`, `003`, `014`, `015` |
|
||||
| `CL-02` | **Verified fact:** S4 계열 structural surface는 `SPOS`와 `SNEG` single-sided face를 가진다. Double-sided/edge surface는 oriented distributed surface load와 다른 범주다. | `SRC-ABA-ELEM-SURFACE` | S4/S4R selected-side target | Abaqus가 지원하는 다른 structural element/surface type은 FESA scope가 아니다. | `004`, `006`, `014` |
|
||||
| `CL-03` | **Verified fact:** 3-D shell positive normal은 connectivity node order의 right-hand rule이며 `SPOS`는 positive side, `SNEG`는 negative side다. | `SRC-ABA-SHELL-NORMAL`, `SRC-ABA-ELEM-SURFACE` | Connectivity/side reversal tests | Adjacent normals가 inconsistent하면 oriented surface load가 부정확할 수 있다; diagnostic 정책은 후속 I/O/Numerical Review 소유다. | `005`, `006`, `015` |
|
||||
| `CL-04` | **Verified fact:** Surface-based positive pressure는 local selected surface normal의 반대 방향이고 단위는 force/area다. **Binding inference:** scalar magnitude의 부호를 반전하면 force direction도 반전한다; magnitude absolute-value 처리는 허용되지 않는다. | `SRC-ABA-DISTLOAD`, `SRC-PRJ-REQ` | `DSLOAD P` sign/magnitude contract | Abaqus shell element-based `DLOAD P`는 다른 sign convention이므로 근거로 혼합하면 안 된다. | `002`, `005`, `020` |
|
||||
| `CL-05` | **Verified fact:** `DLOAD`는 element/ELSET + element-face label 방식이고 `DSLOAD`는 named surface + `P` 방식이다. | `SRC-ABA-DISTLOAD`, `SRC-ABA-DSLOAD` | `*DLOAD` fail-closed exclusion | Abaqus 전체 capability가 아니라 FESA subset의 명시적 구분이다. | `001`, `014` |
|
||||
| `CL-06` | **Verified fact:** Distributed surface traction은 interpolation/work-equivalence를 통해 compatible nodal terms로 변환된다. Consistent load는 원 distributed load와 같은 virtual work를 수행해야 한다. | `SRC-FEM-LOGAN`, `SRC-VAULT-SYNTH` | Pressure generalized force와 total resultant/reaction check의 이론적 근거 | 이 사실만으로 quadrature order, drilling moment 또는 FESA element API는 결정되지 않는다. | `007`, `011`, `012`, `020` |
|
||||
| `CL-07` | **Binding fact:** Linear static pressure는 reference coordinates, reference area/normal에서 평가한다. **Theory consistency:** geometrically linear kinematics에서는 load geometry가 displacement로 갱신되지 않는다. | `SRC-PRJ-REQ`; nonlinear contrast `SRC-ABA-DISTLOAD`, `SRC-ABA-PRESSURE-THEORY` | Linear patch expectation | Abaqus와 동일 quadrature를 뜻하지 않는다. | `007`, `020` |
|
||||
| `CL-08` | **Verified fact:** Geometrically nonlinear follower surface load는 surface와 함께 회전한다. Pressure normal과 area measure는 current surface에 의존한다. | `SRC-ABA-DISTLOAD`, `SRC-ABA-PRESSURE-THEORY`, `SRC-FEM-HIBBITT79` | Rigid-rotation objectivity/current-area checks | Material/element internal response와 독립적으로 load kernel을 먼저 검증해야 한다. | `008`, `021` |
|
||||
| `CL-09` | **Verified fact:** Current coordinates로 정의된 pressure virtual work를 nodal displacement에 대해 선형화하면 external load/Jacobian contribution이 생긴다. | `SRC-ABA-PRESSURE-THEORY`, `SRC-FEM-HIBBITT79`, `SRC-FEM-SR84` | Directional finite-difference tangent check | FESA residual sign, matrix assembly sign과 exact discrete expression은 Formulation Agent가 정한다. | `009`, `021` |
|
||||
| `CL-10` | **Verified fact with disagreement boundary:** Pressure follower load가 자동으로 nonconservative/nonsymmetric인 것은 아니다. Conservativeness와 symmetry는 load attachment, loaded boundary/free-edge treatment와 global assembly 조건에 의존한다. Abaqus small-strain shell page는 uniform pressure/free-edge effects neglect 조건의 symmetric form을 기술한다. | `SRC-FEM-SR84`, `SRC-ABA-SHELL-PRESSURE` | Unsymmetric capability를 유지하고 symmetry를 검증 대상으로 삼을 이유 | `SRC-ABA-SHELL-PRESSURE`는 S4/S4R 대상이 아니므로 FESA에서 tangent를 강제 symmetrize할 근거가 아니다. | `009`, `016`, `021` |
|
||||
| `CL-11` | **Verified fact:** S4/S4R은 four-node general-purpose finite-membrane-strain shells이며 large rotation에 사용 가능하다. S4와 S4R의 Abaqus internal integration/hourglass 차이는 존재한다. | `SRC-ABA-SHELL-CHOICE` | Source-type coverage와 두 source type 모두의 test 필요성 | FESA는 두 source type을 existing MITC4로 매핑한다. Abaqus 내부 element equivalence를 주장하지 않는다. | `004`, `020`, `021` |
|
||||
| `CL-12` | **Inference from surface measure:** Surface tangent cross product/area vector가 영 또는 비유한이면 unit normal과 pressure direction은 유효하지 않다. Scale-aware invalid-geometry 기준이 필요하다. | `SRC-ABA-PRESSURE-THEORY`; `SRC-PRJ-REQ` | Degenerate/current geometry fail-closed test | Exact threshold는 이 연구가 정하지 않으며 Numerical Review가 승인한다. | `016` |
|
||||
| `CL-13` | **Verified local fact:** Stored input은 `S4` 676개, node 729개, instance `Part-1-1`, `Surf-1` element 1–676 `SPOS`, `NLGEOM=YES`, `DSLOAD Surf-1,P,1e+06`이다. Required displacement CSV는 factor-one 729 node rows와 six components를 가진다. | `SRC-LOCAL-REF`, `SRC-PRJ-REQ` | Exact end-to-end nonlinear reference candidate | S4R/SNEG/negative pressure/tangent를 직접 분리 검증하지 않는다. | `022`, `023` |
|
||||
| `CL-14` | **Binding project fact:** Stored displacement `U1/U2/U3`는 blocking, `UR1/UR2/UR3`는 warning-only다. Reaction CSV는 review-only이고 stress CSV는 excluded다. | `SRC-PRJ-REQ`, `SRC-PRJ-CONTRACT`, `SRC-LOCAL-REF` | Reference acceptance boundary | Research가 새 family/tolerance를 만들지 않는다. | `023`, `024` |
|
||||
| `CL-15` | **Binding project fact:** HDF5가 authoritative output이며 external comparison은 stable source identity/component one-to-one precheck 뒤 `docs/TOLERANCE.md`를 사용한다. | `SRC-PRJ-CONTRACT`, `SRC-PRJ-REQ` | Downstream reference-model/I/O handoff | Analytical/objectivity/tangent tolerance는 external common tolerance로 대체하지 않는다. | `018`, `019`, `023` |
|
||||
|
||||
### 4.2 Observable Abaqus contract versus FESA-owned formulation
|
||||
|
||||
| observable contract backed by Abaqus sources | FESA-owned decision left downstream |
|
||||
| --- | --- |
|
||||
| `SURFACE, TYPE=ELEMENT, NAME=...`와 element/ELSET + `SPOS/SNEG`; `DSLOAD` data의 surface + `P` + magnitude | Semantic record layout, source-order retention, exact duplicate/ambiguity diagnostics |
|
||||
| Shell connectivity-derived positive normal, `SPOS/SNEG` side | FESA MITC4 surface interpolation, normal/area evaluation and geometry validity scale |
|
||||
| Positive surface pressure acts opposite selected surface normal; force/area units | Discrete equivalent nodal generalized-force expression, numerical integration rule |
|
||||
| NLGEOM pressure is current-surface follower loading | Trial/committed state integration and exact residual sign convention |
|
||||
| Configuration dependence contributes load stiffness/Jacobian | Exact external tangent expression, assembly sign, symmetry treatment |
|
||||
|
||||
The second column cannot be inferred from Abaqus result agreement and must be finalized independently by Formulation and Numerical Review.
|
||||
|
||||
## 5. Theory Summary for Formulation Handoff
|
||||
|
||||
### 5.1 Pressure virtual work and equivalent nodal force
|
||||
|
||||
Generic surface-loading theory represents external virtual work as a surface integral of virtual displacement against traction. For uniform pressure, traction direction is tied to the oriented surface normal and magnitude has force/area units. After inserting the same surface displacement interpolation used by the element, the work-equivalent nodal generalized force is obtained. This establishes three formulation invariants without selecting a final formula:
|
||||
|
||||
1. A rigid virtual translation must recover the total pressure resultant.
|
||||
2. A rigid virtual rotation must recover the total moment about the declared origin.
|
||||
3. Element-local contributions must assemble exactly once into the full generalized load before free/constrained projection.
|
||||
|
||||
`SRC-ABA-PRESSURE-THEORY` gives a current-surface area-vector representation and `SRC-FEM-LOGAN` gives the work-equivalence principle. The Formulation Agent still owns interpolation details, quadrature and DOF embedding.
|
||||
|
||||
### 5.2 Sign map
|
||||
|
||||
Let the connectivity-derived positive shell normal be the orientation reference. The binding observable sign map is:
|
||||
|
||||
| selected side | selected surface normal | positive `P` resultant direction | negative `P` direction |
|
||||
| --- | --- | --- | --- |
|
||||
| `SPOS` | positive shell normal | opposite positive normal | reversed |
|
||||
| `SNEG` | negative shell normal | opposite negative normal | reversed |
|
||||
|
||||
This table is an input/behavior contract, not a finalized residual equation. Residual and tangent signs must be stated together in `formulation.md`.
|
||||
|
||||
### 5.3 Linear configuration
|
||||
|
||||
For the approved linear procedure the binding baseline freezes surface geometry at reference coordinates. Thus pressure direction and surface measure do not vary with displacement and there is no displacement derivative of the external pressure force in that procedure. Flat and distorted reference patches should recover the analytical area-vector resultant independent of any test-only candidate displacement.
|
||||
|
||||
### 5.4 Nonlinear current configuration and objectivity
|
||||
|
||||
For `NLGEOM=YES`, the load must remain normal to and integrated over the current surface. A superposed rigid rotation must rotate the global force resultant by the same rotation without changing scalar pressure or source identity. A deformation that changes surface area may change total resultant magnitude even when the scalar pressure remains constant. These two effects distinguish follower pressure from a fixed-global `CLOAD` approximation.
|
||||
|
||||
### 5.5 External-load linearization and symmetry risk
|
||||
|
||||
Because current surface position, tangent directions and oriented area depend on displacement, the external force derivative is part of a consistent Newton tangent. A directional finite-difference derivative of external force is the formulation-independent verification oracle for the assembled external tangent action.
|
||||
|
||||
Pressure load stiffness must not be presumed symmetric or nonsymmetric solely from the word “follower.” Literature distinguishes conservative and nonconservative cases, and the official Abaqus small-strain shell theory states extra assumptions for its symmetric form. FESA already permits an unsymmetric nonlinear tangent path; Formulation must derive the discrete operator, and Numerical Review must inspect its symmetry properties and boundary assumptions rather than imposing Abaqus's internal choice.
|
||||
|
||||
## 6. Candidate Benchmarks
|
||||
|
||||
No new artifact is created in this stage. `candidate artifact` marked `to-be-authored` means a later approved implementation plan may add a test input; it is not an existing reference target.
|
||||
|
||||
| benchmark_id | candidate / artifact | verifies | target quantities | applicability | cannot verify / limits | requirements |
|
||||
| --- | --- | --- | --- | --- | --- | --- |
|
||||
| `BM-01` | Flat single-element S4 and S4R pressure patch; `to-be-authored` | uniform magnitude, unit/sign, `SPOS/SNEG`, positive/negative/zero reversal | total applied force, constrained reaction, moment about patch centroid, source side identity | Planar nondegenerate quad; linear reference configuration; fully constrained or statically determinate support | Nonlinear follower tangent, curved geometry, displacement accuracy | `002`, `004`–`007`, `012`, `020` |
|
||||
| `BM-02` | Distorted coplanar S4/S4R quad; `to-be-authored` | surface mapping/integration resultant and connectivity reversal | analytical area-vector force/moment, reaction | Convex nondegenerate distorted four-node patch, uniform pressure | Warped/nonplanar exact solution and material response | `006`–`007`, `016`, `020` |
|
||||
| `BM-03` | Same flat region as one/multiple faces with shuffled declaration/member order; `to-be-authored` | mesh resultant invariance, exact-once membership, deterministic semantic/reduction order | global force/moment, reaction, stable source order, repeated-run diagnostic/order evidence | Linear uniform pressure; equivalent geometry and BC | Floating value bitwise equality is implementation/order contract, not continuum accuracy | `003`, `010`–`013`, `020` |
|
||||
| `BM-04` | Planar prescribed trial geometry under rigid rotation and independent homogeneous in-plane area change; `to-be-authored` | current normal objectivity and current-area response | rotated force vector, force norm versus current planar area, source identity | Initially/currently planar nondegenerate S4/S4R patch; nonlinear load evaluation isolated from internal element force | Warped-surface vector-area behavior, full equilibrium convergence and tangent | `008`, `016`, `021` |
|
||||
| `BM-05` | Directional centered finite-difference external-force check on distorted current patch; `to-be-authored` | external tangent consistency | `(f_ext(u+εq)-f_ext(u-εq))/(2ε)` versus assembled external-tangent action | Nondegenerate distorted S4 and S4R; both sides and pressure signs; perturbation remains valid | Cannot detect a common sign error if force and tangent share it; pair with `BM-01/04`. `ε` and norm tolerance remain Numerical Review decisions. | `009`, `016`, `021` |
|
||||
| `BM-06` | Supported nonlinear pressure patch solved to factor one; `to-be-authored` | integration into Newton residual, convergence and global physics | accepted free residual, applied+reaction force and moment balance, load-factor scaling | Existing full-Newton procedure, linear elastic MITC4, valid supports | Does not isolate load tangent from internal tangent; pair with `BM-05`. | `010`–`012`, `019`, `021` |
|
||||
| `BM-07` | Exact stored case: `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure.inp` and `... displacements.csv` | end-to-end parsing, surface resolution, nonlinear pressure response and accepted HDF5 displacement projection | `U1/U2/U3` blocking, `UR1/UR2/UR3` warning-only; exact row identity | 729-node/676-S4 model, `SPOS`, positive `P=1e6`, `NLGEOM=YES`, linear elastic shell | No S4R, SNEG, negative/zero pressure, isolated tangent, independent analytical truth or stress acceptance. Abaqus version/provenance absence is not a readiness failure. | `022`–`024` |
|
||||
| `BM-08` | Focused unsupported/invalid input matrix; `to-be-authored` | fail-closed capability boundary | failure category, source location, zero contribution, output atomicity | `*DLOAD`, unsupported DSLOAD label/parameter, node/double/edge surface, wrong element, ambiguous/empty surface, nonfinite magnitude | Numerical accuracy or formulation | `014`–`017` |
|
||||
|
||||
### Stored artifact inventory
|
||||
|
||||
| role | exact artifact | observed research-stage evidence | disposition |
|
||||
| --- | --- | --- | --- |
|
||||
| input | `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure.inp` | SHA-256 `53718ccc9b41c23fcc1b509a51d66f1347e87aca43a74f1d6cec4d2085f4b90e`; S4, `Surf-1/SPOS`, `NLGEOM=YES`, `DSLOAD P=1e+06` spot-checked | required read-only |
|
||||
| displacement | `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure displacements.csv` | SHA-256 `2fe53f98eac9f04779100721c3edf8049eb1dbfe733ebcbd819aeeed03b81198`; header and factor-one node rows spot-checked | required external comparison |
|
||||
| reaction | `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure reactions.csv` | Header contains `RF1/RF2/RF3/RM1/RM2/RM3` | optional review-only |
|
||||
| stress | `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure stresses.csv` | Header contains element/node/section-point `S11/S22/S33/S12` | excluded from feature numerical comparison |
|
||||
|
||||
## 7. Verification Relevance
|
||||
|
||||
| evidence class | relevant candidates | purpose | acceptance boundary |
|
||||
| --- | --- | --- | --- |
|
||||
| code verification | `BM-01`–`BM-05`, `BM-08` | Sign, geometry mapping, exact-once scale, current-surface force and tangent derivative를 작은 독립 oracle로 검증 | Numerical Review가 analytical/geometry/finite-difference scale-aware tolerance를 확정한다. |
|
||||
| solution verification | `BM-03`, `BM-06` | Mesh/order invariance, nonlinear convergence, accepted free residual과 global balance | Requirement의 internal blocking contract; external common tolerance로 대체하지 않는다. |
|
||||
| external reference comparison | `BM-07` | FESA authoritative HDF5 displacement를 existing Abaqus CSV observable과 비교 | `U` blocking, `UR` warning-only; `docs/TOLERANCE.md`; row precheck exact |
|
||||
| validation | 없음 | 실제 실험/물리 시스템과의 validation은 이 numerical load feature 범위가 아니다. | Correctness를 validation으로 과장하지 않는다. |
|
||||
| physics evaluation preparation | `BM-01`, `BM-04`, `BM-06` | 방향, reaction, rigid rotation, force/moment equilibrium 공통-mode 오류 탐지 | Gate 7 owner가 Implementation evidence 이후 판단한다. |
|
||||
|
||||
Reference displacement 단독 일치는 sign/tangent/common-mode error를 배제하지 못하므로 `BM-01`, `BM-04`, `BM-05`, `BM-06`을 대체할 수 없다.
|
||||
|
||||
## 8. Applicability Limits
|
||||
|
||||
| dimension | applicable evidence | excluded / caution |
|
||||
| --- | --- | --- |
|
||||
| deformation | Linear: reference geometry. Nonlinear: current geometry, large rotation and valid current surface. | Material nonlinearity, dynamics, contact, buckling perturbation은 이 feature 범위 밖이다. |
|
||||
| element | FESA source types S4/S4R mapped to existing MITC4; four-node shell surface. | S3/S8, continuum shell, membrane, solid, beam/pipe, Abaqus internal S4/S4R formulation equivalence 없음. |
|
||||
| material/section | Existing linear isotropic elastic shell material/section. | Hyperelastic, plastic, composite, thickness/offset pressure correction 없음. |
|
||||
| load | Uniform finite scalar `DSLOAD P`; positive/zero/negative; single-sided `SPOS/SNEG`. | `DLOAD`, `PNU`, `HP`, `VP`, `SP`, `TRVEC`, `TRSHR`, amplitude/user distributions, double/edge/node surfaces 제외. |
|
||||
| geometry | Nondegenerate oriented four-node surface; flat/distorted patches and stored curved/deformed response. | Self-intersection, zero/near-zero current area, inconsistent normals require fail-closed criteria; threshold downstream. |
|
||||
| coordinates | Surface orientation from source connectivity; assembled quantities and balance in global Cartesian; nonlinear moments use current `X+u` arms. | Local shell stress/result conventions are not new pressure acceptance quantities. |
|
||||
| units | Pressure `force/length²`, nodal force `force`, physical moment `force·length`, displacement `length`, rotation dimensionless. | No implicit SI assumption; model-consistent unit system required. |
|
||||
| solver behavior | Linear static and approved full-Newton nonlinear static; unsymmetric tangent capability retained. | This research does not choose symmetric tangent, quadrature or solver backend. |
|
||||
| reference | Exact stored S4 positive-SPOS nonlinear case; current filenames/paths. | Reaction distribution review-only, stress excluded, no S4R or sign reversal evidence. |
|
||||
|
||||
## 9. Requirement Traceability
|
||||
|
||||
| requirement IDs | research disposition | evidence / gap |
|
||||
| --- | --- | --- |
|
||||
| `001`–`002` | covered | `CL-01`, `CL-04`; official keyword/load units plus binding subset |
|
||||
| `003` | project-contract only; benchmark supplied | `BM-03`; external literature does not define FESA deterministic identity order |
|
||||
| `004`–`006` | covered | `CL-02`–`CL-04`, `CL-11`; S4/S4R and side/sign evidence |
|
||||
| `007`–`009` | covered for formulation handoff | `CL-06`–`CL-10`; exact discrete formulation remains Gate 3 |
|
||||
| `010`–`013` | project-contract plus verification candidates | `BM-03`, `BM-06`; no external tolerance invented |
|
||||
| `014`–`017` | boundary covered; diagnostics downstream | official distinction plus `BM-08`; exact failure categories/I/O representation remain Gate 5 |
|
||||
| `018`–`019` | project-contract only | `CL-15`; research found no need for new authoritative output |
|
||||
| `020`–`021` | covered with bounded benchmark portfolio | `BM-01`–`BM-06`; perturbation/geometry/objectivity tolerance remains Numerical Review |
|
||||
| `022`–`024` | covered | `CL-13`–`CL-15`, `BM-07`, exact artifact inventory |
|
||||
|
||||
Traceability gaps: normative requirement IDs `0`. Downstream-owned numerical detail gaps are listed below and are not silent research gaps.
|
||||
|
||||
## 10. Open Issues and Source Disagreements
|
||||
|
||||
| issue_id | classification | evidence / search performed | owner / disposition |
|
||||
| --- | --- | --- | --- |
|
||||
| `OI-01` | missing public benchmark evidence, nonblocking | Abaqus 2025 Verification/Benchmark Guide searches for S4/S4R + `DSLOAD`/follower/pressure stiffness did not locate a directly applicable case with downloadable target values. Available shell verification hits concerned curvature/contact/submodeling, not this load contract. | Numerical Review uses analytical patches plus exact stored case; no invented public target. |
|
||||
| `OI-02` | formulation choice, nonblocking | Generic/current-surface linearization can yield nonsymmetric contributions; conservative/global boundary conditions may restore symmetry; Abaqus small-strain shell manual documents a symmetric form under uniform/free-edge assumptions. | Formulation derives FESA operator. Numerical Review examines symmetry/free-edge implications. No user decision unless approved physics/scope changes. |
|
||||
| `OI-03` | numerical acceptance detail, nonblocking | Sources establish area-vector degeneracy and tangent derivative but not a FESA scale-aware invalid-geometry threshold, finite-difference perturbation or norm tolerance. | Numerical Review fixes these before implementation. |
|
||||
| `OI-04` | implementation detail, nonblocking | Sources support work equivalence but do not choose FESA quadrature or S4/S4R-specific load integration. | Formulation owns quadrature and discrete consistency; no Abaqus internal equivalence claim. |
|
||||
| `OI-05` | reference limitation, accepted | Stored bundle contains no Abaqus version/provenance. Requirements/project contracts explicitly state these are not readiness conditions. | Preserve exact artifacts read-only; do not escalate or create metadata. |
|
||||
|
||||
Critical user question: 없음. 승인 scope, physics, tolerance, authoritative output 또는 reference acceptance를 변경해야 하는 source conflict는 발견되지 않았다.
|
||||
|
||||
## 11. Downstream Handoff
|
||||
|
||||
### 11.1 To Formulation Agent through Coordinator
|
||||
|
||||
- Use `CL-03`–`CL-10` as the evidence boundary for connectivity/side sign, work-equivalent surface force, reference/current configuration and external-load linearization.
|
||||
- State pressure force and residual signs together; do not import element-based `DLOAD` shell sign.
|
||||
- Derive FESA's own interpolation, numerical integration and tangent. Do not cite Abaqus result agreement as internal equivalence.
|
||||
- Resolve `OI-02` and `OI-04`: discrete tangent symmetry/free-edge assumptions, quadrature and generalized DOF embedding.
|
||||
- Preserve full-space assembly, exact-once load-factor scaling and existing reaction/free-residual meaning from the binding requirements.
|
||||
|
||||
### 11.2 To Numerical Review Agent through Coordinator
|
||||
|
||||
- Review `BM-01`–`BM-06` as the minimum independent suite before relying on `BM-07`.
|
||||
- Fix scale-aware tolerances for analytical area/resultant, geometry validity, rigid-rotation objectivity and directional finite-difference tangent; do not substitute `docs/TOLERANCE.md` for these internal checks.
|
||||
- Keep exact stored paths and disposition: displacement `U` blocking, `UR` warning-only, reaction CSV review-only, stress CSV excluded.
|
||||
- Confirm one-to-one source identity/component/frame precheck and `docs/TOLERANCE.md` only for the external displacement families.
|
||||
- Carry `OI-01` as a disclosed public-benchmark gap, not as permission to invent targets or modify reference artifacts.
|
||||
|
||||
Research stops here. No formulation, C++ API, implementation, reference solver execution, reference artifact modification or Gate 3 decision was performed.
|
||||
+5
-1
@@ -18,6 +18,10 @@
|
||||
"dir": "nonlinear-static-newton-raphson",
|
||||
"status": "completed",
|
||||
"completed_at": "2026-08-28T21:08:58+0900"
|
||||
},
|
||||
{
|
||||
"dir": "shell-surface-pressure-load",
|
||||
"status": "pending"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
{
|
||||
"project": "FESA Structural Solver",
|
||||
"phase": "shell-surface-pressure-load",
|
||||
"steps": [
|
||||
{
|
||||
"step": 1,
|
||||
"name": "map-pressure-input-contract",
|
||||
"status": "pending"
|
||||
},
|
||||
{
|
||||
"step": 2,
|
||||
"name": "reject-invalid-pressure-input",
|
||||
"status": "pending"
|
||||
},
|
||||
{
|
||||
"step": 3,
|
||||
"name": "evaluate-shell-pressure-kernel",
|
||||
"status": "pending"
|
||||
},
|
||||
{
|
||||
"step": 4,
|
||||
"name": "integrate-linear-shell-pressure",
|
||||
"status": "pending"
|
||||
},
|
||||
{
|
||||
"step": 5,
|
||||
"name": "integrate-nonlinear-follower-pressure",
|
||||
"status": "pending"
|
||||
},
|
||||
{
|
||||
"step": 6,
|
||||
"name": "compare-pressure-reference",
|
||||
"status": "pending"
|
||||
},
|
||||
{
|
||||
"step": 7,
|
||||
"name": "verify-and-report-pressure-feature",
|
||||
"status": "pending"
|
||||
}
|
||||
],
|
||||
"created_at": "2026-09-01T01:29:29+0900"
|
||||
}
|
||||
@@ -0,0 +1,216 @@
|
||||
# Step 1: map-pressure-input-contract
|
||||
|
||||
## 실행 범위와 상태 소유권
|
||||
|
||||
이 Step의 단일 책임은 valid assembly-level `*SURFACE, TYPE=ELEMENT`와 sole static Step의 `*DSLOAD P`를 immutable Domain/Step semantic objects와 non-owning `AnalysisModel` view로 mapping하는 것이다. 이 Step 안에서 `RED -> observed expected failure -> minimal GREEN -> focused VERIFY -> full/Stop VERIFY`를 끝내고 green 상태로 종료한다.
|
||||
|
||||
Implementation Agent는 Executor가 선택한 이 Step만 수행한다. 성공 시 `phases/shell-surface-pressure-load/index.json`의 Step 1 `status`와 한 줄 `summary`만, 오류/차단 시 각각 `error_message` 또는 `blocked_reason`만 기록할 수 있다. branch, retry, timestamps, commits, 다음 Step 선택, top-level phase status와 `step1-output.json`은 Harness Executor 소유다.
|
||||
|
||||
## 읽어야 할 파일
|
||||
|
||||
먼저 전부 읽는다.
|
||||
|
||||
- `AGENTS.md`
|
||||
- `docs/PRD.md`
|
||||
- `docs/ARCHITECTURE.md`
|
||||
- `docs/ADR.md`
|
||||
- `docs/CODINGSTYLE.md`
|
||||
- `docs/HARNESS.md`
|
||||
- `docs/HARNESS_WORKFLOW.md`
|
||||
- `.codex/hooks.json`
|
||||
- `docs/shell-surface-pressure-load/requirements.md`
|
||||
- `docs/shell-surface-pressure-load/research.md`
|
||||
- `docs/shell-surface-pressure-load/formulation.md`
|
||||
- `docs/shell-surface-pressure-load/numerical-review.md`
|
||||
- `docs/shell-surface-pressure-load/reference-model.md`
|
||||
- `docs/shell-surface-pressure-load/io.md`
|
||||
- `docs/shell-surface-pressure-load/implementation-plan.md`
|
||||
- `include/fesa/io/abaqus/input_syntax.h`
|
||||
- `include/fesa/io/abaqus/input_reader.h`
|
||||
- `src/fesa/io/abaqus/input_reader.cpp`
|
||||
- `src/fesa/io/abaqus/domain_mapping_context.h`
|
||||
- `src/fesa/io/abaqus/domain_mapping_context.cpp`
|
||||
- `src/fesa/io/abaqus/topology_mapper.h`
|
||||
- `src/fesa/io/abaqus/topology_mapper.cpp`
|
||||
- `src/fesa/io/abaqus/step_definition_mapper.h`
|
||||
- `src/fesa/io/abaqus/step_definition_mapper.cpp`
|
||||
- `src/fesa/io/abaqus/domain_builder.h`
|
||||
- `src/fesa/io/abaqus/domain_builder.cpp`
|
||||
- `src/fesa/io/abaqus/domain_mapper.cpp`
|
||||
- `include/fesa/model/model_types.h`
|
||||
- `include/fesa/model/domain.h`
|
||||
- `src/fesa/model/domain.cpp`
|
||||
- `include/fesa/analysis/analysis_model.h`
|
||||
- `src/fesa/analysis/analysis_model.cpp`
|
||||
- `tests/unit/io/abaqus/input_reader_test.cpp`
|
||||
- `tests/unit/io/abaqus/input_syntax_test.cpp`
|
||||
- `tests/unit/io/abaqus/domain_mapper_test.cpp`
|
||||
- `tests/unit/io/abaqus/domain_mapping_components_test.cpp`
|
||||
- `src/fesa/CMakeLists.txt`
|
||||
- `tests/CMakeLists.txt`
|
||||
|
||||
이 Step에는 이전 Step 산출물이 없다. Existing parser/domain behavior를 먼저 이해하고 legacy beam/shell inputs를 보존한다.
|
||||
|
||||
## 소유 파일
|
||||
|
||||
먼저 test files를 생성/수정한 뒤 production files를 변경한다.
|
||||
|
||||
- Modify: `include/fesa/io/abaqus/input_syntax.h`
|
||||
- Modify: `src/fesa/io/abaqus/input_reader.cpp`
|
||||
- Modify: `src/fesa/io/abaqus/domain_mapping_context.h`
|
||||
- Modify: `src/fesa/io/abaqus/domain_mapping_context.cpp`
|
||||
- Create: `src/fesa/io/abaqus/surface_definition_mapper.h`
|
||||
- Create: `src/fesa/io/abaqus/surface_definition_mapper.cpp`
|
||||
- Modify: `src/fesa/io/abaqus/domain_mapper.cpp`
|
||||
- Modify: `src/fesa/io/abaqus/step_definition_mapper.cpp`
|
||||
- Modify: `src/fesa/io/abaqus/domain_builder.cpp`
|
||||
- Modify: `include/fesa/model/model_types.h`
|
||||
- Modify: `include/fesa/model/domain.h`
|
||||
- Modify: `src/fesa/model/domain.cpp`
|
||||
- Modify: `include/fesa/analysis/analysis_model.h`
|
||||
- Modify: `src/fesa/analysis/analysis_model.cpp`
|
||||
- Modify/Test: `tests/unit/io/abaqus/input_reader_test.cpp`
|
||||
- Create/Test: `tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp`
|
||||
- Modify: `src/fesa/CMakeLists.txt`
|
||||
- Modify: `tests/CMakeLists.txt`
|
||||
|
||||
`domain_mapper_test.cpp`와 `domain_mapping_components_test.cpp`는 focused regression 대상으로 우선 읽는다. 이 Step의 valid mapping에 직접 필요한 assertion이 새 feature test로 표현되지 않는 경우에만 최소 수정한다.
|
||||
|
||||
## 인터페이스와 semantic contract
|
||||
|
||||
`include/fesa/model/model_types.h`에 다음 의미의 candidate value types를 구현한다. Existing style상 이름을 최소 조정해야 하면 upstream semantic fields와 아래 accessors를 빠짐없이 보존하고 summary에 조정 이유를 기록한다.
|
||||
|
||||
```cpp
|
||||
enum class ShellSurfaceSide { kSpos, kSneg };
|
||||
enum class SurfaceMemberKind { kDirect, kElset };
|
||||
|
||||
struct ElementSurfaceFacetDefinition {
|
||||
EntityIndex element_index;
|
||||
std::size_t facet_ordinal;
|
||||
std::string part_name_raw;
|
||||
std::string part_name_canonical;
|
||||
std::string instance_name_raw;
|
||||
std::string instance_name_canonical;
|
||||
std::int64_t source_element_label;
|
||||
std::string source_element_label_raw;
|
||||
std::string source_element_type;
|
||||
ShellSurfaceSide side;
|
||||
SourceLocation first_member_location;
|
||||
std::size_t first_member_ordinal;
|
||||
SurfaceMemberKind member_kind;
|
||||
std::string elset_name_raw;
|
||||
std::string elset_name_canonical;
|
||||
};
|
||||
|
||||
struct ElementSurfaceDefinition {
|
||||
std::string surface_name_raw;
|
||||
std::string surface_name_canonical;
|
||||
std::vector<ElementSurfaceFacetDefinition> facets;
|
||||
SourceLocation declaration_location;
|
||||
std::size_t declaration_ordinal;
|
||||
};
|
||||
|
||||
struct SurfacePressureLoadDefinition {
|
||||
std::string step_name_raw;
|
||||
std::string step_name_canonical;
|
||||
EntityIndex surface_index;
|
||||
std::string surface_name_raw;
|
||||
std::string surface_name_canonical;
|
||||
std::string load_type;
|
||||
double magnitude;
|
||||
std::string magnitude_raw;
|
||||
SourceLocation keyword_location;
|
||||
SourceLocation data_location;
|
||||
std::size_t data_ordinal;
|
||||
std::size_t load_ordinal;
|
||||
};
|
||||
```
|
||||
|
||||
Required queries:
|
||||
|
||||
```cpp
|
||||
const std::vector<ElementSurfaceDefinition>&
|
||||
Domain::ElementSurfaces() const noexcept;
|
||||
|
||||
const std::vector<SurfacePressureLoadDefinition>&
|
||||
StepDefinition::SurfacePressureLoads() const noexcept;
|
||||
|
||||
bool StepDefinition::UsesNonlinearGeometry() const noexcept;
|
||||
|
||||
const std::vector<SurfacePressureLoadDefinition>&
|
||||
AnalysisModel::ActiveSurfacePressureLoads() const noexcept;
|
||||
```
|
||||
|
||||
`ModelDefinition` owns `element_surfaces`; `StaticStepDefinition` owns `surface_pressure_loads`; committed `Domain`/`StepDefinition` remain immutable. `AnalysisModel` returns non-owning references and never copies/reorders the surface inventory; Domain must outlive it. Pressure records do not enter the existing configuration-independent nodal `Load::ComputeContributions` interface.
|
||||
|
||||
## RED
|
||||
|
||||
Write and register these tests before production implementation:
|
||||
|
||||
- `InpSyntax.AcceptsAsciiKeywordContinuationAndPreservesPhysicalSourceLines`
|
||||
- `ShellSurfacePressureInput.MapsDirectInstanceFacetsForS4AndS4rCaseInsensitively`
|
||||
- `ShellSurfacePressureInput.MapsExplicitInstanceElsetAndResultNeutralInternalParameter`
|
||||
- `ShellSurfacePressureInput.MapsMixedDirectAndElsetMembersAcrossTwoExplicitInstancesWithStableDataMemberAndElsetOrder`
|
||||
- `ShellSurfacePressureInput.PreservesSposSnegMagnitudeTextLocationsAndSourceOrder`
|
||||
- `ShellSurfacePressureDomain.OwnsCanonicalFacetsAndStepOwnedAdditivePressureRecords`
|
||||
- `ShellSurfacePressureDomain.AnalysisModelBorrowsActivePressureWithoutCopyingDomain`
|
||||
- `ShellSurfacePressureInput.AcceptsWhitespaceSignedZeroAndFiniteScientificNotation`
|
||||
|
||||
The mixed-instance fixture declares `Instance-A` and `Instance-B` in distinct declaration order, interleaves differently cased direct members and flat assembly ELSET members bound by explicit `INSTANCE=`, and uses the same numeric element label in both instances. It must compare case-insensitive resolution, raw data/member ordinals, flat ELSET provenance, canonical facet order, distinct part/instance/source label/source type/side identities and first-member provenance exactly. It must not accept implicit-instance syntax.
|
||||
|
||||
After test edits and CMake test registration, run:
|
||||
|
||||
```powershell
|
||||
cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 `
|
||||
"-DFESA_GTEST_SOURCE_DIR=C:/git/googletest" `
|
||||
"-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" `
|
||||
"-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" `
|
||||
"-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"
|
||||
cmake --build .harness/build --config Debug --target fesa_unit_tests
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^(InpSyntax|ShellSurfacePressureInput|ShellSurfacePressureDomain)\."
|
||||
```
|
||||
|
||||
Expected RED: missing mapper/header/semantic accessors produces compile/link failure, or current unsupported `SURFACE`/`DSLOAD` behavior fails assertions. The mixed-instance fixture must fail because the two explicit instances/mixed direct+ELSET are not resolved or committed identity/provenance is absent. Record command, exit code, duration and meaningful output tail. An unrelated existing failure is `regression`; an unexpected pass is an `evidence-gap`. Stop before production changes until the expected RED is observed.
|
||||
|
||||
## Minimal GREEN
|
||||
|
||||
- Support physical-line ASCII/256-byte policy, comma/cardinality, physical locations and keyword-parameter-only continuation exactly as `io.md` §3 defines. Do not invent inline comments or data continuation.
|
||||
- Parse assembly-only element surfaces and parameterless step-level DSLOAD. Surface parameters are exactly `TYPE=ELEMENT` and `NAME`; DSLOAD data is exactly `<surface>,P,<finite C-locale scalar>`.
|
||||
- Run `SurfaceDefinitionMapper` after topology finalization and before Step binding. Resolve direct `<instance>.<positive label>` and flat assembly ELSETs with explicit `INSTANCE=` case-insensitively.
|
||||
- One surface may mix direct/ELSET members and multiple explicit instances. Preserve raw data/member order and ELSET expansion provenance, then sort unique committed facets by `(instance declaration ordinal, numeric element label, SPOS before SNEG)`.
|
||||
- Preserve each facet's internal `element_index` plus part/instance raw+canonical identity, source label/raw token, exact `S4|S4R`, side, facet ordinal and first-member provenance.
|
||||
- Preserve each Step pressure record's step/surface raw+canonical identity, `load_type="P"`, signed magnitude/raw token, keyword/data locations, data ordinal and total Step load ordinal. Records remain distinct/additive.
|
||||
- Bind pressure surface references only after every candidate target validates. DomainBuilder commits once. Legacy `StaticStepDefinition` constructors delegate with an empty pressure vector.
|
||||
|
||||
## VERIFY and Acceptance Criteria
|
||||
|
||||
If `.harness/config.json` exists at execution time, its complete configure/build/test selection takes precedence and the exact resolved commands must be recorded. Otherwise execute:
|
||||
|
||||
```powershell
|
||||
cmake --build .harness/build --config Debug --target fesa_unit_tests
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^(InpSyntax|ShellSurfacePressureInput|ShellSurfacePressureDomain)\."
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^(InpDomainMapping|DomainMappingComponents|InpSyntax)\."
|
||||
cmake --build .harness/build --config Debug
|
||||
ctest --test-dir .harness/build -C Debug --show-only=json-v1
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure
|
||||
```
|
||||
|
||||
Acceptance requires exit `0`, nonzero discovered tests, all named tests present/pass, no new MSVC `/W4 /WX` warnings, and all legacy tests green. The automatic Stop hook performs another whole-project MSVC validation; do not call hook scripts manually.
|
||||
|
||||
## 불변식, 실패 처리와 증거
|
||||
|
||||
- Supported: mixed direct/ELSET and multiple explicit instances in one surface. Unsupported: implicit-instance ELSET, one ELSET mixing instances, part-scope fallback.
|
||||
- Same numeric label in different instances is never merged. Source identity is not replaced by internal/equation index.
|
||||
- Parse/map failure returns no Domain and exposes no partial surface/load. Do not update AnalysisState or HDF5.
|
||||
- Evidence must record RED/GREEN/VERIFY commands, exits, durations/tails, mapped facet/load inventory, source identity/order, warnings and changed files.
|
||||
- Failure classification: `configure | compile | link | test | harness | environment | upstream-contract | regression | evidence-gap`.
|
||||
|
||||
Trace: `FESA-REQ-SHELL-PRESSURE-001`–`004`, `010`, `013`; `io.md` §§2–6; `formulation.md` §3.
|
||||
|
||||
## 금지사항
|
||||
|
||||
- Do not implement pressure force/tangent or procedure assembly. 이유: Steps 3–5 ownership이다.
|
||||
- Do not support `*DLOAD`, implicit-instance ELSET, part surface, generalized distributed loads or additional element types. 이유: approved subset 밖이다.
|
||||
- Do not change HDF5 schema, CLI output contract, upstream docs, tolerance or reference artifacts.
|
||||
- Do not run Abaqus/reference solvers, create output JSON, invoke `scripts/execute.py`, select Step 2, commit or push.
|
||||
|
||||
@@ -0,0 +1,121 @@
|
||||
# Step 2: reject-invalid-pressure-input
|
||||
|
||||
## 실행 범위와 상태 소유권
|
||||
|
||||
이 Step의 단일 책임은 Step 1의 pressure input/model mapping에 deterministic fail-closed negative semantics, duplicate rules, diagnostics and atomic commit behavior를 완결하는 것이다. 동일 Step 안에서 RED부터 full green까지 끝낸다.
|
||||
|
||||
Implementation Agent는 Executor-selected Step 2만 수행하고 task index의 Step 2 `status`와 한 줄 `summary`/`error_message`/`blocked_reason`만 기록한다. Executor가 timestamps, commits, retry, advancement, top-level status와 output JSON을 소유한다.
|
||||
|
||||
## 읽어야 할 파일
|
||||
|
||||
- `AGENTS.md`
|
||||
- `docs/ARCHITECTURE.md`
|
||||
- `docs/ADR.md`
|
||||
- `docs/CODINGSTYLE.md`
|
||||
- `docs/HARNESS.md`
|
||||
- `docs/HARNESS_WORKFLOW.md`
|
||||
- `.codex/hooks.json`
|
||||
- `docs/shell-surface-pressure-load/requirements.md`
|
||||
- `docs/shell-surface-pressure-load/formulation.md`
|
||||
- `docs/shell-surface-pressure-load/numerical-review.md`
|
||||
- `docs/shell-surface-pressure-load/io.md`
|
||||
- `docs/shell-surface-pressure-load/implementation-plan.md`
|
||||
- `include/fesa/core/ascii.h`
|
||||
- `include/fesa/core/diagnostic.h`
|
||||
- `include/fesa/model/source_target_resolver.h`
|
||||
- `src/fesa/model/source_target_resolver.cpp`
|
||||
- `include/fesa/io/abaqus/input_syntax.h`
|
||||
- `src/fesa/io/abaqus/input_reader.cpp`
|
||||
- `src/fesa/io/abaqus/domain_mapping_context.h`
|
||||
- `src/fesa/io/abaqus/domain_mapping_context.cpp`
|
||||
- `src/fesa/io/abaqus/surface_definition_mapper.h`
|
||||
- `src/fesa/io/abaqus/surface_definition_mapper.cpp`
|
||||
- `src/fesa/io/abaqus/step_definition_mapper.cpp`
|
||||
- `src/fesa/io/abaqus/domain_builder.cpp`
|
||||
- `tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp`
|
||||
- `tests/unit/io/abaqus/domain_mapper_test.cpp`
|
||||
- `tests/unit/io/abaqus/domain_mapping_components_test.cpp`
|
||||
|
||||
Read Step 1's implementation and tests closely. Its required outputs are the Domain-owned immutable surface/facet inventory, Step-owned provenance-rich pressure records, multi-explicit-instance valid support and non-owning AnalysisModel accessors. Do not replace those contracts.
|
||||
|
||||
## 소유 파일
|
||||
|
||||
- Modify/Test first: `tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp`
|
||||
- Modify/Test if needed: `tests/unit/io/abaqus/domain_mapper_test.cpp`
|
||||
- Modify/Test if needed: `tests/unit/io/abaqus/domain_mapping_components_test.cpp`
|
||||
- Modify: `src/fesa/io/abaqus/input_reader.cpp`
|
||||
- Modify: `src/fesa/io/abaqus/domain_mapping_context.h`
|
||||
- Modify: `src/fesa/io/abaqus/domain_mapping_context.cpp`
|
||||
- Modify: `src/fesa/io/abaqus/surface_definition_mapper.h`
|
||||
- Modify: `src/fesa/io/abaqus/surface_definition_mapper.cpp`
|
||||
- Modify: `src/fesa/io/abaqus/step_definition_mapper.cpp`
|
||||
- Modify: `src/fesa/io/abaqus/domain_builder.cpp`
|
||||
|
||||
Do not add another production type or parser framework.
|
||||
|
||||
## RED
|
||||
|
||||
Add these named tests first:
|
||||
|
||||
- `ShellSurfacePressureInput.RejectsNonAsciiOverlengthOrIllegalContinuationAtStableLocation`
|
||||
- `ShellSurfacePressureInput.RejectsUnsupportedSurfaceParametersTypesSidesAndTargetKinds`
|
||||
- `ShellSurfacePressureInput.RejectsDsloadParametersLabelsDistributionsAndCardinality`
|
||||
- `ShellSurfacePressureInput.RejectsEmptyMissingAmbiguousAndCrossScopeSurfaceTargets`
|
||||
- `ShellSurfacePressureInput.RejectsImplicitInstanceNestedCyclicAndMalformedElsets`
|
||||
- `ShellSurfacePressureInput.NormalizesExactSameSideDuplicatesWithOneStableWarning`
|
||||
- `ShellSurfacePressureInput.RejectsConflictingSidesForOneElement`
|
||||
- `ShellSurfacePressureInput.RejectsNonfiniteDExponentAndLocaleDependentMagnitudes`
|
||||
- `ShellSurfacePressureInput.PreservesAdditiveRepeatedPressureRowsWithoutDeduplication`
|
||||
- `ShellSurfacePressureDomain.MappingFailureCommitsNoPartialSemanticCandidate`
|
||||
- `ShellSurfacePressureInput.EmitsDiagnosticsInStableSourceOrderAcrossRepeatedRuns`
|
||||
|
||||
Run before production edits:
|
||||
|
||||
```powershell
|
||||
cmake --build .harness/build --config Debug --target fesa_unit_tests
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^(ShellSurfacePressureInput|ShellSurfacePressureDomain)\."
|
||||
```
|
||||
|
||||
Expected RED: the Step 1 happy-path mapper accepts at least one unsupported form, lacks complete stable diagnostics, or does not distinguish exact same-side normalization from conflicting-side failure. Record command, exit, duration and tail. Unexpected pass is an evidence gap; unrelated failure is regression and must be resolved/classified before GREEN.
|
||||
|
||||
## Minimal GREEN
|
||||
|
||||
- Apply exact allowed parameter/label/cardinality tables from `io.md` §§2–3. Reject unsupported flags, types, labels, distributions, scopes and target kinds without reinterpretation.
|
||||
- Reject non-ASCII/control/overlength physical input, illegal continuation, malformed or nonfinite numeric tokens, `D` exponent and locale-dependent forms at the actual failing source line.
|
||||
- Reject missing, empty, ambiguous, cross-scope, implicit-instance, nested/cyclic and malformed ELSET targets. A single mixed-instance ELSET remains unsupported; multiple separately explicit-instance members in one surface remain valid from Step 1.
|
||||
- Normalize an exact same `(instance, element label, side)` duplicate to one facet and emit exactly one deterministic `duplicate-surface-member-normalized` warning after the first identity. Reject conflicting SPOS/SNEG for the same instance/element and duplicate case-insensitive surface declarations.
|
||||
- Never deduplicate identical DSLOAD rows: each remains a distinct additive `load_ordinal`.
|
||||
- Validate every raw target before semantic commit, sort diagnostics by `(file source order, line, member/load ordinal, code, entity identity)`, and return no Domain on error. Preserve full `entity_identity` fields from `io.md` §9.
|
||||
|
||||
## VERIFY and Acceptance Criteria
|
||||
|
||||
If `.harness/config.json` exists, use its resolved commands first. Otherwise run:
|
||||
|
||||
```powershell
|
||||
cmake --build .harness/build --config Debug --target fesa_unit_tests
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^(ShellSurfacePressureInput|ShellSurfacePressureDomain)\."
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^(InpDomainMapping|DomainMappingComponents|InpSyntax)\."
|
||||
cmake --build .harness/build --config Debug
|
||||
ctest --test-dir .harness/build -C Debug --show-only=json-v1
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure
|
||||
```
|
||||
|
||||
Acceptance requires every named negative test and legacy parser/domain test green, exact diagnostic tuple `(severity,code,file,line,keyword,entity_identity,message)`, repeated-run diagnostic order exact, no partial Domain, nonzero CTest discovery, no new warning and full CTest pass. Let Stop hook run automatically.
|
||||
|
||||
## 불변식, 실패 처리와 증거
|
||||
|
||||
- Exact duplicate normalization and incompatible duplicate error are distinct.
|
||||
- All missing/extra/ambiguous/cyclic/cross-scope/nonfinite failures occur before tolerance/analysis/HDF5.
|
||||
- Existing inputs without pressure remain unchanged.
|
||||
- Evidence records RED and GREEN commands/exits/durations/tails, expected diagnostic codes/locations/entities, warning count and repeated diagnostic sequence.
|
||||
- Failure classification: `configure | compile | link | test | harness | environment | upstream-contract | regression | evidence-gap`.
|
||||
|
||||
Trace: `FESA-REQ-SHELL-PRESSURE-002`–`004`, `013`–`017`; `io.md` §§2–6, 9; `formulation.md` §11; `numerical-review.md` §6 invalid-input checks.
|
||||
|
||||
## 금지사항
|
||||
|
||||
- Do not implement the evaluator/assembler, change tolerance, rewrite artifacts or refactor the general parser. 이유: 이 Step의 negative semantic scope 밖이다.
|
||||
- Do not weaken the valid multi-explicit-instance contract from Step 1.
|
||||
- Do not modify upstream docs, HDF5 writers, source reference files or phase statuses other than Step 2's Executor-selected record.
|
||||
- Do not run Abaqus, create output JSON, invoke `scripts/execute.py`, advance Step 3, commit or push.
|
||||
|
||||
@@ -0,0 +1,157 @@
|
||||
# Step 3: evaluate-shell-pressure-kernel
|
||||
|
||||
## 실행 범위와 상태 소유권
|
||||
|
||||
이 Step의 단일 책임은 one four-node shell facet의 reference/current surface-pressure `24x1` external force와 exact `24x24` external tangent를 backend-neutral하게 계산하는 것이다. Parser, full-space assembler, analysis procedure and HDF5 integration은 범위 밖이다. Same Step에서 RED, expected failure, minimal GREEN and complete VERIFY를 수행한다.
|
||||
|
||||
Implementation Agent는 Step 3 record의 `status`와 한 줄 `summary`/`error_message`/`blocked_reason`만 기록한다. Executor는 branch, retry, timestamps, commit, advancement, top-level status and output JSON을 소유한다.
|
||||
|
||||
## 읽어야 할 파일
|
||||
|
||||
- `AGENTS.md`
|
||||
- `docs/ARCHITECTURE.md`
|
||||
- `docs/ADR.md`
|
||||
- `docs/CODINGSTYLE.md`
|
||||
- `docs/HARNESS.md`
|
||||
- `docs/HARNESS_WORKFLOW.md`
|
||||
- `.codex/hooks.json`
|
||||
- `docs/shell-surface-pressure-load/requirements.md`
|
||||
- `docs/shell-surface-pressure-load/formulation.md` §§6, 9–10, 13–14
|
||||
- `docs/shell-surface-pressure-load/numerical-review.md` §§3–6
|
||||
- `docs/shell-surface-pressure-load/io.md` §§4–6, 9
|
||||
- `docs/shell-surface-pressure-load/implementation-plan.md`
|
||||
- `include/fesa/model/model_types.h`
|
||||
- `include/fesa/model/shell_geometry.h`
|
||||
- `src/fesa/model/shell_geometry.cpp`
|
||||
- `include/fesa/elements/mitc4_shell.h`
|
||||
- `src/fesa/elements/mitc4_shell.cpp`
|
||||
- `include/fesa/elements/nonlinear_mitc4_shell.h`
|
||||
- `src/fesa/elements/nonlinear_mitc4_shell.cpp`
|
||||
- `include/fesa/math/vector3.h`
|
||||
- `include/fesa/math/matrix.h`
|
||||
- `tests/unit/elements/mitc4_shell_test.cpp`
|
||||
- `tests/unit/elements/nonlinear_mitc4_shell_test.cpp`
|
||||
- `tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp`
|
||||
- `src/fesa/CMakeLists.txt`
|
||||
- `tests/CMakeLists.txt`
|
||||
|
||||
Prior-Step files to read: `src/fesa/io/abaqus/surface_definition_mapper.h/.cpp`, `include/fesa/model/model_types.h`, `include/fesa/model/domain.h`, `src/fesa/model/domain.cpp`, `include/fesa/analysis/analysis_model.h`, `src/fesa/analysis/analysis_model.cpp`, `tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp`. They define immutable side/magnitude/source identity only; this Step must not revise parser semantics.
|
||||
|
||||
## 소유 파일과 인터페이스
|
||||
|
||||
- Create test first: `tests/unit/loads/shell_surface_pressure_test.cpp`
|
||||
- Create: `include/fesa/loads/shell_surface_pressure.h`
|
||||
- Create: `src/fesa/loads/shell_surface_pressure.cpp`
|
||||
- Modify: `src/fesa/CMakeLists.txt`
|
||||
- Modify: `tests/CMakeLists.txt`
|
||||
|
||||
Implement this semantic interface:
|
||||
|
||||
```cpp
|
||||
enum class SurfacePressureConfiguration { kReference, kCurrent };
|
||||
|
||||
struct ShellSurfacePressureInput {
|
||||
std::array<Vector3, 4> reference_coordinates;
|
||||
std::array<Vector3, 4> translational_displacements;
|
||||
ShellSurfaceSide side;
|
||||
double pressure_magnitude;
|
||||
double load_factor;
|
||||
SurfacePressureConfiguration configuration;
|
||||
SourceLocation location;
|
||||
std::string entity_identity;
|
||||
};
|
||||
|
||||
struct ShellSurfacePressureContribution {
|
||||
std::array<double, 24> force;
|
||||
std::array<double, 24 * 24> external_tangent;
|
||||
};
|
||||
|
||||
Result<ShellSurfacePressureContribution> EvaluateShellSurfacePressure(
|
||||
const ShellSurfacePressureInput& input);
|
||||
```
|
||||
|
||||
The tangent is fixed-node/source-order row-major. Translation DOFs occupy local components 0–2 per node; all rotation force entries and all tangent rows/columns touching components 3–5 are exact zero. No MKL, TBB, HDF5, parser or procedure type may cross this public solver-core boundary.
|
||||
|
||||
## RED
|
||||
|
||||
Write and register these tests before the new production header/source:
|
||||
|
||||
- `ShellSurfacePressureKernel.PartitionsUnityAndIntegratesPlanarResultantAndMoment`
|
||||
- `ShellSurfacePressureKernel.ReversesExactlyForSposSnegAndNegativeMagnitude`
|
||||
- `ShellSurfacePressureKernel.UsesReferenceGeometryWithExactZeroLinearTangent`
|
||||
- `ShellSurfacePressureKernel.UsesCurrentAreaAndNormalForFollowerForce`
|
||||
- `ShellSurfacePressureKernel.HasExactZeroRotationalForceRowsAndTangentBlocks`
|
||||
- `ShellSurfacePressureKernel.IsTranslationAndRigidRotationObjective`
|
||||
- `ShellSurfacePressureKernel.IsCovariantUnderCyclicNodeRelabeling`
|
||||
- `ShellSurfacePressureKernel.MatchesCenteredFiniteDifferenceForForceAndResidualSigns`
|
||||
- `ShellSurfacePressureKernel.PreservesGenerallyNonsymmetricFollowerTangent`
|
||||
- `ShellSurfacePressureKernel.RejectsNonfiniteCollapsedFoldedAndInvertedGeometryAtEveryRequiredPoint`
|
||||
- `ShellSurfacePressureKernel.ValidatesGeometryEvenForZeroPressureOrFactor`
|
||||
|
||||
Run:
|
||||
|
||||
```powershell
|
||||
cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 `
|
||||
"-DFESA_GTEST_SOURCE_DIR=C:/git/googletest" `
|
||||
"-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" `
|
||||
"-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" `
|
||||
"-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"
|
||||
cmake --build .harness/build --config Debug --target fesa_unit_tests
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^ShellSurfacePressureKernel\."
|
||||
```
|
||||
|
||||
Expected RED: compile/link fails because the evaluator declaration/definition is absent. If the header is staged first, physics assertions must fail until implementation exists. Record exact command, exit, duration and tail. Do not use existing MITC4 internal-force code as pressure GREEN. Unexpected pass is evidence-gap; unrelated failure is regression.
|
||||
|
||||
## Minimal GREEN
|
||||
|
||||
- Use one common `2x2` Gauss rule in fixed order `(-1/sqrt(3),-1/sqrt(3))`, `(+,-)`, `(+,+)`, `(-,+)` and bilinear four-node `N_i`/derivatives.
|
||||
- Let `s=+1` for SPOS and `s=-1` for SNEG. At each point use the approved area vector and compute `f_i = -lambda*p*s*sum(w*N_i*a)`.
|
||||
- Reference configuration ignores displacement and returns an exactly zero tangent. Current configuration uses only translations in `x=X+u`.
|
||||
- Implement the exact current follower derivative
|
||||
`K_ext,ij = lambda*p*s*sum(w*N_i*(N_j,xi*[g_eta]_x - N_j,eta*[g_xi]_x))`.
|
||||
Test both external-force derivative and residual-sign form. Never symmetrize it.
|
||||
- Validate finite input/intermediates and the approved mean/corner/Gauss chord-scaled geometry rules with the single dimensionless `tau_J=1e-12`. Validate geometry even if `p==0` or `lambda==0`.
|
||||
- Do not use `max(1,...)`, absolute floors, zero clamps, connectivity reorder or normal flips.
|
||||
|
||||
## VERIFY and Acceptance Criteria
|
||||
|
||||
Use `.harness/config.json` first if present; otherwise:
|
||||
|
||||
```powershell
|
||||
cmake --build .harness/build --config Debug --target fesa_unit_tests
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^ShellSurfacePressureKernel\."
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^(Mitc4Shell|NonlinearMitc4Shell|NonlinearMitc4ShellTangent)\."
|
||||
cmake --build .harness/build --config Debug
|
||||
ctest --test-dir .harness/build -C Debug --show-only=json-v1
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure
|
||||
```
|
||||
|
||||
Acceptance:
|
||||
|
||||
- shape-function sum error `<=1e-14`;
|
||||
- normalized resultant, moment, sign, objectivity and covariance errors `<=1e-12`;
|
||||
- centered FD uses `h=1e-5` and normalized tangent error `<=1e-8`;
|
||||
- rotation blocks are bitwise/exact zero;
|
||||
- at least one approved off-diagonal antisymmetric tangent pair is nonzero;
|
||||
- every invalid geometry/nonfinite case fails without a contribution;
|
||||
- nonzero CTest inventory, full pass, no new MSVC warning.
|
||||
|
||||
The Stop hook runs automatically; do not execute hook entry points manually.
|
||||
|
||||
## 불변식, 실패 처리와 증거
|
||||
|
||||
- Force and tangent use identical geometry and Gauss evaluations.
|
||||
- Failure returns no contribution and does not mutate caller arrays/state.
|
||||
- Fixed loop/order yields deterministic values and diagnostics.
|
||||
- Record RED/GREEN/VERIFY commands, exits, durations/tails, normalized metrics, FD numerator/denominator/h, antisymmetric entries, exact-zero checks and diagnostic identity/location.
|
||||
- Failure classification: `configure | compile | link | test | harness | environment | upstream-contract | regression | evidence-gap`.
|
||||
|
||||
Trace: `FESA-REQ-SHELL-PRESSURE-005`–`009`, `016`, `020`–`021`; formulation §§6, 9–10, 13–14; numerical-review kernel/objectivity/tangent/geometry checks.
|
||||
|
||||
## 금지사항
|
||||
|
||||
- Do not alter MITC4 internal constitutive/stiffness formulation, add pressure stress recovery, configurable integration or vendor dependencies.
|
||||
- Do not implement full-space assembly or linear/nonlinear procedure changes; those belong to Steps 4–5.
|
||||
- Do not modify parser contracts, upstream docs, HDF5, tolerance or reference artifacts.
|
||||
- Do not run reference solvers, create output JSON, invoke Executor, advance Step 4, commit or push.
|
||||
|
||||
@@ -0,0 +1,165 @@
|
||||
# Step 4: integrate-linear-shell-pressure
|
||||
|
||||
## 실행 범위와 상태 소유권
|
||||
|
||||
이 Step의 single responsibility는 Step 3 local evaluator를 deterministic full-space pressure assembler와 linear-static reference-configuration path에 연결하고 existing schema-0/CLI/reaction/equilibrium behavior를 검증하는 것이다. Nonlinear follower procedure는 Step 5 범위다.
|
||||
|
||||
Complete test-first RED, expected failure, minimal GREEN, focused and full VERIFY in this Step. Update only Step 4's selected status and one-line Codex-owned payload. Executor owns branch, retry, timestamps, commit, advancement, top-level phase status and output JSON.
|
||||
|
||||
## 읽어야 할 파일
|
||||
|
||||
- `AGENTS.md`
|
||||
- `docs/ARCHITECTURE.md`
|
||||
- `docs/ADR.md`
|
||||
- `docs/CODINGSTYLE.md`
|
||||
- `docs/HARNESS.md`
|
||||
- `docs/HARNESS_WORKFLOW.md`
|
||||
- `.codex/hooks.json`
|
||||
- `docs/shell-surface-pressure-load/requirements.md`
|
||||
- `docs/shell-surface-pressure-load/formulation.md` §§9, 11–14
|
||||
- `docs/shell-surface-pressure-load/numerical-review.md` §6
|
||||
- `docs/shell-surface-pressure-load/io.md` §§6–7, 9–10
|
||||
- `docs/shell-surface-pressure-load/implementation-plan.md`
|
||||
- Prior semantic outputs: `include/fesa/model/model_types.h`, `include/fesa/model/domain.h`, `src/fesa/model/domain.cpp`, `include/fesa/analysis/analysis_model.h`, `src/fesa/analysis/analysis_model.cpp`
|
||||
- Prior evaluator outputs: `include/fesa/loads/shell_surface_pressure.h`, `src/fesa/loads/shell_surface_pressure.cpp`, `tests/unit/loads/shell_surface_pressure_test.cpp`
|
||||
- `include/fesa/assembly/load_assembler.h`
|
||||
- `src/fesa/assembly/load_assembler.cpp`
|
||||
- `include/fesa/assembly/sparse_assembler.h`
|
||||
- `src/fesa/assembly/sparse_assembler.cpp`
|
||||
- `include/fesa/assembly/parallel_for.h`
|
||||
- `src/fesa/assembly/parallel_for.cpp`
|
||||
- `include/fesa/fem/dof_manager.h`
|
||||
- `src/fesa/fem/dof_manager.cpp`
|
||||
- `src/fesa/analysis/linear_static_procedure.cpp`
|
||||
- `include/fesa/analysis/analysis_state.h`
|
||||
- `src/fesa/analysis/analysis_state.cpp`
|
||||
- `include/fesa/results/result_recovery.h`
|
||||
- `src/fesa/results/result_recovery.cpp`
|
||||
- `src/fesa/results/global_equilibrium_recovery.h`
|
||||
- `src/fesa/results/global_equilibrium_recovery.cpp`
|
||||
- `include/fesa/io/hdf5/hdf5_results_writer.h`
|
||||
- `src/fesa/io/hdf5/hdf5_results_writer.cpp`
|
||||
- `src/fesa/io/hdf5/hdf5_self_check.h`
|
||||
- `src/fesa/io/hdf5/hdf5_self_check.cpp`
|
||||
- `src/fesa/app/fesa_application.cpp`
|
||||
- `tests/unit/assembly/load_assembler_test.cpp`
|
||||
- `tests/unit/assembly/sparse_assembler_test.cpp`
|
||||
- `tests/integration/analysis/linear_static_analysis_test.cpp`
|
||||
- `tests/integration/app/fesa_application_test.cpp`
|
||||
- `tests/unit/io/hdf5/hdf5_results_writer_test.cpp`
|
||||
- `src/fesa/CMakeLists.txt`
|
||||
- `tests/CMakeLists.txt`
|
||||
|
||||
## 소유 파일과 인터페이스
|
||||
|
||||
- Create test first: `tests/unit/assembly/surface_pressure_assembler_test.cpp`
|
||||
- Create test first: `tests/integration/analysis/shell_surface_pressure_linear_test.cpp`
|
||||
- Create test first: `tests/integration/app/shell_surface_pressure_application_test.cpp`
|
||||
- Create: `include/fesa/assembly/surface_pressure_assembler.h`
|
||||
- Create: `src/fesa/assembly/surface_pressure_assembler.cpp`
|
||||
- Modify: `src/fesa/analysis/linear_static_procedure.cpp`
|
||||
- Modify/Test assertions only: `tests/unit/io/hdf5/hdf5_results_writer_test.cpp`
|
||||
- Modify: `src/fesa/CMakeLists.txt`
|
||||
- Modify: `tests/CMakeLists.txt`
|
||||
|
||||
HDF5 production writer and `fesa_application.cpp` are expected no-change verification targets. Modify them only if a new RED test proves a direct approved-contract gap, and record that evidence and minimal reason.
|
||||
|
||||
Assembler contract:
|
||||
|
||||
```cpp
|
||||
struct SurfacePressureAssemblyCandidate {
|
||||
Vector full_external_force;
|
||||
SparseMatrix full_external_tangent;
|
||||
std::vector<Diagnostic> diagnostics;
|
||||
};
|
||||
|
||||
Result<SurfacePressureAssemblyCandidate> AssembleSurfacePressure(
|
||||
const AnalysisModel& model,
|
||||
const DofManager& dofs,
|
||||
const Vector& full_generalized_coordinates,
|
||||
double load_factor,
|
||||
SurfacePressureConfiguration configuration,
|
||||
const ParallelFor& parallel_for);
|
||||
```
|
||||
|
||||
The input vector is stable full-DOF `[u1,u2,u3,phi1,phi2,phi3]`. Produce local candidates in `(load_ordinal, facet_ordinal, instance declaration ordinal, element label, local row[,column])`, use worker-local buffers and reduce in that exact serial order. Workers never update global vector/CSR directly.
|
||||
|
||||
## RED
|
||||
|
||||
Write/register first:
|
||||
|
||||
- `SurfacePressureAssembly.AssemblesFullDofsInPressureFacetAndRecordOrder`
|
||||
- `SurfacePressureAssembly.AddsRepeatedRecordsAndAppliesUnitFactorExactlyOnce`
|
||||
- `SurfacePressureAssembly.IsBitwiseStableForSerialAndParallelLocalEvaluation`
|
||||
- `LinearShellSurfacePressure.UsesReferenceNormalAndAreaAfterPrescribedDisplacement`
|
||||
- `LinearShellSurfacePressure.AssemblesBeforeProjectionAndIncludesConstrainedReaction`
|
||||
- `LinearShellSurfacePressure.SatisfiesFreeResidualGlobalResultantAndMoment`
|
||||
- `LinearShellSurfacePressure.PreservesS4S4rMeshAndCyclicOrderInvariance`
|
||||
- `LinearShellSurfacePressure.WritesSchemaZeroWithoutPressureDataset`
|
||||
- `ShellSurfacePressureApplication.LinearFailurePreservesExistingFinalAndNoCandidate`
|
||||
- `ShellSurfacePressureApplication.InputWithoutPressureRetainsExistingLinearBehavior`
|
||||
|
||||
Run before production implementation:
|
||||
|
||||
```powershell
|
||||
cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 `
|
||||
"-DFESA_GTEST_SOURCE_DIR=C:/git/googletest" `
|
||||
"-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" `
|
||||
"-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" `
|
||||
"-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"
|
||||
cmake --build .harness/build --config Debug --target fesa_unit_tests fesa_integration_tests
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^(SurfacePressureAssembly|LinearShellSurfacePressure|ShellSurfacePressureApplication)\."
|
||||
```
|
||||
|
||||
Expected RED: assembler compile/link failure, or linear procedure assembles only CLOAD so pressure resultant/reaction remains zero and pressure CLI assertions fail. Record command, exit, duration and output tail. Unexpected pass is evidence-gap; unrelated failure is regression.
|
||||
|
||||
## Minimal GREEN
|
||||
|
||||
- Create evaluator inputs from immutable Domain source identity and stable DofManager scatter. Evaluate every `(load_ordinal, facet_ordinal)`, including zero pressure/factor geometry validation.
|
||||
- Keep worker-local force/tangent contributions. Validate all candidates before fixed serial reduction; no global concurrent writes.
|
||||
- In `LinearStaticProcedureExecutor`, preserve element stiffness assembly, `Kff/Kfc` partition and `Kff` factorization-before-load order.
|
||||
- Assemble existing CLOAD and reference pressure separately, checked-finite add their full-space forces, and assign `AnalysisState::ExternalForce()` exactly once before free/constrained projection.
|
||||
- Call pressure assembler with load factor exactly `1.0`, reference configuration and a full generalized-coordinate vector of the required size. Linear pressure tangent is exact zero and does not change stiffness.
|
||||
- Preserve `EffectiveFreeRhs(Ff-Kfc*dc)`, valid `0x0 Kff`, full displacement reconstruction and `K*d-F` recovery. Constrained residual is reaction; free residual is equilibrium evidence.
|
||||
- Preserve current schema version `0`, mandatory result inventory, CLI sibling naming and atomic candidate finalization. Add no surface/load/pressure dataset or metadata.
|
||||
|
||||
## VERIFY and Acceptance Criteria
|
||||
|
||||
Use `.harness/config.json` first if present; otherwise:
|
||||
|
||||
```powershell
|
||||
cmake --build .harness/build --config Debug --target fesa_unit_tests fesa_integration_tests
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^(SurfacePressureAssembly|LinearShellSurfacePressure|ShellSurfacePressureApplication)\."
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^(LoadAssembly|SparseAssembly|LinearStaticCli|Mitc4ShellCli|Hdf5ResultsWriter)\."
|
||||
cmake --build .harness/build --config Debug
|
||||
ctest --test-dir .harness/build -C Debug --show-only=json-v1
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure
|
||||
```
|
||||
|
||||
Acceptance:
|
||||
|
||||
- normalized analytical force/moment/reaction/mesh/order errors `<=1e-12`;
|
||||
- global force and moment balance `<=1e-8` and approved existing free-residual gates;
|
||||
- serial/parallel external vectors, diagnostics and row order exact;
|
||||
- schema `0`, existing mandatory datasets only, no pressure-specific path;
|
||||
- failed pressure candidate leaves prior final bytes unchanged or no misleading final;
|
||||
- inputs without pressure retain current results;
|
||||
- nonzero CTest inventory, full pass, no new MSVC warning and runtime staging succeeds.
|
||||
|
||||
## 불변식, 실패 처리와 증거
|
||||
|
||||
- Full-space completion precedes projection; source/internal/equation IDs remain distinct.
|
||||
- Load factor is applied exactly once; repeated pressure records remain additive.
|
||||
- Any local/nonfinite/assembly/recovery failure returns before state/result publication.
|
||||
- Record RED/GREEN/VERIFY commands, exits, durations/tails, contribution order, external/reaction/residual/resultant values, schema inventory and final-file snapshots.
|
||||
- Failure classification: `configure | compile | link | test | harness | environment | upstream-contract | regression | evidence-gap`.
|
||||
|
||||
Trace: `FESA-REQ-SHELL-PRESSURE-005`–`007`, `010`–`013`, `016`–`020`; io §§6–7, 9–10; formulation §§9, 11–14; numerical-review linear/resultant/balance checks.
|
||||
|
||||
## 금지사항
|
||||
|
||||
- Do not implement nonlinear follower procedure, change the linear solver backend, HDF5 schema or output inventory.
|
||||
- Do not refactor existing load hierarchy beyond the new pressure assembler or expose MKL/TBB/HDF5 in public core.
|
||||
- Do not modify upstream docs, tolerance/reference artifacts or Abaqus files.
|
||||
- Do not run Abaqus, create output JSON, invoke Executor, advance Step 5, commit or push.
|
||||
|
||||
@@ -0,0 +1,147 @@
|
||||
# Step 5: integrate-nonlinear-follower-pressure
|
||||
|
||||
## 실행 범위와 상태 소유권
|
||||
|
||||
이 Step의 단일 책임은 current-configuration follower pressure force와 generally nonsymmetric exact external tangent를 nonlinear full-Newton trial/commit lifecycle과 existing schema-1 output에 연결하는 것이다. Same Step에서 test-first RED, expected failure, minimal GREEN, focused/full VERIFY를 완료한다.
|
||||
|
||||
Implementation Agent는 Executor-selected Step 5만 수행하고 Step 5 `status`와 한 줄 `summary`/`error_message`/`blocked_reason`만 기록한다. Executor가 branch, retry, timestamps, commits, advancement, top-level status and output JSON을 소유한다.
|
||||
|
||||
## 읽어야 할 파일
|
||||
|
||||
- `AGENTS.md`
|
||||
- `docs/ARCHITECTURE.md`
|
||||
- `docs/ADR.md`
|
||||
- `docs/CODINGSTYLE.md`
|
||||
- `docs/HARNESS.md`
|
||||
- `docs/HARNESS_WORKFLOW.md`
|
||||
- `.codex/hooks.json`
|
||||
- `docs/shell-surface-pressure-load/requirements.md`
|
||||
- `docs/shell-surface-pressure-load/formulation.md` §§9.2–9.4, 11–14
|
||||
- `docs/shell-surface-pressure-load/numerical-review.md` §6 nonlinear suite
|
||||
- `docs/shell-surface-pressure-load/io.md` §§6–7, 9–10
|
||||
- `docs/shell-surface-pressure-load/implementation-plan.md`
|
||||
- Prior outputs: `include/fesa/model/model_types.h`, `include/fesa/model/domain.h`, `src/fesa/model/domain.cpp`, `include/fesa/analysis/analysis_model.h`, `src/fesa/analysis/analysis_model.cpp`
|
||||
- Prior evaluator/assembler: `include/fesa/loads/shell_surface_pressure.h`, `src/fesa/loads/shell_surface_pressure.cpp`, `include/fesa/assembly/surface_pressure_assembler.h`, `src/fesa/assembly/surface_pressure_assembler.cpp`, their unit tests
|
||||
- `include/fesa/analysis/nonlinear_static_control.h`
|
||||
- `src/fesa/analysis/nonlinear_static_control.cpp`
|
||||
- `include/fesa/analysis/nonlinear_static_procedure.h`
|
||||
- `src/fesa/analysis/nonlinear_static_procedure.cpp`
|
||||
- `include/fesa/analysis/nonlinear_analysis_state.h`
|
||||
- `src/fesa/analysis/nonlinear_analysis_state.cpp`
|
||||
- `include/fesa/elements/nonlinear_mitc4_shell.h`
|
||||
- `src/fesa/elements/nonlinear_mitc4_shell.cpp`
|
||||
- `include/fesa/solvers/linear/tangent_solver.h`
|
||||
- `include/fesa/solvers/linear/mkl_pardiso_tangent_solver.h`
|
||||
- `src/fesa/solvers/linear/mkl_pardiso_tangent_solver.cpp`
|
||||
- `include/fesa/io/hdf5/nonlinear_hdf5_results_writer.h`
|
||||
- `src/fesa/io/hdf5/nonlinear_hdf5_results_writer.cpp`
|
||||
- `src/fesa/io/hdf5/hdf5_self_check.h`
|
||||
- `src/fesa/io/hdf5/hdf5_self_check.cpp`
|
||||
- `include/fesa/analysis/prepared_analysis.h`
|
||||
- `src/fesa/analysis/prepared_analysis.cpp`
|
||||
- `src/fesa/app/fesa_application.cpp`
|
||||
- `tests/integration/analysis/nonlinear_static_procedure_test.cpp`
|
||||
- `tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp`
|
||||
- `tests/unit/solvers/linear/tangent_solver_test.cpp`
|
||||
- `tests/integration/app/shell_surface_pressure_application_test.cpp`
|
||||
- `tests/CMakeLists.txt`
|
||||
|
||||
Step 4 must already provide a validated full-space assembler and linear path. Do not change its reference-configuration semantics.
|
||||
|
||||
## 소유 파일과 procedure contract
|
||||
|
||||
- Create test first: `tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp`
|
||||
- Modify test first: `tests/integration/app/shell_surface_pressure_application_test.cpp`
|
||||
- Modify test assertions: `tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp`
|
||||
- Modify: `src/fesa/analysis/nonlinear_static_procedure.cpp`
|
||||
- Modify only if checked contribution composition requires a helper: `include/fesa/analysis/nonlinear_static_control.h`, `src/fesa/analysis/nonlinear_static_control.cpp`
|
||||
- Modify: `tests/CMakeLists.txt`
|
||||
|
||||
Existing PARDISO, HDF5 writer/self-check and application production files are expected no-change verification targets unless RED proves a direct approved-contract defect.
|
||||
|
||||
For each Newton trial, use the existing Step 4 interface:
|
||||
|
||||
```cpp
|
||||
Result<SurfacePressureAssemblyCandidate> AssembleSurfacePressure(
|
||||
const AnalysisModel& model,
|
||||
const DofManager& dofs,
|
||||
const Vector& full_generalized_coordinates,
|
||||
double load_factor,
|
||||
SurfacePressureConfiguration configuration,
|
||||
const ParallelFor& parallel_for);
|
||||
```
|
||||
|
||||
Evaluate internal and external candidates at the same trial. Compose
|
||||
`f_ext=f_fixed+f_pressure`, `K_ext=K_fixed+K_pressure`, `r=f_int-f_ext`, `K=K_int-K_ext`. Use the existing full-CSR unsymmetric `TangentSolver::FactorizeFresh`; never symmetrize pressure tangent.
|
||||
|
||||
## RED
|
||||
|
||||
Write/register first:
|
||||
|
||||
- `NonlinearShellSurfacePressure.AssemblesFollowerForceFromCurrentTrialGeometry`
|
||||
- `NonlinearShellSurfacePressure.FormsResidualAndTangentWithApprovedExternalSigns`
|
||||
- `NonlinearShellSurfacePressure.AppliesIncrementFactorExactlyOnce`
|
||||
- `NonlinearShellSurfacePressure.UsesFullUnsymmetricTangentSolverPath`
|
||||
- `NonlinearShellSurfacePressure.ConvergesOpenPatchAndPreservesAntisymmetricEvidence`
|
||||
- `NonlinearShellSurfacePressure.SatisfiesAcceptedFreeResidualAndFactorOneGlobalBalance`
|
||||
- `NonlinearShellSurfacePressure.IsObjectiveUnderRigidMotionAndTracksCurrentArea`
|
||||
- `NonlinearShellSurfacePressure.ReducesSerialAndParallelContributionsDeterministically`
|
||||
- `NonlinearShellSurfacePressure.InvalidTrialRollsBackCommittedFrameAndFinalOutput`
|
||||
- `NonlinearShellSurfacePressure.WritesSchemaOneExternalInternalResidualReactionAndEquilibrium`
|
||||
- `ShellSurfacePressureApplication.InputWithoutPressureRetainsExistingNonlinearBehavior`
|
||||
|
||||
Run before production edits:
|
||||
|
||||
```powershell
|
||||
cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 `
|
||||
"-DFESA_GTEST_SOURCE_DIR=C:/git/googletest" `
|
||||
"-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" `
|
||||
"-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" `
|
||||
"-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"
|
||||
cmake --build .harness/build --config Debug --target fesa_unit_tests fesa_integration_tests
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^(NonlinearShellSurfacePressure|ShellSurfacePressureApplication)\."
|
||||
```
|
||||
|
||||
Expected RED: current nonlinear procedure includes fixed CLOAD only, so follower force/tangent, objectivity, sign, convergence or balance tests fail. Record command, exit, duration and tail. Unexpected pass is evidence-gap; unrelated failure is regression.
|
||||
|
||||
## Minimal GREEN
|
||||
|
||||
- At every Newton trial call `AssembleSurfacePressure` with current full generalized coordinates, exact current increment `load_factor` and `kCurrent`.
|
||||
- Checked-finite add fixed and pressure force/tangent in stable order. Apply source pressure magnitude and load factor exactly once.
|
||||
- Keep pressure kinematics translation-only; rotation force and tangent blocks stay zero. Retain generally nonsymmetric external tangent and existing `MklPardisoTangentSolver` full CSR `mtype=11` path.
|
||||
- Form residual and tangent with approved signs in full space before constrained/free extraction. Internal/external residual and tangent must be from the same trial.
|
||||
- Complete and validate candidate kinematics, force/tangent, residual, equilibrium and convergence before `CommitAcceptedFrame`. Invalid geometry/nonfinite/factorization/solve failures must not append frames or replace final HDF5.
|
||||
- Preserve existing force/moment convergence channels and thresholds; do not add line search/arc length or alter factor sequence.
|
||||
- Preserve schema `1` and existing generalized internal/external/residual/reaction/global equilibrium datasets. Add no pressure dataset/version/metadata.
|
||||
|
||||
## VERIFY and Acceptance Criteria
|
||||
|
||||
Use `.harness/config.json` first if present; otherwise:
|
||||
|
||||
```powershell
|
||||
cmake --build .harness/build --config Debug --target fesa_unit_tests fesa_integration_tests
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^(NonlinearShellSurfacePressure|ShellSurfacePressureApplication)\."
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^(NonlinearStaticProcedure|NonlinearStaticControl|TangentSolver|NonlinearHdf5ResultsWriter|NonlinearStaticReference)\."
|
||||
cmake --build .harness/build --config Debug
|
||||
ctest --test-dir .harness/build -C Debug --show-only=json-v1
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure
|
||||
```
|
||||
|
||||
Acceptance: local FD `<=1e-8`; objectivity/current-area normalized error `<=1e-12`; factor-one global force/moment balance `<=1e-8`; existing free force/moment residual nonzero-scale relative `<=1e-2`, zero-scale absolute `<=1e-3`; exact zero-scale rules; schema-1 unique factor-one frame projections exact; serial/parallel order exact; invalid trial rollback exact; all discovered tests pass with no warning/runtime staging failure.
|
||||
|
||||
## 불변식, 실패 처리와 증거
|
||||
|
||||
- Candidate-before-commit and same-trial internal/external data are mandatory.
|
||||
- Failure records deterministic last-completed Newton stage and pressure source identity but publishes no invalid state/output.
|
||||
- Record RED/GREEN/VERIFY commands, exits, durations/tails, load factor, force/tangent signs and nonsymmetry, solver spy events, iteration count, residual/balance metrics, HDF5 inventory and rollback snapshots.
|
||||
- Failure classification: `configure | compile | link | test | harness | environment | upstream-contract | regression | evidence-gap`.
|
||||
|
||||
Trace: `FESA-REQ-SHELL-PRESSURE-008`–`013`, `016`–`019`, `021`; io §§6–7, 9–10; formulation §§9–14; numerical-review follower/tangent/objectivity/open-patch/balance checks.
|
||||
|
||||
## 금지사항
|
||||
|
||||
- Do not add line search, arc length, new procedure, convergence threshold changes, PARDISO redesign or HDF5 fields.
|
||||
- Do not alter Step 3 force/tangent math or Step 4 linear path except a test-proven defect returned to the owning Step through Coordinator.
|
||||
- Do not modify upstream docs, tolerance/reference artifacts or run Abaqus.
|
||||
- Do not create output JSON, invoke Executor, advance Step 6, commit or push.
|
||||
|
||||
@@ -0,0 +1,139 @@
|
||||
# Step 6: compare-pressure-reference
|
||||
|
||||
## 실행 범위와 상태 소유권
|
||||
|
||||
이 Step's single responsibility is to add deterministic comparison support between FESA schema-1 factor-one HDF5 and the exact stored shell-pressure displacement CSV using the unchanged common tolerance. It does not generate reference data and does not write final Gate 6 reports; Step 7 owns closure reports.
|
||||
|
||||
Complete RED, expected failure, minimal GREEN and full VERIFY here. Update only Step 6's status and one-line Codex-owned payload. Executor owns all timestamps, commits, retry/advancement, top-level status and output JSON.
|
||||
|
||||
## 읽어야 할 파일
|
||||
|
||||
- `AGENTS.md`
|
||||
- `docs/ARCHITECTURE.md`
|
||||
- `docs/ADR.md`
|
||||
- `docs/CODINGSTYLE.md`
|
||||
- `docs/HARNESS.md`
|
||||
- `docs/HARNESS_WORKFLOW.md`
|
||||
- `.codex/hooks.json`
|
||||
- `docs/TOLERANCE.md`
|
||||
- `docs/shell-surface-pressure-load/requirements.md`
|
||||
- `docs/shell-surface-pressure-load/numerical-review.md` §§6.2–6.3
|
||||
- `docs/shell-surface-pressure-load/reference-model.md`
|
||||
- `docs/shell-surface-pressure-load/io.md` §8
|
||||
- `docs/shell-surface-pressure-load/implementation-plan.md`
|
||||
- All prior implemented/test files from Steps 1–5, especially `tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp`
|
||||
- `tests/reference/reference_tolerance_policy.h`
|
||||
- `tests/reference/reference_tolerance_policy.cpp`
|
||||
- `tests/reference/reference_tolerance_policy_test.cpp`
|
||||
- `tests/reference/nonlinear_static_reference_comparison.h`
|
||||
- `tests/reference/nonlinear_static_reference_comparison.cpp`
|
||||
- `tests/reference/nonlinear_static_reference_cases_test.cpp`
|
||||
- `tests/reference/mitc4_reference_comparison.h`
|
||||
- `tests/reference/mitc4_reference_comparison.cpp`
|
||||
- `tests/reference/mitc4_reference_cases_test.cpp`
|
||||
- `tests/CMakeLists.txt`
|
||||
- Read-only exact artifacts listed below
|
||||
|
||||
## Exact read-only artifact contract
|
||||
|
||||
- Required input: `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure.inp`, 56,665 bytes, SHA-256 `53718ccc9b41c23fcc1b509a51d66f1347e87aca43a74f1d6cec4d2085f4b90e`.
|
||||
- Required comparison CSV: `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure displacements.csv`, 111,182 bytes, SHA-256 `2fe53f98eac9f04779100721c3edf8049eb1dbfe733ebcbd819aeeed03b81198`.
|
||||
- Optional review-only reaction CSV: `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure reactions.csv`, never verdict-changing.
|
||||
- Excluded stress CSV: `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure stresses.csv`, no comparison family.
|
||||
|
||||
Never rename, rewrite, normalize, repair, regenerate or reorder any artifact. Never run Abaqus or another reference solver. Run FESA only on a byte-identical copy under `.harness/build/reference/shell-surface-pressure-load/`.
|
||||
|
||||
## 소유 파일과 interface boundary
|
||||
|
||||
- Create test first: `tests/reference/shell_surface_pressure_reference_test.cpp`
|
||||
- Modify: `tests/reference/nonlinear_static_reference_comparison.h`
|
||||
- Modify: `tests/reference/nonlinear_static_reference_comparison.cpp`
|
||||
- Modify: `tests/CMakeLists.txt`
|
||||
|
||||
Preserve existing public operations and extend their per-case value contract minimally:
|
||||
|
||||
```cpp
|
||||
Result<std::vector<ArtifactSnapshot>> ArtifactCheck(
|
||||
const NonlinearReferenceCase& reference_case);
|
||||
Result<std::filesystem::path> CopyInputToExecutionDirectory(
|
||||
const NonlinearReferenceCase& reference_case);
|
||||
Result<GeneratedRunArtifacts> RunFesaApplicationOnCopiedInput(
|
||||
const NonlinearReferenceCase& reference_case,
|
||||
const std::filesystem::path& copied_input_path);
|
||||
Result<NonlinearReferenceComparisonReport> CompareHdf5ToReferenceCsv(
|
||||
const NonlinearReferenceCase& reference_case,
|
||||
const std::filesystem::path& hdf5_results_path);
|
||||
NonlinearReferenceClassification ClassifyReferenceComparison(
|
||||
const NonlinearReferenceComparisonReport& report);
|
||||
```
|
||||
|
||||
Represent required input/displacement, optional reaction and excluded stress disposition as explicit per-case value fields. Do not change `reference_tolerance_policy.*`.
|
||||
|
||||
## RED
|
||||
|
||||
Write/register first:
|
||||
|
||||
- `ShellSurfacePressureReference.AuditsExactRequiredArtifactsAndIgnoresOptionalReviewArtifacts`
|
||||
- `ShellSurfacePressureReference.SelectsUniqueSchemaOneFactorOneAcceptedFrame`
|
||||
- `ShellSurfacePressureReference.Projects729WideRowsTo2187LogicalRowsPerFamily`
|
||||
- `ShellSurfacePressureReference.MatchesByInstanceNodeLabelAndComponentNotRowOrder`
|
||||
- `ShellSurfacePressureReference.RejectsSchemaIdentityCardinalityMissingExtraDuplicateAndNonfiniteBeforeTolerance`
|
||||
- `ShellSurfacePressureReference.ClassifiesTranslationBlockingAndRotationWarningOnly`
|
||||
- `ShellSurfacePressureReference.ExcludesReactionAndStressFamiliesFromVerdict`
|
||||
- `ShellSurfacePressureReference.UsesUnchangedCommonScaleNearZeroRelativeAndRmsPolicy`
|
||||
- `ShellSurfacePressureReference.WritesDeterministicComparisonReport`
|
||||
|
||||
Run before comparator implementation:
|
||||
|
||||
```powershell
|
||||
cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 `
|
||||
"-DFESA_GTEST_SOURCE_DIR=C:/git/googletest" `
|
||||
"-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" `
|
||||
"-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" `
|
||||
"-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"
|
||||
cmake --build .harness/build --config Debug --target fesa_reference_tests
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^ShellSurfacePressureReference\."
|
||||
```
|
||||
|
||||
Expected RED: current nonlinear registry has no pressure case/disposition and assumes a legacy artifact portfolio, so the exact two-required-file contract, schema/frame projection or 729/2187 cardinality fails. Record command, exit, duration and tail. Unexpected pass is evidence-gap; unrelated failure is regression.
|
||||
|
||||
## Minimal GREEN
|
||||
|
||||
- Snapshot exact required artifacts before run, byte-copy only the input into the build tree, and run FESA application only.
|
||||
- Require HDF5 schema `1`, exact `Step-1`, a unique accepted frame with `load_factor==1`/`is_factor_one`, `/model/nodes`, and existing nodal displacement.
|
||||
- Join HDF5 nodes and CSV by `(instance_name="Part-1-1", source node label, component)`, never row order/internal index. Expand 729 wide rows to 2,187 `U1/U2/U3` logical rows and 2,187 `UR1/UR2/UR3` rows.
|
||||
- Reject schema/frame/identity/cardinality, missing, extra, duplicate and nonfinite rows before tolerance.
|
||||
- After prechecks only, call unchanged `EvaluateReferenceTolerance`: `S=max(abs(reference))`; near-zero band `0.01*S`; near-zero absolute row error `<=0.01*S`; otherwise relative `<=0.05`; `RMS(error)/S<=0.01`; zero-scale requires FESA exact zero.
|
||||
- Translation is blocking; rotation is warning-only. Reaction creates no numerical comparator family and is review-only; stress is excluded.
|
||||
- Produce deterministic row, family metric, warning and classification order. HDF5-derived CSV, if any, is debug-only and not official output.
|
||||
|
||||
## VERIFY and Acceptance Criteria
|
||||
|
||||
Use `.harness/config.json` first if present; otherwise:
|
||||
|
||||
```powershell
|
||||
cmake --build .harness/build --config Debug --target fesa_reference_tests
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^ShellSurfacePressureReference\."
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^(NonlinearStaticReference|ReferenceTolerancePolicy|Mitc4Reference)\."
|
||||
cmake --build .harness/build --config Debug
|
||||
ctest --test-dir .harness/build -C Debug --show-only=json-v1
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure
|
||||
```
|
||||
|
||||
Acceptance: exact input/CSV size+hash unchanged before/after; 729 unique node keys; 2,187 rows in each U/UR family; all prechecks precede tolerance; common policy unchanged; U blocking and UR warning-only; reaction/stress dispositions exact; deterministic report; all discovered/full tests pass without new warning/runtime staging failure.
|
||||
|
||||
## 불변식, 실패 처리와 증거
|
||||
|
||||
- Artifact/precheck failure returns a failed classification without tolerance evaluation or artifact mutation.
|
||||
- Copied input/generated HDF5/log live only under build tree.
|
||||
- Record pre/post snapshots, copy/generated paths, selected frame identity, cardinalities, family scale/row/RMS/worst row, warnings, classification and RED/GREEN/VERIFY command evidence.
|
||||
- Failure classification: `configure | compile | link | test | reference-comparison | artifact | harness | environment | upstream-contract | regression | evidence-gap`.
|
||||
|
||||
Trace: `FESA-REQ-SHELL-PRESSURE-017`–`019`, `021`–`024`; io §8; reference-model §§3–8; numerical-review external acceptance.
|
||||
|
||||
## 금지사항
|
||||
|
||||
- Do not generate/edit/rename reference files, change tolerance, promote reaction/stress, add metadata requirements or run Abaqus.
|
||||
- Do not modify solver production unless failure is returned through Coordinator to the owning implementation Step.
|
||||
- Do not write final reports yet, create output JSON, invoke Executor, advance Step 7, commit or push.
|
||||
|
||||
@@ -0,0 +1,114 @@
|
||||
# Step 7: verify-and-report-pressure-feature
|
||||
|
||||
## 실행 범위와 상태 소유권
|
||||
|
||||
This final Implementation-owned Step inspects all prior artifacts, performs fresh MSVC/CTest and exact pressure-reference gates, and completes the three Gate 6 evidence documents. Code changes are not the default scope. The required sequence is literally `ARTIFACT CHECK -> COMPARE -> CLASSIFY -> REPORT` after build/test gates.
|
||||
|
||||
Implementation Agent may update only Step 7's `status` and one-line `summary`/`error_message`/`blocked_reason`. Executor owns branch, retry, timestamps, commits, advancement, top-level phase completion and output JSON. This Step does not approve physics Gate 7 or release readiness.
|
||||
|
||||
## 읽어야 할 파일
|
||||
|
||||
- `AGENTS.md`
|
||||
- `docs/PRD.md`
|
||||
- `docs/ARCHITECTURE.md`
|
||||
- `docs/ADR.md`
|
||||
- `docs/CODINGSTYLE.md`
|
||||
- `docs/HARNESS.md`
|
||||
- `docs/HARNESS_WORKFLOW.md`
|
||||
- `.codex/hooks.json`
|
||||
- `.harness/config.json` if it exists at execution time
|
||||
- `CMakeLists.txt`, `src/fesa/CMakeLists.txt`, `tests/CMakeLists.txt`
|
||||
- Every `docs/shell-surface-pressure-load/*.md` upstream and approved plan
|
||||
- `phases/shell-surface-pressure-load/index.json`
|
||||
- All production/test files created or modified in Steps 1–6
|
||||
- `tests/reference/shell_surface_pressure_reference_test.cpp`
|
||||
- `tests/reference/nonlinear_static_reference_comparison.h/.cpp`
|
||||
- Exact read-only artifacts listed in Step 6 and `reference-model.md`
|
||||
|
||||
Read all prior Step summaries and changed files. Verify that every production change has a first-failing test record and that source/interface names remain consistent with the approved plan.
|
||||
|
||||
## 소유 파일
|
||||
|
||||
- Create/complete: `docs/shell-surface-pressure-load/implementation-report.md`
|
||||
- Create/complete: `docs/shell-surface-pressure-load/build-test.md`
|
||||
- Create/complete: `docs/shell-surface-pressure-load/reference-comparison.md`
|
||||
|
||||
Production, tests, CMake and phase files are read-only in this Step except Step 7's selected status/payload. If verification exposes an implementation defect, classify and return it to Coordinator/the owning earlier Step; do not silently repair it here.
|
||||
|
||||
## RED evidence preflight
|
||||
|
||||
First prove the three reports are absent/incomplete or contain no fresh final passing evidence. This expected evidence-state failure is Step 7 RED. Then inspect prior reports/summaries for recorded test-first RED commands and expected failures. If any source/test/CMake change lacks RED evidence, classify `evidence-gap` and stop; do not fabricate history.
|
||||
|
||||
Record the preflight result before running final gates.
|
||||
|
||||
## Fresh MSVC x64 Debug gates
|
||||
|
||||
If `.harness/config.json` exists, it takes precedence and the reports must record its exact resolved configure/build/test commands. Otherwise run exactly:
|
||||
|
||||
```powershell
|
||||
cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 `
|
||||
"-DFESA_GTEST_SOURCE_DIR=C:/git/googletest" `
|
||||
"-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" `
|
||||
"-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" `
|
||||
"-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"
|
||||
cmake --build .harness/build --config Debug
|
||||
ctest --test-dir .harness/build -C Debug --show-only=json-v1
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^(InpSyntax|ShellSurfacePressureInput|ShellSurfacePressureDomain|ShellSurfacePressureKernel|SurfacePressureAssembly|LinearShellSurfacePressure|NonlinearShellSurfacePressure|ShellSurfacePressureApplication|ShellSurfacePressureReference)\."
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^ShellSurfacePressureReference\."
|
||||
```
|
||||
|
||||
Acceptance requires every exit `0`, nonzero discovered tests including every named feature suite, full CTest pass, no new `/W4 /WX` warning, correct MSVC/x64/Debug selection and successful MKL/TBB/HDF5 runtime staging. No Harness/Python files are in scope, so do not run Python tests unless separately authorized Harness/Python changes actually occurred; then record `uv run --with pytest python -m pytest -v -rs` and why.
|
||||
|
||||
## ARTIFACT CHECK -> COMPARE -> CLASSIFY -> REPORT
|
||||
|
||||
### ARTIFACT CHECK
|
||||
|
||||
Before running the pressure case, record path, SHA-256, bytes and timestamp for:
|
||||
|
||||
- required input `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure.inp`: 56,665 bytes, `53718ccc9b41c23fcc1b509a51d66f1347e87aca43a74f1d6cec4d2085f4b90e`;
|
||||
- required displacement CSV: 111,182 bytes, `2fe53f98eac9f04779100721c3edf8049eb1dbfe733ebcbd819aeeed03b81198`;
|
||||
- reaction CSV as review-only inventory;
|
||||
- stress CSV as excluded inventory.
|
||||
|
||||
Confirm source history/commands do not invoke Abaqus. Copy only the exact input to `.harness/build/reference/shell-surface-pressure-load/`.
|
||||
|
||||
### COMPARE
|
||||
|
||||
Run FESA only on the copied input and locate generated schema-1 `<stem>_results.h5` and log. Use `ShellSurfacePressureReference` comparison to select exact Step-1 unique factor-one accepted frame and project `/model/nodes` plus nodal displacements by `(Part-1-1, source node label, component)`. Require 729 wide CSV rows, 2,187 U logical rows and 2,187 UR logical rows. Reject missing/extra/duplicate/nonfinite/schema/frame/identity errors before unchanged common tolerance.
|
||||
|
||||
### CLASSIFY
|
||||
|
||||
- Blocking fail: any precheck, U1/U2/U3 tolerance, required internal free-residual/global-equilibrium or artifact immutability failure.
|
||||
- Warning-only: UR1/UR2/UR3 deviations when all blocking gates pass.
|
||||
- Review-only/excluded: reaction/stress cannot change the verdict.
|
||||
- Classify failures as `implementation | test | configure | compile | link | reference-comparison | infrastructure | environment | artifact | regression | evidence-gap | upstream-contract`.
|
||||
|
||||
Any nonzero command, zero tests, new warning, runtime staging failure, artifact mutation, cardinality mismatch or U/internal blocking failure leaves Step non-completed. Retain evidence and return to Coordinator; do not adjust tolerance or artifacts.
|
||||
|
||||
### REPORT
|
||||
|
||||
Write complete Korean Markdown reports:
|
||||
|
||||
- `implementation-report.md`: metadata, task order, RED/GREEN/VERIFY evidence per Step, exact changed files/interfaces, 24-requirement coverage, implementation acceptance, limitations and handoff.
|
||||
- `build-test.md`: `owner_agent: implementation-agent`, environment/toolchain/config selection, each command, exit, duration, stdout/stderr tail, test discovery/count/results, warning/runtime inventory, failure classification, no-change assertion and open issues.
|
||||
- `reference-comparison.md`: exact artifact inventory and pre/post snapshots, generated HDF5/log, schema/frame projection, source identity/component matching, row prechecks, unchanged tolerance, per-family/per-row decisions, maximum absolute/relative applicable error, RMS and other contract-applicable metrics, U/UR disposition, internal gates, deterministic classification, no-change assertion and open issues.
|
||||
|
||||
Do not claim release readiness. A passing Gate 6 report recommends only `pass-for-physics-evaluation` through Coordinator.
|
||||
|
||||
## Final Acceptance Criteria
|
||||
|
||||
- All 24 `FESA-REQ-SHELL-PRESSURE-001`–`024` map to at least one implemented task and passing test/evidence; orphan count zero.
|
||||
- Fresh MSVC x64 Debug build, focused suite, nonzero discovery and full CTest pass with zero new warnings.
|
||||
- Exact artifacts remain byte-for-byte unchanged after FESA-only run.
|
||||
- Schema 0/1 contracts and no-pressure regressions pass; no pressure dataset/schema/version/CLI expansion.
|
||||
- Pressure reference U blocking passes, UR remains warning-only, reaction review-only, stress excluded; internal equilibrium passes.
|
||||
- Reports contain commands, exits, durations, tails and classification; no fabricated RED evidence.
|
||||
- Automatic Stop whole-project validation succeeds. Do not run hook entry points manually.
|
||||
|
||||
## 금지사항
|
||||
|
||||
- Do not fix source/tests/CMake silently, generate reference data, run Abaqus, alter tolerance, upstream docs or artifact bytes.
|
||||
- Do not approve physics/release gates, create Executor output JSON, invoke `scripts/execute.py`, update timestamps, commit or push.
|
||||
- Do not select another Step. 이유: this is the final Executor-selected implementation evidence Step only.
|
||||
|
||||
Reference in New Issue
Block a user