7.3 KiB
Study 01 — TPE v1: Isogrid Mass Minimization (Campaign 01)
Parent project: isogrid-dev-plate Context: ../../CONTEXT.md Status: Ready to run — not yet started Created: 2026-02-18
1. Overview
This is the first optimization campaign for the ACS Stack Main Plate isogrid lightweighting project. It uses Optuna TPE (Tree-structured Parzen Estimator) with a budget of 200 trials.
Goal: Find the set of 8 density-field parameters that minimizes total plate mass subject to a stress constraint (σ_max ≤ 100.6 MPa, AL7075-T6, SF=5).
Each trial: Python Brain generates a triangular isogrid rib pattern → NX imports it into the sketch → NX Nastran solves SOL 101 → extractors pull mass from the idealized part and max stress from the OP2.
2. Engineering Problem
Client: ACS — Attitude Control System, spacecraft structural assembly Part: Main structural plate (AL7075-T6) Challenge: Remove as much material as possible from the plate interior via an isogrid rib pattern, while keeping peak stress within the allowable under the primary axial load case.
Load case: FZ = 1,372.9 N, linear static (SOL 101), Subcase 1 Material: AL7075-T6 — σ_yield = 503 MPa, ρ = 2810 kg/m³, SF = 5 → σ_allow = 100.6 MPa
The rib pattern is generated in 2 sandbox regions. Ribs automatically cluster around bolt holes and the plate perimeter based on physics-inspired density field parameters.
3. Mathematical Formulation
Objective
minimize mass_kg(η₀, α, β, γ_stress, R₀, R_edge, s_min, s_max)
Constraint
subject to σ_max ≤ 100.6 MPa (stress only — no displacement constraint)
Penalty
objective_value = mass_kg + penalty
penalty = 1e4 × ((σ_max / σ_allow) − 1)² if σ_max > σ_allow
= 0 otherwise
Design Variables
| Variable | Low | High | Units | Description |
|---|---|---|---|---|
eta_0 |
0.0 | 0.4 | — | Baseline density offset |
alpha |
0.3 | 2.0 | — | Hole influence scale |
beta |
0.0 | 1.0 | — | Edge influence scale |
gamma_stress |
0.0 | 1.5 | — | FEA stress feedback gain |
R_0 |
10 | 100 | mm | Base hole influence radius |
R_edge |
5 | 40 | mm | Edge influence radius |
s_min |
15 | 35 | mm | Min cell size (densest) — manufacturing floor: 15 mm |
s_max |
40 | 60 | mm | Max cell size (sparsest) — lower bound 40 guarantees s_min < s_max |
Fixed parameters (manufacturing constraints + math constants): see optimization_engine/isogrid/study.py.
4. Optimization Algorithm
| Property | Value |
|---|---|
| Algorithm | Optuna TPE (Tree-structured Parzen Estimator) |
| Sampler seed | 42 |
| Direction | Minimize |
| N startup trials | 10 (random exploration before TPE kicks in) |
| Trial budget | 200 |
| Storage | SQLite — 3_results/study.db |
| Study name | isogrid_01_v1_tpe |
TPE splits past trials at each parameter into "good" (low objective) and "bad" (high objective) groups, then samples from the "good" region. With 8 continuous variables and 200 trials this is well within TPE's effective range.
5. Result Extraction
| Quantity | Extractor | Source |
|---|---|---|
| Mass | extract_part_mass_material(_i.prt) |
_temp_part_properties.json written by solve_simulation.py journal |
| Max von Mises | extract_solid_stress(op2_file, subcase=1) |
OP2 binary from Nastran solve |
Mass is extracted from the idealized part (_fem2_i.prt), not estimated by the Brain.
The NX journal writes a JSON temp file after each solve; the extractor reads it back.
⚠️ NX FEM model uses AL6061 material properties (E≈68.98 GPa, ρ=2.711e-6 kg/mm³). Mass extraction is therefore slightly low (~4% underestimate vs AL7075-T6). Tracked as Gap G-01 in CONTEXT.md.
6. Study Structure
studies/01_v1_tpe/
├── README.md ← You are here
├── STUDY_REPORT.md ← Post-run results (fill after campaign)
├── check_preflight.py ← Quick validation before running
├── run_optimization.py ← Main optimization loop
│
├── 1_setup/ ← Model files (working copies — modified by NX each trial)
│ └── model/
│ ├── ACS_Stack_Main_Plate_Iso_Project.prt
│ ├── ACS_Stack_Main_Plate_Iso_project_fem2_i.prt ← CRITICAL
│ ├── ACS_Stack_Main_Plate_Iso_project_fem2.fem
│ ├── ACS_Stack_Main_Plate_Iso_project_sim2.sim
│ └── adaptive_isogrid_data/
│ ├── geometry_sandbox_1.json ← Sandbox boundary + holes (from NX)
│ ├── geometry_sandbox_2.json
│ ├── rib_profile_sandbox_1.json ← Written per trial (current)
│ └── rib_profile_sandbox_2.json
│
├── 2_iterations/ ← Per-trial logs (auto-created at runtime)
│ ├── trial_0001/
│ │ ├── params.json ← Sampled design variables
│ │ ├── results.json ← mass, stress, SF, objective
│ │ ├── rib_profile_sandbox_1.json ← Rib geometry (copy)
│ │ └── rib_profile_sandbox_2.json
│ └── trial_NNNN/
│ └── ...
│
└── 3_results/ ← Optimization database + summary outputs
└── study.db ← Optuna SQLite (created on first run)
7. Quick Start
# Step 1: Verify everything is ready
C:\Users\antoi\anaconda3\envs\atomizer\python.exe \
projects/isogrid-dev-plate/studies/01_v1_tpe/check_preflight.py
# Step 2: Launch
C:\Users\antoi\anaconda3\envs\atomizer\python.exe \
projects/isogrid-dev-plate/studies/01_v1_tpe/run_optimization.py
See ../../playbooks/01_FIRST_RUN.md for full step-by-step including monitoring, failure handling, and post-run analysis.
8. Expected Runtime
| Component | Estimate |
|---|---|
| Brain (triangulation + pockets) | ~3–10 s |
| NX import journal | ~15–30 s |
| NX remesh + Nastran solve | ~60–90 s |
| Extraction (mass + stress) | ~1–3 s |
| Total per trial | ~90–120 s |
| 200 trials | ~8–10 hours |
Actual per-trial time will vary with mesh complexity (pocket count affects remesh time).
9. Success Criteria
| Criterion | Target |
|---|---|
| Mass reduction vs baseline | > 10% (aspirational: > 20%) |
| Feasibility rate | > 80% of trials (σ ≤ 100.6 MPa) |
| Best trial SF | ≥ 5.0 (σ_max ≤ 100.6 MPa) |
| Convergence | Best mass stable over last 50 trials |
Baseline solid plate mass: TBD (Gap G-02 — run extract_part_mass_material on unmodified model).
10. Results
[Campaign 01 not yet started]
Fill in after run. See STUDY_REPORT.md for the result template.
| Metric | Value |
|---|---|
| Status | 🔴 Not started |
| Trials completed | 0 / 200 |
| Best mass | — |
| Best trial | — |
| Best σ_max | — |
| Best SF | — |
| Feasibility rate | — |
| Runtime | — |