- Default r_f raised from 1.5mm to 6mm (machining constraint) - Default min_pocket_radius raised to 6mm - Pockets that can't fit r_f at any corner (within 80% tolerance) are skipped entirely — left solid for more stiffness in tight areas - Result: 26 pockets (was 432), 187 NX entities (was 13,061) - Min fillet radius: 4.88mm, all >= 4.8mm (80% of 6mm) - Mass: 4,601g (was 3,480g — more solid = heavier but manufacturable)
Adaptive Isogrid — Plate Lightweighting Tool
Status: Foundation / Pre-Implementation
Architecture: Python Brain + NX Hands + Atomizer Manager
What It Does
Takes a plate with holes → generates an optimally lightweighted isogrid pattern → produces manufacturing-ready geometry. Isogrid density varies across the plate based on hole importance, edge proximity, and optimization-driven meta-parameters.
Architecture
| Component | Role | Runtime |
|---|---|---|
| Python Brain | Density field → Constrained Delaunay → rib profile | ~1-3 sec |
| NX Hands | Import profile → mesh → AFEM merge → Nastran solve → extract results | ~60-90 sec |
| Atomizer Manager | Optuna TPE sampling → objective evaluation → convergence | 500-2000 trials |
Key Insight: Assembly FEM with Superposed Models
- Model A (permanent): Spider elements at holes + edge BC nodes. All loads/BCs applied here.
- Model B (variable): 2D shell mesh of ribbed plate. Rebuilt each iteration.
- Node merge at fixed interface locations connects them reliably every time.
Loads and BCs never need re-association. Only the rib pattern changes.
Directory Structure
adaptive-isogrid/
├── README.md
├── requirements.txt
├── docs/
│ └── technical-spec.md # Full architecture spec
├── src/
│ ├── brain/ # Python geometry generator
│ │ ├── __init__.py
│ │ ├── density_field.py # η(x) evaluation
│ │ ├── triangulation.py # Constrained Delaunay + refinement
│ │ ├── pocket_profiles.py # Pocket inset + filleting
│ │ ├── profile_assembly.py # Final plate - pockets - holes
│ │ └── validation.py # Manufacturing constraint checks
│ ├── nx/ # NXOpen journal scripts
│ │ ├── extract_geometry.py # One-time: face → geometry.json
│ │ ├── build_interface_model.py # One-time: Model A + spiders
│ │ └── iteration_solve.py # Per-trial: rebuild Model B + solve
│ └── atomizer_study.py # Atomizer/Optuna integration
└── tests/
└── test_geometries/ # Sample geometry.json files
Implementation Phases
- Python Brain standalone (1-2 weeks) — geometry generator with matplotlib viz
- NX extraction + AFEM setup (1-2 weeks) — one-time project setup scripts
- NX iteration script (1-2 weeks) — per-trial mesh/solve/extract loop
- Atomizer integration (1 week) — wire objective function + study management
- Validation + first real project (1-2 weeks) — production run on client plate
Quick Start (Phase 1)
cd tools/adaptive-isogrid
pip install -r requirements.txt
python -m src.brain --geometry tests/test_geometries/sample_bracket.json --params default
Parameter Space
15 continuous parameters optimized by Atomizer (Optuna TPE):
- Density field: η₀, α, R₀, κ, p, β, R_edge
- Spacing: s_min, s_max
- Rib thickness: t_min, t₀, γ
- Manufacturing: w_frame, r_f, d_keep
See docs/technical-spec.md for full formulation.