20 KiB
Arsenal Development Plan — Atomizer Multi-Solver Integration
Status: DRAFT — pending CEO approval
Date: 2026-06-25
Authors: Technical Lead (architecture + feasibility), Auditor (risk + gates), Manager (orchestration)
Source docs: Arsenal V3 Final, Tool-Agnostic Architecture, Multi-Solver Roadmap, Arsenal Reference
1. Executive Summary
Goal: Integrate the 80/20 highest-leverage open-source tools from the Atomizer Arsenal into V2, enabling fully scripted optimization without NX GUI dependency.
What this unlocks:
- Linux-headless optimization loops (no NX license bottleneck)
- 100s–1000s of trials per campaign (vs. current NX-constrained budgets)
- Multi-solver validation (CalculiX vs Nastran cross-checking)
- Path to CFD and multi-physics (expansion sprints)
The 80/20 stack (6 sprints):
| Priority | Tool | Category | Why |
|---|---|---|---|
| 🔴 P1 | CalculiX | FEA solver | Free structural solver, covers 80% of use cases |
| 🔴 P1 | Gmsh | Meshing | Universal mesher, Python API, STEP import |
| 🔴 P1 | Build123d | CAD | Code-native geometry, LLM-perfect, headless |
| 🔴 P1 | meshio + pyNastran | Converters | Format glue between all tools |
| 🔴 P1 | PyVista + ParaView | Post-processing | Automated visualization pipeline |
| 🟡 P2 | pymoo | Optimization | Multi-objective (NSGA-II/III) |
| 🟡 P2 | OpenFOAM | CFD | Thermal/flow screening |
| 🟢 P3 | preCICE | Coupling | Thermo-structural coupling |
| 🟢 P3 | OpenMDAO | MDO | System-level optimization |
Antoine's time commitment: ~2–3 hours per sprint for validation gates.
HQ autonomous work: days of implementation per sprint.
2. Architecture Overview
The Arsenal integrates through Atomizer's 3-layer tool-agnostic architecture:
┌─────────────────────────────────────────────────────────┐
│ Layer 3: OPTIMIZATION INTELLIGENCE │
│ AtomizerSpec v3.0 │ Optuna/pymoo │ LAC │ LLM Agents │
│ ── never touches tool-specific formats ── │
├─────────────────────────────────────────────────────────┤
│ Layer 2: TOOL PROCESSORS (deterministic Python) │
│ Geometry: nx_geometry │ build123d_geometry │ step_import│
│ Meshing: gmsh_mesher │ nx_mesher │
│ Solvers: nastran_solver │ calculix_solver │ openfoam │
│ Convert: meshio_converter │ pynastran_bridge │
│ Post: pyvista_post │ paraview_post │
├─────────────────────────────────────────────────────────┤
│ Layer 1: UNIVERSAL DATA CONTRACTS │
│ AtomizerGeometry │ AtomizerMesh │ AtomizerBCs │
│ AtomizerMaterial │ AtomizerResults │
│ ── solver-agnostic dataclasses (the Rosetta Stone) ── │
└─────────────────────────────────────────────────────────┘
Key rule: Adding a new tool = writing ONE processor file. Contracts never change per tool.
2.1 V2 Repository Target Layout
atomizer/
├── contracts/
│ ├── geometry.py # AtomizerGeometry
│ ├── mesh.py # AtomizerMesh
│ ├── boundary_conditions.py # AtomizerBCs
│ ├── material.py # AtomizerMaterial
│ ├── results.py # AtomizerResults
│ └── validators.py # Cross-contract sanity checks
├── processors/
│ ├── base.py # Abstract base classes
│ ├── geometry/
│ │ ├── build123d_geometry.py
│ │ ├── nx_geometry.py
│ │ └── step_import.py
│ ├── meshing/
│ │ ├── gmsh_mesher.py
│ │ └── nx_mesher.py
│ ├── solvers/
│ │ ├── nastran_solver.py
│ │ ├── calculix_solver.py
│ │ └── openfoam_solver.py # Sprint 4
│ ├── converters/
│ │ ├── meshio_converter.py
│ │ └── pynastran_bridge.py
│ └── postprocessing/
│ ├── pyvista_post.py
│ └── paraview_post.py
├── orchestrator/
│ ├── pipeline.py # Solver-agnostic run sequencing
│ ├── auto_select.py # Toolchain routing logic
│ └── coupling.py # Sprint 5: preCICE
├── optimization/
│ ├── engine.py # Core optimization loop
│ ├── optuna_backend.py
│ └── pymoo_backend.py # Sprint 6
└── mcp_servers/ # Sprint 2-3
├── calculix/
├── gmsh/
├── build123d/
└── pynastran/
3. Current Environment Assessment
| Item | Status | Action Required |
|---|---|---|
V2 repo (atomizer/ package) |
❌ Not yet created — still V1 flat layout | Sprint 0: scaffold package structure |
| pyNastran | ✅ Installed | None |
| CalculiX (ccx) | ❌ Not installed | apt install calculix-ccx or Docker |
| Gmsh | ❌ Not installed | pip install gmsh pygmsh |
| Build123d | ❌ Not installed | pip install build123d |
| meshio | ❌ Not installed | pip install meshio |
| PyVista | ❌ Not installed | pip install pyvista |
| ParaView/pvpython | ❌ Not installed | apt install paraview |
| pymoo | ❌ Not installed | pip install pymoo (Sprint 6) |
| OpenFOAM | ❌ Not installed | Docker recommended (Sprint 4) |
First blocker: Package installs on T420. Either direct install or Docker-based dev environment.
4. Sprint Plan
Sprint 0: Environment + Scaffold (1–2 days)
Goal: Working dev environment and V2 package skeleton.
| Task | Owner | Autonomy | Deliverable |
|---|---|---|---|
| Install core Python packages (gmsh, build123d, meshio, pyvista) | Developer/IT | 🟢 Full | Working imports |
Install CalculiX (apt install calculix-ccx) |
Developer/IT | 🟢 Full | ccx on PATH |
Scaffold atomizer/ package with __init__.py stubs |
Developer | 🟢 Full | Package importable |
Create tests/benchmarks/ with 3 analytical reference cases |
Tech Lead | 🟢 Full | JSON expected-value files |
Analytical benchmarks (known-answer problems):
- Cantilever beam — tip deflection = PL³/3EI (linear static)
- Plate with hole — SCF ≈ 3.0 at hole edge (stress concentration)
- Simply supported beam — first natural frequency = (π²/L²)√(EI/ρA) (modal)
Antoine gate: None — this is infrastructure.
Sprint 1: Contracts + Structural Bridge Baseline (1 week)
Goal: Contract-driven NX/Nastran baseline with format conversion verification.
| Task | Owner | Autonomy | Deliverable |
|---|---|---|---|
| Implement 5 contract dataclasses | Developer | 🟢 95% | contracts/*.py with full type hints |
Implement validators.py |
Developer | 🟢 95% | Unit-consistent checks, BC physics checks |
Implement processors/base.py abstract classes |
Tech Lead → Developer | 🟢 95% | GeometryProcessor, MeshProcessor, SolverProcessor ABCs |
Wrap existing NX/Nastran into nastran_solver.py |
NX Expert → Developer | 🟡 70% | Existing workflow through new interface |
Implement meshio_converter.py |
Developer | 🟢 95% | BDF ↔ INP ↔ MSH ↔ VTK round-trip |
Implement pynastran_bridge.py |
Developer | 🟢 95% | BDF read/modify, OP2 parse → AtomizerResults |
Implement pipeline.py skeleton |
Tech Lead → Developer | 🟢 90% | Sequential pipeline runner |
| Unit tests for all contracts + converters | Developer | 🟢 95% | pytest suite passing |
Success criterion: Existing NX/Nastran workflow passes through new architecture with zero regression.
Antoine gate: Provide 3 trusted benchmark studies with known expected outputs for parity check.
Risk: Hidden assumptions in legacy NX/Nastran parsing may break when abstracted.
Mitigation: Run full diff on old vs new output before declaring parity.
Sprint 2: Open Structural Lane — CalculiX + Gmsh + Build123d (1–2 weeks)
Goal: Full Linux-headless structural optimization loop with zero NX dependency.
| Task | Owner | Autonomy | Deliverable |
|---|---|---|---|
Implement build123d_geometry.py |
Developer | 🟢 90% | DV dict → Build123d → STEP |
Implement step_import.py |
Developer | 🟢 95% | STEP → AtomizerGeometry |
Implement gmsh_mesher.py |
Developer | 🟢 90% | STEP → Gmsh → AtomizerMesh (with quality metrics) |
Implement calculix_solver.py |
Tech Lead → Developer | 🟡 80% | .inp generation + ccx exec + .frd parsing → AtomizerResults |
Implement pyvista_post.py |
Developer | 🟢 95% | AtomizerResults → contour plots (PNG/VTK) |
Implement optuna_backend.py (adapted) |
Optimizer → Developer | 🟢 90% | Contract-aware Optuna loop |
| Run 3 analytical benchmarks through full pipeline | Tech Lead | 🟢 90% | Pass/fail report vs known answers |
| CalculiX vs Nastran parity comparison | Tech Lead | 🟡 70% | Delta report on shared benchmark |
Demo scenario:
Parametric bracket (thickness, fillet_radius, rib_width)
→ Build123d generates STEP
→ Gmsh meshes
→ CalculiX solves (SOL 101 equivalent)
→ PyVista renders stress contour
→ Optuna optimizes for min mass @ stress constraint
→ Full loop on Linux, no NX
Success criteria:
- 3 analytical benchmarks pass within 2% of theory
- CalculiX vs Nastran delta < 5% on stress/displacement for shared benchmark
- Full optimization loop completes 50+ trials unattended
Antoine gate:
- Approve CalculiX vs Nastran parity tolerance (proposed: 5% on stress, 3% on displacement)
- Validate one benchmark result manually
- Review Build123d geometry quality for representative model
Risks:
- Gmsh mesh quality on sharp fillets → Mitigation: define mesh size presets, add Jacobian quality check
- CalculiX .frd parsing edge cases → Mitigation: test against multiple element types (CQUAD4 equivalent, CHEXA equivalent)
- Build123d geometry failures on complex shapes → Mitigation: start with simple parametric bracket, escalate complexity gradually
Sprint 3: MVP Hardening + Client-Grade Post-Processing (1 week)
Goal: Production-quality outputs from both solver lanes, side-by-side comparison capability.
| Task | Owner | Autonomy | Deliverable |
|---|---|---|---|
Implement paraview_post.py |
Developer | 🟢 90% | Publication-quality figures (headless pvpython) |
Implement auto_select.py |
Tech Lead → Developer | 🟡 75% | Toolchain routing rules (NX lane vs open lane) |
Implement spec/validator.py |
Developer | 🟢 95% | AtomizerSpec v3.0 schema validation |
| Dual-lane comparison report | Post-Processor → Developer | 🟢 85% | Side-by-side Nastran vs CalculiX with pass/fail |
| Regression test suite | Auditor → Developer | 🟢 90% | Automated benchmark + parity checks |
| MCP-CalculiX server | MCP Engineer → Developer | 🟡 70% | Tool-call interface for CalculiX |
| MCP-Gmsh server | MCP Engineer → Developer | 🟡 70% | Tool-call interface for Gmsh |
| Documentation: Integration Guide | Secretary | 🟢 95% | docs/DEV/INTEGRATION-GUIDE.md |
Success criteria:
- Dual-lane comparison passes on all 3 benchmarks
- Automated regression suite runs in CI
- MCP servers pass basic smoke tests
Antoine gate:
- Approve report template and required figure list
- Define auto-select routing rules (when NX vs when open-source)
- Sign off MVP as "usable for real studies"
🏁 MVP EXIT — after Sprint 3, Atomizer can run full structural optimization on Linux without NX.
Sprint 4: CFD Lane — OpenFOAM (1–2 weeks)
Goal: Automated CFD/thermal screening within the same orchestration framework.
| Task | Owner | Autonomy | Deliverable |
|---|---|---|---|
| Install OpenFOAM (Docker recommended) | IT | 🟢 Full | Working simpleFoam / buoyantSimpleFoam |
Implement openfoam_solver.py |
Tech Lead → Developer | 🟡 65% | Case generation + execution + result parsing |
Extend gmsh_mesher.py with CFD presets |
Developer | 🟡 75% | Boundary layer meshing, inflation layers |
| Extend contracts for CFD quantities | Tech Lead → Developer | 🟡 70% | Pressure, velocity, temperature fields in AtomizerResults |
| 2 CFD validation cases | Tech Lead | 🟡 60% | Lid-driven cavity + pipe flow (known analytical/reference) |
Demo scenario:
Electronics enclosure airflow
→ STEP → Gmsh CFD mesh → OpenFOAM (buoyantSimpleFoam)
→ PyVista thermal map + pressure drop
→ Variant ranking by max temperature
Antoine gate:
- Lock one validated starter case template before generalization
- Define screening-fidelity defaults (mesh size, turbulence model)
- Validate thermal results against engineering judgment
Risk: OpenFOAM setup complexity is high. Dictionary validation is error-prone.
Mitigation: Start with one locked template, generalize only after it works.
Sprint 5: Coupled Thermo-Structural — preCICE (1–2 weeks)
Goal: Two-way coupled OpenFOAM ↔ CalculiX simulations.
| Task | Owner | Autonomy | Deliverable |
|---|---|---|---|
| Install preCICE + adapters | IT | 🟢 Full | preCICE + CalculiX adapter + OpenFOAM adapter |
Implement coupling.py |
Tech Lead → Developer | 🟡 60% | Coupled orchestration with convergence monitoring |
| 1 coupled benchmark | Tech Lead | 🔴 50% | Heated plate with thermal expansion |
Antoine gate: Approve coupling parameters and convergence criteria.
Risk: Coupling divergence, debugging complexity.
Mitigation: Conservative time-step, explicit convergence checks, one golden benchmark.
Sprint 6: Multi-Objective + MDO — pymoo + OpenMDAO (1–2 weeks)
Goal: Pareto optimization across multiple objectives and disciplines.
| Task | Owner | Autonomy | Deliverable |
|---|---|---|---|
Implement pymoo_backend.py |
Optimizer → Developer | 🟢 85% | NSGA-II/III alongside Optuna |
| Pareto front visualization | Post-Processor → Developer | 🟢 90% | Interactive Pareto plots |
| OpenMDAO integration (if scope allows) | Tech Lead → Developer | 🟡 60% | MDO wiring for multi-discipline |
| 1 multi-objective demo | Optimizer + Tech Lead | 🟡 70% | Mass vs stress vs temperature Pareto |
Antoine gate: Define objective scaling and hard constraints.
5. Semi-Autonomous Workflow
┌─────────────────────────────────────────────────────────┐
│ PER-SPRINT LOOP │
│ │
│ 1. Antoine picks sprint / approves scope [YOU] │
│ 2. HQ researches + designs architecture [AUTO] │
│ 3. Auditor reviews design for risks [AUTO] │
│ 4. Antoine approves architecture (15 min) [YOU] │
│ 5. Developer implements + writes tests [AUTO] │
│ 6. Auditor reviews code against protocols [AUTO] │
│ 7. Antoine validates one benchmark (2-3 hrs) [YOU] │
│ 8. Merge → next sprint [AUTO] │
│ │
│ Your time: ~2-3 hours/sprint │
│ HQ time: days of implementation/sprint │
└─────────────────────────────────────────────────────────┘
What runs fully autonomously (steps 2-3, 5-6):
- Research tool capabilities, formats, Python bindings
- Design processor architecture and contract extensions
- Implement Python adapters, parsers, converters
- Write and run unit tests against analytical benchmarks
- Audit code against Atomizer protocols
- Generate regression reports
What needs your engineering judgment (steps 1, 4, 7):
- Tool priority sequencing (strategic call)
- Architecture approval (15-min review)
- Cross-solver parity acceptance (is 5% delta OK?)
- Benchmark validation (does this match physics?)
- Geometry quality assessment (does Build123d output look right?)
6. Quality Gates (Auditor-Defined)
Per-Processor Gate
- Processor implements abstract base class correctly
- Round-trip test: contract → native format → solve → parse → contract
- At least 1 analytical benchmark passes within tolerance
- Unit test coverage ≥ 80% for parser logic
- Error handling for: missing files, solver crash, malformed output
- Documentation: input/output formats, known limitations
Per-Sprint Gate
- All processor gates pass
- Integration test: full pipeline from AtomizerSpec → results
- Regression: no existing tests broken
- Parity check (if applicable): new solver vs reference solver
- Tech Lead sign-off on physics validity
- Auditor sign-off on code quality + protocol compliance
MVP Gate (Sprint 3 Exit)
- 3 analytical benchmarks pass (cantilever, plate-hole, modal)
- CalculiX vs Nastran parity < 5% stress, < 3% displacement
- 50-trial optimization completes unattended
- Dual-lane comparison report generates automatically
- Antoine validates one real-world study through the new pipeline
- All regression tests pass in CI
7. Risk Register
| # | Risk | Impact | Likelihood | Mitigation | Owner |
|---|---|---|---|---|---|
| R1 | CalculiX vs Nastran parity exceeds tolerance | High | Medium | Start with simple geometries, document element type mapping, investigate mesh sensitivity | Tech Lead |
| R2 | Gmsh mesh quality on complex geometry | Medium | Medium | Define quality thresholds, add Jacobian/aspect-ratio checks, fallback presets | Tech Lead |
| R3 | Build123d limitations on complex parametric models | Medium | Low | Start simple, escalate complexity, keep NX lane as fallback | Developer |
| R4 | Contract design locks in wrong abstractions | High | Low | Freeze contracts only after Sprint 1 validation, allow minor evolution in Sprint 2 | Tech Lead + Auditor |
| R5 | Package dependency conflicts on T420 | Low | Medium | Use venv or Docker dev environment | IT |
| R6 | OpenFOAM setup complexity delays Sprint 4 | Medium | High | Docker-first approach, one locked template | IT + Tech Lead |
| R7 | Scope creep into expansion tools before MVP stable | High | Medium | Hard gate: no Sprint 4+ work until Sprint 3 exit criteria met | Manager + Auditor |
| R8 | MCP server maintenance burden | Low | Medium | MVP cap at 4 MCP servers, thin wrappers only | MCP Engineer |
8. Tool Installation Reference
Sprint 0-2 (Core)
# Python packages
pip install gmsh pygmsh build123d meshio pyvista
# CalculiX solver
sudo apt install calculix-ccx
# ParaView (Sprint 3)
sudo apt install paraview
Sprint 4+ (Expansion)
# OpenFOAM via Docker
docker pull openfoam/openfoam-dev
# preCICE
sudo apt install libprecice-dev python3-precice
# pymoo
pip install pymoo
# OpenMDAO
pip install openmdao
9. Success Metrics
| Metric | Sprint 3 Target | Sprint 6 Target |
|---|---|---|
| Solver lanes operational | 2 (Nastran + CalculiX) | 4 (+OpenFOAM + coupled) |
| Optimization trials/hr (bracket-class) | 50+ | 100+ |
| Analytical benchmarks passing | 3 | 8+ |
| Cross-solver parity verified | Nastran ↔ CalculiX | + OpenFOAM thermal |
| Automation level (no human in loop) | 70% | 85% |
| MCP servers | 2 (CalculiX, Gmsh) | 4 |
10. Immediate Next Steps
- Antoine: Approve this plan and Sprint 0-1 scope
- IT/Developer: Run Sprint 0 package installs (est. 1-2 hours)
- Tech Lead: Finalize contract dataclass specs with field-level detail
- Developer: Scaffold
atomizer/package structure - Auditor: Prepare benchmark expected-value files for 3 analytical cases
- Manager: Create Mission Dashboard tasks for Sprint 0 + Sprint 1
This plan is a living document. Update after each sprint retrospective.