- 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>
7.8 KiB
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:
- Identify available parametric expressions (potential design variables)
- Understand the simulation setup (analysis types, boundary conditions)
- Discover material properties
- 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:
-
Model Location:
- "Where is your NX model? (path to .prt file)"
- Default: Look in
studies/*/1_setup/model/
-
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:
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:
# 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):
- Read the .prt file header for expression metadata
- Look for common parameter naming patterns
- 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:
-
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
-
Load Cases: Identify applied loads and boundary conditions
-
Material Properties: Extract material definitions
Step 5: Generate Recommendations
Based on analysis, recommend:
- Design Variables: Which expressions are good candidates
- Objectives: What can be optimized
- Constraints: What should be bounded
- 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