feat: Add NX study models and optimization histories
Includes all study folders with NX models for development: - bracket_stiffness_optimization (V1, V2, V3) - drone_gimbal_arm_optimization - simple_beam_optimization - uav_arm_optimization (V1, V2) - training_data_export_test - uav_arm_atomizerfield_test Contains .prt, .fem, .sim files and optimization databases. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
256
studies/bracket_stiffness_optimization_V3/README.md
Normal file
256
studies/bracket_stiffness_optimization_V3/README.md
Normal file
@@ -0,0 +1,256 @@
|
||||
# Bracket Stiffness Optimization Study
|
||||
|
||||
Multi-objective optimization to maximize bracket stiffness while minimizing mass.
|
||||
|
||||
## Objectives
|
||||
|
||||
1. **Maximize Stiffness** (Primary)
|
||||
- Structural stiffness calculated as k = F/δ
|
||||
- Units: N/mm
|
||||
- Higher is better
|
||||
|
||||
2. **Minimize Mass** (Secondary + Constraint)
|
||||
- Total bracket mass
|
||||
- Units: kg
|
||||
- **Hard Constraint**: Mass ≤ 0.2 kg (200 grams)
|
||||
|
||||
## Design Variables
|
||||
|
||||
| Variable | Min | Max | Initial | Unit | Description |
|
||||
|----------|-----|-----|---------|------|-------------|
|
||||
| `support_angle` | 30.0 | 90.0 | 60.0 | degrees | Angle of support arm relative to base |
|
||||
| `tip_thickness` | 15.0 | 40.0 | 25.0 | mm | Thickness of bracket tip where load is applied |
|
||||
|
||||
## Study Structure
|
||||
|
||||
```
|
||||
bracket_stiffness_optimization/
|
||||
├── README.md # This file
|
||||
├── optimization_config.json # Optimization settings
|
||||
├── workflow_config.json # Workflow definition
|
||||
├── run_optimization.py # Main runner script
|
||||
├── bracket_stiffness_extractor.py # Results extractor
|
||||
│
|
||||
├── 1_setup/
|
||||
│ └── model/
|
||||
│ ├── Bracket.prt # NX part file
|
||||
│ ├── Bracket_fem1_i.prt # Idealized geometry
|
||||
│ ├── Bracket_fem1.fem # FEM definition
|
||||
│ ├── Bracket_sim1.sim # Simulation file
|
||||
│ └── export_displacement_field.py # NX journal for field export
|
||||
│
|
||||
└── 2_results/
|
||||
├── study.db # Optuna study database
|
||||
├── optimization_summary.json # Results summary
|
||||
├── workflow.log # Execution log
|
||||
└── errors.log # Error log
|
||||
```
|
||||
|
||||
## Generic Extractors Used
|
||||
|
||||
This study uses **reusable generic extractors** from `optimization_engine/extractors/`:
|
||||
|
||||
1. **`field_data_extractor.py`**
|
||||
- Parses NX exported field data (.fld files)
|
||||
- Works for: displacement, stress, strain, temperature, any scalar field
|
||||
- Multiple aggregation methods: max_abs, max, min, mean, std
|
||||
|
||||
2. **`op2_extractor.py`**
|
||||
- Extracts data from Nastran OP2 files using pyNastran
|
||||
- Mass properties (with unit conversion ton→kg)
|
||||
- Grid point forces (fx, fy, fz, resultant)
|
||||
- ~10000x faster than F06 parsing
|
||||
|
||||
3. **`stiffness_calculator.py`**
|
||||
- Generic stiffness calculator: k = F/δ
|
||||
- Works for any structure: bracket, beam, plate, etc.
|
||||
- Combines field data and OP2 extractors
|
||||
|
||||
The `bracket_stiffness_extractor.py` is a thin wrapper that orchestrates these generic tools with bracket-specific parameters.
|
||||
|
||||
## Workflow
|
||||
|
||||
Each optimization trial follows these steps:
|
||||
|
||||
1. **Update Design Variables**
|
||||
- Modify NX model expressions: `support_angle`, `tip_thickness`
|
||||
|
||||
2. **Solve Simulation**
|
||||
- Run NX Nastran SOL 101 (linear static analysis)
|
||||
- Output: `.op2` and `.f06` files
|
||||
|
||||
3. **Export Displacement Field**
|
||||
- Execute NX journal to export z-displacement
|
||||
- Output: `export_field_dz.fld`
|
||||
|
||||
4. **Extract Results**
|
||||
- Parse displacement field (max absolute z-displacement)
|
||||
- Extract applied force from OP2
|
||||
- Calculate stiffness: k = Force / Displacement
|
||||
- Extract mass from OP2 grid point weight
|
||||
|
||||
5. **Evaluate Constraints**
|
||||
- Check: mass ≤ 0.2 kg
|
||||
- If violated: prune trial
|
||||
|
||||
6. **Report Results**
|
||||
- Send to Optuna study database
|
||||
- Broadcast to dashboard via WebSocket
|
||||
|
||||
## Running the Optimization
|
||||
|
||||
### Basic Usage
|
||||
|
||||
```bash
|
||||
cd studies/bracket_stiffness_optimization
|
||||
python run_optimization.py
|
||||
```
|
||||
|
||||
### Advanced Options
|
||||
|
||||
```bash
|
||||
# Custom number of trials
|
||||
python run_optimization.py --trials 100
|
||||
|
||||
# Enable real-time dashboard
|
||||
python run_optimization.py --dashboard
|
||||
|
||||
# Both
|
||||
python run_optimization.py --trials 50 --dashboard
|
||||
```
|
||||
|
||||
### Testing Before Full Run
|
||||
|
||||
Test the extractors with a single trial first:
|
||||
|
||||
```bash
|
||||
# Test extractor independently
|
||||
python bracket_stiffness_extractor.py
|
||||
```
|
||||
|
||||
## Results Analysis
|
||||
|
||||
### View in Dashboard
|
||||
|
||||
The React dashboard provides real-time monitoring:
|
||||
- Convergence plot (stiffness over trials)
|
||||
- Parameter space exploration
|
||||
- Pareto front visualization
|
||||
- Mass constraint violations
|
||||
|
||||
Access at: `http://localhost:3001`
|
||||
|
||||
### Database Query
|
||||
|
||||
Results are stored in SQLite database `2_results/study.db`:
|
||||
|
||||
```python
|
||||
import optuna
|
||||
|
||||
study = optuna.load_study(
|
||||
study_name="bracket_stiffness_optimization",
|
||||
storage="sqlite:///2_results/study.db"
|
||||
)
|
||||
|
||||
# Get Pareto-optimal solutions
|
||||
best_trials = study.best_trials
|
||||
|
||||
for trial in best_trials:
|
||||
stiffness_neg, mass = trial.values
|
||||
stiffness = -stiffness_neg
|
||||
print(f"Trial {trial.number}: Stiffness={stiffness:.2f} N/mm, Mass={mass:.6f} kg")
|
||||
print(f" Params: {trial.params}")
|
||||
```
|
||||
|
||||
### Export Results
|
||||
|
||||
```python
|
||||
# Export to CSV
|
||||
import pandas as pd
|
||||
|
||||
df = study.trials_dataframe()
|
||||
df.to_csv('2_results/trials.csv', index=False)
|
||||
|
||||
# Export to JSON
|
||||
import json
|
||||
with open('2_results/trials.json', 'w') as f:
|
||||
json.dump([t.params | {'values': t.values} for t in study.trials], f, indent=2)
|
||||
```
|
||||
|
||||
## Optimization Settings
|
||||
|
||||
- **Framework**: Protocol 10 - Intelligent Multi-Strategy Optimization (IMSO)
|
||||
- **Adaptive Features**:
|
||||
- Landscape characterization (analyzes problem structure)
|
||||
- Strategy selection (picks best algorithm automatically)
|
||||
- Dynamic switching (changes strategy when stagnating)
|
||||
- Adaptive surrogate modeling
|
||||
- **Strategies Available**: TPE, CMA-ES, QMC, Random, NSGA-II
|
||||
- **Default trials**: 50
|
||||
- **Parallelization**: 1 job (sequential)
|
||||
|
||||
### How Protocol 10 Works:
|
||||
|
||||
1. **Characterization Phase** (first 10 trials)
|
||||
- Random sampling to explore landscape
|
||||
- Analyzes: smoothness, multimodality, noise, dimensionality
|
||||
|
||||
2. **Strategy Selection**
|
||||
- Automatically picks best optimizer based on landscape
|
||||
- Example: Smooth → CMA-ES, Multimodal → TPE
|
||||
|
||||
3. **Adaptive Optimization**
|
||||
- Monitors progress every 10 trials
|
||||
- Switches strategies if stagnating
|
||||
- All history kept for surrogate modeling
|
||||
|
||||
## Expected Performance
|
||||
|
||||
- **Trial duration**: ~2-5 minutes (depends on mesh size)
|
||||
- **50 trials**: ~2-4 hours
|
||||
- **Infeasibility rate**: ~20-30% (trials violating mass constraint, but kept for surrogate)
|
||||
|
||||
## Constraints
|
||||
|
||||
1. **Mass Constraint**: mass ≤ 0.2 kg
|
||||
- Trials exceeding this are **NOT pruned** - they complete normally
|
||||
- Kept in history for surrogate modeling (valuable search information)
|
||||
- Marked as infeasible in database with `constraint_satisfied=False` attribute
|
||||
- **Not eligible for Pareto front** - only feasible solutions reported as optimal
|
||||
- This approach preserves knowledge while enforcing hard constraints
|
||||
|
||||
## Notes
|
||||
|
||||
- Simulation uses NX Nastran SOL 101 (linear static)
|
||||
- Force units: Newtons (N)
|
||||
- Displacement units: millimeters (mm)
|
||||
- Mass units: kilograms (kg), converted from ton-mm-sec system
|
||||
- Stiffness units: N/mm
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### NX Session Issues
|
||||
If NX hangs or crashes:
|
||||
```bash
|
||||
# Kill all NX processes
|
||||
taskkill /F /IM NXBIN.exe
|
||||
```
|
||||
|
||||
### Extractor Failures
|
||||
Check that:
|
||||
- ResultProbe is defined in simulation for z-displacement
|
||||
- OP2 file is generated (check solver settings)
|
||||
- Field export journal has correct path
|
||||
|
||||
### Database Locked
|
||||
If database is locked:
|
||||
```bash
|
||||
# Close all connections and restart
|
||||
rm 2_results/study.db-journal
|
||||
```
|
||||
|
||||
## References
|
||||
|
||||
- Generic extractors: `optimization_engine/extractors/`
|
||||
- NX solver: `optimization_engine/nx_solver.py`
|
||||
- pyNastran docs: https://pynastran-git.readthedocs.io/
|
||||
Reference in New Issue
Block a user