Files
Atomizer/projects/isogrid-dev-plate/studies/01_v1_tpe/README.md
2026-02-20 08:00:17 +00:00

206 lines
7.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Study 01 — TPE v1: Isogrid Mass Minimization (Campaign 01)
**Parent project:** [isogrid-dev-plate](../../README.md)
**Context:** [../../CONTEXT.md](../../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
```bash
# 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](../../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) | ~310 s |
| NX import journal | ~1530 s |
| NX remesh + Nastran solve | ~6090 s |
| Extraction (mass + stress) | ~13 s |
| **Total per trial** | **~90120 s** |
| **200 trials** | **~810 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](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 | — |