feat: Add LLM-native development roadmap and reorganize documentation
- Add DEVELOPMENT_ROADMAP.md with 7-phase plan for LLM-driven optimization - Phase 1: Plugin system with lifecycle hooks - Phase 2: Natural language configuration interface - Phase 3: Dynamic code generation for custom objectives - Phase 4: Intelligent analysis and decision support - Phase 5: Automated HTML/PDF reporting - Phase 6: NX MCP server integration - Phase 7: Self-improving feature registry - Update README.md to reflect LLM-native philosophy - Emphasize natural language workflows - Link to development roadmap - Update architecture diagrams - Add future capability examples - Reorganize documentation structure - Move old dev docs to docs/archive/ - Clean up root directory - Preserve all working optimization engine code This sets the foundation for transforming Atomizer into an AI-powered engineering assistant that can autonomously configure optimizations, generate custom analysis code, and provide intelligent recommendations.
This commit is contained in:
294
docs/archive/NX_SOLVER_INTEGRATION.md
Normal file
294
docs/archive/NX_SOLVER_INTEGRATION.md
Normal file
@@ -0,0 +1,294 @@
|
||||
# NX Solver Integration Guide
|
||||
|
||||
## Overview
|
||||
|
||||
The NX solver integration allows Atomizer to automatically run Siemens NX Nastran simulations in batch mode during optimization loops.
|
||||
|
||||
## Architecture
|
||||
|
||||
```
|
||||
Optimization Loop:
|
||||
1. Update parameters in .prt file → nx_updater.py
|
||||
2. Run NX solver in batch mode → nx_solver.py ← NEW!
|
||||
3. Extract results from OP2 → op2_extractor_example.py
|
||||
4. Evaluate objectives/constraints → runner.py
|
||||
5. Optuna suggests next parameters → repeat
|
||||
```
|
||||
|
||||
## Quick Start
|
||||
|
||||
### Test 1: Verify Solver Integration
|
||||
|
||||
```bash
|
||||
conda activate test_env
|
||||
python examples/test_nx_solver.py
|
||||
```
|
||||
|
||||
This tests:
|
||||
- NX installation detection
|
||||
- Batch solver execution
|
||||
- OP2 file generation
|
||||
- Error handling
|
||||
|
||||
**Expected**: Solver runs and produces .op2 file in ~1-2 minutes
|
||||
|
||||
### Test 2: Run Optimization with Real Solver
|
||||
|
||||
```bash
|
||||
conda activate test_env
|
||||
python examples/test_optimization_with_solver.py
|
||||
```
|
||||
|
||||
This runs 3 optimization trials with REAL simulations!
|
||||
|
||||
**Expected time**: ~5-10 minutes (depends on model complexity)
|
||||
|
||||
## Usage in Your Code
|
||||
|
||||
### Simple Usage (Convenience Function)
|
||||
|
||||
```python
|
||||
from optimization_engine.nx_solver import run_nx_simulation
|
||||
from pathlib import Path
|
||||
|
||||
sim_file = Path("path/to/model.sim")
|
||||
op2_file = run_nx_simulation(
|
||||
sim_file=sim_file,
|
||||
nastran_version="2412",
|
||||
timeout=600, # 10 minutes
|
||||
cleanup=True # Remove temp files
|
||||
)
|
||||
|
||||
# op2_file now contains path to results
|
||||
```
|
||||
|
||||
### Advanced Usage (Full Control)
|
||||
|
||||
```python
|
||||
from optimization_engine.nx_solver import NXSolver
|
||||
|
||||
solver = NXSolver(
|
||||
nastran_version="2412",
|
||||
timeout=600
|
||||
)
|
||||
|
||||
result = solver.run_simulation(
|
||||
sim_file=sim_file,
|
||||
working_dir=None, # Defaults to sim file directory
|
||||
cleanup=True
|
||||
)
|
||||
|
||||
if result['success']:
|
||||
print(f"OP2: {result['op2_file']}")
|
||||
print(f"Time: {result['elapsed_time']:.1f}s")
|
||||
else:
|
||||
print(f"Errors: {result['errors']}")
|
||||
```
|
||||
|
||||
### Integration with Optimization Runner
|
||||
|
||||
```python
|
||||
from optimization_engine.nx_solver import run_nx_simulation
|
||||
|
||||
def my_simulation_runner() -> Path:
|
||||
"""Simulation runner for optimization."""
|
||||
sim_file = Path("my_model.sim")
|
||||
|
||||
# Run solver
|
||||
op2_file = run_nx_simulation(
|
||||
sim_file=sim_file,
|
||||
nastran_version="2412",
|
||||
timeout=600,
|
||||
cleanup=True
|
||||
)
|
||||
|
||||
return op2_file
|
||||
|
||||
# Use in OptimizationRunner
|
||||
runner = OptimizationRunner(
|
||||
config_path=config_path,
|
||||
model_updater=my_model_updater,
|
||||
simulation_runner=my_simulation_runner, # Uses real solver!
|
||||
result_extractors=extractors
|
||||
)
|
||||
```
|
||||
|
||||
## Configuration
|
||||
|
||||
### Auto-Detection
|
||||
|
||||
By default, NXSolver auto-detects NX installation:
|
||||
|
||||
```python
|
||||
solver = NXSolver(nastran_version="2412")
|
||||
# Searches:
|
||||
# - C:/Program Files/Siemens/NX2412
|
||||
# - C:/Program Files/Siemens/Simcenter3D_2412
|
||||
# - C:/Program Files (x86)/Siemens/NX2412
|
||||
```
|
||||
|
||||
### Manual Configuration
|
||||
|
||||
```python
|
||||
from pathlib import Path
|
||||
|
||||
solver = NXSolver(
|
||||
nx_install_dir=Path("C:/Program Files/Siemens/NX2412"),
|
||||
nastran_version="2412",
|
||||
timeout=1200 # 20 minutes
|
||||
)
|
||||
```
|
||||
|
||||
## Solver Output Files
|
||||
|
||||
### Files Created
|
||||
- `model.op2` - Binary results (kept)
|
||||
- `model.f06` - Text output (kept)
|
||||
- `model.log` - Solver log (kept)
|
||||
- `model.f04` - Intermediate (cleaned up)
|
||||
- `model.dat` - Intermediate (cleaned up)
|
||||
- `model.diag` - Diagnostic (cleaned up)
|
||||
|
||||
### Cleanup Behavior
|
||||
|
||||
With `cleanup=True` (recommended):
|
||||
- Keeps: .op2, .f06, .log
|
||||
- Removes: .f04, .dat, .diag, .master, .dball, plots
|
||||
|
||||
With `cleanup=False`:
|
||||
- Keeps all files for debugging
|
||||
|
||||
## Error Handling
|
||||
|
||||
### Common Issues
|
||||
|
||||
**Issue**: `FileNotFoundError: NX Nastran solver not found`
|
||||
|
||||
**Solution**:
|
||||
- Check NX is installed at standard location
|
||||
- Specify `nx_install_dir` manually
|
||||
- Verify nastran.exe exists in NXNASTRAN/bin/
|
||||
|
||||
**Issue**: `RuntimeError: NX simulation failed`
|
||||
|
||||
**Solution**:
|
||||
- Check .f06 file for error messages
|
||||
- Verify .sim file is valid
|
||||
- Check NX license is available
|
||||
- Ensure model can solve in NX GUI first
|
||||
|
||||
**Issue**: `TimeoutExpired`
|
||||
|
||||
**Solution**:
|
||||
- Increase `timeout` parameter
|
||||
- Simplify model (fewer elements, linear analysis)
|
||||
- Check solver isn't stuck (memory issues)
|
||||
|
||||
### Checking Solver Success
|
||||
|
||||
The solver checks for completion by:
|
||||
1. Looking for "NORMAL TERMINATION" in .f06
|
||||
2. Checking for "FATAL MESSAGE" errors
|
||||
3. Verifying .op2 file was created recently
|
||||
|
||||
## Performance Tips
|
||||
|
||||
### Speed Up Optimization
|
||||
|
||||
1. **Reduce Model Complexity**
|
||||
- Use coarser mesh for initial exploration
|
||||
- Simplify geometry in non-critical areas
|
||||
- Use linear analysis if possible
|
||||
|
||||
2. **Parallel Trials (Future)**
|
||||
- Run multiple trials simultaneously
|
||||
- Requires separate working directories
|
||||
- Use Optuna's parallelization features
|
||||
|
||||
3. **Smart Sampling**
|
||||
- Use TPE sampler (default) for efficiency
|
||||
- Increase `n_startup_trials` for better initial sampling
|
||||
- Use constraints to avoid infeasible regions
|
||||
|
||||
4. **Cleanup Strategy**
|
||||
- Use `cleanup=True` to save disk space
|
||||
- Only keep .op2 and .log files
|
||||
- Archive results after optimization
|
||||
|
||||
### Typical Solve Times
|
||||
|
||||
| Model Size | Analysis Type | Time per Trial |
|
||||
|------------|---------------|----------------|
|
||||
| Small (<10k nodes) | Linear Static | 30-60s |
|
||||
| Medium (10-50k) | Linear Static | 1-3 min |
|
||||
| Large (>50k) | Linear Static | 3-10 min |
|
||||
| Any | Nonlinear | 5-30 min |
|
||||
|
||||
## Batch Processing
|
||||
|
||||
For running many optimizations:
|
||||
|
||||
```python
|
||||
# Save solver instance to reuse
|
||||
solver = NXSolver(nastran_version="2412", timeout=600)
|
||||
|
||||
for trial_params in parameter_sets:
|
||||
# Update model
|
||||
update_nx_model(prt_file, trial_params)
|
||||
|
||||
# Solve
|
||||
result = solver.run_simulation(sim_file, cleanup=True)
|
||||
|
||||
if result['success']:
|
||||
# Extract and analyze
|
||||
results = extract_all_results(result['op2_file'])
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Enable Debug Output
|
||||
|
||||
```python
|
||||
solver = NXSolver(nastran_version="2412")
|
||||
|
||||
result = solver.run_simulation(
|
||||
sim_file=sim_file,
|
||||
cleanup=False # Keep all files
|
||||
)
|
||||
|
||||
# Check detailed output
|
||||
print(result['errors'])
|
||||
|
||||
# Manually inspect files
|
||||
# - Check .f06 for solver messages
|
||||
# - Check .log for execution details
|
||||
# - Check .f04 for input deck
|
||||
```
|
||||
|
||||
### Verify NX Installation
|
||||
|
||||
```python
|
||||
from optimization_engine.nx_solver import NXSolver
|
||||
|
||||
solver = NXSolver(nastran_version="2412")
|
||||
print(f"NX Dir: {solver.nx_install_dir}")
|
||||
print(f"Solver: {solver.solver_exe}")
|
||||
print(f"Exists: {solver.solver_exe.exists()}")
|
||||
```
|
||||
|
||||
## Next Steps
|
||||
|
||||
1. **Test solver integration**: Run `test_nx_solver.py`
|
||||
2. **Test optimization loop**: Run `test_optimization_with_solver.py`
|
||||
3. **Customize for your model**: Modify simulation_runner function
|
||||
4. **Run real optimization**: Increase n_trials to 50-150
|
||||
5. **Analyze results**: Use history.csv to understand parameter sensitivity
|
||||
|
||||
## Support
|
||||
|
||||
For issues:
|
||||
1. Check this guide
|
||||
2. Verify NX installation
|
||||
3. Test .sim file in NX GUI first
|
||||
4. Check solver logs (.f06, .log files)
|
||||
5. Review error messages in result['errors']
|
||||
Reference in New Issue
Block a user