- Add validation framework (config, model, results, study validators) - Add Claude Code skills (create-study, run-optimization, generate-report, troubleshoot, analyze-model) - Add Atomizer Dashboard (React frontend + FastAPI backend) - Reorganize docs into structured directories (00-09) - Add neural surrogate modules and training infrastructure - Add multi-objective optimization support 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
270 lines
7.8 KiB
Markdown
270 lines
7.8 KiB
Markdown
# Analyze Model Skill
|
||
|
||
**Last Updated**: November 25, 2025
|
||
**Version**: 1.0 - Model Analysis and Feature Extraction
|
||
|
||
You are helping the user understand their NX model's structure and identify optimization opportunities.
|
||
|
||
## Purpose
|
||
|
||
Extract and present information about an NX model to help the user:
|
||
1. Identify available parametric expressions (potential design variables)
|
||
2. Understand the simulation setup (analysis types, boundary conditions)
|
||
3. Discover material properties
|
||
4. Recommend optimization strategies based on model characteristics
|
||
|
||
## Triggers
|
||
|
||
- "analyze this model"
|
||
- "what can I optimize"
|
||
- "show me the expressions"
|
||
- "look at my NX model"
|
||
- "what parameters are available"
|
||
|
||
## Prerequisites
|
||
|
||
- User must provide path to NX model files (.prt, .sim, .fem)
|
||
- NX must be available on the system (configured in config.py)
|
||
- Model files must be valid NX format
|
||
|
||
## Information Gathering
|
||
|
||
Ask these questions if not already provided:
|
||
|
||
1. **Model Location**:
|
||
- "Where is your NX model? (path to .prt file)"
|
||
- Default: Look in `studies/*/1_setup/model/`
|
||
|
||
2. **Analysis Interest**:
|
||
- "What type of optimization are you considering?" (optional)
|
||
- This helps focus the analysis on relevant aspects
|
||
|
||
## Execution Steps
|
||
|
||
### Step 1: Validate Model Files
|
||
|
||
Check that required files exist:
|
||
|
||
```python
|
||
from pathlib import Path
|
||
|
||
def validate_model_files(model_path: Path) -> dict:
|
||
"""Validate NX model files exist."""
|
||
prt_file = model_path
|
||
base_name = prt_file.stem
|
||
parent_dir = prt_file.parent
|
||
|
||
result = {
|
||
'prt_exists': prt_file.exists(),
|
||
'sim_file': None,
|
||
'fem_file': None,
|
||
'errors': []
|
||
}
|
||
|
||
# Look for simulation file
|
||
sim_patterns = [
|
||
f"{base_name}_sim1.sim",
|
||
f"{base_name}_sim.sim",
|
||
f"{base_name}.sim"
|
||
]
|
||
for pattern in sim_patterns:
|
||
sim_path = parent_dir / pattern
|
||
if sim_path.exists():
|
||
result['sim_file'] = sim_path
|
||
break
|
||
|
||
# Look for FEM file
|
||
fem_patterns = [
|
||
f"{base_name}_fem1.fem",
|
||
f"{base_name}_fem.fem",
|
||
f"{base_name}.fem"
|
||
]
|
||
for pattern in fem_patterns:
|
||
fem_path = parent_dir / pattern
|
||
if fem_path.exists():
|
||
result['fem_file'] = fem_path
|
||
break
|
||
|
||
if not result['prt_exists']:
|
||
result['errors'].append(f"Part file not found: {prt_file}")
|
||
if not result['sim_file']:
|
||
result['errors'].append("No simulation file (.sim) found")
|
||
if not result['fem_file']:
|
||
result['errors'].append("No FEM file (.fem) found - will be created on first solve")
|
||
|
||
return result
|
||
```
|
||
|
||
### Step 2: Extract Expressions
|
||
|
||
Use NX Python API to extract all parametric expressions:
|
||
|
||
```python
|
||
# This requires running a journal inside NX
|
||
# Use the expression extractor from optimization_engine
|
||
|
||
from optimization_engine.extractors.expression_extractor import extract_all_expressions
|
||
|
||
expressions = extract_all_expressions(prt_file)
|
||
# Returns: [{'name': 'thickness', 'value': 2.0, 'unit': 'mm', 'formula': None}, ...]
|
||
```
|
||
|
||
**Manual Extraction Method** (if NX API not available):
|
||
1. Read the .prt file header for expression metadata
|
||
2. Look for common parameter naming patterns
|
||
3. Ask user to provide expression names from NX
|
||
|
||
### Step 3: Classify Expressions
|
||
|
||
Categorize expressions by likely purpose:
|
||
|
||
| Pattern | Category | Optimization Relevance |
|
||
|---------|----------|----------------------|
|
||
| `*_thickness`, `*_t`, `wall_*` | Structural | High - affects mass & stiffness |
|
||
| `*_diameter`, `*_d`, `hole_*` | Geometric | High - affects mass & stress |
|
||
| `*_radius`, `*_r`, `fillet_*` | Geometric | Medium - affects stress concentration |
|
||
| `*_count`, `n_*`, `num_*` | Discrete | Medium - affects mass & complexity |
|
||
| `*_length`, `*_l`, `span_*` | Dimensional | Context-dependent |
|
||
| `*_angle`, `*_deg` | Orientation | Low-Medium |
|
||
| `material_*`, `mat_*` | Material | Special handling required |
|
||
|
||
### Step 4: Analyze Simulation Setup
|
||
|
||
If .sim file exists, analyze:
|
||
|
||
1. **Solution Types**:
|
||
- SOL 101 (Static) → Displacement, Stress
|
||
- SOL 103 (Modal) → Natural Frequencies
|
||
- SOL 105 (Buckling) → Buckling Load Factor
|
||
- SOL 106 (Nonlinear Static) → Large deformation
|
||
- SOL 112 (Transient) → Dynamic response
|
||
|
||
2. **Load Cases**: Identify applied loads and boundary conditions
|
||
|
||
3. **Material Properties**: Extract material definitions
|
||
|
||
### Step 5: Generate Recommendations
|
||
|
||
Based on analysis, recommend:
|
||
|
||
1. **Design Variables**: Which expressions are good candidates
|
||
2. **Objectives**: What can be optimized
|
||
3. **Constraints**: What should be bounded
|
||
4. **Protocol**: Which optimization protocol fits best
|
||
|
||
## Output Format
|
||
|
||
Present analysis in structured format:
|
||
|
||
```
|
||
MODEL ANALYSIS REPORT
|
||
=====================
|
||
|
||
Model: {model_name}
|
||
Location: {model_path}
|
||
|
||
FILES FOUND
|
||
-----------
|
||
✓ Part file: {prt_file}
|
||
✓ Simulation: {sim_file}
|
||
✓ FEM mesh: {fem_file}
|
||
|
||
PARAMETRIC EXPRESSIONS
|
||
----------------------
|
||
| Name | Current Value | Unit | Category | Optimization Candidate |
|
||
|------|---------------|------|----------|----------------------|
|
||
| thickness | 2.0 | mm | Structural | ✓ High |
|
||
| hole_diameter | 10.0 | mm | Geometric | ✓ High |
|
||
| fillet_radius | 3.0 | mm | Geometric | ✓ Medium |
|
||
| length | 100.0 | mm | Dimensional | ? Check constraints |
|
||
|
||
SIMULATION SETUP
|
||
----------------
|
||
Analysis Types: Static (SOL 101), Modal (SOL 103)
|
||
Material: Aluminum 6061-T6 (E=68.9 GPa, ρ=2700 kg/m³)
|
||
Loads:
|
||
- Force: 500 N at tip
|
||
- Constraint: Fixed at root
|
||
|
||
RECOMMENDATIONS
|
||
---------------
|
||
Suggested Objectives:
|
||
- Minimize mass (extract from p173 expression or FEM)
|
||
- Maximize first natural frequency
|
||
|
||
Suggested Constraints:
|
||
- Max von Mises stress < 276 MPa (Al 6061 yield)
|
||
- Max displacement < {user to specify}
|
||
|
||
Recommended Protocol: Protocol 11 (Multi-Objective NSGA-II)
|
||
- Reason: Multiple competing objectives (mass vs frequency)
|
||
|
||
Ready to create optimization study? Say "create study" to proceed.
|
||
```
|
||
|
||
## Error Handling
|
||
|
||
| Error | Recovery |
|
||
|-------|----------|
|
||
| File not found | Ask user for correct path |
|
||
| Invalid NX format | Suggest checking NX version compatibility |
|
||
| No expressions found | Guide user to create expressions in NX |
|
||
| Simulation incomplete | List missing components |
|
||
|
||
## Integration with Other Skills
|
||
|
||
After analysis, can chain to:
|
||
- `/create-study` - Create optimization based on findings
|
||
- `/configure-surrogate` - Setup NN if large-scale optimization needed
|
||
|
||
## Example Conversation
|
||
|
||
```
|
||
USER: Look at my NX model at studies/uav_arm_optimization/1_setup/model/Beam.prt
|
||
|
||
CLAUDE: I'll analyze your UAV arm model. Let me examine its structure...
|
||
|
||
[Runs analysis]
|
||
|
||
MODEL ANALYSIS REPORT
|
||
=====================
|
||
Model: Beam
|
||
Location: studies/uav_arm_optimization/1_setup/model/
|
||
|
||
PARAMETRIC EXPRESSIONS
|
||
----------------------
|
||
Found 4 controllable parameters:
|
||
| Name | Value | Bounds Suggestion |
|
||
|------|-------|------------------|
|
||
| beam_half_core_thickness | 15.0 mm | [5, 25] |
|
||
| beam_face_thickness | 2.0 mm | [1, 5] |
|
||
| holes_diameter | 30.0 mm | [10, 50] |
|
||
| hole_count | 8 | [4, 12] |
|
||
|
||
SIMULATION SETUP
|
||
----------------
|
||
✓ Static Analysis (SOL 101) - for stress/displacement
|
||
✓ Modal Analysis (SOL 103) - for natural frequencies
|
||
Material: Aluminum sandwich panel
|
||
|
||
RECOMMENDATION
|
||
--------------
|
||
This model is well-suited for multi-objective optimization:
|
||
- Objective 1: Minimize mass
|
||
- Objective 2: Maximize first natural frequency
|
||
- Constraint: Keep stress below yield strength
|
||
|
||
Would you like me to create an optimization study with these settings?
|
||
|
||
USER: Yes, but add a displacement constraint of 5mm max
|
||
|
||
CLAUDE: [Invokes create-study skill with analyzed parameters + user constraint]
|
||
```
|
||
|
||
## Notes
|
||
|
||
- Expression extraction requires NX to be running or using file parsing
|
||
- Some expressions may be formula-driven (not directly editable)
|
||
- Material properties may need separate handling
|
||
- Consider mesh quality when recommending optimization bounds
|