test: onboard quad 02 phase1 reference

This commit is contained in:
NINI
2026-05-04 12:34:39 +09:00
parent 827af924d0
commit 950ce29df1
9 changed files with 417 additions and 12 deletions
+7 -9
View File
@@ -13,7 +13,7 @@ Every new agent session must read this file together with `PROGRESS.md` before p
- If an item becomes obsolete, move it to `PROGRESS.md` with a short reason instead of silently deleting it. - If an item becomes obsolete, move it to `PROGRESS.md` with a short reason instead of silently deleting it.
## Current Objective ## Current Objective
Continue the new Phase 1 rebaseline plan in `phases/1-linear-static-mitc4-rebaseline`, starting with P1R-01 reference onboarding. The old `phases/1-linear-static-mitc4` path is historical and superseded by the paper-based MITC4 formulation reset. Continue the new Phase 1 rebaseline plan in `phases/1-linear-static-mitc4-rebaseline`, starting with P1R-02 core harness guardrails. The old `phases/1-linear-static-mitc4` path is historical and superseded by the paper-based MITC4 formulation reset.
## Required Reading For New Agents ## Required Reading For New Agents
1. `AGENTS.md` 1. `AGENTS.md`
@@ -36,7 +36,7 @@ Continue the new Phase 1 rebaseline plan in `phases/1-linear-static-mitc4-rebase
## Active Phase Files ## Active Phase Files
- Active phase directory: `phases/1-linear-static-mitc4-rebaseline` - Active phase directory: `phases/1-linear-static-mitc4-rebaseline`
- Execute with: `python scripts/execute.py 1-linear-static-mitc4-rebaseline` - Execute with: `python scripts/execute.py 1-linear-static-mitc4-rebaseline`
- Step numbering is zero-based. `step0.md` is complete and recorded in `phases/1-linear-static-mitc4-rebaseline/step0-audit.md`; `step15.md` is the independent evaluator closeout. - Step numbering is zero-based. `step0.md` is complete and recorded in `phases/1-linear-static-mitc4-rebaseline/step0-audit.md`; `step1.md` is complete and created the `quad_02_phase1.inp` normalized reference path; `step15.md` is the independent evaluator closeout.
- Every step file contains a sprint contract with objective, required reading, scope, allowed files, explicit non-goals, tests to write first, reference artifacts, acceptance command, evaluator checklist, and handoff requirements. - Every step file contains a sprint contract with objective, required reading, scope, allowed files, explicit non-goals, tests to write first, reference artifacts, acceptance command, evaluator checklist, and handoff requirements.
- Historical phase directory: `phases/1-linear-static-mitc4` - Historical phase directory: `phases/1-linear-static-mitc4`
- Historical phase status: blocked/superseded. Do not resume the old P1-15/P1-16 path unless the user explicitly requests recovery of that exact phase. - Historical phase status: blocked/superseded. Do not resume the old P1-15/P1-16 path unless the user explicitly requests recovery of that exact phase.
@@ -45,7 +45,6 @@ Continue the new Phase 1 rebaseline plan in `phases/1-linear-static-mitc4-rebase
| ID | Status | Owner | Task | Source | | ID | Status | Owner | Task | Source |
|---|---|---|---|---| |---|---|---|---|---|
| R-010 | pending | user + verification agent | Add or define reaction-force reference artifacts, preferably `*_reactions.csv`, or decide that Phase 1 `RF` is verified by equilibrium tests until Abaqus RF CSV is available. | `docs/VERIFICATION_PLAN.md`, `docs/RESULTS_SCHEMA.md` | | R-010 | pending | user + verification agent | Add or define reaction-force reference artifacts, preferably `*_reactions.csv`, or decide that Phase 1 `RF` is verified by equilibrium tests until Abaqus RF CSV is available. | `docs/VERIFICATION_PLAN.md`, `docs/RESULTS_SCHEMA.md` |
| R-011 | partial | generator + Abaqus compatibility evaluator | Resolve through rebaseline step 1: review `references/quad_02.inp` and `references/quad_02_displacements.csv`; either add a normalized Phase 1-compatible derivative input or create an explicit parser compatibility plan. | `phases/1-linear-static-mitc4-rebaseline/step1.md`, `docs/ABAQUS_INPUT_SUBSET.md`, `docs/VERIFICATION_PLAN.md` |
| R-013 | pending | user + verification agent | Add enough additional small Abaqus S4 reference cases for the PRD target of three stored Phase 1 references: one single-element case, one simple multi-element plate/shell case, and one curved shell benchmark. | `docs/PRD.md`, `docs/VERIFICATION_PLAN.md` | | R-013 | pending | user + verification agent | Add enough additional small Abaqus S4 reference cases for the PRD target of three stored Phase 1 references: one single-element case, one simple multi-element plate/shell case, and one curved shell benchmark. | `docs/PRD.md`, `docs/VERIFICATION_PLAN.md` |
## Phase 1 Definition Of Done ## Phase 1 Definition Of Done
@@ -73,7 +72,7 @@ Each gate should be satisfied before moving to the next implementation band unle
| Gate | Status | Requirement | Evidence | | Gate | Status | Requirement | Evidence |
|---|---|---|---| |---|---|---|---|
| G0 - Planning readiness | partial | Readiness tasks R-010 and R-011 remain open; earlier formulation/build/comparator blockers are resolved. | Updated docs, PLAN.md, PROGRESS.md | | G0 - Planning readiness | partial | Readiness task R-011 is resolved by `quad_02_phase1.inp`; R-010 and R-013 remain open. | Updated docs, PLAN.md, PROGRESS.md |
| G1 - Build and validation | satisfied | Build system, test framework, and `scripts/validate_workspace.py` run real checks. | Validation command output | | G1 - Build and validation | satisfied | Build system, test framework, and `scripts/validate_workspace.py` run real checks. | Validation command output |
| G2 - Parser and domain | pending rebaseline | Must be revalidated through steps 3 and 4 against the current parser subset and stored-reference compatibility policy. | Future parser and validation tests | | G2 - Parser and domain | pending rebaseline | Must be revalidated through steps 3 and 4 against the current parser subset and stored-reference compatibility policy. | Future parser and validation tests |
| G3 - DOF/math/results infrastructure | pending rebaseline | Must be revalidated through steps 2, 5, 6, and 12. | Future unit and integration tests | | G3 - DOF/math/results infrastructure | pending rebaseline | Must be revalidated through steps 2, 5, 6, and 12. | Future unit and integration tests |
@@ -85,12 +84,11 @@ All milestones are intended to become one or more self-contained sprint contract
| ID | Status | Owner | Objective | Depends On | Acceptance Focus | | ID | Status | Owner | Objective | Depends On | Acceptance Focus |
|---|---|---|---|---|---| |---|---|---|---|---|---|
| P1R-01 | pending | reference generator | Onboard `quad_02` as stored S4 reference and choose normalized-input or parser-compatibility path. | P1R-00 | Original artifacts preserved; compatibility explicit |
| P1R-02 | pending | core generator | Revalidate build/test harness, core aliases, DOF enum, and diagnostics. | P1R-00 | Validation command and core tests | | P1R-02 | pending | core generator | Revalidate build/test harness, core aliases, DOF enum, and diagnostics. | P1R-00 | Validation command and core tests |
| P1R-03 | pending | parser generator | Revalidate Phase 1 parser and immutable Domain subset. | P1R-01, P1R-02 | Supported keywords accepted; unsupported features rejected | | P1R-03 | pending | parser generator | Revalidate Phase 1 parser and immutable Domain subset. | P1R-02 | Supported keywords accepted; unsupported features rejected |
| P1R-04 | pending | validation generator | Rebuild validation and singular diagnostic coverage. | P1R-03 | Missing-reference and singular-prone negative tests | | P1R-04 | pending | validation generator | Rebuild validation and singular diagnostic coverage. | P1R-03 | Missing-reference and singular-prone negative tests |
| P1R-05 | pending | DOF generator | Rebuild six-DOF DofManager, constrained/free mapping, equation numbering, and full-vector reconstruction. | P1R-02 | DOF mapping and reaction foundation tests | | P1R-05 | pending | DOF generator | Rebuild six-DOF DofManager, constrained/free mapping, equation numbering, and full-vector reconstruction. | P1R-02 | DOF mapping and reaction foundation tests |
| P1R-06 | pending | results generator | Rebuild minimum results model and displacement CSV comparator. | P1R-02, P1R-01 | U/RF schema tests and CSV comparator tests | | P1R-06 | pending | results generator | Rebuild minimum results model and displacement CSV comparator. | P1R-02 | U/RF schema tests and CSV comparator tests |
| P1R-07 | pending | MITC4 generator | Implement MITC4 geometry, node order, tying points, directors, and local bases. | P1R-02 | Shape/basis/diagnostic tests | | P1R-07 | pending | MITC4 generator | Implement MITC4 geometry, node order, tying points, directors, and local bases. | P1R-02 | Shape/basis/diagnostic tests |
| P1R-08 | pending | MITC4 generator | Implement degenerated-continuum displacement, covariant strain rows, and MITC shear tying. | P1R-07 | Finite-difference and tying interpolation tests | | P1R-08 | pending | MITC4 generator | Implement degenerated-continuum displacement, covariant strain rows, and MITC shear tying. | P1R-07 | Finite-difference and tying interpolation tests |
| P1R-09 | pending | MITC4 generator | Implement material matrix, transform, and `2 x 2 x 2` integration scaffolding. | P1R-08 | Material/integration tests | | P1R-09 | pending | MITC4 generator | Implement material matrix, transform, and `2 x 2 x 2` integration scaffolding. | P1R-08 | Material/integration tests |
@@ -98,7 +96,7 @@ All milestones are intended to become one or more self-contained sprint contract
| P1R-11 | pending | verification generator | Add MITC4 patch, locking-sensitivity, and benchmark tests. | P1R-10 | Membrane/bending/shear/twist/locking tests | | P1R-11 | pending | verification generator | Add MITC4 patch, locking-sensitivity, and benchmark tests. | P1R-10 | Membrane/bending/shear/twist/locking tests |
| P1R-12 | pending | assembly generator | Rebuild assembly, solver adapter boundary, constrained solve, and full-vector RF recovery. | P1R-05, P1R-10 | Assembly and full-vector reaction tests | | P1R-12 | pending | assembly generator | Rebuild assembly, solver adapter boundary, constrained solve, and full-vector RF recovery. | P1R-05, P1R-10 | Assembly and full-vector reaction tests |
| P1R-13 | pending | analysis generator | Rebuild linear static workflow from input to U/RF result fields. | P1R-03, P1R-04, P1R-06, P1R-12 | End-to-end linear static tests | | P1R-13 | pending | analysis generator | Rebuild linear static workflow from input to U/RF result fields. | P1R-03, P1R-04, P1R-06, P1R-12 | End-to-end linear static tests |
| P1R-14 | pending | reference generator | Run stored reference displacement regression using accepted Phase 1-compatible S4 cases. | P1R-13, P1R-01 | At least one automated CSV displacement regression | | P1R-14 | pending | reference generator | Run stored reference displacement regression using accepted Phase 1-compatible S4 cases. | P1R-13 | At least one automated CSV displacement regression |
| P1R-15 | pending | evaluator | Independent Phase 1 evaluator closeout. | P1R-14 | Pass/fail report, synchronized PLAN/PROGRESS | | P1R-15 | pending | evaluator | Independent Phase 1 evaluator closeout. | P1R-14 | Pass/fail report, synchronized PLAN/PROGRESS |
## Phase 1 Sprint Contract Rules ## Phase 1 Sprint Contract Rules
@@ -131,9 +129,9 @@ Current reference state:
- `quad_01.inp` contains `S4R`, `Part/Assembly/Instance`, `*Density`, and `NLGEOM=YES`; it is not a Phase 1 parser acceptance case as-is. - `quad_01.inp` contains `S4R`, `Part/Assembly/Instance`, `*Density`, and `NLGEOM=YES`; it is not a Phase 1 parser acceptance case as-is.
- `references/quad_02.inp` and `references/quad_02_displacements.csv` have been added by the user as an S4 reference pair. - `references/quad_02.inp` and `references/quad_02_displacements.csv` have been added by the user as an S4 reference pair.
- `quad_02.inp` uses `TYPE=S4`, but also includes `Part/Assembly/Instance`; this is a compatibility decision point, not automatic parser scope expansion. - `quad_02.inp` uses `TYPE=S4`, but also includes `Part/Assembly/Instance`; this is a compatibility decision point, not automatic parser scope expansion.
- `references/quad_02_phase1.inp` is the accepted normalized Phase 1-compatible derivative input for the `quad_02` S4 reference pair.
Required reference additions or decisions: Required reference additions or decisions:
- Decide whether `quad_02.inp` is normalized into the current Phase 1 keyword subset or used to justify a dedicated Abaqus/CAE `Part/Assembly/Instance` parser sprint.
- Add `*_reactions.csv` or explicitly use internal equilibrium tests for Phase 1 `RF` until Abaqus RF output is available. - Add `*_reactions.csv` or explicitly use internal equilibrium tests for Phase 1 `RF` until Abaqus RF output is available.
- Add more small cases until Phase 1 can pass one single-element case, one simple multi-element plate/shell case, and one curved shell benchmark. - Add more small cases until Phase 1 can pass one single-element case, one simple multi-element plate/shell case, and one curved shell benchmark.
+32 -2
View File
@@ -13,10 +13,40 @@ Every new agent session must read this file together with `PLAN.md` before plann
- Do not remove history unless the user explicitly asks for archival cleanup. - Do not remove history unless the user explicitly asks for archival cleanup.
## Current Status ## Current Status
Phase 1 has a new rebaseline phase definition in `phases/1-linear-static-mitc4-rebaseline`. Step 0 is complete and captured in `phases/1-linear-static-mitc4-rebaseline/step0-audit.md`. The old `phases/1-linear-static-mitc4` path is historical and superseded after the MITC4 formulation reset. P1-01 through P1-14 have an initial C++17 implementation, but it is no longer authoritative until each layer is revalidated against the revised paper-based `docs/MITC4_FORMULATION.md`. `quad_02` is now the stored S4 reference pair, but its `Part/Assembly/Instance` and `*Density` features remain a compatibility decision for rebaseline step 1. Phase 1 has a new rebaseline phase definition in `phases/1-linear-static-mitc4-rebaseline`. Steps 0 and 1 are complete. `quad_02_phase1.inp` is now the normalized Phase 1-compatible input path for the stored `quad_02` S4 reference pair, while the original `quad_02.inp` remains preserved unsupported provenance. The old `phases/1-linear-static-mitc4` path is historical and superseded after the MITC4 formulation reset. P1-01 through P1-14 have an initial C++17 implementation, but it is no longer authoritative until each layer is revalidated against the revised paper-based `docs/MITC4_FORMULATION.md`.
## Completed Work ## Completed Work
### 2026-05-04 - P1R-01 quad_02 reference onboarding completed
Author: Codex
Changed files:
- `references/quad_02_phase1.inp`
- `references/quad_02_notes.md`
- `references/README.md`
- `docs/ABAQUS_INPUT_SUBSET.md`
- `docs/VERIFICATION_PLAN.md`
- `tests/test_main.cpp`
- `phases/1-linear-static-mitc4-rebaseline/index.json`
- `PLAN.md`
- `PROGRESS.md`
Summary:
- Preserved `references/quad_02.inp` and `references/quad_02_displacements.csv` unchanged as the original Abaqus/CAE S4 reference provenance.
- Added `references/quad_02_phase1.inp`, a normalized Phase 1-compatible derivative input that removes `Part/Assembly/Instance`, `*Density`, restart/output requests, and unsupported step metadata while preserving ids, connectivity, material, shell thickness, fixed boundary nodes, load node, and load magnitude.
- Added `references/quad_02_notes.md` with provenance, compatibility, unit-system, result mapping, tolerance, and RF limitation notes.
- Added tests proving the original `quad_02.inp` remains unsupported provenance, the normalized input parses into 121 nodes and 100 S4 elements, and `quad_02_displacements.csv` loads 121 node rows.
- Updated reference and parser documentation so the normalized file is the accepted `quad_02` path for future Phase 1 stored-reference regression.
Verification:
- First ran `python scripts/validate_workspace.py` after adding tests; it failed as expected because `quad_02_phase1.inp` did not exist yet.
- After adding the normalized input and documentation, `python scripts/validate_workspace.py` configured CMake, built `fesa_core` and `fesa_tests`, and ran CTest successfully.
- CTest result: 1 test executable passed.
Follow-up:
- Continue with P1R-02 core harness guardrails.
- Keep `RF` verified by internal full-vector equilibrium until a `*_reactions.csv` artifact is provided.
### 2026-05-04 - P1R-00 rebaseline audit completed ### 2026-05-04 - P1R-00 rebaseline audit completed
Author: Codex Author: Codex
@@ -448,10 +478,10 @@ Verification:
## Known Blockers ## Known Blockers
- No reaction-force reference artifact exists yet under `references/`. - No reaction-force reference artifact exists yet under `references/`.
- The current initial `quad_01.inp` reference contains `S4R`, `Part/Assembly/Instance`, `*Density`, and `NLGEOM=YES`, so it is not a Phase 1 parser acceptance case as-is. - The current initial `quad_01.inp` reference contains `S4R`, `Part/Assembly/Instance`, `*Density`, and `NLGEOM=YES`, so it is not a Phase 1 parser acceptance case as-is.
- `quad_02.inp` is a stored Abaqus `TYPE=S4` reference with matching displacement CSV, but it contains `Part/Assembly/Instance` and `*Density`; Step 1 must define a normalized-input or explicit parser-compatibility path before stored-reference regression.
## Current Risks ## Current Risks
- Implementation could start from the `quad_01` reference input without accounting for its unsupported Abaqus features. - Implementation could start from the `quad_01` reference input without accounting for its unsupported Abaqus features.
- Implementation could treat the old MITC4 kernel as authoritative even though it conflicts with the revised formulation contract. - Implementation could treat the old MITC4 kernel as authoritative even though it conflicts with the revised formulation contract.
- Future work could accidentally parse the original `quad_02.inp` instead of the normalized `quad_02_phase1.inp` before parser compatibility is explicitly expanded.
- Reaction output may be wrong if full-space stiffness/load data is not preserved or reconstructed. - Reaction output may be wrong if full-space stiffness/load data is not preserved or reconstructed.
- Large-model support may be weakened if any module narrows ids or sparse indices below int64. - Large-model support may be weakened if any module narrows ids or sparse indices below int64.
+2
View File
@@ -44,6 +44,7 @@ FESA parser rules:
- Abbreviated Abaqus keywords are not supported in Phase 1. Require exact keyword names after case normalization. - Abbreviated Abaqus keywords are not supported in Phase 1. Require exact keyword names after case normalization.
- Include files through `INPUT=` are not supported in Phase 1. - Include files through `INPUT=` are not supported in Phase 1.
- Part/Assembly/Instance syntax is not supported in Phase 1 unless added by ADR. - Part/Assembly/Instance syntax is not supported in Phase 1 unless added by ADR.
- Normalized derivative inputs such as `references/quad_02_phase1.inp` may be used for Phase 1 parser and solver tests when the original stored Abaqus file contains unsupported Abaqus/CAE scaffolding.
## Stored Reference Inputs vs Supported Subset ## Stored Reference Inputs vs Supported Subset
Files under `references/` are allowed to preserve the exact Abaqus input used to generate reference results, even when the file contains features outside the current Phase 1 parser subset. Files under `references/` are allowed to preserve the exact Abaqus input used to generate reference results, even when the file contains features outside the current Phase 1 parser subset.
@@ -60,6 +61,7 @@ Current stored reference notes:
- Its paired `references/quad_01_displacements.csv` is still valid as a stored displacement reference artifact for future compatibility and regression work. - Its paired `references/quad_01_displacements.csv` is still valid as a stored displacement reference artifact for future compatibility and regression work.
- `references/quad_02.inp` uses `TYPE=S4`, so it targets the Phase 1 MITC4 element formulation, and its paired `references/quad_02_displacements.csv` has the accepted displacement CSV shape. - `references/quad_02.inp` uses `TYPE=S4`, so it targets the Phase 1 MITC4 element formulation, and its paired `references/quad_02_displacements.csv` has the accepted displacement CSV shape.
- `quad_02.inp` still uses Abaqus/CAE `Part`, `Assembly`, `Instance`, and `*Density`; it is therefore a stored S4 reference artifact and compatibility decision point, not automatic parser acceptance as-is. - `quad_02.inp` still uses Abaqus/CAE `Part`, `Assembly`, `Instance`, and `*Density`; it is therefore a stored S4 reference artifact and compatibility decision point, not automatic parser acceptance as-is.
- `references/quad_02_phase1.inp` is the normalized Phase 1-compatible derivative input for `quad_02`. It preserves node ids, element ids/connectivity, S4 element type, elastic material, shell thickness, fixed boundary nodes, load node, and concentrated load while removing `Part/Assembly/Instance`, `*Density`, restart/output request keywords, and unsupported step metadata.
## Labels and Names ## Labels and Names
Rules: Rules:
+3
View File
@@ -50,6 +50,7 @@ references/
quad_01.inp quad_01.inp
quad_01_displacements.csv quad_01_displacements.csv
quad_02.inp quad_02.inp
quad_02_phase1.inp
quad_02_displacements.csv quad_02_displacements.csv
``` ```
@@ -160,12 +161,14 @@ Current initial case:
|---|---|---| |---|---|---|
| `quad_01` | `quad_01.inp`, `quad_01_displacements.csv` | Abaqus/CAE Learning Edition 2024 input; 121 displacement rows; includes `S4R`, `Part/Assembly/Instance`, `*Density`, and `NLGEOM=YES`, which are outside the current Phase 1 parser/solver subset | | `quad_01` | `quad_01.inp`, `quad_01_displacements.csv` | Abaqus/CAE Learning Edition 2024 input; 121 displacement rows; includes `S4R`, `Part/Assembly/Instance`, `*Density`, and `NLGEOM=YES`, which are outside the current Phase 1 parser/solver subset |
| `quad_02` | `quad_02.inp`, `quad_02_displacements.csv` | Abaqus/CAE input; 121 displacement rows; uses `TYPE=S4` and `NLGEOM=NO`, but still includes `Part/Assembly/Instance` and `*Density`, so it must be normalized or handled by an explicit parser compatibility sprint before automated Phase 1 input acceptance | | `quad_02` | `quad_02.inp`, `quad_02_displacements.csv` | Abaqus/CAE input; 121 displacement rows; uses `TYPE=S4` and `NLGEOM=NO`, but still includes `Part/Assembly/Instance` and `*Density`, so it must be normalized or handled by an explicit parser compatibility sprint before automated Phase 1 input acceptance |
| `quad_02_phase1` | `quad_02_phase1.inp`, `quad_02_displacements.csv`, `quad_02_notes.md` | Phase 1-compatible derivative input for `quad_02`; preserves ids, connectivity, material, thickness, boundary nodes, load node, and load magnitude while removing unsupported Abaqus/CAE scaffolding |
Rules: Rules:
- Original `.inp` files under `references/` should not be modified just to fit FESA Phase 1. - Original `.inp` files under `references/` should not be modified just to fit FESA Phase 1.
- If a normalized Phase 1-compatible input is needed, add it as a separate file with a clear name and note its relationship to the original. - If a normalized Phase 1-compatible input is needed, add it as a separate file with a clear name and note its relationship to the original.
- Unsupported features in stored reference inputs must be reported by compatibility checks, not silently accepted by parser tests. - Unsupported features in stored reference inputs must be reported by compatibility checks, not silently accepted by parser tests.
- A reference case may be useful for future compatibility even before it is executable by the current Phase 1 solver. - A reference case may be useful for future compatibility even before it is executable by the current Phase 1 solver.
- `quad_02_phase1.inp` is the accepted normalized input path for the first `quad_02` Phase 1 S4 reference regression after the MITC4 rebuild and end-to-end workflow are complete.
## Tolerance Policy ## Tolerance Policy
Use absolute and relative tolerance: Use absolute and relative tolerance:
@@ -3,7 +3,7 @@
"phase": "1-linear-static-mitc4-rebaseline", "phase": "1-linear-static-mitc4-rebaseline",
"steps": [ "steps": [
{ "step": 0, "name": "rebaseline-audit", "status": "completed" }, { "step": 0, "name": "rebaseline-audit", "status": "completed" },
{ "step": 1, "name": "reference-onboarding", "status": "pending" }, { "step": 1, "name": "reference-onboarding", "status": "completed" },
{ "step": 2, "name": "core-harness-guardrails", "status": "pending" }, { "step": 2, "name": "core-harness-guardrails", "status": "pending" },
{ "step": 3, "name": "parser-domain-subset", "status": "pending" }, { "step": 3, "name": "parser-domain-subset", "status": "pending" },
{ "step": 4, "name": "validation-singular-diagnostics", "status": "pending" }, { "step": 4, "name": "validation-singular-diagnostics", "status": "pending" },
+7
View File
@@ -9,6 +9,11 @@ Abaqus is not run by the repository validation flow. Files here are treated as s
| Case | Input | Result Artifact | Notes | | Case | Input | Result Artifact | Notes |
|---|---|---|---| |---|---|---|---|
| `quad_01` | `quad_01.inp` | `quad_01_displacements.csv` | Abaqus/CAE Learning Edition 2024 source input; displacement CSV has 121 nodal rows | | `quad_01` | `quad_01.inp` | `quad_01_displacements.csv` | Abaqus/CAE Learning Edition 2024 source input; displacement CSV has 121 nodal rows |
| `quad_02` | `quad_02.inp` | `quad_02_displacements.csv` | Abaqus/CAE Learning Edition 2024 source input; `TYPE=S4`; displacement CSV has 121 nodal rows; original input remains unsupported provenance because it contains Abaqus/CAE scaffolding |
| `quad_02_phase1` | `quad_02_phase1.inp` | `quad_02_displacements.csv` | Normalized Phase 1 parser-compatible derivative of `quad_02.inp`; preserves ids, connectivity, material, shell thickness, fixed boundary set, and concentrated load |
Case-specific notes:
- `quad_02_notes.md`
## Displacement CSV Format ## Displacement CSV Format
@@ -35,3 +40,5 @@ Mapping to FESA:
Stored Abaqus inputs may contain features outside the current FESA Phase 1 parser subset. Preserve the original files and document unsupported features instead of editing them in place. Stored Abaqus inputs may contain features outside the current FESA Phase 1 parser subset. Preserve the original files and document unsupported features instead of editing them in place.
`quad_01.inp` currently includes `TYPE=S4R`, `Part/Assembly/Instance`, `*Density`, and `NLGEOM=YES`. These are stored for reference provenance and future compatibility work; they are not Phase 1 parser acceptance requirements unless `docs/ABAQUS_INPUT_SUBSET.md` and `docs/ADR.md` are updated. `quad_01.inp` currently includes `TYPE=S4R`, `Part/Assembly/Instance`, `*Density`, and `NLGEOM=YES`. These are stored for reference provenance and future compatibility work; they are not Phase 1 parser acceptance requirements unless `docs/ABAQUS_INPUT_SUBSET.md` and `docs/ADR.md` are updated.
`quad_02.inp` currently includes `TYPE=S4`, `Part/Assembly/Instance`, `*Density`, restart/output request keywords, and Abaqus/CAE step metadata. `quad_02_phase1.inp` is the accepted Phase 1-compatible derivative input. The original file must continue to be treated as stored provenance, not as parser acceptance.
+85
View File
@@ -0,0 +1,85 @@
# quad_02 Reference Notes
## Purpose
`quad_02` is the first stored Abaqus `TYPE=S4` reference pair intended for the Phase 1 MITC4 rebaseline path.
The original Abaqus input remains preserved as provenance:
- `quad_02.inp`
- `quad_02_displacements.csv`
The Phase 1 parser-compatible derivative input is:
- `quad_02_phase1.inp`
## Provenance
- Source solver: Abaqus/CAE Learning Edition 2024, as recorded in `quad_02.inp`.
- Original job name: `quad_02`.
- Source model name: `Model-1`.
- Unit system: self-consistent source units. FESA does not enforce or convert units.
## Compatibility
`quad_02.inp` uses `TYPE=S4`, which is the Phase 1 target mapped to FESA `MITC4`.
The original file also contains Abaqus/CAE features outside the current Phase 1 parser subset:
- `*Part`
- `*Assembly`
- `*Instance`
- `*Density`
- output and restart request keywords
These features remain unsupported in Phase 1 unless `docs/ABAQUS_INPUT_SUBSET.md` and ADRs are explicitly updated. Tests must continue to reject the original file as unsupported provenance.
## Normalized Input
`quad_02_phase1.inp` is a derivative input created for Phase 1 parser and later solver regression work.
It preserves:
- 121 node ids and coordinates.
- 100 `TYPE=S4` quadrilateral elements and connectivity.
- Elastic material values `E = 7.0e10`, `nu = 0.3`.
- Shell thickness `1.0`.
- Fixed boundary nodes from the original assembly-level boundary set.
- Concentrated load at node `2`, DOF `3`, magnitude `-100000.0`.
It removes:
- Abaqus/CAE `Part/Assembly/Instance` scaffolding.
- `*Density`, because density is not used by Phase 1 linear static analysis.
- restart/output requests.
- step increment parameters and static time data not needed by the Phase 1 parser subset.
## Result Mapping
`quad_02_displacements.csv` is an Abaqus-exported nodal displacement table with 121 rows.
Required columns:
- `Node Label`
- `U-U1`
- `U-U2`
- `U-U3`
- `UR-UR1`
- `UR-UR2`
- `UR-UR3`
It maps to FESA field output:
```text
/results/steps/Step-1/frames/0/fieldOutputs/U
```
with component order:
```text
UX, UY, UZ, RX, RY, RZ
```
## Initial Tolerance
Use the project default reference displacement starting point until case-specific calibration is justified:
```text
abs_tol = 1.0e-12
rel_tol = 1.0e-5
reference_scale = 1.0
```
Do not tune tolerances or drilling stiffness to make this single case pass.
## Current Limitations
- `RF` has no paired Abaqus reaction CSV yet; verify `RF` by full-vector equilibrium until a `quad_02_reactions.csv` artifact is provided.
- Solver displacement comparison against this case must wait until the MITC4 rebuild and end-to-end linear static workflow are complete.
+252
View File
@@ -0,0 +1,252 @@
** FESA Phase 1 normalized derivative of references/quad_02.inp
** Original source: Abaqus/CAE Learning Edition 2024, job quad_02.
** Paired displacement reference: references/quad_02_displacements.csv.
** Unit system: self-consistent source units; FESA does not enforce unit conversion.
** Normalization policy:
** - Preserve original node ids, element ids, S4 connectivity, material E/nu,
** shell thickness, fixed node set, concentrated load node, and load value.
** - Remove unsupported Abaqus/CAE scaffolding: Part, Assembly, Instance,
** Density, Restart, Output, and Step increment parameters.
*Node
1, 10., 0., 0.
2, 0., 0., 0.
3, 0., -10., 0.
4, 10., -10., 0.
5, -10., 0., 0.
6, -10., -10., 0.
7, 0., 10., 0.
8, -10., 10., 0.
9, 10., 10., 0.
10, 8., 0., 0.
11, 6., 0., 0.
12, 4., 0., 0.
13, 2., 0., 0.
14, 0., -2., 0.
15, 0., -4., 0.
16, 0., -6., 0.
17, 0., -8., 0.
18, 2., -10., 0.
19, 4., -10., 0.
20, 6., -10., 0.
21, 8., -10., 0.
22, 10., -8., 0.
23, 10., -6., 0.
24, 10., -4., 0.
25, 10., -2., 0.
26, -2., 0., 0.
27, -4., 0., 0.
28, -6., 0., 0.
29, -8., 0., 0.
30, -10., -2., 0.
31, -10., -4., 0.
32, -10., -6., 0.
33, -10., -8., 0.
34, -8., -10., 0.
35, -6., -10., 0.
36, -4., -10., 0.
37, -2., -10., 0.
38, 0., 2., 0.
39, 0., 4., 0.
40, 0., 6., 0.
41, 0., 8., 0.
42, -2., 10., 0.
43, -4., 10., 0.
44, -6., 10., 0.
45, -8., 10., 0.
46, -10., 8., 0.
47, -10., 6., 0.
48, -10., 4., 0.
49, -10., 2., 0.
50, 10., 2., 0.
51, 10., 4., 0.
52, 10., 6., 0.
53, 10., 8., 0.
54, 8., 10., 0.
55, 6., 10., 0.
56, 4., 10., 0.
57, 2., 10., 0.
58, 8., -2., 0.
59, 6., -2., 0.
60, 4., -2., 0.
61, 2., -2., 0.
62, 8., -4., 0.
63, 6., -4., 0.
64, 4., -4., 0.
65, 2., -4., 0.
66, 8., -6., 0.
67, 6., -6., 0.
68, 4., -6., 0.
69, 2., -6., 0.
70, 8., -8., 0.
71, 6., -8., 0.
72, 4., -8., 0.
73, 2., -8., 0.
74, -2., -2., 0.
75, -4., -2., 0.
76, -6., -2., 0.
77, -8., -2., 0.
78, -2., -4., 0.
79, -4., -4., 0.
80, -6., -4., 0.
81, -8., -4., 0.
82, -2., -6., 0.
83, -4., -6., 0.
84, -6., -6., 0.
85, -8., -6., 0.
86, -2., -8., 0.
87, -4., -8., 0.
88, -6., -8., 0.
89, -8., -8., 0.
90, -8., 2., 0.
91, -6., 2., 0.
92, -4., 2., 0.
93, -2., 2., 0.
94, -8., 4., 0.
95, -6., 4., 0.
96, -4., 4., 0.
97, -2., 4., 0.
98, -8., 6., 0.
99, -6., 6., 0.
100, -4., 6., 0.
101, -2., 6., 0.
102, -8., 8., 0.
103, -6., 8., 0.
104, -4., 8., 0.
105, -2., 8., 0.
106, 2., 2., 0.
107, 4., 2., 0.
108, 6., 2., 0.
109, 8., 2., 0.
110, 2., 4., 0.
111, 4., 4., 0.
112, 6., 4., 0.
113, 8., 4., 0.
114, 2., 6., 0.
115, 4., 6., 0.
116, 6., 6., 0.
117, 8., 6., 0.
118, 2., 8., 0.
119, 4., 8., 0.
120, 6., 8., 0.
121, 8., 8., 0.
*Element, type=S4, elset=all_elements
1, 1, 10, 58, 25
2, 10, 11, 59, 58
3, 11, 12, 60, 59
4, 12, 13, 61, 60
5, 13, 2, 14, 61
6, 25, 58, 62, 24
7, 58, 59, 63, 62
8, 59, 60, 64, 63
9, 60, 61, 65, 64
10, 61, 14, 15, 65
11, 24, 62, 66, 23
12, 62, 63, 67, 66
13, 63, 64, 68, 67
14, 64, 65, 69, 68
15, 65, 15, 16, 69
16, 23, 66, 70, 22
17, 66, 67, 71, 70
18, 67, 68, 72, 71
19, 68, 69, 73, 72
20, 69, 16, 17, 73
21, 22, 70, 21, 4
22, 70, 71, 20, 21
23, 71, 72, 19, 20
24, 72, 73, 18, 19
25, 73, 17, 3, 18
26, 2, 26, 74, 14
27, 26, 27, 75, 74
28, 27, 28, 76, 75
29, 28, 29, 77, 76
30, 29, 5, 30, 77
31, 14, 74, 78, 15
32, 74, 75, 79, 78
33, 75, 76, 80, 79
34, 76, 77, 81, 80
35, 77, 30, 31, 81
36, 15, 78, 82, 16
37, 78, 79, 83, 82
38, 79, 80, 84, 83
39, 80, 81, 85, 84
40, 81, 31, 32, 85
41, 16, 82, 86, 17
42, 82, 83, 87, 86
43, 83, 84, 88, 87
44, 84, 85, 89, 88
45, 85, 32, 33, 89
46, 17, 86, 37, 3
47, 86, 87, 36, 37
48, 87, 88, 35, 36
49, 88, 89, 34, 35
50, 89, 33, 6, 34
51, 5, 29, 90, 49
52, 29, 28, 91, 90
53, 28, 27, 92, 91
54, 27, 26, 93, 92
55, 26, 2, 38, 93
56, 49, 90, 94, 48
57, 90, 91, 95, 94
58, 91, 92, 96, 95
59, 92, 93, 97, 96
60, 93, 38, 39, 97
61, 48, 94, 98, 47
62, 94, 95, 99, 98
63, 95, 96, 100, 99
64, 96, 97, 101, 100
65, 97, 39, 40, 101
66, 47, 98, 102, 46
67, 98, 99, 103, 102
68, 99, 100, 104, 103
69, 100, 101, 105, 104
70, 101, 40, 41, 105
71, 46, 102, 45, 8
72, 102, 103, 44, 45
73, 103, 104, 43, 44
74, 104, 105, 42, 43
75, 105, 41, 7, 42
76, 2, 13, 106, 38
77, 13, 12, 107, 106
78, 12, 11, 108, 107
79, 11, 10, 109, 108
80, 10, 1, 50, 109
81, 38, 106, 110, 39
82, 106, 107, 111, 110
83, 107, 108, 112, 111
84, 108, 109, 113, 112
85, 109, 50, 51, 113
86, 39, 110, 114, 40
87, 110, 111, 115, 114
88, 111, 112, 116, 115
89, 112, 113, 117, 116
90, 113, 51, 52, 117
91, 40, 114, 118, 41
92, 114, 115, 119, 118
93, 115, 116, 120, 119
94, 116, 117, 121, 120
95, 117, 52, 53, 121
96, 41, 118, 57, 7
97, 118, 119, 56, 57
98, 119, 120, 55, 56
99, 120, 121, 54, 55
100, 121, 53, 9, 54
*Elset, elset=all_elements, generate
1, 100, 1
*Nset, nset=fixed_boundary
1, 3, 4, 5, 6, 7, 8, 9, 18, 19, 20, 21, 22, 23, 24, 25
30, 31, 32, 33, 34, 35, 36, 37, 42, 43, 44, 45, 46, 47, 48, 49
50, 51, 52, 53, 54, 55, 56, 57
*Nset, nset=load_node
2
*Material, name=material_1
*Elastic
7.0e10, 0.3
*Shell Section, elset=all_elements, material=material_1
1.0
*Boundary
fixed_boundary, 1, 6, 0.0
*Step, name=Step-1
*Static
*Cload
load_node, 3, -100000.0
*End Step
+28
View File
@@ -150,6 +150,26 @@ FESA_TEST(quad01_reference_input_remains_unsupported) {
fesa::containsDiagnostic(parsed.diagnostics, "FESA-PARSE-UNSUPPORTED-ELEMENT")); fesa::containsDiagnostic(parsed.diagnostics, "FESA-PARSE-UNSUPPORTED-ELEMENT"));
} }
FESA_TEST(quad02_original_reference_input_remains_unsupported) {
fesa::AbaqusInputParser parser;
auto parsed = parser.parseFile(sourceRoot() + "/references/quad_02.inp");
FESA_CHECK(!parsed.ok());
FESA_CHECK(fesa::containsDiagnostic(parsed.diagnostics, "FESA-PARSE-UNSUPPORTED-KEYWORD"));
}
FESA_TEST(quad02_phase1_normalized_input_uses_supported_subset) {
fesa::AbaqusInputParser parser;
auto parsed = parser.parseFile(sourceRoot() + "/references/quad_02_phase1.inp");
FESA_CHECK(parsed.ok());
FESA_CHECK(parsed.domain.nodes.size() == 121);
FESA_CHECK(parsed.domain.elements.size() == 100);
FESA_CHECK(parsed.domain.node_sets.at("fixed_boundary").node_ids.size() == 40);
FESA_CHECK(parsed.domain.node_sets.at("load_node").node_ids.size() == 1);
FESA_CHECK(parsed.domain.element_sets.at("all_elements").element_ids.size() == 100);
FESA_CHECK(parsed.domain.materials.at("material_1").elastic_modulus == 7.0e10);
FESA_CHECK(parsed.domain.shell_sections.front().thickness == 1.0);
}
FESA_TEST(domain_validation_reports_missing_property_and_targets) { FESA_TEST(domain_validation_reports_missing_property_and_targets) {
fesa::Domain domain; fesa::Domain domain;
domain.nodes[1] = {1, {0, 0, 0}}; domain.nodes[1] = {1, {0, 0, 0}};
@@ -223,6 +243,14 @@ FESA_TEST(displacement_csv_loader_accepts_quad01_format) {
FESA_CHECK(table.rows.count(1) == 1); FESA_CHECK(table.rows.count(1) == 1);
} }
FESA_TEST(displacement_csv_loader_accepts_quad02_format) {
auto table = fesa::loadDisplacementCsv(sourceRoot() + "/references/quad_02_displacements.csv");
FESA_CHECK(!fesa::hasError(table.diagnostics));
FESA_CHECK(table.rows.size() == 121);
FESA_CHECK(table.rows.count(2) == 1);
FESA_CHECK(table.rows.at(2).values[2] < 0.0);
}
FESA_TEST(displacement_comparator_matches_by_node_id_not_row_order) { FESA_TEST(displacement_comparator_matches_by_node_id_not_row_order) {
fesa::FieldOutput actual; fesa::FieldOutput actual;
actual.name = "U"; actual.name = "U";