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:
299
examples/README_INTERACTIVE_SESSION.md
Normal file
299
examples/README_INTERACTIVE_SESSION.md
Normal 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.
@@ -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
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 * * *
|
||||
|
||||
|
||||
@@ -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
|
||||
Binary file not shown.
@@ -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'>× </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 |
@@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -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)"
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
@@ -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
|
||||
""")
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
449
examples/interactive_research_session.py
Normal file
449
examples/interactive_research_session.py
Normal 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()
|
||||
@@ -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)
|
||||
@@ -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()
|
||||
@@ -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()
|
||||
@@ -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>
|
||||
@@ -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()
|
||||
@@ -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")
|
||||
@@ -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")
|
||||
@@ -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")
|
||||
@@ -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)
|
||||
@@ -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()
|
||||
@@ -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)
|
||||
Reference in New Issue
Block a user