Files

190 lines
5.8 KiB
Markdown
Raw Permalink Normal View History

2026-02-19 08:00:15 +00:00
# Playbook 01 — First Run: Campaign 01 (TPE v1)
**Study:** `studies/01_v1_tpe`
**Algorithm:** Optuna TPE, 200 trials
**Constraint:** Stress only — σ_max ≤ 100.6 MPa (no displacement constraint)
**Expected runtime:** ~810 hours
---
## Pre-conditions
Before starting, verify:
- [ ] NX DesigncenterNX2512 is installed
- [ ] `atomizer` conda environment is active
- [ ] You are running from the `Atomizer/` root directory
- [ ] NX files in `studies/01_v1_tpe/1_setup/model/` (check with step 1)
---
## Step 1 — Pre-flight Check
Run the pre-flight script to verify all files, imports, and NX are ready:
```bash
C:\Users\antoi\anaconda3\envs\atomizer\python.exe \
projects/isogrid-dev-plate/studies/01_v1_tpe/check_preflight.py
```
Expected output:
```
Pre-flight checks
============================================================
Model files:
[OK] Geometry part (X.X MB)
[OK] Idealized part (CRITICAL) (X.X MB)
[OK] FEM file (X.X MB)
[OK] Simulation file (X.X MB)
[OK] Sandbox 1 geometry (X.X MB)
[OK] Sandbox 2 geometry (X.X MB)
NX:
[OK] run_journal.exe: C:/Program Files/Siemens/DesigncenterNX2512/NXBIN/run_journal.exe
Python Brain:
[OK] optimization_engine.isogrid
Material: AL7075-T6 sigma_allow=100.6 MPa
Extractors:
[OK] extract_part_mass_material + extract_solid_stress
============================================================
All checks PASSED — ready to run run_optimization.py
```
If anything is `[MISSING]`, resolve before continuing.
---
## Step 2 — Launch Campaign 01
```bash
C:\Users\antoi\anaconda3\envs\atomizer\python.exe \
projects/isogrid-dev-plate/studies/01_v1_tpe/run_optimization.py
```
The script will print a header:
```
======================================================================
Isogrid Dev Plate — Mass Minimization Study 01 (TPE v1)
======================================================================
Material: AL7075-T6
σ_yield: 503.0 MPa
σ_allow: 100.6 MPa (SF = 5)
Trials: 200
DB: ...3_results/study.db
```
Then iterate:
```
--- Trial 0 ---
η₀=0.123 α=0.875 β=0.412 γ_s=0.234 R₀=45.2 R_e=18.7 s_min=12.3 s_max=41.5
[Brain] sandbox_1: 104 pockets valid=True mass_est≈2420g
[Brain] sandbox_2: 31 pockets valid=True mass_est≈310g
[Brain] Total pockets: 135
[NX] Running journal: import_profile.py
[NX] OK in 18.3s
[NX] Running journal: solve_simulation.py
[NX] OK in 74.2s
[Extract] Mass: 2.731 kg (2731.0 g)
[Extract] Max stress: 83.47 MPa (allow=100.6 SF=6.02)
[Obj] mass=2.7310 kg penalty=0.00 obj=2.7310 feasible=True
```
---
## Step 3 — Monitor Progress
### Option A: Console output
Watch the terminal. Each trial prints mass, stress, and objective.
### Option B: Optuna dashboard
```bash
C:\Users\antoi\anaconda3\envs\atomizer\python.exe -m optuna-dashboard \
sqlite:///projects/isogrid-dev-plate/studies/01_v1_tpe/3_results/study.db
```
Then open http://localhost:8080 in a browser.
### Option C: Trial folders
Each completed trial creates:
```
studies/01_v1_tpe/2_iterations/trial_NNNN/
├── params.json ← sampled design variables
├── results.json ← mass, stress, SF, objective
├── rib_profile_sandbox_1.json ← rib geometry for this trial
└── rib_profile_sandbox_2.json
```
---
## Step 4 — If a Trial Fails
Failures return a large penalty (`1e6`) and are logged in Optuna with `error` user attribute.
The study will **continue automatically** to the next trial.
To see which trials failed after the run:
```python
import optuna
study = optuna.load_study(
study_name="isogrid_01_v1_tpe",
storage="sqlite:///studies/01_v1_tpe/3_results/study.db"
)
failed = [t for t in study.trials if t.user_attrs.get("error")]
for t in failed:
print(f"Trial {t.number}: {t.user_attrs['error']}")
```
---
## Step 5 — Resume After Interruption
The optimizer uses `load_if_exists=True` — it resumes from where it stopped.
Simply re-run the same command:
```bash
C:\Users\antoi\anaconda3\envs\atomizer\python.exe \
projects/isogrid-dev-plate/studies/01_v1_tpe/run_optimization.py
```
It will print:
```
Resuming study: N trials already complete.
Current best: trial X obj=2.XXXX kg mass=2.XXXX kg SF=X.XX
```
---
## Step 6 — After the Run
1. **Fill in `STUDY_REPORT.md`** with actual results:
- Best trial number, mass, stress, SF
- Convergence trial (when best was found)
- Feasibility rate
2. **Update `CONTEXT.md` baseline mass** (Gap G-02):
- Run `extract_part_mass_material` on the unmodified model to get solid plate baseline
3. **Record improvement:**
- `mass_reduction = (baseline_mass - best_mass) / baseline_mass * 100`
4. **Archive if campaign is complete:**
```bash
python tools/archive_study.bat # or zip 3_results/ manually
```
---
## Troubleshooting
| Symptom | Likely Cause | Fix |
|---------|-------------|-----|
| `[NX] FAILED` on import journal | NX can't find model files | Check `1_setup/model/` has all 4 NX files |
| Identical stress every trial | `_i.prt` not loading | Verify `ACS_Stack_Main_Plate_Iso_project_fem2_i.prt` exists in model dir |
| `Brain ERROR` | Geometry JSON malformed | Check `geometry_sandbox_1.json` / `_2.json` in `adaptive_isogrid_data/` |
| `run_journal.exe not found` | Wrong NX version path | Confirm DesigncenterNX2512 is installed; check `check_preflight.py` |
| Very high stress (>500 MPa) | Mesh not updating | `_i.prt` must be in same directory as `.fem` |
| Trial folders not appearing | `2_iterations/` not created | Should auto-create; check for TrialManager error in console |
See also: `docs/protocols/operations/OP_06_TROUBLESHOOT.md`