feat: Complete Phase 2.5-2.7 - Intelligent LLM-Powered Workflow Analysis

This commit implements three major architectural improvements to transform
Atomizer from static pattern matching to intelligent AI-powered analysis.

## Phase 2.5: Intelligent Codebase-Aware Gap Detection 

Created intelligent system that understands existing capabilities before
requesting examples:

**New Files:**
- optimization_engine/codebase_analyzer.py (379 lines)
  Scans Atomizer codebase for existing FEA/CAE capabilities

- optimization_engine/workflow_decomposer.py (507 lines, v0.2.0)
  Breaks user requests into atomic workflow steps
  Complete rewrite with multi-objective, constraints, subcase targeting

- optimization_engine/capability_matcher.py (312 lines)
  Matches workflow steps to existing code implementations

- optimization_engine/targeted_research_planner.py (259 lines)
  Creates focused research plans for only missing capabilities

**Results:**
- 80-90% coverage on complex optimization requests
- 87-93% confidence in capability matching
- Fixed expression reading misclassification (geometry vs result_extraction)

## Phase 2.6: Intelligent Step Classification 

Distinguishes engineering features from simple math operations:

**New Files:**
- optimization_engine/step_classifier.py (335 lines)

**Classification Types:**
1. Engineering Features - Complex FEA/CAE needing research
2. Inline Calculations - Simple math to auto-generate
3. Post-Processing Hooks - Middleware between FEA steps

## Phase 2.7: LLM-Powered Workflow Intelligence 

Replaces static regex patterns with Claude AI analysis:

**New Files:**
- optimization_engine/llm_workflow_analyzer.py (395 lines)
  Uses Claude API for intelligent request analysis
  Supports both Claude Code (dev) and API (production) modes

- .claude/skills/analyze-workflow.md
  Skill template for LLM workflow analysis integration

**Key Breakthrough:**
- Detects ALL intermediate steps (avg, min, normalization, etc.)
- Understands engineering context (CBUSH vs CBAR, directions, metrics)
- Distinguishes OP2 extraction from part expression reading
- Expected 95%+ accuracy with full nuance detection

## Test Coverage

**New Test Files:**
- tests/test_phase_2_5_intelligent_gap_detection.py (335 lines)
- tests/test_complex_multiobj_request.py (130 lines)
- tests/test_cbush_optimization.py (130 lines)
- tests/test_cbar_genetic_algorithm.py (150 lines)
- tests/test_step_classifier.py (140 lines)
- tests/test_llm_complex_request.py (387 lines)

All tests include:
- UTF-8 encoding for Windows console
- atomizer environment (not test_env)
- Comprehensive validation checks

## Documentation

**New Documentation:**
- docs/PHASE_2_5_INTELLIGENT_GAP_DETECTION.md (254 lines)
- docs/PHASE_2_7_LLM_INTEGRATION.md (227 lines)
- docs/SESSION_SUMMARY_PHASE_2_5_TO_2_7.md (252 lines)

**Updated:**
- README.md - Added Phase 2.5-2.7 completion status
- DEVELOPMENT_ROADMAP.md - Updated phase progress

## Critical Fixes

1. **Expression Reading Misclassification** (lines cited in session summary)
   - Updated codebase_analyzer.py pattern detection
   - Fixed workflow_decomposer.py domain classification
   - Added capability_matcher.py read_expression mapping

2. **Environment Standardization**
   - All code now uses 'atomizer' conda environment
   - Removed test_env references throughout

3. **Multi-Objective Support**
   - WorkflowDecomposer v0.2.0 handles multiple objectives
   - Constraint extraction and validation
   - Subcase and direction targeting

## Architecture Evolution

**Before (Static & Dumb):**
User Request → Regex Patterns → Hardcoded Rules → Missed Steps 

**After (LLM-Powered & Intelligent):**
User Request → Claude AI Analysis → Structured JSON →
├─ Engineering (research needed)
├─ Inline (auto-generate Python)
├─ Hooks (middleware scripts)
└─ Optimization (config) 

## LLM Integration Strategy

**Development Mode (Current):**
- Use Claude Code directly for interactive analysis
- No API consumption or costs
- Perfect for iterative development

**Production Mode (Future):**
- Optional Anthropic API integration
- Falls back to heuristics if no API key
- For standalone batch processing

## Next Steps

- Phase 2.8: Inline Code Generation
- Phase 2.9: Post-Processing Hook Generation
- Phase 3: MCP Integration for automated documentation research

🚀 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-16 13:35:41 -05:00
parent 986285d9cf
commit 0a7cca9c6a
94 changed files with 12761 additions and 10670 deletions

View File

@@ -0,0 +1,299 @@
# Interactive Research Agent Session
## Overview
The Interactive Research Agent allows you to interact with the AI-powered Research Agent through a conversational CLI interface. The agent can learn from examples you provide and automatically generate code for new optimization features.
## Quick Start
### Run the Interactive Session
```bash
python examples/interactive_research_session.py
```
### Try the Demo
When the session starts, type `demo` to see an automated demonstration:
```
💬 Your request: demo
```
The demo will show:
1. **Learning from Example**: Agent learns XML material structure from a steel example
2. **Code Generation**: Automatically generates Python code (81 lines)
3. **Knowledge Reuse**: Second request reuses learned knowledge (no example needed!)
## How to Use
### Making Requests
Simply type your request in natural language:
```
💬 Your request: Create an NX material XML generator for aluminum
```
The agent will:
1. **Analyze** what it knows and what's missing
2. **Ask for examples** if it needs to learn something new
3. **Search** its knowledge base for existing patterns
4. **Generate code** from learned templates
5. **Save** the generated feature to a file
### Providing Examples
When the agent asks for an example, you have 3 options:
1. **Provide a file path:**
```
Your choice: examples/my_example.xml
```
2. **Paste content directly:**
```
Your choice: <?xml version="1.0"?>
<MyExample>...</MyExample>
```
3. **Skip (if you don't have an example):**
```
Your choice: skip
```
### Understanding the Output
The agent provides visual feedback at each step:
- 🔍 **Knowledge Gap Analysis**: Shows what's missing and confidence level
- 📋 **Research Plan**: Steps the agent will take to gather knowledge
- 🧠 **Knowledge Synthesized**: What the agent learned (schemas, patterns)
- 💻 **Code Generation**: Preview of generated Python code
- 💾 **Files Created**: Where the generated code was saved
### Confidence Levels
- **< 50%**: New domain - Learning required (will ask for examples)
- **50-80%**: Partial knowledge - Some research needed
- **> 80%**: Known domain - Can reuse existing knowledge
## Example Session
```
================================================================================
🤖 Interactive Research Agent Session
================================================================================
Welcome! I'm your Research Agent. I can learn from examples and
generate code for optimization features.
Commands:
• Type your request in natural language
• Type 'demo' for a demonstration
• Type 'quit' to exit
💬 Your request: Create NX material XML for titanium Ti-6Al-4V
--------------------------------------------------------------------------------
[Step 1] Analyzing Knowledge Gap
--------------------------------------------------------------------------------
🔍 Knowledge Gap Analysis:
Missing Features (1):
• new_feature_required
Missing Knowledge (1):
• material
Confidence Level: 80%
📊 Status: Known domain - Can reuse existing knowledge
--------------------------------------------------------------------------------
[Step 2] Executing Research Plan
--------------------------------------------------------------------------------
📋 Research Plan Created:
I'll gather knowledge in 2 steps:
1. 📚 Search Knowledge Base
Expected confidence: 80%
Search query: "material XML NX"
2. 👤 Ask User For Example
Expected confidence: 95%
What I'll ask: "Could you provide an example of an NX material XML file?"
⚡ Executing Step 1/2: Search Knowledge Base
----------------------------------------------------------------------------
🔍 Searching knowledge base for: "material XML NX"
✓ Found existing knowledge! Session: 2025-11-16_nx_materials_demo
Confidence: 95%, Relevance: 85%
⚡ Executing Step 2/2: Ask User For Example
----------------------------------------------------------------------------
⊘ Skipping - Already have high confidence from knowledge base
--------------------------------------------------------------------------------
[Step 3] Synthesizing Knowledge
--------------------------------------------------------------------------------
🧠 Knowledge Synthesized:
Overall Confidence: 95%
📄 Learned XML Structure:
Root element: <PhysicalMaterial>
Attributes: {'name': 'Steel_AISI_1020', 'version': '1.0'}
Required fields (5):
• Density
• YoungModulus
• PoissonRatio
• ThermalExpansion
• YieldStrength
--------------------------------------------------------------------------------
[Step 4] Generating Feature Code
--------------------------------------------------------------------------------
🔨 Designing feature: create_nx_material_xml_for_t
Category: engineering
Lifecycle stage: all
Input parameters: 5
💻 Generating Python code...
Generated 2327 characters (81 lines)
✓ Code is syntactically valid Python
💾 Saved to: optimization_engine/custom_functions/create_nx_material_xml_for_t.py
================================================================================
✓ Request Completed Successfully!
================================================================================
Generated file: optimization_engine/custom_functions/create_nx_material_xml_for_t.py
Knowledge confidence: 95%
Session saved: 2025-11-16_create_nx_material_xml_for_t
💬 Your request: quit
👋 Goodbye! Session ended.
```
## Key Features
### 1. Knowledge Accumulation
- Agent remembers what it learns across sessions
- Second similar request doesn't require re-learning
- Knowledge base grows over time
### 2. Intelligent Research Planning
- Prioritizes reliable sources (user examples > MCP > web)
- Creates step-by-step research plan
- Explains what it will do before doing it
### 3. Pattern Recognition
- Extracts XML schemas from examples
- Identifies Python code patterns (functions, classes, imports)
- Learns relationships between inputs and outputs
### 4. Code Generation
- Generates complete Python modules with:
- Docstrings and documentation
- Type hints for all parameters
- Example usage code
- Error handling
- Code is syntactically validated before saving
### 5. Session Documentation
- Every research session is automatically documented
- Includes: user question, sources, findings, decisions
- Searchable for future knowledge retrieval
## Advanced Usage
### Auto Mode (for Testing)
For automated testing, you can run the session in auto-mode:
```python
from examples.interactive_research_session import InteractiveResearchSession
session = InteractiveResearchSession(auto_mode=True)
session.run_demo() # Runs without user input prompts
```
### Programmatic Usage
You can also use the Research Agent programmatically:
```python
from optimization_engine.research_agent import ResearchAgent
agent = ResearchAgent()
# Identify what's missing
gap = agent.identify_knowledge_gap("Create NX modal analysis")
# Search existing knowledge
existing = agent.search_knowledge_base("modal analysis")
# Create research plan
plan = agent.create_research_plan(gap)
# ... execute plan and synthesize knowledge
```
## Troubleshooting
### "No matching session found"
- This is normal for new domains the agent hasn't seen before
- The agent will ask for an example to learn from
### "Confidence too low to generate code"
- Provide more detailed examples
- Try providing multiple examples of the same pattern
- Check that your example files are well-formed
### "Generated code has syntax errors"
- This is rare and indicates a bug in code generation
- Please report this with the example that caused it
## What's Next
The interactive session currently includes:
- ✅ Knowledge gap detection
- ✅ Knowledge base search and retrieval
- ✅ Learning from user examples
- ✅ Python code generation
- ✅ Session documentation
**Coming in future phases:**
- 🔜 MCP server integration (query NX documentation)
- 🔜 Web search integration (search online resources)
- 🔜 Multi-turn conversations with context
- 🔜 Code refinement based on feedback
- 🔜 Feature validation and testing
## Testing
Run the automated test:
```bash
python tests/test_interactive_session.py
```
This will demonstrate the complete workflow including:
- Learning from an example (steel material XML)
- Generating working Python code
- Reusing knowledge for a second request
- All without user interaction
## Support
For issues or questions:
- Check the existing research sessions in `knowledge_base/research_sessions/`
- Review generated code in `optimization_engine/custom_functions/`
- See test examples in `tests/test_*.py`

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,248 +0,0 @@
# Auto-generated journal for solving Bracket_sim1.sim
import sys
sys.argv = ['', r'C:\Users\antoi\Documents\Atomaste\Atomizer\examples\bracket\Bracket_sim1.sim', 18.7454, 39.0143] # Set argv for the main function
"""
NX Journal Script to Solve Simulation in Batch Mode
This script opens a .sim file, updates the FEM, and solves it through the NX API.
Usage: run_journal.exe solve_simulation.py <sim_file_path>
Based on recorded NX journal pattern for solving simulations.
"""
import sys
import NXOpen
import NXOpen.Assemblies
import NXOpen.CAE
def main(args):
"""
Open and solve a simulation file with updated expression values.
Args:
args: Command line arguments
args[0]: .sim file path
args[1]: tip_thickness value (optional)
args[2]: support_angle value (optional)
"""
if len(args) < 1:
print("ERROR: No .sim file path provided")
print("Usage: run_journal.exe solve_simulation.py <sim_file_path> [tip_thickness] [support_angle]")
return False
sim_file_path = args[0]
# Parse expression values if provided
tip_thickness = float(args[1]) if len(args) > 1 else None
support_angle = float(args[2]) if len(args) > 2 else None
print(f"[JOURNAL] Opening simulation: {sim_file_path}")
if tip_thickness is not None:
print(f"[JOURNAL] Will update tip_thickness = {tip_thickness}")
if support_angle is not None:
print(f"[JOURNAL] Will update support_angle = {support_angle}")
try:
theSession = NXOpen.Session.GetSession()
# Close any currently open sim file to force reload from disk
print("[JOURNAL] Checking for open parts...")
try:
current_work = theSession.Parts.BaseWork
if current_work and hasattr(current_work, 'FullPath'):
current_path = current_work.FullPath
print(f"[JOURNAL] Closing currently open part: {current_path}")
# Close without saving (we want to reload from disk)
partCloseResponses1 = [NXOpen.BasePart.CloseWholeTree]
theSession.Parts.CloseAll(partCloseResponses1)
print("[JOURNAL] Parts closed")
except Exception as e:
print(f"[JOURNAL] No parts to close or error closing: {e}")
# Open the .sim file (now will load fresh from disk with updated .prt files)
print(f"[JOURNAL] Opening simulation fresh from disk...")
basePart1, partLoadStatus1 = theSession.Parts.OpenActiveDisplay(
sim_file_path,
NXOpen.DisplayPartOption.AllowAdditional
)
workSimPart = theSession.Parts.BaseWork
displaySimPart = theSession.Parts.BaseDisplay
partLoadStatus1.Dispose()
# Switch to simulation application
theSession.ApplicationSwitchImmediate("UG_APP_SFEM")
simPart1 = workSimPart
theSession.Post.UpdateUserGroupsFromSimPart(simPart1)
# STEP 1: Switch to Bracket.prt and update expressions, then update geometry
print("[JOURNAL] STEP 1: Updating Bracket.prt geometry...")
try:
# Find the Bracket part
bracketPart = theSession.Parts.FindObject("Bracket")
if bracketPart:
# Make Bracket the active display part
status, partLoadStatus = theSession.Parts.SetActiveDisplay(
bracketPart,
NXOpen.DisplayPartOption.AllowAdditional,
NXOpen.PartDisplayPartWorkPartOption.UseLast
)
partLoadStatus.Dispose()
workPart = theSession.Parts.Work
# CRITICAL: Apply expression changes BEFORE updating geometry
expressions_updated = []
if tip_thickness is not None:
print(f"[JOURNAL] Applying tip_thickness = {tip_thickness}")
expr_tip = workPart.Expressions.FindObject("tip_thickness")
if expr_tip:
unit_mm = workPart.UnitCollection.FindObject("MilliMeter")
workPart.Expressions.EditExpressionWithUnits(expr_tip, unit_mm, str(tip_thickness))
expressions_updated.append(expr_tip)
print(f"[JOURNAL] tip_thickness updated")
else:
print(f"[JOURNAL] WARNING: tip_thickness expression not found!")
if support_angle is not None:
print(f"[JOURNAL] Applying support_angle = {support_angle}")
expr_angle = workPart.Expressions.FindObject("support_angle")
if expr_angle:
unit_deg = workPart.UnitCollection.FindObject("Degrees")
workPart.Expressions.EditExpressionWithUnits(expr_angle, unit_deg, str(support_angle))
expressions_updated.append(expr_angle)
print(f"[JOURNAL] support_angle updated")
else:
print(f"[JOURNAL] WARNING: support_angle expression not found!")
# Make expressions up to date
if expressions_updated:
print(f"[JOURNAL] Making {len(expressions_updated)} expression(s) up to date...")
for expr in expressions_updated:
markId_expr = theSession.SetUndoMark(NXOpen.Session.MarkVisibility.Invisible, "Make Up to Date")
objects1 = [expr]
theSession.UpdateManager.MakeUpToDate(objects1, markId_expr)
theSession.DeleteUndoMark(markId_expr, None)
# CRITICAL: Update the geometry model - rebuilds features with new expressions
print(f"[JOURNAL] Rebuilding geometry with new expression values...")
markId_update = theSession.SetUndoMark(NXOpen.Session.MarkVisibility.Invisible, "NX update")
nErrs = theSession.UpdateManager.DoUpdate(markId_update)
theSession.DeleteUndoMark(markId_update, "NX update")
print(f"[JOURNAL] Bracket geometry updated ({nErrs} errors)")
else:
print("[JOURNAL] WARNING: Could not find Bracket part")
except Exception as e:
print(f"[JOURNAL] ERROR updating Bracket.prt: {e}")
import traceback
traceback.print_exc()
# STEP 2: Switch to Bracket_fem1 and update FE model
print("[JOURNAL] STEP 2: Opening Bracket_fem1.fem...")
try:
# Find the FEM part
femPart1 = theSession.Parts.FindObject("Bracket_fem1")
if femPart1:
# Make FEM the active display part
status, partLoadStatus = theSession.Parts.SetActiveDisplay(
femPart1,
NXOpen.DisplayPartOption.AllowAdditional,
NXOpen.PartDisplayPartWorkPartOption.SameAsDisplay
)
partLoadStatus.Dispose()
workFemPart = theSession.Parts.BaseWork
# CRITICAL: Update FE Model - regenerates FEM with new geometry from Bracket.prt
print("[JOURNAL] Updating FE Model...")
fEModel1 = workFemPart.FindObject("FEModel")
if fEModel1:
fEModel1.UpdateFemodel()
print("[JOURNAL] FE Model updated with new geometry!")
else:
print("[JOURNAL] WARNING: Could not find FEModel object")
else:
print("[JOURNAL] WARNING: Could not find Bracket_fem1 part")
except Exception as e:
print(f"[JOURNAL] ERROR updating FEM: {e}")
import traceback
traceback.print_exc()
# STEP 3: Switch back to sim part
print("[JOURNAL] STEP 3: Switching back to sim part...")
try:
status, partLoadStatus = theSession.Parts.SetActiveDisplay(
simPart1,
NXOpen.DisplayPartOption.AllowAdditional,
NXOpen.PartDisplayPartWorkPartOption.UseLast
)
partLoadStatus.Dispose()
workSimPart = theSession.Parts.BaseWork
print("[JOURNAL] Switched back to sim part")
except Exception as e:
print(f"[JOURNAL] WARNING: Error switching to sim part: {e}")
# Note: Old output files are deleted by nx_solver.py before calling this journal
# This ensures NX performs a fresh solve
# Solve the simulation
print("[JOURNAL] Starting solve...")
markId3 = theSession.SetUndoMark(NXOpen.Session.MarkVisibility.Visible, "Start")
theSession.SetUndoMarkName(markId3, "Solve Dialog")
markId5 = theSession.SetUndoMark(NXOpen.Session.MarkVisibility.Invisible, "Solve")
theCAESimSolveManager = NXOpen.CAE.SimSolveManager.GetSimSolveManager(theSession)
# Get the first solution from the simulation
simSimulation1 = workSimPart.FindObject("Simulation")
simSolution1 = simSimulation1.FindObject("Solution[Solution 1]")
psolutions1 = [simSolution1]
# Solve in background mode
numsolutionssolved1, numsolutionsfailed1, numsolutionsskipped1 = theCAESimSolveManager.SolveChainOfSolutions(
psolutions1,
NXOpen.CAE.SimSolution.SolveOption.Solve,
NXOpen.CAE.SimSolution.SetupCheckOption.CompleteDeepCheckAndOutputErrors,
NXOpen.CAE.SimSolution.SolveMode.Background
)
theSession.DeleteUndoMark(markId5, None)
theSession.SetUndoMarkName(markId3, "Solve")
print(f"[JOURNAL] Solve submitted!")
print(f"[JOURNAL] Solutions solved: {numsolutionssolved1}")
print(f"[JOURNAL] Solutions failed: {numsolutionsfailed1}")
print(f"[JOURNAL] Solutions skipped: {numsolutionsskipped1}")
# NOTE: In Background mode, these values may not be accurate since the solve
# runs asynchronously. The solve will continue after this journal finishes.
# We rely on the Save operation and file existence checks to verify success.
# Save the simulation to write all output files
print("[JOURNAL] Saving simulation to ensure output files are written...")
simPart2 = workSimPart
partSaveStatus1 = simPart2.Save(
NXOpen.BasePart.SaveComponents.TrueValue,
NXOpen.BasePart.CloseAfterSave.FalseValue
)
partSaveStatus1.Dispose()
print("[JOURNAL] Save complete!")
return True
except Exception as e:
print(f"[JOURNAL] ERROR: {e}")
import traceback
traceback.print_exc()
return False
if __name__ == '__main__':
success = main(sys.argv[1:])
sys.exit(0 if success else 1)

File diff suppressed because it is too large Load Diff

View File

@@ -1,70 +0,0 @@
*** 14:01:58 ***
Starting Nastran Exporter
*** 14:01:58 ***
Writing file
C:\Users\antoi\Documents\Atomaste\Atomizer\examples\bracket\bracket_sim1-solution_1.dat
*** 14:01:58 ***
Writing SIMCENTER NASTRAN 2412.0 compatible deck
*** 14:01:58 ***
Writing Nastran System section
*** 14:01:58 ***
Writing File Management section
*** 14:01:58 ***
Writing Executive Control section
*** 14:01:58 ***
Writing Case Control section
*** 14:01:58 ***
Writing Bulk Data section
*** 14:01:58 ***
Writing Nodes
*** 14:01:58 ***
Writing Elements
*** 14:01:58 ***
Writing Physical Properties
*** 14:01:58 ***
Writing Materials
*** 14:01:58 ***
Writing Degree-of-Freedom Sets
*** 14:01:58 ***
Writing Loads and Constraints
*** 14:01:58 ***
Writing Coordinate Systems
*** 14:01:58 ***
Validating Solution Setup
*** 14:01:58 ***
Summary of Bulk Data cards written
+----------+----------+
| NAME | NUMBER |
+----------+----------+
| CTETRA | 1079 |
| FORCE | 5 |
| GRID | 2133 |
| MAT1 | 1 |
| MATT1 | 1 |
| PARAM | 6 |
| PSOLID | 1 |
| SPC | 109 |
| TABLEM1 | 3 |
+----------+----------+
*** 14:01:58 ***
Nastran Deck Successfully Written

View File

@@ -1,506 +0,0 @@
1
MACHINE MODEL OPERATING SYSTEM Simcenter Nastran BUILD DATE RUN DATE
Intel64 Family 6 Mod Intel(R) Core(TM) i7 Windows 10 VERSION 2412.0074 NOV 8, 2024 NOV 15, 2025
=== S i m c e n t e r N a s t r a n E X E C U T I O N S U M M A R Y ===
Day_Time Elapsed I/O_Mb Del_Mb CPU_Sec Del_CPU Subroutine
14:01:58 0:00 0.0 0.0 0.0 0.0 SEMTRN BGN
14:01:58 0:00 0.0 0.0 0.0 0.0 SEMTRN END
14:01:58 0:00 0.0 0.0 0.0 0.0 DBINIT BGN
** CURRENT PROJECT ID = ' "BLANK" ' ** CURRENT VERSION ID = 1
S U M M A R Y O F F I L E A S S I G N M E N T F O R T H E P R I M A R Y D A T A B A S E ( DBSNO 1, SCN20.2 )
ASSIGNED PHYSICAL FILE NAME (/ORIGINAL) LOGICAL NAME DBSET STATUS BUFFSIZE CLUSTER SIZE TIME STAMP
--------------------------------------- ------------ ----- ------ -------- ------------ ------------
...ket_sim1-solution_1.T119580_58.MASTER MASTER MASTER NEW 32769 1 251115140158
...cket_sim1-solution_1.T119580_58.DBALL DBALL DBALL NEW 32769 1 251115140159
...ket_sim1-solution_1.T119580_58.OBJSCR OBJSCR OBJSCR NEW 8193 1 251115140160
**** MEM FILE **** * N/A * SCRATCH
...et_sim1-solution_1.T119580_58.SCRATCH SCRATCH SCRATCH NEW 32769 1 251115140161
...ket_sim1-solution_1.T119580_58.SCR300 SCR300 SCRATCH NEW 32769 1 251115140162
14:01:58 0:00 7.0 7.0 0.0 0.0 DBINIT END
14:01:58 0:00 7.0 0.0 0.0 0.0 XCSA BGN
S U M M A R Y O F F I L E A S S I G N M E N T F O R T H E D E L I V E R Y D A T A B A S E ( DBSNO 2, SCN20.2 )
ASSIGNED PHYSICAL FILE NAME (/ORIGINAL) LOGICAL NAME DBSET STATUS BUFFSIZE CLUSTER SIZE TIME STAMP
--------------------------------------- ------------ ----- ------ -------- ------------ ------------
c:/.../scnas/em64tntl/SSS.MASTERA MASTERA MASTER OLD 8193 1 241108141814
/./sss.MASTERA
c:/program files/.../em64tntl/SSS.MSCOBJ MSCOBJ MSCOBJ OLD 8193 1 241108141819
/./sss.MSCOBJ
c:/program files/.../em64tntl/SSS.MSCSOU MSCSOU MSCSOU OLD 8193 1 241108141820
/./sss.MSCSOU
14:01:58 0:00 550.0 543.0 0.1 0.1 XCSA END
14:01:58 0:00 550.0 0.0 0.1 0.0 CGPI BGN
14:01:58 0:00 550.0 0.0 0.1 0.0 CGPI END
14:01:58 0:00 550.0 0.0 0.1 0.0 LINKER BGN
14:01:58 0:00 1110.0 560.0 0.1 0.0 LINKER END
S U M M A R Y O F P H Y S I C A L F I L E I N F O R M A T I O N
ASSIGNED PHYSICAL FILE NAME RECL (BYTES) MODE FLAGS WSIZE (WNUM)
------------------------------------------------------------ ------------ ---- ----- -------------
c:/users/.../temp/bracket_sim1-solution_1.T119580_58.SCRATCH 262144 R/W N/A
c:/users/.../temp/bracket_sim1-solution_1.T119580_58.OBJSCR 65536 R/W N/A
c:/users/.../temp/bracket_sim1-solution_1.T119580_58.MASTER 262144 R/W N/A
c:/users/.../temp/bracket_sim1-solution_1.T119580_58.DBALL 262144 R/W N/A
c:/users/.../temp/bracket_sim1-solution_1.T119580_58.SCR300 262144 R/W N/A
c:/program files/siemens/.../scnas/em64tntl/SSS.MASTERA 65536 R/O N/A
c:/program files/siemens/.../scnas/em64tntl/SSS.MSCOBJ 65536 R/O N/A
FLAG VALUES ARE --
B BUFFERED I/O USED TO PROCESS FILE
M FILE MAPPING USED TO PROCESS FILE
R FILE BEING ACCESSED IN 'RAW' MODE
ASSIGNED PHYSICAL FILE NAME LOGICAL UNIT STATUS ACCESS RECL FORM FLAGS
------------------------------------------------------------ -------- ---- ------- ------ ----- ------ -----
./bracket_sim1-solution_1.f04 LOGFL 4 OLD SEQ N/A FMTD
./bracket_sim1-solution_1.f06 PRINT 6 OLD SEQ N/A FMTD
c:/program files/siemens/.../nxnastran/scnas/nast/news.txt INCLD1 9 OLD SEQ N/A FMTD R
./bracket_sim1-solution_1.plt PLOT 14 OLD SEQ N/A UNFMTD
./bracket_sim1-solution_1.op2 OP2 12 OLD SEQ N/A UNFMTD
./bracket_sim1-solution_1.nav OUTPUT4 18 UNKNOWN SEQ N/A FMTD
./bracket_sim1-solution_1.nmc INPUTT4 19 OLD SEQ N/A FMTD R
./bracket_sim1-solution_1.f56 F56 56 UNKNOWN SEQ N/A FMTD
c:/users/.../temp/bracket_sim1-solution_1.T119580_58.sf1 SF1 93 OLD SEQ N/A UNFMTD T
c:/users/.../temp/bracket_sim1-solution_1.T119580_58.sf2 SF2 94 OLD SEQ N/A UNFMTD TR
./bracket_sim1-solution_1.s200tmp S200 112 UNKNOWN SEQ N/A UNFMTD T
./bracket_sim1-solution_1_sol200.csv CSV 113 UNKNOWN SEQ N/A FMTD
./bracket_sim1-solution_1.pch PUNCH 7 OLD SEQ N/A FMTD
./bracket_sim1-solution_1.xdb DBC 40 UNKNOWN DIRECT 1024 UNFMTD
./bracket_sim1-solution_1.asm ASSEM 16 OLD SEQ N/A FMTD
FLAG VALUES ARE --
A FILE HAS BEEN DEFINED BY AN 'ASSIGN' STATEMENT
D FILE IS TO BE DELETED BEFORE RUN, IF IT EXISTS
R FILE IS READ-ONLY
T FILE IS TEMPORARY AND WILL BE DELETED AT END OF RUN
** PHYSICAL FILES LARGER THAN 2GB ARE SUPPORTED ON THIS PLATFORM
0 ** MASTER DIRECTORIES ARE LOADED IN MEMORY.
USER OPENCORE (HICORE) = 2307175251 WORDS
EXECUTIVE SYSTEM WORK AREA = 400175 WORDS
MASTER(RAM) = 103805 WORDS
SCRATCH(MEM) AREA = 769252275 WORDS ( 23475 BUFFERS)
BUFFER POOL AREA (GINO/EXEC) = 769192014 WORDS ( 23466 BUFFERS)
TOTAL OPEN CORE MEMORY = 3846123520 WORDS
TOTAL DYNAMIC MEMORY = 0 WORDS
TOTAL NASTRAN MEMORY LIMIT = 3846123520 WORDS
Day_Time Elapsed I/O_Mb Del_Mb CPU_Sec Del_CPU SubDMAP Line (S)SubDMAP/Module
14:01:58 0:00 1112.0 2.0 0.1 0.0 XSEMDR BGN
14:01:58 0:00 1114.0 2.0 0.1 0.0 SESTATIC67 (S)IFPL BEGN
14:01:58 0:00 1114.0 0.0 0.1 0.0 IFPL 46 IFP1 BEGN
14:01:58 0:00 1114.0 0.0 0.1 0.0 IFPL 195 XSORT BEGN
14:01:58 0:00 1114.0 0.0 0.1 0.0 IFPL 222 COPY BEGN
14:01:58 0:00 1114.0 0.0 0.1 0.0 IFPL 244 FORTIO BEGN
14:01:58 0:00 1114.0 0.0 0.1 0.0 IFPL 278 (S)IFPS BEGN
14:01:58 0:00 1114.0 0.0 0.1 0.0 IFPS 80 IFP BEGN
14:01:58 0:00 1114.0 0.0 0.1 0.0 IFP
* COUNT:ENTRY COUNT:ENTRY COUNT:ENTRY COUNT:ENTRY COUNT:ENTRY COUNT:ENTRY *
* 1079:CTETRA 5:FORCE 2133:GRID 1:MAT1 1:MATT1 6:PARAM *
* 1:PSOLID 109:SPC 3:TABLEM1
* PARAM: K6ROT OIBULK OMACHPR POST POSTEXT UNITSYS *
14:01:58 0:00 1115.0 1.0 0.1 0.0 IFPS 138 (S)FINDREC BEGN
14:01:58 0:00 1115.0 0.0 0.1 0.0 IFPS 157 IFPMPLS BEGN
14:01:58 0:00 1115.0 0.0 0.1 0.0 IFPS 194 GP7 BEGN
14:01:58 0:00 1115.0 0.0 0.1 0.0 IFPS 434 (S)TESTBIT BEGN
14:01:58 0:00 1115.0 0.0 0.1 0.0 IFPS 436 (S)TESTBIT BEGN
14:01:58 0:00 1115.0 0.0 0.1 0.0 IFPS 438 (S)TESTBIT BEGN
14:01:58 0:00 1115.0 0.0 0.1 0.0 IFPS 461 (S)TESTBIT BEGN
14:01:58 0:00 1115.0 0.0 0.1 0.0 IFPS 463 (S)TESTBIT BEGN
14:01:58 0:00 1115.0 0.0 0.1 0.0 IFPS 465 (S)TESTBIT BEGN
14:01:58 0:00 1115.0 0.0 0.1 0.0 IFPS 467 (S)TESTBIT BEGN
14:01:58 0:00 1115.0 0.0 0.1 0.0 IFPS 474 CHKPNL BEGN
14:01:58 0:00 1115.0 0.0 0.1 0.0 IFPS 475 DMIIN BEGN
14:01:58 0:00 1115.0 0.0 0.1 0.0 IFPS 486 DTIIN BEGN
14:01:58 0:00 1115.0 0.0 0.1 0.0 IFPS 596 (S)FINDREC BEGN
14:01:58 0:00 1115.0 0.0 0.1 0.0 IFPS 626 (S)VATVIN BEGN
14:01:58 0:00 1115.0 0.0 0.1 0.0 IFPS 633 DTIIN BEGN
14:01:58 0:00 1115.0 0.0 0.1 0.0 IFPS 634 (S)MODSETINBEGN
14:01:58 0:00 1115.0 0.0 0.1 0.0 MODSETIN17 (S)TESTBIT BEGN
14:01:58 0:00 1115.0 0.0 0.1 0.0 IFPS 636 MODGM2 BEGN
14:01:58 0:00 1115.0 0.0 0.2 0.0 IFPS 665 PVT BEGN
14:01:58 0:00 1115.0 0.0 0.2 0.0 IFPS 773 GP1LM BEGN
14:01:58 0:00 1115.0 0.0 0.2 0.0 IFPS 774 GP1 BEGN
14:01:58 0:00 1121.0 6.0 0.2 0.0 IFPL 283 SEPR1 BEGN
14:01:58 0:00 1121.0 0.0 0.2 0.0 IFPL 284 DBDELETEBEGN
14:01:58 0:00 1122.0 1.0 0.2 0.0 IFPL 299 PROJVER BEGN
14:01:58 0:00 1123.0 1.0 0.2 0.0 IFPL 304 PVT BEGN
14:01:58 0:00 1123.0 0.0 0.2 0.0 IFPL 384 (S)IFPS1 BEGN
14:01:58 0:00 1123.0 0.0 0.2 0.0 IFPS1 15 DTIIN BEGN
14:01:58 0:00 1123.0 0.0 0.2 0.0 IFPS1 47 PLTSET BEGN
14:01:58 0:00 1123.0 0.0 0.2 0.0 IFPS1 50 MSGHAN BEGN
14:01:58 0:00 1123.0 0.0 0.2 0.0 IFPS1 51 MSGHAN BEGN
14:01:58 0:00 1123.0 0.0 0.2 0.0 IFPS1 52 GP0 BEGN
14:01:58 0:00 1123.0 0.0 0.2 0.0 IFPS1 58 MSGHAN BEGN
14:01:58 0:00 1123.0 0.0 0.2 0.0 IFPL 386 (S)TESTBIT BEGN
14:01:58 0:00 1123.0 0.0 0.2 0.0 IFPL 436 (S)TESTBIT BEGN
14:01:58 0:00 1123.0 0.0 0.2 0.0 SESTATIC93 (S)PHASE0 BEGN
14:01:58 0:00 1123.0 0.0 0.2 0.0 PHASE0 109 (S)PHASE0ACBEGN
14:01:58 0:00 1123.0 0.0 0.2 0.0 PHASE0AC12 (S)ACTRAP0 BEGN
14:01:58 0:00 1123.0 0.0 0.2 0.0 ACTRAP0 7 (S)CASEPARTBEGN
14:01:58 0:00 1123.0 0.0 0.2 0.0 CASEPART11 COPY BEGN
14:01:58 0:00 1123.0 0.0 0.2 0.0 ACTRAP0 11 (S)TESTBIT BEGN
14:01:58 0:00 1123.0 0.0 0.2 0.0 PHASE0 122 (S)ATVIN0 BEGN
14:01:58 0:00 1123.0 0.0 0.2 0.0 PHASE0 270 (S)LARGEGIDBEGN
14:01:58 0:00 1124.0 1.0 0.2 0.0 PHASE0 299 PVT BEGN
14:01:58 0:00 1124.0 0.0 0.2 0.0 PHASE0 300 COPY BEGN
14:01:58 0:00 1124.0 0.0 0.2 0.0 PHASE0 306 PROJVER BEGN
14:01:58 0:00 1124.0 0.0 0.2 0.0 PHASE0 309 DTIIN BEGN
14:01:58 0:00 1124.0 0.0 0.2 0.0 PHASE0 355 OUTPUT2 BEGN
14:01:58 0:00 1124.0 0.0 0.2 0.0 PHASE0 366 OUTPUT2 BEGN
14:01:58 0:00 1124.0 0.0 0.2 0.0 PHASE0 372 OUTPUT2 BEGN
14:01:58 0:00 1124.0 0.0 0.2 0.0 PHASE0 404 (S)TESTBIT BEGN
14:01:58 0:00 1124.0 0.0 0.2 0.0 PHASE0 405 (S)TESTBIT BEGN
14:01:58 0:00 1124.0 0.0 0.2 0.0 PHASE0 406 (S)TESTBIT BEGN
14:01:58 0:00 1124.0 0.0 0.2 0.0 PHASE0 437 SEP1X BEGN
14:01:58 0:00 1124.0 0.0 0.2 0.0 PHASE0 456 GP1LM BEGN
14:01:58 0:00 1124.0 0.0 0.2 0.0 PHASE0 464 GP1 BEGN
14:01:58 0:00 1125.0 1.0 0.2 0.0 PHASE0 477 (S)PHASE0A BEGN
14:01:58 0:00 1125.0 0.0 0.2 0.0 PHASE0A 24 GP2 BEGN
14:01:59 0:01 1125.0 0.0 0.2 0.0 PHASE0A 24 GP2 END
14:01:59 0:01 1125.0 0.0 0.2 0.0 PHASE0A 165 TA1 BEGN
14:01:59 0:01 1125.0 0.0 0.2 0.0 PHASE0A 170 TASNP2 BEGN
14:01:59 0:01 1125.0 0.0 0.2 0.0 PHASE0 485 SEP1 BEGN
14:01:59 0:01 1126.0 1.0 0.2 0.0 PHASE0 612 TABPRT BEGN
14:01:59 0:01 1126.0 0.0 0.2 0.0 PHASE0 613 SEP3 BEGN
14:01:59 0:01 1126.0 0.0 0.2 0.0 PHASE0 825 PVT BEGN
14:01:59 0:01 1138.0 12.0 0.2 0.0 PHASE0 1432 (S)SETQ BEGN
14:01:59 0:01 1138.0 0.0 0.2 0.0 PHASE0 1603 GP2 BEGN
14:01:59 0:01 1139.0 1.0 0.2 0.0 PHASE0 1654 GPJAC BEGN
14:01:59 0:01 1139.0 0.0 0.2 0.0 PHASE0 1742 DTIIN BEGN
14:01:59 0:01 1139.0 0.0 0.2 0.0 PHASE0 1744 GP3 BEGN
14:01:59 0:01 1139.0 0.0 0.2 0.0 PHASE0 1750 LCGEN BEGN
14:01:59 0:01 1139.0 0.0 0.2 0.0 PHASE0 1759 VECPLOT BEGN
*8** Module DMAP Matrix Cols Rows F T NzWds Density BlockT StrL NbrStr BndAvg BndMax NulCol
VECPLOT 1759 SCR 301 12798 6 2 1 3 3.29921E-01 4 1 19075 2 6 0 *8**
VECPLOT 1759 DRG 12798 6 2 1 3 3.29900E-01 4 1 19075 2 6 0 *8**
14:01:59 0:01 1139.0 0.0 0.2 0.0 PHASE0 1794 BCDR BEGN
14:01:59 0:01 1139.0 0.0 0.2 0.0 PHASE0 1795 CASE BEGN
14:01:59 0:01 1139.0 0.0 0.2 0.0 PHASE0 1796 PVT BEGN
14:01:59 0:01 1140.0 1.0 0.2 0.0 PHASE0 1872 GP4 BEGN
*8** Module DMAP Matrix Cols Rows F T NzWds Density BlockT StrL NbrStr BndAvg BndMax NulCol
GP4 1872 YG1 1 12798 2 1 0 0.00000E+00 3 0 1 0 0 1 *8**
14:01:59 0:01 1140.0 0.0 0.2 0.0 PHASE0 1908 MATMOD BEGN
14:01:59 0:01 1140.0 0.0 0.2 0.0 PHASE0 1991 DPD BEGN
14:01:59 0:01 1140.0 0.0 0.2 0.0 PHASE0 2041 MATGEN BEGN
*8** Module DMAP Matrix Cols Rows F T NzWds Density BlockT StrL NbrStr BndAvg BndMax NulCol
MATGEN 2041 YG1 1 12798 2 1 0 0.00000E+00 3 0 1 0 0 1 *8**
14:01:59 0:01 1140.0 0.0 0.2 0.0 PHASE0 2042 APPEND BEGN
*8** Module DMAP Matrix Cols Rows F T NzWds Density BlockT StrL NbrStr BndAvg BndMax NulCol
APPEND 2042 YG2 1 12798 2 1 0 0.00000E+00 3 0 1 0 0 1 *8**
14:01:59 0:01 1140.0 0.0 0.2 0.0 PHASE0 2102 BCDR BEGN
14:01:59 0:01 1140.0 0.0 0.2 0.0 PHASE0 2188 (S)SELA1 BEGN
14:01:59 0:01 1140.0 0.0 0.2 0.0 PHASE0 2190 UPARTN BEGN
*8** Module DMAP Matrix Cols Rows F T NzWds Density BlockT StrL NbrStr BndAvg BndMax NulCol
UPARTN 2190 SCR 301 1 12798 2 1 654 5.11017E-02 3 109 6 1764 1764 0 *8**
14:01:59 0:01 1141.0 1.0 0.2 0.0 PHASE0 2493 (S)OUT2GEOMBEGN
14:01:59 0:01 1141.0 0.0 0.2 0.0 OUT2GEOM75 OUTPUT2 BEGN
14:01:59 0:01 1141.0 0.0 0.2 0.0 OUT2GEOM76 OUTPUT2 BEGN
14:01:59 0:01 1141.0 0.0 0.2 0.0 OUT2GEOM77 OUTPUT2 BEGN
14:01:59 0:01 1141.0 0.0 0.2 0.0 OUT2GEOM78 OUTPUT2 BEGN
14:01:59 0:01 1141.0 0.0 0.2 0.0 OUT2GEOM79 OUTPUT2 BEGN
14:01:59 0:01 1141.0 0.0 0.2 0.0 OUT2GEOM83 OUTPUT2 BEGN
14:01:59 0:01 1141.0 0.0 0.2 0.0 OUT2GEOM85 OUTPUT2 BEGN
14:01:59 0:01 1141.0 0.0 0.2 0.0 PHASE0 2496 OUTPUT2 BEGN
14:01:59 0:01 1141.0 0.0 0.2 0.0 PHASE0 2497 OUTPUT2 BEGN
14:01:59 0:01 1141.0 0.0 0.2 0.0 PHASE0 2498 OUTPUT2 BEGN
14:01:59 0:01 1141.0 0.0 0.2 0.0 SESTATIC96 (S)SETQ BEGN
14:01:59 0:01 1141.0 0.0 0.2 0.0 SESTATIC104 MATGEN BEGN
*8** Module DMAP Matrix Cols Rows F T NzWds Density BlockT StrL NbrStr BndAvg BndMax NulCol
MATGEN 104 TEMPALL 2 2 6 1 1 5.00000E-01 3 1 2 1 1 0 *8**
14:01:59 0:01 1141.0 0.0 0.2 0.0 SESTATIC105 RESTART BEGN
Data block TEMPALL has changed.
14:01:59 0:01 1142.0 1.0 0.2 0.0 SESTATIC107 DTIIN BEGN
14:01:59 0:01 1143.0 1.0 0.2 0.0 SESTATIC151 (S)PHASE1DRBEGN
14:01:59 0:01 1143.0 0.0 0.2 0.0 PHASE1DR71 MATINIT BEGN
*8** Module DMAP Matrix Cols Rows F T NzWds Density BlockT StrL NbrStr BndAvg BndMax NulCol
MATINIT 71 CNELMP 1 3 2 1 0 0.00000E+00 3 0 1 0 0 1 *8**
14:01:59 0:01 1143.0 0.0 0.2 0.0 PHASE1DR213 PVT BEGN
14:01:59 0:01 1143.0 0.0 0.2 0.0 PHASE1DR214 (S)SETQ BEGN
14:01:59 0:01 1143.0 0.0 0.2 0.0 PHASE1DR337 BOLTFOR BEGN
14:01:59 0:01 1143.0 0.0 0.2 0.0 PHASE1DR351 (S)DBSETOFFBEGN
14:01:59 0:01 1143.0 0.0 0.2 0.0 PHASE1DR357 (S)PHASE1A BEGN
14:01:59 0:01 1143.0 0.0 0.2 0.0 PHASE1A 116 TA1 BEGN
14:01:59 0:01 1144.0 1.0 0.2 0.0 PHASE1A 188 MSGHAN BEGN
14:01:59 0:01 1144.0 0.0 0.2 0.0 PHASE1A 195 (S)SEMG BEGN
14:01:59 0:01 1144.0 0.0 0.2 0.0 SEMG 111 (S)TESTBIT BEGN
14:01:59 0:01 1144.0 0.0 0.2 0.0 SEMG 131 ELTPRT BEGN
14:01:59 0:01 1144.0 0.0 0.2 0.0 SEMG 136 EULAN BEGN
14:01:59 0:01 1144.0 0.0 0.2 0.0 SEMG 137 OUTPUT2 BEGN
14:01:59 0:01 1144.0 0.0 0.2 0.0 SEMG 161 (S)TESTBIT BEGN
14:01:59 0:01 1144.0 0.0 0.2 0.0 SEMG 162 (S)TESTBIT BEGN
14:01:59 0:01 1144.0 0.0 0.2 0.0 SEMG 163 (S)TESTBIT BEGN
14:01:59 0:01 1144.0 0.0 0.2 0.0 SEMG 169 EMG BEGN
*8** Module DMAP Matrix Cols Rows F T NzWds Density BlockT StrL NbrStr BndAvg BndMax NulCol
EMG 169 KELM 1079 465 2 1 465 1.00000E+00 18 458 1094 465 465 0 *8**
EMG 169 MELM 1079 465 2 1 18 3.87097E-02 3 1 19422 171 171 0 *8**
14:01:59 0:01 1145.0 1.0 0.2 0.0 SEMG 390 EMA BEGN
*8** Module DMAP Matrix Cols Rows F T NzWds Density BlockT StrL NbrStr BndAvg BndMax NulCol
EMA 390 SCR 305 1079 2133 2 1 10 4.68823E-03 3 1 8736 1426 2113 0 *8**
EMA 390 SCR 307 2133 1079 2 1 34 4.68823E-03 3 1 9887 549 1056 0 *8**
EMA 390 KJJZ 12798 12798 6 1 270 2.68735E-03 21 2 146798 4962 12735 6399 *8**
14:01:59 0:01 1145.0 0.0 0.2 0.0 SEMG 396 EMR BEGN
14:01:59 0:01 1146.0 1.0 0.2 0.0 SEMG 438 EMA BEGN
*8** Module DMAP Matrix Cols Rows F T NzWds Density BlockT StrL NbrStr BndAvg BndMax NulCol
EMA 438 SCR 305 1079 2133 2 1 10 4.68823E-03 3 1 8736 1426 2113 0 *8**
EMA 438 SCR 307 2133 1079 2 1 34 4.68823E-03 3 1 9887 549 1056 0 *8**
EMA 438 MJJX 12798 12798 6 1 1 3.23282E-05 4 0 5295 0 1 7503 *8**
14:01:59 0:01 1146.0 0.0 0.3 0.0 SEMG 737 (S)XMTRXIN BEGN
14:01:59 0:01 1146.0 0.0 0.3 0.0 SEMG 748 ADD BEGN
14:01:59 0:01 1146.0 0.0 0.3 0.0 SEMG 760 (S)SEMG1 BEGN
14:01:59 0:01 1146.0 0.0 0.3 0.0 SEMG 774 PROJVER BEGN
14:01:59 0:01 1146.0 0.0 0.3 0.0 PHASE1A 220 MSGHAN BEGN
14:01:59 0:01 1146.0 0.0 0.3 0.0 PHASE1A 221 MSGHAN BEGN
14:01:59 0:01 1146.0 0.0 0.3 0.0 PHASE1A 222 (S)SESUM BEGN
14:01:59 0:01 1147.0 1.0 0.3 0.0 PHASE1A 240 VECPLOT BEGN
14:01:59 0:01 1148.0 1.0 0.3 0.0 PHASE1A 347 MSGHAN BEGN
14:01:59 0:01 1148.0 0.0 0.3 0.0 PHASE1A 354 (S)SELG BEGN
14:01:59 0:01 1148.0 0.0 0.3 0.0 SELG 206 SSG1 BEGN
*8** Module DMAP Matrix Cols Rows F T NzWds Density BlockT StrL NbrStr BndAvg BndMax NulCol
SSG1 206 SCR 301 1 12798 2 1 5 3.90686E-04 3 1 5 451 451 0 *8**
SSG1 206 SCR 302 1 1 6 1 1 1.00000E+00 3 1 1 1 1 0 *8**
SSG1 206 PJX 1 12798 2 1 5 3.90686E-04 3 1 5 451 451 0 *8**
14:01:59 0:01 1148.0 0.0 0.3 0.0 SELG 616 VECPLOT BEGN
*8** Module DMAP Matrix Cols Rows F T NzWds Density BlockT StrL NbrStr BndAvg BndMax NulCol
VECPLOT 616 SCR 301 12798 15 2 1 3 1.31969E-01 4 1 21200 5 12 0 *8**
VECPLOT 616 SCR 302 1 15 2 1 2 1.33333E-01 3 1 2 11 11 0 *8**
VECPLOT 616 PJRES 1 6 2 1 2 3.33333E-01 3 2 1 2 2 0 *8**
14:01:59 0:01 1148.0 0.0 0.3 0.0 PHASE1A 363 MSGHAN BEGN
14:01:59 0:01 1148.0 0.0 0.3 0.0 PHASE1A 364 (S)SESUM BEGN
14:01:59 0:01 1150.0 2.0 0.3 0.0 PHASE1A 370 (S)SELA1 BEGN
14:01:59 0:01 1150.0 0.0 0.3 0.0 PHASE1DR452 BCDR BEGN
14:01:59 0:01 1150.0 0.0 0.3 0.0 PHASE1DR458 PVT BEGN
14:01:59 0:01 1150.0 0.0 0.3 0.0 PHASE1DR584 (S)PHASE1E BEGN
14:01:59 0:01 1150.0 0.0 0.3 0.0 PHASE1E 55 FOGLEL BEGN
14:01:59 0:01 1152.0 2.0 0.3 0.0 PHASE1DR595 (S)PHASE1B BEGN
14:01:59 0:01 1152.0 0.0 0.3 0.0 PHASE1B 51 (S)SEKR0 BEGN
14:01:59 0:01 1152.0 0.0 0.3 0.0 SEKR0 151 UPARTN BEGN
*8** Module DMAP Matrix Cols Rows F T NzWds Density BlockT StrL NbrStr BndAvg BndMax NulCol
UPARTN 151 SCR 301 1 12798 2 1 12798 1.00000E+00 3 12798 1 12798 12798 0 *8**
14:01:59 0:01 1152.0 0.0 0.3 0.0 SEKR0 167 VECPLOT BEGN
14:01:59 0:01 1152.0 0.0 0.3 0.0 SEKR0 214 GPSP BEGN
14:01:59 0:01 1152.0 0.0 0.3 0.0 PHASE1B 52 (S)FINDREC BEGN
14:01:59 0:01 1152.0 0.0 0.3 0.0 PHASE1B 79 (S)SEKMR BEGN
14:01:59 0:01 1152.0 0.0 0.3 0.0 SEKMR 34 (S)SEKR BEGN
14:01:59 0:01 1152.0 0.0 0.3 0.0 SEKR 17 (S)PMLUSET BEGN
14:01:59 0:01 1152.0 0.0 0.3 0.0 SEKR 23 UPARTN BEGN
*8** Module DMAP Matrix Cols Rows F T NzWds Density BlockT StrL NbrStr BndAvg BndMax NulCol
UPARTN 23 SCR 301 1 12798 2 1 6726 5.25551E-01 3 3 2025 12798 12798 0 *8**
UPARTN 23 KFF 6072 6072 6 1 255 1.11693E-02 17 4 88453 4673 6054 0 *8**
UPARTN 23 KSF 6072 6726 2 1 45 2.30067E-04 3 1 3135 66 1128 5475 *8**
UPARTN 23 KFS 6726 6072 2 1 114 2.30067E-04 3 1 2240 209 5931 6399 *8**
UPARTN 23 KSS 6726 6726 6 1 57 2.11388E-04 3 1 3189 46 1134 6399 *8**
14:01:59 0:01 1152.0 0.0 0.3 0.0 SEKR 26 VECPLOT BEGN
14:01:59 0:01 1152.0 0.0 0.3 0.0 SEKR 159 (S)SESUM BEGN
14:01:59 0:01 1154.0 2.0 0.3 0.0 SEKMR 39 (S)SESUM BEGN
14:01:59 0:01 1156.0 2.0 0.3 0.0 SEKMR 60 (S)PMLUSET BEGN
14:01:59 0:01 1156.0 0.0 0.3 0.0 PHASE1B 83 (S)PMLUSET BEGN
14:01:59 0:01 1157.0 1.0 0.3 0.0 PHASE1B 447 (S)SEGOA BEGN
14:01:59 0:01 1157.0 0.0 0.3 0.0 PHASE1B 455 (S)SELR BEGN
14:01:59 0:01 1157.0 0.0 0.3 0.0 SELR 104 SSG2 BEGN
*8** Module DMAP Matrix Cols Rows F T NzWds Density BlockT StrL NbrStr BndAvg BndMax NulCol
SSG2 104 SCR 301 1 12798 2 1 6726 5.25551E-01 3 3 2025 12798 12798 0 *8**
SSG2 104 SCR 302 1 6072 2 1 5 8.23452E-04 3 1 5 145 145 0 *8**
SSG2 104 PSS 1 6726 2 1 0 0.00000E+00 3 0 1 0 0 1 *8**
SSG2 104 PA 1 6072 2 1 5 8.23452E-04 3 1 5 145 145 0 *8**
14:01:59 0:01 1157.0 0.0 0.3 0.0 PHASE1B 458 (S)SESUM BEGN
14:01:59 0:01 1160.0 3.0 0.3 0.0 PHASE1B 704 SSG2 BEGN
14:01:59 0:01 1160.0 0.0 0.3 0.0 PHASE1DR607 PVT BEGN
14:01:59 0:01 1160.0 0.0 0.3 0.0 PHASE1DR895 BCDR BEGN
14:01:59 0:01 1160.0 0.0 0.3 0.0 SESTATIC178 BCDR BEGN
14:01:59 0:01 1160.0 0.0 0.3 0.0 SESTATIC179 PVT BEGN
14:01:59 0:01 1160.0 0.0 0.3 0.0 SESTATIC189 (S)PMLUSET BEGN
14:01:59 0:01 1160.0 0.0 0.3 0.0 SESTATIC208 (S)PHASE1C BEGN
14:01:59 0:01 1161.0 1.0 0.3 0.0 PHASE1C 49 (S)SEKRRS BEGN
14:01:59 0:01 1161.0 0.0 0.3 0.0 SEKRRS 194 DCMP BEGN
*** USER INFORMATION MESSAGE 4157 (DFMSYN)
PARAMETERS FOR SPARSE DECOMPOSITION OF DATA BLOCK KLL ( TYPE=RSP ) FOLLOW
MATRIX SIZE = 6072 ROWS NUMBER OF NONZEROES = 208937 TERMS
NUMBER OF ZERO COLUMNS = 0 NUMBER OF ZERO DIAGONAL TERMS = 0
CPU TIME ESTIMATE = 0 SEC I/O TIME ESTIMATE = 0 SEC
MINIMUM MEMORY REQUIREMENT = 1832 KB MEMORY AVAILABLE = 18024720 KB
MEMORY REQR'D TO AVOID SPILL = 3312 KB MEMORY USED BY BEND = 2184 KB
EST. INTEGER WORDS IN FACTOR = 443 K WORDS EST. NONZERO TERMS = 960 K TERMS
ESTIMATED MAXIMUM FRONT SIZE = 357 TERMS RANK OF UPDATE = 128
*** USER INFORMATION MESSAGE 6439 (DFMSA)
ACTUAL MEMORY AND DISK SPACE REQUIREMENTS FOR SPARSE SYM. DECOMPOSITION
SPARSE DECOMP MEMORY USED = 3312 KB MAXIMUM FRONT SIZE = 357 TERMS
INTEGER WORDS IN FACTOR = 29 K WORDS NONZERO TERMS IN FACTOR = 960 K TERMS
SPARSE DECOMP SUGGESTED MEMORY = 2864 KB
*8** Module DMAP Matrix Cols Rows F T IBlks NBlks NumFrt FrtMax
DCMP 194 LLL 6072 6072 13 1 1 30 195 357 *8**
*8** Module DMAP Matrix Cols Rows F T NzWds Density BlockT StrL NbrStr BndAvg BndMax NulCol
DCMP 194 SCR 301 1 6072 2 1 6072 1.00000E+00 3 6072 1 6072 6072 0 *8**
DCMP 194 SCR 302 1 6072 2 1 6072 1.00000E+00 3 6072 1 6072 6072 0 *8**
14:01:59 0:01 1161.0 0.0 0.4 0.1 PHASE1C 55 (S)SESUM BEGN
14:01:59 0:01 1162.0 1.0 0.4 0.0 PHASE1C 64 (S)SESUM BEGN
14:01:59 0:01 1164.0 2.0 0.4 0.0 PHASE1C 68 (S)SELRRS BEGN
14:01:59 0:01 1164.0 0.0 0.4 0.0 PHASE1C 69 (S)SESUM BEGN
14:01:59 0:01 1165.0 1.0 0.4 0.0 SESTATIC228 (S)STATRS BEGN
14:01:59 0:01 1165.0 0.0 0.4 0.0 STATRS 181 MSGHAN BEGN
14:01:59 0:01 1165.0 0.0 0.4 0.0 STATRS 308 SSG3 BEGN
*8** Module DMAP Matrix Cols Rows F T NzWds Density BlockT StrL NbrStr BndAvg BndMax NulCol
SSG3 308 UL 1 6072 2 1 6072 1.00000E+00 3 6072 1 6072 6072 0 *8**
SSG3 308 RUL 1 6072 2 1 6072 1.00000E+00 3 6072 1 6072 6072 0 *8**
14:01:59 0:01 1165.0 0.0 0.4 0.0 STATRS 459 MSGHAN BEGN
14:01:59 0:01 1165.0 0.0 0.4 0.0 SESTATIC229 APPEND BEGN
14:01:59 0:01 1165.0 0.0 0.4 0.0 SESTATIC333 PVT BEGN
14:01:59 0:01 1165.0 0.0 0.4 0.0 SESTATIC334 APPEND BEGN
14:01:59 0:01 1165.0 0.0 0.4 0.0 SESTATIC340 COPY BEGN
14:01:59 0:01 1165.0 0.0 0.4 0.0 SESTATIC349 BCDR BEGN
14:01:59 0:01 1165.0 0.0 0.4 0.0 SESTATIC350 (S)SESUM BEGN
14:01:59 0:01 1167.0 2.0 0.4 0.0 SESTATIC374 (S)SUPER3 BEGN
14:01:59 0:01 1167.0 0.0 0.4 0.0 SUPER3 319 SEP4 BEGN
14:01:59 0:01 1167.0 0.0 0.4 0.0 SUPER3 363 GP1LM BEGN
14:01:59 0:01 1167.0 0.0 0.4 0.0 SUPER3 364 GP1 BEGN
14:01:59 0:01 1167.0 0.0 0.4 0.0 SUPER3 570 SEDRDR BEGN
14:01:59 0:01 1167.0 0.0 0.4 0.0
14:01:59 0:01 1167.0 0.0 0.4 0.0 SUPER3 718 PVT BEGN
14:01:59 0:01 1167.0 0.0 0.4 0.0 SUPER3 739 SEDR BEGN
14:01:59 0:01 1167.0 0.0 0.4 0.0 SUPER3 815 PVT BEGN
14:01:59 0:01 1167.0 0.0 0.4 0.0 SUPER3 839 (S)DBSETOFFBEGN
14:01:59 0:01 1167.0 0.0 0.4 0.0 SUPER3 859 LCGEN BEGN
14:01:59 0:01 1167.0 0.0 0.4 0.0 SUPER3 943 DTIIN BEGN
14:01:59 0:01 1167.0 0.0 0.4 0.0 SUPER3 944 DTIIN BEGN
14:01:59 0:01 1167.0 0.0 0.4 0.0 SUPER3 1083 (S)SEDISP BEGN
14:01:59 0:01 1167.0 0.0 0.4 0.0 SEDISP 127 BCDR BEGN
14:01:59 0:01 1167.0 0.0 0.4 0.0 SEDISP 299 (S)SEGOA BEGN
14:01:59 0:01 1167.0 0.0 0.4 0.0 SEDISP 310 SDR1 BEGN
*8** Module DMAP Matrix Cols Rows F T NzWds Density BlockT StrL NbrStr BndAvg BndMax NulCol
SDR1 310 SCR 301 1 12798 2 1 6726 5.25551E-01 3 3 2025 12798 12798 0 *8**
SDR1 310 SCR 303 1 12798 2 1 6072 4.74449E-01 3 3 2024 12783 12783 0 *8**
SDR1 310 SCR 301 1 6726 2 1 327 4.86173E-02 3 3 109 1206 1206 0 *8**
SDR1 310 SCR 304 1 12798 2 1 6072 4.74449E-01 3 3 2024 12783 12783 0 *8**
SDR1 310 SCR 306 1 12798 2 1 327 2.55509E-02 3 3 109 1761 1761 0 *8**
SDR1 310 QGI 1 12798 2 1 327 2.55509E-02 3 3 109 1761 1761 0 *8**
SDR1 310 UGI 1 12798 2 1 6072 4.74449E-01 3 3 2024 12783 12783 0 *8**
14:01:59 0:01 1167.0 0.0 0.4 0.0 SEDISP 443 BCDR BEGN
14:01:59 0:01 1167.0 0.0 0.4 0.0 SEDISP 457 COPY BEGN
*8** Module DMAP Matrix Cols Rows F T NzWds Density BlockT StrL NbrStr BndAvg BndMax NulCol
COPY 457 UG 1 12798 2 1 6072 4.74400E-01 3 2 2024 12783 12783 0 *8**
14:01:59 0:01 1167.0 0.0 0.4 0.0 SEDISP 473 COPY BEGN
*8** Module DMAP Matrix Cols Rows F T NzWds Density BlockT StrL NbrStr BndAvg BndMax NulCol
COPY 473 QG 1 12798 2 1 327 2.56000E-02 3 3 109 1761 1761 0 *8**
14:01:59 0:01 1167.0 0.0 0.4 0.0 SEDISP 727 (S)SESUM BEGN
14:01:59 0:01 1169.0 2.0 0.4 0.0 SUPER3 1087 PVT BEGN
14:01:59 0:01 1169.0 0.0 0.4 0.0 SUPER3 1212 SDR2 BEGN
14:01:59 0:01 1169.0 0.0 0.4 0.0 SUPER3 1539 (S)SEDRCVR BEGN
14:01:59 0:01 1169.0 0.0 0.4 0.0 SEDRCVR 128 (S)SEDRCVR7BEGN
14:01:59 0:01 1169.0 0.0 0.4 0.0 SEDRCVR730 VECPLOT BEGN
*8** Module DMAP Matrix Cols Rows F T NzWds Density BlockT StrL NbrStr BndAvg BndMax NulCol
VECPLOT 30 SCR 301 12798 15 2 1 3 1.31969E-01 4 1 21200 5 12 0 *8**
VECPLOT 30 SCR 302 1 15 2 1 9 6.00000E-01 3 3 3 14 14 0 *8**
VECPLOT 30 QGRES 1 6 2 1 6 1.00000E+00 3 6 1 6 6 0 *8**
14:01:59 0:01 1170.0 1.0 0.4 0.0 SEDRCVR 172 (S)SEDRCVRBBEGN
14:01:59 0:01 1170.0 0.0 0.4 0.0 SEDRCVRB38 (S)CHCKPEAKBEGN
14:01:59 0:01 1170.0 0.0 0.4 0.0 SEDRCVRB224 SDR2 BEGN
14:01:59 0:01 1170.0 0.0 0.4 0.0 SEDRCVRB249 SDR2 BEGN
14:01:59 0:01 1170.0 0.0 0.4 0.0 SEDRCVRB266 (S)COMBOUT BEGN
14:01:59 0:01 1170.0 0.0 0.4 0.0 SEDRCVRB267 (S)COMBOUT BEGN
14:01:59 0:01 1170.0 0.0 0.4 0.0 SEDRCVRB268 (S)COMBOUT BEGN
14:01:59 0:01 1170.0 0.0 0.4 0.0 SEDRCVRB269 (S)COMBOUT BEGN
14:01:59 0:01 1170.0 0.0 0.4 0.0 SEDRCVRB270 (S)COMBOUT BEGN
14:01:59 0:01 1170.0 0.0 0.4 0.0 SEDRCVRB280 SDR2 BEGN
14:01:59 0:01 1170.0 0.0 0.4 0.0 SEDRCVRB305 (S)COMBOUT BEGN
14:01:59 0:01 1170.0 0.0 0.4 0.0 SEDRCVR 195 SDRX BEGN
14:01:59 0:01 1170.0 0.0 0.4 0.0 SEDRCVR 208 (S)COMBOUT BEGN
14:01:59 0:01 1170.0 0.0 0.4 0.0 SEDRCVR 209 (S)COMBOUT BEGN
14:01:59 0:01 1170.0 0.0 0.4 0.0 SEDRCVR 210 (S)COMBOUT BEGN
14:01:59 0:01 1170.0 0.0 0.4 0.0 SEDRCVR 211 (S)COMBOUT BEGN
14:01:59 0:01 1170.0 0.0 0.4 0.0 SEDRCVR 212 (S)COMBOUT BEGN
14:01:59 0:01 1170.0 0.0 0.4 0.0 SEDRCVR 403 (S)SEDRCVR3BEGN
14:01:59 0:01 1170.0 0.0 0.4 0.0 SEDRCVR 404 (S)SEDRCVR6BEGN
14:01:59 0:01 1170.0 0.0 0.4 0.0 SEDRCVR638 OUTPUT2 BEGN
14:01:59 0:01 1170.0 0.0 0.4 0.0 SEDRCVR6102 OUTPUT2 BEGN
14:01:59 0:01 1170.0 0.0 0.4 0.0 SEDRCVR6108 MATMOD BEGN
14:01:59 0:01 1170.0 0.0 0.4 0.0 SEDRCVR6410 SDR2 BEGN
14:01:59 0:01 1170.0 0.0 0.4 0.0 SEDRCVR6445 (S)COMBOUT BEGN
14:01:59 0:01 1170.0 0.0 0.4 0.0 SEDRCVR6457 OUTPUT2 BEGN
14:01:59 0:01 1170.0 0.0 0.4 0.0 SEDRCVR6458 OUTPUT2 BEGN
14:01:59 0:01 1170.0 0.0 0.4 0.0 SEDRCVR6554 EULAN BEGN
14:01:59 0:01 1170.0 0.0 0.4 0.0 SEDRCVR6555 OUTPUT2 BEGN
14:01:59 0:01 1171.0 1.0 0.4 0.0 SEDRCVR6586 (S)COMBOUT BEGN
14:01:59 0:01 1171.0 0.0 0.4 0.0 SEDRCVR6625 OUTPUT2 BEGN
14:01:59 0:01 1171.0 0.0 0.4 0.0 SEDRCVR6665 (S)COMBOUT BEGN
14:01:59 0:01 1171.0 0.0 0.4 0.0 SEDRCVR6678 OUTPUT2 BEGN
14:01:59 0:01 1171.0 0.0 0.4 0.0 SEDRCVR6679 OUTPUT2 BEGN
14:01:59 0:01 1171.0 0.0 0.4 0.0 SEDRCVR6708 OUTPUT2 BEGN
14:01:59 0:01 1171.0 0.0 0.4 0.0 SEDRCVR 455 (S)SEDRCVR4BEGN
14:01:59 0:01 1171.0 0.0 0.4 0.0 SEDRCVR431 OFP BEGN
14:01:59 0:01 1171.0 0.0 0.4 0.0 SEDRCVR441 OUTPUT2 BEGN
14:01:59 0:01 1171.0 0.0 0.4 0.0 SEDRCVR4117 OFP BEGN
14:01:59 0:01 1171.0 0.0 0.4 0.0 SEDRCVR4118 OFP BEGN
14:01:59 0:01 1171.0 0.0 0.4 0.0 SEDRCVR4125 OFP BEGN
14:01:59 0:01 1171.0 0.0 0.4 0.0 SEDRCVR4126 OFP BEGN
14:01:59 0:01 1171.0 0.0 0.4 0.0 SEDRCVR4128 OFP BEGN
14:01:59 0:01 1171.0 0.0 0.4 0.0 SEDRCVR4129 OFP BEGN
14:01:59 0:01 1171.0 0.0 0.4 0.0 SEDRCVR4130 OFP BEGN
14:01:59 0:01 1171.0 0.0 0.4 0.0 SEDRCVR4132 OUTPUT2 BEGN
14:01:59 0:01 1171.0 0.0 0.4 0.0 SEDRCVR4133 OUTPUT2 BEGN
14:01:59 0:01 1171.0 0.0 0.4 0.0 SEDRCVR4205 OFP BEGN
14:01:59 0:01 1171.0 0.0 0.4 0.0 SEDRCVR4209 OFP BEGN
14:01:59 0:01 1171.0 0.0 0.4 0.0 SEDRCVR4211 OFP BEGN
14:01:59 0:01 1171.0 0.0 0.4 0.0 SEDRCVR4265 OFP BEGN
14:01:59 0:01 1171.0 0.0 0.4 0.0 SEDRCVR4592 OFP BEGN
14:01:59 0:01 1171.0 0.0 0.4 0.0 SEDRCVR 638 (S)SEDRCVR8BEGN
14:01:59 0:01 1171.0 0.0 0.4 0.0 SEDRCVR8112 OUTPUT2 BEGN
14:01:59 0:01 1171.0 0.0 0.4 0.0 SEDRCVR8116 OUTPUT2 BEGN
14:01:59 0:01 1171.0 0.0 0.4 0.0 SESTATIC434 (S)PRTSUM BEGN
14:01:59 0:01 1171.0 0.0 0.4 0.0 SESTATIC435 MSGHAN BEGN
14:01:59 0:01 1171.0 0.0 0.4 0.0 SESTATIC436 EXIT BEGN
*** TOTAL MEMORY AND DISK USAGE STATISTICS ***
+---------- SPARSE SOLUTION MODULES -----------+ +------------- MAXIMUM DISK USAGE -------------+
HIWATER SUB_DMAP DMAP HIWATER SUB_DMAP DMAP
(WORDS) DAY_TIME NAME MODULE (MB) DAY_TIME NAME MODULE
1539383309 14:01:59 SEKRRS 194 DCMP 47.688 14:01:59 SESTATIC 436 EXIT
*** DATABASE USAGE STATISTICS ***
+------------------ LOGICAL DBSETS ------------------+ +------------------------- DBSET FILES -------------------------+
DBSET ALLOCATED BLOCKSIZE USED USED FILE ALLOCATED HIWATER HIWATER I/O TRANSFERRED
(BLOCKS) (WORDS) (BLOCKS) % (BLOCKS) (BLOCKS) (MB) (GB)
MASTER 5000 32768 61 1.22 MASTER 5000 61 15.250 0.562
DBALL 2000000 32768 5 0.00 DBALL 2000000 5 1.250 0.006
OBJSCR 5000 8192 491 9.82 OBJSCR 5000 491 30.688 0.109
SCRATCH 4023475 32768 11 0.00 (MEMFILE 23475 172 43.000 0.000)
SCRATCH 2000000 1 0.250 0.000
SCR300 2000000 1 0.250 0.000
==============
TOTAL: 0.678
*** BUFFER POOL AND SCRATCH 300 USAGE STATISTICS ***
+----------------- BUFFER POOL -----------------+ +-------------------------- SCRATCH 300 --------------------------+
OPTION BLOCKS BLOCKS BLOCKS OPTION HIWATER SUB_DMAP DMAP OPN/CLS
SELECTED ALLOCATED REUSED RELEASED SELECTED (BLOCKS) DAY_TIME NAME MODULE COUNTER
GINO,EXEC 23466 8623 0 2 1 14:01:58 PREFACE 0 PREFACE 0
*** SUMMARY OF PHYSICAL FILE I/O ACTIVITY ***
ASSIGNED PHYSICAL FILE NAME RECL (BYTES) READ/WRITE COUNTS WSIZE (WNUM) MAP-I/O CNT
------------------------------------------------------------ ----------- ------------------- ------------- -----------
c:/users/.../temp/bracket_sim1-solution_1.T119580_58.SCRATCH 262144 0/1 N/A N/A
c:/users/.../temp/bracket_sim1-solution_1.T119580_58.OBJSCR 65536 0/1789 N/A N/A
c:/users/.../temp/bracket_sim1-solution_1.T119580_58.MASTER 262144 3/2302 N/A N/A
c:/users/.../temp/bracket_sim1-solution_1.T119580_58.DBALL 262144 2/23 N/A N/A
c:/users/.../temp/bracket_sim1-solution_1.T119580_58.SCR300 262144 0/1 N/A N/A
c:/program files/siemens/.../scnas/em64tntl/SSS.MASTERA 65536 83/0 N/A N/A
c:/program files/siemens/.../scnas/em64tntl/SSS.MSCOBJ 65536 485/0 N/A N/A

View File

@@ -1,433 +0,0 @@
1
Unpublished Work. © 2024 Siemens
All Rights Reserved.
This software and related documentation are
proprietary to Siemens Industry
Software Inc.
Siemens and the Siemens logo are registered
trademarks of Siemens Trademark GmbH & Co. KG.
Simcenter is a trademark, or registered trademark
of Siemens Industry Software Inc. or its
subsidiaries in the United States and in other
countries. Simcenter NASTRAN is a registered
trademark of Siemens Industry Software Inc.
All other trademarks, registered trademarks or
service marks belong to their respective
holders.
LIMITATIONS TO U.S. GOVERNMENT RIGHTS. UNPUBLISHED
- RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF THE
UNITED STATES. This computer software and related
computer software documentation have been
developed exclusively at private expense and are
provided subject to the following rights: If this
computer software and computer software
documentation qualify as "commercial items" (as
that term is defined in FAR 2.101), their use,
duplication or disclosure by the U.S. Government
is subject to the protections and restrictions as
set forth in the Siemens commercial license for
software and/or documentation, as prescribed in
FAR 12.212 and FAR 27.405(b)(2)(i) (for civilian
agencies) and in DFARS 227.7202-1(a) and DFARS
227.7202-3(a) (for the Department of Defense), or
any successor or similar regulation, as applicable
or as amended from time to time. If this computer
software and computer documentation do not qualify
as "commercial items", then they are "restricted
computer software" and are provided with "restric-
tive rights", and their use, duplication or dis-
closure by the U.S. Government is subject to the
protections and restrictions as set forth in FAR
27.404(b) and FAR 52-227-14 (for civilian agencies
), and DFARS 227.7203-5(c) and DFARS 252.227-7014
(for the Department of Defense), or any successor
or similar regulation, as applicable or as amended
from time to time. Siemens Industry Software Inc.
5800 Granite Parkway, Suite 600, Plano, TX 75024
* * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * *
* * * *
* * * *
* * * *
* * * *
* * Simcenter Nastran 2412 * *
* * * *
* * VERSION - 2412.0074 * *
* * * *
* * NOV 8, 2024 * *
* * * *
* * * *
* *Intel64 Family 6 Model 183 Stepp * *
* * * *
* *MODEL Intel(R) Core(TM) i7-14700 * *
* * * *
* * Windows 10 * *
* * * *
* * Compiled for X86-64 * *
* * * *
* * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * *
1
Welcome to Simcenter Nastran
----------------------------
This "news" information can be turned off by setting "news=no" in the runtime
configuration (RC) file. The "news" keyword can be set in the system RC file
for global, or multi-user control, and in a local file for local control.
Individual jobs can be controlled by setting news to yes or no on the command
line.
1 NOVEMBER 15, 2025 SIMCENTER NASTRAN 11/ 8/24 PAGE 1
0 N A S T R A N F I L E A N D S Y S T E M P A R A M E T E R E C H O
0
NASTRAN BUFFSIZE=32769 $(C:/PROGRAM FILES/SIEMENS/SIMCENTER3D_2412/NXNASTRAN/CON
NASTRAN BUFFPOOL=23466
NASTRAN DIAGA=128 DIAGB=0 $(C:/PROGRAM FILES/SIEMENS/SIMCENTER3D_2412/NXNASTRAN/
NASTRAN REAL=8545370112 $(MEMORY LIMIT FOR MPI AND OTHER SPECIALIZED MODULES)
$*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$*
$* SIMCENTER V2412.0.0.3001 TRANSLATOR
$* FOR SIMCENTER NASTRAN VERSION 2412.0
$*
$* FEM FILE: C:\USERS\ANTOI\DOCUMENTS\ATOMASTE\ATOMIZER\EXAMPLES\BRA
$* SIM FILE: C:\USERS\ANTOI\DOCUMENTS\ATOMASTE\ATOMIZER\EXAMPLES\BRA
$* ANALYSIS TYPE: STRUCTURAL
$* SOLUTION NAME: SOLUTION 1
$* SOLUTION TYPE: SOL 101 LINEAR STATICS
$*
$* SOLVER INPUT FILE: BRACKET_SIM1-SOLUTION_1.DAT
$* CREATION DATE: 15-NOV-2025
$* CREATION TIME: 14:01:58
$* HOSTNAME: ANTOINETHINKPAD
$* NASTRAN LICENSE: DESKTOP BUNDLE
$*
$* UNITS: MM (MILLI-NEWTON)
$* ... LENGTH : MM
$* ... TIME : SEC
$* ... MASS : KILOGRAM (KG)
$* ... TEMPERATURE : DEG CELSIUS
$* ... FORCE : MILLI-NEWTON
$* ... THERMAL ENERGY : MN-MM (MICRO-JOULE)
$*
$* IMPORTANT NOTE:
$* THIS BANNER WAS GENERATED BY SIMCENTER AND ALTERING THIS
$* INFORMATION MAY COMPROMISE THE PRE AND POST PROCESSING OF RESULTS
$*
$*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$*
$*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$*
$* FILE MANAGEMENT
$*
$*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$*
$*
$*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$*
$* EXECUTIVE CONTROL
$*
$*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$*
1 NOVEMBER 15, 2025 SIMCENTER NASTRAN 11/ 8/24 PAGE 2
0 N A S T R A N E X E C U T I V E C O N T R O L E C H O
0
ID,NASTRAN,BRACKET_SIM1-SOLUTION_1
SOL 101
CEND
1 NOVEMBER 15, 2025 SIMCENTER NASTRAN 11/ 8/24 PAGE 3
0
0 C A S E C O N T R O L E C H O
COMMAND
COUNT
1 $*
2 $*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
3 $*
4 $* CASE CONTROL
5 $*
6 $*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
7 $*
8 ECHO = NONE
9 OUTPUT
10 DISPLACEMENT(PLOT,REAL) = ALL
11 SPCFORCES(PLOT,REAL) = ALL
12 STRESS(PLOT,REAL,VONMISES,CENTER) = ALL
13 $* STEP: SUBCASE - STATICS 1
14 SUBCASE 1
15 LABEL = SUBCASE - STATICS 1
16 LOAD = 1
17 SPC = 2
18 $*
19 $*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
20 $*
21 $* BULK DATA
22 $*
23 $*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
24 $*
25 BEGIN BULK
0 INPUT BULK DATA ENTRY COUNT = 6590
0 TOTAL COUNT= 6566
M O D E L S U M M A R Y
NUMBER OF GRID POINTS = 2133
NUMBER OF CTETRA ELEMENTS = 1079
*** USER INFORMATION MESSAGE 4109 (OUTPBN2)
THE LABEL IS NX2412 FOR FORTRAN UNIT 12
(MAXIMUM SIZE OF FORTRAN RECORDS WRITTEN = 7 WORDS.)
(NUMBER OF FORTRAN RECORDS WRITTEN = 8 RECORDS.)
(TOTAL DATA WRITTEN FOR TAPE LABEL = 17 WORDS.)
1 NOVEMBER 15, 2025 SIMCENTER NASTRAN 11/ 8/24 PAGE 4
0
0
*** USER INFORMATION MESSAGE 4114 (OUTPBN2)
DATA BLOCK IBULK WRITTEN ON FORTRAN UNIT 12, TRL =
101 1 0 0 0 0 0
(MAXIMUM POSSIBLE FORTRAN RECORD SIZE = 65538 WORDS.)
(MAXIMUM SIZE OF FORTRAN RECORDS WRITTEN = 20 WORDS.)
(NUMBER OF FORTRAN RECORDS WRITTEN = 32959 RECORDS.)
(TOTAL DATA WRITTEN FOR DATA BLOCK = 158159 WORDS.)
*** USER INFORMATION MESSAGE 4114 (OUTPBN2)
DATA BLOCK ICASE WRITTEN ON FORTRAN UNIT 12, TRL =
102 27 0 0 0 0 0
(MAXIMUM POSSIBLE FORTRAN RECORD SIZE = 65538 WORDS.)
(MAXIMUM SIZE OF FORTRAN RECORDS WRITTEN = 20 WORDS.)
(NUMBER OF FORTRAN RECORDS WRITTEN = 149 RECORDS.)
(TOTAL DATA WRITTEN FOR DATA BLOCK = 674 WORDS.)
*** USER INFORMATION MESSAGE 4114 (OUTPBN2)
DATA BLOCK CASECC WRITTEN ON FORTRAN UNIT 12, TRL =
103 1 0 1200 0 0 0
(MAXIMUM POSSIBLE FORTRAN RECORD SIZE = 65538 WORDS.)
(MAXIMUM SIZE OF FORTRAN RECORDS WRITTEN = 1200 WORDS.)
(NUMBER OF FORTRAN RECORDS WRITTEN = 19 RECORDS.)
(TOTAL DATA WRITTEN FOR DATA BLOCK = 1226 WORDS.)
*** USER INFORMATION MESSAGE 4114 (OUTPBN2)
DATA BLOCK PVT0 WRITTEN ON FORTRAN UNIT 12, TRL =
101 28 0 0 0 0 0
(MAXIMUM POSSIBLE FORTRAN RECORD SIZE = 65538 WORDS.)
(MAXIMUM SIZE OF FORTRAN RECORDS WRITTEN = 28 WORDS.)
(NUMBER OF FORTRAN RECORDS WRITTEN = 19 RECORDS.)
(TOTAL DATA WRITTEN FOR DATA BLOCK = 54 WORDS.)
*** USER INFORMATION MESSAGE 4114 (OUTPBN2)
DATA BLOCK GPL WRITTEN ON FORTRAN UNIT 12, TRL =
101 2133 2133 0 0 0 0
(MAXIMUM POSSIBLE FORTRAN RECORD SIZE = 65538 WORDS.)
(MAXIMUM SIZE OF FORTRAN RECORDS WRITTEN = 4266 WORDS.)
(NUMBER OF FORTRAN RECORDS WRITTEN = 24 RECORDS.)
(TOTAL DATA WRITTEN FOR DATA BLOCK = 6430 WORDS.)
*** USER INFORMATION MESSAGE 4114 (OUTPBN2)
DATA BLOCK GPDT WRITTEN ON FORTRAN UNIT 12, TRL =
102 2133 7 0 1 0 0
(MAXIMUM POSSIBLE FORTRAN RECORD SIZE = 65538 WORDS.)
(MAXIMUM SIZE OF FORTRAN RECORDS WRITTEN = 21330 WORDS.)
(NUMBER OF FORTRAN RECORDS WRITTEN = 19 RECORDS.)
(TOTAL DATA WRITTEN FOR DATA BLOCK = 21356 WORDS.)
*** USER INFORMATION MESSAGE 4114 (OUTPBN2)
DATA BLOCK EPT WRITTEN ON FORTRAN UNIT 12, TRL =
101 0 256 0 0 0 0
(MAXIMUM POSSIBLE FORTRAN RECORD SIZE = 65538 WORDS.)
(MAXIMUM SIZE OF FORTRAN RECORDS WRITTEN = 10 WORDS.)
(NUMBER OF FORTRAN RECORDS WRITTEN = 24 RECORDS.)
(TOTAL DATA WRITTEN FOR DATA BLOCK = 43 WORDS.)
1 NOVEMBER 15, 2025 SIMCENTER NASTRAN 11/ 8/24 PAGE 5
0
0
*** USER INFORMATION MESSAGE 4114 (OUTPBN2)
DATA BLOCK MPT WRITTEN ON FORTRAN UNIT 12, TRL =
101 33280 0 0 0 0 0
(MAXIMUM POSSIBLE FORTRAN RECORD SIZE = 65538 WORDS.)
(MAXIMUM SIZE OF FORTRAN RECORDS WRITTEN = 15 WORDS.)
(NUMBER OF FORTRAN RECORDS WRITTEN = 29 RECORDS.)
(TOTAL DATA WRITTEN FOR DATA BLOCK = 67 WORDS.)
*** USER INFORMATION MESSAGE 4114 (OUTPBN2)
DATA BLOCK GEOM2 WRITTEN ON FORTRAN UNIT 12, TRL =
101 0 0 0 512 0 0
(MAXIMUM POSSIBLE FORTRAN RECORD SIZE = 65538 WORDS.)
(MAXIMUM SIZE OF FORTRAN RECORDS WRITTEN = 12951 WORDS.)
(NUMBER OF FORTRAN RECORDS WRITTEN = 24 RECORDS.)
(TOTAL DATA WRITTEN FOR DATA BLOCK = 12984 WORDS.)
*** USER INFORMATION MESSAGE 4114 (OUTPBN2)
DATA BLOCK GEOM3 WRITTEN ON FORTRAN UNIT 12, TRL =
102 0 0 64 0 0 0
(MAXIMUM POSSIBLE FORTRAN RECORD SIZE = 65538 WORDS.)
(MAXIMUM SIZE OF FORTRAN RECORDS WRITTEN = 38 WORDS.)
(NUMBER OF FORTRAN RECORDS WRITTEN = 24 RECORDS.)
(TOTAL DATA WRITTEN FOR DATA BLOCK = 71 WORDS.)
*** USER INFORMATION MESSAGE 4114 (OUTPBN2)
DATA BLOCK GEOM4 WRITTEN ON FORTRAN UNIT 12, TRL =
103 0 0 0 512 0 0
(MAXIMUM POSSIBLE FORTRAN RECORD SIZE = 65538 WORDS.)
(MAXIMUM SIZE OF FORTRAN RECORDS WRITTEN = 439 WORDS.)
(NUMBER OF FORTRAN RECORDS WRITTEN = 24 RECORDS.)
(TOTAL DATA WRITTEN FOR DATA BLOCK = 472 WORDS.)
*** USER INFORMATION MESSAGE 4114 (OUTPBN2)
DATA BLOCK GEOM1 WRITTEN ON FORTRAN UNIT 12, TRL =
104 0 0 8 0 0 0
(MAXIMUM POSSIBLE FORTRAN RECORD SIZE = 65538 WORDS.)
(MAXIMUM SIZE OF FORTRAN RECORDS WRITTEN = 23466 WORDS.)
(NUMBER OF FORTRAN RECORDS WRITTEN = 24 RECORDS.)
(TOTAL DATA WRITTEN FOR DATA BLOCK = 23499 WORDS.)
*** USER INFORMATION MESSAGE 4114 (OUTPBN2)
DATA BLOCK BGPDT WRITTEN ON FORTRAN UNIT 12, TRL =
105 2133 0 12798 1 0 2133
(MAXIMUM POSSIBLE FORTRAN RECORD SIZE = 65538 WORDS.)
(MAXIMUM SIZE OF FORTRAN RECORDS WRITTEN = 25596 WORDS.)
(NUMBER OF FORTRAN RECORDS WRITTEN = 24 RECORDS.)
(TOTAL DATA WRITTEN FOR DATA BLOCK = 29892 WORDS.)
*** USER INFORMATION MESSAGE 4114 (OUTPBN2)
DATA BLOCK DIT WRITTEN ON FORTRAN UNIT 12, TRL =
101 32768 0 0 0 0 0
(MAXIMUM POSSIBLE FORTRAN RECORD SIZE = 65538 WORDS.)
(MAXIMUM SIZE OF FORTRAN RECORDS WRITTEN = 137 WORDS.)
(NUMBER OF FORTRAN RECORDS WRITTEN = 24 RECORDS.)
(TOTAL DATA WRITTEN FOR DATA BLOCK = 170 WORDS.)
1 NOVEMBER 15, 2025 SIMCENTER NASTRAN 11/ 8/24 PAGE 6
0
0
*** USER INFORMATION MESSAGE 4114 (OUTPBN2)
DATA BLOCK EQEXIN WRITTEN ON FORTRAN UNIT 12, TRL =
101 2133 0 0 0 0 0
(MAXIMUM POSSIBLE FORTRAN RECORD SIZE = 65538 WORDS.)
(MAXIMUM SIZE OF FORTRAN RECORDS WRITTEN = 4266 WORDS.)
(NUMBER OF FORTRAN RECORDS WRITTEN = 24 RECORDS.)
(TOTAL DATA WRITTEN FOR DATA BLOCK = 8562 WORDS.)
1 NOVEMBER 15, 2025 SIMCENTER NASTRAN 11/ 8/24 PAGE 7
0
*** USER INFORMATION MESSAGE 7310 (VECPRN)
ORIGIN OF SUPERELEMENT BASIC COORDINATE SYSTEM WILL BE USED AS REFERENCE LOCATION.
RESULTANTS ABOUT ORIGIN OF SUPERELEMENT BASIC COORDINATE SYSTEM IN SUPERELEMENT BASIC SYSTEM COORDINATES.
0 OLOAD RESULTANT
SUBCASE/ LOAD
DAREA ID TYPE T1 T2 T3 R1 R2 R3
0 1 FX 0.000000E+00 ---- ---- ---- 0.000000E+00 0.000000E+00
FY ---- 0.000000E+00 ---- 0.000000E+00 ---- 0.000000E+00
FZ ---- ---- -9.999967E+05 -9.999967E+07 0.000000E+00 ----
MX ---- ---- ---- 0.000000E+00 ---- ----
MY ---- ---- ---- ---- 0.000000E+00 ----
MZ ---- ---- ---- ---- ---- 0.000000E+00
TOTALS 0.000000E+00 0.000000E+00 -9.999967E+05 -9.999967E+07 0.000000E+00 0.000000E+00
*** USER INFORMATION MESSAGE - SINGULARITIES FOUND USING EIGENVALUE METHOD
*** 6072 SINGULARITIES FOUND 6072 SINGULARITIES ELIMINATED
1 NOVEMBER 15, 2025 SIMCENTER NASTRAN 11/ 8/24 PAGE 8
0 SUBCASE 1
*** SYSTEM INFORMATION MESSAGE 6916 (DFMSYN)
DECOMP ORDERING METHOD CHOSEN: DEFAULT, ORDERING METHOD USED: BEND
*** USER INFORMATION MESSAGE 5293 (SSG3A)
FOR DATA BLOCK KLL
LOAD SEQ. NO. EPSILON EXTERNAL WORK EPSILONS LARGER THAN 0.001 ARE FLAGGED WITH ASTERISKS
1 1.1332749E-12 1.5444904E+05
1 NOVEMBER 15, 2025 SIMCENTER NASTRAN 11/ 8/24 PAGE 9
0
*** USER INFORMATION MESSAGE 7310 (VECPRN)
ORIGIN OF SUPERELEMENT BASIC COORDINATE SYSTEM WILL BE USED AS REFERENCE LOCATION.
RESULTANTS ABOUT ORIGIN OF SUPERELEMENT BASIC COORDINATE SYSTEM IN SUPERELEMENT BASIC SYSTEM COORDINATES.
0 SPCFORCE RESULTANT
SUBCASE/ LOAD
DAREA ID TYPE T1 T2 T3 R1 R2 R3
0 1 FX 2.160223E-07 ---- ---- ---- 1.174406E+04 -4.795995E-12
FY ---- -1.908484E-07 ---- 9.999967E+07 ---- -1.880608E-05
FZ ---- ---- 9.999967E+05 4.322613E-09 -1.174406E+04 ----
MX ---- ---- ---- 0.000000E+00 ---- ----
MY ---- ---- ---- ---- 0.000000E+00 ----
MZ ---- ---- ---- ---- ---- 0.000000E+00
TOTALS 2.160223E-07 -1.908484E-07 9.999967E+05 9.999967E+07 1.199535E-05 -1.880609E-05
*** USER INFORMATION MESSAGE 4114 (OUTPBN2)
DATA BLOCK OQG1 WRITTEN ON FORTRAN UNIT 12, TRL =
101 0 17064 15 25 0 1
(MAXIMUM POSSIBLE FORTRAN RECORD SIZE = 65538 WORDS.)
(MAXIMUM SIZE OF FORTRAN RECORDS WRITTEN = 17064 WORDS.)
(NUMBER OF FORTRAN RECORDS WRITTEN = 24 RECORDS.)
(TOTAL DATA WRITTEN FOR DATA BLOCK = 17245 WORDS.)
*** USER INFORMATION MESSAGE 4114 (OUTPBN2)
DATA BLOCK BOUGV1 WRITTEN ON FORTRAN UNIT 12, TRL =
101 0 17064 15 25 0 1
(MAXIMUM POSSIBLE FORTRAN RECORD SIZE = 65538 WORDS.)
(MAXIMUM SIZE OF FORTRAN RECORDS WRITTEN = 17064 WORDS.)
(NUMBER OF FORTRAN RECORDS WRITTEN = 24 RECORDS.)
(TOTAL DATA WRITTEN FOR DATA BLOCK = 17245 WORDS.)
*** USER INFORMATION MESSAGE 4114 (OUTPBN2)
DATA BLOCK OES1 WRITTEN ON FORTRAN UNIT 12, TRL =
101 63 11 15 25 0 1
(MAXIMUM POSSIBLE FORTRAN RECORD SIZE = 65538 WORDS.)
(MAXIMUM SIZE OF FORTRAN RECORDS WRITTEN = 65538 WORDS.)
(NUMBER OF FORTRAN RECORDS WRITTEN = 26 RECORDS.)
(TOTAL DATA WRITTEN FOR DATA BLOCK = 117792 WORDS.)
1 NOVEMBER 15, 2025 SIMCENTER NASTRAN 11/ 8/24 PAGE 10
0
1 NOVEMBER 15, 2025 SIMCENTER NASTRAN 11/ 8/24 PAGE 11
0
1 NOVEMBER 15, 2025 SIMCENTER NASTRAN 11/ 8/24 PAGE 12
0
*** USER INFORMATION MESSAGE 4110 (OUTPBN2)
END-OF-DATA SIMULATION ON FORTRAN UNIT 12
(MAXIMUM SIZE OF FORTRAN RECORDS WRITTEN = 1 WORDS.)
(NUMBER OF FORTRAN RECORDS WRITTEN = 1 RECORDS.)
(TOTAL DATA WRITTEN FOR EOF MARKER = 1 WORDS.)
1 NOVEMBER 15, 2025 SIMCENTER NASTRAN 11/ 8/24 PAGE 13
0
* * * * D B D I C T P R I N T * * * * SUBDMAP = PRTSUM , DMAP STATEMENT NO. 28
0 * * * * A N A L Y S I S S U M M A R Y T A B L E * * * *
0 SEID PEID PROJ VERS APRCH SEMG SEMR SEKR SELG SELR MODES DYNRED SOLLIN PVALID SOLNL LOOPID DESIGN CYCLE SENSITIVITY
--------------------------------------------------------------------------------------------------------------------------
0 0 1 1 ' ' T T T T T F F T 0 F -1 0 F
0SEID = SUPERELEMENT ID.
PEID = PRIMARY SUPERELEMENT ID OF IMAGE SUPERELEMENT.
PROJ = PROJECT ID NUMBER.
VERS = VERSION ID.
APRCH = BLANK FOR STRUCTURAL ANALYSIS. HEAT FOR HEAT TRANSFER ANALYSIS.
SEMG = STIFFNESS AND MASS MATRIX GENERATION STEP.
SEMR = MASS MATRIX REDUCTION STEP (INCLUDES EIGENVALUE SOLUTION FOR MODES).
SEKR = STIFFNESS MATRIX REDUCTION STEP.
SELG = LOAD MATRIX GENERATION STEP.
SELR = LOAD MATRIX REDUCTION STEP.
MODES = T (TRUE) IF NORMAL MODES OR BUCKLING MODES CALCULATED.
DYNRED = T (TRUE) MEANS GENERALIZED DYNAMIC AND/OR COMPONENT MODE REDUCTION PERFORMED.
SOLLIN = T (TRUE) IF LINEAR SOLUTION EXISTS IN DATABASE.
PVALID = P-DISTRIBUTION ID OF P-VALUE FOR P-ELEMENTS
LOOPID = THE LAST LOOPID VALUE USED IN THE NONLINEAR ANALYSIS. USEFUL FOR RESTARTS.
SOLNL = T (TRUE) IF NONLINEAR SOLUTION EXISTS IN DATABASE.
DESIGN CYCLE = THE LAST DESIGN CYCLE (ONLY VALID IN OPTIMIZATION).
SENSITIVITY = SENSITIVITY MATRIX GENERATION FLAG.
1 * * * END OF JOB * * *

View File

@@ -1,129 +0,0 @@
Simcenter Nastran 2412.0000 (Intel64 Family 6 Model 183 Stepping 1 Windows 10) Control File:
--------------------------------------------------------------------------------------
Nastran BUFFSIZE=32769 $(c:/program files/siemens/simcenter3d_2412/nxnastran/conf/nastran.rcf[1])
Nastran BUFFPOOL=20.0X $(c:/program files/siemens/simcenter3d_2412/nxnastran/conf/nastran.rcf[4])
Nastran DIAGA=128 DIAGB=0 $(c:/program files/siemens/simcenter3d_2412/nxnastran/conf/nastran.rcf[7])
Nastran REAL=8545370112 $(Memory limit for MPI and other specialized modules)
JID='C:\Users\antoi\Documents\Atomaste\Atomizer\examples\bracket\bracket_sim1-solution_1.dat'
OUT='./bracket_sim1-solution_1'
MEM=3846123520
MACH='Intel64 Family 6 Model 183 Stepping 1'
OPER='Windows 10'
OSV=' '
MODEL='Intel(R) Core(TM) i7-14700HX (AntoineThinkpad)'
CONFIG=8666
NPROC=28
symbol=DELDIR='c:/program files/siemens/simcenter3d_2412/nxnastran/scnas/nast/del' $(program default)
symbol=DEMODIR='c:/program files/siemens/simcenter3d_2412/nxnastran/scnas/nast/demo' $(program default)
symbol=SSSALTERDIR='c:/program files/siemens/simcenter3d_2412/nxnastran/scnas/nast/misc/sssalter' $(program default)
symbol=TPLDIR='c:/program files/siemens/simcenter3d_2412/nxnastran/scnas/nast/tpl' $(program default)
SDIR='c:/users/antoi/appdata/local/temp/bracket_sim1-solution_1.T119580_58'
DBS='c:/users/antoi/appdata/local/temp/bracket_sim1-solution_1.T119580_58'
SCR=yes
SMEM=20.0X
NEWDEL='c:/program files/siemens/simcenter3d_2412/nxnastran/scnas/em64tntl/SSS'
DEL='NXNDEF'
AUTH='29000@AntoineThinkpad'
AUTHQUE=0
MSGCAT='c:/program files/siemens/simcenter3d_2412/nxnastran/scnas/em64tntl/analysis.msg'
MSGDEST='f06'
PROG=bundle
NEWS='c:/program files/siemens/simcenter3d_2412/nxnastran/scnas/nast/news.txt'
UMATLIB='libnxumat.dll'
UCRPLIB='libucreep.dll'
USOLLIB='libusol.dll'
--------------------------------------------------------------------------------------
NXN_ISHELLPATH=C:\Program Files\Siemens\Simcenter3D_2412\nxnastran\bin
NXN_JIDPATH=
PATH=c:/program files/siemens/simcenter3d_2412/nxnastran/scnas/em64tntl;c:/program files/siemens/simcenter3d_2412/nxnastran/scnas/em64tntl/sysnoise;c:/program files/siemens/simcenter3d_2412/nxnastran/scnas/em64tntl/softwareanalytics;c:/program files/siemens/simcenter3d_2412/nxnastran/scnas/em64tntl/samcef;c:/program files/siemens/simcenter3d_2412/nxnastran/scnas/em64tntl/impi/bin;c:/program files/siemens/simcenter3d_2412/nxnastran/scnas/em64tntl/monitor;C:\Program Files\Siemens\Simcenter3D_2412\nxbin;C:\Program Files\Siemens\Simcenter3D_2412\NXBIN;C:\Program Files\Siemens\NX2412\NXBIN;C:\Users\antoi\anaconda3\envs\test_env;C:\Users\antoi\anaconda3\envs\test_env\Library\mingw-w64\bin;C:\Users\antoi\anaconda3\envs\test_env\Library\usr\bin;C:\Users\antoi\anaconda3\envs\test_env\Library\bin;C:\Users\antoi\anaconda3\envs\test_env\Scripts;C:\Users\antoi\anaconda3\envs\test_env\bin;C:\Users\antoi\anaconda3\condabin;c:\Users\antoi\AppData\Local\Programs\cursor\resources\app\bin;C:\Program Files\Google\Chrome\Application;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0;C:\Windows\System32\OpenSSH;C:\Program Files\dotnet;C:\Program Files (x86)\Microsoft SQL Server\160\Tools\Binn;C:\Program Files\Microsoft SQL Server\160\Tools\Binn;C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn;C:\Program Files\Microsoft SQL Server\160\DTS\Binn;C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit;C:\ProgramData\chocolatey\bin;C:\ProgramData\chocolatey\bin;C:\Program Files\Git\cmd;C:\Program Files\Git\bin;C:\Program Files\MiKTeX\miktex\bin\x64\pdflatex.exe;C:\Strawberry\c\bin;C:\Strawberry\perl\site\bin;C:\Strawberry\perl\bin;C:\Program Files\Pandoc;C:\Program Files\Siemens\NX1980\CAPITALINTEGRATION\capitalnxremote;C:\Program Files\Tesseract-OCR;C:\Program Files\Inkscape\bin;C:\Program Files\Siemens\NX2412\CAPITALINTEGRATION\capitalnxremote;C:\Program Files\Tailscale;C:\Program Files\Siemens\NX2506\CAPITALINTEGRATION\capitalnxremote;C:\Program Files\Docker\Docker\resources\bin;C:\Users\antoi\.local\bin;C:\Users\antoi\AppData\Local\Microsoft\WindowsApps;C:\Users\antoi\AppData\Local\Programs\Microsoft VS Code\bin;C:\Users\antoi\AppData\Local\Programs\MiKTeX\miktex\bin\x64;C:\Users\antoi\AppData\Local\Pandoc;C:\Users\antoi\AppData\Local\Programs\Ollama;C:\Program Files\Graphviz\bin;C:\Users\antoi\.dotnet\tools;C:\Users\antoi\AppData\Local\Programs\cursor\resources\app\bin;c:\Users\antoi\AppData\Roaming\Code\User\globalStorage\github.copilot-chat\debugCommand
Command Line: bracket_sim1-solution_1.dat prog=bundle old=no scratch=yes
Current Dir: C:\Users\antoi\Documents\Atomaste\Atomizer\examples\bracket
Executable: c:/program files/siemens/simcenter3d_2412/nxnastran/scnas/em64tntl/analysis.exe
NXN_MSG: stderr
--------------------------------------------------------------------------------------
Current resource limits:
Physical memory: 65208 MB
Physical memory available: 35580 MB
Paging file size: 83640 MB
Paging file size available: 34141 MB
Virtual memory: 134217727 MB
Virtual memory available: 134213557 MB
--------------------------------------------------------------------------------------
System configuration:
Hostname: AntoineThinkpad
Architecture: em64tnt
Platform: Intel64 Family 6 Model 183 Stepping 1 Windows 10
Model: Intel(R) Core(TM) i7-14700HX
Clock freq.: 2304 MHz
Number of CPUs: 28
Executable: standard
Raw model ID: 8666
Config number: 8666
Physical memory: 65208 MB
Virtual memory: 83640 MB
Numeric format: 64-bit little-endian IEEE.
Bytes per word: 8
Disk block size: 512 bytes (64 words)
Remote shell cmd: Remote capabilities not available.
--------------------------------------------------------------------------------------
Simcenter Nastran started Sat Nov 15 14:01:58 EST 2025
14:01:58 Beginning Analysis
14:01:58 Simcenter NASTRAN Authorization Information - System Attributes
14:01:58 --------------------------------------------------------
14:01:58 Model: Intel(R) Core(TM) i7-14700HX (An
14:01:58 Machine: Intel64 Family 6 Model 183 Stepp
14:01:58 OS: Windows 10
14:01:58 Version:
14:01:58 License File(s): 29000@AntoineThinkpad
14:01:58 app set license server to 29000@AntoineThinkpad
14:01:58 ************** License Server/File Information **************
Server/File : 29000@AntoineThinkpad
License File Sold To / Install : 10219284 - Atomaste
License File Webkey Access Code : S6C5JBSW94
License File Issuer : SIEMENS
License File Type : No Type
Flexera Daemon Version : 11.19
Vendor Daemon Version : 11.1 SALT v5.0.0.0
14:01:58 *************************************************************
14:01:58 **************** License Session Information ****************
Toolkit Version : 2.6.2.0
Server Setting Used : 29000@AntoineThinkpad
Server Setting Location : Application Specific Location.
Number of bundles in use : 0
14:01:58 *************************************************************
14:01:58 SALT_startLicensingSession: call count: 1
14:01:58 Simcenter NASTRAN Authorization Information - Checkout Successful
14:01:58 -----------------------------------------------------------------
14:01:58 License for module Simcenter Nastran Basic - NX Desktop (Bundle) checked out successfully
14:01:58 Analysis started.
14:01:58 Geometry access/verification to CAD part initiated (if needed).
14:01:58 Geometry access/verification to CAD part successfully completed (if needed).
14:01:59 Finite element model generation started.
14:01:59 Finite element model generated 12798 degrees of freedom.
14:01:59 Finite element model generation successfully completed.
14:01:59 Application of Loads and Boundary Conditions to the finite element model started.
14:01:59 Application of Loads and Boundary Conditions to the finite element model successfully completed.
14:01:59 Solution of the system equations for linear statics started.
14:01:59 Solution of the system equations for linear statics successfully completed.
14:01:59 Linear static analysis completed.
14:01:59 NSEXIT: EXIT(0)
14:01:59 SALT_term: Successful session call count: 0
14:01:59 Session has been terminated.
14:01:59 Analysis complete 0
Real: 0.835 seconds ( 0:00:00.835)
User: 0.343 seconds ( 0:00:00.343)
Sys: 0.156 seconds ( 0:00:00.156)
Simcenter Nastran finished Sat Nov 15 14:01:59 EST 2025

View File

@@ -1,195 +0,0 @@
<!DOCTYPE html>
<!-- saved from url=(0014)about:internet -->
<html>
<head>
<title>Solution Monitor Graphs</title>
<script type = "text/javascript">
var isPluginLoaded = false;
function PluginLoaded() {
isPluginLoaded = true;
}
</script>
<script src = "plotly-latest.min.js" onload="PluginLoaded()"></script>
<script src = "file:///C:/Program Files/Siemens/Simcenter3D_2412/nxcae_extras/tmg/js/plotly-latest.min.js" onload="PluginLoaded()"></script>
<script src = "https://cdn.plot.ly/plotly-latest.min.js" onload="PluginLoaded()"></script>
</head>
<body>
<div id = 'Sparse Matrix Solver'></div>
<script>
var xData = [
[1,13,26,40,53,65,70,80,87,97,105,110,121,130,138,144,150,158,164,180,186,188]
];
var yData = [
[33,279,561,858,1137,1395,1665,1950,2223,2508,2850,3066,3333,3603,3894,4251,4458,4764,5016,5271,5586,5829]
];
var colors = ['rgba( 12, 36, 97,1.0)','rgba(106,176, 76,1.0)','rgba(179, 57, 57,1.0)',
'rgba(250,152, 58,1.0)','rgba(115,115,115,1.0)','rgba( 49,130,189,1.0)','rgba(189,189,189,1.0)'];
var colors2 = ['rgba( 12, 36, 97,0.5)','rgba(106,176, 76,0.5)','rgba(179, 57, 57,0.5)',
'rgba(250,152, 58,0.5)','rgba(115,115,115,0.5)','rgba( 49,130,189,0.5)','rgba(189,189,189,0.5)'];
var lineSize = [2, 4, 2, 2, 2, 2];
var labels = [''];
var data = [];
for (var i = 0; i < xData.length; i++) {
var result = {
x: xData[i],
y : yData[i],
type : 'scatter',
showlegend: true,
legendgroup: labels[i],
mode : 'lines',
name : labels[i],
line : {
color: colors[i],
width : lineSize[i]
}
};
var result2 = {
x: [xData[i][0], xData[i][21]],
y : [yData[i][0], yData[i][21]],
type : 'scatter',
showlegend: false,
legendgroup: labels[i],
mode : 'markers',
name : '',
hoverinfo : 'skip',
marker : {
color: colors2[i],
size : 12
}
};
data.push(result, result2);
}
var layout = {
height : 900,
width : 1200,
xaxis : {
showline: true,
showgrid : false,
zeroline : false,
showticklabels : true,
linecolor : 'rgb(204,204,204)',
linewidth : 2,
autotick : true,
ticks : 'outside',
tickcolor : 'rgb(204,204,204)',
tickwidth : 2,
ticklen : 5,
tickfont : {
family: 'Arial',
size : 12,
color : 'rgb(82, 82, 82)'
}
},
yaxis: {
showline: true,
showgrid : false,
zeroline : false,
showticklabels : true,
linecolor : 'rgb(204,204,204)',
linewidth : 2,
autotick : true,
ticks : 'outside',
tickcolor : 'rgb(204,204,204)',
tickwidth : 2,
ticklen : 5,
tickfont : {
family: 'Arial',
size : 12,
color : 'rgb(82, 82, 82)'
},
},
autosize : false,
margin : {
autoexpand: true,
l : 100,
r : 150,
t : 110
},
annotations : [
{
xref: 'paper',
yref : 'paper',
x : 0.0,
y : 1.05,
xanchor : 'left',
yanchor : 'bottom',
text : 'Sparse Matrix Solver',
font : {
family: 'Arial',
size : 30,
color : 'rgb(37,37,37)'
},
showarrow : false
},
{
xref: 'paper',
yref : 'paper',
x : 0.5,
y : -0.1,
xanchor : 'center',
yanchor : 'top',
text : 'Supernode',
showarrow : false,
font : {
family: 'Arial',
size : 22,
color : 'rgb(150,150,150)'
}
}
]
};
for (var i = 0; i < xData.length; i++) {
var result = {
xref: 'paper',
x : 0.05,
y : yData[i][0],
text : yData[i][0],
xanchor : 'right',
yanchor : 'middle',
showarrow : false,
clicktoshow : 'onout',
font : {
family: 'Arial',
size : 16,
color : 'black'
}
};
var result2 = {
xref: 'paper',
x : 0.95,
y : yData[i][21],
text : yData[i][21],
xanchor : 'left',
yanchor : 'middle',
font : {
family: 'Arial',
size : 16,
color : 'black'
},
showarrow : false,
clicktoshow : 'onout'
};
layout.annotations.push(result, result2);
}
var config = {responsive: true,
displaylogo: false};
Plotly.newPlot('Sparse Matrix Solver', data, layout, config);
</script>
<div class="plotly" id="plotly">
<span onclick="document.getElementById('plotly').style.display='none'" class='none'>&times; </span>
<p>The Javascript file required for visualization is not located<br>
in the current directory.Please follow the link:<br>
<a href="https://cdn.plot.ly/plotly-latest.min.js" target="_blank">plotly-latest.min.js</a></p>
Click Control + S and save it to the current directory.
</div>
<script>
if (!isPluginLoaded) {
document.getElementById('plotly').style.margin="10px 10% 60px 50%";
}
else {
document.getElementById('plotly').style.display='none';
}
</script>
</body>
</html>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

View File

@@ -1,183 +0,0 @@
{
"design_variables": [
{
"name": "tip_thickness",
"type": "continuous",
"bounds": [
15.0,
25.0
],
"units": "mm",
"initial_value": 20.0
},
{
"name": "support_angle",
"type": "continuous",
"bounds": [
20.0,
40.0
],
"units": "degrees",
"initial_value": 35.0
}
],
"objectives": [
{
"name": "minimize_mass",
"description": "Minimize total mass (weight reduction)",
"extractor": "mass_extractor",
"metric": "total_mass",
"direction": "minimize",
"weight": 5.0
},
{
"name": "minimize_max_stress",
"description": "Minimize maximum von Mises stress",
"extractor": "stress_extractor",
"metric": "max_von_mises",
"direction": "minimize",
"weight": 10.0
}
],
"constraints": [
{
"name": "max_displacement_limit",
"description": "Maximum allowable displacement",
"extractor": "displacement_extractor",
"metric": "max_displacement",
"type": "upper_bound",
"limit": 1.0,
"units": "mm"
},
{
"name": "max_stress_limit",
"description": "Maximum allowable von Mises stress",
"extractor": "stress_extractor",
"metric": "max_von_mises",
"type": "upper_bound",
"limit": 200.0,
"units": "MPa"
}
],
"optimization_settings": {
"n_trials": 50,
"sampler": "TPE",
"n_startup_trials": 20,
"tpe_n_ei_candidates": 24,
"tpe_multivariate": true,
"comment": "20 random trials for exploration, then 30 TPE trials for exploitation"
},
"model_info": {
"sim_file": "C:\\Users\\antoi\\Documents\\Atomaste\\Atomizer\\examples\\bracket\\Bracket_sim1.sim",
"solutions": [
{
"name": "Direct Frequency Response",
"type": "Direct Frequency Response",
"solver": "NX Nastran",
"description": "Extracted from binary .sim file"
},
{
"name": "Nonlinear Statics",
"type": "Nonlinear Statics",
"solver": "NX Nastran",
"description": "Extracted from binary .sim file"
},
{
"name": "Disable in Thermal Solution 2D",
"type": "Disable in Thermal Solution 2D",
"solver": "NX Nastran",
"description": "Extracted from binary .sim file"
},
{
"name": "Normal Modes",
"type": "Normal Modes",
"solver": "NX Nastran",
"description": "Extracted from binary .sim file"
},
{
"name": "Disable in Thermal Solution 3D",
"type": "Disable in Thermal Solution 3D",
"solver": "NX Nastran",
"description": "Extracted from binary .sim file"
},
{
"name": "DisableInThermalSolution",
"type": "DisableInThermalSolution",
"solver": "NX Nastran",
"description": "Extracted from binary .sim file"
},
{
"name": "Direct Transient Response",
"type": "Direct Transient Response",
"solver": "NX Nastran",
"description": "Extracted from binary .sim file"
},
{
"name": "-Flow-Structural Coupled Solution Parameters",
"type": "-Flow-Structural Coupled Solution Parameters",
"solver": "NX Nastran",
"description": "Extracted from binary .sim file"
},
{
"name": "\"ObjectDisableInThermalSolution2D",
"type": "\"ObjectDisableInThermalSolution2D",
"solver": "NX Nastran",
"description": "Extracted from binary .sim file"
},
{
"name": "1Pass Structural Contact Solution to Flow Solver",
"type": "1Pass Structural Contact Solution to Flow Solver",
"solver": "NX Nastran",
"description": "Extracted from binary .sim file"
},
{
"name": "Design Optimization",
"type": "Design Optimization",
"solver": "NX Nastran",
"description": "Extracted from binary .sim file"
},
{
"name": "Modal Frequency Response",
"type": "Modal Frequency Response",
"solver": "NX Nastran",
"description": "Extracted from binary .sim file"
},
{
"name": "0Thermal-Structural Coupled Solution Parameters",
"type": "0Thermal-Structural Coupled Solution Parameters",
"solver": "NX Nastran",
"description": "Extracted from binary .sim file"
},
{
"name": "*Thermal-Flow Coupled Solution Parameters",
"type": "*Thermal-Flow Coupled Solution Parameters",
"solver": "NX Nastran",
"description": "Extracted from binary .sim file"
},
{
"name": "Thermal Solution Parameters",
"type": "Thermal Solution Parameters",
"solver": "NX Nastran",
"description": "Extracted from binary .sim file"
},
{
"name": "\"ObjectDisableInThermalSolution3D",
"type": "\"ObjectDisableInThermalSolution3D",
"solver": "NX Nastran",
"description": "Extracted from binary .sim file"
},
{
"name": "Linear Statics",
"type": "Linear Statics",
"solver": "NX Nastran",
"description": "Extracted from binary .sim file"
},
{
"name": "Modal Transient Response",
"type": "Modal Transient Response",
"solver": "NX Nastran",
"description": "Extracted from binary .sim file"
}
]
}
}

View File

@@ -1,44 +0,0 @@
{
"design_variables": [
{
"name": "tip_thickness",
"type": "continuous",
"bounds": [
15.0,
25.0
],
"units": "mm",
"initial_value": 20.0
},
{
"name": "support_angle",
"type": "continuous",
"bounds": [
20.0,
40.0
],
"units": "degrees",
"initial_value": 35.0
}
],
"objectives": [
{
"name": "minimize_max_displacement",
"description": "Minimize maximum displacement (increase stiffness)",
"extractor": "displacement_extractor",
"metric": "max_displacement",
"direction": "minimize",
"weight": 1.0
}
],
"constraints": [],
"optimization_settings": {
"n_trials": 10,
"sampler": "TPE",
"n_startup_trials": 5
},
"model_info": {
"sim_file": "C:\\Users\\antoi\\Documents\\Atomaste\\Atomizer\\examples\\bracket\\Bracket_sim1.sim",
"note": "Using displacement-only objective since mass/stress not available in OP2"
}
}

View File

@@ -1,52 +0,0 @@
{
"design_variables": [
{
"name": "tip_thickness",
"type": "continuous",
"bounds": [15.0, 25.0],
"units": "mm",
"initial_value": 20.0
},
{
"name": "support_angle",
"type": "continuous",
"bounds": [20.0, 40.0],
"units": "degrees",
"initial_value": 35.0
}
],
"objectives": [
{
"name": "minimize_max_stress",
"description": "Minimize maximum von Mises stress",
"extractor": "stress_extractor",
"metric": "max_von_mises",
"direction": "minimize",
"weight": 10.0,
"units": "MPa"
}
],
"constraints": [
{
"name": "max_displacement_limit",
"description": "Maximum allowable displacement",
"extractor": "displacement_extractor",
"metric": "max_displacement",
"type": "upper_bound",
"limit": 1.0,
"units": "mm"
}
],
"optimization_settings": {
"n_trials": 50,
"sampler": "TPE",
"n_startup_trials": 20,
"tpe_n_ei_candidates": 24,
"tpe_multivariate": true,
"comment": "20 random trials for exploration, then 30 TPE trials for exploitation"
},
"model_info": {
"sim_file": "C:\\Users\\antoi\\Documents\\Atomaste\\Atomizer\\examples\\bracket\\Bracket_sim1.sim",
"note": "Stress minimization with displacement constraint (mass not available in OP2)"
}
}

View File

@@ -1,48 +0,0 @@
"""
Quick check: Verify NX installation can be found
"""
from pathlib import Path
import sys
project_root = Path(__file__).parent.parent
sys.path.insert(0, str(project_root))
from optimization_engine.nx_solver import NXSolver
print("="*60)
print("NX INSTALLATION CHECK")
print("="*60)
try:
solver = NXSolver(nastran_version="2412")
print("\n✓ NX Solver found!")
print(f"\nInstallation:")
print(f" Directory: {solver.nx_install_dir}")
print(f" Solver: {solver.solver_exe}")
print(f"\nSolver executable exists: {solver.solver_exe.exists()}")
if solver.solver_exe.exists():
print(f"Solver size: {solver.solver_exe.stat().st_size / (1024*1024):.1f} MB")
print("\n" + "="*60)
print("READY TO USE!")
print("="*60)
print("\nNext step: Run test_nx_solver.py to verify solver execution")
except FileNotFoundError as e:
print(f"\n✗ Error: {e}")
print("\nPlease check:")
print(" - NX 2412 is installed")
print(" - Installation is at standard location")
print("\nTry specifying path manually:")
print(" solver = NXSolver(")
print(" nx_install_dir=Path('C:/your/path/to/NX2412'),")
print(" nastran_version='2412'")
print(" )")
except Exception as e:
print(f"\n✗ Unexpected error: {e}")
import traceback
traceback.print_exc()

View File

@@ -1,89 +0,0 @@
"""
Check NX License Configuration
"""
import os
from pathlib import Path
print("="*60)
print("NX LICENSE CONFIGURATION CHECK")
print("="*60)
# Check environment variables
print("\n--- Environment Variables ---")
license_vars = [
'SPLM_LICENSE_SERVER',
'UGII_LICENSE_BUNDLE',
'LM_LICENSE_FILE',
'NX_LICENSE_FILE',
]
for var in license_vars:
value = os.environ.get(var)
if value:
print(f"{var} = {value}")
else:
print(f"{var} = (not set)")
# Check license server files
print("\n--- License Server Files ---")
possible_license_files = [
Path("C:/Program Files/Siemens/License Server/ugslmd.opt"),
Path("C:/Program Files/Siemens/License Server/server.lic"),
Path("C:/Program Files (x86)/Siemens/License Server/ugslmd.opt"),
]
for lic_file in possible_license_files:
if lic_file.exists():
print(f" ✓ Found: {lic_file}")
else:
print(f" ✗ Not found: {lic_file}")
# Check NX installation licensing
print("\n--- NX Installation License Info ---")
nx_dirs = [
Path("C:/Program Files/Siemens/NX2412"),
Path("C:/Program Files/Siemens/Simcenter3D_2412"),
]
for nx_dir in nx_dirs:
if nx_dir.exists():
print(f"\n{nx_dir.name}:")
license_file = nx_dir / "ugslmd.lic"
if license_file.exists():
print(f" ✓ License file: {license_file}")
else:
print(f" ✗ No ugslmd.lic found")
print("\n" + "="*60)
print("RECOMMENDATIONS:")
print("="*60)
print("""
1. If you see SPLM_LICENSE_SERVER:
- License server is configured ✓
2. If no environment variables are set:
- You may need to set SPLM_LICENSE_SERVER
- Format: port@hostname (e.g., 28000@localhost)
- Or: path to license file
3. Common fixes:
- Set environment variable in Windows:
setx SPLM_LICENSE_SERVER "28000@your-license-server"
- Or use license file:
setx SPLM_LICENSE_FILE "C:\\path\\to\\license.dat"
4. For local/node-locked license:
- Check License Server is running
- Services → Siemens License Server should be running
5. For network license:
- Verify license server hostname/IP
- Check port (usually 28000)
- Verify firewall allows connection
""")

View File

@@ -1,86 +0,0 @@
"""
Quick OP2 diagnostic script
"""
from pyNastran.op2.op2 import OP2
from pathlib import Path
op2_path = Path("examples/bracket/bracket_sim1-solution_1.op2")
print("="*60)
print("OP2 FILE DIAGNOSTIC")
print("="*60)
print(f"File: {op2_path}")
op2 = OP2()
op2.read_op2(str(op2_path))
print("\n--- AVAILABLE DATA ---")
print(f"Has displacements: {hasattr(op2, 'displacements') and bool(op2.displacements)}")
print(f"Has velocities: {hasattr(op2, 'velocities') and bool(op2.velocities)}")
print(f"Has accelerations: {hasattr(op2, 'accelerations') and bool(op2.accelerations)}")
# Check stress tables
stress_tables = {
'cquad4_stress': 'CQUAD4 elements',
'ctria3_stress': 'CTRIA3 elements',
'ctetra_stress': 'CTETRA elements',
'chexa_stress': 'CHEXA elements',
'cbar_stress': 'CBAR elements'
}
print("\n--- STRESS TABLES ---")
has_stress = False
for table, desc in stress_tables.items():
if hasattr(op2, table):
table_obj = getattr(op2, table)
if table_obj:
has_stress = True
subcases = list(table_obj.keys())
print(f"\n{table} ({desc}): Subcases {subcases}")
# Show data from first subcase
if subcases:
data = table_obj[subcases[0]]
print(f" Data shape: {data.data.shape}")
print(f" Data dimensions: timesteps={data.data.shape[0]}, elements={data.data.shape[1]}, values={data.data.shape[2]}")
print(f" All data min: {data.data.min():.6f}")
print(f" All data max: {data.data.max():.6f}")
# Check each column
print(f" Column-wise max values:")
for col in range(data.data.shape[2]):
col_max = data.data[0, :, col].max()
print(f" Column {col}: {col_max:.6f}")
# Find max von Mises (usually last column)
von_mises_col = data.data[0, :, -1]
max_vm = von_mises_col.max()
max_idx = von_mises_col.argmax()
print(f" Von Mises (last column):")
print(f" Max: {max_vm:.6f} at element index {max_idx}")
if not has_stress:
print("NO STRESS DATA FOUND")
# Check displacements
if hasattr(op2, 'displacements') and op2.displacements:
print("\n--- DISPLACEMENTS ---")
subcases = list(op2.displacements.keys())
print(f"Subcases: {subcases}")
for subcase in subcases:
disp = op2.displacements[subcase]
print(f"Subcase {subcase}:")
print(f" Shape: {disp.data.shape}")
print(f" Max displacement: {disp.data.max():.6f}")
# Check grid point weight (mass)
if hasattr(op2, 'grid_point_weight') and op2.grid_point_weight:
print("\n--- GRID POINT WEIGHT (MASS) ---")
gpw = op2.grid_point_weight
print(f"Total mass: {gpw.mass.sum():.6f}")
else:
print("\n--- GRID POINT WEIGHT (MASS) ---")
print("NOT AVAILABLE - Add PARAM,GRDPNT,0 to Nastran deck")
print("\n" + "="*60)

View File

@@ -1,88 +0,0 @@
"""
Deep diagnostic to find where stress data is hiding in the OP2 file.
"""
from pathlib import Path
from pyNastran.op2.op2 import OP2
op2_path = Path("examples/bracket/bracket_sim1-solution_1.op2")
print("="*60)
print("DEEP OP2 STRESS DIAGNOSTIC")
print("="*60)
print(f"File: {op2_path}")
print()
op2 = OP2()
op2.read_op2(str(op2_path))
# List ALL attributes that might contain stress
print("--- SEARCHING FOR STRESS DATA ---")
print()
# Check all attributes
all_attrs = dir(op2)
stress_related = [attr for attr in all_attrs if 'stress' in attr.lower() or 'oes' in attr.lower()]
print("Attributes with 'stress' or 'oes' in name:")
for attr in stress_related:
obj = getattr(op2, attr, None)
if obj and not callable(obj):
print(f" {attr}: {type(obj)}")
if hasattr(obj, 'keys'):
print(f" Keys: {list(obj.keys())}")
if obj:
first_key = list(obj.keys())[0]
first_obj = obj[first_key]
print(f" First item type: {type(first_obj)}")
if hasattr(first_obj, 'data'):
print(f" Data shape: {first_obj.data.shape}")
print(f" Data type: {first_obj.data.dtype}")
if hasattr(first_obj, '__dict__'):
attrs = [a for a in dir(first_obj) if not a.startswith('_')]
print(f" Available methods/attrs: {attrs[:10]}...")
print()
print("--- CHECKING STANDARD STRESS TABLES ---")
standard_tables = [
'cquad4_stress',
'ctria3_stress',
'ctetra_stress',
'chexa_stress',
'cpenta_stress',
'cbar_stress',
'cbeam_stress',
]
for table_name in standard_tables:
if hasattr(op2, table_name):
table = getattr(op2, table_name)
print(f"\n{table_name}:")
print(f" Exists: {table is not None}")
print(f" Type: {type(table)}")
print(f" Bool: {bool(table)}")
if table:
print(f" Keys: {list(table.keys())}")
if table.keys():
first_key = list(table.keys())[0]
data = table[first_key]
print(f" Data type: {type(data)}")
print(f" Data shape: {data.data.shape if hasattr(data, 'data') else 'No data attr'}")
# Try to inspect the data object
if hasattr(data, 'data'):
print(f" Data min: {data.data.min():.6f}")
print(f" Data max: {data.data.max():.6f}")
# Show column-wise max
if len(data.data.shape) == 3:
print(f" Column-wise max values:")
for col in range(data.data.shape[2]):
col_max = data.data[0, :, col].max()
col_min = data.data[0, :, col].min()
print(f" Column {col}: min={col_min:.6f}, max={col_max:.6f}")
print()
print("="*60)

View File

@@ -0,0 +1,449 @@
"""
Interactive Research Agent Session
This example demonstrates real-time learning and interaction with the Research Agent.
Users can make requests, provide examples, and see the agent learn and generate code.
Author: Atomizer Development Team
Version: 0.1.0 (Phase 3)
Last Updated: 2025-01-16
"""
import sys
from pathlib import Path
from typing import Optional, Dict, Any
# Set UTF-8 encoding for Windows console
if sys.platform == 'win32':
import codecs
# Only wrap if not already wrapped
if not isinstance(sys.stdout, codecs.StreamWriter):
if hasattr(sys.stdout, 'buffer'):
sys.stdout = codecs.getwriter('utf-8')(sys.stdout.buffer, errors='replace')
sys.stderr = codecs.getwriter('utf-8')(sys.stderr.buffer, errors='replace')
# Add project root to path
project_root = Path(__file__).parent.parent
sys.path.insert(0, str(project_root))
from optimization_engine.research_agent import (
ResearchAgent,
ResearchFindings,
KnowledgeGap,
CONFIDENCE_LEVELS
)
class InteractiveResearchSession:
"""Interactive session manager for Research Agent conversations."""
def __init__(self, auto_mode: bool = False):
self.agent = ResearchAgent()
self.conversation_history = []
self.current_gap: Optional[KnowledgeGap] = None
self.current_findings: Optional[ResearchFindings] = None
self.auto_mode = auto_mode # For automated testing
def print_header(self, text: str, char: str = "="):
"""Print formatted header."""
print(f"\n{char * 80}")
print(text)
print(f"{char * 80}\n")
def print_section(self, text: str):
"""Print section divider."""
print(f"\n{'-' * 80}")
print(text)
print(f"{'-' * 80}\n")
def display_knowledge_gap(self, gap: KnowledgeGap):
"""Display detected knowledge gap in user-friendly format."""
print(" Knowledge Gap Analysis:")
print(f"\n Missing Features ({len(gap.missing_features)}):")
for feature in gap.missing_features:
print(f" - {feature}")
print(f"\n Missing Knowledge ({len(gap.missing_knowledge)}):")
for knowledge in gap.missing_knowledge:
print(f" - {knowledge}")
print(f"\n Confidence Level: {gap.confidence:.0%}")
if gap.confidence < 0.5:
print(" Status: New domain - Learning required")
elif gap.confidence < 0.8:
print(" Status: Partial knowledge - Some research needed")
else:
print(" Status: Known domain - Can reuse existing knowledge")
def display_research_plan(self, plan):
"""Display research plan in user-friendly format."""
# Handle both ResearchPlan objects and lists
steps = plan.steps if hasattr(plan, 'steps') else plan
print(" Research Plan Created:")
print(f"\n Will gather knowledge in {len(steps)} steps:\n")
for i, step in enumerate(steps, 1):
action = step['action'].replace('_', ' ').title()
confidence = step['expected_confidence']
print(f" Step {i}: {action}")
print(f" Expected confidence: {confidence:.0%}")
if 'details' in step:
if 'prompt' in step['details']:
print(f" What I'll ask: \"{step['details']['prompt'][:60]}...\"")
elif 'query' in step['details']:
print(f" Search query: \"{step['details']['query']}\"")
print()
def ask_for_example(self, prompt: str, file_types: list) -> Optional[str]:
"""Ask user for an example file or content."""
print(f" {prompt}\n")
print(f" Suggested file types: {', '.join(file_types)}\n")
print(" Options:")
print(" 1. Enter file path to existing example")
print(" 2. Paste example content directly")
print(" 3. Skip (type 'skip')\n")
user_input = input(" Your choice: ").strip()
if user_input.lower() == 'skip':
return None
# Check if it's a file path
file_path = Path(user_input)
if file_path.exists() and file_path.is_file():
try:
content = file_path.read_text(encoding='utf-8')
print(f"\n Loaded {len(content)} characters from {file_path.name}")
return content
except Exception as e:
print(f"\n Error reading file: {e}")
return None
# Otherwise, treat as direct content
if len(user_input) > 10: # Minimum reasonable example size
print(f"\n Received {len(user_input)} characters of example content")
return user_input
print("\n Input too short to be a valid example")
return None
def execute_research_plan(self, gap: KnowledgeGap) -> ResearchFindings:
"""Execute research plan interactively."""
plan = self.agent.create_research_plan(gap)
self.display_research_plan(plan)
# Handle both ResearchPlan objects and lists
steps = plan.steps if hasattr(plan, 'steps') else plan
sources = {}
raw_data = {}
confidence_scores = {}
for i, step in enumerate(steps, 1):
action = step['action']
print(f"\n Executing Step {i}/{len(steps)}: {action.replace('_', ' ').title()}")
print(" " + "-" * 76)
if action == 'ask_user_for_example':
prompt = step['details']['prompt']
file_types = step['details'].get('suggested_file_types', ['.xml', '.py'])
example_content = self.ask_for_example(prompt, file_types)
if example_content:
sources['user_example'] = 'user_provided_example'
raw_data['user_example'] = example_content
confidence_scores['user_example'] = CONFIDENCE_LEVELS['user_validated']
print(f" Step {i} completed with high confidence ({CONFIDENCE_LEVELS['user_validated']:.0%})")
else:
print(f" Step {i} skipped by user")
elif action == 'search_knowledge_base':
query = step['details']['query']
print(f" Searching knowledge base for: \"{query}\"")
result = self.agent.search_knowledge_base(query)
if result and result['confidence'] > 0.7:
sources['knowledge_base'] = result['session_id']
raw_data['knowledge_base'] = result
confidence_scores['knowledge_base'] = result['confidence']
print(f" Found existing knowledge! Session: {result['session_id']}")
print(f" Confidence: {result['confidence']:.0%}, Relevance: {result['relevance_score']:.0%}")
else:
print(f" No reliable existing knowledge found")
elif action == 'query_nx_mcp':
query = step['details']['query']
print(f" Would query NX MCP server: \"{query}\"")
print(f" (MCP integration pending - Phase 3)")
confidence_scores['nx_mcp'] = 0.0 # Not yet implemented
elif action == 'web_search':
query = step['details']['query']
print(f" Would search web: \"{query}\"")
print(f" (Web search integration pending - Phase 3)")
confidence_scores['web_search'] = 0.0 # Not yet implemented
elif action == 'search_nxopen_tse':
query = step['details']['query']
print(f" Would search NXOpen TSE: \"{query}\"")
print(f" (TSE search pending - Phase 3)")
confidence_scores['tse_search'] = 0.0 # Not yet implemented
return ResearchFindings(
sources=sources,
raw_data=raw_data,
confidence_scores=confidence_scores
)
def display_learning_results(self, knowledge):
"""Display what the agent learned."""
print(" Knowledge Synthesized:")
print(f"\n Overall Confidence: {knowledge.confidence:.0%}\n")
if knowledge.schema:
if 'xml_structure' in knowledge.schema:
xml_schema = knowledge.schema['xml_structure']
print(f" Learned XML Structure:")
print(f" Root element: <{xml_schema['root_element']}>")
if xml_schema.get('attributes'):
print(f" Attributes: {xml_schema['attributes']}")
print(f" Required fields ({len(xml_schema['required_fields'])}):")
for field in xml_schema['required_fields']:
print(f"{field}")
if xml_schema.get('optional_fields'):
print(f" Optional fields ({len(xml_schema['optional_fields'])}):")
for field in xml_schema['optional_fields']:
print(f"{field}")
if knowledge.patterns:
print(f"\n Patterns Identified: {len(knowledge.patterns)}")
if isinstance(knowledge.patterns, dict):
for pattern_type, pattern_list in knowledge.patterns.items():
print(f" {pattern_type}: {len(pattern_list)} found")
else:
print(f" Total patterns: {len(knowledge.patterns)}")
def generate_and_save_feature(self, feature_name: str, knowledge) -> Optional[Path]:
"""Generate feature code and save to file."""
print(f"\n Designing feature: {feature_name}")
feature_spec = self.agent.design_feature(knowledge, feature_name)
print(f" Category: {feature_spec['category']}")
print(f" Lifecycle stage: {feature_spec['lifecycle_stage']}")
print(f" Input parameters: {len(feature_spec['interface']['inputs'])}")
print(f"\n Generating Python code...")
generated_code = self.agent.generate_feature_code(feature_spec, knowledge)
print(f" Generated {len(generated_code)} characters ({len(generated_code.split(chr(10)))} lines)")
# Validate syntax
try:
compile(generated_code, '<generated>', 'exec')
print(f" Code is syntactically valid Python")
except SyntaxError as e:
print(f" Syntax error: {e}")
return None
# Save to file
output_file = feature_spec['implementation']['file_path']
output_path = project_root / output_file
output_path.parent.mkdir(parents=True, exist_ok=True)
output_path.write_text(generated_code, encoding='utf-8')
print(f"\n Saved to: {output_file}")
return output_path
def handle_request(self, user_request: str):
"""Handle a user request through the full research workflow."""
self.print_header(f"Processing Request: {user_request[:60]}...")
# Step 1: Identify knowledge gap
self.print_section("[Step 1] Analyzing Knowledge Gap")
gap = self.agent.identify_knowledge_gap(user_request)
self.display_knowledge_gap(gap)
self.current_gap = gap
# Check if we can skip research
if not gap.research_needed:
print("\n I already have the knowledge to handle this!")
print(" Proceeding directly to generation...\n")
# In a full implementation, would generate directly here
return
# Step 2: Execute research plan
self.print_section("[Step 2] Executing Research Plan")
findings = self.execute_research_plan(gap)
self.current_findings = findings
# Step 3: Synthesize knowledge
self.print_section("[Step 3] Synthesizing Knowledge")
knowledge = self.agent.synthesize_knowledge(findings)
self.display_learning_results(knowledge)
# Step 4: Generate feature
if knowledge.confidence > 0.5:
self.print_section("[Step 4] Generating Feature Code")
# Extract feature name from request
feature_name = user_request.lower().replace(' ', '_')[:30]
if not feature_name.isidentifier():
feature_name = "generated_feature"
output_file = self.generate_and_save_feature(feature_name, knowledge)
if output_file:
# Step 5: Document session
self.print_section("[Step 5] Documenting Research Session")
topic = feature_name
session_path = self.agent.document_session(
topic=topic,
knowledge_gap=gap,
findings=findings,
knowledge=knowledge,
generated_files=[str(output_file)]
)
print(f" Session documented: {session_path.name}")
print(f" Files created:")
for file in session_path.iterdir():
if file.is_file():
print(f"{file.name}")
self.print_header("Request Completed Successfully!", "=")
print(f" Generated file: {output_file.relative_to(project_root)}")
print(f" Knowledge confidence: {knowledge.confidence:.0%}")
print(f" Session saved: {session_path.name}\n")
else:
print(f"\n Confidence too low ({knowledge.confidence:.0%}) to generate reliable code")
print(f" Try providing more examples or information\n")
def run(self):
"""Run interactive session."""
self.print_header("Interactive Research Agent Session", "=")
print(" Welcome! I'm your Research Agent. I can learn from examples and")
print(" generate code for optimization features.\n")
print(" Commands:")
print(" • Type your request in natural language")
print(" • Type 'demo' for a demonstration")
print(" • Type 'quit' to exit\n")
while True:
try:
user_input = input("\nYour request: ").strip()
if not user_input:
continue
if user_input.lower() in ['quit', 'exit', 'q']:
print("\n Goodbye! Session ended.\n")
break
if user_input.lower() == 'demo':
self.run_demo()
continue
# Process the request
self.handle_request(user_input)
except KeyboardInterrupt:
print("\n\n Goodbye! Session ended.\n")
break
except Exception as e:
print(f"\n Error: {e}")
import traceback
traceback.print_exc()
def run_demo(self):
"""Run a demonstration of the Research Agent capabilities."""
self.print_header("Research Agent Demonstration", "=")
print(" This demo will show:")
print(" 1. Learning from a user example (material XML)")
print(" 2. Generating Python code from learned pattern")
print(" 3. Reusing knowledge for a second request\n")
if not self.auto_mode:
input(" Press Enter to start demo...")
# Demo request 1: Learn from steel example
demo_request_1 = "Create an NX material XML generator for steel"
print(f"\n Demo Request 1: \"{demo_request_1}\"\n")
# Provide example automatically for demo
example_xml = """<?xml version="1.0" encoding="UTF-8"?>
<PhysicalMaterial name="Steel_AISI_1020" version="1.0">
<Density units="kg/m3">7850</Density>
<YoungModulus units="GPa">200</YoungModulus>
<PoissonRatio>0.29</PoissonRatio>
<ThermalExpansion units="1/K">1.17e-05</ThermalExpansion>
<YieldStrength units="MPa">295</YieldStrength>
</PhysicalMaterial>"""
print(" [Auto-providing example for demo]\n")
gap1 = self.agent.identify_knowledge_gap(demo_request_1)
self.display_knowledge_gap(gap1)
findings1 = ResearchFindings(
sources={'user_example': 'steel_material.xml'},
raw_data={'user_example': example_xml},
confidence_scores={'user_example': CONFIDENCE_LEVELS['user_validated']}
)
knowledge1 = self.agent.synthesize_knowledge(findings1)
self.display_learning_results(knowledge1)
output_file1 = self.generate_and_save_feature("nx_material_generator_demo", knowledge1)
if output_file1:
print(f"\n First request completed!")
print(f" Generated: {output_file1.name}\n")
if not self.auto_mode:
input(" Press Enter for second request (knowledge reuse demo)...")
# Demo request 2: Reuse learned knowledge
demo_request_2 = "Create aluminum 6061-T6 material XML"
print(f"\n Demo Request 2: \"{demo_request_2}\"\n")
gap2 = self.agent.identify_knowledge_gap(demo_request_2)
self.display_knowledge_gap(gap2)
if gap2.confidence > 0.7:
print("\n Knowledge Reuse Success!")
print(" I already learned the material XML structure from your first request.")
print(" No need to ask for another example!\n")
print("\n Demo completed! Notice how:")
print(" • First request: Low confidence, asked for example")
print(" • Second request: High confidence, reused learned template")
print(" • This is the power of learning and knowledge accumulation!\n")
def main():
"""Main entry point for interactive research session."""
session = InteractiveResearchSession()
session.run()
if __name__ == '__main__':
main()

View File

@@ -1,206 +0,0 @@
"""
Example: Running Complete Optimization
This example demonstrates the complete optimization workflow:
1. Load optimization configuration
2. Update NX model parameters
3. Run simulation (dummy for now - would call NX solver)
4. Extract results from OP2
5. Optimize with Optuna
For a real run, you would need:
- pyNastran installed for OP2 extraction
- NX solver accessible to run simulations
"""
from pathlib import Path
import sys
# Add project root to path
project_root = Path(__file__).parent.parent
sys.path.insert(0, str(project_root))
from optimization_engine.runner import OptimizationRunner
from optimization_engine.nx_updater import update_nx_model
# ==================================================
# STEP 1: Define model updater function
# ==================================================
def bracket_model_updater(design_vars: dict):
"""
Update the bracket model with new design variable values.
Args:
design_vars: Dict like {'tip_thickness': 22.5, 'support_angle': 35.0}
"""
prt_file = project_root / "examples/bracket/Bracket.prt"
print(f"\n[MODEL UPDATE] Updating {prt_file.name} with:")
for name, value in design_vars.items():
print(f" {name} = {value:.4f}")
# Update the .prt file with new parameter values
update_nx_model(prt_file, design_vars, backup=False)
print("[MODEL UPDATE] Complete")
# ==================================================
# STEP 2: Define simulation runner function
# ==================================================
def bracket_simulation_runner() -> Path:
"""
Run NX simulation and return path to result files.
In a real implementation, this would:
1. Open NX (or use batch mode)
2. Update the .sim file
3. Run the solver
4. Wait for completion
5. Return path to .op2 file
For now, we return the path to existing results.
"""
print("\n[SIMULATION] Running NX Nastran solver...")
print("[SIMULATION] (Using existing results for demonstration)")
# In real use, this would run the actual solver
# For now, return path to existing OP2 file
result_file = project_root / "examples/bracket/bracket_sim1-solution_1.op2"
if not result_file.exists():
raise FileNotFoundError(f"Result file not found: {result_file}")
print(f"[SIMULATION] Results: {result_file.name}")
return result_file
# ==================================================
# STEP 3: Define result extractors (dummy versions)
# ==================================================
def dummy_mass_extractor(result_path: Path) -> dict:
"""
Dummy mass extractor.
In real use, would call: from optimization_engine.result_extractors.extractors import mass_extractor
"""
import random
# Simulate varying mass based on a simple model
# In reality, this would extract from OP2
base_mass = 0.45 # kg
variation = random.uniform(-0.05, 0.05)
return {
'total_mass': base_mass + variation,
'cg_x': 0.0,
'cg_y': 0.0,
'cg_z': 0.0,
'units': 'kg'
}
def dummy_stress_extractor(result_path: Path) -> dict:
"""
Dummy stress extractor.
In real use, would call: from optimization_engine.result_extractors.extractors import stress_extractor
"""
import random
# Simulate stress results
base_stress = 180.0 # MPa
variation = random.uniform(-30.0, 30.0)
return {
'max_von_mises': base_stress + variation,
'stress_type': 'von_mises',
'element_id': 1234,
'units': 'MPa'
}
def dummy_displacement_extractor(result_path: Path) -> dict:
"""
Dummy displacement extractor.
In real use, would call: from optimization_engine.result_extractors.extractors import displacement_extractor
"""
import random
# Simulate displacement results
base_disp = 0.9 # mm
variation = random.uniform(-0.2, 0.2)
return {
'max_displacement': base_disp + variation,
'max_node_id': 5678,
'dx': 0.0,
'dy': 0.0,
'dz': base_disp + variation,
'units': 'mm'
}
# ==================================================
# MAIN: Run optimization
# ==================================================
if __name__ == "__main__":
print("="*60)
print("ATOMIZER - OPTIMIZATION EXAMPLE")
print("="*60)
# Path to optimization configuration
config_path = project_root / "examples/bracket/optimization_config.json"
if not config_path.exists():
print(f"Error: Configuration file not found: {config_path}")
print("Please run the MCP build_optimization_config tool first.")
sys.exit(1)
print(f"\nConfiguration: {config_path}")
# Create result extractors dict
extractors = {
'mass_extractor': dummy_mass_extractor,
'stress_extractor': dummy_stress_extractor,
'displacement_extractor': dummy_displacement_extractor
}
# Create optimization runner
runner = OptimizationRunner(
config_path=config_path,
model_updater=bracket_model_updater,
simulation_runner=bracket_simulation_runner,
result_extractors=extractors
)
# Run optimization (use fewer trials for demo)
print("\n" + "="*60)
print("Starting optimization with 10 trials (demo)")
print("For full optimization, modify n_trials in config")
print("="*60)
# Override n_trials for demo
runner.config['optimization_settings']['n_trials'] = 10
# Run!
study = runner.run(study_name="bracket_optimization_demo")
print("\n" + "="*60)
print("OPTIMIZATION RESULTS")
print("="*60)
print(f"\nBest parameters found:")
for param, value in study.best_params.items():
print(f" {param}: {value:.4f}")
print(f"\nBest objective value: {study.best_value:.6f}")
print(f"\nResults saved to: {runner.output_dir}")
print(" - history.csv (all trials)")
print(" - history.json (detailed results)")
print(" - optimization_summary.json (best results)")
print("\n" + "="*60)
print("NEXT STEPS:")
print("="*60)
print("1. Install pyNastran: conda install -c conda-forge pynastran")
print("2. Replace dummy extractors with real OP2 extractors")
print("3. Integrate with NX solver (batch mode or NXOpen)")
print("4. Run full optimization with n_trials=100+")
print("="*60)

View File

@@ -1,166 +0,0 @@
"""
Example: Running Complete Optimization WITH REAL OP2 EXTRACTION
This version uses real pyNastran extractors instead of dummy data.
Requirements:
- conda activate test_env (with pyNastran and optuna installed)
What this does:
1. Updates NX model parameters in the .prt file
2. Uses existing OP2 results (simulation step skipped for now)
3. Extracts REAL mass, stress, displacement from OP2
4. Runs Optuna optimization
Note: Since we're using the same OP2 file for all trials (no re-solving),
the results will be constant. This is just to test the pipeline.
For real optimization, you'd need to run NX solver for each trial.
"""
from pathlib import Path
import sys
# Add project root to path
project_root = Path(__file__).parent.parent
sys.path.insert(0, str(project_root))
from optimization_engine.runner import OptimizationRunner
from optimization_engine.nx_updater import update_nx_model
from optimization_engine.result_extractors.extractors import (
mass_extractor,
stress_extractor,
displacement_extractor
)
# ==================================================
# STEP 1: Define model updater function
# ==================================================
def bracket_model_updater(design_vars: dict):
"""
Update the bracket model with new design variable values.
Args:
design_vars: Dict like {'tip_thickness': 22.5, 'support_angle': 35.0}
"""
prt_file = project_root / "examples/bracket/Bracket.prt"
print(f"\n[MODEL UPDATE] Updating {prt_file.name} with:")
for name, value in design_vars.items():
print(f" {name} = {value:.4f}")
# Update the .prt file with new parameter values
update_nx_model(prt_file, design_vars, backup=False)
print("[MODEL UPDATE] Complete")
# ==================================================
# STEP 2: Define simulation runner function
# ==================================================
def bracket_simulation_runner() -> Path:
"""
Run NX simulation and return path to result files.
For this demo, we just return the existing OP2 file.
In production, this would:
1. Run NX solver with updated model
2. Wait for completion
3. Return path to new OP2 file
"""
print("\n[SIMULATION] Running NX Nastran solver...")
print("[SIMULATION] (Using existing OP2 for demo - no actual solve)")
# Return path to existing OP2 file
result_file = project_root / "examples/bracket/bracket_sim1-solution_1.op2"
if not result_file.exists():
raise FileNotFoundError(f"Result file not found: {result_file}")
print(f"[SIMULATION] Results: {result_file.name}")
return result_file
# ==================================================
# MAIN: Run optimization
# ==================================================
if __name__ == "__main__":
print("="*60)
print("ATOMIZER - REAL OPTIMIZATION TEST")
print("="*60)
# Path to optimization configuration
config_path = project_root / "examples/bracket/optimization_config.json"
if not config_path.exists():
print(f"Error: Configuration file not found: {config_path}")
print("Please run the MCP build_optimization_config tool first.")
sys.exit(1)
print(f"\nConfiguration: {config_path}")
# Use REAL extractors
print("\nUsing REAL OP2 extractors (pyNastran)")
extractors = {
'mass_extractor': mass_extractor,
'stress_extractor': stress_extractor,
'displacement_extractor': displacement_extractor
}
# Create optimization runner
runner = OptimizationRunner(
config_path=config_path,
model_updater=bracket_model_updater,
simulation_runner=bracket_simulation_runner,
result_extractors=extractors
)
# Run optimization with just 5 trials for testing
print("\n" + "="*60)
print("Starting optimization with 5 trials (test mode)")
print("="*60)
print("\nNOTE: Since we're using the same OP2 file for all trials")
print("(not re-running solver), results will be constant.")
print("This is just to test the pipeline integration.")
print("="*60)
# Override n_trials for demo
runner.config['optimization_settings']['n_trials'] = 5
try:
# Run!
study = runner.run(study_name="bracket_real_extraction_test")
print("\n" + "="*60)
print("TEST COMPLETE - PIPELINE WORKS!")
print("="*60)
print(f"\nBest parameters found:")
for param, value in study.best_params.items():
print(f" {param}: {value:.4f}")
print(f"\nBest objective value: {study.best_value:.6f}")
print(f"\nResults saved to: {runner.output_dir}")
print(" - history.csv (all trials)")
print(" - history.json (detailed results)")
print(" - optimization_summary.json (best results)")
print("\n" + "="*60)
print("NEXT STEPS:")
print("="*60)
print("1. Check the history.csv to see extracted values")
print("2. Integrate NX solver execution (batch mode)")
print("3. Run real optimization with solver re-runs")
print("="*60)
except Exception as e:
print(f"\n{'='*60}")
print("ERROR DURING OPTIMIZATION")
print("="*60)
print(f"Error: {e}")
print("\nMake sure you're running in test_env with:")
print(" - pyNastran installed")
print(" - optuna installed")
print(" - pandas installed")
import traceback
traceback.print_exc()

View File

@@ -1,261 +0,0 @@
"""
Study Management Example
This script demonstrates how to use the study management features:
1. Create a new study
2. Resume an existing study to add more trials
3. List all available studies
4. Create a new study after topology/configuration changes
"""
import sys
from pathlib import Path
# Add project root to path
project_root = Path(__file__).parent.parent
sys.path.insert(0, str(project_root))
from optimization_engine.runner import OptimizationRunner
from optimization_engine.nx_solver import run_nx_simulation
from optimization_engine.result_extractors import (
extract_stress_from_op2,
extract_displacement_from_op2
)
def bracket_model_updater(design_vars: dict):
"""Update bracket model with new design variable values."""
from integration.nx_expression_updater import update_expressions_from_file
sim_file = Path('examples/bracket/Bracket_sim1.sim')
# Map design variables to NX expressions
expressions = {
'tip_thickness': design_vars['tip_thickness'],
'support_angle': design_vars['support_angle']
}
update_expressions_from_file(
sim_file=sim_file,
expressions=expressions
)
def bracket_simulation_runner() -> Path:
"""Run bracket simulation using journal-based NX solver."""
sim_file = Path('examples/bracket/Bracket_sim1.sim')
op2_file = run_nx_simulation(
sim_file=sim_file,
nastran_version='2412',
timeout=300,
cleanup=False,
use_journal=True
)
return op2_file
def stress_extractor(result_path: Path) -> dict:
"""Extract stress results from OP2."""
results = extract_stress_from_op2(result_path)
return results
def displacement_extractor(result_path: Path) -> dict:
"""Extract displacement results from OP2."""
results = extract_displacement_from_op2(result_path)
return results
def example_1_new_study():
"""
Example 1: Create a new optimization study with 20 trials
"""
print("\n" + "="*70)
print("EXAMPLE 1: Creating a New Study")
print("="*70)
config_path = Path('examples/bracket/optimization_config_stress_displacement.json')
runner = OptimizationRunner(
config_path=config_path,
model_updater=bracket_model_updater,
simulation_runner=bracket_simulation_runner,
result_extractors={
'stress_extractor': stress_extractor,
'displacement_extractor': displacement_extractor
}
)
# Create a new study with a specific name
# This uses the config's n_trials (50) unless overridden
study = runner.run(
study_name="bracket_optimization_v1",
n_trials=20, # Override to 20 trials for this example
resume=False # Create new study
)
print("\nStudy completed successfully!")
print(f"Database saved to: {runner._get_study_db_path('bracket_optimization_v1')}")
def example_2_resume_study():
"""
Example 2: Resume an existing study to add more trials
"""
print("\n" + "="*70)
print("EXAMPLE 2: Resuming an Existing Study")
print("="*70)
config_path = Path('examples/bracket/optimization_config_stress_displacement.json')
runner = OptimizationRunner(
config_path=config_path,
model_updater=bracket_model_updater,
simulation_runner=bracket_simulation_runner,
result_extractors={
'stress_extractor': stress_extractor,
'displacement_extractor': displacement_extractor
}
)
# Resume the study created in example 1
# Add 30 more trials (bringing total to 50)
study = runner.run(
study_name="bracket_optimization_v1",
n_trials=30, # Additional trials to run
resume=True # Resume existing study
)
print("\nStudy resumed and expanded successfully!")
print(f"Total trials: {len(study.trials)}")
def example_3_list_studies():
"""
Example 3: List all available studies
"""
print("\n" + "="*70)
print("EXAMPLE 3: Listing All Studies")
print("="*70)
config_path = Path('examples/bracket/optimization_config_stress_displacement.json')
runner = OptimizationRunner(
config_path=config_path,
model_updater=bracket_model_updater,
simulation_runner=bracket_simulation_runner,
result_extractors={
'stress_extractor': stress_extractor,
'displacement_extractor': displacement_extractor
}
)
studies = runner.list_studies()
if not studies:
print("No studies found.")
else:
print(f"\nFound {len(studies)} studies:\n")
for study in studies:
print(f"Study: {study['study_name']}")
print(f" Created: {study['created_at']}")
print(f" Total trials: {study.get('total_trials', 0)}")
print(f" Resume count: {study.get('resume_count', 0)}")
print(f" Config hash: {study.get('config_hash', 'N/A')[:8]}...")
print()
def example_4_new_study_after_change():
"""
Example 4: Create a new study after topology/configuration changes
This demonstrates what to do when:
- Geometry topology has changed significantly
- Design variables have been added/removed
- Objectives have changed
In these cases, the surrogate model from the previous study is no longer valid,
so you should create a NEW study rather than resume.
"""
print("\n" + "="*70)
print("EXAMPLE 4: New Study After Configuration Change")
print("="*70)
print("\nScenario: Bracket topology was modified, added new design variable")
print("Old surrogate is invalid -> Create NEW study with different name\n")
config_path = Path('examples/bracket/optimization_config_stress_displacement.json')
runner = OptimizationRunner(
config_path=config_path,
model_updater=bracket_model_updater,
simulation_runner=bracket_simulation_runner,
result_extractors={
'stress_extractor': stress_extractor,
'displacement_extractor': displacement_extractor
}
)
# Create a NEW study with a different name
# Version number (v2) indicates this is a different geometry/configuration
study = runner.run(
study_name="bracket_optimization_v2", # Different name!
n_trials=50,
resume=False # New study, not resuming
)
print("\nNew study created for modified configuration!")
print("Old study (v1) remains unchanged in database.")
if __name__ == "__main__":
print("="*70)
print("STUDY MANAGEMENT DEMONSTRATION")
print("="*70)
print("\nThis script demonstrates study management features:")
print("1. Create new study")
print("2. Resume existing study (add more trials)")
print("3. List all studies")
print("4. Create new study after topology change")
print("\nREQUIREMENT: Simcenter3D must be OPEN")
print("="*70)
response = input("\nIs Simcenter3D open? (yes/no): ")
if response.lower() not in ['yes', 'y']:
print("Please open Simcenter3D and try again.")
sys.exit(0)
print("\n" + "="*70)
print("Which example would you like to run?")
print("="*70)
print("1. Create a new study (20 trials)")
print("2. Resume existing study 'bracket_optimization_v1' (+30 trials)")
print("3. List all available studies")
print("4. Create new study after topology change (50 trials)")
print("0. Exit")
print("="*70)
choice = input("\nEnter choice (0-4): ").strip()
try:
if choice == '1':
example_1_new_study()
elif choice == '2':
example_2_resume_study()
elif choice == '3':
example_3_list_studies()
elif choice == '4':
example_4_new_study_after_change()
elif choice == '0':
print("Exiting.")
else:
print("Invalid choice.")
except Exception as e:
print("\n" + "="*70)
print("ERROR")
print("="*70)
print(f"{e}")
import traceback
traceback.print_exc()

View File

@@ -1,80 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Sample NX Simulation File for Testing -->
<!-- This is a simplified representation of an actual .sim file -->
<SimulationModel version="2412">
<Metadata>
<Name>test_bracket</Name>
<Description>Simple bracket structural analysis</Description>
<NXVersion>NX 2412</NXVersion>
<CreatedDate>2025-11-15</CreatedDate>
</Metadata>
<!-- Solution Definitions -->
<Solutions>
<Solution name="Structural Analysis 1" type="Static Structural" solver="NX Nastran">
<Description>Linear static analysis under load</Description>
<SolverSettings>
<SolverType>101</SolverType>
<LinearSolver>Direct</LinearSolver>
</SolverSettings>
</Solution>
</Solutions>
<!-- Expressions (Parametric Variables) -->
<Expressions>
<Expression name="wall_thickness" value="5.0" units="mm">
<Formula>5.0</Formula>
<Type>Dimension</Type>
</Expression>
<Expression name="hole_diameter" value="10.0" units="mm">
<Formula>10.0</Formula>
<Type>Dimension</Type>
</Expression>
<Expression name="rib_spacing" value="40.0" units="mm">
<Formula>40.0</Formula>
<Type>Dimension</Type>
</Expression>
<Expression name="material_density" value="2.7" units="g/cm^3">
<Formula>2.7</Formula>
<Type>Material Property</Type>
</Expression>
</Expressions>
<!-- FEM Model -->
<FEM>
<Mesh name="Bracket Mesh" element_size="2.5" node_count="8234" element_count="4521">
<ElementTypes>
<ElementType type="CQUAD4"/>
<ElementType type="CTRIA3"/>
</ElementTypes>
</Mesh>
<Materials>
<Material name="Aluminum 6061-T6" type="Isotropic">
<Property name="youngs_modulus" value="68.9e9" units="Pa"/>
<Property name="poissons_ratio" value="0.33" units=""/>
<Property name="density" value="2700" units="kg/m^3"/>
<Property name="yield_strength" value="276e6" units="Pa"/>
</Material>
</Materials>
<Loads>
<Load name="Applied Force" type="Force" magnitude="1000.0" units="N">
<Location>Top Face</Location>
<Direction>0 -1 0</Direction>
</Load>
</Loads>
<Constraints>
<Constraint name="Fixed Support" type="Fixed">
<Location>Bottom Holes</Location>
</Constraint>
</Constraints>
</FEM>
<!-- Linked Files -->
<LinkedFiles>
<PartFile>test_bracket.prt</PartFile>
<FemFile>test_bracket.fem</FemFile>
</LinkedFiles>
</SimulationModel>

View File

@@ -1,66 +0,0 @@
"""
Quick Test: Displacement-Only Optimization
Tests the pipeline with only displacement extraction (which works with your OP2).
"""
from pathlib import Path
import sys
project_root = Path(__file__).parent.parent
sys.path.insert(0, str(project_root))
from optimization_engine.runner import OptimizationRunner
from optimization_engine.nx_updater import update_nx_model
from optimization_engine.result_extractors.extractors import displacement_extractor
def bracket_model_updater(design_vars: dict):
"""Update bracket model parameters."""
prt_file = project_root / "examples/bracket/Bracket.prt"
print(f"\n[MODEL UPDATE] {prt_file.name}")
for name, value in design_vars.items():
print(f" {name} = {value:.4f}")
update_nx_model(prt_file, design_vars, backup=False)
def bracket_simulation_runner() -> Path:
"""Return existing OP2 (no re-solve for now)."""
print("\n[SIMULATION] Using existing OP2")
return project_root / "examples/bracket/bracket_sim1-solution_1.op2"
if __name__ == "__main__":
print("="*60)
print("DISPLACEMENT-ONLY OPTIMIZATION TEST")
print("="*60)
config_path = project_root / "examples/bracket/optimization_config_displacement_only.json"
runner = OptimizationRunner(
config_path=config_path,
model_updater=bracket_model_updater,
simulation_runner=bracket_simulation_runner,
result_extractors={'displacement_extractor': displacement_extractor}
)
# Run 3 trials just to test
runner.config['optimization_settings']['n_trials'] = 3
print("\nRunning 3 test trials...")
print("="*60)
try:
study = runner.run(study_name="displacement_test")
print("\n" + "="*60)
print("SUCCESS! Pipeline works!")
print("="*60)
print(f"Best displacement: {study.best_value:.6f} mm")
print(f"Best parameters: {study.best_params}")
print(f"\nResults in: {runner.output_dir}")
except Exception as e:
print(f"\nERROR: {e}")
import traceback
traceback.print_exc()

View File

@@ -1,204 +0,0 @@
"""
Test: Complete Optimization with Journal-Based NX Solver
This tests the complete workflow:
1. Update model parameters in .prt
2. Solve via journal (using running NX GUI)
3. Extract results from OP2
4. Run optimization loop
REQUIREMENTS:
- Simcenter3D must be open (but no files need to be loaded)
- test_env conda environment activated
"""
from pathlib import Path
import sys
project_root = Path(__file__).parent.parent
sys.path.insert(0, str(project_root))
from optimization_engine.runner import OptimizationRunner
from optimization_engine.nx_updater import update_nx_model
from optimization_engine.nx_solver import run_nx_simulation
from optimization_engine.result_extractors.extractors import (
stress_extractor,
displacement_extractor
)
# Global variable to store current design variables for the simulation runner
_current_design_vars = {}
def bracket_model_updater(design_vars: dict):
"""
Store design variables for the simulation runner.
Note: We no longer directly update the .prt file here.
Instead, design variables are passed to the journal which applies them in NX.
"""
global _current_design_vars
_current_design_vars = design_vars.copy()
print(f"\n[MODEL UPDATE] Design variables prepared")
for name, value in design_vars.items():
print(f" {name} = {value:.4f}")
def bracket_simulation_runner() -> Path:
"""
Run NX solver via journal on running NX GUI session.
This connects to the running Simcenter3D GUI and:
1. Opens the .sim file
2. Applies expression updates in the journal
3. Updates geometry and FEM
4. Solves the simulation
5. Returns path to .op2 file
"""
global _current_design_vars
sim_file = project_root / "examples/bracket/Bracket_sim1.sim"
print("\n[SIMULATION] Running via journal on NX GUI...")
print(f" SIM file: {sim_file.name}")
if _current_design_vars:
print(f" Expression updates: {_current_design_vars}")
try:
# Run solver via journal (connects to running NX GUI)
# Pass expression updates directly to the journal
op2_file = run_nx_simulation(
sim_file=sim_file,
nastran_version="2412",
timeout=300, # 5 minute timeout
cleanup=True, # Clean up temp files
use_journal=True, # Use journal mode (requires NX GUI open)
expression_updates=_current_design_vars # Pass design vars to journal
)
print(f"[SIMULATION] Complete! Results: {op2_file.name}")
return op2_file
except Exception as e:
print(f"[SIMULATION] FAILED: {e}")
raise
if __name__ == "__main__":
print("="*60)
print("JOURNAL-BASED OPTIMIZATION TEST")
print("="*60)
print("\nREQUIREMENTS:")
print("- Simcenter3D must be OPEN (no files need to be loaded)")
print("- Will run 50 optimization trials (~3-4 minutes)")
print("- Strategy: 20 random trials (exploration) + 30 TPE trials (exploitation)")
print("- Each trial: update params -> solve via journal -> extract results")
print("="*60)
response = input("\nIs Simcenter3D open? (yes/no): ")
if response.lower() not in ['yes', 'y']:
print("Please open Simcenter3D and try again.")
sys.exit(0)
config_path = project_root / "examples/bracket/optimization_config_stress_displacement.json"
runner = OptimizationRunner(
config_path=config_path,
model_updater=bracket_model_updater,
simulation_runner=bracket_simulation_runner, # Journal-based solver!
result_extractors={
'stress_extractor': stress_extractor,
'displacement_extractor': displacement_extractor
}
)
# Use the configured number of trials (50 by default)
n_trials = runner.config['optimization_settings']['n_trials']
# Check for existing studies
existing_studies = runner.list_studies()
print("\n" + "="*60)
print("STUDY MANAGEMENT")
print("="*60)
if existing_studies:
print(f"\nFound {len(existing_studies)} existing studies:")
for study in existing_studies:
print(f" - {study['study_name']}: {study.get('total_trials', 0)} trials")
print("\nOptions:")
print("1. Create NEW study (fresh start)")
print("2. RESUME existing study (add more trials)")
choice = input("\nChoose option (1 or 2): ").strip()
if choice == '2':
# Resume existing study
if len(existing_studies) == 1:
study_name = existing_studies[0]['study_name']
print(f"\nResuming study: {study_name}")
else:
print("\nAvailable studies:")
for i, study in enumerate(existing_studies):
print(f"{i+1}. {study['study_name']}")
study_idx = int(input("Select study number: ")) - 1
study_name = existing_studies[study_idx]['study_name']
resume_mode = True
else:
# New study
study_name = input("\nEnter study name (default: bracket_stress_opt): ").strip()
if not study_name:
study_name = "bracket_stress_opt"
resume_mode = False
else:
print("\nNo existing studies found. Creating new study.")
study_name = input("\nEnter study name (default: bracket_stress_opt): ").strip()
if not study_name:
study_name = "bracket_stress_opt"
resume_mode = False
print("\n" + "="*60)
if resume_mode:
print(f"RESUMING STUDY: {study_name}")
print(f"Adding {n_trials} additional trials")
else:
print(f"STARTING NEW STUDY: {study_name}")
print(f"Running {n_trials} trials")
print("="*60)
print("Objective: Minimize max von Mises stress")
print("Constraint: Max displacement <= 1.0 mm")
print("Solver: Journal-based (using running NX GUI)")
print(f"Sampler: TPE (20 random startup + {n_trials-20} TPE)")
print("="*60)
try:
study = runner.run(
study_name=study_name,
n_trials=n_trials,
resume=resume_mode
)
print("\n" + "="*60)
print("OPTIMIZATION COMPLETE!")
print("="*60)
print(f"\nBest stress: {study.best_value:.2f} MPa")
print(f"\nBest parameters:")
for param, value in study.best_params.items():
print(f" {param}: {value:.4f}")
print(f"\nResults saved to: {runner.output_dir}")
print("\nCheck history.csv to see optimization progress!")
except Exception as e:
print(f"\n{'='*60}")
print("ERROR DURING OPTIMIZATION")
print("="*60)
print(f"{e}")
import traceback
traceback.print_exc()
print("\nMake sure:")
print(" - Simcenter3D is open and running")
print(" - .sim file is valid and solvable")
print(" - No other processes are locking the files")

View File

@@ -1,130 +0,0 @@
"""
Test NX Solver Integration
Tests running NX Nastran in batch mode.
"""
from pathlib import Path
import sys
project_root = Path(__file__).parent.parent
sys.path.insert(0, str(project_root))
from optimization_engine.nx_solver import NXSolver, run_nx_simulation
def test_solver_basic():
"""Test basic solver execution."""
print("="*60)
print("TEST 1: Basic Solver Execution")
print("="*60)
sim_file = project_root / "examples/bracket/Bracket_sim1.sim"
if not sim_file.exists():
print(f"ERROR: Simulation file not found: {sim_file}")
return False
try:
# Initialize solver
solver = NXSolver(nastran_version="2412", timeout=300)
print(f"\nSolver initialized:")
print(f" NX Directory: {solver.nx_install_dir}")
print(f" Solver Exe: {solver.solver_exe}")
# Run simulation
result = solver.run_simulation(
sim_file=sim_file,
cleanup=False # Keep all files for inspection
)
print(f"\n{'='*60}")
print("SOLVER RESULT:")
print(f"{'='*60}")
print(f" Success: {result['success']}")
print(f" Time: {result['elapsed_time']:.1f}s")
print(f" OP2 file: {result['op2_file']}")
print(f" Return code: {result['return_code']}")
if result['errors']:
print(f"\n Errors:")
for error in result['errors']:
print(f" {error}")
return result['success']
except Exception as e:
print(f"\nERROR: {e}")
import traceback
traceback.print_exc()
return False
def test_convenience_function():
"""Test convenience function."""
print("\n" + "="*60)
print("TEST 2: Convenience Function")
print("="*60)
sim_file = project_root / "examples/bracket/Bracket_sim1.sim"
try:
op2_file = run_nx_simulation(
sim_file=sim_file,
nastran_version="2412",
timeout=300,
cleanup=True
)
print(f"\nSUCCESS!")
print(f" OP2 file: {op2_file}")
print(f" File exists: {op2_file.exists()}")
print(f" File size: {op2_file.stat().st_size / 1024:.1f} KB")
return True
except Exception as e:
print(f"\nFAILED: {e}")
import traceback
traceback.print_exc()
return False
if __name__ == "__main__":
print("="*60)
print("NX SOLVER INTEGRATION TEST")
print("="*60)
print("\nThis will run NX Nastran solver in batch mode.")
print("Make sure:")
print(" 1. NX 2412 is installed")
print(" 2. No NX GUI sessions are using the .sim file")
print(" 3. You have write permissions in the bracket folder")
print("\n" + "="*60)
input("\nPress ENTER to continue or Ctrl+C to cancel...")
# Test 1: Basic execution
test1_result = test_solver_basic()
if test1_result:
# Test 2: Convenience function
test2_result = test_convenience_function()
if test2_result:
print("\n" + "="*60)
print("ALL TESTS PASSED ✓")
print("="*60)
print("\nNX solver integration is working!")
print("You can now use it in optimization loops.")
else:
print("\n" + "="*60)
print("TEST 2 FAILED")
print("="*60)
else:
print("\n" + "="*60)
print("TEST 1 FAILED - Skipping Test 2")
print("="*60)
print("\nCheck:")
print(" - NX installation path")
print(" - .sim file is valid")
print(" - NX license is available")

View File

@@ -1,130 +0,0 @@
"""
Test: Complete Optimization with Real NX Solver
This runs the complete optimization loop:
1. Update model parameters
2. Run NX solver (REAL simulation)
3. Extract results from OP2
4. Optimize with Optuna
WARNING: This will run NX solver for each trial!
For 5 trials, expect ~5-10 minutes depending on solver speed.
"""
from pathlib import Path
import sys
project_root = Path(__file__).parent.parent
sys.path.insert(0, str(project_root))
from optimization_engine.runner import OptimizationRunner
from optimization_engine.nx_updater import update_nx_model
from optimization_engine.nx_solver import run_nx_simulation
from optimization_engine.result_extractors.extractors import (
stress_extractor,
displacement_extractor
)
def bracket_model_updater(design_vars: dict):
"""Update bracket model parameters."""
prt_file = project_root / "examples/bracket/Bracket.prt"
print(f"\n[MODEL UPDATE] {prt_file.name}")
for name, value in design_vars.items():
print(f" {name} = {value:.4f}")
update_nx_model(prt_file, design_vars, backup=False)
def bracket_simulation_runner() -> Path:
"""
Run NX Nastran solver and return path to OP2 file.
This is the key difference from the test version -
it actually runs the solver for each trial!
"""
sim_file = project_root / "examples/bracket/Bracket_sim1.sim"
print("\n[SIMULATION] Running NX Nastran solver...")
print(f" SIM file: {sim_file.name}")
try:
# Run solver (this will take ~1-2 minutes per trial)
op2_file = run_nx_simulation(
sim_file=sim_file,
nastran_version="2412",
timeout=600, # 10 minute timeout
cleanup=True # Clean up temp files
)
print(f"[SIMULATION] Complete! Results: {op2_file.name}")
return op2_file
except Exception as e:
print(f"[SIMULATION] FAILED: {e}")
raise
if __name__ == "__main__":
print("="*60)
print("REAL OPTIMIZATION WITH NX SOLVER")
print("="*60)
print("\n⚠️ WARNING ⚠️")
print("This will run NX Nastran solver for each trial!")
print("For 3 trials, expect ~5-10 minutes total.")
print("\nMake sure:")
print(" - NX 2412 is installed and licensed")
print(" - No NX GUI sessions are open")
print(" - Bracket.prt and Bracket_sim1.sim are accessible")
print("="*60)
response = input("\nContinue? (yes/no): ")
if response.lower() not in ['yes', 'y']:
print("Cancelled.")
sys.exit(0)
config_path = project_root / "examples/bracket/optimization_config_stress_displacement.json"
runner = OptimizationRunner(
config_path=config_path,
model_updater=bracket_model_updater,
simulation_runner=bracket_simulation_runner, # REAL SOLVER!
result_extractors={
'stress_extractor': stress_extractor,
'displacement_extractor': displacement_extractor
}
)
# Run just 3 trials for testing (change to 20-50 for real optimization)
runner.config['optimization_settings']['n_trials'] = 3
print("\n" + "="*60)
print("Starting optimization with 3 trials")
print("Objective: Minimize max von Mises stress")
print("Constraint: Max displacement <= 1.0 mm")
print("="*60)
try:
study = runner.run(study_name="real_solver_test")
print("\n" + "="*60)
print("OPTIMIZATION COMPLETE!")
print("="*60)
print(f"\nBest stress: {study.best_value:.2f} MPa")
print(f"\nBest parameters:")
for param, value in study.best_params.items():
print(f" {param}: {value:.4f}")
print(f"\nResults saved to: {runner.output_dir}")
print("\nCheck history.csv to see how stress changed with parameters!")
except Exception as e:
print(f"\n{'='*60}")
print("ERROR DURING OPTIMIZATION")
print("="*60)
print(f"{e}")
import traceback
traceback.print_exc()
print("\nMake sure:")
print(" - NX Nastran is properly installed")
print(" - License is available")
print(" - .sim file is valid and solvable")

View File

@@ -1,56 +0,0 @@
"""
Direct test of stress extraction without using cached imports.
"""
from pathlib import Path
import sys
# Force reload
project_root = Path(__file__).parent.parent
sys.path.insert(0, str(project_root))
# Import directly from the file
import importlib.util
spec = importlib.util.spec_from_file_location(
"op2_extractor",
project_root / "optimization_engine/result_extractors/op2_extractor_example.py"
)
op2_extractor = importlib.util.module_from_spec(spec)
spec.loader.exec_module(op2_extractor)
if __name__ == "__main__":
op2_path = project_root / "examples/bracket/bracket_sim1-solution_1.op2"
print("="*60)
print("DIRECT STRESS EXTRACTION TEST")
print("="*60)
print(f"OP2 file: {op2_path}")
print()
# Test stress extraction
print("--- Testing extract_max_stress() ---")
try:
result = op2_extractor.extract_max_stress(op2_path, stress_type='von_mises')
print()
print("RESULT:")
for key, value in result.items():
print(f" {key}: {value}")
if result['max_stress'] > 100.0:
print()
print("SUCCESS! Stress extraction working!")
print(f"Got: {result['max_stress']:.2f} MPa")
elif result['max_stress'] == 0.0:
print()
print("FAIL: Still returning 0.0")
else:
print()
print(f"Got unexpected value: {result['max_stress']:.2f} MPa")
except Exception as e:
print(f"ERROR: {e}")
import traceback
traceback.print_exc()
print()
print("="*60)

View File

@@ -1,94 +0,0 @@
"""
Test: Stress + Displacement Optimization
Tests the complete pipeline with:
- Objective: Minimize max von Mises stress
- Constraint: Max displacement <= 1.0 mm
"""
from pathlib import Path
import sys
project_root = Path(__file__).parent.parent
sys.path.insert(0, str(project_root))
from optimization_engine.runner import OptimizationRunner
from optimization_engine.nx_updater import update_nx_model
from optimization_engine.result_extractors.extractors import (
stress_extractor,
displacement_extractor
)
def bracket_model_updater(design_vars: dict):
"""Update bracket model parameters."""
prt_file = project_root / "examples/bracket/Bracket.prt"
print(f"\n[MODEL UPDATE] {prt_file.name}")
for name, value in design_vars.items():
print(f" {name} = {value:.4f}")
update_nx_model(prt_file, design_vars, backup=False)
def bracket_simulation_runner() -> Path:
"""Return existing OP2 (no re-solve for now)."""
print("\n[SIMULATION] Using existing OP2")
return project_root / "examples/bracket/bracket_sim1-solution_1.op2"
if __name__ == "__main__":
print("="*60)
print("STRESS + DISPLACEMENT OPTIMIZATION TEST")
print("="*60)
config_path = project_root / "examples/bracket/optimization_config_stress_displacement.json"
runner = OptimizationRunner(
config_path=config_path,
model_updater=bracket_model_updater,
simulation_runner=bracket_simulation_runner,
result_extractors={
'stress_extractor': stress_extractor,
'displacement_extractor': displacement_extractor
}
)
# Run 5 trials to test
runner.config['optimization_settings']['n_trials'] = 5
print("\nRunning 5 test trials...")
print("Objective: Minimize max von Mises stress")
print("Constraint: Max displacement <= 1.0 mm")
print("="*60)
try:
study = runner.run(study_name="stress_displacement_test")
print("\n" + "="*60)
print("SUCCESS! Complete pipeline works!")
print("="*60)
print(f"Best stress: {study.best_value:.2f} MPa")
print(f"Best parameters: {study.best_params}")
print(f"\nResults in: {runner.output_dir}")
# Show summary
print("\n" + "="*60)
print("EXTRACTED VALUES (from OP2):")
print("="*60)
# Read the last trial results
import json
history_file = runner.output_dir / "history.json"
if history_file.exists():
with open(history_file, 'r') as f:
history = json.load(f)
if history:
last_trial = history[-1]
print(f"Max stress: {last_trial['results'].get('max_von_mises', 'N/A')} MPa")
print(f"Max displacement: {last_trial['results'].get('max_displacement', 'N/A')} mm")
print(f"Stress element: {last_trial['results'].get('element_id', 'N/A')}")
print(f"Displacement node: {last_trial['results'].get('max_node_id', 'N/A')}")
except Exception as e:
print(f"\nERROR: {e}")
import traceback
traceback.print_exc()

View File

@@ -1,65 +0,0 @@
"""
Quick test to verify stress extraction fix for CHEXA elements.
Run this in test_env:
conda activate test_env
python examples/test_stress_fix.py
"""
from pathlib import Path
import sys
project_root = Path(__file__).parent.parent
sys.path.insert(0, str(project_root))
from optimization_engine.result_extractors.extractors import stress_extractor, displacement_extractor
if __name__ == "__main__":
op2_path = project_root / "examples/bracket/bracket_sim1-solution_1.op2"
print("="*60)
print("STRESS EXTRACTION FIX VERIFICATION")
print("="*60)
print(f"OP2 file: {op2_path}")
print()
# Test displacement (we know this works - 0.315 mm)
print("--- Displacement (baseline test) ---")
try:
disp_result = displacement_extractor(op2_path)
print(f"Max displacement: {disp_result['max_displacement']:.6f} mm")
print(f"Node ID: {disp_result['max_node_id']}")
print("OK Displacement extractor working")
except Exception as e:
print(f"ERROR: {e}")
print()
# Test stress (should now return 122.91 MPa, not 0.0)
print("--- Stress (FIXED - should show ~122.91 MPa) ---")
try:
stress_result = stress_extractor(op2_path)
print(f"Max von Mises: {stress_result['max_von_mises']:.2f} MPa")
print(f"Element ID: {stress_result['element_id']}")
print(f"Element type: {stress_result['element_type']}")
# Verify fix worked
if stress_result['max_von_mises'] > 100.0:
print()
print("SUCCESS! Stress extraction fixed!")
print(f"Expected: ~122.91 MPa")
print(f"Got: {stress_result['max_von_mises']:.2f} MPa")
elif stress_result['max_von_mises'] == 0.0:
print()
print("FAIL: Still returning 0.0 - fix not working")
else:
print()
print(f"WARNING: Got {stress_result['max_von_mises']:.2f} MPa - verify if correct")
except Exception as e:
print(f"ERROR: {e}")
import traceback
traceback.print_exc()
print()
print("="*60)