Files
Atomizer/.claude/skills/analyze-model.md
Anto01 e3bdb08a22 feat: Major update with validators, skills, dashboard, and docs reorganization
- 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>
2025-11-25 19:23:58 -05:00

7.8 KiB
Raw Blame History

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:

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):

  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